Copy to Clipboard Test

Better F6 Code

//F6 script start----

//to change colors, modify the 2 characters after the "0x". use the table under Quest->Graphics->Misc Colors for reference.
const int BetterF6_ColorBG = 0x0F; //background color (usually black)
const int BetterF6_ColorText1 = 0x01; //unselected text color
const int BetterF6_ColorText2 = 0x14; //selected text color
const int BetterF6_Font = FONT_Z1;
const int BetterF6_SFXChange = 5; //sfx for changing selection
const int BetterF6_SFXConfirm = 0; //sfx for confirming selection
const bool BetterF6_NoSubscreenDisable = false; //wether you want F6 disabled in "No Subscreen" screens. set to true or false.
const int BetterF6_ScreenFlagDisable = 0; //which number of General Use (Script) screen data flag disables F6. 0 for none of them.

global script BetterF6{
	void run(){
		//force "skip continue screen" QR
		Game->FFRules[qr_NOCONTINUE] = true;
		//conditional F6 disable on No Subscreen screens
		if ( BetterF6_NoSubscreenDisable && ScreenFlag(SF_VIEW, SFV_NOSUBSCREEN) > 1 )
			Quit();
		//conditional F6 disable with General Use (Script) screen data flag
		if ( BetterF6_ScreenFlagDisable != 0 && ScreenFlag(SF_MISC, SFM_SCRIPT1+BetterF6_ScreenFlagDisable-1) > 1 )
			Quit();
		BetterF6Active(true);
	}
}

link script onDeath{
	void run(){
		//force "onDeath runs after death anim" QR
		if ( !Game->FFRules[qr_ONDEATH_RUNS_AFTER_DEATH_ANIM] ) {
			Game->FFRules[qr_ONDEATH_RUNS_AFTER_DEATH_ANIM] = true;
			Quit();
		}
		BetterF6Active(false);
	}
}

void BetterF6Active(bool CanCancel) {
	bool Options[10];
	
	//declare list, and strings
	enum {
		Option_Continue,
		Option_SaveAndContinue,
		Option_SaveAndQuit,
		Option_Quit,
		Option_Cancel
	};
	const int String0[] = "Continue";
	const int String1[] = "Save & Continue";
	const int String2[] = "Save & Quit";
	const int String3[] = "Quit";
	const int String4[] = "Cancel";
	const int String5[] = "";
	const int String6[] = "";
	const int String7[] = "";
	const int String8[] = "";
	const int String9[] = "";
	
	//put string pointers into an array
	int str[10];
	str[0] = String0;
	str[1] = String1;
	str[2] = String2;
	str[3] = String3;
	str[4] = String4;
	str[5] = String5;
	str[6] = String6;
	str[7] = String7;
	str[8] = String8;
	str[9] = String9;
	
	//declare which options should give confirmation prompt
	bool Confirmation[10];
	Confirmation[Option_Quit] = true;
	
	//determine which options to show
	Options[Option_Continue] = true;
	if ( !Game->FFRules[qr_NOSAVE] ) {
		Options[Option_SaveAndContinue] = true;
		Options[Option_SaveAndQuit] = true;
	}
	Options[Option_Quit] = true;
	if ( CanCancel )
		Options[Option_Cancel] = true;
	
	//create the actual options array and fill it
	int ScreenOptions[10];
	int NumOptions;
	for(int i = 0; i < 10; ++i){
		if ( Options[i] ) {
			ScreenOptions[NumOptions] = i;
			NumOptions ++;
		}
	}
	
	//determine Y center
	int YCenter = 60;
	if ( ScreenFlag(SF_VIEW, SFV_NOSUBSCREEN) > 1 && ScreenFlag(SF_VIEW, SFV_NOOFFSET) == 0 )
		YCenter += 28;
	
	//calculate Y positions
	int YPositions[10];
	const int FontHeight = Text->FontHeight(BetterF6_Font);
	const int GapSize = FontHeight * 1.25;
	for(int i = 0; i < NumOptions; ++i){
		YPositions[i] = YCenter - FontHeight/2 - (NumOptions*FontHeight + (NumOptions-1)*GapSize) / 2 + i*FontHeight + i*GapSize;
	}
	
	int SelectedOption;
	int Chosen;
	bool Blinking;
	int BlinkingFrame;
	while(true){
		Screen->Rectangle(0, 0, -56, 256, 176, BetterF6_ColorBG, 1, 0, 0, 0, true, OP_OPAQUE);
		
		//change selection
		if ( NumOptions > 0 && Chosen == 0 ) {
			if ( Link->PressUp ) {
				Game->PlaySound(BetterF6_SFXChange);
				SelectedOption --;
				if ( SelectedOption < 0 )
					SelectedOption = NumOptions-1;
			}
			if ( Link->PressDown ) {
				Game->PlaySound(BetterF6_SFXChange);
				SelectedOption ++;
				if ( SelectedOption > NumOptions-1 )
					SelectedOption = 0;
			}
		}
		
		//make selection
		if ( Chosen == 0 && Link->PressStart ) {
			Game->PlaySound(BetterF6_SFXConfirm);
			Chosen = 1;
		}
		if ( Chosen > 0 ) {
			if ( Chosen > 50 ) {
				if ( Confirmation[ScreenOptions[SelectedOption]] ) {
					int strpass[1000];
					strcat(strpass, str[ScreenOptions[SelectedOption]]);
					if ( F6Confirmation(strpass) )
						break;
				}
				else
					break;
				Chosen = 0;
				Blinking = false;
				BlinkingFrame = 0;
			}
			else
				Chosen ++;
		}
		
		//draw strings
		for(int i = 0; i < NumOptions; ++i){
			int color = BetterF6_ColorText1;
			if ( SelectedOption == i )
				color = BetterF6_ColorText2;
			else if ( Chosen > 0 )
				continue;
			
			if ( Chosen > 0 ) {
				if ( BlinkingFrame > 4 ) {
					BlinkingFrame = 0;
					Blinking = !Blinking;
				}
				else
					BlinkingFrame ++;
				if ( !Blinking )
					color = BetterF6_ColorText1;
				else
					color = BetterF6_ColorText2;
			}
			
			Screen->DrawString(0, 128, YPositions[i], BetterF6_Font, color, -1, TF_CENTERED, str[ScreenOptions[i]], OP_OPAQUE);
		}
		Waitframe();
	}
	
	//force "skip continue screen" QR
	Game->FFRules[qr_NOCONTINUE] = true;
	
	//now what to do?
	if ( ScreenOptions[SelectedOption] == Option_Continue ) {
		Game->Continue();
	}
	if ( ScreenOptions[SelectedOption] == Option_SaveAndContinue ) {
		Game->SaveAndContinue();
	}
	if ( ScreenOptions[SelectedOption] == Option_SaveAndQuit ) {
		Game->SaveAndQuit();
	}
	if ( ScreenOptions[SelectedOption] == Option_Quit ) {
		Game->End();
	}
}

