Hi all. I’m relearning Inform 6. Ages ago I wrote a LightToDark routine. It doesn’t make sense to me that Inform doesn’t have one.
Anyway, the manual states that after is called for the room being entered. Running with messages on shows this is not the case. Simple enough, I created a class “Room” with after.
But I noticed it called the after routine twice. Not a huge deal, but why does it do that?
As you type a direction command (e.g. “go north”), the action is set to Go, noun
is n_obj
, and generic before-routines are run, before the action routine (in this case GoSub
) is invoked.
(When I say “generic” before-routines, I mean the library calls react_before
for all objects in scope, it calls before
for the room and noun
, and it calls GamePreRoutine
. And analogous for generic after-routines.)
The action routine sends the ##Going fake action to the room you’re about to enter, so the room has a chance to say the player can’t go there. If this before routine returns false, GoSub
moves the player to that room. It then sends the fake action ##Going to the after routine of the room you left. If this after routine returns false, it calls the generic after routines with action
== ##Go, which will give everything, including the current room, a chance to react.
This is what it looks like if you print the actions sent to the room:
Source:
Constant Story "Rule test";
Constant Headline "^A test to see when rules run as you go between rooms.^";
include "parser";
include "verblib";
include "grammar";
Class Room
with
print_trace [ prop;
#Ifdef DEBUG;
print " *** ", (name) self, ".", (string) prop, ": action is ", (DebugAction) action, "^";
#Endif;
],
before [; self.print_trace("before"); ],
after [; self.print_trace("after"); ],
has light;
Room Room1 "Room 1"
with
description "You can see that room 2 lies to the north.",
n_to Room2;
Room Room2 "Room 2"
with
description "You can see that room 1 lies to the south.",
s_to Room1;
[ Initialise;
location = Room1;
#Ifndef DEBUG;
print "^^You need to compile in DEBUG mode to see what's happening!";
#Endif;
"^^";
];
Thanks! That clears up a lot. Unfortunately, I just went into work so I can’t try it yet, but I will soon.
P.S. I should clarify that I’m using the old library because 6.12 hadn’t come out at the time I originally wrote it. (Yes I’m old, and it’s not like riding a bike!)
This may be different in library 6.11
The release notes for 6.12.4 say:
It used to be a bit ambiguous prior to 6.12.x how the “Go” action worked
in a before rule for a room. It is now explicitly set such that the
“Going” action catches the player entering the room and “Go” action
catches the player leaving the room.
6.11 doesn’t have ##Going
at all.
This has me confused, since the introducion of ##Going
is not mentioned in any of the 6.12.x release notes ( Releases · David Griffith / inform6lib · GitLab ).