When playing Inform games, do you use the 'OOPS' function?

The voting results are surprising!

I wonder how much complexity could be removed from the parser by removing the oops functionality?

I think the up-arrow is as old as MS-DOS itself - even older than Adventure. It’s a given part of ANY prompt of a computer. :wink:

OOPS - Works in Inform 7, but strangely enough isn’t listed in the source code. This is unique.
VERIFY - Works in Inform 7. I actually found a use for it a few weeks ago when the compile failed due to Inform failing to recognize obscure ASCIIs in file paths.
JIGSAW’s command list - Never heard of it. I have heard of a big list of testing commands over at the wiki, though, and they all work. I verified it last week, and I’ll list it shortly as I7 code.
INVENTORY WIDE/TALL - Doesn’t work in Inform 7.
NOTIFY - Works in Inform 7. (It’s the same as NOTIFY ON.)
PRONOUNS - Works in Inform 7.
PLACES - Doesn’t work in Inform 7.
OBJECTS - Doesn’t work in Inform 7.
FIND - Doesn’t work in Inform 7.

Here’s a list that’s part of my help command extension:



Chapter - Requesting options

Understand "options" or "settings" as requesting options.

Requesting options is an action out of world. 

Report requesting options (this is the standard options report rule):
	Say "[line break][bold type]Default options[roman type][paragraph break]";
	Say "For the player, there are only two options affecting gameplay:[paragraph break]";
	Say "Room description printings, that are typically only set to establish the scenario and aren't meant to contain anything practically useful, can be set by the following commands:[line break]";
	Say "[bold type][fixed letter spacing]verbose[variable letter spacing][roman type] - Long room descriptions will always be printed (even when you re-enter rooms). This is intended for immersion, and is the default setting.[line break]";
	Say "[bold type][fixed letter spacing]brief[variable letter spacing][roman type] - Long room descriptions are only printed upon the first visit of a room, or if you type '[fixed letter spacing]look[variable letter spacing]' to look around. This is the default setting of older IF games.[line break]";
	Say "[bold type][fixed letter spacing]superbrief[variable letter spacing][roman type] - Long room descriptions will never be printed (even if you type '[fixed letter spacing]look[variable letter spacing]'). This is intended for people with short attention spans.[paragraph break]";
	Say "[bold type][fixed letter spacing]notify on[variable letter spacing][roman type]/[bold type][fixed letter spacing]off[variable letter spacing][roman type] - Turns on/off score notifications (such as '[fixed letter spacing][bracket]Your score has just gone up by one point.[close bracket][variable letter spacing]').".

Report requesting options (this is the playtesting options report rule):
	Say "Playtesters may also find the following options useful:[paragraph break]";
	Say "[bold type][fixed letter spacing]version[variable letter spacing][roman type] - Gives the full banner text associated with the game, including title, author, release number, IFID, and other bibliographical data; it follows this with a list of the included extensions.[line break]";
	Say "[bold type][fixed letter spacing]pronouns[variable letter spacing][roman type] - Announces to the player what the game is currently understanding as the antecedents of 'him', 'her', 'it', and 'them'. This is often useful during testing, but sometimes also during play.[line break]";
	Say "[bold type][fixed letter spacing]transcript on[variable letter spacing][roman type]/[bold type][fixed letter spacing]off[variable letter spacing][roman type] - Turns on/off logging of the playthrough (if supported by your interpreter). (Works in Windows Frotz, but not inside Inform 7.)[line break]";
	Say "[bold type][fixed letter spacing]verify[variable letter spacing][roman type] - Verifies the story file for errors by examining checksums. This is a legacy command that is rarely useful with modern mediums.[paragraph break]".

[All of these options are present in the release.]



Chapter - Developer options - Not for release

Understand "dev" or "debug" or "cheats" as requesting developer options.

Requesting developer options is an action out of world. 


