Merge pull request #4179 from ScottNZ/lua

Lua stuffs
This commit is contained in:
Paul Chote
2013-11-29 14:17:17 -08:00
34 changed files with 2679 additions and 48 deletions

View File

@@ -52,6 +52,7 @@ NEW:
Adjusted Zombie build palette position.
Fixed attack dogs causing crashes by attacking non-infantry.
Disabled cloak/uncloak sound for camouflaged Pillbox.
Added two Lua-powered single player missions, ported from Red Alert's single player campaign.
Tiberian Dawn:
C&C mod renamed to Tiberian Dawn to resolve naming ambiguities.
Fixed Bio Lab wrongly belonging to a hostile faction in East vs West 3.

View File

@@ -40,6 +40,9 @@ namespace OpenRA.Graphics
// Viewport geometry (world-px)
public int2 CenterLocation { get; private set; }
public WPos CenterPosition { get { return worldRenderer.Position(CenterLocation); } }
public int2 TopLeft { get { return CenterLocation - viewportSize / 2; } }
public int2 BottomRight { get { return CenterLocation + viewportSize / 2; } }
int2 viewportSize;

View File

@@ -46,7 +46,7 @@ namespace OpenRA
public bool ObserveAfterWinOrLose;
public Player RenderPlayer
{
get { return renderPlayer == null || (ObserveAfterWinOrLose && renderPlayer.WinState != WinState.Undefined)? null : renderPlayer; }
get { return renderPlayer == null || (ObserveAfterWinOrLose && renderPlayer.WinState != WinState.Undefined) ? null : renderPlayer; }
set { renderPlayer = value; }
}
@@ -71,7 +71,7 @@ namespace OpenRA
if (orderManager.Connection is ReplayConnection)
return;
LocalPlayer = Players.FirstOrDefault(p => p.InternalName == pr);
LocalPlayer = Players.FirstOrDefault(p => p.InternalName == pr);
RenderPlayer = LocalPlayer;
}
@@ -89,7 +89,7 @@ namespace OpenRA
get { return orderGenerator_; }
set
{
Sync.AssertUnsynced( "The current order generator may not be changed from synced code" );
Sync.AssertUnsynced("The current order generator may not be changed from synced code");
orderGenerator_ = value;
}
}
@@ -145,16 +145,16 @@ namespace OpenRA
wlh.WorldLoaded(this, wr);
}
public Actor CreateActor( string name, TypeDictionary initDict )
public Actor CreateActor(string name, TypeDictionary initDict)
{
return CreateActor( true, name, initDict );
return CreateActor(true, name, initDict);
}
public Actor CreateActor( bool addToWorld, string name, TypeDictionary initDict )
public Actor CreateActor(bool addToWorld, string name, TypeDictionary initDict)
{
var a = new Actor( this, name, initDict );
if( addToWorld )
Add( a );
var a = new Actor(this, name, initDict);
if (addToWorld)
Add(a);
return a;
}
@@ -188,14 +188,23 @@ namespace OpenRA
public bool Paused { get; internal set; }
public bool PredictedPaused { get; internal set; }
public bool PauseStateLocked { get; set; }
public bool IsShellmap = false;
public void SetPauseState(bool paused)
{
if (PauseStateLocked)
return;
IssueOrder(Order.PauseGame(paused));
PredictedPaused = paused;
}
public void SetLocalPauseState(bool paused)
{
Paused = PredictedPaused = paused;
}
public void Tick()
{
if (!Paused && (!IsShellmap || Game.Settings.Game.ShowShellmap))
@@ -206,12 +215,12 @@ namespace OpenRA
ni.Trait.TickIdle(ni.Actor);
using (new PerfSample("tick_activities"))
foreach(var a in actors)
foreach (var a in actors)
a.Tick();
ActorsWithTrait<ITick>().DoTimed(x => x.Trait.Tick(x.Actor),
"[{2}] Trait: {0} ({1:0.000} ms)",
Game.Settings.Debug.LongTickThreshold);
Game.Settings.Debug.LongTickThreshold);
effects.DoTimed(e => e.Tick(this),
"[{2}] Effect: {0} ({1:0.000} ms)",
@@ -246,11 +255,11 @@ namespace OpenRA
// hash all the actors
foreach (var a in Actors)
ret += n++ * (int)(1+a.ActorID) * Sync.CalculateSyncHash(a);
ret += n++ * (int)(1 + a.ActorID) * Sync.CalculateSyncHash(a);
// hash all the traits that tick
foreach (var x in traitDict.ActorsWithTraitMultiple<ISync>(this))
ret += n++ * (int)(1+x.Actor.ActorID) * Sync.CalculateSyncHash(x.Trait);
ret += n++ * (int)(1 + x.Actor.ActorID) * Sync.CalculateSyncHash(x.Trait);
// TODO: don't go over all effects
foreach (var e in Effects)
@@ -280,7 +289,7 @@ namespace OpenRA
public override string ToString()
{
return "{0}->{1}".F( Actor.Info.Name, Trait.GetType().Name );
return "{0}->{1}".F(Actor.Info.Name, Trait.GetType().Name);
}
}
}

View File

@@ -738,8 +738,8 @@ namespace OpenRA.Mods.RA.AI
if (desiredLocation == null)
continue;
world.IssueOrder(new Order("Move", mcv, false) { TargetLocation = desiredLocation.Value });
world.IssueOrder(new Order("DeployTransform", mcv, false));
world.IssueOrder(new Order("Move", mcv, true) { TargetLocation = desiredLocation.Value });
world.IssueOrder(new Order("DeployTransform", mcv, true));
}
}

View File

@@ -0,0 +1,48 @@
#region Copyright & License Information
/*
* Copyright 2007-2013 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. For more information,
* see COPYING.
*/
#endregion
using System.Collections.Generic;
using System.Linq;
using OpenRA.Mods.RA.Buildings;
using OpenRA.Mods.RA.Move;
using OpenRA.Traits;
namespace OpenRA.Mods.RA.Activities
{
public class Hunt : Activity
{
readonly IEnumerable<Actor> targets;
public Hunt(Actor self)
{
var attack = self.Trait<AttackBase>();
targets = self.World.Actors.Where(a => self != a && !a.IsDead() && a.IsInWorld && a.AppearsHostileTo(self)
&& a.HasTrait<Huntable>() && attack.HasAnyValidWeapons(Target.FromActor(a)));
}
public override Activity Tick(Actor self)
{
if (IsCanceled)
return NextActivity;
var target = targets.ClosestTo(self);
if (target == null)
return this;
return Util.SequenceActivities(
new AttackMove.AttackMoveActivity(self, new Move.Move(target.Location, WRange.FromCells(2))),
new Wait(25),
this);
}
}
public class HuntableInfo : TraitInfo<Huntable> { }
public class Huntable { }
}

View File

@@ -81,6 +81,7 @@
</ItemGroup>
<ItemGroup>
<Compile Include="Activities\CaptureActor.cs" />
<Compile Include="Activities\Hunt.cs" />
<Compile Include="AI\AttackOrFleeFuzzy.cs" />
<Compile Include="AI\BaseBuilder.cs" />
<Compile Include="AI\HackyAI.cs" />
@@ -338,6 +339,7 @@
<Compile Include="RepairsUnits.cs" />
<Compile Include="Reservable.cs" />
<Compile Include="ScaredyCat.cs" />
<Compile Include="Scripting\LuaScriptEvents.cs" />
<Compile Include="Scripting\LuaScriptInterface.cs" />
<Compile Include="Scripting\Media.cs" />
<Compile Include="Scripting\RASpecialPowers.cs" />

View File

@@ -0,0 +1,40 @@
#region Copyright & License Information
/*
* Copyright 2007-2013 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. For more information,
* see COPYING.
*/
#endregion
using System;
using System.Collections.Generic;
using OpenRA.Traits;
namespace OpenRA.Mods.RA.Scripting
{
public class LuaScriptEventsInfo : TraitInfo<LuaScriptEvents> { }
public class LuaScriptEvents : INotifyKilled, INotifyAddedToWorld, INotifyRemovedFromWorld
{
public event Action<Actor, AttackInfo> OnKilled = (self, e) => { };
public event Action<Actor> OnAddedToWorld = self => { };
public event Action<Actor> OnRemovedFromWorld = self => { };
public void Killed(Actor self, AttackInfo e)
{
OnKilled(self, e);
}
public void AddedToWorld(Actor self)
{
OnAddedToWorld(self);
}
public void RemovedFromWorld(Actor self)
{
OnRemovedFromWorld(self);
}
}
}

View File

@@ -8,12 +8,16 @@
*/
#endregion
using System;
using System.Linq;
using LuaInterface;
using OpenRA.Effects;
using OpenRA.FileFormats;
using OpenRA.Mods.RA.Activities;
using OpenRA.Mods.RA.Air;
using OpenRA.Mods.RA.Missions;
using OpenRA.Scripting;
using OpenRA.Traits;
using System;
using System.Linq;
using WorldRenderer = OpenRA.Graphics.WorldRenderer;
namespace OpenRA.Mods.RA.Scripting
@@ -42,7 +46,7 @@ namespace OpenRA.Mods.RA.Scripting
AddMapActorGlobals();
context.Lua["World"] = w;
context.Lua["WorldRenderer"] = wr;
context.RegisterObject(this, "_OpenRA", false);
context.RegisterObject(this, "Internal", false);
context.RegisterType(typeof(WVec), "WVec", true);
context.RegisterType(typeof(WPos), "WPos", true);
context.RegisterType(typeof(CPos), "CPos", true);
@@ -161,5 +165,101 @@ namespace OpenRA.Mods.RA.Scripting
{
world.AddFrameEndTask(w => w.Add(new DelayedAction((int)delay, func)));
}
[LuaGlobal]
public void PlaySpeechNotification(Player player, string notification)
{
Sound.PlayNotification(player, "Speech", notification, player != null ? player.Country.Race : null);
}
[LuaGlobal]
public void PlaySoundNotification(Player player, string notification)
{
Sound.PlayNotification(player, "Sounds", notification, player != null ? player.Country.Race : null);
}
[LuaGlobal]
public void WaitFor(Actor actor, Func<bool> func)
{
actor.QueueActivity(new WaitFor(func));
}
[LuaGlobal]
public void CallFunc(Actor actor, Action func)
{
actor.QueueActivity(new CallFunc(func));
}
[LuaGlobal]
public int GetFacing(object vec, double currentFacing)
{
if (vec is CVec)
return Util.GetFacing((CVec)vec, (int)currentFacing);
if (vec is WVec)
return Util.GetFacing((WVec)vec, (int)currentFacing);
throw new ArgumentException("Unsupported vector type: {0}".F(vec.GetType()));
}
[LuaGlobal]
public WRange GetWRangeFromCells(double cells)
{
return WRange.FromCells((int)cells);
}
[LuaGlobal]
public void SetWinState(Player player, string winState)
{
player.WinState = Enum<WinState>.Parse(winState);
}
[LuaGlobal]
public void PlayRandomMusic()
{
MissionUtils.PlayMissionMusic();
}
[LuaGlobal]
public bool IsDead(Actor actor)
{
return actor.IsDead();
}
[LuaGlobal]
public void PlayMovieFullscreen(string movie, Action onComplete)
{
Media.PlayFMVFullscreen(world, movie, onComplete);
}
[LuaGlobal]
public void FlyToPos(Actor actor, WPos pos)
{
actor.QueueActivity(Fly.ToPos(pos));
}
[LuaGlobal]
public void FlyAttackActor(Actor actor, Actor targetActor)
{
actor.QueueActivity(new FlyAttack(Target.FromActor(targetActor)));
}
[LuaGlobal]
public void FlyAttackCell(Actor actor, CPos location)
{
actor.QueueActivity(new FlyAttack(Target.FromCell(location)));
}
[LuaGlobal]
public void SetUnitStance(Actor actor, string stance)
{
var at = actor.TraitOrDefault<AutoTarget>();
if (at != null)
at.stance = Enum<UnitStance>.Parse(stance);
}
[LuaGlobal]
public bool RequiredUnitsAreDestroyed(Player player)
{
return world.ActorsWithTrait<MustBeDestroyed>().All(p => p.Actor.Owner != player);
}
}
}

View File

@@ -68,29 +68,31 @@ namespace OpenRA.Mods.RA
return null;
}
public void DeployTransform()
{
var b = self.TraitOrDefault<Building>();
if (!CanDeploy() || (b != null && !b.Lock()))
{
foreach (var s in Info.NoTransformSounds)
Sound.PlayToPlayer(self.Owner, s);
return;
}
if (self.HasTrait<IFacing>())
self.QueueActivity(new Turn(Info.Facing));
var rb = self.TraitOrDefault<RenderBuilding>();
if (rb != null && self.Info.Traits.Get<RenderBuildingInfo>().HasMakeAnimation)
self.QueueActivity(new MakeAnimation(self, true, () => rb.PlayCustomAnim(self, "make")));
self.QueueActivity(new Transform(self, Info.IntoActor) { Offset = (CVec)Info.Offset, Facing = Info.Facing, Sounds = Info.TransformSounds });
}
public void ResolveOrder( Actor self, Order order )
{
if (order.OrderString == "DeployTransform")
{
var b = self.TraitOrDefault<Building>();
if (!CanDeploy() || (b != null && !b.Lock()))
{
foreach (var s in Info.NoTransformSounds)
Sound.PlayToPlayer(self.Owner, s);
return;
}
self.CancelActivity();
if (self.HasTrait<IFacing>())
self.QueueActivity(new Turn(Info.Facing));
var rb = self.TraitOrDefault<RenderBuilding>();
if (rb != null && self.Info.Traits.Get<RenderBuildingInfo>().HasMakeAnimation)
self.QueueActivity(new MakeAnimation(self, true, () => rb.PlayCustomAnim(self, "make")));
self.QueueActivity(new Transform(self, Info.IntoActor) { Offset = (CVec)Info.Offset, Facing = Info.Facing, Sounds = Info.TransformSounds });
}
DeployTransform();
}
}
}

View File

@@ -163,3 +163,12 @@ Fonts:
TinyBold:
Font:FreeSansBold.ttf
Size:10
LuaScripts:
mods/ra/lua/utils.lua
mods/ra/lua/openra.lua
mods/ra/lua/map.lua
mods/ra/lua/actor.lua
mods/ra/lua/team.lua
mods/ra/lua/media.lua
mods/ra/lua/mission.lua

View File

@@ -40,6 +40,8 @@
CloakDelay: 90
CloakSound: trans1.aud
UncloakSound: trans1.aud
Huntable:
LuaScriptEvents:
^Tank:
AppearsOnRadar:
@@ -86,6 +88,8 @@
CloakDelay: 90
CloakSound: trans1.aud
UncloakSound: trans1.aud
Huntable:
LuaScriptEvents:
^Helicopter:
AppearsOnRadar:
@@ -113,6 +117,8 @@
CombatDebugOverlay:
BodyOrientation:
UpdatesPlayerStatistics:
Huntable:
LuaScriptEvents:
^Infantry:
AppearsOnRadar:
@@ -170,6 +176,8 @@
DamageCooldown: 125
RequiresTech: InfantryHealing
UpdatesPlayerStatistics:
Huntable:
LuaScriptEvents:
^CivInfantry:
Inherits: ^Infantry
@@ -247,6 +255,8 @@
AttackMove:
AttackFrontal:
UpdatesPlayerStatistics:
Huntable:
LuaScriptEvents:
^Plane:
AppearsOnRadar:
@@ -263,6 +273,8 @@
ActorLostNotification:
CombatDebugOverlay:
BodyOrientation:
Huntable:
LuaScriptEvents:
^Ship:
AppearsOnRadar:
@@ -286,6 +298,8 @@
Guardable:
BodyOrientation:
UpdatesPlayerStatistics:
Huntable:
LuaScriptEvents:
^Building:
AppearsOnRadar:
@@ -337,6 +351,8 @@
FrozenUnderFog:
UpdatesPlayerStatistics:
EngineerRepairable:
Huntable:
LuaScriptEvents:
^CivBuilding:
Inherits: ^Building
@@ -372,6 +388,7 @@
BodyOrientation:
FrozenUnderFog:
StartsRevealed: true
LuaScriptEvents:
^TechBuilding:
Inherits: ^CivBuilding
@@ -407,6 +424,7 @@
Palette: terrain
FrozenUnderFog:
StartsRevealed: true
LuaScriptEvents:
^Wall:
AppearsOnRadar:
@@ -437,6 +455,7 @@
Guardable:
BodyOrientation:
FrozenUnderFog:
LuaScriptEvents:
^Tree:
Tooltip:
@@ -460,6 +479,7 @@
BodyOrientation:
FrozenUnderFog:
StartsRevealed: true
LuaScriptEvents:
^Rock:
Tooltip:
@@ -477,6 +497,7 @@
BodyOrientation:
FrozenUnderFog:
StartsRevealed: true
LuaScriptEvents:
^Husk:
Health:
@@ -499,6 +520,7 @@
# AllowAllies: true
# AllowNeutral: true
# AllowEnemies: true
LuaScriptEvents:
^HelicopterHusk:
Inherits: ^Husk
@@ -524,3 +546,4 @@
DamagedSound: xplos.aud
DestroyedSound: xplobig4.aud
BodyOrientation:
LuaScriptEvents:

View File

@@ -144,3 +144,12 @@ Fonts:
TinyBold:
Font:FreeSansBold.ttf
Size:10
LuaScripts:
mods/ra/lua/utils.lua
mods/ra/lua/openra.lua
mods/ra/lua/map.lua
mods/ra/lua/actor.lua
mods/ra/lua/team.lua
mods/ra/lua/media.lua
mods/ra/lua/mission.lua

View File

@@ -35,6 +35,8 @@
RenderUnit:
BodyOrientation:
UpdatesPlayerStatistics:
Huntable:
LuaScriptEvents:
^Tank:
AppearsOnRadar:
@@ -73,6 +75,8 @@
RenderUnit:
BodyOrientation:
UpdatesPlayerStatistics:
Huntable:
LuaScriptEvents:
^Husk:
Health:
@@ -90,6 +94,7 @@
Tooltip:
Name: Destroyed Tank
BodyOrientation:
LuaScriptEvents:
^TowerHusk:
Health:
@@ -108,6 +113,7 @@
ProximityCaptor:
Types:Husk
BodyOrientation:
LuaScriptEvents:
^AircraftHusk:
Inherits: ^Husk
@@ -167,6 +173,8 @@
Guardable:
BodyOrientation:
UpdatesPlayerStatistics:
Huntable:
LuaScriptEvents:
^Plane:
AppearsOnRadar:
@@ -188,6 +196,8 @@
CombatDebugOverlay:
BodyOrientation:
UpdatesPlayerStatistics:
Huntable:
LuaScriptEvents:
^Helicopter:
Inherits: ^Plane
@@ -236,4 +246,6 @@
Range: 3
BodyOrientation:
UpdatesPlayerStatistics:
WithCrumbleOverlay:
WithCrumbleOverlay:
Huntable:
LuaScriptEvents:

147
mods/ra/lua/actor.lua Normal file
View File

