ZoriaRPG icon

2.55 New Script Types: Test Scripts

ZoriaRPG | PRO | 12/23/18 09:47:55 AM UTC | 0 ⭐ | 807 👁️ | Never ⏰ | []
C++ |

25.51 KB

|

None

|

0 👍

/

0 👎

import "std.zh"
 
dmapdata script dmapscript
{
    void run()
    {
        int f;
        while(1)
        {
            ++f; 
            if (!(f%180)) 
            { 
                TraceS("Dmap Script Before Waitdraw()"); TraceNL();
                
            }
            Waitdraw(); 
            if (!(f%180))
            { 
                TraceS("Dmap Script After Waitdraw()"); TraceNL();
                
            }
            Waitframe();
        }
 
    }
}
 
screendata script sd1
{
void run(){}
}
 
link script link_init1
{
    void run()
    {
        TraceS("Running Link Init Script"); TraceNL();
        Link->X = 100;
        Link->Y = 60;
    }
}
 
link script link_active
{
    void run()
    {
        while(1)
        {
            //TraceS("Link Active Script Running"); TraceNL();
            if ( Input->ReadKey[KEY_T] ) { ++Link->X; }
            Waitframe();
        }
    }
}
 
npc script noanim
{
    void run()
    {
        Trace(this->Animation);
        this->Animation = false;
        TraceB(this->Animation);
        this->Tile = 11728;
    }
}
 
eweapon script E2
{
    void run(){}
}
 
eweapon script E
{
    void run(int pow)
    {
        //TraceS("eweapon script E: this: "); Trace(this); TraceNL();
        TraceS("InitD[0] is: "); Trace(pow); TraceNL();
        int f;
        Trace(this->ID);
        while(this->isValid())
        {
TraceS("EWeapon Script Running"); TraceNL();
            ++f;
            if ( !(f%10) ) 
            {
                this->Dir = Rand(0,3);
                TraceS("EWeapon Script Running"); TraceNL();
            }
            if ( !(this->isValid()) ) Quit();
            Waitframe();
        
        }
    }
}
 
lweapon script L
{
    void run() 
    { 
        TraceS("Script L: this: "); Trace(this); TraceNL();
        int f = 0;
        while(this->isValid())
        {
             
            ++f;
            if ( !(f%10) ) 
            {
                this->Dir = Rand(0,3);
                TraceS("LWeapon Script Running"); TraceNL();
            }
            if ( !(this->isValid()) ) Quit();
            Waitframe();
        
        }
    }
}
 
lweapon script sword
{
    void run()
    {
        TraceS("Script sword: this: "); Trace(this); TraceNL();
        Trace(this->ID);
        while(this->isValid())
        {
            //this->X += 10;
            TraceS("LWeapon Script Running"); TraceNL();
            Waitframe();
        }
    }
}
 
lweapon script beam
{
    void run()
    {
        //TraceS("Script beam: this: "); Trace(this); TraceNL();
        int f;
        Trace(this->ID);
        while(this->isValid())
        {
            ++f;
            if ( !(f%10) ) 
            {
                this->Dir = Rand(0,3);
                //TraceS("LWeapon Script Running"); TraceNL();
            }
            if ( !(this->isValid()) ) Quit();
            Waitframe();
        
        }
    }
}
 
lweapon script bait
{
    void run(int pow)
    {
        TraceS("Script bait: this: "); Trace(this); TraceNL();
        TraceS("Bait InitD[0] is: "); Trace(pow); TraceNL();
        int f = 0; int dir = Rand(0,3); int step = 2;
        while(this->isValid())
        {
            ++f; if (!(f%6)) { dir = Rand(0,3); step = Rand(2,6); }
            switch(dir)
            {
                case DIR_UP: this->Y -= step; break;
                case DIR_DOWN: this->Y += step; break;
                case DIR_LEFT: this->X -= step; break;
                case DIR_RIGHT: this->X += step; break;
                default: break;
            }
            if ( !(this->isValid()) ) Quit();
            Waitframe();
        }
    }
}       
 
