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,22 +551,24 @@ 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; } + 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]--; + 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[0]--; + sel[1]--; } } while (++engine_id, ++e,--num); } @@ -578,23 +588,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+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]--; } - sel[0]--; } } while (++engine_id, ++e,--num); } @@ -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];