diff --git a/mods/ra/maps/soviet-05/AI.lua b/mods/ra/maps/soviet-05/AI.lua new file mode 100644 index 0000000000..ca8ac23a17 --- /dev/null +++ b/mods/ra/maps/soviet-05/AI.lua @@ -0,0 +1,159 @@ +IdleHunt = function(unit) if not unit.IsDead then Trigger.OnIdle(unit, unit.Hunt) end end + +IdlingUnits = function() + local lazyUnits = Map.ActorsInBox(NWIdlePoint.CenterPosition, Map.BottomRight, function(actor) + return actor.HasProperty("Hunt") and (actor.Owner == GoodGuy or actor.Owner == Greece) end) + + Utils.Do(lazyUnits, function(unit) + Trigger.OnDamaged(unit, function() + Trigger.ClearAll(unit) + Trigger.AfterDelay(0, function() IdleHunt(unit) end) + end) + end) +end + +BaseBuildings = { + { "powr", CVec.New(3, -2), 300 }, + { "tent", CVec.New(0, 4), 400 }, + { "hbox", CVec.New(3, 6), 600 }, + { "proc", CVec.New(4, 2), 1400 }, + { "powr", CVec.New(5, -3), 300 }, + { "weap", CVec.New(-5, 3), 2000 }, + { "hbox", CVec.New(-6, 5), 600 }, + { "gun", CVec.New(0, 8), 600 }, + { "gun", CVec.New(-4, 7), 600 }, + { "powr", CVec.New(-4, -3), 300 }, + { "proc", CVec.New(-9, 1), 1400 }, + { "powr", CVec.New(-8, -2), 300 }, + { "silo", CVec.New(6, 0), 150 }, + { "agun", CVec.New(-3, 0), 800 }, + { "powr", CVec.New(-6, -2), 300 }, + { "agun", CVec.New(4, 1), 800 }, + { "gun", CVec.New(-9, 5), 600 }, + { "gun", CVec.New(-2, -3), 600 }, + { "powr", CVec.New(4, 6), 300 }, + { "gun", CVec.New(3, -6), 600 }, + { "hbox", CVec.New(3, -4), 600 }, + { "gun", CVec.New(2, 3), 600 } +} + +BuildBase = function() + if not CheckForCYard() then + return + end + + for i,v in ipairs(BaseBuildings) do + if not v[4] then + BuildBuilding(v) + return + end + end + + Trigger.AfterDelay(DateTime.Seconds(5), BuildBase) +end + +BuildBuilding = function(building) + Trigger.AfterDelay(Actor.BuildTime(building[1]), function() + local actor = Actor.Create(building[1], true, { Owner = GoodGuy, Location = MCVDeploy.Location + building[2] }) + GoodGuy.Cash = GoodGuy.Cash - building[3] + + building[4] = true + Trigger.OnKilled(actor, function() building[4] = false end) + Trigger.OnDamaged(actor, function(building) + if building.Owner == GoodGuy and building.Health < building.MaxHealth * 3/4 then + building.StartBuildingRepairs() + end + end) + + Trigger.AfterDelay(DateTime.Seconds(1), BuildBase) + end) +end + +ProduceInfantry = function() + if Barr.IsDead then + return + end + + local delay = Utils.RandomInteger(DateTime.Seconds(3), DateTime.Seconds(9)) + local toBuild = { Utils.Random(AlliedInfantryTypes) } + Greece.Build(toBuild, function(unit) + GreeceInfAttack[#GreeceInfAttack + 1] = unit[1] + + if #GreeceInfAttack >= 7 then + SendUnits(GreeceInfAttack, InfantryWaypoints) + GreeceInfAttack = { } + Trigger.AfterDelay(DateTime.Minutes(2), ProduceInfantry) + else + Trigger.AfterDelay(delay, ProduceInfantry) + end + end) +end + +ProduceShips = function() + if Shipyard.IsDead then + return + end + + Greece.Build( {"dd"}, function(unit) + Ships[#Ships + 1] = unit[1] + + if #Ships >= 2 then + SendUnits(Ships, ShipWaypoints) + Ships = { } + Trigger.AfterDelay(DateTime.Minutes(6), ProduceShips) + else + Trigger.AfterDelay(Actor.BuildTime("dd"), ProduceShips) + end + end) +end + +ProduceInfantryGG = function() + if not BaseBuildings[2][4] then + return + end + + local delay = Utils.RandomInteger(DateTime.Seconds(3), DateTime.Seconds(9)) + local toBuild = { Utils.Random(AlliedInfantryTypes) } + GoodGuy.Build(toBuild, function(unit) + GGInfAttack[#GGInfAttack + 1] = unit[1] + + if #GGInfAttack >= 10 then + SendUnits(GGInfAttack, InfantryGGWaypoints) + GGInfAttack = { } + Trigger.AfterDelay(DateTime.Minutes(2), ProduceInfantryGG) + else + Trigger.AfterDelay(delay, ProduceInfantryGG) + end + end) +end + +ProduceTanksGG = function() + if not BaseBuildings[6][4] then + return + end + + local delay = Utils.RandomInteger(DateTime.Seconds(12), DateTime.Seconds(17)) + local toBuild = { Utils.Random(AlliedTankTypes) } + GoodGuy.Build(toBuild, function(unit) + TankAttackGG[#TankAttackGG + 1] = unit[1] + + if #TankAttackGG >= 6 then + SendUnits(TankAttackGG, TanksGGWaypoints) + TankAttackGG = { } + Trigger.AfterDelay(DateTime.Minutes(3), ProduceTanksGG) + else + Trigger.AfterDelay(delay, ProduceTanksGG) + 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) + unit.Hunt() + end + end) +end diff --git a/mods/ra/maps/soviet-05/main.lua b/mods/ra/maps/soviet-05/main.lua new file mode 100644 index 0000000000..3a2b82dc58 --- /dev/null +++ b/mods/ra/maps/soviet-05/main.lua @@ -0,0 +1,276 @@ +CheckForBase = function() + baseBuildings = Map.ActorsInBox(Map.TopLeft, CFBPoint.CenterPosition, function(actor) + return actor.Type == "fact" or actor.Type == "powr" + end) + + return #baseBuildings >= 2 +end + +CheckForCYard = function() + ConYard = Map.ActorsInBox(mcvGGLoadPoint.CenterPosition, ReinfEastPoint.CenterPosition, function(actor) + return actor.Type == "fact" and actor.Owner == GoodGuy + end) + + return #ConYard >= 1 +end + +CheckForSPen = function() + SPens = Map.ActorsInBox(Map.TopLeft, Map.BottomRight, function(actor) + return actor.Type == "spen" + end) + + return #SPens >=1 +end + +RunInitialActivities = function() + if Map.Difficulty == "Hard" then + Expand() + ExpansionCheck = true + else + ExpansionCheck = false + end + + Trigger.AfterDelay(1, function() + Harvester.FindResources() + Helper.Destroy() + IdlingUnits() + Media.PlaySpeechNotification(player, "ReinforcementsArrived") + + local buildings = Map.ActorsInBox(NWIdlePoint.CenterPosition, Map.BottomRight, function(self) return self.Owner == Greece and self.HasProperty("StartBuildingRepairs") end) + Utils.Do(buildings, function(actor) + Trigger.OnDamaged(actor, function(building) + if building.Owner == Greece and building.Health < building.MaxHealth * 3/4 then + building.StartBuildingRepairs() + end + end) + end) + end) + + Reinforcements.Reinforce(player, SovietStartReinf, SovietStartToBasePath, 0, function(soldier) + soldier.AttackMove(SovietBasePoint.Location) + end) + + Actor.Create("camera", true, { Owner = player, Location = GreeceBasePoint.Location }) + Actor.Create("camera", true, { Owner = player, Location = SovietBasePoint.Location }) + + startmcv.Move(MCVStartMovePoint.Location) + Runner1.Move(RunnerPoint.Location) + Runner2.Move(RunnerPoint.Location) + Runner3.Move(RunnerPoint.Location) + + ProduceInfantry() + Trigger.AfterDelay(DateTime.Minutes(2), ProduceShips) + + if Map.Difficulty == "Hard" or Map.Difficulty == "Medium" then + Trigger.AfterDelay(DateTime.Seconds(25), ReinfInf) + end + Trigger.AfterDelay(DateTime.Minutes(2), ReinfInf) + Trigger.AfterDelay(DateTime.Minutes(3), BringDDPatrol2) + Trigger.AfterDelay(DateTime.Minutes(5), ReinfInf) + Trigger.AfterDelay(DateTime.Minutes(6), BringDDPatrol1) +end + +Expand = function() + if ExpansionCheck then + return + elseif mcvtransport.IsDead then + return + elseif mcvGG.IsDead then + return + end + + mcvGG.Move(mcvGGLoadPoint.Location) + mcvtransport.Move(lstBeachPoint.Location) + + Reinforcements.Reinforce(GoodGuy, { "dd", "dd" }, ShipArrivePath, 0, function(ddsquad) + ddsquad.AttackMove(NearExpPoint.Location) end) + + ExpansionCheck = true + Trigger.ClearAll(mcvGG) + Trigger.ClearAll(mcvtransport) + Trigger.AfterDelay(DateTime.Seconds(3), function() + if mcvtransport.IsDead then + return + elseif mcvGG.IsDead then + return + end + + mcvGG.IsInWorld = false + mcvtransport.LoadPassenger(mcvGG) + mcvtransport.Move(GGUnloadPoint.Location) + mcvtransport.UnloadPassengers() + Trigger.AfterDelay(DateTime.Seconds(12), function() + if mcvGG.IsDead then + return + end + + mcvGG.Move(MCVDeploy.Location) + Trigger.AfterDelay(DateTime.Seconds(4), function() + if not mcvGG.IsDead then + mcvGG.Deploy() + Trigger.AfterDelay(DateTime.Seconds(4), function() + local fact = Map.ActorsInBox(mcvGGLoadPoint.CenterPosition, ReinfEastPoint.CenterPosition, function(actor) + return actor.Type == "fact" and actor.Owner == GoodGuy end) + if #fact == 0 then + return + else + Trigger.OnDamaged(fact[1], function() + if fact[1].Owner == GoodGuy and fact[1].Health < fact[1].MaxHealth * 3/4 then + fact[1].StartBuildingRepairs() + end + end) + end + end) + + IslandTroops1() + Trigger.AfterDelay(DateTime.Minutes(3), IslandTroops2) + Trigger.AfterDelay(DateTime.Minutes(6), IslandTroops3) + Trigger.AfterDelay(DateTime.Seconds(7), BuildBase) + end + + if not mcvtransport.IsDead then + mcvtransport.Move(ReinfNorthPoint.Location) + mcvtransport.Destroy() + end + end) + end) + end) +end + +Tick = function() + if Greece.HasNoRequiredUnits() and GoodGuy.HasNoRequiredUnits() then + player.MarkCompletedObjective(KillAll) + player.MarkCompletedObjective(HoldObjective) + end + + if player.HasNoRequiredUnits() then + GoodGuy.MarkCompletedObjective(BeatUSSR) + end + + if Greece.Resources >= Greece.ResourceCapacity * 0.75 then + Greece.Cash = Greece.Cash + Greece.Resources - Greece.ResourceCapacity * 0.25 + Greece.Resources = Greece.ResourceCapacity * 0.25 + end + + if GoodGuy.Resources >= GoodGuy.ResourceCapacity * 0.75 then + GoodGuy.Cash = GoodGuy.Cash + GoodGuy.Resources - GoodGuy.ResourceCapacity * 0.25 + GoodGuy.Resources = GoodGuy.ResourceCapacity * 0.25 + end + + if not baseEstablished and CheckForBase() then + baseEstablished = true + Para() + end + + if not SPenEstablished and CheckForSPen() then + SPenEstablished = true + + local units = Reinforcements.ReinforceWithTransport(Greece, "lst", ArtyReinf, SouthReinfPath, { ReinfEastPoint.Location })[2] + Utils.Do(units, function(unit) IdleHunt(unit) end) + if not ExpansionCheck then + Expand() + ExpansionCheck = true + end + end + + if not RCheck then + RCheck = true + if Map.Difficulty == "Easy" and ReinfCheck then + Trigger.AfterDelay(DateTime.Minutes(6), ReinfArmor) + elseif Map.Difficulty == "Medium" then + Trigger.AfterDelay(DateTime.Minutes(4), ReinfArmor) + else + Trigger.AfterDelay(DateTime.Minutes(3), ReinfArmor) + end + end +end + +WorldLoaded = function() + player = Player.GetPlayer("USSR") + GoodGuy = Player.GetPlayer("GoodGuy") + Greece = Player.GetPlayer("Greece") + + RunInitialActivities() + + 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") + Media.PlaySpeechNotification(player, "ObjectiveMet") + end) + Trigger.OnObjectiveFailed(player, function(p, id) + Media.DisplayMessage(p.GetObjectiveDescription(id), "Objective failed") + end) + + CaptureObjective = player.AddPrimaryObjective("Capture the Radar Dome.") + KillAll = player.AddPrimaryObjective("Defeat the Allied forces.") + BeatUSSR = GoodGuy.AddPrimaryObjective("Defeat the Soviet forces.") + + Trigger.OnDamaged(mcvGG, Expand) + Trigger.OnDamaged(mcvtransport, Expand) + + Trigger.OnKilled(Radar, function() + player.MarkFailedObjective(CaptureObjective) + end) + + Trigger.OnCapture(Radar, function(self, captor) + if captor.Owner ~= player then + return + end + + HoldObjective = player.AddPrimaryObjective("Defend the Radar Dome.") + player.MarkCompletedObjective(CaptureObjective) + + if not ExpansionCheck then + Expand() + ExpansionCheck = true + end + + Reinforcements.Reinforce(Greece, ArmorReinfGreece, AlliedCrossroadsToRadarPath , 0, function(soldier) + soldier.Hunt() + end) + + Trigger.AfterDelay(1, function() + local newRadar = Actor.Create("dome", true, { Owner = player, Location = Radar.Location }) + newRadar.Health = Radar.Health + Radar.Destroy() + Trigger.OnKilled(newRadar, function() + player.MarkFailedObjective(HoldObjective) + end) + end) + end) + + Trigger.OnEnteredProximityTrigger(USSRExpansionPoint.CenterPosition, WRange.New(4 * 1024), function(unit, id) + if unit.Owner == player and Radar.Owner == player then + Trigger.RemoveProximityTrigger(id) + + Para2() + ProduceInfantryGG() + ProduceTanksGG() + + local units = Reinforcements.ReinforceWithTransport(player, "lst", SovietMCVReinf, { ReinfSouthPoint.Location, USSRlstPoint.Location }, { ReinfSouthPoint.Location })[2] + Utils.Do(units, function(unit) + Trigger.OnAddedToWorld(unit, function() + if unit.Type == "mcv" then + unit.Move(USSRExpansionPoint.Location) + else + unit.AttackMove(USSRExpansionPoint.Location) + end + end) + end) + + Media.PlaySpeechNotification(player, "ReinforcementsArrived") + end + end) + + Trigger.OnPlayerLost(player, function() + Media.PlaySpeechNotification(player, "Lose") + end) + + Trigger.OnPlayerWon(player, function() + Media.PlaySpeechNotification(player, "Win") + end) + + Camera.Position = StartCamPoint.CenterPosition +end diff --git a/mods/ra/maps/soviet-05/map.bin b/mods/ra/maps/soviet-05/map.bin new file mode 100644 index 0000000000..68e748cc93 Binary files /dev/null and b/mods/ra/maps/soviet-05/map.bin differ diff --git a/mods/ra/maps/soviet-05/map.png b/mods/ra/maps/soviet-05/map.png new file mode 100644 index 0000000000..e92632f70f Binary files /dev/null and b/mods/ra/maps/soviet-05/map.png differ diff --git a/mods/ra/maps/soviet-05/map.yaml b/mods/ra/maps/soviet-05/map.yaml new file mode 100644 index 0000000000..b085344d63 --- /dev/null +++ b/mods/ra/maps/soviet-05/map.yaml @@ -0,0 +1,744 @@ +MapFormat: 7 + +RequiresMod: ra + +Title: Soviet 05: Distant Thunder + +Description: Khalkis island contains a large quantity of ore that we need.\n\nThe Allies are well aware of our plans, and intend to establish their own base there. See to it that they fail.\n\nIn addition, capture their radar center so we can track Allied activity in this area. + +Author: Westwood Studios + +Tileset: TEMPERAT + +MapSize: 128,128 + +Bounds: 20,42,90,50 + +Visibility: MissionSelector + +Type: Campaign + +Videos: + Briefing: soviet5.vqa + GameStart: double.vqa + GameWon: strafe.vqa + GameLost: sovbatl.vqa + +Options: + Crates: False + Fog: True + Shroud: True + AllyBuildRadius: False + FragileAlliances: False + StartingCash: 5000 + TechLevel: Medium + ConfigurableStartingUnits: False + Difficulties: Easy, Normal, Hard + ShortGame: False + +Players: + PlayerReference@Neutral: + Name: Neutral + OwnsWorld: True + NonCombatant: True + Race: england + PlayerReference@Creeps: + Name: Creeps + NonCombatant: True + Race: england + PlayerReference@Greece: + Name: Greece + Race: allies + ColorRamp: 161,134,236 + Allies: GoodGuy + Enemies: USSR + PlayerReference@USSR: + Name: USSR + Race: soviet + Playable: True + AllowBots: False + Required: True + LockRace: True + LockColor: True + ColorRamp: 3,255,127 + LockSpawn: True + LockTeam: True + Enemies: Greece, GoodGuy + PlayerReference@GoodGuy: + Name: GoodGuy + Race: allies + ColorRamp: 161,134,236 + Allies: Greece + Enemies: USSR + +Actors: + Actor0: sbag + Location: 60,42 + Owner: Neutral + Actor1: sbag + Location: 61,42 + Owner: Neutral + Actor2: sbag + Location: 60,43 + Owner: Neutral + Actor3: sbag + Location: 60,44 + Owner: Neutral + Actor4: sbag + Location: 60,48 + Owner: Neutral + Actor5: sbag + Location: 60,49 + Owner: Neutral + Actor6: sbag + Location: 60,50 + Owner: Neutral + Actor7: sbag + Location: 61,50 + Owner: Neutral + Actor8: tc01 + Location: 33,41 + Owner: Neutral + Actor9: tc03 + Location: 20,52 + Owner: Neutral + Actor10: tc02 + Location: 24,62 + Owner: Neutral + Actor11: t06 + Location: 62,84 + Owner: Neutral + Actor12: t07 + Location: 85,78 + Owner: Neutral + Actor13: t14 + Location: 84,77 + Owner: Neutral + Actor14: t12 + Location: 95,77 + Owner: Neutral + Actor15: t07 + Location: 78,77 + Owner: Neutral + Actor16: t02 + Location: 81,74 + Owner: Neutral + Actor17: t16 + Location: 46,79 + Owner: Neutral + Actor18: tc03 + Location: 47,78 + Owner: Neutral + Actor19: t10 + Location: 45,78 + Owner: Neutral + Actor20: t14 + Location: 45,77 + Owner: Neutral + Actor21: t17 + Location: 45,76 + Owner: Neutral + Actor22: t08 + Location: 60,83 + Owner: Neutral + Actor23: t17 + Location: 81,71 + Owner: Neutral + Actor24: tc02 + Location: 45,48 + Owner: Neutral + Actor25: tc01 + Location: 32,90 + Owner: Neutral + Actor26: tc03 + Location: 33,89 + Owner: Neutral + Actor27: tc05 + Location: 20,83 + Owner: Neutral + Actor28: t11 + Location: 25,88 + Owner: Neutral + Actor29: t17 + Location: 20,90 + Owner: Neutral + Actor30: tc01 + Location: 24,90 + Owner: Neutral + Actor31: tc04 + Location: 23,89 + Owner: Neutral + Actor32: tc05 + Location: 20,89 + Owner: Neutral + Actor33: t01 + Location: 28,47 + Owner: Neutral + Actor34: t05 + Location: 24,42 + Owner: Neutral + Actor35: tc04 + Location: 36,54 + Owner: Neutral + Actor36: tc01 + Location: 36,51 + Owner: Neutral + Actor37: tc02 + Location: 61,42 + Owner: Neutral + Actor38: tc02 + Location: 63,70 + Owner: Neutral + Actor39: t12 + Location: 73,79 + Owner: Neutral + Actor40: tc03 + Location: 82,64 + Owner: Neutral + Actor41: t03 + Location: 46,58 + Owner: Neutral + Actor42: tc05 + Location: 57,50 + Owner: Neutral + Actor43: t16 + Location: 59,41 + Owner: Neutral + Actor44: tc01 + Location: 56,51 + Owner: Neutral + Actor45: t11 + Location: 47,48 + Owner: Neutral + Actor46: t05 + Location: 51,48 + Owner: Neutral + Actor47: mine + Location: 27,48 + Owner: Neutral + Actor48: t01 + Location: 71,81 + Owner: Neutral + Actor49: t02 + Location: 71,82 + Owner: Neutral + Actor50: t02 + Location: 81,61 + Owner: Neutral + Actor51: t03 + Location: 80,57 + Owner: Neutral + Actor52: t05 + Location: 80,58 + Owner: Neutral + Actor53: tc01 + Location: 78,61 + Owner: Neutral + Actor54: agun + Location: 73,45 + Owner: Greece + Actor55: gun + Location: 69,49 + Owner: Greece + Facing: 32 + Radar: dome.ignore + Location: 70,45 + Owner: Greece + Actor57: fact + Location: 67,42 + Owner: Greece + Actor58: powr + Location: 74,47 + Owner: Greece + Actor59: brl3 + Location: 66,42 + Owner: Greece + Actor60: brl3 + Location: 71,42 + Owner: Greece + Actor61: brl3 + Location: 71,43 + Owner: Greece + Actor62: brl3 + Location: 76,43 + Owner: Greece + Actor63: barl + Location: 71,44 + Owner: Greece + Actor64: brl3 + Location: 73,47 + Owner: Greece + Actor65: barl + Location: 66,43 + Owner: Greece + Actor66: brl3 + Location: 70,42 + Owner: Greece + Actor67: gun + Location: 61,44 + Owner: Greece + Facing: 192 + Actor68: gun + Location: 61,48 + Owner: Greece + Facing: 160 + Actor69: agun + Location: 68,46 + Owner: Greece + Actor70: proc + Location: 63,42 + Owner: Greece + FreeActor: False + Barr: tent + Location: 63,47 + Owner: Greece + Shipyard: syrd + Location: 78,48 + Owner: Greece + Actor73: powr + Location: 74,42 + Owner: Greece + Actor74: powr + Location: 72,42 + Owner: Greece + Actor75: powr + Location: 72,48 + Owner: Greece + startmcv: mcv + Location: 22,80 + Owner: USSR + Facing: 192 + Actor77: 2tnk + Location: 59,43 + Owner: Greece + Facing: 32 + TurretFacing: 32 + Actor78: 1tnk + Location: 58,48 + Owner: Greece + Facing: 32 + TurretFacing: 32 + Actor79: 1tnk + Location: 57,44 + Owner: Greece + Facing: 96 + TurretFacing: 96 + Actor80: 1tnk + Location: 67,49 + Owner: Greece + Facing: 224 + TurretFacing: 224 + Harvester: harv + Location: 45,45 + Owner: Greece + Facing: 96 + mcvGG: mcv + Location: 75,46 + Owner: GoodGuy + Facing: 192 + Actor83: 1tnk + Location: 43,47 + Owner: Greece + Facing: 224 + TurretFacing: 64 + Actor84: e1 + Location: 61,45 + Owner: Greece + Facing: 160 + SubCell: 1 + Actor85: e1 + Location: 62,46 + Owner: Greece + Facing: 160 + SubCell: 0 + Actor86: e1 + Location: 61,49 + Owner: Greece + Facing: 224 + SubCell: 2 + Runner1: e1 + Location: 25,75 + Owner: GoodGuy + SubCell: 0 + Runner2: e1 + Location: 25,76 + Owner: GoodGuy + SubCell: 2 + Runner3: e1 + Location: 26,75 + Owner: GoodGuy + SubCell: 0 + Actor90: e1 + Location: 64,49 + Owner: Greece + Facing: 96 + SubCell: 2 + Actor91: e3 + Location: 66,44 + Owner: Greece + Facing: 160 + SubCell: 4 + Actor92: e3 + Location: 63,49 + Owner: Greece + Facing: 160 + SubCell: 4 + Actor93: e1 + Location: 58,46 + Owner: Greece + Facing: 160 + SubCell: 2 + Actor94: e1 + Location: 60,48 + Owner: Greece + SubCell: 2 + Actor96: e3 + Location: 41,45 + Owner: Greece + SubCell: 4 + Facing: 64 + TurretFacing: 128 + Actor97: e3 + Location: 41,44 + Owner: Greece + SubCell: 1 + Facing: 96 + TurretFacing: 160 + Actor98: e3 + Location: 40,45 + Owner: Greece + SubCell: 4 + Facing: 64 + TurretFacing: 160 + Actor99: e3 + Location: 40,43 + Owner: Greece + SubCell: 1 + Facing: 96 + TurretFacing: 160 + Actor100: e1 + Location: 39,45 + Owner: Greece + Facing: 160 + SubCell: 0 + Actor101: e1 + Location: 39,44 + Owner: Greece + SubCell: 1 + Facing: 96 + TurretFacing: 192 + Minelayer: mnly.at + Owner: GoodGuy + Location: 67,45 + Facing: 92 + Actor166: pt + Owner: GoodGuy + Location: 67,54 + Facing: 92 + TurretFacing: 92 + Actor167: pt + Owner: GoodGuy + Location: 67,59 + Facing: 60 + TurretFacing: 60 + Actor168: pt + Owner: GoodGuy + Location: 83,56 + Facing: 28 + TurretFacing: 28 + Actor169: pt + Owner: GoodGuy + Location: 83,51 + Facing: 92 + TurretFacing: 92 + mcvtransport: lst + Owner: GoodGuy + Location: 80,45 + Facing: 92 + Actor171: dd + Owner: GoodGuy + Location: 91,51 + Facing: 28 + TurretFacing: 28 + Actor172: dd + Owner: GoodGuy + Location: 84,44 + Facing: 92 + TurretFacing: 92 + Actor173: dd + Owner: GoodGuy + Location: 96,44 + Facing: 92 + TurretFacing: 92 + Actor174: pt + Owner: GoodGuy + Location: 96,51 + Facing: 92 + TurretFacing: 92 + Actor175: dd + Owner: GoodGuy + Location: 101,49 + Facing: 60 + TurretFacing: 60 + Actor176: pt + Owner: GoodGuy + Location: 107,70 + Facing: 188 + TurretFacing: 188 + Actor177: pt + Owner: GoodGuy + Location: 58,89 + Facing: 60 + TurretFacing: 60 + Helper: proc + Owner: Greece + Location: 42,42 + FreeActor: False + Actor181: mine + Owner: Neutral + Location: 63,65 + Actor182: mine + Owner: Neutral + Location: 81,78 + StartPoint: waypoint + Location: 20,80 + Owner: Neutral + SovietBasePoint: waypoint + Location: 24,77 + Owner: Neutral + MCVStartMovePoint: waypoint + Location: 28,76 + Owner: Neutral + CrossroadPoint: waypoint + Location: 52,46 + Owner: Neutral + GreeceBaseEPoint: waypoint + Location: 60,46 + Owner: Neutral + NReinfPathPoint1: waypoint + Location: 107,68 + Owner: Neutral + SReinfPathPoint1: waypoint + Location: 100,81 + Owner: Neutral + SReinfPathPoint2: waypoint + Location: 83,90 + Owner: Neutral + NearExpPoint: waypoint + Location: 94,49 + Owner: Neutral + CoastGuardPoint: waypoint + Location: 96,56 + Owner: Neutral + MCVDeploy: waypoint + Location: 96,60 + Owner: Neutral + ReinfSouthPoint: waypoint + Location: 44,91 + Owner: Neutral + WIslandPoint: waypoint + Location: 41,61 + Owner: Neutral + NearDockPoint: waypoint + Location: 85,46 + Owner: Neutral + SReinfPathPoint4: waypoint + Location: 58,88 + Owner: Neutral + PatrolPoint1: waypoint + Location: 91,69 + Owner: Neutral + PatrolPoint4: waypoint + Location: 73,70 + Owner: Neutral + SReinfPathPoint3: waypoint + Location: 69,90 + Owner: Neutral + PatrolPoint2: waypoint + Location: 89,80 + Owner: Neutral + BetweenBasesPoint: waypoint + Location: 78,73 + Owner: Neutral + PatrolPoint3: waypoint + Location: 78,80 + Owner: Neutral + USSRExpansionPoint: waypoint + Location: 56,77 + Owner: Neutral + PrepGGArmyPoint: waypoint + Location: 71,74 + Owner: Neutral + ReinfNorthPoint: waypoint + Location: 81,42 + Owner: Neutral + ReinfEastPoint: waypoint + Location: 109,75 + Owner: Neutral + NWOrefieldPoint: waypoint + Location: 32,49 + Owner: Neutral + AtUSSRBasePoint: waypoint + Location: 27,61 + Owner: Neutral + DDAttackPoint: waypoint + Location: 40,78 + Owner: Neutral + RunnerPoint: waypoint + Location: 28,50 + Owner: Neutral + USSRlstPoint: waypoint + Location: 48,83 + Owner: Neutral + CFBPoint: waypoint + Location: 42,90 + Owner: Neutral + GreeceBasePoint: waypoint + Location: 69,46 + Owner: Neutral + ReinfRoadPoint: waypoint + Location: 52,42 + Owner: Neutral + NWIdlePoint: waypoint + Location: 38,42 + Owner: Neutral + EIslandPoint: waypoint + Location: 51,58 + Owner: Neutral + mcvGGLoadPoint: waypoint + Location: 77,45 + Owner: Neutral + lstBeachPoint: waypoint + Location: 78,45 + Owner: Neutral + GGUnloadPoint: waypoint + Location: 94,54 + Owner: Neutral + ParaPoint: waypoint + Location: 29,75 + Owner: Neutral + StartCamPoint: waypoint + Location: 21,80 + Owner: Neutral +Smudges: + +Rules: + Player: + -ConquestVictoryConditions: + -EnemyWatcher: + MissionObjectives: + EarlyGameOver: true + World: + -CrateSpawner: + -SpawnMPUnits: + -MPStartLocations: + LuaScript: + Scripts: main.lua, AI.lua, reinforcements_teams.lua + ObjectivesPanel: + PanelName: MISSION_OBJECTIVES + ^Infantry: + Tooltip: + GenericVisibility: Enemy + ShowOwnerRow: false + ^Tank: + Tooltip: + GenericVisibility: Enemy + ShowOwnerRow: false + Demolishable: + ^Vehicle: + Tooltip: + GenericVisibility: Enemy + ShowOwnerRow: false + Demolishable: + ^Building: + Capturable: + CaptureThreshold: 0.25 + Tooltip: + GenericVisibility: Enemy + ShowOwnerRow: false + ^TechBuilding: + Capturable: + Type: ~disabled + ^Wall: + Tooltip: + ShowOwnerRow: false + ^Ship: + Tooltip: + GenericVisibility: Enemy + ShowOwnerRow: false + ^Plane: + Tooltip: + GenericVisibility: Enemy + ShowOwnerRow: false + ^Husk: + Tooltip: + GenericVisibility: Enemy, Ally, Neutral + GenericStancePrefix: false + ShowOwnerRow: false + ^Crate: + Tooltip: + ShowOwnerRow: false + TSLA: + Buildable: + Prerequisites: ~disabled + SAM: + Buildable: + Prerequisites: ~disabled + HPAD: + Buildable: + Prerequisites: ~disabled + APWR: + Buildable: + Prerequisites: ~disabled + BRIK: + Buildable: + Prerequisites: ~disabled + E3: + Buildable: + Prerequisites: ~tent + E4: + Buildable: + Prerequisites: ~disabled + HIJACKER: + Buildable: + Prerequisites: ~disabled + SPY: + Buildable: + Prerequisites: ~disabled + MECH: + Buildable: + Prerequisites: ~disabled + MCV: + Buildable: + Prerequisites: ~disabled + FTRK: + Buildable: + Prerequisites: ~disabled + TRUK: + Buildable: + Prerequisites: ~disabled + APC: + Buildable: + Prerequisites: ~disabled + DOME.IGNORE: + Inherits: DOME + RenderBuilding: + Image: DOME + AutoTargetIgnore: + Buildable: + Prerequisites: ~disabled + powerproxy.paratroopers: + ParatroopersPower: + DropItems: E1,E1,E1,E1,E1 + +Sequences: + +VoxelSequences: + +Weapons: + +Voices: + +Notifications: + +Translations: \ No newline at end of file diff --git a/mods/ra/maps/soviet-05/reinforcements_teams.lua b/mods/ra/maps/soviet-05/reinforcements_teams.lua new file mode 100644 index 0000000000..beba1f0a41 --- /dev/null +++ b/mods/ra/maps/soviet-05/reinforcements_teams.lua @@ -0,0 +1,168 @@ +SovietStartReinf = { "e2", "e2" } +SovietStartToBasePath = { StartPoint.Location, SovietBasePoint.Location } +SovietMCVReinf = { "mcv", "3tnk", "3tnk", "e1", "e1" } +SovExpansionPointGuard = { "2tnk", "2tnk", "e3", "e3", "e3" } + +if Map.Difficulty == "Easy" then + ArmorReinfGreece = { "jeep", "1tnk", "1tnk" } +else + ArmorReinfGreece = { "jeep", "jeep", "1tnk", "1tnk", "1tnk" } +end +InfantryReinfGreece = { "e1", "e1", "e1", "e1", "e1" } +CrossroadsReinfPath = { ReinfRoadPoint.Location } +ArtyReinf = { "e3", "e3", "e3", "arty", "arty" } +CoastGuardReinf = { "e1", "e1", "e3", "e1", "e3" } +DDPatrol1 = { "dd", "dd", "dd" } +DDPatrol1Path = { EIslandPoint.Location, WIslandPoint.Location, DDAttackPoint.Location, SReinfPathPoint4.Location, DDAttackPoint.Location, WIslandPoint.Location, EIslandPoint.Location, NearDockPoint.Location } +DDPatrol2 = { "dd", "dd" } +DDPatrol2Path = { NReinfPathPoint1.Location, SReinfPathPoint1.Location, SReinfPathPoint2.Location, SReinfPathPoint1.Location, NReinfPathPoint1.Location, NearDockPoint.Location } +ShipArrivePath = { ReinfNorthPoint.Location, NearDockPoint.Location } + +AlliedInfantryTypes = { "e1", "e3" } +AlliedTankTypes = { "jeep", "1tnk" } +AlliedAttackPath = { GreeceBaseEPoint.Location, CrossroadPoint.Location, NWOrefieldPoint.Location, AtUSSRBasePoint.Location } +AlliedCrossroadsToRadarPath = { ReinfRoadPoint.Location, CrossroadPoint.Location, GreeceBaseEPoint.Location, GreeceBasePoint.Location } +SouthReinfPath = { ReinfEastPoint.Location, SReinfPathPoint1.Location, SReinfPathPoint2.Location, SReinfPathPoint3.Location, SReinfPathPoint4.Location, USSRlstPoint.Location } +NorthReinfPath = { ReinfEastPoint.Location, NReinfPathPoint1.Location, GGUnloadPoint.Location } +GoodGuyOrefieldPatrolPath = { PatrolPoint1.Location, PatrolPoint2.Location, PatrolPoint3.Location, PatrolPoint4.Location } + +Ships = { } +GreeceInfAttack = { } +GGInfAttack = { } +TankAttackGG = { } + +ShipWaypoints = { EIslandPoint, WIslandPoint, DDAttackPoint } +InfantryWaypoints = { CrossroadPoint, NWOrefieldPoint, AtUSSRBasePoint, SovietBasePoint } +InfantryGGWaypoints = { PatrolPoint2, BetweenBasesPoint, PrepGGArmyPoint } +TanksGGWaypoints = { PatrolPoint2, BetweenBasesPoint, PrepGGArmyPoint } + +Para = function() + local powerproxy = Actor.Create("powerproxy.paratroopers", false, { Owner = player }) + local units = powerproxy.SendParatroopers(ParaPoint.CenterPosition, false, 28) + powerproxy.Destroy() +end + +Para2 = function() + local powerproxy = Actor.Create("powerproxy.paratroopers", false, { Owner = player }) + local units = powerproxy.SendParatroopers(USSRExpansionPoint.CenterPosition, false, 28) + powerproxy.Destroy() +end + +ReinfInf = function() + Reinforcements.Reinforce(Greece, InfantryReinfGreece, CrossroadsReinfPath, 0, function(soldier) + soldier.Hunt() + end) +end + +ReinfArmor = function() + RCheck = false + Reinforcements.Reinforce(Greece, ArmorReinfGreece, CrossroadsReinfPath, 0, function(soldier) + soldier.Hunt() + end) +end + +IslandTroops1 = function() + local units = Reinforcements.ReinforceWithTransport(GoodGuy, "lst", CoastGuardReinf, { ReinfEastPoint.Location, NReinfPathPoint1.Location, GGUnloadPoint.Location }, { ReinfEastPoint.Location })[2] + Utils.Do(units, function(unit) + Trigger.OnIdle(unit, function(coastguard) + coastguard.AttackMove(CoastGuardPoint.Location) + end) + end) + if not CheckForCYard() then + return + elseif Map.Difficulty == "Easy" then + return + else + Trigger.OnAllKilled(units, function() + if Map.Difficulty == "Hard" then + Trigger.AfterDelay(DateTime.Minutes(3), IslandTroops1) + else + Trigger.AfterDelay(DateTime.Minutes(5), IslandTroops1) + end + end) + end +end + +IslandTroops2 = function() + local units = Reinforcements.ReinforceWithTransport(GoodGuy, "lst", ArmorReinfGreece, NorthReinfPath, { ReinfEastPoint.Location })[2] + Utils.Do(units, function(unit) + Trigger.OnIdle(unit, function(patrols) + patrols.Patrol(GoodGuyOrefieldPatrolPath, true, 150) + end) + end) + if not CheckForCYard() then + return + elseif Map.Difficulty == "Easy" then + return + else + Trigger.OnAllKilled(unit, function() + if Map.Difficulty == "Hard" then + Trigger.AfterDelay(DateTime.Minutes(3), IslandTroops2) + else + Trigger.AfterDelay(DateTime.Minutes(5), IslandTroops2) + end + end) + end +end + +IslandTroops3 = function() + local units = Reinforcements.ReinforceWithTransport(GoodGuy, "lst", SovExpansionPointGuard, SouthReinfPath, { ReinfEastPoint.Location })[2] + Utils.Do(units, function(unit) + Trigger.OnIdle(unit, function(guards) + guards.AttackMove(USSRExpansionPoint.Location) + end) + end) + if not CheckForCYard() then + return + elseif Map.Difficulty == "Easy" then + return + else + Trigger.OnAllKilled(units, function() + if Map.Difficulty == "Hard" then + Trigger.AfterDelay(DateTime.Minutes(3), IslandTroops3) + else + Trigger.AfterDelay(DateTime.Minutes(5), IslandTroops3) + end + end) + end +end + +BringDDPatrol1 = function() + local units = Reinforcements.Reinforce(Greece, DDPatrol1, ShipArrivePath, 0) + Utils.Do(units, function(unit) + Trigger.OnIdle(unit, function(patrols) + patrols.Patrol(DDPatrol1Path, true, 250) + end) + end) + if not CheckForCYard() then + return + else + Trigger.OnAllKilled(units, function() + if Map.Difficulty == "Hard" then + Trigger.AfterDelay(DateTime.Minutes(4), BringDDPatrol1) + else + Trigger.AfterDelay(DateTime.Minutes(7), BringDDPatrol1) + end + end) + end +end + +BringDDPatrol2 = function() + local units = Reinforcements.Reinforce(Greece, DDPatrol2, ShipArrivePath, 0) + Utils.Do(units, function(unit) + Trigger.OnIdle(unit, function(patrols) + patrols.Patrol(DDPatrol2Path, true, 250) + end) + end) + if not CheckForCYard() then + return + else + Trigger.OnAllKilled(units, function() + if Map.Difficulty == "Hard" then + Trigger.AfterDelay(DateTime.Minutes(4), BringDDPatrol2) + else + Trigger.AfterDelay(DateTime.Minutes(7), BringDDPatrol2) + end + end) + end +end diff --git a/mods/ra/missions.yaml b/mods/ra/missions.yaml index d56a312213..ca46b01e52 100644 --- a/mods/ra/missions.yaml +++ b/mods/ra/missions.yaml @@ -6,4 +6,5 @@ Allied Campaign: ./mods/ra/maps/allies-05a Soviet Campaign: ./mods/ra/maps/soviet-01 + ./mods/ra/maps/soviet-05