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:
142
mods/cnc/maps/gdi04a/gdi04a.lua
Normal file
142
mods/cnc/maps/gdi04a/gdi04a.lua
Normal file
@@ -0,0 +1,142 @@
|
||||
--[[
|
||||
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.
|
||||
]]
|
||||
|
||||
AutoTrigger = { CPos.New(51, 47), CPos.New(52, 47), CPos.New(53, 47), CPos.New(54, 47) }
|
||||
GDIHeliTrigger = { CPos.New(27, 55), CPos.New(27, 56), CPos.New(28, 56), CPos.New(28, 57), CPos.New(28, 58), CPos.New(28, 59)}
|
||||
|
||||
NodUnits = { "e1", "e1", "e3", "e3" }
|
||||
AutoUnits = { "e1", "e1", "e3" }
|
||||
|
||||
KillsUntilReinforcements = 12
|
||||
HeliDelay = { 83, 137, 211 }
|
||||
|
||||
GDIReinforcements = { "e2", "e2", "e2", "e2", "e2" }
|
||||
GDIReinforcementsWaypoints = { GDIReinforcementsEntry.Location, GDIReinforcementsWP1.Location }
|
||||
GDIReinforcementsLeft = 3
|
||||
|
||||
NodHelis =
|
||||
{
|
||||
{ delay = DateTime.Seconds(HeliDelay[1]), entry = { NodHeliEntry.Location, NodHeliLZ1.Location }, types = { "e1", "e1", "e3" } },
|
||||
{ delay = DateTime.Seconds(HeliDelay[2]), entry = { NodHeliEntry.Location, NodHeliLZ2.Location }, types = { "e1", "e1", "e1", "e1" } },
|
||||
{ delay = DateTime.Seconds(HeliDelay[3]), entry = { NodHeliEntry.Location, NodHeliLZ3.Location }, types = { "e1", "e1", "e3" } }
|
||||
}
|
||||
|
||||
Kills = 0
|
||||
NodUnitKilled = function()
|
||||
Kills = Kills + 1
|
||||
|
||||
if Kills == KillsUntilReinforcements then
|
||||
GDI.MarkCompletedObjective(ReinforcementsObjective)
|
||||
SendGDIReinforcements()
|
||||
end
|
||||
end
|
||||
|
||||
SendHeli = function(heli)
|
||||
local units = Reinforcements.ReinforceWithTransport(Nod, "tran", heli.types, heli.entry, { heli.entry[1] })
|
||||
Utils.Do(units[2], function(actor)
|
||||
IdleHunt(actor)
|
||||
Trigger.OnKilled(actor, NodUnitKilled)
|
||||
end)
|
||||
Trigger.AfterDelay(heli.delay, function() SendHeli(heli) end)
|
||||
end
|
||||
|
||||
SendGDIReinforcements = function()
|
||||
Media.PlaySpeechNotification(GDI, "Reinforce")
|
||||
Reinforcements.ReinforceWithTransport(GDI, "apc", GDIReinforcements, GDIReinforcementsWaypoints, nil, function(apc, team)
|
||||
table.insert(team, apc)
|
||||
Trigger.OnAllKilled(team, function()
|
||||
if GDIReinforcementsLeft > 0 then
|
||||
GDIReinforcementsLeft = GDIReinforcementsLeft - 1
|
||||
Trigger.AfterDelay(DateTime.Seconds(5), function()
|
||||
Media.DisplayMessage(UserInterface.GetFluentMessage("apcs-left", { ["apcs"] = GDIReinforcementsLeft }), UserInterface.GetFluentMessage("battlefield-control"))
|
||||
SendGDIReinforcements()
|
||||
end)
|
||||
end
|
||||
end)
|
||||
end)
|
||||
end
|
||||
|
||||
BuildNod = function()
|
||||
local after = function(team)
|
||||
Utils.Do(team, function(actor)
|
||||
Trigger.OnIdle(actor, actor.Hunt)
|
||||
Trigger.OnKilled(actor, NodUnitKilled)
|
||||
end)
|
||||
Trigger.OnAllKilled(team, BuildNod)
|
||||
end
|
||||
|
||||
ProduceUnits(Nod, HandOfNod, nil, function() return NodUnits end, after)
|
||||
end
|
||||
|
||||
BuildAuto = function()
|
||||
local after = function(team)
|
||||
Utils.Do(team, function(actor)
|
||||
Trigger.OnIdle(actor, actor.Hunt)
|
||||
Trigger.OnKilled(actor, NodUnitKilled)
|
||||
end)
|
||||
end
|
||||
|
||||
local delay = function() return DateTime.Seconds(5) end
|
||||
ProduceUnits(Nod, HandOfNod, delay, function() return AutoUnits end, after)
|
||||
end
|
||||
|
||||
Tick = function()
|
||||
Nod.Cash = 1000
|
||||
|
||||
if (GDIReinforcementsLeft == 0 or not GDI.IsObjectiveCompleted(ReinforcementsObjective)) and GDI.HasNoRequiredUnits() then
|
||||
GDI.MarkFailedObjective(GDIObjective)
|
||||
end
|
||||
end
|
||||
|
||||
SetupWorld = function()
|
||||
Utils.Do(Nod.GetGroundAttackers(), function(unit)
|
||||
Trigger.OnKilled(unit, NodUnitKilled)
|
||||
end)
|
||||
|
||||
Hunter1.Hunt()
|
||||
Hunter2.Hunt()
|
||||
|
||||
Trigger.OnRemovedFromWorld(crate, function() GDI.MarkCompletedObjective(GDIObjective) end)
|
||||
end
|
||||
|
||||
WorldLoaded = function()
|
||||
GDI = Player.GetPlayer("GDI")
|
||||
Nod = Player.GetPlayer("Nod")
|
||||
|
||||
SetupWorld()
|
||||
|
||||
InitObjectives(GDI)
|
||||
|
||||
GDIObjective = AddPrimaryObjective(GDI, "retrieve-rods")
|
||||
local eliminateReinforcements = UserInterface.GetFluentMessage("eliminate-reinforcements", { ["kills"] = KillsUntilReinforcements })
|
||||
ReinforcementsObjective = AddSecondaryObjective(GDI, eliminateReinforcements)
|
||||
|
||||
BuildNod()
|
||||
Utils.Do(NodHelis, function(heli)
|
||||
Trigger.AfterDelay(heli.delay, function() SendHeli(heli) end)
|
||||
end)
|
||||
|
||||
Trigger.OnEnteredFootprint(AutoTrigger, function(a, id)
|
||||
if not AutoTriggered and a.Owner == GDI then
|
||||
AutoTriggered = true
|
||||
Trigger.RemoveFootprintTrigger(id)
|
||||
BuildAuto()
|
||||
end
|
||||
end)
|
||||
|
||||
Trigger.OnEnteredFootprint(GDIHeliTrigger, function(a, id)
|
||||
if not GDIHeliTriggered and a.Owner == GDI then
|
||||
GDIHeliTriggered = true
|
||||
Trigger.RemoveFootprintTrigger(id)
|
||||
Reinforcements.ReinforceWithTransport(GDI, "tran", nil, { GDIHeliEntry.Location, GDIHeliLZ.Location })
|
||||
end
|
||||
end)
|
||||
|
||||
Camera.Position = Actor56.CenterPosition
|
||||
end
|
||||
BIN
mods/cnc/maps/gdi04a/map.bin
Normal file
BIN
mods/cnc/maps/gdi04a/map.bin
Normal file
Binary file not shown.
9
mods/cnc/maps/gdi04a/map.ftl
Normal file
9
mods/cnc/maps/gdi04a/map.ftl
Normal file
@@ -0,0 +1,9 @@
|
||||
## rules.yaml
|
||||
briefing =
|
||||
Nod has captured classified GDI property.
|
||||
|
||||
You must find and retrieve the stolen equipment.
|
||||
|
||||
It is being transported in a shipping crate.
|
||||
|
||||
Use the new APC to safely transport infantry through Nod forces.
|
||||
BIN
mods/cnc/maps/gdi04a/map.png
Normal file
BIN
mods/cnc/maps/gdi04a/map.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 46 KiB |
455
mods/cnc/maps/gdi04a/map.yaml
Normal file
455
mods/cnc/maps/gdi04a/map.yaml
Normal file
@@ -0,0 +1,455 @@
|
||||
MapFormat: 12
|
||||
|
||||
RequiresMod: cnc
|
||||
|
||||
Title: 04a: Get the Rods back
|
||||
|
||||
Author: Westwood Studios
|
||||
|
||||
Tileset: TEMPERAT
|
||||
|
||||
MapSize: 64,64
|
||||
|
||||
Bounds: 7,24,51,36
|
||||
|
||||
Visibility: MissionSelector
|
||||
|
||||
Categories: Campaign
|
||||
|
||||
LockPreview: True
|
||||
|
||||
Players:
|
||||
PlayerReference@Nod:
|
||||
Name: Nod
|
||||
Faction: nod
|
||||
Color: FE1100
|
||||
Allies: Nod
|
||||
Enemies: GDI
|
||||
Bot: campaign
|
||||
PlayerReference@GDI:
|
||||
Name: GDI
|
||||
Playable: True
|
||||
AllowBots: False
|
||||
Required: True
|
||||
LockFaction: True
|
||||
Faction: gdi
|
||||
LockColor: True
|
||||
Color: F5D378
|
||||
LockSpawn: True
|
||||
LockTeam: True
|
||||
Allies: GDI
|
||||
Enemies: Nod
|
||||
PlayerReference@Neutral:
|
||||
Name: Neutral
|
||||
OwnsWorld: True
|
||||
NonCombatant: True
|
||||
Faction: gdi
|
||||
|
||||
Actors:
|
||||
Actor0: cycl
|
||||
Location: 26,59
|
||||
Owner: Neutral
|
||||
Actor1: cycl
|
||||
Location: 25,59
|
||||
Owner: Neutral
|
||||
Actor2: cycl
|
||||
Location: 24,59
|
||||
Owner: Neutral
|
||||
Actor3: cycl
|
||||
Location: 26,58
|
||||
Owner: Neutral
|
||||
Actor4: cycl
|
||||
Location: 24,58
|
||||
Owner: Neutral
|
||||
Actor5: t11
|
||||
Location: 37,43
|
||||
Owner: Neutral
|
||||
Actor6: t11
|
||||
Location: 24,43
|
||||
Owner: Neutral
|
||||
Actor7: t08
|
||||
Location: 46,26
|
||||
Owner: Neutral
|
||||
Actor9: t17
|
||||
Location: 42,24
|
||||
Owner: Neutral
|
||||
Actor10: tc02
|
||||
Location: 50,28
|
||||
Owner: Neutral
|
||||
Actor12: tc01
|
||||
Location: 17,48
|
||||
Owner: Neutral
|
||||
Actor13: tc04
|
||||
Location: 14,47
|
||||
Owner: Neutral
|
||||
Actor14: tc02
|
||||
Location: 15,56
|
||||
Owner: Neutral
|
||||
Actor15: tc03
|
||||
Location: 13,56
|
||||
Owner: Neutral
|
||||
Actor16: tc05
|
||||
Location: 32,24
|
||||
Owner: Neutral
|
||||
Actor17: tc05
|
||||
Location: 16,46
|
||||
Owner: Neutral
|
||||
Actor18: tc05
|
||||
Location: 12,36
|
||||
Owner: Neutral
|
||||
Actor19: tc04
|
||||
Location: 15,41
|
||||
Owner: Neutral
|
||||
Actor20: tc04
|
||||
Location: 24,41
|
||||
Owner: Neutral
|
||||
Actor21: tc04
|
||||
Location: 33,39
|
||||
Owner: Neutral
|
||||
Actor22: tc04
|
||||
Location: 44,34
|
||||
Owner: Neutral
|
||||
Actor23: tc04
|
||||
Location: 36,24
|
||||
Owner: Neutral
|
||||
Actor24: tc04
|
||||
Location: 23,35
|
||||
Owner: Neutral
|
||||
Actor25: tc03
|
||||
Location: 47,35
|
||||
Owner: Neutral
|
||||
Actor26: tc02
|
||||
Location: 49,35
|
||||
Owner: Neutral
|
||||
Actor27: tc04
|
||||
Location: 40,25
|
||||
Owner: Neutral
|
||||
Actor28: tc01
|
||||
Location: 37,25
|
||||
Owner: Neutral
|
||||
Actor29: t01
|
||||
Location: 11,29
|
||||
Owner: Neutral
|
||||
Actor30: t08
|
||||
Location: 14,27
|
||||
Owner: Neutral
|
||||
Actor31: t08
|
||||
Location: 22,35
|
||||
Owner: Neutral
|
||||
Actor32: t07
|
||||
Location: 25,34
|
||||
Owner: Neutral
|
||||
Actor33: t07
|
||||
Location: 21,27
|
||||
Owner: Neutral
|
||||
Actor34: t08
|
||||
Location: 27,31
|
||||
Owner: Neutral
|
||||
Actor35: t06
|
||||
Location: 26,31
|
||||
Owner: Neutral
|
||||
Actor36: t06
|
||||
Location: 23,24
|
||||
Owner: Neutral
|
||||
Actor38: t07
|
||||
Location: 12,35
|
||||
Owner: Neutral
|
||||
Actor39: t05
|
||||
Location: 13,42
|
||||
Owner: Neutral
|
||||
Actor40: tc01
|
||||
Location: 14,57
|
||||
Owner: Neutral
|
||||
Actor41: t11
|
||||
Location: 14,34
|
||||
Owner: Neutral
|
||||
Actor42: t01
|
||||
Location: 36,39
|
||||
Owner: Neutral
|
||||
Actor43: t08
|
||||
Location: 34,45
|
||||
Owner: Neutral
|
||||
Actor44: t07
|
||||
Location: 33,44
|
||||
Owner: Neutral
|
||||
Actor45: t06
|
||||
Location: 32,44
|
||||
Owner: Neutral
|
||||
Actor46: tc03
|
||||
Location: 7,25
|
||||
Owner: Neutral
|
||||
Actor47: t11
|
||||
Location: 11,24
|
||||
Owner: Neutral
|
||||
Actor48: tc02
|
||||
Location: 35,38
|
||||
Owner: Neutral
|
||||
Actor49: tc03
|
||||
Location: 33,38
|
||||
Owner: Neutral
|
||||
Actor50: hq
|
||||
Location: 29,57
|
||||
Owner: Nod
|
||||
Actor51: nuke
|
||||
Location: 28,54
|
||||
Owner: Nod
|
||||
Actor54: bggy
|
||||
Location: 55,53
|
||||
Owner: Nod
|
||||
Facing: 128
|
||||
Actor55: bggy
|
||||
Location: 38,43
|
||||
Owner: Nod
|
||||
Facing: 256
|
||||
Actor56: jeep
|
||||
Location: 13,53
|
||||
Owner: GDI
|
||||
Actor58: bggy
|
||||
Location: 31,57
|
||||
Owner: Nod
|
||||
Facing: 128
|
||||
Actor59: apc
|
||||
Location: 14,53
|
||||
Owner: GDI
|
||||
Actor60: apc
|
||||
Location: 12,53
|
||||
Owner: GDI
|
||||
Actor61: bggy
|
||||
Location: 26,27
|
||||
Owner: Nod
|
||||
Facing: 640
|
||||
Actor62: bggy
|
||||
Location: 51,27
|
||||
Owner: Nod
|
||||
Facing: 640
|
||||
Actor63: ltnk
|
||||
Location: 44,53
|
||||
Owner: Nod
|
||||
Facing: 768
|
||||
Actor64: e3
|
||||
Location: 45,36
|
||||
Owner: Nod
|
||||
SubCell: 1
|
||||
Actor65: e3
|
||||
Location: 40,25
|
||||
Owner: Nod
|
||||
SubCell: 0
|
||||
Actor66: e3
|
||||
Location: 36,41
|
||||
Owner: Nod
|
||||
Facing: 640
|
||||
SubCell: 0
|
||||
Actor67: e3
|
||||
Location: 39,42
|
||||
Owner: Nod
|
||||
Facing: 640
|
||||
SubCell: 3
|
||||
Actor68: e3
|
||||
Location: 12,24
|
||||
Owner: Nod
|
||||
Facing: 384
|
||||
SubCell: 4
|
||||
Actor69: e3
|
||||
Location: 37,43
|
||||
Owner: Nod
|
||||
Facing: 768
|
||||
SubCell: 4
|
||||
Actor70: e2
|
||||
Location: 14,54
|
||||
Owner: GDI
|
||||
SubCell: 3
|
||||
Actor710: e1
|
||||
Location: 12,54
|
||||
Owner: GDI
|
||||
SubCell: 5
|
||||
Actor71: e1
|
||||
Location: 12,54
|
||||
Owner: GDI
|
||||
SubCell: 1
|
||||
Actor72: e1
|
||||
Location: 12,54
|
||||
Owner: GDI
|
||||
SubCell: 3
|
||||
Actor73: e1
|
||||
Location: 15,41
|
||||
Owner: Nod
|
||||
Facing: 384
|
||||
SubCell: 4
|
||||
Actor74: e1
|
||||
Location: 24,35
|
||||
Owner: Nod
|
||||
Facing: 896
|
||||
SubCell: 4
|
||||
Actor75: e1
|
||||
Location: 36,29
|
||||
Owner: Nod
|
||||
Facing: 768
|
||||
SubCell: 1
|
||||
Actor76: e1
|
||||
Location: 28,27
|
||||
Owner: Nod
|
||||
Facing: 512
|
||||
SubCell: 4
|
||||
Actor77: e1
|
||||
Location: 32,30
|
||||
Owner: Nod
|
||||
Facing: 896
|
||||
SubCell: 0
|
||||
Actor78: e1
|
||||
Location: 33,44
|
||||
Owner: Nod
|
||||
Facing: 768
|
||||
SubCell: 4
|
||||
Actor79: e1
|
||||
Location: 45,36
|
||||
Owner: Nod
|
||||
Facing: 640
|
||||
SubCell: 2
|
||||
Actor80: e3
|
||||
Location: 52,44
|
||||
Owner: Nod
|
||||
SubCell: 2
|
||||
Actor81: e3
|
||||
Location: 52,43
|
||||
Owner: Nod
|
||||
SubCell: 0
|
||||
Actor82: e3
|
||||
Location: 52,44
|
||||
Owner: Nod
|
||||
SubCell: 1
|
||||
Actor83: e1
|
||||
Location: 13,27
|
||||
Owner: Nod
|
||||
Facing: 512
|
||||
SubCell: 2
|
||||
Actor84: e1
|
||||
Location: 13,36
|
||||
Owner: Nod
|
||||
Facing: 256
|
||||
SubCell: 3
|
||||
Actor85: e1
|
||||
Location: 11,29
|
||||
Owner: Nod
|
||||
Facing: 256
|
||||
SubCell: 4
|
||||
Actor860: e2
|
||||
Location: 14,54
|
||||
Owner: GDI
|
||||
SubCell: 5
|
||||
Actor86: e2
|
||||
Location: 14,54
|
||||
Owner: GDI
|
||||
SubCell: 2
|
||||
Actor87: e2
|
||||
Location: 14,54
|
||||
Owner: GDI
|
||||
SubCell: 1
|
||||
Actor88: e2
|
||||
Location: 14,54
|
||||
Owner: GDI
|
||||
SubCell: 4
|
||||
Actor89: e1
|
||||
Location: 12,54
|
||||
Owner: GDI
|
||||
SubCell: 2
|
||||
Actor90: e1
|
||||
Location: 12,54
|
||||
Owner: GDI
|
||||
SubCell: 4
|
||||
Actor91: e3
|
||||
Location: 55,41
|
||||
Owner: Nod
|
||||
Facing: 768
|
||||
SubCell: 2
|
||||
Actor92: e3
|
||||
Location: 48,42
|
||||
Owner: Nod
|
||||
Facing: 256
|
||||
SubCell: 2
|
||||
Actor93: e1
|
||||
Location: 50,26
|
||||
Owner: Nod
|
||||
Facing: 768
|
||||
SubCell: 4
|
||||
Actor94: e1
|
||||
Location: 50,28
|
||||
Owner: Nod
|
||||
Facing: 768
|
||||
SubCell: 0
|
||||
Actor95: e1
|
||||
Location: 52,26
|
||||
Owner: Nod
|
||||
Facing: 256
|
||||
SubCell: 3
|
||||
Actor96: e1
|
||||
Location: 25,43
|
||||
Owner: Nod
|
||||
Facing: 128
|
||||
SubCell: 4
|
||||
Actor97: e1
|
||||
Location: 25,26
|
||||
Owner: Nod
|
||||
Facing: 640
|
||||
SubCell: 1
|
||||
Actor98: e1
|
||||
Location: 30,30
|
||||
Owner: Nod
|
||||
SubCell: 4
|
||||
Actor99: e3
|
||||
Location: 21,50
|
||||
Owner: Nod
|
||||
Facing: 768
|
||||
SubCell: 1
|
||||
Actor100: e3
|
||||
Location: 25,53
|
||||
Owner: Nod
|
||||
Facing: 768
|
||||
SubCell: 3
|
||||
Actor101: moneycrate
|
||||
Location: 56,23
|
||||
Owner: Neutral
|
||||
HandOfNod: hand
|
||||
Location: 30,53
|
||||
Owner: Nod
|
||||
Hunter1: bggy
|
||||
Location: 35,43
|
||||
Owner: Nod
|
||||
Facing: 768
|
||||
Hunter2: bggy
|
||||
Location: 32,43
|
||||
Owner: Nod
|
||||
Facing: 768
|
||||
crate: CRATE.plain
|
||||
Location: 25,58
|
||||
Owner: Neutral
|
||||
NodHeliEntry: waypoint
|
||||
Location: 41,24
|
||||
Owner: Neutral
|
||||
NodHeliLZ1: waypoint
|
||||
Location: 31,39
|
||||
Owner: Neutral
|
||||
NodHeliLZ2: waypoint
|
||||
Location: 17,28
|
||||
Owner: Neutral
|
||||
NodHeliLZ3: waypoint
|
||||
Location: 53,32
|
||||
Owner: Neutral
|
||||
GDIReinforcementsEntry: waypoint
|
||||
Location: 7,50
|
||||
Owner: Neutral
|
||||
GDIReinforcementsWP1: waypoint
|
||||
Location: 11,52
|
||||
Owner: Neutral
|
||||
GDIReinforcementsWP2: waypoint
|
||||
Location: 11,51
|
||||
Owner: Neutral
|
||||
GDIHeliEntry: waypoint
|
||||
Location: 34,59
|
||||
Owner: Neutral
|
||||
GDIHeliLZ: waypoint
|
||||
Location: 27,58
|
||||
Owner: Neutral
|
||||
|
||||
Rules: cnc|rules/campaign-maprules.yaml, cnc|rules/campaign-tooltips.yaml, cnc|rules/campaign-palettes.yaml, rules.yaml
|
||||
|
||||
FluentMessages: cnc|fluent/lua.ftl, cnc|fluent/campaign.ftl, map.ftl
|
||||
16
mods/cnc/maps/gdi04a/rules.yaml
Normal file
16
mods/cnc/maps/gdi04a/rules.yaml
Normal file
@@ -0,0 +1,16 @@
|
||||
World:
|
||||
LuaScript:
|
||||
Scripts: campaign.lua, utils.lua, gdi04a.lua
|
||||
MusicPlaylist:
|
||||
StartingMusic: fist226m
|
||||
MissionData:
|
||||
Briefing: briefing
|
||||
BackgroundVideo: bkground.vqa
|
||||
BriefingVideo: gdi4b.vqa
|
||||
StartVideo: nitejump.vqa
|
||||
WinVideo: burdet1.vqa
|
||||
LossVideo: gameover.vqa
|
||||
|
||||
Player:
|
||||
PlayerResources:
|
||||
DefaultCash: 0
|
||||
Reference in New Issue
Block a user