global script ab
{
    void run()
    {
        
        dmapdata dd = Game->LoadDMapData(0);
        int mp = dd->Map;
        mapdata md = Game->LoadMapData(mp, 0);
        while(1)
        {
            for ( int q = Screen->NumLWeapons(); q > 0; --q )
            {
                lweapon l = Screen->LoadLWeapon(q);
                if ( l->ID == LW_SCRIPT1 ) 
                {
                    //TraceS("Found LW_SCRIPT1"); TraceNL();
                }
            }
            if ( Input->ReadKey[KEY_Y] )
            {
                
                for ( int q = 0; q < 176; ++q )
                {
                    LogPrint("Mapdata->ComboD[%d] is: %d \n", q, md->ComboD[q]);
                    LogPrint("Mapdata->ComboT[%d] is: %d \n", q, md->ComboT[q]);
                    LogPrint("Mapdata->ComboC[%d] is: %d \n", q, md->ComboC[q]);
                    LogPrint("Mapdata->ComboS[%d] is: %d \n", q, md->ComboS[q]);
                    LogPrint("Mapdata->ComboF[%d] is: %d \n", q, md->ComboF[q]);
                    LogPrint("Mapdata->ComboI[%d] is: %d \n", q, md->ComboI[q]);
                }
            }
            if ( Input->ReadKey[KEY_I] )
            {
                LogPrint("Getting mapdata combo information with GetCurScreen()%s \n", " ");
                mapdata mdm = Game->LoadMapData(mp, Game->GetCurScreen());
                for ( int q = 0; q < 176; ++q )
                {
                    LogPrint("Mapdata->ComboD[ %d ] is: %d \n", q, mdm->ComboD[q]);
                    LogPrint("Mapdata->ComboT[ %d ] is: %d \n", q, mdm->ComboT[q]);
                    LogPrint("Mapdata->ComboC[ %d ] is: %d \n", q, mdm->ComboC[q]);
                    LogPrint("Mapdata->ComboS[ %d ] is: %d \n", q, mdm->ComboS[q]);
                    LogPrint("Mapdata->ComboF[ %d ] is: %d \n", q, mdm->ComboF[q]);
                    LogPrint("Mapdata->ComboI[ %d ] is: %d \n", q, mdm->ComboI[q]);
                }
            }
            if ( Input->ReadKey[KEY_U] )
            {
                md->ComboD[0] = 100;
                md->ComboF[0] = 15;
                md->ComboT[0] = 2;
            }
            Waitframe();
        }
    }
}
 
lweapon script readcombos
{
    void run()
    {
        
        dmapdata dd = Game->LoadDMapData(0);
        int mp = dd->Map;
        mapdata md = Game->LoadMapData(mp, 0);
        while(this->isValid())
        {
            
            if ( Input->ReadKey[KEY_Y] )
            {
                
                for ( int q = 0; q < 176; ++q )
                {
                    LogPrint("Mapdata->ComboD[%d] is: %d \n", q, md->ComboD[q]);
                    LogPrint("Mapdata->ComboT[%d] is: %d \n", q, md->ComboT[q]);
                    LogPrint("Mapdata->ComboC[%d] is: %d \n", q, md->ComboC[q]);
                    LogPrint("Mapdata->ComboS[%d] is: %d \n", q, md->ComboS[q]);
                    LogPrint("Mapdata->ComboF[%d] is: %d \n", q, md->ComboF[q]);
                    LogPrint("Mapdata->ComboI[%d] is: %d \n", q, md->ComboI[q]);
                }
            }
            if ( Input->ReadKey[KEY_I] )
            {
                LogPrint("Getting mapdata combo information with GetCurScreen()%s \n", " ");
                mapdata mdm = Game->LoadMapData(mp, Game->GetCurScreen());
                for ( int q = 0; q < 176; ++q )
                {
                    LogPrint("Mapdata->ComboD[ %d ] is: %d \n", q, mdm->ComboD[q]);
                    LogPrint("Mapdata->ComboT[ %d ] is: %d \n", q, mdm->ComboT[q]);
                    LogPrint("Mapdata->ComboC[ %d ] is: %d \n", q, mdm->ComboC[q]);
                    LogPrint("Mapdata->ComboS[ %d ] is: %d \n", q, mdm->ComboS[q]);
                    LogPrint("Mapdata->ComboF[ %d ] is: %d \n", q, mdm->ComboF[q]);
                    LogPrint("Mapdata->ComboI[ %d ] is: %d \n", q, mdm->ComboI[q]);
                }
            }
            if ( Input->ReadKey[KEY_U] )
            {
                md->ComboD[0] = 100;
                md->ComboF[0] = 15;
                md->ComboT[0] = 2;
            }
            Waitframe();
        }
    }
}
 
 
lweapon script comboat
{
    void run()
    {
        while(this->isValid())
        {
            mapdata mps = Game->LoadMapData(Game->GetCurMap(), Game->GetCurScreen());
            LogPrint("Mapdata->ComboD[] at this lweapon location is: %d \n", mps->ComboD[ComboAt(this->X, this->Y)]);
            Waitframe();
        }
    }
}
 
 
link script onWin
{
    void run()
    {
        int q;
        while(1)
        {
            ++q;
            Trace(q);
            if ( q > 100 ) Quit();
            Waitframe();
        }
    }
}
 
