summaryrefslogtreecommitdiff
path: root/vehicle.c
diff options
context:
space:
mode:
authortron <tron@openttd.org>2004-12-05 12:43:04 +0000
committertron <tron@openttd.org>2004-12-05 12:43:04 +0000
commit7c2448ecea6ec47f9df4928ad3f42668936835ee (patch)
treef4ed902f473744cc8497d09b3f372d3da1524f4f /vehicle.c
parent1de8e294d892a70edbd1f4f3d3a6a141711f6648 (diff)
downloadopenttd-7c2448ecea6ec47f9df4928ad3f42668936835ee.tar.xz
(svn r955) Replace uint16 for orders with struct Order
This adds no functionality, but is a stepping stone for future improvement (like 16bit order indices) and is easier to read. This changes preserves binary compatibility wrt savegames.
Diffstat (limited to 'vehicle.c')
-rw-r--r--vehicle.c58
1 files changed, 40 insertions, 18 deletions
diff --git a/vehicle.c b/vehicle.c
index e91511f6e..191268dae 100644
--- a/vehicle.c
+++ b/vehicle.c
@@ -402,7 +402,7 @@ uint GetWaypointByTile(uint tile)
Vehicle *IsScheduleShared(Vehicle *u)
{
- uint16 *sched = u->schedule_ptr;
+ const Order *sched = u->schedule_ptr;
Vehicle *v;
FOR_ALL_VEHICLES(v) {
@@ -414,7 +414,8 @@ Vehicle *IsScheduleShared(Vehicle *u)
void DeleteVehicleSchedule(Vehicle *v)
{
- uint16 *sched, *cur;
+ Order *sched;
+ Order *cur;
int num;
Vehicle *u;
@@ -446,32 +447,33 @@ void DeleteVehicleSchedule(Vehicle *v)
}
}
-void DeleteCommandFromVehicleSchedule(uint cmd)
+void DeleteCommandFromVehicleSchedule(Order cmd)
{
Vehicle *v;
- uint16 *sched;
- uint order;
bool need_invalidate;
FOR_ALL_VEHICLES(v) {
if (v->type != 0 && v->schedule_ptr != NULL) {
+ Order *sched;
// clear last station visited
- if (v->last_station_visited == (cmd>>8) && (cmd & OT_MASK) == OT_GOTO_STATION)
+ if (v->last_station_visited == cmd.station && cmd.type == OT_GOTO_STATION)
v->last_station_visited = 0xFF;
// check the next order
- if ( (uint)((v->next_order&OT_MASK) | (v->next_order_param<<8)) == cmd) {
- v->next_order = OT_DUMMY;
+ if (v->current_order.type == cmd.type &&
+ v->current_order.station == cmd.station) {
+ v->current_order.type = OT_DUMMY;
+ v->current_order.flags = 0;
InvalidateWindow(WC_VEHICLE_VIEW, v->index);
}
// clear the order list
need_invalidate = false;
- sched = v->schedule_ptr;
- while ((order=*sched++) != 0) {
- if ( (order & (OT_MASK|0xFF00)) == cmd) {
- sched[-1] = OT_DUMMY;
+ for (sched = v->schedule_ptr; sched->type != OT_NOTHING; ++sched) {
+ if (sched->type == cmd.type && sched->station == cmd.station) {
+ sched->type = OT_DUMMY;
+ sched->flags = 0;
need_invalidate = true;
}
}
@@ -484,6 +486,7 @@ void DeleteCommandFromVehicleSchedule(uint cmd)
void DoDeleteDepot(uint tile)
{
+ Order order;
byte dep_index;
Depot *d;
@@ -494,7 +497,10 @@ void DoDeleteDepot(uint tile)
for(d=_depots,dep_index=0; d->xy != (TileIndex)tile; d++) {dep_index++;}
d->xy = 0;
- DeleteCommandFromVehicleSchedule((dep_index << 8) + OT_GOTO_DEPOT);
+ order.type = OT_GOTO_DEPOT;
+ order.flags = 0;
+ order.station = dep_index;
+ DeleteCommandFromVehicleSchedule(order);
// Delete the depot
DeleteWindowById(WC_VEHICLE_DEPOT, tile);
@@ -1586,8 +1592,8 @@ const byte _common_veh_desc[] = {
SLE_VAR(Vehicle,cur_order_index, SLE_UINT8),
SLE_VAR(Vehicle,num_orders, SLE_UINT8),
- SLE_VAR(Vehicle,next_order, SLE_UINT8),
- SLE_VAR(Vehicle,next_order_param, SLE_UINT8),
+ SLE_VAR(Vehicle,current_order, SLE_UINT8), /* XXX hack to avoid version bump */
+ SLE_VAR(Vehicle,current_order.station, SLE_UINT8),
SLE_REF(Vehicle,schedule_ptr, REF_SCHEDULE),
SLE_VAR(Vehicle,age, SLE_UINT16),
@@ -1731,7 +1737,7 @@ static const byte _disaster_desc[] = {
SLE_VAR(Vehicle,z_height, SLE_UINT8),
SLE_VAR(Vehicle,owner, SLE_UINT8),
SLE_VAR(Vehicle,vehstatus, SLE_UINT8),
- SLE_VAR(Vehicle,next_order, SLE_UINT8),
+ SLE_VAR(Vehicle,current_order.station, SLE_UINT8),
SLE_VAR(Vehicle,cur_image, SLE_UINT16),
SLE_VAR(Vehicle,age, SLE_UINT16),
@@ -1858,15 +1864,31 @@ static void Load_CHKP()
static void Save_ORDR()
{
+ uint16 orders[lengthof(_order_array)];
uint len = _ptr_to_next_order - _order_array;
- SlArray(_order_array, len, SLE_UINT16);
+ uint i;
+
+ assert (len <= lengthof(orders));
+
+ for (i = 0; i < len; ++i)
+ orders[i] = PackOrder(&_order_array[i]);
+
+ SlArray(orders, len, SLE_UINT16);
}
static void Load_ORDR()
{
+ uint16 orders[lengthof(_order_array)];
uint len = SlGetFieldLength() >> 1;
+ uint i;
+
+ assert (len <= lengthof(orders));
+
_ptr_to_next_order = _order_array + len;
- SlArray(_order_array, len, SLE_UINT16);
+ SlArray(orders, len, SLE_UINT16);
+
+ for (i = 0; i < len; ++i)
+ _order_array[i] = UnpackOrder(orders[i]);
}
const ChunkHandler _veh_chunk_handlers[] = {