mirror of
https://github.com/OpenTTD/OpenTTD.git
synced 2025-02-07 06:46:43 +00:00
(svn r8185) -Codechange: Equipped Roadstops with new/delete operators and gave them proper constructors/destructors (Thanks to KUDr for a nice interactive C++ lesson)
This commit is contained in:
parent
a973e45719
commit
8c54793068
@ -314,27 +314,10 @@ static void FixOldStations(void)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Check if there is a bus or truck station, and convert to new format */
|
/* Check if there is a bus or truck station, and convert to new format */
|
||||||
if (st->bus_tile_obsolete != 0) {
|
if (st->bus_tile_obsolete != 0) st->bus_stops = new RoadStop(st->bus_tile_obsolete, st->index);
|
||||||
st->bus_stops = AllocateRoadStop();
|
|
||||||
st->bus_stops->xy = st->bus_tile_obsolete;
|
if (st->lorry_tile_obsolete != 0) st->truck_stops = new RoadStop(st->lorry_tile_obsolete, st->index);
|
||||||
st->bus_stops->used = true;
|
|
||||||
st->bus_stops->status = 3;
|
|
||||||
st->bus_stops->station = st->index;
|
|
||||||
st->bus_stops->next = NULL;
|
|
||||||
st->bus_stops->prev = NULL;
|
|
||||||
st->bus_stops->num_vehicles = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (st->lorry_tile_obsolete != 0) {
|
|
||||||
st->truck_stops = AllocateRoadStop();
|
|
||||||
st->truck_stops->xy = st->lorry_tile_obsolete;
|
|
||||||
st->truck_stops->used = true;
|
|
||||||
st->truck_stops->status = 3;
|
|
||||||
st->truck_stops->station = st->index;
|
|
||||||
st->truck_stops->next = NULL;
|
|
||||||
st->truck_stops->prev = NULL;
|
|
||||||
st->truck_stops->num_vehicles = 0;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -312,3 +312,100 @@ StationRect& StationRect::operator = (Rect src)
|
|||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/************************************************************************/
|
||||||
|
/* RoadStop implementation */
|
||||||
|
/************************************************************************/
|
||||||
|
|
||||||
|
/** Allocates a new RoadStop onto the pool, or recycles an unsed one
|
||||||
|
* @return a pointer to the new roadstop
|
||||||
|
*/
|
||||||
|
void *RoadStop::operator new(size_t size)
|
||||||
|
{
|
||||||
|
RoadStop *rs = AllocateRaw();
|
||||||
|
return rs;
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Gets a RoadStop with a given index and allocates it when needed
|
||||||
|
* @return a pointer to the roadstop
|
||||||
|
*/
|
||||||
|
void *RoadStop::operator new(size_t size, int index)
|
||||||
|
{
|
||||||
|
if (!AddBlockIfNeeded(&_RoadStop_pool, index)) {
|
||||||
|
error("RoadStops: failed loading savegame: too many RoadStops");
|
||||||
|
}
|
||||||
|
|
||||||
|
RoadStop *rs = GetRoadStop(index);
|
||||||
|
return rs;
|
||||||
|
}
|
||||||
|
|
||||||
|
void RoadStop::operator delete(void *p)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
void RoadStop::operator delete(void *p, int index)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Initializes a RoadStop */
|
||||||
|
RoadStop::RoadStop(TileIndex tile, StationID index)
|
||||||
|
{
|
||||||
|
DEBUG(ms, cDebugCtorLevel, "I+%3d at %d[0x%x]", index, tile, tile);
|
||||||
|
xy = tile;
|
||||||
|
used = true;
|
||||||
|
status = 3; //stop is free
|
||||||
|
next = NULL;
|
||||||
|
prev = NULL;
|
||||||
|
station = index;
|
||||||
|
num_vehicles = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/** De-Initializes a RoadStops. This includes clearing all slots that vehicles might
|
||||||
|
* have and unlinks it from the linked list of road stops at the given station
|
||||||
|
*/
|
||||||
|
RoadStop::~RoadStop()
|
||||||
|
{
|
||||||
|
Vehicle *v;
|
||||||
|
|
||||||
|
/* Clear the slot assignment of all vehicles heading for this road stop */
|
||||||
|
if (num_vehicles != 0) {
|
||||||
|
FOR_ALL_VEHICLES(v) {
|
||||||
|
if (v->type == VEH_Road && v->u.road.slot == this) ClearSlot(v);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
assert(num_vehicles == 0);
|
||||||
|
|
||||||
|
if (prev != NULL) prev->next = next;
|
||||||
|
if (next != NULL) next->prev = prev;
|
||||||
|
|
||||||
|
used = false;
|
||||||
|
DEBUG(ms, cDebugCtorLevel , "I- at %3d%d[0x%x]", station, xy, xy);
|
||||||
|
|
||||||
|
xy = INVALID_TILE;
|
||||||
|
station = INVALID_STATION;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/** Low-level function for allocating a RoadStop on the pool */
|
||||||
|
RoadStop *RoadStop::AllocateRaw( void )
|
||||||
|
{
|
||||||
|
RoadStop *rs;
|
||||||
|
|
||||||
|
/* We don't use FOR_ALL here, because FOR_ALL skips invalid items.
|
||||||
|
* TODO - This is just a temporary stage, this will be removed. */
|
||||||
|
for (rs = GetRoadStop(0); rs != NULL; rs = (rs->index + 1U < GetRoadStopPoolSize()) ? GetRoadStop(rs->index + 1U) : NULL) {
|
||||||
|
if (!IsValidRoadStop(rs)) {
|
||||||
|
RoadStopID index = rs->index;
|
||||||
|
|
||||||
|
memset(rs, 0, sizeof(*rs));
|
||||||
|
rs->index = index;
|
||||||
|
|
||||||
|
return rs;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Check if we can add a block to the pool */
|
||||||
|
if (AddBlockToPool(&_RoadStop_pool)) return AllocateRaw();
|
||||||
|
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
@ -53,6 +53,20 @@ typedef struct RoadStop {
|
|||||||
StationID station;
|
StationID station;
|
||||||
struct RoadStop *next;
|
struct RoadStop *next;
|
||||||
struct RoadStop *prev;
|
struct RoadStop *prev;
|
||||||
|
|
||||||
|
static const int cDebugCtorLevel = 3;
|
||||||
|
|
||||||
|
RoadStop(TileIndex tile, StationID index);
|
||||||
|
~RoadStop();
|
||||||
|
|
||||||
|
void *operator new (size_t size);
|
||||||
|
void operator delete(void *rs);
|
||||||
|
|
||||||
|
/* For loading games */
|
||||||
|
void *operator new (size_t size, int index);
|
||||||
|
void operator delete(void *rs, int index);
|
||||||
|
|
||||||
|
static RoadStop *AllocateRaw( void );
|
||||||
} RoadStop;
|
} RoadStop;
|
||||||
|
|
||||||
typedef struct StationSpecList {
|
typedef struct StationSpecList {
|
||||||
@ -248,14 +262,6 @@ static inline bool IsValidRoadStop(const RoadStop *rs)
|
|||||||
return rs->used;
|
return rs->used;
|
||||||
}
|
}
|
||||||
|
|
||||||
void DestroyRoadStop(RoadStop* rs);
|
|
||||||
|
|
||||||
static inline void DeleteRoadStop(RoadStop *rs)
|
|
||||||
{
|
|
||||||
DestroyRoadStop(rs);
|
|
||||||
rs->used = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
#define FOR_ALL_ROADSTOPS_FROM(rs, start) for (rs = GetRoadStop(start); rs != NULL; rs = (rs->index + 1U < GetRoadStopPoolSize()) ? GetRoadStop(rs->index + 1U) : NULL) if (IsValidRoadStop(rs))
|
#define FOR_ALL_ROADSTOPS_FROM(rs, start) for (rs = GetRoadStop(start); rs != NULL; rs = (rs->index + 1U < GetRoadStopPoolSize()) ? GetRoadStop(rs->index + 1U) : NULL) if (IsValidRoadStop(rs))
|
||||||
#define FOR_ALL_ROADSTOPS(rs) FOR_ALL_ROADSTOPS_FROM(rs, 0)
|
#define FOR_ALL_ROADSTOPS(rs) FOR_ALL_ROADSTOPS_FROM(rs, 0)
|
||||||
|
|
||||||
|
@ -77,16 +77,6 @@ DEFINE_OLD_POOL(RoadStop, RoadStop, RoadStopPoolNewBlock, NULL)
|
|||||||
|
|
||||||
extern void UpdateAirplanesOnNewStation(Station *st);
|
extern void UpdateAirplanesOnNewStation(Station *st);
|
||||||
|
|
||||||
static void InitializeRoadStop(RoadStop *road_stop, RoadStop *previous, TileIndex tile, StationID index)
|
|
||||||
{
|
|
||||||
road_stop->xy = tile;
|
|
||||||
road_stop->used = true;
|
|
||||||
road_stop->status = 3; //stop is free
|
|
||||||
road_stop->next = NULL;
|
|
||||||
road_stop->prev = previous;
|
|
||||||
road_stop->station = index;
|
|
||||||
road_stop->num_vehicles = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
RoadStop* GetPrimaryRoadStop(const Station* st, RoadStopType type)
|
RoadStop* GetPrimaryRoadStop(const Station* st, RoadStopType type)
|
||||||
{
|
{
|
||||||
@ -122,28 +112,6 @@ uint GetNumRoadStopsInStation(const Station* st, RoadStopType type)
|
|||||||
return num;
|
return num;
|
||||||
}
|
}
|
||||||
|
|
||||||
RoadStop *AllocateRoadStop(void)
|
|
||||||
{
|
|
||||||
RoadStop *rs;
|
|
||||||
|
|
||||||
/* We don't use FOR_ALL here, because FOR_ALL skips invalid items.
|
|
||||||
* TODO - This is just a temporary stage, this will be removed. */
|
|
||||||
for (rs = GetRoadStop(0); rs != NULL; rs = (rs->index + 1U < GetRoadStopPoolSize()) ? GetRoadStop(rs->index + 1U) : NULL) {
|
|
||||||
if (!IsValidRoadStop(rs)) {
|
|
||||||
RoadStopID index = rs->index;
|
|
||||||
|
|
||||||
memset(rs, 0, sizeof(*rs));
|
|
||||||
rs->index = index;
|
|
||||||
|
|
||||||
return rs;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Check if we can add a block to the pool */
|
|
||||||
if (AddBlockToPool(&_RoadStop_pool)) return AllocateRoadStop();
|
|
||||||
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Calculate the radius of the station. Basicly it is the biggest
|
/* Calculate the radius of the station. Basicly it is the biggest
|
||||||
* radius that is available within the station */
|
* radius that is available within the station */
|
||||||
@ -1393,7 +1361,7 @@ int32 CmdBuildRoadStop(TileIndex tile, uint32 flags, uint32 p1, uint32 p2)
|
|||||||
}
|
}
|
||||||
|
|
||||||
//give us a road stop in the list, and check if something went wrong
|
//give us a road stop in the list, and check if something went wrong
|
||||||
road_stop = AllocateRoadStop();
|
road_stop = new RoadStop(tile, INVALID_STATION);
|
||||||
if (road_stop == NULL) {
|
if (road_stop == NULL) {
|
||||||
return_cmd_error(type ? STR_3008B_TOO_MANY_TRUCK_STOPS : STR_3008A_TOO_MANY_BUS_STOPS);
|
return_cmd_error(type ? STR_3008B_TOO_MANY_TRUCK_STOPS : STR_3008A_TOO_MANY_BUS_STOPS);
|
||||||
}
|
}
|
||||||
@ -1443,7 +1411,8 @@ int32 CmdBuildRoadStop(TileIndex tile, uint32 flags, uint32 p1, uint32 p2)
|
|||||||
*currstop = road_stop;
|
*currstop = road_stop;
|
||||||
|
|
||||||
//initialize an empty station
|
//initialize an empty station
|
||||||
InitializeRoadStop(road_stop, prev, tile, st->index);
|
road_stop->prev = prev;
|
||||||
|
road_stop->station = st->index;
|
||||||
if (!st->facilities) st->xy = tile;
|
if (!st->facilities) st->xy = tile;
|
||||||
st->facilities |= (type) ? FACIL_TRUCK_STOP : FACIL_BUS_STOP;
|
st->facilities |= (type) ? FACIL_TRUCK_STOP : FACIL_BUS_STOP;
|
||||||
st->owner = _current_player;
|
st->owner = _current_player;
|
||||||
@ -1499,7 +1468,7 @@ static int32 RemoveRoadStop(Station *st, uint32 flags, TileIndex tile)
|
|||||||
*primary_stop = (*primary_stop)->next;
|
*primary_stop = (*primary_stop)->next;
|
||||||
}
|
}
|
||||||
|
|
||||||
DeleteRoadStop(cur_stop);
|
delete cur_stop;
|
||||||
DoClearSquare(tile);
|
DoClearSquare(tile);
|
||||||
st->rect.AfterRemoveTile(st, tile);
|
st->rect.AfterRemoveTile(st, tile);
|
||||||
|
|
||||||
@ -2356,27 +2325,6 @@ static uint32 VehicleEnter_Station(Vehicle *v, TileIndex tile, int x, int y)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Cleanup a RoadStop. Make sure no vehicles try to go to this roadstop.
|
|
||||||
*/
|
|
||||||
void DestroyRoadStop(RoadStop* rs)
|
|
||||||
{
|
|
||||||
Vehicle *v;
|
|
||||||
|
|
||||||
/* Clear the slot assignment of all vehicles heading for this road stop */
|
|
||||||
if (rs->num_vehicles != 0) {
|
|
||||||
FOR_ALL_VEHICLES(v) {
|
|
||||||
if (v->type == VEH_Road && v->u.road.slot == rs) {
|
|
||||||
ClearSlot(v);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
assert(rs->num_vehicles == 0);
|
|
||||||
|
|
||||||
if (rs->prev != NULL) rs->prev->next = rs->next;
|
|
||||||
if (rs->next != NULL) rs->next->prev = rs->prev;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void DeleteAllPlayerStations(void)
|
void DeleteAllPlayerStations(void)
|
||||||
{
|
{
|
||||||
@ -3059,18 +3007,16 @@ static void Load_STNS(void)
|
|||||||
* convert, if needed */
|
* convert, if needed */
|
||||||
if (CheckSavegameVersion(6)) {
|
if (CheckSavegameVersion(6)) {
|
||||||
if (st->bus_tile_obsolete != 0) {
|
if (st->bus_tile_obsolete != 0) {
|
||||||
st->bus_stops = AllocateRoadStop();
|
st->bus_stops = new RoadStop(st->bus_tile_obsolete, st->index);
|
||||||
if (st->bus_stops == NULL)
|
if (st->bus_stops == NULL)
|
||||||
error("Station: too many busstations in savegame");
|
error("Station: too many busstations in savegame");
|
||||||
|
|
||||||
InitializeRoadStop(st->bus_stops, NULL, st->bus_tile_obsolete, st->index);
|
|
||||||
}
|
}
|
||||||
if (st->lorry_tile_obsolete != 0) {
|
if (st->lorry_tile_obsolete != 0) {
|
||||||
st->truck_stops = AllocateRoadStop();
|
st->truck_stops = new RoadStop(st->lorry_tile_obsolete, st->index);
|
||||||
if (st->truck_stops == NULL)
|
if (st->truck_stops == NULL)
|
||||||
error("Station: too many truckstations in savegame");
|
error("Station: too many truckstations in savegame");
|
||||||
|
|
||||||
InitializeRoadStop(st->truck_stops, NULL, st->lorry_tile_obsolete, st->index);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -3094,12 +3040,8 @@ static void Load_ROADSTOP(void)
|
|||||||
int index;
|
int index;
|
||||||
|
|
||||||
while ((index = SlIterateArray()) != -1) {
|
while ((index = SlIterateArray()) != -1) {
|
||||||
RoadStop *rs;
|
RoadStop *rs = new (index) RoadStop(INVALID_TILE, INVALID_STATION);
|
||||||
|
|
||||||
if (!AddBlockIfNeeded(&_RoadStop_pool, index))
|
|
||||||
error("RoadStops: failed loading savegame: too many RoadStops");
|
|
||||||
|
|
||||||
rs = GetRoadStop(index);
|
|
||||||
SlObject(rs, _roadstop_desc);
|
SlObject(rs, _roadstop_desc);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user