diff --git a/mods/ra/maps/soviet-04a/AI.lua b/mods/ra/maps/soviet-04a/AI.lua new file mode 100644 index 0000000000..3ff254fa6f --- /dev/null +++ b/mods/ra/maps/soviet-04a/AI.lua @@ -0,0 +1,111 @@ +IdleHunt = function(unit) if not unit.IsDead then Trigger.OnIdle(unit, unit.Hunt) end end + +IdlingUnits = function() + local lazyUnits = Greece.GetGroundAttackers() + + 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(0, 4), 300 }, + { "tent", CVec.New(-9, 6), 400, true }, + { "proc", CVec.New(4, 7), 1400, true }, + { "weap", CVec.New(8, -1), 2000, true } +} + +BuildBase = function() + if CYard.IsDead or CYard.Owner ~= Greece then + return + elseif Harvester.IsDead and Greece.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 = Greece, Location = GreeceCYard.Location + building[2] }) + Greece.Cash = Greece.Cash - building[3] + + building[4] = true + Trigger.OnKilled(actor, function() building[4] = true end) + Trigger.OnDamaged(actor, function(building) + if building.Owner == Greece 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 Greece.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) + Greece.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 Greece.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) + Greece.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) + unit.Hunt() + end + end) +end diff --git a/mods/ra/maps/soviet-04a/main.lua b/mods/ra/maps/soviet-04a/main.lua new file mode 100644 index 0000000000..c68f400014 --- /dev/null +++ b/mods/ra/maps/soviet-04a/main.lua @@ -0,0 +1,148 @@ + +RunInitialActivities = function() + Harvester.FindResources() + IdlingUnits() + Trigger.AfterDelay(10, function() + BringPatrol1() + BringPatrol2() + BuildBase() + end) + + Utils.Do(Map.NamedActors, function(actor) + if actor.Owner == Greece and actor.HasProperty("StartBuildingRepairs") then + Trigger.OnDamaged(actor, function(building) + if building.Owner == Greece and building.Health < 3/4 * building.MaxHealth then + building.StartBuildingRepairs() + end + end) + end + end) + + Reinforcements.Reinforce(player, SovietMCV, SovietStartToBasePath, 0, function(mcv) + mcv.Move(StartCamPoint.Location) + end) + Media.PlaySpeechNotification(player, "ReinforcementsArrived") + + 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.OnEnteredFootprint(VillageCamArea, function(actor, id) + if actor.Owner == player then + local camera = Actor.Create("camera", true, { Owner = player, Location = VillagePoint.Location }) + Trigger.RemoveFootprintTrigger(id) + Trigger.OnAllKilled(Village, function() + camera.Destroy() + end) + end + end) + + Trigger.OnAnyKilled(Civs, function() + Trigger.ClearAll(civ1) + Trigger.ClearAll(civ2) + Trigger.ClearAll(civ3) + local units = Reinforcements.Reinforce(Greece, Avengers, { SWRoadPoint.Location }, 0) + Utils.Do(units, function(unit) + unit.Hunt() + end) + end) + + Runner1.Move(CrossroadsEastPoint.Location) + Runner2.Move(InVillagePoint.Location) + Tank5.Move(V2MovePoint.Location) + Trigger.AfterDelay(DateTime.Seconds(2), function() + Tank1.Stop() + Tank2.Stop() + Tank3.Stop() + Tank4.Stop() + Tank5.Stop() + Trigger.AfterDelay(1, function() + Tank1.Move(SovietBaseEntryPointNE.Location) + Tank2.Move(SovietBaseEntryPointW.Location) + Tank3.Move(SovietBaseEntryPointNE.Location) + Tank4.Move(SovietBaseEntryPointW.Location) + Tank5.Move(V2MovePoint.Location) + end) + end) + + Trigger.AfterDelay(DateTime.Minutes(1), ProduceInfantry) + Trigger.AfterDelay(DateTime.Minutes(2), ProduceArmor) + + if Map.Difficulty == "Hard" or Map.Difficulty == "Medium" then + Trigger.AfterDelay(DateTime.Seconds(15), ReinfInf) + end + Trigger.AfterDelay(DateTime.Minutes(1), ReinfInf) + Trigger.AfterDelay(DateTime.Minutes(3), ReinfInf) + Trigger.AfterDelay(DateTime.Minutes(2), ReinfArmor) +end + +Tick = function() + if Greece.HasNoRequiredUnits() then + player.MarkCompletedObjective(KillAll) + player.MarkCompletedObjective(KillRadar) + end + + if player.HasNoRequiredUnits() then + Greece.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 RCheck then + RCheck = false + if Map.Difficulty == "Hard" then + Trigger.AfterDelay(DateTime.Seconds(150), ReinfArmor) + elseif Map.Difficulty == "Medium" then + Trigger.AfterDelay(DateTime.Minutes(5), ReinfArmor) + else + Trigger.AfterDelay(DateTime.Minutes(8), ReinfArmor) + end + end +end + +WorldLoaded = function() + player = Player.GetPlayer("USSR") + 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") + end) + Trigger.OnObjectiveFailed(player, function(p, id) + Media.DisplayMessage(p.GetObjectiveDescription(id), "Objective failed") + end) + + KillAll = player.AddPrimaryObjective("Defeat the Allied forces.") + BeatUSSR = Greece.AddPrimaryObjective("Defeat the Soviet forces.") + KillRadar = player.AddSecondaryObjective("Destroy Allied Radar Dome to stop enemy\nreinforcements.") + + Trigger.OnPlayerLost(player, function() + Media.PlaySpeechNotification(player, "Lose") + end) + + Trigger.OnPlayerWon(player, function() + Media.PlaySpeechNotification(player, "Win") + end) + + Trigger.OnKilled(Radar, function() + player.MarkCompletedObjective(KillRadar) + Media.PlaySpeechNotification(player, "ObjectiveMet") + end) + + Camera.Position = StartCamPoint.CenterPosition +end diff --git a/mods/ra/maps/soviet-04a/map.bin b/mods/ra/maps/soviet-04a/map.bin new file mode 100644 index 0000000000..0366e163f7 Binary files /dev/null and b/mods/ra/maps/soviet-04a/map.bin differ diff --git a/mods/ra/maps/soviet-04a/map.png b/mods/ra/maps/soviet-04a/map.png new file mode 100644 index 0000000000..e92632f70f Binary files /dev/null and b/mods/ra/maps/soviet-04a/map.png differ diff --git a/mods/ra/maps/soviet-04a/map.yaml b/mods/ra/maps/soviet-04a/map.yaml new file mode 100644 index 0000000000..6c515d7fec --- /dev/null +++ b/mods/ra/maps/soviet-04a/map.yaml @@ -0,0 +1,760 @@ +MapFormat: 7 + +RequiresMod: ra + +Title: Soviet 04a: Behind the lines + +Description: The Allied base in this region is proving to be problematic.\n\nYour mission is to take it out so that we can begin to move forces through this area.\n\nAs long as they have communications they will be able to call upon heavy reinforcements.\n\nCrush their communications, and they should be easier to remove. + +Author: Westwood Studios + +Tileset: SNOW + +MapSize: 128,128 + +Bounds: 38,45,72,46 + +Visibility: MissionSelector + +Type: Campaign + +Videos: + Briefing: soviet4.vqa + GameStart: sovmcv.vqa + GameWon: radrraid.vqa + GameLost: allymorf.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 + Faction: england + PlayerReference@Spain: + Name: Spain + Faction: england + Allies: Greece + Enemies: USSR + PlayerReference@Creeps: + Name: Creeps + NonCombatant: True + Faction: england + PlayerReference@Greece: + Name: Greece + Faction: allies + ColorRamp: 161,134,236 + Allies: Spain + Enemies: USSR + PlayerReference@USSR: + Name: USSR + Playable: True + AllowBots: False + Required: True + LockFaction: True + Faction: soviet + LockColor: True + ColorRamp: 3,255,127 + LockSpawn: True + LockTeam: True + Enemies: Greece, Spain + +Actors: + Actor0: sbag + Location: 71,43 + Owner: Neutral + Actor1: sbag + Location: 72,43 + Owner: Neutral + Actor2: sbag + Location: 72,44 + Owner: Neutral + Actor3: cycl + Location: 47,45 + Owner: Neutral + Actor4: cycl + Location: 48,45 + Owner: Neutral + Actor5: cycl + Location: 49,45 + Owner: Neutral + Actor6: cycl + Location: 50,45 + Owner: Neutral + Actor7: cycl + Location: 53,45 + Owner: Neutral + Actor8: sbag + Location: 72,45 + Owner: Neutral + Actor9: sbag + Location: 72,46 + Owner: Neutral + Actor10: sbag + Location: 73,46 + Owner: Neutral + Actor11: sbag + Location: 74,46 + Owner: Neutral + Actor12: cycl + Location: 46,47 + Owner: Neutral + Actor13: sbag + Location: 72,47 + Owner: Neutral + Actor14: cycl + Location: 46,48 + Owner: Neutral + Actor15: sbag + Location: 71,48 + Owner: Neutral + Actor16: sbag + Location: 72,48 + Owner: Neutral + Actor17: cycl + Location: 46,49 + Owner: Neutral + Actor18: sbag + Location: 71,52 + Owner: Neutral + Actor19: sbag + Location: 72,52 + Owner: Neutral + Actor20: sbag + Location: 72,53 + Owner: Neutral + Actor21: sbag + Location: 72,54 + Owner: Neutral + Actor22: sbag + Location: 72,55 + Owner: Neutral + Actor23: sbag + Location: 73,55 + Owner: Neutral + Actor24: sbag + Location: 74,55 + Owner: Neutral + Actor25: sbag + Location: 72,56 + Owner: Neutral + Actor26: sbag + Location: 86,56 + Owner: Neutral + Actor27: sbag + Location: 88,56 + Owner: Neutral + Actor28: sbag + Location: 89,56 + Owner: Neutral + Actor29: sbag + Location: 90,56 + Owner: Neutral + Actor30: sbag + Location: 91,56 + Owner: Neutral + Actor31: sbag + Location: 92,56 + Owner: Neutral + Actor32: sbag + Location: 67,57 + Owner: Neutral + Actor33: sbag + Location: 68,57 + Owner: Neutral + Actor34: sbag + Location: 69,57 + Owner: Neutral + Actor35: sbag + Location: 70,57 + Owner: Neutral + Actor36: sbag + Location: 71,57 + Owner: Neutral + Actor37: sbag + Location: 72,57 + Owner: Neutral + Actor38: sbag + Location: 78,58 + Owner: Neutral + Actor39: sbag + Location: 79,58 + Owner: Neutral + Actor40: sbag + Location: 80,58 + Owner: Neutral + Actor41: sbag + Location: 81,58 + Owner: Neutral + Actor42: sbag + Location: 82,58 + Owner: Neutral + Actor43: sbag + Location: 83,58 + Owner: Neutral + Actor44: sbag + Location: 57,69 + Owner: Neutral + Actor45: sbag + Location: 61,69 + Owner: Neutral + Actor46: sbag + Location: 44,72 + Owner: Neutral + Actor47: sbag + Location: 48,72 + Owner: Neutral + Actor48: tc04 + Location: 97,67 + Owner: Neutral + Actor49: tc05 + Location: 71,79 + Owner: Neutral + Actor50: t10 + Location: 100,59 + Owner: Neutral + Actor51: t13 + Location: 78,50 + Owner: Neutral + Actor52: tc01 + Location: 68,55 + Owner: Neutral + Actor53: t08 + Location: 73,47 + Owner: Neutral + Actor54: tc01 + Location: 29,86 + Owner: Neutral + Actor55: t08 + Location: 36,84 + Owner: Neutral + Actor56: t06 + Location: 36,87 + Owner: Neutral + Actor57: t11 + Location: 38,74 + Owner: Neutral + Actor58: tc02 + Location: 42,75 + Owner: Neutral + Actor59: tc03 + Location: 60,80 + Owner: Neutral + Actor60: tc05 + Location: 54,73 + Owner: Neutral + Actor61: tc01 + Location: 47,87 + Owner: Neutral + Actor62: t16 + Location: 56,79 + Owner: Neutral + Actor63: tc04 + Location: 79,70 + Owner: Neutral + Actor64: tc01 + Location: 108,73 + Owner: Neutral + Actor65: t07 + Location: 94,60 + Owner: Neutral + Actor66: tc05 + Location: 91,66 + Owner: Neutral + Actor67: t17 + Location: 82,64 + Owner: Neutral + Actor68: tc04 + Location: 28,80 + Owner: Neutral + Actor69: tc05 + Location: 29,75 + Owner: Neutral + Actor70: tc02 + Location: 27,76 + Owner: Neutral + Actor71: t17 + Location: 42,52 + Owner: Neutral + Actor72: t01 + Location: 53,81 + Owner: Neutral + Actor73: tc01 + Location: 99,77 + Owner: Neutral + Actor74: mine + Location: 106,86 + Owner: Neutral + Actor75: mine + Location: 70,87 + Owner: Neutral + Actor76: tc04 + Location: 39,46 + Owner: Neutral + Actor77: tc05 + Location: 45,61 + Owner: Neutral + Actor78: tc02 + Location: 41,48 + Owner: Neutral + Actor79: tc04 + Location: 98,45 + Owner: Neutral + Actor80: t15 + Location: 95,48 + Owner: Neutral + Actor81: tc03 + Location: 38,68 + Owner: Neutral + Actor82: t08 + Location: 38,67 + Owner: Neutral + Actor83: t08 + Location: 40,69 + Owner: Neutral + Actor84: tc05 + Location: 38,79 + Owner: Neutral + Actor104: brl3 + Location: 95,50 + Owner: Greece + Actor105: barl + Location: 93,49 + Owner: Greece + Actor106: brl3 + Location: 94,50 + Owner: Greece + Actor107: barl + Location: 93,50 + Owner: Greece + Actor108: v19 + Location: 92,48 + Owner: Greece + Actor110: brl3 + Location: 83,57 + Owner: Greece + Actor111: barl + Location: 82,57 + Owner: Greece + Actor112: barl + Location: 81,57 + Owner: Greece + Actor113: brl3 + Location: 88,55 + Owner: Greece + Actor114: barl + Location: 87,55 + Owner: Greece + Actor115: brl3 + Location: 87,56 + Owner: Greece + Actor116: brl3 + Location: 57,46 + Owner: Greece + Actor117: barl + Location: 57,47 + Owner: Greece + Actor118: brl3 + Location: 92,50 + Owner: Greece + Actor119: barl + Location: 92,49 + Owner: Greece + Actor120: barl + Location: 94,49 + Owner: Greece + Actor133: 2tnk + Location: 69,54 + Owner: Greece + Facing: 64 + Actor136: 1tnk + Location: 59,68 + Owner: Greece + Facing: 128 + Actor137: 1tnk + Location: 46,71 + Owner: Greece + Facing: 128 + Actor139: jeep + Location: 57,54 + Owner: Greece + Facing: 96 + Actor140: 1tnk + Location: 62,46 + Owner: Greece + Facing: 160 + Actor141: 1tnk + Location: 60,57 + Owner: Greece + Facing: 128 + Actor142: 1tnk + Location: 54,57 + Owner: Greece + Facing: 128 + Actor143: 2tnk + Location: 92,53 + Owner: Greece + Facing: 192 + Actor144: 2tnk + Location: 92,55 + Owner: Greece + Health: 99 + Facing: 192 + Actor145: 2tnk + Location: 86,58 + Owner: Greece + Health: 99 + Facing: 160 + Actor146: jeep + Location: 89,60 + Owner: Greece + Facing: 160 + Actor151: 2tnk + Location: 40,55 + Owner: Greece + Facing: 128 + Actor152: 2tnk + Location: 44,55 + Owner: Greece + Facing: 128 + Actor154: 2tnk + Location: 67,64 + Owner: Greece + Facing: 160 + Actor155: 2tnk + Location: 69,63 + Owner: Greece + Facing: 160 + Actor159: mine + Location: 77,46 + Owner: Neutral + Radar: dome + Location: 49,46 + Owner: Greece + CYard: fact + Location: 58,45 + Owner: Greece + Proc: proc + Location: 63,53 + Owner: Greece + FreeActor: False + Silo1: silo + Location: 62,52 + Owner: Greece + Silo2: silo + Location: 63,53 + Owner: Greece + Silo3: silo + Location: 65,52 + Owner: Greece + Silo4: silo + Location: 66,53 + Owner: Greece + Barr: tent + Location: 50,52 + Owner: Greece + Gun1: gun + Location: 87,57 + Owner: Greece + Facing: 96 + Gun2: gun + Location: 84,58 + Owner: Greece + Facing: 96 + Gun3: gun + Location: 53,48 + Owner: Greece + Facing: 96 + Gun4: gun + Location: 67,65 + Owner: Greece + Facing: 96 + Gun5: gun + Location: 70,63 + Owner: Greece + Facing: 96 + Pbox1: pbox + Location: 57,70 + Owner: Greece + Pbox2: powr + Location: 51,45 + Owner: Greece + Pbox3: pbox + Location: 61,70 + Owner: Greece + Pbox4: pbox + Location: 67,63 + Owner: Greece + Pbox5: pbox + Location: 44,73 + Owner: Greece + Pbox6: pbox + Location: 48,73 + Owner: Greece + village1: v11 + Location: 57,80 + Owner: Spain + village2: v03 + Location: 49,77 + Owner: Spain + Health: 75 + village3: v02 + Location: 43,77 + Owner: Spain + village4: v01 + Location: 40,75 + Owner: Spain + village5: v05 + Location: 55,76 + Owner: Spain + Health: 39 + Weap: weap + Location: 67,45 + Owner: Greece + Gap1: gap + Location: 83,51 + Owner: Greece + Gap2: gap + Location: 59,65 + Owner: Greece + Powr1: powr + Location: 47,47 + Owner: Greece + Powr2: powr + Location: 93,46 + Owner: Greece + Powr3: powr + Location: 96,45 + Owner: Greece + APwr: apwr + Location: 49,56 + Owner: Greece + Fix1: fix + Location: 56,55 + Owner: Greece + Tank1: 3tnk + Location: 88,87 + Owner: USSR + Tank2: 3tnk + Location: 84,87 + Owner: USSR + Tank3: 3tnk + Location: 87,86 + Owner: USSR + Health: 99 + Tank4: 3tnk + Location: 85,86 + Owner: USSR + Tank5: v2rl + Location: 86,87 + Owner: USSR + civ1: c6 + Location: 53,80 + Owner: Spain + Facing: 64 + SubCell: 2 + civ2: c7 + Location: 58,79 + Owner: Spain + SubCell: 3 + civ3: c5 + Location: 57,81 + Owner: Spain + Facing: 64 + SubCell: 3 + Harvester: harv + Location: 76,47 + Owner: Greece + Facing: 160 + Runner1: jeep + Location: 88,83 + Owner: Greece + Runner2: jeep + Location: 84,83 + Owner: Greece + Facing: 64 + GreeceCYard: waypoint + Location: 59,47 + Owner: Neutral + BridgeEntrancePoint: waypoint + Location: 83,55 + Owner: Neutral + SovietBasePoint: waypoint + Location: 86,88 + Owner: Neutral + ToRadarPoint: waypoint + Location: 42,60 + Owner: Neutral + InVillagePoint: waypoint + Location: 56,82 + Owner: Neutral + NRoadPoint: waypoint + Location: 80,45 + Owner: Neutral + SWRoadPoint: waypoint + Location: 38,90 + Owner: Neutral + VillagePoint: waypoint + Location: 57,80 + Owner: Neutral + CrossroadsNorthPoint: waypoint + Location: 80,49 + Owner: Neutral + StartPoint: waypoint + Location: 86,90 + Owner: Neutral + SovietBaseEntryPointW: waypoint + Location: 69,79 + Owner: Neutral + NearRadarPoint: waypoint + Location: 43,47 + Owner: Neutral + NERoadTurnPoint: waypoint + Location: 106,54 + Owner: Neutral + CrossroadsEastPoint: waypoint + Location: 106,64 + Owner: Neutral + VillageEntrancePoint: waypoint + Location: 59,75 + Owner: Neutral + StartCamPoint: waypoint + Location: 86,87 + Owner: Neutral + SovietBaseEntryPointNE: waypoint + Location: 96,77 + Owner: Neutral + V2MovePoint: waypoint + Location: 84,83 + 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: + Tooltip: + GenericVisibility: Enemy + ShowOwnerRow: false + ^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 + ^CivBuilding: + Tooltip: + ShowOwnerRow: false + ^TechBuilding: + Tooltip: + ShowOwnerRow: false + AFLD: + ParatroopersPower@paratroopers: + DropItems: E1,E1,E1,E2,E2 + 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 + AGUN: + Buildable: + Prerequisites: ~disabled + +Sequences: + +VoxelSequences: + +Weapons: + +Voices: + +Notifications: + +Translations: \ No newline at end of file diff --git a/mods/ra/maps/soviet-04a/reinforcements_teams.lua b/mods/ra/maps/soviet-04a/reinforcements_teams.lua new file mode 100644 index 0000000000..0e50f24842 --- /dev/null +++ b/mods/ra/maps/soviet-04a/reinforcements_teams.lua @@ -0,0 +1,80 @@ +Civs = { civ1, civ2, civ3 } +Village = { civ1, civ2, civ3, village1, village2, village5 } +SovietMCV = { "mcv" } +InfantryReinfGreece = { "e1", "e1", "e1", "e1", "e1" } +Avengers = { "jeep", "1tnk", "2tnk", "2tnk", "1tnk" } +Patrol1Group = { "jeep", "jeep", "2tnk", "2tnk" } +Patrol2Group = { "jeep", "1tnk", "1tnk", "1tnk" } +AlliedInfantryTypes = { "e1", "e3" } +AlliedArmorTypes = { "jeep", "jeep", "1tnk", "1tnk", "1tnk" } +InfAttack = { } +ArmorAttack = { } + +SovietStartToBasePath = { StartPoint.Location, SovietBasePoint.Location } +InfReinfPath = { SWRoadPoint.Location, InVillagePoint.Location } +ArmorReinfPath = { NRoadPoint.Location, CrossroadsNorthPoint.Location } +Patrol1Path = { NearRadarPoint.Location, ToRadarPoint.Location, InVillagePoint.Location, ToRadarPoint.Location } +Patrol2Path = { BridgeEntrancePoint.Location, NERoadTurnPoint.Location, CrossroadsEastPoint.Location, BridgeEntrancePoint.Location } + +VillageCamArea = { CPos.New(68, 75),CPos.New(68, 76),CPos.New(68, 77),CPos.New(68, 78),CPos.New(68, 79), CPos.New(68, 80), CPos.New(68, 81), CPos.New(68, 82) } + +if Map.Difficulty == "Easy" then + ArmorReinfGreece = { "jeep", "1tnk", "1tnk" } +else + ArmorReinfGreece = { "jeep", "jeep", "1tnk", "1tnk", "1tnk" } +end + +AttackPaths = +{ + { VillageEntrancePoint }, + { BridgeEntrancePoint, NERoadTurnPoint, CrossroadsEastPoint } +} + +ReinfInf = function() + Reinforcements.Reinforce(Greece, InfantryReinfGreece, InfReinfPath, 0, function(soldier) + soldier.Hunt() + end) +end + +ReinfArmor = function() + if not Radar.IsDead and Radar.Owner == Greece then + RCheck = true + Reinforcements.Reinforce(Greece, ArmorReinfGreece, ArmorReinfPath, 0, function(soldier) + soldier.Hunt() + end) + end +end + +BringPatrol1 = function() + local units = Reinforcements.Reinforce(Greece, Patrol1Group, { SWRoadPoint.Location }, 0) + Utils.Do(units, function(patrols) + patrols.Patrol(Patrol1Path, true, 250) + end) + + if not Radar.IsDead and Radar.Owner == Greece then + Trigger.OnAllKilled(units, function() + if Map.Difficulty == "Hard" then + Trigger.AfterDelay(DateTime.Minutes(4), BringPatrol1) + else + Trigger.AfterDelay(DateTime.Minutes(7), BringPatrol1) + end + end) + end +end + +BringPatrol2 = function() + local units = Reinforcements.Reinforce(Greece, Patrol2Group, { NRoadPoint.Location }, 0) + Utils.Do(units, function(patrols) + patrols.Patrol(Patrol2Path, true, 250) + end) + + if not Radar.IsDead and Radar.Owner == Greece then + Trigger.OnAllKilled(units, function() + if Map.Difficulty == "Hard" then + Trigger.AfterDelay(DateTime.Minutes(4), BringPatrol2) + else + Trigger.AfterDelay(DateTime.Minutes(7), BringPatrol2) + end + end) + end +end diff --git a/mods/ra/maps/soviet-04b/AI.lua b/mods/ra/maps/soviet-04b/AI.lua new file mode 100644 index 0000000000..292c7b0e11 --- /dev/null +++ b/mods/ra/maps/soviet-04b/AI.lua @@ -0,0 +1,111 @@ +IdleHunt = function(unit) if not unit.IsDead then Trigger.OnIdle(unit, unit.Hunt) end end + +IdlingUnits = function() + local lazyUnits = Greece.GetGroundAttackers() + + 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(-4, -2), 300, true }, + { "tent", CVec.New(-8, 1), 400, true }, + { "proc", CVec.New(-5, 1), 1400, true }, + { "weap", CVec.New(-12, -1), 2000, true } +} + +BuildBase = function() + if CYard.IsDead or CYard.Owner ~= Greece then + return + elseif Harvester.IsDead and Greece.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 = Greece, Location = GreeceCYard.Location + building[2] }) + Greece.Cash = Greece.Cash - building[3] + + building[4] = true + Trigger.OnKilled(actor, function() building[4] = true end) + Trigger.OnDamaged(actor, function(building) + if building.Owner == Greece 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 Greece.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) + Greece.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 Greece.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) + Greece.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) + unit.Hunt() + end + end) +end diff --git a/mods/ra/maps/soviet-04b/main.lua b/mods/ra/maps/soviet-04b/main.lua new file mode 100644 index 0000000000..6d2a991d1c --- /dev/null +++ b/mods/ra/maps/soviet-04b/main.lua @@ -0,0 +1,141 @@ + +RunInitialActivities = function() + Harvester.FindResources() + Helper.Destroy() + IdlingUnits() + Trigger.AfterDelay(DateTime.Seconds(1), function() + BringPatrol1() + Trigger.AfterDelay(DateTime.Seconds(5), function() + BringPatrol2() + end) + BuildBase() + end) + + Utils.Do(Map.NamedActors, function(actor) + if actor.Owner == Greece and actor.HasProperty("StartBuildingRepairs") then + Trigger.OnDamaged(actor, function(building) + if building.Owner == Greece and building.Health < 3/4 * building.MaxHealth then + building.StartBuildingRepairs() + end + end) + end + end) + + Trigger.OnKilled(Powr, 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.OnEnteredFootprint(VillageCamArea, function(actor, id) + if actor.Owner == player then + local camera = Actor.Create("camera", true, { Owner = player, Location = VillagePoint.Location }) + Trigger.RemoveFootprintTrigger(id) + Trigger.OnAllKilled(Village, function() + camera.Destroy() + end) + end + end) + + Trigger.OnAnyKilled(Civs, function() + Trigger.ClearAll(civ1) + Trigger.ClearAll(civ2) + Trigger.ClearAll(civ3) + Trigger.ClearAll(civ4) + local units = Reinforcements.Reinforce(Greece, Avengers, { NRoadPoint.Location }, 0) + Utils.Do(units, function(unit) + unit.Hunt() + end) + end) + + Trigger.AfterDelay(DateTime.Minutes(1), ProduceInfantry) + Trigger.AfterDelay(DateTime.Minutes(2), ProduceArmor) + + if Map.Difficulty == "Hard" or Map.Difficulty == "Medium" then + Trigger.AfterDelay(DateTime.Seconds(5), ReinfInf) + end + Trigger.AfterDelay(DateTime.Minutes(1), ReinfInf) + Trigger.AfterDelay(DateTime.Minutes(3), ReinfInf) + Trigger.AfterDelay(DateTime.Minutes(2), ReinfArmor) +end + +Tick = function() + if Greece.HasNoRequiredUnits() then + player.MarkCompletedObjective(KillAll) + player.MarkCompletedObjective(KillRadar) + end + + if player.HasNoRequiredUnits() then + Greece.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 RCheck then + RCheck = false + if Map.Difficulty == "Hard" then + Trigger.AfterDelay(DateTime.Seconds(150), ReinfArmor) + elseif Map.Difficulty == "Medium" then + Trigger.AfterDelay(DateTime.Minutes(5), ReinfArmor) + else + Trigger.AfterDelay(DateTime.Minutes(8), ReinfArmor) + end + end +end + +WorldLoaded = function() + player = Player.GetPlayer("USSR") + 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") + end) + Trigger.OnObjectiveFailed(player, function(p, id) + Media.DisplayMessage(p.GetObjectiveDescription(id), "Objective failed") + end) + + KillAll = player.AddPrimaryObjective("Defeat the Allied forces.") + BeatUSSR = Greece.AddPrimaryObjective("Defeat the Soviet forces.") + KillRadar = player.AddSecondaryObjective("Destroy Allied Radar Dome to stop enemy\nreinforcements.") + + Trigger.OnPlayerLost(player, function() + Media.PlaySpeechNotification(player, "Lose") + end) + + Trigger.OnPlayerWon(player, function() + Media.PlaySpeechNotification(player, "Win") + end) + + Trigger.OnKilled(Radar, function() + player.MarkCompletedObjective(KillRadar) + Media.PlaySpeechNotification(player, "ObjectiveMet") + end) + + Trigger.OnDamaged(Harvester, function() + Utils.Do(Guards, function(unit) + if not unit.IsDead and not Harvester.IsDead then + unit.AttackMove(Harvester.Location) + end + end) + end) + + Camera.Position = StartCamPoint.CenterPosition +end diff --git a/mods/ra/maps/soviet-04b/map.bin b/mods/ra/maps/soviet-04b/map.bin new file mode 100644 index 0000000000..a4df51fec4 Binary files /dev/null and b/mods/ra/maps/soviet-04b/map.bin differ diff --git a/mods/ra/maps/soviet-04b/map.png b/mods/ra/maps/soviet-04b/map.png new file mode 100644 index 0000000000..e92632f70f Binary files /dev/null and b/mods/ra/maps/soviet-04b/map.png differ diff --git a/mods/ra/maps/soviet-04b/map.yaml b/mods/ra/maps/soviet-04b/map.yaml new file mode 100644 index 0000000000..d32bfdfe11 --- /dev/null +++ b/mods/ra/maps/soviet-04b/map.yaml @@ -0,0 +1,788 @@ +MapFormat: 7 + +RequiresMod: ra + +Title: Soviet 04b: Behind the lines + +Description: The Allied base in this region is proving to be problematic.\n\nYour mission is to take it out so that we can begin to move forces through this area.\n\nAs long as they have communications they will be able to call upon heavy reinforcements.\n\nCrush their communications, and they should be easier to remove. + +Author: Westwood Studios + +Tileset: SNOW + +MapSize: 128,128 + +Bounds: 28,45,91,49 + +Visibility: MissionSelector + +Type: Campaign + +Videos: + Briefing: soviet4.vqa + GameStart: sovmcv.vqa + GameWon: radrraid.vqa + GameLost: allymorf.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 + Faction: england + PlayerReference@Spain: + Name: Spain + Faction: england + Allies: Greece + Enemies: USSR + PlayerReference@Creeps: + Name: Creeps + NonCombatant: True + Faction: england + PlayerReference@Greece: + Name: Greece + Faction: allies + ColorRamp: 161,134,236 + Allies: Spain + Enemies: USSR + PlayerReference@USSR: + Name: USSR + Playable: True + AllowBots: False + Required: True + LockFaction: True + Faction: soviet + LockColor: True + ColorRamp: 3,255,127 + LockSpawn: True + LockTeam: True + Enemies: Greece, Spain + +Actors: + Helper: proc + Owner: Greece + Location: 92,75 + FreeActor: False + Actor0: sbag + Location: 85,50 + Owner: Neutral + Actor1: sbag + Location: 86,50 + Owner: Neutral + Actor2: sbag + Location: 103,50 + Owner: Neutral + Actor3: sbag + Location: 104,50 + Owner: Neutral + Actor4: sbag + Location: 105,50 + Owner: Neutral + Actor5: sbag + Location: 106,50 + Owner: Neutral + Actor6: sbag + Location: 109,50 + Owner: Neutral + Actor7: sbag + Location: 110,50 + Owner: Neutral + Actor8: sbag + Location: 113,50 + Owner: Neutral + Actor9: sbag + Location: 114,50 + Owner: Neutral + Actor10: sbag + Location: 85,51 + Owner: Neutral + Actor11: sbag + Location: 106,51 + Owner: Neutral + Actor12: sbag + Location: 109,51 + Owner: Neutral + Actor13: sbag + Location: 114,51 + Owner: Neutral + Actor14: sbag + Location: 85,52 + Owner: Neutral + Actor15: sbag + Location: 106,52 + Owner: Neutral + Actor16: sbag + Location: 109,52 + Owner: Neutral + Actor17: sbag + Location: 114,52 + Owner: Neutral + Actor18: sbag + Location: 85,53 + Owner: Neutral + Actor19: sbag + Location: 106,53 + Owner: Neutral + Actor20: sbag + Location: 109,53 + Owner: Neutral + Actor21: sbag + Location: 110,53 + Owner: Neutral + Actor22: sbag + Location: 113,53 + Owner: Neutral + Actor23: sbag + Location: 114,53 + Owner: Neutral + Actor24: sbag + Location: 85,54 + Owner: Neutral + Actor25: sbag + Location: 106,54 + Owner: Neutral + Actor26: sbag + Location: 106,55 + Owner: Neutral + Actor27: sbag + Location: 106,56 + Owner: Neutral + Actor28: sbag + Location: 106,57 + Owner: Neutral + Actor29: sbag + Location: 106,58 + Owner: Neutral + Actor30: sbag + Location: 85,59 + Owner: Neutral + Actor31: sbag + Location: 106,59 + Owner: Neutral + Actor32: sbag + Location: 85,60 + Owner: Neutral + Actor33: sbag + Location: 106,60 + Owner: Neutral + Actor34: sbag + Location: 85,61 + Owner: Neutral + Actor35: sbag + Location: 106,61 + Owner: Neutral + Actor36: sbag + Location: 85,62 + Owner: Neutral + Actor37: sbag + Location: 101,62 + Owner: Neutral + Actor38: sbag + Location: 102,62 + Owner: Neutral + Actor39: sbag + Location: 103,62 + Owner: Neutral + Actor40: sbag + Location: 104,62 + Owner: Neutral + Actor41: sbag + Location: 105,62 + Owner: Neutral + Actor42: sbag + Location: 106,62 + Owner: Neutral + Actor43: sbag + Location: 85,63 + Owner: Neutral + Actor44: sbag + Location: 100,63 + Owner: Neutral + Actor45: sbag + Location: 101,63 + Owner: Neutral + Actor46: sbag + Location: 85,64 + Owner: Neutral + Actor47: sbag + Location: 86,64 + Owner: Neutral + Actor48: sbag + Location: 87,64 + Owner: Neutral + Actor49: sbag + Location: 88,64 + Owner: Neutral + Actor50: sbag + Location: 89,64 + Owner: Neutral + Actor51: sbag + Location: 90,64 + Owner: Neutral + Actor52: sbag + Location: 97,64 + Owner: Neutral + Actor53: sbag + Location: 98,64 + Owner: Neutral + Actor54: sbag + Location: 99,64 + Owner: Neutral + Actor55: sbag + Location: 100,64 + Owner: Neutral + Actor56: t01 + Location: 112,62 + Owner: Neutral + Actor57: tc01 + Location: 109,61 + Owner: Neutral + Actor58: tc04 + Location: 110,45 + Owner: Neutral + Actor59: tc03 + Location: 114,45 + Owner: Neutral + Actor60: tc05 + Location: 99,45 + Owner: Neutral + Actor61: tc01 + Location: 117,79 + Owner: Neutral + Actor62: tc02 + Location: 109,79 + Owner: Neutral + Actor63: tc01 + Location: 113,48 + Owner: Neutral + Actor64: tc04 + Location: 116,51 + Owner: Neutral + Actor65: tc05 + Location: 113,53 + Owner: Neutral + Actor66: tc02 + Location: 109,54 + Owner: Neutral + Actor67: tc05 + Location: 73,60 + Owner: Neutral + Actor68: tc04 + Location: 82,63 + Owner: Neutral + Actor69: tc01 + Location: 77,62 + Owner: Neutral + Actor70: tc02 + Location: 78,60 + Owner: Neutral + Actor71: tc05 + Location: 95,66 + Owner: Neutral + Actor72: tc03 + Location: 86,62 + Owner: Neutral + Actor73: tc02 + Location: 95,69 + Owner: Neutral + Actor74: tc01 + Location: 102,62 + Owner: Neutral + Actor75: t11 + Location: 107,61 + Owner: Neutral + Actor76: tc04 + Location: 82,49 + Owner: Neutral + Actor77: tc04 + Location: 50,69 + Owner: Neutral + Actor78: tc01 + Location: 58,70 + Owner: Neutral + Actor79: tc01 + Location: 84,89 + Owner: Neutral + Actor80: tc04 + Location: 94,80 + Owner: Neutral + Actor81: tc05 + Location: 93,85 + Owner: Neutral + Actor82: tc05 + Location: 29,55 + Owner: Neutral + Actor83: tc03 + Location: 39,48 + Owner: Neutral + Actor84: tc02 + Location: 29,51 + Owner: Neutral + Actor85: tc01 + Location: 36,56 + Owner: Neutral + Actor86: tc04 + Location: 42,48 + Owner: Neutral + Actor87: t15 + Location: 36,50 + Owner: Neutral + Actor88: tc05 + Location: 48,49 + Owner: Neutral + Actor89: tc04 + Location: 67,49 + Owner: Neutral + Actor90: t17 + Location: 71,71 + Owner: Neutral + Actor91: tc04 + Location: 50,78 + Owner: Neutral + Actor92: tc04 + Location: 34,65 + Owner: Neutral + Actor93: tc04 + Location: 57,91 + Owner: Neutral + Actor94: tc05 + Location: 60,91 + Owner: Neutral + Actor95: tc02 + Location: 72,90 + Owner: Neutral + Actor114: pbox + Location: 89,65 + Owner: Greece + Actor115: pbox + Location: 97,65 + Owner: Greece + Actor116: pbox + Location: 84,60 + Owner: Greece + Actor117: pbox + Location: 84,53 + Owner: Greece + Actor118: pbox + Location: 51,71 + Owner: Greece + Actor119: pbox + Location: 57,71 + Owner: Greece + Actor125: gun + Location: 84,61 + Owner: Greece + Facing: 192 + Actor126: gun + Location: 97,63 + Owner: Greece + Facing: 128 + Actor129: 1tnk + Location: 56,71 + Owner: Greece + Facing: 96 + Actor130: 1tnk + Location: 53,71 + Owner: Greece + Facing: 96 + Actor135: mcv + Location: 33,90 + Owner: USSR + Actor136: 1tnk + Location: 117,62 + Owner: Greece + Facing: 96 + Actor137: 1tnk + Location: 114,62 + Owner: Greece + Facing: 96 + Actor138: 2tnk + Location: 111,53 + Owner: Greece + Facing: 128 + Actor139: 2tnk + Location: 112,53 + Owner: Greece + Facing: 128 + Actor142: jeep + Location: 74,91 + Owner: Greece + Actor143: jeep + Location: 48,49 + Owner: Greece + Facing: 160 + Actor144: 1tnk + Location: 86,90 + Owner: Greece + Facing: 32 + Actor145: 1tnk + Location: 96,86 + Owner: Greece + Facing: 96 + Actor146: 2tnk + Location: 96,47 + Owner: Greece + Facing: 160 + Actor148: e1 + Location: 76,57 + Owner: Greece + SubCell: 0 + Actor149: e1 + Location: 77,58 + Owner: Greece + SubCell: 2 + Actor150: e1 + Location: 76,58 + Owner: Greece + SubCell: 0 + Actor151: e3 + Location: 73,58 + Owner: Greece + SubCell: 0 + Actor152: e3 + Location: 72,57 + Owner: Greece + SubCell: 4 + Actor153: e3 + Location: 72,58 + Owner: Greece + SubCell: 2 + Actor154: e3 + Location: 95,80 + Owner: Greece + SubCell: 3 + Actor155: e3 + Location: 96,80 + Owner: Greece + SubCell: 0 + Actor160: dog + Location: 33,86 + Owner: USSR + SubCell: 1 + Actor161: dog + Location: 34,86 + Owner: USSR + SubCell: 1 + Actor162: dog + Location: 33,85 + Owner: USSR + SubCell: 1 + Actor163: dog + Location: 34,85 + Owner: USSR + SubCell: 1 + Actor164: e3 + Location: 102,53 + Owner: Greece + SubCell: 1 + Actor165: e3 + Location: 95,52 + Owner: Greece + SubCell: 0 + Actor166: e3 + Location: 102,57 + Owner: Greece + SubCell: 0 + Actor167: mine + Location: 37,55 + Owner: Neutral + Actor168: mine + Location: 52,88 + Owner: Neutral + Actor169: mine + Location: 91,87 + Owner: Neutral + Radar: dome + Location: 111,50 + Owner: Greece + Pbox1: pbox + Location: 111,80 + Owner: Greece + Pbox2: pbox + Location: 116,80 + Owner: Greece + NavyYard: syrd + Location: 78,65 + Owner: Greece + CYard: fact + Location: 103,51 + Owner: Greece + Proc: proc + Location: 99,54 + Owner: Greece + FreeActor: False + Silo1: silo + Location: 104,55 + Owner: Greece + Silo2: silo + Location: 104,56 + Owner: Greece + Silo3: silo + Location: 105,56 + Owner: Greece + Silo4: silo + Location: 105,55 + Owner: Greece + Powr: powr + Location: 100,50 + Owner: Greece + Powr2: powr + Location: 88,61 + Owner: Greece + Powr3: powr + Location: 96,50 + Owner: Greece + Powr4: powr + Location: 86,52 + Owner: Greece + Powr5: powr + Location: 89,51 + Owner: Greece + Powr6: powr + Location: 98,50 + Owner: Greece + Barr: tent + Location: 96,54 + Owner: Greece + Gap1: gap + Location: 86,50 + Owner: Greece + Gap2: gap + Location: 90,62 + Owner: Greece + Weap: weap + Location: 92,50 + Owner: Greece + village1: v01 + Location: 37,48 + Owner: Spain + village2: v03 + Location: 42,47 + Owner: Spain + village3: v05 + Location: 44,50 + Owner: Spain + village4: v06 + Location: 40,50 + Owner: Spain + village5: v07 + Location: 36,52 + Owner: Spain + Harvester: harv + Location: 93,78 + Owner: Greece + Facing: 128 + Tank1: 3tnk + Location: 32,87 + Owner: USSR + Tank2: 3tnk + Location: 34,87 + Owner: USSR + Tank3: v2rl + Location: 32,88 + Owner: USSR + Tank4: v2rl + Location: 34,88 + Owner: USSR + civ1: c1 + Location: 41,53 + Owner: Spain + Facing: 160 + SubCell: 0 + civ2: c2 + Location: 47,49 + Owner: Spain + Facing: 224 + SubCell: 1 + civ3: c3 + Location: 39,51 + Owner: Spain + SubCell: 2 + civ4: c4 + Location: 46,52 + Owner: Spain + Facing: 96 + SubCell: 4 + Guard1: 1tnk + Location: 105,59 + Owner: Greece + Facing: 64 + Guard2: 1tnk + Location: 105,60 + Owner: Greece + Facing: 64 + Guard3: 2tnk + Location: 105,61 + Owner: Greece + Facing: 64 + NRoadPoint: waypoint + Location: 75,45 + Owner: Neutral + CrossroadsPoint: waypoint + Location: 74,57 + Owner: Neutral + VillagePoint: waypoint + Location: 40,58 + Owner: Neutral + ToVillageRoadPoint: waypoint + Location: 52,57 + Owner: Neutral + InBasePoint: waypoint + Location: 94,57 + Owner: Neutral + OrefieldSouthPoint: waypoint + Location: 91,84 + Owner: Neutral + ToBridgePoint: waypoint + Location: 66,66 + Owner: Neutral + ToRadarBridgePoint: waypoint + Location: 107,88 + Owner: Neutral + IslandPoint: waypoint + Location: 113,75 + Owner: Neutral + EntranceSouthPoint: waypoint + Location: 93,67 + Owner: Neutral + GreeceCYard: waypoint + Location: 104,52 + Owner: Neutral + VillageCamPoint: waypoint + Location: 43,52 + Owner: Neutral + StartCamPoint: waypoint + Location: 33,88 + 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: + Tooltip: + GenericVisibility: Enemy + ShowOwnerRow: false + ^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 + ^CivBuilding: + Tooltip: + ShowOwnerRow: false + ^TechBuilding: + Tooltip: + ShowOwnerRow: false + AFLD: + ParatroopersPower@paratroopers: + DropItems: E1,E1,E1,E2,E2 + 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 + AGUN: + Buildable: + Prerequisites: ~disabled + +Sequences: + +VoxelSequences: + +Weapons: + +Voices: + +Notifications: + +Translations: diff --git a/mods/ra/maps/soviet-04b/reinforcements_teams.lua b/mods/ra/maps/soviet-04b/reinforcements_teams.lua new file mode 100644 index 0000000000..6d1fd7cdd5 --- /dev/null +++ b/mods/ra/maps/soviet-04b/reinforcements_teams.lua @@ -0,0 +1,80 @@ +Civs = { civ1, civ2, civ3, civ4 } +Village = { civ1, civ3, civ4, village1, village3 } +Guards = { Guard1, Guard2, Guard3 } +SovietMCV = { "mcv" } +InfantryReinfGreece = { "e1", "e1", "e1", "e1", "e1" } +Avengers = { "jeep", "1tnk", "2tnk", "2tnk", "1tnk" } +Patrol1Group = { "jeep", "jeep", "2tnk", "2tnk" } +Patrol2Group = { "jeep", "1tnk", "1tnk", "1tnk" } +AlliedInfantryTypes = { "e1", "e3" } +AlliedArmorTypes = { "jeep", "jeep", "1tnk", "1tnk", "1tnk" } +InfAttack = { } +ArmorAttack = { } + +InfReinfPath = { NRoadPoint.Location, CrossroadsPoint.Location, ToVillageRoadPoint.Location, VillagePoint.Location } +Patrol1Path = { ToVillageRoadPoint.Location, ToBridgePoint.Location, InBasePoint.Location } +Patrol2Path = { EntranceSouthPoint.Location, ToRadarBridgePoint.Location, IslandPoint.Location, ToRadarBridgePoint.Location } + +VillageCamArea = { CPos.New(37, 58),CPos.New(37, 59),CPos.New(37, 60),CPos.New(38, 60),CPos.New(39, 60), CPos.New(40, 60), CPos.New(41, 60), CPos.New(35, 57), CPos.New(34, 57), CPos.New(33, 57), CPos.New(32, 57) } + +if Map.Difficulty == "Easy" then + ArmorReinfGreece = { "jeep", "1tnk", "1tnk" } +else + ArmorReinfGreece = { "jeep", "jeep", "1tnk", "1tnk", "1tnk" } +end + +AttackPaths = +{ + { CrossroadsPoint, ToVillageRoadPoint, VillagePoint }, + { EntranceSouthPoint, OrefieldSouthPoint }, + { CrossroadsPoint, ToBridgePoint } +} + +ReinfInf = function() + Reinforcements.Reinforce(Greece, InfantryReinfGreece, InfReinfPath, 0, function(soldier) + soldier.Hunt() + end) +end + +ReinfArmor = function() + if not Radar.IsDead and Radar.Owner == Greece then + RCheck = true + Reinforcements.Reinforce(Greece, ArmorReinfGreece, InfReinfPath, 0, function(soldier) + soldier.Hunt() + end) + end +end + +BringPatrol1 = function() + local units = Reinforcements.Reinforce(Greece, Patrol1Group, { NRoadPoint.Location }, 0) + Utils.Do(units, function(patrols) + patrols.Patrol(Patrol1Path, true, 250) + end) + + if not Radar.IsDead and Radar.Owner == Greece then + Trigger.OnAllKilled(units, function() + if Map.Difficulty == "Hard" then + Trigger.AfterDelay(DateTime.Minutes(4), BringPatrol1) + else + Trigger.AfterDelay(DateTime.Minutes(7), BringPatrol1) + end + end) + end +end + +BringPatrol2 = function() + local units = Reinforcements.Reinforce(Greece, Patrol2Group, { NRoadPoint.Location }, 0) + Utils.Do(units, function(patrols) + patrols.Patrol(Patrol2Path, true, 250) + end) + + if not Radar.IsDead and Radar.Owner == Greece then + Trigger.OnAllKilled(units, function() + if Map.Difficulty == "Hard" then + Trigger.AfterDelay(DateTime.Minutes(4), BringPatrol2) + else + Trigger.AfterDelay(DateTime.Minutes(7), BringPatrol2) + end + end) + end +end diff --git a/mods/ra/maps/soviet-05/map.yaml b/mods/ra/maps/soviet-05/map.yaml index 2b027609f2..35227cf143 100644 --- a/mods/ra/maps/soviet-05/map.yaml +++ b/mods/ra/maps/soviet-05/map.yaml @@ -652,14 +652,9 @@ Rules: ShowOwnerRow: false Demolishable: ^Building: - Capturable: - CaptureThreshold: 0.25 Tooltip: GenericVisibility: Enemy ShowOwnerRow: false - ^TechBuilding: - Capturable: - Type: ~disabled ^Wall: Tooltip: ShowOwnerRow: false @@ -679,6 +674,9 @@ Rules: ^Crate: Tooltip: ShowOwnerRow: false + AFLD: + ParatroopersPower@paratroopers: + DropItems: E1,E1,E1,E2,E2 TSLA: Buildable: Prerequisites: ~disabled @@ -731,6 +729,9 @@ Rules: powerproxy.paratroopers: ParatroopersPower: DropItems: E1,E1,E1,E1,E1 + AGUN: + Buildable: + Prerequisites: ~disabled Sequences: diff --git a/mods/ra/missions.yaml b/mods/ra/missions.yaml index 49300d5d6c..f287f01db1 100644 --- a/mods/ra/missions.yaml +++ b/mods/ra/missions.yaml @@ -7,4 +7,6 @@ Allied Campaign: Soviet Campaign: ./mods/ra/maps/soviet-01 ./mods/ra/maps/soviet-02a + ./mods/ra/maps/soviet-04a + ./mods/ra/maps/soviet-04b ./mods/ra/maps/soviet-05