diff options
-rw-r--r-- | vehicle.c | 40 |
1 files changed, 31 insertions, 9 deletions
@@ -2004,19 +2004,41 @@ uint32 VehicleEnterTile(Vehicle *v, TileIndex tile, int x, int y) UnitID GetFreeUnitNumber(byte type) { - UnitID unit_num = 0; - Vehicle *u; + UnitID unit, max; + const Vehicle *u; + static bool *cache = NULL; + static UnitID gmax = 0; + + switch (type) { + case VEH_Train: max = _patches.max_trains; break; + case VEH_Road: max = _patches.max_roadveh; break; + case VEH_Ship: max = _patches.max_ships; break; + case VEH_Aircraft: max = _patches.max_aircraft; break; + default: assert(0); + } + + if (max > gmax) { + gmax = max; + free(cache); + cache = malloc((max + 1) * sizeof(*cache)); + } + + // Clear the cache + memset(cache, 0, (max + 1) * sizeof(*cache)); -restart: - unit_num++; + // Fill the cache FOR_ALL_VEHICLES(u) { - if (u->type == type && u->owner == _current_player && - unit_num == u->unitnumber) - goto restart; + if (u->type == type && u->owner == _current_player && u->unitnumber != 0 && u->unitnumber <= max) + cache[u->unitnumber] = true; + } + + // Find the first unused unit number + for (unit = 1; unit <= max; unit++) { + if (!cache[unit]) break; } - return unit_num; -} + return unit; +} // Save and load of vehicles const SaveLoad _common_veh_desc[] = { |