forked from mirror/OpenTTD
(svn r6424) -Codechange: [autoreplace] removed a loop though all vehicles from each time the window is redrawn
To do this, the player struct contains an array, that contains the count of each engine type that the player owns Those arrays are updated each time a vehicle is build or deleted and is calculated on load (it's not saved) It's possible to access the arrays outside of the autoreplace GUI, so feel free to read from them in other patches as well
This commit is contained in:
@@ -49,7 +49,6 @@ static uint32 _internal_name_sorter_id; // internal StringID for default vehicle
|
||||
static const Vehicle* _last_vehicle; // cached vehicle to hopefully speed up name-sorting
|
||||
static bool _internal_sort_order; // descending/ascending
|
||||
|
||||
static uint16 _player_num_engines[TOTAL_NUM_ENGINES];
|
||||
static RailType _railtype_selected_in_replace_gui;
|
||||
|
||||
|
||||
@@ -443,7 +442,7 @@ static void train_engine_drawing_loop(int *x, int *y, int *pos, int *sel, Engine
|
||||
const RailVehicleInfo *rvi = RailVehInfo(i);
|
||||
const EngineInfo *info = EngInfo(i);
|
||||
|
||||
if (!EngineHasReplacementForPlayer(p, i) && _player_num_engines[i] == 0 && show_outdated) continue;
|
||||
if (!EngineHasReplacementForPlayer(p, i) && p->num_engines[i] == 0 && show_outdated) continue;
|
||||
|
||||
if ((rvi->power == 0 && !show_cars) || (rvi->power != 0 && show_cars)) // show wagons or engines (works since wagons do not have power)
|
||||
continue;
|
||||
@@ -470,10 +469,10 @@ static void train_engine_drawing_loop(int *x, int *y, int *pos, int *sel, Engine
|
||||
DrawString(*x + 59, *y + 2, GetCustomEngineName(i),
|
||||
colour);
|
||||
// show_outdated is true only for left side, which is where we show old replacements
|
||||
DrawTrainEngine(*x + 29, *y + 6, i, (_player_num_engines[i] == 0 && show_outdated) ?
|
||||
DrawTrainEngine(*x + 29, *y + 6, i, (p->num_engines[i] == 0 && show_outdated) ?
|
||||
PALETTE_CRASH : GetEnginePalette(i, _local_player));
|
||||
if ( show_outdated ) {
|
||||
SetDParam(0, _player_num_engines[i]);
|
||||
SetDParam(0, p->num_engines[i]);
|
||||
DrawStringRightAligned(213, *y+5, STR_TINY_BLACK, 0);
|
||||
}
|
||||
*y += 14;
|
||||
@@ -510,7 +509,7 @@ static void SetupScrollStuffForReplaceWindow(Window *w)
|
||||
// left window contains compatible engines while right window only contains engines of the selected type
|
||||
if (ENGINE_AVAILABLE &&
|
||||
(RailVehInfo(eid)->power != 0) == (WP(w, replaceveh_d).wagon_btnstate != 0)) {
|
||||
if (IsCompatibleRail(e->railtype, railtype) && (_player_num_engines[eid] > 0 || EngineHasReplacementForPlayer(p, eid))) {
|
||||
if (IsCompatibleRail(e->railtype, railtype) && (p->num_engines[eid] > 0 || EngineHasReplacementForPlayer(p, eid))) {
|
||||
if (sel[0] == count) selected_id[0] = eid;
|
||||
count++;
|
||||
}
|
||||
@@ -525,7 +524,7 @@ static void SetupScrollStuffForReplaceWindow(Window *w)
|
||||
|
||||
case VEH_Road: {
|
||||
for (i = ROAD_ENGINES_INDEX; i < ROAD_ENGINES_INDEX + NUM_ROAD_ENGINES; i++) {
|
||||
if (_player_num_engines[i] > 0 || EngineHasReplacementForPlayer(p, i)) {
|
||||
if (p->num_engines[i] > 0 || EngineHasReplacementForPlayer(p, i)) {
|
||||
if (sel[0] == count) selected_id[0] = i;
|
||||
count++;
|
||||
}
|
||||
@@ -547,7 +546,7 @@ static void SetupScrollStuffForReplaceWindow(Window *w)
|
||||
|
||||
case VEH_Ship: {
|
||||
for (i = SHIP_ENGINES_INDEX; i < SHIP_ENGINES_INDEX + NUM_SHIP_ENGINES; i++) {
|
||||
if (_player_num_engines[i] > 0 || EngineHasReplacementForPlayer(p, i)) {
|
||||
if (p->num_engines[i] > 0 || EngineHasReplacementForPlayer(p, i)) {
|
||||
if (sel[0] == count) selected_id[0] = i;
|
||||
count++;
|
||||
}
|
||||
@@ -573,7 +572,7 @@ static void SetupScrollStuffForReplaceWindow(Window *w)
|
||||
|
||||
case VEH_Aircraft: {
|
||||
for (i = AIRCRAFT_ENGINES_INDEX; i < AIRCRAFT_ENGINES_INDEX + NUM_AIRCRAFT_ENGINES; i++) {
|
||||
if (_player_num_engines[i] > 0 || EngineHasReplacementForPlayer(p, i)) {
|
||||
if (p->num_engines[i] > 0 || EngineHasReplacementForPlayer(p, i)) {
|
||||
if (sel[0] == count) selected_id[0] = i;
|
||||
count++;
|
||||
}
|
||||
@@ -650,11 +649,11 @@ static void DrawEngineArrayInReplaceWindow(Window *w, int x, int y, int x2, int
|
||||
cargo = RoadVehInfo(selected_id[0])->cargo_type;
|
||||
|
||||
do {
|
||||
if (_player_num_engines[engine_id] > 0 || EngineHasReplacementForPlayer(p, engine_id)) {
|
||||
if (p->num_engines[engine_id] > 0 || EngineHasReplacementForPlayer(p, 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, _player_num_engines[engine_id] > 0 ? GetEnginePalette(engine_id, _local_player) : PALETTE_CRASH);
|
||||
SetDParam(0, _player_num_engines[engine_id]);
|
||||
DrawRoadVehEngine(x+29, y+6, engine_id, p->num_engines[engine_id] > 0 ? GetEnginePalette(engine_id, _local_player) : PALETTE_CRASH);
|
||||
SetDParam(0, p->num_engines[engine_id]);
|
||||
DrawStringRightAligned(213, y+5, STR_TINY_BLACK, 0);
|
||||
y += 14;
|
||||
}
|
||||
@@ -685,11 +684,11 @@ static void DrawEngineArrayInReplaceWindow(Window *w, int x, int y, int x2, int
|
||||
refittable = ShipVehInfo(selected_id[0])->refittable;
|
||||
|
||||
do {
|
||||
if (_player_num_engines[engine_id] > 0 || EngineHasReplacementForPlayer(p, engine_id)) {
|
||||
if (p->num_engines[engine_id] > 0 || EngineHasReplacementForPlayer(p, 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, _player_num_engines[engine_id] > 0 ? GetEnginePalette(engine_id, _local_player) : PALETTE_CRASH);
|
||||
SetDParam(0, _player_num_engines[engine_id]);
|
||||
DrawShipEngine(x+35, y+10, engine_id, p->num_engines[engine_id] > 0 ? GetEnginePalette(engine_id, _local_player) : PALETTE_CRASH);
|
||||
SetDParam(0, p->num_engines[engine_id]);
|
||||
DrawStringRightAligned(213, y+15, STR_TINY_BLACK, 0);
|
||||
y += 24;
|
||||
}
|
||||
@@ -718,12 +717,12 @@ static void DrawEngineArrayInReplaceWindow(Window *w, int x, int y, int x2, int
|
||||
byte subtype = AircraftVehInfo(selected_id[0])->subtype;
|
||||
|
||||
do {
|
||||
if (_player_num_engines[engine_id] > 0 || EngineHasReplacementForPlayer(p, engine_id)) {
|
||||
if (p->num_engines[engine_id] > 0 || EngineHasReplacementForPlayer(p, 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, _player_num_engines[engine_id] > 0 ? GetEnginePalette(engine_id, _local_player) : PALETTE_CRASH);
|
||||
SetDParam(0, _player_num_engines[engine_id]);
|
||||
DrawAircraftEngine(x+29, y+10, engine_id, p->num_engines[engine_id] > 0 ? GetEnginePalette(engine_id, _local_player) : PALETTE_CRASH);
|
||||
SetDParam(0, p->num_engines[engine_id]);
|
||||
DrawStringRightAligned(213, y+15, STR_TINY_BLACK, 0);
|
||||
y += 24;
|
||||
}
|
||||
@@ -758,7 +757,7 @@ static void ReplaceVehicleWndProc(Window *w, WindowEvent *e)
|
||||
|
||||
switch (e->event) {
|
||||
case WE_PAINT: {
|
||||
const Player *p = GetPlayer(_local_player);
|
||||
Player *p = GetPlayer(_local_player);
|
||||
int pos = w->vscroll.pos;
|
||||
EngineID selected_id[2] = { INVALID_ENGINE, INVALID_ENGINE };
|
||||
int x = 1;
|
||||
@@ -770,28 +769,6 @@ 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;
|
||||
/* compiler optimisation tend to prefer to keep local variables in the registers instead of global ones,
|
||||
* so we cache often used and unchanging variables in local variables to increase the loop speed */
|
||||
const byte vehicle_type = w->window_number;
|
||||
const PlayerID player = _local_player;
|
||||
|
||||
for (i = 0; i < lengthof(_player_num_engines); i++) {
|
||||
_player_num_engines[i] = 0;
|
||||
}
|
||||
FOR_ALL_VEHICLES(vehicle) {
|
||||
if (vehicle->owner == player && vehicle->type == vehicle_type) {
|
||||
if (vehicle_type == VEH_Aircraft && vehicle->subtype > 2) continue; // plane shadows and helicopter rotors
|
||||
if (vehicle_type == VEH_Train && (
|
||||
IsArticulatedPart(vehicle) || // tenders and other articulated parts
|
||||
(IsMultiheaded(vehicle) && !IsTrainEngine(vehicle)))) continue; // rear parts of multiheaded engines
|
||||
_player_num_engines[vehicle->engine_type]++;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
SetupScrollStuffForReplaceWindow(w);
|
||||
|
||||
selected_id[0] = WP(w,replaceveh_d).sel_engine[0];
|
||||
|
Reference in New Issue
Block a user