diff --git a/OpenRA.Mods.Sp/Traits/DamageOnCreation.cs b/OpenRA.Mods.Sp/Traits/DamageOnCreation.cs new file mode 100644 index 000000000..385b8fd01 --- /dev/null +++ b/OpenRA.Mods.Sp/Traits/DamageOnCreation.cs @@ -0,0 +1,57 @@ +#region Copyright & License Information +/* + * Copyright (c) The OpenRA Developers and Contributors + * This file is part of OpenRA, which is free software. It is made + * available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of + * the License, or (at your option) any later version. For more + * information, see COPYING. + */ +#endregion + +using OpenRA.Primitives; +using OpenRA.Traits; + +namespace OpenRA.Mods.SP.Traits +{ + [Desc("Attach this to actors which should regenerate or lose health points over time.")] + sealed class DamageOnCreationInfo : TraitInfo, Requires + { + [Desc("Absolute amount of health points added in each step.", + "Use negative values to apply damage.")] + public readonly int Step = 0; + + [Desc("Relative percentages of health added in each step.", + "Use negative values to apply damage.", + "When both values are defined, their summary will be applied.")] + public readonly int PercentageStep = 0; + + [Desc("Apply the health change when encountering these damage types.")] + public readonly BitSet DamageTypes = default; + + public override object Create(ActorInitializer init) { return new DamageOnCreation(init.Self, this); } + } + + sealed class DamageOnCreation : ISync, ITick + { + readonly IHealth health; + readonly DamageOnCreationInfo info; + bool damaged; + + public DamageOnCreation(Actor self, DamageOnCreationInfo info) + { + this.info = info; + health = self.Trait(); + } + + public void Tick(Actor self) + { + // Cast to long to avoid overflow when multiplying by the health + if (!damaged) + { + damaged = true; + self.InflictDamage(self, new Damage((int)-(info.Step + info.PercentageStep * (long)health.MaxHP / 100), info.DamageTypes)); + } + } + } +} diff --git a/artsrc/nodiconascII.txt b/artsrc/nodiconascII.txt new file mode 100644 index 000000000..1d4410e64 --- /dev/null +++ b/artsrc/nodiconascII.txt @@ -0,0 +1,15 @@ + + + 1000000000001 + 101 101 + 101 0000000 101 + 101 0001 10001 101 + 101 000 000 101 + 101 001 10001 101 + 101 10 000 101 + 101 1 10001 101 + 101 0000 101 + 101 100101 101 + 101 100111 101 + 100000000000000000001 + diff --git a/mods/sp/bits/gdi/structures/gbeacon.shp b/mods/sp/bits/gdi/structures/gbeacon.shp new file mode 100644 index 000000000..7a2aafea2 Binary files /dev/null and b/mods/sp/bits/gdi/structures/gbeacon.shp differ diff --git a/mods/sp/bits/gdi/structures/gbeacon_tur.shp b/mods/sp/bits/gdi/structures/gbeacon_tur.shp new file mode 100644 index 000000000..1ed46d2ac Binary files /dev/null and b/mods/sp/bits/gdi/structures/gbeacon_tur.shp differ diff --git a/mods/sp/maps/training-01/languages/en.ftl b/mods/sp/maps/gdi-prologue-01/languages/en.ftl similarity index 90% rename from mods/sp/maps/training-01/languages/en.ftl rename to mods/sp/maps/gdi-prologue-01/languages/en.ftl index f7d249710..dc98a9c52 100644 --- a/mods/sp/maps/training-01/languages/en.ftl +++ b/mods/sp/maps/gdi-prologue-01/languages/en.ftl @@ -34,7 +34,8 @@ tip-lua-usage-deliver = [Deliver Vehicle]: when Carryall move to destination, se eva-lua-finish = All flags is activated, you are qualified. -objective-finish-train = Use your infantry to activate all flags. - -mission-lua-begin = Move your infantry to the next red flag. +objective-finish-train = Use your infantry to activate all red flags. +mission-lua-begin = Follow instructions to finish the training. + Press `Enter` key to see instruction history, Press again to hide. + Press `ESC` key to see training objective, Press again to hide. diff --git a/mods/sp/maps/training-01/languages/tr.ftl b/mods/sp/maps/gdi-prologue-01/languages/tr.ftl similarity index 100% rename from mods/sp/maps/training-01/languages/tr.ftl rename to mods/sp/maps/gdi-prologue-01/languages/tr.ftl diff --git a/mods/sp/maps/training-01/map.bin b/mods/sp/maps/gdi-prologue-01/map.bin similarity index 100% rename from mods/sp/maps/training-01/map.bin rename to mods/sp/maps/gdi-prologue-01/map.bin diff --git a/mods/sp/maps/training-01/map.png b/mods/sp/maps/gdi-prologue-01/map.png similarity index 100% rename from mods/sp/maps/training-01/map.png rename to mods/sp/maps/gdi-prologue-01/map.png diff --git a/mods/sp/maps/training-01/map.yaml b/mods/sp/maps/gdi-prologue-01/map.yaml similarity index 99% rename from mods/sp/maps/training-01/map.yaml rename to mods/sp/maps/gdi-prologue-01/map.yaml index 1eb1637a2..ef5346513 100644 --- a/mods/sp/maps/training-01/map.yaml +++ b/mods/sp/maps/gdi-prologue-01/map.yaml @@ -2,9 +2,9 @@ MapFormat: 12 RequiresMod: sp -Title: Training: Basic Control +Title: Prologue 01: Combat Training -Author: Westwood Studios +Author: Westwood Studios, Dnqbob Tileset: TEMPERATE diff --git a/mods/sp/maps/training-01/mission.lua b/mods/sp/maps/gdi-prologue-01/mission.lua similarity index 100% rename from mods/sp/maps/training-01/mission.lua rename to mods/sp/maps/gdi-prologue-01/mission.lua diff --git a/mods/sp/maps/gdi-prologue-01/rules.yaml b/mods/sp/maps/gdi-prologue-01/rules.yaml new file mode 100644 index 000000000..f78034da2 --- /dev/null +++ b/mods/sp/maps/gdi-prologue-01/rules.yaml @@ -0,0 +1,39 @@ +World: + MissionData: + Briefing: Lesson 1: Basic Combat.\n\nWelcome, new commander, I am E.V.A. Your training objective is to activate all the red flags in this area. Hologram devices are applied as virtual enemy during training. \n\nOverall Difficulty: Educational\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n<>\n\nTITLE: Will Hologram Bring Us A New Era? -- Blue Zone Post\n\nCONTENT: Hologram technology is becoming crucial for our life. It brings vivid stories to our kids, turns amateurs to experienced workers, and plays the important role in the military safe training concepts. However, it is all known that hologram technology comes from the hell of the First Tiberium War, and the largest hologram device provider nowadays was also the infamous "Cloak" device provider of the Nod back in the day. There are rumors about... + +^HopspitalHeal: + ChangesHealth@HOSPITAL: + PercentageStep: 1 + Step: 0 + Delay: 10 + StartIfBelow: 100 + DamageCooldown: 0 + RequiresCondition: hospitalheal + +^Infantry: + DamagedByTerrain: ## Increase damage by tib during guide. + Damage: 1700 + +FlameHologram: + -KillsSelf@TimedLife: + +TICKHOLOGRAM: + -KillsSelf@TimedLife: + +FLAGNEUTRAL: + -Targetable: + RevealsShroud@mission-reveal: + Range: 5c0 + Type: GroundPosition + ValidRelationships: Ally, Enemy + +MEDIC: + -Targetable: + RejectsMoveToAttack: + +GADEPT: + -Targetable: + +GAPILE: + -Targetable: diff --git a/mods/sp/maps/gdi-prologue-02/languages/en.ftl b/mods/sp/maps/gdi-prologue-02/languages/en.ftl new file mode 100644 index 000000000..3a1d7db56 --- /dev/null +++ b/mods/sp/maps/gdi-prologue-02/languages/en.ftl @@ -0,0 +1,66 @@ +eva-lua-name = E.V.A +tip-lua-name = Tip +kane-lua-name = Kane +general-lua-name = General Phoenix +badeva-lua-name = E.V.A.V.A.E + +mission-lua-begin = Follow instructions to finish the training. + Press `Enter` key to see instruction history, Press again to hide. + Press `ESC` key to see training objective, Press again to hide. + +objective-powerdown = Destroy all enemy by powerdown building. +objective-sell = Finish Sell training. +objective-repair = Fully repair the DropShip Beacon. +objective-mcv = Deploy the M.C.V +objective-build = Build all required buildings. +objective-placeholder = Train 10 Marines. +objective-helpnod = Help Kane to take down the Phoenix base. + +eva-lua-begin = The power provided by powerplant is not enough to enable all our buildings. +eva-lua-powerdown = Activate the defence building, destroy all enemy. +tip-lua-usage-powerdown = [PowerDown]: Click the button with electric icon at the top-right of the screen, you can enter the POWERDOWN command mode. When at POWERDOWN command mode, your cursor will also become electric icon. + Click on building that consumes power to turn it off/on. Turned off Building consumes no power but disabled. + +eva-lua-sell = Sell all your buildings in the base, for rebuild fund. +tip-lua-usage-sell = [Sell]: Click the button with money icon at the top-right of the screen, you can enter the SELL command mode. When at SELL command mode, your cursor will also become money icon. + Click on building to sell it. You will recieve a refund max to 50% of the sold building. + +eva-lua-repair = Fully repair the beacon to call our MCV. +tip-lua-usage-repair = [Repair Building]: Click the button with wrench icon at the top-right of the screen, you can enter the REPAIR command mode. When at REPAIR command mode, your cursor will also become wrench icon. + Click on building to repair/cancel repairing. Repair Building consumes resource. + +eva-lua-mcv = Deploy the M.C.V +tip-lua-usage-mcv = [Deploy MCV]: Select the M.C.V and move to a clear and flat 3x3 area, then click it again or use `F` to deploy it into a Construction Yard. + Construction Yard is the only building/defense producer in combat, the heart of your base. Protect it at all cost! + +eva-lua-build = Build following buildings: PowerPlant, Refinery and Barrack. +tip-lua-usage-build1 = [Produce Building]: Click the Building production tab on the right to find what you can produce. + Click on the icon in production panel to PRODUCE, it requires time and resource. Only one can be produced at a time. +tip-lua-usage-build2 = [Place Building]: When Building or Defence is ready, you need to find a place to place it. + Click on the ready building in production panel to place it. + +tip-lua-powerplant = Power Plant is always the first building you need to build. All other buildings requires power to be fully functional. +tip-lua-proc = Refinery is the major way for us to get resource by refining Tiberium. You will get a free harvester when you build a refinery. + You can rotate Refinery by press `V` to make it towards the Tiberium field, shorten the path for harvester on harvesting and delivering. +tip-lua-barrack = Barrack is the first building can produce combat units. + Click the production tab of Infantry on the right to find what you can produce. + Click on the icon in production panel to PRODUCE, it requires time and resource, only one can be produced at a time. + +eva-lua-congrat = Your base management skill is qualified. +eva-lua-gdie1 = Now, train 10 Marines from <<>> +gen-lua-say1 = STOP! +gen-lua-say2 = F**king STOP! You son of *****! +gen-lua-say3 = Who the hell gives you the ***** authorization code of my base?! +gen-lua-say4 = Who on earth allows you "training" here without my permission?! +gen-lua-say5 = WHERE IS MY GODDAMNED ION CANNON? + +eva-lua-kane = It is he. +badeva-lua-kane1 = It is It is It is It is It is It is It is It is It is It is It is It is It is It is It is It is It is It is +badeva-lua-kane2 = he who lives +kane-lua-lives = I lives. +kane-lua-game1 = Brotherhood of Nod is here, and we are no hologram. +kane-lua-game2 = We are coming for you. + +kane-lua-end1 = You have served me well, apprentice. +kane-lua-end2 = The seed of the paradise has been sowed. + diff --git a/mods/sp/maps/gdi-prologue-02/languages/tr.ftl b/mods/sp/maps/gdi-prologue-02/languages/tr.ftl new file mode 100644 index 000000000..3a1d7db56 --- /dev/null +++ b/mods/sp/maps/gdi-prologue-02/languages/tr.ftl @@ -0,0 +1,66 @@ +eva-lua-name = E.V.A +tip-lua-name = Tip +kane-lua-name = Kane +general-lua-name = General Phoenix +badeva-lua-name = E.V.A.V.A.E + +mission-lua-begin = Follow instructions to finish the training. + Press `Enter` key to see instruction history, Press again to hide. + Press `ESC` key to see training objective, Press again to hide. + +objective-powerdown = Destroy all enemy by powerdown building. +objective-sell = Finish Sell training. +objective-repair = Fully repair the DropShip Beacon. +objective-mcv = Deploy the M.C.V +objective-build = Build all required buildings. +objective-placeholder = Train 10 Marines. +objective-helpnod = Help Kane to take down the Phoenix base. + +eva-lua-begin = The power provided by powerplant is not enough to enable all our buildings. +eva-lua-powerdown = Activate the defence building, destroy all enemy. +tip-lua-usage-powerdown = [PowerDown]: Click the button with electric icon at the top-right of the screen, you can enter the POWERDOWN command mode. When at POWERDOWN command mode, your cursor will also become electric icon. + Click on building that consumes power to turn it off/on. Turned off Building consumes no power but disabled. + +eva-lua-sell = Sell all your buildings in the base, for rebuild fund. +tip-lua-usage-sell = [Sell]: Click the button with money icon at the top-right of the screen, you can enter the SELL command mode. When at SELL command mode, your cursor will also become money icon. + Click on building to sell it. You will recieve a refund max to 50% of the sold building. + +eva-lua-repair = Fully repair the beacon to call our MCV. +tip-lua-usage-repair = [Repair Building]: Click the button with wrench icon at the top-right of the screen, you can enter the REPAIR command mode. When at REPAIR command mode, your cursor will also become wrench icon. + Click on building to repair/cancel repairing. Repair Building consumes resource. + +eva-lua-mcv = Deploy the M.C.V +tip-lua-usage-mcv = [Deploy MCV]: Select the M.C.V and move to a clear and flat 3x3 area, then click it again or use `F` to deploy it into a Construction Yard. + Construction Yard is the only building/defense producer in combat, the heart of your base. Protect it at all cost! + +eva-lua-build = Build following buildings: PowerPlant, Refinery and Barrack. +tip-lua-usage-build1 = [Produce Building]: Click the Building production tab on the right to find what you can produce. + Click on the icon in production panel to PRODUCE, it requires time and resource. Only one can be produced at a time. +tip-lua-usage-build2 = [Place Building]: When Building or Defence is ready, you need to find a place to place it. + Click on the ready building in production panel to place it. + +tip-lua-powerplant = Power Plant is always the first building you need to build. All other buildings requires power to be fully functional. +tip-lua-proc = Refinery is the major way for us to get resource by refining Tiberium. You will get a free harvester when you build a refinery. + You can rotate Refinery by press `V` to make it towards the Tiberium field, shorten the path for harvester on harvesting and delivering. +tip-lua-barrack = Barrack is the first building can produce combat units. + Click the production tab of Infantry on the right to find what you can produce. + Click on the icon in production panel to PRODUCE, it requires time and resource, only one can be produced at a time. + +eva-lua-congrat = Your base management skill is qualified. +eva-lua-gdie1 = Now, train 10 Marines from <<>> +gen-lua-say1 = STOP! +gen-lua-say2 = F**king STOP! You son of *****! +gen-lua-say3 = Who the hell gives you the ***** authorization code of my base?! +gen-lua-say4 = Who on earth allows you "training" here without my permission?! +gen-lua-say5 = WHERE IS MY GODDAMNED ION CANNON? + +eva-lua-kane = It is he. +badeva-lua-kane1 = It is It is It is It is It is It is It is It is It is It is It is It is It is It is It is It is It is It is +badeva-lua-kane2 = he who lives +kane-lua-lives = I lives. +kane-lua-game1 = Brotherhood of Nod is here, and we are no hologram. +kane-lua-game2 = We are coming for you. + +kane-lua-end1 = You have served me well, apprentice. +kane-lua-end2 = The seed of the paradise has been sowed. + diff --git a/mods/sp/maps/gdi-prologue-02/map.bin b/mods/sp/maps/gdi-prologue-02/map.bin new file mode 100644 index 000000000..70f4892e8 Binary files /dev/null and b/mods/sp/maps/gdi-prologue-02/map.bin differ diff --git a/mods/sp/maps/gdi-prologue-02/map.png b/mods/sp/maps/gdi-prologue-02/map.png new file mode 100644 index 000000000..04f619f78 Binary files /dev/null and b/mods/sp/maps/gdi-prologue-02/map.png differ diff --git a/mods/sp/maps/gdi-prologue-02/map.yaml b/mods/sp/maps/gdi-prologue-02/map.yaml new file mode 100644 index 000000000..c38d4904b --- /dev/null +++ b/mods/sp/maps/gdi-prologue-02/map.yaml @@ -0,0 +1,673 @@ +MapFormat: 12 + +RequiresMod: sp + +Title: Prologue 02: Logistics Training + +Author: Westwood Studios, Dnqbob + +Tileset: TEMPERATE + +MapSize: 50,146 + +Bounds: 3,36,44,96 + +Visibility: MissionSelector + +Categories: Campaign + +Players: + PlayerReference@Neutral: + Name: Neutral + OwnsWorld: True + NonCombatant: True + Faction: gdi + PlayerReference@Creeps: + Name: Creeps + NonCombatant: True + Faction: nod + Color: FE1100 + LockSpawn: True + Enemies: You, GDI, Nod + PlayerReference@You: + Name: You + Playable: True + Required: True + LockFaction: True + Faction: gdi + LockColor: True + Color: EEEE66 + LockSpawn: True + LockTeam: True + Team: 1 + Allies: GDI + Enemies: Creeps, Nod + PlayerReference@GDI: + Name: GDI + LockFaction: True + Faction: gdi + LockColor: True + Color: EEEE66 + LockSpawn: True + LockTeam: True + Team: 1 + Allies: You + Enemies: Creeps, Nod + PlayerReference@Nod: + Name: Nod + Bot: NormalAI + Required: True + LockFaction: True + Faction: nod + LockColor: True + Color: FE1100 + LockSpawn: True + LockTeam: True + Team: 2 + Enemies: You, GDI, Neutral, Creeps + +Actors: + Actor8: city19 + Location: 59,44 + Owner: Neutral + Health: 50 + Facing: 896 + Actor9: city20 + Location: 60,46 + Owner: Neutral + Health: 66 + Facing: 896 + Actor10: city21 + Location: 59,46 + Owner: Neutral + Facing: 896 + Actor12: ca0002 + Location: 65,29 + Owner: Neutral + Facing: 896 + Actor13: ca0005 + Location: 68,22 + Owner: Neutral + Health: 50 + Facing: 896 + Actor14: ca0014 + Location: 71,23 + Owner: Neutral + Facing: 896 + Actor15: ca0015 + Location: 69,30 + Owner: Neutral + Facing: 896 + Actor16: ca0016 + Location: 61,27 + Owner: Neutral + Facing: 896 + Actor17: ca0004 + Location: 65,25 + Owner: Neutral + Facing: 896 + Actor18: ca0001 + Location: 66,19 + Owner: Neutral + Facing: 896 + Actor22: ca0010 + Location: 67,25 + Owner: Neutral + Facing: 896 + Actor28: bboard01 + Location: 73,13 + Owner: Neutral + Facing: 896 + Actor29: bboard13 + Location: 61,13 + Owner: Neutral + Facing: 896 + Actor30: bboard11 + Location: 64,47 + Owner: Neutral + Facing: 896 + Actor54: tree11 + Location: 57,20 + Owner: Neutral + Actor55: tree12 + Location: 57,18 + Owner: Neutral + Actor56: tree16 + Location: 59,21 + Owner: Neutral + Actor57: tree20 + Location: 61,31 + Owner: Neutral + Actor58: tree21 + Location: 60,32 + Owner: Neutral + Actor59: tree22 + Location: 67,36 + Owner: Neutral + Actor60: tree23 + Location: 65,35 + Owner: Neutral + Actor61: tree24 + Location: 65,34 + Owner: Neutral + Actor62: tree24 + Location: 69,21 + Owner: Neutral + Actor63: tree25 + Location: 67,22 + Owner: Neutral + Actor64: tree14 + Location: 72,9 + Owner: Neutral + Actor65: tree05 + Location: 66,-9 + Owner: Neutral + Actor69: tree15 + Location: 61,-8 + Owner: Neutral + Actor71: tree17 + Location: 64,-15 + Owner: Neutral + Actor72: tree18 + Location: 64,-16 + Owner: Neutral + Actor74: tree20 + Location: 59,-11 + Owner: Neutral + Actor77: tree12 + Location: 67,-9 + Owner: Neutral + Actor78: tree10 + Location: 60,-15 + Owner: Neutral + Actor79: tree09 + Location: 64,-14 + Owner: Neutral + Actor81: tree08 + Location: 59,-18 + Owner: Neutral + Actor82: tree07 + Location: 59,-20 + Owner: Neutral + Actor85: tree04 + Location: 68,-17 + Owner: Neutral + Actor86: tree03 + Location: 68,-15 + Owner: Neutral + Actor88: tree05 + Location: 68,-11 + Owner: Neutral + Actor89: tree06 + Location: 56,-12 + Owner: Neutral + Actor90: tree08 + Location: 56,-9 + Owner: Neutral + Actor91: tree09 + Location: 56,-11 + Owner: Neutral + Actor92: tree10 + Location: 56,-8 + Owner: Neutral + Actor93: tree11 + Location: 55,-8 + Owner: Neutral + Actor94: tree12 + Location: 56,-7 + Owner: Neutral + Actor95: tree13 + Location: 57,-7 + Owner: Neutral + Actor96: tree14 + Location: 55,-10 + Owner: Neutral + Actor97: tree15 + Location: 54,-7 + Owner: Neutral + Actor98: tree16 + Location: 55,-7 + Owner: Neutral + Actor99: tree16 + Location: 66,-8 + Owner: Neutral + Actor100: tree16 + Location: 53,-6 + Owner: Neutral + Actor101: tree16 + Location: 54,-6 + Owner: Neutral + Actor102: tree15 + Location: 52,-7 + Owner: Neutral + Actor103: tree14 + Location: 52,-8 + Owner: Neutral + Actor104: tree13 + Location: 51,-6 + Owner: Neutral + Actor105: tree12 + Location: 53,-5 + Owner: Neutral + Actor106: tree11 + Location: 51,-7 + Owner: Neutral + Actor110: tree01 + Location: 71,-16 + Owner: Neutral + Actor111: tree02 + Location: 69,-8 + Owner: Neutral + Actor112: tree03 + Location: 71,-17 + Owner: Neutral + Actor113: tree04 + Location: 74,-8 + Owner: Neutral + Actor114: tree05 + Location: 73,-12 + Owner: Neutral + Actor115: tree06 + Location: 73,-17 + Owner: Neutral + Actor116: tree07 + Location: 74,-16 + Owner: Neutral + Actor117: tree08 + Location: 78,-11 + Owner: Neutral + Actor118: tree10 + Location: 79,-8 + Owner: Neutral + Actor119: tree11 + Location: 74,-9 + Owner: Neutral + Actor120: tree09 + Location: 75,-12 + Owner: Neutral + Actor121: tree11 + Location: 70,-10 + Owner: Neutral + Actor122: tree12 + Location: 76,-10 + Owner: Neutral + Actor123: tree13 + Location: 75,-16 + Owner: Neutral + Actor124: tree14 + Location: 78,-13 + Owner: Neutral + Actor125: tree16 + Location: 74,-15 + Owner: Neutral + Actor126: tree08 + Location: 71,48 + Owner: Neutral + Actor127: tree09 + Location: 73,46 + Owner: Neutral + Actor128: tree11 + Location: 74,49 + Owner: Neutral + Actor129: tree12 + Location: 75,42 + Owner: Neutral + Actor230: trock04 + Location: 59,12 + Owner: Neutral + Actor232: trock05 + Location: 60,12 + Owner: Neutral + Actor233: trock02 + Location: 60,13 + Owner: Neutral + Actor210: bridge2 + Location: 63,-5 + Owner: Neutral + Actor211: bridge2 + Location: 63,-4 + Owner: Neutral + Actor212: bridge2 + Location: 63,-3 + Owner: Neutral + Actor236: trock05 + Location: 58,18 + Owner: Neutral + Actor214: bridge2 + Location: 63,-2 + Owner: Neutral + Actor216: bridge2 + Location: 63,-1 + Owner: Neutral + Actor218: bridge2 + Location: 63,0 + Owner: Neutral + Actor220: bridge2 + Location: 63,1 + Owner: Neutral + Actor222: bridge2 + Location: 63,2 + Owner: Neutral + Actor224: bridge2 + Location: 63,3 + Owner: Neutral + Actor213: gawall + Location: 51,10 + Owner: GDI + Actor217: gawall + Location: 51,12 + Owner: GDI + Actor219: gawall + Location: 51,13 + Owner: GDI + Actor221: gawall + Location: 51,14 + Owner: GDI + Actor223: gawall + Location: 51,15 + Owner: GDI + Actor215: gawall + Location: 51,11 + Owner: GDI + Actor225: gawall + Location: 51,16 + Owner: GDI + Actor226: gawall + Location: 51,17 + Owner: GDI + Actor229: gawall + Location: 52,19 + Owner: GDI + Actor231: gawall + Location: 52,20 + Owner: GDI + Actor235: gawall + Location: 52,24 + Owner: GDI + Actor238: gawall + Location: 52,25 + Owner: GDI + Actor239: gawall + Location: 51,27 + Owner: GDI + Actor240: gawall + Location: 51,28 + Owner: GDI + Actor241: gawall + Location: 51,29 + Owner: GDI + Actor242: gawall + Location: 51,30 + Owner: GDI + Actor243: gawall + Location: 51,31 + Owner: GDI + Actor244: gawall + Location: 51,32 + Owner: GDI + Actor245: gawall + Location: 49,35 + Owner: GDI + Actor246: gawall + Location: 51,33 + Owner: GDI + Actor247: gawall + Location: 50,35 + Owner: GDI + Actor248: gawall + Location: 51,34 + Owner: GDI + Actor249: gawall + Location: 51,35 + Owner: GDI + Actor227: gawall + Location: 52,17 + Owner: GDI + Actor228: gawall + Location: 52,18 + Owner: GDI + Actor234: gawall + Location: 52,27 + Owner: GDI + Actor237: gawall + Location: 52,26 + Owner: GDI + Actor282: gagate_b + Location: 52,21 + Owner: GDI + Actor250: bridge1 + Location: 76,11 + Owner: Neutral + Actor251: trock04 + Location: 65,23 + Owner: Neutral + Actor252: srock05 + Location: 69,19 + Owner: Neutral + Actor253: bridge1 + Location: 77,11 + Owner: Neutral + Actor254: bridge1 + Location: 78,11 + Owner: Neutral + Actor255: bridge1 + Location: 79,11 + Owner: Neutral + Actor256: bridge1 + Location: 80,11 + Owner: Neutral + Actor257: bridge1 + Location: 81,11 + Owner: Neutral + Actor258: bridge1 + Location: 82,11 + Owner: Neutral + Actor259: bridge1 + Location: 83,11 + Owner: Neutral + Actor260: srock05 + Location: 71,24 + Owner: Neutral + Actor261: bridge1 + Location: 84,11 + Owner: Neutral + Actor262: bridge1 + Location: 85,11 + Owner: Neutral + Actor263: bridge1 + Location: 86,11 + Owner: Neutral + Actor264: srock04 + Location: 60,38 + Owner: Neutral + Actor265: bridge1 + Location: 87,11 + Owner: Neutral + Actor266: bridge1 + Location: 88,11 + Owner: Neutral + Actor267: srock05 + Location: 57,43 + Owner: Neutral + Actor268: bridge1 + Location: 89,11 + Owner: Neutral + Actor272: trock05 + Location: 71,32 + Owner: Neutral + Actor273: srock03 + Location: 61,43 + Owner: Neutral + Actor277: trock02 + Location: 92,14 + Owner: Neutral + Actor278: trock05 + Location: 82,27 + Owner: Neutral + Actor279: trock02 + Location: 68,48 + Owner: Neutral + Actor280: trock04 + Location: 70,46 + Owner: Neutral + Actor281: trock04 + Location: 96,23 + Owner: Neutral + Actor283: gavulc + Owner: You + Location: 51,26 + TurretFacing: 642 + Actor284: gavulc + Owner: You + Location: 51,18 + TurretFacing: 650 + Actor285: garock + Owner: You + Location: 51,25 + TurretFacing: 642 + Actor286: garock + Owner: You + Location: 51,19 + TurretFacing: 642 + Actor287: gavulc + Owner: You + Location: 51,20 + TurretFacing: 602 + Actor288: gavulc + Owner: You + Location: 51,24 + TurretFacing: 634 + Actor161: flamehologram + Owner: Creeps + SubCell: 2 + Location: 54,18 + Facing: 142 + Actor163: flamehologram + Owner: Creeps + SubCell: 2 + Location: 54,27 + Facing: 134 + Actor164: flamehologram + Owner: Creeps + Location: 54,26 + SubCell: 2 + Facing: 142 + Actor166: tickhologram + Owner: Creeps + Location: 54,25 + Facing: 95 + Actor167: tickhologram + Owner: Creeps + Location: 54,22 + Facing: 111 + Actor168: tickhologram + Owner: Creeps + Location: 54,19 + Facing: 126 + Actor169: flamehologram + Owner: Creeps + SubCell: 2 + Location: 54,17 + Facing: 166 + Actor170: flamehologram + Owner: Creeps + SubCell: 2 + Location: 54,20 + Facing: 87 + Actor171: flamehologram + Owner: Creeps + SubCell: 2 + Location: 54,24 + Facing: 103 + Actor6: gapowr + Location: 44,25 + Facing: 896 + Owner: You + Actor173: gaplug + Owner: You + Location: 37,18 + MCVBeacon: gbeacon + Location: 43,20 + Owner: Neutral + Actor179: gapowr + Owner: You + Location: 39,23 + Actor178: napuls + Owner: You + Location: 47,26 + TurretFacing: 634 + Actor176: gacsam + Owner: You + Location: 48,30 + TurretFacing: 459 + Actor172: gacsam + Owner: You + Location: 46,14 + TurretFacing: 737 + Actor177: garadr + Owner: You + Location: 47,17 + McvReinWay: waypoint + Owner: Neutral + Location: 42,3 + Actor174: tibtre01 + Owner: Neutral + Location: 37,11 + Actor175: bigblue + Owner: Neutral + Location: 49,7 + NodSubway: waypoint + Owner: Neutral + Location: 97,36 + NodReinWay1: waypoint + Owner: Neutral + Location: 104,11 + NodReinWay2: waypoint + Owner: Neutral + Location: 62,-20 + NodReinWay3: waypoint + Owner: Neutral + Location: 62,56 + Actor180: nahpad + Owner: Nod + Location: 93,35 + Actor181: nahpad + Owner: Nod + Location: 95,35 + Actor182: nahpad + Owner: Nod + Location: 97,34 + NodAttackPoint: waypoint + Owner: Neutral + Location: 40,19 + Actor188: trock03 + Owner: Neutral + Location: 47,39 + Actor186: rocks1 + Owner: Neutral + Location: 41,32 + Actor187: srock04 + Owner: Neutral + Location: 43,36 + Actor189: rocks1 + Owner: Neutral + Location: 45,36 + Actor183: trock02 + Owner: Neutral + Location: 31,18 + Actor184: trock05 + Owner: Neutral + Location: 31,23 + Actor185: trock01 + Owner: Neutral + Location: 30,20 + Actor190: trock03 + Owner: Neutral + Location: 32,16 + Actor191: trock04 + Owner: Neutral + Location: 32,25 + +Rules: sp|rules/environment/campaign_override.yaml, rules.yaml + +Translations: languages/en.ftl, languages/tr.ftl diff --git a/mods/sp/maps/gdi-prologue-02/mission.lua b/mods/sp/maps/gdi-prologue-02/mission.lua new file mode 100644 index 000000000..bb02f7960 --- /dev/null +++ b/mods/sp/maps/gdi-prologue-02/mission.lua @@ -0,0 +1,422 @@ +--[[ + Copyright The OpenRA Developers (see AUTHORS) + This file is part of OpenRA, which is free software. It is made + available to you under the terms of the GNU General Public License + as published by the Free Software Foundation, either version 3 of + the License, or (at your option) any later version. For more + information, see COPYING. +]] + +NodIconASCII = +[[ + + + 1000000000001 + 101 101 + 101 0000000 101 + 101 0001 10001 101 + 101 000 000 101 + 101 001 10001 101 + 101 10 000 101 + 101 1 10001 101 + 101 0000 101 + 101 100101 101 + 101 100111 101 + 100000000000000000001 + + +]] + +BadCodes = { +"", +"", +"", +"", +"0 1 0 1 0 1 0 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 0 1 0 1 0 0 1 0 0 0 0 0 0 1 0 1 0 1 0 0 0 0 0 1 0 1 0 1 0 0 1 0 0 1 0 0 1\n", +"1 1 1 0 1 0 1 0 1 0 1 0 1 0 0 1 1 0 0 0 0 1 0 1 0 0 1 1 0 1 0 1 0 1 0 0 1 0 0 0 1 0 1 0 1 0 1 0 1 1 1 1 0 0 1 0 1 0 1 0 0 1 0 1 0 0 1 0 1\n", +"0 0 1 0 1 0 0 0 0 1 0 0 1 1 1 1 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 1 0 1 0 1 0 0 0 0 0 0 1 1 1 1 1 1 0 0 0 0 0 0 1 0 1 0 1 0 1 0 1\n", +"1 0 0 1 0 1 0 1 0 0 0 1 1 0 1 1 1 0 0 1 0 1 0 1 0 1 0 1 1 0 1 0 0 1 0 1 0 1 0 1 0 1 0 0 1 0 1 0 1 0 0 1 1 0 1 0 0 0 0 0 1 1 0 0 0 0 0 1 0\n" +} + + +Objectives = function() + PowerDownTrainingObjective = AddPrimaryObjective(LocalPlayer, "objective-powerdown") + SellTrainingObjective = AddPrimaryObjective(LocalPlayer, "objective-sell") + RepairTrainingObjective = AddPrimaryObjective(LocalPlayer, "objective-repair") + MCVTrainingObjective = AddPrimaryObjective(LocalPlayer, "objective-mcv") + BuildBuildingObjective = AddPrimaryObjective(LocalPlayer, "objective-build") + PlaceHolderObjective = AddPrimaryObjective(LocalPlayer, "objective-placeholder") +end + +EndGameObjectiveCheck = function() + LocalPlayer.MarkCompletedObjective(PowerDownTrainingObjective) + LocalPlayer.MarkCompletedObjective(SellTrainingObjective) + LocalPlayer.MarkCompletedObjective(RepairTrainingObjective) + LocalPlayer.MarkCompletedObjective(MCVTrainingObjective) + LocalPlayer.MarkCompletedObjective(BuildBuildingObjective) + LocalPlayer.MarkCompletedObjective(PlaceHolderObjective) + HelpNodObjective = AddPrimaryObjective(LocalPlayer, "objective-helpnod") + LocalPlayer.MarkCompletedObjective(HelpNodObjective) +end + +-- ####### Mission Map Set up +MissionMapSetUp = function() + Camera.Position = MCVBeacon.CenterPosition + LocalPlayer.Cash = 0 + CurrentMissionText = UserInterface.Translate("mission-lua-begin") +end + + +Notification = function(text) + TranslatedNotification("eva-lua-name", text, "FFFF00") +end + +Tip = function(text) + TranslatedNotification("tip-lua-name", text, "29F3CF") +end + +NotificationHacked = function(text) + TranslatedNotification("badeva-lua-name", text, "FF0000") +end + +GeneralSays = function(text) + TranslatedNotification("general-lua-name", text, "88FF00") +end + +KaneSays = function(text) + TranslatedNotification("kane-lua-name", text, "FF0000") +end + +EndGame = function() + KaneSays("kane-lua-end1") + Trigger.AfterDelay(DateTime.Seconds(7), function() + KaneSays("kane-lua-end2") + end) + Trigger.AfterDelay(DateTime.Seconds(14), function() + EndGameObjectiveCheck() + end) +end + +BeginPowerdownMessage = function() + Notification("eva-lua-begin") + Trigger.AfterDelay(DateTime.Seconds(6), function() + Notification("eva-lua-powerdown") + end) + Trigger.AfterDelay(DateTime.Seconds(13), function() + Tip("tip-lua-usage-powerdown") + end) +end + +BeginSellMessage = function() + Notification("eva-lua-sell") + Trigger.AfterDelay(DateTime.Seconds(7), function() + Tip("tip-lua-usage-sell") + end) +end + +NodAssualtTriggered = false + +BeginRepairMessage = function() + Notification("eva-lua-repair") + MCVBeacon.Flash(HSLColor.FromHex("FFFFFF"), 25, DateTime.Seconds(1) / 4) + Trigger.AfterDelay(DateTime.Seconds(7), function() + if not NodAssualtTriggered then + Tip("tip-lua-usage-repair") + end + end) +end + +DeployMCVMessage = function() + Notification("eva-lua-mcv") + Trigger.AfterDelay(DateTime.Seconds(7), function() + if not NodAssualtTriggered then + Tip("tip-lua-usage-mcv") + end + end) +end + +BuildBuildingMessage = function() + Notification("eva-lua-build") + Trigger.AfterDelay(DateTime.Seconds(7), function() + if not NodAssualtTriggered then + Tip("tip-lua-usage-build1") + end + end) + Trigger.AfterDelay(DateTime.Seconds(14), function() + if not NodAssualtTriggered then + Tip("tip-lua-usage-build2") + end + end) +end + +ProduceInfantryMessage = function() + Trigger.AfterDelay(DateTime.Seconds(17), function() + if not NodAssualtTriggered then + Notification("eva-lua-congrat") + end + end) + Trigger.AfterDelay(DateTime.Seconds(24), function() + if not NodAssualtTriggered then + Notification("eva-lua-gdie1") + DramaticNodAssualt() + end + end) +end + +BuildingBuiltList = +{ + ["gacnst"] = false, + ["anypower"] = false, + ["proc"] = false, + ["gapile"] = false +} + +BuildingIntroMessage = function(type) + if type == "anypower" then + Tip("tip-lua-powerplant") + elseif type == "proc" then + Tip("tip-lua-proc") + elseif type == "gapile" then + Tip("tip-lua-barrack") + end +end + +CheckBuildingObjective = function() + local unfinished = 0 + + for key,built in pairs(BuildingBuiltList) do + if not built then + if LocalPlayer.HasPrerequisites({key}) then + BuildingBuiltList[key] = true + BuildingIntroMessage(key) + else + unfinished = unfinished + 1 + end + end + end + + if unfinished == 0 then + LocalPlayer.MarkCompletedObjective(BuildBuildingObjective) + BuildingObjectiveCheckDelay = -1 + end +end + +NodAssualtBegin = function() + Reinforcements.Reinforce(Nod_AI, {"apache", "apache", "apache", "apache"}, {NodSubway.Location}, 100) + NodAssualtLoop() +end + +NodReinPoints = {NodReinWay1.Location, NodReinWay2.Location, NodReinWay3.Location} +NodAssualtLoop = function() + local remaining = 0 + + for key,v in pairs(BuildingBuiltList) do + if LocalPlayer.HasPrerequisites({key}) then + remaining = remaining + 1 + end + end + + if remaining == 0 then + EndGame() + return + end + + -- spawn infantry + Reinforcements.Reinforce(Nod_AI, {"altnode1", "altnode1", "templar", "templar", "crusader"}, {Utils.Random(NodReinPoints)}, 3, function(a) + a.AttackMove(NodAttackPoint.Location) + end) + + -- spawn vehicle + Trigger.AfterDelay(20, function() + Reinforcements.Reinforce(Nod_AI, {"attackbike", "bggy", "ttnk", "ttnk"}, {Utils.Random(NodReinPoints)}, 10, function(a) + a.AttackMove(NodAttackPoint.Location) + end) + end) + + -- spawn suicide, send by AI + Trigger.AfterDelay(30, function() + Reinforcements.Reinforce(Nod_AI, {"bike"}, {Utils.Random(NodReinPoints)}) + end) + + Trigger.AfterDelay(250, function() + Reinforcements.ReinforceWithTransport(Nod_AI, "sapc", {"cyborg", "cyborg", "cyborg", "glad", "glad"}, {NodSubway.Location, NodAttackPoint.Location}, {NodAttackPoint.Location, NodSubway.Location}) + end) + + Trigger.AfterDelay(400, function() + NodAssualtLoop() + end) +end + +EVAHackedStage = 0 +BuildingObjectiveCheckDelay = -1 -- Set -1 to disable Building Objective Check +DramaticNodAssualt = function() + if NodAssualtTriggered then + return + end + NodAssualtTriggered = true + BuildingObjectiveCheckDelay = -1 + + Trigger.AfterDelay(DateTime.Seconds(1), function() + GeneralSays("gen-lua-say1") + end) + Trigger.AfterDelay(DateTime.Seconds(2), function() + GeneralSays("gen-lua-say2") + end) + Trigger.AfterDelay(DateTime.Seconds(8), function() + GeneralSays("gen-lua-say3") + end) + Trigger.AfterDelay(DateTime.Seconds(16), function() + GeneralSays("gen-lua-say4") + end) + Trigger.AfterDelay(DateTime.Seconds(24), function() + GeneralSays("gen-lua-say5") + end) + + Trigger.AfterDelay(DateTime.Seconds(31), function() + Notification("eva-lua-kane") + EVAHackedStage = 1 + NodAssualtBegin() + end) + Trigger.AfterDelay(DateTime.Seconds(38), function() + NotificationHacked("badeva-lua-kane1") + EVAHackedStage = 2 + end) + Trigger.AfterDelay(DateTime.Seconds(45), function() + NotificationHacked("badeva-lua-kane2") + EVAHackedStage = 3 + end) + Trigger.AfterDelay(DateTime.Seconds(52), function() + KaneSays("kane-lua-lives") + EVAHackedStage = 4 + end) + Trigger.AfterDelay(DateTime.Seconds(60), function() + KaneSays("kane-lua-game1") + end) + Trigger.AfterDelay(DateTime.Seconds(67), function() + KaneSays("kane-lua-game2") + end) +end + +-- ### Set Nod Hack text visual +NodHackMissionText = function(text) + local randomBadcodes = "" + for i=1,5*EVAHackedStage do + randomBadcodes = randomBadcodes..Utils.Random(BadCodes) + end + + -- Show Nod icon in ASCII when stage > 3 + if EVAHackedStage > 3 then + if string.len(randomBadcodes) < 170 * EVAHackedStage then + NodIconASCII = string.reverse(NodIconASCII) + end + + randomBadcodes = randomBadcodes..NodIconASCII + end + + CurrentMissionText = randomBadcodes +end + +-- ####### Tick For Mission Text +CurrentMissionText = "" +Tick = function() + -- ###### Base Building Mission Check + if BuildingObjectiveCheckDelay == 0 then + CheckBuildingObjective() + BuildingObjectiveCheckDelay = DateTime.Seconds(1) + elseif BuildingObjectiveCheckDelay > 0 then + BuildingObjectiveCheckDelay = BuildingObjectiveCheckDelay - 1 + end + + if EVAHackedStage > 1 then + NodHackMissionText() + end + + UserInterface.SetMissionText(CurrentMissionText) +end + +WorldLoaded = function() + LocalPlayer = Player.GetPlayer("You") + GDI_AI = Player.GetPlayer("GDI") + Fake_Nod_AI = Player.GetPlayer("Creeps") + Nod_AI = Player.GetPlayer("Nod") + Objectives() + MissionMapSetUp() + GDIMCV = nil + + -- ###### Base Managing Mission + -- PowerDown Mission + BeginPowerdownMessage() + Trigger.OnAllKilled(Fake_Nod_AI.GetActorsByTypes({"flamehologram","tickhologram"}), function() + LocalPlayer.MarkCompletedObjective(PowerDownTrainingObjective) + end) + + Trigger.OnObjectiveCompleted(LocalPlayer, function(_, objectiveID) + -- If Kane already show himself, all missions are skipped + if NodAssualtTriggered then + return + end + + -- Sell Mission + if (objectiveID == PowerDownTrainingObjective) then + local sellable = LocalPlayer.GetActorsByTypes({"gaplug","garadr","gavulc", "garock", "gapowr", "gacsam", "napuls"}) + -- if there is no building we consider training is finished + if next(sellable) == nil then + -- Hack: add a delay to avoid `OnObjectiveCompleted` is called directly within `OnObjectiveCompleted`, which will crash the game + Trigger.AfterDelay(2, function() + LocalPlayer.MarkCompletedObjective(SellTrainingObjective) + end) + else + BeginSellMessage() + Trigger.OnAllRemovedFromWorld(sellable, function() + LocalPlayer.MarkCompletedObjective(SellTrainingObjective) + end) + end + -- Repair Mission + elseif(objectiveID == SellTrainingObjective) then + BeginRepairMessage() + -- Give cash to avoid player stuck in this stage + LocalPlayer.Cash = math.max(LocalPlayer.Cash, 4000) + if not MCVBeacon.IsDead then + MCVBeacon.Owner = LocalPlayer + Trigger.OnKilled(MCVBeacon, function(_) + local mcv_location = MCVBeacon.Location + Reinforcements.ReinforceWithTransport(LocalPlayer, "dshp.high", {"smech", "smech", "mmch"}, {McvReinWay.Location, mcv_location}, {mcv_location, McvReinWay.Location}, nil, function(trans, cargo) + LocalPlayer.MarkCompletedObjective(RepairTrainingObjective) + GDIMCV = Actor.Create("mcv", true, {Owner = LocalPlayer, Location = mcv_location}) + end) + end) + end + -- Kane will show himself if player just stalls + Trigger.AfterDelay(DateTime.Minutes(15), function() + DramaticNodAssualt() + end) + -- Deploy MCV Mission + elseif(objectiveID == RepairTrainingObjective) then + -- Hack: add a delay to get MCV when it is in world + Trigger.AfterDelay(2, function() + if GDIMCV ~= nil and not GDIMCV.IsDead then + DeployMCVMessage() + GDIMCV.Flash(HSLColor.FromHex("FFFFFF"), 40, DateTime.Seconds(1) / 4) + Trigger.OnRemovedFromWorld(GDIMCV, function(_) + -- Hack: add a delay to get Conyard when it is in world + Trigger.AfterDelay(2, function() + if LocalPlayer.HasPrerequisites({"gacnst"}) then + LocalPlayer.MarkCompletedObjective(MCVTrainingObjective) + else + LocalPlayer.MarkFailedObjective(MCVTrainingObjective) + end + end) + end) + end + end) + -- Build Building Mission + elseif(objectiveID == MCVTrainingObjective) then + BuildBuildingMessage() + -- Activate Base Building Check + BuildingObjectiveCheckDelay = DateTime.Seconds(1) + -- Final Mission + elseif(objectiveID == BuildBuildingObjective) then + ProduceInfantryMessage() + end + end) +end diff --git a/mods/sp/maps/gdi-prologue-02/rules.yaml b/mods/sp/maps/gdi-prologue-02/rules.yaml new file mode 100644 index 000000000..7a35ae6d3 --- /dev/null +++ b/mods/sp/maps/gdi-prologue-02/rules.yaml @@ -0,0 +1,69 @@ +World: + ElevatedBridgeLayer: + ElevatedBridgePlaceholder@a: + Location: 75, 10 + Height: 6 + Orientation: X + Length: 18 + ElevatedBridgePlaceholder@b: + Location: 62, -6 + Height: 6 + Orientation: Y + Length: 14 + MapOptions: + TechLevel: infantryonly + MapBuildRadius: + BuildRadiusCheckboxLocked: false + BuildRadiusCheckboxVisible: true + MissionData: + Briefing: Lesson 2: Logistics Training.\n\nWelcome back, commander, I am E.V.A. You need to rebuild and resupply an abandoned base to finish this training. Hologram devices are applied as virtual enemy during training.\n\nTechlevel: Barrack Only.\n\nOverall Difficulty: Educational\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n<>\n\nTITLE: Phoenix Down As He Lives\n\nCONTENT: [ParseException: Unparseable Data] + +Player: + ### Player custom settings + LobbyPrerequisiteCheckbox@GLOBALMULTIQUEUE: + Locked: false + Visible: true + LobbyPrerequisiteCheckbox@GLOBALUPGRADES: + Locked: false + Visible: true + ### Nod AI Control + SquadManagerBotModule@AIBase: + RequiresCondition: AIBase + ## allow AI attack wall + IgnoredEnemyTargetTypes: Mine, IgnoredByAI, NoAutoTarget, IonSpawner + SquadSize: 5 + MinimumAttackForceDelay: 300 + SendUnitToAttackBotModule@Frontlines: + -InvalidTargets: + TargetDistances: Closest + +FlameHologram: + -KillsSelf@TimedLife: + +TICKHOLOGRAM: + -KillsSelf@TimedLife: + +GBEACON: + -Targetable: + GrantConditionAfterDelay@activate: + PauseOnCondition: !FullHealth + DamageOnCreation: + PercentageStep: -85 + GrantConditionOnDamageState@FullHealth: + Condition: FullHealth + ValidDamageStates: Undamaged + RepairableBuilding: + RepairingNotification: Repairing + RepairStep: 1000 + WithBuildingRepairDecoration: + Image: allyrepair + Sequence: repair + Position: Center + Palette: mouse + KillsSelf@TimedLife: + Delay: 200 + RequiresCondition: active + +GAWALL: + DamageOnCreation: + PercentageStep: -45 diff --git a/mods/sp/maps/training-01/rules.yaml b/mods/sp/maps/training-01/rules.yaml deleted file mode 100644 index c185676cc..000000000 --- a/mods/sp/maps/training-01/rules.yaml +++ /dev/null @@ -1,39 +0,0 @@ -World: - MissionData: - Briefing: Lesson 1: Basic Control knowleges.\n\nOverall Difficulty: Educational - -^HopspitalHeal: - ChangesHealth@HOSPITAL: - PercentageStep: 1 - Step: 0 - Delay: 10 - StartIfBelow: 100 - DamageCooldown: 0 - RequiresCondition: hospitalheal - -^Infantry: - DamagedByTerrain: ## Increase damage by tib during guide. - Damage: 1700 - -FlameHologram: - -KillsSelf@TimedLife: - -TICKHOLOGRAM: - -KillsSelf@TimedLife: - -FLAGNEUTRAL: - -Targetable: - RevealsShroud@mission-reveal: - Range: 5c0 - Type: GroundPosition - ValidRelationships: Ally, Enemy - -MEDIC: - -Targetable: - RejectsMoveToAttack: - -GADEPT: - -Targetable: - -GAPILE: - -Targetable: diff --git a/mods/sp/missions.yaml b/mods/sp/missions.yaml index 4625e7c1f..8a8b2e9cd 100644 --- a/mods/sp/missions.yaml +++ b/mods/sp/missions.yaml @@ -1,8 +1,9 @@ +GDI Campaign: + gdi-prologue-01 + gdi-prologue-02 + C.A.B.A.L Campaign: cabal-01 Minigame: - minigame-01 - -Training: - training-01 \ No newline at end of file + minigame-01 \ No newline at end of file diff --git a/mods/sp/rules/aircraft.yaml b/mods/sp/rules/aircraft.yaml index d4cfb7e31..a210cbfe6 100644 --- a/mods/sp/rules/aircraft.yaml +++ b/mods/sp/rules/aircraft.yaml @@ -205,7 +205,8 @@ DSHP: Health: HP: 20000 Cargo: - MaxWeight: 5 + Types: Infantry, Vehicle + MaxWeight: 12 AfterLoadDelay: 0 BeforeUnloadDelay: 0 AfterUnloadDelay: 0 diff --git a/mods/sp/rules/campaignstuff.yaml b/mods/sp/rules/campaignstuff.yaml index e748bf94f..5675b037c 100644 --- a/mods/sp/rules/campaignstuff.yaml +++ b/mods/sp/rules/campaignstuff.yaml @@ -1267,6 +1267,49 @@ MUTAMBUSHVENT: EditorOnlyTooltip: Name: Tunnel (generated by Suspicious Mound) +GBEACON: + Inherits: ^BasicBuilding + Inherits@1: ^StructureEffects + Inherits@2: ^6CellVision + Inherits@3: ^SelectableBuilding + Tooltip: + Name: DropShip Beacon + Building: + Footprint: x + Dimensions: 1,1 + Turreted: + TurnSpeed: 1023 + WithMuzzleOverlay: + Armament: + Weapon: LurkerAimDummyWeapon + MuzzlePalette: player + MuzzleSequence: wifi + LocalOffset: 0,0,2200 + AttackPopupTurreted: + CloseDelay: 10 + DefaultFacing: 512 + ClosedDamageMultiplier: 100 + WithEmbeddedTurretSpriteBody: + WithSpriteBody: + Name: base + Sequence: idle-open + Explodes: + Weapon: Grenade + EmptyWeapon: Grenade + -WithIdleOverlay@SpawnFire: + -ThrowsShrapnel@SMALL: + -ThrowsShrapnel@LARGE: + -ShakeOnDeath: + RenderSprites: + PlayerPalette: player + GrantConditionAfterDelay@activate: + Condition: active + Delay: 100 + #PauseOnCondition: ##Use script or something like this to script the activation + ForceFireAtLocation@BeaconActive: + LocalOffset: 0, 1024, 0 + RequiresCondition: active + GAIONTUR: Inherits: ^TurretedDefence Inherits@SHAPE: ^2x2Shape diff --git a/mods/sp/rules/defaults.yaml b/mods/sp/rules/defaults.yaml index e7c022174..4c3a1aff6 100644 --- a/mods/sp/rules/defaults.yaml +++ b/mods/sp/rules/defaults.yaml @@ -3105,9 +3105,11 @@ MapEditorData: Categories: Trees Targetable: - TargetTypes: Building, Ground, C4 + TargetTypes: NoAutoTarget, Ground Health: HP: 10000 + Armor: + Type: Light Crushable: CrushClasses: infantry ThrowsShrapnel@: diff --git a/mods/sp/rules/infantry.yaml b/mods/sp/rules/infantry.yaml index 701ff3790..c289bb6e4 100644 --- a/mods/sp/rules/infantry.yaml +++ b/mods/sp/rules/infantry.yaml @@ -2150,16 +2150,8 @@ CYBORG: CYBORG15: Inherits: CYBORG -Buildable: - ChangesHealth: + DamageOnCreation: PercentageStep: -85 - Step: 0 - Delay: 1 - StartIfBelow: 101 - RequiresCondition: !damaged - GrantConditionAfterDelay@1: - Delay: 1 - Condition: damaged - ShowSelectionBar: false SpawnActorOnDeath@conversionUpg: Actor: workermech Selectable: diff --git a/mods/sp/sequences/campaignseq.yaml b/mods/sp/sequences/campaignseq.yaml index 8c84ed2ce..7b900feaf 100644 --- a/mods/sp/sequences/campaignseq.yaml +++ b/mods/sp/sequences/campaignseq.yaml @@ -68,6 +68,51 @@ neutralfabricator: vehicleicon: Filename: neutralfabricatoricon.shp +gbeacon: + Defaults: + Filename: gbeacon.shp + Offset: 0,-11 + idle-close: + Start: 0 + closed-idle: + Filename: gbeacon.shp + Start: 0 + dead: + Start: 4 + ShadowStart: 15 + opening: + Start: 0 + Length: 11 + Tick: 60 + closing: + Length: * + Frames: 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0 + Tick: 60 + idle: + Start: 0 + Filename: gbeacon_tur.shp + Length: * + idle-open: + Start: 4 + ShadowStart: 15 + make: + Start: 0 + place: + Start: 0 + wifi: + Filename: wifi.shp + Frames: 0, 1, 2, 3, 4,1, 2, 3, 4, 0, 1, 2, 3, 4,1, 2, 3, 4 + Length: * + Offset: 0, 0, 25 + ZOffset: 512 + Reverses: true + IgnoreWorldTint: True + emp-overlay: + Filename: emp_fx01.shp + Length: * + ZOffset: 512 + IgnoreWorldTint: True + gaiontur: Defaults: TilesetFilenames: diff --git a/mods/sp/sequences/creepsseq.yaml b/mods/sp/sequences/creepsseq.yaml index b4f15346e..11b28b159 100644 --- a/mods/sp/sequences/creepsseq.yaml +++ b/mods/sp/sequences/creepsseq.yaml @@ -636,8 +636,6 @@ weye: IgnoreWorldTint: true closed-idle: Start: 0 - damaged-closed-idle: - Start: 0 dead: Start: 1 opening: @@ -667,9 +665,6 @@ geye: closed-idle: Start: 0 ShadowStart: 37 - damaged-closed-idle: - Start: 0 - ShadowStart: 37 dead: Start: 1 ShadowStart: 37