Initial commit: OpenRA game engine
Some checks failed
Continuous Integration / Linux (.NET 8.0) (push) Has been cancelled
Continuous Integration / Windows (.NET 8.0) (push) Has been cancelled

Fork from OpenRA/OpenRA with one-click launch script (start-ra.cmd)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
let5sne.win10
2026-01-10 21:46:54 +08:00
commit 9cf6ebb986
4065 changed files with 635973 additions and 0 deletions

View File

@@ -0,0 +1,277 @@
--[[
Copyright (c) The OpenRA Developers and Contributors
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.
]]
IdlingUnits = { }
AttackGroupSize = 6
Barracks = { Barracks2, Barracks3 }
Rallypoints = { VehicleRallypoint1, VehicleRallypoint2, VehicleRallypoint3, VehicleRallypoint4, VehicleRallypoint5 }
WaterLZs = { WaterLZ1, WaterLZ2 }
Airfields = { Airfield1, Airfield2 }
Yaks = { }
SovietInfantryTypes = { "e1", "e1", "e2", "e4" }
SovietVehicleTypes = { "3tnk", "3tnk", "3tnk", "v2rl", "v2rl", "apc" }
SovietAircraftType = { "yak" }
HoldProduction = true
BuildVehicles = true
TrainInfantry = true
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 = { }
if SendWaterTransports and Utils.RandomInteger(0,2) == 1 then
units = WaterAttack()
Utils.Do(units, function(unit)
Trigger.OnAddedToWorld(unit, function()
Trigger.OnIdle(unit, unit.Hunt)
end)
end)
Trigger.AfterDelay(DateTime.Seconds(20), function()
Attacking = false
HoldProduction = false
end)
else
units = SetupAttackGroup()
Utils.Do(units, function(unit)
IdleHunt(unit)
end)
Trigger.AfterDelay(DateTime.Minutes(1), function() Attacking = false end)
Trigger.AfterDelay(DateTime.Minutes(2), function() HoldProduction = false end)
end
end
WaterAttack = function()
local types = { }
for i = 1, 5, 1 do
types[i] = Utils.Random(SovietInfantryTypes)
end
return Reinforcements.ReinforceWithTransport(USSR, InsertionTransport, types, { WaterTransportSpawn.Location, Utils.Random(WaterLZs).Location }, { WaterTransportSpawn.Location })[2]
end
ProtectHarvester = function(unit)
Trigger.OnDamaged(unit, function(self, attacker)
-- TODO: Send the Harvester to the service depo
if AttackOnGoing then
return
end
AttackOnGoing = true
local Guards = SetupAttackGroup()
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)
Trigger.OnKilled(unit, function() HarvesterKilled = true end)
end
InitAIUnits = function()
IdlingUnits = Utils.Where(Map.ActorsInWorld, function(self) return self.Owner == USSR and self.HasProperty("Hunt") and self.Location.Y > MainBaseTopLeft.Location.Y end)
local buildings = Utils.Where(Map.ActorsInWorld, function(self) return self.Owner == USSR and self.HasProperty("StartBuildingRepairs") end)
Utils.Do(buildings, function(actor)
Trigger.OnDamaged(actor, function(building)
if building.Owner == USSR and building.Health < building.MaxHealth * 3/4 then
building.StartBuildingRepairs()
end
end)
end)
end
InitAIEconomy = function()
USSR.Cash = 6000
if not Harvester.IsDead then
Harvester.FindResources()
ProtectHarvester(Harvester)
end
end
InitProductionBuildings = function()
if not Warfactory2.IsDead then
Warfactory2.IsPrimaryBuilding = true
Trigger.OnKilled(Warfactory2, function() BuildVehicles = false end)
else
BuildVehicles = false
end
if not Barracks2.IsDead then
Barracks2.IsPrimaryBuilding = true
Trigger.OnKilled(Barracks2, function()
if not Barracks3.IsDead then
Barracks3.IsPrimaryBuilding = true
else
TrainInfantry = false
end
end)
elseif not Barracks3.IsDead then
Barracks3.IsPrimaryBuilding = true
else
TrainInfantry = false
end
if not Barracks3.IsDead then
Trigger.OnKilled(Barracks3, function()
if Barracks2.IsDead then
TrainInfantry = false
end
end)
end
if Difficulty ~= "easy" then
if not Airfield1.IsDead then
Trigger.OnKilled(Airfield1, function()
if Airfield2.IsDead then
AirAttacks = false
else
Airfield2.IsPrimaryBuilding = true
Trigger.OnKilled(Airfield2, function() AirAttacks = false end)
end
end)
Airfield1.IsPrimaryBuilding = true
AirAttacks = true
elseif not Airfield2.IsDead then
Trigger.OnKilled(Airfield2, function() AirAttacks = false end)
Airfield2.IsPrimaryBuilding = true
AirAttacks = true
end
end
end
ProduceInfantry = function()
if not TrainInfantry then
return
end
if HoldProduction then
Trigger.AfterDelay(DateTime.Minutes(1), ProduceInfantry)
return
end
local delay = Utils.RandomInteger(DateTime.Seconds(3), DateTime.Seconds(9))
local toBuild = { Utils.Random(SovietInfantryTypes) }
USSR.Build(toBuild, function(unit)
IdlingUnits[#IdlingUnits + 1] = unit[1]
Trigger.AfterDelay(delay, ProduceInfantry)
if #IdlingUnits >= (AttackGroupSize * 2.5) then
SendAttack()
end
end)
end
ProduceVehicles = function()
if not BuildVehicles then
return
end
if HoldProduction then
Trigger.AfterDelay(DateTime.Minutes(1), ProduceVehicles)
return
end
local delay = Utils.RandomInteger(DateTime.Seconds(5), DateTime.Seconds(9))
if HarvesterKilled then
HarvesterKilled = false
USSR.Build({ "harv" }, function(harv)
harv[1].FindResources()
ProtectHarvester(harv[1])
Trigger.AfterDelay(delay, ProduceVehicles)
end)
return
end
Warfactory2.RallyPoint = Utils.Random(Rallypoints).Location
local toBuild = { Utils.Random(SovietVehicleTypes) }
USSR.Build(toBuild, function(unit)
IdlingUnits[#IdlingUnits + 1] = unit[1]
Trigger.AfterDelay(delay, ProduceVehicles)
if #IdlingUnits >= (AttackGroupSize * 2.5) then
SendAttack()
end
end)
end
ProduceAircraft = function()
if not AirAttacks then
return
end
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
InitializeAttackAircraft(yak, Greece)
end)
end
ActivateAI = function()
InitAIUnits()
InitAIEconomy()
InitProductionBuildings()
Trigger.AfterDelay(DateTime.Minutes(5), function()
ProduceInfantry()
ProduceVehicles()
if AirAttacks then
Trigger.AfterDelay(DateTime.Minutes(3), ProduceAircraft)
end
end)
end

View File

@@ -0,0 +1,391 @@
--[[
Copyright (c) The OpenRA Developers and Contributors
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.
]]
if Difficulty == "easy" then
TanyaType = "e7"
ReinforceCash = 5000
HoldAITime = DateTime.Minutes(3)
SpecialCameras = true
elseif Difficulty == "normal" then
TanyaType = "e7.noautotarget"
ReinforceCash = 2250
HoldAITime = DateTime.Minutes(2)
SpecialCameras = true
else
TanyaType = "e7.noautotarget"
ReinforceCash = 1500
HoldAITime = DateTime.Minutes(1) + DateTime.Seconds(30)
SendWaterTransports = true
end
SpyType = { "spy" }
SpyEntryPath = { SpyEntry.Location, SpyLoadout.Location }
InsertionTransport = "lst.in"
ExtractionTransport = "lst"
TrukPath = { TrukWaypoint1, TrukWaypoint2, TrukWaypoint3, TrukWaypoint4, TrukWaypoint5, TrukWaypoint6 }
ExtractionHeliType = "tran"
InsertionHeliType = "tran.in"
ExtractionPath = { ExtractionEntry.Location, ExtractionLZ.Location }
HeliReinforcements = { "medi", "mech", "mech" }
GreeceReinforcements =
{
{ types = { "2tnk", "2tnk", "2tnk", "arty", "arty" }, entry = { SpyEntry.Location, SpyLoadout.Location } },
{ types = { "e3", "e3", "e3", "e6", "e6" }, entry = { SpyEntry.Location, GreeceLoadout1.Location } },
{ types = { "jeep", "jeep", "e1", "e1", "2tnk" }, entry = { SpyEntry.Location, GreeceLoadout2.Location } }
}
DogPatrol = { Dog1, Dog2 }
PatrolA = { PatrolA1, PatrolA2, PatrolA3, PatrolA4, PatrolA5 }
PatrolB = { PatrolB1, PatrolB2, PatrolB3 }
DogPatrolPath = { DogPatrolRally1.Location, DogPatrolRally2.Location, DogPatrolRally3.Location }
PatrolAPath = { PatrolRally.Location, PatrolARally1.Location, PatrolARally2.Location, PatrolARally3.Location }
PatrolBPath = { PatrolBRally1.Location, PatrolBRally2.Location, PatrolBRally3.Location, PatrolRally.Location }
TanyaVoices = { "tuffguy", "bombit", "laugh", "gotit", "lefty", "keepem" }
SpyVoice = "sking"
SamSites = { Sam1, Sam2, Sam3, Sam4 }
GroupPatrol = function(units, waypoints, delay)
local i = 1
local stop = false
Utils.Do(units, function(unit)
Trigger.OnIdle(unit, function()
if stop then
return
end
if unit.Location == waypoints[i] then
local bool = Utils.All(units, function(actor) return actor.IsIdle end)
if bool then
stop = true
i = i + 1
if i > #waypoints then
i = 1
end
Trigger.AfterDelay(delay, function() stop = false end)
end
else
unit.AttackMove(waypoints[i])
end
end)
end)
end
Tick = function()
if FollowTruk and not Truk.IsDead then
Camera.Position = Truk.CenterPosition
end
if USSR.HasNoRequiredUnits() then
if not Greece.IsObjectiveCompleted(KillAll) and Difficulty == "tough" then
SendWaterExtraction()
end
Greece.MarkCompletedObjective(KillAll)
end
if GreeceReinforcementsArrived and Greece.HasNoRequiredUnits() then
USSR.MarkCompletedObjective(USSRobjective)
end
if USSR.Resources >= USSR.ResourceCapacity * 0.75 then
USSR.Cash = USSR.Cash + USSR.Resources - USSR.ResourceCapacity * 0.25
USSR.Resources = USSR.ResourceCapacity * 0.25
end
end
SendReinforcements = function()
GreeceReinforcementsArrived = true
Camera.Position = ReinforceCamera.CenterPosition
Greece.Cash = Greece.Cash + ReinforceCash
Utils.Do(GreeceReinforcements, function(reinforcements)
Reinforcements.ReinforceWithTransport(Greece, InsertionTransport, reinforcements.types, reinforcements.entry, { SpyEntry.Location })
end)
Media.PlaySpeechNotification(Greece, "AlliedReinforcementsArrived")
ActivateAI()
end
ExtractUnits = function(extractionUnit, pos, after)
if extractionUnit.IsDead or not extractionUnit.HasPassengers then
return
end
extractionUnit.Move(pos)
extractionUnit.Destroy()
Trigger.OnRemovedFromWorld(extractionUnit, after)
end
SendWaterExtraction = function()
local flare = Actor.Create("flare", true, { Owner = Greece, Location = SpyEntryPath[2] + CVec.New(2, 0) })
Trigger.AfterDelay(DateTime.Seconds(5), flare.Destroy)
Media.PlaySpeechNotification(Greece, "SignalFlareNorth")
Camera.Position = flare.CenterPosition
WaterExtractionTran = Reinforcements.ReinforceWithTransport(Greece, ExtractionTransport, nil, SpyEntryPath)[1]
ExtractObjective = AddPrimaryObjective(Greece, "extract-transport")
Trigger.OnKilled(WaterExtractionTran, function() USSR.MarkCompletedObjective(USSRobjective) end)
Trigger.OnAllRemovedFromWorld(Greece.GetGroundAttackers(), function()
ExtractUnits(WaterExtractionTran, SpyEntryPath[1], function()
Greece.MarkCompletedObjective(ExtractObjective)
Greece.MarkCompletedObjective(TanyaSurviveObjective)
end)
end)
end
WarfactoryInfiltrated = function()
FollowTruk = true
Truk.GrantCondition("hijacked")
Truk.Wait(DateTime.Seconds(1))
Utils.Do(TrukPath, function(waypoint)
Truk.Move(waypoint.Location)
end)
if SpecialCameras then
Trigger.AfterDelay(DateTime.Seconds(2), function()
SpyCameraA.Destroy()
SpyCameraB.Destroy()
end)
end
end
MissInfiltrated = function()
for i = 0, 5, 1 do
local sound = Utils.Random(TanyaVoices)
Trigger.AfterDelay(DateTime.Seconds(i), function()
Media.PlaySoundNotification(Greece, sound)
end)
end
Prison.Attack(Prison)
Trigger.AfterDelay(DateTime.Seconds(6), FreeTanya)
end
FreeTanya = function()
Prison.Stop()
Tanya = Actor.Create(TanyaType, true, { Owner = Greece, Location = Prison.Location + CVec.New(1, 1) })
Tanya.Demolish(Prison)
Tanya.Move(Tanya.Location + CVec.New(Utils.RandomInteger(-1, 2), 1))
if TanyaType == "e7.noautotarget" then
Trigger.AfterDelay(DateTime.Seconds(1), function()
Media.DisplayMessage(UserInterface.GetFluentMessage("tanya-rules-of-engagement"), UserInterface.GetFluentMessage("tanya"))
end)
end
Trigger.OnKilled(Tanya, function() USSR.MarkCompletedObjective(USSRobjective) end)
if Difficulty == "tough" then
KillSams = AddPrimaryObjective(Greece, "destroy-sam-sites-blocker")
Greece.MarkCompletedObjective(RescueTanyaObjective)
TanyaSurviveObjective = AddPrimaryObjective(Greece, "tanya-survive")
Media.PlaySpeechNotification(Greece, "TanyaRescued")
else
KillSams = AddPrimaryObjective(Greece, "destroy-sam-sites-blocker")
Media.PlaySpeechNotification(Greece, "TargetFreed")
end
if not SpecialCameras and PrisonCamera and PrisonCamera.IsInWorld then
PrisonCamera.Destroy()
end
end
SendSpy = function()
Camera.Position = SpyEntry.CenterPosition
Spy = Reinforcements.ReinforceWithTransport(Greece, InsertionTransport, SpyType, SpyEntryPath, { SpyEntryPath[1] })[2][1]
Trigger.OnKilled(Spy, function() USSR.MarkCompletedObjective(USSRobjective) end)
if SpecialCameras then
SpyCameraA = Actor.Create("camera", true, { Owner = Greece, Location = SpyCamera1.Location })
SpyCameraB = Actor.Create("camera", true, { Owner = Greece, Location = SpyCamera2.Location })
end
Trigger.AfterDelay(DateTime.Seconds(3), function()
Media.DisplayMessage(UserInterface.GetFluentMessage("disguise-spy"), UserInterface.GetFluentMessage("spy"))
end)
end
ActivatePatrols = function()
GroupPatrol(DogPatrol, DogPatrolPath, DateTime.Seconds(2))
Trigger.AfterDelay(DateTime.Seconds(3), function()
GroupPatrol(PatrolA, PatrolAPath, DateTime.Seconds(7))
GroupPatrol(PatrolB, PatrolBPath, DateTime.Seconds(6))
end)
end
InitTriggers = function()
Trigger.OnInfiltrated(Warfactory, function()
if Greece.IsObjectiveCompleted(InfiltrateWarfactoryObjective) then
return
elseif Truk.IsDead then
if not Greece.IsObjectiveCompleted(RescueTanyaObjective) then
USSR.MarkCompletedObjective(USSRobjective)
end
return
end
Trigger.ClearAll(Spy)
Greece.MarkCompletedObjective(InfiltrateWarfactoryObjective)
WarfactoryInfiltrated()
end)
Trigger.OnKilled(Truk, function()
if not Greece.IsObjectiveCompleted(InfiltrateWarfactoryObjective) then
Greece.MarkFailedObjective(InfiltrateWarfactoryObjective)
elseif FollowTruk then
USSR.MarkCompletedObjective(USSRobjective)
end
end)
Trigger.OnInfiltrated(Prison, function()
if Greece.IsObjectiveCompleted(RescueTanyaObjective) then
return
end
if not Greece.IsObjectiveCompleted(InfiltrateWarfactoryObjective) then
Media.DisplayMessage(UserInterface.GetFluentMessage("skip-heroics"), UserInterface.GetFluentMessage("battlefield-control"))
Greece.MarkCompletedObjective(InfiltrateWarfactoryObjective)
end
if not PrisonCamera then
if SpecialCameras then
PrisonCamera = Actor.Create("camera", true, { Owner = Greece, Location = TrukWaypoint5.Location })
else
PrisonCamera = Actor.Create("camera.small", true, { Owner = Greece, Location = Prison.Location + CVec.New(1, 1) })
end
end
if SpecialCameras and SpyCameraA and not SpyCameraA.IsDead then
SpyCameraA.Destroy()
SpyCameraB.Destroy()
end
Trigger.ClearAll(Spy)
Trigger.AfterDelay(DateTime.Seconds(2), MissInfiltrated)
end)
Trigger.OnEnteredFootprint({ TrukWaypoint5.Location }, function(a, id)
if a == Truk then
Trigger.RemoveFootprintTrigger(id)
Spy = Actor.Create("spy", true, { Owner = Greece, Location = TrukWaypoint5.Location })
Spy.DisguiseAsType("e1", USSR)
Spy.Move(SpyWaypoint.Location)
Spy.Infiltrate(Prison)
Media.PlaySoundNotification(Greece, SpyVoice)
FollowTruk = false
if SpecialCameras then
PrisonCamera = Actor.Create("camera", true, { Owner = Greece, Location = TrukWaypoint5.Location })
else
PrisonCamera = Actor.Create("camera.small", true, { Owner = Greece, Location = Prison.Location + CVec.New(1, 1) })
end
Trigger.OnKilled(Spy, function() USSR.MarkCompletedObjective(USSRobjective) end)
end
end)
Trigger.OnEnteredFootprint({ TrukWaypoint6.Location }, function(a, id)
if a == Truk then
Trigger.RemoveFootprintTrigger(id)
Truk.Stop()
Truk.Kill()
ExplosiveBarrel.Kill()
end
end)
if Difficulty ~= "tough" then
Trigger.OnKilled(Mammoth, function()
Trigger.AfterDelay(HoldAITime - DateTime.Seconds(45), function() HoldProduction = false end)
Trigger.AfterDelay(HoldAITime, function() Attacking = true end)
end)
end
Trigger.OnKilled(FlameBarrel, function()
if not FlameTower.IsDead then
FlameTower.Kill()
end
end)
Trigger.OnKilled(SamBarrel, function()
if not Sam1.IsDead then
Sam1.Kill()
end
end)
Trigger.OnAllKilled(SamSites, function()
Greece.MarkCompletedObjective(KillSams)
local flare = Actor.Create("flare", true, { Owner = Greece, Location = ExtractionPath[2] + CVec.New(0, -1) })
Trigger.AfterDelay(DateTime.Seconds(7), flare.Destroy)
Media.PlaySpeechNotification(Greece, "SignalFlare")
if Difficulty == "tough" then
Reinforcements.ReinforceWithTransport(Greece, InsertionHeliType, HeliReinforcements, ExtractionPath, { ExtractionPath[1] })
if not Harvester.IsDead then
Harvester.FindResources()
end
else
ExtractionHeli = Reinforcements.ReinforceWithTransport(Greece, ExtractionHeliType, nil, ExtractionPath)[1]
local exitPos = CPos.New(ExtractionPath[1].X, ExtractionPath[2].Y)
Trigger.OnKilled(ExtractionHeli, function() USSR.MarkCompletedObjective(USSRobjective) end)
Trigger.OnRemovedFromWorld(Tanya, function()
ExtractUnits(ExtractionHeli, exitPos, function()
Media.PlaySpeechNotification(Greece, "TanyaRescued")
Greece.MarkCompletedObjective(RescueTanyaObjective)
Trigger.AfterDelay(DateTime.Seconds(2), function()
SendReinforcements()
end)
if PrisonCamera and PrisonCamera.IsInWorld then
PrisonCamera.Destroy()
end
end)
end)
end
end)
end
AddObjectives = function()
USSRobjective = AddPrimaryObjective(USSR, "")
RescueTanyaObjective = AddPrimaryObjective(Greece, "rescue-tanya")
KillAll = AddPrimaryObjective(Greece, "eliminate-soviet-units")
InfiltrateWarfactoryObjective = AddSecondaryObjective(Greece, "infiltrate-warfactory")
end
WorldLoaded = function()
Greece = Player.GetPlayer("Greece")
USSR = Player.GetPlayer("USSR")
InitObjectives(Greece)
AddObjectives()
InitTriggers()
SendSpy()
Trigger.AfterDelay(DateTime.Seconds(3), ActivatePatrols)
end

Binary file not shown.

View File

@@ -0,0 +1,19 @@
dropdown-difficulty =
.label = Difficulty
.description = The difficulty of the mission
options-difficulty =
.easy = Easy
.normal = Normal
.hard = Hard
.tough = Real tough guy
## rules.yaml
briefing =
Rescue Tanya.
Once disguised, your spy can move past any enemy unit, except dogs, without being detected. Direct him into the weapons factory located at a nearby Soviet base where he can hijack a truck and free Tanya.
With Tanya's help, take out the air defenses on the island so a Chinook can arrive to rescue her.
Then destroy all remaining Soviet buildings and units.

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,9 @@
Sounds:
Notifications:
bombit: bombit1
laugh: laugh1
gotit: gotit1
lefty: lefty1
keepem: keepem1
tuffguy: tuffguy1
sking: sking1

View File

@@ -0,0 +1,195 @@
World:
LuaScript:
Scripts: campaign.lua, utils.lua, allies05a.lua, allies05a-AI.lua
MissionData:
Briefing: briefing
BriefingVideo: ally5.vqa
StartVideo: tanya1.vqa
WinVideo: tanya2.vqa
LossVideo: grvestne.vqa
MapOptions:
TechLevel: medium
ScriptLobbyDropdown@difficulty:
ID: difficulty
Label: dropdown-difficulty.label
Description: dropdown-difficulty.description
Values:
easy: options-difficulty.easy
normal: options-difficulty.normal
hard: options-difficulty.hard
tough: options-difficulty.tough
Default: normal
Camera.Small:
Inherits: CAMERA
RevealsShroud:
Range: 4c0
TSLA:
Buildable:
Prerequisites: ~disabled
SAM:
Buildable:
Prerequisites: ~disabled
LST:
-Selectable:
Targetable:
TargetTypes: GroundActor, WaterActor
Interactable:
LST.IN:
Inherits: LST
RenderSprites:
Image: LST
Cargo:
Types: disabled
TRAN:
-Selectable:
RevealsShroud:
Range: 4c0
Targetable@GROUND:
TargetTypes: GroundActor
Interactable:
TRAN.IN:
Inherits: TRAN
RenderSprites:
Image: TRAN
Cargo:
Types: disabled
TRUK.mission:
Inherits: TRUK
WithFacingSpriteBody:
-SpawnActorOnDeath:
RevealsShroud:
Range: 4c0
ValidRelationships: Ally, Enemy
RequiresCondition: hijacked
ExternalCondition@hijacked:
Condition: hijacked
RenderSprites:
Image: TRUK
SPY:
Infiltrates:
Types: Mission Objectives
WEAP:
-InfiltrateForSupportPower:
Targetable:
TargetTypes: GroundActor, C4, DetonateAttack, Structure
WEAP.infiltratable:
Inherits: WEAP
Buildable:
Prerequisites: ~disabled
Targetable@Spy:
TargetTypes: GroundActor, C4, DetonateAttack, Structure, Mission Objectives
RenderSprites:
Image: WEAP
ProvidesPrerequisite:
Prerequisite: weap
MISS:
Tooltip:
Name: actor-prison-name
Targetable:
TargetTypes: GroundActor, C4, DetonateAttack, Structure, Mission Objectives
AttackOmni:
Armament:
Weapon: PrisonColt
E1.Autotarget:
Inherits: E1
Buildable:
Prerequisites: ~disabled
RevealsShroud:
Range: 8c0
AutoTarget:
ScanRadius: 7
RenderSprites:
Image: E1
E2.Autotarget:
Inherits: E2
Buildable:
Prerequisites: ~disabled
RevealsShroud:
Range: 8c0
AutoTarget:
ScanRadius: 7
RenderSprites:
Image: E2
AFLD:
AirstrikePower@spyplane:
Prerequisites: ~disabled
ParatroopersPower@paratroopers:
Prerequisites: ~disabled
FCOM:
MustBeDestroyed:
4TNK:
Buildable:
Prerequisites: ~disabled
MCV:
Buildable:
Prerequisites: ~disabled
MNLY:
Buildable:
Prerequisites: ~disabled
TTNK:
Buildable:
Prerequisites: ~disabled
FTRK:
Buildable:
Prerequisites: ~disabled
DTRK:
Buildable:
Prerequisites: ~disabled
QTNK:
Buildable:
Prerequisites: ~disabled
MSLO:
Buildable:
Prerequisites: ~disabled
SPEN:
Buildable:
Prerequisites: ~disabled
IRON:
Buildable:
Prerequisites: ~disabled
STEK:
Buildable:
Prerequisites: ~disabled
E6:
Buildable:
Prerequisites: ~disabled
THF:
Buildable:
Prerequisites: ~disabled
SHOK:
Buildable:
Prerequisites: ~disabled
MIG:
Buildable:
Prerequisites: ~disabled

View File

@@ -0,0 +1,9 @@
PrisonColt:
CanTargetSelf: true
ValidTargets: Ground, GroundActor
ReloadDelay: 7
Report: gun5.aud
Projectile: InstantHit
Warhead@1Dam: SpreadDamage
AffectsParent: true
ValidTargets: Ground, GroundActor