diff --git a/OpenRA.sln b/OpenRA.sln index 40b3274303..b07da30012 100644 --- a/OpenRA.sln +++ b/OpenRA.sln @@ -68,6 +68,8 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Red Alert Lua scripts", "Re mods\ra\maps\soviet-05\soviet05.lua = mods\ra\maps\soviet-05\soviet05.lua mods\ra\maps\soviet-05\soviet05-AI.lua = mods\ra\maps\soviet-05\soviet05-AI.lua mods\ra\maps\soviet-05\soviet05-reinforcements_teams.lua = mods\ra\maps\soviet-05\soviet05-reinforcements_teams.lua + mods\ra\maps\soviet-06a\soviet06a.lua = mods\ra\maps\soviet-06a\soviet06a.lua + mods\ra\maps\soviet-06a\soviet06a-AI.lua = mods\ra\maps\soviet-06a\soviet06a-AI.lua mods\ra\maps\soviet-07\soviet07.lua = mods\ra\maps\soviet-07\soviet07.lua mods\ra\maps\survival01\survival01.lua = mods\ra\maps\survival01\survival01.lua mods\ra\maps\survival02\survival02.lua = mods\ra\maps\survival02\survival02.lua diff --git a/mods/ra/maps/soviet-06a/map.bin b/mods/ra/maps/soviet-06a/map.bin new file mode 100644 index 0000000000..63c58954dc Binary files /dev/null and b/mods/ra/maps/soviet-06a/map.bin differ diff --git a/mods/ra/maps/soviet-06a/map.png b/mods/ra/maps/soviet-06a/map.png new file mode 100644 index 0000000000..e92632f70f Binary files /dev/null and b/mods/ra/maps/soviet-06a/map.png differ diff --git a/mods/ra/maps/soviet-06a/map.yaml b/mods/ra/maps/soviet-06a/map.yaml new file mode 100644 index 0000000000..1753ac4dc2 --- /dev/null +++ b/mods/ra/maps/soviet-06a/map.yaml @@ -0,0 +1,980 @@ +MapFormat: 7 + +RequiresMod: ra + +Title: Soviet 06a: Bridge over the River Grotzny + +Description: There is a special cargo that needs to be transported to a nearby Soviet base in the northeast.\n\nMake sure the trucks reach their destination intact. Along the way, there is a bridge which the Allies may have destroyed.\n\nIf so, use the Naval options at your disposal. Our attack subs will make short work of any Allied boats you discover. + +Author: Westwood Studios + +Tileset: TEMPERAT + +MapSize: 128,128 + +Bounds: 5,1,93,53 + +Visibility: MissionSelector + +Type: Campaign + +Videos: + Briefing: soviet6.vqa + GameStart: onthprwl.vqa + GameWon: sitduck.vqa + GameLost: dpthchrg.vqa + +Options: + Crates: False + Fog: True + Shroud: True + AllyBuildRadius: False + FragileAlliances: False + StartingCash: 11500 + ConfigurableStartingUnits: False + ShortGame: False + +Players: + PlayerReference@Neutral: + Name: Neutral + OwnsWorld: True + NonCombatant: True + Faction: allies + PlayerReference@Creeps: + Name: Creeps + NonCombatant: True + PlayerReference@Greece: + Name: Greece + Faction: allies + ColorRamp: 161,134,236 + Enemies: USSR + PlayerReference@USSR: + Name: USSR + AllowBots: False + Playable: True + Required: True + LockFaction: True + Faction: soviet + LockColor: True + ColorRamp: 3,255,127 + LockSpawn: True + LockTeam: True + Enemies: Greece, Creeps + +Actors: + Actor0: cycl + Location: 17,1 + Owner: Greece + Actor1: cycl + Location: 18,1 + Owner: Greece + Actor2: cycl + Location: 19,1 + Owner: Greece + Actor3: cycl + Location: 20,1 + Owner: Greece + Actor4: cycl + Location: 21,1 + Owner: Greece + Actor5: cycl + Location: 22,1 + Owner: Greece + Actor6: cycl + Location: 23,1 + Owner: Greece + Actor7: cycl + Location: 24,1 + Owner: Greece + Actor8: cycl + Location: 25,1 + Owner: Greece + Actor9: cycl + Location: 26,1 + Owner: Greece + Actor10: cycl + Location: 27,1 + Owner: Greece + Actor11: cycl + Location: 28,1 + Owner: Greece + Actor12: cycl + Location: 29,1 + Owner: Greece + Actor13: cycl + Location: 30,1 + Owner: Greece + Actor14: cycl + Location: 31,1 + Owner: Greece + Actor15: cycl + Location: 32,1 + Owner: Greece + Actor16: cycl + Location: 33,1 + Owner: Greece + Actor17: cycl + Location: 34,1 + Owner: Greece + Actor18: cycl + Location: 35,1 + Owner: Greece + Actor19: cycl + Location: 17,2 + Owner: Greece + Actor20: cycl + Location: 17,3 + Owner: Greece + Actor21: cycl + Location: 18,3 + Owner: Greece + Actor22: cycl + Location: 17,4 + Owner: Greece + Actor23: cycl + Location: 18,4 + Owner: Greece + Actor24: cycl + Location: 17,10 + Owner: Greece + Actor25: cycl + Location: 18,10 + Owner: Greece + Actor26: cycl + Location: 17,11 + Owner: Greece + Actor27: cycl + Location: 18,11 + Owner: Greece + Actor28: cycl + Location: 17,12 + Owner: Greece + Actor29: cycl + Location: 17,13 + Owner: Greece + Actor30: cycl + Location: 17,14 + Owner: Greece + Actor31: cycl + Location: 17,15 + Owner: Greece + Actor32: cycl + Location: 17,16 + Owner: Greece + Actor33: cycl + Location: 17,17 + Owner: Greece + Actor34: cycl + Location: 17,18 + Owner: Greece + Actor35: cycl + Location: 18,18 + Owner: Greece + Actor36: cycl + Location: 18,19 + Owner: Greece + Actor37: cycl + Location: 31,19 + Owner: Greece + Actor38: cycl + Location: 32,19 + Owner: Greece + Actor39: cycl + Location: 18,20 + Owner: Greece + Actor40: cycl + Location: 31,20 + Owner: Greece + Actor41: cycl + Location: 17,21 + Owner: Greece + Actor42: cycl + Location: 18,21 + Owner: Greece + Actor43: cycl + Location: 31,21 + Owner: Greece + Actor44: cycl + Location: 17,22 + Owner: Greece + Actor45: sbag + Location: 19,22 + Owner: Greece + Actor46: sbag + Location: 20,22 + Owner: Greece + Actor47: sbag + Location: 21,22 + Owner: Greece + Actor48: sbag + Location: 27,22 + Owner: Greece + Actor49: sbag + Location: 28,22 + Owner: Greece + Actor50: sbag + Location: 29,22 + Owner: Greece + Actor51: cycl + Location: 31,22 + Owner: Greece + Actor52: cycl + Location: 17,23 + Owner: Greece + Actor53: sbag + Location: 21,23 + Owner: Greece + Actor54: sbag + Location: 27,23 + Owner: Greece + Actor55: cycl + Location: 31,23 + Owner: Greece + Actor56: cycl + Location: 17,24 + Owner: Greece + Actor57: cycl + Location: 18,24 + Owner: Greece + Actor58: cycl + Location: 19,24 + Owner: Greece + Actor59: cycl + Location: 20,24 + Owner: Greece + Actor60: cycl + Location: 21,24 + Owner: Greece + Actor61: cycl + Location: 27,24 + Owner: Greece + Actor62: cycl + Location: 28,24 + Owner: Greece + Actor63: cycl + Location: 29,24 + Owner: Greece + Actor64: cycl + Location: 30,24 + Owner: Greece + Actor65: cycl + Location: 31,24 + Owner: Greece + Actor66: sbag + Location: 71,31 + Owner: Greece + Actor67: sbag + Location: 72,31 + Owner: Greece + Actor68: sbag + Location: 71,32 + Owner: Greece + Actor69: sbag + Location: 72,32 + Owner: Greece + Actor70: sbag + Location: 72,33 + Owner: Greece + Actor71: sbag + Location: 73,33 + Owner: Greece + Actor72: sbag + Location: 73,34 + Owner: Greece + Actor73: sbag + Location: 74,34 + Owner: Greece + Actor74: sbag + Location: 75,34 + Owner: Greece + Actor75: sbag + Location: 74,35 + Owner: Greece + Actor76: sbag + Location: 75,35 + Owner: Greece + Actor77: t17 + Location: 66,28 + Owner: Neutral + Actor78: t08 + Location: 83,35 + Owner: Neutral + Actor79: t16 + Location: 82,34 + Owner: Neutral + Actor80: tc04 + Location: 80,36 + Owner: Neutral + Actor81: tc05 + Location: 77,34 + Owner: Neutral + Actor82: tc01 + Location: 79,32 + Owner: Neutral + Actor83: tc01 + Location: 61,52 + Owner: Neutral + Actor84: tc02 + Location: 61,49 + Owner: Neutral + Actor85: tc03 + Location: 58,52 + Owner: Neutral + Actor86: tc05 + Location: 52,47 + Owner: Neutral + Actor87: t16 + Location: 35,21 + Owner: Neutral + Actor88: tc04 + Location: 36,24 + Owner: Neutral + Actor89: t15 + Location: 38,22 + Owner: Neutral + Actor90: t12 + Location: 31,24 + Owner: Neutral + Actor91: tc05 + Location: 95,15 + Owner: Neutral + Actor92: tc01 + Location: 94,19 + Owner: Neutral + Actor93: tc03 + Location: 85,13 + Owner: Neutral + Actor94: tc02 + Location: 94,6 + Owner: Neutral + Actor95: tc01 + Location: 96,11 + Owner: Neutral + Actor96: tc04 + Location: 84,4 + Owner: Neutral + Actor97: t17 + Location: 83,13 + Owner: Neutral + Actor98: t16 + Location: 88,11 + Owner: Neutral + Actor99: t16 + Location: 91,23 + Owner: Neutral + Actor100: t14 + Location: 93,24 + Owner: Neutral + Actor101: t11 + Location: 95,22 + Owner: Neutral + Actor102: tc05 + Location: 32,22 + Owner: Neutral + Actor103: tc05 + Location: 5,12 + Owner: Neutral + Actor104: tc01 + Location: 9,12 + Owner: Neutral + Actor105: tc05 + Location: 50,34 + Owner: Neutral + Actor106: tc04 + Location: 53,34 + Owner: Neutral + Actor107: tc05 + Location: 74,47 + Owner: Neutral + Actor108: tc04 + Location: 80,43 + Owner: Neutral + Actor109: tc02 + Location: 78,42 + Owner: Neutral + Actor110: tc01 + Location: 74,46 + Owner: Neutral + Actor111: t17 + Location: 73,48 + Owner: Neutral + Actor112: t16 + Location: 77,46 + Owner: Neutral + Actor113: t15 + Location: 80,41 + Owner: Neutral + Actor114: t14 + Location: 68,52 + Owner: Neutral + Actor115: t13 + Location: 84,40 + Owner: Neutral + Actor116: tc02 + Location: 65,52 + Owner: Neutral + Actor117: tc01 + Location: 66,49 + Owner: Neutral + Actor118: t08 + Location: 32,20 + Owner: Neutral + Actor119: tc02 + Location: 18,52 + Owner: Neutral + Actor120: t15 + Location: 27,51 + Owner: Neutral + Actor121: t11 + Location: 40,40 + Owner: Neutral + Actor122: t10 + Location: 41,34 + Owner: Neutral + Actor123: t10 + Location: 43,29 + Owner: Neutral + Actor124: t08 + Location: 41,32 + Owner: Neutral + Actor125: t08 + Location: 42,41 + Owner: Neutral + Actor126: tc05 + Location: 29,28 + Owner: Neutral + Actor127: tc02 + Location: 19,26 + Owner: Neutral + Actor128: tc04 + Location: 17,24 + Owner: Neutral + Actor129: t14 + Location: 37,33 + Owner: Neutral + Actor130: tc01 + Location: 38,28 + Owner: Neutral + Actor131: t16 + Location: 39,27 + Owner: Neutral + Actor132: t16 + Location: 37,28 + Owner: Neutral + Actor133: t10 + Location: 11,49 + Owner: Neutral + Actor134: tc05 + Location: 12,24 + Owner: Neutral + Actor135: tc04 + Location: 5,30 + Owner: Neutral + Actor136: tc02 + Location: 12,12 + Owner: Neutral + Actor137: t16 + Location: 11,12 + Owner: Neutral + Actor234: t12 + Owner: Neutral + Location: 15,14 + Actor139: t08 + Location: 16,15 + Owner: Neutral + Actor140: t01 + Location: 8,12 + Owner: Neutral + Actor141: t10 + Location: 13,33 + Owner: Neutral + Actor142: t15 + Location: 7,40 + Owner: Neutral + Actor143: t14 + Location: 17,32 + Owner: Neutral + Actor144: tc02 + Location: 5,39 + Owner: Neutral + Actor145: tc03 + Location: 85,6 + Owner: Neutral + Actor233: t01 + Owner: Neutral + Location: 15,13 + Actor147: t10 + Location: 14,12 + Owner: Neutral + Actor148: tc05 + Location: 81,4 + Owner: Neutral + Actor149: t01 + Location: 61,9 + Owner: Neutral + Actor150: tc03 + Location: 71,6 + Owner: Neutral + Actor151: t17 + Location: 60,6 + Owner: Neutral + Actor152: t11 + Location: 70,3 + Owner: Neutral + Actor153: tc05 + Location: 22,2 + Owner: Neutral + Actor154: tc03 + Location: 28,2 + Owner: Neutral + Actor155: tc01 + Location: 33,1 + Owner: Neutral + Actor156: hbox + Location: 19,23 + Owner: Greece + Actor157: hbox + Location: 29,23 + Owner: Greece + Actor158: gun + Location: 20,23 + Owner: Greece + Facing: 128 + Actor159: gun + Location: 28,23 + Owner: Greece + Facing: 128 + Actor161: dome + Location: 23,5 + Owner: Greece + Actor163: gap + Location: 24,21 + Owner: Greece + Actor164: syrd + Location: 35,14 + Owner: Greece + Actor167: gun + Location: 33,5 + Owner: Greece + Facing: 192 + Actor168: gun + Location: 33,9 + Owner: Greece + Facing: 192 + Actor169: v07 + Location: 66,4 + Owner: Greece + Health: 45 + Actor170: v03 + Location: 64,8 + Owner: Greece + Actor171: v01 + Location: 71,8 + Owner: Greece + Actor172: v05 + Location: 61,8 + Owner: Greece + Health: 43 + Actor173: v06 + Location: 68,4 + Owner: Greece + Actor174: powr + Location: 20,2 + Owner: Greece + Actor175: powr + Location: 25,2 + Owner: Greece + Actor179: 2tnk + Location: 73,35 + Owner: Greece + Facing: 160 + Actor180: 2tnk + Location: 72,34 + Owner: Greece + Facing: 160 + Actor181: 2tnk + Location: 71,33 + Owner: Greece + Facing: 160 + Actor182: arty + Location: 74,33 + Owner: Greece + Facing: 160 + Actor183: arty + Location: 73,32 + Owner: Greece + Facing: 160 + Actor186: 3tnk + Location: 56,47 + Owner: USSR + Health: 99 + Facing: 32 + Actor187: 3tnk + Location: 60,49 + Owner: USSR + Health: 99 + Facing: 32 + Actor191: v2rl + Location: 57,49 + Owner: USSR + Facing: 32 + Actor193: 2tnk + Location: 73,31 + Owner: Greece + Facing: 160 + Actor194: 2tnk + Location: 75,33 + Owner: Greece + Facing: 160 + Actor195: 2tnk + Location: 85,18 + Owner: Greece + Facing: 160 + Actor196: 2tnk + Location: 88,20 + Owner: Greece + Facing: 160 + Actor197: 2tnk + Location: 22,23 + Owner: Greece + Facing: 128 + Actor198: 2tnk + Location: 26,23 + Owner: Greece + Facing: 128 + Actor199: arty + Location: 18,23 + Owner: Greece + Facing: 96 + Actor200: arty + Location: 30,23 + Owner: Greece + Facing: 160 + Actor202: 1tnk + Location: 23,21 + Owner: Greece + Facing: 128 + Actor203: 1tnk + Location: 25,21 + Owner: Greece + Facing: 128 + Actor204: 2tnk + Location: 40,6 + Owner: Greece + Facing: 192 + Actor205: 2tnk + Location: 40,8 + Owner: Greece + Facing: 192 + Actor206: arty + Location: 40,7 + Owner: Greece + Facing: 192 + Actor207: 1tnk + Location: 77,10 + Owner: Greece + Facing: 192 + Actor208: 1tnk + Location: 77,11 + Owner: Greece + Facing: 192 + Actor209: 1tnk + Location: 77,12 + Owner: Greece + Facing: 192 + Actor210: ca + Location: 87,29 + Owner: Greece + Facing: 224 + Actor211: ca + Location: 87,25 + Owner: Greece + Facing: 160 + Actor212: ca + Location: 76,22 + Owner: Greece + Facing: 224 + Actor213: pt + Location: 38,4 + Owner: Greece + Facing: 192 + Actor214: pt + Location: 38,10 + Owner: Greece + Facing: 192 + Actor215: dd + Location: 55,15 + Owner: Greece + Facing: 192 + Actor216: waypoint + Location: 39,13 + Owner: Neutral + Actor235: silo + Owner: Greece + Location: 26,9 + Actor236: silo + Owner: Greece + Location: 24,9 + Actor237: silo + Owner: Greece + Location: 27,2 + Actor238: silo + Owner: Greece + Location: 27,3 + waypoint78: waypoint + Location: 83,23 + Owner: Neutral + waypoint79: waypoint + Location: 87,19 + Owner: Neutral + waypoint80: waypoint + Location: 84,22 + Owner: Neutral + waypoint81: waypoint + Location: 76,22 + Owner: Neutral + waypoint82: waypoint + Location: 87,29 + Owner: Neutral + APCWaypoint1: waypoint + Location: 52,50 + Owner: Neutral + APCWaypoint2: waypoint + Location: 58,51 + Owner: Neutral + Apwr: apwr + Location: 18,11 + Owner: Greece + Apwr2: apwr + Owner: Greece + Location: 27,5 + AttackWaypoint1: waypoint + Owner: Neutral + Location: 24,30 + AttackWaypoint2: waypoint + Owner: Neutral + Location: 35,30 + Barr: tent + Location: 29,16 + Owner: Greece + BaseAttacker1: 1tnk + Location: 76,35 + Owner: Greece + Facing: 160 + BaseAttacker2: 1tnk + Location: 71,30 + Owner: Greece + Facing: 160 + CameraBarrier: camera + Location: 70,36 + Owner: Neutral + CameraBase1: camera + Location: 34,40 + Owner: Neutral + CameraBase2: camera + Location: 24,40 + Owner: Neutral + CameraBase3: camera + Location: 30,46 + Owner: Neutral + CameraBase4: camera + Location: 48,39 + Owner: Neutral + CameraStart: camera + Location: 58,48 + Owner: Neutral + CYard: fact + Location: 30,2 + Owner: Greece + CYardLocation: waypoint + Owner: Neutral + Location: 31,4 + Harvester: harv + Location: 12,10 + Owner: Greece + IntroEnemy1: 1tnk + Location: 63,42 + Owner: Greece + Health: 28 + Facing: 160 + IntroEnemy2: jeep + Location: 64,42 + Owner: Greece + Health: 43 + Facing: 160 + IntroEnemy3: 1tnk + Location: 64,43 + Owner: Greece + Health: 50 + Facing: 160 + Mcv: mcv + Location: 61,45 + Owner: USSR + Facing: 96 + McvWaypoint: waypoint + Location: 53,53 + Owner: Neutral + Proc: proc + Location: 24,9 + Owner: Greece + FreeActor: False + Truck1: truk + Location: 54,52 + Owner: USSR + Facing: 32 + Truck2: truk + Location: 55,51 + Owner: USSR + Facing: 32 + Weap: weap + Location: 22,15 + Owner: Greece + +Smudges: + +Rules: + Player: + -ConquestVictoryConditions: + MissionObjectives: + EarlyGameOver: true + -EnemyWatcher: + World: + -CrateSpawner: + -SpawnMPUnits: + -MPStartLocations: + LuaScript: + Scripts: soviet06a.lua, soviet06a-AI.lua + ObjectivesPanel: + PanelName: MISSION_OBJECTIVES + ^Building: + Tooltip: + GenericVisibility: Enemy + ShowOwnerRow: false + ^Infantry: + Tooltip: + GenericVisibility: Enemy + ShowOwnerRow: false + ^Vehicle: + Tooltip: + GenericVisibility: Enemy + ShowOwnerRow: false + ^Ship: + Tooltip: + GenericVisibility: Enemy + ShowOwnerRow: false + ^Plane: + Tooltip: + GenericVisibility: Enemy + ShowOwnerRow: false + ^Wall: + Tooltip: + ShowOwnerRow: false + ^TechBuilding: + Tooltip: + ShowOwnerRow: false + ^Crate: + Tooltip: + ShowOwnerRow: false + ^Husk: + Tooltip: + GenericVisibility: Enemy, Ally, Neutral + GenericStancePrefix: false + ShowOwnerRow: false + APWR: + Buildable: + Prerequisites: ~disabled + ARTY: + Buildable: + Prerequisites: ~vehicles.allies, ~techlevel.low + BRIK: + Buildable: + Prerequisites: ~disabled + TSLA: + Buildable: + Prerequisites: ~disabled + SAM: + Buildable: + Prerequisites: ~disabled + IRON: + Buildable: + Prerequisites: ~disabled + MSLO: + Buildable: + Prerequisites: ~disabled + E3: + Buildable: + Prerequisites: ~tent + SHOK: + Buildable: + Prerequisites: ~disabled + SNIPER: + Buildable: + Prerequisites: ~disabled + HIJACKER: + Buildable: + Prerequisites: ~disabled + MIG: + Buildable: + Prerequisites: ~disabled + FTRK: + Buildable: + Prerequisites: ~disabled + 2TNK: + Buildable: + Prerequisites: ~vehicles.allies, ~techlevel.low + 4TNK: + Buildable: + Prerequisites: ~disabled + APC: + Buildable: + Prerequisites: ~disabled + TRUK: + -SpawnActorOnDeath: + -SupplyTruck: + Buildable: + Prerequisites: ~disabled + QTNK: + Buildable: + Prerequisites: ~disabled + MCV: + Buildable: + Prerequisites: ~disabled + MSUB: + Buildable: + Prerequisites: ~disabled + STEK: + Buildable: + Prerequisites: ~disabled + DOG: + Health: + HP: 25 + AutoTarget: + ScanRadius: 5 + HARV: + Harvester: + SearchFromProcRadius: 50 + SearchFromOrderRadius: 50 + AFLD: + ParatroopersPower@paratroopers: + DropItems: E1,E1,E1,E1,E1 + MONEYCRATE: + GiveCashCrateAction: + Amount: 2000 + V01: + SpawnActorOnDeath: + Actor: moneycrate + V05: + SpawnActorOnDeath: + Actor: healcrate + +Sequences: + +VoxelSequences: + +Weapons: + +Voices: + +Notifications: + +Translations: diff --git a/mods/ra/maps/soviet-06a/soviet06a-AI.lua b/mods/ra/maps/soviet-06a/soviet06a-AI.lua new file mode 100644 index 0000000000..048923d998 --- /dev/null +++ b/mods/ra/maps/soviet-06a/soviet06a-AI.lua @@ -0,0 +1,112 @@ +IdleHunt = function(unit) if not unit.IsDead then Trigger.OnIdle(unit, unit.Hunt) end end + +IdlingUnits = function() + local lazyUnits = enemy.GetGroundAttackers() + + Utils.Do(lazyUnits, function(unit) + Trigger.OnDamaged(unit, function() + Trigger.ClearAll(unit) + Trigger.AfterDelay(0, function() IdleHunt(unit) end) + end) + end) +end + +BaseBuildings = +{ + { "apwr", CVec.New(-13, 7), 500, true }, + { "tent", CVec.New(-2, 12), 400, true }, + { "proc", CVec.New(-7, 5), 1400, true }, + { "weap", CVec.New(-9, 11), 2000, true }, + { "apwr", CVec.New(-4, 1), 500, true } +} + +BuildBase = function() + if CYard.IsDead or CYard.Owner ~= enemy then + return + elseif Harvester.IsDead and enemy.Resources <= 299 then + return + end + + for i,v in ipairs(BaseBuildings) do + if not v[4] then + BuildBuilding(v) + return + end + end + + Trigger.AfterDelay(DateTime.Seconds(10), BuildBase) +end + +BuildBuilding = function(building) + Trigger.AfterDelay(Actor.BuildTime(building[1]), function() + local actor = Actor.Create(building[1], true, { Owner = enemy, Location = CYardLocation.Location + building[2] }) + enemy.Cash = enemy.Cash - building[3] + + building[4] = true + Trigger.OnKilled(actor, function() building[4] = true end) + Trigger.OnDamaged(actor, function(building) + if building.Owner == enemy and building.Health < building.MaxHealth * 3/4 then + building.StartBuildingRepairs() + end + end) + + Trigger.AfterDelay(DateTime.Seconds(10), BuildBase) + end) +end + +ProduceInfantry = function() + if not BaseBuildings[2][4] then + return + elseif Harvester.IsDead and enemy.Resources <= 299 then + return + end + + local delay = Utils.RandomInteger(DateTime.Seconds(3), DateTime.Seconds(9)) + local toBuild = { Utils.Random(AlliedInfantryTypes) } + local Path = Utils.Random(AttackPaths) + enemy.Build(toBuild, function(unit) + InfAttack[#InfAttack + 1] = unit[1] + + if #InfAttack >= 10 then + SendUnits(InfAttack, Path) + InfAttack = { } + Trigger.AfterDelay(DateTime.Minutes(2), ProduceInfantry) + else + Trigger.AfterDelay(delay, ProduceInfantry) + end + end) +end + +ProduceArmor = function() + if not BaseBuildings[4][4] then + return + elseif Harvester.IsDead and enemy.Resources <= 599 then + return + end + + local delay = Utils.RandomInteger(DateTime.Seconds(12), DateTime.Seconds(17)) + local toBuild = { Utils.Random(AlliedArmorTypes) } + local Path = Utils.Random(AttackPaths) + enemy.Build(toBuild, function(unit) + ArmorAttack[#ArmorAttack + 1] = unit[1] + + if #ArmorAttack >= 6 then + SendUnits(ArmorAttack, Path) + ArmorAttack = { } + Trigger.AfterDelay(DateTime.Minutes(3), ProduceArmor) + else + Trigger.AfterDelay(delay, ProduceArmor) + end + end) +end + +SendUnits = function(units, waypoints) + Utils.Do(units, function(unit) + if not unit.IsDead then + Utils.Do(waypoints, function(waypoint) + unit.AttackMove(waypoint.Location) + end) + IdleHunt(unit) + end + end) +end diff --git a/mods/ra/maps/soviet-06a/soviet06a.lua b/mods/ra/maps/soviet-06a/soviet06a.lua new file mode 100644 index 0000000000..90ca88008a --- /dev/null +++ b/mods/ra/maps/soviet-06a/soviet06a.lua @@ -0,0 +1,142 @@ +ArmorAttack = { } +AttackPaths = { { AttackWaypoint1 }, { AttackWaypoint2 } } +BaseAttackers = { BaseAttacker1, BaseAttacker2 } +InfAttack = { } +IntroAttackers = { IntroEnemy1, IntroEnemy2, IntroEnemy3 } +Trucks = { Truck1, Truck2 } + +AlliedInfantryTypes = { "e1", "e1", "e3" } +AlliedArmorTypes = { "jeep", "jeep", "1tnk", "1tnk", "2tnk", "2tnk", "arty" } + +SovietReinforcements1 = { "e6", "e6", "e6", "e6", "e6" } +SovietReinforcements2 = { "e4", "e4", "e2", "e2", "e2" } +SovietReinforcements1Waypoints = { McvWaypoint.Location, APCWaypoint1.Location } +SovietReinforcements2Waypoints = { McvWaypoint.Location, APCWaypoint2.Location } + +TruckGoalTrigger = { CPos.New(83, 7), CPos.New(83, 8), CPos.New(83, 9), CPos.New(83, 10), CPos.New(84, 10), CPos.New(84, 11), CPos.New(84, 12), CPos.New(85, 12), CPos.New(86, 12), CPos.New(87, 12), CPos.New(87, 13), CPos.New(88, 13), CPos.New(89, 13), CPos.New(90, 13), CPos.New(90, 14), CPos.New(90, 15), CPos.New(91, 15), CPos.New(92, 15), CPos.New(93, 15), CPos.New(94, 15) } +CameraBarrierTrigger = { CPos.New(65, 39), CPos.New(65, 40), CPos.New(66, 40), CPos.New(66, 41), CPos.New(67, 41), CPos.New(67, 42), CPos.New(68, 42), CPos.New(68, 43), CPos.New(68, 44) } +CameraBaseTrigger = { CPos.New(53, 42), CPos.New(54, 42), CPos.New(54, 41), CPos.New(55, 41), CPos.New(56, 41), CPos.New(56, 40), CPos.New(57, 40), CPos.New(57, 39), CPos.New(58, 39), CPos.New(59, 39), CPos.New(59, 38), CPos.New(60, 38), CPos.New(61, 38) } + +Trigger.OnEnteredFootprint(TruckGoalTrigger, function(a, id) + if not truckGoalTrigger and a.Owner == player and a.Type == "truk" then + truckGoalTrigger = true + player.MarkCompletedObjective(sovietObjective) + end +end) + +Trigger.OnEnteredFootprint(CameraBarrierTrigger, function(a, id) + if not cameraBarrierTrigger and a.Owner == player then + cameraBarrierTrigger = true + local cameraBarrier = Actor.Create("camera", true, { Owner = player, Location = CameraBarrier.Location }) + Trigger.AfterDelay(DateTime.Seconds(15), function() + cameraBarrier.Kill() + end) + end +end) + +Trigger.OnEnteredFootprint(CameraBaseTrigger, function(a, id) + if not cameraBaseTrigger and a.Owner == player then + cameraBaseTrigger = true + local cameraBase1 = Actor.Create("camera", true, { Owner = player, Location = CameraBase1.Location }) + local cameraBase2 = Actor.Create("camera", true, { Owner = player, Location = CameraBase2.Location }) + local cameraBase3 = Actor.Create("camera", true, { Owner = player, Location = CameraBase3.Location }) + local cameraBase4 = Actor.Create("camera", true, { Owner = player, Location = CameraBase4.Location }) + Trigger.AfterDelay(DateTime.Minutes(1), function() + cameraBase1.Kill() + cameraBase2.Kill() + cameraBase3.Kill() + cameraBase4.Kill() + end) + end +end) + +Trigger.OnAllKilled(Trucks, function() + if not controlCenterTrigger then + enemy.MarkCompletedObjective(alliedObjective) + end +end) + +Trigger.OnKilled(Apwr, function(building) + BaseBuildings[1][4] = false +end) + +Trigger.OnKilled(Barr, function(building) + BaseBuildings[2][4] = false +end) + +Trigger.OnKilled(Proc, function(building) + BaseBuildings[3][4] = false +end) + +Trigger.OnKilled(Weap, function(building) + BaseBuildings[4][4] = false +end) + +Trigger.OnKilled(Apwr2, function(building) + BaseBuildings[5][4] = false +end) + +-- Activate the AI once the player deployed the Mcv +Trigger.OnRemovedFromWorld(Mcv, function() + if not mcvDeployed then + mcvDeployed = true + BuildBase() + Trigger.AfterDelay(DateTime.Minutes(1), ProduceInfantry) + Trigger.AfterDelay(DateTime.Minutes(2), ProduceArmor) + Trigger.AfterDelay(DateTime.Minutes(2), function() + Utils.Do(BaseAttackers, function(actor) + IdleHunt(actor) + end) + end) + end +end) + +WorldLoaded = function() + player = Player.GetPlayer("USSR") + enemy = Player.GetPlayer("Greece") + Camera.Position = CameraStart.CenterPosition + Mcv.Move(McvWaypoint.Location) + Harvester.FindResources() + Utils.Do(IntroAttackers, function(actor) + IdleHunt(actor) + end) + Utils.Do(Map.NamedActors, function(actor) + if actor.Owner == enemy and actor.HasProperty("StartBuildingRepairs") then + Trigger.OnDamaged(actor, function(building) + if building.Owner == enemy and building.Health < 3/4 * building.MaxHealth then + building.StartBuildingRepairs() + end + end) + end + end) + Reinforcements.ReinforceWithTransport(player, "apc", SovietReinforcements1, SovietReinforcements1Waypoints) + Reinforcements.ReinforceWithTransport(player, "apc", SovietReinforcements2, SovietReinforcements2Waypoints) + Trigger.OnObjectiveAdded(player, function(p, id) + Media.DisplayMessage(p.GetObjectiveDescription(id), "New " .. string.lower(p.GetObjectiveType(id)) .. " objective") + end) + Trigger.OnObjectiveCompleted(player, function(p, id) + Media.DisplayMessage(p.GetObjectiveDescription(id), "Objective completed") + end) + Trigger.OnObjectiveFailed(player, function(p, id) + Media.DisplayMessage(p.GetObjectiveDescription(id), "Objective failed") + end) + Trigger.OnPlayerWon(player, function() + Media.PlaySpeechNotification(player, "Win") + end) + Trigger.OnPlayerLost(player, function() + Media.PlaySpeechNotification(player, "Lose") + end) + alliedObjective = enemy.AddPrimaryObjective("Destroy all Soviet troops.") + sovietObjective = player.AddPrimaryObjective("Escort the Convoy.") +end + +Tick = function() + if player.HasNoRequiredUnits() then + enemy.MarkCompletedObjective(alliedObjective) + end + + if enemy.Resources >= enemy.ResourceCapacity * 0.75 then + enemy.Cash = enemy.Cash + enemy.Resources - enemy.ResourceCapacity * 0.25 + enemy.Resources = enemy.ResourceCapacity * 0.25 + end +end diff --git a/mods/ra/missions.yaml b/mods/ra/missions.yaml index 63aeea6c27..fc3010e951 100644 --- a/mods/ra/missions.yaml +++ b/mods/ra/missions.yaml @@ -12,4 +12,5 @@ Soviet Campaign: ./mods/ra/maps/soviet-04a ./mods/ra/maps/soviet-04b ./mods/ra/maps/soviet-05 + ./mods/ra/maps/soviet-06a ./mods/ra/maps/soviet-07