1 /*
2  * data.c
3  */
4 #include "config.h"
5 #include "copyright.h"
6 
7 #include <stdio.h>
8 #include "Wlib.h"
9 #include "defs.h"
10 #include "struct.h"
11 #include "data.h"
12 
13 struct player *players;
14 struct player *me = NULL;
15 struct torp *torps;
16 struct plasmatorp *plasmatorps;
17 struct status *status;
18 struct ship *myship;
19 struct stats *mystats;
20 struct planet *planets;
21 struct phaser *phasers;
22 struct message *messages;
23 struct mctl *mctl;
24 struct context *context;
25 struct memory universe;
26 
27 int     ghoststart = 0;				 /* is this a ghostbust *
28 
29 						  *
30 						  * * restart? */
31 int     ghost_pno = 0;				 /* is this a ghostbust *
32 
33 						  *
34 						  * * restart? */
35 int     keepInfo = 15; /* how many updates to keep infowins 6/1/93 LAB */
36 int     showPlanetOwner = 0;
37 
38 int     phaserShrink = 0;
39 int     theirPhaserShrink = 0;
40 int     shrinkPhaserOnMiss = 0;
41 
42 int     newDashboard = 3;			 /* use new graphic *
43 
44 						  *
45 						  * * dashboard, 6/2/93 LAB */
46 int     old_db = 3;				 /* should be same as *
47 
48 						  *
49 						  * * newDashboard */
50 int     detCircle = 0;		/* Show det circle on tactical */
51 int     fastQuit = 0;
52 int     gen_distress = 0;			 /* generic distress/macro *
53 
54 						  *
55 						  * * system support */
56 int     niftyNewMessages = 1;
57 int     oldalert = PFGREEN;
58 int     remap[16] =
59 {0, 1, 2, 0, 3, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0};
60 int     messpend = 0;
61 
62 #ifdef XTRA_MESSAGE_UI
63 int     messageHUD = 0;				 /* Show message being typed
64 
65 						  *
66 						  * * on the local display *
67 						  *     */
68 int     messHoldThresh = 0;			 /* Threshold value for
69 
70 						  *
71 						  * * putting a message on
72 						  * hold  * (squared) */
73 int     messMouseDelta = 0;			 /* To keep track of mouse
74 
75 						  *
76 						  * * movement delta *
77 						  * */
78 #endif
79 int     lastcount = 0;
80 int     mdisplayed = 0;
81 int     udcounter = 0;
82 int     showTractorPressor = 1;
83 int     showLock = 3;
84 int     showPhaser = 2;
85 int     autoKey = 0;
86 int     extraBorder = 1;
87 
88 /* udp options */
89 int     tryUdp = 1;
90 int     tryUdp1 = 1;
91 struct plupdate pl_update[MAXPLANETS];
92 char    buttonmap[W_BUTTON_RANGE] =
93 {'\0', '\0', '\0', '\0', '\0', '\0'};
94 int     lastm = 0;
95 int     delay = 0;				 /* delay for decaring war */
96 int     rdelay = 0;				 /* delay for refitting */
97 int     namemode = 1;
98 int     quittime = 60;
99 int     showStats = 0;
100 int     warnShields = 0;
101 int     ROMVLVS = 0;
102 int     warncount = 0;
103 int     warntimer = -1;
104 int     infomapped = 0;
105 int     mustexit = 0;
106 int     messtime = 5;
107 int     keeppeace = 0;
108 
109 #ifdef GATEWAY
110 unsigned LONG netaddr = 0;			 /* for blessing */
111 
112 #endif
113 
114 int     msgBeep = 1;				 /* ATM - msg beep */
115 
116 int     logmess = 0;
117 int     continuetractor = 1;
118 int     tcounter = 2;
119 int     showlocal = 2;
120 int     showgalactic = 2;
121 int     pixMissing = 0;
122 int     pixFlags = 0;
123 char   *title = NULL;
124 char   *shipnos = "0123456789abcdefghijklmnopqrstuvwxyz";
125 
126 #ifndef RSA
127 /* Um, not that I could find... SAC 1 Aug 1996 */
128 /* Search for it in the rsa_box*.c files ... 007 15 Aug 1996 */
129 int     sock = -1;				 /* randomized into RSA code
130 
131 						  *
132 						  * *  08/24/95 [007] */
133 #endif
134 int     xtrekPort = -1;
135 int     queuePos = -1;
136 int     pickOk = -1;
137 int     lastRank = -1;
138 int     promoted = 0;
139 
140 #ifdef ROTATERACE
141 int     rotate = 0;
142 int     rotate_deg = 0;
143 
144 #endif
145 
146 int     loginAccept = -1;
147 unsigned localflags = 0;
148 int     tournMask = 15;
149 int     nextSocket = 0;				 /* socket to use when we get
150 
151 						  *
152 						  * * * ghostbusted... */
153 char   *serverName = NULL;
154 
155 /* if there's an rc file, defaultsFile gets set by initDefaults;
156  * if there isn't one, we want to know */
157 char    defaultsFile[80] = "";
158 
159 char   *myname = NULL;
160 int     loggedIn = 0;
161 int     reinitPlanets = 0;
162 int     timerDelay = 200000;			 /* micro secs between *
163 
164 						  *
165 						  * * updates */
166 int     redrawDelay = 0;			 /* 1/10 secs beetween *
167 
168 						  *
169 						  * * redraws */
170 int     reportKills = 1;			 /* report kill messages (in
171 
172 						  *
173 						  * * * review window)? */
174 int     phaserWindow = 0;			 /* What window to show
175 
176 						  *
177 						  * * phaser msgs in */
178 
179 #ifdef PHASER_STATS
180 int     phaserShowStats = 0;			 /* How to show phaser stats */
181 int     phaserStatTry = 0;			 /* Try/attemps to phaser */
182 int     phaserStatHit = 0;			 /* Number of hits */
183 
184 #endif
185 int     censorMessages = 0;
186 
187 #ifdef RECORDGAME
188 FILE   *recordFile = NULL;			 /* recorder: slurp packets *
189 
190 						  *
191 						  *
192 						  * * here */
193 FILE   *recordIndexFile = NULL;
194 FILE   *recordContextFile = NULL;
195 
196 int     playback = 0;
197 
198 #endif
199 
200 FILE   *logFile = NULL;				 /* log messages to this file
201 
202 						  *
203 						  *
204 						  */
205 int     scanplayer = 0;				 /* who to scan */
206 int     showTractor = 1;			 /* show visible tractor *
207 
208 						  *
209 						  * * beams */
210 int     commMode = 0;				 /* UDP: 0=TCP only, 1=UDP *
211 
212 						  *
213 						  * * updates */
214 int     commModeReq = 0;			 /* UDP: req for comm *
215 
216 						  *
217 						  * * protocol change */
218 int     commStatus = 0;				 /* UDP: used when switching
219 
220 						  *
221 						  * * * protocols */
222 int     commSwitchTimeout = 0;			 /* UDP: don't wait forever */
223 int     udpTotal = 1;				 /* UDP: total #of packets *
224 
225 						  *
226 						  * * received */
227 int     udpDropped = 0;				 /* UDP: count of packets *
228 
229 						  *
230 						  * * dropped */
231 int     udpRecentDropped = 0;			 /* UDP: #of packets dropped
232 
233 						  *
234 						  * * * recently */
235 int     udpSock = -1;				 /* UDP: the socket */
236 int     udpDebug = 0;				 /* UDP: debugging info *
237 
238 						  *
239 						  * * on/off */
240 int     udpClientSend = 1;			 /* UDP: send our packets *
241 
242 						  *
243 						  * * using UDP? */
244 int     udpClientRecv = 1;			 /* UDP: receive with simple
245 
246 						  *
247 						  * * * UDP */
248 int     udpSequenceChk = 1;			 /* UDP: check sequence *
249 
250 						  *
251 						  * * numbers */
252 int     weaponUpdate = 0;			 /* Have any weapon packets *
253 
254 						  *
255 						  *
256 						  * * been received recently */
257 
258 #ifdef GATEWAY
259 int     gw_serv_port, gw_port, gw_local_port;	 /* UDP */
260 char   *gw_mach = NULL;				 /* UDP */
261 
262 #endif
263 
264 /* for router-based firewalls, we need to tunnel through at a specific port */
265 int     baseLocalPort = 0;			 /* UDP */
266 
267 int     debug = 0;
268 
269 int     messageon = 0;
270 
271 #ifdef RSA
272 char    testdata[16];
273 int     RSA_Client = 1;
274 
275 #endif
276 
277 int     SBhours = 0;
278 
279 #ifdef SHORT_PACKETS
280 int     why_dead = 0;
281 int     tryShort = 1;				 /* for .xtrekrc option */
282 int     tryShort1 = 1;
283 int     recv_short = 0;
284 int     recv_mesg = 1;
285 int     recv_kmesg = 1;
286 int     recv_threshold = 0;
287 char    recv_threshold_s[8] =
288 {'0', '\0'};
289 int     recv_warn = 1;
290 
291 #endif
292 
293 
294 int     netstat = 0;
295 int     netstatfreq = 5;
296 W_Window netstatWin, lMeter;
297 int     client_ups = 50;	/* client requested updates per second */
298 int     server_ups = 50;	/* server responded updates per second */
299 int     server_fps = 50;	/* server configured frames per second */
300 
301 #ifdef META
302 char   *metaserver = "metaserver.netrek.org";
303 int     metaport = 3521;
304 #endif
305 
306 
307 #ifdef NBT
308 struct macro_list macro[MAX_MACRO];		 /* NBT 2/26/93 */
309 int     MacroMode = 0;
310 int     macrocnt = 0;
311 
312 #endif
313 
314 extern double Sin[], Cos[];
315 
316 W_Icon  stipple, clockpic, icon;
317 
318 W_Color borderColor, backColor, textColor, myColor, warningColor, shipCol[5],
319         rColor, yColor, gColor, unColor, foreColor;
320 
321 W_Icon  expview[EX_FRAMES];
322 W_Icon  sbexpview[SBEXPVIEWS];
323 W_Icon  cloud[NUMDETFRAMES];
324 W_Icon  plasmacloud[NUMDETFRAMES];
325 W_Icon  etorp, mtorp;
326 W_Icon  eplasmatorp, mplasmatorp;
327 
328 #ifdef VSHIELD_BITMAPS
329 W_Icon  shield[SHIELD_FRAMES], cloakicon;
330 int     VShieldBitmaps = 1;
331 
332 #else
333 W_Icon  shield, cloakicon;
334 
335 #endif
336 
337 W_Icon  tractbits, pressbits;			 /* ATM - visible tractor */
338 W_Icon  fed_bitmaps[NUM_TYPES][VIEWS], kli_bitmaps[NUM_TYPES][VIEWS], rom_bitmaps[NUM_TYPES][VIEWS],
339         ori_bitmaps[NUM_TYPES][VIEWS], ind_bitmaps[NUM_TYPES][VIEWS], ROMVLVS_bitmap[VIEWS];
340 W_Icon  bplanets[7];
341 W_Icon  mbplanets[7];
342 W_Icon  bplanets2[8];
343 W_Icon  mbplanets2[8];
344 W_Icon  bplanets3[NUM_PLANET_BITMAPS2];		 /* isae:  Added this */
345 W_Icon  mbplanets3[NUM_PLANET_BITMAPS2];	 /* isae: Added this */
346 W_Icon  noinfoplanet;
347 
348 /* jn - SMARTMACRO */
349 
350 #ifdef NEWMACRO
351 int     MacroNum = 0;
352 
353 #endif /* NEWMACRO */
354 char    lastMessage[80];
355 char   *classes[] =
356 {"SC", "DD", "CA", "BB", "AS", "SB", "GA", "AT"};
357 char    teamlet[] =
358 {'I', 'F', 'R', 'X', 'K', 'X', 'X', 'X', 'O', 'X', 'X', 'X',
359  'X', 'X', 'X', 'A'};
360 char   *teamshort[16] =
361 {"IND", "FED", "ROM", "X", "KLI", "X", "X", "X", "ORI",
362  "X", "X", "X", "X", "X", "X", "ALL"};
363 char    pseudo[PSEUDOSIZE];
364 char    defpasswd[PSEUDOSIZE];
365 char    login[PSEUDOSIZE];
366 
367 struct ship shipvals[NUM_TYPES];
368 
369 /* 10 Aug 96 - Added curt (short) names -SAC */
370 struct rank default_ranks[DEFAULT_NUMRANKS] =
371 {
372   {0.0, 0.0, 0.0, "Ensign", "Esgn"},
373   {2.0, 1.0, 0.0, "Lieutenant", "Lt "},
374   {4.0, 2.0, 0.0, "Lt. Cmdr.", "LtCm"},
375   {8.0, 3.0, 0.0, "Commander", "Cder",},
376   {15.0, 4.0, 0.0, "Captain", "Capt"},
377   {20.0, 5.0, 0.0, "Flt. Capt.", "FltC"},
378   {25.0, 6.0, 0.0, "Commodore", "Cdor"},
379   {30.0, 7.0, 0.0, "Rear Adm.", "RAdm"},
380   {40.0, 8.0, 0.0, "Admiral", "Admr"}};
381 struct rank *ranks = NULL;
382 int nranks = 0;
383 
384 W_Window messagew, w, mapw, statwin, baseWin = 0, infow, iconWin, tstatw,
385         war, warnw, helpWin, teamWin[4], qwin, messwa, messwt, messwi,
386         messwk, playerw, planetw, rankw, optionWin = 0, reviewWin;
387 W_Window scanw, udpWin, phaserwin;
388 
389 #ifdef SHORT_PACKETS
390 W_Window spWin = NULL;
391 
392 #endif
393 
394 #ifdef NBT
395 W_Window macroWin = NULL;
396 
397 #endif
398 
399 int     ping = 0;				 /* to ping or not to ping */
400 LONG    packets_sent = 0;			 /* # all packets sent to *
401 
402 						  *
403 						  * * server */
404 LONG    packets_received = 0;			 /* # all packets received */
405 W_Window pStats = NULL;
406 
407 char    deathmessage[80];
408 char    outmessage[85];				 /* 80 chars made sun4's core
409 
410 						  *
411 						  * * * dump and I'm too lazy
412 						  * to * * calculate the
413 						  * exact * * number required
414 						  * here */
415 char   *xdisplay_name = NULL;
416 
417 int     UseNewDistress = 0;
418 int     UseNewMacro = 1;
419 int     UseSmartMacro = 1;
420 int     rejectMacro = 0;
421 int     maskrecip = 0;
422 
423 unsigned char singleMacro[MAX_MACRO] = "";
424 
425 int     enemyPhasers = 1;
426 
427 char    cloakChars[3] = "??";
428 
429 int     showIND = 0;
430 int     newPlist = 0;
431 
432 /* tried to automate this as much as possible... the entries are * the
433  * character, string identifier, and the default macro for * each distress
434  * type. */
435 
436 /* the index into distmacro array should correspond with the correct
437  * dist_type */
438 
439 #define NUM_DIST 27
440 
441 
442 struct dmacro_list dist_prefered[NUM_DIST];
443 
444 /* the index into distmacro array should correspond with the correct
445  * dist_type */
446 /* the character specification is ignored now, kept here anyway for reference */
447 struct dmacro_list dist_defaults[] =
448 {
449   {'X', "no zero", "this should never get looked at"},
450 /* ^t */
451   {'\xd4', "taking", " %T%c->%O (%S) Carrying %a to %l%?%n>-1%{ @ %n%}\0"},
452 /* ^o */
453   {'\xcf', "ogg", " %T%c->%O Help Ogg %p at %l\0"},
454 /* ^b */
455   {'\xc2', "bomb", " %T%c->%O %?%n>4%{bomb %l @ %n%!bomb %l%}\0"},
456 /* ^c */
457   {'\xc3', "space_control", " %T%c->%O Help Control at %L\0"},
458 /* ^1 */
459   {'\x91', "save_planet", " %T%c->%O Emergency at %L!!!!\0"},
460 /* ^2 */
461   {'\x92', "base_ogg", " %T%c->%O Sync with --]> %g <[-- OGG ogg OGG base!!\0"},
462 /* ^3 */
463   {'\x93', "help1", " %T%c->%O Help me! %d%% dam, %s%% shd, %f%% fuel %a armies.\0"},
464 /* ^4 */
465   {'\x94', "help2", " %T%c->%O Help me! %d%% dam, %s%% shd, %f%% fuel %a armies.\0"},
466 /* ^e */
467   {'\xc5', "escorting", " %T%c->%O ESCORTING %g (%d%%D %s%%S %f%%F)\0"},
468 /* ^p */
469   {'\xd0', "ogging", " %T%c->%O Ogging %h\0"},
470 /* ^m */
471   {'\xcd', "bombing", " %T%c->%O Bombing %l @ %n\0"},
472 /* ^l */
473   {'\xcc', "controlling", " %T%c->%O Controlling at %l\0"},
474 /* ^5 */
475   {'\x95', "asw", " %T%c->%O Anti-bombing %p near %b.\0"},
476 /* ^6 */
477   {'\x96', "asbomb", " %T%c->%O DON'T BOMB %l. Let me bomb it (%S)\0"},
478 /* ^7 */
479   {'\x97', "doing1", " %T%c->%O (%i)%?%a>0%{ has %a arm%?%a=1%{y%!ies%}%} at %l.  (%d%% dam, %s%% shd, %f%% fuel)\0"},
480 /* ^8 */
481   {'\x98', "doing2", " %T%c->%O (%i)%?%a>0%{ has %a arm%?%a=1%{y%!ies%}%} at %l.  (%d%% dam, %s%% shd, %f%% fuel)\0"},
482 /* ^f */
483   {'\xc6', "free_beer", " %T%c->%O %p is free beer\0"},
484 /* ^n */
485   {'\xce', "no_gas", " %T%c->%O %p @ %l has no gas\0"},
486 /* ^h */
487   {'\xc8', "crippled", " %T%c->%O %p @ %l crippled\0"},
488 /* ^9 */
489   {'\x99', "pickup", " %T%c->%O %p++ @ %l\0"},
490 /* ^0 */
491   {'\x90', "pop", " %T%c->%O %l%?%n>-1%{ @ %n%}!\0"},
492 /* F */
493   {'F', "carrying", " %T%c->%O %?%S=SB%{Your Starbase is c%!C%}arrying %?%a>0%{%a%!NO%} arm%?%a=1%{y%!ies%}.\0"},
494 /* ^@ */
495   {'\xa0', "other1", " %T%c->%O (%i)%?%a>0%{ has %a arm%?%a=1%{y%!ies%}%} at %l. (%d%%D, %s%%S, %f%%F)\0"},
496 /* ^# */
497   {'\x83', "other2", " %T%c->%O (%i)%?%a>0%{ has %a arm%?%a=1%{y%!ies%}%} at %l. (%d%%D, %s%%S, %f%%F)\0"},
498 /* E */
499   {'E', "help", " %T%c->%O Help(%S)! %s%% shd, %d%% dmg, %f%% fuel,%?%S=SB%{ %w%% wtmp,%!%}%E%{ ETEMP!%}%W%{ WTEMP!%} %a armies!\0"},
500   {'\0', '\0', '\0'},
501 };
502 
503 struct dmacro_list *distmacro = dist_defaults;
504 
505 int     sizedist = sizeof(dist_defaults);
506 
507 #ifdef BEEPLITE
508 char   *distlite[NUM_DIST] =
509 {
510   NULL,
511   "/c/l/0/|%T%c Taking %L|",
512   "/|Ogg %p|",
513   "/|Bomb %L|",
514   "/|Control %L|",
515   "/|Save %L|",
516   NULL, NULL, NULL,
517   NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
518   NULL, NULL, NULL, NULL, NULL, NULL, NULL
519 };
520 
521 int     DefLite = 1;
522 int     UseLite = 1;
523 
524 int     emph_planet_seq_n[MAXPLANETS] =
525 {0,};
526 int     emph_player_seq_n[MAXPLAYER] =
527 {0,};
528 W_Icon  emph_planet_seq[10];
529 W_Icon  emph_player_seq[10];
530 W_Icon  emph_player_seql[10];
531 int     beep_lite_cycle_time_player = 10;
532 int     beep_lite_cycle_time_planet = 10;
533 int     liteflag = 0;
534 char    F_beeplite_flags = LITE_PLAYERS_MAP |
535 LITE_PLAYERS_LOCAL |
536 LITE_SELF |
537 LITE_PLANETS |
538 LITE_SOUNDS |
539 LITE_TTS;
540 
541 int     tts_len = 0;
542 int     tts_max_len = 40;
543 int     tts_width = 0;
544 int     tts_timer = 0;
545 int     tts_time = 25;
546 int     tts_pos = TWINSIDE / 2 - 16;		 /* as found in redraw.c *
547 
548 						  *
549 						  * * originally */
550 char    lastIn[100];
551 
552 #endif /* BEEPLITE */
553 
554 #ifdef RCM					 /* Receiver configurable * *
555 						  * Server messages */
556 struct dmacro_list rcm_msg[] =
557 {
558   {'0', "none", "Unknown RCM message"},
559   {'1', "kill", "GOD->ALL %i (%S) (%T%c%?%a>0%{+%a armies%!%}) was kill %?%d>0%{%k%!NO CREDIT)%} for %u (%r%p) %?%w>0%{%W%!%}"},
560   {'2', "planet", "GOD->ALL %i (%S) (%T%c%?%a>0%{+%a armies%!%} killed by %l (%z) %?%w>0%{%W%!%}"},
561   {'3', "bomb", "%N->%Z We are being attacked by %i (%T%c) who is %d%% damaged."},
562   {'4', "destroy", "%N->%Z %N destroyed by %i (%T%c)"},
563   {'5', "take", "%N->%O %N taken by %i (%T%c)"},
564   {'6', "ghostbust", "GOD->ALL %i (%S) (%T%c) was kill %k for the GhostBusters"},
565   {'\0', '\0', '\0'},
566 };
567 
568 #endif /* RCM */
569 
570 int     highlightFriendlyPhasers = 0;
571 
572 #ifdef IGNORE_SIGNALS_SEGV_BUS
573 /* KRP */
574 /* Handle (hopefully) non-fatal segmentation and bus faults. */
575 int     ignore_signals = 0;
576 
577 #endif
578 
579 #ifdef MOTION_MOUSE
580 /* KRP */
581 int     motion_mouse = 0;
582 int     user_motion_thresh = 16;
583 int     motion_mouse_enablable = 1;
584 int     motion_mouse_steering = 0;
585 
586 #endif
587 
588 #ifdef SHIFTED_MOUSE
589 /* KRP */
590 int     extended_mouse = 0;
591 
592 #endif
593 
594 int     ignoreCaps = 1;				 /* Default is to ignore the
595 
596 						  *
597 						  * * * Capslock key SRS */
598 
599 #ifdef MOUSE_AS_SHIFT
600 /* KRP */
601 int     mouse_as_shift = 0;
602 int     b1_as_shift = 0;
603 int     b2_as_shift = 0;
604 int     b3_as_shift = 0;
605 
606 #endif
607 
608 #ifdef TNG_FED_BITMAPS
609 int     use_tng_fed_bitmaps = 0;
610 W_Icon  tng_fed_bitmaps[NUM_TYPES][VIEWS];
611 
612 #endif
613 
614 #ifdef VARY_HULL
615 W_Icon  hull[8];
616 int     vary_hull = 0;
617 
618 #endif
619 
620 #ifdef XTREKRC_HELP
621 W_Window defWin = NULL;
622 
623 #endif
624 
625 #ifdef CONTROL_KEY
626 int     use_control_key = 1;
627 
628 #endif
629 
630 #ifdef DOC_WIN
631 W_Window docwin = NULL, xtrekrcwin = NULL;
632 int     maxdoclines = 0, maxxtrekrclines = 0;
633 
634 #endif
635 
636 W_Icon  bplanets4[8];
637 W_Icon  mbplanets4[8];
638 
639 #ifdef REFRESH_INTERVAL
640 int     refresh_interval = 0;
641 
642 #endif
643 
644 int     max_fd = 3;
645 
646 #ifdef TOOLS
647 W_Window toolsWin = NULL;
648 int     shelltools = 1;
649 struct key_list macroKeys[MAX_KEY];
650 unsigned char keys[MAX_KEY] = "";
651 char   *wwwlink = "netscape -remote \"openURL(%s)\"";
652 char   *upgradeURL = "http://cow.netrek.org/current/index.html#%s";
653 char   *releaseURL = "http://cow.netrek.org/%s/README.html#pl%i";
654 char   *bugURL = "http://sourceforge.net/bugs/?group_id=968";
655 /*
656 char   *bugURL = "http://bugzilla.us.netrek.org/cow?version=%s&pl=%i&arch=%s";
657 */
658 #endif
659 
660 #ifdef SOUND
661 int    sound_init = 1;
662 int    sound_toggle = 0;
663 char   *sounddir = NULL;
664 W_Window soundWin = NULL;
665 
666 #endif
667 
668 #ifdef HOCKEY_LINES
669 int     hockey_s_lines = 0;
670 struct s_line s_lines[NUM_HOCKEY_LINES + 1];
671 int     normal_s_lines = 0;
672 
673 #endif
674 
675 #ifdef MULTILINE_MACROS
676 int     multiline_enabled = 0;
677 
678 #endif
679 
680 #ifdef FEATURE_PACKETS
681 int     F_feature_packets = 0;
682 
683 #endif
684 
685 int     F_cloak_maxwarp = 0;
686 int     F_self_8flags = 1;
687 int     F_self_8flags2 = 0;
688 int     F_ship_cap = 0;
689 int     F_sp_generic_32 = 1;
690 char    A_sp_generic_32 = 0;
691 int     F_agri_pix = 1;
692 
693 #ifdef WARP_DEAD
694 int     F_dead_warp = 0;
695 
696 #endif
697 
698 int F_many_self = 0;
699 
700 #ifdef UDP_PORTSWAP
701 int     portSwap = 1;
702 #endif
703 
704 int F_show_all_tractors = 1;
705 int fastGuest = 0;
706 int identityBlind = 0;
707 int versionHide = 0;
708 int F_sp_rank = 0;
709 int F_sp_ltd = 0;
710 int F_tips = 1;
711 char *program = NULL;
712 int small_screen = 0;
713