Initial commit: OpenRA game engine
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:
BIN
mods/ra/maps/soviet-soldier-volkov-n-chitzkoi/map.bin
Normal file
BIN
mods/ra/maps/soviet-soldier-volkov-n-chitzkoi/map.bin
Normal file
Binary file not shown.
7
mods/ra/maps/soviet-soldier-volkov-n-chitzkoi/map.ftl
Normal file
7
mods/ra/maps/soviet-soldier-volkov-n-chitzkoi/map.ftl
Normal file
@@ -0,0 +1,7 @@
|
||||
## rules.yaml
|
||||
briefing =
|
||||
The Allies have stolen a new armor plating from us. With it, they can make structures nearly invulnerable. Their processing plant must be destroyed.
|
||||
|
||||
For this critical mission, we are allowing you access to Soldier Volkov. Use him and his cybernetic dog to sabotage the Allied control center, allowing our units in the southeast access to the alloy facility.
|
||||
|
||||
The mission is a success when Volkov destroys the control center, and our units destroy the alloy facility.
|
||||
BIN
mods/ra/maps/soviet-soldier-volkov-n-chitzkoi/map.png
Normal file
BIN
mods/ra/maps/soviet-soldier-volkov-n-chitzkoi/map.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 23 KiB |
1322
mods/ra/maps/soviet-soldier-volkov-n-chitzkoi/map.yaml
Normal file
1322
mods/ra/maps/soviet-soldier-volkov-n-chitzkoi/map.yaml
Normal file
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,3 @@
|
||||
Sounds:
|
||||
Notifications:
|
||||
rokroll: rokroll1
|
||||
166
mods/ra/maps/soviet-soldier-volkov-n-chitzkoi/rules.yaml
Normal file
166
mods/ra/maps/soviet-soldier-volkov-n-chitzkoi/rules.yaml
Normal file
@@ -0,0 +1,166 @@
|
||||
World:
|
||||
LuaScript:
|
||||
Scripts: campaign.lua, utils.lua, soviet-soldier-volkov-n-chitzkoi.lua, soviet-soldier-volkov-n-chitzkoi-AI.lua
|
||||
MissionData:
|
||||
Briefing: briefing
|
||||
WinVideo: grvestne.vqa
|
||||
LossVideo: sovcemet.vqa
|
||||
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
|
||||
Default: normal
|
||||
|
||||
E7:
|
||||
Health:
|
||||
HP: 25000
|
||||
Armor:
|
||||
Type: Heavy
|
||||
|
||||
2TNK:
|
||||
Buildable:
|
||||
Prerequisites: ~vehicles.allies, ~techlevel.medium
|
||||
|
||||
CA:
|
||||
Buildable:
|
||||
Prerequisites: ~syrd
|
||||
|
||||
C2:
|
||||
Inherits@2: ^ArmedCivilian
|
||||
|
||||
C3:
|
||||
Inherits@2: ^ArmedCivilian
|
||||
|
||||
C4:
|
||||
Inherits@2: ^ArmedCivilian
|
||||
|
||||
C5:
|
||||
Inherits@2: ^ArmedCivilian
|
||||
|
||||
C6:
|
||||
Inherits@2: ^ArmedCivilian
|
||||
|
||||
C8:
|
||||
Inherits@2: ^ArmedCivilian
|
||||
|
||||
C9:
|
||||
Inherits@2: ^ArmedCivilian
|
||||
|
||||
C10:
|
||||
Inherits@2: ^ArmedCivilian
|
||||
|
||||
V01:
|
||||
SpawnActorOnDeath:
|
||||
Actor: healcrate
|
||||
|
||||
HOSP:
|
||||
SpawnActorOnDeath:
|
||||
Actor: healcrate
|
||||
|
||||
^Vehicle:
|
||||
-Demolishable:
|
||||
|
||||
^Mine:
|
||||
Tooltip:
|
||||
ShowOwnerRow: false
|
||||
|
||||
AFAC:
|
||||
Inherits: BIO
|
||||
Health:
|
||||
HP: 400000
|
||||
Tooltip:
|
||||
Name: actor-afac.name
|
||||
GenericName: actor-afac.generic-name
|
||||
GenericVisibility: Enemy, Ally, Neutral
|
||||
GenericStancePrefix: false
|
||||
RenderSprites:
|
||||
Image: BIO
|
||||
|
||||
CCEN:
|
||||
Inherits: ATEK
|
||||
Tooltip:
|
||||
Name: actor-ccen.name
|
||||
GenericName: actor-ccen.generic-name
|
||||
GenericVisibility: Enemy, Ally, Neutral
|
||||
GenericStancePrefix: false
|
||||
GpsPower:
|
||||
Prerequisites: ~disabled
|
||||
Power:
|
||||
Amount: 200
|
||||
RenderSprites:
|
||||
Image: ATEK
|
||||
|
||||
HGUN:
|
||||
Inherits: GUN
|
||||
Valued:
|
||||
Cost: 2800
|
||||
Tooltip:
|
||||
Name: actor-hgun-name
|
||||
Health:
|
||||
HP: 350000
|
||||
Armor:
|
||||
Type: Heavy
|
||||
RevealsShroud:
|
||||
Range: 8c0
|
||||
Armament:
|
||||
Weapon: HeavyTurretGun
|
||||
RenderSprites:
|
||||
Image: GUN
|
||||
|
||||
ZKOI:
|
||||
Inherits: DOG
|
||||
Valued:
|
||||
Cost: 2000
|
||||
Tooltip:
|
||||
Name: actor-zkoi.name
|
||||
GenericName: actor-zkoi.generic-name
|
||||
Health:
|
||||
HP: 100000
|
||||
-Crushable:
|
||||
RevealsShroud:
|
||||
Range: 7c0
|
||||
Armament:
|
||||
Weapon: CydogJaw
|
||||
RenderSprites:
|
||||
Image: DOG
|
||||
|
||||
VOLK:
|
||||
Inherits: GNRL
|
||||
Valued:
|
||||
Cost: 3000
|
||||
Tooltip:
|
||||
Name: actor-volk-name
|
||||
Health:
|
||||
HP: 250000
|
||||
Armor:
|
||||
Type: Heavy
|
||||
-Crushable:
|
||||
RevealsShroud:
|
||||
Range: 10c0
|
||||
Demolition:
|
||||
Mobile:
|
||||
Voice: Action
|
||||
AttackFrontal:
|
||||
Voice: Action
|
||||
FacingTolerance: 0
|
||||
AttackMove:
|
||||
Voice: Action
|
||||
Passenger:
|
||||
Voice: Action
|
||||
Guard:
|
||||
Voice: Action
|
||||
Voiced:
|
||||
VoiceSet: GenericVoice
|
||||
Armament:
|
||||
Weapon: VolkovWeapon
|
||||
RenderSprites:
|
||||
Image: GNRL
|
||||
|
||||
powerproxy.pararifles:
|
||||
Inherits: powerproxy.paratroopers
|
||||
ParatroopersPower:
|
||||
DropItems: E1,E1,E1,E1,E1
|
||||
@@ -0,0 +1,116 @@
|
||||
--[[
|
||||
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.
|
||||
]]
|
||||
|
||||
AlliedInfantryTypes = { "e1", "e3" }
|
||||
if Difficulty == "easy" then
|
||||
AlliedArmorTypes = { "1tnk", "1tnk" }
|
||||
else
|
||||
AlliedArmorTypes = { "1tnk", "2tnk" }
|
||||
end
|
||||
if Difficulty == "hard" then
|
||||
AlliedNavyGuard = { "ca", "ca" }
|
||||
else
|
||||
AlliedNavyGuard = { "ca" }
|
||||
end
|
||||
ArmorAttackNumbers =
|
||||
{
|
||||
easy = 2,
|
||||
normal = 5,
|
||||
hard = 8
|
||||
}
|
||||
ArmorAttackDelays =
|
||||
{
|
||||
easy = DateTime.Seconds(45),
|
||||
normal = DateTime.Seconds(30),
|
||||
hard = DateTime.Seconds(10)
|
||||
}
|
||||
AlliedWarFactRally = { waypoint2, waypoint9, waypoint10, waypoint11 }
|
||||
InfAttack = { }
|
||||
ArmorAttack = { }
|
||||
|
||||
SendAttackToBase = function(units)
|
||||
Utils.Do(units, function(unit)
|
||||
if not unit.IsDead and unit.HasProperty("Hunt") then
|
||||
unit.AttackMove(waypoint77.Location, 2)
|
||||
Trigger.OnIdle(unit, unit.Hunt)
|
||||
end
|
||||
end)
|
||||
end
|
||||
|
||||
UnitsJustHunt = function(units)
|
||||
Utils.Do(units, function(unit)
|
||||
if not unit.IsDead and unit.HasProperty("Hunt") then
|
||||
Trigger.OnIdle(unit, unit.Hunt)
|
||||
end
|
||||
end)
|
||||
end
|
||||
|
||||
ProduceInfantry = function()
|
||||
if AlliedBarracks01.IsDead then
|
||||
return
|
||||
elseif (OreRefinery01.IsDead and OreRefinery02.IsDead or GreeceHarvestersAreDead) and Greece.Resources <= 299 then
|
||||
return
|
||||
end
|
||||
|
||||
local delay = Utils.RandomInteger(DateTime.Seconds(1), DateTime.Seconds(2))
|
||||
local toBuild = { Utils.Random(AlliedInfantryTypes) }
|
||||
Greece.Build(toBuild, function(unit)
|
||||
InfAttack[#InfAttack + 1] = unit[1]
|
||||
|
||||
if #InfAttack >= 5 then
|
||||
UnitsJustHunt(InfAttack)
|
||||
InfAttack = { }
|
||||
Trigger.AfterDelay(DateTime.Seconds(1), ProduceInfantry)
|
||||
else
|
||||
Trigger.AfterDelay(delay, ProduceInfantry)
|
||||
end
|
||||
end)
|
||||
end
|
||||
|
||||
ProduceArmor = function()
|
||||
if AlliedWarFact01.IsDead and AlliedWarFact02.IsDead then
|
||||
return
|
||||
elseif (OreRefinery01.IsDead and OreRefinery02.IsDead or GreeceHarvestersAreDead) and Greece.Resources <= 699 then
|
||||
return
|
||||
end
|
||||
|
||||
local delay = Utils.RandomInteger(DateTime.Seconds(7), DateTime.Seconds(10))
|
||||
local toBuild = { Utils.Random(AlliedArmorTypes) }
|
||||
local rally = Utils.Random(AlliedWarFactRally)
|
||||
|
||||
Utils.Do(AlliedWarFact, function(fact)
|
||||
if not fact.IsDead then
|
||||
fact.RallyPoint = rally.Location
|
||||
end
|
||||
end)
|
||||
|
||||
Greece.Build(toBuild, function(unit)
|
||||
ArmorAttack[#ArmorAttack + 1] = unit[1]
|
||||
|
||||
if #ArmorAttack >= ArmorAttackNumbers[Difficulty] then
|
||||
SendAttackToBase(ArmorAttack)
|
||||
ArmorAttack = { }
|
||||
Trigger.AfterDelay(ArmorAttackDelays[Difficulty], ProduceArmor)
|
||||
else
|
||||
Trigger.AfterDelay(delay, ProduceArmor)
|
||||
end
|
||||
end)
|
||||
end
|
||||
|
||||
ProduceNavyGuard = function()
|
||||
if NavalYard01.IsDead then
|
||||
return
|
||||
elseif (OreRefinery01.IsDead and OreRefinery02.IsDead or GreeceHarvestersAreDead) and Greece.Resources <= 2399 then
|
||||
return
|
||||
end
|
||||
NavalYard01.RallyPoint = waypoint26.Location
|
||||
Greece.Build(AlliedNavyGuard, function(nvgrd)
|
||||
Trigger.OnAllKilled(nvgrd, ProduceNavyGuard)
|
||||
end)
|
||||
end
|
||||
@@ -0,0 +1,360 @@
|
||||
--[[
|
||||
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.
|
||||
]]
|
||||
-- Unit Groups Setup
|
||||
SuperTeam = { "zkoi", "volk" }
|
||||
PlayerTankDivision = { PlyrHvyTnk01, PlyrHvyTnk02, PlyrHvyTnk03, PlyrHvyTnk04, PlyrHvyTnk05, PlyrMthTnk01, PlyrMthTnk02, PlyrV2RL01, PlyrV2RL02, PlyrV2RL03, PlyrV2RL04 }
|
||||
InitialHuntTeam = { InitialHuntUnit01, InitialHuntUnit02, InitialHuntUnit03, InitialHuntUnit04, InitialHuntUnit05, InitialHuntUnit06, InitialHuntUnit07, InitialHuntUnit08, InitialHuntUnit09 }
|
||||
BarrelsShooter = { InitialRifleman01, InitialRifleman02 }
|
||||
TownPeoples = { TownDude01, TownDude02, TownDude03, TownDude04, TownMedic01, TownMedic02, TownMedic03 }
|
||||
CivTeam01 = { "c1", "c3", "c4" }
|
||||
CivTeam02 = { "c4", "c5", "c6" }
|
||||
InfGuardSquad01 = { InfGuardSquad01Unit01, InfGuardSquad01Unit02, InfGuardSquad01Unit03, InfGuardSquad01Unit04, InfGuardSquad01Unit05, MediumTankGuard01 }
|
||||
InfGuardSquad02 = { InfGuardSquad02Unit01, InfGuardSquad02Unit02, InfGuardSquad02Unit03, RangerGuard02 }
|
||||
InfGuardSquad03 = { InfGuardSquad03Unit01, InfGuardSquad03Unit02, InfGuardSquad03Unit03, InfGuardSquad03Unit04, InfGuardSquad03Unit05, RangerGuard04 }
|
||||
TanyaSquad = { TanyaSquadUnit01, TanyaSquadUnit02, TanyaSquadUnit03, TanyaSquadUnit04, TanyaSquadUnit05, TanyaSquadUnit06, TanyaSquadTanya }
|
||||
|
||||
-- Building Group Setup
|
||||
AlliedOreRef = { OreRefinery01, OreRefinery02 }
|
||||
AlliedWarFact = { AlliedWarFact01, AlliedWarFact02 }
|
||||
HeavyTurrets = { HTurret01, HTurret02, HTurret03 }
|
||||
|
||||
-- Area Triggers Setup
|
||||
SuperTeamLandCell = { CPos.New(21, 82), CPos.New(20, 81), CPos.New(21, 81), CPos.New(22, 81), CPos.New(20, 82), CPos.New(22, 82), CPos.New(21, 83), CPos.New(20, 83), CPos.New(22, 83) }
|
||||
CivTeam01Trigger = { CPos.New(21, 58), CPos.New(21, 59), CPos.New(21, 60), CPos.New(22, 60), CPos.New(23, 60), CPos.New(22, 61), CPos.New(23, 61), CPos.New(24, 60), CPos.New(25, 60), CPos.New(24, 59), CPos.New(24, 58), CPos.New(23, 58), CPos.New(22, 58) }
|
||||
CivTeam02Trigger = { CPos.New(33, 62), CPos.New(33, 63), CPos.New(32, 62), CPos.New(32, 63), CPos.New(31, 62), CPos.New(31, 63), CPos.New(31, 61), CPos.New(31, 60), CPos.New(30, 62), CPos.New(30, 61), CPos.New(30, 60), CPos.New(32, 60), CPos.New(33, 60) }
|
||||
MineSoldierTrigger = { CPos.New(32, 58), CPos.New(32, 59), CPos.New(33, 58), CPos.New(33, 59), CPos.New(31, 59), CPos.New(30, 59), CPos.New(29, 59), CPos.New(29, 58), CPos.New(28, 59), CPos.New(27, 59), CPos.New(26, 59), CPos.New(25, 59), CPos.New(27, 58), CPos.New(26, 58), CPos.New(25, 58), CPos.New(24, 58), CPos.New(23, 58), CPos.New(26, 57), CPos.New(24, 57), CPos.New(24, 56), CPos.New(24, 55), CPos.New(24, 54), CPos.New(23, 57), CPos.New(23, 56), CPos.New(23, 55), CPos.New(23, 54), CPos.New(22, 57) }
|
||||
MineRevealTrigger = { CPos.New(30, 46), CPos.New(31, 46), CPos.New(32, 46), CPos.New(33, 46), CPos.New(34, 46), CPos.New(35, 46), CPos.New(36, 46), CPos.New(37, 46) }
|
||||
ParaTrigger = { CPos.New(18, 34), CPos.New(19, 34), CPos.New(20, 34), CPos.New(21, 34), CPos.New(22, 34), CPos.New(23, 34), CPos.New(24, 34), CPos.New(25, 34), CPos.New(18, 35), CPos.New(19, 35), CPos.New(20, 35), CPos.New(21, 35), CPos.New(22, 35), CPos.New(23, 35), CPos.New(24, 35), CPos.New(25, 35) }
|
||||
TanyaTrigger = { CPos.New(59, 43), CPos.New(60, 43), CPos.New(61, 43), CPos.New(62, 43), CPos.New(63, 43), CPos.New(64, 43), CPos.New(65, 43), CPos.New(66, 43), CPos.New(67, 43), CPos.New(68, 43), CPos.New(69, 43), CPos.New(59, 44), CPos.New(60, 44), CPos.New(61, 44), CPos.New(62, 44), CPos.New(63, 44), CPos.New(64, 44), CPos.New(65, 44), CPos.New(66, 44), CPos.New(67, 44), CPos.New(68, 44), CPos.New(69, 44) }
|
||||
|
||||
-- Mission Variables Setup
|
||||
GreeceHarvestersAreDead = false
|
||||
AlloyFacilityDestroyed = false
|
||||
|
||||
WorldLoaded = function()
|
||||
|
||||
--Players Setup
|
||||
USSR = Player.GetPlayer("USSR")
|
||||
Greece = Player.GetPlayer("Greece")
|
||||
GoodGuy = Player.GetPlayer("GoodGuy")
|
||||
Spain = Player.GetPlayer("Spain")
|
||||
France = Player.GetPlayer("France")
|
||||
|
||||
Greece.Cash = 20000
|
||||
|
||||
Camera.Position = DefaultCameraPosition.CenterPosition
|
||||
|
||||
--AI Production Setup
|
||||
ProduceArmor()
|
||||
|
||||
if Difficulty == "easy" then
|
||||
Trigger.AfterDelay(DateTime.Minutes(10), ProduceNavyGuard)
|
||||
elseif Difficulty == "normal" then
|
||||
Trigger.AfterDelay(DateTime.Minutes(5), ProduceNavyGuard)
|
||||
elseif Difficulty == "hard" then
|
||||
ProduceNavyGuard()
|
||||
end
|
||||
|
||||
--Objectives Setup
|
||||
InitObjectives(USSR)
|
||||
|
||||
DestroyControlCenter = AddPrimaryObjective(USSR, "destroy-control-center")
|
||||
KeepTanksAlive = AddPrimaryObjective(USSR, "tank-division-must-not-be-destroyed")
|
||||
KeepVolkovAlive = AddPrimaryObjective(USSR, "volkov-survive")
|
||||
KeepChitzkoiAlive = AddSecondaryObjective(USSR, "keep-chitzkoi-alive")
|
||||
|
||||
Trigger.OnKilled(ControlCenter, function()
|
||||
Utils.Do(HeavyTurrets, function(struc)
|
||||
if not struc.IsDead then struc.Kill() end
|
||||
end)
|
||||
USSR.MarkCompletedObjective(DestroyControlCenter)
|
||||
DestroyAlloyFacility = AddPrimaryObjective(USSR, "destroy-alloy-facility")
|
||||
Media.PlaySpeechNotification(USSR, "FirstObjectiveMet")
|
||||
Media.DisplayMessage(UserInterface.GetFluentMessage("heavy-turret-control-destroyed"))
|
||||
end)
|
||||
|
||||
Trigger.OnKilled(AlloyFacility, function()
|
||||
if not USSR.IsObjectiveCompleted(DestroyControlCenter) then --Prevent a crash if the player somehow manage to cheese the mission and destroy
|
||||
USSR.MarkCompletedObjective(DestroyControlCenter) --the Alloy Facility without destroying the Control Center.
|
||||
DestroyAlloyFacility = AddPrimaryObjective(USSR, "destroy-alloy-facility")
|
||||
end
|
||||
Trigger.AfterDelay(DateTime.Seconds(2), function()
|
||||
USSR.MarkCompletedObjective(DestroyAlloyFacility)
|
||||
USSR.MarkCompletedObjective(KeepTanksAlive)
|
||||
USSR.MarkCompletedObjective(KeepVolkovAlive)
|
||||
USSR.MarkCompletedObjective(KeepChitzkoiAlive)
|
||||
end)
|
||||
AlloyFacilityDestroyed = true
|
||||
Media.PlaySpeechNotification(USSR, "SecondObjectiveMet")
|
||||
end)
|
||||
|
||||
Trigger.OnAllKilled(PlayerTankDivision, function()
|
||||
if not AlloyFacilityDestroyed then USSR.MarkFailedObjective(KeepTanksAlive) end
|
||||
end)
|
||||
|
||||
Trigger.AfterDelay(0, function()
|
||||
local AlliedBaseCamera = Actor.Create("camera", true, { Owner = USSR, Location = waypoint12.Location })
|
||||
local SuperTeamCamera = Actor.Create("camera", true, { Owner = USSR, Location = DefaultCameraPosition.Location })
|
||||
Trigger.AfterDelay(1, function()
|
||||
if AlliedBaseCamera.IsInWorld then AlliedBaseCamera.Destroy() end
|
||||
end)
|
||||
Trigger.AfterDelay(DateTime.Seconds(20), function()
|
||||
if SuperTeamCamera.IsInWorld then SuperTeamCamera.Destroy() end
|
||||
end)
|
||||
end)
|
||||
|
||||
--Super Team Setup
|
||||
Trigger.AfterDelay(DateTime.Seconds(2), function()
|
||||
local spawn = superteamspawn.CenterPosition + WVec.New(0, 0, Actor.CruiseAltitude("badr"))
|
||||
local transport = Actor.Create("badr", true, { CenterPosition = spawn, Owner = USSR, Facing = (superteamdrop.CenterPosition - spawn).Facing, Health = 3 })
|
||||
Utils.Do(SuperTeam, function(type)
|
||||
local a = Actor.Create(type, false, { Owner = USSR })
|
||||
transport.LoadPassenger(a)
|
||||
if a.Type == "volk" then
|
||||
VolkovIsDead(a)
|
||||
end
|
||||
if a.Type == "zkoi" then
|
||||
ChitzkoiIsDead(a)
|
||||
end
|
||||
end)
|
||||
Media.PlaySpeechNotification(USSR, "ReinforcementsArrived")
|
||||
transport.Paradrop(CPos.New(21, 82))
|
||||
end)
|
||||
|
||||
Trigger.OnEnteredFootprint(SuperTeamLandCell, function(unit, id)
|
||||
if unit.Owner == USSR then
|
||||
Trigger.RemoveFootprintTrigger(id)
|
||||
Trigger.AfterDelay(DateTime.Seconds(2), function()
|
||||
Utils.Do(InitialHuntTeam, IdleHunt)
|
||||
|
||||
if Barrel.IsDead then
|
||||
return
|
||||
end
|
||||
|
||||
if not BarrelsShooter[1].IsDead then
|
||||
BarrelsShooter[1].Attack(Barrel, true, true)
|
||||
elseif not BarrelsShooter[2].IsDead then
|
||||
BarrelsShooter[2].Attack(Barrel, true, true)
|
||||
end
|
||||
end)
|
||||
end
|
||||
end)
|
||||
|
||||
--Guards Squads Setup -- I used proximity triggers to make them hunt you down in order to mimic their behavior from the original mission
|
||||
Trigger.OnEnteredProximityTrigger(RangerGuard01.CenterPosition, WDist.FromCells(7), function(unit, id)
|
||||
if unit.Owner == USSR and (unit.Type == "volk" or unit.Type == "zkoi") then
|
||||
IdleHunt(RangerGuard01)
|
||||
Trigger.RemoveProximityTrigger(id)
|
||||
end
|
||||
end)
|
||||
|
||||
Trigger.OnEnteredProximityTrigger(waypoint7.CenterPosition, WDist.FromCells(6), function(unit, id)
|
||||
if unit.Owner == USSR then
|
||||
Utils.Do(InfGuardSquad01, function(actor)
|
||||
if not actor.IsDead then
|
||||
Trigger.OnIdle(actor, actor.Hunt)
|
||||
end
|
||||
end)
|
||||
Trigger.RemoveProximityTrigger(id)
|
||||
end
|
||||
end)
|
||||
|
||||
Trigger.OnEnteredProximityTrigger(InfGuardSquad02Unit01.CenterPosition, WDist.FromCells(6), function(unit, id)
|
||||
if unit.Owner == USSR and (unit.Type == "volk" or unit.Type == "zkoi") then
|
||||
Utils.Do(InfGuardSquad02, function(actor)
|
||||
if not actor.IsDead then
|
||||
Trigger.OnIdle(actor, actor.Hunt)
|
||||
end
|
||||
end)
|
||||
Trigger.RemoveProximityTrigger(id)
|
||||
end
|
||||
end)
|
||||
|
||||
Trigger.OnEnteredProximityTrigger(InfGuardSquad03Unit05.CenterPosition, WDist.FromCells(8), function(unit, id)
|
||||
if unit.Owner == USSR then
|
||||
local HospitalCamera = Actor.Create("camera", true, { Owner = USSR, Location = waypoint13.Location })
|
||||
Utils.Do(InfGuardSquad03, function(actor)
|
||||
if not actor.IsDead then
|
||||
Trigger.OnIdle(actor, actor.Hunt)
|
||||
end
|
||||
end)
|
||||
if not SupplyTruck01.IsDead then
|
||||
SupplyTruck01.Move(waypoint14.Location)
|
||||
Trigger.AfterDelay(DateTime.Seconds(8), function()
|
||||
if not SupplyTruck01.IsDead then
|
||||
SupplyTruck01.Move(waypoint15.Location)
|
||||
end
|
||||
end)
|
||||
end
|
||||
Trigger.AfterDelay(DateTime.Seconds(15), function()
|
||||
if HospitalCamera.IsInWorld then HospitalCamera.Destroy() end
|
||||
end)
|
||||
Trigger.RemoveProximityTrigger(id)
|
||||
end
|
||||
end)
|
||||
|
||||
Trigger.OnEnteredProximityTrigger(LightTankGuard02.CenterPosition, WDist.FromCells(8), function(unit, id)
|
||||
if unit.Owner == USSR and (unit.Type == "volk" or unit.Type == "zkoi") then
|
||||
IdleHunt(LightTankGuard02)
|
||||
Trigger.RemoveProximityTrigger(id)
|
||||
end
|
||||
end)
|
||||
|
||||
--Tanya Squad Setup
|
||||
Trigger.OnEnteredFootprint(TanyaTrigger, function(unit, id)
|
||||
if unit.Owner == USSR then
|
||||
if not TanyaSquadTanya.IsDead then
|
||||
local TanyaSquadCamera = Actor.Create("camera", true, { Owner = USSR, Location = waypoint85.Location })
|
||||
Media.PlaySoundNotification(USSR, "rokroll")
|
||||
Utils.Do(TanyaSquad, function(actor)
|
||||
if not actor.IsDead then
|
||||
Trigger.OnIdle(actor, actor.Hunt)
|
||||
end
|
||||
end)
|
||||
Trigger.OnKilled(TanyaSquadTanya, function()
|
||||
if TanyaSquadCamera.IsInWorld then
|
||||
TanyaSquadCamera.Destroy()
|
||||
end
|
||||
end)
|
||||
end
|
||||
Trigger.RemoveFootprintTrigger(id)
|
||||
end
|
||||
end)
|
||||
|
||||
--Town Setup
|
||||
Utils.Do(TownPeoples, function(actor)
|
||||
Trigger.OnDamaged(actor, function()
|
||||
if not TownMedic01.IsDead then
|
||||
TownMedic01.Patrol({ waypoint5.Location, waypoint6.Location, waypoint7.Location }, true, 0)
|
||||
end
|
||||
if not TownMedic02.IsDead then
|
||||
TownMedic02.Patrol({ waypoint8.Location, waypoint7.Location, waypoint5.Location, waypoint6.Location }, true, 0)
|
||||
end
|
||||
end)
|
||||
end)
|
||||
|
||||
Trigger.OnEnteredFootprint(CivTeam01Trigger, function(unit, id)
|
||||
if unit.Owner == USSR then
|
||||
if not TownHouse03.IsDead then
|
||||
local civ01 = Reinforcements.Reinforce(Spain, CivTeam01, { civteam01spawn.Location }, 0)
|
||||
Utils.Do(civ01, function(actor)
|
||||
if not actor.IsDead then
|
||||
actor.Scatter()
|
||||
Trigger.OnIdle(actor, actor.Hunt)
|
||||
end
|
||||
end)
|
||||
end
|
||||
Trigger.RemoveFootprintTrigger(id)
|
||||
end
|
||||
end)
|
||||
|
||||
Trigger.OnEnteredFootprint(CivTeam02Trigger, function(unit, id)
|
||||
if unit.Owner == USSR then
|
||||
if not TownHouse04.IsDead then
|
||||
local civ02 = Reinforcements.Reinforce(Spain, CivTeam02, { civteam02spawn.Location }, 0)
|
||||
Utils.Do(civ02, function(actor)
|
||||
if not actor.IsDead then
|
||||
actor.Scatter()
|
||||
Trigger.OnIdle(actor, actor.Hunt)
|
||||
end
|
||||
end)
|
||||
end
|
||||
Trigger.RemoveFootprintTrigger(id)
|
||||
end
|
||||
end)
|
||||
|
||||
--Minefield Setup
|
||||
Trigger.OnEnteredFootprint(MineSoldierTrigger, function(unit, id)
|
||||
if unit.Owner == USSR then
|
||||
local MineSoldierCamera1 = Actor.Create("camera", true, { Owner = USSR, Location = waypoint96.Location })
|
||||
Trigger.AfterDelay(DateTime.Seconds(10), function()
|
||||
if MineSoldierCamera1.IsInWorld then MineSoldierCamera1.Destroy() end
|
||||
end)
|
||||
if not MineSoldier01.IsDead then
|
||||
MineSoldier01.Patrol({ waypoint91.Location, waypoint95.Location, waypoint76.Location, waypoint93.Location }, false, 0)
|
||||
end
|
||||
if not MineSoldier02.IsDead then
|
||||
MineSoldier02.Patrol({ waypoint92.Location, waypoint91.Location, waypoint76.Location, waypoint93.Location }, false, 0)
|
||||
end
|
||||
if not MineSoldier03.IsDead then
|
||||
MineSoldier03.Patrol({ waypoint91.Location, waypoint95.Location, waypoint76.Location, waypoint93.Location }, false, 0)
|
||||
end
|
||||
if not MineSoldier04.IsDead then
|
||||
MineSoldier04.Patrol({ waypoint92.Location, waypoint95.Location, waypoint76.Location, waypoint93.Location }, false, 0)
|
||||
end
|
||||
if not MineSoldier05.IsDead then
|
||||
MineSoldier05.Patrol({ waypoint90.Location, waypoint91.Location, waypoint95.Location, waypoint76.Location, waypoint93.Location }, false, 0)
|
||||
end
|
||||
if not MineSoldier06.IsDead then
|
||||
MineSoldier06.Patrol({ waypoint92.Location, waypoint91.Location, waypoint93.Location }, false, 0)
|
||||
end
|
||||
Trigger.RemoveFootprintTrigger(id)
|
||||
end
|
||||
end)
|
||||
|
||||
Trigger.OnEnteredFootprint(MineRevealTrigger, function(unit, id)
|
||||
if unit.Owner == GoodGuy then
|
||||
local MineSoldierCamera2 = Actor.Create("camera", true, { Owner = USSR, Location = waypoint76.Location })
|
||||
Trigger.AfterDelay(DateTime.Seconds(12), function()
|
||||
if MineSoldierCamera2.IsInWorld then MineSoldierCamera2.Destroy() end
|
||||
end)
|
||||
Trigger.RemoveFootprintTrigger(id)
|
||||
end
|
||||
end)
|
||||
|
||||
--Paradrop Rifle Team Setup
|
||||
Trigger.OnEnteredFootprint(ParaTrigger, function(unit, id)
|
||||
if unit.Owner == USSR then
|
||||
local powerproxy = Actor.Create("powerproxy.pararifles", true, { Owner = Greece })
|
||||
local aircraft = powerproxy.TargetParatroopers(waypoint89.CenterPosition, Angle.South)
|
||||
local prtcamera = Actor.Create("camera", true, { Owner = USSR, Location = waypoint89.Location })
|
||||
Utils.Do(aircraft, function(a)
|
||||
Trigger.OnPassengerExited(a, function(t, p)
|
||||
IdleHunt(p)
|
||||
end)
|
||||
end)
|
||||
Trigger.AfterDelay(DateTime.Seconds(10), function()
|
||||
if prtcamera.IsInWorld then prtcamera.Destroy() end
|
||||
end)
|
||||
if Difficulty == "hard" and not RiflemanGuard01.IsDead then
|
||||
Trigger.ClearAll(RiflemanGuard01)
|
||||
ProduceInfantry() --Greece will start infantry production right away if the difficulty is set to hard
|
||||
end
|
||||
Trigger.RemoveFootprintTrigger(id)
|
||||
end
|
||||
end)
|
||||
|
||||
Trigger.OnKilled(RiflemanGuard01, function()
|
||||
ProduceInfantry() --Greece will start infantry production once this unit is dead just like in the original mission
|
||||
end)
|
||||
|
||||
Trigger.AfterDelay(DateTime.Seconds(1), function()
|
||||
local GreeceHarvesters = Greece.GetActorsByType("harv")
|
||||
Trigger.OnAllKilled(GreeceHarvesters, function()
|
||||
GreeceHarvestersAreDead = true
|
||||
end)
|
||||
end)
|
||||
|
||||
end
|
||||
|
||||
VolkovIsDead = function(a)
|
||||
Trigger.OnKilled(a, function()
|
||||
USSR.MarkFailedObjective(KeepVolkovAlive)
|
||||
end)
|
||||
end
|
||||
|
||||
ChitzkoiIsDead = function(a)
|
||||
Trigger.OnKilled(a, function()
|
||||
USSR.MarkFailedObjective(KeepChitzkoiAlive)
|
||||
Media.DisplayMessage(UserInterface.GetFluentMessage("rebuild-chitzkoi"))
|
||||
Trigger.AfterDelay(DateTime.Seconds(1), function()
|
||||
Media.PlaySpeechNotification(USSR, "ObjectiveNotMet")
|
||||
end)
|
||||
end)
|
||||
end
|
||||
36
mods/ra/maps/soviet-soldier-volkov-n-chitzkoi/weapons.yaml
Normal file
36
mods/ra/maps/soviet-soldier-volkov-n-chitzkoi/weapons.yaml
Normal file
@@ -0,0 +1,36 @@
|
||||
HeavyTurretGun:
|
||||
Inherits: TurretGun
|
||||
Range: 10c0
|
||||
|
||||
CydogJaw:
|
||||
Inherits: DogJaw
|
||||
Range: 5c512
|
||||
|
||||
VolkovWeapon:
|
||||
Inherits: SilencedPPK
|
||||
ReloadDelay: 25
|
||||
Range: 6c0
|
||||
ValidTargets: Ground, GroundActor, Water, WaterActor
|
||||
InvalidTargets: Bridge, Structure, Wall
|
||||
Warhead@1Dam: SpreadDamage
|
||||
Spread: 256
|
||||
Versus:
|
||||
None: 90
|
||||
Wood: 75
|
||||
Light: 60
|
||||
Heavy: 25
|
||||
Concrete: 50
|
||||
ValidTargets: Barrel, Infantry, Ship, Vehicle, Mine
|
||||
DamageTypes: Prone50Percent, TriggerProne, SmallExplosionDeath
|
||||
Warhead@2Smu: LeaveSmudge
|
||||
SmudgeType: Crater
|
||||
InvalidTargets: Vehicle, Structure, Wall, Husk, Trees
|
||||
Warhead@3Eff: CreateEffect
|
||||
Explosions: artillery_explosion
|
||||
ImpactSounds: kaboom25.aud
|
||||
ValidTargets: Ground, GroundActor, Ship, Trees
|
||||
Warhead@4EffWater: CreateEffect
|
||||
Explosions: small_splash
|
||||
ImpactSounds: splash9.aud
|
||||
ValidTargets: Water, Underwater
|
||||
InvalidTargets: Ship, Structure, Bridge
|
||||
Reference in New Issue
Block a user