home *** CD-ROM | disk | FTP | other *** search
/ Amiga Games Extra 1996 May / Amiga_Games_Extra_CD_5-96.bin / spiele / publicdomain / amsrc / proving / proving5.m < prev    next >
Text File  |  1996-02-19  |  23KB  |  720 lines

  1. /*
  2.  * Amiga MUD
  3.  *
  4.  * Copyright (c) 1996 by Chris Gray
  5.  */
  6.  
  7. /*
  8.  * proving5.m - the doors rooms area.
  9.  */
  10.  
  11. private tp_proving5 CreateTable().
  12. use tp_proving5
  13.  
  14. define tp_proving5 r_tunnelX4 CreateThing(r_provingCave).
  15. SetupRoomDP(r_tunnelX4, "at the south end of a passage",
  16.     "A large wooden door blocks the south end of the passage.").
  17. UniConnect(r_tunnelX4, r_chasm6, D_SOUTH).
  18. r_tunnelX4@p_rNoGenerateMonsters := true.
  19. define tp_proving5 PR_TUNNELX4_ID NextEffectId().
  20. define tp_proving5 proc drawTunnelX4()void:
  21.  
  22.     if not KnowsEffect(nil, PR_TUNNELX4_ID) then
  23.     DefineEffect(nil, PR_TUNNELX4_ID);
  24.     GSetImage(nil, "Proving/tunnelX4");
  25.     IfFound(nil);
  26.         GShowImage(nil, "", 0, 0, 160, 100, 0, 0);
  27.     Else(nil);
  28.         GSetPen(nil, C_DARK_GREY);
  29.         GAMove(nil, 0, 0);
  30.         GRectangle(nil, 159, 99, true);
  31.         GSetPen(nil, C_LIGHT_GREY);
  32.         GAMove(nil, 65, 0);
  33.         GRectangle(nil, 29, 55, true);
  34.         GSetPen(nil, C_BROWN);
  35.         GAMove(nil, 75, 55);
  36.         HorizontalDoor();
  37.     Fi(nil);
  38.     EndEffect();
  39.     fi;
  40.     CallEffect(nil, PR_TUNNELX4_ID);
  41. corp;
  42. AutoGraphics(r_tunnelX4, drawTunnelX4).
  43.  
  44. define tp_proving5 o_door1 CreateThing(nil).
  45. FakeObject(o_door1, r_chasm6, "door;sturdy,wooden",
  46.     "The door is made from massive wooden beams, fastened together with thick "
  47.     "iron straps. There is a small keyhole in the door.").
  48. o_door1@p_oOpenString := "The door is locked.".
  49. o_door1@p_oPushString := "The door is locked.".
  50. o_door1@p_oPullString := "The door is locked.".
  51. o_door1@p_Image := "Proving/doorFromChasm".
  52.  
  53. define tp_proving5 o_keyHole2 CreateThing(nil).
  54. FakeObject(o_keyHole2, r_chasm6, "hole,keyhole;small,key", "").
  55. o_keyHole2@p_oContents := CreateThingList().
  56. o_keyHole2@p_Image := "Proving/keyhole".
  57.  
  58. define tp_proving5 proc putInKeyHole2(thing key, keyhole)status:
  59.     string name;
  60.     bool hidden;
  61.  
  62.     if Parent(key) = o_ironKey then
  63.     name := Me()@p_pName;
  64.     hidden := Me()@p_pHidden;
  65.     Print("The iron key slips into the hole and turns easily. The door "
  66.         "opens and you walk through.\n");
  67.     if hidden then
  68.         OPrint("The door opens, then quickly closes again.\n");
  69.     else
  70.         OPrint(Capitalize(name) +
  71.         " unlocks the door and walks through. The door "
  72.         "then closes again before anyone can follow.\n");
  73.     fi;
  74.     LeaveRoomStuff(r_tunnelX4, D_NORTH, MOVE_SPECIAL);
  75.     EnterRoomStuff(r_tunnelX4, D_SOUTH, MOVE_SPECIAL);
  76.     if hidden then
  77.         OPrint("The door opens, then closes again.\n");
  78.     else
  79.         OPrint("The door opens and " + name + " enters. " +
  80.         "The door quickly closes again.\n");
  81.     fi;
  82.     succeed
  83.     else
  84.     Print("The " + FormatName(key@p_oName) +
  85.         " will not fit into the hole.\n");
  86.     fail
  87.     fi
  88. corp;
  89. o_keyHole2@p_oPutInMeChecker := putInKeyHole2.
  90. define tp_proving5 proc doUnlock2(thing keyhole, key)status:
  91.     putInKeyHole2(key, keyhole)
  92. corp;
  93. o_keyHole2@p_oUnlockMeWithChecker := doUnlock2.
  94. SetThingStatus(o_keyHole2, ts_readonly).
  95. o_door1@p_oUnlockMeWithChecker := doUnlock2.
  96. SetThingStatus(o_door1, ts_readonly).
  97.  
  98. define tp_proving5 proc backThroughDoor()status:
  99.     string name;
  100.     bool hidden;
  101.  
  102.     name := Me()@p_pName;
  103.     hidden := Me()@p_pHidden;
  104.     Print("The door opens easily from this side. You pass back into the "
  105.     "chasm area and the door closes and locks again.\n");
  106.     if hidden then
  107.     OPrint("The door opens, then quickly closes again.\n");
  108.     else
  109.     OPrint(Capitalize(name) +
  110.         " opens the door and passes through. The door quickly "
  111.         "closes again.\n");
  112.     fi;
  113.     LeaveRoomStuff(r_chasm6, D_SOUTH, MOVE_SPECIAL);
  114.     EnterRoomStuff(r_chasm6, D_NORTH, MOVE_SPECIAL);
  115.     if hidden then
  116.     OPrint("The door opens, then quickly closes again.\n");
  117.     else
  118.     OPrint("The door opens and " + name + " emerges. "
  119.         "The door quickly closes again.\n");
  120.     fi;
  121.     succeed
  122. corp;
  123. define tp_proving5 proc doBackThroughDoor()status:
  124.     ignore backThroughDoor();
  125.     fail
  126. corp;
  127. AddSouthChecker(r_tunnelX4, doBackThroughDoor, false).
  128.  
  129. define tp_proving5 o_door2 CreateThing(nil).
  130. FakeObject(o_door2, r_tunnelX4, "door;sturdy,wooden", "").
  131. o_door2@p_oOpenChecker := backThroughDoor.
  132. o_door2@p_oPullChecker := backThroughDoor.
  133. o_door2@p_oPushChecker := backThroughDoor.
  134. o_door2@p_oNotLocked := true.
  135. o_door2@p_Image := "Proving/doorToChasm".
  136.  
  137. /* Here for a while is the area beyond the door in the crack in the chasm.
  138.    This is the doorsroom area with the winch. */
  139.  
  140. define tp_proving5 r_tunnelX CreateThing(r_tunnel).
  141. r_tunnelX@p_rDark := true.
  142. AutoGraphics(r_tunnelX, AutoTunnels).
  143. AutoPens(r_tunnelX, C_DARK_GREY, C_LIGHT_GREY, C_LIGHT_GREY, C_LIGHT_GREY).
  144. SetThingStatus(r_tunnelX, ts_readonly).
  145.  
  146. define tp_proving5 r_tunnelX5 CreateThing(r_tunnelX).
  147. SetupRoomDP(r_tunnelX5, "in a north-south passage",
  148.     "There is a winch arrangement on the wall here.").
  149. Connect(r_tunnelX4, r_tunnelX5, D_NORTH).
  150. Scenery(r_tunnelX5, "hole.rope").
  151. r_tunnelX5@p_rHintString := "Why do they close so suddenly?".
  152.  
  153. define tp_proving5 r_tunnelX6 CreateThing(r_tunnelX).
  154. SetupRoomDP(r_tunnelX6, "in a north-south passage", "").
  155. Connect(r_tunnelX5, r_tunnelX6, D_NORTH).
  156.  
  157. define tp_proving5 r_tunnelX7 CreateThing(r_tunnelX).
  158. SetupRoomDP(r_tunnelX7, "in a north-south passage", "").
  159. Connect(r_tunnelX6, r_tunnelX7, D_NORTH).
  160.  
  161. define tp_proving5 PR_DOORS1_ID NextEffectId().
  162. define tp_proving5 proc drawDoors1()void:
  163.  
  164.     if not KnowsEffect(nil, PR_DOORS1_ID) then
  165.     DefineEffect(nil, PR_DOORS1_ID);
  166.     GSetPen(nil, C_BROWN);
  167.     GAMove(nil, 40, 66);
  168.     VerticalDoor();
  169.     GAMove(nil, 52, 48);
  170.     NorthWestDoor();
  171.     GAMove(nil, 76, 40);
  172.     HorizontalDoor();
  173.     GAMove(nil, 108, 48);
  174.     NorthEastDoor();
  175.     GAMove(nil, 120, 66);
  176.     VerticalDoor();
  177.     EndEffect();
  178.     fi;
  179.     CallEffect(nil, PR_DOORS1_ID);
  180. corp;
  181.  
  182. define tp_proving5 PR_DOORS2_ID NextEffectId().
  183. define tp_proving5 proc drawDoors2()void:
  184.  
  185.     if not KnowsEffect(nil, PR_DOORS2_ID) then
  186.     DefineEffect(nil, PR_DOORS2_ID);
  187.     GSetImage(nil, "Proving/doors2");
  188.     IfFound(nil);
  189.         GShowImage(nil, "", 0, 0, 160, 100, 0, 0);
  190.     Else(nil);
  191.         GSetPen(nil, C_DARK_GREY);
  192.         GAMove(nil, 0, 0);
  193.         GRectangle(nil, 159, 99, true);
  194.  
  195.         GSetPen(nil, C_LIGHT_GREY);
  196.         GPolygonStart(nil);
  197.         GAMove(nil, 70, 99);
  198.         GRDraw(nil, -10, -19);
  199.         GRDraw(nil, -20, 0);
  200.         GRDraw(nil, 0, -20);
  201.         GRDraw(nil, 20, -20);
  202.         GRDraw(nil, 40, 0);
  203.         GRDraw(nil, 20, 20);
  204.         GRDraw(nil, 0, 20);
  205.         GRDraw(nil, -20, 0);
  206.         GRDraw(nil, -10, 19);
  207.         GPolygonEnd(nil);
  208.  
  209.         drawDoors1();
  210.     Fi(nil);
  211.     EndEffect();
  212.     fi;
  213.     CallEffect(nil, PR_DOORS2_ID);
  214. corp;
  215.  
  216. define tp_proving5 PR_DOORS3_ID NextEffectId().
  217. define tp_proving5 proc drawDoors3()void:
  218.  
  219.     if not KnowsEffect(nil, PR_DOORS3_ID) then
  220.     DefineEffect(nil, PR_DOORS3_ID);
  221.     GSetImage(nil, "Proving/doors3");
  222.     IfFound(nil);
  223.         GShowImage(nil, "", 0, 0, 160, 100, 0, 0);
  224.     Else(nil);
  225.         GSetPen(nil, C_DARK_GREY);
  226.         GAMove(nil, 0, 0);
  227.         GRectangle(nil, 159, 99, true);
  228.  
  229.         GSetPen(nil, C_LIGHT_GREY);
  230.         GPolygonStart(nil);
  231.         GAMove(nil, 70, 99);
  232.         GRDraw(nil, -10, -19);
  233.         GRDraw(nil, -40, 0);
  234.         GRDraw(nil, 0, -60);
  235.         GRDraw(nil, 120, 0);
  236.         GRDraw(nil, 0, 60);
  237.         GRDraw(nil, -40, 0);
  238.         GRDraw(nil, -10, 19);
  239.         GPolygonEnd(nil);
  240.         GAMove(nil, 70, 0);
  241.         GRectangle(nil, 20, 20, true);
  242.  
  243.         GSetPen(nil, C_DARK_GREY);
  244.         GAMove(nil, 40, 80);
  245.         GRDraw(nil, 0, -20);
  246.         GRDraw(nil, 20, -20);
  247.         GRDraw(nil, 40, 0);
  248.         GRDraw(nil, 20, 20);
  249.         GRDraw(nil, 0, 20);
  250.  
  251.         drawDoors1();
  252.     Fi(nil);
  253.     EndEffect();
  254.     fi;
  255.     CallEffect(nil, PR_DOORS3_ID);
  256. corp;
  257.  
  258. define tp_proving5 DOORS1_MAP_GROUP NextMapGroup().
  259. define tp_proving5 DOORS2_MAP_GROUP NextMapGroup().
  260.  
  261. define tp_proving5 r_doorsModel1 CreateThing(r_tunnel).
  262. r_doorsModel1@p_rDark := true.
  263. r_doorsModel1@p_MapGroup := DOORS1_MAP_GROUP.
  264. r_doorsModel1@p_rDrawAction := drawDoors2.
  265. r_doorsModel1@p_rEnterRoomDraw := EnterRoomDraw.
  266. r_doorsModel1@p_rLeaveRoomDraw := LeaveRoomDraw.
  267. RoomName(r_doorsModel1, "Doors", "Room").
  268. Scenery(r_doorsModel1, "eye;carved.carving;eye.chamber").
  269. SetThingStatus(r_doorsModel1, ts_readonly).
  270.  
  271. define tp_proving5 proc makeDoors1(int x, y; string name)thing:
  272.     thing doors;
  273.  
  274.     doors := CreateThing(r_doorsModel1);
  275.     doors@p_rName := name;
  276.     doors@p_rContents := CreateThingList();
  277.     doors@p_rExits := CreateIntList();
  278.     doors@p_rCursorX := x;
  279.     doors@p_rCursorY := y;
  280.     SetThingStatus(doors, ts_readonly);
  281.     doors
  282. corp;
  283.  
  284. define tp_proving5 r_doorsModel2 CreateThing(r_tunnel).
  285. r_doorsModel2@p_rDark := true.
  286. r_doorsModel2@p_MapGroup := DOORS2_MAP_GROUP.
  287. r_doorsModel2@p_rDrawAction := drawDoors3.
  288. r_doorsModel2@p_rEnterRoomDraw := EnterRoomDraw.
  289. r_doorsModel2@p_rLeaveRoomDraw := LeaveRoomDraw.
  290. RoomName(r_doorsModel2, "Doors", "Room").
  291. SetThingStatus(r_doorsModel2, ts_readonly).
  292.  
  293. define tp_proving5 proc makeDoors2(int x, y; string name)thing:
  294.     thing doors;
  295.  
  296.     doors := CreateThing(r_doorsModel2);
  297.     doors@p_rName := name;
  298.     doors@p_rContents := CreateThingList();
  299.     doors@p_rExits := CreateIntList();
  300.     doors@p_rCursorX := x;
  301.     doors@p_rCursorY := y;
  302.     SetThingStatus(doors, ts_readonly);
  303.     doors
  304. corp;
  305.  
  306. define tp_proving5 r_doorsEntrance makeDoors1(78, 67,
  307.     "in the room of many doors").
  308. Connect(r_tunnelX7, r_doorsEntrance, D_NORTH).
  309. Scenery(r_doorsEntrance, "door.passage").    /* adds to default */
  310.  
  311. define tp_proving5 r_westDoor makeDoors1(43, 67, "by the west door").
  312. Connect(r_doorsEntrance, r_westDoor, D_WEST).
  313.  
  314. define tp_proving5 r_northwestDoor makeDoors1(52, 51, "by the northwest door").
  315. Connect(r_doorsEntrance, r_northwestDoor, D_NORTHWEST).
  316. Connect(r_westDoor, r_northwestDoor, D_NORTH).
  317.  
  318. define tp_proving5 r_northDoor makeDoors1(78, 42, "by the north door").
  319. Connect(r_doorsEntrance, r_northDoor, D_NORTH).
  320. Connect(r_northwestDoor, r_northDoor, D_EAST).
  321.  
  322. define tp_proving5 r_northeastDoor makeDoors1(102,51, "by the northeast door").
  323. Connect(r_doorsEntrance, r_northeastDoor, D_NORTHEAST).
  324. Connect(r_northDoor, r_northeastDoor, D_EAST).
  325.  
  326. define tp_proving5 r_eastDoor makeDoors1(111, 67, "by the east door").
  327. Connect(r_doorsEntrance, r_eastDoor, D_EAST).
  328. Connect(r_northeastDoor, r_eastDoor, D_SOUTH).
  329.  
  330. define tp_proving5 r_westDoor2 makeDoors2(31, 67, "by the west door").
  331. Connect(r_westDoor, r_westDoor2, D_WEST).
  332.  
  333. define tp_proving5 r_northwestDoor2 makeDoors2(43, 43,"by the northwest door").
  334. Connect(r_northwestDoor, r_northwestDoor2, D_NORTHWEST).
  335. Connect(r_westDoor2, r_northwestDoor2, D_NORTHEAST).
  336. UniConnect(r_westDoor2, r_northwestDoor2, D_NORTH).
  337.  
  338. define tp_proving5 r_northDoor2 makeDoors2(78, 32, "by the north door").
  339. Connect(r_northDoor, r_northDoor2, D_NORTH).
  340. Connect(r_northwestDoor2, r_northDoor2, D_NORTHEAST).
  341. UniConnect(r_northwestDoor2, r_northDoor2, D_NORTH).
  342. UniConnect(r_northDoor2, r_northwestDoor2, D_WEST).
  343.  
  344. define tp_proving5 r_northeastDoor2 makeDoors2(111,43,"by the northeast door").
  345. Connect(r_northeastDoor, r_northeastDoor2, D_NORTHEAST).
  346. Connect(r_northeastDoor2, r_northDoor2, D_NORTHWEST).
  347. UniConnect(r_northeastDoor2, r_northDoor2, D_NORTH).
  348. UniConnect(r_northDoor2, r_northeastDoor2, D_EAST).
  349.  
  350. define tp_proving5 r_eastDoor2 makeDoors2(123, 67, "by the east door").
  351. Connect(r_eastDoor, r_eastDoor2, D_EAST).
  352. Connect(r_eastDoor2, r_northeastDoor2, D_NORTHWEST).
  353. UniConnect(r_eastDoor2, r_northeastDoor2, D_NORTH).
  354.  
  355. define tp_proving r_doorsExit makeDoors2(77, 2,
  356.     "in the room of many doors").
  357. Connect(r_northDoor2, r_doorsExit, D_NORTH).
  358.  
  359. ignore DeleteSymbol(tp_proving5, "makeDoors2").
  360. ignore DeleteSymbol(tp_proving5, "makeDoors1").
  361.  
  362. define tp_proving5 o_doorModel1 CreateThing(nil).
  363. FakeObject(o_doorModel1, nil, "door;sturdy,wooden", "").
  364. define tp_proving5 proc door1Desc()string:
  365.     if It()@p_oState = 0 then
  366.     "The door looks like it opens by sliding upwards, but it is currently "
  367.     "closed and you can see no way to open it, nor any sign of a keyhole "
  368.     "or other mechanism."
  369.     else
  370.     /* this cannot ever happen */
  371.     "The door is currently slid upwards out of the way."
  372.     fi
  373. corp;
  374. o_doorModel1@p_oDescAction := door1Desc.
  375. define tp_proving5 proc door1Unlock(thing door, key)status:
  376.     Print("You can see no lock mechanism on the door.\n");
  377.     succeed
  378. corp;
  379. o_doorModel1@p_oUnlockMeWithChecker := door1Unlock.
  380. o_doorModel1@p_Image := "Proving/doorOutside".
  381. SetThingStatus(o_doorModel1, ts_readonly).
  382.  
  383. define tp_proving5 o_winch CreateThing(nil).
  384. FakeObject(o_winch, r_tunnelX5, "winch.arrangement;winch.crank", "").
  385. o_winch@p_oState := 0.
  386. define tp_proving5 proc winchDesc()string:
  387.     "The winch is a hand turned mechanism used for lifting things. A rope "
  388.     "transmits the force from the winch through a hole in the ceiling. It is "
  389.     "not obvious what purpose the winch serves. " +
  390.     if o_winch@p_oState = 0 then
  391.     "The winch is currently fully unwound."
  392.     elif o_winch@p_oState = 5 then
  393.     "The winch is currently fully wound."
  394.     else
  395.     "The winch is currently partly wound."
  396.     fi
  397. corp;
  398. o_winch@p_oDescAction := winchDesc.
  399. o_winch@p_Image := "Proving/winch".
  400.  
  401. define tp_proving5 p_oOtherDoor CreateThingProp().
  402. define tp_proving5 p_oSound CreateStringProp().
  403. define tp_proving5 p_oDoorName CreateStringProp().
  404. define tp_proving5 p_oSoundList CreateThingListProp().
  405.  
  406. define tp_proving5 o_doorModel2 CreateThing(nil).
  407. FakeObject(o_doorModel2, nil, "door;sturdy,wooden", "").
  408. define tp_proving5 proc door2Desc()string:
  409.     if It()@p_oOtherDoor@p_oState = 0 then
  410.     "The door looks like it opens by sliding upwards. There is a handy "
  411.     "handle on it for lifting with."
  412.     else
  413.     /* Hmm. should never see this! */
  414.     "The door is currently slid upwards out of the way."
  415.     fi
  416. corp;
  417. o_doorModel2@p_oDescAction := door2Desc.
  418. o_doorModel2@p_oNotLocked := true.
  419. o_doorModel2@p_Image := "Proving/doorInside".
  420. SetThingStatus(o_doorModel2, ts_readonly).
  421.  
  422. define tp_proving5 proc door1Checker()status:
  423.  
  424.     if Here()@p_rContents[0]@p_oState = 0 then
  425.     Print("You cannot go that way - the door is closed.\n");
  426.     fail
  427.     else
  428.     continue
  429.     fi
  430. corp;
  431.  
  432. define tp_proving5 proc door2Checker()status:
  433.     thing otherDoor;
  434.  
  435.     otherDoor := Here()@p_rContents[0]@p_oOtherDoor;
  436.     if otherDoor@p_oState = 0 then
  437.     Print("You lift the door by the handle and pass through.\n");
  438.     if CanSee(Here(), Me()) then
  439.         OPrint(Capitalize(Me()@p_pName) +
  440.         " lifts the door and passes through.\n");
  441.     fi;
  442.     SayToList(o_winch@p_oSoundList, otherDoor@p_oSound + "\n");
  443.     /* The enter checker for the other room will shut all the doors if
  444.        the player has a light. */
  445.     fi;
  446.     continue
  447. corp;
  448.  
  449. define tp_proving5 o_door1W CreateThing(o_doorModel1).
  450. o_door1W@p_oState := 0.
  451. o_door1W@p_oSound := "Thump!".
  452. o_door1W@p_oDoorName := "west".
  453. AddTail(r_westDoor@p_rContents, o_door1W).
  454. AddWestChecker(r_westDoor, door1Checker, false).
  455. define tp_proving5 o_door2W CreateThing(o_doorModel2).
  456. o_door2W@p_oOtherDoor := o_door1W.
  457. AddTail(r_westDoor2@p_rContents, o_door2W).
  458. AddEastChecker(r_westDoor2, door2Checker, false).
  459.  
  460. define tp_proving5 o_door1NW CreateThing(o_doorModel1).
  461. o_door1NW@p_oState := 0.
  462. o_door1NW@p_oSound := "Thud!".
  463. o_door1NW@p_oDoorName := "north-west".
  464. AddTail(r_northwestDoor@p_rContents, o_door1NW).
  465. AddNorthWestChecker(r_northwestDoor, door1Checker, false).
  466. define tp_proving5 o_door2NW CreateThing(o_doorModel2).
  467. o_door2NW@p_oOtherDoor := o_door1NW.
  468. AddTail(r_northwestDoor2@p_rContents, o_door2NW).
  469. AddSouthEastChecker(r_northwestDoor2, door2Checker, false).
  470.  
  471. define tp_proving5 o_door1N CreateThing(o_doorModel1).
  472. o_door1N@p_oState := 0.
  473. o_door1N@p_oSound := "Boom!".
  474. o_door1N@p_oDoorName := "north".
  475. AddTail(r_northDoor@p_rContents, o_door1N).
  476. AddNorthChecker(r_northDoor, door1Checker, false).
  477. define tp_proving5 o_door2N CreateThing(o_doorModel2).
  478. o_door2N@p_oOtherDoor := o_door1N.
  479. AddTail(r_northDoor2@p_rContents, o_door2N).
  480. AddSouthChecker(r_northDoor2, door2Checker, false).
  481.  
  482. define tp_proving5 o_door1NE CreateThing(o_doorModel1).
  483. o_door1NE@p_oState := 0.
  484. o_door1NE@p_oSound := "Crash!".
  485. o_door1NE@p_oDoorName := "north-east".
  486. AddTail(r_northeastDoor@p_rContents, o_door1NE).
  487. AddNorthEastChecker(r_northeastDoor, door1Checker, false).
  488. define tp_proving5 o_door2NE CreateThing(o_doorModel2).
  489. o_door2NE@p_oOtherDoor := o_door1NE.
  490. AddTail(r_northeastDoor2@p_rContents, o_door2NE).
  491. AddSouthWestChecker(r_northeastDoor2, door2Checker, false).
  492.  
  493. define tp_proving5 o_door1E CreateThing(o_doorModel1).
  494. o_door1E@p_oState := 0.
  495. o_door1E@p_oSound := "Bang!".
  496. o_door1E@p_oDoorName := "east".
  497. AddTail(r_eastDoor@p_rContents, o_door1E).
  498. AddEastChecker(r_eastDoor, door1Checker, false).
  499. define tp_proving5 o_door2E CreateThing(o_doorModel2).
  500. o_door2E@p_oOtherDoor := o_door1E.
  501. AddTail(r_eastDoor2@p_rContents, o_door2E).
  502. AddWestChecker(r_eastDoor2, door2Checker, false).
  503.  
  504. define tp_proving5 p_oDoors CreateThingListProp().
  505. define tp_proving5 p_oMapping CreateIntListProp().
  506. o_winch@p_oDoors := CreateThingList().
  507. AddTail(o_winch@p_oDoors, o_door1W).
  508. AddTail(o_winch@p_oDoors, o_door1NW).
  509. AddTail(o_winch@p_oDoors, o_door1N).
  510. AddTail(o_winch@p_oDoors, o_door1NE).
  511. AddTail(o_winch@p_oDoors, o_door1E).
  512. o_winch@p_oMapping := CreateIntArray(5).
  513.  
  514. define tp_proving5 proc doorsEntranceDesc()string:
  515.     string str, doorName;
  516.     int openCount, i, openOne;
  517.     list thing doors;
  518.  
  519.     doors := o_winch@p_oDoors;
  520.     openCount := 0;
  521.     for i from 0 upto 4 do
  522.     if doors[i]@p_oState = 1 then
  523.         openOne := i;
  524.         openCount := openCount + 1;
  525.     fi;
  526.     od;
  527.     if openCount = 0 then
  528.     str := "All of the doors are closed."
  529.     elif openCount = 1 then
  530.     str := "The " + doors[openOne]@p_oDoorName + " door is open.";
  531.     elif openCount = 2 then
  532.     str := "";
  533.     for i from 0 upto 4 do
  534.         if doors[i]@p_oState = 1 then
  535.         doorName := doors[i]@p_oDoorName;
  536.         if str = "" then
  537.             str := "The " + doorName + " and ";
  538.         else
  539.             str := str + doorName + " doors are open.";
  540.         fi;
  541.         fi;
  542.     od;
  543.     else
  544.     /* openCount = 3, other values should not be possible */
  545.     for i from 0 upto 4 do
  546.         if doors[i]@p_oState = 1 then
  547.         doorName := doors[i]@p_oDoorName;
  548.         case openCount
  549.         incase 3:
  550.             str := "The " + doorName + ", ";
  551.         incase 2:
  552.             str := str + doorName + " and ";
  553.         incase 1:
  554.             str := str + doorName + " doors are open.";
  555.         esac;
  556.         openCount := openCount - 1;
  557.         fi;
  558.     od;
  559.     fi;
  560.     "This small chamber has 5 doors in it, heading east, northeast, north, "
  561.     "northwest and west. Over each door is a carved eye, and a similar but "
  562.     "larger carving fills much of the floor. " + str + " There is also a "
  563.     "passage leading south, which you are currently in front of."
  564. corp;
  565. r_doorsEntrance@p_rDescAction := doorsEntranceDesc.
  566.  
  567. o_winch@p_oSoundList := CreateThingList().
  568. AddTail(o_winch@p_oSoundList, r_westDoor).
  569. AddTail(o_winch@p_oSoundList, r_northwestDoor).
  570. AddTail(o_winch@p_oSoundList, r_northDoor).
  571. AddTail(o_winch@p_oSoundList, r_northeastDoor).
  572. AddTail(o_winch@p_oSoundList, r_eastDoor).
  573. AddTail(o_winch@p_oSoundList, r_westDoor2).
  574. AddTail(o_winch@p_oSoundList, r_northwestDoor2).
  575. AddTail(o_winch@p_oSoundList, r_northDoor2).
  576. AddTail(o_winch@p_oSoundList, r_northeastDoor2).
  577. AddTail(o_winch@p_oSoundList, r_eastDoor2).
  578. AddTail(o_winch@p_oSoundList, r_doorsExit).
  579.  
  580. define tp_proving5 DOOR_TIME    8.
  581.  
  582. define tp_proving5 proc dropDoor(thing door; bool lightThere)void:
  583.     string sound, sound2;
  584.  
  585.     sound := door@p_oSound;
  586.     sound2 := sound + "\n";
  587.     SayToList(o_winch@p_oSoundList, sound2);
  588.     ABPrint(r_doorsEntrance, nil, nil,
  589.     if lightThere then
  590.         sound + " The " + door@p_oDoorName + " door slams closed!\n"
  591.     else
  592.         sound2
  593.     fi);
  594.     ABPrint(r_tunnelX7, nil, nil, sound2);
  595.     ABPrint(r_tunnelX6, nil, nil, sound2);
  596.     ABPrint(r_tunnelX5, nil, nil, "Rattle-rattle-clang! " + sound +
  597.     if o_winch@p_oState = 0 then
  598.         " The winch releases the rest of the way.\n"
  599.     else
  600.         " The winch releases part way.\n"
  601.     fi);
  602.     door@p_oState := 0;
  603. corp;
  604.  
  605. define tp_proving5 proc doorsDrop(thing winch)void:
  606.     int state;
  607.  
  608.     state := o_winch@p_oState;
  609.     if state ~= 0 then
  610.     state := state - 1;
  611.     o_winch@p_oState := state;
  612.     dropDoor(o_winch@p_oDoors[o_winch@p_oMapping[state]], false);
  613.     if state ~= 0 then
  614.         DoAfter(DOOR_TIME, winch, doorsDrop);
  615.     fi;
  616.     fi;
  617. corp;
  618.  
  619. define tp_proving5 proc clearWinch(bool lightThere)void:
  620.     int state;
  621.     list int li;
  622.     list thing lt;
  623.  
  624.     state := o_winch@p_oState;
  625.     li := o_winch@p_oMapping;
  626.     lt := o_winch@p_oDoors;
  627.     while state ~= 0 do
  628.     state := state - 1;
  629.     o_winch@p_oState := state;
  630.     dropDoor(lt[li[state]], lightThere);
  631.     od;
  632. corp;
  633.  
  634. define tp_proving5 proc doorsEnter()status:
  635.  
  636.     if o_winch@p_oState ~= 0 then
  637.     ignore CancelDoAfter(o_winch, doorsDrop);
  638.     doorsDrop(o_winch);
  639.     fi;
  640.     continue
  641. corp;
  642. AddAnyEnterChecker(r_tunnelX5, doorsEnter, false).
  643. AddAnyEnterChecker(r_tunnelX6, doorsEnter, false).
  644. AddAnyEnterChecker(r_tunnelX7, doorsEnter, false).
  645.  
  646. define tp_proving5 proc doorsLightEnter()status:
  647.  
  648.     if o_winch@p_oState ~= 0 then
  649.     ignore CancelDoAfter(o_winch, doorsDrop);
  650.     if HasLight(Me()) then
  651.         clearWinch(true);
  652.     else
  653.         doorsDrop(o_winch);
  654.     fi;
  655.     fi;
  656.     continue
  657. corp;
  658. AddAnyEnterChecker(r_doorsEntrance, doorsLightEnter, false).
  659. AddAnyEnterChecker(r_westDoor, doorsLightEnter, false).
  660. AddAnyEnterChecker(r_northwestDoor, doorsLightEnter, false).
  661. AddAnyEnterChecker(r_northDoor, doorsLightEnter, false).
  662. AddAnyEnterChecker(r_northeastDoor, doorsLightEnter, false).
  663. AddAnyEnterChecker(r_eastDoor, doorsLightEnter, false).
  664. AddAnyEnterChecker(r_doorsExit, doorsLightEnter, false).
  665. AddAnyEnterChecker(r_westDoor2, doorsLightEnter, false).
  666. AddAnyEnterChecker(r_northwestDoor2, doorsLightEnter, false).
  667. AddAnyEnterChecker(r_northDoor2, doorsLightEnter, false).
  668. AddAnyEnterChecker(r_northeastDoor2, doorsLightEnter, false).
  669. AddAnyEnterChecker(r_eastDoor2, doorsLightEnter, false).
  670.  
  671. define tp_proving5 proc turnWinch()status:
  672.     int i, j, temp;
  673.     list int li;
  674.     list thing lt;
  675.  
  676.     if o_winch@p_oState ~= 0 then
  677.     Print("Before you can crank up the winch, you first release it from "
  678.         "its current position. ");
  679.     ignore CancelDoAfter(o_winch, doorsDrop);
  680.     clearWinch(false);
  681.     fi;
  682.     Print("The winch turns easily and you quickly crank it up all the way.\n");
  683.     if CanSee(r_tunnelX5, Me()) then
  684.     OPrint(Capitalize(Me()@p_pName) + " cranks the winch up.\n");
  685.     else
  686.     OPrint("You hear someone cranking the winch.\n");
  687.     fi;
  688.     li := o_winch@p_oMapping;
  689.     lt := o_winch@p_oDoors;
  690.     for i from 0 upto 4 do
  691.     li[i] := i;
  692.     lt[i]@p_oState := 1;
  693.     od;
  694.     for i from 0 upto 4 do
  695.     j := Random(5 - i);
  696.     temp := li[i + j];
  697.     li[i + j] := li[i];
  698.     li[i] := temp;
  699.     od;
  700.     o_winch@p_oState := 5;
  701.     if LightAt(r_doorsEntrance) or LightAt(r_westDoor) or
  702.     LightAt(r_northwestDoor) or LightAt(r_northDoor) or
  703.     LightAt(r_northeastDoor) or LightAt(r_eastDoor) or
  704.     LightAt(r_doorsExit) or LightAt(r_westDoor2) or
  705.     LightAt(r_northwestDoor2) or LightAt(r_northDoor2) or
  706.     LightAt(r_northeastDoor2) or LightAt(r_eastDoor2)
  707.     then
  708.     SayToList(o_winch@p_oSoundList, "The door smoothly rises up.\n");
  709.     ABPrint(r_doorsEntrance, nil, nil,"The doors all smoothly rise up.\n");
  710.     clearWinch(true);
  711.     else
  712.     SayToList(o_winch@p_oSoundList, "You hear something moving.\n");
  713.     DoAfter(DOOR_TIME, o_winch, doorsDrop);
  714.     fi;
  715.     succeed
  716. corp;
  717. o_winch@p_oTurnChecker := turnWinch.
  718.  
  719. unuse tp_proving5
  720.