Report requesting developer options (this is the developer testing commands report rule):
	Say "[line break][bold type]Run-time testing commands[roman type][paragraph break]";
	Say "(Note that these commands may change in future releases of Inform 7. These are all found to work in Build 6G60.)[paragraph break]";
	Say "[bold type][fixed letter spacing]showme [variable letter spacing]x[roman type] - Lists the properties (including any relations) of an object anywhere in the model world. Typing it alone will list all objects within the current room.[line break]";
	Say "[bold type][fixed letter spacing]test [variable letter spacing]x[roman type] - Execute a test script. Typing it alone will list which test scripts are available.[paragraph break]";
	Say "[bold type][fixed letter spacing]purloin [variable letter spacing]x[roman type]- Immediately places an object in the player's inventory, no questions asked. This is not limited to physical things, so typing '[fixed letter spacing]purloin all[variable letter spacing]' is not recommended.[line break]";
	Say "[bold type][fixed letter spacing]abstract [variable letter spacing]x[fixed letter spacing] to [variable letter spacing]y[roman type] - Similar to purloin, but gives the first object to the second object, in a sensible way (such as placing things inside containers).[line break]";
	Say "[bold type][fixed letter spacing]gonear [variable letter spacing]x[roman type] - Teleports the player to the room that contains the object.[line break]";
	Say "[bold type][fixed letter spacing]scope [variable letter spacing]x[roman type] - Shows the scope from an object. Typing it alone will show the scope from the player.[line break]";
	Say "[bold type][fixed letter spacing]random[variable letter spacing][roman type] - Sets the random-number generator to a predictable seed value (making the generator predictable inbetween plays).[line break]";
	Say "[bold type][fixed letter spacing]relations[variable letter spacing][roman type] - Lists the current state of any mutable relations created in the source code.[paragraph break]";
	Say "[bold type][fixed letter spacing]actions on[variable letter spacing][roman type]/[bold type][fixed letter spacing]off[variable letter spacing][roman type] - Actions tracing on/off. Lists every action as it happens, and what its outcome is.[line break]";
	Say "[bold type][fixed letter spacing]scenes on[variable letter spacing][roman type]/[bold type][fixed letter spacing]off[variable letter spacing][roman type] - Scene-change tracing on/off. Also lists the scenes currently happening.[line break]";
	Say "[bold type][fixed letter spacing]rules on[variable letter spacing][roman type]/[bold type][fixed letter spacing]off[variable letter spacing][roman type]/[bold type][fixed letter spacing]all[variable letter spacing][roman type] - Rules tracing on/off. Lists the name of rules before they execute. The '[fixed letter spacing]all[variable letter spacing]' setting will include even the rules [italic type]considered[roman type].[paragraph break]";
	Say "[bold type][fixed letter spacing]showverb [variable letter spacing]x[roman type] - Shows I6-level information about a verb: Synonyms, arguments, and whether the arguments are reversed for a particular line.[line break]";
	Say "[bold type][fixed letter spacing]tree [variable letter spacing]x[roman type] - Prints the I6 object tree, showing the instantiation and the containment relation of an object. Typing it alone will show all instantiations, indented according to the containment relation. Typing '[fixed letter spacing]tree all[variable letter spacing]', will list all objects in detail.[line break]";
	Say "[bold type][fixed letter spacing]trace [variable letter spacing]x[roman type] - Sets the level of parser tracing, listing very low-level parsing information. Levels range from level 0 (off), through level 1 (on) to level 6 (the most detailed).[line break]";
	Say "[bold type][fixed letter spacing]showheap[variable letter spacing][roman type] - Shows the heap of managed memory used by the story file (if used). (Meant for Inform 7 developer debugging only.)[paragraph break]".

