summaryrefslogtreecommitdiff
path: root/roadveh_gui.c
diff options
context:
space:
mode:
authordarkvater <darkvater@openttd.org>2004-09-14 14:19:53 +0000
committerdarkvater <darkvater@openttd.org>2004-09-14 14:19:53 +0000
commitc79e8ad626acbc9b8d6dd3fdc4fa40e100f2167e (patch)
tree7df8b49dd0e2fa59e7cd1963b5fdb40849630535 /roadveh_gui.c
parent5e699ca65d58722d0e0daebdfc61fbc8913b56bc (diff)
downloadopenttd-c79e8ad626acbc9b8d6dd3fdc4fa40e100f2167e.tar.xz
(svn r244) -Fix: Stations were not sorted for non-player-0 players
-Fix: Correctly resorting vehicle list of player when the list of another player is open.
Diffstat (limited to 'roadveh_gui.c')
-rw-r--r--roadveh_gui.c61
1 files changed, 36 insertions, 25 deletions
diff --git a/roadveh_gui.c b/roadveh_gui.c
index 3ac65a3e3..7451746b5 100644
--- a/roadveh_gui.c
+++ b/roadveh_gui.c
@@ -707,36 +707,41 @@ void ShowRoadDepotWindow(uint tile)
static SortStruct _road_sort[NUM_NORMAL_VEHICLES];
static uint16 _num_road_sort[MAX_PLAYERS];
-static void MakeSortedRoadList(byte owner)
+static void GlobalSortRoadVehList()
{
- SortStruct *firstelement;
- Vehicle *v;
- uint32 n = 0;
+ const Vehicle *v;
uint16 *i;
+ uint32 n = 0;
- if (_vehicle_sort_dirty[VEHROAD]) { // only resort the whole array if vehicles have been added/removed
- // reset to 0 just to be sure
- for (i = _num_road_sort; i != endof(_num_road_sort); i++) {*i = 0;}
+ // reset #-of roadvehicles to 0 because ++ is used for value-assignment
+ for (i = _num_road_sort; i != endof(_num_road_sort); i++) {*i = 0;}
- FOR_ALL_VEHICLES(v) {
- if(v->type == VEH_Road) {
- _road_sort[n].index = v->index;
- _road_sort[n++].owner = v->owner;
- _num_road_sort[v->owner]++; // add number of roads of player
- }
+ FOR_ALL_VEHICLES(v) {
+ if(v->type == VEH_Road) {
+ _road_sort[n].index = v->index;
+ _road_sort[n++].owner = v->owner;
+ _num_road_sort[v->owner]++; // add number of roadvehicless of player
}
+ }
- // create cumulative road-ownage
- // roads are stored as a cummulative index, eg 25, 41, 43. This means
- // Player0: 25; Player1: (41-25) 16; Player2: (43-41) 2
- for (i = &_num_road_sort[1]; i != endof(_num_road_sort); i++) {*i += *(i-1);}
+ // create cumulative roadvehicle-ownership
+ // roads are stored as a cummulative index, eg 25, 41, 43. This means
+ // Player0: 25; Player1: (41-25) 16; Player2: (43-41) 2
+ for (i = &_num_road_sort[1]; i != endof(_num_road_sort); i++) {*i += *(i-1);}
- // sort by owner, then only subsort the requested owner-vehicles
- qsort(_road_sort, n, sizeof(_road_sort[0]), GeneralOwnerSorter);
+ qsort(_road_sort, n, sizeof(_road_sort[0]), GeneralOwnerSorter); // sort by owner
- _last_vehicle_idx = 0; // used for "cache" in namesorting
- _vehicle_sort_dirty[VEHROAD] = false;
- }
+ // since indexes are messed up after adding/removing a station, mark all lists dirty
+ memset(_road_sort_dirty, true, sizeof(_road_sort_dirty));
+ _vehicle_sort_dirty[VEHROAD] = false;
+
+ DEBUG(misc, 1) ("Resorting global roadvehicles list...");
+}
+
+static void MakeSortedRoadVehList(byte owner)
+{
+ SortStruct *firstelement;
+ uint32 n = 0;
if (owner == 0) { // first element starts at 0th element and has n elements as described above
firstelement = &_road_sort[0];
@@ -748,8 +753,11 @@ static void MakeSortedRoadList(byte owner)
_internal_sort_order = _road_sort_order[owner];
_internal_name_sorter_id = STR_SV_ROADVEH_NAME;
+ _last_vehicle_idx = 0; // used for "cache" in namesorting
qsort(firstelement, n, sizeof(_road_sort[0]), _vehicle_sorter[_road_sort_type[owner]]);
+ _road_sort_dirty[owner] = false;
+
DEBUG(misc, 1) ("Resorting Roadvehicles list player %d...", owner+1);
}
@@ -763,9 +771,12 @@ static void PlayerRoadVehWndProc(Window *w, WindowEvent *e)
if (_road_sort_type[window_number] == SORT_BY_UNSORTED) // disable 'Sort By' tooltip on Unsorted sorting criteria
w->disabled_state |= (1 << 2);
- if (_road_sort_dirty[window_number] || _vehicle_sort_dirty[VEHROAD]) {
- _road_sort_dirty[window_number] = false;
- MakeSortedRoadList(window_number);
+ // resort roadvehicles window if roadvehicles have been added/removed
+ if (_vehicle_sort_dirty[VEHROAD])
+ GlobalSortRoadVehList();
+
+ if (_road_sort_dirty[window_number]) {
+ MakeSortedRoadVehList(window_number);
/* reset sorting timeout */
w->custom[0] = DAY_TICKS;
w->custom[1] = PERIODIC_RESORT_DAYS;