# HG changeset patch # User tron # Date 1110112878 0 # Node ID 768af765b5befd6fa98073927ca58c2b7e666c2f # Parent 37f7348421d03d4270380ecbe34da53acfa8403c (svn r1936) End some void-pointer-as-int-abuse; this also fixes a latent bug where a TileIndex was only 24bit wide (on 32bit architectures) diff -r 37f7348421d0 -r 768af765b5be train_cmd.c --- a/train_cmd.c Sun Mar 06 12:33:33 2005 +0000 +++ b/train_cmd.c Sun Mar 06 12:41:18 2005 +0000 @@ -2368,16 +2368,23 @@ SndPlayVehicleFx(SND_13_BIG_CRASH, v); } +typedef struct VehicleAtSignalData { + TileIndex tile; + byte direction; +} VehicleAtSignalData; + static void *CheckVehicleAtSignal(Vehicle *v, void *data) { - uint32 d = (uint32)data; - - if (v->type == VEH_Train && v->subtype == TS_Front_Engine && v->tile == (TileIndex)(d >> 8)) { - byte diff = (v->direction - (byte)d + 2) & 7; + const VehicleAtSignalData* vasd = data; + + if (v->type == VEH_Train && v->subtype == TS_Front_Engine && + v->tile == vasd->tile) { + byte diff = (v->direction - vasd->direction + 2) & 7; + if (diff == 2 || (v->cur_speed <= 5 && diff <= 4)) - return (void*)1; + return v; } - return 0; + return NULL; } static void TrainController(Vehicle *v) @@ -2581,9 +2588,14 @@ v->subspeed = 0; v->progress = 255-10; if (++v->load_unload_time_rem < _patches.wait_twoway_signal * 73) { - uint o_tile = gp.new_tile + TileOffsByDir(enterdir); + TileIndex o_tile = gp.new_tile + TileOffsByDir(enterdir); + VehicleAtSignalData vasd = { + o_tile, + dir ^ 4 + }; + /* check if a train is waiting on the other side */ - if (VehicleFromPos(o_tile, (void*)( (o_tile<<8) | (dir^4)), (VehicleFromPosProc*)CheckVehicleAtSignal) == NULL) + if (VehicleFromPos(o_tile, &vasd, CheckVehicleAtSignal) == NULL) return; } }