news_gui.c
changeset 5244 e110f52333e8
parent 5108 dc67d70b5a45
child 5245 5f1a514e8bfe
equal deleted inserted replaced
5243:a564347a939b 5244:e110f52333e8
   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);