equal
deleted
inserted
replaced
251 * @see NewsCallback */ |
251 * @see NewsCallback */ |
252 void AddNewsItem(StringID string, uint32 flags, uint data_a, uint data_b) |
252 void AddNewsItem(StringID string, uint32 flags, uint data_a, uint data_b) |
253 { |
253 { |
254 NewsItem *ni; |
254 NewsItem *ni; |
255 Window *w; |
255 Window *w; |
|
256 byte l_news; |
256 |
257 |
257 if (_game_mode == GM_MENU) return; |
258 if (_game_mode == GM_MENU) return; |
258 |
259 |
259 // check the rare case that the oldest (to be overwritten) news item is open |
260 // check the rare case that the oldest (to be overwritten) news item is open |
260 if (_total_news==MAX_NEWS && (_oldest_news == _current_news || _oldest_news == _forced_news)) |
261 if (_total_news==MAX_NEWS && (_oldest_news == _current_news || _oldest_news == _forced_news)) |
262 |
263 |
263 _forced_news = INVALID_NEWS; |
264 _forced_news = INVALID_NEWS; |
264 if (_total_news < MAX_NEWS) _total_news++; |
265 if (_total_news < MAX_NEWS) _total_news++; |
265 |
266 |
266 // make sure our pointer isn't overflowing |
267 // make sure our pointer isn't overflowing |
|
268 l_news = _latest_news; |
267 _latest_news = increaseIndex(_latest_news); |
269 _latest_news = increaseIndex(_latest_news); |
268 |
270 |
269 // overwrite oldest news entry |
271 /* If the fifo-buffer is full, overwrite the oldest entry */ |
270 if (_oldest_news == _latest_news && _news_items[_oldest_news].string_id != 0) |
272 if (l_news != INVALID_NEWS && _latest_news == _oldest_news) |
271 _oldest_news = increaseIndex(_oldest_news); // but make sure we're not overflowing here |
273 _oldest_news = increaseIndex(_oldest_news); // but make sure we're not overflowing here |
272 |
274 |
273 // add news to _latest_news |
275 // add news to _latest_news |
274 ni = &_news_items[_latest_news]; |
276 ni = &_news_items[_latest_news]; |
275 memset(ni, 0, sizeof(*ni)); |
277 memset(ni, 0, sizeof(*ni)); |
887 if (_current_news == n) MoveToNexItem(); |
889 if (_current_news == n) MoveToNexItem(); |
888 |
890 |
889 // If this is the last news item, invalidate _latest_news |
891 // If this is the last news item, invalidate _latest_news |
890 if (_latest_news == _oldest_news) _latest_news = INVALID_NEWS; |
892 if (_latest_news == _oldest_news) _latest_news = INVALID_NEWS; |
891 |
893 |
892 for (i = n; i != _oldest_news; i = (i + MAX_NEWS - 1) % MAX_NEWS) { |
894 if (n != _oldest_news) { |
893 _news_items[i] = _news_items[(i + MAX_NEWS - 1) % MAX_NEWS]; |
895 for (i = n; i != _oldest_news; i = (i + MAX_NEWS - 1) % MAX_NEWS) { |
894 } |
896 _news_items[i] = _news_items[(i + MAX_NEWS - 1) % MAX_NEWS]; |
895 _oldest_news = (_oldest_news + 1) % MAX_NEWS; |
897 } |
|
898 _oldest_news = increaseIndex(_oldest_news); |
|
899 } |
896 _total_news--; |
900 _total_news--; |
897 |
901 |
898 w = FindWindowById(WC_MESSAGE_HISTORY, 0); |
902 w = FindWindowById(WC_MESSAGE_HISTORY, 0); |
899 if (w != NULL) { |
903 if (w != NULL) { |
900 SetWindowDirty(w); |
904 SetWindowDirty(w); |