Initial commit: OpenRA game engine
Some checks failed
Continuous Integration / Linux (.NET 8.0) (push) Has been cancelled
Continuous Integration / Windows (.NET 8.0) (push) Has been cancelled

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:
let5sne.win10
2026-01-10 21:46:54 +08:00
commit 9cf6ebb986
4065 changed files with 635973 additions and 0 deletions

View File

@@ -0,0 +1,188 @@
--[[
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.
]]
AIPlayers = { }
AIBarracks = { }
AIDerricks = { }
AIBaseLocation = { }
IdlingAIActors = { }
IdlingAISupportActors = { }
AIOnDefense = { }
-- It's good to start with 10 rifle man, one medic and 5 rocket soldiers
InitialUnitsToBuild = { "e1", "e1", "e1", "e1", "e1", "medi", "e1", "e1", "e1", "e1", "e1", "e3", "e3", "e3", "e3", "e3" }
UnitsToBuild = { "e1", "e1", "e1", "e1", "e1", "e3", "e3", "e3", "medi" }
ActivateAI = function(player, id)
AIPlayers[id] = player
Trigger.AfterDelay(0, function()
local barracks = player.GetActorsByType("tent")
if #barracks > 0 then
AIBarracks[id] = barracks[1]
AIBaseLocation[id] = barracks[1].Location + CVec.New(2, 1)
IdlingAIActors[id] = { }
IdlingAISupportActors[id] = { }
InitialInfantryProduction(id, InitialUnitsToBuild)
DefendActor(id, barracks[1])
RepairBarracks(id)
SellWalls(id)
Trigger.AfterDelay(DateTime.Seconds(10), function() LookOutForCrates(id) end)
end
local derricks = player.GetActorsByType("oilb")
if #derricks > 0 then
AIDerricks[id] = derricks[1]
DefendActor(id, derricks[1])
end
end)
end
InitialInfantryProduction = function(id, units)
local productionComplete = AIPlayers[id].Build(units, function(actors)
ProduceInfantry(id)
end)
Trigger.OnProduction(AIBarracks[id], function(producer, produced)
BuildComplete(id, produced)
end)
end
ProduceInfantry = function(id)
local productionComplete = AIPlayers[id].Build({ Utils.Random(UnitsToBuild) }, function(actors)
Trigger.AfterDelay(0, function() ProduceInfantry(id) end)
end)
if not productionComplete then
Trigger.AfterDelay(0, function() ProduceInfantry(id) end)
end
end
BuildComplete = function(id, actor)
if actor.Type == "medi" then
local number = #IdlingAISupportActors[id] + 1
IdlingAISupportActors[id][number] = actor
Trigger.OnKilled(actor, function()
table.remove(IdlingAISupportActors[id], number)
end)
else
local number = #IdlingAIActors[id] + 1
IdlingAIActors[id][number] = actor
Trigger.OnKilled(actor, function()
table.remove(IdlingAIActors[id], number)
end)
end
Trigger.AfterDelay(0, function() DefendActor(id, actor) end)
end
AttackGroupSize = 5
SetupAttackGroup = function(id)
local units = { }
for i = 0, AttackGroupSize, 1 do
if (#IdlingAIActors[id] == 0) then
return units
end
local number = Utils.RandomInteger(0, #IdlingAIActors[id]) + 1
units[#units + 1] = IdlingAIActors[id][number]
table.remove(IdlingAIActors[id], number)
end
return units
end
DefendActor = function(id, actorToDefend)
if not actorToDefend or actorToDefend.IsDead or not actorToDefend.IsInWorld then
return
end
Trigger.OnDamaged(actorToDefend, function(self, attacker)
if AIOnDefense[id] or not attacker or attacker.IsDead then
return
end
-- Don't try to kill something you can't kill
if attacker.Type == "sniper.soviets" then
return
end
AIOnDefense[id] = true
local attackLoc = attacker.Location
local defenders = SetupAttackGroup(id)
if not defenders or #defenders == 0 then
Trigger.AfterDelay(DateTime.Seconds(30), function() AIOnDefense[id] = false end)
return
end
Utils.Do(defenders, function(unit)
if unit.IsDead then
return
end
unit.AttackMove(attackLoc)
local home = AIBaseLocation[id]
Trigger.OnIdle(unit, function()
if unit.Location == home then
IdlingAIActors[id][#IdlingAIActors[id] + 1] = unit
Trigger.Clear(unit, "OnIdle")
AIOnDefense[id] = false
else
unit.AttackMove(home)
end
end)
end)
end)
end
RepairBarracks = function(id)
Trigger.OnDamaged(AIBarracks[id], function(self, attacker)
self.StartBuildingRepairs(AIPlayers[id])
end)
end
SellWalls = function(id)
Media.DisplayMessage(UserInterface.GetFluentMessage("lonestar-ai-sold-its-walls", { ["id"] = id }))
local walls = AIPlayers[id].GetActorsByType("brik")
Utils.Do(walls, function(wall)
wall.Sell()
end)
end
LookOutForCrates = function(id)
Trigger.OnEnteredProximityTrigger(AIBarracks[id].CenterPosition, WDist.New(12 * 1024), function(actor)
if actor.Type ~= "fortcrate" or #IdlingAIActors[id] == 0 then
return
end
local unit = Utils.Random(IdlingAIActors[id])
local home = AIBaseLocation[id]
local aim = actor.Location
if unit.IsDead then
return
end
unit.AttackMove(aim)
Trigger.OnIdle(unit, function()
if unit.Location == aim or not actor.IsInWorld then
unit.AttackMove(home)
Trigger.Clear(unit, "OnIdle")
else
unit.AttackMove(aim)
end
end)
end)
end

View File

@@ -0,0 +1,229 @@
--[[
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.
]]
SovietEntryPoints = { Entry1, Entry2, Entry3, Entry4, Entry5, Entry6, Entry7, Entry8 }
PatrolWaypoints = { Entry2, Entry4, Entry6, Entry8 }
ParadropWaypoints = { Paradrop1, Paradrop2, Paradrop3, Paradrop4 }
SpawnPoints = { Spawn1, Spawn2, Spawn3, Spawn4 }
Snipers = { Sniper1, Sniper2, Sniper3, Sniper4, Sniper5, Sniper6, Sniper7, Sniper8, Sniper9, Sniper10, Sniper11, Sniper12 }
Walls =
{
{ WallTopRight1, WallTopRight2, WallTopRight3, WallTopRight4, WallTopRight5, WallTopRight6, WallTopRight7, WallTopRight8, WallTopRight9 },
{ WallTopLeft1, WallTopLeft2, WallTopLeft3, WallTopLeft4, WallTopLeft5, WallTopLeft6, WallTopLeft7, WallTopLeft8, WallTopLeft9 },
{ WallBottomLeft1, WallBottomLeft2, WallBottomLeft3, WallBottomLeft4, WallBottomLeft5, WallBottomLeft6, WallBottomLeft7, WallBottomLeft8, WallBottomLeft9 },
{ WallBottomRight1, WallBottomRight2, WallBottomRight3, WallBottomRight4, WallBottomRight5, WallBottomRight6, WallBottomRight7, WallBottomRight8, WallBottomRight9 }
}
if Difficulty == "veryeasy" then
ParaChance = 20
Patrol = { "e1", "e2", "e1" }
Infantry = { "e4", "e1", "e1", "e2", "e2" }
Vehicles = { "apc" }
Tank = { "3tnk" }
LongRange = { "arty" }
Boss = { "v2rl" }
Swarm = { "shok", "shok", "shok" }
elseif Difficulty == "easy" then
ParaChance = 25
Patrol = { "e1", "e2", "e1" }
Infantry = { "e4", "e1", "e1", "e2", "e1", "e2", "e1" }
Vehicles = { "ftrk", "apc", "arty" }
Tank = { "3tnk" }
LongRange = { "v2rl" }
Boss = { "4tnk" }
Swarm = { "shok", "shok", "shok", "shok", "ttnk" }
elseif Difficulty == "normal" then
ParaChance = 30
Patrol = { "e1", "e2", "e1", "e1" }
Infantry = { "e4", "e1", "e1", "e2", "e1", "e2", "e1" }
Vehicles = { "ftrk", "ftrk", "apc", "arty" }
Tank = { "3tnk" }
LongRange = { "v2rl" }
Boss = { "4tnk" }
Swarm = { "shok", "shok", "shok", "shok", "ttnk", "ttnk", "ttnk" }
elseif Difficulty == "hard" then
ParaChance = 35
Patrol = { "e1", "e2", "e1", "e1", "e4" }
Infantry = { "e4", "e1", "e1", "e2", "e1", "e2", "e1" }
Vehicles = { "arty", "ftrk", "ftrk", "apc", "apc" }
Tank = { "3tnk" }
LongRange = { "v2rl" }
Boss = { "4tnk" }
Swarm = { "shok", "shok", "shok", "shok", "shok", "ttnk", "ttnk", "ttnk", "ttnk" }
else
ParaChance = 40
Patrol = { "e1", "e2", "e1", "e1", "e4", "e4" }
Infantry = { "e4", "e1", "e1", "e2", "e1", "e2", "e1", "e1" }
Vehicles = { "arty", "arty", "ftrk", "apc", "apc" }
Tank = { "ftrk", "3tnk" }
LongRange = { "v2rl" }
Boss = { "4tnk" }
Swarm = { "shok", "shok", "shok", "shok", "shok", "shok", "ttnk", "ttnk", "ttnk", "ttnk", "ttnk" }
end
Wave = 0
Waves =
{
{ delay = 500, units = { Infantry } },
{ delay = 500, units = { Patrol, Patrol } },
{ delay = 700, units = { Infantry, Infantry, Vehicles }, },
{ delay = 1500, units = { Infantry, Infantry, Infantry, Infantry } },
{ delay = 1500, units = { Infantry, Infantry, Patrol, Vehicles } },
{ delay = 1500, units = { Infantry, Infantry, Patrol, Infantry, Tank, Vehicles } },
{ delay = 1500, units = { Infantry, Infantry, Patrol, Infantry, Tank, Tank, Swarm } },
{ delay = 1500, units = { Infantry, Infantry, Patrol, Infantry, Infantry, Infantry, LongRange } },
{ delay = 1500, units = { Infantry, Infantry, Patrol, Infantry, Infantry, Infantry, Infantry, LongRange, Tank, LongRange } },
{ delay = 1500, units = { Infantry, Infantry, Patrol, Infantry, Infantry, Infantry, Infantry, Infantry, LongRange, LongRange, Tank, Tank, Vehicles } },
{ delay = 1500, units = { Infantry, Infantry, Patrol, Infantry, Infantry, Infantry, Infantry, Infantry, Infantry, Boss, Swarm } }
}
-- Now do some adjustments to the waves
if Difficulty == "tough" or Difficulty == "endless" then
Waves[8] = { delay = 1500, units = { Infantry, Infantry, Patrol, Infantry, Infantry, Infantry }, ironUnits = { LongRange } }
Waves[9] = { delay = 1500, units = { Infantry, Infantry, Patrol, Infantry, Infantry, Infantry, Infantry, Infantry, LongRange, LongRange, Vehicles, Tank }, ironUnits = { Tank } }
Waves[11] = { delay = 1500, units = { Vehicles, Infantry, Patrol, Patrol, Patrol, Infantry, LongRange, Tank, Boss, Infantry, Infantry, Patrol } }
end
IdleHunt = function(actor)
Trigger.OnIdle(actor, function(a)
if a.IsInWorld then
a.Hunt()
end
end)
end
SendUnits = function(entryCell, unitTypes, targetCell, extraData)
Reinforcements.Reinforce(Soviets, unitTypes, { entryCell }, 40, function(a)
if not a.HasProperty("AttackMove") then
Trigger.OnIdle(a, function(a)
a.Move(targetCell)
end)
return
end
a.AttackMove(targetCell)
Trigger.OnIdle(a, function(a)
a.Hunt()
end)
if extraData == "IronCurtain" then
a.GrantCondition("invulnerability", DateTime.Seconds(25))
end
end)
end
SendWave = function()
Wave = Wave + 1
local wave = Waves[Wave]
Trigger.AfterDelay(wave.delay, function()
Utils.Do(wave.units, function(units)
local entry = Utils.Random(SovietEntryPoints).Location
local target = Utils.Random(SpawnPoints).Location
SendUnits(entry, units, target)
end)
if wave.ironUnits then
Utils.Do(wave.ironUnits, function(units)
local entry = Utils.Random(SovietEntryPoints).Location
local target = Utils.Random(SpawnPoints).Location
SendUnits(entry, units, target, "IronCurtain")
end)
end
Utils.Do(Players, function(player)
Media.PlaySpeechNotification(player, "EnemyUnitsApproaching")
end)
if (Wave < #Waves) then
if Utils.RandomInteger(1, 100) < ParaChance then
local aircraft = ParaProxy.TargetParatroopers(Utils.Random(ParadropWaypoints).CenterPosition)
Utils.Do(aircraft, function(a)
Trigger.OnPassengerExited(a, function(t, p)
IdleHunt(p)
end)
end)
local delay = Utils.RandomInteger(DateTime.Seconds(20), DateTime.Seconds(45))
Trigger.AfterDelay(delay, SendWave)
else
SendWave()
end
else
if Difficulty == "endless" then
Wave = 0
IncreaseDifficulty()
SendWave()
return
end
Trigger.AfterDelay(DateTime.Minutes(1), SovietsRetreating)
Media.DisplayMessage(UserInterface.GetFluentMessage("no-more-waves"))
end
end)
end
SovietsRetreating = function()
Utils.Do(Snipers, function(a)
if not a.IsDead and a.Owner == Soviets then
a.Destroy()
end
end)
end
IncreaseDifficulty = function()
local additions = { Infantry, Patrol, Vehicles, Tank, LongRange, Boss, Swarm }
Utils.Do(Waves, function(wave)
wave.units[#wave.units + 1] = Utils.Random(additions)
end)
end
Tick = function()
if (Utils.RandomInteger(1, 200) == 10) then
local delay = Utils.RandomInteger(1, 10)
Lighting.Flash("LightningStrike", delay)
Trigger.AfterDelay(delay, function()
Media.PlaySound("thunder" .. Utils.RandomInteger(1,6) .. ".aud")
end)
end
if (Utils.RandomInteger(1, 200) == 10) then
Media.PlaySound("thunder-ambient.aud")
end
end
SetupWallOwners = function()
Utils.Do(Players, function(player)
Utils.Do(Walls[player.Spawn], function(wall)
wall.Owner = player
end)
end)
end
WorldLoaded = function()
Soviets = Player.GetPlayer("Soviets")
Players = { }
for i = 0, 4 do
local player = Player.GetPlayer("Multi" ..i)
Players[i] = player
if Players[i] and Players[i].IsBot then
ActivateAI(Players[i], i)
end
end
Media.DisplayMessage(UserInterface.GetFluentMessage("defend-fort-lonestar"))
SetupWallOwners()
ParaProxy = Actor.Create("powerproxy.paratroopers", false, { Owner = Soviets })
SendWave()
end

Binary file not shown.

View File

@@ -0,0 +1,26 @@
dropdown-difficulty =
.label = Difficulty
.description = The difficulty of the mission
options-difficulty =
.hard4p = Hard (4P)
.normal3p = Normal (3P)
.easy2p = Easy (2P)
.veryeasy1p = Very Easy (1P)
.endless = Endless mode
.tough = Real tough guy
actor-mobiletent-name = Mobile Tent
actor-sniper =
.name = Sniper
.description = Elite sniper infantry unit.
Can detect cloaked units.
Strong vs Infantry
Weak vs Vehicles, Aircraft
actor-mig-bomber-name = MiG Bomber
## rules.yaml
bot-lonestarai-name = Lonestar AI
actor-powerproxy-parabombs-description = A MiG bomber drops a load of parachuted bombs on your target.

Binary file not shown.

After

Width:  |  Height:  |  Size: 454 B

View File

@@ -0,0 +1,472 @@
MapFormat: 12
RequiresMod: ra
Title: Fort Lonestar
Author: Nuke'm Bro, abcdefg30
Tileset: TEMPERAT
MapSize: 96,96
Bounds: 8,8,48,48
Visibility: Lobby
Categories: Minigame
Players:
PlayerReference@Neutral:
Name: Neutral
OwnsWorld: True
NonCombatant: True
Faction: allies
PlayerReference@Multi0:
Name: Multi0
Playable: True
LockTeam: True
Team: 1
LockFaction: True
Faction: allies
Allies: Multi1, Multi2, Multi3
Enemies: Soviets
PlayerReference@Multi1:
Name: Multi1
Playable: True
LockTeam: True
Team: 1
LockFaction: True
Faction: allies
Allies: Multi0, Multi2, Multi3
Enemies: Soviets
PlayerReference@Multi2:
Name: Multi2
Playable: True
LockTeam: True
Team: 1
LockFaction: True
Faction: allies
Allies: Multi0, Multi1, Multi3
Enemies: Soviets
PlayerReference@Multi3:
Name: Multi3
Playable: True
LockTeam: True
Team: 1
LockFaction: True
Faction: allies
Allies: Multi0, Multi1, Multi2
Enemies: Soviets
PlayerReference@Soviets:
Name: Soviets
Faction: soviet
LockTeam: True
Team: 2
Color: FF0101
Enemies: Multi0, Multi1, Multi2, Multi3
Actors:
Actor76: t11
Location: 47,27
Owner: Neutral
Actor47: t12
Location: 55,24
Owner: Neutral
Actor25: tc03
Location: 54,49
Owner: Neutral
Actor14: tc04
Location: 24,7
Owner: Neutral
Actor10: tc04
Location: 38,53
Owner: Neutral
Actor0: t14
Location: 32,16
Owner: Neutral
Actor75: tc04
Location: 45,25
Owner: Neutral
Actor72: tc01
Location: 49,16
Owner: Neutral
Actor58: t10
Location: 22,54
Owner: Neutral
Actor26: tc01
Location: 54,41
Owner: Neutral
Actor37: tc01
Location: 54,21
Owner: Neutral
Actor60: tc05
Location: 7,16
Owner: Neutral
Actor69: t17
Location: 23,8
Owner: Neutral
Actor4: tc04
Location: 29,45
Owner: Neutral
Actor6: t17
Location: 33,43
Owner: Neutral
Actor16: tc04
Location: 53,16
Owner: Neutral
Actor21: tc03
Location: 8,14
Owner: Neutral
Actor8: t14
Location: 49,37
Owner: Neutral
Actor29: tc01
Location: 8,42
Owner: Neutral
Actor49: t15
Location: 54,47
Owner: Neutral
Actor62: tc05
Location: 6,43
Owner: Neutral
Actor73: tc05
Location: 16,34
Owner: Neutral
Actor32: tc01
Location: 8,24
Owner: Neutral
Actor59: tc05
Location: 7,39
Owner: Neutral
Actor5: tc01
Location: 44,44
Owner: Neutral
Actor51: t08
Location: 55,46
Owner: Neutral
Actor57: t12
Location: 19,54
Owner: Neutral
Actor54: t11
Location: 26,54
Owner: Neutral
Actor33: tc01
Location: 21,7
Owner: Neutral
Actor27: tc01
Location: 42,54
Owner: Neutral
Actor23: tc03
Location: 16,54
Owner: Neutral
Actor15: tc04
Location: 38,8
Owner: Neutral
Actor19: tc03
Location: 18,7
Owner: Neutral
Actor17: tc03
Location: 54,26
Owner: Neutral
Actor11: tc04
Location: 20,53
Owner: Neutral
Actor9: tc04
Location: 53,37
Owner: Neutral
Actor7: tc02
Location: 44,36
Owner: Neutral
Actor3: t15
Location: 19,25
Owner: Neutral
Actor1: t05
Location: 29,16
Owner: Neutral
Actor71: tc02
Location: 15,40
Owner: Neutral
Actor64: t06
Location: 18,16
Owner: Neutral
Actor63: t14
Location: 8,22
Owner: Neutral
Actor53: t08
Location: 41,55
Owner: Neutral
Actor61: tc05
Location: 54,39
Owner: Neutral
Actor48: t01
Location: 54,23
Owner: Neutral
Actor50: t17
Location: 54,44
Owner: Neutral
Actor36: tc01
Location: 42,8
Owner: Neutral
Actor52: t12
Location: 44,53
Owner: Neutral
Actor28: tc01
Location: 24,54
Owner: Neutral
Actor22: tc03
Location: 7,46
Owner: Neutral
Actor24: tc03
Location: 45,54
Owner: Neutral
Actor18: tc03
Location: 45,8
Owner: Neutral
Actor12: tc04
Location: 7,37
Owner: Neutral
Actor13: tc04
Location: 8,19
Owner: Neutral
Actor2: tc04
Location: 14,23
Owner: Neutral
Actor74: t06
Location: 19,36
Owner: Neutral
Actor46: t11
Location: 54,19
Owner: Neutral
Actor42: t16
Location: 53,19
Owner: Neutral
Actor68: tc05
Location: 35,7
Owner: Neutral
WallTopLeft1: brik
Location: 25,28
Owner: Neutral
WallTopLeft2: brik
Location: 25,27
Owner: Neutral
WallTopLeft3: brik
Location: 25,26
Owner: Neutral
WallTopLeft4: brik
Location: 25,29
Owner: Neutral
WallTopLeft5: brik
Location: 29,25
Owner: Neutral
WallTopLeft6: brik
Location: 25,25
Owner: Neutral
WallTopLeft7: brik
Location: 26,25
Owner: Neutral
WallTopLeft8: brik
Location: 27,25
Owner: Neutral
WallTopLeft9: brik
Location: 28,25
Owner: Neutral
WallTopRight1: brik
Location: 35,25
Owner: Neutral
WallTopRight2: brik
Location: 36,25
Owner: Neutral
WallTopRight3: brik
Location: 37,25
Owner: Neutral
WallTopRight4: brik
Location: 38,25
Owner: Neutral
WallTopRight5: brik
Location: 39,25
Owner: Neutral
WallTopRight6: brik
Location: 39,26
Owner: Neutral
WallTopRight7: brik
Location: 39,27
Owner: Neutral
WallTopRight8: brik
Location: 39,28
Owner: Neutral
WallTopRight9: brik
Location: 39,29
Owner: Neutral
WallBottomRight1: brik
Location: 39,37
Owner: Neutral
WallBottomRight2: brik
Location: 37,39
Owner: Neutral
WallBottomRight3: brik
Location: 39,38
Owner: Neutral
WallBottomRight4: brik
Location: 39,39
Owner: Neutral
WallBottomRight5: brik
Location: 38,39
Owner: Neutral
WallBottomRight6: brik
Location: 39,35
Owner: Neutral
WallBottomRight7: brik
Location: 39,36
Owner: Neutral
WallBottomRight8: brik
Location: 35,39
Owner: Neutral
WallBottomRight9: brik
Location: 36,39
Owner: Neutral
WallBottomLeft1: brik
Location: 25,39
Owner: Neutral
WallBottomLeft2: brik
Location: 28,39
Owner: Neutral
WallBottomLeft3: brik
Location: 29,39
Owner: Neutral
WallBottomLeft4: brik
Location: 27,39
Owner: Neutral
WallBottomLeft5: brik
Location: 25,35
Owner: Neutral
WallBottomLeft6: brik
Location: 25,36
Owner: Neutral
WallBottomLeft7: brik
Location: 25,37
Owner: Neutral
WallBottomLeft8: brik
Location: 25,38
Owner: Neutral
WallBottomLeft9: brik
Location: 26,39
Owner: Neutral
Sniper1: sniper.soviets
Location: 9,26
Owner: Soviets
Sniper2: sniper.soviets
Location: 10,21
Owner: Soviets
Sniper3: sniper.soviets
Location: 26,9
Owner: Soviets
Sniper4: sniper.soviets
Location: 40,10
Owner: Soviets
Sniper5: sniper.soviets
Location: 53,21
Owner: Soviets
Sniper6: sniper.soviets
Location: 54,25
Owner: Soviets
Sniper7: sniper.soviets
Location: 53,40
Owner: Soviets
Sniper8: sniper.soviets
Location: 54,43
Owner: Soviets
Sniper9: sniper.soviets
Location: 54,46
Owner: Soviets
Sniper10: sniper.soviets
Location: 43,53
Owner: Soviets
Sniper11: sniper.soviets
Location: 8,36
Owner: Soviets
Sniper12: sniper.soviets
Location: 28,55
Owner: Soviets
OilDerrick1: oilb
Location: 32,30
Owner: Multi0
OilDerrick2: oilb
Location: 32,32
Owner: Multi1
OilDerrick3: oilb
Location: 30,32
Owner: Multi2
OilDerrick4: oilb
Location: 30,30
Owner: Multi3
Spawn1: mpspawn
Location: 36,26
Owner: Neutral
Spawn2: mpspawn
Location: 27,26
Owner: Neutral
Spawn3: mpspawn
Location: 27,36
Owner: Neutral
Spawn4: mpspawn
Location: 36,36
Owner: Neutral
Entry1: waypoint
Location: 8,8
Owner: Neutral
Entry2: waypoint
Location: 31,8
Owner: Neutral
Entry3: waypoint
Location: 55,8
Owner: Neutral
Entry4: waypoint
Location: 55,32
Owner: Neutral
Entry5: waypoint
Location: 55,55
Owner: Neutral
Entry6: waypoint
Location: 32,55
Owner: Neutral
Entry7: waypoint
Location: 8,55
Owner: Neutral
Entry8: waypoint
Location: 8,32
Owner: Neutral
Paradrop1: waypoint
Location: 32,28
Owner: Neutral
Paradrop2: waypoint
Location: 27,32
Owner: Neutral
Paradrop3: waypoint
Location: 32,36
Owner: Neutral
Paradrop4: waypoint
Location: 36,32
Owner: Neutral
Patrol1: waypoint
Location: 32,18
Owner: Neutral
Patrol2: waypoint
Location: 17,32
Owner: Neutral
Patrol3: waypoint
Location: 32,46
Owner: Neutral
Patrol4: waypoint
Location: 46,32
Owner: Neutral
Rules: rules.yaml
Weapons: weapons.yaml
Sequences: sequences.yaml
Music: music.yaml
FluentMessages: ra|fluent/lua.ftl, map.ftl

View File

@@ -0,0 +1,2 @@
rain: Rain (ambient)
Hidden: true

Binary file not shown.

View File

@@ -0,0 +1,477 @@
World:
CrateSpawner:
InitialSpawnDelay: 0
Maximum: 4
SpawnInterval: 1000
CrateActors: fortcrate
StartingUnits@mcvonly:
BaseActor: tent
WeatherOverlay:
WindTick: 150, 550
UseSquares: false
ScatterDirection: 0, 0
Gravity: 15, 25
SwingOffset: 0, 0
SwingSpeed: 0, 0
SwingAmplitude: 0, 0
ParticleColors: 304074, 28386C, 202C60, 182C54
LineTailAlphaValue: 150
ParticleSize: 1, 1
TintPostProcessEffect:
Red: 0.75
Green: 0.85
Blue: 1.5
Ambient: 0.45
MusicPlaylist:
BackgroundMusic: rain
FlashPostProcessEffect@LIGHTNINGSTRIKE:
Type: LightningStrike
LuaScript:
Scripts: campaign.lua, fort-lonestar.lua, fort-lonestar-AI.lua
MapBuildRadius:
AllyBuildRadiusCheckboxVisible: False
BuildRadiusCheckboxVisible: False
SpawnStartingUnits:
DropdownVisible: False
DropdownLocked: True
MapOptions:
TechLevelDropdownLocked: True
TechLevel: unrestricted
TechLevelDropdownVisible: False
ShortGameCheckboxLocked: True
ShortGameCheckboxEnabled: False
ShortGameCheckboxVisible: False
ScriptLobbyDropdown@difficulty:
ID: difficulty
Label: dropdown-difficulty.label
Description: dropdown-difficulty.description
Values:
hard: options-difficulty.hard4p
normal: options-difficulty.normal3p
easy: options-difficulty.easy2p
veryeasy: options-difficulty.veryeasy1p
tough: options-difficulty.tough
endless: options-difficulty.endless
Default: hard
DisplayOrder: 5
MapStartingLocations:
SeparateTeamSpawnsCheckboxEnabled: False
SeparateTeamSpawnsCheckboxLocked: True
SeparateTeamSpawnsCheckboxVisible: False
TimeLimitManager:
TimeLimitLocked: True
TimeLimitDropdownVisible: False
FORTCRATE:
Inherits: ^Crate
SupportPowerCrateAction@parabombs:
SelectionShares: 30
Proxy: powerproxy.parabombs
Sequence: parabombs
HealActorsCrateAction:
SelectionShares: 30
Sound: heal2.aud
Sequence: heal
GiveCashCrateAction:
Amount: 400
UseCashTick: true
SelectionShares: 30
GiveUnitCrateAction@e7:
Units: e7
SelectionShares: 10
GrantExternalConditionCrateAction@ironcurtain:
SelectionShares: 10
Sequence: invuln
Sound: ironcur9.aud
Condition: invulnerability
Duration: 1200
ExplodeCrateAction@bigboom:
Weapon: SCUD
SelectionShares: 5
GiveBaseBuilderCrateAction:
SelectionShares: 0
NoBaseSelectionShares: 1000
Units: mobiletent
ValidFactions: allies
Player:
ClassicProductionQueue@Infantry:
BuildDurationModifier: 250
-EnemyWatcher:
Shroud:
FogCheckboxLocked: True
FogCheckboxEnabled: True
FogCheckboxVisible: False
ExploredMapCheckboxLocked: True
ExploredMapCheckboxEnabled: False
ExploredMapCheckboxVisible: False
PlayerResources:
DefaultCashDropdownLocked: True
DefaultCashDropdownVisible: False
DefaultCash: 50
-ModularBot@RushAI:
-ModularBot@NormalAI:
-ModularBot@NavalAI:
-ModularBot@TurtleAI:
DummyBot@LonestarAI:
Name: bot-lonestarai-name
Type: lonestar
LobbyPrerequisiteCheckbox@GLOBALFACTUNDEPLOY:
Visible: False
^Infantry:
Inherits@IC: ^IronCurtainable
^Husk:
TransformOnCapture:
ForceHealthPercentage: 80
OILB:
Health:
HP: 300000
Armor:
Type: Wood
WithBuildingBib:
RevealsShroud:
Range: 3c0
CashTrickler:
Interval: 250
Amount: 50
MOBILETENT:
Inherits: ^Vehicle
Inherits@selection: ^SelectableSupportUnit
Valued:
Cost: 2000
Tooltip:
Name: actor-mobiletent-name
Selectable:
DecorationBounds: 896, 896
SelectionDecorations:
Health:
HP: 60000
Armor:
Type: Light
Mobile:
Speed: 85
Locomotor: heavywheeled
RevealsShroud:
Range: 4c0
MustBeDestroyed:
RequiredForShortGame: true
BaseBuilding:
Transforms:
IntoActor: tent
Offset: 0,0
Facing: 384
TransformSounds: placbldg.aud, build5.aud
NoTransformNotification: BuildingCannotPlaceAudio
NoTransformTextNotification: notification-cannot-deploy-here
RenderSprites:
Image: TRUK
TENT:
Health:
HP: 100000
Production:
Produces: Infantry, Soldier, Dog, Defense
-Sellable:
Demolishable:
-Condition:
BaseProvider:
Range: 12c0
Power:
Amount: 0
ProductionBar@Defense:
ProductionType: Defense
Color: 8A8A8A
BaseBuilding:
FTUR:
Buildable:
Prerequisites: barracks
Valued:
Cost: 400
Power:
Amount: 0
GivesBuildableArea:
AreaTypes: building
PBOX:
Buildable:
Prerequisites: barracks
Valued:
Cost: 400
Health:
HP: 20000
Armor:
Type: Heavy
Power:
Amount: 0
GivesBuildableArea:
AreaTypes: building
DOG:
Buildable:
Prerequisites: barracks
BuildAtProductionType: Soldier
Valued:
Cost: 20
E1:
Buildable:
Prerequisites: barracks
Valued:
Cost: 20
E2:
Buildable:
Prerequisites: barracks
Valued:
Cost: 40
FireWarheadsOnDeath:
Chance: 20
E3:
Buildable:
Prerequisites: barracks
Valued:
Cost: 60
E4:
Buildable:
Prerequisites: barracks
Valued:
Cost: 100
E6:
Buildable:
Prerequisites: barracks
Valued:
Cost: 100
E7:
Buildable:
Prerequisites: barracks
Valued:
Cost: 750
3TNK:
Armament:
Weapon: TankNapalm
Recoil: 200
RecoilRecovery: 38
MEDI:
Buildable:
Prerequisites: barracks
Valued:
Cost: 100
SHOK:
Buildable:
Prerequisites: barracks
Valued:
Cost: 150
SNIPER:
Inherits: ^Soldier
Valued:
Cost: 200
Tooltip:
Name: actor-sniper.name
UpdatesPlayerStatistics:
AddToArmyValue: true
Buildable:
Queue: Infantry
BuildAtProductionType: Soldier
BuildPaletteOrder: 80
Prerequisites: barracks
Description: actor-sniper.description
Health:
HP: 20000
Passenger:
CustomPipType: red
RevealsShroud:
Range: 6c0
AutoTarget:
InitialStance: HoldFire
InitialStanceAI: ReturnFire
AutoTargetPriority@DEFAULT:
ValidTargets: Infantry
Armament@PRIMARY:
Weapon: Sniper
Armament@GARRISONED:
Name: garrisoned
Weapon: Sniper
MuzzleSequence: garrison-muzzle
WithInfantryBody:
DefaultAttackSequence: shoot
RequiresCondition: !parachute
WithInfantryBody@PARACHUTE:
RequiresCondition: parachute
Palette: player-noshadow
IsPlayerPalette: true
Cloak:
InitialDelay: 250
CloakDelay: 120
CloakSound:
UncloakSound:
UncloakOn: Attack, Unload, Infiltrate, Demolish, Move
PauseOnCondition: cloak-force-disabled
GrantConditionOnDamageState@UNCLOAK:
Condition: cloak-force-disabled
ValidDamageStates: Critical
-MustBeDestroyed:
ProducibleWithLevel:
Prerequisites: barracks.upgraded
WithProductionIconOverlay:
Types: Veterancy
Prerequisites: barracks.upgraded
SNIPER.soviets:
Inherits: SNIPER
Buildable:
Prerequisites: ~disabled
MustBeDestroyed:
Targetable:
TargetTypes: Disguise
AutoTarget:
InitialStanceAI: AttackAnything
RenderSprites:
Image: SNIPER
SPY:
Buildable:
BuildPaletteOrder: 60
Prerequisites: barracks
Valued:
Cost: 300
-MustBeDestroyed:
FTRK:
-Armament@AA:
-Armament@AG:
Armament:
Weapon: FLAK-23
Recoil: 85
LocalOffset: 512,0,192
MuzzleSequence: muzzle
ARTY:
Valued:
Cost: 600
Health:
HP: 7500
RevealsShroud:
Range: 7c0
V2RL:
Health:
HP: 10000
4TNK:
Health:
HP: 250000
Mobile:
Speed: 56
RevealsShroud:
Range: 14c0
Turreted:
TurnSpeed: 4
Armament@PRIMARY:
Recoil: 8
RecoilRecovery: 0c7
Armament@SECONDARY:
Recoil: 2
FireWarheadsOnDeath:
Weapon: napalm
EmptyWeapon: napalm
ChangesHealth:
Step: 200
Delay: 1
StartIfBelow: 40
powerproxy.parabombs:
AirstrikePower:
Description: actor-powerproxy-parabombs-description
CameraRemoveDelay: 50
BADR.Bomber:
Health:
HP: 6000
Aircraft:
Speed: 280
AmmoPool:
Ammo: 30
Tooltip:
Name: actor-mig-bomber-name
SpawnActorOnDeath:
Actor: MIG.Husk
RenderSprites:
Image: mig
MECH:
Buildable:
Prerequisites: barracks
Valued:
Cost: 1500
powerproxy.paratroopers:
ParatroopersPower:
DropItems: E1,E1,E1,E1,E2,E2
SILO:
Buildable:
Prerequisites: ~disabled
BRIK:
Buildable:
Prerequisites: ~disabled
HBOX:
Buildable:
Prerequisites: ~disabled
GUN:
Buildable:
Prerequisites: ~disabled
SAM:
Buildable:
Prerequisites: ~disabled
SBAG:
Buildable:
Prerequisites: ~disabled
FENC:
Buildable:
Prerequisites: ~disabled
MSLO:
Buildable:
Prerequisites: ~disabled
GAP:
Buildable:
Prerequisites: ~disabled
IRON:
Buildable:
Prerequisites: ~disabled
PDOX:
Buildable:
Prerequisites: ~disabled
AGUN:
Buildable:
Prerequisites: ~disabled
TSLA:
Buildable:
Prerequisites: ~disabled
THF:
Buildable:
Prerequisites: ~disabled

View File

@@ -0,0 +1,91 @@
sniper:
Defaults:
Filename: sniper.shp
stand:
Facings: 8
stand2:
Start: 8
Facings: 8
run:
Start: 16
Length: 6
Facings: 8
Tick: 100
shoot:
Start: 64
Length: 16
Facings: 8
prone-stand:
Start: 208
Stride: 4
Facings: 8
prone-stand2:
Start: 208
Stride: 4
Facings: 8
prone-run:
Start: 208
Length: 4
Facings: 8
Tick: 100
liedown:
Start: 192
Length: 2
Facings: 8
standup:
Start: 240
Length: 2
Facings: 8
prone-shoot:
Start: 256
Length: 16
Facings: 8
idle1:
Start: 384
Length: 14
Tick: 120
idle2:
Start: 399
Length: 16
Tick: 120
die1:
Start: 416
Length: 8
Tick: 80
die2:
Start: 424
Length: 8
Tick: 80
die3:
Start: 432
Length: 8
Tick: 80
die4:
Start: 440
Length: 12
Tick: 80
die5:
Start: 452
Length: 18
Tick: 80
die6:
Filename: electro.tem
TilesetFilenames:
SNOW: electro.sno
Frames: 0, 1, 2, 3, 0, 1, 2, 3, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13
Length: *
Tick: 80
die-crushed:
Filename: corpse1.tem
TilesetFilenames:
SNOW: corpse1.sno
Length: 6
Tick: 1600
ZOffset: -511
garrison-muzzle:
Filename: minigun.shp
Length: 3
Stride: 6
Facings: 8
icon:
Filename: snipericon.shp

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@@ -0,0 +1,183 @@
120mm:
ReloadDelay: 150
Range: 10c0
Burst: 6
Projectile: Bullet
Speed: 204
Blockable: false
Inaccuracy: 1c682
Image: 120MM
ContrailLength: 50
Warhead@1Dam: SpreadDamage
Spread: 256
Versus:
None: 56
Wood: 56
Light: 56
Heavy: 86
Concrete: 75
Damage: 20000
Warhead@3Eff: CreateEffect
Explosions: self_destruct
MammothTusk:
ReloadDelay: 300
Range: 10c0
ValidTargets: Ground, GroundActor, AirborneActor
Projectile: Missile
Blockable: false
Speed: 128
TrailImage: smokey
ContrailLength: 150
Inaccuracy: 0c853
HorizontalRateOfTurn: 40
RangeLimit: 12c0
Warhead@1Dam: SpreadDamage
Spread: 640
ValidTargets: GroundActor, AirborneActor
Versus:
None: 125
Wood: 110
Light: 110
Heavy: 100
Concrete: 200
Damage: 25000
Warhead@3Eff: CreateEffect
Explosions: nuke
TankNapalm:
ReloadDelay: 40
Range: 8c0
Report: aacanon3.aud
ValidTargets: Ground, GroundActor
Burst: 6
BurstDelays: 1
Projectile: Bullet
Speed: 426
Image: 120MM
Inaccuracy: 2c512
TrailImage: smokey
ContrailLength: 2
Blockable: false
Warhead: SpreadDamage
Spread: 341
ValidTargets: GroundActor
Versus:
None: 65
Wood: 125
Light: 75
Heavy: 75
Concrete: 75
Damage: 2000
DamageTypes: Prone50Percent, TriggerProne, ExplosionDeath
Warhead@2Smu: LeaveSmudge
SmudgeType: Scorch
Warhead@3Eff: CreateEffect
Explosions: small_explosion
ImpactSounds: firebl3.aud
ParaBomb:
ReloadDelay: 5
Range: 5c0
Projectile: GravityBomb
Image: BOMBLET
OpenSequence: idle
Warhead@1Dam: SpreadDamage
Spread: 426
Versus:
None: 125
Wood: 100
Light: 60
Concrete: 25
Damage: 20000
DamageTypes: Prone50Percent, TriggerProne, FireDeath
Warhead@3Eff: CreateEffect
Explosions: napalm
ImpactSounds: firebl3.aud
155mm:
ReloadDelay: 10
Range: 7c0
Burst: 20
-Report:
Projectile: Bullet
Speed: 170
TrailImage: fb4
Image: fb3
Blockable: false
LaunchAngle: 30
Inaccuracy: 1c682
ContrailLength: 2
Warhead@1Dam: SpreadDamage
Versus:
None: 80
Wood: 100
Heavy: 75
Concrete: 35
Damage: 2000
DamageTypes: Prone50Percent, TriggerProne, FireDeath
Warhead@3Eff: CreateEffect
Explosions: small_napalm
ImpactSounds: firebl3.aud
FLAK-23:
ReloadDelay: 10
Range: 8c0
Report: aacanon3.aud
ValidTargets: AirborneActor, Ground, GroundActor
Projectile: Bullet
Speed: 1c682
Blockable: false
Warhead: SpreadDamage
Spread: 213
ValidTargets: AirborneActor, GroundActor
Versus:
None: 32
Wood: 28
Light: 28
Heavy: 40
Concrete: 28
Damage: 2500
DamageTypes: Prone50Percent, TriggerProne, DefaultDeath
Warhead@2Smu: LeaveSmudge
SmudgeType: Scorch
Warhead@3Eff: CreateEffect
Explosions: med_explosion
SCUD:
Range: 7c0
ReloadDelay: 280
Projectile: Bullet
TrailImage: smokey
Blockable: false
Inaccuracy: 0c426
LaunchAngle: 216
Warhead@1Dam: SpreadDamage
Spread: 853
Falloff: 100, 37, 14, 5, 0
Versus:
None: 100
Wood: 90
Light: 80
Heavy: 70
Damage: 50000
AffectsParent: true
Warhead@3Eff: CreateEffect
Explosions: nuke
ImpactSounds: kaboom1.aud
SilencedPPK:
Range: 25c0
ValidTargets: Infantry, Vehicle, Husk
InvalidTargets: Water, Structure, Wall
Warhead@1Dam: SpreadDamage
ValidTargets: Infantry, Vehicle, Husk
Versus:
Heavy: 50
Sniper:
Inherits: ^SnipeWeapon
ReloadDelay: 70
Range: 10c0
Warhead@1Dam: SpreadDamage
Damage: 14000