|
@@ -1234,25 +1234,30 @@ static void HandleLocomotiveSmokeCloud(V
|
|
|
// blue spark
|
|
|
if ( (v->tick_counter&0x3) == 0 && !IsTrainDepotTile(v->tile) && !IsTunnelTile(v->tile) && (uint16)Random() <= 0x5B0) {
|
|
|
CreateEffectVehicleRel(v, 0,0,10, EV_SMOKE_2);
|
|
|
}
|
|
|
break;
|
|
|
}
|
|
|
} while ( (v = v->next) != NULL );
|
|
|
|
|
|
}
|
|
|
|
|
|
static void TrainPlayLeaveStationSound(Vehicle *v)
|
|
|
{
|
|
|
static const byte sfx[3] = { 0x2, 0x8, 0x8 };
|
|
|
static const SoundFx sfx[] = {
|
|
|
SND_04_TRAIN,
|
|
|
SND_0A_TRAIN_HORN,
|
|
|
SND_0A_TRAIN_HORN
|
|
|
};
|
|
|
|
|
|
int engtype = v->engine_type;
|
|
|
|
|
|
switch (_engines[engtype].railtype) {
|
|
|
case 0:
|
|
|
SndPlayVehicleFx(sfx[RailVehInfo(engtype)->engclass], v);
|
|
|
break;
|
|
|
case 1:
|
|
|
SndPlayVehicleFx(SND_47_MAGLEV_2, v);
|
|
|
break;
|
|
|
case 2:
|
|
|
SndPlayVehicleFx(SND_41_MAGLEV, v);
|
|
|
break;
|
|
@@ -1998,25 +2003,25 @@ static void CheckTrainCollision(Vehicle
|
|
|
if (coll->subtype == 0)
|
|
|
SetVehicleCrashed(coll);
|
|
|
|
|
|
|
|
|
SetDParam(0, num);
|
|
|
|
|
|
AddNewsItem(STR_8868_TRAIN_CRASH_DIE_IN_FIREBALL,
|
|
|
NEWS_FLAGS(NM_THIN, NF_VIEWPORT|NF_VEHICLE, NT_ACCIDENT, 0),
|
|
|
v->index,
|
|
|
0);
|
|
|
|
|
|
ModifyStationRatingAround(v->tile, v->owner, -160, 30);
|
|
|
SndPlayVehicleFx(17, v);
|
|
|
SndPlayVehicleFx(SND_13_BIG_CRASH, v);
|
|
|
}
|
|
|
|
|
|
static void *CheckVehicleAtSignal(Vehicle *v, void *data)
|
|
|
{
|
|
|
uint32 d = (uint32)data;
|
|
|
|
|
|
if (v->type == VEH_Train && v->subtype == 0 && v->tile == (TileIndex)(d >> 8)) {
|
|
|
byte diff = (v->direction - (byte)d + 2) & 7;
|
|
|
if (diff == 2 || (v->cur_speed <= 5 && diff <= 4))
|
|
|
return (void*)1;
|
|
|
}
|
|
|
return 0;
|
|
@@ -2311,25 +2316,26 @@ static void HandleCrashedTrain(Vehicle *
|
|
|
static void HandleBrokenTrain(Vehicle *v)
|
|
|
{
|
|
|
if (v->breakdown_ctr != 1) {
|
|
|
v->breakdown_ctr = 1;
|
|
|
v->cur_speed = 0;
|
|
|
|
|
|
if (v->breakdowns_since_last_service != 255)
|
|
|
v->breakdowns_since_last_service++;
|
|
|
|
|
|
InvalidateWindow(WC_VEHICLE_VIEW, v->index);
|
|
|
InvalidateWindow(WC_VEHICLE_DETAILS, v->index);
|
|
|
|
|
|
SndPlayVehicleFx((_opt.landscape != LT_CANDY) ? 0xE : 0x3A, v);
|
|
|
SndPlayVehicleFx((_opt.landscape != LT_CANDY) ?
|
|
|
SND_10_TRAIN_BREAKDOWN : SND_3A_COMEDY_BREAKDOWN_2, v);
|
|
|
|
|
|
if (!(v->vehstatus & VS_HIDDEN)) {
|
|
|
Vehicle *u = CreateEffectVehicleRel(v, 4, 4, 5, EV_BREAKDOWN_SMOKE);
|
|
|
if (u)
|
|
|
u->u.special.unk0 = v->breakdown_delay * 2;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
if (!(v->tick_counter & 3)) {
|
|
|
if (!--v->breakdown_delay) {
|
|
|
v->breakdown_ctr = 0;
|
|
|
InvalidateWindow(WC_VEHICLE_VIEW, v->index);
|
|
@@ -2408,25 +2414,25 @@ static void TrainCheckIfLineEnds(Vehicle
|
|
|
break;
|
|
|
case 6:
|
|
|
x = (~y) + x + 8;
|
|
|
break;
|
|
|
}
|
|
|
|
|
|
if ( (uint16)ts != 0) {
|
|
|
if ((ts &= (ts >> 16)) == 0) {
|
|
|
// make a rail/road crossing red
|
|
|
if (IS_TILETYPE(tile, MP_STREET) && (_map5[tile] & 0xF0)==0x10) {
|
|
|
if (!(_map5[tile] & 4)) {
|
|
|
_map5[tile] |= 4;
|
|
|
SndPlayVehicleFx(12, v);
|
|
|
SndPlayVehicleFx(SND_0E_LEVEL_CROSSING, v);
|
|
|
MarkTileDirtyByTile(tile);
|
|
|
}
|
|
|
}
|
|
|
return;
|
|
|
}
|
|
|
} else if (x + 4 > 15) {
|
|
|
v->cur_speed = 0;
|
|
|
ReverseTrainDirection(v);
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
// slow down
|