home *** CD-ROM | disk | FTP | other *** search
/ Amiga MA Magazine 1998 #7 / amigamamagazinepolishissue1998.iso / rozrywka / rpg / amigamud / src / building / build2.m < prev   
Text File  |  1997-06-16  |  63KB  |  2,238 lines

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