In the discussion of the object hierarchy, Gavin brought up this case:
Test results:
[1] sit on couch
You get onto the couch.[2] stand on couch
But you’re already on the couch.[3] sit on tailgate
(getting off the couch)
You get onto the tailgate.[4] stand on tailgate
(getting off the tailgate)
(getting out of the room)
But you aren’t in anything at the moment.[5] g
You get onto the tailgate.
I’m baffled by what’s going on here. The key parts of the standard rules appear to be:
Check an actor entering (this is the implicitly pass through other barriers rule):
if the holder of the actor is the holder of the noun, continue the action;
let the local ceiling be the common ancestor of the actor with the noun;
while the holder of the actor is not the local ceiling:
let the current home be the holder of the actor;
if the player is the actor:
if the current home is a supporter or the current home is an animal:
say "(getting off [the current home])[command clarification break]" (A);
otherwise:
say "(getting out of [the current home])[command clarification break]" (B);
silently try the actor trying exiting;
if the holder of the actor is the current home, stop the action;
[rule continues]
and
Carry out an actor getting off (this is the standard getting off rule):
let the former exterior be the not-counting-parts holder of the noun;
surreptitiously move the actor to the former exterior.
The first rule makes the player get out of things until they’re in the local ceiling, which is the common ancestor of the player with the original holder. The second rule carries out the exit by moving the player to the former exterior, which is the not-counting-parts holder of the player. Not-counting-parts holder translates into I6 as CoreOfParentOfCoreOf, and common ancestor translates into I6 as CommonAncestor, which takes CoreOf both arguments and finds if there’s anything that is indirectly CoreOfParentOfCoreOf both things.
What seems to be happening is that the local ceiling is getting set to the truck, and when the player exits from the tailgate it converts to getting off the tailgate which sends them to the room. Since the room is not the local ceiling, it tries exiting again, which fails.
Now, I don’t expect to understand what’s going wrong here, because I don’t understand I6 and especially not the object tree. But I found something that’s confusing even at the level I think I understand.
What I don’t understand is how you get moved from the tailgate to the room in the first place. I put in some debug code to allow you to retrieve the common ancestor and not-counting-parts holder:
Zooming is an action applying to one visible thing. Understand "zoom [any object]" as zooming.
Report zooming: say "The common ancestor of you with [the noun] is [common ancestor of the player with the noun]."
Booming is an action applying to nothing. Understand "boom" as booming.
Report booming: say "The not-counting-parts holder of you is [not-counting-parts holder of the player]."
and got this:
room
You can see a truck (empty) and a couch here.stand on tailgate
You get onto the tailgate.zoom tailgate
The common ancestor of you with the tailgate is truck.boom
The not-counting-parts holder of you is truck.get off tailgate
You get off the tailgate.room
You can see a truck (empty) and a couch here.
If the not-counting-parts holder of the player is the truck when they’re on the tailgate, and the standard getting off rule moves the player surreptitiously to their not-counting-parts holder [EDIT: The issues is that the rules moves the player to the tailgate’s not-counting-parts holder], why does it move them to the room rather than the truck? “Surreptitiously move” is just a call to an I6 “move.”