Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00012 #ifndef HOUSE_H
00013 #define HOUSE_H
00014
00015 #include "cargo_type.h"
00016 #include "date_type.h"
00017 #include "house_type.h"
00018 #include "newgrf_animation_type.h"
00019 #include "newgrf_commons.h"
00020
00025 static const byte TOWN_HOUSE_COMPLETED = 3;
00026
00027 static const HouseID NUM_HOUSES_PER_GRF = 255;
00028
00029 static const uint HOUSE_NO_CLASS = 0;
00030 static const HouseID NEW_HOUSE_OFFSET = 110;
00031 static const HouseID NUM_HOUSES = 512;
00032 static const HouseID INVALID_HOUSE_ID = 0xFFFF;
00033
00038 static const uint HOUSE_CLASS_MAX = NUM_HOUSES - NEW_HOUSE_OFFSET + 1;
00039
00040 enum BuildingFlags {
00041 TILE_NO_FLAG = 0,
00042 TILE_SIZE_1x1 = 1U << 0,
00043 TILE_NOT_SLOPED = 1U << 1,
00044 TILE_SIZE_2x1 = 1U << 2,
00045 TILE_SIZE_1x2 = 1U << 3,
00046 TILE_SIZE_2x2 = 1U << 4,
00047 BUILDING_IS_ANIMATED = 1U << 5,
00048 BUILDING_IS_CHURCH = 1U << 6,
00049 BUILDING_IS_STADIUM = 1U << 7,
00050 BUILDING_HAS_1_TILE = TILE_SIZE_1x1 | TILE_SIZE_2x1 | TILE_SIZE_1x2 | TILE_SIZE_2x2,
00051 BUILDING_HAS_2_TILES = TILE_SIZE_2x1 | TILE_SIZE_1x2 | TILE_SIZE_2x2,
00052 BUILDING_2_TILES_X = TILE_SIZE_2x1 | TILE_SIZE_2x2,
00053 BUILDING_2_TILES_Y = TILE_SIZE_1x2 | TILE_SIZE_2x2,
00054 BUILDING_HAS_4_TILES = TILE_SIZE_2x2,
00055 };
00056 DECLARE_ENUM_AS_BIT_SET(BuildingFlags)
00057
00058 enum HouseZonesBits {
00059 HZB_BEGIN = 0,
00060 HZB_TOWN_EDGE = 0,
00061 HZB_TOWN_OUTSKIRT,
00062 HZB_TOWN_OUTER_SUBURB,
00063 HZB_TOWN_INNER_SUBURB,
00064 HZB_TOWN_CENTRE,
00065 HZB_END,
00066 };
00067 assert_compile(HZB_END == 5);
00068
00069 DECLARE_POSTFIX_INCREMENT(HouseZonesBits)
00070
00071 enum HouseZones {
00072 HZ_NOZNS = 0x0000,
00073 HZ_ZON1 = 1U << HZB_TOWN_EDGE,
00074 HZ_ZON2 = 1U << HZB_TOWN_OUTSKIRT,
00075 HZ_ZON3 = 1U << HZB_TOWN_OUTER_SUBURB,
00076 HZ_ZON4 = 1U << HZB_TOWN_INNER_SUBURB,
00077 HZ_ZON5 = 1U << HZB_TOWN_CENTRE,
00078 HZ_ZONALL = 0x001F,
00079 HZ_SUBARTC_ABOVE = 0x0800,
00080 HZ_TEMP = 0x1000,
00081 HZ_SUBARTC_BELOW = 0x2000,
00082 HZ_SUBTROPIC = 0x4000,
00083 HZ_TOYLND = 0x8000,
00084 HZ_CLIMALL = 0xF800,
00085 };
00086 DECLARE_ENUM_AS_BIT_SET(HouseZones)
00087
00088 enum HouseExtraFlags {
00089 NO_EXTRA_FLAG = 0,
00090 BUILDING_IS_HISTORICAL = 1U << 0,
00091 BUILDING_IS_PROTECTED = 1U << 1,
00092 SYNCHRONISED_CALLBACK_1B = 1U << 2,
00093 CALLBACK_1A_RANDOM_BITS = 1U << 3,
00094 };
00095
00096 DECLARE_ENUM_AS_BIT_SET(HouseExtraFlags)
00097
00098 struct HouseSpec {
00099
00100 Year min_year;
00101 Year max_year;
00102 byte population;
00103 byte removal_cost;
00104 StringID building_name;
00105 uint16 remove_rating_decrease;
00106 byte mail_generation;
00107 byte cargo_acceptance[3];
00108 CargoID accepts_cargo[3];
00109 BuildingFlags building_flags;
00110 HouseZones building_availability;
00111 bool enabled;
00112
00113
00114 GRFFileProps grf_prop;
00115 uint16 callback_mask;
00116 byte random_colour[4];
00117 byte probability;
00118 HouseExtraFlags extra_flags;
00119 HouseClassID class_id;
00120 AnimationInfo animation;
00121 byte processing_time;
00122 byte minimum_life;
00123 uint32 watched_cargoes;
00124
00125 Money GetRemovalCost() const;
00126
00127 static inline HouseSpec *Get(size_t house_id)
00128 {
00129 assert(house_id < NUM_HOUSES);
00130 extern HouseSpec _house_specs[];
00131 return &_house_specs[house_id];
00132 }
00133 };
00134
00140 static inline HouseID GetTranslatedHouseID(HouseID hid)
00141 {
00142 const HouseSpec *hs = HouseSpec::Get(hid);
00143 return hs->grf_prop.override == INVALID_HOUSE_ID ? hid : hs->grf_prop.override;
00144 }
00145
00146 #endif