tdopewars.h - vaccinewars - be a doctor and try to vaccinate the world
HTML git clone git://src.adamsgaard.dk/vaccinewars
DIR Log
DIR Files
DIR Refs
DIR README
DIR LICENSE
---
tdopewars.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__ */