home *** CD-ROM | disk | FTP | other *** search
/ Amiga MA Magazine 1998 #7 / amigamamagazinepolishissue1998.iso / rozrywka / rpg / amigamud / src / proving / sewer.m < prev    next >
Text File  |  1997-06-22  |  17KB  |  468 lines

  1. /*
  2.  * Amiga MUD
  3.  *
  4.  * Copyright (c) 1997 by Chris Gray
  5.  */
  6.  
  7. /*
  8.  * sewer.m - shallow sewer level of the proving grounds.
  9.  */
  10.  
  11. define tp_proving tp_sewer CreateTable()$
  12. use tp_sewer
  13.  
  14. define tp_sewer m_drinkingGoblin CreateMonsterModel("goblin,gob",
  15.     "The goblin is a small, humanoid creature with pale skin, large eyes, "
  16.     "protruding ears, and sharp teeth. It walks in a perpetual crouch but "
  17.     "is nonetheless quite fast on its feet.",
  18.     MonsterInit, RandomMove,
  19.     10, 8, 9, 6, 5, 40)$
  20. m_drinkingGoblin@p_mBlocker := true$
  21. AddModelAction(m_drinkingGoblin, "slouches around")$
  22. AddModelAction(m_drinkingGoblin, "gibbers")$
  23. AddModelAction(m_drinkingGoblin, "drools")$
  24. AddModelAction(m_drinkingGoblin, "howls")$
  25. MakeMonsterSmart(m_drinkingGoblin)$
  26. m_drinkingGoblin@p_mSpecialAction := monsterDrink$
  27. m_drinkingGoblin@p_Image := "Characters/drinkingGoblin"$
  28. m_drinkingGoblin@p_mSound := "goblin"$
  29. GNewIcon(m_drinkingGoblin, makeGoblinIcon())$
  30.  
  31. /* also used in proving2.m */
  32.  
  33. define tp_proving proc monsterSet3(thing room)void:
  34.  
  35.     InitMonsterModels(room, 275);
  36.     AddPossibleMonster(room, m_rat, 25);
  37.     AddPossibleMonster(room, m_snake, 25);
  38.     AddPossibleMonster(room, m_largeRat, 25);
  39.     AddPossibleMonster(room, m_largeSnake, 25);
  40.     AddPossibleMonster(room, m_drinkingGoblin, 25);
  41. corp;
  42.  
  43. define tp_sewer proc grateLiftDown(thing sewerRoom)void:
  44.  
  45.     Print("You lift the grate on hinges and climb down into the sewer.\n");
  46.     if Me()@p_pHidden then
  47.     OPrint("The drainage grate lifts for a moment, then closes.\n");
  48.     else
  49.     OPrint(Capitalize(CharacterNameG(Me())) +
  50.         " lifts the drainage grate and descends into the sewer below.\n");
  51.     fi;
  52.     LeaveRoomStuff(sewerRoom, D_DOWN, MOVE_SPECIAL);
  53.     EnterRoomStuff(sewerRoom, D_UP, MOVE_NORMAL);
  54. corp;
  55. define tp_sewer proc grateLiftUp(thing theAlley)status:
  56.     string name;
  57.     bool hidden;
  58.  
  59.     name := CharacterNameG(Me());
  60.     hidden := Me()@p_pHidden;
  61.     Print("You climb up to the grate, open it, and exit to the alley.\n");
  62.     LeaveRoomStuff(theAlley, D_UP, MOVE_NORMAL);
  63.     EnterRoomStuff(theAlley, D_DOWN, MOVE_SPECIAL);
  64.     if hidden then
  65.     OPrint("The drainage grate lifts for a moment, then closes.\n");
  66.     else
  67.     OPrint("The drainage grate lifts and " + name + " emerges.\n");
  68.     fi;
  69.     fail
  70. corp;
  71. define tp_proving o_drainageGrate CreateThing(nil)$
  72. FakeModel(o_drainageGrate,
  73.     "grate,grating;large,drainage."
  74.     "grate,grating;large,drainage,drain,overhead."
  75.     "overhead;large,drainage,drain,grating,grate."
  76.     "frame;wooden.handle.bar;iron",
  77.     "The grate is made of iron bars secured into a wooden frame. It has a "
  78.     "handle on one side.")$
  79. o_drainageGrate@p_oSmellString := "The grate smells of the sewer below."$
  80. o_drainageGrate@p_oTouchString := "The grate is VERY dirty."$
  81. o_drainageGrate@p_oLowerString := "The grate cannot be lowered any further."$
  82. o_drainageGrate@p_oNotLockable := true$
  83. o_drainageGrate@p_Image := "Proving/sewerGrateOutside"$
  84. define tp_proving o_fakeGrate CreateThing(nil)$
  85. FakeModel(o_fakeGrate, "grate,grating,drain;large,drainage", "")$
  86. o_fakeGrate@p_oLiftString := "The grate is out of reach from here."$
  87. o_fakeGrate@p_oOpenString := "The grate is out of reach from here."$
  88. o_fakeGrate@p_oLowerString := "The grate is out of reach from here."$
  89. o_fakeGrate@p_oNotLockable := true$
  90. o_fakeGrate@p_Image := "Proving/sewerGrateInside"$
  91.  
  92. define tp_sewer o_trickle CreateThing(nil)$
  93. SetupObject(o_trickle, nil, "water.stream.trickle", "")$
  94. o_trickle@p_oInvisible := true$
  95. o_trickle@p_oNotGettable := true$
  96. define tp_sewer proc trickleDrink()status:
  97.     thing me;
  98.     string name;
  99.     int current, max;
  100.  
  101.     me := Me();
  102.     name := Capitalize(CharacterNameG(me));
  103.     if not me@p_pHidden then
  104.     OPrint(name + " takes a drink from the noxious trickle.\n");
  105.     fi;
  106.     current := me@p_pHitNow;
  107.     if Parent(me) = m_drinkingGoblin then
  108.     max := me@p_pHitMax;
  109.     if current ~= max then
  110.         current := current + Random(3) + 2;
  111.         if current > max then
  112.         current := max;
  113.         fi;
  114.         me@p_pHitNow := current;
  115.     fi;
  116.     else
  117.     Print("ACK!!! It tastes horrible!\n");
  118.     max := Random(3) + 2;
  119.     if max >= current then
  120.         /* DOOM */
  121.         if me@p_pStandard then
  122.         Print("You are killed!\n");
  123.         if not me@p_pHidden then
  124.             OPrint(name + " dies!\n");
  125.         fi;
  126.         KillPlayer(me, me);
  127.         else
  128.         KillMonster(me);
  129.         fi;
  130.     else
  131.         me@p_pHitNow := current - max;
  132.     fi;
  133.     fi;
  134.     succeed
  135. corp;
  136. o_trickle@p_oEatChecker := trickleDrink$
  137. define tp_sewer o_drink CreateThing(nil)$
  138. SetupObject(o_drink, nil, "drink.swallow", "")$
  139. o_drink@p_oInvisible := true$
  140. define tp_sewer proc takeDrink(thing drink)status:
  141.     trickleDrink()
  142. corp;
  143. o_drink@p_oGetChecker := takeDrink$
  144. o_trickle@p_Image := "Proving/trickle"$
  145. o_trickle@p_oListenString := "The trickle of water is too small to hear."$
  146. o_trickle@p_oSmellString := "The trickle of water smells bad."$
  147.  
  148. /* also used in proving2.m */
  149.  
  150. define tp_proving r_provingTunnel1 CreateThing(r_tunnel)$
  151. AutoGraphics(r_provingTunnel1, AutoTunnels)$
  152. AutoPens(r_provingTunnel1, C_DARK_GREY,C_LIGHT_GREY,C_LIGHT_GREY,C_LIGHT_GREY)$
  153. SetThingStatus(r_provingTunnel1, ts_readonly)$
  154. monsterSet3(r_provingTunnel1)$
  155.  
  156. define tp_proving r_provingTunnel2 CreateThing(r_tunnel)$
  157. AutoGraphics(r_provingTunnel2, AutoTunnels)$
  158. AutoPens(r_provingTunnel2, C_DARK_GREY,C_LIGHT_GREY,C_LIGHT_GREY,C_LIGHT_GREY)$
  159. SetThingStatus(r_provingTunnel2, ts_readonly)$
  160.  
  161. define tp_proving r_provingTunnelD CreateThing(r_tunnel)$
  162. r_provingTunnelD@p_rDark := true$
  163. AutoGraphics(r_provingTunnelD, AutoTunnels)$
  164. AutoPens(r_provingTunnelD, C_DARK_GREY,C_LIGHT_GREY,C_LIGHT_GREY,C_LIGHT_GREY)$
  165. SetThingStatus(r_provingTunnelD, ts_readonly)$
  166. monsterSet3(r_provingTunnelD)$
  167.  
  168. define tp_sewer r_sewer1 CreateThing(r_provingTunnel1)$
  169. SetupRoomP(r_sewer1, "in a north-south sewer",
  170.     "This is fairly large tunnel made of wood and stone, with a trickle of "
  171.     "noxious water flowing along the floor. "
  172.     "There is a grating overhead with metal wrungs leading up to it.")$
  173. HUniConnect(r_alley2, r_sewer1, D_DOWN)$
  174. UniConnect(r_sewer1, r_alley2, D_UP)$
  175. r_alley2@p_rDownOMessage := "."$
  176. r_alley2@p_rDownEMessage := "."$
  177. AddTail(r_sewer1@p_rContents, o_trickle)$
  178. AddTail(r_sewer1@p_rContents, o_drink)$
  179. AddTail(r_sewer1@p_rContents, o_fakeGrate)$
  180. Scenery(r_sewer1, "wall.wood.stone.wrung;rusty,metal")$
  181. define tp_sewer o_drainageGrate1 CreateThing(o_drainageGrate)$
  182. AddTail(r_alley2@p_rContents, o_drainageGrate1)$
  183. define tp_sewer proc grateLift1()status:
  184.     grateLiftDown(r_sewer1);
  185.     succeed
  186. corp;
  187. o_drainageGrate1@p_oLiftChecker := grateLift1$
  188. o_drainageGrate1@p_oOpenChecker := grateLift1$
  189. SetThingStatus(o_drainageGrate1, ts_wizard)$
  190. define tp_sewer proc grateLift2()status:
  191.     /* Only players, "standard" monsters (Packrat, etc.) and monsters who
  192.        can reward with money (i.e. intelligent ones) can lift the grate. */
  193.     if Me()@p_pStandard or Me()@p_pMoney ~= 0 then
  194.     grateLiftDown(r_sewer1);
  195.     fi;
  196.     fail
  197. corp;
  198. AddDownChecker(r_alley2, grateLift2, false)$
  199. define tp_sewer proc grateLift3()status:
  200.     if Me()@p_pStandard or Me()@p_pMoney ~= 0 then
  201.     grateLiftUp(r_alley2)
  202.     else
  203.     fail
  204.     fi
  205. corp;
  206. AddUpChecker(r_sewer1, grateLift3, false)$
  207.  
  208. define tp_sewer r_sewer2 CreateThing(r_provingTunnel1)$
  209. SetupRoomP(r_sewer2, "in a north-south sewer",
  210.     "You can barely see by natural light here. A dark opening heads west.")$
  211. AddTail(r_sewer2@p_rContents, o_trickle)$
  212. AddTail(r_sewer2@p_rContents, o_drink)$
  213. Connect(r_sewer1, r_sewer2, D_SOUTH)$
  214. Scenery(r_sewer2, "opening;dark")$
  215.  
  216. define tp_sewer r_sewer3 CreateThing(r_provingTunnel1)$
  217. SetupRoomP(r_sewer3, "in a north-south sewer",
  218.     "Light comes down from a manhole above, casting a dim light on the "
  219.     "scummy water covering your feet.")$
  220. AddTail(r_sewer3@p_rContents, o_trickle)$
  221. AddTail(r_sewer3@p_rContents, o_drink)$
  222. Connect(r_sewer2, r_sewer3, D_SOUTH)$
  223. AddTail(r_sewer3@p_rContents, o_manholeCover)$
  224.  
  225. define tp_sewer r_sewer4 CreateThing(r_provingTunnel1)$
  226. SetupRoomP(r_sewer4, "in a north-south sewer",
  227.     "You can barely see by natural light here. A dark opening heads east.")$
  228. AddTail(r_sewer4@p_rContents, o_trickle)$
  229. AddTail(r_sewer4@p_rContents, o_drink)$
  230. Connect(r_sewer3, r_sewer4, D_SOUTH)$
  231. Scenery(r_sewer4, "opening;dark")$
  232.  
  233. define tp_sewer r_sewer5 CreateThing(r_provingTunnel1)$
  234. SetupRoomP(r_sewer5, "in a north-south sewer",
  235.     "This is fairly large tunnel made of wood and stone, with a trickle of "
  236.     "noxious water flowing along the floor. "
  237.     "There is a grating overhead with metal wrungs leading up to it.")$
  238. Connect(r_sewer4, r_sewer5, D_SOUTH)$
  239. HUniConnect(r_alley4, r_sewer5, D_DOWN)$
  240. UniConnect(r_sewer5, r_alley4, D_UP)$
  241. r_alley4@p_rDownOMessage := "."$
  242. r_alley4@p_rDownEMessage := "."$
  243. AddTail(r_sewer5@p_rContents, o_trickle)$
  244. AddTail(r_sewer5@p_rContents, o_drink)$
  245. AddTail(r_sewer5@p_rContents, o_fakeGrate)$
  246. Scenery(r_sewer5, "wall.wood.stone.wrung;metal")$
  247. define tp_sewer o_drainageGrate2 CreateThing(o_drainageGrate)$
  248. AddTail(r_alley4@p_rContents, o_drainageGrate2)$
  249. define tp_sewer proc grateLift4()status:
  250.     grateLiftDown(r_sewer5);
  251.     succeed
  252. corp;
  253. o_drainageGrate2@p_oLiftChecker := grateLift4$
  254. o_drainageGrate2@p_oOpenChecker := grateLift4$
  255. SetThingStatus(o_drainageGrate2, ts_wizard)$
  256. define tp_sewer proc grateLift5()status:
  257.     if Me()@p_pStandard or Me()@p_pMoney ~= 0 then
  258.     grateLiftDown(r_sewer5);
  259.     fi;
  260.     fail
  261. corp;
  262. AddDownChecker(r_alley4, grateLift5, false)$
  263. define tp_sewer proc grateLift6()status:
  264.     if Me()@p_pStandard or Me()@p_pMoney ~= 0 then
  265.     grateLiftUp(r_alley4)
  266.     else
  267.     fail
  268.     fi
  269. corp;
  270. AddUpChecker(r_sewer5, grateLift6, false)$
  271.  
  272. define tp_sewer r_sewer0 CreateThing(r_provingTunnel1)$
  273. SetupRoomP(r_sewer0, "in a north-south sewer",
  274.     "This appears to be the north end of the sewer. A trickle of water "
  275.     "comes down the walls and heads south, but there are no other exits.")$
  276. AddTail(r_sewer0@p_rContents, o_trickle)$
  277. AddTail(r_sewer0@p_rContents, o_drink)$
  278. Connect(r_sewer1, r_sewer0, D_NORTH)$
  279. Scenery(r_sewer0, "wall")$
  280.  
  281. define tp_proving r_sewerShaft1 CreateThing(r_provingTunnelD)$
  282. SetupRoom(r_sewerShaft1, "in a vertical shaft",
  283.     "Rusty metal wrungs in the wall allow you to climb down here, and a "
  284.     "small opening heads east.")$
  285. Connect(r_sewer2, r_sewerShaft1, D_WEST)$
  286. Scenery(r_sewerShaft1, "wrung;rusty,metal.opening;small")$
  287.  
  288. define tp_proving r_sewerShaft3 CreateThing(r_provingTunnelD)$
  289. SetupRoom(r_sewerShaft3, "in a vertical shaft",
  290.     "Rusty metal wrungs in the wall allow you to climb down here, and a "
  291.     "small opening heads west.")$
  292. Connect(r_sewer4, r_sewerShaft3, D_EAST)$
  293. Scenery(r_sewerShaft3, "wrung;metal.opening;small")$
  294.  
  295. define tp_proving r_sewer6 CreateThing(r_provingTunnel1)$
  296. SetupRoomP(r_sewer6, "in a north-south sewer",
  297.     "On the west wall there is a small iron grill. There appears to be "
  298.     "open space behind it, but you can find no way to get into it.")$
  299. AddTail(r_sewer6@p_rContents, o_trickle)$
  300. AddTail(r_sewer6@p_rContents, o_drink)$
  301. Connect(r_sewer5, r_sewer6, D_SOUTH)$
  302. Scenery(r_sewer6, "grill;small,iron.space;open")$
  303.  
  304. define tp_sewer r_sewer7 CreateThing(r_provingTunnelD)$
  305. SetupRoomP(r_sewer7, "in a north-south sewer", "")$
  306. AddTail(r_sewer7@p_rContents, o_trickle)$
  307. AddTail(r_sewer7@p_rContents, o_drink)$
  308. Connect(r_sewer6, r_sewer7, D_SOUTH)$
  309.  
  310. define tp_sewer r_sewer8 CreateThing(r_provingTunnelD)$
  311. SetupRoomP(r_sewer8, "in a north-south sewer", "")$
  312. AddTail(r_sewer8@p_rContents, o_trickle)$
  313. AddTail(r_sewer8@p_rContents, o_drink)$
  314. Connect(r_sewer7, r_sewer8, D_SOUTH)$
  315.  
  316. define tp_sewer r_sewer9 CreateThing(r_provingTunnelD)$
  317. SetupRoomP(r_sewer9, "at a north and southwest corner in the sewer", "")$
  318. AddTail(r_sewer9@p_rContents, o_trickle)$
  319. AddTail(r_sewer9@p_rContents, o_drink)$
  320. Connect(r_sewer8, r_sewer9, D_SOUTH)$
  321. r_sewer9@p_StreamSoundVolume := 625$
  322. AddAnyEnterChecker(r_sewer9, startStreamSound, false)$
  323. AddNorthChecker(r_sewer9, stopStreamSound, false)$
  324.  
  325. define tp_sewer r_sewer10 CreateThing(r_provingTunnelD)$
  326. SetupRoomP(r_sewer10, "in a sewer running northeast to southwest", "")$
  327. AddTail(r_sewer10@p_rContents, o_trickle)$
  328. AddTail(r_sewer10@p_rContents, o_drink)$
  329. Connect(r_sewer9, r_sewer10, D_SOUTHWEST)$
  330. r_sewer10@p_StreamSoundVolume := 1250$
  331. AddAnyEnterChecker(r_sewer10, startStreamSound, false)$
  332.  
  333. define tp_sewer r_sewer11 CreateThing(r_provingTunnelD)$
  334. SetupRoomP(r_sewer11, "at a northeast and west corner in the sewer", "")$
  335. AddTail(r_sewer11@p_rContents, o_trickle)$
  336. AddTail(r_sewer11@p_rContents, o_drink)$
  337. Connect(r_sewer10, r_sewer11, D_SOUTHWEST)$
  338. r_sewer11@p_StreamSoundVolume := 2500$
  339. AddAnyEnterChecker(r_sewer11, startStreamSound, false)$
  340.  
  341. define tp_sewer r_sewer12 CreateThing(r_provingTunnel1)$
  342. SetupRoomP(r_sewer12, "in an east-west sewer",
  343.     "You can see an opening to the west.")$
  344. AddTail(r_sewer12@p_rContents, o_trickle)$
  345. AddTail(r_sewer12@p_rContents, o_drink)$
  346. Connect(r_sewer11, r_sewer12, D_WEST)$
  347. r_sewer12@p_StreamSoundVolume := 5000$
  348. AddAnyEnterChecker(r_sewer12, startStreamSound, false)$
  349.  
  350. define tp_sewer r_sewer13 CreateThing(r_provingTunnel1)$
  351. SetupRoomP(r_sewer13, "at the end of the sewer",
  352.     "This is fairly large tunnel made of wood and stone, with a trickle of "
  353.     "noxious water flowing along the floor. "
  354.     "The sewer extends into the darkness to the east. The west end of the "
  355.     "tunnel is blocked by an iron bar grating. Through the bars you can see "
  356.     "that the sewer drains into a small stream in a forest.")$
  357. AddTail(r_sewer13@p_rContents, o_trickle)$
  358. AddTail(r_sewer13@p_rContents, o_drink)$
  359. Connect(r_sewer12, r_sewer13, D_WEST)$
  360. Scenery(r_sewer13,
  361.     "sewer.stream;small.forest.darkness.stonework.work;stone.stone."
  362.     "wood.mouth;tunnel.tunnel;wood,and,stone")$
  363. r_sewer13@p_StreamSoundVolume := 7500$
  364. AddAnyEnterChecker(r_sewer13, startStreamSound, false)$
  365. AddTail(r_sewer13@p_rContents, o_barGrating)$
  366. AddTail(r_sewer13@p_rContents, o_gratingLatch)$
  367. define tp_sewer proc showAgent1(thing agent)void:
  368.     if agent@p_pName ~= "" and not agent@p_pHidden then
  369.     Print(Capitalize(CharacterNameG(agent)) +" is outside the grating.\n");
  370.     fi;
  371. corp;
  372. define tp_sewer proc extraDesc1()void:
  373.     ForEachAgent(r_forestByStream, showAgent1);
  374. corp;
  375. r_sewer13@p_rFurtherDesc := extraDesc1$
  376. define tp_sewer proc showAgent2(thing agent)void:
  377.     if agent@p_pName ~= "" and not agent@p_pHidden then
  378.     Print(Capitalize(CharacterNameG(agent)) + " is inside the grating.\n");
  379.     fi;
  380. corp;
  381. define tp_sewer proc extraDesc2()void:
  382.     ForEachAgent(r_sewer13, showAgent2);
  383. corp;
  384. r_forestByStream@p_rFurtherDesc := extraDesc2$
  385.  
  386. define tp_sewer p_rGratingSpecial CreateBoolProp()$
  387.  
  388. define tp_sewer proc barGratingOpen()status:
  389.     thing me;
  390.     bool hidden;
  391.     string name;
  392.  
  393.     r_sewer13@p_rGratingSpecial := true;
  394.     me := Me();
  395.     hidden := me@p_pHidden;
  396.     if hidden then
  397.     OPrint("The grating opens, then closes again.\n");
  398.     fi;
  399.     name := Capitalize(CharacterNameG(me));
  400.     if Here() = r_sewer13 then
  401.     Print("You pull on the latch mechanism. It is rusty and hard to move "
  402.         "but you are able to release it and open the grating. You step "
  403.         "out of the sewer beside the stream and close the grating.\n");
  404.     if not hidden then
  405.         OPrint(name +
  406.         " opens the grating, goes outside and closes the grating.\n");
  407.     fi;
  408.     LeaveRoomStuff(r_forestByStream, D_EXIT, MOVE_SPECIAL);
  409.     EnterRoomStuff(r_forestByStream, D_ENTER, MOVE_SPECIAL);
  410.     ignore DoRoomAnyEnterChecks(r_forestByStream);
  411.     if not hidden then
  412.         OPrint(name + " opens the grating and climbs out of the sewer.\n");
  413.     fi;
  414.     else
  415.     Print("You pull on the latch mechanism. It is rusty and hard to move "
  416.         "but you are able to release it and open the grating. You climb "
  417.         "into the sewer and the grating bangs shut behind you.\n");
  418.     if not hidden then
  419.         OPrint(name + " opens the grating and climbs into the sewer."
  420.         " The grating bangs shut.\n");
  421.     fi;
  422.     LeaveRoomStuff(r_sewer13, D_ENTER, MOVE_SPECIAL);
  423.     EnterRoomStuff(r_sewer13, D_EXIT, MOVE_SPECIAL);
  424.     ignore DoRoomAnyEnterChecks(r_sewer13);
  425.     if not hidden then
  426.         OPrint(name + " opens the grating and climbs into the sewer.\n");
  427.     fi;
  428.     fi;
  429.     if hidden then
  430.     OPrint("The grating opens, then closes again.\n");
  431.     fi;
  432.     r_sewer13@p_rGratingSpecial := false;
  433.     succeed
  434. corp;
  435. o_gratingLatch@p_oOpenChecker := barGratingOpen$
  436. o_gratingLatch@p_oPullChecker := barGratingOpen$
  437. define tp_sewer proc doBarGratingOpen()void:
  438.     ignore barGratingOpen();
  439. corp;
  440. o_gratingLatch@p_oActWord := "unlatch"$
  441. o_gratingLatch@p_oActAction := doBarGratingOpen$
  442. o_barGrating@p_oActWord := "unlatch"$
  443. o_barGrating@p_oActAction := doBarGratingOpen$
  444.  
  445. define tp_sewer m_watcher1 CreateThing(nil)$
  446. CreateMachine("", m_watcher1, r_forestByStream, nil)$
  447. define tp_sewer proc watch1(string s)void:
  448.     if not r_sewer13@p_rGratingSpecial and
  449.     SubString(s, 0, 20) ~= "Inside the grating, "
  450.     then
  451.     ABPrint(r_sewer13, nil, nil, "Outside the grating, " + s + "\n");
  452.     fi;
  453. corp;
  454. ignore SetMachineOther(m_watcher1, watch1)$
  455.  
  456. define tp_sewer m_watcher2 CreateThing(nil)$
  457. CreateMachine("", m_watcher2, r_sewer13, nil)$
  458. define tp_sewer proc watch2(string s)void:
  459.     if not r_sewer13@p_rGratingSpecial and
  460.     SubString(s, 0, 21) ~= "Outside the grating, "
  461.     then
  462.     ABPrint(r_forestByStream, nil, nil, "Inside the grating, " + s + "\n");
  463.     fi;
  464. corp;
  465. ignore SetMachineOther(m_watcher2, watch2)$
  466.  
  467. unuse tp_sewer
  468.