///////////////////////////////////////
/// Custom Game Over and F6 Screens ///
/// v1.4 for ZC 2.55                ///
/// 24th October, 2018              ///
/// By: ZoriaRPG                    ///
///////////////////////////////////////
 
//v1.4 : Added CONTINUE option to both screens. The user can enable or disable this. 
 
typedef const int define;
typedef const int config;
 
define ON = 1;
define OFF = 0;
define YES = 1;
define NO = 0;
 
script typedef ffc namespace;
 
namespace script F6
{
define SELECTION_SAVE = 1;
define SELECTION_RETRY = 2;
define SELECTION_CANCEL = 3;
define SELECTION_CONTINUE = 4;
define CONTINUE_HP = 16*3;
define CONTINUE_MP = 32*3;
 
config ALLOW_F6_CONTINUE = YES;
    
config F6MIDI = -3;
    
    void run(){}
    const int FREEZE = 504; //Freeze Combo
    void freeze(int state)
    {
        ffc f = Screen->LoadFFC(32);
        if ( state ) f->Data = FREEZE;
        else f->Data = 0;
    }
        
    //if ( F6.press() ) { F6.optiona(); }
    bool press()
    {
        TraceS("User pressed F6"); TraceNL();
        if ( Input->ReadKey[46+6] ) return true;
        return false;
    }
    void draw(bool ALLOW_F6_CONTINUE) 
    { 
        gameover.draw(true, ALLOW_F6_CONTINUE); 
    }
    int choice(bool ALLOW_F6_CONTINUE) 
    { 
        return gameover.get_choice(ALLOW_F6_CONTINUE); 
    }
    
    void options()
    {
        Game->DisableActiveSubscreen = true;
        freeze(ON);
        int oldmidi = Game->GetMIDI();
        Game->PlayMIDI(F6MIDI);
        while(menu(CONTINUE_HP, YES, CONTINUE_MP, YES)) 
        {
            draw(true);
            Waitdraw();
            Waitframe();
        }
        Game->PlayMIDI(oldmidi);
        freeze(OFF);
        
        Link->PressStart = false; Link->InputStart = false;
        
    }
    //for HP, 0 will preserve Link's HP before continuing. For MAGIC, use -1 to do this. 
    bool menu(int cont_hp, bool hp_is_percent, int cont_mp, bool mp_is_percent)
    {
        int sel = choice(true);
        switch(sel)
        {
            case SELECTION_SAVE:
            {
                Game->Save(); return false;
            }
            case SELECTION_RETRY: 
            {
                freeze(OFF);
                Game->End(); return false;
            }
            case SELECTION_CONTINUE: 
            {
                freeze(OFF);
                return do_continue(cont_hp, hp_is_percent, cont_mp, mp_is_percent);
            }
            case SELECTION_CANCEL: 
            {
                return false;
            }
        }
        return true;
    }
    bool do_continue(int hp, bool hp_percent, int mp, bool mp_percent)
    {
        //int entrancedmap = Game->LastEntranceDMap;
        //Replace with WarpEx()
        //Link->Warp(Game->GetCurDMap(), Game->DMapContinue[Game->GetCurDMap()]); 
        Link->Warp(Game->LastEntranceDMap, Game->LastEntranceScreen); 
        if ( hp > 0 ) Link->HP = ( Cond(hp_percent, Link->MaxHP*(hp/100), hp) );
        if ( mp > -1 ) Link->MP = ( Cond(mp_percent, Link->MaxMP*(mp/100), hp) );
        Link->Dir = DIR_DOWN;
        Link->Action = LA_NONE;
        return false;
    }
    
}
 
namespace script gameover
{
 
config ALLOW_DEATH_CONTINUE = YES; 
 
    // Sounds and MIDIs
config SFX_WINKOUT          = 38; //Sound to play during wink-out animation.
config SFX_LINKDEATH            = 28; //Sound to play when Link dies.
config SFX_GAMEOVERSCREEN_CURSOR    = 6;  //Sound to play when the player moves the game over cursor.
config SFX_GAMEOVERSCREEN_SELECTION     = 44; //Sound to play when the user selects a game over menu option.
config MIDI_GAMEOVER            = -4; //MIDI to play on Game Over screen.
    //Defaults: -3 is the internal Game Over, -2 is Level 9, -1 is Overworld
 
// Sprites (Weapons/Misc)
config SPR_DEATH        = 88; //Sprite of Link Spinning
config SPR_DEATH_WINKOUT    = 89; //Sprite of wink-out
// Sprite Timing
config END_DEATH_SPIN       = 40; //Frames to display death spin animation.
config END_WINKOUT      = 10; //Frames to display wink-out animation.
 
// Other Graphics and Colours
config TILE_SAVECURSOR      = 20;
config TILE_SAVECURSOR_CSET     = 1;    //CSet for minitile cursor. 
config BLACK            = 0x0F; //Black in the current palette
config RED          = 0x93; //Red in the current palette
config WHITE            = 0x01; //White in the current palette
 
// Menu Object Positions and Settings
config DONT_SAVE_X      = 102; //X position of the RETRY string.
config SAVE_X           = 102; //X position of the SAVE string.
config DONT_SAVE_Y      = 68;  //Y position of the RETRY string.
config CANCEL_Y         = 68+14;  //Y position of the CANCEL string.
config CONTINUE_Y       = 68+28;  //Y position of the CONTINUE string.
config SAVE_Y           = 54;  //X position of the SAVE string.
config CURSOR_OFFSET        = 26;  //X offset of the cursor from the text. 
 
//Global Variables and Arrays
 
//Indices for values[]
define MENU_SEL_STATE       = 0; //The current selected menu option. 
define MENU_SEL_POS_X       = 1; //Stores where to draw menu selector.
define MENU_SEL_POS_Y       = 2; //Stores where to draw menu selector.
define DEATH_LX         = 3; //Cache of Link's last X position before death.
define DEATH_LY         = 4; //Cache of Link's last Y position before death.
define DEATHFRAME       = 5; //Timer for death animations. 
define QUIT             = 6; //The game 'QUIT' type, SAVE or RETRY
 
//gameover.QUIT Types
define quitSAVE         = 1;
define quitRETRY        = 2;
define quitCONTINUE         = 4;
 
//Menu Selection types
define SELECTION_SAVE       = 1;
define SELECTION_RETRY      = 2;
define SELECTION_CANCEL     = 3;
define SELECTION_CONTINUE   = 4;
 
