diff --git a/mods/ra/maps/ant-01/ant-01.lua b/mods/ra/maps/ant-01/ant-01.lua new file mode 100644 index 0000000000..48a33ab3d8 --- /dev/null +++ b/mods/ra/maps/ant-01/ant-01.lua @@ -0,0 +1,185 @@ +--[[ + Copyright 2007-2018 The OpenRA Developers (see AUTHORS) + This file is part of OpenRA, which is free software. It is made + available to you under the terms of the GNU General Public License + as published by the Free Software Foundation, either version 3 of + the License, or (at your option) any later version. For more + information, see COPYING. +]] + +--Boolean Vars +baseDiscovered = false +AtEndGame = false + +--Basic Vars +DifficultySetting = Map.LobbyOption("difficulty") +TimerColor = Player.GetPlayer("Spain").Color +InsertionHelicopterType = "tran.insertion" +TimerTicks = DateTime.Minutes(18) -- 18 minutes is roughly 30 mins in the original game +ticks = TimerTicks + +--Table Vars +TankPath = { waypoint12.Location, waypoint13.Location } +InsertionPath = { waypoint12.Location, waypoint0.Location } +AlliedBase = { WarFactory, PillBox1, PillBox2, Refinery, PowerPlant1, PowerPlant2, RepairPad, OreSilo, Barracks, RadarDome } +AlliedForces = { "2tnk" , "2tnk", "mcv" } +ChopperTeam = { "e1r1", "e1r1", "e2", "e2", "e1r1" } + +SendTanks = function() + Media.PlaySpeechNotification(allies, "ReinforcementsArrived") + Reinforcements.Reinforce(allies, AlliedForces, TankPath, DateTime.Seconds(1)) +end + +SendInsertionHelicopter = function() + Media.PlaySpeechNotification(allies, "AlliedReinforcementsSouth") + Reinforcements.ReinforceWithTransport(allies, InsertionHelicopterType, ChopperTeam, InsertionPath, { waypoint4.Location }) +end + +FinishTimer = function() + for i = 0, 9, 1 do + local c = TimerColor + if i % 2 == 0 then + c = HSLColor.White + end + Trigger.AfterDelay(DateTime.Seconds(i), function() UserInterface.SetMissionText("Allied forces have arrived!", c) end) + end + Trigger.AfterDelay(DateTime.Seconds(10), function() UserInterface.SetMissionText("") end) +end + +TimerExpired = function() + allies.MarkCompletedObjective(SurviveObjective) +end + +DiscoveredAlliedBase = function(actor, discoverer) + if (not baseDiscovered and discoverer.Owner == allies) then + baseDiscovered = true + Media.PlaySpeechNotification(allies, "ObjectiveReached") + Utils.Do(AlliedBase, function(building) + building.Owner = allies + end) + + --Need to delay this so we don't fail mission before obj added + Trigger.AfterDelay(DateTime.Seconds(1), function() + SurviveObjective = allies.AddPrimaryObjective("Defend outpost until reinforcements arrive.") + SetupTimeNotifications() + Trigger.OnAllRemovedFromWorld(AlliedBase, function() + allies.MarkFailedObjective(SurviveObjective) + end) + Media.PlaySpeechNotification(allies, "TimerStarted") + Trigger.AfterDelay(DateTime.Seconds(2), function() allies.MarkCompletedObjective(DiscoverObjective) end) + creeps.GetActorsByType("harv")[1].FindResources() + creeps.GetActorsByType("harv")[1].Owner = allies + end) + end +end + +SetupTimeNotifications = function() + Trigger.AfterDelay(DateTime.Minutes(8), function() + Media.PlaySpeechNotification(allies, "TenMinutesRemaining") + end) + Trigger.AfterDelay(DateTime.Minutes(13), function() + Media.PlaySpeechNotification(allies, "WarningFiveMinutesRemaining") + end) + + Trigger.AfterDelay(DateTime.Minutes(14), function() + Media.PlaySpeechNotification(allies, "WarningFourMinutesRemaining") + end) + + Trigger.AfterDelay(DateTime.Minutes(15), function() + Media.PlaySpeechNotification(allies, "WarningThreeMinutesRemaining") + end) + + Trigger.AfterDelay(DateTime.Minutes(16), function() + Media.PlaySpeechNotification(allies, "WarningTwoMinutesRemaining") + end) + + Trigger.AfterDelay(DateTime.Minutes(17), function() + Media.PlaySpeechNotification(allies, "WarningOneMinuteRemaining") + end) + + Trigger.AfterDelay(DateTime.Minutes(17) + DateTime.Seconds(40), function() + Media.PlaySpeechNotification(allies, "AlliedForcesApproaching") + end) +end + +GetTicks = function() + return ticks +end + +Tick = function() + if SurviveObjective ~= nil then + if ticks > 0 then + if ticks == DateTime.Minutes(17) then + StartAntAttack() + elseif ticks == DateTime.Minutes(15) then + if DifficultySetting ~= "hard" then + SendInsertionHelicopter() + end + elseif ticks == DateTime.Minutes(12) then + StartAntAttack() + elseif ticks == DateTime.Minutes(6) then + StartAntAttack() + elseif ticks == DateTime.Minutes(1) then + EndAntAttack() + end + + ticks = ticks - 1; + UserInterface.SetMissionText("Reinforcements arrive in " .. Utils.FormatTime(ticks), TimerColor) + else + if not AtEndGame then + Media.PlaySpeechNotification(allies, "SecondObjectiveMet") + AtEndGame = true + FinishTimer() + Camera.Position = waypoint13.CenterPosition + SendTanks() + Trigger.AfterDelay(DateTime.Seconds(2), function() TimerExpired() end) + end + ticks = ticks - 1 + end + end +end + +InitObjectives = function() + Trigger.OnObjectiveAdded(allies, function(p, id) + Media.DisplayMessage(p.GetObjectiveDescription(id), "New " .. string.lower(p.GetObjectiveType(id)) .. " objective") + end) + + DiscoverObjective = allies.AddPrimaryObjective("Find the outpost.") + + Utils.Do(AlliedBase, function(actor) + Trigger.OnEnteredProximityTrigger(actor.CenterPosition, WDist.FromCells(8), function(discoverer, id) + DiscoveredAlliedBase(actor, discoverer) + end) + end) + + Trigger.AfterDelay(DateTime.Seconds(1), function() + creeps.GetActorsByType("harv")[1].Stop() + end) + + Trigger.OnObjectiveCompleted(allies, function(p, id) + Media.DisplayMessage(p.GetObjectiveDescription(id), "Objective completed") + end) + Trigger.OnObjectiveFailed(allies, function(p, id) + Media.DisplayMessage(p.GetObjectiveDescription(id), "Objective failed") + end) + + Trigger.OnPlayerLost(allies, function() + Media.PlaySpeechNotification(allies, "MissionFailed") + end) + + Trigger.OnPlayerWon(allies, function() + Trigger.AfterDelay(DateTime.Seconds(1), function() Media.PlaySpeechNotification(allies, "MissionAccomplished") end) + end) + + Camera.Position = Ranger.CenterPosition +end + +WorldLoaded = function() + allies = Player.GetPlayer("Spain") + creeps = Player.GetPlayer("Creeps") + InitObjectives() + InitEnemyPlayers() + Trigger.OnKilled(MoneyDerrick, function() + Actor.Create("moneycrate", true, { Owner = allies, Location = MoneyDerrick.Location + CVec.New(1,0) }) + end) +end diff --git a/mods/ra/maps/ant-01/ant-attack.lua b/mods/ra/maps/ant-01/ant-attack.lua new file mode 100644 index 0000000000..2829fdac55 --- /dev/null +++ b/mods/ra/maps/ant-01/ant-attack.lua @@ -0,0 +1,89 @@ +DifficultySetting = Map.LobbyOption("difficulty") +timeTracker = 0 +amount = 1 +SendAnts = true + +AttackAngles = { + { waypoint4.Location, waypoint18.Location, waypoint5.Location, waypoint15.Location }, + { waypoint20.Location, waypoint10.Location, waypoint2.Location }, + { waypoint17.Location, waypoint1.Location }, + { waypoint8.Location, waypoint9.Location, waypoint19.Location } +} + +AttackInterval = { + easy = DateTime.Seconds(40), + normal = DateTime.Seconds(30), + hard = DateTime.Seconds(20) +} + +AntTypes = { + "scoutant", + "fireant" +} + +MaxAnts = { + easy = 3, + normal = 5, + hard = 7 +} + +MaxFireAnts = { + easy = 2, + normal = 3, + hard = 4 +} + +StartAntAttack = function() + local path = Utils.Random(AttackAngles) + local antType = "scoutant" + local index = 0 + local amount = 1 + local timeTracker = GetTicks() + + if timeTracker > DateTime.Minutes(6) then + antType = Utils.Random(AntTypes) + end + + if antType == "warriorant" and DifficultySetting == "easy" then + antType = "scoutant" + end + + if DifficultySetting == "normal" and timeTracker < DateTime.Minutes(6) and antType == "scoutant" then + antType = "warriorant" + elseif DifficultySetting == "hard" and timeTracker < DateTime.Minutes(12) and antType == "scoutant" then + antType = "warriorant" + end + + local max = MaxAnts[DifficultySetting] - math.ceil(timeTracker / DateTime.Minutes(6)) + if timeTracker > DateTime.Minutes(3) and antType == "fireant" then + amount = Utils.RandomInteger(1, MaxFireAnts[DifficultySetting]) + elseif timeTracker > 15 and antType == "fireant" then + antType = "scoutant" + else + amount = Utils.RandomInteger(1, max) + end + + for i = 0,amount,1 do + Reinforcements.Reinforce(AntMan, { antType }, path, DateTime.Seconds(5), function(actor) + actor.AttackMove(CPos.New(65, 65)) + Trigger.OnIdle(actor, function() + actor.Hunt() + end) + end) + end + + -- Setup next wave + if SendAnts then + Trigger.AfterDelay(AttackInterval[DifficultySetting], function() + StartAntAttack() + end) + end +end + +EndAntAttack = function() + SendAnts = false +end + +InitEnemyPlayers = function() + AntMan = Player.GetPlayer("AntMan") +end diff --git a/mods/ra/maps/ant-01/map.bin b/mods/ra/maps/ant-01/map.bin new file mode 100644 index 0000000000..651503aa51 Binary files /dev/null and b/mods/ra/maps/ant-01/map.bin differ diff --git a/mods/ra/maps/ant-01/map.png b/mods/ra/maps/ant-01/map.png new file mode 100644 index 0000000000..7d97b5c826 Binary files /dev/null and b/mods/ra/maps/ant-01/map.png differ diff --git a/mods/ra/maps/ant-01/map.yaml b/mods/ra/maps/ant-01/map.yaml new file mode 100644 index 0000000000..b3019b51ad --- /dev/null +++ b/mods/ra/maps/ant-01/map.yaml @@ -0,0 +1,597 @@ +MapFormat: 11 + +RequiresMod: ra + +Title: 01: Discovery + +Author: Westwood Studios + +Tileset: TEMPERAT + +MapSize: 128,128 + +Bounds: 40,40,50,50 + +Visibility: MissionSelector + +Categories: Campaign + +LockPreview: True + +Players: + PlayerReference@Neutral: + Name: Neutral + OwnsWorld: True + NonCombatant: True + Faction: allies + PlayerReference@Creeps: + Name: Creeps + NonCombatant: True + Faction: england + Enemies: AntMan + Allies: Neutral + PlayerReference@Spain: + Name: Spain + Playable: True + AllowBots: False + Required: True + LockFaction: True + Faction: allies + LockColor: True + LockSpawn: True + LockTeam: True + Enemies: AntMan + Color: F6D679 + PlayerReference@AntMan: + Name: AntMan + Faciton: soviet + Enemies: Spain, Creeps + +Actors: + Actor0: brik + Location: 57,58 + Owner: Neutral + Actor1: brik + Location: 58,58 + Owner: Neutral + Actor2: brik + Location: 59,58 + Owner: Neutral + Actor3: brik + Location: 60,58 + Owner: Neutral + Actor4: brik + Location: 61,58 + Owner: Neutral + Actor5: brik + Location: 62,58 + Owner: Neutral + Actor6: brik + Location: 63,58 + Owner: Neutral + Actor7: brik + Location: 67,58 + Owner: Neutral + Actor8: brik + Location: 68,58 + Owner: Neutral + Actor9: brik + Location: 69,58 + Owner: Neutral + Actor10: brik + Location: 70,58 + Owner: Neutral + Actor11: brik + Location: 71,58 + Owner: Neutral + Actor12: brik + Location: 72,58 + Owner: Neutral + Actor13: brik + Location: 57,59 + Owner: Neutral + Actor14: brik + Location: 62,59 + Owner: Neutral + Actor15: brik + Location: 63,59 + Owner: Neutral + Actor16: brik + Location: 67,59 + Owner: Neutral + Actor17: brik + Location: 68,59 + Owner: Neutral + Actor18: brik + Location: 57,60 + Owner: Neutral + Actor19: brik + Location: 57,61 + Owner: Neutral + Actor20: brik + Location: 74,61 + Owner: Neutral + Actor21: brik + Location: 57,62 + Owner: Neutral + Actor22: brik + Location: 58,62 + Owner: Neutral + Actor23: brik + Location: 73,62 + Owner: Neutral + Actor24: brik + Location: 74,62 + Owner: Neutral + Actor25: brik + Location: 57,63 + Owner: Neutral + Actor26: brik + Location: 58,63 + Owner: Neutral + Actor27: brik + Location: 73,63 + Owner: Neutral + Actor28: brik + Location: 74,63 + Owner: Neutral + Actor29: brik + Location: 57,67 + Owner: Neutral + Actor30: brik + Location: 58,67 + Owner: Neutral + Actor31: brik + Location: 73,67 + Owner: Neutral + Actor32: brik + Location: 74,67 + Owner: Neutral + Actor33: brik + Location: 57,68 + Owner: Neutral + Actor34: brik + Location: 58,68 + Owner: Neutral + Actor35: brik + Location: 73,68 + Owner: Neutral + Actor36: brik + Location: 74,68 + Owner: Neutral + Actor37: brik + Location: 57,69 + Owner: Neutral + Actor38: brik + Location: 74,69 + Owner: Neutral + Actor39: brik + Location: 57,70 + Owner: Neutral + Actor40: brik + Location: 74,70 + Owner: Neutral + Actor41: brik + Location: 57,71 + Owner: Neutral + Actor42: brik + Location: 62,71 + Owner: Neutral + Actor43: brik + Location: 63,71 + Owner: Neutral + Actor44: brik + Location: 67,71 + Owner: Neutral + Actor45: brik + Location: 68,71 + Owner: Neutral + Actor46: brik + Location: 74,71 + Owner: Neutral + Actor47: brik + Location: 57,72 + Owner: Neutral + Actor48: brik + Location: 58,72 + Owner: Neutral + Actor49: brik + Location: 59,72 + Owner: Neutral + Actor50: brik + Location: 60,72 + Owner: Neutral + Actor51: brik + Location: 61,72 + Owner: Neutral + Actor52: brik + Location: 62,72 + Owner: Neutral + Actor53: brik + Location: 63,72 + Owner: Neutral + Actor54: brik + Location: 67,72 + Owner: Neutral + Actor55: brik + Location: 68,72 + Owner: Neutral + Actor56: brik + Location: 69,72 + Owner: Neutral + Actor57: brik + Location: 74,72 + Owner: Neutral + Actor58: v15 + Location: 57,78 + Owner: Neutral + Actor59: v16 + Location: 58,79 + Owner: Neutral + Actor60: tc01 + Location: 70,58 + Owner: Neutral + Actor61: tc02 + Location: 77,70 + Owner: Neutral + Actor62: tc02 + Location: 47,88 + Owner: Neutral + Actor63: tc03 + Location: 53,69 + Owner: Neutral + Actor64: t15 + Location: 54,74 + Owner: Neutral + Actor65: t14 + Location: 81,75 + Owner: Neutral + Actor66: t01 + Location: 78,77 + Owner: Neutral + Actor67: tc04 + Location: 52,88 + Owner: Neutral + Actor68: tc01 + Location: 64,88 + Owner: Neutral + Actor69: tc03 + Location: 44,61 + Owner: Neutral + Actor70: tc02 + Location: 43,64 + Owner: Neutral + Actor71: tc01 + Location: 54,54 + Owner: Neutral + Actor72: tc02 + Location: 86,86 + Owner: Neutral + Actor73: tc02 + Location: 57,49 + Owner: Neutral + Actor74: tc04 + Location: 61,72 + Owner: Neutral + Actor75: t11 + Location: 50,51 + Owner: Neutral + Actor76: t07 + Location: 54,48 + Owner: Neutral + Actor77: tc05 + Location: 55,39 + Owner: Neutral + Actor78: tc04 + Location: 53,40 + Owner: Neutral + Actor79: tc01 + Location: 61,47 + Owner: Neutral + Actor80: t07 + Location: 40,80 + Owner: Neutral + Actor81: tc04 + Location: 69,88 + Owner: Neutral + Actor82: t10 + Location: 75,55 + Owner: Neutral + Actor83: t08 + Location: 63,78 + Owner: Neutral + Actor84: tc04 + Location: 82,46 + Owner: Neutral + Actor85: tc05 + Location: 81,48 + Owner: Neutral + Actor86: tc03 + Location: 89,49 + Owner: Neutral + Actor87: tc03 + Location: 83,45 + Owner: Neutral + Actor88: tc04 + Location: 64,41 + Owner: Neutral + Actor89: tc03 + Location: 65,40 + Owner: Neutral + Actor90: tc01 + Location: 50,55 + Owner: Neutral + Actor91: tc03 + Location: 76,45 + Owner: Neutral + Actor92: tc02 + Location: 71,43 + Owner: Neutral + Actor93: tc03 + Location: 87,67 + Owner: Neutral + Actor94: tc01 + Location: 82,39 + Owner: Neutral + Actor95: t01 + Location: 89,53 + Owner: Neutral + Actor96: tc05 + Location: 77,56 + Owner: Neutral + Actor97: t06 + Location: 78,60 + Owner: Neutral + Actor98: t12 + Location: 87,62 + Owner: Neutral + WarFactory: weap + Location: 62,62 + Owner: Creeps + Health: 39 + PillBox1: hbox + Location: 65,60 + Owner: Creeps + Health: 35 + PillBox2: hbox + Location: 72,65 + Owner: Creeps + Health: 37 + Refinery: proc + Location: 59,67 + Owner: Creeps + Health: 43 + PowerPlant1: powr + Location: 58,59 + Owner: Creeps + Health: 12 + PowerPlant2: powr + Location: 68,67 + Owner: Creeps + Health: 37 + RepairPad: fix + Location: 71,69 + Owner: Creeps + Health: 14 + OreSilo: silo + Location: 61,60 + Owner: Creeps + Health: 12 + Barracks: tent + Location: 68,61 + Owner: Creeps + Health: 31 + Actor108: v01 + Location: 55,79 + Owner: Neutral + Health: 12 + Actor109: v02 + Location: 51,81 + Owner: Neutral + Health: 22 + Actor110: v03 + Location: 58,82 + Owner: Neutral + Health: 28 + Actor111: v06 + Location: 53,86 + Owner: Neutral + Health: 20 + Actor112: v08 + Location: 48,77 + Owner: Neutral + Health: 12 + Actor113: v09 + Location: 47,70 + Owner: Neutral + Health: 14 + Actor114: v10 + Location: 62,86 + Owner: Neutral + Health: 14 + Actor115: v11 + Location: 53,78 + Owner: Neutral + Health: 12 + Actor116: v11 + Location: 43,78 + Owner: Neutral + Health: 25 + Actor117: v19 + Location: 55,49 + Owner: Neutral + Actor118: v19 + Location: 54,51 + Owner: Neutral + Actor119: brl3 + Location: 56,49 + Owner: AntMan + Actor120: barl + Location: 56,50 + Owner: AntMan + Actor121: brl3 + Location: 55,50 + Owner: AntMan + Actor122: barl + Location: 55,51 + Owner: AntMan + Actor123: brl3 + Location: 55,52 + Owner: AntMan + Actor124: barl + Location: 53,52 + Owner: AntMan + Actor125: brl3 + Location: 53,51 + Owner: AntMan + Actor126: barl + Location: 54,50 + Owner: AntMan + Actor127: v10 + Location: 50,74 + Owner: Neutral + Health: 12 + Actor128: v02 + Location: 46,66 + Owner: Neutral + Health: 22 + RadarDome: dome + Location: 71,60 + Owner: Creeps + Health: 12 + Actor130: v19 + Location: 77,47 + Owner: Neutral + Actor131: v19 + Location: 73,52 + Owner: Neutral + Actor132: brl3 + Location: 74,52 + Owner: AntMan + Actor133: barl + Location: 73,53 + Owner: AntMan + Actor134: brl3 + Location: 76,48 + Owner: AntMan + Actor135: barl + Location: 76,47 + Owner: AntMan + Actor136: barl + Location: 75,51 + Owner: AntMan + Actor137: barl + Location: 75,48 + Owner: AntMan + MoneyDerrick: v19 + Location: 63,76 + Owner: Neutral + Actor139: brl3 + Location: 63,75 + Owner: AntMan + Actor140: barl + Location: 62,74 + Owner: AntMan + Actor141: brl3 + Location: 64,76 + Owner: AntMan + Actor142: barl + Location: 65,76 + Owner: AntMan + Ranger: jeep + Location: 43,87 + Owner: Spain + Facing: 223 + Steve: e1 + Location: 43,86 + Owner: Spain + SubCell: 0 + Daniel: e1 + Location: 44,87 + Owner: Spain + SubCell: 2 + Phillip: e1 + Location: 42,87 + Owner: Spain + SubCell: 2 + Johnathan: e1 + Location: 43,88 + Owner: Spain + SubCell: 2 + waypoint0: waypoint + Location: 65,65 + Owner: Neutral + waypoint1: waypoint + Location: 50,64 + Owner: Neutral + waypoint2: waypoint + Location: 82,65 + Owner: Neutral + waypoint3: waypoint + Location: 86,54 + Owner: Neutral + waypoint4: waypoint + Location: 89,40 + Owner: Neutral + waypoint5: waypoint + Location: 69,46 + Owner: Neutral + waypoint6: waypoint + Location: 55,44 + Owner: Neutral + waypoint7: waypoint + Location: 48,40 + Owner: Neutral + waypoint8: waypoint + Location: 77,89 + Owner: Neutral + waypoint9: waypoint + Location: 75,80 + Owner: Neutral + waypoint10: waypoint + Location: 84,79 + Owner: Neutral + waypoint11: waypoint + Location: 45,84 + Owner: Neutral + waypoint12: waypoint + Location: 41,89 + Owner: Neutral + waypoint13: waypoint + Location: 45,75 + Owner: Neutral + waypoint14: waypoint + Location: 65,84 + Owner: Neutral + waypoint15: waypoint + Location: 66,51 + Owner: Neutral + waypoint16: waypoint + Location: 46,55 + Owner: Neutral + waypoint17: waypoint + Location: 48,45 + Owner: Neutral + waypoint18: waypoint + Location: 85,43 + Owner: Neutral + waypoint19: waypoint + Location: 65,75 + Owner: Neutral + waypoint20: waypoint + Location: 89,75 + Owner: Neutral + waypoint21: waypoint + Location: 89,80 + Owner: Neutral + waypoint26: waypoint + Location: 76,56 + Owner: Neutral + waypoint27: waypoint + Location: 54,80 + Owner: Neutral + DefaultCameraPosition: waypoint + Location: 43,87 + Owner: Neutral + +Rules: ra|rules/campaign-rules.yaml, ra|rules/campaign-tooltips.yaml, rules.yaml, ra|rules/campaign-palettes.yaml diff --git a/mods/ra/maps/ant-01/rules.yaml b/mods/ra/maps/ant-01/rules.yaml new file mode 100644 index 0000000000..fb38b2468c --- /dev/null +++ b/mods/ra/maps/ant-01/rules.yaml @@ -0,0 +1,134 @@ +Player: + PlayerResources: + DefaultCash: 1500 +World: + ScriptLobbyDropdown@difficulty: + ID: difficulty + Label: Difficulty + Values: + easy: Easy + normal: Normal + hard: Hard + Default: easy + LuaScript: + Scripts: ant-01.lua, ant-attack.lua + MissionData: + BackgroundVideo: antintro.vqa + Briefing: We've lost contact with one of our outposts. Before it went off-line, we recieved a brief communique about giant ants. We're unsure what to make of this report, so we want you to investigate. \n\nScout the area, bring the outpost back on-line, and report your findings. If there is a threat, reinforcements will be sent in to help you. \n\nKeep the base functional and radio contact open -- we don't want to lose the outpost again. + +^Palettes: + IndexedPlayerPalette@scoutant: + BaseName: scoutant + BasePalette: player + RemapIndex: 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95 + PlayerIndex: + AntMan: 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 123, 123, 123, 123 + AllowModifiers: True + IndexedPlayerPalette@warriorant: + BaseName: warriorant + BasePalette: player + RemapIndex: 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95 + PlayerIndex: + AntMan: 229, 230, 231, 232, 233, 234, 235, 8, 236, 237, 238, 239, 221, 222, 223, 223 + AllowModifiers: True + IndexedPlayerPalette@fireant: + BaseName: fireant + BasePalette: player + RemapIndex: 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95 + PlayerIndex: + AntMan: 158, 158, 159, 159, 229, 229, 216, 216, 217, 217, 218, 218, 221, 222, 223, 223 + AllowModifiers: True + +WarriorAnt: + RenderSprites: + PlayerPalette: warriorant + +ScoutAnt: + RenderSprites: + PlayerPalette: scoutant + +FireAnt: + RenderSprites: + PlayerPalette: fireant + +SPY: + Buildable: + Prerequisites: ~disabled + +SPY.England: + Buildable: + Prerequisites: ~disabled + +MECH: + Buildable: + Prerequisites: ~disabled + +MRJ: + Buildable: + Prerequisites: ~disabled + +APC: + Buildable: + Prerequisites: ~disabled + +STNK: + Buildable: + Prerequisites: ~disabled + +TRUK: + Buildable: + Prerequisites: ~disabled + +SPY: + Buildable: + Prerequisites: ~disabled + +SNIPER: + Buildable: + Prerequisites: ~disabled + +MGG: + Buildable: + Prerequisites: ~disabled + +1TNK: + Buildable: + Prerequisites: ~disabled + +2TNK: + Buildable: + Prerequisites: ~disabled + +E3: + Buildable: + Prerequisites: ~disabled + +E2: + Buildable: + Prerequisites: ~tent + +E7: + Buildable: + Prerequisites: ~disabled + +ARTY: + Buildable: + Prerequisites: ~disabled + +MCV: + Buildable: + Prerequisites: ~disabled + +TRAN.Insertion: + Inherits: TRAN + WithFacingSpriteBody: + RenderSprites: + Image: tran + Interactable: + -Selectable: + +MONEYCRATE: + GiveCashCrateAction: + Amount: 2000 + SelectionShares: 1 + UseCashTick: true diff --git a/mods/ra/missions.yaml b/mods/ra/missions.yaml index 6fdbf48534..645baee65e 100644 --- a/mods/ra/missions.yaml +++ b/mods/ra/missions.yaml @@ -33,3 +33,5 @@ OpenRA Originals: ./mods/ra/maps/intervention ./mods/ra/maps/survival01 ./mods/ra/maps/survival02 +Ant Missions: + ./mods/ra/maps/ant-01 diff --git a/mods/ra/rules/infantry.yaml b/mods/ra/rules/infantry.yaml index 5f233cf61b..13c1992360 100644 --- a/mods/ra/rules/infantry.yaml +++ b/mods/ra/rules/infantry.yaml @@ -752,3 +752,52 @@ Ant: HitShape: Type: Circle Radius: 469 + +FireAnt: + Inherits: Ant + Tooltip: + Name: Fire Ant + GenericVisibility: none + Mobile: + Speed: 80 + Armament: + Weapon: AntFireball + Health: + HP: 7500 + Armor: + Type: Heavy + Buildable: + Prerequisites: ~disabled + +ScoutAnt: + Inherits: Ant + Tooltip: + Name: Scout Ant + GenericVisibility: none + Health: + HP: 8500 + Armor: + Type: Light + AutoTarget: + ScanRadius: 7 + Buildable: + Prerequisites: ~disabled + +WarriorAnt: + Inherits: Ant + Tooltip: + Name: Warrior Ant + GenericVisibility: none + Mobile: + Speed: 65 + Health: + HP: 12500 + Armor: + Type: Heavy + Armament: + Weapon: MandibleHeavy + Buildable: + Prerequisites: ~disabled + RenderSprites: + Image: Ant + diff --git a/mods/ra/sequences/infantry.yaml b/mods/ra/sequences/infantry.yaml index 299200d4fc..32ff3ca637 100644 --- a/mods/ra/sequences/infantry.yaml +++ b/mods/ra/sequences/infantry.yaml @@ -1321,3 +1321,53 @@ ant: Tick: 400 ZOffset: -511 icon: anticon + +fireant: + stand: ant2 + Facings: 8 + stand2: ant2 + Start: 8 + Length: 8 + run: ant2 + Start: 8 + Length: 8 + Facings: 8 + bite: ant2 + Start: 72 + Length: 4 + Facings: 8 + die: ant2 + Start: 104 + Length: 8 + Tick: 300 + die-crushed: ant2 + Start: 104 + Length: 8 + Tick: 400 + ZOffset: -511 + icon: anticon + +scoutant: + stand: ant3 + Facings: 8 + stand2: ant3 + Start: 8 + Length: 8 + run: ant3 + Start: 8 + Length: 8 + Facings: 8 + bite: ant3 + Start: 72 + Length: 4 + Facings: 8 + die: ant3 + Start: 104 + Length: 8 + Tick: 300 + die-crushed: ant3 + Start: 104 + Length: 8 + Tick: 400 + ZOffset: -511 + icon: anticon diff --git a/mods/ra/weapons/other.yaml b/mods/ra/weapons/other.yaml index 07d05d83a7..db1a377852 100644 --- a/mods/ra/weapons/other.yaml +++ b/mods/ra/weapons/other.yaml @@ -165,12 +165,49 @@ Claw: Mandible: Inherits: Claw ReloadDelay: 10 + Burst: 2 + BurstDelays: 14 + StartBurstReport: antbite.aud Warhead@1Dam: SpreadDamage Damage: 6000 Versus: None: 90 DamageTypes: Prone50Percent, TriggerProne, BulletDeath +MandibleHeavy: + Inherits: Claw + ReloadDelay: 15 + Burst: 2 + BurstDelays: 20 + StartBurstReport: antbite.aud + Warhead@1Dam: SpreadDamage + Damage: 10000 + Versus: + None: 100 + Light: 90 + Heavy: 35 + Concrete: 20 + DamageTypes: Prone50Percent, TriggerProne, BulletDeath + +AntFireball: + Inherits: FireballLauncher + Report: antbite.aud + ReloadDelay: 50 + Burst: 2 + BurstDelays: 20 + Range: 4c0 + Projectile: Bullet + Speed: 200 + Warhead@1Dam: SpreadDamage + Spread: 213 + Damage: 4000 + Versus: + None: 80 + Wood: 85 + Light: 45 + Heavy: 20 + Concrete: 15 + MADTankThump: InvalidTargets: MADTank, Infantry Warhead@1Dam: HealthPercentageDamage