summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorKUDr <kudr@openttd.org>2007-01-18 09:34:44 +0000
committerKUDr <kudr@openttd.org>2007-01-18 09:34:44 +0000
commit147ca220600392d3c3394bfe194cb31de8d9f6ec (patch)
tree27b6f6857e67b835eddc042d6dd1fdb286c4862a /src
parent653290c76ab322dc4d192e26cd2502aa2ea284dd (diff)
downloadopenttd-147ca220600392d3c3394bfe194cb31de8d9f6ec.tar.xz
(svn r8231) -Fix (r8125): MP desync caused by calling Random() from station constructor. This was wrong because station constructor is called also when loading savegame and when player tries to build station when it is not sure that it will succeed (thanks Rubidium)
Diffstat (limited to 'src')
-rw-r--r--src/station.cpp15
-rw-r--r--src/station.h1
-rw-r--r--src/station_cmd.cpp24
3 files changed, 19 insertions, 21 deletions
diff --git a/src/station.cpp b/src/station.cpp
index b718a0aac..80b039d78 100644
--- a/src/station.cpp
+++ b/src/station.cpp
@@ -50,7 +50,7 @@ Station::Station(TileIndex tile)
last_vehicle_type = VEH_Invalid;
- random_bits = Random();
+ random_bits = 0; // Random() must be called when station is really built (DC_EXEC)
waiting_triggers = 0;
}
@@ -105,6 +105,19 @@ void Station::operator delete(void *p, int st_idx)
{
}
+/** Called when new facility is built on the station. If it is the first facility
+ * it initializes also 'xy' and 'random_bits' members */
+void Station::AddFacility(byte new_facility_bit, TileIndex facil_xy)
+{
+ if (facilities == 0) {
+ xy = facil_xy;
+ random_bits = Random();
+ }
+ facilities |= new_facility_bit;
+ owner = _current_player;
+ build_date = _date;
+}
+
void Station::MarkDirty() const
{
if (sign.width_1 != 0) {
diff --git a/src/station.h b/src/station.h
index 7299b87f7..b4365d2ba 100644
--- a/src/station.h
+++ b/src/station.h
@@ -159,6 +159,7 @@ struct Station {
void* operator new (size_t size, int st_idx);
void operator delete(void *p, int st_idx);
+ void AddFacility(byte new_facility_bit, TileIndex facil_xy);
void MarkDirty() const;
void MarkTilesDirty() const;
bool TileBelongsToRailStation(TileIndex tile) const;
diff --git a/src/station_cmd.cpp b/src/station_cmd.cpp
index b66d64b05..b73211dd7 100644
--- a/src/station_cmd.cpp
+++ b/src/station_cmd.cpp
@@ -1000,15 +1000,11 @@ int32 CmdBuildRailroadStation(TileIndex tile_org, uint32 flags, uint32 p1, uint3
if (CmdFailed(ret)) return ret;
st->train_tile = finalvalues[0];
- if (!st->facilities) st->xy = finalvalues[0];
- st->facilities |= FACIL_TRAIN;
- st->owner = _current_player;
+ st->AddFacility(FACIL_TRAIN, finalvalues[0]);
st->trainst_w = finalvalues[1];
st->trainst_h = finalvalues[2];
- st->build_date = _date;
-
st->rect.BeforeAddRect(tile_org, w_org, h_org, StationRect::ADD_TRY);
tile_delta = (axis == AXIS_X ? TileDiffXY(1, 0) : TileDiffXY(0, 1));
@@ -1415,11 +1411,7 @@ int32 CmdBuildRoadStop(TileIndex tile, uint32 flags, uint32 p1, uint32 p2)
//initialize an empty station
road_stop->prev = prev;
- if (!st->facilities) st->xy = tile;
- st->facilities |= (type) ? FACIL_TRUCK_STOP : FACIL_BUS_STOP;
- st->owner = _current_player;
-
- st->build_date = _date;
+ st->AddFacility((type) ? FACIL_TRUCK_STOP : FACIL_BUS_STOP, tile);
st->rect.BeforeAddTile(tile, StationRect::ADD_TRY);
@@ -1674,15 +1666,11 @@ int32 CmdBuildAirport(TileIndex tile, uint32 flags, uint32 p1, uint32 p2)
cost += _price.build_airport * w * h;
if (flags & DC_EXEC) {
- st->owner = _current_player;
st->airport_tile = tile;
- if (!st->facilities) st->xy = tile;
- st->facilities |= FACIL_AIRPORT;
+ st->AddFacility(FACIL_AIRPORT, tile);
st->airport_type = (byte)p1;
st->airport_flags = 0;
- st->build_date = _date;
-
st->rect.BeforeAddRect(tile, w, h, StationRect::ADD_TRY);
/* if airport was demolished while planes were en-route to it, the
@@ -1953,11 +1941,7 @@ int32 CmdBuildDock(TileIndex tile, uint32 flags, uint32 p1, uint32 p2)
if (flags & DC_EXEC) {
st->dock_tile = tile;
- if (!st->facilities) st->xy = tile;
- st->facilities |= FACIL_DOCK;
- st->owner = _current_player;
-
- st->build_date = _date;
+ st->AddFacility(FACIL_DOCK, tile);
st->rect.BeforeAddRect(tile, _dock_w_chk[direction], _dock_h_chk[direction], StationRect::ADD_TRY);