(svn r677) -newgrf: Fix some custom electric trains appearing in maglev depots (pasky).
This commit is contained in:
		
							
								
								
									
										20
									
								
								ai.c
									
									
									
									
									
								
							
							
						
						
									
										20
									
								
								ai.c
									
									
									
									
									
								
							| @@ -113,25 +113,19 @@ static void AiStateVehLoop(Player *p) | ||||
| 	p->ai.state_counter = 0; | ||||
| } | ||||
|  | ||||
| // XXX | ||||
| static const byte _rail_locos_count[3] = { | ||||
| 	27, 3, 5 | ||||
| }; | ||||
| extern const byte _rail_engines_start[3]; | ||||
|  | ||||
| static int AiChooseTrainToBuild(byte railtype, int32 money, byte flag) | ||||
| { | ||||
| 	int best_veh_index = -1; | ||||
| 	byte best_veh_score = 0; | ||||
| 	int32 r; | ||||
| 	int i; | ||||
|  | ||||
| 	int i = _rail_engines_start[railtype]; | ||||
| 	int end = i + _rail_locos_count[railtype]; | ||||
| 	Engine *e = &_engines[i]; | ||||
| 	do { | ||||
| 		assert(!(_rail_vehicle_info[i].flags & RVI_WAGON)); | ||||
| 	for (i = 0; i < NUM_TRAIN_ENGINES; i++) { | ||||
| 		RailVehicleInfo *rvi = &rail_vehinfo(i); | ||||
| 		Engine *e = DEREF_ENGINE(i); | ||||
|  | ||||
| 		if (!HASBIT(e->player_avail, _current_player) || e->reliability < 0x8A3D) | ||||
| 		if (e->railtype != railtype || rvi->flags & RVI_WAGON | ||||
| 		    || !HASBIT(e->player_avail, _current_player) || e->reliability < 0x8A3D) | ||||
| 			continue; | ||||
|  | ||||
| 		r = DoCommandByTile(0, i, 0, 0, CMD_BUILD_RAIL_VEHICLE); | ||||
| @@ -142,7 +136,7 @@ static int AiChooseTrainToBuild(byte railtype, int32 money, byte flag) | ||||
| 			best_veh_score = _cmd_build_rail_veh_score; | ||||
| 			best_veh_index = i; | ||||
| 		} | ||||
| 	} while (++e, ++i != end); | ||||
| 	} | ||||
|  | ||||
| 	return best_veh_index; | ||||
| } | ||||
|   | ||||
							
								
								
									
										18
									
								
								engine_gui.c
									
									
									
									
									
								
							
							
						
						
									
										18
									
								
								engine_gui.c
									
									
									
									
									
								
							| @@ -15,14 +15,16 @@ void DrawShipEngineInfo(int engine, int x, int y, int maxw); | ||||
