(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.
authordominik
Sun, 19 Dec 2004 09:39:19 +0000
changeset 715 83805642c830
parent 714 e3b9eda8dc45
child 716 40a349345f82
(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.
news.h
news_gui.c
train_cmd.c
--- a/news.h	Sun Dec 19 09:33:02 2004 +0000
+++ b/news.h	Sun Dec 19 09:39:19 2004 +0000
@@ -14,20 +14,26 @@
 	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,
--- a/news_gui.c	Sun Dec 19 09:33:02 2004 +0000
+++ b/news_gui.c	Sun Dec 19 09:39:19 2004 +0000
@@ -210,7 +210,6 @@
 	return i;
 }
 
-
 void AddNewsItem(StringID string, uint32 flags, uint data_a, uint data_b)
 {
 	NewsItem *ni;
@@ -257,6 +256,14 @@
 	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 @@
 		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);
--- a/train_cmd.c	Sun Dec 19 09:33:02 2004 +0000
+++ b/train_cmd.c	Sun Dec 19 09:39:19 2004 +0000
@@ -2546,6 +2546,16 @@
 
 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 @@
 			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);
 			}
 		}
 	}