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
|
/*
* Copyright (c) 1997 - 2002 Hansjrg Malthaner
*
* This file is part of the Simutrans project under the artistic licence.
*/
#ifndef simplay_h
#define simplay_h
#include "../dataobj/pwd_hash.h"
#include "../simtypes.h"
#include "../simlinemgmt.h"
#include "../halthandle_t.h"
#include "../convoihandle_t.h"
#include "../dataobj/koord.h"
#include "../tpl/slist_tpl.h"
#include "../tpl/vector_tpl.h"
enum player_cost {
COST_CONSTRUCTION=0,// Construction
COST_VEHICLE_RUN, // Vehicle running costs
COST_NEW_VEHICLE, // New vehicles
COST_INCOME, // Income
COST_MAINTENANCE, // Upkeep
COST_ASSETS, // value of all vehicles and buildings
COST_CASH, // Cash
COST_NETWEALTH, // Total Cash + Assets
COST_PROFIT, // COST_POWERLINES+COST_INCOME-(COST_CONSTRUCTION+COST_VEHICLE_RUN+COST_NEW_VEHICLE+COST_MAINTENANCE)
COST_OPERATING_PROFIT, // COST_POWERLINES+COST_INCOME-(COST_VEHICLE_RUN+COST_MAINTENANCE)
COST_MARGIN, // COST_OPERATING_PROFIT/COST_INCOME
COST_ALL_TRANSPORTED, // all transported goods
COST_POWERLINES, // revenue from the power grid
COST_TRANSPORTED_PAS, // number of passengers that actually reached destination
COST_TRANSPORTED_MAIL,
COST_TRANSPORTED_GOOD,
COST_ALL_CONVOIS, // number of convois
COST_SCENARIO_COMPLETED,// scenario success (only useful if there is one ... )
COST_WAY_TOLLS,
MAX_PLAYER_COST
};
#define MAX_PLAYER_HISTORY_YEARS (12) // number of years to keep history
#define MAX_PLAYER_HISTORY_MONTHS (12) // number of months to keep history
class karte_t;
class fabrik_t;
class koord3d;
class werkzeug_t;
/**
* play info for simutrans human and AI are derived from this class
*/
class spieler_t
{
public:
enum { MAX_KONTO_VERZUG = 3 };
enum { EMPTY=0, HUMAN=1, AI_GOODS=2, AI_PASSENGER=3, MAX_AI, PASSWORD_PROTECTED=128 };
protected:
char spieler_name_buf[256];
/*
* holds total number of all halts, ever built
* @author hsiegeln
*/
sint32 haltcount;
/**
* Finance History - will supercede the finances by Owen Rudge
* Will hold finances for the most recent 12 years
* @author hsiegeln
*/
sint64 finance_history_year[MAX_PLAYER_HISTORY_YEARS][MAX_PLAYER_COST];
sint64 finance_history_month[MAX_PLAYER_HISTORY_MONTHS][MAX_PLAYER_COST];
/**
* Monthly maintenance cost
* @author Hj. Malthaner
*/
sint32 maintenance;
/**
* Die Welt in der gespielt wird.
*
* @author Hj. Malthaner
*/
static karte_t *welt;
/**
* Der Kontostand.
*
* @author Hj. Malthaner
*/
sint64 konto;
// remember the starting money
sint64 starting_money;
/**
* Zhlt wie viele Monate das Konto schon ueberzogen ist
*
* @author Hj. Malthaner
*/
sint32 konto_ueberzogen;
slist_tpl<halthandle_t> halt_list; ///< Liste der Haltestellen
class income_message_t {
public:
char str[33];
koord pos;
sint32 amount;
sint8 alter;
income_message_t() { str[0]=0; alter=127; pos=koord::invalid; amount=0; }
income_message_t( sint32 betrag, koord pos );
void * operator new(size_t s);
void operator delete(void *p);
};
slist_tpl<income_message_t *>messages;
void add_message(koord k, sint32 summe);
/**
* Kennfarbe (Fahrzeuge, Gebude) des Speielers
* @author Hj. Malthaner
*/
uint8 kennfarbe1, kennfarbe2;
/**
* Player number; only player 0 can do interaction
* @author Hj. Malthaner
*/
uint8 player_nr;
/**
* Adds somme amount to the maintenance costs
* @param change the change
* @return the new maintenance costs
* @author Hj. Malthaner
*/
sint32 add_maintenance(sint32 change)
{
maintenance += change;
return maintenance;
}
/**
* Ist dieser Spieler ein automatischer Spieler?
* @author Hj. Malthaner
*/
bool automat;
/**
* Are this player allowed to do any changes?
* @author Hj. Malthaner
*/
bool locked;
bool unlock_pending;
// contains the password hash for local games
pwd_hash_t pwd_hash;
public:
virtual bool set_active( bool b ) { return automat = b; }
bool is_active() const { return automat; }
bool is_locked() const { return locked; }
bool is_unlock_pending() const { return unlock_pending; }
void unlock(bool unlock_, bool unlock_pending_=false) { locked = !unlock_; unlock_pending = unlock_pending_; }
void check_unlock( const pwd_hash_t& hash ) { locked = (pwd_hash != hash); }
// some routine needs this for direct manipulation
pwd_hash_t& access_password_hash() { return pwd_hash; }
// this type of AIs identifier
virtual uint8 get_ai_id() const { return HUMAN; }
// @author hsiegeln
simlinemgmt_t simlinemgmt;
/**
* Age messages (move them upwards)
* @author Hj. Malthaner
*/
void age_messages(long delta_t);
/* Handles player colors ...
* @author prissi
*/
uint8 get_player_color1() const { return kennfarbe1; }
uint8 get_player_color2() const { return kennfarbe2; }
void set_player_color(uint8 col1, uint8 col2);
/**
* Name of the player
* @author player
*/
const char* get_name() const;
void set_name(const char *);
sint8 get_player_nr() const {return player_nr; }
/**
* return true, if the owner is none, myself or player(1), i.e. the ownership can be taken by player test
* @author prissi
*/
static bool check_owner( const spieler_t *owner, const spieler_t *test );
/**
* @param welt Die Welt (Karte) des Spiels
* @param color Kennfarbe des Spielers
* @author Hj. Malthaner
*/
spieler_t(karte_t *welt, uint8 player_nr );
virtual ~spieler_t();
sint32 get_maintenance() const { return maintenance; }
static sint32 add_maintenance(spieler_t *sp, sint32 change) {
if(sp) {
sp->maintenance += change;
return sp->maintenance;
}
return 0;
}
// Owen Rudge, finances
void buche(sint64 betrag, koord k, player_cost type);
// do the internal accounting (currently only used externally for running costs of convois)
void buche(sint64 betrag, player_cost type);
// this is also save to be called with sp==NULL, which may happen for unowned objects like bridges, ways, trees, ...
static void accounting(spieler_t* sp, sint64 betrag, koord k, player_cost pc);
/**
* @return Kontostand als double (Gleitkomma) Wert
* @author Hj. Malthaner
*/
double get_konto_als_double() const { return konto / 100.0; }
/**
* @return true wenn Konto berzogen ist
* @author Hj. Malthaner
*/
int get_konto_ueberzogen() const { return konto_ueberzogen; }
/**
* Zeigt Meldungen aus der Queue des Spielers auf dem Bildschirm an
* @author Hj. Malthaner
*/
void display_messages();
/**
* Wird von welt in kurzen abstnden aufgerufen
* @author Hj. Malthaner
*/
virtual void step();
/**
* Wird von welt nach jedem monat aufgerufen
* @author Hj. Malthaner
*/
virtual void neuer_monat();
/**
* Methode fuer jaehrliche Aktionen
* @author Hj. Malthaner
*/
virtual void neues_jahr() {}
/**
* Erzeugt eine neue Haltestelle des Spielers an Position pos
* @author Hj. Malthaner
*/
halthandle_t halt_add(koord pos);
/**
* needed to transfer ownership
* @author prissi
*/
void halt_add(halthandle_t h);
/**
* Entfernt eine Haltestelle des Spielers aus der Liste
* @author Hj. Malthaner
*/
void halt_remove(halthandle_t halt);
/**
* Gets haltcount, for naming purposes
* @author hsiegeln
*/
int get_haltcount() const { return haltcount; }
/**
* Ldt oder speichert Zustand des Spielers
* @param file die offene Save-Datei
* @author Hj. Malthaner
*/
virtual void rdwr(loadsave_t *file);
/*
* called after game is fully loaded;
*/
virtual void laden_abschliessen();
virtual void rotate90( const sint16 y_size );
/**
* Returns the finance history for player
* @author hsiegeln
*/
sint64 get_finance_history_year(int year, int type) { return finance_history_year[year][type]; }
sint64 get_finance_history_month(int month, int type) { return finance_history_month[month][type]; }
/**
* Returns pointer to finance history for player
* @author hsiegeln
*/
sint64* get_finance_history_year() { return *finance_history_year; }
sint64* get_finance_history_month() { return *finance_history_month; }
/**
* Returns the world the player is in
* @author hsiegeln
*/
static karte_t *get_welt() { return welt; }
/**
* Calculates the finance history for player
* @author hsiegeln
*/
void calc_finance_history();
/**
* Calculates the assets of the player
*/
void calc_assets();
/**
* Updates the assets value of the player
*/
void update_assets(sint64 const delta);
/**
* rolls the finance history for player (needed when neues_jahr() or neuer_monat()) triggered
* @author hsiegeln
*/
void roll_finance_history_year();
void roll_finance_history_month();
/**
* Rckruf, um uns zu informieren, dass ein Vehikel ein Problem hat
* @author Hansjrg Malthaner
* @date 26-Nov-2001
*/
virtual void bescheid_vehikel_problem(convoihandle_t cnv,const koord3d ziel);
/**
* Tells the player the result of tool-work commands
* If player is active then play sound, popup error msg etc
* AI players react upon this call and proceed
* local is true if tool was called by player on our client
* @author Dwachs
*/
virtual void tell_tool_result(werkzeug_t *tool, koord3d pos, const char *err, bool local);
/**
* Tells the player that the factory
* is going to be deleted (flag==0)
* Bernd Gabriel, Dwachs
*/
enum notification_factory_t {
notify_delete // notified immediately before object is deleted (and before nulled in the slist_tpl<>)!
};
virtual void notify_factory(notification_factory_t, const fabrik_t*) {}
private:
/* undo informations *
* @author prissi
*/
vector_tpl<koord3d> last_built;
waytype_t undo_type;
public:
void init_undo(waytype_t t, unsigned short max );
void add_undo(koord3d k);
sint64 undo();
// headquarter stuff
private:
sint32 headquarter_level;
koord headquarter_pos;
public:
void add_headquarter(short hq_level, koord hq_pos)
{
headquarter_level = hq_level;
headquarter_pos = hq_pos;
}
koord get_headquarter_pos(void) const { return headquarter_pos; }
short get_headquarter_level(void) const { return headquarter_level; }
void ai_bankrupt();
};
#endif
|