summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDarkvater <darkvater@openttd.org>2006-12-05 22:35:25 +0000
committerDarkvater <darkvater@openttd.org>2006-12-05 22:35:25 +0000
commita9ea304121f708f816f09f1dc77828592ca90e6c (patch)
treeaa9a87723349ca68c07a7e02ca1cd01acc148714
parent0a0368014d9b662661f0da7c25146010c0ea488f (diff)
downloadopenttd-a9ea304121f708f816f09f1dc77828592ca90e6c.tar.xz
(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)
-rw-r--r--news_gui.c30
1 files changed, 26 insertions, 4 deletions
diff --git a/news_gui.c b/news_gui.c
index de8a431e2..f6a10748c 100644
--- a/news_gui.c
+++ b/news_gui.c
@@ -29,6 +29,12 @@
* [O------------F-------------C---------L ]
* |
* 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
@@ -870,7 +876,7 @@ void DeleteVehicleNews(VehicleID vid, StringID news)
{
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];
if (ni->flags & NF_VEHICLE &&
@@ -879,18 +885,32 @@ void DeleteVehicleNews(VehicleID vid, StringID news)
Window *w;
if (_forced_news == n || _current_news == n) MoveToNextItem();
+ _total_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;
for (i = n; i != _oldest_news; i = decreaseIndex(i)) {
_news_items[i] = _news_items[decreaseIndex(i)];
}
+
+ if (_current_news == _oldest_news) _current_news = increaseIndex(_current_news);
_oldest_news = increaseIndex(_oldest_news);
}
- _total_news--;
w = FindWindowById(WC_MESSAGE_HISTORY, 0);
if (w != NULL) {
@@ -898,5 +918,7 @@ void DeleteVehicleNews(VehicleID vid, StringID news)
w->vscroll.count = _total_news;
}
}
+
+ if (n == _latest_news) break;
}
}