home *** CD-ROM | disk | FTP | other *** search
/ Amiga Games Extra 1996 May / Amiga_Games_Extra_CD_5-96.bin / spiele / publicdomain / amsrc / building / build1.m < prev    next >
Text File  |  1996-02-19  |  77KB  |  3,228 lines

  1. /*
  2.  * Amiga MUD
  3.  *
  4.  * Copyright (c) 1996 by Chris Gray
  5.  */
  6.  
  7. /*
  8.  * build - code to come after the full startup set to set up the commands
  9.  *    which allow simple room-building.
  10.  *    NOTE: most of the code must be 'utility', since we want the rooms,
  11.  *    etc. to be owned by the character issuing the commands.
  12.  */
  13.  
  14. private tp_build1 CreateTable().
  15. use tp_build1
  16.  
  17. define tp_build r_playPen CreateThing(r_indoors).
  18.  
  19. define tp_build p_rPlayPen CreateBoolProp().
  20. define tp_build1 p_pActiveDir CreateIntProp().
  21. define tp_build1 p_pActiveCode CreateStringProp().
  22. define tp_build1 p_pActiveState CreateIntProp().
  23. define tp_build1 p_pSaveState CreateIntProp().
  24.     define tp_build1 st_noState     0.
  25.     define tp_build1 st_preCondition    1.
  26.     define tp_build1 st_condition    2.
  27.     define tp_build1 st_then        3.
  28.     define tp_build1 st_else        4.
  29.     define tp_build1 st_descTrue    5.
  30.     define tp_build1 st_descFalse    6.
  31.     define tp_build1 st_descResult    7.
  32.     define tp_build1 st_condition2    8.
  33.     define tp_build1 st_then2        9.
  34.     define tp_build1 st_else2        10.
  35.     define tp_build1 STRING_FIRST    20.
  36.     define tp_build1 STRING_OTHER    40.
  37. define tp_build1 p_pHadCondition CreateBoolProp().
  38. define tp_build1 p_pCodeKind CreateIntProp().
  39.     define tp_build1 ck_roomChecker    0.
  40.     define tp_build1 ck_objectChecker    1.
  41.     define tp_build1 ck_roomDesc    2.
  42.     define tp_build1 ck_objectDesc    3.
  43.     define tp_build1 ck_roomVoid    4.
  44.     define tp_build1 ck_objectVoid    5.
  45. define tp_build1 p_pNewName CreateStringProp().
  46. define tp_build1 p_pActiveThing CreateThingProp().
  47. define tp_build1 p_pActiveTable CreateTableProp().
  48. define tp_build1 p_pActiveVerb CreateStringProp().
  49.  
  50. define tp_build1 wh_character     0.
  51. define tp_build1 wh_room     1.
  52. define tp_build1 wh_object     2.
  53.  
  54. CharacterThing(SysAdmin)@p_pBuilder := true.
  55.  
  56. define tp_build1 g_build CreateGrammar().
  57.  
  58. define tp_build1 proc utility v_build()bool:
  59.     string s;
  60.  
  61.     if Me()@p_pBuilder or Here()@p_rPlayPen then
  62.     s := GetTail();
  63.     if s = "" then
  64.         Print("Missing build command - "
  65.           "see builder's library for details.\n");
  66.         false
  67.     else
  68.         Parse(g_build, s) ~= 0
  69.     fi
  70.     else
  71.     Print("Sorry, you have not been enabled for building.\n");
  72.     false
  73.     fi
  74. corp;
  75.  
  76. VerbTail(G, "@", v_build).
  77. Synonym(G, "@", "b").
  78. Synonym(G, "@", "build").
  79. Synonym(G, "@", "construct").
  80.  
  81. define tp_build proc utility checkTable(string tableName)table:
  82.     table theTable;
  83.  
  84.     theTable := LookupTable(nil, tableName);
  85.     if theTable = nil then
  86.     if IsDefined(nil, tableName) then
  87.         Print("\"" + tableName + "\" is not a table.\n");
  88.     else
  89.         Print("\"" + tableName + "\" is not defined.\n");
  90.     fi;
  91.     nil
  92.     else
  93.     theTable
  94.     fi
  95. corp;
  96.  
  97. define tp_build1 proc utility findTable(string tableName; bool readOnly)table:
  98.     table theTable;
  99.  
  100.     if tableName == "public" then
  101.     if Me()@p_pBuilder or readOnly then
  102.         PublicTable()
  103.     else
  104.         Print("Only true builders can change the public symbol table.\n");
  105.         nil
  106.     fi
  107.     elif tableName == "private" then
  108.     PrivateTable()
  109.     else
  110.     checkTable(tableName)
  111.     fi
  112. corp;
  113.  
  114. /*****************************************************************************\
  115. *                                          *
  116. *        code to implement a 'compiler' for actions              *
  117. *                                          *
  118. \*****************************************************************************/
  119.  
  120. define tp_build1 proc utility error(string str)void:
  121.  
  122.     Print("*** " + str + ".\n");
  123.     if not Me()@p_pHidden then
  124.     OPrint(Capitalize(Me()@p_pName) +
  125.         " abruptly stops gesturing and grimaces.\n");
  126.     fi;
  127. corp;
  128.  
  129. define tp_build1 proc utility stringError(string w, str)void:
  130.     error("'" + w + "' " + str);
  131. corp;
  132.  
  133. define tp_build1 proc utility notCounter(string w)void:
  134.     stringError(w, "is not a defined counter");
  135. corp;
  136.  
  137. define tp_build1 proc utility notFlag(string w)void:
  138.     stringError(w, "is not a defined flag");
  139. corp;
  140.  
  141. define tp_build1 proc utility notString(string w)void:
  142.     stringError(w, "is not a defined string");
  143. corp;
  144.  
  145. define tp_build1 proc utility notObject(string w)void:
  146.     stringError(w, "is not an object-symbol");
  147. corp;
  148.  
  149. define tp_build1 proc utility notRoom(string w)void:
  150.     stringError(w, "is not a room-symbol");
  151. corp;
  152.  
  153. define tp_build1 proc utility checkWord(string w, nameTail1, nameTail2;
  154.                     int kind)bool:
  155.  
  156.     w == "character" + nameTail1 or w == "character" + nameTail2 or
  157.     w == "room" + nameTail1 or w == "room" + nameTail2 or
  158.     (kind = ck_objectChecker or kind = ck_objectDesc or
  159.     kind = ck_objectVoid) and
  160.     (w == "object" + nameTail1 or w == "object" + nameTail2)
  161. corp;
  162.  
  163. define tp_build1 proc utility pickWhich(string w, nameTail1, nameTail2)int:
  164.  
  165.     if w == "character" + nameTail1 or w == "character" + nameTail2 then
  166.     wh_character
  167.     elif w == "room" + nameTail1 or w == "room" + nameTail2 then
  168.     wh_room
  169.     else
  170.     /* do NOT check for "object" + nameTail */
  171.     wh_object
  172.     fi
  173. corp;
  174.  
  175. define tp_build1 proc utility doWhich(int which)string:
  176.  
  177.     case which
  178.     incase wh_character:
  179.     "Me()"
  180.     incase wh_room:
  181.     "Here()"
  182.     incase wh_object:
  183.     "It()"
  184.     default:
  185.     "xxx"
  186.     esac
  187. corp;
  188.  
  189. define tp_build1 proc utility doWhich2(int which)string:
  190.  
  191.     case which
  192.     incase wh_character:
  193.     "p_pCarrying"
  194.     incase wh_room:
  195.     "p_rContents"
  196.     incase wh_object:
  197.     "p_oContents"
  198.     default:
  199.     "xxx"
  200.     esac
  201. corp;
  202.  
  203. define tp_build1 proc utility roomToObject(int kind)void:
  204.  
  205.     Me()@p_pCodeKind :=
  206.     case kind
  207.     incase ck_roomChecker:
  208.         ck_objectChecker
  209.     incase ck_roomDesc:
  210.         ck_objectDesc
  211.     incase ck_roomVoid:
  212.         ck_objectVoid
  213.     default:
  214.         kind
  215.     esac;
  216. corp;
  217.  
  218. define tp_build1 proc utility checkStringSpecials(string s; int kind;
  219.                           string code)string:
  220.     int which, len, pos;
  221.     string w;
  222.     property string theString;
  223.     property int theCounter;
  224.  
  225.     if SubString(s, 0, 1) = "@" then
  226.     SetTail(SubString(s, 1, Length(s) - 1));
  227.     w := GetWord();
  228.     if checkWord(w, "string", "", kind) then
  229.         which := pickWhich(w, "string", "");
  230.         w := GetWord();
  231.         if w = "" then
  232.         error("Missing string-symbol");
  233.         else
  234.         theString := LookupString(nil, w);
  235.         if theString = nil then
  236.             notString(w);
  237.         else
  238.             code := code + "\"+" + doWhich(which) + "@" + w + "+\"";
  239.         fi;
  240.         fi;
  241.     elif checkWord(w, "counter", "", kind) then
  242.         which := pickWhich(w, "counter", "");
  243.         w := GetWord();
  244.         if w = "" then
  245.         error("Missing counter-symbol");
  246.         else
  247.         theCounter := LookupCounter(nil, w);
  248.         if theCounter = nil then
  249.             notCounter(w);
  250.         else
  251.             code := code + "\"+IntToString(" + doWhich(which) + "@" +
  252.             w + ")+\"";
  253.         fi;
  254.         fi;
  255.     elif checkWord(w, "name", "", kind) then
  256.         case pickWhich(w, "name", "")
  257.         incase wh_character:
  258.         code := code + "\"+Me()@p_pName+\"";
  259.         incase wh_room:
  260.         code := code + "\"+Here()@p_rName+\"";
  261.         incase wh_object:
  262.         code := code + "\"+FormatName(It()@p_oName)+\"";
  263.         esac;
  264.     else
  265.         stringError(w, "is not a known text escape");
  266.     fi;
  267.     else
  268.     len := Length(s);
  269.     w := "";
  270.     while
  271.         pos := Index(s, "\"");
  272.         pos >= 0
  273.     do
  274.         w := w + SubString(s, 0, pos) + "\\\"";
  275.         len := len - pos - 1;
  276.         s := SubString(s, pos + 1, len);
  277.     od;
  278.     code := code + w + s;
  279.     fi;
  280.     code
  281. corp;
  282.  
  283. define tp_build1 proc utility continuePrompt(int state, kind)void:
  284.  
  285.     case state
  286.     incase st_preCondition:
  287.     if kind = ck_roomVoid or kind = ck_objectVoid then
  288.         Print("Continue entering actions:\n");
  289.         ignore SetPrompt("* actions> ");
  290.     else
  291.         Print("Continue entering pre-condition actions:\n");
  292.         ignore SetPrompt("* pre-condition actions> ");
  293.     fi;
  294.     incase st_then:
  295.     incase st_then2:
  296.     Print("Continue entering the true actions:\n");
  297.     ignore SetPrompt("* true actions> ");
  298.     incase st_else:
  299.     incase st_else2:
  300.     Print("Continue entering the false actions:\n");
  301.     ignore SetPrompt("* false actions> ");
  302.     esac;
  303. corp;
  304.  
  305. define tp_build1 proc utility conditionPrompt()void:
  306.     Print("Now enter the conditions for the test:\n");
  307.     ignore SetPrompt("* condition> ");
  308. corp;
  309.  
  310. define tp_build1 proc utility truePrompt()void:
  311.     Print("Now enter the actions to do if condition is true:\n");
  312.     ignore SetPrompt("* true actions> ");
  313. corp;
  314.  
  315. define tp_build1 proc utility falsePrompt()void:
  316.     Print("Now enter the actions to do if condition is false:\n");
  317.     ignore SetPrompt("* false actions> ");
  318. corp;
  319.  
  320. define tp_build1 proc utility compileCode(string code)void:
  321.     action a;
  322.     thing me;
  323.  
  324.     me := Me();
  325.     a := StringToAction(code);
  326.     if a = nil then
  327.     error("Errors in action - not defined");
  328.     else
  329.     if DefineAction(me@p_pActiveTable, me@p_pNewName, a) then
  330.         Print("Action '" + me@p_pNewName + "' defined.\n");
  331.     fi;
  332.     if not me@p_pHidden then
  333.         OPrint(Capitalize(me@p_pName) + " finishes gesturing.\n");
  334.     fi;
  335.     fi;
  336. corp;
  337.  
  338. define tp_build1 proc utility bv_actionLineHandler(string s)void:
  339.     thing me, theThing, theRoom;
  340.     int state, kind, value, which;
  341.     string code, w, w2, w3, errMess;
  342.     action a;
  343.     property bool theFlag;
  344.     property int theCounter;
  345.     property string theString;
  346.     bool ending, tf, isNegative;
  347.  
  348.     ending := false;
  349.     me := Me();
  350.     state := me@p_pActiveState;
  351.     code := me@p_pActiveCode;
  352.     kind := me@p_pCodeKind;
  353.     if s = "." then
  354.     case state
  355.     incase st_preCondition:
  356.         /* end of pre-condition actions */
  357.         if kind = ck_roomVoid or kind = ck_objectVoid then
  358.         compileCode(code);
  359.         ending := true;
  360.         else
  361.         state := st_condition;
  362.         conditionPrompt();
  363.         fi;
  364.     incase st_condition:
  365.         /* end of condition */
  366.         if not me@p_pHadCondition then
  367.         if kind = ck_roomDesc or kind = ck_objectDesc then
  368.             if code ~= "" then
  369.             code := code + ";";
  370.             fi;
  371.             code := code + "\"";
  372.             state := st_descResult + STRING_FIRST;
  373.             Print("Now enter the result description:\n");
  374.             ignore SetPrompt("* description result> ");
  375.         else
  376.             if kind = ck_objectChecker then
  377.             code := code + ";succeed";
  378.             else
  379.             code := code + ";continue";
  380.             fi;
  381.             compileCode(code);
  382.             ending := true;
  383.         fi;
  384.         else
  385.         code := code + " then ";
  386.         state := st_then;
  387.         truePrompt();
  388.         fi;
  389.     incase st_then:
  390.         /* end of 'then' actions */
  391.         if kind = ck_roomDesc or kind = ck_objectDesc then
  392.         code := code + "\"";
  393.         state := st_descTrue + STRING_FIRST;
  394.         Print("Now enter the true description result:\n");
  395.         ignore SetPrompt("* true description result> ");
  396.         else
  397.         if kind = ck_objectChecker then
  398.             code := code + "succeed else ";
  399.         else
  400.             code := code + "continue else ";
  401.         fi;
  402.         state := st_else;
  403.         falsePrompt();
  404.         fi;
  405.     incase st_else:
  406.         /* end of 'else' actions */
  407.         if kind = ck_roomDesc or kind = ck_objectDesc then
  408.         code := code + "\"";
  409.         state := st_descFalse + STRING_FIRST;
  410.         Print("Now enter the false description result:\n");
  411.         ignore SetPrompt("* false description result> ");
  412.         else
  413.         code := code + "fail fi";
  414.         compileCode(code);
  415.         ending := true;
  416.         fi;
  417.     incase st_condition2:
  418.         if not me@p_pHadCondition then
  419.         error("Condition is required on 'if'");
  420.         ending := true;
  421.         else
  422.         code := code + " then ";
  423.         state := st_then2;
  424.         truePrompt();
  425.         fi;
  426.     incase st_then2:
  427.         code := code + "else ";
  428.         state := st_else2;
  429.         falsePrompt();
  430.     incase st_else2:
  431.         code := code + "fi;";
  432.         state := me@p_pSaveState;
  433.         me -- p_pSaveState;
  434.         continuePrompt(state, kind);
  435.     default:
  436.         /* end of a string */
  437.         if state >= STRING_OTHER then
  438.         state := state - STRING_OTHER;
  439.         else
  440.         state := state - STRING_FIRST;
  441.         fi;
  442.         case state
  443.         incase st_preCondition:
  444.         incase st_then:
  445.         incase st_else:
  446.         incase st_then2:
  447.         incase st_else2:
  448.         code := code + "\\n\");";
  449.         continuePrompt(state, kind);
  450.         incase st_descTrue:
  451.         /* end of 'then' description result */
  452.         code := code + "\" else ";
  453.         state := st_else;
  454.         falsePrompt();
  455.         incase st_descFalse:
  456.         /* end of 'else' description result */
  457.         code := code + "\" fi";
  458.         compileCode(code);
  459.         ending := true;
  460.         incase st_descResult:
  461.         /* end of the description result string */
  462.         code := code + "\"";
  463.         compileCode(code);
  464.         ending := true;
  465.         esac;
  466.     esac;
  467.     else
  468.     errMess := "Missing flag/counter-symbol";
  469.     SetTail(s);
  470.     w := GetWord();
  471.     if state = st_condition or state = st_condition2 then
  472.         /* handling conditions */
  473.         if me@p_pHadCondition then
  474.         code := code + " and ";
  475.         else
  476.         code := code + "if ";
  477.         me@p_pHadCondition := true;
  478.         fi;
  479.         if w == "not" then
  480.         code := code + "not ";
  481.         w := GetWord();
  482.         fi;
  483.         if w == "fail" then
  484.         code := code + "false";
  485.         elif checkWord(w, "flag", "", kind) then
  486.         which := pickWhich(w, "flag", "");
  487.         w := GetWord();
  488.         if w = "" then
  489.             error(errMess);
  490.             ending := true;
  491.         else
  492.             theFlag := LookupFlag(nil, w);
  493.             if theFlag ~= nil then
  494.             code := code + doWhich(which) + "@" + w;
  495.             else
  496.             notFlag(w);
  497.             ending := true;
  498.             fi;
  499.         fi;
  500.         elif checkWord(w, "counter", "", kind) then
  501.         which := pickWhich(w, "counter", "");
  502.         w := GetWord();
  503.         if w = "" then
  504.             error(errMess);
  505.             ending := true;
  506.         else
  507.             theCounter := LookupCounter(nil, w);
  508.             if theCounter ~= nil then
  509.             w2 := GetWord();
  510.             isNegative := false;
  511.             if SubString(w2, 0, 1) = "-" then
  512.                 isNegative := true;
  513.                 w2 := SubString(w2, 1, Length(w2) - 1);
  514.             elif SubString(w2, 0, 1) = "+" then
  515.                 w2 := SubString(w2, 1, Length(w2) - 1);
  516.             fi;
  517.             value := StringToPosInt(w2);
  518.             if value < 0 then
  519.                 error("Missing or invalid counter value");
  520.                 ending := true;
  521.             else
  522.                 if isNegative then
  523.                 value := -value;
  524.                 fi;
  525.                 code := code + doWhich(which) + "@" + w + "=" +
  526.                 IntToString(value);
  527.             fi;
  528.             else
  529.             notCounter(w);
  530.             ending := true;
  531.             fi;
  532.         fi;
  533.         elif checkWord(w, "hasspecific", "", kind) then
  534.         which := pickWhich(w, "hasspecific", "");
  535.         w := GetWord();
  536.         if w = "" then
  537.             error("Missing object-symbol");
  538.             ending := true;
  539.         else
  540.             theThing := LookupThing(nil, w);
  541.             if theThing ~= nil and theThing@p_oName ~= "" then
  542.             code := code + "FindElement(" + doWhich(which) + "@" +
  543.                 doWhich2(which) + "," + w + ")~=-1";
  544.             else
  545.             notObject(w);
  546.             ending := true;
  547.             fi;
  548.         fi;
  549.         elif checkWord(w, "haschild", "", kind) then
  550.         which := pickWhich(w, "haschild", "");
  551.         w := GetWord();
  552.         if w = "" then
  553.             error("Missing object child form");
  554.             ending := true;
  555.         else
  556.             theThing := LookupThing(nil, w);
  557.             if theThing ~= nil and theThing@p_oName ~= "" then
  558.             code := code + "FindChildOnList(" + doWhich(which) +
  559.                 "@" + doWhich2(which) + "," + w + ")";
  560.             else
  561.             notObject(w);
  562.             ending := true;
  563.             fi;
  564.         fi;
  565.         elif checkWord(w, "hasname", "", kind) then
  566.         which := pickWhich(w, "hasname", "");
  567.         w := GetWord();
  568.         if w = "" then
  569.             error("Missing object name form");
  570.             ending := true;
  571.         else
  572.             code := code + "FindName(" + doWhich(which) + "@" +
  573.                 doWhich2(which) + ",p_oName,\"" + Strip(w) +
  574.                 "\")~=fail";
  575.         fi;
  576.         elif checkWord(w, "hasflag", "", kind) then
  577.         which := pickWhich(w, "hasflag", "");
  578.         w := GetWord();
  579.         if w = "" then
  580.             error(errMess);
  581.             ending := true;
  582.         else
  583.             theFlag := LookupFlag(nil, w);
  584.             if theFlag = nil then
  585.             notFlag(w);
  586.             ending := true;
  587.             else
  588.             code := code + "FindFlagOnList(" + doWhich(which) +
  589.                 "@" + doWhich2(which) + "," + w + ")";
  590.             fi;
  591.         fi;
  592.         elif w == "random" then
  593.         w := GetWord();
  594.         value := StringToPosInt(w);
  595.         if value < 1 then
  596.             error("Missing or invalid random range");
  597.             ending := true;
  598.         else
  599.             code := code + "Random(999)<" + w;
  600.         fi;
  601.         else
  602.         stringError(w, "is not a known condition");
  603.         ending := true;
  604.         fi;
  605.     elif state >= STRING_OTHER then
  606.         /* getting a string - subsequent hunk */
  607.         if s ~= "" then
  608.         w := SubString(s, 0, 1);
  609.         if w ~= "," and w ~= "." and w ~= ";" and w ~= "!" and
  610.             w ~= "?" and w ~= ":"
  611.         then
  612.             code := code + " ";
  613.         fi;
  614.         code := checkStringSpecials(s, kind, code);
  615.         fi;
  616.     elif state >= STRING_FIRST then
  617.         /* getting a string - first hunk */
  618.         code := checkStringSpecials(s, kind, code);
  619.         state := state - STRING_FIRST + STRING_OTHER;
  620.     else
  621.         /* handling statements */
  622.         if checkWord(w, "setflag", "clearflag", kind) then
  623.         which := pickWhich(w, "setflag", "clearflag");
  624.         tf := w == "charactersetflag" or w == "roomsetflag" or
  625.             w == "objectsetflag";
  626.         w := GetWord();
  627.         if w = "" then
  628.             error(errMess);
  629.             ending := true;
  630.         else
  631.             theFlag := LookupFlag(nil, w);
  632.             if theFlag = nil then
  633.             notFlag(w);
  634.             ending := true;
  635.             else
  636.             if tf then
  637.                 code := code + doWhich(which) + "@" + w +
  638.                 ":=true;";
  639.             else
  640.                 code := code + doWhich(which) + "--" + w + ";";
  641.             fi;
  642.             fi;
  643.         fi;
  644.         elif checkWord(w, "inccounter", "deccounter", kind) then
  645.         which := pickWhich(w, "inccounter", "deccounter");
  646.         tf := w == "characterinccounter" or w == "roominccounter" or
  647.             w == "objectinccounter";
  648.         w := GetWord();
  649.         if w = "" then
  650.             error(errMess);
  651.             ending := true;
  652.         else
  653.             theCounter := LookupCounter(nil, w);
  654.             if theCounter = nil then
  655.             notCounter(w);
  656.             ending := true;
  657.             else
  658.             w2 := GetWord();
  659.             if w2 ~= "" then
  660.                 value := StringToPosInt(w2);
  661.                 if value < 0 then
  662.                 error("Invalid inc/dec value");
  663.                 ending := true;
  664.                 fi;
  665.             else
  666.                 value := 1;
  667.             fi;
  668.             w2 := doWhich(which);
  669.             code := code + w2 + "@" + w + ":=" + w2 + "@" + w +
  670.                 if tf then "+" else "-" fi +
  671.                 IntToString(value) + ";";
  672.             fi;
  673.         fi;
  674.         elif checkWord(w, "setcounter", "", kind) then
  675.         which := pickWhich(w, "setcounter", "");
  676.         w := GetWord();
  677.         if w = "" then
  678.             error(errMess);
  679.             ending := true;
  680.         else
  681.             theCounter := LookupCounter(nil, w);
  682.             if theCounter ~= nil then
  683.             w2 := GetWord();
  684.             isNegative := false;
  685.             if SubString(w2, 0, 1) = "-" then
  686.                 isNegative := true;
  687.                 w2 := SubString(w2, 1, Length(w2) - 1);
  688.             elif SubString(w2, 0, 1) = "+" then
  689.                 w2 := SubString(w2, 1, Length(w2) - 1);
  690.             fi;
  691.             value := StringToPosInt(w2);
  692.             if value < 0 then
  693.                 error("Missing or invalid counter value");
  694.                 ending := true;
  695.             else
  696.                 if value = 0 then
  697.                 code := code + doWhich(which) + "--" + w + ";";
  698.                 else
  699.                 if isNegative then
  700.                     value := -value;
  701.                 fi;
  702.                 code := code + doWhich(which) + "@" +
  703.                     w + ":=" + IntToString(value) + ";";
  704.                 fi;
  705.             fi;
  706.             else
  707.             notCounter(w);
  708.             ending := true;
  709.             fi;
  710.         fi;
  711.         elif checkWord(w, "setstring", "", kind) then
  712.         which := pickWhich(w, "setstring", "");
  713.         w := GetWord();
  714.         if w = "" then
  715.             error("Missing string-symbol");
  716.             ending := true;
  717.         else
  718.             theString := LookupString(nil, w);
  719.             if theString = nil then
  720.             notString(w);
  721.             ending := true;
  722.             elif w = "p_pName" or w = "p_rName" or w = "p_oName" then
  723.             error("Sorry - you can't modify that string");
  724.             ending := true;
  725.             else
  726.             w3 := GetWord();
  727.             if w3 = "" then
  728.                 error("Missing string identifier");
  729.                 ending := true;
  730.             else
  731.                 if w3 == "date" or w3 == "time" then
  732.                 w2 := "Date()";
  733.                 elif w3 == "charactername" then
  734.                 w2 := "Me()@p_pName";
  735.                 elif w3 == "roomname" then
  736.                 w2 := "Here()@p_rName";
  737.                 elif w3 == "objectname" and
  738.                 (kind = ck_objectChecker or
  739.                  kind = ck_objectDesc or
  740.                  kind = ck_objectVoid)
  741.                 then
  742.                 w2 := "FormatName(It()@p_oName)";
  743.                 else
  744.                 stringError(w3,
  745.                     "is not a known string identifier");
  746.                 ending := true;
  747.                 w2 := "\"\"";
  748.                 fi;
  749.                 code := code + doWhich(which) + "@" + w + ":=" +
  750.                 w2 + ";";
  751.             fi;
  752.             fi;
  753.         fi;
  754.         elif checkWord(w, "clearstring", "", kind) then
  755.         which := pickWhich(w, "clearstring", "");
  756.         w := GetWord();
  757.         if w = "" then
  758.             error("Missing string-symbol");
  759.             ending := true;
  760.         else
  761.             theString := LookupString(nil, w);
  762.             if theString ~= nil then
  763.             code := code + doWhich(which) + "--" + w + ";";
  764.             else
  765.             notString(w);
  766.             ending := true;
  767.             fi;
  768.         fi;
  769.         elif w == "clonehere" or w == "cloneat" then
  770.         if not Me()@p_pBuilder then
  771.             error("Sorry, only true builders can clone things");
  772.             ending := true;
  773.         elif w = "cloneat" then
  774.             w2 := GetWord();
  775.             if w2 = "" then
  776.             error("Missing room-symbol");
  777.             ending := true;
  778.             else
  779.             theRoom := LookupThing(nil, w2);
  780.             if theRoom = nil or theRoom@p_rName = "" then
  781.                 notRoom(w2);
  782.                 ending := true;
  783.             fi;
  784.             fi;
  785.         fi;
  786.         w3 := GetWord();
  787.         if ending or w3 = "" then
  788.             if not ending then
  789.             error("Missing object-symbol");
  790.             ending := true;
  791.             fi;
  792.         else
  793.             theThing := LookupThing(nil, w3);
  794.             if theThing ~= nil and theThing@p_oName ~= "" then
  795.             code := code + "SetIt(CreateThing(" + w3 +
  796.                 "));AddTail(" +
  797.                 if w == "clonehere" then "Here()" else w2 fi +
  798.                 "@p_rContents,It());" +
  799.                 "SetThingStatus(It(),ts_public);" +
  800.                 "GiveThing(It(),Character(\"SysAdmin\"));" +
  801.                 "It()@p_oCarryer:=Me();" +
  802.                 "It()@p_oCreator:=Me();";
  803.             roomToObject(kind);
  804.             else
  805.             notObject(w3);
  806.             ending := true;
  807.             fi;
  808.         fi;
  809.         elif w == "destruct" and
  810.         (kind = ck_objectChecker or kind = ck_objectDesc or
  811.          kind = ck_objectVoid)
  812.         then
  813.         code := code + "ClearThing(It());" +
  814.             "DelElement(Me()@p_pCarrying,It());";
  815.         elif w == "drop" and
  816.         (kind = ck_objectChecker or kind = ck_objectDesc or
  817.          kind = ck_objectVoid)
  818.         then
  819.         code := code + "ignore DoDrop(Here(),Me(),It());";
  820.         elif w == "dropto" and
  821.         (kind = ck_objectChecker or kind = ck_objectDesc or
  822.          kind = ck_objectVoid)
  823.         then
  824.         w := GetWord();
  825.         if w = "" then
  826.             error("Missing room-symbol");
  827.             ending := true;
  828.         else
  829.             theRoom := LookupThing(nil, w);
  830.             if theRoom ~= nil and theRoom@p_rName ~= "" then
  831.             code := code + "ignore DoDrop(" + w + ",Me(),It());";
  832.             else
  833.             notRoom(w);
  834.             ending := true;
  835.             fi;
  836.         fi;
  837.         elif w == "setit" then
  838.         w := GetWord();
  839.         if w = "" then
  840.             error("Missing object kind");
  841.             ending := true;
  842.         else
  843.             w2 := GetWord();
  844.             if w2 = "" then
  845.             error("Missing object-symbol/flag-symbol/string");
  846.             ending := true;
  847.             else
  848.             if w == "specific" then
  849.                 theThing := LookupThing(nil, w2);
  850.                 if theThing ~= nil and theThing@p_oName ~= "" then
  851.                 code := code + "SetIt(" + w2 + ");";
  852.                 else
  853.                 notObject(w2);
  854.                 ending := true;
  855.                 fi;
  856.             elif checkWord(w, "child", "", kind) then
  857.                 theThing := LookupThing(nil, w2);
  858.                 if theThing ~= nil and theThing@p_oName ~= "" then
  859.                 which := pickWhich(w, "child", "");
  860.                 code := code + "ignore FindChildOnList(" +
  861.                     doWhich(which) + "@" + doWhich2(which) +
  862.                     "," + w2 + ");SetIt(FindResult());";
  863.                 else
  864.                 notObject(w2);
  865.                 ending := true;
  866.                 fi;
  867.             elif checkWord(w, "flag", "", kind) then
  868.                 theFlag := LookupFlag(nil, w2);
  869.                 if theFlag ~= nil then
  870.                 which := pickWhich(w, "flag", "");
  871.                 code := code + "ignore FindFlagOnList(" +
  872.                     doWhich(which) + "@" + doWhich2(which) +
  873.                     "," + w2 + ");SetIt(FindResult());";
  874.                 else
  875.                 notFlag(w);
  876.                 ending := true;
  877.                 fi;
  878.             elif checkWord(w, "name", "", kind) then
  879.                 which := pickWhich(w, "name", "");
  880.                 code := code + "ignore FindName(" +
  881.                 doWhich(which) + "@" + doWhich2(which) +
  882.                 ",p_oName,\"" + Strip(w2) +
  883.                 "\");SetIt(FindResult());";
  884.             else
  885.                 stringError(w, "is not a known object kind");
  886.                 ending := true;
  887.             fi;
  888.             roomToObject(kind);
  889.             fi;
  890.         fi;
  891.         elif w == "saycharacter" then
  892.         code := code + "Print(\"";
  893.         state := state + STRING_FIRST;
  894.         Print("Enter the text to be shown to the character:\n");
  895.         ignore SetPrompt("* character text> ");
  896.         elif w == "sayothers" then
  897.         code := code + "OPrint(\"";
  898.         state := state + STRING_FIRST;
  899.         Print("Enter the text to be shown to others:\n");
  900.         ignore SetPrompt("* others text> ");
  901.         elif w == "if" then
  902.         if me@p_pSaveState ~= st_noState then
  903.             error("Sorry, you cannot nest 'if's");
  904.             ending := true;
  905.         else
  906.             me@p_pSaveState := state;
  907.             me@p_pHadCondition := false;
  908.             state := st_condition2;
  909.             Print("Enter the condition for the if:\n");
  910.             ignore SetPrompt("* condition> ");
  911.         fi;
  912.         else
  913.         stringError(w, "is not a known action");
  914.         ending := true;
  915.         fi;
  916.     fi;
  917.     fi;
  918.     if ending then
  919.     me -- p_pActiveCode;
  920.     me -- p_pActiveState;
  921.     me -- p_pSaveState;
  922.     me -- p_pHadCondition;
  923.     me -- p_pCodeKind;
  924.     me -- p_pActiveDir;
  925.     me -- p_pNewName;
  926.     me -- p_pActiveTable;
  927.     GetCheckedEnd();
  928.     else
  929.     me@p_pActiveCode := code;
  930.     me@p_pActiveState := state;
  931.     fi;
  932. corp;
  933.  
  934. define tp_build1 proc utility getAction(table theTable; string name;
  935.                     int kind)bool:
  936.     thing me;
  937.  
  938.     me := Me();
  939.     me@p_pActiveTable := theTable;
  940.     me@p_pNewName := name;
  941.     me@p_pCodeKind := kind;
  942.     me@p_pActiveCode := "";
  943.     me@p_pActiveState := st_preCondition;
  944.     me -- p_pSaveState;
  945.     me@p_pHadCondition := false;
  946.     me -- p_pActiveDir;
  947.     if not me@p_pHidden then
  948.     OPrint(Capitalize(me@p_pName) + " starts gesturing arcanely.\n");
  949.     fi;
  950.     if kind = ck_roomVoid or kind = ck_objectVoid then
  951.     Print("Enter the actions:\n");
  952.     GetCheckedDescription("actions> ", bv_actionLineHandler)
  953.     else
  954.     Print("Enter the pre-condition actions:\n");
  955.     GetCheckedDescription("pre-condition actions> ", bv_actionLineHandler)
  956.     fi
  957. corp;
  958.  
  959. /*****************************************************************************\
  960. *                                          *
  961. *        now the actual building subcommands                  *
  962. *                                          *
  963. \*****************************************************************************/
  964.  
  965. /*****************************************************************************\
  966. *                                          *
  967. *        first, some generic building subcommands              *
  968. *                                          *
  969. \*****************************************************************************/
  970.  
  971. define tp_build1 proc utility checkBuilder()bool:
  972.  
  973.     /* This check is used in @table, @use and @unuse. The most important
  974.        is in @use, since otherwise a character in the PlayPen could
  975.        "@use t_base", and then write actions which increased his money,
  976.        etc.! */
  977.     if Me()@p_pBuilder then
  978.     true
  979.     else
  980.     Print("Sorry, only true builders can use that command.\n");
  981.     false
  982.     fi
  983. corp;
  984.  
  985. define tp_build1 proc utility bv_showtable(string tableName)bool:
  986.     table theTable;
  987.  
  988.     if tableName = "" then
  989.     Print("Use is: @showtable <table>\n");
  990.     false
  991.     else
  992.     theTable := findTable(tableName, true);
  993.     if theTable = nil then
  994.         false
  995.     else
  996.         ShowTable(theTable);
  997.         true
  998.     fi
  999.     fi
  1000. corp;
  1001.  
  1002. Verb1(g_build, "showtable", 0, bv_showtable).
  1003.  
  1004. define tp_build1 proc utility bv_describesymbol()bool:
  1005.     string tableName, what;
  1006.     table theTable;
  1007.  
  1008.     tableName := GetWord();
  1009.     what := GetWord();
  1010.     if tableName = "" or what = "" or GetWord() ~= "" then
  1011.     Print("Use is: @describesymbol <table> <symbol>\n");
  1012.     false
  1013.     else
  1014.     theTable := findTable(tableName, true);
  1015.     if theTable = nil then
  1016.         false
  1017.     else
  1018.         DescribeSymbol(theTable, Strip(what));
  1019.         true
  1020.     fi
  1021.     fi
  1022. corp;
  1023.  
  1024. VerbTail(g_build, "describesymbol", bv_describesymbol).
  1025. Synonym(g_build, "describesymbol", "describe").
  1026. Synonym(g_build, "describesymbol", "d").
  1027.  
  1028. define tp_build1 proc utility bv_deletesymbol()bool:
  1029.     string tableName, what;
  1030.     table theTable;
  1031.  
  1032.     tableName := GetWord();
  1033.     what := GetWord();
  1034.     if tableName = "" or what = "" or GetWord() ~= "" then
  1035.     Print("Use is: @deletesymbol <table> <symbol>\n");
  1036.     false
  1037.     else
  1038.     theTable := findTable(tableName, false);
  1039.     if theTable = nil then
  1040.         false
  1041.     else
  1042.         ignore DeleteSymbol(theTable, Strip(what));
  1043.         true
  1044.     fi
  1045.     fi
  1046. corp;
  1047.  
  1048. VerbTail(g_build, "deletesymbol", bv_deletesymbol).
  1049. Synonym(g_build, "deletesymbol", "delete").
  1050.  
  1051. define tp_build1 proc utility bv_movesymbol()bool:
  1052.     string fromTableName, toTableName, what;
  1053.     table fromTable, toTable;
  1054.  
  1055.     fromTableName := GetWord();
  1056.     toTableName := GetWord();
  1057.     what := GetWord();
  1058.     if fromTableName = "" or toTableName = "" or what = "" or GetWord() ~= ""
  1059.     then
  1060.     Print("Use is: @movesymbol <from-table> <to-table> <symbol>\n");
  1061.     false
  1062.     else
  1063.     fromTable := findTable(fromTableName, false);
  1064.     if fromTable = nil then
  1065.         false
  1066.     else
  1067.         toTable := findTable(toTableName, false);
  1068.         if toTable = nil then
  1069.         false
  1070.         else
  1071.         ignore MoveSymbol(fromTable, toTable, Strip(what));
  1072.         true
  1073.         fi
  1074.     fi
  1075.     fi
  1076. corp;
  1077.  
  1078. VerbTail(g_build, "movesymbol", bv_movesymbol).
  1079. Synonym(g_build, "movesymbol", "move").
  1080.  
  1081. define tp_build1 proc utility bv_renamesymbol()bool:
  1082.     string tableName, oldName, newName;
  1083.     table theTable;
  1084.  
  1085.     tableName := GetWord();
  1086.     oldName := GetWord();
  1087.     newName := GetWord();
  1088.     if tableName = "" or oldName = "" or newName = "" or GetWord() ~= "" then
  1089.     Print("Use is: @renamesymbol <table> <old-symbol> <new-symbol>\n");
  1090.     false
  1091.     else
  1092.     theTable := findTable(tableName, false);
  1093.     if theTable = nil then
  1094.         false
  1095.     else
  1096.         RenameSymbol(theTable, Strip(oldName), Strip(newName))
  1097.     fi
  1098.     fi
  1099. corp;
  1100.  
  1101. VerbTail(g_build, "renamesymbol", bv_renamesymbol).
  1102. Synonym(g_build, "renamesymbol", "rename").
  1103.  
  1104. define tp_build1 proc utility bv_flag()bool:
  1105.     string tableName, name;
  1106.     table theTable;
  1107.  
  1108.     tableName := GetWord();
  1109.     name := GetWord();
  1110.     if tableName = "" or name = "" or GetWord() ~= "" then
  1111.     Print("Use is: @flag <table> <symbol>\n");
  1112.     false
  1113.     else
  1114.     theTable := findTable(tableName, false);
  1115.     if theTable = nil then
  1116.         false
  1117.     else
  1118.         DefineFlag(theTable, name, CreateBoolProp())
  1119.     fi
  1120.     fi
  1121. corp;
  1122.  
  1123. VerbTail(g_build, "flag", bv_flag).
  1124.  
  1125. define tp_build1 proc utility bv_counter()bool:
  1126.     string tableName, name;
  1127.     table theTable;
  1128.  
  1129.     tableName := GetWord();
  1130.     name := GetWord();
  1131.     if tableName = "" or name = "" or GetWord() ~= "" then
  1132.     Print("Use is: @counter <table> <symbol>\n");
  1133.     false
  1134.     else
  1135.     theTable := findTable(tableName, false);
  1136.     if theTable = nil then
  1137.         false
  1138.     else
  1139.         DefineCounter(theTable, name, CreateIntProp())
  1140.     fi
  1141.     fi
  1142. corp;
  1143.  
  1144. VerbTail(g_build, "counter", bv_counter).
  1145.  
  1146. define tp_build1 proc utility bv_string()bool:
  1147.     string tableName, name;
  1148.     table theTable;
  1149.  
  1150.     tableName := GetWord();
  1151.     name := GetWord();
  1152.     if tableName = "" or name = "" or GetWord() ~= "" then
  1153.     Print("Use is: @string <table> <symbol>\n");
  1154.     false
  1155.     else
  1156.     theTable := findTable(tableName, false);
  1157.     if theTable = nil then
  1158.         false
  1159.     else
  1160.         DefineString(theTable, name, CreateStringProp())
  1161.     fi
  1162.     fi
  1163. corp;
  1164.  
  1165. VerbTail(g_build, "string", bv_string).
  1166.  
  1167. define tp_build1 proc utility bv_table()bool:
  1168.     string tableName, name;
  1169.     table theTable;
  1170.  
  1171.     tableName := GetWord();
  1172.     name := GetWord();
  1173.     if not checkBuilder() then
  1174.     false
  1175.     elif tableName = "" or name = "" or GetWord() ~= "" then
  1176.     Print("Use is: @table <existing-table-name> <new-table-name>\n");
  1177.     false
  1178.     else
  1179.     theTable := findTable(tableName, false);
  1180.     if theTable = nil then
  1181.         false
  1182.     else
  1183.         DefineTable(theTable, name, CreateTable())
  1184.     fi
  1185.     fi
  1186. corp;
  1187.  
  1188. VerbTail(g_build, "table", bv_table).
  1189.  
  1190. define tp_build1 proc utility bv_use(string tableName)bool:
  1191.     table theTable;
  1192.  
  1193.     if not checkBuilder() then
  1194.     false
  1195.     elif tableName = "" then
  1196.     Print("Use is: @use <table>\n");
  1197.     false
  1198.     else
  1199.     theTable := checkTable(tableName);
  1200.     if theTable = nil then
  1201.         false
  1202.     else
  1203.         UseTable(theTable)
  1204.     fi
  1205.     fi
  1206. corp;
  1207.  
  1208. Verb1(g_build, "use", 0, bv_use).
  1209.  
  1210. define tp_build1 proc utility bv_unuse(string tableName)bool:
  1211.     table theTable;
  1212.  
  1213.     if not checkBuilder() then
  1214.     false
  1215.     elif tableName = "" then
  1216.     Print("Use is: @unuse <table>\n");
  1217.     false
  1218.     else
  1219.     theTable := checkTable(tableName);
  1220.     if theTable = nil then
  1221.         false
  1222.     else
  1223.         UnUseTable(theTable)
  1224.     fi
  1225.     fi
  1226. corp;
  1227.  
  1228. Verb1(g_build, "unuse", 0, bv_unuse).
  1229.  
  1230. define tp_build1 proc utility bv_symbolhere()bool:
  1231.     string tableName, what;
  1232.     table theTable;
  1233.  
  1234.     tableName := GetWord();
  1235.     what := GetWord();
  1236.     if tableName = "" or what = "" or GetWord() ~= "" then
  1237.     Print("Use is: @symbolhere <table> <symbol>\n");
  1238.     false
  1239.     else
  1240.     theTable := findTable(tableName, false);
  1241.     if theTable = nil then
  1242.         false
  1243.     else
  1244.         DefineThing(theTable, what, Here())
  1245.     fi
  1246.     fi
  1247. corp;
  1248.  
  1249. VerbTail(g_build, "symbolhere", bv_symbolhere).
  1250.  
  1251. define tp_build proc utility bv_poof(string where)bool:
  1252.     string err;
  1253.     thing room;
  1254.     bool privileged;
  1255.     action a;
  1256.  
  1257.     privileged := Me()@p_pPrivileged;
  1258.     err := "Can only POOF between your own rooms.\n";
  1259.     if where = "" then
  1260.     Print("You must specify where you want to poof to.\n");
  1261.     false
  1262.     elif not Mine(Here()) and not privileged then
  1263.     Print(err);
  1264.     false
  1265.     else
  1266.     room := LookupThing(nil, where);
  1267.     if room = nil or room@p_rName = "" then
  1268.         if IsDefined(nil, where) then
  1269.         Print("Name '" + where + "' is not a room.\n");
  1270.         else
  1271.         Print("Name '" + where + "' is not defined.\n");
  1272.         fi;
  1273.         false
  1274.     elif not Mine(room) and not privileged then
  1275.         Print(err);
  1276.         false
  1277.     elif room = Here() then
  1278.         Print("That's where you are!\n");
  1279.         false
  1280.     else
  1281.         LeaveRoomStuff(room, 0, MOVE_POOF);
  1282.         EnterRoomStuff(room, 0, MOVE_POOF);
  1283.         true
  1284.     fi
  1285.     fi
  1286. corp;
  1287.  
  1288. Verb1(g_build, "poof", 0, bv_poof).
  1289.  
  1290. /* a couple of utilities */
  1291.  
  1292. define tp_build proc utility objNameCheck(string symbol)thing:
  1293.     thing th;
  1294.  
  1295.     th := LookupThing(nil, symbol);
  1296.     if th = nil or th@p_oName = "" then
  1297.     if IsDefined(nil, symbol) then
  1298.         Print("'" + symbol + "' is not an object.\n");
  1299.     else
  1300.         Print("You have no object named '" + symbol + "'.\n");
  1301.     fi;
  1302.     nil
  1303.     else
  1304.     th
  1305.     fi
  1306. corp;
  1307.  
  1308. define tp_build1 proc utility actionNameCheck(string symbol)action:
  1309.     action a;
  1310.  
  1311.     a := LookupAction(nil, symbol);
  1312.     if a = nil then
  1313.     if IsDefined(nil, symbol) then
  1314.         Print("'" + symbol + "' is not an action.\n");
  1315.     else
  1316.         Print("You have no action named '" + symbol + "'.\n");
  1317.     fi;
  1318.     nil
  1319.     else
  1320.     a
  1321.     fi
  1322. corp;
  1323.  
  1324. define tp_build proc utility changeDone(string what)void:
  1325.  
  1326.     if Me()@p_pHidden then
  1327.     OPrint("Someone has " + what + ".\n");
  1328.     else
  1329.     OPrint(Capitalize(Me()@p_pName) + " has " + what + ".\n");
  1330.     fi;
  1331. corp;
  1332.  
  1333. /*****************************************************************************\
  1334. *                                          *
  1335. *        now some subsubcommands for building rooms              *
  1336. *                                          *
  1337. \*****************************************************************************/
  1338.  
  1339. define tp_build1 g_room CreateGrammar().
  1340.  
  1341. define tp_build1 proc utility bv_room()bool:
  1342.     thing here;
  1343.     string s;
  1344.  
  1345.     here := Here();
  1346.     s := GetTail();
  1347.     if s = "" then
  1348.     Print("Missing room command - "
  1349.           "see builder's library for details.\n");
  1350.     false
  1351.     elif not Mine(here) and (GetThingStatus(here) = ts_readonly or
  1352.     GetThingStatus(here) = ts_wizard and not IsWizard()) and
  1353.     MeCharacter() ~= SysAdmin
  1354.     then
  1355.     Print("The owner of this room has not permitted it.\n");
  1356.     false
  1357.     else
  1358.     Parse(g_room, s) ~= 0
  1359.     fi
  1360. corp;
  1361.  
  1362. VerbTail(g_build, "r", bv_room).
  1363. Synonym(g_build, "r", "room").
  1364.  
  1365. define tp_build proc utility doCreateRoom(int dir, kind; string s)void:
  1366.     thing room;
  1367.  
  1368.     room := CreateThing(
  1369.     case kind
  1370.     incase 0:
  1371.         r_indoors
  1372.     incase 1:
  1373.         r_outdoors
  1374.     incase 2:
  1375.         r_forest
  1376.     incase 3:
  1377.         r_field
  1378.     incase 4:
  1379.         r_path
  1380.     incase 5:
  1381.         r_road
  1382.     incase 6:
  1383.         r_sidewalk
  1384.     incase 7:
  1385.         r_park
  1386.     incase 8:
  1387.         r_tunnel
  1388.     default:
  1389.         nil
  1390.     esac);
  1391.     room@p_rName := s;
  1392.     room@p_rContents := CreateThingList();
  1393.     SetThingStatus(room, ts_readonly);
  1394.     Connect(Here(), room, dir);
  1395.     if Here()@p_rPlayPen then
  1396.     room@p_rPlayPen := true;
  1397.     fi;
  1398.     Print("New room created and linked.\n");
  1399.     changeDone("created a new room");
  1400. corp;
  1401.  
  1402. define tp_build1 proc utility brv_new()bool:
  1403.     string s, error;
  1404.     int dir, kind;
  1405.  
  1406.     error := "Use is: @room new <dir> <kind> <room-name>\n";
  1407.     s := GetWord();
  1408.     if s = "" then
  1409.     Print(error);
  1410.     false
  1411.     else
  1412.     dir := DirMatch(s);
  1413.     if dir = -1 then
  1414.         Print(error);
  1415.         false
  1416.     else
  1417.         s := GetWord();
  1418.         kind := MatchName("indoors.outdoors.forest.field.path.road."
  1419.                   "sidewalk.park.tunnel", s);
  1420.         if kind = -1 then
  1421.         Print("Unknown room kind. Known kinds are: indoors, outdoors, "
  1422.             "forest, field, path, road, sidewalk, park, tunnel\n");
  1423.         false
  1424.         else
  1425.         s := Strip(GetTail());
  1426.         if s = "" then
  1427.             Print(error);
  1428.             false
  1429.         elif Here()@(DirProp(dir)) ~= nil then
  1430.             Print("That direction is already in use.\n");
  1431.             false
  1432.         else
  1433.             doCreateRoom(dir, kind, s);
  1434.             true
  1435.         fi
  1436.         fi
  1437.     fi
  1438.     fi
  1439. corp;
  1440.  
  1441. VerbTail(g_room, "new", brv_new).
  1442.  
  1443. define tp_build1 proc utility brv_newname()bool:
  1444.     string name;
  1445.  
  1446.     name := GetTail();
  1447.     if name = "" then
  1448.     Print("Use is: @room newname <room-name>\n");
  1449.     false
  1450.     else
  1451.     Here()@p_rName := name;
  1452.     Print("Room renamed.\n");
  1453.     changeDone("renamed this room");
  1454.     true
  1455.     fi
  1456. corp;
  1457.  
  1458. VerbTail(g_room, "newname", brv_newname).
  1459.  
  1460. define tp_build1 proc utility brv_hide(string dirName)bool:
  1461.     int dir;
  1462.     list int exits;
  1463.  
  1464.     dir := DirMatch(dirName);
  1465.     if dir = -1 then
  1466.     Print("Use is: @room hide <dir>\n");
  1467.     false
  1468.     else
  1469.     exits := Here()@p_rExits;
  1470.     if Here()@(DirProp(dir)) = nil then
  1471.         Print("That direction is not in use.\n");
  1472.         false
  1473.     else
  1474.         if FindElement(exits, dir) = -1 then
  1475.         AddTail(exits, dir);
  1476.         Print("Link unhidden.\n");
  1477.         else
  1478.         DelElement(exits, dir);
  1479.         Print("Link hidden.\n");
  1480.         fi;
  1481.         true
  1482.     fi
  1483.     fi
  1484. corp;
  1485.  
  1486. Verb1(g_room, "hide", 0, brv_hide).
  1487.  
  1488. define tp_build1 proc utility brv_same()bool:
  1489.     thing here;
  1490.     string error, s;
  1491.     int dirOld, dirNew;
  1492.  
  1493.     here := Here();
  1494.     error := "Use is: @room same <old-dir> <new-dir>\n";
  1495.     s := GetWord();
  1496.     if s = "" then
  1497.     Print(error);
  1498.     false
  1499.     else
  1500.     dirOld := DirMatch(s);
  1501.     if dirOld = -1 then
  1502.         Print(error);
  1503.         false
  1504.     elif here@(DirProp(dirOld)) = nil then
  1505.         Print("That old direction does not go anywhere.\n");
  1506.         false
  1507.     else
  1508.         s := GetWord();
  1509.         if s = "" or GetWord() ~= "" then
  1510.         Print(error);
  1511.         false
  1512.         else
  1513.         dirNew := DirMatch(s);
  1514.         if dirNew = -1 then
  1515.             Print(error);
  1516.             false
  1517.         elif here@(DirProp(dirNew)) ~= nil then
  1518.             Print("That new direction is already in use.\n");
  1519.             false
  1520.         else
  1521.             UniConnect(here, here@(DirProp(dirOld)), dirNew);
  1522.             Print("Link made.\n");
  1523.             changeDone("made a new link");
  1524.             true
  1525.         fi
  1526.         fi
  1527.     fi
  1528.     fi
  1529. corp;
  1530.  
  1531. VerbTail(g_room, "same", brv_same).
  1532.  
  1533. define tp_build1 proc utility brv_scenery()bool:
  1534.     string s;
  1535.     bool hadOne;
  1536.  
  1537.     hadOne := false;
  1538.     while
  1539.     s := GetWord();
  1540.     s ~= ""
  1541.     do
  1542.     hadOne := true;
  1543.     Scenery(Here(), s);
  1544.     od;
  1545.     if hadOne then
  1546.     Print("New scenery words added.\n");
  1547.     true
  1548.     else
  1549.     Print("Use is: @room scenery <word> ... <word>\n");
  1550.     false
  1551.     fi
  1552. corp;
  1553.  
  1554. VerbTail(g_room, "scenery", brv_scenery).
  1555.  
  1556. define tp_build1 proc utility brv_endNewdesc(string s)void:
  1557.     thing here;
  1558.  
  1559.     here := Here();
  1560.     /* Be careful that someone has not walked out of the Playpen while
  1561.        editing the room description! */
  1562.     if Me()@p_pBuilder or here@p_rPlayPen then
  1563.     s := Trim(s);
  1564.     if s = "" then
  1565.         here -- p_rDesc;
  1566.         Print("Room description deleted.\n");
  1567.     else
  1568.         here@p_rDesc := s;
  1569.         Print("Room decorated.\n");
  1570.     fi;
  1571.     changeDone("decorated this room");
  1572.     else
  1573.     Print("Description change cancelled.\n");
  1574.     fi;
  1575. corp;
  1576.  
  1577. define tp_build proc utility brv_newdesc()bool:
  1578.  
  1579.     GetDocument("new room desc> ", "Enter room description", Here()@p_rDesc,
  1580.     brv_endNewdesc, false)
  1581. corp;
  1582.  
  1583. Verb0(g_room, "newdesc", 0, brv_newdesc).
  1584.  
  1585. define tp_build1 proc utility brv_endAdddesc1(string s)void:
  1586.  
  1587.     if Me()@p_pBuilder or Here()@p_rPlayPen then
  1588.     s := Trim(s);
  1589.     if s = "" then
  1590.         Print("Room description not changed.\n");
  1591.     else
  1592.         Here()@p_rDesc := s;
  1593.         Print("Room redecorated.\n");
  1594.         changeDone("redecorated this room");
  1595.     fi;
  1596.     else
  1597.     Print("Description change cancelled.\n");
  1598.     fi;
  1599. corp;
  1600.  
  1601. define tp_build1 proc utility brv_endAdddesc2(string s)void:
  1602.  
  1603.     if Me()@p_pBuilder or Here()@p_rPlayPen then
  1604.     s := Trim(s);
  1605.     if s = "" then
  1606.         Print("Room description not changed.\n");
  1607.     else
  1608.         ExtendDesc(Here(), s);
  1609.         Print("Room redecorated.\n");
  1610.         changeDone("redecorated this room");
  1611.     fi;
  1612.     else
  1613.     Print("Description change cancelled.\n");
  1614.     fi;
  1615. corp;
  1616.  
  1617. define tp_build1 proc utility brv_adddesc()bool:
  1618.  
  1619.     if CanEdit() then
  1620.     GetDocument("add room desc> ", "Edit room description", Here()@p_rDesc,
  1621.         brv_endAdddesc1, false)
  1622.     else
  1623.     GetDocument("add room desc> ", "Edit room description", "",
  1624.         brv_endAdddesc2, false)
  1625.     fi
  1626. corp;
  1627.  
  1628. Verb0(g_room, "adddesc", 0, brv_adddesc).
  1629.  
  1630. define tp_build1 proc utility brv_setdescaction(string name)bool:
  1631.     action a;
  1632.  
  1633.     if name = "" then
  1634.     Print("Use is: @room setdescaction <action-symbol>\n");
  1635.     false
  1636.     else
  1637.     if name == "nil" then
  1638.         Here() -- p_rDescAction;
  1639.         Print("Descaction removed.\n");
  1640.         changeDone("altered something here");
  1641.         true
  1642.     else
  1643.         a := actionNameCheck(name);
  1644.         if a = nil then
  1645.         false
  1646.         else
  1647.         Here()@p_rDescAction := a;
  1648.         Print("Descaction set.\n");
  1649.         changeDone("altered something here");
  1650.         true
  1651.         fi
  1652.     fi
  1653.     fi
  1654. corp;
  1655.  
  1656. Verb1(g_room, "setdescaction", 0, brv_setdescaction).
  1657.  
  1658. define tp_build1 proc utility brv_addspecialaction()bool:
  1659.     string name, command;
  1660.     action a;
  1661.  
  1662.     name := GetWord();
  1663.     command := GetWord();
  1664.     if name = "" or command = "" or GetWord() ~= "" then
  1665.     Print("Use is: @room addspecialaction <action-symbol> <verb-form>\n");
  1666.     false
  1667.     else
  1668.     a := actionNameCheck(name);
  1669.     if a = nil then
  1670.         false
  1671.     else
  1672.         AddSpecialCommand(Here(), command, a);
  1673.         Print("Special command set.\n");
  1674.         changeDone("altered something here");
  1675.         true
  1676.     fi
  1677.     fi
  1678. corp;
  1679.  
  1680. VerbTail(g_room, "addspecialaction", brv_addspecialaction).
  1681.  
  1682. define tp_build1 proc utility brv_subspecialaction()bool:
  1683.     string name, command;
  1684.     action a;
  1685.  
  1686.     name := GetWord();
  1687.     command := GetWord();
  1688.     if name = "" or command = "" or GetWord() ~= "" then
  1689.     Print("Use is: @room subspecialaction <action-symbol> <verb-form>\n");
  1690.     false
  1691.     else
  1692.     a := actionNameCheck(name);
  1693.     if a = nil then
  1694.         false
  1695.     else
  1696.         if RemoveSpecialCommand(Here(), command, a) then
  1697.         Print("Special command set.\n");
  1698.         changeDone("altered something here");
  1699.         true
  1700.         else
  1701.         Print("That special command is not set here.\n");
  1702.         false
  1703.         fi
  1704.     fi
  1705.     fi
  1706. corp;
  1707.  
  1708. VerbTail(g_room, "subspecialaction", brv_subspecialaction).
  1709.  
  1710. define tp_build proc utility doMakeLink(string s; int dir)bool:
  1711.     thing there;
  1712.  
  1713.     there := LookupThing(nil, s);
  1714.     if there = nil then
  1715.     if IsDefined(nil, s) then
  1716.         Print("Name '" + s + "' is not a room.\n");
  1717.     else
  1718.         Print("Name '" + s + "' is not defined.\n");
  1719.     fi;
  1720.     false
  1721.     elif there@p_rName = "" and there@p_rNameAction = nil then
  1722.     Print("Name '" + s + "' is not a room.\n");
  1723.     false
  1724.     elif Here()@p_rPlayPen and not there@p_rPlayPen then
  1725.     Print("Cannot link to non-playpen rooms from playpen rooms\n");
  1726.     false
  1727.     elif not Mine(there) and (GetThingStatus(there) = ts_readonly or
  1728.     GetThingStatus(there) = ts_wizard and not IsWizard()) and
  1729.     MeCharacter() ~= SysAdmin
  1730.     then
  1731.     Print("The owner of that room has not permitted it.\n");
  1732.     false
  1733.     else
  1734.     UniConnect(Here(), there, dir);
  1735.     Print("Link made.\n");
  1736.     changeDone("made a new link");
  1737.     true
  1738.     fi
  1739. corp;
  1740.  
  1741. define tp_build1 proc utility brv_linkto()bool:
  1742.     thing here;
  1743.     string error, s;
  1744.     int dir;
  1745.  
  1746.     error := "Use is: @room linkto <dir> <room-symbol>\n";
  1747.     here := Here();
  1748.     s := GetWord();
  1749.     if s = "" then
  1750.     Print(error);
  1751.     false
  1752.     else
  1753.     dir := DirMatch(s);
  1754.     if dir = -1 then
  1755.         Print(error);
  1756.         false
  1757.     elif here@(DirProp(dir)) ~= nil then
  1758.         Print("That direction is already in use.\n");
  1759.         false
  1760.     else
  1761.         s := GetWord();
  1762.         if s = "" or GetWord() ~= "" then
  1763.         Print(error);
  1764.         false
  1765.         else
  1766.         doMakeLink(s, dir)
  1767.         fi
  1768.     fi
  1769.     fi
  1770. corp;
  1771.  
  1772. VerbTail(g_room, "linkto", brv_linkto).
  1773.  
  1774. define tp_build proc utility brv_unlink(string dirName)bool:
  1775.     int dir;
  1776.     list int exits;
  1777.  
  1778.     dir := DirMatch(dirName);
  1779.     if dir = -1 then
  1780.     Print("Use is: @room unlink <dir>\n");
  1781.     false
  1782.     elif Here()@(DirProp(dir)) = nil then
  1783.     Print("There is no link in that direction from here.\n");
  1784.     false
  1785.     elif dir = D_NORTH and Here() = r_playPen then
  1786.     Print("Only a wizard or apprentice can remove the Playpen's exit.\n");
  1787.     false
  1788.     else
  1789.     Here() -- DirProp(dir);
  1790.     exits := Here()@p_rExits;
  1791.     if exits ~= nil then
  1792.         DelElement(exits, dir);
  1793.     fi;
  1794.     Print("Connection removed.\n");
  1795.     changeDone("removed a link");
  1796.     true
  1797.     fi
  1798. corp;
  1799.  
  1800. Verb1(g_room, "unlink", 0, brv_unlink).
  1801.  
  1802. define tp_build proc utility brv_dark(string s)bool:
  1803.     thing here;
  1804.  
  1805.     here := Here();
  1806.     if not Mine(here) then
  1807.     Print("Can only change the lighting in your own rooms.\n");
  1808.     false
  1809.     else
  1810.     if s = "" then
  1811.         s := "y";
  1812.     fi;
  1813.     if isYes(s) then
  1814.         here@p_rDark := true;
  1815.         Print("This room is now dark.\n");
  1816.         if Me()@p_pHidden then
  1817.         OPrint("The light has gone away.\n");
  1818.         else
  1819.         OPrint(Capitalize(Me()@p_pName) + " has removed the light.\n");
  1820.         fi;
  1821.         true
  1822.     elif isNo(s) then
  1823.         here -- p_rDark;
  1824.         Print("This room is now lighted.\n");
  1825.         if Me()@p_pHidden then
  1826.         OPrint("Light has appeared\n");
  1827.         else
  1828.         OPrint(Capitalize(Me()@p_pName) + " has created light.\n");
  1829.         fi;
  1830.         true
  1831.     else
  1832.         Print("Use is: @room dark [y|n]\n");
  1833.         false
  1834.     fi
  1835.     fi
  1836. corp;
  1837.  
  1838. Verb1(g_room, "dark", 0, brv_dark).
  1839.  
  1840. define tp_build proc utility brv_lock(string s)bool:
  1841.     thing here;
  1842.  
  1843.     here := Here();
  1844.     if not Mine(here) then
  1845.     Print("Can only lock/unlock your own rooms.\n");
  1846.     false
  1847.     else
  1848.     if s = "" then
  1849.         s := "y";
  1850.     fi;
  1851.     if isYes(s) then
  1852.         here@p_rLocked := true;
  1853.         Print("This room is now locked from public access.\n");
  1854.         true
  1855.     elif isNo(s) then
  1856.         here -- p_rLocked;
  1857.         Print("This room is now available for public access.\n");
  1858.         true
  1859.     else
  1860.         Print("Use is: @room lock [y|n]\n");
  1861.         false
  1862.     fi
  1863.     fi
  1864. corp;
  1865.  
  1866. Verb1(g_room, "lock", 0, brv_lock).
  1867.  
  1868. define tp_build1 proc utility brv_status(string s)bool:
  1869.     string error;
  1870.     thing here;
  1871.  
  1872.     here := Here();
  1873.     if not Mine(here) then
  1874.     Print("Can only change the status on your own rooms.\n");
  1875.     false
  1876.     else
  1877.     error := "Use is: @room status {readonly|wizard|public}\n";
  1878.     if s = "" then
  1879.         Print(error);
  1880.         false
  1881.     else
  1882.         if s == "readonly" then
  1883.         SetThingStatus(here, ts_readonly);
  1884.         Print("This room is now changeable by its owner only.\n");
  1885.         true
  1886.         elif s == "wizard" then
  1887.         SetThingStatus(here, ts_wizard);
  1888.         Print("This room is now changeable by wizards only.\n");
  1889.         true
  1890.         elif s == "public" then
  1891.         SetThingStatus(here, ts_public);
  1892.         Print(
  1893.     "This room is now changeable by wizards, apprentices and builders.\n");
  1894.         true
  1895.         else
  1896.         Print(error);
  1897.         false
  1898.         fi
  1899.     fi
  1900.     fi
  1901. corp;
  1902.  
  1903. Verb1(g_room, "status", 0, brv_status).
  1904.  
  1905. define tp_build1 proc utility brv_endDirDesc(string s)void:
  1906.     thing me, here;
  1907.  
  1908.     me := Me();
  1909.     here := Here();
  1910.     if me@p_pBuilder or here@p_rPlayPen then
  1911.     s := Trim(s);
  1912.     if s = "" then
  1913.         here -- DirDesc(me@p_pActiveDir);
  1914.         Print("Direction description deleted.\n");
  1915.     else
  1916.         here@(DirDesc(me@p_pActiveDir)) := s;
  1917.         Print("Direction decorated.\n");
  1918.     fi;
  1919.     changeDone("done some detailing");
  1920.     else
  1921.     Print("Direction description change cancelled.\n");
  1922.     fi;
  1923.     me -- p_pActiveDir;
  1924. corp;
  1925.  
  1926. define tp_build1 proc utility brv_dirdesc(string where)bool:
  1927.     int dir;
  1928.  
  1929.     dir := DirMatch(where);
  1930.     if dir = -1 then
  1931.     Print("Use is: @room dirdesc <dir>\n");
  1932.     false
  1933.     else
  1934.     Me()@p_pActiveDir := dir;
  1935.     GetDocument("room dirdesc> ", "Enter direction description", "",
  1936.         brv_endDirDesc, false)
  1937.     fi
  1938. corp;
  1939.  
  1940. Verb1(g_room, "dirdesc", 0, brv_dirdesc).
  1941.  
  1942. define tp_build1 proc utility brv_endDirMessage(string s)void:
  1943.     thing me, here;
  1944.  
  1945.     me := Me();
  1946.     here := Here();
  1947.     if me@p_pBuilder or here@p_rPlayPen then
  1948.     s := Trim(s);
  1949.     if s = "" then
  1950.         if me@p_pActiveDir = 100 then
  1951.         here -- p_rNoGoString;
  1952.         Print("NoGo string deleted.\n");
  1953.         else
  1954.         here -- DirMessage(me@p_pActiveDir);
  1955.         Print("Direction message deleted.\n");
  1956.         fi;
  1957.     else
  1958.         if me@p_pActiveDir = 100 then
  1959.         here@p_rNoGoString := s;
  1960.         Print("NoGo message entered.\n");
  1961.         else
  1962.         here@(DirMessage(me@p_pActiveDir)) := s;
  1963.         Print("Direction message entered.\n");
  1964.         fi;
  1965.     fi;
  1966.     changeDone("done some detailing");
  1967.     else
  1968.     Print("Message change cancelled.\n");
  1969.     fi;
  1970.     me -- p_pActiveDir;
  1971. corp;
  1972.  
  1973. define tp_build1 proc utility brv_dirmessage(string where)bool:
  1974.     int dir;
  1975.  
  1976.     if where == "nogo" then
  1977.     dir := 100;
  1978.     else
  1979.     dir := DirMatch(where);
  1980.     fi;
  1981.     if dir = -1 then
  1982.     Print("Use is: @room dirmessage <dir>\n");
  1983.     false
  1984.     else
  1985.     Me()@p_pActiveDir := dir;
  1986.     GetDocument("room dirmessage> ", "Enter direction message", "",
  1987.         brv_endDirMessage, false)
  1988.     fi
  1989. corp;
  1990.  
  1991. Verb1(g_room, "dirmessage", 0, brv_dirmessage).
  1992.  
  1993. define tp_build1 proc utility brv_endDirOMessage(string s)void:
  1994.     thing me, here;
  1995.  
  1996.     me := Me();
  1997.     here := Here();
  1998.     if me@p_pBuilder or here@p_rPlayPen then
  1999.     s := Trim(s);
  2000.     if s = "" then
  2001.         here -- DirOMessage(me@p_pActiveDir);
  2002.         Print("Direction message deleted.\n");
  2003.     else
  2004.         here@(DirOMessage(me@p_pActiveDir)) := s;
  2005.         Print("Direction message entered.\n");
  2006.     fi;
  2007.     changeDone("done some detailing");
  2008.     else
  2009.     Print("Message change cancelled.\n");
  2010.     fi;
  2011.     me -- p_pActiveDir;
  2012. corp;
  2013.  
  2014. define tp_build1 proc utility brv_diromessage(string where)bool:
  2015.     int dir;
  2016.  
  2017.     dir := DirMatch(where);
  2018.     if dir = -1 then
  2019.     Print("Use is: @room diromessage <dir>\n");
  2020.     false
  2021.     else
  2022.     Me()@p_pActiveDir := dir;
  2023.     GetDocument("room diromessage> ", "Enter entering direction message",
  2024.         "", brv_endDirOMessage, false)
  2025.     fi
  2026. corp;
  2027.  
  2028. Verb1(g_room, "diromessage", 0, brv_diromessage).
  2029.  
  2030. define tp_build1 proc utility brv_endDirEMessage(string s)void:
  2031.     thing me, here;
  2032.  
  2033.     me := Me();
  2034.     here := Here();
  2035.     if me@p_pBuilder or here@p_rPlayPen then
  2036.     s := Trim(s);
  2037.     if s = "" then
  2038.         here -- DirEMessage(me@p_pActiveDir);
  2039.         Print("Direction message deleted.\n");
  2040.     else
  2041.         here@(DirEMessage(me@p_pActiveDir)) := s;
  2042.         Print("Direction message entered.\n");
  2043.     fi;
  2044.     changeDone("done some detailing");
  2045.     else
  2046.     Print("Message change cancelled.\n");
  2047.     fi;
  2048.     me -- p_pActiveDir;
  2049. corp;
  2050.  
  2051. define tp_build1 proc utility brv_diremessage(string where)bool:
  2052.     int dir;
  2053.  
  2054.     dir := DirMatch(where);
  2055.     if dir = -1 then
  2056.     Print("Use is: @room diremessage <dir>\n");
  2057.     false
  2058.     else
  2059.     Me()@p_pActiveDir := dir;
  2060.     GetDocument("room diremessage> ", "Enter exiting direction message","",
  2061.         brv_endDirEMessage, false)
  2062.     fi
  2063. corp;
  2064.  
  2065. Verb1(g_room, "diremessage", 0, brv_diremessage).
  2066.  
  2067. define tp_build1 proc utility brv_adddircheck()bool:
  2068.     string dirName, name;
  2069.     int dir;
  2070.     action a;
  2071.  
  2072.     dirName := GetWord();
  2073.     name := GetWord();
  2074.     if dirName == "anyenter" then
  2075.     dir := 100;
  2076.     elif dirName == "anyexit" then
  2077.     dir := 101;
  2078.     else
  2079.     dir := DirMatch(dirName);
  2080.     fi;
  2081.     if dir = -1 or name = "" or GetWord() ~= "" then
  2082.     Print("Use is: @room adddircheck <dir> <action-symbol>\n");
  2083.     false
  2084.     else
  2085.     a := actionNameCheck(name);
  2086.     if a = nil then
  2087.         false
  2088.     else
  2089.         if dir = 100 then
  2090.         AddAnyEnterChecker(Here(), a, false);
  2091.         elif dir = 101 then
  2092.         AddAnyLeaveChecker(Here(), a, false);
  2093.         else
  2094.         AddDirChecker(Here(), dir, a, false);
  2095.         fi;
  2096.         Print("Dircheck entered.\n");
  2097.         changeDone("altered something here");
  2098.         true
  2099.     fi
  2100.     fi
  2101. corp;
  2102.  
  2103. VerbTail(g_room, "adddircheck", brv_adddircheck).
  2104.  
  2105. define tp_build1 proc utility brv_subdircheck()bool:
  2106.     string dirName, name;
  2107.     int dir;
  2108.     action a;
  2109.  
  2110.     dirName := GetWord();
  2111.     name := GetWord();
  2112.     if dirName == "anyenter" then
  2113.     dir := 100;
  2114.     elif dirName == "anyexit" then
  2115.     dir := 101;
  2116.     else
  2117.     dir := DirMatch(dirName);
  2118.     fi;
  2119.     if dir = -1 or name = "" or GetWord() ~= "" then
  2120.     Print("Use is: @room subdircheck <dir> <action-symbol>\n");
  2121.     false
  2122.     else
  2123.     a := actionNameCheck(name);
  2124.     if a = nil then
  2125.         false
  2126.     else
  2127.         if dir = 100 then
  2128.         DelAnyEnterChecker(Here(), a);
  2129.         elif dir = 101 then
  2130.         DelAnyLeaveChecker(Here(), a);
  2131.         else
  2132.         DelDirChecker(Here(), dir, a);
  2133.         fi;
  2134.         Print("Dircheck removed.\n");
  2135.         changeDone("altered something here");
  2136.         true
  2137.     fi
  2138.     fi
  2139. corp;
  2140.  
  2141. VerbTail(g_room, "subdircheck", brv_subdircheck).
  2142.  
  2143. /* need to steal a couple of private definitions */
  2144. use tp_base
  2145.  
  2146. define tp_build1 proc utility brv_showdirchecks(string dirName)bool:
  2147.     list action la;
  2148.     action a;
  2149.     int count, dir, i;
  2150.     string procName;
  2151.  
  2152.     if dirName == "anyenter" then
  2153.     dir := 100;
  2154.     elif dirName == "anyexit" then
  2155.     dir := 101;
  2156.     else
  2157.     dir := DirMatch(dirName);
  2158.     fi;
  2159.     if dir = -1 then
  2160.     Print("Use is: @room showdirchecks <dir>\n");
  2161.     false
  2162.     else
  2163.     if dir = 100 then
  2164.         la := Here()@p_rAnyEnterChecks;
  2165.     elif dir = 101 then
  2166.         la := Here()@p_rAnyLeaveChecks;
  2167.     else
  2168.         la := Here()@(DirChecks(dir));
  2169.     fi;
  2170.     if la = nil then
  2171.         Print("There are no checkers for that direction here.\n");
  2172.     else
  2173.         count := Count(la);
  2174.         i := 0;
  2175.         while i ~= count do
  2176.         Print("Checker ");
  2177.         IPrint(i);
  2178.         Print(":");
  2179.         procName := FindActionSymbol(nil, la[i]);
  2180.         if procName ~= "" then
  2181.             Print(" " + procName + "\n");
  2182.         else
  2183.             Print("\n");
  2184.             PrintAction(la[i]);
  2185.         fi;
  2186.         i := i + 1;
  2187.         od;
  2188.     fi;
  2189.     true
  2190.     fi
  2191. corp;
  2192.  
  2193. unuse tp_base
  2194.  
  2195. Verb1(g_room, "showdirchecks", 0, brv_showdirchecks).
  2196.  
  2197. define tp_build1 proc utility brv_checker()bool:
  2198.     string tableName, name;
  2199.     table theTable;
  2200.  
  2201.     tableName := GetWord();
  2202.     name := GetWord();
  2203.     if tableName = "" or name = "" or GetWord() ~= "" then
  2204.     Print("Use is: @room checker <table> <action-symbol>\n");
  2205.     false
  2206.     else
  2207.     theTable := findTable(tableName, false);
  2208.     if theTable = nil then
  2209.         false
  2210.     elif IsDefined(theTable, name) then
  2211.         Print("'" + name + "' is already defined.\n");
  2212.         false
  2213.     else
  2214.         getAction(theTable, name, ck_roomChecker)
  2215.     fi
  2216.     fi
  2217. corp;
  2218.  
  2219. VerbTail(g_room, "checker", brv_checker).
  2220.  
  2221. define tp_build1 proc utility brv_descaction()bool:
  2222.     string tableName, name;
  2223.     table theTable;
  2224.  
  2225.     tableName := GetWord();
  2226.     name := GetWord();
  2227.     if tableName = "" or name = "" or GetWord() ~= "" then
  2228.     Print("Use is: @room descaction <table> <action-symbol>\n");
  2229.     false
  2230.     else
  2231.     theTable := findTable(tableName, false);
  2232.     if theTable = nil then
  2233.         false
  2234.     elif IsDefined(theTable, name) then
  2235.         Print("'" + name + "' is already defined.\n");
  2236.         false
  2237.     else
  2238.         getAction(theTable, name, ck_roomDesc)
  2239.     fi
  2240.     fi
  2241. corp;
  2242.  
  2243. VerbTail(g_room, "descaction", brv_descaction).
  2244.  
  2245. define tp_build1 proc utility brv_specialaction()bool:
  2246.     string tableName, name;
  2247.     table theTable;
  2248.  
  2249.     tableName := GetWord();
  2250.     name := GetWord();
  2251.     if tableName = "" or name = "" or GetWord() ~= "" then
  2252.     Print("Use is: @room specialaction <table> <action-symbol>\n");
  2253.     false
  2254.     else
  2255.     theTable := findTable(tableName, false);
  2256.     if theTable = nil then
  2257.         false
  2258.     elif IsDefined(theTable, name) then
  2259.         Print("'" + name + "' is already defined.\n");
  2260.         false
  2261.     else
  2262.         getAction(theTable, name, ck_roomVoid)
  2263.     fi
  2264.     fi
  2265. corp;
  2266.  
  2267. VerbTail(g_room, "specialaction", brv_specialaction).
  2268.  
  2269. define tp_build proc utility brv_makebank()bool:
  2270.     thing here;
  2271.  
  2272.     here := Here();
  2273.     if not Mine(here) then
  2274.     Print("Can only make your own rooms into banks.\n");
  2275.     false
  2276.     elif IsBank(here) then
  2277.     if UnmakeBank(here) = succeed then
  2278.         Print("This room is no longer a bank.\n");
  2279.         true
  2280.     else
  2281.         Print("Bank cannot be unmade - it has accounts.\n");
  2282.         false
  2283.     fi
  2284.     else
  2285.     MakeBank(here);
  2286.     Print("This room is now a bank.\n");
  2287.     true
  2288.     fi
  2289. corp;
  2290.  
  2291. Verb0(g_room, "makebank", 0, brv_makebank).
  2292.  
  2293. define tp_build proc utility brv_makestore()bool:
  2294.     thing here;
  2295.  
  2296.     here := Here();
  2297.     if not Mine(here) then
  2298.     Print("Can only make your own rooms into stores.\n");
  2299.     false
  2300.     else
  2301.     if IsStore(here) then
  2302.         UnmakeStore(here);
  2303.         Print("This room is no longer a store.\n");
  2304.         false
  2305.     else
  2306.         MakeStore(here);
  2307.         Print("This room is now a store.\n");
  2308.         true
  2309.     fi
  2310.     fi
  2311. corp;
  2312.  
  2313. Verb0(g_room, "makestore", 0, brv_makestore).
  2314.  
  2315. define tp_build1 proc utility brv_addforsale()bool:
  2316.     string symbol;
  2317.     int price;
  2318.     thing here, th;
  2319.  
  2320.     here := Here();
  2321.     if not Mine(here) then
  2322.     Print("Can only modify your own stores.\n");
  2323.     false
  2324.     elif here@p_rBuyAction ~= StoreBuy then
  2325.     Print("This room is not a store.\n");
  2326.     false
  2327.     else
  2328.     symbol := GetWord();
  2329.     price := StringToPosInt(GetWord());
  2330.     if symbol = "" or price <= 0 or GetWord() ~= "" then
  2331.         Print("Use is: @room addforsale <object-symbol> <price>\n");
  2332.         false
  2333.     else
  2334.         th := objNameCheck(symbol);
  2335.         if th ~= nil then
  2336.         AddObjectForSale(here, th, price, nil);
  2337.         Print(FormatName(th@p_oName) + " is now for sale here.\n");
  2338.         true
  2339.         else
  2340.         false
  2341.         fi
  2342.     fi
  2343.     fi
  2344. corp;
  2345.  
  2346. VerbTail(g_room, "addforsale", brv_addforsale).
  2347.  
  2348. define tp_build1 proc utility brv_subforsale()bool:
  2349.     string symbol;
  2350.     thing here, th;
  2351.  
  2352.     here := Here();
  2353.     if not Mine(here) then
  2354.     Print("Can only modify your own stores.\n");
  2355.     false
  2356.     elif here@p_rBuyAction ~= StoreBuy then
  2357.     Print("This room is not a store.\n");
  2358.     false
  2359.     else
  2360.     symbol := GetWord();
  2361.     if symbol = "" or GetWord() ~= "" then
  2362.         Print("Use is: @room subforsale <object-symbol>\n");
  2363.         false
  2364.     else
  2365.         th := objNameCheck(symbol);
  2366.         if th ~= nil then
  2367.         if SubObjectForSale(here, th) then
  2368.             Print(FormatName(th@p_oName) +
  2369.             " is no longer for sale here.\n");
  2370.             true
  2371.         else
  2372.             Print(FormatName(th@p_oName) + " is not for sale here.\n");
  2373.             false
  2374.         fi
  2375.         else
  2376.         false
  2377.         fi
  2378.     fi
  2379.     fi
  2380. corp;
  2381.  
  2382. VerbTail(g_room, "subforsale", brv_subforsale).
  2383.  
  2384. /*****************************************************************************\
  2385. *                                          *
  2386. *        now some subsubcommands for building objects              *
  2387. *                                          *
  2388. \*****************************************************************************/
  2389.  
  2390. define tp_build1 g_object CreateGrammar().
  2391.  
  2392. define tp_build1 proc utility bv_object()bool:
  2393.     string s;
  2394.  
  2395.     s := GetTail();
  2396.     if s = "" then
  2397.     Print("Missing object command - "
  2398.           "see builder's library for details.\n");
  2399.     true
  2400.     else
  2401.     Parse(g_object, s) ~= 0
  2402.     fi
  2403. corp;
  2404.  
  2405. VerbTail(g_build, "o", bv_object).
  2406. Synonym(g_build, "o", "object").
  2407.  
  2408. define tp_build proc utility createNewObject(string name; table theTable;
  2409.     string symbol)thing:
  2410.     thing me, th;
  2411.  
  2412.     me := Me();
  2413.     if Count(me@p_pCarrying) >= MAX_CARRY then
  2414.     Print("You can't carry anything else.\n");
  2415.     nil
  2416.     else
  2417.     th := CreateThing(nil);
  2418.     th@p_oName := name;
  2419.     th@p_oHome := Here();
  2420.     th@p_oCarryer := me;
  2421.     th@p_oCreator := me;
  2422.     if Here()@p_rPlayPen then
  2423.         th@p_rPlayPen := true;
  2424.     fi;
  2425.     SetThingStatus(th, ts_public);
  2426.     GiveThing(th, SysAdmin);
  2427.     AddTail(me@p_pCarrying, th);
  2428.     if DefineThing(theTable, symbol, th) then
  2429.         Print("Object created - you are carrying it.\n");
  2430.         changeDone("created something");
  2431.     fi;
  2432.     th
  2433.     fi
  2434. corp;
  2435.  
  2436. define tp_build1 proc utility bov_new()bool:
  2437.     string tableName, symbol, name;
  2438.     table theTable;
  2439.     thing me, th;
  2440.  
  2441.     tableName := GetWord();
  2442.     symbol := GetWord();
  2443.     name := GetWord();
  2444.     if tableName = "" or symbol = "" or name = "" or GetWord() ~= "" then
  2445.     Print(
  2446.        "Use is: @object new <table> <object-symbol> \"noun[;adj,...,adj]\"\n");
  2447.     false
  2448.     else
  2449.     theTable := findTable(tableName, false);
  2450.     if theTable = nil then
  2451.         false
  2452.     elif IsDefined(theTable, symbol) then
  2453.         Print("'" + symbol + "' is already defined.\n");
  2454.         false
  2455.     else
  2456.         createNewObject(name, theTable, symbol) ~= nil
  2457.     fi
  2458.     fi
  2459. corp;
  2460.  
  2461. VerbTail(g_object, "new", bov_new).
  2462.  
  2463. define tp_build1 proc utility bov_newname()bool:
  2464.     string symbol, newName;
  2465.     thing th;
  2466.  
  2467.     symbol := GetWord();
  2468.     newName := GetWord();
  2469.     if symbol = "" or newName = "" or GetWord() ~= "" then
  2470.     Print(
  2471.        "Use is: @object newname <object-symbol> \"noun[;adj,...,adj]\"\n");
  2472.     false
  2473.     else
  2474.     th := objNameCheck(symbol);
  2475.     if th ~= nil then
  2476.         th@p_oName := newName;
  2477.         Print("Your object '" + symbol + "' will now be seen as '" +
  2478.           FormatName(newName) + "'.\n");
  2479.         true
  2480.     else
  2481.         false
  2482.     fi
  2483.     fi
  2484. corp;
  2485.  
  2486. VerbTail(g_object, "newname", bov_newname).
  2487. Synonym(g_object, "newname", "name").
  2488.  
  2489. define tp_build1 proc utility bov_endNewdesc(string s)void:
  2490.     thing me;
  2491.  
  2492.     me := Me();
  2493.     s := Trim(s);
  2494.     if s = "" then
  2495.     me@p_pActiveThing -- p_oDesc;
  2496.     Print("Object description deleted.\n");
  2497.     else
  2498.     me@p_pActiveThing@p_oDesc := s;
  2499.     Print("Object description entered.\n");
  2500.     fi;
  2501.     me -- p_pActiveThing;
  2502. corp;
  2503.  
  2504. define tp_build proc utility doObjectDesc(thing th)bool:
  2505.  
  2506.     Me()@p_pActiveThing := th;
  2507.     GetDocument("new object desc> ", "Enter new description",
  2508.     th@p_oDesc, bov_endNewdesc, false)
  2509. corp;
  2510.  
  2511. define tp_build1 proc utility bov_newdesc(string symbol)bool:
  2512.     thing th;
  2513.  
  2514.     if symbol = "" then
  2515.     Print("Use is: @object newdesc <object-symbol>\n");
  2516.     false
  2517.     else
  2518.     th := objNameCheck(symbol);
  2519.     if th ~= nil then
  2520.         doObjectDesc(th)
  2521.     else
  2522.         false
  2523.     fi
  2524.     fi
  2525. corp;
  2526.  
  2527. Verb1(g_object, "newdesc", 0, bov_newdesc).
  2528. Synonym(g_object, "newdesc", "desc").
  2529.  
  2530. define tp_build1 proc utility bov_endReadstring(string s)void:
  2531.     thing me;
  2532.  
  2533.     me := Me();
  2534.     s := Trim(s);
  2535.     if s = "" then
  2536.     me@p_pActiveThing -- p_oReadString;
  2537.     Print("Object readstring deleted.\n");
  2538.     else
  2539.     me@p_pActiveThing@p_oReadString := s;
  2540.     Print("Object readstring entered.\n");
  2541.     fi;
  2542.     me -- p_pActiveThing;
  2543. corp;
  2544.  
  2545. define tp_build proc utility doObjectRead(thing th)bool:
  2546.  
  2547.     Me()@p_pActiveThing := th;
  2548.     GetDocument("new object readstring> ", "Enter new readstring",
  2549.     th@p_oReadString, bov_endReadstring, false)
  2550. corp;
  2551.  
  2552. define tp_build1 proc utility bov_readstring(string symbol)bool:
  2553.     thing th;
  2554.  
  2555.     if symbol = "" then
  2556.     Print("Use is: @object readstring <object-symbol>\n");
  2557.     false
  2558.     else
  2559.     th := objNameCheck(symbol);
  2560.     if th ~= nil then
  2561.         doObjectRead(th)
  2562.     else
  2563.         false
  2564.     fi
  2565.     fi
  2566. corp;
  2567.  
  2568. Verb1(g_object, "readstring", 0, bov_readstring).
  2569.  
  2570. define tp_build1 proc utility bov_setdescaction()bool:
  2571.     string thingName, name;
  2572.     thing th;
  2573.     action a;
  2574.  
  2575.     thingName := GetWord();
  2576.     name := GetWord();
  2577.     if thingName = "" or name = "" or GetWord() ~= "" then
  2578.     Print(
  2579.         "Use is: @object setdescaction <object-symbol> <action-symbol>\n");
  2580.     false
  2581.     else
  2582.     th := objNameCheck(thingName);
  2583.     if th ~= nil then
  2584.         if name == "nil" then
  2585.         th -- p_oDescAction;
  2586.         Print("Descaction removed.\n");
  2587.         true
  2588.         else
  2589.         a := actionNameCheck(name);
  2590.         if a = nil then
  2591.             false
  2592.         else
  2593.             th@p_oDescAction := a;
  2594.             Print("Descaction set.\n");
  2595.             true
  2596.         fi
  2597.         fi
  2598.     else
  2599.         false
  2600.     fi
  2601.     fi
  2602. corp;
  2603.  
  2604. VerbTail(g_object, "setdescaction", bov_setdescaction).
  2605.  
  2606. define tp_build1 proc utility bov_setreadaction()bool:
  2607.     string thingName, name;
  2608.     thing th;
  2609.     action a;
  2610.  
  2611.     thingName := GetWord();
  2612.     name := GetWord();
  2613.     if thingName = "" or name = "" or GetWord() ~= "" then
  2614.     Print(
  2615.         "Use is: @object setreadaction <object-symbol> <action-symbol>\n");
  2616.     false
  2617.     else
  2618.     th := objNameCheck(thingName);
  2619.     if th ~= nil then
  2620.         if name == "nil" then
  2621.         th -- p_oReadAction;
  2622.         Print("Readaction removed.\n");
  2623.         true
  2624.         else
  2625.         a := actionNameCheck(name);
  2626.         if a = nil then
  2627.             false
  2628.         else
  2629.             th@p_oReadAction := a;
  2630.             Print("Readaction set.\n");
  2631.             true
  2632.         fi
  2633.         fi
  2634.     else
  2635.         false
  2636.     fi
  2637.     fi
  2638. corp;
  2639.  
  2640. VerbTail(g_object, "setreadaction", bov_setreadaction).
  2641.  
  2642. define tp_build1 proc utility bov_setactword()bool:
  2643.     string symbol, word;
  2644.     thing th;
  2645.  
  2646.     symbol := GetWord();
  2647.     word := GetWord();
  2648.     if symbol = "" or word = "" or GetWord() ~= "" then
  2649.     Print(
  2650.       "Use is: @object setactword <object-symbol> \"word,synonym,...\"\n");
  2651.     false
  2652.     else
  2653.     th := objNameCheck(symbol);
  2654.     if th ~= nil then
  2655.         th@p_oActWord := word;
  2656.         Print("Your object '" + symbol + AAn("' will now have", word) +
  2657.           " action.\n");
  2658.         true
  2659.     else
  2660.         false
  2661.     fi
  2662.     fi
  2663. corp;
  2664.  
  2665. VerbTail(g_object, "setactword", bov_setactword).
  2666.  
  2667. define tp_build1 proc utility bov_endSetActString(string s)void:
  2668.     thing me;
  2669.  
  2670.     me := Me();
  2671.     s := Trim(s);
  2672.     if s = "" then
  2673.     me@ p_pActiveThing -- p_oActString;
  2674.     Print("Object actstring deleted.\n");
  2675.     else
  2676.     me@p_pActiveThing@p_oActString := s;
  2677.     Print("Object actstring entered.\n");
  2678.     fi;
  2679.     me -- p_pActiveThing;
  2680. corp;
  2681.  
  2682. define tp_build proc enterActString(thing th)bool:
  2683.  
  2684.     Me()@p_pActiveThing := th;
  2685.     GetDocument("action string> ", "Enter action string",
  2686.     th@p_oActString, bov_endSetActString, false)
  2687. corp;
  2688.  
  2689. define tp_build1 proc utility bov_setactstring(string symbol)bool:
  2690.     thing th;
  2691.  
  2692.     if symbol = "" then
  2693.     Print("Use is: @object setactstring <object-symbol>\n");
  2694.     false
  2695.     else
  2696.     th := objNameCheck(symbol);
  2697.     if th ~= nil then
  2698.         enterActString(th)
  2699.     else
  2700.         false
  2701.     fi
  2702.     fi
  2703. corp;
  2704.  
  2705. Verb1(g_object, "setactstring", 0, bov_setactstring).
  2706.  
  2707. define tp_build1 proc utility bov_setactaction()bool:
  2708.     string thingName, name;
  2709.     thing th;
  2710.     action a;
  2711.  
  2712.     thingName := GetWord();
  2713.     name := GetWord();
  2714.     if thingName = "" or name = "" or GetWord() ~= "" then
  2715.     Print(
  2716.         "Use is: @object setactaction <object-symbol> <action-symbol>\n");
  2717.     false
  2718.     else
  2719.     th := objNameCheck(thingName);
  2720.     if th ~= nil then
  2721.         if name == "nil" then
  2722.         th -- p_oActAction;
  2723.         Print("Actaction removed.\n");
  2724.         true
  2725.         else
  2726.         a := actionNameCheck(name);
  2727.         if a = nil then
  2728.             false
  2729.         else
  2730.             th@p_oActAction := a;
  2731.             Print("Actaction set.\n");
  2732.             true
  2733.         fi
  2734.         fi
  2735.     else
  2736.         false
  2737.     fi
  2738.     fi
  2739. corp;
  2740.  
  2741. VerbTail(g_object, "setactaction", bov_setactaction).
  2742.  
  2743. define tp_build1 proc utility bov_gettable()bool:
  2744.     string errorMessage, symbol, yesNo;
  2745.     thing th;
  2746.  
  2747.     errorMessage := "Use is: @object gettable <object-symbol> [yes|no]\n";
  2748.     symbol := GetWord();
  2749.     if symbol = "" then
  2750.     Print(errorMessage);
  2751.     false
  2752.     else
  2753.     th := objNameCheck(symbol);
  2754.     if th ~= nil then
  2755.         yesNo := GetWord();
  2756.         if yesNo = "" then
  2757.         yesNo := "y";
  2758.         fi;
  2759.         if GetWord() ~= "" then
  2760.         Print(errorMessage);
  2761.         false
  2762.         else
  2763.         if isYes(yesNo) then
  2764.             th -- p_oNotGettable;
  2765.             Print(symbol + " marked as gettable.\n");
  2766.             true
  2767.         elif isNo(yesNo) then
  2768.             th@p_oNotGettable := true;
  2769.             Print(symbol + " marked as not gettable.\n");
  2770.             true
  2771.         else
  2772.             Print(errorMessage);
  2773.             false
  2774.         fi
  2775.         fi
  2776.     else
  2777.         false
  2778.     fi
  2779.     fi
  2780. corp;
  2781.  
  2782. VerbTail(g_object, "gettable", bov_gettable).
  2783.  
  2784. define tp_build1 proc utility bov_islight()bool:
  2785.     string errorMessage, symbol, yesNo;
  2786.     thing th;
  2787.  
  2788.     errorMessage := "Use is: @object islight <object-symbol> [yes|no]\n";
  2789.     symbol := GetWord();
  2790.     if symbol = "" then
  2791.     Print(errorMessage);
  2792.     false
  2793.     else
  2794.     th := objNameCheck(symbol);
  2795.     if th ~= nil then
  2796.         yesNo := GetWord();
  2797.         if yesNo = "" then
  2798.         yesNo := "y";
  2799.         fi;
  2800.         if GetWord() ~= "" then
  2801.         Print(errorMessage);
  2802.         false
  2803.         else
  2804.         if isYes(yesNo) then
  2805.             th@p_oLight := true;
  2806.             Print(symbol + " marked as emitting light.\n");
  2807.             true
  2808.         elif isNo(yesNo) then
  2809.             th -- p_oLight;
  2810.             Print(symbol + " marked as not emitting light.\n");
  2811.             true
  2812.         else
  2813.             Print(errorMessage);
  2814.             false
  2815.         fi
  2816.         fi
  2817.     else
  2818.         false
  2819.     fi
  2820.     fi
  2821. corp;
  2822.  
  2823. VerbTail(g_object, "islight", bov_islight).
  2824. Synonym(g_object, "islight", "light").
  2825.  
  2826. define tp_build1 proc utility bov_invisible()bool:
  2827.     string errorMessage, symbol, yesNo;
  2828.     thing th;
  2829.  
  2830.     errorMessage := "Use is: @object invisible <object-symbol> [yes|no]\n";
  2831.     symbol := GetWord();
  2832.     if symbol = "" then
  2833.     Print(errorMessage);
  2834.     false
  2835.     else
  2836.     th := objNameCheck(symbol);
  2837.     if th ~= nil then
  2838.         yesNo := GetWord();
  2839.         if yesNo = "" then
  2840.         yesNo := "y";
  2841.         fi;
  2842.         if GetWord() ~= "" then
  2843.         Print(errorMessage);
  2844.         false
  2845.         else
  2846.         if isYes(yesNo) then
  2847.             th@p_oInvisible := true;
  2848.             Print(symbol + " marked as invisible.\n");
  2849.             true
  2850.         elif isNo(yesNo) then
  2851.             th -- p_oInvisible;
  2852.             Print(symbol + " marked as not invisible.\n");
  2853.             true
  2854.         else
  2855.             Print(errorMessage);
  2856.             false
  2857.         fi
  2858.         fi
  2859.     else
  2860.         false
  2861.     fi
  2862.     fi
  2863. corp;
  2864.  
  2865. VerbTail(g_object, "invisible", bov_invisible).
  2866.  
  2867. define tp_build1 proc utility bov_container()bool:
  2868.     string symbol, count;
  2869.     thing th;
  2870.     int n;
  2871.  
  2872.     symbol := GetWord();
  2873.     count := GetWord();
  2874.     n := StringToPosInt(count);
  2875.     if symbol = "" or n < 0 or GetWord() ~= "" then
  2876.     Print("Use is @object container <object-symbol> <count>\n");
  2877.     false
  2878.     else
  2879.     th := objNameCheck(symbol);
  2880.     if th ~= nil then
  2881.         if n = 0 then
  2882.         th -- p_oContents;
  2883.         th -- p_oCapacity;
  2884.         Print(symbol + " marked as no longer a container.\n");
  2885.         else
  2886.         th@p_oContents := CreateThingList();
  2887.         th@p_oCapacity := n;
  2888.         Print(symbol + " marked with capacity " + IntToString(n) +
  2889.             ".\n");
  2890.         fi;
  2891.         true
  2892.     else
  2893.         false
  2894.     fi
  2895.     fi
  2896. corp;
  2897.  
  2898. VerbTail(g_object, "container", bov_container).
  2899.  
  2900. define tp_build1 proc utility bov_position()bool:
  2901.     thing me, th;
  2902.     string name, count, verb;
  2903.     int n, which;
  2904.  
  2905.     name := GetWord();
  2906.     count := GetWord();
  2907.     verb := Verb();
  2908.     n := StringToPosInt(count);
  2909.     if name = "" or n < 0 or GetWord() ~= "" then
  2910.     Print("Use is @object " + verb + " <object-symbol> <count>\n");
  2911.     false
  2912.     else
  2913.     th := objNameCheck(name);
  2914.     if th ~= nil then
  2915.         which := MatchName("sitin.siton.liein.lieon.standin.standon",verb);
  2916.         if n = 0 then
  2917.         Print("No-one can now '" + verb + "' '" + name + "'\n");
  2918.         case which
  2919.         incase 0:
  2920.             th -- p_oCanSitIn;
  2921.         incase 1:
  2922.             th -- p_oCanSitOn;
  2923.         incase 2:
  2924.             th -- p_oCanLieIn;
  2925.         incase 3:
  2926.             th -- p_oCanLieOn;
  2927.         incase 4:
  2928.             th -- p_oCanStandIn;
  2929.         incase 5:
  2930.             th -- p_oCanStandOn;
  2931.         esac;
  2932.         else
  2933.         Print(IntToString(n) + " can now '" + verb + "' '" + name +
  2934.             "'\n");
  2935.         n := n + 1;
  2936.         case which
  2937.         incase 0:
  2938.             th@p_oCanSitIn := n;
  2939.         incase 1:
  2940.             th@p_oCanSitOn := n;
  2941.         incase 2:
  2942.             th@p_oCanLieIn := n;
  2943.         incase 3:
  2944.             th@p_oCanLieOn := n;
  2945.         incase 4:
  2946.             th@p_oCanStandIn := n;
  2947.         incase 5:
  2948.             th@p_oCanStandOn := n;
  2949.         esac;
  2950.         fi;
  2951.         true
  2952.     else
  2953.         false
  2954.     fi
  2955.     fi
  2956. corp;
  2957.  
  2958. VerbTail(g_object, "sitin", bov_position).
  2959. VerbTail(g_object, "siton", bov_position).
  2960. VerbTail(g_object, "liein", bov_position).
  2961. VerbTail(g_object, "lieon", bov_position).
  2962. VerbTail(g_object, "standin", bov_position).
  2963. VerbTail(g_object, "standon", bov_position).
  2964.  
  2965. /* This is NOT utility, so that we are SysAdmin and can do the ClearThing. */
  2966. /* It is local in tp_build1 so other wizards cannot find it. */
  2967.  
  2968. define tp_build1 proc localZapObject(thing th)void:
  2969.     ClearThing(th);
  2970. corp;
  2971.  
  2972. define tp_build1 proc utility bov_destroy()bool:
  2973.     string tableName, symbol;
  2974.     table tb;
  2975.     thing me, th;
  2976.  
  2977.     tableName := GetWord();
  2978.     symbol := GetWord();
  2979.     if tableName = "" or symbol = "" or GetWord() ~= "" then
  2980.     Print("Use is: @object destroy <table> <object-symbol>\n");
  2981.     false
  2982.     else
  2983.     tb := findTable(tableName, true);
  2984.     if tb = nil then
  2985.         false
  2986.     else
  2987.         th := objNameCheck(symbol);
  2988.         if th ~= nil then
  2989.         me := Me();
  2990.         if FindElement(me@p_pCarrying, th) < 0 then
  2991.             Print("You are not carrying '" + symbol + "'.\n");
  2992.             false
  2993.         elif th@p_oContents ~= nil and Count(th@p_oContents) ~= 0 then
  2994.             Print("The " + symbol + " is not empty.\n");
  2995.             false
  2996.         else
  2997.             localZapObject(th);
  2998.             if DeleteSymbol(tb, symbol) then
  2999.             DelElement(me@p_pCarrying, th);
  3000.             Print("It should now be gone!\n");
  3001.             changeDone("destroyed something");
  3002.             true
  3003.             else
  3004.             false
  3005.             fi
  3006.         fi
  3007.         else
  3008.         false
  3009.         fi
  3010.     fi
  3011.     fi
  3012. corp;
  3013.  
  3014. VerbTail(g_object, "destroy", bov_destroy).
  3015.  
  3016. define tp_build1 proc utility bov_checker()bool:
  3017.     string tableName, name;
  3018.     table theTable;
  3019.  
  3020.     tableName := GetWord();
  3021.     name := GetWord();
  3022.     if tableName = "" or name = "" or GetWord() ~= "" then
  3023.     Print("Use is: @object checker <table> <action-symbol>\n");
  3024.     false
  3025.     else
  3026.     theTable := findTable(tableName, false);
  3027.     if theTable = nil then
  3028.         false
  3029.     elif IsDefined(theTable, name) then
  3030.         Print("'" + name + "' is already defined.\n");
  3031.         false
  3032.     else
  3033.         getAction(theTable, name, ck_objectChecker)
  3034.     fi
  3035.     fi
  3036. corp;
  3037.  
  3038. VerbTail(g_object, "checker", bov_checker).
  3039.  
  3040. define tp_build1 proc utility bov_descaction()bool:
  3041.     string tableName, name;
  3042.     table theTable;
  3043.  
  3044.     tableName := GetWord();
  3045.     name := GetWord();
  3046.     if tableName = "" or name = "" or GetWord() ~= "" then
  3047.     Print("Use is: @object descaction <table> <action-symbol>\n");
  3048.     false
  3049.     else
  3050.     theTable := findTable(tableName, false);
  3051.     if theTable = nil then
  3052.         false
  3053.     elif IsDefined(theTable, name) then
  3054.         Print("'" + name + "' is already defined.\n");
  3055.         false
  3056.     else
  3057.         getAction(theTable, name, ck_objectDesc)
  3058.     fi
  3059.     fi
  3060. corp;
  3061.  
  3062. VerbTail(g_object, "descaction", bov_descaction).
  3063. Synonym(g_object, "descaction", "readaction").
  3064.  
  3065. define tp_build1 proc utility bov_actaction()bool:
  3066.     string tableName, name;
  3067.     table theTable;
  3068.  
  3069.     tableName := GetWord();
  3070.     name := GetWord();
  3071.     if tableName = "" or name = "" or GetWord() ~= "" then
  3072.     Print("Use is: @object actaction <table> <action-symbol>\n");
  3073.     false
  3074.     else
  3075.     theTable := findTable(tableName, false);
  3076.     if theTable = nil then
  3077.         false
  3078.     elif IsDefined(theTable, name) then
  3079.         Print("'" + name + "' is already defined.\n");
  3080.         false
  3081.     else
  3082.         getAction(theTable, name, ck_objectVoid)
  3083.     fi
  3084.     fi
  3085. corp;
  3086.  
  3087. VerbTail(g_object, "actaction", bov_actaction).
  3088.  
  3089. define tp_build1 proc utility bov_endVerbString(string s)void:
  3090.     thing me;
  3091.     string verb;
  3092.     property string theProp;
  3093.  
  3094.     me := Me();
  3095.     verb := me@p_pActiveVerb;
  3096.     theProp := GetVerbStringProp(verb);
  3097.     if theProp = nil then
  3098.     Print("Oh-oh! bov_endVerbString can't find prop!\n");
  3099.     else
  3100.     s := Trim(s);
  3101.     if s = "" then
  3102.         me@p_pActiveThing -- GetVerbStringProp(verb);
  3103.         Print("Object " + verb + " string deleted.\n");
  3104.     else
  3105.         me@p_pActiveThing@(GetVerbStringProp(verb)) := s;
  3106.         Print("Object " + verb + " string entered.\n");
  3107.     fi;
  3108.     fi;
  3109.     me -- p_pActiveThing;
  3110.     me -- p_pActiveVerb;
  3111. corp;
  3112.  
  3113. define tp_build proc utility doSetVerbString(string verb; thing th)bool:
  3114.  
  3115.     Me()@p_pActiveVerb := verb;
  3116.     Me()@p_pActiveThing := th;
  3117.     GetDocument(verb + " string> ", "Enter " + verb + " string",
  3118.     th@(GetVerbStringProp(verb)), bov_endVerbString, false)
  3119. corp;
  3120.  
  3121. define tp_build1 proc utility bov_verbstring(string symbol)bool:
  3122.     string verb;
  3123.     thing th;
  3124.  
  3125.     verb := Verb();
  3126.     if symbol = "" then
  3127.     Print("Use is: @object " + verb + " <object-symbol>\n");
  3128.     false
  3129.     else
  3130.     th := objNameCheck(symbol);
  3131.     if th ~= nil then
  3132.         verb := SubString(verb, 0, Length(verb) - 6);
  3133.         doSetVerbString(verb, th)
  3134.     else
  3135.         false
  3136.     fi
  3137.     fi
  3138. corp;
  3139.  
  3140. Verb1(g_object, "playstring", 0, bov_verbstring).
  3141. Verb1(g_object, "erasestring", 0, bov_verbstring).
  3142. Verb1(g_object, "eatstring", 0, bov_verbstring).
  3143. Verb1(g_object, "usestring", 0, bov_verbstring).
  3144. Verb1(g_object, "activatestring", 0, bov_verbstring).
  3145. Verb1(g_object, "deactivatestring", 0, bov_verbstring).
  3146. Synonym(g_object, "deactivatestring", "inactivatestring").
  3147. Verb1(g_object, "lightstring", 0, bov_verbstring).
  3148. Verb1(g_object, "extinguishstring", 0, bov_verbstring).
  3149. Verb1(g_object, "wearstring", 0, bov_verbstring).
  3150. Verb1(g_object, "touchstring", 0, bov_verbstring).
  3151. Verb1(g_object, "smellstring", 0, bov_verbstring).
  3152. Verb1(g_object, "listenstring", 0, bov_verbstring).
  3153. Verb1(g_object, "openstring", 0, bov_verbstring).
  3154. Verb1(g_object, "closestring", 0, bov_verbstring).
  3155. Verb1(g_object, "pushstring", 0, bov_verbstring).
  3156. Verb1(g_object, "pullstring", 0, bov_verbstring).
  3157. Verb1(g_object, "turnstring", 0, bov_verbstring).
  3158. Verb1(g_object, "liftstring", 0, bov_verbstring).
  3159. Verb1(g_object, "lowerstring", 0, bov_verbstring).
  3160. Verb1(g_object, "getstring", 0, bov_verbstring).
  3161. Verb1(g_object, "unlockstring", 0, bov_verbstring).
  3162.  
  3163. define tp_build1 proc utility bov_verbchecker()bool:
  3164.     string verb, objectName, actionName;
  3165.     property action theProp;
  3166.     action a;
  3167.     thing th;
  3168.  
  3169.     verb := Verb();
  3170.     objectName := GetWord();
  3171.     actionName := GetWord();
  3172.     if objectName = "" or actionName = "" or GetWord() ~= "" then
  3173.     Print(
  3174.         "Use is: @object " + verb + " <object-symbol> <action-symbol>\n");
  3175.     false
  3176.     else
  3177.     th := objNameCheck(objectName);
  3178.     if th ~= nil then
  3179.         verb := SubString(verb, 0, Length(verb) - 7);
  3180.         theProp := GetVerbCheckerProp(verb);
  3181.         if theProp = nil then
  3182.         Print("Oh-oh! bov_verbchecker can't find prop!\n");
  3183.         false
  3184.         else
  3185.         if actionName == "nil" then
  3186.             th -- theProp;
  3187.             Print(Capitalize(verb) + "action removed.\n");
  3188.             true
  3189.         else
  3190.             a := actionNameCheck(actionName);
  3191.             if a = nil then
  3192.             false
  3193.             else
  3194.             th@theProp := a;
  3195.             Print(Capitalize(verb) + "action set.\n");
  3196.             true
  3197.             fi
  3198.         fi
  3199.         fi
  3200.     else
  3201.         false
  3202.     fi
  3203.     fi
  3204. corp;
  3205.  
  3206. VerbTail(g_object, "playchecker", bov_verbchecker).
  3207. VerbTail(g_object, "erasechecker", bov_verbchecker).
  3208. VerbTail(g_object, "eatchecker", bov_verbchecker).
  3209. VerbTail(g_object, "usechecker", bov_verbchecker).
  3210. VerbTail(g_object, "activatechecker", bov_verbchecker).
  3211. VerbTail(g_object, "inactivatechecker", bov_verbchecker).
  3212. Synonym(g_object, "inactivatechecker", "deactivatechecker").
  3213. VerbTail(g_object, "lightchecker", bov_verbchecker).
  3214. VerbTail(g_object, "extinguishchecker", bov_verbchecker).
  3215. VerbTail(g_object, "wearchecker", bov_verbchecker).
  3216. VerbTail(g_object, "touchchecker", bov_verbchecker).
  3217. VerbTail(g_object, "smellchecker", bov_verbchecker).
  3218. VerbTail(g_object, "listenchecker", bov_verbchecker).
  3219. VerbTail(g_object, "openchecker", bov_verbchecker).
  3220. VerbTail(g_object, "closechecker", bov_verbchecker).
  3221. VerbTail(g_object, "pushchecker", bov_verbchecker).
  3222. VerbTail(g_object, "pullchecker", bov_verbchecker).
  3223. VerbTail(g_object, "turnchecker", bov_verbchecker).
  3224. VerbTail(g_object, "liftchecker", bov_verbchecker).
  3225. VerbTail(g_object, "lowerchecker", bov_verbchecker).
  3226.  
  3227. unuse tp_build1
  3228.