home *** CD-ROM | disk | FTP | other *** search
/ ftp.barnyard.co.uk / 2015.02.ftp.barnyard.co.uk.tar / ftp.barnyard.co.uk / cpm / walnut-creek-CDROM / MBUG / MBUG133.ARC / VILLAGE2.ARC / VILLAGER.INC next >
Text File  |  1988-08-07  |  19KB  |  532 lines

  1. { Include file for Villager.Pas - Multi-User game }
  2.  
  3. procedure setpaper(title: strng); { Writes a title to beginning of paper }
  4. var
  5.   inp: strng;
  6.  
  7.   begin
  8.     {$I-} reset(newspaper); {$I+}
  9.     if ioresult<>0 then rewrite(newspaper);
  10.     while not eof(newspaper) do read(newspaper,inp);
  11.     write(newspaper,title);
  12.     close(newspaper);
  13.   end;
  14.  
  15. function getinput: strng; { Gets input and converts to upper case }
  16. var
  17.   i, j: integer;
  18.   inp: strng;
  19.  
  20.   begin
  21.     readln(inp);
  22.     if inp<>'' then begin
  23.       for i:=1 to length(inp) do inp[i]:=upcase(inp[i]);
  24.     end;
  25.     getinput:= inp;
  26.   end;
  27.  
  28. procedure showgrid(x, y: integer); { Displays info }
  29. var
  30.   i: integer;
  31.  
  32.   begin
  33.     if inp='' then writeln;
  34.     if (not player.expert) and (inp='') then begin
  35.       writeln('Villager.');
  36.       if player.foodrtrn>foodneeded-1 then
  37.         writeln('You have completed the game!!');
  38.       writeln('You have ',player.foodheld,' amounts of food,');
  39.       writeln(' (',player.foodrtrn,' back at the tribe)');
  40.       writeln(' and ',player.gold,' gold.'); writeln;
  41.       write('You are at position (',x,',',y,') with ',player.scouts,' scouts');
  42.       if (x=xvill) and (y=yvill) then write(' - at your tribe');
  43.       writeln('. ',movelimit+1-turns,' moves left.');
  44.     end else if player.expert and (inp='') then begin
  45.       if player.foodrtrn>foodneeded-1 then writeln('Game completed.');
  46.       writeln('Food.. Held: ',player.foodheld,' and Left: '
  47.         ,player.foodrtrn);
  48.       writeln('Gold: ',player.gold,'. Position: (',x,',',y,') Moves: ',
  49.         movelimit+1-turns);
  50.       writeln('You have ',player.scouts,' scouts.');
  51.     end;
  52.     writeln('You can see:');
  53.     occupied:= false;
  54.     if grid[x,y]<>0 then begin
  55.       occupied:= true;
  56.       reset(otherfile);
  57.       for i:=1 to 5 do begin;
  58.         read(otherfile,other);
  59.         if (other.xpos=x) and (other.ypos=y) then writeln(other.name);
  60.       end;
  61.       close(otherfile);
  62.       reset(personfile);
  63.       i:=0;
  64.       while not eof(personfile) do begin
  65.         read(personfile,person);
  66.         if (person.xpos=x) and (person.ypos=y) and (person.name<>player.name)
  67.           and (not person.dead) then writeln(person.name);
  68.       end;
  69.       close(personfile);
  70.     end;
  71.     writeln('Yourself');
  72.     if (lucky[1]=x) and (lucky[2]=y) then begin
  73.       writeln('.. and some Gold!');
  74.       lucky[1]:=0; lucky[2]:=0; player.gold:=player.gold+1;
  75.     end;
  76.     writeln;
  77.     if inp='' then begin
  78.       write('Enter command: N, S, E, W, ');
  79.       if occupied then write('A, T, ');
  80.       if (x=xvill) and (y=yvill) then write('L, B, ');
  81.       write('U, P, X, D, Help, Q: ');
  82.     end;
  83.   end;
  84.  
  85. function ten(i: integer):integer; { Makes power of ten }
  86. var
  87.   j, k: integer;
  88.  
  89.   begin
  90.     j:=1;
  91.     if i<>1 then for k:=1 to i-1 do j:=j*10;
  92.     ten:=j;
  93.   end;
  94.  
  95. function strint(line: strng):integer; { Converts STRing to INTeger }
  96. var
  97.   i, j: integer;
  98.  
  99.   begin
  100.     j:=0;
  101.     if line<>'' then begin
  102.       for i:=1 to length(line) do begin
  103.         j:=j+(ord(line[i])-48)*ten(length(line)-i+1);
  104.       end;
  105.     end;
  106.     strint:=j;
  107.   end;
  108.  
  109. procedure action(opt: integer); { Decides whether to attack or trade }
  110. var
  111.   i: integer;
  112.   who: strng;
  113.  
  114.   procedure fight(num, datafile: integer); { Fight someone }
  115.   var
  116.     i, j, str1, str2: integer;
  117.     afile: file of people;
  118.     bfile: file of others;
  119.     a: people;
  120.     b: others;
  121.  
  122.     begin
  123.       str1:=10+player.scouts; str2:=10; j:=1;
  124.       assign(afile,'VILL3.DAT'); assign(bfile,'VILL3.DAT');
  125.       if datafile=2 then begin
  126.         other.gold:=person.gold; other.foodheld:=person.foodheld;
  127.         other.friendly:= false; str2:=str2+person.scouts; end;
  128.       if other.friendly then begin
  129.         writeln('He is astonished at your barbarianism, and you sock him hard.');
  130.         str2:=str2-random(2)-2;
  131.       end;
  132.       if (player.foodheld+player.gold) > (other.foodheld+other.gold)
  133.          then i:=1 else i:=0;
  134.       repeat
  135.         if i=0 then begin
  136.           case random(10)+1 of
  137.             1: writeln('You hurl a rock!');
  138.             2: writeln('He is bleeding.');
  139.             3: writeln('The fool yowls in pain.');
  140.             4: writeln('Another hit!');
  141.             5: writeln('You could be winning...');
  142.             6: writeln('A good blow!');
  143.             7: writeln('You hit him hard!');
  144.             8: writeln('You are gaining ground.');
  145.             9: writeln('You are amazing!');
  146.            10: writeln('A great hit!');
  147.           end;
  148.           str2:=str2-random(3)-1;
  149.         end else begin
  150.           case random(10)+1 of
  151.             1: writeln('You are almost gone!');
  152.             2: writeln('He has almost bettered you!');
  153.             3: writeln('Oh no!');
  154.             4: writeln('You are injured...');
  155.             5: writeln('I think you are losing.');
  156.             6: writeln('You are hit when not looking.');
  157.             7: writeln('You are losing ground.');
  158.             8: writeln('Argh!');
  159.             9: writeln('I hope you beat him.');
  160.            10: writeln('He has got in a good blow!');
  161.           end;
  162.           str1:=str1-random(3)-1;
  163.         end;
  164.         if j=1 then begin i:=i-1; j:=2 end else begin i:=random(2); j:=1 end;
  165.         delay(1400);
  166.       until (str1<1) or (str2<1);
  167.       if str2<1 then begin
  168.         writeln('You''ve won the fight!');
  169.         setpaper(player.name+' fought '+other.name+' and won!');
  170.         player.bonus:=player.bonus+fightbonus;
  171.         grid[player.xpos,player.ypos]:= grid[player.xpos,player.ypos]-1;
  172.         if datafile=1 then begin
  173.           player.gold:=player.gold+other.gold;
  174.           player.foodheld:=player.foodheld+other.foodheld;
  175.           case num of
  176.             1: begin other.gold:=0; other.foodheld:=1 end;
  177.             2: begin other.gold:=0; other.foodheld:=1 end;
  178.             3: begin other.gold:=1; other.foodheld:=0 end;
  179.             4: begin other.gold:=1; other.foodheld:=1 end;
  180.             5: begin other.gold:=0; other.foodheld:=0 end;
  181.           end;
  182.           other.xpos:=random(xmax)+1; other.ypos:=random(ymax)+1;
  183.           grid[other.xpos,other.ypos]:=grid[other.xpos,other.ypos]+1;
  184.           reset(otherfile); rewrite(bfile);
  185.           for i:=1 to 5 do begin
  186.             read(otherfile,b);
  187.             if b.name=other.name then write(bfile,other) else write(bfile,b);
  188.           end;
  189.           reset(bfile); rewrite(otherfile);
  190.           while not eof(bfile) do begin
  191.             read(bfile,b); write(otherfile,b);
  192.           end;
  193.           close(bfile); erase(bfile);
  194.         end else begin
  195.           player.gold:=player.gold+person.gold;
  196.           player.foodheld:=player.foodheld+person.foodheld;
  197.           person.gold:=0; person.foodheld:=0;
  198.           reset(personfile); rewrite(afile);
  199.           while not eof(personfile) do begin
  200.             read(personfile,a);
  201.             if a.name=person.name then write(afile,person) else write(afile,a);
  202.           end;
  203.           reset(afile); rewrite(personfile);
  204.           while not eof(afile) do begin
  205.             read(afile,a); write(personfile,a);
  206.           end;
  207.           close(afile); erase(afile);
  208.         end;
  209.         end else begin
  210.           writeln('You''re unconsious!');
  211.           setpaper(player.name+' fought '+other.name+' and lost!');
  212.           if player.scouts>0 then begin
  213.             player.scouts:=player.scouts-1;
  214.             writeln('One of your scouts got killed!');
  215.           end;
  216.           player.dead:=true;
  217.           if datafile=1 then begin
  218.             other.gold:=other.gold+player.gold;
  219.             other.foodheld:=other.foodheld+player.foodheld;
  220.             player.gold:=0; player.foodheld:=0;
  221.             reset(otherfile); rewrite(bfile);
  222.             for i:=1 to 5 do begin
  223.               read(otherfile,b);
  224.               if b.name=other.name then write(bfile,other) else write(bfile,b);
  225.             end;
  226.             reset(bfile); rewrite(otherfile);
  227.             while not eof(bfile) do begin
  228.               read(bfile,b); write(otherfile,b);
  229.             end;
  230.             close(bfile); erase(bfile);
  231.           end else begin
  232.             person.gold:=person.gold+player.gold;
  233.             person.foodheld:=person.foodheld+player.foodheld;
  234.             player.gold:=0; player.foodheld:=0;
  235.             person.bonus:=person.bonus+fightbonus;
  236.             reset(personfile); rewrite(afile);
  237.             while not eof(personfile) do begin
  238.               read(personfile,a);
  239.               if a.name=person.name then write(afile,person) else write(afile,a);
  240.             end;
  241.             reset(afile); rewrite(personfile);
  242.             while not eof(afile) do begin
  243.               read(afile,a); write(personfile,a);
  244.             end;
  245.             close(afile); erase(afile);
  246.           end;
  247.         end;
  248.     end;
  249.  
  250.   procedure trade(num, datafile: integer); { Trade with someone }
  251.   var
  252.     i, j: integer;
  253.     afile: file of others;
  254.     a: others;
  255.  
  256.     begin
  257.       if datafile=2 then writeln('That person doesn''t want to trade with you.')
  258.         else begin
  259.           assign(afile,'VILL3.DAT');
  260.           if not other.friendly
  261.             then writeln('That person doesn''t want to trade with you.')
  262.             else begin
  263.               writeln('Trade what?');
  264.               writeln('1.. Food for Gold');
  265.               writeln('2.. Gold for Food');
  266.               writeln;
  267.               repeat
  268.                 write('Enter 1 or 2: ');
  269.                 i:=strint(getinput);
  270.               until (i=1) or (i=2);
  271.               if i=1 then begin
  272.                 writeln('You have ',player.foodheld,' amounts of food.');
  273.                 writeln('He has ',other.gold,' gold.'); writeln;
  274.                 repeat
  275.                   write('How much food will you trade? ');
  276.                   j:=strint(getinput);
  277.                 until (j>=0) and (j<=player.foodheld);
  278.                 player.foodheld:=player.foodheld-j;
  279.                 other.foodheld:=other.foodheld+j;
  280.                 if j>other.gold then begin
  281.                   writeln('He is VERY grateful!');
  282.                   player.gold:=player.gold+other.gold;
  283.                   other.gold:=0;
  284.                 end
  285.                 else begin
  286.                   player.gold:=player.gold+j;
  287.                   other.gold:=other.gold-j;
  288.                 end;
  289.               end
  290.               else begin
  291.                 writeln('You have ',player.gold,' amounts of gold.');
  292.                 writeln('He has ',other.foodheld,' food.'); writeln;
  293.                 repeat
  294.                   write('How much gold will you trade? ');
  295.                   j:=strint(getinput);
  296.                 until (j>=0) and (j<=player.gold);
  297.                 player.gold:=player.gold-j;
  298.                 other.gold:=other.gold+j;
  299.                 if j>other.foodheld then begin
  300.                   writeln('He is VERY happy!');
  301.                   player.foodheld:=player.foodheld+other.foodheld;
  302.                   other.foodheld:=0;
  303.                 end
  304.                 else begin
  305.                   player.foodheld:=player.foodheld+j;
  306.                   other.foodheld:=other.foodheld-j;
  307.                 end;
  308.               end;
  309.               if j<>0 then begin
  310.                 reset(otherfile); rewrite(afile);
  311.                 for i:=1 to 5 do begin
  312.                   read(otherfile,a);
  313.                   if a.name=other.name then write(afile,other) else write(afile,a);
  314.                 end;
  315.                 reset(afile); rewrite(otherfile);
  316.                 while not eof(afile) do begin
  317.                   read(afile,a); write(otherfile,a);
  318.                 end;
  319.                 close(afile); erase(afile);
  320.               end;
  321.             end;
  322.         end;
  323.     end;
  324.  
  325.   begin
  326.     if occupied=false then writeln('There''s no-one here!')
  327.       else begin
  328.         who:=''; i:=0;
  329.         reset(otherfile);
  330.         while (who<>'Y') and not eof(otherfile) do begin
  331.           i:=i+1;
  332.           read(otherfile,other);
  333.           if inp<>'Y' then begin
  334.             if (other.xpos=player.xpos) and (other.ypos=player.ypos) then begin
  335.               writeln(other.name);
  336.               if opt=1 then write('Attack [y,N] ? ')
  337.                 else write('Trade with [y,N] ? ');
  338.               who:=getinput;
  339.               if who='Y' then begin
  340.                 if opt=1 then fight(i,1) else trade(i,1);
  341.               end;
  342.             end;
  343.           end;
  344.         end;
  345.         close(otherfile); i:=0;
  346.         reset(personfile);
  347.         while (who<>'Y') and not eof(personfile) do begin
  348.           i:=i+1;
  349.           read(personfile,person);
  350.           if inp<>'Y' then begin
  351.             if (person.xpos=player.xpos) and (person.ypos=player.ypos)
  352.               and (person.name<>player.name) and (not person.dead) then begin
  353.                 writeln(person.name);
  354.                 if opt=1 then write('Attack [y,N] ? ')
  355.                   else write('Trade with [y,N] ? ');
  356.                 who:=getinput;
  357.                 if who='Y' then begin
  358.                   if opt=1 then fight(i,2) else trade(i,2);
  359.                 end;
  360.               end;
  361.           end;
  362.         end;
  363.         close(personfile);
  364.       end;
  365.   end;
  366.  
  367. procedure points; { Creates score-board }
  368. var
  369.   inp: strng;
  370.   score, i, j, k, l: integer;
  371.   tops: array[1..5] of strng;
  372.   topi: array[1..5] of integer;
  373.  
  374.   begin
  375.     writeln('Display points.');
  376.     write('Enter name, return for all, or * for top five: ');
  377.     inp:=getinput;
  378.     for k:=1 to 5 do begin tops[k]:=''; topi[k]:=0 end;
  379.     reset(personfile);
  380.     writeln; i:=0;
  381.     writeln('Name                         Score');
  382.     while not eof(personfile) do begin
  383.       read(personfile,person);
  384.       if (person.name = inp) or (inp = '') or (inp = '*') then begin
  385.         if person.name=player.name then person:=player;
  386.         score:= person.scouts*25 + person.gold*50
  387.           + person.foodheld*100 + person.foodrtrn*200 + person.bonus;
  388.         j:=34 - length(person.name);
  389.         if inp<>'*' then writeln(person.name,score:j)
  390.         else
  391.           if topi[1]<score then begin
  392.             for l:=5 downto 2 do begin
  393.               topi[l]:=topi[l-1]; tops[l]:=tops[l-1];
  394.             end;
  395.             tops[1]:=person.name; topi[1]:=score;
  396.           end else if topi[2]<score then begin
  397.             for l:=5 downto 3 do begin
  398.               topi[l]:=topi[l-1]; tops[l]:=tops[l-1];
  399.             end;
  400.             tops[2]:=person.name; topi[2]:=score;
  401.           end else if topi[3]<score then begin
  402.             for l:=5 downto 4 do begin
  403.               topi[l]:=topi[l-1]; tops[l]:=tops[l-1];
  404.             end;
  405.             tops[3]:=person.name; topi[3]:=score;
  406.           end else if topi[4]<score then begin
  407.             topi[5]:=topi[4]; tops[5]:=tops[4];
  408.             tops[4]:=person.name; topi[4]:=score;
  409.           end else if topi[5]<score then begin
  410.             tops[5]:=person.name; topi[5]:=score;
  411.           end;
  412.         i:=i+1;
  413.       end;
  414.     end;
  415.     if inp='*' then
  416.       for j:=1 to 5 do
  417.         if tops[j]<>'' then begin
  418.           k:=34 - length(tops[j]);
  419.           writeln(tops[j],topi[j]:k);
  420.         end;
  421.     close(personfile);
  422.     if i = 0 then writeln('Person not found.');
  423.     writeln;
  424.     write('Press <RETURN> to continue... ');
  425.     inp:=getinput; writeln;
  426.   end;
  427.  
  428. procedure getscout; { Adds scout to player's inventory }
  429. var
  430.   i: integer;
  431.  
  432.   begin
  433.     writeln('The tribe is currently charging ',price,' gold for the rent of a');
  434.     writeln('scout. You have ',player.gold,' gold.'); writeln;
  435.     repeat
  436.       write('How many will you borrow? ');
  437.       i:=strint(getinput);
  438.     until (i>=0) and (i<=(player.gold div price));
  439.     player.gold:=player.gold - i*price;
  440.     player.scouts:=player.scouts + i;
  441.     if i>0 then writeln('You now have ',player.scouts,' scouts.');
  442.   end;
  443.  
  444. procedure usescout; { Procedure to control the scout }
  445. var
  446.   inp: strng;
  447.   encounter, x, y, i: integer;
  448.  
  449.   begin
  450.     if player.scouts>0 then begin
  451.       if not player.expert then begin
  452.         writeln('You can send a scout out in either of the two directions:');
  453.         writeln('[N]orth/South, or [E]ast/West. He will then return, and');
  454.         writeln('report to you what he found in that direction before returning');
  455.         writeln('to the village.');
  456.       end else writeln('You can send a scout [N]orth/South, or [E]ast/West.');
  457.       writeln('Use [Q] to quit.');
  458.       repeat
  459.         write('Which diection [n,e,Q] ? ');
  460.         inp:=getinput;
  461.       until (inp='N') or (inp='E') or (inp='Q') or (inp='');
  462.       x:=0; y:=0; player.scouts:=player.scouts-1; encounter:=0;
  463.       case inp[1] of
  464.         'N': for i:=1 to ymax do begin
  465.                player.ypos:=player.ypos+1;
  466.                if player.ypos>ymax then player.ypos:=1;
  467.                encounter:=encounter+grid[player.xpos,player.ypos];
  468.              end;
  469.         'E': for i:=1 to xmax do begin
  470.                player.xpos:=player.xpos+1;
  471.                if player.xpos>xmax then player.xpos:=1;
  472.                encounter:=encounter+grid[player.xpos,player.ypos];
  473.              end;
  474.         else player.scouts:=player.scouts+1;
  475.       end;
  476.       if (inp<>'Q') and (inp<>'') then
  477.         writeln('The scout reports that he encountered ',encounter,' people.');
  478.     end else writeln('You don''t have any scouts.');
  479.   end;
  480.  
  481. procedure drums; { Communications procedure }
  482. var
  483.   inp: strng;
  484.   message: array[1..10] of strng;
  485.   i, j: integer;
  486.  
  487.   begin
  488.     writeln('You can [L]isten to the drums, or [H]it them to communicate.');
  489.     writeln('Enter [Q] to Quit..');
  490.     repeat
  491.       write('What is your choice [l,h,Q] ? ');
  492.       inp:=getinput;
  493.     until (inp='L') or (inp='H') or (inp='Q') or (inp='');
  494.     if inp='L' then begin
  495.       reset(newspaper);
  496.       i:=1;
  497.       while not eof(newspaper) do begin
  498.         if i=23 then begin
  499.           writeln('--- Press ENTER for More ---');
  500.           message[1]:=getinput;
  501.           i:=1;
  502.         end;
  503.         read(newspaper,message[1]);
  504.         writeln(message[1]);
  505.         i:=i+1;
  506.       end;
  507.       close(newspaper);
  508.     end else if inp='H' then begin
  509.       writeln;
  510.       writeln('You can enter up to 10 lines, 75 characters per line.');
  511.       writeln('[-------------------------------------------------------------------------]');
  512.       for i:=1 to 10 do message[i]:='';
  513.       i:=1;
  514.       repeat
  515.         readln(message[i]);
  516.         if length(message[i])>75 then writeln('Line too long.') else begin
  517.           if message[i]<>'' then writeln('Press ENTER to finish..');
  518.           i:=i+1;
  519.         end;
  520.       until (message[i-1]='') or (i=11);
  521.       j:=0;
  522.       repeat
  523.         j:=j+1;
  524.       until (message[j]='') or (j=10);
  525.       if message[1]<>''then begin
  526.         for i:=1 to j do setpaper('*** '+message[i]);
  527.         setpaper('*** Message by: '+player.name);
  528.       end;
  529.       writeln('Message hit on drums..');
  530.     end;
  531.   end;
  532.