From c4110bad4525c2ee9809e195dc3c35ab808455a9 Mon Sep 17 00:00:00 2001 From: ScottNZ Date: Sat, 4 Oct 2014 21:52:39 +1300 Subject: [PATCH 01/22] Add country definitions --- OpenRA.Game/Widgets/ChromeMetrics.cs | 12 +++++++++ .../Logic/Ingame/AddRaceSuffixLogic.cs | 6 ++++- mods/ra/chrome.yaml | 5 ++++ mods/ra/metrics.yaml | 7 ++++++ mods/ra/rules/world.yaml | 25 +++++++++++++++---- 5 files changed, 49 insertions(+), 6 deletions(-) diff --git a/OpenRA.Game/Widgets/ChromeMetrics.cs b/OpenRA.Game/Widgets/ChromeMetrics.cs index 86779d7ff2..dd91767285 100644 --- a/OpenRA.Game/Widgets/ChromeMetrics.cs +++ b/OpenRA.Game/Widgets/ChromeMetrics.cs @@ -33,5 +33,17 @@ namespace OpenRA.Widgets { return FieldLoader.GetValue(key, data[key]); } + + public static bool TryGet(string key, out T result) + { + string s; + if (!data.TryGetValue(key, out s)) + { + result = default(T); + return false; + } + result = FieldLoader.GetValue(key, s); + return true; + } } } diff --git a/OpenRA.Mods.RA/Widgets/Logic/Ingame/AddRaceSuffixLogic.cs b/OpenRA.Mods.RA/Widgets/Logic/Ingame/AddRaceSuffixLogic.cs index 6f0ae48745..834ff49bf6 100644 --- a/OpenRA.Mods.RA/Widgets/Logic/Ingame/AddRaceSuffixLogic.cs +++ b/OpenRA.Mods.RA/Widgets/Logic/Ingame/AddRaceSuffixLogic.cs @@ -18,7 +18,11 @@ namespace OpenRA.Mods.RA.Widgets.Logic [ObjectCreator.UseCtor] public AddRaceSuffixLogic(Widget widget, World world) { - var suffix = "-" + world.LocalPlayer.Country.Race; + string race; + if (!ChromeMetrics.TryGet("RaceSuffix-" + world.LocalPlayer.Country.Race, out race)) + race = world.LocalPlayer.Country.Race; + var suffix = "-" + race; + if (widget is ButtonWidget) ((ButtonWidget)widget).Background += suffix; else if (widget is ImageWidget) diff --git a/mods/ra/chrome.yaml b/mods/ra/chrome.yaml index 7b967849dd..d1163eced4 100644 --- a/mods/ra/chrome.yaml +++ b/mods/ra/chrome.yaml @@ -337,7 +337,12 @@ strategic: strategic.png flags: buttons.png allies: 30,112,30,15 + england: 30,112,30,15 + france: 30,112,30,15 + germany: 30,112,30,15 soviet: 0,112,30,15 + russia: 0,112,30,15 + ukraine: 0,112,30,15 random: 60,112,30,15 spectator: 60,112,30,15 diff --git a/mods/ra/metrics.yaml b/mods/ra/metrics.yaml index a44bdc1b66..ce65490323 100644 --- a/mods/ra/metrics.yaml +++ b/mods/ra/metrics.yaml @@ -24,3 +24,10 @@ Metrics: SpawnColor: 255,255,255 SpawnContrastColor: 0,0,0 SpawnLabelOffset: 0,1 + RaceSuffix-allies: allies + RaceSuffix-england: allies + RaceSuffix-france: allies + RaceSuffix-germany: allies + RaceSuffix-soviet: soviet + RaceSuffix-russia: soviet + RaceSuffix-ukraine: soviet diff --git a/mods/ra/rules/world.yaml b/mods/ra/rules/world.yaml index a5094986a2..448f90e299 100644 --- a/mods/ra/rules/world.yaml +++ b/mods/ra/rules/world.yaml @@ -96,8 +96,23 @@ World: Name: Allies Race: allies Country@1: + Name: England + Race: england + Country@2: + Name: France + Race: france + Country@3: + Name: Germany + Race: germany + Country@4: Name: Soviet Race: soviet + Country@5: + Name: Russia + Race: russia + Country@6: + Name: Ukraine + Race: ukraine DomainIndex: SmudgeLayer@SCORCH: Type: Scorch @@ -139,12 +154,12 @@ World: MPStartUnits@mcvonly: Class: none ClassName: MCV Only - Races: soviet, allies + Races: allies, england, france, germany, soviet, russia, ukraine BaseActor: mcv MPStartUnits@lightallies: Class: light ClassName: Light Support - Races: allies + Races: allies, england, france, germany BaseActor: mcv SupportActors: e1,e1,e1,e3,e3,jeep,1tnk InnerSupportRadius: 3 @@ -152,7 +167,7 @@ World: MPStartUnits@lightsoviet: Class: light ClassName: Light Support - Races: soviet + Races: soviet, russia, ukraine BaseActor: mcv SupportActors: e1,e1,e1,e3,e3,apc,ftrk InnerSupportRadius: 3 @@ -160,7 +175,7 @@ World: MPStartUnits@heavyallies: Class: heavy ClassName: Heavy Support - Races: allies + Races: allies, england, france, germany BaseActor: mcv SupportActors: e1,e1,e1,e3,e3,jeep,1tnk,2tnk,2tnk,2tnk InnerSupportRadius: 3 @@ -168,7 +183,7 @@ World: MPStartUnits@heavysoviet: Class: heavy ClassName: Heavy Support - Races: soviet + Races: soviet, russia, ukraine BaseActor: mcv SupportActors: e1,e1,e1,e3,e3,apc,ftrk,3tnk,3tnk InnerSupportRadius: 3 From e54be8c58b2737f6bebc360c2a8045394ee5447b Mon Sep 17 00:00:00 2001 From: ScottNZ Date: Sat, 8 Nov 2014 23:36:13 +1300 Subject: [PATCH 02/22] Set up custom prerequisites for FACT --- mods/ra/rules/structures.yaml | 25 +++++++++++++++++++++++-- 1 file changed, 23 insertions(+), 2 deletions(-) diff --git a/mods/ra/rules/structures.yaml b/mods/ra/rules/structures.yaml index 2e787fb0c7..4f7ff10f4b 100644 --- a/mods/ra/rules/structures.yaml +++ b/mods/ra/rules/structures.yaml @@ -717,11 +717,32 @@ FACT: BuildPaletteOrder: 1000 Prerequisites: ~disabled ProvidesCustomPrerequisite@allies: - Race: allies + Race: allies, england, france, germany Prerequisite: structures.allies + ProvidesCustomPrerequisite@alliesvanilla: + Race: allies + Prerequisite: structures.alliesvanilla + ProvidesCustomPrerequisite@england: + Race: england + Prerequisite: structures.england + ProvidesCustomPrerequisite@france: + Race: france + Prerequisite: structures.france + ProvidesCustomPrerequisite@germany: + Race: germany + Prerequisite: structures.germany ProvidesCustomPrerequisite@soviet: - Race: soviet + Race: soviet, russia, ukraine Prerequisite: structures.soviet + ProvidesCustomPrerequisite@sovietvanilla: + Race: soviet + Prerequisite: structures.sovietvanilla + ProvidesCustomPrerequisite@russia: + Race: russia + Prerequisite: structures.russia + ProvidesCustomPrerequisite@ukraine: + Race: ukraine + Prerequisite: structures.ukraine Health: HP: 1500 Armor: From c526f572e736097397f47787c9d25e7ae3b220ab Mon Sep 17 00:00:00 2001 From: ScottNZ Date: Sat, 8 Nov 2014 23:35:02 +1300 Subject: [PATCH 03/22] Set up tank drop for Russia, parabombs for Ukraine and spy plane/paradrop for Soviet --- mods/ra/bits/armordropicon.shp | Bin 0 -> 3160 bytes mods/ra/maps/survival01/map.yaml | 6 +- mods/ra/rules/ai.yaml | 136 ++++++++++++++++++++++++++----- mods/ra/rules/defaults.yaml | 9 ++ mods/ra/rules/misc.yaml | 4 - mods/ra/rules/structures.yaml | 55 ++++++++++++- mods/ra/sequences/misc.yaml | 6 ++ 7 files changed, 188 insertions(+), 28 deletions(-) create mode 100644 mods/ra/bits/armordropicon.shp diff --git a/mods/ra/bits/armordropicon.shp b/mods/ra/bits/armordropicon.shp new file mode 100644 index 0000000000000000000000000000000000000000..c8002e8f7e78d3494d3ccbde6c0320f9827f1512 GIT binary patch literal 3160 zcmbtW&2png5O(gvj%4A$VO1{qkSoy(C^--<3W{rOLE+LXz>I7wx3IqNN2W-1h*?hx;J)uE2K6qa4F)0rq|AEep|JbBkFqGs zNIx+QAv`_3zJg%$qz0LzmL9-d5&>9%j_~PwmFGR_e@77hDZE#W_@|WjAw2*MB#a0$ zKmk?+XFR!w4GO~j3~^6M%6cf!&#%9UaQaKQh7ek1s6b{|ge$)D0a!QmSO z5%~w2@fxYugf9jTQlOA6A!_n9hyYIYfc1Tr<-p4fD@jf(Ikmxn?hx8t>UDv z%ChR>^?J89*T4=DfnfW`*PEN2G48x=8p|YB;_LTI2y^1h++}KZ{;rE*>vdUh_(h3Y z5YiaatW0ez<2rV03_@92u|Gt^$=78&Uo6c!>7c~FtFMRjfdtWwIY1Fr=X>YeZcMXm zyvj2vG#8iv3SJjg+PH1!*cWbWN~lK)(4r;}AZXmUK;>qc5f@I|x~ryXU1K$utNY6o zBt_{ZYb37o{X5?@d8SaGlv|XYq7cNYPMf#@L-{gu&fC_pkg{a8Y)oAz@y_>wt`L8< zuIi7`P#-z1Y0NP;l&t_}X?ectv%Y?rzbp`ksW2Zqvr5y{BykeQRky3wNHt~#YXc2y z;4Mv+&V06TQ!A#d_{K|Mo(GQdu1XP4W2(yQ5-;}S7*Nb{1Ol#1PGaKU?!3fGTRZkE zzq~C6#k)B6D*vwX5kc*CP3n~uW~eH7(~8Ez3PU05+9Y-C)ip9fiqo`NE|;$5d0s*v z!2C_KHKm34}F4 z?uZ2;Q0!qC=|Fc`P7L(8p@fAYkz8Q|!F13QClO17FNIh!8LBAg^=%&I`2PfAT!0b* zaWKhi2rwO=7@`dYXHdqQFH~zKw*W<0avjbD1c2?0jxHFtL^4=Fco4wV7CR?i=6JQt zwg`#;e-K|DZ52WYhu4V%Fcw5KVJ76KPn;*6X&oU9jWZS@>5f(lhB8g>kzCD6$SZxB z121A0pmV!bTf`z2P2mA@WEbHiLHu}c5RZQvWI3QjsiLjM|A7nyvIu03P-PYtU%%e` zx`Tc0KEr<595=_~!^3g&@UYobkB?7J*dh-qg9Bs^^MpAQ@_5`q2)uzCLlP13P0dWFjorr zM@s|G?(iEwU~C#b_1qK$@XQWb$kns#;N_WI;fDLzaU1x5 iCg-g6%c%I22n-{bFL(iD&oJ>}*mh2Baq9iYPV_ej6v3VV literal 0 HcmV?d00001 diff --git a/mods/ra/maps/survival01/map.yaml b/mods/ra/maps/survival01/map.yaml index 163875e09b..3799c1c485 100644 --- a/mods/ra/maps/survival01/map.yaml +++ b/mods/ra/maps/survival01/map.yaml @@ -1262,8 +1262,10 @@ Rules: ParachuteSequence: parach AFLD.mission: Inherits: AFLD - -AirstrikePower: - -ParatroopersPower: + -AirstrikePower@spyplane: + -ParatroopersPower@paratroopers + -ParatroopersPower@armordrop: + -AirstrikePower@parabombs: -SupportPowerChargeBar: RenderBuilding: Image: AFLD diff --git a/mods/ra/rules/ai.yaml b/mods/ra/rules/ai.yaml index 40f7b33ba5..9e3ce98d22 100644 --- a/mods/ra/rules/ai.yaml +++ b/mods/ra/rules/ai.yaml @@ -62,8 +62,8 @@ Player: ttnk: 10% stnk: 5% SquadSize: 20 - SupportPowerDecision@Airstrike: - OrderName: AirstrikePowerInfoOrder + SupportPowerDecision@spyplane: + OrderName: SovietSpyPlane MinimumAttractiveness: 1 Consideration@1: Against: Enemy @@ -71,8 +71,8 @@ Player: Attractiveness: 1 TargetMetric: None CheckRadius: 5c0 - SupportPowerDecision@Paratroopers: - OrderName: ParatroopersPowerInfoOrder + SupportPowerDecision@paratroopers: + OrderName: SovietParatroopers MinimumAttractiveness: 5 Consideration@1: Against: Enemy @@ -86,7 +86,31 @@ Player: Attractiveness: -10 TargetMetric: None CheckRadius: 10c0 - SupportPowerDecision@NukePower: + SupportPowerDecision@armordrop: + OrderName: RussiaArmorDrop + MinimumAttractiveness: 5 + Consideration@1: + Against: Enemy + Types: Structure + Attractiveness: 1 + TargetMetric: None + CheckRadius: 10c0 + Consideration@2: + Against: Enemy + Types: Vehicle, Tank, Infantry, Defense + Attractiveness: -10 + TargetMetric: None + CheckRadius: 10c0 + SupportPowerDecision@parabombs: + OrderName: UkraineParabombs + MinimumAttractiveness: 1 + Consideration@1: + Against: Enemy + Types: Structure + Attractiveness: 1 + TargetMetric: None + CheckRadius: 5c0 + SupportPowerDecision@nukepower: OrderName: NukePowerInfoOrder MinimumAttractiveness: 3000 Consideration@1: @@ -180,8 +204,8 @@ Player: ca: 10% pt: 10% SquadSize: 40 - SupportPowerDecision@Airstrike: - OrderName: AirstrikePowerInfoOrder + SupportPowerDecision@spyplane: + OrderName: SovietSpyPlane MinimumAttractiveness: 1 Consideration@1: Against: Enemy @@ -189,8 +213,8 @@ Player: Attractiveness: 1 TargetMetric: None CheckRadius: 5c0 - SupportPowerDecision@Paratroopers: - OrderName: ParatroopersPowerInfoOrder + SupportPowerDecision@paratroopers: + OrderName: SovietParatroopers MinimumAttractiveness: 5 Consideration@1: Against: Enemy @@ -204,7 +228,31 @@ Player: Attractiveness: -10 TargetMetric: None CheckRadius: 10c0 - SupportPowerDecision@NukePower: + SupportPowerDecision@armordrop: + OrderName: RussiaArmorDrop + MinimumAttractiveness: 5 + Consideration@1: + Against: Enemy + Types: Structure + Attractiveness: 1 + TargetMetric: None + CheckRadius: 10c0 + Consideration@2: + Against: Enemy + Types: Vehicle, Tank, Infantry, Defense + Attractiveness: -10 + TargetMetric: None + CheckRadius: 10c0 + SupportPowerDecision@parabombs: + OrderName: UkraineParabombs + MinimumAttractiveness: 1 + Consideration@1: + Against: Enemy + Types: Structure + Attractiveness: 1 + TargetMetric: None + CheckRadius: 5c0 + SupportPowerDecision@nukepower: OrderName: NukePowerInfoOrder MinimumAttractiveness: 3000 Consideration@1: @@ -297,8 +345,8 @@ Player: ca: 10% pt: 10% SquadSize: 10 - SupportPowerDecision@Airstrike: - OrderName: AirstrikePowerInfoOrder + SupportPowerDecision@spyplane: + OrderName: SovietSpyPlane MinimumAttractiveness: 1 Consideration@1: Against: Enemy @@ -306,8 +354,8 @@ Player: Attractiveness: 1 TargetMetric: None CheckRadius: 5c0 - SupportPowerDecision@Paratroopers: - OrderName: ParatroopersPowerInfoOrder + SupportPowerDecision@paratroopers: + OrderName: SovietParatroopers MinimumAttractiveness: 5 Consideration@1: Against: Enemy @@ -321,7 +369,31 @@ Player: Attractiveness: -10 TargetMetric: None CheckRadius: 10c0 - SupportPowerDecision@NukePower: + SupportPowerDecision@armordrop: + OrderName: RussiaArmorDrop + MinimumAttractiveness: 5 + Consideration@1: + Against: Enemy + Types: Structure + Attractiveness: 1 + TargetMetric: None + CheckRadius: 10c0 + Consideration@2: + Against: Enemy + Types: Vehicle, Tank, Infantry, Defense + Attractiveness: -10 + TargetMetric: None + CheckRadius: 10c0 + SupportPowerDecision@parabombs: + OrderName: UkraineParabombs + MinimumAttractiveness: 1 + Consideration@1: + Against: Enemy + Types: Structure + Attractiveness: 1 + TargetMetric: None + CheckRadius: 5c0 + SupportPowerDecision@nukepower: OrderName: NukePowerInfoOrder MinimumAttractiveness: 3000 Consideration@1: @@ -389,8 +461,8 @@ Player: ca: 20% pt: 10% SquadSize: 1 - SupportPowerDecision@Airstrike: - OrderName: AirstrikePowerInfoOrder + SupportPowerDecision@spyplane: + OrderName: SovietSpyPlane MinimumAttractiveness: 1 Consideration@1: Against: Enemy @@ -398,8 +470,8 @@ Player: Attractiveness: 1 TargetMetric: None CheckRadius: 5c0 - SupportPowerDecision@Paratroopers: - OrderName: ParatroopersPowerInfoOrder + SupportPowerDecision@paratroopers: + OrderName: SovietParatroopers MinimumAttractiveness: 5 Consideration@1: Against: Enemy @@ -413,7 +485,31 @@ Player: Attractiveness: -10 TargetMetric: None CheckRadius: 10c0 - SupportPowerDecision@NukePower: + SupportPowerDecision@armordrop: + OrderName: RussiaArmorDrop + MinimumAttractiveness: 5 + Consideration@1: + Against: Enemy + Types: Structure + Attractiveness: 1 + TargetMetric: None + CheckRadius: 10c0 + Consideration@2: + Against: Enemy + Types: Vehicle, Tank, Infantry, Defense + Attractiveness: -10 + TargetMetric: None + CheckRadius: 10c0 + SupportPowerDecision@parabombs: + OrderName: UkraineParabombs + MinimumAttractiveness: 1 + Consideration@1: + Against: Enemy + Types: Structure + Attractiveness: 1 + TargetMetric: None + CheckRadius: 5c0 + SupportPowerDecision@nukepower: OrderName: NukePowerInfoOrder MinimumAttractiveness: 3000 Consideration@1: diff --git a/mods/ra/rules/defaults.yaml b/mods/ra/rules/defaults.yaml index a4644dd6ad..ccb29745a9 100644 --- a/mods/ra/rules/defaults.yaml +++ b/mods/ra/rules/defaults.yaml @@ -147,6 +147,15 @@ TimedUpgradeBar: Upgrade: invulnerability MustBeDestroyed: + Parachutable: + ParachuteOffset: 0,0,200 + KilledOnImpassableTerrain: true + ParachuteSequence: parach + ShadowSequence: + GroundCorpseSequence: + GroundCorpsePalette: + WaterCorpseSequence: + WaterCorpsePalette: ^Infantry: AppearsOnRadar: diff --git a/mods/ra/rules/misc.yaml b/mods/ra/rules/misc.yaml index 33164ed75f..803381e4f5 100644 --- a/mods/ra/rules/misc.yaml +++ b/mods/ra/rules/misc.yaml @@ -78,10 +78,6 @@ CRATE: RevealMapCrateAction: SelectionShares: 1 Effect: reveal-map - SupportPowerCrateAction@parabombs: - SelectionShares: 5 - Proxy: powerproxy.parabombs - Effect: parabombs DuplicateUnitCrateAction: SelectionShares: 10 MaxAmount: 5 diff --git a/mods/ra/rules/structures.yaml b/mods/ra/rules/structures.yaml index 4f7ff10f4b..b9bea275b2 100644 --- a/mods/ra/rules/structures.yaml +++ b/mods/ra/rules/structures.yaml @@ -914,7 +914,27 @@ AFLD: Production: Produces: Aircraft, Plane Reservable: - AirstrikePower: + ProvidesCustomPrerequisite@sovietvanilla: + Race: soviet + Prerequisite: aircraft.sovietvanilla + ProvidesCustomPrerequisite@russia: + Race: russia + Prerequisite: aircraft.russia + ProvidesCustomPrerequisite@ukraine: + Race: ukraine + Prerequisite: aircraft.ukraine + ProvidesCustomPrerequisite@sovietvanillastructure: + RequiresPrerequisites: structures.sovietvanilla + Prerequisite: aircraft.sovietvanilla + ProvidesCustomPrerequisite@russianstructure: + RequiresPrerequisites: structures.russia + Prerequisite: aircraft.russia + ProvidesCustomPrerequisite@ukrainianstructure: + RequiresPrerequisites: structures.ukraine + Prerequisite: aircraft.ukraine + AirstrikePower@spyplane: + OrderName: SovietSpyPlane + Prerequisites: aircraft.sovietvanilla Icon: spyplane ChargeTime: 180 Description: Spy Plane @@ -927,7 +947,9 @@ AFLD: QuantizedFacings: 8 DisplayBeacon: true BeaconPoster: camicon - ParatroopersPower: + ParatroopersPower@paratroopers: + OrderName: SovietParatroopers + Prerequisites: aircraft.sovietvanilla Icon: paratroopers ChargeTime: 360 Description: Paratroopers @@ -939,6 +961,35 @@ AFLD: CameraActor: camera.paradrop DisplayBeacon: true BeaconPoster: pinficon + ParatroopersPower@armordrop: + OrderName: RussiaArmorDrop + Prerequisites: aircraft.russia + Icon: armordrop + ChargeTime: 450 + Description: Armor Airdrop + LongDesc: Badgers drop a pair of\nHeavy Tanks anywhere on the map. + DropItems: 3TNK,3TNK + SquadSize: 2 + SelectTargetSound: slcttgt1.aud + AllowImpassableCells: false + QuantizedFacings: 8 + CameraActor: camera.paradrop + DisplayBeacon: true + BeaconPoster: armordropicon + AirstrikePower@parabombs: + OrderName: UkraineParabombs + Prerequisites: aircraft.ukraine + Icon: parabombs + ChargeTime: 270 + Description: Parabombs + LongDesc: A Badger drops a load of parachuted\nbombs on your target. + SelectTargetSound: slcttgt1.aud + CameraActor: camera + CameraRemoveDelay: 150 + UnitType: badr.bomber + QuantizedFacings: 8 + DisplayBeacon: true + BeaconPoster: pbmbicon ProductionBar: SupportPowerChargeBar: PrimaryBuilding: diff --git a/mods/ra/sequences/misc.yaml b/mods/ra/sequences/misc.yaml index e101b030f7..547869035d 100644 --- a/mods/ra/sequences/misc.yaml +++ b/mods/ra/sequences/misc.yaml @@ -141,6 +141,10 @@ beacon: Start: 0 Length: * Offset: 0,-42 + armordropicon: lores-pinficon + Start: 0 + Length: * + Offset: 0,-42 clock: beaconclock Start: 0 Length: * @@ -516,6 +520,8 @@ icon: Start: 0 paratroopers: pinficon Start: 0 + armordrop: armordropicon + Start: 0 gps: gpssicon Start: 0 parabombs: pbmbicon From 1c2bda8460fe1b9cff846ebaa05f0b765d9f3b76 Mon Sep 17 00:00:00 2001 From: ScottNZ Date: Sun, 9 Nov 2014 00:57:40 +1300 Subject: [PATCH 04/22] Update crates for new countries --- mods/ra/rules/misc.yaml | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/mods/ra/rules/misc.yaml b/mods/ra/rules/misc.yaml index 803381e4f5..3984bd1897 100644 --- a/mods/ra/rules/misc.yaml +++ b/mods/ra/rules/misc.yaml @@ -90,51 +90,51 @@ CRATE: GiveUnitCrateAction@jeep: SelectionShares: 7 Units: jeep - ValidRaces: allies + ValidRaces: allies, england, france, germany Prerequisites: techlevel.low GiveUnitCrateAction@arty: SelectionShares: 6 Units: arty - ValidRaces: allies + ValidRaces: allies, england, france, germany Prerequisites: techlevel.medium, dome GiveUnitCrateAction@v2rl: SelectionShares: 6 Units: v2rl - ValidRaces: soviet + ValidRaces: soviet, russia, ukraine Prerequisites: techlevel.medium, dome GiveUnitCrateAction@1tnk: SelectionShares: 5 Units: 1tnk - ValidRaces: allies + ValidRaces: allies, england, france, germany Prerequisites: techlevel.low GiveUnitCrateAction@2tnk: SelectionShares: 4 Units: 2tnk - ValidRaces: allies + ValidRaces: allies, england, france, germany Prerequisites: techlevel.medium, fix GiveUnitCrateAction@3tnk: SelectionShares: 4 Units: 3tnk - ValidRaces: soviet + ValidRaces: soviet, russia, ukraine Prerequisites: techlevel.medium, fix GiveUnitCrateAction@4tnk: SelectionShares: 3 Units: 4tnk - ValidRaces: soviet + ValidRaces: soviet, russia, ukraine Prerequisites: techlevel.unrestricted, fix, techcenter GiveUnitCrateAction@squadlight: SelectionShares: 7 Units: e1,e1,e1,e3,e3 - ValidRaces: allies, soviet + ValidRaces: allies, england, france, germany, soviet, russia, ukraine GiveUnitCrateAction@squadheavyallies: SelectionShares: 7 Units: e1,e1,e1,e1,e3,e3,e3,e6,medi - ValidRaces: allies + ValidRaces: allies, england, france, germany TimeDelay: 4500 GiveUnitCrateAction@squadheavysoviet: SelectionShares: 7 Units: e1,e1,e4,e4,e3,e3,e3 - ValidRaces: soviet + ValidRaces: soviet, russia, ukraine TimeDelay: 4500 GrantUpgradeCrateAction@invuln: SelectionShares: 5 From 62f85e8e36d78b65fa40171ba1e9447b006f2c1d Mon Sep 17 00:00:00 2001 From: ScottNZ Date: Sun, 9 Nov 2014 01:01:47 +1300 Subject: [PATCH 05/22] Update voice definitions for new countries --- mods/ra/voices.yaml | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/mods/ra/voices.yaml b/mods/ra/voices.yaml index 39d5ebd718..cd628a67d7 100644 --- a/mods/ra/voices.yaml +++ b/mods/ra/voices.yaml @@ -1,7 +1,12 @@ GenericVoice: Variants: - soviet: .r01,.r03 allies: .v01,.v03 + england: .v01,.v03 + france: .v01,.v03 + germany: .v01,.v03 + soviet: .r01,.r03 + russia: .r01,.r03 + ukraine: .r01,.r03 Voices: Select: await1,ready,report1,yessir1 Move: ackno,affirm1,noprob,overout,ritaway,roger,ugotit @@ -12,8 +17,13 @@ GenericVoice: VehicleVoice: Variants: - soviet: .r00,.r02 allies: .v00,.v02 + england: .v00,.v02 + france: .v00,.v02 + germany: .v00,.v02 + soviet: .r00,.r02 + russia: .r00,.r02 + ukraine: .r00,.r02 Voices: Select: vehic1,yessir1,report1,await1 Move: ackno,affirm1 From 01db3fc4b891b3a489da77c63cd1575f12a5f799 Mon Sep 17 00:00:00 2001 From: ScottNZ Date: Sun, 9 Nov 2014 12:56:27 +1300 Subject: [PATCH 06/22] Adjust fake structure tooltips to appear real to enemies --- mods/ra/rules/structures.yaml | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/mods/ra/rules/structures.yaml b/mods/ra/rules/structures.yaml index b9bea275b2..1ad0c592f7 100644 --- a/mods/ra/rules/structures.yaml +++ b/mods/ra/rules/structures.yaml @@ -1238,6 +1238,9 @@ FACF: Icon: fake-icon Name: Fake Construction Yard Description: Looks like a Construction Yard. + GenericName: Construction Yard + GenericVisibility: Enemy + GenericStancePrefix: False Building: Footprint: xxx xxx xxx Dimensions: 3,3 @@ -1267,6 +1270,9 @@ WEAF: Icon: fake-icon Name: Fake War Factory Description: Looks like a War Factory. + GenericName: War Factory + GenericVisibility: Enemy + GenericStancePrefix: False Building: Footprint: xxx xxx Dimensions: 3,2 @@ -1297,6 +1303,9 @@ SYRF: Icon: fake-icon Name: Fake Shipyard Description: Looks like a Shipyard. + GenericName: Shipyard + GenericVisibility: Enemy + GenericStancePrefix: False TargetableBuilding: TargetTypes: Ground, Water Building: @@ -1331,6 +1340,9 @@ SPEF: Icon: fake-icon Name: Fake Sub Pen Description: Looks like a Sub Pen. + GenericName: Sub Pen + GenericVisibility: Enemy + GenericStancePrefix: False Building: Footprint: xxx xxx xxx Dimensions: 3,3 @@ -1357,6 +1369,9 @@ DOMF: Icon: fake-icon Name: Fake Radar Dome Description: Looks like a Radar Dome. + GenericName: Radar Dome + GenericVisibility: Enemy + GenericStancePrefix: False Buildable: BuildPaletteOrder: 930 Queue: Defense From 20fd862d75e4813c051155ddd1b2b544849482b3 Mon Sep 17 00:00:00 2001 From: ScottNZ Date: Sun, 9 Nov 2014 13:17:18 +1300 Subject: [PATCH 07/22] Rebalance fake structures --- mods/ra/rules/structures.yaml | 30 ++++++++++-------------------- 1 file changed, 10 insertions(+), 20 deletions(-) diff --git a/mods/ra/rules/structures.yaml b/mods/ra/rules/structures.yaml index 1ad0c592f7..4e5f4ae6b5 100644 --- a/mods/ra/rules/structures.yaml +++ b/mods/ra/rules/structures.yaml @@ -1229,7 +1229,7 @@ FIX: FACF: Inherits: ^Building Valued: - Cost: 50 + Cost: 200 Buildable: BuildPaletteOrder: 940 Queue: Defense @@ -1246,7 +1246,7 @@ FACF: Dimensions: 3,3 -GivesBuildableArea: Health: - HP: 30 + HP: 100 RevealsShroud: Range: 4c0 Bib: @@ -1254,14 +1254,12 @@ FACF: Image: FACT Fake: -EmitInfantryOnSell: - Power: - Amount: -2 -MustBeDestroyed: WEAF: Inherits: ^Building Valued: - Cost: 50 + Cost: 200 Buildable: BuildPaletteOrder: 920 Prerequisites: ~disabled @@ -1278,7 +1276,7 @@ WEAF: Dimensions: 3,2 -GivesBuildableArea: Health: - HP: 30 + HP: 100 RevealsShroud: Range: 4c0 Bib: @@ -1287,14 +1285,12 @@ WEAF: Image: WEAP Fake: -EmitInfantryOnSell: - Power: - Amount: -2 -MustBeDestroyed: SYRF: Inherits: ^Building Valued: - Cost: 50 + Cost: 200 Buildable: BuildPaletteOrder: 900 Queue: Defense @@ -1315,21 +1311,19 @@ SYRF: TerrainTypes: Water -GivesBuildableArea: Health: - HP: 30 + HP: 100 RevealsShroud: Range: 4c0 RenderBuilding: Image: SYRD Fake: -EmitInfantryOnSell: - Power: - Amount: -2 -MustBeDestroyed: SPEF: Inherits: ^Building Valued: - Cost: 50 + Cost: 200 TargetableBuilding: TargetTypes: Ground, Water Buildable: @@ -1350,21 +1344,19 @@ SPEF: TerrainTypes: Water -GivesBuildableArea: Health: - HP: 30 + HP: 100 RevealsShroud: Range: 4c0 RenderBuilding: Image: SPEN Fake: -EmitInfantryOnSell: - Power: - Amount: -2 -MustBeDestroyed: DOMF: Inherits: ^Building Valued: - Cost: 50 + Cost: 200 Tooltip: Icon: fake-icon Name: Fake Radar Dome @@ -1381,7 +1373,7 @@ DOMF: Dimensions: 2,2 -GivesBuildableArea: Health: - HP: 30 + HP: 100 RevealsShroud: Range: 4c0 Bib: @@ -1389,8 +1381,6 @@ DOMF: Image: DOME Fake: -EmitInfantryOnSell: - Power: - Amount: -2 -MustBeDestroyed: SBAG: From 40fda57769d23defa7893152cc3411f76c50c419 Mon Sep 17 00:00:00 2001 From: ScottNZ Date: Sun, 9 Nov 2014 13:25:32 +1300 Subject: [PATCH 08/22] Let vanilla Allies build fake structures (except fake sub pen because it's silly) --- mods/ra/rules/structures.yaml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/mods/ra/rules/structures.yaml b/mods/ra/rules/structures.yaml index 4e5f4ae6b5..fc5bdff4ff 100644 --- a/mods/ra/rules/structures.yaml +++ b/mods/ra/rules/structures.yaml @@ -1233,7 +1233,7 @@ FACF: Buildable: BuildPaletteOrder: 940 Queue: Defense - Prerequisites: ~disabled + Prerequisites: ~structures.alliesvanilla, ~techlevel.medium Tooltip: Icon: fake-icon Name: Fake Construction Yard @@ -1262,7 +1262,7 @@ WEAF: Cost: 200 Buildable: BuildPaletteOrder: 920 - Prerequisites: ~disabled + Prerequisites: ~structures.alliesvanilla, ~techlevel.medium Queue: Defense Tooltip: Icon: fake-icon @@ -1294,7 +1294,7 @@ SYRF: Buildable: BuildPaletteOrder: 900 Queue: Defense - Prerequisites: ~disabled + Prerequisites: ~structures.alliesvanilla, ~techlevel.medium Tooltip: Icon: fake-icon Name: Fake Shipyard @@ -1367,7 +1367,7 @@ DOMF: Buildable: BuildPaletteOrder: 930 Queue: Defense - Prerequisites: ~disabled + Prerequisites: ~structures.alliesvanilla, ~techlevel.medium Building: Footprint: xx xx Dimensions: 2,2 From 61ad0edc15e86a5c733f44a562495fa7d0dd66b0 Mon Sep 17 00:00:00 2001 From: ScottNZ Date: Sun, 9 Nov 2014 15:49:37 +1300 Subject: [PATCH 09/22] Change spy to be 50% cheaper for England --- mods/ra/rules/infantry.yaml | 13 ++++++++++++- mods/ra/rules/structures.yaml | 8 +++++++- 2 files changed, 19 insertions(+), 2 deletions(-) diff --git a/mods/ra/rules/infantry.yaml b/mods/ra/rules/infantry.yaml index dbad3a1819..1bbac45f1b 100644 --- a/mods/ra/rules/infantry.yaml +++ b/mods/ra/rules/infantry.yaml @@ -194,7 +194,7 @@ SPY: Queue: Infantry BuildAtProductionType: Soldier BuildPaletteOrder: 90 - Prerequisites: dome, ~tent, ~techlevel.medium + Prerequisites: ~!infantry.england, dome, ~tent, ~techlevel.medium Valued: Cost: 500 -Tooltip: @@ -226,6 +226,17 @@ SPY: Weapon: SilencedPPK AttackFrontal: +SPY.England: + Inherits: SPY + RenderDisguise: + Image: spy + Buildable: + Prerequisites: ~infantry.england, dome, ~tent, ~techlevel.medium + Valued: + Cost: 250 + DisguiseToolTip: + Name: British Spy + E7: Inherits: ^Infantry Buildable: diff --git a/mods/ra/rules/structures.yaml b/mods/ra/rules/structures.yaml index fc5bdff4ff..8fab1a1e12 100644 --- a/mods/ra/rules/structures.yaml +++ b/mods/ra/rules/structures.yaml @@ -1191,8 +1191,14 @@ TENT: Produces: Infantry, Soldier PrimaryBuilding: ProductionBar: - ProvidesCustomPrerequisite: + ProvidesCustomPrerequisite@barracks: Prerequisite: barracks + ProvidesCustomPrerequisite@england: + Race: england + Prerequisite: infantry.england + ProvidesCustomPrerequisite@englishstructure: + RequiresPrerequisites: structures.england + Prerequisite: infantry.england Power: Amount: -20 From fc1392e9ad51dca89f194fb679b8f9dbb63a924f Mon Sep 17 00:00:00 2001 From: ScottNZ Date: Mon, 10 Nov 2014 22:48:25 +1300 Subject: [PATCH 10/22] Add Advanced Chronosphere for Germany --- mods/ra/rules/structures.yaml | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/mods/ra/rules/structures.yaml b/mods/ra/rules/structures.yaml index 8fab1a1e12..9478456d6e 100644 --- a/mods/ra/rules/structures.yaml +++ b/mods/ra/rules/structures.yaml @@ -238,7 +238,7 @@ PDOX: Buildable: Queue: Defense BuildPaletteOrder: 120 - Prerequisites: atek, ~structures.allies, ~techlevel.unrestricted + Prerequisites: atek, ~structures.allies, ~!structures.germany, ~techlevel.unrestricted BuildLimit: 1 Valued: Cost: 1500 @@ -278,6 +278,20 @@ PDOX: MustBeDestroyed: RequiredForShortGame: false +PDOX.Germany: + Inherits: PDOX + Buildable: + Prerequisites: atek, ~structures.germany, ~techlevel.unrestricted + RenderBuilding: + Image: pdox + Tooltip: + Name: Advanced Chronosphere + Description: Teleports a large group of units across the\nmap for a short time. Requires power to operate.\n Special Ability: Chronoshift\n\nMaximum 1 can be built + ChronoshiftPower: + Description: Advanced Chronoshift + LongDesc: Teleports a large group of units across the\nmap for 20 seconds. + Range: 2 + TSLA: Inherits: ^Defense Buildable: From 8da406238b6a2b8bb1b0f113ca8c8c0895c30981 Mon Sep 17 00:00:00 2001 From: ScottNZ Date: Fri, 14 Nov 2014 15:29:43 +1300 Subject: [PATCH 11/22] Set up prerequisites for WEAP --- mods/ra/rules/structures.yaml | 46 +++++++++++++++++++++++++++++++++-- 1 file changed, 44 insertions(+), 2 deletions(-) diff --git a/mods/ra/rules/structures.yaml b/mods/ra/rules/structures.yaml index 9478456d6e..2e11e2342f 100644 --- a/mods/ra/rules/structures.yaml +++ b/mods/ra/rules/structures.yaml @@ -705,17 +705,59 @@ WEAP: Production: Produces: Vehicle ProvidesCustomPrerequisite@allies: - Race: allies + Race: allies, england, france, germany Prerequisite: vehicles.allies + ProvidesCustomPrerequisite@alliesvanilla: + Race: allies + Prerequisite: vehicles.alliesvanilla + ProvidesCustomPrerequisite@england: + Race: england + Prerequisite: vehicles.england + ProvidesCustomPrerequisite@france: + Race: france + Prerequisite: vehicles.france + ProvidesCustomPrerequisite@germany: + Race: germany + Prerequisite: vehicles.germany ProvidesCustomPrerequisite@soviet: - Race: soviet + Race: soviet, russia, ukraine Prerequisite: vehicles.soviet + ProvidesCustomPrerequisite@sovietvanilla: + Race: soviet + Prerequisite: vehicles.sovietvanilla + ProvidesCustomPrerequisite@russia: + Race: russia + Prerequisite: vehicles.russia + ProvidesCustomPrerequisite@ukraine: + Race: ukraine + Prerequisite: vehicles.ukraine ProvidesCustomPrerequisite@alliedstructure: RequiresPrerequisites: structures.allies Prerequisite: vehicles.allies + ProvidesCustomPrerequisite@alliedvanillastructure: + RequiresPrerequisites: structures.alliesvanilla + Prerequisite: vehicles.alliesvanilla + ProvidesCustomPrerequisite@englishstructure: + RequiresPrerequisites: structures.england + Prerequisite: vehicles.england + ProvidesCustomPrerequisite@frenchstructure: + RequiresPrerequisites: structures.france + Prerequisite: vehicles.france + ProvidesCustomPrerequisite@germanstructure: + RequiresPrerequisites: structures.germany + Prerequisite: vehicles.germany ProvidesCustomPrerequisite@sovietstructure: RequiresPrerequisites: structures.soviet Prerequisite: vehicles.soviet + ProvidesCustomPrerequisite@sovietvanillastructure: + RequiresPrerequisites: structures.sovietvanilla + Prerequisite: vehicles.sovietvanilla + ProvidesCustomPrerequisite@russianstructure: + RequiresPrerequisites: structures.russia + Prerequisite: vehicles.russia + ProvidesCustomPrerequisite@ukrainianstructure: + RequiresPrerequisites: structures.ukraine + Prerequisite: vehicles.ukraine PrimaryBuilding: ProductionBar: Power: From 4b94bfdf858db374797be6392bc592c0fa7b8529 Mon Sep 17 00:00:00 2001 From: ScottNZ Date: Fri, 14 Nov 2014 16:20:29 +1300 Subject: [PATCH 12/22] stnk -> England, mgg -> France, ctnk -> Germany, qtnk -> Russia, dtrk -> Ukraine --- mods/ra/rules/structures.yaml | 2 +- mods/ra/rules/vehicles.yaml | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/mods/ra/rules/structures.yaml b/mods/ra/rules/structures.yaml index 2e11e2342f..b9c57b8442 100644 --- a/mods/ra/rules/structures.yaml +++ b/mods/ra/rules/structures.yaml @@ -56,7 +56,7 @@ GAP: Buildable: Queue: Defense BuildPaletteOrder: 110 - Prerequisites: atek, ~structures.allies, ~techlevel.unrestricted + Prerequisites: atek, ~!structures.france, ~structures.allies, ~techlevel.unrestricted Building: Footprint: _ x Dimensions: 1,2 diff --git a/mods/ra/rules/vehicles.yaml b/mods/ra/rules/vehicles.yaml index 2d6d57aa24..cca27bdced 100644 --- a/mods/ra/rules/vehicles.yaml +++ b/mods/ra/rules/vehicles.yaml @@ -635,7 +635,7 @@ DTRK: Buildable: Queue: Vehicle BuildPaletteOrder: 170 - Prerequisites: stek, ~vehicles.soviet, ~techlevel.unrestricted + Prerequisites: stek, ~vehicles.ukraine, ~techlevel.unrestricted Valued: Cost: 2500 Tooltip: @@ -666,7 +666,7 @@ CTNK: Buildable: Queue: Vehicle BuildPaletteOrder: 210 - Prerequisites: atek, pdox, ~vehicles.allies, ~techlevel.unrestricted + Prerequisites: atek, pdox, ~vehicles.germany, ~techlevel.unrestricted Valued: Cost: 1350 Tooltip: @@ -704,7 +704,7 @@ QTNK: Buildable: Queue: Vehicle BuildPaletteOrder: 200 - Prerequisites: fix, stek, ~vehicles.soviet, ~techlevel.unrestricted + Prerequisites: fix, stek, ~vehicles.russia, ~techlevel.unrestricted Valued: Cost: 2500 Tooltip: @@ -734,7 +734,7 @@ STNK: Buildable: Queue: Vehicle BuildPaletteOrder: 140 - Prerequisites: atek, ~vehicles.allies, ~techlevel.unrestricted + Prerequisites: atek, ~vehicles.england, ~techlevel.unrestricted Valued: Cost: 1350 Tooltip: From 846b15fb26d73615a5a13b19ab7e65b5693bf0ed Mon Sep 17 00:00:00 2001 From: ScottNZ Date: Thu, 20 Nov 2014 16:47:59 +1300 Subject: [PATCH 13/22] Add Advanced Gap Generator for France --- mods/ra/rules/structures.yaml | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/mods/ra/rules/structures.yaml b/mods/ra/rules/structures.yaml index b9c57b8442..54515520a5 100644 --- a/mods/ra/rules/structures.yaml +++ b/mods/ra/rules/structures.yaml @@ -81,6 +81,19 @@ GAP: MustBeDestroyed: RequiredForShortGame: false +GAP.France: + Inherits: GAP + RenderBuilding: + Image: gap + Tooltip: + Name: Advanced Gap Generator + Buildable: + Prerequisites: atek, ~structures.france, ~techlevel.unrestricted + RevealsShroud: + Range: 10c0 + CreatesShroud: + Range: 10c0 + SPEN: Inherits: ^Building InfiltrateForSupportPower: From 32c25d03a1f232656a07ceefdc5b7dcb2eea5a3d Mon Sep 17 00:00:00 2001 From: ScottNZ Date: Sun, 23 Nov 2014 14:34:02 +1300 Subject: [PATCH 14/22] Add new flags to ra countries, based on tomsons26's work --- mods/ra/chrome.yaml | 34 ++++++++++++++++++++-------------- mods/ra/uibits/buttons.png | Bin 22113 -> 19488 bytes 2 files changed, 20 insertions(+), 14 deletions(-) diff --git a/mods/ra/chrome.yaml b/mods/ra/chrome.yaml index d1163eced4..8e92077628 100644 --- a/mods/ra/chrome.yaml +++ b/mods/ra/chrome.yaml @@ -336,15 +336,21 @@ strategic: strategic.png player_owned: 96,0,32,32 flags: buttons.png - allies: 30,112,30,15 - england: 30,112,30,15 - france: 30,112,30,15 - germany: 30,112,30,15 soviet: 0,112,30,15 - russia: 0,112,30,15 - ukraine: 0,112,30,15 + allies: 30,112,30,15 random: 60,112,30,15 spectator: 60,112,30,15 + + russia: 0,127,30,15 + ukraine: 30,127,30,15 + england: 60,127,30,15 + + germany: 0,142,30,15 + spain: 30,142,30,15 + france: 60,142,30,15 + + turkey: 0,157,30,15 + greece: 30,157,30,15 music: musicplayer.png pause: 0,0,25,25 @@ -356,10 +362,10 @@ music: musicplayer.png slowmo: 168,0,25,25 scrollbar: buttons.png - down_arrow: 16,140,16,16 - down_pressed: 16,140,16,16 - up_arrow: 32,140,16,16 - up_pressed: 32,140,16,16 + down_arrow: 116,140,16,16 + down_pressed: 116,140,16,16 + up_arrow: 132,140,16,16 + up_pressed: 132,140,16,16 # A copy of dialog3 (pressed button) progressbar-bg: dialog.png @@ -733,10 +739,10 @@ checkbox: dialog.png corner-br: 767,127,1,1 checkbox-bits: buttons.png - checked: 0,157,16,16 - checked-disabled: 0,173,16,16 - crossed: 16,157,16,16 - crossed-disabled: 16,173,16,16 + checked: 100,157,16,16 + checked-disabled: 100,173,16,16 + crossed: 116,157,16,16 + crossed-disabled: 116,173,16,16 checkbox-hover: dialog.png background: 641,129,126,126 diff --git a/mods/ra/uibits/buttons.png b/mods/ra/uibits/buttons.png index 16b9674eb6124b19afa210d94d037400d7743bfa..e98f5306e1b6d9581d4ea46ee6e8eb6f6bddb9b1 100644 GIT binary patch literal 19488 zcmY)VcT`i~^F0pV0EW;61f&xX1qA6J(vnaFldTcElGldnIip0Qeq5g?n~|_@2T|!`K}FsObOxfr4x-;)oZ?JsxP^C!Zr{ zyG||YRZJgDyu{*h|A~jbtDT4Uvsbo&+cU=(9wIMnJ-DSr#6%?DttIIJfaco=s!9ev z<~t4K$(-sb7*+@h3GM^3@9l0Hf8W6#lUmIN;v!=r3MlUWaaJNSdG zg;DqT6?fBQ!};%l*we%~Uh<2ImcTntzHy7%^{0+IxXr(~E&i^9uK>io=JvEb!(7E= z=$T)M!j)m3M!D}^kdX9kdv>MEkj^#O?sL)wSmRl{s9O6~h~(^xJJs{fB{dzFE=xgT zt<}jk)Tkh&&tW&e;-DfXU4ei*;;MXr-GlCSFKv8mgvBgd`Es-#&?@Ysn3FTt&kk~t z=wlH@e>)1#!D!A*CLu$g%I8xbt~g@2(8=w;;)DaZI@=GA6(YQs+9FeqxbK}lm_%FL z*O9ZlR#TWfe(P8WN)rVsDvwzt>N`A<{-QU^>( z!@$jK24~r<4*ew_4hPZH-xZix*Z+GRZr9w1pG_^zvCrtGF1Is!QM<^=YUL}Xi?UW3 z-a79C-YGLkqw?}$yP-jQ(b=qpQz~)#tplmQI^qX-wVfAL&(swK@hfcVk~bn)Q4?d^ zTb{@D*L67T&S}e6*K#?!C`A9V0*29z+ zg&-`8)?%jQKOKEaz$liVRAY(jrXeR^ri@go>F93WP~SEsZ+*ayn&?6JM)Q7|TpmnJ z2GKEvEOom5U5@|WoJ9h3O>98Uq)vn0n4|Ke_QS*>GJ#%cfL9OHMvbzr&=;*YO#Md7 z{Sg}c!<3Y+feod0B^#t?E`MURWY_{jJ!!m_3fP{=;kf?ZaES(>yZH#khR|w*@Mu|E z+*d^g+O~R-6~v*`fC%V4BL^TsH~zXDHv7q_@1~UYdMz7;lno$GUl2Obi04?DG`g!* zV6FFlh`L$erZGM0E~(XGW7ym?Hf#+wO6pMhIc=*qSpi=b;S9l;MGrWf(}||Livc5D zaLs@UFaT+Uk!nDxLiX0JfV^|uw2m@yg|(ai?`Ek8fkVBq>@FTglWD*}L-5q?=`%(I zFA&mU!V5qKEuay`57u8I8^9qmlo&7KdKRk0ky;s!fU|Ct((d;Ey9*ehan&(9yhUfv zxj$3K2=qCNn-PwcqhT?4&Vu?#5jsmJSm{yA7R;tJ4g4xNqB)RsG2Tn`AC_>;7TWYU zt+3NAC>C!EDWwCYfLKEFRM-C$gEq7jRnvPRjKT~;1)I+{XuAVY%jUQ*kIx)Q^;#kA z0X#NsPn;ow9&Ljr=%+&-(ttGe|KImhj^q!@8rM?U6*l1s&!oU}05?5+`KUXD^R$AK zHsT)NaaaWFYZy7=Yua6asi_6FDQMc3hw*^fkZlfxp2@;nQOTALK*S>&#Qo1ZK8QB) zY#G%)hyku!EQ=NO=w3aDTlMQDeF0@cAs}u^<^;~JemwN0^;pV@#EC2-+C7-k;z|M0 z`V6v6+3B5(+tRL|)TENy)@0(JPcx1<$9GEq9qY{S*;yUB^!QmYWvXX#rkXb5J<9#h zpxxi&eyxr6SwEEWI-OP@(Bjb(`ex9Ua;2!N<|C!%6?Hkiu%j^U!(`CPLvpet9sT1} zQ%xGg`*4peErBQdH)2>2$vU#y_VP)$V+#TSQ=v^#F;X!~m5(594Gmh-&lHH{0c0Nw zTNJgyiYl8)ouDAn^;*R`h0@A78_`2*T65+L3BDpL-IIaPAogxEeu3M6r5LjZp82W7 zy=DWNsJ6(YC?9+TIjCEjd^5={xWXBATWj+0ORL9y8WfD2rhuL;hnG`7@;;E2LoqtW zI06PXfABZ~rjpk|4mLTH2IXqHR3_RyE`UjjQ-xF3ho(WY|*7zO0t7{wpG+>yWYW;^e8=Qj@H(y<(6xfVt*N5kt~Zut7at9D zsh~`vcl4UqN#Bg}DGLM)ZP9^3zz8l(`!qXh#*hK>fJ&Y@;qh=mD6P|7J3x(xf|}b` z%_0rNg1S0dBrpP|i@KwwewJYLQi)}nbkeHUwGSv)a2`-W1EPlp!(o$Gm}EjWA-XY- zj^%0xrO#ODgYJ+F{g~xl-N-f?&Zj}N(>#-Fp>5|1-rBGGyT9GWfxt9lGtg3R3P#9n zJ&`NSVhWrh-}*+8^~N9}TBpo_tNtcnTx}XNCJH=>+JE&2|Ve{>f41^>cNtL9*z&i&hzKdJYfET2V;Q9~#gP>ByMAymY=zX6R|-Hpi7*{(PYvvO zN$vQ>`ppYS8<)zSq8%{H(D|p~WnlF1Q9IdhI$XW@vG>0iX25Sbg17HSnq3@xkpc5) zFhx-&vYCuZaT?$t#_fZR6Mq)r@RpHOi)R+jL8q>y)ndmgy*nu}!3Ez#wp=%n1cs}gKt;}r+@gFh4+t%I7sk7nH zot;DL*I%t}R$ko3MCc9W;Mv5usBMxyUtdeEYkYis3uGCcHhWC=b4 zjNG((Os{fd)!G)XW@d6wenE=5IAps~uOlaX z87}dzgZs#2KTLy4kTEq%jL}L%V8QLF63&S%nPe>s`@lqHjpUilqoj{pXG7bJyTSQt zu#onFj|pm)k2#DS0^5_O0ZfOuc(D`;wIQ6&rJDZ2g5@TDaX5f&g^8Vh9u-Wa?Nw<71v z84DaBU%cDtW;SB55CI)_bcLOpm_J|#h}M_=OImR@=BGGLp|;-y%TS%vmhb^bM}$wY zHq;2`4ZX9ds9+aqlD1;ISZXG&{)FC$plwxJt4GgXez_|7>Q2s>0HCDDCmay!!Bnxv zYi{O#XOgm)M@pJS8sOI56S4ym9#C2EnBC{>U4K%-^pT1ec&~w~A4>ikia#)cxJ_x+ z=?kJPjtp*Qk$~IsHysaxDI@932U`!a-ca)b2qM@pQrfD_Apw`b?%Y;qdt--I z2o2guJ{t!LFHaP{oIovz$F|o*8!;+n=IpP%Ji8rVuyT!vHa2{pY+aV=W=6@>2WgLb z5XvT^o>aY7xRpd4T8-XU`0GCoz_BFAUV3-#8{CS%H?^=MHqH7JC*nsAZ)+v}XjR;c(yp^T%cTC{|!5 zL3{mg+`V~Z%Z)#$FQ){J(RK0D4u|Wd@mB7$oHihw?w44#ND1t<|Cd&vOcIhq54A!khGR-snR@v6vf@8{h=w0p4ZkJ^XAKE@ zAV;lG&~W6J;ZJMGwlghE*=>^Mo!9gnR7JLX@tk zaygIz5oW{0%W2D_B(9K>xVyl6;LLX%I7a^6Wo<;&;A32D$>mRCR2m{CDyfE7bbLym z!CSa90w*FMxq8ZRLV~BU<@=JGuakkeqUI?>-i2DHt6yZp*{+1#FuDiLp(L90D1DFv zu<~gy=6HYZ^-%~`a6dNrmr6DAcjI3?A^}Eqm47rcV2pr%=l!gQd#HuWUKk}Ab_pTk zo5PBaMpBe|-}Tk1RIHY0uasJa>){f#*@4woEJ^?9W%(Hs6D zd$MB|ZK^BiF!%Ph(v2FX2IMrLF}hqMdU}#9Cd^#(@1i8I{9o+(y+TS0|8sF*0uod4 zq4bPCj#BOYmDjHt-JV_v&N9fF#v73i6{0GxMVUVcnf!KkJ8AAJ4Jt5t-2cDtWfLBu z$5Q7}=vSLA!s!3GTVMVxN=e}}mXk<}&?_E%e`GyrlHU7VSkj zw4u<{*Qo&EOfXOHOZE`^n?uKgE!oFIHA7pDWLcYnhKjl{Jy_D&$=s`KKFbW08c(+b zN^f?WvFm=|l9A*iQoY4+X}ELGqpjCb5T&psoxOs^TH<0X>Ev$CHtiM=LsIy)Oc}Ks zb4R7;#`-$*G|B%z2&G!IH1Um#PJNnsWQn{@!&o?Xu_?-YGKx+4Y%qrVUTIXC3lqI> zy2TNY{h{Cuk`k7>RjKlN}2I9f1*LT-y-R`y7k(nfnW9Wc~+;hxyW}?-_(+fhzPh8 zFu=s@B@qps)Bo~rZ8PxGo@7QzlmFlFqM8O|KLN6x`!ntW(YYUKLeUVIR7hT>{nt$s z9iq<+g^U?UX=kTLrBp=mGwKNhGz3*jn@y&ctd4-21B)~sk5MX5`rBo=08@c%D`gWu zYQH*bPb&P2T+$%Ayn%Bg4V4W+^R^Fn0WGE8@Fhe2A@@m_$rKbDiW1RY)R7ab#@bIC zN*V!ObUN3Y&E6Pws3`{(YK%W&9HFa?GNR#;0ve!0*yVfo2fxl_t^SKx<79}eh$o}T zH`~|)AD2UZzs)klK{RPlhaty;uiE-$#~D9BZis`Tv#HOsLEL0aLO0e}7JLqshi@n- zUgdddk*A+|6mBbPKh21;eiDx+COd_hMlqvRRK*Tu?YbecIE4gEQ?W^0IEHmj#*Nzc z*IgozjFbV$@(J%Qbc+dnQTS0l?0FC~-H(`1D(qeEm7Yl#&IzhX!9ya3YFYh@p_X9S zBa2kD&R}?0^exeUCw_sWktP}P_zLxu#Xd!EN1-IikhLdV7_YZ+63HbllzLr=oxz`a z_x_bsIvIe;>5igB%U0g#NRU9Q1GPly71xOJEakX%)xv;1|M~dRpv$eyJtU^?@V#q5 zE5pbC2TdWtt+fLQAIeQT!|e*(ph89^eN?G5JnriQ{m(^>%WtYYQA?4ukG99-&Qo^8 znsm{yT~`J|Fl$Hq&3~*Ddv^XLU9k&c%@wcKcrjk;=U^3Z>1^S?+PK(@Kd~TG1Yl?8 zPi+N?=`}L+M0ct{)>h*g;9-YzE^ zna9xvowXkBx6=0V#wgr?B6nNOyMhRqAkiRfLsMdDz^c%zwJ}!T(<#~>W*ElT=v3DC zPZ9r0b|+U7v$>BF3_CU0BdH7DnMC7O_*cJoa>eiNLL04PN?7A|rz^F+wtw+>&%O+w z^_p?{;W)}SRc0TPe($C7ZvBzYRE=lx_Dq#-<%_vHPpe+Uy=Rx{VdL-l`m|C*Tl@XC z+c_1pNJ3Op&5x->;|8ZhtzKcWB|adF%WjCTLs5Q){7uur6(p)^xV?wz01hb}D{8yAE4Fg5wWj zdIyoGlD?NGldIX`T!)*`i=lAbX#-|Xs6a=No5*w;t&AI4B}zgt$E0ArA0#j;-#%osmblSO4lS=cl)l518bWf3|x~B*?|_d=45g^ z)Pq8bJI3{G>pWIwyjF(=S}9A~!H>e@c-1dF27aCnWvkep?Jr6=Pds-O(Vu;}@}5P! zg|$l~MauDml1 zL6b>8A<N>jX_D<=WgK1#`ovux07bjc%4Hw4)EP(ad*sgjs z$3X>rkzi*O>^f6Bm8Mi7d4+mmKU?L8ORrr~vZPt9N4;95@Saee;R*b$uqL+aSbXP` z%1p7%Qr^oSHk;R&J4zF#N-Fu}5D^iwF2Gm^3+aw~D)2l$Y~yx}5B+7%{kJw@RC}G# zoIIQ}X2Q;Em;{=)e(3f;zN-??e4HIeKc_ffr#_(Xw()M{Q3*SP0AL!9jTypZogLzW z)|Tb{YZ*Z9q;LoADJ|Vn5FfptDaCgfa50KL?SCU0ut)_<;Fo*SWET~%ocnh08h)^` zRw=XIIp?{l2_J)6Rl@r%p#b#HBK?AuNdCCi)gF_Phd1B_nPugbC5(_MkLb{_JYXIsptAG&#G9+vLP_zcsq z4Yf{=X=WsgvtB?PO7+upQ>DavfsL`;O3aO~(x4Xqk&bt)%W0tJ?swMP7$4SEeUy!t zL*K&LmTB7dEf|jE9(j%&P6*|xJNnOCAoNl0kG77Ek}%u18qB0TG8meOU|66YG{hdG z0S!EUG@oBksgCow;6ch^BCbY2p6t!lm`3lgrryE@1^C7X9QSz`mu02(r4Mzy4cc0} z@@lU;{?*=Z{?%xCoi3s~;7z;h8e5T8)pa5K)OPsIm60;ddm4J zwSL9cNS1?vbZPyLX!bN)fJkTm*Yaxmc=f2!bU?U}pIL3k^d~${G?QGK zFV9xi$*k|4#2t$o7(qW=Vlh1*zoyyr=lB2cC%~qvp9LR#R6xO~v)9p0o?8>$b7pmU z`L)wjfd$1ow44e8>Skq@lhK?o%4B)}RFCID6|}^p^=Z;cqVcl)L*pd5gBXsv$;r9o zsEMJs4Or)4?Za(|BT-Z}~tm}j;n6c|yuWT9`o zn;Y|j^G};@KisCv(&A{e2{Bp_<9v~jh>6`*>VBNlRJ}{x^O?%~mDMLs{5Z1`Lwk*{>MmqikANJjvyy2Fd?jzVnS9XO(sLO}!G%;H z1b<9%yftbpSm4$D`ErVXWp85|yORNW$0?~{_|`yo-(GNj+^gH7qDNaVbj})P_p*s$yOH8A%@(Cah7i_1)0IT=p(ZX^T9;$syJ=+M z#WI@X6R(Yz!i~(I+`t&ce9-Ro?-}tmvmH(sk$9;kWkBM~{MV7(-jk83`=AWdypf*!AY!CApht*KPKdfc zgM){ff`T@8sk5G9b{lDd10t~+dV>KpM2;Zm?g!S$#D1<9!0|-^OAP3JchXGc#qAW? znhe~ij7%@#;wP8yj^-8-I>d{XBZ6@s-?jZt_m*20+W-_7<})dIfUxdaP<4KX3`i`Fro{1Ez|?=6 zzjg(uHl{D+Gd3m%_EN-A(nr0vyLmeQ$$l!+;vCoMsWlhPRXaYCR&2>s@cpnyj%ZVb zKG%OcI;W0fL8}3I^q?W?tO*Q5z;)4+d{o>!b{WIz+M%HKS&6A{->PJw(x_XKb-m@{ zJAoE$)!AP^J?(V<5Bqro5Z!CcY*VGNfdZg6hYg+HP9M8<^7k}>)nXf}xO zz+$u&J5NB)pYm_p_pf9!TLjFpH-8TO^uzB_(e~7kF8*?6rU8Uoa4%l{Rq|89*@`_y zqB8N0h1?^<5|ah_i)6mqg-OeRQPsV*W}=t=(ioQ@YRmC@38SOArBuME*2`CtRniId zmhFQVyh4UYL76YWV(|t^Us!6ua89T>k!RC;sy|9fPvR03ZLQ4!Nd5#OBv6IHm2mJk zH$NHHjor6=h^^~J8c73R^PH=q8*^h~n~X|VhUZ_Cn%$Iih^2OW1ULq!i%Yp8bBRGh zOakn-*2l_>=hqLQn2F((=hIa@NpJ-R9E!p>d4tz81J!mL){|-Xnl6)iCFz^Pb#;## z2u!1LU2l5m2Y~!qFPz-eH_tTMbJkwC$3`r))t+U)`Ss-wR|3*ljo+jPNbathOzb49 ztg$0)AQT&w9QTJ_(Wx&>x3nKf7C92MJKsl6rH^Qli3L9QpU2Kmh0X?p6MDX72j=~- zDuEszEuZW@QSJN2<#KUbpU>ag@(#=ec-I@lm7#TT>$&At>A=dR+bzVQpK;ZLM{W0#oj5;OVLQ|qd3mnzOUZIQsUeI@g=Y36S| zkr_ilt5Hlal4i(hU49#E^4*i~0V%YISTfYGR^cjq5E?op3Ou-LVxOxe~nZf-Zk_E;Y&_!z?{X4mHc-&SWp9bn^l)h-6= zMKYesEpNus!~5K@!Pwb5m%VA&ian~0F%!SjKRfU9`a5Qu3?&li3g4 zj{5soKR!*ZYtqKi+OaUlzXR#DGF;jI-7up&9@r!q!VEiogRVas!p`xJk4yisTh;R2 z9*8tvA|$!GBx2C%H`UY6Vzyasmhn|2h9)lCbPl*Qer@WYIBknuE}?L1mIg(ivm(dG z$uFfhQ0x-VQN=D>)Rz5!#*uGmmn^EhzQ(X^kf|n&&E;uxz_s|IpQqiz_Y)yw!Xp>k zLI$|lHL)yhUHK;esu!?rdsRS^`vy1365H=O@1(RB zjl;yS$&%tqI)c?@Y_`c*7Qqq5_~Ex=IzJ>V(PHgHzl@e^ zcAmlw#SAZPUwRQ%Fkk+%fqC~s`&(Q!wo6GkP#ErOAnyuFaXJD4&P*LkwonOB{n9Qf3XfHWcY12vL4|qX3 zxIoiU6bzM?LGgcS#T@GnG8vhJX(g>6>4jzU;2Ui2-W_cZHbA?T)?`s2t(!oaJ=ucU{4}8tz!u?YR}%rQ$J_C8f-)Tku0m(Z3f*^AxF;(t`e{*-6hspY_d~+t*PO|Qd?it{mNzb0$(#o2Sq4W@O zm$vvyR9!e&>o1QoHxnzAvSpXYrY)Xi+98N}kS=g_)B7zmywxQF%}-FH-rEa5by(N^ z%K2m2m*fU{2f@=0s!f{8txBSLoefk7qWge(wd0XF!M@lQwa;I7#DgU3gYg77VoqUW z>Np1V@&oYL(nPOW;rtv`I^+$ShGApx6f4J&<;vqoLcRa!=eK7n4QI0R?M|Kmk=b0U*1lI#r+ zoC~}2E4zX@D2D6Pf9CRyF$+Z}=d9vP12NrV{3z+k*Tp5ZYN^t7J^zoqihl)iS#+>T zWl6RW48>)knVSoNKvJP3?T^e{DYxeFZ4xO``H6SZ;S-_Qv{fDc-MWm|V`J5H^Pw2* z=}w~jo&pbM*1t+qegnP5e_SBij3KYyX&n$t7MX1fwBLL(Jx&!2v0OXuhT$w0Lb{(L z+TQL{Y!+QQf{*uR9@}YeY@o|?zbd}+ff_fwO4-x5?BH>y5YUB^bn1=j_wu&}NnYOM z@;eqM3xlL=1fTheJ)}XU_^|-eu$%$~&fp02BaqW+iJ1u&7SVIt?87Ot^Lk0XX#7u| zSxCA`#(t(Op}Q5HcXHAilxKY{#SUeGNfaurHz}!|n1k3bh7p02`(Q?6$7#h8XXk1# z^deT_pe_FJSaPr{HwJb?dc4lIx5xajtklI#I>_0$(k5qnuI_1c?KgbaBCpO0d4N3H z4V{D>az&IamDKGXuP?I_6zee6CWPd-;9UdT;i~Kr8K;W$M8Sgx$A8w?>8VKXdgq5?Bw_<;%>w+t%#jk;_*Ct=cP`Dx)@S)Z`E2}?uF_FvsHiSk+ksH;We$RVJdr!?92hrCx?MyoW4 zBR%*O4n~~OGP&Dh+0v4b5@wTCQw6#hu%zdon-*J#$$JUi4}=GLReVaDLH2@M6JJm4 zzE4M@&#A{Q-jNI)#Wb@t*(=j>zCLC+<7t|ndhJMxC?A`Ee5A{aMGtWvc!_T977#{8 z=bM5gYRG$>R7(DO)Sn%*(kH^HT3RNnyR(U4YC$J zy4=hg^@8;S7i7_MhRf{(_}$+#pK8~#g33f&qn!Y@D?=(x9tT#?0a3Fbzuuy+Dy9OO zNy46QGX8|ZTOxhi_MgGfr!YIE_qsO`k|@VkErA-7uxL@^6-)-Apv(c*6X zvy(%=6la@ z=3I*Oi93gtJuxeIwYffxH>D~QC)PS1bO0<@vifzP%@bc|Y<6lr8&6A2zjuW0Xf4RD zI|7Q%7{EZnyF2XIjogL=m?DD`W27wuF3?xo8LtK?bN8V4&ZAb~1|{-LYIM=!-rLBajn z@_ejIbKa>gYyhOyYy10)v81Su+-6DR1zSz_`TJLzy-&^XUq?Pa)~q?1c=~(rx6X8h zv#88`K(YLqS`Ge!J-|4cN@+naX+le6ebiD3`H!Gf3Z4fO$(66zf*0%e``tL5N2bdi zg@j!j+e>H4J(W)#yTxDrc?TSCDb}K|2MHWssKz8SX}?W;AE~G&fG?xrUhEMn{lfG) zO8!C9lHy*`?-I>k?F@Q^70@q%{h#PBW%7-Ts)-&QrLb^ItX}hC<(so{h}e}rB}{zz zO{Xqxmd9hC#=W0Acu``04q3t+^m#(oB3=xpD0VWe2_=mFSgdT}2>D;lGaZadZgpYu z_M>rB3g4_bWPFeK)8_YV9!wq6A85MkO4`wOH9~gQ@MXbd>~)XiOd(w*+@zUz26m>6 zU>WvOoLJS|!__g)gY%X}83l96->JGG=hV9tNHT>jy>689<>r2%CtqXP{{nD^JU^l) z!FUn^F<4)6XTz@trJVBrx&K;so%&%s;WE1-FR~di+bHb&U!0C6j59wYTkw?}l`kGe zPoj1;`HpHh5AW5!TUnAZ7%H*yWUXD+?Wz=qHacFb{M?rdD4V{ZrL&bIOD!QTDVsv{ zqpoUreCQL&nb_#g;*ti#R5KU-*YE#=KKJvx+=TLzpAmo}u8+_}!0Vq7^$*TL(tsVc zgbB()oHSF{vYL*;XQNNWd{*mb4zD{Nj(#U^e1EC zWj|4~6DJOY?H^teH3>n>?_~x^e#T+;TMJfF3b>LA;QJ8@Co7wNO*DlJs4>9jFa`pM z0Zxt+eZoV}9#-zj`o=KJ#@%OAeK2=%Qf!0$sQtr5sEll~ONW_W%#2mVxHf@2`1%=h zqKJ9@#vM}2`po~0C)Oc&tt!v&u-sTr36(Od^E&YjCZ~;EELnrX0=`kR%jv1rMsWMy znqqWCDbTgKlTcr|2KpcGuG9extj?flSc#f|D%bg4G&YDROJ5mQ*ICEi&8qxK6au|3 zT1-(vuqt~67H}`A*Ql&G< zsnZrv66NCv=)o(_Oi_m}AepJ_Qj96t!Ln=NH6GI@8%Y@f;NG>)H3X7b1_El?`(Q*k zS4ChW@tk!5kSgEW*i-CiN&nzXSfQ`=JXnhzs8DqA4jEjzNv6xTKEWEsLX{n$LgY)? zvL%jO)0~e+C)VfgF<0QJ`R9sC!0Rs;hJcNs+{%KTXbo}DfC?K)K5O&cIKY>N6+tXi zT;5fAheLXNpkL3Ku>b5B>MYG95j--Prc3tntxDNbItmR%if$~qj1olvCEPP*qz6Zv6rJ^ zEGQ(q*maO4S2?C=m0s}@NNy&jRakhpauu!fckmNwesQ4f!P$U3kj$pF0}n!eGBD_i zD;mxBAx)OGuhe>_mQ5terAZd-A2IwifDkUzLhWn1ets>w+-&Q$1xS0Yk#39?#Y5+o zukhf$jN$8PlKE-sJh%SPWR-sjm!W+7SG9I7f>4998o;v^wo6Ot0uX;5@%5GHW0NMP$@na9l zk;Tqd1n!PmI*9Jp6DaDD15pDO2t@ErR)OFbaW{_(>=pU^ZZX0MxMIVv0rAsmx^JEV z0gNGc0}cb5T~Z(j`_xORYpQUbsG=s~-+O8QUmdZFMER;U^6| zsc@<(-F&ScaC^{!WGgk5ZShtvgz6c?2br75u&FR=u9Yjj7@U}x77BvGTpdW4{XM=b z*>DyaFb06BHRd*`6!JB9bm4$=Do}3}D*$???@yE@XP-T-b;#CEn;0OQuEYLG6$c@` zV2mav)4wtFPl#OcHNrDG>a1*6QY%W@Og;|y;uW2z@T9YfvcB zxDV}uxKY|%wklKB+YSiWVDXDinV?LgV zB4jDZ`^dY?|Ak+;DRN7GwWo3~X9wT;^{EWj$Rnd3E5h7iAH*)^0z_m~o!@yPHZMaS z!R7IaF2g^)%s8!gCCV_V+y8~Hz2Qx|C<3Pup{D*Q6`s^vf_3-Byx%M2>`2?jg3j8` z-m#7bN?IUe*lga&U;mGz;iNdH0SwM5JBuB4y$(Y|Yr^UPV;chp0C1!ggNsBh>= zTX|4Jqy{~Fp4^fV5%ZR49y5e5n{;^?BL9_|F!}m1=a(Kx5cbpsUt2ra1-ST5pFp4x ztfS^=WB!^tuFQV$Fcl#dc^sgF4`E|A9AQJ&@E6mzL5Rb0)Qj}H-?Kqe}f+1Grt|y?KYT^BD4@)aQU|hDe4_4j|dcU#$8GOz^o6x zw5|a;wK<=tdO6LLohNaRobj#U&MPAPCW__-hkvR-tQVuxP#+$F43EBHa;BXqrrtm_ zYWFBvWb2zOYC*IPFS=rO6?!VKKavXlZhhTP0jmm9WlKyvlGu~cBVAxHPlhaknS}TD z3Um<|deMKQD9*Q9@H!9r_j(+fRDBd40de3N1quhE^e?-M1(4ipA+Dxn3N&kmx_h&d zc9r&Vx6<@l+FkM4&fa_T_4#+VX`PX<>p3%<#AhJmR#hTvK01{w&_1$S-DwnjvPQmf zclh-StX`&3z+eh*yxCLaUj>cRibhTS-=X*`M?#V_)R$jPDq1+v0dMYbg1CGBV}9gj z;c;4I840nPfhCBp_cz;)j909(?ppua<20)IHcx>*uKf||2&e?r-%6HBB}=lH>-)c6 zjT6I#eWKYtNxf2QrXMI!7P!4JEOV7pVZYAk@HX`ire9(Bp5kipN>#_XXI;kICnUcBmEO`9R%QP5;c0ubPRKITUZg!Az4Y2^F zCjq8IvhTM=&a5t~L;E8>4iR?i{!Aad>xRmE&7?hk{MeO4*7V5k@Duva$_$B8wQkuP z;;tjNXHc6E%l4=h>&&qMg&%du<&Jj_6qmm1O}j@dv9 zgiRMfD4$FBO*CH^8xb@|oIw<|-ijk}WGM=cuMF9S+ey3!d`nn=s&W%k9XzOw*fG%R z?=oF}_)GzMiAawyX{VZXH8df%(d?gOm6+AqeWHJ`FRT=zO8`dS`w~#ZWz!&%F=E7H zlBv*L&``X(@S2q1e&J!pfOz%-CVAvAU-p%VY?I_CT}dU<<4n)$P5r zGt?_v!F|trclI3qI6S6$Cr~60zCDfcY{1qGdEw6k*kg-oA*@Q0N(CdKhY@2*7@ zXEJw`{Th!fChO2tF6)v3PrA2TLL+}op=I4u`-;=IEH*=@@@TkO%S4YbA*{z9*$O$U z*%^nKA!mK7y7>qB_cPUI&Z(iNd67f%^zztGpZd%e%s|~`p#M=i2x5dFa!B6N0f~3a z%YF{d$_HK`2`&h(i6YbT>H{Jo#{RCDqPR?X-pV*v<1S>=Rvn34n@g20CQ=yP5?y4RkeQUeH0IxFX6AsiL@xvwiCe6HOOzDF`&)B`7J4U+aOn}L z03-g0o1^!{ny^Rye#Q4&hf|5SBzANMVRy9y!TYacki)-?e&9+8ctXRkaIN{xBjkZD z!6YsIj-r}tY>}qZN~mtrohCvndqvTWn4pbMWdl@pKvXH=Utd!gJyyL~;#&;0<{=hwi*fRL_LL@H8NAc;#ouH%OrqbUJKUxq@n^sPO z@R;d_+EshPzL4XT{e$D#b!R{ess(aY{ucsri?vHBpzx;3B>)7;|l;5i&hEN|sMGzWhhI|xPUY!i$k6@usd zDVj;6KYQIe%m_X>5+G*tLld23=H~-3zXPM{FB&FSCd}VTo<9%5VoT2zgx%M=b?q{E z`_I(?NBmZk>G9%?H&4u|iPG?*4@n>`uh~_->?SwQNL*(_N&j9O7aO9&dd~mhN)Vg@ z9`hjv#O)?`jKo5l;-UBz=xjq&z?x=hkAIz!-!HrK8R(@ce#@J%BY)L(w?@oQWL234 z6{!*+6&h;KZe?plY(3IWtd|Gb%W-)Y{(>LOT{|DdK3vfk{&4Bf!E%L{EXYR$dG!{Q z6m@V!d%*`R@wM6euA~h1kXxKZ%_A?3noju+!e!=ShncXs>yR2cq6%y5VvHzdYU^2P zp>B5gJmw5YayWC0ZDYoBzyP}bRwNnzhwn9>Au^w5K9RVi%Ucq^T{;IS&e?!j%tj}1 zg#wmKgBC*Zx=lEl!Mz{?`FTeba^q;%Z~uJbyQ4@Oki69QN<_NJ3T!F$_y;xW0KXa? zc(vnre$TSdmAK%SoIxL4fc=z-NQ&p~(gf-xLN9T#5__(lqk4G-e=S>vpf(l)s2B1N zLl1K&@jul`EN~qd32^h>Kr$&%YLajSSK68~^@8$03z`GGWH-9i_aiRKt?R5ms@$*3 z4UEKLQ?B_=MB*H)2pYoAo5r$L@dq}M0Wb9|0rR)w0e{oE`4 zEvUI`%K!2np$U%->f$%|yKj!$w&-?6V&$P%HaK1fe1kNL{Wt)l5Kwmm+3WWVj(Zl( zZygHpz$`DX|?cBUVet_cg z{rbZdg8z*a?&FSd&6VD#|6e=T{+Cp?#SdVlsVU$HzEK9W6v)Ifok>e83p6wHQ6!1i z2RdqM-oo)giVsB0ng-1%%F61FH?txYH7M~>nw3%ZFf_%=Y%-jj52nZ*z4voJ_aC^w z-5<}|`>f|)Ywx|z=X-Xjl~<6n8V&MPX4E{L0t@%*?*>xc&X9+7t>X9^@GJOQYjfAr zd}DWxF<4u{Aip*;Bu}kAKGPI`nb`8m6P;bvQ&LhDDB;83wYQR{6ddI2*N>m3Sst7Wgaw3~I4lm059cH`V5#I&X-x z_LrCJsa?nE8{lxF*3PE##^>XitrIOe=;p=#YecnV&hosb;W?730tKE)RUj>SCmGtCuk|NB=@_QHNMGTsE<%W`osi2JotVB&kl{F zGiST@nWO=}S+#E8uU1qC+MwD~XS1PuTxPjC;(o!MhG^y$V;@T{2q2AscSewV)fDkH~U*`#>z-k9q4V^<6Kl7J8l zDk#f#XF-3^t8B_PKtq_+dQprBtpe0OsjZwV=CMvGw69XoEB6ocj5Z4NQM+Z@Of2Y* z;&c_bI!Xo4))W3)O2y(h7cWf3pt)9lEC21E?yHQp7|OE$gh=lbtQ$4Guxi9qo|tow zA&sGYM|wF2Fr8Kz;HwgOx@nu^!iosnGX=NkA;mXrQN8O`T}NQr?%r!;mn2{+O5126 z<+9MHn;IeIX15X3WLq~`hB5)F-c?)_+hn9Df=TY8YW#A z&r#>SvUr#F*N+q90Thn)r4rYEv9m!z!_sNZeQNc9L-7lRC?`j0O60C3JhQnL{zISm18 zeuyCHC$xb#PD#|RdC5@BhWjj_GMX9JUlM5$VyJS01KoBr#P_awNxDOn1B4I-xQhyk zto)*fCQ28{-(}~r8#AraVo6sa7TIjR6(Bmq?JX+P(;r~AaJB%;_A+JjKeRl$d*Yb( zZXMKyJ!U!*%E6GANwVFv$hmPbEEdOVxn6R#yp2b&P9v_g^FH}fCCm3s=F(DBtNN(B zPnQ^l+>ZObaVr85L{WK%?b*Y2yczF+@YyT96=ACal8Vk2)eQ>SVEBNtV~Mqz=Ky5T zT7Kkti0cBw>!MWpEh05nX!KztTN0X&s# zIU)09Sx`%>Cjl2&W88nh4|2Kv1&dj^Nl{5$4C>>V!+63WXKroK2k$Cj~`XeK?iyP{9}qKnbWNs0(Wm zun?4C(n86Qx5Z4EEw1NL^HXt^|Tn|k>binu{DVlJCVzj|GC*x2l~qoVIzSpkti_6 z=q3N9gV>(7;pOH(V_d>l_88OT_VCr4Yk6J!PVYs1IR@*V_IL4*LglA}%uOzMl@hFr z7tJ#5a9LT)D~_>P{v@DdO<7@LZ49P!6XnU8C3%>w>E{2R{y*{z{GwV9yhKQRGp}D? S4gR_d*uEt=;M(Q`1%CnIwWrts literal 22113 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 Date: Sun, 23 Nov 2014 19:28:54 +1300 Subject: [PATCH 15/22] Fix a bogus label name in ra --- mods/ra/chrome/lobby.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mods/ra/chrome/lobby.yaml b/mods/ra/chrome/lobby.yaml index 52d7c90458..9320dfdda0 100644 --- a/mods/ra/chrome/lobby.yaml +++ b/mods/ra/chrome/lobby.yaml @@ -48,7 +48,7 @@ Background@SERVER_LOBBY: Text: Team Align: Center Font: Bold - Label@LABEL_LOBBY_TEAM: + Label@LABEL_LOBBY_SPAWN: X: 478 Width: 48 Height: 25 From 4f4c67735d45bf20f62b9b334e19a6294a9e4b7b Mon Sep 17 00:00:00 2001 From: ScottNZ Date: Sun, 23 Nov 2014 19:58:57 +1300 Subject: [PATCH 16/22] Overhaul the lobby faction dropdown for ra --- OpenRA.Game/Traits/World/Country.cs | 6 +++ OpenRA.Game/Widgets/ButtonWidget.cs | 19 ++++--- OpenRA.Game/Widgets/DropDownButtonWidget.cs | 33 ++++++++---- OpenRA.Mods.Common/OpenRA.Mods.Common.csproj | 1 + .../Widgets/Logic/ButtonTooltipLogic.cs | 5 +- .../Widgets/Logic/CountryTooltipLogic.cs | 52 +++++++++++++++++++ OpenRA.Mods.RA/Widgets/Logic/LobbyLogic.cs | 21 +++++--- OpenRA.Mods.RA/Widgets/Logic/LobbyUtils.cs | 32 +++++++----- mods/ra/chrome/lobby-playerbin.yaml | 21 +++++++- mods/ra/chrome/lobby.yaml | 2 +- mods/ra/chrome/tooltips.yaml | 19 +++++++ mods/ra/rules/world.yaml | 14 +++++ 12 files changed, 185 insertions(+), 40 deletions(-) create mode 100644 OpenRA.Mods.Common/Widgets/Logic/CountryTooltipLogic.cs diff --git a/OpenRA.Game/Traits/World/Country.cs b/OpenRA.Game/Traits/World/Country.cs index 2921e04fc1..9d3ba3c395 100644 --- a/OpenRA.Game/Traits/World/Country.cs +++ b/OpenRA.Game/Traits/World/Country.cs @@ -18,6 +18,12 @@ namespace OpenRA.Traits [Desc("This is the internal name for owner checks.")] public readonly string Race = null; + [Desc("The side that the country belongs to. For example, England belongs to the 'Allies' side.")] + public readonly string Side = null; + + [Translate] + public readonly string Description = null; + public readonly bool Selectable = true; } diff --git a/OpenRA.Game/Widgets/ButtonWidget.cs b/OpenRA.Game/Widgets/ButtonWidget.cs index c041f790fa..b6e564ed58 100644 --- a/OpenRA.Game/Widgets/ButtonWidget.cs +++ b/OpenRA.Game/Widgets/ButtonWidget.cs @@ -47,6 +47,7 @@ namespace OpenRA.Widgets public readonly string TooltipContainer; public readonly string TooltipTemplate = "BUTTON_TOOLTIP"; [Translate] public string TooltipText; + public Func GetTooltipText; // Equivalent to OnMouseUp, but without an input arg public Action OnClick = () => {}; @@ -68,6 +69,7 @@ namespace OpenRA.Widgets OnKeyPress = _ => OnClick(); IsDisabled = () => Disabled; IsHighlighted = () => Highlighted; + GetTooltipText = () => TooltipText; tooltipContainer = Exts.Lazy(() => Ui.Root.Get(TooltipContainer)); } @@ -102,6 +104,7 @@ namespace OpenRA.Widgets TooltipTemplate = other.TooltipTemplate; TooltipText = other.TooltipText; + GetTooltipText = other.GetTooltipText; TooltipContainer = other.TooltipContainer; tooltipContainer = Exts.Lazy(() => Ui.Root.Get(TooltipContainer)); @@ -177,19 +180,23 @@ namespace OpenRA.Widgets public override void MouseEntered() { - if (TooltipContainer == null) return; + if (TooltipContainer == null || GetTooltipText() == null) + return; + tooltipContainer.Value.SetTooltip(TooltipTemplate, - new WidgetArgs() {{ "button", this }}); + new WidgetArgs { { "button", this } }); } public override void MouseExited() { - if (TooltipContainer == null) return; + if (TooltipContainer == null || !tooltipContainer.IsValueCreated) + return; + tooltipContainer.Value.RemoveTooltip(); } public override int2 ChildOrigin { get { return RenderOrigin + - ((Depressed) ? new int2(VisualHeight, VisualHeight) : new int2(0, 0)); } } + (Depressed ? new int2(VisualHeight, VisualHeight) : new int2(0, 0)); } } public override void Draw() { @@ -209,10 +216,10 @@ namespace OpenRA.Widgets DrawBackground(rb, disabled, Depressed, Ui.MouseOverWidget == this, highlighted); if (Contrast) font.DrawTextWithContrast(text, position + stateOffset, - disabled ? colordisabled : color, contrast, 2); + disabled ? colordisabled : color, contrast, 2); else font.DrawText(text, position + stateOffset, - disabled ? colordisabled : color); + disabled ? colordisabled : color); } public override Widget Clone() { return new ButtonWidget(this); } diff --git a/OpenRA.Game/Widgets/DropDownButtonWidget.cs b/OpenRA.Game/Widgets/DropDownButtonWidget.cs index 06c11d07d5..103ad10d8a 100644 --- a/OpenRA.Game/Widgets/DropDownButtonWidget.cs +++ b/OpenRA.Game/Widgets/DropDownButtonWidget.cs @@ -19,12 +19,19 @@ namespace OpenRA.Widgets { Widget panel; MaskWidget fullscreenMask; + Widget panelRoot; + + public string PanelRoot; [ObjectCreator.UseCtor] public DropDownButtonWidget(Ruleset modRules) : base(modRules) { } - protected DropDownButtonWidget(DropDownButtonWidget widget) : base(widget) { } + protected DropDownButtonWidget(DropDownButtonWidget widget) + : base(widget) + { + PanelRoot = widget.PanelRoot; + } public override void Draw() { @@ -34,7 +41,7 @@ namespace OpenRA.Widgets var image = ChromeProvider.GetImage("scrollbar", IsDisabled() ? "down_pressed" : "down_arrow"); var rb = RenderBounds; var color = GetColor(); - var colordisabled = GetColorDisabled(); + var colorDisabled = GetColorDisabled(); WidgetUtils.DrawRGBA( image, stateOffset + new float2( rb.Right - rb.Height + 4, @@ -42,7 +49,7 @@ namespace OpenRA.Widgets WidgetUtils.FillRectWithColor(new Rectangle(stateOffset.X + rb.Right - rb.Height, stateOffset.Y + rb.Top + 3, 1, rb.Height - 6), - IsDisabled() ? colordisabled : color); + IsDisabled() ? colorDisabled : color); } public override Widget Clone() { return new DropDownButtonWidget(this); } @@ -61,8 +68,8 @@ namespace OpenRA.Widgets if (panel == null) return; - Ui.Root.RemoveChild(fullscreenMask); - Ui.Root.RemoveChild(panel); + panelRoot.RemoveChild(fullscreenMask); + panelRoot.RemoveChild(panel); panel = fullscreenMask = null; } @@ -80,11 +87,17 @@ namespace OpenRA.Widgets if (onCancel != null) fullscreenMask.OnMouseDown += _ => onCancel(); - Ui.Root.AddChild(fullscreenMask); + panelRoot = PanelRoot == null ? Ui.Root : Ui.Root.Get(PanelRoot); + + panelRoot.AddChild(fullscreenMask); var oldBounds = panel.Bounds; - panel.Bounds = new Rectangle(RenderOrigin.X, RenderOrigin.Y + Bounds.Height, oldBounds.Width, oldBounds.Height); - Ui.Root.AddChild(panel); + panel.Bounds = new Rectangle( + RenderOrigin.X - panelRoot.RenderOrigin.X, + RenderOrigin.Y + Bounds.Height - panelRoot.RenderOrigin.Y, + oldBounds.Width, + oldBounds.Height); + panelRoot.AddChild(panel); } public void ShowDropDown(string panelTemplate, int maxHeight, IEnumerable options, Func setupItem) @@ -116,14 +129,14 @@ namespace OpenRA.Widgets var panel = (ScrollPanelWidget)Ui.LoadWidget(panelTemplate, null, new WidgetArgs() {{ "substitutions", substitutions }}); - var headerTemplate = panel.Get("HEADER"); + var headerTemplate = panel.GetOrNull("HEADER"); var itemTemplate = panel.Get("TEMPLATE"); panel.RemoveChildren(); foreach (var kv in groups) { var group = kv.Key; - if (group.Length > 0) + if (group.Length > 0 && headerTemplate != null) { var header = ScrollItemWidget.Setup(headerTemplate, () => true, () => {}); header.Get("LABEL").GetText = () => group; diff --git a/OpenRA.Mods.Common/OpenRA.Mods.Common.csproj b/OpenRA.Mods.Common/OpenRA.Mods.Common.csproj index 1d84308a23..8422180fe9 100644 --- a/OpenRA.Mods.Common/OpenRA.Mods.Common.csproj +++ b/OpenRA.Mods.Common/OpenRA.Mods.Common.csproj @@ -221,6 +221,7 @@ + diff --git a/OpenRA.Mods.Common/Widgets/Logic/ButtonTooltipLogic.cs b/OpenRA.Mods.Common/Widgets/Logic/ButtonTooltipLogic.cs index df1be7331c..3c94c6065b 100644 --- a/OpenRA.Mods.Common/Widgets/Logic/ButtonTooltipLogic.cs +++ b/OpenRA.Mods.Common/Widgets/Logic/ButtonTooltipLogic.cs @@ -19,9 +19,10 @@ namespace OpenRA.Mods.Common.Widgets.Logic { var label = widget.Get("LABEL"); var font = Game.Renderer.Fonts[label.Font]; - var labelWidth = font.Measure(button.TooltipText).X; + var text = button.GetTooltipText(); + var labelWidth = font.Measure(text).X; - label.GetText = () => button.TooltipText; + label.GetText = () => text; label.Bounds.Width = labelWidth; widget.Bounds.Width = 2 * label.Bounds.X + labelWidth; diff --git a/OpenRA.Mods.Common/Widgets/Logic/CountryTooltipLogic.cs b/OpenRA.Mods.Common/Widgets/Logic/CountryTooltipLogic.cs new file mode 100644 index 0000000000..d5f51e46e5 --- /dev/null +++ b/OpenRA.Mods.Common/Widgets/Logic/CountryTooltipLogic.cs @@ -0,0 +1,52 @@ +#region Copyright & License Information +/* + * Copyright 2007-2014 The OpenRA Developers (see AUTHORS) + * This file is part of OpenRA, which is free software. It is made + * available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation. For more information, + * see COPYING. + */ +#endregion + +using System; +using System.Linq; +using OpenRA.Widgets; + +namespace OpenRA.Mods.Common.Widgets.Logic +{ + public class CountryTooltipLogic + { + [ObjectCreator.UseCtor] + public CountryTooltipLogic(Widget widget, ButtonWidget button) + { + var lines = button.GetTooltipText().Replace("\\n", "\n").Split('\n'); + + var header = widget.Get("HEADER"); + var headerLine = lines[0]; + var headerFont = Game.Renderer.Fonts[header.Font]; + var headerSize = headerFont.Measure(headerLine); + header.Bounds.Width += headerSize.X; + header.Bounds.Height += headerSize.Y; + header.GetText = () => headerLine; + + if (lines.Length > 1) + { + var description = widget.Get("DESCRIPTION"); + var descriptionLines = lines.Skip(1).ToArray(); + var descriptionFont = Game.Renderer.Fonts[description.Font]; + description.Bounds.Y += header.Bounds.Y + header.Bounds.Height; + description.Bounds.Width += descriptionLines.Select(l => descriptionFont.Measure(l).X).Max(); + description.Bounds.Height += descriptionFont.Measure(descriptionLines.First()).Y * descriptionLines.Length; + description.GetText = () => string.Join("\n", descriptionLines); + + widget.Bounds.Width = Math.Max(header.Bounds.X + header.Bounds.Width, description.Bounds.X + description.Bounds.Width); + widget.Bounds.Height = description.Bounds.Y + description.Bounds.Height; + } + else + { + widget.Bounds.Width = header.Bounds.X + header.Bounds.Width; + widget.Bounds.Height = header.Bounds.Y + header.Bounds.Height; + } + } + } +} \ No newline at end of file diff --git a/OpenRA.Mods.RA/Widgets/Logic/LobbyLogic.cs b/OpenRA.Mods.RA/Widgets/Logic/LobbyLogic.cs index ffc9332412..2802bd7f23 100644 --- a/OpenRA.Mods.RA/Widgets/Logic/LobbyLogic.cs +++ b/OpenRA.Mods.RA/Widgets/Logic/LobbyLogic.cs @@ -49,7 +49,8 @@ namespace OpenRA.Mods.RA.Widgets.Logic readonly Widget chatTemplate; readonly ScrollPanelWidget players; - readonly Dictionary countryNames; + + readonly Dictionary countries = new Dictionary(); readonly ColorPreviewManagerWidget colorPreview; @@ -142,10 +143,9 @@ namespace OpenRA.Mods.RA.Widgets.Logic colorPreview = lobby.Get("COLOR_MANAGER"); colorPreview.Color = Game.Settings.Player.Color; - countryNames = modRules.Actors["world"].Traits.WithInterface() - .Where(c => c.Selectable) - .ToDictionary(a => a.Race, a => a.Name); - countryNames.Add("random", "Any"); + countries.Add("random", new LobbyCountry { Name = "Any" }); + foreach (var c in modRules.Actors["world"].Traits.WithInterface().Where(c => c.Selectable)) + countries.Add(c.Race, new LobbyCountry { Name = c.Name, Side = c.Side, Description = c.Description }); var gameStarting = false; Func configurationDisabled = () => !Game.IsHost || gameStarting || @@ -691,7 +691,7 @@ namespace OpenRA.Mods.RA.Widgets.Logic LobbyUtils.SetupEditableNameWidget(template, slot, client, orderManager); LobbyUtils.SetupEditableColorWidget(template, slot, client, orderManager, colorPreview); - LobbyUtils.SetupEditableFactionWidget(template, slot, client, orderManager, countryNames); + LobbyUtils.SetupEditableFactionWidget(template, slot, client, orderManager, countries); LobbyUtils.SetupEditableTeamWidget(template, slot, client, orderManager, Map); LobbyUtils.SetupEditableSpawnWidget(template, slot, client, orderManager, Map); LobbyUtils.SetupEditableReadyWidget(template, slot, client, orderManager, Map); @@ -707,7 +707,7 @@ namespace OpenRA.Mods.RA.Widgets.Logic LobbyUtils.SetupKickWidget(template, slot, client, orderManager, lobby, () => panel = PanelType.Kick, () => panel = PanelType.Players); LobbyUtils.SetupColorWidget(template, slot, client); - LobbyUtils.SetupFactionWidget(template, slot, client, countryNames); + LobbyUtils.SetupFactionWidget(template, slot, client, countries); LobbyUtils.SetupTeamWidget(template, slot, client); LobbyUtils.SetupSpawnWidget(template, slot, client); LobbyUtils.SetupReadyWidget(template, slot, client); @@ -810,4 +810,11 @@ namespace OpenRA.Mods.RA.Widgets.Logic public Action OnClick; } } + + public class LobbyCountry + { + public string Name; + public string Description; + public string Side; + } } diff --git a/OpenRA.Mods.RA/Widgets/Logic/LobbyUtils.cs b/OpenRA.Mods.RA/Widgets/Logic/LobbyUtils.cs index c022822c1b..b7216a5200 100644 --- a/OpenRA.Mods.RA/Widgets/Logic/LobbyUtils.cs +++ b/OpenRA.Mods.RA/Widgets/Logic/LobbyUtils.cs @@ -105,21 +105,25 @@ namespace OpenRA.Mods.RA.Widgets.Logic } public static void ShowRaceDropDown(DropDownButtonWidget dropdown, Session.Client client, - OrderManager orderManager, Dictionary countryNames) + OrderManager orderManager, Dictionary countries) { Func setupItem = (race, itemTemplate) => { var item = ScrollItemWidget.Setup(itemTemplate, () => client.Country == race, () => orderManager.IssueOrder(Order.Command("race {0} {1}".F(client.Index, race)))); - item.Get("LABEL").GetText = () => countryNames[race]; + var country = countries[race]; + item.Get("LABEL").GetText = () => country.Name; var flag = item.Get("FLAG"); flag.GetImageCollection = () => "flags"; flag.GetImageName = () => race; + item.GetTooltipText = () => country.Description; return item; }; - dropdown.ShowDropDown("RACE_DROPDOWN_TEMPLATE", 150, countryNames.Keys, setupItem); + var options = countries.GroupBy(c => c.Value.Side).ToDictionary(g => g.Key ?? "", g => g.Select(c => c.Key)); + + dropdown.ShowDropDown("RACE_DROPDOWN_TEMPLATE", 150, options, setupItem); } public static void ShowColorDropDown(DropDownButtonWidget color, Session.Client client, @@ -389,21 +393,25 @@ namespace OpenRA.Mods.RA.Widgets.Logic color.GetColor = () => c.Color.RGB; } - public static void SetupEditableFactionWidget(Widget parent, Session.Slot s, Session.Client c, OrderManager orderManager, Dictionary countryNames) + public static void SetupEditableFactionWidget(Widget parent, Session.Slot s, Session.Client c, OrderManager orderManager, + Dictionary countries) { var dropdown = parent.Get("FACTION"); dropdown.IsDisabled = () => s.LockRace || orderManager.LocalClient.IsReady; - dropdown.OnMouseDown = _ => ShowRaceDropDown(dropdown, c, orderManager, countryNames); - SetupFactionWidget(dropdown, s, c, countryNames); + dropdown.OnMouseDown = _ => ShowRaceDropDown(dropdown, c, orderManager, countries); + var factionDescription = countries[c.Country].Description; + dropdown.GetTooltipText = () => factionDescription; + SetupFactionWidget(dropdown, s, c, countries); } - public static void SetupFactionWidget(Widget parent, Session.Slot s, Session.Client c, Dictionary countryNames) + public static void SetupFactionWidget(Widget parent, Session.Slot s, Session.Client c, + Dictionary countries) { - var factionname = parent.Get("FACTIONNAME"); - factionname.GetText = () => countryNames[c.Country]; - var factionflag = parent.Get("FACTIONFLAG"); - factionflag.GetImageName = () => c.Country; - factionflag.GetImageCollection = () => "flags"; + var factionName = parent.Get("FACTIONNAME"); + factionName.GetText = () => countries[c.Country].Name; + var factionFlag = parent.Get("FACTIONFLAG"); + factionFlag.GetImageName = () => c.Country; + factionFlag.GetImageCollection = () => "flags"; } public static void SetupEditableTeamWidget(Widget parent, Session.Slot s, Session.Client c, OrderManager orderManager, MapPreview map) diff --git a/mods/ra/chrome/lobby-playerbin.yaml b/mods/ra/chrome/lobby-playerbin.yaml index 845f5c6158..364cc53bb5 100644 --- a/mods/ra/chrome/lobby-playerbin.yaml +++ b/mods/ra/chrome/lobby-playerbin.yaml @@ -61,6 +61,9 @@ ScrollPanel@LOBBY_PLAYER_BIN: X: 280 Width: 130 Height: 25 + TooltipContainer: TOOLTIP_CONTAINER + TooltipTemplate: FACTION_DESCRIPTION_TOOLTIP + PanelRoot: FACTION_DROPDOWN_PANEL_ROOT # ensure that tooltips for the options are on top of the dropdown panel Children: Image@FACTIONFLAG: Width: 30 @@ -326,12 +329,27 @@ ScrollPanel@LOBBY_PLAYER_BIN: ScrollPanel@RACE_DROPDOWN_TEMPLATE: Width: DROPDOWN_WIDTH Children: + ScrollItem@HEADER: + BaseName: scrollheader + Width: PARENT_RIGHT-27 + Height: 13 + X: 2 + Y: 0 + Visible: false + Children: + Label@LABEL: + Font: TinyBold + Width: PARENT_RIGHT + Height: 10 + Align: Center ScrollItem@TEMPLATE: Width: PARENT_RIGHT-27 Height: 25 X: 2 Y: 0 Visible: false + TooltipContainer: TOOLTIP_CONTAINER + TooltipTemplate: FACTION_DESCRIPTION_TOOLTIP Children: Image@FLAG: X: 5 @@ -341,5 +359,4 @@ ScrollPanel@RACE_DROPDOWN_TEMPLATE: Label@LABEL: X: 40 Width: 60 - Height: 25 - + Height: 25 \ No newline at end of file diff --git a/mods/ra/chrome/lobby.yaml b/mods/ra/chrome/lobby.yaml index 9320dfdda0..0c16938d15 100644 --- a/mods/ra/chrome/lobby.yaml +++ b/mods/ra/chrome/lobby.yaml @@ -141,5 +141,5 @@ Background@SERVER_LOBBY: Text: Disconnect Font: Bold Key: escape + Container@FACTION_DROPDOWN_PANEL_ROOT: TooltipContainer@TOOLTIP_CONTAINER: - diff --git a/mods/ra/chrome/tooltips.yaml b/mods/ra/chrome/tooltips.yaml index d203552b5d..5b78684304 100644 --- a/mods/ra/chrome/tooltips.yaml +++ b/mods/ra/chrome/tooltips.yaml @@ -185,4 +185,23 @@ Background@SUPPORT_POWER_TOOLTIP: X: 7 Y: 22 Font: TinyBold + VAlign: Top + +Background@FACTION_DESCRIPTION_TOOLTIP: + Logic: CountryTooltipLogic + Background: dialog4 + Children: + Label@HEADER: + X: 7 + Y: 6 + Width: 8 + Height: 12 + Font: Bold + VAlign: Top + Label@DESCRIPTION: + X: 14 + Y: 0 + Width: 15 + Height: 14 + Font: TinyBold VAlign: Top \ No newline at end of file diff --git a/mods/ra/rules/world.yaml b/mods/ra/rules/world.yaml index 448f90e299..3d9681f316 100644 --- a/mods/ra/rules/world.yaml +++ b/mods/ra/rules/world.yaml @@ -95,24 +95,38 @@ World: Country@0: Name: Allies Race: allies + Side: Allies + Description: Allies: Deception\nSpecial Ability: Can build fake structures Country@1: Name: England Race: england + Side: Allies + Description: England: Espionage\nSpecial Unit: British Spy\nSpecial Unit: Phase Transport Country@2: Name: France Race: france + Side: Allies + Description: France: Concealment\nSpecial Structure: Advanced Gap Generator\nSpecial Unit: Mobile Gap Generator Country@3: Name: Germany Race: germany + Side: Allies + Description: Germany: Technology\nSpecial Structure: Advanced Chronosphere\nSpecial Unit: Chrono Tank Country@4: Name: Soviet Race: soviet + Side: Soviet + Description: Soviet: Infantry\nSpecial Ability: Paradrop\nSpecial Ability: Spy Plane Country@5: Name: Russia Race: russia + Side: Soviet + Description: Russia: Tanks\nSpecial Ability: Armor Airdrop\nSpecial Unit: MAD Tank Country@6: Name: Ukraine Race: ukraine + Side: Soviet + Description: Ukraine: Demolitions\nSpecial Ability: Parabombs\nSpecial Unit: Demolition Truck DomainIndex: SmudgeLayer@SCORCH: Type: Scorch From 52f6cb418ab7ef570d2f9b731305f6cf8fe639f3 Mon Sep 17 00:00:00 2001 From: ScottNZ Date: Sun, 7 Dec 2014 15:19:56 +1300 Subject: [PATCH 17/22] Fix faction dropdowns unhighlighting when they shouldn't --- mods/cnc/chrome/settings.yaml | 1 + mods/d2k/chrome/lobby-playerbin.yaml | 2 ++ mods/ra/chrome/lobby-playerbin.yaml | 2 ++ mods/ra/chrome/settings.yaml | 1 + 4 files changed, 6 insertions(+) diff --git a/mods/cnc/chrome/settings.yaml b/mods/cnc/chrome/settings.yaml index 7ddfa6d05d..83549370a8 100644 --- a/mods/cnc/chrome/settings.yaml +++ b/mods/cnc/chrome/settings.yaml @@ -169,6 +169,7 @@ Container@SETTINGS_PANEL: Y: 205 Width: 70 Height: 25 + IgnoreChildMouseOver: true Children: ColorBlock@COLORBLOCK: X: 5 diff --git a/mods/d2k/chrome/lobby-playerbin.yaml b/mods/d2k/chrome/lobby-playerbin.yaml index 2a2f254c87..89fb9f82b5 100644 --- a/mods/d2k/chrome/lobby-playerbin.yaml +++ b/mods/d2k/chrome/lobby-playerbin.yaml @@ -51,6 +51,7 @@ ScrollPanel@LOBBY_PLAYER_BIN: X: 190 Width: 80 Height: 25 + IgnoreChildMouseOver: true Children: ColorBlock@COLORBLOCK: X: 5 @@ -61,6 +62,7 @@ ScrollPanel@LOBBY_PLAYER_BIN: X: 280 Width: 130 Height: 25 + IgnoreChildMouseOver: true Children: Image@FACTIONFLAG: Width: 23 diff --git a/mods/ra/chrome/lobby-playerbin.yaml b/mods/ra/chrome/lobby-playerbin.yaml index 364cc53bb5..20ea8f4c9a 100644 --- a/mods/ra/chrome/lobby-playerbin.yaml +++ b/mods/ra/chrome/lobby-playerbin.yaml @@ -51,6 +51,7 @@ ScrollPanel@LOBBY_PLAYER_BIN: X: 190 Width: 80 Height: 25 + IgnoreChildMouseOver: true Children: ColorBlock@COLORBLOCK: X: 5 @@ -61,6 +62,7 @@ ScrollPanel@LOBBY_PLAYER_BIN: X: 280 Width: 130 Height: 25 + IgnoreChildMouseOver: true TooltipContainer: TOOLTIP_CONTAINER TooltipTemplate: FACTION_DESCRIPTION_TOOLTIP PanelRoot: FACTION_DROPDOWN_PANEL_ROOT # ensure that tooltips for the options are on top of the dropdown panel diff --git a/mods/ra/chrome/settings.yaml b/mods/ra/chrome/settings.yaml index a335cc12f6..7e544d3603 100644 --- a/mods/ra/chrome/settings.yaml +++ b/mods/ra/chrome/settings.yaml @@ -182,6 +182,7 @@ Background@SETTINGS_PANEL: Y: 205 Width: 70 Height: 25 + IgnoreChildMouseOver: true Children: ColorBlock@COLORBLOCK: X: 5 From 486b878e9beea1b97431be9f838cd20c89008c35 Mon Sep 17 00:00:00 2001 From: ScottNZ Date: Sun, 7 Dec 2014 18:21:52 +1300 Subject: [PATCH 18/22] Set up additional prerequisites to make it easier for modders --- mods/ra/rules/structures.yaml | 138 ++++++++++++++++++++++++++++++++++ 1 file changed, 138 insertions(+) diff --git a/mods/ra/rules/structures.yaml b/mods/ra/rules/structures.yaml index 54515520a5..57ac362df8 100644 --- a/mods/ra/rules/structures.yaml +++ b/mods/ra/rules/structures.yaml @@ -146,6 +146,30 @@ SPEN: ProductionBar: Power: Amount: -30 + ProvidesCustomPrerequisite@soviet: + Race: soviet, russia, ukraine + Prerequisite: ships.soviet + ProvidesCustomPrerequisite@sovietvanilla: + Race: soviet + Prerequisite: ships.sovietvanilla + ProvidesCustomPrerequisite@russia: + Race: russia + Prerequisite: ships.russia + ProvidesCustomPrerequisite@ukraine: + Race: ukraine + Prerequisite: ships.ukraine + ProvidesCustomPrerequisite@sovietstructure: + RequiresPrerequisites: structures.soviet + Prerequisite: ships.soviet + ProvidesCustomPrerequisite@sovietvanillastructure: + RequiresPrerequisites: structures.sovietvanilla + Prerequisite: ships.sovietvanilla + ProvidesCustomPrerequisite@russianstructure: + RequiresPrerequisites: structures.russia + Prerequisite: ships.russia + ProvidesCustomPrerequisite@ukrainianstructure: + RequiresPrerequisites: structures.ukraine + Prerequisite: ships.ukraine SYRD: Inherits: ^Building @@ -199,6 +223,36 @@ SYRD: ProductionBar: Power: Amount: -30 + ProvidesCustomPrerequisite@allies: + Race: allies, england, france, germany + Prerequisite: ships.allies + ProvidesCustomPrerequisite@alliesvanilla: + Race: allies + Prerequisite: ships.alliesvanilla + ProvidesCustomPrerequisite@england: + Race: england + Prerequisite: ships.england + ProvidesCustomPrerequisite@france: + Race: france + Prerequisite: ships.france + ProvidesCustomPrerequisite@germany: + Race: germany + Prerequisite: ships.germany + ProvidesCustomPrerequisite@alliedstructure: + RequiresPrerequisites: structures.allies + Prerequisite: ships.allies + ProvidesCustomPrerequisite@alliedvanillastructure: + RequiresPrerequisites: structures.alliesvanilla + Prerequisite: ships.alliesvanilla + ProvidesCustomPrerequisite@englishstructure: + RequiresPrerequisites: structures.england + Prerequisite: ships.england + ProvidesCustomPrerequisite@frenchstructure: + RequiresPrerequisites: structures.france + Prerequisite: ships.france + ProvidesCustomPrerequisite@germanstructure: + RequiresPrerequisites: structures.germany + Prerequisite: ships.germany IRON: Inherits: ^Building @@ -953,6 +1007,36 @@ HPAD: PrimaryBuilding: Power: Amount: -10 + ProvidesCustomPrerequisite@allies: + Race: allies, england, france, germany + Prerequisite: aircraft.allies + ProvidesCustomPrerequisite@alliesvanilla: + Race: allies + Prerequisite: aircraft.alliesvanilla + ProvidesCustomPrerequisite@england: + Race: england + Prerequisite: aircraft.england + ProvidesCustomPrerequisite@france: + Race: france + Prerequisite: aircraft.france + ProvidesCustomPrerequisite@germany: + Race: germany + Prerequisite: aircraft.germany + ProvidesCustomPrerequisite@alliedstructure: + RequiresPrerequisites: structures.allies + Prerequisite: aircraft.allies + ProvidesCustomPrerequisite@alliedvanillastructure: + RequiresPrerequisites: structures.alliesvanilla + Prerequisite: aircraft.alliesvanilla + ProvidesCustomPrerequisite@englishstructure: + RequiresPrerequisites: structures.england + Prerequisite: aircraft.england + ProvidesCustomPrerequisite@frenchstructure: + RequiresPrerequisites: structures.france + Prerequisite: aircraft.france + ProvidesCustomPrerequisite@germanstructure: + RequiresPrerequisites: structures.germany + Prerequisite: aircraft.germany AFLD: Inherits: ^Building @@ -983,6 +1067,9 @@ AFLD: Production: Produces: Aircraft, Plane Reservable: + ProvidesCustomPrerequisite@soviet: + Race: soviet, russia, ukraine + Prerequisite: aircraft.soviet ProvidesCustomPrerequisite@sovietvanilla: Race: soviet Prerequisite: aircraft.sovietvanilla @@ -992,6 +1079,9 @@ AFLD: ProvidesCustomPrerequisite@ukraine: Race: ukraine Prerequisite: aircraft.ukraine + ProvidesCustomPrerequisite@sovietstructure: + RequiresPrerequisites: structures.soviet + Prerequisite: aircraft.soviet ProvidesCustomPrerequisite@sovietvanillastructure: RequiresPrerequisites: structures.sovietvanilla Prerequisite: aircraft.sovietvanilla @@ -1191,6 +1281,30 @@ BARR: ProductionBar: ProvidesCustomPrerequisite: Prerequisite: barracks + ProvidesCustomPrerequisite@soviet: + Race: soviet, russia, ukraine + Prerequisite: infantry.soviet + ProvidesCustomPrerequisite@sovietvanilla: + Race: soviet + Prerequisite: infantry.sovietvanilla + ProvidesCustomPrerequisite@russia: + Race: russia + Prerequisite: infantry.russia + ProvidesCustomPrerequisite@ukraine: + Race: ukraine + Prerequisite: infantry.ukraine + ProvidesCustomPrerequisite@sovietstructure: + RequiresPrerequisites: structures.soviet + Prerequisite: infantry.soviet + ProvidesCustomPrerequisite@sovietvanillastructure: + RequiresPrerequisites: structures.sovietvanilla + Prerequisite: infantry.sovietvanilla + ProvidesCustomPrerequisite@russianstructure: + RequiresPrerequisites: structures.russia + Prerequisite: infantry.russia + ProvidesCustomPrerequisite@ukrainianstructure: + RequiresPrerequisites: structures.ukraine + Prerequisite: infantry.ukraine Power: Amount: -20 @@ -1262,12 +1376,36 @@ TENT: ProductionBar: ProvidesCustomPrerequisite@barracks: Prerequisite: barracks + ProvidesCustomPrerequisite@allies: + Race: allies, england, france, germany + Prerequisite: infantry.allies + ProvidesCustomPrerequisite@alliesvanilla: + Race: allies + Prerequisite: infantry.alliesvanilla ProvidesCustomPrerequisite@england: Race: england Prerequisite: infantry.england + ProvidesCustomPrerequisite@france: + Race: france + Prerequisite: infantry.france + ProvidesCustomPrerequisite@germany: + Race: germany + Prerequisite: infantry.germany + ProvidesCustomPrerequisite@alliedstructure: + RequiresPrerequisites: structures.allies + Prerequisite: infantry.allies + ProvidesCustomPrerequisite@alliedvanillastructure: + RequiresPrerequisites: structures.alliesvanilla + Prerequisite: infantry.alliesvanilla ProvidesCustomPrerequisite@englishstructure: RequiresPrerequisites: structures.england Prerequisite: infantry.england + ProvidesCustomPrerequisite@frenchstructure: + RequiresPrerequisites: structures.france + Prerequisite: infantry.france + ProvidesCustomPrerequisite@germanstructure: + RequiresPrerequisites: structures.germany + Prerequisite: infantry.germany Power: Amount: -20 From 2f8fb1a138b5d5e73b2c8e606d59b34e415aca48 Mon Sep 17 00:00:00 2001 From: ScottNZ Date: Sat, 13 Dec 2014 12:23:45 +1300 Subject: [PATCH 19/22] Increase minelayer capacity to 5 --- mods/ra/rules/vehicles.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/mods/ra/rules/vehicles.yaml b/mods/ra/rules/vehicles.yaml index cca27bdced..c6306c8ee0 100644 --- a/mods/ra/rules/vehicles.yaml +++ b/mods/ra/rules/vehicles.yaml @@ -420,7 +420,7 @@ MNLY.AP: Mine: MINP MineImmune: LimitedAmmo: - Ammo: 3 + Ammo: 5 DetectCloaked: Range: 5 CloakTypes: Mine @@ -454,7 +454,7 @@ MNLY.AT: Mine: MINV MineImmune: LimitedAmmo: - Ammo: 3 + Ammo: 5 DetectCloaked: Range: 5 CloakTypes: Mine From a4ed7284281cd877773c27c706fb6e4dee099924 Mon Sep 17 00:00:00 2001 From: ScottNZ Date: Sat, 13 Dec 2014 12:25:20 +1300 Subject: [PATCH 20/22] Reduce price of MAD tank to $2000 --- mods/ra/rules/vehicles.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mods/ra/rules/vehicles.yaml b/mods/ra/rules/vehicles.yaml index c6306c8ee0..cc4ffa01aa 100644 --- a/mods/ra/rules/vehicles.yaml +++ b/mods/ra/rules/vehicles.yaml @@ -706,7 +706,7 @@ QTNK: BuildPaletteOrder: 200 Prerequisites: fix, stek, ~vehicles.russia, ~techlevel.unrestricted Valued: - Cost: 2500 + Cost: 2000 Tooltip: Name: MAD Tank Description: Deals seismic damage to nearby vehicles\nand structures.\n Strong vs Vehicles, Buildings\n Weak vs Infantry From d77086a94b56ef52c622f6035cd8801e16a3123c Mon Sep 17 00:00:00 2001 From: ScottNZ Date: Sat, 13 Dec 2014 13:16:48 +1300 Subject: [PATCH 21/22] Buff parabombs - increase damage and spread --- mods/ra/weapons.yaml | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/mods/ra/weapons.yaml b/mods/ra/weapons.yaml index 3cf3f2fa20..b92d0ee5ca 100644 --- a/mods/ra/weapons.yaml +++ b/mods/ra/weapons.yaml @@ -1109,9 +1109,8 @@ ParaBomb: Velocity: 43 Acceleration: 0 Warhead@1Dam: SpreadDamage - Spread: 256 - Damage: 50 - Falloff: 1000, 368, 135, 50, 18, 7, 0 + Spread: 768 + Damage: 300 DeathType: 4 Versus: None: 30 From 67faca2e57d2c34097664c8c3e9e08f01f1f23a8 Mon Sep 17 00:00:00 2001 From: ScottNZ Date: Sun, 14 Dec 2014 12:16:03 +1300 Subject: [PATCH 22/22] Remove fake structure access from a few missions --- mods/ra/maps/allies-02/map.yaml | 12 ++++++++++++ mods/ra/maps/allies-03a/map.yaml | 12 ++++++++++++ mods/ra/maps/survival01/map.yaml | 12 ++++++++++++ 3 files changed, 36 insertions(+) diff --git a/mods/ra/maps/allies-02/map.yaml b/mods/ra/maps/allies-02/map.yaml index 2fa4aed415..4b24264b43 100644 --- a/mods/ra/maps/allies-02/map.yaml +++ b/mods/ra/maps/allies-02/map.yaml @@ -982,6 +982,18 @@ Rules: HIJACKER: Buildable: Prerequisites: ~disabled + FACF: + Buildable: + Prerequisites: ~disabled + WEAF: + Buildable: + Prerequisites: ~disabled + SYRF: + Buildable: + Prerequisites: ~disabled + DOMF: + Buildable: + Prerequisites: ~disabled Sequences: diff --git a/mods/ra/maps/allies-03a/map.yaml b/mods/ra/maps/allies-03a/map.yaml index b29d35bc4f..81a6c0a560 100644 --- a/mods/ra/maps/allies-03a/map.yaml +++ b/mods/ra/maps/allies-03a/map.yaml @@ -1578,6 +1578,18 @@ Rules: SHOK: Buildable: Prerequisites: ~disabled + FACF: + Buildable: + Prerequisites: ~disabled + WEAF: + Buildable: + Prerequisites: ~disabled + SYRF: + Buildable: + Prerequisites: ~disabled + DOMF: + Buildable: + Prerequisites: ~disabled Sequences: diff --git a/mods/ra/maps/survival01/map.yaml b/mods/ra/maps/survival01/map.yaml index 3799c1c485..d3f13892d0 100644 --- a/mods/ra/maps/survival01/map.yaml +++ b/mods/ra/maps/survival01/map.yaml @@ -1353,6 +1353,18 @@ Rules: DTRK: Buildable: Prerequisites: ~disabled + FACF: + Buildable: + Prerequisites: ~disabled + WEAF: + Buildable: + Prerequisites: ~disabled + SYRF: + Buildable: + Prerequisites: ~disabled + DOMF: + Buildable: + Prerequisites: ~disabled Sequences: