@@ -43,13 +43,13 @@ static inline void AddIndustryNewsItem(S
AddNewsItem(string, subtype, NR_INDUSTRY, industry);
}
void NewsLoop();
void InitNewsItemStructs();
extern NewsItem _statusbar_news_item;
extern const NewsItem *_statusbar_news_item;
extern bool _news_ticker_sound;
extern NewsTypeData _news_type_data[];
/**
* Delete a news item type about a vehicle
@@ -31,28 +31,28 @@
#include "company_manager_face.h"
#include "company_func.h"
#include "engine_gui.h"
#include "table/strings.h"
NewsItem _statusbar_news_item;
const NewsItem *_statusbar_news_item = NULL;
bool _news_ticker_sound; ///< Make a ticker sound when a news item is published.
static uint MIN_NEWS_AMOUNT = 30; ///< prefered minimum amount of news messages
static uint _total_news = 0; ///< current number of news items
static NewsItem *_oldest_news = NULL; ///< head of news items queue
static NewsItem *_latest_news = NULL; ///< tail of news items queue
/** Forced news item.
* Users can force an item by accessing the history or "last message".
* If the message being shown was forced by the user, a pointer is stored
* in _forced_news. Otherwise, \a _forced_news variable is NULL. */
static NewsItem *_forced_news = NULL; ///< item the user has asked for
static const NewsItem *_forced_news = NULL; ///< item the user has asked for
/** Current news item (last item shown regularly). */
static NewsItem *_current_news = NULL;
static const NewsItem *_current_news = NULL;
* Get the position a news-reference is referencing.
* @param reftype The type of reference.
* @param ref The reference.
@@ -278,16 +278,16 @@ NewsTypeData _news_type_data[] = {
assert_compile(lengthof(_news_type_data) == NT_END);
/** Window class displaying a news item. */
struct NewsWindow : Window {
uint16 chat_height; ///< Height of the chat window.
uint16 status_height; ///< Height of the status bar window
NewsItem *ni; ///< News item to display.
const NewsItem *ni; ///< News item to display.
static uint duration; ///< Remaining time for showing current news message (may only be accessed while a news item is displayed).
NewsWindow(const WindowDesc *desc, NewsItem *ni) : Window(), ni(ni)
NewsWindow(const WindowDesc *desc, const NewsItem *ni) : Window(), ni(ni)
{
NewsWindow::duration = 555;
const Window *w = FindWindowByClass(WC_SEND_NETWORK_MSG);
this->chat_height = (w != NULL) ? w->height : 0;
this->status_height = FindWindowById(WC_STATUS_BAR, 0)->height;
@@ -558,26 +558,26 @@ private:
};
/* static */ uint NewsWindow::duration = 0; // Instance creation.
/** Open up an own newspaper window for the news item */
static void ShowNewspaper(NewsItem *ni)
static void ShowNewspaper(const NewsItem *ni)
SoundFx sound = _news_type_data[_news_subtype_data[ni->subtype].type].sound;
if (sound != 0) SndPlayFx(sound);
new NewsWindow(_news_subtype_data[ni->subtype].desc, ni);
/** Show news item in the ticker */
static void ShowTicker(const NewsItem *ni)
if (_news_ticker_sound) SndPlayFx(SND_16_MORSE);
_statusbar_news_item = *ni;
_statusbar_news_item = ni;
InvalidateWindowData(WC_STATUS_BAR, 0, SBI_SHOW_TICKER);
/** Initialize the news-items data structures */
void InitNewsItemStructs()
@@ -589,22 +589,23 @@ void InitNewsItemStructs()
_total_news = 0;
_oldest_news = NULL;
_latest_news = NULL;
_forced_news = NULL;
_current_news = NULL;
_statusbar_news_item = NULL;
NewsWindow::duration = 0;
* Are we ready to show another news item?
* Only if nothing is in the newsticker and no newspaper is displayed
*/
static bool ReadyForNextItem()
NewsItem *ni = _forced_news == NULL ? _current_news : _forced_news;
const NewsItem *ni = _forced_news == NULL ? _current_news : _forced_news;
if (ni == NULL) return true;
/* Ticker message
* Check if the status bar message is still being displayed? */
if (IsNewsTickerShown()) return false;
@@ -618,17 +619,18 @@ static bool ReadyForNextItem()
/** Move to the next news item */
static void MoveToNextItem()
InvalidateWindowData(WC_STATUS_BAR, 0, SBI_NEWS_DELETED); // invalidate the statusbar
DeleteWindowById(WC_NEWS_WINDOW, 0); // close the newspapers window if shown
/* if we're not at the last item, then move on */
if (_current_news != _latest_news) {
_current_news = (_current_news == NULL) ? _oldest_news : _current_news->next;
NewsItem *ni = _current_news;
const NewsItem *ni = _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[type].age > ni->date) return;
switch (_news_type_data[type].display) {
@@ -829,13 +831,13 @@ void NewsLoop()
if (ReadyForNextItem()) MoveToNextItem();
/** Do a forced show of a specific message */
static void ShowNewsMessage(NewsItem *ni)
static void ShowNewsMessage(const NewsItem *ni)
assert(_total_news != 0);
/* Delete the news window */
DeleteWindowById(WC_NEWS_WINDOW, 0);
@@ -158,15 +158,15 @@ struct StatusBarWindow : Window {
if (this->saving) { // true when saving is active
DrawString(r.left + WD_FRAMERECT_LEFT, r.right - WD_FRAMERECT_RIGHT, r.top + WD_FRAMERECT_TOP, STR_STATUSBAR_SAVING_GAME, TC_FROMSTRING, SA_CENTER);
} else if (_do_autosave) {
DrawString(r.left + WD_FRAMERECT_LEFT, r.right - WD_FRAMERECT_RIGHT, r.top + WD_FRAMERECT_TOP, STR_STATUSBAR_AUTOSAVE, TC_FROMSTRING, SA_CENTER);
} else if (_pause_mode != PM_UNPAUSED) {
DrawString(r.left + WD_FRAMERECT_LEFT, r.right - WD_FRAMERECT_RIGHT, r.top + WD_FRAMERECT_TOP, STR_STATUSBAR_PAUSED, TC_FROMSTRING, SA_CENTER);
} else if (this->ticker_scroll < TICKER_STOP && FindWindowById(WC_NEWS_WINDOW, 0) == NULL && _statusbar_news_item.string_id != 0) {
} else if (this->ticker_scroll < TICKER_STOP && FindWindowById(WC_NEWS_WINDOW, 0) == NULL && _statusbar_news_item != NULL && _statusbar_news_item->string_id != 0) {
/* Draw the scrolling news text */
if (!DrawScrollingStatusText(&_statusbar_news_item, this->ticker_scroll, r.left + WD_FRAMERECT_LEFT, r.right - WD_FRAMERECT_RIGHT, r.top + WD_FRAMERECT_TOP, r.bottom)) {
if (!DrawScrollingStatusText(_statusbar_news_item, this->ticker_scroll, r.left + WD_FRAMERECT_LEFT, r.right - WD_FRAMERECT_RIGHT, r.top + WD_FRAMERECT_TOP, r.bottom)) {
InvalidateWindowData(WC_STATUS_BAR, 0, SBI_NEWS_DELETED);
if (Company::IsValidID(_local_company)) {
/* This is the default text */
SetDParam(0, _local_company);
DrawString(r.left + WD_FRAMERECT_LEFT, r.right - WD_FRAMERECT_RIGHT, r.top + WD_FRAMERECT_TOP, STR_STATUSBAR_COMPANY_NAME, TC_FROMSTRING, SA_CENTER);
Status change: