//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