Changeset - r24578:e105ade320f5
[Not reviewed]
master
0 6 0
Patric Stout - 3 years ago 2021-01-05 20:39:23
truebrain@openttd.org
Fix #7611: keeps news about accidents around after vehicle is cleaned up (#8497)

When a vehicle is cleaned up, all news that points to the news is
also removed. This was a bit evil, as it would also remove any
news related to crashed, acting like the crash never happened.
This left players a bit in the dark what was going on exactly.
6 files changed with 10 insertions and 14 deletions:
0 comments (0 inline, 0 general)
src/aircraft_cmd.cpp
Show inline comments
 
@@ -1330,13 +1330,13 @@ static void CrashAirplane(Aircraft *v)
 
		newsitem = STR_NEWS_AIRCRAFT_CRASH;
 
	}
 

	
 
	AI::NewEvent(v->owner, new ScriptEventVehicleCrashed(v->index, v->tile, st == nullptr ? ScriptEventVehicleCrashed::CRASH_AIRCRAFT_NO_AIRPORT : ScriptEventVehicleCrashed::CRASH_PLANE_LANDING));
 
	Game::NewEvent(new ScriptEventVehicleCrashed(v->index, v->tile, st == nullptr ? ScriptEventVehicleCrashed::CRASH_AIRCRAFT_NO_AIRPORT : ScriptEventVehicleCrashed::CRASH_PLANE_LANDING));
 

	
 
	AddVehicleNewsItem(newsitem, NT_ACCIDENT, v->index, st != nullptr ? st->index : INVALID_STATION);
 
	AddTileNewsItem(newsitem, NT_ACCIDENT, v->tile, nullptr, st != nullptr ? st->index : INVALID_STATION);
 

	
 
	ModifyStationRatingAround(v->tile, v->owner, -160, 30);
 
	if (_settings_client.sound.disaster) SndPlayVehicleFx(SND_12_EXPLOSION, v);
 
}
 

	
 
/**
src/disaster_vehicle.cpp
Show inline comments
 
@@ -240,13 +240,13 @@ static bool DisasterTick_Zeppeliner(Disa
 
		} else if (v->current_order.GetDestination() == 0) {
 
			if (IsValidTile(v->tile) && IsAirportTile(v->tile)) {
 
				v->current_order.SetDestination(1);
 
				v->age = 0;
 

	
 
				SetDParam(0, GetStationIndex(v->tile));
 
				AddVehicleNewsItem(STR_NEWS_DISASTER_ZEPPELIN, NT_ACCIDENT, v->index); // Delete the news, when the zeppelin is gone
 
				AddTileNewsItem(STR_NEWS_DISASTER_ZEPPELIN, NT_ACCIDENT, v->tile);
 
				AI::NewEvent(GetTileOwner(v->tile), new ScriptEventDisasterZeppelinerCrashed(GetStationIndex(v->tile)));
 
			}
 
		}
 

	
 
		if (v->y_pos >= (int)((MapSizeY() + 9) * TILE_SIZE - 1)) {
 
			delete v;
 
@@ -374,13 +374,13 @@ static bool DisasterTick_Ufo(DisasterVeh
 

	
 
		if (z <= u->z_pos && (u->vehstatus & VS_HIDDEN) == 0) {
 
			v->age++;
 
			if (u->crashed_ctr == 0) {
 
				u->Crash();
 

	
 
				AddVehicleNewsItem(STR_NEWS_DISASTER_SMALL_UFO, NT_ACCIDENT, u->index); // delete the news, when the roadvehicle is gone
 
				AddTileNewsItem(STR_NEWS_DISASTER_SMALL_UFO, NT_ACCIDENT, u->tile);
 

	
 
				AI::NewEvent(u->owner, new ScriptEventVehicleCrashed(u->index, u->tile, ScriptEventVehicleCrashed::CRASH_RV_UFO));
 
				Game::NewEvent(new ScriptEventVehicleCrashed(u->index, u->tile, ScriptEventVehicleCrashed::CRASH_RV_UFO));
 
			}
 
		}
 

	
 
@@ -453,13 +453,13 @@ static bool DisasterTick_Aircraft(Disast
 
			v->age = 0;
 

	
 
			Industry *i = Industry::Get(v->dest_tile); // Industry destructor calls ReleaseDisastersTargetingIndustry, so this is valid
 
			DestructIndustry(i);
 

	
 
			SetDParam(0, i->town->index);
 
			AddIndustryNewsItem(news_message, NT_ACCIDENT, i->index); // delete the news, when the industry closes
 
			AddTileNewsItem(news_message, NT_ACCIDENT, v->dest_tile);
 
			if (_settings_client.sound.disaster) SndPlayTileFx(SND_12_EXPLOSION, i->location.tile);
 
		}
 
	} else if (v->current_order.GetDestination() == 0) {
 
		int x = v->x_pos + ((leave_at_top ? -15 : 15) * TILE_SIZE);
 
		int y = v->y_pos;
 

	
src/news_func.h
Show inline comments
 
@@ -39,15 +39,15 @@ static inline void AddVehicleNewsItem(St
 
 */
 
