summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorrubidium <rubidium@openttd.org>2009-07-17 21:06:06 +0000
committerrubidium <rubidium@openttd.org>2009-07-17 21:06:06 +0000
commit4e5af51d1f56bc303dde2290a12cc219403b9c66 (patch)
tree216e244c8b6fcf4ca800797b064092436bcf98f0 /src
parentd8f16ea1994ecebdb153c58350b3a044a6d43e57 (diff)
downloadopenttd-4e5af51d1f56bc303dde2290a12cc219403b9c66.tar.xz
(svn r16864) -Codechange: make Waypoints a subclass of BaseStation.
Diffstat (limited to 'src')
-rw-r--r--src/newgrf_station.cpp54
-rw-r--r--src/rail_cmd.cpp9
-rw-r--r--src/station.cpp1
-rw-r--r--src/waypoint.cpp23
-rw-r--r--src/waypoint.h25
5 files changed, 59 insertions, 53 deletions
diff --git a/src/newgrf_station.cpp b/src/newgrf_station.cpp
index 01c3bd988..1f2e41787 100644
--- a/src/newgrf_station.cpp
+++ b/src/newgrf_station.cpp
@@ -7,6 +7,7 @@
#include "landscape.h"
#include "debug.h"
#include "station_base.h"
+#include "waypoint.h"
#include "roadstop_base.h"
#include "newgrf_commons.h"
#include "newgrf_station.h"
@@ -466,7 +467,7 @@ static uint32 StationGetVariable(const ResolverObject *object, byte variable, by
return res;
}
- /* General station properties */
+ /* General station variables */
case 0x82: return 50;
case 0x84: return st->string_id;
case 0x86: return 0;
@@ -530,12 +531,43 @@ uint32 Station::GetNewGRFVariable(const ResolverObject *object, byte variable, b
}
}
- DEBUG(grf, 1, "Unhandled station property 0x%X", variable);
+ DEBUG(grf, 1, "Unhandled station variable 0x%X", variable);
*available = false;
return UINT_MAX;
}
+uint32 Waypoint::GetNewGRFVariable(const ResolverObject *object, byte variable, byte parameter, bool *available) const
+{
+ switch (variable) {
+ case 0x48: return 0; // Accepted cargo types
+ case 0x8A: return HVOT_TRAIN;
+ case 0xF1: return 0; // airport type
+ case 0xF2: return 0; // truck stop status
+ case 0xF3: return 0; // bus stop status
+ case 0xF6: return 0; // airport flags
+ case 0xF7: return 0; // airport flags cont.
+ }
+
+ /* Handle cargo variables with parameter, 0x60 to 0x65 */
+ if (variable >= 0x60 && variable <= 0x65) {
+ return 0;
+ }
+
+ /* Handle cargo variables (deprecated) */
+ if (variable >= 0x8C && variable <= 0xEC) {
+ switch (GB(variable - 0x8C, 0, 3)) {
+ case 3: return INITIAL_STATION_RATING;
+ case 4: return INVALID_STATION;
+ default: return 0;
+ }
+ }
+
+ DEBUG(grf, 1, "Unhandled station variable 0x%X", variable);
+
+ *available = false;
+ return UINT_MAX;
+}
static const SpriteGroup *StationResolveReal(const ResolverObject *object, const RealSpriteGroup *group)
{
@@ -865,14 +897,20 @@ bool DrawStationTile(int x, int y, RailType railtype, Axis axis, StationClassID
const StationSpec *GetStationSpec(TileIndex t)
{
- const BaseStation *st;
- uint specindex;
+ if (IsRailwayStationTile(t)) {
+ if (!IsCustomStationSpecIndex(t)) return NULL;
- if (!IsCustomStationSpecIndex(t)) return NULL;
+ const BaseStation *st = BaseStation::GetByTile(t);
+ uint specindex = GetCustomStationSpecIndex(t);
+ return specindex < st->num_specs ? st->speclist[specindex].spec : NULL;
+ }
- st = BaseStation::GetByTile(t);
- specindex = GetCustomStationSpecIndex(t);
- return specindex < st->num_specs ? st->speclist[specindex].spec : NULL;
+ if (IsRailWaypointTile(t)) {
+ const BaseStation *st = BaseStation::GetByTile(t);
+ return st->num_specs != 0 ? st->speclist[0].spec : NULL;
+ }
+
+ return NULL;
}
diff --git a/src/rail_cmd.cpp b/src/rail_cmd.cpp
index c2fe324b9..d0dfa5f8d 100644
--- a/src/rail_cmd.cpp
+++ b/src/rail_cmd.cpp
@@ -1938,13 +1938,10 @@ static void DrawTile_Track(TileInfo *ti)
}
} else {
/* look for customization */
- const Waypoint *wp = Waypoint::GetByTile(ti->tile);
+ const StationSpec *statspec = GetStationSpec(ti->tile);
- if (wp->num_specs != 0) {
- const StationSpec *statspec = wp->speclist->spec;
-
- /* emulate station tile - open with building */
- const Station *st = ComposeWaypointStation(ti->tile);
+ if (statspec != NULL) {
+ const BaseStation *st = BaseStation::GetByTile(ti->tile);
uint gfx = 2;
if (HasBit(statspec->callbackmask, CBM_STATION_SPRITE_LAYOUT)) {
diff --git a/src/station.cpp b/src/station.cpp
index 641e77c91..ec57d6e04 100644
--- a/src/station.cpp
+++ b/src/station.cpp
@@ -52,6 +52,7 @@ Station::Station(TileIndex tile) :
/* static */ BaseStation *BaseStation::GetByTile(TileIndex tile)
{
+ if (IsRailWaypointTile(tile)) return Waypoint::GetByTile(tile);
return Station::GetByTile(tile);
}
diff --git a/src/waypoint.cpp b/src/waypoint.cpp
index 04b71056e..acfda8334 100644
--- a/src/waypoint.cpp
+++ b/src/waypoint.cpp
@@ -43,27 +43,6 @@ void WaypointsDailyLoop()
}
/**
- * This hacks together some dummy one-shot Station structure for a waypoint.
- * @param tile on which to work
- * @return pointer to a Station
- */
-Station *ComposeWaypointStation(TileIndex tile)
-{
- Waypoint *wp = Waypoint::GetByTile(tile);
-
- /* instead of 'static Station stat' use byte array to avoid Station's destructor call upon exit. As
- * a side effect, the station is not constructed now. */
- static byte stat_raw[sizeof(Station)];
- static Station &stat = *(Station*)stat_raw;
-
- stat.train_tile = stat.xy = wp->xy;
- stat.town = wp->town;
- stat.build_date = wp->build_date;
-
- return &stat;
-}
-
-/**
* Draw a waypoint
* @param x coordinate
* @param y coordinate
@@ -82,8 +61,6 @@ void DrawWaypointSprite(int x, int y, int stat_id, RailType railtype)
Waypoint::~Waypoint()
{
- free(this->name);
-
if (CleaningPool()) return;
DeleteWindowById(WC_WAYPOINT_VIEW, this->index);
RemoveOrderFromAllVehicles(OT_GOTO_WAYPOINT, this->index);
diff --git a/src/waypoint.h b/src/waypoint.h
index f8f733ad8..1ffb74fe2 100644
--- a/src/waypoint.h
+++ b/src/waypoint.h
@@ -17,27 +17,21 @@
typedef Pool<Waypoint, WaypointID, 32, 64000> WaypointPool;
extern WaypointPool _waypoint_pool;
-struct Waypoint : WaypointPool::PoolItem<&_waypoint_pool> {
- TileIndex xy; ///< Tile of waypoint
-
- Town *town; ///< Town associated with the waypoint
+struct Waypoint : WaypointPool::PoolItem<&_waypoint_pool>, BaseStation {
uint16 town_cn; ///< The Nth waypoint for this town (consecutive number)
- char *name; ///< Custom name. If not set, town + town_cn is used for naming
-
- ViewportSign sign; ///< Dimensions of sign (not saved)
- Date build_date; ///< Date of construction
- OwnerByte owner; ///< Whom this waypoint belongs to
-
- uint8 num_specs; ///< NOSAVE: Number of specs in the speclist
- StationSpecList *speclist; ///< List of station specs of this station
-
- byte delete_ctr; ///< Delete counter. If greater than 0 then it is decremented until it reaches 0; the waypoint is then is deleted.
- Waypoint(TileIndex tile = INVALID_TILE) : xy(tile) { }
+ Waypoint(TileIndex tile = INVALID_TILE) : BaseStation(tile) { }
~Waypoint();
void UpdateVirtCoord();
+ /* virtual */ FORCEINLINE bool TileBelongsToRailStation(TileIndex tile) const
+ {
+ return this->delete_ctr == 0 && this->xy == tile;
+ }
+
+ /* virtual */ uint32 GetNewGRFVariable(const struct ResolverObject *object, byte variable, byte parameter, bool *available) const;
+
void AssignStationSpec(uint index);
/**
@@ -55,7 +49,6 @@ struct Waypoint : WaypointPool::PoolItem<&_waypoint_pool> {
#define FOR_ALL_WAYPOINTS(var) FOR_ALL_WAYPOINTS_FROM(var, 0)
CommandCost RemoveTrainWaypoint(TileIndex tile, DoCommandFlag flags, bool justremove);
-Station *ComposeWaypointStation(TileIndex tile);
void ShowWaypointWindow(const Waypoint *wp);
void DrawWaypointSprite(int x, int y, int stat_id, RailType railtype);
void UpdateAllWaypointVirtCoords();