bool F6Confirmation(int str){
	//determine Y center
	int YCenter = 60;
	if ( ScreenFlag(SF_VIEW, SFV_NOSUBSCREEN) > 1 && ScreenFlag(SF_VIEW, SFV_NOOFFSET) == 0 )
		YCenter += 28;
	
	const int FontHeight = Text->FontHeight(BetterF6_Font);
	bool SelectedYes;
	int Chosen;
	bool Blinking;
	int BlinkingFrame;
	while(true){
		Screen->Rectangle(0, 0, -56, 256, 176, BetterF6_ColorBG, 1, 0, 0, 0, true, OP_OPAQUE);
		
		//change selection
		if ( Chosen == 0 ) {
			if ( Link->PressLeft || Link->PressRight ) {
				Game->PlaySound(BetterF6_SFXChange);
				SelectedYes = !SelectedYes;
			}
		}
		
		//make selection
		if ( Chosen == 0 && Link->PressStart ) {
			Game->PlaySound(BetterF6_SFXConfirm);
			Chosen = 1;
		}
		if ( Chosen > 0 ) {
			if ( Chosen > 25 )
				break;
			Chosen ++;
		}
		
		//draw confirmation
		int Confirmation[1000];
		strcat(Confirmation, "Confirm ");
		strcat(Confirmation, str);
		strcat(Confirmation, "?");
		Screen->DrawString(0, 128, YCenter-12 - FontHeight/2, BetterF6_Font, BetterF6_ColorText1, -1, TF_CENTERED, Confirmation, OP_OPAQUE);
		
		//draw yes no
		for(int i = 0; i < 2; ++i){
			int color = BetterF6_ColorText1;
			if ( i == 0 && SelectedYes || i == 1 && !SelectedYes )
				color = BetterF6_ColorText2;
			else if ( Chosen > 0 )
				continue;
			
			if ( Chosen > 0 ) {
				if ( BlinkingFrame > 4 ) {
					BlinkingFrame = 0;
					Blinking = !Blinking;
				}
				else
					BlinkingFrame ++;
				if ( !Blinking )
					color = BetterF6_ColorText1;
				else
					color = BetterF6_ColorText2;
			}
			
			if ( i == 0 )
				Screen->DrawString(0, 128-24, YCenter+12 - FontHeight/2, BetterF6_Font, color, -1, TF_CENTERED, "Yes", OP_OPAQUE);
			else
				Screen->DrawString(0, 128+24, YCenter+12 - FontHeight/2, BetterF6_Font, color, -1, TF_CENTERED, "No", OP_OPAQUE);
		}
		Waitframe();
	}
	return SelectedYes;
}

//----F6 script end