tFix for dopewars.sco install; player IDs now used in messages - vaccinewars - be a doctor and try to vaccinate the world
(HTM) git clone git://src.adamsgaard.dk/vaccinewars
(DIR) Log
(DIR) Files
(DIR) Refs
(DIR) README
(DIR) LICENSE
---
(DIR) commit f6eb1f80293e4987d855294318867a02ca6a9541
(DIR) parent f2393f7aef862474382e97307175f7f189dc5ceb
(HTM) Author: Ben Webb <ben@salilab.org>
Date: Wed, 13 Sep 2000 04:21:22 +0000
Fix for dopewars.sco install; player IDs now used in messages
Diffstat:
M ChangeLog | 3 ++-
M Makefile.am | 1 +
M Makefile.in | 1 +
M po/dopewars.pot | 620 ++++++++++++++++----------------
M src/AIPlayer.c | 8 ++------
M src/curses_client.c | 7 +++----
M src/dopewars.c | 28 ++++++++++++++++++++++++++++
M src/dopewars.h | 2 ++
M src/gtk_client.c | 5 ++---
M src/message.c | 116 ++++++++++++++++++++-----------
M src/message.h | 4 ++--
M src/serverside.c | 27 +++++++++++++++++++--------
M src/win32_client.c | 4 ++--
13 files changed, 448 insertions(+), 378 deletions(-)
---
(DIR) diff --git a/ChangeLog b/ChangeLog
t@@ -3,7 +3,8 @@
- Networking revamped - now uses nonblocking sockets to improve server
responsiveness and to remove deadlocks (previously, any client could
halt server by sending an unterminated message); "abilities" added to
- allow backwards-compatible protocol extensions
+ allow backwards-compatible protocol extensions; player IDs used rather
+ than player names to save bandwidth, with newer client+server
- Longer T>alk and P>age messages allowed in curses client
- Minor bug fixes to configure options
- Client-side code moved out of clientside.c and dopewars.c;
(DIR) diff --git a/Makefile.am b/Makefile.am
t@@ -3,6 +3,7 @@ SUBDIRS = src doc po intl
DISTFILES = ABOUT-NLS
install-data-local:
+ ${mkinstalldirs} ${datadir}
touch ${datadir}/dopewars.sco
chown root.games ${datadir}/dopewars.sco
chmod 0660 ${datadir}/dopewars.sco
(DIR) diff --git a/Makefile.in b/Makefile.in
t@@ -376,6 +376,7 @@ mostlyclean distclean maintainer-clean
install-data-local:
+ ${mkinstalldirs} ${datadir}
touch ${datadir}/dopewars.sco
chown root.games ${datadir}/dopewars.sco
chmod 0660 ${datadir}/dopewars.sco
(DIR) diff --git a/po/dopewars.pot b/po/dopewars.pot
t@@ -6,7 +6,7 @@
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
-"POT-Creation-Date: 2000-09-13 01:58+0100\n"
+"POT-Creation-Date: 2000-09-13 05:02+0100\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
t@@ -738,53 +738,53 @@ msgstr ""
msgid "Drugs can be your friend!"
msgstr ""
-#: src/dopewars.c:1074
+#: src/dopewars.c:1102
msgid "Unable to process configuration file line"
msgstr ""
-#: src/dopewars.c:1135
+#: src/dopewars.c:1163
msgid ""
"Configuration can only be changed interactively when no\n"
"players are logged on. Wait for all players to log off, or remove\n"
"them with the push or kill commands, and try again."
msgstr ""
-#: src/dopewars.c:1196
+#: src/dopewars.c:1224
#, c-format
msgid "Index into %s array should be between 1 and %d"
msgstr ""
-#: src/dopewars.c:1215
+#: src/dopewars.c:1243
#, c-format
msgid "%s is %d\n"
msgstr ""
-#: src/dopewars.c:1220
+#: src/dopewars.c:1248
#, c-format
msgid "%s is %s\n"
msgstr ""
-#: src/dopewars.c:1223
+#: src/dopewars.c:1251
#, c-format
msgid "%s is \"%s\"\n"
msgstr ""
-#: src/dopewars.c:1227
+#: src/dopewars.c:1255
#, c-format
msgid "%s[%d] is %s\n"
msgstr ""
-#: src/dopewars.c:1230
+#: src/dopewars.c:1258
#, c-format
msgid "%s is { "
msgstr ""
-#: src/dopewars.c:1261
+#: src/dopewars.c:1289
#, c-format
msgid "Resized structure list to %d elements\n"
msgstr ""
-#: src/dopewars.c:1404
+#: src/dopewars.c:1432
#, c-format
msgid ""
"Usage: dopewars [OPTION]...\n"
t@@ -998,7 +998,7 @@ msgstr ""
msgid "CLQP"
msgstr ""
-#: src/curses_client.c:371 src/gtk_client.c:808
+#: src/curses_client.c:371 src/gtk_client.c:807
msgid "Where to, dude ? "
msgstr ""
t@@ -1015,11 +1015,11 @@ msgstr ""
msgid "How many do you drop? "
msgstr ""
-#: src/curses_client.c:454 src/curses_client.c:827
+#: src/curses_client.c:454 src/curses_client.c:826
msgid "What do you wish to buy? "
msgstr ""
-#: src/curses_client.c:456 src/curses_client.c:829
+#: src/curses_client.c:456 src/curses_client.c:828
msgid "What do you wish to sell? "
msgstr ""
t@@ -1084,7 +1084,7 @@ msgstr ""
msgid " Are you sure? "
msgstr ""
-#: src/curses_client.c:544 src/curses_client.c:562 src/curses_client.c:1689
+#: src/curses_client.c:544 src/curses_client.c:562 src/curses_client.c:1688
msgid "YN"
msgstr ""
t@@ -1104,7 +1104,7 @@ msgstr ""
msgid "The server has terminated. Reverting to single player mode."
msgstr ""
-#: src/curses_client.c:646 src/gtk_client.c:337 src/serverside.c:250
+#: src/curses_client.c:646 src/gtk_client.c:337 src/serverside.c:259
#, c-format
msgid "%s joins the game!"
msgstr ""
t@@ -1129,224 +1129,224 @@ msgid ""
"it."
msgstr ""
-#: src/curses_client.c:745
+#: src/curses_client.c:744
msgid "H I G H S C O R E S"
msgstr ""
-#: src/curses_client.c:801
+#: src/curses_client.c:800
msgid "Will you B>uy, S>ell, or L>eave? "
msgstr ""
-#: src/curses_client.c:806
+#: src/curses_client.c:805
msgid "BSL"
msgstr ""
-#: src/curses_client.c:811
+#: src/curses_client.c:810
#, c-format
msgid "You don't have any %s to sell!"
msgstr ""
-#: src/curses_client.c:818 src/gtk_client.c:1084
+#: src/curses_client.c:817 src/gtk_client.c:1083
#, c-format
msgid "You'll need more %s to carry any more %s!"
msgstr ""
-#: src/curses_client.c:840 src/gtk_client.c:1088
+#: src/curses_client.c:839 src/gtk_client.c:1087
#, c-format
msgid "You don't have enough space to carry that %s!"
msgstr ""
-#: src/curses_client.c:848 src/gtk_client.c:1092
+#: src/curses_client.c:847 src/gtk_client.c:1091
#, c-format
msgid "You don't have enough cash to buy that %s!"
msgstr ""
-#: src/curses_client.c:861 src/gtk_client.c:1096
+#: src/curses_client.c:860 src/gtk_client.c:1095
msgid "You don't have any to sell!"
msgstr ""
-#: src/curses_client.c:885
+#: src/curses_client.c:884
msgid "How much money do you pay back? "
msgstr ""
-#: src/curses_client.c:891 src/curses_client.c:921 src/gtk_client.c:1931
+#: src/curses_client.c:890 src/curses_client.c:920 src/gtk_client.c:1930
msgid "You don't have that much money!"
msgstr ""
-#: src/curses_client.c:911
+#: src/curses_client.c:910
msgid "Do you want to D>eposit money, W>ithdraw money, or L>eave ? "
msgstr ""
-#: src/curses_client.c:914
+#: src/curses_client.c:913
msgid "DWL"
msgstr ""
-#: src/curses_client.c:916
+#: src/curses_client.c:915
msgid "How much money? "
msgstr ""
-#: src/curses_client.c:924 src/gtk_client.c:1924
+#: src/curses_client.c:923 src/gtk_client.c:1923
msgid "There isn't that much money in the bank..."
msgstr ""
-#: src/curses_client.c:1003
+#: src/curses_client.c:1002
msgid "Press any key..."
msgstr ""
-#: src/curses_client.c:1134
+#: src/curses_client.c:1133
msgid "Messages"
msgstr ""
-#: src/curses_client.c:1141 src/gtk_client.c:1382
+#: src/curses_client.c:1140 src/gtk_client.c:1381
msgid "Stats"
msgstr ""
-#: src/curses_client.c:1144
+#: src/curses_client.c:1143
#, c-format
msgid "Cash %17s"
msgstr ""
-#: src/curses_client.c:1151
+#: src/curses_client.c:1150
#, c-format
msgid "Health %3d"
msgstr ""
-#: src/curses_client.c:1153
+#: src/curses_client.c:1152
#, c-format
msgid "Bank %17s"
msgstr ""
-#: src/curses_client.c:1157
+#: src/curses_client.c:1156
#, c-format
msgid "Debt %17s"
msgstr ""
-#: src/curses_client.c:1161
+#: src/curses_client.c:1160
#, c-format
msgid "Space %6d"
msgstr ""
-#: src/curses_client.c:1163
+#: src/curses_client.c:1162
#, c-format
msgid "%s %3d Space %6d"
msgstr ""
-#: src/curses_client.c:1174
+#: src/curses_client.c:1173
msgid "Trenchcoat"
msgstr ""
-#: src/curses_client.c:1214
+#: src/curses_client.c:1213
#, c-format
msgid "Spy reports for %s"
msgstr ""
-#: src/curses_client.c:1218 src/curses_client.c:1223
+#: src/curses_client.c:1217 src/curses_client.c:1222
#, c-format
msgid "%s..."
msgstr ""
-#: src/curses_client.c:1244
+#: src/curses_client.c:1243
msgid "No other players are currently logged on!"
msgstr ""
-#: src/curses_client.c:1249
+#: src/curses_client.c:1248
msgid "Players currently logged on:-"
msgstr ""
-#: src/curses_client.c:1397
+#: src/curses_client.c:1396
msgid "Hey dude, what's your name? "
msgstr ""
-#: src/curses_client.c:1431
+#: src/curses_client.c:1430
#, c-format
msgid "Hey dude, the prices of %s here are:"
msgstr ""
-#: src/curses_client.c:1443
+#: src/curses_client.c:1442
msgid "Will you B>uy"
msgstr ""
-#: src/curses_client.c:1444
+#: src/curses_client.c:1443
msgid ", S>ell"
msgstr ""
-#: src/curses_client.c:1445
+#: src/curses_client.c:1444
msgid ", D>rop"
msgstr ""
-#: src/curses_client.c:1446
+#: src/curses_client.c:1445
msgid ", T>alk, P>age, L>ist"
msgstr ""
-#: src/curses_client.c:1449
+#: src/curses_client.c:1448
msgid ", G>ive"
msgstr ""
-#: src/curses_client.c:1452
+#: src/curses_client.c:1451
msgid ", F>ight"
msgstr ""
-#: src/curses_client.c:1456
+#: src/curses_client.c:1455
msgid ", J>et"
msgstr ""
-#: src/curses_client.c:1458 src/curses_client.c:1473
+#: src/curses_client.c:1457 src/curses_client.c:1472
msgid ", or Q>uit? "
msgstr ""
-#: src/curses_client.c:1466
+#: src/curses_client.c:1465
msgid "Do you "
msgstr ""
-#: src/curses_client.c:1468
+#: src/curses_client.c:1467
msgid "F>ight, "
msgstr ""
-#: src/curses_client.c:1469
+#: src/curses_client.c:1468
msgid "S>tand, "
msgstr ""
-#: src/curses_client.c:1471
+#: src/curses_client.c:1470
msgid "R>un, "
msgstr ""
-#: src/curses_client.c:1472
+#: src/curses_client.c:1471
msgid "D>eal "
msgstr ""
-#: src/curses_client.c:1515
+#: src/curses_client.c:1514
msgid "Connection to server lost! Reverting to single player mode"
msgstr ""
-#: src/curses_client.c:1544
+#: src/curses_client.c:1543
msgid "BSDTPLGFJQ"
msgstr ""
-#: src/curses_client.c:1546
+#: src/curses_client.c:1545
msgid "DRFSQ"
msgstr ""
-#: src/curses_client.c:1574
+#: src/curses_client.c:1573
msgid "List what? P>layers or S>cores? "
msgstr ""
-#: src/curses_client.c:1575
+#: src/curses_client.c:1574
msgid "PS"
msgstr ""
-#: src/curses_client.c:1584
+#: src/curses_client.c:1583
msgid "Whom do you want to page (talk privately to) ? "
msgstr ""
-#: src/curses_client.c:1599
+#: src/curses_client.c:1598
msgid "Talk: "
msgstr ""
-#: src/curses_client.c:1688
+#: src/curses_client.c:1687
msgid "Play again? "
msgstr ""
-#: src/curses_client.c:1700
+#: src/curses_client.c:1699
msgid ""
"No curses client available - rebuild the binary passing the\n"
"--enable-curses-client option to configure, or use a windowed\n"
t@@ -1445,7 +1445,7 @@ msgstr ""
msgid "Inventory"
msgstr ""
-#: src/gtk_client.c:236 src/gtk_client.c:2167 src/gtk_client.c:2535
+#: src/gtk_client.c:236 src/gtk_client.c:2166 src/gtk_client.c:2534
msgid "Close"
msgstr ""
t@@ -1484,173 +1484,173 @@ msgstr ""
msgid "<main>/Errands/Tipoff"
msgstr ""
-#: src/gtk_client.c:403
+#: src/gtk_client.c:402
msgid "High Scores"
msgstr ""
-#: src/gtk_client.c:437 src/gtk_client.c:1035 src/gtk_client.c:1495
-#: src/gtk_client.c:1840 src/gtk_client.c:2005 src/gtk_client.c:2284
-#: src/gtk_client.c:2442
+#: src/gtk_client.c:436 src/gtk_client.c:1034 src/gtk_client.c:1494
+#: src/gtk_client.c:1839 src/gtk_client.c:2004 src/gtk_client.c:2283
+#: src/gtk_client.c:2441
msgid "OK"
msgstr ""
-#: src/gtk_client.c:519
+#: src/gtk_client.c:518
msgid "Fight"
msgstr ""
-#: src/gtk_client.c:546
+#: src/gtk_client.c:545
#, c-format
msgid "_Deal %s"
msgstr ""
-#: src/gtk_client.c:550 src/gtk_client.c:1128 src/gtk_client.c:1325
+#: src/gtk_client.c:549 src/gtk_client.c:1127 src/gtk_client.c:1324
msgid "_Fight"
msgstr ""
-#: src/gtk_client.c:553
+#: src/gtk_client.c:552
msgid "_Stand"
msgstr ""
-#: src/gtk_client.c:556 src/gtk_client.c:1127
+#: src/gtk_client.c:555 src/gtk_client.c:1126
msgid "_Run"
msgstr ""
-#: src/gtk_client.c:799
+#: src/gtk_client.c:798
msgid "Jet to location"
msgstr ""
-#: src/gtk_client.c:868
+#: src/gtk_client.c:867
#, c-format
msgid "at %s"
msgstr ""
-#: src/gtk_client.c:873
+#: src/gtk_client.c:872
#, c-format
msgid "You are currently carrying %d %s"
msgstr ""
-#: src/gtk_client.c:878
+#: src/gtk_client.c:877
#, c-format
msgid "Available space: %d"
msgstr ""
-#: src/gtk_client.c:883
+#: src/gtk_client.c:882
#, c-format
msgid "You can afford %d"
msgstr ""
-#: src/gtk_client.c:933 src/gtk_client.c:1064
+#: src/gtk_client.c:932 src/gtk_client.c:1063
msgid "Buy"
msgstr ""
-#: src/gtk_client.c:934 src/gtk_client.c:1065
+#: src/gtk_client.c:933 src/gtk_client.c:1064
msgid "Sell"
msgstr ""
-#: src/gtk_client.c:935 src/gtk_client.c:1066
+#: src/gtk_client.c:934 src/gtk_client.c:1065
msgid "Drop"
msgstr ""
-#: src/gtk_client.c:1023
+#: src/gtk_client.c:1022
#, c-format
msgid "%s how many?"
msgstr ""
-#: src/gtk_client.c:1041 src/gtk_client.c:1840 src/gtk_client.c:2016
-#: src/gtk_client.c:2292
+#: src/gtk_client.c:1040 src/gtk_client.c:1839 src/gtk_client.c:2015
+#: src/gtk_client.c:2291
msgid "Cancel"
msgstr ""
-#: src/gtk_client.c:1080
+#: src/gtk_client.c:1079
#, c-format
msgid "You don't have any %s!"
msgstr ""
-#: src/gtk_client.c:1127 src/gtk_client.c:1841
+#: src/gtk_client.c:1126 src/gtk_client.c:1840
msgid "_Yes"
msgstr ""
-#: src/gtk_client.c:1127 src/gtk_client.c:1841
+#: src/gtk_client.c:1126 src/gtk_client.c:1840
msgid "_No"
msgstr ""
-#: src/gtk_client.c:1128
+#: src/gtk_client.c:1127
msgid "_Attack"
msgstr ""
-#: src/gtk_client.c:1128
+#: src/gtk_client.c:1127
msgid "_Evade"
msgstr ""
-#: src/gtk_client.c:1146
+#: src/gtk_client.c:1145
msgid "Question"
msgstr ""
-#: src/gtk_client.c:1255
+#: src/gtk_client.c:1254
msgid "<main>/Talk"
msgstr ""
-#: src/gtk_client.c:1257
+#: src/gtk_client.c:1256
msgid "<main>/List"
msgstr ""
-#: src/gtk_client.c:1259
+#: src/gtk_client.c:1258
msgid "<main>/Errands"
msgstr ""
-#: src/gtk_client.c:1275
+#: src/gtk_client.c:1274
msgid "Space"
msgstr ""
-#: src/gtk_client.c:1280
+#: src/gtk_client.c:1279
msgid "Cash"
msgstr ""
-#: src/gtk_client.c:1285
+#: src/gtk_client.c:1284
msgid "Debt"
msgstr ""
-#: src/gtk_client.c:1290
+#: src/gtk_client.c:1289
msgid "Bank"
msgstr ""
-#: src/gtk_client.c:1305
+#: src/gtk_client.c:1304
msgid "Health"
msgstr ""
-#: src/gtk_client.c:1325
+#: src/gtk_client.c:1324
msgid "_Jet!"
msgstr ""
-#: src/gtk_client.c:1356
+#: src/gtk_client.c:1355
msgid "dopewars"
msgstr ""
-#: src/gtk_client.c:1442
+#: src/gtk_client.c:1441
msgid "Drug Dealing and Research"
msgstr ""
-#: src/gtk_client.c:1443
+#: src/gtk_client.c:1442
msgid "Play Testing"
msgstr ""
-#: src/gtk_client.c:1444
+#: src/gtk_client.c:1443
msgid "Extensive Play Testing"
msgstr ""
-#: src/gtk_client.c:1446
+#: src/gtk_client.c:1445
msgid "Constructive Criticism"
msgstr ""
-#: src/gtk_client.c:1448
+#: src/gtk_client.c:1447
msgid "Unconstructive Criticism"
msgstr ""
-#: src/gtk_client.c:1452
+#: src/gtk_client.c:1451
msgid "About dopewars"
msgstr ""
-#: src/gtk_client.c:1461
+#: src/gtk_client.c:1460
msgid ""
"Based on John E. Dell's old Drug Wars game, dopewars is a simulation of an\n"
"imaginary drug market. dopewars is an All-American game which features\n"
t@@ -1662,151 +1662,151 @@ msgid ""
"have one month of game time to make your fortune.\n"
msgstr ""
-#: src/gtk_client.c:1469
+#: src/gtk_client.c:1468
#, c-format
msgid ""
"Version %s Copyright (C) 1998-2000 Ben Webb ben@bellatrix.pcl.ox.ac.uk\n"
"dopewars is released under the GNU General Public Licence\n"
msgstr ""
-#: src/gtk_client.c:1487
+#: src/gtk_client.c:1486
msgid ""
"\n"
"For information on the command line options, type dopewars -h at your\n"
"Unix prompt. This will display a help screen, listing the availableoptions."
msgstr ""
-#: src/gtk_client.c:1525 src/gtk_client.c:1548
+#: src/gtk_client.c:1524 src/gtk_client.c:1547
#, c-format
msgid "Status: Could not connect (%s)"
msgstr ""
-#: src/gtk_client.c:1536
+#: src/gtk_client.c:1535
#, c-format
msgid "Status: Attempting to contact %s..."
msgstr ""
-#: src/gtk_client.c:1596
+#: src/gtk_client.c:1595
#, c-format
msgid "%d of %d"
msgstr ""
-#: src/gtk_client.c:1660 src/gtk_client.c:1701 src/gtk_client.c:1742
+#: src/gtk_client.c:1659 src/gtk_client.c:1700 src/gtk_client.c:1741
msgid "Server"
msgstr ""
-#: src/gtk_client.c:1661 src/gtk_client.c:1716
+#: src/gtk_client.c:1660 src/gtk_client.c:1715
msgid "Port"
msgstr ""
-#: src/gtk_client.c:1662
+#: src/gtk_client.c:1661
msgid "Version"
msgstr ""
-#: src/gtk_client.c:1663
+#: src/gtk_client.c:1662
msgid "Players"
msgstr ""
-#: src/gtk_client.c:1664
+#: src/gtk_client.c:1663
msgid "Comment"
msgstr ""
-#: src/gtk_client.c:1677
+#: src/gtk_client.c:1676
msgid "New Game"
msgstr ""
-#: src/gtk_client.c:1686
+#: src/gtk_client.c:1685
msgid "Hey dude, what's your _name?"
msgstr ""
-#: src/gtk_client.c:1708
+#: src/gtk_client.c:1707
msgid "Host name"
msgstr ""
-#: src/gtk_client.c:1731 src/gtk_client.c:1794
+#: src/gtk_client.c:1730 src/gtk_client.c:1793
msgid "_Connect"
msgstr ""
-#: src/gtk_client.c:1744 src/gtk_client.c:1765
+#: src/gtk_client.c:1743 src/gtk_client.c:1764
msgid "Single player"
msgstr ""
-#: src/gtk_client.c:1750
+#: src/gtk_client.c:1749
msgid "_Antique mode"
msgstr ""
-#: src/gtk_client.c:1757
+#: src/gtk_client.c:1756
msgid "_Start single-player game"
msgstr ""
-#: src/gtk_client.c:1767 src/gtk_client.c:1805
+#: src/gtk_client.c:1766 src/gtk_client.c:1804
msgid "Metaserver"
msgstr ""
-#: src/gtk_client.c:1784
+#: src/gtk_client.c:1783
msgid "_Update"
msgstr ""
-#: src/gtk_client.c:1809
+#: src/gtk_client.c:1808
msgid "Status: Waiting for user input"
msgstr ""
-#: src/gtk_client.c:1962
+#: src/gtk_client.c:1961
#, c-format
msgid "Cash: %s"
msgstr ""
-#: src/gtk_client.c:1969
+#: src/gtk_client.c:1968
#, c-format
msgid "Debt: %s"
msgstr ""
-#: src/gtk_client.c:1972
+#: src/gtk_client.c:1971
#, c-format
msgid "Bank: %s"
msgstr ""
-#: src/gtk_client.c:1980
+#: src/gtk_client.c:1979
msgid "Pay back:"
msgstr ""
-#: src/gtk_client.c:1983
+#: src/gtk_client.c:1982
msgid "Deposit"
msgstr ""
-#: src/gtk_client.c:1987
+#: src/gtk_client.c:1986
msgid "Withdraw"
msgstr ""
-#: src/gtk_client.c:2011
+#: src/gtk_client.c:2010
msgid "Pay all"
msgstr ""
-#: src/gtk_client.c:2033
+#: src/gtk_client.c:2032
msgid "Player List"
msgstr ""
-#: src/gtk_client.c:2122
+#: src/gtk_client.c:2121
msgid "Talk to player(s)"
msgstr ""
-#: src/gtk_client.c:2144
+#: src/gtk_client.c:2143
msgid "Talk to all players"
msgstr ""
-#: src/gtk_client.c:2148
+#: src/gtk_client.c:2147
msgid "Message:-"
msgstr ""
-#: src/gtk_client.c:2161
+#: src/gtk_client.c:2160
msgid "Send"
msgstr ""
-#: src/gtk_client.c:2254
+#: src/gtk_client.c:2253
msgid "Spy On Player"
msgstr ""
-#: src/gtk_client.c:2256
+#: src/gtk_client.c:2255
#, c-format
msgid ""
"Please choose the player to spy on. Your %s will\n"
t@@ -1816,11 +1816,11 @@ msgid ""
"you, so any %s or %s that he's carrying may be lost!"
msgstr ""
-#: src/gtk_client.c:2264
+#: src/gtk_client.c:2263
msgid "Tip Off The Cops"
msgstr ""
-#: src/gtk_client.c:2266
+#: src/gtk_client.c:2265
#, c-format
msgid ""
"Please choose the player to tip off the cops to. Your %s will\n"
t@@ -1829,71 +1829,71 @@ msgid ""
"so any %s or %s that he's carrying may be lost!"
msgstr ""
-#: src/gtk_client.c:2306
+#: src/gtk_client.c:2305
#, c-format
msgid "Sack %s"
msgstr ""
-#: src/gtk_client.c:2307
+#: src/gtk_client.c:2306
#, c-format
msgid ""
"Are you sure? (Any %s or %s carried\n"
"by this %s may be lost!)"
msgstr ""
-#: src/gtk_client.c:2328
+#: src/gtk_client.c:2327
msgid "Name"
msgstr ""
-#: src/gtk_client.c:2329
+#: src/gtk_client.c:2328
msgid "Price"
msgstr ""
-#: src/gtk_client.c:2330
+#: src/gtk_client.c:2329
msgid "Number"
msgstr ""
-#: src/gtk_client.c:2332
+#: src/gtk_client.c:2331
msgid "_Buy ->"
msgstr ""
-#: src/gtk_client.c:2333
+#: src/gtk_client.c:2332
msgid "<- _Sell"
msgstr ""
-#: src/gtk_client.c:2334
+#: src/gtk_client.c:2333
msgid "_Drop <-"
msgstr ""
-#: src/gtk_client.c:2339
+#: src/gtk_client.c:2338
#, c-format
msgid "%s here"
msgstr ""
-#: src/gtk_client.c:2342
+#: src/gtk_client.c:2341
#, c-format
msgid "%s carried"
msgstr ""
-#: src/gtk_client.c:2418
+#: src/gtk_client.c:2417
msgid "Change Name"
msgstr ""
-#: src/gtk_client.c:2428
+#: src/gtk_client.c:2427
msgid ""
"Unfortunately, somebody else is already using \"your\" name. Please change "
"it:-"
msgstr ""
-#: src/gtk_client.c:2487
+#: src/gtk_client.c:2486
msgid "Done"
msgstr ""
-#: src/gtk_client.c:2521
+#: src/gtk_client.c:2520
msgid "Spy reports"
msgstr ""
-#: src/gtk_client.c:2592
+#: src/gtk_client.c:2591
msgid ""
"No GTK+ client available - rebuild the binary passing the\n"
"--enable-gtk-client option to configure, or use the curses\n"
t@@ -1948,77 +1948,77 @@ msgstr ""
msgid "cannot read high score file\n"
msgstr ""
-#: src/serverside.c:257
+#: src/serverside.c:269
#, c-format
msgid "MaxClients (%d) exceeded - dropping connection"
msgstr ""
-#: src/serverside.c:261
+#: src/serverside.c:273
msgid ""
"Sorry, but this server has a limit of 1 player, which has been "
"reached.^Please try connecting again later."
msgstr ""
-#: src/serverside.c:266
+#: src/serverside.c:278
#, c-format
msgid ""
"Sorry, but this server has a limit of %d players, which has been "
"reached.^Please try connecting again later."
msgstr ""
-#: src/serverside.c:279
+#: src/serverside.c:291
#, c-format
msgid "%s will now be known as %s"
msgstr ""
-#: src/serverside.c:294
+#: src/serverside.c:306
msgid "Your dealing time is up..."
msgstr ""
-#: src/serverside.c:305
+#: src/serverside.c:317
#, c-format
msgid "%s: DENIED jet to %s"
msgstr ""
-#: src/serverside.c:362
+#: src/serverside.c:374
#, c-format
msgid "%s now spying on %s"
msgstr ""
-#: src/serverside.c:370
+#: src/serverside.c:382
#, c-format
msgid "%s spy on %s: DENIED"
msgstr ""
-#: src/serverside.c:376
+#: src/serverside.c:388
#, c-format
msgid "%s tipped off the cops to %s"
msgstr ""
-#: src/serverside.c:384
+#: src/serverside.c:396
#, c-format
msgid "%s tipoff about %s: DENIED"
msgstr ""
-#: src/serverside.c:492
+#: src/serverside.c:503
msgid "--More--"
msgstr ""
-#: src/serverside.c:503
+#: src/serverside.c:514
msgid "Pager exited abnormally - using stdout instead..."
msgstr ""
-#: src/serverside.c:518
+#: src/serverside.c:529
#, c-format
msgid "Maintaining pid file %s"
msgstr ""
-#: src/serverside.c:522
+#: src/serverside.c:533
#, c-format
msgid "Cannot create pid file %s"
msgstr ""
-#: src/serverside.c:571
+#: src/serverside.c:582
#, c-format
msgid ""
"Cannot open high score file %s.\n"
t@@ -2026,144 +2026,144 @@ msgid ""
"specify an alternate high score file with the -f command line option."
msgstr ""
-#: src/serverside.c:608
+#: src/serverside.c:619
#, c-format
msgid ""
"dopewars server version %s ready and waiting for connections\n"
"on port %d. For assistance with server commands, enter the command \"help\"\n"
msgstr ""
-#: src/serverside.c:625
+#: src/serverside.c:636
msgid "Cannot install SIGUSR1 interrupt handler!"
msgstr ""
-#: src/serverside.c:631
+#: src/serverside.c:642
msgid "Cannot install SIGINT interrupt handler!"
msgstr ""
-#: src/serverside.c:634
+#: src/serverside.c:645
msgid "Cannot install SIGTERM interrupt handler!"
msgstr ""
-#: src/serverside.c:637
+#: src/serverside.c:648
msgid "Cannot install SIGHUP interrupt handler!"
msgstr ""
-#: src/serverside.c:642
+#: src/serverside.c:653
msgid "Cannot install pipe handler!"
msgstr ""
-#: src/serverside.c:665
+#: src/serverside.c:676
msgid "Users currently logged on:-\n"
msgstr ""
-#: src/serverside.c:670
+#: src/serverside.c:681
msgid "No users currently logged on!"
msgstr ""
-#: src/serverside.c:674
+#: src/serverside.c:685
#, c-format
msgid "Pushing %s"
msgstr ""
-#: src/serverside.c:676 src/serverside.c:684
+#: src/serverside.c:687 src/serverside.c:695
msgid "No such user!"
msgstr ""
-#: src/serverside.c:680
+#: src/serverside.c:691
#, c-format
msgid "%s killed"
msgstr ""
-#: src/serverside.c:686
+#: src/serverside.c:697
msgid "Unknown command - try \"help\" for help..."
msgstr ""
-#: src/serverside.c:703
+#: src/serverside.c:714
#, c-format
msgid "got connection from %s"
msgstr ""
-#: src/serverside.c:719
+#: src/serverside.c:730
#, c-format
msgid "%s leaves the server!"
msgstr ""
-#: src/serverside.c:787
+#: src/serverside.c:798
msgid "Standard input closed."
msgstr ""
-#: src/serverside.c:930
+#: src/serverside.c:941
#, c-format
msgid "Unable to read high score file %s"
msgstr ""
-#: src/serverside.c:950
+#: src/serverside.c:961
msgid "Congratulations! You made the high scores!"
msgstr ""
-#: src/serverside.c:963
+#: src/serverside.c:974
msgid "You didn't even make the high score table..."
msgstr ""
-#: src/serverside.c:977
+#: src/serverside.c:988
#, c-format
msgid "Unable to write high score file %s"
msgstr ""
-#: src/serverside.c:996
+#: src/serverside.c:1007
msgid "(R.I.P.)"
msgstr ""
-#: src/serverside.c:1031
+#: src/serverside.c:1042
#, c-format
msgid "%s: Tipoff from %s"
msgstr ""
-#: src/serverside.c:1048
+#: src/serverside.c:1059
#, c-format
msgid "One of your %s was spying for %s.^The spy %s!"
msgstr ""
-#: src/serverside.c:1056
+#: src/serverside.c:1067
#, c-format
msgid "Your spy working with %s has been discovered!^The spy %s!"
msgstr ""
-#: src/serverside.c:1079
+#: src/serverside.c:1090
#, c-format
msgid " The lady next to you on the subway said,^ \"%s\"%s"
msgstr ""
-#: src/serverside.c:1082
+#: src/serverside.c:1093
msgid "^ (at least, you -think- that's what she said)"
msgstr ""
-#: src/serverside.c:1084
+#: src/serverside.c:1095
#, c-format
msgid " You hear someone playing %s"
msgstr ""
-#: src/serverside.c:1093 src/serverside.c:1102 src/serverside.c:1111
-#: src/serverside.c:1120
+#: src/serverside.c:1104 src/serverside.c:1113 src/serverside.c:1122
+#: src/serverside.c:1131
#, c-format
msgid "YN^Would you like to visit %s?"
msgstr ""
-#: src/serverside.c:1131
+#: src/serverside.c:1142
#, c-format
msgid "YN^^Would you like to hire %s %s for %s?"
msgstr ""
-#: src/serverside.c:1132
+#: src/serverside.c:1143
msgid "an"
msgstr ""
-#: src/serverside.c:1132
+#: src/serverside.c:1143
msgid "a"
msgstr ""
-#: src/serverside.c:1144
+#: src/serverside.c:1155
#, c-format
msgid "AE^%s is already here!^Do you Attack, or Evade?"
msgstr ""
t@@ -2172,336 +2172,336 @@ msgstr ""
#. The format string used for this purpose can be altered by
#. passing non-NULL "LoneMessage" (for unaccompanied Officer
#. Hardass) and/or "DeputyMessage" (for him with x deputies)
-#: src/serverside.c:1213
+#: src/serverside.c:1224
#, c-format
msgid "YN^Officer %s is chasing you!"
msgstr ""
-#: src/serverside.c:1215
+#: src/serverside.c:1226
#, c-format
msgid "YN^Officer %s and %d of his deputies are chasing you!"
msgstr ""
-#: src/serverside.c:1236
+#: src/serverside.c:1247
msgid "^Do you run?"
msgstr ""
-#: src/serverside.c:1239
+#: src/serverside.c:1250
msgid "^Do you Run, or Fight?"
msgstr ""
-#: src/serverside.c:1254
+#: src/serverside.c:1265
#, c-format
msgid "%s: tipoff by %s finished OK."
msgstr ""
-#: src/serverside.c:1260
+#: src/serverside.c:1271
#, c-format
msgid "Following your tipoff, the cops ambushed %s, who was shot dead"
msgstr ""
-#: src/serverside.c:1264
+#: src/serverside.c:1275
#, c-format
msgid "Following your tipoff, the cops ambushed %s, who escaped with %d %s. "
msgstr ""
-#: src/serverside.c:1301
+#: src/serverside.c:1312
msgid "^You stand there like an idiot."
msgstr ""
-#: src/serverside.c:1305
+#: src/serverside.c:1316
msgid "^You lose him in the alleys."
msgstr ""
-#: src/serverside.c:1307
+#: src/serverside.c:1318
msgid "^You lose them in the alleys."
msgstr ""
-#: src/serverside.c:1315
+#: src/serverside.c:1326
msgid "^You can't shake him, man!"
msgstr ""
-#: src/serverside.c:1317
+#: src/serverside.c:1328
msgid "^You can't shake them, man!"
msgstr ""
-#: src/serverside.c:1328
+#: src/serverside.c:1339
#, c-format
msgid "^You killed Officer %s! You find %s on his corpse!"
msgstr ""
-#: src/serverside.c:1342
+#: src/serverside.c:1353
#, c-format
msgid "YN^^^^Do you pay a doctor %s to sew your %s up?"
msgstr ""
-#: src/serverside.c:1346
+#: src/serverside.c:1357
#, c-format
msgid "YN^^^^Do you pay a doctor %s to sew you up?"
msgstr ""
-#: src/serverside.c:1358
+#: src/serverside.c:1369
msgid "^You got one, man!"
msgstr ""
-#: src/serverside.c:1361
+#: src/serverside.c:1372
msgid "^You missed!"
msgstr ""
-#: src/serverside.c:1365
+#: src/serverside.c:1376
msgid "^He's firing on you, man! "
msgstr ""
-#: src/serverside.c:1367
+#: src/serverside.c:1378
msgid "^They're firing on you, man! "
msgstr ""
-#: src/serverside.c:1370
+#: src/serverside.c:1381
msgid "You've been hit! "
msgstr ""
-#: src/serverside.c:1377
+#: src/serverside.c:1388
msgid "He wasted you, man! What a drag!"
msgstr ""
-#: src/serverside.c:1379
+#: src/serverside.c:1390
msgid "They wasted you, man! What a drag!"
msgstr ""
-#: src/serverside.c:1387
+#: src/serverside.c:1398
#, c-format
msgid "You lost one of your %s!"
msgstr ""
-#: src/serverside.c:1396
+#: src/serverside.c:1407
msgid "He missed!"
msgstr ""
-#: src/serverside.c:1398
+#: src/serverside.c:1409
msgid "They missed!"
msgstr ""
-#: src/serverside.c:1418
+#: src/serverside.c:1429
msgid "You were mugged in the subway!"
msgstr ""
-#: src/serverside.c:1429
+#: src/serverside.c:1440
#, c-format
msgid "You meet a friend! He gives you %d %s."
msgstr ""
-#: src/serverside.c:1434
+#: src/serverside.c:1445
#, c-format
msgid "You meet a friend! You give him %d %s."
msgstr ""
-#: src/serverside.c:1441
+#: src/serverside.c:1452
msgid "Sanitized away a RandomOffer"
msgstr ""
-#: src/serverside.c:1446
+#: src/serverside.c:1457
#, c-format
msgid ""
"Police dogs chase you for %d blocks! You dropped some %s! That's a drag, man!"
msgstr ""
-#: src/serverside.c:1460
+#: src/serverside.c:1471
#, c-format
msgid "You find %d %s on a dead dude in the subway!"
msgstr ""
-#: src/serverside.c:1472
+#: src/serverside.c:1483
#, c-format
msgid "Your mama made brownies with some of your %s! They were great!"
msgstr ""
-#: src/serverside.c:1480
+#: src/serverside.c:1491
msgid ""
"YN^There is some weed that smells like paraquat here!^It looks good! Will "
"you smoke it? "
msgstr ""
-#: src/serverside.c:1487
+#: src/serverside.c:1498
#, c-format
msgid "You stopped to %s."
msgstr ""
-#: src/serverside.c:1508
+#: src/serverside.c:1519
#, c-format
msgid "Would you like to buy a bigger trenchcoat for %s?"
msgstr ""
-#: src/serverside.c:1513
+#: src/serverside.c:1524
#, c-format
msgid "YN^Hey dude! I'll help carry your %s for a mere %s. Yes or no?"
msgstr ""
-#: src/serverside.c:1525
+#: src/serverside.c:1536
#, c-format
msgid "YN^Would you like to buy a %s for %s?"
msgstr ""
-#: src/serverside.c:1626 src/serverside.c:1737
+#: src/serverside.c:1637 src/serverside.c:1748
#, c-format
msgid "%s: offer was on behalf of %s"
msgstr ""
-#: src/serverside.c:1629
+#: src/serverside.c:1640
#, c-format
msgid "%s has accepted your %s!^Use the G key to contact your spy."
msgstr ""
-#: src/serverside.c:1675
+#: src/serverside.c:1686
msgid ""
"You hallucinated for three days on the wildest trip you ever imagined!^Then "
"you died because your brain disintegrated!"
msgstr ""
-#: src/serverside.c:1714
+#: src/serverside.c:1725
#, c-format
msgid "Too late - %s has just left!"
msgstr ""
-#: src/serverside.c:1740
+#: src/serverside.c:1751
#, c-format
msgid "%s has rejected your %s!"
msgstr ""
-#: src/serverside.c:1775
+#: src/serverside.c:1786
#, c-format
msgid "%s has got away!"
msgstr ""
-#: src/serverside.c:1816
+#: src/serverside.c:1827
#, c-format
msgid "%s has run off!"
msgstr ""
-#: src/serverside.c:1828
+#: src/serverside.c:1839
msgid "Coward! You successfully escaped from the fight."
msgstr ""
-#: src/serverside.c:1884
+#: src/serverside.c:1895
msgid "pitifully armed"
msgstr ""
-#: src/serverside.c:1885
+#: src/serverside.c:1896
msgid "lightly armed"
msgstr ""
-#: src/serverside.c:1886
+#: src/serverside.c:1897
msgid "moderately well armed"
msgstr ""
-#: src/serverside.c:1887
+#: src/serverside.c:1898
msgid "heavily armed"
msgstr ""
-#: src/serverside.c:1888
+#: src/serverside.c:1899
msgid "armed to the teeth"
msgstr ""
-#: src/serverside.c:1889
+#: src/serverside.c:1900
msgid " fires and "
msgstr ""
-#: src/serverside.c:1890
+#: src/serverside.c:1901
msgid " stands and takes it."
msgstr ""
-#: src/serverside.c:1893
+#: src/serverside.c:1904
#, c-format
msgid "%s arrives, with %d %s, %s,^%s"
msgstr ""
-#: src/serverside.c:1897
+#: src/serverside.c:1908
#, c-format
msgid "%s arrives, %s,^%s"
msgstr ""
-#: src/serverside.c:1902
+#: src/serverside.c:1913
#, c-format
msgid "%s fires and "
msgstr ""
-#: src/serverside.c:1904
+#: src/serverside.c:1915
#, c-format
msgid "%s stands and takes it."
msgstr ""
-#: src/serverside.c:1916
+#: src/serverside.c:1927
msgid "misses you!"
msgstr ""
-#: src/serverside.c:1917
+#: src/serverside.c:1928
#, c-format
msgid "You failed to hit %s."
msgstr ""
-#: src/serverside.c:1920
+#: src/serverside.c:1931
msgid "You stand and take it."
msgstr ""
-#: src/serverside.c:1924
+#: src/serverside.c:1935
msgid "hits you, man!"
msgstr ""
-#: src/serverside.c:1927
+#: src/serverside.c:1938
msgid " You've been wasted! What a drag!"
msgstr ""
-#: src/serverside.c:1928
+#: src/serverside.c:1939
#, c-format
msgid "You hit and killed %s"
msgstr ""
-#: src/serverside.c:1943 src/serverside.c:1976
+#: src/serverside.c:1954 src/serverside.c:1987
msgid ", and loot the body!"
msgstr ""
-#: src/serverside.c:1952
+#: src/serverside.c:1963
#, c-format
msgid "^You lost a %s, man!"
msgstr ""
-#: src/serverside.c:1957
+#: src/serverside.c:1968
#, c-format
msgid "You are paid a bounty of %s in reward for killing^one of %s's %s"
msgstr ""
-#: src/serverside.c:1965
+#: src/serverside.c:1976
#, c-format
msgid "You killed one of %s's %s (%d left)"
msgstr ""
-#: src/serverside.c:1983
+#: src/serverside.c:1994
#, c-format
msgid "You fire, and hit %s!"
msgstr ""
-#: src/serverside.c:2023
+#: src/serverside.c:2034
msgid "YN^Officer %%s spots you dropping %s, and chases you!"
msgstr ""
-#: src/serverside.c:2025
+#: src/serverside.c:2036
msgid ""
"YN^Officer %%s and %%d of his deputies spot you dropping %s, and chase you!"
msgstr ""
-#: src/serverside.c:2180
+#: src/serverside.c:2191
msgid "Player removed due to idle timeout"
msgstr ""
-#: src/serverside.c:2190
+#: src/serverside.c:2201
msgid "Player removed due to connect timeout"
msgstr ""
-#: src/serverside.c:2196 src/serverside.c:2202
+#: src/serverside.c:2207 src/serverside.c:2213
#, c-format
msgid "%s fails to return fire..."
msgstr ""
-#: src/message.c:437
+#: src/message.c:449
#, c-format
msgid ""
"This server is version %s, while your client is version %s.\n"
t@@ -2510,27 +2510,27 @@ msgid ""
"for the latest version."
msgstr ""
-#: src/message.c:576
+#: src/message.c:588
msgid "Could not find host"
msgstr ""
-#: src/message.c:577
+#: src/message.c:589
msgid "Could not create network socket"
msgstr ""
-#: src/message.c:578 src/message.c:611
+#: src/message.c:590 src/message.c:623
msgid "Connection refused or no server present"
msgstr ""
-#: src/message.c:757
+#: src/message.c:789
msgid "Cannot locate metaserver"
msgstr ""
-#: src/message.c:758
+#: src/message.c:790
msgid "Cannot create socket"
msgstr ""
-#: src/message.c:760
+#: src/message.c:792
msgid "Metaserver not running HTTP or connection denied"
msgstr ""
t@@ -2564,26 +2564,26 @@ msgstr ""
msgid "Using name %s\n"
msgstr ""
-#: src/AIPlayer.c:130
+#: src/AIPlayer.c:131
msgid "Players in this game:-\n"
msgstr ""
-#: src/AIPlayer.c:160
+#: src/AIPlayer.c:161
#, c-format
msgid "%s joins the game.\n"
msgstr ""
-#: src/AIPlayer.c:163
+#: src/AIPlayer.c:164
#, c-format
msgid "%s has left the game.\n"
msgstr ""
-#: src/AIPlayer.c:171
+#: src/AIPlayer.c:172
#, c-format
msgid "Jetting to %s with %s cash and %s debt"
msgstr ""
-#: src/AIPlayer.c:191
+#: src/AIPlayer.c:192
msgid "AI Player killed. Terminating normally.\n"
msgstr ""
t@@ -2591,75 +2591,75 @@ msgstr ""
msgid "Game time is up. Leaving game.\n"
msgstr ""
-#: src/AIPlayer.c:216
+#: src/AIPlayer.c:215
msgid "AI Player pushed from the server.\n"
msgstr ""
-#: src/AIPlayer.c:220
+#: src/AIPlayer.c:218
msgid "The server has terminated.\n"
msgstr ""
-#: src/AIPlayer.c:276
+#: src/AIPlayer.c:272
#, c-format
msgid "Selling %d %s at %s\n"
msgstr ""
-#: src/AIPlayer.c:292
+#: src/AIPlayer.c:288
#, c-format
msgid "Buying %d %s at %s\n"
msgstr ""
-#: src/AIPlayer.c:321
+#: src/AIPlayer.c:317
#, c-format
msgid "Buying a %s for %s at the gun shop\n"
msgstr ""
-#: src/AIPlayer.c:361
+#: src/AIPlayer.c:357
#, c-format
msgid "Debt of %s paid off to loan shark\n"
msgstr ""
-#: src/AIPlayer.c:386
+#: src/AIPlayer.c:382
#, c-format
msgid "Loan shark located at %s\n"
msgstr ""
-#: src/AIPlayer.c:394
+#: src/AIPlayer.c:390
#, c-format
msgid "Gun shop located at %s\n"
msgstr ""
-#: src/AIPlayer.c:402
+#: src/AIPlayer.c:398
#, c-format
msgid "Pub located at %s\n"
msgstr ""
-#: src/AIPlayer.c:415
+#: src/AIPlayer.c:411
#, c-format
msgid "Bank located at %s\n"
msgstr ""
-#: src/AIPlayer.c:439
+#: src/AIPlayer.c:435
msgid "Call yourselves drug dealers?"
msgstr ""
-#: src/AIPlayer.c:440
+#: src/AIPlayer.c:436
msgid "A trained monkey could do better..."
msgstr ""
-#: src/AIPlayer.c:441
+#: src/AIPlayer.c:437
msgid "Think you're hard enough to deal with the likes of me?"
msgstr ""
-#: src/AIPlayer.c:442
+#: src/AIPlayer.c:438
msgid "Zzzzz... are you dealing in candy or what?"
msgstr ""
-#: src/AIPlayer.c:443
+#: src/AIPlayer.c:439
msgid "Reckon I'll just have to shoot you for your own good."
msgstr ""
-#: src/AIPlayer.c:452
+#: src/AIPlayer.c:448
msgid ""
"This binary has been compiled without networking support, and thus cannot "
"act as an AI player.\n"
(DIR) diff --git a/src/AIPlayer.c b/src/AIPlayer.c
t@@ -121,7 +121,8 @@ int HandleAIMessage(char *Message,Player *AIPlay) {
gchar *prstr,*prstr2;
struct timeval tv;
gboolean Handled;
- if (ProcessMessage(Message,&From,&AICode,&Code,&To,&Data,FirstClient)==-1) {
+ if (ProcessMessage(Message,AIPlay,&From,&AICode,&Code,&To,
+ &Data,FirstClient)==-1) {
g_warning("Bad network message. Oops."); return 0;
}
Handled=HandleGenericClientMessage(From,AICode,Code,To,Data,NULL);
t@@ -189,7 +190,6 @@ int HandleAIMessage(char *Message,Player *AIPlay) {
}
if (AIPlay->Health==0) {
g_print(_("AI Player killed. Terminating normally.\n"));
- g_free(Data);
return 1;
}
break;
t@@ -210,22 +210,18 @@ int HandleAIMessage(char *Message,Player *AIPlay) {
break;
case C_ENDHISCORE:
g_print(_("Game time is up. Leaving game.\n"));
- g_free(Data);
return 1;
case C_PUSH:
g_print(_("AI Player pushed from the server.\n"));
- g_free(Data);
return 1;
case C_QUIT:
g_print(_("The server has terminated.\n"));
- g_free(Data);
return 1;
default:
if (!Handled) g_message("%s^%c^%s%s\n",GetPlayerName(From),Code,
GetPlayerName(To),Data);
break;
}
- g_free(Data);
return 0;
}
(DIR) diff --git a/src/curses_client.c b/src/curses_client.c
t@@ -587,9 +587,9 @@ void HandleClientMessage(char *Message,Player *Play) {
int i;
gboolean Handled;
-/* Ignore To: field (use tmp Player pointer for this) - all messages
- will be for Player "Play" */
- if (ProcessMessage(Message,&From,&AICode,&Code,&tmp,&Data,FirstClient)==-1) {
+/* Ignore To: field - all messages will be for Player "Play" */
+ if (ProcessMessage(Message,Play,&From,&AICode,&Code,NULL,
+ &Data,FirstClient)==-1) {
return;
}
t@@ -732,7 +732,6 @@ void HandleClientMessage(char *Message,Player *Play) {
}
break;
}
- g_free(Data);
}
void PrepareHighScoreScreen() {
(DIR) diff --git a/src/dopewars.c b/src/dopewars.c
t@@ -490,6 +490,21 @@ GSList *AddPlayer(int fd,Player *NewPlayer,GSList *First) {
/* start of the list. If this function is called by the server, then */
/* it should pass the file descriptor of the socket used to */
/* communicate with the client player. */
+ Player *tmp;
+ GSList *list;
+ list=First;
+ NewPlayer->ID=0;
+/* Generate a unique player ID, if we're the server (clients get their IDs
+ from the server, so don't need to generate IDs) */
+ if (Server) while (list) {
+ tmp=(Player *)list->data;
+ if (tmp->ID==NewPlayer->ID) {
+ NewPlayer->ID++;
+ list=First;
+ } else {
+ list=g_slist_next(list);
+ }
+ }
NewPlayer->fd=-1;
NewPlayer->Name=NULL;
SetPlayerName(NewPlayer,NULL);
t@@ -573,6 +588,19 @@ void SetPlayerName(Player *Play,char *Name) {
else Play->Name = g_strdup(Name);
}
+Player *GetPlayerByID(guint ID,GSList *First) {
+/* Searches the linked list starting at "First" for a Player structure */
+/* with the given ID. Returns a pointer to this structure, or NULL if */
+/* no match can be found. */
+ GSList *list;
+ Player *Play;
+ for (list=First;list;list=g_slist_next(list)) {
+ Play=(Player *)list->data;
+ if (Play->ID==ID) return Play;
+ }
+ return NULL;
+}
+
Player *GetPlayerByName(char *Name,GSList *First) {
/* Searches the linked list starting at "First" for a Player structure */
/* with the name "Name". Returns a pointer to this structure, or NULL */
(DIR) diff --git a/src/dopewars.h b/src/dopewars.h
t@@ -283,6 +283,7 @@ typedef struct tagConnBuf {
} ConnBuf;
struct PLAYER_T {
+ guint ID;
int Turn;
price_t Cash,Debt,Bank;
int Health;
t@@ -338,6 +339,7 @@ extern GSList *ServerList;
extern GScannerConfig ScannerConfig;
GSList *RemovePlayer(Player *Play,GSList *First);
+Player *GetPlayerByID(guint ID,GSList *First);
Player *GetPlayerByName(gchar *Name,GSList *First);
int CountPlayers(GSList *First);
GSList *AddPlayer(int fd,Player *NewPlayer,GSList *First);
(DIR) diff --git a/src/gtk_client.c b/src/gtk_client.c
t@@ -287,8 +287,8 @@ void HandleClientMessage(char *pt,Player *Play) {
GtkWidget *MenuItem;
GSList *list;
-/* Ignore To: field (bin it in "tmp") as all messages should be for "Play" */
- if (ProcessMessage(pt,&From,&AICode,&Code,&tmp,&Data,FirstClient)==-1) {
+/* Ignore To: field as all messages should be for "Play" */
+ if (ProcessMessage(pt,Play,&From,&AICode,&Code,NULL,&Data,FirstClient)==-1) {
return;
}
t@@ -388,7 +388,6 @@ void HandleClientMessage(char *pt,Player *Play) {
}
break;
}
- g_free(Data);
}
struct HiScoreDiaStruct {
(DIR) diff --git a/src/message.c b/src/message.c
t@@ -92,9 +92,16 @@ void SendClientMessage(Player *From,char AICode,char Code,
Player *ServerFrom;
g_assert(BufOwn!=NULL);
text=g_string_new(NULL);
- g_string_sprintf(text,"%s^%s^%c%c%s",From ? GetPlayerName(From) : "",
- To ? GetPlayerName(To) : "",AICode,Code,
- Data ? Data : "");
+ if (HaveAbility(BufOwn,A_PLAYERID)) {
+ if (From) g_string_sprintf(text,"%d",From->ID);
+ g_string_append_c(text,'^');
+ if (To) g_string_sprintfa(text,"%d",To->ID);
+ g_string_sprintfa(text,"^%c%c%s",AICode,Code,Data ? Data : "");
+ } else {
+ g_string_sprintf(text,"%s^%s^%c%c%s",From ? GetPlayerName(From) : "",
+ To ? GetPlayerName(To) : "",AICode,Code,
+ Data ? Data : "");
+ }
#if NETWORKING
if (!Network) {
t@@ -135,15 +142,17 @@ void SendServerMessage(Player *From,char AICode,char Code,
/* Sends a message from the server to client player "To" with computer */
/* code "AICode", human-readable code "Code" and data "Data". The message */
/* will claim to be from or on behalf of player "From" */
- gchar *text;
+ GString *text;
if (!Network) {
- text=g_strdup_printf("%s^%s^%c%c%s",From ? GetPlayerName(From) : "",
- To ? GetPlayerName(To) : "",AICode,Code,
- Data ? Data : "");
+ text=g_string_new("");
+ if (From) g_string_sprintf(text,"%d",From->ID);
+ g_string_append_c(text,'^');
+ if (To) g_string_sprintfa(text,"%d",To->ID);
+ g_string_sprintfa(text,"^%c%c%s",AICode,Code,Data ? Data : "");
if (ClientMessageHandlerPt) {
- (*ClientMessageHandlerPt)(text,(Player *)(FirstClient->data));
+ (*ClientMessageHandlerPt)(text->str,(Player *)(FirstClient->data));
}
- g_free(text);
+ g_string_free(text,TRUE);
} else SendClientMessage(From,AICode,Code,To,Data,To);
}
t@@ -191,7 +200,7 @@ void CombineAbilities(Player *Play) {
gboolean HaveAbility(Player *Play,gint Type) {
if (Type<0 || Type>=A_NUM) return FALSE;
- else return (Play->Abil.Shared[Type]=='1');
+ else return (Play->Abil.Shared[Type]);
}
#if NETWORKING
t@@ -404,17 +413,19 @@ void SendSpyReport(Player *To,Player *SpiedOn) {
}
void SendInitialData(Player *To) {
- gchar *text;
+ GString *text;
if (!Network) return;
- text=g_strdup_printf("%s^%d^%d^%d^%s^%s^%s^%s^%s^%s^%s^%s^",
- VERSION,NumLocation,NumGun,NumDrug,
- Names.Bitch,Names.Bitches,Names.Gun,Names.Guns,
- Names.Drug,Names.Drugs,Names.Month,Names.Year);
- SendServerMessage(NULL,C_NONE,C_INIT,To,text);
- g_free(text);
+ text=g_string_new("");
+ g_string_sprintf(text,"%s^%d^%d^%d^%s^%s^%s^%s^%s^%s^%s^%s^",
+ VERSION,NumLocation,NumGun,NumDrug,
+ Names.Bitch,Names.Bitches,Names.Gun,Names.Guns,
+ Names.Drug,Names.Drugs,Names.Month,Names.Year);
+ if (HaveAbility(To,A_PLAYERID)) g_string_sprintfa(text,"%d^",To->ID);
+ SendServerMessage(NULL,C_NONE,C_INIT,To,text->str);
+ g_string_free(text,TRUE);
}
-void ReceiveInitialData(char *Data) {
+void ReceiveInitialData(Player *Play,char *Data) {
char *pt,*ServerVersion;
GSList *list;
pt=Data;
t@@ -433,6 +444,7 @@ void ReceiveInitialData(char *Data) {
AssignName(&Names.Drugs,GetNextWord(&pt,""));
AssignName(&Names.Month,GetNextWord(&pt,""));
AssignName(&Names.Year,GetNextWord(&pt,""));
+ if (HaveAbility(Play,A_PLAYERID)) Play->ID=GetNextInt(&pt,0);
if (strcmp(VERSION,ServerVersion)!=0) {
g_message(_("This server is version %s, while your client is "
"version %s.\nBe warned that different versions may not be fully compatible!\n"
t@@ -663,33 +675,50 @@ void ShutdownNetwork() {
Client=Network=Server=FALSE;
}
-int ProcessMessage(char *Msg,Player **From,char *AICode,char *Code,
+int ProcessMessage(char *Msg,Player *Play,Player **From,char *AICode,char *Code,
Player **To,char **Data,GSList *First) {
/* Given a "raw" message in "Msg" and a pointer to the start of the linked */
/* list of known players in "First", sets the other arguments to the message */
-/* fields. Data is a dynamically-allocated buffer, which must be g_free'd by */
-/* the caller. Returns 0 on success, -1 on failure. */
- gchar **split;
- Player *tmp;
+/* fields. Data is returned as a pointer into the message "Msg", and should */
+/* therefore NOT be g_free'd. "Play" is a pointer to the player which is */
+/* receiving the message. Returns 0 on success, -1 on failure. */
+ gchar *pt,*buf;
+ guint ID;
+
+ *AICode=*Code=C_NONE;
+ pt=Msg;
+ buf=GetNextWord(&pt,NULL);
+ if (From) {
+ if (HaveAbility(Play,A_PLAYERID)) {
+ if (buf[0]) {
+ ID=atoi(buf);
+ *From=GetPlayerByID(ID,First);
+ } else *From=&Noone;
+ } else {
+ *From=GetPlayerByName(buf,First);
+ }
+ if (!(*From)) return -1;
+ }
- *Data=NULL;
- split=g_strsplit(Msg,"^",2);
- if (split[0]) {
- tmp=GetPlayerByName(split[0],First);
- if (tmp && split[1]) {
- *From=tmp;
- tmp=GetPlayerByName(split[1],First);
- if (tmp && split[2]) {
- *To=tmp;
- *AICode=split[2][0];
- *Code=split[2][1];
- *Data=g_strdup(split[2]+2);
- g_strfreev(split);
- return 0;
- }
+ buf=GetNextWord(&pt,NULL);
+ if (To) {
+ if (HaveAbility(Play,A_PLAYERID)) {
+ if (buf[0]) {
+ ID=atoi(buf);
+ *To=GetPlayerByID(ID,First);
+ } else *To=&Noone;
+ } else {
+ *To=GetPlayerByName(buf,First);
}
+ if (!(*To)) return -1;
+ }
+
+ if (strlen(pt)>=2) {
+ *AICode=pt[0];
+ *Code=pt[1];
+ *Data=&pt[2];
+ return 0;
}
- g_strfreev(split);
return -1;
}
t@@ -707,20 +736,23 @@ void ReceiveDrugsHere(char *text,Player *To) {
}
gboolean HandleGenericClientMessage(Player *From,char AICode,char Code,
- Player *To,char *Data,char *DisplayMode) {
+ Player *To,char *Data,char *DisplayMode) {
/* Handles messages that both human clients and AI players deal with in the */
/* same way. */
Player *tmp;
+ gchar *pt;
switch(Code) {
case C_LIST: case C_JOIN:
tmp=g_new(Player,1);
FirstClient=AddPlayer(0,tmp,FirstClient);
- SetPlayerName(tmp,Data);
+ pt=Data;
+ SetPlayerName(tmp,GetNextWord(&pt,NULL));
+ if (HaveAbility(To,A_PLAYERID)) tmp->ID=GetNextInt(&pt,0);
break;
case C_DATA:
ReceiveMiscData(Data); break;
case C_INIT:
- ReceiveInitialData(Data); break;
+ ReceiveInitialData(To,Data); break;
case C_ABILITIES:
ReceiveAbilities(To,Data); CombineAbilities(To);
break;
(DIR) diff --git a/src/message.h b/src/message.h
t@@ -122,7 +122,7 @@ void SendPlayerData(Player *To);
void SendSpyReport(Player *To,Player *SpiedOn);
void ReceivePlayerData(char *text,Player *From);
void SendInitialData(Player *To);
-void ReceiveInitialData(char *data);
+void ReceiveInitialData(Player *Play,char *data);
void SendMiscData(Player *To);
void ReceiveMiscData(char *Data);
gchar *GetNextWord(gchar **Data,gchar *Default);
t@@ -133,7 +133,7 @@ char *SetupNetwork(gboolean NonBlocking);
char *FinishSetupNetwork();
void ShutdownNetwork();
void SwitchToSinglePlayer(Player *Play);
-int ProcessMessage(char *Msg,Player **From,char *AICode,char *Code,
+int ProcessMessage(char *Msg,Player *Play,Player **From,char *AICode,char *Code,
Player **To,char **Data,GSList *First);
void ReceiveDrugsHere(char *text,Player *To);
gboolean HandleGenericClientMessage(Player *From,char AICode,char Code,
(DIR) diff --git a/src/serverside.c b/src/serverside.c
t@@ -187,6 +187,18 @@ void HandleServerPlayer(Player *Play) {
}
}
+void SendPlayerDetails(Player *Play,Player *To,char Code) {
+/* Sends details (name, ID) about player "Play" to player "To", using */
+/* message code "Code" */
+ GString *text;
+ text=g_string_new(GetPlayerName(Play));
+ if (HaveAbility(To,A_PLAYERID)) {
+ g_string_sprintfa(text,"^%d",Play->ID);
+ }
+ SendServerMessage(NULL,C_NONE,Code,To,text->str);
+ g_string_free(text,TRUE);
+}
+
void HandleServerMessage(gchar *buf,Player *Play) {
/* Given a message "buf", from player "Play", performs processing and */
/* sends suitable replies. */
t@@ -198,8 +210,8 @@ void HandleServerMessage(gchar *buf,Player *Play) {
int i;
price_t money;
-/* Ignore client's From: field (bin it in tmp) - should always be "Play" */
- if (ProcessMessage(buf,&tmp,&AICode,&Code,&To,&Data,FirstServer)==-1) {
+/* Ignore client's From: field - should always be "Play" */
+ if (ProcessMessage(buf,Play,NULL,&AICode,&Code,&To,&Data,FirstServer)==-1) {
g_warning("Bad message");
return;
}
t@@ -237,10 +249,7 @@ void HandleServerMessage(gchar *buf,Player *Play) {
SetPlayerName(Play,Data);
for (list=FirstServer;list;list=g_slist_next(list)) {
pt=(Player *)list->data;
- if (pt!=Play) {
- SendServerMessage(NULL,C_NONE,C_LIST,Play,
- GetPlayerName(pt));
- }
+ if (pt!=Play) SendPlayerDetails(pt,Play,C_LIST);
}
SendServerMessage(NULL,C_NONE,C_ENDLIST,Play,NULL);
RegisterWithMetaServer(TRUE,FALSE);
t@@ -249,7 +258,10 @@ void HandleServerMessage(gchar *buf,Player *Play) {
if (Network) {
g_message(_("%s joins the game!"),GetPlayerName(Play));
}
- BroadcastToClients(C_NONE,C_JOIN,GetPlayerName(Play),NULL,Play);
+ for (list=FirstServer;list;list=g_slist_next(list)) {
+ pt=(Player *)list->data;
+ if (pt!=Play) SendPlayerDetails(Play,pt,C_JOIN);
+ }
Play->EventNum=E_ARRIVE;
SendPlayerData(Play);
SendEvent(Play);
t@@ -398,7 +410,6 @@ void HandleServerMessage(gchar *buf,Player *Play) {
GetPlayerName(To),Data);
break;
}
- g_free(Data);
}
void ClientLeftServer(Player *Play) {
(DIR) diff --git a/src/win32_client.c b/src/win32_client.c
t@@ -241,8 +241,8 @@ static void HandleClientMessage(char *pt,Player *Play) {
gchar *text;
LRESULT Answer;
GSList *list;
-/* Ignore server's To: field (bin it in tmp); use "Play" instead */
- if (ProcessMessage(pt,&From,&AICode,&Code,&tmp,&Data,FirstClient)==-1) {
+/* Ignore server's To: field; use "Play" instead */
+ if (ProcessMessage(pt,Play,&From,&AICode,&Code,NULL,&Data,FirstClient)==-1) {
return;
}
Handled=HandleGenericClientMessage(From,AICode,Code,Play,Data,&DisplayMode);