@@ -0,0 +1,147 @@
Actor = { }
Actor.Create = function(name, init)
if name == nil then error("No actor name specified", 2) end
if init.Owner == nil then error("No actor owner specified", 2) end
local td = OpenRA.New("TypeDictionary")
local addToWorld = true
for key, value in pairs(init) do
if key == "AddToWorld" then
addToWorld = value
else
td:Add(OpenRA.New(key .. "Init", { value }))
end
end
return World:CreateActor(addToWorld, name, td)
end
Actor.Turn = function(actor, facing)
actor:QueueActivity(OpenRA.New("Turn", { { facing, "Int32" } }))
end
Actor.Move = function(actor, location)
Actor.MoveNear(actor, location, 0)
end
Actor.MoveNear = function(actor, location, nearEnough)
actor:QueueActivity(OpenRA.New("Move", { location, Map.GetWRangeFromCells(nearEnough) }))
end
Actor.HeliFly = function(actor, position)
actor:QueueActivity(OpenRA.New("HeliFly", { position }))
end
Actor.HeliLand = function(actor, requireSpace)
actor:QueueActivity(OpenRA.New("HeliLand", { requireSpace }))
end
Actor.Fly = function(actor, position)
Internal.FlyToPos(actor, position)
end
Actor.FlyAttackActor = function(actor, targetActor)
Internal.FlyAttackActor(actor, targetActor)
end
Actor.FlyAttackCell = function(actor, location)
Internal.FlyAttackCell(actor, location)
end
Actor.FlyOffMap = function(actor)
actor:QueueActivity(OpenRA.New("FlyOffMap"))
end
Actor.Hunt = function(actor)
actor:QueueActivity(OpenRA.New("Hunt", { actor }))
end
Actor.UnloadCargo = function(actor, unloadAll)
actor:QueueActivity(OpenRA.New("UnloadCargo", { unloadAll }))
end
Actor.Harvest = function(actor)
actor:QueueActivity(OpenRA.New("FindResources"))
end
Actor.Scatter = function(actor)
local mobile = Actor.Trait(actor, "Mobile")
mobile:Nudge(actor, actor, true)
end
Actor.Wait = function(actor, period)
actor:QueueActivity(OpenRA.New("Wait", { { period, "Int32" } }))
end
Actor.WaitFor = function(actor, func)
Internal.WaitFor(actor, func)
end
Actor.CallFunc = function(actor, func)
Internal.CallFunc(actor, func)
end
Actor.DeployTransform = function(actor)
Actor.CallFunc(actor, function()
Actor.Trait(actor, "Transforms"):DeployTransform()
end)
end
Actor.RemoveSelf = function(actor)
actor:QueueActivity(OpenRA.New("RemoveSelf"))
end
Actor.Stop = function(actor)
actor:CancelActivity()
end
Actor.IsDead = function(actor)
return Internal.IsDead(actor)
end
Actor.IsInWorld = function(actor)
return actor.IsInWorld
end
Actor.Owner = function(actor)
return actor.Owner
end
Actor.SetStance = function(actor, stance)
Internal.SetUnitStance(actor, stance)
end
Actor.OnKilled = function(actor, eh)
Actor.Trait(actor, "LuaScriptEvents").OnKilled:Add(eh)
end
Actor.OnAddedToWorld = function(actor, eh)
Actor.Trait(actor, "LuaScriptEvents").OnAddedToWorld:Add(eh)
end
Actor.OnRemovedFromWorld = function(actor, eh)
Actor.Trait(actor, "LuaScriptEvents").OnRemovedFromWorld:Add(eh)
end
Actor.HasTrait = function(actor, className)
return Internal.HasTrait(actor, className)
end
Actor.TraitOrDefault = function(actor, className)
return Internal.TraitOrDefault(actor, className)
end
Actor.Trait = function(actor, className)
return Internal.Trait(actor, className)
end
Actor.HasTraitInfo = function(actorType, className)
return Internal.HasTraitInfo(actorType, className)
end
Actor.TraitInfoOrDefault = function(actorType, className)
return Internal.TraitInfoOrDefault(actorType, className)
end
Actor.TraitInfo = function(actorType, className)
return Internal.TraitInfo(actorType, className)
end

9
mods/ra/lua/map.lua Normal file
View File

@@ -0,0 +1,9 @@
Map = { }
Map.GetFacing = function(vec, currentFacing)
return Internal.GetFacing(vec, currentFacing)
end
Map.GetWRangeFromCells = function(cells)
return Internal.GetWRangeFromCells(cells)
end

20
mods/ra/lua/media.lua Normal file
View File

@@ -0,0 +1,20 @@
Media = { }
Media.PlaySpeechNotification = function(notification, player)
Internal.PlaySpeechNotification(player, notification)
end
Media.PlaySoundNotification = function(notification, player)
Internal.PlaySoundNotification(player, notification)
end
Media.PlayRandomMusic = function()
Internal.PlayRandomMusic()
end
Media.PlayMovieFullscreen = function(movie, onComplete)
if onComplete == nil then
onComplete = function() end
end
Internal.PlayMovieFullscreen(movie, onComplete)
end

119
mods/ra/lua/mission.lua Normal file
View File

@@ -0,0 +1,119 @@
Mission = { }
Mission.PerformHelicopterInsertion = function(owner, helicopterName, passengerNames, enterPosition, unloadPosition, exitPosition)
local facing = { Map.GetFacing(WPos.op_Subtraction(unloadPosition, enterPosition), 0), "Int32" }
local altitude = { Actor.TraitInfo(helicopterName, "AircraftInfo").CruiseAltitude, "Int32" }
local heli = Actor.Create(helicopterName, { Owner = owner, CenterPosition = enterPosition, Facing = facing, Altitude = altitude })
local cargo = Actor.Trait(heli, "Cargo")
local passengers = { }
for i, passengerName in ipairs(passengerNames) do
local passenger = Actor.Create(passengerName, { AddToWorld = false, Owner = owner })
cargo:Load(heli, passenger)
passengers[i] = passenger
end
Actor.HeliFly(heli, unloadPosition)
Actor.Turn(heli, 0)
Actor.HeliLand(heli, true)
Actor.UnloadCargo(heli, true)
Actor.Wait(heli, 125)
Actor.HeliFly(heli, exitPosition)
Actor.RemoveSelf(heli)
return heli, passengers
end
Mission.PerformHelicopterExtraction = function(owner, helicopterName, passengers, enterPosition, loadPosition, exitPosition)
local facing = { Map.GetFacing(WPos.op_Subtraction(loadPosition, enterPosition), 0), "Int32" }
local altitude = { Actor.TraitInfo(helicopterName, "AircraftInfo").CruiseAltitude, "Int32" }
local heli = Actor.Create(helicopterName, { Owner = owner, CenterPosition = enterPosition, Facing = facing, Altitude = altitude })
local cargo = Actor.Trait(heli, "Cargo")
Actor.HeliFly(heli, loadPosition)
Actor.Turn(heli, 0)
Actor.HeliLand(heli, true)
Actor.WaitFor(heli, function()
for i, passenger in ipairs(passengers) do
if not cargo.Passengers:Contains(passenger) then
return false
end
end
return true
end)
Actor.Wait(heli, 125)
Actor.HeliFly(heli, exitPosition)
Actor.RemoveSelf(heli)
return heli
end
Mission.Reinforce = function(owner, reinforcementNames, enterLocation, rallyPointLocation, interval, onCreateFunc)
local facing = { Map.GetFacing(CPos.op_Subtraction(rallyPointLocation, enterLocation), 0), "Int32" }
local ret = { }
for i = 1, #reinforcementNames do
local reinforcement = Actor.Create(reinforcementNames[i], { AddToWorld = false, Owner = owner, Location = enterLocation, Facing = facing })
table.insert(ret, reinforcement)
OpenRA.RunAfterDelay((i - 1) * interval, function()
World:Add(reinforcement)
Actor.MoveNear(reinforcement, rallyPointLocation, 2)
if onCreateFunc ~= nil then
onCreateFunc(reinforcement)
end
end)
end
return ret
end
Mission.Parabomb = function(owner, planeName, enterLocation, bombLocation)
local facing = { Map.GetFacing(CPos.op_Subtraction(bombLocation, enterLocation), 0), "Int32" }
local altitude = { Actor.TraitInfo(planeName, "AircraftInfo").CruiseAltitude, "Int32" }
local plane = Actor.Create(planeName, { Location = enterLocation, Owner = owner, Facing = facing, Altitude = altitude })
Actor.Trait(plane, "AttackBomber"):SetTarget(bombLocation.CenterPosition)
Actor.Fly(plane, bombLocation.CenterPosition)
Actor.FlyOffMap(plane)
Actor.RemoveSelf(plane)
end
Mission.Paradrop = function(owner, planeName, passengerNames, enterLocation, dropLocation)
local facing = { Map.GetFacing(CPos.op_Subtraction(dropLocation, enterLocation), 0), "Int32" }
local altitude = { Actor.TraitInfo(planeName, "AircraftInfo").CruiseAltitude, "Int32" }
local plane = Actor.Create(planeName, { Location = enterLocation, Owner = owner, Facing = facing, Altitude = altitude })
Actor.FlyAttackCell(plane, dropLocation)
Actor.Trait(plane, "ParaDrop"):SetLZ(dropLocation)
local cargo = Actor.Trait(plane, "Cargo")
for i, passengerName in ipairs(passengerNames) do
cargo:Load(plane, Actor.Create(passengerName, { AddToWorld = false, Owner = owner }))
end
end
Mission.MissionOver = function(winners, losers, setWinStates)
World:SetLocalPauseState(true)
World:set_PauseStateLocked(true)
if winners then
for i, player in ipairs(winners) do
Media.PlaySpeechNotification("Win", player)
if setWinStates then
OpenRA.SetWinState(player, "Won")
end
end
end
if losers then
for i, player in ipairs(losers) do
Media.PlaySpeechNotification("Lose", player)
if setWinStates then
OpenRA.SetWinState(player, "Lost")
end
end
end
Mission.MissionIsOver = true
end
Mission.GetGroundAttackersOf = function(player)
return Utils.EnumerableWhere(World.Actors, function(actor)
return not Actor.IsDead(actor) and Actor.IsInWorld(actor) and Actor.Owner(actor) == player and Actor.HasTrait(actor, "AttackBase") and Actor.HasTrait(actor, "Mobile")
end)
end
Mission.TickTakeOre = function(player)
OpenRA.TakeOre(player, 0.01 * OpenRA.GetOreCapacity(player) / 25)
end
Mission.RequiredUnitsAreDestroyed = function(player)
return Internal.RequiredUnitsAreDestroyed(player)
end

69
mods/ra/lua/openra.lua Normal file
View File

