home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 October / usenetsourcesnewsgroupsinfomagicoctober1994disk2.iso / games / volume5 / monster / part03 / mon2.pas next >
Pascal/Delphi Source File  |  1988-11-30  |  55KB  |  2,336 lines

  1.  
  2. { substitute a parameter string for the # sign in the source string }
  3. function subs_parm(s,parm: string): string;
  4. var
  5.     right,left: string;
  6.     i: integer;        { i is point to break at }
  7.  
  8. begin
  9.     i := index(s,'#');
  10.     if (i > 0) and ((length(s) + length(parm)) <= 80) then begin
  11.         if i >= length(s) then begin
  12.             right := '';
  13.             left := s;
  14.         end else if i < 1 then begin
  15.             right := s;
  16.             left := '';
  17.         end else begin
  18.             right := substr(s,i+1,length(s)-i);
  19.             left := substr(s,1,i);
  20.         end;
  21.         if length(left) <= 1 then
  22.             left := ''
  23.         else
  24.             left := substr(left,1,length(left)-1);
  25.  
  26.         subs_parm := left + parm + right;
  27.     end else begin
  28.         subs_parm := s;
  29.     end;
  30. end;
  31.  
  32.  
  33. procedure time_health;
  34.  
  35. begin
  36.     if healthcycle > 0 then begin        { how quickly they heal }
  37.         if myhealth < 7 then begin    { heal a little bit }
  38.             myhealth := myhealth + 1;
  39.  
  40.             getroom;
  41.             here.people[myslot].health := myhealth;
  42.             putroom;
  43.  
  44.             {show new health rating }
  45.         case myhealth of
  46.             9: writeln('You are now in exceptional health.');
  47.             8: writeln('You feel much stronger.  You are in better than average condition.');
  48.             7: writeln('You are now in perfect health.');
  49.             6: writeln('You only feel a little bit dazed now.');
  50.             5: begin
  51.                 writeln('You only have some minor cuts and abrasions now.  Most of your serious wounds');
  52.                 writeln('have healed.');
  53.                end;
  54.             4: writeln('You are only suffering from some minor wounds now.');
  55.             3: writeln('Your most serious wounds have healed, but you are still in bad shape.');
  56.             2: writeln('You have healed somewhat, but are still very badly wounded.');
  57.             1: writeln('You are in critical condition, but there may be hope.');
  58.             0: writeln('are still dead.');
  59.             otherwise writeln('You don''t seem to be in any condition at all.');
  60.         end;
  61.  
  62.         putchars(chr(10)+old_prompt+line);
  63.  
  64.         end;
  65.         healthcycle := 0;
  66.     end else
  67.         healthcycle := healthcycle + 1;
  68. end;
  69.  
  70.  
  71. procedure time_noises;
  72. var
  73.     n: integer;
  74.  
  75. begin
  76.     if rnd100 <= 2 then begin
  77.         n := rnd100;
  78.         if n in [0..40] then
  79.             log_event(0,E_NOISES,rnd100,0)
  80.         else if n in [41..60] then
  81.             log_event(0,E_ALTNOISE,rnd100,0);
  82.     end;
  83. end;
  84.  
  85.  
  86. procedure time_trapdoor(silent: boolean);
  87. var
  88.     fall: boolean;
  89.  
  90. begin
  91.     if rnd100 < here.trapchance then begin
  92.             { trapdoor fires! }
  93.  
  94.         if here.trapto > 0 then begin
  95.                 { logged action should cover {protected) }
  96.             if {(protected) or} (logged_act) then
  97.                 fall := false
  98.             else if here.magicobj = 0 then
  99.                 fall := true
  100.             else if obj_hold(here.magicobj) then
  101.                 fall := false
  102.             else
  103.                 fall := true;
  104.         end else
  105.             fall := false;
  106.  
  107.         if fall then begin
  108.             do_exit(here.trapto);
  109.             if not(silent) then
  110.                 putchars(chr(10)+old_prompt+line);
  111.         end;
  112.     end;
  113. end;
  114.  
  115.  
  116. procedure time_midnight;
  117.  
  118. begin
  119.     if systime = '12:00am' then
  120.         log_event(0,E_MIDNIGHT,rnd100,0);
  121. end;
  122.  
  123.  
  124. { cause random events to occurr (ha ha ha) }
  125.  
  126. procedure rnd_event(silent: boolean := false);
  127. var
  128.     n: integer;
  129.  
  130. begin
  131.     if rndcycle = 200 then begin    { inside here 3 times/min }
  132.  
  133.         time_noises;
  134.         time_health;
  135.         time_trapdoor(silent);
  136.         time_midnight;
  137.  
  138.         rndcycle := 0;
  139.     end else
  140.         rndcycle := rndcycle + 1;
  141. end;
  142.  
  143.  
  144. procedure do_die;
  145. var
  146.     some: boolean;
  147.  
  148. begin
  149.     writeln;
  150.     writeln('        *** You have died ***');
  151.     writeln;
  152.     some := drop_everything;
  153.     myhealth := 7;
  154.     take_token(myslot,location);
  155.     log_event(0,E_DIED,0,0,myname);
  156.     if put_token(2,myslot) then begin
  157.         location := 2;
  158.         inmem := false;
  159.         setevent;
  160. { log entry to death loc }
  161. { perhaps turn off refs to other people }
  162.     end else begin
  163.         writeln('The Monster universe regrets to inform you that you cannot be ressurected at');
  164.         writeln('the moment.');
  165.         halt;
  166.     end;
  167. end;
  168.  
  169.  
  170. procedure poor_health(p: integer);
  171. var
  172.     some: boolean;
  173.  
  174. begin
  175.     if myhealth > p then begin
  176.         myhealth := myhealth - 1;
  177.         getroom;
  178.         here.people[myslot].health := myhealth;
  179.         putroom;
  180.         log_event(myslot,E_WEAKER,myhealth,0);
  181.  
  182.         { show new health rating }
  183.         write('You ');
  184.         case here.people[myslot].health of
  185.             9: writeln('are still in exceptional health.');
  186.             8: writeln('feel weaker, but are in better than average condition.');
  187.             7: writeln('are somewhat weaker, but are in perfect health.');
  188.             6: writeln('feel a little bit dazed.');
  189.             5: writeln('have some minor cuts and abrasions.');
  190.             4: writeln('have some wounds, but are still fairly strong.');
  191.             3: writeln('are suffering from some serious wounds.'); 
  192.             2: writeln('are very badly wounded.');
  193.             1: writeln('have many serious wounds, and are near death.');
  194.             0: writeln('are dead.');
  195.             otherwise writeln('don''t seem to be in any condition at all.');
  196.         end;
  197.     end else begin { they died }
  198.         do_die;
  199.     end;
  200. end;
  201.  
  202.  
  203.  
  204. { count objects here }
  205.  
  206. function find_numobjs: integer;
  207. var
  208.     sum,i: integer;
  209.  
  210. begin
  211.     sum := 0;
  212.     for i := 1 to maxobjs do
  213.         if here.objs[i] <> 0 then
  214.             sum := sum + 1;
  215.     find_numobjs := sum;
  216. end;
  217.  
  218.  
  219.  
  220. { optional parameter is slot of player's objects to count }
  221.  
  222. function find_numhold(player: integer := 0): integer;
  223. var
  224.     sum,i: integer;
  225.  
  226. begin
  227.     if player = 0 then
  228.         player := myslot;
  229.  
  230.     sum := 0;
  231.     for i := 1 to maxhold do
  232.         if here.people[player].holding[i] <> 0 then
  233.             sum := sum + 1;
  234.     find_numhold := sum;
  235. end;
  236.  
  237.  
  238.  
  239.  
  240. procedure take_hit(p: integer);
  241. var
  242.     i: integer;
  243.  
  244. begin
  245.     if p > 0 then begin
  246.         if rnd100 < (55 + (p-1) * 30) then { chance that they're hit }
  247.             poor_health(p);
  248.  
  249.         if find_numobjs < maxobjs + 1 then begin
  250.             { maybe they drop something if they're hit }
  251.             for i := 1 to p do
  252.                 maybe_drop;
  253.         end;
  254.     end;
  255. end;
  256.  
  257.  
  258. function punch_force(sock: integer): integer;
  259. var
  260.     p: integer;
  261.  
  262. begin
  263.     if sock in [2,3,6,7,8,11,12] then    { no punch or a graze }
  264.         p := 0
  265.     else if sock in [4,9,10] then    { hard punches }
  266.         p := 2
  267.     else    { 1,5,13,14,15 }
  268.         p := 1;        { all others are medium punches }
  269.     punch_force := p;
  270. end;
  271.  
  272. procedure put_punch(sock: integer;s: string);
  273.  
  274. begin
  275.     case sock of
  276.         1: writeln('You deliver a quick jab to ',s,'''s jaw.');
  277.         2: writeln('You swing at ',s,' and miss.');
  278.         3: writeln('A quick punch, but it only grazes ',s,'.');
  279.         4: writeln(s,' doubles over after your jab to the stomach.');
  280.         5: writeln('Your punch lands square on ',s,'''s face!');
  281.         6: writeln('You swing wild and miss.');
  282.         7: writeln('A good swing, but it misses ',s,' by a mile!');
  283.         8: writeln('Your punch is blocked by ',s,'.');
  284.         9: writeln('Your roundhouse blow sends ',s,' reeling.');
  285.         10:writeln('You land a solid uppercut on ',s,'''s chin.');
  286.         11:writeln(s,' fends off your blow.');
  287.         12:writeln(s,' ducks and avoids your punch.');
  288.         13:writeln('You thump ',s,' in the ribs.');
  289.         14:writeln('You catch ',s,'''s face on your elbow.');
  290.         15:writeln('You knock the wind out of ',s,' with a punch to the chest.');
  291.     end;
  292. end;
  293.  
  294.  
  295. procedure get_punch(sock: integer;s: string);
  296.  
  297. begin
  298.     case sock of
  299.         1: writeln(s,' delivers a quick jab to your jaw!');
  300.         2: writeln(s,' swings at you but misses.');
  301.         3: writeln(s,'''s fist grazes you.');
  302.         4: writeln('You double over after ',s,' lands a mean jab to your stomach!');
  303.         5: writeln('You see stars as ',s,' bashes you in the face.');
  304.         6: writeln('You only feel the breeze as ',s,' swings wildly.');
  305.         7: writeln(s,'''s swing misses you by a yard.');
  306.         8: writeln('With lightning reflexes you block ',s,'''s punch.');
  307.         9: writeln(s,'''s blow sends you reeling.');
  308.         10:writeln('Your head snaps back from ',s,'''s uppercut!');
  309.         11:writeln('You parry ',s,'''s attack.');
  310.         12:writeln('You duck in time to avoid ',s,'''s punch.');
  311.         13:writeln(s,' thumps you hard in the ribs.');
  312.         14:writeln('Your vision blurs as ',s,' elbows you in the head.');
  313.         15:writeln(s,' knocks the wind out of you with a punch to your chest.');
  314.     end;
  315. end;
  316.  
  317. procedure view_punch(a,b: string;p: integer);
  318.  
  319. begin
  320.     case p of
  321.         1: writeln(a,' jabs ',b,' in the jaw.');
  322.         2: writeln(a,' throws a wild punch at the air.');
  323.         3: writeln(a,'''s fist barely grazes ',b,'.');
  324.         4: writeln(b,' doubles over in pain with ',a,'''s punch');
  325.         5: writeln(a,' bashes ',b,' in the face.');
  326.         6: writeln(a,' takes a wild swing at ',b,' and misses.');
  327.         7: writeln(a,' swings at ',b,' and misses by a yard.');
  328.         8: writeln(b,'''s punch is blocked by ',a,'''s quick reflexes.');
  329.         9: writeln(b,' is sent reeling from a punch by ',a,'.');
  330.         10:writeln(a,' lands an uppercut on ',b,'''s head.');
  331.         11:writeln(b,' parrys ',a,'''s attack.');
  332.         12:writeln(b,' ducks to avoid ',a,'''s punch.');
  333.         13:writeln(a,' thumps ',b,' hard in the ribs.');
  334.         14:writeln(a,'''s elbow connects with ',b,'''s head.');
  335.         15:writeln(a,' knocks the wind out of ',b,'.');
  336.     end;
  337. end;
  338.  
  339.  
  340.  
  341.  
  342. procedure desc_health(n: integer;header:shortstring := '');
  343.  
  344. begin
  345.     if header = '' then
  346.         write(here.people[n].name,' ')
  347.     else
  348.         write(header);
  349.  
  350.     case here.people[n].health of
  351.         9: writeln('is in exceptional health, and looks very strong.');
  352.         8: writeln('is in better than average condition.');
  353.         7: writeln('is in perfect health.');
  354.         6: writeln('looks a little dazed.');
  355.         5: writeln('has some minor cuts and abrasions.');
  356.         4: writeln('has some minor wounds.');
  357.         3: writeln('is suffering from some serious wounds.'); 
  358.         2: writeln('is very badly wounded.');
  359.         1: writeln('has many serious wounds, and is near death.');
  360.         0: writeln('is dead.');
  361.         otherwise writeln('doesn''t seem to be in any condition at all.');
  362.     end;
  363. end;
  364.  
  365.  
  366. function obj_part(objnum: integer;doread: boolean := TRUE): string;
  367. var
  368.     s: string;
  369.  
  370. begin
  371.     if doread then begin
  372.         getobj(objnum);
  373.         freeobj;
  374.     end;
  375.     s := obj.oname;
  376.     case obj.particle of
  377.         0:;
  378.         1: s := 'a ' + s;
  379.         2: s := 'an ' + s;
  380.         3: s := 'some ' + s;
  381.         4: s := 'the ' + s;
  382.     end;
  383.     obj_part := s;
  384. end;
  385.  
  386.  
  387. procedure print_subs(n: integer;s: string);
  388.  
  389. begin
  390.     if (n > 0) and (n <> DEFAULT_LINE) then begin
  391.         getline(n);
  392.         freeline;
  393.         writeln(subs_parm(oneliner.theline,s));
  394.     end else if n = DEFAULT_LINE then
  395.         writeln('%<default line> in print_subs');
  396. end;
  397.  
  398.  
  399.  
  400. { print out a (up to) 10 line description block, substituting string s for
  401.   up to one occurance of # per line }
  402.  
  403. procedure block_subs(n: integer;s: string);
  404. var
  405.     p,i: integer;
  406.  
  407. begin
  408.     if n < 0 then
  409.         print_subs(abs(n),s)
  410.     else if (n > 0) and (n <> DEFAULT_LINE) then begin
  411.         getblock(n);
  412.         freeblock;
  413.         i := 1;
  414.         while i <= block.desclen do begin
  415.             p := index(block.lines[i],'#');
  416.             if (p > 0) then
  417.                 writeln(subs_parm(block.lines[i],s))
  418.             else
  419.                 writeln(block.lines[i]);
  420.             i := i + 1;
  421.         end;
  422.     end;
  423. end;
  424.  
  425.  
  426. procedure show_noises(n: integer);
  427.  
  428. begin
  429.     if n < 33 then
  430.         writeln('There are strange noises coming from behind you.')
  431.     else if n < 66 then
  432.         writeln('You hear strange rustling noises behind you.')
  433.     else
  434.         writeln('There are faint noises coming from behind you.');
  435. end;
  436.  
  437.  
  438. procedure show_altnoise(n: integer);
  439.  
  440. begin
  441.     if n < 33 then
  442.         writeln('A chill wind blows, ruffling your clothes and chilling your bones.')
  443.     else if n < 66 then
  444.         writeln('Muffled scuffling sounds can be heard behind you.')
  445.     else
  446.         writeln('A loud crash can be heard in the distance.');
  447. end;
  448.  
  449.  
  450. procedure show_midnight(n: integer;var printed: boolean);
  451.  
  452. begin
  453.     if midnight_notyet then begin
  454.         if n < 50 then begin
  455.             writeln('A voice booms out of the air from all around you!');
  456.             writeln('The voice says,  " It is now midnight. "');
  457.         end else begin
  458.             writeln('You hear a clock chiming in the distance.');
  459.             writeln('It rings twelve times for midnight.');
  460.         end;
  461.         midnight_notyet := false;
  462.     end else
  463.         printed := false;
  464. end;
  465.  
  466.  
  467.  
  468.  
  469. procedure handle_event(var printed: boolean);
  470. var
  471.     n,send,act,targ,p: integer;
  472.     s: string;
  473.     sendname: string;
  474.  
  475. begin
  476.     printed := true;
  477.     if debug then
  478.         writeln('%handling event ',myevent);
  479.     with event.evnt[myevent] do begin
  480.         send := sender;
  481.         act := action;
  482.         targ := target;
  483.         p := parm;
  484.         s := msg;
  485.     end;
  486.     if send <> 0 then
  487.         sendname := here.people[send].name
  488.     else
  489.         sendname := '<Unknown>';
  490.  
  491.     case act of
  492.         E_EXIT: begin
  493.                 if here.exits[targ].goin = DEFAULT_LINE then
  494.                     writeln(s,' has gone ',direct[targ],'.')
  495.                 else if (here.exits[targ].goin <> 0) and
  496.                 (here.exits[targ].goin <> DEFAULT_LINE) then begin
  497.                     block_subs(here.exits[targ].goin,s);
  498.                 end else
  499.                     printed := false;
  500.             end;
  501.         E_ENTER: begin
  502.                 if here.exits[targ].comeout = DEFAULT_LINE then
  503.                     writeln(s,' has come into the room from: ',direct[targ])
  504.                 else if (here.exits[targ].comeout <> 0) and
  505.                 (here.exits[targ].comeout <> DEFAULT_LINE) then begin
  506.                     block_subs(here.exits[targ].comeout,s);
  507.                 end else
  508.                     printed := false;
  509.             end;
  510.         E_BEGIN:writeln(s,' appears in a brilliant burst of multicolored light.');
  511.         E_QUIT:writeln(s,' vanishes in a brilliant burst of multicolored light.');
  512.         E_SAY: begin
  513.             if length(s) + length(sendname) > 73 then begin
  514.                 writeln(sendname,' says,');
  515.                 writeln('"',s,'"');
  516.             end else begin
  517.                 if (rnd100 < 50) or (length(s) > 50) then
  518.                     writeln(sendname,': "',s,'"')
  519.                 else
  520.                     writeln(sendname,' says, "',s,'"');
  521.             end;
  522.                end;
  523.         E_HIDESAY: begin
  524.                 writeln('An unidentified voice speaks to you:');
  525.                 writeln('"',s,'"');
  526.                end;
  527.         E_SETNAM: writeln(s);
  528.         E_POOFIN: writeln('In an explosion of orange smoke ',s,' poofs into the room.');
  529.         E_POOFOUT: writeln(s,' vanishes from the room in a cloud of orange smoke.');
  530.         E_DETACH: begin
  531.                 writeln(s,' has destroyed the exit ',direct[targ],'.');
  532.               end;
  533.         E_EDITDONE:begin
  534.                 writeln(sendname,' is done editing the room description.');
  535.                end;
  536.         E_NEWEXIT: begin
  537.                 writeln(s,' has created an exit here.');
  538.                end;
  539.         E_CUSTDONE:begin
  540.                 writeln(sendname,' is done customizing an exit here.');
  541.                end;
  542.         E_SEARCH: writeln(sendname,' seems to be looking for something.');
  543.         E_FOUND: writeln(sendname,' appears to have found something.');
  544.         E_DONEDET:begin
  545.                 writeln(sendname,' is done adding details to the room.');
  546.               end;
  547.         E_ROOMDONE: begin
  548.                 writeln(sendname,' is finished customizing this room.');
  549.                 end;
  550.         E_OBJDONE: begin
  551.                 writeln(sendname,' is finished customizing an object.');
  552.                end;
  553.         E_UNHIDE:writeln(sendname,' has stepped out of the shadows.');
  554.         E_FOUNDYOU: begin
  555.                 if targ = myslot then begin { found me! }
  556.                     writeln('You''ve been discovered by ',sendname,'!');
  557.                     hiding := false;
  558.                     getroom;
  559. { they're not hidden anymore }        here.people[myslot].hiding := 0;
  560.                     putroom;
  561.                 end else
  562.                     writeln(sendname,' has found ',here.people[targ].name,' hiding in the shadows!');
  563.                 end;
  564.         E_PUNCH: begin
  565.                 if targ = myslot then begin { punched me! }
  566.                     get_punch(p,sendname);
  567.                     take_hit( punch_force(p) );
  568. { relic, but not harmful }        ping_answered := true;
  569.                     healthcycle := 0;
  570.                 end else
  571.                     view_punch(sendname,here.people[targ].name,p);
  572.              end;
  573.         E_MADEOBJ: writeln(s);
  574.         E_GET: writeln(s);
  575.         E_DROP: begin
  576.                 writeln(s);
  577.                 if here.objdesc <> 0 then
  578.                     print_subs(here.objdesc,obj_part(p));
  579.             end;
  580.         E_BOUNCEDIN: begin
  581.                 if (targ = 0) or (targ = DEFAULT_LINE) then
  582.                     writeln(obj_part(p),' has bounced into the room.')
  583.                 else begin
  584.                     print_subs(targ,obj_part(p));
  585.                 end;
  586.                  end;
  587.         E_DROPALL: writeln('Some objects drop to the ground.');
  588.         E_EXAMINE: writeln(s);
  589.         E_IHID: writeln(sendname,' has hidden in the shadows.');
  590.         E_NOISES: begin
  591.                 if (here.rndmsg = 0) or
  592.                    (here.rndmsg = DEFAULT_LINE) then begin
  593.                     show_noises(targ);
  594.                 end else
  595.                     print_line(here.rndmsg);
  596.               end;
  597.         E_ALTNOISE: begin
  598.                 if (here.xmsg2 = 0) or
  599.                    (here.xmsg2 = DEFAULT_LINE) then
  600.                     show_altnoise(targ)
  601.                 else
  602.                     block_subs(here.xmsg2,myname);
  603.                 end;
  604.         E_REALNOISE: show_noises(targ);
  605.         E_HIDOBJ: writeln(sendname,' has hidden the ',s,'.');
  606.         E_PING: begin
  607.                 if targ = myslot then begin
  608.                     writeln(sendname,' is trying to ping you.');
  609.                     log_event(myslot,E_PONG,send,0);
  610.                 end else
  611.                     writeln(sendname,' is pinging ',here.people[targ].name,'.');
  612.             end;
  613.         E_PONG: begin
  614.                 ping_answered := true;
  615.             end;
  616.         E_HIDEPUNCH: begin
  617.                 if targ = myslot then begin
  618.                     writeln(sendname,' pounces on you from the shadows!');
  619.                     take_hit(2);
  620.                 end else begin
  621.                     writeln(sendname,' jumps out of the shadows and attacks ',here.people[targ].name,'.');
  622.                 end;
  623.                  end;
  624.         E_SLIPPED: begin
  625.                 writeln('The ',s,' has slipped from ',
  626.                     sendname,'''s hands.');
  627.                end;
  628.         E_HPOOFOUT:begin
  629.                 if rnd100 > 50 then
  630.                     writeln('Great wisps of orange smoke drift out of the shadows.')
  631.                 else
  632.                     printed := false;
  633.                end;
  634.         E_HPOOFIN:begin
  635.                 if rnd100 > 50 then
  636.                     writeln('Some wisps of orange smoke drift about in the shadows.')
  637.                 else
  638.                     printed := false;
  639.               end;
  640.         E_FAILGO: begin
  641.                 if targ > 0 then begin
  642.                     write(sendname,' has failed to go ');
  643.                     writeln(direct[targ],'.');
  644.                 end;
  645.               end;
  646.         E_TRYPUNCH: begin
  647.                 if targ = myslot then
  648.                     writeln(sendname,' fails to punch you.')
  649.                 else
  650.                     writeln(sendname,' fails to punch ',here.people[targ].name,'.');
  651.                 end;
  652.         E_PINGONE:begin
  653.                 if targ = myslot then begin { ohoh---pinged away }
  654.                     writeln('The Monster program regrets to inform you that a destructive ping has');
  655.                     writeln('destroyed your existence.  Please accept our apologies.');
  656.                     halt;  { ugggg }
  657.                 end else
  658.                     writeln(s,' shimmers and vanishes from sight.');
  659.               end;
  660.         E_CLAIM: writeln(sendname,' has claimed this room.');
  661.         E_DISOWN: writeln(sendname,' has disowned this room.');
  662.         E_WEAKER: begin
  663. {                inmem := false;
  664.                 gethere;        }
  665.  
  666.                 here.people[send].health := targ;
  667.  
  668. { This is a hack for efficiency so we don't read the room record twice;
  669.   we need the current data now for desc_health, but checkevents, our caller,
  670.   is about to re-read it anyway; we make an incremental fix here so desc_health
  671.   is happy, then checkevents will do the real read later }
  672.  
  673.                 desc_health(send);
  674.               end;
  675.         E_OBJCLAIM: writeln(sendname,' is now the owner of the ',s,'.');
  676.         E_OBJDISOWN: writeln(sendname,' has disowned the object ',s,'.');
  677.         E_SELFDONE: writeln(sendname,'''s self-description is finished.');
  678.         E_WHISPER: begin
  679.                 if targ = myslot then begin
  680.                     if length(s) < 39 then
  681.                         writeln(sendname,' whispers to you, "',s,'"')
  682.                     else begin
  683.                         writeln(sendname,' whispers something to you:');
  684.                         write(sendname,' whispers, ');
  685.                         if length(s) > 50 then
  686.                             writeln;
  687.                         writeln('"',s,'"');
  688.                     end;
  689.                 end else if (privd) or (rnd100 > 85) then begin
  690.                     writeln('You overhear ',sendname,' whispering to ',here.people[targ].name,'!');
  691.                     write(sendname,' whispers, ');
  692.                     if length(s) > 50 then
  693.                         writeln;
  694.                     writeln('"',s,'"');
  695.                 end else
  696.                     writeln(sendname,' is whispering to ',here.people[targ].name,'.');
  697.                end;
  698.         E_WIELD: writeln(sendname,' is now wielding the ',s,'.');
  699.         E_UNWIELD: writeln(sendname,' is no longer wielding the ',s,'.');
  700.         E_WEAR: writeln(sendname,' is now wearing the ',s,'.');
  701.         E_UNWEAR: writeln(sendname,' has taken off the ',s,'.');
  702.         E_DONECRYSTALUSE: begin
  703.                     writeln(sendname,' emerges from the glow of the crystal.');
  704.                     writeln('The orb becomes dark.');
  705.                   end;
  706.         E_DESTROY: writeln(s);
  707.         E_OBJPUBLIC: writeln('The object ',s,' is now public.');
  708.         E_SYSDONE: writeln(sendname,' is no longer in system maintenance mode.');
  709.         E_UNMAKE: writeln(sendname,' has unmade ',s,'.');
  710.         E_LOOKDETAIL: writeln(sendname,' is looking at the ',s,'.');
  711.         E_ACCEPT: writeln(sendname,' has accepted an exit here.');
  712.         E_REFUSE: writeln(sendname,' has refused an Accept here.');
  713.         E_DIED: writeln(s,' expires and vanishes in a cloud of greasy black smoke.');
  714.         E_LOOKYOU: begin
  715.                 if targ = myslot then begin
  716.                     writeln(sendname,' is looking at you.')
  717.                 end else
  718.                     writeln(sendname,' looks at ',here.people[targ].name,'.');
  719.                end;
  720.         E_LOOKSELF: writeln(sendname,' is making a self-appraisal.');
  721.         E_FAILGET: writeln(sendname,' fails to get ',obj_part(targ),'.');
  722.         E_FAILUSE: writeln(sendname,' fails to use ',obj_part(targ),'.');
  723.         E_CHILL: if (targ = 0) or (targ = DEFAULT_LINE) then
  724.                 writeln('A chill wind blows over you.')
  725.              else
  726.                 print_desc(targ);
  727.         E_NOISE2:begin
  728.                 case targ of
  729.                     1: writeln('Strange, gutteral noises sound from everywhere.');
  730.                     2: writeln('A chill wind blows past you, almost whispering as it ruffles your clothes.');
  731.                     3: writeln('Muffled voices speak to you from the air!');
  732.                     otherwise writeln('The air vibrates with a chill shudder.');
  733.                 end;
  734.              end;
  735.         E_INVENT: writeln(sendname,' is taking inventory.');
  736.         E_POOFYOU: begin
  737.                 if targ = myslot then begin
  738.                     writeln;
  739.                     writeln(sendname,' directs a firey burst of bluish energy at you!');
  740.                     writeln('Suddenly, you find yourself hurtling downwards through misty orange clouds.');
  741.                     writeln('Your descent slows, the smoke clears, and you find yourself in a new place...');
  742.                     xpoof(p);
  743.                     writeln;
  744.                 end else begin
  745.                     writeln(sendname,' directs a firey burst of energy at ',here.people[targ].name,'!');
  746.                     writeln('A thick burst of orange smoke results, and when it clears, you see');
  747.                     writeln('that ',here.people[targ].name,' is gone.');
  748.                 end;
  749.                end;
  750.         E_WHO: begin
  751.             case p of
  752.                 0: writeln(sendname,' produces a "who" list and reads it.');
  753.                 1: writeln(sendname,' is seeing who''s playing Monster.');
  754.                 otherwise writeln(sendname,' checks the "who" list.');
  755.             end;
  756.                end;
  757.         E_PLAYERS:begin
  758.                 writeln(sendname,' checks the "players" list.');
  759.               end;
  760.         E_VIEWSELF: writeln(sendname,' is reading ',s,'''s self-description.');
  761.         E_MIDNIGHT: show_midnight(targ,printed);
  762.  
  763.         E_ACTION:writeln(sendname,' is',desc_action(p,targ));
  764.         otherwise writeln('*** Bad Event ***');
  765.     end;
  766. end;
  767.  
  768.  
  769. [global]
  770. procedure checkevents(silent: boolean := false);
  771. var
  772.     gotone: boolean;
  773.     tmp,printed: boolean;
  774.  
  775. begin
  776.     getevent;
  777.     freeevent;
  778.  
  779.     event := eventfile^;
  780.     gotone := false;
  781.     printed := false;
  782.     while myevent <> event.point do begin
  783.         myevent := myevent + 1;
  784.         if myevent > maxevent then
  785.             myevent := 1;
  786.  
  787.         if debug then begin
  788.             writeln('%checking event ',myevent);
  789.             if event.evnt[myevent].loc = location then
  790.                 writeln('  - event here')
  791.             else
  792.                 writeln('  - event elsewhere');
  793.             writeln('  - event number = ',event.evnt[myevent].action:1);
  794.         end;
  795.  
  796.         if (event.evnt[myevent].loc = location) then begin
  797.             if (event.evnt[myevent].sender <> myslot) then begin
  798.  
  799.                         { if sent by me don't look at it }
  800.                         { will use global record event }
  801.                 handle_event(tmp);
  802.                 if tmp then
  803.                     printed := true;
  804.  
  805.                 inmem := false;    { re-read important data that }
  806.                 gethere;    { may have been altered }
  807.  
  808.                 gotone := true;
  809.             end;
  810.         end;
  811.     end;
  812.     if (printed) and (gotone) and not(silent) then begin
  813.         putchars(chr(10)+chr(13)+old_prompt+line);
  814.     end;
  815.  
  816.     rnd_event(silent);
  817. end;
  818.  
  819.  
  820.  
  821. { count the number of people in this room; assumes a gethere has been done }
  822.  
  823. function find_numpeople: integer;
  824. var
  825.     sum,i: integer;
  826.  
  827. begin
  828.     sum := 0;
  829.     for i := 1 to maxpeople do
  830.         if here.people[i].kind > 0 then
  831. {        if here.people[i].username <> '' then    }
  832.             sum := sum + 1;
  833.     find_numpeople := sum;
  834. end;
  835.  
  836.  
  837.  
  838. { don't give them away, but make noise--maybe
  839.   percent is percentage chance that they WON'T make any noise }
  840.  
  841. procedure noisehide(percent: integer);
  842.  
  843. begin
  844.     { assumed gethere;  }
  845.     if (hiding) and (find_numpeople > 1) then begin
  846.         if rnd100 > percent then
  847.             log_event(myslot,E_REALNOISE,rnd100,0);
  848.             { myslot: don't tell them they made noise }
  849.     end;
  850. end;
  851.  
  852.  
  853.  
  854. function checkhide: boolean;
  855.  
  856. begin
  857.     if (hiding) then begin
  858.         checkhide := false;
  859.         noisehide(50);
  860.         writeln('You can''t do that while you''re hiding.');
  861.     end else
  862.         checkhide := true;
  863. end;
  864.  
  865.  
  866.  
  867. procedure clear_command;
  868.  
  869. begin
  870.     if logged_act then begin
  871.         getroom;
  872.         here.people[myslot].act := 0;
  873.         putroom;
  874.         logged_act := false;
  875.     end;
  876. end;
  877.  
  878. { forward procedure take_token(aslot, roomno: integer); }
  879. procedure take_token;
  880.             { remove self from a room's people list }
  881.  
  882. begin
  883.     getroom(roomno);
  884.     with here.people[aslot] do begin
  885.         kind := 0;
  886.         username:= '';
  887.         name := '';
  888.     end;
  889.     putroom;
  890. end;
  891.  
  892.  
  893. { fowrard function put_token(room: integer;var aslot:integer;
  894.     hidelev:integer := 0):boolean;
  895.              put a person in a room's people list
  896.              returns myslot }
  897. function put_token;
  898. var
  899.     i,j: integer;
  900.     found: boolean;
  901.     savehold: array[1..maxhold] of integer;
  902.  
  903. begin
  904.     if first_puttoken then begin
  905.         for i := 1 to maxhold do
  906.             savehold[i] := 0;
  907.         first_puttoken := false;
  908.     end else begin
  909.         gethere;
  910.         for i := 1 to maxhold do
  911.             savehold[i] := here.people[myslot].holding[i];
  912.     end;
  913.  
  914.     getroom(room);
  915.     i := 1;
  916.     found := false;
  917.     while (i <= maxpeople) and (not found) do begin
  918.         if here.people[i].name = '' then
  919.             found := true
  920.         else
  921.             i := i + 1;
  922.     end;
  923.     put_token := found;
  924.     if found then begin
  925.         here.people[i].kind := 1;    { I'm a real player }
  926.         here.people[i].name := myname;
  927.         here.people[i].username := userid;
  928.         here.people[i].hiding := hidelev;
  929.             { hidelev is zero for most everyone
  930.               unless you want to poof in and remain hidden }
  931.  
  932.         here.people[i].wearing := mywear;
  933.         here.people[i].wielding := mywield;
  934.         here.people[i].health := myhealth;
  935.         here.people[i].self := myself;
  936.  
  937.         here.people[i].act := 0;
  938.  
  939.         for j := 1 to maxhold do
  940.             here.people[i].holding[j] := savehold[j];
  941.         putroom;
  942.  
  943.         aslot := i;
  944.         for j := 1 to maxexit do    { haven't found any exits in }
  945.             found_exit[j] := false;    { the new room }
  946.  
  947.         { note the user's new location in the logfile }
  948.         getint(N_LOCATION); 
  949.         anint.int[mylog] := room;
  950.         putint;
  951.     end else
  952.         freeroom;
  953. end;
  954.  
  955. procedure log_exit(direction,room,sender_slot: integer);
  956.  
  957. begin
  958.     log_event(sender_slot,E_EXIT,direction,0,myname,room);
  959. end;
  960.  
  961. procedure log_entry(direction,room,sender_slot: integer);
  962.  
  963. begin
  964.     log_event(sender_slot,E_ENTER,direction,0,myname,room);
  965. end;
  966.  
  967. procedure log_begin(room:integer := 1);
  968.  
  969. begin
  970.     log_event(0,E_BEGIN,0,0,myname,room);
  971. end;
  972.  
  973. procedure log_quit(room:integer;dropped:boolean);
  974.  
  975. begin
  976.     log_event(0,E_QUIT,0,0,myname,room);
  977.     if dropped then
  978.         log_event(0,E_DROPALL,0,0,myname,room);
  979. end;
  980.  
  981.  
  982.  
  983.  
  984. { return the number of people you can see here }
  985.  
  986. function n_can_see: integer;
  987. var
  988.     sum: integer;
  989.     i: integer;
  990.     selfslot: integer;
  991.  
  992. begin
  993.     if here.locnum = location then
  994.         selfslot := myslot
  995.     else
  996.         selfslot := 0;
  997.  
  998.     sum := 0;
  999.     for i := 1 to maxpeople do
  1000.         if ( i <> selfslot ) and
  1001.            ( length(here.people[i].name) > 0 ) and
  1002.            ( here.people[i].hiding = 0 ) then
  1003.             sum := sum + 1;
  1004.     n_can_see := sum;
  1005.     if debug then
  1006.         writeln('%n_can_see = ',sum:1);
  1007. end;
  1008.  
  1009.  
  1010.  
  1011. function next_can_see(var point: integer): string;
  1012. var
  1013.     found: boolean;
  1014.     selfslot: integer;
  1015.  
  1016. begin
  1017.     if here.locnum <> location then
  1018.         selfslot := 0
  1019.     else
  1020.         selfslot := myslot;
  1021.     found := false;
  1022.     while (not found) and (point <= maxpeople) do begin
  1023.         if (point <> selfslot) and
  1024.            (length(here.people[point].name) > 0) and
  1025.            (here.people[point].hiding = 0) then
  1026.             found := true
  1027.         else
  1028.             point := point + 1;
  1029.     end;
  1030.  
  1031.     if found then begin
  1032.         next_can_see := here.people[point].name;
  1033.         point := point + 1;
  1034.     end else begin
  1035.         next_can_see := myname;    { error!  error! }
  1036.         writeln('%searching error in next_can_see; notify the Monster Manager');
  1037.     end;
  1038. end;
  1039.  
  1040.  
  1041. procedure niceprint(var len: integer; s: string);
  1042.  
  1043. begin
  1044.     if len + length(s) > 78 then begin
  1045.         len := 0;
  1046.         writeln;
  1047.     end else begin
  1048.         len := len + length(s);
  1049.     end;
  1050.     write(s);
  1051. end;
  1052.  
  1053.  
  1054. procedure people_header(where: shortstring);
  1055. var
  1056.     point: integer;
  1057.     tmp: string;
  1058.     i: integer;
  1059.     n: integer;
  1060.     len: integer;
  1061.  
  1062. begin
  1063.     point := 1;
  1064.     n := n_can_see;
  1065.     case n of
  1066.         0:;
  1067.         1: begin
  1068.             writeln(next_can_see(point),' is ',where);
  1069.            end;
  1070.         2: begin
  1071.             writeln(next_can_see(point),' and ',next_can_see(point),
  1072.                 ' are ',where);
  1073.            end;
  1074.         otherwise begin
  1075.             len := 0;
  1076.             for i := 1 to n - 1 do begin { at least 1 to 2 }
  1077.                 tmp := next_can_see(point);
  1078.                 if i <> n - 1 then
  1079.                     tmp := tmp + ', ';
  1080.                 niceprint(len,tmp);
  1081.             end;
  1082.  
  1083.             niceprint(len,' and ');
  1084.             niceprint(len,next_can_see(point));
  1085.             niceprint(len,' are ' + where);
  1086.             writeln;
  1087.         end;
  1088.     end;
  1089. end;
  1090.  
  1091.  
  1092. procedure desc_person(i: integer);
  1093. var
  1094.     pname: shortstring;
  1095.  
  1096. begin
  1097.     pname := here.people[i].name;
  1098.  
  1099.     if here.people[i].act <> 0 then begin
  1100.         write(pname,' is');
  1101.         writeln(desc_action(here.people[i].act,
  1102.             here.people[i].targ));
  1103.                     { describes what person last did }
  1104.     end;
  1105.  
  1106.     if here.people[i].health <> GOODHEALTH then
  1107.         desc_health(i);
  1108.  
  1109.     if here.people[i].wielding > 0 then
  1110.         writeln(pname,' is wielding ',obj_part(here.people[i].wielding),'.');
  1111.  
  1112. end;
  1113.  
  1114.  
  1115. procedure show_people;
  1116. var
  1117.     i: integer;
  1118.  
  1119. begin
  1120.     people_header('here.');
  1121.     for i := 1 to maxpeople do begin
  1122.         if (here.people[i].name <> '') and
  1123.            (i <> myslot) and
  1124.            (here.people[i].hiding = 0) then
  1125.                 desc_person(i);
  1126.     end;
  1127. end;
  1128.  
  1129.  
  1130. procedure show_group;
  1131. var
  1132.     gloc1,gloc2: integer;
  1133.     gnam1,gnam2: shortstring;
  1134.  
  1135. begin
  1136.     gloc1 := here.grploc1;
  1137.     gloc2 := here.grploc2;
  1138.     gnam1 := here.grpnam1;
  1139.     gnam2 := here.grpnam2;
  1140.  
  1141.     if gloc1 <> 0 then begin
  1142.         gethere(gloc1);
  1143.         people_header(gnam1);
  1144.     end;
  1145.     if gloc2 <> 0 then begin
  1146.         gethere(gloc2);
  1147.         people_header(gnam2);
  1148.     end;
  1149.     gethere;
  1150. end;
  1151.  
  1152.  
  1153. procedure desc_obj(n: integer);
  1154.  
  1155. begin
  1156.     if n <> 0 then begin
  1157.         getobj(n);
  1158.         freeobj;
  1159.         if (obj.linedesc = DEFAULT_LINE) then begin
  1160.             writeln('On the ground here is ',obj_part(n,FALSE),'.');
  1161.  
  1162.                 { the FALSE means obj_part shouldn't do its
  1163.                   own getobj, cause we already did one }
  1164.         end else
  1165.             print_line(obj.linedesc);
  1166.     end;
  1167. end;
  1168.  
  1169.  
  1170. procedure show_objects;
  1171.  
  1172. var
  1173.     i: integer;
  1174.  
  1175. begin
  1176.     for i := 1 to maxobjs do begin
  1177.         if (here.objs[i] <> 0) and (here.objhide[i] = 0) then
  1178.             desc_obj(here.objs[i]);
  1179.     end;
  1180. end;
  1181.  
  1182.  
  1183. function lookup_detail(var n: integer;s:string): boolean;
  1184. var
  1185.     i,poss,maybe,num: integer;
  1186.  
  1187. begin
  1188.     n := 0;
  1189.     s := lowcase(s);
  1190.     i := 1;
  1191.     maybe := 0;
  1192.     num := 0;
  1193.     for i := 1 to maxdetail do begin
  1194.         if s = here.detail[i] then
  1195.             num := i
  1196.         else if index(here.detail[i],s) = 1 then begin
  1197.             maybe := maybe + 1;
  1198.             poss := i;
  1199.         end;
  1200.     end;
  1201.     if num <> 0 then begin
  1202.         n := num;
  1203.         lookup_detail := true;
  1204.     end else if maybe = 1 then begin
  1205.         n := poss;
  1206.         lookup_detail := true;
  1207.     end else if maybe > 1 then begin
  1208.         lookup_detail := false;
  1209.     end else begin
  1210.         lookup_detail := false;
  1211.     end;
  1212. end;
  1213.  
  1214.  
  1215. function look_detail(s: string): boolean;
  1216. var
  1217.     n: integer;
  1218.  
  1219. begin
  1220.     if lookup_detail(n,s) then begin
  1221.         if here.detaildesc[n] = 0 then
  1222.             look_detail := false
  1223.         else begin
  1224.             print_desc(here.detaildesc[n]);
  1225.             log_event(myslot,E_LOOKDETAIL,0,0,here.detail[n]);
  1226.             look_detail := true;
  1227.         end;
  1228.     end else
  1229.         look_detail := false;
  1230. end;
  1231.  
  1232.  
  1233. function look_person(s: string): boolean;
  1234. var
  1235.     objnum,i,n: integer;
  1236.     first: boolean;
  1237.  
  1238. begin
  1239.     if parse_pers(n,s) then begin
  1240.         if n = myslot then begin
  1241.             log_event(myslot,E_LOOKSELF,n,0);
  1242.             writeln('You step outside of yourself for a moment to get an objective self-appraisal:');
  1243.             writeln;
  1244.         end else
  1245.             log_event(myslot,E_LOOKYOU,n,0);
  1246.         if here.people[n].self <> 0 then begin
  1247.             print_desc(here.people[n].self);
  1248.             writeln;
  1249.         end;
  1250.  
  1251.         desc_health(n);
  1252.  
  1253.             { Do an inventory of person S }
  1254.         first := true;
  1255.         for i := 1 to maxhold do begin
  1256.             objnum := here.people[n].holding[i];
  1257.             if objnum <> 0 then begin
  1258.                 if first then begin
  1259.                     writeln(here.people[n].name,' is holding:');
  1260.                     first := false;
  1261.                 end;
  1262.                 writeln('   ',obj_part(objnum));
  1263.             end;
  1264.         end;
  1265.         if first then
  1266.             writeln(here.people[n].name,' is empty handed.');
  1267.  
  1268.         look_person := true;
  1269.     end else
  1270.         look_person := false;
  1271. end;
  1272.  
  1273.  
  1274.  
  1275. procedure do_examine(s: string;var three: boolean;silent:boolean := false);
  1276. var
  1277.     n: integer;
  1278.     msg: string;
  1279.  
  1280. begin
  1281.     three := false;
  1282.     if parse_obj(n,s) then begin
  1283.         if obj_here(n) or obj_hold(n) then begin
  1284.             three := true;
  1285.  
  1286.             getobj(n);
  1287.             freeobj;
  1288.             msg := myname + ' is examining ' + obj_part(n) + '.';
  1289.             log_event(myslot,E_EXAMINE,0,0,msg);
  1290.             if obj.examine = 0 then
  1291.                 writeln('You see nothing special about the ',
  1292.                         objnam.idents[n],'.')
  1293.             else
  1294.                 print_desc(obj.examine);
  1295.         end else
  1296.             if not(silent) then
  1297.                 writeln('That object cannot be seen here.');
  1298.     end else
  1299.         if not(silent) then
  1300.             writeln('That object cannot be seen here.');
  1301. end;
  1302.  
  1303.  
  1304.  
  1305. procedure print_room;
  1306.  
  1307. begin
  1308.     case here.nameprint of
  1309.         0:;    { don't print name }
  1310.         1: writeln('You''re in ',here.nicename);
  1311.         2: writeln('You''re at ',here.nicename);
  1312.     end;
  1313.  
  1314.     if not(brief) then begin
  1315.     case here.which of
  1316.         0: print_desc(here.primary);
  1317.         1: print_desc(here.secondary);
  1318.         2: begin
  1319.             print_desc(here.primary);
  1320.             print_desc(here.secondary);
  1321.            end;
  1322.         3: begin
  1323.             print_desc(here.primary);
  1324.             if here.magicobj <> 0 then
  1325.                 if obj_hold(here.magicobj) then
  1326.                     print_desc(here.secondary);
  1327.            end;
  1328.         4: begin
  1329.             if here.magicobj <> 0 then begin
  1330.                 if obj_hold(here.magicobj) then
  1331.                     print_desc(here.secondary)
  1332.                 else
  1333.                     print_desc(here.primary);
  1334.             end else
  1335.                 print_desc(here.primary);
  1336.            end;
  1337.     end;
  1338.     writeln;
  1339.     end;   { if not(brief) }
  1340. end;
  1341.  
  1342.  
  1343.  
  1344. procedure do_look(s: string := '');
  1345. var
  1346.     n: integer;
  1347.     one,two,three: boolean;
  1348.  
  1349. begin
  1350.     gethere;
  1351.     if s = '' then begin    { do an ordinary top-level room look }
  1352.  
  1353.         if hiding then begin
  1354.             writeln('You can''t get a very good view of the details of the room from where');
  1355.             writeln('you are hiding.');
  1356.             noisehide(67);
  1357.         end else begin
  1358.             print_room;
  1359.             show_exits;
  1360.         end;        { end of what you can't see when you're hiding }
  1361.         show_people;
  1362.         show_group;
  1363.         show_objects;
  1364.     end else begin        { look at a detail in the room }
  1365.         one := look_detail(s);
  1366.         two := look_person(s);
  1367.         do_examine(s,three,TRUE);
  1368.         if not(one or two or three) then
  1369.             writeln('There isn''t anything here by that name to look at.');
  1370.     end;
  1371. end;
  1372.  
  1373.  
  1374. procedure init_exit(dir: integer);
  1375.  
  1376. begin
  1377.     with here.exits[dir] do begin
  1378.         exitdesc := DEFAULT_LINE;
  1379.         fail := DEFAULT_LINE;        { default descriptions }
  1380.         success := 0;            { until they customize }
  1381.         comeout := DEFAULT_LINE;
  1382.         goin := DEFAULT_LINE;
  1383.         closed := DEFAULT_LINE;
  1384.  
  1385.         objreq := 0;        { not a door (yet) }
  1386.         hidden := 0;        { not hidden }
  1387.         reqalias := false;    { don't require alias (i.e. can use
  1388.                       direction of exit North, east, etc. }
  1389.         reqverb := false;
  1390.         autolook := true;
  1391.         alias := '';
  1392.     end;
  1393. end;
  1394.  
  1395.  
  1396.  
  1397. procedure remove_exit(dir: integer);
  1398. var
  1399.     targroom,targslot: integer;
  1400.     hereacc,targacc: boolean;
  1401.  
  1402. begin
  1403.         { Leave residual accepts if player is not the owner of
  1404.           the room that the exit he is deleting is in }
  1405.  
  1406.     getroom;
  1407.     targroom := here.exits[dir].toloc;
  1408.     targslot := here.exits[dir].slot;
  1409.     here.exits[dir].toloc := 0;
  1410.     init_exit(dir);
  1411.  
  1412.     if (here.owner = userid) or (privd) then
  1413.         hereacc := false
  1414.     else
  1415.         hereacc := true;
  1416.  
  1417.     if hereacc then
  1418.         here.exits[dir].kind := 5    { put an "accept" in its place }
  1419.     else
  1420.         here.exits[dir].kind := 0;
  1421.  
  1422.     putroom;
  1423.     log_event(myslot,E_DETACH,dir,0,myname,location);
  1424.  
  1425.     getroom(targroom);
  1426.     here.exits[targslot].toloc := 0;
  1427.  
  1428.     if (here.owner = userid) or (privd) then
  1429.         targacc := false
  1430.     else
  1431.         targacc := true;
  1432.  
  1433.     if targacc then
  1434.         here.exits[targslot].kind := 5    { put an "accept" in its place }
  1435.     else
  1436.         here.exits[targslot].kind := 0;
  1437.  
  1438.     putroom;
  1439.  
  1440.     if targroom <> location then
  1441.         log_event(0,E_DETACH,targslot,0,myname,targroom);
  1442.     writeln('Exit destroyed.');
  1443. end;
  1444.  
  1445.  
  1446. {
  1447. User procedure to unlink a room
  1448. }
  1449. procedure do_unlink(s: string);
  1450. var
  1451.     dir: integer;
  1452.  
  1453. begin
  1454.     gethere;
  1455.     if checkhide then begin
  1456.     if lookup_dir(dir,s) then begin
  1457.         if can_alter(dir) then begin
  1458.             if here.exits[dir].toloc = 0 then
  1459.                 writeln('There is no exit there to unlink.')
  1460.             else
  1461.                 remove_exit(dir);
  1462.         end else
  1463.             writeln('You are not allowed to remove that exit.');
  1464.     end else
  1465.         writeln('To remove an exit, type UNLINK <direction of exit>.');
  1466.     end;
  1467. end;
  1468.  
  1469.  
  1470.  
  1471. function desc_allowed: boolean;
  1472.  
  1473. begin
  1474.     if (here.owner = userid) or
  1475.        (privd) then
  1476.         desc_allowed := true
  1477.     else begin
  1478.         writeln('Sorry, you are not allowed to alter the descriptions in this room.');
  1479.         desc_allowed := false;
  1480.     end;
  1481. end;
  1482.  
  1483.  
  1484.  
  1485. function slead(s: string):string;
  1486. var
  1487.     i: integer;
  1488.     going: boolean;
  1489.  
  1490. begin 
  1491.     if length(s) = 0 then
  1492.         slead := ''
  1493.     else begin
  1494.         i := 1;
  1495.         going := true;
  1496.         while going do begin
  1497.             if i > length(s) then
  1498.                 going := false
  1499.             else if (s[i]=' ') or (s[i]=chr(9)) then
  1500.                 i := i + 1
  1501.             else
  1502.                 going := false;
  1503.         end;
  1504.  
  1505.         if i > length(s) then
  1506.             slead := ''
  1507.         else
  1508.             slead := substr(s,i,length(s)+1-i);
  1509.     end;
  1510. end;
  1511.  
  1512.  
  1513. function bite(var s: string): string;
  1514. var
  1515.     i: integer;
  1516.  
  1517. begin
  1518.     if length(s) = 0 then
  1519.         bite := ''
  1520.     else begin
  1521.         i := index(s,' ');
  1522.         if i = 0 then begin
  1523.             bite := s;
  1524.             s := '';
  1525.         end else begin
  1526.             bite := substr(s,1,i-1);
  1527.             s := slead(substr(s,i+1,length(s)-i));
  1528.         end;
  1529.     end;
  1530. end;
  1531.  
  1532. procedure edit_help;
  1533.  
  1534. begin
  1535.     writeln;
  1536.     writeln('A    Append text to end');
  1537.     writeln('C    Check text for correct length with parameter substitution (#)');
  1538.     writeln('D #    Delete line #');
  1539.     writeln('E    Exit & save changes');
  1540.     writeln('I #    Insert lines before line #');
  1541.     writeln('P    Print out description');
  1542.     writeln('Q    Quit: THROWS AWAY CHANGES');
  1543.     writeln('R #    Replace text of line #');
  1544.     writeln('Z    Zap all text');
  1545.     writeln('@    Throw away text & exit with the default description');
  1546.     writeln('?    This list');
  1547.     writeln;
  1548. end;
  1549.  
  1550. procedure edit_replace(n: integer);
  1551. var
  1552.     prompt: string;
  1553.     s: string;
  1554.  
  1555. begin
  1556.     if (n > heredsc.desclen) or (n < 1) then
  1557.         writeln('-- Bad line number')
  1558.     else begin
  1559.         writev(prompt,n:2,': ');
  1560.         grab_line(prompt,s);
  1561.         if s <> '**' then
  1562.             heredsc.lines[n] := s;
  1563.     end;
  1564. end;
  1565.  
  1566. procedure edit_insert(n: integer);
  1567. var
  1568.     i: integer;
  1569.  
  1570. begin
  1571.     if heredsc.desclen = descmax then
  1572.         writeln('You have already used all ',descmax:1,' lines of text.')
  1573.     else if (n < 1) or (n > heredsc.desclen) then begin
  1574.         writeln('Invalid line #; valid lines are between 1 and ',heredsc.desclen:1);
  1575.         writeln('Use A (add) to add text to the end of your description.');
  1576.     end else begin
  1577.         for i := heredsc.desclen+1 downto n + 1 do
  1578.             heredsc.lines[i] := heredsc.lines[i-1];
  1579.         heredsc.desclen := heredsc.desclen + 1;
  1580.         heredsc.lines[n] := '';
  1581.     end;
  1582. end;
  1583.  
  1584. procedure edit_doinsert(n: integer);
  1585. var
  1586.     s: string;
  1587.     prompt: string;
  1588.  
  1589. begin
  1590.     if heredsc.desclen = descmax then
  1591.         writeln('You have already used all ',descmax:1,' lines of text.')
  1592.     else if (n < 1) or (n > heredsc.desclen) then begin
  1593.         writeln('Invalid line #; valid lines are between 1 and ',heredsc.desclen:1);
  1594.         writeln('Use A (add) to add text to the end of your description.');
  1595.     end else repeat
  1596.         writev(prompt,n:1,': ');
  1597.         grab_line(prompt,s);
  1598.         if s <> '**' then begin
  1599.             edit_insert(n);        { put the blank line in }
  1600.             heredsc.lines[n] := s;    { copy this line onto it }
  1601.             n := n + 1;
  1602.         end;
  1603.     until (heredsc.desclen = descmax) or (s = '**');
  1604. end;
  1605.  
  1606. procedure edit_show;
  1607. var
  1608.     i: integer;
  1609.  
  1610. begin
  1611.     writeln;
  1612.     if heredsc.desclen = 0 then
  1613.         writeln('[no text]')
  1614.     else begin
  1615.         i := 1;
  1616.         while i <= heredsc.desclen do begin
  1617.             writeln(i:2,': ',heredsc.lines[i]);
  1618.             i := i + 1;
  1619.         end;
  1620.     end;
  1621. end;
  1622.  
  1623. procedure edit_append;
  1624. var
  1625.     prompt,s: string;
  1626.     stilladding: boolean;
  1627.  
  1628. begin
  1629.     if heredsc.desclen = descmax then
  1630.         writeln('You have already used all ',descmax:1,' lines of text.')
  1631.     else begin
  1632.         stilladding := true;
  1633.         writeln('Enter text.  Terminate with ** at the beginning of a line.');
  1634.         writeln('You have ',descmax:1,' lines maximum.');
  1635.         writeln;
  1636.         while (heredsc.desclen < descmax) and (stilladding) do begin
  1637.             writev(prompt,heredsc.desclen+1:2,': ');
  1638.             grab_line(prompt,s);
  1639.             if s = '**' then
  1640.                 stilladding := false
  1641.             else begin
  1642.                 heredsc.desclen := heredsc.desclen + 1;
  1643.                 heredsc.lines[heredsc.desclen] := s;
  1644.             end;
  1645.         end;
  1646.     end;
  1647. end;
  1648.  
  1649. procedure edit_delete(n: integer);
  1650. var
  1651.     i: integer;
  1652.  
  1653. begin
  1654.     if heredsc.desclen = 0 then
  1655.         writeln('-- No lines to delete')
  1656.     else if (n > heredsc.desclen) or (n < 1) then
  1657.         writeln('-- Bad line number')
  1658.     else if (n = 1) and (heredsc.desclen = 1) then
  1659.         heredsc.desclen := 0
  1660.     else begin
  1661.         for i := n to heredsc.desclen-1 do
  1662.             heredsc.lines[i] := heredsc.lines[i + 1];
  1663.         heredsc.desclen := heredsc.desclen - 1;
  1664.     end;
  1665. end;
  1666.  
  1667.  
  1668. procedure check_subst;
  1669. var
  1670.     i: integer;
  1671.  
  1672. begin
  1673.     if heredsc.desclen > 0 then begin
  1674.         for i := 1 to heredsc.desclen do
  1675.             if (index(heredsc.lines[i],'#') > 0) and
  1676.                (length(heredsc.lines[i]) > 59) then
  1677.                 writeln('Warning: line ',i:1,' is too long for correct parameter substitution.');
  1678.     end;
  1679. end;
  1680.  
  1681.  
  1682. function edit_desc(var dsc: integer):boolean;
  1683. var
  1684.     cmd: char;
  1685.     s: string;
  1686.     done: boolean;
  1687.     n: integer;
  1688.  
  1689. begin
  1690.     if dsc = DEFAULT_LINE then begin
  1691.         heredsc.desclen := 0;
  1692.     end else if dsc > 0 then begin
  1693.         getblock(dsc);
  1694.         freeblock;
  1695.         heredsc := block;
  1696.     end else if dsc < 0 then begin
  1697.         n := (- dsc);
  1698.         getline(n);
  1699.         freeline;
  1700.         heredsc.lines[1] := oneliner.theline;
  1701.         heredsc.desclen := 1;
  1702.     end else begin
  1703.         heredsc.desclen := 0;
  1704.     end;
  1705.  
  1706.     edit_desc := true;
  1707.     done := false;
  1708.     if heredsc.desclen = 0 then
  1709.         edit_append;
  1710.     repeat
  1711.         writeln;
  1712.         repeat
  1713.             grab_line('* ',s);
  1714.             s := slead(s);
  1715.         until length(s) > 0;
  1716.         s := lowcase(s);
  1717.         cmd := s[1];
  1718.  
  1719.         if length(s)>1 then begin
  1720.             n := number(slead(substr(s,2,length(s)-1)))
  1721.         end else
  1722.             n := 0;
  1723.  
  1724.         case cmd of
  1725.             'h','?': edit_help;
  1726.             'a': edit_append;
  1727.             'z': heredsc.desclen := 0;
  1728.             'c': check_subst;
  1729.             'p','l','t': edit_show;
  1730.             'd': edit_delete(n);
  1731.             'e': begin
  1732.                 check_subst;
  1733.                 if debug then
  1734.                     writeln('edit_desc: dsc is ',dsc:1);
  1735.  
  1736.  
  1737. { what I do here may require some explanation:
  1738.  
  1739.     dsc is a pointer to some text structure:
  1740.         dsc = 0 :  no text
  1741.         dsc > 0 :  dsc refers to a description block (descmax lines)
  1742.         dsc < 0 :  dsc refers to a description "one liner".  abs(dsc)
  1743.                is the actual pointer
  1744.  
  1745.     If there are no lines of text to be written out (heredsc.desclen = 0)
  1746.     then we deallocate whatever dsc is when edit_desc was invoked, if
  1747.     it was pointing to something;
  1748.  
  1749.     if there is one line of text to be written out, allocate a one liner
  1750.     record, assign the string to it, and return dsc as negative;
  1751.  
  1752.     if there is mmore than one line of text, allocate a description block,
  1753.     store the lines in it, and return dsc as positive.
  1754.  
  1755.     In all cases if there was already a record allocated to dsc then
  1756.     use it and don't reallocate a new record.
  1757. }
  1758.  
  1759. { kill the default }        if (heredsc.desclen > 0) and
  1760. { if we're gonna put real }        (dsc = DEFAULT_LINE) then
  1761. { texty in here }                dsc := 0;
  1762.  
  1763. { no lines, delete existing }    if heredsc.desclen = 0 then
  1764. { desc, if any }            delete_block(dsc)
  1765.                 else if heredsc.desclen = 1 then begin
  1766.                     if (dsc = 0) then begin
  1767.                         if alloc_line(dsc) then;
  1768.                         dsc := (- dsc);
  1769.                     end else if dsc > 0 then begin
  1770.                         delete_block(dsc);
  1771.                         if alloc_line(dsc) then;
  1772.                         dsc := (- dsc);
  1773.                     end;
  1774.  
  1775.                     if dsc < 0 then begin
  1776.                         getline( abs(dsc) );
  1777.                         oneliner.theline := heredsc.lines[1];
  1778.                         putline;
  1779.                     end;
  1780. { more than 1 lines }        end else begin
  1781.                     if dsc = 0 then begin
  1782.                         if alloc_block(dsc) then;
  1783.                     end else if dsc < 0 then begin
  1784.                         delete_line(dsc);
  1785.                         if alloc_block(dsc) then;
  1786.                     end;
  1787.  
  1788.                     if dsc > 0 then begin
  1789.                         getblock(dsc);
  1790.                         block := heredsc;
  1791. { This is a fudge }                block.descrinum := dsc;
  1792.                         putblock;
  1793.                     end;
  1794.                 end;
  1795.                 done := true;
  1796.                  end;
  1797.             'r': edit_replace(n);
  1798.             '@': begin
  1799.                 delete_block(dsc);
  1800.                 dsc := DEFAULT_LINE;
  1801.                 done := true;
  1802.                  end;
  1803.             'i': edit_doinsert(n);
  1804.             'q': begin
  1805.                 grab_line('Throw away changes, are you sure? ',s);
  1806.                 s := lowcase(s);
  1807.                 if (s = 'y') or (s = 'yes') then begin
  1808.                     done := true;
  1809.                     edit_desc := false; { signal caller not to save }
  1810.                 end;
  1811.                  end;
  1812.             otherwise writeln('-- Invalid command, type ? for a list.');
  1813.         end;
  1814.     until done;
  1815. end;
  1816.  
  1817.  
  1818.  
  1819.  
  1820. function alloc_detail(var n: integer;s: string): boolean;
  1821. var
  1822.     found: boolean;
  1823.  
  1824. begin
  1825.     n := 1;
  1826.     found := false;
  1827.     while (n <= maxdetail) and (not found) do begin
  1828.         if here.detaildesc[n] = 0 then
  1829.             found := true
  1830.         else
  1831.             n := n + 1;
  1832.     end;
  1833.     alloc_detail := found;
  1834.     if not(found) then
  1835.         n := 0
  1836.     else begin
  1837.         getroom;
  1838.         here.detail[n] := lowcase(s);
  1839.         putroom;
  1840.     end;
  1841. end;
  1842.  
  1843.  
  1844. {
  1845. User describe procedure.  If no s then describe the room
  1846.  
  1847. Known problem: if two people edit the description to the same room one of their
  1848.     description blocks could be lost.
  1849. This is unlikely to happen unless the Monster Manager tries to edit a
  1850. description while the room's owner is also editing it.
  1851. }
  1852. procedure do_describe(s: string);
  1853. var
  1854.     i: integer;
  1855.     newdsc: integer;
  1856.  
  1857. begin
  1858.     gethere;
  1859.     if checkhide then begin
  1860.     if s = '' then begin { describe this room }
  1861.         if desc_allowed then begin
  1862.             log_action(desc,0);
  1863.             writeln('[ Editing the primary room description ]');
  1864.             newdsc := here.primary;
  1865.             if edit_desc(newdsc) then begin
  1866.                 getroom;
  1867.                 here.primary := newdsc;
  1868.                 putroom;
  1869.             end;
  1870.             log_event(myslot,E_EDITDONE,0,0);
  1871.         end;
  1872.     end else begin{ describe a detail of this room }
  1873.         if length(s) > veryshortlen then
  1874.             writeln('Your detail keyword can only be ',veryshortlen:1,' characters.')
  1875.         else if desc_allowed then begin
  1876.             if not(lookup_detail(i,s)) then
  1877.             if not(alloc_detail(i,s)) then begin
  1878.                 writeln('You have used all ',maxdetail:1,' details.');
  1879.                 writeln('To delete a detail, DESCRIBE <the detail> and delete all the text.');
  1880.             end;
  1881.             if i <> 0 then begin
  1882.                 log_action(e_detail,0);
  1883.                 writeln('[ Editing detail "',here.detail[i],'" of this room ]');
  1884.                 newdsc := here.detaildesc[i];
  1885.                 if edit_desc(newdsc) then begin
  1886.                     getroom;
  1887.                     here.detaildesc[i] := newdsc;
  1888.                     putroom;
  1889.                 end;
  1890.                 log_event(myslot,E_DONEDET,0,0);
  1891.             end;
  1892.         end;
  1893.     end;
  1894. {    clear_command;    }
  1895.     end;
  1896. end;
  1897.  
  1898.  
  1899.  
  1900.  
  1901. procedure del_room(n: integer);
  1902. var
  1903.     i: integer;
  1904.  
  1905. begin
  1906.     getnam;
  1907.     nam.idents[n] := '';    { blank out name }
  1908.     putnam;
  1909.  
  1910.     getown;
  1911.     own.idents[n] := '';    { blank out owner }
  1912.     putown;
  1913.  
  1914.     getroom(n);
  1915.     for i := 1 to maxexit do begin
  1916.         with here.exits[i] do begin
  1917.             delete_line(exitdesc);
  1918.             delete_line(fail);
  1919.             delete_line(success);
  1920.             delete_line(comeout);
  1921.             delete_line(goin);
  1922.         end;
  1923.     end;
  1924.     delete_block(here.primary);
  1925.     delete_block(here.secondary);
  1926.     putroom;
  1927.     delete_room(n);    { return room to free list }
  1928. end;
  1929.  
  1930.  
  1931.  
  1932. procedure createroom(s: string);    { create a room with name s }
  1933. var
  1934.     roomno: integer;
  1935.     dummy: integer;
  1936.     i:integer;
  1937.     rand_accept: integer;
  1938.  
  1939. begin
  1940.     if length(s) = 0 then begin
  1941.         writeln('Please specify the name of the room you wish to create as a parameter to FORM.');
  1942.     end else if length(s) > shortlen then begin
  1943.         writeln('Please limit your room name to a maximum of ',shortlen:1,' characters.');
  1944.     end else if exact_room(dummy,s) then begin
  1945.         writeln('That room name has already been used.  Please give a unique room name.');
  1946.     end else if alloc_room(roomno) then begin
  1947.         log_action(form,0);
  1948.  
  1949.         getnam;
  1950.         nam.idents[roomno] := lowcase(s);    { assign room name }
  1951.         putnam;                    { case insensitivity }
  1952.  
  1953.         getown;
  1954.         own.idents[roomno] := userid;    { assign room owner }
  1955.         putown;
  1956.  
  1957.         getroom(roomno);
  1958.  
  1959.         here.primary := 0;
  1960.         here.secondary := 0;
  1961.         here.which := 0;    { print primary desc only by default }
  1962.         here.magicobj := 0;
  1963.  
  1964.         here.owner := userid;    { owner and name are stored here too }
  1965.         here.nicename := s;
  1966.         here.nameprint := 1;    { You're in ... }
  1967.         here.objdrop := 0;    { objects dropped stay here }
  1968.         here.objdesc := 0;    { nothing printed when they drop }
  1969.         here.magicobj := 0;    { no magic object default }
  1970.         here.trapto := 0;    { no trapdoor }
  1971.         here.trapchance := 0;    { no chance }
  1972.         here.rndmsg := DEFAULT_LINE;    { bland noises message }
  1973.         here.pile := 0;
  1974.         here.grploc1 := 0;
  1975.         here.grploc2 := 0;
  1976.         here.grpnam1 := '';
  1977.         here.grpnam2 := '';
  1978.  
  1979.         here.effects := 0;
  1980.         here.parm := 0;
  1981.  
  1982.         here.xmsg2 := 0;
  1983.         here.exp2 := 0;
  1984.         here.exp3 := 0;
  1985.         here.exp4 := 0;
  1986.         here.exitfail := DEFAULT_LINE;
  1987.         here.ofail := DEFAULT_LINE;
  1988.  
  1989.         for i := 1 to maxpeople do
  1990.             here.people[i].kind := 0;
  1991.  
  1992.         for i := 1 to maxpeople do
  1993.             here.people[i].name := '';
  1994.  
  1995.         for i := 1 to maxobjs do
  1996.             here.objs[i] := 0;
  1997.  
  1998.         for i := 1 to maxdetail do
  1999.             here.detail[i] := '';
  2000.         for i := 1 to maxdetail do
  2001.             here.detaildesc[i] := 0;
  2002.  
  2003.         for i := 1 to maxobjs do
  2004.             here.objhide[i] := 0;
  2005.  
  2006.         for i := 1 to maxexit do
  2007.             with here.exits[i] do begin
  2008.                 toloc := 0;
  2009.                 kind := 0;
  2010.                 slot := 0;
  2011.                 exitdesc := DEFAULT_LINE;
  2012.                 fail := DEFAULT_LINE;
  2013.                 success := 0;    { no success desc by default }
  2014.                 goin := DEFAULT_LINE;
  2015.                 comeout := DEFAULT_LINE;
  2016.                 closed := DEFAULT_LINE;
  2017.  
  2018.                 objreq := 0;
  2019.                 hidden := 0;
  2020.                 alias := '';
  2021.  
  2022.                 reqverb := false;
  2023.                 reqalias := false;
  2024.                 autolook := true;
  2025.             end;
  2026.         
  2027. {        here.exits := zero;    }
  2028.  
  2029.                 { random accept for this room }
  2030.         rand_accept := 1 + (rnd100 mod 6);
  2031.         here.exits[rand_accept].kind := 5;
  2032.  
  2033.         putroom;
  2034.     end;
  2035. end;
  2036.  
  2037.  
  2038.  
  2039. procedure show_help;
  2040. var
  2041.     i: integer;
  2042.     s: string;
  2043.  
  2044. begin
  2045.     writeln;
  2046.     writeln('Accept/Refuse #  Allow others to Link an exit here at direction # | Undo Accept');
  2047.     writeln('Brief            Toggle printing of room descriptions');
  2048.     writeln('Customize [#]    Customize this room | Customize exit # | Customize object #');
  2049.     writeln('Describe [#]     Describe this room | Describe a feature (#) in detail');
  2050.     writeln('Destroy #        Destroy an instance of object # (you must be holding it)');
  2051.     writeln('Duplicate #      Make a duplicate of an already-created object.');
  2052.     writeln('Form/Zap #       Form a new room with name # | Destroy room named #');
  2053.     writeln('Get/Drop #       Get/Drop an object');
  2054.     writeln('#,Go #           Go towards # (Some: N/North S/South E/East W/West U/Up D/Down)');
  2055.     writeln('Health           Show how healthy you are');
  2056.     writeln('Hide/Reveal [#]  Hide/Reveal yoursef | Hide object (#)');
  2057.     writeln('I,Inventory      See what you or someone else is carrying');
  2058.     writeln('Link/Unlink #    Link/Unlink this room to/from another via exit at direction #');
  2059.     writeln('Look,L [#]       Look here | Look at something or someone (#) closely');
  2060.     writeln('Make #           Make a new object named #');
  2061.     writeln('Name #           Set your game name to #');
  2062.     writeln('Players          List people who have played Monster');
  2063.     writeln('Punch #          Punch person #');
  2064.     writeln('Quit             Leave the game');
  2065.     writeln('Relink           Move an exit');
  2066.     writeln;
  2067.     grab_line('-more-',s);
  2068.     writeln;
  2069.     writeln('Rooms            Show information about rooms you have made');
  2070.     writeln('Say, '' (quote)   Say line of text following command to others in the room');
  2071.     writeln('Search           Look around the room for anything hidden');
  2072.     writeln('Self #           Edit a description of yourself | View #''s self-description');
  2073.     writeln('Show #           Show option # (type SHOW ? for a list)');
  2074.     writeln('Unmake #         Remove the form definition of object #');
  2075.     writeln('Use #            Use object #');
  2076.     writeln('Wear #           Wear the object #');
  2077.     writeln('Wield #          Wield the weapon #;  you must be holding it first');
  2078.     writeln('Whisper #        Whisper something (prompted for) to person #');
  2079.     writeln('Who              List of people playing Monster now');
  2080.     writeln('Whois #          What is a player''s username');
  2081.     writeln('?,Help           This list');
  2082.     writeln('. (period)       Repeat last command');
  2083.     writeln;
  2084. end;
  2085.  
  2086.  
  2087. function lookup_cmd(s: string):integer;
  2088. var
  2089.     i,        { index for loop }
  2090.     poss,        { a possible match -- only for partial matches }
  2091.     maybe,        { number of possible matches we have: > 2 is ambig. }
  2092.     num        { the definite match }
  2093.         : integer;
  2094.  
  2095.  
  2096. begin
  2097.     s := lowcase(s);
  2098.     i := 1;
  2099.     maybe := 0;
  2100.     num := 0;
  2101.     for i := 1 to numcmds do begin
  2102.         if s = cmds[i] then
  2103.             num := i
  2104.         else if index(cmds[i],s) = 1 then begin
  2105.             maybe := maybe + 1;
  2106.             poss := i;
  2107.         end;
  2108.     end;
  2109.     if num <> 0 then begin
  2110.         lookup_cmd := num;
  2111.     end else if maybe = 1 then begin
  2112.         lookup_cmd := poss;
  2113.     end else if maybe > 1 then
  2114.         lookup_cmd := error    { "Ambiguous" }
  2115.     else
  2116.         lookup_cmd := error;    { "Command not found " }
  2117. end;
  2118.  
  2119.  
  2120. procedure addrooms(n: integer);
  2121. var
  2122.     i: integer;
  2123.  
  2124. begin
  2125.     getindex(I_ROOM);
  2126.     for i := indx.top+1 to indx.top+n do begin
  2127.         locate(roomfile,i);
  2128.         roomfile^.valid := i;
  2129.         roomfile^.locnum := i;
  2130.         roomfile^.primary := 0;
  2131.         roomfile^.secondary := 0;
  2132.         roomfile^.which := 0;
  2133.         put(roomfile);
  2134.     end;
  2135.     indx.top := indx.top + n;
  2136.     putindex;
  2137. end;
  2138.  
  2139.  
  2140.  
  2141. procedure addints(n: integer);
  2142. var
  2143.     i: integer;
  2144.  
  2145. begin
  2146.     getindex(I_INT);
  2147.     for i := indx.top+1 to indx.top+n do begin
  2148.         locate(intfile,i);
  2149.         intfile^.intnum := i;
  2150.         put(intfile);
  2151.     end;
  2152.     indx.top := indx.top + n;
  2153.     putindex;
  2154. end;
  2155.  
  2156.  
  2157.  
  2158. procedure addlines(n: integer);
  2159. var
  2160.     i: integer;
  2161.  
  2162. begin
  2163.     getindex(I_LINE);
  2164.     for i := indx.top+1 to indx.top+n do begin
  2165.         locate(linefile,i);
  2166.         linefile^.linenum := i;
  2167.         put(linefile);
  2168.     end;
  2169.     indx.top := indx.top + n;
  2170.     putindex;
  2171. end;
  2172.  
  2173. procedure addblocks(n: integer);
  2174. var
  2175.     i: integer;
  2176.  
  2177. begin
  2178.     getindex(I_BLOCK);
  2179.     for i := indx.top+1 to indx.top+n do begin
  2180.         locate(descfile,i);
  2181.         descfile^.descrinum := i;
  2182.         put(descfile);
  2183.     end;
  2184.     indx.top := indx.top + n;
  2185.     putindex;
  2186. end;
  2187.  
  2188.  
  2189. procedure addobjects(n: integer);
  2190. var
  2191.     i: integer;
  2192.  
  2193. begin
  2194.     getindex(I_OBJECT);
  2195.     for i := indx.top+1 to indx.top+n do begin
  2196.         locate(objfile,i);
  2197.         objfile^.objnum := i;
  2198.         put(objfile);
  2199.     end;
  2200.     indx.top := indx.top + n;
  2201.     putindex;
  2202. end;
  2203.  
  2204.  
  2205. procedure dist_list;
  2206. var
  2207.     i,j: integer;
  2208.     f: text;
  2209.     where_they_are: intrec;
  2210.  
  2211. begin
  2212.     writeln('Writing distribution list . . .');
  2213.     open(f,'monsters.dis',history := new);
  2214.     rewrite(f);
  2215.  
  2216.     getindex(I_PLAYER);    { Rec of valid player log records  }
  2217.     freeindex;        { False if a valid player log }
  2218.  
  2219.     getuser;        { Corresponding userids of players }
  2220.     freeuser;
  2221.  
  2222.     getpers;        { Personal names of players }
  2223.     freepers;
  2224.  
  2225.     getdate;        { date of last play }
  2226.     freedate;
  2227.  
  2228.     if privd then begin
  2229.         getint(N_LOCATION);
  2230.         freeint;
  2231.         where_they_are := anint;
  2232.  
  2233.         getnam;
  2234.         freenam;
  2235.     end;
  2236.  
  2237.     for i := 1 to maxplayers do begin
  2238.         if not(indx.free[i]) then begin
  2239.             write(f,user.idents[i]);
  2240.             for j := length(user.idents[i]) to 15 do
  2241.                 write(f,' ');
  2242.             write(f,'! ',pers.idents[i]);
  2243.             for j := length(pers.idents[i]) to 21 do
  2244.                 write(f,' ');
  2245.  
  2246.             write(f,adate.idents[i]);
  2247.                 if length(adate.idents[i]) < 19 then
  2248.                     for j := length(adate.idents[i]) to 18 do
  2249.                         write(f,' ');
  2250.             if anint.int[i] <> 0 then
  2251.                 write(f,' * ')
  2252.             else
  2253.                 write(f,'   ');
  2254.  
  2255.             if privd then begin
  2256.                 write(f,nam.idents[ where_they_are.int[i] ]);
  2257.             end;
  2258.             writeln(f);
  2259.  
  2260.         end;
  2261.     end;
  2262.     writeln('Done.');
  2263. end;
  2264.  
  2265.  
  2266. procedure system_view;
  2267. var
  2268.     used,free,total: integer;
  2269.  
  2270. begin
  2271.     writeln;
  2272.     getindex(I_BLOCK);
  2273.     freeindex;
  2274.     used := indx.inuse;
  2275.     total := indx.top;
  2276.     free := total - used;
  2277.  
  2278.     writeln('               used   free   total');
  2279.     writeln('Block file   ',used:5,'  ',free:5,'   ',total:5);
  2280.  
  2281.     getindex(I_LINE);
  2282.     freeindex;
  2283.     used := indx.inuse;
  2284.     total := indx.top;
  2285.     free := total - used;
  2286.     writeln('Line file    ',used:5,'  ',free:5,'   ',total:5);
  2287.  
  2288.     getindex(I_ROOM);
  2289.     freeindex;
  2290.     used := indx.inuse;
  2291.     total := indx.top;
  2292.     free := total - used;
  2293.     writeln('Room file    ',used:5,'  ',free:5,'   ',total:5);
  2294.  
  2295.     getindex(I_OBJECT);
  2296.     freeindex;
  2297.     used := indx.inuse;
  2298.     total := indx.top;
  2299.     free := total - used;
  2300.     writeln('Object file  ',used:5,'  ',free:5,'   ',total:5);
  2301.  
  2302.     getindex(I_INT);
  2303.     freeindex;
  2304.     used := indx.inuse;
  2305.     total := indx.top;
  2306.     free := total - used;
  2307.     writeln('Integer file ',used:5,'  ',free:5,'   ',total:5);
  2308.  
  2309.     writeln;
  2310. end;
  2311.  
  2312.  
  2313. { remove a user from the log records (does not handle ownership) }
  2314.  
  2315. procedure kill_user(s:string);
  2316. var
  2317.     n: integer;
  2318.  
  2319. begin
  2320.     if length(s) = 0 then
  2321.         writeln('No user specified')
  2322.     else begin
  2323.         if lookup_user(n,s) then begin
  2324.             getindex(I_ASLEEP);
  2325.             freeindex;
  2326.             if indx.free[n] then begin
  2327.                 delete_log(n);
  2328.                 writeln('Player deleted.');
  2329.             end else
  2330.                 writeln('That person is playing now.');
  2331.         end else
  2332.             writeln('No such userid found in log information.');
  2333.     end;
  2334. end;
  2335.  
  2336.