File diff r9233:d476a00a8077 → r9234:c3f7730d9a9b
src/news_gui.cpp
Show inline comments
 
@@ -83,6 +83,41 @@ static DrawNewsCallbackProc * const _dra
 
	DrawNewsBankrupcy,        ///< DNC_BANKRUPCY
 
};
 

	
 
/**
 
 * Data common to all news items of a given subtype (structure)
 
 */
 
struct NewsSubtypeData {
 
	NewsType type;         ///< News category @see NewsType
 
	NewsMode display_mode; ///< Display mode value @see NewsMode
 
	NewsFlag flags;        ///< Initial NewsFlags bits @see NewsFlag
 
	NewsCallback callback; ///< Call-back function
 
};
 

	
 
/**
 
 * Data common to all news items of a given subtype (actual data)
 
 */
 
static const struct NewsSubtypeData _news_subtype_data[NS_END] = {
 
	/* type,             display_mode, flags,                  callback */
 
	{ NT_ARRIVAL_PLAYER,  NM_THIN,     NF_VIEWPORT|NF_VEHICLE, DNC_NONE         }, ///< NS_ARRIVAL_PLAYER
 
	{ NT_ARRIVAL_OTHER,   NM_THIN,     NF_VIEWPORT|NF_VEHICLE, DNC_NONE         }, ///< NS_ARRIVAL_OTHER
 
	{ NT_ACCIDENT,        NM_THIN,     NF_VIEWPORT|NF_TILE,    DNC_NONE         }, ///< NS_ACCIDENT_TILE
 
	{ NT_ACCIDENT,        NM_THIN,     NF_VIEWPORT|NF_VEHICLE, DNC_NONE         }, ///< NS_ACCIDENT_VEHICLE
 
	{ NT_COMPANY_INFO,    NM_CALLBACK, NF_NONE,                DNC_BANKRUPCY    }, ///< NS_COMPANY_TROUBLE
 
	{ NT_COMPANY_INFO,    NM_CALLBACK, NF_NONE,                DNC_BANKRUPCY    }, ///< NS_COMPANY_MERGER
 
	{ NT_COMPANY_INFO,    NM_CALLBACK, NF_NONE,                DNC_BANKRUPCY    }, ///< NS_COMPANY_BANKRUPT
 
	{ NT_COMPANY_INFO,    NM_CALLBACK, NF_TILE,                DNC_BANKRUPCY    }, ///< NS_COMPANY_NEW
 
	{ NT_OPENCLOSE,       NM_THIN,     NF_VIEWPORT|NF_TILE,    DNC_NONE         }, ///< NS_OPENCLOSE
 
	{ NT_ECONOMY,         NM_NORMAL,   NF_NONE,                DNC_NONE         }, ///< NS_ECONOMY
 
	{ NT_INDUSTRY_PLAYER, NM_THIN,     NF_VIEWPORT|NF_TILE,    DNC_NONE         }, ///< NS_INDUSTRY_PLAYER
 
	{ NT_INDUSTRY_OTHER,  NM_THIN,     NF_VIEWPORT|NF_TILE,    DNC_NONE         }, ///< NS_INDUSTRY_OTHER
 
	{ NT_INDUSTRY_NOBODY, NM_THIN,     NF_VIEWPORT|NF_TILE,    DNC_NONE         }, ///< NS_INDUSTRY_NOBODY
 
	{ NT_ADVICE,          NM_SMALL,    NF_VIEWPORT|NF_VEHICLE, DNC_NONE         }, ///< NS_ADVICE
 
	{ NT_NEW_VEHICLES,    NM_CALLBACK, NF_NONE,                DNC_VEHICLEAVAIL }, ///< NS_NEW_VEHICLES
 
	{ NT_ACCEPTANCE,      NM_SMALL,    NF_VIEWPORT|NF_TILE,    DNC_NONE         }, ///< NS_ACCEPTANCE
 
	{ NT_SUBSIDIES,       NM_NORMAL,   NF_TILE|NF_TILE2,       DNC_NONE         }, ///< NS_SUBSIDIES
 
	{ NT_GENERAL,         NM_NORMAL,   NF_TILE,                DNC_NONE         }, ///< NS_GENERAL
 
};
 

	
 
/** Initialize the news-items data structures */
 
