vaccinewars

be a doctor and try to vaccinate the world
git clone git://src.adamsgaard.dk/vaccinewars # fast
git clone https://src.adamsgaard.dk/vaccinewars.git # slow
Log | Files | Refs | README | LICENSE Back to index

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__ */