[The testing commands, are all listed here: http://inform7.com/sources/src/i6template/Woven/B-testt.pdf ]
[There is also a mention of a Glulx-only command, called GLKLIST. I should switch to Glulx, and test if it's there.]

It’s part of the Parser.i6t template.

Knocking it out would save about sixty lines of code, which is nice, but small in terms of the overall I7 library system. It would free two global variables and a 64-byte array. It wouldn’t really simplify anything (that is, the remaining parser would not be more tractable for overall development).

I guess I might have heard of oops before, years ago, but it’s such a useless command, and I’ll tell you why:
Hitting the right keys is fundamental to playing IFs. Oops is the equivalent of implementing this function in a platformer game: “Oh, I see you hit the E key there. You must have meant the W key, so I’ll just make you jump anyway. Did you hit the Y key? I’m assuming that you still meant W. You’re just a cat walking across the keyboard, aren’t you? Well, it’s okay - playing a platformer can be hard for a cat, so I’ll just steer the character right every time you press a button - how about that?”
If you spell something wrong, you SHOULD get a slap on the wrist. That’s why I’m going to make Tkae a demon like Hastur: Saying Tkaes name three times during my adventure, will summon him, and he will promptly eat the player.

Nope, that’s silly.

OOPS was a reasonable response to the early interpreter environment, which didn’t have command-line editing (up-arrow, copy-and-paste). Once that stuff was invented, OOPS was orphaned.

I am assuming that you guys know about AGAIN (abbreviated G), that repeats the last command. Again, another useless command that can be replaced by the up-arrow.

Yes, that’s another example. It was a valuable feature originally.

Wouldn’t it also allow us to redefine the verb “o” so we could allow the game to understand “o door” for “open door”? As it is I don’t seem to be able to do that in I7. (This could also be done by changing the template so that “o” didn’t trigger an “oops,” though for people in the know that might be as frustrating as eliminating “oops” altogether.)

EDIT: I suppose the same thing applies to “g” but I like and use “g.” It falls much more naturally under my fingers than the up arrow.

I’ve recently gotten an Android phone (with hardware keyboard) and started playing more IF on it.
None of the interpreters support the up-arrow thing (that’s mostly for scrollback), so I need O and G.

In what adventure have you found doing actions over again useful? I know that sometimes waiting for several turns can be useful, but waiting is z. …and travelling long distances east, is e, so when can you possibly have use for g? Are we talking MUDs now?

Ah, Jacek, you just love to disagree with people, don’t you?

That is such a troll question to ask, because you know that I want to disagree with you, but that would be dishonest.

Some games that give you long chains of “talk to x” commands (not that this is the best design); Earl Grey was one and I think Andromeda Apocalypse. IIRC the dart-throwing in Endless Nameless. Meditation in Calm, perhaps.

EDIT: And of course this.

I have found times when G is far more useful than up-arrow. For example, in Metamorphoses: I accidentally lost the needle and burned the wooden box in the furnace, so I had no way to push the hot button safely. I didn’t want to let the furnace cool down, so I just typed PRESS BUTTON followed by G.G.G.G.G.G… (all on one line). It made it far less tedious to find the tiny window of time in which the button was cool enough to press than it would have been using only up-arrow.

That’s really an edge case, but I like having AGAIN in there nonetheless.

Nathan beat me to it - in portable devices, G (and now O) has become useful again.

Draconis: brilliant example, too.

Hm…I never thought about portable devices, but with the up-arrow and (maybe less clear to all) ctrl-left/right, you can pick off the word you want to change, so the case of

TAKE TABLE
not portable
OOPS SWORD

Could be vacuumed up here too.

I could see a case made for o1 (word) to replace word #1, o2 for word #2 etc., but I don’t know if it’s worth the coding effort from those who understand the core.

Edited to add: but I was able to disable O (something) in a game, which I’d always wanted to do, so this thread was productive!

[spoiler][code]
“nooops” by Andrew Schultz

room 1 is a room.

Include (-

[ Keyboard a_buffer a_table nw i w w2 x1 x2;
sline1 = score; sline2 = turns;

while (true) {
	! Save the start of the buffer, in case "oops" needs to restore it
	for (i=0 : i<64 : i++) oops_workspace->i = a_buffer->i;

	! In case of an array entry corruption that shouldn't happen, but would be
	! disastrous if it did:
	#Ifdef TARGET_ZCODE;
	a_buffer->0 = INPUT_BUFFER_LEN;
	a_table->0 = 15;  ! Allow to split input into this many words
	#Endif; ! TARGET_

	! Print the prompt, and read in the words and dictionary addresses
	PrintPrompt();
	DrawStatusLine();
	KeyboardPrimitive(a_buffer, a_table);

	! Set nw to the number of words
	#Ifdef TARGET_ZCODE; nw = a_table->1; #Ifnot; nw = a_table-->0; #Endif;

	! If the line was blank, get a fresh line
	if (nw == 0) {
		@push etype; etype = BLANKLINE_PE;
		players_command = 100;
		BeginActivity(PRINTING_A_PARSER_ERROR_ACT);
		if (ForActivity(PRINTING_A_PARSER_ERROR_ACT) == false) L__M(##Miscellany,10);
		EndActivity(PRINTING_A_PARSER_ERROR_ACT);
		@pull etype;
		continue;
	}

	! Unless the opening word was OOPS, return
	! Conveniently, a_table-->1 is the first word on both the Z-machine and Glulx

	w = a_table-->1;
	! Undo handling

	if ((w == UNDO1__WD or UNDO2__WD or UNDO3__WD) && (nw==1)) {
		Perform_Undo();
		continue;
	}
	i = VM_Save_Undo();
	#ifdef PREVENT_UNDO; undo_flag = 0; #endif;
	#ifndef PREVENT_UNDO; undo_flag = 2; #endif;
	if (i == -1) undo_flag = 0;
	if (i == 0) undo_flag = 1;
	if (i == 2) {
		VM_RestoreWindowColours();
		VM_Style(SUBHEADER_VMSTY);
		SL_Location(); print "^";
		! print (name) location, "^";
		VM_Style(NORMAL_VMSTY);
		L__M(##Miscellany, 13);
		continue;
	}
	return nw;
}

];

-) instead of “Reading the Command” in “Parser.i6t”[/code][/spoiler]

Yeah, basically, I just hacked the Reading the Command function that was available.

Not in all interpreters. You can’t do it in Windows Frotz.

What is oops?

You can possibly type:

TAKE JEY

The game replies: “I don’t know that word” (or some such).

You then type

OOPS KEY
(or “O KEY” for short)

And the game corrects your previous input, going “You take the key.”

It’s a relic from the olden days when there were no up-arrows or double-tapping words. It’s also very very nifty in modern days with mobile devices.