summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--aircraft_cmd.c4
-rw-r--r--roadveh_cmd.c3
-rw-r--r--ship_cmd.c3
-rw-r--r--train_cmd.c8
-rw-r--r--variables.h3
-rw-r--r--vehicle.c8
-rw-r--r--vehicle_gui.c115
7 files changed, 101 insertions, 43 deletions
diff --git a/aircraft_cmd.c b/aircraft_cmd.c
index 0724c81f8..e82eca179 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 b8879b2b2..97429a1af 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 c4787b17d..b56d201f8 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 debea41c8..c871764d1 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 2043269f5..5442f186a 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 912357e7f..5f1992e51 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 93cc6c111..475492604 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];