home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 January / usenetsourcesnewsgroupsinfomagicjanuary1994.iso / sources / games / volume5 / monster / part05 / mon3.pas next >
Pascal/Delphi Source File  |  1988-11-30  |  54KB  |  2,434 lines

  1.  
  2. { disown everything a player owns }
  3.  
  4. procedure disown_user(s:string);
  5. var
  6.     n: integer;
  7.     i: integer;
  8.     tmp: string;
  9.     theuser: string;
  10.  
  11. begin
  12.     if length(s) > 0 then begin
  13.         if debug then
  14.             writeln('calling lookup_user with ',s);
  15.         if not lookup_user(n,s) then
  16.             writeln('User not in log info, attempting to disown anyway.');
  17.  
  18.         theuser := user.idents[n];
  19.  
  20.         { first disown all their rooms }
  21.  
  22.         getown;
  23.         freeown;
  24.         for i := 1 to maxroom do
  25.             if own.idents[i] = theuser then begin
  26.                 getown;
  27.                 own.idents[i] := '*';
  28.                 putown;
  29.  
  30.                 getroom(i);
  31.                 tmp := here.nicename;
  32.                 here.owner := '*';
  33.                 putroom;
  34.  
  35.                 writeln('Disowned room ',tmp);
  36.             end;
  37.         writeln;
  38.  
  39.         getobjown;
  40.         freeobjown;
  41.         getobjnam;
  42.         freeobjnam;
  43.         for i := 1 to maxroom do
  44.             if objown.idents[i] = theuser then begin
  45.                 getobjown;
  46.                 objown.idents[i] := '*';
  47.                 putobjown;
  48.  
  49.                 tmp := objnam.idents[i];
  50.                 writeln('Disowned object ',tmp);
  51.             end;
  52.     end else
  53.         writeln('No user specified.');
  54. end;
  55.  
  56. procedure move_asleep;
  57. var
  58.     pname,rname:string;    { player & room names }
  59.     newroom,n: integer;    { room number & player slot number }
  60.  
  61. begin
  62.     grab_line('Player name? ',pname);
  63.     grab_line('Room name?   ',rname);
  64.     if lookup_user(n,pname) then begin
  65.         if lookup_room(newroom,rname) then begin
  66.             getindex(I_ASLEEP);
  67.             freeindex;
  68.             if indx.free[n] then begin
  69.                 getint(N_LOCATION);
  70.                 anint.int[n] := newroom;
  71.                 putint;
  72.                 writeln('Player moved.');
  73.             end else
  74.                 writeln('That player is not asleep.');
  75.         end else
  76.             writeln('No such room found.');
  77.     end else
  78.         writeln('User not found.');
  79. end;
  80.  
  81.  
  82. procedure system_help;
  83.  
  84. begin
  85.     writeln;
  86.     writeln('B    Add description blocks');
  87.     writeln('D    Disown <user>');
  88.     writeln('E    Exit (same as quit)');
  89.     writeln('I    Add Integer records');
  90.     writeln('K    Kill <user>');
  91.     writeln('L    Add one liner records');
  92.     writeln('M    Move a player who is asleep (not playing now)');
  93.     writeln('O    Add object records');
  94.     writeln('P    Write a distribution list of players');
  95.     writeln('Q    Quit (same as exit)');
  96.     writeln('R    Add rooms');
  97.     writeln('V    View current sizes/usage');
  98.     writeln('?    This list');
  99.     writeln;
  100. end;
  101.  
  102.  
  103. { *************** FIX_STUFF ******************** }
  104.  
  105. procedure fix_stuff;
  106.  
  107. begin
  108. end;
  109.  
  110.  
  111. procedure do_system(s: string);
  112. var
  113.     prompt: string;
  114.     done: boolean;
  115.     cmd: char;
  116.     n: integer;
  117.     p: string;
  118.  
  119. begin
  120.     if privd then begin
  121.         log_action(c_system,0);
  122.         prompt := 'System> ';
  123.         done := false;
  124.         repeat
  125.             repeat
  126.                 grab_line(prompt,s);
  127.                 s := slead(s);
  128.             until length(s) > 0;
  129.             s := lowcase(s);
  130.             cmd := s[1];
  131.  
  132.             n := 0;
  133.             p := '';
  134.             if length(s) > 1 then begin
  135.                 p := slead( substr(s,2,length(s)-1) );
  136.                 n := number(p)
  137.             end;
  138.             if debug then begin
  139.                 writeln('p = ',p);
  140.             end;
  141.  
  142.             case cmd of
  143.                 'h','?': system_help;
  144.                 '1': fix_stuff;
  145. {remove a user}            'k': kill_user(p);
  146. {disown}            'd': disown_user(p);
  147. {dist list of players}        'p': dist_list;
  148. {move where user will wakeup}    'm': move_asleep;
  149. {add rooms}            'r': begin
  150.                     if n > 0 then begin
  151.                         addrooms(n);
  152.                     end else
  153.                         writeln('To add rooms, say R <# to add>');
  154.                      end;
  155. {add ints}            'i': begin
  156.                     if n > 0 then begin
  157.                         addints(n);
  158.                     end else
  159.                         writeln('To add integers, say I <# to add>');
  160.                      end;
  161. {add description blocks}    'b': begin
  162.                     if n > 0 then begin
  163.                         addblocks(n);
  164.                     end else
  165.                         writeln('To add description blocks, say B <# to add>');
  166.                      end;
  167. {add objects}            'o': begin
  168.                     if n > 0 then begin
  169.                         addobjects(n);
  170.                     end else
  171.                         writeln('To add object records, say O <# to add>');
  172.                      end;
  173. {add one-liners}        'l': begin
  174.                     if n > 0 then begin
  175.                         addlines(n);
  176.                     end else
  177.                         writeln('To add one liner records, say L <# to add>');
  178.                      end;
  179. {view current stats}        'v': begin
  180.                     system_view;
  181.                      end;
  182. {quit}                'q','e': done := true;
  183.             otherwise writeln('-- bad command, type ? for a list.');
  184.             end;
  185.         until done;
  186.         log_event(myslot,E_SYSDONE,0,0);
  187.     end else
  188.         writeln('Only the Monster Manger may enter system maintenance mode.');
  189. end;
  190.  
  191.  
  192. procedure do_version(s: string);
  193.  
  194. begin
  195.     writeln('Monster, a multiplayer adventure game where the players create the world');
  196.     writeln('and make the rules.');
  197.     writeln;
  198.     writeln('Written by Rich Skrenta at Northwestern University, 1988.');
  199. end;
  200.  
  201.  
  202. procedure rebuild_system;
  203. var
  204.     i,j: integer;
  205.  
  206. begin
  207.     writeln('Creating index file 1-6');
  208.     for i := 1 to 7 do begin
  209.             { 1 is blocklist
  210.               2 is linelist
  211.               3 is roomlist
  212.               4 is playeralloc
  213.               5 is player awake (playing game)
  214.               6 are objects
  215.               7 is intfile }
  216.  
  217.         locate(indexfile,i);
  218.         for j := 1 to maxindex do
  219.             indexfile^.free[j] := true;
  220.         indexfile^.indexnum := i;
  221.         indexfile^.top := 0; { none of each to start }
  222.         indexfile^.inuse := 0;
  223.         put(indexfile);
  224.     end;
  225.  
  226.  
  227.     writeln('Initializing roomfile with 10 rooms');
  228.     addrooms(10);
  229.  
  230.     writeln('Initializing block file with 10 description blocks');
  231.     addblocks(10);
  232.  
  233.     writeln('Initializing line file with 10 lines');
  234.     addlines(10);
  235.  
  236.     writeln('Initializing object file with 10 objects');
  237.     addobjects(10);
  238.  
  239.  
  240.     writeln('Initializing namfile 1-8');
  241.     for j := 1 to 8 do begin
  242.         locate(namfile,j);
  243.         namfile^.validate := j;
  244.         namfile^.loctop := 0;
  245.         for i := 1 to maxroom do begin
  246.             namfile^.idents[i] := '';
  247.         end;
  248.         put(namfile);
  249.     end;
  250.  
  251.     writeln('Initializing eventfile');
  252.     for i := 1 to numevnts + 1 do begin
  253.         locate(eventfile,i);
  254.         eventfile^.validat := i;
  255.         eventfile^.point := 1;
  256.         put(eventfile);
  257.     end;
  258.  
  259.     writeln('Initializing intfile');
  260.     for i := 1 to 6 do begin
  261.         locate(intfile,i);
  262.         intfile^.intnum := i;
  263.         put(intfile);
  264.     end;
  265.  
  266.     getindex(I_INT);
  267.     for i := 1 to 6 do
  268.         indx.free[i] := false;
  269.     indx.top := 6;
  270.     indx.inuse := 6;
  271.     putindex;
  272.  
  273.     { Player log records should have all their slots initially,
  274.       they don't have to be allocated because they use namrec
  275.       and intfile for their storage; they don't have their own
  276.       file to allocate
  277.     }
  278.     getindex(I_PLAYER);
  279.     indx.top := maxplayers;
  280.     putindex;
  281.     getindex(I_ASLEEP);
  282.     indx.top := maxplayers;
  283.     putindex;
  284.  
  285.     writeln('Creating the Great Hall');
  286.     createroom('Great Hall');
  287.     getroom(1);
  288.     here.owner := '';
  289.     putroom;
  290.     getown;
  291.     own.idents[1] := '';
  292.     putown;
  293.  
  294.     writeln('Creating the Void');
  295.     createroom('Void');            { loc 2 }
  296.     writeln('Creating the Pit of Fire');
  297.     createroom('Pit of Fire');        { loc 3 }
  298.             { note that these are NOT public locations }
  299.  
  300.  
  301.     writeln('Use the SYSTEM command to view and add capacity to the database');
  302.     writeln;
  303. end;
  304.  
  305.  
  306. procedure special(s: string);
  307.  
  308. begin
  309.     if (s = 'rebuild') and (privd) then begin
  310.         if REBUILD_OK then begin
  311.             writeln('Do you really want to destroy the entire universe?');
  312.             readln(s);
  313.             if length(s) > 0 then
  314.                 if substr(lowcase(s),1,1) = 'y' then
  315.                     rebuild_system;
  316.         end else
  317.             writeln('REBUILD is disabled; you must recompile.');
  318.     end else if s = 'version' then begin
  319.         { Don't take this out please... }
  320.           writeln('Monster, written by Rich Skrenta at Northwestern University, 1988.');
  321.     end else if s = 'quit' then
  322.         done := true;
  323. end;
  324.  
  325.  
  326. { put an object in this location
  327.   if returns false, there were no more free object slots here:
  328.   in other words, the room is too cluttered, and cannot hold any
  329.   more objects
  330. }
  331. function place_obj(n: integer;silent:boolean := false): boolean;
  332. var
  333.     found: boolean;
  334.     i: integer;
  335.  
  336. begin
  337.     if here.objdrop = 0 then
  338.         getroom
  339.     else
  340.         getroom(here.objdrop);
  341.     i := 1;
  342.     found := false;
  343.     while (i <= maxobjs) and (not found) do begin
  344.         if here.objs[i] = 0 then
  345.             found := true
  346.         else
  347.             i := i + 1;
  348.     end;
  349.     place_obj := found;
  350.     if found then begin
  351.         here.objs[i] := n;
  352.         here.objhide[i] := 0;
  353.         putroom;
  354.  
  355.         gethere;
  356.  
  357.  
  358.         { if it bounced somewhere else then tell them }
  359.  
  360.         if (here.objdrop <> 0) and (here.objdest <> 0) then
  361.             log_event(0,E_BOUNCEDIN,here.objdest,n,'',here.objdrop);
  362.  
  363.  
  364.         if not(silent) then begin
  365.             if here.objdesc <> 0 then
  366.                 print_subs(here.objdesc,obj_part(n))
  367.             else
  368.                 writeln('Dropped.');
  369.         end;
  370.     end else
  371.         freeroom;
  372. end;
  373.  
  374.  
  375. { remove an object from this room }
  376. function take_obj(objnum,slot: integer): boolean;
  377.  
  378. begin
  379.     getroom;
  380.     if here.objs[slot] = objnum then begin
  381.         here.objs[slot] := 0;
  382.         here.objhide[slot] := 0;
  383.         take_obj := true;
  384.     end else
  385.         take_obj := false;
  386.     putroom;
  387. end;
  388.  
  389.  
  390. function can_hold: boolean;
  391.  
  392. begin
  393.     if find_numhold < maxhold then
  394.         can_hold := true
  395.     else
  396.         can_hold := false;
  397. end;
  398.  
  399.  
  400. function can_drop: boolean;
  401.  
  402. begin
  403.     if find_numobjs < maxobjs then
  404.         can_drop := true
  405.     else
  406.         can_drop := false;
  407. end;
  408.  
  409.  
  410. function find_hold(objnum: integer;slot:integer := 0): integer;
  411. var
  412.     i: integer;
  413.  
  414. begin
  415.     if slot = 0 then
  416.         slot := myslot;
  417.     i := 1;
  418.     find_hold := 0;
  419.     while i <= maxhold do begin
  420.         if here.people[slot].holding[i] = objnum then
  421.             find_hold := i;
  422.         i := i + 1;
  423.     end;
  424. end;
  425.  
  426.  
  427.  
  428. { put object number n into the player's inventory; returns false if
  429.   he's holding too many things to carry another }
  430.  
  431. function hold_obj(n: integer): boolean;
  432. var
  433.     found: boolean;
  434.     i: integer;
  435.  
  436. begin
  437.     getroom;
  438.     i := 1;
  439.     found := false;
  440.     while (i <= maxhold) and (not found) do begin
  441.         if here.people[myslot].holding[i] = 0 then
  442.             found := true
  443.         else
  444.             i := i + 1;
  445.     end;
  446.     hold_obj := found;
  447.     if found then begin
  448.         here.people[myslot].holding[i] := n;
  449.         putroom;
  450.  
  451.         getobj(n);
  452.         freeobj;
  453.         hold_kind[i] := obj.kind;
  454.     end else
  455.         freeroom;
  456. end;
  457.  
  458.  
  459.  
  460. { remove an object (hold) from the player record, given the slot that
  461.   the object is being held in }
  462.  
  463. procedure drop_obj(slot: integer;pslot: integer := 0);
  464.  
  465. begin
  466.     if pslot = 0 then
  467.         pslot := myslot;
  468.     getroom;
  469.     here.people[pslot].holding[slot] := 0;
  470.     putroom;
  471.  
  472.     hold_kind[slot] := 0;
  473. end;
  474.  
  475.  
  476.  
  477. { maybe drop something I'm holding if I'm hit }
  478.  
  479. procedure maybe_drop;
  480. var
  481.     i: integer;
  482.     objnum: integer;
  483.     s: string;
  484.  
  485. begin
  486.     i := 1 + (rnd100 mod maxhold);
  487.     objnum := here.people[myslot].holding[i];
  488.  
  489.     if (objnum <> 0) and (mywield <> objnum) and (mywear <> objnum) then begin
  490.         { drop something }
  491.  
  492.         drop_obj(i);
  493.         if place_obj(objnum,TRUE) then begin
  494.             getobjnam;
  495.             freeobjnam;
  496.             writeln('The ',objnam.idents[objnum],' has slipped out of your hands.');
  497.  
  498.             
  499.         s := objnam.idents[objnum];
  500.             log_event(myslot,E_SLIPPED,0,0,s);
  501.         end else
  502.             writeln('%error in maybe_drop; unsuccessful place_obj; notify Monster Manager');
  503.  
  504.     end;
  505. end;
  506.  
  507.  
  508.  
  509. { return TRUE if the player is allowed to program the object n
  510.   if checkpub is true then obj_owner will return true if the object in
  511.   question is public }
  512.  
  513. function obj_owner(n: integer;checkpub: boolean := FALSE):boolean;
  514.  
  515. begin
  516.     getobjown;
  517.     freeobjown;
  518.     if (objown.idents[n] = userid) or (privd) then begin
  519.         obj_owner := true;
  520.     end else if (objown.idents[n] = '') and (checkpub) then begin
  521.         obj_owner := true;
  522.     end else begin
  523.         obj_owner := false;
  524.     end;
  525. end;
  526.  
  527.  
  528. procedure do_duplicate(s: string);
  529. var
  530.     objnum: integer;
  531.  
  532. begin
  533.    if length(s) > 0 then begin
  534.     if not is_owner(location,TRUE) then begin
  535.             { only let them make things if they're on their home turf }
  536.         writeln('You may only create objects when you are in one of your own rooms.');
  537.     end else begin
  538.         if lookup_obj(objnum,s) then begin
  539.             if obj_owner(objnum,TRUE) then begin
  540.                 if not(place_obj(objnum,TRUE)) then
  541.                     { put the new object here }
  542.                     writeln('There isn''t enough room here to make that.')
  543.                 else begin
  544. { keep track of how many there }    getobj(objnum);
  545. { are in existence }            obj.numexist := obj.numexist + 1;
  546.                     putobj;
  547.  
  548.                     log_event(myslot,E_MADEOBJ,0,0,
  549.                         myname + ' has created an object here.');
  550.                     writeln('Object created.');
  551.                 end;
  552.             end else
  553.                 writeln('Power to create that object belongs to someone else.');
  554.         end else
  555.             writeln('There is no object by that name.');
  556.     end;
  557.    end else
  558.         writeln('To duplicate an object, type DUPLICATE <object name>.');
  559. end;
  560.  
  561.  
  562. { make an object }
  563. procedure do_makeobj(s: string);
  564. var
  565.     objnum: integer;
  566.  
  567. begin
  568.     gethere;
  569.     if checkhide then begin
  570.     if not is_owner(location,TRUE) then begin
  571.         writeln('You may only create objects when you are in one of your own rooms.');
  572.     end else if s <> '' then begin
  573.         if length(s) > shortlen then
  574.             writeln('Please limit your object names to ',shortlen:1,' characters.')
  575.         else if exact_obj(objnum,s) then begin    { object already exits }
  576.             writeln('That object already exits.  If you would like to make another copy of it,');
  577.             writeln('use the DUPLICATE command.');
  578.         end else begin
  579.             if debug then
  580.                 writeln('%beggining to create object');
  581.             if find_numobjs < maxobjs then begin
  582.                 if alloc_obj(objnum) then begin
  583.                     if debug then
  584.                         writeln('%alloc_obj successful');
  585.                     getobjnam;
  586.                     objnam.idents[objnum] := lowcase(s);
  587.                     putobjnam;
  588.                     if debug then
  589.                         writeln('%getobjnam completed');
  590.                     getobjown;
  591.                     objown.idents[objnum] := userid;
  592.                     putobjown;
  593.                     if debug then
  594.                         writeln('%getobjown completed');
  595.  
  596.                     getobj(objnum);
  597.                         obj.onum := objnum;
  598.                         obj.oname := s;    { name of object }
  599.                         obj.kind := 0; { bland object }
  600.                         obj.linedesc := DEFAULT_LINE;
  601.                         obj.actindx := 0;
  602.                         obj.examine := 0;
  603.                         obj.numexist := 1;
  604.                         obj.home := 0;
  605.                         obj.homedesc := 0;
  606.  
  607.                         obj.sticky := false;
  608.                         obj.getobjreq := 0;
  609.                         obj.getfail := 0;
  610.                         obj.getsuccess := DEFAULT_LINE;
  611.  
  612.                         obj.useobjreq := 0;
  613.                         obj.uselocreq := 0;
  614.                         obj.usefail := DEFAULT_LINE;
  615.                         obj.usesuccess := DEFAULT_LINE;
  616.  
  617.                         obj.usealias := '';
  618.                         obj.reqalias := false;
  619.                         obj.reqverb := false;
  620.  
  621.             if s[1] in ['a','A','e','E','i','I','o','O','u','U'] then
  622.                         obj.particle := 2  { an }
  623.             else
  624.                         obj.particle := 1; { a }
  625.  
  626.                         obj.d1 := 0;
  627.                         obj.d2 := 0;
  628.                         obj.exp3 := 0;
  629.                         obj.exp4 := 0;
  630.                         obj.exp5 := DEFAULT_LINE;
  631.                         obj.exp6 := DEFAULT_LINE;
  632.                     putobj;
  633.  
  634.  
  635.                     if debug then
  636.                         writeln('putobj completed');
  637.                 end;
  638.                     { else: alloc_obj prints errors by itself }
  639.                 if not(place_obj(objnum,TRUE)) then
  640.                     { put the new object here }
  641.                     writeln('%error in makeobj - could not place object; notify the Monster Manager.')
  642.                 else begin
  643.                     log_event(myslot,E_MADEOBJ,0,0,
  644.                         myname + ' has created an object here.');
  645.                     writeln('Object created.');
  646.                 end;
  647.  
  648.             end else
  649.                 writeln('This place is too crowded to create any more objects.  Try somewhere else.');
  650.         end;
  651.     end else
  652.         writeln('To create an object, type MAKE <object name>.');
  653.     end;
  654. end;
  655.  
  656. { remove the type block for an object; all instances of the object must
  657.   be destroyed first }
  658.  
  659. procedure do_unmake(s: string);
  660. var
  661.     n: integer;
  662.     tmp: string;
  663.  
  664. begin
  665.     if not(is_owner(location,TRUE)) then
  666.         writeln('You must be in one of your own rooms to UNMAKE an object.')
  667.     else if lookup_obj(n,s) then begin
  668.         tmp := obj_part(n);
  669.             { this will do a getobj(n) for us }
  670.  
  671.         if obj.numexist = 0 then begin
  672.             delete_obj(n);
  673.  
  674.             log_event(myslot,E_UNMAKE,0,0,tmp);
  675.             writeln('Object removed.');
  676.         end else
  677.             writeln('You must DESTROY all instances of the object first.');
  678.     end else
  679.         writeln('There is no object here by that name.');
  680. end;
  681.  
  682.  
  683. { destroy a copy of an object }
  684.  
  685. procedure do_destroy(s: string);
  686. var
  687.     slot,n: integer;
  688.  
  689. begin
  690.     if length(s) = 0 then    
  691.         writeln('To destroy an object you own, type DESTROY <object>.')
  692.     else if not is_owner(location,TRUE) then
  693.         writeln('You must be in one of your own rooms to destroy an object.')
  694.     else if parse_obj(n,s) then begin
  695.         getobjown;
  696.         freeobjown;
  697.         if (objown.idents[n] <> userid) and (objown.idents[n] <> '') and
  698.            (not privd) then
  699.             writeln('You must be the owner of an object to destroy it.')
  700.         else if obj_hold(n) then begin
  701.             slot := find_hold(n);
  702.             drop_obj(slot);
  703.  
  704.             log_event(myslot,E_DESTROY,0,0,
  705.                 myname + ' has destroyed ' + obj_part(n) + '.');
  706.             writeln('Object destroyed.');
  707.  
  708.             getobj(n);
  709.             obj.numexist := obj.numexist - 1;
  710.             putobj;
  711.         end else if obj_here(n) then begin
  712.             slot := find_obj(n);
  713.             if not take_obj(n,slot) then
  714.                 writeln('Someone picked it up before you could destroy it.')
  715.             else begin
  716.                 log_event(myslot,E_DESTROY,0,0,
  717.                     myname + ' has destroyed ' + obj_part(n,FALSE) + '.');
  718.                 writeln('Object destroyed.');
  719.  
  720.                 getobj(n);
  721.                 obj.numexist := obj.numexist - 1;
  722.                 putobj;
  723.             end;
  724.         end else
  725.             writeln('Such a thing is not here.');
  726.     end else
  727.         writeln('No such thing can be seen here.');
  728. end;
  729.  
  730.  
  731. function links_possible: boolean;
  732. var
  733.     i: integer;
  734.  
  735. begin
  736.     gethere;
  737.     links_possible := false;
  738.     if is_owner(location,TRUE) then
  739.         links_possible := true
  740.     else begin
  741.         for i := 1 to maxexit do
  742.             if (here.exits[i].toloc = 0) and (here.exits[i].kind = 5) then
  743.                 links_possible := true;
  744.     end;
  745. end;
  746.  
  747.  
  748.  
  749. { make a room }
  750. procedure do_form(s: string);
  751.  
  752. begin
  753.     gethere;
  754.     if checkhide then begin
  755.         if links_possible then begin
  756.             if s = '' then begin
  757.                 grab_line('Room name: ',s);
  758.             end;
  759.             s := slead(s);
  760.  
  761.             createroom(s);
  762.         end else begin
  763.             writeln('You may not create any new exits here.  Go to a place where you can create');
  764.             writeln('an exit before FORMing a new room.');
  765.         end;
  766.     end;
  767. end;
  768.  
  769.  
  770. procedure xpoof; { loc: integer; forward }
  771. var
  772.     targslot: integer;
  773.  
  774. begin
  775.     if put_token(loc,targslot,here.people[myslot].hiding) then begin
  776.         if hiding then begin
  777.             log_event(myslot,E_HPOOFOUT,0,0,myname,location);
  778.             log_event(myslot,E_HPOOFIN,0,0,myname,loc);
  779.         end else begin
  780.             log_event(myslot,E_POOFOUT,0,0,myname,location);
  781.             log_event(targslot,E_POOFIN,0,0,myname,loc);
  782.         end;
  783.  
  784.         take_token(myslot,location);
  785.         myslot := targslot;
  786.         location := loc;
  787.         setevent;
  788.         do_look;
  789.     end else
  790.         writeln('There is a crackle of electricity, but the poof fails.');
  791. end;
  792.  
  793.  
  794. procedure do_poof(s: string);
  795. var
  796.     n,loc: integer;
  797.  
  798. begin
  799.     if privd then begin
  800.         gethere;
  801.         if lookup_room(loc,s) then begin
  802.             xpoof(loc);
  803.         end else if parse_pers(n,s) then begin
  804.             grab_line('What room? ',s);
  805.             if lookup_room(loc,s) then begin
  806.                 log_event(myslot,E_POOFYOU,n,loc);
  807.                 writeln;
  808.                 writeln('You extend your arms, muster some energy, and ',here.people[n].name,' is');
  809.                 writeln('engulfed in a cloud of orange smoke.');
  810.                 writeln;
  811.             end else
  812.                 writeln('There is no room named ',s,'.');
  813.         end else
  814.             writeln('There is no room named ',s,'.');
  815.     end else
  816.         writeln('Only the Monster Manager may poof.');
  817. end;
  818.  
  819.  
  820. procedure link_room(origdir,targdir,targroom: integer);
  821.  
  822. begin
  823.     { since exit creation involves the writing of two records,
  824.       perhaps there should be a global lock around this code,
  825.       such as a get to some obscure index field or something.
  826.       I haven't put this in because I don't believe that if this
  827.       routine fails it will seriously damage the database.
  828.  
  829.       Actually, the lock should be on the test (do_link) but that
  830.       would be hard    }
  831.  
  832.     getroom;
  833.     with here.exits[origdir] do begin
  834.         toloc := targroom;
  835.         kind := 1; { type of exit, they can customize later }
  836.         slot := targdir; { exit it comes out in in target room }
  837.  
  838.         init_exit(origdir);
  839.     end;
  840.     putroom;
  841.  
  842.     log_event(myslot,E_NEWEXIT,0,0,myname,location);
  843.     if location <> targroom then
  844.         log_event(0,E_NEWEXIT,0,0,myname,targroom);
  845.  
  846.     getroom(targroom);
  847.     with here.exits[targdir] do begin
  848.         toloc := location;
  849.         kind := 1;
  850.         slot := origdir;
  851.  
  852.         init_exit(targdir);
  853.     end;
  854.     putroom;
  855.     writeln('Exit created.  Use CUSTOM ',direct[origdir],' to customize your exit.');
  856. end;
  857.  
  858.  
  859. {
  860. User procedure to link a room
  861. }
  862. procedure do_link(s: string);
  863. var
  864.     ok: boolean;
  865.     orgexitnam,targnam,trgexitnam: string;
  866.     targroom,    { number of target room }
  867.     targdir,    { number of target exit direction }
  868.     origdir: integer;{ number of exit direction here }
  869.     firsttime: boolean;
  870.  
  871. begin
  872.  
  873. {    gethere;    ! done in links_possible }
  874.  
  875.    if links_possible then begin
  876.     log_action(link,0);
  877.     if checkhide then begin
  878.     writeln('Hit return alone at any prompt to terminate exit creation.');
  879.     writeln;
  880.  
  881.     if s = '' then
  882.         firsttime := false
  883.     else begin
  884.         orgexitnam := bite(s);
  885.         firsttime := true;
  886.     end;
  887.  
  888.     repeat
  889.         if not(firsttime) then
  890.             grab_line('Direction of exit? ',orgexitnam)
  891.         else
  892.             firsttime := false;
  893.  
  894.         ok :=lookup_dir(origdir,orgexitnam);
  895.         if ok then
  896.             ok := can_make(origdir);
  897.     until (orgexitnam = '') or ok;
  898.  
  899.     if ok then begin
  900.         if s = '' then
  901.             firsttime := false
  902.         else begin
  903.             targnam := s;
  904.             firsttime := true;
  905.         end;
  906.  
  907.         repeat
  908.             if not(firsttime) then
  909.                 grab_line('Room to link to? ',targnam)
  910.             else
  911.                 firsttime := false;
  912.  
  913.             ok := lookup_room(targroom,targnam);
  914.         until (targnam = '') or ok;
  915.     end;
  916.  
  917.     if ok then begin
  918.         repeat
  919.             writeln('Exit comes out in target room');
  920.             grab_line('from what direction? ',trgexitnam);
  921.             ok := lookup_dir(targdir,trgexitnam);
  922.             if ok then
  923.                 ok := can_make(targdir,targroom);
  924.         until (trgexitnam='') or ok;
  925.     end;
  926.  
  927.     if ok then begin { actually create the exit }
  928.         link_room(origdir,targdir,targroom);
  929.     end;
  930.     end;
  931.    end else
  932.     writeln('No links are possible here.');
  933. end;
  934.  
  935.  
  936. procedure relink_room(origdir,targdir,targroom: integer);
  937. var
  938.     tmp: exit;
  939.     copyslot,
  940.     copyloc: integer;
  941.  
  942. begin
  943.     gethere;
  944.     tmp := here.exits[origdir];
  945.     copyloc := tmp.toloc;
  946.     copyslot := tmp.slot;
  947.  
  948.     getroom(targroom);
  949.     here.exits[targdir] := tmp;
  950.     putroom;
  951.  
  952.     getroom(copyloc);
  953.     here.exits[copyslot].toloc := targroom;
  954.     here.exits[copyslot].slot := targdir;
  955.     putroom;
  956.  
  957.     getroom;
  958.     here.exits[origdir].toloc := 0;
  959.     init_exit(origdir);
  960.     putroom;
  961. end;
  962.  
  963.  
  964. procedure do_relink(s: string);
  965. var
  966.     ok: boolean;
  967.     orgexitnam,targnam,trgexitnam: string;
  968.     targroom,    { number of target room }
  969.     targdir,    { number of target exit direction }
  970.     origdir: integer;{ number of exit direction here }
  971.     firsttime: boolean;
  972.  
  973. begin
  974.     log_action(c_relink,0);
  975.     gethere;
  976.     if checkhide then begin
  977.     writeln('Hit return alone at any prompt to terminate exit relinking.');
  978.     writeln;
  979.  
  980.     if s = '' then
  981.         firsttime := false
  982.     else begin
  983.         orgexitnam := bite(s);
  984.         firsttime := true;
  985.     end;
  986.  
  987.     repeat
  988.         if not(firsttime) then
  989.             grab_line('Direction of exit to relink? ',orgexitnam)
  990.         else
  991.             firsttime := false;
  992.  
  993.         ok :=lookup_dir(origdir,orgexitnam);
  994.         if ok then
  995.             ok := can_alter(origdir);
  996.     until (orgexitnam = '') or ok;
  997.  
  998.     if ok then begin
  999.         if s = '' then
  1000.             firsttime := false
  1001.         else begin
  1002.             targnam := s;
  1003.             firsttime := true;
  1004.         end;
  1005.  
  1006.         repeat
  1007.             if not(firsttime) then
  1008.                 grab_line('Room to relink exit into? ',targnam)
  1009.             else
  1010.                 firsttime := false;
  1011.  
  1012.             ok := lookup_room(targroom,targnam);
  1013.         until (targnam = '') or ok;
  1014.     end;
  1015.  
  1016.     if ok then begin
  1017.         repeat
  1018.             writeln('New exit comes out in target room');
  1019.             grab_line('from what direction? ',trgexitnam);
  1020.             ok := lookup_dir(targdir,trgexitnam);
  1021.             if ok then
  1022.                 ok := can_make(targdir,targroom);
  1023.         until (trgexitnam='') or ok;
  1024.     end;
  1025.  
  1026.     if ok then begin { actually create the exit }
  1027.         relink_room(origdir,targdir,targroom);
  1028.     end;
  1029.     end;
  1030. end;
  1031.  
  1032.  
  1033. { print the room default no-go message if there is one;
  1034.   otherwise supply the generic "you can't go that way" }
  1035.  
  1036. procedure default_fail;
  1037.  
  1038. begin
  1039.     if (here.exitfail <> 0) and (here.exitfail <> DEFAULT_LINE) then
  1040.         print_desc(here.exitfail)
  1041.     else
  1042.         writeln('You can''t go that way.');
  1043. end;
  1044.  
  1045. procedure  exit_fail(dir: integer);
  1046. var
  1047.     tmp: string;
  1048.  
  1049. begin
  1050.     if (dir < 1) or (dir > maxexit) then
  1051.         default_fail
  1052.     else if (here.exits[dir].fail = DEFAULT_LINE) then begin
  1053.         case here.exits[dir].kind of
  1054.             5: writeln('There isn''t an exit there yet.');
  1055.             6: writeln('You don''t have the power to go there.');
  1056.             otherwise default_fail;
  1057.         end;
  1058.     end else if here.exits[dir].fail <> 0 then
  1059.         block_subs(here.exits[dir].fail,myname);
  1060.  
  1061.  
  1062. { now print the exit failure message for everyone else in the room:
  1063.     if they tried to go through a valid exit,
  1064.       and the exit has an other-person failure desc, then
  1065.         substitute that one & use;
  1066.  
  1067.     if there is a room default other-person failure desc, then
  1068.         print that;
  1069.  
  1070.     if they tried to go through a valid exit,
  1071.       and the exit has no required alias, then
  1072.         print default exit fail
  1073.     else
  1074.         print generic "didn't leave room" message
  1075.  
  1076. cases:
  1077. 1) valid/alias exit and specific fail message
  1078. 2) valid/alias exit and blanket fail message
  1079. 3) valid exit (no specific or blanket) "x fails to go [direct]"
  1080. 4) alias exit and blanket fail
  1081. 5) blanket fail
  1082. 6) generic fail
  1083. }
  1084.  
  1085.     if dir <> 0 then
  1086.         log_event(myslot,E_FAILGO,dir,0);
  1087. end;
  1088.  
  1089.  
  1090.  
  1091. procedure do_exit; { (exit_slot: integer)-- declared forward }
  1092. var
  1093.     orig_slot,
  1094.     targ_slot,
  1095.     orig_room,
  1096.     enter_slot,
  1097.     targ_room: integer;
  1098.     doalook: boolean;
  1099.  
  1100. begin
  1101.     if (exit_slot < 1) or (exit_slot > 6) then
  1102.         exit_fail(exit_slot)
  1103.     else if here.exits[exit_slot].toloc > 0 then begin
  1104.         block_subs(here.exits[exit_slot].success,myname);
  1105.  
  1106.         orig_slot := myslot;
  1107.         orig_room := location;
  1108.         targ_room := here.exits[exit_slot].toloc;
  1109.         enter_slot := here.exits[exit_slot].slot;
  1110.         doalook := here.exits[exit_slot].autolook;
  1111.  
  1112.                 { optimization for exit that goes nowhere;
  1113.                   why go nowhere?  For special effects, we
  1114.                   don't want it to take too much time,
  1115.                   the logs are important because they force the
  1116.                   exit descriptions, but actually moving the
  1117.                   player is unnecessary }
  1118.  
  1119.         if orig_room = targ_room then begin
  1120.             log_exit(exit_slot,orig_room,orig_slot);
  1121.             log_entry(enter_slot,targ_room,orig_slot);
  1122.                 { orig_slot in log_entry 'cause we're not
  1123.                   really going anwhere }
  1124.             if doalook then
  1125.                 do_look;
  1126.         end else begin
  1127.             take_token(orig_slot,orig_room);
  1128.             if not put_token(targ_room,targ_slot) then begin
  1129.                     { no room in room! }
  1130. { put them back! Quick! }    if not put_token(orig_room,myslot) then begin
  1131.                     writeln('%Oh no!');
  1132.                     halt;
  1133.                 end;
  1134.             end else begin
  1135.                 log_exit(exit_slot,orig_room,orig_slot);
  1136.                 log_entry(enter_slot,targ_room,targ_slot);
  1137.  
  1138.                 myslot := targ_slot;
  1139.                 location := targ_room;
  1140.                 setevent;
  1141.     
  1142.                 if doalook then
  1143.                     do_look;
  1144.             end;
  1145.         end;
  1146.     end else
  1147.         exit_fail(exit_slot);
  1148. end;
  1149.  
  1150.  
  1151.  
  1152. function cycle_open: boolean;
  1153. var
  1154.     ch: char;
  1155.     s: string;
  1156.  
  1157. begin
  1158.     s := systime;
  1159.     ch := s[5];
  1160.     if ch in ['1','3','5','7','9'] then
  1161.         cycle_open := true
  1162.     else
  1163.         cycle_open := false;
  1164. end;
  1165.  
  1166.  
  1167. function which_dir(var dir:integer;s: string): boolean;
  1168. var
  1169.     aliasdir, exitdir: integer;
  1170.     aliasmatch,exitmatch,
  1171.     aliasexact,exitexact: boolean;
  1172.     exitreq: boolean;
  1173.  
  1174. begin
  1175.     s := lowcase(s);
  1176.     if lookup_alias(aliasdir,s) then
  1177.         aliasmatch := true
  1178.     else
  1179.         aliasmatch := false;
  1180.     if lookup_dir(exitdir,s) then
  1181.         exitmatch := true
  1182.     else
  1183.         exitmatch := false;
  1184.     if aliasmatch then begin
  1185.         if s = here.exits[aliasdir].alias then
  1186.             aliasexact := true
  1187.         else
  1188.             aliasexact := false;
  1189.     end else
  1190.         aliasexact := false;
  1191.     if exitmatch then begin
  1192.         if (s = direct[exitdir]) or (s = substr(direct[exitdir],1,1)) then
  1193.             exitexact := true
  1194.         else
  1195.             exitexact := false;
  1196.     end else
  1197.         exitexact := false;
  1198.     if exitmatch then
  1199.         exitreq := here.exits[exitdir].reqalias
  1200.     else
  1201.         exitreq := false;
  1202.  
  1203.     dir := 0;
  1204.     which_dir := true;
  1205.     if aliasexact and exitexact then
  1206.         dir := aliasdir
  1207.     else if aliasexact then
  1208.         dir := aliasdir
  1209.     else if exitexact and not exitreq then
  1210.         dir := exitdir
  1211.     else if aliasmatch then
  1212.         dir := aliasdir
  1213.     else if exitmatch and not exitreq then
  1214.         dir := exitdir
  1215.     else if exitmatch and exitreq then begin
  1216.         dir := exitdir;
  1217.         which_dir := false;
  1218.     end else begin
  1219.         which_dir := false;
  1220.     end;
  1221. end;
  1222.  
  1223.  
  1224. procedure exit_case(dir: integer);
  1225.  
  1226. begin
  1227.     case here.exits[dir].kind of
  1228.         0: exit_fail(dir);
  1229.         1: do_exit(dir);  { more checking goes here }
  1230.  
  1231.         3: if obj_hold(here.exits[dir].objreq) then
  1232.             exit_fail(dir)
  1233.            else
  1234.             do_exit(dir);
  1235.         4: if rnd100 < 34 then
  1236.             do_exit(dir)
  1237.            else
  1238.             exit_fail(dir);
  1239.  
  1240.         2: begin
  1241.             if obj_hold(here.exits[dir].objreq) then
  1242.                 do_exit(dir)
  1243.             else
  1244.                 exit_fail(dir);
  1245.            end;
  1246.         6: if obj_hold(here.exits[dir].objreq) then
  1247.             do_exit(dir)
  1248.              else
  1249.             exit_fail(dir);
  1250.         7: if cycle_open then
  1251.             do_exit(dir)
  1252.            else
  1253.         exit_fail(dir);
  1254.     end;
  1255. end;
  1256.  
  1257. {
  1258. Player wants to go to s
  1259. Handle everthing, this is the top level procedure
  1260.  
  1261. Check that he can go to s
  1262. Put him through the exit    ( in do_exit )
  1263. Do a look for him        ( in do_exit )
  1264. }
  1265. procedure do_go(s: string;verb:boolean := true);
  1266. var
  1267.     dir: integer;
  1268.  
  1269. begin
  1270.     gethere;
  1271.     if checkhide then begin
  1272.         if length(s) = 0 then
  1273.             writeln('You must give the direction you wish to travel.')
  1274.         else begin
  1275.             if which_dir(dir,s) then begin
  1276.                 if (dir >= 1) and (dir <= maxexit) then begin
  1277.                     if here.exits[dir].toloc = 0 then begin
  1278.                         exit_fail(dir);
  1279.                     end else begin
  1280.                         exit_case(dir);
  1281.                     end;
  1282.                 end else
  1283.                     exit_fail(dir);
  1284.             end else
  1285.                 exit_fail(dir);
  1286.         end;
  1287.     end;
  1288. end;
  1289.  
  1290.  
  1291. procedure nice_say(var s: string);
  1292.  
  1293. begin
  1294.         { capitalize the first letter of their sentence }
  1295.  
  1296.     if s[1] in ['a'..'z'] then
  1297.         s[1] := chr( ord('A') + (ord(s[1]) - ord('a')) );
  1298.  
  1299.             { put a period on the end of their sentence if
  1300.               they don't use any punctuation. }
  1301.  
  1302.     if s[length(s)] in ['a'..'z','A'..'Z'] then
  1303.         s := s + '.';
  1304. end;
  1305.  
  1306.  
  1307. procedure do_say(s:string);
  1308.  
  1309. begin
  1310.     if length(s) > 0 then begin
  1311.  
  1312. {        if length(s) + length(myname) > 79 then begin
  1313.             s := substr(s,1,75-length(myname));
  1314.             writeln('Your message was truncated:');
  1315.             writeln('-- ',s);
  1316.         end;                    }
  1317.  
  1318.         nice_say(s);
  1319.         if hiding then
  1320.             log_event(myslot,E_HIDESAY,0,0,s)
  1321.         else
  1322.             log_event(myslot,E_SAY,0,0,s);
  1323.     end else
  1324.         writeln('To talk to others in the room, type SAY <message>.');
  1325. end;
  1326.  
  1327. procedure do_setname(s: string);
  1328. var
  1329.     notice: string;
  1330.     ok: boolean;
  1331.     dummy: integer;
  1332.     sprime: string;
  1333.  
  1334. begin
  1335.     gethere;
  1336.     if s <> '' then begin
  1337.     if length(s) <= shortlen then begin
  1338.         sprime := lowcase(s);
  1339.         if (sprime = 'monster manager') and (userid <> MM_userid) then begin
  1340.             writeln('Only the Monster Manager can have that personal name.');
  1341.             ok := false;
  1342.         end else if (sprime = 'vice manager') and (userid <> MVM_userid) then begin
  1343.             writeln('Only the Vice Manager can have that name.');
  1344.             ok := false;
  1345.         end else if (sprime = 'faust') and (userid <> FAUST_userid) then begin
  1346.             writeln('You are not Faust!  You may not have that name.');
  1347.             ok := false;
  1348.         end else
  1349.             ok := true;
  1350.  
  1351.         if ok then
  1352.             if exact_pers(dummy,sprime) then begin
  1353.                 if dummy = myslot then
  1354.                     ok := true
  1355.                 else begin
  1356.                     writeln('Someone already has that name.  Your personal name must be unique.');
  1357.                     ok := false;
  1358.                 end;
  1359.             end;
  1360.  
  1361.         if ok then begin
  1362.             myname := s;
  1363.             getroom;
  1364.             notice := here.people[myslot].name;
  1365.             here.people[myslot].name := s;
  1366.             putroom;
  1367.             notice := notice + ' is now known as ' + s;
  1368.  
  1369.             if not(hiding) then
  1370.                 log_event(0,E_SETNAM,0,0,notice);
  1371.                     { slot 0 means notify this player also }
  1372.  
  1373.             getpers;    { note the new personal name in the logfile }
  1374.             pers.idents[mylog] := s; { don't lowcase it }
  1375.             putpers;
  1376.         end;
  1377.     end else
  1378.         writeln('Please limit your personal name to ',shortlen:1,' characters.');
  1379.     end else
  1380.         writeln('You are known to others as ',myname);
  1381. end;
  1382.  
  1383. function sysdate:string;
  1384. var
  1385.     thedate: packed array[1..11] of char;
  1386.  
  1387. begin
  1388.     date(thedate);
  1389.     sysdate := thedate;
  1390. end;
  1391.  
  1392.  
  1393. {
  1394. 1234567890123456789012345678901234567890
  1395. example display for alignment:
  1396.  
  1397.        Monster Status
  1398.     19-MAR-1988 08:59pm
  1399.  
  1400. }
  1401.  
  1402. procedure do_who;
  1403. var
  1404.     i,j: integer;
  1405.     ok: boolean;
  1406.     metaok: boolean;
  1407.     roomown: veryshortstring;
  1408.  
  1409. begin
  1410.     log_event(myslot,E_WHO,0,(rnd100 mod 4));
  1411.  
  1412.     { we need just about everything to print this list:
  1413.         player alloc index, userids, personal names,
  1414.         room names, room owners, and the log record    }
  1415.  
  1416.     getindex(I_ASLEEP);    { Get index of people who are playing now }
  1417.     freeindex;
  1418.     getuser;
  1419.     freeuser;
  1420.     getpers;
  1421.     freepers;
  1422.     getnam;
  1423.     freenam;
  1424.     getown;
  1425.     freeown;
  1426.     getint(N_LOCATION);    { get where they are }
  1427.     freeint;
  1428.     writeln('                   Monster Status');
  1429.     writeln('                ',sysdate,' ',systime);
  1430.     writeln;
  1431.     writeln('Username        Game Name                 Where');
  1432.  
  1433.     if (privd) { or has_kind(O_ALLSEEING) } then
  1434.         metaok := true
  1435.     else
  1436.         metaok := false;
  1437.  
  1438.     for i := 1 to indx.top do begin
  1439.         if not(indx.free[i]) then begin
  1440.             write(user.idents[i]);
  1441.             j := length(user.idents[i]);
  1442.             while j < 16 do begin
  1443.                 write(' ');
  1444.                 j := j + 1;
  1445.             end;
  1446.  
  1447.             write(pers.idents[i]);
  1448.             j := length(pers.idents[i]);
  1449.             while j <= 25 do begin
  1450.                 write(' ');
  1451.                 j := j + 1;
  1452.             end;
  1453.  
  1454.             if not(metaok) then begin
  1455.                 roomown := own.idents[anint.int[i]];
  1456.  
  1457. { if a person is in a public or disowned room, or
  1458.   if they are in the domain of the WHOer, then the player should know
  1459.   where they are  }
  1460.  
  1461.                 if (roomown = '') or (roomown = '*') or
  1462.                     (roomown = userid) then
  1463.                     ok := true
  1464.                 else
  1465.                     ok := false;
  1466.  
  1467.  
  1468. { the player obviously knows where he is }
  1469.                 if i = mylog then
  1470.                     ok := true;
  1471.             end;
  1472.  
  1473.  
  1474.             if ok or metaok then begin
  1475.                 writeln(nam.idents[anint.int[i]]);
  1476.             end else
  1477.                 writeln('n/a');
  1478.         end;
  1479.     end;
  1480. end;
  1481.  
  1482. function own_trans(s: string): string;
  1483.  
  1484. begin
  1485.     if s = '' then
  1486.         own_trans := '<public>'
  1487.     else if s = '*' then
  1488.         own_trans := '<disowned>'
  1489.     else
  1490.         own_trans := s;
  1491. end;
  1492.  
  1493.  
  1494. procedure list_rooms(s: shortstring);
  1495. var
  1496.     first: boolean;
  1497.     i,j,posit: integer;
  1498.  
  1499. begin
  1500.     first := true;
  1501.     posit := 0;
  1502.     for i := 1 to indx.top do begin
  1503.         if (not indx.free[i]) and (own.idents[i] = s) then begin
  1504.             if posit = 3 then begin
  1505.                 posit := 1;
  1506.                 writeln;
  1507.             end else
  1508.                 posit := posit + 1;
  1509.             if first then begin
  1510.                 first := false;
  1511.                 writeln(own_trans(s),':');
  1512.             end;
  1513.             write('    ',nam.idents[i]);
  1514.             for j := length(nam.idents[i]) to 21 do
  1515.                 write(' ');
  1516.         end;
  1517.     end;
  1518.     if posit <> 3 then
  1519.         writeln;
  1520.     if first then
  1521.         writeln('No rooms owned by ',own_trans(s))
  1522.     else
  1523.         writeln;
  1524. end;
  1525.  
  1526.  
  1527. procedure list_all_rooms;
  1528. var
  1529.     i,j: integer;
  1530.     tmp: packed array[1..maxroom] of boolean;
  1531.  
  1532. begin
  1533.     tmp := zero;
  1534.     list_rooms('');        { public rooms first }
  1535.     list_rooms('*');    { disowned rooms next }
  1536.     for i := 1 to indx.top do begin
  1537.         if not(indx.free[i]) and not(tmp[i]) and
  1538.            (own.idents[i] <> '') and (own.idents[i] <> '*') then begin
  1539.                 list_rooms(own.idents[i]);    { player rooms }
  1540.                 for j := 1 to indx.top do
  1541.                     if own.idents[j] = own.idents[i] then
  1542.                         tmp[j] := TRUE;
  1543.         end;
  1544.     end;
  1545. end;
  1546.  
  1547. procedure do_rooms(s: string);
  1548. var
  1549.     cmd: string;
  1550.     id: veryshortstring;
  1551.     listall: boolean;
  1552.  
  1553. begin
  1554.     getnam;
  1555.     freenam;
  1556.     getown;
  1557.     freeown;
  1558.     getindex(I_ROOM);
  1559.     freeindex;
  1560.  
  1561.     listall := false;
  1562.     s := lowcase(s);
  1563.     cmd := bite(s);
  1564.     if cmd = '' then
  1565.         id := userid
  1566.     else if cmd = 'public' then
  1567.         id := ''
  1568.     else if cmd = 'disowned' then
  1569.         id := '*'
  1570.     else if cmd = '<public>' then
  1571.         id := ''
  1572.     else if cmd = '<disowned>' then
  1573.         id := '*'
  1574.     else if cmd = '*' then
  1575.         listall := true
  1576.     else if length(cmd) > veryshortlen then
  1577.         id := substr(cmd,1,veryshortlen)
  1578.     else
  1579.         id := cmd;
  1580.  
  1581.     if listall then begin
  1582.         if privd then
  1583.             list_all_rooms
  1584.         else
  1585.             writeln('You may not obtain a list of all the rooms.');
  1586.     end else begin
  1587.         if privd or (userid = id) or (id = '') or (id = '*') then
  1588.             list_rooms(id)
  1589.         else
  1590.             writeln('You may not list rooms that belong to another player.');
  1591.     end;
  1592. end;
  1593.  
  1594.  
  1595.  
  1596. procedure do_objects;
  1597. var
  1598.     i: integer;
  1599.     total,public,disowned,private: integer;
  1600.  
  1601. begin
  1602.     getobjnam;
  1603.     freeobjnam;
  1604.     getobjown;
  1605.     freeobjown;
  1606.     getindex(I_OBJECT);
  1607.     freeindex;
  1608.  
  1609.     total := 0;
  1610.     public := 0;
  1611.     disowned := 0;
  1612.     private := 0;
  1613.  
  1614.     writeln;
  1615.     for i := 1 to indx.top do begin
  1616.         if not(indx.free[i]) then begin
  1617.             total := total + 1;
  1618.             if objown.idents[i]='' then begin
  1619.                 writeln(i:4,'    ','<public>':12,'    ',objnam.idents[i]);
  1620.                 public := public + 1
  1621.             end else if objown.idents[i]='*' then begin
  1622.                 writeln(i:4,'    ','<disowned>':12,'    ',objnam.idents[i]);
  1623.                 disowned := disowned + 1
  1624.             end else begin
  1625.                 private := private + 1;
  1626.  
  1627.                 if (objown.idents[i] = userid) or
  1628.                  (privd) then begin
  1629. { >>>>>> }    writeln(i:4,'    ',objown.idents[i]:12,'    ',objnam.idents[i]);
  1630.                 end;
  1631.             end;
  1632.         end;
  1633.     end;
  1634.     writeln;
  1635.     writeln('Public:      ',public:4);
  1636.     writeln('Disowned:    ',disowned:4);
  1637.     writeln('Private:     ',private:4);
  1638.     writeln('             ----');
  1639.     writeln('Total:       ',total:4);
  1640. end;
  1641.  
  1642.  
  1643. procedure do_claim(s: string);
  1644. var
  1645.     n: integer;
  1646.     ok: boolean;
  1647.     tmp: string;
  1648.  
  1649. begin
  1650.     if length(s) = 0 then begin    { claim this room }
  1651.         getroom;
  1652.         if (here.owner = '*') or (privd) then begin
  1653.             here.owner := userid;
  1654.             putroom;
  1655.             getown;
  1656.             own.idents[location] := userid;
  1657.             putown;
  1658.             log_event(myslot,E_CLAIM,0,0);
  1659.             writeln('You are now the owner of this room.');
  1660.         end else begin
  1661.             freeroom;
  1662.             if here.owner = '' then
  1663.                 writeln('This is a public room.  You may not claim it.')
  1664.             else
  1665.                 writeln('This room has an owner.');
  1666.         end;
  1667.     end else if lookup_obj(n,s) then begin
  1668.         getobjown;
  1669.         freeobjown;
  1670.         if objown.idents[n] = '' then
  1671.             writeln('That is a public object.  You may DUPLICATE it, but may not CLAIM it.')
  1672.         else if objown.idents[n] <> '*' then
  1673.             writeln('That object has an owner.')
  1674.         else begin
  1675.             getobj(n);
  1676.             freeobj;
  1677.             if obj.numexist = 0 then
  1678.                 ok := true
  1679.             else begin
  1680.                 if obj_hold(n) or obj_here(n) then
  1681.                     ok := true
  1682.                 else
  1683.                     ok := false;
  1684.             end;
  1685.  
  1686.             if ok then begin
  1687.                 getobjown;
  1688.                 objown.idents[n] := userid;
  1689.                 putobjown;
  1690.                 tmp := obj.oname;
  1691.                 log_event(myslot,E_OBJCLAIM,0,0,tmp);
  1692.                 writeln('You are now the owner the ',tmp,'.');
  1693.             end else
  1694.                 writeln('You must have one to claim it.');
  1695.         end;
  1696.     end else
  1697.         writeln('There is nothing here by that name to claim.');
  1698. end;
  1699.  
  1700. procedure do_disown(s: string);
  1701. var
  1702.     n: integer;
  1703.     tmp: string;
  1704.  
  1705. begin
  1706.     if length(s) = 0 then begin    { claim this room }
  1707.         getroom;
  1708.         if (here.owner = userid) or (privd) then begin
  1709.             getroom;
  1710.             here.owner := '*';
  1711.             putroom;
  1712.             getown;
  1713.             own.idents[location] := '*';
  1714.             putown;
  1715.             log_event(myslot,E_DISOWN,0,0);
  1716.             writeln('You have disowned this room.');
  1717.         end else begin
  1718.             freeroom;
  1719.             writeln('You are not the owner of this room.');
  1720.         end;
  1721.     end else begin    { disown an object }
  1722.         if lookup_obj(n,s) then begin
  1723.             getobj(n);
  1724.             freeobj;
  1725.             tmp := obj.oname;
  1726.  
  1727.             getobjown;
  1728.             if objown.idents[n] = userid then begin
  1729.                 objown.idents[n] := '*';
  1730.                 putobjown;
  1731.                 log_event(myslot,E_OBJDISOWN,0,0,tmp);
  1732.                 writeln('You are no longer the owner of the ',tmp,'.');
  1733.             end else begin
  1734.                 freeobjown;
  1735.                 writeln('You are not the owner of any such thing.');
  1736.             end;
  1737.         end else
  1738.             writeln('You are not the owner of any such thing.');
  1739.     end;
  1740. end;
  1741.  
  1742.  
  1743. procedure do_public(s: string);
  1744. var
  1745.     ok: boolean;
  1746.     tmp: string;
  1747.     n: integer;
  1748.  
  1749. begin
  1750.     if privd then begin
  1751.         if length(s) = 0 then begin
  1752.             getroom;
  1753.             here.owner := '';
  1754.             putroom;
  1755.             getown;
  1756.             own.idents[location] := '';
  1757.             putown;
  1758.         end else if lookup_obj(n,s) then begin
  1759.             getobjown;
  1760.             freeobjown;
  1761.             if objown.idents[n] = '' then
  1762.                 writeln('That is already public.')
  1763.             else begin
  1764.                 getobj(n);
  1765.                 freeobj;
  1766.                 if obj.numexist = 0 then
  1767.                     ok := true
  1768.                 else begin
  1769.                     if obj_hold(n) or obj_here(n) then
  1770.                         ok := true
  1771.                     else
  1772.                         ok := false;
  1773.                 end;
  1774.  
  1775.                 if ok then begin
  1776.                     getobjown;
  1777.                     objown.idents[n] := '';
  1778.                     putobjown;
  1779.  
  1780.                     tmp := obj.oname;
  1781.                     log_event(myslot,E_OBJPUBLIC,0,0,tmp);
  1782.                     writeln('The ',tmp,' is now public.');
  1783.                 end else
  1784.                     writeln('You must have one to claim it.');
  1785.             end;
  1786.         end else
  1787.             writeln('There is nothing here by that name to claim.');
  1788.     end else
  1789.         writeln('Only the Monster Manager may make things public.');
  1790. end;
  1791.  
  1792.  
  1793.  
  1794. { sum up the number of real exits in this room }
  1795.  
  1796. function find_numexits: integer;
  1797. var
  1798.     i: integer;
  1799.     sum: integer;
  1800.  
  1801. begin
  1802.     sum := 0;
  1803.     for i := 1 to maxexit do
  1804.         if here.exits[i].toloc <> 0 then
  1805.             sum := sum + 1;
  1806.     find_numexits := sum;
  1807. end;
  1808.  
  1809.  
  1810.  
  1811. { clear all people who have played monster and quit in this location
  1812.   out of the room so that when they start up again they won't be here,
  1813.   because we are destroying this room }
  1814.  
  1815. procedure clear_people(loc: integer);
  1816. var
  1817.     i: integer;
  1818.  
  1819. begin
  1820.     getint(N_LOCATION);
  1821.     for i := 1 to maxplayers do
  1822.         if anint.int[i] = loc then
  1823.             anint.int[i] := 1;
  1824.     putint;
  1825. end;
  1826.  
  1827.  
  1828. procedure do_zap(s: string);
  1829. var
  1830.     loc: integer;
  1831.  
  1832. begin
  1833.     gethere;
  1834.     if checkhide then begin
  1835.     if lookup_room(loc,s) then begin
  1836.         gethere(loc);
  1837.         if (here.owner = userid) or (privd) then begin
  1838.             clear_people(loc);
  1839.             if find_numpeople = 0 then begin
  1840.                 if find_numexits = 0 then begin
  1841.                     if find_numobjs = 0 then begin
  1842.                         del_room(loc);
  1843.                         writeln('Room deleted.');
  1844.                     end else
  1845.                         writeln('You must remove all of the objects from that room first.');
  1846.                 end else
  1847.                     writeln('You must delete all of the exits from that room first.');
  1848.             end else
  1849.                 writeln('Sorry, you cannot destroy a room if people are still in it.');
  1850.         end else
  1851.             writeln('You are not the owner of that room.');
  1852.     end else
  1853.         writeln('There is no room named ',s,'.');
  1854.     end;
  1855. end;
  1856.  
  1857.  
  1858. function room_nameinuse(num: integer; newname: string): boolean;
  1859. var
  1860.     dummy: integer;
  1861.  
  1862. begin
  1863.     if exact_obj(dummy,newname) then begin
  1864.         if dummy = num then
  1865.             room_nameinuse := false
  1866.         else
  1867.             room_nameinuse := true;
  1868.     end else
  1869.         room_nameinuse := false;
  1870. end;
  1871.  
  1872.  
  1873.  
  1874. procedure do_rename;
  1875. var
  1876.     dummy: integer;
  1877.     newname: string;
  1878.     s: string;
  1879.  
  1880. begin
  1881.     gethere;
  1882.     writeln('This room is named ',here.nicename);
  1883.     writeln;
  1884.     grab_line('New name: ',newname);
  1885.     if (newname = '') or (newname = '**') then
  1886.         writeln('No changes.')
  1887.     else if length(newname) > shortlen then
  1888.         writeln('Please limit your room name to ',shortlen:1,' characters.')
  1889.     else if room_nameinuse(location,newname) then
  1890.         writeln(newname,' is not a unique room name.')
  1891.     else begin
  1892.         getroom;
  1893.         here.nicename := newname;
  1894.         putroom;
  1895.  
  1896.         getnam;
  1897.         nam.idents[location] := lowcase(newname);
  1898.         putnam;
  1899.         writeln('Room name updated.');
  1900.     end;
  1901. end;
  1902.  
  1903.  
  1904. function obj_nameinuse(objnum: integer; newname: string): boolean;
  1905. var
  1906.     dummy: integer;
  1907.  
  1908. begin
  1909.     if exact_obj(dummy,newname) then begin
  1910.         if dummy = objnum then
  1911.             obj_nameinuse := false
  1912.         else
  1913.             obj_nameinuse := true;
  1914.     end else
  1915.         obj_nameinuse := false;
  1916. end;
  1917.  
  1918.  
  1919. procedure do_objrename(objnum: integer);
  1920. var
  1921.     newname: string;
  1922.     s: string;
  1923.  
  1924. begin
  1925.     getobj(objnum);
  1926.     freeobj;
  1927.  
  1928.     writeln('This object is named ',obj.oname);
  1929.     writeln;
  1930.     grab_line('New name: ',newname);
  1931.     if (newname = '') or (newname = '**') then
  1932.         writeln('No changes.')
  1933.     else if length(newname) > shortlen then
  1934.         writeln('Please limit your object name to ',shortlen:1,' characters.')
  1935.     else if obj_nameinuse(objnum,newname) then
  1936.         writeln(newname,' is not a unique object name.')
  1937.     else begin
  1938.         getobj(objnum);
  1939.         obj.oname := newname;
  1940.         putobj;
  1941.  
  1942.         getobjnam;
  1943.         objnam.idents[objnum] := lowcase(newname);
  1944.         putobjnam;
  1945.         writeln('Object name updated.');
  1946.     end;
  1947. end;
  1948.  
  1949.  
  1950.  
  1951. procedure view_room;
  1952. var
  1953.     s: string;
  1954.     i: integer;
  1955.  
  1956. begin
  1957.     writeln;
  1958.     getnam;
  1959.     freenam;
  1960.     getobjnam;
  1961.     freeobjnam;
  1962.  
  1963.     with here do begin
  1964.         writeln('Room:        ',nicename);
  1965.         case nameprint of
  1966.             0: writeln('Room name not printed');
  1967.             1: writeln('"You''re in" precedes room name');
  1968.             2: writeln('"You''re at" precedes room name');
  1969.             otherwise writeln('Room name printing is damaged.');
  1970.         end;
  1971.  
  1972.         write('Room owner:    ');
  1973.         if owner = '' then
  1974.             writeln('<public>')
  1975.         else if owner = '*' then
  1976.             writeln('<disowned>')
  1977.         else
  1978.             writeln(owner);
  1979.  
  1980.         if primary = 0 then
  1981.             writeln('There is no primary description')
  1982.         else
  1983.             writeln('There is a primary description');
  1984.  
  1985.         if secondary = 0 then
  1986.             writeln('There is no secondary description')
  1987.         else
  1988.             writeln('There is a secondary description');
  1989.  
  1990.         case which of
  1991.             0: writeln('Only the primary description will print');
  1992.             1: writeln('Only the secondary description will print');
  1993.             2: writeln('Both the primary and secondary descriptions will print');
  1994.             3: begin
  1995.                 writeln('The primary description will print, followed by the seconary description');
  1996.                 writeln('if the player is holding the magic object');
  1997.                end;
  1998.             4: begin
  1999.                 writeln('If the player is holding the magic object, the secondary description will print');
  2000.                 writeln('Otherwise, the primary description will print');
  2001.                end;
  2002.             otherwise writeln('The way the room description prints is damaged');
  2003.         end;
  2004.  
  2005.         writeln;
  2006.         if magicobj = 0 then
  2007.             writeln('There is no magic object for this room')
  2008.         else
  2009.             writeln('The magic object for this room is the ',objnam.idents[magicobj],'.');
  2010.  
  2011.         if objdrop = 0 then
  2012.             writeln('Dropped objects remain here')
  2013.         else begin
  2014.             writeln('Dropped objects go to ',nam.idents[objdrop],'.');
  2015.             if objdesc = 0 then
  2016.                 writeln('Dropped.')
  2017.             else
  2018.                 print_line(objdesc);
  2019.             if objdest = 0 then
  2020.                 writeln('Nothing is printed when object "bounces in" to target room')
  2021.             else
  2022.                 print_line(objdest);
  2023.         end;
  2024.         writeln;
  2025.         if trapto = 0 then
  2026.             writeln('There is no trapdoor set')
  2027.         else
  2028.             writeln('The trapdoor sends players ',direct[trapto],
  2029.                 ' with a chance factor of ',trapchance:1,'%');
  2030.  
  2031.         for i := 1 to maxdetail do begin
  2032.             if length(detail[i]) > 0 then begin
  2033.                 write('Detail "',detail[i],'" ');
  2034.                 if detaildesc[i] > 0 then
  2035.                     writeln('has a description')
  2036.                 else
  2037.                     writeln('has no description');
  2038.             end;
  2039.         end;
  2040.         writeln;
  2041.     end;
  2042. end;
  2043.  
  2044.  
  2045. procedure room_help;
  2046.  
  2047. begin
  2048.     writeln;
  2049.     writeln('D    Alter the way the room description prints');
  2050.     writeln('N    Change how the room Name prints');
  2051.     writeln('P    Edit the Primary room description [the default one] (same as desc)');
  2052.     writeln('S    Edit the Secondary room description');
  2053.     writeln('X    Define a mystery message');
  2054.     writeln;
  2055.     writeln('G    Set the location that a dropped object really Goes to');
  2056.     writeln('O    Edit the object drop description (for drop effects)');
  2057.     writeln('B    Edit the target room (G) "bounced in" description');
  2058.     writeln;
  2059.     writeln('T    Set the direction that the Trapdoor goes to');
  2060.     writeln('C    Set the Chance of the trapdoor functioning');
  2061.     writeln;
  2062.     writeln('M    Define the magic object for this room');
  2063.     writeln('R    Rename the room');
  2064.     writeln;
  2065.     writeln('V    View settings on this room');
  2066.     writeln('E    Exit (same as quit)');
  2067.     writeln('Q    Quit (same as exit)');
  2068.     writeln('?    This list');
  2069.     writeln;
  2070. end;
  2071.  
  2072.  
  2073.  
  2074. procedure custom_room;
  2075. var
  2076.     done: boolean;
  2077.     prompt: string;
  2078.     n: integer;
  2079.     s: string;
  2080.     newdsc: integer;
  2081.     bool: boolean;
  2082.  
  2083. begin
  2084.     log_action(e_custroom,0);
  2085.     writeln;
  2086.     writeln('Customizing this room');
  2087.     writeln('If you would rather be customizing an exit, type CUSTOM <direction of exit>');
  2088.     writeln('If you would rather be customizing an object, type CUSTOM <object name>');
  2089.     writeln;
  2090.     done := false;
  2091.     prompt := 'Custom> ';
  2092.  
  2093.     repeat
  2094.         repeat
  2095.             grab_line(prompt,s);
  2096.             s := slead(s);
  2097.         until length(s) > 0;
  2098.         s := lowcase(s);
  2099.         case s[1] of
  2100.  
  2101.             'e','q': done := true;
  2102.             '?','h': room_help;
  2103.             'r': do_rename;
  2104.             'v': view_room;
  2105. {dir trapdoor goes}    't': begin
  2106.                 grab_line('What direction does the trapdoor exit through? ',s);
  2107.                 if length(s) > 0 then begin
  2108.                     if lookup_dir(n,s) then begin
  2109.                         getroom;
  2110.                         here.trapto := n;
  2111.                         putroom;
  2112.                         writeln('Room updated.');
  2113.                     end else
  2114.                         writeln('No such direction.');
  2115.                 end else
  2116.                     writeln('No changes.');
  2117.                  end;
  2118. {chance}        'c': begin
  2119.                 writeln('Enter the chance that in any given minute the player will fall through');
  2120.                 writeln('the trapdoor (0-100) :');
  2121.                 writeln;
  2122.                 grab_line('? ',s);
  2123.                 if isnum(s) then begin
  2124.                     n := number(s);
  2125.                     if n in [0..100] then begin
  2126.                         getroom;
  2127.                         here.trapchance := n;
  2128.                         putroom;
  2129.                     end else
  2130.                         writeln('Out of range.');
  2131.                 end else
  2132.                     writeln('No changes.');
  2133.                  end;
  2134.             's': begin
  2135.                 newdsc := here.secondary;
  2136.                 writeln('[ Editing the secondary room description ]');
  2137.                 if edit_desc(newdsc) then begin
  2138.                     getroom;
  2139.                     here.secondary := newdsc;
  2140.                     putroom;
  2141.                 end;
  2142.                  end;
  2143.             'p': begin
  2144. { same as desc }        newdsc := here.primary;
  2145.                 writeln('[ Editing the primary room description ]');
  2146.                 if edit_desc(newdsc) then begin
  2147.                     getroom;
  2148.                     here.primary := newdsc;
  2149.                     putroom;
  2150.                 end;
  2151.                  end;
  2152.             'o': begin
  2153.                 writeln('Enter the line that will be printed when someone drops an object here:');
  2154.                 writeln('If dropped objects do not stay here, you may use a # for the object name.');
  2155.                 writeln('Right now it says:');
  2156.                 if here.objdesc = 0 then
  2157.                     writeln('Dropped. [default]')
  2158.                 else
  2159.                     print_line(here.objdesc);
  2160.  
  2161.                 n := here.objdesc;
  2162.                 make_line(n);
  2163.                 getroom;
  2164.                 here.objdesc := n;
  2165.                 putroom;
  2166.                  end;
  2167.             'x': begin
  2168.                 writeln('Enter a line that will be randomly shown.');
  2169.                 writeln('Right now it says:');
  2170.                 if here.objdesc = 0 then
  2171.                     writeln('[none defined]')
  2172.                 else
  2173.                     print_line(here.rndmsg);
  2174.  
  2175.                 n := here.rndmsg;
  2176.                 make_line(n);
  2177.                 getroom;
  2178.                 here.rndmsg := n;
  2179.                 putroom;
  2180.                  end;
  2181. {bounced in desc}    'b': begin
  2182.                 writeln('Enter the line that will be displayed in the room where an object really');
  2183.                 writeln('goes when an object dropped here "bounces" there:');
  2184.                 writeln('Place a # where the object name should go.');
  2185.                 writeln;
  2186.                 writeln('Right now it says:');
  2187.                 if here.objdest = 0 then
  2188.                     writeln('Something has bounced into the room.')
  2189.                 else
  2190.                     print_line(here.objdest);
  2191.  
  2192.                 n := here.objdest;
  2193.                 make_line(n);
  2194.                 getroom;
  2195.                 here.objdest := n;
  2196.                 putroom;
  2197.                  end;
  2198.             'm': begin
  2199.                 getobjnam;
  2200.                 freeobjnam;
  2201.                 if here.magicobj = 0 then
  2202.                     writeln('There is currently no magic object for this room.')
  2203.                 else
  2204.                     writeln(objnam.idents[here.magicobj],
  2205.                         ' is currently the magic object for this room.');
  2206.                 writeln;
  2207.                 grab_line('New magic object? ',s);
  2208.                 if s = '' then
  2209.                     writeln('No changes.')
  2210.                 else if lookup_obj(n,s) then begin
  2211.                     getroom;
  2212.                     here.magicobj := n;
  2213.                     putroom;
  2214.                     writeln('Room updated.');
  2215.                 end else
  2216.                     writeln('No such object found.');
  2217.                  end;
  2218.             'g': begin
  2219.                 getnam;
  2220.                 freenam;
  2221.                 if here.objdrop = 0 then
  2222.                     writeln('Objects dropped fall here.')
  2223.                 else
  2224.                     writeln('Objects dropped fall in ',nam.idents[here.objdrop],'.');
  2225.                 writeln;
  2226.                 writeln('Enter * for [this room]:');
  2227.                 grab_line('Room dropped objects go to? ',s);
  2228.                 if s = '' then
  2229.                     writeln('No changes.')
  2230.                 else if s = '*' then begin
  2231.                     getroom;
  2232.                     here.objdrop := 0;
  2233.                     putroom;
  2234.                     writeln('Room updated.');
  2235.                 end else if lookup_room(n,s) then begin
  2236.                     getroom;
  2237.                     here.objdrop := n;
  2238.                     putroom;
  2239.                     writeln('Room updated.');
  2240.                 end else
  2241.                     writeln('No such room found.');
  2242.                  end;
  2243.             'd': begin
  2244.                 writeln('Print room descriptions how?');
  2245.                 writeln;
  2246.                 writeln('0)  Print primary (main) description only [default]');
  2247.                 writeln('1)  Print only secondary description.');
  2248.                 writeln('2)  Print both primary and secondary descriptions togther.');
  2249.                 writeln('3)  Print primary description first; then print secondary description only if');
  2250.                 writeln('    the player is holding the magic object for this room.');
  2251.                 writeln('4)  Print secondary if holding the magic obj; print primary otherwise');
  2252.                 writeln;
  2253.                 grab_line('? ',s);
  2254.                 if isnum(s) then begin
  2255.                     n := number(s);
  2256.                     if n in [0..4] then begin
  2257.                         getroom;
  2258.                         here.which := n;
  2259.                         putroom;
  2260.                         writeln('Room updated.');
  2261.                     end else
  2262.                         writeln('Out of range.');
  2263.                 end else
  2264.                     writeln('No changes.');
  2265.  
  2266.                  end;
  2267.             'n': begin
  2268.                 writeln('How would you like the room name to print?');
  2269.                 writeln;
  2270.                 writeln('0) No room name is shown');
  2271.                 writeln('1) "You''re in ..."');
  2272.                 writeln('2) "You''re at ..."');
  2273.                 writeln;
  2274.                 grab_line('? ',s);
  2275.                 if isnum(s) then begin
  2276.                     n := number(s);
  2277.                     if n in [0..2] then begin
  2278.                         getroom;
  2279.                         here.nameprint := n;
  2280.                         putroom;
  2281.                     end else
  2282.                         writeln('Out of range.');
  2283.                 end else
  2284.                     writeln('No changes.');
  2285.                  end;
  2286.             otherwise writeln('Bad command, type ? for a list');
  2287.         end;
  2288.     until done;
  2289.     log_event(myslot,E_ROOMDONE,0,0);
  2290. end;
  2291.  
  2292. procedure analyze_exit(dir: integer);
  2293. var
  2294.     s: string;
  2295.  
  2296. begin
  2297.     writeln;
  2298.     getnam;
  2299.     freenam;
  2300.     getobjnam;
  2301.     freeobjnam;
  2302.     with here.exits[dir] do begin
  2303.         s := alias;
  2304.         if s = '' then
  2305.             s := '(no alias)'
  2306.         else
  2307.             s := '(alias ' + s + ')';
  2308.         if here.exits[dir].reqalias then
  2309.             s := s + ' (required)'
  2310.         else
  2311.             s := s + ' (not required)';
  2312.  
  2313.         if toloc <> 0 then
  2314.             writeln('The ',direct[dir],' exit ',s,' goes to ',nam.idents[toloc])
  2315.         else
  2316.             writeln('The ',direct[dir],' exit goes nowhere.');
  2317.         if hidden <> 0 then
  2318.             writeln('Concealed.');
  2319.         write('Exit type: ');
  2320.         case kind of
  2321.             0: writeln('no exit.');
  2322.             1: writeln('Open passage.');
  2323.             2: writeln('Door, object required to pass.');
  2324.             3: writeln('No passage if holding object.');
  2325.             4: writeln('Randomly fails');
  2326.             5: writeln('Potential exit.');
  2327.             6: writeln('Only exists while holding the required object.');
  2328.             7: writeln('Timed exit');
  2329.         end;
  2330.         if objreq = 0 then
  2331.             writeln('No required object.')
  2332.         else
  2333.             writeln('Required object is: ',objnam.idents[objreq]);
  2334.  
  2335.  
  2336.         writeln;
  2337.         if exitdesc = DEFAULT_LINE then
  2338.             exit_default(dir,kind)
  2339.         else
  2340.             print_line(exitdesc);
  2341.  
  2342.         if success = 0 then
  2343.             writeln('(no success message)')
  2344.         else
  2345.             print_desc(success);
  2346.  
  2347.         if fail = DEFAULT_LINE then begin
  2348.             if kind = 5 then
  2349.                 writeln('There isn'' an exit there yet.')
  2350.             else
  2351.                 writeln('You can''t go that way.');
  2352.         end else
  2353.             print_desc(fail);
  2354.  
  2355.         if comeout = DEFAULT_LINE then
  2356.             writeln('# has come into the room from: ',direct[dir])
  2357.         else
  2358.             print_desc(comeout);
  2359.         if goin = DEFAULT_LINE then
  2360.             writeln('# has gone ',direct[dir])
  2361.         else
  2362.             print_desc(goin);
  2363.  
  2364.         writeln;
  2365.         if autolook then
  2366.             writeln('LOOK automatically done after exit used')
  2367.         else
  2368.             writeln('LOOK supressed on exit use');
  2369.         if reqverb then
  2370.             writeln('The alias is required to be a verb for exit use')
  2371.         else
  2372.             writeln('The exit can be used with GO or as a verb');
  2373.     end;
  2374.     writeln;
  2375. end;
  2376.  
  2377. procedure custom_help;
  2378.  
  2379. begin
  2380.     writeln;
  2381.     writeln('A    Set an Alias for the exit');
  2382.     writeln('C    Conceal an exit');
  2383.     writeln('D    Edit the exit''s main Description');
  2384.     writeln('E    EXIT custom (saves changes)');
  2385.     writeln('F    Edit the exit''s failure line');
  2386.     writeln('I    Edit the line that others see when a player goes Into an exit');
  2387.     writeln('K    Set the object that is the Key to this exit');
  2388.     writeln('L    Automatically look [default] / don''t look on exit');
  2389.     writeln('O    Edit the line that people see when a player comes Out of an exit');
  2390.     writeln('Q    QUIT Custom (saves changes)');
  2391.     writeln('R    Require/don''t require alias for exit; ignore direction');
  2392.     writeln('S    Edit the success line');
  2393.     writeln('T    Alter Type of exit (passage, door, etc)');
  2394.     writeln('V    View exit information');
  2395.     writeln('X    Require/don''t require exit name to be a verb');
  2396.     writeln('?    This list');
  2397.     writeln;
  2398. end;
  2399.  
  2400.  
  2401. procedure get_key(dir: integer);
  2402. var
  2403.     s: string;
  2404.     n: integer;
  2405.  
  2406. begin
  2407.     getobjnam;
  2408.     freeobjnam;
  2409.     if here.exits[dir].objreq = 0 then
  2410.         writeln('Currently there is no key set for this exit.')
  2411.     else
  2412.         writeln(objnam.idents[here.exits[dir].objreq],' is the current key for this exit.');
  2413.     writeln('Enter * for [no key]');
  2414.     writeln;
  2415.  
  2416.     grab_line('What object is the door key? ',s);
  2417.     if length(s) > 0 then begin
  2418.         if s = '*' then begin
  2419.             getroom;
  2420.             here.exits[dir].objreq := 0;
  2421.             putroom;
  2422.             writeln('Exit updated.');
  2423.         end else if lookup_obj(n,s) then begin
  2424.             getroom;
  2425.             here.exits[dir].objreq := n;
  2426.             putroom;
  2427.             writeln('Exit updated.');
  2428.         end else
  2429.             writeln('There is no object by that name.');
  2430.     end else
  2431.         writeln('No changes.');
  2432. end;
  2433.  
  2434.