(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
--- a/aircraft_cmd.c Sun Jan 23 21:42:29 2005 +0000
+++ b/aircraft_cmd.c Sun Jan 23 22:01:51 2005 +0000
@@ -269,6 +269,8 @@
InvalidateWindow(WC_COMPANY, v->owner);
}
+ InvalidateWindow(WC_REPLACE_VEHICLE, VEH_Aircraft); //updates the replace Aircraft window
+
return value;
}
@@ -322,6 +324,8 @@
}
+ InvalidateWindow(WC_REPLACE_VEHICLE, VEH_Aircraft); // updates the replace Aircraft window
+
return -(int32)v->value;
}
--- a/roadveh_cmd.c Sun Jan 23 21:42:29 2005 +0000
+++ b/roadveh_cmd.c Sun Jan 23 22:01:51 2005 +0000
@@ -188,6 +188,8 @@
InvalidateWindow(WC_COMPANY, v->owner);
}
+ InvalidateWindow(WC_REPLACE_VEHICLE, VEH_Road); // updates the replace Road window
+
return cost;
}
@@ -234,6 +236,7 @@
DeleteWindowById(WC_VEHICLE_VIEW, v->index);
DeleteVehicle(v);
}
+ InvalidateWindow(WC_REPLACE_VEHICLE, VEH_Road); // updates the replace Road window
return -(int32)v->value;
}
--- a/ship_cmd.c Sun Jan 23 21:42:29 2005 +0000
+++ b/ship_cmd.c Sun Jan 23 22:01:51 2005 +0000
@@ -877,6 +877,7 @@
RebuildVehicleLists();
InvalidateWindow(WC_COMPANY, v->owner);
}
+ InvalidateWindow(WC_REPLACE_VEHICLE, VEH_Ship); // updates the replace Ship window
return value;
}
@@ -903,6 +904,8 @@
DeleteVehicle(v);
}
+ InvalidateWindow(WC_REPLACE_VEHICLE, VEH_Ship); // updates the replace Ship window
+
return -(int32)v->value;
}
--- a/train_cmd.c Sun Jan 23 21:42:29 2005 +0000
+++ b/train_cmd.c Sun Jan 23 22:01:51 2005 +0000
@@ -486,6 +486,9 @@
}
_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 @@
}
if (last) cost -= last->value;
}
+ InvalidateWindow(WC_REPLACE_VEHICLE, VEH_Train); // updates the replace Train window
return cost;
}
@@ -2399,8 +2403,10 @@
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)
--- a/variables.h Sun Jan 23 21:42:29 2005 +0000
+++ b/variables.h Sun Jan 23 22:01:51 2005 +0000
@@ -431,7 +431,8 @@
#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;
--- a/vehicle.c Sun Jan 23 21:42:29 2005 +0000
+++ b/vehicle.c Sun Jan 23 22:01:51 2005 +0000
@@ -1449,6 +1449,7 @@
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 @@
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 @@
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 @@
// 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 @@
// 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 @@
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);
--- a/vehicle_gui.c Sun Jan 23 21:42:29 2005 +0000
+++ b/vehicle_gui.c Sun Jan 23 22:01:51 2005 +0000
@@ -324,6 +324,8 @@
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 @@
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 @@
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;
- }
+ }
case VEH_Road: {
int num = NUM_ROAD_ENGINES;
Engine *e = DEREF_ENGINE(ROAD_ENGINES_INDEX);
@@ -396,7 +404,7 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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[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[1]--;
- }
- sel[0]--;
}
} while (++engine_id, ++e,--num);
}
@@ -658,6 +672,27 @@
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];