From 4ba1dd87e8d68a660230d400c09d5625a6863009 Mon Sep 17 00:00:00 2001 From: Vasyl Horbachenko Date: Sun, 9 Sep 2018 04:15:44 +0300 Subject: [PATCH] updates to strike missions; frontline operations invalid units placement fixed; minor UI updates --- __init__.py | 5 +- game/event/baseattack.py | 1 + game/game.py | 11 +-- game/operation/strike.py | 8 +++ gen/armor.py | 4 +- gen/conflictgen.py | 68 +++++++++++-------- gen/groundobjectsgen.py | 5 +- resources/cau_groundobjects.p | Bin 1035 -> 7332 bytes resources/caulandmap.p | Bin 3704 -> 8863 bytes resources/tools/cau_groundobjects.miz | Bin 7636 -> 15096 bytes resources/tools/cau_terrain.miz | Bin 14075 -> 30035 bytes resources/tools/generate_groundobjectsmap.py | 41 ++++++++--- resources/tools/generate_landmap.py | 16 ++--- theater/caucasus.py | 2 +- theater/conflicttheater.py | 21 +++--- theater/controlpoint.py | 3 +- theater/landmap.py | 15 +++- theater/persiangulf.py | 4 +- theater/theatergroundobject.py | 12 ++-- ui/configurationmenu.py | 13 +++- ui/corruptedsavemenu.py | 4 +- ui/eventmenu.py | 25 +++---- ui/eventresultsmenu.py | 4 ++ ui/mainmenu.py | 10 ++- ui/overviewcanvas.py | 1 + 25 files changed, 176 insertions(+), 97 deletions(-) diff --git a/__init__.py b/__init__.py index 0579cdea..0b199404 100755 --- a/__init__.py +++ b/__init__.py @@ -17,7 +17,7 @@ from game.game import Game from theater import start_generator from userdata import persistency, logging as logging_module -assert len(sys.argv) == 3, "__init__.py should be started with two mandatory arguments: %UserProfile% location and application version" +assert len(sys.argv) >= 3, "__init__.py should be started with two mandatory arguments: %UserProfile% location and application version" persistency.setup(sys.argv[1]) dcs.planes.FlyingType.payload_dirs = [os.path.join(os.path.dirname(os.path.realpath(__file__)), "resources\\payloads")] @@ -36,6 +36,9 @@ def is_version_compatible(save_version): current_version = VERSION_STRING.split(".") save_version = save_version.split(".") + if "--ignore-save" in sys.argv: + return False + if current_version[:2] == save_version[:2]: return True diff --git a/game/event/baseattack.py b/game/event/baseattack.py index 0650ec0c..a85b4640 100644 --- a/game/event/baseattack.py +++ b/game/event/baseattack.py @@ -32,6 +32,7 @@ class BaseAttackEvent(Event): if self.is_successfull(debriefing): if self.from_cp.captured: self.to_cp.captured = True + self.to_cp.ground_objects = [] self.to_cp.base.filter_units(db.UNIT_BY_COUNTRY[self.attacker_name]) self.to_cp.base.affect_strength(+self.STRENGTH_RECOVERY) diff --git a/game/game.py b/game/game.py index 7ee777b5..3046b644 100644 --- a/game/game.py +++ b/game/game.py @@ -127,7 +127,10 @@ class Game: if event_class == BaseAttackEvent and enemy_cp.base.strength > PLAYER_BASEATTACK_THRESHOLD: pass else: - self.events.append(event_class(self.player, self.enemy, player_cp, enemy_cp, self)) + if event_class == StrikeEvent and not enemy_cp.ground_objects: + pass + else: + self.events.append(event_class(self.player, self.enemy, player_cp, enemy_cp, self)) elif self._roll(enemy_probability, enemy_cp.base.strength): if event_class in enemy_generated_types: continue @@ -141,15 +144,15 @@ class Game: if event_class == NavalInterceptEvent: if player_cp.radials == LAND: continue + elif event_class == StrikeEvent: + if not player_cp.ground_objects: + continue elif event_class == BaseAttackEvent: if enemy_cap_generated: continue if enemy_cp.base.total_armor == 0: continue enemy_cap_generated = True - elif event_class == AntiAAStrikeEvent: - if player_cp.base.total_aa == 0: - continue enemy_generated_types.append(event_class) self.events.append(event_class(self.enemy, self.player, enemy_cp, player_cp, self)) diff --git a/game/operation/strike.py b/game/operation/strike.py index 85bac18a..430235e0 100644 --- a/game/operation/strike.py +++ b/game/operation/strike.py @@ -47,7 +47,13 @@ class StrikeOperation(Operation): def generate(self): targets = [] # type: typing.List[typing.Tuple[str, Point]] category_counters = {} # type: typing.Dict[str, int] + processed_groups = [] for object in self.to_cp.ground_objects: + if object.group_id in processed_groups: + continue + + processed_groups.append(object.group_id) + category_counters[object.category] = category_counters.get(object.category, 0) + 1 markpoint_name = "{}{}".format(object.name_abbrev, category_counters[object.category]) targets.append((markpoint_name, object.position)) @@ -68,4 +74,6 @@ class StrikeOperation(Operation): clients={}, at=self.defenders_starting_position) + self.briefinggen.title = "Strike" + self.briefinggen.description = "Destroy infrastructure assets and military supplies in the region. Each building destroyed will lower targets strength." super(StrikeOperation, self).generate() diff --git a/gen/armor.py b/gen/armor.py index 7ba55402..876fa13c 100644 --- a/gen/armor.py +++ b/gen/armor.py @@ -100,8 +100,10 @@ class ArmorConflictGenerator: attacker_groups = list(db.unitdict_split(attackers, single_fight_attackers_count)) for attacker_group_dict, target_group_dict in zip_longest(attacker_groups, defender_groups): + padding = FRONTLINE_CAS_PADDING if FRONTLINE_CAS_PADDING < self.conflict.distance else 0 + position = self.conflict.position.point_from_heading(self.conflict.heading, - random.randint(FRONTLINE_CAS_PADDING, int(self.conflict.distance - FRONTLINE_CAS_PADDING))) + random.randint(padding, int(self.conflict.distance - padding))) self._generate_fight_at(attacker_group_dict, target_group_dict, position) def generate_passengers(self, count: int): diff --git a/gen/conflictgen.py b/gen/conflictgen.py index b7dc71fe..30e4a53a 100644 --- a/gen/conflictgen.py +++ b/gen/conflictgen.py @@ -152,36 +152,48 @@ class Conflict: @classmethod def frontline_vector(cls, from_cp: ControlPoint, to_cp: ControlPoint, theater: ConflictTheater) -> typing.Tuple[Point, int, int]: center_position, heading = cls.frontline_position(from_cp, to_cp) + left_position, right_position = None, None - left_position = center_position - - for offset in range(0, int(FRONTLINE_LENGTH / 2), 1000): - pos = center_position.point_from_heading(_heading_sum(heading, -90), offset) - if not theater.is_on_land(pos): - break - else: - left_position = pos - - right_position = center_position - for offset in range(0, int(FRONTLINE_LENGTH / 2), 1000): - pos = center_position.point_from_heading(_heading_sum(heading, 90), offset) - if not theater.is_on_land(pos): - break - else: + if not theater.is_on_land(center_position): + pos = cls._find_ground_position(center_position, FRONTLINE_LENGTH, _heading_sum(heading, -90), theater) + if pos: right_position = pos + center_position = pos + else: + pos = cls._find_ground_position(center_position, FRONTLINE_LENGTH, _heading_sum(heading, +90), theater) + if pos: + left_position = pos + center_position = pos + print("{} - {} {}".format(from_cp, to_cp, center_position)) - return left_position, _heading_sum(heading, 90), right_position.distance_to_point(left_position) + if left_position is None: + left_position = cls._extend_ground_position(center_position, int(FRONTLINE_LENGTH/2), _heading_sum(heading, -90), theater) + + if right_position is None: + right_position = cls._extend_ground_position(center_position, int(FRONTLINE_LENGTH/2), _heading_sum(heading, 90), theater) + + return left_position, _heading_sum(heading, 90), int(right_position.distance_to_point(left_position)) @classmethod - def _find_ground_location(cls, initial: Point, max_distance: int, heading: int, theater: ConflictTheater) -> Point: - for _ in range(0, int(max_distance), 800): - for _ in range(3): - if theater.is_on_land(initial): - return initial + def _extend_ground_position(cls, initial: Point, max_distance: int, heading: int, theater: ConflictTheater) -> Point: + pos = initial + for offset in range(0, int(max_distance), 500): + new_pos = initial.point_from_heading(heading, offset) + if theater.is_on_land(new_pos): + pos = new_pos + else: + return pos - initial = initial.random_point_within(1000, 1000) + return pos - initial = initial.point_from_heading(heading, 800) + @classmethod + def _find_ground_position(cls, initial: Point, max_distance: int, heading: int, theater: ConflictTheater) -> Point: + pos = initial + for _ in range(0, int(max_distance), 500): + if theater.is_on_land(pos): + return pos + + pos = pos.point_from_heading(heading, 500) logging.info("Didn't find ground position!") return None @@ -195,10 +207,10 @@ class Conflict: distance = to_cp.size * GROUND_DISTANCE_FACTOR attackers_location = position.point_from_heading(attack_heading, distance) - attackers_location = Conflict._find_ground_location(attackers_location, distance * 2, _heading_sum(attack_heading, 180), theater) + attackers_location = Conflict._find_ground_position(attackers_location, distance * 2, _heading_sum(attack_heading, 180), theater) defenders_location = position.point_from_heading(defense_heading, distance) - defenders_location = Conflict._find_ground_location(defenders_location, distance * 2, _heading_sum(defense_heading, 180), theater) + defenders_location = Conflict._find_ground_position(defenders_location, distance * 2, _heading_sum(defense_heading, 180), theater) return cls( position=position, @@ -238,7 +250,7 @@ class Conflict: def ground_attack_conflict(cls, attacker: Country, defender: Country, from_cp: ControlPoint, to_cp: ControlPoint, theater: ConflictTheater): heading = random.choice(to_cp.radials) initial_location = to_cp.position.random_point_within(*GROUND_ATTACK_DISTANCE) - position = Conflict._find_ground_location(initial_location, GROUND_INTERCEPT_SPREAD, _heading_sum(heading, 180), theater) + position = Conflict._find_ground_position(initial_location, GROUND_INTERCEPT_SPREAD, _heading_sum(heading, 180), theater) if not position: heading = to_cp.find_radial(to_cp.position.heading_between_point(from_cp.position)) position = to_cp.position.point_from_heading(heading, to_cp.size * GROUND_DISTANCE_FACTOR) @@ -306,7 +318,7 @@ class Conflict: distance = to_cp.size * GROUND_DISTANCE_FACTOR defenders_location = position.point_from_heading(defense_heading, distance) - defenders_location = Conflict._find_ground_location(defenders_location, distance * 2, _heading_sum(defense_heading, 180), theater) + defenders_location = Conflict._find_ground_position(defenders_location, distance * 2, _heading_sum(defense_heading, 180), theater) return cls( position=position, @@ -351,7 +363,7 @@ class Conflict: def transport_conflict(cls, attacker: Country, defender: Country, from_cp: ControlPoint, to_cp: ControlPoint, theater: ConflictTheater): frontline_position, heading = cls.frontline_position(from_cp, to_cp) initial_dest = frontline_position.point_from_heading(heading, TRANSPORT_FRONTLINE_DIST) - dest = cls._find_ground_location(initial_dest, from_cp.position.distance_to_point(to_cp.position) / 3, heading, theater) + dest = cls._find_ground_position(initial_dest, from_cp.position.distance_to_point(to_cp.position) / 3, heading, theater) if not dest: radial = to_cp.find_radial(to_cp.position.heading_between_point(from_cp.position)) dest = to_cp.position.point_from_heading(radial, to_cp.size * GROUND_DISTANCE_FACTOR) diff --git a/gen/groundobjectsgen.py b/gen/groundobjectsgen.py index b4d9f16b..ccbd4220 100644 --- a/gen/groundobjectsgen.py +++ b/gen/groundobjectsgen.py @@ -13,6 +13,7 @@ CATEGORY_MAPPING = { "warehouse": [Warehouse.Warehouse], "fuel": [Warehouse.Tank], "ammo": [Warehouse.Ammunition_depot], + "farp": [Fortification.FARP_Tent], } @@ -40,7 +41,7 @@ class GroundObjectsGenerator: country=side, name=ground_object.string_identifier, _type=unit_type, - position=Point(*ground_object.location), + position=ground_object.position, heading=ground_object.heading ) @@ -50,7 +51,7 @@ class GroundObjectsGenerator: country=side, name=ground_object.string_identifier, _type=random.choice(CATEGORY_MAPPING[ground_object.category]), - position=Point(*ground_object.location), + position=ground_object.position, heading=ground_object.heading ) diff --git a/resources/cau_groundobjects.p b/resources/cau_groundobjects.p index 4a47c810f23ae2ca0a60add36fcdb859acc31ae0..1cf0d8a63764de57843579f3fe077553998cf70e 100644 GIT binary patch literal 7332 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 IE=F_Ezc@Klv;Y7A literal 1035 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 Iy}fn+559ff=l}o! literal 3704 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 diff --git a/resources/tools/cau_groundobjects.miz b/resources/tools/cau_groundobjects.miz index aefc0e55df5af9c4e1810311db1b4e4613b0158d..6f1976f4f218edd3eedca6537a247454a7b31f1f 100644 GIT binary patch delta 12988 zcmb_@Wk4KDvo;PvmjrjW;1Ea%!QI`0OR(UsLs;D1T|;np2<~n{g1fuRh2)&~zW4k6 z?au60cb9ZM-BVpXJ3IOD+5wQ0goeR@fPz4PfPf%@aA{FbgQbFi!19NNfPb#BFtxKY zwX!@&)v}uxiSs*pc&pTKnQ?o!rq5)ee)(O0fKFV-k)yiHoAQ@_AXzoVMo4A#lLw^d zFAze-H!xgsMi_M>1qGyI>-NN!3;qz;zs;TtCp_$NZF}meg-hb;9&q6nf7~)<7PsUL zvr6~tJHKwN$=932rRc`CA-YV@Q2z-EV)PyOsGZBg)L|{~3UlK9_EHEj(dw85tBrW$d+QkP zA*vm0thF)VE_>(esXZJ1k@CP%TfGj>zopD z&B=PHv+ev+k4R~)g@I2vU}LyaEHGG1X47Q$u*t0L`NgI4c}N-u_Rf$ojnUS23~n9A z(;u9rrlV(cz>x;pVa9$S1?k5f0|mzAsBHLXy7Jn4puO6$Osf_gTf6pf-+xd=Sy;Nj zK8zL5B72>EJ;1yJ5CU)0vsA6VHtkp1d$$r(PK?Xlo?YMRa$U3HpngGm>R8_kE#mSV zUY?*x3lj}vk|iRF7Ehrp%#ECLzMa}RO^FLT_vE2Z3%!2AWuQ+`8PRUJv0)~Irp@7OH~QpCFxW;3XP3i6O}de{_@kyr#3M^j_p4dv&G=3<4fV^sLA{~ zu^(e@@myZEiCW+u7BL4`IakLO(91NFjv@#RcANZ;wYDL(7kl;CQ!gUSf-W=|Gr9G<^bheQqRIZVtH*GR{0&Oa~(rgHyBw!4q&Os`t%t88n z{Kl*Q`HXx%<3`}UV}{`c;)daC?72Wc?71>>+_`8{QG|93<#@2mW)|ZDHn+0#*m(mg z+J4&4nk?tueA}xS`zbwZLSmH7e_S!fXR%`qN`^LC%aY^iDY2BIm`LthW^p^=y19ZH z3#-h{T8bimXio+_T$}V}w<{Ja#*AiX(wRE$xY8D_zKT2wdYn{#sF!UL@9CUYEaDm6 zGV<4p)|~U_-+-WO|j}RQmHZ)NkxW5Moxb7?Nf8-dr9#V z=q{T3n`U3Q(AA@do)g^zo=CePHeh+~gDRXUWA9!y<#IkS_VqM73da6GaD!MA&$nw( zVUWUzVJ}yknlJ}^?fg(V;wJIr)~t>^POp)vZWXms+cp8NlrPGWCm5$$vz!p;4zl{q zbrMDOYILJ;Jg@J4nsS|UR*wAZNgCx$d4QVJNi@E1Z6bbUxqFsFeVhXpPi^6MO>N&c zY1+a^{9FkDFPAhl>X4&3c@UdJQ+k|Inw2D#PP5~x&-t{t{U<{aU;k@YgxDENT3e$AInq=sz%&^dYON>>Br?!7_*tDESh|Uo(V@zJ8HSw&))VRb!6FKCF zmEOZ(FAYYt>zLB%vrx!XHag>imENyvA8lxn3>%LA+V&1#U(xBTf72N;Y5nbb`(A#Z zhXN_Vz@M^jqkKAG$NBxMw{h9476I@fwM`9YcVL#$8*Z@lF{XyYlwIw2=El+w`?*iY zwLl@P{$5>PQp8YAn1Z^d#BVgk_=0jfS<$x%-iz^fjn_w78eCL#>J84P?7vfU-A1jINlKw&wM(c*)I0jw!N4VYj^2H89L0LZ=jxS zU^BVPES%CJ$7G3&Q&B57wOn$KD_!doOkq&JsyyK6n6e_+9Vq|B^!ZNLc+-K{UK0qS zzzq8gr{l|KZ;Pxx>~o+bkR!LP=d(l8 z5=r79`Da01WCUJh&Co$1MHN1@WZ(6KNK2X!G*|i~dTj?NG3k&?5b#-y803>Z zYkZql!&PyFwQY|3r+^3MmQRpml9O)Ey^{mG1B+DQYq&8wIKIb7%qht|YnSYW7&y9S z`MJ#R6&0Q9mWg~&+t|k2*!n+?l+iQ_QoHoWE2uQihjLFiq=`THRHKibImn`W8CU6P z2ubu7y{en4@kslyY(an29X-3ew@jstVQ1RTUb&t}3>~={egdp}x^jAQ?|xHmM?(aSNI{W?-mRQ~<>lyye!kMicPY#of@wJ$TxbH!No6{(PpOX&TCW2Bj;aC?IBr zGM=HIvI`1k6QUzLnM^P#w2`&EV+M0ZYm%@HVHszTRGL907(iUb{FGndMkd^;Zj;WP z+o6H!om3$zsRQ711-(KXy+TY^sNTHeR-Q5;$1(0@VbYTqp=nd6D8NV(f8%X1j{8$c zCGwof@6Pe_7ETz!+G@f>U0C+LHQjV(eD8Wl z79@K2xPu8l(!CqLFzRHm@ znL4bPhN@+9F(LvW@((>)?8Sn?KlPazOa_lH#KaYa%GeY`_BHq3t4`BVshg*bOxkN+GM*|(a zx~aD8eNkp!ua#3{-rk3(TlBXjpjg+M%y zqi>lp>46IO6*;aLh%;P3)wS9mjn%=&AL&qVn}h&Z`!O&1fPIK5FX2B+j?bQ%HD@&x zVSwsoz#jO1Ac*RiS(0^pF5tCkHAx-C1W&ICOky(}E($cR90n(vps083v29EBggi}D zK`ytZ4Y33~Kd!2a4jsq{WYm-qG8U<%firBM&?w1zp`*ZBj8M{770z1M=+r9T{ZkGO zqiYE07>(5(TFI7T_=^Zae;p#EV&DrPutpW1%r))kkdf@%0>1~yi`Oe$lOJ5lca!z+ zzw1}S>G#TdLG^V}mVY>Fb&UVpL%|&qnzbL0QkYrDSyFZ}dVaR}uP6~}={qZn7~c7b z&WRZ$mIts}WQQ24!PG$wYj*DF0uA9y5P_RoN2jaXT)5u~hs5B1aFCOBeaW!nJ0o$- zF_uOp@Y$t9Q(f>M=jZEH=1VYxA%!7jA~96YnE>PlTyQ|+9OKh?l%aeeGeVzZQ-o9q z(iTM!)DYwl_*ZP&%?eoVU)K=o5kZPz5+9OvV_~uU%mgjhY%t&@hc_`h{LwU|t;e<& zO#q7jI}!7 zT7-JDw`_hd{=@pf1jghA+2C&jEeSQ~q?0t1)?m3i5<`$r1BAerd=i+XzuqTzz-Maw zy^cX3TTJ6GYALwA5x)*z$ zg#}3>&^1I9G=7A(a|IocgM?vhNk*0Z_^A2df?Uzi5?yypxEiF1dX|By3|HSod_TK0 zXL}pTc+>}NwXTZOr^ zbe#}kck%p8;4vwBHCfbhXSt)SrVG+4n^ z4K((nOp7#b+MfYfq(n4wQTclzT9;S*amY7Om=#t$Q!icMB)L^r5=ZYGCS@eKJ2t&G z`S&G8{B>6A{|!Apnv`j{an2&3Qy2kmg@u4YZdgcCNioBO&6v+k>Qg)jdVyOqUJ<_- z5cvO*-i7u0uel(>%|?F`0+6h~@=@!=lxOW_s;dad<06Y;ql^U4ZIKimFT6sHYTO{{ z#Tb3>r`0#x0)hO4oLkMBSO7kgMAgGM>>@SNn_C_fN{^kSP|_g>Vl#yJ^pL@UygpD3wKuStC>QP=)7r!CG z5{#cV4^K*evhWHtXBueyi(r&HKx^mbSdx22@$ayBMHF_j^}HTI5b)#^I~IFICFQyS zeGn6eo`}6ohRpxn0o49_Bo!hvHO|@ZpE!Wl+G+RcKi7c-x81YvFRlZIF}JVZBEPES z?^VMW&;CyOEbj4FoV4*X=;164PIs>6>ggn1Bz}d@W+Cmy9@XLe$i((5d>IeUqrP80x^H9K zF$N~Eh7U(1sggMayK^SiuzlyN z+8`u%OQE|-KtDo*V3Kv{@+Tj0P>UH9jy5uaw(d)&r1c6*dpXaM3(<%5;_u=Hq9NC$ z3>U_y42Ru{c`G9(k$@<_NtuDX;+-I7C+SNGX^FwYh*^tn+)qc2nI*MH1BSKyu{=m$ zztba^f-8HN@3hvFO_X3v?`52kxxkG@sII~R6eudPQNykz{*x_%(rlC&v5I_iakCWL ztJLCP=oASvSob-qnPlS-xF;|WtvH5xN!C`d`J+I~3 z!eHM-jXoMs_v8d&NiA9`SU05buxyz@7dcxAWQwCoOGVb(gdD*#nFC45peO;rK;tst zD#xvmf0&2I4I-(WAra&!`8U;Rfb5-=68$FkU-?cf*w+Nw2-%31Oru2jos3Y-2Z$J! z9bfE0I)1@SDK6}7_B7nXV~cddGVMXnXk>6CGED%!XeN0x-8hWlE@ieHiK3))*)oq0 zYCB8GX)7SGno60I;D$S*VqrKGvSg&gsl5LGu0qkY)H`v z)AGxnqom0U?Iupa;`fT{-RK8|);h#1MBjVw`|%VVnicf?6dV~75>NR^Wk39q2%Wht zYSZFj_8p@M704|{>0#;@>wn*s zu30<6q(<{a_C~nl8Wy8vXl*1`btCgklHos=gN_lw&z4ue>C}Z%%*4@_c%KB1?huQd z>_i@%A;pEvDtfXodqTc!%j`Ck?Y8d~B%SIOdF)Z!nMzih+5sCt8&lrGCrW{pjDhF+ zq-)=6C6Y8MpA8O4fH`Sg>}^K@yBcktgLnD$ycu@eeh-+K0rD{5o6pN~WvBuD6zOo# zgb`r6OZzuLO6XSZRefFL=`S^rVj2>qArvRah_FJMAi^?`RYjPTQwhl`y(iUCeyasr zQXeqUW={;XLPiZWE^c&V=L%laMT${dVL>2X)fFsY8~H z@_8(BAY5QK{1{CZ8N)QOl2Epu z5H#ZE=Gb~*Cp7P8UdXcUO@BU7Y@h&Gp!7ceuxNJ1t(}Djx*z%>Qx2-XdIyN1R4t=E?n!T zgGsJ&Iq%kG#}lbhQ5NL}zQxr#7ZNU8dfzA8Mo$q$U$*KTf5}6^U6S`}bnx^J`0ows zGbRxWsz~u{Hhq^vsL=DJnDYdF+f_u43E=UG>vtyJz6X!=F50DJ{!F(Je9_imTV(0Y z_Kr<~CZ&M#lO|wGtN`DJtLmU@s__#y_q{>Xcub%}_0}lqusyLchIBp(T_C!qPaEzK zIc-RmH|bE7EZcR;{-=CgxCK|TitH#DHZNkyWfm%OPgq)?&kT!%J+ zq^SwQSzbUri@cq3Ld4gZtA<8Y*a; z#*t@b{=Z4U#pCqElpNzm`EJrgH)D5!5yimqqfn|a9qZJtlP|vF>qe9OARRyVpUkqbu zISZLj1FXk<+Q5Ka#ZZIb4CfQ&*w}~Q&rO@Q4)rj>_fgX9a>W!>;8*w-6%>}B!umjs zB1jixbaz0pg~wU4@1?{Z)t?p>1Q&%!;gu|!@iw_1OcBea(edsw(*mSmgSnziAPy@I zD@GS2>h~rKxm-`o_l*5EH!oxby2y!-4o=)i77*|HDF%!2bBKI2R(gmuN`j$y1@CT@ z1EJt6ZOLajfQQyXuJw3qhdy=9io^YKWbLT$_wtuIUqKF88s6k`3(Gkk;)k6r&*`f+ z`(vZozf!;_^pzdx0c=6vxeLR-5Esmel8qM6GuG6BZn0(8M|$&ea!WV z3;?Ymhl>Q1&E7c+kxS3CJ^_8pT5d#Dgmp}dXHv+xp1pl!pjOwW z<^kEBwg|_>s&RWGqnJ%b>0%>YsraN5F?rhh41z;NmA?J(o>}f#Q^flB4=dN3Eh>Xn zrwpu7^}IgoBfJOGFA(7b>6lg*{hH+_jUr$&l@VCeQwYX2R5>vZtu~$ z!(}Q%Y@@j;vS-KothuGl9;57|pnBJwS?^xC7W4DnO4qLW?^QDuIR|od4V|5}g#cWI z)hWEq#K``^=A(CMQma-Mp6>I^!JH$@MzeQzblqeg(KXVKtQ*K{#C_`&M9rzlE!6L* zOH)hVOg5_>2UmHd@+r?#B+c!K2Ni=i0>ubBj^+g0MhUV%h}i8f5zJiCnS{+4n+?TA zMzZ*@Sh7zNm>UEJvg`TaZcGrEvjaUQVPntCmK_90?9cQ=vO&3<9rDoX5Zkq*U6FU< z8XmOX)?wY@l($aq!J*o~^zU->B_dI$kVBl`<$#k^fw0@cFCue^y12;PAlw3a_u%|V zt}Kz@efG!w@)eWtF{12GB5n(QpHyDxyV@SJtxKGgu4Lom;>%ymO@PzFy?z_hxTDio zlfA=)j|=5||EdnbFKqr=6nB=7{n`{IAFri6N#V`dexH~hPWYx;=CgYtn>a%@_?v3~ zxVi^{U-(VE$pvo7GK?~5Z4(>GGm>Cat;#aYcduUPubY=vVS7&vm_sMGQVdlUbovSa zzIgytvVlZ#D9xCHc=%$%Ywu^REJ+6JJr)TD;AgrVu>0z06_%;qWCORf8(Q4uF-63P zbxme*)jeHx7@Av1K<8?3-n||A`M4XZ*~ZRluy~W6RRBSz0LINA@{#EyQgwGBXSdeW zcIX&>Hm7A5{^u9&2RDO8H!EadXf>4WTE$B0m7v}JirKf)aYs8T@w@pSu^oiw_C4ES zV}!NKVJHm-XoqU@dWvYh^_hsSTM3FCxZzbbLS?tgrM0sL3#y@)I0r0qYaIJ5)Gsi* z)%K*ol=b{%U*z`vcwa6A?626iF+~rM)V5Y@d_=C`2Zuc0#Hj$lA;7zO_iF?F?*Yhc zA>ypypq>`C>I7o9&sL6Zr3>OSzhR0t-N`V_bkkzoU$vZz}Hb?w>r(^ zf%Vg#1_$6P!Q-ziUXg#eU{GxBz*5z*+!cd3!n>-I8q)I$w8P|?zF$NX!{HKH*?UbQ z#z?aHEjs{`wKw5oB(=H`(A+0DN!`i$#|LnU3hcc^jM(?AACOroi}4Njn0sR~1V#Kq zP-j~OH?JoR&`=Yt$<=dwFeTKF(IV>Q7KEbI+c4yL2rGo1nQ#eNxz;%dSVjL4Xmsiw z{euKS1)u*vNRXaQ6WZ>25dv6=S;8X0Ay~7m!rix1MD!I(QNJePU+dScEK?J+(NTmZ zyxY0iO*cvw<}isIBg=kfUhosfdZF)Xd-b=la8sT;ZS5~SZ4&uOlkwWfR^4!_ML3T! zcyRO&cLp zq`Ou14(b*&R`tGgvQ{sWVR}~}cz=oPGu|>I>z~p4%)rW~RyfeJ;SK2I9bhFUUYa}P zqW;p0gw-(oD|S>MjFmD#<7W6t&j-vPU>{EI~5>!KN7qS;o_Ji{y4#-D*rF0Yr&qCRwZYw^5H3k%M^l!FZ2 z_yu|?{+^rjCjOpw(N=0FaPl~b15cz&hhoA&enz?)1&5G>_Hv=&sSzliX4f5Y+K*c2 z!<>+XFGp_Q$>H{debOKuz+Rm5c%7HD#@KA{Tl0{hWTIHU`dN=+AtYU-vM+o=jAoS| zj=fYOJj5Rio7Jijc4mJ_jFDw@q5&8QS7dS~mei&7PZd`7Ezhr;Caj-6KDE#dvGDTN za-VLRvWl}=-fEo*CSuwEd6zu;?#o z1n4+401mF67dsUIkosu+)UngJXX#Ka0nj-;vErlpPd*v>+d?&c+G)MHx9hwr<<+|4 z**E$g&rwywz43bpEnv||XFJQ8Fa*r-(CbwDHokRha}j_Cr8IT1eSace$OL&O{@Jb*OrFs97;Vm3+evPh(l^! zs9O|?=dBF!1t0AS;-wiKR0||q_KKP{I2QY&wb-%dxhiN^QZ7okQcO0BM;s0wS{ZpA zzQqpAsecXx#)mCsxv0~J72{nz8wju-c!!6VoOs}4oy;b@MmU@d)f+pqA62nA98OnH z&v)tW;w_!dT{t#GgKh~jbQR7b#)&i!P*TQJdH@zS(h4cJ$DQ5t2$cf62inn-@axi&3Y(IhdYK2nX0Gwtei1f}&dSt+mc#x%b)WLl zfj^_HywQP^Yvz7;C#hPdFmD>}S@OxY+f2$$)=+YMCzIQjD)C53sVvjSX6Cdb5u(?_ zGCWRruO;SMBfoK343{Ep-p?kh&NS~;Mx$O?PJPpaAK}q-a50Qy2Oc=i?q>{TjodBrfW$8 z_`e58Et2}2XaI+a;K$FL9*&tiH`nf0hwG|Pu1_~j1~&DJ_n{y+7gt-?OSjrrm#V}P zScnbv!Y8T&=|-)F=N8No4RKE@#fvz4T84E%1?oE2^~eaJmWTWFG0HrOiE$0S9PjgY z0maDI{&^tvipO!zELt#&aoeTm%_m}}(D(1NSyv8ZF3=Lai~-)n9idIAeF z-C9lc7ey;K{BDje4mPg0HGt#e<-VcSOyvT!gCuVnsq2;_3F?d^Nl7WBy#tzsI<+m~ zr%yn-3_D@nfyUhETvUvc(?G*|&*FxamQIZ31t~DQl>Q8MJUcM(&i!d+|6pgzUlu$6 zcT3of=X%54hunqX?Avacbxt97pyB#>?;&_`<6<^VMrDJcxD}k$)M1|d<_frEG^e&c z((k&PC3d5J+CP@)%(}U7R3lEf>T{x_?zFK-?v0Xr(f36{r@K$KR@}&W>bbG1PiX&n>J07AV`oy_=hF{x5D@Sm zqOH-0fX~ua$s_hGiT1-W+w7&mZDm zP3{d7RsQ}orKMA<9c!h^IX`vlS%1@XZFaJ`#2LH=v}$?W-On8PkIb|#l-3-@5&N6> zsJ8Ml)wy!IYuq8UcQIKf|v_J<5KIB_Q)?5H}-8}eEEj2 zCkqH~!1FBDBqR)e7&4_-P51Tezei`0z6257@Pv38F1*j7O-zICXJ*(TC$@EEa^oG2A&Pwujx%47xIA`)y2a$9Oep*fP#_zSejkTqj8d5;2 ztN$QH|Gi(vteq9#1t>019Dy3cF_M(cr<}4X6Y+bpKL8vL1u;3&2AFiZw zps-%`C|%vC(JMsf%OH5&5^gUID(CPC2_XS&^?ou#Ta9G?&hWy<3#?>tVGP^ukU;2| z904`>N64zu-AGJ--y`m%Rf|Ha=`l1LI{GG5dxThs)g~l@i&p}KFdlXVTm}H$FJH!) zU_^0R_Q?MAa%_-J=T-bpmnj-LOUqf7kk!;z#UBuYlsaAFCz+T*0yVT3Y0Svq8IOHaI+GG0cVqA6l;u|}z|0E~M zHc=?NQG2Bsgn@OI?So`S)T#)`o#Yqu1!trZ_2la;KG`(SmZaGbveUdt3iR_i5o{k* zq{6YtkC+ugS^lI%#5A0S3)KMA{f3=`w%Lx4NO6|CU^lhDtWT3RbF81m@qI}llr`)Q z`L0|JfAsJr+Y&O;&!4@i#y90`=17D*pFKUbi(LohYgv5xwN()E%f9*m)Kym@)S%|2 zbb?ymQUEzhgnj$>P2JhvV^c!@aA$6n-sy& zJ)1;`#&h;9WK0OXR)=YR*r(`Mba-=ZJFH1+42`hJfwV1IED_AFJ~QKFrndD~8LW(J z*dePJER41eN9Jwc3gAcq2EAfMQT-(fAJrHz?cC_F%<)KUik1Ui>bA=ZeM=;UwM>-V z%8*r1t$)$#1|dtte$|A2yzCVi>0t?(LNF5z&=E8vTSD?@|3x}*nz}iP_0}0ub|Wd>@ro z8k1@BNYg0o&?{o6X^X-TRC;9aq&`-QpzD1Vwb8#tob1^il_4pj5k_%m@MFV7x#>tQ z;ptCYM><|hur4oGRxF3*%~4R+C~^E%l{&6NmJdOwxg6eS*?D4n*wtFU~Z?l+H}5dLXiu)B{#&ToyMzuQ1~zn$PsW{r}5 z(Q&FaI#CDymTnJ}eke{O@}X2Q``}oDDLUB?X|A1|&cru^oGp5XH5^%)Ualrinfwl= z+n%l%70{D47Y|FAOT4zd3lapi_G+vhjv*N)68Sm{B+?E704`E)y{Qz=K~T=6o_c;R zLaD=+wEy5jmz10v(r-r$#;^u&#Z0*+)$2aB^afv>@1dkH7W#$YCPusH!gZ>RIh%3S z@neDRF5#~#6Y=k`_of29lxRt&&|q}>!V$lDt@(kfpZs9Xh@CkS*j(TC(-u1?1|z`| zxbogtHv6630Z_SD?vu;$q=8Fj89LcD00 z*W$qVxWS?x3^w6;_sK^T*A8#FwX zw0<(X1vPtS0N$}u5+joV(<-22DtYq(wnltSFR6tfdD3R?H1dGErZlKuE5_nrchS>o zt4GG_#A$)a{T)+b-XYNBaZ$obrufk8UYo4E<->aX^QB8vtb}E@2&U+l^v^;IlirE^N{jn)M)$n_`AikuY=F7(U z`Z!=Qw@dq@-XlUR|B8(L%Gz>t6X7MlA|a{AF`($#}4_ESv0vd#4Ujz;7+NBJHoLm0JG=sARCbFq1|oWR#=Rg#Fd%1H~}P z0)_IgdXyqQ!>ktxF}es~NT}yOh5vsv^*=gk<@DLcUL~5q2#~-;AsYS{T{SFZwKVSv z@ZVh^Ua2NK93APb@vQRmI6o9RD+k{~&j1{`JQcDhZ_+Z`(C&YR7yZU4dfuy(c@tlM zBi7pMp$cH-(m96aJ8&vFIY05a{7&?j z{lXxgZ7|PBOTJn6Pqf<%wA)@+K-+PF`Y%i5MN<*a2R4;4c#l!hTv_MaSQDIPqh194PM6<;ciXE z7u+I4?|;?j(f-vCN$J`C4t3?(EqG6Ra^C55^a+MPJ&3z0uVgs=)B91;cZVss9^LDy ze{mdn|7$9yiR};Cb3A)ZcD0Pc8;t!mj+|5V9R7z0sQdRYFNu3}I3Zr;drVV!r2qQ6 zNOTba9l`(R@emN$&k^e71^MTbjwO^dZj^9QiP?E?(UZQ z@c-WX&UfB-=FH5!cYgOb_sqF7=iIsQ9F;=oYG7i40YCsQ003YDltr;w2oVDSKYIWG z(7nak5e|2Bb=kF4gHMZ7e!ns<^zbt2Y~SSvv3m)YeQ{1H)y(G{%X`Z{X%opZW|1In zc{7jvsu`TEDwkka5Wl5B6}j4sto3KaZPO5onrUUcc5*wK=w-S&_oN<{B^UdGK+V53 zT|zrtsGJG<83|upc^s?_1pPtDyA3*7#tO0u*fmnR{_26=0yD=MZnf1?Wy2&VeGbhR zx{t5l`SxYBq!wff6U~Bdzu3|gyc$oMg0&JfxLDE#2j&LOcn1}`m);3SE?G~Z5My=Y zcQS_sPyML0wga9X4b{5NedF^+EDTzZE{{nGpR~MFqvm|XEL3vEKTbmHlnWY6#9ucB z$tU>;%%{A)@*6yLoNk&P7>7-F`k9xu-lT*r z&5spidpo<#NCG(*VMhqEFqgh@nuRv<7+Wg=0b?Z_UA1|JF1w7XZg2G^-&q-2RRJp; zG*5sQ=izdcsMCb^#J*}jTaBmXzWuF((k0Gg$T!-v$mZAW;dBS}t3mz}GAobHOA-tX zYA#JHV?2ZQ6Q$m3?}dN@qspwl@%d$PT!iVcx^M;12f|s;f1M&`>at~r#GS*6+c>b^ zb43DMpsyP&&~dguidXbXJB&NVAZA;eiEm6`KG&ZD+gcyPmk&?ex3Fb)2Of+MI6*HQ z^#-npTj~NeJ4WQqSR-X4DBpMdu|Or^X}%nN&vWdo+MZf7rYa;B6)DU6^5?VsS=Cc! zCm{-Mhs;oK?&(s5^6$7jk6cab?~HlRRbR$OJd$r-)a1?QA{ULsZ_`EPHsWu3P+Spm z+8KXMN=VU~h}B2$`Tog1X_&{RuO>=>cpMr1=eb!ug?r8n#c0>oEJQ*GbfJ-@~) z5I#oDNAqG&%hi-^_Egb#i|UB2@bpT`QJc~LaE9soD|BcP3O8b|XE^y#iJG-ZO67*g zx(teXT}}!wPKM~&?bj}&tD-6xz9v=C1n>g+p9V=zFn%5PTdOPN`0gm0PVA{S8ox_i$dq=W_Rk3WIhFjgVy8H8ZmkE$h#A3a$6* zDfVCJS$O@2R3p%;nN5vIUv=lsWZ_WNVsZV43IWy6cFXQ%dA+}}R?TP#G2pzV;cQ_a zb_@zs$zek)>NF(=i_g@?%fyYz#BjKQ!>_auZ8{I-Y}eURFo0I-fS?pIn3Zyns2FQ% zQw*T)VcP;bmh}%tmlA^aF)VI8yNeiE&_Y+cO9guNcY7`ogH${^$ydw2lH zke;0;(vxARs6WLx&cra2c9om?6ZH6_7*obNq2wSf|B^4JTissJG-jTsPN5a_>pp@^ zI6Zui$4@+87C%Dtr&pBBa5vuZYhXCvD0CxSMd02xNba7GO7cCyP!2K=o%Z-CwaI%&)B*?evNCj`1 zE*nKS$z?IvkGqoSnrO5jDnst+g76)e674F%)pv;-=^}Dl>RyCCArDe!4eUtZ0;h$Q zvPt(Ub5E#cjk0&VoYvB6W7Mk5jxotbnz$C7FL3m0e`ZqQVq;C331pWrL^wc*d~+hNB{C&{wHj3$q`6fk<#eb0_tZ z_9c+^ZG6}aNOgsIMB2J5R^{!CLJ4JunEW>uO+;0=RFn&?1j96zWWD-U+-!M*A}aFU zl*}oC$+kQTbh0>;EvzQ|R4K^Ir}cwUMuRP$BWIskzI;LUM)gPkmK;y%GDCg?k@V7F zL*5d*7gO?-J8^9TVSGW>h!%YoEIPvpGj?1Bs1cNI3B}27aX6S?8taQGARo@xj(e?MUz(X?W zB#ncoSZ1MYQZyrYO1^juee4$u`m?bO>^4p+jF3d-Bw{YC@`nN<&X z_=OMEg@Q{Cg@9xBDB(xP65RBi&0O?&i5r((^o@*Nc|7n5gt9vF&EzJF9p+&7x-Kzm z0Gn*D&BuVi02w~yj+I-LnBwoO!KVX$iHf9R4WhyhVW1*rXbQZ_r4gVrUtzp!S?fKY z;Q5DGw@0ABb`9}|cp7XMOOxmJfk0@FC8BilZD%PmRqTlfxgyrYzt=D91^hy=)Dpb;`#ZxkClDbAh_KOdv@q zk$M$$%JKO3(U#}N(X_BAlL}ThMV?##hFXIWqrrL=?Ogb|sy1L;k$%D9I|2{77#qoS zXc{GO%V2PkIqEZ0Uwq0pJ-7-I!)fumYUG z+GMDmXxLMuEg6AjA^&$ts}8V%4=-4#1{#seXDm+X!v{)rT=bxy5mT0PbAA=a0V*#1paE9A`JvkndQFEa{-HZK^blJ(8@5F0`TK(-^#!E2v`obME#7%5!S{_)s+ z$+*LHN=u3HwgmeOq4as4$S2C}c^lMB%0qicXLBK0?=c`HUIwpkzqc0uINCwbZ>{c^ zn+JZpDZPL)mS3GuT~ci1ku^_nbD(WpB{G^<8mSwNS5qkw?Cq@jG)dlJt0~RId?7v` z^FqI8xfZDuxZ|lU@qbo%TY-+c@KdRP(ShOD267^zD|)BmcsHZ(a3<17Lq9KG`mllA z4bY!%<9ZKvH`ZSH2>Un690CwQMW#euu`W|m{`^WcI2F6rfH-NpBK4^hqf9D6^Ow#X zR{WN@Vg9s80pZ-U!I`jUUp&3s$Z(-}`>R}|hHjLxN5)9ClcP$LuW39pJ2#Xv za(0N1wQaoBu1fj^_<(u{Ta$Q*QaHuKIoXHGlpewha$le$GmBPI)(){{(;V$*w>=fu zVA|&}lS;^saN^c*W5L+Mq}>9&Jn3k~ zh_sQP*25K)kQDUKJ$yolFc-LFnuHi@f?^*lz=P6u6(yyvJJD6b*5>*MBinv=$1k{* zES*s#kDmGCK7%26o>`3L+|33CVxnoK>#`a@E_DiKPWpRkKelZ0ellaOR!KM}wlqtn z5g1>SXhTbv36>o!ZHNLt(l1dxl*>w=yDM^J9T?>h&c-HGNGD$whB{4U6?0JD37MIT zR~Cs^E_FtcKhpNc)rN6vmuPG4N0OR%i;M6YH+Vmpo_>g^{7ikg7tP+HN*_bbm`O^D ztmA|QkWTiVg=cE?eg8dEax&5T96ai^9XQ)mE8GP4rH#lCoT5vkdzkiH2GgY{X}tY% zfhWpgMnM?KN;8zVV|N<2E3m_CAbHnIsgsHm$!PDb`0?B4V1kxRH$SpLUXn|-&9$kU zNzD@QAcqlxvftuK3=j2-8{fhbSRFBB32l~jw;gJ3HNM;TafFSa=+l4^L6P~kd|E|F zP3iVnW74J8=FTf4i`C`;{d{K;pnEeLOx>dCMz}$`vF@7x(&KP(etEk03jL#CP;5Pe zB47kGyz+EC4=F5$Y_lw~Sf)R%rPwR)SQT7e$;?1Ve8g3cE*ywA*`yY#F0w%N4Q#+X z44Tto%DZxPo(!`|ON8yV8P&XuL3tItKO>~vWq=_!r|mS^ZsR~nh2Vug zB>Eedg-|bY-nGms1bMIm76lnkonp?&p5&JK)HgTWdQ=A@o;Eyu(WD!4z)n%4 z8r_Z%N%WUsw0vRt9fxsIg9nyC8Ro=M|6TP{Gce@eB9h@ z4_5YnN9WPnDW0#~{cqKc_^0eXr52Jg1p)veBme-_y#*$~@A5=ZNm<@V)9{I{Bh=%* z28X=%%`)kY9g!nxUVmhk_K3Cq{45xgm5oRhqm79OSBYZ}Hw0>K1y&A4aJrZDE^P)n zu5TD7f1UHIW^=50g{o5B;yg>+YmE!0h{1M1PqX8*QVZ|80P)z>7)V z%NY*m8WzUD>#DCGW|T-XS{hzo>)Sf-bEb6+?%J%NR}U6QEE}{O{hdzA$IuFdZCN;P zfgvVR1RqhuGZ6Q;2Cu|24JGCW9{QiNdyQI#zf~*l>8N*C7NukFwdHaaY>&ey{xVE2 zp**Ed{un~JhsYUYhtH_|L5{~Osy$FF$L+TG3~{iLR$8J0 z9k>$dc6 z@#x@d{3)N!n4mZ%$kP$smA8@en#p#_t_yXmJis$}Wbq>0(gj$)vb??6@wENjvoIx* zR#WEuR3HwxjJ^2TNUYv-LpfjFHHpANscE0Wb?Aqb4J?J)!bn|4RUcyI6q}>WEp;8q zb82;c2LwS)T1DZeLk>EN7KXDgO z>eK$|wb6x(I%9=jy)O;Us6ur#$;)IQWz61>)Nq@6C~KUy*3$H%}{-@YVZ7)IQyLr`~`PEqLt_q3J@NsQXNm zcmn|7-)EvX@9F0fc;Qji(gfK)m4B#zari3n~|fd2XCuTeK?Q0Tl3?dybMJ#@Mz?aTLVbC^cw|>y3;Bc%~T#Q zLfGy)LF_cAr<1q33 z8mfHiX>GmVl^1l+Z+)Dx&yJz2uiHw>eJ*>cD|BkteszD_)Bb6bh5OB(<$hD`m)o4H z-0=t~bSll;S@9V&N=^)HZKHVr*<98wN9R1WtGcN`}+3;DahN-?lk^P3I_&0mxu zb^;>J;ghEDU#=p2HX*c3n!{f%eG1i=IRS#`f1G*Zekxws=8*mk!-y#@@~l^p^>3)f za)RW$iIK{Gw>Ap4<&b3h*AD4GY(aARxc|RU46IJun60j+{aq_HlA_Es6aav$+usKouB(BK^LHKlzVY6J;_3cs F{{#2tNnrp0 diff --git a/resources/tools/cau_terrain.miz b/resources/tools/cau_terrain.miz index 6655e5ae7ab76426a0bb574ca0f04048b73530e2..20d0c5dbeb6d7db15f23f92c750ed1e1cff0d859 100644 GIT binary patch literal 30035 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 literal 14075 zcmZ{L1yodR*ES$Xh{TA3Fh~tCNK1os%+M*_EimMOv>@FKNOwqggNSs4(nv{4BPd<} z_$a>b`+Vz%#Vj~y-`C#v-q#N1+@mCW2b~B74FwAY1%(pjeAISBpAiLx?=3nCCi04{ zm6MZ|9c(vE&koqwn7M!T6xU!E?TOz$k6R`2von5C?pQt z2dOt7N??8QI?RM|I$<%H;W;P8jV$wxw-P@&bct*w{vO7F8){ST)-VF_!CDH$4Umd2{>9b7bv$8Hw@Sh(u<%eyrU2C{zT)H1v zU7)`IaME+5$-+I`YV2Pwbh^@Ye!g=2z{_jnym@<0|EGKPx&3K&SnRfA$_Z?J`_8e# z`Pqhth30jYt^tLIU-O%Nubb8Nt@Gu}-u*>#&;5&iyGeR!Zx7dvtNnClA>hUQZq~_w zSEZ0%t>F6$gID%9!uqV-Q#=XsQADZ3uYMj6{l2hcfdE7uP&-5 z+|Q=r8QwPdQP0;8o-2nG(|c+rQ4}jpsP3wlv?vM-CwPn?)w(;>waC1`dC@A+eDJOQ zW^*rV&O?T_-F*WMBmZAt0DoQ<-^t2s>>tu>dW0No3pEB z&oi$8JAC}s=OaNwT|?(TH82!Y!m2xbjp0Y%CT6;hcG+(%&K%&5nBym5)x~R9JlVjC z_wMIYES1)9m%2GmcMnGg?+=<8EIhT+%@@n=ZcZ&=;yE9D{P$6q!Y#!?9u#{TzT#c8 z%>fhVTkcLyj$Q|>>W3G3U!H#NYA#+|Pw*+lyvmciV4dw+FAp2qob~Av6K0ytu{-Tb za9LfD_Sm1BPkH5_ao%IFGHU{BJ(yZsK3}=|_CsCu;QVrVtIG4er^nT%;~9azk6!6h z2RDZ_u8CyGl32%}8zH_t?)LK&ZV*iDOYevovg}olunG<;Sjpk3vM9;LGo#l2#o)lMF zOuY=?D~l7Bt5;_l8dG7-&z$$iR{|P*`Y(igX1azpCk_E5|1T?F1y>k2EBkX;YYWZ{qDBLTV>vQVzJ7v(<<9oxH832L1i$+ZFA$&i zNjN4G=8C8g37#f?;GN*0j=d*n~gZ+$08p6Wb;TM=KYa?BauAQ!V3W9E-&36_?v&wHO1icPt z>oZ!rdY*K-+D0um2i?!?*v)Xyx3l_?kh(o~*udm4<^6)emRBf_?%H-LyaU(a=Ji$m z_aE>RoErVh!{bBaBg3!xUqak&!tjUP60B`0dbcsXns~Oihw^itpbGMCeD|$yY-6d~ ziCtCd`_R(3#kl$MU~8$;U=e)zt;5(T!?=yG>m25GYy@}GXC`{WKy(CFD@xeZ2s>J? zxlY{>iD{S`ag|HrCJx)C@fH+PV%St?c%H4~W03CYdDd}wxIRC#m8;For^LOhURj`D zXTUo3Eo^9HLTuAlOe;eS+9KCFZzDkcQnKofq)bct7-8$uemrpszO-72bEZN zym&b6B?|E*;TsPp&w{0ozJ*nHo!96WiTjefOS%YUYhS%`aJo8JqhR44p!wv<@Ls(9 zG(C!8X3e;^EMZegGf3YdEh_lF@HO16NibV2Xqo>f&W^pr#QEmR;o8YSSyXMYvBuFd zdFa8Xr@a(y?HMp`Vb-WuKC+LX6a{&qdvL7IHke)`NRCPyh|asBtFKg z9pbMPPbbU@r7#`ehBqp!H_N({BO0h}5SGCYggki?~@zG8Mr_lA#p@|-APt(e5(+`M?z|MQ= z$#8G_59Ep;($a(2pD63#4LO_x_a=*vf)af8o^%#Z?dF|w$bOx0UA+FDzpm=}c;~JR zmDhEGj^fWoI&QD>-A12>(fU_g%a`+Ab=8~jsA^pn?yw)l$AFWkaHm0%{i^2+fd?#} zKCq5Gi{^znCIfsygDEjfEcYJu{KXPsCLtytZ5tt`^76YGa4)Cpy(P|2?{C_3x(4CL zJAvaD2V0%<7oVQ*WXPbCWr?g1Z4JyGZY{=J6vu`QY{OP>j(F+2^)lLA+It6DOEji( z(%e!)KAbNW<5QFyuyB7H7)#Kg&`2;zy%wEaU9jU8BX5{1Vd0LFlYXo@-duEToccqw z^}&(N?DL)$at4`|$1c^K-ImRl>-lyUm#ed^AD%b!o;C6)?sdcb`y~8~xeaY#-!FGz z>3Davf>Tv^l=F|6PTYO%FbA%$4x7lP-BXe&HZQ`4&bY(eX64ZZo1HTCkF1G~eR^9A zQlz_K??3NF9N&zP?&3wzXZg}Ducywa1olWxN7D7ikW*q38bjt z3Q-RGQ;dJack$*GPNf)*!V#|V*PWE3vw3cO5`2lGpjL&cAnr(@V!Vf71oB~`CSpr8 zpi(arI0W-b0I44aC&mS~Dn|kze2l|Y4(IC?354{CJ5qh#z->!nlOQF@9wx8|e%AR| z#RM{0_M?DJf=?kS$WQ_*dMFYoA&M>N{Y31UQ7|`KXDZb{lDX~C2v2mjWz!g|epI-m zMC80pkuL$*6|j6tu#_ayNlJ+TQsWT@1&in2C0x$bWE4(%cYIc3B9{C04d#it!^!bo z@>U*MbF`Rol$f2rR+=uU?B=k&oxYl;zIOu*UiBxirJ)QKugciX%}XStt84i9@&=JKA`J zWOPP(LWzW*hU&FBdb-2mommP)1xnc8(?5^V5QMRYw726{ zOzL*Ulp0ot$GpJb&~Uo}_HKd@YWr|*T1f)F1WvKK;?v_iEVy-nKWx%5qgqfjrZIT? zlX2Ob;%x;&q$6`>Vib;^^$|QPl;`E7#{QK1-tX!z*B+Zn6#)Z}1plE6H7_xoTzd{~ z?>7IBGsoEx>`IJDSPW(<&a#BPK$5x^!DTuo+6Nh*D`hRDLGxcXE;9*hjD(d5hyW?^q8UX{7!2UQnrzi3pQEB3SW&*1elKtf+eZ7*_K2HEG02IGJ|Q*Oj(Bc z>v*>}hMVqmqAsHp-tp%|Axt){fnuYX1JE5PMH#gE#Fu+zGd}6&!fj$EKj*=bc%AGj zJ;9x?`C=phiH~TaK?S%eX%8PT2Bb>$^!{6}*9F1K{-#@yR*H8GAuSOvT3wx81QB^x zDJ{89U1}0m6UkC4fOKYL45L)EYVX=}^I&B&nef++xHeXh{70*xm^)pSQ$O;4?)=2I0M$F9 z{GDMjuBS}0{A~D}Y^HHipk7^P_{+}|eQ-E^@Pkfl6?({4VAc$W^Z+ldC|39zDYB}3 z2vmYWGJJ(B8O03$t|Ky^!qF~*`Q=1nnZ}0zi4r~2n(-lr+Z6PN=%N3&*%>QyM@{2frgKRY!r_?XL@x9;V;>z z`i5?!3Ym({?UUJ97hIc$ zAC-e#tT~Mc(ZJKhAo$C!!6vVmi&ylDhNizw-nli|1e8bFSCUI3@!%y*YOLA)Buf%0 z0$(u|axxmHgQ>>IYn2)YHM-}CaYk6@Ff%}) zx%1YF&APyBrWwv>iXnvH8?kz`eadhpPONT|eR!`^%ygrqu|>l4Z(wp7HDlLEWjUI4 zFnc@L%J2yu*+I=+%W*^0f{m5<49#;?} zo=b?zLF|*Ja|w6xnMWp!!)rBEW2Q9DNNOpEe&v`rSv&wGp3cNne{&dB1a>r%v~$K~ z)hXL}1en2ha`6b(GGA-?M&zfay#ISHL#e;nY_PLM2OJhqhj?e@BLRM_}aqM^bO@ zuVfz=P>h$ z7nQ;j;k8sH48t}tBqyhFQl7|@R43M$xQ%P0gx*960NBd7%qJmobsd@jWt0s(qd zK1d47V_}YOYRLP&wJr3`_@Ui+e$l>}cc9?Vw?uwH%r1wzS6ckUvU=J~a0l7joM|V* z)lyAtcZoVsHvgoHWR_hJX&hmiSYhStJlB{5Qw7CbDem+%O#r~9W@aD^+a5;37!D_CiV7qFxE z7v4cR?h4MG=hiV12;wJ(>uHa}9pJa>vx$u5X1nhFi0clNjy5* zSg<{sT~=KDyRsvB`sO1L+&@mT1bg?wx385>YJIufI;^#9ul#pa<(E>y4VOz)tC9;L z6dOu=rD-hVvH!&)oB`hAY=W%+>rHiu+gs~@>OUGfZy>PH6g3In&!^3V-T2GZO9GCOJQac`nMMt zr5MCS-gNd+%QZ64NQz^F@ltZs4+&~ea`uy~{|{)cuanBCDgW9Nnu5oaooIek1DOQX zDisi#Ut9YhW7XK(qu)S?WT7i@%T%CPBBCFe3e0MuM6Ydk6iORUx4$fxr(FCARVbk- z-b+FmA;2^F;Fv@urZ`<=C2lkvgn0eciwv&D^pCx|mvHNYsiCXC)i`9HP)UX*+9?@8 zBbMaXX*2_YN;~4^z9$DhCZutyoG$G$=BfWv+aA)SnWKVZr3N^b2n5V3;@)K8C4VPV zmbkO}xkqZRyuYI`mH;NWk@XMBxcx;k=yxCH_wv=a)jilWi{t zkj(GIvidf*|EObmfh0y(6U4?Z^&jLvqD0L{_5&%nu`o_CY}I&zvCOQPIeDI^V0q$1 zci!+{Jp|BP3)xu*H2MG?Gf7>UBKx=0zowkNFVkbn2A0aU z3>H|**)LP)!!iEKloJ&(C}~{(DCBwLf0~U8Fg%(oMLsE9voF9H!VeLWn<+^3H~V?^ z!O3A-HLN3j&d3$n_fx5*m2#h5^X4Po$`wTw4H6G9e}$w#oUf$X~->Ds{KRlHj-NEj=)(kg3hM7h7uqNpx5i?Ba%jn%s3v70k^4)$VvfrQQ~&S8vB0|i#H-+XJ?^* z+^T5Jg5&X0c{=v#?+_rZbiSyN4kqLq@F)4q6zFS6DMdv4>6t0AfgoMlo~~>3yX2^c zn=+K142Byb-VI8Pb3hGAYBFB{%otA|^yp*L{?YF8SGymOEyh$1gBGdX5sz>*`mGY6 zx+|0SS9PfP_9*CibI0!yBJv{yFAsx4zNDvn&BQo2mj+NbaEPag6F}ooVPnD?fcW;m z@>?Weql9N<%JsQRH6(3B=tjMGO(Bpot<{c3-kruSqmjLe+v3Z6_YrNDmBxvBSGeep z%ryK5McuEt&#?qL|0PMoHp;wj-G@#@pH@hl>?ks`6*QSalhl7@6C{<`z1pkGbc`HN zEb6DzXod;D^%4U6+DgXo!E2mgY2$pcy%(pu^Th!ma4)PnhP`K+YPic}g!zewOVm8y zGSDG%oR4~5P)7_MJ3G&|E0Tt?4~-t^fv*?rL^$IV)|;+p>Ke%_ok|0b zv@AS{ua=-rr2;>JKmvdcIrf87dmx1qNo@dLsVHF zmM7jr%hk~@zTs`oE8)ZHJopjQSg_M5X*N<;C4ht-j^US9DLff1EqSX%pLTSwkW$1} zNyxZxwlTEt+*bFHNP2y_>f56P^6Y^fJOF0Mn_N7EF6sBYhl}@}f8>(uC@bCBsPOMZ zH=*@W~3*7?wjs~&{RUvm)XZ^a&wRdIwC(qfaqEn>o<2thK0;RER0 zOIM_9Do8roAI+Bzts*fW1np`&-9-0Q4Z$Jy7 zGy4Q4h7fK8JqY)>+7D>yL-;y#bHa8}s;RJfVmc>W=tGbeJEB9`Ox5VnB~#)+G6Y0- znQP6G5iZ;C2t`2ZeQ0h7h^1ZtsapX-15x?%J)XAOGSzV}z90!h#!Ykog$kDc$fst> zYN`lv2wFa>K&-vye928+Z3KB~96Yf5`|Xusf_IrEx?lF#9JtX? zP^s|yr9iH7peH{55*FeJx@Ph@*sYr+{OH~eLvz6iH_Uy(hV-?#TGvw`s>L)@wODj> zlX~&kc|6$PT_MDI`qO2^y}xMb&@wMm+H^=kM2stDpD)_VAqKl)LH~seM_>h6zEA=9 z32yR(IkWrK2?NGbRUdrG>a)f? z`I7eQjV?$U)r_ANCc#(1yx86l&bxO>I42cC7`{F$xe2SToXzTkVb=fQ;ad;^mu5{| zMNVHFh&>uXGEPL#rdzD#$ZG27VPRyuoHko61$)Sf<{}2%_k(T@GnU2x~k6~HPlA=!}0P=jQy&TuP z*hAg09whnZ|IiwaSS6{sj0MsUL9ifVz+S>9 z29=a~i%FM=01@!rg}!l_S6@R+N_Yi+D4ikMn>KC8A=|s%&gkp7{xCUiD+RPkTc^ap z2t?dCBedctF49N;z&0-3`iSseYEzy{O)jk}!as)ZYXy0kTGlEE+RZa(#T_WX^>}YJ z@J|7Z?No`DsH|BD$)8&)l4t;Sz{cjUK~#0XL#I_xHTzs)pFKU#@8m~Ts>X2-2}uZ} z>hPRj0SZ+=GVY?hrmq4CPms2bn>NJW+A0GGgq`V`^wN?=V?zN>^*^&i?o&g<=i7gd zuq_Y&AJ|+`UsV+Z7<0}f6pTr77t!91?u*im*=K|9`VuhLhvAAW>z$%1n9%y6w*-jQ zCt0p?h`6u#RCr|e#7wRLrl`fnu4=-$La06cpF#zF3sTv74h4yTwfdYvZ6&YSL8S4q z5|Ndwpb-(o4A$N_s3G>=U(Zfv<~~;G1SiOB9!nA8@`i&_op`WMAIHain_<`+&uxf( z`bSg-5JAd|9p~cNjSWZmRl?+#eO2odWnGR0@9b48BQ0>C*ZAu#OH|*|&iP=~cc4$D z39RgH#YWw_5Zaz6; zX&6bE=0A}w0##1mj|D-15BlRkRC{%>anWrafGmO_!-&=}{eNY*K;Wg6#~|7If$=y{ z2;bUAoHr0Ly~w;{T)sY}de}ee|LH0!^w9cffp55ocRvaRnL%kgcZcSvF(xR_e{uEeu)Lo@^VeIhLcx}5z4L5+xj7(_ZgJxI>^WO|G|uY< z5C>UXS_-ywo8~*0#5(!fR%3!iv{}7Z&Mg`yqOpG<$d-1^gF0zr? zC(w21&DsBMk;q1dZn}5u7{r^Wm>t7`LH4CtT@%ohLYe~NC+pEm2D&=*{B==-zulux zsdT&Z0Ory)!wyG)OlrT!B`#mcaJNGOU60xP&S8{m4Fj>7MY9KLKX8L^{9Ac8i3*cwDvrWC zAidFp=r-$q6Hd4IMxFm_Bo36wWHj;J99zr;2Ri9wV?Yu@XrKxy*rk_D`p_In2jaqa*>M3N8hyYR|mdoTro12zz$<2;~ zVj10L-`}VM!X-ImLnIbrG^E^-GeMXl_we7k5&oKDFSt;+(p4NR!jtcaQlYS&j6h|y zO`5&RzAP^1BfZ_FmqO$U@A@5TH7GTms45gX4x!iks7xgzG7eCs{z-$~EdfyJWR8@Q z|3zWz*rhTgg&{x?9)b~4BB38!Vv{-+cV`cq&*+n&>AoJqls(SW)H8Ze%6^KjO;69> zHJTSG%@xfcc`t8IdaN@!{|+``!Zz|TSlz-9g5j=QvnYV%!LKx`h1zQn&yj?5n+VDahRA3WafwVuqE6$3MARq&5NGG;!EU=Ly4LwQyIXKj9g(A4Xfmf_LqM}} z9LbyZ=rU%4eq&#UUxwJ#)3wa&{*@I8NBFJ7_}ucapCKgr=eGwKZ%6R zX=-(1$6+kB0{=WxWE7@!8PLgs3|c;jthBg8d9Og{wWXqWC-5112rr$uc}}%X>@cjX zT0k865HOliT=Uso%Fa}VC4XF~7Q(-C+B$S%UIEmYtHMXA$_jWcir^$mn@@IjaZ3B^ za|r;6agDC_p{h9zGyo0z{>IRGV60hS^w`DRJ=#fRY&~fi>XLU|Vcn`f%L2NeUCi2Fo(Hpf>ZYZ$Ofhrq4;7~z zZJqa0I_rLPbGqcLTcOc3=*071PSLO^Hi%DAwA-h=6H_ky;c_>M^`>FklV2xp@#pNm z&&m0k>l$P6kFcS`wVTtG@*9gWj52Tiw6tA?YdhqV>)8(isgox(8}*AKmvx0GdTV?i z{1$R{C$?Pr-VtbtJk-p#900>|K(Qg{U30u|k7WIKUc9JR2~W$JcMJ^re89TqX48?w z^}KtaE5ACdYqQwGHb+0+x}-e4S-y?}WXJkNCNyPjh8bh_8-1&=j*Uy}Jwp%c%gf7U z+4q)v9|X=CUfo=~K&#iSeHyeDhxWJcRkNxWW}SQKvM9(7Sh?;lu&(wk@9exhGP)|M zB{{!joc<;|zI}270C-n>w`!-SiOJ^gF4&!|g>YZu5^uW_|2iLbG;~%*Nf=4)J7-PI zRc`}J0kEbszdFJH66ANZ-?To#txaK4_BLZ>`SShTa^JGk2XEc#YWs8dN^oiPge~?m z`=VPb@*kEVN3X+8ZiG7QaAOg+&of)cPH{GLEG}!cFF0x6a^rb(xRNE+IYr;m0@$0n z3`;pWS|4i(+a>?Lx3li8EK}^>7&KCTNA|2+-YqFUBObqFtb^cZR|C2LQP{q`-oi-X z@xa+x5$iF<6sz4nM{xeV8rSX%1J8qL#ZS*8rdW@Q_jjK?U%tlYS-Lq`?t4P=O2Vqi zpu%qP>eAuhWFlKz6mR@1&vd?8R15Ek?9qG`=VMseR_(D!R)I!ViGG2Bmu~6y$mYk? zaGtq*h;ygY`IUKPS^UPw=>@V)^=z6aqZE&P3@$G#JEz(&rbL8sRX+% zQ^-hZ-eBW93%{=v!U#KZys~$K!#ihP4WaLN3Ke6Xq(sA8<%C&y_9Gd_d?%hStm->3 zQYgO*OF6u_+T42S<|XkN?{wLY^4MKpdi;z+*ftV7(}BdOUc}4cJM!@0L>czaC|&sE7x<{pKgA}^umHC<)v>c@OZg(-^>0((^h(W z*bS!A{~SU6Cb=Z9goc9hf&>MH7n8LQj2r@k>E9!!@w=Br_}GDJ)F0~4W}6Sq|15gB-wpe$ernF=RG<^3s-Dj= z|D6|qr7|r&R-!!GX_v>Vh z1aOq>Y_cpgYKHL=5VibcYxHboP;HfZRe>m7b}E~L=2)iOxOFFA)R-WX(5HYOxiLMdA@*&0Io#_2?I3Jyc9081oOAu)Y5j9>t<6K z6!}X(EkZmunuCrnYo<(qKOa8cU{^?PPQo#lRL!FHkx8;|jra9^byDIYGr0Ag<-)1iSnL$EL@PR4!L1tKNwU zLC4edQ>|svQu6YJZCP}r2ma+4UpJ#Mw#lv46fLT_@)FvK;YjHw z>+)<4S(}%a$`jsZ8dof}6SH4Hwnv`aDUmN>?-ts8Ek>sYxN|0lQ{l6PH&GUV&4&JO||o)wx@m*o5V(w7+EUZ?kaMz1yMp znxS3ba#?@sWU^e=wmg*me2(_*alPBCP}$a*_#xxwx{2~S&|ERYwxD7OxZh{DPpiCP zc(Y+RJJ)N~R{EynEMX)gp7?{n0gq}a_fhfOz{RAZ@cNJaGny#3S6)GU6z)zbQI2{N zDO-&v3cBB%=aLv&FJ4@?F4|9w%|1NY|9r(FtwU<(E@=HGl7K;i5?zcEeUykH4vn0e z0F8|d`e%m*-}&IM;(`1Tq6FCUjS%HL#T zprEinMEU2yzn%TB`s!4wDQmaFi~He31D#LNe1#~<1q!FxvK1(S}IeY#au$5dGSxJ_$ zb*Ps6o7sKGGu*)#xFw@g80>;|KhOjpjHf2?^_IS|ZPQT8Ox4V1+Q8k)^Z!Zmwp%$q zpIN4=r9Ly`@>-zpo+*PNkqX`fgGoo2RBGYJLB{UYAMVCZEddZ?h&Z)x3?zR zJ}CxK2|PAU+N>4*NE+bQ`f9*TTWxQp-JlX(D^V#VN7zh63iAbF!Bqj9MTty%O3-`m z)>NM-=Lz>@Y!0q%OUo!H8bry<$cedEInbx#3$2e39uGM3BVJ}D$F*i+g&f>x4QBe@ zo@n&qWBo*QcWP~o;(c9(8X1gp{)b7dL=v4|?>AbB4enmyJW#%=)u85aRRWXsMNt17 zo1*jDEogSD12GPyJ$-5Nq}z!b?s6B3HWU%>&JmNfWX*#25%)q}+{oZZV^jvK%%T~s zbTtl}{QX6`uy^wH1D^}dTsN=CRx0cKuFYB}y{tAe&Fw@vQqigQ;7g@J?3HcqfDx^A)`I5`SG~j3 z%As88oH{Fm2l19T7PgbG_3^Y4i7zTb1%2MR@vnT-m7kJ*Zs+Ng`jdPpjrr1Pz@kOe zzDssMJw|uOS7mZG@o>!=N?PHShT_wneSCh@b&Npp%lXKT{Dp5mALRt-e84L`rL;b@!`2Yt@Is*qcm zzcO`rrkA$-r7h$zVk1hKwc#?rq#`{tuXyn0u*iH+*`bf*{KwO9;j#kWnw=k~m!`B! zqepi;PH5DLTY2>apTT}+jg5>b5-)x`oLZCS@%)(C>MqK5zHwGP#v|v^X7Bk@%FKva zm`%>3!|*U{ko(>d)zvD3)HnqhLNf zQ-9@nT>Z2D)fC?azLG2|a*X)@e{u^sTcDu+dim$;&*!-Qz3AVw_AlAri{2nV1or=# zy#EdI?^)?TAXv=*0{O4W>E9^-9*q8jVuVEb&zSV@b^mT)|5 typing.Tuple: - args = str(name).split("|") - if len(args) == 3: - args.append("1") + args = str(name.split()[0]).split("|") - return args[0], int(args[1]), int(args[2]), int(args[3]) + return args[0], int(args[1]), int(args[2]) for group in m.country("Russia").static_group + m.country("Russia").vehicle_group: try: - category, cp_id, group_id, object_id = parse_name(str(group.name)) + category, cp_id, group_id = parse_name(str(group.name)) except: print("Failed to parse {}".format(group.name)) continue - append_group(cp_id, category, group_id, object_id, [group.position.x, group.position.y], group.units[0].heading) + ids_counters_key = "{}_{}".format(cp_id, group_id) + ids_counters[ids_counters_key] = ids_counters.get(ids_counters_key, 0) + 1 + object_id = ids_counters[ids_counters_key] + append_group(cp_id, category, group_id, object_id, group.position, group.units[0].heading) + +GROUP_TRESHOLD = 300 +did_check_pairs = [] +for group_id, objects_in_group in result_by_groups.items(): + for a in objects_in_group: + for b in objects_in_group: + if (a, b) in did_check_pairs: + continue + + did_check_pairs.append((a, b)) + distance = a.position.distance_to_point(b.position) + if distance > GROUP_TRESHOLD: + print("Objects {} and {} in group {} are too far apart ({})!".format(a.string_identifier, b.string_identifier, group_id, distance)) print("Total {} objects".format(sum([len(x) for x in result.values()]))) + + with open("../cau_groundobjects.p", "wb") as f: pickle.dump(result, f) diff --git a/resources/tools/generate_landmap.py b/resources/tools/generate_landmap.py index a758e0ee..5e472aaa 100644 --- a/resources/tools/generate_landmap.py +++ b/resources/tools/generate_landmap.py @@ -1,14 +1,14 @@ import pickle from dcs.mission import Mission -from dcs.terrain import PersianGulf -m = Mission() -m.load_file("./gulf_terrain.miz") +for terrain in ["cau", "gulf"]: + m = Mission() + m.load_file("./{}_terrain.miz".format(terrain)) -landmap = [] -for plane_group in m.country("USA").plane_group: - landmap.append([(x.position.x, x.position.y) for x in plane_group.points]) + landmap = [] + for plane_group in m.country("USA").plane_group: + landmap.append([(x.position.x, x.position.y) for x in plane_group.points]) -with open("../gulflandmap.p", "wb") as f: - pickle.dump(landmap, f) + with open("../{}landmap.p".format(terrain), "wb") as f: + pickle.dump(landmap, f) diff --git a/theater/caucasus.py b/theater/caucasus.py index 82e1c4b6..fd824c4a 100644 --- a/theater/caucasus.py +++ b/theater/caucasus.py @@ -13,7 +13,7 @@ class CaucasusTheater(ConflictTheater): overview_image = "caumap.gif" reference_points = {(-317948.32727306, 635639.37385346): (282.5, 319), (-355692.3067714, 617269.96285781): (269, 352), } - landmap_poly = load_poly("resources\\caulandmap.p") + landmap = load_landmap("resources\\caulandmap.p") daytime_map = { "dawn": (6, 9), "day": (9, 18), diff --git a/theater/conflicttheater.py b/theater/conflicttheater.py index baa3f445..5f78c198 100644 --- a/theater/conflicttheater.py +++ b/theater/conflicttheater.py @@ -4,7 +4,7 @@ import itertools import dcs from dcs.mapping import Point -from .landmap import ray_tracing +from .landmap import Landmap, poly_contains from .controlpoint import ControlPoint from .theatergroundobject import TheaterGroundObject @@ -52,12 +52,11 @@ class ConflictTheater: reference_points = None # type: typing.Dict overview_image = None # type: str - landmap_poly = None + landmap = None # type: landmap.Landmap daytime_map = None # type: typing.Dict[str, typing.Tuple[int, int]] def __init__(self): self.controlpoints = [] - self.groundobjects = [] def set_groundobject(self, dictionary: typing.Dict[int, typing.Collection[TheaterGroundObject]]): for id, value in dictionary.items(): @@ -73,14 +72,20 @@ class ConflictTheater: self.controlpoints.append(point) def is_on_land(self, point: Point) -> bool: - if not self.landmap_poly: + if not self.landmap: return True - for poly in self.landmap_poly: - if ray_tracing(point.x, point.y, poly): - return True + # check first poly (main land poly) + if not poly_contains(point.x, point.y, self.landmap[0]): + return False - return False + # check others polys (exclusion zones from main) + for poly in self.landmap[1:]: + if poly_contains(point.x, point.y, poly): + # point is in one of the exclusion zones, meaning that it's in the lake or something + return False + + return True def player_points(self) -> typing.Collection[ControlPoint]: return [point for point in self.controlpoints if point.captured] diff --git a/theater/controlpoint.py b/theater/controlpoint.py index f8985244..72e44017 100644 --- a/theater/controlpoint.py +++ b/theater/controlpoint.py @@ -9,7 +9,7 @@ from .theatergroundobject import TheaterGroundObject class ControlPoint: - connected_points = [] # type: typing.List[ControlPoint] + connected_points = None # type: typing.List[ControlPoint] ground_objects = None # type: typing.Collection[TheaterGroundObject] position = None # type: Point captured = False @@ -26,6 +26,7 @@ class ControlPoint: self.full_name = name self.position = position self.at = at + self.ground_objects = [] self.size = size self.importance = importance diff --git a/theater/landmap.py b/theater/landmap.py index ce99252e..a52a00eb 100644 --- a/theater/landmap.py +++ b/theater/landmap.py @@ -1,7 +1,10 @@ import pickle +import typing + +Landmap = typing.Collection[typing.Collection[typing.Tuple[float, float]]] -def load_poly(filename: str): +def load_landmap(filename: str) -> Landmap: try: with open(filename, "rb") as f: return pickle.load(f) @@ -9,7 +12,7 @@ def load_poly(filename: str): return None -def ray_tracing(x, y, poly): +def poly_contains(x, y, poly): n = len(poly) inside = False xints = 0.0 @@ -25,3 +28,11 @@ def ray_tracing(x, y, poly): inside = not inside p1x, p1y = p2x, p2y return inside + +def poly_centroid(poly) -> typing.Tuple[float, float]: + x_list = [vertex[0] for vertex in poly] + y_list = [vertex[1] for vertex in poly] + x = sum(x_list) / len(poly) + y = sum(y_list) / len(poly) + return (x, y) + diff --git a/theater/persiangulf.py b/theater/persiangulf.py index 0cc3e06a..0c06b2f7 100644 --- a/theater/persiangulf.py +++ b/theater/persiangulf.py @@ -3,7 +3,7 @@ from dcs import mapping from .conflicttheater import * from .base import * -from .landmap import load_poly +from .landmap import load_landmap class PersianGulfTheater(ConflictTheater): @@ -11,7 +11,7 @@ class PersianGulfTheater(ConflictTheater): overview_image = "persiangulf.gif" reference_points = {(persiangulf.Sir_Abu_Nuayr.position.x, persiangulf.Sir_Abu_Nuayr.position.y): (321, 145), (persiangulf.Sirri_Island.position.x, persiangulf.Sirri_Island.position.y): (347, 82), } - landmap_poly = load_poly("resources\\gulflandmap.p") + landmap = load_landmap("resources\\gulflandmap.p") daytime_map = { "dawn": (6, 8), "day": (8, 16), diff --git a/theater/theatergroundobject.py b/theater/theatergroundobject.py index b0e3a3fa..83a11fc4 100644 --- a/theater/theatergroundobject.py +++ b/theater/theatergroundobject.py @@ -8,6 +8,7 @@ NAME_BY_CATEGORY = { "fuel": "Fuel depot", "defense": "AA Defense Site", "warehouse": "Warehouse", + "farp": "FARP", } ABBREV_NAME = { @@ -16,6 +17,7 @@ ABBREV_NAME = { "fuel": "FUEL", "defense": "AA", "warehouse": "WARE", + "farp": "FARP", } @@ -24,25 +26,21 @@ class TheaterGroundObject: cp_id = 0 group_id = 0 heading = 0 - location = None # type: typing.Collection[int] + position = None # type: Point category = None # type: str - def __init__(self, category, cp_id, group_id, object_id, location, heading): + def __init__(self, category, cp_id, group_id, object_id, position, heading): self.category = category self.cp_id = cp_id self.group_id = group_id self.object_id = object_id - self.location = location + self.position = position self.heading = heading @property def string_identifier(self): return "{}|{}|{}|{}".format(self.category, self.cp_id, self.group_id, self.object_id) - @property - def position(self) -> Point: - return Point(*self.location) - @property def name_abbrev(self) -> str: return ABBREV_NAME[self.category] diff --git a/ui/configurationmenu.py b/ui/configurationmenu.py index a44a5b05..2a82ba1b 100644 --- a/ui/configurationmenu.py +++ b/ui/configurationmenu.py @@ -1,3 +1,5 @@ +import webbrowser + from tkinter import * from tkinter.ttk import * from .styles import STYLES @@ -64,7 +66,16 @@ class ConfigurationMenu(Menu): Checkbutton(body, variable=self.night_var, **STYLES["radiobutton"]).grid(row=4, column=1, sticky=E) Button(body, text="Back", command=self.dismiss, **STYLES["btn-primary"]).grid(row=5, column=1, sticky=E, pady=30) - Button(body, text="Cheat +200m", command=self.cheat_money, **STYLES["btn-danger"]).grid(row=6, column=1) + + Label(body, text="Contributors: ", **STYLES["widget"]).grid(row=6, column=0, sticky=W) + + Label(body, text="shdwp - author, maintainer", **STYLES["widget"]).grid(row=7, column=0, sticky=W) + Button(body, text="[github]", command=lambda: webbrowser.open_new_tab("http://github.com/shdwp"), **STYLES["widget"]).grid(row=7, column=1, sticky=E) + + Label(body, text="Khopa - contributions", **STYLES["widget"]).grid(row=8, column=0, sticky=W) + Button(body, text="[github]", command=lambda: webbrowser.open_new_tab("http://github.com/Khopa"), **STYLES["widget"]).grid(row=8, column=1, sticky=E) + + Button(body, text="Cheat +200m", command=self.cheat_money, **STYLES["btn-danger"]).grid(row=10, column=1, pady=30) def cheat_money(self): self.game.budget += 200 diff --git a/ui/corruptedsavemenu.py b/ui/corruptedsavemenu.py index 85264011..40f05e69 100644 --- a/ui/corruptedsavemenu.py +++ b/ui/corruptedsavemenu.py @@ -13,6 +13,6 @@ class CorruptedSaveMenu(Menu): def display(self): self.window.clear_right_pane() - Label(text="Your save game was corrupted!", **STYLES["widget"]).grid(row=0, column=0) + Label(text="Your save game is either incompatible or was corrupted!", **STYLES["widget"]).grid(row=0, column=0) Label(text="Please restore it by replacing \"liberation_save\" file with \"liberation_save_tmp\" to restore last saved copy.", **STYLES["widget"]).grid(row=1, column=0) - Label(text="You can find those files under user DCS directory.", **STYLES["widget"]).grid(row=2, column=0) + Label(text="You can find those files under user Saved Games\\DCS directory.", **STYLES["widget"]).grid(row=2, column=0) diff --git a/ui/eventmenu.py b/ui/eventmenu.py index a7673038..55076591 100644 --- a/ui/eventmenu.py +++ b/ui/eventmenu.py @@ -8,14 +8,14 @@ from .styles import STYLES, RED UNITTYPES_FOR_EVENTS = { - FrontlineAttackEvent: [CAS, PinpointStrike], - FrontlinePatrolEvent: [CAP, PinpointStrike], - BaseAttackEvent: [CAP, CAS, PinpointStrike], - StrikeEvent: [CAP, CAS], - InterceptEvent: [CAP], - InsurgentAttackEvent: [CAS], - NavalInterceptEvent: [CAS], - InfantryTransportEvent: [Embarking], + FrontlineAttackEvent: [[CAS, PinpointStrike], [CAP]], + FrontlinePatrolEvent: [[CAP, PinpointStrike], [CAP]], + BaseAttackEvent: [[CAP, CAS, PinpointStrike], [CAP, CAS, PinpointStrike]], + StrikeEvent: [[CAP, CAS], [CAP]], + InterceptEvent: [[CAP], [CAP]], + InsurgentAttackEvent: [[CAS], [CAP]], + NavalInterceptEvent: [[CAS], [CAP]], + InfantryTransportEvent: [[Embarking], [CAP]], } AI_BAN_FOR_EVENTS = { @@ -115,7 +115,8 @@ class EventMenu(Menu): Label(self.frame, text="Client slots", **STYLES["widget"]).grid(row=row, column=3, columnspan=2) row += 1 - filter_to = UNITTYPES_FOR_EVENTS[self.event.__class__] + filter_attackers_index = 0 if self.game.is_player_attack(self.event) else 1 + filter_to = UNITTYPES_FOR_EVENTS[self.event.__class__][filter_attackers_index] for unit_type, count in self.base.aircraft.items(): if filter_to and db.unit_task(unit_type) not in filter_to: continue @@ -262,12 +263,6 @@ class EventMenu(Menu): elif type(self.event) is NavalInterceptEvent: e = self.event # type: NavalInterceptEvent - if self.game.is_player_attack(self.event): - e.player_attacking(strikegroup=scrambled_aircraft, clients=scrambled_clients) - else: - e.player_defending(interceptors=scrambled_aircraft, clients=scrambled_clients) - elif type(self.event) is AntiAAStrikeEvent: - e = self.event # type: AntiAAStrikeEvent if self.game.is_player_attack(self.event): e.player_attacking(strikegroup=scrambled_aircraft, clients=scrambled_clients) else: diff --git a/ui/eventresultsmenu.py b/ui/eventresultsmenu.py index dc149bed..f3341f0e 100644 --- a/ui/eventresultsmenu.py +++ b/ui/eventresultsmenu.py @@ -86,6 +86,10 @@ class EventResultsMenu(Menu): header("Enemy losses") + if self.debriefing.destroyed_objects: + Label(self.frame, text="Ground assets", **STYLES["widget"]).grid(row=row) + Label(self.frame, text="{}".format(len(self.debriefing.destroyed_objects)), **STYLES["widget"]).grid(column=1, row=row) + for unit_type, count in self.enemy_losses.items(): if count == 0: continue diff --git a/ui/mainmenu.py b/ui/mainmenu.py index 63106d20..07dac796 100644 --- a/ui/mainmenu.py +++ b/ui/mainmenu.py @@ -51,10 +51,9 @@ class MainMenu(Menu): nonlocal row, body frame = LabelFrame(body, **STYLES["label-frame"]) frame.grid(row=row, sticky=NSEW) - Message(frame, text="{}{} at {}".format( + Message(frame, text="{}{}".format( event.defender_name == self.game.player and "Enemy attacking: " or "", - event, - event.to_cp, + event ), aspect=1600, **STYLES["widget"]).grid(column=0, row=0, sticky=NSEW) Button(body, text=">", command=self.start_event(event), **STYLES["btn-primary"]).grid(column=1, row=row, sticky=E) row += 1 @@ -63,9 +62,8 @@ class MainMenu(Menu): nonlocal row, body Label(body, text=text, **STYLES["strong"]).grid(column=0, columnspan=2, row=row, sticky=N+EW, pady=(pady,0)); row += 1 - #Separator(self.frame, orient='horizontal').grid(row=row, sticky=EW); row += 1 - events = self.game.events + events.sort(key=lambda x: x.to_cp.name) events.sort(key=lambda x: x.from_cp.name) events.sort(key=lambda x: x.informational and 2 or (self.game.is_player_attack(x) and 1 or 0)) @@ -74,7 +72,7 @@ class MainMenu(Menu): for event in events: if not event.informational: if self.game.is_player_attack(event): - new_destination = event.from_cp.name + new_destination = "From {} to {}".format(event.from_cp.name, event.to_cp.name) else: new_destination = "Enemy attack" if destination != new_destination: diff --git a/ui/overviewcanvas.py b/ui/overviewcanvas.py index e3522e35..5a56f101 100644 --- a/ui/overviewcanvas.py +++ b/ui/overviewcanvas.py @@ -81,6 +81,7 @@ class OverviewCanvas: if cp.captured and not connected_cp.captured and Conflict.has_frontline_between(cp, connected_cp): frontline_pos, heading, distance = Conflict.frontline_vector(cp, connected_cp, self.game.theater) + distance = max(distance, 1000) start_coords = self.transform_point(frontline_pos, treshold=10) end_coords = self.transform_point(frontline_pos.point_from_heading(heading, distance), treshold=60)