author | glx |
Fri, 13 Jun 2008 15:43:39 +0000 | |
branch | noai |
changeset 10955 | 56b381e5253f |
parent 10455 | 22c441f5adf9 |
child 11057 | 188a9ca6d8de |
permissions | -rw-r--r-- |
9624 | 1 |
/* $Id$ */ |
2 |
||
3 |
/** @file group_cmd.cpp Handling of the engine groups */ |
|
4 |
||
5 |
#include "stdafx.h" |
|
6 |
#include "openttd.h" |
|
9631
8a2d1c2ceb88
(svn r10461) [NoAI] -Sync with trunk r10349:r10460.
rubidium
parents:
9629
diff
changeset
|
7 |
#include "variables.h" |
9723
eee46cb39750
(svn r11796) [NoAI] -Sync: with trunk r11502:11795.
rubidium
parents:
9722
diff
changeset
|
8 |
#include "command_func.h" |
9624 | 9 |
#include "saveload.h" |
10 |
#include "debug.h" |
|
11 |
#include "group.h" |
|
12 |
#include "train.h" |
|
13 |
#include "aircraft.h" |
|
14 |
#include "vehicle_gui.h" |
|
9723
eee46cb39750
(svn r11796) [NoAI] -Sync: with trunk r11502:11795.
rubidium
parents:
9722
diff
changeset
|
15 |
#include "strings_func.h" |
eee46cb39750
(svn r11796) [NoAI] -Sync: with trunk r11502:11795.
rubidium
parents:
9722
diff
changeset
|
16 |
#include "functions.h" |
eee46cb39750
(svn r11796) [NoAI] -Sync: with trunk r11502:11795.
rubidium
parents:
9722
diff
changeset
|
17 |
#include "window_func.h" |
eee46cb39750
(svn r11796) [NoAI] -Sync: with trunk r11502:11795.
rubidium
parents:
9722
diff
changeset
|
18 |
#include "vehicle_func.h" |
eee46cb39750
(svn r11796) [NoAI] -Sync: with trunk r11502:11795.
rubidium
parents:
9722
diff
changeset
|
19 |
#include "autoreplace_base.h" |
eee46cb39750
(svn r11796) [NoAI] -Sync: with trunk r11502:11795.
rubidium
parents:
9722
diff
changeset
|
20 |
#include "autoreplace_func.h" |
eee46cb39750
(svn r11796) [NoAI] -Sync: with trunk r11502:11795.
rubidium
parents:
9722
diff
changeset
|
21 |
#include "string_func.h" |
9724
b39bc69bb2f2
(svn r12051) [NoAI] -Sync: with trunk (r11795:12050).
rubidium
parents:
9723
diff
changeset
|
22 |
#include "player_func.h" |
9837
c9ec4f82e0d0
(svn r12503) [NoAI] -Sync: with trunk r12461:12501.
rubidium
parents:
9800
diff
changeset
|
23 |
#include "order_func.h" |
10142
56ee7da4ad56
(svn r12673) [NoAI] -Sync: with trunk r12596:12672. Note that due to the order rewrite AIOrder.ChangeOrder does currently not work as expected.
rubidium
parents:
9837
diff
changeset
|
24 |
#include "oldpool_func.h" |
10455
22c441f5adf9
(svn r12997) [NoAI] -Sync: with trunk r12895:12996.
rubidium
parents:
10355
diff
changeset
|
25 |
#include "core/alloc_func.hpp" |
9724
b39bc69bb2f2
(svn r12051) [NoAI] -Sync: with trunk (r11795:12050).
rubidium
parents:
9723
diff
changeset
|
26 |
|
b39bc69bb2f2
(svn r12051) [NoAI] -Sync: with trunk (r11795:12050).
rubidium
parents:
9723
diff
changeset
|
27 |
#include "table/strings.h" |
9624 | 28 |
|
29 |
/** |
|
30 |
* Update the num engines of a groupID. Decrease the old one and increase the new one |
|
31 |
* @note called in SetTrainGroupID and UpdateTrainGroupID |
|
32 |
* @param i EngineID we have to update |
|
33 |
* @param old_g index of the old group |
|
34 |
* @param new_g index of the new group |
|
35 |
*/ |
|
36 |
static inline void UpdateNumEngineGroup(EngineID i, GroupID old_g, GroupID new_g) |
|
37 |
{ |
|
38 |
if (old_g != new_g) { |
|
39 |
/* Decrease the num engines of EngineID i of the old group if it's not the default one */ |
|
40 |
if (!IsDefaultGroupID(old_g) && IsValidGroupID(old_g)) GetGroup(old_g)->num_engines[i]--; |
|
41 |
||
10249
58810805030e
(svn r12781) [NoAI] -Sync: with trunk r12711:12780.
rubidium
parents:
10142
diff
changeset
|
42 |
/* Increase the num engines of EngineID i of the new group if it's not the default one */ |
9624 | 43 |
if (!IsDefaultGroupID(new_g) && IsValidGroupID(new_g)) GetGroup(new_g)->num_engines[i]++; |
44 |
} |
|
45 |
} |
|
46 |
||
47 |
||
9694
e72987579514
(svn r10775) [NoAI] -Sync: with trunk r10535:r10774.
rubidium
parents:
9641
diff
changeset
|
48 |
DEFINE_OLD_POOL_GENERIC(Group, Group) |
e72987579514
(svn r10775) [NoAI] -Sync: with trunk r10535:r10774.
rubidium
parents:
9641
diff
changeset
|
49 |
|
e72987579514
(svn r10775) [NoAI] -Sync: with trunk r10535:r10774.
rubidium
parents:
9641
diff
changeset
|
50 |
|
9724
b39bc69bb2f2
(svn r12051) [NoAI] -Sync: with trunk (r11795:12050).
rubidium
parents:
9723
diff
changeset
|
51 |
Group::Group(PlayerID owner) |
9624 | 52 |
{ |
9724
b39bc69bb2f2
(svn r12051) [NoAI] -Sync: with trunk (r11795:12050).
rubidium
parents:
9723
diff
changeset
|
53 |
this->owner = owner; |
10455
22c441f5adf9
(svn r12997) [NoAI] -Sync: with trunk r12895:12996.
rubidium
parents:
10355
diff
changeset
|
54 |
this->num_engines = CallocT<uint16>(GetEnginePoolSize()); |
9624 | 55 |
} |
56 |
||
9694
e72987579514
(svn r10775) [NoAI] -Sync: with trunk r10535:r10774.
rubidium
parents:
9641
diff
changeset
|
57 |
Group::~Group() |
9624 | 58 |
{ |
9724
b39bc69bb2f2
(svn r12051) [NoAI] -Sync: with trunk (r11795:12050).
rubidium
parents:
9723
diff
changeset
|
59 |
free(this->name); |
b39bc69bb2f2
(svn r12051) [NoAI] -Sync: with trunk (r11795:12050).
rubidium
parents:
9723
diff
changeset
|
60 |
this->owner = INVALID_PLAYER; |
10455
22c441f5adf9
(svn r12997) [NoAI] -Sync: with trunk r12895:12996.
rubidium
parents:
10355
diff
changeset
|
61 |
free(this->num_engines); |
9694
e72987579514
(svn r10775) [NoAI] -Sync: with trunk r10535:r10774.
rubidium
parents:
9641
diff
changeset
|
62 |
} |
9624 | 63 |
|
9694
e72987579514
(svn r10775) [NoAI] -Sync: with trunk r10535:r10774.
rubidium
parents:
9641
diff
changeset
|
64 |
bool Group::IsValid() const |
e72987579514
(svn r10775) [NoAI] -Sync: with trunk r10535:r10774.
rubidium
parents:
9641
diff
changeset
|
65 |
{ |
9724
b39bc69bb2f2
(svn r12051) [NoAI] -Sync: with trunk (r11795:12050).
rubidium
parents:
9723
diff
changeset
|
66 |
return this->owner != INVALID_PLAYER; |
9624 | 67 |
} |
68 |
||
69 |
void InitializeGroup(void) |
|
70 |
{ |
|
9694
e72987579514
(svn r10775) [NoAI] -Sync: with trunk r10535:r10774.
rubidium
parents:
9641
diff
changeset
|
71 |
_Group_pool.CleanPool(); |
e72987579514
(svn r10775) [NoAI] -Sync: with trunk r10535:r10774.
rubidium
parents:
9641
diff
changeset
|
72 |
_Group_pool.AddBlockToPool(); |
9624 | 73 |
} |
74 |
||
75 |
||
76 |
/** |
|
9641
855e32c08c9b
(svn r10533) [NoAI] -Sync with trunk r10460:r10532.
truelight
parents:
9631
diff
changeset
|
77 |
* Create a new vehicle group. |
9624 | 78 |
* @param tile unused |
79 |
* @param p1 vehicle type |
|
80 |
* @param p2 unused |
|
81 |
*/ |
|
9629 | 82 |
CommandCost CmdCreateGroup(TileIndex tile, uint32 flags, uint32 p1, uint32 p2) |
9624 | 83 |
{ |
84 |
VehicleType vt = (VehicleType)p1; |
|
85 |
if (!IsPlayerBuildableVehicleType(vt)) return CMD_ERROR; |
|
86 |
||
10355
ee4b5f7a5bf2
(svn r12896) [NoAI] -Sync: with trunk r12824:r12895.
rubidium
parents:
10249
diff
changeset
|
87 |
if (!Group::CanAllocateItem()) return CMD_ERROR; |
9694
e72987579514
(svn r10775) [NoAI] -Sync: with trunk r10535:r10774.
rubidium
parents:
9641
diff
changeset
|
88 |
|
9624 | 89 |
if (flags & DC_EXEC) { |
10355
ee4b5f7a5bf2
(svn r12896) [NoAI] -Sync: with trunk r12824:r12895.
rubidium
parents:
10249
diff
changeset
|
90 |
Group *g = new Group(_current_player); |
9624 | 91 |
g->replace_protection = false; |
92 |
g->vehicle_type = vt; |
|
93 |
||
10355
ee4b5f7a5bf2
(svn r12896) [NoAI] -Sync: with trunk r12824:r12895.
rubidium
parents:
10249
diff
changeset
|
94 |
InvalidateWindowData(GetWindowClassForVehicleType(vt), (vt << 11) | VLW_GROUP_LIST | _current_player); |
9624 | 95 |
} |
96 |
||
9629 | 97 |
return CommandCost(); |
9624 | 98 |
} |
99 |
||
100 |
||
101 |
/** |
|
9641
855e32c08c9b
(svn r10533) [NoAI] -Sync with trunk r10460:r10532.
truelight
parents:
9631
diff
changeset
|
102 |
* Add all vehicles in the given group to the default group and then deletes the group. |
9624 | 103 |
* @param tile unused |
104 |
* @param p1 index of array group |
|
105 |
* - p1 bit 0-15 : GroupID |
|
106 |
* @param p2 unused |
|
107 |
*/ |
|
9629 | 108 |
CommandCost CmdDeleteGroup(TileIndex tile, uint32 flags, uint32 p1, uint32 p2) |
9624 | 109 |
{ |
110 |
if (!IsValidGroupID(p1)) return CMD_ERROR; |
|
111 |
||
112 |
Group *g = GetGroup(p1); |
|
113 |
if (g->owner != _current_player) return CMD_ERROR; |
|
114 |
||
115 |
if (flags & DC_EXEC) { |
|
116 |
Vehicle *v; |
|
117 |
||
118 |
/* Add all vehicles belong to the group to the default group */ |
|
119 |
FOR_ALL_VEHICLES(v) { |
|
120 |
if (v->group_id == g->index && v->type == g->vehicle_type) v->group_id = DEFAULT_GROUP; |
|
121 |
} |
|
122 |
||
9800 | 123 |
/* Update backupped orders if needed */ |
124 |
if (_backup_orders_data.group == g->index) _backup_orders_data.group = DEFAULT_GROUP; |
|
125 |
||
9624 | 126 |
/* If we set an autoreplace for the group we delete, remove it. */ |
127 |
if (_current_player < MAX_PLAYERS) { |
|
128 |
Player *p; |
|
129 |
EngineRenew *er; |
|
130 |
||
131 |
p = GetPlayer(_current_player); |
|
132 |
FOR_ALL_ENGINE_RENEWS(er) { |
|
133 |
if (er->group_id == g->index) RemoveEngineReplacementForPlayer(p, er->from, g->index, flags); |
|
134 |
} |
|
135 |
} |
|
136 |
||
137 |
VehicleType vt = g->vehicle_type; |
|
138 |
||
139 |
/* Delete the Replace Vehicle Windows */ |
|
140 |
DeleteWindowById(WC_REPLACE_VEHICLE, g->vehicle_type); |
|
9694
e72987579514
(svn r10775) [NoAI] -Sync: with trunk r10535:r10774.
rubidium
parents:
9641
diff
changeset
|
141 |
delete g; |
9624 | 142 |
|
10355
ee4b5f7a5bf2
(svn r12896) [NoAI] -Sync: with trunk r12824:r12895.
rubidium
parents:
10249
diff
changeset
|
143 |
InvalidateWindowData(GetWindowClassForVehicleType(vt), (vt << 11) | VLW_GROUP_LIST | _current_player); |
9624 | 144 |
} |
145 |
||
9629 | 146 |
return CommandCost(); |
9624 | 147 |
} |
148 |
||
9631
8a2d1c2ceb88
(svn r10461) [NoAI] -Sync with trunk r10349:r10460.
rubidium
parents:
9629
diff
changeset
|
149 |
static bool IsUniqueGroupName(const char *name) |
8a2d1c2ceb88
(svn r10461) [NoAI] -Sync with trunk r10349:r10460.
rubidium
parents:
9629
diff
changeset
|
150 |
{ |
8a2d1c2ceb88
(svn r10461) [NoAI] -Sync with trunk r10349:r10460.
rubidium
parents:
9629
diff
changeset
|
151 |
const Group *g; |
8a2d1c2ceb88
(svn r10461) [NoAI] -Sync with trunk r10349:r10460.
rubidium
parents:
9629
diff
changeset
|
152 |
char buf[512]; |
8a2d1c2ceb88
(svn r10461) [NoAI] -Sync with trunk r10349:r10460.
rubidium
parents:
9629
diff
changeset
|
153 |
|
8a2d1c2ceb88
(svn r10461) [NoAI] -Sync with trunk r10349:r10460.
rubidium
parents:
9629
diff
changeset
|
154 |
FOR_ALL_GROUPS(g) { |
8a2d1c2ceb88
(svn r10461) [NoAI] -Sync with trunk r10349:r10460.
rubidium
parents:
9629
diff
changeset
|
155 |
SetDParam(0, g->index); |
8a2d1c2ceb88
(svn r10461) [NoAI] -Sync with trunk r10349:r10460.
rubidium
parents:
9629
diff
changeset
|
156 |
GetString(buf, STR_GROUP_NAME, lastof(buf)); |
8a2d1c2ceb88
(svn r10461) [NoAI] -Sync with trunk r10349:r10460.
rubidium
parents:
9629
diff
changeset
|
157 |
if (strcmp(buf, name) == 0) return false; |
8a2d1c2ceb88
(svn r10461) [NoAI] -Sync with trunk r10349:r10460.
rubidium
parents:
9629
diff
changeset
|
158 |
} |
8a2d1c2ceb88
(svn r10461) [NoAI] -Sync with trunk r10349:r10460.
rubidium
parents:
9629
diff
changeset
|
159 |
|
8a2d1c2ceb88
(svn r10461) [NoAI] -Sync with trunk r10349:r10460.
rubidium
parents:
9629
diff
changeset
|
160 |
return true; |
8a2d1c2ceb88
(svn r10461) [NoAI] -Sync with trunk r10349:r10460.
rubidium
parents:
9629
diff
changeset
|
161 |
} |
9624 | 162 |
|
163 |
/** |
|
164 |
* Rename a group |
|
165 |
* @param tile unused |
|
166 |
* @param p1 index of array group |
|
167 |
* - p1 bit 0-15 : GroupID |
|
168 |
* @param p2 unused |
|
169 |
*/ |
|
9629 | 170 |
CommandCost CmdRenameGroup(TileIndex tile, uint32 flags, uint32 p1, uint32 p2) |
9624 | 171 |
{ |
172 |
if (!IsValidGroupID(p1) || StrEmpty(_cmd_text)) return CMD_ERROR; |
|
173 |
||
174 |
Group *g = GetGroup(p1); |
|
175 |
if (g->owner != _current_player) return CMD_ERROR; |
|
176 |
||
9631
8a2d1c2ceb88
(svn r10461) [NoAI] -Sync with trunk r10349:r10460.
rubidium
parents:
9629
diff
changeset
|
177 |
if (!IsUniqueGroupName(_cmd_text)) return_cmd_error(STR_NAME_MUST_BE_UNIQUE); |
8a2d1c2ceb88
(svn r10461) [NoAI] -Sync with trunk r10349:r10460.
rubidium
parents:
9629
diff
changeset
|
178 |
|
9624 | 179 |
if (flags & DC_EXEC) { |
180 |
/* Delete the old name */ |
|
9724
b39bc69bb2f2
(svn r12051) [NoAI] -Sync: with trunk (r11795:12050).
rubidium
parents:
9723
diff
changeset
|
181 |
free(g->name); |
9624 | 182 |
/* Assign the new one */ |
9724
b39bc69bb2f2
(svn r12051) [NoAI] -Sync: with trunk (r11795:12050).
rubidium
parents:
9723
diff
changeset
|
183 |
g->name = strdup(_cmd_text); |
9624 | 184 |
|
10355
ee4b5f7a5bf2
(svn r12896) [NoAI] -Sync: with trunk r12824:r12895.
rubidium
parents:
10249
diff
changeset
|
185 |
InvalidateWindowData(GetWindowClassForVehicleType(g->vehicle_type), (g->vehicle_type << 11) | VLW_GROUP_LIST | _current_player); |
9624 | 186 |
} |
187 |
||
9629 | 188 |
return CommandCost(); |
9624 | 189 |
} |
190 |
||
191 |
||
192 |
/** |
|
193 |
* Add a vehicle to a group |
|
194 |
* @param tile unused |
|
195 |
* @param p1 index of array group |
|
196 |
* - p1 bit 0-15 : GroupID |
|
197 |
* @param p2 vehicle to add to a group |
|
198 |
* - p2 bit 0-15 : VehicleID |
|
199 |
*/ |
|
9629 | 200 |
CommandCost CmdAddVehicleGroup(TileIndex tile, uint32 flags, uint32 p1, uint32 p2) |
9624 | 201 |
{ |
202 |
GroupID new_g = p1; |
|
203 |
||
204 |
if (!IsValidVehicleID(p2) || (!IsValidGroupID(new_g) && !IsDefaultGroupID(new_g))) return CMD_ERROR; |
|
205 |
||
9701
d1ac22c62f64
(svn r11036) [NoAI] -Sync: with trunk r10774:11035.
rubidium
parents:
9694
diff
changeset
|
206 |
Vehicle *v = GetVehicle(p2); |
d1ac22c62f64
(svn r11036) [NoAI] -Sync: with trunk r10774:11035.
rubidium
parents:
9694
diff
changeset
|
207 |
|
9624 | 208 |
if (IsValidGroupID(new_g)) { |
209 |
Group *g = GetGroup(new_g); |
|
9701
d1ac22c62f64
(svn r11036) [NoAI] -Sync: with trunk r10774:11035.
rubidium
parents:
9694
diff
changeset
|
210 |
if (g->owner != _current_player || g->vehicle_type != v->type) return CMD_ERROR; |
9624 | 211 |
} |
212 |
||
9625
3301b1b3889c
(svn r10016) [NoAI] -Sync with trunk r9914:r10015.
rubidium
parents:
9624
diff
changeset
|
213 |
if (v->owner != _current_player || !v->IsPrimaryVehicle()) return CMD_ERROR; |
9624 | 214 |
|
215 |
if (flags & DC_EXEC) { |
|
216 |
DecreaseGroupNumVehicle(v->group_id); |
|
217 |
IncreaseGroupNumVehicle(new_g); |
|
218 |
||
219 |
switch (v->type) { |
|
220 |
default: NOT_REACHED(); |
|
221 |
case VEH_TRAIN: |
|
222 |
SetTrainGroupID(v, new_g); |
|
223 |
break; |
|
224 |
case VEH_ROAD: |
|
225 |
case VEH_SHIP: |
|
226 |
case VEH_AIRCRAFT: |
|
227 |
if (IsEngineCountable(v)) UpdateNumEngineGroup(v->engine_type, v->group_id, new_g); |
|
228 |
v->group_id = new_g; |
|
229 |
break; |
|
230 |
} |
|
231 |
||
232 |
/* Update the Replace Vehicle Windows */ |
|
233 |
InvalidateWindow(WC_REPLACE_VEHICLE, v->type); |
|
10355
ee4b5f7a5bf2
(svn r12896) [NoAI] -Sync: with trunk r12824:r12895.
rubidium
parents:
10249
diff
changeset
|
234 |
InvalidateWindowData(GetWindowClassForVehicleType(v->type), (v->type << 11) | VLW_GROUP_LIST | _current_player); |
9624 | 235 |
} |
236 |
||
9629 | 237 |
return CommandCost(); |
9624 | 238 |
} |
239 |
||
240 |
/** |
|
241 |
* Add all shared vehicles of all vehicles from a group |
|
242 |
* @param tile unused |
|
243 |
* @param p1 index of group array |
|
244 |
* - p1 bit 0-15 : GroupID |
|
245 |
* @param p2 type of vehicles |
|
246 |
*/ |
|
9629 | 247 |
CommandCost CmdAddSharedVehicleGroup(TileIndex tile, uint32 flags, uint32 p1, uint32 p2) |
9624 | 248 |
{ |
249 |
VehicleType type = (VehicleType)p2; |
|
250 |
if (!IsValidGroupID(p1) || !IsPlayerBuildableVehicleType(type)) return CMD_ERROR; |
|
251 |
||
252 |
if (flags & DC_EXEC) { |
|
253 |
Vehicle *v; |
|
254 |
VehicleType type = (VehicleType)p2; |
|
255 |
GroupID id_g = p1; |
|
256 |
||
257 |
/* Find the first front engine which belong to the group id_g |
|
258 |
* then add all shared vehicles of this front engine to the group id_g */ |
|
259 |
FOR_ALL_VEHICLES(v) { |
|
9625
3301b1b3889c
(svn r10016) [NoAI] -Sync with trunk r9914:r10015.
rubidium
parents:
9624
diff
changeset
|
260 |
if (v->type == type && v->IsPrimaryVehicle()) { |
9624 | 261 |
if (v->group_id != id_g) continue; |
262 |
||
263 |
/* For each shared vehicles add it to the group */ |
|
264 |
for (Vehicle *v2 = GetFirstVehicleFromSharedList(v); v2 != NULL; v2 = v2->next_shared) { |
|
265 |
if (v2->group_id != id_g) CmdAddVehicleGroup(tile, flags, id_g, v2->index); |
|
266 |
} |
|
267 |
} |
|
268 |
} |
|
269 |
||
10355
ee4b5f7a5bf2
(svn r12896) [NoAI] -Sync: with trunk r12824:r12895.
rubidium
parents:
10249
diff
changeset
|
270 |
InvalidateWindowData(GetWindowClassForVehicleType(type), (type << 11) | VLW_GROUP_LIST | _current_player); |
9624 | 271 |
} |
272 |
||
9629 | 273 |
return CommandCost(); |
9624 | 274 |
} |
275 |
||
276 |
||
277 |
/** |
|
278 |
* Remove all vehicles from a group |
|
279 |
* @param tile unused |
|
280 |
* @param p1 index of group array |
|
281 |
* - p1 bit 0-15 : GroupID |
|
282 |
* @param p2 type of vehicles |
|
283 |
*/ |
|
9629 | 284 |
CommandCost CmdRemoveAllVehiclesGroup(TileIndex tile, uint32 flags, uint32 p1, uint32 p2) |
9624 | 285 |
{ |
286 |
VehicleType type = (VehicleType)p2; |
|
287 |
if (!IsValidGroupID(p1) || !IsPlayerBuildableVehicleType(type)) return CMD_ERROR; |
|
288 |
||
289 |
Group *g = GetGroup(p1); |
|
290 |
if (g->owner != _current_player) return CMD_ERROR; |
|
291 |
||
292 |
if (flags & DC_EXEC) { |
|
293 |
GroupID old_g = p1; |
|
294 |
Vehicle *v; |
|
295 |
||
296 |
/* Find each Vehicle that belongs to the group old_g and add it to the default group */ |
|
297 |
FOR_ALL_VEHICLES(v) { |
|
9625
3301b1b3889c
(svn r10016) [NoAI] -Sync with trunk r9914:r10015.
rubidium
parents:
9624
diff
changeset
|
298 |
if (v->type == type && v->IsPrimaryVehicle()) { |
9624 | 299 |
if (v->group_id != old_g) continue; |
300 |
||
301 |
/* Add The Vehicle to the default group */ |
|
302 |
CmdAddVehicleGroup(tile, flags, DEFAULT_GROUP, v->index); |
|
303 |
} |
|
304 |
} |
|
305 |
||
10355
ee4b5f7a5bf2
(svn r12896) [NoAI] -Sync: with trunk r12824:r12895.
rubidium
parents:
10249
diff
changeset
|
306 |
InvalidateWindowData(GetWindowClassForVehicleType(type), (type << 11) | VLW_GROUP_LIST | _current_player); |
9624 | 307 |
} |
308 |
||
9629 | 309 |
return CommandCost(); |
9624 | 310 |
} |
311 |
||
312 |
||
313 |
/** |
|
314 |
* (Un)set global replace protection from a group |
|
315 |
* @param tile unused |
|
316 |
* @param p1 index of group array |
|
317 |
* - p1 bit 0-15 : GroupID |
|
318 |
* @param p2 |
|
319 |
* - p2 bit 0 : 1 to set or 0 to clear protection. |
|
320 |
*/ |
|
9629 | 321 |
CommandCost CmdSetGroupReplaceProtection(TileIndex tile, uint32 flags, uint32 p1, uint32 p2) |
9624 | 322 |
{ |
323 |
if (!IsValidGroupID(p1)) return CMD_ERROR; |
|
324 |
||
325 |
Group *g = GetGroup(p1); |
|
326 |
if (g->owner != _current_player) return CMD_ERROR; |
|
327 |
||
328 |
if (flags & DC_EXEC) { |
|
9722
ebf0ece7d8f6
(svn r11503) [NoAI] -Sync: with trunk r11308:11502.
rubidium
parents:
9703
diff
changeset
|
329 |
g->replace_protection = HasBit(p2, 0); |
9624 | 330 |
|
10355
ee4b5f7a5bf2
(svn r12896) [NoAI] -Sync: with trunk r12824:r12895.
rubidium
parents:
10249
diff
changeset
|
331 |
InvalidateWindowData(GetWindowClassForVehicleType(g->vehicle_type), (g->vehicle_type << 11) | VLW_GROUP_LIST | _current_player); |
9624 | 332 |
} |
333 |
||
9629 | 334 |
return CommandCost(); |
9624 | 335 |
} |
336 |
||
337 |
/** |
|
338 |
* Decrease the num_vehicle variable before delete an front engine from a group |
|
339 |
* @note Called in CmdSellRailWagon and DeleteLasWagon, |
|
340 |
* @param v FrontEngine of the train we want to remove. |
|
341 |
*/ |
|
342 |
void RemoveVehicleFromGroup(const Vehicle *v) |
|
343 |
{ |
|
9703
d2a6acdbd665
(svn r11146) [NoAI] -Sync: with trunk r11035:11045.
rubidium
parents:
9701
diff
changeset
|
344 |
if (!v->IsValid() || !v->IsPrimaryVehicle()) return; |
9624 | 345 |
|
346 |
if (!IsDefaultGroupID(v->group_id)) DecreaseGroupNumVehicle(v->group_id); |
|
347 |
} |
|
348 |
||
349 |
||
350 |
/** |
|
351 |
* Affect the groupID of a train to new_g. |
|
352 |
* @note called in CmdAddVehicleGroup and CmdMoveRailVehicle |
|
353 |
* @param v First vehicle of the chain. |
|
354 |
* @param new_g index of array group |
|
355 |
*/ |
|
356 |
void SetTrainGroupID(Vehicle *v, GroupID new_g) |
|
357 |
{ |
|
358 |
if (!IsValidGroupID(new_g) && !IsDefaultGroupID(new_g)) return; |
|
359 |
||
9694
e72987579514
(svn r10775) [NoAI] -Sync: with trunk r10535:r10774.
rubidium
parents:
9641
diff
changeset
|
360 |
assert(v->IsValid() && v->type == VEH_TRAIN && IsFrontEngine(v)); |
9624 | 361 |
|
9701
d1ac22c62f64
(svn r11036) [NoAI] -Sync: with trunk r10774:11035.
rubidium
parents:
9694
diff
changeset
|
362 |
for (Vehicle *u = v; u != NULL; u = u->Next()) { |
9624 | 363 |
if (IsEngineCountable(u)) UpdateNumEngineGroup(u->engine_type, u->group_id, new_g); |
364 |
||
365 |
u->group_id = new_g; |
|
366 |
} |
|
367 |
||
368 |
/* Update the Replace Vehicle Windows */ |
|
369 |
InvalidateWindow(WC_REPLACE_VEHICLE, VEH_TRAIN); |
|
370 |
} |
|
371 |
||
372 |
||
373 |
/** |
|
374 |
* Recalculates the groupID of a train. Should be called each time a vehicle is added |
|
375 |
* to/removed from the chain,. |
|
376 |
* @note this needs to be called too for 'wagon chains' (in the depot, without an engine) |
|
377 |
* @note Called in CmdBuildRailVehicle, CmdBuildRailWagon, CmdMoveRailVehicle, CmdSellRailWagon |
|
378 |
* @param v First vehicle of the chain. |
|
379 |
*/ |
|
380 |
void UpdateTrainGroupID(Vehicle *v) |
|
381 |
{ |
|
9694
e72987579514
(svn r10775) [NoAI] -Sync: with trunk r10535:r10774.
rubidium
parents:
9641
diff
changeset
|
382 |
assert(v->IsValid() && v->type == VEH_TRAIN && (IsFrontEngine(v) || IsFreeWagon(v))); |
9624 | 383 |
|
384 |
GroupID new_g = IsFrontEngine(v) ? v->group_id : (GroupID)DEFAULT_GROUP; |
|
9701
d1ac22c62f64
(svn r11036) [NoAI] -Sync: with trunk r10774:11035.
rubidium
parents:
9694
diff
changeset
|
385 |
for (Vehicle *u = v; u != NULL; u = u->Next()) { |
9624 | 386 |
if (IsEngineCountable(u)) UpdateNumEngineGroup(u->engine_type, u->group_id, new_g); |
387 |
||
388 |
u->group_id = new_g; |
|
389 |
} |
|
390 |
||
391 |
/* Update the Replace Vehicle Windows */ |
|
392 |
InvalidateWindow(WC_REPLACE_VEHICLE, VEH_TRAIN); |
|
393 |
} |
|
394 |
||
9724
b39bc69bb2f2
(svn r12051) [NoAI] -Sync: with trunk (r11795:12050).
rubidium
parents:
9723
diff
changeset
|
395 |
uint GetGroupNumEngines(PlayerID p, GroupID id_g, EngineID id_e) |
b39bc69bb2f2
(svn r12051) [NoAI] -Sync: with trunk (r11795:12050).
rubidium
parents:
9723
diff
changeset
|
396 |
{ |
b39bc69bb2f2
(svn r12051) [NoAI] -Sync: with trunk (r11795:12050).
rubidium
parents:
9723
diff
changeset
|
397 |
if (IsValidGroupID(id_g)) return GetGroup(id_g)->num_engines[id_e]; |
9624 | 398 |
|
9724
b39bc69bb2f2
(svn r12051) [NoAI] -Sync: with trunk (r11795:12050).
rubidium
parents:
9723
diff
changeset
|
399 |
uint num = GetPlayer(p)->num_engines[id_e]; |
b39bc69bb2f2
(svn r12051) [NoAI] -Sync: with trunk (r11795:12050).
rubidium
parents:
9723
diff
changeset
|
400 |
if (!IsDefaultGroupID(id_g)) return num; |
b39bc69bb2f2
(svn r12051) [NoAI] -Sync: with trunk (r11795:12050).
rubidium
parents:
9723
diff
changeset
|
401 |
|
b39bc69bb2f2
(svn r12051) [NoAI] -Sync: with trunk (r11795:12050).
rubidium
parents:
9723
diff
changeset
|
402 |
const Group *g; |
b39bc69bb2f2
(svn r12051) [NoAI] -Sync: with trunk (r11795:12050).
rubidium
parents:
9723
diff
changeset
|
403 |
FOR_ALL_GROUPS(g) { |
b39bc69bb2f2
(svn r12051) [NoAI] -Sync: with trunk (r11795:12050).
rubidium
parents:
9723
diff
changeset
|
404 |
if (g->owner == p) num -= g->num_engines[id_e]; |
b39bc69bb2f2
(svn r12051) [NoAI] -Sync: with trunk (r11795:12050).
rubidium
parents:
9723
diff
changeset
|
405 |
} |
b39bc69bb2f2
(svn r12051) [NoAI] -Sync: with trunk (r11795:12050).
rubidium
parents:
9723
diff
changeset
|
406 |
return num; |
b39bc69bb2f2
(svn r12051) [NoAI] -Sync: with trunk (r11795:12050).
rubidium
parents:
9723
diff
changeset
|
407 |
} |
b39bc69bb2f2
(svn r12051) [NoAI] -Sync: with trunk (r11795:12050).
rubidium
parents:
9723
diff
changeset
|
408 |
|
b39bc69bb2f2
(svn r12051) [NoAI] -Sync: with trunk (r11795:12050).
rubidium
parents:
9723
diff
changeset
|
409 |
void RemoveAllGroupsForPlayer(const PlayerID p) |
9624 | 410 |
{ |
411 |
Group *g; |
|
412 |
||
413 |
FOR_ALL_GROUPS(g) { |
|
9724
b39bc69bb2f2
(svn r12051) [NoAI] -Sync: with trunk (r11795:12050).
rubidium
parents:
9723
diff
changeset
|
414 |
if (p == g->owner) delete g; |
9624 | 415 |
} |
416 |
} |
|
417 |
||
418 |
||
419 |
static const SaveLoad _group_desc[] = { |
|
9724
b39bc69bb2f2
(svn r12051) [NoAI] -Sync: with trunk (r11795:12050).
rubidium
parents:
9723
diff
changeset
|
420 |
SLE_CONDVAR(Group, name, SLE_NAME, 0, 83), |
b39bc69bb2f2
(svn r12051) [NoAI] -Sync: with trunk (r11795:12050).
rubidium
parents:
9723
diff
changeset
|
421 |
SLE_CONDSTR(Group, name, SLE_STR, 0, 84, SL_MAX_VERSION), |
9624 | 422 |
SLE_VAR(Group, num_vehicle, SLE_UINT16), |
423 |
SLE_VAR(Group, owner, SLE_UINT8), |
|
424 |
SLE_VAR(Group, vehicle_type, SLE_UINT8), |
|
425 |
SLE_VAR(Group, replace_protection, SLE_BOOL), |
|
426 |
SLE_END() |
|
427 |
}; |
|
428 |
||
429 |
||
430 |
static void Save_GROUP(void) |
|
431 |
{ |
|
432 |
Group *g; |
|
433 |
||
434 |
FOR_ALL_GROUPS(g) { |
|
435 |
SlSetArrayIndex(g->index); |
|
436 |
SlObject(g, _group_desc); |
|
437 |
} |
|
438 |
} |
|
439 |
||
440 |
||
441 |
static void Load_GROUP(void) |
|
442 |
{ |
|
443 |
int index; |
|
444 |
||
445 |
while ((index = SlIterateArray()) != -1) { |
|
9694
e72987579514
(svn r10775) [NoAI] -Sync: with trunk r10535:r10774.
rubidium
parents:
9641
diff
changeset
|
446 |
Group *g = new (index) Group(); |
9624 | 447 |
SlObject(g, _group_desc); |
448 |
} |
|
449 |
} |
|
450 |
||
451 |
extern const ChunkHandler _group_chunk_handlers[] = { |
|
452 |
{ 'GRPS', Save_GROUP, Load_GROUP, CH_ARRAY | CH_LAST}, |
|
453 |
}; |