tServer now ignores client's "From:" field - vaccinewars - be a doctor and try to vaccinate the world
 (HTM) git clone git://src.adamsgaard.dk/vaccinewars
 (DIR) Log
 (DIR) Files
 (DIR) Refs
 (DIR) README
 (DIR) LICENSE
       ---
 (DIR) commit d3786b088df3c7418938c90b770263d8d52b6c32
 (DIR) parent f4eaf3281460590a2efc99b13f9715c1319d73c4
 (HTM) Author: Ben Webb <ben@salilab.org>
       Date:   Tue, 12 Sep 2000 17:38:29 +0000
       
       Server now ignores client's "From:" field
       
       
       Diffstat:
         M po/cat-id-tbl.c                     |     315 +++++++++++++++----------------
         M po/dopewars.pot                     |     278 +++++++++++++++----------------
         M src/message.c                       |       6 +++++-
         M src/serverside.c                    |     211 +++++++++++++++----------------
       
       4 files changed, 398 insertions(+), 412 deletions(-)
       ---
 (DIR) diff --git a/po/cat-id-tbl.c b/po/cat-id-tbl.c
       t@@ -541,187 +541,184 @@ Valid variables are listed below:-\n\
          {"cannot locate metaserver\n", 441},
          {"cannot create socket for metaserver communication\n", 442},
          {"cannot read high score file\n", 443},
       +  {"MaxClients (%d) exceeded - dropping connection", 444},
          {"\
       -Message is lying about its origin\n\
       -%s: %c: %s: %s\n\
       -Should be from %s", 444},
       -  {"MaxClients (%d) exceeded - dropping connection", 445},
       +Sorry, but this server has a limit of 1 player, which has been \
       +reached.^Please try connecting again later.", 445},
          {"\
       -Sorry, but this server has a limit of %d %s, which has been reached.^Please \
       -try connecting again later.", 446},
       -  {"player", 447},
       -  {"players", 448},
       -  {"%s will now be known as %s", 449},
       -  {"Your dealing time is up...", 450},
       -  {"%s: DENIED jet to %s", 451},
       -  {"%s now spying on %s", 452},
       -  {"%s spy on %s: DENIED", 453},
       -  {"%s tipped off the cops to %s", 454},
       -  {"%s tipoff about %s: DENIED", 455},
       -  {"--More--", 456},
       -  {"Pager exited abnormally - using stdout instead...", 457},
       -  {"Maintaining pid file %s", 458},
       -  {"Cannot create pid file %s", 459},
       +Sorry, but this server has a limit of %d players, which has been \
       +reached.^Please try connecting again later.", 446},
       +  {"%s will now be known as %s", 447},
       +  {"Your dealing time is up...", 448},
       +  {"%s: DENIED jet to %s", 449},
       +  {"%s now spying on %s", 450},
       +  {"%s spy on %s: DENIED", 451},
       +  {"%s tipped off the cops to %s", 452},
       +  {"%s tipoff about %s: DENIED", 453},
       +  {"--More--", 454},
       +  {"Pager exited abnormally - using stdout instead...", 455},
       +  {"Maintaining pid file %s", 456},
       +  {"Cannot create pid file %s", 457},
          {"\
        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.", 460},
       +specify an alternate high score file with the -f command line option.", 458},
          {"\
        dopewars server version %s ready and waiting for connections\n\
       -on port %d. For assistance with server commands, enter the command \"help\"\n", 461},
       -  {"Cannot install SIGUSR1 interrupt handler!", 462},
       -  {"Cannot install SIGINT interrupt handler!", 463},
       -  {"Cannot install SIGTERM interrupt handler!", 464},
       -  {"Cannot install SIGHUP interrupt handler!", 465},
       -  {"Cannot install pipe handler!", 466},
       -  {"Users currently logged on:-\n", 467},
       -  {"No users currently logged on!", 468},
       -  {"Pushing %s", 469},
       -  {"No such user!", 470},
       -  {"%s killed", 471},
       -  {"Unknown command - try \"help\" for help...", 472},
       -  {"got connection from %s", 473},
       -  {"%s leaves the server!", 474},
       -  {"Standard input closed.", 475},
       -  {"Unable to read high score file %s", 476},
       -  {"Congratulations! You made the high scores!", 477},
       -  {"You didn't even make the high score table...", 478},
       -  {"Unable to write high score file %s", 479},
       -  {"(R.I.P.)", 480},
       -  {"%s: Tipoff from %s", 481},
       -  {"One of your %s was spying for %s.^The spy %s!", 482},
       -  {"Your spy working with %s has been discovered!^The spy %s!", 483},
       -  {" The lady next to you on the subway said,^ \"%s\"%s", 484},
       -  {"^    (at least, you -think- that's what she said)", 485},
       -  {" You hear someone playing %s", 486},
       -  {"YN^Would you like to visit %s?", 487},
       -  {"YN^^Would you like to hire %s %s for %s?", 488},
       -  {"an", 489},
       -  {"a", 490},
       -  {"AE^%s is already here!^Do you Attack, or Evade?", 491},
       -  {"YN^Officer %s is chasing you!", 492},
       -  {"YN^Officer %s and %d of his deputies are chasing you!", 493},
       -  {"^Do you run?", 494},
       -  {"^Do you Run, or Fight?", 495},
       -  {"%s: tipoff by %s finished OK.", 496},
       -  {"Following your tipoff, the cops ambushed %s, who was shot dead", 497},
       -  {"Following your tipoff, the cops ambushed %s, who escaped with %d %s. ", 498},
       -  {"^You stand there like an idiot.", 499},
       -  {"^You lose him in the alleys.", 500},
       -  {"^You lose them in the alleys.", 501},
       -  {"^You can't shake him, man!", 502},
       -  {"^You can't shake them, man!", 503},
       -  {"^You killed Officer %s! You find %s on his corpse!", 504},
       -  {"YN^^^^Do you pay a doctor %s to sew your %s up?", 505},
       -  {"YN^^^^Do you pay a doctor %s to sew you up?", 506},
       -  {"^You got one, man!", 507},
       -  {"^You missed!", 508},
       -  {"^He's firing on you, man! ", 509},
       -  {"^They're firing on you, man! ", 510},
       -  {"You've been hit! ", 511},
       -  {"He wasted you, man! What a drag!", 512},
       -  {"They wasted you, man! What a drag!", 513},
       -  {"You lost one of your %s!", 514},
       -  {"He missed!", 515},
       -  {"They missed!", 516},
       -  {"You were mugged in the subway!", 517},
       -  {"You meet a friend! He gives you %d %s.", 518},
       -  {"You meet a friend! You give him %d %s.", 519},
       -  {"Sanitized away a RandomOffer", 520},
       +on port %d. For assistance with server commands, enter the command \"help\"\n", 459},
       +  {"Cannot install SIGUSR1 interrupt handler!", 460},
       +  {"Cannot install SIGINT interrupt handler!", 461},
       +  {"Cannot install SIGTERM interrupt handler!", 462},
       +  {"Cannot install SIGHUP interrupt handler!", 463},
       +  {"Cannot install pipe handler!", 464},
       +  {"Users currently logged on:-\n", 465},
       +  {"No users currently logged on!", 466},
       +  {"Pushing %s", 467},
       +  {"No such user!", 468},
       +  {"%s killed", 469},
       +  {"Unknown command - try \"help\" for help...", 470},
       +  {"got connection from %s", 471},
       +  {"%s leaves the server!", 472},
       +  {"Standard input closed.", 473},
       +  {"Unable to read high score file %s", 474},
       +  {"Congratulations! You made the high scores!", 475},
       +  {"You didn't even make the high score table...", 476},
       +  {"Unable to write high score file %s", 477},
       +  {"(R.I.P.)", 478},
       +  {"%s: Tipoff from %s", 479},
       +  {"One of your %s was spying for %s.^The spy %s!", 480},
       +  {"Your spy working with %s has been discovered!^The spy %s!", 481},
       +  {" The lady next to you on the subway said,^ \"%s\"%s", 482},
       +  {"^    (at least, you -think- that's what she said)", 483},
       +  {" You hear someone playing %s", 484},
       +  {"YN^Would you like to visit %s?", 485},
       +  {"YN^^Would you like to hire %s %s for %s?", 486},
       +  {"an", 487},
       +  {"a", 488},
       +  {"AE^%s is already here!^Do you Attack, or Evade?", 489},
       +  {"YN^Officer %s is chasing you!", 490},
       +  {"YN^Officer %s and %d of his deputies are chasing you!", 491},
       +  {"^Do you run?", 492},
       +  {"^Do you Run, or Fight?", 493},
       +  {"%s: tipoff by %s finished OK.", 494},
       +  {"Following your tipoff, the cops ambushed %s, who was shot dead", 495},
       +  {"Following your tipoff, the cops ambushed %s, who escaped with %d %s. ", 496},
       +  {"^You stand there like an idiot.", 497},
       +  {"^You lose him in the alleys.", 498},
       +  {"^You lose them in the alleys.", 499},
       +  {"^You can't shake him, man!", 500},
       +  {"^You can't shake them, man!", 501},
       +  {"^You killed Officer %s! You find %s on his corpse!", 502},
       +  {"YN^^^^Do you pay a doctor %s to sew your %s up?", 503},
       +  {"YN^^^^Do you pay a doctor %s to sew you up?", 504},
       +  {"^You got one, man!", 505},
       +  {"^You missed!", 506},
       +  {"^He's firing on you, man! ", 507},
       +  {"^They're firing on you, man! ", 508},
       +  {"You've been hit! ", 509},
       +  {"He wasted you, man! What a drag!", 510},
       +  {"They wasted you, man! What a drag!", 511},
       +  {"You lost one of your %s!", 512},
       +  {"He missed!", 513},
       +  {"They missed!", 514},
       +  {"You were mugged in the subway!", 515},
       +  {"You meet a friend! He gives you %d %s.", 516},
       +  {"You meet a friend! You give him %d %s.", 517},
       +  {"Sanitized away a RandomOffer", 518},
          {"\
       -Police dogs chase you for %d blocks! You dropped some %s! That's a drag, man!", 521},
       -  {"You find %d %s on a dead dude in the subway!", 522},
       -  {"Your mama made brownies with some of your %s! They were great!", 523},
       +Police dogs chase you for %d blocks! You dropped some %s! That's a drag, man!", 519},
       +  {"You find %d %s on a dead dude in the subway!", 520},
       +  {"Your mama made brownies with some of your %s! They were great!", 521},
          {"\
        YN^There is some weed that smells like paraquat here!^It looks good! Will \
       -you smoke it? ", 524},
       -  {"You stopped to %s.", 525},
       -  {"Would you like to buy a bigger trenchcoat for %s?", 526},
       -  {"YN^Hey dude! I'll help carry your %s for a mere %s. Yes or no?", 527},
       -  {"YN^Would you like to buy a %s for %s?", 528},
       -  {"%s: offer was on behalf of %s", 529},
       -  {"%s has accepted your %s!^Use the G key to contact your spy.", 530},
       +you smoke it? ", 522},
       +  {"You stopped to %s.", 523},
       +  {"Would you like to buy a bigger trenchcoat for %s?", 524},
       +  {"YN^Hey dude! I'll help carry your %s for a mere %s. Yes or no?", 525},
       +  {"YN^Would you like to buy a %s for %s?", 526},
       +  {"%s: offer was on behalf of %s", 527},
       +  {"%s has accepted your %s!^Use the G key to contact your spy.", 528},
          {"\
        You hallucinated for three days on the wildest trip you ever imagined!^Then \
       -you died because your brain disintegrated!", 531},
       -  {"Too late - %s has just left!", 532},
       -  {"%s has rejected your %s!", 533},
       -  {"%s has got away!", 534},
       -  {"%s has run off!", 535},
       -  {"Coward! You successfully escaped from the fight.", 536},
       -  {"pitifully armed", 537},
       -  {"lightly armed", 538},
       -  {"moderately well armed", 539},
       -  {"heavily armed", 540},
       -  {"armed to the teeth", 541},
       -  {" fires and ", 542},
       -  {" stands and takes it.", 543},
       -  {"%s arrives, with %d %s, %s,^%s", 544},
       -  {"%s arrives, %s,^%s", 545},
       -  {"%s fires and ", 546},
       -  {"%s stands and takes it.", 547},
       -  {"misses you!", 548},
       -  {"You failed to hit %s.", 549},
       -  {"You stand and take it.", 550},
       -  {"hits you, man!", 551},
       -  {" You've been wasted! What a drag!", 552},
       -  {"You hit and killed %s", 553},
       -  {", and loot the body!", 554},
       -  {"^You lost a %s, man!", 555},
       -  {"You are paid a bounty of %s in reward for killing^one of %s's %s", 556},
       -  {"You killed one of %s's %s (%d left)", 557},
       -  {"You fire, and hit %s!", 558},
       -  {"YN^Officer %%s spots you dropping %s, and chases you!", 559},
       +you died because your brain disintegrated!", 529},
       +  {"Too late - %s has just left!", 530},
       +  {"%s has rejected your %s!", 531},
       +  {"%s has got away!", 532},
       +  {"%s has run off!", 533},
       +  {"Coward! You successfully escaped from the fight.", 534},
       +  {"pitifully armed", 535},
       +  {"lightly armed", 536},
       +  {"moderately well armed", 537},
       +  {"heavily armed", 538},
       +  {"armed to the teeth", 539},
       +  {" fires and ", 540},
       +  {" stands and takes it.", 541},
       +  {"%s arrives, with %d %s, %s,^%s", 542},
       +  {"%s arrives, %s,^%s", 543},
       +  {"%s fires and ", 544},
       +  {"%s stands and takes it.", 545},
       +  {"misses you!", 546},
       +  {"You failed to hit %s.", 547},
       +  {"You stand and take it.", 548},
       +  {"hits you, man!", 549},
       +  {" You've been wasted! What a drag!", 550},
       +  {"You hit and killed %s", 551},
       +  {", and loot the body!", 552},
       +  {"^You lost a %s, man!", 553},
       +  {"You are paid a bounty of %s in reward for killing^one of %s's %s", 554},
       +  {"You killed one of %s's %s (%d left)", 555},
       +  {"You fire, and hit %s!", 556},
       +  {"YN^Officer %%s spots you dropping %s, and chases you!", 557},
          {"\
       -YN^Officer %%s and %%d of his deputies spot you dropping %s, and chase you!", 560},
       -  {"Player removed due to idle timeout", 561},
       -  {"Player removed due to connect timeout", 562},
       -  {"%s fails to return fire...", 563},
       +YN^Officer %%s and %%d of his deputies spot you dropping %s, and chase you!", 558},
       +  {"Player removed due to idle timeout", 559},
       +  {"Player removed due to connect timeout", 560},
       +  {"%s fails to return fire...", 561},
          {"\
        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.", 564},
       -  {"Could not find host", 565},
       -  {"Could not create network socket", 566},
       -  {"Connection refused or no server present", 567},
       -  {"Cannot locate metaserver", 568},
       -  {"Cannot create socket", 569},
       -  {"Metaserver not running HTTP or connection denied", 570},
       -  {"AI Player started; attempting to contact server at %s:%d...", 571},
       +for the latest version.", 562},
       +  {"Could not find host", 563},
       +  {"Could not create network socket", 564},
       +  {"Connection refused or no server present", 565},
       +  {"Cannot locate metaserver", 566},
       +  {"Cannot create socket", 567},
       +  {"Metaserver not running HTTP or connection denied", 568},
       +  {"AI Player started; attempting to contact server at %s:%d...", 569},
          {"\
        Could not connect to dopewars server\n\
        (%s)\n\
       -AI Player terminating abnormally.", 572},
       -  {"Connection established\n", 573},
       -  {"Connection to server lost!\n", 574},
       -  {"AI Player terminated OK.\n", 575},
       -  {"Using name %s\n", 576},
       -  {"Players in this game:-\n", 577},
       -  {"%s joins the game.\n", 578},
       -  {"%s has left the game.\n", 579},
       -  {"Jetting to %s with %s cash and %s debt", 580},
       -  {"AI Player killed. Terminating normally.\n", 581},
       -  {"Game time is up. Leaving game.\n", 582},
       -  {"AI Player pushed from the server.\n", 583},
       -  {"The server has terminated.\n", 584},
       -  {"Selling %d %s at %s\n", 585},
       -  {"Buying %d %s at %s\n", 586},
       -  {"Buying a %s for %s at the gun shop\n", 587},
       -  {"Debt of %s paid off to loan shark\n", 588},
       -  {"Loan shark located at %s\n", 589},
       -  {"Gun shop located at %s\n", 590},
       -  {"Pub located at %s\n", 591},
       -  {"Bank located at %s\n", 592},
       -  {"Call yourselves drug dealers?", 593},
       -  {"A trained monkey could do better...", 594},
       -  {"Think you're hard enough to deal with the likes of me?", 595},
       -  {"Zzzzz... are you dealing in candy or what?", 596},
       -  {"Reckon I'll just have to shoot you for your own good.", 597},
       +AI Player terminating abnormally.", 570},
       +  {"Connection established\n", 571},
       +  {"Connection to server lost!\n", 572},
       +  {"AI Player terminated OK.\n", 573},
       +  {"Using name %s\n", 574},
       +  {"Players in this game:-\n", 575},
       +  {"%s joins the game.\n", 576},
       +  {"%s has left the game.\n", 577},
       +  {"Jetting to %s with %s cash and %s debt", 578},
       +  {"AI Player killed. Terminating normally.\n", 579},
       +  {"Game time is up. Leaving game.\n", 580},
       +  {"AI Player pushed from the server.\n", 581},
       +  {"The server has terminated.\n", 582},
       +  {"Selling %d %s at %s\n", 583},
       +  {"Buying %d %s at %s\n", 584},
       +  {"Buying a %s for %s at the gun shop\n", 585},
       +  {"Debt of %s paid off to loan shark\n", 586},
       +  {"Loan shark located at %s\n", 587},
       +  {"Gun shop located at %s\n", 588},
       +  {"Pub located at %s\n", 589},
       +  {"Bank located at %s\n", 590},
       +  {"Call yourselves drug dealers?", 591},
       +  {"A trained monkey could do better...", 592},
       +  {"Think you're hard enough to deal with the likes of me?", 593},
       +  {"Zzzzz... are you dealing in candy or what?", 594},
       +  {"Reckon I'll just have to shoot you for your own good.", 595},
          {"\
        This binary has been compiled without networking support, and thus cannot \
        act as an AI player.\n\
       -Recompile passing --enable-networking to the configure script.", 598},
       +Recompile passing --enable-networking to the configure script.", 596},
        };
        
       -int _msg_tbl_length = 598;
       +int _msg_tbl_length = 596;
 (DIR) diff --git a/po/dopewars.pot b/po/dopewars.pot
       t@@ -6,7 +6,7 @@
        msgid ""
        msgstr ""
        "Project-Id-Version: PACKAGE VERSION\n"
       -"POT-Creation-Date: 2000-09-12 15:45+0100\n"
       +"POT-Creation-Date: 2000-09-12 18:35+0100\n"
        "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
        "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
        "Language-Team: LANGUAGE <LL@li.org>\n"
       t@@ -1104,7 +1104,7 @@ msgstr ""
        msgid "The server has terminated. Reverting to single player mode."
        msgstr ""
        
       -#: src/curses_client.c:646 src/gtk_client.c:337 src/serverside.c:263
       +#: src/curses_client.c:646 src/gtk_client.c:337 src/serverside.c:250
        #, c-format
        msgid "%s joins the game!"
        msgstr ""
       t@@ -1948,87 +1948,77 @@ msgstr ""
        msgid "cannot read high score file\n"
        msgstr ""
        
       -#: src/serverside.c:207
       -#, c-format
       -msgid ""
       -"Message is lying about its origin\n"
       -"%s: %c: %s: %s\n"
       -"Should be from %s"
       -msgstr ""
       -
       -#: src/serverside.c:271
       +#: src/serverside.c:257
        #, c-format
        msgid "MaxClients (%d) exceeded - dropping connection"
        msgstr ""
        
       -#: src/serverside.c:273
       -#, c-format
       +#: src/serverside.c:261
        msgid ""
       -"Sorry, but this server has a limit of %d %s, which has been reached.^Please "
       -"try connecting again later."
       +"Sorry, but this server has a limit of 1 player, which has been "
       +"reached.^Please try connecting again later."
        msgstr ""
        
       -#: src/serverside.c:275
       -msgid "player"
       -msgstr ""
       -
       -#: src/serverside.c:275
       -msgid "players"
       +#: src/serverside.c:266
       +#, c-format
       +msgid ""
       +"Sorry, but this server has a limit of %d players, which has been "
       +"reached.^Please try connecting again later."
        msgstr ""
        
       -#: src/serverside.c:284
       +#: src/serverside.c:279
        #, c-format
        msgid "%s will now be known as %s"
        msgstr ""
        
       -#: src/serverside.c:299
       +#: src/serverside.c:294
        msgid "Your dealing time is up..."
        msgstr ""
        
       -#: src/serverside.c:310
       +#: src/serverside.c:305
        #, c-format
        msgid "%s: DENIED jet to %s"
        msgstr ""
        
       -#: src/serverside.c:367
       +#: src/serverside.c:362
        #, c-format
        msgid "%s now spying on %s"
        msgstr ""
        
       -#: src/serverside.c:375
       +#: src/serverside.c:370
        #, c-format
        msgid "%s spy on %s: DENIED"
        msgstr ""
        
       -#: src/serverside.c:381
       +#: src/serverside.c:376
        #, c-format
        msgid "%s tipped off the cops to %s"
        msgstr ""
        
       -#: src/serverside.c:389
       +#: src/serverside.c:384
        #, c-format
        msgid "%s tipoff about %s: DENIED"
        msgstr ""
        
       -#: src/serverside.c:497
       +#: src/serverside.c:492
        msgid "--More--"
        msgstr ""
        
       -#: src/serverside.c:508
       +#: src/serverside.c:503
        msgid "Pager exited abnormally - using stdout instead..."
        msgstr ""
        
       -#: src/serverside.c:523
       +#: src/serverside.c:518
        #, c-format
        msgid "Maintaining pid file %s"
        msgstr ""
        
       -#: src/serverside.c:527
       +#: src/serverside.c:522
        #, c-format
        msgid "Cannot create pid file %s"
        msgstr ""
        
       -#: src/serverside.c:576
       +#: src/serverside.c:571
        #, c-format
        msgid ""
        "Cannot open high score file %s.\n"
       t@@ -2036,144 +2026,144 @@ msgid ""
        "specify an alternate high score file with the -f command line option."
        msgstr ""
        
       -#: src/serverside.c:613
       +#: src/serverside.c:608
        #, 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:630
       +#: src/serverside.c:625
        msgid "Cannot install SIGUSR1 interrupt handler!"
        msgstr ""
        
       -#: src/serverside.c:636
       +#: src/serverside.c:631
        msgid "Cannot install SIGINT interrupt handler!"
        msgstr ""
        
       -#: src/serverside.c:639
       +#: src/serverside.c:634
        msgid "Cannot install SIGTERM interrupt handler!"
        msgstr ""
        
       -#: src/serverside.c:642
       +#: src/serverside.c:637
        msgid "Cannot install SIGHUP interrupt handler!"
        msgstr ""
        
       -#: src/serverside.c:647
       +#: src/serverside.c:642
        msgid "Cannot install pipe handler!"
        msgstr ""
        
       -#: src/serverside.c:670
       +#: src/serverside.c:665
        msgid "Users currently logged on:-\n"
        msgstr ""
        
       -#: src/serverside.c:675
       +#: src/serverside.c:670
        msgid "No users currently logged on!"
        msgstr ""
        
       -#: src/serverside.c:679
       +#: src/serverside.c:674
        #, c-format
        msgid "Pushing %s"
        msgstr ""
        
       -#: src/serverside.c:681 src/serverside.c:689
       +#: src/serverside.c:676 src/serverside.c:684
        msgid "No such user!"
        msgstr ""
        
       -#: src/serverside.c:685
       +#: src/serverside.c:680
        #, c-format
        msgid "%s killed"
        msgstr ""
        
       -#: src/serverside.c:691
       +#: src/serverside.c:686
        msgid "Unknown command - try \"help\" for help..."
        msgstr ""
        
       -#: src/serverside.c:708
       +#: src/serverside.c:703
        #, c-format
        msgid "got connection from %s"
        msgstr ""
        
       -#: src/serverside.c:724
       +#: src/serverside.c:719
        #, c-format
        msgid "%s leaves the server!"
        msgstr ""
        
       -#: src/serverside.c:792
       +#: src/serverside.c:787
        msgid "Standard input closed."
        msgstr ""
        
       -#: src/serverside.c:935
       +#: src/serverside.c:930
        #, c-format
        msgid "Unable to read high score file %s"
        msgstr ""
        
       -#: src/serverside.c:955
       +#: src/serverside.c:950
        msgid "Congratulations! You made the high scores!"
        msgstr ""
        
       -#: src/serverside.c:968
       +#: src/serverside.c:963
        msgid "You didn't even make the high score table..."
        msgstr ""
        
       -#: src/serverside.c:982
       +#: src/serverside.c:977
        #, c-format
        msgid "Unable to write high score file %s"
        msgstr ""
        
       -#: src/serverside.c:1001
       +#: src/serverside.c:996
        msgid "(R.I.P.)"
        msgstr ""
        
       -#: src/serverside.c:1036
       +#: src/serverside.c:1031
        #, c-format
        msgid "%s: Tipoff from %s"
        msgstr ""
        
       -#: src/serverside.c:1053
       +#: src/serverside.c:1048
        #, c-format
        msgid "One of your %s was spying for %s.^The spy %s!"
        msgstr ""
        
       -#: src/serverside.c:1061
       +#: src/serverside.c:1056
        #, c-format
        msgid "Your spy working with %s has been discovered!^The spy %s!"
        msgstr ""
        
       -#: src/serverside.c:1084
       +#: src/serverside.c:1079
        #, c-format
        msgid " The lady next to you on the subway said,^ \"%s\"%s"
        msgstr ""
        
       -#: src/serverside.c:1087
       +#: src/serverside.c:1082
        msgid "^    (at least, you -think- that's what she said)"
        msgstr ""
        
       -#: src/serverside.c:1089
       +#: src/serverside.c:1084
        #, c-format
        msgid " You hear someone playing %s"
        msgstr ""
        
       -#: src/serverside.c:1098 src/serverside.c:1107 src/serverside.c:1116
       -#: src/serverside.c:1125
       +#: src/serverside.c:1093 src/serverside.c:1102 src/serverside.c:1111
       +#: src/serverside.c:1120
        #, c-format
        msgid "YN^Would you like to visit %s?"
        msgstr ""
        
       -#: src/serverside.c:1136
       +#: src/serverside.c:1131
        #, c-format
        msgid "YN^^Would you like to hire %s %s for %s?"
        msgstr ""
        
       -#: src/serverside.c:1137
       +#: src/serverside.c:1132
        msgid "an"
        msgstr ""
        
       -#: src/serverside.c:1137
       +#: src/serverside.c:1132
        msgid "a"
        msgstr ""
        
       -#: src/serverside.c:1149
       +#: src/serverside.c:1144
        #, c-format
        msgid "AE^%s is already here!^Do you Attack, or Evade?"
        msgstr ""
       t@@ -2182,336 +2172,336 @@ msgstr ""
        #. The format string used for this purpose can be altered by
        #. passing non-NULL "LoneMessage" (for unaccompanied Officer
        #. Hardass) and/or "DeputyMessage" (for him with x deputies)
       -#: src/serverside.c:1218
       +#: src/serverside.c:1213
        #, c-format
        msgid "YN^Officer %s is chasing you!"
        msgstr ""
        
       -#: src/serverside.c:1220
       +#: src/serverside.c:1215
        #, c-format
        msgid "YN^Officer %s and %d of his deputies are chasing you!"
        msgstr ""
        
       -#: src/serverside.c:1241
       +#: src/serverside.c:1236
        msgid "^Do you run?"
        msgstr ""
        
       -#: src/serverside.c:1244
       +#: src/serverside.c:1239
        msgid "^Do you Run, or Fight?"
        msgstr ""
        
       -#: src/serverside.c:1259
       +#: src/serverside.c:1254
        #, c-format
        msgid "%s: tipoff by %s finished OK."
        msgstr ""
        
       -#: src/serverside.c:1265
       +#: src/serverside.c:1260
        #, c-format
        msgid "Following your tipoff, the cops ambushed %s, who was shot dead"
        msgstr ""
        
       -#: src/serverside.c:1269
       +#: src/serverside.c:1264
        #, c-format
        msgid "Following your tipoff, the cops ambushed %s, who escaped with %d %s. "
        msgstr ""
        
       -#: src/serverside.c:1306
       +#: src/serverside.c:1301
        msgid "^You stand there like an idiot."
        msgstr ""
        
       -#: src/serverside.c:1310
       +#: src/serverside.c:1305
        msgid "^You lose him in the alleys."
        msgstr ""
        
       -#: src/serverside.c:1312
       +#: src/serverside.c:1307
        msgid "^You lose them in the alleys."
        msgstr ""
        
       -#: src/serverside.c:1320
       +#: src/serverside.c:1315
        msgid "^You can't shake him, man!"
        msgstr ""
        
       -#: src/serverside.c:1322
       +#: src/serverside.c:1317
        msgid "^You can't shake them, man!"
        msgstr ""
        
       -#: src/serverside.c:1333
       +#: src/serverside.c:1328
        #, c-format
        msgid "^You killed Officer %s! You find %s on his corpse!"
        msgstr ""
        
       -#: src/serverside.c:1347
       +#: src/serverside.c:1342
        #, c-format
        msgid "YN^^^^Do you pay a doctor %s to sew your %s up?"
        msgstr ""
        
       -#: src/serverside.c:1351
       +#: src/serverside.c:1346
        #, c-format
        msgid "YN^^^^Do you pay a doctor %s to sew you up?"
        msgstr ""
        
       -#: src/serverside.c:1362
       +#: src/serverside.c:1357
        msgid "^You got one, man!"
        msgstr ""
        
       -#: src/serverside.c:1365
       +#: src/serverside.c:1360
        msgid "^You missed!"
        msgstr ""
        
       -#: src/serverside.c:1369
       +#: src/serverside.c:1364
        msgid "^He's firing on you, man! "
        msgstr ""
        
       -#: src/serverside.c:1371
       +#: src/serverside.c:1366
        msgid "^They're firing on you, man! "
        msgstr ""
        
       -#: src/serverside.c:1374
       +#: src/serverside.c:1369
        msgid "You've been hit! "
        msgstr ""
        
       -#: src/serverside.c:1381
       +#: src/serverside.c:1376
        msgid "He wasted you, man! What a drag!"
        msgstr ""
        
       -#: src/serverside.c:1383
       +#: src/serverside.c:1378
        msgid "They wasted you, man! What a drag!"
        msgstr ""
        
       -#: src/serverside.c:1391
       +#: src/serverside.c:1386
        #, c-format
        msgid "You lost one of your %s!"
        msgstr ""
        
       -#: src/serverside.c:1400
       +#: src/serverside.c:1395
        msgid "He missed!"
        msgstr ""
        
       -#: src/serverside.c:1402
       +#: src/serverside.c:1397
        msgid "They missed!"
        msgstr ""
        
       -#: src/serverside.c:1422
       +#: src/serverside.c:1417
        msgid "You were mugged in the subway!"
        msgstr ""
        
       -#: src/serverside.c:1433
       +#: src/serverside.c:1428
        #, c-format
        msgid "You meet a friend! He gives you %d %s."
        msgstr ""
        
       -#: src/serverside.c:1438
       +#: src/serverside.c:1433
        #, c-format
        msgid "You meet a friend! You give him %d %s."
        msgstr ""
        
       -#: src/serverside.c:1445
       +#: src/serverside.c:1440
        msgid "Sanitized away a RandomOffer"
        msgstr ""
        
       -#: src/serverside.c:1450
       +#: src/serverside.c:1445
        #, c-format
        msgid ""
        "Police dogs chase you for %d blocks! You dropped some %s! That's a drag, man!"
        msgstr ""
        
       -#: src/serverside.c:1464
       +#: src/serverside.c:1459
        #, c-format
        msgid "You find %d %s on a dead dude in the subway!"
        msgstr ""
        
       -#: src/serverside.c:1476
       +#: src/serverside.c:1471
        #, c-format
        msgid "Your mama made brownies with some of your %s! They were great!"
        msgstr ""
        
       -#: src/serverside.c:1484
       +#: src/serverside.c:1479
        msgid ""
        "YN^There is some weed that smells like paraquat here!^It looks good! Will "
        "you smoke it? "
        msgstr ""
        
       -#: src/serverside.c:1491
       +#: src/serverside.c:1486
        #, c-format
        msgid "You stopped to %s."
        msgstr ""
        
       -#: src/serverside.c:1512
       +#: src/serverside.c:1507
        #, c-format
        msgid "Would you like to buy a bigger trenchcoat for %s?"
        msgstr ""
        
       -#: src/serverside.c:1517
       +#: src/serverside.c:1512
        #, c-format
        msgid "YN^Hey dude! I'll help carry your %s for a mere %s. Yes or no?"
        msgstr ""
        
       -#: src/serverside.c:1529
       +#: src/serverside.c:1524
        #, c-format
        msgid "YN^Would you like to buy a %s for %s?"
        msgstr ""
        
       -#: src/serverside.c:1630 src/serverside.c:1741
       +#: src/serverside.c:1625 src/serverside.c:1736
        #, c-format
        msgid "%s: offer was on behalf of %s"
        msgstr ""
        
       -#: src/serverside.c:1633
       +#: src/serverside.c:1628
        #, c-format
        msgid "%s has accepted your %s!^Use the G key to contact your spy."
        msgstr ""
        
       -#: src/serverside.c:1679
       +#: src/serverside.c:1674
        msgid ""
        "You hallucinated for three days on the wildest trip you ever imagined!^Then "
        "you died because your brain disintegrated!"
        msgstr ""
        
       -#: src/serverside.c:1718
       +#: src/serverside.c:1713
        #, c-format
        msgid "Too late - %s has just left!"
        msgstr ""
        
       -#: src/serverside.c:1744
       +#: src/serverside.c:1739
        #, c-format
        msgid "%s has rejected your %s!"
        msgstr ""
        
       -#: src/serverside.c:1779
       +#: src/serverside.c:1774
        #, c-format
        msgid "%s has got away!"
        msgstr ""
        
       -#: src/serverside.c:1820
       +#: src/serverside.c:1815
        #, c-format
        msgid "%s has run off!"
        msgstr ""
        
       -#: src/serverside.c:1832
       +#: src/serverside.c:1827
        msgid "Coward! You successfully escaped from the fight."
        msgstr ""
        
       -#: src/serverside.c:1888
       +#: src/serverside.c:1883
        msgid "pitifully armed"
        msgstr ""
        
       -#: src/serverside.c:1889
       +#: src/serverside.c:1884
        msgid "lightly armed"
        msgstr ""
        
       -#: src/serverside.c:1890
       +#: src/serverside.c:1885
        msgid "moderately well armed"
        msgstr ""
        
       -#: src/serverside.c:1891
       +#: src/serverside.c:1886
        msgid "heavily armed"
        msgstr ""
        
       -#: src/serverside.c:1892
       +#: src/serverside.c:1887
        msgid "armed to the teeth"
        msgstr ""
        
       -#: src/serverside.c:1893
       +#: src/serverside.c:1888
        msgid " fires and "
        msgstr ""
        
       -#: src/serverside.c:1894
       +#: src/serverside.c:1889
        msgid " stands and takes it."
        msgstr ""
        
       -#: src/serverside.c:1897
       +#: src/serverside.c:1892
        #, c-format
        msgid "%s arrives, with %d %s, %s,^%s"
        msgstr ""
        
       -#: src/serverside.c:1901
       +#: src/serverside.c:1896
        #, c-format
        msgid "%s arrives, %s,^%s"
        msgstr ""
        
       -#: src/serverside.c:1906
       +#: src/serverside.c:1901
        #, c-format
        msgid "%s fires and "
        msgstr ""
        
       -#: src/serverside.c:1908
       +#: src/serverside.c:1903
        #, c-format
        msgid "%s stands and takes it."
        msgstr ""
        
       -#: src/serverside.c:1920
       +#: src/serverside.c:1915
        msgid "misses you!"
        msgstr ""
        
       -#: src/serverside.c:1921
       +#: src/serverside.c:1916
        #, c-format
        msgid "You failed to hit %s."
        msgstr ""
        
       -#: src/serverside.c:1924
       +#: src/serverside.c:1919
        msgid "You stand and take it."
        msgstr ""
        
       -#: src/serverside.c:1928
       +#: src/serverside.c:1923
        msgid "hits you, man!"
        msgstr ""
        
       -#: src/serverside.c:1931
       +#: src/serverside.c:1926
        msgid " You've been wasted! What a drag!"
        msgstr ""
        
       -#: src/serverside.c:1932
       +#: src/serverside.c:1927
        #, c-format
        msgid "You hit and killed %s"
        msgstr ""
        
       -#: src/serverside.c:1947 src/serverside.c:1980
       +#: src/serverside.c:1942 src/serverside.c:1975
        msgid ", and loot the body!"
        msgstr ""
        
       -#: src/serverside.c:1956
       +#: src/serverside.c:1951
        #, c-format
        msgid "^You lost a %s, man!"
        msgstr ""
        
       -#: src/serverside.c:1961
       +#: src/serverside.c:1956
        #, c-format
        msgid "You are paid a bounty of %s in reward for killing^one of %s's %s"
        msgstr ""
        
       -#: src/serverside.c:1969
       +#: src/serverside.c:1964
        #, c-format
        msgid "You killed one of %s's %s (%d left)"
        msgstr ""
        
       -#: src/serverside.c:1987
       +#: src/serverside.c:1982
        #, c-format
        msgid "You fire, and hit %s!"
        msgstr ""
        
       -#: src/serverside.c:2026
       +#: src/serverside.c:2021
        msgid "YN^Officer %%s spots you dropping %s, and chases you!"
        msgstr ""
        
       -#: src/serverside.c:2028
       +#: src/serverside.c:2023
        msgid ""
        "YN^Officer %%s and %%d of his deputies spot you dropping %s, and chase you!"
        msgstr ""
        
       -#: src/serverside.c:2183
       +#: src/serverside.c:2178
        msgid "Player removed due to idle timeout"
        msgstr ""
        
       -#: src/serverside.c:2193
       +#: src/serverside.c:2188
        msgid "Player removed due to connect timeout"
        msgstr ""
        
       -#: src/serverside.c:2199 src/serverside.c:2205
       +#: src/serverside.c:2194 src/serverside.c:2200
        #, c-format
        msgid "%s fails to return fire..."
        msgstr ""
        
       -#: src/message.c:433
       +#: src/message.c:437
        #, c-format
        msgid ""
        "This server is version %s, while your client is version %s.\n"
       t@@ -2520,27 +2510,27 @@ msgid ""
        "for the latest version."
        msgstr ""
        
       -#: src/message.c:572
       +#: src/message.c:576
        msgid "Could not find host"
        msgstr ""
        
       -#: src/message.c:573
       +#: src/message.c:577
        msgid "Could not create network socket"
        msgstr ""
        
       -#: src/message.c:574 src/message.c:607
       +#: src/message.c:578 src/message.c:611
        msgid "Connection refused or no server present"
        msgstr ""
        
       -#: src/message.c:753
       +#: src/message.c:757
        msgid "Cannot locate metaserver"
        msgstr ""
        
       -#: src/message.c:754
       +#: src/message.c:758
        msgid "Cannot create socket"
        msgstr ""
        
       -#: src/message.c:756
       +#: src/message.c:760
        msgid "Metaserver not running HTTP or connection denied"
        msgstr ""
        
 (DIR) diff --git a/src/message.c b/src/message.c
       t@@ -100,7 +100,11 @@ void SendClientMessage(Player *From,char AICode,char Code,
           if (!Network) {
        #endif
              if (From) ServerFrom=GetPlayerByName(GetPlayerName(From),FirstServer);
       -      else ServerFrom=NULL;
       +      else if (FirstServer) ServerFrom=(Player *)(FirstServer->data);
       +      else {
       +         ServerFrom=g_new(Player,1);
       +         FirstServer=AddPlayer(0,ServerFrom,FirstServer);
       +      }
              HandleServerMessage(text->str,ServerFrom);
        #if NETWORKING
           } else {
 (DIR) diff --git a/src/serverside.c b/src/serverside.c
       t@@ -187,219 +187,214 @@ void HandleServerPlayer(Player *Play) {
           }
        }
        
       -void HandleServerMessage(gchar *buf,Player *ReallyFrom) {
       -/* Given a message "buf" which identifies itself as being from player */
       -/* "ReallyFrom" by the incoming socket, performs processing and sends */
       -/* suitable replies.                                                  */
       -   Player *From,*To,*tmp,*pt;
       +void HandleServerMessage(gchar *buf,Player *Play) {
       +/* Given a message "buf", from player "Play", performs processing and */
       +/* sends suitable replies.                                            */
       +   Player *To,*tmp,*pt;
           GSList *list;
           char Code,*Data,AICode;
       +   gchar *text;
           DopeEntry NewEntry;
           int i;
           price_t money;
        
       -   if (ProcessMessage(buf,&From,&AICode,&Code,&To,&Data,FirstServer)==-1) {
       +/* Ignore client's From: field (bin it in tmp) - should always be "Play" */
       +   if (ProcessMessage(buf,&tmp,&AICode,&Code,&To,&Data,FirstServer)==-1) {
              g_warning("Bad message");
              return;
           }
       -   if (From!=ReallyFrom && (From!=&Noone ||
       -       (Code!=C_NAME && Code!=C_ABILITIES && Code!=C_NETMESSAGE))) {
       -       g_warning(_("Message is lying about its origin\n%s: %c: %s: %s\n"
       -                 "Should be from %s"),From ? GetPlayerName(From) : "",Code,
       -                 To ? GetPlayerName(To) : "",Data,
       -                 ReallyFrom ? GetPlayerName(ReallyFrom) : "NULL");
       -       g_free(Data);
       -       return;
       -   }
           switch(Code) {
              case C_MSGTO:
                 if (Network) {
       -            g_message("%s->%s: %s",GetPlayerName(From),GetPlayerName(To),Data);
       +            g_message("%s->%s: %s",GetPlayerName(Play),GetPlayerName(To),Data);
                 }
       -         SendServerMessage(From,AICode,Code,To,Data);
       +         SendServerMessage(Play,AICode,Code,To,Data);
                 break;
              case C_NETMESSAGE:
                 g_message("Net:%s\n",Data);
       -/*       shutdown(ReallyFrom->fd,SD_RECV);*/
       +/*       shutdown(Play->fd,SD_RECV);*/
        /* Make sure they do actually disconnect, eventually! */
                 if (ConnectTimeout) {
       -            ReallyFrom->ConnectTimeout=time(NULL)+(time_t)ConnectTimeout;
       +            Play->ConnectTimeout=time(NULL)+(time_t)ConnectTimeout;
                 }
                 break;
              case C_ABILITIES:
       -         ReceiveAbilities(ReallyFrom,Data);
       +         ReceiveAbilities(Play,Data);
                 break;
              case C_NAME:
                 pt=GetPlayerByName(Data,FirstServer);
       -         if (pt && pt!=From) {
       +         if (pt && pt!=Play) {
                    if (ConnectTimeout) {
       -               ReallyFrom->ConnectTimeout=time(NULL)+(time_t)ConnectTimeout;
       +               Play->ConnectTimeout=time(NULL)+(time_t)ConnectTimeout;
                    }
       -            SendServerMessage(NULL,C_NONE,C_NEWNAME,ReallyFrom,NULL);
       -         } else if (((ReallyFrom && strlen(GetPlayerName(ReallyFrom))==0 &&
       -                     Network) || (!Network && From==&Noone)) && Data[0]) {
       +            SendServerMessage(NULL,C_NONE,C_NEWNAME,Play,NULL);
       +         } else if (strlen(GetPlayerName(Play))==0 && Data[0]) {
                    if (CountPlayers(FirstServer)<MaxClients || !Network) { 
       -               SendAbilities(ReallyFrom);
       -               CombineAbilities(ReallyFrom);
       -               SendInitialData(ReallyFrom);
       -               SendMiscData(ReallyFrom);
       -               if (!Network) {
       -                  From=g_new(Player,1);
       -                  FirstServer=AddPlayer(0,From,FirstServer);
       -               } else From=ReallyFrom;
       -               SetPlayerName(From,Data);
       +               SendAbilities(Play);
       +               CombineAbilities(Play);
       +               SendInitialData(Play);
       +               SendMiscData(Play);
       +               SetPlayerName(Play,Data);
                       for (list=FirstServer;list;list=g_slist_next(list)) {
                          pt=(Player *)list->data;
       -                  if (pt!=From) {
       -                     SendServerMessage(NULL,C_NONE,C_LIST,From,
       +                  if (pt!=Play) {
       +                     SendServerMessage(NULL,C_NONE,C_LIST,Play,
                                               GetPlayerName(pt));
                          }
                       }
       -               SendServerMessage(NULL,C_NONE,C_ENDLIST,From,NULL);
       +               SendServerMessage(NULL,C_NONE,C_ENDLIST,Play,NULL);
                       RegisterWithMetaServer(TRUE,FALSE);
       -               From->ConnectTimeout=0;
       +               Play->ConnectTimeout=0;
        
                       if (Network) {
       -                  g_message(_("%s joins the game!"),GetPlayerName(From));
       +                  g_message(_("%s joins the game!"),GetPlayerName(Play));
                       }
       -               BroadcastToClients(C_NONE,C_JOIN,GetPlayerName(From),NULL,From);
       -               From->EventNum=E_ARRIVE;
       -               SendPlayerData(From);
       -               SendEvent(From);
       +               BroadcastToClients(C_NONE,C_JOIN,GetPlayerName(Play),NULL,Play);
       +               Play->EventNum=E_ARRIVE;
       +               SendPlayerData(Play);
       +               SendEvent(Play);
                    } else {
       -               From=ReallyFrom;
                       g_message(_("MaxClients (%d) exceeded - dropping connection"),
                                 MaxClients);
       -               sprintf(buf,_("Sorry, but this server has a limit of %d "
       -"%s, which has been reached.^Please try connecting again later."),
       -                       MaxClients,MaxClients==1 ? _("player") : _("players"));
       -               SendServerMessage(NULL,C_NONE,C_PRINTMESSAGE,From,buf);
       -/*             shutdown(From->fd,SD_RECV);*/
       +               if (MaxClients==1) {
       +                  text=g_strdup_printf(
       +                       _("Sorry, but this server has a limit of 1 "
       +                         "player, which has been reached.^"
       +                         "Please try connecting again later."));
       +               } else {
       +                  text=g_strdup_printf(
       +                       _("Sorry, but this server has a limit of %d "
       +                         "players, which has been reached.^"
       +                         "Please try connecting again later."),MaxClients);
       +               }
       +               SendServerMessage(NULL,C_NONE,C_PRINTMESSAGE,Play,text);
       +               g_free(text);
       +/*             shutdown(Play->fd,SD_RECV);*/
        /* Make sure they do actually disconnect, eventually! */
                       if (ConnectTimeout) {
       -                  From->ConnectTimeout=time(NULL)+(time_t)ConnectTimeout;
       +                  Play->ConnectTimeout=time(NULL)+(time_t)ConnectTimeout;
                       }
                    }
                 } else {
       -            g_message(_("%s will now be known as %s"),GetPlayerName(From),Data);
       -            BroadcastToClients(C_NONE,C_RENAME,Data,From,From);
       -            SetPlayerName(From,Data);
       +            g_message(_("%s will now be known as %s"),GetPlayerName(Play),Data);
       +            BroadcastToClients(C_NONE,C_RENAME,Data,Play,Play);
       +            SetPlayerName(Play,Data);
                 }
                 break;
              case C_WANTQUIT:
       -         if (From->EventNum!=E_FINISH) FinishGame(From,NULL);
       +         if (Play->EventNum!=E_FINISH) FinishGame(Play,NULL);
                 break;
              case C_REQUESTJET:
                 i=atoi(Data);
       -         if (From->EventNum==E_ATTACK || From->EventNum==E_DEFEND ||
       -             From->EventNum==E_WAITATTACK || From->EventNum==E_FREEFORALL) {
       -             BreakoffCombat(From,FALSE);
       +         if (Play->EventNum==E_ATTACK || Play->EventNum==E_DEFEND ||
       +             Play->EventNum==E_WAITATTACK || Play->EventNum==E_FREEFORALL) {
       +             BreakoffCombat(Play,FALSE);
                 }
       -         if (NumTurns>0 && From->Turn>=NumTurns && From->EventNum!=E_FINISH) {
       -            FinishGame(From,_("Your dealing time is up..."));
       -         } else if (i!=From->IsAt && (NumTurns==0 || From->Turn<NumTurns) && 
       -                    From->EventNum==E_NONE && From->Health>0) {
       -            From->IsAt=(char)i;
       -            From->Turn++;
       -            From->Debt=(price_t)((float)From->Debt*1.1);
       -            From->Bank=(price_t)((float)From->Bank*1.05);
       -            SendPlayerData(From);
       -            From->EventNum=E_SUBWAY;
       -            SendEvent(From);
       +         if (NumTurns>0 && Play->Turn>=NumTurns && Play->EventNum!=E_FINISH) {
       +            FinishGame(Play,_("Your dealing time is up..."));
       +         } else if (i!=Play->IsAt && (NumTurns==0 || Play->Turn<NumTurns) && 
       +                    Play->EventNum==E_NONE && Play->Health>0) {
       +            Play->IsAt=(char)i;
       +            Play->Turn++;
       +            Play->Debt=(price_t)((float)Play->Debt*1.1);
       +            Play->Bank=(price_t)((float)Play->Bank*1.05);
       +            SendPlayerData(Play);
       +            Play->EventNum=E_SUBWAY;
       +            SendEvent(Play);
                 } else {
       -            g_warning(_("%s: DENIED jet to %s"),GetPlayerName(From),
       +            g_warning(_("%s: DENIED jet to %s"),GetPlayerName(Play),
                                                        Location[i].Name);
                 }
                 break;
              case C_REQUESTSCORE:
       -         SendHighScores(From,FALSE,NULL);
       +         SendHighScores(Play,FALSE,NULL);
                 break;
              case C_CONTACTSPY:
                 for (list=FirstServer;list;list=g_slist_next(list)) {
                    tmp=(Player *)list->data;
       -            if (tmp!=From && GetListEntry(&(tmp->SpyList),From)>=0) {
       -               SendSpyReport(From,tmp);
       +            if (tmp!=Play && GetListEntry(&(tmp->SpyList),Play)>=0) {
       +               SendSpyReport(Play,tmp);
                    }
                }
                break;
              case C_DEPOSIT:
                 money=strtoprice(Data);
       -         if (From->Bank+money >=0 && From->Cash-money >=0) {
       -            From->Bank+=money; From->Cash-=money;
       -           SendPlayerData(From);
       +         if (Play->Bank+money >=0 && Play->Cash-money >=0) {
       +            Play->Bank+=money; Play->Cash-=money;
       +           SendPlayerData(Play);
                 }
                 break;
              case C_PAYLOAN:
                 money=strtoprice(Data);
       -         if (From->Debt-money >=0 && From->Cash-money >=0) {
       -            From->Debt-=money; From->Cash-=money;
       -            SendPlayerData(From);
       +         if (Play->Debt-money >=0 && Play->Cash-money >=0) {
       +            Play->Debt-=money; Play->Cash-=money;
       +            SendPlayerData(Play);
                 }
                 break;
              case C_BUYOBJECT:
       -         BuyObject(From,Data);
       +         BuyObject(Play,Data);
                 break;
              case C_FIGHTACT:
       -         if (From->EventNum==E_ATTACK || From->EventNum==E_FREEFORALL) {
       -            AttackPlayer(From,From->Attacked,
       -               TotalGunsCarried(From)>0 ? AT_SHOOT : 0);
       -         } else if (From->EventNum==E_DEFEND) {
       +         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==From) {
       -                  AttackPlayer(From,tmp,
       -                               TotalGunsCarried(From)>0 ? AT_SHOOT : 0);
       +                   && tmp->Attacked==Play) {
       +                  AttackPlayer(Play,tmp,
       +                               TotalGunsCarried(Play)>0 ? AT_SHOOT : 0);
                       }
                    }
                 }
                 break;
              case C_ANSWER:
       -         HandleAnswer(From,To,Data);
       +         HandleAnswer(Play,To,Data);
                 break;
              case C_DONE:
       -         if (From->EventNum!=E_NONE && From->EventNum<E_OUTOFSYNC) {
       -            From->EventNum++; SendEvent(From);
       +         if (Play->EventNum!=E_NONE && Play->EventNum<E_OUTOFSYNC) {
       +            Play->EventNum++; SendEvent(Play);
                 }
                 break;
              case C_SPYON:
       -         if (From->Cash >= Prices.Spy) {
       -            g_message(_("%s now spying on %s"),GetPlayerName(From),
       +         if (Play->Cash >= Prices.Spy) {
       +            g_message(_("%s now spying on %s"),GetPlayerName(Play),
                                                    GetPlayerName(To));
       -            From->Cash -= Prices.Spy;
       -            LoseBitch(From,NULL,NULL);
       -            NewEntry.Play=From; NewEntry.Turns=-1;
       +            Play->Cash -= Prices.Spy;
       +            LoseBitch(Play,NULL,NULL);
       +            NewEntry.Play=Play; NewEntry.Turns=-1;
                    AddListEntry(&(To->SpyList),&NewEntry);
       -            SendPlayerData(From);
       +            SendPlayerData(Play);
                 } else {
       -            g_warning(_("%s spy on %s: DENIED"),GetPlayerName(From),
       +            g_warning(_("%s spy on %s: DENIED"),GetPlayerName(Play),
                                                        GetPlayerName(To));
                 }
                 break;
              case C_TIPOFF:
       -         if (From->Cash >= Prices.Tipoff) {
       -            g_message(_("%s tipped off the cops to %s"),GetPlayerName(From),
       +         if (Play->Cash >= Prices.Tipoff) {
       +            g_message(_("%s tipped off the cops to %s"),GetPlayerName(Play),
                                                                GetPlayerName(To));
       -            From->Cash -= Prices.Tipoff;
       -            LoseBitch(From,NULL,NULL);
       -            NewEntry.Play=From; NewEntry.Turns=0;
       +            Play->Cash -= Prices.Tipoff;
       +            LoseBitch(Play,NULL,NULL);
       +            NewEntry.Play=Play; NewEntry.Turns=0;
                    AddListEntry(&(To->TipList),&NewEntry);
       -            SendPlayerData(From);
       +            SendPlayerData(Play);
                 } else {
       -            g_warning(_("%s tipoff about %s: DENIED"),GetPlayerName(From),
       +            g_warning(_("%s tipoff about %s: DENIED"),GetPlayerName(Play),
                                                              GetPlayerName(To));
                 }
                 break;
              case C_SACKBITCH:
       -         LoseBitch(From,NULL,NULL);
       -         SendPlayerData(From);
       +         LoseBitch(Play,NULL,NULL);
       +         SendPlayerData(Play);
                 break;
              case C_MSG:
       -         if (Network) g_message("%s: %s",GetPlayerName(From),Data);
       -         BroadcastToClients(C_NONE,C_MSG,Data,From,From);
       +         if (Network) g_message("%s: %s",GetPlayerName(Play),Data);
       +         BroadcastToClients(C_NONE,C_MSG,Data,Play,Play);
                 break;
              default:
       -         g_warning("%s:%c:%s:%s",GetPlayerName(From),Code,
       +         g_warning("%s:%c:%s:%s",GetPlayerName(Play),Code,
                                         GetPlayerName(To),Data);
                 break;
           }