From e1e07e57b036da95a97da900de8a83c19089ab17 Mon Sep 17 00:00:00 2001 From: "Hermes (scopedvr-dev)" Date: Mon, 19 Oct 2026 18:25:15 +0000 Subject: [PATCH] =?UTF-8?q?D6=20(t=5F31e800f2):=20Editor-Sync=20=E2=80=94?= =?UTF-8?q?=2030=20Fahrzeug-Thumbs=20+=20Map-Builder-Nachweis?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - library/objects.json = 347 Objekte (Merge-Stand Match-Server) - library/thumbs/: 30 neue Thumbs (tank/apc/air_defense/antenna), in Kategorie-Farbe Oliv (D0-Muster) — uebrige 317 Thumbs byte-identisch - tests/probe_d6_mapbuilder.gd: 3 Fahrzeuge ueber den ECHTEN Map Builder platziert (Panzer + Turm exakt auf dem Turm-Ring 1,5929 m + Transportpanzer, dazu die Kanone auf 2,1273 m), Kollisionsboxen als Drahtgitter, PNG 1600x1000 — PROBE_D6_MAPBUILDER_OK --- library/objects.json | 420 ++++++++++++++++++++ library/thumbs/air_defense_001.png | Bin 0 -> 2432 bytes library/thumbs/air_defense_002.png | Bin 0 -> 2936 bytes library/thumbs/air_defense_platform_001.png | Bin 0 -> 1804 bytes library/thumbs/air_defense_platform_002.png | Bin 0 -> 1786 bytes library/thumbs/antenna_001.png | Bin 0 -> 1230 bytes library/thumbs/apc_001.png | Bin 0 -> 2648 bytes library/thumbs/apc_002.png | Bin 0 -> 2516 bytes library/thumbs/apc_cap.png | Bin 0 -> 1435 bytes library/thumbs/apc_cap_1.png | Bin 0 -> 1469 bytes library/thumbs/apc_weapon.png | Bin 0 -> 1732 bytes library/thumbs/tank_001.png | Bin 0 -> 2414 bytes library/thumbs/tank_002.png | Bin 0 -> 2274 bytes library/thumbs/tank_003.png | Bin 0 -> 2261 bytes library/thumbs/tank_004.png | Bin 0 -> 2253 bytes library/thumbs/tank_005.png | Bin 0 -> 2252 bytes library/thumbs/tank_006.png | Bin 0 -> 2388 bytes library/thumbs/tank_car_001.png | Bin 0 -> 2596 bytes library/thumbs/tank_car_002.png | Bin 0 -> 2586 bytes library/thumbs/tank_gun_001.png | Bin 0 -> 1353 bytes library/thumbs/tank_gun_002.png | Bin 0 -> 1364 bytes library/thumbs/tank_gun_003.png | Bin 0 -> 1417 bytes library/thumbs/tank_gun_004.png | Bin 0 -> 1414 bytes library/thumbs/tank_gun_005.png | Bin 0 -> 1566 bytes library/thumbs/tank_gun_006.png | Bin 0 -> 1535 bytes library/thumbs/tank_tower_001.png | Bin 0 -> 2023 bytes library/thumbs/tank_tower_002.png | Bin 0 -> 2019 bytes library/thumbs/tank_tower_003.png | Bin 0 -> 2020 bytes library/thumbs/tank_tower_004.png | Bin 0 -> 2022 bytes library/thumbs/tank_tower_005.png | Bin 0 -> 2232 bytes library/thumbs/tank_tower_006.png | Bin 0 -> 2307 bytes tests/probe_d6_mapbuilder.gd | 170 ++++++++ tests/probe_d6_mapbuilder.gd.uid | 1 + 33 files changed, 591 insertions(+) create mode 100644 library/thumbs/air_defense_001.png create mode 100644 library/thumbs/air_defense_002.png create mode 100644 library/thumbs/air_defense_platform_001.png create mode 100644 library/thumbs/air_defense_platform_002.png create mode 100644 library/thumbs/antenna_001.png create mode 100644 library/thumbs/apc_001.png create mode 100644 library/thumbs/apc_002.png create mode 100644 library/thumbs/apc_cap.png create mode 100644 library/thumbs/apc_cap_1.png create mode 100644 library/thumbs/apc_weapon.png create mode 100644 library/thumbs/tank_001.png create mode 100644 library/thumbs/tank_002.png create mode 100644 library/thumbs/tank_003.png create mode 100644 library/thumbs/tank_004.png create mode 100644 library/thumbs/tank_005.png create mode 100644 library/thumbs/tank_006.png create mode 100644 library/thumbs/tank_car_001.png create mode 100644 library/thumbs/tank_car_002.png create mode 100644 library/thumbs/tank_gun_001.png create mode 100644 library/thumbs/tank_gun_002.png create mode 100644 library/thumbs/tank_gun_003.png create mode 100644 library/thumbs/tank_gun_004.png create mode 100644 library/thumbs/tank_gun_005.png create mode 100644 library/thumbs/tank_gun_006.png create mode 100644 library/thumbs/tank_tower_001.png create mode 100644 library/thumbs/tank_tower_002.png create mode 100644 library/thumbs/tank_tower_003.png create mode 100644 library/thumbs/tank_tower_004.png create mode 100644 library/thumbs/tank_tower_005.png create mode 100644 library/thumbs/tank_tower_006.png create mode 100644 tests/probe_d6_mapbuilder.gd create mode 100644 tests/probe_d6_mapbuilder.gd.uid diff --git a/library/objects.json b/library/objects.json index 76ef21c..053ea6c 100644 --- a/library/objects.json +++ b/library/objects.json @@ -2,6 +2,146 @@ "library_version": 1, "note": "Editor-Kopie der offiziellen Bibliotheks-Registry (geschlossener Baukasten, PLAN Entscheidung 20). Quelle: scopedvr-match-server library/objects.json — beim Registrieren neuer Objekte DORT zuerst eintragen und hier synchron ziehen. 'poly' = Referenz-Dreieckszahl (Budget-Rechnung, map_format.md §4 V8); 'collision' = Approximation für Platzhalter-Darstellung im Viewport.", "objects": { + "air_defense_001": { + "poly": 520, + "collision": { + "shape": "box", + "size": [ + 2.653, + 3.257, + 7.567 + ] + }, + "glb": "res://assets/objekte/military_desert/vehicles/air_defense_001.glb", + "kategorie": "vehicles", + "name_de": "Flugabwehr 001" + }, + "air_defense_002": { + "poly": 520, + "collision": { + "shape": "box", + "size": [ + 2.653, + 3.257, + 7.567 + ] + }, + "glb": "res://assets/objekte/military_desert/vehicles/air_defense_002.glb", + "kategorie": "vehicles", + "name_de": "Flugabwehr 002" + }, + "air_defense_platform_001": { + "poly": 964, + "collision": { + "shape": "box", + "size": [ + 3.544, + 3.947, + 12.05 + ] + }, + "glb": "res://assets/objekte/military_desert/vehicles/air_defense_platform_001.glb", + "kategorie": "vehicles", + "name_de": "Flak-Lafette 001" + }, + "air_defense_platform_002": { + "poly": 964, + "collision": { + "shape": "box", + "size": [ + 3.544, + 3.947, + 12.05 + ] + }, + "glb": "res://assets/objekte/military_desert/vehicles/air_defense_platform_002.glb", + "kategorie": "vehicles", + "name_de": "Flak-Lafette 002" + }, + "antenna_001": { + "poly": 134, + "collision": { + "shape": "box", + "size": [ + 1.591, + 4.491, + 1.203 + ] + }, + "glb": "res://assets/objekte/military_desert/vehicles/antenna_001.glb", + "kategorie": "vehicles", + "name_de": "Funkantenne 001" + }, + "apc_001": { + "poly": 2460, + "collision": { + "shape": "box", + "size": [ + 3.732, + 3.936, + 6.939 + ] + }, + "glb": "res://assets/objekte/military_desert/vehicles/apc_001.glb", + "kategorie": "vehicles", + "name_de": "Transportpanzer 001" + }, + "apc_002": { + "poly": 1878, + "collision": { + "shape": "box", + "size": [ + 3.732, + 3.936, + 6.939 + ] + }, + "glb": "res://assets/objekte/military_desert/vehicles/apc_002.glb", + "kategorie": "vehicles", + "name_de": "Transportpanzer 002" + }, + "apc_cap": { + "poly": 84, + "collision": { + "shape": "box", + "size": [ + 0.799, + 0.25, + 0.799 + ] + }, + "glb": "res://assets/objekte/military_desert/vehicles/apc_cap.glb", + "kategorie": "vehicles", + "name_de": "TPz-Luke" + }, + "apc_cap_1": { + "poly": 84, + "collision": { + "shape": "box", + "size": [ + 0.799, + 0.25, + 0.799 + ] + }, + "glb": "res://assets/objekte/military_desert/vehicles/apc_cap_1.glb", + "kategorie": "vehicles", + "name_de": "TPz-Luke 1" + }, + "apc_weapon": { + "poly": 482, + "collision": { + "shape": "box", + "size": [ + 0.82, + 1.163, + 1.576 + ] + }, + "glb": "res://assets/objekte/military_desert/vehicles/apc_weapon.glb", + "kategorie": "vehicles", + "name_de": "TPz-MG" + }, "barracks_001": { "poly": 1139, "collision": { @@ -3272,6 +3412,286 @@ "shape": "none" } }, + "tank_001": { + "poly": 3734, + "collision": { + "shape": "box", + "size": [ + 4.964, + 2.27, + 8.842 + ] + }, + "glb": "res://assets/objekte/military_desert/vehicles/tank_001.glb", + "kategorie": "vehicles", + "name_de": "Panzer 001" + }, + "tank_002": { + "poly": 3734, + "collision": { + "shape": "box", + "size": [ + 4.964, + 2.27, + 8.842 + ] + }, + "glb": "res://assets/objekte/military_desert/vehicles/tank_002.glb", + "kategorie": "vehicles", + "name_de": "Panzer 002" + }, + "tank_003": { + "poly": 3734, + "collision": { + "shape": "box", + "size": [ + 4.964, + 2.27, + 8.842 + ] + }, + "glb": "res://assets/objekte/military_desert/vehicles/tank_003.glb", + "kategorie": "vehicles", + "name_de": "Panzer 003" + }, + "tank_004": { + "poly": 3734, + "collision": { + "shape": "box", + "size": [ + 4.964, + 2.27, + 8.842 + ] + }, + "glb": "res://assets/objekte/military_desert/vehicles/tank_004.glb", + "kategorie": "vehicles", + "name_de": "Panzer 004" + }, + "tank_005": { + "poly": 3564, + "collision": { + "shape": "box", + "size": [ + 4.518, + 2.309, + 9.973 + ] + }, + "glb": "res://assets/objekte/military_desert/vehicles/tank_005.glb", + "kategorie": "vehicles", + "name_de": "Panzer 005" + }, + "tank_006": { + "poly": 3560, + "collision": { + "shape": "box", + "size": [ + 4.518, + 2.309, + 9.973 + ] + }, + "glb": "res://assets/objekte/military_desert/vehicles/tank_006.glb", + "kategorie": "vehicles", + "name_de": "Panzer 006" + }, + "tank_car_001": { + "poly": 778, + "collision": { + "shape": "box", + "size": [ + 2.766, + 2.45, + 6.548 + ] + }, + "glb": "res://assets/objekte/military_desert/vehicles/tank_car_001.glb", + "kategorie": "vehicles", + "name_de": "Radpanzer 001" + }, + "tank_car_002": { + "poly": 778, + "collision": { + "shape": "box", + "size": [ + 2.766, + 2.45, + 6.548 + ] + }, + "glb": "res://assets/objekte/military_desert/vehicles/tank_car_002.glb", + "kategorie": "vehicles", + "name_de": "Radpanzer 002" + }, + "tank_gun_001": { + "poly": 106, + "collision": { + "shape": "box", + "size": [ + 0.761, + 0.761, + 4.338 + ] + }, + "glb": "res://assets/objekte/military_desert/vehicles/tank_gun_001.glb", + "kategorie": "vehicles", + "name_de": "Panzerkanone 001" + }, + "tank_gun_002": { + "poly": 106, + "collision": { + "shape": "box", + "size": [ + 0.761, + 0.761, + 4.338 + ] + }, + "glb": "res://assets/objekte/military_desert/vehicles/tank_gun_002.glb", + "kategorie": "vehicles", + "name_de": "Panzerkanone 002" + }, + "tank_gun_003": { + "poly": 106, + "collision": { + "shape": "box", + "size": [ + 0.761, + 0.761, + 4.338 + ] + }, + "glb": "res://assets/objekte/military_desert/vehicles/tank_gun_003.glb", + "kategorie": "vehicles", + "name_de": "Panzerkanone 003" + }, + "tank_gun_004": { + "poly": 106, + "collision": { + "shape": "box", + "size": [ + 0.761, + 0.761, + 4.338 + ] + }, + "glb": "res://assets/objekte/military_desert/vehicles/tank_gun_004.glb", + "kategorie": "vehicles", + "name_de": "Panzerkanone 004" + }, + "tank_gun_005": { + "poly": 217, + "collision": { + "shape": "box", + "size": [ + 0.764, + 1.005, + 4.851 + ] + }, + "glb": "res://assets/objekte/military_desert/vehicles/tank_gun_005.glb", + "kategorie": "vehicles", + "name_de": "Panzerkanone 005" + }, + "tank_gun_006": { + "poly": 217, + "collision": { + "shape": "box", + "size": [ + 0.764, + 1.005, + 4.851 + ] + }, + "glb": "res://assets/objekte/military_desert/vehicles/tank_gun_006.glb", + "kategorie": "vehicles", + "name_de": "Panzerkanone 006" + }, + "tank_tower_001": { + "poly": 1456, + "collision": { + "shape": "box", + "size": [ + 4.411, + 4.173, + 4.502 + ] + }, + "glb": "res://assets/objekte/military_desert/vehicles/tank_tower_001.glb", + "kategorie": "vehicles", + "name_de": "Panzer-Turm 001" + }, + "tank_tower_002": { + "poly": 1456, + "collision": { + "shape": "box", + "size": [ + 4.411, + 4.173, + 4.502 + ] + }, + "glb": "res://assets/objekte/military_desert/vehicles/tank_tower_002.glb", + "kategorie": "vehicles", + "name_de": "Panzer-Turm 002" + }, + "tank_tower_003": { + "poly": 1456, + "collision": { + "shape": "box", + "size": [ + 4.411, + 4.173, + 4.502 + ] + }, + "glb": "res://assets/objekte/military_desert/vehicles/tank_tower_003.glb", + "kategorie": "vehicles", + "name_de": "Panzer-Turm 003" + }, + "tank_tower_004": { + "poly": 1456, + "collision": { + "shape": "box", + "size": [ + 4.411, + 4.173, + 4.502 + ] + }, + "glb": "res://assets/objekte/military_desert/vehicles/tank_tower_004.glb", + "kategorie": "vehicles", + "name_de": "Panzer-Turm 004" + }, + "tank_tower_005": { + "poly": 861, + "collision": { + "shape": "box", + "size": [ + 4.08, + 3.147, + 5.624 + ] + }, + "glb": "res://assets/objekte/military_desert/vehicles/tank_tower_005.glb", + "kategorie": "vehicles", + "name_de": "Panzer-Turm 005" + }, + "tank_tower_006": { + "poly": 861, + "collision": { + "shape": "box", + "size": [ + 4.08, + 3.147, + 5.624 + ] + }, + "glb": "res://assets/objekte/military_desert/vehicles/tank_tower_006.glb", + "kategorie": "vehicles", + "name_de": "Panzer-Turm 006" + }, "tent_001": { "poly": 1322, "collision": { diff --git a/library/thumbs/air_defense_001.png b/library/thumbs/air_defense_001.png new file mode 100644 index 0000000000000000000000000000000000000000..eccd12cb6e72a89f4f3500a64e98f92789ace572 GIT binary patch literal 2432 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 literal 0 HcmV?d00001 diff --git a/library/thumbs/air_defense_platform_001.png b/library/thumbs/air_defense_platform_001.png new file mode 100644 index 0000000000000000000000000000000000000000..d5417bc5e02ac71eda9bfbd5cbc0211c3aa2531a GIT binary patch literal 1804 zcmd5-{X5eM0RN6{vPMD*0mfiAp zn%C|W&%9++^1e{njA~0_8}@>=o%=8P;q&r5pI<-E=Ti`Z!)n2dU;qGU1qS$jzpIr0 zu?M=#Pf*b#y8=r49_tM>k0F);06G-t`%P$i)oS$!G4wQI7=6~`-!kv;?T4$E>uM|r zC+8n|8w_EAx8L6PbovG}IXIZVUeaZc!mtLJdtILU6cq&B7zE=VP4;5mWc(xjy4q^a zJvL{URh=o|F0a1OKb|%slm$|DTxC?pEVQ61bKI#>GWRyvNWX3VtPpx!;s?7D&$s@;ctgJ`-*Rolaa({zDE&B7ci z*Veigy&c#7FlNieS~L0GAoVwi2lG)?f!GQ#FNKD^L5eVM)d_O(smb+UOAtY6YcJma zM#|4g?t$R#o!xxM#CoCVj?3lXSM5c|5E%=4+YY#6{y|=^z<*>kvSc9fA!hRHd;gG3#J8c=2@Fl z8x178oND8f7*D}x0rp4r-d63)Xp!l9gA$)_kTX@V0S)=myK|8o6+D07LX-)YSI+wh z<4`I#2|nfkAJRBvBbA4yCP9QcQ?*eevVE<8iOAZ-#;`oc;5SxwD$9ze@&WQClBxa= z&*0^@ku*BJXtx_8u9$OrMO$yt7~~nT-~wZdS_SVpF;9Rh6iJ)H=ljF*jR7ZTXDCif zyYaqWdSi2s($rS9Z5)j5hU6{sM=M#8M7wR*k%1?f|IV;`T6MZ+F_h05_v{FU@Y?Hr zVNW^*G3e$Rual@VI|6M+v>7g4elToTC{}HKuT{?)Y6{w3(jAHPiudbI?1Zd@*xB zJHYCqp4{PJkxbp*v4Rm>I!VZjz2R%VRytijHp{Ik(Sw1icxjK_+}&TVa?eO@LbNR9 z6^%9#Ue(gm2Q0Q(EMq5U2xDU>;im7JV2ah`x&A>1=)QtxZFM9FMyQwAtA;h~H_Vmz zl6y?PX~M!B6hlCcD-^v!Yi;u-D6cZo+5MxxC~uYHiuH;lj*it3b*=Z~07!!G>x=rT zf<5SU0L6|5r+*$bc|c6E(wd0f{)dVV?xW)K&WB!V_n?x$2HMHU+x+g zS7+JLlZF#b;(J>Xo&RF-dKI6zhEgUw7VNso*G4ABH-_2Xt4za+x3(Y`#M$kR8SdT4 zuGlPHe7~1za-Llg&_SWm4yS`}aOqw>Rb8h**R_dpJ}cXQzfXPaWeuPm4#&sG zbkk-1+OH3_dNMtYR>D(NS!;KR3;TIHnV#v_yPDP6)*uYwN^$Yn6*Ai6c1-l*d5_R> z%Yb@|`IfxhlBEcQVbAWX4D?Xfq7HwUSX@1%&Pa;fUnmex`J-I0Sb_iV1@OuC5N3b* z#=6KLY^H_IV3sAM&HgO-WHpp+zQteJ+qsi6gCHFQ5Sk}P={Y{`&Y(~wNT=3;rUUSJ zi>o1Yu#uwrh?5$C$ci!UYuAkzk*Oh?K>x03!hQfJyNZU8&F6PCCU|FWPrz#CO$N3| ht*NsiU&L6CsjQN$iZANA(Rc3+2=v4GHhV|q{s;YjK;!@b literal 0 HcmV?d00001 diff --git a/library/thumbs/air_defense_platform_002.png b/library/thumbs/air_defense_platform_002.png new file mode 100644 index 0000000000000000000000000000000000000000..fda1bdb8e581f97cc9bf38165adb73a1629908f2 GIT binary patch literal 1786 zcmd5-`#;lr9R7SaG^<$@a>=FF7OiqgjUyy;Il8dp3|*MZHXT9ckkC=S-jW$5cg5dPSTS z>vO5~CIvf|Uu$d|1nYCOCHHCD(=%msEEe~ zzePX=k6~N$H7#^DyPFy?oc4j_Q{dhINMLLEW!Yc)ll7SFNC^#x#@*`z1f9)}N$V`Q zQ)=d@;=PMLM~sT~!Zf0I)O*Q_=t=d5FYrWJr#S4Wh3qLW?5iw75tKiA^{Z2WZNK5G zlddC*95>zez9YFS7o=_!D`s-?(gar#7i$Cw{e{5EF;FupIWMXKB`y9GV>>$|Rlk@z_=SGsbh z&68jafsK_uz#w+@)PT;KvvC*({^u@M(V)9g3;KXVeIZ-!W$x_E<CKr3~%tA%SYT##7#S7XJ38#Z(@730I>%SWfS| zZ@g;H;TV@czm*oW{SjaD$VP@%7vna-q-1GNzGb9^vB124n*RuX5j314lf4g6S2D9t z)1&_CyC<=R4M??MlbMXds~4ViXThU2+0X4|L+$Of42j)_1r*Cm9TNdP;(Geqw2=PS z`CPnq6Eeyn7cz zH15B9Fa$=@PhZ5SC^B?g7}}D_?|-&D}Duq+VY@STfAkvm&5SfnP&2A|xg@ALj0XXZbW(AttPT;mnbZ z3`Ez2c0-7}`(}Az|6JBn!Z9+L>SNh$WzWonX?V+uZG6-Ha$6e!%v>{zRNSo~oQl78 zp)n*~XMf7hc4mx2#_TPR`x=d&#(5I`sk<)$`vufA`U*T&D?C55+cA{)gddE4+){~{Q@_6%vf+}87XNA_ISAfO$`njBfF}D zGKKxdE{!1n`l65Bo9=fx6&g6RBV>9srO%Vq z=`Rn3iNg=+Hh}G{-SVs6VCnF5aSW-L z^Y(6hMsT{!v5)GRw-#OOHZ0p{-Cpl7Q8St2Fn6}hna;3PcbB|d^KSi?H9_rsEsaKZ z)`f(KI6D4uj(ommT3;MT*37wn6S&?=7{y-AQM#Klw|up!@2>9NTP7=OpFVkFTRZ=G z@zi;9gzIwm+j`#LwtV7FeSN963thM59Nq*mJP~2AWOeXkoDfU}X4}2m{F!eBnHDne z@bdEBlv5PoIuP)x@YFYs#sG#kHg@^jV4(|(8y#;evp6wIyn0`sQQhL8!QlL|;fk2SUGi)G9z2xL$@?tb^L z!Oq|FdWCx3{>a7)UF|+_Qs>oY?HlhuCO&&t{cZo(IM!$9<~P5!zJI>@zx7sc^_m`! zBljg$&LnMP*J!&pyWEgx!Lij03}S+=CP-4tv?psbbIf~HM!ZV;t$`Pw%V~bt9LV_NnT|4-|BNua?byH(w|%+z}p-8 z;{AW=r%zK^=j!Xs`K$Nf+xnA*@2jVU?!B~0V%BWEhu6+pv(C_}nZuLtdRuA6|98K3 zeE(kZUD7q+en4m6=jn_L*LS~5EWNs@>8ym9A6vn{nCC6OXRLWMb?WrAx6}7jpT8cH z_#}p5e%-e)$7#8*?INdsmRhuYH-Bg9=NkL685ZIP?!_+W{$#Q7(x3JH)_V60qHO2r z%;A0z`84{`%KIUm&A+3L+dg|fzm79+fzo1rhRU#?Mla6<^B2BUZ{|wqX*(NgQM2Oi zHwo9p496sPSG}-eH8}Nb?bQrR(~n*Yy+saa{4U#mLvG;{&G!iomSp3@0?9On3Q)!}Z@YTkIIhzA*aC7Hi+Gm{`q|y@L72jyzVq^0>nR zr_OpGoV|cAA*+T7u2({ zby-hvoxV&gJl*=@%;MD9v1C_EkYxHk6x6Xq61mG?W! z=gQl!VEVBlkM&m6`kQjfAuE_VjxWC@r&#huX@bmENrxhs_mF%_Rpxhn_Nsd?#LPdx Q2NqBap00i_>zopr0OfTgUjP6A literal 0 HcmV?d00001 diff --git a/library/thumbs/apc_001.png b/library/thumbs/apc_001.png new file mode 100644 index 0000000000000000000000000000000000000000..eeb2dce503076ee7cc44748561e53925dc065314 GIT binary patch literal 2648 zcmc&$`8(8&7XQv*?3XCAmqKQ&p(u$glYL*ZlU{q4v6Hc+8Y13ahO8MXLc)-3nB*P8 zAj@kvQMMs7G|W)r&i(QJ1NZ)L&iUay&pDs-c|PYn2W4Xg=jRdU0RVvC^tO>5E2jL% zxF9Uwr{^=o3Lu0X{1(tal-vXW9wAdB1BbYhol>_D$tkgv9%{m>$Gh%kvUy3C<#YrW zx27oA(%gXyZC4}opq8Ecp}7pycKr1f{fal00y~CPvQ(QIp)*2fpwN~vG}O`!TkZJL zQ886NO&z5=IOpjV>;GVuy#3QBhLC8v9W_Y&R$}cMsH<@uL1Zp7MvF8wnwk)Y$!w@b zO|1^#&%b3k1SJ(yNVh@kaGrD8b^tyP%$0LmKfDS^yYT-_O%{bMAuGm>U4-pYu3;d* zvQ<95$OTUpML`!gWb3$%nFPW2d1C*KbWfMI{nbSD<$10LXDEJp8)nR~ws}k0ytD7fo4MrLavz0<^fMLM^~*E2rT35JuK_! zSyPYQ?WRKi>cVMW?Eq*i_{Y0dQ|sSFZ{DtuPcxUHdOg);lHy+1dhbpc38`*>mb z2+Bf`T|7Op9mAGu>JQLYQ9TiqviXhKne4nF&>s?EM9v$<>h~^f@6zG}2hG_8v-&{+ zp)^utdw9Eh0iUWQGM&MgnW_z1439nxNyd$5yy5ITeCX2ilGm&FSq5EpJU-jo=3YQ} zp?;&38YSVzu+``(uG&kPX_c4c2mz5=5qA~Q zqL70A47nAmv8$^qeJ@oa(C&21&dz$DeP1@?R0BW|0GB5nsGX(Ej;WQF8a&dIdbQhO z2}H$km?|ky--ezAAQn&IGcECbFNn5h&n9$Bv&zaVyasVW99xo{F6B-|2Q$#BCydXq znEY@*QOY-s$Lf6PQP=n%;T8NxeZECr6gGv?feY)Z;bdlUM7w*{gqXa%d=LbgtYQZD z?>$P4(zXZ)mhpy2dq;hf4eAZ!@SIqIp#>oqpDO|hSE7V*YE+%cE+$LgDMgz)M1KC} zlhz0BJ>4?OA_}F%+=*xyHZ~@F%lHcD1UB_Ig)h~! z@P143J?G~-5(h{fmd=p_ht`&>@OK@I4}*?J??{#(JFhV z#Gi<*k@$y)u)aYk8yJOy2MnBvOOs}t)S;y8IE#pc+?c^zCe5xBPQD~Esl<$gu(4?^E5&*aUEHxsF` zC3?{!mTsgm!`Qm_j}Gt!Vx;TKzah+~ni((xVT)K=0#0Y3!r9d*SVl^|2oDU;X`fOv z@HD#ooS*}WAUd#_zt27O#6)W;asd0=wb26-M}ObRozZ$(}?%8u~(k=?c}^=g;e`kV3UiYa!FiiP+cq( z*cckugFMIIw z0HU)$?jjWwBoLw_TxeE3i`cgWEUZVGlGAmB1iT9U;uY}+rTM?(v9IHK@z&K}SR531 zB*rvs{gOdy1`w~UDONE#rMuF-PPTS~-##6A?;&b4%mPAA?5NwEUm{;=YH4wQUoK8@ zPHNpfTk+aoSf=cnp;9e1WAVCEG?7a28)3W(R;GJT@BwPlIb&0c1}bPn$9cxj=lk1T z5y!Q-w?}MU`_|1nG6BtK7YV!msy(8%i~iiXmuFj&4F5w&eE3qLM=SeB}BP zaKzbgH!z}RB~in^InGtL>u^_KY(@S495&r=Wp9+7MQc7OD}9GOj+Xy>C**%`LGmU9&3m(MtsOPePHFU-A{){TdDONm%K9@?S@Al ztYMbXyh*7U^vbCfgJB#_q;(toS-taNzNTJsgzpso8L`-!A(D$%?LP(9uV#OH{sq!G z%-iirciZ;LkwopXppY1W3#d--YoBGjI5u9t>qG(VGm~Wpe@-eL@@kKDp3V^hNK?+t zgu$J0XxIjh@poqzePS6*ISM|ZyMO-fAjz5+UC}k=YzXNQg1d7}t_)ye$7iQ}IGD}W z@Vd}l+-iw)iv$Y8aVdO0wSKyZ@7LT1dG=g)og7KF+gp$S$L|l5lV;JX*m|m>oAoLJ Nrp8uA4Y$10{tfgP{4)Rm literal 0 HcmV?d00001 diff --git a/library/thumbs/apc_002.png b/library/thumbs/apc_002.png new file mode 100644 index 0000000000000000000000000000000000000000..2f4213b85a5939431e6426fda7423f7d5b799ba0 GIT binary patch literal 2516 zcmc(h+dtEfAICq#oaeMj4qt~5D^%-1!sv_0A<;tL9EwtMScc@dR3wM3VmS@zAcq{9 zLnC4iOXU=jSvH1jk{M=B`T1V{{(;}`;`M%Byk3v@<9+eIc%`^FpMprLNCE%=vA45! z-68g0iHq*cc8g1&cL2h;o;nFs_NuV~KqAB5+Ui_X{yfn$NR_ILMLv9?!@1!4)}WiP zr#meFqrIAj{RK^Xj554Gd8#xbw!@0&s%gcWJRdn<3!w=?`h{-Kx&ca%M3vwlug={6 zAsmd~qmod$ku^L zDh_Q-=OuUy{hYsDl-{>};=OCnKhS$U05xILjP)D}bg*ttE=CP7h2L*-4*x44cHw)= zZRFA)uQB(QXXR#uf~z_SHSSeakc%jzef#%uqp1LQsA+Ly^LPYn@gBcJbRqx9 z2l2V95cJfng>5tINJG#Un9<+!HOrKPN0f^FQVH;jMut-K*$*j`rR}VnEcY!z9H{!` zlH)!b6E$#ADf!VvUIT%VbF_meq;`D$FJLneXlgbvw9@u_{=|eR!%?LJj%jD0>9(VE zTK-ae$zfxM+WI;`F0~U2+lc@jem70)YbV@=1t?@r9`#~wt}6M^HR3;34pRM?Ng(B2 zePSOnIW%w_zjTY$wVt@T>Z4jb*BhzUODWy6jX8G|TP9lF1C8qRN){qWT6lP13!q|} zS(9N4sK{S*XR`uwR{87KnhGff0%fmT^{P3=6%}bP_~R6vfoo|5C)&BtCs;<%S7 z;AJ%iZsdgXjT@iVSb+1?^D5a~HZ>DpFV)%)r=%35EHVT7iCAjms` z1y)GuDCTfhCU39&glZwV_&i<&NRzZbyE0QT>P;)_tjQXG)TVAQD0|(2`OD`|-RtPl z$0olbgN60C9(3|#V$?E^yzsEypClGC`QFMZgMYac4V{7WA&C9Qw(i7pP zH_7|blbsEA{ahcm+N)QB;rtXEcdI&xj?+I3K62g7GNvR_?@+ilG`6rWl+C=GQi2uJ z2n<*-*6^w>U}zM*dZnUIA0A{k#X_)e#!Mj~p0E#tIkU5jqiSZGV`Rl&6){r}4j4d9 z7dO6=bcK&^j+S;teh$w@2yZU`WK5H`r4=*JC>{?%Wt#d@wN# zqk01T3CK0}c+VU819}XL&sF2=hn4z#C<}!Xt#_k+oJGOObOC6%;!r68__!P zl>c>Lpj#mD9~dFst#b2nyYEA6ySo1{{}*XtIDH_Lbhc#3m0f1J0w%yVE8h@5&*8gk zjE@D!KOai}I73+j(N4^f%@MgVwRxSxE%7QUb?ro2qspEMadli``z2%bhNNc8y#grI zZD{D+VQ6+w{^$X0Ux|WDa^2j}H*Uwcd2QY8*=7$Db5BLL-y*i!@;jd{hFz?&_tUjN z#O9HG9|ZsK0xwA1r+}|SbF~Nbm3qA{Q+qq(u9H?TYvhd~s9n(Y$gX$>yY6*AiMkZIy5G=rtcz4(lI{5Nq=^m-0_EwK!&V#YVR< zE?Paoa(eu)TS~-TyhW$-`)x|%gA&}|p?`ARA5YqDI|1uPK3Xa%6Jg|cSuI;qy`peZ z)wFh6P>Ukwv5aWxo8y4Y^slVJ9lT}d*mtsbuFi^ zCJn&nN$~nsNZlGM!XruI$&@sl6OY~&S`n!FCh4UJ;FMVPNoe%W$l4$q7d5ApAi`WN z`O|#bkhGTo1s*!!k(^YmyFL$ee+$j9)|3h_wbQ2YeT=p#T5? literal 0 HcmV?d00001 diff --git a/library/thumbs/apc_cap.png b/library/thumbs/apc_cap.png new file mode 100644 index 0000000000000000000000000000000000000000..a692ef78614c9b9ee7f1f8213435e237db0d2b4b GIT binary patch literal 1435 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?H1|$#LC7uRSjKx9jP7LeL$-HD>U=8(jaSW-L z^LFmpZW&jJWAj(NI(u%_lSLKZUmRVm5tk(3=&!|*OII>Qk`|j7LfV;Mv=XdVjeEITc8~d~uiEO)8FRy$5``YmXGuY*;ESxVS zwdXZRh;cgfu_(ARO;Bb$F_Gbk2SbqxgQZY|%zz7rIGaD%Qt|xn^S(cS7W1#uU8%a7 zH%j6H@0Q>9bIfI?S~u@#*&IJTyRCDuCV z)C`|6edD`*ft&?Dx2g*|IrJ2|s?3PBKguD`G_U^QM#kHp|4U9~P;@yWF)_&L+|Ie@ z%jX*WkKwyEE&HehQ27VOeVpFA|0zjKWeB(X&1vYeB!b1jpy1rWP`=RA#I>2?72miv zN@(^NZUE}ol{Z;axrO6BbIs$AZ@1nTFIt;wxNEAzd*+y@4<==wW=Ke2WR93U(Rf1f zy{|5849(5rHhpnyhSv^A-AApAI*}^rBC%^#9xYJwvL0*E;{V`~15D*RkxY z_$ae&o7#;VD-z~5Zx*{28DU*rW;8|i;b9hwjyqfp`#zu6EV5_dRa9zg5KwaJ$#^Ao z`~SNKyIvYmGBy^%u?=RVFAuhUknf9%qeC2-^8*Q@al_v#DY za7)ZkzFf_Jf7z2|nGg2ndpq7_(qTT%HG8&jj_qZ57L`^+k|)7 zWzDi>!ByzO*j=;hNT$ryW+_PrVXn z^L|8LW1i*1eJ}F+HC1aq{ycv=>y^Tq oy$p{s+$?!Tx}68Sc=^vL&KzZXs_yOrU}?+X>FVdQ&MBb@01=jU#sB~S literal 0 HcmV?d00001 diff --git a/library/thumbs/apc_cap_1.png b/library/thumbs/apc_cap_1.png new file mode 100644 index 0000000000000000000000000000000000000000..a0236375a4e44df818558c54060c9c73bc299aaf GIT binary patch literal 1469 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 literal 0 HcmV?d00001 diff --git a/library/thumbs/tank_001.png b/library/thumbs/tank_001.png new file mode 100644 index 0000000000000000000000000000000000000000..b5230f9dd4d693ac400b5f5131c767cbf92c23d6 GIT binary patch literal 2414 zcmd5;`8U)J7yphhwnoU3Wvt=hv5$Q$$yy8{YGjbIR5Z52Gnz?7$w-Q+M;hrJOV+7j z%oq&PB!=+VcM4&IGAPFD`6u4<{&4T-e9pP&-p{%BoX@!rybvyjMdU>Q066UC>gaud zxPL=P@F2I@hIAePD9+o(0jTO${00ER+HQ^~d=p=A3dXLh`zx{ROhT>61;a738i=>fru}eo zMMQ}0#P6jjVISiNv`c`Fy8OQp3k`o1FXUZ0S}kJ3AQUn`n;Q;d^G@``V1eNN|MX9E zbo%o?ujtqsXNCC}o~_^Q69*DE3D|M}JofzO1f{^C$~99dF4w+)xcgch&pHU0{!qJx zsO@Im?z3T%2u)Kp7;ZP5hf_`u3APXu3v@C6Q}~*y+Kh#K4W+)T0oxE~C2i;YbQz?- zH%m)5=o($^nLKP_W76@n>r(q)6HWSxS+U2&C>M8_!AFjOkU6rS9IA&V*c1QOfV?oU z5fcxXhdQz6fFi6mjT&13(FZVk)f`%m)T}JFNu1WQuzWe}!xS~Jb=j-en_qQ$W@X;J z_dB1owabgPR}cC)XQ=pRF#*80cpX{cR-Ii9=b`wsjqLkr+p}Ac@vv3Y-Lh}%^sfpE zd1BV$Hvl=IP5*_cSCP^s+3oF@1qJVrqJn-81f*9a#6|uE(nncZ#N%iqLV!2Ns+_?hO&HAqQ+N8hY*FmYcYZZmiAXpx>kO;zWX&)$jo@Yn8sV4gP7?+&|2 z2sju7T2x*spRCY)j4txM#o;vDIS3%K>LjL9m41P03y2SmEfXkyx4a$OV!9ETl6Vd1 zr&letRHRF4UXw^YnpQzlR!hWnl#x>ulnFBr&SmtHUmdE`Sq8)K5gKQbN3K*VBfW4L zpKm*dq%B+o+}*Q`j4Z=)iNV+#VezGueMflv^IoL!v-fJkr+$1GG_kS@)bb~@3Xk*G zqjwre3t>s`OnGiu`2;a%FYNB3a;Y&N@u}^{Wl)ediogb6acMRxTH^HDtcHw6XDfYHvqQ zCuSGsgxmNwjA`<^X>ES=d)98BFo9(2A6@!BH*6U4#l19s<(x*x@V0ANJ!3Q6 z_}FI{9BSTqT6cGOu-UWe)}xPQQ{w2dE672#9PT`$*i5*GW$5wlC~wX6ew>L^V&hA? z-iTqm*xXaQ3_)_lk`%W@)`8COD z<<*QmSC)kb;w+Ac+BFMy3;uh037uz5X)|EGeCtt?SHCx9o%wkhb1!2Z2ZHqL)H(r-UJpsiK%Q>|SR>!fAy~zJY%vLz?+H)~U4cjbG*86@NWr7f1TE*wN6?QbpGRNRw@^Yt99Imxu@)r_0P1 zYpztF#OzJ2)|BxWlv9mxM-Yz}Am4wDC1<<$%dU_NMeRGh8v&Bhqk%2WDSOU; zU`|%A7K;xJXi5FSK#3O=C{4{01U6Pp^EJ9Kz;_qt5r(D|UL z=_f=hR`(sH_z98y16vx^$3$#6ekN8;y-D0-|1eCb;yEB{C6Vh}cFGg;{lugUj6U{@ z)%(y~Ld3w#a$3s=dcq@nPo`%fHQoNYcyZ)}(a#T8hq5qTenpr44|NhS3TM~OIDmDx zd&x6&zD!U2+W#P>2_uA#US1k$vUQnCz>F(F`Wx2O4D=h>zz z)cMT|1Boh7y|l^TL8_N_;Z>`Hy9MM2h~e*^!sfUSSMvP!lqi;ZF?P%|AHym~P7*q4 z)m`5xwg~+IO^1Rt8>so%nD|<wShO}t2YE#3cVoeO`h~p$50!jh|LOA z7CX3bw0pEEK5u06N~4F0Q21O`nn75TK`^#-q)PBj3{L-P6G} zl!||pLW*&oczGP%ZB;9TfNCXc%T3`Cxl~_LvZSU0jiH^?*IS* literal 0 HcmV?d00001 diff --git a/library/thumbs/tank_002.png b/library/thumbs/tank_002.png new file mode 100644 index 0000000000000000000000000000000000000000..8f271fb989cbcfa70f3c4e7e7cd82a852dc1d55d GIT binary patch literal 2274 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 literal 0 HcmV?d00001 diff --git a/library/thumbs/tank_005.png b/library/thumbs/tank_005.png new file mode 100644 index 0000000000000000000000000000000000000000..852edd1f230d76ab21541f4137cc1eb7517e5d7f GIT binary patch literal 2252 zcmc(h_dnYS7{|Yel_OMJQX}XUZ4cq-g*Fv6ilWh=BX$*SW3?!Xh*pf69XPdGHI7yy zE~pW^3AJZlh@|Q&)QY`1_gCBxpXc+#=k@&fex6Uf&2=+zuq+q=0C5X*6U>nl{*#E% z(QGwv>pU{P0F0RtK8+_3p_(jYFC6mEQ^8a^W2C3y=ra$%D0=&9>#(2i6ns)IX13%Ga5_if9wPuMFmYK8!Rcs1&)LNoql9iVyB&bmOfEXj zdCY5-6Qr@A;KL5cSj;`ncKev(UZ0l&Q@!ajq#TPO$W_DB@=&;@$`S+T?JeoVJG4@~ z?%T7MOQv{}siHOtd)HH{s;q5SPq>v?BGcELheKCj;_#+*hYS(oGvJ?9OJPhb<@T!? zUegXwoV7o*B#bFu7)a%JtP7>c?+gsAGzg=1ToVVq^6fp`DQASBvM{AnXdSH~M(sLOX#4Zc6oVs8O z_9`ql8tg9;-yBy*HrA($jARL}Is4Q)QD&q>^xCc-7rVM^K_5IbHTxo>yLQCSsk5&H z|Ly?3e|~gR&WOF;F{iHi5ADbBz}KutVuP=BkUf`2b;Aja8nxS&!@t5TL%AN$D@Ve% zmc~oX&IKM)E)?$QJM+rzBNgMR0)@SMqr&Tvv$r}LHUZ)f{*f^Z?n0_dmkz4h(Cb#g zbc0%5%ImDHL_;N@i8YVxw-qovHy@(@rOzLA>6ADYXQ4u`X150@XGC<3!m~XeK8|U= z@9wxs_HYR!RC6Mdj_BFq>+b359~!c|6iznv8aSRkZ_q=T%K7x^lO$NUBbnQt%mwOs zxWB7(;!+CBM_wfsBSaf(*Mm*QD5TC?&f!s28#h^{=f2VJa^M2wiTb!H=nK<~(M)~9 z%FnmGKTGhNA8+a>nzz}CK{j4q+hH!tIS$%;`%$RW=-G=ScVK>P3=C^`E3eMEcmKQL zG#`mmYw`ri=vbVZV~-D7$UA_wkD-r4VsAT_X4^XkB$FlIRhAKJYC>TLaC-Zwn^5eI ztU*YgK$b|Y|MDC)n3`5QIN`fo^^@_C62xb&h6`L}+cKb7Y*u{WlQ&=1xB`n4K6||P z5Kn%W8h;3`I`V+j_DJ55SvYdW^>pre>(O+xHQXJ}jv_0vtv%DNHVoZ2G!(5}$dj<- z83=0vO_tn7q4brw25CCfk(q_!4Ip~x!RxZ_e~7XhnROTUsy3uOy{2as=QT1^rZSCX z>d{UjHXRbaj%QJv@YI=Gqc-}Rw)%MUw!!iH>mT_+$)F=#1D}{)qk&Ubq(dRNEt^<= zpnjR=CouPXQ=4wry|dlSm01NDH)~)cwna|v)*{2T=rYa z{UlQgp@|z)dWGMT+J^_;i#xN>=Bf{46=%JRYg7`0d`v0IIbHrsi;WvI zh*H!~EI`QU&2!fpi*5b}%B}$6Wem3Oy)|+plH79&s>Ij~Nngk@F__20$8XsUFkqnM zkysp9QPvP3{Ko8=(#r+t%b>GF&e#aJyo|@?$~<@=Iyidr9P!W*F&ijNKobR*Y!RCR z-t@GOWPlyoSP%A!Pg0$go0+)Do1m$+dp^#VJ$3gk(o8Gl4GbP$(!8r{BEg$pU)4*t z#p>(Eq@@)@jgz8a(OIq0Mpv-o*xSzM-!Sk~nWBciAISyEAYKiAPKw?%KaaGww!TMG zVt&V32IyIRGbfmP2@{R@2;Qo~SD%v$-h+UxgDki-dA2$_MQ*R}Hv}Uhvs;Pl;#7%7m5e{zEC% f|L@iI9P)(=DTMqDdF^&oPXG(k>n0>4*Ju9%&~-fn literal 0 HcmV?d00001 diff --git a/library/thumbs/tank_006.png b/library/thumbs/tank_006.png new file mode 100644 index 0000000000000000000000000000000000000000..f2a4e518c0275f9f03b113576c3cd6be8e802987 GIT binary patch literal 2388 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 SRO%0AA7E$gXjOyqOZg80$;^)c literal 0 HcmV?d00001 diff --git a/library/thumbs/tank_car_002.png b/library/thumbs/tank_car_002.png new file mode 100644 index 0000000000000000000000000000000000000000..ccf48fcbd70c51aef6d0a92b7c9fdfb0bc91e179 GIT binary patch literal 2586 zcmd6p={uW=0>$4@im`N2OKqLfDzO#~5}~!EO4U|O?6ogr?O2mYTRPT6QKm{WVeBR5 zK~ZAsqC-h6O_3Zb5i;_3T%}xt@gQ6TE}2!CvO5C%T z4zjofj2{>E!6^+Ty#&fN#oJYlv0rmRdWiq4NLgcBvQSFSDnqfgynuGP)yzSq&{#>@ z?%=m&VdfKcwncz6jz81L<#Iw&XCh7Anmy96sh=?f^!^@pxj$QbLojj1WvAwtXeg(2 z^jp1Ke9glvG50Q6%3GPc3 zRVa>2nL9hJOr=yW%GuZ7lIFgDJ-Pve;SY5v-Zq$@c%!_~r;X!`Ez`{tIL|v3torvS zkMddDt5q4B4^u2BMA{>s}I2!BO?AMVcM_*&SxZeGgGixaPLv@c@o9ae_ zjNEdGg3&`Z23qE8)iaVZoEwDoF@gIXuZvNGesMk8NX_G*fn za9J)DItP80;XUW8R)dInzMoed1<($mOGN+q1IwNG zIN=&G(k?~)0TE5ZJ&~sdV`n4r6(fATYfW!}${}xG_`!O(mUO$jUs!PB0HsebvAF_1 z5K}Fqp%L7AhOyIaw&c!cP1mr}^)T|->?G`(4$AQTc7$yH1EZl*>#Qg9IE*U;fQAFU)@{%)_CZAq7E~!2t)?o*k`?H2X4!L#o$tpseW5|5h z(zM60Ykq+7Py#HOLnq4K43h4!>{j7{0h zqPK7pkBwL<^<0Vt&t zqI@tn`y&Yh^^#JyxvCCeG zitm62#vl{}pOh7e^_r>kYVknoBy*@c{I59`)_nU9=f&qFehATlwqP0A$Wwa@#M<%l z8t8VsLpTYZq4Na%caJF}(P5sr`(R;@W zhuH~ZibpR0&Ot`qJri{Cz?e36%F8LH6Z!3Gft={YA-QjTMakn}t9|h5&H9FhH!ST< zl(q6sfs>e5ev6(#&Zi+^x7f5m;4<9N{KLOv#_=jX2hZBY9Mh_`mKYHsAzS~3WS!FJ zAB1g9VoZf~Y(}I3&P5OY_)jRBuWePvRw0VX|Mq6&qt*uEfE`}Vr zT>LMuD=Ejn!-Sd0QrkSA@w}Vs^>_Za&t@vuhw`51Rm3-Lj0S09MRCgzp=Mz)x^?8s zG;FT(h2U-5a-j&`H7#W1u?aHuRO*yGWiQIi-^(dX_G5xtLtw@`OJ<0;&^bs+>})U* zB4RfWZD{EElFuPheAbX%uV*JwzjG254LLVU7H3{n&u=w8ji<&w`@UU7_;;z-a!CZC{81e z4nm&=Y%sc%_dc=|Zs}w-E4{D?e{PRutC?ME^=-lI^!39Y4h^UdD%&0hSuTMD+G3_F zGW8KDH6jlS)39e;)$k~AUDPGt&Px4j;25j~15eBafK=6kYd6%WY9L_Cqm;>5uX`z8 zlAy7-SwWHCgau|ZvWe;EIe7%D?z%-7-6;vBv{d^_E`glVqqy1qnyLgW@3HM;86RIj{%~$ zA4hY@9<;fyEAkS?`_8rD$3{drQ;~=B-1O_L58NZP)sN_jJh^FDLNo=kvt-J0j4P2{ zE=`^Hrz;=F4czfC9MJv}sAc;|WLlNXrQu9nNoHw+u7kXVid-VZrjnAyL<)u75OMVB sic^|l0CU=;(+t~g^*=i=lLw$Ntju=ByQ8-c&mQ1t?_$?>CFt&d087*0UH||9 literal 0 HcmV?d00001 diff --git a/library/thumbs/tank_gun_001.png b/library/thumbs/tank_gun_001.png new file mode 100644 index 0000000000000000000000000000000000000000..bdb3d0318c067aada9388de7153c4e90dab830bb GIT binary patch literal 1353 zcmc&!>sJzX0R0ImrYp^SB1=2zpof9hDlJ6?Uz?grrRD@vTQx1VJU*rwdK z6sywyhrOMZrD3OJR9uk*jKgOqeT7g57rfg34$d$Map_5pdrz5?^$2i_{tA{?L1PiTljQB3H`(9*S3bwX_jw9N#I{3E97YS;UcqrG3(K*lQ>jULIa{u<3Aqtr)haE4^Z(*u1CL%J{S-o>d|a#Bc5 z2Gv}{=Lh@BfM2zK!3lh6cWGNA5pR3Hkp|&y!z60TrRg(6Zn4yLI9o6(!)X@CO{O#}bnv(<>b&miBbbYB>Xg9TW zRW1!q{dCTuN|HraTrWf%uGj!{6KLwFrD)8~j8P)R2d64(6NQex+c{}IlMf0p?5L|A zXS+hi7vI0x{$lN+Pt9jEwv6$o9uW(IT2yb23Cn{F?=JW-FHZ7BkC1iisIo8`8cng+ zhAt&9D~Xv({1eZ9WD%nkg_(0|?-fMsGt`HAiHDaUOFaOTXf1^qv*omc&8JV@BN$J> z))&H5YUIi>a0X4Gsd1qu&mGzHWoC1i;(T-0<_~RR<~;U5&$Q+_1$-%U^kiPlO|Mns zL=!pmWm{$!cN^u8gW|DhM$uDjJ_mY;uPX{QJtO}eNnh?8%++x^$Cde~_78q;s2j`$ zsoe5Qi9*I6*_D*XnrKJ89{tz|<`I)6x+voG;#Apcz~nUy!G=h39ZZ%>&#HY` z)|B3eL1+}}W@!udiAEFv;3mtNi1%v zGSgd}%Ud<#{QOEhoFm&vBeG#%pMTOa)1S_hxApyowQwca+DtbwpM5#2A?n6)k0M1z zcZr3=-H%~M2vsV5YUhgquDyDYztuV>&|*%iDYV8-_q6s735QaDgl|&6M{1|pP(3|x zv`zq{YKb@8tIW>c^S9t@gkjxQUmR~jYF0I Jxsh2v{0ENuV5$HB literal 0 HcmV?d00001 diff --git a/library/thumbs/tank_gun_002.png b/library/thumbs/tank_gun_002.png new file mode 100644 index 0000000000000000000000000000000000000000..1b9ef94f5abfcef6b1b56fabe73e1fcaa65e42dd GIT binary patch literal 1364 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 C%kWJA literal 0 HcmV?d00001 diff --git a/library/thumbs/tank_gun_006.png b/library/thumbs/tank_gun_006.png new file mode 100644 index 0000000000000000000000000000000000000000..a93ffdc0a43221eeaea2e26298df5bf177a551bb GIT binary patch literal 1535 zcmd5+{X5eM0RN61&W58-J4{bK+<7jXic8Gv78b_Y2@4r%n!@hLG7OV8S-MAF8YMi+ za;jZP88fX!Tbq~AuGqrIEpo3cT^c9RvLu5$F%x7u%=+;EQKyl;6+fx;YuTe0MU8zeo*@l9Vz)U{n%x z=qoeUHCR|Yf^w*|AOK<1OCy0m`$_=w{fv4&r2mrjr@|K>mAx5@MG%T)i65etMJ_u> z+7det3##yQX}6}UGxd;nu>%@vtNbFtqNqClq7#zgHmrt(Z#9FA?*5;!XJtdLWV9E# z*KuuQu}Ps-9iI=otxFckj%Emy>GlcaqQO9Z9I?YAIR3OW^Z`{Im!KIN-^gPN8_Ns0 z3#$2!^mQB;zPydVey{JB4}n=&@x5y5SfAdINq`_oKl;x6OnrT;i;p2X5pXCgd$^)< zgQ%_UkD6KW|6nqilih^TnM#o)5{TA`I^{juG#xTP|0zxI%DYjTf^Ta&bgEgJ!b#i0 zooI_6SY3sY>Kt>l!=t(>mBMyySq?E#TFMpM2ABK`Ka1R0Ov~yYs@^Tl2t(Rxp5uf& zc{#=Sl6hCyUCgZswp;7!l-B2H)@NwX_U9wJDyGVqU*BM{zcO_2oGZk3 zQ{SrOwF7S!*o4f?>#m`T@}xF_U5Ps;XtLM^dc(Q$?AzL|ha{w0)9JK%n^MrLmEOv3 z8LutI(+?V`u@UM;2=c)=D+GhNW>;c|p*PYYx;TS`Wmcr?OenDJm7R|U3sC0(%1U}K zPS_vh8xRl;Wi(pKKXzQ4wh?;}`v%jpp8mpqA$>G*#T&nVN0LjLDrtyWi%ZmZu)G4G zehMKy4w}JEI;c$KotsrujWT`iZ>cJ|JAIH2Nsw$i0nw@Gk?W2^dQ-7$D8s{Ce00(s z|0EYqkcFErr_qg+wY#`2Cy2hhAucItPszTU7*vz|^qCw>C1-E$coLjned@fu@X)w|%`33q;K@057)gvTvqwX} zJ(%fX9_3s~o?j!J?eN^(967bcTjG(=i9tN?&7HExDGT4Qwb9cLA+#_H2o09E!c!r!Kv07byC>nwc4V>YNv zWzvJlV`8{Xv>s-Iae|`vy!-Uox0(q;%#)0iDb84;#e2_oF4^0MGt#S&hJzPg%HM$f z3beKf_#-_otMh$gSR+PM8Eo%s*b}R7&Hru6vn6sC?6=)C<|tfnez~!m0Pn+zo?qpS z5)WgCnX+zJKd=JNEzfBidOtKxlhmvGKGb?7LECY(XQ>*G)eV<$kc}6wg4o`-vn(fC zRDNdbxki>5)s;NIj$r0s4Rrt%1;_}wZB@Ehp6sfTK<_5zx|#fgHMceDwR>vTf?2pi z|J~YRE!fYOb*DQt&gQ#fe4%S7J94&@L!lc?+AUN_6#E$!^7Qv2Nz|8uYyJ)V5ccmh zDt$fQ5U8nvH6gr$Rm2nu~4`^yy;aYnJJf8{;0q*&@0u%o^whe>j W24gKJBXm2D4xo==Q1|^4iv9ucD$KY5 literal 0 HcmV?d00001 diff --git a/library/thumbs/tank_tower_001.png b/library/thumbs/tank_tower_001.png new file mode 100644 index 0000000000000000000000000000000000000000..327fd7e6f6a64d5380f4912513c292b74b513b83 GIT binary patch literal 2023 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 CR-)qo literal 0 HcmV?d00001 diff --git a/library/thumbs/tank_tower_003.png b/library/thumbs/tank_tower_003.png new file mode 100644 index 0000000000000000000000000000000000000000..fd373bc04350b7e89c118087a7c4b752342c0a18 GIT binary patch literal 2020 zcmc&#`8V5%9{mQzvy>J^?4!?89xWX-wKqjjjM_3!NIIk?_N7E3qOEPTmU%^Ov1Dq@ zQz|H9i*F`vV;H+yO4Ty4)DjV5X~~%P2fQEOJLlfd{o$VTIrn_d`J9{O;pQkU0hIs% zKpNo$_dHedUlbQTolI*?|EWM?Jss_VhC$Ue01%@f;C5b#Wt+2Wk*W#GAeXaorFng3 z4n;`*qn7Q1xKZ+`Fpp}7kgPs$UtP6(%f%zjD^(t@?(v!pql;CIyqQFADZvR-c46r|FChCDVNz@oJ`4W`F^swlkywqdQUM@<1NE6 zhoDCj+6#bq2SUkF|9^mH6v3d}UO<}Kb4VC9&v=}maQ~@j;}cgMUyk?GH&D>5!F{%N z|I&t@w5^3ST1A6&8TlXMzlR6I%Tktux_vRMESdQXo0H|je*1-CqXtB>l9q*@0q1)b{7a3pnbo^zJ-N9Yu2ke0(C#OPt|a=01O;pvuyMJ{cZY4eynOULx~8 z!VoDbP0O)W9+_OP5?in`QWK%61cG2ZN|lAdkp9Ms1~TD>KE9?K(=+axvgnBW6sOnK zesQ4z%|Gk+J+HXxASE4tb{?<3^z&7QM;=_T^8+%2Q(5xp8^ zEH*TP)fUor03)v$Tc$3-ethX}V)b=@{!mJe%9?&jDK%jarhz(ql-iyAtOi*u?LQeD z5}oF6Bm>$ANNJ3!WDDGiFkydRIBFryjC9De`M|7ykD^mSNLnYnWL9u9|z|N4ftFUXT>nzqbY%G-; zKT$r_f?E1qM`jIKI$4e&5=>G<(jkcg4Z$L9$#LsbyiTO6oEcN(p&iJK_7CfHGAh-+ zzzGTqdcbs)i8z`qV3*R%&k(JIfiLV2m=41Ec|7rmBkz*k|A@H|USUoQm!FJ}Mk$i# zPAJm3`WLc)X~+&PR<+ojFMP>fL4uPj0ANfK;GX$}fZuW5V6Yh^@?=QODgm3M&LmTU zgvg22by)oAJ%tHLE(u+u@b<2jrZpTYaRCuHC`7js@shE8I=8KFzy~thg?K$A_4M-K-U_deO$YJ346C>lgB!G^_D9^O6ZDk3g zORxhwr3U7y17bZTsK&!-m7Y%OOMDOaSPN~s5GBqOe}U?ctZ%MU(@U-Zd1hN;_2Kn@ z#Iy<69-U|b#~?{#I~X`5Li#Ul*1sd9975+VI|~{gLXjE6MGZkw{x z3j8K`WbPFKU3;~^j@&la0u7=>knN2VH%*m=OMzpGwvv38p6mZrh zrxEcSzMsEe!)%`fj?fd$F$pB z#1$FsJ4f=L4lc4Bbd-`-AvL;pEn@lbfp(DQC?h;PQxvq*tnYko7P`r$T@~HV=+~HA zs()`qFNe$}@nYCZ_KXHsR$;Kob<>`$5%t(+9+9~Buafe;RceOv={ms8I-o;pHp~Yy zF(Bft``CK!GlK;IR7mzLUgf>(ujObZ;yRw@i3h_Fb?Z2EIJgxt?qGB43hak(_oqEY zNOPa7AZH;(0Vx^Uj)cR}b~ylNb1bJBmj2Ai`xsyJ5B|o0QaYn|+mC$`Njh$m&c$#2 ziaa?Wq{vtw>^`ZiFN0b2W{u@SqO`3L_cvuM)vo!#3X9}=*|9iZ;;T~nhf4G6bcxE1 z@ijYOG0Tsw^l@~ysdZelXvjw>&tml*)P%f8`O>EaG!+{Lo_xAy-4XMu$#t>PSMD5` wv{G?Ri!|R47p;uo?gdvK2||Eh|CcycY~p;EF%k)DI<0L0anlXnV2^(ACkkBBga7~l literal 0 HcmV?d00001 diff --git a/library/thumbs/tank_tower_004.png b/library/thumbs/tank_tower_004.png new file mode 100644 index 0000000000000000000000000000000000000000..224b79cba01d3c2ad421c42deef4063b82798934 GIT binary patch literal 2022 zcmc(g`8V5%8pgk3H;8KIwu+R>R41s`RxPPCw3?b&S_ad!f-znZKL#-+LzRz zPK%;;8iG+Ome9IFh=ge@k)*K&C9eAq+#l~f=kvVJPwzR;`@?hIG<#cX1-a95001bU zZdu(qa>9QkBXuN-_dzPB7ReTpxexC^jRZIw4Ac=NqM=il`6*^AkkloMwX$ zm?@i$02y_l)z6}j(}S{JqdxCHI-uhR607Tivd-y2gY=1GHt!c`U6c}D%)A*h-Ae}@^=1FN3|Np5^;~y~7BK3P)CIAx$SneuGhJIU|W_2O2PI%T&M*(}hVAGLw z(*2$f(CY&fwS@3xwfgXAjh+T(R#_Zw-zPqnk;Dh0R{Kl?ciQgq zlW3^1?r(bh*h&xgLidCojU;3|n|;oY&dSM~2QfS6Eo^G4v!@=!bUsM$-YAT+XD#VBYJ2IM5QWDBOW(x<>?TJ-DRVZWg0Eq`nLLKUQUnvo>9NdHtAT> zoWzR1kD~UZm5rYp8yWr6)>}pbw5b4%oYb#Gd4!k#Zl zgXwo|8r?0ZUgPlH{rw??(b2G>962#9GWDBAaO1{Nmh}i>RBU78)C$Lr%nc?jYD0Pe zwO0*qUSLedmIqHIT1LqxonB52!#e5u&kZT3JRP~%gV<8*@n(Hg zZudAw0Ek}f5&la>Gj@b z142H?HqOVQA^c^jRdJxH1i4$ZdugC6{O>NdA>7!~RBfB_lS?kT9dnMTPo4bHD_VDi zrA2hb&wQ;c>Qa}ChJ%0)hk2AuXa_l{%^>Sxkb9c_`KFbSa;-&LO9qaP;O-)vD*aeA zMQ`YEd?I)*^g%2{GCJnyBG!PLwwj{2Qo8lZvfuAMD{MI0EQ)(I*`1o5Do*|J`M=DG zYDHLVK){HnO*(}$%GqzU+k0~28&{LrYsd2oCnQr#a&Z(!$lhwH#bvXx9LmqOr6T0W zMn6(8sxQUKgjIX)aO)1E?Iy>awM`$N?r@`rb!UD9d^?UxQNC>T}j$aEzNh% zpD-!5e&hIYhnUwSidI21xU8GZ43WC`AdHK%L>=(4Q_Y8~xI*^Z_NxreTdl$70$2XD zuPz7mlcA8L2$pl}`XPKH1Am^u$nQarJ8Ru*+E|JL91fTNI?b#7WQZ{wcc#1eowWuGXW$s?0txU>B4W{UTLG;7@4n85o#gge-dc zi1tJlgWkavcU7*z%?Eq;&yr#u&qLnHYnBWXo`XSM<`OkW1ttA}-~_v1Fcp}$N_-wj zKH<9XGqJMYE6dX-SqQ#l2&b$VK4+BnhHlc_fynR5n37Ug!=+7b*&zw9??1V^W;&k< z1at{9@!gKFsJ;fD>h|<(rk50%0@DQXY@W@;-42*>3c@tO_)Fm+KTgBGV~b=J0v#Y-=^QW AG5`Po literal 0 HcmV?d00001 diff --git a/library/thumbs/tank_tower_005.png b/library/thumbs/tank_tower_005.png new file mode 100644 index 0000000000000000000000000000000000000000..167212b691a1d96d48f809307aa7e1f8fa3e432c GIT binary patch literal 2232 zcmcgu`#;l*8~Ud^x6dN@ebqn#hon4!$Amcnu{bMHb_B)Q}WC7E>` zb|^EK6CFd!aVeJ#t;Cr4+T731>-+s1&JWM!^?Kf~=XqZ5*Ymud=cYT}Q9({q4gdfJ zXD54t)YAVExU5unSOxY-4d@!d(H3CzY0Uxv{Hn9P&6(@P!V*d-I!wE(wSWKkc8}}( z=AMOPmmUpTx+9^`063NHu7+63?-mN>Zk6k;FRU^wsSfr~aXQ>1L?Eic2HADZy@$B+%0Q?>U4l^ivuS|k?BcO3ONz^h73wQ`> z$Iubk8LdFXtU`R;dg0Rq@vCc#g*Ga+bxgqOYxBY@VL{!FD*vU?&{@;#bG_6=aZzch zrv1RWoIKC2&X^7~%UbJ6p?Qiq&5J1e{%g?@4jE8sUx(tymx5 zQqtzaFhzll`jWO{CK@>1nm%5Vn3bKbB$rOo=zHceMjL9`$w`tNd10}+Z+m%hC+JM6 z8vNEy%>17n@czQ~0H+q~ z87Pqprn|on??`Rc=p#f^Xg*M7ExAb zy&GoHw-0b~b#p8CV*r3)YFL=e`JVa!l0#dO1$ckvzXS!GOVW62Kw9HlI@#I&UKK95 zDERdgJhQ`H1&R~|2l!LUh&AZD#nciW zXG|P1cRZN_BChxO`wW~rO}^`Q9;k@Kf4Eo!qcD7WsR!RrR1>O$!o$ns6a%TSj6j~` zSypPQ#l7nEJ5go%Dt(=~%3qB+1?=y$A(TtB$(w@~S&g($O5Tp`5ys~NdiXOlkQo0= zNSPj3*C82+Yau!|`JFO3x)^T(gnFp{;vP!(p0EawLSIY1FZ=vNCLL|Qe_#1`+O+2L zzYaGZqk@3xX>TsA`E8h?N&SP45g(1?Ul>o$*4V&7hmud(b%~{MZ#!MmW*dw_2*5z=`}OTpz8SVqtFnVGfWeRGrF>Cjx@) ztVpA%>C%OvUsuWI2+RyZ$a4(VoY)@5-mtF{HBe}=^vTY(U4t6DN*Go6yqMUFYRJR= ze02Kb!G=8M(j}B6Vc}Bh^xz-1HE(<)DZ(jF*5ieBd>a!92hDS^Y{?*@ zJwIwoaI|8w=Q@nYTS>(Ir+%?$i7S?SU9VsHUP*3kA8q+f5qX0rzYhtHmaWUbd;UDr zv)XqTwlx?$asq8(I-XMJ;1&5f_FbqMw_1>Ey7J@e)~io3jz3q~f10X5w~FukoxYWB zH_40eP#xH-Fv>kJwH)HDRCKdcm}-!V`weJjptV*F!pZtu9~mFb zWX#>@pTvb=GDjj+vQNp>DXgg=HLijd>c(b~sFr3B@USpjSM3AWH7Bl#ilLH64&@AS z6xqw}U9n!bQ7QyxX&=~@_pRYvWC%;CXn zll>=|tdcWc=uk7w?vP`kK=x)FQ>-!YP_`pCd6$(@XDUZMfHpxac(1)VI{GkT zGJy?WLN1* z0V#v#u3oY*XnVr(+`yF_zc2#xA)hNF5g(M$v=V8!L)N zlk-t7xjtFJ6fuCLS3$87POkhrJZmqlg-9hA^T&vpVIHd9b$yT8Ra{1V`gP0kc3xY}uPCIXxqRa8vM#-d3BTy5+iZQ%GqJOQ0zw~bNpwSL&CqarmsOZdw4!5rG$E1^nK!?^OC%99@wP-Vfu zK|_6Oac7rA0gNFge$M%VIZJ|HkmptSM(`Y2ms1F$WTjA0bJWKn{s(2H(F)UlG9B0dLQ+C8higdUXQ5 literal 0 HcmV?d00001 diff --git a/library/thumbs/tank_tower_006.png b/library/thumbs/tank_tower_006.png new file mode 100644 index 0000000000000000000000000000000000000000..3f5d003695692720034acbf55fe59a4d6aead1ea GIT binary patch literal 2307 zcmc&#`9IT-AAe7bkfXv-xhhvVn)1oe7>S%qj%26|nWJdPHI}PmL~f#wR%Y>)qtdWR zIT{urH#xRkja*~KSO3KK`+7WHujljmcs(A^*DtTvYjHqWP8a}y1D2P}kb8*x zn?m5d+HCAa-vdwx(!vy|=sGeB074CxW+sl|1&f7lm?O@zIBGTJW-DQ;fs;Of8b4^? zCxe35E7~8Ekh*%}xdhQh!qnVsAQK+sE@lFqgnW#Yhr=R;M+C zLT{}wmUdz1`a7q-@V0m)BtbL5(|*J(t3D?1S3^bWdHqzr`9k)rG2zuw^*w9iD83aC zzUR4AvNw{(WH#e9OZ!=B+0C(<>U{k60cRz9TMWB@cm3|xV?rcBJ9ZdKEhwmQXMKOo zbg*xexXdmfz0_soi*!%(v25UR5RX0pbZ_lR&#$?8BK^14*X!DHOHC4*^lpb%%2{qRpOj{b%3rh@-ZpfQw0YkRHqS1?^g%bL;mO%53T| zlT;5kw+1_9NmXg`32IruO;>5}>W<)dSzA(Rmmq2awXvnCTLI6IpC|8N!?5eo6)ImB zI{1u?SasY#3IvwOF{P&rKs$=%8WxR3KYhAzf`KpK>CfA4t;gILV(fxzEO8eOdTt)+#MD|Xa)`^*hg zTvCm1y39M!DquIJ{$59)`k>oOM=wh9yPkt?Lcp-&8)0|%+BkQj+;(wkrNie)-tNN8 z1>-FlLlfm(kdt%&$XW`$WC6pjtg2^%6+Dl_YS@z_h`uds*r2AYtURA*z`erGNyNhh zn}-QW7-@yOL3dK>1`}QdXkZS{HziqnBvN-5i;ibB7;X^lj;`*G5QoA>A!+TJH(jz4yfZhz!65!j)aot5lPB?%7{Bmf4+g4DX2aG=`#S2{&ndg8 znzhioLdg#RhMm#ka0#Rk;y3X9LYh|$R+3(ZLoOPU{T_uH%yOsYB2<@lOy#x24pi0E zna7mS=BZKh$=B{0nwbJYI=mmxoF6Q=zhM+c~d^O1LntY&fV*>yJ)wQ>|ZT+}i3n)iDDhF;rikvHWEF3krYh zVy13x$Jk^_&6$jdV4AZ8hiw!N$bQi@fjg-kKG&d-9HQ)VI@9(>p0`uh4@gm4RejAx zgN$2Y`rD~^gf>oIE4Fx>7xgG+e0^l@Y(~?1EZ7Fw;8V;>>w4+pj%u#bc>GvQS3h5+ z(DFte`d1K0X_{|@Gk1l%ZnGOHjceS|BUuYCdGNZdjF6ob_ni}QZ)iKx$>z$;V9~+5~7VHnYNXD9>&s@M-s~r<0q{PybU^@yqNFmtBCx9- z*U}Wjsw05+x3pBhDIXIo)|XwJKnw_kKZwYCIJ4{CSYnAGg{F%&16T8f@`~u)AwLae z?nhPzz3 z0b`r=$T)9o1~KtA>X*~dyh?ie*t?Cr?iU0&EQ$?%mo9VHvz7pR4=gZD8;OdMGM68Hm{yPZmRHg0>5Y6A1nm zKs6qDT0y+1mIgC(#G#w+296EMj?}ub7rB=)oeK%qXaB*Mt@QT_wQ1_BCQaPU7us<4`WT?VEz z6?T8;xE-?XssT*>mB$5yk`Vmgj{N3OoIRb literal 0 HcmV?d00001 diff --git a/tests/probe_d6_mapbuilder.gd b/tests/probe_d6_mapbuilder.gd new file mode 100644 index 0000000..d762cf5 --- /dev/null +++ b/tests/probe_d6_mapbuilder.gd @@ -0,0 +1,170 @@ +extends SceneTree +## D6-Beweis (t_31e800f2): Map Builder platziert 3 Fahrzeuge (Panzer + Panzer-Turm +## aufgesetzt + Transportpanzer) und zeigt die Kollisionsboxen als Drahtgitter +## (Groesse aus registry `collision.size` — die Deckungsprobe als Bild). +## Zusaetzlich aufgesetzt: die Panzerkanone, damit sichtbar ist, dass Turm und +## Kanone an der richtigen Stelle sitzen (Pack-Prefab-Hoehen 1,5929 m / 0,5344 m). +## +## xvfb-run -a /opt/data/home/bin/godot4 --rendering-driver opengl3 --path . \ +## -s res://tests/probe_d6_mapbuilder.gd +## +## Ausgabe: user://probe_d6_mapbuilder.png + Pruefzeilen + +const AUSGABE := "user://probe_d6_mapbuilder.png" +const TURM_RING_Y := 1.5928574 +const KANONE_Y := TURM_RING_Y + 0.53440094 +const KANONE_Z := 1.4340973 + +const PLATZ := [ + {"id": "tank_001", "pos": [0.0, 0.0, 0.0], "rot_y_deg": 0.0, "aufsatz": false}, + {"id": "tank_tower_001", "pos": [0.0, TURM_RING_Y, 0.0], "rot_y_deg": 0.0, "aufsatz": true}, + {"id": "tank_gun_001", "pos": [0.0, KANONE_Y, KANONE_Z], "rot_y_deg": 0.0, "aufsatz": true}, + {"id": "apc_001", "pos": [9.5, 0.0, 0.0], "rot_y_deg": 0.0, "aufsatz": false}, +] + +const MapDocument := preload("res://src/svmap/map_document.gd") + +var vp: SubViewport +var bauer: Node3D +var kamera: Camera3D +var rahmen := 0 +var fehler: Array = [] + + +func _initialize() -> void: + vp = SubViewport.new() + vp.size = Vector2i(1600, 1000) + vp.own_world_3d = true + vp.render_target_update_mode = SubViewport.UPDATE_ALWAYS + root.add_child(vp) + + var env := Environment.new() + env.background_mode = Environment.BG_COLOR + env.background_color = Color(0.55, 0.62, 0.72) + env.ambient_light_source = Environment.AMBIENT_SOURCE_COLOR + env.ambient_light_color = Color(1, 1, 1) + env.ambient_light_energy = 0.85 + var we := WorldEnvironment.new() + we.environment = env + vp.add_child(we) + + var sonne := DirectionalLight3D.new() + sonne.rotation_degrees = Vector3(-48.0, 35.0, 0.0) + sonne.light_energy = 1.2 + vp.add_child(sonne) + + # Bodenplatte (Terrain-Ersatz): zeigt, dass die Fahrzeuge AUF dem Boden stehen. + # Bewusst ein flacher Kasten (nicht PlaneMesh) + unshaded: keine Z-Artefakte + # und keine Beleuchtungsflecken im llvmpipe-Renderer. + var boden := MeshInstance3D.new() + var bm_boden := BoxMesh.new() + bm_boden.size = Vector3(90.0, 0.4, 90.0) + boden.mesh = bm_boden + boden.position = Vector3(0.0, -0.19, 0.0) # Oberkante y=+0.01: Sand liegt 1 cm ueber der Builder-Bodenebene (kein Z-Kampf) + var bmat := StandardMaterial3D.new() + bmat.shading_mode = BaseMaterial3D.SHADING_MODE_UNSHADED + bmat.albedo_color = Color(0.76, 0.66, 0.44) + boden.material_override = bmat + vp.add_child(boden) + + # --- der ECHTE Map Builder (gleiche Datei wie der Editor benutzt) --- + var manifest: Dictionary = JSON.parse_string( + FileAccess.get_file_as_string("res://library/objects.json")) + var doc: Dictionary = MapDocument.create_new("D6-Beweis", 256.0, "mittag") + doc["objects"] = PLATZ + bauer = load("res://src/viewport/map_view_builder.gd").new() + vp.add_child(bauer) + await process_frame + bauer.rebuild(doc, manifest) + + var lib: Dictionary = manifest.get("objects", {}) + print("Bibliothek: %d Objekte" % lib.size()) + for i in PLATZ.size(): + var oid := str(PLATZ[i]["id"]) + var marker: Node3D = bauer.object_markers[i] + if marker == null: + fehler.append("%s: kein Marker" % oid) + continue + var entry: Dictionary = lib.get(oid, {}) + if entry.is_empty(): + fehler.append("%s: nicht in der Bibliothek" % oid) + continue + var col: Dictionary = entry.get("collision", {}) + var groesse: Array = col.get("size", [0.0, 0.0, 0.0]) + # Kollisionsbox als Drahtgitter (Fusspunkt: Unterkante y=0 der Platzierung). + # 12 Kanten als PRIMITIVE_LINES — `wireframe` gibt es in der + # Compatibility-Pipeline nicht (Godot-3-Remap-Warnung). + var box := MeshInstance3D.new() + var im := ImmediateMesh.new() + var mat := StandardMaterial3D.new() + mat.shading_mode = BaseMaterial3D.SHADING_MODE_UNSHADED + mat.albedo_color = Color(0.0, 1.0, 0.2) + im.surface_begin(Mesh.PRIMITIVE_LINES, mat) + var h := Vector3(float(groesse[0]), float(groesse[1]), float(groesse[2])) * 0.5 + var ecken: Array = [] + for sx in [-1.0, 1.0]: + for sy in [-1.0, 1.0]: + for sz in [-1.0, 1.0]: + ecken.append(Vector3(sx * h.x, sy * h.y, sz * h.z)) + for a in ecken.size(): + for b in range(a + 1, ecken.size()): + var d: Vector3 = ecken[a] - ecken[b] + # Kante = genau eine Achse unterschiedlich + var gleich := 0 + if abs(d.x) < 1e-4: + gleich += 1 + if abs(d.y) < 1e-4: + gleich += 1 + if abs(d.z) < 1e-4: + gleich += 1 + if gleich == 2: + im.surface_add_vertex(ecken[a]) + im.surface_add_vertex(ecken[b]) + im.surface_end() + box.mesh = im + box.material_override = mat + box.position = Vector3(0.0, float(groesse[1]) * 0.5, 0.0) + marker.add_child(box) + + var echt := bool(marker.get_meta("glb")) + var mi := marker.get_child(0) as MeshInstance3D + var mesh_aabb := mi.mesh.get_aabb() if (mi != null and mi.mesh != null) else AABB() + print("%-16s echtesGLB=%-5s aufsatz=%-5s registry=%.3f/%.3f/%.3f mesh_aabb=%.3f/%.3f/%.3f mesh_min_y=%.3f box_fuss=%.3f" + % [oid, str(echt), str(PLATZ[i]["aufsatz"]), + float(groesse[0]), float(groesse[1]), float(groesse[2]), + mesh_aabb.size.x, mesh_aabb.size.y, mesh_aabb.size.z, mesh_aabb.position.y, + marker.position.y]) + if not echt: + fehler.append("%s: rendert nur den Platzhalter (GLB fehlt)" % oid) + if abs(mesh_aabb.position.y) > 0.01: + fehler.append("%s: Mesh-Unterkante %.3f (soll 0)" % [oid, mesh_aabb.position.y]) + + # Turm muss exakt auf dem Turm-Ring des Panzers sitzen (Pack-Prefab-Wert). + var turm: Node3D = bauer.object_markers[1] + if turm != null and abs(turm.position.y - TURM_RING_Y) > 0.001: + fehler.append("Turm sitzt bei y=%.4f (Pack-Prefab: %.4f)" % [turm.position.y, TURM_RING_Y]) + + kamera = Camera3D.new() + kamera.fov = 42.0 + kamera.current = true + vp.add_child(kamera) + + +func _process(_delta: float) -> bool: + rahmen += 1 + if rahmen < 4: + return false + if rahmen == 4: + kamera.look_at_from_position(Vector3(16.0, 9.0, 20.0), Vector3(3.0, 2.4, 0.0), Vector3.UP) + return false + if rahmen == 8: + var pfad := ProjectSettings.globalize_path(AUSGABE) + var img := vp.get_texture().get_image() + img.save_png(pfad) + print("Bild: %s (%dx%d)" % [pfad, img.get_width(), img.get_height()]) + for f in fehler: + print(" FEHLER: %s" % f) + print("PROBE_D6_MAPBUILDER_%s" % ("FAIL" if not fehler.is_empty() else "OK")) + quit(1 if not fehler.is_empty() else 0) + return true + return false diff --git a/tests/probe_d6_mapbuilder.gd.uid b/tests/probe_d6_mapbuilder.gd.uid new file mode 100644 index 0000000..2bd9114 --- /dev/null +++ b/tests/probe_d6_mapbuilder.gd.uid @@ -0,0 +1 @@ +uid://c5ejo72vu5bw2