File diff r540:14f3c0eda6cb → r541:062eeec7f0a4
train_cmd.c
Show inline comments
 
@@ -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