Soviet Soldier Volkov & Chitzkoi fully ported
Crash fixed.
This commit is contained in:
1
AUTHORS
1
AUTHORS
@@ -104,6 +104,7 @@ Also thanks to:
|
|||||||
* Michael Rätzel
|
* Michael Rätzel
|
||||||
* Michael Silber (frühstück)
|
* Michael Silber (frühstück)
|
||||||
* Michael Sztolcman (s1w_)
|
* Michael Sztolcman (s1w_)
|
||||||
|
* Mike Gagné (AngryBirdz)
|
||||||
* Muh
|
* Muh
|
||||||
* Mustafa Alperen Seki (MustaphaTR)
|
* Mustafa Alperen Seki (MustaphaTR)
|
||||||
* Neil Shivkar (havok13888)
|
* Neil Shivkar (havok13888)
|
||||||
|
|||||||
@@ -96,6 +96,8 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Red Alert Lua scripts", "Re
|
|||||||
mods\ra\maps\soviet-06b\soviet06b-reinforcements_teams.lua = mods\ra\maps\soviet-06b\soviet06b-reinforcements_teams.lua
|
mods\ra\maps\soviet-06b\soviet06b-reinforcements_teams.lua = mods\ra\maps\soviet-06b\soviet06b-reinforcements_teams.lua
|
||||||
mods\ra\maps\soviet-06b\soviet06b.lua = mods\ra\maps\soviet-06b\soviet06b.lua
|
mods\ra\maps\soviet-06b\soviet06b.lua = mods\ra\maps\soviet-06b\soviet06b.lua
|
||||||
mods\ra\maps\soviet-07\soviet07.lua = mods\ra\maps\soviet-07\soviet07.lua
|
mods\ra\maps\soviet-07\soviet07.lua = mods\ra\maps\soviet-07\soviet07.lua
|
||||||
|
mods\ra\maps\soviet-soldier-volkov-n-chitzkoi\scu35ea.lua = mods\ra\maps\soviet-soldier-volkov-n-chitzkoi\scu35ea.lua
|
||||||
|
mods\ra\maps\soviet-soldier-volkov-n-chitzkoi\scu35ea-AI.lua = mods\ra\maps\soviet-soldier-volkov-n-chitzkoi\scu35ea-AI.lua
|
||||||
mods\ra\maps\survival01\survival01.lua = mods\ra\maps\survival01\survival01.lua
|
mods\ra\maps\survival01\survival01.lua = mods\ra\maps\survival01\survival01.lua
|
||||||
mods\ra\maps\survival02\survival02.lua = mods\ra\maps\survival02\survival02.lua
|
mods\ra\maps\survival02\survival02.lua = mods\ra\maps\survival02\survival02.lua
|
||||||
EndProjectSection
|
EndProjectSection
|
||||||
|
|||||||
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.
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: 26 KiB |
1442
mods/ra/maps/soviet-soldier-volkov-n-chitzkoi/map.yaml
Normal file
1442
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
|
||||||
206
mods/ra/maps/soviet-soldier-volkov-n-chitzkoi/rules.yaml
Normal file
206
mods/ra/maps/soviet-soldier-volkov-n-chitzkoi/rules.yaml
Normal file
@@ -0,0 +1,206 @@
|
|||||||
|
World:
|
||||||
|
LuaScript:
|
||||||
|
Scripts: scu35ea.lua, scu35ea-AI.lua
|
||||||
|
MissionData:
|
||||||
|
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.\n\nFor 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.\n\nThe mission is a success when Volkov destroys the control center, and our units destroy the alloy facility.\n
|
||||||
|
WinVideo: grvestne.vqa
|
||||||
|
LossVideo: sovcemet.vqa
|
||||||
|
ScriptLobbyDropdown@difficulty:
|
||||||
|
ID: difficulty
|
||||||
|
Label: Difficulty
|
||||||
|
Values:
|
||||||
|
easy: Easy
|
||||||
|
normal: Normal
|
||||||
|
hard: Hard
|
||||||
|
Default: easy
|
||||||
|
|
||||||
|
Player:
|
||||||
|
LobbyPrerequisiteCheckbox@GLOBALBOUNTY:
|
||||||
|
Enabled: False
|
||||||
|
Locked: True
|
||||||
|
|
||||||
|
MSLO:
|
||||||
|
Buildable:
|
||||||
|
Prerequisites: ~disabled
|
||||||
|
|
||||||
|
E7:
|
||||||
|
Buildable:
|
||||||
|
Prerequisites: ~disabled
|
||||||
|
Health:
|
||||||
|
HP: 25000
|
||||||
|
Armor:
|
||||||
|
Type: Heavy
|
||||||
|
|
||||||
|
2TNK:
|
||||||
|
Buildable:
|
||||||
|
Prerequisites: ~vehicles.allies, ~techlevel.medium
|
||||||
|
|
||||||
|
CA:
|
||||||
|
Buildable:
|
||||||
|
Prerequisites: ~syrd, ~techlevel.high
|
||||||
|
|
||||||
|
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:
|
||||||
|
Tooltip:
|
||||||
|
GenericName: Hospital
|
||||||
|
GenericVisibility: Enemy, Ally, Neutral
|
||||||
|
GenericStancePrefix: false
|
||||||
|
-TooltipDescription@ally:
|
||||||
|
-TooltipDescription@other:
|
||||||
|
SpawnActorOnDeath:
|
||||||
|
Actor: healcrate
|
||||||
|
|
||||||
|
MONEYCRATE:
|
||||||
|
GiveCashCrateAction:
|
||||||
|
Amount: 2000
|
||||||
|
|
||||||
|
^Vehicle:
|
||||||
|
-Demolishable:
|
||||||
|
|
||||||
|
^Mine:
|
||||||
|
Tooltip:
|
||||||
|
ShowOwnerRow: false
|
||||||
|
|
||||||
|
AFAC:
|
||||||
|
Inherits: BIO
|
||||||
|
Buildable:
|
||||||
|
Prerequisites: ~disabled
|
||||||
|
Health:
|
||||||
|
HP: 400000
|
||||||
|
Tooltip:
|
||||||
|
Name: Alloy Facility
|
||||||
|
GenericName: Alloy Facility
|
||||||
|
GenericVisibility: Enemy, Ally, Neutral
|
||||||
|
GenericStancePrefix: false
|
||||||
|
-TooltipDescription@ally:
|
||||||
|
-TooltipDescription@other:
|
||||||
|
-ExternalCapturable:
|
||||||
|
-ExternalCapturableBar:
|
||||||
|
-EngineerRepairable:
|
||||||
|
-GpsDot:
|
||||||
|
RenderSprites:
|
||||||
|
Image: BIO
|
||||||
|
|
||||||
|
CCEN:
|
||||||
|
Inherits: ATEK
|
||||||
|
Buildable:
|
||||||
|
Prerequisites: ~disabled
|
||||||
|
Tooltip:
|
||||||
|
Name: Control Center
|
||||||
|
GenericName: Control Center
|
||||||
|
GenericVisibility: Enemy, Ally, Neutral
|
||||||
|
GenericStancePrefix: false
|
||||||
|
-ExternalCapturable:
|
||||||
|
-ExternalCapturableBar:
|
||||||
|
-EngineerRepairable:
|
||||||
|
GpsPower:
|
||||||
|
Prerequisites: ~disabled
|
||||||
|
Power:
|
||||||
|
Amount: 200
|
||||||
|
RenderSprites:
|
||||||
|
Image: ATEK
|
||||||
|
|
||||||
|
HGUN:
|
||||||
|
Inherits: GUN
|
||||||
|
Buildable:
|
||||||
|
Prerequisites: ~disabled
|
||||||
|
Valued:
|
||||||
|
Cost: 2800
|
||||||
|
Tooltip:
|
||||||
|
Name: Heavy Turret Prototype
|
||||||
|
Health:
|
||||||
|
HP: 350000
|
||||||
|
Armor:
|
||||||
|
Type: Heavy
|
||||||
|
RevealsShroud:
|
||||||
|
Range: 8c0
|
||||||
|
Armament:
|
||||||
|
Weapon: HeavyTurretGun
|
||||||
|
RenderSprites:
|
||||||
|
Image: GUN
|
||||||
|
|
||||||
|
ZKOI:
|
||||||
|
Inherits: DOG
|
||||||
|
Buildable:
|
||||||
|
Prerequisites: ~disabled
|
||||||
|
Valued:
|
||||||
|
Cost: 2000
|
||||||
|
Tooltip:
|
||||||
|
Name: Chitzkoi
|
||||||
|
GenericName: Cyborg Dog
|
||||||
|
Health:
|
||||||
|
HP: 100000
|
||||||
|
-Crushable:
|
||||||
|
RevealsShroud:
|
||||||
|
Range: 7c0
|
||||||
|
Armament:
|
||||||
|
Weapon: CydogJaw
|
||||||
|
RenderSprites:
|
||||||
|
Image: DOG
|
||||||
|
|
||||||
|
VOLK:
|
||||||
|
Inherits: GNRL
|
||||||
|
Buildable:
|
||||||
|
Prerequisites: ~disabled
|
||||||
|
Valued:
|
||||||
|
Cost: 3000
|
||||||
|
Tooltip:
|
||||||
|
Name: Volkov
|
||||||
|
Health:
|
||||||
|
HP: 250000
|
||||||
|
Armor:
|
||||||
|
Type: Heavy
|
||||||
|
-Crushable:
|
||||||
|
RevealsShroud:
|
||||||
|
Range: 10c0
|
||||||
|
Demolition:
|
||||||
|
Mobile:
|
||||||
|
Voice: Action
|
||||||
|
AttackFrontal:
|
||||||
|
Voice: Action
|
||||||
|
AttackMove:
|
||||||
|
Voice: Action
|
||||||
|
Passenger:
|
||||||
|
Voice: Action
|
||||||
|
Guard:
|
||||||
|
Voice: Action
|
||||||
|
Voiced:
|
||||||
|
VoiceSet: GenericVoice
|
||||||
|
Armament:
|
||||||
|
Weapon: VolkovWeapon
|
||||||
|
DetectCloaked:
|
||||||
|
CloakTypes: Cloak, Hijacker
|
||||||
|
RenderSprites:
|
||||||
|
Image: GNRL
|
||||||
|
|
||||||
|
powerproxy.pararifles:
|
||||||
|
Inherits: powerproxy.paratroopers
|
||||||
|
ParatroopersPower:
|
||||||
|
DropItems: E1,E1,E1,E1,E1
|
||||||
112
mods/ra/maps/soviet-soldier-volkov-n-chitzkoi/scu35ea-AI.lua
Normal file
112
mods/ra/maps/soviet-soldier-volkov-n-chitzkoi/scu35ea-AI.lua
Normal file
@@ -0,0 +1,112 @@
|
|||||||
|
--[[
|
||||||
|
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.
|
||||||
|
]]
|
||||||
|
|
||||||
|
AlliedInfantryTypes = { "e1", "e3" }
|
||||||
|
if Map.LobbyOption("difficulty") == "easy" then
|
||||||
|
AlliedArmorTypes = { "1tnk", "1tnk" }
|
||||||
|
else
|
||||||
|
AlliedArmorTypes = { "1tnk", "2tnk" }
|
||||||
|
end
|
||||||
|
if Map.LobbyOption("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) fact.RallyPoint = Rally.Location end)
|
||||||
|
greece.Build(toBuild, function(unit)
|
||||||
|
ArmorAttack[#ArmorAttack + 1] = unit[1]
|
||||||
|
|
||||||
|
if #ArmorAttack >= ArmorAttackNumbers[Map.LobbyOption("difficulty")] then
|
||||||
|
SendAttackToBase(ArmorAttack)
|
||||||
|
ArmorAttack = { }
|
||||||
|
Trigger.AfterDelay(ArmorAttackDelays[Map.LobbyOption("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)
|
||||||
|
Utils.Do(nvgrd, function(unit)
|
||||||
|
Trigger.OnKilled(unit, ProduceNavyGuard)
|
||||||
|
end)
|
||||||
|
end)
|
||||||
|
end
|
||||||
376
mods/ra/maps/soviet-soldier-volkov-n-chitzkoi/scu35ea.lua
Normal file
376
mods/ra/maps/soviet-soldier-volkov-n-chitzkoi/scu35ea.lua
Normal file
@@ -0,0 +1,376 @@
|
|||||||
|
--[[
|
||||||
|
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.
|
||||||
|
]]
|
||||||
|
-- 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
|
||||||
|
player = 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 Map.LobbyOption("difficulty") == "easy" then
|
||||||
|
Trigger.AfterDelay(DateTime.Minutes(10), ProduceNavyGuard)
|
||||||
|
elseif Map.LobbyOption("difficulty") == "normal" then
|
||||||
|
Trigger.AfterDelay(DateTime.Minutes(5), ProduceNavyGuard)
|
||||||
|
elseif Map.LobbyOption("difficulty") == "hard" then
|
||||||
|
ProduceNavyGuard()
|
||||||
|
end
|
||||||
|
|
||||||
|
--Objectives Setup
|
||||||
|
Trigger.OnObjectiveAdded(player, function(p, id)
|
||||||
|
Media.DisplayMessage(p.GetObjectiveDescription(id), "New " .. string.lower(p.GetObjectiveType(id)) .. " objective")
|
||||||
|
end)
|
||||||
|
Trigger.OnObjectiveCompleted(player, function(p, id)
|
||||||
|
Media.DisplayMessage(p.GetObjectiveDescription(id), "Objective completed")
|
||||||
|
end)
|
||||||
|
Trigger.OnObjectiveFailed(player, function(p, id)
|
||||||
|
Media.DisplayMessage(p.GetObjectiveDescription(id), "Objective failed")
|
||||||
|
end)
|
||||||
|
|
||||||
|
DestroyControlCenter = player.AddPrimaryObjective("Destroy the Control Center.")
|
||||||
|
KeepTanksAlive = player.AddPrimaryObjective("Your tank division must not be destroyed before\n the alloy facility is dealt with.")
|
||||||
|
KeepVolkovAlive = player.AddPrimaryObjective("Keep Volkov Alive.")
|
||||||
|
KeepChitzkoiAlive = player.AddSecondaryObjective("Keep Chitzkoi Alive.")
|
||||||
|
|
||||||
|
Trigger.OnPlayerWon(player, function()
|
||||||
|
Media.PlaySpeechNotification(player, "MissionAccomplished")
|
||||||
|
end)
|
||||||
|
Trigger.OnPlayerLost(player, function()
|
||||||
|
Media.PlaySpeechNotification(player, "MissionFailed")
|
||||||
|
end)
|
||||||
|
|
||||||
|
Trigger.OnKilled(ControlCenter, function()
|
||||||
|
Utils.Do(HeavyTurrets, function(struc)
|
||||||
|
if not struc.IsDead then struc.Kill() end
|
||||||
|
end)
|
||||||
|
player.MarkCompletedObjective(DestroyControlCenter)
|
||||||
|
DestroyAlloyFacility = player.AddPrimaryObjective("Destroy the Alloy Facility.")
|
||||||
|
Media.PlaySpeechNotification(player, "FirstObjectiveMet")
|
||||||
|
Media.DisplayMessage("Excellent! The heavy turret control center is destroyed\n and now we can deal with the alloy facility.")
|
||||||
|
end)
|
||||||
|
|
||||||
|
Trigger.OnKilled(AlloyFacility, function()
|
||||||
|
if not player.IsObjectiveCompleted(DestroyControlCenter) then --Prevent a crash if the player somehow manage to cheese the mission and destroy
|
||||||
|
player.MarkCompletedObjective(DestroyControlCenter) --the Alloy Facility without destroying the Control Center.
|
||||||
|
DestroyAlloyFacility = player.AddPrimaryObjective("Destroy the Alloy Facility.")
|
||||||
|
end
|
||||||
|
Trigger.AfterDelay(DateTime.Seconds(2), function()
|
||||||
|
player.MarkCompletedObjective(DestroyAlloyFacility)
|
||||||
|
player.MarkCompletedObjective(KeepTanksAlive)
|
||||||
|
player.MarkCompletedObjective(KeepVolkovAlive)
|
||||||
|
player.MarkCompletedObjective(KeepChitzkoiAlive)
|
||||||
|
end)
|
||||||
|
AlloyFacilityDestroyed = true
|
||||||
|
Media.PlaySpeechNotification(player, "SecondObjectiveMet")
|
||||||
|
end)
|
||||||
|
|
||||||
|
Trigger.OnAllKilled(PlayerTankDivision, function()
|
||||||
|
if not AlloyFacilityDestroyed then player.MarkFailedObjective(KeepTanksAlive) end
|
||||||
|
end)
|
||||||
|
|
||||||
|
Trigger.AfterDelay(0, function()
|
||||||
|
local AlliedBaseCamera = Actor.Create("camera", true, { Owner = player, Location = waypoint12.Location })
|
||||||
|
local SuperTeamCamera = Actor.Create("camera", true, { Owner = player, 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 = player, Facing = (superteamdrop.CenterPosition - spawn).Facing, Health = 3 })
|
||||||
|
Utils.Do(SuperTeam, function(type)
|
||||||
|
local a = Actor.Create(type, false, { Owner = player })
|
||||||
|
transport.LoadPassenger(a)
|
||||||
|
if a.Type == "volk" then
|
||||||
|
VolkovIsDead(a)
|
||||||
|
end
|
||||||
|
if a.Type == "zkoi" then
|
||||||
|
ChitzkoiIsDead(a)
|
||||||
|
end
|
||||||
|
end)
|
||||||
|
Media.PlaySpeechNotification(player, "ReinforcementsArrived")
|
||||||
|
transport.Paradrop(CPos.New(21, 82))
|
||||||
|
end)
|
||||||
|
|
||||||
|
Trigger.OnEnteredFootprint(SuperTeamLandCell, function(unit, id)
|
||||||
|
if unit.Owner == player then
|
||||||
|
Trigger.RemoveFootprintTrigger(id)
|
||||||
|
Trigger.AfterDelay(DateTime.Seconds(2), function()
|
||||||
|
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
|
||||||
|
Utils.Do(InitialHuntTeam, function(actor)
|
||||||
|
if not actor.IsDead then
|
||||||
|
Trigger.OnIdle(actor, actor.Hunt)
|
||||||
|
end
|
||||||
|
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.New(70 * 70), function(unit, id)
|
||||||
|
if not RangerGuard01.IsDead and unit.Owner == player then
|
||||||
|
Trigger.OnIdle(RangerGuard01, RangerGuard01.Hunt)
|
||||||
|
Trigger.RemoveProximityTrigger(id)
|
||||||
|
end
|
||||||
|
end)
|
||||||
|
|
||||||
|
Trigger.OnEnteredProximityTrigger(waypoint7.CenterPosition, WDist.FromCells(6), function(unit, id)
|
||||||
|
if unit.Owner == player 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 == player 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 == player then
|
||||||
|
local HospitalCamera = Actor.Create("camera", true, { Owner = player, 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 not LightTankGuard02.IsDead and unit.Owner == player and (unit.Type == "volk" or unit.Type == "zkoi") then
|
||||||
|
Trigger.OnIdle(LightTankGuard02, LightTankGuard02.Hunt)
|
||||||
|
Trigger.RemoveProximityTrigger(id)
|
||||||
|
end
|
||||||
|
end)
|
||||||
|
|
||||||
|
--Tanya Squad Setup
|
||||||
|
Trigger.OnEnteredFootprint(TanyaTrigger, function(unit, id)
|
||||||
|
if unit.Owner == player then
|
||||||
|
if not TanyaSquadTanya.IsDead then
|
||||||
|
local TanyaSquadCamera = Actor.Create("camera", true, { Owner = player, Location = waypoint85.Location })
|
||||||
|
Media.PlaySoundNotification(player, "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 == player 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
|
||||||
|
Trigger.OnIdle(actor, actor.Hunt)
|
||||||
|
end
|
||||||
|
end)
|
||||||
|
end
|
||||||
|
Trigger.RemoveFootprintTrigger(id)
|
||||||
|
end
|
||||||
|
end)
|
||||||
|
|
||||||
|
Trigger.OnEnteredFootprint(CivTeam02Trigger, function(unit, id)
|
||||||
|
if unit.Owner == player 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
|
||||||
|
Trigger.OnIdle(actor, actor.Hunt)
|
||||||
|
end
|
||||||
|
end)
|
||||||
|
end
|
||||||
|
Trigger.RemoveFootprintTrigger(id)
|
||||||
|
end
|
||||||
|
end)
|
||||||
|
|
||||||
|
--Minefield Setup
|
||||||
|
Trigger.OnEnteredFootprint(MineSoldierTrigger, function(unit, id)
|
||||||
|
if unit.Owner == player then
|
||||||
|
local MineSoldierCamera1 = Actor.Create("camera", true, { Owner = player, 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 = player, 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 == player then
|
||||||
|
local powerproxy = Actor.Create("powerproxy.pararifles", true, { Owner = greece })
|
||||||
|
local paratroopers = powerproxy.SendParatroopers(waypoint89.CenterPosition, false, Facing.South)
|
||||||
|
local prtcamera = Actor.Create("camera", true, { Owner = player, Location = waypoint89.Location })
|
||||||
|
Trigger.AfterDelay(DateTime.Seconds(10), function()
|
||||||
|
if prtcamera.IsInWorld then prtcamera.Destroy() end
|
||||||
|
end)
|
||||||
|
Utils.Do(paratroopers, function(unit)
|
||||||
|
if not unit.IsDead then
|
||||||
|
Trigger.OnIdle(unit, function(unit)
|
||||||
|
if unit.IsInWorld then
|
||||||
|
unit.Hunt()
|
||||||
|
end
|
||||||
|
end)
|
||||||
|
end
|
||||||
|
end)
|
||||||
|
if Map.LobbyOption("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()
|
||||||
|
player.MarkFailedObjective(KeepVolkovAlive)
|
||||||
|
end)
|
||||||
|
end
|
||||||
|
|
||||||
|
ChitzkoiIsDead = function(a)
|
||||||
|
Trigger.OnKilled(a, function()
|
||||||
|
player.MarkFailedObjective(KeepChitzkoiAlive)
|
||||||
|
Media.DisplayMessage("We can rebuild Chitzkoi. We have the technology.")
|
||||||
|
Trigger.AfterDelay(DateTime.Seconds(1), function()
|
||||||
|
Media.PlaySpeechNotification(player, "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:
|
||||||
|
InvalidTargets: Air, Bridge, Structure
|
||||||
|
Warhead@1Dam: SpreadDamage
|
||||||
|
Spread: 256
|
||||||
|
Versus:
|
||||||
|
None: 90
|
||||||
|
Wood: 75
|
||||||
|
Light: 60
|
||||||
|
Heavy: 25
|
||||||
|
Concrete: 50
|
||||||
|
-ValidTargets:
|
||||||
|
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, 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