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

  1. /*
  2.  * Amiga MUD
  3.  *
  4.  * Copyright (c) 1996 by Chris Gray
  5.  */
  6.  
  7. /*
  8.  * proving4.m - the chasm rooms area.
  9.  */
  10.  
  11. /* the vertical chimney */
  12.  
  13. private tp_proving4 CreateTable().
  14. use tp_proving4
  15.  
  16. define tp_proving4 r_chimneyTop CreateThing(r_provingCave).
  17. SetupRoomP(r_chimneyTop, "at the top of a circular ramp",
  18.     "The ramp slopes steeply but negotiably around a 20 foot diameter "
  19.     "vertical chimney in the stone. The chimney ends not far overhead, but "
  20.     "extends downward out of sight. A narrow passage heads east.").
  21. Connect(r_sewerCaveA2, r_chimneyTop, D_WEST).
  22. Scenery(r_chimneyTop, "chimney;20,foot,diameter,vertical.ramp.passage").
  23. define tp_proving4 proc chimneyDrop(thing th)status:
  24.     thing me, here;
  25.     string name;
  26.  
  27.     me := Me();
  28.     name := FormatName(th@p_oName);
  29.     if th@p_oCarryer ~= nil and th@p_oCreator = me then
  30.     here := Here();
  31.     ZapObject(th);
  32.     Print("You drop the " + name + " which slides off the ramp and "
  33.         "disappears down the chimney.\n");
  34.     if not me@p_pHidden and CanSee(here, me) then
  35.         OPrint(Capitalize(CharacterNameG(me)) +
  36.         AAn(" drops", name) +
  37.         " which slides off the ramp and disappears down the "
  38.         "chimney.\n");
  39.     fi;
  40.     DelElement(me@p_pCarrying, th);
  41.     succeed
  42.     else
  43.     Print("You'd better not drop the " + name + " here!\n");
  44.     fail
  45.     fi
  46. corp;
  47. AddRoomDropChecker(r_chimneyTop, chimneyDrop, false).
  48.  
  49. define tp_proving4 r_chimneyMiddle CreateThing(r_provingCave).
  50. SetupRoomP(r_chimneyMiddle, "on a ramp in a vertical chimney",
  51.     "The chimney ends just within sight overhead, but extends downward out of "
  52.     "sight. A tunnel heads west.").
  53. Connect(r_chimneyTop, r_chimneyMiddle, D_DOWN).
  54. Scenery(r_chimneyMiddle, "chimney;vertical.ramp.tunnel").
  55. AddRoomDropChecker(r_chimneyMiddle, chimneyDrop, false).
  56.  
  57. define tp_proving4 r_chimneyBottom CreateThing(r_provingCave).
  58. SetupRoomP(r_chimneyBottom, "on a ramp in a vertical chimney",
  59.     "The chimney extends up and down out of sight.").
  60. Scenery(r_chimneyBottom, "chimney;vertical.ramp").
  61. AddRoomDropChecker(r_chimneyBottom, chimneyDrop, false).
  62. Connect(r_chimneyMiddle, r_chimneyBottom, D_DOWN).
  63.  
  64. define tp_proving4 p_pChimneyDepth CreateIntProp().
  65.  
  66. define tp_proving4 r_chimney CreateThing(r_tunnel).
  67. SetupRoomDP(r_chimney, "on a ramp in a vertical chimney",
  68.     "The chimney extends up and down out of sight.").
  69. Scenery(r_chimney, "chimney;vertical.ramp").
  70. AddRoomDropChecker(r_chimney, chimneyDrop, false).
  71. Connect(r_chimneyBottom, r_chimney, D_DOWN).
  72. UniConnect(r_chimney, r_chimney, D_DOWN).
  73. r_chimney@p_rNoMachines := true.
  74.  
  75. define tp_proving4 proc chimneyDown()status:
  76.     thing me;
  77.  
  78.     me := Me();
  79.     me@p_pChimneyDepth := me@p_pChimneyDepth + 1;
  80.     LeaveRoomStuff(r_chimney, D_DOWN, MOVE_SPECIAL);
  81.     EnterRoomStuff(r_chimney, D_UP, MOVE_SPECIAL);
  82.     fail
  83. corp;
  84.  
  85. AddDownChecker(r_chimneyBottom, chimneyDown, false).
  86. AddDownChecker(r_chimney, chimneyDown, false).
  87.  
  88. define tp_proving4 proc chimneyUp()status:
  89.     thing me;
  90.     int depth;
  91.  
  92.     me := Me();
  93.     depth := me@p_pChimneyDepth - 1;
  94.     if depth = 0 then
  95.     me -- p_pChimneyDepth;
  96.     LeaveRoomStuff(r_chimneyBottom, D_UP, MOVE_SPECIAL);
  97.     EnterRoomStuff(r_chimneyBottom, D_DOWN, MOVE_SPECIAL);
  98.     continue
  99.     else
  100.     me@p_pChimneyDepth := depth;
  101.     LeaveRoomStuff(r_chimney, D_UP, MOVE_SPECIAL);
  102.     EnterRoomStuff(r_chimney, D_DOWN, MOVE_SPECIAL);
  103.     fail
  104.     fi
  105. corp;
  106.  
  107. AddUpChecker(r_chimney, chimneyUp, false).
  108.  
  109. define tp_proving4 r_tunnelX1 CreateThing(r_provingCave).
  110. SetupRoomP(r_tunnelX1, "in an east-west tunnel", "").
  111. Connect(r_chimneyMiddle, r_tunnelX1, D_WEST).
  112.  
  113. define tp_proving4 r_tunnelX2 CreateThing(r_provingCave).
  114. SetupRoomP(r_tunnelX2, "in an east-west tunnel",
  115.     "There is a faint greenish light coming from the west.").
  116. Connect(r_tunnelX1, r_tunnelX2, D_WEST).
  117.  
  118. define tp_proving4 r_tunnelX3 CreateThing(r_provingCave).
  119. SetupRoomP(r_tunnelX3, "in an east-west tunnel",
  120.     "There is a steady greenish light coming from the west.").
  121. Connect(r_tunnelX2, r_tunnelX3, D_WEST).
  122.  
  123. /* the chasm area */
  124.  
  125. define tp_proving4 o_chasm CreateThing(nil).
  126. FakeObject(o_chasm, nil, "chasm;deep",
  127.     "The chasm is a deep crack in the earth. It is so deep that you cannot "
  128.     "see the bottom, only blackness. The chasm is far too wide to jump "
  129.     "across.").
  130.  
  131. define tp_proving4 PR_CHASM1_ID NextEffectId().
  132. define tp_proving4 proc drawChasm1()void:
  133.  
  134.     if not KnowsEffect(nil, PR_CHASM1_ID) then
  135.     DefineEffect(nil, PR_CHASM1_ID);
  136.     GSetImage(nil, "Proving/chasm1");
  137.     IfFound(nil);
  138.         GShowImage(nil, "", 0, 0, 160, 100, 0, 0);
  139.     Else(nil);
  140.         GSetPen(nil, C_DARK_GREY);
  141.         GAMove(nil, 0, 0);
  142.         GRectangle(nil, 159, 99, true);
  143.  
  144.         GSetPen(nil, C_LIGHT_GREY);
  145.         GPolygonStart(nil);
  146.         GAMove(nil, 159, 65);
  147.         GRDraw(nil, -79, 0);
  148.         GRDraw(nil, -80, 10);
  149.         GRDraw(nil, 0, -30);
  150.         GRDraw(nil, 70, -10);
  151.         GRDraw(nil, 5, -35);
  152.         GRDraw(nil, 10, 0);
  153.         GRDraw(nil, 5, 35);
  154.         GRDraw(nil, 65, 0);
  155.         GRDraw(nil, 0, 21);
  156.         GRDraw(nil, 4, 0);
  157.         GPolygonEnd(nil);
  158.  
  159.         GSetPen(nil, C_BLACK);
  160.         GPolygonStart(nil);
  161.         GAMove(nil, 155, 55);
  162.         GRDraw(nil, -75, 0);
  163.         GRDraw(nil, -80, 10);
  164.         GRDraw(nil, 0, -10);
  165.         GRDraw(nil, 80, -10);
  166.         GRDraw(nil, 75, 0);
  167.         GPolygonEnd(nil);
  168.     Fi(nil);
  169.     EndEffect();
  170.     fi;
  171.     CallEffect(nil, PR_CHASM1_ID);
  172. corp;
  173.  
  174. define tp_proving4 CHASM1_MAP_GROUP NextMapGroup().
  175.  
  176. define tp_proving4 r_chasmModel1 CreateThing(r_tunnel).
  177. r_chasmModel1@p_rName := "on a ledge overlooking a chasm".
  178. r_chasmModel1@p_rName1 := "Chasm".
  179. r_chasmModel1@p_MapGroup := CHASM1_MAP_GROUP.
  180. r_chasmModel1@p_rDrawAction := drawChasm1.
  181. r_chasmModel1@p_rEnterRoomDraw := EnterRoomDraw.
  182. r_chasmModel1@p_rLeaveRoomDraw := LeaveRoomDraw.
  183. Scenery(r_chasmModel1, "minerals;glowing.ledge.glow;green").
  184. monsterSet4(r_chasmModel1).
  185. SetThingStatus(r_chasmModel1, ts_readonly).
  186.  
  187. define tp_proving4 proc makeChasm1(string desc; int x, y)thing:
  188.     thing chasm;
  189.  
  190.     chasm := CreateThing(r_chasmModel1);
  191.     if desc ~= "" then
  192.     chasm@p_rDesc := desc;
  193.     fi;
  194.     chasm@p_rContents := CreateThingList();
  195.     chasm@p_rExits := CreateIntList();
  196.     chasm@p_rCursorX := x;
  197.     chasm@p_rCursorY := y;
  198.     AddTail(chasm@p_rContents, o_chasm);
  199.     SetThingStatus(chasm, ts_wizard);
  200.     chasm
  201. corp;
  202.  
  203. define tp_proving4 r_chasm1 makeChasm1(
  204.     "You are at the east end of a large, narrow cave which is dominated by a "
  205.     "deep chasm running down the center. Glowing minerals in the ceiling of "
  206.     "the cave provide ample light. Narrow ledges on both sides of the chasm "
  207.     "give room for passage. You are on the south side of the chasm and there "
  208.     "is no visible way to get to the north side. The ledge continues to the "
  209.     "west, and a tunnel heads east.", 151, 57).
  210. Connect(r_tunnelX3, r_chasm1, D_WEST).
  211. Connect(r_tunnelX3, r_chasm1, D_EXIT).
  212. Scenery(r_chasm1, "tunnel").
  213.  
  214. define tp_proving4 r_chasm2 makeChasm1(
  215.     "The cave bends slightly here, with the west end angling slightly to the "
  216.     "south. Across the chasm, you can see a deep crack leading north from the "
  217.     "ledge on that side.", 80, 57).
  218. Connect(r_chasm1, r_chasm2, D_WEST).
  219. Scenery(r_chasm2, "crack;deep").
  220.  
  221. define tp_proving4 r_chasm3 makeChasm1("", 3, 67).
  222. Connect(r_chasm2, r_chasm3, D_WEST).
  223.  
  224. define tp_proving4 r_chasm4 makeChasm1(
  225.     "The ledge on this side of the chasm comes to an end here.", 148, 37).
  226.  
  227. define tp_proving4 r_chasm5 makeChasm1(
  228.     "A deep crack heads north from here.", 77, 37).
  229. Connect(r_chasm4, r_chasm5, D_WEST).
  230. Scenery(r_chasm5, "crack;deep").
  231.  
  232. define tp_proving r_chasm6 makeChasm1(
  233.     "The crack comes to an end here in a solid rock wall. There is a sturdy "
  234.     "door in the rock, however.", 77, 1).
  235. r_chasm6@p_rName := "deep in the crack".
  236. Connect(r_chasm5, r_chasm6, D_NORTH).
  237. Scenery(r_chasm6,
  238.     "crack;deep.wall;solid,rock.beam;massive,wooden.strap;thick,iron").
  239. r_chasm6@p_rHintString := "The key is kept a fair ways away from here.".
  240.  
  241. define tp_proving4 r_chasm7 makeChasm1("", 3, 46).
  242. Connect(r_chasm5, r_chasm7, D_WEST).
  243.  
  244. define tp_proving4 PR_CHASM2_ID NextEffectId().
  245. define tp_proving4 proc drawChasm2()void:
  246.  
  247.     if not KnowsEffect(nil, PR_CHASM2_ID) then
  248.     DefineEffect(nil, PR_CHASM2_ID);
  249.     GSetImage(nil, "Proving/chasm2");
  250.     IfFound(nil);
  251.         GShowImage(nil, "", 0, 0, 160, 100, 0, 0);
  252.     Else(nil);
  253.         GSetPen(nil, C_DARK_GREY);
  254.         GAMove(nil, 0, 0);
  255.         GRectangle(nil, 159, 99, true);
  256.  
  257.         GSetPen(nil, C_LIGHT_GREY);
  258.         GPolygonStart(nil);
  259.         GAMove(nil, 159, 75);
  260.         GRDraw(nil, -79, 10);
  261.         GRDraw(nil, -80, 0);
  262.         GRDraw(nil, 0, -9);
  263.         GRDraw(nil, 5, 0);
  264.         GRDraw(nil, 0, -21);
  265.         GRDraw(nil, 75, 0);
  266.         GRDraw(nil, 79, -10);
  267.         GPolygonEnd(nil);
  268.  
  269.         GSetPen(nil, C_BLACK);
  270.         GPolygonStart(nil);
  271.         GAMove(nil, 159, 65);
  272.         GRDraw(nil, -79, 10);
  273.         GRDraw(nil, -80, 0);
  274.         GRDraw(nil, 0, -10);
  275.         GRDraw(nil, 80, 0);
  276.         GRDraw(nil, 79, -10);
  277.         GPolygonEnd(nil);
  278.  
  279.         GSetPen(nil, C_MEDIUM_BROWN);
  280.         GAMove(nil, 35, 63);
  281.         GRectangle(nil, 10, 14, false);
  282.         GSetPen(nil, C_BROWN);
  283.         GRMove(nil, 1, 0);
  284.         GRectangle(nil, 8, 14, true);
  285.     Fi(nil);
  286.     EndEffect();
  287.     fi;
  288.     CallEffect(nil, PR_CHASM2_ID);
  289. corp;
  290.  
  291. define tp_proving4 CHASM2_MAP_GROUP NextMapGroup().
  292.  
  293. define tp_proving4 r_chasmModel2 CreateThing(r_tunnel).
  294. r_chasmModel2@p_rName := "on a ledge overlooking a chasm".
  295. r_chasmModel2@p_rName1 := "Chasm".
  296. r_chasmModel2@p_MapGroup := CHASM2_MAP_GROUP.
  297. r_chasmModel2@p_rDrawAction := drawChasm2.
  298. r_chasmModel2@p_rEnterRoomDraw := EnterRoomDraw.
  299. r_chasmModel2@p_rLeaveRoomDraw := LeaveRoomDraw.
  300. Scenery(r_chasmModel2, "minerals;glowing.ledge.glow;green").
  301. monsterSet4(r_chasmModel2).
  302. SetThingStatus(r_chasmModel2, ts_readonly).
  303.  
  304. define tp_proving4 proc makeChasm2(string desc; int x, y)thing:
  305.     thing chasm;
  306.  
  307.     chasm := CreateThing(r_chasmModel2);
  308.     if desc ~= "" then
  309.     chasm@p_rDesc := desc;
  310.     fi;
  311.     chasm@p_rContents := CreateThingList();
  312.     chasm@p_rExits := CreateIntList();
  313.     chasm@p_rCursorX := x;
  314.     chasm@p_rCursorY := y;
  315.     AddTail(chasm@p_rContents, o_chasm);
  316.     SetThingStatus(chasm, ts_wizard);
  317.     chasm
  318. corp;
  319.  
  320. define tp_proving4 r_chasm8 makeChasm2("", 153, 68).
  321. Connect(r_chasm3, r_chasm8, D_WEST).
  322.  
  323. define tp_proving4 r_chasm9 makeChasm2(
  324.     "The cave takes another slight bend here, with the west end now going "
  325.     "pretty well straight west. You can see a bridge over the chasm just to "
  326.     "the west of here.", 79, 77).
  327. Connect(r_chasm8, r_chasm9, D_WEST).
  328. Scenery(r_chasm9, "bridge").
  329.  
  330. define tp_proving4 r_chasm10 makeChasm2(
  331.     "There is a bridge heading north across the chasm here. There are also "
  332.     "a lot of bones lying around here, some of them quite fresh, and some of "
  333.     "them quite large.", 37, 78).
  334. Connect(r_chasm9, r_chasm10, D_WEST).
  335. Scenery(r_chasm10, "bones;quite,large,fresh").
  336.  
  337. define tp_proving4 o_bridge CreateThing(nil).
  338. FakeObject(o_bridge, r_chasm10, "bridge;wooden",
  339.     "The bridge is built from wood and is fairly old, but it looks like it "
  340.     "should be able to support your weight.").
  341. o_bridge@p_Image := "Proving/chasmBridge".
  342.  
  343. define tp_proving4 r_chasm11 makeChasm2(
  344.     "The ledge on the other side of the chasm ends at this point in the cave, "
  345.     "but the one on this side leads right up to a tunnel opening. You can "
  346.     "smell some bad smells coming out of the tunnel.", 2, 78).
  347. Connect(r_chasm10, r_chasm11, D_WEST).
  348. Scenery(r_chasm11, "tunnel.opening;tunnel").
  349. r_chasm11@p_oSmellString :=
  350.     "The rank odour is quite strong. One component seems to be rotten meat, "
  351.     "and another unwashed bodies.".
  352.  
  353. define tp_proving4 r_chasm12 makeChasm2("", 151, 47).
  354. Connect(r_chasm7, r_chasm12, D_WEST).
  355.  
  356. define tp_proving4 r_chasm13 makeChasm2(
  357.     "The cave takes another slight bend here, with the west end now going "
  358.     "pretty well straight west. You can see a bridge over the chasm just to "
  359.     "the west of here.", 80, 56).
  360. Connect(r_chasm12, r_chasm13, D_WEST).
  361. Scenery(r_chasm13, "bridge").
  362.  
  363. define tp_proving4 r_chasm14 makeChasm2(
  364.     "There is a bridge heading south across the chasm here. There are also "
  365.     "a lot of bones lying around here, some of them quite fresh, and some of "
  366.     "them quite large.", 37, 56).
  367. Connect(r_chasm13, r_chasm14, D_WEST).
  368. AddTail(r_chasm14@p_rContents, o_bridge).
  369. Scenery(r_chasm14, "bones;quite,large,fresh,old").
  370.  
  371. define tp_proving4 r_chasm15 makeChasm2(
  372.     "The ledge along this side of the chasm comes to an end here. You cannot "
  373.     "go any further to the west.", 7, 56).
  374. Connect(r_chasm14, r_chasm15, D_WEST).
  375.  
  376. define tp_proving4 r_bridge makeChasm2("", 37, 67).
  377. r_bridge@p_rName := "on a bridge over a chasm".
  378. RoomName(r_bridge, "Bridge", "").
  379. Connect(r_chasm10, r_bridge, D_NORTH).
  380. Connect(r_chasm14, r_bridge, D_SOUTH).
  381. AddTail(r_bridge@p_rContents, o_bridge).
  382.  
  383. ignore DeleteSymbol(tp_proving4, "makeChasm2").
  384. ignore DeleteSymbol(tp_proving4, "makeChasm1").
  385.  
  386. /* here for a while is the stuff for the guardian troll */
  387.  
  388. define tp_proving4 TROLL_HITS 39.
  389. define tp_proving4 p_mTrollActive CreateBoolProp().
  390. define tp_proving4 p_pPlayerTryCross CreateBoolProp().
  391.  
  392. define tp_proving4 proc trollBridgeStepOn()status:
  393.     Me()@p_pPlayerTryCross := true;
  394.     continue
  395. corp;
  396. AddNorthChecker(r_chasm10, trollBridgeStepOn, false).
  397.  
  398. define tp_proving4 proc guardianTrollStep()void:
  399.     int hits;
  400.     thing me, target;
  401.  
  402.     /* m_guardianTroll not defined yet! */
  403.     me := Me();
  404.     hits := me@p_pHitNow + 5;
  405.     if hits > TROLL_HITS then
  406.     hits := TROLL_HITS;
  407.     fi;
  408.     me@p_pHitNow := hits;
  409.     if me@p_mTrollActive then
  410.     target := me@p_pCurrentTarget;
  411.     if target ~= nil then
  412.         if AgentLocation(target) ~= r_bridge then
  413.         me -- p_pCurrentTarget;
  414.         if FindAgentWithFlag(r_bridge, p_pStandard) = nil then
  415.             /* nobody here - go back to bed */
  416.             me@p_mTrollActive := false;
  417.             SetAgentLocation(me, nil);
  418.         fi;
  419.         else
  420.         if Random(2) = 0 then
  421.             ignore MonsterHitPlayer(me, target, r_bridge);
  422.         else
  423.             MonsterAction(me);
  424.         fi;
  425.         fi;
  426.     else
  427.         if FindAgentWithFlag(r_bridge, p_pStandard) ~= nil then
  428.         /* someone here - dance for them */
  429.         MonsterAction(me);
  430.         fi;
  431.     fi;
  432.     fi;
  433.     MonsterReschedule(me);
  434. corp;
  435.  
  436. define tp_proving4 proc guardianTrollKill(thing thePlayer, troll)bool:
  437.  
  438.     Print("You have defeated the guardian troll! Nursing its wounds, it "
  439.     "climbs back under the bridge. You quickly take the opportunity to "
  440.     "dash the rest of the way across the bridge.\n");
  441.     OPrint(Capitalize(Me()@p_pName) + " has defeated the guardian troll!. "
  442.     "Nursing its wounds, it climbs back unde the bridge.\n");
  443.     troll@p_mTrollActive := false;
  444.     troll -- p_pCurrentTarget;
  445.     ignore ForceAction(troll, DoUnShowIcon);
  446.     SetAgentLocation(troll, nil);
  447.     thePlayer -- p_pPlayerTryCross;
  448.     ignore EnterRoom(r_chasm14, D_NORTH, MOVE_NORMAL);
  449.     false
  450. corp;
  451.  
  452. /* want the PLAYER to cross the bridge, not the troll! */
  453.  
  454. define tp_proving4 proc doCrossBridge()status:
  455.     ignore EnterRoom(r_chasm14, D_NORTH, MOVE_NORMAL);
  456.     continue
  457. corp;
  458.  
  459. /* called by ForceAction, so done by troll */
  460. define tp_proving4 proc guardianTrollGivePre()status:
  461.     thing it, trueMe;
  462.     string name;
  463.  
  464.     trueMe := TrueMe();
  465.     it := It();
  466.     name := FormatName(it@p_oName);
  467.     if it@p_oCarryer ~= nil and it@p_oCreator = trueMe then
  468.     if MatchName(it@p_oName, "apple") ~= -1 then
  469.         /* troll is not too bright, any apple-ish thing is good enough! */
  470.         if trueMe@p_pPlayerTryCross then
  471.         SPrint(trueMe,
  472.             "The troll sniffs the apple and looks happy (or at "
  473.             "least as happy as a troll can look!). With an expression "
  474.             "something like delight, it takes a bite of the apple. "
  475.             "Seeing that it is preoccupied, you make a dash for the "
  476.             "far side. The troll notices and tries to stop you, "
  477.             "but you are able to duck under its arm and cross to "
  478.             "the other side. It turns and glares at you, but does "
  479.             "not pursue you.\n");
  480.         ABPrint(r_bridge, trueMe, trueMe,
  481.             Capitalize(trueMe@p_pName) +
  482.             " somehow gets past the troll and is "
  483.             "able to cross to the other side.\n");
  484.         trueMe -- p_pPlayerTryCross;
  485.         ignore ForceAction(trueMe, doCrossBridge);
  486.         else
  487.         SPrint(trueMe,
  488.           "The troll sniffs the apple and happily gobbles it down!\n");
  489.         fi;
  490.     else
  491.         SPrint(trueMe,
  492.         "The troll sniffs the " + name + " but isn't impressed. "
  493.         "It tosses the " + name + " over the side of the bridge.\n");
  494.         ABPrint(r_bridge, trueMe, trueMe,
  495.         "The troll tosses something over the side of the bridge.\n");
  496.     fi;
  497.     ZapObject(it);
  498.     DelElement(trueMe@p_pCarrying, it);
  499.     succeed
  500.     else
  501.     SPrint(trueMe,
  502.         "The troll sniffs the " + name + " but isn't impressed. " +
  503.         "It tosses the " + name + " back to you.\n");
  504.     fail
  505.     fi
  506. corp;
  507.  
  508. define tp_proving4 m_guardianTroll CreateMonsterModel("troll;guardian",
  509.     "The guardian troll is quite large, standing about 7 feet tall and nearly "
  510.     "that much around. It has small beady eyes, a piglike snout and huge "
  511.     "tusks. Its arms are like tree-trunks, and its fingers have knifelike "
  512.     "claws. The guardian troll isn't wearing any armour, but its scales and "
  513.     "skin look thick enough to ward off all but the best sword thrusts.",
  514.     nil, guardianTrollStep, TROLL_HITS, 4, 6, 7, 18, 0).
  515. AddModelAction(m_guardianTroll, "bellows").
  516. AddModelAction(m_guardianTroll, "raises its fists and roars").
  517. AddModelAction(m_guardianTroll, "rumbles ominously").
  518. AddModelAction(m_guardianTroll, "glares threateningly").
  519. AddModelAction(m_guardianTroll, "grins nastily").
  520. AddModelAction(m_guardianTroll, "beckons encouragingly").
  521. AddModelAction(m_guardianTroll, "rubs its hands expectantly").
  522. m_guardianTroll@p_mTrollActive := false.
  523. m_guardianTroll@p_mKillAction := guardianTrollKill.
  524. m_guardianTroll@p_pGivePre := guardianTrollGivePre.
  525. m_guardianTroll@p_Image := "Characters/guardianTroll".
  526. SetupMachine(m_guardianTroll).
  527. CreateMachine("troll;guardian", m_guardianTroll, nil, DummyMonsterInit).
  528. ignore SetMachineActive(m_guardianTroll, guardianTrollStep).
  529.  
  530. define tp_proving4 proc trollBridgeCross()status:
  531.  
  532.     if Me()@p_pPlayerTryCross then
  533.     if m_guardianTroll@p_mTrollActive then
  534.         Print("The guardian troll blocks your path.\n");
  535.     else
  536.         m_guardianTroll@p_mTrollActive := true;
  537.         Print("As you try to walk the rest of the way across the bridge, "
  538.         "there is a roar from somewhere underneath, and the "
  539.         "guardian troll quickly climbs out and blocks your way "
  540.         "across the bridge.\n");
  541.         /* could be someone crossing back and standing here */
  542.         OPrint("There is a roar from underneath the bridge, and the "
  543.         "guardian troll climbs out and confronts " +
  544.         Me()@p_pName + ".\n");
  545.         SetAgentLocation(m_guardianTroll, r_bridge);
  546.         ignore ForceAction(m_guardianTroll, DoShowIcon);
  547.     fi;
  548.     fail
  549.     else
  550.     if m_guardianTroll@p_mTrollActive then
  551.         Print("Luckily, the guardian troll is occupied and doesn't "
  552.         "notice you messing around behind its back!\n");
  553.     fi;
  554.     continue
  555.     fi
  556. corp;
  557. AddNorthChecker(r_bridge, trollBridgeCross, false).
  558.  
  559. define tp_proving4 proc bridgeClimb()void:
  560.     if m_guardianTroll@p_mTrollActive then
  561.     Print("There is no way the troll is going to let you climb down into "
  562.         "its hidey-hole!\n");
  563.     else
  564.     Print("Climbing down into the hidey-hole of a troll is not a "
  565.         "good idea!\n");
  566.     fi;
  567. corp;
  568. AddSpecialCommand(r_bridge, "climb", bridgeClimb).
  569.  
  570. define tp_proving4 r_trollRoom CreateThing(r_provingCave).
  571. SetupRoomP(r_trollRoom, "in a squalid cave",
  572.     "This cave is quite large and is clearly home to a large number of "
  573.     "trolls. There are piles of bones and half-eaten meat everywhere, along "
  574.     "with other refuse not to be mentioned. The exit to the east admits a "
  575.     "steady green glow.").
  576. r_trollRoom@p_rDark := false.    /* override r_provingCave */
  577. Connect(r_chasm11, r_trollRoom, D_WEST).
  578. Connect(r_chasm11, r_trollRoom, D_ENTER).
  579. Scenery(r_trollRoom,
  580.   "cave.bone;piles,pile,of.pile.meat;half-eaten,half,eaten.refuse.glow;green").
  581. r_trollRoom@p_oSmellString := "WHEW! The stink is indescribable!".
  582. r_trollRoom@p_rLastVisit := Time().
  583. r_trollRoom@p_Image := "Proving/trollRoom".
  584.  
  585. define tp_proving4 proc trollEnter(thing room)void:
  586.     thing me;
  587.     int now, i;
  588.  
  589.     now := Time();
  590.     me := Me();
  591.     if me@p_pStandard and now - r_trollRoom@p_rLastVisit >= 300 then
  592.     r_trollRoom@p_rLastVisit := now;
  593.     for i from 0 upto Random(4) + 3 do
  594.         ignore CreateMonster(me, m_largeTroll, r_trollRoom);
  595.     od;
  596.     fi;
  597. corp;
  598. AddAnyEnterAction(r_trollRoom, trollEnter, false).
  599.  
  600. unuse tp_proving4
  601.