tInitial rewrite of the fighting code - still pretty dodgy! - vaccinewars - be … | |
git clone git://src.adamsgaard.dk/vaccinewars | |
Log | |
Files | |
Refs | |
README | |
LICENSE | |
--- | |
commit 3af8c7eacb988e73334e1d2cbaa3e7e32fa59648 | |
parent a562ef418604d825eba6aaff3520b730fc8d233f | |
Author: Ben Webb <[email protected]> | |
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(-) | |
--- | |
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 | |
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 <[email protected]>\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 [email protected]\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 | |
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 <[email protected]>\n" | |
+"PO-Revision-Date: 2000-09-16 22:00+02000\n" | |
+"Last-Translator: Slawomir Molenda <[email protected]>\n" | |
+"Language-Team: Polish <[email protected]>\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 serwer… | |
+"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�… | |
+"<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� zastrz… | |
#: 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 %… | |
#: 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" | |
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); | |
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; | |
} | |
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, | |
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 … | |
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); | |
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; | |
+ } | |
+} | |
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 | |
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: [email protected] */ | |
/* 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; | |
} | |
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 |