static inline void AddVehicleAdviceNewsItem(StringID string, VehicleID vehicle)
 
{
 
	AddNewsItem(string, NT_ADVICE, NF_INCOLOUR | NF_SMALL | NF_VEHICLE_PARAM0, NR_VEHICLE, vehicle);
 
}
 

	
 
static inline void AddTileNewsItem(StringID string, NewsType type, TileIndex tile, void *free_data = nullptr)
 
static inline void AddTileNewsItem(StringID string, NewsType type, TileIndex tile, void *free_data = nullptr, StationID station = INVALID_STATION)
 
{
 
	AddNewsItem(string, type, NF_NO_TRANSPARENT | NF_SHADE | NF_THIN, NR_TILE, tile, NR_NONE, UINT32_MAX, free_data);
 
	AddNewsItem(string, type, NF_NO_TRANSPARENT | NF_SHADE | NF_THIN, NR_TILE, tile, station == INVALID_STATION ? NR_NONE : NR_STATION, station, free_data);
 
}
 

	
 
static inline void AddIndustryNewsItem(StringID string, NewsType type, IndustryID industry)
 
{
 
	AddNewsItem(string, type, NF_NO_TRANSPARENT | NF_SHADE | NF_THIN, NR_INDUSTRY, industry);
 
}
src/roadveh_cmd.cpp
Show inline comments
 
@@ -549,18 +549,14 @@ static void RoadVehCrash(RoadVehicle *v)
 
	uint pass = v->Crash();
 

	
 
	AI::NewEvent(v->owner, new ScriptEventVehicleCrashed(v->index, v->tile, ScriptEventVehicleCrashed::CRASH_RV_LEVEL_CROSSING));
 
	Game::NewEvent(new ScriptEventVehicleCrashed(v->index, v->tile, ScriptEventVehicleCrashed::CRASH_RV_LEVEL_CROSSING));
 

	
 
	SetDParam(0, pass);
 
	AddVehicleNewsItem(
 
		(pass == 1) ?
 
			STR_NEWS_ROAD_VEHICLE_CRASH_DRIVER : STR_NEWS_ROAD_VEHICLE_CRASH,
 
		NT_ACCIDENT,
 
		v->index
 
	);
 
	StringID newsitem = (pass == 1) ? STR_NEWS_ROAD_VEHICLE_CRASH_DRIVER : STR_NEWS_ROAD_VEHICLE_CRASH;
 
	AddTileNewsItem(newsitem, NT_ACCIDENT, v->tile);
 

	
 
	ModifyStationRatingAround(v->tile, v->owner, -160, 22);
 
	if (_settings_client.sound.disaster) SndPlayVehicleFx(SND_12_EXPLOSION, v);
 
}
 

	
 
static bool RoadVehCheckTrainCrash(RoadVehicle *v)
src/train_cmd.cpp
Show inline comments
 
@@ -3049,13 +3049,13 @@ static bool CheckTrainCollision(Train *v
 
	}
 

	
 
	/* any dead -> no crash */
 
	if (tcc.num == 0) return false;
 

	
 
	SetDParam(0, tcc.num);
 
	AddVehicleNewsItem(STR_NEWS_TRAIN_CRASH, NT_ACCIDENT, v->index);
 
	AddTileNewsItem(STR_NEWS_TRAIN_CRASH, NT_ACCIDENT, v->tile);
 

	
 
	ModifyStationRatingAround(v->tile, v->owner, -160, 30);
 
	if (_settings_client.sound.disaster) SndPlayVehicleFx(SND_13_BIG_CRASH, v);
 
	return true;
 
}
 

	
src/water_cmd.cpp
Show inline comments
 
@@ -974,13 +974,13 @@ static void FloodVehicle(Vehicle *v)
 
{
 
	uint pass = v->Crash(true);
 

	
 
	AI::NewEvent(v->owner, new ScriptEventVehicleCrashed(v->index, v->tile, ScriptEventVehicleCrashed::CRASH_FLOODED));
 
	Game::NewEvent(new ScriptEventVehicleCrashed(v->index, v->tile, ScriptEventVehicleCrashed::CRASH_FLOODED));
 
	SetDParam(0, pass);
 
	AddVehicleNewsItem(STR_NEWS_DISASTER_FLOOD_VEHICLE, NT_ACCIDENT, v->index);
 
	AddTileNewsItem(STR_NEWS_DISASTER_FLOOD_VEHICLE, NT_ACCIDENT, v->tile);
 
	CreateEffectVehicleRel(v, 4, 4, 8, EV_EXPLOSION_LARGE);
 
	if (_settings_client.sound.disaster) SndPlayVehicleFx(SND_12_EXPLOSION, v);
 
}
 

	
 
/**
 
 * Flood a vehicle if we are allowed to flood it, i.e. when it is on the ground.
0 comments (0 inline, 0 general)