00001
00002
00005 #ifndef NEWGRF_STATION_H
00006 #define NEWGRF_STATION_H
00007
00008 #include "engine_type.h"
00009 #include "newgrf_callbacks.h"
00010 #include "newgrf_cargo.h"
00011 #include "tile_type.h"
00012 #include "station_type.h"
00013 #include "strings_type.h"
00014 #include "sprite.h"
00015 #include "direction_type.h"
00016 #include "newgrf.h"
00017
00018 enum StationClassID {
00019 STAT_CLASS_BEGIN = 0,
00020 STAT_CLASS_DFLT = 0,
00021 STAT_CLASS_WAYP,
00022 STAT_CLASS_MAX = 32,
00023 };
00024
00026 template <> struct EnumPropsT<StationClassID> : MakeEnumPropsT<StationClassID, byte, STAT_CLASS_BEGIN, STAT_CLASS_MAX, STAT_CLASS_MAX> {};
00027 typedef TinyEnumT<StationClassID> StationClassIDByte;
00028
00030 DECLARE_POSTFIX_INCREMENT(StationClassID);
00031
00032 enum StationSpecFlags {
00033 SSF_SEPARATE_GROUND,
00034 SSF_DIV_BY_STATION_SIZE,
00035 SSF_CB141_RANDOM_BITS,
00036 SSF_CUSTOM_FOUNDATIONS,
00037 SSF_EXTENDED_FOUNDATIONS,
00038 };
00039
00040
00041
00042 typedef byte *StationLayout;
00043
00044 struct StationSpec {
00045 const struct GRFFile *grffile;
00046 int localidx;
00047
00048 bool allocated;
00049
00050 StationClassID sclass;
00051 StringID name;
00052
00057 byte disallowed_platforms;
00062 byte disallowed_lengths;
00063
00071 uint tiles;
00072 DrawTileSprites *renderdata;
00073 bool copied_renderdata;
00074
00078 uint16 cargo_threshold;
00079
00080 uint32 cargo_triggers;
00081
00082 byte callbackmask;
00083
00084 byte flags;
00085
00086 byte pylons;
00087 byte wires;
00088 byte blocked;
00089
00090 byte lengths;
00091 byte *platforms;
00092 StationLayout **layouts;
00093 bool copied_layouts;
00094
00095 uint8 anim_frames;
00096 uint8 anim_status;
00097 uint8 anim_speed;
00098 uint16 anim_triggers;
00099
00105 const struct SpriteGroup *spritegroup[NUM_CARGO + 3];
00106 };
00107
00111 struct StationClass {
00112 uint32 id;
00113 StringID name;
00114 uint stations;
00115 StationSpec **spec;
00116 };
00117
00118 void ResetStationClasses();
00119 StationClassID AllocateStationClass(uint32 cls);
00120 void SetStationClassName(StationClassID sclass, StringID name);
00121 StringID GetStationClassName(StationClassID sclass);
00122 const StationSpec *GetStationSpec(TileIndex t);
00123
00124 uint GetNumStationClasses();
00125 uint GetNumCustomStations(StationClassID sclass);
00126
00127 void SetCustomStationSpec(StationSpec *statspec);
00128 const StationSpec *GetCustomStationSpec(StationClassID sclass, uint station);
00129 const StationSpec *GetCustomStationSpecByGrf(uint32 grfid, byte localidx, int *index);
00130
00131
00132 uint32 GetPlatformInfo(Axis axis, byte tile, int platforms, int length, int x, int y, bool centred);
00133
00134
00135
00136
00137 SpriteID GetCustomStationRelocation(const StationSpec *statspec, const Station *st, TileIndex tile);
00138 SpriteID GetCustomStationGroundRelocation(const StationSpec *statspec, const Station *st, TileIndex tile);
00139 uint16 GetStationCallback(CallbackID callback, uint32 param1, uint32 param2, const StationSpec *statspec, const Station *st, TileIndex tile);
00140
00141
00142 int AllocateSpecToStation(const StationSpec *statspec, Station *st, bool exec);
00143
00144
00145 void DeallocateSpecFromStation(Station *st, byte specindex);
00146
00147
00148 bool DrawStationTile(int x, int y, RailType railtype, Axis axis, StationClassID sclass, uint station);
00149
00150 enum StatAnimTrigger {
00151 STAT_ANIM_BUILT,
00152 STAT_ANIM_NEW_CARGO,
00153 STAT_ANIM_CARGO_TAKEN,
00154 STAT_ANIM_TRAIN_ARRIVES,
00155 STAT_ANIM_TRAIN_DEPARTS,
00156 STAT_ANIM_TRAIN_LOADS,
00157 STAT_ANIM_250_TICKS,
00158 };
00159
00160 void AnimateStationTile(TileIndex tile);
00161 void StationAnimationTrigger(const Station *st, TileIndex tile, StatAnimTrigger trigger, CargoID cargo_type = CT_INVALID);
00162 void StationUpdateAnimTriggers(Station *st);
00163
00164 #endif