/*** TRANSITIONS ***/
Hitms = Proc(vrb, loc, func)
{
If (Verb == vrb) {
If (loc) {
$move($ME, loc);
GO = TRUE;
}
If (func) {
func();
}
}
}
Synvb = Proc(vrb, newvrb)
{
If (Verb == vrb) {
Verb = newvrb;
}
}
road1(ACTION) = Proc()
{
Hitms(n, gard1, 0);
Hitms(s, gard2, 0);
Hitms(e, road2, 0);
Hitms(w, road3, 0);
}
road2(ACTION) = Proc()
{
Hitms(n, gard1, 0);
Hitms(s, gard2, 0);
Hitms(e, road6, 0);
Hitms(w, road1, 0);
}
DropKill = Proc()
{
"The drop would kill you.\n";
MyLoc = $loc($ME);
GO = TRUE;
}
road3(ACTION) = Proc()
{
Hitms(n, 0, DropKill);
Hitms(s, 0, DropKill);
Hitms(e, road1, 0);
Hitms(w, road7, Entr7);
}
road4(ACTION) = Proc()
{
Hitms(n, farm1, 0);
Hitms(s, road6, 0);
Hitms(e, frst1, 0);
Hitms(w, gard1, 0);
}
road5(ACTION) = Proc()
{
Hitms(n, road6, 0);
Hitms(s, town1, 0);
Hitms(e, frst1, 0);
Hitms(w, gard2, 0);
}
road6(ACTION) = Proc()
{
Hitms(n, road4, 0);
Hitms(s, road5, 0);
Hitms(e, frst1, 0);
Hitms(w, road2, 0);
}
road7(ACTION) = Proc()
{
$miss(Tress, Tress, East7, West7, 0, 0, 0, 0, 0, 0);
}
East7 = Proc()
{
GO = TRUE;
If (!HWY7) {
$move($ME, road3);
}
Else {
Dump7($cont(road7));
HWY7 = HWY7 - 1;
Get7($cont(Roadx));
}
}
West7 = Proc()
{
GO = TRUE;
Dump7($cont(road7));
HWY7 = HWY7 + 1;
Get7($cont(Roadx));
}
Dump7 = Proc(obj)
{
If ($link(obj)) {
Dump7($link(obj)); // start at bottom
}
If (obj != $ME) { // Everything else leaves
obj.RDLOC = HWY7; // Retain its location on HWY 7
$move(obj, Roadx); // Put it in the box
}
}
Get7 = Proc(obj)
{
If (obj) {
Get7($link(obj));
If (obj.RDLOC == HWY7) {
$move(obj, road7);
}
}
}
Entr7 = Proc()
{
Dump7($cont(road7));
HWY7 = 0;
Get7($cont(Roadx));
}
gard1(ACTION) = Proc()
{
Hitms(n, gard1, 0);
Hitms(s, road1, 0);
Hitms(e, gard1, 0);
Hitms(w, gard1, 0);
}
gard2(ACTION) = Proc()
{
Hitms(n, road1, 0);
Hitms(s, gard2, 0);
Hitms(e, gard2, 0);
Hitms(w, gard2, 0);
}
FLeave = Proc()
{
If ($pct(20)) {
$move($ME, road6);
}
GO = TRUE;
}
frst1(ACTION) = Proc()
{
$miss(FLeave, FLeave, FLeave, FLeave, FLeave, FLeave, FLeave, FLeave, 0, 0);
}
farm1 (ACTION) = Proc()
{
Synvb(enter, north);
Hitms(n, farm2, 0);
Hitms(s, road4, 0);
Hitms(e, farm3, 0);
Hitms(w, farm4, 0);
Hitms(ne, farm3, 0);
Hitms(nw, farm4, 0);
}
farm2 (ACTION) = Proc()
{
Synvb(out, s);
Synvb(enter, n);
Synvb(east, up);
Hitms(n, farm6, 0);
Hitms(s, farm1, 0);
Hitms(up, farm7, 0);
}
farm3 (ACTION) = Proc()
{
Hitms(n, farm5, 0);
Hitms(s, farm1, 0);
Hitms(e, frst1, 0);
Hitms(nw, farm5, 0);
Hitms(sw, farm1, 0);
}
farm4 (ACTION) = Proc()
{
Hitms(n, farm5, 0);
Hitms(s, farm1, 0);
Hitms(w, gard1, 0);
Hitms(ne, farm5, 0);
Hitms(se, farm1, 0);
}
farm5 (ACTION) = Proc()
{
Hitms(e, farm3, 0);
Hitms(w, farm4, 0);
Hitms(se, farm3, 0);
Hitms(sw, farm4, 0);
}
farm6 (ACTION) = Proc()
{
Hitms(out, farm2, 0);
Hitms(s, farm2, 0);
}
farm7 (ACTION) = Proc()
{
Hitms(e, farm2, 0);
Hitms(d, farm2, PanL);
}
town1 (ACTION) = Proc()
{
Hitms(n, road5, 0);
Hitms(s, town2, 0);
Hitms(e, town3, 0);
Hitms(w, town4, 0);
}
town2 (ACTION) = Proc()
{
Hitms(n, town1, 0);
Hitms(e, town5, 0);
Hitms(w, town6, 0);
}
town3 (ACTION) = Proc()
{
Hitms(out, town1, 0);
Hitms(w, town1, 0);
}
town4 (ACTION) = Proc()
{
Hitms(e, town1, 0);
Hitms(out, town1, 0);
}
town5 (ACTION) = Proc()
{
Hitms(w, town2, 0);
Hitms(out, town2, 0);
}
town6 (ACTION) = Proc()
{
Hitms(e, town2, 0);
Hitms(out, town2, 0);
}
cel01 (ACTION) = Proc()
{
Hitms(n, cel02, 0);
Hitms(w, cel04, 0);
Hitms(u, farm7, 0);
}
cel02 (ACTION) = Proc()
{
Hitms(n, cel05, 0);
Hitms(s, cel01, 0);
Hitms(e, cel20, 0);
}
cel20(ACTION) = Proc()
{
Hitms(w, cel02, 0);
}
cel03 (ACTION) = Proc()
{
Hitms(s, cel05, 0);
If (!dragon.KILLED) {
Hitms(w, cel13, 0);
Hitms(ne, cel09, 0);
Hitms(d, cel09, 0);
}
}
cel04 (ACTION) = Proc()
{
Synvb(down, north);
Hitms(n, cel10, 0);
Hitms(e, cel01, 0);
Hitms(w, cel08, 0);
}
MV56= Proc() {Cel6x = 5;}
MV76= Proc() {Cel6x = 7;}
MV67= Proc()
{
If ((Cel6x != 7) & dragon.AWAKE & !dragon.KILLED) {
"The ice dragon blocks your attempt to cross!\n\n";
}
Else {
$move($ME, cel07);
}
GO = TRUE; // short circuit default error message
}
MV65= Proc()
{
If ((Cel6x != 5) & dragon.AWAKE & !dragon.KILLED) {
"The ice dragon blocks your attempt to leave!\n";
}
Else {
$move($ME, cel05);
}
GO = TRUE; // short circuit default error message
}
cel05 (ACTION) = Proc()
{
Hitms(n, cel03, 0);
Hitms(s, cel02, 0);
Hitms(ne, cel06, MV56);
}
cel06 (ACTION) = Proc()
{
Hitms(e, 0, MV67);
Hitms(sw, 0, MV65);
If ((!dragon.KILLED) & dragon.AWAKE & ($loc($ME) == cel06)) { //still here
MyLoc = -1;
}
}
cel07 (ACTION) = Proc()
{
Synvb(out, west);
Hitms(w, cel06, MV76);
}
Thirst = Proc()
{
If ($loc($ME) == desert) {
"The blazing sun is too much for you, I'm afraid.\n";
die();
}
}
Move08 = Proc()
{
If (RBTouch) {
If (dragon.KILLED) {
$move($ME, field);
}
Else {
$move($ME, desert);
$sfus($ME, Thirst, 10);
}
}
Else {
"You bump your nose against the painting.\n";
MyLoc = $loc($ME);
}
GO = TRUE;
}
cel08 (ACTION) = Proc()
{
Hitms(e, cel04, 0);
Hitms(w, 0, Move08);
}
Slippery = Proc()
{
"The waterfall is to slick for you to climb.\n";
MyLoc = $loc($ME);
GO = TRUE;
}
CrackEntr = Proc()
{
"You slip through the crack in the waterfall.\n";
}
Get21 = Proc()
{
Var t, t1;
t = $cont(riverx);
While (t) {
If (t.Loc21 == RiverLoc) {
t1 = $link(t);
$move(t, cel21);
t = t1;
}
Else {
t = $link(t);
}
}
}
Dump21 = Proc()
{
Var t, t1;
t = $cont(cel21);
While (t) {
If (t != $ME) {
t.Loc21 = RiverLoc;
t1 = $link(t);
$move(t, riverx);
t = t1;
}
Else {
t = $link(t);
}
}
}
Entr21 = Proc()
{
RiverLoc = 1;
Get21();
}
cel09 (ACTION) = Proc()
{
Hitms(n, cel21, Entr21);
Hitms(u, 0, Slippery);
Hitms(s, cel18, CrackEntr);
}
Move11 = Proc()
{
If (dragon.KILLED) {
If (!wetsuit.WORN) {
"The pit is full of water!!!\n";
}
Else {
"That water looks mighty dangerous. Are you sure? ";
If ($yorn()) {
"You leap into the pit and are immediately grabbed by a "
"mighty current which pulls you down, down, down... Soon "
"the pressure becomes too great for you to breathe, and the "
"last thing you remember is feeling somewhat like an "
"elephant's footstool.\n";
die();
}
}
MyLoc = $loc($ME);
}
Else {
$move($ME, cel11);
}
GO = TRUE;
}
cel10 (ACTION) = Proc()
{
Synvb(up, s);
Hitms(s, cel04, 0);
Hitms(d, 0, Move11);
}
cel11 (ACTION) = Proc()
{
If (GOVERB & !<clear crystal>.LIGHT) {
"You trip and fall into a pit that you were unable to see "
"in the dark!\n";
die();
}
Hitms(e, cel12, 0);
Hitms(w, cel16, 0);
}
cel12 (ACTION) = Proc()
{
Hitms(w, cel11, 0);
}
WaterEntr = Proc()
{
If ($ME.HAS > globe.WEIGH) {
If (!wetsuit.WORN) {
"Whatever you're carrying drags you down into the icy waters!\n";
die();
}
}
}
cel13 (ACTION) = Proc()
{
If (Verb == down) {
If (cel13.HOLED) {
WaterEntr();
"You plunge into the icy waters!\n";
$move($ME, cel14);
GO = TRUE;
$exit(1);
}
}
Hitms(e, cel03, 0);
Hitms(w, cel19, 0);
}
Drown = Proc()
{
If (($loc($ME) == cel14) | ($loc($ME) == cel17)) {
If (!wetsuit.WORN) {
"You can't hold your breath any longer. The last thing you "
"feel is the odd sensation of water entering your lungs.\n";
die();
}
}
}
cel14 (ACTION) = Proc()
{
If (Verb == up) {
If (cel13.HOLED) {
"You pop out through a hole in the ice!\n";
$move($ME, cel13);
GO = TRUE;
$exit(1);
}
Else {
"You are blocked by an icy roof above!\n";
}
}
Hitms(w, cel15, 0);
Hitms(e, cel17, 0);
$sfus($ME, Drown, 1);
}
cel15(ACTION) = Proc()
{
Synvb(up, south);
Synvb(enter, e);
Hitms(e, cel14, WaterEntr);
Hitms(s, cel16, 0);
}
cel16(ACTION) = Proc()
{
Synvb(down, north);
Hitms(n, cel15, 0);
Hitms(e, cel11, 0);
}
cel17(ACTION) = Proc()
{
Hitms(ne, cel18, 0);
Hitms(w, cel14, 0);
$sfus($ME, Drown, 1);
}
Swim = Proc()
{
"You dive into the icy waters.\n";
WaterEntr();
}
cel18(ACTION) = Proc()
{
Synvb(enter, sw);
Hitms(n, cel09, 0);
Hitms(sw, cel17, Swim);
}
cel19(ACTION) = Proc()
{
Hitms(e, cel13, 0);
}
North21 = Proc()
{
Dump21();
RiverLoc = RiverLoc + 1;
GO = TRUE;
cel21.SEEN = FALSE;
Get21();
}
South21 = Proc()
{
Dump21();
GO = TRUE;
RiverLoc = RiverLoc - 1;
cel21.SEEN = FALSE;
If (!RiverLoc) {
$move($ME, cel09);
}
Else {
Get21();
}
}
CantClimb = Proc()
{
"The sides of the river bed are too steep for you to climb.\n";
MyLoc = $loc($ME);
GO = TRUE;
}
GrateThere = Proc()
{
"The grate blocks your attempt to move that way.\n";
MyLoc = $loc($ME);
GO = TRUE;
}
cel21(ACTION) = Proc()
{
If (RiverLoc == GRATELOC)
$miss(South21, GrateThere, CantClimb, CantClimb, 0, 0, 0, 0, 0, 0);
Else If (RiverLoc == BEND1LOC)
$miss(CantClimb, South21, CantClimb, North21, 0, 0, 0, 0, 0, 0);
Else If ((RiverLoc > BEND1LOC) & (RiverLoc < BEND2LOC))
$miss(CantClimb, CantClimb, South21, North21, 0, 0, 0, 0, 0, 0);
Else If (RiverLoc == BEND2LOC)
$miss(CantClimb, North21, South21, CantClimb, 0, 0, 0, 0, 0, 0);
Else If (RiverLoc == BEND2LOC)
$miss(South21, North21, CantClimb, CantClimb, 0, 0, 0, 0, 0, 0);
Else // RiverLoc < BEND1LOC
$miss(North21, South21, CantClimb, CantClimb, 0, 0, 0, 0, 0, 0);
}
desert(ACTION) = Proc()
{
Hitms(n, desert, 0);
Hitms(s, desert, 0);
Hitms(e, desert, 0);
Hitms(w, desert, 0);
Hitms(ne, desert, 0);
Hitms(nw, desert, 0);
Hitms(se, desert, 0);
Hitms(sw, desert, 0);
}
field(ACTION) = Proc()
{
Hitms(n, 0, ENDGAME);
}