dopewars.h (13891B)
1 /************************************************************************ 2 * dopewars.h Common structures and stuff for dopewars * 3 * Copyright (C) 1998-2021 Ben Webb * 4 * Email: benwebb@users.sf.net * 5 * WWW: https://dopewars.sourceforge.io/ * 6 * * 7 * This program is free software; you can redistribute it and/or * 8 * modify it under the terms of the GNU General Public License * 9 * as published by the Free Software Foundation; either version 2 * 10 * of the License, or (at your option) any later version. * 11 * * 12 * This program is distributed in the hope that it will be useful, * 13 * but WITHOUT ANY WARRANTY; without even the implied warranty of * 14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * 15 * GNU General Public License for more details. * 16 * * 17 * You should have received a copy of the GNU General Public License * 18 * along with this program; if not, write to the Free Software * 19 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, * 20 * MA 02111-1307, USA. * 21 ************************************************************************/ 22 23 #ifndef __DP_DOPEWARS_H__ 24 #define __DP_DOPEWARS_H__ 25 26 #ifdef HAVE_CONFIG_H 27 #include <config.h> 28 #endif 29 30 #include <stdio.h> 31 32 /* Be careful not to include both sys/time.h and time.h on those systems 33 * which don't like it */ 34 #if TIME_WITH_SYS_TIME 35 #include <sys/time.h> 36 #include <time.h> 37 #else 38 #ifdef HAVE_SYS_TIME_H 39 #include <sys/time.h> 40 #else 41 #include <time.h> 42 #endif 43 #endif 44 45 #include <glib.h> 46 #include "convert.h" 47 #include "error.h" 48 #include "network.h" 49 #include "util.h" 50 51 /* Make price_t be a long long if the type is supported by the compiler */ 52 #if SIZEOF_LONG_LONG == 0 53 typedef long price_t; 54 #else 55 typedef long long price_t; 56 #endif 57 58 /* "Abilities" are protocol extensions, which are negotiated between the 59 * client and server at connect-time. */ 60 typedef enum { 61 A_PLAYERID = 0, /* Use numeric IDs rather than player 62 * names in network messages */ 63 A_DRUGVALUE, /* Server keeps track of purchase price 64 * of drugs */ 65 A_NEWFIGHT, /* Use new unified fighting code */ 66 A_TSTRING, /* We understand the %Txx (tstring) 67 * notation */ 68 A_DONEFIGHT, /* A fight is only considered over once the 69 * client sends the server a C_DONE message */ 70 A_UTF8, /* All strings are sent over the network using 71 * UTF-8 (Unicode) encoding */ 72 A_DATE, /* We can understand "proper" dd-mm-yy dates 73 * rather than just turn numbers */ 74 A_NUM /* N.B. Must be last */ 75 } AbilType; 76 77 typedef struct ABILITIES { 78 gboolean Local[A_NUM]; /* Abilities that we have */ 79 gboolean Remote[A_NUM]; /* Those that the other end of the 80 * connection has */ 81 gboolean Shared[A_NUM]; /* Abilites shared by us and the 82 * remote host */ 83 gint RemoteNum; /* The remote host's idea of what A_NUM is */ 84 } Abilities; 85 86 struct NAMES { 87 gchar *Bitch, *Bitches, *Gun, *Guns, *Drug, *Drugs; 88 gchar *Date, *LoanSharkName, *BankName; 89 gchar *GunShopName, *RoughPubName; 90 }; 91 92 struct SOUNDS { 93 gchar *FightHit, *FightMiss, *FightReload, *Jet, *TalkToAll, *TalkPrivate; 94 gchar *JoinGame, *LeaveGame, *StartGame, *EndGame; 95 gchar *EnemyBitchKilled, *BitchKilled, *EnemyKilled, *Killed; 96 gchar *EnemyFailFlee, *FailFlee, *EnemyFlee, *Flee; 97 }; 98 99 #ifdef NETWORKING 100 101 struct METASERVER { 102 gboolean Active; 103 gchar *URL; 104 gchar *LocalName, *Password, *Comment; 105 }; 106 #endif 107 108 struct CURRENCY { 109 gchar *Symbol; 110 gboolean Prefix; 111 }; 112 113 struct PRICES { 114 price_t Spy, Tipoff; 115 }; 116 117 struct BITCH { 118 price_t MinPrice, MaxPrice; 119 }; 120 121 typedef enum { 122 CLIENT_AUTO, CLIENT_WINDOW, CLIENT_CURSES 123 } ClientType; 124 125 typedef enum { 126 DM_NONE, DM_STREET, DM_FIGHT, DM_DEAL 127 } DispMode; 128 129 typedef enum { 130 E_NONE = 0, 131 E_SUBWAY, E_OFFOBJECT, E_WEED, E_SAYING, E_LOANSHARK, 132 E_BANK, E_GUNSHOP, E_ROUGHPUB, E_HIREBITCH, E_ARRIVE, 133 E_MAX, 134 135 E_FINISH = 100, 136 137 E_OUTOFSYNC = 120, 138 E_FIGHT, E_FIGHTASK, E_DOCTOR, E_WAITDONE, 139 E_MAXOOS 140 } EventCode; 141 142 typedef enum { 143 FIRSTTURN = 1 << 0, 144 DEADHARDASS = 1 << 1, 145 TIPPEDOFF = 1 << 2, 146 SPIEDON = 1 << 3, 147 SPYINGON = 1 << 4, 148 FIGHTING = 1 << 5, 149 CANSHOOT = 1 << 6, 150 TRADING = 1 << 7 151 } PlayerFlags; 152 153 typedef enum { 154 ACID = 0, 155 COCAINE, HASHISH, HEROIN, LUDES, MDA, OPIUM, PCP, 156 PEYOTE, SHROOMS, SPEED, WEED 157 } DrugIndex; 158 159 struct LOG { 160 gchar *File; 161 gint Level; 162 gchar *Timestamp; 163 FILE *fp; 164 }; 165 166 struct DATE { 167 int day, month, year; 168 }; 169 170 extern gboolean WantAntique; 171 extern struct DATE StartDate; 172 extern int ClientSock, ListenSock; 173 extern gboolean Network, Client, Server, UseSounds; 174 extern int Port; 175 extern gboolean Sanitized, ConfigVerbose, DrugValue; 176 extern int NumLocation, NumGun, NumCop, NumDrug, NumSubway, NumPlaying, 177 NumStoppedTo; 178 extern int DebtInterest, BankInterest; 179 extern gchar *HiScoreFile, *ServerName, *ConvertFile, *ServerMOTD, 180 *BindAddress, *PlayerName; 181 #ifdef CYGWIN 182 extern gboolean MinToSysTray; 183 #else 184 extern gboolean Daemonize; 185 #endif 186 extern gchar *OurWebBrowser; 187 extern int LoanSharkLoc, BankLoc, GunShopLoc, RoughPubLoc; 188 extern int DrugSortMethod, FightTimeout, IdleTimeout, ConnectTimeout; 189 extern int MaxClients, AITurnPause; 190 extern struct CURRENCY Currency; 191 extern struct PRICES Prices; 192 extern struct BITCH Bitch; 193 extern price_t StartCash, StartDebt; 194 extern struct NAMES Names; 195 extern struct SOUNDS Sounds; 196 197 #ifdef NETWORKING 198 extern struct METASERVER MetaServer; 199 extern SocksServer Socks; 200 extern gboolean UseSocks; 201 #endif 202 203 extern int NumTurns; 204 extern int PlayerArmor, BitchArmor; 205 206 #define MAXLOG 6 207 208 #define DS_ATOZ 1 209 #define DS_ZTOA 2 210 #define DS_CHEAPFIRST 3 211 #define DS_CHEAPLAST 4 212 #define DS_MAX 5 213 214 #define NUMHISCORE 18 215 216 #define DEFLOANSHARK 1 217 #define DEFBANK 1 218 #define DEFGUNSHOP 2 219 #define DEFROUGHPUB 2 220 221 #define METAVERSION 2 222 223 struct COP { 224 gchar *Name, *DeputyName, *DeputiesName; 225 gint Armor, DeputyArmor; 226 gint AttackPenalty, DefendPenalty; 227 gint MinDeputies, MaxDeputies; 228 gint GunIndex; 229 gint CopGun, DeputyGun; 230 }; 231 extern struct COP *Cop; 232 233 struct GUN { 234 gchar *Name; 235 price_t Price; 236 int Space; 237 int Damage; 238 }; 239 extern struct GUN *Gun; 240 241 struct HISCORE { 242 gchar *Time; 243 price_t Money; 244 gboolean Dead; 245 gchar *Name; 246 }; 247 248 struct LOCATION { 249 gchar *Name; 250 int PolicePresence; 251 int MinDrug, MaxDrug; 252 }; 253 extern struct LOCATION *Location; 254 255 struct DRUG { 256 gchar *Name; 257 price_t MinPrice, MaxPrice; 258 gboolean Cheap, Expensive; 259 gchar *CheapStr; 260 }; 261 extern struct DRUG *Drug; 262 263 struct DRUGS { 264 gchar *ExpensiveStr1, *ExpensiveStr2; 265 int CheapDivide, ExpensiveMultiply; 266 }; 267 extern struct DRUGS Drugs; 268 269 struct INVENTORY { 270 price_t Price, TotalValue; 271 int Carried; 272 }; 273 typedef struct INVENTORY Inventory; 274 275 struct PLAYER_T; 276 typedef struct PLAYER_T Player; 277 278 struct TDopeEntry { 279 Player *Play; 280 int Turns; 281 }; 282 typedef struct TDopeEntry DopeEntry; 283 284 struct TDopeList { 285 DopeEntry *Data; 286 int Number; 287 }; 288 typedef struct TDopeList DopeList; 289 290 struct PLAYER_T { 291 guint ID; 292 int Turn; 293 GDate *date; 294 price_t Cash, Debt, Bank; 295 int Health; 296 int CoatSize; 297 int IsAt; 298 PlayerFlags Flags; 299 gchar *Name; 300 Inventory *Guns, *Drugs, Bitches; 301 EventCode EventNum, ResyncNum; 302 time_t FightTimeout, IdleTimeout, ConnectTimeout; 303 guint tiebreak; 304 price_t DocPrice; 305 DopeList SpyList, TipList; 306 Player *OnBehalfOf; 307 #ifdef NETWORKING 308 NetworkBuffer NetBuf; 309 #endif 310 Abilities Abil; 311 GPtrArray *FightArray; /* If non-NULL, a list of players 312 * in a fight */ 313 Player *Attacking; /* The player that this player 314 * is attacking */ 315 gint CopIndex; /* if >0, then this player is a cop, 316 * described by Cop[CopIndex-1]; 317 * if ==0, this is a normal player that 318 * has killed no cops; 319 * if <0, then this is a normal player, 320 * who has killed cops up to 321 * Cop[-1-CopIndex] */ 322 }; 323 324 #define SN_PROMPT "(Prompt)" 325 #define SN_META "(MetaServer)" 326 #define SN_SINGLE "(Single)" 327 328 typedef struct tag_serverdata { 329 char *Name; 330 unsigned Port; 331 int MaxPlayers, CurPlayers; 332 char *Comment, *Version, *Update, *UpSince; 333 } ServerData; 334 335 struct GLOBALS { 336 int *IntVal; 337 gboolean *BoolVal; 338 price_t *PriceVal; 339 gchar **StringVal; 340 gchar ***StringList; 341 char *Name, *Help; 342 343 void **StructListPt, *StructStaticPt; 344 int LenStruct; 345 char *NameStruct; 346 int *MaxIndex; 347 void (*ResizeFunc) (int NewNum); 348 gboolean Modified; 349 int MinVal, MaxVal; 350 }; 351 352 struct CMDLINE { 353 gboolean help, version, antique, color, network; 354 gboolean convert, admin, ai, server, notifymeta; 355 gboolean setport; 356 gchar *scorefile, *servername, *pidfile, *logfile, *plugin, *convertfile; 357 gchar *playername; 358 unsigned port; 359 ClientType client; 360 GSList *configs; 361 }; 362 363 extern const int NUMGLOB; 364 extern struct GLOBALS Globals[]; 365 366 extern Player Noone; 367 extern char **Playing; 368 extern char **SubwaySaying; 369 extern char **StoppedTo; 370 extern GSList *ServerList; 371 extern GScannerConfig ScannerConfig; 372 extern struct LOG Log; 373 extern gint ConfigErrors; 374 extern gboolean LocaleIsUTF8; 375 376 GSList *RemovePlayer(Player *Play, GSList *First); 377 Player *GetPlayerByID(guint ID, GSList *First); 378 Player *GetPlayerByName(gchar *Name, GSList *First); 379 int CountPlayers(GSList *First); 380 GSList *AddPlayer(int fd, Player *NewPlayer, GSList *First); 381 void UpdatePlayer(Player *Play); 382 void CopyPlayer(Player *Dest, Player *Src); 383 void ClearInventory(Inventory *Guns, Inventory *Drugs); 384 int IsCarryingRandom(Player *Play, int amount); 385 void ChangeSpaceForInventory(Inventory *Guns, Inventory *Drugs, 386 Player *Play); 387 void InitList(DopeList *List); 388 void AddListEntry(DopeList *List, DopeEntry *NewEntry); 389 void RemoveListEntry(DopeList *List, int Entry); 390 int GetListEntry(DopeList *List, Player *Play); 391 void RemoveListPlayer(DopeList *List, Player *Play); 392 void RemoveAllEntries(DopeList *List, Player *Play); 393 void ClearList(DopeList *List); 394 int TotalGunsCarried(Player *Play); 395 int read_string(FILE *fp, char **buf); 396 int brandom(int bot, int top); 397 price_t prandom(price_t bot, price_t top); 398 void AddInventory(Inventory *Cumul, Inventory *Add, int Length); 399 void TruncateInventoryFor(Inventory *Guns, Inventory *Drugs, Player *Play); 400 void PrintInventory(Inventory *Guns, Inventory *Drugs); 401 price_t strtoprice(char *buf); 402 gchar *pricetostr(price_t price); 403 gchar *FormatPrice(price_t price); 404 char IsInventoryClear(Inventory *Guns, Inventory *Drugs); 405 void ResizeLocations(int NewNum); 406 void ResizeCops(int NewNum); 407 void ResizeGuns(int NewNum); 408 void ResizeDrugs(int NewNum); 409 void ResizeSubway(int NewNum); 410 void ResizePlaying(int NewNum); 411 void ResizeStoppedTo(int NewNum); 412 void AssignName(gchar **dest, gchar *src); 413 void CopyNames(struct NAMES *dest, struct NAMES *src); 414 415 #ifdef NETWORKING 416 void CopyMetaServer(struct METASERVER *dest, struct METASERVER *src); 417 #endif 418 void CopyLocation(struct LOCATION *dest, struct LOCATION *src); 419 void CopyCop(struct COP *dest, struct COP *src); 420 void CopyGun(struct GUN *dest, struct GUN *src); 421 void CopyDrug(struct DRUG *dest, struct DRUG *src); 422 void CopyDrugs(struct DRUGS *dest, struct DRUGS *src); 423 int GetNextDrugIndex(int OldIndex, Player *Play); 424 gchar *InitialCaps(gchar *string); 425 char StartsWithVowel(char *string); 426 char *GetPlayerName(Player *Play); 427 void SetPlayerName(Player *Play, char *Name); 428 struct CMDLINE *ParseCmdLine(int argc, char *argv[]); 429 void FreeCmdLine(struct CMDLINE *cmdline); 430 void InitConfiguration(struct CMDLINE *cmdline); 431 void HandleHelpTexts(gboolean fullhelp); 432 struct CMDLINE *GeneralStartup(int argc, char *argv[]); 433 void StripTerminators(gchar *str); 434 gboolean ParseNextConfig(GScanner *scanner, Converter *conv, 435 gchar **encoding, gboolean print); 436 int GetGlobalIndex(gchar *ID1, gchar *ID2); 437 gchar **GetGlobalString(int GlobalIndex, int StructIndex); 438 gint *GetGlobalInt(int GlobalIndex, int StructIndex); 439 price_t *GetGlobalPrice(int GlobalIndex, int StructIndex); 440 gboolean *GetGlobalBoolean(int GlobalIndex, int StructIndex); 441 gchar ***GetGlobalStringList(int GlobalIndex, int StructIndex); 442 void PrintConfigValue(int GlobalIndex, int StructIndex, 443 gboolean IndexGiven, GScanner *scanner); 444 gboolean IsCop(Player *Play); 445 void RestoreConfig(void); 446 void GetDateString(GString *str, Player *Play); 447 void ScannerErrorHandler(GScanner *scanner, gchar *msg, gint error); 448 gboolean IsConnectedPlayer(Player *play); 449 void BackupConfig(void); 450 gchar *GetDocRoot(void); 451 gchar *GetDocIndex(void); 452 gchar *GetGlobalConfigFile(void); 453 gchar *GetLocalConfigFile(void); 454 455 #ifndef CURSES_CLIENT 456 void CursesLoop(struct CMDLINE *cmdline); 457 #endif 458 459 #ifndef GUI_CLIENT 460 #ifdef CYGWIN 461 gboolean GtkLoop(HINSTANCE hInstance, HINSTANCE hPrevInstance, 462 struct CMDLINE *cmdline, gboolean ReturnOnFail); 463 #else 464 gboolean GtkLoop(int *argc, char **argv[], struct CMDLINE *cmdline, 465 gboolean ReturnOnFail); 466 #endif 467 #endif 468 469 #endif /* __DP_DOPEWARS_H__ */