(svn r14598) -Feature: Action0Industries property 24 (industry suuplies default name for nearby station).

This commit is contained in:
rubidium 2008-11-19 23:55:34 +00:00
parent e80a222d31
commit a1853ea27c
6 changed files with 84 additions and 3 deletions

View File

@ -2570,6 +2570,13 @@ bool AfterLoadGame()
FOR_ALL_SIGNS(si) { FOR_ALL_SIGNS(si) {
if (si->owner != OWNER_NONE && !IsValidCompanyID(si->owner)) si->owner = OWNER_NONE; if (si->owner != OWNER_NONE && !IsValidCompanyID(si->owner)) si->owner = OWNER_NONE;
} }
/* Station can get named based on an industry type, but the current ones
* are not, so mark them as if they are not named by an industry. */
Station *st;
FOR_ALL_STATIONS(st) {
st->indtype = IT_INVALID;
}
} }
GamelogPrintDebug(1); GamelogPrintDebug(1);

View File

@ -37,7 +37,7 @@
#include "table/strings.h" #include "table/strings.h"
extern const uint16 SAVEGAME_VERSION = 102; extern const uint16 SAVEGAME_VERSION = 103;
SavegameType _savegame_type; ///< type of savegame we are loading SavegameType _savegame_type; ///< type of savegame we are loading

View File

@ -51,6 +51,7 @@ Station::Station(TileIndex tile)
facilities = 0; facilities = 0;
last_vehicle_type = VEH_INVALID; last_vehicle_type = VEH_INVALID;
indtype = IT_INVALID;
random_bits = 0; // Random() must be called when station is really built (DC_EXEC) random_bits = 0; // Random() must be called when station is really built (DC_EXEC)
waiting_triggers = 0; waiting_triggers = 0;

View File

@ -15,6 +15,7 @@
#include "date_type.h" #include "date_type.h"
#include "vehicle_type.h" #include "vehicle_type.h"
#include "company_type.h" #include "company_type.h"
#include "industry_type.h"
#include "core/geometry_type.hpp" #include "core/geometry_type.hpp"
#include "viewport_type.h" #include "viewport_type.h"
#include <list> #include <list>
@ -130,8 +131,11 @@ public:
TileIndex airport_tile; TileIndex airport_tile;
TileIndex dock_tile; TileIndex dock_tile;
Town *town; Town *town;
StringID string_id; ///< Default name (town area) of station
/* Place to get a name from, in order of importance: */
char *name; ///< Custom name char *name; ///< Custom name
IndustryType indtype; ///< Industry type to get the name from
StringID string_id; ///< Default name (town area) of station
ViewportSign sign; ViewportSign sign;

View File