    int values[8] = {1,SAVE_Y,DONT_SAVE_Y, 0,0};
    void run(){}
    bool check()
    {
        if ( Link->HP < 1 ) 
        {
            Link->HP = 1;
            Link->Invisible = true;
            Link->CollDetection = false;
            values[DEATH_LX] = Link->X;
            values[DEATH_LY] = Link->Y;
            return true;
        }
        return false;
    }
    void clean_up()
    {
        int q;
        if ( Screen->NumNPCs() )
        {
            for ( q = Screen->NumNPCs(); q > 0; --q ) 
            { 
                npc n = Screen->LoadNPC(q); Remove(n); 
            }
        }
        if ( Screen->NumLWeapons() )
        {
            for ( q = Screen->NumLWeapons(); q > 0; --q ) 
            { lweapon n = Screen->LoadLWeapon(q); Remove(n); }
        }
        if ( Screen->NumEWeapons() )
        {
            for ( q = Screen->NumEWeapons(); q > 0; --q ) 
            { eweapon n = Screen->LoadEWeapon(q); Remove(n); }
        }
        if ( Screen->NumItems() )
        {
            for ( q = Screen->NumItems(); q > 0; --q ) 
            { item n = Screen->LoadItem(q); Remove(n); }
        }
        //clear all ffcs
        for ( q = 1; q < 33; ++q )
        {
            ffc f = Screen->LoadFFC(q);
            f->Data = 0; f->Script = 0;
        }
    }
    void draw(bool cancel, bool can_continue)
    {
        //Draw black background with Rectangle()
        Screen->Rectangle(5,0,0,256,256,BLACK,100, 0,0,0,true,128);
        if ( !cancel )
        {
            if ( !can_continue ) 
            {
                switch ( values[MENU_SEL_STATE] )
                {
                    case SELECTION_SAVE:
                    {
                        //int ss1[]="Drawing cursor and text.";
                        //TraceS(ss1);
                        Screen->FastTile(6,SAVE_X-CURSOR_OFFSET, SAVE_Y, TILE_SAVECURSOR, TILE_SAVECURSOR_CSET,128); 
                        //draw strings, red for selected
                        Screen->DrawString(6,SAVE_X,SAVE_Y,0,RED, -1,0,"SAVE",128);
                        Screen->DrawString(6,DONT_SAVE_X,DONT_SAVE_Y,0,WHITE, -1,0,"RETRY",128);
                        break;
                    }
                    case SELECTION_RETRY:
                    {
                        //Draw cursor
                        Screen->FastTile(6,DONT_SAVE_X-CURSOR_OFFSET, DONT_SAVE_Y, TILE_SAVECURSOR, TILE_SAVECURSOR_CSET,128); 
                        //draw strings, red for selected
                        Screen->DrawString(6,SAVE_X,SAVE_Y,0,WHITE, -1,0,"SAVE",128);
                        Screen->DrawString(6,DONT_SAVE_X,DONT_SAVE_Y,0,RED, -1,0,"RETRY",128);
                        break;
                    }
                    default: break;
                }
            }
            else
            {
                switch ( values[MENU_SEL_STATE] )
                {
                    case SELECTION_SAVE:
                    {
                        //int ss1[]="Drawing cursor and text.";
                        //TraceS(ss1);
                        Screen->FastTile(6,SAVE_X-CURSOR_OFFSET, SAVE_Y, TILE_SAVECURSOR, TILE_SAVECURSOR_CSET,128); 
                        //draw strings, red for selected
                        Screen->DrawString(6,SAVE_X,SAVE_Y,0,RED, -1,0,"SAVE",128);
                        Screen->DrawString(6,DONT_SAVE_X,DONT_SAVE_Y,0,WHITE, -1,0,"CONTINUE",128);
                        Screen->DrawString(6,DONT_SAVE_X,CANCEL_Y,0,WHITE, -1,0,"RETRY",128);
                        break;
                    }
                    case SELECTION_CONTINUE:
                    {
                        //int ss1[]="Drawing cursor and text.";
                        //TraceS(ss1);
                        Screen->FastTile(6,SAVE_X-CURSOR_OFFSET, DONT_SAVE_Y, TILE_SAVECURSOR, TILE_SAVECURSOR_CSET,128); 
                        //draw strings, red for selected
                        Screen->DrawString(6,SAVE_X,SAVE_Y,0,RED, -1,0,"SAVE",128);
                        Screen->DrawString(6,DONT_SAVE_X,DONT_SAVE_Y,0,WHITE, -1,0,"CONTINUE",128);
                        Screen->DrawString(6,DONT_SAVE_X,CANCEL_Y,0,WHITE, -1,0,"RETRY",128);
                        break;
                    }
                    case SELECTION_RETRY:
                    {
                        //Draw cursor
                        Screen->FastTile(6,DONT_SAVE_X-CURSOR_OFFSET, CANCEL_Y, TILE_SAVECURSOR, TILE_SAVECURSOR_CSET,128); 
                        //draw strings, red for selected
                        Screen->DrawString(6,SAVE_X,SAVE_Y,0,WHITE, -1,0,"SAVE",128);
                        Screen->DrawString(6,DONT_SAVE_X,DONT_SAVE_Y,0,WHITE, -1,0,"CONTINUE",128);
                        Screen->DrawString(6,DONT_SAVE_X,CANCEL_Y,0,RED, -1,0,"RETRY",128);
                        break;
                    }
                    default: break;
                }
            
            
            
            }
        }
        else
        {
            if ( !can_continue )
            {
                switch(values[MENU_SEL_STATE])
                {
                    
                    
                    case SELECTION_SAVE:
                    {
                        //int ss1[]="Drawing cursor and text.";
                        //TraceS(ss1);
                        Screen->FastTile(6,SAVE_X-CURSOR_OFFSET, SAVE_Y, TILE_SAVECURSOR, TILE_SAVECURSOR_CSET,128); 
                        //draw strings, red for selected
                        Screen->DrawString(6,SAVE_X,SAVE_Y,0,RED, -1,0,"SAVE",128);
                        Screen->DrawString(6,DONT_SAVE_X,DONT_SAVE_Y,0,WHITE, -1,0,"RETRY",128);
                        Screen->DrawString(6,DONT_SAVE_X,CANCEL_Y,0,WHITE, -1,0,"CANCEL",128);
                        break;
                    }
                    case SELECTION_RETRY:
                    {
                        //Draw cursor
                        Screen->FastTile(6,DONT_SAVE_X-CURSOR_OFFSET, DONT_SAVE_Y, TILE_SAVECURSOR, TILE_SAVECURSOR_CSET,128); 
                        //draw strings, red for selected
                        Screen->DrawString(6,SAVE_X,SAVE_Y,0,WHITE, -1,0,"SAVE",128);
                        Screen->DrawString(6,DONT_SAVE_X,DONT_SAVE_Y,0,RED, -1,0,"RETRY",128);
                        Screen->DrawString(6,DONT_SAVE_X,CANCEL_Y,0,WHITE, -1,0,"CANCEL",128);
                        break;
                    }
                    case SELECTION_CANCEL:
                    {
                        //Draw cursor
                        Screen->FastTile(6,DONT_SAVE_X-CURSOR_OFFSET, CANCEL_Y, TILE_SAVECURSOR, TILE_SAVECURSOR_CSET,128); 
                        //draw strings, red for selected
                        Screen->DrawString(6,SAVE_X,SAVE_Y,0,WHITE, -1,0,"SAVE",128);
                        Screen->DrawString(6,DONT_SAVE_X,DONT_SAVE_Y,0,WHITE, -1,0,"RETRY",128);
                        Screen->DrawString(6,DONT_SAVE_X,CANCEL_Y,0,RED, -1,0,"CANCEL",128);
                        break;
                    }
                    default: break;
                    
                }
            }
            else //allow F6 continue
            {
                switch(values[MENU_SEL_STATE])
                {
                    
                    //I'm reusing the positional defines for cancel and continue, and transposing them
                    //to reorder the list. -Z
                    
                    //I should rename these to LIST_1_Y, LIST_2_Y, and so forth. 
                    case SELECTION_SAVE:
                    {
                        //int ss1[]="Drawing cursor and text.";
                        //TraceS(ss1);
                        Screen->FastTile(6,SAVE_X-CURSOR_OFFSET, SAVE_Y, TILE_SAVECURSOR, TILE_SAVECURSOR_CSET,128); 
                        //draw strings, red for selected
                        Screen->DrawString(6,SAVE_X,SAVE_Y,0,RED, -1,0,"SAVE",128);
                        Screen->DrawString(6,DONT_SAVE_X,DONT_SAVE_Y,0,WHITE, -1,0,"RETRY",128);
                        Screen->DrawString(6,DONT_SAVE_X,CONTINUE_Y,0,WHITE, -1,0,"CANCEL",128);
                        Screen->DrawString(6,DONT_SAVE_X,CANCEL_Y,0,WHITE, -1,0,"CONTINUE",128);
                        break;
                    }
                    case SELECTION_RETRY:
                    {
                        //Draw cursor
                        Screen->FastTile(6,DONT_SAVE_X-CURSOR_OFFSET, DONT_SAVE_Y, TILE_SAVECURSOR, TILE_SAVECURSOR_CSET,128); 
                        //draw strings, red for selected
                        Screen->DrawString(6,SAVE_X,SAVE_Y,0,WHITE, -1,0,"SAVE",128);
                        Screen->DrawString(6,DONT_SAVE_X,DONT_SAVE_Y,0,RED, -1,0,"RETRY",128);
                        Screen->DrawString(6,DONT_SAVE_X,CONTINUE_Y,0,WHITE, -1,0,"CANCEL",128);
                        Screen->DrawString(6,DONT_SAVE_X,CANCEL_Y,0,WHITE, -1,0,"CONTINUE",128);
                        break;
                    }
                    case SELECTION_CANCEL:
                    {
                        //Draw cursor
                        Screen->FastTile(6,DONT_SAVE_X-CURSOR_OFFSET, CANCEL_Y, TILE_SAVECURSOR, TILE_SAVECURSOR_CSET,128); 
                        //draw strings, red for selected
                        Screen->DrawString(6,SAVE_X,SAVE_Y,0,WHITE, -1,0,"SAVE",128);
                        Screen->DrawString(6,DONT_SAVE_X,DONT_SAVE_Y,0,WHITE, -1,0,"RETRY",128);
                        Screen->DrawString(6,DONT_SAVE_X,CONTINUE_Y,0,RED, -1,0,"CANCEL",128);
                        Screen->DrawString(6,DONT_SAVE_X,CANCEL_Y,0,WHITE, -1,0,"CONTINUE",128);
                        break;
                    }
                    case SELECTION_CONTINUE:
                    {
                        //Draw cursor
                        Screen->FastTile(6,DONT_SAVE_X-CURSOR_OFFSET, CONTINUE_Y, TILE_SAVECURSOR, TILE_SAVECURSOR_CSET,128); 
                        //draw strings, red for selected
                        Screen->DrawString(6,SAVE_X,SAVE_Y,0,WHITE, -1,0,"SAVE",128);
                        Screen->DrawString(6,DONT_SAVE_X,DONT_SAVE_Y,0,WHITE, -1,0,"RETRY",128);
                        Screen->DrawString(6,DONT_SAVE_X,CONTINUE_Y,0,WHITE, -1,0,"CANCEL",128);
                        Screen->DrawString(6,DONT_SAVE_X,CANCEL_Y,0,RED, -1,0,"CONTINUE",128);
                        break;
                    }
                    default: break;
                    
                }
            }
            
        }
    }
    bool choice(bool can_continue)
    {
        if ( !can_continue )
        {
            if ( Link->PressDown ) // || Link->PressUp )
            {
                switch(values[MENU_SEL_STATE])
                {
                    case SELECTION_SAVE: //save
                        ++values[MENU_SEL_STATE]; break;
                    case SELECTION_RETRY: //retry
                        --values[MENU_SEL_STATE]; break;
                }
                Game->PlaySound(SFX_GAMEOVERSCREEN_CURSOR);
                return true;
            }
            if ( Link->PressUp ) 
            {
                switch(values[MENU_SEL_STATE])
                {
                    case SELECTION_SAVE: //save
                        --values[MENU_SEL_STATE]; return true;;
                    case SELECTION_RETRY: //retry
                        ++values[MENU_SEL_STATE]; return true;;
                }
                Game->PlaySound(SFX_GAMEOVERSCREEN_CURSOR);
                return true;
            }
        }
        else //save, continue, retry
        {
            if ( Link->PressDown ) // || Link->PressUp )
            {
                switch(values[MENU_SEL_STATE])
                {
                    case SELECTION_SAVE: //save
                        values[MENU_SEL_STATE] = SELECTION_CONTINUE; break;
                    case SELECTION_CONTINUE: //save
                        values[MENU_SEL_STATE] = SELECTION_RETRY; break;
                    case SELECTION_RETRY: //retry
                        values[MENU_SEL_STATE] = SELECTION_SAVE; break;
                }
                Game->PlaySound(SFX_GAMEOVERSCREEN_CURSOR);
                return true;
            }
            if ( Link->PressUp ) 
            {
                switch(values[MENU_SEL_STATE])
                {
                    case SELECTION_SAVE: //save
                        values[MENU_SEL_STATE] = SELECTION_RETRY; break;
                    case SELECTION_CONTINUE: //save
                        values[MENU_SEL_STATE] = SELECTION_SAVE; break;
                    case SELECTION_RETRY: //retry
                        values[MENU_SEL_STATE] = SELECTION_CONTINUE; break;
                }
                Game->PlaySound(SFX_GAMEOVERSCREEN_CURSOR);
                return true;
            }
        }
        if ( Link->PressStart )
        {
            Game->PlaySound(SFX_GAMEOVERSCREEN_SELECTION);
            if ( values[MENU_SEL_STATE] ) values[QUIT] = quitSAVE;
            else values[QUIT] = quitRETRY; //no save
            return false;
        }
        return true;
    }
    
    
    int get_choice(bool can_continue)
    {
        if ( !can_continue )
        {
            if ( Link->PressDown )
            {
                Game->PlaySound(SFX_GAMEOVERSCREEN_CURSOR);
                switch(values[MENU_SEL_STATE])
                {
                    case SELECTION_SAVE: //save
                        ++values[MENU_SEL_STATE]; break;
                    case SELECTION_RETRY: //retry
                        ++values[MENU_SEL_STATE]; break;
                    case SELECTION_CANCEL: //3
                        values[MENU_SEL_STATE] = 1; break;
                    default: //cance;
                        values[MENU_SEL_STATE] = 0; break;
                }
            }
            if ( Link->PressUp )
            {
                Game->PlaySound(SFX_GAMEOVERSCREEN_CURSOR);
                switch(values[MENU_SEL_STATE])
                {
                    case 1: //save
                        values[MENU_SEL_STATE] = 3; break;
                    case 2: //retry
                        --values[MENU_SEL_STATE] ; break;
                    case SELECTION_CANCEL: //3
                        --values[MENU_SEL_STATE] ; break;
                    default: //cance;
                        values[MENU_SEL_STATE] = 0; break;
                }
            }       
        }
        else //allow continue
        {
            if ( Link->PressDown )
            {
                Game->PlaySound(SFX_GAMEOVERSCREEN_CURSOR);
                switch(values[MENU_SEL_STATE])
                {
                    case SELECTION_SAVE: //save
                        ++values[MENU_SEL_STATE]; break;
                    case SELECTION_RETRY: //retry
                        ++values[MENU_SEL_STATE]; break;
                    case SELECTION_CANCEL: //3
                        ++values[MENU_SEL_STATE] = 1; break;
                    case SELECTION_CONTINUE: //3
                        values[MENU_SEL_STATE] = 1; break;
                    default: //cance;
                        values[MENU_SEL_STATE] = 0; break;
                }
            }
            if ( Link->PressUp )
            {
                Game->PlaySound(SFX_GAMEOVERSCREEN_CURSOR);
                switch(values[MENU_SEL_STATE])
                {
                    case 1: //save
                        values[MENU_SEL_STATE] = 4; break;
                    case 2: //retry
                        --values[MENU_SEL_STATE]; break;
                    case SELECTION_CANCEL: //3
                        --values[MENU_SEL_STATE]; break;
                    case SELECTION_CONTINUE: //3
                        --values[MENU_SEL_STATE]; break;
                    default: //cance;
                        values[MENU_SEL_STATE] = 0; break;
                }
            }   
        }
        if ( Link->PressStart )
        {
            Game->PlaySound(SFX_GAMEOVERSCREEN_SELECTION);
            int ret = values[MENU_SEL_STATE];
            values[MENU_SEL_STATE] = 1;
            return ret;
        }
    }
    void animation()
    {
    if ( values[DEATHFRAME] == 0 ) Game->PlaySound(SFX_LINKDEATH);
        lweapon death = Screen->CreateLWeapon(LW_SPARKLE);
        
        death->UseSprite(SPR_DEATH);
        death->X = values[DEATH_LX];
        death->Y = values[DEATH_LY];
 
        while ( values[DEATHFRAME] < END_DEATH_SPIN )
        {
            ++values[DEATHFRAME];
            //spin Link around by drawing his tiles, then make the wink out.
            NoAction(); Waitdraw(); Waitframe();
        }
        Remove(death);
        Game->PlaySound(SFX_WINKOUT);
        lweapon death2 = Screen->CreateLWeapon(LW_SPARKLE);
        death2->UseSprite(SPR_DEATH_WINKOUT);
        death2->X = values[DEATH_LX];
        death2->Y = values[DEATH_LY];
        while ( values[DEATHFRAME] < END_DEATH_SPIN+END_WINKOUT )
        {
            ++values[DEATHFRAME];
            //wink-out
            NoAction();  Waitdraw(); Waitframe();
        }
        Remove(death2);
    }
}
 
 
//Global Active Script
link script noF6
{
    void run()
    {
        while(true)
        {
            //Normal pre-waitdraw functions go here.
        
            //UpdateGhostZH1();
            
            //Put any health refull code above this!
            //Run the check to see if Link is dying...
            if ( F6.press() ) { Game->DisableActiveSubscreen = false; F6.options(); }
            if ( gameover.check() ) break; //LAST before Waitdraw()
            Waitdraw(); 
            
            //Normal post-waitdraw functions go here. 
           
            //UpdateGhostZH2();
            
            Waitframe();
        }
        while(!gameover.values[gameover.QUIT])
        {
            //gameover.values[gameover.DEATH_LX] = Link->X;
            //gameover.values[gameover.DEATH_LY] = Link->Y;
            //Set game music to a silent MIDI.
 
            Link->HP = Link->MaxHP;
            Link->Invisible = true;
            Link->CollDetection = false;
            //Clean up screen objects
            gameover.clean_up();
            //Do Link Death animation
            gameover.animation();
            
            bool menu = true;
            Game->PlayMIDI(gameover.MIDI_GAMEOVER);//Play game over midi.
            Game->DisableActiveSubscreen = true;    
            
            while(menu) //menu loop
            {
                //    GAME OVER SCREEN
                gameover.draw(false,false); //gameover.draw(true, ALLOW_F6_CONTINUE); 
                menu = gameover.choice(gameover.ALLOW_DEATH_CONTINUE);
                Waitdraw();
                Waitframe();
            }
            Waitdraw(); Waitframe();
        }
        switch(gameover.values[gameover.QUIT])
        {
            case gameover.quitSAVE:
            {
                ++Game->NumDeaths;
                Game->Save();
                Game->End();
                break;
            }
            case gameover.quitRETRY:
            {
                Game->End(); //Retry
                break;
            }
            case gameover.quitCONTINUE:
            {
                F6.do_continue(F6.CONTINUE_HP, YES, F6.CONTINUE_MP, YES);
                break;
            }
            default: break;
        }
    }
}
 
global script OnExit
{
    void run()
    {
        Link->Invisible = false;
    }
}
}

Comments