home *** CD-ROM | disk | FTP | other *** search
/ Between Heaven & Hell 2 / BetweenHeavenHell.cdr / 500 / 433 / pycmdpar.inc < prev    next >
Text File  |  1986-11-29  |  8KB  |  276 lines

  1. {======= COMMAND PARSING =======}
  2.  
  3. PROCEDURE GetCommand;
  4. BEGIN
  5.   XLF;
  6.   X('<('+IntToStr(Altitude)+')> ');
  7.   CmdWasTyped := FALSE;
  8.   IF LENGTH(CmdParm) = 0 THEN
  9.   BEGIN
  10.     UpCaseInput := TRUE;
  11.     Cmd := GetInput;
  12.     UpCaseInput := FALSE;
  13.     IF Cmd = '?' THEN
  14.     BEGIN
  15.       Backspace;
  16.       X('HELP');
  17.       Cmd := 'HELP';
  18.     END;
  19.     CmdWasTyped := TRUE;
  20.   END;
  21.   CharDuringO := FALSE;
  22. END;
  23.  
  24. PROCEDURE DoCommand;
  25. VAR
  26.   DCChar    : CHAR;
  27.   DCLine    : Line;
  28.   DCNum     : INTEGER;
  29.   CmdLen    : INTEGER;
  30.   CmdNumber : INTEGER;
  31.   CmdOkay   : BOOLEAN;
  32.   CompLen   : INTEGER;
  33.   CompWord  : STRING[10];
  34.   SpacePos  : INTEGER;
  35. BEGIN
  36.   GetDate;
  37.   IF NOT CmdWasTyped THEN Cmd := CmdParm;
  38.   CmdParm := '';
  39.   {--- Parse parm ---}
  40.   SpacePos := POS(' ',Cmd);
  41.   IF SpacePos <> 0 THEN
  42.   BEGIN
  43.     CmdParm := Cmd;
  44.     DELETE(CmdParm,1,SpacePos);
  45.     Cmd := COPY(Cmd,1,SpacePos-1);
  46.   END;
  47.   IF NOT CmdWasTyped THEN X(Cmd);
  48.   {--- Check for anything left ---}
  49.   CmdLen := LENGTH(Cmd);
  50.   IF CmdLen = 0
  51.   THEN CmdOkay := FALSE
  52.   ELSE CmdOkay := TRUE;
  53.   IF CmdOkay THEN
  54.   BEGIN
  55.     {------- Find command and complete it -------}
  56.     CmdOkay := FALSE;
  57.     CmdNumber := 0;
  58.     REPEAT
  59.       CmdNumber := CmdNumber + 1;
  60.       CompWord := CmdWords[CmdNumber];
  61.       CompLen := CmdLen;
  62.       IF LENGTH(CompWord) < CompLen THEN CompLen := LENGTH(CompWord);
  63.       IF  (COPY(CmdWords[CmdNumber],1,CompLen) = COPY(Cmd,1,CompLen))
  64.       AND ((CmdLevels[CmdNumber] < 401) OR WizOp)
  65.       THEN CmdOkay := TRUE;
  66.     UNTIL CmdOkay OR (CmdNumber = NumCmds);
  67.     IF CmdOkay THEN
  68.     BEGIN
  69.       IF (LENGTH(CompWord) > CmdLen) AND (CmdParm = '')
  70.       THEN XLn( COPY( CompWord, CmdLen+1, LENGTH(CompWord) ) )
  71.       ELSE XLF;
  72.     END
  73.     ELSE
  74.     BEGIN
  75.       XLF; XLF;
  76.       XLn('The Spirit Of The Land rumbles...'); XLF;
  77.       XLn('"THAT WORD MEANS NOTHING TO ME."');  XLF;
  78.       XLn('(Try using the HELP command)');
  79.       CmdParm := '';
  80.     END;
  81.     XLF;
  82.     {--- Test for level ---}
  83.     IF CmdOkay THEN
  84.     BEGIN
  85.       IF ((CmdLevels[CmdNumber] > Level) AND (NOT WizOp)) THEN
  86.       BEGIN
  87.         XLn('The hills tremble as TSOTL speaks:');
  88.         XLF;
  89.         XLn('"THAT IS A LEVEL '+IntToStr(CmdLevels[CmdNumber])+' SPELL.');
  90.         XLn('YOUR SORCERY LEVEL IS ONLY '+IntToStr(Level)+'."');
  91.         CmdOkay := FALSE;
  92.       END;  { Process too-high spells }
  93.     END;
  94.     {--- Subtract MP ---}
  95.     SpellCost := CmdCosts[CmdNumber];
  96.     IF CmdOkay AND (SpellCost <> 0) THEN
  97.     BEGIN
  98.       IF (NOT ((CompWord = 'CLOAK') OR (CompWord = 'ASCEND')))
  99.       AND (AscCnt > 5) THEN AscCnt := AscCnt - 2;
  100.       IF ((CompWord = 'CLOAK') OR (CompWord = 'ASCEND'))
  101.       AND (Altitude       > 29)
  102.       AND ((Altitude + 1) > Level)
  103.       THEN SetManna(MannaPoints - Altitude)
  104.       ELSE SetManna(MannaPoints - SpellCost);
  105.       IF MannaPoints < 0 THEN
  106.       BEGIN
  107.         XLn('TSOTL thinks you are a fool.');
  108.         XLF;
  109.         XLn('"YOU DIDN''T HAVE ENOUGH MANNA-POINTS TO');
  110.         XLn('DO THAT SPELL AND REMAIN CONSCIOUS."');
  111.         CmdOkay := FALSE;
  112.       END;
  113.     END;
  114.     {--- Check for goof ---}
  115.     IF CmdOkay THEN
  116.     BEGIN
  117.       CmdLevel := CmdLevels[CmdNumber];
  118.       IF (CmdLevel > 0) AND (Level < 19) THEN
  119.       BEGIN
  120.         IF RANDOM(1000) < ((20 - Level) + CmdLevel) THEN
  121.         BEGIN
  122.           XLn('The Spirit Of The Land ignores you.');
  123.           CmdOkay := FALSE;
  124.         END;
  125.       END;
  126.     END;
  127.     {------- Execute the command -------}
  128.     IF CmdOkay THEN
  129.     BEGIN
  130.       CharDuringO := FALSE;
  131.       CASE CmdNumber OF
  132.         01 : BEGIN  { Article }
  133.                IF XFile(File_Article) = OpenError
  134.                THEN XLn('No article available');
  135.              END;
  136.         02 : BEGIN  { Ascend }
  137.                IF Level < (Altitude + 1)
  138.                THEN Ascend
  139.                ELSE
  140.                BEGIN  { Cheap ascent if already qualified }
  141.                  SetAltitude(Altitude + 1);
  142.                  SetManna(MannaPoints + SpellCost - 1);
  143.                END;
  144.              END;
  145.         03 : Banish('B');   { Banish }
  146.         04 : WriteBoard('P');  { Beseech }
  147.         05 : Bestow;
  148.         06 : Boost;
  149.         07 : Logoff := TRUE;  { Bye }
  150.         08 : Change;
  151.         09 : BEGIN  { Charge }
  152.                Charging := TRUE;
  153.                Ascend;
  154.              END;
  155.         10 : Check;
  156.         11 : BEGIN  { Cloak }
  157.                XLn('The protective mists rise about you...');
  158.                XLF;
  159.                Charging := TRUE;
  160.                Cloaked := TRUE;
  161.                Ascend;
  162.              END;
  163.         12 : BEGIN { Close }
  164.                SysLog('L','"No Visitors" sign put up');
  165.                Logoff := TRUE;
  166.                ShutDown := TRUE;
  167.              END;
  168.         13 : Contact('N');  { I.E. Normal, not Interruption }
  169.         14 : Correct;
  170.         15 : BEGIN  { Defocus }
  171.                FocusString := '';
  172.                XLn('Defocussed.');
  173.              END;
  174.         16 : Demote;
  175.         17 : SetAltitude(Altitude - 1);  { Descend }
  176.         18 : Detect;
  177.         19 : BEGIN  { Detune }
  178.                TuneString := '';
  179.                XLn('Detuned.');
  180.              END;
  181.         20 : Drain('D');
  182.         21 : Seismo('F'); { Feed }
  183.         22 : Focus;
  184.         23 : Help;
  185.         24 : BEGIN  { Hints }
  186.                Explained := FALSE;
  187.                IF XFile(File_Hints) = OpenError
  188.                THEN XLn('No hints available.');
  189.              END;
  190.         25 : Hurl;
  191.         26 : BEGIN  { Info }
  192.                Explained := FALSE;
  193.                IF XFile(File_Info) = OpenError
  194.                THEN XLn('No information available.');
  195.              END;
  196.         27 : Inquire;
  197.         28 : WriteBoard('S');  { Inscribe }
  198.         29 : IF NOT ReadBoard('P') THEN XLn('No new beseeching!');  { Listen }
  199.         30 : Manna;
  200.         31 : BEGIN  { Nature }
  201.                IF XFile(File_Nature) = OpenError
  202.                THEN XLn('No information available');
  203.              END;
  204.         32 : BEGIN
  205.                NonReadInfo := TRUE;
  206.                ShowSysLog('IL');  { Observe }
  207.              END;
  208.         33 : OmniView;
  209.         34 : Probe;
  210.         35 : WriteBoard('G');  { Proclaim }
  211.         36 : Promote;
  212.         37 : IF NOT ReadBoard(XlateBand(Altitude))  { Read }
  213.              THEN
  214.              BEGIN
  215.                XLn('Nothing new to read from the');
  216.                XLn(PresentBoard+'.');
  217.              END;
  218.         38 : ShowSysLog('L');  { Recall }
  219.         39 : Banish('R');   { Reduce }
  220.         40 : Review;  { Review }
  221.         41 : Roster;
  222.         42 : BEGIN  { Rules }
  223.                Explained := FALSE;
  224.                IF XFile(File_Rules) = OpenError
  225.                THEN XLn('Rules not available.');
  226.              END;
  227.         43 : Sanctify;
  228.         44 : BEGIN  { Scan }
  229.                IF LENGTH(FocusString) > 0
  230.                THEN XLn('Focused on ... "'+FocusString+'"');
  231.                IF LENGTH(TuneString) > 0
  232.                THEN XLn('Tuned to ..... "'+TuneString+'"');
  233.                IF NOT ReadBoard('*') THEN BEGIN END;
  234.              END;
  235.         45 : IF NOT ReadBoard('S') THEN XLn('Nothing new in the scrolls.');
  236.         46 : WriteBoard(XlateBand(Altitude));  { Send }
  237.         47 : SlowTime;
  238.         48 : Specs;
  239.         49 : Spells;
  240.         50 : Seismo('S'); { Starve }
  241.         51 : Drain('S');  { Steal }
  242.         52 : StopTime;
  243.         53 : IF XFile(File_Straight) = OpenError  { Straight }
  244.              THEN XLn('Not available');
  245.         54 : Suggest;
  246.         55 : Teleport;
  247.         56 : TimeWarp;
  248.         57 : Tune;
  249.       END;  { CASE }
  250.     END; { Execute }
  251.   END;
  252.   {------- Clean-Up -------}
  253.   CharDuringO := FALSE;
  254.   SpellRepeat := 1;
  255. END;
  256.  
  257. PROCEDURE CheckPatience;
  258. BEGIN
  259.   IF ElapsedTime(StartDate, StartMint, Date, Mint) > Patience
  260.   THEN
  261.   BEGIN
  262.     XLF; XLn('With a thunderclap, TSOTL declares,'); XLF;
  263.     XLn('"I TIRE OF YOUR PRESENCE, MORTAL!"');
  264.     Logoff := TRUE;
  265.   END;
  266.   IF MannaPoints <= 0 THEN
  267.   BEGIN
  268.     XLF;  XLn('With a crash of thunder, TSOTL shouts,');  XLF;
  269.     XLn('"YOU HAVE NO MORE MANNA, MORTAL!"'); XLF;
  270.     XLn('You slide downhill as you');
  271.     XLn('lose consciousness...');
  272.     XLn(LF+'Try again, tomorrow.');
  273.     Logoff := TRUE;
  274.   END;
  275. END;
  276.