-
Notifications
You must be signed in to change notification settings - Fork 845
/
game_spawn.lua
113 lines (100 loc) · 3.71 KB
/
game_spawn.lua
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
--
-- file: game_spawn.lua
-- brief: spawns start unit and sets storage levels
-- author: Tobi Vollebregt
--
-- Copyright (C) 2010.
-- Licensed under the terms of the GNU GPL, v2 or later.
--
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
function gadget:GetInfo()
return {
name = "Spawn",
desc = "spawns start unit and sets storage levels",
author = "Tobi Vollebregt",
date = "January, 2010",
license = "GNU GPL, v2 or later",
layer = 0,
enabled = true -- loaded by default?
}
end
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
-- synced only
if (not gadgetHandler:IsSyncedCode()) then
return false
end
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
local modOptions = Spring.GetModOptions()
local function GetStartUnit(teamID)
-- get the team startup info
local side = select(5, Spring.GetTeamInfo(teamID))
local startUnit
if (side == "") then
-- startscript didn't specify a side for this team
local sidedata = Spring.GetSideData()
if (sidedata and #sidedata > 0) then
startUnit = sidedata[1 + teamID % #sidedata].startUnit
end
else
startUnit = Spring.GetSideData(side)
end
return startUnit
end
local function SpawnStartUnit(teamID)
local startUnit = GetStartUnit(teamID)
if (startUnit and startUnit ~= "") then
-- spawn the specified start unit
local x,y,z = Spring.GetTeamStartPosition(teamID)
-- snap to 16x16 grid
x, z = 16*math.floor((x+8)/16), 16*math.floor((z+8)/16)
y = Spring.GetGroundHeight(x, z)
-- facing toward map center
local facing=math.abs(Game.mapSizeX/2 - x) > math.abs(Game.mapSizeZ/2 - z)
and ((x>Game.mapSizeX/2) and "west" or "east")
or ((z>Game.mapSizeZ/2) and "north" or "south")
local unitID = Spring.CreateUnit(startUnit, x, y, z, facing, teamID)
end
-- set start resources, either from mod options or custom team keys
local teamOptions = select(7, Spring.GetTeamInfo(teamID))
local m = teamOptions.startmetal or modOptions.startmetal or 1000
local e = teamOptions.startenergy or modOptions.startenergy or 1000
-- using SetTeamResource to get rid of any existing resource without affecting stats
-- using AddTeamResource to add starting resource and counting it as income
if (m and tonumber(m) ~= 0) then
-- remove the pre-existing storage
-- must be done after the start unit is spawned,
-- otherwise the starting resources are lost!
Spring.SetTeamResource(teamID, "ms", tonumber(m))
Spring.SetTeamResource(teamID, "m", 0)
Spring.AddTeamResource(teamID, "m", tonumber(m))
end
if (e and tonumber(e) ~= 0) then
-- remove the pre-existing storage
-- must be done after the start unit is spawned,
-- otherwise the starting resources are lost!
Spring.SetTeamResource(teamID, "es", tonumber(e))
Spring.SetTeamResource(teamID, "e", 0)
Spring.AddTeamResource(teamID, "e", tonumber(e))
end
end
function gadget:GameStart()
-- only activate if engine didn't already spawn units (compatibility)
if (#Spring.GetAllUnits() > 0) then
return
end
-- spawn start units
local gaiaTeamID = Spring.GetGaiaTeamID()
local teams = Spring.GetTeamList()
for i = 1,#teams do
local teamID = teams[i]
-- don't spawn a start unit for the Gaia team
if (teamID ~= gaiaTeamID) then
SpawnStartUnit(teamID)
end
end
end