home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 35 Internet / 35-Internet.zip / hostmgr.zip / HOSTMAN.PL < prev    next >
Perl Script  |  1999-09-10  |  107KB  |  2,812 lines

  1. #!\perl5\bin\perl
  2. use integer;
  3. use File::Copy;
  4. use Mail::Sender;
  5. use Mail::POP3Client;
  6. use MIME::QuotedPrint;  
  7.  
  8. $HostName      = "WHost";
  9. $HostNameFrom  = "Warrior Host";
  10. $FidoAddress   = "2:5035/24";
  11. $IncomeFIDO    = "";
  12. $EMailAddress  = "";
  13. $CheckTime     = 20;
  14. $WorkDir       = "";
  15. $TmpDir        = "";
  16. $InMsgDir      = "";
  17. $InFileDir     = "";
  18. $InEMailDir    = "";
  19. $HostMsgs      = "";
  20. $FromGMDir     = "";
  21. $OutMsgDir     = "";
  22. $OutEMailDir   = "";
  23. $UnZipCommand  = "";
  24. $ZipCommand    = "";
  25. $DeUUECommand  = "";
  26. $UUECommand    = "";
  27. $FlagDir       = $WorkDir;
  28. $SmtpServer    = "";
  29. $POP3User      = "";
  30. $POP3Password  = "";
  31. $POP3Server    = "";
  32. $POP3Delete    = "NO";
  33. $BackupDir     = "";
  34.  
  35. #ó¡πΓαÑ¡¡¿Ñ »ÑαѼѡ¡δÑ-«»αÑñѽѡ¿∩
  36. $IncUUE        = "incoming.uue"; #¿¼∩ Σá⌐½á ¿ºó½ÑτÑ¡¡«ú« »¿ß∞¼á
  37. $OutUUE        = "outgoing.uue";
  38. $OutMIME       = "outgoing.mim";
  39. $InternalCoder = 1;
  40. $FullLog       = 1;
  41. $SentTplName   = "SENT.TPL";
  42. $ErrorTplName  = "ERROR.TPL";
  43. $RRCTplName    = "RRC.TPL";
  44. $SleepTplName  = "SLEEP.TPL";
  45. $LogFileName   = "HOSTMAN.LOG";
  46. $CfgFileName   = "HOSTMAN.CFG";
  47. $GamesDat      = "gamesdat.moo";
  48. $tearline      = "--- Host Manager ver. 13.24.04 gamma\n* Origin : VGA PLANETS rulez forever...";
  49. $ReloadConfig  = 0;
  50. $Stop          = 1;
  51. $GameCount     = 0;
  52. $MaxMsgLines   = 400;
  53. $Password      = "host manager by AS&DL v.13.24.04g";
  54.  
  55. $fRun          = "RunThis";
  56. $fSleep        = "WaitThis";
  57. $fStop         = "StopHost";
  58. $fReload       = "InitHost";
  59. $fStatus       = "DoStatus";
  60. $fStart        = "StartNow";
  61. $ChanalOpen    = "IsSMPTchanalOPEN";
  62.  
  63.   LoadConfig();
  64.   #«íαáí«Γ¬á ¬«¼á¡ñ¡«⌐ ßΓ᫬¿
  65.   if ($#ARGV >= 0) 
  66.      {foreach $arg (@ARGV)
  67.               {if ($arg =~ /manager/i)
  68.                   {$Stop = 0}
  69.                elsif
  70.                   ($arg =~ /init/i)
  71.                   {open FILE,">$FlagDir$fReload"; close FILE} 
  72.                elsif
  73.                   ($arg =~ /stat/i)
  74.                   {open FILE,">$FlagDir$fStatus"; close FILE} 
  75.                elsif
  76.                   ($arg =~ /stop|quit|exit/i)
  77.                   {open FILE,">$FlagDir$fStop"; close FILE}
  78.                elsif
  79.                   ($arg =~ /sleep|wait/i)
  80.                   {$ArgFile = $FlagDir.$fSleep}
  81.                elsif
  82.                   ($arg =~ /run/i)
  83.                   {$ArgFile = $FlagDir.$fRun}
  84.                elsif
  85.                   ($arg =~ /start/i)
  86.                   {$ArgFile = $FlagDir.$fStart}
  87.                elsif
  88.                   ($arg =~ /\-\h|\-\?|\/\?/)
  89.                   {print "Run me without any options for HELP...\n"}
  90.                elsif
  91.                   ($ArgFile)
  92.                   {open FILE,">>$ArgFile"; print FILE "$arg\n"; close FILE};
  93.               }
  94.      }
  95.  else
  96.      {print "Host Manager ver. 13.24.003 (04.08.1999)\n";
  97.       print "Usage : perl HostMan.Pl <commands>\n";
  98.       print "        commands :\n";
  99.       print "        - manager                    = use as Host Manager\n";
  100.       print "        - stop                       = terminate Manager\n";
  101.       print "        - init                       = reload config file\n";
  102.       print "        - run GAMENAME .. GAMENAME   = run this game(s) immediate\n";
  103.       print "        - start GAMENAME .. GAMENAME = start this game(s) immediate\n";
  104.       print "        - sleep GAMENAME .. GAMENAME = sleep this game(s) immediate\n";
  105.       print "          (for sleep some races for game use - GName:Race1+Race2+Race3)\n";
  106.      };
  107.  
  108.   #«ß¡«ó¡«⌐ µ¿¬½ «íαáí«Γ¬¿ - αѪ¿¼ îÑ¡ÑñªÑα
  109.   until ($Stop)
  110.     {
  111.      #«ßΓá¡«ó¿Γ∞ ¼Ñ¡ÑñªÑα
  112.      if (-e $FlagDir.$fStop)
  113.         {unlink $FlagDir.$fStop; $Stop = 1; last};
  114.  
  115.      open LOGFILE,">>$LogFileName";
  116.  
  117.      #»ÑαÑτ¿Γδóá¡¿Ñ ¬«¡Σ¿úπαᵿ¿
  118.      if (-e $FlagDir.$fReload)
  119.         {unlink $FlagDir.$fReload; $ReloadConfig = 1};
  120.      if ($ReloadConfig)
  121.         {LoadConfig(); 
  122.          $ReloadConfig = 0;
  123.         };
  124.      #ºá»π߬ ¿úpδ ópπτ¡πε
  125.      if (-e $FlagDir.$fRun)
  126.         {open OF, $FlagDir.$fRun;
  127.          while (<OF>)
  128.            {chomp;
  129.             for ($i = 1; $i <= $GameCount; $i++)
  130.                 {if (/\b$GAMES{"Name$i"}\b/i)
  131.                     {ReadParams($i);
  132.                      $GAMEINFO{"External"} = "Run";
  133.                      printlog("[RUN $i] çá»πΘÑ¡« úÑ⌐¼¼áßΓÑα«¼ ...\n",1) if $FullLog;
  134.                      SaveParams($i);
  135.                     };
  136.                 };
  137.            };
  138.          close OF;
  139.          unlink $FlagDir.$fRun;
  140.         };
  141.      #ºá»π߬ ¿úpδ ópπτ¡πε
  142.      if (-e $FlagDir.$fStart)
  143.         {open OF, $FlagDir.$fStart;
  144.          while (<OF>)
  145.            {chomp;
  146.             for ($i = 1; $i <= $GameCount; $i++)
  147.                 {if (/\b$GAMES{"Name$i"}\b/i)
  148.                     {ReadParams($i);
  149.                      $GAMEINFO{"External"} = "Start";
  150.                      printlog("[RUN $i] æΓáαΓ«óá¡« úÑ⌐¼¼áßΓÑα«¼ ...\n",1) if $FullLog;
  151.                      SaveParams($i);
  152.                     };
  153.                 };
  154.            };
  155.          close OF;
  156.          unlink $FlagDir.$fStart;
  157.         };
  158.      #ßΓáΓπß »« ¿úαá¼
  159.      if (-e $FlagDir.$fStatus) 
  160.         {$Status = ""; 
  161.          for ($gc = 1; $gc <= $GameCount; $gc++)
  162.               {TakeGameInfo($gc,0);
  163.                $Status .= "GAME $GAMES{\"Name$gc\"} STATUS.\n".
  164.                          "Current weight = ".$GAMEINFO{"Summ"}."\n".
  165.                          "Need for run   = ".$GAMEINFO{"Need"}."\n".
  166.                          "Turns present  = ".$GAMEINFO{"Present"}."\n".
  167.                          "Turns weight   = ".$GAMEINFO{"Weight"}."\n".
  168.                          CheckNextRun($gc)."\n\n";
  169.               }  
  170.          if ($Status)
  171.             { printlog("[STATUS] $Status",1);
  172.               MessageToGM($Status);
  173.             };
  174.          unlink $FlagDir.$fStatus;      
  175.         };
  176.  
  177.      #ß½¿» ¿úpδ ópπτ¡πε
  178.      if (-e $FlagDir.$fSleep)
  179.         {open OF, $FlagDir.$fSleep;
  180.          while (<OF>)
  181.            {chomp;
  182.             for ($i = 1; $i <= $GameCount; $i++)
  183.                 {if (/\b$GAMES{"Name$i"}\b\:/i)
  184.                     {$gc     = $';
  185.                      ReadParams($i);
  186.                      $games  = '';  
  187.                      $gc     =~ s/(\d+)/($1, $games .= "$1,")/ge;     
  188.                      $GAMEINFO{"External"} = "Sleep".($games ? "=$games" : "");
  189.                      SaveParams($i);
  190.                     };
  191.                 };
  192.            };
  193.          close OF;
  194.          unlink $FlagDir.$fSleep;
  195.         };
  196.   
  197.      #»α¿Ñ¼ Ñ-¼δ½á »« POP3
  198.      if ($POP3User && $POP3Server && POP3Password)
  199.      {
  200.      $pop3= new Mail::POP3Client( USER     => $POP3User,
  201.                                   PASSWORD => $POP3Password,
  202.                                   HOST     => $POP3Server );
  203.  
  204.      if ($pop3->Alive())
  205.         {
  206.          $Count = $pop3->Count();
  207.          printlog("[POP3] Started, found $Count messages ...\n");
  208.          if ($InEMailDir =~ /([a-zA-Z0-9_\.\:\/\\\#\$\%\&\-]+)/i)
  209.             {$dir = $1;
  210.              for ($si = 1; $si <= $Count; $si++) 
  211.                  {@lines = $pop3->HeadAndBody($si);
  212.  
  213.                   $FName = MakeOutName($dir,".in");
  214.                   open FILE,">$FName" || next;
  215.                   foreach (@lines)
  216.                           {print FILE $_,"\n";
  217.                           };
  218.                   close FILE;
  219.  
  220.                   printlog("[POP3] Save new message as $FName ...\n",1) if $FullLog;
  221.                   unless ($POP3Delete =~ /no/i)
  222.                          {$pop3->Delete($si);
  223.                           printlog("[POP3] Message $si marked as deleted...\n",1) if $FullLog;
  224.                          }
  225.                   };
  226.             } 
  227.         $pop3->Close();
  228.         }
  229.       else
  230.         {printlog("[POP3] Not available ...\n")};
  231.      }; 
  232.      ViewFiles();
  233.      ViewMsgs();
  234.      ViewEMail();
  235.      ViewOutgoing();
  236.      for ($gc = 1; $gc <= $GameCount; $gc++)
  237.         {CheckGame($gc)};
  238.  
  239.      #ºñÑß∞ »α«óÑα¬á ¡á½¿τ¿∩ óδσ«ñ∩ΘÑú« Ñ-¼Ñ⌐½á ¿ Ñú« «Γß佬á
  240.      if ($SmtpServer)
  241.         {     undef $sender;
  242.               @files = ();
  243.               opendir  DIR, $OutEMailDir;
  244.               @files   = readdir DIR;
  245.               closedir DIR;
  246.               foreach $FName (@files)
  247.                 {if ($FName =~ /\.out/i)
  248.                     {open    FILE, $OutEMailDir.$FName;
  249.                      binmode FILE;
  250.                      read    FILE, $mail, -s $OutEMailDir.$FName;
  251.                      close   FILE;
  252.                      $Delete = 1;
  253.                      $email  = ""; 
  254.                      if ($mail =~ /\bTo\:.*?([^\;^\ ^\,]*?@[^\;^\ ^\,^\n]*)/i)
  255.                         {$email  = Trims($1); 
  256.                          $mail   =~ /\bSubj\:(.*)/i;
  257.                          $subj   = Trims($1);
  258.                          $mail   =~ /\bInsertFile/i; 
  259.                          $msg    = $';
  260.                          @mimeext = ();
  261.                          while ($msg   =~ /MIMEFiles\=(.*)/) 
  262.                                {$msg       = $`.$';
  263.                                 pos $files = 1; 
  264.                                 while ($files = /(^;*?)/g) {push @files,$1};
  265.                                };
  266.                          while ($msg   =~ /MIMEDataStart.*?=(\S+)\n([\s|\S]*)MIMEDataEnd/i)
  267.                                {$msg   = $`.$';
  268.                                 push   @mimeext, "$TmpDir$1";
  269.                                 open     OF,">$TmpDir$1";
  270.                                 binmode  OF;
  271.                                 syswrite OF,$2,length $2;
  272.                                 close    OF;
  273.                                };
  274.                          unless (defined $sender)
  275.                                  {
  276.                                   printlog("Open SMTP server $SmtpServer\n");       
  277.                                   $sender = new Mail::Sender({smtp => $SmtpServer, 
  278.                                                               from => $EMailAddress,
  279.                                                               subject => $ChanalOpen}
  280.                                                             );
  281.                                   if (ref $sender && !$sender->{'error'})                                   
  282.                                      {printlog("SMTP servise started for out e-mail...\n",1)
  283.                                      }
  284.                                   else    
  285.                                      {printlog("Error($sender) : $Mail::Sender::Error\n") if $FullLog;
  286.                                       last;
  287.                                      };
  288.                                  };
  289.                          $sender->Open({to => $EMailAddress, 
  290.                                         subject => $ChanalOpen});
  291.                          printlog("[SMTP Status] $sender->{'error'}, $sender\n",1);  
  292.                          last unless (ref $sender && 
  293.                                       (!defined $sender->{'error'} || 
  294.                                        (($sender->{'error'} == 0) || ($sender->{'error'} < -5))
  295.                                       )   
  296.                                      );
  297.                          $sender->Close();
  298.                          if ($#mimeext >= 0)
  299.                              {
  300.                               unless (ref $sender->MailFile({to      => $email,
  301.                                                              subject => $subj,
  302.                                                              file    => (@mimeext),        
  303.                                                              msg     => $msg}))
  304.                               {$Delete = 0};
  305.                              }
  306.                          else
  307.                              {unless (ref $sender->MailMsg({to      => $email,
  308.                                                             subject => $subj,
  309.                                                             msg     => $msg}))
  310.                               {$Delete = 0};
  311.                              };
  312.                          foreach $files (@mimeext)
  313.                                  {unlink $files};
  314.                          if ($Delete)
  315.                             {printlog ("[Out SMTP] File $FName : $subject sending to $email\n",1) if $FullLog}
  316.                          else
  317.                             {printlog ("[Error SMTP] Error sending file $FName to $email\n",1) if $FullLog}
  318.                          sleep(1);
  319.                         };
  320.                      unlink $OutEMailDir.$FName if $Delete;
  321.                      };
  322.                 }    
  323.         };
  324.      for ($gc = 1; $gc <= $GameCount; $gc++)
  325.          {SaveGameConfig($gc)};
  326.      printlog ("[DONE] Wait for next time ...\n");
  327.      close LOGFILE;
  328.      
  329.      sleep($CheckTime ? $CheckTime * 60 : 60);
  330.     };
  331.  
  332.  
  333. #################     τΓÑ¡¿Ñ Σá⌐½á ¬«¡Σ¿úπαᵿ¿    ##########################
  334. sub LoadConfig
  335. {
  336. $GameCount  = 0;
  337. my ($lc)    = 0;
  338.  
  339. open(MANCFG,$CfgFileName) || die "can't open config file...";
  340. unlink "games.dat" || die "can't close config file...";
  341. dbmopen(%GAMES,'games.dat',0644);
  342. $HostName           = "";
  343. $InMsgDir           = "";
  344. $InFileDir          = "";
  345. $InEMailDir         = "";
  346. $FromGMDir          = "";
  347. $GAMES{"Player0.0"} = "";
  348.  
  349.  
  350. printlog("--------------------------- Start of loadconfig ----------------------\n",1);
  351. while (<MANCFG>)
  352.       { $lc++;
  353.         chomp;
  354.         $line = $_;
  355.         while ($line =~ /(\;|rem|\#)/g) {$line = $`};
  356.         $line = Trims($line);
  357.         unless ($line) {next}; 
  358. #ú½«íá½∞¡δÑ «»µ¿¿
  359. #$HostName      = "";
  360.         if ($line =~ /HOSTNAME.*?[-=](.*)/i)
  361.            {$HostName     .= ";".Trims($1." "); printlog("Host name is  =$HostName\n",1); next};
  362. #$IncomeFIDO      = "";
  363.         if ($line =~ /INCOMEFIDO.*?[-=](.*)/i)
  364.            {$IncomeFIDO   .= ";".Trims($1." "); printlog("Income FIDO is=$IncomeFIDO\n",1); next};
  365. #$HostNameFrom  = "";
  366.         if ($line =~ /HOSTFROM.*?[-=](.*)/i)
  367.            {$HostNameFrom  = Trims($1." ");     printlog("Host name out =$HostNameFrom\n",1); next};
  368. #$FidoAddress   = "";
  369.         if ($line =~ /HOSTFIDO.*?[-=].*?([0-9\:\.\/]+)/i)
  370.            {$FidoAddress  =  $1;    $IncomeFIDO .= ";$1";
  371.                                                 printlog("Host FIDO     =$FidoAddress\n",1); next};
  372. #$EMailAddress  = "";
  373.         if ($line =~ /HOSTEMAIL.*?[-=].*?(\S+)/i)
  374.            {$EMailAddress  =  $1;   printlog("Host E-Mail   =$EMailAddress\n",1); next};
  375. #$CheckTime     = 20;
  376.         if ($line =~ /CHECKTIME.*?[-=].*?(\d+)/i)
  377.            {$CheckTime     =  $1;   printlog("Check time    =$CheckTime\n",1); next};
  378. #$WorkDir       = "";
  379.         if ($line =~ /WORKDIR.*?[-=](.*)/i && ValidDir($1))
  380.            {$WorkDir       =  Trims($1);   printlog("Work in dir   =$WorkDir\n",1); next};
  381. #$FlagDir       = "";
  382.         if ($line =~ /FLAGDIR.*?[-=](.*)/i && ValidDir($1))
  383.            {$FlagDir       =  Trims($1);    printlog("Flag in dir   =$FlagDir\n",1); next};
  384. #$TmpDir        = "";
  385.         if ($line =~ /TMPDIR.*?[-=](.*)/i && ValidDir($1))
  386.            {$TmpDir        =  Trims($1);    printlog("Move tmp file =$TmpDir\n",1); next};
  387. #$InMsgDir      = "";
  388.         if ($line =~ /INMSGDIR.*?[-=](.*)/i)
  389.            {$InMsgDir     .= ";".Trims($1); printlog("Check FIDO in =$InMsgDir\n",1); next};
  390. #$InFileDir     = "";
  391.         if ($line =~ /INFILEDIR.*?[-=](.*)/i)
  392.            {$InFileDir .= ";".Trims($1);    printlog("Check file in =$InFileDir\n",1); next};
  393. #$InEMailDir    = "";
  394.         if ($line =~ /INEMAILDIR.*?[-=](.*)/i)
  395.            {$InEMailDir .= ";".Trims($1);   printlog("Check EMail in=$InEMailDir\n",1); next};
  396. #$OutMsgDir     = "";
  397.         if ($line =~ /OUTMSGDIR.*?[-=](.*)/i && ValidDir($1))
  398.            {$OutMsgDir   = Trims($1);       printlog("Put FIDO to   =$OutMsgDir\n",1); next};
  399. #$OutEMailDir   = "";
  400.         if ($line =~ /OUTEMAILDIR.*?[-=](.*)/i && ValidDir($1))
  401.            {$OutEMailDir = Trims($1);       printlog("Put EMail to  =$OutEMailDir\n",1); next};
  402. #$HostMsgs     = "";
  403.         if ($line =~ /HOSTMSGS.*?[-=](.*)/i && ValidDir($1))
  404.            {$HostMsgs    = Trims($1);       printlog("Mail for GM   =$HostMsgs\n",1); next};
  405. #$FromGMDir    = "";
  406.         if ($line =~ /FROMGMDIR.*?[-=](.*)/i && ValidDir($1))
  407.            {$FromGMDir   .= Trims($1);       printlog("Mail from GM  =$FromGMDir\n",1); next};
  408. #$BackupDir    = "";
  409.         if ($line =~ /BACKUPTO.*?[-=](.*)/i && ValidDir($1))
  410.            {$BackupDir   = Trims($1);       printlog("Backed up to  =$BackupDir\n",1); next};
  411. #$MaxMsgLines  = 400;
  412.         if ($line =~ /MAXMSGLINES.*?[-=].*?(\d+)/i)
  413.            {$MaxMsgLines = $1;              printlog("Lines in MSG  =$MaxMsgLines\n",1); next};
  414.  
  415.  
  416. #$SmtpServer    = "unknown.server";
  417.         if ($line =~ /SMTPSERVER.*?[-=](.*)/i)
  418.            {$SmtpServer = Trims($1);printlog("External SMTP =$SmtpServer\n",1); next};
  419. #$POP3Server    = "unknown.server";
  420.         if ($line =~ /POP3SERVER.*?[-=](.*)/i)
  421.            {$POP3Server = Trims($1);printlog("External POP3 =$POP3Server\n",1); next};
  422. #$POP3Password = "unknown.password";
  423.         if ($line =~ /POP3PASSWORD.*?[-=](.*)/i)
  424.            {$POP3Password = Trims($1);printlog("POP3 password =$POP3Password\n",1); next};
  425. #$POP3User     = "unknown.user";
  426.         if ($line =~ /POP3USER.*?[-=](.*)/i)
  427.            {$POP3User   = Trims($1);printlog("POP3 user name  =$POP3User\n",1); next};
  428. #$POP3Delete   = "NO";
  429.         if ($line =~ /POP3Delete.*?[-=](.*)/i)
  430.            {$POP3Delete = Trims($1);printlog("Delete POP3 mail=$POP3Delete\n",1); next};
  431.  
  432.  
  433. #$UnZipCommand  = "";
  434.         if ($line =~ /UNZIP.*?[-=](.*)/i)
  435.            {$UnZipCommand = Trims($1." ");     printlog("Dearc ZIP     =$UnZipCommand\n",1); next};
  436. #$ZipCommand  = "";
  437.         if ($line =~ /DOZIP.*?[-=](.*)/i)
  438.            {$ZipCommand = Trims($1." ");       printlog("Arc ZIP       =$UnZipCommand\n",1); next};
  439. #$UnRarCommand  = "";
  440.         if ($line =~ /UNRAR.*?[-=](.*)/i)
  441.            {$UnRarCommand = Trims($1." ");     printlog("Dearc RAR     =$UnRarCommand\n",1); next};
  442. #$RarCommand  = "";
  443.         if ($line =~ /DORAR.*?[-=](.*)/i)
  444.            {$RarCommand = Trims($1." ");       printlog("Arc RAR       =$UnRarCommand\n",1); next};
  445. #$UnArjCommand  = "";
  446.         if ($line =~ /UNARJ.*?[-=](.*)/i)
  447.            {$UnArjCommand = Trims($1." ");     printlog("Dearc ARJ     =$UnArjCommand\n",1); next};
  448. #$ArjCommand  = "";
  449.         if ($line =~ /DOARJ.*?[-=](.*)/i)
  450.            {$ArjCommand = Trims($1." ");       printlog("Arc ARJ       =$UnArjCommand\n",1); next};
  451. #$UnLzhCommand  = "";
  452.         if ($line =~ /UNLZH.*?[-=](.*)/i)
  453.            {$UnLzhCommand = Trims($1." ");     printlog("Dearc LZH     =$UnLzhCommand\n",1); next};
  454. #$LzhCommand  = "";
  455.         if ($line =~ /DOLZH.*?[-=](.*)/i)
  456.            {$LzhCommand = Trims($1." ");       printlog("Arc LZH       =$LzhCommand\n",1); next};
  457. #$DeUUECommand  = "";
  458.         if ($line =~ /DEUUE.*?[-=](.*)/i)
  459.            {$DeUUECommand = Trims($1." ");     printlog("Deuue file    =$DeUUECommand\n",1); next};
  460. #$UUECommand    = "";
  461.         if ($line =~ /ENUUE.*?[-=](.*)/i)
  462.            {$UUECommand = Trims($1." ");       printlog("UUE file      =$UUECommand\n",1); next};
  463. #$CopyTo        = "";
  464.         if ($line =~ /GMCOPYTO.*?[-=](.*)/i)
  465.            {$GAMES{"Player0.0"} .= "[".Trims($1." ")."]"; printlog("CC for GM to  =$1\n",1); next};  
  466. #$GMPASSWORD
  467.         if ($line =~ /GMPASSWORD.*?[-=](.*)/i)           
  468.            {$Password = Trims($1);             printlog("GM Password   =$Password\n",1); next};  
  469.  
  470.         if ($line =~ /GAMEDATA.*?=(.*)/i)
  471.            {my ($FName) = Trims($1);
  472.             if (open   GAMEDATA,$FName)
  473.                {$GameCount++;
  474.                 $GAMES{"DATAFILE$GameCount"} = $FName;
  475.                 delete $GAMES{"Name$GameCount"};
  476.                 delete $GAMES{"Dir$GameCount"};
  477.                 delete $GAMES{"Days$GameCount"};
  478.                 delete $GAMES{"Time$GameCount"};
  479.                 delete $GAMES{"Run$GameCount"};
  480.                 delete $GAMES{"Wait$GameCount"};
  481.                 delete $GAMES{"Weight$GameCount"};
  482.                 delete $GAMES{"Weights$GameCount"};
  483.                 delete $GAMES{"CheckDec$GameCount"};
  484.                 delete $GAMES{"EnableVia$GameCount"};
  485.                 delete $GAMES{"RRCTpl$GameCount"};
  486.                 delete $GAMES{"SleepTpl$GameCount"};
  487.                 delete $GAMES{"SentTpl$GameCount"};
  488.                 delete $GAMES{"ErrorTpl$GameCount"};
  489.                 delete $GAMES{"Comments$GameCount"}; 
  490.                 for (my $i = 1; $i <= 11; $i++)
  491.                     {delete $GAMES{"Player$GameCount.$i"}};
  492.                 delete $GAMES{"Include$GameCount"};
  493.                 my $gc = 0;
  494.  
  495.    COMMENT:     while (<GAMEDATA>)
  496.                  {$gc++;
  497.                   chomp;
  498.                   $line = $_;
  499.                   while ($line =~ m/(\;|rem|\#)/g) 
  500.                         {if (pos $line == 1)
  501.                                 {$GAMES{"Comments$GameCount"} .= "[$line]";
  502.                                  next COMMENT;
  503.                                 }
  504.                          else
  505.                                 {$line = $`
  506.                                 }
  507.                          };  
  508.                   $line = Trims($line);
  509.                   unless ($line) {next};
  510.                   if ($line =~ /\bGAMENAME.*?[-=].*?(\w+)/i)
  511.                      {$GAMES{"Name$GameCount"} = $1; next};
  512.                   if ($line =~ /\bGAMEDIR.*?[-=](.*)/i && ValidDir($1))
  513.                      {$GAMES{"Dir$GameCount"} = Trims($1); next};
  514.                   if ($line =~ /\bDAILY.*?[-=].*?(\w+)/i)
  515.                      {$GAMES{"Days$GameCount"} = $1; next};
  516.                   if ($line =~ /\bRUNTIME.*?[-=].*?(\d+)[:-](\d+)/i)
  517.                      {$GAMES{"Time$GameCount"} = $1 * 3600 + $2 * 60; next};
  518.                   if ($line =~ /\bRUNCOMMAND.*?[-=](.*)/i)
  519.                      {$GAMES{"Run$GameCount"} = Trims($1); next};
  520.                   if ($line =~ /\bCHECKWEIGHT.*?[-=].*?(\d+)/i)
  521.                      {$GAMES{"Weight$GameCount"} = $1; next};
  522.                   if ($line =~ /\bWEIGHTS.*?[-=].*?(\w+)/i)
  523.                      {$GAMES{"Weights$GameCount"} = $1; next};
  524.                   if ($line =~ /\bCHECKDEC.*?[-=].*?(\d+)/i)
  525.                      {$GAMES{"CheckDec$GameCount"} = $1; next};
  526.                   if ($line =~ /\bWAIT.*?[-=].*?(\d+)/i)
  527.                      {$GAMES{"Wait$GameCount"} = $1; next};
  528.                   if ($line =~ /\bENABLEVIA.*?[-=].*?(\w+)/i)
  529.                      {$GAMES{"EnableVia$GameCount"} = $1; next};
  530.                   if ($line =~ /\bRRC.*?[-=].*?([a-zA-Z0-9\_\.\:\/\\\#\$\%\&\-]+)/i)
  531.                      {$GAMES{"RRCTpl$GameCount"} = $1; next};
  532.                   if ($line =~ /\bSLEEP.*?[-=].*?([a-zA-Z0-9\_\.\:\/\\\#\$\%\&\-]+)/i)
  533.                      {$GAMES{"SleepTpl$GameCount"} = $1; next};
  534.                   if ($line =~ /\bSENT.*?[-=].*?([a-zA-Z0-9\_\.\:\/\\\#\$\%\&\-]+)/i)
  535.                      {$GAMES{"SentTpl$GameCount"} = $1; next};
  536.                   if ($line =~ /\bERROR.*?[-=].*?([a-zA-Z0-9\_\.\:\/\\\#\$\%\&\-]+)/i)
  537.                      {$GAMES{"ErrorTpl$GameCount"} = $1; next};
  538.                   if ($line =~ /\bPLAYER(\d+).*?[-=](.*)/i)
  539.                      {$GAMES{"Player$GameCount.$1"} .= "[".Trims($2)."]"; next};
  540.                   if ($line =~ /\bINCLUDE.*?[-=](.*)/i)
  541.                      {$GAMES{"Include$GameCount"}   .= "[".Trims($1)."]"; next};
  542.                   printlog ("[WARNING] Unknown command line at $gc file $FName...\n");                     
  543.                  }
  544.                 close GAMEDATA;
  545.                 printlog ("Find game data - succesfully work as game #$GameCount\n",1);
  546.                }
  547.             next;
  548.            }
  549.         printlog ("[WARNING] Unknown command line at $lc file $CfgFileName...\n");   
  550.       }
  551. printlog("--------------------------- End of loadconfig ----------------------\n",1);
  552. close(MANCFG);
  553. }
  554.  
  555. sub ValidDir
  556. {my ($dir) = @_;
  557.  return -d Trims($dir);
  558. };
  559.  
  560. sub SaveGameConfig
  561. {my ($GNum) = @_;
  562.  unless ( ($GAMES{"DATAFILE$GNum"}) && (open GAMEDATA,">".$GAMES{"DATAFILE$GNum"}) )
  563.         {return 0}; 
  564.  if ($GAMES{"Name$GNum"}) {print GAMEDATA "  GAMENAME   = ".$GAMES{"Name$GNum"}."\n"};
  565.  if ($GAMES{"Dir$GNum"})  {print GAMEDATA "  GAMEDIR    = ".$GAMES{"Dir$GNum"}."\n"};
  566.  if ($GAMES{"Days$GNum"}) {print GAMEDATA "  DAILY      = ".$GAMES{"Days$GNum"}."\n"};
  567.  if ($GAMES{"Time$GNum"})
  568.                           {print GAMEDATA "  RUNTIME    = ".($GAMES{"Time$GNum"} / 3600).':'.
  569.                                                             (($GAMES{"Time$GNum"} % 3600) / 60)."\n"};
  570.  if ($GAMES{"Run$GNum"})
  571.                           {print GAMEDATA "  RUNCOMMAND = ".$GAMES{"Run$GNum"}."\n"};
  572.  if ($GAMES{"Weight$GNum"})
  573.                           {print GAMEDATA "  CHECKWEIGHT= ".$GAMES{"Weight$GNum"}."\n"};
  574.  if ($GAMES{"Weights$GNum"})
  575.                           {print GAMEDATA "  WEIGHTS    = ".$GAMES{"Weights$GNum"}."\n"};
  576.  if ($GAMES{"Wait$GNum"})
  577.                           {print GAMEDATA "  WAIT       = ".$GAMES{"Wait$GNum"}."\n"};
  578.  if ($GAMES{"CheckDec$GNum"})
  579.                           {print GAMEDATA "  CHECKDEC   = ".$GAMES{"CheckDec$GNum"}."\n"};
  580.  if ($GAMES{"EnableVia$GNum"})
  581.                           {print GAMEDATA "  ENABLEVIA  = ".$GAMES{"EnableVia$GNum"}."\n"};
  582.  if ($GAMES{"RRCTpl$GNum"})
  583.                           {print GAMEDATA "  RRC        = ".$GAMES{"RRCTpl$GNum"}."\n"};
  584.  if ($GAMES{"SleepTpl$GNum"})
  585.                           {print GAMEDATA "  SLEEP     = ".$GAMES{"SleepTpl$GNum"}."\n"};
  586.  if ($GAMES{"SentTpl$GNum"})
  587.                           {print GAMEDATA "  SENT      = ".$GAMES{"SentTpl$GNum"}."\n"};
  588.  if ($GAMES{"ErrorTpl$GNum"})
  589.                           {print GAMEDATA "  ERROR     = ".$GAMES{"ErrorTpl$GNum"}."\n"};
  590.  for (my $i = 1; $i <= 11; $i++)
  591.      {my $line = $GAMES{"Player$GNum.$i"};
  592.       while ($line =~ /\[(.*?)\]/g)
  593.             {              print GAMEDATA "  PLAYER$i  = ".$1."\n";
  594.             }
  595.      };
  596.  $line = $GAMES{"Include$GNum"};
  597.  while ($line =~ m/\[(.*?)\]/g)
  598.        {                   print GAMEDATA " INCLUDE    = ".$1."\n"
  599.        };  
  600.  $line = $GAMES{"Comments$GNum"};
  601.  while ($line =~ m/\[(.*?)\]/g)
  602.        {                   print GAMEDATA $1."\n"
  603.        };  
  604.  
  605.  close GAMEDATA;
  606. }
  607.  
  608.  
  609. #################    »α«ß¼«Γα óσ«ñ¡δσ ¬áΓὫú«ó #########################
  610. # »α«ß¼«Γα Σá⌐½«ó
  611. sub ViewFiles
  612. {
  613. my (@files);
  614. my $line = $InFileDir;
  615. while ($line =~ /([a-zA-Z0-9_\.\:\/\\\#\$\%\&\-]+)/)
  616.       {$line = $';
  617.        opendir(DIR,$1) || next;
  618.        @files     = readdir(DIR);
  619.        $dir       = $1;
  620.        closedir DIR;
  621.        printlog("[SCAN Files] $dir\n");
  622.        #- if ( ($lasttime) = (stat("$1lastread.hst"))[8] )    -#  
  623.        #-    {unlink("$1lastread.hst")} else {$lasttime = 0}; -#
  624.        #- open(TIMEFILE,">$1lastread.hst"); close(TIMEFILE);  -#
  625.        foreach $file (@files)
  626.                { #- if ( (stat("$dir$file"))[8] > $lasttime) -#
  627.                     {
  628.                      my($GameNum,$RaceNum) = 0;
  629.                      if(($GameNum,$RaceNum) = ValidFName($file))
  630.                         {printlog("[i] Find new file : $dir$file\n",1) if $FullLog;
  631.                          if ($file =~ /\.tr[a-z0-9]/i)
  632.                             {DoFile($dir,$file,$GameNum,$RaceNum,$dir.$file,"TRN",1);
  633.                             }
  634.                          elsif
  635.                             ($file =~ /\.vp[a-z0-9]|zi[a-z0-9]|ar[a-z0-9]|ra[a-z0-9]|lz[a-z0-9]/i)
  636.                             {DeArcFile($dir.$file,$TmpDir,$GameNum,$RaceNum,$dir.$file,"VPF",1);
  637.                             };
  638.                         };
  639.                     }
  640.                }
  641.       };
  642. }
  643.  
  644. #»α«ß¼«Γα à-îÑ⌐½á
  645. sub ViewEMail
  646. {
  647. my $line = $InEMailDir;
  648. while ($line =~ /([[a-zA-Z0-9_\.\:\/\\\#\$\%\&\-]+)/)
  649.       {$line = $';
  650.        opendir(DIR,$1) || next;
  651.        my(@files) = readdir(DIR);
  652.        $dir       = $1;
  653.        printlog("[SCAN EMail] $dir\n");   
  654.        closedir DIR;
  655.        #- if ( ($lasttime) = (stat("$1lastread.hst"))[8] )    -#
  656.        #-    {unlink("$1lastread.hst")} else {$lasttime = 0}; -#
  657.        #- open(TIMEFILE,">$1lastread.hst"); close(TIMEFILE);  -#
  658.        foreach $file (@files)
  659.                { if #- ((stat("$dir$file"))[8] > $lasttime) ) -#
  660.                     ($file =~ /\.in\b/i)
  661.                     {
  662.                      DivEMail($dir.$file);
  663.                     }
  664.                }
  665.       };
  666. }
  667.  
  668. #»α«ß¼«Γα öêäÄ-îÑ⌐½á
  669. sub ViewMsgs
  670. {
  671. my $line = $InMsgDir;
  672. while ($line =~ /([a-zA-Z0-9_\.\:\/\\\#\$\%\&\-]+)/)
  673.       {$line = $';
  674.        opendir(DIR,$1) || next;
  675.        my(@files) = readdir(DIR);
  676.        $dir       = $1;
  677.        closedir DIR;
  678.        printlog("[SCAN FIDO] $dir\n");
  679.        #- if ( ($lasttime) = (stat("$1lastread.hst"))[8] )    -#
  680.        #-    {unlink("$1lastread.hst")} else {$lasttime = 0}; -#
  681.        #- open(TIMEFILE,">$1lastread.hst"); close(TIMEFILE);  -#
  682.        foreach $file (@files)
  683.                { if #- (stat("$dir$file"))[8] > $lasttime) -#
  684.                     ( $file =~ /\.msg/i )
  685.                     {
  686.                      DivMsg($dir.$file);
  687.                     }
  688.                }
  689.       };
  690. }
  691.  
  692. #»α«ß¼«Γα »¿ßѼ «Γ âî ¿úα«¬á¼ ¿º öêäÄ-îÑ⌐½á
  693. sub ViewOutgoing
  694. {
  695. my $line = $FromGMDir;
  696. while ($line =~ /([a-zA-Z0-9_\.\:\/\\\#\$\%\&\-]+)/)
  697.       {$line = $';
  698.        opendir(DIR,$1) || next;
  699.        my(@files) = readdir(DIR);
  700.        $dir       = $1;
  701.        closedir DIR;
  702.        printlog("[SCAN FROM GM] $dir\n");
  703.        #- if ( ($lasttime) = (stat("$1lastread.hst"))[8] )    -#
  704.        #-    {unlink("$1lastread.hst")} else {$lasttime = 0}; -#
  705.        #- open(TIMEFILE,">$1lastread.hst"); close(TIMEFILE);  -#
  706.        foreach $file (@files)
  707.                { if #- (stat("$dir$file"))[8] > $lasttime) -#
  708.                     ( $file =~ /\.msg/i )
  709.                     {#- printlog("[i] Find new GM-mail : $dir$file\n",1) if $FullLog; -#
  710.                      OutMsg($dir.$file);
  711.                     }
  712.                }
  713.       };
  714. }
  715.  
  716.  
  717. #¿ºó½ÑτÑ¡¿Ñ ¿º Σ«α¼áΓá »¿ß∞¼á à-îÑ⌐½á
  718. sub DivEMail
  719. { my ($file) = @_;
  720.   my ($filename);
  721.   my @mail  = ();
  722.   my @files = ();
  723.   my $mail  = [];
  724.   my $blank = 1;
  725.   $filesize = -s $file                    || return 0;
  726.   open(MAILFILE,"$file")                  || return 0;
  727.   #ñѽ¿¼ mbox
  728.   $c=0;
  729.   while (<MAILFILE>)
  730.         {if ($blank && /\AFrom .*\d{4}/) 
  731.             {push(@mail, $mail) if scalar(@{$mail});
  732.          $mail = [ $_ ];
  733.          $blank = 0;
  734.         }
  735.          else 
  736.             {$blank = m#\A\Z#o ? 1 : 0;
  737.          push(@{$mail}, $_);
  738.         }
  739.          };
  740.    push(@mail, $mail) if scalar(@{$mail});
  741.    close MAILFILE;
  742.    $filename =  $file; 
  743.    $filename =~ s/(.*?)[^\\^\/]*?$/$1/i;
  744.    rename ($file,MakeOutName($filename, ".ins"));
  745.    
  746.    # ΓÑ»Ñα∞ ¿¼ÑѼ ¼áßß¿ó ¼áßß¿ó«ó ßΓ᫬ 
  747.    # @{$mail}
  748.   foreach $mail (@mail)
  749.           {$buf = join("",@{$mail});
  750.            $buf =~ /From:(.*)/i || next;
  751.            my $From = Trims($1);
  752.            $buf =~ /To:(.*)/i   || next;
  753.            my $To   = Trims($1);
  754.  
  755.            pos $HostName = 0;    
  756.            my  $ValidName= 0;
  757.            while ($HostName  =~ /([^;^,]+)/gc)
  758.                  {$blank = $1;
  759.                   if ($To =~ /$blank/i) {$ValidName = 1}
  760.                  };
  761.            next unless $ValidName;
  762.  
  763.            printlog("[EMAIL] $From -> $To\n",1) if $FullLog;
  764.            my $Subj   = ""; 
  765.            ($buf =~ /Subject:(.*)/i) && ($Subj = Trims($1));
  766.            if (($Subj eq $ChanalOpen) and ($From eq $EMailAddress))
  767.               {printlog ("[EMAIL] Chanal opening message - skipping...\n",1)  if $FullLog;
  768.                next;
  769.               };
  770.            @thisfile  = ();
  771.            #multypart
  772.            if ($buf =~ /Content-Type[\s|\S]*?boundary=(\"{0,1})(.+)\1/i)
  773.               {$bound = "--".$2;
  774.                $open  = 0;
  775.                while ($buf =~ /(.*?[\n|\r]{1,2})/gc)
  776.                      {$line = $1;
  777.                       if ($line =~ /$bound(.*)/)
  778.                          {close MAILFILE if $open;
  779.                           last if ($1 eq "--"); 
  780.                           $thisfile = MakeOutName($TmpDir,".em");
  781.                           push    @thisfile,$thisfile;
  782.                           open    MAILFILE,">$thisfile";
  783.                           binmode MAILFILE;
  784.                           $open   = 1;
  785.                          }
  786.                       else 
  787.                          {syswrite(MAILFILE,$line,length $line) if ($open);
  788.                          }
  789.                      }
  790.               }
  791.            else
  792.               {$thisfile = MakeOutName($TmpDir,".em");
  793.                open     MAILFILE,">$thisfile";
  794.                binmode  MAILFILE;
  795.                syswrite MAILFILE,$buf,length $buf;
  796.                close    MAILFILE;
  797.                push     @thisfile,$thisfile;
  798.               };
  799.          $RNum = $GNum = 0;
  800.          if ($Subj =~ /game.*?(\w+).*?race.*?(\d+)/i)
  801.             {$RNum  = $2;
  802.              $GName = $1;
  803.              for ($i = 1; $i <= $GameCount; $i++)
  804.                  {if (($GAMES{"Name$i"} =~ /\b$GName\b/i) ||
  805.                       (($GAMES{"Name$i"} >= 10) && ($GAMES{"Name$i"} <= 32) &&
  806.                        (chr($GAMES{"Name$i"}+55) =~ /\b$GName\b/i)))
  807.                      {$GNum = $i; last;
  808.                      }
  809.                  }
  810.             };
  811.  
  812.          foreach $thisfile (@thisfile)
  813.            {open     (MAILFILE,$thisfile) || next;
  814.             binmode  MAILFILE;
  815.             read     MAILFILE,$onemess,-s $thisfile;
  816.             close    MAILFILE;
  817.             if ($onemess =~ /Content-Type.*?charset=\s*?(\S+)/i)
  818.                {$onemess = ConvertToAlt($onemess,$1);
  819.                 open     (MAILFILE,">$thisfile") || next;
  820.                 binmode  MAILFILE;
  821.                 syswrite MAILFILE,$onemess,length $onemess;
  822.                 close    MAILFILE;
  823.                };
  824.  
  825.             if ($Subj =~ /game.*?(\w+).*?from.*?(\d+).*?to.*?(\d+)/)
  826.                {my $RNum      = $1;
  827.                 my $FromRace  = $2;
  828.                 my $ToRace    = $3;
  829.                 my $GNum      = 0;
  830.                 for (my $i = 1; $i <= $GameCount; $i++)
  831.                     {if ($GAMES{"Name$i"} =~ /\b$RNum\b/i)
  832.                         {$GNum = $i; last};
  833.                     };
  834.                 last unless $GNum;
  835.                 last unless $GAMES{"EnableVia$GNum"};
  836.                 $onemess = "Internal message from $FromRace\n".ConvertFromAlt($onemess,'koi');
  837.                 open     FILE, ">$TmpDir$OutUUE" || return 0;
  838.                 binmode  FILE;
  839.                 syswrite FILE,$onemess,length $onemess;
  840.                 close    FILE;
  841.                 OutMail($GNum,$ToRace,0);
  842.                 printlog("[MSG] Sent via msg in game <$GAMES{\"Name$GNum\"}> $FromRace -> $ToRace\n");
  843.                 open     FILE, ">$TmpDir$OutUUE" || return 0;
  844.                 binmode  FILE;
  845.                 $buf     = "I sent your message in game <$GAMES{\"Name$GNum\"}> ".
  846.                            "to $ToRace at".localtime()."\n";
  847.                 syswrite FILE,$buf,length $buf;
  848.                 close    FILE;
  849.                 OutMail($GNum,$FromRace,0);
  850.                 next;
  851.                };
  852.  
  853.             if ($Subj eq $Password)
  854.                {Remote($onemess);
  855.                 next;
  856.                }   
  857.  
  858.             if ($onemess =~ /Content-Transfer-Encoding.*?quoted-print/i)
  859.                {
  860.                 $onemess =~ s/[ \t]+?(\r?\n)/$1/g;  # rule #3 (trailing space must be deleted)
  861.                 $onemess =~ s/=\r?\n//g;            # rule #5 (soft line breaks)
  862.                 $onemess =~ s/=([\da-fA-F]{2})/pack("C", hex($1))/ge;
  863.                 open     (MAILFILE,">$thisfile") || next;
  864.                 binmode  MAILFILE;
  865.                 syswrite MAILFILE,$onemess,length $onemess;
  866.                 close    MAILFILE;
  867.                };
  868.             my ($StoreFile) = $thisfile;  
  869.             if ($onemess =~ /Content-Transfer-Encoding.*base64/i)
  870.                { #DeMIME message
  871.                  next unless ($onemess =~ /\n\n/); 
  872.                  if ($onemess =~ /Content-Disposition.*?attachment.*?filename=(\"{0,1})(.+)\1/i) 
  873.                     {$thisfile = $2;
  874.                      @files    = ($thisfile);
  875.                     };
  876.                  $onemess = MIME::Base64::decode($'); 
  877.                  open     MAILFILE,">$TmpDir$thisfile" || next;
  878.                  binmode  MAILFILE;
  879.                  syswrite MAILFILE,$onemess,length $onemess;
  880.                  close    MAILFILE;
  881.                }
  882.  
  883.             if ($#files == -1)            
  884.                {if (($onemess =~ /file.*?([a-zA-Z0-9]*)\.(trn|vpf|arj|lzh|rar|zip)/i) ||
  885.                     ($onemess =~ /begin.*?([a-zA-Z0-9]*)\.(trn|vpf|arj|lzh|rar|zip)/i))
  886.                    {$FName = "$1.$2"}
  887.                 else
  888.                    {MessageToGM($onemess);
  889.                     next
  890.                    };
  891.                 DeUUEFile($thisfile,$TmpDir.$FName);
  892.                 opendir (DIR,$TmpDir);
  893.                 @files   = readdir DIR;
  894.                 closedir DIR;
  895.                }
  896.  
  897.            foreach $filename (@files)
  898.              {if ($filename =~ /\.(trn)/i)
  899.                  {DoFile($TmpDir,$filename,$GNum,$RNum,$StoreFile,"EM",1);
  900.                   printlog("[Delete] $TmpDir$filename\n",1) if $FullLog;
  901.                   unlink $TmpDir.$filename;
  902.                  }
  903.               elsif
  904.                  ($filename =~ /\.(vpf|zip|rar|arj|lzh)/i)
  905.                  {DeArcFile($TmpDir.$filename,$TmpDir,$GNum,$RNum,$StoreFile,"EM",1);
  906.                   printlog("[Delete] $TmpDir$filename\n",1) if $FullLog;
  907.                   unlink $TmpDir.$filename;
  908.                  };
  909.              };
  910.               
  911.             unlink $StoreFile; 
  912.             @files = ();                
  913.            } 
  914.           }
  915. }; 
  916.  
  917. sub ConvertToAlt
  918. { my($line,$from) = @_;
  919.   if
  920.      ($from =~ /koi/i)
  921.      {$line =~ tr/[.+-|ßΓ≈τΣσ÷·ΘΩδ∞φε∩≡≥≤⌠⌡µΦπ■√² ∙°ⁿα±┴┬╫╟─┼╓┌╔╩╦╠═╬╧╨ÉæÆüç▓┤ºª╡í¿«¡¼âäëêåÇè»░½Ñ╗╕▒á╛╣║╢╖¬⌐óñ╜╝àéìîÄÅï╥╙╘╒╞╚├▐█▌▀┘╪▄└╤│úÖÿô¢ƒù£₧òûÜ¥ö┐]/[.+-|ÇüéâäàåçêëèïîìÄÅÉæÆôöòûùÿÖÜ¢£¥₧ƒáíóúñѪº¿⌐¬½¼¡«»░▒▓│┤╡╢╖╕╣║╗╝╜╛┐└┴┬├─┼╞╟╚╔╩╦╠═╬╧╨╤╥╙╘╒╓╫╪┘┌█▄▌▐▀αßΓπΣσµτΦΘΩδ∞φε∩≡±≥≤⌠⌡÷≈°∙·√ⁿ²■]/
  922.      }
  923.   elsif
  924.      ($from =~ /win/i)
  925.      {$line =~ tr/[└┴┬├─┼╞╟╚╔╩╦╠═╬╧╨╤╥╙╘╒╓╫╪┘┌█▄▌▐▀αßΓπΣσµτΦΘΩδ∞φε∩≡±≥≤⌠⌡÷≈°∙·√ⁿ²■ ]/[ÇüéâäàåçêëèïîìÄÅÉæÆôöòûùÿÖÜ¢£¥₧ƒáíóúñѪº¿⌐¬½¼¡«»αßΓπΣσµτΦΘΩδ∞φε∩]/
  926.      };
  927.   return $line;
  928. }
  929.  
  930. sub ConvertFromAlt
  931. { my($line,$from) = @_;
  932.   if
  933.      ($from =~ /koi/i)
  934.      {$line =~ tr/[.+-|ÇüéâäàåçêëèïîìÄÅÉæÆôöòûùÿÖÜ¢£¥₧ƒáíóúñѪº¿⌐¬½¼¡«»░▒▓│┤╡╢╖╕╣║╗╝╜╛┐└┴┬├─┼╞╟╚╔╩╦╠═╬╧╨╤╥╙╘╒╓╫╪┘┌█▄▌▐▀αßΓπΣσµτΦΘΩδ∞φε∩≡±≥≤⌠⌡÷≈°∙·√ⁿ²■]/[.+-|ßΓ≈τΣσ÷·ΘΩδ∞φε∩≡≥≤⌠⌡µΦπ■√² ∙°ⁿα±┴┬╫╟─┼╓┌╔╩╦╠═╬╧╨ÉæÆüç▓┤ºª╡í¿«¡¼âäëêåÇè»░½Ñ╗╕▒á╛╣║╢╖¬⌐óñ╜╝àéìîÄÅï╥╙╘╒╞╚├▐█▌▀┘╪▄└╤│úÖÿô¢ƒù£₧òûÜ¥ö┐]/;
  935.      }
  936.   elsif
  937.      ($from =~ /win/i)
  938.      {$line =~ tr/[ÇüéâäàåçêëèïîìÄÅÉæÆôöòûùÿÖÜ¢£¥₧ƒáíóúñѪº¿⌐¬½¼¡«»αßΓπΣσµτΦΘΩδ∞φε∩]/[└┴┬├─┼╞╟╚╔╩╦╠═╬╧╨╤╥╙╘╒╓╫╪┘┌█▄▌▐▀αßΓπΣσµτΦΘΩδ∞φε∩≡±≥≤⌠⌡÷≈°∙·√ⁿ²■ ]/;
  939.       printlog("[ALT-> WIN]\n");
  940.      };
  941.   return $line;
  942. }
  943.  
  944.  
  945. #¿ºó½ÑτÑ¡¿Ñ ¿º Σ«α¼áΓá »¿ß∞¼á öêäÄ
  946.  
  947. #FIDO_Message = Record
  948. #     Msg_From, Msg_To                                           : Array [1..36] of Char;
  949. #     Subj                                                       : Array [1..72] of Char;
  950. #     Msg_Date                                                   : Array [1..20] of Char;
  951. #     Times_Read, Dest_Node, Orig_Node, Cost, Orig_Net, Dest_Net : Integer;
  952. #     Date_Written, Date_Arrived                                 : LongInt;
  953. #     Reply                                                      : Integer;
  954. #     Attributes                                                 : Word;
  955. #       (* Bit 0    Private
  956. #              1    Crash
  957. #              2    Message read
  958. #              3    Message sent
  959. #              4    File-attach
  960. #              5    Forwarded
  961. #              6    Orphan
  962. #              7    Kill/sent
  963. #              8    Local message
  964. #              9    Hold
  965. #              10    ???
  966. #              11    File-request
  967. #              12    Return-receipt requested
  968. #              13    Return-receipt
  969. #              14    Audit-trail requested
  970. #              15    Update-request  *)
  971. #     Unreply                                                    : Integer;
  972. #     Txt                                                        : Array [1..$8000] of Char;
  973. #       (* The message text field contains text of
  974. #          any length, terminated with a null (0) byte *)
  975. #end;
  976.  
  977. sub DivMsg
  978. { my ($file) = @_;
  979.   my ($filename,$i,$GNum,$RNum,$FromRace,$ToRace);
  980.   $filesize = -s $file                    || return 0;
  981.   open(MAILFILE,"$file")                  || return 0;
  982.   read(MAILFILE,$buf,$filesize)           || return 0;
  983.   close(MAILFILE);
  984.  
  985.   $filesize -= $filesize > 190 ? 190 : $filesize;
  986.   ($From,$To,$Subj,$temp,$let) = unpack("A36 A36 A72 A46 a$filesize", $buf);
  987.   $From = Trims($From);  $To   = Trims($To);  $Subj = Trims($Subj); 
  988.  
  989.   pos $HostName = 0;    
  990.   my  $ValidName= 0;
  991.   while ($HostName  =~ /([^;^,]+)/gc)
  992.         {$blank = $1;
  993.          if ($To =~ /$blank/i) {$ValidName = 1}
  994.         };
  995.   next unless $ValidName;
  996.  
  997.   my $ToFIDO = unpack("s",substr($temp,30,2)).
  998.                "/".
  999.                unpack("s",substr($temp,22,2));  
  1000.   if ($let =~ /TOPT.*?(\d+)/i) {$ToFIDO .= ".$1"};
  1001.   next unless ($IncomeFIDO =~ /\b$ToFIDO\b/i);
  1002.  
  1003.   printlog ("[MSG] $From->$To = $Subj\n",1) if $FullLog;
  1004.   if ($Subj eq $Password)
  1005.      {Remote($let); 
  1006.       unlink $file;
  1007.       return 1
  1008.      };
  1009.    
  1010.   if ($Subj =~ /game.*?(\w+).*?from.*?(\d+).*?to.*?(\d+)/)
  1011.      {$RNum      = $1;
  1012.       $FromRace  = $2;
  1013.       $ToRace    = $3;
  1014.       $GNum      = 0;
  1015.       for ($i = 1; $i <= $GameCount; $i++)
  1016.           {if ($GAMES{"Name$i"} =~ /\b$RNum\b/i)
  1017.               {$GNum = $i; last};
  1018.           };
  1019.       return 0 unless $GNum;
  1020.       return 0 unless $GAMES{"EnableVia$GNum"};
  1021.       $let =~ s/(\x01.*?\x0D)//g;
  1022.       $let = "Internal message from $FromRace\n".$let;
  1023.       open     FILE, ">$TmpDir$OutUUE" || return 0;
  1024.       binmode  FILE;
  1025.       syswrite FILE,$let,length $let;
  1026.       close    FILE;
  1027.       OutMail($GNum,$ToRace,0);
  1028.       printlog("[MSG] Sent via msg in game <$GAMES{\"Name$GNum\"}> $FromRace -> $ToRace\n");
  1029.       open     FILE, ">$TmpDir$OutUUE" || return 0;
  1030.       binmode  FILE;
  1031.       $buf     = "I sent your message in game <$GAMES{\"Name$GNum\"}> ".
  1032.                  "to $ToRace at ".localtime()."\n";
  1033.       syswrite FILE,$buf,length $buf;
  1034.       close    FILE;
  1035.       OutMail($GNum,$FromRace,0);
  1036.       unlink $file;  
  1037.       return 1;
  1038.      }
  1039.  
  1040.   open (UUEFILE,">$TmpDir$IncUUE") || return 0;
  1041.   print UUEFILE  $let              || return 0;
  1042.   close(UUEFILE);
  1043.   $RNum = $GNum = 0;
  1044.   if ($Subj =~ /.*?game.*?(\w+).*?race.*?(\d+)/i)
  1045.   {$RNum  = $2;
  1046.    $GName = $1;
  1047.    for ($i = 1; $i <= $GameCount; $i++)
  1048.        {if (($GAMES{"Name$i"} =~ /\b$GName\b/i) ||
  1049.             (($GAMES{"Name$i"} >= 10) && ($GAMES{"Name$i"} <= 32) &&
  1050.              (chr($GAMES{"Name$i"}+55) =~ /\b$GName\b/i)))
  1051.            {$GNum = $i; last;
  1052.            }
  1053.        };
  1054.   };
  1055.   if (($let =~ /file.*?([a-zA-Z0-9]*)\.(trn|vpf|arj|lzh|rar|zip)/i) ||
  1056.       ($let =~ /begin.*?([a-zA-Z0-9]*)\.(trn|vpf|arj|lzh|rar|zip)/i))
  1057.      {$FName = "$1.$2"}
  1058.   else
  1059.      {MessageToGM("From:$From\nTo:$To\nSubj:$Subj\n$let");
  1060.       return 0
  1061.      };
  1062.    DeUUEFile($TmpDir.$IncUUE,$TmpDir.$FName);
  1063.    unlink($TmpDir.$IncUUE);
  1064.    opendir (DIR,$TmpDir);
  1065.    my(@files)  = readdir DIR;
  1066.    closedir DIR;
  1067.    foreach $filename (@files)
  1068.    { if ($filename =~ /\.(trn|vpf|zip|rar|arj|lzh)/i)
  1069.         {DeArcFile($TmpDir.$filename,$TmpDir,$GNum,$RNum,$file,"FM",1);
  1070.          printlog("[Delete] $TmpDir$filename\n",1) if $FullLog;
  1071.          unlink $TmpDir.$filename;
  1072.         };
  1073.    };
  1074. }
  1075.  
  1076. sub Remote
  1077. {my ($commands)  = @_;
  1078.  my ($cmd,$cmdline,$mode,$i,$mess,$gc,$gr) = "";
  1079.  my $outmsg = "_REMOTE_CONTROL_OPERATING_STATUS_\n"; 
  1080.  while ($commands =~ /(.*?)[\n|\r]{1,2}/g)
  1081.   {$cmd = $1;
  1082.    if ($cmd =~ /\s*?\%SLEEP\b/)
  1083.       {$cmd = $'; $outmsg .= "I set SLEEP flags for :\n";
  1084.        open  FILE,">>$FlagDir$fSleep" || next; 
  1085.        if (Trims($cmd))
  1086.           {while ($cmd =~ /(\S+)/g) {print FILE "$1\n"; $outmsg .= "$1\n"}
  1087.           }      
  1088.        else
  1089.           {for ($i = 1; $i <= $GameCount; $i++)
  1090.                {print FILE $GAMES{"Name$i"}."\n";
  1091.                 $outmsg .= $GAMES{"Name$i"}."\n"
  1092.                };  
  1093.           };
  1094.        close FILE; 
  1095.       }
  1096.    elsif
  1097.       ($cmd =~ /\s*?%RUN\b/)
  1098.       {$cmd = $'; $outmsg .= "I set RUN flags for :\n";
  1099.        open  FILE,">>$FlagDir$fRun" || next; 
  1100.        if (Trims($cmd))
  1101.           {while ($cmd =~ /(\w+)/g) {print FILE "$1\n"; $outmsg .= "$1\n"}
  1102.           }      
  1103.        else
  1104.           {for ($i = 1; $i <= $GameCount; $i++)
  1105.                {print FILE $GAMES{"Name$i"}."\n";
  1106.                 $outmsg .= $GAMES{"Name$i"}."\n"
  1107.                }; 
  1108.           };
  1109.        close FILE; 
  1110.       }
  1111.    elsif
  1112.       ($cmd =~ /\s*?%STATUS\b/)
  1113.       {$cmd = $'; $outmsg .= "Status for games is :\n";
  1114.        if (Trims($cmd))
  1115.           {while ($cmd =~ /(\S+)/g) 
  1116.                  {$cmdline = $1;
  1117.                   for ($i = 1; $i <= $GameCount; $i++)
  1118.                       {if ($cmdline =~ /\b$GAMES{"Name$i"}\b/i)
  1119.                           {TakeGameInfo($i,0);
  1120.                            $outmsg .= "GAME $GAMES{\"Name$i\"} STATUS.\n".
  1121.                                       "Current weight = ".$GAMEINFO{"Summ"}."\n".
  1122.                                       "Need for run   = ".$GAMEINFO{"Need"}."\n".
  1123.                                       "Turns present  = ".$GAMEINFO{"Present"}."\n".
  1124.                                       "Turns weight   = ".$GAMEINFO{"Weight"}."\n".
  1125.                                       CheckNextRun($i)."\n\n";
  1126.                           }
  1127.                       }
  1128.                  } 
  1129.           }      
  1130.        else
  1131.           {for ($i  = 1; $i <= $GameCount; $i++)
  1132.                {TakeGameInfo($i,0);
  1133.                 $outmsg .= "GAME $GAMES{\"Name$i\"} STATUS.\n".
  1134.                            "Current weight = ".$GAMEINFO{"Summ"}."\n".
  1135.                            "Need for run   = ".$GAMEINFO{"Need"}."\n".
  1136.                            "Turns present  = ".$GAMEINFO{"Present"}."\n".
  1137.                            "Turns weight   = ".$GAMEINFO{"Weight"}."\n".
  1138.                            CheckNextRun($i)."\n\n"
  1139.                }
  1140.           };
  1141.        }
  1142.    elsif
  1143.       ($cmd =~ /\s*?%GETCFG\b/)
  1144.       {$cmd = Trims($');
  1145.        $outmsg .= "This is config for game $cmd. Use %SETCFG $cmd for change it.\n";
  1146.        for ($i = 1; $i <= $GameCount; $i++)
  1147.            {if ($cmd =~ /\b$GAMES{"Name$i"}\b/i)
  1148.                {
  1149.  if ($GAMES{"Name$i"}) {$outmsg .= "  GAMENAME   = ".$GAMES{"Name$i"}."\n"};
  1150.  if ($GAMES{"Dir$i"})  {$outmsg .= "  GAMEDIR    = ".$GAMES{"Dir$i"}."\n"};
  1151.  if ($GAMES{"Days$i"}) {$outmsg .= "  DAILY      = ".$GAMES{"Days$i"}."\n"};
  1152.  if ($GAMES{"Time$i"})
  1153.                        {$outmsg .= "  RUNTIME    = ".($GAMES{"Time$i"} / 3600).':'.
  1154.                                                             (($GAMES{"Time$i"} % 3600) / 60)."\n"};
  1155.  if ($GAMES{"Run$i"})
  1156.                        {$outmsg .= "  RUNCOMMAND = ".$GAMES{"Run$i"}."\n"};
  1157.  if ($GAMES{"Weight$i"})
  1158.                        {$outmsg .= "  CHECKWEIGHT= ".$GAMES{"Weight$i"}."\n"};
  1159.  if ($GAMES{"Weights$i"})
  1160.                        {$outmsg .= "  WEIGHTS    = ".$GAMES{"Weights$i"}."\n"};
  1161.  if ($GAMES{"Wait$i"})
  1162.                        {$outmsg .= "  WAIT       = ".$GAMES{"Wait$i"}."\n"};
  1163.  if ($GAMES{"CheckDec$i"})
  1164.                        {$outmsg .= "  CHECKDEC   = ".$GAMES{"CheckDec$i"}."\n"};
  1165.  if ($GAMES{"EnableVia$i"})
  1166.                        {$outmsg .= "  ENABLEVIA  = ".$GAMES{"EnableVia$i"}."\n"};
  1167.  if ($GAMES{"RRCTpl$i"})
  1168.                        {$outmsg .= "  RRC        = ".$GAMES{"RRCTpl$i"}."\n"};
  1169.  if ($GAMES{"SleepTpl$i"})
  1170.                        {$outmsg .= "  SLEEP     = ".$GAMES{"SleepTpl$i"}."\n"};
  1171.  if ($GAMES{"SentTpl$i"})
  1172.                        {$outmsg .= "  SENT      = ".$GAMES{"SentTpl$i"}."\n"};
  1173.  if ($GAMES{"ErrorTpl$i"})
  1174.                        {$outmsg .= "  ERROR     = ".$GAMES{"ErrorTpl$i"}."\n"};
  1175.  for (my $c = 1; $c <= 11; $c++)
  1176.      {my $line = $GAMES{"Player$i.$c"};
  1177.       while ($line =~ /\[(.*?)\]/g)
  1178.             {              $outmsg .= "  PLAYER$c  = ".$1."\n";
  1179.             }
  1180.      };
  1181.  my $line = $GAMES{"Include$i"};
  1182.  while ($line =~ m/\[(.*?)\]/g)
  1183.        {  $outmsg .= "  INCLUDE    = ".$1."\n"
  1184.        };  
  1185.  $line = $GAMES{"Comments$i"};
  1186.  while ($line =~ m/\[(.*?)\]/g)
  1187.        {                   $outmsg .= $1."\n"
  1188.        };  
  1189.  
  1190.                 last;
  1191.                }
  1192.            }  
  1193.       }
  1194.    elsif
  1195.       ($cmd =~ /\s*?%SETCFG\b/)    
  1196.       {$cmd    = Trims($');
  1197.        $outmsg .= "Set new config for game $cmd\n";
  1198.        for ($i = 1; $i <= $GameCount; $i++)
  1199.            {if ($cmd =~ /\b$GAMES{"Name$i"}\b/i)
  1200.                {open FILE, ">".$GAMES{"DATAFILE$i"} || last;
  1201.                 $mode = $GAMES{"DATAFILE$i"};
  1202.                 last;
  1203.                }
  1204.            } 
  1205.       }
  1206.    elsif
  1207.       ($cmd =~ /\s*?%ENDSET\b/)
  1208.       {$mode = "";
  1209.        open  FILE,">$FlagDir$fReload"; 
  1210.        close FILE;
  1211.       }
  1212.    elsif
  1213.       ($cmd =~ /\s*?%MESSAGE\b/)
  1214.       {$cmdline = Trims($');
  1215.        $mess    = "Message from GAMEMASTER !\n";
  1216.       }
  1217.    elsif
  1218.       ($cmd =~ /\s*?%ENDMESSAGE\b/)
  1219.       {unless (open FILE,">$TmpDir$OutUUE")
  1220.               {$mess = "";
  1221.                next;
  1222.               };
  1223.        print  FILE $mess;
  1224.        close  FILE;
  1225.        $outmgs .= "I sent your message for :\n";
  1226.        unless ($cmdline) 
  1227.               {for ($gc = 1; $gc <= $GameCount; $gc++)
  1228.                    {for ($gr = 1; $gr <= 11; $gr++) 
  1229.                         {$outmsg .= "- game $GAMES{\"Name$gc\"} race $gr;\n";
  1230.                          OutMail($gc,$gr);
  1231.                         }
  1232.                    }
  1233.               }
  1234.        else
  1235.          {my @games = split(/\s+/,$cmdline);
  1236.           foreach my $game (@games)
  1237.              {$game =~ /(\w+)/i;
  1238.               $gc   = $1 || next;
  1239.               $gr   = $';
  1240.               for ($i = 1; $i <= $GameCount; $i++)
  1241.                   {if ($gc =~ /\b$GAMES{"Name$i"}\b/i)
  1242.                       {unless ($gr =~ /\d+/)
  1243.                               {for ($gr = 1; $gr <= 11; $gr++) 
  1244.                                    {$outmsg .= "- game $GAMES{\"Name$i\"} race $gr;\n";
  1245.                                     OutMail($i,$gr)
  1246.                                    }
  1247.                               }
  1248.                        else   {pos $gr = 0;
  1249.                                while ($gr =~ /(\d+)/g) 
  1250.                                      {$outmsg .= "- game $GAMES{\"Name$i\"} race $1;\n";
  1251.                                       OutMail($i,$1)
  1252.                                      }
  1253.                               }
  1254.                        last;
  1255.                       }
  1256.                   }
  1257.              }
  1258.          }
  1259.       }
  1260.    elsif
  1261.       ($cmd =~ /\s*?ADDRESS\b.*?[-=]{0,1}(.*)/)
  1262.       {open  FILE, ">>$CfgFileName";
  1263.        $cmd     = Trims($1);
  1264.        $outmsg .= "Add new address : $1\n";
  1265.        print FILE "GMCOPYTO = ".$1."\n";
  1266.        close FILE;
  1267.        open  FILE,">$FlagDir$fReload"; 
  1268.        close FILE;
  1269.       }  
  1270.    elsif
  1271.       ($cmd =~ /\s*?%HELP\b/)
  1272.       {$outmsg .= "Å«ññÑনóáεΓß∩ ß½ÑñπεΘ¿Ñ ¬«¼á¡ñδ\n".
  1273.                   "%HELP                      - »«ß½áΓ∞ »«¼«Θ∞\n".
  1274.                   "%STATUS [gname1 .. gnameX] - ßΓáΓπß ¿úα (¿¼Ñ¡á τÑαѺ »α«íѽδ)\n".
  1275.                   "%RUN [gname1 .. gnameX]    - ºá»πßΓ¿Γ∞ ¿úαδ (¿¼Ñ¡á τÑαѺ »α«íѽδ)\n".
  1276.                   "%SLEEP [gname1 .. gnameX]  - ß½¿» ¿úαδ (¿¼Ñ¡á τÑαѺ »α«íѽδ)\n".
  1277.                   "%GETCFG gname              - »«½πτ¿Γ∞ ¬«¡Σ¿ú ¿úαδ («ñ¡«⌐ !)\n".
  1278.                   "%SETCFG gname              - πßΓá¡«ó¿Γ∞ ¬«¡Σ¿ú ¿úαδ («ñ¡«⌐ !)\n".
  1279.                   "%ENDSET                    - ¬«¡Ñµ «»¿ßὫ󬿠¡«ó«ú« ¬«¡Σ¿úá\n".
  1280.                   "%MESSAGE [gname1 .. gnameX]- »«ß½áΓ∞ ß««íΘÑ¡¿Ñ ¿úα«¬á¼ (¿¼Ñ¡á τÑαѺ »α«íѽδ !)\n".
  1281.                   "%ENDMESSAGE                - ¬«¡Ñµ ß««íΘÑ¡¿∩\n".
  1282.                   "%ADDRESS = newaddress      - ñ«íáó¿Γ∞ ñ«»«½¡¿Γѽ∞¡δ⌐ áñαÑß αáßß佬¿ âî\n";        
  1283.       }
  1284.    elsif
  1285.       ($mode)
  1286.       {print FILE "$cmd\n";
  1287.       }    
  1288.    elsif
  1289.       ($mess)
  1290.       {$mess .= "$cmd\n";
  1291.       }
  1292.   };
  1293.   MessageToGM($outmsg);
  1294.   open     FILE, ">$TmpDir$OutUUE";
  1295.   binmode  FILE;
  1296.   syswrite FILE,$outmsg,length $outmsg;
  1297.   close    FILE;
  1298.   OutMail(0,0);
  1299.   if (-e $FlagDir.$fReload)
  1300.      {LoadConfig()
  1301.      };
  1302. }
  1303.  
  1304. sub OutMsg
  1305. { my ($file)         = @_;
  1306.   my ($filename,$GNum,$RNum);
  1307.   my (@Races,@Games) = ();
  1308.   $filesize = -s $file                    || return 0;
  1309.   open(MAILFILE,"$file")                  || return 0;
  1310.   read(MAILFILE,$buf,$filesize)           || return 0;
  1311.   close(MAILFILE);
  1312.  
  1313.   $filesize -= $filesize > 190 ? 190 : $filesize;
  1314.   my ($From,$To,$Subj,$temp,$let) = unpack("A36 A36 A72 A46 a$filesize", $buf);
  1315.   $From = Trims($From);  $To   = Trims($To);  $Subj = Trims($Subj); 
  1316.  
  1317.   return 0 unless ($From =~ /\bGM\b/i || $From =~ /\bGAMEMASTER\b/i);
  1318.   my $FromFIDO = unpack("s",substr($temp,28,2)).
  1319.                  "/".
  1320.                  unpack("s",substr($temp,24,2));
  1321.   if ($let =~ /\bFMPT.*?(\d+)/i) {$FromFIDO .= ".$1"};
  1322.   return 0 unless ($IncomeFIDO =~ /\b$FromFIDO\b/i);
  1323.  
  1324.   printlog ("[FROM GM] Found message from gamemaster...\n",1);
  1325.   if ($To =~ /\bALL\b/i)
  1326.      {@Races = (1..11)}
  1327.   else
  1328.      {pos $To = 0;
  1329.       while ($To =~ /(\d+)/g) {push (@Races, $1)};
  1330.      };
  1331.   return 0 unless (@Races);
  1332.  
  1333.   if ($Subj =~ /\bALL\b/i)
  1334.      {@GAMES = (1..$GameCount)}
  1335.   else
  1336.      {pos $Subj = 0;
  1337.       while ($Subj =~ /(\w+)/g)
  1338.             {$RNum = $1;
  1339.              for ($GNum = 1; $GNum <= $GameCount; $GNum++)
  1340.                  {if ($GAMES{"Name$GNum"} =~ /\b$RNum\b/)
  1341.                      {push (@Games,$GNum); last};
  1342.                  };
  1343.             };
  1344.      }; 
  1345.   return 0 unless (@Games);
  1346.   $let =~ s/(\x01.*?\x0D)//g;
  1347.  
  1348.   open     FILE, ">$TmpDir$OutUUE" || return 0;
  1349.   binmode  FILE;
  1350.   syswrite FILE,$let,length $let;
  1351.   close    FILE;
  1352.  
  1353.   foreach $GNum (@Games)
  1354.   { foreach $RNum (@Races)
  1355.     {OutMail($GNum,$RNum,0)}
  1356.   };
  1357.   unlink $file;  
  1358. }
  1359.  
  1360.  
  1361.  
  1362. #»α«óÑα¬á ó὿ñ¡«ßΓ¿ Σá⌐½á »« ¿¼Ñ¡¿
  1363. #»«½πτáÑΓ    : ¿¼∩ Σá⌐½á
  1364. #ó«ºóαáΘáÑΓ  : ¼áßß¿ó - ì« ¿úαδ, ì« αáßδ ¿½¿ »πßΓ«⌐
  1365. sub ValidFName
  1366. { my ($file)           = @_;
  1367.   my ($CRace,$Race,$c) = 0;
  1368.   my ($i);
  1369.   for ($i = 1; $i <= $GameCount; $i++)
  1370.       { $GameName = $GAMES{"Name$i"};
  1371.         $SName    = "player";
  1372.         substr($SName,0,length $GameName) = $GameName;
  1373.         if ( $file =~ /$SName([0-9a-fA-F]{1,2})\.(tr[a-z0-9]|vp[a-z0-9]|zi[a-z0-9]|ar[a-z0-9]|ra[a-z0-9]|lz[a-z0-9])/i )
  1374.            { $CRace = $1; $Race = 0; 
  1375.              if ($CRace =~ /[a-fA-F]/)
  1376.                 {pos $CRace = 0;
  1377.                  while ($CRace =~ /(.)/g)
  1378.                   {$Race = ($Race << 4) + ord($1) - (ord($1) > 57 ? 55 : 48)} 
  1379.                 } 
  1380.              else
  1381.                 {$Race = $CRace};  
  1382.              if ($Race > 0 || $Race < 12) {return ($i,$Race)};
  1383.            };
  1384.         if ( ($GameName >= 10) && ($GameName <= 32) )
  1385.            { $GameName = chr ($GameName + 55);
  1386.              $SName    = "player";
  1387.              substr($SName,0,length $GameName) = $GameName;
  1388.              if ( $file =~ /$SName([0-9a-fA-F]{1,2})\.(tr[a-z0-9]|vp[a-z0-9]|zi[a-z0-9]|ar[a-z0-9]|ra[a-z0-9]|lz[a-z0-9])/i )
  1389.                 { $CRace = $1; $Race = 0; 
  1390.                   if ($CRace =~ tr/a-fA-F/A-FA-F/)
  1391.                      {pos $CRace = 0;
  1392.                       while ($CRace =~ /(.)/g)
  1393.                        {$Race = ($Race << 4) + ord($1) - (ord($1) > 57 ? 55 : 48)} 
  1394.                      } 
  1395.                   else
  1396.                      {$Race = $CRace};  
  1397.                   if ($Race > 0 || $Race < 12) {return ($i,$Race)};
  1398.                 };
  1399.            };
  1400.       }
  1401.   return ();
  1402. };
  1403.  
  1404.  
  1405. $ArjHdr = "\x60\xEA\x00\x00";
  1406. $RarHdr = "Rar!";
  1407. $ZipHdr = "\x50\x4B\x03\x04";
  1408. $LzhHdr = "\x2D\x6C\x$68";
  1409. # αáºáασ¿ó¿απÑΓ Σá⌐½ ¿úαδ ¿ ºá»π߬áÑΓ ñ½∩ ñá½∞¡Ñ⌐ΦÑ⌐ «íαáí«Γ¬¿
  1410. # »«½πτáÑΓ    : ¿¼∩ Σá⌐½á, ¬áΓὫú, <ì« ¿úαδ, ì« αáßδ,
  1411. #               ¿ßσ«ñ¡δ⌐ Σá⌐½(ñ½∩ πñá½Ñ¡¿∩) ¿ Γ¿» Ñú« αáßΦ¿αÑ¡¿∩, πñá½∩Γ∞ Ñß½¿ Äè>
  1412. # ó«ºóαáΘáÑΓ  : 1 ¿½¿ 0 (Σá⌐½ ¡Ñ ¡á⌐ñÑ¡)
  1413. sub DeArcFile
  1414. { my ($file,$dir,$SGNum,$SRNum,$SourceFile,$SourceExt,$DeleteSource) = @_;
  1415.   my ($Delete,$arc,$found) = 0;
  1416.   @filesin  = ();
  1417.   $filesize = -s $file           || return 0;
  1418.   open (ARCFILE,"+<$file")       || return 0;
  1419.   read (ARCFILE,$arc,$filesize)  || return 0;
  1420.   close(ARCFILE);
  1421.   $head = substr($arc,0,10);
  1422.   $found= "";
  1423.   pos $arc = 0;
  1424.   while ($arc =~ /(\w+)\.(trn)/gci)
  1425.         {$TrnFile = "$1.$2";
  1426.          unless ($found =~ /$TrnFile\;/i)
  1427.                 {push (@filesin,$TrnFile); $found .= "$TrnFile;";
  1428.                 }
  1429.         };
  1430.  
  1431.   foreach $TrnFile (@filesin)
  1432.      {
  1433.       if (index($head,$ZipHdr) == 0)
  1434.          {$command = $UnZipCommand;
  1435.          }
  1436.       elsif
  1437.          (index($head,$RarHdr) == 0)
  1438.          {$command = $UnRarCommand;
  1439.          }
  1440.       elsif
  1441.          (index($head,$ArjHdr) == 0)
  1442.          {$command = $UnArjCommand;
  1443.          }
  1444.       elsif
  1445.          (index($head,$LzhHdr) == 2)
  1446.          {$command = $UnLzhCommand;
  1447.          }
  1448.       else
  1449.          {next;
  1450.          }
  1451.       $command =~ s/%ArcFile/$file/i;
  1452.       $command =~ s/%DirName/$dir/i;
  1453.       $command =~ s/%ExtFile/$FileName/i;
  1454.       $command = ChngSlash($command);
  1455.       printlog("Run command : $command \n",1) if $FullLog;
  1456.       system("$command");
  1457.       ($CGNum,$CRNum) = ValidFName($file);
  1458.       ($TGNum,$TRNum) = ValidFName($TrnFile);
  1459.       $GNum = $TGNum ? $TGNum : $CGNum ? $CGNum : $SGNum;
  1460.       $RNum = $TRNum ? $TRNum : $CRNum ? $CRNum : $SRNum;
  1461.       if ($GNum && $RNum) 
  1462.          {DoFile($TmpDir,$TrnFile,$GNum,$RNum,$SourceFile,$SourceExt,$DeleteSource)}
  1463.       else
  1464.          {$FName = MakeOutExt($HostMsgs,$file,"VPF");
  1465.           open     ARCFILE,">$FName";
  1466.           binmode  ARCFILE;  
  1467.           syswrite ARCFILE,$arc,length $arc;
  1468.           close    ARCFILE;   
  1469.           MessageToGM("/*WARNING*/\nFound _unknown_archive_ $file.\nMoved to $FName.\n"); 
  1470.          };    
  1471.       printlog("[Delete] $TmpDir$TrnFile\n",1) if $FullLog;
  1472.       unlink $TmpDir.$TrnFile;
  1473.      };
  1474.    return 1;
  1475. };
  1476.  
  1477. #áασ¿ó¿απÑΓ Σá⌐½δ
  1478. # »«½πτáÑΓ       : Γ¿» áασ¿óáΓ«αá, ¿¼∩ óδσ«ñ¡«ú« Σá⌐½á, ß»¿ß«¬ ΣὫó
  1479. # ó«ºóαáΘáÑΓ     : 1 ¿½¿ 0 (¡Ñ π¬áºá¡ Γ¿» áασ¿óáΓ«αá)
  1480. sub ArcFile
  1481. { my ($arctype,$outfile,@infiles) = @_;
  1482.   unlink $outfile;
  1483.   if ($arctype eq 'zip')
  1484.      {$command = $ZipCommand;
  1485.      }
  1486.   elsif
  1487.      ($arctype eq 'rar')
  1488.      {$command = $RarCommand;
  1489.      }
  1490.   elsif
  1491.      (arctype eq 'arj')
  1492.      {$command = $ArjCommand;
  1493.      }
  1494.   elsif
  1495.      (arctype eq 'lzh')
  1496.      {$command = $LzhCommand;
  1497.      }
  1498.   else
  1499.      {return 0;
  1500.      };
  1501.   $command =~ s/%ArcName/$outfile/i;
  1502.   $command =~ s/%ArcFiles/@infiles/i;
  1503.   $command = ChngSlash($command);
  1504.   printlog("Run command : $command \n",1) if $FullLog;
  1505.   system("$command");
  1506.   return 1;
  1507. };
  1508.  
  1509. #ºáππετ¿óáÑΓ Σá⌐½δ
  1510. # »«½πτáÑΓ    : ¿¼∩ óσ«ñ¡«ú« Σá⌐½á, ¿¼∩ óδσ«ñ¡«ú« Σá⌐½á
  1511. # ó«ºóαáΘáÑΓ  : ¡¿τÑú«
  1512. sub UUEFile
  1513. { my ($infile,$outfile) = @_;
  1514.   my ($local)           = "";
  1515.   if ($InternalCoder)
  1516.      {$local =  uuencode($infile,$outfile,644);
  1517.       printlog("[Int EnUUE] Succesfully coding $infile -> $outfile\n",1) if ($local && $FullLog);
  1518.      };
  1519.   return if $local;
  1520.   $command = $UUECommand;
  1521.   $command =~s/%BINFile/$infile/i;
  1522.   $command =~s/%UUEFile/$outfile/i;
  1523.   $command = ChngSlash($command);
  1524.   printlog("Run UUE $command\n",1) if $FullLog;
  1525.   system("$command");
  1526. };
  1527.  
  1528. #ñÑππετ¿Γ Σá⌐½δ
  1529. # »«½πτáÑΓ   : ¿¼∩ óσ«ñ¡«ú« Σá⌐½á, ¿¼∩ óδσ«ñ¡«ú« Σá⌐½á
  1530. # ó«ºóαáΘáÑΓ : ¡¿τÑú«
  1531. sub DeUUEFile
  1532. { my ($ifile,$ofile) = @_;
  1533.   my ($local)        = "";
  1534.   if ($InternalCoder)
  1535.      {$local = uudecode($ifile,$ofile);
  1536.       if ($local)
  1537.          {printlog("[Int DeUUE] Succesfully decode $local\n",1) if $FullLog}
  1538.       else
  1539.          {printlog("[Int DeUUE] Error...\n",1) if $FullLog;
  1540.          }   
  1541.      }
  1542.   return if $local;
  1543.   $command = $DeUUECommand;
  1544.   $command =~s/%UUEFile/$ifile/i;
  1545.   $command =~s/%OutFile/$ofile/i;
  1546.   $command = ChngSlash($command);
  1547.   printlog("Run DeUUE $command\n",1) if $FullLog;
  1548.   system("$command");
  1549. };
  1550.  
  1551.  
  1552. #«íαáí«Γ¬á αá߻ᬫóá¡¡«ú« Γα¡-Σá⌐½á ¿ Ñú« »α«óÑα¬á
  1553. # »«½πτáÑΓ     : ¿¼∩ ¬áΓὫúá, ¿¼∩ Σá⌐½á, ì« ¿úαδ, ì« αáßδ,
  1554. #                ¿¼∩ Σá⌐½á ñ½∩ πñá½Ñ¡¿∩, Γ¿» Ñú« αáßΦ¿αÑ¡¿∩, πñá½∩Γ∞ Ñß½¿ Äè
  1555. # Σ«α¼¿απÑΓ ß««íΘÑ¡¿∩ ¿ú᫬π
  1556. # ó«ºóαáΘáÑΓ   : ¡¿τÑú«
  1557. sub DoFile
  1558. {my ($dir,$file,$GameNum,$RaceNum,$SourceFile,$SourceExt,$DeleteSource) = @_;
  1559.  my ($buf,$FName);
  1560.  if (CheckTurn($dir.$file,$GAMES{"Dir$GameNum"}))
  1561.     {printlog("[+] File found for game $GameNum race $RaceNum\n") if $FullLog;
  1562.      $FName             = $file;
  1563.      substr($FName,0,6) = "player";
  1564.      $FName             =~s/\.(.{0,3})/\.trn/; 
  1565.      open    FILE,$dir.$file;
  1566.      binmode FILE;  
  1567.      read   (FILE,$buf,-s $dir.$file);
  1568.      close   FILE;
  1569.      open     FILE,">$GAMES{\"Dir$GameNum\"}$FName";
  1570.      binmode  FILE;
  1571.      syswrite FILE,$buf,length $buf;
  1572.      close    FILE;
  1573.      SentRRC($GameNum,$RaceNum);
  1574.      $FName   = $BackupDir.sprintf("gm-%s.z%02x",$GAMES{"Name$GameNum"},$GAMEINFO{"Turn"});
  1575.      if ($BackupDir)
  1576.         {ArcFile('zip',$FName,($SourceFile));
  1577.         }; 
  1578.      #MessageToGM("/*WARNING*/\n".
  1579.      #            "I see _good_turn_ for game $GAMES{\"Name$GameNum\"} race $RaceNum.\n".
  1580.      #            ($BackupDir ? "It was backed up to $FName" : ""));
  1581.      open    FILE,">>receive.log";
  1582.      print   FILE localtime()." [RCV] Game ".$GAMES{"Name$GameNum"}." race $RaceNum...\n";
  1583.      close   FILE;
  1584.      unlink  $dir.$file;
  1585.      unlink  $SourceFile if $DeleteSource;
  1586.      return 1;
  1587.     }
  1588.  else
  1589.     {printlog("[-] File error for game $GameNum race $RaceNum\n") if $FullLog;
  1590.      if ($HostMsgs && $SourceFile && $SourceExt)
  1591.         {if ($SourceExt eq "EM" || $SourceExt eq "FM")
  1592.             {$FName = MakeOutName($HostMsgs,".$SourceExt");
  1593.             }
  1594.          elsif
  1595.             ($SourceExt eq "VPF" || $SourceExt eq "TRN")
  1596.             {$FName = MakeOutExt($HostMsgs,$SourceFile,$SourceExt);
  1597.             }
  1598.          else
  1599.             {SentERROR($GameNum,$RaceNum);
  1600.              return 0;
  1601.             };
  1602.          if (open(FILE,$SourceFile))
  1603.             {binmode FILE;
  1604.              read   (FILE,$buf,-s $SourceFile);
  1605.              close   FILE;
  1606.              open     FILE,">$FName";
  1607.              binmode  FILE;
  1608.              syswrite FILE,$buf,length $buf;
  1609.              close    FILE;
  1610.              MessageToGM("/*WARNING*/\n".
  1611.                          "I found _bad_turn_ for game $GAMES{\"Name$GameNum\"} race $RaceNum.\n".
  1612.                          "It was move to file $FName");
  1613.             }
  1614.          else
  1615.            {printlog("[Error] Cann't move bad file $SourceFile -> $FName : $!\n",1) if $FullLog; 
  1616.            }  
  1617.         };
  1618.      SentERROR($GameNum,$RaceNum);
  1619.      unlink $SourceFile if ($DeleteSource && $GameNum); 
  1620.      return 0;
  1621.     };
  1622. };
  1623.  
  1624. sub FillTpl
  1625. { my ($GNum,$RNum,$FName,$mode,$Next) = @_;
  1626.   my ($MIMEFiles)       = "";
  1627.   my ($MIMEBuf)         = ""; 
  1628.   my ($UUEData)         = "";
  1629.   my ($sinc,$dinc)      = "";
  1630.   unlink $TmpDir.$OutUUE;
  1631.   unlink $TmpDir.$OutMIME;
  1632.   open IF,$FName || return 0;
  1633.   $OutBuf    = "";
  1634.   $c         = 1;
  1635.   @packfiles = ();
  1636.   $arctype   = "zip";
  1637.   $FName     = "player.vpf";
  1638.   $value     = $GAMES{"Player$GNum.$RNum"};
  1639.   if ($value =~ /arc.*?[=-]\s*?(\S+)/i)
  1640.      {$arc = $1;
  1641.       if ($arc =~ /rar/i)
  1642.          {$arctype = 'rar'}
  1643.       elsif
  1644.          ($arc =~ /lzh/i)
  1645.          {$arctype = 'lzh'}
  1646.       elsif
  1647.          ($arc =~ /arj/i)
  1648.          {$arctype = 'arj'};
  1649.      };
  1650.   if ($value =~ /type.*?[=-]\s*?(\S+)/i)
  1651.      {$arc = $1;
  1652.       if ($arc =~ /game/i)
  1653.          {substr($FName,0,length $GAMES{"Name$GNum"}) = $GAMES{"Name$GNum"};
  1654.          };
  1655.       if ($arc =~ /race/i)
  1656.          {substr($FName,6,0) = $RNum;
  1657.          };
  1658.       if ($arc =~ /turn/i)
  1659.          {$FName =~ s/vpf/sprintf("v%02x",$GAMEINFO{"Turn"})/ie}; 
  1660.      };
  1661.   while (<IF>)
  1662.    {chomp;
  1663.     $s = $_;
  1664.     if ($s =~ /\;/) {$s = $`};
  1665.     $s = Trims($s);
  1666.     unless ($s) {next};
  1667.     $UUEData = "";
  1668.     $s       =~s/%ThisGame/$GAMEINFO{"GameName"}/i;
  1669.     $s       =~s/%ThisRace/$RNum/i;
  1670.     $s       =~s/%ThisTurn/$GAMEINFO{"Turn"}/i;
  1671.     $s       =~s/%ThisTime/$GAMEINFO{"TimeStamp"}/i;
  1672.     $s       =~s/%ThisWeig/$GAMEINFO{"Weight"}/i;
  1673.     $s       =~s/%ThisSumm/$GAMEINFO{"Summ"}/i;
  1674.     $s       =~s/%ThisPres/$GAMEINFO{"Present"}/i;
  1675.     $s       =~s/%ThisNeed/$GAMEINFO{"Need"}/i;
  1676.     $s       =~s/%NextTurn/$Next/i;
  1677.  
  1678.     #»«¼ÑßΓ¿¼ ñó«¿τ¡δÑ Σá⌐½δ
  1679.     if ($s =~ /%BinFile.*?\=(.*)/i)
  1680.        {$pre         = $`;
  1681.         $post        = $';
  1682.         $filename    = $1;
  1683.         $mintrn      = 0;
  1684.         $maxtrn      = 10000;
  1685.         $onlyrace    = 0;
  1686.         $arcit       = 0;
  1687.  
  1688.         if ($filename =~ /\<.*?(\d+)/i)
  1689.            {$filename = $`.$';
  1690.             $maxtrn   = $1-1;
  1691.            };
  1692.         if ($filename =~ /\>.*?(\d+)/i)
  1693.            {$filename = $`.$';
  1694.             $mintrn   = $1+1;
  1695.            };
  1696.         if ($filename =~ /(\d+)\.\.(\d+)/i)
  1697.            {$filename = $`.$';
  1698.             $mintrn   = $1;
  1699.             $maxtrn   = $2;
  1700.            };
  1701.         if ($filename =~ /([\-\\\/\ ]ArcIt)/i)
  1702.            {$filename = $`.$';
  1703.             $arcit    = 1;
  1704.            };
  1705.         if ($filename =~ /[\-\\\/\ ]Race\s*?=\s*?(\w+)/i)
  1706.            {$filename = $`.$';
  1707.             $onlyrace = $1;
  1708.            };
  1709.         $filename = Trims($filename);
  1710.         $filename =~ s/%RaceNum/$RNum/i;
  1711.         $filename =~ s/%HostDir/$GAMES{"Dir$GNum"}/i;
  1712.         if (($GAMEINFO{"Turn"} >= $mintrn) &&
  1713.             ($GAMEINFO{"Turn"} <= $maxtrn) &&
  1714.             (($onlyrace == 0) || ($onlyrace == $RNum)))
  1715.            {if ($arcit)
  1716.                {push(@packfiles,$filename);
  1717.                }
  1718.             else
  1719.                {UUEFile($filename,$TmpDir.$OutUUE);
  1720.                 $UUEData = '';
  1721.                 open OF,"$TmpDir$OutUUE";
  1722.                 while (<OF>) {$UUEData .= $_};
  1723.                 close OF;
  1724.                 if ($GAMES{"Player$GNum.$RNum"} =~ /\bMIME\b/i)
  1725.                    {$MIMEFiles .= "$filename;"}; 
  1726.                 unlink $TmpDir.$OutUUE;
  1727.                }
  1728.            };
  1729.         $s = $pre.$post;
  1730.        };
  1731.     #»«¼ÑßΓ¿¼ ΓѬßΓ«óδÑ Σá⌐½δ
  1732.     if ($s =~ /%TxtFile.*?\=(.*)/i)
  1733.        {$pre         = $`;
  1734.         $post        = $';
  1735.         $filename    = $1;
  1736.         $mintrn      = 0;
  1737.         $maxtrn      = 10000;
  1738.         $onlyrace    = 0;
  1739.  
  1740.         if ($filename =~ /\<.*?(\d+)/i)
  1741.            {$filename = $`.$';
  1742.             $maxtrn   = $1-1;
  1743.            };
  1744.         if ($filename =~ /\>.*?(\d+)/i)
  1745.            {$filename = $`.$';
  1746.             $mintrn   = $1+1;
  1747.            };
  1748.         if ($filename =~ /(\d+)\.\.(\d+)/i)
  1749.            {$filename = $`.$';
  1750.             $mintrn   = $1;
  1751.             $maxtrn   = $2;
  1752.            };
  1753.         if ($filename =~ /\-|\\Race[\x08\x20]*?=[\x08\x20](\w+)/i)
  1754.            {$filename = $`.$';
  1755.             $onlyrace = $1;
  1756.            };
  1757.         $filename = Trims($filename);
  1758.         $filename =~ s/%RaceNum/$RNum/i;
  1759.         $filename =~ s/%HostDir/$GAMES{"Dir$GNum"}/i;
  1760.         if (($GAMEINFO{"Turn"} >= $mintrn) &&
  1761.             ($GAMEINFO{"Turn"} <= $maxtrn) &&
  1762.             (($onlyrace == 0) || ($onlyrace == $RNum)))
  1763.            {
  1764.             open (OF,"$filename");
  1765.             while(<OF>) {$pre .= $_};
  1766.             close(OF);
  1767.            };
  1768.         $s = $pre.$post;
  1769.        };
  1770.     $MIMEBuf.= "$s\n";
  1771.     $OutBuf .= "$s$UUEData\n";
  1772.    };
  1773.   #«íαáí«Γ¬á INCLUDE Σá⌐½«ó
  1774.   $sinc = $GAMES{"Include$GNum"};
  1775.   $dinc = "";
  1776.   while ($sinc =~ /\[(.*?)\]/)
  1777.    {$s       = $1;
  1778.     $sinc    = $'; 
  1779.     $UUEData = "";
  1780.     $s     =~ s/\+\s*?(\d+)/($GAMEINFO{"Turn"})."..".($GAMEINFO{"Turn"}+$1)/e;
  1781.     $dinc .= "[$s]";
  1782.     if ($s =~ s/mode.*?[-=]\s*?(\S+)//i)
  1783.        {$pre = $1;
  1784.         next unless ($pre =~ /$mode/i);
  1785.        }; 
  1786.  
  1787.     #»«¼ÑßΓ¿¼ ñó«¿τ¡δÑ Σá⌐½δ
  1788.     if ($s =~ /%BinFile(.*)/i)
  1789.        {$filename    = $1;
  1790.         $s           = "";
  1791.         $mintrn      = 0;
  1792.         $maxtrn      = 10000;
  1793.         $onlyrace    = 0;
  1794.         $arcit       = 0;
  1795.  
  1796.         if ($filename =~ /\<.*?(\d+)/i)
  1797.            {$filename = $`.$';
  1798.             $maxtrn   = $1-1;
  1799.            };
  1800.         if ($filename =~ /\>.*?(\d+)/i)
  1801.            {$filename = $`.$';
  1802.             $mintrn   = $1+1;
  1803.            };
  1804.         if ($filename =~ /(\d+)\.\.(\d+)/i)
  1805.            {$filename = $`.$';
  1806.             $mintrn   = $1;
  1807.             $maxtrn   = $2;
  1808.            };
  1809.         if ($filename =~ /([\-\\\/\ ]ArcIt)/i)
  1810.            {$filename = $`.$';
  1811.             $arcit    = 1;
  1812.            };
  1813.         if ($filename =~ /[\-\\\/\ ]Race\s*?=\s*?(\w+)/i)
  1814.            {$filename = $`.$';
  1815.             $onlyrace = $1;
  1816.            };
  1817.         $filename = Trims($filename);
  1818.         $filename =~ s/%RaceNum/$RNum/i;
  1819.         $filename =~ s/%HostDir/$GAMES{"Dir$GNum"}/i;
  1820.         if (($GAMEINFO{"Turn"} >= $mintrn) &&
  1821.             ($GAMEINFO{"Turn"} <= $maxtrn) &&
  1822.             (($onlyrace == 0) || ($onlyrace == $RNum)))
  1823.            {if ($arcit)
  1824.                {push(@packfiles,$filename)
  1825.                }
  1826.             else
  1827.                {UUEFile($filename,$TmpDir.$OutUUE);
  1828.                 $UUEData = '';
  1829.                 open OF,"$TmpDir$OutUUE";
  1830.                 while (<OF>) {$UUEData .= $_};
  1831.                 close OF;
  1832.                 if ($GAMES{"Player$GNum.$RNum"} =~ /\bMIME\b/i)
  1833.                    {$MIMEFiles .= "$filename;"}; 
  1834.                 unlink $TmpDir.$OutUUE;
  1835.                }
  1836.            };
  1837.        };
  1838.     #»«¼ÑßΓ¿¼ ΓѬßΓ«óδÑ Σá⌐½δ
  1839.     if ($s =~ /%TxtFile(.*)/i)
  1840.        {$filename    = $1;
  1841.         $s           = "";
  1842.         $mintrn      = 0;
  1843.         $maxtrn      = 10000;
  1844.         $onlyrace    = 0;
  1845.  
  1846.         if ($filename =~ /\<.*?(\d+)/i)
  1847.            {$filename = $`.$';
  1848.             $maxtrn   = $1-1;
  1849.            };
  1850.         if ($filename =~ /\>.*?(\d+)/i)
  1851.            {$filename = $`.$';
  1852.             $mintrn   = $1+1;
  1853.            };
  1854.         if ($filename =~ /(\d+)\.\.(\d+)/i)
  1855.            {$filename = $`.$';
  1856.             $mintrn   = $1;
  1857.             $maxtrn   = $2;
  1858.            };
  1859.         if ($filename =~ /\-|\\Race[\x08\x20]*?=[\x08\x20](\w+)/i)
  1860.            {$filename = $`.$';
  1861.             $onlyrace = $1;
  1862.            };
  1863.         $filename = Trims($filename);
  1864.         $filename =~ s/%RaceNum/$RNum/i;
  1865.         $filename =~ s/%HostDir/$GAMES{"Dir$GNum"}/i;
  1866.         if (($GAMEINFO{"Turn"} >= $mintrn) &&
  1867.             ($GAMEINFO{"Turn"} <= $maxtrn) &&
  1868.             (($onlyrace == 0) || ($onlyrace == $RNum)))
  1869.            {
  1870.             open (OF,"$filename");
  1871.             while(<OF>) {$s .= $_};
  1872.             close(OF);
  1873.            };
  1874.        };
  1875.     $MIMEBuf.= "$s\n";
  1876.     $OutBuf .= "$s$UUEData\n";
  1877.    };
  1878.   
  1879.   if ($dinc) {$GAMES{"Include$GNum"} = $dinc}
  1880.   else       {delete $GAMES{"Include$GNum"}};
  1881.  
  1882.   $MIMEBuf .= "MIMEFiles=$MIMEFiles\n" if $MIMEFiles;
  1883.   $body     = "";
  1884.   if ($#packfiles >= 0)
  1885.      {ArcFile("zip",$TmpDir.$FName,@packfiles);
  1886.       UUEFile($TmpDir.$FName,$TmpDir.$OutUUE);
  1887.       if ($GAMES{"Player$GNum.$RNum"} =~ /\bMIME\b/i)
  1888.          {open      OF,"$TmpDir$FName";
  1889.           binmode   OF;
  1890.           read     (OF,$body,-s $TmpDir.$FName);
  1891.           close     OF; 
  1892.           $MIMEBuf .="MIMEDataStart=$FName\n".$body."MIMEDataEnd\n";
  1893.          };
  1894.       open     OF,"$TmpDir$OutUUE";
  1895.       binmode  OF;
  1896.       read    (OF,$body,-s $TmpDir.$OutUUE);
  1897.       close    OF;
  1898.       unlink $TmpDir.$OutUUE;
  1899.       unlink $TmpDir.$FName;
  1900.      };
  1901.   if ($GAMES{"Player$GNum.$RNum"} =~ /\bMIME\b/i)
  1902.      {open     OF,">$TmpDir$OutMIME";
  1903.       binmode  OF; 
  1904.       syswrite OF,$MIMEBuf,length $MIMEBuf;
  1905.       close    OF;
  1906.      };
  1907.   open      OF,">$TmpDir$OutUUE";
  1908.   binmode   OF;
  1909.   syswrite  OF,"$OutBuf\n$body",length "$OutBuf\n$body";
  1910.   close     OF;
  1911.   return 1;
  1912. }
  1913.  
  1914. #Σ«α¼¿απÑΓ Σá⌐½ «Φ¿í¬¿ »α¿Ñ¼á ñ½∩ ¿úαδ/αáßδ ¿º Φáí½«¡á
  1915. sub FillErrorTpl
  1916. { my ($GNum,$RNum) = @_;
  1917.   if (-s $GAMES{"ErrorTpl$GNum"})
  1918.      {unless (FillTpl($GNum,$RNum,$GAMES{"ErrorTpl$GNum"},"err")) {return 0}}
  1919.   else
  1920.      {unless (FillTpl($GNum,$RNum,$WorkDir.$ErrorTplName,"err")) {return 0}};
  1921.   return 1;
  1922. };
  1923.  
  1924. #Σ«α¼¿απÑΓ Σá⌐½ »«ñΓóÑαªñÑ¡¿∩ »α¿Ñ¼á ñ½∩ ¿úαδ/αáßδ ¿º Φáí½«¡á
  1925. sub FillRRCTpl
  1926. { my ($GNum,$RNum) = @_;
  1927.   if (-s $GAMES{"RRCTpl$GNum"})
  1928.      {unless (FillTpl($GNum,$RNum,$GAMES{"RRCTpl$GNum"},"rrc")) {return 0}}
  1929.   else
  1930.      {unless (FillTpl($GNum,$RNum,$WorkDir.$RRCTplName,"rrc")) {return 0}};
  1931.   return 1;
  1932. };
  1933.  
  1934. #Σ«α¼¿απÑΓ Σá⌐½ «ª¿ñá¡¿∩ ºá»π߬á ñ½∩ ¿úαδ/αáßδ ¿º Φáí½«¡á
  1935. sub FillSleepTpl
  1936. { my ($GNum,$RNum,$Next) = @_;
  1937.   if (-s $GAMES{"SleepTpl$GNum"})
  1938.      {unless (FillTpl($GNum,$RNum,$GAMES{"SleepTpl$GNum"},"sl",$Next)) {return 0}}
  1939.   else
  1940.      {unless (FillTpl($GNum,$RNum,$WorkDir.$SleepTplName,"sl",$Next)) {return 0}};
  1941.   return 1;
  1942. };
  1943.  
  1944.  
  1945. #Σ«α¼¿απÑΓ Σá⌐½ «Γß佬¿ σ«ñá ñ½∩ ¿úαδ/αáßδ ¿º Φáí½«¡á
  1946. sub FillSentTpl
  1947. { my ($GNum,$RNum) = @_;
  1948.   if (-s $GAMES{"SentTpl$GNum"})
  1949.      {unless (FillTpl($GNum,$RNum,$GAMES{"SentTpl$GNum"},"se")) {return 0}}
  1950.   else
  1951.      {unless (FillTpl($GNum,$RNum,$WorkDir.$SentTplName,"se")) {return 0}};
  1952.   return 1;
  1953. };
  1954.  
  1955.  
  1956. #»«ßδ½áÑΓ Σá⌐½ »¿ß∞¼á ñ½∩ ¿úαδ/αáßδ »« öêäÄ/àîÑ⌐½π
  1957. sub OutMail
  1958. { my ($GNum,$RNum,$UseMime) = @_;
  1959.   my ($file)       = "";
  1960.   @Month = qw(Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec);
  1961.   $value = $GAMES{"Player$GNum.$RNum"};
  1962.   if ($value)
  1963.      {while ($value =~ /\[(.*?)\]/i)
  1964.             {$value = $';
  1965.              $mdata = $1;
  1966.              if ($mdata =~ /EMail/i)
  1967.                 {$from      = "From: $HostNameFrom <$EMailAddress>\n";
  1968.                  $mdata     =~ /([^\;^\ ^\,^\=]*?@[^\;^\ ^\,^\n]*)/i;
  1969.                  $to        = "To: ".Trims($1." ")."\n";
  1970.                  $subj      = "Subj: GAME $GAMES{\"Name$GNum\"} RACE $RNum\n";
  1971.                  $head      = $from.$to.$subj;
  1972.                  if ($mdata =~ /\bMIME\b/i && $UseMime)
  1973.                     {$file = $TmpDir.$OutMIME}
  1974.                  else
  1975.                     {$file = $TmpDir.$OutUUE};
  1976.                  $filename  = MakeOutName($OutEMailDir,".out");
  1977.                  open    FILE,$file || return 0;
  1978.                  binmode FILE;
  1979.                  read   (FILE,$body,-s $file);
  1980.                  close   FILE;
  1981.                  $body =  ConvertFromAlt($body,'koi');
  1982.                  open     FILE,">$filename" || return 0;
  1983.                  binmode  FILE;
  1984.                  syswrite FILE,"$head"."InsertFile\n"."$body",length "$head"."InsertFile\n"."$body";
  1985.                  close    FILE;
  1986.                 }
  1987.              else
  1988.                 {$file        = $TmpDir.$OutUUE;
  1989.                  $from        = $HostNameFrom;
  1990.                  $FidoAddress =~ /(\d+)\/(\d+)/;
  1991.                  $fromnode    = $2; $fromnet = $1; $fmpt = "";
  1992.                  if ($FidoAddress =~ /\.(\d+)/i)
  1993.                     {$fmpt = $1;
  1994.                     };
  1995.                  $mdata =~ /\"(.*?)\"/i;
  1996.                  $to    = $1;
  1997.                  $mdata =~ /(\d+)\/(\d+)/;
  1998.                  $tonode    = $2; $tonet = $1; $topt = "";
  1999.                  if ($mdata =~ /(\d+)\/(\d+)\.(\d+)/) {$topt = $3};
  2000.                  $MailMask  = 0x0181;
  2001.                  if ($mdata =~ /attr.*?[=-](.*)/i)
  2002.                     {$attr = $1;
  2003. #              1    Crash
  2004. #              2    Message read
  2005. #              3    Message sent
  2006. #              4    File-attach
  2007. #              5    Forwarded
  2008. #              6    Orphan
  2009. #              7    Kill/sent
  2010. #              8    Local message
  2011. #              9    Hold
  2012. #              10    ???
  2013. #              11    File-request
  2014. #              12    Return-receipt requested
  2015. #              13    Return-receipt
  2016. #              14    Audit-trail requested
  2017.                      if ($attr =~ /Crash/i)
  2018.                         {$MailMask |= 0x0001};
  2019.                      if ($attr =~ /Hold/i)
  2020.                         {$MailMask |= 0x0100};
  2021.                      if ($attr =~ /RRC/i)
  2022.                         {$MailMask |= 0x0800};
  2023.                      if ($attr =~ /RRQ/i)
  2024.                         {$MailMask |= 0x1000};
  2025.                     };
  2026.                  @timeis    = localtime;
  2027.                  $time      = sprintf("%02d %03s %02d  %02d:%02d:%02d\x00",
  2028.                                       $timeis[3],$Month[$timeis[4]],$timeis[5],
  2029.                                       $timeis[2],$timeis[1],$timeis[0]);
  2030.                   $head      = pack("a36 a36 a72 a20 c c c c c c c c c c c c L L c c c c c c",
  2031.                                     $from, $to,
  2032.                                     "GAME ".$GAMES{"Name$GNum"}." RACE ".$RNum,
  2033.                                     $time,
  2034.                                     0,0,$tonode & 0xFF,$tonode >> 8,$fromnode & 0xFF,$fromnode >> 8,
  2035.                                     0,0,$fromnet & 0xFF, $fromnet >> 8,$tonet & 0xFF,$tonet >> 8,
  2036.                                     time,0,0,0,$MailMask & 0xFF,$MailMask >> 8,0,0);
  2037.                   open  FILE,$file || return 0;
  2038.                   my    @lines = ();
  2039.                   while (<FILE>) {push (@lines,$_)};
  2040.                   close FILE;
  2041.                   $UUELines = -1;
  2042.                   $MultiSec = -1;
  2043.                   while ($#lines >= 0)
  2044.                   {
  2045.                   $filename  = MakeOutName($OutMsgDir,".msg");
  2046.                   printlog("[OUT] Create message $filename\n",1) if $FullLog;
  2047.                   open     FILE,"> $filename\0" || return 0;
  2048.                   binmode  FILE;
  2049.                   printf   FILE "%s",$head;
  2050.                   if ($fmpt) {printf FILE "%c%s%i%c",0x01,"FMPT ",$fmpt,0x0D};
  2051.                   if ($topt) {printf FILE "%c%s%i%c",0x01,"TOPT ",$topt,0x0D};
  2052.                   close    FILE;
  2053.                   open  FILE,">>$filename"      || return 0; 
  2054.                   $RestLines   = $MaxMsgLines;
  2055.                   $PartChk     = 0;
  2056.                   $PartLen     = 0;
  2057.                   if ($UUELines >= 0)
  2058.                      {print FILE "section $SecNow of $MultiSec of file $UUEFile\n\n";
  2059.                      };
  2060.                   while (($RestLines) && ($#lines >= 0))
  2061.                         {my $line = shift(@lines);
  2062.                          if ($line =~ /\bUUELinesStart.*?\=.*?(\d+)\,(\S+)\,(\S+)/i)
  2063.                             {if ($RestLines <= 5)
  2064.                                 {unshift(@lines,$line);
  2065.                                  last;
  2066.                                 }; 
  2067.                              $UUELines = $1;
  2068.                              $UUEFile  = $2;
  2069.                              $UUEChk   = $3;
  2070.                              $PartChk  = 0;
  2071.                              $MultiSec = -1;
  2072.                              $SecNow   = -1;
  2073.                              $RestLines++;
  2074.                              if ($UUELines > $RestLines)
  2075.                                 {$MultiSec = ($UUELines - $RestLines);
  2076.                                  $MultiSec = ($MultiSec/$MaxMsgLines) + ($MultiSec%$MaxMsgLines ? 2:1);
  2077.                                  $SecNow   = 1;
  2078.                                  print FILE "section $SecNow of $MultiSec of file $UUEFile\n\n";
  2079.                                  next;
  2080.                                 };
  2081.                              print FILE "section 1 of file $UUEFile\n\n";
  2082.                              next;
  2083.                             };
  2084.                          if (($line =~ /\bend\b/i) && ($UUELines >= 0))
  2085.                             {print FILE "end\n";
  2086.                              #! print FILE "sum -r/size $PartChk/$PartLen section (from ".($SecNow == 1 ? '"begin"' : 'first encoded line').
  2087.                              #!            " to ".($SecNow == $MultiSec ? '"end"' : 'last encoded line').")\n";
  2088.                              unless ($SecNow < $MultiSec)
  2089.                                 {#! print FILE "sum -r/size $UUEChk entire input file\n";
  2090.                                 }
  2091.                              $UUELines = -1;
  2092.                              $MultiSec = -1;  
  2093.                              next;
  2094.                             };
  2095.                          #! if ($UUELines >= 0)
  2096.                          #!    {$PartChk  = CalcChkSumm($line."\0x10",$PartChk);
  2097.                          #!     $PartLen += (length $line) + 1;
  2098.                          #!    };
  2099.                          print FILE $line;
  2100.                          $RestLines--;
  2101.                         };
  2102.                   if ($UUELines >= 0)
  2103.                      {#! print FILE "sum -r/size $PartChk/$PartLen section (from ".($SecNow == 1 ? '"begin"' : 'first encoded line').
  2104.                       #!            " to ".($SecNow == $MultiSec ? '"end"' : 'last encoded line').")\n"
  2105.                       print FILE "\n * Message split, to be continued *\n";
  2106.                      };
  2107.                   $SecNow++ if ($MultiSec >= 0);
  2108.                   print FILE "\n$tearline";
  2109.                   close FILE;
  2110.                   }
  2111.                 }
  2112.             }
  2113.     }
  2114. };
  2115.  
  2116. sub MessageToGM
  2117. { my ($body) = @_;
  2118.   $from      = $HostNameFrom;
  2119.   $FidoAddress =~ /(\d+)\/(\d+)/;
  2120.   $fromnode    = $2; $fromnet = $1; $fmpt = "";
  2121.   if ($FidoAddress =~ /\.(\d+)/i)
  2122.      {$fmpt = $1;
  2123.      };
  2124.   $to    = "Gamemaster of $HostNameFrom";
  2125.   $MailMask  = 0x0101;
  2126.   @timeis    = localtime;
  2127.   $time      = sprintf("%02d %03s %02d  %02d:%02d:%02d\x00",
  2128.                        $timeis[3],$Month[$timeis[4]],$timeis[5],
  2129.                        $timeis[2],$timeis[1],$timeis[0]);
  2130.   $head      = pack("a36 a36 a72 a20 c c c c c c c c c c c c L L c c c c c c",
  2131.                     $from, $to,
  2132.                     "Message to Gamemaster",
  2133.                     $time,
  2134.                     0,0,$fromnode & 0xFF,$fromnode >> 8,$fromnode & 0xFF,$fromnode >> 8,
  2135.                     0,0,$fromnet & 0xFF, $fromnet >> 8,$fromnet & 0xFF,$fromnet >> 8,
  2136.                     time,0,0,0,$MailMask & 0xFF,$MailMask >> 8,0,0);
  2137.   $filename  = MakeOutName($HostMsgs,".msg");
  2138.   printlog("[TO GM] Message save as $filename...\n",1) if $FullLog;
  2139.   open     FILE,"> $filename\0" || return 0;
  2140.   binmode  FILE;
  2141.   printf   FILE "%s",$head;
  2142.   if ($fmpt) {printf FILE "%c%s%i%c",0x01,"FMPT ",$fmpt,0x0D};
  2143.   if ($fmpt) {printf FILE "%c%s%i%c",0x01,"TOPT ",$fmpt,0x0D};
  2144.   close    FILE;
  2145.   open  FILE,">>$filename"      || return 0; 
  2146.   print FILE "\n$body";
  2147.   print FILE "\n$tearline";
  2148.   close FILE;
  2149. }
  2150.  
  2151. sub SentRRC
  2152. { my ($GNum,$RNum) = @_;
  2153.   return 0 unless $GAMES{"Player$GNum.$RNum"};
  2154.   TakeGameInfo($GNum,0);
  2155.   return 0 if (substr($GAMEINFO{"Present"},$RNum-1,1) =~ /X/i);
  2156.   FillRRCTpl($GNum,$RNum);
  2157.   OutMail($GNum,$RNum,1);
  2158. };
  2159.  
  2160. sub SentERROR
  2161. { my ($GNum,$RNum) = @_;
  2162.   return 0 unless $GAMES{"Player$GNum.$RNum"};
  2163.   TakeGameInfo($GNum,0);
  2164.   return 0 if (substr($GAMEINFO{"Present"},$RNum-1,1) =~ /X/i);
  2165.   FillErrorTpl($GNum,$RNum);
  2166.   OutMail($GNum,$RNum,1);
  2167. };
  2168.  
  2169. sub SentSleep
  2170. { my ($GNum,$RNum) = @_;
  2171.   return 0 unless $GAMES{"Player$GNum.$RNum"};
  2172.   TakeGameInfo($GNum,0);
  2173.   return 0 if (substr($GAMEINFO{"Present"},$RNum-1,1) =~ /X/i);
  2174.   my $Next         = CheckNextRun($GNum); 
  2175.   FillSleepTpl($GNum,$RNum,$Next);
  2176.   OutMail($GNum,$RNum,1);
  2177.   if (substr($GAMEINFO{"Present"},$RNum-1,1) =~ /-/)
  2178.      {FillSentTpl($GNum,$RNum);
  2179.       OutMail($GNum,$RNum,1);
  2180.      }
  2181. };
  2182.  
  2183. sub SentTurn
  2184. { my ($GNum,$RNum) = @_;
  2185.   return 0 unless $GAMES{"Player$GNum.$RNum"};
  2186.   TakeGameInfo($GNum,0);
  2187.   return 0 if (substr($GAMEINFO{"Present"},$RNum-1,1) =~ /X/i);
  2188.   FillSentTpl($GNum,$RNum);
  2189.   OutMail($GNum,$RNum,1);
  2190. };
  2191.  
  2192. sub DoSleep
  2193. { my ($GNum) = @_;
  2194.   my ($i);
  2195.   for ($i = 1; $i <= 11; $i++)
  2196.       {SentSleep($GNum,$i);
  2197.       }
  2198.   MessageToGM(localtime()."\nI sent sleep message for game $GAMES{\"Name$GNum\"}\n");
  2199. };
  2200.  
  2201. sub RunGame
  2202. { my ($GNum) = @_;
  2203.   my ($OTrn) = @_;
  2204.   my ($i);
  2205.   $OTrn    = $GAMEINFO{"Turn"};
  2206.   $command = $GAMES{"Run$GNum"};
  2207.   $command = ChngSlash($command);
  2208.   printlog("[Run $GNum] Now perform command : $command\n") if $FullLog;
  2209.   system($command);
  2210.   TakeGameInfo($GNum,0);
  2211.   return 0 if ($GAMEINFO{"Turn"} == $OTrn);
  2212.   SaveParams($GNum, $GAMEINFO{"RunDay"} = GetCurDays(),
  2213.                     $GAMEINFO{"TimeOut"} = "");
  2214.   for ($i = 1; $i <= 11; $i++)
  2215.       {SentTurn($GNum,$i);
  2216.       }
  2217.   MessageToGM(localtime()."\nI run game $GAMES{\"Name$GNum\"}\nRun mode : $GAMEINFO{\"RunOption\"}");
  2218. };
  2219.  
  2220. sub CheckGame
  2221. { my ($GNum)     = @_;
  2222.   TakeGameInfo($GNum,1);
  2223.   my $HoursGo  = GetCurDays()*24          + GetCurTime()/3600 -
  2224.                  $GAMEINFO{"CheckDay"}*24 - $GAMEINFO{"CheckTime"}/3600;
  2225.  
  2226.   my $NewCheck = (($GAMEINFO{"CheckDay"}*24*60*60 + $GAMEINFO{"CheckTime"} <
  2227.                    $GAMEINFO{"CheckDay"}*24*60*60 + $GAMES{"Time$GNum"}) and
  2228.                   (GetCurDays()*24*60*60          + GetCurTime() >
  2229.                    $GAMEINFO{"CheckDay"}*24*60*60 + $GAMES{"Time$GNum"})) ? 1 : 0;
  2230.   if ($NewCheck) 
  2231.      {open  FILE,">$FlagDir$fStatus"; 
  2232.       print FILE "$GNum\n";
  2233.       close FILE;
  2234.       SaveParams( $GNum, $GAMEINFO{"CheckWas"} = GetCurDays() );
  2235.      };
  2236.   if ($GAMEINFO{"External"} =~ /run/i)
  2237.      #ºá»πΘÑ¡ º¼ÑѼ-úÑ⌐¼¼áßΓÑα«¼
  2238.      {printlog ("[Run $GNum] èá¬πε-Γπ ¿¡ΣѬµ¿ε ßÑ⌐τáß Γδ ºá»πßΓ¿½ ...\n",1);
  2239.       printlog ("[Run $GNum] çá»π߬ ó αѪ¿¼Ñ RUN (GAMEMASTER) ...\n",1);
  2240.       SaveParams($GNum, $GAMEINFO{"External"}  = "Empty",
  2241.                         $GAMEINFO{"RunOption"} = "RunGameMaster");
  2242.       RunGame($GNum);
  2243.      }
  2244.   elsif ($GAMEINFO{"External"} =~ /start/i)
  2245.      #ºá»πΘÑ¡ º¼ÑѼ-úÑ⌐¼¼áßΓÑα«¼
  2246.      {printlog ("[Run $GNum] èá¬πε-Γπ ¿¡ΣѬµ¿ε ßÑ⌐τáß Γδ ºá»πßΓ¿½ ...\n",1);
  2247.       printlog ("[Run $GNum] çá»π߬ ó αѪ¿¼Ñ START (NORMAL) ...\n",1);
  2248.       SaveParams($GNum, $GAMEINFO{"External"}  = "Empty",
  2249.                         $GAMEINFO{"RunOption"} = "RunNormal");
  2250.       RunGame($GNum);
  2251.      }
  2252.   elsif
  2253.      ($GAMEINFO{"External"} =~ /sleep/i)
  2254.      #ß½¿»¡πΓ º¼ÑѼ-úÑ⌐¼¼áßΓÑα«¼
  2255.      {if ($GAMEINFO{"External"} =~ /=/)
  2256.          {my $games = $';
  2257.           while ($games =~ /(\d+)/gc) {SentSleep($GNum,$1)}; 
  2258.          }
  2259.       else
  2260.          {DoSleep($GNum)};
  2261.       printlog ("[Sleep $GNum] ò«ßΓ ß»¿Γ - »πßΓ∞ º¡áεΓ óßÑ ...\n",1);
  2262.       $GAMEINFO{"External"}  = "Empty"; 
  2263.      }
  2264.   elsif ($GAMEINFO{"AllTurns"})
  2265.      #»α¿ßπΓßΓóπεΓ éæà Γα¡-¬¿
  2266.      {printlog ("[Run $GNum] èᬠºñ«α«ó«, τΓ« óßÑ ¼δ ºñÑß∞ ßÑú«ñ¡∩ ß«íα὿ß∞ ...\n",1);
  2267.       if ( ($GAMEINFO{"TimeOut"})   ||                              #á) Äª¿ñá¡¿Ñ;
  2268.            ( (substr($GAMES{"Days$GNum"},GetCurDay(),1) =~ /r/i) && #í) ê Γᬠíδ
  2269.              ($GAMEINFO{"RunDay"} != GetCurDays())) ||              #   ºá»πßΓ¿½¿.
  2270.              ($GAMEINFO{"RunOption"} eq "RunImmediate") )           #ó) «ª¿ñ὿ 9¬π
  2271.          {printlog ("[Run $GNum] çá»π߬ ó αѪ¿¼Ñ NORMAL ...\n",1);
  2272.           SaveParams( $GNum,
  2273.                       $GAMEINFO{"TimeOut"}   = 0,
  2274.                       $GAMEINFO{"RunOption"} = "RunNormal" );
  2275.          }
  2276.       else
  2277.          {printlog ("[Run $GNum] çá»π߬ ó αѪ¿¼Ñ ALLPRESENT ...\n",1);
  2278.           SaveParams( $GNum, $GAMEINFO{"RunOption"} = "RunByAll" );
  2279.          }
  2280.       RunGame($GNum);
  2281.      }
  2282.   elsif
  2283.      ($GAMEINFO{"TimeOut"})
  2284.      #¡áσ«ñ¿¼ß∩ ó αѪ¿¼Ñ ÄåêäÇìêƒ
  2285.      {if ($HoursGo > 0)
  2286.           {printlog("[Check $GNum] Äª¿ñá¡¿Ñ ºá»π߬á...\n",1);
  2287.            if ($GAMEINFO{"Summ"} >= $GAMEINFO{"Need"} && $GAMEINFO{"AllNine"} && $NewCheck)
  2288.              {printlog("[Run $GNum] ä«Γ∩¡π½ ¡á ºá»áß¡«¼, ßΓÑαóѵ ...\n",1);
  2289.               printlog("[Run $GNum] çá»π߬ ó αѪ¿¼Ñ NORMAL ...\n",1);
  2290.               SaveParams( $GNum, $GAMEINFO{"RunOption"} = "RunNormal" );
  2291.               RunGame($GNum);
  2292.              }
  2293.           elsif
  2294.              ($HoursGo >= $GAMEINFO{"TimeOut"})
  2295.              {if ($GAMEINFO{"RunOption"} eq "RunTimeOut")
  2296.                  {DecWeights($GNum);
  2297.                   printlog("[Dec $GNum] èΓ« ¡Ñ ΓπΓ - π»á½, «Γªá½ß∩ ...\n",1);
  2298.                  };
  2299.               printlog("[Run $GNum] ìÑ π߻ѽ¿, ¡Ñ π߻ѽ¿ ...\n",1);
  2300.               printlog("[Run $GNum] çá»π߬ ó αѪ¿¼Ñ TIMEOUT ...\n",1);
  2301.               SaveParams( $GNum, $GAMEINFO{"RunOption"} = "RunTimeOut" );
  2302.               RunGame($GNum);
  2303.              }
  2304.           else
  2305.              {SaveParams( $GNum, $GAMEINFO{"TimeOut"} -= $HoursGo );
  2306.               printlog("[Wait $GNum] ... ¡« α«ó¡« τÑαѺ $GAMEINFO{'TimeOut'} τáß(á,«ó) «¡ »α«ß¡ÑΓß∩ ...\n",1);
  2307.               DoSleep($GNum) if $NewCheck;
  2308.              }
  2309.           }
  2310.       else
  2311.          {return 0;
  2312.          }
  2313.      }
  2314.   elsif
  2315.      ($NewCheck)
  2316.      #¡áßΓπ»¿½« óαѼ∩ »α«óÑα¿Γ∞ Σ½áú¿
  2317.      {printlog ("[Check $GNum] Åα¿Φ½á »«αá »α«óÑα¿Γ∞ ß«íδΓ¿Ñ ...\n",1);
  2318.       if (substr($GAMES{"Days$GNum"},GetCurDay(),1) =~ /s/i)
  2319.          { DoSleep($GNum);
  2320.            printlog("[Sleep $GNum] æ»¿¼, í½∩ ...\n",1);
  2321.          }
  2322.       elsif
  2323.          (substr($GAMES{"Days$GNum"},GetCurDay(),1) =~ /c/i)
  2324.          { printlog("[Check $GNum] Å«ß¼«Γα¿¼, »«ß¼«Γα¿¼ ...\n",1);
  2325.            if ( ($GAMEINFO{"RunOption"} eq "RunByAll") ||
  2326.                 ($GAMEINFO{"RunOption"} eq "RunGameMaster") )
  2327.               {printlog("[Sleep $GNum] Å«¬á »α«¡Ñß½«, á τΓ« ñá½∞ΦÑ ...\n",1);
  2328.                printlog("[Sleep $GNum] ÉѪ¿¼ ¿º¼Ñ¡Ñ¡ ¡á NORMAL ...\n",1);
  2329.                SaveParams( $GNum, $GAMEINFO{"RunOption"} = "RunNormal" );
  2330.                DoSleep($GNum); 
  2331.               }
  2332.            elsif
  2333.               ( $GAMEINFO{"RunOption"} eq "RunImmediate" )
  2334.               {printlog("[Run $GNum] äá¡ »α¿¬áº Ñ¼π ¡á ºá»π߬ ...\n",1);
  2335.                printlog("[Run $GNum] çá»π߬ »α«¿ºóÑñÑ¡ ó αѪ¿¼Ñ NORMAL ...\n",1);
  2336.                SaveParams( $GNum, $GAMEINFO{"RunOption"} = "RunNormal" );
  2337.                RunGame($GNum);
  2338.               }
  2339.            elsif
  2340.               ( $GAMEINFO{"Summ"} >= $GAMEINFO{"Need"} )
  2341.               { unless ($GAMEINFO{"RunOption"} eq "RunTimeOut")
  2342.                        {DecWeights($GNum);
  2343.                         printlog("[Dec $GNum] èΓ« ¡Ñ ΓπΓ - π»á½, «Γªá½ß∩ ...\n",1);
  2344.                        };
  2345.                 if ($GAMEINFO{"AllNine"})
  2346.                    {printlog("[Run $GNum] òóáΓ¿½« óα«ñÑ ...\n",1);
  2347.                     printlog("[Run $GNum] çá»π߬ »α«¿ºóÑñÑ¡ ó αѪ¿¼Ñ NORMAL ...\n",1);
  2348.                     SaveParams( $GNum, $GAMEINFO{"RunOption"} = "RunNormal" );
  2349.                     RunGame($GNum);
  2350.                    }
  2351.                 else
  2352.                    {printlog("[Sleep $GNum] Ç ó«Γ ñÑó∩Γ«¬-Γ« ¿ ¡Ñ σóáΓáÑΓ ...\n",1);
  2353.                     printlog("[Sleep $GNum] æ½ÑñπεΘ¿⌐ ºá»π߬ ß«ßΓ«¿Γß∩ ó ½εíπε »«ú«ñπ ...\n",1);
  2354.                     SaveParams( $GNum, $GAMEINFO{"RunOption"} = "RunImmediate" );
  2355.                     DoSleep($GNum); 
  2356.                    };
  2357.               }
  2358.            else
  2359.               { unless ($GAMEINFO{"RunOption"} eq "RunTimeOut")
  2360.                        {DecWeights($GNum);
  2361.                         printlog("[Dec $GNum] èΓ« ¡Ñ ΓπΓ - π»á½, «Γªá½ß∩ ...\n",1);
  2362.                        };
  2363.                 printlog("[Sleep $GNum] îá½áóáΓá íπñÑΓ ...\n",1);
  2364.                 if ($GAMES{"Wait$GNum"})
  2365.                    {SaveParams( $GNum, $GAMEINFO{"TimeOut"} = $GAMES{"Wait$GNum"} );
  2366.                     printlog("[Sleep $GNum] ... ¿ ó ºá»áßÑ π ¡Ñú«(¡¿σ) «ßΓὫß∞ $GAMEINFO{'TimeOut'} τáß(á,«ó) ...\n",1);
  2367.                    }
  2368.                 else
  2369.                    {SaveParams( $GNum, $GAMEINFO{"RunOption"} = "RunImmediate" );
  2370.                     printlog("[Sleep $GNum] æ½ÑñπεΘ¿⌐ ºá»π߬ ß«ßΓ«¿Γß∩ ó ½εíπε »«ú«ñπ ...\n",1);
  2371.                    };
  2372.                 DoSleep($GNum);
  2373.               };
  2374.          }
  2375.       elsif
  2376.         (substr($GAMES{"Days$GNum"},GetCurDay(),1) =~ /r/i)
  2377.         {printlog("[Check $GNum] Two beer or not two beer ...\n",1);
  2378.          if ( ($GAMEINFO{"RunOption"} eq "RunByAll") ||
  2379.               ($GAMEINFO{"RunOption"} eq "RunGameMaster") )
  2380.               {printlog("[Sleep $GNum] Å«¬á »α«¡Ñß½«, á τΓ« ñá½∞ΦÑ ...\n",1);
  2381.                printlog("[Sleep $GNum] ÉѪ¿¼ ¿º¼Ñ¡Ñ¡ ¡á NORMAL ...\n",1);
  2382.                SaveParams( $GNum, $GAMEINFO{"RunOption"} = "RunNormal" );
  2383.                DoSleep($GNum); 
  2384.               }
  2385.            elsif
  2386.               ( ($GAMEINFO{"RunOption"} eq "RunTimeOut") && ($GAMES{"Wait$GNum"} > 0) )
  2387.               {printlog("[Sleep $GNum] Å«¬á »α«¡Ñß½«, á τΓ« ñá½∞ΦÑ ...\n",1);
  2388.                printlog("[Sleep $GNum] æ½ÑñπεΘ¿⌐ ºá»π߬ ß«ßΓ«¿Γß∩ ó ½εíπε »«ú«ñπ ...\n",1);
  2389.                SaveParams( $GNum, $GAMEINFO{"RunOption"} = "RunImmediate" );
  2390.                DoSleep($GNum);
  2391.               }
  2392.            else
  2393.               {unless ($GAMEINFO{"RunOption"} eq "RunTimeOut")
  2394.                        {DecWeights($GNum);
  2395.                         printlog("[Dec $GNum] èΓ« ¡Ñ ΓπΓ - π»á½, «Γªá½ß∩ ...\n",1);
  2396.                        };
  2397.                printlog("[Run $GNum] Å«αá, íαáΓ, »«αá ...\n",1);
  2398.                printlog("[Run $GNum] çá»π߬ »α«¿ºóÑñÑ¡ ó αѪ¿¼Ñ - NORMAL ...\n",1);
  2399.                SaveParams( $GNum, $GAMEINFO{"RunOption"} = "RunNormal" );
  2400.                RunGame($GNum);
  2401.               };
  2402.         };
  2403.    };
  2404.   $GAMEINFO{"CheckDay"}  = GetCurDays();
  2405.   $GAMEINFO{"CheckTime"} = GetCurTime();
  2406.   SaveParams($GNum);
  2407. };
  2408.  
  2409. sub CheckNextRun
  2410. { my ($GNum)     = @_;
  2411.  
  2412.   if ($GAMEINFO{"TimeOut"})
  2413.      {$NextRun = "æ½ÑñπεΘ¿⌐ ºá»π߬ : ".AddTime(0,$GAMEINFO{"TimeOut"}*3600,$GNum);
  2414.      }
  2415.   elsif
  2416.      ( !($GAMES{"Days$GNum"} =~ /c|r/i) ||
  2417.        !($GAMES{"Run$GNum"}) )
  2418.      {$NextRun = "æ½ÑñπεΘ¿⌐ ºá»π߬ :  »« »α¿σ«ñπ óßÑσ Γα¡ ¿½¿\n".
  2419.                  "                    ¿úαá íπñÑΓ ºá»πΘÑ¡á óαπτ¡πε âî.";
  2420.      }
  2421.   else
  2422.      {$AddDays    = $GAMEINFO{"CheckWas"} == GetCurDays() ? 1 : 0;
  2423.       $DayValue   = (GetCurDay() + $AddDays) % 7;
  2424.       $AddTime    = 0;
  2425.       $FirstPoint = -1;
  2426.       $RunOption  = $GAMEINFO{"RunOption"};
  2427.       while ($AddDays <= 14)
  2428.       {if (substr($GAMES{"Days$GNum"},$DayValue,1) =~ /s/i)
  2429.           {$AddDays++; $DayValue = $DayValue == 6 ? 0 : $DayValue+1;
  2430.           }
  2431.        elsif
  2432.           (substr($GAMES{"Days$GNum"},$DayValue,1) =~ /c/i)
  2433.           {if ( $RunOption eq "RunByAll" ||
  2434.                 $RunOption eq "RunGameMaster" )
  2435.               {$AddDays++; $DayValue = $DayValue == 6 ? 0 : $DayValue+1;
  2436.                $RunOption  = "RunNormal";
  2437.               }
  2438.            elsif
  2439.               ( $RunOption  eq "RunImmediate" )
  2440.               { last;
  2441.               }
  2442.            elsif
  2443.               ( $GAMEINFO{"Summ"} >= $GAMEINFO{"Need"} )
  2444.               { if ($GAMEINFO{"AllNine"})
  2445.                    { last;
  2446.                    }
  2447.                 else
  2448.                    { $FirstPoint = $AddDays;
  2449.                      $AddDays++; $DayValue = $DayValue == 6 ? 0 : $DayValue+1;
  2450.                      $RunOption = "RunImmediate";
  2451.                    };
  2452.               }
  2453.            else
  2454.               { if ($GAMES{"Wait$GNum"})
  2455.                    {$FirstPoint = $AddDays;
  2456.                     $AddTime    = $GAMES{"Wait$GNum"};
  2457.                     last;
  2458.                    }
  2459.                 else
  2460.                    {$FirstPoint = $AddDays;
  2461.                     $AddDays++; $DayValue = $DayValue == 6 ? 0 : $DayValue+1;
  2462.                     $RunOption = "RunImmediate";
  2463.                    }
  2464.               };
  2465.          }
  2466.       elsif
  2467.         (substr($GAMES{"Days$GNum"},$DayValue,1) =~ /r/i)
  2468.         {if ( $RunOption eq "RunByAll" ||
  2469.               $RunOption eq "RunGameMaster" )
  2470.               {$AddDays++; $DayValue = $DayValue == 6 ? 0 : $DayValue+1;
  2471.                $RunOption = "RunNormal";
  2472.               }
  2473.            elsif
  2474.               ( ($RunOption eq "RunTimeOut") && ($GAMES{"Wait$GNum"} > 0) )
  2475.               {$FirstPoint = $AddDays;
  2476.                $AddDays++; $DayValue = $DayValue == 6 ? 0 : $DayValue+1;
  2477.                $RunOption = "RunImmediate";
  2478.               }
  2479.            else
  2480.               {last;
  2481.               };
  2482.         }
  2483.       else
  2484.         {$AddDays++; $DayValue = $DayValue == 6 ? 0 : $DayValue+1;
  2485.         }
  2486.       };
  2487.      if ($AddDays > 14)
  2488.         {$NextRun = "æ½ÑñπεΘ¿⌐ ºá»π߬ :  »« »α¿σ«ñπ óßÑσ Γα¡ ¿½¿\n".
  2489.                     "                    ¿úαá íπñÑΓ ºá»πΘÑ¡á óαπτ¡πε âî.";
  2490.         }
  2491.      else
  2492.         {if ($FirstPoint >= 0)
  2493.             {$NextRun = "æ½ÑñπεΘ¿⌐ ºá»π߬ :\n".
  2494.                         " - »α¿ ñ«ßΓ¿ªÑ¡¿¿ óÑßá ".AddTime($FirstPoint,0,$GNum)."\n".
  2495.                         " - íѺπß½«ó¡«          ".AddTime($AddDays,$AddTime*3600,$GNum);
  2496.             }
  2497.          else
  2498.             {$NextRun = "æ½ÑñπεΘ¿⌐ ºá»π߬ :\n".
  2499.                         " - íѺπß½«ó¡«          ".AddTime($AddDays,$AddTime*3600,$GNum);
  2500.             };
  2501.         }
  2502.      };
  2503.   printlog("[NEXT $GNum] $NextRun\n",1) if $FullLog;
  2504.   return $NextRun;
  2505. };
  2506.  
  2507. sub AddTime
  2508. {my ($adays,$atime,$GNum) = @_;
  2509.  $mytime = (GetCurDays() + $adays)*24*60*60 + $GAMES{"Time$GNum"} + $atime;
  2510.  $timestring = localtime($mytime);
  2511.  $timestring =~s/sun/é߬/i;
  2512.  $timestring =~s/mon/Å«¡/i;
  2513.  $timestring =~s/tue/éΓ«/i;
  2514.  $timestring =~s/wed/æαÑ/i;
  2515.  $timestring =~s/thi/ùÑΓ/i;
  2516.  $timestring =~s/fri/Å∩Γ/i;
  2517.  $timestring =~s/sat/æπí/i;
  2518.  return  $timestring;
  2519. };
  2520.  
  2521.  
  2522.  
  2523. sub GetCurDays
  2524. {return time / (60*60*24)
  2525. };
  2526.  
  2527. sub GetCurDay
  2528. {my (@realday) = (6,0,1,2,3,4,5);
  2529.  my $thisday = (gmtime)[6];
  2530.  return (@realday[$thisday]);
  2531. };
  2532.  
  2533. sub GetCurTime
  2534. {return time % (60*60*24)
  2535. };
  2536.  
  2537. sub DecWeights
  2538. {my ($GNum) = @_;
  2539.  my ($i);
  2540.  if ($Dec = $GAMES{"CheckDec$GNum"})
  2541.     {for ($i = 1; $i <= 11; $i++)
  2542.          {if ((substr($GAMEINFO{"Present"},$i-1,1) eq "-") &&
  2543.               (substr($GAMEINFO{"Weight"},$i-1,1) > 0) &&
  2544.               (substr($GAMEINFO{"Weight"},$i-1,1) < 9))
  2545.               {$GAMEINFO{"Need"}                  -= $Dec > substr($GAMEINFO{"Weight"},$i-1,1) ? substr($GAMEINFO{"Weight"},$i-1,1) : $Dec;
  2546.                substr($GAMEINFO{"Weight"},$i-1,1) -= $Dec > substr($GAMEINFO{"Weight"},$i-1,1) ? substr($GAMEINFO{"Weight"},$i-1,1) : $Dec;
  2547.               }
  2548.          }
  2549.     }
  2550.  SaveParams($GNum);
  2551. };
  2552.  
  2553. sub ReadParams
  2554. { my ($GNum) = @_;
  2555.   foreach $key (keys %GAMEINFO) {delete $GAMEINFO{$key}};
  2556.   open GAMEPARAM,$WorkDir.$GamesDat || return 0;
  2557.   while (<GAMEPARAM>)
  2558.         {chomp;
  2559.          if (/\bGAME\:$GAMES{"Name$GNum"}\:/i)
  2560.             {($GAME,
  2561.               $GAMEINFO{"GameName"},
  2562.               $GAMEINFO{"Weight"},
  2563.               $GAMEINFO{"Need"},
  2564.               $GAMEINFO{"OriginalWts"}, 
  2565.               $GAMEINFO{"OriginalWt"}, 
  2566.               $GAMEINFO{"RunOption"},
  2567.               $GAMEINFO{"CheckWas"},
  2568.               $GAMEINFO{"CheckDay"},
  2569.               $GAMEINFO{"CheckTime"},
  2570.               $GAMEINFO{"RunDay"},
  2571.               $GAMEINFO{"TimeOut"},
  2572.               $GAMEINFO{"External"}) = split(/:/); last;}
  2573.         }
  2574.   close GAMEPARAM;
  2575.   return 1;
  2576. };
  2577.  
  2578. sub SaveParams
  2579. { my ($GNum) = @_;
  2580.   my ($s); 
  2581.   unless (-s $WorkDir.$GamesDat)
  2582.          {open (GAMEPARAM,">$WorkDir$GamesDat"); close GAMEPARAM};
  2583.   open GAMEPARAM,"$WorkDir$GamesDat";
  2584.   $s         = join(":",    ("GAME",
  2585.                              $GAMES{"Name$GNum"},
  2586.                              $GAMEINFO{"Weight"},
  2587.                              $GAMEINFO{"Need"},
  2588.                              $GAMEINFO{"OriginalWts"},
  2589.                              $GAMEINFO{"OriginalWt"},
  2590.                              $GAMEINFO{"RunOption"},
  2591.                              $GAMEINFO{"CheckWas"},
  2592.                              $GAMEINFO{"CheckDay"},
  2593.                              $GAMEINFO{"CheckTime"},
  2594.                              $GAMEINFO{"RunDay"},
  2595.                              $GAMEINFO{"TimeOut"},
  2596.                              $GAMEINFO{"External"}));
  2597.   undef @lines;
  2598.   while (<GAMEPARAM>)
  2599.         {chomp;
  2600.          if ((/\bGAME\:$GAMES{"Name$GNum"}\:/i) && $s)
  2601.             {$_ = $s;
  2602.              $s = "";
  2603.             };
  2604.          push(@lines,$_); 
  2605.         }
  2606.   if ($s) {push(@lines,$s)};
  2607.   
  2608.   open  (GAMEPARAM,">$WorkDir$GamesDat");
  2609.   foreach (@lines) {print GAMEPARAM "$_\n"};
  2610.   close GAMEPARAM;
  2611.   return 1;
  2612. };
  2613.  
  2614.  
  2615. sub TakeGameInfo
  2616. { my ($GNum,$ShowLine) = @_;
  2617.   my ($i);
  2618.   my ($HexChars)       = "123456789AB";
  2619.   ReadParams($GNum);
  2620.   $GAMEINFO{"AllTurns"} = "yes";
  2621.   $GAMEINFO{"AllNine"}  = "yes";
  2622.   $GAMEINFO{"GameName"} = $GAMES{"Name$GNum"} unless ($GAMEINFO{"GameName"});
  2623.   open (TRNFILE,$GAMES{"Dir$GNum"}."nextturn.hst");
  2624.   read (TRNFILE,$buf,20);
  2625.   close(TRNFILE);
  2626.   ($GAMEINFO{"TimeStamp"},$GAMEINFO{"Turn"}) = unpack("a18 c2",$buf);
  2627.   $GAMEINFO{"Summ"}     = 0;
  2628.   $GAMEINFO{"Present"}  = "";
  2629.   $GAMEINFO{"Weight"}   = $GAMES{"Weights$GNum"} unless ($GAMEINFO{"Weight"});
  2630.   $GAMEINFO{"Need"}     = $GAMES{"Weight$GNum"} unless ($GAMEINFO{"Need"});
  2631.   unless ( ($GAMES{"Weights$GNum"} eq $GAMEINFO{"OriginalWts"}) &&
  2632.            ($GAMES{"Weight$GNum"} eq $GAMEINFO{"OriginalWt"}) )    
  2633.          {$GAMEINFO{"Need"}         = $GAMES{"Weight$GNum"};
  2634.           $GAMEINFO{"OriginalWt"}   = $GAMES{"Weight$GNum"};   
  2635.           $GAMEINFO{"Weight"}       = $GAMES{"Weights$GNum"};
  2636.           $GAMEINFO{"OriginalWts"}  = $GAMES{"Weights$GNum"};  
  2637.          };   
  2638.   $GAMEINFO{"RunOption"}= "RunNormal" unless ($GAMEINFO{"RunOption"});
  2639.   for ($i = 1; $i <= 11; $i++)
  2640.       { $Wt = substr($GAMEINFO{"Weight"},$i-1,1);
  2641.         if (($Wt ge "0") && ($Wt le "9"))
  2642.            {if (CheckTurn($GAMES{"Dir$GNum"}."player$i.trn",$GAMES{"Dir$GNum"}))
  2643.                {$GAMEINFO{"Summ"}     += $Wt;
  2644.                 $GAMEINFO{"Present"}  .= substr($HexChars,$i-1,1);
  2645.                }
  2646.             else
  2647.                {unlink $GAMES{"Dir$GNum"}."player$i.trn";
  2648.                 $GAMEINFO{"Present"}  .= "-";
  2649.                 $GAMEINFO{"AllTurns"}  = "";
  2650.                 if ($Wt == 9)
  2651.                    {$GAMEINFO{"AllNine"} = ""};
  2652.                }
  2653.            }
  2654.         else
  2655.            {$GAMEINFO{"Present"} .= "x";
  2656.            };
  2657.       };
  2658.   printlog(sprintf("GAME %4s [%3d vs %3d] found <%11s from %11s>\n",
  2659.                    $GAMES{"Name$GNum"},
  2660.                    $GAMEINFO{"Summ"},
  2661.                    $GAMEINFO{"Need"},
  2662.                    $GAMEINFO{"Present"},
  2663.                    $GAMEINFO{"Weight"})) if $ShowLine;
  2664. };
  2665.  
  2666. sub CheckTurn
  2667. { my ($trnfile,$hostdir) = @_;
  2668.   ($filesize = -s $trnfile)    || return 0;
  2669.   open(TRNFILE,"$trnfile")     || return 0;
  2670.   read(TRNFILE,$buf,$filesize) || return 0;
  2671.   close(TRNFILE);
  2672.   ($buf =~ /(\d\d\-\d\d\-\d\d\d\d\d\d\:\d\d\:\d\d)/) || return 0;
  2673.   $TimeStamp = $1;
  2674.  
  2675.   ($filesize = -s $hostdir."lastturn.hst")           || return 0;
  2676.   open(TRNFILE,"$hostdir"."lastturn.hst")            || return 0;
  2677.   read(TRNFILE,$buf,$filesize)                       || return 0;
  2678.   close(TRNFILE);
  2679.  
  2680.   ($buf =~ /(\d\d\-\d\d\-\d\d\d\d\d\d\:\d\d\:\d\d)/) || return 0;
  2681.   if ($TimeStamp eq $1)
  2682.      {return 1}
  2683.   else
  2684.      {return 0};
  2685. };
  2686.  
  2687.  
  2688. sub ChngSlash
  2689. { my ($mask) = @_;
  2690.   $mask =~ s/\\/\//g;
  2691.   return $mask;
  2692. };
  2693.  
  2694.  
  2695. sub printlog
  2696. { my ($logstr,$onlyfile) = @_;
  2697.   ($hour,$min,$sec) = (localtime())[2,1,0];
  2698.   printf "%02d:%02d:%02d %s",$hour,$min,$sec,$logstr unless $onlyfile;
  2699.   printf LOGFILE "%02d:%02d:%02d %s",$hour,$min,$sec,$logstr;
  2700. };
  2701.  
  2702. sub MakeOutName
  2703. { my ($dir,$ext) = @_;
  2704.   for ($i = 1; -s $dir.$i.$ext > 0; $i++) {};
  2705.   return $dir.$i.$ext;
  2706. };
  2707.  
  2708. sub MakeOutExt
  2709. { my ($dir,$name,$ext) = @_;
  2710.   my ($i);
  2711.   $name =~ s/.*?([^\\^\/]*?)(\.[^\\^\/]{0,3}){0,1}$/$1/i;
  2712.   for ($i = 1; $i <= 255; $i++)
  2713.       {$Ext = $ext; $Val = sprintf("%x",$i); substr($Ext,length($Ext) - length($Val), length($Val)) = $Val;
  2714.        if (-s $dir.$name.".$Ext" <= 0)
  2715.           {return $dir.$name.".".$Ext};
  2716.       };
  2717.   return "";
  2718. };
  2719.  
  2720. sub Trims
  2721. { my ($line) = @_;
  2722.   $line =~ s/^\s*(.*?)\s*$/$1/;
  2723.   return $1;
  2724. };
  2725.  
  2726. sub uuencode
  2727. { my($in,$file,$mode) = @_;
  2728.   my($chunk,@result,$r);
  2729.   my($lines,$Chk,$len)= 0;
  2730.   $mode         ||= "644";
  2731.   open    FILE,$in ||  return "";
  2732.   binmode FILE;
  2733.   while (defined($r = read(FILE,$chunk,45)) && $r > 0)
  2734.         {$lines++;
  2735.          $Chk = CalcChkSumm($chunk,$Chk);
  2736.          $len+= length $chunk;
  2737.          push @result, uuencode_chunk($chunk);
  2738.         };
  2739.   my (@name) = split /[\:\\\/]/,$in;
  2740.   $out = join "", "UUELinesStart=$lines,@name[$#name],$Chk/$len\nbegin $mode @name[$#name]\n", @result, "`\nend\n";
  2741.   if ($file)
  2742.      { open  FILE,">$file";
  2743.        print FILE $out;
  2744.        close FILE;
  2745.      }
  2746.   return $out;
  2747. }
  2748.  
  2749. sub uuencode_chunk
  2750. {
  2751.     my($string) = shift;
  2752.     my $encoded_string = pack("u", $string);           # unix uuencode
  2753.     return $encoded_string;
  2754. }
  2755.  
  2756. sub uudecode
  2757. { my($in,$out) = @_;
  2758.   my(@result,$file,$mode);
  2759.   $mode = $file = "";
  2760.   open FILE,$in || return "";
  2761.   binmode(FILE);
  2762.   read FILE,$in,-s $in;
  2763.   close FILE;
  2764.   while ($in =~ m/\G(.*?[\n|\r]{1,2})/gc) 
  2765.         {
  2766.          my $line = $1;
  2767.          if ($file eq "" and !$mode)
  2768.             {($mode,$file) = $line =~ /^begin\s+(\d+)\s+(\S+)/ ;
  2769.              next;
  2770.         }
  2771.          next if $file eq "" and !$mode;
  2772.          last if $line =~ /^end/;
  2773.          push @result, uudecode_chunk($line);
  2774.         };
  2775.   if ($file and $mode)
  2776.      {open    FILE,">$out" || return "";
  2777.       binmode FILE;
  2778.       foreach (@result)
  2779.               {syswrite FILE,$_,length $_;
  2780.               };
  2781.       close FILE;
  2782.       return $file;
  2783.      }
  2784.   else
  2785.      {
  2786.       return "";
  2787.      }  
  2788. }
  2789.  
  2790. sub uudecode_chunk {
  2791.     my($chunk) = @_;
  2792.     return "" if $chunk =~ /^(?:--|CREATED)/;
  2793.     my $string = substr($chunk,0,int((((ord($chunk) - 32) & 077) + 2) / 3)*4+1);
  2794. #    warn "DEBUG: string [$string]";
  2795. #    my $return = unpack("u", $string);
  2796. #    warn "DEBUG: return [$return]";
  2797. #    $return;
  2798.  
  2799.     my $ret = unpack("u", $string);
  2800.     defined $ret ? $ret : "";
  2801. }
  2802.  
  2803. sub CalcChkSumm
  2804. {my ($line, $ChkSumm) = @_;
  2805.  for (my $i = 1; $i <= length $line; $i++)
  2806.      { $ChkSumm += (($ChkSumm >> 1) & 0x0000FFFF) + ord(substr($line,$i-1,1)) };
  2807.  return $ChkSumm;
  2808. }
  2809.  
  2810. 1
  2811. __END__
  2812.