@@ -0,0 +1,69 @@
OpenRA = { }
OpenRA.New = function(className, args)
return Internal.New(className, args)
end
OpenRA.RunAfterDelay = function(delay, func)
Internal.RunAfterDelay(delay, func)
end
OpenRA.Debug = function(obj)
Internal.Debug(obj)
end
OpenRA.SetViewportCenterPosition = function(position)
WorldRenderer.Viewport:Center(position)
end
OpenRA.GetViewportCenterPosition = function()
return WorldRenderer.Viewport.CenterPosition
end
OpenRA.GetDifficulty = function()
return World.LobbyInfo.GlobalSettings.Difficulty
end
OpenRA.IsSinglePlayer = function()
return World.LobbyInfo:get_IsSinglePlayer()
end
OpenRA.GetPlayer = function(internalName)
return Utils.EnumerableFirstOrNil(World.Players, function(p) return p.InternalName == internalName end)
end
OpenRA.SetWinState = function(player, winState)
Internal.SetWinState(player, winState)
end
OpenRA.TakeOre = function(player, amount)
Actor.Trait(player.PlayerActor, "PlayerResources"):TakeOre(amount)
end
OpenRA.TakeCash = function(player, amount)
Actor.Trait(player.PlayerActor, "PlayerResources"):TakeCash(amount)
end
OpenRA.GiveOre = function(player, amount)
Actor.Trait(player.PlayerActor, "PlayerResources"):GiveOre(amount)
end
OpenRA.GiveCash = function(player, amount)
Actor.Trait(player.PlayerActor, "PlayerResources"):GiveCash(amount)
end
OpenRA.CanGiveOre = function(player, amount)
return Actor.Trait(player.PlayerActor, "PlayerResources"):CanGiveOre(amount)
end
OpenRA.GetOreCapacity = function(player)
return Actor.Trait(player.PlayerActor, "PlayerResources").OreCapacity
end
OpenRA.GetOre = function(player)
return Actor.Trait(player.PlayerActor, "PlayerResources").Ore
end
OpenRA.GetCash = function(player)
return Actor.Trait(player.PlayerActor, "PlayerResources").Cash
end

61
mods/ra/lua/team.lua Normal file
View File

@@ -0,0 +1,61 @@
Team = { }
Team.Create = function(actors)
local team = { }
team.Actors = actors
team.OnAllKilled = { }
team.OnAnyKilled = { }
team.OnAllRemovedFromWorld = { }
team.OnAnyRemovedFromWorld = { }
Team.AddActorEventHandlers(team)
return team
end
Team.AddActorEventHandlers = function(team)
for i, actor in ipairs(team.Actors) do
Actor.OnKilled(actor, function()
Team.InvokeHandlers(team.OnAnyKilled)
if Team.AllAreDead(team) then Team.InvokeHandlers(team.OnAllKilled) end
end)
Actor.OnRemovedFromWorld(actor, function()
Team.InvokeHandlers(team.OnAnyRemovedFromWorld)
if not Team.AnyAreInWorld(team) then Team.InvokeHandlers(team.OnAllRemovedFromWorld) end
end)
end
end
Team.InvokeHandlers = function(event)
for i, handler in ipairs(event) do
handler()
end
end
Team.AllAreDead = function(team)
return Utils.All(team.Actors, Actor.IsDead)
end
Team.AnyAreDead = function(team)
return Utils.Any(team.Actors, Actor.IsDead)
end
Team.AllAreInWorld = function(team)
return Utils.All(team.Actors, Actor.IsInWorld)
end
Team.AnyAreInWorld = function(team)
return Utils.Any(team.Actors, Actor.IsInWorld)
end
Team.AddEventHandler = function(event, func)
table.insert(event, func)
end
Team.Contains = function(team, actor)
return Utils.Any(team.Actors, function(a) return a == actor end)
end
Team.Do = function(team, func)
Utils.ForEach(team.Actors, func)
end

67
mods/ra/lua/utils.lua Normal file
View File

@@ -0,0 +1,67 @@
Utils = { }
Utils.Enumerate = function(netEnumerable)
local enum = netEnumerable:GetEnumerator()
return function()
if enum:MoveNext() then
return enum:get_Current()
end
end
end
Utils.EnumerableFirstOrNil = function(netEnumerable, func)
for item in Utils.Enumerate(netEnumerable) do
if func(item) then
return item
end
end
return nil
end
Utils.EnumerableWhere = function(netEnumerable, func)
local ret = { }
for item in Utils.Enumerate(netEnumerable) do
if func(item) then
table.insert(ret, item)
end
end
return ret
end
Utils.Where = function(array, func)
local ret = { }
for i, item in ipairs(array) do
if func(item) then
table.insert(ret, item)
end
end
return ret
end
Utils.All = function(array, func)
for i, item in ipairs(array) do
if not func(item) then
return false
end
end
return true
end
Utils.Any = function(array, func)
for i, item in ipairs(array) do
if func(item) then
return true
end
end
return false
end
Utils.ForEach = function(array, func)
for i, item in ipairs(array) do
func(item)
end
end
Utils.TableToArray = function(luaTable)
return Internal.TableToArray(luaTable)
end

Binary file not shown.

View File