|  | ||||
| StringID GetEngineCategoryName(byte engine) | ||||
| { | ||||
| 	if (engine < NUM_NORMAL_RAIL_ENGINES) | ||||
| 		return STR_8102_RAILROAD_LOCOMOTIVE; | ||||
|  | ||||
| 	if (engine < NUM_NORMAL_RAIL_ENGINES + NUM_MONORAIL_ENGINES) | ||||
| 		return STR_8106_MONORAIL_LOCOMOTIVE; | ||||
|  | ||||
| 	if (engine < NUM_TRAIN_ENGINES) | ||||
| 		return STR_8107_MAGLEV_LOCOMOTIVE; | ||||
| 	if (engine < NUM_TRAIN_ENGINES) { | ||||
| 		switch (_engines[engine].railtype) { | ||||
| 			case 0: | ||||
| 				return STR_8102_RAILROAD_LOCOMOTIVE; | ||||
| 			case 1: | ||||
| 				return STR_8106_MONORAIL_LOCOMOTIVE; | ||||
| 			case 2: | ||||
| 				return STR_8107_MAGLEV_LOCOMOTIVE; | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	if (engine < NUM_TRAIN_ENGINES + NUM_ROAD_ENGINES) | ||||
| 		return STR_8103_ROAD_VEHICLE; | ||||
|   | ||||
							
								
								
									
										69
									
								
								train_gui.c
									
									
									
									
									
								
							
							
						
						
									
										69
									
								
								train_gui.c
									
									
									
									
									
								
							| @@ -14,23 +14,6 @@ | ||||
|  | ||||
| int _traininfo_vehicle_pitch = 0; | ||||
|  | ||||
| static Engine * const _rail_engines[3] = { | ||||
| 	&_engines[0], | ||||
| 	&_engines[NUM_NORMAL_RAIL_ENGINES], | ||||
| 	&_engines[NUM_MONORAIL_ENGINES + NUM_NORMAL_RAIL_ENGINES], | ||||
| }; | ||||
|  | ||||
| const byte _rail_engines_count[3] = { | ||||
| 	NUM_NORMAL_RAIL_ENGINES, | ||||
| 	NUM_MONORAIL_ENGINES, | ||||
| 	NUM_MAGLEV_ENGINES, | ||||
| }; | ||||
|  | ||||
| const byte _rail_engines_start[3] = { | ||||
| 	0, | ||||
| 	NUM_NORMAL_RAIL_ENGINES, | ||||
| 	NUM_MONORAIL_ENGINES + NUM_NORMAL_RAIL_ENGINES, | ||||
| }; | ||||
|  | ||||
| static void CcBuildWagon(bool success, uint tile, uint32 p1, uint32 p2) | ||||
| { | ||||
| @@ -85,12 +68,15 @@ static void NewRailVehicleWndProc(Window *w, WindowEvent *e) | ||||
|  | ||||
| 		{ | ||||
| 			int count = 0; | ||||
| 			int num = _rail_engines_count[WP(w,buildtrain_d).railtype]; | ||||
| 			Engine *e = _rail_engines[WP(w,buildtrain_d).railtype]; | ||||
| 			do { | ||||
| 				if (HASBIT(e->player_avail, _local_player)) | ||||
| 			byte railtype = WP(w,buildtrain_d).railtype; | ||||
| 			int i; | ||||
|  | ||||
| 			for (i = 0; i < NUM_TRAIN_ENGINES; i++) { | ||||
| 				Engine *e = &_engines[i]; | ||||
| 				if (e->railtype == railtype | ||||
| 				    && HASBIT(e->player_avail, _local_player)) | ||||
| 					count++; | ||||
| 			} while (++e,--num); | ||||
| 			} | ||||
| 			SetVScrollCount(w, count); | ||||
| 		} | ||||
|  | ||||
| @@ -98,26 +84,37 @@ static void NewRailVehicleWndProc(Window *w, WindowEvent *e) | ||||
| 		DrawWindowWidgets(w); | ||||
|  | ||||
| 		{ | ||||
| 			int num = _rail_engines_count[WP(w,buildtrain_d).railtype]; | ||||
| 			Engine *e = _rail_engines[WP(w,buildtrain_d).railtype]; | ||||
| 			byte railtype = WP(w,buildtrain_d).railtype; | ||||
| 			int sel = WP(w,buildtrain_d).sel_index; | ||||
| 			int pos = w->vscroll.pos; | ||||
| 			int x = 1; | ||||
| 			int y = 15; | ||||
| 			int engine_id = _rail_engines_start[WP(w,buildtrain_d).railtype]; | ||||
| 			int selected_id = -1; | ||||
| 			int i; | ||||
|  | ||||
| 			do { | ||||
| 				if (HASBIT(e->player_avail, _local_player)) { | ||||
| 					if (sel==0) selected_id = engine_id; | ||||
| 					if (IS_INT_INSIDE(--pos, -8, 0)) { | ||||
| 						DrawString(x+59, y+2, GetCustomEngineName(engine_id), sel==0 ? 0xC : 0x10); | ||||
| 						DrawTrainEngine(x+29, y+6+_traininfo_vehicle_pitch, engine_id, SPRITE_PALETTE(PLAYER_SPRITE_COLOR(_local_player))); | ||||
| 						y += 14; | ||||
| 					} | ||||
| 					sel--; | ||||
| 				} | ||||
| 			} while (++engine_id, ++e,--num); | ||||
| 			/* Ensure that custom engines which substituted wagons | ||||
| 			 * are sorted correctly. */ | ||||
| #define engine_drawing_loop(cmp_) \ | ||||
| 			for (i = 0; i < NUM_TRAIN_ENGINES; i++) { \ | ||||
| 				Engine *e = DEREF_ENGINE(i); \ | ||||
| 				RailVehicleInfo *rvi = &rail_vehinfo(i); \ | ||||
|  \ | ||||
|  				if (e->railtype != railtype || (rvi->flags & RVI_WAGON) cmp_ 0 \ | ||||
| 				    || !HASBIT(e->player_avail, _local_player)) \ | ||||
| 					continue; \ | ||||
|  \ | ||||
| 				if (sel == 0) selected_id = i; \ | ||||
| 				if (IS_INT_INSIDE(--pos, -8, 0)) { \ | ||||
| 					DrawString(x+59, y+2, GetCustomEngineName(i), sel == 0 ? 0xC : 0x10); \ | ||||
| 					DrawTrainEngine(x+29, y+6+_traininfo_vehicle_pitch, i, \ | ||||
| 					                SPRITE_PALETTE(PLAYER_SPRITE_COLOR(_local_player))); \ | ||||
| 					y += 14; \ | ||||
| 				} \ | ||||
| 				sel--; \ | ||||
| 			} | ||||
|  | ||||
| 			engine_drawing_loop(!=); // True engines | ||||
| 			engine_drawing_loop(==); // Feeble wagons | ||||
|  | ||||
| 			WP(w,buildtrain_d).sel_engine = selected_id; | ||||
|  | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 darkvater
					darkvater