tInitial support for tense/case-sensitive strings (tstrings) - 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 bd79d414ea55ce5446266ddfd66005ecbb9bd821
 (DIR) parent 12764cbe8302c45154e781bdbd576222a590e2da
 (HTM) Author: Ben Webb <ben@salilab.org>
       Date:   Sun,  1 Oct 2000 23:25:48 +0000
       
       Initial support for tense/case-sensitive strings (tstrings)
       
       
       Diffstat:
         M po/dopewars.pot                     |     590 ++++++++++++++++---------------
         M src/Makefile.am                     |       2 +-
         M src/Makefile.in                     |       6 +++---
         M src/gtk_client.c                    |     162 +++++++++++++++++++------------
         M src/message.c                       |      27 +++++++++++++++++++--------
         M src/message.h                       |       4 ----
         M src/serverside.c                    |      46 +++++++++++++++++++++----------
         A src/tstring.c                       |     110 +++++++++++++++++++++++++++++++
         A src/tstring.h                       |      33 +++++++++++++++++++++++++++++++
       
       9 files changed, 602 insertions(+), 378 deletions(-)
       ---
 (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-10-01 19:16+0100\n"
       +"POT-Creation-Date: 2000-10-02 00:17+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@@ -1002,7 +1002,7 @@ msgstr ""
        msgid "CLQP"
        msgstr ""
        
       -#: src/curses_client.c:371 src/gtk_client.c:817
       +#: src/curses_client.c:371 src/gtk_client.c:822
        msgid "Where to, dude ? "
        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:341 src/serverside.c:258
       +#: src/curses_client.c:649 src/gtk_client.c:340 src/serverside.c:259
        #, c-format
        msgid "%s joins the game!"
        msgstr ""
        
       -#: src/curses_client.c:654 src/gtk_client.c:347
       +#: src/curses_client.c:654 src/gtk_client.c:346
        #, 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:1092
       +#: src/curses_client.c:820
        #, c-format
        msgid "You'll need more %s to carry any more %s!"
        msgstr ""
        
       -#: src/curses_client.c:842 src/gtk_client.c:1096
       +#: src/curses_client.c:842
        #, c-format
        msgid "You don't have enough space to carry that %s!"
        msgstr ""
        
       -#: src/curses_client.c:850 src/gtk_client.c:1100
       +#: src/curses_client.c:850
        #, c-format
        msgid "You don't have enough cash to buy that %s!"
        msgstr ""
        
       -#: src/curses_client.c:863 src/gtk_client.c:1104
       +#: src/curses_client.c:863 src/gtk_client.c:1134
        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:1934
       +#: src/curses_client.c:893 src/curses_client.c:923 src/gtk_client.c:1962
        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:1927
       +#: src/curses_client.c:926 src/gtk_client.c:1955
        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:1386
       +#: src/curses_client.c:1143 src/gtk_client.c:1415
        msgid "Stats"
        msgstr ""
        
       t@@ -1357,91 +1357,91 @@ msgid ""
        "client (if available) instead!\n"
        msgstr ""
        
       -#: src/gtk_client.c:141
       +#: src/gtk_client.c:142
        msgid "/_Game"
        msgstr ""
        
       -#: src/gtk_client.c:142
       +#: src/gtk_client.c:143
        msgid "/Game/_New"
        msgstr ""
        
       -#: src/gtk_client.c:143
       +#: src/gtk_client.c:144
        msgid "/Game/_Quit"
        msgstr ""
        
       -#: src/gtk_client.c:144
       +#: src/gtk_client.c:145
        msgid "/_Talk"
        msgstr ""
        
       -#: src/gtk_client.c:145
       +#: src/gtk_client.c:146
        msgid "/Talk/To _All"
        msgstr ""
        
       -#: src/gtk_client.c:146
       +#: src/gtk_client.c:147
        msgid "/Talk/To _Player"
        msgstr ""
        
       -#: src/gtk_client.c:147
       +#: src/gtk_client.c:148
        msgid "/_List"
        msgstr ""
        
       -#: src/gtk_client.c:148
       +#: src/gtk_client.c:149
        msgid "/List/_Players"
        msgstr ""
        
       -#: src/gtk_client.c:149
       +#: src/gtk_client.c:150
        msgid "/List/_Scores"
        msgstr ""
        
       -#: src/gtk_client.c:150
       +#: src/gtk_client.c:151
        msgid "/List/_Inventory"
        msgstr ""
        
       -#: src/gtk_client.c:151
       +#: src/gtk_client.c:152
        msgid "/_Errands"
        msgstr ""
        
       -#: src/gtk_client.c:152
       +#: src/gtk_client.c:153
        msgid "/Errands/_Spy"
        msgstr ""
        
       -#: src/gtk_client.c:153
       +#: src/gtk_client.c:154
        msgid "/Errands/_Tipoff"
        msgstr ""
        
       -#: src/gtk_client.c:154
       +#: src/gtk_client.c:155
        msgid "/Errands/Sack _Bitch"
        msgstr ""
        
       -#: src/gtk_client.c:155
       +#: src/gtk_client.c:156
        msgid "/Errands/_Get spy reports"
        msgstr ""
        
       -#: src/gtk_client.c:156
       +#: src/gtk_client.c:157
        msgid "/_Help"
        msgstr ""
        
       -#: src/gtk_client.c:157
       +#: src/gtk_client.c:158
        msgid "/Help/_About"
        msgstr ""
        
       -#: src/gtk_client.c:167
       +#: src/gtk_client.c:168
        msgid "Warning"
        msgstr ""
        
       -#: src/gtk_client.c:167
       +#: src/gtk_client.c:168
        msgid "Message"
        msgstr ""
        
       -#: src/gtk_client.c:173 src/gtk_client.c:184
       +#: src/gtk_client.c:174 src/gtk_client.c:185
        msgid "Quit Game"
        msgstr ""
        
       -#: src/gtk_client.c:173 src/gtk_client.c:185 src/gtk_client.c:192
       +#: src/gtk_client.c:174 src/gtk_client.c:186 src/gtk_client.c:193
        msgid "Abandon current game?"
        msgstr ""
        
       -#: src/gtk_client.c:191
       +#: src/gtk_client.c:192
        msgid "Start new game"
        msgstr ""
        
       t@@ -1449,192 +1449,227 @@ msgstr ""
        msgid "Inventory"
        msgstr ""
        
       -#: src/gtk_client.c:240 src/gtk_client.c:2169 src/gtk_client.c:2533
       +#: src/gtk_client.c:238 src/gtk_client.c:2197 src/gtk_client.c:2578
        msgid "Close"
        msgstr ""
        
       -#: src/gtk_client.c:270
       +#: src/gtk_client.c:268
        msgid "Connection to server lost - switching to single player mode"
        msgstr ""
        
       -#: src/gtk_client.c:315
       +#: src/gtk_client.c:314
        msgid "You have been pushed from the server."
        msgstr ""
        
       -#: src/gtk_client.c:320
       +#: src/gtk_client.c:319
        msgid "The server has terminated."
        msgstr ""
        
       -#: src/gtk_client.c:361
       -#, c-format
       -msgid "Jetting to %s"
       +#: src/gtk_client.c:360
       +msgid "Jetting to %tde"
        msgstr ""
        
       -#: src/gtk_client.c:369
       +#: src/gtk_client.c:370
        #, c-format
        msgid "_Spy\t(%s)"
        msgstr ""
        
       -#: src/gtk_client.c:373
       +#: src/gtk_client.c:374
        #, c-format
        msgid "_Tipoff\t(%s)"
        msgstr ""
        
       -#: src/gtk_client.c:407
       +#: src/gtk_client.c:408
        msgid "High Scores"
        msgstr ""
        
       -#: 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
       +#: src/gtk_client.c:442 src/gtk_client.c:1057 src/gtk_client.c:1527
       +#: src/gtk_client.c:1872 src/gtk_client.c:2036 src/gtk_client.c:2317
       +#: src/gtk_client.c:2484
        msgid "OK"
        msgstr ""
        
       -#: src/gtk_client.c:523
       +#: src/gtk_client.c:525
        msgid "Fight"
        msgstr ""
        
       -#: src/gtk_client.c:550
       -#, c-format
       -msgid "_Deal %s"
       +#: src/gtk_client.c:552
       +msgid "_Deal %Tde"
        msgstr ""
        
       -#: src/gtk_client.c:554 src/gtk_client.c:1135 src/gtk_client.c:1332
       +#: src/gtk_client.c:558 src/gtk_client.c:1165 src/gtk_client.c:1362
        msgid "_Fight"
        msgstr ""
        
       -#: src/gtk_client.c:557
       +#: src/gtk_client.c:561
        msgid "_Stand"
        msgstr ""
        
       -#: src/gtk_client.c:560 src/gtk_client.c:1134
       +#: src/gtk_client.c:564 src/gtk_client.c:1164
        msgid "_Run"
        msgstr ""
        
       -#: src/gtk_client.c:808
       +#: src/gtk_client.c:644
       +msgid "**Stats: Guns** %Tde"
       +msgstr ""
       +
       +#: src/gtk_client.c:651
       +msgid "**Stats: Bitches** %Tde"
       +msgstr ""
       +
       +#: src/gtk_client.c:813
        msgid "Jet to location"
        msgstr ""
        
       -#: src/gtk_client.c:877
       +#: src/gtk_client.c:883
        #, c-format
        msgid "at %s"
        msgstr ""
        
       -#: src/gtk_client.c:882
       -#, c-format
       -msgid "You are currently carrying %d %s"
       +#: src/gtk_client.c:888
       +msgid "You are currently carrying %d %tde"
        msgstr ""
        
       -#: src/gtk_client.c:887
       +#: src/gtk_client.c:895
        #, c-format
        msgid "Available space: %d"
        msgstr ""
        
       -#: src/gtk_client.c:892
       +#: src/gtk_client.c:900
        #, c-format
        msgid "You can afford %d"
        msgstr ""
        
       -#: src/gtk_client.c:941 src/gtk_client.c:1072
       +#: src/gtk_client.c:949 src/gtk_client.c:1087
        msgid "Buy"
        msgstr ""
        
       -#: src/gtk_client.c:942 src/gtk_client.c:1073
       +#: src/gtk_client.c:950 src/gtk_client.c:1088
        msgid "Sell"
        msgstr ""
        
       -#: src/gtk_client.c:943 src/gtk_client.c:1074
       +#: src/gtk_client.c:951 src/gtk_client.c:1089
        msgid "Drop"
        msgstr ""
        
       -#: src/gtk_client.c:1031
       -#, c-format
       -msgid "%s how many?"
       +#: src/gtk_client.c:1040
       +msgid "Buy how many?"
       +msgstr ""
       +
       +#: src/gtk_client.c:1042
       +msgid "Sell how many?"
       +msgstr ""
       +
       +#: src/gtk_client.c:1044
       +msgid "Drop how many?"
        msgstr ""
        
       -#: src/gtk_client.c:1049 src/gtk_client.c:1844 src/gtk_client.c:2019
       -#: src/gtk_client.c:2292
       +#: src/gtk_client.c:1063 src/gtk_client.c:1872 src/gtk_client.c:2047
       +#: src/gtk_client.c:2325
        msgid "Cancel"
        msgstr ""
        
       -#: src/gtk_client.c:1088
       -#, c-format
       -msgid "You don't have any %s!"
       +#: src/gtk_client.c:1100
       +msgid "Buy %tde"
       +msgstr ""
       +
       +#: src/gtk_client.c:1101
       +msgid "Sell %tde"
       +msgstr ""
       +
       +#: src/gtk_client.c:1102
       +msgid "Drop %tde"
        msgstr ""
        
       -#: src/gtk_client.c:1134 src/gtk_client.c:1845
       +#: src/gtk_client.c:1108
       +msgid "You don't have any %tde!"
       +msgstr ""
       +
       +#: src/gtk_client.c:1115
       +msgid "You'll need more %tde to carry any more %tde!"
       +msgstr ""
       +
       +#: src/gtk_client.c:1122
       +msgid "You don't have enough space to carry that %tde!"
       +msgstr ""
       +
       +#: src/gtk_client.c:1129
       +msgid "You don't have enough cash to buy that %tde!"
       +msgstr ""
       +
       +#: src/gtk_client.c:1164 src/gtk_client.c:1873
        msgid "_Yes"
        msgstr ""
        
       -#: src/gtk_client.c:1134 src/gtk_client.c:1845
       +#: src/gtk_client.c:1164 src/gtk_client.c:1873
        msgid "_No"
        msgstr ""
        
       -#: src/gtk_client.c:1135
       +#: src/gtk_client.c:1165
        msgid "_Attack"
        msgstr ""
        
       -#: src/gtk_client.c:1135
       +#: src/gtk_client.c:1165
        msgid "_Evade"
        msgstr ""
        
       -#: src/gtk_client.c:1153
       +#: src/gtk_client.c:1183
        msgid "Question"
        msgstr ""
        
       -#: src/gtk_client.c:1282
       +#: src/gtk_client.c:1312
        msgid "Space"
        msgstr ""
        
       -#: src/gtk_client.c:1287
       +#: src/gtk_client.c:1317
        msgid "Cash"
        msgstr ""
        
       -#: src/gtk_client.c:1292
       +#: src/gtk_client.c:1322
        msgid "Debt"
        msgstr ""
        
       -#: src/gtk_client.c:1297
       +#: src/gtk_client.c:1327
        msgid "Bank"
        msgstr ""
        
       -#: src/gtk_client.c:1312
       +#: src/gtk_client.c:1342
        msgid "Health"
        msgstr ""
        
       -#: src/gtk_client.c:1332
       +#: src/gtk_client.c:1362
        msgid "_Jet!"
        msgstr ""
        
       -#: src/gtk_client.c:1363
       +#: src/gtk_client.c:1392
        msgid "dopewars"
        msgstr ""
        
       -#: src/gtk_client.c:1446
       +#: src/gtk_client.c:1474
        msgid "Drug Dealing and Research"
        msgstr ""
        
       -#: src/gtk_client.c:1447
       +#: src/gtk_client.c:1475
        msgid "Play Testing"
        msgstr ""
        
       -#: src/gtk_client.c:1448
       +#: src/gtk_client.c:1476
        msgid "Extensive Play Testing"
        msgstr ""
        
       -#: src/gtk_client.c:1450
       +#: src/gtk_client.c:1478
        msgid "Constructive Criticism"
        msgstr ""
        
       -#: src/gtk_client.c:1452
       +#: src/gtk_client.c:1480
        msgid "Unconstructive Criticism"
        msgstr ""
        
       -#: src/gtk_client.c:1456
       +#: src/gtk_client.c:1484
        msgid "About dopewars"
        msgstr ""
        
       -#: src/gtk_client.c:1465
       +#: src/gtk_client.c:1493
        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,245 +1681,243 @@ msgid ""
        "have one month of game time to make your fortune.\n"
        msgstr ""
        
       -#: src/gtk_client.c:1473
       +#: src/gtk_client.c:1501
        #, 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:1491
       +#: src/gtk_client.c:1519
        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 available options."
        msgstr ""
        
       -#: src/gtk_client.c:1529 src/gtk_client.c:1552
       +#: src/gtk_client.c:1557 src/gtk_client.c:1580
        #, c-format
        msgid "Status: Could not connect (%s)"
        msgstr ""
        
       -#: src/gtk_client.c:1540
       +#: src/gtk_client.c:1568
        #, c-format
        msgid "Status: Attempting to contact %s..."
        msgstr ""
        
       -#: src/gtk_client.c:1600
       +#: src/gtk_client.c:1628
        #, c-format
        msgid "%d of %d"
        msgstr ""
        
       -#: src/gtk_client.c:1664 src/gtk_client.c:1705 src/gtk_client.c:1746
       +#: src/gtk_client.c:1692 src/gtk_client.c:1733 src/gtk_client.c:1774
        msgid "Server"
        msgstr ""
        
       -#: src/gtk_client.c:1665 src/gtk_client.c:1720
       +#: src/gtk_client.c:1693 src/gtk_client.c:1748
        msgid "Port"
        msgstr ""
        
       -#: src/gtk_client.c:1666
       +#: src/gtk_client.c:1694
        msgid "Version"
        msgstr ""
        
       -#: src/gtk_client.c:1667
       +#: src/gtk_client.c:1695
        msgid "Players"
        msgstr ""
        
       -#: src/gtk_client.c:1668
       +#: src/gtk_client.c:1696
        msgid "Comment"
        msgstr ""
        
       -#: src/gtk_client.c:1681
       +#: src/gtk_client.c:1709
        msgid "New Game"
        msgstr ""
        
       -#: src/gtk_client.c:1690
       +#: src/gtk_client.c:1718
        msgid "Hey dude, what's your _name?"
        msgstr ""
        
       -#: src/gtk_client.c:1712
       +#: src/gtk_client.c:1740
        msgid "Host name"
        msgstr ""
        
       -#: src/gtk_client.c:1735 src/gtk_client.c:1798
       +#: src/gtk_client.c:1763 src/gtk_client.c:1826
        msgid "_Connect"
        msgstr ""
        
       -#: src/gtk_client.c:1748 src/gtk_client.c:1769
       +#: src/gtk_client.c:1776 src/gtk_client.c:1797
        msgid "Single player"
        msgstr ""
        
       -#: src/gtk_client.c:1754
       +#: src/gtk_client.c:1782
        msgid "_Antique mode"
        msgstr ""
        
       -#: src/gtk_client.c:1761
       +#: src/gtk_client.c:1789
        msgid "_Start single-player game"
        msgstr ""
        
       -#: src/gtk_client.c:1771 src/gtk_client.c:1809
       +#: src/gtk_client.c:1799 src/gtk_client.c:1837
        msgid "Metaserver"
        msgstr ""
        
       -#: src/gtk_client.c:1788
       +#: src/gtk_client.c:1816
        msgid "_Update"
        msgstr ""
        
       -#: src/gtk_client.c:1813
       +#: src/gtk_client.c:1841
        msgid "Status: Waiting for user input"
        msgstr ""
        
       -#: src/gtk_client.c:1965
       +#: src/gtk_client.c:1993
        #, c-format
        msgid "Cash: %s"
        msgstr ""
        
       -#: src/gtk_client.c:1972
       +#: src/gtk_client.c:2000
        #, c-format
        msgid "Debt: %s"
        msgstr ""
        
       -#: src/gtk_client.c:1975
       +#: src/gtk_client.c:2003
        #, c-format
        msgid "Bank: %s"
        msgstr ""
        
       -#: src/gtk_client.c:1983
       +#: src/gtk_client.c:2011
        msgid "Pay back:"
        msgstr ""
        
       -#: src/gtk_client.c:1986
       +#: src/gtk_client.c:2014
        msgid "Deposit"
        msgstr ""
        
       -#: src/gtk_client.c:1990
       +#: src/gtk_client.c:2018
        msgid "Withdraw"
        msgstr ""
        
       -#: src/gtk_client.c:2014
       +#: src/gtk_client.c:2042
        msgid "Pay all"
        msgstr ""
        
       -#: src/gtk_client.c:2036
       +#: src/gtk_client.c:2064
        msgid "Player List"
        msgstr ""
        
       -#: src/gtk_client.c:2124
       +#: src/gtk_client.c:2152
        msgid "Talk to player(s)"
        msgstr ""
        
       -#: src/gtk_client.c:2146
       +#: src/gtk_client.c:2174
        msgid "Talk to all players"
        msgstr ""
        
       -#: src/gtk_client.c:2150
       +#: src/gtk_client.c:2178
        msgid "Message:-"
        msgstr ""
        
       -#: src/gtk_client.c:2163
       +#: src/gtk_client.c:2191
        msgid "Send"
        msgstr ""
        
       -#: src/gtk_client.c:2254
       +#: src/gtk_client.c:2283
        msgid "Spy On Player"
        msgstr ""
        
       -#: src/gtk_client.c:2256
       -#, c-format
       +#: src/gtk_client.c:2285
        msgid ""
       -"Please choose the player to spy on. Your %s will\n"
       +"Please choose the player to spy on. Your %tde will\n"
        "then offer his services to the player, and if successful,\n"
        "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!"
       +"\"Get spy reports\" menu. Remember that the %tde will leave\n"
       +"you, so any %tde or %tde that he's carrying may be lost!"
        msgstr ""
        
       -#: src/gtk_client.c:2264
       +#: src/gtk_client.c:2295
        msgid "Tip Off The Cops"
        msgstr ""
        
       -#: src/gtk_client.c:2266
       -#, c-format
       +#: src/gtk_client.c:2297
        msgid ""
       -"Please choose the player to tip off the cops to. Your %s will\n"
       +"Please choose the player to tip off the cops to. Your %tde will\n"
        "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!"
       +"on the encounter. Remember that the %tde will leave you temporarily,\n"
       +"so any %tde or %tde that he's carrying may be lost!"
        msgstr ""
        
       -#: src/gtk_client.c:2306
       -#, c-format
       -msgid "Sack %s"
       +#: src/gtk_client.c:2339
       +msgid "Sack %Tde"
        msgstr ""
        
       -#: src/gtk_client.c:2307
       -#, c-format
       +#: src/gtk_client.c:2343
        msgid ""
       -"Are you sure? (Any %s or %s carried\n"
       -"by this %s may be lost!)"
       +"Are you sure? (Any %tde or %tde carried\n"
       +"by this %tde may be lost!)"
        msgstr ""
        
       -#: src/gtk_client.c:2327
       +#: src/gtk_client.c:2366
        msgid "Name"
        msgstr ""
        
       -#: src/gtk_client.c:2328
       +#: src/gtk_client.c:2367
        msgid "Price"
        msgstr ""
        
       -#: src/gtk_client.c:2329
       +#: src/gtk_client.c:2368
        msgid "Number"
        msgstr ""
        
       -#: src/gtk_client.c:2331
       +#: src/gtk_client.c:2370
        msgid "_Buy ->"
        msgstr ""
        
       -#: src/gtk_client.c:2332
       +#: src/gtk_client.c:2371
        msgid "<- _Sell"
        msgstr ""
        
       -#: src/gtk_client.c:2333
       +#: src/gtk_client.c:2372
        msgid "_Drop <-"
        msgstr ""
        
       -#: src/gtk_client.c:2338
       -#, c-format
       -msgid "%s here"
       +#: src/gtk_client.c:2377
       +msgid "%Tde here"
        msgstr ""
        
       -#: src/gtk_client.c:2341
       -#, c-format
       -msgid "%s carried"
       +#: src/gtk_client.c:2382
       +msgid "%Tde carried"
        msgstr ""
        
       -#: src/gtk_client.c:2417
       +#: src/gtk_client.c:2460
        msgid "Change Name"
        msgstr ""
        
       -#: src/gtk_client.c:2427
       +#: src/gtk_client.c:2470
        msgid ""
        "Unfortunately, somebody else is already using \"your\" name. Please change "
        "it:-"
        msgstr ""
        
       -#: src/gtk_client.c:2486
       +#: src/gtk_client.c:2507
       +msgid "**GunShop window title** %Tde"
       +msgstr ""
       +
       +#: src/gtk_client.c:2531
        msgid "Done"
        msgstr ""
        
       -#: src/gtk_client.c:2519
       +#: src/gtk_client.c:2564
        msgid "Spy reports"
        msgstr ""
        
       -#: src/gtk_client.c:2590
       +#: src/gtk_client.c:2630
        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 ""
        
       -#: src/serverside.c:71
       +#: src/serverside.c:72
        #, c-format
        msgid ""
        "dopewars server version %s commands and settings\n"
       t@@ -1906,103 +1939,103 @@ msgid ""
        "\n"
        msgstr ""
        
       -#: src/serverside.c:103
       +#: src/serverside.c:104
        msgid "cannot send data to metaserver\n"
        msgstr ""
        
       -#: src/serverside.c:125
       +#: src/serverside.c:126
        #, c-format
        msgid "Sending data to metaserver at %s\n"
        msgstr ""
        
       -#: src/serverside.c:127
       +#: src/serverside.c:128
        #, c-format
        msgid "Notifying metaserver at %s\n"
        msgstr ""
        
       -#: src/serverside.c:130
       +#: src/serverside.c:131
        msgid "cannot locate metaserver\n"
        msgstr ""
        
       -#: src/serverside.c:135
       +#: src/serverside.c:136
        msgid "cannot create socket for metaserver communication\n"
        msgstr ""
        
       -#: src/serverside.c:169
       +#: src/serverside.c:170
        msgid "cannot read high score file\n"
        msgstr ""
        
       -#: src/serverside.c:268
       +#: src/serverside.c:269
        #, c-format
        msgid "MaxClients (%d) exceeded - dropping connection"
        msgstr ""
        
       -#: src/serverside.c:272
       +#: src/serverside.c:273
        msgid ""
        "Sorry, but this server has a limit of 1 player, which has been "
        "reached.^Please try connecting again later."
        msgstr ""
        
       -#: src/serverside.c:277
       +#: src/serverside.c:278
        #, c-format
        msgid ""
        "Sorry, but this server has a limit of %d players, which has been "
        "reached.^Please try connecting again later."
        msgstr ""
        
       -#: src/serverside.c:290
       +#: src/serverside.c:291
        #, c-format
        msgid "%s will now be known as %s"
        msgstr ""
        
       -#: src/serverside.c:305
       +#: src/serverside.c:306
        msgid "Your dealing time is up..."
        msgstr ""
        
       -#: src/serverside.c:316
       +#: src/serverside.c:317
        #, c-format
        msgid "%s: DENIED jet to %s"
        msgstr ""
        
       -#: src/serverside.c:362
       +#: src/serverside.c:363
        #, c-format
        msgid "%s now spying on %s"
        msgstr ""
        
       -#: src/serverside.c:370
       +#: src/serverside.c:371
        #, c-format
        msgid "%s spy on %s: DENIED"
        msgstr ""
        
       -#: src/serverside.c:376
       +#: src/serverside.c:377
        #, c-format
        msgid "%s tipped off the cops to %s"
        msgstr ""
        
       -#: src/serverside.c:384
       +#: src/serverside.c:385
        #, c-format
        msgid "%s tipoff about %s: DENIED"
        msgstr ""
        
       -#: src/serverside.c:490
       +#: src/serverside.c:491
        msgid "--More--"
        msgstr ""
        
       -#: src/serverside.c:501
       +#: src/serverside.c:502
        msgid "Pager exited abnormally - using stdout instead..."
        msgstr ""
        
       -#: src/serverside.c:516
       +#: src/serverside.c:517
        #, c-format
        msgid "Maintaining pid file %s"
        msgstr ""
        
       -#: src/serverside.c:520
       +#: src/serverside.c:521
        #, c-format
        msgid "Cannot create pid file %s"
        msgstr ""
        
       -#: src/serverside.c:569
       +#: src/serverside.c:570
        #, c-format
        msgid ""
        "Cannot open high score file %s.\n"
       t@@ -2010,252 +2043,241 @@ msgid ""
        "specify an alternate high score file with the -f command line option."
        msgstr ""
        
       -#: src/serverside.c:606
       +#: src/serverside.c:607
        #, 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:623
       +#: src/serverside.c:624
        msgid "Cannot install SIGUSR1 interrupt handler!"
        msgstr ""
        
       -#: src/serverside.c:629
       +#: src/serverside.c:630
        msgid "Cannot install SIGINT interrupt handler!"
        msgstr ""
        
       -#: src/serverside.c:632
       +#: src/serverside.c:633
        msgid "Cannot install SIGTERM interrupt handler!"
        msgstr ""
        
       -#: src/serverside.c:635
       +#: src/serverside.c:636
        msgid "Cannot install SIGHUP interrupt handler!"
        msgstr ""
        
       -#: src/serverside.c:640
       +#: src/serverside.c:641
        msgid "Cannot install pipe handler!"
        msgstr ""
        
       -#: src/serverside.c:663
       +#: src/serverside.c:664
        msgid "Users currently logged on:-\n"
        msgstr ""
        
       -#: src/serverside.c:668
       +#: src/serverside.c:669
        msgid "No users currently logged on!"
        msgstr ""
        
       -#: src/serverside.c:672
       +#: src/serverside.c:673
        #, c-format
        msgid "Pushing %s"
        msgstr ""
        
       -#: src/serverside.c:674 src/serverside.c:682
       +#: src/serverside.c:675 src/serverside.c:683
        msgid "No such user!"
        msgstr ""
        
       -#: src/serverside.c:678
       +#: src/serverside.c:679
        #, c-format
        msgid "%s killed"
        msgstr ""
        
       -#: src/serverside.c:684
       +#: src/serverside.c:685
        msgid "Unknown command - try \"help\" for help..."
        msgstr ""
        
       -#: src/serverside.c:701
       +#: src/serverside.c:702
        #, c-format
        msgid "got connection from %s"
        msgstr ""
        
       -#: src/serverside.c:717
       +#: src/serverside.c:718
        #, c-format
        msgid "%s leaves the server!"
        msgstr ""
        
       -#: src/serverside.c:785
       +#: src/serverside.c:786
        msgid "Standard input closed."
        msgstr ""
        
       -#: src/serverside.c:928
       +#: src/serverside.c:929
        #, c-format
        msgid "Unable to read high score file %s"
        msgstr ""
        
       -#: src/serverside.c:948
       +#: src/serverside.c:949
        msgid "Congratulations! You made the high scores!"
        msgstr ""
        
       -#: src/serverside.c:961
       +#: src/serverside.c:962
        msgid "You didn't even make the high score table..."
        msgstr ""
        
       -#: src/serverside.c:975
       +#: src/serverside.c:976
        #, c-format
        msgid "Unable to write high score file %s"
        msgstr ""
        
       -#: src/serverside.c:994
       +#: src/serverside.c:995
        msgid "(R.I.P.)"
        msgstr ""
        
       -#: src/serverside.c:1029
       +#: src/serverside.c:1032
        #, c-format
        msgid "%s: Tipoff from %s"
        msgstr ""
        
       -#: src/serverside.c:1046
       -#, c-format
       -msgid "One of your %s was spying for %s.^The spy %s!"
       +#: src/serverside.c:1050
       +msgid "One of your %tde was spying for %s.^The spy %s!"
        msgstr ""
        
       -#: src/serverside.c:1054
       +#: src/serverside.c:1060
        #, c-format
        msgid "Your spy working with %s has been discovered!^The spy %s!"
        msgstr ""
        
       -#: src/serverside.c:1077
       +#: src/serverside.c:1083
        #, c-format
        msgid " The lady next to you on the subway said,^ \"%s\"%s"
        msgstr ""
        
       -#: src/serverside.c:1080
       +#: src/serverside.c:1086
        msgid "^    (at least, you -think- that's what she said)"
        msgstr ""
        
       -#: src/serverside.c:1082
       +#: src/serverside.c:1088
        #, c-format
        msgid " You hear someone playing %s"
        msgstr ""
        
       -#: 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:1129
       -#, c-format
       -msgid "YN^^Would you like to hire %s %s for %s?"
       -msgstr ""
       -
       +#: src/serverside.c:1097 src/serverside.c:1108 src/serverside.c:1119
        #: src/serverside.c:1130
       -msgid "an"
       +msgid "YN^Would you like to visit %tde?"
        msgstr ""
        
       -#: src/serverside.c:1130
       -msgid "a"
       +#: src/serverside.c:1143
       +msgid "YN^^Would you like to hire a %tde for %s?"
        msgstr ""
        
       -#: src/serverside.c:1142
       +#: src/serverside.c:1158
        #, c-format
        msgid "AE^%s is already here!^Do you Attack, or Evade?"
        msgstr ""
        
       -#: src/serverside.c:1465
       +#: src/serverside.c:1480
        msgid "You were mugged in the subway!"
        msgstr ""
        
       -#: src/serverside.c:1476
       +#: src/serverside.c:1491
        #, c-format
        msgid "You meet a friend! He gives you %d %s."
        msgstr ""
        
       -#: src/serverside.c:1481
       +#: src/serverside.c:1496
        #, c-format
        msgid "You meet a friend! You give him %d %s."
        msgstr ""
        
       -#: src/serverside.c:1490
       +#: src/serverside.c:1505
        msgid "Sanitized away a RandomOffer"
        msgstr ""
        
       -#: src/serverside.c:1495
       +#: src/serverside.c:1510
        #, c-format
        msgid ""
        "Police dogs chase you for %d blocks! You dropped some %s! That's a drag, man!"
        msgstr ""
        
       -#: src/serverside.c:1511
       +#: src/serverside.c:1526
        #, c-format
        msgid "You find %d %s on a dead dude in the subway!"
        msgstr ""
        
       -#: src/serverside.c:1523
       +#: src/serverside.c:1538
        #, c-format
        msgid "Your mama made brownies with some of your %s! They were great!"
        msgstr ""
        
       -#: src/serverside.c:1533
       +#: src/serverside.c:1548
        msgid ""
        "YN^There is some weed that smells like paraquat here!^It looks good! Will "
        "you smoke it? "
        msgstr ""
        
       -#: src/serverside.c:1540
       +#: src/serverside.c:1555
        #, c-format
        msgid "You stopped to %s."
        msgstr ""
        
       -#: src/serverside.c:1561
       +#: src/serverside.c:1576
        #, c-format
        msgid "Would you like to buy a bigger trenchcoat for %s?"
        msgstr ""
        
       -#: src/serverside.c:1566
       +#: src/serverside.c:1581
        #, c-format
        msgid "YN^Hey dude! I'll help carry your %s for a mere %s. Yes or no?"
        msgstr ""
        
       -#: src/serverside.c:1578
       +#: src/serverside.c:1593
        #, c-format
        msgid "YN^Would you like to buy a %s for %s?"
        msgstr ""
        
       -#: src/serverside.c:1684 src/serverside.c:1777
       +#: src/serverside.c:1699 src/serverside.c:1792
        #, c-format
        msgid "%s: offer was on behalf of %s"
        msgstr ""
        
       -#: src/serverside.c:1687
       +#: src/serverside.c:1702
        #, c-format
        msgid "%s has accepted your %s!^Use the G key to contact your spy."
        msgstr ""
        
       -#: src/serverside.c:1733
       +#: src/serverside.c:1748
        msgid ""
        "You hallucinated for three days on the wildest trip you ever imagined!^Then "
        "you died because your brain disintegrated!"
        msgstr ""
        
       -#: src/serverside.c:1757
       +#: src/serverside.c:1772
        #, c-format
        msgid "Too late - %s has just left!"
        msgstr ""
        
       -#: src/serverside.c:1780
       +#: src/serverside.c:1795
        #, c-format
        msgid "%s has rejected your %s!"
        msgstr ""
        
       -#: src/serverside.c:1823
       +#: src/serverside.c:1838
        msgid "YN^Officer %%s spots you dropping %s, and chases you!"
        msgstr ""
        
       -#: src/serverside.c:1825
       +#: src/serverside.c:1840
        msgid ""
        "YN^Officer %%s and %%d of his deputies spot you dropping %s, and chase you!"
        msgstr ""
        
       -#: src/serverside.c:1984
       +#: src/serverside.c:1999
        msgid "Player removed due to idle timeout"
        msgstr ""
        
       -#: src/serverside.c:1994
       +#: src/serverside.c:2009
        msgid "Player removed due to connect timeout"
        msgstr ""
        
       -#: src/message.c:524
       +#: src/message.c:525
        #, c-format
        msgid ""
        "This server is version %s, while your client is version %s.\n"
       t@@ -2264,150 +2286,146 @@ msgid ""
        "for the latest version."
        msgstr ""
        
       -#: src/message.c:667
       +#: src/message.c:668
        msgid "Could not find host"
        msgstr ""
        
       -#: src/message.c:668
       +#: src/message.c:669
        msgid "Could not create network socket"
        msgstr ""
        
       -#: src/message.c:669 src/message.c:702
       +#: src/message.c:670 src/message.c:703
        msgid "Connection refused or no server present"
        msgstr ""
        
       -#: src/message.c:861
       +#: src/message.c:862
        msgid "Cannot locate metaserver"
        msgstr ""
        
       -#: src/message.c:862
       +#: src/message.c:863
        msgid "Cannot create socket"
        msgstr ""
        
       -#: src/message.c:864
       +#: src/message.c:865
        msgid "Metaserver not running HTTP or connection denied"
        msgstr ""
        
       -#: src/message.c:944
       +#: src/message.c:945
        msgid "Do you run?"
        msgstr ""
        
       -#: src/message.c:947
       +#: src/message.c:948
        msgid "Do you run, or fight?"
        msgstr ""
        
       -#: src/message.c:1048
       +#: src/message.c:1051
        msgid "pitifully armed"
        msgstr ""
        
       -#: src/message.c:1049
       +#: src/message.c:1052
        msgid "lightly armed"
        msgstr ""
        
       -#: src/message.c:1050
       +#: src/message.c:1053
        msgid "moderately well armed"
        msgstr ""
        
       -#: src/message.c:1051
       +#: src/message.c:1054
        msgid "heavily armed"
        msgstr ""
        
       -#: src/message.c:1052
       +#: src/message.c:1055
        msgid "armed to the teeth"
        msgstr ""
        
       -#: src/message.c:1054
       -#, c-format
       -msgid "%s arrives with %d %s, %s!"
       +#: src/message.c:1057
       +msgid "%s arrives with %d %tde, %s!"
        msgstr ""
        
       -#: src/message.c:1060
       +#: src/message.c:1065
        #, c-format
        msgid "%s stands and takes it"
        msgstr ""
        
       -#: src/message.c:1062
       +#: src/message.c:1067
        msgid "You stand there like a dummy."
        msgstr ""
        
       -#: src/message.c:1067
       +#: src/message.c:1072
        #, c-format
        msgid "%s has got away!"
        msgstr ""
        
       -#: src/message.c:1069
       +#: src/message.c:1074
        msgid "You got away!"
        msgstr ""
        
       -#: src/message.c:1074
       +#: src/message.c:1079
        msgid "Guns reloaded..."
        msgstr ""
        
       -#: src/message.c:1079
       +#: src/message.c:1084
        #, c-format
        msgid "%s shoots at %s... and misses!"
        msgstr ""
        
       -#: src/message.c:1082
       +#: src/message.c:1087
        #, c-format
        msgid "%s shoots at you... and misses!"
        msgstr ""
        
       -#: src/message.c:1085
       +#: src/message.c:1090
        #, c-format
        msgid "You missed %s!"
        msgstr ""
        
       -#: src/message.c:1091
       +#: src/message.c:1096
        #, c-format
        msgid "%s shoots %s dead."
        msgstr ""
        
       -#: src/message.c:1094
       -#, c-format
       -msgid "%s shoots at %s and kills a %s!"
       +#: src/message.c:1099
       +msgid "%s shoots at %s and kills a %tde!"
        msgstr ""
        
       -#: src/message.c:1097
       +#: src/message.c:1104
        #, c-format
        msgid "%s shoots at %s."
        msgstr ""
        
       -#: src/message.c:1102
       +#: src/message.c:1109
        #, c-format
        msgid "%s wasted you, man! What a drag!"
        msgstr ""
        
       -#: src/message.c:1105
       -#, c-format
       -msgid "%s shoots at you... and kills a %s!"
       +#: src/message.c:1113
       +msgid "%s shoots at you... and kills a %tde!"
        msgstr ""
        
       -#: src/message.c:1108
       +#: src/message.c:1118
        #, c-format
        msgid "%s hits you, man!"
        msgstr ""
        
       -#: src/message.c:1112
       +#: src/message.c:1122
        #, c-format
        msgid "You killed %s!"
        msgstr ""
        
       -#: src/message.c:1114
       -#, c-format
       -msgid "You hit %s, and killed a %s!"
       +#: src/message.c:1124
       +msgid "You hit %s, and killed a %tde!"
        msgstr ""
        
       -#: src/message.c:1117
       +#: src/message.c:1129
        #, c-format
        msgid "You hit %s!"
        msgstr ""
        
       -#: src/message.c:1120
       +#: src/message.c:1132
        msgid " You loot the body!"
        msgstr ""
        
       -#: src/message.c:1123
       +#: src/message.c:1135
        #, c-format
        msgid " (Health: %d)"
        msgstr ""
 (DIR) diff --git a/src/Makefile.am b/src/Makefile.am
       t@@ -1,7 +1,7 @@
        bin_PROGRAMS = dopewars
        dopewars_SOURCES = AIPlayer.c serverside.c dopewars.c message.c \
                           curses_client.c gtk_client.c win32_client.c \
       -                   dopeos.c @WIN_RC@
       +                   dopeos.c tstring.c @WIN_RC@
        dopewars_DEPENDENCIES = @WIN_RES@
        SUFFIXES = .rc .res
        INCLUDES = @GTK_CFLAGS@ -I.. -I.
 (DIR) diff --git a/src/Makefile.in b/src/Makefile.in
       t@@ -90,7 +90,7 @@ l = @l@
        localedir = @localedir@
        
        bin_PROGRAMS = dopewars
       -dopewars_SOURCES = AIPlayer.c serverside.c dopewars.c message.c                    curses_client.c gtk_client.c win32_client.c                    dopeos.c @WIN_RC@
       +dopewars_SOURCES = AIPlayer.c serverside.c dopewars.c message.c                    curses_client.c gtk_client.c win32_client.c                    dopeos.c tstring.c @WIN_RC@
        
        dopewars_DEPENDENCIES = @WIN_RES@
        SUFFIXES = .rc .res
       t@@ -110,7 +110,7 @@ CPPFLAGS = @CPPFLAGS@
        LDFLAGS = @LDFLAGS@
        LIBS = @LIBS@
        dopewars_OBJECTS =  AIPlayer.o serverside.o dopewars.o message.o \
       -curses_client.o gtk_client.o win32_client.o dopeos.o
       +curses_client.o gtk_client.o win32_client.o dopeos.o tstring.o
        dopewars_LDADD = $(LDADD)
        dopewars_LDFLAGS = 
        CFLAGS = @CFLAGS@
       t@@ -126,7 +126,7 @@ TAR = gtar
        GZIP_ENV = --best
        DEP_FILES =  .deps/AIPlayer.P .deps/curses_client.P .deps/dopeos.P \
        .deps/dopewars.P .deps/gtk_client.P .deps/message.P .deps/serverside.P \
       -.deps/win32_client.P
       +.deps/tstring.P .deps/win32_client.P
        SOURCES = $(dopewars_SOURCES)
        OBJECTS = $(dopewars_OBJECTS)
        
 (DIR) diff --git a/src/gtk_client.c b/src/gtk_client.c
       t@@ -34,6 +34,7 @@
        #include "gtk_client.h"
        #include "message.h"
        #include "serverside.h"
       +#include "tstring.h"
        
        #define BT_BUY  (GINT_TO_POINTER(1))
        #define BT_SELL (GINT_TO_POINTER(2))
       t@@ -202,7 +203,6 @@ void ListScores(GtkWidget *widget,gpointer data) {
        void ListInventory(GtkWidget *widget,gpointer data) {
           GtkWidget *window,*button,*hsep,*vbox,*hbox;
           GtkAccelGroup *accel_group;
       -   gchar *caps;
        
           if (IsShowingInventory) return;
           window=gtk_window_new(GTK_WINDOW_DIALOG);
       t@@ -225,12 +225,10 @@ void ListInventory(GtkWidget *widget,gpointer data) {
           vbox=gtk_vbox_new(FALSE,7);
        
           hbox=gtk_hbox_new(FALSE,7);
       -   caps=InitialCaps(Names.Drugs);
       -   CreateInventory(hbox,caps,accel_group,FALSE,FALSE,
       -                   &ClientData.InvenDrug,NULL); g_free(caps);
       -   caps=InitialCaps(Names.Guns);
       -   CreateInventory(hbox,caps,accel_group,FALSE,FALSE,
       -                   &ClientData.InvenGun,NULL); g_free(caps);
       +   CreateInventory(hbox,Names.Drugs,accel_group,FALSE,FALSE,
       +                   &ClientData.InvenDrug,NULL);
       +   CreateInventory(hbox,Names.Guns,accel_group,FALSE,FALSE,
       +                   &ClientData.InvenGun,NULL);
        
           gtk_box_pack_start(GTK_BOX(vbox),hbox,TRUE,TRUE,0);
        
       t@@ -290,6 +288,7 @@ void HandleClientMessage(char *pt,Player *Play) {
           gboolean Handled;
           GtkWidget *MenuItem;
           GSList *list;
       +   gchar *tfmt,**tstr;
        
           if (ProcessMessage(pt,Play,&From,&AICode,&Code,&Data,FirstClient)==-1) {
              return;
       t@@ -358,9 +357,11 @@ void HandleClientMessage(char *pt,Player *Play) {
                    tmp=(Player *)list->data;
                    tmp->Flags &= ~FIGHTING;
                 }
       -         text=g_strdup_printf(_("Jetting to %s"),
       -                              Location[(int)Play->IsAt].Name);
       +         tstring_fmt(&tfmt,&tstr,_("Jetting to %tde"),
       +                     Location[(int)Play->IsAt].Name);
       +         text=g_strdup_printf(tfmt,tstr[0]);
                 PrintMessage(text); g_free(text);
       +         tstring_free(tfmt,tstr);
                 break;
              case C_ENDLIST:
                 MenuItem=gtk_item_factory_get_widget(ClientData.Menu,
       t@@ -513,6 +514,7 @@ static void CreateFightDialog() {
           GtkAdjustment *adj;
           GtkAccelGroup *accel_group;
           gchar *buf;
       +   gchar *tfmt,**tstr;
        
           FightDialog=dialog=gtk_window_new(GTK_WINDOW_DIALOG);
           gtk_signal_connect(GTK_OBJECT(dialog),"delete_event",
       t@@ -547,7 +549,9 @@ static void CreateFightDialog() {
           gtk_widget_show(hsep);
        
           hbbox=gtk_hbutton_box_new();
       -   buf=g_strdup_printf(_("_Deal %s"),Names.Drugs);
       +   tstring_fmt(&tfmt,&tstr,_("_Deal %Tde"),Names.Drugs);
       +   buf=g_strdup_printf(tfmt,tstr[0]);
       +   tstring_free(tfmt,tstr);
           button=AddFightButton(buf,accel_group,GTK_BOX(hbbox),'D');
           gtk_widget_show(button);
        
       t@@ -610,8 +614,9 @@ void DisplayFightMessage(char *Data) {
        }
        
        void DisplayStats(Player *Play,struct StatusWidgets *Status) {
       -   gchar *prstr,*caps;
       +   gchar *prstr;
           GString *text;
       +   gchar *tfmt,**tstr;
        
           text=g_string_new(NULL);
        
       t@@ -636,16 +641,16 @@ void DisplayStats(Player *Play,struct StatusWidgets *Status) {
           gtk_label_set_text(GTK_LABEL(Status->DebtValue),prstr);
           g_free(prstr);
        
       -   caps=InitialCaps(Names.Guns);
       -   gtk_label_set_text(GTK_LABEL(Status->GunsName),caps);
       -   g_free(caps);
       +   tstring_fmt(&tfmt,&tstr,_("**Stats: Guns** %Tde"),Names.Guns);
       +   gtk_label_set_text(GTK_LABEL(Status->GunsName),tstr[0]);
       +   tstring_free(tfmt,tstr);
           g_string_sprintf(text,"%d",TotalGunsCarried(Play));
           gtk_label_set_text(GTK_LABEL(Status->GunsValue),text->str);
        
           if (!WantAntique) {
       -      caps=InitialCaps(Names.Bitches);
       -      gtk_label_set_text(GTK_LABEL(Status->BitchesName),caps);
       -      g_free(caps);
       +      tstring_fmt(&tfmt,&tstr,_("**Stats: Bitches** %Tde"),Names.Bitches);
       +      gtk_label_set_text(GTK_LABEL(Status->BitchesName),tstr[0]);
       +      tstring_free(tfmt,tstr);
              g_string_sprintf(text,"%d",Play->Bitches.Carried);
              gtk_label_set_text(GTK_LABEL(Status->BitchesValue),text->str);
           } else {
       t@@ -868,6 +873,7 @@ static void UpdateDealDialog() {
           GtkAdjustment *spin_adj;
           gint DrugInd,CanDrop,CanCarry,CanAfford,MaxDrug;
           Player *Play;
       +   gchar *tfmt,**tstr;
        
           text=g_string_new(NULL);
           DrugInd=DealDialog.DrugInd;
       t@@ -879,8 +885,10 @@ static void UpdateDealDialog() {
           gtk_label_set_text(GTK_LABEL(DealDialog.cost),text->str);
        
           CanDrop=Play->Drugs[DrugInd].Carried;
       -   g_string_sprintf(text,_("You are currently carrying %d %s"),
       -                    CanDrop,Drug[DrugInd].Name);
       +   tstring_fmt(&tfmt,&tstr,_("You are currently carrying %d %tde"),
       +               Drug[DrugInd].Name);
       +   g_string_sprintf(text,tfmt,CanDrop,tstr[0]);
       +   tstring_free(tfmt,tstr);
           gtk_label_set_text(GTK_LABEL(DealDialog.carrying),text->str);
        
           CanCarry=Play->CoatSize;
       t@@ -1028,7 +1036,13 @@ void DealDrugs(GtkWidget *widget,gpointer data) {
              gtk_box_pack_start(GTK_BOX(vbox),label,FALSE,FALSE,0);
           }
           hbox=gtk_hbox_new(FALSE,7);
       -   g_string_sprintf(text,_("%s how many?"),Action);
       +   if (data==BT_BUY) {
       +      g_string_sprintf(text,_("Buy how many?"));
       +   } else if (data==BT_SELL) {
       +      g_string_sprintf(text,_("Sell how many?"));
       +   } else {
       +      g_string_sprintf(text,_("Drop how many?"));
       +   }
           label=gtk_label_new(text->str);
           gtk_box_pack_start(GTK_BOX(hbox),label,FALSE,FALSE,0);
           spin_adj=(GtkAdjustment *)gtk_adjustment_new(1.0,1.0,2.0,1.0,10.0,10.0);
       t@@ -1067,6 +1081,7 @@ void DealGuns(GtkWidget *widget,gpointer data) {
           gint row,GunInd;
           gchar *Action,*Title;
           GString *text;
       +   gchar *tfmt,**tstr;
        
           dialog=gtk_widget_get_ancestor(widget,GTK_TYPE_WINDOW);
           if (data==BT_BUY) Action=_("Buy");
       t@@ -1081,24 +1096,39 @@ void DealGuns(GtkWidget *widget,gpointer data) {
              GunInd=GPOINTER_TO_INT(gtk_clist_get_row_data(GTK_CLIST(clist),row));
           } else return;
        
       -   Title=g_strdup_printf("%s %s",Action,Names.Guns);
       +   
       +   if (data==BT_BUY) tstring_fmt(&tfmt,&tstr,_("Buy %tde"),Names.Guns);
       +   else if (data==BT_SELL) tstring_fmt(&tfmt,&tstr,_("Sell %tde"),Names.Guns);
       +   else tstring_fmt(&tfmt,&tstr,_("Drop %tde"),Names.Guns);
       +   Title=g_strdup_printf(tfmt,tstr[0]);
       +   tstring_free(tfmt,tstr);
           text=g_string_new("");
        
           if (data!=BT_BUY && TotalGunsCarried(ClientData.Play)==0) {
       -      g_string_sprintf(text,_("You don't have any %s!"),Names.Guns);
       +      tstring_fmt(&tfmt,&tstr,_("You don't have any %tde!"),Names.Guns);
       +      g_string_sprintf(text,tfmt,tstr[0]);
       +      tstring_free(tfmt,tstr);
              MessageBox(dialog,Title,text->str,MB_OK);
           } else if (data==BT_BUY && TotalGunsCarried(ClientData.Play) >=
                                      ClientData.Play->Bitches.Carried+2) { 
       -      g_string_sprintf(text,_("You'll need more %s to carry any more %s!"),
       -                           Names.Bitches,Names.Guns);
       +      tstring_fmt(&tfmt,&tstr,
       +                  _("You'll need more %tde to carry any more %tde!"),
       +                  Names.Bitches,Names.Guns);
       +      g_string_sprintf(text,tfmt,tstr[0],tstr[1]);
       +      tstring_free(tfmt,tstr);
              MessageBox(dialog,Title,text->str,MB_OK);
           } else if (data==BT_BUY && Gun[GunInd].Space > ClientData.Play->CoatSize) {
       -      g_string_sprintf(text,_("You don't have enough space to carry that %s!"),
       -                           Names.Gun);
       +      tstring_fmt(&tfmt,&tstr,
       +                  _("You don't have enough space to carry that %tde!"),
       +                  Names.Gun);
       +      g_string_sprintf(text,tfmt,tstr[0]);
       +      tstring_free(tfmt,tstr);
              MessageBox(dialog,Title,text->str,MB_OK);
           } else if (data==BT_BUY && Gun[GunInd].Price > ClientData.Play->Cash) {
       -      g_string_sprintf(text,_("You don't have enough cash to buy that %s!"),
       -                           Names.Gun);
       +      tstring_fmt(&tfmt,&tstr,
       +                  _("You don't have enough cash to buy that %tde!"),Names.Gun);
       +      g_string_sprintf(text,tfmt,tstr[0]);
       +      tstring_free(tfmt,tstr);
              MessageBox(dialog,Title,text->str,MB_OK);
           } else if (data==BT_SELL && ClientData.Play->Guns[GunInd].Carried == 0) {
              MessageBox(dialog,Title,_("You don't have any to sell!"),MB_OK);
       t@@ -1341,7 +1371,6 @@ char GtkLoop(int *argc,char **argv[],char ReturnOnFail) {
           GtkAccelGroup *accel_group;
           GtkItemFactory *item_factory;
           GtkAdjustment *adj;
       -   gchar *buf;
           gint nmenu_items = sizeof(menu_items) / sizeof(menu_items[0]);
        
           gtk_set_locale();
       t@@ -1406,9 +1435,8 @@ char GtkLoop(int *argc,char **argv[],char ReturnOnFail) {
           gtk_paned_pack1(GTK_PANED(vpaned),hbox,TRUE,TRUE);
        
           hbox=gtk_hbox_new(FALSE,7);
       -   buf=InitialCaps(Names.Drugs);
       -   CreateInventory(hbox,buf,accel_group,TRUE,TRUE,&ClientData.Drug,
       -                   DealDrugs); g_free(buf);
       +   CreateInventory(hbox,Names.Drugs,accel_group,TRUE,TRUE,&ClientData.Drug,
       +                   DealDrugs);
           clist=ClientData.Drug.HereList;
           gtk_clist_column_titles_active(GTK_CLIST(clist));
           gtk_clist_set_compare_func(GTK_CLIST(clist),DrugSortFunc);
       t@@ -2240,6 +2268,7 @@ void TipOff(GtkWidget *widget,gpointer data) {
        void ErrandDialog(gint ErrandType) {
           GtkWidget *dialog,*clist,*button,*vbox,*hbbox,*hsep,*label;
           gchar *text;
       +   gchar *tfmt,**tstr;
        
           dialog=gtk_window_new(GTK_WINDOW_DIALOG);
           gtk_container_set_border_width(GTK_CONTAINER(dialog),7);
       t@@ -2252,22 +2281,26 @@ void ErrandDialog(gint ErrandType) {
        
           if (ErrandType==ET_SPY) {
              gtk_window_set_title(GTK_WINDOW(dialog),_("Spy On Player"));
       -      text=g_strdup_printf(
       -_("Please choose the player to spy on. Your %s will\n"
       +      tstring_fmt(&tfmt,&tstr,
       +_("Please choose the player to spy on. Your %tde will\n"
        "then offer his services to the player, and if successful,\n"
        "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!"),
       +"\"Get spy reports\" menu. Remember that the %tde will leave\n"
       +"you, so any %tde or %tde that he's carrying may be lost!"),
        Names.Bitch,Names.Bitch,Names.Guns,Names.Drugs);
       +      text=g_strdup_printf(tfmt,tstr[0],tstr[1],tstr[2],tstr[3]);
       +      tstring_free(tfmt,tstr);
              label=gtk_label_new(text); g_free(text);
           } else {
              gtk_window_set_title(GTK_WINDOW(dialog),_("Tip Off The Cops"));
       -      text=g_strdup_printf(
       -_("Please choose the player to tip off the cops to. Your %s will\n"
       +      tstring_fmt(&tfmt,&tstr,
       +_("Please choose the player to tip off the cops to. Your %tde will\n"
        "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!"),
       +"on the encounter. Remember that the %tde will leave you temporarily,\n"
       +"so any %tde or %tde that he's carrying may be lost!"),
        Names.Bitch,Names.Bitch,Names.Guns,Names.Drugs);
       +      text=g_strdup_printf(tfmt,tstr[0],tstr[1],tstr[2],tstr[3]);
       +      tstring_free(tfmt,tstr);
              label=gtk_label_new(text); g_free(text);
           }
        
       t@@ -2301,16 +2334,21 @@ Names.Bitch,Names.Bitch,Names.Guns,Names.Drugs);
        }
        
        void SackBitch(GtkWidget *widget,gpointer data) {
       -   char *caps,*title,*text;
       -   caps=InitialCaps(Names.Bitch);
       -   title=g_strdup_printf(_("Sack %s"),caps);
       -   text=g_strdup_printf(_("Are you sure? (Any %s or %s carried\n"
       -                        "by this %s may be lost!)"),Names.Guns,
       -                        Names.Drugs,Names.Bitch);
       +   char *title,*text;
       +   gchar *tfmt,**tstr;
       +   tstring_fmt(&tfmt,&tstr,_("Sack %Tde"),Names.Bitch);
       +   title=g_strdup_printf(tfmt,tstr[0]);
       +   tstring_free(tfmt,tstr);
       +   tstring_fmt(&tfmt,&tstr,
       +               _("Are you sure? (Any %tde or %tde carried\n"
       +                 "by this %tde may be lost!)"),Names.Guns,
       +               Names.Drugs,Names.Bitch);
       +   text=g_strdup_printf(tfmt,tstr[0],tstr[1],tstr[2]);
       +   tstring_free(tfmt,tstr);
           if (MessageBox(ClientData.window,title,text,MB_YES|MB_NO)==MB_YES) {
              SendClientMessage(ClientData.Play,C_NONE,C_SACKBITCH,NULL,NULL);
           }
       -   g_free(caps); g_free(text); g_free(title);
       +   g_free(text); g_free(title);
        }
        
        void CreateInventory(GtkWidget *hbox,gchar *Objects,GtkAccelGroup *accel_group,
       t@@ -2323,6 +2361,7 @@ void CreateInventory(GtkWidget *hbox,gchar *Objects,GtkAccelGroup *accel_group,
           gchar *titles[2][2];
           gchar *button_text[3];
           gpointer button_type[3]  = { BT_BUY, BT_SELL, BT_DROP };
       +   gchar *tfmt,**tstr;
        
           titles[0][0]=titles[1][0]=_("Name");
           titles[0][1]=_("Price");
       t@@ -2335,10 +2374,14 @@ void CreateInventory(GtkWidget *hbox,gchar *Objects,GtkAccelGroup *accel_group,
           text=g_string_new("");
        
           if (CreateHere) {
       -      g_string_sprintf(text,_("%s here"),Objects);
       +      tstring_fmt(&tfmt,&tstr,_("%Tde here"),Objects);
       +      g_string_sprintf(text,tfmt,tstr[0]);
       +      tstring_free(tfmt,tstr);
              widgets->HereFrame=frame[0]=gtk_frame_new(text->str);
           }
       -   g_string_sprintf(text,_("%s carried"),Objects);
       +   tstring_fmt(&tfmt,&tstr,_("%Tde carried"),Objects);
       +   g_string_sprintf(text,tfmt,tstr[0]);
       +   tstring_free(tfmt,tstr);
           widgets->CarriedFrame=frame[1]=gtk_frame_new(text->str);
        
           widgets->HereList=widgets->CarriedList=NULL;
       t@@ -2452,7 +2495,7 @@ void NewNameDialog() {
        void GunShopDialog() {
           GtkWidget *window,*button,*hsep,*vbox,*hbox;
           GtkAccelGroup *accel_group;
       -   gchar *text;
       +   gchar *tfmt,**tstr;
        
           window=gtk_window_new(GTK_WINDOW_DIALOG);
           gtk_window_set_default_size(GTK_WINDOW(window),600,190);
       t@@ -2460,7 +2503,10 @@ void GunShopDialog() {
                              GTK_SIGNAL_FUNC(SendDoneMessage),NULL);
           accel_group=gtk_accel_group_new();
           gtk_window_add_accel_group(GTK_WINDOW(window),accel_group);
       -   gtk_window_set_title(GTK_WINDOW(window),Names.GunShopName);
       +   tstring_fmt(&tfmt,&tstr,
       +               _("**GunShop window title** %Tde"),Names.GunShopName);
       +   gtk_window_set_title(GTK_WINDOW(window),tstr[0]);
       +   tstring_free(tfmt,tstr);
           gtk_window_set_modal(GTK_WINDOW(window),TRUE);
           gtk_window_set_transient_for(GTK_WINDOW(window),
                                        GTK_WINDOW(ClientData.window));
       t@@ -2474,9 +2520,8 @@ void GunShopDialog() {
           vbox=gtk_vbox_new(FALSE,7);
        
           hbox=gtk_hbox_new(FALSE,7);
       -   text=InitialCaps(Names.Guns);
       -   CreateInventory(hbox,text,accel_group,TRUE,TRUE,&ClientData.Gun,
       -                   DealGuns); g_free(text);
       +   CreateInventory(hbox,Names.Guns,accel_group,TRUE,TRUE,&ClientData.Gun,
       +                   DealGuns);
        
           gtk_box_pack_start(GTK_BOX(vbox),hbox,TRUE,TRUE,0);
        
       t@@ -2544,7 +2589,6 @@ static void CreateSpyReports() {
        void DisplaySpyReports(Player *Play) {
           GtkWidget *dialog,*notebook,*vbox,*hbox,*frame,*label,*table;
           GtkAccelGroup *accel_group;
       -   gchar *caps;
           struct StatusWidgets Status;
           struct InventoryWidgets SpyDrugs,SpyGuns;
        
       t@@ -2561,12 +2605,8 @@ void DisplaySpyReports(Player *Play) {
           gtk_box_pack_start(GTK_BOX(vbox),frame,FALSE,FALSE,0);
        
           hbox=gtk_hbox_new(FALSE,5);
       -   caps=InitialCaps(Names.Drugs);
       -   CreateInventory(hbox,caps,accel_group,FALSE,FALSE,&SpyDrugs,NULL);
       -   g_free(caps);
       -   caps=InitialCaps(Names.Guns);
       -   CreateInventory(hbox,caps,accel_group,FALSE,FALSE,&SpyGuns,NULL);
       -   g_free(caps);
       +   CreateInventory(hbox,Names.Drugs,accel_group,FALSE,FALSE,&SpyDrugs,NULL);
       +   CreateInventory(hbox,Names.Guns,accel_group,FALSE,FALSE,&SpyGuns,NULL);
        
           gtk_box_pack_start(GTK_BOX(vbox),hbox,TRUE,TRUE,0);
           label=gtk_label_new(GetPlayerName(Play));
 (DIR) diff --git a/src/message.c b/src/message.c
       t@@ -38,6 +38,7 @@
        #include "dopeos.h"
        #include "dopewars.h"
        #include "serverside.h"
       +#include "tstring.h"
        #include "message.h"
        
        /* Maximum sizes (in bytes) of read and write buffers - connections should
       t@@ -1044,6 +1045,7 @@ void FormatFightMessage(Player *To,GString *text,
                                int Bitches,int BitchesKilled,int ArmPercent,
                                gchar FightPoint,gboolean Loot) {
           gchar *Armament;
       +   gchar *tfmt,**tstr;
           switch(FightPoint) {
              case F_ARRIVED:
                 Armament= ArmPercent<10 ? _("pitifully armed")       :
       t@@ -1052,8 +1054,10 @@ void FormatFightMessage(Player *To,GString *text,
                           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);
       +            tstring_fmt(&tfmt,&tstr,_("%s arrives with %d %tde, %s!"),
       +                        Names.Bitches);
       +            g_string_sprintfa(text,tfmt,DefendName,Bitches,tstr[0],Armament);
       +            tstring_free(tfmt,tstr);
                 }
                 break;
              case F_STAND:
       t@@ -1092,8 +1096,10 @@ void FormatFightMessage(Player *To,GString *text,
                       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);
       +               tstring_fmt(&tfmt,&tstr,_("%s shoots at %s and kills a %tde!"),
       +                           Names.Bitch);
       +               g_string_sprintfa(text,tfmt,AttackName,DefendName,tstr[0]);
       +               tstring_free(tfmt,tstr);
                     } else {
                       g_string_sprintfa(text,_("%s shoots at %s."),
                                         AttackName,DefendName);
       t@@ -1103,8 +1109,11 @@ void FormatFightMessage(Player *To,GString *text,
                       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);
       +               tstring_fmt(&tfmt,&tstr,
       +                           _("%s shoots at you... and kills a %tde!"),
       +                           Names.Bitch);
       +               g_string_sprintfa(text,tfmt,AttackName,tstr[0]);
       +               tstring_free(tfmt,tstr);
                    } else {
                       g_string_sprintfa(text,_("%s hits you, man!"),AttackName);
                    }
       t@@ -1112,8 +1121,10 @@ void FormatFightMessage(Player *To,GString *text,
                    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);
       +               tstring_fmt(&tfmt,&tstr,_("You hit %s, and killed a %tde!"),
       +                           Names.Bitch);
       +               g_string_sprintfa(text,tfmt,DefendName,tstr[0]);
       +               tstring_free(tfmt,tstr);
                    } else {
                       g_string_sprintfa(text,_("You hit %s!"),DefendName);
                    }
 (DIR) diff --git a/src/message.h b/src/message.h
       t@@ -72,10 +72,6 @@
        #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'
 (DIR) diff --git a/src/serverside.c b/src/serverside.c
       t@@ -35,9 +35,10 @@
        #include <stdlib.h>
        #include <glib.h>
        #include "dopeos.h"
       -#include "serverside.h"
        #include "dopewars.h"
        #include "message.h"
       +#include "serverside.h"
       +#include "tstring.h"
        
        #ifdef HAVE_FCNTL_H
        #include <fcntl.h>
       t@@ -1012,6 +1013,8 @@ void SendEvent(Player *To) {
           Player *Play;
           GSList *list;
           gchar *prstr;
       +   gchar *tfmt,**tstr;
       +
           if (!To) return;
           if (To->EventNum==E_MAX) To->EventNum=E_NONE;
           if (To->EventNum==E_NONE || To->EventNum>=E_OUTOFSYNC) return;
       t@@ -1043,10 +1046,13 @@ void SendEvent(Player *To) {
                           brandom(0,100)<10+To->SpyList.Data[i].Turns) {
                           if (TotalGunsCarried(To) > 0) j=brandom(0,NUMDISCOVER);
                           else j=brandom(0,NUMDISCOVER-1);
       -                   text=g_strdup_printf(_("One of your %s was spying for %s."
       -                                          "^The spy %s!"),Names.Bitches,
       +                   tstring_fmt(&tfmt,&tstr,
       +                               _("One of your %tde was spying for %s."
       +                                 "^The spy %s!"),Names.Bitches);
       +                   text=g_strdup_printf(tfmt,tstr[0],
                                                GetPlayerName(To->SpyList.Data[i].Play),
                                                _(Discover[j]));
       +                   tstring_free(tfmt,tstr);
                           if (j!=DEFECT) LoseBitch(To,NULL,NULL);
                           SendPlayerData(To);
                           SendPrintMessage(NULL,C_NONE,To,text);
       t@@ -1088,8 +1094,10 @@ void SendEvent(Player *To) {
                    break;
                 case E_LOANSHARK:
                    if (To->IsAt+1==LoanSharkLoc && To->Debt>0) {
       -               text=g_strdup_printf(_("YN^Would you like to visit %s?"),
       -                                    Names.LoanSharkName);
       +               tstring_fmt(&tfmt,&tstr,_("YN^Would you like to visit %tde?"),
       +                           Names.LoanSharkName);
       +               text=g_strdup_printf(tfmt,tstr[0]);
       +               tstring_free(tfmt,tstr);
                       SendQuestion(NULL,C_ASKLOAN,To,text);
                       g_free(text);
                       return;
       t@@ -1097,8 +1105,10 @@ void SendEvent(Player *To) {
                    break;
                 case E_BANK:
                    if (To->IsAt+1==BankLoc) {
       -               text=g_strdup_printf(_("YN^Would you like to visit %s?"),
       -                                    Names.BankName);
       +               tstring_fmt(&tfmt,&tstr,_("YN^Would you like to visit %tde?"),
       +                           Names.BankName);
       +               text=g_strdup_printf(tfmt,tstr[0]);
       +               tstring_free(tfmt,tstr);
                       SendQuestion(NULL,C_ASKBANK,To,text);
                       g_free(text);
                       return;
       t@@ -1106,8 +1116,10 @@ void SendEvent(Player *To) {
                    break;
                 case E_GUNSHOP:
                    if (To->IsAt+1==GunShopLoc && !Sanitized && !WantAntique) {
       -               text=g_strdup_printf(_("YN^Would you like to visit %s?"),
       -                                    Names.GunShopName);
       +               tstring_fmt(&tfmt,&tstr,_("YN^Would you like to visit %tde?"),
       +                           Names.GunShopName);
       +               text=g_strdup_printf(tfmt,tstr[0]);
       +               tstring_free(tfmt,tstr);
                       SendQuestion(NULL,C_ASKGUNSHOP,To,text);
                       g_free(text);
                       return;
       t@@ -1115,8 +1127,10 @@ void SendEvent(Player *To) {
                    break;
                 case E_ROUGHPUB:
                    if (To->IsAt+1==RoughPubLoc && !WantAntique) {
       -               text=g_strdup_printf(_("YN^Would you like to visit %s?"),
       -                                    Names.RoughPubName);
       +               tstring_fmt(&tfmt,&tstr,_("YN^Would you like to visit %tde?"),
       +                           Names.RoughPubName);
       +               text=g_strdup_printf(tfmt,tstr[0]);
       +               tstring_free(tfmt,tstr);
                       SendQuestion(NULL,C_ASKPUB,To,text);
                       g_free(text);
                       return;
       t@@ -1125,10 +1139,12 @@ void SendEvent(Player *To) {
                 case E_HIREBITCH:
                    if (To->IsAt+1==RoughPubLoc && !WantAntique) {
                       To->Bitches.Price=brandom(Bitch.MinPrice,Bitch.MaxPrice);
       -               text=g_strdup_printf(
       -                       _("YN^^Would you like to hire %s %s for %s?"),
       -                       StartsWithVowel(Names.Bitch) ? _("an") : _("a"),
       -                       Names.Bitch,prstr=FormatPrice(To->Bitches.Price));
       +               tstring_fmt(&tfmt,&tstr,
       +                           _("YN^^Would you like to hire a %tde for %s?"),
       +                           Names.Bitch);
       +               text=g_strdup_printf(tfmt,tstr[0],
       +                                    prstr=FormatPrice(To->Bitches.Price));
       +               tstring_free(tfmt,tstr);
                       SendQuestion(NULL,C_ASKBITCH,To,text);
                       g_free(text); g_free(prstr);
                       return;
 (DIR) diff --git a/src/tstring.c b/src/tstring.c
       t@@ -0,0 +1,110 @@
       +/* tstring.c      "Translated string" wrappers for dopewars             */
       +/* Copyright (C)  1998-2000  Ben Webb                                   */
       +/*                Email: ben@bellatrix.pcl.ox.ac.uk                     */
       +/*                WWW: http://bellatrix.pcl.ox.ac.uk/~ben/dopewars/     */
       +
       +/* This program is free software; you can redistribute it and/or        */
       +/* modify it under the terms of the GNU General Public License          */
       +/* as published by the Free Software Foundation; either version 2       */
       +/* of the License, or (at your option) any later version.               */
       +
       +/* This program is distributed in the hope that it will be useful,      */
       +/* but WITHOUT ANY WARRANTY; without even the implied warranty of       */
       +/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the        */
       +/* GNU General Public License for more details.                         */
       +
       +/* You should have received a copy of the GNU General Public License    */
       +/* along with this program; if not, write to the Free Software          */
       +/* Foundation, Inc., 59 Temple Place - Suite 330, Boston,               */
       +/*                   MA  02111-1307, USA.                               */
       +
       +
       +#include <stdio.h>
       +#include <stdarg.h>
       +
       +#ifdef HAVE_CONFIG_H
       +#include <config.h>
       +#endif
       +
       +#include <glib.h>
       +#include "dopewars.h"
       +#include "message.h"
       +#include "tstring.h"
       +
       +gchar *GetTranslatedString(gchar *str,gchar *code,gboolean Caps) {
       +   gchar *dstr,*pt,*tstr,*Default,*tcode;
       +
       +   dstr=g_strdup(str);
       +   g_strdelimit(dstr,"_",'^');
       +   pt=dstr;
       +   Default=GetNextWord(&pt,"");
       +   tstr=NULL;
       +
       +   while(1) {
       +      tcode=GetNextWord(&pt,NULL);
       +      tstr=GetNextWord(&pt,"");
       +      if (!tcode) { tstr=NULL; break; }
       +      if (strcmp(tcode,code)==0) {
       +         break;
       +      } else tstr=NULL;
       +   }
       +
       +   if (tstr) {
       +      if (Caps) tstr=InitialCaps(tstr); else tstr=g_strdup(tstr);
       +   } else {
       +      if (Caps) tstr=InitialCaps(Default); else tstr=g_strdup(Default);
       +   }
       +
       +   g_free(dstr);
       +   return tstr;
       +}
       +
       +void tstring_fmt(gchar **tformat,gchar ***tstrings,char *OrigFormat, ...) {
       +   va_list ap;
       +   GString *text;
       +   int i;
       +   gchar *str,*tstr,code[3],**strings;
       +   GPtrArray *ptrarr;
       +   gboolean Caps;
       +
       +   text=g_string_new("");
       +   va_start(ap,OrigFormat);
       +   ptrarr=g_ptr_array_new();
       +
       +   i=0;
       +   while (i<strlen(OrigFormat)) {
       +      g_string_append_c(text,OrigFormat[i]);
       +      if (OrigFormat[i]=='%') {
       +         i++;
       +         if ((OrigFormat[i]=='T' || OrigFormat[i]=='t')
       +             && i+2<strlen(OrigFormat)) {
       +            Caps = (OrigFormat[i]=='T');
       +            code[0]=OrigFormat[i+1];
       +            code[1]=OrigFormat[i+2];
       +            code[2]='\0';
       +            i+=3;
       +            g_string_append_c(text,'s');
       +            str=va_arg(ap,char *);
       +            tstr=GetTranslatedString(str,code,Caps);
       +            g_ptr_array_add(ptrarr,(gpointer)tstr);
       +         }
       +      } else i++;
       +   }
       +   va_end(ap);
       +   *tformat=text->str;
       +   strings=g_new(char *,ptrarr->len+10);
       +   for (i=0;i<ptrarr->len;i++) {
       +      strings[i]=(gchar *)g_ptr_array_index(ptrarr,i);
       +   }
       +   strings[ptrarr->len]=NULL;
       +   g_ptr_array_free(ptrarr,FALSE);
       +   *tstrings=strings;
       +   g_string_free(text,FALSE);
       +}
       +
       +void tstring_free(gchar *tformat,gchar **tstrings) {
       +   gchar **pt;
       +   g_free(tformat);
       +   for (pt=tstrings;*pt;pt++) g_free(*pt);
       +   g_free(tstrings);
       +}
 (DIR) diff --git a/src/tstring.h b/src/tstring.h
       t@@ -0,0 +1,33 @@
       +/* tstring.h      "Translated string" wrappers for dopewars             */
       +/* Copyright (C)  1998-2000  Ben Webb                                   */
       +/*                Email: ben@bellatrix.pcl.ox.ac.uk                     */
       +/*                WWW: http://bellatrix.pcl.ox.ac.uk/~ben/dopewars/     */
       +
       +/* This program is free software; you can redistribute it and/or        */
       +/* modify it under the terms of the GNU General Public License          */
       +/* as published by the Free Software Foundation; either version 2       */
       +/* of the License, or (at your option) any later version.               */
       +
       +/* This program is distributed in the hope that it will be useful,      */
       +/* but WITHOUT ANY WARRANTY; without even the implied warranty of       */
       +/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the        */
       +/* GNU General Public License for more details.                         */
       +
       +/* You should have received a copy of the GNU General Public License    */
       +/* along with this program; if not, write to the Free Software          */
       +/* Foundation, Inc., 59 Temple Place - Suite 330, Boston,               */
       +/*                   MA  02111-1307, USA.                               */
       +
       +#ifndef __TSTRING_H__
       +#define __TSTRING_H__
       +
       +#ifdef HAVE_CONFIG_H
       +#include <config.h>
       +#endif
       +
       +#include <glib.h>
       +
       +void tstring_fmt(gchar **tformat,gchar ***tstrings,char *OrigFormat, ...);
       +void tstring_free(gchar *tformat,gchar **tstrings);
       +
       +#endif /* __TSTRING_H__ */