| Parameter | Type | Description | 
|---|---|---|
| PLAYER | PLAYER | The player to inspect. | 
| ROOM | ROOM | The room to look for. | 
| VALUE(BOOLEAN) | TRUE if the provided player contains the provided room in its stack, or FALSE if not. | 
This function checks if a specific player has a specific room in its room stack, returning TRUE if so, or FALSE if the room is not one of the rooms in the stack.
Since rooms are a "state" structure, you can use them for non-room things like conversations:
// Actions
action modal a_go named "go" uses modes "north", "south", "west", "east";
action transitive a_examine named "look at", "examine", "x"; 
action transitive a_talkto named "talk to"; 
action general a_quit named "quit"; 
// Conversation Actions
action transitive a_talkabout named "talk about";
action general a_leave named "back", "leave"; 
// "Hidden" Actions
action general a_look; // queued every action.
action general a_roomcheck; // queued every action.
// ================== Topics (as objects) =======================
object archetype o_topic;
object ot_sports : o_topic named "sports";
object ot_music : o_topic named "music";
object ot_movies : o_topic named "movies";
object ot_dogs : o_topic named "dogs";
// ===================== All about Bob ==========================
room convo_bob
{
	onAction(a_look) {} // Do nothing on "look".
	// If "in" the conversation, this block will be hit instead of the player fallback.
	onAction(a_leave)
	{
		textln("You cease talking to Bob.");
		popRoom(player); // Go back to where you were.
	}
	onActionWith(a_talkabout, ot_sports)
	{
		textln("Bob says, \"Oh yeah! I love sports!\"");
	}
	onActionWith(a_talkabout, ot_movies)
	{
		textln("Bob says, \"Heck yeah! I love movies!\"");
	}
	onActionWith(a_talkabout, ot_dogs)
	{
		textln("Bob says, \"Oh man, I love dogs! They're adorable!\"");
	}
	// Omitting "music"
	onActionWithAncestor(a_talkabout, o_topic)
	{
		textln("Bob says, \"I dunno much about that.\"");
	}
	onActionWithOther(a_talkabout)
	{
		textln("That's not a topic of conversation.");
	}
}
object o_bob named "Bob"
{
	onAction(a_examine)
	{
		textln("That's Bob. He likes to talk about things (\"TALK TO\" him).");
	}
	onAction(a_talkto)
	{
		textln("You are now talking to Bob. (TALK ABOUT sports, movies, music, or dogs. You can LEAVE the conversation, too)");
		pushRoom(player, convo_bob); // Keep current room for "leave".
	}
	onRoomBrowse()
	{
		textln("Bob is here.");
	}
}
// ======================== Actual Rooms ==========================
room r_bedroom; // Prototyped due to early use in r_livingroom
room r_livingroom
{
	init()
	{
		giveObject(this, o_bob);
	}
	onAction(a_look)
	{
		textln("You are in the living room.");
		textln("North goes to the bedroom.");
		browse(this);
	}
	onModalAction(a_go, "north")
	{
		setRoom(player, r_bedroom);
	}
}
extend room r_bedroom
{
	onAction(a_look)
	{
		textln("You are in the bedroom.");
		textln("South goes to the living room.");
		browse(this);
	}
	onModalAction(a_go, "south")
	{
		setRoom(player, r_livingroom);
	}
}
player p_main
{
	init()
	{
		// add topics (so that they are always accessible to the player).
		giveObject(this, ot_sports);
		giveObject(this, ot_movies);
		giveObject(this, ot_music);
		giveObject(this, ot_dogs);
	}
	onAction(a_roomcheck)
	{
		if (!currentRoomIs(this, r_livingroom) && playerHasRoomInStack(this, r_livingroom))
			textln("(NOTE: You are still \"in\" the living room, but can't access things in it - \"TALK TO BOB\" will not work)");
	}
	onUnhandledAction(a_go)
	{
		textln("You can't go that way.");
	}
	onIncompleteCommand(a_talkto)
	{
		textln("TALK TO what?");
	}
	onUnhandledAction(a_talkto)
	{
		textln("I can't TALK TO that.");
	}
	onIncompleteCommand(a_talkabout)
	{
		textln("TALK ABOUT what?");
	}
	onUnhandledAction(a_talkabout)
	{
		textln("You must be conversing with somebody to TALK ABOUT things.");
	}
	onAction(a_leave)
	{
		textln("You're not in a conversation.");
	}
}
world
{
	init()
	{
		setRoom(p_main, r_bedroom);
		setPlayer(p_main); // from this moment on, this is the "player" keyword.
	}
	start()
	{
		textln("Type \"quit\" to quit, \"go\" and a compass direction to move between rooms.");
		textln("Examine things with \"look at\" or \"examine\".");
		textln("");
		queue a_look;
		queue a_roomcheck;
	}
	onAction(a_quit)
	{
		quit;
	}
	afterSuccessfulCommand()
	{
		queue a_look;
		queue a_roomcheck;
	}
}
		SetRoom() — Sets the current room on a player, after clearing its room stack.
		PushRoom() — Adds a room onto a player's room stack, preserving the previous rooms on the stack.
		PopRoom() — Removes the topmost room from a player's room stack.
		SwapRoom() — Changes the topmost room on a player's room stack, preserving the rest of the stack.
		CurrentRoomIs() — Checks the topmost room on a player's room stack against another room.
		NoCurrentRoom() — Checks if a player is not in any room.