forked from aburch/simutrans
-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathsimcity.h
481 lines (372 loc) · 11.3 KB
/
simcity.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
/*
* simcity.h
*
* Copyright (c) 1997 - 2001 Hansjörg Malthaner
*
* This file is part of the Simutrans project and may not be used
* in other projects without written permission of the author.
*/
#ifndef simcity_h
#define simcity_h
#include "simdings.h"
#include "dings/gebaeude.h"
#include "tpl/slist_tpl.h"
#include "tpl/vector_tpl.h"
#include "tpl/weighted_vector_tpl.h"
#include "tpl/array_tpl.h"
#include "tpl/array2d_tpl.h"
class karte_t;
class spieler_t;
class haltestelle_t;
class cstring_t;
class cbuffer_t;
class stadt_info_t;
struct hausbesch;
// part of passengers going to factories or toursit attractions (100% mx)
#define FACTORY_PAX 33 // workers
#define TOURIST_PAX 16 // tourists
// other long-distance travellers
#define MAX_CITY_HISTORY_YEARS 12 // number of years to keep history
#define MAX_CITY_HISTORY_MONTHS 12 // number of months to keep history
#define MAX_CITY_HISTORY 4 // Total number of items in array
#define HIST_CITICENS 0 // total people
#define HIST_GROWTH 1 // growth (just for convenience)
#define HIST_TRANSPORTED 2
#define HIST_GENERATED 3
/**
* Die Objecte der Klasse stadt_t bilden die Staedte in Simu. Sie
* wachsen automatisch.
* @version 0.7
* @author Hj. Malthaner
*/
class stadt_t {
/**
* best_t:
*
* Kleine Hilfsklasse - speichert die beste Bewertung einer Position.
*
* @author V. Meyer
*/
class best_t {
int best_wert;
koord best_pos;
public:
void reset(koord pos) { best_wert = 0; best_pos = pos; }
void check(koord pos, int wert) {
if(wert > best_wert) {
best_wert = wert;
best_pos = pos;
}
}
bool found() const { return best_wert > 0; }
koord gib_pos() const { return best_pos;}
// int gib_wert() const { return best_wert; }
};
private:
/**
* Ein Step alle step_intervall/1000 Sekunden.
* @author Hj. Malthaner
*/
static const int step_interval;
public:
/**
* Reads city configuration data
* @author Hj. Malthaner
*/
static bool init();
private:
static karte_t *welt;
spieler_t *besitzer_p;
char name[64];
array2d_tpl<unsigned char> pax_ziele_alt;
array2d_tpl<unsigned char> pax_ziele_neu;
koord pos; // Gruendungsplanquadrat der Stadt
int ob, un, li, re; // aktuelle Ausdehnung
// das wird bei jedem laden wieder von 0 angefangen
// step wird nicht gespeichert!!!
int step_count;
/**
* Echtzeitpunkt für nächsten step.
* @author Hj. Malthaner
*/
unsigned long next_step;
// attribute fuer die Bevoelkerung
int bev; // Bevoelkerung gesamt
int arb; // davon mit Arbeit
int won; // davon mit Wohnung
/**
* Counter: possible passengers in this month
* transient data, not saved
* @author Hj. Malthaner
*/
int pax_erzeugt;
/**
* Counter: transported passengers in this month
* transient data, not saved
* @author Hj. Malthaner
*/
int pax_transport;
/**
* Modifier for city growth
* transient data, not saved
* @author Hj. Malthaner
*/
int wachstum;
/**
* City history
* @author prissi
*/
sint64 city_history_year[MAX_CITY_HISTORY_YEARS][MAX_CITY_HISTORY];
sint64 city_history_month[MAX_CITY_HISTORY_MONTHS][MAX_CITY_HISTORY];
int last_month_bev;
int last_year_bev;
int this_year_pax, this_year_transported;
/* updates the city history
* @author prissi
*/
void roll_history(void);
stadt_info_t *stadt_info;
public:
/**
* Returns pointer to history for city
* @author hsiegeln
*/
sint64* get_city_history_year() {return *city_history_year;};
sint64* get_city_history_month() {return *city_history_month;};
/* returns the money dialoge of a city
* @author prissi
*/
stadt_info_t *gib_stadt_info();
// just needed by stadt_info.cc
static inline karte_t *gib_welt() { return welt; };
/* end of histroy related thingies */
private:
int best_haus_wert;
int best_strasse_wert;
best_t best_haus;
best_t best_strasse;
koord strasse_anfang_pos;
koord strasse_best_anfang_pos;
/**
* Arbeitsplätze der Einwohner
* @author Hj. Malthaner
*/
weighted_vector_tpl<fabrik_t *> arbeiterziele;
/**
* allokiert pax_ziele_alt/neu und init. die werte
* @author Hj. Malthaner
*/
void init_pax_ziele();
/**
* plant das bauen von Gebaeuden
* @author Hj. Malthaner
*/
void step_bau();
typedef enum { no_return=0, factoy_return, tourist_return, town_return } pax_zieltyp;
/**
* verteilt die Passagiere auf die Haltestellen
* @author Hj. Malthaner
*/
void step_passagiere();
/**
* ein Passagierziel in die Zielkarte eintragen
* @author Hj. Malthaner
*/
void merke_passagier_ziel(koord ziel, int color);
/**
* baut Spezialgebaeude, z.B Stadion
* @author Hj. Malthaner
*/
void check_bau_spezial(bool);
/**
* baut ein angemessenes Rathaus
* @author V. Meyer
*/
void check_bau_rathaus(bool);
/**
* constructs a new consumer
* @author prissi
*/
void check_bau_factory(bool);
void bewerte();
// bewertungsfunktionen fuer den Hauserbau
// wie gut passt so ein Gebaeudetyp an diese Stelle ?
gebaeude_t::typ was_ist_an(koord pos) const;
int bewerte_industrie(koord pos);
int bewerte_gewerbe(koord pos);
int bewerte_wohnung(koord pos);
/**
* baut ein Gebaeude auf Planquadrat x,y
*/
void baue_gebaeude(koord pos);
void erzeuge_verkehrsteilnehmer(koord pos, int level);
void renoviere_gebaeude(koord pos);
/**
* baut ein Stueck Strasse
*
* @param k Bauposition
*
* @author Hj. Malthaner, V. Meyer
*/
bool baue_strasse(koord k, spieler_t *sp, bool forced);
void baue();
/**
* Symbols in rules:
* S = darf keine Strasse sein
* s = muss Strasse sein
* n = muss Natur sein
* . = beliebig
*
* @param pos position to check
* @param regel the rule to evaluate
* @return true on match, false otherwise
* @author Hj. Malthaner
*/
bool bewerte_loc(koord pos, const char *regel);
/**
* Check rule in all transformations at given position
* @author Hj. Malthaner
*/
int bewerte_pos(koord pos, const char *regel);
void bewerte_strasse(koord pos, int rd, char *regel);
void bewerte_haus(koord pos, int rd, char *regel);
void trans_y(const char *regel, char *tr);
void trans_l(const char *regel, char *tr);
void trans_r(const char *regel, char *tr);
void pruefe_grenzen(koord pos);
// fuer die haltestellennamen
int zentrum_namen_cnt, aussen_namen_cnt;
public:
/**
* sucht arbeitsplätze für die Einwohner
* @author Hj. Malthaner
*/
void verbinde_fabriken();
/* returns all factories connected to this city ...
* @author: prissi
*/
const weighted_vector_tpl<fabrik_t *> & gib_arbeiterziele() const {return arbeiterziele;};
int gib_pax_erzeugt() const {return pax_erzeugt;};
int gib_pax_transport() const {return pax_transport;};
int gib_wachstum() const {return wachstum;};
/**
* ermittelt die Einwohnerzahl der Stadt
* @author Hj. Malthaner
*/
int gib_einwohner() const {return bev;};
/**
* Gibt den Namen der Stadt zurück.
* @author Hj. Malthaner
*/
const char * gib_name() const {return name;};
/**
* Ermöglicht Zugriff auf Namesnarray
* @author Hj. Malthaner
*/
char * access_name() {return name;};
/**
* gibt einen zufällingen gleichverteilten Punkt innerhalb der
* Stadtgrenzen zurück
* @author Hj. Malthaner
*/
koord gib_zufallspunkt() const;
/**
* gibt das pax-statistik-array für letzten monat zurück
* @author Hj. Malthaner
*/
const array2d_tpl<unsigned char> * gib_pax_ziele_alt() const {return &pax_ziele_alt;};
/**
* gibt das pax-statistik-array für den aktuellen monat zurück
* @author Hj. Malthaner
*/
const array2d_tpl<unsigned char> * gib_pax_ziele_neu() const {return &pax_ziele_neu;};
/**
* Erzeugt eine neue Stadt auf Planquadrat (x,y) die dem Spieler sp
* gehoert.
* @param welt Die Karte zu der die Stadt gehoeren soll.
* @param sp Der Besitzer der Stadt.
* @param x x-Planquadratkoordinate
* @param y y-Planquadratkoordinate
* @param number of citizens
* @author Hj. Malthaner
*/
stadt_t(karte_t *welt, spieler_t *sp, koord pos,int citizens);
/**
* Erzeugt eine neue Stadt nach Angaben aus der Datei file.
* @param welt Die Karte zu der die Stadt gehoeren soll.
* @param file Zeiger auf die Datei mit den Stadtbaudaten.
* @see stadt_t::speichern()
* @author Hj. Malthaner
*/
stadt_t(karte_t *welt, loadsave_t *file);
// closes window and that stuff
~stadt_t();
/**
* Speichert die Daten der Stadt in der Datei file so, dass daraus
* die Stadt wieder erzeugt werden kann. Die Gebaude und strassen der
* Stadt werden nicht mit der Stadt gespeichert sondern mit den
* Planquadraten auf denen sie stehen.
* @see stadt_t::stadt_t()
* @see planquadrat_t
* @author Hj. Malthaner
*/
void rdwr(loadsave_t *file);
/**
* Wird am Ende der LAderoutine aufgerufen, wenn die Welt geladen ist
* und nur noch die Datenstrukturenneu verknüpft werden müssen.
* @author Hj. Malthaner
*/
void laden_abschliessen();
/* change size of city
* @author prissi */
void change_size( long delta_citicens );
void step();
void neuer_monat();
/**
* such ein (zufälliges) ziel für einen Passagier
* @author Hj. Malthaner
*/
koord finde_passagier_ziel(pax_zieltyp *will_return);
/**
* Gibt die Gruendungsposition der Stadt zurueck.
* @return die Koordinaten des Gruendungsplanquadrates
* @author Hj. Malthaner
*/
inline koord gib_pos() const {return pos;};
inline koord get_linksoben() const { return koord(li, ob);};
inline koord get_rechtsunten() const { return koord(re, un);};
/**
* Gibt den Namen der Stadt zurueck.
* @return den Namen der Stadt
* @author Hj. Malthaner
*/
inline const char * get_name() const {return name;};
/**
* Creates a station name
* @param number if >= 0, then a number is added to the name
* @author Hj. Malthaner
*/
const char * haltestellenname(koord pos, const char *typ, int number);
/**
* Erzeugt ein Array zufaelliger Startkoordinaten,
* die fuer eine Stadtgruendung geeignet sind.
* @param wl Die Karte auf der die Stadt gegruendet werden soll.
* @param anzahl die Anzahl der zu liefernden Koordinaten
* @author Hj. Malthaner
*/
static vector_tpl<koord> *random_place(const karte_t *wl, int anzahl); // geeigneten platz zur Stadtgruendung durch Zufall ermitteln
/**
* @return Einen Beschreibungsstring für das Objekt, der z.B. in einem
* Beobachtungsfenster angezeigt wird.
* @author Hj. Malthaner
* @see simwin
*/
char *info(char *buf) const;
/**
* A short info about the city stats
* @author Hj. Malthaner
*/
void get_short_info(cbuffer_t & buf) const;
void add_factory_arbeiterziel(fabrik_t *fab);
};
#endif