Changeset - r15948:54c7a9cc770e
[Not reviewed]
master
0 1 0
rubidium - 14 years ago 2010-08-28 14:18:56
rubidium@openttd.org
(svn r20646) -Codechange: make the code flow of breakdown handling a bit clearer
1 file changed with 44 insertions and 40 deletions:
0 comments (0 inline, 0 general)
src/vehicle.cpp
Show inline comments
 
@@ -993,53 +993,57 @@ bool Vehicle::HandleBreakdown()
 
	 * 1  - vehicle is currently broken down
 
	 * 2  - vehicle is going to break down now
 
	 * >2 - vehicle is counting down to the actual breakdown event */
 
	if (this->breakdown_ctr == 0) return false;
 
	if (this->breakdown_ctr > 2) {
 
		if (!this->current_order.IsType(OT_LOADING)) this->breakdown_ctr--;
 
		return false;
 
	}
 
	if (this->breakdown_ctr != 1) {
 
		this->breakdown_ctr = 1;
 

	
 
		if (this->breakdowns_since_last_service != 255) {
 
			this->breakdowns_since_last_service++;
 
		}
 
	switch (this->breakdown_ctr) {
 
		case 0:
 
			return false;
 

	
 
		this->MarkDirty();
 
		SetWindowDirty(WC_VEHICLE_VIEW, this->index);
 
		SetWindowDirty(WC_VEHICLE_DETAILS, this->index);
 
		case 2:
 
			this->breakdown_ctr = 1;
 

	
 
		if (this->type == VEH_AIRCRAFT) {
 
			/* Aircraft just need this flag, the rest is handled elsewhere */
 
			this->vehstatus |= VS_AIRCRAFT_BROKEN;
 
		} else {
 
			this->cur_speed = 0;
 

	
 
			if (!PlayVehicleSound(this, VSE_BREAKDOWN)) {
 
				SndPlayVehicleFx((_settings_game.game_creation.landscape != LT_TOYLAND) ?
 
					(this->type == VEH_TRAIN ? SND_10_TRAIN_BREAKDOWN : SND_0F_VEHICLE_BREAKDOWN) :
 
					(this->type == VEH_TRAIN ? SND_3A_COMEDY_BREAKDOWN_2 : SND_35_COMEDY_BREAKDOWN), this);
 
			if (this->breakdowns_since_last_service != 255) {
 
				this->breakdowns_since_last_service++;
 
			}
 

	
 
			if (!(this->vehstatus & VS_HIDDEN)) {
 
				EffectVehicle *u = CreateEffectVehicleRel(this, 4, 4, 5, EV_BREAKDOWN_SMOKE);
 
				if (u != NULL) u->animation_state = this->breakdown_delay * 2;
 
			}
 
		}
 
	}
 

	
 
	/* Aircraft breakdowns end only when arriving at the airport */
 
	if (this->type == VEH_AIRCRAFT) return false;
 

	
 
	/* For trains this function is called twice per tick, so decrease v->breakdown_delay at half the rate */
 
	if ((this->tick_counter & (this->type == VEH_TRAIN ? 3 : 1)) == 0) {
 
		if (--this->breakdown_delay == 0) {
 
			this->breakdown_ctr = 0;
 
			this->MarkDirty();
 
			SetWindowDirty(WC_VEHICLE_VIEW, this->index);
 
		}
 
			SetWindowDirty(WC_VEHICLE_DETAILS, this->index);
 

	
 
			if (this->type == VEH_AIRCRAFT) {
 
				/* Aircraft just need this flag, the rest is handled elsewhere */
 
				this->vehstatus |= VS_AIRCRAFT_BROKEN;
 
			} else {
 
				this->cur_speed = 0;
 

	
 
				if (!PlayVehicleSound(this, VSE_BREAKDOWN)) {
 
					SndPlayVehicleFx((_settings_game.game_creation.landscape != LT_TOYLAND) ?
 
						(this->type == VEH_TRAIN ? SND_10_TRAIN_BREAKDOWN : SND_0F_VEHICLE_BREAKDOWN) :
 
						(this->type == VEH_TRAIN ? SND_3A_COMEDY_BREAKDOWN_2 : SND_35_COMEDY_BREAKDOWN), this);
 
				}
 

	
 
				if (!(this->vehstatus & VS_HIDDEN)) {
 
					EffectVehicle *u = CreateEffectVehicleRel(this, 4, 4, 5, EV_BREAKDOWN_SMOKE);
 
					if (u != NULL) u->animation_state = this->breakdown_delay * 2;
 
				}
 
			}
 
			/* FALL THROUGH */
 
		case 1:
 
			/* Aircraft breakdowns end only when arriving at the airport */
 
			if (this->type == VEH_AIRCRAFT) return false;
 

	
 
			/* For trains this function is called twice per tick, so decrease v->breakdown_delay at half the rate */
 
			if ((this->tick_counter & (this->type == VEH_TRAIN ? 3 : 1)) == 0) {
 
				if (--this->breakdown_delay == 0) {
 
					this->breakdown_ctr = 0;
 
					this->MarkDirty();
 
					SetWindowDirty(WC_VEHICLE_VIEW, this->index);
 
				}
 
			}
 
			return true;
 

	
 
		default:
 
			if (!this->current_order.IsType(OT_LOADING)) this->breakdown_ctr--;
 
			return false;
 
	}
 
	return true;
 
}
 

	
 
void AgeVehicle(Vehicle *v)
0 comments (0 inline, 0 general)