Changeset - r17237:0fc8ed4aa201
[Not reviewed]
master
0 6 0
frosch - 13 years ago 2011-02-05 20:41:13
frosch@openttd.org
(svn r21987) -Fix: Make news items, engine previews and AI preview events deal with no longer existing Engine items after resetting the pool.
6 files changed with 41 insertions and 0 deletions:
0 comments (0 inline, 0 general)
src/ai/api/ai_event_types.cpp
Show inline comments
 
@@ -19,8 +19,15 @@
 
#include "../../articulated_vehicles.h"
 
#include "table/strings.h"
 

	
 
bool AIEventEnginePreview::IsEngineValid() const
 
{
 
	const Engine *e = ::Engine::GetIfValid(this->engine);
 
	return e != NULL && e->IsEnabled();
 
}
 

	
 
char *AIEventEnginePreview::GetName()
 
{
 
	if (!this->IsEngineValid()) return NULL;
 
	static const int len = 64;
 
	char *engine_name = MallocT<char>(len);
 

	
 
@@ -31,6 +38,7 @@ char *AIEventEnginePreview::GetName()
 

	
 
CargoID AIEventEnginePreview::GetCargoType()
 
{
 
	if (!this->IsEngineValid()) return CT_INVALID;
 
	CargoArray cap = ::GetCapacityOfArticulatedParts(this->engine);
 

	
 
	CargoID most_cargo = CT_INVALID;
 
@@ -47,6 +55,7 @@ CargoID AIEventEnginePreview::GetCargoTy
 

	
 
int32 AIEventEnginePreview::GetCapacity()
 
{
 
	if (!this->IsEngineValid()) return -1;
 
	const Engine *e = ::Engine::Get(this->engine);
 
	switch (e->type) {
 
		case VEH_ROAD:
 
@@ -69,6 +78,7 @@ int32 AIEventEnginePreview::GetCapacity(
 

	
 
int32 AIEventEnginePreview::GetMaxSpeed()
 
{
 
	if (!this->IsEngineValid()) return -1;
 
	const Engine *e = ::Engine::Get(this->engine);
 
	int32 max_speed = e->GetDisplayMaxSpeed(); // km-ish/h
 
	if (e->type == VEH_AIRCRAFT) max_speed /= _settings_game.vehicle.plane_speed;
 
@@ -77,16 +87,19 @@ int32 AIEventEnginePreview::GetMaxSpeed(
 

	
 
Money AIEventEnginePreview::GetPrice()
 
{
 
	if (!this->IsEngineValid()) return -1;
 
	return ::Engine::Get(this->engine)->GetCost();
 
}
 

	
 
Money AIEventEnginePreview::GetRunningCost()
 
{
 
	if (!this->IsEngineValid()) return -1;
 
	return ::Engine::Get(this->engine)->GetRunningCost();
 
}
 

	
 
int32 AIEventEnginePreview::GetVehicleType()
 
{
 
	if (!this->IsEngineValid()) return AIVehicle::VT_INVALID;
 
	switch (::Engine::Get(this->engine)->type) {
 
		case VEH_ROAD:     return AIVehicle::VT_ROAD;
 
		case VEH_TRAIN:    return AIVehicle::VT_RAIL;
 
@@ -98,6 +111,7 @@ int32 AIEventEnginePreview::GetVehicleTy
 

	
 
bool AIEventEnginePreview::AcceptPreview()
 
{
 
	if (!this->IsEngineValid()) return false;
 
	return AIObject::DoCommand(0, this->engine, 0, CMD_WANT_ENGINE_PREVIEW);
 
}
 

	
src/ai/api/ai_event_types.hpp
Show inline comments
 
@@ -296,6 +296,7 @@ public:
 

	
 
private:
 
	EngineID engine;
 
	bool IsEngineValid() const;
 
};
 

	
 
/**
src/engine.cpp
Show inline comments
 
@@ -499,6 +499,7 @@ void SetCachedEngineCounts()
 

	
 
void SetupEngines()
 
{
 
	DeleteWindowByClass(WC_ENGINE_PREVIEW);
 
	_engine_pool.CleanPool();
 

	
 
	assert(_engine_mngr.Length() >= _engine_mngr.NUM_DEFAULT_ENGINES);
 
@@ -859,6 +860,9 @@ void EnginesMonthlyLoop()
 
				CalcEngineReliability(e);
 
			}
 

	
 
			/* Do not introduce invalid engines */
 
			if (!e->IsEnabled()) continue;
 

	
 
			if (!(e->flags & ENGINE_AVAILABLE) && _date >= (e->intro_date + DAYS_IN_YEAR)) {
 
				/* Introduce it to all companies */
 
				NewVehicleAvailable(e);
src/news_func.h
Show inline comments
 
@@ -51,6 +51,7 @@ extern bool _news_ticker_sound;
 

	
 
extern NewsTypeData _news_type_data[];
 

	
 
void DeleteInvalidEngineNews();
 
void DeleteVehicleNews(VehicleID vid, StringID news);
 
void DeleteStationNews(StationID sid);
 
void DeleteIndustryNews(IndustryID iid);
src/news_gui.cpp
Show inline comments
 
@@ -28,6 +28,7 @@
 
#include "statusbar_gui.h"
 
#include "company_manager_face.h"
 
#include "company_func.h"
 
#include "engine_base.h"
 
#include "engine_gui.h"
 
#include "core/geometry_func.hpp"
 

	
 
@@ -809,6 +810,23 @@ void DeleteIndustryNews(IndustryID iid)
 
	}
 
}
 

	
 
/**
 
 * Remove engine announcements for invalid engines.
 
 */
 
void DeleteInvalidEngineNews()
 
{
 
	NewsItem *ni = _oldest_news;
 

	
 
	while (ni != NULL) {
 
		NewsItem *next = ni->next;
 
		if ((ni->reftype1 == NR_ENGINE && (!Engine::IsValidID(ni->ref1) || !Engine::Get(ni->ref1)->IsEnabled())) ||
 
				(ni->reftype2 == NR_ENGINE && (!Engine::IsValidID(ni->ref2) || !Engine::Get(ni->ref2)->IsEnabled()))) {
 
			DeleteNewsItem(ni);
 
		}
 
		ni = next;
 
	}
 
}
 

	
 
static void RemoveOldNewsItems()
 
{
 
	NewsItem *next;
src/saveload/afterload.cpp
Show inline comments
 
@@ -51,6 +51,7 @@
 
#include "../rail_gui.h"
 
#include "../core/backup_type.hpp"
 
#include "../smallmap_gui.h"
 
#include "../news_func.h"
 

	
 
#include "table/strings.h"
 

	
 
@@ -2604,6 +2605,8 @@ void ReloadNewGRFData()
 
	AfterLoadStations();
 
	/* Check and update house and town values */
 
	UpdateHousesAndTowns();
 
	/* Delete news referring to no longer existing entities */
 
	DeleteInvalidEngineNews();
 
	/* Update livery selection windows */
 
	for (CompanyID i = COMPANY_FIRST; i < MAX_COMPANIES; i++) InvalidateWindowData(WC_COMPANY_COLOUR, i);
 
	/* redraw the whole screen */
0 comments (0 inline, 0 general)