@@ -0,0 +1,626 @@
Selectable: True
MapFormat: 6
Title: Allies 01: In the thick of it
Description: In the thick of it
Author: Westwood Studios
Tileset: SNOW
Options:
Crates: False
Fog: True
Shroud: True
AllyBuildRadius: False
FragileAlliances: False
StartingCash: 0
ConfigurableStartingUnits: False
Difficulties:
MapSize: 128,128
RequiresMod: ra
Bounds: 49,45,30,36
UseAsShellmap: False
Type: Campaign
Players:
PlayerReference@USSR:
Name: USSR
Race: soviet
ColorRamp: 3,255,127
Enemies: Greece,England
PlayerReference@Neutral:
Name: Neutral
OwnsWorld: True
NonCombatant: True
Race: allies
Enemies: USSR,Greece,England
PlayerReference@Greece:
Name: Greece
Race: allies
ColorRamp: 161,134,200
Allies: England
Enemies: Neutral,USSR
Required: True
Playable: True
AllowBots: False
LockRace: True
LockSpawn: True
LockTeam: True
LockColor: True
PlayerReference@England:
Name: England
Race: allies
ColorRamp: 76,196,190
Allies: Greece
Enemies: USSR
Actors:
Actor0: t16
Location: 66,46
Owner: Neutral
Actor1: t17
Location: 59,46
Owner: Neutral
Actor2: tc04
Location: 75,44
Owner: Neutral
Actor3: tc05
Location: 76,45
Owner: Neutral
Actor4: t01
Location: 52,50
Owner: Neutral
Actor5: t02
Location: 70,68
Owner: Neutral
Actor6: t05
Location: 73,64
Owner: Neutral
Actor7: t14
Location: 59,50
Owner: Neutral
Actor8: t17
Location: 56,61
Owner: Neutral
Actor9: tc01
Location: 53,64
Owner: Neutral
Actor10: tc02
Location: 49,66
Owner: Neutral
Actor11: t07
Location: 49,59
Owner: Neutral
Actor12: tc05
Location: 49,60
Owner: Neutral
Actor13: tc04
Location: 50,58
Owner: Neutral
Actor14: tc03
Location: 69,50
Owner: Neutral
Actor15: t11
Location: 77,60
Owner: Neutral
Actor16: t01
Location: 78,59
Owner: Neutral
Actor17: tc01
Location: 76,56
Owner: Neutral
Actor18: t08
Location: 66,50
Owner: Neutral
Actor19: t17
Location: 57,56
Owner: Neutral
Actor20: t01
Location: 73,67
Owner: Neutral
Actor21: tc01
Location: 54,45
Owner: Neutral
Actor22: tsla
Location: 71,59
Owner: USSR
Health: 1
Facing: 0
Actor23: powr
Location: 75,64
Owner: USSR
Health: 1
Facing: 0
Actor24: powr
Location: 67,57
Owner: USSR
Health: 1
Facing: 0
Actor25: powr
Location: 61,57
Owner: USSR
Health: 1
Facing: 0
Lab: stek
Location: 61,60
Owner: USSR
Health: 1
Facing: 0
Actor27: fact
Location: 69,62
Owner: USSR
Health: 1
Facing: 0
Actor28: dome
Location: 67,65
Owner: USSR
Health: 1
Facing: 0
Actor29: barr
Location: 61,64
Owner: USSR
Health: 1
Facing: 0
Actor30: tsla
Location: 67,67
Owner: USSR
Health: 1
Facing: 0
Actor31: tsla
Location: 60,66
Owner: USSR
Health: 1
Facing: 0
Actor32: weap
Location: 65,62
Owner: USSR
Health: 1
Facing: 0
Actor33: proc
Location: 73,58
Owner: USSR
Health: 1
Facing: 0
FreeActor: False
Actor34: kenn
Location: 64,65
Owner: USSR
Health: 0.9921875
Facing: 0
Actor35: powr
Location: 65,57
Owner: USSR
Health: 1
Facing: 0
Actor36: powr
Location: 77,64
Owner: USSR
Health: 1
Facing: 0
Actor37: powr
Location: 75,67
Owner: USSR
Health: 1
Facing: 0
Actor38: silo
Location: 59,64
Owner: USSR
Health: 1
Facing: 0
Actor39: powr
Location: 77,67
Owner: USSR
Health: 1
Facing: 0
OilPump: v19
Location: 59,57
Owner: USSR
Health: 1
Facing: 0
Actor41: brl3
Location: 60,57
Owner: USSR
Health: 1
Facing: 0
Actor42: barl
Location: 60,56
Owner: USSR
Health: 1
Facing: 0
Actor43: barl
Location: 61,56
Owner: USSR
Health: 1
Facing: 0
Actor44: brl3
Location: 60,58
Owner: USSR
Health: 1
Facing: 0
Actor45: barl
Location: 58,56
Owner: USSR
Health: 1
Facing: 0
Actor46: barl
Location: 59,59
Owner: USSR
Health: 1
Facing: 0
Actor47: jeep
Location: 63,50
Owner: Greece
Health: 1
Facing: 128
Harvester: harv
Location: 72,60
Owner: USSR
Health: 1
Facing: 224
Actor49: jeep
Location: 62,50
Owner: Greece
Health: 1
Facing: 128
Actor50: jeep
Location: 64,50
Owner: Greece
Health: 1
Facing: 128
Patrol1: dog
Location: 63,59
Owner: USSR
Health: 1
Facing: 0
SubCell: 2
Patrol2: e1
Location: 64,58
Owner: USSR
Health: 1
Facing: 0
SubCell: 3
LabGuard3: e1
Location: 61,63
Owner: USSR
Health: 1
Facing: 128
SubCell: 0
LabGuard2: e1
Location: 63,63
Owner: USSR
Health: 1
Facing: 96
SubCell: 0
Actor55: e2
Location: 73,66
Owner: USSR
Health: 1
Facing: 0
SubCell: 1
Actor56: e1
Location: 62,67
Owner: USSR
Health: 1
Facing: 128
SubCell: 4
Actor57: e1
Location: 67,67
Owner: USSR
Health: 1
Facing: 160
SubCell: 3
Actor58: e1
Location: 65,67
Owner: USSR
Health: 1
Facing: 160
SubCell: 3
Actor59: e1
Location: 56,60
Owner: USSR
Health: 1
Facing: 96
SubCell: 1
Patrol4: e1
Location: 62,55
Owner: USSR
Health: 1
Facing: 0
SubCell: 4
Patrol3: e1
Location: 64,59
Owner: USSR
Health: 1
Facing: 0
SubCell: 2
LabGuard1: e1
Location: 64,61
Owner: USSR
Health: 1
Facing: 0
SubCell: 4
Actor63: e1
Location: 58,60
Owner: USSR
Health: 1
Facing: 64
SubCell: 1
Actor64: e1
Location: 64,49
Owner: Greece
Health: 1
Facing: 128
SubCell: 1
Actor65: e1
Location: 63,49
Owner: Greece
Health: 1
Facing: 128
SubCell: 0
Actor66: e1
Location: 62,49
Owner: Greece
Health: 1
Facing: 160
SubCell: 2
Civilian1: c8
Location: 74,50
Owner: England
Health: 1
Facing: 0
SubCell: 0
Civilian2: c7
Location: 76,48
Owner: England
Health: 1
Facing: 0
SubCell: 3
Actor69: e2
Location: 62,56
Owner: USSR
Health: 1
Facing: 32
SubCell: 1
Actor70: e2
Location: 62,56
Owner: USSR
Health: 1
Facing: 0
SubCell: 4
Actor71: e1
Location: 64,49
Owner: Greece
Health: 1
Facing: 128
SubCell: 2
Actor72: e1
Location: 62,49
Owner: Greece
Health: 1
Facing: 128
SubCell: 1
ExtractionLZ: waypoint
Location: 53,49
Owner: Neutral
waypoint1: waypoint
Location: 57,74
Owner: Neutral
waypoint2: waypoint
Location: 53,79
Owner: Neutral
waypoint3: waypoint
Location: 57,65
Owner: Neutral
CruiserCameraPoint: waypoint
Location: 69,67
Owner: Neutral
waypoint7: waypoint
Location: 69,56
Owner: Neutral
waypoint6: waypoint
Location: 55,60
Owner: Neutral
EinsteinSpawnPoint: waypoint
Location: 62,61
Owner: Neutral
waypoint8: waypoint
Location: 49,55
Owner: Neutral
waypoint9: waypoint
Location: 55,56
Owner: Neutral
InsertionLZ: waypoint
Location: 63,47
Owner: Neutral
InsertionEntry: waypoint
Location: 63,45
Owner: Neutral
BaseCameraPoint: waypoint
Location: 64,63
Owner: Neutral
CruiserPoint4: waypoint
Location: 72,75
Owner: Neutral
SouthReinforcementsPoint: waypoint
Location: 66,80
Owner: Neutral
ExtractionFlarePoint: waypoint
Location: 54,48
Owner: Neutral
CruiserPoint2: waypoint
Location: 64,75
Owner: Neutral
CruiserPoint3: waypoint
Location: 68,76
Owner: Neutral
CruiserPoint1: waypoint
Location: 60,74
Owner: Neutral
waypoint78: waypoint
Location: 70,60
Owner: Neutral
waypoint98: waypoint
Location: 63,47
Owner: Neutral
Actor48: fenc
Location: 53,60
Owner: USSR
Actor51: fenc
Location: 53,59
Owner: USSR
Actor52: fenc
Location: 54,59
Owner: USSR
Actor60: fenc
Location: 53,63
Owner: USSR
Actor61: fenc
Location: 54,63
Owner: USSR
Actor73: fenc
Location: 55,63
Owner: USSR
Actor74: fenc
Location: 55,64
Owner: USSR
Actor75: fenc
Location: 55,65
Owner: USSR
Actor76: fenc
Location: 55,66
Owner: USSR
Actor77: fenc
Location: 55,67
Owner: USSR
Actor78: fenc
Location: 56,67
Owner: USSR
Actor79: fenc
Location: 57,67
Owner: USSR
Actor80: fenc
Location: 58,67
Owner: USSR
Actor81: fenc
Location: 58,68
Owner: USSR
Actor82: fenc
Location: 73,70
Owner: USSR
Actor83: fenc
Location: 74,70
Owner: USSR
Actor84: fenc
Location: 78,70
Owner: USSR
Actor85: fenc
Location: 77,70
Owner: USSR
Actor86: fenc
Location: 76,70
Owner: USSR
Actor87: fenc
Location: 78,58
Owner: USSR
Actor99: fenc
Location: 78,59
Owner: USSR
Actor88: fenc
Location: 77,58
Owner: USSR
Actor89: fenc
Location: 78,57
Owner: USSR
Actor90: fenc
Location: 78,56
Owner: USSR
Actor91: fenc
Location: 77,56
Owner: USSR
Actor98: fenc
Location: 76,56
Owner: USSR
Actor92: fenc
Location: 75,56
Owner: USSR
Actor93: fenc
Location: 74,56
Owner: USSR
Actor94: fenc
Location: 74,55
Owner: USSR
Actor95: fenc
Location: 68,55
Owner: USSR
Actor96: fenc
Location: 69,55
Owner: USSR
Actor97: fenc
Location: 68,54
Owner: USSR
ExtractionExitPoint: waypoint
Location: 78,49
Owner: Neutral
Smudges:
Rules:
Player:
-ConquestVictoryConditions:
World:
-CrateDrop:
-SpawnMPUnits:
-MPStartLocations:
LuaScriptInterface:
LuaScripts: mission.lua
TRAN.Extraction:
Inherits: TRAN
RenderUnit:
Image: tran
RevealsShroud:
Range: 0
RejectsOrders:
-Selectable:
Cargo:
Types: Einstein
MaxWeight: 1
TRAN.Insertion:
Inherits: TRAN.Extraction
RenderUnit:
Image: tran
Cargo:
MaxWeight: 0
EINSTEIN:
Passenger:
CargoType: Einstein
^CivInfantry:
RevealsShroud:
Range: 0
Sequences:
VoxelSequences:
Weapons:
8Inch:
Range: 25
M60mg:
Range: 5
ROF: 20
Burst: 1
Warhead:
Damage: 20
Voices:
Notifications:
Translations:

View File

@@ -0,0 +1,151 @@
InsertionHelicopterType = "tran.insertion"
ExtractionHelicopterType = "tran.extraction"
JeepReinforcements = { "jeep", "jeep" }
JeepInterval = 50
JeepDelay = 125
TanyaType = "e7"
EinsteinType = "einstein"
FlareType = "flare"
Cruisers = { "ca", "ca", "ca", "ca" }
CruiserDelay = 250
CameraDelay = 125
CivilianWait = 150
BaseAlertDelay = 300
SendInsertionHelicopter = function()
local heli, passengers = Mission.PerformHelicopterInsertion(player, InsertionHelicopterType, { TanyaType },
InsertionEntry.CenterPosition, InsertionLZ.CenterPosition, InsertionEntry.CenterPosition)
tanya = passengers[1]
Actor.OnKilled(tanya, TanyaKilled)
end
SendJeeps = function()
Media.PlaySpeechNotification("ReinforcementsArrived")
Mission.Reinforce(player, JeepReinforcements, InsertionEntry.Location, InsertionLZ.Location, JeepInterval)
end
RunInitialActivities = function()
SendInsertionHelicopter()
Actor.Hunt(Patrol1)
Actor.Hunt(Patrol2)
Actor.Hunt(Patrol3)
Actor.Hunt(Patrol4)
Actor.Harvest(Harvester)
Team.Do(civiliansTeam, function(c)
Actor.Wait(c, CivilianWait)
Actor.Hunt(c)
end)
end
LabGuardsKilled = function()
CreateEinstein()
Actor.Create(FlareType, { Owner = england, Location = ExtractionFlarePoint.Location })
Media.PlaySpeechNotification("SignalFlareNorth")
SendExtractionHelicopter()
OpenRA.RunAfterDelay(BaseAlertDelay, function()
local ussrUnits = Mission.GetGroundAttackersOf(ussr)
for i, unit in ipairs(ussrUnits) do
Actor.Hunt(unit)
end
end)
OpenRA.RunAfterDelay(CruiserDelay, function()
Media.PlaySpeechNotification("AlliedReinforcementsArrived")
Actor.Create("camera", { Owner = player, Location = CruiserCameraPoint.Location })
SendCruisers()
end)
end
SendExtractionHelicopter = function()
local heli = Mission.PerformHelicopterExtraction(player, ExtractionHelicopterType, { einstein },
SouthReinforcementsPoint.CenterPosition, ExtractionLZ.CenterPosition, ExtractionExitPoint.CenterPosition)
Actor.OnKilled(heli, HelicopterDestroyed)
Actor.OnRemovedFromWorld(heli, HelicopterExtractionCompleted)
end
HelicopterExtractionCompleted = function()
MissionAccomplished()
end
SendCruisers = function()
for i, cruiser in ipairs(Cruisers) do
local ca = Actor.Create(cruiser, { Owner = england, Location = SouthReinforcementsPoint.Location })
Actor.Move(ca, _G["CruiserPoint" .. i].Location)
end
end
LabDestroyed = function(self, e)
if not einstein then
MissionFailed()
end
end
EinsteinKilled = function(self, e)
MissionFailed()
end
HelicopterDestroyed = function(self, e)
MissionFailed()
end
TanyaKilled = function(self, e)
MissionFailed()
end
OilPumpDestroyed = function(self, e)
OpenRA.RunAfterDelay(JeepDelay, SendJeeps)
end
CreateEinstein = function()
einstein = Actor.Create(EinsteinType, { Location = EinsteinSpawnPoint.Location, Owner = player })
Actor.Scatter(einstein)
Actor.OnKilled(einstein, EinsteinKilled)
end
MissionAccomplished = function()
Mission.MissionOver({ player }, nil, false)
--Media.PlayMovieFullscreen("snowbomb.vqa")
end
MissionFailed = function()
Mission.MissionOver(nil, { player }, false)
Media.PlayMovieFullscreen("bmap.vqa")
end
SetUnitStances = function()
local playerUnits = Mission.GetGroundAttackersOf(player)
local ussrUnits = Mission.GetGroundAttackersOf(ussr)
for i, unit in ipairs(playerUnits) do
Actor.SetStance(unit, "Defend")
end
end
Tick = function()
Mission.TickTakeOre(ussr)
end
WorldLoaded = function()
player = OpenRA.GetPlayer("Greece")
england = OpenRA.GetPlayer("England")
ussr = OpenRA.GetPlayer("USSR")
Actor.OnKilled(Lab, LabDestroyed)
Actor.OnKilled(OilPump, OilPumpDestroyed)
labGuardsTeam = Team.Create({ LabGuard1, LabGuard2, LabGuard3 })
Team.AddEventHandler(labGuardsTeam.OnAllKilled, LabGuardsKilled)
civiliansTeam = Team.Create({ Civilian1, Civilian2 })
RunInitialActivities()
SetUnitStances()
OpenRA.RunAfterDelay(CameraDelay, function() Actor.Create("camera", { Owner = player, Location = BaseCameraPoint.Location }) end)
OpenRA.SetViewportCenterPosition(InsertionLZ.CenterPosition)
Media.PlayMovieFullscreen("ally1.vqa", function() Media.PlayMovieFullscreen("landing.vqa", Media.PlayRandomMusic) end)
end

