From 6b7cecb576db0a992b64abdc8b141b3c093d5b29 Mon Sep 17 00:00:00 2001 From: darkademic <41052878+darkademic@users.noreply.github.com> Date: Thu, 14 Dec 2023 09:52:44 +0000 Subject: [PATCH 1/3] Corrected Cyborg Mechanic salvage time to match Mechanic. --- mods/ca/rules/infantry.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mods/ca/rules/infantry.yaml b/mods/ca/rules/infantry.yaml index 65b6397185..d5ad95687b 100644 --- a/mods/ca/rules/infantry.yaml +++ b/mods/ca/rules/infantry.yaml @@ -1007,7 +1007,7 @@ CMEC: CaptureTypes: husk PlayerExperience: 5 ConsumedByCapture: False - CaptureDelay: 150 + CaptureDelay: 75 PlayerExperienceRelationships: Neutral, Enemy EnterCursor: sell2 EnterBlockedCursor: move-blocked From 98072ae72b40a1abba9d79217f94135d4ec17e2a Mon Sep 17 00:00:00 2001 From: darkademic <41052878+darkademic@users.noreply.github.com> Date: Thu, 7 Dec 2023 16:26:16 +0000 Subject: [PATCH 2/3] Map rules. --- mods/ca/maps/ca-prologue-01/map.yaml | 4 +- mods/ca/maps/ca-prologue-01/rules.yaml | 2 +- mods/ca/maps/ca-prologue-02/map.yaml | 4 +- mods/ca/maps/ca-prologue-03/map.yaml | 4 +- mods/ca/maps/ca-prologue-04/map.yaml | 4 +- mods/ca/maps/ca-prologue-04/rules.yaml | 28 ----------- mods/ca/maps/ca01-crossrip/map.yaml | 4 +- mods/ca/maps/ca02-displacement/map.yaml | 4 +- mods/ca/maps/ca03-deliverance/map.yaml | 4 +- mods/ca/maps/ca04-containment/map.yaml | 4 +- mods/ca/maps/ca04-containment/rules.yaml | 2 - mods/ca/maps/ca05-machinations/map.yaml | 4 +- mods/ca/maps/ca05-machinations/rules.yaml | 30 ------------ mods/ca/maps/ca06-conspiracy/map.yaml | 4 +- mods/ca/maps/ca06-conspiracy/rules.yaml | 36 -------------- mods/ca/maps/ca07-subversion/map.yaml | 4 +- mods/ca/maps/ca07-subversion/rules.yaml | 30 ------------ mods/ca/maps/ca08-salvation/map.yaml | 4 +- mods/ca/maps/ca08-salvation/rules.yaml | 26 ---------- mods/ca/maps/ca09-zenith/map.yaml | 4 +- mods/ca/maps/ca09-zenith/rules.yaml | 46 ------------------ mods/ca/maps/ca10-awakening/map.yaml | 4 +- mods/ca/maps/ca10-awakening/rules.yaml | 38 --------------- mods/ca/maps/ca11-abasement/map.yaml | 4 +- mods/ca/maps/ca11-abasement/rules.yaml | 30 ------------ mods/ca/maps/ca12-treachery/map.yaml | 4 +- mods/ca/maps/ca12-treachery/rules.yaml | 30 ------------ mods/ca/maps/ca13-ironclad/map.yaml | 4 +- mods/ca/maps/ca13-ironclad/rules.yaml | 30 ------------ mods/ca/maps/ca14-expulsion/map.yaml | 4 +- mods/ca/maps/ca14-expulsion/rules.yaml | 30 ------------ mods/ca/maps/ca15-domination/map.yaml | 4 +- mods/ca/maps/ca15-domination/rules.yaml | 38 --------------- mods/ca/maps/ca16-proliferation/map.yaml | 4 +- mods/ca/maps/ca16-proliferation/rules.yaml | 42 ---------------- mods/ca/maps/ca17-encroachment/map.yaml | 4 +- mods/ca/maps/ca17-encroachment/rules.yaml | 30 ------------ mods/ca/maps/ca18-incapacitation/map.yaml | 4 +- mods/ca/maps/ca18-incapacitation/rules.yaml | 30 ------------ mods/ca/maps/ca19-decimation/map.yaml | 4 +- mods/ca/maps/ca19-decimation/rules.yaml | 30 ------------ mods/ca/maps/ca20-subjugation/map.yaml | 4 +- mods/ca/maps/ca20-subjugation/rules.yaml | 30 ------------ mods/ca/maps/ca21-enmity/map.yaml | 4 +- mods/ca/maps/ca21-enmity/rules.yaml | 30 ------------ mods/ca/maps/ca22-capitulation/map.yaml | 4 +- mods/ca/maps/ca22-capitulation/rules.yaml | 30 ------------ mods/ca/maps/ca23-emancipation/map.yaml | 4 +- mods/ca/maps/ca23-emancipation/rules.yaml | 28 ----------- mods/ca/maps/ca24-duality/map.yaml | 4 +- mods/ca/maps/ca24-duality/rules.yaml | 30 ------------ mods/ca/maps/ca25-singularity/map.yaml | 4 +- mods/ca/maps/ca25-singularity/rules.yaml | 34 ------------- mods/ca/maps/ca26-foothold/map.yaml | 4 +- mods/ca/maps/ca27-convergence/map.yaml | 4 +- mods/ca/maps/ca28-illumination/map.yaml | 4 +- mods/ca/maps/ca29-purification/map.yaml | 4 +- mods/ca/maps/ca29-purification/rules.yaml | 48 ------------------- mods/ca/maps/ca30-reckoning/map.yaml | 4 +- mods/ca/maps/ca30-reckoning/rules.yaml | 46 ------------------ mods/ca/maps/containment-coop/map.yaml | 4 +- mods/ca/maps/duality-coop/map.yaml | 4 +- mods/ca/maps/mastermind-madness/map.yaml | 4 +- mods/ca/maps/mega-mastermind-madness/map.yaml | 4 +- mods/ca/maps/scrinfestation/map.yaml | 4 +- mods/ca/maps/shellmap/map.yaml | 2 +- mods/ca/maps/shellmap/rules.yaml | 4 -- mods/ca/maps/team-mastermind-madness/map.yaml | 4 +- mods/ca/maps/team-scrinfestation/map.yaml | 4 +- mods/ca/rules/campaign-palettes.yaml | 13 ----- .../ca/rules/{ => custom}/campaign-rules.yaml | 3 +- .../rules/{ => custom}/campaign-tooltips.yaml | 0 .../custom/mastermind-madness.yaml} | 2 + .../custom/scrinfestation-base.yaml} | 0 .../custom/scrinfestation-minigame.yaml} | 0 mods/ca/weapons/{ => custom}/campaign.yaml | 0 .../custom/mastermind-madness.yaml} | 0 .../custom/scrinfestation.yaml} | 0 78 files changed, 87 insertions(+), 905 deletions(-) delete mode 100644 mods/ca/rules/campaign-palettes.yaml rename mods/ca/rules/{ => custom}/campaign-rules.yaml (99%) rename mods/ca/rules/{ => custom}/campaign-tooltips.yaml (100%) rename mods/ca/{maps/mastermind-madness/mastermind-madness-rules.yaml => rules/custom/mastermind-madness.yaml} (99%) rename mods/ca/{maps/scrinfestation/scrinfestation-rules-base.yaml => rules/custom/scrinfestation-base.yaml} (100%) rename mods/ca/{maps/scrinfestation/scrinfestation-rules.yaml => rules/custom/scrinfestation-minigame.yaml} (100%) rename mods/ca/weapons/{ => custom}/campaign.yaml (100%) rename mods/ca/{maps/mastermind-madness/mastermind-madness-weapons.yaml => weapons/custom/mastermind-madness.yaml} (100%) rename mods/ca/{maps/scrinfestation/scrinfestation-weapons.yaml => weapons/custom/scrinfestation.yaml} (100%) diff --git a/mods/ca/maps/ca-prologue-01/map.yaml b/mods/ca/maps/ca-prologue-01/map.yaml index c2064a543f..6c96ddeca0 100644 --- a/mods/ca/maps/ca-prologue-01/map.yaml +++ b/mods/ca/maps/ca-prologue-01/map.yaml @@ -517,6 +517,6 @@ Actors: Owner: Neutral Location: 63,48 -Rules: ca|rules/campaign-rules.yaml, ca|rules/campaign-tooltips.yaml, ca|rules/campaign-palettes.yaml, rules.yaml +Rules: ca|rules/custom/campaign-rules.yaml, ca|rules/custom/campaign-tooltips.yaml, ca|rules/custom/two-tone-nod.yaml, rules.yaml -Weapons: ca|weapons/campaign.yaml, weapons.yaml +Weapons: ca|weapons/custom/campaign.yaml, weapons.yaml diff --git a/mods/ca/maps/ca-prologue-01/rules.yaml b/mods/ca/maps/ca-prologue-01/rules.yaml index b71a9a030e..e6028386ae 100644 --- a/mods/ca/maps/ca-prologue-01/rules.yaml +++ b/mods/ca/maps/ca-prologue-01/rules.yaml @@ -11,7 +11,7 @@ World: MusicPlaylist: StartingMusic: bigf226m -TRAN.Evac: +TRAN.evac: Cargo: Types: Einstein MaxWeight: 1 diff --git a/mods/ca/maps/ca-prologue-02/map.yaml b/mods/ca/maps/ca-prologue-02/map.yaml index 9b2c5edb9f..02fb65c3f1 100644 --- a/mods/ca/maps/ca-prologue-02/map.yaml +++ b/mods/ca/maps/ca-prologue-02/map.yaml @@ -937,6 +937,6 @@ Actors: SubCell: 3 Location: 38,43 -Rules: ca|rules/campaign-rules.yaml, ca|rules/campaign-tooltips.yaml, ca|rules/campaign-palettes.yaml, rules.yaml +Rules: ca|rules/custom/campaign-rules.yaml, ca|rules/custom/campaign-tooltips.yaml, ca|rules/custom/two-tone-nod.yaml, rules.yaml -Weapons: ca|weapons/campaign.yaml +Weapons: ca|weapons/custom/campaign.yaml diff --git a/mods/ca/maps/ca-prologue-03/map.yaml b/mods/ca/maps/ca-prologue-03/map.yaml index 2d737cde8b..eae3136888 100644 --- a/mods/ca/maps/ca-prologue-03/map.yaml +++ b/mods/ca/maps/ca-prologue-03/map.yaml @@ -1178,6 +1178,6 @@ Actors: Owner: Neutral Location: 60,44 -Rules: ca|rules/campaign-rules.yaml, ca|rules/campaign-tooltips.yaml, ca|rules/campaign-palettes.yaml, rules.yaml +Rules: ca|rules/custom/campaign-rules.yaml, ca|rules/custom/campaign-tooltips.yaml, ca|rules/custom/two-tone-nod.yaml, rules.yaml -Weapons: ca|weapons/campaign.yaml +Weapons: ca|weapons/custom/campaign.yaml diff --git a/mods/ca/maps/ca-prologue-04/map.yaml b/mods/ca/maps/ca-prologue-04/map.yaml index cbd470c473..1c76d44313 100644 --- a/mods/ca/maps/ca-prologue-04/map.yaml +++ b/mods/ca/maps/ca-prologue-04/map.yaml @@ -774,8 +774,8 @@ Actors: Owner: Neutral Location: 5,42 -Rules: ca|rules/campaign-rules.yaml, ca|rules/campaign-tooltips.yaml, ca|rules/campaign-palettes.yaml, rules.yaml +Rules: ca|rules/custom/campaign-rules.yaml, ca|rules/custom/campaign-tooltips.yaml, ca|rules/custom/two-tone-nod.yaml, rules.yaml -Weapons: ca|weapons/campaign.yaml +Weapons: ca|weapons/custom/campaign.yaml Notifications: notifications.yaml diff --git a/mods/ca/maps/ca-prologue-04/rules.yaml b/mods/ca/maps/ca-prologue-04/rules.yaml index f538beceab..9410dcceca 100644 --- a/mods/ca/maps/ca-prologue-04/rules.yaml +++ b/mods/ca/maps/ca-prologue-04/rules.yaml @@ -15,28 +15,6 @@ Player: PlayerResources: DefaultCash: 10000 -^TDPalette: - RenderSprites: - PlayerPalette: playertdunit - -^Infantry: - RenderSprites: - PlayerPalette: playertdunit - WithDeathAnimation: - DeathSequencePalette: playertdunit - -^BuildingTD: - RenderSprites: - PlayerPalette: playertd - -^DefenseTD: - RenderSprites: - PlayerPalette: playertd - -HARV.TD: - RenderSprites: - PlayerPalette: playertd - AIRS: -ParatroopersPower@blackhairdrop: @@ -44,10 +22,6 @@ HQ: -DropPodsPowerCA@Zocom: -AirstrikePower@BlackhandFirebomb: -AMCV: - RenderSprites: - PlayerPalette: playertd - LTNK: Mobile: Locomotor: tracked @@ -154,8 +128,6 @@ RAH: SCRN: Inherits@CAMPAIGNDISABLED: ^Disabled - RenderSprites: - PlayerPalette: playertd HPAD.TD: Inherits@CAMPAIGNDISABLED: ^Disabled diff --git a/mods/ca/maps/ca01-crossrip/map.yaml b/mods/ca/maps/ca01-crossrip/map.yaml index 2e0b0d903d..9f7cdcd0c4 100644 --- a/mods/ca/maps/ca01-crossrip/map.yaml +++ b/mods/ca/maps/ca01-crossrip/map.yaml @@ -1607,8 +1607,8 @@ Actors: Location: 45,4 Facing: 384 -Rules: ca|rules/campaign-rules.yaml, ca|rules/campaign-tooltips.yaml, ca|rules/campaign-palettes.yaml, rules.yaml +Rules: ca|rules/custom/campaign-rules.yaml, ca|rules/custom/campaign-tooltips.yaml, ca|rules/custom/two-tone-nod.yaml, rules.yaml Sequences: sequences.yaml -Weapons: ca|weapons/campaign.yaml, weapons.yaml +Weapons: ca|weapons/custom/campaign.yaml, weapons.yaml diff --git a/mods/ca/maps/ca02-displacement/map.yaml b/mods/ca/maps/ca02-displacement/map.yaml index dc9e2b9461..cbc04b2fc1 100644 --- a/mods/ca/maps/ca02-displacement/map.yaml +++ b/mods/ca/maps/ca02-displacement/map.yaml @@ -3015,6 +3015,6 @@ Actors: Owner: Neutral Location: 71,38 -Rules: ca|rules/campaign-rules.yaml, ca|rules/campaign-tooltips.yaml, ca|rules/campaign-palettes.yaml, rules.yaml +Rules: ca|rules/custom/campaign-rules.yaml, ca|rules/custom/campaign-tooltips.yaml, ca|rules/custom/two-tone-nod.yaml, rules.yaml -Weapons: ca|weapons/campaign.yaml +Weapons: ca|weapons/custom/campaign.yaml diff --git a/mods/ca/maps/ca03-deliverance/map.yaml b/mods/ca/maps/ca03-deliverance/map.yaml index 5cc5fbbe19..dabdb1cdc8 100644 --- a/mods/ca/maps/ca03-deliverance/map.yaml +++ b/mods/ca/maps/ca03-deliverance/map.yaml @@ -3793,8 +3793,8 @@ Actors: Owner: Neutral Location: 40,77 -Rules: ca|rules/campaign-rules.yaml, ca|rules/campaign-tooltips.yaml, ca|rules/campaign-palettes.yaml, rules.yaml +Rules: ca|rules/custom/campaign-rules.yaml, ca|rules/custom/campaign-tooltips.yaml, ca|rules/custom/two-tone-nod.yaml, rules.yaml -Weapons: ca|weapons/campaign.yaml +Weapons: ca|weapons/custom/campaign.yaml Voices: voices.yaml diff --git a/mods/ca/maps/ca04-containment/map.yaml b/mods/ca/maps/ca04-containment/map.yaml index 933b2813d5..947a772f3b 100644 --- a/mods/ca/maps/ca04-containment/map.yaml +++ b/mods/ca/maps/ca04-containment/map.yaml @@ -3446,8 +3446,8 @@ Actors: Location: 88,14 Facing: 555 -Rules: ca|rules/campaign-rules.yaml, ca|rules/campaign-tooltips.yaml, ca|rules/campaign-palettes.yaml, rules.yaml +Rules: ca|rules/custom/campaign-rules.yaml, ca|rules/custom/campaign-tooltips.yaml, ca|rules/custom/two-tone-nod.yaml, rules.yaml Sequences: sequences.yaml -Weapons: ca|weapons/campaign.yaml, weapons.yaml +Weapons: ca|weapons/custom/campaign.yaml, weapons.yaml diff --git a/mods/ca/maps/ca04-containment/rules.yaml b/mods/ca/maps/ca04-containment/rules.yaml index 5d724d8a2d..8f526b1733 100644 --- a/mods/ca/maps/ca04-containment/rules.yaml +++ b/mods/ca/maps/ca04-containment/rules.yaml @@ -186,8 +186,6 @@ SEAS: SAPC: ExternalCondition@FORCEUNCLOAK: Condition: cloak-force-disabled - RenderSprites: - PlayerPalette: playerraunit AutoTarget: InitialStanceAI: HoldFire -Targetable: diff --git a/mods/ca/maps/ca05-machinations/map.yaml b/mods/ca/maps/ca05-machinations/map.yaml index 4c06bf8667..7286fd7090 100644 --- a/mods/ca/maps/ca05-machinations/map.yaml +++ b/mods/ca/maps/ca05-machinations/map.yaml @@ -2323,6 +2323,6 @@ Actors: Owner: Neutral Location: 88,37 -Rules: ca|rules/campaign-rules.yaml, ca|rules/campaign-tooltips.yaml, ca|rules/campaign-palettes.yaml, rules.yaml +Rules: ca|rules/custom/campaign-rules.yaml, ca|rules/custom/campaign-tooltips.yaml, ca|rules/custom/two-tone-nod.yaml, rules.yaml -Weapons: ca|weapons/campaign.yaml +Weapons: ca|weapons/custom/campaign.yaml diff --git a/mods/ca/maps/ca05-machinations/rules.yaml b/mods/ca/maps/ca05-machinations/rules.yaml index 1046f5b085..0282aaa9e4 100644 --- a/mods/ca/maps/ca05-machinations/rules.yaml +++ b/mods/ca/maps/ca05-machinations/rules.yaml @@ -24,36 +24,6 @@ Player: PlayerResources: DefaultCash: 6500 -^TDPalette: - RenderSprites: - PlayerPalette: playertdunit - -^Infantry: - RenderSprites: - PlayerPalette: playertdunit - WithDeathAnimation: - DeathSequencePalette: playertdunit - -^BuildingTD: - RenderSprites: - PlayerPalette: playertd - -^DefenseTD: - RenderSprites: - PlayerPalette: playertd - -SAPC: - RenderSprites: - PlayerPalette: playerraunit - -HARV.TD: - RenderSprites: - PlayerPalette: playertd - -AMCV: - RenderSprites: - PlayerPalette: playertd - SNIP: Buildable: Prerequisites: tent, atek diff --git a/mods/ca/maps/ca06-conspiracy/map.yaml b/mods/ca/maps/ca06-conspiracy/map.yaml index 56f26e38ff..57938bbb8b 100644 --- a/mods/ca/maps/ca06-conspiracy/map.yaml +++ b/mods/ca/maps/ca06-conspiracy/map.yaml @@ -3922,8 +3922,8 @@ Actors: Owner: Neutral Location: 59,25 -Rules: ca|rules/campaign-rules.yaml, ca|rules/campaign-tooltips.yaml, ca|rules/campaign-palettes.yaml, rules.yaml +Rules: ca|rules/custom/campaign-rules.yaml, ca|rules/custom/campaign-tooltips.yaml, ca|rules/custom/two-tone-nod.yaml, rules.yaml -Weapons: ca|weapons/campaign.yaml, weapons.yaml +Weapons: ca|weapons/custom/campaign.yaml, weapons.yaml Notifications: ca|rules/custom/force-cabal-eva.yaml diff --git a/mods/ca/maps/ca06-conspiracy/rules.yaml b/mods/ca/maps/ca06-conspiracy/rules.yaml index aeb35e67ca..d7c778bbd4 100644 --- a/mods/ca/maps/ca06-conspiracy/rules.yaml +++ b/mods/ca/maps/ca06-conspiracy/rules.yaml @@ -24,42 +24,6 @@ Player: PlayerResources: DefaultCash: 6500 -^TDPalette: - RenderSprites: - PlayerPalette: playertdunit - -^Infantry: - RenderSprites: - PlayerPalette: playertdunit - WithDeathAnimation: - DeathSequencePalette: playertdunit - -SHAD: - RenderSprites: - PlayerPalette: playertd - WithDeathAnimation: - DeathSequencePalette: playertd - -^BuildingTD: - RenderSprites: - PlayerPalette: playertd - -^DefenseTD: - RenderSprites: - PlayerPalette: playertd - -SAPC: - RenderSprites: - PlayerPalette: playerraunit - -HARV.TD: - RenderSprites: - PlayerPalette: playertd - -AMCV: - RenderSprites: - PlayerPalette: playertd - AFAC: RenderSprites: -FactionImages: diff --git a/mods/ca/maps/ca07-subversion/map.yaml b/mods/ca/maps/ca07-subversion/map.yaml index 52a1d5a8b7..70451ebc91 100644 --- a/mods/ca/maps/ca07-subversion/map.yaml +++ b/mods/ca/maps/ca07-subversion/map.yaml @@ -4378,8 +4378,8 @@ Actors: Owner: Neutral Location: 37,36 -Rules: ca|rules/campaign-rules.yaml, ca|rules/campaign-tooltips.yaml, ca|rules/campaign-palettes.yaml, rules.yaml +Rules: ca|rules/custom/campaign-rules.yaml, ca|rules/custom/campaign-tooltips.yaml, ca|rules/custom/two-tone-nod.yaml, rules.yaml -Weapons: ca|weapons/campaign.yaml, weapons.yaml +Weapons: ca|weapons/custom/campaign.yaml, weapons.yaml Notifications: ca|rules/custom/force-cabal-eva.yaml diff --git a/mods/ca/maps/ca07-subversion/rules.yaml b/mods/ca/maps/ca07-subversion/rules.yaml index 6f93675fef..9d7d838264 100644 --- a/mods/ca/maps/ca07-subversion/rules.yaml +++ b/mods/ca/maps/ca07-subversion/rules.yaml @@ -24,36 +24,6 @@ Player: PlayerResources: DefaultCash: 0 -^TDPalette: - RenderSprites: - PlayerPalette: playertdunit - -^Infantry: - RenderSprites: - PlayerPalette: playertdunit - WithDeathAnimation: - DeathSequencePalette: playertdunit - -^BuildingTD: - RenderSprites: - PlayerPalette: playertd - -^DefenseTD: - RenderSprites: - PlayerPalette: playertd - -SAPC: - RenderSprites: - PlayerPalette: playerraunit - -HARV.TD: - RenderSprites: - PlayerPalette: playertd - -AMCV: - RenderSprites: - PlayerPalette: playertd - advcyborg.upgrade: Inherits@CAMPAIGNDISABLED: ^Disabled diff --git a/mods/ca/maps/ca08-salvation/map.yaml b/mods/ca/maps/ca08-salvation/map.yaml index 9baad683dc..cd1df22ec7 100644 --- a/mods/ca/maps/ca08-salvation/map.yaml +++ b/mods/ca/maps/ca08-salvation/map.yaml @@ -1867,8 +1867,8 @@ Actors: Owner: Neutral Location: 21,85 -Rules: ca|rules/campaign-rules.yaml, ca|rules/campaign-tooltips.yaml, ca|rules/campaign-palettes.yaml, rules.yaml +Rules: ca|rules/custom/campaign-rules.yaml, ca|rules/custom/campaign-tooltips.yaml, ca|rules/custom/two-tone-nod.yaml, rules.yaml -Weapons: ca|weapons/campaign.yaml +Weapons: ca|weapons/custom/campaign.yaml Notifications: ca|rules/custom/force-cabal-eva.yaml diff --git a/mods/ca/maps/ca08-salvation/rules.yaml b/mods/ca/maps/ca08-salvation/rules.yaml index 6433fb5b89..824cc9431d 100644 --- a/mods/ca/maps/ca08-salvation/rules.yaml +++ b/mods/ca/maps/ca08-salvation/rules.yaml @@ -24,37 +24,11 @@ Player: PlayerResources: DefaultCash: 0 -^TDPalette: - RenderSprites: - PlayerPalette: playertdunit - -^Infantry: - RenderSprites: - PlayerPalette: playertdunit - WithDeathAnimation: - DeathSequencePalette: playertdunit - -^BuildingTD: - RenderSprites: - PlayerPalette: playertd - -^DefenseTD: - RenderSprites: - PlayerPalette: playertd - SAPC: Inherits@CAMPAIGNDISABLED: ^Disabled - RenderSprites: - PlayerPalette: playerraunit - -HARV.TD: - RenderSprites: - PlayerPalette: playertd AMCV: Inherits@CAMPAIGNDISABLED: ^Disabled - RenderSprites: - PlayerPalette: playertd AIRS: ParatroopersPower@markedairdrop: diff --git a/mods/ca/maps/ca09-zenith/map.yaml b/mods/ca/maps/ca09-zenith/map.yaml index 5c911c5d78..920b572240 100644 --- a/mods/ca/maps/ca09-zenith/map.yaml +++ b/mods/ca/maps/ca09-zenith/map.yaml @@ -4414,8 +4414,8 @@ Actors: SubCell: 3 Location: 41,19 -Rules: ca|rules/campaign-rules.yaml, ca|rules/campaign-tooltips.yaml, ca|rules/campaign-palettes.yaml, rules.yaml +Rules: ca|rules/custom/campaign-rules.yaml, ca|rules/custom/campaign-tooltips.yaml, ca|rules/custom/two-tone-nod.yaml, rules.yaml -Weapons: ca|weapons/campaign.yaml, weapons.yaml +Weapons: ca|weapons/custom/campaign.yaml, weapons.yaml Notifications: ca|rules/custom/force-cabal-eva.yaml diff --git a/mods/ca/maps/ca09-zenith/rules.yaml b/mods/ca/maps/ca09-zenith/rules.yaml index 5b7f552a87..a9a64126d5 100644 --- a/mods/ca/maps/ca09-zenith/rules.yaml +++ b/mods/ca/maps/ca09-zenith/rules.yaml @@ -36,52 +36,6 @@ Player: PlayerResources: DefaultCash: 6500 -^TDPalette: - RenderSprites: - PlayerPalette: playertdunit - -^Infantry: - RenderSprites: - PlayerPalette: playertdunit - WithDeathAnimation: - DeathSequencePalette: playertdunit - -^BuildingTD: - RenderSprites: - PlayerPalette: playertd - -^DefenseTD: - RenderSprites: - PlayerPalette: playertd - -SAPC: - RenderSprites: - PlayerPalette: playerraunit - -LST: - RenderSprites: - PlayerPalette: playerraunit - -SB: - RenderSprites: - PlayerPalette: playerraunit - -SS2: - RenderSprites: - PlayerPalette: playerraunit - -ISUB: - RenderSprites: - PlayerPalette: playerraunit - -HARV.TD: - RenderSprites: - PlayerPalette: playertd - -AMCV: - RenderSprites: - PlayerPalette: playertd - FTNK: Buildable: Prerequisites: anyradar, airs diff --git a/mods/ca/maps/ca10-awakening/map.yaml b/mods/ca/maps/ca10-awakening/map.yaml index f1ef6a29b4..c735948f18 100644 --- a/mods/ca/maps/ca10-awakening/map.yaml +++ b/mods/ca/maps/ca10-awakening/map.yaml @@ -1771,8 +1771,8 @@ Actors: Owner: Neutral Location: 21,41 -Rules: ca|rules/campaign-rules.yaml, ca|rules/campaign-tooltips.yaml, ca|rules/campaign-palettes.yaml, rules.yaml +Rules: ca|rules/custom/campaign-rules.yaml, ca|rules/custom/campaign-tooltips.yaml, ca|rules/custom/two-tone-nod.yaml, rules.yaml -Weapons: ca|weapons/campaign.yaml +Weapons: ca|weapons/custom/campaign.yaml Notifications: ca|rules/custom/force-cabal-eva.yaml diff --git a/mods/ca/maps/ca10-awakening/rules.yaml b/mods/ca/maps/ca10-awakening/rules.yaml index b697b8f1e4..0353fa4a00 100644 --- a/mods/ca/maps/ca10-awakening/rules.yaml +++ b/mods/ca/maps/ca10-awakening/rules.yaml @@ -24,36 +24,6 @@ Player: PlayerResources: DefaultCash: 6500 -^TDPalette: - RenderSprites: - PlayerPalette: playertdunit - -^Infantry: - RenderSprites: - PlayerPalette: playertdunit - WithDeathAnimation: - DeathSequencePalette: playertdunit - -^BuildingTD: - RenderSprites: - PlayerPalette: playertd - -^DefenseTD: - RenderSprites: - PlayerPalette: playertd - -SAPC: - RenderSprites: - PlayerPalette: playerraunit - -HARV.TD: - RenderSprites: - PlayerPalette: playertd - -AMCV: - RenderSprites: - PlayerPalette: playertd - AIRS: ParatroopersPower@markedairdrop: Prerequisites: airs @@ -106,17 +76,9 @@ RMBC: Inherits@CAMPAIGNDISABLED: ^Disabled Health: HP: 80000 - RenderSprites: - PlayerPalette: playertd - WithDeathAnimation: - DeathSequencePalette: playertd ENLI: Inherits@CAMPAIGNDISABLED: ^Disabled - RenderSprites: - PlayerPalette: playertd - WithDeathAnimation: - DeathSequencePalette: playertd microwave.upgrade: Buildable: diff --git a/mods/ca/maps/ca11-abasement/map.yaml b/mods/ca/maps/ca11-abasement/map.yaml index 50806c4ce0..0b586fbb77 100644 --- a/mods/ca/maps/ca11-abasement/map.yaml +++ b/mods/ca/maps/ca11-abasement/map.yaml @@ -2099,6 +2099,6 @@ Actors: Owner: Neutral Location: 73,3 -Rules: ca|rules/campaign-rules.yaml, ca|rules/campaign-tooltips.yaml, ca|rules/campaign-palettes.yaml, rules.yaml +Rules: ca|rules/custom/campaign-rules.yaml, ca|rules/custom/campaign-tooltips.yaml, ca|rules/custom/two-tone-nod.yaml, rules.yaml -Weapons: ca|weapons/campaign.yaml +Weapons: ca|weapons/custom/campaign.yaml diff --git a/mods/ca/maps/ca11-abasement/rules.yaml b/mods/ca/maps/ca11-abasement/rules.yaml index e9352ee618..c71da4186a 100644 --- a/mods/ca/maps/ca11-abasement/rules.yaml +++ b/mods/ca/maps/ca11-abasement/rules.yaml @@ -45,36 +45,6 @@ Player: PlayerResources: DefaultCash: 6500 -^TDPalette: - RenderSprites: - PlayerPalette: playertdunit - -^Infantry: - RenderSprites: - PlayerPalette: playertdunit - WithDeathAnimation: - DeathSequencePalette: playertdunit - -^BuildingTD: - RenderSprites: - PlayerPalette: playertd - -^DefenseTD: - RenderSprites: - PlayerPalette: playertd - -SAPC: - RenderSprites: - PlayerPalette: playerraunit - -HARV.TD: - RenderSprites: - PlayerPalette: playertd - -AMCV: - RenderSprites: - PlayerPalette: playertd - SIGN: Inherits@CAMPAIGNDISABLED: ^Disabled CaptureNotification: diff --git a/mods/ca/maps/ca12-treachery/map.yaml b/mods/ca/maps/ca12-treachery/map.yaml index e11cb5fbce..802c4a6bea 100644 --- a/mods/ca/maps/ca12-treachery/map.yaml +++ b/mods/ca/maps/ca12-treachery/map.yaml @@ -3429,6 +3429,6 @@ Actors: Location: 24,106 Facing: 118 -Rules: ca|rules/campaign-rules.yaml, ca|rules/campaign-tooltips.yaml, ca|rules/campaign-palettes.yaml, rules.yaml +Rules: ca|rules/custom/campaign-rules.yaml, ca|rules/custom/campaign-tooltips.yaml, ca|rules/custom/two-tone-nod.yaml, rules.yaml -Weapons: ca|weapons/campaign.yaml +Weapons: ca|weapons/custom/campaign.yaml diff --git a/mods/ca/maps/ca12-treachery/rules.yaml b/mods/ca/maps/ca12-treachery/rules.yaml index a74a11eb45..3c383299e9 100644 --- a/mods/ca/maps/ca12-treachery/rules.yaml +++ b/mods/ca/maps/ca12-treachery/rules.yaml @@ -24,36 +24,6 @@ Player: PlayerResources: DefaultCash: 6500 -^TDPalette: - RenderSprites: - PlayerPalette: playertdunit - -^Infantry: - RenderSprites: - PlayerPalette: playertdunit - WithDeathAnimation: - DeathSequencePalette: playertdunit - -^BuildingTD: - RenderSprites: - PlayerPalette: playertd - -^DefenseTD: - RenderSprites: - PlayerPalette: playertd - -SAPC: - RenderSprites: - PlayerPalette: playerraunit - -HARV.TD: - RenderSprites: - PlayerPalette: playertd - -AMCV: - RenderSprites: - PlayerPalette: playertd - MCV: Inherits@CAMPAIGNDISABLED: ^Disabled diff --git a/mods/ca/maps/ca13-ironclad/map.yaml b/mods/ca/maps/ca13-ironclad/map.yaml index 459f6f4f97..c33e355076 100644 --- a/mods/ca/maps/ca13-ironclad/map.yaml +++ b/mods/ca/maps/ca13-ironclad/map.yaml @@ -3699,6 +3699,6 @@ Actors: Owner: GDI Location: 72,69 -Rules: ca|rules/campaign-rules.yaml, ca|rules/campaign-tooltips.yaml, ca|rules/campaign-palettes.yaml, rules.yaml +Rules: ca|rules/custom/campaign-rules.yaml, ca|rules/custom/campaign-tooltips.yaml, ca|rules/custom/two-tone-nod.yaml, rules.yaml -Weapons: ca|weapons/campaign.yaml +Weapons: ca|weapons/custom/campaign.yaml diff --git a/mods/ca/maps/ca13-ironclad/rules.yaml b/mods/ca/maps/ca13-ironclad/rules.yaml index ed65c94f48..476704de5c 100644 --- a/mods/ca/maps/ca13-ironclad/rules.yaml +++ b/mods/ca/maps/ca13-ironclad/rules.yaml @@ -36,36 +36,6 @@ Player: PlayerResources: DefaultCash: 0 -^TDPalette: - RenderSprites: - PlayerPalette: playertdunit - -^Infantry: - RenderSprites: - PlayerPalette: playertdunit - WithDeathAnimation: - DeathSequencePalette: playertdunit - -^BuildingTD: - RenderSprites: - PlayerPalette: playertd - -^DefenseTD: - RenderSprites: - PlayerPalette: playertd - -SAPC: - RenderSprites: - PlayerPalette: playerraunit - -HARV.TD: - RenderSprites: - PlayerPalette: playertd - -AMCV: - RenderSprites: - PlayerPalette: playertd - IRON: GrantExternalConditionPowerCA@IRONCURTAIN: StartFullyCharged: True diff --git a/mods/ca/maps/ca14-expulsion/map.yaml b/mods/ca/maps/ca14-expulsion/map.yaml index 6f1f45836c..79987523c3 100644 --- a/mods/ca/maps/ca14-expulsion/map.yaml +++ b/mods/ca/maps/ca14-expulsion/map.yaml @@ -2289,6 +2289,6 @@ Actors: Owner: GDI Location: 63,74 -Rules: ca|rules/campaign-rules.yaml, ca|rules/campaign-tooltips.yaml, ca|rules/campaign-palettes.yaml, rules.yaml +Rules: ca|rules/custom/campaign-rules.yaml, ca|rules/custom/campaign-tooltips.yaml, ca|rules/custom/two-tone-nod.yaml, rules.yaml -Weapons: ca|weapons/campaign.yaml +Weapons: ca|weapons/custom/campaign.yaml diff --git a/mods/ca/maps/ca14-expulsion/rules.yaml b/mods/ca/maps/ca14-expulsion/rules.yaml index 7876afcd56..6a6ddb688e 100644 --- a/mods/ca/maps/ca14-expulsion/rules.yaml +++ b/mods/ca/maps/ca14-expulsion/rules.yaml @@ -36,36 +36,6 @@ Player: PlayerResources: DefaultCash: 6500 -^TDPalette: - RenderSprites: - PlayerPalette: playertdunit - -^Infantry: - RenderSprites: - PlayerPalette: playertdunit - WithDeathAnimation: - DeathSequencePalette: playertdunit - -^BuildingTD: - RenderSprites: - PlayerPalette: playertd - -^DefenseTD: - RenderSprites: - PlayerPalette: playertd - -SAPC: - RenderSprites: - PlayerPalette: playerraunit - -HARV.TD: - RenderSprites: - PlayerPalette: playertd - -AMCV: - RenderSprites: - PlayerPalette: playertd - ISU: Buildable: Prerequisites: anyradar, ~vehicles.soviet diff --git a/mods/ca/maps/ca15-domination/map.yaml b/mods/ca/maps/ca15-domination/map.yaml index 9546bc1f68..b79c340d54 100644 --- a/mods/ca/maps/ca15-domination/map.yaml +++ b/mods/ca/maps/ca15-domination/map.yaml @@ -2277,8 +2277,8 @@ Actors: Owner: Neutral Location: 71,19 -Rules: ca|rules/campaign-rules.yaml, ca|rules/campaign-tooltips.yaml, ca|rules/campaign-palettes.yaml, rules.yaml +Rules: ca|rules/custom/campaign-rules.yaml, ca|rules/custom/campaign-tooltips.yaml, ca|rules/custom/two-tone-nod.yaml, rules.yaml Sequences: sequences.yaml -Weapons: ca|weapons/campaign.yaml, weapons.yaml +Weapons: ca|weapons/custom/campaign.yaml, weapons.yaml diff --git a/mods/ca/maps/ca15-domination/rules.yaml b/mods/ca/maps/ca15-domination/rules.yaml index 336f9f1184..eff9b73fdb 100644 --- a/mods/ca/maps/ca15-domination/rules.yaml +++ b/mods/ca/maps/ca15-domination/rules.yaml @@ -26,36 +26,6 @@ Player: PowerManager: AdviceInterval: 240000 -^TDPalette: - RenderSprites: - PlayerPalette: playertdunit - -^Infantry: - RenderSprites: - PlayerPalette: playertdunit - WithDeathAnimation: - DeathSequencePalette: playertdunit - -^BuildingTD: - RenderSprites: - PlayerPalette: playertd - -^DefenseTD: - RenderSprites: - PlayerPalette: playertd - -SAPC: - RenderSprites: - PlayerPalette: playerraunit - -HARV.TD: - RenderSprites: - PlayerPalette: playertd - -AMCV: - RenderSprites: - PlayerPalette: playertd - TMPL: -NukePower@Cluster: @@ -141,20 +111,12 @@ N5: RMBC: Inherits@DECRYPT: ^DecryptableCyborg - RenderSprites: - PlayerPalette: playertd - WithDeathAnimation: - DeathSequencePalette: playertd DamageMultiplier@MCBUFF: Modifier: 75 RequiresCondition: mindcontrolled ENLI: Inherits@DECRYPT: ^DecryptableCyborg - RenderSprites: - PlayerPalette: playertd - WithDeathAnimation: - DeathSequencePalette: playertd DamageMultiplier@MCBUFF: Modifier: 70 RequiresCondition: mindcontrolled diff --git a/mods/ca/maps/ca16-proliferation/map.yaml b/mods/ca/maps/ca16-proliferation/map.yaml index 4061b093dc..6cd89a6de4 100644 --- a/mods/ca/maps/ca16-proliferation/map.yaml +++ b/mods/ca/maps/ca16-proliferation/map.yaml @@ -2250,6 +2250,6 @@ Actors: Owner: Neutral Location: 68,1 -Rules: ca|rules/campaign-rules.yaml, ca|rules/campaign-tooltips.yaml, ca|rules/campaign-palettes.yaml, rules.yaml +Rules: ca|rules/custom/campaign-rules.yaml, ca|rules/custom/campaign-tooltips.yaml, ca|rules/custom/two-tone-nod.yaml, rules.yaml -Weapons: ca|weapons/campaign.yaml +Weapons: ca|weapons/custom/campaign.yaml diff --git a/mods/ca/maps/ca16-proliferation/rules.yaml b/mods/ca/maps/ca16-proliferation/rules.yaml index e2e052f817..ffa425d648 100644 --- a/mods/ca/maps/ca16-proliferation/rules.yaml +++ b/mods/ca/maps/ca16-proliferation/rules.yaml @@ -31,48 +31,6 @@ Player: DefaultCash: 0 -ResourceStorageWarning: -^TDPalette: - RenderSprites: - PlayerPalette: playertdunit - -^Infantry: - RenderSprites: - PlayerPalette: playertdunit - WithDeathAnimation: - DeathSequencePalette: playertdunit - -^BuildingTD: - RenderSprites: - PlayerPalette: playertd - -^DefenseTD: - RenderSprites: - PlayerPalette: playertd - -SAPC: - RenderSprites: - PlayerPalette: playerraunit - -HARV.TD: - RenderSprites: - PlayerPalette: playertd - -AMCV: - RenderSprites: - PlayerPalette: playertd - -RMBC: - RenderSprites: - PlayerPalette: playertd - WithDeathAnimation: - DeathSequencePalette: playertd - -ENLI: - RenderSprites: - PlayerPalette: playertd - WithDeathAnimation: - DeathSequencePalette: playertd - PROC.SCRIN: StoresResources: Capacity: 2000000 diff --git a/mods/ca/maps/ca17-encroachment/map.yaml b/mods/ca/maps/ca17-encroachment/map.yaml index 7eff89b704..bbee82c2e3 100644 --- a/mods/ca/maps/ca17-encroachment/map.yaml +++ b/mods/ca/maps/ca17-encroachment/map.yaml @@ -3256,6 +3256,6 @@ Actors: Owner: Neutral Location: 31,54 -Rules: ca|rules/campaign-rules.yaml, ca|rules/campaign-tooltips.yaml, ca|rules/campaign-palettes.yaml, rules.yaml +Rules: ca|rules/custom/campaign-rules.yaml, ca|rules/custom/campaign-tooltips.yaml, ca|rules/custom/two-tone-nod.yaml, rules.yaml -Weapons: ca|weapons/campaign.yaml, weapons.yaml +Weapons: ca|weapons/custom/campaign.yaml, weapons.yaml diff --git a/mods/ca/maps/ca17-encroachment/rules.yaml b/mods/ca/maps/ca17-encroachment/rules.yaml index fb9d9e0009..101c1fa990 100644 --- a/mods/ca/maps/ca17-encroachment/rules.yaml +++ b/mods/ca/maps/ca17-encroachment/rules.yaml @@ -66,36 +66,6 @@ Player: TargetMetric: Value CheckRadius: 2c0 -^TDPalette: - RenderSprites: - PlayerPalette: playertdunit - -^Infantry: - RenderSprites: - PlayerPalette: playertdunit - WithDeathAnimation: - DeathSequencePalette: playertdunit - -^BuildingTD: - RenderSprites: - PlayerPalette: playertd - -^DefenseTD: - RenderSprites: - PlayerPalette: playertd - -SAPC: - RenderSprites: - PlayerPalette: playerraunit - -HARV.TD: - RenderSprites: - PlayerPalette: playertd - -AMCV: - RenderSprites: - PlayerPalette: playertd - TPOD: Buildable: Prerequisites: techcenter, ~vehicles.scrin diff --git a/mods/ca/maps/ca18-incapacitation/map.yaml b/mods/ca/maps/ca18-incapacitation/map.yaml index 2d03fa56d9..1386bc52fc 100644 --- a/mods/ca/maps/ca18-incapacitation/map.yaml +++ b/mods/ca/maps/ca18-incapacitation/map.yaml @@ -3777,6 +3777,6 @@ Actors: Owner: Neutral Location: 64,14 -Rules: ca|rules/campaign-rules.yaml, ca|rules/campaign-tooltips.yaml, ca|rules/campaign-palettes.yaml, rules.yaml +Rules: ca|rules/custom/campaign-rules.yaml, ca|rules/custom/campaign-tooltips.yaml, ca|rules/custom/two-tone-nod.yaml, rules.yaml -Weapons: ca|weapons/campaign.yaml, weapons.yaml +Weapons: ca|weapons/custom/campaign.yaml, weapons.yaml diff --git a/mods/ca/maps/ca18-incapacitation/rules.yaml b/mods/ca/maps/ca18-incapacitation/rules.yaml index fda883dd2e..dfe30067b5 100644 --- a/mods/ca/maps/ca18-incapacitation/rules.yaml +++ b/mods/ca/maps/ca18-incapacitation/rules.yaml @@ -38,36 +38,6 @@ Player: PlayerResources: DefaultCash: 0 -^TDPalette: - RenderSprites: - PlayerPalette: playertdunit - -^Infantry: - RenderSprites: - PlayerPalette: playertdunit - WithDeathAnimation: - DeathSequencePalette: playertdunit - -^BuildingTD: - RenderSprites: - PlayerPalette: playertd - -^DefenseTD: - RenderSprites: - PlayerPalette: playertd - -SAPC: - RenderSprites: - PlayerPalette: playerraunit - -HARV.TD: - RenderSprites: - PlayerPalette: playertd - -AMCV: - RenderSprites: - PlayerPalette: playertd - ^GroundedAircraft: ExternalCondition@GROUNDED: Condition: grounded diff --git a/mods/ca/maps/ca19-decimation/map.yaml b/mods/ca/maps/ca19-decimation/map.yaml index 3b2dc33f18..0317ae4c35 100644 --- a/mods/ca/maps/ca19-decimation/map.yaml +++ b/mods/ca/maps/ca19-decimation/map.yaml @@ -4426,6 +4426,6 @@ Actors: Owner: Neutral Location: 3,50 -Rules: ca|rules/campaign-rules.yaml, ca|rules/campaign-tooltips.yaml, ca|rules/campaign-palettes.yaml, rules.yaml, fall.yaml +Rules: ca|rules/custom/campaign-rules.yaml, ca|rules/custom/campaign-tooltips.yaml, ca|rules/custom/two-tone-nod.yaml, rules.yaml, fall.yaml -Weapons: ca|weapons/campaign.yaml +Weapons: ca|weapons/custom/campaign.yaml diff --git a/mods/ca/maps/ca19-decimation/rules.yaml b/mods/ca/maps/ca19-decimation/rules.yaml index e6892fde78..f18882cbb8 100644 --- a/mods/ca/maps/ca19-decimation/rules.yaml +++ b/mods/ca/maps/ca19-decimation/rules.yaml @@ -75,36 +75,6 @@ Player: TargetMetric: Value CheckRadius: 2c0 -^TDPalette: - RenderSprites: - PlayerPalette: playertdunit - -^Infantry: - RenderSprites: - PlayerPalette: playertdunit - WithDeathAnimation: - DeathSequencePalette: playertdunit - -^BuildingTD: - RenderSprites: - PlayerPalette: playertd - -^DefenseTD: - RenderSprites: - PlayerPalette: playertd - -SAPC: - RenderSprites: - PlayerPalette: playerraunit - -HARV.TD: - RenderSprites: - PlayerPalette: playertd - -AMCV: - RenderSprites: - PlayerPalette: playertd - INTL.Loaded: Inherits: INTL RenderSprites: diff --git a/mods/ca/maps/ca20-subjugation/map.yaml b/mods/ca/maps/ca20-subjugation/map.yaml index 6b026d23d2..d3fc316e2f 100644 --- a/mods/ca/maps/ca20-subjugation/map.yaml +++ b/mods/ca/maps/ca20-subjugation/map.yaml @@ -3515,6 +3515,6 @@ Actors: Owner: USSR Location: 54,57 -Rules: ca|rules/campaign-rules.yaml, ca|rules/campaign-tooltips.yaml, ca|rules/campaign-palettes.yaml, rules.yaml +Rules: ca|rules/custom/campaign-rules.yaml, ca|rules/custom/campaign-tooltips.yaml, ca|rules/custom/two-tone-nod.yaml, rules.yaml -Weapons: ca|weapons/campaign.yaml, weapons.yaml +Weapons: ca|weapons/custom/campaign.yaml, weapons.yaml diff --git a/mods/ca/maps/ca20-subjugation/rules.yaml b/mods/ca/maps/ca20-subjugation/rules.yaml index 9b82655f8a..81c67e58c2 100644 --- a/mods/ca/maps/ca20-subjugation/rules.yaml +++ b/mods/ca/maps/ca20-subjugation/rules.yaml @@ -38,36 +38,6 @@ Player: PlayerResources: DefaultCash: 0 -^TDPalette: - RenderSprites: - PlayerPalette: playertdunit - -^Infantry: - RenderSprites: - PlayerPalette: playertdunit - WithDeathAnimation: - DeathSequencePalette: playertdunit - -^BuildingTD: - RenderSprites: - PlayerPalette: playertd - -^DefenseTD: - RenderSprites: - PlayerPalette: playertd - -SAPC: - RenderSprites: - PlayerPalette: playerraunit - -HARV.TD: - RenderSprites: - PlayerPalette: playertd - -AMCV: - RenderSprites: - PlayerPalette: playertd - ^Bridge: Health: HP: 250000 diff --git a/mods/ca/maps/ca21-enmity/map.yaml b/mods/ca/maps/ca21-enmity/map.yaml index eead5fedd0..403af2681a 100644 --- a/mods/ca/maps/ca21-enmity/map.yaml +++ b/mods/ca/maps/ca21-enmity/map.yaml @@ -2703,6 +2703,6 @@ Actors: Facing: 0 Location: 37,92 -Rules: ca|rules/campaign-rules.yaml, ca|rules/campaign-tooltips.yaml, ca|rules/campaign-palettes.yaml, rules.yaml +Rules: ca|rules/custom/campaign-rules.yaml, ca|rules/custom/campaign-tooltips.yaml, ca|rules/custom/two-tone-nod.yaml, rules.yaml -Weapons: ca|weapons/campaign.yaml +Weapons: ca|weapons/custom/campaign.yaml diff --git a/mods/ca/maps/ca21-enmity/rules.yaml b/mods/ca/maps/ca21-enmity/rules.yaml index 583bcf2a9c..2d40361ea3 100644 --- a/mods/ca/maps/ca21-enmity/rules.yaml +++ b/mods/ca/maps/ca21-enmity/rules.yaml @@ -35,36 +35,6 @@ Player: TargetMetric: Value CheckRadius: 5c0 -^TDPalette: - RenderSprites: - PlayerPalette: playertdunit - -^Infantry: - RenderSprites: - PlayerPalette: playertdunit - WithDeathAnimation: - DeathSequencePalette: playertdunit - -^BuildingTD: - RenderSprites: - PlayerPalette: playertd - -^DefenseTD: - RenderSprites: - PlayerPalette: playertd - -SAPC: - RenderSprites: - PlayerPalette: playerraunit - -HARV.TD: - RenderSprites: - PlayerPalette: playertd - -AMCV: - RenderSprites: - PlayerPalette: playertd - recondronedetection: AlwaysVisible: Interactable: diff --git a/mods/ca/maps/ca22-capitulation/map.yaml b/mods/ca/maps/ca22-capitulation/map.yaml index 89b227f160..44f376dac5 100644 --- a/mods/ca/maps/ca22-capitulation/map.yaml +++ b/mods/ca/maps/ca22-capitulation/map.yaml @@ -3825,6 +3825,6 @@ Actors: Owner: Neutral Location: 13,96 -Rules: ca|rules/campaign-rules.yaml, ca|rules/campaign-tooltips.yaml, ca|rules/campaign-palettes.yaml, rules.yaml +Rules: ca|rules/custom/campaign-rules.yaml, ca|rules/custom/campaign-tooltips.yaml, ca|rules/custom/two-tone-nod.yaml, rules.yaml -Weapons: ca|weapons/campaign.yaml, weapons.yaml +Weapons: ca|weapons/custom/campaign.yaml, weapons.yaml diff --git a/mods/ca/maps/ca22-capitulation/rules.yaml b/mods/ca/maps/ca22-capitulation/rules.yaml index 21c2e3802c..2834481425 100644 --- a/mods/ca/maps/ca22-capitulation/rules.yaml +++ b/mods/ca/maps/ca22-capitulation/rules.yaml @@ -71,36 +71,6 @@ Player: TargetMetric: None CheckRadius: 8c0 -^TDPalette: - RenderSprites: - PlayerPalette: playertdunit - -^Infantry: - RenderSprites: - PlayerPalette: playertdunit - WithDeathAnimation: - DeathSequencePalette: playertdunit - -^BuildingTD: - RenderSprites: - PlayerPalette: playertd - -^DefenseTD: - RenderSprites: - PlayerPalette: playertd - -SAPC: - RenderSprites: - PlayerPalette: playerraunit - -HARV.TD: - RenderSprites: - PlayerPalette: playertd - -AMCV: - RenderSprites: - PlayerPalette: playertd - EYE: Inherits@CAMPAIGNDISABLED: ^Disabled diff --git a/mods/ca/maps/ca23-emancipation/map.yaml b/mods/ca/maps/ca23-emancipation/map.yaml index ccd07156dd..560dc64a57 100644 --- a/mods/ca/maps/ca23-emancipation/map.yaml +++ b/mods/ca/maps/ca23-emancipation/map.yaml @@ -3696,6 +3696,6 @@ Actors: Facing: 634 Location: 76,91 -Rules: ca|rules/campaign-rules.yaml, ca|rules/campaign-tooltips.yaml, ca|rules/campaign-palettes.yaml, rules.yaml +Rules: ca|rules/custom/campaign-rules.yaml, ca|rules/custom/campaign-tooltips.yaml, ca|rules/custom/two-tone-nod.yaml, rules.yaml -Weapons: ca|weapons/campaign.yaml, weapons.yaml +Weapons: ca|weapons/custom/campaign.yaml, weapons.yaml diff --git a/mods/ca/maps/ca23-emancipation/rules.yaml b/mods/ca/maps/ca23-emancipation/rules.yaml index 38da48f32b..079d05374c 100644 --- a/mods/ca/maps/ca23-emancipation/rules.yaml +++ b/mods/ca/maps/ca23-emancipation/rules.yaml @@ -26,32 +26,6 @@ Player: PlayerResources: DefaultCash: 0 -^TDPalette: - RenderSprites: - PlayerPalette: playertdunit - -^Infantry: - RenderSprites: - PlayerPalette: playertdunit - WithDeathAnimation: - DeathSequencePalette: playertdunit - -^BuildingTD: - RenderSprites: - PlayerPalette: playertd - -^DefenseTD: - RenderSprites: - PlayerPalette: playertd - -SAPC: - RenderSprites: - PlayerPalette: playerraunit - -HARV.TD: - RenderSprites: - PlayerPalette: playertd - amcv.enabled: AlwaysVisible: Interactable: @@ -59,8 +33,6 @@ amcv.enabled: ProvidesPrerequisite: AMCV: - RenderSprites: - PlayerPalette: playertd Buildable: Prerequisites: vehicles.mcv, ~amcv.enabled, ~vehicles.td diff --git a/mods/ca/maps/ca24-duality/map.yaml b/mods/ca/maps/ca24-duality/map.yaml index c1dc64337e..6e11adc626 100644 --- a/mods/ca/maps/ca24-duality/map.yaml +++ b/mods/ca/maps/ca24-duality/map.yaml @@ -4796,6 +4796,6 @@ Actors: Owner: Neutral Location: 7,4 -Rules: ca|rules/campaign-rules.yaml, ca|rules/campaign-tooltips.yaml, ca|rules/campaign-palettes.yaml, ca|maps/scrinfestation/scrinfestation-rules-base.yaml, rules.yaml +Rules: ca|rules/custom/campaign-rules.yaml, ca|rules/custom/campaign-tooltips.yaml, ca|rules/custom/two-tone-nod.yaml, ca|rules/custom/scrinfestation-base.yaml, rules.yaml -Weapons: ca|weapons/campaign.yaml, ca|maps/scrinfestation/scrinfestation-weapons.yaml, weapons.yaml +Weapons: ca|weapons/custom/campaign.yaml, ca|weapons/custom/scrinfestation.yaml, weapons.yaml diff --git a/mods/ca/maps/ca24-duality/rules.yaml b/mods/ca/maps/ca24-duality/rules.yaml index 0b9cd5865a..0ebefa3c5c 100644 --- a/mods/ca/maps/ca24-duality/rules.yaml +++ b/mods/ca/maps/ca24-duality/rules.yaml @@ -24,36 +24,6 @@ Player: PlayerResources: DefaultCash: 0 -^TDPalette: - RenderSprites: - PlayerPalette: playertdunit - -^Infantry: - RenderSprites: - PlayerPalette: playertdunit - WithDeathAnimation: - DeathSequencePalette: playertdunit - -^BuildingTD: - RenderSprites: - PlayerPalette: playertd - -^DefenseTD: - RenderSprites: - PlayerPalette: playertd - -SAPC: - RenderSprites: - PlayerPalette: playerraunit - -HARV.TD: - RenderSprites: - PlayerPalette: playertd - -AMCV: - RenderSprites: - PlayerPalette: playertd - SILO.SCRIN: -SpawnActorOnDeath: diff --git a/mods/ca/maps/ca25-singularity/map.yaml b/mods/ca/maps/ca25-singularity/map.yaml index 19cf87b40d..014423dec5 100644 --- a/mods/ca/maps/ca25-singularity/map.yaml +++ b/mods/ca/maps/ca25-singularity/map.yaml @@ -5294,8 +5294,8 @@ Actors: Owner: Scrin Location: 80,29 -Rules: ca|rules/campaign-rules.yaml, ca|rules/campaign-tooltips.yaml, ca|rules/campaign-palettes.yaml, rules.yaml +Rules: ca|rules/custom/campaign-rules.yaml, ca|rules/custom/campaign-tooltips.yaml, ca|rules/custom/two-tone-nod.yaml, rules.yaml Sequences: sequences.yaml -Weapons: ca|weapons/campaign.yaml, weapons.yaml +Weapons: ca|weapons/custom/campaign.yaml, weapons.yaml diff --git a/mods/ca/maps/ca25-singularity/rules.yaml b/mods/ca/maps/ca25-singularity/rules.yaml index f14e104f08..e9e2a08494 100644 --- a/mods/ca/maps/ca25-singularity/rules.yaml +++ b/mods/ca/maps/ca25-singularity/rules.yaml @@ -84,36 +84,6 @@ Player: TargetMetric: Value CheckRadius: 7c0 -^TDPalette: - RenderSprites: - PlayerPalette: playertdunit - -^Infantry: - RenderSprites: - PlayerPalette: playertdunit - WithDeathAnimation: - DeathSequencePalette: playertdunit - -^BuildingTD: - RenderSprites: - PlayerPalette: playertd - -^DefenseTD: - RenderSprites: - PlayerPalette: playertd - -SAPC: - RenderSprites: - PlayerPalette: playerraunit - -HARV.TD: - RenderSprites: - PlayerPalette: playertd - -AMCV: - RenderSprites: - PlayerPalette: playertd - ^AiExtraPower: PowerMultiplier@EXTRAPOWER: Modifier: 200 @@ -301,10 +271,6 @@ mothership.shields: Condition: kane-revealed ExternalCondition@PROVOKED: Condition: provoked - RenderSprites: - PlayerPalette: playertd - WithDeathAnimation: - DeathSequencePalette: playertd AttackFrontal: PauseOnCondition: !kane-revealed && bluebuff && !provoked diff --git a/mods/ca/maps/ca26-foothold/map.yaml b/mods/ca/maps/ca26-foothold/map.yaml index bcabde97eb..085eb7fa93 100644 --- a/mods/ca/maps/ca26-foothold/map.yaml +++ b/mods/ca/maps/ca26-foothold/map.yaml @@ -1873,8 +1873,8 @@ Actors: Owner: Scrin Location: 75,53 -Rules: ca|rules/campaign-rules.yaml, ca|rules/campaign-tooltips.yaml, ca|rules/campaign-palettes.yaml, rules.yaml +Rules: ca|rules/custom/campaign-rules.yaml, ca|rules/custom/campaign-tooltips.yaml, ca|rules/custom/two-tone-nod.yaml, rules.yaml Sequences: sequences.yaml -Weapons: ca|weapons/campaign.yaml +Weapons: ca|weapons/custom/campaign.yaml diff --git a/mods/ca/maps/ca27-convergence/map.yaml b/mods/ca/maps/ca27-convergence/map.yaml index 9098898c34..05c9035894 100644 --- a/mods/ca/maps/ca27-convergence/map.yaml +++ b/mods/ca/maps/ca27-convergence/map.yaml @@ -1721,6 +1721,6 @@ Actors: Location: 19,74 Facing: 174 -Rules: ca|rules/campaign-rules.yaml, ca|rules/campaign-tooltips.yaml, ca|rules/campaign-palettes.yaml, rules.yaml +Rules: ca|rules/custom/campaign-rules.yaml, ca|rules/custom/campaign-tooltips.yaml, ca|rules/custom/two-tone-nod.yaml, rules.yaml -Weapons: ca|weapons/campaign.yaml +Weapons: ca|weapons/custom/campaign.yaml diff --git a/mods/ca/maps/ca28-illumination/map.yaml b/mods/ca/maps/ca28-illumination/map.yaml index 2dd4d5f4c8..4e49d7b1fa 100644 --- a/mods/ca/maps/ca28-illumination/map.yaml +++ b/mods/ca/maps/ca28-illumination/map.yaml @@ -645,11 +645,11 @@ Actors: Location: 92,48 Facing: 745 -Rules: ca|rules/campaign-rules.yaml, ca|rules/campaign-tooltips.yaml, ca|rules/campaign-palettes.yaml, rules.yaml +Rules: ca|rules/custom/campaign-rules.yaml, ca|rules/custom/campaign-tooltips.yaml, ca|rules/custom/two-tone-nod.yaml, rules.yaml Sequences: sequences.yaml -Weapons: ca|weapons/campaign.yaml +Weapons: ca|weapons/custom/campaign.yaml Voices: voices.yaml diff --git a/mods/ca/maps/ca29-purification/map.yaml b/mods/ca/maps/ca29-purification/map.yaml index 906b1c4152..412aa4cfc2 100644 --- a/mods/ca/maps/ca29-purification/map.yaml +++ b/mods/ca/maps/ca29-purification/map.yaml @@ -2017,10 +2017,10 @@ Actors: Owner: Scrin Location: 116,39 -Rules: ca|rules/campaign-rules.yaml, ca|rules/campaign-tooltips.yaml, ca|rules/campaign-palettes.yaml, rules.yaml +Rules: ca|rules/custom/campaign-rules.yaml, ca|rules/custom/campaign-tooltips.yaml, ca|rules/custom/two-tone-nod.yaml, rules.yaml Sequences: sequences.yaml -Weapons: ca|weapons/campaign.yaml +Weapons: ca|weapons/custom/campaign.yaml Notifications: ca|rules/custom/force-cabal-eva.yaml diff --git a/mods/ca/maps/ca29-purification/rules.yaml b/mods/ca/maps/ca29-purification/rules.yaml index 810411e27b..76a2aa622c 100644 --- a/mods/ca/maps/ca29-purification/rules.yaml +++ b/mods/ca/maps/ca29-purification/rules.yaml @@ -88,54 +88,6 @@ Player: TargetMetric: Value CheckRadius: 7c0 -^TDPalette: - RenderSprites: - PlayerPalette: playertdunit - -^Infantry: - RenderSprites: - PlayerPalette: playertdunit - WithDeathAnimation: - DeathSequencePalette: playertdunit - -SHAD: - RenderSprites: - PlayerPalette: playertd - WithDeathAnimation: - DeathSequencePalette: playertd - -RMBC: - RenderSprites: - PlayerPalette: playertd - WithDeathAnimation: - DeathSequencePalette: playertd - -ENLI: - RenderSprites: - PlayerPalette: playertd - WithDeathAnimation: - DeathSequencePalette: playertd - -^BuildingTD: - RenderSprites: - PlayerPalette: playertd - -^DefenseTD: - RenderSprites: - PlayerPalette: playertd - -SAPC: - RenderSprites: - PlayerPalette: playerraunit - -HARV.TD: - RenderSprites: - PlayerPalette: playertd - -AMCV: - RenderSprites: - PlayerPalette: playertd - LTNK: Buildable: Prerequisites: ~vehicles.nod diff --git a/mods/ca/maps/ca30-reckoning/map.yaml b/mods/ca/maps/ca30-reckoning/map.yaml index 0a01348545..1110168587 100644 --- a/mods/ca/maps/ca30-reckoning/map.yaml +++ b/mods/ca/maps/ca30-reckoning/map.yaml @@ -3095,10 +3095,10 @@ Actors: Owner: Neutral Location: 61,41 -Rules: ca|rules/campaign-rules.yaml, ca|rules/campaign-tooltips.yaml, ca|rules/campaign-palettes.yaml, rules.yaml +Rules: ca|rules/custom/campaign-rules.yaml, ca|rules/custom/campaign-tooltips.yaml, ca|rules/custom/two-tone-nod.yaml, rules.yaml Sequences: sequences.yaml -Weapons: ca|weapons/campaign.yaml, weapons.yaml +Weapons: ca|weapons/custom/campaign.yaml, weapons.yaml Notifications: ca|rules/custom/force-cabal-eva.yaml diff --git a/mods/ca/maps/ca30-reckoning/rules.yaml b/mods/ca/maps/ca30-reckoning/rules.yaml index 627398e492..cc2efe56ec 100644 --- a/mods/ca/maps/ca30-reckoning/rules.yaml +++ b/mods/ca/maps/ca30-reckoning/rules.yaml @@ -90,56 +90,10 @@ Player: TargetMetric: Value CheckRadius: 7c0 -^TDPalette: - RenderSprites: - PlayerPalette: playertdunit - ^Infantry: - RenderSprites: - PlayerPalette: playertdunit - WithDeathAnimation: - DeathSequencePalette: playertdunit DamagedByTerrain@TIBDAMAGE: Terrain: Tiberium -SHAD: - RenderSprites: - PlayerPalette: playertd - WithDeathAnimation: - DeathSequencePalette: playertd - -RMBC: - RenderSprites: - PlayerPalette: playertd - WithDeathAnimation: - DeathSequencePalette: playertd - -ENLI: - RenderSprites: - PlayerPalette: playertd - WithDeathAnimation: - DeathSequencePalette: playertd - -^BuildingTD: - RenderSprites: - PlayerPalette: playertd - -^DefenseTD: - RenderSprites: - PlayerPalette: playertd - -SAPC: - RenderSprites: - PlayerPalette: playerraunit - -HARV.TD: - RenderSprites: - PlayerPalette: playertd - -AMCV: - RenderSprites: - PlayerPalette: playertd - HQ: -ProduceActorPowerCA@hackercell: -ProduceActorPowerCA@hackercellAI: diff --git a/mods/ca/maps/containment-coop/map.yaml b/mods/ca/maps/containment-coop/map.yaml index b4f46ce879..16acc6c3ce 100644 --- a/mods/ca/maps/containment-coop/map.yaml +++ b/mods/ca/maps/containment-coop/map.yaml @@ -3481,8 +3481,8 @@ Actors: Owner: Neutral Location: 99,10 -Rules: ca|rules/campaign-rules.yaml, ca|rules/campaign-tooltips.yaml, ca|rules/campaign-palettes.yaml, ca|maps/ca04-containment/rules.yaml, rules.yaml +Rules: ca|rules/custom/campaign-rules.yaml, ca|rules/custom/campaign-tooltips.yaml, ca|rules/custom/two-tone-nod.yaml, ca|maps/ca04-containment/rules.yaml, rules.yaml Sequences: ca|maps/ca04-containment/sequences.yaml -Weapons: ca|weapons/campaign.yaml, ca|maps/ca04-containment/weapons.yaml +Weapons: ca|weapons/custom/campaign.yaml, ca|maps/ca04-containment/weapons.yaml diff --git a/mods/ca/maps/duality-coop/map.yaml b/mods/ca/maps/duality-coop/map.yaml index d049ce7e0f..8b75f61202 100644 --- a/mods/ca/maps/duality-coop/map.yaml +++ b/mods/ca/maps/duality-coop/map.yaml @@ -4794,6 +4794,6 @@ Actors: Owner: Neutral Location: 93,8 -Rules: ca|rules/campaign-rules.yaml, ca|rules/campaign-tooltips.yaml, ca|rules/campaign-palettes.yaml, ca|maps/scrinfestation/scrinfestation-rules-base.yaml, ca|maps/ca24-duality/rules.yaml, rules.yaml +Rules: ca|rules/custom/campaign-rules.yaml, ca|rules/custom/campaign-tooltips.yaml, ca|rules/custom/two-tone-nod.yaml, ca|rules/custom/scrinfestation-base.yaml, ca|maps/ca24-duality/rules.yaml, rules.yaml -Weapons: ca|maps/scrinfestation/scrinfestation-weapons.yaml, ca|maps/ca24-duality/weapons.yaml +Weapons: ca|weapons/custom/scrinfestation.yaml, ca|maps/ca24-duality/weapons.yaml diff --git a/mods/ca/maps/mastermind-madness/map.yaml b/mods/ca/maps/mastermind-madness/map.yaml index 28edaa077f..0cb3263626 100644 --- a/mods/ca/maps/mastermind-madness/map.yaml +++ b/mods/ca/maps/mastermind-madness/map.yaml @@ -1386,6 +1386,6 @@ Actors: Location: 26,35 SubCell: 3 -Rules: mastermind-madness-rules.yaml +Rules: ca|rules/custom/mastermind-madness.yaml -Weapons: mastermind-madness-weapons.yaml +Weapons: ca|weapons/custom/mastermind-madness.yaml diff --git a/mods/ca/maps/mega-mastermind-madness/map.yaml b/mods/ca/maps/mega-mastermind-madness/map.yaml index 6f94fdc45c..4c128f44e2 100644 --- a/mods/ca/maps/mega-mastermind-madness/map.yaml +++ b/mods/ca/maps/mega-mastermind-madness/map.yaml @@ -2319,6 +2319,6 @@ Actors: Location: 43,27 SubCell: 3 -Rules: ca|maps/mastermind-madness/mastermind-madness-rules.yaml +Rules: ca|rules/custom/mastermind-madness.yaml -Weapons: ca|maps/mastermind-madness/mastermind-madness-weapons.yaml +Weapons: ca|weapons/custom/mastermind-madness.yaml diff --git a/mods/ca/maps/scrinfestation/map.yaml b/mods/ca/maps/scrinfestation/map.yaml index 676e755fcc..831ab90876 100644 --- a/mods/ca/maps/scrinfestation/map.yaml +++ b/mods/ca/maps/scrinfestation/map.yaml @@ -5762,6 +5762,6 @@ Actors: Owner: Neutral Location: 15,17 -Rules: scrinfestation-rules-base.yaml, scrinfestation-rules.yaml +Rules: ca|rules/custom/scrinfestation-base.yaml, ca|rules/custom/scrinfestation-minigame.yaml -Weapons: scrinfestation-weapons.yaml +Weapons: ca|weapons/custom/scrinfestation.yaml diff --git a/mods/ca/maps/shellmap/map.yaml b/mods/ca/maps/shellmap/map.yaml index 0a530960a8..422fcda864 100644 --- a/mods/ca/maps/shellmap/map.yaml +++ b/mods/ca/maps/shellmap/map.yaml @@ -5795,6 +5795,6 @@ Actors: Owner: Scrin Location: 180,88 -Rules: ca|rules/campaign-rules.yaml, ca|rules/custom/two-tone-nod.yaml, rules.yaml +Rules: ca|rules/custom/campaign-rules.yaml, ca|rules/custom/two-tone-nod.yaml, rules.yaml Weapons: weapons.yaml diff --git a/mods/ca/maps/shellmap/rules.yaml b/mods/ca/maps/shellmap/rules.yaml index b45a11a8ee..5ecfcae5ef 100644 --- a/mods/ca/maps/shellmap/rules.yaml +++ b/mods/ca/maps/shellmap/rules.yaml @@ -186,10 +186,6 @@ STNK.Nod: RAH: -WithColoredSelectionBox@INVIS: -TRAN.Evac: - RenderSprites: - PlayerPalette: player-twotonenod - # defense buffs BRIK: diff --git a/mods/ca/maps/team-mastermind-madness/map.yaml b/mods/ca/maps/team-mastermind-madness/map.yaml index e2428f6077..dfafd49069 100644 --- a/mods/ca/maps/team-mastermind-madness/map.yaml +++ b/mods/ca/maps/team-mastermind-madness/map.yaml @@ -2368,6 +2368,6 @@ Actors: Owner: Neutral Location: 70,68 -Rules: ca|maps/mastermind-madness/mastermind-madness-rules.yaml, rules.yaml +Rules: ca|rules/custom/mastermind-madness.yaml, rules.yaml -Weapons: ca|maps/mastermind-madness/mastermind-madness-weapons.yaml +Weapons: ca|weapons/custom/mastermind-madness.yaml diff --git a/mods/ca/maps/team-scrinfestation/map.yaml b/mods/ca/maps/team-scrinfestation/map.yaml index 52915d8876..d2122d4947 100644 --- a/mods/ca/maps/team-scrinfestation/map.yaml +++ b/mods/ca/maps/team-scrinfestation/map.yaml @@ -11532,6 +11532,6 @@ Actors: Owner: Neutral Location: 198,95 -Rules: ca|maps/scrinfestation/scrinfestation-rules-base.yaml, ca|maps/scrinfestation/scrinfestation-rules.yaml, rules.yaml +Rules: ca|rules/custom/scrinfestation-base.yaml, ca|rules/custom/scrinfestation-minigame.yaml, rules.yaml -Weapons: ca|maps/scrinfestation/scrinfestation-weapons.yaml +Weapons: ca|weapons/custom/scrinfestation.yaml diff --git a/mods/ca/rules/campaign-palettes.yaml b/mods/ca/rules/campaign-palettes.yaml deleted file mode 100644 index dac47390ea..0000000000 --- a/mods/ca/rules/campaign-palettes.yaml +++ /dev/null @@ -1,13 +0,0 @@ -^Palettes: - OverlayPlayerColorPalette@RAUNIT: - BasePalette: player - BaseName: playerraunit - RemapIndex: 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95 - PlayerColors: - Nod: E6E6FF - OverlayPlayerColorPalette@TDUNIT: - BasePalette: temptd - BaseName: playertdunit - RemapIndex: 176, 178, 180, 182, 184, 186, 189, 191, 177, 179, 181, 183, 185, 187, 188, 190 - PlayerColors: - Nod: E6E6FF diff --git a/mods/ca/rules/campaign-rules.yaml b/mods/ca/rules/custom/campaign-rules.yaml similarity index 99% rename from mods/ca/rules/campaign-rules.yaml rename to mods/ca/rules/custom/campaign-rules.yaml index 04948982ea..4a337898a3 100644 --- a/mods/ca/rules/campaign-rules.yaml +++ b/mods/ca/rules/custom/campaign-rules.yaml @@ -203,12 +203,11 @@ TRUK: Speed: 54 -SpawnActorOnDeath: -TRAN.Evac: +TRAN.evac: Inherits: TRAN -Buildable: RenderSprites: Image: tran - PlayerPalette: playerraunit DamageMultiplier@INVULN: Modifier: 0 -KillsSelf: diff --git a/mods/ca/rules/campaign-tooltips.yaml b/mods/ca/rules/custom/campaign-tooltips.yaml similarity index 100% rename from mods/ca/rules/campaign-tooltips.yaml rename to mods/ca/rules/custom/campaign-tooltips.yaml diff --git a/mods/ca/maps/mastermind-madness/mastermind-madness-rules.yaml b/mods/ca/rules/custom/mastermind-madness.yaml similarity index 99% rename from mods/ca/maps/mastermind-madness/mastermind-madness-rules.yaml rename to mods/ca/rules/custom/mastermind-madness.yaml index 3d3ab638f6..0193801e38 100644 --- a/mods/ca/maps/mastermind-madness/mastermind-madness-rules.yaml +++ b/mods/ca/rules/custom/mastermind-madness.yaml @@ -169,6 +169,8 @@ MAST: ColorSource: Player ContrastColorLight: 000000 ValidRelationships: Ally, Enemy, Neutral + MindController: + ExperienceFromControl: 0 RNDV: Inherits@1: ^1x1Shape diff --git a/mods/ca/maps/scrinfestation/scrinfestation-rules-base.yaml b/mods/ca/rules/custom/scrinfestation-base.yaml similarity index 100% rename from mods/ca/maps/scrinfestation/scrinfestation-rules-base.yaml rename to mods/ca/rules/custom/scrinfestation-base.yaml diff --git a/mods/ca/maps/scrinfestation/scrinfestation-rules.yaml b/mods/ca/rules/custom/scrinfestation-minigame.yaml similarity index 100% rename from mods/ca/maps/scrinfestation/scrinfestation-rules.yaml rename to mods/ca/rules/custom/scrinfestation-minigame.yaml diff --git a/mods/ca/weapons/campaign.yaml b/mods/ca/weapons/custom/campaign.yaml similarity index 100% rename from mods/ca/weapons/campaign.yaml rename to mods/ca/weapons/custom/campaign.yaml diff --git a/mods/ca/maps/mastermind-madness/mastermind-madness-weapons.yaml b/mods/ca/weapons/custom/mastermind-madness.yaml similarity index 100% rename from mods/ca/maps/mastermind-madness/mastermind-madness-weapons.yaml rename to mods/ca/weapons/custom/mastermind-madness.yaml diff --git a/mods/ca/maps/scrinfestation/scrinfestation-weapons.yaml b/mods/ca/weapons/custom/scrinfestation.yaml similarity index 100% rename from mods/ca/maps/scrinfestation/scrinfestation-weapons.yaml rename to mods/ca/weapons/custom/scrinfestation.yaml From 34fd0eab324206a74cfe59abcae541c0688734a8 Mon Sep 17 00:00:00 2001 From: darkademic <41052878+darkademic@users.noreply.github.com> Date: Sat, 9 Dec 2023 19:43:59 +0000 Subject: [PATCH 3/3] Lua spaces to tabs. --- .../composition-tester.lua | 592 ++++++------- .../composition-tournament.lua | 776 +++++++++--------- .../ca/maps/ca-prologue-03/ca-prologue-03.lua | 2 +- .../ca/maps/ca-prologue-04/ca-prologue-04.lua | 16 +- mods/ca/maps/ca08-salvation/ca08.lua | 8 +- mods/ca/maps/ca11-abasement/ca11.lua | 2 +- mods/ca/maps/ca12-treachery/ca12.lua | 2 +- mods/ca/maps/ca13-ironclad/ca13.lua | 4 +- mods/ca/maps/ca16-proliferation/ca16.lua | 4 +- mods/ca/maps/ca17-encroachment/ca17.lua | 4 +- mods/ca/maps/ca18-incapacitation/ca18.lua | 6 +- mods/ca/maps/ca19-decimation/ca19.lua | 4 +- mods/ca/maps/ca20-subjugation/ca20.lua | 4 +- mods/ca/maps/ca21-enmity/ca21.lua | 4 +- mods/ca/maps/ca22-capitulation/ca22.lua | 4 +- mods/ca/maps/ca23-emancipation/ca23.lua | 6 +- mods/ca/maps/ca24-duality/ca24.lua | 4 +- mods/ca/maps/ca25-singularity/ca25.lua | 4 +- mods/ca/maps/ca26-foothold/ca26.lua | 64 +- mods/ca/maps/ca27-convergence/ca27.lua | 224 ++--- mods/ca/maps/ca28-illumination/ca28.lua | 614 +++++++------- mods/ca/maps/ca29-purification/ca29.lua | 462 +++++------ mods/ca/maps/duality-coop/duality-coop.lua | 4 +- .../ca/maps/scrinfestation/scrinfestation.lua | 64 +- mods/ca/maps/shellmap/shellmap.lua | 70 +- .../team-scrinfestation.lua | 44 +- mods/ca/maps/tfca/tfca.lua | 578 ++++++------- 27 files changed, 1785 insertions(+), 1785 deletions(-) diff --git a/mods/ca/maps/ca-composition-tester/composition-tester.lua b/mods/ca/maps/ca-composition-tester/composition-tester.lua index 0077612daa..19ba166bda 100644 --- a/mods/ca/maps/ca-composition-tester/composition-tester.lua +++ b/mods/ca/maps/ca-composition-tester/composition-tester.lua @@ -7,340 +7,340 @@ WorldLoaded = function() Multi2 = Player.GetPlayer("Multi2") Multi3 = Player.GetPlayer("Multi3") - if Multi0 ~= nil then - StartingCash = Multi0.Cash - elseif Multi1 ~= nil then - StartingCash = Multi1.Cash - elseif Multi2 ~= nil then - StartingCash = Multi2.Cash - elseif Multi3 ~= nil then - StartingCash = Multi3.Cash - else - StartingCash = 20000 - end - - Trigger.OnEnteredFootprint({ ResetBottomWH.Location }, function(a, id) - Media.DisplayMessage("Resetting players 1/2...", "Notification", HSLColor.FromHex("FF0000")) - Reset({ Multi0, Multi1 }) - end) - - Trigger.OnEnteredFootprint({ SaveBottomWH.Location }, function(a, id) - Media.DisplayMessage("Player 1/2 compositions saved.", "Notification", HSLColor.FromHex("00FF00")) - Save({ Multi0, Multi1 }) - end) - - Trigger.OnEnteredFootprint({ RestoreBottomWH.Location }, function(a, id) - Media.DisplayMessage("Restoring player 1/2 compositions...", "Notification", HSLColor.FromHex("00FFFF")) - Restore({ Multi0, Multi1 }) - end) - - Trigger.OnEnteredFootprint({ Reset1WH.Location }, function(a, id) - Media.DisplayMessage("Resetting player 1...", "Notification", HSLColor.FromHex("FF0000")) - Reset({ Multi0 }) - end) - - Trigger.OnEnteredFootprint({ Save1WH.Location }, function(a, id) - Media.DisplayMessage("Player 1 composition saved.", "Notification", HSLColor.FromHex("00FF00")) - Save({ Multi0 }) - end) - - Trigger.OnEnteredFootprint({ Restore1WH.Location }, function(a, id) - Media.DisplayMessage("Restoring player 1 composition...", "Notification", HSLColor.FromHex("00FFFF")) - Restore({ Multi0 }) - end) - - Trigger.OnEnteredFootprint({ Reset2WH.Location }, function(a, id) - Media.DisplayMessage("Resetting player 2...", "Notification", HSLColor.FromHex("FF0000")) - Reset({ Multi1 }) - end) - - Trigger.OnEnteredFootprint({ Save2WH.Location }, function(a, id) - Media.DisplayMessage("Player 2 composition saved.", "Notification", HSLColor.FromHex("00FF00")) - Save({ Multi1 }) - end) - - Trigger.OnEnteredFootprint({ Restore2WH.Location }, function(a, id) - Media.DisplayMessage("Restoring player 2 composition...", "Notification", HSLColor.FromHex("00FFFF")) - Restore({ Multi1 }) - end) - - Trigger.OnEnteredFootprint({ ResetTopWH.Location }, function(a, id) - Media.DisplayMessage("Resetting players 3/4...", "Notification", HSLColor.FromHex("FF0000")) - Reset({ Multi2, Multi3 }) - end) - - Trigger.OnEnteredFootprint({ SaveTopWH.Location }, function(a, id) - Media.DisplayMessage("Player 3/4 compositions saved.", "Notification", HSLColor.FromHex("00FF00")) - Save({ MMulti2, Multi3 }) - end) - - Trigger.OnEnteredFootprint({ RestoreTopWH.Location }, function(a, id) - Media.DisplayMessage("Restoring player 3/4 compositions...", "Notification", HSLColor.FromHex("00FFFF")) - Restore({ Multi2, Multi3 }) - end) - - Trigger.OnEnteredFootprint({ Reset3WH.Location }, function(a, id) - Media.DisplayMessage("Resetting player 3...", "Notification", HSLColor.FromHex("FF0000")) - Reset({ Multi2 }) - end) - - Trigger.OnEnteredFootprint({ Save3WH.Location }, function(a, id) - Media.DisplayMessage("Player 3 composition saved.", "Notification", HSLColor.FromHex("00FF00")) - Save({ Multi2 }) - end) - - Trigger.OnEnteredFootprint({ Restore3WH.Location }, function(a, id) - Media.DisplayMessage("Restoring player 3 composition...", "Notification", HSLColor.FromHex("00FFFF")) - Restore({ Multi2 }) - end) - - Trigger.OnEnteredFootprint({ Reset4WH.Location }, function(a, id) - Media.DisplayMessage("Resetting player 4...", "Notification", HSLColor.FromHex("FF0000")) - Reset({ Multi3 }) - end) - - Trigger.OnEnteredFootprint({ Save4WH.Location }, function(a, id) - Media.DisplayMessage("Player 4 composition saved.", "Notification", HSLColor.FromHex("00FF00")) - Save({ Multi3 }) - end) - - Trigger.OnEnteredFootprint({ Restore4WH.Location }, function(a, id) - Media.DisplayMessage("Restoring player 4 composition...", "Notification", HSLColor.FromHex("00FFFF")) - Restore({ Multi3 }) - end) - - RestoreTrucks({ Multi0, Multi1, Multi2, Multi3 }) + if Multi0 ~= nil then + StartingCash = Multi0.Cash + elseif Multi1 ~= nil then + StartingCash = Multi1.Cash + elseif Multi2 ~= nil then + StartingCash = Multi2.Cash + elseif Multi3 ~= nil then + StartingCash = Multi3.Cash + else + StartingCash = 20000 + end + + Trigger.OnEnteredFootprint({ ResetBottomWH.Location }, function(a, id) + Media.DisplayMessage("Resetting players 1/2...", "Notification", HSLColor.FromHex("FF0000")) + Reset({ Multi0, Multi1 }) + end) + + Trigger.OnEnteredFootprint({ SaveBottomWH.Location }, function(a, id) + Media.DisplayMessage("Player 1/2 compositions saved.", "Notification", HSLColor.FromHex("00FF00")) + Save({ Multi0, Multi1 }) + end) + + Trigger.OnEnteredFootprint({ RestoreBottomWH.Location }, function(a, id) + Media.DisplayMessage("Restoring player 1/2 compositions...", "Notification", HSLColor.FromHex("00FFFF")) + Restore({ Multi0, Multi1 }) + end) + + Trigger.OnEnteredFootprint({ Reset1WH.Location }, function(a, id) + Media.DisplayMessage("Resetting player 1...", "Notification", HSLColor.FromHex("FF0000")) + Reset({ Multi0 }) + end) + + Trigger.OnEnteredFootprint({ Save1WH.Location }, function(a, id) + Media.DisplayMessage("Player 1 composition saved.", "Notification", HSLColor.FromHex("00FF00")) + Save({ Multi0 }) + end) + + Trigger.OnEnteredFootprint({ Restore1WH.Location }, function(a, id) + Media.DisplayMessage("Restoring player 1 composition...", "Notification", HSLColor.FromHex("00FFFF")) + Restore({ Multi0 }) + end) + + Trigger.OnEnteredFootprint({ Reset2WH.Location }, function(a, id) + Media.DisplayMessage("Resetting player 2...", "Notification", HSLColor.FromHex("FF0000")) + Reset({ Multi1 }) + end) + + Trigger.OnEnteredFootprint({ Save2WH.Location }, function(a, id) + Media.DisplayMessage("Player 2 composition saved.", "Notification", HSLColor.FromHex("00FF00")) + Save({ Multi1 }) + end) + + Trigger.OnEnteredFootprint({ Restore2WH.Location }, function(a, id) + Media.DisplayMessage("Restoring player 2 composition...", "Notification", HSLColor.FromHex("00FFFF")) + Restore({ Multi1 }) + end) + + Trigger.OnEnteredFootprint({ ResetTopWH.Location }, function(a, id) + Media.DisplayMessage("Resetting players 3/4...", "Notification", HSLColor.FromHex("FF0000")) + Reset({ Multi2, Multi3 }) + end) + + Trigger.OnEnteredFootprint({ SaveTopWH.Location }, function(a, id) + Media.DisplayMessage("Player 3/4 compositions saved.", "Notification", HSLColor.FromHex("00FF00")) + Save({ MMulti2, Multi3 }) + end) + + Trigger.OnEnteredFootprint({ RestoreTopWH.Location }, function(a, id) + Media.DisplayMessage("Restoring player 3/4 compositions...", "Notification", HSLColor.FromHex("00FFFF")) + Restore({ Multi2, Multi3 }) + end) + + Trigger.OnEnteredFootprint({ Reset3WH.Location }, function(a, id) + Media.DisplayMessage("Resetting player 3...", "Notification", HSLColor.FromHex("FF0000")) + Reset({ Multi2 }) + end) + + Trigger.OnEnteredFootprint({ Save3WH.Location }, function(a, id) + Media.DisplayMessage("Player 3 composition saved.", "Notification", HSLColor.FromHex("00FF00")) + Save({ Multi2 }) + end) + + Trigger.OnEnteredFootprint({ Restore3WH.Location }, function(a, id) + Media.DisplayMessage("Restoring player 3 composition...", "Notification", HSLColor.FromHex("00FFFF")) + Restore({ Multi2 }) + end) + + Trigger.OnEnteredFootprint({ Reset4WH.Location }, function(a, id) + Media.DisplayMessage("Resetting player 4...", "Notification", HSLColor.FromHex("FF0000")) + Reset({ Multi3 }) + end) + + Trigger.OnEnteredFootprint({ Save4WH.Location }, function(a, id) + Media.DisplayMessage("Player 4 composition saved.", "Notification", HSLColor.FromHex("00FF00")) + Save({ Multi3 }) + end) + + Trigger.OnEnteredFootprint({ Restore4WH.Location }, function(a, id) + Media.DisplayMessage("Restoring player 4 composition...", "Notification", HSLColor.FromHex("00FFFF")) + Restore({ Multi3 }) + end) + + RestoreTrucks({ Multi0, Multi1, Multi2, Multi3 }) end Tick = function() if DateTime.GameTime > 1 and DateTime.GameTime % 25 == 0 then - -- Do nothing - end + -- Do nothing + end end IsUpgrade = function(a) - return string.find(a.Type, ".upgrade") or string.find(a.Type, ".strat") + return string.find(a.Type, ".upgrade") or string.find(a.Type, ".strat") end KillTrucks = function(players) - Utils.Do(players, function(p) - if p ~= nil then - local trucks = p.GetActorsByType("truk") - Utils.Do(trucks, function(a) - a.Destroy() - end) - end - end) + Utils.Do(players, function(p) + if p ~= nil then + local trucks = p.GetActorsByType("truk") + Utils.Do(trucks, function(a) + a.Destroy() + end) + end + end) end RestoreTrucks = function(players) - Utils.Do(players, function(p) - if p ~= nil and p == Multi0 then - Actor.Create("truk", true, { Owner = Multi0, Location = Truck1A.Location, Facing = Angle.West }) - Actor.Create("truk", true, { Owner = Multi0, Location = Truck1B.Location, Facing = Angle.West }) - Actor.Create("truk", true, { Owner = Multi0, Location = Truck1C.Location, Facing = Angle.West }) - end - - if p ~= nil and p == Multi1 then - Actor.Create("truk", true, { Owner = Multi1, Location = Truck2A.Location, Facing = Angle.East }) - Actor.Create("truk", true, { Owner = Multi1, Location = Truck2B.Location, Facing = Angle.East }) - Actor.Create("truk", true, { Owner = Multi1, Location = Truck2C.Location, Facing = Angle.East }) - end - - if p ~= nil and p == Multi2 then - Actor.Create("truk", true, { Owner = Multi2, Location = Truck3A.Location, Facing = Angle.West }) - Actor.Create("truk", true, { Owner = Multi2, Location = Truck3B.Location, Facing = Angle.West }) - Actor.Create("truk", true, { Owner = Multi2, Location = Truck3C.Location, Facing = Angle.West }) - end - - if p ~= nil and p == Multi3 then - Actor.Create("truk", true, { Owner = Multi3, Location = Truck3A.Location, Facing = Angle.East }) - Actor.Create("truk", true, { Owner = Multi3, Location = Truck3B.Location, Facing = Angle.East }) - Actor.Create("truk", true, { Owner = Multi3, Location = Truck3C.Location, Facing = Angle.East }) - end - end) + Utils.Do(players, function(p) + if p ~= nil and p == Multi0 then + Actor.Create("truk", true, { Owner = Multi0, Location = Truck1A.Location, Facing = Angle.West }) + Actor.Create("truk", true, { Owner = Multi0, Location = Truck1B.Location, Facing = Angle.West }) + Actor.Create("truk", true, { Owner = Multi0, Location = Truck1C.Location, Facing = Angle.West }) + end + + if p ~= nil and p == Multi1 then + Actor.Create("truk", true, { Owner = Multi1, Location = Truck2A.Location, Facing = Angle.East }) + Actor.Create("truk", true, { Owner = Multi1, Location = Truck2B.Location, Facing = Angle.East }) + Actor.Create("truk", true, { Owner = Multi1, Location = Truck2C.Location, Facing = Angle.East }) + end + + if p ~= nil and p == Multi2 then + Actor.Create("truk", true, { Owner = Multi2, Location = Truck3A.Location, Facing = Angle.West }) + Actor.Create("truk", true, { Owner = Multi2, Location = Truck3B.Location, Facing = Angle.West }) + Actor.Create("truk", true, { Owner = Multi2, Location = Truck3C.Location, Facing = Angle.West }) + end + + if p ~= nil and p == Multi3 then + Actor.Create("truk", true, { Owner = Multi3, Location = Truck3A.Location, Facing = Angle.East }) + Actor.Create("truk", true, { Owner = Multi3, Location = Truck3B.Location, Facing = Angle.East }) + Actor.Create("truk", true, { Owner = Multi3, Location = Truck3C.Location, Facing = Angle.East }) + end + end) end KillUnits = function(players) - Utils.Do(players, function(p) - if p ~= nil then - local actors = p.GetActors() - - Utils.Do(actors, function(a) - KillUnit(a) - end) - end - end) + Utils.Do(players, function(p) + if p ~= nil then + local actors = p.GetActors() + + Utils.Do(actors, function(a) + KillUnit(a) + end) + end + end) end ResetCash = function(players) - Utils.Do(players, function(p) - if p ~= nil then - p.Cash = 0 - p.Resources = 0 - Trigger.AfterDelay(DateTime.Seconds(1), function() - p.Cash = StartingCash - p.Resources = 0 - end) - end - end) + Utils.Do(players, function(p) + if p ~= nil then + p.Cash = 0 + p.Resources = 0 + Trigger.AfterDelay(DateTime.Seconds(1), function() + p.Cash = StartingCash + p.Resources = 0 + end) + end + end) end ResetBuildings = function(players) - Utils.Do(players, function(p) - if p ~= nil then - local buildings = p.GetActorsByTypes({ "weap", "tent", "afld", "syrd", "fact" }) - Utils.Do(buildings, function(b) - local loc = b.Location - Trigger.AfterDelay(5, function() - b.Destroy() - Trigger.AfterDelay(DateTime.Seconds(1), function() - Actor.Create(b.Type, true, { Owner = p, Location = loc }) - end) - end) - end) - end - end) + Utils.Do(players, function(p) + if p ~= nil then + local buildings = p.GetActorsByTypes({ "weap", "tent", "afld", "syrd", "fact" }) + Utils.Do(buildings, function(b) + local loc = b.Location + Trigger.AfterDelay(5, function() + b.Destroy() + Trigger.AfterDelay(DateTime.Seconds(1), function() + Actor.Create(b.Type, true, { Owner = p, Location = loc }) + end) + end) + end) + end + end) end KillUnit = function(a) - if IsIgnoredUnit(a.Type) then - return - end - - if not a.HasProperty("StartBuildingRepairs") and a.Type ~= "player" and a.HasProperty("Kill") and not a.IsDead then - a.Stop() - a.Destroy() - Trigger.AfterDelay(5, function() - KillUnit(a) - end) - elseif IsUpgrade(a) then - Trigger.AfterDelay(5, function() - a.Destroy() - end) - end + if IsIgnoredUnit(a.Type) then + return + end + + if not a.HasProperty("StartBuildingRepairs") and a.Type ~= "player" and a.HasProperty("Kill") and not a.IsDead then + a.Stop() + a.Destroy() + Trigger.AfterDelay(5, function() + KillUnit(a) + end) + elseif IsUpgrade(a) then + Trigger.AfterDelay(5, function() + a.Destroy() + end) + end end Reset = function(players) - ResetCash(players) - ResetBuildings(players) - KillUnits(players) - RestoreTrucks(players) + ResetCash(players) + ResetBuildings(players) + KillUnits(players) + RestoreTrucks(players) end Save = function(players) - KillTrucks(players) - RestoreTrucks(players) - - Utils.Do(players, function(p) - if p ~= nil then - SavedCompositions[p.InternalName] = { } - SavedCash[p.InternalName] = p.Resources + p.Cash - - local units = p.GetActors() - - Utils.Do(units, function(a) - if IsIgnoredUnit(a.Type) then - return - end - - if not a.HasProperty("StartBuildingRepairs") and a.Type ~= "player" and a.HasProperty("Kill") and a.HasProperty("Move") and not a.IsDead and a.Type ~= "truk" then - local unit = { - Type = a.Type, - Location = a.Location, - CenterPosition = a.CenterPosition, - Facing = a.Facing, - } - - if a.HasProperty("HasPassengers") and a.HasPassengers then - unit.Cargo = {} - Utils.Do(a.Passengers, function(c) - table.insert(unit.Cargo, c.Type) - end) - end - - table.insert(SavedCompositions[p.InternalName], unit) - elseif IsUpgrade(a) then - local upg = { - Type = a.Type, - } - - table.insert(SavedCompositions[p.InternalName], upg) - end - end) - end - end) + KillTrucks(players) + RestoreTrucks(players) + + Utils.Do(players, function(p) + if p ~= nil then + SavedCompositions[p.InternalName] = { } + SavedCash[p.InternalName] = p.Resources + p.Cash + + local units = p.GetActors() + + Utils.Do(units, function(a) + if IsIgnoredUnit(a.Type) then + return + end + + if not a.HasProperty("StartBuildingRepairs") and a.Type ~= "player" and a.HasProperty("Kill") and a.HasProperty("Move") and not a.IsDead and a.Type ~= "truk" then + local unit = { + Type = a.Type, + Location = a.Location, + CenterPosition = a.CenterPosition, + Facing = a.Facing, + } + + if a.HasProperty("HasPassengers") and a.HasPassengers then + unit.Cargo = {} + Utils.Do(a.Passengers, function(c) + table.insert(unit.Cargo, c.Type) + end) + end + + table.insert(SavedCompositions[p.InternalName], unit) + elseif IsUpgrade(a) then + local upg = { + Type = a.Type, + } + + table.insert(SavedCompositions[p.InternalName], upg) + end + end) + end + end) end Restore = function(players) - KillUnits(players) - ResetBuildings(players) - - Trigger.AfterDelay(DateTime.Seconds(1) + 10, function() - Utils.Do(players, function(p) - if p ~= nil then - if SavedCompositions[p.InternalName] ~= nil and #SavedCompositions[p.InternalName] > 0 then - Utils.Do(SavedCompositions[p.InternalName], function(u) - if u.Location ~= nil then - local newActor = Actor.Create(u.Type, true, { Owner = p, Location = u.Location, CenterPosition = u.CenterPosition, Facing = u.Facing }) - - if u.Cargo ~= nil then - Utils.Do(u.Cargo, function(c) - local passenger = Actor.Create(c, false, { Owner = p }) - newActor.LoadPassenger(passenger) - end) - end - else - Actor.Create(u.Type, true, { Owner = p }) - end - end) - end - - if SavedCash[p.InternalName] ~= nil then - p.Cash = SavedCash[p.InternalName] - p.Resources = 0 - end - end - end) - RestoreTrucks(players) - end) + KillUnits(players) + ResetBuildings(players) + + Trigger.AfterDelay(DateTime.Seconds(1) + 10, function() + Utils.Do(players, function(p) + if p ~= nil then + if SavedCompositions[p.InternalName] ~= nil and #SavedCompositions[p.InternalName] > 0 then + Utils.Do(SavedCompositions[p.InternalName], function(u) + if u.Location ~= nil then + local newActor = Actor.Create(u.Type, true, { Owner = p, Location = u.Location, CenterPosition = u.CenterPosition, Facing = u.Facing }) + + if u.Cargo ~= nil then + Utils.Do(u.Cargo, function(c) + local passenger = Actor.Create(c, false, { Owner = p }) + newActor.LoadPassenger(passenger) + end) + end + else + Actor.Create(u.Type, true, { Owner = p }) + end + end) + end + + if SavedCash[p.InternalName] ~= nil then + p.Cash = SavedCash[p.InternalName] + p.Resources = 0 + end + end + end) + RestoreTrucks(players) + end) end IgnoredUnits = { - "badr", - "badr.bomber", - "badr.cbomber", - "badr.nbomber", - "badr.mbomber", - "b2b", - "p51", - "tran.paradrop", - "halo.paradrop", - "nhaw.paradrop", - "u2", - "smig", - "a10.bomber", - "c17", - "c17.cargo", - "c17.clustermines", - "c17.xo", - "uav", - "ocar.reinforce", - "ocar.xo", - "ocar.pod", - "horn", - "inva", - "yf23.bomber", - "pod", - "pod2", - "pod3", + "badr", + "badr.bomber", + "badr.cbomber", + "badr.nbomber", + "badr.mbomber", + "b2b", + "p51", + "tran.paradrop", + "halo.paradrop", + "nhaw.paradrop", + "u2", + "smig", + "a10.bomber", + "c17", + "c17.cargo", + "c17.clustermines", + "c17.xo", + "uav", + "ocar.reinforce", + "ocar.xo", + "ocar.pod", + "horn", + "inva", + "yf23.bomber", + "pod", + "pod2", + "pod3", } IsIgnoredUnit = function(a) - for _, value in pairs(IgnoredUnits) do - if value == a then - return true - end - end - return false + for _, value in pairs(IgnoredUnits) do + if value == a then + return true + end + end + return false end diff --git a/mods/ca/maps/ca-composition-tournament/composition-tournament.lua b/mods/ca/maps/ca-composition-tournament/composition-tournament.lua index f1451a6130..a14a9c7732 100644 --- a/mods/ca/maps/ca-composition-tournament/composition-tournament.lua +++ b/mods/ca/maps/ca-composition-tournament/composition-tournament.lua @@ -10,435 +10,435 @@ PlayerScores = { } PlayerSurrenderTimes = { } WorldLoaded = function() - Media.DisplayMessage("Loading...", "Notification", HSLColor.FromHex("1E90FF")) - - PossiblePlayers = { - Multi0 = Player.GetPlayer("Multi0"), - Multi1 = Player.GetPlayer("Multi1"), - Multi2 = Player.GetPlayer("Multi2"), - Multi3 = Player.GetPlayer("Multi3"), - Multi4 = Player.GetPlayer("Multi4"), - Multi5 = Player.GetPlayer("Multi5"), - Multi6 = Player.GetPlayer("Multi6"), - Multi7 = Player.GetPlayer("Multi7"), - Multi8 = Player.GetPlayer("Multi8"), - Multi9 = Player.GetPlayer("Multi9"), - Multi10 = Player.GetPlayer("Multi10"), - Multi11 = Player.GetPlayer("Multi11"), - Multi12 = Player.GetPlayer("Multi12"), - Multi13 = Player.GetPlayer("Multi13"), - Multi14 = Player.GetPlayer("Multi14"), - Multi15 = Player.GetPlayer("Multi15") - } - - Neutral = Player.GetPlayer("Neutral") - EmptyPlayer = Player.GetPlayer("Empty") - - Utils.Do(PossiblePlayers, function(p) - if p ~= nil then - table.insert(Players, p) - table.insert(PlayerScores, { Player = p, Captures = 0, Losses = 0 }) - PlayerSurrenderTimes[p.InternalName] = nil - StartingCash = p.Cash - end - end) - - if #Players % 2 ~= 0 then - table.insert(Players, EmptyPlayer) - end - - BaseRadius = WDist.New(12288) - - Trigger.AfterDelay(1, function() - Arenas = { - { - HQ = HQ1, - Base1Pos = Base1.CenterPosition, - Base2Pos = Base2.CenterPosition, - Player1Buildings = { }, - Player2Buildings = { }, - }, - { - HQ = HQ2, - Base1Pos = Base3.CenterPosition, - Base2Pos = Base4.CenterPosition, - Player1Buildings = { }, - Player2Buildings = { }, - }, - { - HQ = HQ3, - Base1Pos = Base5.CenterPosition, - Base2Pos = Base6.CenterPosition, - Player1Buildings = { }, - Player2Buildings = { }, - }, - { - HQ = HQ4, - Base1Pos = Base7.CenterPosition, - Base2Pos = Base8.CenterPosition, - Player1Buildings = { }, - Player2Buildings = { }, - }, - { - HQ = HQ5, - Base1Pos = Base9.CenterPosition, - Base2Pos = Base10.CenterPosition, - Player1Buildings = { }, - Player2Buildings = { }, - }, - { - HQ = HQ6, - Base1Pos = Base11.CenterPosition, - Base2Pos = Base12.CenterPosition, - Player1Buildings = { }, - Player2Buildings = { }, - }, - { - HQ = HQ7, - Base1Pos = Base13.CenterPosition, - Base2Pos = Base14.CenterPosition, - Player1Buildings = { }, - Player2Buildings = { }, - }, - { - HQ = HQ8, - Base1Pos = Base15.CenterPosition, - Base2Pos = Base16.CenterPosition, - Player1Buildings = { }, - Player2Buildings = { }, - } - } - - -- populate the initial building types and locations so they can be rebuilt each round, then destroy initial buildings - Utils.Do(Arenas, function(arena) - local player1Buildings = GetBaseBuildings(arena.Base1Pos) - local player2Buildings = GetBaseBuildings(arena.Base2Pos) - - Utils.Do(player1Buildings, function(b) - table.insert(arena.Player1Buildings, { Type = b.Type, Location = b.Location }) - Trigger.AfterDelay(1, function() - b.Destroy() - end) - end) - Utils.Do(player2Buildings, function(b) - table.insert(arena.Player2Buildings, { Type = b.Type, Location = b.Location }) - Trigger.AfterDelay(1, function() - b.Destroy() - end) - end) - end) - - CalculateMatchups() - InitRound() - end) + Media.DisplayMessage("Loading...", "Notification", HSLColor.FromHex("1E90FF")) + + PossiblePlayers = { + Multi0 = Player.GetPlayer("Multi0"), + Multi1 = Player.GetPlayer("Multi1"), + Multi2 = Player.GetPlayer("Multi2"), + Multi3 = Player.GetPlayer("Multi3"), + Multi4 = Player.GetPlayer("Multi4"), + Multi5 = Player.GetPlayer("Multi5"), + Multi6 = Player.GetPlayer("Multi6"), + Multi7 = Player.GetPlayer("Multi7"), + Multi8 = Player.GetPlayer("Multi8"), + Multi9 = Player.GetPlayer("Multi9"), + Multi10 = Player.GetPlayer("Multi10"), + Multi11 = Player.GetPlayer("Multi11"), + Multi12 = Player.GetPlayer("Multi12"), + Multi13 = Player.GetPlayer("Multi13"), + Multi14 = Player.GetPlayer("Multi14"), + Multi15 = Player.GetPlayer("Multi15") + } + + Neutral = Player.GetPlayer("Neutral") + EmptyPlayer = Player.GetPlayer("Empty") + + Utils.Do(PossiblePlayers, function(p) + if p ~= nil then + table.insert(Players, p) + table.insert(PlayerScores, { Player = p, Captures = 0, Losses = 0 }) + PlayerSurrenderTimes[p.InternalName] = nil + StartingCash = p.Cash + end + end) + + if #Players % 2 ~= 0 then + table.insert(Players, EmptyPlayer) + end + + BaseRadius = WDist.New(12288) + + Trigger.AfterDelay(1, function() + Arenas = { + { + HQ = HQ1, + Base1Pos = Base1.CenterPosition, + Base2Pos = Base2.CenterPosition, + Player1Buildings = { }, + Player2Buildings = { }, + }, + { + HQ = HQ2, + Base1Pos = Base3.CenterPosition, + Base2Pos = Base4.CenterPosition, + Player1Buildings = { }, + Player2Buildings = { }, + }, + { + HQ = HQ3, + Base1Pos = Base5.CenterPosition, + Base2Pos = Base6.CenterPosition, + Player1Buildings = { }, + Player2Buildings = { }, + }, + { + HQ = HQ4, + Base1Pos = Base7.CenterPosition, + Base2Pos = Base8.CenterPosition, + Player1Buildings = { }, + Player2Buildings = { }, + }, + { + HQ = HQ5, + Base1Pos = Base9.CenterPosition, + Base2Pos = Base10.CenterPosition, + Player1Buildings = { }, + Player2Buildings = { }, + }, + { + HQ = HQ6, + Base1Pos = Base11.CenterPosition, + Base2Pos = Base12.CenterPosition, + Player1Buildings = { }, + Player2Buildings = { }, + }, + { + HQ = HQ7, + Base1Pos = Base13.CenterPosition, + Base2Pos = Base14.CenterPosition, + Player1Buildings = { }, + Player2Buildings = { }, + }, + { + HQ = HQ8, + Base1Pos = Base15.CenterPosition, + Base2Pos = Base16.CenterPosition, + Player1Buildings = { }, + Player2Buildings = { }, + } + } + + -- populate the initial building types and locations so they can be rebuilt each round, then destroy initial buildings + Utils.Do(Arenas, function(arena) + local player1Buildings = GetBaseBuildings(arena.Base1Pos) + local player2Buildings = GetBaseBuildings(arena.Base2Pos) + + Utils.Do(player1Buildings, function(b) + table.insert(arena.Player1Buildings, { Type = b.Type, Location = b.Location }) + Trigger.AfterDelay(1, function() + b.Destroy() + end) + end) + Utils.Do(player2Buildings, function(b) + table.insert(arena.Player2Buildings, { Type = b.Type, Location = b.Location }) + Trigger.AfterDelay(1, function() + b.Destroy() + end) + end) + end) + + CalculateMatchups() + InitRound() + end) end GetBaseBuildings = function(basePos) - return Map.ActorsInCircle(basePos, BaseRadius, IsBaseBuilding) + return Map.ActorsInCircle(basePos, BaseRadius, IsBaseBuilding) end Tick = function() if DateTime.GameTime > 1 and DateTime.GameTime % 25 == 0 then - if CurrentRound > #Rounds then - return - end - - CurrentRoundTime = CurrentRoundTime + 25 - - local activeMatchups = 0 - - -- for each matchup in current round, check if the arena HQ is not neutral - Utils.Do(Rounds[CurrentRound], function(matchup) - if matchup.Winner == nil and Arenas[matchup.ArenaIdx].HQ.Owner ~= Neutral then - matchup.Winner = Arenas[matchup.ArenaIdx].HQ.Owner - - Utils.Do(PlayerScores, function(ps) - if ps.Player == matchup.Winner then - ps.Captures = ps.Captures + 1 - end - end) - - if matchup.Winner == matchup.Player1 then - matchup.Loser = matchup.Player2 - else - matchup.Loser = matchup.Player1 - end - - if matchup.Winner.IsLocalPlayer then - Media.DisplayMessage("You are victorious! Please wait while remaining matchups are completed.", "Notification", HSLColor.FromHex("00FF00")) - elseif matchup.Loser.IsLocalPlayer then - Media.DisplayMessage("You have been defeated. Please wait while remaining matchups are completed.", "Notification", HSLColor.FromHex("FF0000")) - end - - EndMatchup(matchup) - elseif matchup.Winner == nil and matchup.Player1.InternalName ~= "Empty" and matchup.Player2.InternalName ~= "Empty" then - activeMatchups = activeMatchups + 1 - - -- every 5 seconds check if players have active units - if CurrentRoundTime > DateTime.Seconds(60) and DateTime.GameTime % 125 == 0 then - Utils.Do({ { matchup.Player1, matchup.Player2 }, { matchup.Player2, matchup.Player1 } }, function(p) - local hqFlipped = false - local units = Utils.Where(p[1].GetActors(), IsActiveUnit) - if #units == 0 then - if PlayerSurrenderTimes[p[1].InternalName] == nil then - PlayerSurrenderTimes[p[1].InternalName] = DateTime.GameTime + DateTime.Seconds(15) - if p[1].IsLocalPlayer then - Media.DisplayMessage("If you have no units in 15 seconds you will lose this round.", "Notification", HSLColor.FromHex("FF0000")) - elseif p[2].IsLocalPlayer then - Media.DisplayMessage("If your opponent has no units in 15 seconds you will win this round.", "Notification", HSLColor.FromHex("00FF00")) - end - elseif DateTime.GameTime > PlayerSurrenderTimes[p[1].InternalName] and not hqFlipped then - hqFlipped = true - Arenas[matchup.ArenaIdx].HQ.Owner = p[2] - PlayerSurrenderTimes[p[1].InternalName] = nil - end - else - PlayerSurrenderTimes[p[1].InternalName] = nil - end - end) - end - end - end) - - if activeMatchups == 0 then - EndRound() - end - end + if CurrentRound > #Rounds then + return + end + + CurrentRoundTime = CurrentRoundTime + 25 + + local activeMatchups = 0 + + -- for each matchup in current round, check if the arena HQ is not neutral + Utils.Do(Rounds[CurrentRound], function(matchup) + if matchup.Winner == nil and Arenas[matchup.ArenaIdx].HQ.Owner ~= Neutral then + matchup.Winner = Arenas[matchup.ArenaIdx].HQ.Owner + + Utils.Do(PlayerScores, function(ps) + if ps.Player == matchup.Winner then + ps.Captures = ps.Captures + 1 + end + end) + + if matchup.Winner == matchup.Player1 then + matchup.Loser = matchup.Player2 + else + matchup.Loser = matchup.Player1 + end + + if matchup.Winner.IsLocalPlayer then + Media.DisplayMessage("You are victorious! Please wait while remaining matchups are completed.", "Notification", HSLColor.FromHex("00FF00")) + elseif matchup.Loser.IsLocalPlayer then + Media.DisplayMessage("You have been defeated. Please wait while remaining matchups are completed.", "Notification", HSLColor.FromHex("FF0000")) + end + + EndMatchup(matchup) + elseif matchup.Winner == nil and matchup.Player1.InternalName ~= "Empty" and matchup.Player2.InternalName ~= "Empty" then + activeMatchups = activeMatchups + 1 + + -- every 5 seconds check if players have active units + if CurrentRoundTime > DateTime.Seconds(60) and DateTime.GameTime % 125 == 0 then + Utils.Do({ { matchup.Player1, matchup.Player2 }, { matchup.Player2, matchup.Player1 } }, function(p) + local hqFlipped = false + local units = Utils.Where(p[1].GetActors(), IsActiveUnit) + if #units == 0 then + if PlayerSurrenderTimes[p[1].InternalName] == nil then + PlayerSurrenderTimes[p[1].InternalName] = DateTime.GameTime + DateTime.Seconds(15) + if p[1].IsLocalPlayer then + Media.DisplayMessage("If you have no units in 15 seconds you will lose this round.", "Notification", HSLColor.FromHex("FF0000")) + elseif p[2].IsLocalPlayer then + Media.DisplayMessage("If your opponent has no units in 15 seconds you will win this round.", "Notification", HSLColor.FromHex("00FF00")) + end + elseif DateTime.GameTime > PlayerSurrenderTimes[p[1].InternalName] and not hqFlipped then + hqFlipped = true + Arenas[matchup.ArenaIdx].HQ.Owner = p[2] + PlayerSurrenderTimes[p[1].InternalName] = nil + end + else + PlayerSurrenderTimes[p[1].InternalName] = nil + end + end) + end + end + end) + + if activeMatchups == 0 then + EndRound() + end + end end CalculateMatchups = function() - local numPlayers = #Players - local matchupsPerRound = numPlayers / 2 - local roundsPerCycle = numPlayers * (numPlayers - 1) / 2 / matchupsPerRound - - local opponentPool = { } - Utils.Do(Players, function(p) - table.insert(opponentPool, p) - end) - - PossibleMatchups = { } - - -- for each player, assign all possible opponents (removing them from pool of possible opponents to prevent duplicates) - Utils.Do(Players, function(p) - Utils.Do(opponentPool, function(o) - if o ~= p then - local matchupPlayers = { p, o } - matchupPlayers = Utils.Shuffle(matchupPlayers) - table.insert(PossibleMatchups, { Player1 = matchupPlayers[1], Player2 = matchupPlayers[2], Winner = nil, Loser = nil, ArenaIdx = nil }) - end - end) - table.remove(opponentPool, 1) - end) - - local round = 1 - - for i=1, NumCycles do - local matchupPool = { } - Utils.Do(PossibleMatchups, function(m) - table.insert(matchupPool, { Player1 = m.Player1, Player2 = m.Player2, Winner = nil, Loser = nil, ArenaIdx = nil }) - end) - - -- build each round of matchups - for j=1, roundsPerCycle do - Rounds[round] = { } - local playersUsedInRound = { } - - -- while the number of matchups assigned to the round is less than required, add more - while #Rounds[round] < matchupsPerRound do - local matchupIdx = Utils.RandomInteger(1, #matchupPool + 1) - local matchup = matchupPool[matchupIdx] - matchup.ArenaIdx = #Rounds[round] + 1 - - if not playersUsedInRound[matchup.Player1.InternalName] and not playersUsedInRound[matchup.Player2.InternalName] then - table.insert(Rounds[round], matchup) - playersUsedInRound[matchup.Player1.InternalName] = true - playersUsedInRound[matchup.Player2.InternalName] = true - table.remove(matchupPool, matchupIdx) - -- Media.Debug("Matchup " .. tostring(#Rounds[j]) .. ": " .. matchup.Player1.InternalName .. " vs " .. matchup.Player2.InternalName .. " on arena " .. matchup.ArenaIdx) - end - end - - round = round + 1 - end - end + local numPlayers = #Players + local matchupsPerRound = numPlayers / 2 + local roundsPerCycle = numPlayers * (numPlayers - 1) / 2 / matchupsPerRound + + local opponentPool = { } + Utils.Do(Players, function(p) + table.insert(opponentPool, p) + end) + + PossibleMatchups = { } + + -- for each player, assign all possible opponents (removing them from pool of possible opponents to prevent duplicates) + Utils.Do(Players, function(p) + Utils.Do(opponentPool, function(o) + if o ~= p then + local matchupPlayers = { p, o } + matchupPlayers = Utils.Shuffle(matchupPlayers) + table.insert(PossibleMatchups, { Player1 = matchupPlayers[1], Player2 = matchupPlayers[2], Winner = nil, Loser = nil, ArenaIdx = nil }) + end + end) + table.remove(opponentPool, 1) + end) + + local round = 1 + + for i=1, NumCycles do + local matchupPool = { } + Utils.Do(PossibleMatchups, function(m) + table.insert(matchupPool, { Player1 = m.Player1, Player2 = m.Player2, Winner = nil, Loser = nil, ArenaIdx = nil }) + end) + + -- build each round of matchups + for j=1, roundsPerCycle do + Rounds[round] = { } + local playersUsedInRound = { } + + -- while the number of matchups assigned to the round is less than required, add more + while #Rounds[round] < matchupsPerRound do + local matchupIdx = Utils.RandomInteger(1, #matchupPool + 1) + local matchup = matchupPool[matchupIdx] + matchup.ArenaIdx = #Rounds[round] + 1 + + if not playersUsedInRound[matchup.Player1.InternalName] and not playersUsedInRound[matchup.Player2.InternalName] then + table.insert(Rounds[round], matchup) + playersUsedInRound[matchup.Player1.InternalName] = true + playersUsedInRound[matchup.Player2.InternalName] = true + table.remove(matchupPool, matchupIdx) + -- Media.Debug("Matchup " .. tostring(#Rounds[j]) .. ": " .. matchup.Player1.InternalName .. " vs " .. matchup.Player2.InternalName .. " on arena " .. matchup.ArenaIdx) + end + end + + round = round + 1 + end + end end InitRound = function() - Media.DisplayMessage("Round " .. CurrentRound .. " starting...", "Notification", HSLColor.FromHex("1E90FF")) - UserInterface.SetMissionText("Round " .. CurrentRound .. " of " .. #Rounds, HSLColor.Yellow) - ResetAll() - CurrentRoundTime = 0 - - if #Rounds == 0 then - return - end - - Trigger.AfterDelay(DateTime.Seconds(2), function() - local roundMatchups = Rounds[CurrentRound] - Media.DisplayMessage("Round started. Objectives capturable in 60 seconds.", "Notification", HSLColor.FromHex("1E90FF")) - - local objectives = Neutral.GetActorsByType("miss") - Utils.Do(objectives, function(o) - o.GrantCondition("locked", 1500) - end) - - Trigger.AfterDelay(1500, function() - Media.DisplayMessage("Objectives are now capturable.", "Notification", HSLColor.FromHex("1E90FF")) - end) - - for i=1, #roundMatchups do - local matchup = roundMatchups[i] - - if matchup.Player1.InternalName == "Empty" then - if matchup.Player2.IsLocalPlayer then - Media.DisplayMessage("You have no opponent this round, please wait for the next one.", "Notification", HSLColor.FromHex("1E90FF")) - end - table.insert(SpectatorCams, Actor.Create("spectatorcam", true, { Owner = matchup.Player2 })) - elseif matchup.Player2.InternalName == "Empty" then - if matchup.Player1.IsLocalPlayer then - Media.DisplayMessage("You have no opponent this round, please wait for the next one.", "Notification", HSLColor.FromHex("1E90FF")) - end - table.insert(SpectatorCams, Actor.Create("spectatorcam", true, { Owner = matchup.Player1 })) - else - Utils.Do(Arenas[matchup.ArenaIdx].Player1Buildings, function(b) - Actor.Create(b.Type, true, { Owner = matchup.Player1, Location = b.Location }) - end) - Utils.Do(Arenas[matchup.ArenaIdx].Player2Buildings, function(b) - Actor.Create(b.Type, true, { Owner = matchup.Player2, Location = b.Location }) - end) - - Beacon.New(matchup.Player1, Arenas[matchup.ArenaIdx].Base1Pos) - Beacon.New(matchup.Player2, Arenas[matchup.ArenaIdx].Base2Pos) - - if matchup.Player1.IsLocalPlayer then - Camera.Position = Arenas[matchup.ArenaIdx].Base1Pos - elseif matchup.Player2.IsLocalPlayer then - Camera.Position = Arenas[matchup.ArenaIdx].Base2Pos - end - - local hqLocation = Arenas[matchup.ArenaIdx].HQ.Location - - table.insert(BaseBuilders, Actor.Create("basebuilder", true, { Owner = matchup.Player1, Location = CPos.New(hqLocation.X - 11, hqLocation.Y) })) - table.insert(BaseBuilders, Actor.Create("basebuilder", true, { Owner = matchup.Player2, Location = CPos.New(hqLocation.X + 11, hqLocation.Y) })) - - Trigger.AfterDelay(1, function() - Actor.Create("QueueUpdaterDummy", true, { Owner = matchup.Player1 }) - Actor.Create("QueueUpdaterDummy", true, { Owner = matchup.Player2 }) - end) - end - end - end) + Media.DisplayMessage("Round " .. CurrentRound .. " starting...", "Notification", HSLColor.FromHex("1E90FF")) + UserInterface.SetMissionText("Round " .. CurrentRound .. " of " .. #Rounds, HSLColor.Yellow) + ResetAll() + CurrentRoundTime = 0 + + if #Rounds == 0 then + return + end + + Trigger.AfterDelay(DateTime.Seconds(2), function() + local roundMatchups = Rounds[CurrentRound] + Media.DisplayMessage("Round started. Objectives capturable in 60 seconds.", "Notification", HSLColor.FromHex("1E90FF")) + + local objectives = Neutral.GetActorsByType("miss") + Utils.Do(objectives, function(o) + o.GrantCondition("locked", 1500) + end) + + Trigger.AfterDelay(1500, function() + Media.DisplayMessage("Objectives are now capturable.", "Notification", HSLColor.FromHex("1E90FF")) + end) + + for i=1, #roundMatchups do + local matchup = roundMatchups[i] + + if matchup.Player1.InternalName == "Empty" then + if matchup.Player2.IsLocalPlayer then + Media.DisplayMessage("You have no opponent this round, please wait for the next one.", "Notification", HSLColor.FromHex("1E90FF")) + end + table.insert(SpectatorCams, Actor.Create("spectatorcam", true, { Owner = matchup.Player2 })) + elseif matchup.Player2.InternalName == "Empty" then + if matchup.Player1.IsLocalPlayer then + Media.DisplayMessage("You have no opponent this round, please wait for the next one.", "Notification", HSLColor.FromHex("1E90FF")) + end + table.insert(SpectatorCams, Actor.Create("spectatorcam", true, { Owner = matchup.Player1 })) + else + Utils.Do(Arenas[matchup.ArenaIdx].Player1Buildings, function(b) + Actor.Create(b.Type, true, { Owner = matchup.Player1, Location = b.Location }) + end) + Utils.Do(Arenas[matchup.ArenaIdx].Player2Buildings, function(b) + Actor.Create(b.Type, true, { Owner = matchup.Player2, Location = b.Location }) + end) + + Beacon.New(matchup.Player1, Arenas[matchup.ArenaIdx].Base1Pos) + Beacon.New(matchup.Player2, Arenas[matchup.ArenaIdx].Base2Pos) + + if matchup.Player1.IsLocalPlayer then + Camera.Position = Arenas[matchup.ArenaIdx].Base1Pos + elseif matchup.Player2.IsLocalPlayer then + Camera.Position = Arenas[matchup.ArenaIdx].Base2Pos + end + + local hqLocation = Arenas[matchup.ArenaIdx].HQ.Location + + table.insert(BaseBuilders, Actor.Create("basebuilder", true, { Owner = matchup.Player1, Location = CPos.New(hqLocation.X - 11, hqLocation.Y) })) + table.insert(BaseBuilders, Actor.Create("basebuilder", true, { Owner = matchup.Player2, Location = CPos.New(hqLocation.X + 11, hqLocation.Y) })) + + Trigger.AfterDelay(1, function() + Actor.Create("QueueUpdaterDummy", true, { Owner = matchup.Player1 }) + Actor.Create("QueueUpdaterDummy", true, { Owner = matchup.Player2 }) + end) + end + end + end) end EndMatchup = function(matchup) - local loserUnits = matchup.Loser.GetActors() - Utils.Do(loserUnits, function(u) - KillUnit(u) - end) + local loserUnits = matchup.Loser.GetActors() + Utils.Do(loserUnits, function(u) + KillUnit(u) + end) - table.insert(SpectatorCams, Actor.Create("spectatorcam", true, { Owner = matchup.Winner })) - table.insert(SpectatorCams, Actor.Create("spectatorcam", true, { Owner = matchup.Loser })) + table.insert(SpectatorCams, Actor.Create("spectatorcam", true, { Owner = matchup.Winner })) + table.insert(SpectatorCams, Actor.Create("spectatorcam", true, { Owner = matchup.Loser })) end EndRound = function() - CurrentRound = CurrentRound + 1 + CurrentRound = CurrentRound + 1 - if CurrentRound > #Rounds then - EndGame() - return - end + if CurrentRound > #Rounds then + EndGame() + return + end - InitRound() + InitRound() end EndGame = function() - ResetAll() - - table.sort(PlayerScores, function(a, b) return a.Captures * 100000000 - a.Player.DeathsCost > b.Captures * 100000000 - b.Player.DeathsCost end) - local rankingText = "\n\n" - - local playerRank = 1 - - Utils.Do(PlayerScores, function(s) - if playerRank == 1 then - Winner = s.Player - end - rankingText = rankingText .. tostring(playerRank) .. ". " .. s.Player.Name .. " (" .. s.Captures .. " victories)\n" - playerRank = playerRank + 1 - end) - - Utils.Do(Players, function(p) - if p ~= Winner and p.InternalName ~= "Empty" then - local utils = p.GetActorsByType("playerutils") - Utils.Do(utils, function(u) - u.Destroy() - end) - end - end) - - Media.DisplayMessage("Congratulations to the winner, " .. Winner.Name .. "!", "Notification", HSLColor.FromHex("00FF00")) - UserInterface.SetMissionText(rankingText, HSLColor.Yellow) + ResetAll() + + table.sort(PlayerScores, function(a, b) return a.Captures * 100000000 - a.Player.DeathsCost > b.Captures * 100000000 - b.Player.DeathsCost end) + local rankingText = "\n\n" + + local playerRank = 1 + + Utils.Do(PlayerScores, function(s) + if playerRank == 1 then + Winner = s.Player + end + rankingText = rankingText .. tostring(playerRank) .. ". " .. s.Player.Name .. " (" .. s.Captures .. " victories)\n" + playerRank = playerRank + 1 + end) + + Utils.Do(Players, function(p) + if p ~= Winner and p.InternalName ~= "Empty" then + local utils = p.GetActorsByType("playerutils") + Utils.Do(utils, function(u) + u.Destroy() + end) + end + end) + + Media.DisplayMessage("Congratulations to the winner, " .. Winner.Name .. "!", "Notification", HSLColor.FromHex("00FF00")) + UserInterface.SetMissionText(rankingText, HSLColor.Yellow) end ResetAll = function() - Utils.Do(Players, function(p) - if p.InternalName ~= "Empty" then - p.Cash = 0 - p.Resources = StartingCash - local playerBuildings = p.GetActorsByTypes({ "miss", "weap", "tent", "afld", "fix" }) - Utils.Do(playerBuildings, function(b) - if b.Type == "miss" then - b.Owner = Neutral - else - b.Kill() - end - end) - local actors = p.GetActors() - Utils.Do(actors, function(a) - KillUnit(a) - end) - Utils.Do(SpectatorCams, function(c) - if not c.IsDead then - c.Destroy() - end - end) - Utils.Do(BaseBuilders, function(b) - if not b.IsDead then - b.Destroy() - end - end) - SpectatorCams = { } - BaseBuilders = { } - end - end) + Utils.Do(Players, function(p) + if p.InternalName ~= "Empty" then + p.Cash = 0 + p.Resources = StartingCash + local playerBuildings = p.GetActorsByTypes({ "miss", "weap", "tent", "afld", "fix" }) + Utils.Do(playerBuildings, function(b) + if b.Type == "miss" then + b.Owner = Neutral + else + b.Kill() + end + end) + local actors = p.GetActors() + Utils.Do(actors, function(a) + KillUnit(a) + end) + Utils.Do(SpectatorCams, function(c) + if not c.IsDead then + c.Destroy() + end + end) + Utils.Do(BaseBuilders, function(b) + if not b.IsDead then + b.Destroy() + end + end) + SpectatorCams = { } + BaseBuilders = { } + end + end) end KillUnit = function(a) - if IsUpgrade(a) then - Trigger.AfterDelay(5, function() - a.Destroy() - end) - elseif IsActiveUnit(a) or IsDefense(a) then - a.Stop() - a.Destroy() - Trigger.AfterDelay(5, function() - KillUnit(a) - end) - end + if IsUpgrade(a) then + Trigger.AfterDelay(5, function() + a.Destroy() + end) + elseif IsActiveUnit(a) or IsDefense(a) then + a.Stop() + a.Destroy() + Trigger.AfterDelay(5, function() + KillUnit(a) + end) + end end IsUpgrade = function(a) - return string.find(a.Type, ".upgrade") or string.find(a.Type, ".strat") + return string.find(a.Type, ".upgrade") or string.find(a.Type, ".strat") end IsBaseBuilding = function(a) - return a.HasProperty("StartBuildingRepairs") or a.Type == "miss" + return a.HasProperty("StartBuildingRepairs") or a.Type == "miss" end IsActiveUnit = function(a) - return not IsBaseBuilding(a) and a.Type ~= "player" and a.Type ~= "playerutils" and a.HasProperty("Kill") and not a.IsDead + return not IsBaseBuilding(a) and a.Type ~= "player" and a.Type ~= "playerutils" and a.HasProperty("Kill") and not a.IsDead end IsDefense = function(a) - return a.HasProperty("StartBuildingRepairs") and a.HasProperty("Attack") + return a.HasProperty("StartBuildingRepairs") and a.HasProperty("Attack") end diff --git a/mods/ca/maps/ca-prologue-03/ca-prologue-03.lua b/mods/ca/maps/ca-prologue-03/ca-prologue-03.lua index 8ef32c537e..68152a922a 100644 --- a/mods/ca/maps/ca-prologue-03/ca-prologue-03.lua +++ b/mods/ca/maps/ca-prologue-03/ca-prologue-03.lua @@ -21,7 +21,7 @@ WorldLoaded = function() ObjectiveLocateForces = GDI.AddObjective("Locate all GDI forces.") ObjectiveExit = GDI.AddObjective("Find a safe exit route.") - SetupReveals({ Reveal1, Reveal3, Reveal4 }) + SetupReveals({ Reveal1, Reveal3, Reveal4 }) TroopGroups = { { Waypoint = Group1, Id = 1 }, diff --git a/mods/ca/maps/ca-prologue-04/ca-prologue-04.lua b/mods/ca/maps/ca-prologue-04/ca-prologue-04.lua index 24fe9d092d..62d31722da 100644 --- a/mods/ca/maps/ca-prologue-04/ca-prologue-04.lua +++ b/mods/ca/maps/ca-prologue-04/ca-prologue-04.lua @@ -49,16 +49,16 @@ WorldLoaded = function() local aaGuns = GDI.GetActorsByType("cram") Trigger.OnAllKilled(aaGuns, function() - local frigates = GDI.GetActorsByType("dd2") - ObjectiveDestroyFrigates = Nod.AddObjective("Destroy GDI naval blockade.") + local frigates = GDI.GetActorsByType("dd2") + ObjectiveDestroyFrigates = Nod.AddObjective("Destroy GDI naval blockade.") - Trigger.AfterDelay(DateTime.Seconds(6), function() - WarpInBanshees() - end) + Trigger.AfterDelay(DateTime.Seconds(6), function() + WarpInBanshees() + end) - Trigger.OnAllKilled(frigates, function() - Nod.MarkCompletedObjective(ObjectiveDestroyFrigates) - end) + Trigger.OnAllKilled(frigates, function() + Nod.MarkCompletedObjective(ObjectiveDestroyFrigates) + end) Nod.MarkCompletedObjective(ObjectiveDestroyAA) end) diff --git a/mods/ca/maps/ca08-salvation/ca08.lua b/mods/ca/maps/ca08-salvation/ca08.lua index 47ab37dcca..2a88e2c2b8 100644 --- a/mods/ca/maps/ca08-salvation/ca08.lua +++ b/mods/ca/maps/ca08-salvation/ca08.lua @@ -271,10 +271,10 @@ SpawnWormholeUnits = function(wormhole) end ShuffleInPlace = function(t) - for i = #t, 2, -1 do - local j = Utils.RandomInteger(1, i) - t[i], t[j] = t[j], t[i] - end + for i = #t, 2, -1 do + local j = Utils.RandomInteger(1, i) + t[i], t[j] = t[j], t[i] + end end UpdateScrinCounter = function() diff --git a/mods/ca/maps/ca11-abasement/ca11.lua b/mods/ca/maps/ca11-abasement/ca11.lua index ed59f167de..e0051bbcbd 100644 --- a/mods/ca/maps/ca11-abasement/ca11.lua +++ b/mods/ca/maps/ca11-abasement/ca11.lua @@ -165,7 +165,7 @@ WorldLoaded = function() USSR = Player.GetPlayer("USSR") Nod = Player.GetPlayer("Nod") NodAbandoned = Player.GetPlayer("NodAbandoned") - Scrin = Player.GetPlayer("Scrin") + Scrin = Player.GetPlayer("Scrin") MissionPlayer = USSR TimerTicks = 0 diff --git a/mods/ca/maps/ca12-treachery/ca12.lua b/mods/ca/maps/ca12-treachery/ca12.lua index 1dd73abd32..f92b0a8545 100644 --- a/mods/ca/maps/ca12-treachery/ca12.lua +++ b/mods/ca/maps/ca12-treachery/ca12.lua @@ -103,7 +103,7 @@ Squads = { WorldLoaded = function() USSR = Player.GetPlayer("USSR") - Greece = Player.GetPlayer("Greece") + Greece = Player.GetPlayer("Greece") Traitor = Player.GetPlayer("Traitor") USSRAbandoned = Player.GetPlayer("USSRAbandoned") MissionPlayer = USSR diff --git a/mods/ca/maps/ca13-ironclad/ca13.lua b/mods/ca/maps/ca13-ironclad/ca13.lua index 48670de236..650d66b693 100644 --- a/mods/ca/maps/ca13-ironclad/ca13.lua +++ b/mods/ca/maps/ca13-ironclad/ca13.lua @@ -98,7 +98,7 @@ AutoAttackStartTime = { WorldLoaded = function() USSR = Player.GetPlayer("USSR") GDI = Player.GetPlayer("GDI") - Greece = Player.GetPlayer("Greece") + Greece = Player.GetPlayer("Greece") MissionPlayer = USSR TimerTicks = 0 SiegeLosses = 0 @@ -110,7 +110,7 @@ WorldLoaded = function() InitObjectives(USSR) InitGDI() - InitGreece() + InitGreece() ObjectiveDestroyBases = USSR.AddObjective("Break the siege and destroy the enemy bases.") EngineerDrop() diff --git a/mods/ca/maps/ca16-proliferation/ca16.lua b/mods/ca/maps/ca16-proliferation/ca16.lua index 408ca38c59..588aaced65 100644 --- a/mods/ca/maps/ca16-proliferation/ca16.lua +++ b/mods/ca/maps/ca16-proliferation/ca16.lua @@ -144,8 +144,8 @@ Squads = { } WorldLoaded = function() - Scrin = Player.GetPlayer("Scrin") - Nod = Player.GetPlayer("Nod") + Scrin = Player.GetPlayer("Scrin") + Nod = Player.GetPlayer("Nod") MissionPlayer = Scrin TimerTicks = MaintenanceDuration[Difficulty] FieldsClearedAndBeingHarvested = 0 diff --git a/mods/ca/maps/ca17-encroachment/ca17.lua b/mods/ca/maps/ca17-encroachment/ca17.lua index 600946a6f8..f3190c3035 100644 --- a/mods/ca/maps/ca17-encroachment/ca17.lua +++ b/mods/ca/maps/ca17-encroachment/ca17.lua @@ -165,8 +165,8 @@ Squads = { } WorldLoaded = function() - Scrin = Player.GetPlayer("Scrin") - Greece = Player.GetPlayer("Greece") + Scrin = Player.GetPlayer("Scrin") + Greece = Player.GetPlayer("Greece") GDI = Player.GetPlayer("GDI") MissionPlayer = Scrin diff --git a/mods/ca/maps/ca18-incapacitation/ca18.lua b/mods/ca/maps/ca18-incapacitation/ca18.lua index 513265d1d8..ca093d7819 100644 --- a/mods/ca/maps/ca18-incapacitation/ca18.lua +++ b/mods/ca/maps/ca18-incapacitation/ca18.lua @@ -50,9 +50,9 @@ GroundedAircraft = { } WorldLoaded = function() - Scrin = Player.GetPlayer("Scrin") - Greece = Player.GetPlayer("Greece") - GDI = Player.GetPlayer("GDI") + Scrin = Player.GetPlayer("Scrin") + Greece = Player.GetPlayer("Greece") + GDI = Player.GetPlayer("GDI") MissionPlayer = Scrin TimerTicks = 0 StormsEnded = false diff --git a/mods/ca/maps/ca19-decimation/ca19.lua b/mods/ca/maps/ca19-decimation/ca19.lua index fa4ce401a7..10604fcc17 100644 --- a/mods/ca/maps/ca19-decimation/ca19.lua +++ b/mods/ca/maps/ca19-decimation/ca19.lua @@ -146,8 +146,8 @@ Squads = { } WorldLoaded = function() - Scrin = Player.GetPlayer("Scrin") - USSR = Player.GetPlayer("USSR") + Scrin = Player.GetPlayer("Scrin") + USSR = Player.GetPlayer("USSR") USSRUnmanned = Player.GetPlayer("USSRUnmanned") MissionPlayer = Scrin IslandAirfieldsEliminated = false diff --git a/mods/ca/maps/ca20-subjugation/ca20.lua b/mods/ca/maps/ca20-subjugation/ca20.lua index d3066782ba..b9b8c33059 100644 --- a/mods/ca/maps/ca20-subjugation/ca20.lua +++ b/mods/ca/maps/ca20-subjugation/ca20.lua @@ -59,8 +59,8 @@ TibFacilities = { NTibFacility, STibFacility, ETibFacility } HindPatrolPath = { HindPatrol1.Location, HindPatrol2.Location, HindPatrol3.Location, HindPatrol4.Location, HindPatrol5.Location, HindPatrol6.Location, HindPatrol7.Location, HindPatrol8.Location, HindPatrol9.Location } WorldLoaded = function() - Scrin = Player.GetPlayer("Scrin") - USSR = Player.GetPlayer("USSR") + Scrin = Player.GetPlayer("Scrin") + USSR = Player.GetPlayer("USSR") MissionPlayer = Scrin TimerTicks = 0 TibFacilitiesCaptured = 0 diff --git a/mods/ca/maps/ca21-enmity/ca21.lua b/mods/ca/maps/ca21-enmity/ca21.lua index 1bf7cfd5c6..bac0ec821d 100644 --- a/mods/ca/maps/ca21-enmity/ca21.lua +++ b/mods/ca/maps/ca21-enmity/ca21.lua @@ -160,8 +160,8 @@ Squads = { } WorldLoaded = function() - GDI = Player.GetPlayer("GDI") - Nod = Player.GetPlayer("Nod") + GDI = Player.GetPlayer("GDI") + Nod = Player.GetPlayer("Nod") MissionPlayer = GDI EnforceAiBuildRadius = true diff --git a/mods/ca/maps/ca22-capitulation/ca22.lua b/mods/ca/maps/ca22-capitulation/ca22.lua index 28bf2c23e0..9606e7dcb8 100644 --- a/mods/ca/maps/ca22-capitulation/ca22.lua +++ b/mods/ca/maps/ca22-capitulation/ca22.lua @@ -187,8 +187,8 @@ Squads = { } WorldLoaded = function() - GDI = Player.GetPlayer("GDI") - USSR = Player.GetPlayer("USSR") + GDI = Player.GetPlayer("GDI") + USSR = Player.GetPlayer("USSR") MissionPlayer = GDI TimerTicks = MaxReactorFuelTime CurrentDelivery = 1 diff --git a/mods/ca/maps/ca23-emancipation/ca23.lua b/mods/ca/maps/ca23-emancipation/ca23.lua index 0c6ba2ef18..e5126f27a8 100644 --- a/mods/ca/maps/ca23-emancipation/ca23.lua +++ b/mods/ca/maps/ca23-emancipation/ca23.lua @@ -137,9 +137,9 @@ Squads = { } WorldLoaded = function() - GDI = Player.GetPlayer("GDI") - Scrin = Player.GetPlayer("Scrin") - GDISlaves = Player.GetPlayer("GDISlaves") + GDI = Player.GetPlayer("GDI") + Scrin = Player.GetPlayer("Scrin") + GDISlaves = Player.GetPlayer("GDISlaves") MissionPlayer = GDI EnslavedUnitsKilled = 0 diff --git a/mods/ca/maps/ca24-duality/ca24.lua b/mods/ca/maps/ca24-duality/ca24.lua index 128436c4e9..086dee87c6 100644 --- a/mods/ca/maps/ca24-duality/ca24.lua +++ b/mods/ca/maps/ca24-duality/ca24.lua @@ -8,8 +8,8 @@ ScrinReinforcementInterval = { } WorldLoaded = function() - GDI = Player.GetPlayer("GDI") - Scrin = Player.GetPlayer("Scrin") + GDI = Player.GetPlayer("GDI") + Scrin = Player.GetPlayer("Scrin") MissionPlayer = GDI TimerTicks = 0 diff --git a/mods/ca/maps/ca25-singularity/ca25.lua b/mods/ca/maps/ca25-singularity/ca25.lua index 4958b9957e..454b669b2b 100644 --- a/mods/ca/maps/ca25-singularity/ca25.lua +++ b/mods/ca/maps/ca25-singularity/ca25.lua @@ -265,11 +265,11 @@ HackersDelay = { } WorldLoaded = function() - GDI = Player.GetPlayer("GDI") + GDI = Player.GetPlayer("GDI") Greece = Player.GetPlayer("Greece") USSR = Player.GetPlayer("USSR") Nod = Player.GetPlayer("Nod") - Scrin = Player.GetPlayer("Scrin") + Scrin = Player.GetPlayer("Scrin") AlliedSlaves = Player.GetPlayer("AlliedSlaves") SovietSlaves = Player.GetPlayer("SovietSlaves") NodSlaves = Player.GetPlayer("NodSlaves") diff --git a/mods/ca/maps/ca26-foothold/ca26.lua b/mods/ca/maps/ca26-foothold/ca26.lua index b35ead2d5b..309660ef71 100644 --- a/mods/ca/maps/ca26-foothold/ca26.lua +++ b/mods/ca/maps/ca26-foothold/ca26.lua @@ -43,8 +43,8 @@ Squads = { ProducerTypes = { Infantry = { "port" }, Vehicles = { "wsph" }, Aircraft = { "grav" } }, Units = UnitCompositions.Scrin.Main, AttackPaths = { - { ScrinAttack1.Location, ScrinAttack2.Location, ScrinAttack3.Location, ScrinAttack4.Location } - }, + { ScrinAttack1.Location, ScrinAttack2.Location, ScrinAttack3.Location, ScrinAttack4.Location } + }, }, ScrinWater = { Delay = { @@ -74,10 +74,10 @@ Squads = { { Vehicles = { "lace", "lace", "seek", "seek" }, }, { Vehicles = { "devo", "intl.ai2", "ruin" }, MinTime = DateTime.Minutes(7) }, } - }, + }, AttackPaths = { - { ScrinAttack1.Location, ScrinAttack2b.Location, ScrinAttack4.Location } - }, + { ScrinAttack1.Location, ScrinAttack2b.Location, ScrinAttack4.Location } + }, }, ScrinAir = { Delay = { @@ -113,9 +113,9 @@ Squads = { } WorldLoaded = function() - GDI = Player.GetPlayer("GDI") - Scrin = Player.GetPlayer("Scrin") - TibLifeforms = Player.GetPlayer("TibLifeforms") + GDI = Player.GetPlayer("GDI") + Scrin = Player.GetPlayer("Scrin") + TibLifeforms = Player.GetPlayer("TibLifeforms") GatewayOwner = Player.GetPlayer("GatewayOwner") MissionPlayer = GDI TimerTicks = 0 @@ -127,10 +127,10 @@ WorldLoaded = function() InitScrin() InitTibLifeforms() - ObjectiveDeploySensorArrays = GDI.AddObjective("Deploy Sensor Arrays at target locations.") + ObjectiveDeploySensorArrays = GDI.AddObjective("Deploy Sensor Arrays at target locations.") ObjectiveCaptureNerveCenter = GDI.AddObjective("Capture Scrin Nerve Center.") SetupReveals({ Reveal1, Reveal2 }) - CheckSensors() + CheckSensors() if Difficulty ~= "easy" then Trigger.AfterDelay(DateTime.Seconds(10), function() @@ -240,7 +240,7 @@ OncePerSecondChecks = function() GDI.MarkCompletedObjective(ObjectiveDestroyScrinBase) end - CheckSensors() + CheckSensors() end end @@ -251,36 +251,36 @@ OncePerFiveSecondChecks = function() end CheckSensors = function() - if GDI.IsObjectiveCompleted(ObjectiveDeploySensorArrays) then - return - end + if GDI.IsObjectiveCompleted(ObjectiveDeploySensorArrays) then + return + end - NumSensorsDeployed = 0 + NumSensorsDeployed = 0 - Utils.Do(SensorZones, function(z) + Utils.Do(SensorZones, function(z) local deployedSensors = Map.ActorsInCircle(z.CenterPosition, WDist.New(10 * 1024), function(a) return a.Type == "deployedsensortoken" end) - if #deployedSensors > 0 then - NumSensorsDeployed = NumSensorsDeployed + 1 - end - end) + if #deployedSensors > 0 then + NumSensorsDeployed = NumSensorsDeployed + 1 + end + end) - if NumSensorsDeployed == 4 then - UserInterface.SetMissionText("") - GDI.MarkCompletedObjective(ObjectiveDeploySensorArrays) + if NumSensorsDeployed == 4 then + UserInterface.SetMissionText("") + GDI.MarkCompletedObjective(ObjectiveDeploySensorArrays) SensorZone1.Destroy() SensorZone2.Destroy() SensorZone3.Destroy() SensorZone4.Destroy() - Trigger.AfterDelay(DateTime.Seconds(2), function() + Trigger.AfterDelay(DateTime.Seconds(2), function() - local nerveCenterCamera = Actor.Create("camera", true, { Owner = GDI, Location = NerveCenter1.Location }) - Trigger.AfterDelay(DateTime.Seconds(10), function() - nerveCenterCamera.Destroy() - end) + local nerveCenterCamera = Actor.Create("camera", true, { Owner = GDI, Location = NerveCenter1.Location }) + Trigger.AfterDelay(DateTime.Seconds(10), function() + nerveCenterCamera.Destroy() + end) Beacon.New(GDI, NerveCenter1.CenterPosition) MediaCA.PlaySound("c_nervecenterlocated.aud", 2) @@ -316,10 +316,10 @@ CheckSensors = function() end) end end) - end) - else - UserInterface.SetMissionText("Sensor arrays deployed: " .. NumSensorsDeployed .. "/4", HSLColor.Yellow) - end + end) + else + UserInterface.SetMissionText("Sensor arrays deployed: " .. NumSensorsDeployed .. "/4", HSLColor.Yellow) + end end InitScrin = function() diff --git a/mods/ca/maps/ca27-convergence/ca27.lua b/mods/ca/maps/ca27-convergence/ca27.lua index a0014d9e50..2f8f8204f1 100644 --- a/mods/ca/maps/ca27-convergence/ca27.lua +++ b/mods/ca/maps/ca27-convergence/ca27.lua @@ -1,38 +1,38 @@ MaxBreakthroughs = { - easy = 6, - normal = 3, - hard = 0 + easy = 6, + normal = 3, + hard = 0 } FleetWaveCompositions = { - easy = { - { "pac", "pac", "deva" }, - { "pac", "deva", "deva" } - }, - normal = { - { "pac", "pac", "deva", "pac" }, - { "pac", "deva", "deva", "pac" }, - }, - hard = { - { "pac", "pac", "deva", "pac", "deva" }, - { "pac", "deva", "pac", "deva", "pac" }, - } + easy = { + { "pac", "pac", "deva" }, + { "pac", "deva", "deva" } + }, + normal = { + { "pac", "pac", "deva", "pac" }, + { "pac", "deva", "deva", "pac" }, + }, + hard = { + { "pac", "pac", "deva", "pac", "deva" }, + { "pac", "deva", "pac", "deva", "pac" }, + } } TimeBetweenWaves = { - easy = DateTime.Minutes(3), - normal = DateTime.Minutes(3), - hard = DateTime.Minutes(3), + easy = DateTime.Minutes(3), + normal = DateTime.Minutes(3), + hard = DateTime.Minutes(3), } FleetSpawns = { - Left = { LSpawn1, LSpawn2, LSpawn3 }, - Middle = { MSpawn1, MSpawn2 }, - Right = { RSpawn1, RSpawn2 } + Left = { LSpawn1, LSpawn2, LSpawn3 }, + Middle = { MSpawn1, MSpawn2 }, + Right = { RSpawn1, RSpawn2 } } WaveSpawns = { - FleetSpawns.Left, FleetSpawns.Left, FleetSpawns.Left, FleetSpawns.Middle, FleetSpawns.Right, FleetSpawns.Middle, FleetSpawns.Left, FleetSpawns.Right, FleetSpawns.Middle, FleetSpawns.Right + FleetSpawns.Left, FleetSpawns.Left, FleetSpawns.Left, FleetSpawns.Middle, FleetSpawns.Right, FleetSpawns.Middle, FleetSpawns.Left, FleetSpawns.Right, FleetSpawns.Middle, FleetSpawns.Right } UnitBuildTimeMultipliers = { @@ -68,10 +68,10 @@ Squads = { ProducerTypes = nil, Units = UnitCompositions.Scrin.Main, AttackPaths = { - { LAttackRally1a.Location, LAttackRally1b.Location }, - { LAttackRally2a.Location, LAttackRally2b.Location }, - { LAttackRally3a.Location, LAttackRally3b.Location } - }, + { LAttackRally1a.Location, LAttackRally1b.Location }, + { LAttackRally2a.Location, LAttackRally2b.Location }, + { LAttackRally3a.Location, LAttackRally3b.Location } + }, }, ScrinWater = { Delay = { @@ -112,27 +112,27 @@ Squads = { { Vehicles = { "devo", "intl.ai2", "ruin", "seek" }, MinTime = DateTime.Minutes(7) }, { Vehicles = { "intl", "intl.ai2", { "seek", "lace" }, { "devo", "dark", "ruin" }, { "devo", "dark", "ruin" } }, MinTime = DateTime.Minutes(12) } } - }, + }, AttackPaths = { - { MAttackRally1.Location }, - { MAttackRally1.Location }, - { MAttackRally2a.Location, MAttackRally2b.Location }, - { MAttackRally2a.Location, MAttackRally2b.Location }, + { MAttackRally1.Location }, + { MAttackRally1.Location }, + { MAttackRally2a.Location, MAttackRally2b.Location }, + { MAttackRally2a.Location, MAttackRally2b.Location }, { RAttackRally1.Location, RAttackRally2.Location, RAttackRally3.Location, MAttackRally2b.Location } - }, + }, }, } WorldLoaded = function() - Scrin = Player.GetPlayer("Scrin") - GDI = Player.GetPlayer("GDI") - TibLifeforms = Player.GetPlayer("TibLifeforms") + Scrin = Player.GetPlayer("Scrin") + GDI = Player.GetPlayer("GDI") + TibLifeforms = Player.GetPlayer("TibLifeforms") MissionPlayer = GDI TimerTicks = 0 - WavesRemaining = #WaveSpawns - NumBreakthroughs = 0 - NextWave = 1 - FinalWaveArrived = false + WavesRemaining = #WaveSpawns + NumBreakthroughs = 0 + NextWave = 1 + FinalWaveArrived = false Camera.Position = PlayerStart.CenterPosition @@ -141,16 +141,16 @@ WorldLoaded = function() AdjustStartingCash() SetupLightning() SetupIonStorm() - UpdateMissionText() + UpdateMissionText() - if Difficulty == "hard" then + if Difficulty == "hard" then Sensor3.Destroy() - end + end - if Difficulty ~= "easy" then - Sensor1.Destroy() + if Difficulty ~= "easy" then + Sensor1.Destroy() Sensor2.Destroy() - end + end Trigger.AfterDelay(DateTime.Seconds(10), function() if Difficulty == "hard" then @@ -160,34 +160,34 @@ WorldLoaded = function() end end) - Trigger.AfterDelay(TimeBetweenWaves[Difficulty] + DateTime.Minutes(1), function() - SendFleetWave() + Trigger.AfterDelay(TimeBetweenWaves[Difficulty] + DateTime.Minutes(1), function() + SendFleetWave() Trigger.AfterDelay(DateTime.Seconds(120), function() Notification("The area across the river is infested with Tiberium lifeforms. You will need to use aicraft to intercept Scrin fleet vessels attempting to break through there.") MediaCA.PlaySound("c_acrossriver.aud", 2) Beacon.New(GDI, AcrossRiver.CenterPosition) - local acrossRiverCamera = Actor.Create("camera", true, { Owner = GDI, Location = AcrossRiver.Location }) - Trigger.AfterDelay(DateTime.Seconds(10), function() - acrossRiverCamera.Destroy() - end) + local acrossRiverCamera = Actor.Create("camera", true, { Owner = GDI, Location = AcrossRiver.Location }) + Trigger.AfterDelay(DateTime.Seconds(10), function() + acrossRiverCamera.Destroy() + end) end) - end) + end) if Difficulty == "hard" then Actor.Create("shields.upgrade", true, { Owner = Scrin }) end - if Difficulty == "hard" then - ObjectiveStopFleet = GDI.AddObjective("Prevent any Scrin fleet vessels breaking through.") - else - ObjectiveStopFleet = GDI.AddObjective("Allow no more than " .. MaxBreakthroughs[Difficulty] .. " fleet vessels through.") - end + if Difficulty == "hard" then + ObjectiveStopFleet = GDI.AddObjective("Prevent any Scrin fleet vessels breaking through.") + else + ObjectiveStopFleet = GDI.AddObjective("Allow no more than " .. MaxBreakthroughs[Difficulty] .. " fleet vessels through.") + end - BottomOfMap = { } - for i=1, 128 do - table.insert(BottomOfMap, CPos.New(i,96)) - end + BottomOfMap = { } + for i=1, 128 do + table.insert(BottomOfMap, CPos.New(i,96)) + end end Tick = function() @@ -199,15 +199,15 @@ OncePerSecondChecks = function() if DateTime.GameTime > 1 and DateTime.GameTime % 25 == 0 then Scrin.Resources = Scrin.ResourceCapacity - 500 - if NumBreakthroughs > MaxBreakthroughs[Difficulty] then - GDI.MarkFailedObjective(ObjectiveStopFleet) - end + if NumBreakthroughs > MaxBreakthroughs[Difficulty] then + GDI.MarkFailedObjective(ObjectiveStopFleet) + end - if FinalWaveArrived and #Scrin.GetActorsByTypes({ "pac", "deva" }) == 0 then - GDI.MarkCompletedObjective(ObjectiveStopFleet) - end + if FinalWaveArrived and #Scrin.GetActorsByTypes({ "pac", "deva" }) == 0 then + GDI.MarkCompletedObjective(ObjectiveStopFleet) + end - UpdateMissionText() + UpdateMissionText() end end @@ -232,7 +232,7 @@ InitScrin = function() InitAttackSquad(Squads.ScrinMain, Scrin) end) - Trigger.AfterDelay(Squads.ScrinWater.Delay[Difficulty], function() + Trigger.AfterDelay(Squads.ScrinWater.Delay[Difficulty], function() InitAttackSquad(Squads.ScrinWater, Scrin) end) end @@ -240,16 +240,16 @@ end SetupLightning = function() local nextStrikeDelay = Utils.RandomInteger(DateTime.Seconds(8), DateTime.Seconds(25)) Trigger.AfterDelay(nextStrikeDelay, function() - LightningStrike() - SetupLightning() + LightningStrike() + SetupLightning() end) end SetupIonStorm = function() local nextStrikeDelay = Utils.RandomInteger(DateTime.Seconds(8), DateTime.Seconds(25)) Trigger.AfterDelay(nextStrikeDelay, function() - IonStorm() - SetupIonStorm() + IonStorm() + SetupIonStorm() end) end @@ -281,12 +281,12 @@ IonStorm = function() end SendFleetWave = function() - Notification("Scrin fleet vessels approaching.") + Notification("Scrin fleet vessels approaching.") MediaCA.PlaySound("c_scrinfleetvessels.aud", 2) - local composition = Utils.Random(FleetWaveCompositions[Difficulty]) - local interval = 1 - local currentWave = NextWave + local composition = Utils.Random(FleetWaveCompositions[Difficulty]) + local interval = 1 + local currentWave = NextWave if Difficulty == "hard" and currentWave >= 7 then table.insert(composition, "pac") @@ -299,9 +299,9 @@ SendFleetWave = function() local xUsed = { } - -- for each unit in the wave, get the possible base spawn points, pick one and generate offsetted entry/exit - Utils.Do(composition, function(shipType) - Trigger.AfterDelay(interval, function() + -- for each unit in the wave, get the possible base spawn points, pick one and generate offsetted entry/exit + Utils.Do(composition, function(shipType) + Trigger.AfterDelay(interval, function() local spawn = nil local xOffset = nil local entry = nil @@ -311,14 +311,14 @@ SendFleetWave = function() entry = spawn.Location + CVec.New(xOffset, 0) end xUsed[entry.X] = true - local exit = CPos.New(entry.X, 96) + local exit = CPos.New(entry.X, 96) Beacon.New(GDI, spawn.CenterPosition + WVec.New(xOffset * 1024, 0, 0)) - local ships = Reinforcements.Reinforce(Scrin, { shipType }, { entry, exit }, 25, function(self) - self.Destroy() - NumBreakthroughs = NumBreakthroughs + 1 + local ships = Reinforcements.Reinforce(Scrin, { shipType }, { entry, exit }, 25, function(self) + self.Destroy() + NumBreakthroughs = NumBreakthroughs + 1 Media.PlaySoundNotification(GDI, "AlertBuzzer") Notification("A Scrin fleet vessel has broken through.") - end) + end) if Difficulty ~= "hard" then local pathRenderer = Actor.Create("pathRenderer", true, { Owner = GDI, Location = entry }) Trigger.OnRemovedFromWorld(ships[1], function(self) @@ -326,37 +326,37 @@ SendFleetWave = function() end) end Media.PlaySound("beepslct.aud") - end) - interval = interval + DateTime.Seconds(5) - end) - - if currentWave == #WaveSpawns then - Trigger.AfterDelay(#composition * DateTime.Seconds(5), function() - FinalWaveArrived = true - end) - end - - NextWave = NextWave + 1 - WavesRemaining = WavesRemaining - 1 - - if NextWave <= #WaveSpawns then - Trigger.AfterDelay(TimeBetweenWaves[Difficulty], function() - SendFleetWave() - end) - end + end) + interval = interval + DateTime.Seconds(5) + end) + + if currentWave == #WaveSpawns then + Trigger.AfterDelay(#composition * DateTime.Seconds(5), function() + FinalWaveArrived = true + end) + end + + NextWave = NextWave + 1 + WavesRemaining = WavesRemaining - 1 + + if NextWave <= #WaveSpawns then + Trigger.AfterDelay(TimeBetweenWaves[Difficulty], function() + SendFleetWave() + end) + end end UpdateMissionText = function() - local missionText = "Waves remaining: " .. WavesRemaining + local missionText = "Waves remaining: " .. WavesRemaining - if Difficulty ~= "hard" then - missionText = missionText .. " -- Fleet vessels escaped: " .. NumBreakthroughs .. "/" .. MaxBreakthroughs[Difficulty] - end + if Difficulty ~= "hard" then + missionText = missionText .. " -- Fleet vessels escaped: " .. NumBreakthroughs .. "/" .. MaxBreakthroughs[Difficulty] + end - local color = HSLColor.Yellow - if Difficulty ~= "hard" and NumBreakthroughs >= MaxBreakthroughs[Difficulty] then - color = HSLColor.Red - end + local color = HSLColor.Yellow + if Difficulty ~= "hard" and NumBreakthroughs >= MaxBreakthroughs[Difficulty] then + color = HSLColor.Red + end - UserInterface.SetMissionText(missionText, color) + UserInterface.SetMissionText(missionText, color) end diff --git a/mods/ca/maps/ca28-illumination/ca28.lua b/mods/ca/maps/ca28-illumination/ca28.lua index 0a7c4d4216..e7070e54ec 100644 --- a/mods/ca/maps/ca28-illumination/ca28.lua +++ b/mods/ca/maps/ca28-illumination/ca28.lua @@ -1,200 +1,200 @@ Caves = { - { WormholeLocation = Cave1Wormhole.Location, PatrolPath = { Cave1Patrol1.Location, Cave1Patrol2.Location, Cave1Patrol1.Location, Cave1Patrol3.Location, Cave1Patrol4.Location, Cave1Patrol5.Location, Cave1Patrol6.Location, Cave1Patrol5.Location, Cave1Patrol4.Location, Cave1Patrol3.Location }, Composition = {} }, - { WormholeLocation = Cave2Wormhole.Location, PatrolPath = { Cave2Patrol1.Location, Cave2Patrol2.Location, Cave2Patrol3.Location, Cave2Patrol4.Location, Cave2Patrol3.Location } }, - { WormholeLocation = Cave3Wormhole.Location, PatrolPath = { Cave3Patrol1.Location, Cave3Patrol2.Location, Cave3Patrol3.Location, Cave3Patrol4.Location, Cave3Patrol3.Location, Cave3Patrol2.Location } }, - { WormholeLocation = Cave5Wormhole.Location, PatrolPath = { Cave5Patrol1.Location, Cave5Patrol2.Location } }, - { WormholeLocation = Cave7Wormhole.Location, PatrolPath = { Cave7Patrol1.Location, Cave7Patrol2.Location, Cave7Patrol1.Location, Cave7Patrol3.Location } }, - { WormholeLocation = Cave8Wormhole.Location, PatrolPath = { Cave8Patrol1.Location, Cave8Patrol2.Location } }, - { WormholeLocation = Cave9Wormhole.Location, PatrolPath = { Cave9Patrol1.Location, Cave9Patrol2.Location, Cave9Patrol1.Location, Cave9Patrol3.Location, Cave9Patrol4.Location, Cave9Patrol3.Location } }, + { WormholeLocation = Cave1Wormhole.Location, PatrolPath = { Cave1Patrol1.Location, Cave1Patrol2.Location, Cave1Patrol1.Location, Cave1Patrol3.Location, Cave1Patrol4.Location, Cave1Patrol5.Location, Cave1Patrol6.Location, Cave1Patrol5.Location, Cave1Patrol4.Location, Cave1Patrol3.Location }, Composition = {} }, + { WormholeLocation = Cave2Wormhole.Location, PatrolPath = { Cave2Patrol1.Location, Cave2Patrol2.Location, Cave2Patrol3.Location, Cave2Patrol4.Location, Cave2Patrol3.Location } }, + { WormholeLocation = Cave3Wormhole.Location, PatrolPath = { Cave3Patrol1.Location, Cave3Patrol2.Location, Cave3Patrol3.Location, Cave3Patrol4.Location, Cave3Patrol3.Location, Cave3Patrol2.Location } }, + { WormholeLocation = Cave5Wormhole.Location, PatrolPath = { Cave5Patrol1.Location, Cave5Patrol2.Location } }, + { WormholeLocation = Cave7Wormhole.Location, PatrolPath = { Cave7Patrol1.Location, Cave7Patrol2.Location, Cave7Patrol1.Location, Cave7Patrol3.Location } }, + { WormholeLocation = Cave8Wormhole.Location, PatrolPath = { Cave8Patrol1.Location, Cave8Patrol2.Location } }, + { WormholeLocation = Cave9Wormhole.Location, PatrolPath = { Cave9Patrol1.Location, Cave9Patrol2.Location, Cave9Patrol1.Location, Cave9Patrol3.Location, Cave9Patrol4.Location, Cave9Patrol3.Location } }, } MaxContinuousSpawns = { - easy = 1, - normal = 1, - hard = 2 + easy = 1, + normal = 1, + hard = 2 } ScrinCompositions = { - easy = { - { "s1", "s1", "s1", "s3", "s2", "s1", "gscr", "s1", "s1", "intl" , "s1", { "gunw", "shrw" }, "s1", "s1" } - }, - normal = { - { "s1", "s1", "s1", "s3", "s2", "s1", "s1", "s3", "gscr", { "gunw", "intl", "shrw" }, "s1", { "devo", "dark", "lchr", "corr" }, "s1", { "tpod", "stcr", "intl" } } - }, - hard = { - { "s1", "s1", "s1", "s3", "s2", "s1", "s1", "s3", "s2", "gscr", "s4", { "gunw", "shrw" }, "s1", { "devo", "dark", "lchr", "corr" }, "gscr", { "tpod", "rptp" }, "s1", "gscr", { "intl", "stcr" }, "gscr" } - } + easy = { + { "s1", "s1", "s1", "s3", "s2", "s1", "gscr", "s1", "s1", "intl" , "s1", { "gunw", "shrw" }, "s1", "s1" } + }, + normal = { + { "s1", "s1", "s1", "s3", "s2", "s1", "s1", "s3", "gscr", { "gunw", "intl", "shrw" }, "s1", { "devo", "dark", "lchr", "corr" }, "s1", { "tpod", "stcr", "intl" } } + }, + hard = { + { "s1", "s1", "s1", "s3", "s2", "s1", "s1", "s3", "s2", "gscr", "s4", { "gunw", "shrw" }, "s1", { "devo", "dark", "lchr", "corr" }, "gscr", { "tpod", "rptp" }, "s1", "gscr", { "intl", "stcr" }, "gscr" } + } } FinalBattleInfantryList = { - easy = { "s1", "s1", "s1", "s3", "gscr", "s1" }, - normal = { "s1", "gscr", "s3", "s4", "s1", "s1", "s2", "s1" }, - hard = { "gscr", "s1", "s3", "s4", "s1", "gscr", "s3", "s1" } + easy = { "s1", "s1", "s1", "s3", "gscr", "s1" }, + normal = { "s1", "gscr", "s3", "s4", "s1", "s1", "s2", "s1" }, + hard = { "gscr", "s1", "s3", "s4", "s1", "gscr", "s3", "s1" } } FinalBattleVehiclesList = { - easy = { "gunw", "intl", "corr" }, - normal = { "intl", "devo", "corr", "dark", "tpod" }, - hard = { "intl", "tpod", "devo", "dark", "rptp" } + easy = { "gunw", "intl", "corr" }, + normal = { "intl", "devo", "corr", "dark", "tpod" }, + hard = { "intl", "tpod", "devo", "dark", "rptp" } } FinalBattleInfantryInterval = { - easy = { Min = DateTime.Seconds(8), Max = DateTime.Seconds(10) }, - normal = { Min = DateTime.Seconds(7), Max = DateTime.Seconds(9) }, - hard = { Min = DateTime.Seconds(6), Max = DateTime.Seconds(8) } + easy = { Min = DateTime.Seconds(8), Max = DateTime.Seconds(10) }, + normal = { Min = DateTime.Seconds(7), Max = DateTime.Seconds(9) }, + hard = { Min = DateTime.Seconds(6), Max = DateTime.Seconds(8) } } FinalBattleVehicleInterval = { - easy = DateTime.Seconds(28), - normal = DateTime.Seconds(24), - hard = DateTime.Seconds(20) + easy = DateTime.Seconds(28), + normal = DateTime.Seconds(24), + hard = DateTime.Seconds(20) } WormholeRespawnTime = { - easy = DateTime.Minutes(4), -- not used - normal = DateTime.Minutes(3), - hard = DateTime.Minutes(2) + easy = DateTime.Minutes(4), -- not used + normal = DateTime.Minutes(3), + hard = DateTime.Minutes(2) } ContinuousSpawnFrequency = { - easy = DateTime.Seconds(100), -- not used - normal = DateTime.Seconds(70), - hard = DateTime.Seconds(40) + easy = DateTime.Seconds(100), -- not used + normal = DateTime.Seconds(70), + hard = DateTime.Seconds(40) } WorldLoaded = function() - Scrin = Player.GetPlayer("Scrin") - Nod = Player.GetPlayer("Nod") - TibLifeforms = Player.GetPlayer("TibLifeforms") - Neutral = Player.GetPlayer("Neutral") + Scrin = Player.GetPlayer("Scrin") + Nod = Player.GetPlayer("Nod") + TibLifeforms = Player.GetPlayer("TibLifeforms") + Neutral = Player.GetPlayer("Neutral") MissionPlayer = Nod TimerTicks = 0 - FragmentsAcquired = {} - FragmentsAcquiredCount = 0 - FragmentsDetected = {} + FragmentsAcquired = {} + FragmentsAcquiredCount = 0 + FragmentsDetected = {} Camera.Position = PlayerStart.CenterPosition InitObjectives(Nod) - InitScrin() - - ObjectiveFindFragments = Nod.AddObjective("Find the six hidden artifact fragments.") - ObjectiveKaneSurvives = Nod.AddObjective("Kane must survive.") - - local fragments = TibLifeforms.GetActorsByType("fragment") - - UpdateMissionText() - - Actor.Create("hazmat.upgrade", true, { Owner = Nod }) - Actor.Create("quantum.upgrade", true, { Owner = Nod }) - Actor.Create("cyborgarmor.upgrade", true, { Owner = Nod }) - Actor.Create("cyborgspeed.upgrade", true, { Owner = Nod }) - - Trigger.AfterDelay(AdjustTimeForGameSpeed(DateTime.Seconds(2)), function() - Media.DisplayMessage("There are six fragments of an artifact hidden within these caverns. Only I have the ability to detect them. Once we have them all, the assembled artifact will lead us to our goal.", "Kane", HSLColor.FromHex("FF0000")) - MediaCA.PlaySound("kane_findfragments.aud", 2) - Trigger.AfterDelay(DateTime.Seconds(4), function() - Tip("Kane is able to create wormholes which can be used to travel between neighboring chambers. Only Kane can detect the hidden artifact fragments.") - end) - end) - - Utils.Do(fragments, function(fragment) - local loc = fragment.Location - local pos = fragment.CenterPosition - local fragmentId = tostring(fragment) - - Trigger.OnEnteredProximityTrigger(pos, WDist.New((5 * 1024) + 512), function(a, id) - if a.Owner == Nod and a.Type == "kane" then - FragmentsDetected[fragmentId] = true - if not FirstFragmentFound then - FirstFragmentFound = true - Beacon.New(Nod, pos) - Media.DisplayMessage("There! We have already found the first fragment.", "Kane", HSLColor.FromHex("FF0000")) - MediaCA.PlaySound("kane_firstfragment.aud", 2) - end - end - end) - - Trigger.OnEnteredFootprint({ loc }, function(a, id) - if not fragment.IsDead and a.Owner == Nod and FragmentsDetected[fragmentId] ~= nil and FragmentsAcquired[fragmentId] == nil then - Trigger.RemoveFootprintTrigger(id) - fragment.Kill() - FragmentsAcquired[tostring(fragment)] = true - FragmentsAcquiredCount = FragmentsAcquiredCount + 1 - Media.PlaySound("fragment.aud") - Notification("Aritfact fragment acquired.") - UpdateMissionText() - - if FragmentsAcquiredCount == 6 then - Nod.MarkCompletedObjective(ObjectiveFindFragments) - - Trigger.AfterDelay(DateTime.Seconds(2), function() - CaveShroud1.Destroy() - CaveShroud2.Destroy() - CaveShroud3.Destroy() - CaveShroud4.Destroy() - CaveShroud5.Destroy() - CaveShroud6.Destroy() - CaveShroud7.Destroy() - Beacon.New(Nod, HiddenChamberEntrance.CenterPosition) - Notification("A hidden chamber has been revealed.") - ObjectiveExploreHiddenChamber = Nod.AddObjective("Explore the hidden chamber.") - - local chamberCamera = Actor.Create("camera", true, { Owner = Nod, Location = HiddenChamberEntrance.Location }) - Trigger.AfterDelay(DateTime.Seconds(10), function() - chamberCamera.Destroy() - end) - - Trigger.AfterDelay(AdjustTimeForGameSpeed(DateTime.Seconds(1)), function() - Media.DisplayMessage("With the fragments combined the path to our goal is revealed. Now we must get to the chamber before the Scrin.", "Kane", HSLColor.FromHex("FF0000")) - MediaCA.PlaySound("kane_fragmentscombined.aud", 2) - end) - end) - end - end - end) - end) - - Utils.Do(Caves, function(c) - SpawnWormhole(c) - SpawnScrinSquad(c, false) - end) - - Trigger.OnKilled(Kane, function(self, killer) - Nod.MarkFailedObjective(ObjectiveKaneSurvives) - end) - - Trigger.OnCapture(Purifier, function(self, captor, oldOwner, newOwner) - Actor.Create("purifierlight", true, { Owner = Neutral, Location = Purifier.Location, CenterPosition = Purifier.CenterPosition }) - Media.PlaySound("purification.aud") - Nod.MarkCompletedObjective(ObjectiveActivatePurifier) - Trigger.AfterDelay(DateTime.Seconds(1), function() - Media.DisplayMessage("The Scrin have no doubt located us by now. Protect the device!", "Kane", HSLColor.FromHex("FF0000")) - MediaCA.PlaySound("kane_protect.aud", 2) - Trigger.AfterDelay(DateTime.Seconds(2), function() - ObjectiveDefendPurifier = Nod.AddObjective("Protect the ancient device.") - ObjectiveDestroyWormholes = Nod.AddObjective("Destroy Scrin wormholes.") - InitFinalBattle() - end) - end) - end) - - Trigger.OnKilled(Purifier, function(self, killer) - Nod.MarkFailedObjective(ObjectiveDefendPurifier) - end) - - Trigger.OnEnteredProximityTrigger(Purifier.CenterPosition, WDist.New(7 * 1024), function(a, id) - if a.Owner == Nod and not PurifierFound and Nod.IsObjectiveCompleted(ObjectiveFindFragments) then - PurifierFound = true - Trigger.RemoveProximityTrigger(id) - Beacon.New(Nod, Purifier.CenterPosition) - ObjectiveActivatePurifier = Nod.AddObjective("Activate the ancient device.") - Nod.MarkCompletedObjective(ObjectiveExploreHiddenChamber) - Media.DisplayMessage("We found it! The Scrin rulers believed it to be destroyed long ago, but its creators hid it well. Quickly, let us activate it, we must make sure it still functions.", "Kane", HSLColor.FromHex("FF0000")) - MediaCA.PlaySound("kane_foundit.aud", 2) - end - end) + InitScrin() + + ObjectiveFindFragments = Nod.AddObjective("Find the six hidden artifact fragments.") + ObjectiveKaneSurvives = Nod.AddObjective("Kane must survive.") + + local fragments = TibLifeforms.GetActorsByType("fragment") + + UpdateMissionText() + + Actor.Create("hazmat.upgrade", true, { Owner = Nod }) + Actor.Create("quantum.upgrade", true, { Owner = Nod }) + Actor.Create("cyborgarmor.upgrade", true, { Owner = Nod }) + Actor.Create("cyborgspeed.upgrade", true, { Owner = Nod }) + + Trigger.AfterDelay(AdjustTimeForGameSpeed(DateTime.Seconds(2)), function() + Media.DisplayMessage("There are six fragments of an artifact hidden within these caverns. Only I have the ability to detect them. Once we have them all, the assembled artifact will lead us to our goal.", "Kane", HSLColor.FromHex("FF0000")) + MediaCA.PlaySound("kane_findfragments.aud", 2) + Trigger.AfterDelay(DateTime.Seconds(4), function() + Tip("Kane is able to create wormholes which can be used to travel between neighboring chambers. Only Kane can detect the hidden artifact fragments.") + end) + end) + + Utils.Do(fragments, function(fragment) + local loc = fragment.Location + local pos = fragment.CenterPosition + local fragmentId = tostring(fragment) + + Trigger.OnEnteredProximityTrigger(pos, WDist.New((5 * 1024) + 512), function(a, id) + if a.Owner == Nod and a.Type == "kane" then + FragmentsDetected[fragmentId] = true + if not FirstFragmentFound then + FirstFragmentFound = true + Beacon.New(Nod, pos) + Media.DisplayMessage("There! We have already found the first fragment.", "Kane", HSLColor.FromHex("FF0000")) + MediaCA.PlaySound("kane_firstfragment.aud", 2) + end + end + end) + + Trigger.OnEnteredFootprint({ loc }, function(a, id) + if not fragment.IsDead and a.Owner == Nod and FragmentsDetected[fragmentId] ~= nil and FragmentsAcquired[fragmentId] == nil then + Trigger.RemoveFootprintTrigger(id) + fragment.Kill() + FragmentsAcquired[tostring(fragment)] = true + FragmentsAcquiredCount = FragmentsAcquiredCount + 1 + Media.PlaySound("fragment.aud") + Notification("Aritfact fragment acquired.") + UpdateMissionText() + + if FragmentsAcquiredCount == 6 then + Nod.MarkCompletedObjective(ObjectiveFindFragments) + + Trigger.AfterDelay(DateTime.Seconds(2), function() + CaveShroud1.Destroy() + CaveShroud2.Destroy() + CaveShroud3.Destroy() + CaveShroud4.Destroy() + CaveShroud5.Destroy() + CaveShroud6.Destroy() + CaveShroud7.Destroy() + Beacon.New(Nod, HiddenChamberEntrance.CenterPosition) + Notification("A hidden chamber has been revealed.") + ObjectiveExploreHiddenChamber = Nod.AddObjective("Explore the hidden chamber.") + + local chamberCamera = Actor.Create("camera", true, { Owner = Nod, Location = HiddenChamberEntrance.Location }) + Trigger.AfterDelay(DateTime.Seconds(10), function() + chamberCamera.Destroy() + end) + + Trigger.AfterDelay(AdjustTimeForGameSpeed(DateTime.Seconds(1)), function() + Media.DisplayMessage("With the fragments combined the path to our goal is revealed. Now we must get to the chamber before the Scrin.", "Kane", HSLColor.FromHex("FF0000")) + MediaCA.PlaySound("kane_fragmentscombined.aud", 2) + end) + end) + end + end + end) + end) + + Utils.Do(Caves, function(c) + SpawnWormhole(c) + SpawnScrinSquad(c, false) + end) + + Trigger.OnKilled(Kane, function(self, killer) + Nod.MarkFailedObjective(ObjectiveKaneSurvives) + end) + + Trigger.OnCapture(Purifier, function(self, captor, oldOwner, newOwner) + Actor.Create("purifierlight", true, { Owner = Neutral, Location = Purifier.Location, CenterPosition = Purifier.CenterPosition }) + Media.PlaySound("purification.aud") + Nod.MarkCompletedObjective(ObjectiveActivatePurifier) + Trigger.AfterDelay(DateTime.Seconds(1), function() + Media.DisplayMessage("The Scrin have no doubt located us by now. Protect the device!", "Kane", HSLColor.FromHex("FF0000")) + MediaCA.PlaySound("kane_protect.aud", 2) + Trigger.AfterDelay(DateTime.Seconds(2), function() + ObjectiveDefendPurifier = Nod.AddObjective("Protect the ancient device.") + ObjectiveDestroyWormholes = Nod.AddObjective("Destroy Scrin wormholes.") + InitFinalBattle() + end) + end) + end) + + Trigger.OnKilled(Purifier, function(self, killer) + Nod.MarkFailedObjective(ObjectiveDefendPurifier) + end) + + Trigger.OnEnteredProximityTrigger(Purifier.CenterPosition, WDist.New(7 * 1024), function(a, id) + if a.Owner == Nod and not PurifierFound and Nod.IsObjectiveCompleted(ObjectiveFindFragments) then + PurifierFound = true + Trigger.RemoveProximityTrigger(id) + Beacon.New(Nod, Purifier.CenterPosition) + ObjectiveActivatePurifier = Nod.AddObjective("Activate the ancient device.") + Nod.MarkCompletedObjective(ObjectiveExploreHiddenChamber) + Media.DisplayMessage("We found it! The Scrin rulers believed it to be destroyed long ago, but its creators hid it well. Quickly, let us activate it, we must make sure it still functions.", "Kane", HSLColor.FromHex("FF0000")) + MediaCA.PlaySound("kane_foundit.aud", 2) + end + end) end Tick = function() @@ -210,106 +210,106 @@ end OncePerFiveSecondChecks = function() if DateTime.GameTime > 1 and DateTime.GameTime % 125 == 0 then - if DoFinalBattleChecks then - local finalScrinUnits = Map.ActorsInCircle(HiddenChamberCenter.CenterPosition, WDist.New(12 * 1024), function(a) return a.Owner == Scrin and (a.HasProperty("Move") or a.Type == "scrinwormhole") end) - if #finalScrinUnits == 0 then - DoFinalBattleChecks = false - Media.DisplayMessage("Our forces on the surface have triumphed. The device is ours, and soon it will be ready to do what had been intended for it millennia ago. Excellent work commander, our ultimate victory draws ever closer.", "Kane", HSLColor.FromHex("FF0000")) - MediaCA.PlaySound("kane_victory.aud", 2) - Trigger.AfterDelay(AdjustTimeForGameSpeed(DateTime.Seconds(12)), function() - Nod.MarkCompletedObjective(ObjectiveDefendPurifier) - Nod.MarkCompletedObjective(ObjectiveDestroyWormholes) - Nod.MarkCompletedObjective(ObjectiveKaneSurvives) - end) - end - end + if DoFinalBattleChecks then + local finalScrinUnits = Map.ActorsInCircle(HiddenChamberCenter.CenterPosition, WDist.New(12 * 1024), function(a) return a.Owner == Scrin and (a.HasProperty("Move") or a.Type == "scrinwormhole") end) + if #finalScrinUnits == 0 then + DoFinalBattleChecks = false + Media.DisplayMessage("Our forces on the surface have triumphed. The device is ours, and soon it will be ready to do what had been intended for it millennia ago. Excellent work commander, our ultimate victory draws ever closer.", "Kane", HSLColor.FromHex("FF0000")) + MediaCA.PlaySound("kane_victory.aud", 2) + Trigger.AfterDelay(AdjustTimeForGameSpeed(DateTime.Seconds(12)), function() + Nod.MarkCompletedObjective(ObjectiveDefendPurifier) + Nod.MarkCompletedObjective(ObjectiveDestroyWormholes) + Nod.MarkCompletedObjective(ObjectiveKaneSurvives) + end) + end + end end end UpdateMissionText = function() - if FragmentsAcquiredCount == 6 then - UserInterface.SetMissionText("") - else - UserInterface.SetMissionText("Artifact fragments collected: " .. FragmentsAcquiredCount .. "/6", HSLColor.Yellow) - end + if FragmentsAcquiredCount == 6 then + UserInterface.SetMissionText("") + else + UserInterface.SetMissionText("Artifact fragments collected: " .. FragmentsAcquiredCount .. "/6", HSLColor.Yellow) + end end SpawnWormhole = function(cave) - cave.Wormhole = Actor.Create("scrinwormhole", true, { Owner = Scrin, Location = cave.WormholeLocation }) - cave.ContinuousSpawn = false - cave.NumSpawns = 0 - - -- if wormhole is destroyed, respawn after a delay (unless on easy) - Trigger.OnKilled(cave.Wormhole, function(a) - if Difficulty ~= "easy" then - Trigger.AfterDelay(WormholeRespawnTime[Difficulty], function() - SpawnWormhole(cave) - local currentWormhole = cave.Wormhole - Trigger.AfterDelay(DateTime.Seconds(10), function() - if not currentWormhole.IsDead then - SpawnScrinSquad(cave, false) - end - end) - end) - end - end) - - SpawnScrinSquad(cave, true) + cave.Wormhole = Actor.Create("scrinwormhole", true, { Owner = Scrin, Location = cave.WormholeLocation }) + cave.ContinuousSpawn = false + cave.NumSpawns = 0 + + -- if wormhole is destroyed, respawn after a delay (unless on easy) + Trigger.OnKilled(cave.Wormhole, function(a) + if Difficulty ~= "easy" then + Trigger.AfterDelay(WormholeRespawnTime[Difficulty], function() + SpawnWormhole(cave) + local currentWormhole = cave.Wormhole + Trigger.AfterDelay(DateTime.Seconds(10), function() + if not currentWormhole.IsDead then + SpawnScrinSquad(cave, false) + end + end) + end) + end + end) + + SpawnScrinSquad(cave, true) end SpawnScrinSquad = function(cave, continuous) - -- only spawn when wormhole is active - if cave.Wormhole.IsDead then - return - end + -- only spawn when wormhole is active + if cave.Wormhole.IsDead then + return + end - if continuous then - Trigger.AfterDelay(ContinuousSpawnFrequency[Difficulty], function() - SpawnScrinSquad(cave, continuous) - end) + if continuous then + Trigger.AfterDelay(ContinuousSpawnFrequency[Difficulty], function() + SpawnScrinSquad(cave, continuous) + end) - -- if continuous spawn isn't active yet (no units killed), defer to next attempt - if not cave.ContinuousSpawn then - return - end + -- if continuous spawn isn't active yet (no units killed), defer to next attempt + if not cave.ContinuousSpawn then + return + end - if cave.NumSpawns < MaxContinuousSpawns[Difficulty] then - cave.NumSpawns = cave.NumSpawns + 1 - else - return - end - end + if cave.NumSpawns < MaxContinuousSpawns[Difficulty] then + cave.NumSpawns = cave.NumSpawns + 1 + else + return + end + end - local units = Reinforcements.Reinforce(Scrin, GetSquadComposition(), { cave.WormholeLocation }, 1) + local units = Reinforcements.Reinforce(Scrin, GetSquadComposition(), { cave.WormholeLocation }, 1) Utils.Do(units, function(a) - a.Scatter() - a.Wait(Utils.RandomInteger(1, 75)) - a.Scatter() + a.Scatter() + a.Wait(Utils.RandomInteger(1, 75)) + a.Scatter() TargetSwapChance(a, 10) ca28_CallForHelpOnDamagedOrKilled(a, WDist.New(5120), IsScrinGroundHunterUnit) - Trigger.OnIdle(a, function(self) - a.Patrol(cave.PatrolPath) - local selfId = tostring(self); - AlertedUnits[selfId] = nil - end) + Trigger.OnIdle(a, function(self) + a.Patrol(cave.PatrolPath) + local selfId = tostring(self); + AlertedUnits[selfId] = nil + end) end) - -- if all units in squad are killed, activate continuous spawn and reduce the count if it was a continuous squad - Trigger.OnAllKilled(units, function() - if continuous then - cave.NumSpawns = cave.NumSpawns - 1 - if cave.NumSpawns < 0 then - cave.NumSpawns = 0 - end - end - Trigger.AfterDelay(DateTime.Seconds(15), function() - if not cave.Wormhole.IsDead then - cave.ContinuousSpawn = true - end - end) - end) + -- if all units in squad are killed, activate continuous spawn and reduce the count if it was a continuous squad + Trigger.OnAllKilled(units, function() + if continuous then + cave.NumSpawns = cave.NumSpawns - 1 + if cave.NumSpawns < 0 then + cave.NumSpawns = 0 + end + end + Trigger.AfterDelay(DateTime.Seconds(15), function() + if not cave.Wormhole.IsDead then + cave.ContinuousSpawn = true + end + end) + end) end ca28_CallForHelpOnDamagedOrKilled = function(actor, range, filter, isMissionPlayerFunc) @@ -335,9 +335,9 @@ ca28_CallForHelp = function(self, range, attacker, filter, isMissionPlayerFunc) if isMissionPlayerFunc(self.Owner) then return end - if attacker.IsDead then - return - end + if attacker.IsDead then + return + end local selfId = tostring(self); if AlertedUnits[selfId] == nil then @@ -363,82 +363,82 @@ ca28_CallForHelp = function(self, range, attacker, filter, isMissionPlayerFunc) end InitFinalBattle = function() - if not FinalBattleStarted then - FinalBattleStarted = true - FinalBattleWormholes = { } - - Trigger.AfterDelay(DateTime.Seconds(8), function() - local finalWormholeLocations = { FinalWormhole1.Location, FinalWormhole2.Location, FinalWormhole3.Location, FinalWormhole4.Location, FinalWormhole5.Location } - Utils.Do(finalWormholeLocations, function(loc) - Trigger.AfterDelay(Utils.RandomInteger(25, 150), function() - local wormhole = Actor.Create("scrinwormhole", true, { Owner = Scrin, Location = loc }) - table.insert(FinalBattleWormholes, wormhole) - SpawnFinalBattleInfantry(wormhole, 1) - end) - end) - Trigger.AfterDelay(151, function() - DoFinalBattleChecks = true - SpawnFinalBattleVehicle(1) - end) - end) - end + if not FinalBattleStarted then + FinalBattleStarted = true + FinalBattleWormholes = { } + + Trigger.AfterDelay(DateTime.Seconds(8), function() + local finalWormholeLocations = { FinalWormhole1.Location, FinalWormhole2.Location, FinalWormhole3.Location, FinalWormhole4.Location, FinalWormhole5.Location } + Utils.Do(finalWormholeLocations, function(loc) + Trigger.AfterDelay(Utils.RandomInteger(25, 150), function() + local wormhole = Actor.Create("scrinwormhole", true, { Owner = Scrin, Location = loc }) + table.insert(FinalBattleWormholes, wormhole) + SpawnFinalBattleInfantry(wormhole, 1) + end) + end) + Trigger.AfterDelay(151, function() + DoFinalBattleChecks = true + SpawnFinalBattleVehicle(1) + end) + end) + end end SpawnFinalBattleInfantry = function(wormhole, nextUnitIndex) - if not wormhole.IsDead then - if nextUnitIndex > #FinalBattleInfantryList[Difficulty] then - nextUnitIndex = 1 - end - - local nextUnit = FinalBattleInfantryList[Difficulty][nextUnitIndex] - if type(nextUnit) == "table" then - nextUnit = Utils.Random(nextUnit) - end - - local units = Reinforcements.Reinforce(Scrin, { nextUnit }, { wormhole.Location }, 1) - Utils.Do(units, function(u) - u.AttackMove(HiddenChamberCenter.Location) - end) - - Trigger.AfterDelay(Utils.RandomInteger(FinalBattleInfantryInterval[Difficulty].Min, FinalBattleInfantryInterval[Difficulty].Max), function() - SpawnFinalBattleInfantry(wormhole, nextUnitIndex + 1) - end) - end + if not wormhole.IsDead then + if nextUnitIndex > #FinalBattleInfantryList[Difficulty] then + nextUnitIndex = 1 + end + + local nextUnit = FinalBattleInfantryList[Difficulty][nextUnitIndex] + if type(nextUnit) == "table" then + nextUnit = Utils.Random(nextUnit) + end + + local units = Reinforcements.Reinforce(Scrin, { nextUnit }, { wormhole.Location }, 1) + Utils.Do(units, function(u) + u.AttackMove(HiddenChamberCenter.Location) + end) + + Trigger.AfterDelay(Utils.RandomInteger(FinalBattleInfantryInterval[Difficulty].Min, FinalBattleInfantryInterval[Difficulty].Max), function() + SpawnFinalBattleInfantry(wormhole, nextUnitIndex + 1) + end) + end end SpawnFinalBattleVehicle = function(nextUnitIndex) - local activeWormholes = Utils.Where(FinalBattleWormholes, function(w) return not w.IsDead end) - if #activeWormholes > 0 then - local wormhole = Utils.Random(activeWormholes) + local activeWormholes = Utils.Where(FinalBattleWormholes, function(w) return not w.IsDead end) + if #activeWormholes > 0 then + local wormhole = Utils.Random(activeWormholes) - if nextUnitIndex > #FinalBattleVehiclesList[Difficulty] then - nextUnitIndex = 1 - end + if nextUnitIndex > #FinalBattleVehiclesList[Difficulty] then + nextUnitIndex = 1 + end - local nextUnit = FinalBattleVehiclesList[Difficulty][nextUnitIndex] + local nextUnit = FinalBattleVehiclesList[Difficulty][nextUnitIndex] - local units = Reinforcements.Reinforce(Scrin, { nextUnit }, { wormhole.Location }, 1) - Utils.Do(units, function(u) - u.AttackMove(HiddenChamberCenter.Location) - end) + local units = Reinforcements.Reinforce(Scrin, { nextUnit }, { wormhole.Location }, 1) + Utils.Do(units, function(u) + u.AttackMove(HiddenChamberCenter.Location) + end) - Trigger.AfterDelay(FinalBattleVehicleInterval[Difficulty], function() - SpawnFinalBattleVehicle(nextUnitIndex + 1) - end) - end + Trigger.AfterDelay(FinalBattleVehicleInterval[Difficulty], function() + SpawnFinalBattleVehicle(nextUnitIndex + 1) + end) + end end GetSquadComposition = function() - local rawComposition = Utils.Random(ScrinCompositions[Difficulty]) - local composition = {} - Utils.Do(rawComposition, function(c) - if type(c) == "table" then - table.insert(composition, Utils.Random(c)) - else - table.insert(composition, c) - end - end) - return composition + local rawComposition = Utils.Random(ScrinCompositions[Difficulty]) + local composition = {} + Utils.Do(rawComposition, function(c) + if type(c) == "table" then + table.insert(composition, Utils.Random(c)) + else + table.insert(composition, c) + end + end) + return composition end InitScrin = function() diff --git a/mods/ca/maps/ca29-purification/ca29.lua b/mods/ca/maps/ca29-purification/ca29.lua index b30000403f..53c18f8f6b 100644 --- a/mods/ca/maps/ca29-purification/ca29.lua +++ b/mods/ca/maps/ca29-purification/ca29.lua @@ -8,7 +8,7 @@ RiftEnabledTime = { } ScrinReinforcementSpawns = { - ScrinReinforcementsSpawn1, ScrinReinforcementsSpawn2, ScrinReinforcementsSpawn3, ScrinReinforcementsSpawn4, ScrinReinforcementsSpawn5, ScrinReinforcementsSpawn6, ScrinReinforcementsSpawn7, ScrinReinforcementsSpawn8 + ScrinReinforcementsSpawn1, ScrinReinforcementsSpawn2, ScrinReinforcementsSpawn3, ScrinReinforcementsSpawn4, ScrinReinforcementsSpawn5, ScrinReinforcementsSpawn6, ScrinReinforcementsSpawn7, ScrinReinforcementsSpawn8 } Squads = { @@ -34,11 +34,11 @@ Squads = { ProducerTypes = { Infantry = { "port", "wormhole" }, Vehicles = { "wsph", "wormhole" }, Aircraft = { "grav", "hiddenspawner" } }, Units = UnitCompositions.Scrin.Main, AttackPaths = { - { ScrinAttack1a.Location, ScrinAttack1b.Location, ScrinAttack1c.Location, ScrinAttack1d.Location }, - { ScrinAttack1a.Location, ScrinAttack2.Location }, - { ScrinAttack3a.Location, ScrinAttack3b.Location, ScrinAttack3c.Location }, - { ScrinAttack3a.Location, ScrinAttack4a.Location, ScrinAttack4b.Location, ScrinAttack3c.Location }, - }, + { ScrinAttack1a.Location, ScrinAttack1b.Location, ScrinAttack1c.Location, ScrinAttack1d.Location }, + { ScrinAttack1a.Location, ScrinAttack2.Location }, + { ScrinAttack3a.Location, ScrinAttack3b.Location, ScrinAttack3c.Location }, + { ScrinAttack3a.Location, ScrinAttack4a.Location, ScrinAttack4b.Location, ScrinAttack3c.Location }, + }, }, ScrinAir = { Delay = { @@ -80,7 +80,7 @@ Squads = { QueueProductionStatuses = { Infantry = false, Vehicles = false, - Aircraft = false + Aircraft = false }, FollowLeader = true, IdleUnits = { }, @@ -88,17 +88,17 @@ Squads = { ProducerTypes = { Infantry = { "wormhole" }, Vehicles = { "wormhole" }, Aircraft = { "grav" } }, Units = UnitCompositions.Scrin.Main, AttackPaths = { - { ScrinBaseCenter.Location }, - }, + { ScrinBaseCenter.Location }, + }, }, } WorldLoaded = function() - Nod = Player.GetPlayer("Nod") - Scrin = Player.GetPlayer("Scrin") - ScrinRebels = Player.GetPlayer("ScrinRebels") + Nod = Player.GetPlayer("Nod") + Scrin = Player.GetPlayer("Scrin") + ScrinRebels = Player.GetPlayer("ScrinRebels") MissionPlayer = Nod - ShipmentsComplete = 0 + ShipmentsComplete = 0 TimerTicks = DateTime.Seconds(60) Camera.Position = PlayerStart.CenterPosition @@ -107,72 +107,72 @@ WorldLoaded = function() AdjustStartingCash() InitScrin() - ObjectiveChargeDevice = Nod.AddObjective("Bring the device to full power.") + ObjectiveChargeDevice = Nod.AddObjective("Bring the device to full power.") ObjectiveProtectLiquidTib = Nod.AddObjective("Protect liquid Tiberium processing plant.") - UpdateMissionText() - - if Difficulty == "easy" then - NormalHardOnlyCarrier1.Destroy() - NormalHardOnlyCarrier2.Destroy() - end - - if Difficulty ~= "hard" then - HardOnlyCarrier1.Destroy() - end - - Trigger.OnKilled(LiquidTibFacility, function(self, killer) - if not Nod.IsObjectiveCompleted(ObjectiveProtectLiquidTib) then - Nod.MarkFailedObjective(ObjectiveProtectLiquidTib) - end - end) - - Trigger.AfterDelay(AdjustTimeForGameSpeed(DateTime.Seconds(2)), function() - Media.DisplayMessage("Commander, we must bring the device to full power as quickly as possible. Transporting crystals will take too long, so liquid Tiberium is our only option. We have set up a liquid T production facility. Do not let it be destroyed, and as each shipment becomes available load it into a tanker and bring it to the entrance of the cave system.", "Kane", HSLColor.FromHex("FF0000")) - MediaCA.PlaySound("kane_liquidt.aud", 2) - Trigger.AfterDelay(AdjustTimeForGameSpeed(DateTime.Seconds(18)), function() - Tip("Move a tanker next to the processing plant to pick up a prepared shipment, then take it to the cave entrance in the north-east.") - Utils.Do({ InitAttacker1, InitAttacker2, InitAttacker3, InitAttacker4 }, function(a) - if not a.IsDead then - a.AttackMove(PlayerStart.Location) - end - end) - Trigger.AfterDelay(DateTime.Seconds(10), function() - Utils.Do({ InitAttacker5, InitAttacker6, InitAttacker7 }, function(a) - if not a.IsDead then - a.AttackMove(PlayerStart.Location) - end - end) - end) - end) - end) - - Trigger.OnEnteredFootprint({ LiquidTibPickup1.Location, LiquidTibPickup2.Location }, function(a) - if a.Owner == Nod and not a.IsDead and a.Type == "ttrk" then - if LiquidTibFacility.AmmoCount("primary") == 0 then - Notification("No liquid Tiberium currently available for pickup.") - end - end - end) - - Trigger.OnEnteredFootprint({ CaveEntrance.Location, LiquidTibDropOff1.Location, LiquidTibDropOff2.Location, LiquidTibDropOff3.Location }, function(a) - if a.Owner == Nod and not a.IsDead and a.Type == "ttrk" then - if a.AmmoCount("primary") == 1 then - a.Reload("primary", -1) - ShipmentsComplete = ShipmentsComplete + 1 - Notification("Liquid Tiberium shipment delivered.") - MediaCA.PlaySound("n_liquidtibdelivered.aud", 2) - UpdateMissionText() - if ShipmentsComplete == 5 then - PurificationWave() - Nod.MarkCompletedObjective(ObjectiveChargeDevice) - Nod.MarkCompletedObjective(ObjectiveProtectLiquidTib) - end - else - Notification("No liquid Tiberium to drop off.") - end - end - end) + UpdateMissionText() + + if Difficulty == "easy" then + NormalHardOnlyCarrier1.Destroy() + NormalHardOnlyCarrier2.Destroy() + end + + if Difficulty ~= "hard" then + HardOnlyCarrier1.Destroy() + end + + Trigger.OnKilled(LiquidTibFacility, function(self, killer) + if not Nod.IsObjectiveCompleted(ObjectiveProtectLiquidTib) then + Nod.MarkFailedObjective(ObjectiveProtectLiquidTib) + end + end) + + Trigger.AfterDelay(AdjustTimeForGameSpeed(DateTime.Seconds(2)), function() + Media.DisplayMessage("Commander, we must bring the device to full power as quickly as possible. Transporting crystals will take too long, so liquid Tiberium is our only option. We have set up a liquid T production facility. Do not let it be destroyed, and as each shipment becomes available load it into a tanker and bring it to the entrance of the cave system.", "Kane", HSLColor.FromHex("FF0000")) + MediaCA.PlaySound("kane_liquidt.aud", 2) + Trigger.AfterDelay(AdjustTimeForGameSpeed(DateTime.Seconds(18)), function() + Tip("Move a tanker next to the processing plant to pick up a prepared shipment, then take it to the cave entrance in the north-east.") + Utils.Do({ InitAttacker1, InitAttacker2, InitAttacker3, InitAttacker4 }, function(a) + if not a.IsDead then + a.AttackMove(PlayerStart.Location) + end + end) + Trigger.AfterDelay(DateTime.Seconds(10), function() + Utils.Do({ InitAttacker5, InitAttacker6, InitAttacker7 }, function(a) + if not a.IsDead then + a.AttackMove(PlayerStart.Location) + end + end) + end) + end) + end) + + Trigger.OnEnteredFootprint({ LiquidTibPickup1.Location, LiquidTibPickup2.Location }, function(a) + if a.Owner == Nod and not a.IsDead and a.Type == "ttrk" then + if LiquidTibFacility.AmmoCount("primary") == 0 then + Notification("No liquid Tiberium currently available for pickup.") + end + end + end) + + Trigger.OnEnteredFootprint({ CaveEntrance.Location, LiquidTibDropOff1.Location, LiquidTibDropOff2.Location, LiquidTibDropOff3.Location }, function(a) + if a.Owner == Nod and not a.IsDead and a.Type == "ttrk" then + if a.AmmoCount("primary") == 1 then + a.Reload("primary", -1) + ShipmentsComplete = ShipmentsComplete + 1 + Notification("Liquid Tiberium shipment delivered.") + MediaCA.PlaySound("n_liquidtibdelivered.aud", 2) + UpdateMissionText() + if ShipmentsComplete == 5 then + PurificationWave() + Nod.MarkCompletedObjective(ObjectiveChargeDevice) + Nod.MarkCompletedObjective(ObjectiveProtectLiquidTib) + end + else + Notification("No liquid Tiberium to drop off.") + end + end + end) end Tick = function() @@ -189,32 +189,32 @@ OncePerSecondChecks = function() TimerTicks = TimerTicks - 25 else TimerTicks = 0 - LiquidTibProduced() + LiquidTibProduced() end UpdateMissionText() end - if LiquidTibFacility.AmmoCount("primary") > 0 then - local nearbyTrucks = Map.ActorsInBox(LiquidTibPickup1.CenterPosition, LiquidTibPickup2.CenterPosition, function(a) - return a.Owner == Nod and not a.IsDead and a.Type == "ttrk" - end) - - Utils.Do(nearbyTrucks, function(t) - if t.AmmoCount("primary") == 0 then - t.Reload("primary", 1) - LiquidTibFacility.Reload("primary", -1) - Notification("Liquid Tiberium transfer complete.") - Beacon.New(Nod, t.CenterPosition) - return - end - end) - end - - if ObjectiveDestroyRemainingLoyalists ~= nil then - if Scrin.HasNoRequiredUnits() then - Nod.MarkCompletedObjective(ObjectiveDestroyRemainingLoyalists) - end - end + if LiquidTibFacility.AmmoCount("primary") > 0 then + local nearbyTrucks = Map.ActorsInBox(LiquidTibPickup1.CenterPosition, LiquidTibPickup2.CenterPosition, function(a) + return a.Owner == Nod and not a.IsDead and a.Type == "ttrk" + end) + + Utils.Do(nearbyTrucks, function(t) + if t.AmmoCount("primary") == 0 then + t.Reload("primary", 1) + LiquidTibFacility.Reload("primary", -1) + Notification("Liquid Tiberium transfer complete.") + Beacon.New(Nod, t.CenterPosition) + return + end + end) + end + + if ObjectiveDestroyRemainingLoyalists ~= nil then + if Scrin.HasNoRequiredUnits() then + Nod.MarkCompletedObjective(ObjectiveDestroyRemainingLoyalists) + end + end end end @@ -222,13 +222,13 @@ OncePerFiveSecondChecks = function() if DateTime.GameTime > 1 and DateTime.GameTime % 125 == 0 then UpdatePlayerBaseLocation() - if not ScrinReinforcementsEnabled then - local scrinProducerActors = Scrin.GetActorsByTypes({ "sfac", "wsph", "port" }) + if not ScrinReinforcementsEnabled then + local scrinProducerActors = Scrin.GetActorsByTypes({ "sfac", "wsph", "port" }) - if #scrinProducerActors == 0 then - InitScrinReinforcements() - end - end + if #scrinProducerActors == 0 then + InitScrinReinforcements() + end + end end end @@ -247,7 +247,7 @@ InitScrin = function() end) if Difficulty == "hard" then - Actor.Create("ioncon.upgrade", true, { Owner = Scrin }) + Actor.Create("ioncon.upgrade", true, { Owner = Scrin }) Actor.Create("shields.upgrade", true, { Owner = Scrin }) Trigger.AfterDelay(DateTime.Minutes(15), function() @@ -255,9 +255,9 @@ InitScrin = function() end) end - BeginScrinAttacks() + BeginScrinAttacks() - Trigger.AfterDelay(RiftEnabledTime[Difficulty], function() + Trigger.AfterDelay(RiftEnabledTime[Difficulty], function() if not RiftGenerator.IsDead then RiftGenerator.GrantCondition("rift-enabled") end @@ -270,158 +270,158 @@ BeginScrinAttacks = function() end) Trigger.AfterDelay(Squads.ScrinAir.Delay[Difficulty], function() - InitAirAttackSquad(Squads.ScrinAir, Scrin, Nod, { "harv", "harv.td", "arty.nod", "mlrs", "obli", "gun.nod", "wtnk", "hq", "tmpl", "nuk2", "rmbc", "enli", "tplr" }) + InitAirAttackSquad(Squads.ScrinAir, Scrin, Nod, { "harv", "harv.td", "arty.nod", "mlrs", "obli", "gun.nod", "wtnk", "hq", "tmpl", "nuk2", "rmbc", "enli", "tplr" }) end) end UpdateMissionText = function() - if Nod.IsObjectiveCompleted(ObjectiveChargeDevice) then - UserInterface.SetMissionText("") - return - end - - local shipmentsText = "Shipments complete: " .. ShipmentsComplete .. "/5" - local cooldownText = " -- Next shipment ready in " .. Utils.FormatTime(TimerTicks) - UserInterface.SetMissionText(shipmentsText .. cooldownText, HSLColor.Yellow) + if Nod.IsObjectiveCompleted(ObjectiveChargeDevice) then + UserInterface.SetMissionText("") + return + end + + local shipmentsText = "Shipments complete: " .. ShipmentsComplete .. "/5" + local cooldownText = " -- Next shipment ready in " .. Utils.FormatTime(TimerTicks) + UserInterface.SetMissionText(shipmentsText .. cooldownText, HSLColor.Yellow) end LiquidTibProduced = function() - if Nod.IsObjectiveCompleted(ObjectiveChargeDevice) then - return - end - - TimerTicks = LiquidTibCooldown - Notification("Liquid Tiberium shipment ready.") - MediaCA.PlaySound("n_liquidtibready.aud", 2) - - if not LiquidTibFacility.IsDead then - LiquidTibFacility.Reload("primary", 1) - Beacon.New(Nod, LiquidTibFacility.CenterPosition) - end + if Nod.IsObjectiveCompleted(ObjectiveChargeDevice) then + return + end + + TimerTicks = LiquidTibCooldown + Notification("Liquid Tiberium shipment ready.") + MediaCA.PlaySound("n_liquidtibready.aud", 2) + + if not LiquidTibFacility.IsDead then + LiquidTibFacility.Reload("primary", 1) + Beacon.New(Nod, LiquidTibFacility.CenterPosition) + end end PurificationWave = function() - ObjectivePurify = Nod.AddObjective("Await the purification wave.") - - Trigger.AfterDelay(AdjustTimeForGameSpeed(DateTime.Seconds(2)), function() - Media.DisplayMessage("Well done commander! The device is at full power, and will soon release its purifying energy. The question is, will the Scrin fight for their freedom against the Overlord, or cower in servitude even after such heinous treachery is revealed?", "Kane", HSLColor.FromHex("FF0000")) - MediaCA.PlaySound("kane_purification.aud", 2) - - Trigger.AfterDelay(AdjustTimeForGameSpeed(DateTime.Seconds(14)), function() - MediaCA.PlaySound("purification.aud", 2) - Trigger.AfterDelay(AdjustTimeForGameSpeed(DateTime.Seconds(9)), function() - PurificationComplete = true - Lighting.Flash("Purification", AdjustTimeForGameSpeed(10)) - ObjectiveDestroyRemainingLoyalists = Nod.AddObjective("Eliminate any hostile Scrin remaining.") - Nod.MarkCompletedObjective(ObjectivePurify) - PurifyScrin() - InitScrinReinforcements() - InitRebelReinforcements() - if not IslandGrav1.IsDead then - IslandGrav1.Kill() - end - if not IslandGrav2.IsDead then - IslandGrav2.Kill() - end - Trigger.AfterDelay(1, function() - local wormholes = Scrin.GetActorsByType("wormhole") - Utils.Do(wormholes, function(w) - if not w.IsDead then - w.GrantCondition("regen-disabled") - end - end) - end) - Trigger.AfterDelay(AdjustTimeForGameSpeed(4), function() - Lighting.Flash("Purification", AdjustTimeForGameSpeed(10)) - Trigger.AfterDelay(AdjustTimeForGameSpeed(4), function() - Lighting.Flash("Purification", AdjustTimeForGameSpeed(10)) - Trigger.AfterDelay(AdjustTimeForGameSpeed(4), function() - Lighting.Flash("Purification", AdjustTimeForGameSpeed(10)) - end) - end) - end) - end) - end) - end) + ObjectivePurify = Nod.AddObjective("Await the purification wave.") + + Trigger.AfterDelay(AdjustTimeForGameSpeed(DateTime.Seconds(2)), function() + Media.DisplayMessage("Well done commander! The device is at full power, and will soon release its purifying energy. The question is, will the Scrin fight for their freedom against the Overlord, or cower in servitude even after such heinous treachery is revealed?", "Kane", HSLColor.FromHex("FF0000")) + MediaCA.PlaySound("kane_purification.aud", 2) + + Trigger.AfterDelay(AdjustTimeForGameSpeed(DateTime.Seconds(14)), function() + MediaCA.PlaySound("purification.aud", 2) + Trigger.AfterDelay(AdjustTimeForGameSpeed(DateTime.Seconds(9)), function() + PurificationComplete = true + Lighting.Flash("Purification", AdjustTimeForGameSpeed(10)) + ObjectiveDestroyRemainingLoyalists = Nod.AddObjective("Eliminate any hostile Scrin remaining.") + Nod.MarkCompletedObjective(ObjectivePurify) + PurifyScrin() + InitScrinReinforcements() + InitRebelReinforcements() + if not IslandGrav1.IsDead then + IslandGrav1.Kill() + end + if not IslandGrav2.IsDead then + IslandGrav2.Kill() + end + Trigger.AfterDelay(1, function() + local wormholes = Scrin.GetActorsByType("wormhole") + Utils.Do(wormholes, function(w) + if not w.IsDead then + w.GrantCondition("regen-disabled") + end + end) + end) + Trigger.AfterDelay(AdjustTimeForGameSpeed(4), function() + Lighting.Flash("Purification", AdjustTimeForGameSpeed(10)) + Trigger.AfterDelay(AdjustTimeForGameSpeed(4), function() + Lighting.Flash("Purification", AdjustTimeForGameSpeed(10)) + Trigger.AfterDelay(AdjustTimeForGameSpeed(4), function() + Lighting.Flash("Purification", AdjustTimeForGameSpeed(10)) + end) + end) + end) + end) + end) + end) end PurifyScrin = function() - local scrinGroundUnits = Utils.Shuffle(Utils.Where(Scrin.GetGroundAttackers(), IsScrinGroundHunterUnit)) - local count = 1 - - Utils.Do(scrinGroundUnits, function(a) - Purify(a, count) - count = count + 1 - if count > 10 then - count = 1 - end + local scrinGroundUnits = Utils.Shuffle(Utils.Where(Scrin.GetGroundAttackers(), IsScrinGroundHunterUnit)) + local count = 1 + + Utils.Do(scrinGroundUnits, function(a) + Purify(a, count) + count = count + 1 + if count > 10 then + count = 1 + end end) - local scrinAirUnits = Scrin.GetActorsByTypes({ "pac", "deva" }) - count = 1 + local scrinAirUnits = Scrin.GetActorsByTypes({ "pac", "deva" }) + count = 1 - Utils.Do(scrinAirUnits, function(a) - Purify(a, count) - count = count + 1 - if count > 10 then - count = 1 - end - end) + Utils.Do(scrinAirUnits, function(a) + Purify(a, count) + count = count + 1 + if count > 10 then + count = 1 + end + end) end Purify = function(a, count) - Trigger.ClearAll(a) - local shouldConvert = false - - if Difficulty == "easy" and count % 3 > 0 then - shouldConvert = true - elseif count % 2 == 0 then - shouldConvert = true - end - - if shouldConvert then - a.Owner = ScrinRebels - end - Trigger.AfterDelay(1, function() - IdleHunt(a) - end) + Trigger.ClearAll(a) + local shouldConvert = false + + if Difficulty == "easy" and count % 3 > 0 then + shouldConvert = true + elseif count % 2 == 0 then + shouldConvert = true + end + + if shouldConvert then + a.Owner = ScrinRebels + end + Trigger.AfterDelay(1, function() + IdleHunt(a) + end) end InitScrinReinforcements = function() - if not ScrinReinforcementsEnabled then - ScrinReinforcementsEnabled = true - Utils.Do(ScrinReinforcementSpawns, function(s) - SpawnWormhole(s.Location) - end) - Utils.Do({ ScrinHiddenSpawn1.Location, ScrinHiddenSpawn2.Location, ScrinHiddenSpawn3.Location, ScrinHiddenSpawn4.Location, ScrinHiddenSpawn5.Location, ScrinHiddenSpawn6.Location }, function(loc) - Actor.Create("hiddenspawner", true, { Owner = Scrin, Location = loc }) - end) - end + if not ScrinReinforcementsEnabled then + ScrinReinforcementsEnabled = true + Utils.Do(ScrinReinforcementSpawns, function(s) + SpawnWormhole(s.Location) + end) + Utils.Do({ ScrinHiddenSpawn1.Location, ScrinHiddenSpawn2.Location, ScrinHiddenSpawn3.Location, ScrinHiddenSpawn4.Location, ScrinHiddenSpawn5.Location, ScrinHiddenSpawn6.Location }, function(loc) + Actor.Create("hiddenspawner", true, { Owner = Scrin, Location = loc }) + end) + end end SpawnWormhole = function(loc) - local wormhole = Actor.Create("wormhole", true, { Owner = Scrin, Location = loc }) - Trigger.OnKilled(wormhole, function() - Trigger.AfterDelay(DateTime.Minutes(1), function() - if not Nod.IsObjectiveCompleted(ObjectiveChargeDevice) then - SpawnWormhole(loc) - end - end) - end) + local wormhole = Actor.Create("wormhole", true, { Owner = Scrin, Location = loc }) + Trigger.OnKilled(wormhole, function() + Trigger.AfterDelay(DateTime.Minutes(1), function() + if not Nod.IsObjectiveCompleted(ObjectiveChargeDevice) then + SpawnWormhole(loc) + end + end) + end) end InitRebelReinforcements = function() - local rebelSpawns = { RebelSpawnPoint1, RebelSpawnPoint2 } + local rebelSpawns = { RebelSpawnPoint1, RebelSpawnPoint2 } - Utils.Do(rebelSpawns, function(s) - local wormhole = Actor.Create("wormhole", true, { Owner = ScrinRebels, Location = s.Location }) - local units = Reinforcements.Reinforce(ScrinRebels, { "s1", "s3", "intl.ai2", "devo", "s4", "s1", "tpod", "gscr", "intl", "s1", "s1" }, { wormhole.Location }, 10) + Utils.Do(rebelSpawns, function(s) + local wormhole = Actor.Create("wormhole", true, { Owner = ScrinRebels, Location = s.Location }) + local units = Reinforcements.Reinforce(ScrinRebels, { "s1", "s3", "intl.ai2", "devo", "s4", "s1", "tpod", "gscr", "intl", "s1", "s1" }, { wormhole.Location }, 10) - Utils.Do(units, function(a) - a.AttackMove(ScrinBaseCenter.Location) - IdleHunt(a) - end) - end) + Utils.Do(units, function(a) + a.AttackMove(ScrinBaseCenter.Location) + IdleHunt(a) + end) + end) - InitAttackSquad(Squads.ScrinRebelsMain, ScrinRebels, Scrin) + InitAttackSquad(Squads.ScrinRebelsMain, ScrinRebels, Scrin) end diff --git a/mods/ca/maps/duality-coop/duality-coop.lua b/mods/ca/maps/duality-coop/duality-coop.lua index 4bb1873628..4329cb2e28 100644 --- a/mods/ca/maps/duality-coop/duality-coop.lua +++ b/mods/ca/maps/duality-coop/duality-coop.lua @@ -31,9 +31,9 @@ ScrinReinforcementInterval = { } WorldLoaded = function() - GDI = Player.GetPlayer("GDI") + GDI = Player.GetPlayer("GDI") Greece = Player.GetPlayer("Greece") - Scrin = Player.GetPlayer("Scrin") + Scrin = Player.GetPlayer("Scrin") MissionPlayer = GDI TimerTicks = TimeLimit[Difficulty] Players = { GDI, Greece } diff --git a/mods/ca/maps/scrinfestation/scrinfestation.lua b/mods/ca/maps/scrinfestation/scrinfestation.lua index 2c91a49b78..82fc059b75 100644 --- a/mods/ca/maps/scrinfestation/scrinfestation.lua +++ b/mods/ca/maps/scrinfestation/scrinfestation.lua @@ -3,17 +3,17 @@ Players = Player.GetPlayers(function(p) return p.Team == 1 end) AttackPaths = { { - { NW2.Location, NW3.Location, NW4.Location, NW5.Location, NW6.Location, NW7.Location, NW8.Location, NW9.Location }, - { NE4.Location, NE5.Location, NE6.Location, NE7.Location }, - }, + { NW2.Location, NW3.Location, NW4.Location, NW5.Location, NW6.Location, NW7.Location, NW8.Location, NW9.Location }, + { NE4.Location, NE5.Location, NE6.Location, NE7.Location }, + }, { - { NE2.Location, NE3.Location, NE4.Location, NE5.Location, NE6.Location, NE7.Location }, - { NE2.Location, NE3.Location, NE4.Location, NW4.Location, NW5.Location, NW6.Location, NW7.Location, NW8.Location, NW9.Location }, + { NE2.Location, NE3.Location, NE4.Location, NE5.Location, NE6.Location, NE7.Location }, + { NE2.Location, NE3.Location, NE4.Location, NW4.Location, NW5.Location, NW6.Location, NW7.Location, NW8.Location, NW9.Location }, }, { - { SE2.Location, NE3.Location, NE4.Location, NE5.Location, NE6.Location, NE7.Location }, - { SE2.Location, NE3.Location, NE4.Location, NW4.Location, NW5.Location, NW6.Location, NW7.Location, NW8.Location, NW9.Location }, - }, + { SE2.Location, NE3.Location, NE4.Location, NE5.Location, NE6.Location, NE7.Location }, + { SE2.Location, NE3.Location, NE4.Location, NW4.Location, NW5.Location, NW6.Location, NW7.Location, NW8.Location, NW9.Location }, + }, } Wormholes = { WormholeNW, WormholeNE, WormholeSE } @@ -22,17 +22,17 @@ ScrinSquads = { {"s1", "s1", "s1", "s2", "gscr"}, {"s1", "s1", "s1", "s3", "gscr"}, {"s1", "s1", "s1", "s4", "gscr"}, - {"s1", "s1", "s1", "brst2", "gscr"}, + {"s1", "s1", "s1", "brst2", "gscr"}, {"gscr", "gscr", "gscr"}, {"s4", "s4", "s4"}, {"s1", "s1", "s1", "s1", "s1"}, {"s2", "s2", "s2"}, {"s3", "s3", "s1", "s1"}, - {"brst2", "brst2", "s1", "s1"}, + {"brst2", "brst2", "s1", "s1"}, } GetNumPlayers = function() - local num = 0 + local num = 0 Utils.Do(Players, function(player) if player.InternalName ~= "Neutral" then @@ -41,7 +41,7 @@ GetNumPlayers = function() end end) - return num + return num end IdleHunt = function(actor) @@ -72,11 +72,11 @@ SendScrinUnits = function(wormhole, attackPaths) local interval = math.floor((120 / GetNumPlayers()) + 0.5) + Utils.RandomInteger(-3,3) local unitTypes = Utils.Random(ScrinSquads); local units = Reinforcements.Reinforce(Scrin, unitTypes, { wormhole.Location }, 15) - local attackPath = attackPaths[1] + local attackPath = attackPaths[1] - if GetNumPlayers() > 2 then - attackPath = Utils.Random(attackPaths) - end + if GetNumPlayers() > 2 then + attackPath = Utils.Random(attackPaths) + end Utils.Do(units, function(unit) unit.Patrol(attackPath, true, 50) @@ -119,22 +119,22 @@ WorldLoaded = function() SendScrinUnits(WormholeSE, AttackPaths[3]) end - local scrinUnits = Scrin.GetActorsByTypes({"gunw", "corr", "ruin", "lchr", "dark", "ptur"}) - - Utils.Do(scrinUnits, function(unit) - Trigger.OnDamaged(unit, function(self, attacker, damage) - if attacker.EffectiveOwner == Scrin then - return - end - local rand = Utils.RandomInteger(1,100) - if rand > 90 then - if unit.HasProperty("Attack") and not unit.IsDead then - unit.Stop() - unit.Attack(attacker) - end - end - end) - end) + local scrinUnits = Scrin.GetActorsByTypes({"gunw", "corr", "ruin", "lchr", "dark", "ptur"}) + + Utils.Do(scrinUnits, function(unit) + Trigger.OnDamaged(unit, function(self, attacker, damage) + if attacker.EffectiveOwner == Scrin then + return + end + local rand = Utils.RandomInteger(1,100) + if rand > 90 then + if unit.HasProperty("Attack") and not unit.IsDead then + unit.Stop() + unit.Attack(attacker) + end + end + end) + end) Trigger.OnAllKilledOrCaptured(Wormholes, function() local actors = Scrin.GetActors() diff --git a/mods/ca/maps/shellmap/shellmap.lua b/mods/ca/maps/shellmap/shellmap.lua index fdac95c95e..5c8f6f54a4 100644 --- a/mods/ca/maps/shellmap/shellmap.lua +++ b/mods/ca/maps/shellmap/shellmap.lua @@ -259,9 +259,9 @@ WorldLoaded = function() Actor.Create("sidewinders.upgrade", true, { Owner = GDI }) Actor.Create("shields.upgrade", true, { Owner = Scrin }) Actor.Create("alphacomanche.upgrade", true, { Owner = Nod }) - Actor.Create("tibcore.upgrade", true, { Owner = Nod }) + Actor.Create("tibcore.upgrade", true, { Owner = Nod }) - XODropProxy = Actor.Create("powerproxy.paratroopers.xo", true, { Owner = GDI, }) + XODropProxy = Actor.Create("powerproxy.paratroopers.xo", true, { Owner = GDI, }) AutoRepairAndRebuildBuildings(Greece) AutoReplaceHarvesters(Greece) @@ -277,7 +277,7 @@ WorldLoaded = function() local civilians = Civilian.GetActorsByTypes({ "c1", "c2", "c3", "c4", "c5", "c6", "c7", "c8", "c9", "c10", "tecn" }) Utils.Do(civilians, function(a) local rand = Utils.RandomInteger(1,3) - a.Wait(Utils.RandomInteger(1,50)) + a.Wait(Utils.RandomInteger(1,50)) if rand == 1 then a.Move(CivilianRetreat1.Location) else @@ -347,7 +347,7 @@ WorldLoaded = function() end) Trigger.AfterDelay(DateTime.Seconds(8), function() - local nodGroup3 = Map.ActorsInCircle(NodGroup3.CenterPosition, WDist.FromCells(4), function(a) + local nodGroup3 = Map.ActorsInCircle(NodGroup3.CenterPosition, WDist.FromCells(4), function(a) return a.Owner == Nod and not a.IsDead and a.HasProperty("AttackMove") end) Utils.Do(nodGroup3, function(a) @@ -359,16 +359,16 @@ WorldLoaded = function() a.Patrol({ AlliedShipsDest.Location, AlliedShipsStart.Location }) end) - Trigger.AfterDelay(DateTime.Seconds(7), function() - local nodShips = Nod.GetActorsByTypes({ "ss2", "sb" }) - Utils.Do(nodShips, function(a) - a.AttackMove(AlliedShipsStart.Location) + Trigger.AfterDelay(DateTime.Seconds(7), function() + local nodShips = Nod.GetActorsByTypes({ "ss2", "sb" }) + Utils.Do(nodShips, function(a) + a.AttackMove(AlliedShipsStart.Location) Trigger.OnIdle(a, function(self) a.Move(AlliedShipsStart.Location) a.Destroy() end) - end) - end) + end) + end) end) Trigger.AfterDelay(DateTime.Seconds(35), function() @@ -381,18 +381,18 @@ WorldLoaded = function() end) end) - Trigger.AfterDelay(DateTime.Seconds(28), function() - Utils.Do({ Warthog1, Warthog2, Warthog3, Aurora1, Aurora2 }, function(a) - if not a.IsDead then - if a.Type == "a10" then - a.GrantCondition("speed-boost") - end - a.Stance = "HoldFire" - a.Move(AirstrikeDest.Location) - a.Destroy() - end - end) - end) + Trigger.AfterDelay(DateTime.Seconds(28), function() + Utils.Do({ Warthog1, Warthog2, Warthog3, Aurora1, Aurora2 }, function(a) + if not a.IsDead then + if a.Type == "a10" then + a.GrantCondition("speed-boost") + end + a.Stance = "HoldFire" + a.Move(AirstrikeDest.Location) + a.Destroy() + end + end) + end) Trigger.AfterDelay(DateTime.Seconds(120), function() DoSealDrop() @@ -411,9 +411,9 @@ WorldLoaded = function() InitAttackSquad(Squads.NodVsGDI, Nod, GDI) InitAttackSquad(Squads.GDIVsNod, GDI, Nod) - Trigger.AfterDelay(DateTime.Seconds(30), function() - InitAttackSquad(Squads.ScrinVsGDI, Scrin, GDI) - end) + Trigger.AfterDelay(DateTime.Seconds(30), function() + InitAttackSquad(Squads.ScrinVsGDI, Scrin, GDI) + end) Trigger.AfterDelay(DateTime.Seconds(85), function() InitAttackSquad(Squads.GDIVsSoviets, GDI, USSR) @@ -422,16 +422,16 @@ WorldLoaded = function() InitAttackSquad(Squads.NodVsScrin, Nod, Scrin) InitAttackSquad(Squads.ScrinVsNod, Scrin, Nod) - InitAirAttackSquad(Squads.GDIAir, GDI, Scrin, { "stmr", "enrv", "tpod", "devo", "ruin", "pac", "deva" }) - InitAirAttackSquad(Squads.SovietAir, USSR, GDI, { "orca", "a10", "msam", "htnk", "titn", "htnk.ion", "htnk.hover", "htnk.drone", "jugg" }) - InitAirAttackSquad(Squads.ScrinAir, Scrin, GDI, { "orca", "a10", "msam", "htnk", "titn", "htnk.ion", "htnk.hover", "htnk.drone", "jugg" }) + InitAirAttackSquad(Squads.GDIAir, GDI, Scrin, { "stmr", "enrv", "tpod", "devo", "ruin", "pac", "deva" }) + InitAirAttackSquad(Squads.SovietAir, USSR, GDI, { "orca", "a10", "msam", "htnk", "titn", "htnk.ion", "htnk.hover", "htnk.drone", "jugg" }) + InitAirAttackSquad(Squads.ScrinAir, Scrin, GDI, { "orca", "a10", "msam", "htnk", "titn", "htnk.ion", "htnk.hover", "htnk.drone", "jugg" }) end) InitAirAttackSquad(Squads.GDIAir, GDI, Nod, { "arty.nod", "mlrs", "scrn", "apch", "venm", "rah", "rmbc", "ltnk" }) InitAirAttackSquad(Squads.NodAir, Nod, GDI, { "orca", "a10", "msam", "htnk", "titn", "htnk.ion", "htnk.hover", "htnk.drone", "jugg" }) end) - DoXODrop() + DoXODrop() end DoSealDrop = function() @@ -464,11 +464,11 @@ DoSealDrop = function() end DoXODrop = function() - local aircraft = XODropProxy.TargetParatroopers(GDIAttack1.CenterPosition, Angle.East) + local aircraft = XODropProxy.TargetParatroopers(GDIAttack1.CenterPosition, Angle.East) - Utils.Do(aircraft, function(a) - Trigger.OnPassengerExited(a, function(t, p) - IdleHunt(p) - end) - end) + Utils.Do(aircraft, function(a) + Trigger.OnPassengerExited(a, function(t, p) + IdleHunt(p) + end) + end) end diff --git a/mods/ca/maps/team-scrinfestation/team-scrinfestation.lua b/mods/ca/maps/team-scrinfestation/team-scrinfestation.lua index d0cffb0619..88789923a5 100644 --- a/mods/ca/maps/team-scrinfestation/team-scrinfestation.lua +++ b/mods/ca/maps/team-scrinfestation/team-scrinfestation.lua @@ -42,13 +42,13 @@ ScrinSquads = { {"s1", "s1", "s1", "s2", "gscr"}, {"s1", "s1", "s1", "s3", "gscr"}, {"s1", "s1", "s1", "s4", "gscr"}, - {"s1", "s1", "s1", "brst2", "gscr"}, + {"s1", "s1", "s1", "brst2", "gscr"}, {"gscr", "gscr", "gscr"}, {"s4", "s4", "s4"}, {"s1", "s1", "s1", "s1", "s1"}, {"s2", "s2", "s2"}, {"s3", "s3", "s1", "s1"}, - {"brst2", "brst2", "s1", "s1"}, + {"brst2", "brst2", "s1", "s1"}, } GetNumPlayers = function(players) @@ -121,8 +121,8 @@ end WorldLoaded = function() Scrin = Player.GetPlayer("Scrin") Neutral = Player.GetPlayer("Neutral") - GDI = Player.GetPlayer("Scrin") - Nod = Player.GetPlayer("Nod") + GDI = Player.GetPlayer("Scrin") + Nod = Player.GetPlayer("Nod") local neutralSpawns = Neutral.GetActorsByType("rmbospawn") Utils.Do(neutralSpawns, function(a) @@ -130,10 +130,10 @@ WorldLoaded = function() end) local initialGdiPlayers = GetNumPlayers(GDIPlayers) - local initialNodPlayers = GetNumPlayers(NodPlayers) + local initialNodPlayers = GetNumPlayers(NodPlayers) SendScrinUnits(WormholeNE, GDIAttackPaths[2], initialGdiPlayers) - SendScrinUnits(Nod_WormholeNE, NodAttackPaths[2], initialNodPlayers) + SendScrinUnits(Nod_WormholeNE, NodAttackPaths[2], initialNodPlayers) if initialGdiPlayers > 1 then SendScrinUnits(WormholeNW, GDIAttackPaths[1], initialGdiPlayers) @@ -176,20 +176,20 @@ WorldLoaded = function() Media.DisplayMessage("GDI are victorious!", "Notification", HSLColor.FromHex("E5D19C")) - Trigger.AfterDelay(DateTime.Seconds(5), function() - Utils.Do(NodPlayers, function(nodPlayer) - local nodActors = nodPlayer.GetActors() - Utils.Do(nodActors, function(nodActor) - if nodActor.HasProperty("Kill") and not nodActor.IsDead then nodActor.Kill("BulletDeath") end - end) - end) + Trigger.AfterDelay(DateTime.Seconds(5), function() + Utils.Do(NodPlayers, function(nodPlayer) + local nodActors = nodPlayer.GetActors() + Utils.Do(nodActors, function(nodActor) + if nodActor.HasProperty("Kill") and not nodActor.IsDead then nodActor.Kill("BulletDeath") end + end) + end) Trigger.AfterDelay(DateTime.Seconds(2), function() Utils.Do(NodWormholes, function(w) w.Kill() end) end) - end) + end) end) Trigger.OnAllKilledOrCaptured(NodWormholes, function() @@ -200,13 +200,13 @@ WorldLoaded = function() Media.DisplayMessage("Nod are victorious!", "Notification", HSLColor.FromHex("FF0000")) - Trigger.AfterDelay(DateTime.Seconds(5), function() - Utils.Do(GDIPlayers, function(gdiPlayer) - local gdiActors = gdiPlayer.GetActors() - Utils.Do(gdiActors, function(gdiActor) - if gdiActor.HasProperty("Kill") and not gdiActor.IsDead then gdiActor.Kill("BulletDeath") end - end) - end) + Trigger.AfterDelay(DateTime.Seconds(5), function() + Utils.Do(GDIPlayers, function(gdiPlayer) + local gdiActors = gdiPlayer.GetActors() + Utils.Do(gdiActors, function(gdiActor) + if gdiActor.HasProperty("Kill") and not gdiActor.IsDead then gdiActor.Kill("BulletDeath") end + end) + end) Trigger.AfterDelay(DateTime.Seconds(2), function() Utils.Do(Wormholes, function(w) @@ -215,7 +215,7 @@ WorldLoaded = function() end end) end) - end) + end) end) Utils.Do(Players, function(player) diff --git a/mods/ca/maps/tfca/tfca.lua b/mods/ca/maps/tfca/tfca.lua index 6ca2cd5255..d6aa32b60d 100644 --- a/mods/ca/maps/tfca/tfca.lua +++ b/mods/ca/maps/tfca/tfca.lua @@ -2,322 +2,322 @@ UnitsPerPlayer = tonumber(Map.LobbyOption("unitsperplayer")) WinScore = tonumber(Map.LobbyOption("winscore")) WorldLoaded = function() - Blue = Player.GetPlayer("Blue") - Red = Player.GetPlayer("Red") - Neutral = Player.GetPlayer("Neutral") - BlueScore = 0 - RedScore = 0 - - Media.DisplayMessage("Loading...", "Notification", HSLColor.Lime) - - Players = Player.GetPlayers(function(p) return (p.Team == 1 or p.Team == 2) and not p.IsNonCombatant and p.InternalName ~= "Blue" and p.InternalName ~= "Red" end) - BluePlayers = Player.GetPlayers(function(p) return p.Team == 1 and not p.IsNonCombatant and p.InternalName ~= "Blue" and p.InternalName ~= "Red" end) - RedPlayers = Player.GetPlayers(function(p) return p.Team == 2 and not p.IsNonCombatant and p.InternalName ~= "Blue" and p.InternalName ~= "Red" end) - BotPlayers = Player.GetPlayers(function(p) return p.IsBot and p.InternalName ~= "Blue" and p.InternalName ~= "Red" end) - BuildableUnitTypes = { "seal", "e3", "e4", "ivan", "snip", "medi", "xo", "e6", "sab" } - BotInfo = { } - BotEngiTurrets = { - -- engistring = turret - } - - Objectives = { - Tech = { Actor = Tech, Waypoints = { Tech1, Tech2, Tech3, Tech4 }, Name = "Tech Center" }, - Power = { Actor = Power, Waypoints = { Power1, Power2, Power3 }, Name = "Power Plant" }, - Ref = { Actor = Ref, Waypoints = { Ref1, Ref2, Ref3, Ref4, Ref5 }, Name = "Refinery" }, - Comms = { Actor = Comms, Waypoints = { Comms1, Comms2, Comms3, Comms4 }, Name = "Comms Center" }, - Dome = { Actor = Dome, Waypoints = { Dome1, Dome2, Dome3, Dome4 }, Name = "Radar Dome" } - } - - Utils.Do(Objectives, function(o) - Trigger.OnCapture(o.Actor, function(self, captor, oldOwner, newOwner) - if newOwner.Team == 1 then - Media.DisplayMessage("The blue team have captured the " .. o.Name .. "!", "Notification", HSLColor.FromHex("0080FF")) - self.Owner = Blue - elseif newOwner.Team == 2 then - Media.DisplayMessage("The red team have captured the " .. o.Name .. "!", "Notification", HSLColor.Red) - self.Owner = Red - end - end) - end) - - Trigger.AfterDelay(1, function() - BotSetup() - - Utils.Do(Players, function(p) - p.Cash = UnitsPerPlayer - local spawnPoints = p.GetActorsByType("spawn") - - if #spawnPoints > 0 then - spawnPoint = spawnPoints[1] - local spawner = Actor.Create("spawn", true, { Owner = p, Location = spawnPoint.Location }) - Trigger.OnProduction(spawner, function(producer, produced) - Trigger.OnKilled(produced, function(self, killer) - Trigger.AfterDelay(DateTime.Seconds(10), function() - self.Owner.Cash = self.Owner.Cash + 1 - end) - end) - end) - end - end) - - BalanceUnits = Blue.HasPrerequisites({ "global.balanceunits" }) - - if BalanceUnits then - if #BluePlayers > #RedPlayers and #RedPlayers > 0 then - Media.DisplayMessage("Blue team has more players. Allocating extra credits.", "Notification", HSLColor.Yellow) - local redExtra = (#BluePlayers - #RedPlayers) * UnitsPerPlayer - local redPlayerIdx = 1 - - while(redExtra > 0) - do - RedPlayers[redPlayerIdx].Cash = RedPlayers[redPlayerIdx].Cash + 1 - - if #RedPlayers > redPlayerIdx then - redPlayerIdx = redPlayerIdx + 1 - else - redPlayerIdx = 1 - end - - redExtra = redExtra - 1 - end - - elseif #RedPlayers > #BluePlayers and #BluePlayers > 0 then - Media.DisplayMessage("Red team has more players. Allocating extra credits.", "Notification", HSLColor.Yellow) - local blueExtra = (#RedPlayers - #BluePlayers) * UnitsPerPlayer - local bluePlayerIdx = 1 - - while(blueExtra > 0) - do - BluePlayers[bluePlayerIdx].Cash = BluePlayers[bluePlayerIdx].Cash + 1 - - if #BluePlayers > bluePlayerIdx then - bluePlayerIdx = bluePlayerIdx + 1 - else - bluePlayerIdx = 1 - end - - blueExtra = blueExtra - 1 - end - end - end - end) + Blue = Player.GetPlayer("Blue") + Red = Player.GetPlayer("Red") + Neutral = Player.GetPlayer("Neutral") + BlueScore = 0 + RedScore = 0 + + Media.DisplayMessage("Loading...", "Notification", HSLColor.Lime) + + Players = Player.GetPlayers(function(p) return (p.Team == 1 or p.Team == 2) and not p.IsNonCombatant and p.InternalName ~= "Blue" and p.InternalName ~= "Red" end) + BluePlayers = Player.GetPlayers(function(p) return p.Team == 1 and not p.IsNonCombatant and p.InternalName ~= "Blue" and p.InternalName ~= "Red" end) + RedPlayers = Player.GetPlayers(function(p) return p.Team == 2 and not p.IsNonCombatant and p.InternalName ~= "Blue" and p.InternalName ~= "Red" end) + BotPlayers = Player.GetPlayers(function(p) return p.IsBot and p.InternalName ~= "Blue" and p.InternalName ~= "Red" end) + BuildableUnitTypes = { "seal", "e3", "e4", "ivan", "snip", "medi", "xo", "e6", "sab" } + BotInfo = { } + BotEngiTurrets = { + -- engistring = turret + } + + Objectives = { + Tech = { Actor = Tech, Waypoints = { Tech1, Tech2, Tech3, Tech4 }, Name = "Tech Center" }, + Power = { Actor = Power, Waypoints = { Power1, Power2, Power3 }, Name = "Power Plant" }, + Ref = { Actor = Ref, Waypoints = { Ref1, Ref2, Ref3, Ref4, Ref5 }, Name = "Refinery" }, + Comms = { Actor = Comms, Waypoints = { Comms1, Comms2, Comms3, Comms4 }, Name = "Comms Center" }, + Dome = { Actor = Dome, Waypoints = { Dome1, Dome2, Dome3, Dome4 }, Name = "Radar Dome" } + } + + Utils.Do(Objectives, function(o) + Trigger.OnCapture(o.Actor, function(self, captor, oldOwner, newOwner) + if newOwner.Team == 1 then + Media.DisplayMessage("The blue team have captured the " .. o.Name .. "!", "Notification", HSLColor.FromHex("0080FF")) + self.Owner = Blue + elseif newOwner.Team == 2 then + Media.DisplayMessage("The red team have captured the " .. o.Name .. "!", "Notification", HSLColor.Red) + self.Owner = Red + end + end) + end) + + Trigger.AfterDelay(1, function() + BotSetup() + + Utils.Do(Players, function(p) + p.Cash = UnitsPerPlayer + local spawnPoints = p.GetActorsByType("spawn") + + if #spawnPoints > 0 then + spawnPoint = spawnPoints[1] + local spawner = Actor.Create("spawn", true, { Owner = p, Location = spawnPoint.Location }) + Trigger.OnProduction(spawner, function(producer, produced) + Trigger.OnKilled(produced, function(self, killer) + Trigger.AfterDelay(DateTime.Seconds(10), function() + self.Owner.Cash = self.Owner.Cash + 1 + end) + end) + end) + end + end) + + BalanceUnits = Blue.HasPrerequisites({ "global.balanceunits" }) + + if BalanceUnits then + if #BluePlayers > #RedPlayers and #RedPlayers > 0 then + Media.DisplayMessage("Blue team has more players. Allocating extra credits.", "Notification", HSLColor.Yellow) + local redExtra = (#BluePlayers - #RedPlayers) * UnitsPerPlayer + local redPlayerIdx = 1 + + while(redExtra > 0) + do + RedPlayers[redPlayerIdx].Cash = RedPlayers[redPlayerIdx].Cash + 1 + + if #RedPlayers > redPlayerIdx then + redPlayerIdx = redPlayerIdx + 1 + else + redPlayerIdx = 1 + end + + redExtra = redExtra - 1 + end + + elseif #RedPlayers > #BluePlayers and #BluePlayers > 0 then + Media.DisplayMessage("Red team has more players. Allocating extra credits.", "Notification", HSLColor.Yellow) + local blueExtra = (#RedPlayers - #BluePlayers) * UnitsPerPlayer + local bluePlayerIdx = 1 + + while(blueExtra > 0) + do + BluePlayers[bluePlayerIdx].Cash = BluePlayers[bluePlayerIdx].Cash + 1 + + if #BluePlayers > bluePlayerIdx then + bluePlayerIdx = bluePlayerIdx + 1 + else + bluePlayerIdx = 1 + end + + blueExtra = blueExtra - 1 + end + end + end + end) end Tick = function() - if DateTime.GameTime > 1 and DateTime.GameTime % 50 == 0 then - local blueObjectives = Blue.GetActorsByTypes({ "atek", "dome", "hq", "apwr", "proc" }) - local redObjectives = Red.GetActorsByTypes({ "atek", "dome", "hq", "apwr", "proc" }) - local scoreAmounts = { 2, 3, 4, 7, 60 } - - if #blueObjectives > 0 then - BlueScore = BlueScore + scoreAmounts[#blueObjectives] - end - - if #redObjectives > 0 then - RedScore = RedScore + scoreAmounts[#redObjectives] - end - - if BlueScore >= WinScore then - BlueScore = WinScore - BlueWins() - elseif RedScore >= WinScore then - RedScore = WinScore - RedWins() - end - - UpdateScoresText() - BotTick() - end + if DateTime.GameTime > 1 and DateTime.GameTime % 50 == 0 then + local blueObjectives = Blue.GetActorsByTypes({ "atek", "dome", "hq", "apwr", "proc" }) + local redObjectives = Red.GetActorsByTypes({ "atek", "dome", "hq", "apwr", "proc" }) + local scoreAmounts = { 2, 3, 4, 7, 60 } + + if #blueObjectives > 0 then + BlueScore = BlueScore + scoreAmounts[#blueObjectives] + end + + if #redObjectives > 0 then + RedScore = RedScore + scoreAmounts[#redObjectives] + end + + if BlueScore >= WinScore then + BlueScore = WinScore + BlueWins() + elseif RedScore >= WinScore then + RedScore = WinScore + RedWins() + end + + UpdateScoresText() + BotTick() + end end UpdateScoresText = function() - local color = HSLColor.White + local color = HSLColor.White - if BlueScore > RedScore then - color = HSLColor.FromHex("0080FF") - elseif RedScore > BlueScore then - color = HSLColor.Red - end + if BlueScore > RedScore then + color = HSLColor.FromHex("0080FF") + elseif RedScore > BlueScore then + color = HSLColor.Red + end - UserInterface.SetMissionText("Blue = " .. BlueScore .. " / " .. WinScore .. " -- vs -- Red = " .. RedScore .. " / " .. WinScore, color) + UserInterface.SetMissionText("Blue = " .. BlueScore .. " / " .. WinScore .. " -- vs -- Red = " .. RedScore .. " / " .. WinScore, color) end BlueWins = function() - Utils.Do(RedPlayers, function(p) - local spawns = p.GetActorsByType("spawn") - Utils.Do(spawns, function(s) - s.Destroy() - end) - end) - local spawnguns = Red.GetActorsByType("spawngun") - Utils.Do(spawnguns, function(g) - g.Kill() - end) - Utils.Do(Objectives, function(o) - o.Actor.Owner = Blue - end) + Utils.Do(RedPlayers, function(p) + local spawns = p.GetActorsByType("spawn") + Utils.Do(spawns, function(s) + s.Destroy() + end) + end) + local spawnguns = Red.GetActorsByType("spawngun") + Utils.Do(spawnguns, function(g) + g.Kill() + end) + Utils.Do(Objectives, function(o) + o.Actor.Owner = Blue + end) end RedWins = function() - Utils.Do(BluePlayers, function(p) - local spawns = p.GetActorsByType("spawn") - Utils.Do(spawns, function(s) - s.Destroy() - end) - end) - local spawnguns = Blue.GetActorsByType("spawngun") - Utils.Do(spawnguns, function(g) - g.Kill() - end) - Utils.Do(Objectives, function(o) - o.Actor.Owner = Red - end) + Utils.Do(BluePlayers, function(p) + local spawns = p.GetActorsByType("spawn") + Utils.Do(spawns, function(s) + s.Destroy() + end) + end) + local spawnguns = Blue.GetActorsByType("spawngun") + Utils.Do(spawnguns, function(g) + g.Kill() + end) + Utils.Do(Objectives, function(o) + o.Actor.Owner = Red + end) end BotSetup = function() - Utils.Do(BotPlayers, function(p) - local initialObjective - - if p.Team == 1 then - initialObjective = Objectives.Comms - else - initialObjective = Objectives.Dome - end - - BotInfo[p.InternalName] = { - FirstObjective = true, - CurrentObjective = initialObjective - } - end) + Utils.Do(BotPlayers, function(p) + local initialObjective + + if p.Team == 1 then + initialObjective = Objectives.Comms + else + initialObjective = Objectives.Dome + end + + BotInfo[p.InternalName] = { + FirstObjective = true, + CurrentObjective = initialObjective + } + end) end BotTick = function() - Utils.Do(BotPlayers, function(p) - local botUnits = p.GetActorsByTypes(BuildableUnitTypes) - local botInfo = BotInfo[p.InternalName] - - local alliedPlayers - if p.Team == 1 then - alliedPlayers = BluePlayers - else - alliedPlayers = RedPlayers - end - - -- if current objective is not set, or is already owned by an ally, set a new one - if botInfo.CurrentObjective == nil or p.IsAlliedWith(botInfo.CurrentObjective.Actor.Owner) then - SelectNewObjective(p, botUnits, botInfo) - - -- random chance to swap objectives every 25 seconds - elseif DateTime.GameTime > 1 and DateTime.GameTime % 625 == 0 and Utils.RandomInteger(0, 100) > 50 then - SelectNewObjective(p, botUnits, botInfo) - end - - -- if bot has money, make a unit - if p.Cash > 0 then - local chosenType = Utils.Random(BuildableUnitTypes) - - p.Build({ chosenType }, function(actors) - Utils.Do(actors, function(a) - - Trigger.OnIdle(a, function(self) - - if botInfo.CurrentObjective ~= nil then - - if self.Type == "medi" then - local randomTarget = RandomTargetToHeal(self, alliedPlayers) - if randomTarget ~= nil then - self.Guard(randomTarget) - end - end - - -- attack move to random location near current objective - local randomWaypoint = Utils.Random(botInfo.CurrentObjective.Waypoints) - self.AttackMove(randomWaypoint.Location) - - -- 75% chance to try capping if engi/xo/infil, otherwise 25% - local capChance = Utils.RandomInteger(0, 100) - if (self.Type == "e6" or self.Type == "sab" or self.Type == "xo" and capChance > 25) or (capChance > 75) then - if self.CanCapture(botInfo.CurrentObjective.Actor) then - self.Capture(botInfo.CurrentObjective.Actor) - end - end - - if self.Type == "e6" then - if Utils.RandomInteger(0, 100) > 66 then - local selfString = tostring(self) - - if BotEngiTurrets[selfString] == nil or BotEngiTurrets[selfString].IsDead then - local randomTurretLocation = FindTurretLocation(self) - - if randomTurretLocation ~= nil then - BotEngiTurrets[selfString] = Actor.Create("gun", true, { Owner = self.Owner, Location = randomTurretLocation }) - end - end - - if BotEngiTurrets[selfString] ~= nil and not BotEngiTurrets[selfString].IsDead then - local guardChance = Utils.RandomInteger(0, 100) - if guardChance > 15 then - self.Guard(BotEngiTurrets[selfString]) - end - end - end - end - end - end) - end) - end) - end - end) + Utils.Do(BotPlayers, function(p) + local botUnits = p.GetActorsByTypes(BuildableUnitTypes) + local botInfo = BotInfo[p.InternalName] + + local alliedPlayers + if p.Team == 1 then + alliedPlayers = BluePlayers + else + alliedPlayers = RedPlayers + end + + -- if current objective is not set, or is already owned by an ally, set a new one + if botInfo.CurrentObjective == nil or p.IsAlliedWith(botInfo.CurrentObjective.Actor.Owner) then + SelectNewObjective(p, botUnits, botInfo) + + -- random chance to swap objectives every 25 seconds + elseif DateTime.GameTime > 1 and DateTime.GameTime % 625 == 0 and Utils.RandomInteger(0, 100) > 50 then + SelectNewObjective(p, botUnits, botInfo) + end + + -- if bot has money, make a unit + if p.Cash > 0 then + local chosenType = Utils.Random(BuildableUnitTypes) + + p.Build({ chosenType }, function(actors) + Utils.Do(actors, function(a) + + Trigger.OnIdle(a, function(self) + + if botInfo.CurrentObjective ~= nil then + + if self.Type == "medi" then + local randomTarget = RandomTargetToHeal(self, alliedPlayers) + if randomTarget ~= nil then + self.Guard(randomTarget) + end + end + + -- attack move to random location near current objective + local randomWaypoint = Utils.Random(botInfo.CurrentObjective.Waypoints) + self.AttackMove(randomWaypoint.Location) + + -- 75% chance to try capping if engi/xo/infil, otherwise 25% + local capChance = Utils.RandomInteger(0, 100) + if (self.Type == "e6" or self.Type == "sab" or self.Type == "xo" and capChance > 25) or (capChance > 75) then + if self.CanCapture(botInfo.CurrentObjective.Actor) then + self.Capture(botInfo.CurrentObjective.Actor) + end + end + + if self.Type == "e6" then + if Utils.RandomInteger(0, 100) > 66 then + local selfString = tostring(self) + + if BotEngiTurrets[selfString] == nil or BotEngiTurrets[selfString].IsDead then + local randomTurretLocation = FindTurretLocation(self) + + if randomTurretLocation ~= nil then + BotEngiTurrets[selfString] = Actor.Create("gun", true, { Owner = self.Owner, Location = randomTurretLocation }) + end + end + + if BotEngiTurrets[selfString] ~= nil and not BotEngiTurrets[selfString].IsDead then + local guardChance = Utils.RandomInteger(0, 100) + if guardChance > 15 then + self.Guard(BotEngiTurrets[selfString]) + end + end + end + end + end + end) + end) + end) + end + end) end RandomTargetToHeal = function(self, alliedPlayers) - local target = nil - - Utils.Do(alliedPlayers, function(ap) - local units = ap.GetActorsByTypes(BuildableUnitTypes) - if #units > 0 then - possibleTargets = Utils.Where(units, function(a) - return a ~= self and a.Type ~= "medi" and a.Type ~= "sab" - end) - if #possibleTargets > 0 then - target = Utils.Random(possibleTargets) - end - return - end - end) - - return target + local target = nil + + Utils.Do(alliedPlayers, function(ap) + local units = ap.GetActorsByTypes(BuildableUnitTypes) + if #units > 0 then + possibleTargets = Utils.Where(units, function(a) + return a ~= self and a.Type ~= "medi" and a.Type ~= "sab" + end) + if #possibleTargets > 0 then + target = Utils.Random(possibleTargets) + end + return + end + end) + + return target end FindTurretLocation = function(self) - local waypoints = Map.ActorsInCircle(self.CenterPosition, WDist.New(5120), function(a) - return a.Type == "waypoint" - end) - - if #waypoints > 0 then - local randomWaypoint = Utils.Random(waypoints) - local footprint = Utils.ExpandFootprint({ randomWaypoint.Location }, true) - randomTargetCell = Utils.Random(footprint) - return randomTargetCell - end - - return nil + local waypoints = Map.ActorsInCircle(self.CenterPosition, WDist.New(5120), function(a) + return a.Type == "waypoint" + end) + + if #waypoints > 0 then + local randomWaypoint = Utils.Random(waypoints) + local footprint = Utils.ExpandFootprint({ randomWaypoint.Location }, true) + randomTargetCell = Utils.Random(footprint) + return randomTargetCell + end + + return nil end SelectNewObjective = function(p, botUnits, botInfo) - local possibleObjectives = Utils.Where(Objectives, function(o) - return not p.IsAlliedWith(o.Actor.Owner) - end) - - if #possibleObjectives > 0 then - local newObjective = Utils.Random(possibleObjectives) - botInfo.CurrentObjective = newObjective - botInfo.FirstObjective = false - - if #botUnits > 0 then - Utils.Do(botUnits, function(a) - a.Stop() - end) - end - end + local possibleObjectives = Utils.Where(Objectives, function(o) + return not p.IsAlliedWith(o.Actor.Owner) + end) + + if #possibleObjectives > 0 then + local newObjective = Utils.Random(possibleObjectives) + botInfo.CurrentObjective = newObjective + botInfo.FirstObjective = false + + if #botUnits > 0 then + Utils.Do(botUnits, function(a) + a.Stop() + end) + end + end end