mirror of https://github.com/OpenTTD/OpenTTD
(svn r8870) [0.5] -Backport from trunk (r8684, r8709, r8738, r8777, r8828):
- Bool (uint32 in PPC) was written to as a uint8 (r8684) - Fix a problem where loading times for overhanging trains are miscomputed (r8709) - Load newer TTDP games (update coastal tiles) (r8738) - Cloning unaware of articulated locomotives that could refit without refitting the front unit (r8777) - Load station rectangle for all savegames, not only after version 27 (r8828)release/0.5
parent
c92b6e1e8b
commit
edc2ac8bbf
32
oldloader.c
32
oldloader.c
|
@ -1510,16 +1510,28 @@ static bool LoadOldMain(LoadgameState *ls)
|
|||
}
|
||||
|
||||
for (i = 0; i < OLD_MAP_SIZE; i ++) {
|
||||
if (IsTileType(i, MP_RAILWAY)) {
|
||||
/* We save presignals different from TTDPatch, convert them */
|
||||
if (GetRailTileType(i) == RAIL_TILE_SIGNALS) {
|
||||
/* This byte is always zero in TTD for this type of tile */
|
||||
if (_m[i].m4) /* Convert the presignals to our own format */
|
||||
_m[i].m4 = (_m[i].m4 >> 1) & 7;
|
||||
}
|
||||
/* TTDPatch stores PBS things in L6 and all elsewhere; so we'll just
|
||||
* clear it for ourselves and let OTTD's rebuild PBS itself */
|
||||
_m[i].m4 &= 0xF; /* Only keep the lower four bits; upper four is PBS */
|
||||
switch (GetTileType(i)) {
|
||||
case MP_RAILWAY:
|
||||
/* We save presignals different from TTDPatch, convert them */
|
||||
if (GetRailTileType(i) == RAIL_TILE_SIGNALS) {
|
||||
/* This byte is always zero in TTD for this type of tile */
|
||||
if (_m[i].m4) /* Convert the presignals to our own format */
|
||||
_m[i].m4 = (_m[i].m4 >> 1) & 7;
|
||||
}
|
||||
/* TTDPatch stores PBS things in L6 and all elsewhere; so we'll just
|
||||
* clear it for ourselves and let OTTD's rebuild PBS itself */
|
||||
_m[i].m4 &= 0xF; /* Only keep the lower four bits; upper four is PBS */
|
||||
break;
|
||||
case MP_WATER: {
|
||||
/* TTDPatch has all tiles touching water as coast (water)-type, we don't.
|
||||
* This is only true from a certain TTDP version, but there is no harm
|
||||
* in checking all the time */
|
||||
Slope s = GetTileSlope(i, NULL);
|
||||
if (s == SLOPE_ENW || s == SLOPE_NWS || s == SLOPE_SEN || s == SLOPE_WSE || IsSteepSlope(s)) {
|
||||
SetTileType(i, MP_CLEAR);
|
||||
SetTileOwner(i, OWNER_NONE);
|
||||
}
|
||||
} break;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -1119,7 +1119,7 @@ static void UpdateSignOwner(void)
|
|||
|
||||
extern void UpdateOldAircraft( void );
|
||||
extern void UpdateOilRig( void );
|
||||
|
||||
extern bool StationRect_BeforeAddTile(Station *st, TileIndex tile, int mode);
|
||||
|
||||
static inline RailType UpdateRailType(RailType rt, RailType min)
|
||||
{
|
||||
|
@ -1490,6 +1490,13 @@ bool AfterLoadGame(void)
|
|||
|
||||
if (!CheckSavegameVersion(27)) AfterLoadStations();
|
||||
|
||||
BEGIN_TILE_LOOP(tile, MapSizeX(), MapSizeY(), 0) {
|
||||
if (GetTileType(tile) == MP_STATION) {
|
||||
Station *st = GetStationByTile(tile);
|
||||
StationRect_BeforeAddTile(st, tile, 2 /* RECT_MODE_FORCE */);
|
||||
}
|
||||
} END_TILE_LOOP(tile, MapSizeX(), MapSizeY(), 0);
|
||||
|
||||
{
|
||||
/* Set up the engine count for all players */
|
||||
Player *players[MAX_PLAYERS];
|
||||
|
|
|
@ -958,7 +958,7 @@ static void ini_save_setting_list(IniFile *ini, const char *grpname, char **list
|
|||
SDTG_CONDVAR(name, type, flags, guiflags, var, def, min, max, interval, str, proc, 0, SL_MAX_VERSION)
|
||||
|
||||
#define SDTG_CONDBOOL(name, flags, guiflags, var, def, str, proc, from, to)\
|
||||
SDTG_GENERAL(name, SDT_BOOLX, SL_VAR, SLE_UINT8, flags, guiflags, var, 0, def, 0, 1, 0, NULL, str, proc, from, to)
|
||||
SDTG_GENERAL(name, SDT_BOOLX, SL_VAR, SLE_BOOL, flags, guiflags, var, 0, def, 0, 1, 0, NULL, str, proc, from, to)
|
||||
#define SDTG_BOOL(name, flags, guiflags, var, def, str, proc)\
|
||||
SDTG_CONDBOOL(name, flags, guiflags, var, def, str, proc, 0, SL_MAX_VERSION)
|
||||
|
||||
|
|
|
@ -42,7 +42,7 @@ typedef enum StationRectModes
|
|||
|
||||
static void StationRect_Init(Station *st);
|
||||
static bool StationRect_IsEmpty(Station *st);
|
||||
static bool StationRect_BeforeAddTile(Station *st, TileIndex tile, StationRectMode mode);
|
||||
bool StationRect_BeforeAddTile(Station *st, TileIndex tile, StationRectMode mode);
|
||||
static bool StationRect_BeforeAddRect(Station *st, TileIndex tile, int w, int h, StationRectMode mode);
|
||||
static bool StationRect_AfterRemoveTile(Station *st, TileIndex tile);
|
||||
static bool StationRect_AfterRemoveRect(Station *st, TileIndex tile, int w, int h);
|
||||
|
@ -1249,14 +1249,14 @@ uint GetStationPlatforms(const Station *st, TileIndex tile)
|
|||
do {
|
||||
t -= delta;
|
||||
len++;
|
||||
} while (TileBelongsToRailStation(st, t) && GetRailStationAxis(t) == axis);
|
||||
} while (IsCompatibleTrainStationTile(t, tile));
|
||||
|
||||
// find ending tile
|
||||
t = tile;
|
||||
do {
|
||||
t += delta;
|
||||
len++;
|
||||
} while (TileBelongsToRailStation(st, t) && GetRailStationAxis(t) == axis);
|
||||
} while (IsCompatibleTrainStationTile(t, tile));
|
||||
|
||||
return len - 1;
|
||||
}
|
||||
|
@ -2929,7 +2929,6 @@ void AfterLoadStations(void)
|
|||
{
|
||||
Station *st;
|
||||
uint i;
|
||||
TileIndex tile;
|
||||
|
||||
/* Update the speclists of all stations to point to the currently loaded custom stations. */
|
||||
FOR_ALL_STATIONS(st) {
|
||||
|
@ -2939,12 +2938,6 @@ void AfterLoadStations(void)
|
|||
st->speclist[i].spec = GetCustomStationSpecByGrf(st->speclist[i].grfid, st->speclist[i].localidx);
|
||||
}
|
||||
}
|
||||
|
||||
for (tile = 0; tile < MapSize(); tile++) {
|
||||
if (GetTileType(tile) != MP_STATION) continue;
|
||||
st = GetStationByTile(tile);
|
||||
StationRect_BeforeAddTile(st, tile, RECT_MODE_FORCE);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
@ -3188,7 +3181,7 @@ static bool StationRect_IsEmpty(Station *st)
|
|||
return (st->rect.left == 0 || st->rect.left > st->rect.right || st->rect.top > st->rect.bottom);
|
||||
}
|
||||
|
||||
static bool StationRect_BeforeAddTile(Station *st, TileIndex tile, StationRectMode mode)
|
||||
bool StationRect_BeforeAddTile(Station *st, TileIndex tile, StationRectMode mode)
|
||||
{
|
||||
Rect *r = &st->rect;
|
||||
int x = TileX(tile);
|
||||
|
|
19
vehicle.c
19
vehicle.c
|
@ -1839,13 +1839,22 @@ int32 CmdCloneVehicle(TileIndex tile, uint32 flags, uint32 p1, uint32 p2)
|
|||
total_cost += cost;
|
||||
|
||||
if (flags & DC_EXEC) {
|
||||
Vehicle *v2, *w2;
|
||||
w = GetVehicle(_new_vehicle_id);
|
||||
w2 = w;
|
||||
v2 = v;
|
||||
|
||||
do {
|
||||
if (v->cargo_type != w->cargo_type || v->cargo_subtype != w->cargo_subtype) {
|
||||
/* We can't pay for refitting because we can't estimate refitting costs for a vehicle before it's build.
|
||||
* If we pay for it anyway, the cost and the estimated cost will not be the same and we will have an assert.
|
||||
* We need to check the whole chain if it is a train because some newgrf articulated engines can refit some
|
||||
* units only (and not the front) */
|
||||
DoCommand(0, w->index, v2->cargo_type | (v2->cargo_subtype << 8), flags, CMD_REFIT_VEH(v->type));
|
||||
break; // We learned that the engine in question needed a refit. No need to check anymore
|
||||
}
|
||||
} while (v->type == VEH_Train && (w2 = w2->next) != NULL && (v2 = v2->next) != NULL);
|
||||
|
||||
if (v->cargo_type != w->cargo_type || v->cargo_subtype != w->cargo_subtype) {
|
||||
// we can't pay for refitting because we can't estimate refitting costs for a vehicle before it's build
|
||||
// if we pay for it anyway, the cost and the estimated cost will not be the same and we will have an assert
|
||||
DoCommand(0, w->index, v->cargo_type | (v->cargo_subtype << 8), flags, CMD_REFIT_VEH(v->type));
|
||||
}
|
||||
if (v->type == VEH_Train && HASBIT(v->u.rail.flags, VRF_REVERSE_DIRECTION)) {
|
||||
SETBIT(w->u.rail.flags, VRF_REVERSE_DIRECTION);
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue