The weapons' reticles drawn from the PC HUD sheet's exact matches
The reticles of the PC HUD sheet's drawing that match the Xbox's exactly (14 of them, in HUD2_left_reticles/xbox_reticle_matches.md) take the place of the reticles' redraws: each copied unchanged, at the size and place that match its Xbox sprite best (tools/hud_assets.py reticles; a likeness of 0.97 to 1.00). They also give high-res textures to two bitmaps that had none: the rocket launcher's and wraith's reticle, and the sniper rifle's, whose bitmap holds its zoom labels too; no redraw has the Xbox's 2x and 10x, so they are set in Overpass 900 (of the project's fonts the one that fits them best), sized, placed and spaced to match. The warthog's and the scorpion's keep their redraws: only variants of them are on the sheet. The build places a redraw at any scale, and the layout step runs again (a name hid its match function). AUTHORS.md credits the high-res HUD's redraws to MrBruh, and the reference photos they are based on to Aerocatia. Checked: each texture beside the Xbox bitmap; a build reproduces the PNGs; ninja linux and android; in a game on Blood Gulch the plasma pistol's reticle draws from its new texture, and all 71 HUD textures are found there.
No files matched your search
@@ -6,6 +6,10 @@
|
||||
and the desktop windows' icon): by ORION (`port/assets/icon`).
|
||||
- **The controller's A, B, X and Y buttons** (the menus' button icons and
|
||||
the HUD messages'): redraws by saulob (`port/assets/buttons`).
|
||||
- **The high-res HUD** (its meters, icons, scopes and messages, and the
|
||||
weapons' reticles): redraws by MrBruh (`port/assets/hud`), based on
|
||||
reference photos by Aerocatia. The sniper rifle's zoom labels (2x, 10x)
|
||||
are set in Overpass (`port/assets/fonts`).
|
||||
|
||||
## Third-party art
|
||||
|
||||
|
||||
|
Before Width: | Height: | Size: 24 KiB After Width: | Height: | Size: 25 KiB |
|
Before Width: | Height: | Size: 11 KiB After Width: | Height: | Size: 11 KiB |
|
Before Width: | Height: | Size: 17 KiB After Width: | Height: | Size: 17 KiB |
|
Before Width: | Height: | Size: 12 KiB After Width: | Height: | Size: 14 KiB |
|
Before Width: | Height: | Size: 5.9 KiB After Width: | Height: | Size: 5.9 KiB |
|
Before Width: | Height: | Size: 8.7 KiB After Width: | Height: | Size: 8.3 KiB |
|
Before Width: | Height: | Size: 12 KiB After Width: | Height: | Size: 13 KiB |
|
Before Width: | Height: | Size: 7.0 KiB After Width: | Height: | Size: 7.7 KiB |
|
After Width: | Height: | Size: 19 KiB |
|
Before Width: | Height: | Size: 17 KiB After Width: | Height: | Size: 17 KiB |
@@ -1203,20 +1203,20 @@
|
||||
66,
|
||||
66
|
||||
],
|
||||
"svg": "hud__bitmaps__combined__hud_reticles__0.svg",
|
||||
"source_scale": 4,
|
||||
"svg": "hud2_left_reticles__reticle_20.svg",
|
||||
"source_scale": 1.32252,
|
||||
"source": [
|
||||
0,
|
||||
0
|
||||
-4.1329,
|
||||
-4.1329
|
||||
],
|
||||
"clip": [
|
||||
0,
|
||||
0,
|
||||
264,
|
||||
264
|
||||
78,
|
||||
78
|
||||
],
|
||||
"kind": "alpha",
|
||||
"score": 0.627
|
||||
"score": 0.995
|
||||
},
|
||||
{
|
||||
"xbox": [
|
||||
@@ -1225,20 +1225,20 @@
|
||||
18,
|
||||
76
|
||||
],
|
||||
"svg": "hud__bitmaps__combined__hud_reticles__0.svg",
|
||||
"source_scale": 4,
|
||||
"svg": "hud2_left_reticles__reticle_30.svg",
|
||||
"source_scale": 1.2325,
|
||||
"source": [
|
||||
0,
|
||||
264
|
||||
1.6947,
|
||||
1.3866
|
||||
],
|
||||
"clip": [
|
||||
0,
|
||||
264,
|
||||
72,
|
||||
304
|
||||
0,
|
||||
26,
|
||||
10
|
||||
],
|
||||
"kind": "alpha",
|
||||
"score": 0.486
|
||||
"score": 0.991
|
||||
},
|
||||
{
|
||||
"xbox": [
|
||||
@@ -1247,20 +1247,20 @@
|
||||
94,
|
||||
28
|
||||
],
|
||||
"svg": "hud__bitmaps__combined__hud_reticles__0.svg",
|
||||
"source_scale": 4,
|
||||
"svg": "hud2_left_reticles__reticle_19.svg",
|
||||
"source_scale": 1.35,
|
||||
"source": [
|
||||
264,
|
||||
0
|
||||
0.675,
|
||||
0.675
|
||||
],
|
||||
"clip": [
|
||||
264,
|
||||
0,
|
||||
376,
|
||||
112
|
||||
0,
|
||||
38,
|
||||
38
|
||||
],
|
||||
"kind": "alpha",
|
||||
"score": 0.547
|
||||
"score": 0.988
|
||||
},
|
||||
{
|
||||
"xbox": [
|
||||
@@ -1269,20 +1269,20 @@
|
||||
122,
|
||||
28
|
||||
],
|
||||
"svg": "hud__bitmaps__combined__hud_reticles__0.svg",
|
||||
"source_scale": 4,
|
||||
"svg": "hud2_left_reticles__reticle_28.svg",
|
||||
"source_scale": 1.32812,
|
||||
"source": [
|
||||
376,
|
||||
0
|
||||
-11.2891,
|
||||
-11.2891
|
||||
],
|
||||
"clip": [
|
||||
376,
|
||||
0,
|
||||
488,
|
||||
112
|
||||
0,
|
||||
14,
|
||||
14
|
||||
],
|
||||
"kind": "alpha",
|
||||
"score": 0.548
|
||||
"score": 1.0
|
||||
}
|
||||
]
|
||||
},
|
||||
@@ -1303,20 +1303,20 @@
|
||||
64,
|
||||
64
|
||||
],
|
||||
"svg": "hud__bitmaps__combined__hud_reticles__1.svg",
|
||||
"source_scale": 4,
|
||||
"svg": "hud2_left_reticles__reticle_17.svg",
|
||||
"source_scale": 1.35947,
|
||||
"source": [
|
||||
0,
|
||||
0
|
||||
-10.7058,
|
||||
-12.915
|
||||
],
|
||||
"clip": [
|
||||
0,
|
||||
0,
|
||||
256,
|
||||
256
|
||||
67,
|
||||
51
|
||||
],
|
||||
"kind": "alpha",
|
||||
"score": 0.741
|
||||
"score": 0.998
|
||||
}
|
||||
]
|
||||
},
|
||||
@@ -1371,20 +1371,20 @@
|
||||
64,
|
||||
64
|
||||
],
|
||||
"svg": "hud__bitmaps__combined__hud_reticles__3.svg",
|
||||
"source_scale": 4,
|
||||
"svg": "hud2_left_reticles__reticle_06.svg",
|
||||
"source_scale": 1.33099,
|
||||
"source": [
|
||||
2,
|
||||
1
|
||||
-5.324,
|
||||
-2.9947
|
||||
],
|
||||
"clip": [
|
||||
0,
|
||||
0,
|
||||
256,
|
||||
256
|
||||
74,
|
||||
65
|
||||
],
|
||||
"kind": "alpha",
|
||||
"score": 0.752
|
||||
"score": 0.987
|
||||
}
|
||||
]
|
||||
},
|
||||
@@ -1405,20 +1405,20 @@
|
||||
64,
|
||||
64
|
||||
],
|
||||
"svg": "hud__bitmaps__combined__hud_reticles__4.svg",
|
||||
"source_scale": 4,
|
||||
"svg": "hud2_left_reticles__reticle_07.svg",
|
||||
"source_scale": 1.33636,
|
||||
"source": [
|
||||
-2,
|
||||
-2
|
||||
-11.3591,
|
||||
-11.5261
|
||||
],
|
||||
"clip": [
|
||||
0,
|
||||
0,
|
||||
256,
|
||||
256
|
||||
64,
|
||||
64
|
||||
],
|
||||
"kind": "alpha",
|
||||
"score": 0.753
|
||||
"score": 0.996
|
||||
}
|
||||
]
|
||||
},
|
||||
@@ -1439,20 +1439,20 @@
|
||||
64,
|
||||
64
|
||||
],
|
||||
"svg": "hud__bitmaps__combined__hud_reticles__5.svg",
|
||||
"source_scale": 4,
|
||||
"svg": "hud2_left_reticles__reticle_14.svg",
|
||||
"source_scale": 1.3687,
|
||||
"source": [
|
||||
0,
|
||||
0
|
||||
-4.7905,
|
||||
-6.1592
|
||||
],
|
||||
"clip": [
|
||||
0,
|
||||
0,
|
||||
256,
|
||||
256
|
||||
77,
|
||||
77
|
||||
],
|
||||
"kind": "alpha",
|
||||
"score": 0.446
|
||||
"score": 0.998
|
||||
}
|
||||
]
|
||||
},
|
||||
@@ -1473,20 +1473,20 @@
|
||||
64,
|
||||
64
|
||||
],
|
||||
"svg": "hud__bitmaps__combined__hud_reticles__6.svg",
|
||||
"source_scale": 4,
|
||||
"svg": "hud2_left_reticles__reticle_08.svg",
|
||||
"source_scale": 1.35078,
|
||||
"source": [
|
||||
0,
|
||||
0
|
||||
-3.7146,
|
||||
-30.0549
|
||||
],
|
||||
"clip": [
|
||||
0,
|
||||
0,
|
||||
256,
|
||||
256
|
||||
80,
|
||||
28
|
||||
],
|
||||
"kind": "alpha",
|
||||
"score": 0.68
|
||||
"score": 0.985
|
||||
}
|
||||
]
|
||||
},
|
||||
@@ -1507,20 +1507,20 @@
|
||||
64,
|
||||
64
|
||||
],
|
||||
"svg": "hud__bitmaps__combined__hud_reticles__8.svg",
|
||||
"source_scale": 4,
|
||||
"svg": "hud2_left_reticles__reticle_23.svg",
|
||||
"source_scale": 1.33389,
|
||||
"source": [
|
||||
0,
|
||||
0
|
||||
-3.3347,
|
||||
-3.3347
|
||||
],
|
||||
"clip": [
|
||||
0,
|
||||
0,
|
||||
256,
|
||||
256
|
||||
78,
|
||||
78
|
||||
],
|
||||
"kind": "alpha",
|
||||
"score": 0.46
|
||||
"score": 0.992
|
||||
}
|
||||
]
|
||||
},
|
||||
@@ -1575,20 +1575,20 @@
|
||||
64,
|
||||
64
|
||||
],
|
||||
"svg": "hud__bitmaps__combined__hud_reticles__10.svg",
|
||||
"source_scale": 4,
|
||||
"svg": "hud2_left_reticles__reticle_25.svg",
|
||||
"source_scale": 1.37061,
|
||||
"source": [
|
||||
1,
|
||||
0
|
||||
-7.881,
|
||||
-3.4265
|
||||
],
|
||||
"clip": [
|
||||
0,
|
||||
0,
|
||||
256,
|
||||
256
|
||||
71,
|
||||
79
|
||||
],
|
||||
"kind": "alpha",
|
||||
"score": 0.763
|
||||
"score": 0.975
|
||||
}
|
||||
]
|
||||
},
|
||||
@@ -1609,20 +1609,54 @@
|
||||
64,
|
||||
64
|
||||
],
|
||||
"svg": "hud__bitmaps__combined__hud_reticles__11.svg",
|
||||
"source_scale": 4,
|
||||
"svg": "hud2_left_reticles__reticle_16.svg",
|
||||
"source_scale": 1.36027,
|
||||
"source": [
|
||||
1,
|
||||
-1
|
||||
-3.4007,
|
||||
-11.5623
|
||||
],
|
||||
"clip": [
|
||||
0,
|
||||
0,
|
||||
256,
|
||||
256
|
||||
80,
|
||||
49
|
||||
],
|
||||
"kind": "alpha",
|
||||
"score": 0.69
|
||||
"score": 0.996
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "hud_reticles__7",
|
||||
"tag": "ui\\hud\\bitmaps\\combined\\hud_reticles",
|
||||
"bitmap": 7,
|
||||
"width": 64,
|
||||
"height": 64,
|
||||
"format": "ay8",
|
||||
"scale": 8,
|
||||
"crc": 1857742423,
|
||||
"cells": [
|
||||
{
|
||||
"xbox": [
|
||||
0,
|
||||
0,
|
||||
64,
|
||||
64
|
||||
],
|
||||
"svg": "hud2_left_reticles__reticle_27.svg",
|
||||
"source_scale": 1.34157,
|
||||
"source": [
|
||||
1.8447,
|
||||
1.0062
|
||||
],
|
||||
"clip": [
|
||||
0,
|
||||
0,
|
||||
89,
|
||||
89
|
||||
],
|
||||
"kind": "alpha",
|
||||
"score": 0.97
|
||||
}
|
||||
]
|
||||
},
|
||||
@@ -3142,6 +3176,84 @@
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "sniper__hud_reticles_scope__0",
|
||||
"tag": "ui\\hud\\bitmaps\\sniper\\hud_reticles_scope",
|
||||
"bitmap": 0,
|
||||
"width": 64,
|
||||
"height": 64,
|
||||
"format": "a8y8",
|
||||
"scale": 8,
|
||||
"crc": 2373183232,
|
||||
"cells": [
|
||||
{
|
||||
"xbox": [
|
||||
0,
|
||||
0,
|
||||
31,
|
||||
24
|
||||
],
|
||||
"svg": "label__Overpass-900__2x.svg",
|
||||
"source_scale": 5.20673,
|
||||
"source": [
|
||||
-22.7794,
|
||||
-9.7626
|
||||
],
|
||||
"clip": [
|
||||
0,
|
||||
0,
|
||||
117,
|
||||
127
|
||||
],
|
||||
"kind": "alpha",
|
||||
"score": 0.972
|
||||
},
|
||||
{
|
||||
"xbox": [
|
||||
0,
|
||||
24,
|
||||
43,
|
||||
48
|
||||
],
|
||||
"svg": "label__Overpass-900__10x.svg",
|
||||
"source_scale": 5.28894,
|
||||
"source": [
|
||||
-36.3615,
|
||||
-11.239
|
||||
],
|
||||
"clip": [
|
||||
0,
|
||||
0,
|
||||
171,
|
||||
127
|
||||
],
|
||||
"kind": "alpha",
|
||||
"score": 0.937
|
||||
},
|
||||
{
|
||||
"xbox": [
|
||||
32,
|
||||
0,
|
||||
50,
|
||||
18
|
||||
],
|
||||
"svg": "hud2_left_reticles__reticle_18.svg",
|
||||
"source_scale": 1.365,
|
||||
"source": [
|
||||
-3.5831,
|
||||
-3.5831
|
||||
],
|
||||
"clip": [
|
||||
0,
|
||||
0,
|
||||
16,
|
||||
16
|
||||
],
|
||||
"kind": "alpha",
|
||||
"score": 0.991
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "sniper_rifle__angle_ticks__0",
|
||||
"tag": "weapons\\sniper rifle\\bitmaps\\angle_ticks",
|
||||
|
||||
|
After Width: | Height: | Size: 14 KiB |
@@ -0,0 +1,12 @@
|
||||
<?xml version='1.0' encoding='UTF-8'?>
|
||||
<!-- Created with Inkscape (http://www.inkscape.org/) --><svg xmlns:xlink="http://www.w3.org/1999/xlink" xmlns="http://www.w3.org/2000/svg" xmlns:svg="http://www.w3.org/2000/svg" version="1.1" id="svg1" width="73.1723" height="64.4224" viewBox="166.3910 62.5345 73.1723 64.4224">
|
||||
<defs id="defs1">
|
||||
<clipPath id="clipLeftOfCut" clipPathUnits="userSpaceOnUse"><rect id="rectLeftOfCut" x="0" y="0" width="525.1332" height="1540.3972"/></clipPath></defs>
|
||||
<g id="leftOfCut" clip-path="url(#clipLeftOfCut)"><g id="g1" transform="translate(866.3776,223.15626)">
|
||||
<g id="group-MC1">
|
||||
<path id="path335" d="m 149.25049,-1106.897 c 0,0 3.00195,15.8833 3.00195,15.8833 0,0 2.96289,-15.8833 2.96289,-15.8833 0,0 -5.96484,0 -5.96484,0 z" style="fill:#2896ff;fill-opacity:1;fill-rule:evenodd;stroke:none" transform="matrix(1.3333333,0,0,1.3333333,-866.3776,1317.2409)"/>
|
||||
<path id="path336" d="m 129.52393,-1061.9141 c 0,0 10.79296,-9.9389 10.79296,-9.9389 0,0 -14.02343,4.9262 -14.02343,4.9262 z" style="fill:#2896ff;fill-opacity:1;fill-rule:evenodd;stroke:none" transform="matrix(1.3333333,0,0,1.3333333,-866.3776,1317.2409)"/>
|
||||
<path id="path337" d="m 174.94189,-1061.5806 c 0,0 -10.95898,-10.1054 -10.95898,-10.1054 0,0 14.18945,5.0927 14.18945,5.0927 z" style="fill:#2896ff;fill-opacity:1;fill-rule:evenodd;stroke:none" transform="matrix(1.3333333,0,0,1.3333333,-866.3776,1317.2409)"/>
|
||||
</g>
|
||||
</g>
|
||||
</g></svg>
|
||||
|
After Width: | Height: | Size: 1.4 KiB |
@@ -0,0 +1,13 @@
|
||||
<?xml version='1.0' encoding='UTF-8'?>
|
||||
<!-- Created with Inkscape (http://www.inkscape.org/) --><svg xmlns:xlink="http://www.w3.org/1999/xlink" xmlns="http://www.w3.org/2000/svg" xmlns:svg="http://www.w3.org/2000/svg" version="1.1" id="svg1" width="63.9728" height="63.7551" viewBox="172.5590 176.9850 63.9728 63.7551">
|
||||
<defs id="defs1">
|
||||
<clipPath id="clipLeftOfCut" clipPathUnits="userSpaceOnUse"><rect id="rectLeftOfCut" x="0" y="0" width="525.1332" height="1540.3972"/></clipPath></defs>
|
||||
<g id="leftOfCut" clip-path="url(#clipLeftOfCut)"><g id="g1" transform="translate(866.3776,223.15626)">
|
||||
<g id="group-MC1">
|
||||
<path id="path331" d="m 135.70264,-976.24268 c 0,0 8.04687,-13.08007 8.04687,-13.08007 0,0 -12.83008,8.42334 -12.83008,8.42334 0,0 4.78321,4.65673 4.78321,4.65673 z" style="fill:#2896ff;fill-opacity:1;fill-rule:evenodd;stroke:none" transform="matrix(1.3333333,0,0,1.3333333,-866.3776,1317.2409)"/>
|
||||
<path id="path332" d="m 135.70264,-1021.0591 c 0,0 8.04687,13.0801 8.04687,13.0801 0,0 -12.83008,-8.4233 -12.83008,-8.4233 z" style="fill:#2896ff;fill-opacity:1;fill-rule:evenodd;stroke:none" transform="matrix(1.3333333,0,0,1.3333333,-866.3776,1317.2409)"/>
|
||||
<path id="path333" d="m 171.11572,-976.24268 c 0,0 -8.04687,-13.08007 -8.04687,-13.08007 0,0 12.83008,8.42334 12.83008,8.42334 0,0 -4.78321,4.65673 -4.78321,4.65673 z" style="fill:#2896ff;fill-opacity:1;fill-rule:evenodd;stroke:none" transform="matrix(1.3333333,0,0,1.3333333,-866.3776,1317.2409)"/>
|
||||
<path id="path334" d="m 171.11572,-1021.0591 c 0,0 -8.04687,13.0801 -8.04687,13.0801 0,0 12.83008,-8.4233 12.83008,-8.4233 z" style="fill:#2896ff;fill-opacity:1;fill-rule:evenodd;stroke:none" transform="matrix(1.3333333,0,0,1.3333333,-866.3776,1317.2409)"/>
|
||||
</g>
|
||||
</g>
|
||||
</g></svg>
|
||||
|
After Width: | Height: | Size: 1.8 KiB |
@@ -0,0 +1,13 @@
|
||||
<?xml version='1.0' encoding='UTF-8'?>
|
||||
<!-- Created with Inkscape (http://www.inkscape.org/) --><svg xmlns:xlink="http://www.w3.org/1999/xlink" xmlns="http://www.w3.org/2000/svg" xmlns:svg="http://www.w3.org/2000/svg" version="1.1" id="svg1" width="79.0222" height="27.8132" viewBox="175.7510 449.5130 79.0222 27.8132">
|
||||
<defs id="defs1">
|
||||
<clipPath id="clipLeftOfCut" clipPathUnits="userSpaceOnUse"><rect id="rectLeftOfCut" x="0" y="0" width="525.1332" height="1540.3972"/></clipPath></defs>
|
||||
<g id="leftOfCut" clip-path="url(#clipLeftOfCut)"><g id="g1" transform="translate(866.3776,223.15626)">
|
||||
<g id="group-MC1">
|
||||
<path id="path317" d="m 143.15186,-807.7334 c 0,0 -2.82813,2.55274 -2.82813,2.55274 0,0 0,-5.10498 0,-5.10498 z" style="fill:#2896ff;fill-opacity:1;fill-rule:evenodd;stroke:none" transform="matrix(1.3333333,0,0,1.3333333,-866.3776,1317.2409)"/>
|
||||
<path id="path318" d="m 143.15186,-798.80322 c 0,0 -7.19922,-3.13379 -7.19922,-8.93018 0,-5.79687 7.19922,-8.92969 7.19922,-8.92969 0,0 -9.83887,0.93897 -9.83887,8.45948 0,7.52002 9.83887,9.40039 9.83887,9.40039 z" style="fill:#2896ff;fill-opacity:1;fill-rule:evenodd;stroke:none" transform="matrix(1.3333333,0,0,1.3333333,-866.3776,1317.2409)"/>
|
||||
<path id="path319" d="m 179.7417,-807.7334 c 0,0 2.82812,2.55274 2.82812,2.55274 0,0 0,-5.10498 0,-5.10498 z" style="fill:#2896ff;fill-opacity:1;fill-rule:evenodd;stroke:none" transform="matrix(1.3333333,0,0,1.3333333,-866.3776,1317.2409)"/>
|
||||
<path id="path320" d="m 179.7417,-798.80322 c 0,0 7.19824,-3.13379 7.19824,-8.93018 0,-5.79687 -7.19824,-8.92969 -7.19824,-8.92969 0,0 9.83789,0.93897 9.83789,8.45948 0,7.52002 -9.83789,9.40039 -9.83789,9.40039 z" style="fill:#2896ff;fill-opacity:1;fill-rule:evenodd;stroke:none" transform="matrix(1.3333333,0,0,1.3333333,-866.3776,1317.2409)"/>
|
||||
</g>
|
||||
</g>
|
||||
</g></svg>
|
||||
|
After Width: | Height: | Size: 1.8 KiB |
@@ -0,0 +1,33 @@
|
||||
<?xml version='1.0' encoding='UTF-8'?>
|
||||
<!-- Created with Inkscape (http://www.inkscape.org/) --><svg xmlns:xlink="http://www.w3.org/1999/xlink" xmlns="http://www.w3.org/2000/svg" xmlns:svg="http://www.w3.org/2000/svg" version="1.1" id="svg1" width="76.5678" height="76.5678" viewBox="171.6560 1155.4900 76.5678 76.5678">
|
||||
<defs id="defs1">
|
||||
<clipPath id="clipLeftOfCut" clipPathUnits="userSpaceOnUse"><rect id="rectLeftOfCut" x="0" y="0" width="525.1332" height="1540.3972"/></clipPath></defs>
|
||||
<g id="leftOfCut" clip-path="url(#clipLeftOfCut)"><g id="g1" transform="translate(866.3776,223.15626)">
|
||||
<g id="group-MC1">
|
||||
<path id="path338" d="m 157.54199,-287.18066 c 0,0 0,5.92968 0,5.92968" style="fill:none;stroke:#2896ff;stroke-width:1.0211;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" transform="matrix(1.3333333,0,0,1.3333333,-866.3776,1317.2409)"/>
|
||||
<path id="path339" d="m 138.27441,-279.27246 c 0,0 4.19434,4.19336 4.19434,4.19336" style="fill:none;stroke:#2896ff;stroke-width:1.0211;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" transform="matrix(1.3333333,0,0,1.3333333,-866.3776,1317.2409)"/>
|
||||
<path id="path340" d="m 130.24219,-260.05566 c 0,0 5.93066,-9.8e-4 5.93066,-9.8e-4" style="fill:none;stroke:#2896ff;stroke-width:1.0211;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" transform="matrix(1.3333333,0,0,1.3333333,-866.3776,1317.2409)"/>
|
||||
<path id="path341" d="m 138.15234,-240.78809 c 0,0 4.19336,-4.19531 4.19336,-4.19531" style="fill:none;stroke:#2896ff;stroke-width:1.0211;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" transform="matrix(1.3333333,0,0,1.3333333,-866.3776,1317.2409)"/>
|
||||
<path id="path342" d="m 157.36914,-232.75684 c 0,0 -9.8e-4,-5.93066 -9.8e-4,-5.93066" style="fill:none;stroke:#2896ff;stroke-width:1.0211;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" transform="matrix(1.3333333,0,0,1.3333333,-866.3776,1317.2409)"/>
|
||||
<path id="path343" d="m 176.63672,-240.66602 c 0,0 -4.19434,-4.19238 -4.19434,-4.19238" style="fill:none;stroke:#2896ff;stroke-width:1.0211;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" transform="matrix(1.3333333,0,0,1.3333333,-866.3776,1317.2409)"/>
|
||||
<path id="path344" d="m 184.66797,-259.88184 c 0,0 -5.93164,0 -5.93164,0" style="fill:none;stroke:#2896ff;stroke-width:1.0211;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" transform="matrix(1.3333333,0,0,1.3333333,-866.3776,1317.2409)"/>
|
||||
<path id="path345" d="m 176.75879,-279.14941 c 0,0 -4.19336,4.19336 -4.19336,4.19336" style="fill:none;stroke:#2896ff;stroke-width:1.0211;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" transform="matrix(1.3333333,0,0,1.3333333,-866.3776,1317.2409)"/>
|
||||
<path id="path346" d="m 164.34863,-286.29395 c 0,0 -1.48437,5.74219 -1.48437,5.74219" style="fill:none;stroke:#2896ff;stroke-width:1.0211;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" transform="matrix(1.3333333,0,0,1.3333333,-866.3776,1317.2409)"/>
|
||||
<path id="path347" d="m 143.71484,-283.45801 c 0,0 3.00977,5.10938 3.00977,5.10938" style="fill:none;stroke:#2896ff;stroke-width:1.0211;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" transform="matrix(1.3333333,0,0,1.3333333,-866.3776,1317.2409)"/>
|
||||
<path id="path348" d="m 131.12988,-266.8623 c 0,0 5.74219,1.48437 5.74219,1.48437" style="fill:none;stroke:#2896ff;stroke-width:1.0211;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" transform="matrix(1.3333333,0,0,1.3333333,-866.3776,1317.2409)"/>
|
||||
<path id="path349" d="m 133.96777,-246.22754 c 0,0 5.10938,-3.01172 5.10938,-3.01172" style="fill:none;stroke:#2896ff;stroke-width:1.0211;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" transform="matrix(1.3333333,0,0,1.3333333,-866.3776,1317.2409)"/>
|
||||
<path id="path350" d="m 150.56445,-233.64355 c 0,0 1.48243,-5.74317 1.48243,-5.74317" style="fill:none;stroke:#2896ff;stroke-width:1.0211;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" transform="matrix(1.3333333,0,0,1.3333333,-866.3776,1317.2409)"/>
|
||||
<path id="path351" d="m 171.19629,-236.48145 c 0,0 -3.00977,-5.10839 -3.00977,-5.10839" style="fill:none;stroke:#2896ff;stroke-width:1.0211;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" transform="matrix(1.3333333,0,0,1.3333333,-866.3776,1317.2409)"/>
|
||||
<path id="path352" d="m 183.78125,-253.07813 c 0,0 -5.74219,-1.48242 -5.74219,-1.48242" style="fill:none;stroke:#2896ff;stroke-width:1.0211;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" transform="matrix(1.3333333,0,0,1.3333333,-866.3776,1317.2409)"/>
|
||||
<path id="path353" d="m 180.94336,-273.71191 c 0,0 -5.10742,3.01269 -5.10742,3.01269" style="fill:none;stroke:#2896ff;stroke-width:1.0211;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" transform="matrix(1.3333333,0,0,1.3333333,-866.3776,1317.2409)"/>
|
||||
<path id="path354" d="m 170.71387,-283.7334 c 0,0 -2.87305,5.18848 -2.87305,5.18848" style="fill:none;stroke:#2896ff;stroke-width:1.0211;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" transform="matrix(1.3333333,0,0,1.3333333,-866.3776,1317.2409)"/>
|
||||
<path id="path355" d="m 150.02734,-286.14746 c 0,0 1.63868,5.69922 1.63868,5.69922" style="fill:none;stroke:#2896ff;stroke-width:1.0211;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" transform="matrix(1.3333333,0,0,1.3333333,-866.3776,1317.2409)"/>
|
||||
<path id="path356" d="m 133.69043,-273.22754 c 0,0 5.19043,2.87305 5.19043,2.87305" style="fill:none;stroke:#2896ff;stroke-width:1.0211;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" transform="matrix(1.3333333,0,0,1.3333333,-866.3776,1317.2409)"/>
|
||||
<path id="path357" d="m 131.27734,-252.54004 c 0,0 5.7002,-1.63769 5.7002,-1.63769" style="fill:none;stroke:#2896ff;stroke-width:1.0211;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" transform="matrix(1.3333333,0,0,1.3333333,-866.3776,1317.2409)"/>
|
||||
<path id="path358" d="m 144.19824,-236.2041 c 0,0 2.87207,-5.18945 2.87207,-5.18945" style="fill:none;stroke:#2896ff;stroke-width:1.0211;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" transform="matrix(1.3333333,0,0,1.3333333,-866.3776,1317.2409)"/>
|
||||
<path id="path359" d="m 164.88574,-233.79004 c 0,0 -1.63769,-5.69922 -1.63769,-5.69922" style="fill:none;stroke:#2896ff;stroke-width:1.0211;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" transform="matrix(1.3333333,0,0,1.3333333,-866.3776,1317.2409)"/>
|
||||
<path id="path360" d="m 181.21973,-246.71191 c 0,0 -5.18946,-2.8711 -5.18946,-2.8711" style="fill:none;stroke:#2896ff;stroke-width:1.0211;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" transform="matrix(1.3333333,0,0,1.3333333,-866.3776,1317.2409)"/>
|
||||
<path id="path361" d="m 183.63477,-267.39941 c 0,0 -5.69922,1.63867 -5.69922,1.63867" style="fill:none;stroke:#2896ff;stroke-width:1.0211;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" transform="matrix(1.3333333,0,0,1.3333333,-866.3776,1317.2409)"/>
|
||||
</g>
|
||||
</g>
|
||||
</g></svg>
|
||||
|
After Width: | Height: | Size: 7.9 KiB |
@@ -0,0 +1,14 @@
|
||||
<?xml version='1.0' encoding='UTF-8'?>
|
||||
<!-- Created with Inkscape (http://www.inkscape.org/) --><svg xmlns:xlink="http://www.w3.org/1999/xlink" xmlns="http://www.w3.org/2000/svg" xmlns:svg="http://www.w3.org/2000/svg" version="1.1" id="svg1" width="79.7540" height="48.8438" viewBox="177.7120 1414.4300 79.7540 48.8438">
|
||||
<defs id="defs1">
|
||||
<clipPath id="clipLeftOfCut" clipPathUnits="userSpaceOnUse"><rect id="rectLeftOfCut" x="0" y="0" width="525.1332" height="1540.3972"/></clipPath></defs>
|
||||
<g id="leftOfCut" clip-path="url(#clipLeftOfCut)"><g id="g1" transform="translate(866.3776,223.15626)">
|
||||
<g id="group-MC1">
|
||||
<path id="path321" d="m 180.94434,-59.33984 c 0,0 7.79687,-3.13379 7.79687,-8.93067 0,-5.79687 -7.79687,-8.92969 -7.79687,-8.92969 0,0 10.65527,0.93946 10.65527,8.45899 0,7.52148 -10.65527,9.40137 -10.65527,9.40137 z" style="fill:#2896ff;fill-opacity:1;fill-rule:evenodd;stroke:none" transform="matrix(1.3333333,0,0,1.3333333,-866.3776,1317.2409)"/>
|
||||
<path id="path322" d="m 145.44141,-59.33984 c 0,0 -7.79786,-3.13379 -7.79786,-8.93067 0,-5.79687 7.79786,-8.92969 7.79786,-8.92969 0,0 -10.65723,0.93946 -10.65723,8.45899 0,7.52148 10.65723,9.40137 10.65723,9.40137 z" style="fill:#2896ff;fill-opacity:1;fill-rule:evenodd;stroke:none" transform="matrix(1.3333333,0,0,1.3333333,-866.3776,1317.2409)"/>
|
||||
<path id="path323" d="m 158.28809,-68.30371 c 0,2.89941 -2.34961,5.25 -5.24903,5.25 -2.90039,0 -5.25,-2.35059 -5.25,-5.25 0,-2.89844 2.34961,-5.24902 5.25,-5.24902 2.89942,0 5.24903,2.35058 5.24903,5.24902 z" style="fill:none;stroke:#2896ff;stroke-width:2.0421;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" transform="matrix(1.3333333,0,0,1.3333333,-866.3776,1317.2409)"/>
|
||||
<path id="path324" d="m 178.45605,-68.30371 c 0,2.89941 -2.35156,5.25 -5.25097,5.25 -2.89844,0 -5.24903,-2.35059 -5.24903,-5.25 0,-2.89844 2.35059,-5.24902 5.24903,-5.24902 2.89941,0 5.25097,2.35058 5.25097,5.24902 z" style="fill:none;stroke:#2896ff;stroke-width:2.0421;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" transform="matrix(1.3333333,0,0,1.3333333,-866.3776,1317.2409)"/>
|
||||
<path id="path325" d="m 160.23242,-92.97168 c 0,0 3,13.38281 3,13.38281 0,0 2.96387,-13.38281 2.96387,-13.38281 0,0 -5.96387,0 -5.96387,0 z" style="fill:#2896ff;fill-opacity:1;fill-rule:evenodd;stroke:none" transform="matrix(1.3333333,0,0,1.3333333,-866.3776,1317.2409)"/>
|
||||
</g>
|
||||
</g>
|
||||
</g></svg>
|
||||
|
After Width: | Height: | Size: 2.5 KiB |
@@ -0,0 +1,14 @@
|
||||
<?xml version='1.0' encoding='UTF-8'?>
|
||||
<!-- Created with Inkscape (http://www.inkscape.org/) --><svg xmlns:xlink="http://www.w3.org/1999/xlink" xmlns="http://www.w3.org/2000/svg" xmlns:svg="http://www.w3.org/2000/svg" version="1.1" id="svg1" width="66.0606" height="50.1986" viewBox="184.7380 1492.2000 66.0606 50.1986">
|
||||
<defs id="defs1">
|
||||
<clipPath id="clipLeftOfCut" clipPathUnits="userSpaceOnUse"><rect id="rectLeftOfCut" x="0" y="0" width="525.1332" height="1540.3972"/></clipPath></defs>
|
||||
<g id="leftOfCut" clip-path="url(#clipLeftOfCut)"><g id="g1" transform="translate(866.3776,223.15626)">
|
||||
<g id="group-MC1">
|
||||
<path id="path326" d="m 158.44873,-9.97949 c 0,2.89941 -2.34961,5.25 -5.24902,5.25 -2.89942,0 -5.24903,-2.35059 -5.24903,-5.25 0,-2.89942 2.34961,-5.25 5.24903,-5.25 2.89941,0 5.24902,2.35058 5.24902,5.25 z" style="fill:none;stroke:#2896ff;stroke-width:2.0421;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" transform="matrix(1.3333333,0,0,1.3333333,-866.3776,1317.2409)"/>
|
||||
<path id="path327" d="m 178.6167,-9.97949 c 0,2.89941 -2.35059,5.25 -5.25,5.25 -2.89844,0 -5.24902,-2.35059 -5.24902,-5.25 0,-2.89942 2.35058,-5.25 5.24902,-5.25 2.89941,0 5.25,2.35058 5.25,5.25 z" style="fill:none;stroke:#2896ff;stroke-width:2.0421;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" transform="matrix(1.3333333,0,0,1.3333333,-866.3776,1317.2409)"/>
|
||||
<path id="path328" d="m 160.39307,-34.64844 c 0,0 3.00097,13.38281 3.00097,13.38281 0,0 2.96387,-13.38281 2.96387,-13.38281 z" style="fill:#2896ff;fill-opacity:1;fill-rule:evenodd;stroke:none" transform="matrix(1.3333333,0,0,1.3333333,-866.3776,1317.2409)"/>
|
||||
<path id="path329" d="m 143.28369,0 c 0,0 9.625,-9.77148 9.625,-9.77148 0,0 -12.85547,4.75976 -12.85547,4.75976 z" style="fill:#2896ff;fill-opacity:1;fill-rule:evenodd;stroke:none" transform="matrix(1.3333333,0,0,1.3333333,-866.3776,1317.2409)"/>
|
||||
<path id="path330" d="m 183.36865,0 c 0,0 -9.625,-9.77148 -9.625,-9.77148 0,0 12.85547,4.75976 12.85547,4.75976 z" style="fill:#2896ff;fill-opacity:1;fill-rule:evenodd;stroke:none" transform="matrix(1.3333333,0,0,1.3333333,-866.3776,1317.2409)"/>
|
||||
</g>
|
||||
</g>
|
||||
</g></svg>
|
||||
|
After Width: | Height: | Size: 2.2 KiB |
@@ -0,0 +1,11 @@
|
||||
<?xml version='1.0' encoding='UTF-8'?>
|
||||
<!-- Created with Inkscape (http://www.inkscape.org/) --><svg xmlns:xlink="http://www.w3.org/1999/xlink" xmlns="http://www.w3.org/2000/svg" xmlns:svg="http://www.w3.org/2000/svg" version="1.1" id="svg1" width="16.0000" height="16.0000" viewBox="360.3170 1.4408 16.0000 16.0000">
|
||||
<defs id="defs1">
|
||||
<clipPath id="clipLeftOfCut" clipPathUnits="userSpaceOnUse"><rect id="rectLeftOfCut" x="0" y="0" width="525.1332" height="1540.3972"/></clipPath></defs>
|
||||
<g id="leftOfCut" clip-path="url(#clipLeftOfCut)"><g id="g1" transform="translate(866.3776,223.15626)">
|
||||
<g id="group-MC1">
|
||||
<path id="path1013" d="m 276.70654,-1148.2173 c 0,0.2588 -0.20996,0.4688 -0.46875,0.4688 -0.25879,0 -0.46875,-0.21 -0.46875,-0.4688 0,-0.2588 0.20996,-0.4687 0.46875,-0.4687 0.25879,0 0.46875,0.2099 0.46875,0.4687 z" style="fill:#2896ff;fill-opacity:1;fill-rule:evenodd;stroke:none" transform="matrix(1.3333333,0,0,1.3333333,-866.3776,1317.2409)"/>
|
||||
<path id="path1014" d="m 280.23779,-1148.2173 c 0,2.209 -1.79101,4 -4,4 -2.20898,0 -4,-1.791 -4,-4 0,-2.209 1.79102,-4 4,-4 2.20899,0 4,1.791 4,4 z" style="fill:none;stroke:#2896ff;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" transform="matrix(1.3333333,0,0,1.3333333,-866.3776,1317.2409)"/>
|
||||
</g>
|
||||
</g>
|
||||
</g></svg>
|
||||
|
After Width: | Height: | Size: 1.3 KiB |
@@ -0,0 +1,14 @@
|
||||
<?xml version='1.0' encoding='UTF-8'?>
|
||||
<!-- Created with Inkscape (http://www.inkscape.org/) --><svg xmlns:xlink="http://www.w3.org/1999/xlink" xmlns="http://www.w3.org/2000/svg" xmlns:svg="http://www.w3.org/2000/svg" version="1.1" id="svg1" width="37.7787" height="37.7787" viewBox="346.7610 78.3236 37.7787 37.7787">
|
||||
<defs id="defs1">
|
||||
<clipPath id="clipLeftOfCut" clipPathUnits="userSpaceOnUse"><rect id="rectLeftOfCut" x="0" y="0" width="525.1332" height="1540.3972"/></clipPath></defs>
|
||||
<g id="leftOfCut" clip-path="url(#clipLeftOfCut)"><g id="g1" transform="translate(866.3776,223.15626)">
|
||||
<g id="group-MC1">
|
||||
<path id="path372" d="m 286.40479,-1082.3882 c 0,6.7197 -5.44727,12.167 -12.167,12.167 -6.71972,0 -12.16699,-5.4473 -12.16699,-12.167 0,-6.7197 5.44727,-12.167 12.16699,-12.167 6.71973,0 12.167,5.4473 12.167,12.167 z" style="fill:none;stroke:#2896ff;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" transform="matrix(1.3333333,0,0,1.3333333,-866.3776,1317.2409)"/>
|
||||
<path id="path373" d="m 274.23779,-1094.5552 c 0,0 0,3.166 0,3.166" style="fill:none;stroke:#2896ff;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" transform="matrix(1.3333333,0,0,1.3333333,-866.3776,1317.2409)"/>
|
||||
<path id="path374" d="m 262.0708,-1082.3882 c 0,0 3.16602,0 3.16602,0" style="fill:none;stroke:#2896ff;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" transform="matrix(1.3333333,0,0,1.3333333,-866.3776,1317.2409)"/>
|
||||
<path id="path375" d="m 274.23779,-1070.2212 c 0,0 0,-5.5 0,-5.5" style="fill:none;stroke:#2896ff;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" transform="matrix(1.3333333,0,0,1.3333333,-866.3776,1317.2409)"/>
|
||||
<path id="path376" d="m 286.40479,-1082.3882 c 0,0 -3.16602,0 -3.16602,0" style="fill:none;stroke:#2896ff;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" transform="matrix(1.3333333,0,0,1.3333333,-866.3776,1317.2409)"/>
|
||||
</g>
|
||||
</g>
|
||||
</g></svg>
|
||||
|
After Width: | Height: | Size: 2.2 KiB |
@@ -0,0 +1,17 @@
|
||||
<?xml version='1.0' encoding='UTF-8'?>
|
||||
<!-- Created with Inkscape (http://www.inkscape.org/) --><svg xmlns:xlink="http://www.w3.org/1999/xlink" xmlns="http://www.w3.org/2000/svg" xmlns:svg="http://www.w3.org/2000/svg" version="1.1" id="svg1" width="77.6326" height="77.6316" viewBox="328.8340 163.9380 77.6326 77.6316">
|
||||
<defs id="defs1">
|
||||
<clipPath id="clipLeftOfCut" clipPathUnits="userSpaceOnUse"><rect id="rectLeftOfCut" x="0" y="0" width="525.1332" height="1540.3972"/></clipPath></defs>
|
||||
<g id="leftOfCut" clip-path="url(#clipLeftOfCut)"><g id="g1" transform="translate(866.3776,223.15626)">
|
||||
<g id="group-MC1">
|
||||
<path id="path383" d="m 275.73779,-1025.4902 c 0,0 0,-5.3545 0,-5.3545" style="fill:none;stroke:#2896ff;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" transform="matrix(1.3333333,0,0,1.3333333,-866.3776,1317.2409)"/>
|
||||
<path id="path384" d="m 253.48096,-1003.2329 c 0,0 -5.35547,0 -5.35547,0" style="fill:none;stroke:#2896ff;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" transform="matrix(1.3333333,0,0,1.3333333,-866.3776,1317.2409)"/>
|
||||
<path id="path385" d="m 275.73779,-980.97607 c 0,0 0,5.35546 0,5.35546" style="fill:none;stroke:#2896ff;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" transform="matrix(1.3333333,0,0,1.3333333,-866.3776,1317.2409)"/>
|
||||
<path id="path386" d="m 297.99463,-1003.2329 c 0,0 5.35547,0 5.35547,0" style="fill:none;stroke:#2896ff;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" transform="matrix(1.3333333,0,0,1.3333333,-866.3776,1317.2409)"/>
|
||||
<path id="path387" d="m 294.21533,-1016.9233 c 0,0 0,2.7402 0,2.7402 1.91113,3.2124 3.0293,6.9487 3.0293,10.9502 0,4.00145 -1.11817,7.73778 -3.0293,10.95019 0,0 0,2.74023 0,2.74023 2.84375,-3.82813 4.5293,-8.56592 4.5293,-13.69042 0,-5.1245 -1.68555,-9.8623 -4.5293,-13.6904 z" style="fill:#2896ff;fill-opacity:1;fill-rule:nonzero;stroke:none" transform="matrix(1.3333333,0,0,1.3333333,-866.3776,1317.2409)"/>
|
||||
<path id="path388" d="m 265.1333,-1021.9209 c 3.13281,-1.7851 6.74707,-2.8193 10.60449,-2.8193 3.85742,0 7.47168,1.0342 10.6045,2.8193 0,0 2.79003,0 2.79003,0 -3.77539,-2.7144 -8.39941,-4.3193 -13.39453,-4.3193 -4.99511,0 -9.61914,1.6049 -13.39453,4.3193 z" style="fill:#2896ff;fill-opacity:1;fill-rule:nonzero;stroke:none" transform="matrix(1.3333333,0,0,1.3333333,-866.3776,1317.2409)"/>
|
||||
<path id="path389" d="m 286.85986,-984.85986 c -3.25,1.97509 -7.04882,3.13427 -11.12207,3.13427 -4.07324,0 -7.87207,-1.15918 -11.12207,-3.13427 0,0 -2.70801,0 -2.70801,0 3.85254,2.90722 8.64356,4.63427 13.83008,4.63427 5.18653,0 9.97754,-1.72705 13.83008,-4.63427 z" style="fill:#2896ff;fill-opacity:1;fill-rule:nonzero;stroke:none" transform="matrix(1.3333333,0,0,1.3333333,-866.3776,1317.2409)"/>
|
||||
<path id="path390" d="m 257.25928,-992.28467 c -1.91016,-3.21191 -3.02832,-6.94726 -3.02832,-10.94823 0,-4.001 1.11816,-7.7363 3.02832,-10.9482 0,0 0,-2.7408 0,-2.7408 -2.84278,3.8277 -4.52832,8.565 -4.52832,13.689 0,5.12401 1.68554,9.86132 4.52832,13.68895 0,0 0,-2.74072 0,-2.74072 z" style="fill:#2896ff;fill-opacity:1;fill-rule:nonzero;stroke:none" transform="matrix(1.3333333,0,0,1.3333333,-866.3776,1317.2409)"/>
|
||||
</g>
|
||||
</g>
|
||||
</g></svg>
|
||||
|
After Width: | Height: | Size: 3.4 KiB |
@@ -0,0 +1,10 @@
|
||||
<?xml version='1.0' encoding='UTF-8'?>
|
||||
<!-- Created with Inkscape (http://www.inkscape.org/) --><svg xmlns:xlink="http://www.w3.org/1999/xlink" xmlns="http://www.w3.org/2000/svg" xmlns:svg="http://www.w3.org/2000/svg" version="1.1" id="svg1" width="77.4870" height="77.4870" viewBox="334.4060 420.4670 77.4870 77.4870">
|
||||
<defs id="defs1">
|
||||
<clipPath id="clipLeftOfCut" clipPathUnits="userSpaceOnUse"><rect id="rectLeftOfCut" x="0" y="0" width="525.1332" height="1540.3972"/></clipPath></defs>
|
||||
<g id="leftOfCut" clip-path="url(#clipLeftOfCut)"><g id="g1" transform="translate(866.3776,223.15626)">
|
||||
<g id="group-MC1">
|
||||
<path id="path363" d="m 253.50391,-810.89209 c 0,-14.5332 11.82422,-26.35645 26.35839,-26.35645 14.53418,0 26.3584,11.82325 26.3584,26.35645 0,14.53516 -11.82422,26.36035 -26.3584,26.36035 -14.53417,0 -26.35839,-11.82519 -26.35839,-26.36035 z m -1.19922,0 c 0,15.19629 12.3623,27.55957 27.55761,27.55957 15.19532,0 27.55762,-12.36328 27.55762,-27.55957 0,-15.19434 -12.3623,-27.55566 -27.55762,-27.55566 -15.19531,0 -27.55761,12.36132 -27.55761,27.55566 z" style="fill:#2896ff;fill-opacity:1;fill-rule:nonzero;stroke:none" transform="matrix(1.3333333,0,0,1.3333333,-866.3776,1317.2409)"/>
|
||||
</g>
|
||||
</g>
|
||||
</g></svg>
|
||||
|
After Width: | Height: | Size: 1.2 KiB |
@@ -0,0 +1,25 @@
|
||||
<?xml version='1.0' encoding='UTF-8'?>
|
||||
<!-- Created with Inkscape (http://www.inkscape.org/) --><svg xmlns:xlink="http://www.w3.org/1999/xlink" xmlns="http://www.w3.org/2000/svg" xmlns:svg="http://www.w3.org/2000/svg" version="1.1" id="svg1" width="70.6050" height="78.0603" viewBox="329.0980 681.8930 70.6050 78.0603">
|
||||
<defs id="defs1">
|
||||
<clipPath id="clipLeftOfCut" clipPathUnits="userSpaceOnUse"><rect id="rectLeftOfCut" x="0" y="0" width="525.1332" height="1540.3972"/></clipPath></defs>
|
||||
<g id="leftOfCut" clip-path="url(#clipLeftOfCut)"><g id="g1" transform="translate(866.3776,223.15626)">
|
||||
<g id="group-MC1">
|
||||
<path id="path301" d="m 248.32373,-635.7334 c 0,0 17.83301,11.30078 17.83301,11.30078 0,0 -11.34082,-17.79101 -11.34082,-17.79101 z" style="fill:#2896ff;fill-opacity:1;fill-rule:evenodd;stroke:none" transform="matrix(1.3333333,0,0,1.3333333,-866.3776,1317.2409)"/>
|
||||
<path id="path302" d="m 291.7876,-642.37793 c 0,0 -11.30371,17.83496 -11.30371,17.83496 0,0 17.79297,-11.34277 17.79297,-11.34277 z" style="fill:#2896ff;fill-opacity:1;fill-rule:evenodd;stroke:none" transform="matrix(1.3333333,0,0,1.3333333,-866.3776,1317.2409)"/>
|
||||
<path id="path303" d="m 278.30615,-586.83301 c 0,0 -4.61914,-20.60351 -4.61914,-20.60351 0,0 -4.56152,20.60351 -4.56152,20.60351 z" style="fill:#2896ff;fill-opacity:1;fill-rule:evenodd;stroke:none" transform="matrix(1.3333333,0,0,1.3333333,-866.3776,1317.2409)"/>
|
||||
<path id="path304" d="m 286.5708,-606.49707 c 0,0 -5.89062,-3.7334 -5.89062,-3.7334 0,0 3.74707,5.87793 3.74707,5.87793 z" style="fill:#2896ff;fill-opacity:1;fill-rule:evenodd;stroke:none" transform="matrix(1.3333333,0,0,1.3333333,-866.3776,1317.2409)"/>
|
||||
<path id="path305" d="m 262.83643,-604.30176 c 0,0 3.73437,-5.8916 3.73437,-5.8916 0,0 -5.87793,3.74707 -5.87793,3.74707 z" style="fill:#2896ff;fill-opacity:1;fill-rule:evenodd;stroke:none" transform="matrix(1.3333333,0,0,1.3333333,-866.3776,1317.2409)"/>
|
||||
<path id="path306" d="m 271.896,-634.00098 c 0,0 1.52636,6.80664 1.52636,6.80664 0,0 1.50684,-6.80664 1.50684,-6.80664 z" style="fill:#2896ff;fill-opacity:1;fill-rule:evenodd;stroke:none" transform="matrix(1.3333333,0,0,1.3333333,-866.3776,1317.2409)"/>
|
||||
<path id="path307" d="m 290.44873,-618.89941 c 0,0 -6.80273,1.52539 -6.80273,1.52539 0,0 6.80468,1.50781 6.80468,1.50781 0,0 -0.002,-3.0332 -0.002,-3.0332 z" style="fill:#2896ff;fill-opacity:1;fill-rule:evenodd;stroke:none" transform="matrix(1.3333333,0,0,1.3333333,-866.3776,1317.2409)"/>
|
||||
<path id="path308" d="m 256.92139,-615.73633 c 0,0 6.80468,-1.52539 6.80468,-1.52539 0,0 -6.80468,-1.50879 -6.80468,-1.50879 z" style="fill:#2896ff;fill-opacity:1;fill-rule:evenodd;stroke:none" transform="matrix(1.3333333,0,0,1.3333333,-866.3776,1317.2409)"/>
|
||||
<path id="path309" d="m 281.32568,-602.29395 c 0,0 -3.97949,-5.72558 -3.97949,-5.72558 0,0 1.17188,6.87012 1.17188,6.87012 z" style="fill:#2896ff;fill-opacity:1;fill-rule:evenodd;stroke:none" transform="matrix(1.3333333,0,0,1.3333333,-866.3776,1317.2409)"/>
|
||||
<path id="path310" d="m 278.47314,-633.33691 c 0,0 -1.23437,6.86523 -1.23437,6.86523 0,0 4.03027,-5.68848 4.03027,-5.68848 0,0 -2.7959,-1.17675 -2.7959,-1.17675 z" style="fill:#2896ff;fill-opacity:1;fill-rule:evenodd;stroke:none" transform="matrix(1.3333333,0,0,1.3333333,-866.3776,1317.2409)"/>
|
||||
<path id="path311" d="m 257.58447,-622.31348 c 0,0 6.86524,1.23438 6.86524,1.23438 0,0 -5.68848,-4.0293 -5.68848,-4.0293 0,0 -1.17676,2.79492 -1.17676,2.79492 z" style="fill:#2896ff;fill-opacity:1;fill-rule:evenodd;stroke:none" transform="matrix(1.3333333,0,0,1.3333333,-866.3776,1317.2409)"/>
|
||||
<path id="path312" d="m 289.74463,-612.31543 c 0,0 -6.87012,-1.19336 -6.87012,-1.19336 0,0 5.71192,3.99609 5.71192,3.99609 0,0 1.1582,-2.80273 1.1582,-2.80273 z" style="fill:#2896ff;fill-opacity:1;fill-rule:evenodd;stroke:none" transform="matrix(1.3333333,0,0,1.3333333,-866.3776,1317.2409)"/>
|
||||
<path id="path313" d="m 268.66064,-601.20215 c 0,0 1.19239,-6.87012 1.19239,-6.87012 0,0 -3.99512,5.71192 -3.99512,5.71192 0,0 2.80273,1.1582 2.80273,1.1582 z" style="fill:#2896ff;fill-opacity:1;fill-rule:evenodd;stroke:none" transform="matrix(1.3333333,0,0,1.3333333,-866.3776,1317.2409)"/>
|
||||
<path id="path314" d="m 265.65771,-632.10547 c 0,0 4.01661,5.70313 4.01661,5.70313 0,0 -1.21387,-6.86329 -1.21387,-6.86329 0,0 -2.80274,1.16016 -2.80274,1.16016 z" style="fill:#2896ff;fill-opacity:1;fill-rule:evenodd;stroke:none" transform="matrix(1.3333333,0,0,1.3333333,-866.3776,1317.2409)"/>
|
||||
<path id="path315" d="m 288.58057,-625.25684 c 0,0 -5.70118,4.01465 -5.70118,4.01465 0,0 6.86231,-1.21386 6.86231,-1.21386 0,0 -1.16113,-2.80079 -1.16113,-2.80079 z" style="fill:#2896ff;fill-opacity:1;fill-rule:evenodd;stroke:none" transform="matrix(1.3333333,0,0,1.3333333,-866.3776,1317.2409)"/>
|
||||
<path id="path316" d="m 258.81592,-609.49805 c 0,0 5.70312,-4.01562 5.70312,-4.01562 0,0 -6.8623,1.21387 -6.8623,1.21387 z" style="fill:#2896ff;fill-opacity:1;fill-rule:evenodd;stroke:none" transform="matrix(1.3333333,0,0,1.3333333,-866.3776,1317.2409)"/>
|
||||
</g>
|
||||
</g>
|
||||
</g></svg>
|
||||
|
After Width: | Height: | Size: 5.0 KiB |
@@ -0,0 +1,29 @@
|
||||
<?xml version='1.0' encoding='UTF-8'?>
|
||||
<!-- Created with Inkscape (http://www.inkscape.org/) --><svg xmlns:xlink="http://www.w3.org/1999/xlink" xmlns="http://www.w3.org/2000/svg" xmlns:svg="http://www.w3.org/2000/svg" version="1.1" id="svg1" width="88.2461" height="88.8105" viewBox="324.0030 932.7860 88.2461 88.8105">
|
||||
<defs id="defs1">
|
||||
<clipPath id="clipLeftOfCut" clipPathUnits="userSpaceOnUse"><rect id="rectLeftOfCut" x="0" y="0" width="525.1332" height="1540.3972"/></clipPath></defs>
|
||||
<g id="leftOfCut" clip-path="url(#clipLeftOfCut)"><g id="g1" transform="translate(866.3776,223.15626)">
|
||||
<g id="group-MC1">
|
||||
<path id="path391" d="m 245.17725,-422.25293 c 0,0 5.54394,0 5.54394,0" style="fill:none;stroke:#2896ff;stroke-width:1.0144;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" transform="matrix(1.3333333,0,0,1.3333333,-866.3776,1317.2409)"/>
|
||||
<path id="path392" d="m 301.76807,-422.25293 c 0,0 5.54394,0 5.54394,0" style="fill:none;stroke:#2896ff;stroke-width:1.0144;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" transform="matrix(1.3333333,0,0,1.3333333,-866.3776,1317.2409)"/>
|
||||
<path id="path393" d="m 255.69287,-422.25293 c 0,0 7.07324,0 7.07324,0" style="fill:none;stroke:#2896ff;stroke-width:1.0144;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" transform="matrix(1.3333333,0,0,1.3333333,-866.3776,1317.2409)"/>
|
||||
<path id="path394" d="m 289.6626,-422.25293 c 0,0 7.07324,0 7.07324,0" style="fill:none;stroke:#2896ff;stroke-width:1.0144;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" transform="matrix(1.3333333,0,0,1.3333333,-866.3776,1317.2409)"/>
|
||||
<path id="path395" d="m 269.76514,-422.25293 c 0,0 13.0498,0 13.0498,0" style="fill:none;stroke:#2896ff;stroke-width:1.0144;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" transform="matrix(1.3333333,0,0,1.3333333,-866.3776,1317.2409)"/>
|
||||
<path id="path396" d="m 269.76514,-411.20703 c 0,0 13.0498,0 13.0498,0" style="fill:none;stroke:#2896ff;stroke-width:1.0144;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" transform="matrix(1.3333333,0,0,1.3333333,-866.3776,1317.2409)"/>
|
||||
<path id="path397" d="m 269.76514,-432.23926 c 0,0 13.0498,0 13.0498,0" style="fill:none;stroke:#2896ff;stroke-width:1.0144;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" transform="matrix(1.3333333,0,0,1.3333333,-866.3776,1317.2409)"/>
|
||||
<path id="path398" d="m 269.76514,-400.2373 c 0,0 13.0498,0 13.0498,0" style="fill:none;stroke:#2896ff;stroke-width:1.0144;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" transform="matrix(1.3333333,0,0,1.3333333,-866.3776,1317.2409)"/>
|
||||
<path id="path399" d="m 269.76514,-443.28613 c 0,0 13.0498,0 13.0498,0" style="fill:none;stroke:#2896ff;stroke-width:1.0144;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" transform="matrix(1.3333333,0,0,1.3333333,-866.3776,1317.2409)"/>
|
||||
<path id="path400" d="m 282.46436,-452.32617 c 0,0 0,-1.23145 0,-1.23145 -2.05762,-0.42578 -4.18848,-0.65039 -6.36915,-0.65039 -2.18066,0 -4.31152,0.22461 -6.36914,0.65039 0,0 0,1.23145 0,1.23145 2.05469,-0.44238 4.18457,-0.68067 6.36914,-0.68067 2.18458,0 4.31446,0.23829 6.36915,0.68067 z" style="fill:#2896ff;fill-opacity:1;fill-rule:nonzero;stroke:none" transform="matrix(1.3333333,0,0,1.3333333,-866.3776,1317.2409)"/>
|
||||
<path id="path401" d="m 244.50244,-422.40527 c 0,17.53711 14.17188,31.80468 31.59277,31.80468 17.41993,0 31.5918,-14.26757 31.5918,-31.80468 0,-11.54493 -6.14355,-21.66993 -15.31152,-27.24317 0,0 0,1.42188 0,1.42188 8.47461,5.43652 14.1123,14.97558 14.1123,25.82129 0,16.87597 -13.63379,30.60547 -30.39258,30.60547 -16.75878,0 -30.39355,-13.7295 -30.39355,-30.60547" style="fill:#2896ff;fill-opacity:1;fill-rule:nonzero;stroke:none" transform="matrix(1.3333333,0,0,1.3333333,-866.3776,1317.2409)"/>
|
||||
<path id="path402" d="m 245.70166,-422.40527 c 0,-10.84571 5.6377,-20.38477 14.11328,-25.82227 0,0 0,-1.42187 0,-1.42187 -9.16894,5.57324 -15.3125,15.69921 -15.3125,27.24414" style="fill:#2896ff;fill-opacity:1;fill-rule:nonzero;stroke:none" transform="matrix(1.3333333,0,0,1.3333333,-866.3776,1317.2409)"/>
|
||||
<path id="path403" d="m 261.229,-453.73926 c 0,0 0,2.5 0,2.5 0,0 2,0 2,0" style="fill:none;stroke:#2896ff;stroke-width:1.0144;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" transform="matrix(1.3333333,0,0,1.3333333,-866.3776,1317.2409)"/>
|
||||
<path id="path404" d="m 263.229,-453.73926 c 0,0 0,3.9375 0,3.9375" style="fill:none;stroke:#2896ff;stroke-width:1.0144;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" transform="matrix(1.3333333,0,0,1.3333333,-866.3776,1317.2409)"/>
|
||||
<path id="path405" d="m 267.2915,-450.23926 c 0,0 -2,0 -2,0 0,0 0,-3 0,-3 0,0 2,0 2,0 z" style="fill:none;stroke:#2896ff;stroke-width:1.0144;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" transform="matrix(1.3333333,0,0,1.3333333,-866.3776,1317.2409)"/>
|
||||
<path id="path406" d="m 289.2915,-453.70801 c 0,0 0,3.5 0,3.5 0,0 2.5,0 2.5,0" style="fill:none;stroke:#2896ff;stroke-width:1.0144;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" transform="matrix(1.3333333,0,0,1.3333333,-866.3776,1317.2409)"/>
|
||||
<path id="path407" d="m 285.2915,-453.73926 c 0,0 0,4.04688 0,4.04688" style="fill:none;stroke:#2896ff;stroke-width:1.0144;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" transform="matrix(1.3333333,0,0,1.3333333,-866.3776,1317.2409)"/>
|
||||
<path id="path408" d="m 287.2915,-453.72363 c 0,0 0,2.01562 0,2.01562" style="fill:none;stroke:#2896ff;stroke-width:1.0144;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" transform="matrix(1.3333333,0,0,1.3333333,-866.3776,1317.2409)"/>
|
||||
<path id="path409" d="m 287.2915,-450.72363 c 0,0 0,1.01562 0,1.01562" style="fill:none;stroke:#2896ff;stroke-width:1.0144;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" transform="matrix(1.3333333,0,0,1.3333333,-866.3776,1317.2409)"/>
|
||||
<path id="path410" d="m 286.27588,-451.70801 c 0,0 0,1.01563 0,1.01563" style="fill:none;stroke:#2896ff;stroke-width:1.0144;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" transform="matrix(1.3333333,0,0,1.3333333,-866.3776,1317.2409)"/>
|
||||
</g>
|
||||
</g>
|
||||
</g></svg>
|
||||
|
After Width: | Height: | Size: 6.8 KiB |
@@ -0,0 +1,15 @@
|
||||
<?xml version='1.0' encoding='UTF-8'?>
|
||||
<!-- Created with Inkscape (http://www.inkscape.org/) --><svg xmlns:xlink="http://www.w3.org/1999/xlink" xmlns="http://www.w3.org/2000/svg" xmlns:svg="http://www.w3.org/2000/svg" version="1.1" id="svg1" width="13.2811" height="13.3171" viewBox="364.3760 1250.6000 13.2811 13.3171">
|
||||
<defs id="defs1">
|
||||
<clipPath id="clipLeftOfCut" clipPathUnits="userSpaceOnUse"><rect id="rectLeftOfCut" x="0" y="0" width="525.1332" height="1540.3972"/></clipPath></defs>
|
||||
<g id="leftOfCut" clip-path="url(#clipLeftOfCut)"><g id="g1" transform="translate(866.3776,223.15626)">
|
||||
<g id="group-MC1">
|
||||
<path id="path377" d="m 274.78223,-214.33887 c 0,0 1.50879,0 1.50879,0 0,0 0,-1.50781 0,-1.50781" style="fill:none;stroke:#2896ff;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" transform="matrix(1.3333333,0,0,1.3333333,-866.3776,1317.2409)"/>
|
||||
<path id="path378" d="m 280.23535,-215.84668 c 0,0 0,1.50879 0,1.50879 0,0 1.50781,0 1.50781,0" style="fill:none;stroke:#2896ff;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" transform="matrix(1.3333333,0,0,1.3333333,-866.3776,1317.2409)"/>
|
||||
<path id="path379" d="m 281.74316,-210.36523 c 0,0 -1.50781,0 -1.50781,0 0,0 0,1.50781 0,1.50781" style="fill:none;stroke:#2896ff;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" transform="matrix(1.3333333,0,0,1.3333333,-866.3776,1317.2409)"/>
|
||||
<path id="path380" d="m 276.29004,-208.85742 c 0,0 0,-1.50781 0,-1.50781 0,0 -1.50781,0 -1.50781,0" style="fill:none;stroke:#2896ff;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" transform="matrix(1.3333333,0,0,1.3333333,-866.3776,1317.2409)"/>
|
||||
<path id="path381" d="m 278.2334,-213.8457 c 0,0 0,2.9873 0,2.9873" style="fill:none;stroke:#2896ff;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" transform="matrix(1.3333333,0,0,1.3333333,-866.3776,1317.2409)"/>
|
||||
<path id="path382" d="m 276.7832,-212.36719 c 0,0 2.95899,0 2.95899,0" style="fill:none;stroke:#2896ff;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" transform="matrix(1.3333333,0,0,1.3333333,-866.3776,1317.2409)"/>
|
||||
</g>
|
||||
</g>
|
||||
</g></svg>
|
||||
|
After Width: | Height: | Size: 2.5 KiB |
@@ -0,0 +1,10 @@
|
||||
<?xml version='1.0' encoding='UTF-8'?>
|
||||
<!-- Created with Inkscape (http://www.inkscape.org/) --><svg xmlns:xlink="http://www.w3.org/1999/xlink" xmlns="http://www.w3.org/2000/svg" xmlns:svg="http://www.w3.org/2000/svg" version="1.1" id="svg1" width="25.7214" height="9.7096" viewBox="364.7910 1519.1100 25.7214 9.7096">
|
||||
<defs id="defs1">
|
||||
<clipPath id="clipLeftOfCut" clipPathUnits="userSpaceOnUse"><rect id="rectLeftOfCut" x="0" y="0" width="525.1332" height="1540.3972"/></clipPath></defs>
|
||||
<g id="leftOfCut" clip-path="url(#clipLeftOfCut)"><g id="g1" transform="translate(866.3776,223.15626)">
|
||||
<g id="group-MC1">
|
||||
<path id="path371" d="m 278.27393,-10.17969 c 2.01855,-1.05273 4.58691,-2.39355 4.96484,-2.59082 0.37793,0.19727 2.94629,1.53809 4.96484,2.59082 0,0 3.16407,0 3.16407,0 0,0 0.0166,-0.03222 0.0166,-0.03222 0,0 -8.14551,-4.25 -8.14551,-4.25 0,0 -0.34668,0.18066 -0.34668,0.18066 0,0 -7.79883,4.06934 -7.79883,4.06934 0,0 0.0166,0.03222 0.0166,0.03222 0,0 3.16407,0 3.16407,0 z" style="fill:#2896ff;fill-opacity:1;fill-rule:nonzero;stroke:none" transform="matrix(1.3333333,0,0,1.3333333,-866.3776,1317.2409)"/>
|
||||
</g>
|
||||
</g>
|
||||
</g></svg>
|
||||
|
After Width: | Height: | Size: 1.1 KiB |
@@ -1,29 +0,0 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="512" height="512" viewBox="0 0 512 512">
|
||||
<defs>
|
||||
<mask id="arcs" maskUnits="userSpaceOnUse" x="0" y="0" width="512" height="512">
|
||||
<rect width="512" height="512" fill="#fff"/>
|
||||
<rect x="56" y="56" width="148" height="148" fill="#000"/>
|
||||
</mask>
|
||||
</defs>
|
||||
<!-- assault rifle reticle: ring cut into four arcs, with four outward ticks -->
|
||||
<circle cx="130" cy="130" r="90.00" fill="none" stroke="#fff" stroke-width="8.10" mask="url(#arcs)"/>
|
||||
<g fill="#fff">
|
||||
<rect id="t" x="128" y="20" width="4" height="20"/>
|
||||
<use href="#t" transform="rotate(90 130 130)"/>
|
||||
<use href="#t" transform="rotate(180 130 130)"/>
|
||||
<use href="#t" transform="rotate(270 130 130)"/>
|
||||
</g>
|
||||
<!-- small thin ring with four semi-opaque grey inward ticks (the lower one longer) -->
|
||||
<circle cx="318" cy="54" r="48.00" fill="none" stroke="#fff" stroke-width="4.18"/>
|
||||
<g fill="#ccc" fill-opacity="0.8">
|
||||
<rect id="u" x="316" y="8" width="4" height="10"/>
|
||||
<use href="#u" transform="rotate(90 318 54)"/>
|
||||
<use href="#u" transform="rotate(270 318 54)"/>
|
||||
<rect x="316" y="80" width="4" height="20"/>
|
||||
</g>
|
||||
<!-- tiny crosshair with corner brackets -->
|
||||
<path fill="#fff" d="M420,40h4v8h-8v-4h4z M440,40h-4v8h8v-4h-4z M420,68h4v-8h-8v4h4z M440,68h-4v-8h8v4h-4z
|
||||
M428,48h4v4h4v4h-4v4h-4v-4h-4v-4h4z"/>
|
||||
<!-- chevron -->
|
||||
<polygon fill="#fff" points="4,284 36,268 68,284 68,288 36,272 4,288"/>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 1.4 KiB |
@@ -1,11 +0,0 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="256" height="256" viewBox="0 0 256 256">
|
||||
<!-- top wedge -->
|
||||
<polygon points="128.10,100.00 141.10,44.00 115.10,44.00" fill="#fff"/>
|
||||
<!-- lower wedges ending inside the rings (mirror pair) -->
|
||||
<polygon points="88.18,141.09 33.84,159.62 47.56,181.72" fill="#fff"/>
|
||||
<polygon points="168.03,141.09 222.37,159.62 208.65,181.72" fill="#fff"/>
|
||||
<g fill="none" stroke="#fff" stroke-width="8.08">
|
||||
<circle cx="88.17" cy="141.08" r="21.04"/>
|
||||
<circle cx="168.03" cy="141.08" r="21.04"/>
|
||||
</g>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 555 B |
@@ -1,24 +0,0 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="256" height="256" viewBox="0 0 256 256">
|
||||
<!-- ring of 13 small grey wedges: on each axis and 21 degrees either side, plus the diagonals -->
|
||||
<g fill="#979797" fill-opacity="0.592">
|
||||
<polygon id="s" points="128.00,72.00 134.00,48.00 122.00,48.00"/>
|
||||
<use href="#s" transform="rotate(-21 128 114)"/>
|
||||
<use href="#s" transform="rotate(21 128 114)"/>
|
||||
<use href="#s" transform="rotate(270 128 114)"/>
|
||||
<use href="#s" transform="rotate(249 128 114)"/>
|
||||
<use href="#s" transform="rotate(-69 128 114)"/>
|
||||
<use href="#s" transform="rotate(90 128 114)"/>
|
||||
<use href="#s" transform="rotate(111 128 114)"/>
|
||||
<use href="#s" transform="rotate(69 128 114)"/>
|
||||
<use href="#s" transform="rotate(225 128 114)"/>
|
||||
<use href="#s" transform="rotate(135 128 114)"/>
|
||||
<use href="#s" transform="rotate(201 128 114)"/>
|
||||
<use href="#s" transform="rotate(159 128 114)"/>
|
||||
</g>
|
||||
<!-- three large white wedges -->
|
||||
<g fill="#fff">
|
||||
<polygon points="128.00,152.00 147.00,232.00 109.00,232.00"/>
|
||||
<polygon points="99.11,85.25 55.92,15.22 29.07,42.07"/>
|
||||
<polygon points="156.89,85.25 200.08,15.22 226.93,42.07"/>
|
||||
</g>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 1.2 KiB |
@@ -1,10 +0,0 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="256" height="256" viewBox="0 0 256 256">
|
||||
<!-- top wedge -->
|
||||
<polygon points="115.00,40.00 141.00,40.00 128.00,96.00" fill="#fff"/>
|
||||
<!-- crescent brackets and rings; right half mirrors the left -->
|
||||
<g id="half">
|
||||
<path d="M57.944,102.694 A47.599,33.535 0 0 0 57.944,169.306 A83.117,43.797 0 0 1 57.944,102.694Z" fill="#fff"/>
|
||||
<circle cx="88" cy="136" r="20.00" fill="none" stroke="#fff" stroke-width="8.00"/>
|
||||
</g>
|
||||
<use href="#half" transform="matrix(-1 0 0 1 256 0)"/>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 541 B |
@@ -1,6 +0,0 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="256" height="256" viewBox="0 0 256 256">
|
||||
<!-- three wedges pointing at the centre, 120 degrees apart -->
|
||||
<polygon id="w" points="127.97,76.69 139.97,15.62 115.98,15.62" fill="#fff"/>
|
||||
<use href="#w" transform="rotate(120 127.97 129.61)"/>
|
||||
<use href="#w" transform="rotate(240 127.97 129.61)"/>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 355 B |
@@ -1,7 +0,0 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="256" height="256" viewBox="0 0 256 256">
|
||||
<!-- four diagonal wedges pointing at the centre -->
|
||||
<polygon id="w" points="90.11,89.68 55.44,36.61 37.03,55.01" fill="#fff"/>
|
||||
<use href="#w" transform="rotate(90 127.93 127.51)"/>
|
||||
<use href="#w" transform="rotate(180 127.93 127.51)"/>
|
||||
<use href="#w" transform="rotate(270 127.93 127.51)"/>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 397 B |
@@ -1,29 +0,0 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="256" height="256" viewBox="0 0 256 256">
|
||||
<!-- 24 radial ticks, 15 degrees apart -->
|
||||
<g fill="#fff">
|
||||
<rect id="t" x="124" y="24" width="4" height="24"/>
|
||||
<use href="#t" transform="rotate(15 126 130)"/>
|
||||
<use href="#t" transform="rotate(30 126 130)"/>
|
||||
<use href="#t" transform="rotate(45 126 130)"/>
|
||||
<use href="#t" transform="rotate(60 126 130)"/>
|
||||
<use href="#t" transform="rotate(75 126 130)"/>
|
||||
<use href="#t" transform="rotate(90 126 130)"/>
|
||||
<use href="#t" transform="rotate(105 126 130)"/>
|
||||
<use href="#t" transform="rotate(120 126 130)"/>
|
||||
<use href="#t" transform="rotate(135 126 130)"/>
|
||||
<use href="#t" transform="rotate(150 126 130)"/>
|
||||
<use href="#t" transform="rotate(165 126 130)"/>
|
||||
<use href="#t" transform="rotate(180 126 130)"/>
|
||||
<use href="#t" transform="rotate(195 126 130)"/>
|
||||
<use href="#t" transform="rotate(210 126 130)"/>
|
||||
<use href="#t" transform="rotate(225 126 130)"/>
|
||||
<use href="#t" transform="rotate(240 126 130)"/>
|
||||
<use href="#t" transform="rotate(255 126 130)"/>
|
||||
<use href="#t" transform="rotate(270 126 130)"/>
|
||||
<use href="#t" transform="rotate(285 126 130)"/>
|
||||
<use href="#t" transform="rotate(300 126 130)"/>
|
||||
<use href="#t" transform="rotate(315 126 130)"/>
|
||||
<use href="#t" transform="rotate(330 126 130)"/>
|
||||
<use href="#t" transform="rotate(345 126 130)"/>
|
||||
</g>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 1.4 KiB |
@@ -1,8 +0,0 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="256" height="256" viewBox="0 0 256 256">
|
||||
<!-- crescent brackets (ellipse minus ellipse) with inward-pointing triangles; right half mirrors the left -->
|
||||
<g id="half" fill="#fff">
|
||||
<path d="M57.943,96.694 A47.599,33.535 0 0 0 57.943,163.306 A83.117,43.797 0 0 1 57.943,96.694Z"/>
|
||||
<polygon points="44,120 58,130 44,140"/>
|
||||
</g>
|
||||
<use href="#half" transform="matrix(-1 0 0 1 256 0)"/>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 448 B |
@@ -1,3 +0,0 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="256" height="256" viewBox="0 0 256 256">
|
||||
<circle cx="126.00" cy="126.00" r="108.00" fill="none" stroke="#fff" stroke-width="4.18"/>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 188 B |
@@ -0,0 +1,8 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="170.30" height="126.60" viewBox="0 0 170.30 126.60">
|
||||
<!-- "10x" in Overpass-900.ttf -->
|
||||
<g fill="#ffffff" transform="scale(0.05 -0.05) translate(0 -1766)">
|
||||
<path transform="translate(0 0)" d="M264 0V998H62V1258Q128 1258 180.0 1271.0Q232 1284 268.0 1315.0Q304 1346 322 1400H580V0Z"/>
|
||||
<path transform="translate(836 0)" d="M668 -24Q513 -24 410.5 40.0Q308 104 249.0 210.0Q190 316 165.0 444.0Q140 572 140 700Q140 809 156.0 914.5Q172 1020 208.5 1112.0Q245 1204 306.0 1274.0Q367 1344 456.5 1384.0Q546 1424 668 1424Q823 1424 925.5 1361.5Q1028 1299 1087.0 1194.5Q1146 1090 1171.0 961.5Q1196 833 1196 700Q1196 592 1180.0 487.0Q1164 382 1127.0 290.0Q1090 198 1029.0 127.0Q968 56 879.0 16.0Q790 -24 668 -24ZM668 274Q728 274 769.5 308.5Q811 343 836.0 402.5Q861 462 872.5 538.5Q884 615 884 700Q884 780 873.0 856.0Q862 932 837.5 993.0Q813 1054 771.5 1090.0Q730 1126 668 1126Q608 1126 566.5 1091.5Q525 1057 499.0 997.5Q473 938 461.5 861.5Q450 785 450 700Q450 620 461.0 544.0Q472 468 497.0 407.0Q522 346 564.0 310.0Q606 274 668 274Z"/>
|
||||
<path transform="translate(2172 0)" d="M50 0 442 528 74 1022H424L552 850Q569 828 588.5 801.0Q608 774 616 754Q627 774 644.5 801.5Q662 829 678 850L810 1022H1160L792 528L1184 0H834L678 204Q662 225 644.5 253.0Q627 281 616 300Q608 281 587.5 253.0Q567 225 552 205L400 0Z"/>
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 1.3 KiB |
@@ -0,0 +1,7 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="116.80" height="126.60" viewBox="0 0 116.80 126.60">
|
||||
<!-- "2x" in Overpass-900.ttf -->
|
||||
<g fill="#ffffff" transform="scale(0.05 -0.05) translate(0 -1766)">
|
||||
<path transform="translate(0 0)" d="M122 0Q122 164 157.5 288.5Q193 413 257.0 507.5Q321 602 408.0 673.5Q495 745 598 802Q642 827 682.0 854.5Q722 882 747.0 917.0Q772 952 772 998Q772 1061 733.5 1093.5Q695 1126 632 1126Q566 1126 513.0 1090.5Q460 1055 424 990L144 1118Q210 1262 342.0 1343.0Q474 1424 624 1424Q770 1424 872.5 1367.5Q975 1311 1028.5 1217.0Q1082 1123 1082 1010Q1082 889 1045.0 809.0Q1008 729 943.0 672.5Q878 616 794 566Q700 510 641.5 469.5Q583 429 548.0 390.5Q513 352 490 302H1094V0Z"/>
|
||||
<path transform="translate(1102 0)" d="M50 0 442 528 74 1022H424L552 850Q569 828 588.5 801.0Q608 774 616 754Q627 774 644.5 801.5Q662 829 678 850L810 1022H1160L792 528L1184 0H834L678 204Q662 225 644.5 253.0Q627 281 616 300Q608 281 587.5 253.0Q567 225 552 205L400 0Z"/>
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 976 B |
@@ -941,7 +941,7 @@ crafted file) is refused, and the level starts over.
|
||||
| --- | --- |
|
||||
| Game code | All 466 C files of the game. The changes are in "Game source changes". |
|
||||
| Graphics | Direct3D 8 on OpenGL 4.5 core through SDL3 (`src/d3d8_gl.c`). The port translates the NV2A vertex shaders and register combiners to GLSL. It decodes all the Xbox texture formats. The vertex and index buffers come from a GL copy of the Xbox memory. |
|
||||
| High-res HUD | The HUD is drawn from high-res assets: redraws at 8x the size of the maps' bitmaps (4x for the largest), in `port/assets/hud`. They cover the meters, counters, panels and their outlines, the motion sensor, reticles, waypoints and scopes, but no bitmap with English text. `tools/hud_assets.py` makes them from the SVG redraws, and the build embeds them in the executable. When the game uploads one of those bitmaps, `src/hud_hires.c` gives the high-res texture in its place, if the bitmap's pixels are those of the English maps: another language's maps keep their own. The game sizes and places the HUD from its tags as before. `display.high_res_hud = false` turns this off. |
|
||||
| High-res HUD | The HUD is drawn from high-res assets: redraws at 8x the size of the maps' bitmaps (4x for the largest), in `port/assets/hud`. They cover the meters, counters, panels and their outlines, the motion sensor, reticles, waypoints and scopes, but no bitmap with English text. `tools/hud_assets.py` makes them from the SVG redraws (the weapons' reticles from those of the PC HUD sheet that match the Xbox's exactly, the sniper rifle's 2x and 10x set in Overpass), and the build embeds them in the executable. When the game uploads one of those bitmaps, `src/hud_hires.c` gives the high-res texture in its place, if the bitmap's pixels are those of the English maps: another language's maps keep their own. The game sizes and places the HUD from its tags as before. `display.high_res_hud = false` turns this off. |
|
||||
| High-res text | The menus' and HUD's text is drawn with Overpass (`port/assets/fonts`, SIL Open Font License) in place of the maps' bitmap fonts, which are Interstate. `src/text_hires.c` rasterizes each glyph with stb_truetype (`port/third_party/stb`) at the resolution the game draws at, into an atlas that a placeholder bitmap of the game stands for. The game lays the text out from its font tags as before. The menus' titles (the screens' headers and the main menu's items) are pictures of text in the maps, so they are drawn as the high-res HUD is: `tools/title_assets.py` sets each one again in OpenCE, Roger White's public-domain Newtown respaced to match the maps' commercial title typeface (`tools/title_font.py`), at 4x the bitmap's size over its own plate or glow, each letter placed where the map's letter is, in `port/assets/titles`. The postgame carnage report's title is set over a hand-made SVG redraw of its panel (`port/assets/titles/svg`) instead. The A, B, X and Y button icons beside the menus' key labels and in their text ("Press A to Join") are drawn from hand-made SVG redraws at 8x the size of the maps' bitmaps (`port/assets/buttons`, made by `tools/button_assets.py`), in the same sizes and places. `display.high_res_text = false` turns it off. |
|
||||
| Anti-aliasing | Off unless `display.anti_aliasing` is set (`src/d3d8_gl.c`, `src/xgpu_post.c`). FXAA (written in the port) and SMAA (`port/third_party/smaa`, MIT licensed, at its HIGH preset, compiled as GLSL) are passes over the 3D view of each window, after the lens flares and before the HUD and the menus (`render/render.c`). Their programs are built when the setting is chosen. Supersampling draws the render targets the size of the screen at two times the resolution in each direction, and the display blit scales them down. Multisampling draws the back buffer and its depth buffer into multisampled renderbuffers, and with them any target that is drawn together with one of them (a mirror's view, in the secondary target with the back buffer's depth buffer), so that the attachments of a framebuffer are all multisampled or none is. A target's pixels are resolved into its texture before something reads the texture (as a texture, or at the display blit). Visibility tests count samples, divided by the samples of a pixel. An alpha-tested surface (foliage, grates) covers the samples of a pixel in proportion to its alpha past the reference (`gl_SampleMask`, not on Android). |
|
||||
| Sound | Xbox DirectSound on SDL3 audio (`src/dsound_sdl.c`): PCM and Xbox ADPCM, mixed at 48 kHz, with volume, pitch, mix bins, distance, stereo pan, occlusion and obstruction. There is no Doppler effect, no cones and no reverb. |
|
||||
|
||||
@@ -6,7 +6,7 @@ uploaded, and each one's GL texture.
|
||||
|
||||
Which bitmap is at an address the game knows (from the loaded map's tags:
|
||||
port/linux/game/hud_hires_tags.c). Each texture is decoded from its PNG when
|
||||
first drawn and kept: up to 69 of the HUD's, about 225 MB with their mip
|
||||
first drawn and kept: up to 71 of the HUD's, about 227 MB with their mip
|
||||
levels, though a game draws only some (the scopes' only when zoomed), and
|
||||
the titles of the menus shown, about 3 MB each (11 MB for the carnage
|
||||
report's, a whole panel), and their button icons, about 0.3 MB each (5.3
|
||||
|
||||
@@ -24,6 +24,16 @@ layout: reads the Xbox map's HUD bitmaps (sizes, formats, sprite rectangles,
|
||||
(numbers only) with copies of the redraws used in port/assets/hud/svg.
|
||||
Needs a map and the restored tags; its output is committed. A bitmap
|
||||
with a cell that no redraw matches is left out.
|
||||
reticles: puts the reticle redraws that match the Xbox's exactly (RETICLES,
|
||||
from the PC HUD sheet's own drawing, at its scale) in the cells of the
|
||||
Xbox sequences they draw, in place of what layout chose: each copied
|
||||
unchanged into port/assets/hud/svg, at the size and place that match the
|
||||
Xbox sprite best. The sniper's zoom labels beside its reticle, which no
|
||||
redraw has, are set in a font (LABELS). Updates layout.json's reticle
|
||||
entries only; run it after layout, which puts back the reticles it chose.
|
||||
|
||||
python tools/hud_assets.py reticles --map assets/maps/bloodgulch.map \\
|
||||
--reticles ../halo-pc-restored/HUD2_left_reticles
|
||||
build: renders port/assets/hud/svg with layout.json into port/assets/hud/*.png
|
||||
(committed; the builds embed them).
|
||||
check: compares each PNG, reduced to the tag's size, with the map's bitmap
|
||||
@@ -112,6 +122,42 @@ KINDS = {0: "a8", 1: "y8", 2: "alpha", 3: "grey", 6: "colour", 8: "colour", 9: "
|
||||
SEARCH = 4
|
||||
MATCH = 0.25
|
||||
|
||||
# the reticle redraws that match the Xbox's exactly (the same design, only
|
||||
# the strokes' weight differs), by the sheet and sequence they draw: cut from
|
||||
# the PC HUD sheet's drawing, each at that drawing's own scale
|
||||
RETICLES = {
|
||||
HUD + "combined\\hud_reticles": {
|
||||
0: "reticle_20.svg", # assault rifle
|
||||
1: "reticle_17.svg", # banshee gun
|
||||
3: "reticle_06.svg", # plasma pistol
|
||||
4: "reticle_07.svg", # plasma rifle
|
||||
5: "reticle_14.svg", # (no weapon's; probably the flamethrower's)
|
||||
6: "reticle_08.svg", # needler
|
||||
7: "reticle_28.svg", # no weapon
|
||||
8: "reticle_19.svg", # pistol
|
||||
9: "reticle_27.svg", # rocket launcher, wraith mortar
|
||||
10: "reticle_23.svg", # shotgun
|
||||
12: "reticle_25.svg", # covenant gun turret
|
||||
13: "reticle_16.svg", # ghost gun
|
||||
14: "reticle_30.svg", # (no weapon's; a small chevron)
|
||||
},
|
||||
HUD + "sniper\\hud_reticles_scope": {
|
||||
0: "reticle_18.svg", # sniper rifle
|
||||
},
|
||||
}
|
||||
# the zoom labels beside the sniper's reticle, by sequence and sprite: no
|
||||
# redraw has the Xbox's (the PC's say 2x and 8x), so they are set in a font
|
||||
# that matches them, with the spacing between their glyphs that fits best
|
||||
LABELS = {
|
||||
HUD + "sniper\\hud_reticles_scope": {(1, 0): "2x", (1, 1): "10x"},
|
||||
}
|
||||
LABEL_FONT = Path("port/assets/fonts/Overpass-900.ttf")
|
||||
LABEL_SPACINGS = (-10, -8, -6, -4, -2, 0, 2, 4)
|
||||
# render texels per Xbox texel while fitting one, and the scales tried
|
||||
# around the one its extent gives
|
||||
FIT_TEXELS = 8
|
||||
FIT_SCALES = np.linspace(0.85, 1.15, 31)
|
||||
|
||||
|
||||
# ---------- Xbox maps
|
||||
|
||||
@@ -456,15 +502,15 @@ def layout(arguments) -> None:
|
||||
kind = "meter"
|
||||
flat = svg.replace("/", "__").replace(" ", "_")
|
||||
sources[flat] = svg
|
||||
match = {"xbox": cell, "svg": flat, "source_scale": scale,
|
||||
"source": corner, "clip": clip, "kind": kind, "score": round(score, 3)}
|
||||
laid = {"xbox": cell, "svg": flat, "source_scale": scale,
|
||||
"source": corner, "clip": clip, "kind": kind, "score": round(score, 3)}
|
||||
if tag == HUD + "combined\\hud_unit_meters":
|
||||
original = xbox[top:bottom, left:right]
|
||||
values = set(np.unique(original[..., 2][original[..., 3] > 0]))
|
||||
health = set(range(30, 241, 30))
|
||||
if health <= values <= health | {0}:
|
||||
match["thresholds"] = sorted(health)
|
||||
matched.append(match)
|
||||
laid["thresholds"] = sorted(health)
|
||||
matched.append(laid)
|
||||
if not matched:
|
||||
if matched is not None:
|
||||
print(f"{name}: left out, empty")
|
||||
@@ -495,6 +541,172 @@ def layout(arguments) -> None:
|
||||
LAYOUT.write_text(json.dumps({"assets": entries}, indent=1) + "\n")
|
||||
|
||||
|
||||
# ---------- the reticles
|
||||
|
||||
|
||||
def soften(image: np.ndarray) -> np.ndarray:
|
||||
"""A shape with its edges softened, so that a thinner stroke on one side
|
||||
still lines up with the other's (the Xbox's are heavier and blurred)."""
|
||||
from scipy import ndimage
|
||||
|
||||
return ndimage.gaussian_filter(image.astype(float), 0.8)
|
||||
|
||||
|
||||
def likeness(a: np.ndarray, b: np.ndarray) -> float:
|
||||
a, b = a - a.mean(), b - b.mean()
|
||||
norm = np.sqrt((a * a).sum() * (b * b).sum())
|
||||
return float((a * b).sum() / norm) if norm else 0.0
|
||||
|
||||
|
||||
def extent(alpha: np.ndarray) -> tuple:
|
||||
"""The box (left, top, right, bottom) of a shape's clearly covered texels."""
|
||||
ys, xs = np.nonzero(alpha >= alpha.max() / 4)
|
||||
return xs.min(), ys.min(), xs.max() + 1, ys.max() + 1
|
||||
|
||||
|
||||
def text_svg(font: Path, text: str, spacing: float = 0) -> str:
|
||||
"""text's outlines in a font, as an SVG (an em of 100 units), for a
|
||||
label that has no redraw: the glyphs as the font draws them, set with
|
||||
its advances and spacing (in hundredths of an em) between them."""
|
||||
from fontTools.pens.svgPathPen import SVGPathPen
|
||||
from fontTools.ttLib import TTFont
|
||||
|
||||
face = TTFont(str(font))
|
||||
glyphs = face.getGlyphSet()
|
||||
cmap = face.getBestCmap()
|
||||
scale = 100 / face["head"].unitsPerEm
|
||||
paths, x = [], 0
|
||||
for index, character in enumerate(text):
|
||||
name = cmap[ord(character)]
|
||||
pen = SVGPathPen(glyphs)
|
||||
glyphs[name].draw(pen)
|
||||
paths.append(f'<path transform="translate({x:g} 0)" d="{pen.getCommands()}"/>')
|
||||
x += face["hmtx"][name][0] + (spacing / scale if index + 1 < len(text) else 0)
|
||||
ascent, descent = face["hhea"].ascent, face["hhea"].descent
|
||||
width, height = x * scale, (ascent - descent) * scale
|
||||
return (f'<svg xmlns="http://www.w3.org/2000/svg" width="{width:.2f}" height="{height:.2f}" '
|
||||
f'viewBox="0 0 {width:.2f} {height:.2f}">\n'
|
||||
f'<!-- "{text}" in {font.name} -->\n'
|
||||
f'<g fill="#ffffff" transform="scale({scale:g} {-scale:g}) translate(0 {-ascent})">\n'
|
||||
+ "\n".join(paths) + "\n</g>\n</svg>\n")
|
||||
|
||||
|
||||
def fit_reticle(svg: Path, alpha: np.ndarray) -> tuple:
|
||||
"""The size and place at which a redraw best matches an Xbox cell's
|
||||
alpha: (likeness, redraw units per Xbox texel, the redraw's point at the
|
||||
cell's corner)."""
|
||||
height, width = alpha.shape
|
||||
target = soften(alpha / 255.0)
|
||||
|
||||
def drawn(zoom):
|
||||
return render_svg(svg, zoom)[..., 3].astype(float) / 255
|
||||
|
||||
base = drawn(FIT_TEXELS)
|
||||
svg_box = [value / FIT_TEXELS for value in extent(base)]
|
||||
xbox_box = extent(alpha)
|
||||
# (the Xbox's extent with its blur's texel taken off each side)
|
||||
units = max((svg_box[2] - svg_box[0]) / max(xbox_box[2] - xbox_box[0] - 1, 1),
|
||||
(svg_box[3] - svg_box[1]) / max(xbox_box[3] - xbox_box[1] - 1, 1))
|
||||
best = (-2.0, units, [0.0, 0.0])
|
||||
for factor in FIT_SCALES:
|
||||
per_texel = units * factor
|
||||
zoom = FIT_TEXELS / per_texel
|
||||
render = drawn(zoom)
|
||||
box = extent(render)
|
||||
# (centred on the Xbox shape's centre, then moved by eighths of a texel)
|
||||
centre = ((box[0] + box[2]) / 2 - (xbox_box[0] + xbox_box[2]) / 2 * FIT_TEXELS,
|
||||
(box[1] + box[3]) / 2 - (xbox_box[1] + xbox_box[3]) / 2 * FIT_TEXELS)
|
||||
for dy in range(-FIT_TEXELS * 3 // 2, FIT_TEXELS * 3 // 2 + 1):
|
||||
for dx in range(-FIT_TEXELS * 3 // 2, FIT_TEXELS * 3 // 2 + 1):
|
||||
at = (round(centre[0]) + dx, round(centre[1]) + dy)
|
||||
reduced = window(render, at[0], at[1], width * FIT_TEXELS, height * FIT_TEXELS).reshape(
|
||||
height, FIT_TEXELS, width, FIT_TEXELS).mean(axis=(1, 3))
|
||||
score = likeness(soften(reduced), target)
|
||||
if score > best[0]:
|
||||
best = (score, per_texel, [at[0] / zoom, at[1] / zoom])
|
||||
return best
|
||||
|
||||
|
||||
def reticles(arguments) -> None:
|
||||
xbox_map = XboxMap(Path(arguments.map))
|
||||
source = Path(arguments.reticles)
|
||||
description = json.loads(LAYOUT.read_text())
|
||||
entries = description["assets"]
|
||||
for tag, redraws in RETICLES.items():
|
||||
group = xbox_map.bitmap_group(tag)
|
||||
labels = LABELS.get(tag, {})
|
||||
for index, bitmap in enumerate(group["bitmaps"]):
|
||||
width, height = bitmap["width"], bitmap["height"]
|
||||
xbox = decode_bitmap(bitmap)
|
||||
# (named as layout names them)
|
||||
name = tag[len(HUD):].replace("combined\\", "").replace("\\", "__").replace(" ", "_") + f"__{index}"
|
||||
old = next((entry for entry in entries if entry["name"] == name), None)
|
||||
cells = {}
|
||||
for sequence_index, sequence in enumerate(group["sequences"]):
|
||||
for sprite_index, sprite in enumerate(sequence):
|
||||
if sprite[0] == index:
|
||||
cells.setdefault(tuple(pixel_rectangle(sprite, width, height)), set()).add(
|
||||
(sequence_index, sprite_index))
|
||||
laid = []
|
||||
for cell, numbers in sorted(cells.items()):
|
||||
left, top, right, bottom = cell
|
||||
alpha = xbox[top:bottom, left:right, 3].astype(float)
|
||||
exact = sorted(redraws[sequence] for sequence, _ in numbers if sequence in redraws)
|
||||
text = next((labels[number] for number in sorted(numbers) if number in labels), None)
|
||||
if exact:
|
||||
svg = "hud2_left_reticles__" + exact[0]
|
||||
shutil.copyfile(source / exact[0], ASSETS / "svg" / svg)
|
||||
score, per_texel, corner = fit_reticle(ASSETS / "svg" / svg, alpha)
|
||||
what = exact[0]
|
||||
elif text:
|
||||
best = None
|
||||
for spacing in LABEL_SPACINGS:
|
||||
candidate = ASSETS / "svg" / f"label__{LABEL_FONT.stem}__{text}.svg"
|
||||
candidate.write_text(text_svg(LABEL_FONT, text, spacing))
|
||||
fit = fit_reticle(candidate, alpha)
|
||||
if best is None or fit[0] > best[0][0]:
|
||||
best = (fit, spacing)
|
||||
(score, per_texel, corner), spacing = best
|
||||
svg = f"label__{LABEL_FONT.stem}__{text}.svg"
|
||||
(ASSETS / "svg" / svg).write_text(text_svg(LABEL_FONT, text, spacing))
|
||||
what = f'"{text}" in {LABEL_FONT.name}, spacing {spacing}'
|
||||
else:
|
||||
kept = next((c for c in (old or {"cells": []})["cells"] if c["xbox"] == list(cell)), None)
|
||||
if kept is None and alpha.any():
|
||||
print(f"{name}: left as it was, cell {list(cell)} has no redraw")
|
||||
laid = None
|
||||
break
|
||||
if kept is not None:
|
||||
laid.append(kept)
|
||||
continue
|
||||
size = render_svg(ASSETS / "svg" / svg)[..., 3].shape
|
||||
laid.append({"xbox": list(cell), "svg": svg, "source_scale": round(per_texel, 5),
|
||||
"source": [round(corner[0], 4), round(corner[1], 4)],
|
||||
"clip": [0, 0, size[1], size[0]], "kind": "alpha", "score": round(score, 3)})
|
||||
print(f"{name} {list(cell)} (sequence, sprite {sorted(numbers)}): {what} at "
|
||||
f"{per_texel:.4f} units a texel, likeness {score:.3f}")
|
||||
if not laid or all(not c["svg"].startswith(("hud2_left_reticles__", "label__")) for c in laid):
|
||||
continue
|
||||
entry = {"name": name, "tag": tag, "bitmap": index, "width": width, "height": height,
|
||||
"format": FORMATS[bitmap["format"]], "scale": SCALE,
|
||||
"crc": zlib.crc32(bitmap["pixels"][:level0_size(bitmap)]), "cells": laid}
|
||||
if old is not None:
|
||||
entries[entries.index(old)] = entry
|
||||
else:
|
||||
# (after the sheet's other bitmaps, or its folder's)
|
||||
folder = tag.rsplit("\\", 1)[0]
|
||||
position = max((i for i, e in enumerate(entries) if e["tag"] == tag), default=None)
|
||||
if position is None:
|
||||
position = max(i for i, e in enumerate(entries) if e["tag"].startswith(folder))
|
||||
entries.insert(position + 1, entry)
|
||||
used = {cell["svg"] for entry in entries for cell in entry["cells"]}
|
||||
for svg in (ASSETS / "svg").glob("*.svg"):
|
||||
if svg.name not in used:
|
||||
svg.unlink()
|
||||
print(f"{svg.name}: no longer used")
|
||||
LAYOUT.write_text(json.dumps(description, indent=1) + "\n")
|
||||
|
||||
|
||||
# ---------- building
|
||||
|
||||
|
||||
@@ -605,16 +817,19 @@ def build_asset(entry: dict, renders: dict) -> np.ndarray:
|
||||
scale = entry["scale"]
|
||||
image = np.zeros((entry["height"] * scale, entry["width"] * scale, 4), np.uint8)
|
||||
for cell in entry["cells"]:
|
||||
# (the redraw drawn at the texture's scale, its coordinates with it)
|
||||
zoom = scale // cell["source_scale"]
|
||||
assert zoom * cell["source_scale"] == scale, entry["name"]
|
||||
# (the redraw drawn at the texture's scale, its coordinates with it:
|
||||
# a whole multiple of the redraw's for the PC sheets', any for the
|
||||
# reticles')
|
||||
zoom = scale / cell["source_scale"]
|
||||
if zoom == int(zoom):
|
||||
zoom = int(zoom)
|
||||
key = (cell["svg"], zoom)
|
||||
if key not in renders:
|
||||
renders[key] = render_svg(ASSETS / "svg" / cell["svg"], zoom)
|
||||
left, top, right, bottom = cell["xbox"]
|
||||
width, height = (right - left) * scale, (bottom - top) * scale
|
||||
texels = window(clipped(renders[key], [value * zoom for value in cell["clip"]]),
|
||||
cell["source"][0] * zoom, cell["source"][1] * zoom, width, height)
|
||||
texels = window(clipped(renders[key], [round(value * zoom) for value in cell["clip"]]),
|
||||
round(cell["source"][0] * zoom), round(cell["source"][1] * zoom), width, height)
|
||||
image[top * scale:top * scale + height, left * scale:left * scale + width] = recipe(texels, cell["kind"])
|
||||
if any(cell["kind"] in ("meter", "dxt") for cell in entry["cells"]):
|
||||
image = bleed(image)
|
||||
@@ -682,13 +897,17 @@ def main() -> None:
|
||||
command.add_argument("--map", required=True)
|
||||
command.add_argument("--hek", required=True)
|
||||
command.add_argument("--svg", required=True)
|
||||
command = commands.add_parser("reticles")
|
||||
command.add_argument("--map", required=True)
|
||||
command.add_argument("--reticles", required=True)
|
||||
commands.add_parser("build")
|
||||
commands.add_parser("thresholds")
|
||||
command = commands.add_parser("check")
|
||||
command.add_argument("--map", required=True)
|
||||
command.add_argument("--out", required=True)
|
||||
arguments = parser.parse_args()
|
||||
{"layout": layout, "build": build, "thresholds": thresholds, "check": check}[arguments.command](arguments)
|
||||
{"layout": layout, "reticles": reticles, "build": build, "thresholds": thresholds,
|
||||
"check": check}[arguments.command](arguments)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
|
||||