Binary file not shown.

View File

@@ -0,0 +1,954 @@
Selectable: True
MapFormat: 6
Title: Allies 02: Five to one
Description: Five to one
Author: Westwood Studios
Tileset: SNOW
Options:
Crates: False
Fog: True
Shroud: True
AllyBuildRadius: False
FragileAlliances: False
StartingCash: 5700
ConfigurableStartingUnits: False
Difficulties:
MapSize: 128,128
RequiresMod: ra
Bounds: 43,44,50,42
UseAsShellmap: False
Type: Campaign
Players:
PlayerReference@USSR:
Name: USSR
Race: soviet
ColorRamp: 3,255,127
Allies: BadGuy
Enemies: England,Greece
PlayerReference@France:
Name: France
Race: allies
ColorRamp: 115,115,143
Allies: England,Greece
Enemies: USSR,BadGuy
PlayerReference@Neutral:
Name: Neutral
OwnsWorld: True
NonCombatant: True
Race: allies
Enemies: England,Greece
PlayerReference@BadGuy:
Name: BadGuy
Race: soviet
ColorRamp: 3,255,127
Allies: USSR
Enemies: England,Greece
PlayerReference@Greece:
Name: Greece
Playable: True
AllowBots: False
Required: True
LockRace: True
Race: allies
LockColor: True
ColorRamp: 161,134,200
LockSpawn: True
LockTeam: True
Allies: France,England
Enemies: USSR,BadGuy
Actors:
EntryPoint: t06
Location: 75,80
Owner: Neutral
Actor1: t03
Location: 75,72
Owner: Neutral
Actor2: t08
Location: 92,60
Owner: Neutral
Actor3: t12
Location: 92,63
Owner: Neutral
Actor4: t01
Location: 89,62
Owner: Neutral
Actor5: t16
Location: 61,44
Owner: Neutral
Actor6: t14
Location: 58,49
Owner: Neutral
Actor7: t10
Location: 55,46
Owner: Neutral
Actor8: t10
Location: 43,56
Owner: Neutral
Actor9: t01
Location: 45,56
Owner: Neutral
Actor10: t17
Location: 53,66
Owner: Neutral
Actor11: tc01
Location: 59,60
Owner: Neutral
Actor12: tc01
Location: 63,74
Owner: Neutral
Actor13: t07
Location: 44,77
Owner: Neutral
Actor14: t08
Location: 50,78
Owner: Neutral
Actor15: t11
Location: 51,71
Owner: Neutral
Actor16: t10
Location: 68,77
Owner: Neutral
Actor17: tc02
Location: 69,72
Owner: Neutral
Actor18: tc03
Location: 71,52
Owner: Neutral
Actor19: tc04
Location: 67,76
Owner: Neutral
Actor20: t17
Location: 70,55
Owner: Neutral
Actor21: tc01
Location: 70,54
Owner: Neutral
Actor22: t06
Location: 67,54
Owner: Neutral
Actor23: t01
Location: 67,44
Owner: Neutral
Actor24: tc02
Location: 67,51
Owner: Neutral
Actor25: tc04
Location: 67,49
Owner: Neutral
Actor26: t17
Location: 69,50
Owner: Neutral
Actor27: t08
Location: 64,55
Owner: Neutral
Actor28: t16
Location: 72,62
Owner: Neutral
Actor29: t15
Location: 71,63
Owner: Neutral
Actor30: tc04
Location: 67,66
Owner: Neutral
Actor31: tc05
Location: 68,67
Owner: Neutral
Actor32: t17
Location: 67,62
Owner: Neutral
Actor33: tc02
Location: 44,68
Owner: Neutral
Actor34: t12
Location: 93,81
Owner: Neutral
Actor35: t03
Location: 93,55
Owner: Neutral
Actor36: t02
Location: 93,57
Owner: Neutral
Actor37: t02
Location: 79,47
Owner: Neutral
Actor38: t11
Location: 77,56
Owner: Neutral
Actor39: t01
Location: 92,45
Owner: Neutral
Actor40: t05
Location: 93,54
Owner: Neutral
Actor41: t06
Location: 93,82
Owner: Neutral
Actor42: t07
Location: 87,44
Owner: Neutral
Actor43: t14
Location: 46,84
Owner: Neutral
Actor44: t08
Location: 48,85
Owner: Neutral
Actor45: t07
Location: 51,84
Owner: Neutral
Actor46: tc01
Location: 62,84
Owner: Neutral
Actor47: t11
Location: 59,71
Owner: Neutral
Actor48: t01
Location: 45,44
Owner: Neutral
Actor49: tc04
Location: 45,53
Owner: Neutral
Actor50: t11
Location: 54,55
Owner: Neutral
Actor51: t10
Location: 84,71
Owner: Neutral
Actor52: tc05
Location: 90,83
Owner: Neutral
Actor53: tc01
Location: 89,84
Owner: Neutral
Actor54: tc04
Location: 85,81
Owner: Neutral
Actor55: tc05
Location: 43,71
Owner: Neutral
Actor56: tc03
Location: 43,70
Owner: Neutral
Actor57: weap
Location: 60,66
Owner: USSR
Health: 1
Facing: 0
Actor58: fact
Location: 62,61
Owner: USSR
Health: 1
Facing: 0
Actor59: proc
Location: 53,62
Owner: USSR
Health: 1
Facing: 0
FreeActor: False
Actor60: powr
Location: 57,62
Owner: USSR
Health: 1
Facing: 0
Actor61: barr
Location: 56,66
Owner: USSR
Health: 1
Facing: 0
Actor62: powr
Location: 59,62
Owner: USSR
Health: 1
Facing: 0
Actor63: kenn
Location: 58,68
Owner: USSR
Health: 0.9921875
Facing: 0
Actor64: brl3
Location: 65,59
Owner: USSR
Health: 1
Facing: 0
Actor65: barl
Location: 66,60
Owner: USSR
Health: 1
Facing: 0
Actor66: barl
Location: 65,60
Owner: USSR
Health: 1
Facing: 0
Actor67: brl3
Location: 64,60
Owner: USSR
Health: 1
Facing: 0
Actor68: barl
Location: 65,61
Owner: USSR
Health: 1
Facing: 0
Actor69: v19
Location: 67,60
Owner: USSR
Health: 1
Facing: 0
Actor70: v19
Location: 67,59
Owner: USSR
Health: 1
Facing: 0
Actor71: barl
Location: 65,62
Owner: USSR
Health: 1
Facing: 0
Actor72: silo
Location: 54,68
Owner: USSR
Health: 1
Facing: 0
Actor73: brl3
Location: 55,70
Owner: USSR
Health: 1
Facing: 0
Actor74: brl3
Location: 54,70
Owner: USSR
Health: 1
Facing: 0
Actor75: barl
Location: 53,69
Owner: USSR
Health: 1
Facing: 0
Actor76: barl
Location: 54,69
Owner: USSR
Health: 1
Facing: 0
Actor77: barl
Location: 55,71
Owner: USSR
Health: 1
Facing: 0
Actor78: brl3
Location: 56,71
Owner: USSR
Health: 1
Facing: 0
Actor79: brl3
Location: 53,68
Owner: USSR
Health: 1
Facing: 0
Actor80: v19
Location: 56,70
Owner: USSR
Health: 1
Facing: 0
Actor81: barl
Location: 55,69
Owner: USSR
Health: 1
Facing: 0
Actor82: brl3
Location: 72,51
Owner: USSR
Health: 1
Facing: 0
Actor83: barl
Location: 72,50
Owner: USSR
Health: 1
Facing: 0
Actor84: barl
Location: 74,48
Owner: USSR
Health: 1
Facing: 0
Actor85: barl
Location: 72,49
Owner: USSR
Health: 1
Facing: 0
Actor86: barl
Location: 73,48
Owner: USSR
Health: 1
Facing: 0
Actor87: v19
Location: 75,48
Owner: USSR
Health: 0.5195313
Facing: 0
Actor88: v19
Location: 62,57
Owner: USSR
Health: 1
Facing: 0
Actor89: v19
Location: 60,58
Owner: USSR
Health: 1
Facing: 0
Actor90: brl3
Location: 62,56
Owner: USSR
Health: 1
Facing: 0
Actor91: brl3
Location: 61,58
Owner: USSR
Health: 1
Facing: 0
Actor92: barl
Location: 61,57
Owner: USSR
Health: 1
Facing: 0
Actor93: brl3
Location: 59,58
Owner: USSR
Health: 1
Facing: 0
Actor94: barl
Location: 58,58
Owner: USSR
Health: 1
Facing: 0
Harvester: harv
Location: 55,65
Owner: USSR
Health: 0.5
Facing: 160
Actor96: dog
Location: 53,58
Owner: USSR
Health: 1
Facing: 0
SubCell: 1
Actor97: dog
Location: 65,68
Owner: USSR
Health: 1
Facing: 64
SubCell: 3
Actor98: dog
Location: 65,66
Owner: USSR
Health: 1
Facing: 32
SubCell: 2
Actor99: dog
Location: 59,70
Owner: USSR
Health: 1
Facing: 160
SubCell: 2
Actor100: e2
Location: 61,56
Owner: USSR
Health: 1
Facing: 32
SubCell: 3
Actor101: e2
Location: 59,57
Owner: USSR
Health: 1
Facing: 224
SubCell: 4
Actor102: e2
Location: 64,67
Owner: USSR
Health: 1
Facing: 96
SubCell: 0
Actor103: e1
Location: 77,74
Owner: BadGuy
Health: 1
Facing: 128
SubCell: 2
Actor104: e1
Location: 80,74
Owner: USSR
Health: 1
Facing: 160
SubCell: 0
Actor105: e1
Location: 56,68
Owner: USSR
Health: 1
Facing: 160
SubCell: 3
Actor106: e1
Location: 50,72
Owner: USSR
Health: 1
Facing: 160
SubCell: 4
Actor107: e1
Location: 73,60
Owner: USSR
Health: 1
Facing: 32
SubCell: 2
Actor108: e1
Location: 74,61
Owner: USSR
Health: 1
Facing: 224
SubCell: 1
Actor109: e1
Location: 72,60
Owner: USSR
Health: 1
Facing: 64
SubCell: 0
Actor110: e1
Location: 49,58
Owner: USSR
Health: 1
Facing: 192
SubCell: 0
Actor111: e1
Location: 51,58
Owner: USSR
Health: 1
Facing: 32
SubCell: 1
Actor112: e1
Location: 60,78
Owner: USSR
Health: 1
Facing: 192
SubCell: 4
Actor113: e2
Location: 62,79
Owner: USSR
Health: 1
Facing: 160
SubCell: 4
Actor114: e1
Location: 57,82
Owner: USSR
Health: 1
Facing: 160
SubCell: 1
Actor115: e1
Location: 60,64
Owner: USSR
Health: 1
Facing: 224
SubCell: 3
Actor116: e2
Location: 68,45
Owner: USSR
Health: 1
Facing: 96
SubCell: 0
Actor117: e1
Location: 48,72
Owner: USSR
Health: 1
Facing: 96
SubCell: 0
Actor118: e1
Location: 57,69
Owner: USSR
Health: 1
Facing: 96
SubCell: 1
Actor119: e2
Location: 60,70
Owner: USSR
Health: 1
Facing: 32
SubCell: 0
Actor120: e1
Location: 89,48
Owner: Greece
Health: 1
Facing: 160
SubCell: 1
Actor121: e1
Location: 87,48
Owner: Greece
Health: 1
Facing: 192
SubCell: 4
Actor122: e1
Location: 87,48
Owner: Greece
Health: 1
Facing: 192
SubCell: 1
Actor123: e1
Location: 88,48
Owner: Greece
Health: 1
Facing: 128
SubCell: 4
Actor124: e1
Location: 88,49
Owner: Greece
Health: 1
Facing: 128
SubCell: 1
Actor125: dog
Location: 78,75
Owner: BadGuy
Health: 1
Facing: 160
SubCell: 1
Actor126: e1
Location: 71,61
Owner: BadGuy
Health: 1
Facing: 160
SubCell: 0
Actor127: dog
Location: 70,61
Owner: BadGuy
Health: 1
Facing: 96
SubCell: 4
Actor128: e1
Location: 50,46
Owner: BadGuy
Health: 1
Facing: 32
SubCell: 1
Actor129: e1
Location: 49,47
Owner: BadGuy
Health: 1
Facing: 64
SubCell: 0
Actor130: e2
Location: 49,49
Owner: BadGuy
Health: 1
Facing: 160
SubCell: 1
Actor131: e2
Location: 47,46
Owner: BadGuy
Health: 1
Facing: 96
SubCell: 3
Actor132: e2
Location: 48,63
Owner: BadGuy
Health: 1
Facing: 0
SubCell: 1
Actor133: e1
Location: 49,63
Owner: BadGuy
Health: 1
Facing: 96
SubCell: 2
Actor134: e1
Location: 74,81
Owner: BadGuy
Health: 1
Facing: 64
SubCell: 3
Actor135: e2
Location: 75,83
Owner: BadGuy
Health: 1
Facing: 96
SubCell: 0
Actor136: e2
Location: 69,66
Owner: USSR
Health: 1
Facing: 0
SubCell: 3
Actor137: e2
Location: 73,51
Owner: USSR
Health: 0.5585938
Facing: 224
SubCell: 4
Actor138: medi
Location: 88,48
Owner: Greece
Health: 1
Facing: 160
SubCell: 1
TruckEntryPoint: waypoint
Location: 49,44
Owner: Neutral
waypoint1: waypoint
Location: 49,50
Owner: Neutral
TruckRallyPoint: waypoint
Location: 49,76
Owner: Neutral
waypoint3: waypoint
Location: 65,82
Owner: Neutral
waypoint4: waypoint
Location: 74,82
Owner: Neutral
waypoint6: waypoint
Location: 65,82
Owner: Neutral
waypoint7: waypoint
Location: 74,82
Owner: Neutral
waypoint8: waypoint
Location: 78,74
Owner: Neutral
waypoint9: waypoint
Location: 82,65
Owner: Neutral
ReinforcementsRallyPoint: waypoint
Location: 88,49
Owner: Neutral
waypoint11: waypoint
Location: 51,65
Owner: Neutral
waypoint12: waypoint
Location: 63,64
Owner: Neutral
waypoint13: waypoint
Location: 72,61
Owner: Neutral
waypoint14: waypoint
Location: 69,47
Owner: Neutral
waypoint15: waypoint
Location: 78,51
Owner: Neutral
waypoint16: waypoint
Location: 80,45
Owner: Neutral
waypoint25: waypoint
Location: 80,89
Owner: Neutral
waypoint26: waypoint
Location: 43,63
Owner: Neutral
waypoint94: waypoint
Location: 90,46
Owner: Neutral
McvDeployPoint: waypoint
Location: 89,51
Owner: Neutral
waypoint96: waypoint
Location: 90,68
Owner: Neutral
waypoint98: waypoint
Location: 88,49
Owner: Neutral
Actor139: fenc
Location: 57,75
Owner: USSR
Actor140: fenc
Location: 57,76
Owner: USSR
Actor141: fenc
Location: 57,77
Owner: USSR
Actor142: fenc
Location: 58,77
Owner: USSR
Actor143: fenc
Location: 58,78
Owner: USSR
Actor144: fenc
Location: 57,78
Owner: USSR
Actor145: fenc
Location: 58,75
Owner: USSR
Actor146: fenc
Location: 58,74
Owner: USSR
Actor147: fenc
Location: 57,74
Owner: USSR
Actor148: fenc
Location: 66,67
Owner: USSR
Actor149: fenc
Location: 66,68
Owner: USSR
Actor150: fenc
Location: 66,69
Owner: USSR
Actor151: fenc
Location: 66,70
Owner: USSR
Actor152: fenc
Location: 65,70
Owner: USSR
Actor153: fenc
Location: 64,70
Owner: USSR
Actor154: fenc
Location: 63,70
Owner: USSR
Actor155: fenc
Location: 51,68
Owner: USSR
Actor156: fenc
Location: 52,68
Owner: USSR
Actor157: fenc
Location: 52,67
Owner: USSR
Actor158: fenc
Location: 52,66
Owner: USSR
Actor159: fenc
Location: 51,66
Owner: USSR
Actor160: fenc
Location: 51,62
Owner: USSR
Actor161: fenc
Location: 51,63
Owner: USSR
Actor162: fenc
Location: 67,58
Owner: USSR
Actor163: fenc
Location: 66,58
Owner: USSR
Actor164: fenc
Location: 66,59
Owner: USSR
Actor165: fenc
Location: 47,51
Owner: USSR
Actor166: fenc
Location: 47,50
Owner: USSR
Actor167: fenc
Location: 46,50
Owner: USSR
Actor168: fenc
Location: 51,50
Owner: USSR
Actor169: fenc
Location: 50,50
Owner: USSR
Actor170: fenc
Location: 50,51
Owner: USSR
ReinforcementsEntryPoint: waypoint
Location: 90,44
Owner: Neutral
TruckExitPoint: waypoint
Location: 80,85
Owner: Neutral
Smudges:
Rules:
Player:
-ConquestVictoryConditions:
World:
-CrateDrop:
-SpawnMPUnits:
-MPStartLocations:
LuaScriptInterface:
LuaScripts: mission.lua
^Infantry:
MustBeDestroyed:
^Tank:
MustBeDestroyed:
^Vehicle:
MustBeDestroyed:
APWR:
Buildable:
Owner: None
FIX:
Buildable:
Owner: None
SYRD:
Buildable:
Owner: None
WEAP:
Buildable:
Owner: None
DOME:
Buildable:
Owner: None
HPAD:
Buildable:
Owner: None
ATEK:
Buildable:
Owner: None
BRIK:
Buildable:
Owner: None
HBOX.E1:
Buildable:
Owner: None
GUN:
Buildable:
Owner: None
AGUN:
Buildable:
Owner: None
GAP:
Buildable:
Owner: None
PDOX:
Buildable:
Owner: None
MSLO:
Buildable:
Owner: None
E6:
Buildable:
Owner: None
SPY:
Buildable:
Owner: None
MECH:
Buildable:
Owner: None
E7:
Buildable:
Owner: None
Sequences:
VoxelSequences:
Weapons:
M60mg:
Range: 5
ROF: 20
Burst: 1
Warhead:
Damage: 20
Voices:
Notifications:
Translations:

