diff options
-rw-r--r-- | ai.c | 20 | ||||
-rw-r--r-- | engine_gui.c | 18 | ||||
-rw-r--r-- | train_gui.c | 69 |
3 files changed, 50 insertions, 57 deletions
@@ -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; } diff --git a/engine_gui.c b/engine_gui.c index 476d7122a..5217a459b 100644 --- a/engine_gui.c +++ b/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; diff --git a/train_gui.c b/train_gui.c index 2a2e0ae62..1cd2c9b60 100644 --- a/train_gui.c +++ b/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; + + /* 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--; \ + } - 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); + engine_drawing_loop(!=); // True engines + engine_drawing_loop(==); // Feeble wagons WP(w,buildtrain_d).sel_engine = selected_id; |