Changeset - r5721:2780cdf77488
[Not reviewed]
master
0 3 0
KUDr - 18 years ago 2007-01-18 09:34:44
kudr@openttd.org
(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)
3 files changed with 19 insertions and 21 deletions:
0 comments (0 inline, 0 general)
src/station.cpp
Show inline comments
 
@@ -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, i
 
{
 
}
 

	
 
/** 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) {
src/station.h
Show inline comments
 
@@ -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;
src/station_cmd.cpp
Show inline comments
 
@@ -1000,15 +1000,11 @@ int32 CmdBuildRailroadStation(TileIndex 
 
		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, u
 

	
 
		//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, ui
 
	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, uint3
 

	
 
	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);
 

	
0 comments (0 inline, 0 general)