68
64
void building_writer_t::write_obj(FILE* fp, obj_node_t& parent, tabfileobj_t& obj)
72
66
// Hajo: take care, hardocded size of node on disc here!
73
67
obj_node_t node(this, 26, &parent);
75
69
write_head(fp, node, obj);
77
besch.groesse = koord(1, 1);
80
74
int* ints = obj.get_ints("dims");
84
case 3: besch.layouts = ints[3]; /* FALLTHROUGH */
85
case 2: besch.groesse.y = ints[2]; /* FALLTHROUGH */
86
case 1: besch.groesse.x = ints[1]; /* FALLTHROUGH */
78
case 3: layouts = ints[3]; /* FALLTHROUGH */
79
case 2: groesse.y = ints[2]; /* FALLTHROUGH */
80
case 1: groesse.x = ints[1]; /* FALLTHROUGH */
89
if (besch.layouts == 0) {
90
besch.layouts = besch.groesse.x == besch.groesse.y ? 1 : 2;
84
layouts = groesse.x == groesse.y ? 1 : 2;
94
besch.gtyp = gebaeude_t::unbekannt;
95
besch.utype = haus_besch_t::unbekannt;
97
besch.allowed_climates = all_but_water_climate; // all but water
99
besch.level = obj.get_int("level", 1) - 1;
100
besch.flags = haus_besch_t::flag_t(
101
(obj.get_int("noinfo", 0) > 0 ? haus_besch_t::FLAG_KEINE_INFO : 0) |
102
(obj.get_int("noconstruction", 0) > 0 ? haus_besch_t::FLAG_KEINE_GRUBE : 0) |
103
(obj.get_int("needs_ground", 0) > 0 ? haus_besch_t::FLAG_NEED_GROUND : 0)
105
besch.animation_time = obj.get_int("animation_time", 300);
88
gebaeude_t::typ gtyp = gebaeude_t::unbekannt;
89
haus_besch_t::utyp utype = haus_besch_t::unbekannt;
90
uint16 extra_data = 0;
91
climate_bits allowed_climates = all_but_water_climate; // all but water
93
uint16 level = obj.get_int("level", 1) - 1;
94
haus_besch_t::flag_t const flags =
95
(obj.get_int("noinfo", 0) > 0 ? haus_besch_t::FLAG_KEINE_INFO : haus_besch_t::FLAG_NULL) |
96
(obj.get_int("noconstruction", 0) > 0 ? haus_besch_t::FLAG_KEINE_GRUBE : haus_besch_t::FLAG_NULL) |
97
(obj.get_int("needs_ground", 0) > 0 ? haus_besch_t::FLAG_NEED_GROUND : haus_besch_t::FLAG_NULL);
98
uint16 const animation_time = obj.get_int("animation_time", 300);
107
100
// get the allowed area for this building
108
101
const char* climate_str = obj.get("climates");
109
102
if (climate_str && strlen(climate_str) > 4) {
110
besch.allowed_climates = get_climate_bits(climate_str);
103
allowed_climates = get_climate_bits(climate_str);
113
106
const char* type_name = obj.get("type");
114
107
if (!STRICMP(type_name, "res")) {
115
besch.gtyp = gebaeude_t::wohnung;
108
gtyp = gebaeude_t::wohnung;
116
109
} else if (!STRICMP(type_name, "com")) {
117
besch.gtyp = gebaeude_t::gewerbe;
110
gtyp = gebaeude_t::gewerbe;
118
111
} else if (!STRICMP(type_name, "ind")) {
119
besch.gtyp = gebaeude_t::industrie;
112
gtyp = gebaeude_t::industrie;
120
113
} else if (!STRICMP(type_name, "cur")) {
121
besch.extra_data = obj.get_int("build_time", 0);
122
besch.level = obj.get_int("passengers", besch.level);
123
besch.utype = besch.extra_data == 0 ? haus_besch_t::attraction_land : haus_besch_t::attraction_city;
114
extra_data = obj.get_int("build_time", 0);
115
level = obj.get_int("passengers", level);
116
utype = extra_data == 0 ? haus_besch_t::attraction_land : haus_besch_t::attraction_city;
124
117
} else if (!STRICMP(type_name, "mon")) {
125
besch.utype = haus_besch_t::denkmal;
126
besch.level = obj.get_int("passengers", besch.level);
118
utype = haus_besch_t::denkmal;
119
level = obj.get_int("passengers", level);
127
120
} else if (!STRICMP(type_name, "tow")) {
128
besch.level = obj.get_int("passengers", besch.level);
129
besch.extra_data = obj.get_int("build_time", 0);
130
besch.utype = haus_besch_t::rathaus;
121
level = obj.get_int("passengers", level);
122
extra_data = obj.get_int("build_time", 0);
123
utype = haus_besch_t::rathaus;
131
124
} else if (!STRICMP(type_name, "hq")) {
132
besch.level = obj.get_int("passengers", besch.level);
133
besch.extra_data = obj.get_int("hq_level", 0);
134
besch.utype = haus_besch_t::firmensitz;
125
level = obj.get_int("passengers", level);
126
extra_data = obj.get_int("hq_level", 0);
127
utype = haus_besch_t::firmensitz;
135
128
} else if (!STRICMP(type_name, "habour") || !STRICMP(type_name, "harbour")) {
136
besch.utype = haus_besch_t::hafen;
137
besch.extra_data = water_wt;
129
utype = haus_besch_t::hafen;
130
extra_data = water_wt;
138
131
} else if (!STRICMP(type_name, "fac")) {
139
besch.utype = haus_besch_t::fabrik;
132
utype = haus_besch_t::fabrik;
141
134
} else if (!STRICMP(type_name, "stop")) {
142
besch.utype = haus_besch_t::generic_stop;
143
besch.extra_data = get_waytype(obj.get("waytype"));
135
utype = haus_besch_t::generic_stop;
136
extra_data = get_waytype(obj.get("waytype"));
144
137
} else if (!STRICMP(type_name, "extension")) {
145
besch.utype = haus_besch_t::generic_extension;
138
utype = haus_besch_t::generic_extension;
146
139
const char *wt = obj.get("waytype");
147
140
if(wt && *wt>' ') {
148
141
// not waytype => just a generic exten that fits all
149
besch.extra_data = get_waytype(wt);
142
extra_data = get_waytype(wt);
151
144
} else if (!STRICMP(type_name, "depot")) {
152
besch.utype = haus_besch_t::depot;
153
besch.extra_data = get_waytype(obj.get("waytype"));
145
utype = haus_besch_t::depot;
146
extra_data = get_waytype(obj.get("waytype"));
154
147
} else if (!STRICMP(type_name, "any") || *type_name == '\0') {
155
148
// for instance "MonorailGround"
156
besch.utype = haus_besch_t::weitere;
149
utype = haus_besch_t::weitere;
158
151
!STRICMP(type_name, "station") ||
159
152
!STRICMP(type_name, "railstop") ||
178
171
if (obj.get_int("enables_pax", 0) > 0) {
181
174
if (obj.get_int("enables_post", 0) > 0) {
184
if (besch.utype == haus_besch_t::fabrik || obj.get_int("enables_ware", 0) > 0) {
177
if( utype == haus_besch_t::fabrik || obj.get_int("enables_ware", 0) > 0 ) {
188
// some station thing ...
181
if( utype==haus_besch_t::generic_extension || utype==haus_besch_t::generic_stop || utype==haus_besch_t::hafen || utype==haus_besch_t::depot || utype==haus_besch_t::fabrik ) {
182
// since elevel was reduced by one beforehand ...
193
186
// Hajo: read chance - default is 100% chance to be built
194
besch.chance = obj.get_int("chance", 100) ;
187
uint8 const chance = obj.get_int("chance", 100);
196
189
// prissi: timeline for buildings
197
besch.intro_date = obj.get_int("intro_year", DEFAULT_INTRO_DATE) * 12;
198
besch.intro_date += obj.get_int("intro_month", 1) - 1;
190
uint16 const intro_date =
191
obj.get_int("intro_year", DEFAULT_INTRO_DATE) * 12 +
192
obj.get_int("intro_month", 1) - 1;
200
besch.obsolete_date = obj.get_int("retire_year", DEFAULT_RETIRE_DATE) * 12;
201
besch.obsolete_date += obj.get_int("retire_month", 1) - 1;
194
uint16 const obsolete_date =
195
obj.get_int("retire_year", DEFAULT_RETIRE_DATE) * 12 +
196
obj.get_int("retire_month", 1) - 1;
203
198
// scan for most number of seasons
205
for (int l = 0; l < besch.layouts; l++) { // each layout
206
for (int y = 0; y < besch.get_h(l); y++) {
207
for (int x = 0; x < besch.get_b(l); x++) { // each tile
200
for (int l = 0; l < layouts; l++) { // each layout
201
int const h = l & 1 ? groesse.x : groesse.y;
202
int const w = l & 1 ? groesse.y : groesse.x;
203
for (int y = 0; y < h; ++y) {
204
for (int x = 0; x < w; ++x) { // each tile
208
205
for (int pos = 0; pos < 2; pos++) {
209
206
for (int season = seasons; season < 12; season++) {
280
279
// Hajo: write version data
281
node.write_uint16(fp, 0x8005, 0);
280
node.write_uint16(fp, 0x8006, 0);
283
282
// Hajo: write besch data
284
node.write_uint8 (fp, (uint8) besch.gtyp, 2);
285
node.write_uint8 (fp, (uint8) besch.utype, 3);
286
node.write_uint16(fp, (uint16) besch.level, 4);
287
node.write_uint32(fp, (uint32) besch.extra_data, 6);
288
node.write_uint16(fp, besch.groesse.x, 10);
289
node.write_uint16(fp, besch.groesse.y, 12);
290
node.write_uint8 (fp, (uint8) besch.layouts, 14);
291
node.write_uint16(fp, (uint16) besch.allowed_climates, 15);
292
node.write_uint8 (fp, (uint8) besch.enables, 17);
293
node.write_uint8 (fp, (uint8) besch.flags, 18);
294
node.write_uint8 (fp, (uint8) besch.chance, 19);
295
node.write_uint16(fp, besch.intro_date, 20);
296
node.write_uint16(fp, besch.obsolete_date, 22);
297
node.write_uint16(fp, besch.animation_time, 24);
283
node.write_uint8 (fp, gtyp, 2);
284
node.write_uint8 (fp, utype, 3);
285
node.write_uint16(fp, level, 4);
286
node.write_uint32(fp, extra_data, 6);
287
node.write_uint16(fp, groesse.x, 10);
288
node.write_uint16(fp, groesse.y, 12);
289
node.write_uint8 (fp, layouts, 14);
290
node.write_uint16(fp, allowed_climates, 15);
291
node.write_uint8 (fp, enables, 17);
292
node.write_uint8 (fp, flags, 18);
293
node.write_uint8 (fp, chance, 19);
294
node.write_uint16(fp, intro_date, 20);
295
node.write_uint16(fp, obsolete_date, 22);
296
node.write_uint16(fp, animation_time, 24);
299
298
// probably add some icons, if defined
300
299
slist_tpl<string> cursorkeys;