I want to remove 'oops'

In a Glulx I7 6G60 project, I wish to eliminate the OOPS function/code. Nobody uses it and it makes a lie of something else I’ve set up where typing ‘O’ should be doing a particular other thing.

I’m already using a hacked version of ‘Reading the Command’ by Victor Gijsbers (it’s part of a scheme to allow hitting Return at a blank prompt to repeat the last command) which I’ll paste below. Thanks:

[code]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;
	if (w == OOPS1__WD or OOPS2__WD or OOPS3__WD) {
		if (oops_from == 0) { L__M(##Miscellany, 14); continue; }
		if (nw == 1) { L__M(##Miscellany, 15); continue; }
		if (nw > 2) { L__M(##Miscellany, 16); continue; }
	
		! So now we know: there was a previous mistake, and the player has
		! attempted to correct a single word of it.
	
		for (i=0 : i<INPUT_BUFFER_LEN : i++) buffer2->i = a_buffer->i;
		#Ifdef TARGET_ZCODE;
		x1 = a_table->9;  ! Start of word following "oops"
		x2 = a_table->8;  ! Length of word following "oops"
		#Ifnot; ! TARGET_GLULX
		x1 = a_table-->6; ! Start of word following "oops"
		x2 = a_table-->5; ! Length of word following "oops"
		#Endif; ! TARGET_
	
		! Repair the buffer to the text that was in it before the "oops"
		! was typed:
		for (i=0 : i<64 : i++) a_buffer->i = oops_workspace->i;
		VM_Tokenise(a_buffer,a_table);
	
		! Work out the position in the buffer of the word to be corrected:
		#Ifdef TARGET_ZCODE;
		w = a_table->(4*oops_from + 1); ! Start of word to go
		w2 = a_table->(4*oops_from);    ! Length of word to go
		#Ifnot; ! TARGET_GLULX
		w = a_table-->(3*oops_from);      ! Start of word to go
		w2 = a_table-->(3*oops_from - 1); ! Length of word to go
		#Endif; ! TARGET_
	
		! Write spaces over the word to be corrected:
		for (i=0 : i<w2 : i++) a_buffer->(i+w) = ' ';
	
		if (w2 < x2) {
			! If the replacement is longer than the original, move up...
			for (i=INPUT_BUFFER_LEN-1 : i>=w+x2 : i-- )
				a_buffer->i = a_buffer->(i-x2+w2);

			! ...increasing buffer size accordingly.
			#Ifdef TARGET_ZCODE;
			a_buffer->1 = (a_buffer->1) + (x2-w2);
			#Ifnot; ! TARGET_GLULX
			a_buffer-->0 = (a_buffer-->0) + (x2-w2);
			#Endif; ! TARGET_
		}
	
		! Write the correction in:
		for (i=0 : i<x2 : i++) a_buffer->(i+w) = buffer2->(i+x1);
	
		VM_Tokenise(a_buffer, a_table);
		#Ifdef TARGET_ZCODE; nw = a_table->1; #Ifnot; nw = a_table-->0; #Endif;
	
		return nw;
	}

	! 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]

1 Like

The easiest way to do this is to modify the part of the library that define the oops words:

Constant OOPS1__WD      = ',nonoops';
Constant OOPS2__WD      = ',nonoops';
Constant OOPS3__WD      = ',nonoops';

This is in Language.i6t, “Vocabulary”. (At least that’s where it is in 6L38, and I think it hasn’t moved since 6G60.)

1 Like

I use it. For what it’s worth. Hardly ever - very rarely - but sometimes when typing a long command in iFrotz, or when asked to disambiguate, it can be a real time-saver.

I’m not saying you shouldn’t get rid of it if you need the shortcut - the only command less used in Inform I can think of is “verify”, which is probably no longer in Inform anyway. Just saying that “nobody uses it” isn’t quite true.

1 Like

Thanks Zarf. That worked great.

I wasn’t being literal, but I was being prejudicial :slight_smile:

I ran a poll (last year?) asking about who used oops, or if people even knew what it was. I think there was maybe 1 person who said they used it frequently.

I wouldn’t bother to axe it in my own game unless I really want the letter O for something else, which I do in this case.

VERSION is still in Inform. I like to stick in a cute (but still truthful) response for it in a game, if the game is cute.

-Wade

1 Like

I remember that poll. It was very useful because that’s where I found out that OOPS could be used in disambiguation questions, which is how I mostly use it. :slight_smile:

1 Like

You could also define OOPS2__WD as ‘oops’, like the others, removing the ‘o’ abbreviation but leaving the functionality intact.

1 Like

Thanks Draconis. I ended up doing that.

-Wade