mirror of https://github.com/OpenTTD/OpenTTD
(svn r7384) -Fix: No vehicle was removed in DeleteVehicleNews when the fifo-array was full. Update the
bound conditions of the loop, add an assert and also update _current_news when needed. (r3757)release/0.5
parent
0a0368014d
commit
a9ea304121
30
news_gui.c
30
news_gui.c
|
@ -29,6 +29,12 @@
|
||||||
* [O------------F-------------C---------L ]
|
* [O------------F-------------C---------L ]
|
||||||
* |
|
* |
|
||||||
* forced
|
* forced
|
||||||
|
*
|
||||||
|
* Of course by using an array we can have situations like
|
||||||
|
*
|
||||||
|
* [----L O-----F---------C-----------------]
|
||||||
|
* This is where we have wrapped around the array and have
|
||||||
|
* (MAX_NEWS - O) + L news items
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#define MAX_NEWS 30
|
#define MAX_NEWS 30
|
||||||
|
@ -870,7 +876,7 @@ void DeleteVehicleNews(VehicleID vid, StringID news)
|
||||||
{
|
{
|
||||||
NewsID n;
|
NewsID n;
|
||||||
|
|
||||||
for (n = _oldest_news; _latest_news != INVALID_NEWS && n != increaseIndex(_latest_news); n = increaseIndex(n)) {
|
for (n = _oldest_news; _latest_news != INVALID_NEWS; n = increaseIndex(n)) {
|
||||||
const NewsItem *ni = &_news_items[n];
|
const NewsItem *ni = &_news_items[n];
|
||||||
|
|
||||||
if (ni->flags & NF_VEHICLE &&
|
if (ni->flags & NF_VEHICLE &&
|
||||||
|
@ -879,18 +885,32 @@ void DeleteVehicleNews(VehicleID vid, StringID news)
|
||||||
Window *w;
|
Window *w;
|
||||||
|
|
||||||
if (_forced_news == n || _current_news == n) MoveToNextItem();
|
if (_forced_news == n || _current_news == n) MoveToNextItem();
|
||||||
|
_total_news--;
|
||||||
|
|
||||||
// If this is the last news item, invalidate _latest_news
|
// If this is the last news item, invalidate _latest_news
|
||||||
if (_latest_news == _oldest_news) _latest_news = INVALID_NEWS;
|
if (_latest_news == _oldest_news) {
|
||||||
|
assert(_total_news == 0);
|
||||||
|
_latest_news = INVALID_NEWS;
|
||||||
|
}
|
||||||
|
|
||||||
if (n != _oldest_news) {
|
/* Since we only imitate a FIFO removing an arbitrary element does need
|
||||||
|
* some magic. Remove the item by shifting head towards the tail. eg
|
||||||
|
* oldest remove last
|
||||||
|
* | | |
|
||||||
|
* [------O--------n-----L--]
|
||||||
|
* will become (change dramatized to make clear)
|
||||||
|
* [---------O-----------L--]
|
||||||
|
* Also update the current news item in case it was pointing to the
|
||||||
|
* oldest, now shifted item */
|
||||||
|
if (_total_news != 0) {
|
||||||
NewsID i;
|
NewsID i;
|
||||||
for (i = n; i != _oldest_news; i = decreaseIndex(i)) {
|
for (i = n; i != _oldest_news; i = decreaseIndex(i)) {
|
||||||
_news_items[i] = _news_items[decreaseIndex(i)];
|
_news_items[i] = _news_items[decreaseIndex(i)];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (_current_news == _oldest_news) _current_news = increaseIndex(_current_news);
|
||||||
_oldest_news = increaseIndex(_oldest_news);
|
_oldest_news = increaseIndex(_oldest_news);
|
||||||
}
|
}
|
||||||
_total_news--;
|
|
||||||
|
|
||||||
w = FindWindowById(WC_MESSAGE_HISTORY, 0);
|
w = FindWindowById(WC_MESSAGE_HISTORY, 0);
|
||||||
if (w != NULL) {
|
if (w != NULL) {
|
||||||
|
@ -898,5 +918,7 @@ void DeleteVehicleNews(VehicleID vid, StringID news)
|
||||||
w->vscroll.count = _total_news;
|
w->vscroll.count = _total_news;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (n == _latest_news) break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue