2 * This file is part of OpenTTD.
3 * OpenTTD is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2.
4 * OpenTTD is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
5 * See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with OpenTTD. If not, see <http://www.gnu.org/licenses/>.
8 /** @file house.h definition of HouseSpec and accessors */
13 #include "cargo_type.h"
14 #include "timer/timer_game_calendar.h"
15 #include "house_type.h"
16 #include "newgrf_animation_type.h"
17 #include "newgrf_commons.h"
20 * Simple value that indicates the house has reached the final stage of
23 static const uint8_t TOWN_HOUSE_COMPLETED
= 3;
25 static const HouseID NUM_HOUSES_PER_GRF
= 255; ///< Number of supported houses per NewGRF; limited to 255 to allow extending Action3 with an extended byte later on.
27 static const uint HOUSE_NO_CLASS
= 0;
28 static const HouseID NEW_HOUSE_OFFSET
= 110; ///< Offset for new houses.
29 static const HouseID NUM_HOUSES
= 512; ///< Total number of houses.
30 static const HouseID INVALID_HOUSE_ID
= 0xFFFF;
32 static const uint HOUSE_NUM_ACCEPTS
= 16; ///< Max number of cargoes accepted by a tile
33 static const uint HOUSE_ORIGINAL_NUM_ACCEPTS
= 3; ///< Original number of accepted cargo types.
35 enum BuildingFlags
: uint8_t {
37 TILE_SIZE_1x1
= 1U << 0,
38 TILE_NOT_SLOPED
= 1U << 1,
39 TILE_SIZE_2x1
= 1U << 2,
40 TILE_SIZE_1x2
= 1U << 3,
41 TILE_SIZE_2x2
= 1U << 4,
42 BUILDING_IS_ANIMATED
= 1U << 5,
43 BUILDING_IS_CHURCH
= 1U << 6,
44 BUILDING_IS_STADIUM
= 1U << 7,
45 BUILDING_HAS_1_TILE
= TILE_SIZE_1x1
| TILE_SIZE_2x1
| TILE_SIZE_1x2
| TILE_SIZE_2x2
,
46 BUILDING_HAS_2_TILES
= TILE_SIZE_2x1
| TILE_SIZE_1x2
| TILE_SIZE_2x2
,
47 BUILDING_2_TILES_X
= TILE_SIZE_2x1
| TILE_SIZE_2x2
,
48 BUILDING_2_TILES_Y
= TILE_SIZE_1x2
| TILE_SIZE_2x2
,
49 BUILDING_HAS_4_TILES
= TILE_SIZE_2x2
,
51 DECLARE_ENUM_AS_BIT_SET(BuildingFlags
)
53 enum HouseZonesBits
: uint8_t {
57 HZB_TOWN_OUTER_SUBURB
,
58 HZB_TOWN_INNER_SUBURB
,
62 static_assert(HZB_END
== 5);
64 DECLARE_POSTFIX_INCREMENT(HouseZonesBits
)
66 enum HouseZones
: uint16_t {
67 HZ_NOZNS
= 0x0000, ///< 0 This is just to get rid of zeros, meaning none
68 HZ_ZON1
= 1U << HZB_TOWN_EDGE
, ///< 0..4 1,2,4,8,10 which town zones the building can be built in, Zone1 been the further suburb
69 HZ_ZON2
= 1U << HZB_TOWN_OUTSKIRT
,
70 HZ_ZON3
= 1U << HZB_TOWN_OUTER_SUBURB
,
71 HZ_ZON4
= 1U << HZB_TOWN_INNER_SUBURB
,
72 HZ_ZON5
= 1U << HZB_TOWN_CENTRE
, ///< center of town
73 HZ_ZONALL
= 0x001F, ///< 1F This is just to englobe all above types at once
74 HZ_SUBARTC_ABOVE
= 0x0800, ///< 11 800 can appear in sub-arctic climate above the snow line
75 HZ_TEMP
= 0x1000, ///< 12 1000 can appear in temperate climate
76 HZ_SUBARTC_BELOW
= 0x2000, ///< 13 2000 can appear in sub-arctic climate below the snow line
77 HZ_SUBTROPIC
= 0x4000, ///< 14 4000 can appear in subtropical climate
78 HZ_TOYLND
= 0x8000, ///< 15 8000 can appear in toyland climate
79 HZ_CLIMALL
= 0xF800, ///< Bitmask of all climate bits
81 DECLARE_ENUM_AS_BIT_SET(HouseZones
)
83 enum HouseExtraFlags
: uint8_t {
85 BUILDING_IS_HISTORICAL
= 1U << 0, ///< this house will only appear during town generation in random games, thus the historical
86 BUILDING_IS_PROTECTED
= 1U << 1, ///< towns and AI will not remove this house, while human players will be able to
87 SYNCHRONISED_CALLBACK_1B
= 1U << 2, ///< synchronized callback 1B will be performed, on multi tile houses
88 CALLBACK_1A_RANDOM_BITS
= 1U << 3, ///< callback 1A needs random bits
91 DECLARE_ENUM_AS_BIT_SET(HouseExtraFlags
)
94 /* Standard properties */
95 TimerGameCalendar::Year min_year
; ///< introduction year of the house
96 TimerGameCalendar::Year max_year
; ///< last year it can be built
97 uint8_t population
; ///< population (Zero on other tiles in multi tile house.)
98 uint8_t removal_cost
; ///< cost multiplier for removing it
99 StringID building_name
; ///< building name
100 uint16_t remove_rating_decrease
; ///< rating decrease if removed
101 uint8_t mail_generation
; ///< mail generation multiplier (tile based, as the acceptances below)
102 uint8_t cargo_acceptance
[HOUSE_NUM_ACCEPTS
]; ///< acceptance level for the cargo slots
103 CargoID accepts_cargo
[HOUSE_NUM_ACCEPTS
]; ///< input cargo slots
104 CargoLabel accepts_cargo_label
[HOUSE_NUM_ACCEPTS
]; ///< input landscape cargo slots
105 BuildingFlags building_flags
; ///< some flags that describe the house (size, stadium etc...)
106 HouseZones building_availability
; ///< where can it be built (climates, zones)
107 bool enabled
; ///< the house is available to build (true by default, but can be disabled by newgrf)
109 /* NewHouses properties */
110 GRFFileProps grf_prop
; ///< Properties related the the grf file
111 uint16_t callback_mask
; ///< Bitmask of house callbacks that have to be called
112 Colours random_colour
[4]; ///< 4 "random" colours
113 uint8_t probability
; ///< Relative probability of appearing (16 is the standard value)
114 HouseExtraFlags extra_flags
; ///< some more flags
115 HouseClassID class_id
; ///< defines the class this house has (not grf file based)
116 AnimationInfo animation
; ///< information about the animation.
117 uint8_t processing_time
; ///< Periodic refresh multiplier
118 uint8_t minimum_life
; ///< The minimum number of years this house will survive before the town rebuilds it
119 CargoTypes watched_cargoes
; ///< Cargo types watched for acceptance.
121 HouseID
Index() const;
122 Money
GetRemovalCost() const;
124 static std::vector
<HouseSpec
> &Specs();
125 static HouseSpec
*Get(size_t house_id
);
129 * Do HouseID translation for NewGRFs.
130 * @param hid the HouseID to get the override for.
131 * @return the HouseID to actually work with.
133 inline HouseID
GetTranslatedHouseID(HouseID hid
)
135 const HouseSpec
*hs
= HouseSpec::Get(hid
);
136 return hs
->grf_prop
.override
== INVALID_HOUSE_ID
? hid
: hs
->grf_prop
.override
;
139 void ShowBuildHousePicker(struct Window
*);