From 6510b12203b0770d111055e5112e9a824d0f7dc7 Mon Sep 17 00:00:00 2001 From: bjarni Date: Sun, 23 Jan 2005 22:01:51 +0000 Subject: [PATCH] (svn r1629) added a counter to tell how many engines you have of each type to the autoreplace vehicle windows and made them show only the vehicles you actually have in the left list. this also fixes some window updates issues when autoreplacing --- aircraft_cmd.c | 4 ++ roadveh_cmd.c | 3 ++ ship_cmd.c | 3 ++ train_cmd.c | 8 +++- variables.h | 3 +- vehicle.c | 8 +++- vehicle_gui.c | 119 ++++++++++++++++++++++++++++++++----------------- 7 files changed, 103 insertions(+), 45 deletions(-) diff --git a/aircraft_cmd.c b/aircraft_cmd.c index 0724c81f80..e82eca1799 100644 --- a/aircraft_cmd.c +++ b/aircraft_cmd.c @@ -269,6 +269,8 @@ int32 CmdBuildAircraft(int x, int y, uint32 flags, uint32 p1, uint32 p2) InvalidateWindow(WC_COMPANY, v->owner); } + InvalidateWindow(WC_REPLACE_VEHICLE, VEH_Aircraft); //updates the replace Aircraft window + return value; } @@ -322,6 +324,8 @@ int32 CmdSellAircraft(int x, int y, uint32 flags, uint32 p1, uint32 p2) } + InvalidateWindow(WC_REPLACE_VEHICLE, VEH_Aircraft); // updates the replace Aircraft window + return -(int32)v->value; } diff --git a/roadveh_cmd.c b/roadveh_cmd.c index b8879b2b2d..97429a1afa 100644 --- a/roadveh_cmd.c +++ b/roadveh_cmd.c @@ -188,6 +188,8 @@ int32 CmdBuildRoadVeh(int x, int y, uint32 flags, uint32 p1, uint32 p2) InvalidateWindow(WC_COMPANY, v->owner); } + InvalidateWindow(WC_REPLACE_VEHICLE, VEH_Road); // updates the replace Road window + return cost; } @@ -234,6 +236,7 @@ int32 CmdSellRoadVeh(int x, int y, uint32 flags, uint32 p1, uint32 p2) DeleteWindowById(WC_VEHICLE_VIEW, v->index); DeleteVehicle(v); } + InvalidateWindow(WC_REPLACE_VEHICLE, VEH_Road); // updates the replace Road window return -(int32)v->value; } diff --git a/ship_cmd.c b/ship_cmd.c index c4787b17d8..b56d201f89 100644 --- a/ship_cmd.c +++ b/ship_cmd.c @@ -877,6 +877,7 @@ int32 CmdBuildShip(int x, int y, uint32 flags, uint32 p1, uint32 p2) RebuildVehicleLists(); InvalidateWindow(WC_COMPANY, v->owner); } + InvalidateWindow(WC_REPLACE_VEHICLE, VEH_Ship); // updates the replace Ship window return value; } @@ -903,6 +904,8 @@ int32 CmdSellShip(int x, int y, uint32 flags, uint32 p1, uint32 p2) DeleteVehicle(v); } + InvalidateWindow(WC_REPLACE_VEHICLE, VEH_Ship); // updates the replace Ship window + return -(int32)v->value; } diff --git a/train_cmd.c b/train_cmd.c index debea41c8d..c871764d1e 100644 --- a/train_cmd.c +++ b/train_cmd.c @@ -486,6 +486,9 @@ int32 CmdBuildRailVehicle(int x, int y, uint32 flags, uint32 p1, uint32 p2) } _cmd_build_rail_veh_var1 = _railveh_unk1[p1]; _cmd_build_rail_veh_score = _railveh_score[p1]; + + InvalidateWindow(WC_REPLACE_VEHICLE, VEH_Train); // updates the replace Train window + return value; } @@ -847,6 +850,7 @@ int32 CmdSellRailWagon(int x, int y, uint32 flags, uint32 p1, uint32 p2) } if (last) cost -= last->value; } + InvalidateWindow(WC_REPLACE_VEHICLE, VEH_Train); // updates the replace Train window return cost; } @@ -2399,8 +2403,10 @@ static void HandleCrashedTrain(Vehicle *v) ChangeTrainDirRandomly(v); } - if (state >= 4440 && !(v->tick_counter&0x1F)) + if (state >= 4440 && !(v->tick_counter&0x1F)) { DeleteLastWagon(v); + InvalidateWindow(WC_REPLACE_VEHICLE, VEH_Train); + } } static void HandleBrokenTrain(Vehicle *v) diff --git a/variables.h b/variables.h index 2043269f5a..5442f186a4 100644 --- a/variables.h +++ b/variables.h @@ -431,7 +431,8 @@ VARDEF byte _vehicle_design_names; #define MAX_BRIDGES 13 /* Autoreplace vehicle stuff*/ -VARDEF byte _autoreplace_array[255]; +VARDEF byte _autoreplace_array[256]; +VARDEF uint16 _player_num_engines[256]; /* Debugging levels */ VARDEF int _debug_spritecache_level; diff --git a/vehicle.c b/vehicle.c index 912357e7f8..5f1992e514 100644 --- a/vehicle.c +++ b/vehicle.c @@ -1449,6 +1449,7 @@ int32 CmdReplaceVehicle(int x, int y, uint32 flags, uint32 p1, uint32 p2) byte capacity = rvi->capacity; Vehicle *first = GetFirstVehicleInChain(v); + //if (v->owner == _local_player) InvalidateWindowClasses(WC_TRAINS_LIST); /* rvi->image_index is the new sprite for the engine. Adding +1 makes the engine head the other way if it is a multiheaded engine (rear engine) (rvi->flags & RVI_MULTIHEAD && sprite - rvi2->image_index) is true if the engine is heading the other way, otherwise 0*/ @@ -1507,7 +1508,7 @@ int32 CmdReplaceVehicle(int x, int y, uint32 flags, uint32 p1, uint32 p2) veh->u.rail.first_engine = new_engine_type; } while ( (veh=veh->next) != NULL ); } - + InvalidateWindowClasses(WC_TRAINS_LIST); break; } case VEH_Road: @@ -1518,6 +1519,7 @@ int32 CmdReplaceVehicle(int x, int y, uint32 flags, uint32 p1, uint32 p2) v->cargo_type = rvi->cargo_type; v->cargo_cap = rvi->capacity; v->max_speed = rvi->max_speed; + InvalidateWindowClasses(WC_ROADVEH_LIST); break; } case VEH_Ship: @@ -1533,6 +1535,7 @@ int32 CmdReplaceVehicle(int x, int y, uint32 flags, uint32 p1, uint32 p2) // since we do not stop it for autorefitting if (v->cargo_type != cargo_type) CmdRefitShip(v->x_pos, v->y_pos, DC_EXEC, v->index , cargo_type + 0x0100 ); + InvalidateWindowClasses(WC_SHIPS_LIST); break; } case VEH_Aircraft: @@ -1553,6 +1556,7 @@ int32 CmdReplaceVehicle(int x, int y, uint32 flags, uint32 p1, uint32 p2) // since we do not stop it for autorefitting CmdRefitAircraft(v->x_pos, v->y_pos, DC_EXEC, v->index , cargo_type + 0x0100 ); } + InvalidateWindowClasses(WC_AIRCRAFT_LIST); break; } default: return CMD_ERROR; @@ -1565,6 +1569,8 @@ int32 CmdReplaceVehicle(int x, int y, uint32 flags, uint32 p1, uint32 p2) v->cargo_count = v->cargo_cap; } } + InvalidateWindow(WC_REPLACE_VEHICLE, v->type); + ResortVehicleLists(); } //needs to be down here because refitting will change SET_EXPENSES_TYPE if called SET_EXPENSES_TYPE(EXPENSES_NEW_VEHICLES); diff --git a/vehicle_gui.c b/vehicle_gui.c index 93cc6c1117..475492604c 100644 --- a/vehicle_gui.c +++ b/vehicle_gui.c @@ -324,6 +324,8 @@ static void train_engine_drawing_loop(int *x, int *y, int *pos, int *sel, int *s const RailVehicleInfo *rvi = RailVehInfo(i); const EngineInfo *info = &_engine_info[i]; + if ( _player_num_engines[i] == 0 && show_outdated ) continue; + if ( rvi->power == 0 && !(show_cars) ) // disables display of cars (works since they do not have power) continue; @@ -346,6 +348,10 @@ static void train_engine_drawing_loop(int *x, int *y, int *pos, int *sel, int *s colour); DrawTrainEngine(*x + 29, *y + 6, i, SPRITE_PALETTE(PLAYER_SPRITE_COLOR(_local_player))); + if ( show_outdated ) { + SetDParam(0, _player_num_engines[i]); + DrawStringRightAligned(213, *y+5, STR_TINY_BLACK, 0); + } *y += 14; } --*sel; @@ -374,19 +380,21 @@ static void SetupScrollStuffForReplaceWindow(Window *w) const Engine *e = DEREF_ENGINE(engine_id); const EngineInfo *info = &_engine_info[engine_id]; - if (ENGINE_AVAILABLE && RailVehInfo(engine_id)->power && e->railtype == railtype) { + if (ENGINE_AVAILABLE && RailVehInfo(engine_id)->power && e->railtype == railtype ) { count++; - if (sel[0]==0) selected_id[0] = engine_id; - sel[0]--; + if ( _player_num_engines[engine_id] ) { + if (sel[0]==0) selected_id[0] = engine_id; + sel[0]--; + } if (HASBIT(e->player_avail, _local_player)) { if (sel[1]==0) selected_id[1] = engine_id; - count2++; - sel[1]--; - } + count2++; + sel[1]--; } } - break; } + break; + } case VEH_Road: { int num = NUM_ROAD_ENGINES; Engine *e = DEREF_ENGINE(ROAD_ENGINES_INDEX); @@ -396,7 +404,7 @@ static void SetupScrollStuffForReplaceWindow(Window *w) do { info = &_engine_info[engine_id]; - if (ENGINE_AVAILABLE) { + if (_player_num_engines[engine_id] ) { if (sel[0]==0) selected_id[0] = engine_id; count++; sel[0]--; @@ -429,7 +437,7 @@ static void SetupScrollStuffForReplaceWindow(Window *w) do { info = &_engine_info[engine_id]; - if (ENGINE_AVAILABLE) { + if (_player_num_engines[engine_id] ) { if ( sel[0] == 0 ) selected_id[0] = engine_id; count++; sel[0]--; @@ -465,7 +473,7 @@ static void SetupScrollStuffForReplaceWindow(Window *w) do { info = &_engine_info[engine_id]; - if (ENGINE_AVAILABLE) { + if (_player_num_engines[engine_id]) { count++; if (sel[0]==0) selected_id[0] = engine_id; sel[0]--; @@ -543,23 +551,25 @@ static void DrawEngineArrayInReplaceWindow(Window *w, int x, int y, int x2, int do { info = &_engine_info[engine_id]; - if (ENGINE_AVAILABLE) { + if (_player_num_engines[engine_id]) { if (IS_INT_INSIDE(--pos, -w->vscroll.cap, 0)) { DrawString(x+59, y+2, GetCustomEngineName(engine_id), sel[0]==0 ? 0xC : 0x10); DrawRoadVehEngine(x+29, y+6, engine_id, SPRITE_PALETTE(PLAYER_SPRITE_COLOR(_local_player))); + SetDParam(0, _player_num_engines[engine_id]); + DrawStringRightAligned(213, y+5, STR_TINY_BLACK, 0); y += 14; } - - if ( RoadVehInfo(engine_id)->cargo_type == cargo && HASBIT(e->player_avail, _local_player) ) { - if (IS_INT_INSIDE(--pos2, -w->vscroll.cap, 0) && RoadVehInfo(engine_id)->cargo_type == cargo) { - DrawString(x2+59, y2+2, GetCustomEngineName(engine_id), sel[1]==0 ? 0xC : 0x10); - DrawRoadVehEngine(x2+29, y2+6, engine_id, SPRITE_PALETTE(PLAYER_SPRITE_COLOR(_local_player))); - y2 += 14; - } - sel[1]--; - } sel[0]--; } + + if ( RoadVehInfo(engine_id)->cargo_type == cargo && HASBIT(e->player_avail, _local_player) ) { + if (IS_INT_INSIDE(--pos2, -w->vscroll.cap, 0) && RoadVehInfo(engine_id)->cargo_type == cargo) { + DrawString(x2+59, y2+2, GetCustomEngineName(engine_id), sel[1]==0 ? 0xC : 0x10); + DrawRoadVehEngine(x2+29, y2+6, engine_id, SPRITE_PALETTE(PLAYER_SPRITE_COLOR(_local_player))); + y2 += 14; + } + sel[1]--; + } } while (++engine_id, ++e,--num); } break; @@ -578,24 +588,26 @@ static void DrawEngineArrayInReplaceWindow(Window *w, int x, int y, int x2, int do { info = &_engine_info[engine_id]; - if (ENGINE_AVAILABLE) { + if (_player_num_engines[engine_id]) { if (IS_INT_INSIDE(--pos, -w->vscroll.cap, 0)) { DrawString(x+75, y+7, GetCustomEngineName(engine_id), sel[0]==0 ? 0xC : 0x10); DrawShipEngine(x+35, y+10, engine_id, SPRITE_PALETTE(PLAYER_SPRITE_COLOR(_local_player))); + SetDParam(0, _player_num_engines[engine_id]); + DrawStringRightAligned(213, y+15, STR_TINY_BLACK, 0); y += 24; } - if ( selected_id[0] != -1 ) { - if (HASBIT(e->player_avail, _local_player) && ( cargo == ShipVehInfo(engine_id)->cargo_type || refittable & ShipVehInfo(engine_id)->refittable)) { - if (IS_INT_INSIDE(--pos2, -w->vscroll.cap, 0)) { - DrawString(x2+75, y2+7, GetCustomEngineName(engine_id), sel[1]==0 ? 0xC : 0x10); - DrawShipEngine(x2+35, y2+10, engine_id, SPRITE_PALETTE(PLAYER_SPRITE_COLOR(_local_player))); - y2 += 24; - } - sel[1]--; - } - } sel[0]--; } + if ( selected_id[0] != -1 ) { + if (HASBIT(e->player_avail, _local_player) && ( cargo == ShipVehInfo(engine_id)->cargo_type || refittable & ShipVehInfo(engine_id)->refittable)) { + if (IS_INT_INSIDE(--pos2, -w->vscroll.cap, 0)) { + DrawString(x2+75, y2+7, GetCustomEngineName(engine_id), sel[1]==0 ? 0xC : 0x10); + DrawShipEngine(x2+35, y2+10, engine_id, SPRITE_PALETTE(PLAYER_SPRITE_COLOR(_local_player))); + y2 += 24; + } + sel[1]--; + } + } } while (++engine_id, ++e,--num); } break; @@ -611,24 +623,26 @@ static void DrawEngineArrayInReplaceWindow(Window *w, int x, int y, int x2, int do { info = &_engine_info[engine_id]; - if (ENGINE_AVAILABLE) { + if (_player_num_engines[engine_id]) { if (sel[0]==0) selected_id[0] = engine_id; if (IS_INT_INSIDE(--pos, -w->vscroll.cap, 0)) { DrawString(x+62, y+7, GetCustomEngineName(engine_id), sel[0]==0 ? 0xC : 0x10); DrawAircraftEngine(x+29, y+10, engine_id, SPRITE_PALETTE(PLAYER_SPRITE_COLOR(_local_player))); + SetDParam(0, _player_num_engines[engine_id]); + DrawStringRightAligned(213, y+15, STR_TINY_BLACK, 0); y += 24; } - if ( ((subtype && AircraftVehInfo(engine_id)->subtype) || (!(subtype) && !AircraftVehInfo(engine_id)->subtype)) - && HASBIT(e->player_avail, _local_player) ) { - if (sel[1]==0) selected_id[1] = engine_id; - if (IS_INT_INSIDE(--pos2, -w->vscroll.cap, 0)) { - DrawString(x2+62, y2+7, GetCustomEngineName(engine_id), sel[1]==0 ? 0xC : 0x10); - DrawAircraftEngine(x2+29, y2+10, engine_id, SPRITE_PALETTE(PLAYER_SPRITE_COLOR(_local_player))); - y2 += 24; - } - sel[1]--; + sel[0]--; + } + if ( ((subtype && AircraftVehInfo(engine_id)->subtype) || (!(subtype) && !AircraftVehInfo(engine_id)->subtype)) + && HASBIT(e->player_avail, _local_player) ) { + if (sel[1]==0) selected_id[1] = engine_id; + if (IS_INT_INSIDE(--pos2, -w->vscroll.cap, 0)) { + DrawString(x2+62, y2+7, GetCustomEngineName(engine_id), sel[1]==0 ? 0xC : 0x10); + DrawAircraftEngine(x2+29, y2+10, engine_id, SPRITE_PALETTE(PLAYER_SPRITE_COLOR(_local_player))); + y2 += 24; } - sel[0]--; + sel[1]--; } } while (++engine_id, ++e,--num); } @@ -658,6 +672,27 @@ static void ReplaceVehicleWndProc(Window *w, WindowEvent *e) sel[0] = WP(w,replaceveh_d).sel_index[0]; sel[1] = WP(w,replaceveh_d).sel_index[1]; + { + uint i; + const Vehicle *vehicle; + + for (i = 0; i < lengthof(_player_num_engines); i++) { + _player_num_engines[i] = 0; + } + FOR_ALL_VEHICLES(vehicle) { + if ( vehicle->owner == _local_player ) { + if (vehicle->type == VEH_Aircraft && vehicle->subtype > 2) continue; + + // do not count the vehicles, that contains only 0 in all var + if (vehicle->engine_type == 0 && vehicle->spritenum == 0 ) continue; + + if (vehicle->type != DEREF_ENGINE(vehicle->engine_type)->type) continue; + + _player_num_engines[vehicle->engine_type]++; + } + } + } + SetupScrollStuffForReplaceWindow(w); selected_id[0] = WP(w,replaceveh_d).sel_engine[0];