mirror of
https://github.com/OpenTTD/OpenTTD.git
synced 2025-03-05 22:04:57 +00:00
(svn r1167) Feature: Added the possibility to add validation functions to NewsItems. This is now done for "Train in depot" messages. Before displaying such a message, it checks if the train really still is in the depot. Can be applied to other news items as well.
This commit is contained in:
parent
cf89cb12cd
commit
bb5dca016d
12
news.h
12
news.h
@ -14,20 +14,26 @@ struct NewsItem {
|
||||
TileIndex data_b;
|
||||
|
||||
uint32 params[10];
|
||||
|
||||
/* The validation functions for news items get called immediately
|
||||
* before the news are supposed to be shown. If this funcion returns
|
||||
* false, the news item won't be displayed. */
|
||||
bool (*isValid) ( uint data_a, uint data_b );
|
||||
};
|
||||
|
||||
typedef bool ValidationProc ( uint data_a, uint data_b );
|
||||
typedef void DrawNewsCallbackProc(Window *w);
|
||||
typedef StringID GetNewsStringCallbackProc(NewsItem *ni);
|
||||
|
||||
#define NEWS_FLAGS(mode,flag,type,cb) ((cb)<<24 | (type)<<16 | (flag)<<8 | (mode))
|
||||
void AddNewsItem(StringID string, uint32 flags, uint data_a, uint data_b);
|
||||
void AddValidatedNewsItem(StringID string, uint32 flags, uint data_a, uint data_b, ValidationProc *validation);
|
||||
void NewsLoop(void);
|
||||
void DrawNewsBorder(const Window *w);
|
||||
void InitNewsItemStructs(void);
|
||||
|
||||
VARDEF NewsItem _statusbar_news_item;
|
||||
|
||||
typedef void DrawNewsCallbackProc(Window *w);
|
||||
typedef StringID GetNewsStringCallbackProc(NewsItem *ni);
|
||||
|
||||
enum {
|
||||
NT_ARRIVAL_PLAYER = 0,
|
||||
NT_ARRIVAL_OTHER = 1,
|
||||
|
13
news_gui.c
13
news_gui.c
@ -210,7 +210,6 @@ byte increaseIndex(byte i)
|
||||
return i;
|
||||
}
|
||||
|
||||
|
||||
void AddNewsItem(StringID string, uint32 flags, uint data_a, uint data_b)
|
||||
{
|
||||
NewsItem *ni;
|
||||
@ -257,6 +256,14 @@ void AddNewsItem(StringID string, uint32 flags, uint data_a, uint data_b)
|
||||
w->vscroll.count = _total_news;
|
||||
}
|
||||
|
||||
/* To add a news item with an attached validation function. This validation function
|
||||
* makes sure that the news item is not outdated when the newspaper pops up. */
|
||||
void AddValidatedNewsItem(StringID string, uint32 flags, uint data_a, uint data_b, ValidationProc validation)
|
||||
{
|
||||
AddNewsItem(string, flags, data_a, data_b);
|
||||
_news_items[_latest_news].isValid = validation;
|
||||
}
|
||||
|
||||
// don't show item if it's older than x days
|
||||
static const byte _news_items_age[] = {60, 60, 90, 60, 90, 30, 150, 30, 90, 180};
|
||||
|
||||
@ -421,6 +428,10 @@ static void MoveToNexItem(void)
|
||||
if (_date - _news_items_age[ni->type] > ni->date)
|
||||
return;
|
||||
|
||||
// execute the validation function to see if this item is still valid
|
||||
if ( ni->isValid != NULL && !ni->isValid(ni->data_a, ni->data_b) )
|
||||
return;
|
||||
|
||||
// show newspaper or send to ticker?
|
||||
if (!HASBIT(_news_display_opt, ni->type) && !(ni->flags & NF_FORCE_BIG))
|
||||
ShowTicker(ni);
|
||||
|
15
train_cmd.c
15
train_cmd.c
@ -2546,6 +2546,16 @@ void Train_Tick(Vehicle *v)
|
||||
|
||||
static const byte _depot_track_ind[4] = {0,1,0,1};
|
||||
|
||||
// Validation for the news item "Train is waiting in depot"
|
||||
bool ValidateTrainInDepot( uint data_a, uint data_b )
|
||||
{
|
||||
Vehicle *v = &_vehicles[data_a];
|
||||
if (v->u.rail.track == 0x80 && (v->vehstatus | VS_STOPPED))
|
||||
return true;
|
||||
else
|
||||
return false;
|
||||
}
|
||||
|
||||
void TrainEnterDepot(Vehicle *v, uint tile)
|
||||
{
|
||||
SetSignalsOnBothDir(tile, _depot_track_ind[_map5[tile]&3]);
|
||||
@ -2580,11 +2590,12 @@ void TrainEnterDepot(Vehicle *v, uint tile)
|
||||
v->vehstatus |= VS_STOPPED;
|
||||
if (v->owner == _local_player) {
|
||||
SetDParam(0, v->unitnumber);
|
||||
AddNewsItem(
|
||||
AddValidatedNewsItem(
|
||||
STR_8814_TRAIN_IS_WAITING_IN_DEPOT,
|
||||
NEWS_FLAGS(NM_SMALL, NF_VIEWPORT|NF_VEHICLE, NT_ADVICE, 0),
|
||||
v->index,
|
||||
0);
|
||||
0,
|
||||
ValidateTrainInDepot);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user