tInitial rewrite of the fighting code - still pretty dodgy! - 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 3af8c7eacb988e73334e1d2cbaa3e7e32fa59648
 (DIR) parent a562ef418604d825eba6aaff3520b730fc8d233f
 (HTM) Author: Ben Webb <ben@salilab.org>
       Date:   Sun,  1 Oct 2000 18:23:39 +0000
       
       Initial rewrite of the fighting code - still pretty dodgy!
       
       
       Diffstat:
         M ChangeLog                           |       1 +
         M po/dopewars.pot                     |     696 +++++++++++++------------------
         M po/pl.po                            |     131 +++++++++++++++++++------------
         M src/curses_client.c                 |       1 +
         M src/dopewars.c                      |      23 ++++++++++++++++-------
         M src/dopewars.h                      |      24 ++++++++++--------------
         M src/gtk_client.c                    |       9 ++++++---
         M src/message.c                       |     197 +++++++++++++++++++++++++++++++
         M src/message.h                       |      30 ++++++++++++++++++++++++++++--
         M src/serverside.c                    |     781 +++++++++++--------------------
         M src/serverside.h                    |      17 ++++++++++-------
       
       11 files changed, 919 insertions(+), 991 deletions(-)
       ---
 (DIR) diff --git a/ChangeLog b/ChangeLog
       t@@ -1,4 +1,5 @@
        1.4.9
       +    - Completely rewritten fighting code
            - Internationalization (i18n) support
            - Networking revamped - now uses nonblocking sockets to improve server
              responsiveness and to remove deadlocks (previously, any client could
 (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-16 14:26+0100\n"
       +"POT-Creation-Date: 2000-10-01 19:16+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@@ -742,53 +742,53 @@ msgstr ""
        msgid "Drugs can be your friend!"
        msgstr ""
        
       -#: src/dopewars.c:1117
       +#: src/dopewars.c:1126
        msgid "Unable to process configuration file line"
        msgstr ""
        
       -#: src/dopewars.c:1178
       +#: src/dopewars.c:1187
        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:1239
       +#: src/dopewars.c:1248
        #, c-format
        msgid "Index into %s array should be between 1 and %d"
        msgstr ""
        
       -#: src/dopewars.c:1258
       +#: src/dopewars.c:1267
        #, c-format
        msgid "%s is %d\n"
        msgstr ""
        
       -#: src/dopewars.c:1263
       +#: src/dopewars.c:1272
        #, c-format
        msgid "%s is %s\n"
        msgstr ""
        
       -#: src/dopewars.c:1266
       +#: src/dopewars.c:1275
        #, c-format
        msgid "%s is \"%s\"\n"
        msgstr ""
        
       -#: src/dopewars.c:1270
       +#: src/dopewars.c:1279
        #, c-format
        msgid "%s[%d] is %s\n"
        msgstr ""
        
       -#: src/dopewars.c:1273
       +#: src/dopewars.c:1282
        #, c-format
        msgid "%s is { "
        msgstr ""
        
       -#: src/dopewars.c:1304
       +#: src/dopewars.c:1313
        #, c-format
        msgid "Resized structure list to %d elements\n"
        msgstr ""
        
       -#: src/dopewars.c:1448
       +#: src/dopewars.c:1457
        #, c-format
        msgid ""
        "Usage: dopewars [OPTION]...\n"
       t@@ -1002,7 +1002,7 @@ msgstr ""
        msgid "CLQP"
        msgstr ""
        
       -#: src/curses_client.c:371 src/gtk_client.c:815
       +#: src/curses_client.c:371 src/gtk_client.c:817
        msgid "Where to, dude ? "
        msgstr ""
        
       t@@ -1088,7 +1088,7 @@ msgstr ""
        msgid " Are you sure? "
        msgstr ""
        
       -#: src/curses_client.c:544 src/curses_client.c:562 src/curses_client.c:1691
       +#: src/curses_client.c:544 src/curses_client.c:562 src/curses_client.c:1692
        msgid "YN"
        msgstr ""
        
       t@@ -1108,12 +1108,12 @@ msgstr ""
        msgid "The server has terminated. Reverting to single player mode."
        msgstr ""
        
       -#: src/curses_client.c:649 src/gtk_client.c:340 src/serverside.c:258
       +#: src/curses_client.c:649 src/gtk_client.c:341 src/serverside.c:258
        #, c-format
        msgid "%s joins the game!"
        msgstr ""
        
       -#: src/curses_client.c:654 src/gtk_client.c:346
       +#: src/curses_client.c:654 src/gtk_client.c:347
        #, c-format
        msgid "%s has left the game."
        msgstr ""
       t@@ -1150,22 +1150,22 @@ msgstr ""
        msgid "You don't have any %s to sell!"
        msgstr ""
        
       -#: src/curses_client.c:820 src/gtk_client.c:1090
       +#: src/curses_client.c:820 src/gtk_client.c:1092
        #, c-format
        msgid "You'll need more %s to carry any more %s!"
        msgstr ""
        
       -#: src/curses_client.c:842 src/gtk_client.c:1094
       +#: src/curses_client.c:842 src/gtk_client.c:1096
        #, c-format
        msgid "You don't have enough space to carry that %s!"
        msgstr ""
        
       -#: src/curses_client.c:850 src/gtk_client.c:1098
       +#: src/curses_client.c:850 src/gtk_client.c:1100
        #, c-format
        msgid "You don't have enough cash to buy that %s!"
        msgstr ""
        
       -#: src/curses_client.c:863 src/gtk_client.c:1102
       +#: src/curses_client.c:863 src/gtk_client.c:1104
        msgid "You don't have any to sell!"
        msgstr ""
        
       t@@ -1173,7 +1173,7 @@ msgstr ""
        msgid "How much money do you pay back? "
        msgstr ""
        
       -#: src/curses_client.c:893 src/curses_client.c:923 src/gtk_client.c:1931
       +#: src/curses_client.c:893 src/curses_client.c:923 src/gtk_client.c:1934
        msgid "You don't have that much money!"
        msgstr ""
        
       t@@ -1189,7 +1189,7 @@ msgstr ""
        msgid "How much money? "
        msgstr ""
        
       -#: src/curses_client.c:926 src/gtk_client.c:1924
       +#: src/curses_client.c:926 src/gtk_client.c:1927
        msgid "There isn't that much money in the bank..."
        msgstr ""
        
       t@@ -1201,7 +1201,7 @@ msgstr ""
        msgid "Messages"
        msgstr ""
        
       -#: src/curses_client.c:1143 src/gtk_client.c:1383
       +#: src/curses_client.c:1143 src/gtk_client.c:1386
        msgid "Stats"
        msgstr ""
        
       t@@ -1261,96 +1261,96 @@ msgstr ""
        msgid "Hey dude, what's your name? "
        msgstr ""
        
       -#: src/curses_client.c:1433
       +#: src/curses_client.c:1434
        #, c-format
        msgid "Hey dude, the prices of %s here are:"
        msgstr ""
        
       -#: src/curses_client.c:1445
       +#: src/curses_client.c:1446
        msgid "Will you B>uy"
        msgstr ""
        
       -#: src/curses_client.c:1446
       +#: src/curses_client.c:1447
        msgid ", S>ell"
        msgstr ""
        
       -#: src/curses_client.c:1447
       +#: src/curses_client.c:1448
        msgid ", D>rop"
        msgstr ""
        
       -#: src/curses_client.c:1448
       +#: src/curses_client.c:1449
        msgid ", T>alk, P>age, L>ist"
        msgstr ""
        
       -#: src/curses_client.c:1451
       +#: src/curses_client.c:1452
        msgid ", G>ive"
        msgstr ""
        
       -#: src/curses_client.c:1454
       +#: src/curses_client.c:1455
        msgid ", F>ight"
        msgstr ""
        
       -#: src/curses_client.c:1458
       +#: src/curses_client.c:1459
        msgid ", J>et"
        msgstr ""
        
       -#: src/curses_client.c:1460 src/curses_client.c:1475
       +#: src/curses_client.c:1461 src/curses_client.c:1476
        msgid ", or Q>uit? "
        msgstr ""
        
       -#: src/curses_client.c:1468
       +#: src/curses_client.c:1469
        msgid "Do you "
        msgstr ""
        
       -#: src/curses_client.c:1470
       +#: src/curses_client.c:1471
        msgid "F>ight, "
        msgstr ""
        
       -#: src/curses_client.c:1471
       +#: src/curses_client.c:1472
        msgid "S>tand, "
        msgstr ""
        
       -#: src/curses_client.c:1473
       +#: src/curses_client.c:1474
        msgid "R>un, "
        msgstr ""
        
       -#: src/curses_client.c:1474
       +#: src/curses_client.c:1475
        msgid "D>eal "
        msgstr ""
        
       -#: src/curses_client.c:1517
       +#: src/curses_client.c:1518
        msgid "Connection to server lost! Reverting to single player mode"
        msgstr ""
        
       -#: src/curses_client.c:1546
       +#: src/curses_client.c:1547
        msgid "BSDTPLGFJQ"
        msgstr ""
        
       -#: src/curses_client.c:1548
       +#: src/curses_client.c:1549
        msgid "DRFSQ"
        msgstr ""
        
       -#: src/curses_client.c:1576
       +#: src/curses_client.c:1577
        msgid "List what? P>layers or S>cores? "
        msgstr ""
        
       -#: src/curses_client.c:1577
       +#: src/curses_client.c:1578
        msgid "PS"
        msgstr ""
        
       -#: src/curses_client.c:1586
       +#: src/curses_client.c:1587
        msgid "Whom do you want to page (talk privately to) ? "
        msgstr ""
        
       -#: src/curses_client.c:1601
       +#: src/curses_client.c:1602
        msgid "Talk: "
        msgstr ""
        
       -#: src/curses_client.c:1690
       +#: src/curses_client.c:1691
        msgid "Play again? "
        msgstr ""
        
       -#: src/curses_client.c:1702
       +#: src/curses_client.c:1703
        msgid ""
        "No curses client available - rebuild the binary passing the\n"
        "--enable-curses-client option to configure, or use a windowed\n"
       t@@ -1449,7 +1449,7 @@ msgstr ""
        msgid "Inventory"
        msgstr ""
        
       -#: src/gtk_client.c:240 src/gtk_client.c:2166 src/gtk_client.c:2530
       +#: src/gtk_client.c:240 src/gtk_client.c:2169 src/gtk_client.c:2533
        msgid "Close"
        msgstr ""
        
       t@@ -1457,184 +1457,184 @@ msgstr ""
        msgid "Connection to server lost - switching to single player mode"
        msgstr ""
        
       -#: src/gtk_client.c:314
       +#: src/gtk_client.c:315
        msgid "You have been pushed from the server."
        msgstr ""
        
       -#: src/gtk_client.c:319
       +#: src/gtk_client.c:320
        msgid "The server has terminated."
        msgstr ""
        
       -#: src/gtk_client.c:359
       +#: src/gtk_client.c:361
        #, c-format
        msgid "Jetting to %s"
        msgstr ""
        
       -#: src/gtk_client.c:367
       +#: src/gtk_client.c:369
        #, c-format
        msgid "_Spy\t(%s)"
        msgstr ""
        
       -#: src/gtk_client.c:371
       +#: src/gtk_client.c:373
        #, c-format
        msgid "_Tipoff\t(%s)"
        msgstr ""
        
       -#: src/gtk_client.c:405
       +#: src/gtk_client.c:407
        msgid "High Scores"
        msgstr ""
        
       -#: src/gtk_client.c:439 src/gtk_client.c:1041 src/gtk_client.c:1496
       -#: src/gtk_client.c:1841 src/gtk_client.c:2005 src/gtk_client.c:2281
       -#: src/gtk_client.c:2438
       +#: src/gtk_client.c:441 src/gtk_client.c:1043 src/gtk_client.c:1499
       +#: src/gtk_client.c:1844 src/gtk_client.c:2008 src/gtk_client.c:2284
       +#: src/gtk_client.c:2441
        msgid "OK"
        msgstr ""
        
       -#: src/gtk_client.c:521
       +#: src/gtk_client.c:523
        msgid "Fight"
        msgstr ""
        
       -#: src/gtk_client.c:548
       +#: src/gtk_client.c:550
        #, c-format
        msgid "_Deal %s"
        msgstr ""
        
       -#: src/gtk_client.c:552 src/gtk_client.c:1133 src/gtk_client.c:1330
       +#: src/gtk_client.c:554 src/gtk_client.c:1135 src/gtk_client.c:1332
        msgid "_Fight"
        msgstr ""
        
       -#: src/gtk_client.c:555
       +#: src/gtk_client.c:557
        msgid "_Stand"
        msgstr ""
        
       -#: src/gtk_client.c:558 src/gtk_client.c:1132
       +#: src/gtk_client.c:560 src/gtk_client.c:1134
        msgid "_Run"
        msgstr ""
        
       -#: src/gtk_client.c:806
       +#: src/gtk_client.c:808
        msgid "Jet to location"
        msgstr ""
        
       -#: src/gtk_client.c:875
       +#: src/gtk_client.c:877
        #, c-format
        msgid "at %s"
        msgstr ""
        
       -#: src/gtk_client.c:880
       +#: src/gtk_client.c:882
        #, c-format
        msgid "You are currently carrying %d %s"
        msgstr ""
        
       -#: src/gtk_client.c:885
       +#: src/gtk_client.c:887
        #, c-format
        msgid "Available space: %d"
        msgstr ""
        
       -#: src/gtk_client.c:890
       +#: src/gtk_client.c:892
        #, c-format
        msgid "You can afford %d"
        msgstr ""
        
       -#: src/gtk_client.c:939 src/gtk_client.c:1070
       +#: src/gtk_client.c:941 src/gtk_client.c:1072
        msgid "Buy"
        msgstr ""
        
       -#: src/gtk_client.c:940 src/gtk_client.c:1071
       +#: src/gtk_client.c:942 src/gtk_client.c:1073
        msgid "Sell"
        msgstr ""
        
       -#: src/gtk_client.c:941 src/gtk_client.c:1072
       +#: src/gtk_client.c:943 src/gtk_client.c:1074
        msgid "Drop"
        msgstr ""
        
       -#: src/gtk_client.c:1029
       +#: src/gtk_client.c:1031
        #, c-format
        msgid "%s how many?"
        msgstr ""
        
       -#: src/gtk_client.c:1047 src/gtk_client.c:1841 src/gtk_client.c:2016
       -#: src/gtk_client.c:2289
       +#: src/gtk_client.c:1049 src/gtk_client.c:1844 src/gtk_client.c:2019
       +#: src/gtk_client.c:2292
        msgid "Cancel"
        msgstr ""
        
       -#: src/gtk_client.c:1086
       +#: src/gtk_client.c:1088
        #, c-format
        msgid "You don't have any %s!"
        msgstr ""
        
       -#: src/gtk_client.c:1132 src/gtk_client.c:1842
       +#: src/gtk_client.c:1134 src/gtk_client.c:1845
        msgid "_Yes"
        msgstr ""
        
       -#: src/gtk_client.c:1132 src/gtk_client.c:1842
       +#: src/gtk_client.c:1134 src/gtk_client.c:1845
        msgid "_No"
        msgstr ""
        
       -#: src/gtk_client.c:1133
       +#: src/gtk_client.c:1135
        msgid "_Attack"
        msgstr ""
        
       -#: src/gtk_client.c:1133
       +#: src/gtk_client.c:1135
        msgid "_Evade"
        msgstr ""
        
       -#: src/gtk_client.c:1151
       +#: src/gtk_client.c:1153
        msgid "Question"
        msgstr ""
        
       -#: src/gtk_client.c:1280
       +#: src/gtk_client.c:1282
        msgid "Space"
        msgstr ""
        
       -#: src/gtk_client.c:1285
       +#: src/gtk_client.c:1287
        msgid "Cash"
        msgstr ""
        
       -#: src/gtk_client.c:1290
       +#: src/gtk_client.c:1292
        msgid "Debt"
        msgstr ""
        
       -#: src/gtk_client.c:1295
       +#: src/gtk_client.c:1297
        msgid "Bank"
        msgstr ""
        
       -#: src/gtk_client.c:1310
       +#: src/gtk_client.c:1312
        msgid "Health"
        msgstr ""
        
       -#: src/gtk_client.c:1330
       +#: src/gtk_client.c:1332
        msgid "_Jet!"
        msgstr ""
        
       -#: src/gtk_client.c:1360
       +#: src/gtk_client.c:1363
        msgid "dopewars"
        msgstr ""
        
       -#: src/gtk_client.c:1443
       +#: src/gtk_client.c:1446
        msgid "Drug Dealing and Research"
        msgstr ""
        
       -#: src/gtk_client.c:1444
       +#: src/gtk_client.c:1447
        msgid "Play Testing"
        msgstr ""
        
       -#: src/gtk_client.c:1445
       +#: src/gtk_client.c:1448
        msgid "Extensive Play Testing"
        msgstr ""
        
       -#: src/gtk_client.c:1447
       +#: src/gtk_client.c:1450
        msgid "Constructive Criticism"
        msgstr ""
        
       -#: src/gtk_client.c:1449
       +#: src/gtk_client.c:1452
        msgid "Unconstructive Criticism"
        msgstr ""
        
       -#: src/gtk_client.c:1453
       +#: src/gtk_client.c:1456
        msgid "About dopewars"
        msgstr ""
        
       -#: src/gtk_client.c:1462
       +#: src/gtk_client.c:1465
        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@@ -1646,151 +1646,151 @@ msgid ""
        "have one month of game time to make your fortune.\n"
        msgstr ""
        
       -#: src/gtk_client.c:1470
       +#: src/gtk_client.c:1473
        #, 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:1488
       +#: src/gtk_client.c:1491
        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."
       +"Unix prompt. This will display a help screen, listing the available options."
        msgstr ""
        
       -#: src/gtk_client.c:1526 src/gtk_client.c:1549
       +#: src/gtk_client.c:1529 src/gtk_client.c:1552
        #, c-format
        msgid "Status: Could not connect (%s)"
        msgstr ""
        
       -#: src/gtk_client.c:1537
       +#: src/gtk_client.c:1540
        #, c-format
        msgid "Status: Attempting to contact %s..."
        msgstr ""
        
       -#: src/gtk_client.c:1597
       +#: src/gtk_client.c:1600
        #, c-format
        msgid "%d of %d"
        msgstr ""
        
       -#: src/gtk_client.c:1661 src/gtk_client.c:1702 src/gtk_client.c:1743
       +#: src/gtk_client.c:1664 src/gtk_client.c:1705 src/gtk_client.c:1746
        msgid "Server"
        msgstr ""
        
       -#: src/gtk_client.c:1662 src/gtk_client.c:1717
       +#: src/gtk_client.c:1665 src/gtk_client.c:1720
        msgid "Port"
        msgstr ""
        
       -#: src/gtk_client.c:1663
       +#: src/gtk_client.c:1666
        msgid "Version"
        msgstr ""
        
       -#: src/gtk_client.c:1664
       +#: src/gtk_client.c:1667
        msgid "Players"
        msgstr ""
        
       -#: src/gtk_client.c:1665
       +#: src/gtk_client.c:1668
        msgid "Comment"
        msgstr ""
        
       -#: src/gtk_client.c:1678
       +#: src/gtk_client.c:1681
        msgid "New Game"
        msgstr ""
        
       -#: src/gtk_client.c:1687
       +#: src/gtk_client.c:1690
        msgid "Hey dude, what's your _name?"
        msgstr ""
        
       -#: src/gtk_client.c:1709
       +#: src/gtk_client.c:1712
        msgid "Host name"
        msgstr ""
        
       -#: src/gtk_client.c:1732 src/gtk_client.c:1795
       +#: src/gtk_client.c:1735 src/gtk_client.c:1798
        msgid "_Connect"
        msgstr ""
        
       -#: src/gtk_client.c:1745 src/gtk_client.c:1766
       +#: src/gtk_client.c:1748 src/gtk_client.c:1769
        msgid "Single player"
        msgstr ""
        
       -#: src/gtk_client.c:1751
       +#: src/gtk_client.c:1754
        msgid "_Antique mode"
        msgstr ""
        
       -#: src/gtk_client.c:1758
       +#: src/gtk_client.c:1761
        msgid "_Start single-player game"
        msgstr ""
        
       -#: src/gtk_client.c:1768 src/gtk_client.c:1806
       +#: src/gtk_client.c:1771 src/gtk_client.c:1809
        msgid "Metaserver"
        msgstr ""
        
       -#: src/gtk_client.c:1785
       +#: src/gtk_client.c:1788
        msgid "_Update"
        msgstr ""
        
       -#: src/gtk_client.c:1810
       +#: src/gtk_client.c:1813
        msgid "Status: Waiting for user input"
        msgstr ""
        
       -#: src/gtk_client.c:1962
       +#: src/gtk_client.c:1965
        #, c-format
        msgid "Cash: %s"
        msgstr ""
        
       -#: src/gtk_client.c:1969
       +#: src/gtk_client.c:1972
        #, c-format
        msgid "Debt: %s"
        msgstr ""
        
       -#: src/gtk_client.c:1972
       +#: src/gtk_client.c:1975
        #, c-format
        msgid "Bank: %s"
        msgstr ""
        
       -#: src/gtk_client.c:1980
       +#: src/gtk_client.c:1983
        msgid "Pay back:"
        msgstr ""
        
       -#: src/gtk_client.c:1983
       +#: src/gtk_client.c:1986
        msgid "Deposit"
        msgstr ""
        
       -#: src/gtk_client.c:1987
       +#: src/gtk_client.c:1990
        msgid "Withdraw"
        msgstr ""
        
       -#: src/gtk_client.c:2011
       +#: src/gtk_client.c:2014
        msgid "Pay all"
        msgstr ""
        
       -#: src/gtk_client.c:2033
       +#: src/gtk_client.c:2036
        msgid "Player List"
        msgstr ""
        
       -#: src/gtk_client.c:2121
       +#: src/gtk_client.c:2124
        msgid "Talk to player(s)"
        msgstr ""
        
       -#: src/gtk_client.c:2143
       +#: src/gtk_client.c:2146
        msgid "Talk to all players"
        msgstr ""
        
       -#: src/gtk_client.c:2147
       +#: src/gtk_client.c:2150
        msgid "Message:-"
        msgstr ""
        
       -#: src/gtk_client.c:2160
       +#: src/gtk_client.c:2163
        msgid "Send"
        msgstr ""
        
       -#: src/gtk_client.c:2251
       +#: src/gtk_client.c:2254
        msgid "Spy On Player"
        msgstr ""
        
       -#: src/gtk_client.c:2253
       +#: src/gtk_client.c:2256
        #, c-format
        msgid ""
        "Please choose the player to spy on. Your %s will\n"
       t@@ -1800,11 +1800,11 @@ msgid ""
        "you, so any %s or %s that he's carrying may be lost!"
        msgstr ""
        
       -#: src/gtk_client.c:2261
       +#: src/gtk_client.c:2264
        msgid "Tip Off The Cops"
        msgstr ""
        
       -#: src/gtk_client.c:2263
       +#: src/gtk_client.c:2266
        #, c-format
        msgid ""
        "Please choose the player to tip off the cops to. Your %s will\n"
       t@@ -1813,71 +1813,71 @@ msgid ""
        "so any %s or %s that he's carrying may be lost!"
        msgstr ""
        
       -#: src/gtk_client.c:2303
       +#: src/gtk_client.c:2306
        #, c-format
        msgid "Sack %s"
        msgstr ""
        
       -#: src/gtk_client.c:2304
       +#: src/gtk_client.c:2307
        #, c-format
        msgid ""
        "Are you sure? (Any %s or %s carried\n"
        "by this %s may be lost!)"
        msgstr ""
        
       -#: src/gtk_client.c:2324
       +#: src/gtk_client.c:2327
        msgid "Name"
        msgstr ""
        
       -#: src/gtk_client.c:2325
       +#: src/gtk_client.c:2328
        msgid "Price"
        msgstr ""
        
       -#: src/gtk_client.c:2326
       +#: src/gtk_client.c:2329
        msgid "Number"
        msgstr ""
        
       -#: src/gtk_client.c:2328
       +#: src/gtk_client.c:2331
        msgid "_Buy ->"
        msgstr ""
        
       -#: src/gtk_client.c:2329
       +#: src/gtk_client.c:2332
        msgid "<- _Sell"
        msgstr ""
        
       -#: src/gtk_client.c:2330
       +#: src/gtk_client.c:2333
        msgid "_Drop <-"
        msgstr ""
        
       -#: src/gtk_client.c:2335
       +#: src/gtk_client.c:2338
        #, c-format
        msgid "%s here"
        msgstr ""
        
       -#: src/gtk_client.c:2338
       +#: src/gtk_client.c:2341
        #, c-format
        msgid "%s carried"
        msgstr ""
        
       -#: src/gtk_client.c:2414
       +#: src/gtk_client.c:2417
        msgid "Change Name"
        msgstr ""
        
       -#: src/gtk_client.c:2424
       +#: src/gtk_client.c:2427
        msgid ""
        "Unfortunately, somebody else is already using \"your\" name. Please change "
        "it:-"
        msgstr ""
        
       -#: src/gtk_client.c:2483
       +#: src/gtk_client.c:2486
        msgid "Done"
        msgstr ""
        
       -#: src/gtk_client.c:2516
       +#: src/gtk_client.c:2519
        msgid "Spy reports"
        msgstr ""
        
       -#: src/gtk_client.c:2587
       +#: src/gtk_client.c:2590
        msgid ""
        "No GTK+ client available - rebuild the binary passing the\n"
        "--enable-gtk-client option to configure, or use the curses\n"
       t@@ -1964,45 +1964,45 @@ msgstr ""
        msgid "%s: DENIED jet to %s"
        msgstr ""
        
       -#: src/serverside.c:374
       +#: src/serverside.c:362
        #, c-format
        msgid "%s now spying on %s"
        msgstr ""
        
       -#: src/serverside.c:382
       +#: src/serverside.c:370
        #, c-format
        msgid "%s spy on %s: DENIED"
        msgstr ""
        
       -#: src/serverside.c:388
       +#: src/serverside.c:376
        #, c-format
        msgid "%s tipped off the cops to %s"
        msgstr ""
        
       -#: src/serverside.c:396
       +#: src/serverside.c:384
        #, c-format
        msgid "%s tipoff about %s: DENIED"
        msgstr ""
        
       -#: src/serverside.c:503
       +#: src/serverside.c:490
        msgid "--More--"
        msgstr ""
        
       -#: src/serverside.c:514
       +#: src/serverside.c:501
        msgid "Pager exited abnormally - using stdout instead..."
        msgstr ""
        
       -#: src/serverside.c:529
       +#: src/serverside.c:516
        #, c-format
        msgid "Maintaining pid file %s"
        msgstr ""
        
       -#: src/serverside.c:533
       +#: src/serverside.c:520
        #, c-format
        msgid "Cannot create pid file %s"
        msgstr ""
        
       -#: src/serverside.c:582
       +#: src/serverside.c:569
        #, c-format
        msgid ""
        "Cannot open high score file %s.\n"
       t@@ -2010,512 +2010,406 @@ msgid ""
        "specify an alternate high score file with the -f command line option."
        msgstr ""
        
       -#: src/serverside.c:619
       +#: src/serverside.c:606
        #, 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:623
        msgid "Cannot install SIGUSR1 interrupt handler!"
        msgstr ""
        
       -#: src/serverside.c:642
       +#: src/serverside.c:629
        msgid "Cannot install SIGINT interrupt handler!"
        msgstr ""
        
       -#: src/serverside.c:645
       +#: src/serverside.c:632
        msgid "Cannot install SIGTERM interrupt handler!"
        msgstr ""
        
       -#: src/serverside.c:648
       +#: src/serverside.c:635
        msgid "Cannot install SIGHUP interrupt handler!"
        msgstr ""
        
       -#: src/serverside.c:653
       +#: src/serverside.c:640
        msgid "Cannot install pipe handler!"
        msgstr ""
        
       -#: src/serverside.c:676
       +#: src/serverside.c:663
        msgid "Users currently logged on:-\n"
        msgstr ""
        
       -#: src/serverside.c:681
       +#: src/serverside.c:668
        msgid "No users currently logged on!"
        msgstr ""
        
       -#: src/serverside.c:685
       +#: src/serverside.c:672
        #, c-format
        msgid "Pushing %s"
        msgstr ""
        
       -#: src/serverside.c:687 src/serverside.c:695
       +#: src/serverside.c:674 src/serverside.c:682
        msgid "No such user!"
        msgstr ""
        
       -#: src/serverside.c:691
       +#: src/serverside.c:678
        #, c-format
        msgid "%s killed"
        msgstr ""
        
       -#: src/serverside.c:697
       +#: src/serverside.c:684
        msgid "Unknown command - try \"help\" for help..."
        msgstr ""
        
       -#: src/serverside.c:714
       +#: src/serverside.c:701
        #, c-format
        msgid "got connection from %s"
        msgstr ""
        
       -#: src/serverside.c:730
       +#: src/serverside.c:717
        #, c-format
        msgid "%s leaves the server!"
        msgstr ""
        
       -#: src/serverside.c:798
       +#: src/serverside.c:785
        msgid "Standard input closed."
        msgstr ""
        
       -#: src/serverside.c:941
       +#: src/serverside.c:928
        #, c-format
        msgid "Unable to read high score file %s"
        msgstr ""
        
       -#: src/serverside.c:961
       +#: src/serverside.c:948
        msgid "Congratulations! You made the high scores!"
        msgstr ""
        
       -#: src/serverside.c:974
       +#: src/serverside.c:961
        msgid "You didn't even make the high score table..."
        msgstr ""
        
       -#: src/serverside.c:988
       +#: src/serverside.c:975
        #, c-format
        msgid "Unable to write high score file %s"
        msgstr ""
        
       -#: src/serverside.c:1007
       +#: src/serverside.c:994
        msgid "(R.I.P.)"
        msgstr ""
        
       -#: src/serverside.c:1042
       +#: src/serverside.c:1029
        #, c-format
        msgid "%s: Tipoff from %s"
        msgstr ""
        
       -#: src/serverside.c:1059
       +#: src/serverside.c:1046
        #, c-format
        msgid "One of your %s was spying for %s.^The spy %s!"
        msgstr ""
        
       -#: src/serverside.c:1067
       +#: src/serverside.c:1054
        #, c-format
        msgid "Your spy working with %s has been discovered!^The spy %s!"
        msgstr ""
        
       -#: src/serverside.c:1090
       +#: src/serverside.c:1077
        #, c-format
        msgid " The lady next to you on the subway said,^ \"%s\"%s"
        msgstr ""
        
       -#: src/serverside.c:1093
       +#: src/serverside.c:1080
        msgid "^    (at least, you -think- that's what she said)"
        msgstr ""
        
       -#: src/serverside.c:1095
       +#: src/serverside.c:1082
        #, 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:1091 src/serverside.c:1100 src/serverside.c:1109
       +#: src/serverside.c:1118
        #, c-format
        msgid "YN^Would you like to visit %s?"
        msgstr ""
        
       -#: src/serverside.c:1142
       +#: src/serverside.c:1129
        #, c-format
        msgid "YN^^Would you like to hire %s %s for %s?"
        msgstr ""
        
       -#: src/serverside.c:1143
       +#: src/serverside.c:1130
        msgid "an"
        msgstr ""
        
       -#: src/serverside.c:1143
       +#: src/serverside.c:1130
        msgid "a"
        msgstr ""
        
       -#: src/serverside.c:1155
       +#: src/serverside.c:1142
        #, c-format
        msgid "AE^%s is already here!^Do you Attack, or Evade?"
        msgstr ""
        
       -#. Send client "Play" a message announcing the attack of the cops
       -#. 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
       -#, c-format
       -msgid "YN^Officer %s is chasing you!"
       -msgstr ""
       -
       -#: src/serverside.c:1226
       -#, c-format
       -msgid "YN^Officer %s and %d of his deputies are chasing you!"
       -msgstr ""
       -
       -#: src/serverside.c:1247
       -msgid "^Do you run?"
       -msgstr ""
       -
       -#: src/serverside.c:1250
       -msgid "^Do you Run, or Fight?"
       -msgstr ""
       -
       -#: src/serverside.c:1265
       -#, c-format
       -msgid "%s: tipoff by %s finished OK."
       -msgstr ""
       -
       -#: src/serverside.c:1271
       -#, c-format
       -msgid "Following your tipoff, the cops ambushed %s, who was shot dead"
       -msgstr ""
       -
       -#: src/serverside.c:1275
       -#, c-format
       -msgid "Following your tipoff, the cops ambushed %s, who escaped with %d %s. "
       -msgstr ""
       -
       -#: src/serverside.c:1312
       -msgid "^You stand there like an idiot."
       -msgstr ""
       -
       -#: src/serverside.c:1316
       -msgid "^You lose him in the alleys."
       -msgstr ""
       -
       -#: src/serverside.c:1318
       -msgid "^You lose them in the alleys."
       -msgstr ""
       -
       -#: src/serverside.c:1326
       -msgid "^You can't shake him, man!"
       -msgstr ""
       -
       -#: src/serverside.c:1328
       -msgid "^You can't shake them, man!"
       -msgstr ""
       -
       -#: src/serverside.c:1339
       -#, c-format
       -msgid "^You killed Officer %s! You find %s on his corpse!"
       -msgstr ""
       -
       -#: src/serverside.c:1353
       -#, c-format
       -msgid "YN^^^^Do you pay a doctor %s to sew your %s up?"
       -msgstr ""
       -
       -#: src/serverside.c:1357
       -#, c-format
       -msgid "YN^^^^Do you pay a doctor %s to sew you up?"
       -msgstr ""
       -
       -#: src/serverside.c:1369
       -msgid "^You got one, man!"
       -msgstr ""
       -
       -#: src/serverside.c:1372
       -msgid "^You missed!"
       -msgstr ""
       -
       -#: src/serverside.c:1376
       -msgid "^He's firing on you, man! "
       -msgstr ""
       -
       -#: src/serverside.c:1378
       -msgid "^They're firing on you, man! "
       -msgstr ""
       -
       -#: src/serverside.c:1381
       -msgid "You've been hit! "
       -msgstr ""
       -
       -#: src/serverside.c:1388
       -msgid "He wasted you, man! What a drag!"
       -msgstr ""
       -
       -#: src/serverside.c:1390
       -msgid "They wasted you, man! What a drag!"
       -msgstr ""
       -
       -#: src/serverside.c:1398
       -#, c-format
       -msgid "You lost one of your %s!"
       -msgstr ""
       -
       -#: src/serverside.c:1407
       -msgid "He missed!"
       -msgstr ""
       -
       -#: src/serverside.c:1409
       -msgid "They missed!"
       -msgstr ""
       -
       -#: src/serverside.c:1429
       +#: src/serverside.c:1465
        msgid "You were mugged in the subway!"
        msgstr ""
        
       -#: src/serverside.c:1440
       +#: src/serverside.c:1476
        #, c-format
        msgid "You meet a friend! He gives you %d %s."
        msgstr ""
        
       -#: src/serverside.c:1445
       +#: src/serverside.c:1481
        #, c-format
        msgid "You meet a friend! You give him %d %s."
        msgstr ""
        
       -#: src/serverside.c:1454
       +#: src/serverside.c:1490
        msgid "Sanitized away a RandomOffer"
        msgstr ""
        
       -#: src/serverside.c:1459
       +#: src/serverside.c:1495
        #, c-format
        msgid ""
        "Police dogs chase you for %d blocks! You dropped some %s! That's a drag, man!"
        msgstr ""
        
       -#: src/serverside.c:1475
       +#: src/serverside.c:1511
        #, c-format
        msgid "You find %d %s on a dead dude in the subway!"
        msgstr ""
        
       -#: src/serverside.c:1487
       +#: src/serverside.c:1523
        #, c-format
        msgid "Your mama made brownies with some of your %s! They were great!"
        msgstr ""
        
       -#: src/serverside.c:1497
       +#: src/serverside.c:1533
        msgid ""
        "YN^There is some weed that smells like paraquat here!^It looks good! Will "
        "you smoke it? "
        msgstr ""
        
       -#: src/serverside.c:1504
       +#: src/serverside.c:1540
        #, c-format
        msgid "You stopped to %s."
        msgstr ""
        
       -#: src/serverside.c:1525
       +#: src/serverside.c:1561
        #, c-format
        msgid "Would you like to buy a bigger trenchcoat for %s?"
        msgstr ""
        
       -#: src/serverside.c:1530
       +#: src/serverside.c:1566
        #, c-format
        msgid "YN^Hey dude! I'll help carry your %s for a mere %s. Yes or no?"
        msgstr ""
        
       -#: src/serverside.c:1542
       +#: src/serverside.c:1578
        #, c-format
        msgid "YN^Would you like to buy a %s for %s?"
        msgstr ""
        
       -#: src/serverside.c:1643 src/serverside.c:1754
       +#: src/serverside.c:1684 src/serverside.c:1777
        #, c-format
        msgid "%s: offer was on behalf of %s"
        msgstr ""
        
       -#: src/serverside.c:1646
       +#: src/serverside.c:1687
        #, c-format
        msgid "%s has accepted your %s!^Use the G key to contact your spy."
        msgstr ""
        
       -#: src/serverside.c:1692
       +#: src/serverside.c:1733
        msgid ""
        "You hallucinated for three days on the wildest trip you ever imagined!^Then "
        "you died because your brain disintegrated!"
        msgstr ""
        
       -#: src/serverside.c:1731
       +#: src/serverside.c:1757
        #, c-format
        msgid "Too late - %s has just left!"
        msgstr ""
        
       -#: src/serverside.c:1757
       +#: src/serverside.c:1780
        #, c-format
        msgid "%s has rejected your %s!"
        msgstr ""
        
       -#: src/serverside.c:1792
       -#, c-format
       -msgid "%s has got away!"
       +#: src/serverside.c:1823
       +msgid "YN^Officer %%s spots you dropping %s, and chases you!"
        msgstr ""
        
       -#: src/serverside.c:1833
       -#, c-format
       -msgid "%s has run off!"
       +#: src/serverside.c:1825
       +msgid ""
       +"YN^Officer %%s and %%d of his deputies spot you dropping %s, and chase you!"
        msgstr ""
        
       -#: src/serverside.c:1845
       -msgid "Coward! You successfully escaped from the fight."
       +#: src/serverside.c:1984
       +msgid "Player removed due to idle timeout"
        msgstr ""
        
       -#: src/serverside.c:1901
       -msgid "pitifully armed"
       +#: src/serverside.c:1994
       +msgid "Player removed due to connect timeout"
        msgstr ""
        
       -#: src/serverside.c:1902
       -msgid "lightly armed"
       +#: src/message.c:524
       +#, c-format
       +msgid ""
       +"This server is version %s, while your client is version %s.\n"
       +"Be warned that different versions may not be fully compatible!\n"
       +"Refer to the website at http://bellatrix.pcl.ox.ac.uk/~ben/dopewars/\n"
       +"for the latest version."
        msgstr ""
        
       -#: src/serverside.c:1903
       -msgid "moderately well armed"
       +#: src/message.c:667
       +msgid "Could not find host"
        msgstr ""
        
       -#: src/serverside.c:1904
       -msgid "heavily armed"
       +#: src/message.c:668
       +msgid "Could not create network socket"
        msgstr ""
        
       -#: src/serverside.c:1905
       -msgid "armed to the teeth"
       +#: src/message.c:669 src/message.c:702
       +msgid "Connection refused or no server present"
        msgstr ""
        
       -#: src/serverside.c:1906
       -msgid " fires and "
       +#: src/message.c:861
       +msgid "Cannot locate metaserver"
        msgstr ""
        
       -#: src/serverside.c:1907
       -msgid " stands and takes it."
       +#: src/message.c:862
       +msgid "Cannot create socket"
        msgstr ""
        
       -#: src/serverside.c:1910
       -#, c-format
       -msgid "%s arrives, with %d %s, %s,^%s"
       +#: src/message.c:864
       +msgid "Metaserver not running HTTP or connection denied"
        msgstr ""
        
       -#: src/serverside.c:1914
       -#, c-format
       -msgid "%s arrives, %s,^%s"
       +#: src/message.c:944
       +msgid "Do you run?"
        msgstr ""
        
       -#: src/serverside.c:1919
       -#, c-format
       -msgid "%s fires and "
       +#: src/message.c:947
       +msgid "Do you run, or fight?"
        msgstr ""
        
       -#: src/serverside.c:1921
       -#, c-format
       -msgid "%s stands and takes it."
       +#: src/message.c:1048
       +msgid "pitifully armed"
        msgstr ""
        
       -#: src/serverside.c:1933
       -msgid "misses you!"
       +#: src/message.c:1049
       +msgid "lightly armed"
        msgstr ""
        
       -#: src/serverside.c:1934
       -#, c-format
       -msgid "You failed to hit %s."
       +#: src/message.c:1050
       +msgid "moderately well armed"
        msgstr ""
        
       -#: src/serverside.c:1937
       -msgid "You stand and take it."
       +#: src/message.c:1051
       +msgid "heavily armed"
        msgstr ""
        
       -#: src/serverside.c:1941
       -msgid "hits you, man!"
       +#: src/message.c:1052
       +msgid "armed to the teeth"
        msgstr ""
        
       -#: src/serverside.c:1944
       -msgid " You've been wasted! What a drag!"
       +#: src/message.c:1054
       +#, c-format
       +msgid "%s arrives with %d %s, %s!"
        msgstr ""
        
       -#: src/serverside.c:1945
       +#: src/message.c:1060
        #, c-format
       -msgid "You hit and killed %s"
       +msgid "%s stands and takes it"
        msgstr ""
        
       -#: src/serverside.c:1960 src/serverside.c:1993
       -msgid ", and loot the body!"
       +#: src/message.c:1062
       +msgid "You stand there like a dummy."
        msgstr ""
        
       -#: src/serverside.c:1969
       +#: src/message.c:1067
        #, c-format
       -msgid "^You lost a %s, man!"
       +msgid "%s has got away!"
        msgstr ""
        
       -#: src/serverside.c:1974
       -#, c-format
       -msgid "You are paid a bounty of %s in reward for killing^one of %s's %s"
       +#: src/message.c:1069
       +msgid "You got away!"
       +msgstr ""
       +
       +#: src/message.c:1074
       +msgid "Guns reloaded..."
        msgstr ""
        
       -#: src/serverside.c:1982
       +#: src/message.c:1079
        #, c-format
       -msgid "You killed one of %s's %s (%d left)"
       +msgid "%s shoots at %s... and misses!"
        msgstr ""
        
       -#: src/serverside.c:2000
       +#: src/message.c:1082
        #, c-format
       -msgid "You fire, and hit %s!"
       +msgid "%s shoots at you... and misses!"
        msgstr ""
        
       -#: src/serverside.c:2046
       -msgid "YN^Officer %%s spots you dropping %s, and chases you!"
       +#: src/message.c:1085
       +#, c-format
       +msgid "You missed %s!"
        msgstr ""
        
       -#: src/serverside.c:2048
       -msgid ""
       -"YN^Officer %%s and %%d of his deputies spot you dropping %s, and chase you!"
       +#: src/message.c:1091
       +#, c-format
       +msgid "%s shoots %s dead."
        msgstr ""
        
       -#: src/serverside.c:2207
       -msgid "Player removed due to idle timeout"
       +#: src/message.c:1094
       +#, c-format
       +msgid "%s shoots at %s and kills a %s!"
        msgstr ""
        
       -#: src/serverside.c:2217
       -msgid "Player removed due to connect timeout"
       +#: src/message.c:1097
       +#, c-format
       +msgid "%s shoots at %s."
        msgstr ""
        
       -#: src/serverside.c:2223 src/serverside.c:2229
       +#: src/message.c:1102
        #, c-format
       -msgid "%s fails to return fire..."
       +msgid "%s wasted you, man! What a drag!"
        msgstr ""
        
       -#: src/message.c:523
       +#: src/message.c:1105
        #, c-format
       -msgid ""
       -"This server is version %s, while your client is version %s.\n"
       -"Be warned that different versions may not be fully compatible!\n"
       -"Refer to the website at http://bellatrix.pcl.ox.ac.uk/~ben/dopewars/\n"
       -"for the latest version."
       +msgid "%s shoots at you... and kills a %s!"
        msgstr ""
        
       -#: src/message.c:666
       -msgid "Could not find host"
       +#: src/message.c:1108
       +#, c-format
       +msgid "%s hits you, man!"
        msgstr ""
        
       -#: src/message.c:667
       -msgid "Could not create network socket"
       +#: src/message.c:1112
       +#, c-format
       +msgid "You killed %s!"
        msgstr ""
        
       -#: src/message.c:668 src/message.c:701
       -msgid "Connection refused or no server present"
       +#: src/message.c:1114
       +#, c-format
       +msgid "You hit %s, and killed a %s!"
        msgstr ""
        
       -#: src/message.c:860
       -msgid "Cannot locate metaserver"
       +#: src/message.c:1117
       +#, c-format
       +msgid "You hit %s!"
        msgstr ""
        
       -#: src/message.c:861
       -msgid "Cannot create socket"
       +#: src/message.c:1120
       +msgid " You loot the body!"
        msgstr ""
        
       -#: src/message.c:863
       -msgid "Metaserver not running HTTP or connection denied"
       +#: src/message.c:1123
       +#, c-format
       +msgid " (Health: %d)"
        msgstr ""
        
        #: src/AIPlayer.c:58
 (DIR) diff --git a/po/pl.po b/po/pl.po
       t@@ -7,9 +7,9 @@ msgid ""
        msgstr ""
        "Project-Id-Version: PACKAGE VERSION\n"
        "POT-Creation-Date: 2000-09-14 23:22+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"
       +"PO-Revision-Date: 2000-09-16 22:00+02000\n"
       +"Last-Translator: Slawomir Molenda <jeszua@panda.bg.univ.gda.pl>\n"
       +"Language-Team: Polish <pl@li.org>\n"
        "MIME-Version: 1.0\n"
        "Content-Type: text/plain; charset=iso-8859-2\n"
        "Content-Transfer-Encoding: 8bit\n"
       t@@ -712,7 +712,7 @@ msgstr "Zajeb gline, dla Chrystusa!"
        
        #: src/dopewars.c:460
        msgid "I am the walrus!"
       -msgstr "Jestem jebanym cieciem!"
       +msgstr "Jestem zajebistą prostytutką!"
        
        #: src/dopewars.c:461
        msgid "Jesus loves you more than you will know"
       t@@ -740,49 +740,52 @@ msgstr "Dragi to tw
        
        #: src/dopewars.c:1102
        msgid "Unable to process configuration file line"
       -msgstr ""
       +msgstr "Nie można przetworzyć linii w pliku konfiguracyjnym."
        
        #: 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 ""
       +msgstr "" 
       +"Konfiguracja może być zmieniona interaktywnie tylko, gdy\n"
       +"żaden z graczy nie jest zalogowany. Zaczekaj, aż wszyscy się wylogują\n"
       +"lub usuń ich komendami \"push\" albo \"kill\" i spróbuj jeszcze raz." 
        
        #: src/dopewars.c:1224
        #, c-format
        msgid "Index into %s array should be between 1 and %d"
       -msgstr ""
       +msgstr "Indeks w tablicy %s powinien być pomiędzy 1 i %d"
        
        #: src/dopewars.c:1243
        #, fuzzy, c-format
        msgid "%s is %d\n"
       -msgstr ""
       +msgstr "%s jest %d\n"
        
        #: src/dopewars.c:1248
        #, fuzzy, c-format
        msgid "%s is %s\n"
       -msgstr ""
       +msgstr "%s jest %s\n"
        
        #: src/dopewars.c:1251
        #, c-format
        msgid "%s is \"%s\"\n"
       -msgstr ""
       +msgstr "%s jest \"%s\"\n"
        
        #: src/dopewars.c:1255
        #, c-format
        msgid "%s[%d] is %s\n"
       -msgstr ""
       +msgstr "%s[%d] jest %s\n"
        
        #: src/dopewars.c:1258
        #, fuzzy, c-format
        msgid "%s is { "
       -msgstr ""
       +msgstr "%s jest { "
        
        #: src/dopewars.c:1289
        #, c-format
        msgid "Resized structure list to %d elements\n"
       -msgstr ""
       +msgstr "Zmieniono strukturę listy do %d elementów\n"
        
        #: src/dopewars.c:1432
        #, c-format
       t@@ -1542,7 +1545,7 @@ msgstr "_Uciekaj"
        
        #: src/gtk_client.c:800
        msgid "Jet to location"
       -msgstr ""
       +msgstr "Podróż"
        
        #: src/gtk_client.c:869
        #, c-format
       t@@ -1552,7 +1555,7 @@ msgstr "za %s"
        #: src/gtk_client.c:874
        #, c-format
        msgid "You are currently carrying %d %s"
       -msgstr "%s: Na stanie %d"
       +msgstr "%2$s: Na stanie %1$d"
        
        #: src/gtk_client.c:879
        #, c-format
       t@@ -1593,19 +1596,19 @@ msgstr "Nie masz 
        
        #: src/gtk_client.c:1126 src/gtk_client.c:1836
        msgid "_Yes"
       -msgstr ""
       +msgstr "_Tak"
        
        #: src/gtk_client.c:1126 src/gtk_client.c:1836
        msgid "_No"
       -msgstr ""
       +msgstr "_Nie"
        
        #: src/gtk_client.c:1127
        msgid "_Attack"
       -msgstr ""
       +msgstr "_Atakuj"
        
        #: src/gtk_client.c:1127
        msgid "_Evade"
       -msgstr ""
       +msgstr "_Ewakuuj się"
        
        #: src/gtk_client.c:1145
        msgid "Question"
       t@@ -1649,7 +1652,7 @@ msgstr "Testowanie gry"
        
        #: src/gtk_client.c:1439
        msgid "Extensive Play Testing"
       -msgstr ""
       +msgstr "Ekstensywne testowanie gry"
        
        #: src/gtk_client.c:1441
        msgid "Constructive Criticism"
       t@@ -1709,7 +1712,7 @@ msgstr "Status: Nie mog
        #: src/gtk_client.c:1531
        #, fuzzy, c-format
        msgid "Status: Attempting to contact %s..."
       -msgstr ""
       +msgstr "Status: Próba kontaktu z %s..."
        
        #: src/gtk_client.c:1591
        #, c-format
       t@@ -1839,7 +1842,11 @@ msgid ""
        "you will be able to view the player's stats with the\n"
        "\"Get spy reports\" menu. Remember that the %s will leave\n"
        "you, so any %s or %s that he's carrying may be lost!"
       -msgstr ""
       +msgstr "Wybierz gracza, którego chcesz szpiegować. Twoja %s\n"
       +"zaoferuje wtedy swoje usługi temu graczowi, i jeżeli on się zgodzi,\n"
       +"będziesz w stanie zobaczyć jego statystyki poprzez opcję\n"
       +"\"Raport szpiegowski\" w menu. Pamiętaj, że %s cię opuści\n"
       +"i jakikolwiek %s albo %s, którą niesie, może stracić!"
        
        #: src/gtk_client.c:2255
        msgid "Tip Off The Cops"
       t@@ -1852,7 +1859,10 @@ msgid ""
        "help the cops to attack that player, and then report back to you\n"
        "on the encounter. Remember that the %s will leave you temporarily,\n"
        "so any %s or %s that he's carrying may be lost!"
       -msgstr ""
       +msgstr "Wybierz gracza, na którego chcesz napuścić gliny. Twoja %s\n"
       +"pomoże gliniarzom zaatakować gracza i potem wróci, aby zdać raport\n"
       +"co się stało. Pamiętaj, że %s opuści cię tymczasowo, także\n"
       +"jakikolwiek %s albo %s, którą niesie, może stracić!"
        
        #: src/gtk_client.c:2297
        #, c-format
       t@@ -1864,11 +1874,12 @@ msgstr "Wyrzu
        msgid ""
        "Are you sure? (Any %s or %s carried\n"
        "by this %s may be lost!)"
       -msgstr ""
       +msgstr "Jesteś pewien? (%s albo %s niesiona\n"
       +"przez tą %s mogą być utracone!)"
        
        #: src/gtk_client.c:2318
        msgid "Name"
       -msgstr "Nick"
       +msgstr "Nazwa"
        
        #: src/gtk_client.c:2319
        msgid "Price"
       t@@ -1876,7 +1887,7 @@ msgstr "Cena"
        
        #: src/gtk_client.c:2320
        msgid "Number"
       -msgstr "Numer"
       +msgstr "Ilość"
        
        #: src/gtk_client.c:2322
        msgid "_Buy ->"
       t@@ -1923,7 +1934,9 @@ msgid ""
        "No GTK+ client available - rebuild the binary passing the\n"
        "--enable-gtk-client option to configure, or use the curses\n"
        "client (if available) instead!\n"
       -msgstr ""
       +msgstr "Klient GTK+ niedostępny - skompiluj grę dodając opcję\n"
       +"--enable-gtk-client do skryptu konfiguracyjnego, albo użyj\n"
       +"zamiast tego (jeżeli jest dostępny) klienta opartego na curses.\n"
        
        #: src/serverside.c:71
        #, c-format
       t@@ -1945,7 +1958,21 @@ msgid ""
        "\n"
        "Valid variables are listed below:-\n"
        "\n"
       -msgstr ""
       +msgstr "komendy i ustawienia serwera dopewars w wersji %s\n"
       +"\n"
       +"help                       Wyświetla ten ekran pomocy\n"
       +"list                       Listuje zalogowanych graczy\n"
       +"push <gracz>               Grzecznie prosi danego gracza o opuszczenie serwera\n"
       +"kill <gracz>               Natychmiast zrywa połączenie z danym graczem\n"
       +"msg:<wiadomość>            Wysyła wiadomość do wszystkich graczy\n"
       +"quit                       Wyjście po uprzednim poinformowaniu o tym graczy\n"
       +"<zmienna>=<wartość>        Ustawienie dla zmiennej podanej wartości\n"
       +"<zmienna>                  Wyświetlenie warotości danej zmiennej\n"
       +"<list>[x].<zmienna>=<war.> Ustawia zmiennej z listy o indeksie x, daną wartość\n"
       +"<list>[x].<zmienna>        Wyświetla wartość danej zmiennej z listy\n"
       +"\n"
       +"Prawidłowe zmienne są poniżej:-\n"
       +"\n"
        
        #: src/serverside.c:103
        msgid "cannot send data to metaserver\n"
       t@@ -1983,14 +2010,16 @@ msgstr "MaxClients (%d) przekoroczona warto
        msgid ""
        "Sorry, but this server has a limit of 1 player, which has been "
        "reached.^Please try connecting again later."
       -msgstr ""
       +msgstr "Przykro mi, ale serwer ma limit do 1 gracza, który został "
       +"osiągnięty. ^Proszę spróbować połączyć się później."
        
        #: src/serverside.c:277
        #, fuzzy, c-format
        msgid ""
        "Sorry, but this server has a limit of %d players, which has been "
        "reached.^Please try connecting again later."
       -msgstr ""
       +msgstr "Przykro mi, ale serwer ma limit % graczy, który został "
       +"osiągnięty.^Proszę spróbować połączyć się później."
        
        #: src/serverside.c:290
        #, c-format
       t@@ -2050,14 +2079,17 @@ msgid ""
        "Cannot open high score file %s.\n"
        "Either ensure you have permissions to access this file and directory, or\n"
        "specify an alternate high score file with the -f command line option."
       -msgstr ""
       +msgstr "Nie można otworzyć pliku z najlepszymi wynikami %s.\n"
       +"Upewnij się, że masz dostęp do pliku i katalogu, albo podaj nazwę\n"
       +"alternatywnego pliku poprzez opcję -f z linni poleceń." 
        
        #: 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 ""
       +msgstr "serwer dopewars w wersji %s gotowy i oczekuje połączeń"
       +"na porcie %d. Komendy serwera wyświetla się pisząc \"help\"\n"
        
        #: src/serverside.c:635
        msgid "Cannot install SIGUSR1 interrupt handler!"
       t@@ -2159,7 +2191,7 @@ msgstr "Tw
        #: src/serverside.c:1089
        #, c-format
        msgid " The lady next to you on the subway said,^ \"%s\"%s"
       -msgstr " Jakaś kobieta stojąca obok na dworcu powiedziała,^\"%s\"%s"
       +msgstr " Jakaś kobieta stojąca obok na dworcu powiedziała^\"%s\"%s"
        
        #: src/serverside.c:1092
        msgid "^    (at least, you -think- that's what she said)"
       t@@ -2224,14 +2256,12 @@ msgstr "%s: kablowanie %s zako
        #: src/serverside.c:1270
        #, c-format
        msgid "Following your tipoff, the cops ambushed %s, who was shot dead"
       -msgstr ""
       -"Dzięki twoim wskazówkom gliny zasadziły się na %s, który został zastrzelony"
       +msgstr "Dzięki twoim wskazówkom gliny zasadziły się na %s, który został zastrzelony"
        
        #: src/serverside.c:1274
        #, c-format
        msgid "Following your tipoff, the cops ambushed %s, who escaped with %d %s. "
       -msgstr ""
       -"Dzięki twoim wskazówkom gliny zasadziły się na %s, który uciekł z %d %s. "
       +msgstr "Dzięki twoim wskazówkom gliny zasadziły się na %s, który uciekł z %d %s. "
        
        #: src/serverside.c:1311
        msgid "^You stand there like an idiot."
       t@@ -2240,22 +2270,22 @@ msgstr "^Stoisz tam jak idiota."
        #: src/serverside.c:1315
        #, fuzzy
        msgid "^You lose him in the alleys."
       -msgstr ""
       +msgstr "^Udało ci się zgubić %s w ciemnych alejkach."
        
        #: src/serverside.c:1317
        #, fuzzy
        msgid "^You lose them in the alleys."
       -msgstr ""
       +msgstr "^Udało ci się ich zgubić w alejkach"
        
        #: src/serverside.c:1325
        #, fuzzy
        msgid "^You can't shake him, man!"
       -msgstr ""
       +msgstr "^Nie możesz zgubić %s, dresie!"
        
        #: src/serverside.c:1327
        #, fuzzy
        msgid "^You can't shake them, man!"
       -msgstr ""
       +msgstr "^Nie możesz ich zgubić, dresie!"
        
        #: src/serverside.c:1338
        #, c-format
       t@@ -2283,12 +2313,12 @@ msgstr "^Chybi
        #: src/serverside.c:1375
        #, fuzzy
        msgid "^He's firing on you, man! "
       -msgstr ""
       +msgstr "^On do ciebie strzela, człowieku! "
        
        #: src/serverside.c:1377
        #, fuzzy
        msgid "^They're firing on you, man! "
       -msgstr ""
       +msgstr "Strzelają do ciebie, dresie! "
        
        #: src/serverside.c:1380
        msgid "You've been hit! "
       t@@ -2297,12 +2327,12 @@ msgstr "Zosta
        #: src/serverside.c:1387
        #, fuzzy
        msgid "He wasted you, man! What a drag!"
       -msgstr ""
       +msgstr "Oszczędził cię! Ale zadyma!"
        
        #: src/serverside.c:1389
        #, fuzzy
        msgid "They wasted you, man! What a drag!"
       -msgstr ""
       +msgstr "Oszczędzili cię! Niezła zadyma!"
        
        #: src/serverside.c:1397
        #, c-format
       t@@ -2312,12 +2342,12 @@ msgstr "Straci
        #: src/serverside.c:1406
        #, fuzzy
        msgid "He missed!"
       -msgstr ""
       +msgstr "Chybił!"
        
        #: src/serverside.c:1408
        #, fuzzy
        msgid "They missed!"
       -msgstr ""
       +msgstr "Nie trafili!"
        
        #: src/serverside.c:1428
        msgid "You were mugged in the subway!"
       t@@ -2335,7 +2365,7 @@ msgstr "Spotka
        
        #: src/serverside.c:1451
        msgid "Sanitized away a RandomOffer"
       -msgstr ""
       +msgstr "Wyłączono RandomOffer"
        
        #: src/serverside.c:1456
        #, c-format
       t@@ -2555,7 +2585,10 @@ msgid ""
        "Be warned that different versions may not be fully compatible!\n"
        "Refer to the website at http://bellatrix.pcl.ox.ac.uk/~ben/dopewars/\n"
        "for the latest version."
       -msgstr ""
       +msgstr "Serwer jest w wersji %s, ale twój klient posiada wersję %s.\n"
       +"Zostałeś ostrzeżony, że te wersją nie muszą być w pełni kompatybilne!\n"
       +"Ze strony http://bellatrix.pcl.ox.ac.uk/~ben/dopewars/ możesz ściągnąć\n"
       +"najnowszą wersję."
        
        #: src/message.c:656
        msgid "Could not find host"
 (DIR) diff --git a/src/curses_client.c b/src/curses_client.c
       t@@ -1407,6 +1407,7 @@ static void Curses_DoGame(Player *Play) {
           print_status(Play,TRUE);
           display_message("");
        
       +   InitAbilities(Play);
           SendAbilities(Play);
           SetPlayerName(Play,buf);
           SendNullClientMessage(Play,C_NONE,C_NAME,NULL,buf);
 (DIR) diff --git a/src/dopewars.c b/src/dopewars.c
       t@@ -476,13 +476,14 @@ int brandom(int bot,int top) {
        
        int CountPlayers(GSList *First) {
        /* Returns the total numbers of players in the list starting at "First"; */
       -/* players still in the process of connecting or leaving are ignored.    */
       +/* players still in the process of connecting or leaving, and those that */
       +/* are actually cops (server-created internal AI players) are ignored.   */
           GSList *list;
           Player *Play;
           int count=0;
           for (list=First;list;list=g_slist_next(list)) {
              Play=(Player *)list->data;
       -      if (strlen(GetPlayerName(Play))>0) count++;
       +      if (strlen(GetPlayerName(Play))>0 && !Play->IsCop) count++;
           }
           return count;
        }
       t@@ -512,7 +513,6 @@ GSList *AddPlayer(int fd,Player *NewPlayer,GSList *First) {
           NewPlayer->Name=NULL;
           SetPlayerName(NewPlayer,NULL);
           NewPlayer->IsAt=0;
       -   NewPlayer->Attacked=NULL;
           NewPlayer->EventNum=E_NONE;
           NewPlayer->FightTimeout=NewPlayer->ConnectTimeout=NewPlayer->IdleTimeout=0;
           NewPlayer->Guns=(Inventory *)g_malloc0(NumGun*sizeof(Inventory));
       t@@ -523,15 +523,17 @@ GSList *AddPlayer(int fd,Player *NewPlayer,GSList *First) {
           NewPlayer->Cash=StartCash;
           NewPlayer->Debt=StartDebt;
           NewPlayer->Bank=0;
       -   NewPlayer->Health=100;
       -   NewPlayer->CoatSize=100;
           NewPlayer->Bitches.Carried=8;
       +   NewPlayer->IsCop=FALSE;
       +   NewPlayer->Health=MaxHealth(NewPlayer,NewPlayer->Bitches.Carried);
       +   NewPlayer->CoatSize=100;
           NewPlayer->Flags=0;
           NewPlayer->ReadBuf.Data=NewPlayer->WriteBuf.Data=NULL;
           NewPlayer->ReadBuf.Length=NewPlayer->WriteBuf.Length=0;
           NewPlayer->ReadBuf.DataPresent=NewPlayer->WriteBuf.DataPresent=0;
           InitAbilities(NewPlayer);
           if (Server) NewPlayer->fd=fd;
       +   NewPlayer->FightArray=NULL;
           return g_slist_append(First,(gpointer)NewPlayer);
        }
        
       t@@ -549,7 +551,7 @@ GSList *RemovePlayer(Player *Play,GSList *First) {
           g_assert(First);
        
           First=g_slist_remove(First,(gpointer)Play);
       -   if (Server && Play->fd>=0) {
       +   if (Server && !Play->IsCop && Play->fd>=0) {
              CloseSocket(Play->fd);
           }
           ClearList(&(Play->SpyList));
       t@@ -580,6 +582,13 @@ void CopyPlayer(Player *Dest,Player *Src) {
           Dest->Flags=Src->Flags;
        }
        
       +int MaxHealth(Player *Play,int NumBitches) {
       +   if (Play->IsCop)
       +      return (5+NumBitches*2);
       +   else
       +      return (80+NumBitches*20);
       +}
       +
        char *GetPlayerName(Player *Play) {
           if (Play->Name) return Play->Name;
           else return "";
       t@@ -613,7 +622,7 @@ Player *GetPlayerByName(char *Name,GSList *First) {
           if (Name==NULL || Name[0]==0) return &Noone;
           for (list=First;list;list=g_slist_next(list)) {
              Play=(Player *)list->data;
       -      if (strcmp(GetPlayerName(Play),Name)==0) return Play;
       +      if (!Play->IsCop && strcmp(GetPlayerName(Play),Name)==0) return Play;
           }
           return NULL;
        }
 (DIR) diff --git a/src/dopewars.h b/src/dopewars.h
       t@@ -72,7 +72,8 @@ typedef long long price_t;
        
        #define A_PLAYERID      0
        #define A_DRUGVALUE     1
       -#define A_NUM           2
       +#define A_NEWFIGHT      2
       +#define A_NUM           3
        typedef struct ABILITIES {
           gboolean Local[A_NUM];
           gboolean Remote[A_NUM];
       t@@ -188,10 +189,6 @@ extern int NumTurns;
        #define SELECTTIP   2
        #define SELECTSPY   3
        
       -#define F_STAND     0
       -#define F_FIGHT     1
       -#define F_RUN       2
       -
        #define E_NONE       0
        #define E_SUBWAY     1
        #define E_OFFOBJECT  2
       t@@ -208,13 +205,10 @@ extern int NumTurns;
        #define E_FINISH     100
        
        #define E_OUTOFSYNC  120
       -#define E_ATTACK     121
       -#define E_WAITATTACK 122
       -#define E_FREEFORALL 123
       -#define E_DEFEND     124
       -#define E_COPS       125
       -#define E_DOCTOR     126
       -#define E_MAXOOS     127
       +#define E_FIGHT      121
       +#define E_FIGHTASK   122
       +#define E_DOCTOR     123
       +#define E_MAXOOS     124
        
        struct GUN {
           gchar *Name;
       t@@ -291,13 +285,14 @@ struct PLAYER_T {
           Inventory *Guns,*Drugs,Bitches;
           int fd;
           int EventNum,ResyncNum;
       -   int Cops;
           time_t FightTimeout,IdleTimeout,ConnectTimeout;
           price_t DocPrice;
           DopeList SpyList,TipList;
       -   Player *OnBehalfOf,*Attacked;
       +   Player *OnBehalfOf;
           ConnBuf ReadBuf,WriteBuf;
           Abilities Abil;
       +   GPtrArray *FightArray;
       +   gboolean IsCop;
        };
        
        #define CM_SERVER 0
       t@@ -342,6 +337,7 @@ int CountPlayers(GSList *First);
        GSList *AddPlayer(int fd,Player *NewPlayer,GSList *First);
        void UpdatePlayer(Player *Play);
        void CopyPlayer(Player *Dest,Player *Src);
       +int MaxHealth(Player *Play,int NumBitches);
        void ClearInventory(Inventory *Guns,Inventory *Drugs);
        int IsCarryingRandom(Player *Play,int amount);
        void ChangeSpaceForInventory(Inventory *Guns,Inventory *Drugs,
 (DIR) diff --git a/src/gtk_client.c b/src/gtk_client.c
       t@@ -306,7 +306,8 @@ void HandleClientMessage(char *pt,Player *Play) {
                 if (strcmp(Data,"end")==0) EndGame();
                 break;
              case C_PRINTMESSAGE:
       -         PrintMessage(Data); break;
       +         PrintMessage(Data);
       +         break;
              case C_FIGHTPRINT:
                 DisplayFightMessage(Data); break;
              case C_PUSH:
       t@@ -349,7 +350,8 @@ void HandleClientMessage(char *pt,Player *Play) {
                 }
                 break;
              case C_QUESTION:
       -         QuestionDialog(Data,From==&Noone ? NULL : From); break;
       +         QuestionDialog(Data,From==&Noone ? NULL : From);
       +         break;
              case C_SUBWAYFLASH:
                 DisplayFightMessage(NULL);
                 for (list=FirstClient;list;list=g_slist_next(list)) {
       t@@ -1342,6 +1344,7 @@ char GtkLoop(int *argc,char **argv[],char ReturnOnFail) {
           gchar *buf;
           gint nmenu_items = sizeof(menu_items) / sizeof(menu_items[0]);
        
       +   gtk_set_locale();
           if (ReturnOnFail && !gtk_init_check(argc,argv)) return FALSE;
           else if (!ReturnOnFail) gtk_init(argc,argv);
        
       t@@ -1486,7 +1489,7 @@ _("Based on John E. Dell's old Drug Wars game, dopewars is a simulation of an\n"
        
           label=gtk_label_new(
        _("\nFor information on the command line options, type dopewars -h at your\n"
       -"Unix prompt. This will display a help screen, listing the available"
       +"Unix prompt. This will display a help screen, listing the available "
        "options."));
           gtk_box_pack_start(GTK_BOX(vbox),label,FALSE,FALSE,0);
        
 (DIR) diff --git a/src/message.c b/src/message.c
       t@@ -172,6 +172,7 @@ void SendServerMessage(Player *From,char AICode,char Code,
        /* code "AICode", human-readable code "Code" and data "Data", claiming    */
        /* to be from player "From"                                               */
           GString *text;
       +   if (To->IsCop) return;
           text=g_string_new(NULL);
           if (HaveAbility(To,A_PLAYERID)) {
              if (From) g_string_sprintfa(text,"%d",From->ID);
       t@@ -928,3 +929,199 @@ void ReadMetaServerData(int HttpSock) {
              }
           }
        }
       +
       +void SendFightReload(Player *To) {
       +   SendFightMessage(To,NULL,0,F_RELOAD,FALSE,FALSE,NULL);
       +}
       +
       +void SendOldCanFireMessage(Player *To,GString *text) {
       +   if (To->EventNum==E_FIGHT) {
       +      To->EventNum=E_FIGHTASK;
       +      if (CanRunHere(To) && !HaveAbility(To,A_NEWFIGHT)) {
       +         if (text->len>0) g_string_append_c(text,'^');
       +         if (TotalGunsCarried(To)==0) {
       +            g_string_prepend(text,"YN^");
       +            g_string_append(text,_("Do you run?"));
       +         } else {
       +            g_string_prepend(text,"RF^");
       +            g_string_append(text,_("Do you run, or fight?"));
       +         }
       +         SendQuestion(NULL,C_NONE,To,text->str);
       +      } else {
       +         SendOldFightPrint(To,text,FALSE);
       +      }
       +   }
       +}
       +
       +void SendOldFightPrint(Player *To,GString *text,gboolean FightOver) {
       +   gboolean Fighting,CanShoot;
       +
       +   Fighting=!FightOver;
       +   CanShoot=CanPlayerFire(To);
       +
       +   To->Flags &= ~(CANSHOOT+FIGHTING);
       +   if (Fighting) To->Flags |= FIGHTING;
       +   if (Fighting && CanShoot) To->Flags |= CANSHOOT;
       +   SendPlayerData(To);
       +   To->Flags &= ~(CANSHOOT+FIGHTING);
       +
       +   SendServerMessage(NULL,C_NONE,C_FIGHTPRINT,To,text->str);
       +}
       +
       +void SendFightLeave(Player *Play,gboolean FightOver) {
       +   SendFightMessage(Play,NULL,0,FightOver ? F_LASTLEAVE : F_LEAVE,
       +                    FALSE,TRUE,NULL);
       +}
       +
       +void ReceiveFightMessage(gchar *Data,gchar **AttackName,gchar **DefendName,
       +                         int *BitchesKilled,gchar *FightPoint,gboolean *Loot) {
       +}
       +
       +void SendFightMessage(Player *Attacker,Player *Defender,
       +                      int BitchesKilled,gchar FightPoint,
       +                      gboolean Loot,gboolean Broadcast,gchar *Msg) {
       +   int ArrayInd,ArmPercent,Damage,MaxDamage,i;
       +   Player *To;
       +   GString *text;
       +
       +   if (!Attacker->FightArray) return;
       +
       +   MaxDamage=Damage=0;
       +   for (i=0;i<NumGun;i++) {
       +      if (Gun[i].Damage>MaxDamage) MaxDamage=Gun[i].Damage;
       +      Damage+=Gun[i].Damage*Attacker->Guns[i].Carried;
       +   }
       +   MaxDamage *= (Attacker->Bitches.Carried+2);
       +   ArmPercent = Damage*100/MaxDamage;
       +
       +   text=g_string_new("");
       +
       +   for (ArrayInd=0;ArrayInd<Attacker->FightArray->len;ArrayInd++) {
       +      To=(Player *)g_ptr_array_index(Attacker->FightArray,ArrayInd);
       +      if (!Broadcast && To!=Attacker) continue;
       +      g_string_truncate(text,0);
       +      if (HaveAbility(To,A_NEWFIGHT)) {
       +         g_string_sprintf(text,"%s^%s^%d^%d^%d^%d^%c%c%c%c^",
       +                          Attacker==To ? "" : GetPlayerName(Attacker),
       +                          (Defender==To || Defender==NULL)
       +                                       ? "" : GetPlayerName(Defender),
       +                          Defender ? Defender->Health : 0,
       +                          Defender ? Defender->Bitches.Carried : 0,
       +                          BitchesKilled,ArmPercent,
       +                          FightPoint,CanRunHere(To) ? '1' : '0',
       +                          Loot ? '1' : '0',
       +                          FightPoint!=F_ARRIVED &&
       +                                 CanPlayerFire(To) ? '1' : '0');
       +      }
       +      if (Msg) {
       +         g_string_append(text,Msg);
       +      } else {
       +         FormatFightMessage(To,text,Attacker==To ? "" : GetPlayerName(Attacker),
       +                            (Defender==To || Defender==NULL)
       +                                         ? "" : GetPlayerName(Defender),
       +                            Defender ? Defender->Health : 0,
       +                            Defender ? Defender->Bitches.Carried : 0,
       +                            BitchesKilled,ArmPercent,FightPoint,Loot);
       +      }
       +      if (HaveAbility(To,A_NEWFIGHT)) {
       +         SendServerMessage(NULL,C_NONE,C_FIGHTPRINT,To,text->str);
       +      } else if (CanRunHere(To)) {
       +         if (FightPoint!=F_ARRIVED && FightPoint!=F_MSG &&
       +             FightPoint!=F_LASTLEAVE && 
       +             (FightPoint!=F_LEAVE || Attacker!=To) &&
       +             CanPlayerFire(To) && To->EventNum==E_FIGHT) {
       +            SendOldCanFireMessage(To,text);
       +         } else if (text->len>0) SendPrintMessage(NULL,C_NONE,To,text->str);
       +      } else {
       +         SendOldFightPrint(To,text,FightPoint==F_LASTLEAVE);
       +      }
       +   }
       +   g_string_free(text,TRUE);
       +}
       +
       +void FormatFightMessage(Player *To,GString *text,
       +                        gchar *AttackName,gchar *DefendName,int Health,
       +                        int Bitches,int BitchesKilled,int ArmPercent,
       +                        gchar FightPoint,gboolean Loot) {
       +   gchar *Armament;
       +   switch(FightPoint) {
       +      case F_ARRIVED:
       +         Armament= ArmPercent<10 ? _("pitifully armed")       :
       +                   ArmPercent<25 ? _("lightly armed")         :
       +                   ArmPercent<60 ? _("moderately well armed") :
       +                   ArmPercent<80 ? _("heavily armed")         :
       +                                   _("armed to the teeth");
       +         if (DefendName[0]) {
       +            g_string_sprintfa(text,_("%s arrives with %d %s, %s!"),
       +                              DefendName,Bitches,Names.Bitches,Armament);
       +         }
       +         break;
       +      case F_STAND:
       +         if (AttackName[0]) {
       +            g_string_sprintfa(text,_("%s stands and takes it"),AttackName);
       +         } else {
       +            g_string_append(text,_("You stand there like a dummy."));
       +         }
       +         break;
       +      case F_LEAVE: case F_LASTLEAVE:
       +         if (AttackName[0]) {
       +            g_string_sprintfa(text,_("%s has got away!"),AttackName);
       +         } else {
       +            g_string_sprintfa(text,_("You got away!"));
       +         }
       +         break;
       +      case F_RELOAD:
       +         if (!AttackName[0]) {
       +            g_string_append(text,_("Guns reloaded..."));
       +         }
       +         break;
       +      case F_MISS:
       +         if (AttackName[0] && DefendName[0]) {
       +            g_string_sprintfa(text,_("%s shoots at %s... and misses!"),
       +                              AttackName,DefendName);
       +         } else if (AttackName[0]) {
       +            g_string_sprintfa(text,_("%s shoots at you... and misses!"),
       +                              AttackName);
       +         } else if (DefendName[0]) {
       +            g_string_sprintfa(text,_("You missed %s!"),DefendName);
       +         }
       +         break;
       +      case F_HIT:
       +         if (AttackName[0] && DefendName[0]) {
       +            if (Health==0 && Bitches==0) {
       +               g_string_sprintfa(text,_("%s shoots %s dead."),
       +                                 AttackName,DefendName);
       +            } else if (BitchesKilled) {
       +               g_string_sprintfa(text,_("%s shoots at %s and kills a %s!"),
       +                                 AttackName,DefendName,Names.Bitch);
       +             } else {
       +               g_string_sprintfa(text,_("%s shoots at %s."),
       +                                 AttackName,DefendName);
       +            }
       +         } else if (AttackName[0]) {
       +            if (Health==0 && Bitches==0) {
       +               g_string_sprintfa(text,_("%s wasted you, man! What a drag!"),
       +                                 AttackName);
       +            } else if (BitchesKilled) {
       +               g_string_sprintfa(text,_("%s shoots at you... and kills a %s!"),
       +                                 AttackName,Names.Bitch);
       +            } else {
       +               g_string_sprintfa(text,_("%s hits you, man!"),AttackName);
       +            }
       +         } else if (DefendName[0]) {
       +            if (Health==0 && Bitches==0) {
       +               g_string_sprintfa(text,_("You killed %s!"),DefendName);
       +            } else if (BitchesKilled) {
       +               g_string_sprintfa(text,_("You hit %s, and killed a %s!"),
       +                                 DefendName,Names.Bitch);
       +            } else {
       +               g_string_sprintfa(text,_("You hit %s!"),DefendName);
       +            }
       +            if (Loot) {
       +               g_string_append(text,_(" You loot the body!"));
       +            }
       +         }
       +         if (Health>0) g_string_sprintfa(text,_(" (Health: %d)"),Health);
       +         break;
       +   }
       +}
 (DIR) diff --git a/src/message.h b/src/message.h
       t@@ -72,6 +72,10 @@
        #define C_CHANGEDISP   'p'
        #define C_NETMESSAGE   'q'
        #define C_ABILITIES    'r'
       +#define C_FIGHTARRIVE  's'
       +#define C_FIGHTSHOOT   't'
       +#define C_FIGHTLEAVE   'u'
       +#define C_FIGHTRELOAD  'v'
        
        #define C_NONE        'A'
        #define C_ASKLOAN     'B'
       t@@ -85,13 +89,23 @@
        #define C_ASKRUNFIGHT 'J'
        #define C_ASKSEW      'K'
        #define C_MEETPLAYER  'L'
       -#define C_COPSDONE    'M'
       +#define C_FIGHT       'M'
       +#define C_FIGHTDONE   'N'
        
        #define DT_LOCATION    'A'
        #define DT_DRUG        'B'
        #define DT_GUN         'C'
        #define DT_PRICES      'D'
        
       +#define F_ARRIVED      'A'
       +#define F_STAND        'S'
       +#define F_HIT          'H'
       +#define F_MISS         'M'
       +#define F_RELOAD       'R'
       +#define F_LEAVE        'L'
       +#define F_LASTLEAVE    'D'
       +#define F_MSG          'G'
       +
        void SendClientMessage(Player *From,char AICode,char Code,
                               Player *To,char *Data);
        void SendNullClientMessage(Player *From,char AICode,char Code,
       t@@ -151,5 +165,17 @@ void SendAbilities(Player *Play);
        void ReceiveAbilities(Player *Play,gchar *Data);
        void CombineAbilities(Player *Play);
        gboolean HaveAbility(Player *Play,gint Type);
       -
       +void SendFightReload(Player *To);
       +void SendOldCanFireMessage(Player *To,GString *text);
       +void SendOldFightPrint(Player *To,GString *text,gboolean FightOver);
       +void SendFightLeave(Player *Play,gboolean FightOver);
       +void ReceiveFightMessage(gchar *Data,gchar **AttackName,gchar **DefendName,
       +                         int *BitchesKilled,gchar *FightPoint,gboolean *Loot);
       +void SendFightMessage(Player *Attacker,Player *Defender,
       +                      int BitchesKilled,gchar FightPoint,
       +                      gboolean Loot,gboolean Broadcast,gchar *Msg);
       +void FormatFightMessage(Player *To,GString *text,
       +                        gchar *AttackName,gchar *DefendName,int Health,
       +                        int Bitches,int BitchesKilled,int ArmPercent,
       +                        gchar FightPoint,gboolean Loot);
        #endif
 (DIR) diff --git a/src/serverside.c b/src/serverside.c
       t@@ -1,5 +1,5 @@
        /* serverside.c   Handles the server side of dopewars                   */
       -/* copyright (c)  1998-2000  ben webb                                   */
       +/* Copyright (c)  1998-2000  Ben Webb                                   */
        /*                Email: ben@bellatrix.pcl.ox.ac.uk                     */
        /*                WWW: http://bellatrix.pcl.ox.ac.uk/~ben/dopewars/     */
        
       t@@ -248,7 +248,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) SendPlayerDetails(pt,Play,C_LIST);
       +                  if (pt!=Play && !pt->IsCop) SendPlayerDetails(pt,Play,C_LIST);
                       }
                       SendServerMessage(NULL,C_NONE,C_ENDLIST,Play,NULL);
                       RegisterWithMetaServer(TRUE,FALSE);
       t@@ -297,9 +297,9 @@ void HandleServerMessage(gchar *buf,Player *Play) {
                 break;
              case C_REQUESTJET:
                 i=atoi(Data);
       -         if (Play->EventNum==E_ATTACK || Play->EventNum==E_DEFEND ||
       -             Play->EventNum==E_WAITATTACK || Play->EventNum==E_FREEFORALL) {
       -             BreakoffCombat(Play,FALSE);
       +         if (Play->EventNum==E_FIGHT || Play->EventNum==E_FIGHTASK) {
       +            if (CanRunHere(Play)) break;
       +            else RunFromCombat(Play);
                 }
                 if (NumTurns>0 && Play->Turn>=NumTurns && Play->EventNum!=E_FINISH) {
                    FinishGame(Play,_("Your dealing time is up..."));
       t@@ -347,19 +347,7 @@ void HandleServerMessage(gchar *buf,Player *Play) {
                 BuyObject(Play,Data);
                 break;
              case C_FIGHTACT:
       -         if (Play->EventNum==E_ATTACK || Play->EventNum==E_FREEFORALL) {
       -            AttackPlayer(Play,Play->Attacked,
       -               TotalGunsCarried(Play)>0 ? AT_SHOOT : 0);
       -         } else if (Play->EventNum==E_DEFEND) {
       -            for (list=FirstServer;list;list=g_slist_next(list)) {
       -               tmp=(Player *)list->data;
       -               if ((tmp->EventNum==E_FREEFORALL || tmp->EventNum==E_WAITATTACK) 
       -                   && tmp->Attacked==Play) {
       -                  AttackPlayer(Play,tmp,
       -                               TotalGunsCarried(Play)>0 ? AT_SHOOT : 0);
       -               }
       -            }
       -         }
       +         if (Data[0]=='F') Fire(Play); else RunFromCombat(Play);
                 break;
              case C_ANSWER:
                 HandleAnswer(Play,To,Data);
       t@@ -417,9 +405,8 @@ void ClientLeftServer(Player *Play) {
        /* cleans up after them if necessary.                            */
           Player *tmp;
           GSList *list;
       -   if (Play->EventNum==E_ATTACK || Play->EventNum==E_DEFEND ||
       -       Play->EventNum==E_WAITATTACK || Play->EventNum==E_FREEFORALL) {
       -      BreakoffCombat(Play,TRUE);
       +   if (Play->EventNum==E_FIGHT || Play->EventNum==E_FIGHTASK) {
       +      WithdrawFromCombat(Play);
           }
           for (list=FirstServer;list;list=g_slist_next(list)) {
              tmp=(Player *)list->data;
       t@@ -766,7 +753,7 @@ void ServerLoop() {
              topsock=ListenSock+1;
              for (list=FirstServer;list;list=g_slist_next(list)) {
                 tmp=(Player *)list->data;
       -         if (tmp->fd>0) {
       +         if (!tmp->IsCop && tmp->fd>0) {
                    FD_SET(tmp->fd,&readfs);
                    if (tmp->WriteBuf.DataPresent) FD_SET(tmp->fd,&writefs);
                    FD_SET(tmp->fd,&errorfs);
       t@@ -1155,7 +1142,7 @@ void SendEvent(Player *To) {
                          text=g_strdup_printf(_("AE^%s is already here!^"
                                                 "Do you Attack, or Evade?"),
                                               GetPlayerName(Play));
       -                  To->Attacked=Play;
       +                  To->OnBehalfOf=Play;
                          SendDrugsHere(To,TRUE);
                          SendQuestion(NULL,C_MEETPLAYER,To,text);
                          g_free(text);
       t@@ -1188,231 +1175,279 @@ int SendCopOffer(Player *To,char Force) {
           } else if (i<50) { return(RandomOffer(To));
           } else if (Sanitized) { return 0;
           } else {
       -      StartOfficerHardass(To,To->EventNum+1,NULL,NULL);
       +      CopsAttackPlayer(To);
       +      return 1;
           }
           return 1;
        }
        
       -void StartOfficerHardass(Player *Play,int ResyncNum,
       -                         char *LoneMessage,char *DeputyMessage) {
       -/* Starts combat between player "Play" and the cops. "ResyncNum" is */
       -/* the event number to be returned to after combat is complete.     */
       -/* "LoneMessage" and "DeputyMessage" are the format strings passed  */
       -/* to OfficerHardass if they are non-NULL.                          */
       -   price_t Money;
       -   if (!Play) return;
       -   Money=Play->Cash+Play->Bank-Play->Debt;
       -   if (Money>3000000) Play->Cops=brandom(11,27);
       -   else if (Money>1000000) Play->Cops=brandom(7,14);
       -   else if (Money>500000) Play->Cops=brandom(6,12);
       -   else if (Money>100000) Play->Cops=brandom(2,8);
       -   else Play->Cops=brandom(1,5);
       -
       -   Play->ResyncNum=ResyncNum;
       -   Play->EventNum=E_COPS;
       -   if (Play->ResyncNum==E_MAX || Play->ResyncNum==E_NONE) {
       -      SendServerMessage(NULL,C_NONE,C_CHANGEDISP,Play,"N");
       -   }
       -   OfficerHardass(Play,LoneMessage,DeputyMessage);
       +void CopsAttackPlayer(Player *Play) {
       +/* Has the cops attack player "Play"                                */
       +   Player *Cops;
       +   Cops=g_new(Player,1);
       +   FirstServer=AddPlayer(0,Cops,FirstServer);
       +   SetPlayerName(Cops,"Officer Hardass");
       +   Cops->IsCop=TRUE;
       +   Cops->Cash=Cops->Debt=0;
       +
       +   Cops->Bitches.Carried=10;
       +   Cops->Guns[0].Carried=5;
       +   Cops->Health=MaxHealth(Cops,Cops->Bitches.Carried);
       +
       +   Play->EventNum++;
       +   AttackPlayer(Cops,Play);
        }
        
       -void OfficerHardass(Player *Play,char *LoneMessage,char *DeputyMessage) {
       -/* Send client "Play" a message announcing the attack of the cops */
       -/* 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)      */
       -   char LoneDefault[] = { N_("YN^Officer %s is chasing you!") };
       -   char DeputyDefault[] = { 
       -      N_("YN^Officer %s and %d of his deputies are chasing you!")
       -   };
       -   char *OfficerName;
       -   GString *text;
       -   
       -   if (!Play || Play->EventNum!=E_COPS) return;
       -   if (Play->Cops==0) { 
       -      Play->EventNum=Play->ResyncNum; SendEvent(Play); return; 
       +void AttackPlayer(Player *Play,Player *Attacked) {
       +/* Starts combat between player "Play" and player "Attacked"; if    */
       +/* either player is currently engaged in combat, add the other      */
       +/* player to the existing combat. If neither player is currently    */
       +/* fighting, start a new combat between them. Either player can be  */
       +/* the cops.                                                        */
       +   GPtrArray *FightArray;
       +   g_assert(Play && Attacked);
       +
       +   if (Play->FightArray && Attacked->FightArray) {
       +      if (Play->FightArray==Attacked->FightArray) {
       +         g_warning("Players are already in a fight!");
       +      } else {
       +         g_warning("Players are already in separate fights!");
       +      }
       +      return;
           }
       -   text=g_string_new(NULL);
       -   OfficerName=(Play->Flags&DEADHARDASS ? Names.ReserveOfficer : 
       -                                          Names.Officer);
       -   if (Play->Cops==1) {
       -      g_string_sprintf(text,LoneMessage ? LoneMessage : _(LoneDefault),
       -                       OfficerName);
       +
       +   if (Play->FightArray) {
       +      FightArray=Play->FightArray;
       +      AddPlayerToFight(Attacked,FightArray,Play);
       +   } else if (Attacked->FightArray) {
       +      FightArray=Attacked->FightArray;
       +      AddPlayerToFight(Play,FightArray,Attacked);
           } else {
       -      g_string_sprintf(text,DeputyMessage ? DeputyMessage : _(DeputyDefault),
       -                       OfficerName, Play->Cops - 1);
       +      FightArray=g_ptr_array_new();
       +      AddPlayerToFight(Attacked,FightArray,Play);
       +      AddPlayerToFight(Play,FightArray,Attacked);
           }
       -   SendPlayerData(Play);
       -   if (TotalGunsCarried(Play)==0) {
       -      g_string_append(text,_("^Do you run?"));
       -      SendQuestion(NULL,C_ASKRUN,Play,text->str);
       +   
       +   Fire(Play);
       +}
       +
       +void AddPlayerToFight(Player *NewPlay,GPtrArray *Fight,Player *Other) {
       +/* Adds the player "NewPlay" to the fight "Fight", and informs any      */
       +/* players already in the fight of the new player's arrival. "Other" is */
       +/* a player already in the fight                                        */
       +   NewPlay->FightArray=Fight;
       +   NewPlay->ResyncNum=NewPlay->EventNum;
       +   NewPlay->EventNum=E_FIGHT;
       +
       +   g_ptr_array_add(Fight,NewPlay);
       +   SendFightMessage(NewPlay,Other,0,F_ARRIVED,FALSE,TRUE,NULL);
       +}
       +
       +gboolean IsOpponent(Player *Play,Player *Other) {
       +/* Returns TRUE if player "Other" is not allied with player "Play"  */
       +   return TRUE;
       +}
       +
       +void HandleDamage(Player *Defend,Player *Attack,int Damage,
       +                  int *BitchesKilled,gboolean *Loot) {
       +   Inventory *Guns,*Drugs;
       +   price_t Bounty;
       +
       +   Guns=(Inventory *)g_malloc0(sizeof(Inventory)*NumGun);
       +   Drugs=(Inventory *)g_malloc0(sizeof(Inventory)*NumDrug);
       +   ClearInventory(Guns,Drugs);
       +
       +   Bounty=0;
       +   if (Defend->Health<=Damage && Defend->Bitches.Carried==0) {
       +      Bounty=Defend->Cash+Defend->Bank-Defend->Debt;
       +      AddInventory(Guns,Defend->Guns,NumGun);
       +      AddInventory(Drugs,Defend->Drugs,NumDrug);
       +      Defend->Health=0;
       +   } else if (Defend->Bitches.Carried>0 &&
       +              Defend->Health-Damage <=
       +              MaxHealth(Defend,Defend->Bitches.Carried-1)) {
       +      LoseBitch(Defend,Guns,Drugs);
       +      Defend->Health=MaxHealth(Defend,Defend->Bitches.Carried);
       +      *BitchesKilled=1;
           } else {
       -      g_string_append(text,_("^Do you Run, or Fight?"));
       -      if (strlen(text->str)>=2) {
       -         text->str[0]='R'; text->str[1]='F';
       -      }
       -      SendQuestion(NULL,C_ASKRUNFIGHT,Play,text->str);
       +      Defend->Health-=Damage;
           }
       -   g_string_free(text,TRUE);
       +   SendPlayerData(Defend);
       +   if (Bounty<0) Bounty=0;
       +   TruncateInventoryFor(Guns,Drugs,Attack);
       +   if (!IsInventoryClear(Guns,Drugs)) {
       +      AddInventory(Attack->Guns,Guns,NumGun);
       +      AddInventory(Attack->Drugs,Drugs,NumDrug);
       +      ChangeSpaceForInventory(Guns,Drugs,Attack);
       +   }
       +   Attack->Cash+=Bounty;
       +   if (Bounty>0 || !IsInventoryClear(Guns,Drugs)) {
       +      *Loot=TRUE;
       +      SendPlayerData(Attack);
       +   }
       +   g_free(Guns); g_free(Drugs);
        }
        
       -void FinishFightWithHardass(Player *Play,char *Message) {
       -/* Clean up after a fight between "Play" and the cops. If the cops were */
       -/* tipped off by another player, inform them of the results.            */
       -/* If the player died, pass "Message" to the FinishGame subroutine.     */
       -   GString *text;
       -   if (g_slist_find(FirstServer,(gpointer)Play->OnBehalfOf)) {
       -      g_message(_("%s: tipoff by %s finished OK."),GetPlayerName(Play),
       -                GetPlayerName(Play->OnBehalfOf));
       -      RemoveListPlayer(&(Play->TipList),Play->OnBehalfOf);
       -      text=g_string_new(NULL);
       -      if (Play->Health==0) {
       -         g_string_sprintf(text,
       -           _("Following your tipoff, the cops ambushed %s, who was shot dead"),
       -           GetPlayerName(Play));
       -      } else {
       -         g_string_sprintf(text,
       -                _("Following your tipoff, the cops ambushed %s, who escaped "
       -                "with %d %s. "),GetPlayerName(Play),
       -                Play->Bitches.Carried,Names.Bitches);
       +void GetFightRatings(Player *Attack,Player *Defend,
       +                     int *AttackRating,int *DefendRating) {
       +   int i;
       +
       +/* Base values */
       +   *AttackRating=80;
       +   *DefendRating=100;
       +
       +   for (i=0;i<NumGun;i++) {
       +      *AttackRating+=Gun[i].Damage*Attack->Guns[i].Carried;
       +   }
       +   if (Attack->IsCop) *AttackRating-=30;
       +
       +   *DefendRating-=5*Defend->Bitches.Carried;
       +   if (Defend->IsCop) *DefendRating-=30;
       +
       +   *DefendRating=MAX(*DefendRating,10);
       +   *AttackRating=MAX(*AttackRating,10);
       +}
       +
       +void AllowNextShooter(Player *Play) {
       +   Player *NextShooter;
       +   if (FightTimeout) {
       +      NextShooter=GetNextShooter(Play);
       +      if (NextShooter) NextShooter->FightTimeout=time(NULL);
       +   }
       +}
       +
       +void DoReturnFire(Player *Play) {
       +   int ArrayInd;
       +   Player *Defend;
       +
       +   if (!Play || !Play->FightArray) return;
       +
       +   if (FightTimeout!=0 || !Play->IsCop) {
       +      for (ArrayInd=0;ArrayInd<Play->FightArray->len;ArrayInd++) {
       +         Defend=(Player *)g_ptr_array_index(Play->FightArray,ArrayInd);
       +         if (Defend->IsCop && CanPlayerFire(Defend)) Fire(Defend);
              }
       -      GainBitch(Play->OnBehalfOf);
       -      SendPlayerData(Play->OnBehalfOf);
       -      SendPrintMessage(NULL,C_NONE,Play->OnBehalfOf,text->str);
       -      g_string_free(text,TRUE);
           }
       -   Play->OnBehalfOf=NULL;
       -   if (Play->Health==0) FinishGame(Play,Message);
       -   else {
       -      Play->EventNum=Play->ResyncNum; 
       -      if (Play->ResyncNum==E_MAX || Play->ResyncNum==E_NONE) {
       -         SendServerMessage(NULL,C_NONE,C_CHANGEDISP,Play,"Y");
       +}
       +
       +void RunFromCombat(Player *Play) {
       +/* Withdraws player "Play" from combat, and levies any penalties on */
       +/* the player for this cowardly act, if applicable                  */
       +   int EscapeProb,RandNum;
       +
       +   EscapeProb=50;
       +   RandNum=brandom(0,100);
       +
       +   if (RandNum<EscapeProb) {
       +      WithdrawFromCombat(Play);
       +      Play->EventNum=Play->ResyncNum; SendEvent(Play);
       +   } else {
       +      SendFightMessage(Play,NULL,0,F_MSG,FALSE,FALSE,"You can't get away!");
       +      AllowNextShooter(Play);
       +      DoReturnFire(Play);
       +   }
       +}
       +
       +void Fire(Player *Play) {
       +/* Fires all weapons of player "Play" at all opponents, and resets  */
       +/* the fight timeout (the reload time)                              */
       +   int Damage,ArrayInd,i,j;
       +   int AttackRating,DefendRating;
       +   int BitchesKilled;
       +   gboolean Loot;
       +   gchar FightPoint;
       +   Player *Defend;
       +
       +   if (!Play->FightArray) return;
       +   if (!CanPlayerFire(Play)) return;
       +
       +   AllowNextShooter(Play);
       +   if (FightTimeout) SetFightTimeout(Play);
       +
       +   for (ArrayInd=0;ArrayInd<Play->FightArray->len;ArrayInd++) {
       +      Defend=(Player *)g_ptr_array_index(Play->FightArray,ArrayInd);
       +
       +      if (Defend && Defend!=Play && IsOpponent(Play,Defend)) {
       +         Damage=0; BitchesKilled=0; Loot=FALSE;
       +         if (TotalGunsCarried(Play)>0) {
       +            GetFightRatings(Play,Defend,&AttackRating,&DefendRating);
       +            if (brandom(0,AttackRating)>brandom(0,DefendRating)) {
       +               FightPoint=F_HIT;
       +               for (i=0;i<NumGun;i++) for (j=0;j<Play->Guns[i].Carried;j++) {
       +                  Damage+=brandom(0,Gun[i].Damage);
       +               }
       +               if (Damage==0) Damage=1;
       +               HandleDamage(Defend,Play,Damage,&BitchesKilled,&Loot);
       +            } else FightPoint=F_MISS;
       +         } else FightPoint=F_STAND;
       +         SendFightMessage(Play,Defend,BitchesKilled,FightPoint,Loot,TRUE,NULL);
              }
       -      SendEvent(Play);
           }
       +   DoReturnFire(Play);
        }
        
       -void FireAtHardass(Player *Play,char FireType) {
       -/* Have player "Play" attack the cops.                   */
       -/* FireType is F_STAND: Player has no gun and didn't run */
       -/*             F_RUN:   Player chose to run              */
       -/*             F_FIGHT: Player chose to fire back        */
       -   int Damage,i,j;
       -   char *OfficerName;
       -   gchar *prstr;
       -   GString *text;
       +gboolean CanPlayerFire(Player *Play) {
       +   return (FightTimeout==0 || Play->FightTimeout==0 ||
       +           Play->FightTimeout<=time(NULL));
       +}
        
       -   if (!Play || Play->EventNum!=E_COPS) return;
       -   if (Play->Cops==0) { FinishFightWithHardass(Play,NULL); return; }
       -   
       -   text=g_string_new("^");
       -   OfficerName=(Play->Flags&DEADHARDASS ? Names.ReserveOfficer : 
       -                                          Names.Officer);
       -   if (FireType==F_STAND) {
       -      g_string_append(text,_("^You stand there like an idiot."));
       -   } else if (FireType==F_RUN) {
       -      if (brandom(0,100) < Cops.EscapeProb-(Play->Cops-1)*Cops.DeputyEscape) {
       -         if (Play->Cops==1) {
       -            g_string_append(text,_("^You lose him in the alleys."));
       -         } else {
       -            g_string_append(text,_("^You lose them in the alleys."));
       -         }
       -         SendPrintMessage(NULL,C_COPSDONE,Play,text->str);
       -         FinishFightWithHardass(Play,NULL);
       -         g_string_free(text,TRUE);
       -         return;
       -      } else {
       -         if (Play->Cops==1) {
       -            g_string_append(text,_("^You can\'t shake him, man!"));
       -         } else {
       -            g_string_append(text,_("^You can\'t shake them, man!"));
       -         }
       +gboolean CanRunHere(Player *Play) {
       +   return (Play->ResyncNum < E_ARRIVE && Play->ResyncNum!=E_NONE);
       +}
       +
       +Player *GetNextShooter(Player *Play) {
       +   Player *MinPlay,*Defend;
       +   time_t MinTimeout;
       +   int ArrayInd;
       +
       +   if (!FightTimeout) return NULL;
       +
       +   MinPlay=NULL; MinTimeout=0;
       +   for (ArrayInd=0;ArrayInd<Play->FightArray->len;ArrayInd++) {
       +      Defend=(Player *)g_ptr_array_index(Play->FightArray,ArrayInd);
       +      if (Defend!=Play &&
       +          (MinTimeout==0 || Defend->FightTimeout<MinTimeout)) {
       +         MinPlay=Defend; MinTimeout=Defend->FightTimeout;
              }
       -   } else if (FireType==F_FIGHT) {
       -      Damage=100-brandom(0,Play->Cops)*Cops.Toughness;
       -      for (i=0;i<NumGun;i++) for (j=0;j<Play->Guns[i].Carried;j++) {
       -         Damage+=brandom(0,Gun[i].Damage);
       +   }
       +   return MinPlay;
       +}
       +
       +void WithdrawFromCombat(Player *Play) {
       +/* Cleans up combat after player "Play" has left                    */
       +   int i,j;
       +   gboolean FightDone;
       +   Player *Attack,*Defend;
       +
       +   if (!Play->FightArray) return;
       +
       +   FightDone=TRUE;
       +   for (i=0;i<Play->FightArray->len;i++) {
       +      Attack=(Player *)g_ptr_array_index(Play->FightArray,i);
       +      for (j=0;j<i;j++) {
       +         Defend=(Player *)g_ptr_array_index(Play->FightArray,j);
       +         if (Attack!=Play && Defend!=Play &&
       +             IsOpponent(Attack,Defend)) { FightDone=FALSE; break; }
              }
       -      if (Damage>=100) {
       -         if (Play->Cops==1) {
       -            i=brandom(1500,3000);
       -            g_string_sprintfa(text,_("^You killed Officer %s! "
       -                              "You find %s on his corpse!"),
       -                              OfficerName,prstr=FormatPrice(i));
       -            g_free(prstr);
       -            Play->Cash += i;
       -            Play->Flags |= DEADHARDASS;
       -            SendPlayerData(Play);
       -            Play->DocPrice=brandom(1000,2000-5*Play->Health);
       -            if (brandom(0,100)<75 && Play->DocPrice<=Play->Cash &&
       -                Play->Health<100) {
       -               SendPrintMessage(NULL,C_COPSMESG,Play,text->str);
       -               Play->EventNum=E_DOCTOR;
       -               if (Play->Bitches.Carried && !WantAntique) {
       -                  g_string_sprintf(text,
       -                         _("YN^^^^Do you pay a doctor %s to sew your %s up?"),
       -                        prstr=FormatPrice(Play->DocPrice),Names.Bitches);
       -               } else {
       -                  g_string_sprintf(text,
       -                         _("YN^^^^Do you pay a doctor %s to sew you up?"),
       -                        prstr=FormatPrice(Play->DocPrice));
       -               }
       -               g_free(prstr);
       -               SendQuestion(NULL,C_ASKSEW,Play,text->str);
       -            } else {
       -               SendPrintMessage(NULL,C_COPSDONE,Play,text->str);
       -               FinishFightWithHardass(Play,NULL);
       -            }
       -            g_string_free(text,TRUE);
       -            return;
       -         } else {
       -            g_string_append(text,_("^You got one, man!"));
       -            Play->Cops--;
       -         }
       -      } else g_string_append(text,_("^You missed!"));
       +      if (!FightDone) break;
           }
        
       -   if (Play->Cops==1) {
       -      g_string_append(text,_("^He's firing on you, man! "));
       -   } else {
       -      g_string_append(text,_("^They're firing on you, man! "));
       -   }
       -   if (brandom(0,100) < Cops.HitProb+(Play->Cops-1)*Cops.DeputyHit) {
       -      g_string_append(text,_("You've been hit! "));
       -      Damage=0;
       -      for (i=0;i<Play->Cops;i++) Damage+=brandom(0,Cops.Damage);
       -      if (Damage==0) Damage=1;
       -      if (Damage>Play->Health) {
       -         if (Play->Bitches.Carried==0 || WantAntique) {
       -            if (Play->Cops==1) {
       -               g_string_append(text,_("He wasted you, man! What a drag!"));
       -            } else {
       -               g_string_append(text,_("They wasted you, man! What a drag!"));
       -            }
       -            Play->Health=0;
       -            SendPlayerData(Play);
       -            FinishFightWithHardass(Play,text->str);
       -            g_string_free(text,TRUE);
       -            return;
       +   SendFightLeave(Play,FightDone);
       +   g_ptr_array_remove(Play->FightArray,(gpointer)Play);
       +
       +   if (FightDone) {
       +      for (i=0;i<Play->FightArray->len;i++) {
       +         Defend=(Player *)g_ptr_array_index(Play->FightArray,i);
       +         Defend->FightArray=NULL;
       +         if (Defend->IsCop) {
       +            FirstServer=RemovePlayer(Defend,FirstServer);
                 } else {
       -            g_string_sprintfa(text,_("You lost one of your %s!"),Names.Bitches);
       -            LoseBitch(Play,NULL,NULL);
       -            Play->Health=100;
       +            Defend->EventNum=Defend->ResyncNum; SendEvent(Defend);
                 }
       -      } else {
       -         Play->Health-=Damage;
       -      }
       -   } else {
       -      if (Play->Cops==1) {
       -         g_string_append(text,_("He missed!"));
       -      } else {
       -         g_string_append(text,_("They missed!"));
              }
       +      g_ptr_array_free(Play->FightArray,TRUE);
           }
       -   SendPlayerData(Play);
       -   SendPrintMessage(NULL,C_COPSMESG,Play,text->str);
       -   g_string_free(text,TRUE);
       -   OfficerHardass(Play,NULL,NULL);
       +   Play->FightArray=NULL;
        }
        
        int RandomOffer(Player *To) {
       t@@ -1637,7 +1672,12 @@ void HandleAnswer(Player *From,Player *To,char *answer) {
           if (!From || From->EventNum==E_NONE) return;
           if (answer[0]=='Y' && From->EventNum==E_OFFOBJECT && From->Bitches.Price
               && From->Bitches.Price>From->Cash) answer[0]='N';
       -   if (answer[0]=='Y') switch (From->EventNum) { 
       +   if ((From->EventNum==E_FIGHT || From->EventNum==E_FIGHTASK) &&
       +       CanRunHere(From)) {
       +      From->EventNum=E_FIGHT;
       +      if (answer[0]=='R' || answer[0]=='Y') RunFromCombat(From);
       +      else Fire(From);
       +   } else if (answer[0]=='Y') switch (From->EventNum) { 
              case E_OFFOBJECT:
                 if (g_slist_find(FirstServer,(gpointer)From->OnBehalfOf)) {
                    g_message(_("%s: offer was on behalf of %s"),GetPlayerName(From),
       t@@ -1692,36 +1732,21 @@ void HandleAnswer(Player *From,Player *To,char *answer) {
                 FinishGame(From,_("You hallucinated for three days on the wildest "
        "trip you ever imagined!^Then you died because your brain disintegrated!")); 
                 break;
       -      case E_COPS:
       -         FireAtHardass(From,F_RUN);
       -         break;
              case E_DOCTOR:
                 if (From->Cash >= From->DocPrice) {
                    From->Cash -= From->DocPrice;
       -            From->Health=100;
       +            From->Health=MaxHealth(From,From->Bitches.Carried);
                    SendPlayerData(From);
                 }
       -         FinishFightWithHardass(From,NULL);
       +/*       FinishFightWithHardass(From,NULL);*/
                 break;
       -   } else if (From->EventNum==E_COPS && 
       -              (answer[0]=='F' || answer[0]=='R')) {
       -      FireAtHardass(From,answer[0]=='F' ? F_FIGHT : F_RUN);
           } else if (From->EventNum==E_ARRIVE) {
              if ((answer[0]=='A' || answer[0]=='T') && 
       -          g_slist_find(FirstServer,(gpointer)From->Attacked)) {
       -         if (From->Attacked->IsAt==From->IsAt) {
       +          g_slist_find(FirstServer,(gpointer)From->OnBehalfOf)) {
       +         if (From->OnBehalfOf->IsAt==From->IsAt) {
                    if (answer[0]=='A') {
       -               if (From->Attacked->EventNum<E_MAX) {
       -                  From->Attacked->ResyncNum=From->Attacked->EventNum;
       -               }
       -               From->Attacked->Flags |= FIGHTING;
       -               SendPlayerData(From->Attacked);
       -               From->Flags |= FIGHTING;
       -               SendPlayerData(From);
       -               From->Attacked->EventNum=E_DEFEND;
       -               From->ResyncNum=E_ARRIVE+1;
       -               From->EventNum=E_ATTACK;
       -               AttackPlayer(From,From->Attacked,AT_FIRST | AT_SHOOT);
       +               From->EventNum=From->OnBehalfOf->EventNum=E_NONE;
       +               AttackPlayer(From,From->OnBehalfOf);
        /*          } else if (answer[0]=='T') {
                       From->Flags |= TRADING;
                       SendPlayerData(From);
       t@@ -1729,7 +1754,7 @@ void HandleAnswer(Player *From,Player *To,char *answer) {
                    }
                 } else {
                    text=g_strdup_printf(_("Too late - %s has just left!"),
       -                                 GetPlayerName(From->Attacked));
       +                                 GetPlayerName(From->OnBehalfOf));
                    SendPrintMessage(NULL,C_NONE,From,text);
                    g_free(text);
                    From->EventNum++; SendEvent(From);
       t@@ -1742,11 +1767,8 @@ void HandleAnswer(Player *From,Player *To,char *answer) {
                 From->EventNum++;
                 From->EventNum++; SendEvent(From);
                 break;
       -      case E_COPS:
       -         FireAtHardass(From,F_STAND);
       -         break;
              case E_DOCTOR:
       -         FinishFightWithHardass(From,NULL);
       +/*       FinishFightWithHardass(From,NULL);*/
                 break;
              case E_HIREBITCH: case E_GUNSHOP: case E_BANK: case E_LOANSHARK:
              case E_OFFOBJECT: case E_WEED:
       t@@ -1768,252 +1790,6 @@ void HandleAnswer(Player *From,Player *To,char *answer) {
           }
        }
        
       -void BreakoffCombat(Player *Attack,char LeftGame) {
       -/* Withdraws from player-player combat that player "Attack" is     */
       -/* currently involved in. "LeftGame" is TRUE if "Attack" has just  */
       -/* left the game, in which case no more messages are sent to this  */
       -/* player (just the other side of the fight is cleaned up)         */
       -   Player *Defend,*Play,*Victor;
       -   GSList *list;
       -   gchar *text;
       -   char FightDone;
       -   if (!g_slist_find(FirstServer,(gpointer)Attack)) {
       -      g_warning("Players involved in a fight are not valid!");
       -      return;
       -   }
       -   if (Attack->EventNum!=E_DEFEND && Attack->EventNum!=E_ATTACK &&
       -        Attack->EventNum!=E_FREEFORALL && Attack->EventNum!=E_WAITATTACK) {
       -      g_warning("Players in fight are not attack/defending!");
       -      return;
       -   }
       -   Victor=NULL;
       -
       -   if (Attack->EventNum==E_DEFEND) {
       -      text=g_strdup_printf(_("%s has got away!"),GetPlayerName(Attack));
       -      for (list=FirstServer;list;list=g_slist_next(list)) {
       -         Play=(Player *)list->data;
       -         if (Play->Attacked==Attack && (Play->EventNum==E_ATTACK ||
       -             Play->EventNum==E_WAITATTACK || Play->EventNum==E_FREEFORALL)) {
       -            ClearFightTimeout(Play);
       -            Play->Attacked=NULL;
       -            Play->Flags &= ~FIGHTING;
       -            SendPlayerData(Play);
       -            if (Attack->Health!=0) {
       -               SendServerMessage(NULL,C_NONE,C_FIGHTPRINT,Play,text);
       -            }
       -            Victor=Play;
       -            Play->EventNum=Play->ResyncNum; SendEvent(Play);
       -         } 
       -      }
       -      g_free(text);
       -   } else {
       -      ClearFightTimeout(Attack);
       -      Victor=Attack;
       -      Defend=Attack->Attacked;
       -      if (!g_slist_find(FirstServer,(gpointer)Defend)) {
       -         g_warning("Players involved in a fight are not valid!");
       -         return;
       -      }
       -      if (Defend->EventNum!=E_DEFEND) {
       -         g_warning("Players in fight are not attack/defending!");
       -         return;
       -      }
       - 
       -      Attack->Attacked=NULL;
       -      FightDone=TRUE;
       -      for (list=FirstServer;list;list=g_slist_next(list)) {
       -         Play=(Player *)list->data;
       -         if (Play->Attacked==Defend && (Play->EventNum==E_ATTACK ||
       -             Play->EventNum==E_WAITATTACK || Play->EventNum==E_FREEFORALL)) { 
       -            FightDone=FALSE; 
       -            break; 
       -         }
       -      }
       -      if (Attack->Health>0) {
       -         text=g_strdup_printf(_("%s has run off!"),GetPlayerName(Attack));
       -         SendServerMessage(NULL,C_NONE,C_FIGHTPRINT,Defend,text);
       -         g_free(text);
       -      }
       -      if (FightDone) {
       -         Defend->Flags &= ~FIGHTING;
       -         SendPlayerData(Defend);
       -         Defend->EventNum=Defend->ResyncNum; SendEvent(Defend);
       -      }
       -   }
       -   if (!LeftGame) { 
       -      if (Attack->Health>0) SendPrintMessage(NULL,C_NONE,Attack,
       -         _("Coward! You successfully escaped from the fight."));
       -      Attack->Flags &= ~FIGHTING; SendPlayerData(Attack);
       -      Attack->EventNum=Attack->ResyncNum; SendEvent(Attack);
       -   }
       -}
       -
       -void AttackPlayer(Player *Attack,Player *Defend,char AttackType) {
       -/* Processes a player-player attack from player "Attack" to player "Defend" */
       -/* AttackType is the type of attack, and may contain the following flags:-  */
       -/*  AT_FIRST: Set if this is the first attack                               */
       -/*  AT_SHOOT: Set if this is an 'active' attack - i.e. player "Attack" is   */
       -/*            actually shooting, not just "not running"                     */
       -   int i,j;
       -   Inventory *Guns,*Drugs;
       -   price_t Bounty;
       -   int Damage,MaxDamage;
       -   GString *DefendText,*AttackText;
       -   gchar *prstr,*ActionText,*ArmamentText;
       - 
       -   if (!g_slist_find(FirstServer,(gpointer)Attack) || 
       -       !g_slist_find(FirstServer,(gpointer)Defend)) {
       -      g_warning("Players involved in a fight are not valid!");
       -      return;
       -   }
       -   if (Attack->EventNum!=E_DEFEND && Attack->EventNum!=E_ATTACK &&
       -       Attack->EventNum!=E_FREEFORALL) {
       -      g_warning("%s is in wrong state (%d) to attack!",
       -                GetPlayerName(Attack),Attack->EventNum);
       -      return;
       -   }
       -   if ((Attack->EventNum==E_ATTACK || Attack->EventNum==E_FREEFORALL) && 
       -       Defend->EventNum!=E_DEFEND) {
       -      g_warning("%s is trying to attack %s, who is in wrong state (%d)!",
       -                GetPlayerName(Attack),GetPlayerName(Defend),Defend->EventNum);
       -      return;
       -   }
       -   if (Attack->EventNum==E_DEFEND && Defend->EventNum!=E_WAITATTACK &&
       -       Defend->EventNum!=E_FREEFORALL) {
       -      g_warning("%s is trying to defend against %s, who is in wrong \
       -state (%d)!",GetPlayerName(Attack),GetPlayerName(Defend),Defend->EventNum);
       -      return;
       -   }
       -   MaxDamage=0;
       -   Damage=0;
       -   AttackText=g_string_new(NULL);
       -   DefendText=g_string_new(NULL);
       -   for (i=0;i<NumGun;i++) {
       -      if (Gun[i].Damage>MaxDamage) MaxDamage=Gun[i].Damage;
       -      Damage+=Gun[i].Damage*Attack->Guns[i].Carried;
       -   }
       -   MaxDamage *= (Attack->Bitches.Carried+2);
       -   MaxDamage = Damage*100/MaxDamage;
       -
       -   Guns=(Inventory *)g_malloc0(sizeof(Inventory)*NumGun);
       -   Drugs=(Inventory *)g_malloc0(sizeof(Inventory)*NumDrug);
       -   ClearInventory(Guns,Drugs);
       -   ArmamentText= MaxDamage<10 ? _("pitifully armed")       :
       -                 MaxDamage<25 ? _("lightly armed")         :
       -                 MaxDamage<60 ? _("moderately well armed") :
       -                 MaxDamage<80 ? _("heavily armed")         :
       -                                _("armed to the teeth");
       -   ActionText=AttackType&AT_SHOOT ? _(" fires and ") :
       -                                     _(" stands and takes it.");
       -   if (AttackType&AT_FIRST) {
       -      if (Attack->Bitches.Carried>0) {
       -         g_string_sprintf(DefendText,_("%s arrives, with %d %s, %s,^%s"),
       -                          GetPlayerName(Attack),Attack->Bitches.Carried,
       -                          Names.Bitches,ArmamentText,ActionText);
       -      } else {
       -         g_string_sprintf(DefendText,_("%s arrives, %s,^%s"),
       -                          GetPlayerName(Attack),ArmamentText,ActionText);
       -      }
       -   } else {
       -      if (AttackType&AT_SHOOT) {
       -         g_string_sprintf(DefendText,_("%s fires and "),GetPlayerName(Attack));
       -      } else {
       -         g_string_sprintf(DefendText,_("%s stands and takes it."),
       -                          GetPlayerName(Attack));
       -      }
       -   }
       -   Damage=0;
       -   if (AttackType&AT_SHOOT) {
       -      for (i=0;i<NumGun;i++) for (j=0;j<Attack->Guns[i].Carried;j++) {
       -         Damage+=brandom(0,Gun[i].Damage);
       -      }
       -   }
       -   if (Damage==0) {
       -      if (AttackType & AT_SHOOT) {
       -         g_string_append(DefendText,_("misses you!"));
       -         g_string_sprintf(AttackText,_("You failed to hit %s."),
       -                          GetPlayerName(Defend));
       -      } else {
       -         g_string_assign(AttackText,_("You stand and take it."));
       -      }
       -      SendServerMessage(NULL,C_NONE,C_FIGHTPRINT,Attack,AttackText->str);
       -   } else {
       -      g_string_append(DefendText,_("hits you, man!"));
       -      if (Damage>=Defend->Health) {
       -         if (Defend->Bitches.Carried==0) {
       -            g_string_append(DefendText,_(" You've been wasted! What a drag!"));
       -            g_string_sprintf(AttackText,_("You hit and killed %s"),
       -                             GetPlayerName(Defend));
       -            Defend->Health=0;
       -            Bounty=Defend->Cash+Defend->Bank-Defend->Debt;
       -            if (Bounty>0) Attack->Cash+=Bounty;
       -            SendPlayerData(Defend);
       -            SendServerMessage(NULL,C_NONE,C_FIGHTPRINT,Defend,DefendText->str);
       -            AddInventory(Guns,Defend->Guns,NumGun);
       -            AddInventory(Drugs,Defend->Drugs,NumDrug);
       -            TruncateInventoryFor(Guns,Drugs,Attack);
       -            if (!IsInventoryClear(Guns,Drugs)) {
       -               AddInventory(Attack->Guns,Guns,NumGun);
       -               AddInventory(Attack->Drugs,Drugs,NumDrug);
       -               ChangeSpaceForInventory(Guns,Drugs,Attack);
       -               SendPlayerData(Attack);
       -               g_string_append(AttackText,_(", and loot the body!"));
       -            } else g_string_append_c(AttackText,'!');
       -            SendServerMessage(NULL,C_NONE,C_FIGHTPRINT,Attack,AttackText->str);
       -            g_free(Guns); g_free(Drugs); 
       -            g_string_free(AttackText,TRUE);
       -            FinishGame(Defend,DefendText->str);
       -            g_string_free(DefendText,TRUE);
       -            return;
       -         } else {
       -            g_string_sprintfa(DefendText,_("^You lost a %s, man!"),
       -                                         Names.Bitch);
       -            Bounty=(Defend->Cash+Defend->Bank-Defend->Debt)*
       -                   Defend->Bitches.Carried/1000L;
       -            if (Bounty>0) {
       -               g_string_sprintf(AttackText,_("You are paid a bounty of %s in "
       -                                "reward for killing^one of %s's %s"),
       -                                prstr=FormatPrice(Bounty),
       -                                GetPlayerName(Defend),Names.Bitches);
       -               g_free(prstr);
       -               Attack->Cash+=Bounty;
       -               SendPlayerData(Attack);
       -            } else {
       -               g_string_sprintf(AttackText,_("You killed one of %s's %s "
       -                                "(%d left)"),GetPlayerName(Defend),
       -                                Names.Bitches,Defend->Bitches.Carried-1);
       -            }
       -            LoseBitch(Defend,Guns,Drugs);
       -            TruncateInventoryFor(Guns,Drugs,Attack);
       -            if (!IsInventoryClear(Guns,Drugs)) {
       -               AddInventory(Attack->Guns,Guns,NumGun);
       -               AddInventory(Attack->Drugs,Drugs,NumDrug);
       -               ChangeSpaceForInventory(Guns,Drugs,Attack);
       -               SendPlayerData(Attack);
       -               g_string_append(AttackText,_(", and loot the body!"));
       -            } else g_string_append_c(AttackText,'!');
       -            SendServerMessage(NULL,C_NONE,C_FIGHTPRINT,Attack,AttackText->str);
       -            Defend->Health=100;
       -         }
       -      } else {
       -         Defend->Health-=Damage;
       -         g_string_sprintf(AttackText,_("You fire, and hit %s!"),
       -                          GetPlayerName(Defend));
       -         SendServerMessage(NULL,C_NONE,C_FIGHTPRINT,Attack,AttackText->str);
       -      }
       -   }
       -   if (Attack->EventNum==E_ATTACK || Attack->EventNum==E_FREEFORALL) {
       -      Attack->EventNum=E_WAITATTACK; SetFightTimeout(Attack);
       -   } else if (Attack->EventNum==E_DEFEND) {
       -      Defend->EventNum=E_ATTACK; SetFightTimeout(Defend);
       -   }
       -   SendPlayerData(Defend);
       -   SendServerMessage(Attack,C_NONE,C_FIGHTPRINT,Defend,DefendText->str);
       -   g_string_free(AttackText,TRUE);
       -   g_string_free(DefendText,TRUE);
       -   g_free(Guns); g_free(Drugs);
       -}
       -
        void BuyObject(Player *From,char *data) {
        /* Processes a request stored in "data" from player "From" to buy an  */
        /* object (bitch, gun, or drug)                                       */
       t@@ -2048,7 +1824,8 @@ void BuyObject(Player *From,char *data) {
                    deputy=g_strdup_printf(_("YN^Officer %%s and %%d of his deputies "
                                           "spot you dropping %s, and chase you!"),
                                           Names.Drugs);
       -            StartOfficerHardass(From,From->EventNum,lone,deputy);
       +            CopsAttackPlayer(From);
       +/*          StartOfficerHardass(From,From->EventNum,lone,deputy);*/
                    g_free(lone); g_free(deputy);
                 }
              }
       t@@ -2190,7 +1967,6 @@ int GetMinimumTimeout(GSList *First) {
        GSList *HandleTimeouts(GSList *First) {
           GSList *list,*nextlist;
           Player *Play;
       -   gchar *text;
           time_t timenow;
        
           timenow=time(NULL);
       t@@ -2218,19 +1994,8 @@ GSList *HandleTimeouts(GSList *First) {
                 First=RemovePlayer(Play,First);
              } else if (Play->FightTimeout!=0 && Play->FightTimeout<=timenow) {
                 ClearFightTimeout(Play);
       -         if (Play->EventNum==E_WAITATTACK) {
       -            Play->EventNum=E_FREEFORALL;
       -            text=g_strdup_printf(_("%s fails to return fire..."),
       -                                 GetPlayerName(Play->Attacked));
       -            SendServerMessage(Play->Attacked,C_NONE,C_FIGHTPRINT,Play,text);
       -            g_free(text);
       -         } else if (Play->EventNum==E_ATTACK) {
       -            Play->EventNum=E_FREEFORALL;
       -            text=g_strdup_printf(_("%s fails to return fire..."),
       -                                 GetPlayerName(Play));
       -            SendServerMessage(Play,C_NONE,C_FIGHTPRINT,Play->Attacked,text);
       -            g_free(text);
       -         }
       +         if (Play->IsCop) Fire(Play);
       +         else SendFightReload(Play);
              }
              list=nextlist;
           }
 (DIR) diff --git a/src/serverside.h b/src/serverside.h
       t@@ -59,20 +59,23 @@ void BuyObject(Player *From,char *data);
        int RandomOffer(Player *To);
        void HandleAnswer(Player *From,Player *To,char *answer);
        void ClearPrices(Player *Play);
       -void StartOfficerHardass(Player *Play,int ResyncNum,
       -                         char *LoneMessage,char *DeputyMessage);
       -void OfficerHardass(Player *Play,char *LoneMessage,char *DeputyMessage);
       -void FireAtHardass(Player *Play,char FireType);
       -void FinishFightWithHardass(Player *Play,char *Message);
        int LoseBitch(Player *Play,Inventory *Guns,Inventory *Drugs);
        void GainBitch(Player *Play);
       -void AttackPlayer(Player *Attack,Player *Defend,char AttackType);
       -void BreakoffCombat(Player *Attack,char LeftGame);
        void SetFightTimeout(Player *Play);
        void ClearFightTimeout(Player *Play);
        int GetMinimumTimeout(GSList *First);
        GSList *HandleTimeouts(GSList *First);
        gboolean CheckHighScoreFile();
        int HighScoreRead(struct HISCORE *MultiScore,struct HISCORE *AntiqueScore);
       +void CopsAttackPlayer(Player *Play);
       +void AttackPlayer(Player *Play,Player *Attacked);
       +void AddPlayerToFight(Player *NewPlay,GPtrArray *Fight,Player *Other);
       +gboolean IsOpponent(Player *Play,Player *Other);
       +void Fire(Player *Play);
       +void WithdrawFromCombat(Player *Play);
       +void RunFromCombat(Player *Play);
       +gboolean CanPlayerFire(Player *Play);
       +gboolean CanRunHere(Player *Play);
       +Player *GetNextShooter(Player *Play);
        
        #endif