home *** CD-ROM | disk | FTP | other *** search
/ Amiga Games Extra 1996 May / Amiga_Games_Extra_CD_5-96.bin / spiele / publicdomain / amsrc / building / build2.m < prev   
Text File  |  1996-02-19  |  58KB  |  2,176 lines

  1. /*
  2.  * Amiga MUD
  3.  *
  4.  * Copyright (c) 1996 by Chris Gray
  5.  */
  6.  
  7. /*
  8.  * build2.m - the mouse/graphics builder interface.
  9.  */
  10.  
  11. private tp_build2 CreateTable().
  12. use tp_build2
  13.  
  14. define tp_build2 p_pCurrentTable CreateTableProp().
  15. define tp_build2 p_pButtonEraser CreateActionProp().
  16. define tp_build2 p_pHandlerSave1 CreateActionProp().
  17. define tp_build2 p_pHandlerSave2 CreateActionProp().
  18. define tp_build2 p_pHandlerSave3 CreateActionProp().
  19. define tp_build2 p_pHandlerSave4 CreateActionProp().
  20. define tp_build2 p_pHandlerSave5 CreateActionProp().
  21. define tp_build2 p_pHandlerSave6 CreateActionProp().
  22. define tp_build2 p_pDirectionNext CreateActionProp().
  23. define tp_build2 p_pDirectionWhat CreateStringProp().
  24. define tp_build2 p_pDirectionRoom1 CreateBoolProp().
  25. define tp_build2 p_pSelectedDir CreateIntProp().
  26. define tp_build2 p_pFirstDir CreateIntProp().
  27. define tp_build2 p_pRoomKind CreateIntProp().
  28. define tp_build2 p_pDescKind CreateIntProp().
  29.     define tp_build2 DESC_DIRDESC     0.
  30.     define tp_build2 DESC_DIRMESSAGE  1.
  31.     define tp_build2 DESC_DIROMESSAGE 2.
  32.     define tp_build2 DESC_DIREMESSAGE 3.
  33. define tp_build2 p_pSelectedPen CreateIntProp().
  34. define tp_build2 DummyGrammar CreateGrammar().
  35. define tp_build2 p_pSelectedObject CreateThingProp().
  36.  
  37. define tp_build2 p_pCurrentObject CreateThingProp().
  38. define tp_build2 p_pSelectedSymbol CreateStringProp().
  39.  
  40. define tp_build2 BUILD_BUTTON    17.
  41.  
  42. define tp_build2 EXIT_BUTTON    17.    /* used several places */
  43. define tp_build2 MORE_BUTTON    18.    /* used several places */
  44.  
  45. define tp_build2 ROOM_BUTTON    19.
  46. define tp_build2 OBJECT_BUTTON    20.
  47. define tp_build2 POOF_BUTTON    21.
  48. define tp_build2 SYMBOLHERE_BUTTON 22.
  49. define tp_build2 TABLES_BUTTON    23.
  50.  
  51. /* EXIT_BUTTON = 17 */
  52. define tp_build2 NEW_BUTTON    19.    /* used elsewhere also */
  53. define tp_build2 SELECT_BUTTON    20.    /* used elsewhere also */
  54. define tp_build2 USE_BUTTON    21.    /* used elsewhere also */
  55. define tp_build2 UNUSE_BUTTON    22.
  56. define tp_build2 SYMBOLS_BUTTON 23.
  57. define tp_build2 DESCRIBE_BUTTON 24.
  58.  
  59. /* EXIT_BUTTON = 17 */
  60. /* MORE_BUTTON = 18 */
  61. /* NEW_BUTTON = 19 */
  62. define tp_build2 NAME_BUTTON    21.    /* used elsewhere also */
  63. define tp_build2 DESC_BUTTON    22.    /* used elsewhere also */
  64. define tp_build2 AUTO_BUTTON    23.
  65. define tp_build2 LINK_BUTTON    24.
  66. define tp_build2 UNLINK_BUTTON    25.
  67. define tp_build2 SAME_BUTTON    26.
  68. define tp_build2 HIDE_BUTTON    27.
  69. define tp_build2 SHOP_BUTTON    28.
  70. define tp_build2 SELL_BUTTON    29.
  71. define tp_build2 BANK_BUTTON    30.
  72.  
  73. /* EXIT_BUTTON = 17 */
  74. /* MORE_BUTTON = 18 */
  75. define tp_build2 DARK_BUTTON    19.
  76. define tp_build2 LOCK_BUTTON    20.
  77. define tp_build2 READONLY_BUTTON 21.
  78. define tp_build2 WIZARD_BUTTON    22.
  79. define tp_build2 PUBLIC_BUTTON    23.
  80. define tp_build2 DD_BUTTON    24.
  81. define tp_build2 DM_BUTTON    25.
  82. define tp_build2 OM_BUTTON    26.
  83. define tp_build2 EM_BUTTON    27.
  84.  
  85. /* EXIT_BUTTON = 17 */
  86. define tp_build2 HELP_BUTTON    18.
  87.  
  88. define tp_build2 INDOORS_BUTTON 17.
  89. define tp_build2 OUTDOORS_BUTTON 18.
  90. define tp_build2 FOREST_BUTTON    19.
  91. define tp_build2 FIELD_BUTTON    20.
  92. define tp_build2 PATH_BUTTON    21.
  93. define tp_build2 ROAD_BUTTON    22.
  94. define tp_build2 SIDEWALK_BUTTON 23.
  95. define tp_build2 PARK_BUTTON    24.
  96. define tp_build2 TUNNEL_BUTTON    25.
  97.  
  98. /* EXIT_BUTTON = 17 */
  99. define tp_build2 AUTO_KIND_BUTTON    18.
  100. define tp_build2 AUTO_BGNDPEN_BUTTON    19.
  101. define tp_build2 AUTO_FGNDPEN_BUTTON    20.
  102. define tp_build2 AUTO_EDGEPEN_BUTTON    21.
  103. define tp_build2 AUTO_DOORPEN_BUTTON    22.
  104. define tp_build2 AUTO_NAME1_BUTTON    23.
  105. define tp_build2 AUTO_NAME2_BUTTON    24.
  106.  
  107. /* EXIT_BUTTON = 17 */
  108. define tp_build2 AUTO_ROAD_BUTTON    18.
  109. define tp_build2 AUTO_PATH_BUTTON    19.
  110. define tp_build2 AUTO_HALLROOM_BUTTON    20.
  111. define tp_build2 AUTO_DOORROOM_BUTTON    21.
  112. define tp_build2 AUTO_HALLWAY_BUTTON    22.
  113. define tp_build2 AUTO_OPENAREA_BUTTON    23.
  114. define tp_build2 AUTO_TUNNEL_BUTTON    24.
  115. define tp_build2 AUTO_CHAMBER_BUTTON    25.
  116.  
  117. /* EXIT_BUTTON = 17 */
  118. /* NEW_BUTTON = 19 */
  119. /* SELECT_BUTTON = 20 */
  120. /* DESC_BUTTON = 22 */
  121. /* NAME_BUTTON = 21 */
  122. define tp_build2 GET_BUTTON    23.
  123. define tp_build2 ACT_BUTTON    24.
  124. define tp_build2 CONTAINER_BUTTON 25.
  125. define tp_build2 LIGHT_BUTTON    26.
  126. define tp_build2 INVIS_BUTTON    27.
  127. define tp_build2 POS_BUTTON    28.
  128. define tp_build2 ACTWORD_BUTTON 29.
  129. define tp_build2 IMAGE_BUTTON    30.
  130. define tp_build2 ACTSTRING_BUTTON 31.
  131.  
  132. /* EXIT_BUTTON = 17 */
  133. define tp_build2 SIT_IN_BUTTON    18.
  134. define tp_build2 SIT_ON_BUTTON    19.
  135. define tp_build2 LIE_IN_BUTTON    20.
  136. define tp_build2 LIE_ON_BUTTON    21.
  137. define tp_build2 STAND_IN_BUTTON 22.
  138. define tp_build2 STAND_ON_BUTTON 23.
  139.  
  140. /* EXIT_BUTTON = 17 */
  141. /* MORE_BUTTON = 18 */
  142. define tp_build2 PLAY_BUTTON    19.
  143. define tp_build2 ERASE_BUTTON    20.
  144. define tp_build2 EAT_BUTTON    22.
  145. /* GET_BUTTON = 23 */
  146. define tp_build2 READ_BUTTON    24.
  147. define tp_build2 OPEN_BUTTON    25.
  148. define tp_build2 CLOSE_BUTTON    26.
  149. define tp_build2 TURN_BUTTON    27.
  150. define tp_build2 LIFT_BUTTON    28.
  151. /* USE_BUTTON = 21 */
  152.  
  153. /* EXIT_BUTTON = 17 */
  154. /* MORE_BUTTON = 18 */
  155. define tp_build2 ACTIVATE_BUTTON 19.
  156. define tp_build2 LISTEN_BUTTON    20.
  157. define tp_build2 WEAR_BUTTON    21.
  158. define tp_build2 PUSH_BUTTON    22.
  159. define tp_build2 PULL_BUTTON    23.
  160. define tp_build2 LOWER_BUTTON    24.
  161. define tp_build2 TOUCH_BUTTON    25.
  162. define tp_build2 SMELL_BUTTON    26.
  163. define tp_build2 UNLOCK_BUTTON    27.
  164.  
  165. /*
  166.  * addBuildButton - add the biuld button.
  167.  */
  168.  
  169. define tp_build2 proc utility addBuildButton()void:
  170.  
  171.     AddButton(162, 31, BUILD_BUTTON, "@");
  172. corp;
  173.  
  174. /*
  175.  * eraseBuildButton - erase the build button.
  176.  */
  177.  
  178. define tp_build2 proc utility eraseBuildButton()void:
  179.  
  180.     EraseButton(BUILD_BUTTON);
  181. corp;
  182.  
  183. /*
  184.  * addTopButtons - add the top-level build buttons.
  185.  */
  186.  
  187. define tp_build2 ADD_TOP_BUTTONS_ID NextEffectId().
  188. define tp_build2 proc utility addTopButtons()void:
  189.  
  190.     if not KnowsEffect(nil, ADD_TOP_BUTTONS_ID) then
  191.     DefineEffect(nil, ADD_TOP_BUTTONS_ID);
  192.     AddButton(161, 32, EXIT_BUTTON, "EXIT");
  193.     AddButton(212, 32, ROOM_BUTTON, "Room");
  194.     AddButton(263, 32, OBJECT_BUTTON, "Object");
  195.     AddButton(161, 49, POOF_BUTTON, "Poof");
  196.     AddButton(223, 49, SYMBOLHERE_BUTTON, "Symbol Here");
  197.     AddButton(161, 66, TABLES_BUTTON, "Tables");
  198.     EndEffect();
  199.     fi;
  200.     CallEffect(nil, ADD_TOP_BUTTONS_ID);
  201. corp;
  202.  
  203. /*
  204.  * addTableButtons - add the buttons for table operations.
  205.  */
  206.  
  207. define tp_build2 ADD_TABLE_BUTTONS_ID NextEffectId().
  208. define tp_build2 proc utility addTableButtons()void:
  209.  
  210.     if not KnowsEffect(nil, ADD_TABLE_BUTTONS_ID) then
  211.     DefineEffect(nil, ADD_TABLE_BUTTONS_ID);
  212.     AddButton(161, 32, EXIT_BUTTON, "EXIT");
  213.     AddButton(216, 32, NEW_BUTTON, "New");
  214.     AddButton(263, 32, SELECT_BUTTON, "Select");
  215.     AddButton(161, 49, USE_BUTTON, "Use");
  216.     AddButton(271, 49, UNUSE_BUTTON, "UnUse");
  217.     AddButton(161, 66, SYMBOLS_BUTTON, "Symbols");
  218.     AddButton(247, 66, DESCRIBE_BUTTON, "Describe");
  219.     EndEffect();
  220.     fi;
  221.     CallEffect(nil, ADD_TABLE_BUTTONS_ID);
  222. corp;
  223.  
  224. /*
  225.  * addRoomButtons - add the buttons for room building.
  226.  */
  227.  
  228. define tp_build2 ADD_ROOM_BUTTONS1_ID NextEffectId().
  229. define tp_build2 proc utility addRoomButtons1()void:
  230.  
  231.     if not KnowsEffect(nil, ADD_ROOM_BUTTONS1_ID) then
  232.     DefineEffect(nil, ADD_ROOM_BUTTONS1_ID);
  233.     AddButton(160, 32, EXIT_BUTTON, "EXIT");
  234.     AddButton(280, 32, MORE_BUTTON, "MORE");
  235.     AddButton(160, 49, NEW_BUTTON, "New");
  236.     AddButton(208, 49, LINK_BUTTON, "Link");
  237.     AddButton(264, 49, UNLINK_BUTTON, "Unlink");
  238.     AddButton(160, 66, SAME_BUTTON, "Same");
  239.     AddButton(200, 66, HIDE_BUTTON, "Hide");
  240.     AddButton(240, 66, SHOP_BUTTON, "Shop");
  241.     AddButton(280, 66, SELL_BUTTON, "Sell");
  242.     AddButton(160, 83, BANK_BUTTON, "Bank");
  243.     AddButton(200, 83, NAME_BUTTON, "Name");
  244.     AddButton(240, 83, DESC_BUTTON, "Desc");
  245.     AddButton(280, 83, AUTO_BUTTON, "Auto");
  246.     EndEffect();
  247.     fi;
  248.     CallEffect(nil, ADD_ROOM_BUTTONS1_ID);
  249. corp;
  250.  
  251. define tp_build2 ADD_ROOM_BUTTONS2_ID NextEffectId().
  252. define tp_build2 proc utility addRoomButtons2()void:
  253.  
  254.     if not KnowsEffect(nil, ADD_ROOM_BUTTONS2_ID) then
  255.     DefineEffect(nil, ADD_ROOM_BUTTONS2_ID);
  256.     AddButton(160, 32, EXIT_BUTTON, "EXIT");
  257.     AddButton(280, 32, MORE_BUTTON, "MORE");
  258.     AddButton(160, 49, DARK_BUTTON, "Dark");
  259.     AddButton(204, 49, LOCK_BUTTON, "Lock");
  260.     AddButton(248, 49, READONLY_BUTTON, "Readonly");
  261.     AddButton(160, 66, WIZARD_BUTTON, "Wizard");
  262.     AddButton(264, 66, PUBLIC_BUTTON, "Public");
  263.     AddButton(160, 83, DD_BUTTON, "DD");
  264.     AddButton(205, 83, DM_BUTTON, "DM");
  265.     AddButton(251, 83, OM_BUTTON, "OM");
  266.     AddButton(296, 83, EM_BUTTON, "EM");
  267.     EndEffect();
  268.     fi;
  269.     CallEffect(nil, ADD_ROOM_BUTTONS2_ID);
  270. corp;
  271.  
  272. /*
  273.  * addDirButtons - add the buttons for getting a direction.
  274.  */
  275.  
  276. define tp_build2 proc utility addDirButtons(bool wantHereButton)void:
  277.  
  278.     AddDirectionButtons();
  279.     AddButton(187, 82, EXIT_BUTTON, "EXIT");
  280.     AddButton(253, 82, HELP_BUTTON, "HELP");
  281.     if wantHereButton then
  282.     AddButton(231, 48, L_BUTTON, "H");
  283.     fi;
  284. corp;
  285.  
  286. /*
  287.  * eraseDirButtons - erase the buttons for getting a direction.
  288.  */
  289.  
  290. define tp_build2 proc utility eraseDirButtons()void:
  291.  
  292.     EraseDirectionButtons();
  293.     EraseButton(HELP_BUTTON);
  294.     EraseButton(EXIT_BUTTON);
  295.     EraseButton(L_BUTTON);
  296. corp;
  297.  
  298. /*
  299.  * addRoomKindButtons - add the new room kind buttons.
  300.  */
  301.  
  302. define tp_build2 ADD_ROOM_KIND_BUTTONS_ID NextEffectId().
  303. define tp_build2 proc utility addRoomKindButtons()void:
  304.  
  305.     if not KnowsEffect(nil, ADD_ROOM_KIND_BUTTONS_ID) then
  306.     DefineEffect(nil, ADD_ROOM_KIND_BUTTONS_ID);
  307.     AddButton(161, 32, INDOORS_BUTTON, "Indoors");
  308.     AddButton(247, 32, OUTDOORS_BUTTON, "Outdoors");
  309.     AddButton(161, 49, FOREST_BUTTON, "Forest");
  310.     AddButton(224, 49, FIELD_BUTTON, "Field");
  311.     AddButton(279, 49, PATH_BUTTON, "Path");
  312.     AddButton(161, 66, ROAD_BUTTON, "Road");
  313.     AddButton(204, 66, SIDEWALK_BUTTON, "Sidewalk");
  314.     AddButton(279, 66, PARK_BUTTON, "Park");
  315.     AddButton(161, 83, TUNNEL_BUTTON, "Tunnel");
  316.     EndEffect();
  317.     fi;
  318.     CallEffect(nil, ADD_ROOM_KIND_BUTTONS_ID);
  319. corp;
  320.  
  321. /*
  322.  * addAutoButtons - add the autographics buttons.
  323.  */
  324.  
  325. define tp_build2 ADD_AUTO_BUTTONS NextEffectId().
  326. define tp_build2 proc utility addAutoButtons()void:
  327.  
  328.     if not KnowsEffect(nil, ADD_AUTO_BUTTONS) then
  329.     DefineEffect(nil, ADD_AUTO_BUTTONS);
  330.     AddButton(161, 32, EXIT_BUTTON, "EXIT");
  331.     AddButton(279, 32, AUTO_KIND_BUTTON, "Kind");
  332.     AddButton(161, 49, AUTO_BGNDPEN_BUTTON, "Bgnd Pen");
  333.     AddButton(247, 49, AUTO_FGNDPEN_BUTTON, "Fgnd Pen");
  334.     AddButton(161, 66, AUTO_EDGEPEN_BUTTON, "Edge Pen");
  335.     AddButton(247, 66, AUTO_DOORPEN_BUTTON, "Door Pen");
  336.     AddButton(161, 83, AUTO_NAME1_BUTTON, "Name1");
  337.     AddButton(216, 83, AUTO_NAME2_BUTTON, "Name2");
  338.     AddButton(271, 83, IMAGE_BUTTON, "Image");
  339.     EndEffect();
  340.     fi;
  341.     CallEffect(nil, ADD_AUTO_BUTTONS);
  342. corp;
  343.  
  344. /*
  345.  * addAutoKindButtons - add the autographics kind buttons.
  346.  */
  347.  
  348. define tp_build2 ADD_AUTO_KIND_BUTTONS_ID NextEffectId().
  349. define tp_build2 proc utility addAutoKindButtons()void:
  350.  
  351.     if not KnowsEffect(nil, ADD_AUTO_KIND_BUTTONS_ID) then
  352.     DefineEffect(nil, ADD_AUTO_KIND_BUTTONS_ID);
  353.     AddButton(161, 32, EXIT_BUTTON, "EXIT");
  354.     AddButton(220, 32, AUTO_ROAD_BUTTON, "Road");
  355.     AddButton(279, 32, AUTO_PATH_BUTTON, "Path");
  356.     AddButton(161, 49, AUTO_HALLROOM_BUTTON, "HallRoom");
  357.     AddButton(247, 49, AUTO_DOORROOM_BUTTON, "DoorRoom");
  358.     AddButton(161, 66, AUTO_HALLWAY_BUTTON, "Hallway");
  359.     AddButton(247, 66, AUTO_OPENAREA_BUTTON, "OpenArea");
  360.     AddButton(161, 83, AUTO_TUNNEL_BUTTON, "Tunnel");
  361.     AddButton(255, 83, AUTO_CHAMBER_BUTTON, "Chamber");
  362.     EndEffect();
  363.     fi;
  364.     CallEffect(nil, ADD_AUTO_KIND_BUTTONS_ID);
  365. corp;
  366.  
  367. /*
  368.  * addObjectButtons - add the buttons for making objects.
  369.  */
  370.  
  371. define tp_build2 ADD_OBJECT_BUTTONS_ID NextEffectId().
  372. define tp_build2 proc utility addObjectButtons()void:
  373.  
  374.     if not KnowsEffect(nil, ADD_OBJECT_BUTTONS_ID) then
  375.     DefineEffect(nil, ADD_OBJECT_BUTTONS_ID);
  376.     AddButton(161, 32, EXIT_BUTTON, "EXIT");
  377.     AddButton(216, 32, NEW_BUTTON, "New");
  378.     AddButton(263, 32, SELECT_BUTTON, "Select");
  379.     AddButton(161, 49, DESC_BUTTON, "Desc");
  380.     AddButton(203, 49, NAME_BUTTON, "Name");
  381.     AddButton(245, 49, ACT_BUTTON, "Act");
  382.     AddButton(279, 49, CONTAINER_BUTTON, "Cont");
  383.     AddButton(161, 66, GET_BUTTON, "Get");
  384.     AddButton(195, 66, LIGHT_BUTTON, "Lite");
  385.     AddButton(237, 66, INVIS_BUTTON, "Invis");
  386.     AddButton(287, 66, POS_BUTTON, "Pos");
  387.     AddButton(161, 83, ACTWORD_BUTTON, "ActWrd");
  388.     AddButton(225, 83, IMAGE_BUTTON, "Img");
  389.     AddButton(263, 83, ACTSTRING_BUTTON, "ActStr");
  390.     EndEffect();
  391.     fi;
  392.     CallEffect(nil, ADD_OBJECT_BUTTONS_ID);
  393. corp;
  394.  
  395. /*
  396.  * addPositionButtons - add the buttons for object character positions.
  397.  */
  398.  
  399. define tp_build2 ADD_POSITION_BUTTONS_ID NextEffectId().
  400. define tp_build2 proc utility addPositionButtons()void:
  401.  
  402.     if not KnowsEffect(nil, ADD_POSITION_BUTTONS_ID) then
  403.     DefineEffect(nil, ADD_POSITION_BUTTONS_ID);
  404.     AddButton(161, 32, EXIT_BUTTON, "EXIT");
  405.     AddButton(204, 32, SIT_IN_BUTTON, "Sit In");
  406.     AddButton(263, 32, SIT_ON_BUTTON, "Sit On");
  407.     AddButton(161, 49, LIE_IN_BUTTON, "Lie In");
  408.     AddButton(263, 49, LIE_ON_BUTTON, "Lie On");
  409.     AddButton(161, 66, STAND_IN_BUTTON, "Stand In");
  410.     AddButton(247, 66, STAND_ON_BUTTON, "Stand On");
  411.     EndEffect();
  412.     fi;
  413.     CallEffect(nil, ADD_POSITION_BUTTONS_ID);
  414. corp;
  415.  
  416. /*
  417.  * addObjectActionButtons - add the action word buttons.
  418.  */
  419.  
  420. define tp_build2 ADD_OBJECT_ACTION_BUTTONS1_ID NextEffectId().
  421. define tp_build2 proc utility addObjectActionButtons1()void:
  422.  
  423.     if not KnowsEffect(nil, ADD_OBJECT_ACTION_BUTTONS1_ID) then
  424.     DefineEffect(nil, ADD_OBJECT_ACTION_BUTTONS1_ID);
  425.     AddButton(161, 32, EXIT_BUTTON, "EXIT");
  426.     AddButton(224, 32, GET_BUTTON, "Get");
  427.     AddButton(279, 32, MORE_BUTTON, "MORE");
  428.     AddButton(161, 49, PLAY_BUTTON, "Play");
  429.     AddButton(220, 49, ERASE_BUTTON, "Erase");
  430.     AddButton(287, 49, EAT_BUTTON, "Eat");
  431.     AddButton(161, 66, READ_BUTTON, "Read");
  432.     AddButton(216, 66, OPEN_BUTTON, "Open");
  433.     AddButton(271, 66, CLOSE_BUTTON, "Close");
  434.     AddButton(161, 83, TURN_BUTTON, "Turn");
  435.     AddButton(224, 83, LIFT_BUTTON, "Lift");
  436.     AddButton(287, 83, USE_BUTTON, "Use");
  437.     EndEffect();
  438.     fi;
  439.     CallEffect(nil, ADD_OBJECT_ACTION_BUTTONS1_ID);
  440. corp;
  441.  
  442. define tp_build2 ADD_OBJECT_ACTION_BUTTONS2_ID NextEffectId().
  443. define tp_build2 proc utility addObjectActionButtons2()void:
  444.  
  445.     if not KnowsEffect(nil, ADD_OBJECT_ACTION_BUTTONS2_ID) then
  446.     DefineEffect(nil, ADD_OBJECT_ACTION_BUTTONS2_ID);
  447.     AddButton(161, 32, EXIT_BUTTON, "EXIT");
  448.     AddButton(212, 32, UNLOCK_BUTTON, "Unlock");
  449.     AddButton(279, 32, MORE_BUTTON, "MORE");
  450.     AddButton(161, 49, ACTIVATE_BUTTON, "Activate");
  451.     AddButton(263, 49, LISTEN_BUTTON, "Listen");
  452.     AddButton(161, 66, WEAR_BUTTON, "Wear");
  453.     AddButton(220, 66, PUSH_BUTTON, "Push");
  454.     AddButton(279, 66, PULL_BUTTON, "Pull");
  455.     AddButton(161, 83, LOWER_BUTTON, "Lower");
  456.     AddButton(216, 83, TOUCH_BUTTON, "Touch");
  457.     AddButton(271, 83, SMELL_BUTTON, "Smell");
  458.     EndEffect();
  459.     fi;
  460.     CallEffect(nil, ADD_OBJECT_ACTION_BUTTONS2_ID);
  461. corp;
  462.  
  463. /*
  464.  * roomNameHandler - final step of creating a new room.
  465.  */
  466.  
  467. define tp_build2 proc utility roomNameHandler(string s; bool ok)void:
  468.     thing me;
  469.  
  470.     me := Me();
  471.     if ok and s ~= "" then
  472.     BackupThing@p_FlushNeeded := true;
  473.     doCreateRoom(me@p_pSelectedDir, me@p_pRoomKind, s);
  474.     AutoRedraw();
  475.     else
  476.     Print("Room creation cancelled.\n");
  477.     fi;
  478.     me -- p_pRoomKind;
  479.     me -- p_pSelectedDir;
  480.     addRoomButtons1();
  481.     me@p_pButtonEraser := EraseAllButtons;
  482. corp;
  483.  
  484. /*
  485.  * roomKindHandler - handler for the user selecting a new room kind.
  486.  */
  487.  
  488. define tp_build2 proc utility roomKindHandler(int whichButton)void:
  489.     thing me;
  490.  
  491.     me := Me();
  492.     me@p_pRoomKind := whichButton - INDOORS_BUTTON;
  493.     ClearButtons();
  494.     ignore SetCharacterButtonAction(me@p_pHandlerSave6);
  495.     me -- p_pHandlerSave6;
  496.     me -- p_pDirectionRoom1;
  497.     GetString("", roomNameHandler, "Name of room, e.g. 'in the pawnshop':");
  498. corp;
  499.  
  500. /*
  501.  * newRoom - called when the user selects a direction for a new room.
  502.  */
  503.  
  504. define tp_build2 proc utility newRoom()void:
  505.     thing me;
  506.  
  507.     me := Me();
  508.     if Here()@(DirProp(me@p_pSelectedDir)) ~= nil then
  509.     Print("That direction is already in use.\n");
  510.     me -- p_pSelectedDir;
  511.     addRoomButtons1();
  512.     me@p_pButtonEraser := EraseAllButtons;
  513.     ignore SetCharacterButtonAction(me@p_pHandlerSave6);
  514.     me -- p_pHandlerSave6;
  515.     me -- p_pDirectionRoom1;
  516.     else
  517.     addRoomKindButtons();
  518.     me@p_pButtonEraser := EraseAllButtons;
  519.     ignore SetCharacterButtonAction(roomKindHandler);
  520.     fi;
  521. corp;
  522.  
  523. /*
  524.  * roomImageHandler - called when user has entered an image file name.
  525.  */
  526.  
  527. define tp_build2 proc roomImageHandler(string s; bool ok)void:
  528.     thing me, here;
  529.     int dir;
  530.     property string imageProp;
  531.  
  532.     me := Me();
  533.     here := Here();
  534.     dir := me@p_pSelectedDir;
  535.     if dir = -1 then
  536.     imageProp := p_Image;
  537.     else
  538.     imageProp := DirImage(dir);
  539.     fi;
  540.     if ok then
  541.     if s = "" then
  542.         here -- imageProp;
  543.         Print("Image file name deleted.\n");
  544.     else
  545.         if here@imageProp = "" then
  546.         Print("Image file name added.\n");
  547.         else
  548.         Print("Image file name changed.\n");
  549.         fi;
  550.         here@imageProp := s;
  551.     fi;
  552.     BackupThing@p_FlushNeeded := true;
  553.     else
  554.     if here@imageProp = "" then
  555.         Print("Image file name not added.\n");
  556.     else
  557.         Print("Image file name not changed.\n");
  558.     fi;
  559.     fi;
  560.     me -- p_pSelectedDir;
  561.     me -- p_pDirectionRoom1;
  562.     ignore SetCharacterButtonAction(me@p_pHandlerSave6);
  563.     me -- p_pHandlerSave6;
  564.     addAutoButtons();
  565.     me@p_pButtonEraser := EraseAllButtons;
  566. corp;
  567.  
  568. /*
  569.  * roomImage - called when the user is entering an image for a room/dir.
  570.  */
  571.  
  572. define tp_build2 proc utility roomImage()void:
  573.     int dir;
  574.     string old;
  575.  
  576.     dir := Me()@p_pSelectedDir;
  577.     if dir = -1 then
  578.     old := Here()@p_Image;
  579.     else
  580.     old := Here()@(DirImage(dir));
  581.     fi;
  582.     GetString(old, roomImageHandler, "Image file:");
  583. corp;
  584.  
  585. /*
  586.  * directionHandler - handler for buttons when getting a direction.
  587.  */
  588.  
  589. define tp_build2 proc utility directionHandler(int whichButton)void:
  590.     thing me;
  591.     int dir;
  592.     action a;
  593.  
  594.     me := Me();
  595.     a := me@p_pDirectionNext;
  596.     if whichButton = EXIT_BUTTON then
  597.     eraseDirButtons();
  598.     if a = roomImage then
  599.         addAutoButtons();
  600.     elif me@p_pDirectionRoom1 then
  601.         addRoomButtons1();
  602.     else
  603.         addRoomButtons2();
  604.     fi;
  605.     me@p_pButtonEraser := EraseAllButtons;
  606.     me -- p_pDirectionRoom1;
  607.     ignore SetCharacterButtonAction(me@p_pHandlerSave6);
  608.     me -- p_pHandlerSave6;
  609.     me -- p_pDirectionNext;
  610.     me -- p_pDirectionWhat;
  611.     elif whichButton = HELP_BUTTON then
  612.     Print("Select direction for " + me@p_pDirectionWhat + ".\n");
  613.     else
  614.     case whichButton
  615.     incase NW_BUTTON:
  616.         dir := D_NORTHWEST;
  617.     incase N_BUTTON:
  618.         dir := D_NORTH;
  619.     incase NE_BUTTON:
  620.         dir := D_NORTHEAST;
  621.     incase W_BUTTON:
  622.         dir := D_WEST;
  623.     incase E_BUTTON:
  624.         dir := D_EAST;
  625.     incase SW_BUTTON:
  626.         dir := D_SOUTHWEST;
  627.     incase S_BUTTON:
  628.         dir := D_SOUTH;
  629.     incase SE_BUTTON:
  630.         dir := D_SOUTHEAST;
  631.     incase D_BUTTON:
  632.         dir := D_DOWN;
  633.     incase U_BUTTON:
  634.         dir := D_UP;
  635.     incase I_BUTTON:
  636.         dir := D_ENTER;
  637.     incase O_BUTTON:
  638.         dir := D_EXIT;
  639.     incase L_BUTTON:
  640.         dir := -1;
  641.     esac;
  642.     me@p_pSelectedDir := dir;
  643.     me -- p_pDirectionWhat;
  644.     me -- p_pDirectionNext;
  645.     eraseDirButtons();
  646.     if a ~= newRoom and a ~= roomImage then
  647.         if me@p_pDirectionRoom1 then
  648.         addRoomButtons1();
  649.         else
  650.         addRoomButtons2();
  651.         fi;
  652.         me@p_pButtonEraser := EraseAllButtons;
  653.         me -- p_pDirectionRoom1;
  654.         ignore SetCharacterButtonAction(me@p_pHandlerSave6);
  655.         me -- p_pHandlerSave6;
  656.     fi;
  657.     call(a, void)();
  658.     fi;
  659. corp;
  660.  
  661. /*
  662.  * getDirection - get a direction as part of a room building command.
  663.  */
  664.  
  665. define tp_build2 proc utility getDirection(action nextStep; string what;
  666.     bool room1, wantHereButton)void:
  667.     thing me;
  668.  
  669.     me := Me();
  670.     me@p_pDirectionNext := nextStep;
  671.     me@p_pDirectionWhat := what;
  672.     me@p_pDirectionRoom1 := room1;
  673.     ClearButtons();
  674.     addDirButtons(wantHereButton);
  675.     me@p_pHandlerSave6 := SetCharacterButtonAction(directionHandler);
  676.     me@p_pButtonEraser := eraseDirButtons;
  677. corp;
  678.  
  679. /*
  680.  * renameRoom - handler for supplying a new room name.
  681.  */
  682.  
  683. define tp_build2 proc utility renameRoom(string name; bool ok)void:
  684.  
  685.     if ok and name ~= "" then
  686.     BackupThing@p_FlushNeeded := true;
  687.     Here()@p_rName := name;
  688.     Print("New name entered.\n");
  689.     else
  690.     Print("Name not changed.\n");
  691.     fi;
  692. corp;
  693.  
  694. /*
  695.  * makeLinkHandler - attempt to link to named room.
  696.  */
  697.  
  698. define tp_build2 proc utility makeLinkHandler(string symbol; bool ok)void:
  699.  
  700.     if ok and symbol ~= "" then
  701.     BackupThing@p_FlushNeeded := true;
  702.     ignore doMakeLink(symbol, Me()@p_pSelectedDir);
  703.     AutoRedraw();
  704.     else
  705.     Print("No link made.\n");
  706.     fi;
  707.     Me() -- p_pSelectedDir;
  708. corp;
  709.  
  710. /*
  711.  * makeLink - called when the user selects a direction for a new link.
  712.  */
  713.  
  714. define tp_build2 proc utility makeLink()void:
  715.  
  716.     if Here()@(DirProp(Me()@p_pSelectedDir)) ~= nil then
  717.     Print("That direction is already in use.\n");
  718.     Me() -- p_pSelectedDir;
  719.     else
  720.     GetString("", makeLinkHandler, "Enter symbol of room to link to:");
  721.     fi;
  722. corp;
  723.  
  724. /*
  725.  * deleteLink - called when the user selects a direction to delete a link from.
  726.  */
  727.  
  728. define tp_build2 proc utility deleteLink()void:
  729.  
  730.     ignore brv_unlink(ExitName(Me()@p_pSelectedDir));
  731.     BackupThing@p_FlushNeeded := true;
  732.     Me() -- p_pSelectedDir;
  733.     AutoRedraw();
  734. corp;
  735.  
  736. /*
  737.  * linkSame2 - second part of duplicating a link.
  738.  */
  739.  
  740. define tp_build2 proc utility linkSame2()void:
  741.     thing me, here;
  742.     int newDir;
  743.  
  744.     me := Me();
  745.     here := Here();
  746.     newDir := me@p_pSelectedDir;
  747.     if here@(DirProp(newDir)) ~= nil then
  748.     Print("That new direction is already in use.\n");
  749.     else
  750.     UniConnect(here, here@(DirProp(me@p_pFirstDir)), newDir);
  751.     BackupThing@p_FlushNeeded := true;
  752.     Print("Link made.\n");
  753.     AutoRedraw();
  754.     changeDone("made a new link");
  755.     fi;
  756.     me -- p_pSelectedDir;
  757.     me -- p_pFirstDir;
  758. corp;
  759.  
  760. /*
  761.  * linkSame1 - called when the user selects a direction whose link is to be
  762.  *    copied to another direction.
  763.  */
  764.  
  765. define tp_build2 proc utility linkSame1()void:
  766.     thing me;
  767.  
  768.     me := Me();
  769.     if Here()@(DirProp(me@p_pSelectedDir)) = nil then
  770.     Print("That old direction does not go anywhere.\n");
  771.     me -- p_pSelectedDir;
  772.     else
  773.     me@p_pFirstDir := me@p_pSelectedDir;
  774.     getDirection(linkSame2, "new link", true, false);
  775.     fi;
  776. corp;
  777.  
  778. /*
  779.  * autoKindHandler - handler for picking autographics kind.
  780.  */
  781.  
  782. define tp_build2 proc utility autoKindHandler(int whichButton)void:
  783.     thing here, me;
  784.  
  785.     here := Here();
  786.     me := Me();
  787.     case whichButton
  788.     incase EXIT_BUTTON:
  789.     ClearButtons();
  790.     addAutoButtons();
  791.     ignore SetCharacterButtonAction(me@p_pHandlerSave6);
  792.     me -- p_pHandlerSave6;
  793.     me@p_pButtonEraser := EraseAllButtons;
  794.     incase AUTO_ROAD_BUTTON:
  795.     AutoGraphics(here, AutoRoads);
  796.     incase AUTO_PATH_BUTTON:
  797.     AutoGraphics(here, AutoPaths);
  798.     incase AUTO_HALLROOM_BUTTON:
  799.     AutoGraphics(here, AutoOpenRoom);
  800.     incase AUTO_DOORROOM_BUTTON:
  801.     AutoGraphics(here, AutoClosedRoom);
  802.     incase AUTO_HALLWAY_BUTTON:
  803.     AutoGraphics(here, AutoHalls);
  804.     incase AUTO_OPENAREA_BUTTON:
  805.     AutoGraphics(here, AutoOpenSpace);
  806.     incase AUTO_TUNNEL_BUTTON:
  807.     AutoGraphics(here, AutoTunnels);
  808.     incase AUTO_CHAMBER_BUTTON:
  809.     AutoGraphics(here, AutoTunnelChamber);
  810.     esac;
  811.     if whichButton ~= EXIT_BUTTON then
  812.     Print("Autographics entered.\n");
  813.     BackupThing@p_FlushNeeded := true;
  814.     AutoRedraw();
  815.     fi;
  816. corp;
  817.  
  818. /*
  819.  * colourHandler - handler user choice of a new colour.
  820.  */
  821.  
  822. define tp_build2 proc utility colourHandler(string name; bool ok)void:
  823.     int colour;
  824.  
  825.     if ok and name ~= "" then
  826.     colour := ColourMatch(GetNounPhrase(DummyGrammar, name, 0));
  827.     if colour = -1 then
  828.         Print("Invalid colour name. ");
  829.         ShowKnownColours();
  830.     else
  831.         Here()@(
  832.         case Me()@p_pSelectedPen
  833.         incase AUTO_BGNDPEN_BUTTON:
  834.             p_rBackGroundPen
  835.         incase AUTO_FGNDPEN_BUTTON:
  836.             p_rForeGroundPen
  837.         incase AUTO_EDGEPEN_BUTTON:
  838.             p_rEdgePen
  839.         default:
  840.             p_rDoorPen
  841.         esac) := colour;
  842.         Print("New colour entered.\n");
  843.         BackupThing@p_FlushNeeded := true;
  844.         AutoRedraw();
  845.     fi;
  846.     else
  847.     Print("No colour entered.\n");
  848.     fi;
  849.     Me() -- p_pSelectedPen;
  850. corp;
  851.  
  852. /*
  853.  * getColour - utility to get an autopen colour.
  854.  */
  855.  
  856. define tp_build2 proc utility getColour(int button)void:
  857.     int oldColour;
  858.  
  859.     oldColour := Here()@(
  860.     case button
  861.     incase AUTO_BGNDPEN_BUTTON:
  862.         p_rBackGroundPen
  863.     incase AUTO_FGNDPEN_BUTTON:
  864.         p_rForeGroundPen
  865.     incase AUTO_EDGEPEN_BUTTON:
  866.         p_rEdgePen
  867.     default:
  868.         p_rDoorPen
  869.     esac);
  870.     Me()@p_pSelectedPen := button;
  871.     GetString(ColourName(oldColour), colourHandler,
  872.     "Enter name of new colour:");
  873. corp;
  874.  
  875. /*
  876.  * roomName1Handler - handler for entering first part of name.
  877.  */
  878.  
  879. define tp_build2 proc utility roomName1Handler(string n; bool ok)void:
  880.     thing here;
  881.  
  882.     here := Here();
  883.     n := Trim(n);
  884.     if ok then
  885.     if n ~= "" then
  886.         here@p_rName1 := n;
  887.         Print("Name entered.\n");
  888.     else
  889.         here -- p_rName1;
  890.         Print("Name deleted.\n");
  891.     fi;
  892.     BackupThing@p_FlushNeeded := true;
  893.     DrawRoomName(n, here@p_rName2);
  894.     else
  895.     if here@p_rName1 = "" then
  896.         Print("Name not entered.\n");
  897.     else
  898.         Print("Name not changed.\n");
  899.     fi;
  900.     fi;
  901. corp;
  902.  
  903. /*
  904.  * roomName2Handler - handler for entering second part of name.
  905.  */
  906.  
  907. define tp_build2 proc utility roomName2Handler(string n; bool ok)void:
  908.     thing here;
  909.  
  910.     here := Here();
  911.     n := Trim(n);
  912.     if ok then
  913.     if n ~= "" then
  914.         here@p_rName2 := n;
  915.         Print("Name entered.\n");
  916.     else
  917.         here -- p_rName2;
  918.         Print("Name deleted.\n");
  919.     fi;
  920.     DrawRoomName(here@p_rName1, n);
  921.     BackupThing@p_FlushNeeded := true;
  922.     else
  923.     if here@p_rName2 = "" then
  924.         Print("Name not entered.\n");
  925.     else
  926.         Print("Name not changed.\n");
  927.     fi;
  928.     fi;
  929. corp;
  930.  
  931. /*
  932.  * autoHandler - handle an autographics button hit.
  933.  */
  934.  
  935. define tp_build2 proc utility autoHandler(int whichButton)void:
  936.     thing me, here;
  937.  
  938.     me := Me();
  939.     here := Here();
  940.     case whichButton
  941.     incase EXIT_BUTTON:
  942.     ClearButtons();
  943.     addRoomButtons1();
  944.     ignore SetCharacterButtonAction(me@p_pHandlerSave5);
  945.     me -- p_pHandlerSave5;
  946.     me@p_pButtonEraser := EraseAllButtons;
  947.     incase AUTO_KIND_BUTTON:
  948.     ClearButtons();
  949.     addAutoKindButtons();
  950.     me@p_pHandlerSave6 := SetCharacterButtonAction(autoKindHandler);
  951.     me@p_pButtonEraser := EraseAllButtons;
  952.     incase AUTO_BGNDPEN_BUTTON:
  953.     incase AUTO_FGNDPEN_BUTTON:
  954.     incase AUTO_EDGEPEN_BUTTON:
  955.     incase AUTO_DOORPEN_BUTTON:
  956.     getColour(whichButton);
  957.     incase AUTO_NAME1_BUTTON:
  958.     GetString(here@p_rName1, roomName1Handler,
  959.         "Enter first or only part of graphics room name:");
  960.     incase AUTO_NAME2_BUTTON:
  961.     GetString(here@p_rName2, roomName2Handler,
  962.         "Enter second part of graphics room name:");
  963.     incase IMAGE_BUTTON:
  964.     getDirection(roomImage, "image file name", true, true);
  965.     esac;
  966. corp;
  967.  
  968. /*
  969.  * endSetDirDesc - handler after edit of direction description.
  970.  */
  971.  
  972. define tp_build2 proc utility endSetDirDesc(string s)void:
  973.     thing me, here;
  974.     int dir;
  975.  
  976.     me := Me();
  977.     here := Here();
  978.     dir := me@p_pSelectedDir;
  979.     s := Trim(s);
  980.     if s = "" then
  981.     case me@p_pDescKind
  982.     incase DESC_DIRDESC:
  983.         here -- DirDesc(dir);
  984.         Print("Direction description deleted.\n");
  985.     incase DESC_DIRMESSAGE:
  986.         here -- DirMessage(dir);
  987.         Print("Direction message deleted.\n");
  988.     incase DESC_DIROMESSAGE:
  989.         here -- DirOMessage(dir);
  990.         Print("Direction message deleted.\n");
  991.     incase DESC_DIREMESSAGE:
  992.         here -- DirEMessage(dir);
  993.         Print("Direction message deleted.\n");
  994.     esac;
  995.     else
  996.     case me@p_pDescKind
  997.     incase DESC_DIRDESC:
  998.         here@(DirDesc(dir)) := s;
  999.         Print("Direction decorated.\n");
  1000.     incase DESC_DIRMESSAGE:
  1001.         here@(DirMessage(dir)) := s;
  1002.         Print("Direction message entered.\n");
  1003.     incase DESC_DIROMESSAGE:
  1004.         here@(DirOMessage(dir)) := s;
  1005.         Print("Direction message entered.\n");
  1006.     incase DESC_DIREMESSAGE:
  1007.         here@(DirEMessage(dir)) := s;
  1008.         Print("Direction message entered.\n");
  1009.     esac;
  1010.     fi;
  1011.     me -- p_pSelectedDir;
  1012.     me -- p_pDescKind;
  1013.     BackupThing@p_FlushNeeded := true;
  1014.     changeDone("done some detailing");
  1015. corp;
  1016.  
  1017. /*
  1018.  * setDirDesc - set one of the direction descriptions in the room.
  1019.  */
  1020.  
  1021. define tp_build2 proc utility setDirDesc()void:
  1022.     int dir;
  1023.     thing here;
  1024.  
  1025.     dir := Me()@p_pSelectedDir;
  1026.     here := Here();
  1027.     case Me()@p_pDescKind
  1028.     incase DESC_DIRDESC:
  1029.     ignore GetDocument("room dirdesc> ", "Enter direction description",
  1030.         here@(DirDesc(dir)), endSetDirDesc, false);
  1031.     incase DESC_DIRMESSAGE:
  1032.     ignore GetDocument("room dirmessage> ", "Enter direction message",
  1033.         here@(DirMessage(dir)), endSetDirDesc, false);
  1034.     incase DESC_DIROMESSAGE:
  1035.     ignore GetDocument("room diromessage> ",
  1036.         "Enter entering direction message",
  1037.         here@(DirOMessage(dir)), endSetDirDesc, false);
  1038.     incase DESC_DIREMESSAGE:
  1039.     ignore GetDocument("room diremessage> ",
  1040.         "Enter exiting direction message",
  1041.         here@(DirEMessage(dir)), endSetDirDesc, false);
  1042.     esac;
  1043. corp;
  1044.  
  1045. /*
  1046.  * sellHandler2 - second step in making something for sale here.
  1047.  */
  1048.  
  1049. define tp_build2 proc utility sellHandler2(string s; bool ok)void:
  1050.     thing th;
  1051.     int price;
  1052.  
  1053.     if ok and s ~= "" then
  1054.     price := StringToPosInt(s);
  1055.     if price <= 0 then
  1056.         Print("Invalid price.\n");
  1057.     else
  1058.         th := Me()@p_pSelectedObject;
  1059.         AddObjectForSale(Here(), th, price, nil);
  1060.         BackupThing@p_FlushNeeded := true;
  1061.         Print(FormatName(th@p_oName) + " is now for sale here.\n");
  1062.     fi;
  1063.     else
  1064.     Print("Nothing added for sale.\n");
  1065.     fi;
  1066.     Me() -- p_pSelectedObject;
  1067. corp;
  1068.  
  1069. /*
  1070.  * sellHandler1 - first step in making something for sale here.
  1071.  */
  1072.  
  1073. define tp_build2 proc utility sellHandler1(string symbol; bool ok)void:
  1074.     thing th;
  1075.  
  1076.     if ok and symbol ~= "" then
  1077.     th := objNameCheck(symbol);
  1078.     if th ~= nil then
  1079.         Me()@p_pSelectedObject := th;
  1080.         GetString("0", sellHandler2, "Enter price in blutos:");
  1081.     fi;
  1082.     else
  1083.     Print("Nothing added for sale.\n");
  1084.     fi;
  1085. corp;
  1086.  
  1087. /*
  1088.  * hideLink - called when the user selects a direction to make hidden.
  1089.  */
  1090.  
  1091. define tp_build2 proc utility hideLink()void:
  1092.     list int exits;
  1093.     int dir;
  1094.  
  1095.     exits := Here()@p_rExits;
  1096.     dir := Me()@p_pSelectedDir;
  1097.     Me() -- p_pSelectedDir;
  1098.     if Here()@(DirProp(dir)) = nil then
  1099.     Print("There is no link in that direction.\n");
  1100.     elif FindElement(exits, dir) = -1 then
  1101.     AddTail(exits, dir);
  1102.     Print("Link unhidden.\n");
  1103.     BackupThing@p_FlushNeeded := true;
  1104.     AutoRedraw();
  1105.     else
  1106.     DelElement(exits, dir);
  1107.     Print("Link hidden.\n");
  1108.     BackupThing@p_FlushNeeded := true;
  1109.     AutoRedraw();
  1110.     fi;
  1111. corp;
  1112.  
  1113. /*
  1114.  * roomHandler - handler for room building button hits.
  1115.  */
  1116.  
  1117. define tp_build2 proc utility roomHandler2(int whichButton)void:
  1118.     thing me, here;
  1119.     string s;
  1120.  
  1121.     me := Me();
  1122.     here := Here();
  1123.     if whichButton ~= EXIT_BUTTON and whichButton ~= MORE_BUTTON and
  1124.     not Mine(here) and MeCharacter() ~= SysAdmin and
  1125.     (GetThingStatus(here) = ts_readonly or
  1126.      GetThingStatus(here) = ts_wizard and not IsWizard())
  1127.     then
  1128.     Print("The owner of this room has not permitted it.\n");
  1129.     else
  1130.     case whichButton
  1131.     incase EXIT_BUTTON:
  1132.         ClearButtons();
  1133.         addTopButtons();
  1134.         ignore SetCharacterButtonAction(me@p_pHandlerSave3);
  1135.         me -- p_pHandlerSave3;
  1136.         me -- p_pHandlerSave4;
  1137.         me@p_pButtonEraser := EraseAllButtons;
  1138.     incase MORE_BUTTON:
  1139.         ClearButtons();
  1140.         addRoomButtons1();
  1141.         ignore SetCharacterButtonAction(me@p_pHandlerSave4);
  1142.         me -- p_pHandlerSave4;
  1143.         me@p_pButtonEraser := EraseAllButtons;
  1144.     incase DARK_BUTTON:
  1145.         if here@p_rDark then
  1146.         ignore brv_dark("no");
  1147.         else
  1148.         ignore brv_dark("yes");
  1149.         fi;
  1150.         BackupThing@p_FlushNeeded := true;
  1151.     incase LOCK_BUTTON:
  1152.         if here@p_rLocked then
  1153.         ignore brv_lock("no");
  1154.         else
  1155.         ignore brv_lock("yes");
  1156.         fi;
  1157.         BackupThing@p_FlushNeeded := true;
  1158.     incase READONLY_BUTTON:
  1159.         if GetThingStatus(here) = ts_readonly then
  1160.         Print("This room is already read-only.\n");
  1161.         else
  1162.         SetThingStatus(here, ts_readonly);
  1163.         BackupThing@p_FlushNeeded := true;
  1164.         Print("This room is now changeable by its owner only.\n");
  1165.         fi;
  1166.     incase WIZARD_BUTTON:
  1167.         if GetThingStatus(here) = ts_wizard then
  1168.         Print("This room is already wizard-only.\n");
  1169.         else
  1170.         SetThingStatus(here, ts_wizard);
  1171.         BackupThing@p_FlushNeeded := true;
  1172.         Print("This room is now changeable by wizards only.\n");
  1173.         fi;
  1174.     incase PUBLIC_BUTTON:
  1175.         if GetThingStatus(here) = ts_public then
  1176.         Print("This room is already public.\n");
  1177.         else
  1178.         SetThingStatus(here, ts_public);
  1179.         BackupThing@p_FlushNeeded := true;
  1180.         Print(
  1181.     "This room is now changeable by wizards, apprentices and builders.\n");
  1182.         fi;
  1183.     incase DD_BUTTON:
  1184.         me@p_pDescKind := DESC_DIRDESC;
  1185.         getDirection(setDirDesc, "specific description", false, false);
  1186.     incase DM_BUTTON:
  1187.         me@p_pDescKind := DESC_DIRMESSAGE;
  1188.         getDirection(setDirDesc, "character message", false, false);
  1189.     incase OM_BUTTON:
  1190.         me@p_pDescKind := DESC_DIROMESSAGE;
  1191.         getDirection(setDirDesc, "bystander exit message", false, false);
  1192.     incase EM_BUTTON:
  1193.         me@p_pDescKind := DESC_DIREMESSAGE;
  1194.         getDirection(setDirDesc, "bystander enter message", false, false);
  1195.     esac;
  1196.     fi;
  1197. corp;
  1198.  
  1199. define tp_build2 proc utility roomHandler1(int whichButton)void:
  1200.     thing me, here;
  1201.     string s;
  1202.  
  1203.     me := Me();
  1204.     here := Here();
  1205.     if whichButton ~= EXIT_BUTTON and whichButton ~= MORE_BUTTON and
  1206.     not Mine(here) and MeCharacter() ~= SysAdmin and
  1207.     (GetThingStatus(here) = ts_readonly or
  1208.      GetThingStatus(here) = ts_wizard and not IsWizard())
  1209.     then
  1210.     Print("The owner of this room has not permitted it.\n");
  1211.     else
  1212.     case whichButton
  1213.     incase EXIT_BUTTON:
  1214.         ClearButtons();
  1215.         addTopButtons();
  1216.         ignore SetCharacterButtonAction(me@p_pHandlerSave3);
  1217.         me -- p_pHandlerSave3;
  1218.         me@p_pButtonEraser := EraseAllButtons;
  1219.     incase MORE_BUTTON:
  1220.         ClearButtons();
  1221.         addRoomButtons2();
  1222.         me@p_pHandlerSave4 := SetCharacterButtonAction(roomHandler2);
  1223.         me@p_pButtonEraser := EraseAllButtons;
  1224.     incase NEW_BUTTON:
  1225.         getDirection(newRoom, "new room", true, false);
  1226.     incase LINK_BUTTON:
  1227.         getDirection(makeLink, "new link", true, false);
  1228.     incase UNLINK_BUTTON:
  1229.         getDirection(deleteLink, "link to delete", true, false);
  1230.     incase SAME_BUTTON:
  1231.         getDirection(linkSame1, "old link", true, false);
  1232.     incase HIDE_BUTTON:
  1233.         getDirection(hideLink, "link to hide", true, false);
  1234.     incase SHOP_BUTTON:
  1235.         ignore brv_makestore();
  1236.         BackupThing@p_FlushNeeded := true;
  1237.     incase SELL_BUTTON:
  1238.         if not Mine(here) then
  1239.         Print("Can only modify your own stores.\n");
  1240.         elif here@p_rBuyAction ~= StoreBuy then
  1241.         Print("This room is not a store.\n");
  1242.         else
  1243.         /* default to the 'current' object */
  1244.         s := "";
  1245.         if me@p_pCurrentObject ~= nil then
  1246.             s := FindThingSymbol(PrivateTable(), me@p_pCurrentObject);
  1247.         fi;
  1248.         GetString(s, sellHandler1, "Symbol for object to sell here?");
  1249.         fi;
  1250.     incase BANK_BUTTON:
  1251.         ignore brv_makebank();
  1252.         BackupThing@p_FlushNeeded := true;
  1253.     incase DESC_BUTTON:
  1254.         ignore brv_newdesc();
  1255.         BackupThing@p_FlushNeeded := true;
  1256.     incase AUTO_BUTTON:
  1257.         ClearButtons();
  1258.         addAutoButtons();
  1259.         me@p_pHandlerSave5 := SetCharacterButtonAction(autoHandler);
  1260.         me@p_pButtonEraser := EraseAllButtons;
  1261.     incase NAME_BUTTON:
  1262.         GetString(here@p_rName, renameRoom,
  1263.         "Name of room, e.g. 'in the pawnshop':");
  1264.  
  1265.     esac;
  1266.     fi;
  1267. corp;
  1268.  
  1269. /*
  1270.  * newObjectHandler2 - second step in creating a new object.
  1271.  */
  1272.  
  1273. define tp_build2 proc utility newObjectHandler2(string name; bool ok)void:
  1274.     thing me;
  1275.  
  1276.     me := Me();
  1277.     if ok and name ~= "" then
  1278.     Me()@p_pCurrentObject :=
  1279.         createNewObject(name, me@p_pCurrentTable, me@p_pSelectedSymbol);
  1280.     BackupThing@p_FlushNeeded := true;
  1281.     else
  1282.     Print("No object created.\n");
  1283.     fi;
  1284.     me -- p_pSelectedSymbol;
  1285. corp;
  1286.  
  1287. /*
  1288.  * newObjectHandler1 - first step in creating a new object.
  1289.  */
  1290.  
  1291. define tp_build2 proc utility newObjectHandler1(string symbol; bool ok)void:
  1292.  
  1293.     if ok and symbol ~= "" then
  1294.     if IsDefined(Me()@p_pCurrentTable, symbol) then
  1295.         Print("Symbol \"" + symbol + "\" is already defined.\n");
  1296.     else
  1297.         Me()@p_pSelectedSymbol := symbol;
  1298.         GetString("", newObjectHandler2,
  1299.         "Object name, eg. 'vase;blue,glass'?");
  1300.     fi;
  1301.     else
  1302.     Print("No object created.\n");
  1303.     fi;
  1304. corp;
  1305.  
  1306. /*
  1307.  * selectObjectHandler - select a new current object.
  1308.  */
  1309.  
  1310. define tp_build2 proc utility selectObjectHandler(string symbol; bool ok)void:
  1311.     thing th;
  1312.  
  1313.     if ok and symbol ~= "" then
  1314.     th := objNameCheck(symbol);
  1315.     if th ~= nil then
  1316.         Me()@p_pCurrentObject := th;
  1317.         Print("'" + symbol + "' is now the current object.\n");
  1318.     fi;
  1319.     else
  1320.     Print("Current object not changed.\n");
  1321.     fi;
  1322. corp;
  1323.  
  1324. /*
  1325.  * nameObjectHandler - give a new name to the object.
  1326.  */
  1327.  
  1328. define tp_build2 proc utility nameObjectHandler(string name; bool ok)void:
  1329.  
  1330.     if ok and name ~= "" then
  1331.     Me()@p_pCurrentObject@p_oName := name;
  1332.     BackupThing@p_FlushNeeded := true;
  1333.     Print("Object renamed.\n");
  1334.     else
  1335.     Print("Object not renamed.\n");
  1336.     fi;
  1337. corp;
  1338.  
  1339. /*
  1340.  * actionsHandler - handler for button picks on special actions.
  1341.  */
  1342.  
  1343. define tp_build2 proc utility actions2Handler(int whichButton)void:
  1344.     thing me;
  1345.  
  1346.     me := Me();
  1347.     if whichButton = EXIT_BUTTON then
  1348.     ClearButtons();
  1349.     addObjectButtons();
  1350.     ignore SetCharacterButtonAction(me@p_pHandlerSave4);
  1351.     me -- p_pHandlerSave4;
  1352.     me -- p_pHandlerSave5;
  1353.     me@p_pButtonEraser := EraseAllButtons;
  1354.     elif whichButton = MORE_BUTTON then
  1355.     ClearButtons();
  1356.     addObjectActionButtons1();
  1357.     ignore SetCharacterButtonAction(me@p_pHandlerSave5);
  1358.     me -- p_pHandlerSave5;
  1359.     me@p_pButtonEraser := EraseAllButtons;
  1360.     else
  1361.     ignore doSetVerbString(
  1362.         case whichButton
  1363.         incase UNLOCK_BUTTON:
  1364.         "unlock"
  1365.         incase ACTIVATE_BUTTON:
  1366.         "activate"
  1367.         incase LISTEN_BUTTON:
  1368.         "listen"
  1369.         incase WEAR_BUTTON:
  1370.         "wear"
  1371.         incase PUSH_BUTTON:
  1372.         "push"
  1373.         incase PULL_BUTTON:
  1374.         "pull"
  1375.         incase LOWER_BUTTON:
  1376.         "lower"
  1377.         incase TOUCH_BUTTON:
  1378.         "touch"
  1379.         incase SMELL_BUTTON:
  1380.         "smell"
  1381.         default:
  1382.         "???"
  1383.         esac, me@p_pCurrentObject);
  1384.     BackupThing@p_FlushNeeded := true;
  1385.     fi;
  1386. corp;
  1387.  
  1388. define tp_build2 proc utility actions1Handler(int whichButton)void:
  1389.     thing me;
  1390.  
  1391.     me := Me();
  1392.     if whichButton = EXIT_BUTTON then
  1393.     ClearButtons();
  1394.     addObjectButtons();
  1395.     ignore SetCharacterButtonAction(me@p_pHandlerSave4);
  1396.     me -- p_pHandlerSave4;
  1397.     me@p_pButtonEraser := EraseAllButtons;
  1398.     elif whichButton = MORE_BUTTON then
  1399.     ClearButtons();
  1400.     addObjectActionButtons2();
  1401.     me@p_pHandlerSave5 := SetCharacterButtonAction(actions2Handler);
  1402.     me@p_pButtonEraser := EraseAllButtons;
  1403.     elif whichButton = READ_BUTTON then
  1404.     ignore doObjectRead(me@p_pCurrentObject);
  1405.     else
  1406.     ignore doSetVerbString(
  1407.         case whichButton
  1408.         incase GET_BUTTON:
  1409.         "get"
  1410.         incase PLAY_BUTTON:
  1411.         "play"
  1412.         incase ERASE_BUTTON:
  1413.         "erase"
  1414.         incase EAT_BUTTON:
  1415.         "eat"
  1416.         incase OPEN_BUTTON:
  1417.         "open"
  1418.         incase CLOSE_BUTTON:
  1419.         "close"
  1420.         incase TURN_BUTTON:
  1421.         "turn"
  1422.         incase LIFT_BUTTON:
  1423.         "lift"
  1424.         incase USE_BUTTON:
  1425.         "use"
  1426.         default:
  1427.         "???"
  1428.         esac, me@p_pCurrentObject);
  1429.     BackupThing@p_FlushNeeded := true;
  1430.     fi;
  1431. corp;
  1432.  
  1433. /*
  1434.  * capacityHandler - set a new capacity on a container.
  1435.  */
  1436.  
  1437. define tp_build2 proc utility capacityHandler(string s; bool ok)void:
  1438.     thing object;
  1439.     int n;
  1440.  
  1441.     object := Me()@p_pCurrentObject;
  1442.     if ok and s ~= "" then
  1443.     n := StringToPosInt(s);
  1444.     if n < 0 then
  1445.         Print("Invalid capacity.\n");
  1446.     elif n = 0 then
  1447.         if object@p_oContents ~= nil then
  1448.         object -- p_oContents;
  1449.         object -- p_oCapacity;
  1450.         Print("Current object marked as not being a container.\n");
  1451.         else
  1452.         Print("Current object not marked as being a container.\n");
  1453.         fi;
  1454.     else
  1455.         if object@p_oContents ~= nil then
  1456.         Print("Capacity set.\n");
  1457.         else
  1458.         object@p_oContents := CreateThingList();
  1459.         Print("Current object marked as being a container.\n");
  1460.         fi;
  1461.         object@p_oCapacity := n;
  1462.     fi;
  1463.     BackupThing@p_FlushNeeded := true;
  1464.     else
  1465.     if object@p_oContents ~= nil then
  1466.         Print("Capacity not changed.\n");
  1467.     else
  1468.         Print("Current object not marked as being a container.\n");
  1469.     fi;
  1470.     fi;
  1471. corp;
  1472.  
  1473. /*
  1474.  * routines for dealing with positions characters can occupy WRT objects.
  1475.  */
  1476.  
  1477. define tp_build2 proc utility positionCountHandler(string s; bool ok)void:
  1478.     thing me, object;
  1479.     int n;
  1480.     property int prop;
  1481.  
  1482.     me := Me();
  1483.     if ok and s ~= "" then
  1484.     object := me@p_pCurrentObject;
  1485.     prop := PositionProp(me@p_pSelectedDir);
  1486.     n := StringToPosInt(s);
  1487.     if n < 0 then
  1488.         Print("Invalid occupant maximum.\n");
  1489.     elif n = 0 then
  1490.         object -- prop;
  1491.         Print("Occupation capacity removed.\n");
  1492.     else
  1493.         object@(prop) := n + 1;
  1494.         Print("Occupation capacity entered.\n");
  1495.     fi;
  1496.     BackupThing@p_FlushNeeded := true;
  1497.     else
  1498.     Print("Occupation capacity not changed.\n");
  1499.     fi;
  1500.     me -- p_pSelectedDir;
  1501. corp;
  1502.  
  1503. define tp_build2 proc utility objectPositionHandler(int whichButton)void:
  1504.     thing me;
  1505.     int valueNow;
  1506.  
  1507.     me := Me();
  1508.     if whichButton = EXIT_BUTTON then
  1509.     ClearButtons();
  1510.     addObjectButtons();
  1511.     ignore SetCharacterButtonAction(me@p_pHandlerSave4);
  1512.     me -- p_pHandlerSave4;
  1513.     me@p_pButtonEraser := EraseAllButtons;
  1514.     else
  1515.     whichButton := whichButton - SIT_IN_BUTTON + POS_SIT_IN;
  1516.     valueNow := me@p_pCurrentObject@(PositionProp(whichButton));
  1517.     if valueNow = 0 then
  1518.         valueNow := 2;
  1519.     fi;
  1520.     me@p_pSelectedDir := whichButton;
  1521.     GetString(IntToString(valueNow - 1), positionCountHandler,
  1522.         "Maximum number of occupants:");
  1523.     fi;
  1524. corp;
  1525.  
  1526. /*
  1527.  * actwordObjectHandler - supply action words for this object.
  1528.  */
  1529.  
  1530. define tp_build2 proc utility actwordObjectHandler(string s; bool ok)void:
  1531.  
  1532.     if ok then
  1533.     if s = "" then
  1534.         Me()@p_pCurrentObject -- p_oActWord;
  1535.         Print("Special action words deleted.\n");
  1536.     else
  1537.         Me()@p_pCurrentObject@p_oActWord := s;
  1538.         Print("Special action words entered.\n");
  1539.     fi;
  1540.     BackupThing@p_FlushNeeded := true;
  1541.     else
  1542.     if Me()@p_pCurrentObject@p_oActWord = "" then
  1543.         Print("No special actions words entered.\n");
  1544.     else
  1545.         Print("Special actions words not changed.\n");
  1546.     fi;
  1547.     fi;
  1548. corp;
  1549.  
  1550. /*
  1551.  * objectImageHandler - supply image file name for object.
  1552.  */
  1553.  
  1554. define tp_build2 proc utility objectImageHandler(string s; bool ok)void:
  1555.     thing object;
  1556.  
  1557.     object := Me()@p_pCurrentObject;
  1558.     if ok then
  1559.     if s = "" then
  1560.         object -- p_Image;
  1561.         Print("Object now has no image file.\n");
  1562.     else
  1563.         object@p_Image := s;
  1564.         Print("Object image file name entered.\n");
  1565.     fi;
  1566.     BackupThing@p_FlushNeeded := true;
  1567.     else
  1568.     if object@p_Image = "" then
  1569.         Print("No image file added to object.\n");
  1570.     else
  1571.         Print("Object image file not changed.\n");
  1572.     fi;
  1573.     fi;
  1574. corp;
  1575.  
  1576. /*
  1577.  * objectHandler - handler for top level object building commands.
  1578.  */
  1579.  
  1580. define tp_build2 proc utility objectHandler(int whichButton)void:
  1581.     thing me, currentObject;
  1582.  
  1583.     me := Me();
  1584.     currentObject := me@p_pCurrentObject;
  1585.     if currentObject = nil and
  1586.     whichButton ~= EXIT_BUTTON and whichButton ~= NEW_BUTTON and
  1587.     whichButton ~= SELECT_BUTTON
  1588.     then
  1589.     Print("You must select an object first.\n");
  1590.     else
  1591.     case whichButton
  1592.     incase EXIT_BUTTON:
  1593.         ClearButtons();
  1594.         addTopButtons();
  1595.         ignore SetCharacterButtonAction(me@p_pHandlerSave3);
  1596.         me -- p_pHandlerSave3;
  1597.         me@p_pButtonEraser := EraseAllButtons;
  1598.     incase NEW_BUTTON:
  1599.         GetString("", newObjectHandler1, "Symbol for new object?");
  1600.     incase SELECT_BUTTON:
  1601.         GetString("", selectObjectHandler, "Object to select?");
  1602.     incase DESC_BUTTON:
  1603.         ignore doObjectDesc(currentObject);
  1604.         BackupThing@p_FlushNeeded := true;
  1605.     incase NAME_BUTTON:
  1606.         GetString(currentObject@p_oName, nameObjectHandler,
  1607.         "New name, eg. 'vase;blue,glass'?");
  1608.     incase ACT_BUTTON:
  1609.         ClearButtons();
  1610.         addObjectActionButtons1();
  1611.         me@p_pHandlerSave4 := SetCharacterButtonAction(actions1Handler);
  1612.         me@p_pButtonEraser := EraseAllButtons;
  1613.     incase CONTAINER_BUTTON:
  1614.         GetString(IntToString(currentObject@p_oCapacity), capacityHandler,
  1615.         "Capacity of object?");
  1616.     incase GET_BUTTON:
  1617.         if currentObject@p_oNotGettable then
  1618.         currentObject -- p_oNotGettable;
  1619.         Print("Current object is now gettable.\n");
  1620.         else
  1621.         currentObject@p_oNotGettable := true;
  1622.         Print("Current object is now not gettable.\n");
  1623.         fi;
  1624.         BackupThing@p_FlushNeeded := true;
  1625.     incase LIGHT_BUTTON:
  1626.         if currentObject@p_oLight then
  1627.         currentObject -- p_oLight;
  1628.         Print("Current object marked as not emitting light.\n");
  1629.         else
  1630.         currentObject@p_oLight := true;
  1631.         Print("Current object marked as emitting light.\n");
  1632.         fi;
  1633.         BackupThing@p_FlushNeeded := true;
  1634.     incase INVIS_BUTTON:
  1635.         if currentObject@p_oInvisible then
  1636.         currentObject -- p_oInvisible;
  1637.         Print("Current object marked as not invisible.\n");
  1638.         else
  1639.         currentObject@p_oInvisible := true;
  1640.         Print("Current object marked as invisible.\n");
  1641.         fi;
  1642.         BackupThing@p_FlushNeeded := true;
  1643.     incase POS_BUTTON:
  1644.         ClearButtons();
  1645.         addPositionButtons();
  1646.         me@p_pHandlerSave4 :=
  1647.         SetCharacterButtonAction(objectPositionHandler);
  1648.         me@p_pButtonEraser := EraseAllButtons;
  1649.     incase ACTWORD_BUTTON:
  1650.         GetString(currentObject@p_oActWord, actwordObjectHandler,
  1651.         "Special act word, eg. 'dust,clean,sweep'?");
  1652.     incase IMAGE_BUTTON:
  1653.         GetString(currentObject@p_Image, objectImageHandler,
  1654.         "Image file name?");
  1655.     incase ACTSTRING_BUTTON:
  1656.         ignore enterActString(currentObject);
  1657.     esac;
  1658.     fi;
  1659. corp;
  1660.  
  1661. /*
  1662.  * poofHandler - the poof button
  1663.  */
  1664.  
  1665. define tp_build2 proc utility poofHandler(string symbol; bool ok)void:
  1666.  
  1667.     if ok and symbol ~= "" then
  1668.     ignore bv_poof(symbol);
  1669.     BackupThing@p_FlushNeeded := true;
  1670.     else
  1671.     Print("*Poof* cancelled.\n");
  1672.     fi;
  1673. corp;
  1674.  
  1675. /*
  1676.  * namehereHandler - the name here button
  1677.  */
  1678.  
  1679. define tp_build2 proc utility namehereHandler(string symbol; bool ok)void:
  1680.  
  1681.     if ok and symbol ~= "" then
  1682.     if DefineThing(Me()@p_pCurrentTable, symbol, Here()) then
  1683.         BackupThing@p_FlushNeeded := true;
  1684.         Print("New symbol defined.\n");
  1685.     fi;
  1686.     else
  1687.     Print("No new symbol defined.\n");
  1688.     fi;
  1689. corp;
  1690.  
  1691. /*
  1692.  * newTableHandler - define a new table.
  1693.  */
  1694.  
  1695. define tp_build2 proc utility newTableHandler(string symbol; bool ok)void:
  1696.     thing me;
  1697.     table tb;
  1698.  
  1699.     if ok and symbol ~= "" then
  1700.     me := Me();
  1701.     if IsDefined(me@p_pCurrentTable, symbol) then
  1702.         Print("Symbol already defined.\n");
  1703.     else
  1704.         tb := CreateTable();
  1705.         if DefineTable(me@p_pCurrentTable, symbol, tb) then
  1706.         me@p_pCurrentTable := tb;
  1707.         BackupThing@p_FlushNeeded := true;
  1708.         Print("New table defined and made the current table.\n");
  1709.         fi;
  1710.     fi;
  1711.     else
  1712.     Print("No new table defined.\n");
  1713.     fi;
  1714. corp;
  1715.  
  1716. /*
  1717.  * selectTableHandler - select a table as the current table.
  1718.  */
  1719.  
  1720. define tp_build2 proc utility selectTableHandler(string symbol; bool ok)void:
  1721.     table tb;
  1722.  
  1723.     if ok and symbol ~= "" then
  1724.     if symbol == "private" then
  1725.         Me()@p_pCurrentTable := PrivateTable();
  1726.         Print("Your private table is now the current table.\n");
  1727.     elif symbol == "public" then
  1728.         Me()@p_pCurrentTable := PublicTable();
  1729.         Print("The public table is now the current table.\n");
  1730.     else
  1731.         tb := checkTable(symbol);
  1732.         if tb ~= nil then
  1733.         Me()@p_pCurrentTable := tb;
  1734.         Print("Table '" + symbol + "' is now the current table.\n");
  1735.         fi;
  1736.     fi;
  1737.     else
  1738.     Print("No new table selected.\n");
  1739.     fi;
  1740. corp;
  1741.  
  1742. /*
  1743.  * useTableHandler - use the given table.
  1744.  */
  1745.  
  1746. define tp_build2 proc utility useTableHandler(string symbol; bool ok)void:
  1747.     table tb;
  1748.  
  1749.     if ok and symbol ~= "" then
  1750.     tb := checkTable(symbol);
  1751.     if tb ~= nil then
  1752.         if UseTable(tb) then
  1753.         Print("Table added to in-use list.\n");
  1754.         fi;
  1755.     fi;
  1756.     else
  1757.     Print("No table used.\n");
  1758.     fi;
  1759. corp;
  1760.  
  1761. /*
  1762.  * unuseTableHandler - unuse the given table.
  1763.  */
  1764.  
  1765. define tp_build2 proc utility unuseTableHandler(string symbol; bool ok)void:
  1766.     table tb;
  1767.  
  1768.     if ok and symbol ~= "" then
  1769.     tb := checkTable(symbol);
  1770.     if tb ~= nil then
  1771.         if UnUseTable(tb) then
  1772.         Print("Table removed from in-use list.\n");
  1773.         fi;
  1774.     fi;
  1775.     else
  1776.     Print("No table unused.\n");
  1777.     fi;
  1778. corp;
  1779.  
  1780. /*
  1781.  * describeHandler - describe the given symbol.
  1782.  */
  1783.  
  1784. define tp_build2 proc utility describeHandler(string symbol; bool ok)void:
  1785.  
  1786.     if ok and symbol ~= "" then
  1787.     DescribeSymbol(Me()@p_pCurrentTable, symbol);
  1788.     fi;
  1789. corp;
  1790.  
  1791. /*
  1792.  * tablesHandler - handler for the tables buttons.
  1793.  */
  1794.  
  1795. define tp_build2 proc utility tablesHandler(int whichButton)void:
  1796.     thing me;
  1797.  
  1798.     me := Me();
  1799.     case whichButton
  1800.     incase EXIT_BUTTON:
  1801.     ClearButtons();
  1802.     addTopButtons();
  1803.     ignore SetCharacterButtonAction(me@p_pHandlerSave3);
  1804.     me -- p_pHandlerSave3;
  1805.     me@p_pButtonEraser := EraseAllButtons;
  1806.     incase NEW_BUTTON:
  1807.     GetString("", newTableHandler, "Symbol for new table?");
  1808.     incase SELECT_BUTTON:
  1809.     GetString("", selectTableHandler, "Table to select?");
  1810.     incase USE_BUTTON:
  1811.     GetString("", useTableHandler, "Table to use?");
  1812.     incase UNUSE_BUTTON:
  1813.     GetString("", unuseTableHandler, "Table to unuse?");
  1814.     incase SYMBOLS_BUTTON:
  1815.     ShowTable(me@p_pCurrentTable);
  1816.     incase DESCRIBE_BUTTON:
  1817.     GetString("", describeHandler, "Symbol to describe?");
  1818.     esac;
  1819. corp;
  1820.  
  1821. /*
  1822.  * topHandler - handler for the top level build choices.
  1823.  */
  1824.  
  1825. define tp_build2 proc utility topHandler(int whichButton)void:
  1826.     thing me;
  1827.  
  1828.     me := Me();
  1829.     case whichButton
  1830.     incase EXIT_BUTTON:
  1831.     ClearButtons();
  1832.     AddStandardButtons();
  1833.     addBuildButton();
  1834.     ignore SetCharacterButtonAction(me@p_pHandlerSave2);
  1835.     me -- p_pHandlerSave2;
  1836.     me@p_pButtonEraser := eraseBuildButton;
  1837.     incase ROOM_BUTTON:
  1838.     ClearButtons();
  1839.     addRoomButtons1();
  1840.     me@p_pHandlerSave3 := SetCharacterButtonAction(roomHandler1);
  1841.     me@p_pButtonEraser := EraseAllButtons;
  1842.     incase OBJECT_BUTTON:
  1843.     ClearButtons();
  1844.     addObjectButtons();
  1845.     me@p_pHandlerSave3 := SetCharacterButtonAction(objectHandler);
  1846.     me@p_pButtonEraser := EraseAllButtons;
  1847.     incase POOF_BUTTON:
  1848.     GetString("", poofHandler, "Symbol of room to *poof* to?");
  1849.     incase SYMBOLHERE_BUTTON:
  1850.     GetString("", namehereHandler, "Symbol to name this room?");
  1851.     incase TABLES_BUTTON:
  1852.     ClearButtons();
  1853.     addTableButtons();
  1854.     me@p_pHandlerSave3 := SetCharacterButtonAction(tablesHandler);
  1855.     me@p_pButtonEraser := EraseAllButtons;
  1856.     esac;
  1857. corp;
  1858.  
  1859. /*
  1860.  * buildButtonHandler - top level handler for the build button.
  1861.  */
  1862.  
  1863. define tp_build2 proc utility buildButtonHandler(int whichButton)void:
  1864.     thing me;
  1865.  
  1866.     me := Me();
  1867.     if whichButton = BUILD_BUTTON then
  1868.     if me@p_pStandardButtonsNow then
  1869.         EraseStandardButtons();
  1870.         EraseButton(BUILD_BUTTON);
  1871.         addTopButtons();
  1872.         me@p_pButtonEraser := EraseAllButtons;
  1873.         me@p_pHandlerSave2 := SetCharacterButtonAction(topHandler);
  1874.         me@p_pStandardButtonsNow := false;
  1875.     fi;
  1876.     else
  1877.     call(me@p_pHandlerSave1, void)(whichButton);
  1878.     fi;
  1879. corp;
  1880.  
  1881. /*
  1882.  * clearBuildState - remove tempories used during building.
  1883.  */
  1884.  
  1885. define tp_build2 proc clearBuildState()void:
  1886.     thing me;
  1887.  
  1888.     me := Me();
  1889.     me -- p_pHandlerSave6;
  1890.     me -- p_pHandlerSave5;
  1891.     me -- p_pHandlerSave4;
  1892.     me -- p_pHandlerSave3;
  1893.     me -- p_pHandlerSave2;
  1894.     /* Do *not* remove p_pHandlerSave1 - that points to non-build handler */
  1895.     me -- p_pDirectionNext;
  1896.     me -- p_pDirectionWhat;
  1897.     me -- p_pDirectionRoom1;
  1898.     me -- p_pSelectedDir;
  1899.     me -- p_pFirstDir;
  1900.     me -- p_pRoomKind;
  1901.     me -- p_pDescKind;
  1902.     me -- p_pSelectedPen;
  1903.     me -- p_pSelectedObject;
  1904.     me -- p_pSelectedSymbol;
  1905. corp;
  1906.  
  1907. /*
  1908.  * buildIdle - character has build active, then exits game - reset their
  1909.  *    build state.
  1910.  */
  1911.  
  1912. define tp_build2 proc utility buildIdle()void:
  1913.     thing me;
  1914.  
  1915.     me := Me();
  1916.     clearBuildState();
  1917.     /* Do *not* save to p_pHandlerSave1 - current is some build handler */
  1918.     ignore SetCharacterButtonAction(buildButtonHandler);
  1919.     me@p_pButtonEraser := eraseBuildButton;
  1920. corp;
  1921.  
  1922. /*
  1923.  * checkBuildButton - check for adding the build button. Called when the
  1924.  *    character is starting up. This is the build button "active action",
  1925.  *    used for true builders and for those just in the PlayPen.
  1926.  */
  1927.  
  1928. define tp_build2 proc utility checkBuildButton()void:
  1929.  
  1930.     /* If database was backed up while this character was in the middle
  1931.        of doing something with build buttons, the state is munged =>
  1932.        clear it out, exactly as if they had simply exited while in
  1933.        that state. */
  1934.     if Me()@p_pButtonEraser ~= eraseBuildButton then
  1935.     buildIdle();
  1936.     fi;
  1937.     /* everything else should already be setup */
  1938.     addBuildButton();
  1939. corp;
  1940.  
  1941. /*
  1942.  * setupBuild - setup for mouse building. This is used when a character
  1943.  *    is made a true builder or when a non-builder enters the PlayPen.
  1944.  */
  1945.  
  1946. define tp_build proc utility setupBuild()void: corp;
  1947.  
  1948. define tp_build2 proc utility setupBuild1(thing who)void:
  1949.  
  1950.     /* Cannot do things like 'SetCharacterXXX' and 'AddButton' to other
  1951.        characters. */
  1952.     who@p_pButtonEraser := eraseBuildButton;
  1953.     who@p_pCurrentTable := PrivateTable();
  1954.     AddTail(who@p_pEnterActions, checkBuildButton);
  1955.     AddTail(who@p_pExitActions, buildIdle);
  1956. corp;
  1957.  
  1958. replace setupBuild()void:
  1959.  
  1960.     setupBuild1(Me());
  1961.     Me()@p_pHandlerSave1 := SetCharacterButtonAction(buildButtonHandler);
  1962.     addBuildButton();
  1963. corp;
  1964.  
  1965. define tp_build2 p_pBuilderWho CreateThingProp().
  1966.  
  1967. /*
  1968.  * becomeBuilder - added to the enter actions of a character who is not
  1969.  *    currently on-line, but is being made a builder.
  1970.  */
  1971.  
  1972. define tp_build2 proc utility becomeBuilder()void:
  1973.     thing me;
  1974.  
  1975.     me := Me();
  1976.     DelElement(me@p_pEnterActions, becomeBuilder);
  1977.     me@p_pBuilder := true;
  1978.     setupBuild();
  1979.     Print("\nThanks to " + me@p_pBuilderWho@p_pName +
  1980.     ", you are now a builder.\n\n");
  1981.     me -- p_pBuilderWho;
  1982. corp;
  1983.  
  1984. /*
  1985.  * clearBuild - remove the build buttons - used on exit from playpen, but
  1986.  *    not on true builders.
  1987.  */
  1988.  
  1989. define tp_build2 proc utility clearBuild1(thing who)void:
  1990.     thing me;
  1991.  
  1992.     /* Cannot do things like 'SetCharacterXXX' and "RemoveButton' to
  1993.        other characters. */
  1994.     clearBuildState();
  1995.     me := Me();
  1996.     me -- p_pButtonEraser;
  1997.     me -- p_pCurrentTable;
  1998.     me -- p_pCurrentObject;
  1999.     DelElement(me@p_pEnterActions, checkBuildButton);
  2000.     DelElement(me@p_pExitActions, buildIdle);
  2001. corp;
  2002.  
  2003. define tp_build proc utility clearBuild()void:
  2004.     thing me;
  2005.     action a;
  2006.  
  2007.     me := Me();
  2008.     ignore SetCharacterButtonAction(me@p_pHandlerSave1);
  2009.     me -- p_pHandlerSave1;
  2010.     a := me@p_pButtonEraser;
  2011.     call(a, void)();
  2012.     if a ~= eraseBuildButton then
  2013.     AddStandardButtons();
  2014.     fi;
  2015.     clearBuild1(me);
  2016. corp;
  2017.  
  2018. /*
  2019.  * becomeNotBuilder - added to the startup actions of someone who is not
  2020.  *    on-line, but is to be made not a builder.
  2021.  */
  2022.  
  2023. define tp_build2 proc utility becomeNotBuilder()void:
  2024.     thing me;
  2025.  
  2026.     me := Me();
  2027.     DelElement(me@p_pEnterActions, becomeNotBuilder);
  2028.     me@p_pBuilder := false;
  2029.     /* cannot quite use 'clearBuild' here - do not do button stuff */
  2030.     ignore SetCharacterButtonAction(me@p_pHandlerSave1);
  2031.     me -- p_pHandlerSave1;
  2032.     clearBuild1(me);
  2033.     Print("\nThanks to " + me@p_pBuilderWho@p_pName +
  2034.     ", you are no longer a builder.\n\n");
  2035.     me -- p_pBuilderWho;
  2036. corp;
  2037.  
  2038. /* Put it on the tail for SysAdmin, since that will be on his first 'Normal' */
  2039. AddTail(CharacterThing(SysAdmin)@p_pEnterActions, becomeBuilder).
  2040. CharacterThing(SysAdmin)@p_pBuilderWho := CharacterThing(SysAdmin).
  2041.  
  2042. /* Forced action routines needed by makebuilder and unmakebuilder. */
  2043.  
  2044. define tp_build2 proc doMakeBuilder()status:
  2045.  
  2046.     Me()@p_pBuilder := true;
  2047.     setupBuild();
  2048.     continue
  2049. corp;
  2050.  
  2051. define tp_build2 proc doUnmakeBuilder()status:
  2052.  
  2053.     Me()@p_pBuilder := false;
  2054.     clearBuild();
  2055.     continue
  2056. corp;
  2057.  
  2058. /* These is put into SysAdmin's private table so that he can use it as
  2059.    a spell with "cast". On the V0.5 release it was "public", which meant
  2060.    that ANYONE could cast it! */
  2061.  
  2062. /*
  2063.  * makebuilder - a spell to make someone a builder.
  2064.  */
  2065.  
  2066. private proc makebuilder()void:
  2067.     string name;
  2068.     character ch;
  2069.     thing th, loc;
  2070.     list action la;
  2071.  
  2072.     name := GetWord();
  2073.     if name = "" then
  2074.     Print("makebuilder who?\n");
  2075.     else
  2076.     ch := Character(name);
  2077.     if ch = nil then
  2078.         Print("There is no character called '" + name + "'.\n");
  2079.     else
  2080.         th := CharacterThing(ch);
  2081.         if th@p_pBuilder then
  2082.         if FindElement(th@p_pEnterActions, becomeNotBuilder) ~= -1 then
  2083.             DelElement(th@p_pEnterActions, becomeNotBuilder);
  2084.             th -- p_pBuilderWho;
  2085.             Print(name + " will no longer become not a builder.\n");
  2086.         else
  2087.             Print(name + " is already a builder.\n");
  2088.         fi;
  2089.         elif FindElement(th@p_pEnterActions, becomeBuilder) ~= -1 then
  2090.         Print(name + " is already scheduled to become a builder.\n");
  2091.         else
  2092.         loc := CharacterLocation(ch);
  2093.         if loc ~= nil and not loc@p_rPlayPen then
  2094.             if AgentLocation(th) ~= nil then
  2095.             /* character is currently on-line */
  2096.             ignore ForceAction(th, doMakeBuilder);
  2097.             SPrint(th, "\n" + Me()@p_pName +
  2098.                 " has just made you a builder.\n\n");
  2099.             Print(name + " is now a builder.\n");
  2100.             else
  2101.             /* Character not on-line - setup on next startup. */
  2102.             AddHead(th@p_pEnterActions, becomeBuilder);
  2103.             th@p_pBuilderWho := Me();
  2104.             Print(name +
  2105.                 " is now scheduled to become a builder.\n");
  2106.             fi;
  2107.             BackupThing@p_FlushNeeded := true;
  2108.         else
  2109.             Print("Can't do that right now.\n");
  2110.         fi;
  2111.         fi;
  2112.     fi;
  2113.     fi;
  2114. corp;
  2115.  
  2116. /*
  2117.  * unmakebuilder - a spell to make someone not a builder.
  2118.  */
  2119.  
  2120. private proc unmakebuilder()void:
  2121.     string name;
  2122.     character ch;
  2123.     thing th, loc;
  2124.  
  2125.     name := GetWord();
  2126.     if name = "" then
  2127.     Print("unmakebuilder who?\n");
  2128.     else
  2129.     ch := Character(name);
  2130.     if ch = nil then
  2131.         Print("There is no character called '" + name + "'.\n");
  2132.     else
  2133.         th := CharacterThing(ch);
  2134.         if not th@p_pBuilder then
  2135.         if FindElement(th@p_pEnterActions, becomeBuilder) ~= -1 then
  2136.             DelElement(th@p_pEnterActions, becomeBuilder);
  2137.             th -- p_pBuilderWho;
  2138.             Print(name + " will no longer become a builder.\n");
  2139.         else
  2140.             Print(name + " is already not a builder.\n");
  2141.         fi;
  2142.         elif FindElement(th@p_pEnterActions, becomeNotBuilder) ~= -1 then
  2143.         Print(name +
  2144.             " is already scheduled to become not a builder.\n");
  2145.         else
  2146.         loc := CharacterLocation(ch);
  2147.         if loc ~= nil and not loc@p_rPlayPen and
  2148.             th@p_pHandlerSave2 = nil
  2149.         then
  2150.             if AgentLocation(th) ~= nil then
  2151.             /* character is on-line */
  2152.             ignore ForceAction(th, doUnmakeBuilder);
  2153.             SPrint(th, "\n" + Me()@p_pName +
  2154.                 " has just made you not a builder.\n\n");
  2155.             Print(name + " is now not a builder.\n");
  2156.             else
  2157.             /* Character is not on-line - the demotion will
  2158.                happen when they next connect. Note that we use
  2159.                'AddHead' to make sure that 'becomeNotBuilder'
  2160.                happens *before* 'checkBuildButton'! */
  2161.             AddHead(th@p_pEnterActions, becomeNotBuilder);
  2162.             th@p_pBuilderWho := Me();
  2163.             Print(name +
  2164.                 " is now scheduled to become not a builder.\n");
  2165.             fi;
  2166.             BackupThing@p_FlushNeeded := true;
  2167.         else
  2168.             Print("Can't do that right now.\n");
  2169.         fi;
  2170.         fi;
  2171.     fi;
  2172.     fi;
  2173. corp;
  2174.  
  2175. unuse tp_build2
  2176.