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:
81
mods/ra/scripts/campaign.lua
Normal file
81
mods/ra/scripts/campaign.lua
Normal file
@@ -0,0 +1,81 @@
|
||||
--[[
|
||||
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.
|
||||
]]
|
||||
|
||||
Difficulty = Map.LobbyOptionOrDefault("difficulty", "normal")
|
||||
|
||||
--- Prepare basic messages for a player's win, loss, or objective updates.
|
||||
---@param player player
|
||||
InitObjectives = function(player)
|
||||
Trigger.OnObjectiveCompleted(player, function(p, id)
|
||||
Media.DisplayMessage(p.GetObjectiveDescription(id), UserInterface.GetFluentMessage("objective-completed"))
|
||||
end)
|
||||
Trigger.OnObjectiveFailed(player, function(p, id)
|
||||
Media.DisplayMessage(p.GetObjectiveDescription(id), UserInterface.GetFluentMessage("objective-failed"))
|
||||
end)
|
||||
|
||||
Trigger.OnPlayerLost(player, function()
|
||||
Trigger.AfterDelay(DateTime.Seconds(1), function()
|
||||
Media.PlaySpeechNotification(player, "MissionFailed")
|
||||
end)
|
||||
end)
|
||||
|
||||
Trigger.OnPlayerWon(player, function()
|
||||
Trigger.AfterDelay(DateTime.Seconds(1), function()
|
||||
Media.PlaySpeechNotification(player, "MissionAccomplished")
|
||||
end)
|
||||
end)
|
||||
end
|
||||
|
||||
AttackAircraftTargets = { }
|
||||
--- Order an aircraft to seek and attack an enemy player's units whenever idle.
|
||||
--- Each target is focused until it can no longer be attacked.
|
||||
---@param aircraft actor
|
||||
---@param enemyPlayer player
|
||||
InitializeAttackAircraft = function(aircraft, enemyPlayer)
|
||||
Trigger.OnIdle(aircraft, function()
|
||||
local actorId = tostring(aircraft)
|
||||
local target = AttackAircraftTargets[actorId]
|
||||
|
||||
if not target or not target.IsInWorld then
|
||||
target = ChooseRandomTarget(aircraft, enemyPlayer)
|
||||
end
|
||||
|
||||
if target then
|
||||
AttackAircraftTargets[actorId] = target
|
||||
aircraft.Attack(target)
|
||||
else
|
||||
AttackAircraftTargets[actorId] = nil
|
||||
aircraft.ReturnToBase()
|
||||
end
|
||||
end)
|
||||
end
|
||||
|
||||
--- Return a random enemy target for an actor.
|
||||
---@param unit actor Actor to be given a target.
|
||||
---@param enemyPlayer player Player to be targeted.
|
||||
---@return actor|nil
|
||||
ChooseRandomTarget = function(unit, enemyPlayer)
|
||||
local target = nil
|
||||
local enemies = Utils.Where(enemyPlayer.GetActors(), function(self)
|
||||
return self.HasProperty("Health") and unit.CanTarget(self) and not Utils.Any({ "sbag", "fenc", "brik", "cycl", "barb" }, function(type) return self.Type == type end)
|
||||
end)
|
||||
if #enemies > 0 then
|
||||
target = Utils.Random(enemies)
|
||||
end
|
||||
return target
|
||||
end
|
||||
|
||||
--- Call a function when one of the actors in a group is damaged. The callback function will be called as func(self: actor, attacker: actor, damage: integer).
|
||||
---@param actors actor[]
|
||||
---@param func fun(self: actor, attacker: actor, damage: integer)
|
||||
OnAnyDamaged = function(actors, func)
|
||||
Utils.Do(actors, function(actor)
|
||||
Trigger.OnDamaged(actor, func)
|
||||
end)
|
||||
end
|
||||
Reference in New Issue
Block a user