void InitNewsItemStructs()
 
{
 
@@ -124,8 +159,9 @@ static void NewsWindowProc(Window *w, Wi
 

	
 
		case WE_PAINT: {
 
			const NewsItem *ni = WP(w, news_d).ni;
 
			const NewsMode display_mode = _news_subtype_data[ni->subtype].display_mode;
 

	
 
			switch (ni->display_mode) {
 
			switch (display_mode) {
 
				case NM_NORMAL:
 
				case NM_THIN: {
 
					DrawNewsBorder(w);
 
@@ -137,7 +173,7 @@ static void NewsWindowProc(Window *w, Wi
 

	
 
					if (!(ni->flags & NF_VIEWPORT)) {
 
						CopyInDParam(0, ni->params, lengthof(ni->params));
 
						DrawStringMultiCenter(215, ni->display_mode == NM_NORMAL ? 76 : 56,
 
						DrawStringMultiCenter(215, display_mode == NM_NORMAL ? 76 : 56,
 
							ni->string_id, w->width - 4);
 
					} else {
 
						/* Back up transparency options to draw news view */
 
@@ -160,7 +196,7 @@ static void NewsWindowProc(Window *w, Wi
 
				}
 

	
 
				case NM_CALLBACK:
 
					_draw_news_callback[ni->callback](w, ni);
 
					_draw_news_callback[_news_subtype_data[ni->subtype].callback](w, ni);
 
					break;
 

	
 
				default:
 
@@ -283,7 +319,7 @@ static inline NewsID DecreaseIndex(NewsI
 
 * @see NewsType
 
 * @see NewsCallback
 
 */
 
void AddNewsItem(StringID string, NewsMode display_mode, NewsFlag flags, NewsType type, NewsCallback callback, uint data_a, uint data_b)
 
void AddNewsItem(StringID string, NewsSubtype subtype, uint data_a, uint data_b)
 
{
 
	if (_game_mode == GM_MENU) return;
 

	
 
@@ -314,14 +350,12 @@ void AddNewsItem(StringID string, NewsMo
 
	memset(ni, 0, sizeof(*ni));
 

	
 
	ni->string_id = string;
 
	ni->display_mode = display_mode;
 
	ni->flags = flags;
 
	ni->subtype = subtype;
 
	ni->flags = _news_subtype_data[subtype].flags;
 

	
 
	/* show this news message in color? */
 
	if (_cur_year >= _patches.colored_news_year) ni->flags |= NF_INCOLOR;
 

	
 
	ni->type = type;
 
	ni->callback = callback;
 
	ni->data_a = data_a;
 
	ni->data_b = data_b;
 
	ni->date = _date;
 
@@ -407,12 +441,12 @@ static void ShowNewspaper(NewsItem *ni)
 
	ni->flags &= ~NF_FORCE_BIG;
 
	ni->duration = 555;
 

	
 
	SoundFx sound = _news_type_data[ni->type].sound;
 
	SoundFx sound = _news_type_data[_news_subtype_data[ni->subtype].type].sound;
 
	if (sound != 0) SndPlayFx(sound);
 

	
 
	int top = _screen.height;
 
	Window *w;
 
	switch (ni->display_mode) {
 
	switch (_news_subtype_data[ni->subtype].display_mode) {
 
		case NM_NORMAL:
 
		case NM_CALLBACK:
 
			_news_type13_desc.top = top;
 
@@ -493,11 +527,12 @@ static void MoveToNextItem()
 
	if (_current_news != _latest_news) {
 
		_current_news = (_current_news == INVALID_NEWS) ? _oldest_news : IncreaseIndex(_current_news);
 
		NewsItem *ni = &_news_items[_current_news];
 
		const NewsType type = _news_subtype_data[ni->subtype].type;
 

	
 
		/* check the date, don't show too old items */
 
		if (_date - _news_type_data[ni->type].age > ni->date) return;
 
		if (_date - _news_type_data[type].age > ni->date) return;
 

	
 
		switch (_news_type_data[ni->type].display) {
 
		switch (_news_type_data[type].display) {
 
			default: NOT_REACHED();
 
			case ND_OFF: { // Off - show nothing only a small reminder in the status bar
 
				Window *w = FindWindowById(WC_STATUS_BAR, 0);