diff --git a/mods/ra/maps/allies-04/allies04-AI.lua b/mods/ra/maps/allies-04/allies04-AI.lua new file mode 100644 index 0000000000..50d1807fd6 --- /dev/null +++ b/mods/ra/maps/allies-04/allies04-AI.lua @@ -0,0 +1,270 @@ + +IdlingUnits = { } +Yaks = { } + +AttackGroupSizes = +{ + easy = 6, + normal = 8, + hard = 10 +} + +AttackDelays = +{ + easy = { DateTime.Seconds(4), DateTime.Seconds(9) }, + normal = { DateTime.Seconds(2), DateTime.Seconds(7) }, + hard = { DateTime.Seconds(1), DateTime.Seconds(5) } +} + +AttackRallyPoints = +{ + { SovietRally1.Location, SovietRally3.Location, SovietRally5.Location, SovietRally4.Location, SovietRally13.Location, PlayerBase.Location }, + { SovietRally7.Location, SovietRally10.Location, PlayerBase.Location }, + { SovietRally1.Location, SovietRally3.Location, SovietRally5.Location, SovietRally4.Location, SovietRally12.Location, PlayerBase.Location }, + { SovietRally7.Location, ParadropPoint1.Location, PlayerBase.Location }, + { SovietRally8.Location, SovietRally9.Location, ParadropPoint1.Location, PlayerBase.Location, } +} + +SovietInfantryTypes = { "e1", "e1", "e2" } +SovietVehicleTypes = { "3tnk", "3tnk", "3tnk", "ftrk", "ftrk", "apc" } +SovietAircraftType = { "yak" } + +AttackOnGoing = false +HoldProduction = false +HarvesterKilled = false + +Powr1 = { name = "powr", pos = CPos.New(47, 21), prize = 500, exists = true } +Barr = { name = "barr", pos = CPos.New(53, 26), prize = 400, exists = true } +Proc = { name = "proc", pos = CPos.New(54, 21), prize = 1400, exists = true } +Weap = { name = "weap", pos = CPos.New(48, 28), prize = 2000, exists = true } +Powr2 = { name = "powr", pos = CPos.New(51, 21), prize = 500, exists = true } +Powr3 = { name = "powr", pos = CPos.New(46, 25), prize = 500, exists = true } +Powr4 = { name = "powr", pos = CPos.New(49, 21), prize = 500, exists = true } +Ftur1 = { name = "powr", pos = CPos.New(56, 27), prize = 600, exists = true } +Ftur2 = { name = "powr", pos = CPos.New(51, 32), prize = 600, exists = true } +Ftur3 = { name = "powr", pos = CPos.New(54, 30), prize = 600, exists = true } +Afld1 = { name = "afld", pos = CPos.New(43, 23), prize = 500, exists = true } +Afld2 = { name = "afld", pos = CPos.New(43, 21), prize = 500, exists = true } +BaseBuildings = { Powr1, Barr, Proc, Weap, Powr2, Powr3, Powr4, Ftur1, Ftur2, Ftur3, Afld1, Afld2 } +InitialBase = { Barracks, Refinery, PowerPlant1, PowerPlant2, PowerPlant3, PowerPlant4, Warfactory, Flametur1, Flametur2, Flametur3, Airfield1, Airfield2 } + +BuildBase = function() + if Conyard.IsDead or Conyard.Owner ~= ussr then + return + elseif Harvester.IsDead and ussr.Resources <= 299 then + return + end + + for i,v in ipairs(BaseBuildings) do + if not v.exists then + BuildBuilding(v) + return + end + end + + Trigger.AfterDelay(DateTime.Seconds(10), BuildBase) +end + +BuildBuilding = function(building) + Trigger.AfterDelay(Actor.BuildTime(building.name), function() + local actor = Actor.Create(building.name, true, { Owner = ussr, Location = building.pos }) + ussr.Cash = ussr.Cash - building.prize + + building.exists = true + Trigger.OnKilled(actor, function() building.exists = false end) + Trigger.OnDamaged(actor, function(building) + if building.Owner == ussr and building.Health < building.MaxHealth * 3/4 then + building.StartBuildingRepairs() + DefendActor(actor) + end + end) + + Trigger.AfterDelay(DateTime.Seconds(10), BuildBase) + end) +end + +IdleHunt = function(unit) if not unit.IsDead then Trigger.OnIdle(unit, unit.Hunt) end end + +SetupAttackGroup = function() + local units = { } + + for i = 0, AttackGroupSize, 1 do + if #IdlingUnits == 0 then + return units + end + + local number = Utils.RandomInteger(1, #IdlingUnits) + + if IdlingUnits[number] and not IdlingUnits[number].IsDead then + units[i] = IdlingUnits[number] + table.remove(IdlingUnits, number) + end + end + + return units +end + +SendAttack = function() + if Attacking then + return + end + Attacking = true + HoldProduction = true + + local units = SetupAttackGroup() + local path = Utils.Random(AttackRallyPoints) + Utils.Do(units, function(unit) + unit.Patrol(path) + IdleHunt(unit) + end) + + Trigger.OnAllRemovedFromWorld(units, function() + Attacking = false + HoldProduction = false + end) +end + +ProtectHarvester = function(unit) + DefendActor(unit) + Trigger.OnKilled(unit, function() HarvesterKilled = true end) +end + +DefendActor = function(unit) + Trigger.OnDamaged(unit, function(self, attacker) + if AttackOnGoing then + return + end + AttackOnGoing = true + + local Guards = SetupAttackGroup() + + if #Guards <= 0 then + AttackOnGoing = false + return + end + + Utils.Do(Guards, function(unit) + if not self.IsDead then + unit.AttackMove(self.Location) + end + IdleHunt(unit) + end) + + Trigger.OnAllRemovedFromWorld(Guards, function() AttackOnGoing = false end) + end) +end + +InitAIUnits = function() + IdlingUnits = ussr.GetGroundAttackers() + + DefendActor(Conyard) + for i,v in ipairs(InitialBase) do + DefendActor(v) + Trigger.OnDamaged(v, function(building) + if building.Owner == ussr and building.Health < building.MaxHealth * 3/4 then + building.StartBuildingRepairs() + end + end) + + Trigger.OnKilled(v, function() + BaseBuildings[i].exists = false + end) + end +end + +ProduceInfantry = function() + if HoldProduction then + Trigger.AfterDelay(DateTime.Minutes(1), ProduceInfantry) + return + end + + -- See AttackDelay in WorldLoaded + local delay = Utils.RandomInteger(AttackDelay[1], AttackDelay[2]) + local toBuild = { Utils.Random(SovietInfantryTypes) } + ussr.Build(toBuild, function(unit) + IdlingUnits[#IdlingUnits + 1] = unit[1] + Trigger.AfterDelay(delay, ProduceInfantry) + + -- See AttackGroupSize in WorldLoaded + if #IdlingUnits >= (AttackGroupSize * 2.5) then + SendAttack() + end + end) +end + +ProduceVehicles = function() + if HoldProduction then + Trigger.AfterDelay(DateTime.Minutes(1), ProduceVehicles) + return + end + + -- See AttackDelay in WorldLoaded + local delay = Utils.RandomInteger(AttackDelay[1], AttackDelay[2]) + if HarvesterKilled then + ussr.Build({ "harv" }, function(harv) + ProtectHarvester(harv[1]) + HarvesterKilled = false + Trigger.AfterDelay(delay, ProduceVehicles) + end) + else + local toBuild = { Utils.Random(SovietVehicleTypes) } + ussr.Build(toBuild, function(unit) + IdlingUnits[#IdlingUnits + 1] = unit[1] + Trigger.AfterDelay(delay, ProduceVehicles) + + -- See AttackGroupSize in WorldLoaded + if #IdlingUnits >= (AttackGroupSize * 2.5) then + SendAttack() + end + end) + end +end + +ProduceAircraft = function() + ussr.Build(SovietAircraftType, function(units) + local yak = units[1] + Yaks[#Yaks + 1] = yak + + Trigger.OnKilled(yak, ProduceAircraft) + if #Yaks == 1 then + Trigger.AfterDelay(DateTime.Minutes(1), ProduceAircraft) + end + + TargetAndAttack(yak) + end) +end + +TargetAndAttack = function(yak, target) + if not target or target.IsDead or (not target.IsInWorld) then + local enemies = Utils.Where(Map.ActorsInWorld, function(self) return self.Owner == player and self.HasProperty("Health") end) + if #enemies > 0 then + target = Utils.Random(enemies) + else + yak.Wait(DateTime.Seconds(5)) + end + end + + if target and yak.AmmoCount() > 0 then + yak.Attack(target) + else + yak.ReturnToBase() + end + + yak.CallFunc(function() + TargetAndAttack(yak, target) + end) +end + +ActivateAI = function() + InitAIUnits() + ProtectHarvester(Harvester) + + local difficulty = Map.LobbyOption("difficulty") + AttackDelay = AttackDelays[difficulty] + AttackGroupSize = AttackGroupSizes[difficulty] + Trigger.AfterDelay(DateTime.Seconds(10), function() + ProduceInfantry() + ProduceVehicles() + ProduceAircraft() + end) +end diff --git a/mods/ra/maps/allies-04/allies04.lua b/mods/ra/maps/allies-04/allies04.lua new file mode 100644 index 0000000000..1f631dadd5 --- /dev/null +++ b/mods/ra/maps/allies-04/allies04.lua @@ -0,0 +1,170 @@ + +ConvoyUnits = +{ + { "ftrk", "ftrk", "truk", "truk", "apc", "ftrk" }, + { "ftrk", "3tnk", "truk", "truk", "apc" }, + { "3tnk", "3tnk", "truk", "truk", "ftrk" } +} + +ConvoyRallyPoints = +{ + { SovietEntry1.Location, SovietRally1.Location, SovietRally3.Location, SovietRally5.Location, SovietRally4.Location, SovietRally6.Location }, + { SovietEntry2.Location, SovietRally10.Location, SovietRally11.Location } +} + +ConvoyDelays = +{ + easy = { DateTime.Minutes(4), DateTime.Minutes(5) + DateTime.Seconds(20) }, + normal = { DateTime.Minutes(2) + DateTime.Seconds(30), DateTime.Minutes(4) }, + hard = { DateTime.Minutes(1) + DateTime.Seconds(30), DateTime.Minutes(2) + DateTime.Seconds(30) } +} + +Convoys = +{ + easy = 2, + normal = 3, + hard = 5 +} + +ParadropDelays = +{ + easy = { DateTime.Seconds(40), DateTime.Seconds(90) }, + normal = { DateTime.Seconds(30), DateTime.Seconds(70) }, + hard = { DateTime.Seconds(20), DateTime.Seconds(50) } +} + +ParadropWaves = +{ + easy = 4, + normal = 6, + hard = 10 +} + +ParadropLZs = { ParadropPoint1.CenterPosition, ParadropPoint2.CenterPosition, ParadropPoint3.CenterPosition } + +Paradropped = 0 +Paradrop = function() + Trigger.AfterDelay(Utils.RandomInteger(ParadropDelay[1], ParadropDelay[2]), function() + local units = PowerProxy.SendParatroopers(Utils.Random(ParadropLZs)) + Utils.Do(units, function(unit) + Trigger.OnAddedToWorld(unit, IdleHunt) + end) + + Paradropped = Paradropped + 1 + if Paradropped <= ParadropWaves[Map.LobbyOption("difficulty")] then + Paradrop() + end + end) +end + +ConvoysSent = 0 +SendConvoys = function() + Trigger.AfterDelay(Utils.RandomInteger(ConvoyDelay[1], ConvoyDelay[2]), function() + local path = Utils.Random(ConvoyRallyPoints) + local units = Reinforcements.Reinforce(ussr, Utils.Random(ConvoyUnits), { path[1] }) + local lastWaypoint = path[#path] + + Utils.Do(units, function(unit) + Trigger.OnAddedToWorld(unit, function() + if unit.Type == "truk" then + Utils.Do(path, function(waypoint) + unit.Move(waypoint) + end) + + Trigger.OnIdle(unit, function() + unit.Move(lastWaypoint) + end) + else + unit.Patrol(path) + Trigger.OnIdle(unit, function() + unit.AttackMove(lastWaypoint) + end) + end + end) + end) + + local id = Trigger.OnEnteredFootprint({ lastWaypoint }, function(a, id) + if a.Owner == ussr and Utils.Any(units, function(unit) return unit == a end) then + + -- We are at our destination and thus don't care about other queued actions anymore + a.Stop() + a.Destroy() + + if a.Type == "truk" then + player.MarkFailedObjective(DestroyConvoys) + end + end + end) + + Trigger.OnAllRemovedFromWorld(units, function() + Trigger.RemoveFootprintTrigger(id) + + ConvoysSent = ConvoysSent + 1 + if ConvoysSent <= Convoys[Map.LobbyOption("difficulty")] then + SendConvoys() + else + player.MarkCompletedObjective(DestroyConvoys) + end + end) + + Media.PlaySpeechNotification(player, "ConvoyApproaching") + end) +end + +Tick = function() + if player.HasNoRequiredUnits() then + player.MarkFailedObjective(KillUSSR) + end + + if ussr.HasNoRequiredUnits() then + player.MarkCompletedObjective(KillUSSR) + + -- We don't care about future convoys anymore + player.MarkCompletedObjective(DestroyConvoys) + end +end + +InitObjectives = function() + Trigger.OnObjectiveAdded(player, function(p, id) + Media.DisplayMessage(p.GetObjectiveDescription(id), "New " .. string.lower(p.GetObjectiveType(id)) .. " objective") + end) + + KillUSSR = player.AddPrimaryObjective("Destroy all Soviet units and buildings in this region.") + DestroyConvoys = player.AddSecondaryObjective("Eliminate all passing Soviet convoys.") + + 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.OnPlayerLost(player, function() + Trigger.AfterDelay(DateTime.Seconds(1), function() + Media.PlaySpeechNotification(player, "MissionFailed") + end) + end) + Trigger.OnPlayerWon(player, function() + Trigger.AfterDelay(DateTime.Seconds(1), function() + Media.PlaySpeechNotification(player, "MissionAccomplished") + end) + end) +end + +WorldLoaded = function() + player = Player.GetPlayer("Greece") + ussr = Player.GetPlayer("USSR") + + Camera.Position = AlliedConyard.CenterPosition + + InitObjectives() + + local difficulty = Map.LobbyOption("difficulty") + ConvoyDelay = ConvoyDelays[difficulty] + ParadropDelay = ParadropDelays[difficulty] + PowerProxy = Actor.Create("powerproxy.paratroopers", false, { Owner = ussr }) + Paradrop() + SendConvoys() + + Trigger.AfterDelay(0, ActivateAI) +end diff --git a/mods/ra/maps/allies-04/map.bin b/mods/ra/maps/allies-04/map.bin new file mode 100644 index 0000000000..2479ae9748 Binary files /dev/null and b/mods/ra/maps/allies-04/map.bin differ diff --git a/mods/ra/maps/allies-04/map.png b/mods/ra/maps/allies-04/map.png new file mode 100644 index 0000000000..29bfd56141 Binary files /dev/null and b/mods/ra/maps/allies-04/map.png differ diff --git a/mods/ra/maps/allies-04/map.yaml b/mods/ra/maps/allies-04/map.yaml new file mode 100644 index 0000000000..43a24235d8 --- /dev/null +++ b/mods/ra/maps/allies-04/map.yaml @@ -0,0 +1,539 @@ +MapFormat: 11 + +RequiresMod: ra + +Title: 04: Ten to one + +Author: Westwood Studios + +Tileset: SNOW + +MapSize: 128,128 + +Bounds: 37,21,56,65 + +Visibility: MissionSelector + +Categories: Campaign + +LockPreview: True + +Players: + PlayerReference@Neutral: + Name: Neutral + OwnsWorld: True + NonCombatant: True + Faction: allies + PlayerReference@USSR: + Name: USSR + Faction: soviet + Color: FE1100 + Enemies: Greece + PlayerReference@Greece: + Name: Greece + Playable: True + Required: True + LockFaction: True + Faction: allies + LockColor: True + Color: E2E6F5 + Enemies: USSR + +Actors: + Actor0: t17 + Location: 65,35 + Owner: Neutral + Actor1: tc02 + Location: 65,36 + Owner: Neutral + Actor2: tc04 + Location: 85,81 + Owner: Neutral + Actor3: tc01 + Location: 89,84 + Owner: Neutral + Actor4: tc05 + Location: 90,83 + Owner: Neutral + Actor5: t10 + Location: 84,71 + Owner: Neutral + Actor6: t11 + Location: 54,55 + Owner: Neutral + Actor7: tc04 + Location: 45,53 + Owner: Neutral + Actor8: t01 + Location: 45,44 + Owner: Neutral + Actor9: t11 + Location: 59,71 + Owner: Neutral + Actor10: tc01 + Location: 62,84 + Owner: Neutral + Actor11: t07 + Location: 51,84 + Owner: Neutral + Actor12: t08 + Location: 48,85 + Owner: Neutral + Actor13: t14 + Location: 46,84 + Owner: Neutral + Actor14: t11 + Location: 40,84 + Owner: Neutral + Actor15: t07 + Location: 87,44 + Owner: Neutral + Actor16: t01 + Location: 92,45 + Owner: Neutral + Actor17: t11 + Location: 77,56 + Owner: Neutral + Actor18: t02 + Location: 79,47 + Owner: Neutral + Actor19: tc02 + Location: 44,68 + Owner: Neutral + Actor20: t17 + Location: 67,62 + Owner: Neutral + Actor21: tc05 + Location: 68,67 + Owner: Neutral + Actor22: tc04 + Location: 67,66 + Owner: Neutral + Actor23: t15 + Location: 71,63 + Owner: Neutral + Actor24: t16 + Location: 72,62 + Owner: Neutral + Actor25: t08 + Location: 64,55 + Owner: Neutral + Actor26: t17 + Location: 69,50 + Owner: Neutral + Actor27: tc04 + Location: 67,49 + Owner: Neutral + Actor28: tc02 + Location: 67,51 + Owner: Neutral + Actor29: t01 + Location: 67,44 + Owner: Neutral + Actor30: t06 + Location: 67,54 + Owner: Neutral + Actor31: tc01 + Location: 70,54 + Owner: Neutral + Actor32: t17 + Location: 70,55 + Owner: Neutral + Actor33: tc04 + Location: 67,76 + Owner: Neutral + Actor34: tc03 + Location: 71,52 + Owner: Neutral + Actor35: t05 + Location: 40,74 + Owner: Neutral + Actor36: tc02 + Location: 69,72 + Owner: Neutral + Actor37: t10 + Location: 68,77 + Owner: Neutral + Actor38: t11 + Location: 51,71 + Owner: Neutral + Actor39: t08 + Location: 50,78 + Owner: Neutral + Actor40: t07 + Location: 44,77 + Owner: Neutral + Actor41: tc01 + Location: 63,74 + Owner: Neutral + Actor42: tc01 + Location: 59,60 + Owner: Neutral + Actor43: t17 + Location: 53,66 + Owner: Neutral + Actor44: t01 + Location: 45,56 + Owner: Neutral + Actor45: t10 + Location: 43,56 + Owner: Neutral + Actor46: t10 + Location: 55,46 + Owner: Neutral + Actor47: t14 + Location: 58,49 + Owner: Neutral + Actor48: t16 + Location: 61,44 + Owner: Neutral + Actor49: t01 + Location: 89,62 + Owner: Neutral + Actor50: t12 + Location: 92,63 + Owner: Neutral + Actor51: t08 + Location: 92,60 + Owner: Neutral + Actor52: t03 + Location: 75,72 + Owner: Neutral + Actor53: t06 + Location: 75,80 + Owner: Neutral + Actor54: t01 + Location: 77,41 + Owner: Neutral + Actor55: t03 + Location: 76,42 + Owner: Neutral + Actor56: t05 + Location: 83,27 + Owner: Neutral + Actor57: tc02 + Location: 79,35 + Owner: Neutral + Actor58: tc04 + Location: 90,26 + Owner: Neutral + Actor59: t17 + Location: 92,22 + Owner: Neutral + Actor60: tc03 + Location: 91,31 + Owner: Neutral + Actor61: t01 + Location: 43,47 + Owner: Neutral + Actor62: t02 + Location: 37,52 + Owner: Neutral + Actor63: t10 + Location: 37,37 + Owner: Neutral + Actor64: tc02 + Location: 41,28 + Owner: Neutral + Actor65: tc03 + Location: 67,27 + Owner: Neutral + Actor66: t16 + Location: 63,27 + Owner: Neutral + Actor67: t03 + Location: 38,27 + Owner: Neutral + Actor68: t06 + Location: 42,31 + Owner: Neutral + Actor69: t07 + Location: 77,25 + Owner: Neutral + Actor70: tc02 + Location: 40,24 + Owner: Neutral + Actor71: t17 + Location: 37,24 + Owner: Neutral + Actor81: silo + Location: 43,27 + Owner: USSR + Actor82: silo + Location: 44,28 + Owner: USSR + Actor83: silo + Location: 44,26 + Owner: USSR + Actor89: 3tnk + Location: 42,35 + Owner: USSR + Facing: 64 + Actor90: 3tnk + Location: 39,34 + Owner: USSR + Facing: 64 + Actor91: 3tnk + Location: 49,31 + Owner: USSR + Facing: 96 + Actor93: e2 + Location: 47,40 + Owner: USSR + Facing: 64 + SubCell: 0 + Actor94: e2 + Location: 47,36 + Owner: USSR + Facing: 96 + SubCell: 4 + Actor95: e2 + Location: 50,40 + Owner: USSR + Facing: 96 + SubCell: 0 + Actor96: e2 + Location: 48,40 + Owner: USSR + Facing: 64 + SubCell: 0 + Actor97: e2 + Location: 48,36 + Owner: USSR + Facing: 64 + SubCell: 0 + Actor98: e2 + Location: 46,39 + Owner: USSR + Facing: 96 + SubCell: 2 + Actor99: e1 + Location: 70,59 + Owner: Greece + Facing: 192 + SubCell: 4 + Actor100: e1 + Location: 44,34 + Owner: USSR + Facing: 96 + SubCell: 4 + Actor101: e1 + Location: 43,37 + Owner: USSR + Facing: 96 + SubCell: 4 + waypoint17: waypoint + Location: 92,68 + Owner: Neutral + waypoint98: waypoint + Location: 70,60 + Owner: Neutral + Actor129: proc + Owner: Greece + Location: 82,54 + Actor130: powr + Owner: Greece + Location: 87,53 + Actor131: tent + Owner: Greece + Location: 83,49 + Health: 12 + Actor88: jeep + Location: 70,60 + Owner: Greece + Facing: 224 + Actor132: jeep + Location: 57,65 + Owner: Greece + Actor133: jeep + Location: 62,67 + Owner: Greece + Actor134: jeep + Location: 74,81 + Owner: Greece + Actor135: jeep + Location: 45,71 + Owner: Greece + Actor136: e1 + Location: 47,71 + Owner: Greece + Actor137: e1 + Location: 44,72 + Owner: Greece + Actor138: e1 + Location: 49,73 + Owner: Greece + Actor139: e1 + Location: 47,73 + Owner: Greece + Actor140: e1 + Location: 45,73 + Owner: Greece + Actor141: e1 + Location: 56,69 + Owner: Greece + Actor142: e3 + Location: 48,72 + Owner: Greece + Actor143: e1 + Location: 73,80 + Owner: Greece + Actor144: e1 + Location: 76,79 + Owner: Greece + Actor145: e1 + Location: 74,80 + Owner: Greece + Actor146: e1 + Location: 62,69 + Owner: Greece + Actor147: e3 + Location: 58,69 + Owner: Greece + Actor148: e3 + Location: 60,68 + Owner: Greece + Actor149: e3 + Location: 75,79 + Owner: Greece + Actor150: e1 + Location: 85,54 + Owner: Greece + Actor151: e1 + Location: 85,51 + Owner: Greece + Actor152: e1 + Location: 84,48 + Owner: Greece + Actor153: e3 + Location: 84,55 + Owner: Greece + Actor154: e2 + Owner: USSR + Location: 82,47 + SubCell: 3 + Facing: 92 + TurretFacing: 92 + Actor155: e1 + Owner: USSR + Location: 87,49 + SubCell: 3 + Facing: 92 + TurretFacing: 92 + Actor156: e1 + Owner: USSR + Location: 87,49 + SubCell: 1 + Facing: 122 + TurretFacing: 122 + AlliedConyard: fact + Owner: Greece + Location: 88,49 + Health: 88 + Harvester: harv + Location: 57,24 + Owner: USSR + Facing: 64 + Conyard: fact + Location: 49,24 + Owner: USSR + Barracks: barr + Location: 53,26 + Owner: USSR + Refinery: proc + Location: 54,21 + Owner: USSR + FreeActor: false + PowerPlant1: powr + Location: 47,21 + Owner: USSR + PowerPlant2: powr + Location: 51,21 + Owner: USSR + PowerPlant3: powr + Location: 46,25 + Owner: USSR + PowerPlant4: powr + Location: 49,21 + Owner: USSR + Warfactory: weap + Location: 48,28 + Owner: USSR + Flametur1: ftur + Location: 56,27 + Owner: USSR + Flametur2: ftur + Location: 51,32 + Owner: USSR + Flametur3: ftur + Location: 54,30 + Owner: USSR + Airfield1: afld + Location: 43,23 + Owner: USSR + Airfield2: afld + Location: 43,21 + Owner: USSR + ParadropPoint1: waypoint + Location: 77,40 + Owner: Neutral + ParadropPoint2: waypoint + Location: 83,65 + Owner: Neutral + ParadropPoint3: waypoint + Location: 76,52 + Owner: Neutral + SovietEntry1: waypoint + Location: 37,34 + Owner: Neutral + SovietEntry2: waypoint + Location: 88,21 + Owner: Neutral + SovietRally1: waypoint + Location: 48,38 + Owner: Neutral + SovietRally2: waypoint + Location: 43,51 + Owner: Neutral + SovietRally3: waypoint + Location: 49,65 + Owner: Neutral + SovietRally4: waypoint + Location: 61,80 + Owner: Neutral + SovietRally5: waypoint + Location: 49,74 + Owner: Neutral + SovietRally6: waypoint + Location: 80,85 + Owner: Neutral + SovietRally7: waypoint + Location: 59,32 + Owner: Neutral + SovietRally8: waypoint + Location: 56,34 + Owner: Neutral + SovietRally9: waypoint + Location: 62,48 + Owner: Neutral + SovietRally10: waypoint + Location: 84,30 + Owner: Neutral + SovietRally11: waypoint + Location: 92,42 + Owner: Neutral + SovietRally12: waypoint + Location: 72,66 + Owner: Neutral + SovietRally13: waypoint + Location: 80,77 + Owner: Neutral + USSRBase: waypoint + Location: 50,25 + Owner: Neutral + PlayerBase: waypoint + Location: 88,52 + Owner: Neutral + +Rules: ra|rules/campaign-rules.yaml, ra|rules/campaign-tooltips.yaml, rules.yaml + diff --git a/mods/ra/maps/allies-04/rules.yaml b/mods/ra/maps/allies-04/rules.yaml new file mode 100644 index 0000000000..a24ebc16cb --- /dev/null +++ b/mods/ra/maps/allies-04/rules.yaml @@ -0,0 +1,107 @@ +Player: + PlayerResources: + DefaultCash: 5000 + +World: + LuaScript: + Scripts: allies04.lua, allies04-AI.lua + MissionData: + Briefing: Soviet forces are trying to retake the pass you cleared for our convoys.\n\nDon't let this happen. Hold the pass and prevent the Soviets from taking this vital area.\n\nDestroy all Soviet units and buildings in this region. + BriefingVideo: ally4.vqa + StartVideo: binoc.vqa + WinVideo: oildrum.vqa + LossVideo: bmap.vqa + MapOptions: + TechLevel: medium + ScriptLobbyDropdown@difficulty: + ID: difficulty + Label: Difficulty + Values: + easy: Easy + normal: Normal + hard: Hard + Default: easy + +powerproxy.paratroopers: + ParatroopersPower: + DropItems: E1,E1,E1,E2,E2 + +V2RL: + Buildable: + Prerequisites: ~disabled + +2TNK: + Buildable: + Prerequisites: ~disabled + +3TNK: + Buildable: + Prerequisites: ~vehicles.soviet + +ARTY: + Buildable: + Prerequisites: ~disabled + +MCV: + Buildable: + Prerequisites: ~disabled + +TRUK: + Buildable: + Prerequisites: ~disabled + +SPEN: + Buildable: + Prerequisites: ~disabled + +SYRD: + Buildable: + Prerequisites: ~disabled + +APWR: + Buildable: + Prerequisites: ~disabled + +TSLA: + Buildable: + Prerequisites: ~disabled + +SAM: + Buildable: + Prerequisites: ~disabled + +AGUN: + Buildable: + Prerequisites: ~disabled + +AFLD: + Buildable: + Prerequisites: ~disabled + +HPAD: + Buildable: + Prerequisites: ~disabled + +BRIK: + Buildable: + Prerequisites: ~disabled + +E4: + Buildable: + Prerequisites: ~disabled + +E6: + Buildable: + Prerequisites: ~disabled + +SPY: + Buildable: + Prerequisites: ~disabled + +MECH: + Buildable: + Prerequisites: ~disabled + +HIJACKER: + Buildable: + Prerequisites: ~disabled diff --git a/mods/ra/missions.yaml b/mods/ra/missions.yaml index 0c1ac0c530..a79ad082ac 100644 --- a/mods/ra/missions.yaml +++ b/mods/ra/missions.yaml @@ -3,6 +3,7 @@ Allied Campaign: ./mods/ra/maps/allies-02 ./mods/ra/maps/allies-03a ./mods/ra/maps/allies-03b + ./mods/ra/maps/allies-04 ./mods/ra/maps/allies-05a Soviet Campaign: ./mods/ra/maps/soviet-01