@ -223,6 +223,36 @@ enum StationNaming {
STATIONNAMING_HELIPORT, STATIONNAMING_HELIPORT,
}; };
/** Information to handle station action 0 property 24 correctly */
struct StationNameInformation {
uint32 free_names; ///< Current bitset of free names (we can remove names).
bool *indtypes; ///< Array of bools telling whether an industry type has been found.
};
/**
* Find a station action 0 property 24 station name, or reduce the
* free_names if needed.
* @param tile the tile to search
* @param user_data the StationNameInformation to base the search on
* @return true if the tile contains an industry that has not given
* it's name to one of the other stations in town.
*/
static bool FindNearIndustryName(TileIndex tile, void *user_data)
{
/* All already found industry types */
StationNameInformation *sni = (StationNameInformation*)user_data;
if (!IsTileType(tile, MP_INDUSTRY)) return false;
/* If the station name is undefined it means that it doesn't name a station */
IndustryType indtype = GetIndustryType(tile);
if (GetIndustrySpec(indtype)->station_name == STR_UNDEFINED) return false;
/* In all cases if an industry that provides a name is found two of
* the standard names will be disabled. */
sni->free_names &= ~(1 << M(STR_SV_STNAME_OILFIELD) | 1 << M(STR_SV_STNAME_MINES));
return !sni->indtypes[indtype];
}
static StringID GenerateStationName(Station *st, TileIndex tile, int flag) static StringID GenerateStationName(Station *st, TileIndex tile, int flag)
{ {
static const uint32 _gen_station_name_bits[] = { static const uint32 _gen_station_name_bits[] = {
@ -237,9 +267,16 @@ static StringID GenerateStationName(Station *st, TileIndex tile, int flag)
const Town *t = st->town; const Town *t = st->town;
uint32 free_names = UINT32_MAX; uint32 free_names = UINT32_MAX;
bool indtypes[NUM_INDUSTRYTYPES];
memset(indtypes, 0, sizeof(indtypes));
const Station *s; const Station *s;
FOR_ALL_STATIONS(s) { FOR_ALL_STATIONS(s) {
if (s != st && s->town == t) { if (s != st && s->town == t) {
if (s->indtype != IT_INVALID) {
indtypes[s->indtype] = true;
continue;
}
uint str = M(s->string_id); uint str = M(s->string_id);
if (str <= 0x20) { if (str <= 0x20) {
if (str == M(STR_SV_STNAME_FOREST)) { if (str == M(STR_SV_STNAME_FOREST)) {
@ -250,6 +287,24 @@ static StringID GenerateStationName(Station *st, TileIndex tile, int flag)
} }
} }
if (flag != STATIONNAMING_BUOY) {
TileIndex indtile = tile;
StationNameInformation sni = { free_names, indtypes };
if (CircularTileSearch(&indtile, 7, FindNearIndustryName, &sni)) {
/* An industry has been found nearby */
IndustryType indtype = GetIndustryType(indtile);
const IndustrySpec *indsp = GetIndustrySpec(indtype);
/* STR_NULL means it only disables oil rig/mines */
if (indsp->station_name != STR_NULL) {
st->indtype = indtype;
return STR_SV_STNAME_FALLBACK;
}
}
/* Oil rigs/mines name could be marked not free by looking for a near by industry. */
free_names = sni.free_names;
}
/* check default names */ /* check default names */
uint32 tmp = free_names & _gen_station_name_bits[flag]; uint32 tmp = free_names & _gen_station_name_bits[flag];
if (tmp != 0) return STR_SV_STNAME + FindFirstBit(tmp); if (tmp != 0) return STR_SV_STNAME + FindFirstBit(tmp);
@ -3255,6 +3310,7 @@ static const SaveLoad _station_desc[] = {
SLE_VAR(Station, string_id, SLE_STRINGID), SLE_VAR(Station, string_id, SLE_STRINGID),
SLE_CONDSTR(Station, name, SLE_STR, 0, 84, SL_MAX_VERSION), SLE_CONDSTR(Station, name, SLE_STR, 0, 84, SL_MAX_VERSION),
SLE_CONDVAR(Station, indtype, SLE_UINT8, 103, SL_MAX_VERSION),
SLE_VAR(Station, had_vehicle_of_type, SLE_UINT16), SLE_VAR(Station, had_vehicle_of_type, SLE_UINT16),
SLE_VAR(Station, time_since_load, SLE_UINT8), SLE_VAR(Station, time_since_load, SLE_UINT8),

View File

@ -862,11 +862,24 @@ static char* FormatString(char* buff, const char* str, const int64* argv, uint c
if (st->name != NULL) { if (st->name != NULL) {
buff = strecpy(buff, st->name, last); buff = strecpy(buff, st->name, last);
} else { } else {
StringID str = st->string_id;
if (st->indtype != IT_INVALID) {
/* Special case where the industry provides the name for the station */
const IndustrySpec *indsp = GetIndustrySpec(st->indtype);
/* Industry GRFs can change which might remove the station name and
* thus cause very strange things. Here we check for that before we
* actually set the station name. */
if (indsp->station_name != STR_NULL && indsp->station_name != STR_UNDEFINED) {
str = indsp->station_name;
}
}
int64 temp[3]; int64 temp[3];
temp[0] = STR_TOWN; temp[0] = STR_TOWN;
temp[1] = st->town->index; temp[1] = st->town->index;
temp[2] = st->index; temp[2] = st->index;
buff = GetStringWithArgs(buff, st->string_id, temp, last); buff = GetStringWithArgs(buff, str, temp, last);
} }
break; break;
} }