tMessage-handling code tidied up for new clients/servers - 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 b8e6c1180be932834cd0e7e59f211c5aa31a83ca
(DIR) parent f6eb1f80293e4987d855294318867a02ca6a9541
(HTM) Author: Ben Webb <ben@salilab.org>
Date: Wed, 13 Sep 2000 16:28:59 +0000
Message-handling code tidied up for new clients/servers
Diffstat:
M TODO | 2 --
M po/dopewars.pot | 590 +++++++++++++++---------------
M src/AIPlayer.c | 35 +++++++++++++++----------------
M src/curses_client.c | 57 ++++++++++++++++---------------
M src/gtk_client.c | 47 ++++++++++++-------------------
M src/message.c | 179 +++++++++++++++++++++----------
M src/message.h | 10 +++++++---
M src/serverside.c | 3 +--
M src/win32_client.c | 41 +++++++++++++------------------
9 files changed, 505 insertions(+), 459 deletions(-)
---
(DIR) diff --git a/TODO b/TODO
t@@ -1,5 +1,3 @@
-- Ignore "To" message field in client, and "From" field in server; use
- A_PLAYERID ability to replace player names in protocol with player IDs
- Fix GTK+ modal dialog behaviour (mouse grabbing during fighting) - _seems_
to be OK...
- Revamp player-player fighting
(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 05:02+0100\n"
+"POT-Creation-Date: 2000-09-13 16:56+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@@ -998,7 +998,7 @@ msgstr ""
msgid "CLQP"
msgstr ""
-#: src/curses_client.c:371 src/gtk_client.c:807
+#: src/curses_client.c:371 src/gtk_client.c:804
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:826
+#: src/curses_client.c:454 src/curses_client.c:829
msgid "What do you wish to buy? "
msgstr ""
-#: src/curses_client.c:456 src/curses_client.c:828
+#: src/curses_client.c:456 src/curses_client.c:831
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:1688
+#: src/curses_client.c:544 src/curses_client.c:562 src/curses_client.c:1691
msgid "YN"
msgstr ""
t@@ -1096,257 +1096,257 @@ msgstr ""
msgid "New name: "
msgstr ""
-#: src/curses_client.c:621
+#: src/curses_client.c:624
msgid "You have been pushed from the server. Reverting to single player mode."
msgstr ""
-#: src/curses_client.c:631
+#: src/curses_client.c:634
msgid "The server has terminated. Reverting to single player mode."
msgstr ""
-#: src/curses_client.c:646 src/gtk_client.c:337 src/serverside.c:259
+#: src/curses_client.c:649 src/gtk_client.c:335 src/serverside.c:258
#, c-format
msgid "%s joins the game!"
msgstr ""
-#: src/curses_client.c:651 src/gtk_client.c:343
+#: src/curses_client.c:654 src/gtk_client.c:341
#, c-format
msgid "%s has left the game."
msgstr ""
-#: src/curses_client.c:656
+#: src/curses_client.c:659
#, c-format
msgid "%s will now be known as %s."
msgstr ""
-#: src/curses_client.c:680
+#: src/curses_client.c:683
msgid "S U B W A Y"
msgstr ""
-#: src/curses_client.c:723
+#: src/curses_client.c:726
msgid ""
"Unfortunately, somebody else is already using \"your\" name. Please change "
"it."
msgstr ""
-#: src/curses_client.c:744
+#: src/curses_client.c:747
msgid "H I G H S C O R E S"
msgstr ""
-#: src/curses_client.c:800
+#: src/curses_client.c:803
msgid "Will you B>uy, S>ell, or L>eave? "
msgstr ""
-#: src/curses_client.c:805
+#: src/curses_client.c:808
msgid "BSL"
msgstr ""
-#: src/curses_client.c:810
+#: src/curses_client.c:813
#, c-format
msgid "You don't have any %s to sell!"
msgstr ""
-#: src/curses_client.c:817 src/gtk_client.c:1083
+#: src/curses_client.c:820 src/gtk_client.c:1079
#, c-format
msgid "You'll need more %s to carry any more %s!"
msgstr ""
-#: src/curses_client.c:839 src/gtk_client.c:1087
+#: src/curses_client.c:842 src/gtk_client.c:1083
#, c-format
msgid "You don't have enough space to carry that %s!"
msgstr ""
-#: src/curses_client.c:847 src/gtk_client.c:1091
+#: src/curses_client.c:850 src/gtk_client.c:1087
#, c-format
msgid "You don't have enough cash to buy that %s!"
msgstr ""
-#: src/curses_client.c:860 src/gtk_client.c:1095
+#: src/curses_client.c:863 src/gtk_client.c:1091
msgid "You don't have any to sell!"
msgstr ""
-#: src/curses_client.c:884
+#: src/curses_client.c:887
msgid "How much money do you pay back? "
msgstr ""
-#: src/curses_client.c:890 src/curses_client.c:920 src/gtk_client.c:1930
+#: src/curses_client.c:893 src/curses_client.c:923 src/gtk_client.c:1924
msgid "You don't have that much money!"
msgstr ""
-#: src/curses_client.c:910
+#: src/curses_client.c:913
msgid "Do you want to D>eposit money, W>ithdraw money, or L>eave ? "
msgstr ""
-#: src/curses_client.c:913
+#: src/curses_client.c:916
msgid "DWL"
msgstr ""
-#: src/curses_client.c:915
+#: src/curses_client.c:918
msgid "How much money? "
msgstr ""
-#: src/curses_client.c:923 src/gtk_client.c:1923
+#: src/curses_client.c:926 src/gtk_client.c:1917
msgid "There isn't that much money in the bank..."
msgstr ""
-#: src/curses_client.c:1002
+#: src/curses_client.c:1005
msgid "Press any key..."
msgstr ""
-#: src/curses_client.c:1133
+#: src/curses_client.c:1136
msgid "Messages"
msgstr ""
-#: src/curses_client.c:1140 src/gtk_client.c:1381
+#: src/curses_client.c:1143 src/gtk_client.c:1376
msgid "Stats"
msgstr ""
-#: src/curses_client.c:1143
+#: src/curses_client.c:1146
#, c-format
msgid "Cash %17s"
msgstr ""
-#: src/curses_client.c:1150
+#: src/curses_client.c:1153
#, c-format
msgid "Health %3d"
msgstr ""
-#: src/curses_client.c:1152
+#: src/curses_client.c:1155
#, c-format
msgid "Bank %17s"
msgstr ""
-#: src/curses_client.c:1156
+#: src/curses_client.c:1159
#, c-format
msgid "Debt %17s"
msgstr ""
-#: src/curses_client.c:1160
+#: src/curses_client.c:1163
#, c-format
msgid "Space %6d"
msgstr ""
-#: src/curses_client.c:1162
+#: src/curses_client.c:1165
#, c-format
msgid "%s %3d Space %6d"
msgstr ""
-#: src/curses_client.c:1173
+#: src/curses_client.c:1176
msgid "Trenchcoat"
msgstr ""
-#: src/curses_client.c:1213
+#: src/curses_client.c:1216
#, c-format
msgid "Spy reports for %s"
msgstr ""
-#: src/curses_client.c:1217 src/curses_client.c:1222
+#: src/curses_client.c:1220 src/curses_client.c:1225
#, c-format
msgid "%s..."
msgstr ""
-#: src/curses_client.c:1243
+#: src/curses_client.c:1246
msgid "No other players are currently logged on!"
msgstr ""
-#: src/curses_client.c:1248
+#: src/curses_client.c:1251
msgid "Players currently logged on:-"
msgstr ""
-#: src/curses_client.c:1396
+#: src/curses_client.c:1399
msgid "Hey dude, what's your name? "
msgstr ""
-#: src/curses_client.c:1430
+#: src/curses_client.c:1433
#, c-format
msgid "Hey dude, the prices of %s here are:"
msgstr ""
-#: src/curses_client.c:1442
+#: src/curses_client.c:1445
msgid "Will you B>uy"
msgstr ""
-#: src/curses_client.c:1443
+#: src/curses_client.c:1446
msgid ", S>ell"
msgstr ""
-#: src/curses_client.c:1444
+#: src/curses_client.c:1447
msgid ", D>rop"
msgstr ""
-#: src/curses_client.c:1445
+#: src/curses_client.c:1448
msgid ", T>alk, P>age, L>ist"
msgstr ""
-#: src/curses_client.c:1448
+#: src/curses_client.c:1451
msgid ", G>ive"
msgstr ""
-#: src/curses_client.c:1451
+#: src/curses_client.c:1454
msgid ", F>ight"
msgstr ""
-#: src/curses_client.c:1455
+#: src/curses_client.c:1458
msgid ", J>et"
msgstr ""
-#: src/curses_client.c:1457 src/curses_client.c:1472
+#: src/curses_client.c:1460 src/curses_client.c:1475
msgid ", or Q>uit? "
msgstr ""
-#: src/curses_client.c:1465
+#: src/curses_client.c:1468
msgid "Do you "
msgstr ""
-#: src/curses_client.c:1467
+#: src/curses_client.c:1470
msgid "F>ight, "
msgstr ""
-#: src/curses_client.c:1468
+#: src/curses_client.c:1471
msgid "S>tand, "
msgstr ""
-#: src/curses_client.c:1470
+#: src/curses_client.c:1473
msgid "R>un, "
msgstr ""
-#: src/curses_client.c:1471
+#: src/curses_client.c:1474
msgid "D>eal "
msgstr ""
-#: src/curses_client.c:1514
+#: src/curses_client.c:1517
msgid "Connection to server lost! Reverting to single player mode"
msgstr ""
-#: src/curses_client.c:1543
+#: src/curses_client.c:1546
msgid "BSDTPLGFJQ"
msgstr ""
-#: src/curses_client.c:1545
+#: src/curses_client.c:1548
msgid "DRFSQ"
msgstr ""
-#: src/curses_client.c:1573
+#: src/curses_client.c:1576
msgid "List what? P>layers or S>cores? "
msgstr ""
-#: src/curses_client.c:1574
+#: src/curses_client.c:1577
msgid "PS"
msgstr ""
-#: src/curses_client.c:1583
+#: src/curses_client.c:1586
msgid "Whom do you want to page (talk privately to) ? "
msgstr ""
-#: src/curses_client.c:1598
+#: src/curses_client.c:1601
msgid "Talk: "
msgstr ""
-#: src/curses_client.c:1687
+#: src/curses_client.c:1690
msgid "Play again? "
msgstr ""
-#: src/curses_client.c:1699
+#: src/curses_client.c:1702
msgid ""
"No curses client available - rebuild the binary passing the\n"
"--enable-curses-client option to configure, or use a windowed\n"
t@@ -1441,216 +1441,216 @@ msgstr ""
msgid "Start new game"
msgstr ""
-#: src/gtk_client.c:208
+#: src/gtk_client.c:207
msgid "Inventory"
msgstr ""
-#: src/gtk_client.c:236 src/gtk_client.c:2166 src/gtk_client.c:2534
+#: src/gtk_client.c:235 src/gtk_client.c:2159 src/gtk_client.c:2523
msgid "Close"
msgstr ""
-#: src/gtk_client.c:266
+#: src/gtk_client.c:265
msgid "Connection to server lost - switching to single player mode"
msgstr ""
-#: src/gtk_client.c:311
+#: src/gtk_client.c:309
msgid "You have been pushed from the server."
msgstr ""
-#: src/gtk_client.c:316
+#: src/gtk_client.c:314
msgid "The server has terminated."
msgstr ""
-#: src/gtk_client.c:356
+#: src/gtk_client.c:354
#, c-format
msgid "Jetting to %s"
msgstr ""
-#: src/gtk_client.c:362
+#: src/gtk_client.c:360
msgid "<main>/Errands/Spy"
msgstr ""
-#: src/gtk_client.c:364
+#: src/gtk_client.c:362
#, c-format
msgid "_Spy\t(%s)"
msgstr ""
-#: src/gtk_client.c:368
+#: src/gtk_client.c:366
#, c-format
msgid "_Tipoff\t(%s)"
msgstr ""
-#: src/gtk_client.c:370
+#: src/gtk_client.c:368
msgid "<main>/Errands/Tipoff"
msgstr ""
-#: src/gtk_client.c:402
+#: src/gtk_client.c:400
msgid "High Scores"
msgstr ""
-#: 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
+#: src/gtk_client.c:434 src/gtk_client.c:1030 src/gtk_client.c:1489
+#: src/gtk_client.c:1834 src/gtk_client.c:1998 src/gtk_client.c:2274
+#: src/gtk_client.c:2431
msgid "OK"
msgstr ""
-#: src/gtk_client.c:518
+#: src/gtk_client.c:516
msgid "Fight"
msgstr ""
-#: src/gtk_client.c:545
+#: src/gtk_client.c:543
#, c-format
msgid "_Deal %s"
msgstr ""
-#: src/gtk_client.c:549 src/gtk_client.c:1127 src/gtk_client.c:1324
+#: src/gtk_client.c:547 src/gtk_client.c:1122 src/gtk_client.c:1319
msgid "_Fight"
msgstr ""
-#: src/gtk_client.c:552
+#: src/gtk_client.c:550
msgid "_Stand"
msgstr ""
-#: src/gtk_client.c:555 src/gtk_client.c:1126
+#: src/gtk_client.c:553 src/gtk_client.c:1121
msgid "_Run"
msgstr ""
-#: src/gtk_client.c:798
+#: src/gtk_client.c:795
msgid "Jet to location"
msgstr ""
-#: src/gtk_client.c:867
+#: src/gtk_client.c:864
#, c-format
msgid "at %s"
msgstr ""
-#: src/gtk_client.c:872
+#: src/gtk_client.c:869
#, c-format
msgid "You are currently carrying %d %s"
msgstr ""
-#: src/gtk_client.c:877
+#: src/gtk_client.c:874
#, c-format
msgid "Available space: %d"
msgstr ""
-#: src/gtk_client.c:882
+#: src/gtk_client.c:879
#, c-format
msgid "You can afford %d"
msgstr ""
-#: src/gtk_client.c:932 src/gtk_client.c:1063
+#: src/gtk_client.c:928 src/gtk_client.c:1059
msgid "Buy"
msgstr ""
-#: src/gtk_client.c:933 src/gtk_client.c:1064
+#: src/gtk_client.c:929 src/gtk_client.c:1060
msgid "Sell"
msgstr ""
-#: src/gtk_client.c:934 src/gtk_client.c:1065
+#: src/gtk_client.c:930 src/gtk_client.c:1061
msgid "Drop"
msgstr ""
-#: src/gtk_client.c:1022
+#: src/gtk_client.c:1018
#, c-format
msgid "%s how many?"
msgstr ""
-#: src/gtk_client.c:1040 src/gtk_client.c:1839 src/gtk_client.c:2015
-#: src/gtk_client.c:2291
+#: src/gtk_client.c:1036 src/gtk_client.c:1834 src/gtk_client.c:2009
+#: src/gtk_client.c:2282
msgid "Cancel"
msgstr ""
-#: src/gtk_client.c:1079
+#: src/gtk_client.c:1075
#, c-format
msgid "You don't have any %s!"
msgstr ""
-#: src/gtk_client.c:1126 src/gtk_client.c:1840
+#: src/gtk_client.c:1121 src/gtk_client.c:1835
msgid "_Yes"
msgstr ""
-#: src/gtk_client.c:1126 src/gtk_client.c:1840
+#: src/gtk_client.c:1121 src/gtk_client.c:1835
msgid "_No"
msgstr ""
-#: src/gtk_client.c:1127
+#: src/gtk_client.c:1122
msgid "_Attack"
msgstr ""
-#: src/gtk_client.c:1127
+#: src/gtk_client.c:1122
msgid "_Evade"
msgstr ""
-#: src/gtk_client.c:1145
+#: src/gtk_client.c:1140
msgid "Question"
msgstr ""
-#: src/gtk_client.c:1254
+#: src/gtk_client.c:1249
msgid "<main>/Talk"
msgstr ""
-#: src/gtk_client.c:1256
+#: src/gtk_client.c:1251
msgid "<main>/List"
msgstr ""
-#: src/gtk_client.c:1258
+#: src/gtk_client.c:1253
msgid "<main>/Errands"
msgstr ""
-#: src/gtk_client.c:1274
+#: src/gtk_client.c:1269
msgid "Space"
msgstr ""
-#: src/gtk_client.c:1279
+#: src/gtk_client.c:1274
msgid "Cash"
msgstr ""
-#: src/gtk_client.c:1284
+#: src/gtk_client.c:1279
msgid "Debt"
msgstr ""
-#: src/gtk_client.c:1289
+#: src/gtk_client.c:1284
msgid "Bank"
msgstr ""
-#: src/gtk_client.c:1304
+#: src/gtk_client.c:1299
msgid "Health"
msgstr ""
-#: src/gtk_client.c:1324
+#: src/gtk_client.c:1319
msgid "_Jet!"
msgstr ""
-#: src/gtk_client.c:1355
+#: src/gtk_client.c:1350
msgid "dopewars"
msgstr ""
-#: src/gtk_client.c:1441
+#: src/gtk_client.c:1436
msgid "Drug Dealing and Research"
msgstr ""
-#: src/gtk_client.c:1442
+#: src/gtk_client.c:1437
msgid "Play Testing"
msgstr ""
-#: src/gtk_client.c:1443
+#: src/gtk_client.c:1438
msgid "Extensive Play Testing"
msgstr ""
-#: src/gtk_client.c:1445
+#: src/gtk_client.c:1440
msgid "Constructive Criticism"
msgstr ""
-#: src/gtk_client.c:1447
+#: src/gtk_client.c:1442
msgid "Unconstructive Criticism"
msgstr ""
-#: src/gtk_client.c:1451
+#: src/gtk_client.c:1446
msgid "About dopewars"
msgstr ""
-#: src/gtk_client.c:1460
+#: src/gtk_client.c:1455
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:1468
+#: src/gtk_client.c:1463
#, 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:1486
+#: src/gtk_client.c:1481
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:1524 src/gtk_client.c:1547
+#: src/gtk_client.c:1519 src/gtk_client.c:1542
#, c-format
msgid "Status: Could not connect (%s)"
msgstr ""
-#: src/gtk_client.c:1535
+#: src/gtk_client.c:1530
#, c-format
msgid "Status: Attempting to contact %s..."
msgstr ""
-#: src/gtk_client.c:1595
+#: src/gtk_client.c:1590
#, c-format
msgid "%d of %d"
msgstr ""
-#: src/gtk_client.c:1659 src/gtk_client.c:1700 src/gtk_client.c:1741
+#: src/gtk_client.c:1654 src/gtk_client.c:1695 src/gtk_client.c:1736
msgid "Server"
msgstr ""
-#: src/gtk_client.c:1660 src/gtk_client.c:1715
+#: src/gtk_client.c:1655 src/gtk_client.c:1710
msgid "Port"
msgstr ""
-#: src/gtk_client.c:1661
+#: src/gtk_client.c:1656
msgid "Version"
msgstr ""
-#: src/gtk_client.c:1662
+#: src/gtk_client.c:1657
msgid "Players"
msgstr ""
-#: src/gtk_client.c:1663
+#: src/gtk_client.c:1658
msgid "Comment"
msgstr ""
-#: src/gtk_client.c:1676
+#: src/gtk_client.c:1671
msgid "New Game"
msgstr ""
-#: src/gtk_client.c:1685
+#: src/gtk_client.c:1680
msgid "Hey dude, what's your _name?"
msgstr ""
-#: src/gtk_client.c:1707
+#: src/gtk_client.c:1702
msgid "Host name"
msgstr ""
-#: src/gtk_client.c:1730 src/gtk_client.c:1793
+#: src/gtk_client.c:1725 src/gtk_client.c:1788
msgid "_Connect"
msgstr ""
-#: src/gtk_client.c:1743 src/gtk_client.c:1764
+#: src/gtk_client.c:1738 src/gtk_client.c:1759
msgid "Single player"
msgstr ""
-#: src/gtk_client.c:1749
+#: src/gtk_client.c:1744
msgid "_Antique mode"
msgstr ""
-#: src/gtk_client.c:1756
+#: src/gtk_client.c:1751
msgid "_Start single-player game"
msgstr ""
-#: src/gtk_client.c:1766 src/gtk_client.c:1804
+#: src/gtk_client.c:1761 src/gtk_client.c:1799
msgid "Metaserver"
msgstr ""
-#: src/gtk_client.c:1783
+#: src/gtk_client.c:1778
msgid "_Update"
msgstr ""
-#: src/gtk_client.c:1808
+#: src/gtk_client.c:1803
msgid "Status: Waiting for user input"
msgstr ""
-#: src/gtk_client.c:1961
+#: src/gtk_client.c:1955
#, c-format
msgid "Cash: %s"
msgstr ""
-#: src/gtk_client.c:1968
+#: src/gtk_client.c:1962
#, c-format
msgid "Debt: %s"
msgstr ""
-#: src/gtk_client.c:1971
+#: src/gtk_client.c:1965
#, c-format
msgid "Bank: %s"
msgstr ""
-#: src/gtk_client.c:1979
+#: src/gtk_client.c:1973
msgid "Pay back:"
msgstr ""
-#: src/gtk_client.c:1982
+#: src/gtk_client.c:1976
msgid "Deposit"
msgstr ""
-#: src/gtk_client.c:1986
+#: src/gtk_client.c:1980
msgid "Withdraw"
msgstr ""
-#: src/gtk_client.c:2010
+#: src/gtk_client.c:2004
msgid "Pay all"
msgstr ""
-#: src/gtk_client.c:2032
+#: src/gtk_client.c:2026
msgid "Player List"
msgstr ""
-#: src/gtk_client.c:2121
+#: src/gtk_client.c:2114
msgid "Talk to player(s)"
msgstr ""
-#: src/gtk_client.c:2143
+#: src/gtk_client.c:2136
msgid "Talk to all players"
msgstr ""
-#: src/gtk_client.c:2147
+#: src/gtk_client.c:2140
msgid "Message:-"
msgstr ""
-#: src/gtk_client.c:2160
+#: src/gtk_client.c:2153
msgid "Send"
msgstr ""
-#: src/gtk_client.c:2253
+#: src/gtk_client.c:2244
msgid "Spy On Player"
msgstr ""
-#: src/gtk_client.c:2255
+#: src/gtk_client.c:2246
#, 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:2263
+#: src/gtk_client.c:2254
msgid "Tip Off The Cops"
msgstr ""
-#: src/gtk_client.c:2265
+#: src/gtk_client.c:2256
#, 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:2305
+#: src/gtk_client.c:2296
#, c-format
msgid "Sack %s"
msgstr ""
-#: src/gtk_client.c:2306
+#: src/gtk_client.c:2297
#, c-format
msgid ""
"Are you sure? (Any %s or %s carried\n"
"by this %s may be lost!)"
msgstr ""
-#: src/gtk_client.c:2327
+#: src/gtk_client.c:2317
msgid "Name"
msgstr ""
-#: src/gtk_client.c:2328
+#: src/gtk_client.c:2318
msgid "Price"
msgstr ""
-#: src/gtk_client.c:2329
+#: src/gtk_client.c:2319
msgid "Number"
msgstr ""
-#: src/gtk_client.c:2331
+#: src/gtk_client.c:2321
msgid "_Buy ->"
msgstr ""
-#: src/gtk_client.c:2332
+#: src/gtk_client.c:2322
msgid "<- _Sell"
msgstr ""
-#: src/gtk_client.c:2333
+#: src/gtk_client.c:2323
msgid "_Drop <-"
msgstr ""
-#: src/gtk_client.c:2338
+#: src/gtk_client.c:2328
#, c-format
msgid "%s here"
msgstr ""
-#: src/gtk_client.c:2341
+#: src/gtk_client.c:2331
#, c-format
msgid "%s carried"
msgstr ""
-#: src/gtk_client.c:2417
+#: src/gtk_client.c:2407
msgid "Change Name"
msgstr ""
-#: src/gtk_client.c:2427
+#: src/gtk_client.c:2417
msgid ""
"Unfortunately, somebody else is already using \"your\" name. Please change "
"it:-"
msgstr ""
-#: src/gtk_client.c:2486
+#: src/gtk_client.c:2476
msgid "Done"
msgstr ""
-#: src/gtk_client.c:2520
+#: src/gtk_client.c:2509
msgid "Spy reports"
msgstr ""
-#: src/gtk_client.c:2591
+#: src/gtk_client.c:2580
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:269
+#: src/serverside.c:268
#, c-format
msgid "MaxClients (%d) exceeded - dropping connection"
msgstr ""
-#: src/serverside.c:273
+#: src/serverside.c:272
msgid ""
"Sorry, but this server has a limit of 1 player, which has been "
"reached.^Please try connecting again later."
msgstr ""
-#: src/serverside.c:278
+#: src/serverside.c:277
#, 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:291
+#: src/serverside.c:290
#, c-format
msgid "%s will now be known as %s"
msgstr ""
-#: src/serverside.c:306
+#: src/serverside.c:305
msgid "Your dealing time is up..."
msgstr ""
-#: src/serverside.c:317
+#: src/serverside.c:316
#, c-format
msgid "%s: DENIED jet to %s"
msgstr ""
-#: src/serverside.c:374
+#: src/serverside.c:373
#, c-format
msgid "%s now spying on %s"
msgstr ""
-#: src/serverside.c:382
+#: src/serverside.c:381
#, c-format
msgid "%s spy on %s: DENIED"
msgstr ""
-#: src/serverside.c:388
+#: src/serverside.c:387
#, c-format
msgid "%s tipped off the cops to %s"
msgstr ""
-#: src/serverside.c:396
+#: src/serverside.c:395
#, c-format
msgid "%s tipoff about %s: DENIED"
msgstr ""
-#: src/serverside.c:503
+#: src/serverside.c:502
msgid "--More--"
msgstr ""
-#: src/serverside.c:514
+#: src/serverside.c:513
msgid "Pager exited abnormally - using stdout instead..."
msgstr ""
-#: src/serverside.c:529
+#: src/serverside.c:528
#, c-format
msgid "Maintaining pid file %s"
msgstr ""
-#: src/serverside.c:533
+#: src/serverside.c:532
#, c-format
msgid "Cannot create pid file %s"
msgstr ""
-#: src/serverside.c:582
+#: src/serverside.c:581
#, 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:619
+#: src/serverside.c:618
#, 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:636
+#: src/serverside.c:635
msgid "Cannot install SIGUSR1 interrupt handler!"
msgstr ""
-#: src/serverside.c:642
+#: src/serverside.c:641
msgid "Cannot install SIGINT interrupt handler!"
msgstr ""
-#: src/serverside.c:645
+#: src/serverside.c:644
msgid "Cannot install SIGTERM interrupt handler!"
msgstr ""
-#: src/serverside.c:648
+#: src/serverside.c:647
msgid "Cannot install SIGHUP interrupt handler!"
msgstr ""
-#: src/serverside.c:653
+#: src/serverside.c:652
msgid "Cannot install pipe handler!"
msgstr ""
-#: src/serverside.c:676
+#: src/serverside.c:675
msgid "Users currently logged on:-\n"
msgstr ""
-#: src/serverside.c:681
+#: src/serverside.c:680
msgid "No users currently logged on!"
msgstr ""
-#: src/serverside.c:685
+#: src/serverside.c:684
#, c-format
msgid "Pushing %s"
msgstr ""
-#: src/serverside.c:687 src/serverside.c:695
+#: src/serverside.c:686 src/serverside.c:694
msgid "No such user!"
msgstr ""
-#: src/serverside.c:691
+#: src/serverside.c:690
#, c-format
msgid "%s killed"
msgstr ""
-#: src/serverside.c:697
+#: src/serverside.c:696
msgid "Unknown command - try \"help\" for help..."
msgstr ""
-#: src/serverside.c:714
+#: src/serverside.c:713
#, c-format
msgid "got connection from %s"
msgstr ""
-#: src/serverside.c:730
+#: src/serverside.c:729
#, c-format
msgid "%s leaves the server!"
msgstr ""
-#: src/serverside.c:798
+#: src/serverside.c:797
msgid "Standard input closed."
msgstr ""
-#: src/serverside.c:941
+#: src/serverside.c:940
#, c-format
msgid "Unable to read high score file %s"
msgstr ""
-#: src/serverside.c:961
+#: src/serverside.c:960
msgid "Congratulations! You made the high scores!"
msgstr ""
-#: src/serverside.c:974
+#: src/serverside.c:973
msgid "You didn't even make the high score table..."
msgstr ""
-#: src/serverside.c:988
+#: src/serverside.c:987
#, c-format
msgid "Unable to write high score file %s"
msgstr ""
-#: src/serverside.c:1007
+#: src/serverside.c:1006
msgid "(R.I.P.)"
msgstr ""
-#: src/serverside.c:1042
+#: src/serverside.c:1041
#, c-format
msgid "%s: Tipoff from %s"
msgstr ""
-#: src/serverside.c:1059
+#: src/serverside.c:1058
#, c-format
msgid "One of your %s was spying for %s.^The spy %s!"
msgstr ""
-#: src/serverside.c:1067
+#: src/serverside.c:1066
#, c-format
msgid "Your spy working with %s has been discovered!^The spy %s!"
msgstr ""
-#: src/serverside.c:1090
+#: src/serverside.c:1089
#, c-format
msgid " The lady next to you on the subway said,^ \"%s\"%s"
msgstr ""
-#: src/serverside.c:1093
+#: src/serverside.c:1092
msgid "^ (at least, you -think- that's what she said)"
msgstr ""
-#: src/serverside.c:1095
+#: src/serverside.c:1094
#, c-format
msgid " You hear someone playing %s"
msgstr ""
-#: src/serverside.c:1104 src/serverside.c:1113 src/serverside.c:1122
-#: src/serverside.c:1131
+#: src/serverside.c:1103 src/serverside.c:1112 src/serverside.c:1121
+#: src/serverside.c:1130
#, c-format
msgid "YN^Would you like to visit %s?"
msgstr ""
-#: src/serverside.c:1142
+#: src/serverside.c:1141
#, c-format
msgid "YN^^Would you like to hire %s %s for %s?"
msgstr ""
-#: src/serverside.c:1143
+#: src/serverside.c:1142
msgid "an"
msgstr ""
-#: src/serverside.c:1143
+#: src/serverside.c:1142
msgid "a"
msgstr ""
-#: src/serverside.c:1155
+#: src/serverside.c:1154
#, 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:1224
+#: src/serverside.c:1223
#, c-format
msgid "YN^Officer %s is chasing you!"
msgstr ""
-#: src/serverside.c:1226
+#: src/serverside.c:1225
#, c-format
msgid "YN^Officer %s and %d of his deputies are chasing you!"
msgstr ""
-#: src/serverside.c:1247
+#: src/serverside.c:1246
msgid "^Do you run?"
msgstr ""
-#: src/serverside.c:1250
+#: src/serverside.c:1249
msgid "^Do you Run, or Fight?"
msgstr ""
-#: src/serverside.c:1265
+#: src/serverside.c:1264
#, c-format
msgid "%s: tipoff by %s finished OK."
msgstr ""
-#: src/serverside.c:1271
+#: src/serverside.c:1270
#, c-format
msgid "Following your tipoff, the cops ambushed %s, who was shot dead"
msgstr ""
-#: src/serverside.c:1275
+#: src/serverside.c:1274
#, c-format
msgid "Following your tipoff, the cops ambushed %s, who escaped with %d %s. "
msgstr ""
-#: src/serverside.c:1312
+#: src/serverside.c:1311
msgid "^You stand there like an idiot."
msgstr ""
-#: src/serverside.c:1316
+#: src/serverside.c:1315
msgid "^You lose him in the alleys."
msgstr ""
-#: src/serverside.c:1318
+#: src/serverside.c:1317
msgid "^You lose them in the alleys."
msgstr ""
-#: src/serverside.c:1326
+#: src/serverside.c:1325
msgid "^You can't shake him, man!"
msgstr ""
-#: src/serverside.c:1328
+#: src/serverside.c:1327
msgid "^You can't shake them, man!"
msgstr ""
-#: src/serverside.c:1339
+#: src/serverside.c:1338
#, c-format
msgid "^You killed Officer %s! You find %s on his corpse!"
msgstr ""
-#: src/serverside.c:1353
+#: src/serverside.c:1352
#, c-format
msgid "YN^^^^Do you pay a doctor %s to sew your %s up?"
msgstr ""
-#: src/serverside.c:1357
+#: src/serverside.c:1356
#, c-format
msgid "YN^^^^Do you pay a doctor %s to sew you up?"
msgstr ""
-#: src/serverside.c:1369
+#: src/serverside.c:1368
msgid "^You got one, man!"
msgstr ""
-#: src/serverside.c:1372
+#: src/serverside.c:1371
msgid "^You missed!"
msgstr ""
-#: src/serverside.c:1376
+#: src/serverside.c:1375
msgid "^He's firing on you, man! "
msgstr ""
-#: src/serverside.c:1378
+#: src/serverside.c:1377
msgid "^They're firing on you, man! "
msgstr ""
-#: src/serverside.c:1381
+#: src/serverside.c:1380
msgid "You've been hit! "
msgstr ""
-#: src/serverside.c:1388
+#: src/serverside.c:1387
msgid "He wasted you, man! What a drag!"
msgstr ""
-#: src/serverside.c:1390
+#: src/serverside.c:1389
msgid "They wasted you, man! What a drag!"
msgstr ""
-#: src/serverside.c:1398
+#: src/serverside.c:1397
#, c-format
msgid "You lost one of your %s!"
msgstr ""
-#: src/serverside.c:1407
+#: src/serverside.c:1406
msgid "He missed!"
msgstr ""
-#: src/serverside.c:1409
+#: src/serverside.c:1408
msgid "They missed!"
msgstr ""
-#: src/serverside.c:1429
+#: src/serverside.c:1428
msgid "You were mugged in the subway!"
msgstr ""
-#: src/serverside.c:1440
+#: src/serverside.c:1439
#, c-format
msgid "You meet a friend! He gives you %d %s."
msgstr ""
-#: src/serverside.c:1445
+#: src/serverside.c:1444
#, c-format
msgid "You meet a friend! You give him %d %s."
msgstr ""
-#: src/serverside.c:1452
+#: src/serverside.c:1451
msgid "Sanitized away a RandomOffer"
msgstr ""
-#: src/serverside.c:1457
+#: src/serverside.c:1456
#, c-format
msgid ""
"Police dogs chase you for %d blocks! You dropped some %s! That's a drag, man!"
msgstr ""
-#: src/serverside.c:1471
+#: src/serverside.c:1470
#, c-format
msgid "You find %d %s on a dead dude in the subway!"
msgstr ""
-#: src/serverside.c:1483
+#: src/serverside.c:1482
#, c-format
msgid "Your mama made brownies with some of your %s! They were great!"
msgstr ""
-#: src/serverside.c:1491
+#: src/serverside.c:1490
msgid ""
"YN^There is some weed that smells like paraquat here!^It looks good! Will "
"you smoke it? "
msgstr ""
-#: src/serverside.c:1498
+#: src/serverside.c:1497
#, c-format
msgid "You stopped to %s."
msgstr ""
-#: src/serverside.c:1519
+#: src/serverside.c:1518
#, c-format
msgid "Would you like to buy a bigger trenchcoat for %s?"
msgstr ""
-#: src/serverside.c:1524
+#: src/serverside.c:1523
#, c-format
msgid "YN^Hey dude! I'll help carry your %s for a mere %s. Yes or no?"
msgstr ""
-#: src/serverside.c:1536
+#: src/serverside.c:1535
#, c-format
msgid "YN^Would you like to buy a %s for %s?"
msgstr ""
-#: src/serverside.c:1637 src/serverside.c:1748
+#: src/serverside.c:1636 src/serverside.c:1747
#, c-format
msgid "%s: offer was on behalf of %s"
msgstr ""
-#: src/serverside.c:1640
+#: src/serverside.c:1639
#, c-format
msgid "%s has accepted your %s!^Use the G key to contact your spy."
msgstr ""
-#: src/serverside.c:1686
+#: src/serverside.c:1685
msgid ""
"You hallucinated for three days on the wildest trip you ever imagined!^Then "
"you died because your brain disintegrated!"
msgstr ""
-#: src/serverside.c:1725
+#: src/serverside.c:1724
#, c-format
msgid "Too late - %s has just left!"
msgstr ""
-#: src/serverside.c:1751
+#: src/serverside.c:1750
#, c-format
msgid "%s has rejected your %s!"
msgstr ""
-#: src/serverside.c:1786
+#: src/serverside.c:1785
#, c-format
msgid "%s has got away!"
msgstr ""
-#: src/serverside.c:1827
+#: src/serverside.c:1826
#, c-format
msgid "%s has run off!"
msgstr ""
-#: src/serverside.c:1839
+#: src/serverside.c:1838
msgid "Coward! You successfully escaped from the fight."
msgstr ""
-#: src/serverside.c:1895
+#: src/serverside.c:1894
msgid "pitifully armed"
msgstr ""
-#: src/serverside.c:1896
+#: src/serverside.c:1895
msgid "lightly armed"
msgstr ""
-#: src/serverside.c:1897
+#: src/serverside.c:1896
msgid "moderately well armed"
msgstr ""
-#: src/serverside.c:1898
+#: src/serverside.c:1897
msgid "heavily armed"
msgstr ""
-#: src/serverside.c:1899
+#: src/serverside.c:1898
msgid "armed to the teeth"
msgstr ""
-#: src/serverside.c:1900
+#: src/serverside.c:1899
msgid " fires and "
msgstr ""
-#: src/serverside.c:1901
+#: src/serverside.c:1900
msgid " stands and takes it."
msgstr ""
-#: src/serverside.c:1904
+#: src/serverside.c:1903
#, c-format
msgid "%s arrives, with %d %s, %s,^%s"
msgstr ""
-#: src/serverside.c:1908
+#: src/serverside.c:1907
#, c-format
msgid "%s arrives, %s,^%s"
msgstr ""
-#: src/serverside.c:1913
+#: src/serverside.c:1912
#, c-format
msgid "%s fires and "
msgstr ""
-#: src/serverside.c:1915
+#: src/serverside.c:1914
#, c-format
msgid "%s stands and takes it."
msgstr ""
-#: src/serverside.c:1927
+#: src/serverside.c:1926
msgid "misses you!"
msgstr ""
-#: src/serverside.c:1928
+#: src/serverside.c:1927
#, c-format
msgid "You failed to hit %s."
msgstr ""
-#: src/serverside.c:1931
+#: src/serverside.c:1930
msgid "You stand and take it."
msgstr ""
-#: src/serverside.c:1935
+#: src/serverside.c:1934
msgid "hits you, man!"
msgstr ""
-#: src/serverside.c:1938
+#: src/serverside.c:1937
msgid " You've been wasted! What a drag!"
msgstr ""
-#: src/serverside.c:1939
+#: src/serverside.c:1938
#, c-format
msgid "You hit and killed %s"
msgstr ""
-#: src/serverside.c:1954 src/serverside.c:1987
+#: src/serverside.c:1953 src/serverside.c:1986
msgid ", and loot the body!"
msgstr ""
-#: src/serverside.c:1963
+#: src/serverside.c:1962
#, c-format
msgid "^You lost a %s, man!"
msgstr ""
-#: src/serverside.c:1968
+#: src/serverside.c:1967
#, c-format
msgid "You are paid a bounty of %s in reward for killing^one of %s's %s"
msgstr ""
-#: src/serverside.c:1976
+#: src/serverside.c:1975
#, c-format
msgid "You killed one of %s's %s (%d left)"
msgstr ""
-#: src/serverside.c:1994
+#: src/serverside.c:1993
#, c-format
msgid "You fire, and hit %s!"
msgstr ""
-#: src/serverside.c:2034
+#: src/serverside.c:2033
msgid "YN^Officer %%s spots you dropping %s, and chases you!"
msgstr ""
-#: src/serverside.c:2036
+#: src/serverside.c:2035
msgid ""
"YN^Officer %%s and %%d of his deputies spot you dropping %s, and chase you!"
msgstr ""
-#: src/serverside.c:2191
+#: src/serverside.c:2190
msgid "Player removed due to idle timeout"
msgstr ""
-#: src/serverside.c:2201
+#: src/serverside.c:2200
msgid "Player removed due to connect timeout"
msgstr ""
-#: src/serverside.c:2207 src/serverside.c:2213
+#: src/serverside.c:2206 src/serverside.c:2212
#, c-format
msgid "%s fails to return fire..."
msgstr ""
-#: src/message.c:449
+#: src/message.c:467
#, 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:588
+#: src/message.c:606
msgid "Could not find host"
msgstr ""
-#: src/message.c:589
+#: src/message.c:607
msgid "Could not create network socket"
msgstr ""
-#: src/message.c:590 src/message.c:623
+#: src/message.c:608 src/message.c:641
msgid "Connection refused or no server present"
msgstr ""
-#: src/message.c:789
+#: src/message.c:800
msgid "Cannot locate metaserver"
msgstr ""
-#: src/message.c:790
+#: src/message.c:801
msgid "Cannot create socket"
msgstr ""
-#: src/message.c:792
+#: src/message.c:803
msgid "Metaserver not running HTTP or connection denied"
msgstr ""
t@@ -2659,7 +2659,7 @@ msgstr ""
msgid "Reckon I'll just have to shoot you for your own good."
msgstr ""
-#: src/AIPlayer.c:448
+#: src/AIPlayer.c:447
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@@ -107,7 +107,7 @@ void AISetName(Player *AIPlay) {
text=g_strdup_printf("AI) %s",AINames[brandom(0,NUMNAMES)]);
SetPlayerName(AIPlay,text);
g_free(text);
- SendClientMessage(NULL,C_NONE,C_NAME,NULL,GetPlayerName(AIPlay),AIPlay);
+ SendNullClientMessage(AIPlay,C_NONE,C_NAME,NULL,GetPlayerName(AIPlay));
g_print(_("Using name %s\n"),GetPlayerName(AIPlay));
}
t@@ -116,16 +116,16 @@ int HandleAIMessage(char *Message,Player *AIPlay) {
/* "Message" for AI player "AIPlay". Returns 1 if the game should */
/* be ended as a result, 0 otherwise. */
char *Data,Code,AICode,WasFighting;
- Player *From,*To,*tmp;
+ Player *From,*tmp;
GSList *list;
gchar *prstr,*prstr2;
struct timeval tv;
gboolean Handled;
- if (ProcessMessage(Message,AIPlay,&From,&AICode,&Code,&To,
+ if (ProcessMessage(Message,AIPlay,&From,&AICode,&Code,
&Data,FirstClient)==-1) {
g_warning("Bad network message. Oops."); return 0;
}
- Handled=HandleGenericClientMessage(From,AICode,Code,To,Data,NULL);
+ Handled=HandleGenericClientMessage(From,AICode,Code,AIPlay,Data,NULL);
switch(Code) {
case C_ENDLIST:
g_print(_("Players in this game:-\n"));
t@@ -143,7 +143,7 @@ int HandleAIMessage(char *Message,Player *AIPlay) {
AIPlay->Flags |= FIGHTING+CANSHOOT;
}
if (TotalGunsCarried(AIPlay)>0 && AIPlay->Health>MINSAFEHEALTH) {
- SendClientMessage(AIPlay,C_NONE,C_FIGHTACT,NULL,"F",AIPlay);
+ SendClientMessage(AIPlay,C_NONE,C_FIGHTACT,NULL,"F");
} else {
AIJet(AIPlay);
}
t@@ -155,7 +155,7 @@ int HandleAIMessage(char *Message,Player *AIPlay) {
g_print("%s: %s\n",GetPlayerName(From),Data);
break;
case C_MSGTO:
- g_print("%s->%s: %s\n",GetPlayerName(From),GetPlayerName(To),Data);
+ g_print("%s->%s: %s\n",GetPlayerName(From),GetPlayerName(AIPlay),Data);
break;
case C_JOIN:
g_print(_("%s joins the game.\n"),Data); break;
t@@ -180,7 +180,7 @@ int HandleAIMessage(char *Message,Player *AIPlay) {
WasFighting=FALSE;
if (From==&Noone) {
if (AIPlay->Flags & FIGHTING) WasFighting=TRUE;
- ReceivePlayerData(Data,To);
+ ReceivePlayerData(Data,AIPlay);
} else {
ReceivePlayerData(Data,From); /* spy reports */
}
t@@ -219,7 +219,7 @@ int HandleAIMessage(char *Message,Player *AIPlay) {
return 1;
default:
if (!Handled) g_message("%s^%c^%s%s\n",GetPlayerName(From),Code,
- GetPlayerName(To),Data);
+ GetPlayerName(AIPlay),Data);
break;
}
return 0;
t@@ -275,7 +275,7 @@ void AIDealDrugs(Player *AIPlay) {
AIPlay->CoatSize+=Num;
AIPlay->Cash+=Num*AIPlay->Drugs[Highest].Price;
text=g_strdup_printf("drug^%d^%d",Highest,-Num);
- SendClientMessage(AIPlay,C_NONE,C_BUYOBJECT,NULL,text,AIPlay);
+ SendClientMessage(AIPlay,C_NONE,C_BUYOBJECT,NULL,text);
g_free(text);
}
if (AIPlay->Drugs[Highest].Price != 0 &&
t@@ -291,7 +291,7 @@ void AIDealDrugs(Player *AIPlay) {
text=g_strdup_printf("drug^%d^%d",Highest,Num);
AIPlay->CoatSize-=Num;
AIPlay->Cash-=Num*AIPlay->Drugs[Highest].Price;
- SendClientMessage(AIPlay,C_NONE,C_BUYOBJECT,NULL,text,AIPlay);
+ SendClientMessage(AIPlay,C_NONE,C_BUYOBJECT,NULL,text);
g_free(text);
}
}
t@@ -318,12 +318,12 @@ void AIGunShop(Player *AIPlay) {
(prstr=FormatPrice(Gun[i].Price)));
g_free(prstr);
text=g_strdup_printf("gun^%d^1",i);
- SendClientMessage(AIPlay,C_NONE,C_BUYOBJECT,NULL,text,AIPlay);
+ SendClientMessage(AIPlay,C_NONE,C_BUYOBJECT,NULL,text);
g_free(text);
}
}
} while (Bought);
- SendClientMessage(AIPlay,C_NONE,C_DONE,NULL,NULL,AIPlay);
+ SendClientMessage(AIPlay,C_NONE,C_DONE,NULL,NULL);
}
void AIJet(Player *AIPlay) {
t@@ -343,7 +343,7 @@ void AIJet(Player *AIPlay) {
}
while (NewLocation==AIPlay->IsAt) NewLocation=brandom(0,NumLocation);
sprintf(text,"%d",NewLocation);
- SendClientMessage(AIPlay,C_NONE,C_REQUESTJET,NULL,text,AIPlay);
+ SendClientMessage(AIPlay,C_NONE,C_REQUESTJET,NULL,text);
}
void AIPayLoan(Player *AIPlay) {
t@@ -352,19 +352,19 @@ void AIPayLoan(Player *AIPlay) {
gchar *prstr;
if (AIPlay->Cash-AIPlay->Debt >= MINSAFECASH) {
prstr=pricetostr(AIPlay->Debt);
- SendClientMessage(AIPlay,C_NONE,C_PAYLOAN,NULL,prstr,AIPlay);
+ SendClientMessage(AIPlay,C_NONE,C_PAYLOAN,NULL,prstr);
g_free(prstr);
g_print(_("Debt of %s paid off to loan shark\n"),
(prstr=FormatPrice(AIPlay->Debt)));
g_free(prstr);
}
- SendClientMessage(AIPlay,C_NONE,C_DONE,NULL,NULL,AIPlay);
+ SendClientMessage(AIPlay,C_NONE,C_DONE,NULL,NULL);
}
void AISendAnswer(Player *From,Player *To,char *answer) {
/* Sends the answer "answer" from AI player "From" to the server, */
/* claiming to be for player "To". Also prints the answer on the screen. */
- SendClientMessage(From,C_NONE,C_ANSWER,To,answer,From); puts(answer);
+ SendClientMessage(From,C_NONE,C_ANSWER,To,answer); puts(answer);
}
void AIHandleQuestion(char *Data,char AICode,Player *AIPlay,Player *From) {
t@@ -438,8 +438,7 @@ void AISendRandomMessage(Player *AIPlay) {
N_("Zzzzz... are you dealing in candy or what?"),
N_("Reckon I'll just have to shoot you for your own good.")
};
- SendClientMessage(AIPlay,C_NONE,C_MSG,NULL,
- _(RandomInsult[brandom(0,5)]),AIPlay);
+ SendClientMessage(AIPlay,C_NONE,C_MSG,NULL,_(RandomInsult[brandom(0,5)]));
}
#else /* NETWORKING */
(DIR) diff --git a/src/curses_client.c b/src/curses_client.c
t@@ -379,7 +379,7 @@ static int jet(Player *Play,char AllowReturn) {
curs_set(0);
sprintf(text,"%d",c-'1');
DisplayMode=DM_NONE;
- SendClientMessage(Play,C_NONE,C_REQUESTJET,NULL,text,Play);
+ SendClientMessage(Play,C_NONE,C_REQUESTJET,NULL,text);
return 1;
}
}
t@@ -426,7 +426,7 @@ static void DropDrugs(Player *Play) {
c=atoi(buf); g_free(buf);
if (c>0) {
g_string_sprintf(text,"drug^%d^%d",i,-c);
- SendClientMessage(Play,C_NONE,C_BUYOBJECT,NULL,text->str,Play);
+ SendClientMessage(Play,C_NONE,C_BUYOBJECT,NULL,text->str);
}
break;
}
t@@ -477,7 +477,7 @@ static void DealDrugs(Player *Play,char Buy) {
c=atoi(input); g_free(input); g_free(text);
if (c>=0) {
text=g_strdup_printf("drug^%d^%d",DrugNum,c);
- SendClientMessage(Play,C_NONE,C_BUYOBJECT,NULL,text,Play);
+ SendClientMessage(Play,C_NONE,C_BUYOBJECT,NULL,text);
g_free(text);
}
} else {
t@@ -487,7 +487,7 @@ static void DealDrugs(Player *Play,char Buy) {
c=atoi(input); g_free(input); g_free(text);
if (c>=0) {
text=g_strdup_printf("drug^%d^%d",DrugNum,-c);
- SendClientMessage(Play,C_NONE,C_BUYOBJECT,NULL,text,Play);
+ SendClientMessage(Play,C_NONE,C_BUYOBJECT,NULL,text);
g_free(text);
}
}
t@@ -531,22 +531,22 @@ static void GiveErrand(Player *Play) {
if (Play->Bitches.Carried>0 || c=='C') switch (c) {
case 'S':
To=ListPlayers(Play,TRUE,_("Whom do you want to spy on? "));
- if (To) SendClientMessage(Play,C_NONE,C_SPYON,To,NULL,Play);
+ if (To) SendClientMessage(Play,C_NONE,C_SPYON,To,NULL);
break;
case 'T':
To=ListPlayers(Play,TRUE,
_("Whom do you want to tip the cops off to? "));
- if (To) SendClientMessage(Play,C_NONE,C_TIPOFF,To,NULL,Play);
+ if (To) SendClientMessage(Play,C_NONE,C_TIPOFF,To,NULL);
break;
case 'G':
attrset(PromptAttr);
addstr(_(" Are you sure? "));
c=GetKey(_("YN"),"YN",FALSE,TRUE);
- if (c=='Y') SendClientMessage(Play,C_NONE,C_SACKBITCH,NULL,NULL,Play);
+ if (c=='Y') SendClientMessage(Play,C_NONE,C_SACKBITCH,NULL,NULL);
break;
case 'C':
if (Play->Flags & SPYINGON) {
- SendClientMessage(Play,C_NONE,C_CONTACTSPY,NULL,NULL,Play);
+ SendClientMessage(Play,C_NONE,C_CONTACTSPY,NULL,NULL);
}
break;
}
t@@ -567,7 +567,11 @@ static void change_name(Player *Play,char nullname) {
gchar *NewName;
NewName=nice_input(_("New name: "),23,0,0,NULL);
if (NewName[0]) {
- SendClientMessage(nullname ? NULL : Play,C_NONE,C_NAME,NULL,NewName,Play);
+ if (nullname) {
+ SendNullClientMessage(Play,C_NONE,C_NAME,NULL,NewName);
+ } else {
+ SendClientMessage(Play,C_NONE,C_NAME,NULL,NewName);
+ }
SetPlayerName(Play,NewName);
}
g_free(NewName);
t@@ -588,8 +592,7 @@ void HandleClientMessage(char *Message,Player *Play) {
gboolean Handled;
/* Ignore To: field - all messages will be for Player "Play" */
- if (ProcessMessage(Message,Play,&From,&AICode,&Code,NULL,
- &Data,FirstClient)==-1) {
+ if (ProcessMessage(Message,Play,&From,&AICode,&Code,&Data,FirstClient)==-1) {
return;
}
t@@ -694,20 +697,20 @@ void HandleClientMessage(char *Message,Player *Play) {
i=GetKey(wrd,wrd,FALSE,TRUE);
wrd=g_strdup_printf("%c",i);
SendClientMessage(Play,C_NONE,C_ANSWER,
- From==&Noone ? NULL : From,wrd,Play);
+ From==&Noone ? NULL : From,wrd);
g_free(wrd);
break;
case C_LOANSHARK:
LoanShark(Play);
- SendClientMessage(Play,C_NONE,C_DONE,NULL,NULL,Play);
+ SendClientMessage(Play,C_NONE,C_DONE,NULL,NULL);
break;
case C_BANK:
Bank(Play);
- SendClientMessage(Play,C_NONE,C_DONE,NULL,NULL,Play);
+ SendClientMessage(Play,C_NONE,C_DONE,NULL,NULL);
break;
case C_GUNSHOP:
GunShop(Play);
- SendClientMessage(Play,C_NONE,C_DONE,NULL,NULL,Play);
+ SendClientMessage(Play,C_NONE,C_DONE,NULL,NULL);
break;
case C_UPDATE:
if (From==&Noone) {
t@@ -865,7 +868,7 @@ void GunShop(Player *Play) {
Play->Guns[c2].Carried--;
}
text=g_strdup_printf("gun^%d^%d",c2,c=='B' ? 1 : -1);
- SendClientMessage(Play,C_NONE,C_BUYOBJECT,NULL,text,Play);
+ SendClientMessage(Play,C_NONE,C_BUYOBJECT,NULL,text);
g_free(text);
print_status(Play,0);
}
t@@ -891,7 +894,7 @@ void LoanShark(Player *Play) {
nice_wait();
} else {
SendClientMessage(Play,C_NONE,C_PAYLOAN,NULL,
- (prstr=pricetostr(money)),Play);
+ (prstr=pricetostr(money)));
g_free(prstr);
break;
}
t@@ -926,7 +929,7 @@ void Bank(Player *Play) {
break;
} else {
SendClientMessage(Play,C_NONE,C_DEPOSIT,NULL,
- (prstr=pricetostr(money)),Play);
+ (prstr=pricetostr(money)));
g_free(prstr);
break;
}
t@@ -1406,7 +1409,7 @@ static void Curses_DoGame(Player *Play) {
SendAbilities(Play);
SetPlayerName(Play,buf);
- SendClientMessage(NULL,C_NONE,C_NAME,NULL,buf,Play);
+ SendNullClientMessage(Play,C_NONE,C_NAME,NULL,buf);
g_free(buf); g_free(OldName);
text=g_string_new("");
t@@ -1566,7 +1569,7 @@ static void Curses_DoGame(Player *Play) {
if (want_to_quit()==1) {
DisplayMode=DM_NONE;
clear_bottom();
- SendClientMessage(Play,C_NONE,C_WANTQUIT,NULL,NULL,Play);
+ SendClientMessage(Play,C_NONE,C_WANTQUIT,NULL,NULL);
}
} else if (c=='L' && Network) {
attrset(PromptAttr);
t@@ -1576,7 +1579,7 @@ static void Curses_DoGame(Player *Play) {
ListPlayers(Play,FALSE,NULL);
} else if (i=='S') {
DisplayMode=DM_NONE;
- SendClientMessage(Play,C_NONE,C_REQUESTSCORE,NULL,NULL,Play);
+ SendClientMessage(Play,C_NONE,C_REQUESTSCORE,NULL,NULL);
}
} else if (c=='P' && Network) {
tmp=ListPlayers(Play,TRUE,
t@@ -1585,7 +1588,7 @@ static void Curses_DoGame(Player *Play) {
attrset(TextAttr); clear_line(22);
TalkMsg=nice_input("Talk: ",22,0,0,NULL);
if (TalkMsg[0]) {
- SendClientMessage(Play,C_NONE,C_MSGTO,tmp,TalkMsg,Play);
+ SendClientMessage(Play,C_NONE,C_MSGTO,tmp,TalkMsg);
buf=g_strdup_printf("%s->%s: %s",GetPlayerName(Play),
GetPlayerName(tmp),TalkMsg);
display_message(buf);
t@@ -1597,7 +1600,7 @@ static void Curses_DoGame(Player *Play) {
attrset(TextAttr); clear_line(22);
TalkMsg=nice_input(_("Talk: "),22,0,0,NULL);
if (TalkMsg[0]) {
- SendClientMessage(Play,C_NONE,C_MSG,NULL,TalkMsg,Play);
+ SendClientMessage(Play,C_NONE,C_MSG,NULL,TalkMsg);
buf=g_strdup_printf("%s: %s",GetPlayerName(Play),TalkMsg);
display_message(buf);
g_free(buf);
t@@ -1616,7 +1619,7 @@ static void Curses_DoGame(Player *Play) {
if (TotalGunsCarried(Play)>0 && Play->Flags&CANSHOOT) {
buf=g_strdup_printf("%c",c);
Play->Flags &= ~CANSHOOT;
- SendClientMessage(Play,C_NONE,C_FIGHTACT,NULL,buf,Play);
+ SendClientMessage(Play,C_NONE,C_FIGHTACT,NULL,buf);
g_free(buf);
}
break;
t@@ -1624,14 +1627,14 @@ static void Curses_DoGame(Player *Play) {
if (TotalGunsCarried(Play)==0 && Play->Flags&CANSHOOT) {
buf=g_strdup_printf("%c",c);
Play->Flags &= ~CANSHOOT;
- SendClientMessage(Play,C_NONE,C_FIGHTACT,NULL,buf,Play);
+ SendClientMessage(Play,C_NONE,C_FIGHTACT,NULL,buf);
g_free(buf);
}
break;
case 'Q':
if (want_to_quit()==1) {
DisplayMode=DM_NONE; clear_bottom();
- SendClientMessage(Play,C_NONE,C_WANTQUIT,NULL,NULL,Play);
+ SendClientMessage(Play,C_NONE,C_WANTQUIT,NULL,NULL);
}
break;
}
t@@ -1643,7 +1646,7 @@ static void Curses_DoGame(Player *Play) {
case 'Q':
if (want_to_quit()==1) {
DisplayMode=DM_NONE; clear_bottom();
- SendClientMessage(Play,C_NONE,C_WANTQUIT,NULL,NULL,Play);
+ SendClientMessage(Play,C_NONE,C_WANTQUIT,NULL,NULL);
}
break;
}
(DIR) diff --git a/src/gtk_client.c b/src/gtk_client.c
t@@ -191,8 +191,7 @@ void NewGame(GtkWidget *widget,gpointer data) {
}
void ListScores(GtkWidget *widget,gpointer data) {
- SendClientMessage(ClientData.Play,C_NONE,C_REQUESTSCORE,NULL,NULL,
- ClientData.Play);
+ SendClientMessage(ClientData.Play,C_NONE,C_REQUESTSCORE,NULL,NULL);
}
void ListInventory(GtkWidget *widget,gpointer data) {
t@@ -287,8 +286,7 @@ void HandleClientMessage(char *pt,Player *Play) {
GtkWidget *MenuItem;
GSList *list;
-/* Ignore To: field as all messages should be for "Play" */
- if (ProcessMessage(pt,Play,&From,&AICode,&Code,NULL,&Data,FirstClient)==-1) {
+ if (ProcessMessage(pt,Play,&From,&AICode,&Code,&Data,FirstClient)==-1) {
return;
}
t@@ -481,7 +479,7 @@ static void FightCallback(GtkWidget *widget,gpointer data) {
(Answer=='S' && TotalGunsCarried(Play)==0))) {
Play->Flags &= ~CANSHOOT;
text=g_strdup_printf("%c",Answer);
- SendClientMessage(Play,C_NONE,C_FIGHTACT,NULL,text,Play);
+ SendClientMessage(Play,C_NONE,C_FIGHTACT,NULL,text);
g_free(text);
}
break;
t@@ -772,8 +770,7 @@ static void JetCallback(GtkWidget *widget,gpointer data) {
NewLocation = GPOINTER_TO_INT(data);
gtk_widget_destroy(JetDialog);
text=g_strdup_printf("%d",NewLocation);
- SendClientMessage(ClientData.Play,C_NONE,C_REQUESTJET,NULL,
- text,ClientData.Play);
+ SendClientMessage(ClientData.Play,C_NONE,C_REQUESTJET,NULL,text);
g_free(text);
}
t@@ -908,8 +905,7 @@ static void DealOKCallback(GtkWidget *widget,gpointer data) {
text=g_strdup_printf("drug^%d^%d",DealDialog.DrugInd,
data==BT_BUY ? amount : -amount);
- SendClientMessage(ClientData.Play,C_NONE,C_BUYOBJECT,NULL,
- text,ClientData.Play);
+ SendClientMessage(ClientData.Play,C_NONE,C_BUYOBJECT,NULL,text);
g_free(text);
gtk_widget_destroy(DealDialog.dialog);
t@@ -1095,8 +1091,7 @@ void DealGuns(GtkWidget *widget,gpointer data) {
MessageBox(dialog,Title,_("You don't have any to sell!"),MB_OK);
} else {
g_string_sprintf(text,"gun^%d^%d",GunInd,data==BT_BUY ? 1 : -1);
- SendClientMessage(ClientData.Play,C_NONE,C_BUYOBJECT,NULL,text->str,
- ClientData.Play);
+ SendClientMessage(ClientData.Play,C_NONE,C_BUYOBJECT,NULL,text->str);
}
g_free(Title);
g_string_free(text,TRUE);
t@@ -1113,7 +1108,7 @@ static void QuestionCallback(GtkWidget *widget,gpointer data) {
Answer = GPOINTER_TO_INT(data);
text[0]=(gchar)Answer; text[1]='\0';
- SendClientMessage(ClientData.Play,C_NONE,C_ANSWER,To,text,ClientData.Play);
+ SendClientMessage(ClientData.Play,C_NONE,C_ANSWER,To,text);
gtk_widget_destroy(dialog);
}
t@@ -1189,7 +1184,7 @@ void StartGame() {
Play->fd=ClientSock;
SendAbilities(Play);
SetPlayerName(Play,ClientData.PlayerName);
- SendClientMessage(NULL,C_NONE,C_NAME,NULL,ClientData.PlayerName,Play);
+ SendNullClientMessage(Play,C_NONE,C_NAME,NULL,ClientData.PlayerName);
InGame=TRUE;
UpdateMenus();
if (Network) {
t@@ -1886,14 +1881,13 @@ gint MessageBox(GtkWidget *parent,const gchar *Title,
}
static void SendDoneMessage(GtkWidget *widget,gpointer data) {
- SendClientMessage(ClientData.Play,C_NONE,C_DONE,NULL,NULL,ClientData.Play);
+ SendClientMessage(ClientData.Play,C_NONE,C_DONE,NULL,NULL);
}
static void TransferPayAll(GtkWidget *widget,GtkWidget *dialog) {
gchar *text;
text=pricetostr(ClientData.Play->Debt);
- SendClientMessage(ClientData.Play,C_NONE,C_PAYLOAN,NULL,
- text,ClientData.Play);
+ SendClientMessage(ClientData.Play,C_NONE,C_PAYLOAN,NULL,text);
g_free(text);
gtk_widget_destroy(dialog);
}
t@@ -1932,7 +1926,7 @@ static void TransferOK(GtkWidget *widget,GtkWidget *dialog) {
}
text=pricetostr(money);
SendClientMessage(ClientData.Play,C_NONE,
- Debt ? C_PAYLOAN : C_DEPOSIT,NULL,text,ClientData.Play);
+ Debt ? C_PAYLOAN : C_DEPOSIT,NULL,text);
g_free(text);
gtk_widget_destroy(dialog);
}
t@@ -2082,7 +2076,7 @@ static void TalkSend(GtkWidget *widget,struct TalkStruct *TalkData) {
msg=g_string_new("");
if (AllPlayers) {
- SendClientMessage(ClientData.Play,C_NONE,C_MSG,NULL,text,ClientData.Play);
+ SendClientMessage(ClientData.Play,C_NONE,C_MSG,NULL,text);
g_string_sprintf(msg,"%s: %s",GetPlayerName(ClientData.Play),text);
PrintMessage(msg->str);
} else {
t@@ -2091,8 +2085,7 @@ static void TalkSend(GtkWidget *widget,struct TalkStruct *TalkData) {
row=GPOINTER_TO_INT(selection->data);
Play=(Player *)gtk_clist_get_row_data(GTK_CLIST(TalkData->clist),row);
if (Play) {
- SendClientMessage(ClientData.Play,C_NONE,C_MSGTO,Play,
- text,ClientData.Play);
+ SendClientMessage(ClientData.Play,C_NONE,C_MSGTO,Play,text);
g_string_sprintf(msg,"%s->%s: %s",GetPlayerName(ClientData.Play),
GetPlayerName(Play),text);
PrintMessage(msg->str);
t@@ -2218,11 +2211,9 @@ static void ErrandOK(GtkWidget *widget,GtkWidget *clist) {
row=GPOINTER_TO_INT(selection->data);
Play=(Player *)gtk_clist_get_row_data(GTK_CLIST(clist),row);
if (ErrandType==ET_SPY) {
- SendClientMessage(ClientData.Play,C_NONE,C_SPYON,Play,
- NULL,ClientData.Play);
+ SendClientMessage(ClientData.Play,C_NONE,C_SPYON,Play,NULL);
} else {
- SendClientMessage(ClientData.Play,C_NONE,C_TIPOFF,Play,
- NULL,ClientData.Play);
+ SendClientMessage(ClientData.Play,C_NONE,C_TIPOFF,Play,NULL);
}
gtk_widget_destroy(dialog);
}
t@@ -2307,8 +2298,7 @@ void SackBitch(GtkWidget *widget,gpointer data) {
"by this %s may be lost!)"),Names.Guns,
Names.Drugs,Names.Bitch);
if (MessageBox(ClientData.window,title,text,MB_YES|MB_NO)==MB_YES) {
- SendClientMessage(ClientData.Play,C_NONE,C_SACKBITCH,NULL,NULL,
- ClientData.Play);
+ SendClientMessage(ClientData.Play,C_NONE,C_SACKBITCH,NULL,NULL);
}
g_free(caps); g_free(text); g_free(title);
}
t@@ -2404,7 +2394,7 @@ static void NewNameOK(GtkWidget *widget,GtkWidget *window) {
text=gtk_editable_get_chars(GTK_EDITABLE(entry),0,-1);
if (text[0]) {
SetPlayerName(ClientData.Play,text);
- SendClientMessage(NULL,C_NONE,C_NAME,NULL,text,ClientData.Play);
+ SendNullClientMessage(ClientData.Play,C_NONE,C_NAME,NULL,text);
gtk_widget_destroy(window);
}
g_free(text);
t@@ -2501,8 +2491,7 @@ void UpdatePlayerLists() {
}
void GetSpyReports(GtkWidget *Widget,gpointer data) {
- SendClientMessage(ClientData.Play,C_NONE,C_CONTACTSPY,NULL,NULL,
- ClientData.Play);
+ SendClientMessage(ClientData.Play,C_NONE,C_CONTACTSPY,NULL,NULL);
}
static void DestroySpyReports(GtkWidget *widget,gpointer data) {
(DIR) diff --git a/src/message.c b/src/message.c
t@@ -50,33 +50,46 @@
handled by the server. All communication is conducted via. TCP by means
of plain text newline-delimited messages.
- Message structure:-
- From^To^ACData
+ New message structure:-
+ Other^ACData
- From,To: Player names identifying the sender and intended recipient of
- the message. Either field may be blank, although the server will
- usually reject incoming messages if they are not properly
- identified with a correct "From" field.
+ Other: The ID of the player at the "other end" of the connection;
+ for messages received by the client, this is the player from
+ which the message originates, while for messages received by
+ the server, it's the player to which to deliver the message.
A: One-letter code; used by AI players to identify the message subtype
(check AIPlayer.h)
C: One-letter code to identify the message type (check message.h)
Data: Message-dependent information
+
+ For compatibility with old clients and servers, the old message structure
+ is still supported:-
+ From^To^ACData
+
+ From,To: Player names identifying the sender and intended recipient of
+ the message. Either field may be blank, although the server will
+ usually reject incoming messages if they are not properly
+ identified with a correct "From" field.
+ A,C,Data: As above, for the new message structure
+
For example, a common message is the "printmessage" message (message code
C is C_PRINTMESSAGE), which simply instructs the client to display "Data".
Any ^ characters within Data are replaced by newlines on output. So in order
- for the server to instruct player "Fred" to display "Hello world" it would
- send the message:-
- ^Fred^AAHello world
- Note that the server has left the From field blank, and has specified the
- AI code 'A' - defined in AIPlayer.h as C_NONE (i.e. an "unimportant"
- message) as well as the main code 'A', defined as C_PRINTMESSAGE in
- message.h
-
- When the network is down, a server is simulated locally. Client to server
- messages are simply passed directly to the server message handling routine
- in serverside.c, while server to client messages are queued in MessageList
- and read by the do_game loop within dopewars.c */
+ for the server to instruct player "Fred" (ID 1) to display "Hello world" it
+ would send the message:-
+ ^AAHello world (new format)
+ ^Fred^AAHello world (old format)
+ Note that the server has left the Other (or From) field blank, and has
+ specified the AI code 'A' - defined in AIPlayer.h as C_NONE (i.e. an
+ "unimportant" message) as well as the main code 'A', defined as
+ C_PRINTMESSAGE in message.h. Note also that the destination player (Fred)
+ is not specified in the new format; the player is identified by the socket
+ through which the message is transmitted.
+
+ When the network is down, a server is simulated locally. Messages from
+ the client are passed directly to the server message handling routine,
+ and vice versa. */
GSList *FirstClient;
t@@ -84,17 +97,34 @@ void (*ClientMessageHandlerPt) (char *,Player *) = NULL;
void (*SocketWriteTestPt) (Player *,gboolean) = NULL;
void SendClientMessage(Player *From,char AICode,char Code,
- Player *To,char *Data,Player *BufOwn) {
+ Player *To,char *Data) {
+/* Sends a message from player "From" to player "To" via. the server. */
+/* AICode, Code and Data define the message. */
+ DoSendClientMessage(From,AICode,Code,To,Data,From);
+}
+
+void SendNullClientMessage(Player *From,char AICode,char Code,
+ Player *To,char *Data) {
+/* Sends a message from player "From" to player "To" via. the server, */
+/* sending a blank name for "From" (this is required with the old message */
+/* format, up to and including the first successful C_NAME message, but */
+/* has no effect with the new format. AICode, Code and Data define the */
+/* message. */
+ DoSendClientMessage(NULL,AICode,Code,To,Data,From);
+}
+
+void DoSendClientMessage(Player *From,char AICode,char Code,
+ Player *To,char *Data,Player *BufOwn) {
/* Send a message from client player "From" with computer code "AICode", */
/* human-readable code "Code" and data "Data". The message is sent to the */
-/* server, identifying itself as for "To". From, To, or Data may be NULL. */
+/* server, identifying itself as for "To". "BufOwn" identifies the player */
+/* which owns the buffers used for the actual wire connection. With the */
+/* new message format, "From" is ignored. From, To, or Data may be NULL. */
GString *text;
Player *ServerFrom;
g_assert(BufOwn!=NULL);
text=g_string_new(NULL);
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 {
t@@ -102,7 +132,6 @@ void SendClientMessage(Player *From,char AICode,char Code,
To ? GetPlayerName(To) : "",AICode,Code,
Data ? Data : "");
}
-
#if NETWORKING
if (!Network) {
#endif
t@@ -140,23 +169,37 @@ void SendQuestion(Player *From,char AICode,
void SendServerMessage(Player *From,char AICode,char Code,
Player *To,char *Data) {
/* 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" */
+/* code "AICode", human-readable code "Code" and data "Data", claiming */
+/* to be from player "From" */
GString *text;
- if (!Network) {
- 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);
+ text=g_string_new(NULL);
+ if (HaveAbility(To,A_PLAYERID)) {
+ if (From) g_string_sprintfa(text,"%d",From->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) {
+#endif
if (ClientMessageHandlerPt) {
(*ClientMessageHandlerPt)(text->str,(Player *)(FirstClient->data));
}
- g_string_free(text,TRUE);
- } else SendClientMessage(From,AICode,Code,To,Data,To);
+#if NETWORKING
+ } else {
+ WriteToConnectionBuffer(To,text->str);
+ if (SocketWriteTestPt) (*SocketWriteTestPt)(To,TRUE);
+ }
+#endif
+ g_string_free(text,TRUE);
}
void InitAbilities(Player *Play) {
+/* Sets up the "abilities" of player "Play". Abilities are used to extend */
+/* the protocol; if both the client and server share an ability, then the */
+/* protocol extension can be used. */
int i;
/* Clear all abilities */
for (i=0;i<A_NUM;i++) {
t@@ -172,16 +215,21 @@ void InitAbilities(Player *Play) {
}
void SendAbilities(Player *Play) {
+/* Sends abilities of player "Play" to the other end of the client-server */
+/* connection. */
int i;
gchar Data[A_NUM+1];
if (!Network) return;
for (i=0;i<A_NUM;i++) Data[i]= (Play->Abil.Local[i] ? '1' : '0');
Data[A_NUM]='\0';
if (Server) SendServerMessage(NULL,C_NONE,C_ABILITIES,Play,Data);
- else SendClientMessage(Play,C_NONE,C_ABILITIES,NULL,Data,Play);
+ else SendClientMessage(Play,C_NONE,C_ABILITIES,NULL,Data);
}
void ReceiveAbilities(Player *Play,gchar *Data) {
+/* Fills in the "remote" abilities of player "Play" using the message data */
+/* in "Data". These are the abilities of the server/client at the other */
+/* end of the connection. */
int i,Length;
InitAbilities(Play);
if (!Network) return;
t@@ -192,6 +240,9 @@ void ReceiveAbilities(Player *Play,gchar *Data) {
}
void CombineAbilities(Player *Play) {
+/* Combines the local and remote abilities of player "Play". The resulting */
+/* shared abilities are used to determine when protocol extensions can be */
+/* used. */
int i;
for (i=0;i<A_NUM;i++) {
Play->Abil.Shared[i]= (Play->Abil.Remote[i] && Play->Abil.Local[i]);
t@@ -199,12 +250,18 @@ void CombineAbilities(Player *Play) {
}
gboolean HaveAbility(Player *Play,gint Type) {
+/* Returns TRUE if ability "Type" is one of player "Play"'s shared abilities */
if (Type<0 || Type>=A_NUM) return FALSE;
else return (Play->Abil.Shared[Type]);
}
#if NETWORKING
gchar *ReadFromConnectionBuffer(Player *Play) {
+/* Reads a newline-terminated message from "Play"'s read buffer. The message */
+/* is removed from the buffer, and returned as a null-terminated string (the */
+/* terminating newline is removed). If no complete message is waiting, NULL */
+/* is returned. The string is dynamically allocated, and must be g_free'd by */
+/* the caller. */
ConnBuf *conn;
int MessageLen;
char *SepPt;
t@@ -226,6 +283,9 @@ gchar *ReadFromConnectionBuffer(Player *Play) {
}
gboolean ReadConnectionBufferFromWire(Player *Play) {
+/* Reads any waiting data on the TCP/IP connection for player "Play" into */
+/* the player's read buffer. Returns FALSE if the connection was closed, */
+/* or if the read buffer's maximum size was reached. */
ConnBuf *conn;
int CurrentPosition,BytesRead;
conn=&Play->ReadBuf;
t@@ -254,6 +314,11 @@ gboolean ReadConnectionBufferFromWire(Player *Play) {
}
void WriteToConnectionBuffer(Player *Play,gchar *data) {
+/* Writes the null-terminated string "data" to "Play"'s connection buffer. */
+/* The message is automatically newline-terminated. Fails to write the */
+/* message without error if the buffer reaches its maximum size (although */
+/* this error will be detected when the buffer is attempted to be written */
+/* to the wire, below) */
int AddLength,NewLength;
ConnBuf *conn;
conn=&Play->WriteBuf;
t@@ -272,6 +337,9 @@ void WriteToConnectionBuffer(Player *Play,gchar *data) {
}
gboolean WriteConnectionBufferToWire(Player *Play) {
+/* Writes any waiting data in "Play"'s connection buffer to the wire. */
+/* Returns TRUE on success, or FALSE if the buffer's maximum length is */
+/* reached, or the remote end has closed the connection. */
ConnBuf *conn;
int CurrentPosition,BytesSent;
conn=&Play->WriteBuf;
t@@ -675,43 +743,36 @@ void ShutdownNetwork() {
Client=Network=Server=FALSE;
}
-int ProcessMessage(char *Msg,Player *Play,Player **From,char *AICode,char *Code,
- Player **To,char **Data,GSList *First) {
+int ProcessMessage(char *Msg,Player *Play,Player **Other,char *AICode,
+ char *Code,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 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. */
+/* receiving the message. "Other" is the player that is identified by the */
+/* message; for messages to clients, this will be the player "From" which */
+/* the message claims to be, while for messages to servers, this will be */
+/* the player "To" which to send messages. Returns 0 on success, -1 on */
+/* failure. */
gchar *pt,*buf;
guint ID;
*AICode=*Code=C_NONE;
+ *Other=&Noone;
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;
- }
-
- 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 (HaveAbility(Play,A_PLAYERID)) {
+ buf=GetNextWord(&pt,NULL);
+ if (buf[0]) {
+ ID=atoi(buf);
+ *Other=GetPlayerByID(ID,First);
}
- if (!(*To)) return -1;
+ } else {
+ buf=GetNextWord(&pt,NULL);
+ if (Client) *Other=GetPlayerByName(buf,First);
+ buf=GetNextWord(&pt,NULL);
+ if (Server) *Other=GetPlayerByName(buf,First);
}
+ if (!(*Other)) return -1;
if (strlen(pt)>=2) {
*AICode=pt[0];
(DIR) diff --git a/src/message.h b/src/message.h
t@@ -93,7 +93,11 @@
#define DT_PRICES 'D'
void SendClientMessage(Player *From,char AICode,char Code,
- Player *To,char *Data,Player *BufOwn);
+ Player *To,char *Data);
+void SendNullClientMessage(Player *From,char AICode,char Code,
+ Player *To,char *Data);
+void DoSendClientMessage(Player *From,char AICode,char Code,
+ Player *To,char *Data,Player *BufOwn);
void SendServerMessage(Player *From,char AICode,char Code,
Player *To,char *Data);
void SendPrintMessage(Player *From,char AICode,Player *To,char *Data);
t@@ -133,8 +137,8 @@ char *SetupNetwork(gboolean NonBlocking);
char *FinishSetupNetwork();
void ShutdownNetwork();
void SwitchToSinglePlayer(Player *Play);
-int ProcessMessage(char *Msg,Player *Play,Player **From,char *AICode,char *Code,
- Player **To,char **Data,GSList *First);
+int ProcessMessage(char *Msg,Player *Play,Player **Other,char *AICode,
+ char *Code,char **Data,GSList *First);
void ReceiveDrugsHere(char *text,Player *To);
gboolean HandleGenericClientMessage(Player *From,char AICode,char Code,
Player *To,char *Data,char *DisplayMode);
(DIR) diff --git a/src/serverside.c b/src/serverside.c
t@@ -210,8 +210,7 @@ void HandleServerMessage(gchar *buf,Player *Play) {
int i;
price_t money;
-/* Ignore client's From: field - should always be "Play" */
- if (ProcessMessage(buf,Play,NULL,&AICode,&Code,&To,&Data,FirstServer)==-1) {
+ if (ProcessMessage(buf,Play,&To,&AICode,&Code,&Data,FirstServer)==-1) {
g_warning("Bad message");
return;
}
(DIR) diff --git a/src/win32_client.c b/src/win32_client.c
t@@ -241,8 +241,7 @@ static void HandleClientMessage(char *pt,Player *Play) {
gchar *text;
LRESULT Answer;
GSList *list;
-/* Ignore server's To: field; use "Play" instead */
- if (ProcessMessage(pt,Play,&From,&AICode,&Code,NULL,&Data,FirstClient)==-1) {
+ if (ProcessMessage(pt,Play,&From,&AICode,&Code,&Data,FirstClient)==-1) {
return;
}
Handled=HandleGenericClientMessage(From,AICode,Code,Play,Data,&DisplayMode);
t@@ -321,7 +320,7 @@ static void HandleClientMessage(char *pt,Player *Play) {
if (Answer!=0) {
text=g_strdup_printf("%c",(char)Answer);
SendClientMessage(Play,C_NONE,C_ANSWER,
- From==&Noone ? NULL : From,text,Play);
+ From==&Noone ? NULL : From,text);
g_free(text);
}
break;
t@@ -365,7 +364,7 @@ static void StartGame() {
Play->fd=ClientSock;
SendAbilities(Play);
SetPlayerName(Play,ClientData.PlayerName);
- SendClientMessage(NULL,C_NONE,C_NAME,NULL,ClientData.PlayerName,Play);
+ SendNullClientMessage(Play,C_NONE,C_NAME,NULL,ClientData.PlayerName);
InGame=TRUE;
UpdateControls();
if (Network) {
t@@ -528,8 +527,7 @@ BOOL CALLBACK TalkWndProc(HWND hwnd,UINT msg,UINT wParam,
SetWindowText(MessageWnd,"");
message=g_string_new("");
if (IsDlgButtonChecked(hwnd,CB_TALKALL)==BST_CHECKED) {
- SendClientMessage(ClientData.Play,C_NONE,C_MSG,NULL,text,
- ClientData.Play);
+ SendClientMessage(ClientData.Play,C_NONE,C_MSG,NULL,text);
g_string_sprintf(message,"%s: %s",
GetPlayerName(ClientData.Play),text);
PrintMessage(message->str);
t@@ -545,7 +543,7 @@ BOOL CALLBACK TalkWndProc(HWND hwnd,UINT msg,UINT wParam,
if (LBResult!=LB_ERR && LBResult) {
Play=(Player *)LBResult;
SendClientMessage(ClientData.Play,C_NONE,C_MSGTO,
- Play,text,ClientData.Play);
+ Play,text);
g_string_sprintf(message,"%s->%s: %s",
GetPlayerName(ClientData.Play),
GetPlayerName(Play),text);
t@@ -667,7 +665,7 @@ BOOL CALLBACK GunShopWndProc(HWND hwnd,UINT msg,UINT wParam,
g_string_sprintf(text,"gun^%d^%d",GunInd,
LOWORD(wParam)==BT_BUYGUN ? 1 : -1);
SendClientMessage(ClientData.Play,C_NONE,C_BUYOBJECT,
- NULL,text->str,ClientData.Play);
+ NULL,text->str);
}
g_free(Title);
g_string_free(text,TRUE);
t@@ -680,8 +678,7 @@ BOOL CALLBACK GunShopWndProc(HWND hwnd,UINT msg,UINT wParam,
case WM_DESTROY:
GunShopWnd=NULL;
EnableWindow(ClientData.Window,TRUE);
- SendClientMessage(ClientData.Play,C_NONE,C_DONE,NULL,NULL,
- ClientData.Play);
+ SendClientMessage(ClientData.Play,C_NONE,C_DONE,NULL,NULL);
return TRUE;
}
return FALSE;
t@@ -754,7 +751,7 @@ BOOL CALLBACK NewNameWndProc(HWND hwnd,UINT msg,UINT wParam,
text=g_new(char,buflen+1);
GetWindowText(EditWnd,text,buflen+1);
SetPlayerName(ClientData.Play,text);
- SendClientMessage(NULL,C_NONE,C_NAME,NULL,text,ClientData.Play);
+ SendNullClientMessage(ClientData.Play,C_NONE,C_NAME,NULL,text);
g_free(text);
DestroyWindow(hwnd);
return TRUE;
t@@ -824,7 +821,7 @@ BOOL CALLBACK TransferWndProc(HWND hwnd,UINT msg,UINT wParam,
text=pricetostr(money);
SendClientMessage(ClientData.Play,C_NONE,
Type==C_LOANSHARK ? C_PAYLOAN : C_DEPOSIT,
- NULL,text,ClientData.Play);
+ NULL,text);
g_free(text);
SendMessage(hwnd,WM_CLOSE,0,0);
return TRUE;
t@@ -832,8 +829,7 @@ BOOL CALLBACK TransferWndProc(HWND hwnd,UINT msg,UINT wParam,
break;
case WM_CLOSE:
EndDialog(hwnd,0);
- SendClientMessage(ClientData.Play,C_NONE,C_DONE,NULL,NULL,
- ClientData.Play);
+ SendClientMessage(ClientData.Play,C_NONE,C_DONE,NULL,NULL);
return TRUE;
}
return FALSE;
t@@ -987,8 +983,7 @@ static BOOL CALLBACK DealWndProc(HWND hwnd,UINT msg,UINT wParam,
amount=atoi(Num);
text=g_strdup_printf("drug^%d^%d",DrugInd,
DealType==BT_BUY ? amount : -amount);
- SendClientMessage(ClientData.Play,C_NONE,C_BUYOBJECT,NULL,text,
- ClientData.Play);
+ SendClientMessage(ClientData.Play,C_NONE,C_BUYOBJECT,NULL,text);
g_free(text);
EndDialog(hwnd,0); return TRUE;
} else if (HIWORD(wParam)==BN_CLICKED && LOWORD(wParam)==ID_CANCEL) {
t@@ -1049,8 +1044,7 @@ static BOOL CALLBACK JetWndProc(HWND hwnd,UINT msg,UINT wParam,
EndDialog(hwnd,0);
NewLocation=(gint)(LOWORD(wParam));
text=g_strdup_printf("%d",NewLocation);
- SendClientMessage(ClientData.Play,C_NONE,C_REQUESTJET,NULL,text,
- ClientData.Play);
+ SendClientMessage(ClientData.Play,C_NONE,C_REQUESTJET,NULL,text);
g_free(text);
return TRUE;
}
t@@ -1139,7 +1133,7 @@ static BOOL CALLBACK ErrandWndProc(HWND hwnd,UINT msg,UINT wParam,
Play=(Player *)LBResult;
SendClientMessage(ClientData.Play,C_NONE,
ErrandType==ID_SPY ? C_SPYON : C_TIPOFF,
- Play,NULL,ClientData.Play);
+ Play,NULL);
EndDialog(hwnd,0); return TRUE;
}
}
t@@ -1492,14 +1486,14 @@ LRESULT CALLBACK MainWndProc(HWND hwnd,UINT msg,UINT wParam,LONG lParam) {
"by this bitch may be lost!)",
"Sack Bitch",MB_YESNO)==IDYES) {
SendClientMessage(ClientData.Play,C_NONE,C_SACKBITCH,
- NULL,NULL,ClientData.Play);
+ NULL,NULL);
}
break;
case ID_GETSPY:
if (SpyReportsWnd) DestroyWindow(SpyReportsWnd);
SpyReportsWnd=NULL;
SendClientMessage(ClientData.Play,C_NONE,C_CONTACTSPY,
- NULL,NULL,ClientData.Play);
+ NULL,NULL);
break;
case ID_LISTPLAYERS:
if (PlayerListWnd) {
t@@ -1525,7 +1519,7 @@ LRESULT CALLBACK MainWndProc(HWND hwnd,UINT msg,UINT wParam,LONG lParam) {
break;
case ID_LISTSCORES:
SendClientMessage(ClientData.Play,C_NONE,C_REQUESTSCORE,
- NULL,NULL,ClientData.Play);
+ NULL,NULL);
break;
case ID_ABOUT:
DialogBox(hInst,MAKEINTRESOURCE(AboutDialog),hwnd,AboutWndProc);
t@@ -1558,8 +1552,7 @@ static BOOL CALLBACK FightWndProc(HWND hwnd,UINT msg,WPARAM wParam,
text[0]='F';
}
text[1]='\0';
- SendClientMessage(ClientData.Play,C_NONE,C_FIGHTACT,NULL,text,
- ClientData.Play);
+ SendClientMessage(ClientData.Play,C_NONE,C_FIGHTACT,NULL,text);
return TRUE;
case BT_RUN:
EnableWindow(ClientData.Window,TRUE);