View File

@@ -0,0 +1,78 @@
Reinforcements = { "e1", "e1", "e1", "jeep" }
ReinforcementsInterval = 15
TruckNames = { "truk", "truk", "truk" }
TruckInterval = 25
TruckDelay = 75
FirstJeepReinforcementsDelay = 125
SecondJeepReinforcementsDelay = 250
SendMcvReinforcements = function()
Media.PlaySpeechNotification("ReinforcementsArrived")
local mcv = Actor.Create("mcv", { Owner = player, Location = ReinforcementsEntryPoint.Location })
Actor.Move(mcv, McvDeployPoint.Location)
Actor.DeployTransform(mcv)
end
SendJeepReinforcements = function()
Media.PlaySpeechNotification("ReinforcementsArrived")
Mission.Reinforce(player, Reinforcements, ReinforcementsEntryPoint.Location, ReinforcementsRallyPoint.Location, ReinforcementsInterval)
end
RunInitialActivities = function()
Actor.Harvest(Harvester)
end
MissionAccomplished = function()
Mission.MissionOver({ player }, nil, false)
Media.PlayMovieFullscreen("montpass.vqa")
end
MissionFailed = function()
Mission.MissionOver(nil, { player }, false)
Media.PlayMovieFullscreen("frozen.vqa")
end
Tick = function()
Mission.TickTakeOre(ussr)
if not Mission.MissionIsOver then
if Mission.RequiredUnitsAreDestroyed(player) then
MissionFailed()
end
if not trucksSent and Mission.RequiredUnitsAreDestroyed(ussr) and Mission.RequiredUnitsAreDestroyed(badGuy) then
SendTrucks()
trucksSent = true
end
end
end
SendTrucks = function()
Media.PlaySpeechNotification("ConvoyApproaching")
OpenRA.RunAfterDelay(TruckDelay, function()
local trucks = Mission.Reinforce(france, TruckNames, TruckEntryPoint.Location, TruckRallyPoint.Location, TruckInterval,
function(truck)
Actor.Move(truck, TruckExitPoint.Location)
Actor.RemoveSelf(truck)
end)
local trucksTeam = Team.Create(trucks)
Team.AddEventHandler(trucksTeam.OnAllRemovedFromWorld, MissionAccomplished)
Team.AddEventHandler(trucksTeam.OnAnyKilled, MissionFailed)
end)
end
WorldLoaded = function()
player = OpenRA.GetPlayer("Greece")
france = OpenRA.GetPlayer("France")
ussr = OpenRA.GetPlayer("USSR")
badGuy = OpenRA.GetPlayer("BadGuy")
RunInitialActivities()
SendMcvReinforcements()
OpenRA.RunAfterDelay(FirstJeepReinforcementsDelay, SendJeepReinforcements)
OpenRA.RunAfterDelay(SecondJeepReinforcementsDelay, SendJeepReinforcements)
OpenRA.SetViewportCenterPosition(ReinforcementsEntryPoint.CenterPosition)
Media.PlayMovieFullscreen("ally2.vqa", function() Media.PlayMovieFullscreen("mcv.vqa", Media.PlayRandomMusic) end)
end

