00001
00002
00005 #include "../stdafx.h"
00006 #include "../newgrf_house.h"
00007 #include "../newgrf_commons.h"
00008 #include "../variables.h"
00009 #include "../town_map.h"
00010
00011 #include "saveload.h"
00012
00013 extern uint _total_towns;
00014
00023 void UpdateHousesAndTowns()
00024 {
00025 Town *town;
00026 InitializeBuildingCounts();
00027
00028
00029 FOR_ALL_TOWNS(town) {
00030 town->population = 0;
00031 town->num_houses = 0;
00032 }
00033
00034 for (TileIndex t = 0; t < MapSize(); t++) {
00035 HouseID house_id;
00036
00037 if (!IsTileType(t, MP_HOUSE)) continue;
00038
00039 house_id = GetHouseType(t);
00040 if (!GetHouseSpecs(house_id)->enabled && house_id >= NEW_HOUSE_OFFSET) {
00041
00042
00043 house_id = _house_mngr.GetSubstituteID(house_id);
00044 SetHouseType(t, house_id);
00045 }
00046
00047 town = GetTownByTile(t);
00048 IncreaseBuildingCount(town, house_id);
00049 if (IsHouseCompleted(t)) town->population += GetHouseSpecs(house_id)->population;
00050
00051
00052 if (GetHouseNorthPart(house_id) == 0) town->num_houses++;
00053 }
00054
00055
00056 FOR_ALL_TOWNS(town) {
00057 UpdateTownRadius(town);
00058 }
00059 }
00060
00062 static const SaveLoad _town_desc[] = {
00063 SLE_CONDVAR(Town, xy, SLE_FILE_U16 | SLE_VAR_U32, 0, 5),
00064 SLE_CONDVAR(Town, xy, SLE_UINT32, 6, SL_MAX_VERSION),
00065
00066 SLE_CONDNULL(2, 0, 2),
00067 SLE_CONDNULL(4, 3, 84),
00068 SLE_CONDNULL(2, 0, 91),
00069
00070 SLE_CONDVAR(Town, townnamegrfid, SLE_UINT32, 66, SL_MAX_VERSION),
00071 SLE_VAR(Town, townnametype, SLE_UINT16),
00072 SLE_VAR(Town, townnameparts, SLE_UINT32),
00073 SLE_CONDSTR(Town, name, SLE_STR, 0, 84, SL_MAX_VERSION),
00074
00075 SLE_VAR(Town, flags12, SLE_UINT8),
00076 SLE_CONDVAR(Town, statues, SLE_FILE_U8 | SLE_VAR_U16, 0, 103),
00077 SLE_CONDVAR(Town, statues, SLE_UINT16, 104, SL_MAX_VERSION),
00078
00079 SLE_CONDNULL(1, 0, 1),
00080
00081 SLE_CONDVAR(Town, have_ratings, SLE_FILE_U8 | SLE_VAR_U16, 0, 103),
00082 SLE_CONDVAR(Town, have_ratings, SLE_UINT16, 104, SL_MAX_VERSION),
00083 SLE_CONDARR(Town, ratings, SLE_INT16, 8, 0, 103),
00084 SLE_CONDARR(Town, ratings, SLE_INT16, MAX_COMPANIES, 104, SL_MAX_VERSION),
00085
00086 SLE_CONDARR(Town, unwanted, SLE_INT8, 8, 4, 103),
00087 SLE_CONDARR(Town, unwanted, SLE_INT8, MAX_COMPANIES, 104, SL_MAX_VERSION),
00088
00089 SLE_CONDVAR(Town, max_pass, SLE_FILE_U16 | SLE_VAR_U32, 0, 8),
00090 SLE_CONDVAR(Town, max_mail, SLE_FILE_U16 | SLE_VAR_U32, 0, 8),
00091 SLE_CONDVAR(Town, new_max_pass, SLE_FILE_U16 | SLE_VAR_U32, 0, 8),
00092 SLE_CONDVAR(Town, new_max_mail, SLE_FILE_U16 | SLE_VAR_U32, 0, 8),
00093 SLE_CONDVAR(Town, act_pass, SLE_FILE_U16 | SLE_VAR_U32, 0, 8),
00094 SLE_CONDVAR(Town, act_mail, SLE_FILE_U16 | SLE_VAR_U32, 0, 8),
00095 SLE_CONDVAR(Town, new_act_pass, SLE_FILE_U16 | SLE_VAR_U32, 0, 8),
00096 SLE_CONDVAR(Town, new_act_mail, SLE_FILE_U16 | SLE_VAR_U32, 0, 8),
00097
00098 SLE_CONDVAR(Town, max_pass, SLE_UINT32, 9, SL_MAX_VERSION),
00099 SLE_CONDVAR(Town, max_mail, SLE_UINT32, 9, SL_MAX_VERSION),
00100 SLE_CONDVAR(Town, new_max_pass, SLE_UINT32, 9, SL_MAX_VERSION),
00101 SLE_CONDVAR(Town, new_max_mail, SLE_UINT32, 9, SL_MAX_VERSION),
00102 SLE_CONDVAR(Town, act_pass, SLE_UINT32, 9, SL_MAX_VERSION),
00103 SLE_CONDVAR(Town, act_mail, SLE_UINT32, 9, SL_MAX_VERSION),
00104 SLE_CONDVAR(Town, new_act_pass, SLE_UINT32, 9, SL_MAX_VERSION),
00105 SLE_CONDVAR(Town, new_act_mail, SLE_UINT32, 9, SL_MAX_VERSION),
00106
00107 SLE_VAR(Town, pct_pass_transported, SLE_UINT8),
00108 SLE_VAR(Town, pct_mail_transported, SLE_UINT8),
00109
00110 SLE_VAR(Town, act_food, SLE_UINT16),
00111 SLE_VAR(Town, act_water, SLE_UINT16),
00112 SLE_VAR(Town, new_act_food, SLE_UINT16),
00113 SLE_VAR(Town, new_act_water, SLE_UINT16),
00114
00115 SLE_CONDVAR(Town, time_until_rebuild, SLE_UINT8, 0, 53),
00116 SLE_CONDVAR(Town, grow_counter, SLE_UINT8, 0, 53),
00117 SLE_CONDVAR(Town, growth_rate, SLE_UINT8, 0, 53),
00118
00119 SLE_CONDVAR(Town, time_until_rebuild, SLE_UINT16, 54, SL_MAX_VERSION),
00120 SLE_CONDVAR(Town, grow_counter, SLE_UINT16, 54, SL_MAX_VERSION),
00121 SLE_CONDVAR(Town, growth_rate, SLE_INT16, 54, SL_MAX_VERSION),
00122
00123 SLE_VAR(Town, fund_buildings_months, SLE_UINT8),
00124 SLE_VAR(Town, road_build_months, SLE_UINT8),
00125
00126 SLE_CONDVAR(Town, exclusivity, SLE_UINT8, 2, SL_MAX_VERSION),
00127 SLE_CONDVAR(Town, exclusive_counter, SLE_UINT8, 2, SL_MAX_VERSION),
00128
00129 SLE_CONDVAR(Town, larger_town, SLE_BOOL, 56, SL_MAX_VERSION),
00130 SLE_CONDVAR(Town, layout, SLE_UINT8, 113, SL_MAX_VERSION),
00131
00132
00133 SLE_CONDNULL(30, 2, SL_MAX_VERSION),
00134
00135 SLE_END()
00136 };
00137
00138
00139
00140 static const SaveLoad _house_id_mapping_desc[] = {
00141 SLE_VAR(EntityIDMapping, grfid, SLE_UINT32),
00142 SLE_VAR(EntityIDMapping, entity_id, SLE_UINT8),
00143 SLE_VAR(EntityIDMapping, substitute_id, SLE_UINT8),
00144 SLE_END()
00145 };
00146
00147 static void Save_HOUSEIDS()
00148 {
00149 uint j = _house_mngr.GetMaxMapping();
00150
00151 for (uint i = 0; i < j; i++) {
00152 SlSetArrayIndex(i);
00153 SlObject(&_house_mngr.mapping_ID[i], _house_id_mapping_desc);
00154 }
00155 }
00156
00157 static void Load_HOUSEIDS()
00158 {
00159 int index;
00160
00161 _house_mngr.ResetMapping();
00162 uint max_id = _house_mngr.GetMaxMapping();
00163
00164 while ((index = SlIterateArray()) != -1) {
00165 if ((uint)index >= max_id) break;
00166 SlObject(&_house_mngr.mapping_ID[index], _house_id_mapping_desc);
00167 }
00168 }
00169
00170 static void Save_TOWN()
00171 {
00172 Town *t;
00173
00174 FOR_ALL_TOWNS(t) {
00175 SlSetArrayIndex(t->index);
00176 SlObject(t, _town_desc);
00177 }
00178 }
00179
00180 static void Load_TOWN()
00181 {
00182 int index;
00183
00184 _total_towns = 0;
00185
00186 while ((index = SlIterateArray()) != -1) {
00187 Town *t = new (index) Town();
00188 SlObject(t, _town_desc);
00189
00190 _total_towns++;
00191 }
00192 }
00193
00194 extern const ChunkHandler _town_chunk_handlers[] = {
00195 { 'HIDS', Save_HOUSEIDS, Load_HOUSEIDS, CH_ARRAY },
00196 { 'CITY', Save_TOWN, Load_TOWN, CH_ARRAY | CH_LAST},
00197 };