Possible I6-related bug when being pushed on an enterable supporter

I suspect that @DavidG might be the person to ask this, but I’m drawing attention to this bug in case anyone else has insights.

When you write this, which has someone push an enterable supporter while you’re on it

Lab is a room. North lab is north of lab. 

The float is an enterable supporter in north lab. The float is pushable between rooms. The player is 
on the float.

Neil is a man in North lab.

Every turn when Neil is in North lab and the float is in north lab: try Neil pushing the float to the 
south.	

Test me with "z".

you get this:

North lab (on the float)
You can see Neil here.

test me
(Testing.)

[1] z
Time passes.

Neil goes south, pushing the float in front, taking you along.

Lab (on the float) (in Neil)
Lab (on the float)
You can see Neil here.

Note that “(on the float) (in Neil)”. The way pushing an object works, if I’ve got this right, is that the object gets temporarily made part of the pusher, the pusher moves in the normal way, and then the object gets put back in the location. It seems as though in this special case, a room heading is being produced before the float gets unglued from Neil. But I’ve been unable to make head or tail of where that’s happening, and I’m not sure if it’s actually something going on in the I6.

For what it’s worth, this does not happen with enterable containers; only supporters.

A bit of a necro-post, but I ran into this issue by happenstance, so it seems like others might.

The cause is that a Standard Rule called the describe room gone into rule issues a try looking statement that doesn’t seem to be required. That rule can be adjusted to prevent the issue:

This is the alt describe room gone into rule:
	if the player is the actor:
		if the action is not silent:
			produce a room description with going spacing conventions;
	otherwise:
		if the noun is a direction:
			if the location is the room gone from or the player is within the
				vehicle gone by or the player is within the thing gone with:
				if the room gone from is the room gone to:
					continue the action;
				otherwise:
					if the noun is up:
						say "[The actor] [go] up" (A);
					otherwise if the noun is down:
						say "[The actor] [go] down" (B);
					otherwise:
						say "[The actor] [go] [noun]" (C);
			otherwise:
				let the back way be the opposite of the noun;
				if the location is the room gone to:
					let the room back the other way be the room back way from the
						location;
					let the room normally this way be the room noun from the
						room gone from;
					if the room back the other way is the room gone from or
						the room back the other way is the room normally this way:
						if the back way is up:
							say "[The actor] [arrive] from above" (D);
						otherwise if the back way is down:
							say "[The actor] [arrive] from below" (E);
						otherwise:
							say "[The actor] [arrive] from [the back way]" (F);
					otherwise:
						say "[The actor] [arrive]" (G);
				otherwise:
					if the back way is up:
						say "[The actor] [arrive] at [the room gone to] from above" (H);
					otherwise if the back way is down:
						say "[The actor] [arrive] at [the room gone to] from below" (I);
					otherwise:
						say "[The actor] [arrive] at [the room gone to] from [the back way]" (J);
		otherwise if the location is the room gone from:
			say "[The actor] [go] through [the noun]" (K);
		otherwise:
			say "[The actor] [arrive] from [the noun]" (L);
		if the vehicle gone by is not nothing:
			say " ";
			if the vehicle gone by is a supporter:
				say "on [the vehicle gone by]" (M);
			otherwise:
				say "in [the vehicle gone by]" (N);
		if the thing gone with is not nothing:
			if the player is within the thing gone with:
				say ", pushing [the thing gone with] in front, and [us] along too" (O);
			otherwise if the player is within the vehicle gone by:
				say ", pushing [the thing gone with] in front" (P);
			otherwise if the location is the room gone from:
				say ", pushing [the thing gone with] away" (Q);
			otherwise:
				say ", pushing [the thing gone with] in" (R);
		if the player is within the vehicle gone by and the player is not
			within the thing gone with:
			say ", taking [us] along" (S);
			say ".";
			[try looking;] [not necessary]
			continue the action;
		say ".";

The alt describe room gone into rule is listed instead of the describe room gone into rule in the report going rules.

This clear-as-pie rule works to prevent it:

before looking when the player is enclosed by something enclosed by a person
who is not enterable: instead do nothing.

There are a few known issues with enterable supporters; I’m working on a patch to address them.

It’s so obvious, I can’t believe nobody tried this before!

1 Like

In seriousness, for anyone wondering why this works: pushing objects from room to room involves a surprising amount of hackery in the going action. Internally, it’s handled by moving the pushed thing to the actor’s inventory, having the actor perform a going action, then moving the pushed thing back to the location. And then a lot of smoke and mirrors in the description code handles all the possible permutations of where the player might be during this, to make sure it looks right at the moments when looking happens.

One of these many permutations involves a person pushing a supporter that the player is on top of, and this one is bugged (producing an extra looking action)—but this is a rare enough occurrence that it didn’t get caught during unit tests. Zed’s code circumvents the bug by checking whether the player is enclosed by something carried by a non-enterable person, which should only happen during a pushing action, when the pushed thing is moved temporarily into the actor’s inventory.

2 Likes