View File

@@ -164,3 +164,12 @@ Fonts:
TinyBold:
Font:FreeSansBold.ttf
Size:10
LuaScripts:
mods/ra/lua/utils.lua
mods/ra/lua/openra.lua
mods/ra/lua/map.lua
mods/ra/lua/actor.lua
mods/ra/lua/team.lua
mods/ra/lua/media.lua
mods/ra/lua/mission.lua

View File

@@ -24,7 +24,10 @@ Speech:
NavalUnitLost: navylst1
AirUnitLost: aunitl1
BuildingCaptured: strucap1
ReinforcementsArrived: reinfor1
SignalFlareNorth: flaren1
AlliedReinforcementsArrived: aarrive1
ConvoyApproaching: convyap1
Sounds:
Notifications:

View File

@@ -242,6 +242,19 @@ V19:
ExcludeTilesets: DESERT
Tooltip:
Name: Oil Pump
LeavesHusk:
HuskActor: V19.Husk
AutoTargetIgnore:
V19.Husk:
Inherits: ^CivBuilding
EditorTilesetFilter:
ExcludeTilesets: DESERT
Tooltip:
Name: Husk (Oil Pump)
WithFire:
-Health:
-Selectable:
BARL:
Inherits: ^TechBuilding
@@ -327,7 +340,6 @@ OILB:
ExternalCapturable:
ExternalCapturableBar:
EngineerRepairable:
-MustBeDestroyed:
CashTrickler:
Period: 250
Amount: 100

View File

@@ -42,6 +42,8 @@
SuccessRate: 20
EjectOnGround: yes
EjectInAir: no
Huntable:
LuaScriptEvents:
^Tank:
AppearsOnRadar:
@@ -87,6 +89,8 @@
SuccessRate: 20
EjectOnGround: yes
EjectInAir: no
Huntable:
LuaScriptEvents:
^Infantry:
AppearsOnRadar:
@@ -142,6 +146,8 @@
HealIfBelow: 1
DamageCooldown: 125
RequiresTech: InfantryHealing
Huntable:
LuaScriptEvents:
^Ship:
AppearsOnRadar:
@@ -174,6 +180,8 @@
Guard:
Guardable:
BodyOrientation:
Huntable:
LuaScriptEvents:
^Plane:
AppearsOnRadar:
@@ -203,6 +211,8 @@
UpdatesPlayerStatistics:
CombatDebugOverlay:
BodyOrientation:
Huntable:
LuaScriptEvents:
^Helicopter:
Inherits: ^Plane
@@ -252,6 +262,8 @@
FrozenUnderFog:
GpsDot:
String:Structure
Huntable:
LuaScriptEvents:
^Wall:
AppearsOnRadar:
@@ -287,6 +299,7 @@
Guardable:
BodyOrientation:
FrozenUnderFog:
LuaScriptEvents:
^TechBuilding:
Inherits: ^Building
@@ -308,6 +321,7 @@
FrozenUnderFog:
StartsRevealed: true
-GpsDot:
-MustBeDestroyed:
^AmmoBox:
Inherits: ^TechBuilding
@@ -390,6 +404,7 @@
BodyOrientation:
FrozenUnderFog:
StartsRevealed: true
LuaScriptEvents:
^Husk:
Husk:
@@ -407,6 +422,7 @@
BelowUnits:
BodyOrientation:
Chronoshiftable:
LuaScriptEvents:
^HelicopterHusk:
Inherits: ^Husk
@@ -441,6 +457,7 @@
Types:Bridge
AutoTargetIgnore:
BodyOrientation:
LuaScriptEvents:
#Temperate Terrain Expansion
^SVBridge:
@@ -458,6 +475,7 @@
Types:Bridge
AutoTargetIgnore:
BodyOrientation:
LuaScriptEvents:
^SHBridge:
Tooltip:
@@ -474,6 +492,7 @@
Types:Bridge
AutoTargetIgnore:
BodyOrientation:
LuaScriptEvents:
^STDBridge:
Tooltip:
@@ -490,6 +509,7 @@
Types:Bridge
AutoTargetIgnore:
BodyOrientation:
LuaScriptEvents:
#Desert Terrain Expansion:
^Rock:
@@ -511,6 +531,7 @@
BodyOrientation:
FrozenUnderFog:
StartsRevealed: true
LuaScriptEvents:
^DesertCivBuilding:
Inherits: ^CivBuilding

View File

@@ -357,9 +357,18 @@ v19:
idle:
Start: 0
Length: 14
damaged-idle:
Start: 14
Length: 15
v19.husk:
idle: v19
Start: 28
fire-start: flmspt
Start: 0
Length: *
Offset: 7,-15
fire-loop: flmspt
Start: 50
Length: *
Offset: 7,-15
utilpol1:
idle:

View File

@@ -78,8 +78,8 @@ CivilianFemaleVoice:
EinsteinVoice:
Voices:
Select: einah1,einok1,einyes1
Move: einah1,einok1,einyes1
Select: einah1
Move: einok1,einyes1
Die: dedman1,dedman2,dedman3,dedman4,dedman5,dedman6,dedman7,dedman8,dedman10
ShokVoice:

View File

@@ -185,3 +185,12 @@ Fonts:
TinyBold:
Font:FreeSansBold.ttf
Size:10
LuaScripts:
mods/ra/lua/utils.lua
mods/ra/lua/openra.lua
mods/ra/lua/map.lua
mods/ra/lua/actor.lua
mods/ra/lua/team.lua
mods/ra/lua/media.lua
mods/ra/lua/mission.lua

View File

@@ -36,6 +36,8 @@
Guardable:
Range: 3
BodyOrientation:
Huntable:
LuaScriptEvents:
^Infantry:
AppearsOnRadar:
@@ -80,6 +82,8 @@
Guard:
Guardable:
BodyOrientation:
Huntable:
LuaScriptEvents:
^CivilianInfantry:
Inherits: ^Infantry
@@ -145,6 +149,8 @@
Guard:
Guardable:
BodyOrientation:
Huntable:
LuaScriptEvents:
^Wall:
AppearsOnRadar:
@@ -175,6 +181,7 @@
Sellable:
UpdatesPlayerStatistics:
BodyOrientation:
LuaScriptEvents:
^Helicopter:
AppearsOnRadar:
@@ -197,4 +204,6 @@
DrawLineToTarget:
ActorLostNotification:
CombatDebugOverlay:
BodyOrientation:
BodyOrientation:
Huntable:
LuaScriptEvents: