(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.
authorbjarni
Sun, 23 Jan 2005 22:01:51 +0000
changeset 1128 d3ffc98b92ad
parent 1127 b7eaa0592b30
child 1129 3a1571cf4818
(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
roadveh_cmd.c
ship_cmd.c
train_cmd.c
variables.h
vehicle.c
vehicle_gui.c
--- 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];