//
// Generated by dtk
// Translation Unit: d_s_logo.cpp
//

#include "d/dolzel.h" // IWYU pragma: keep
#include "d/d_s_logo.h"
#include "res/Object/Logo.h"
#include "res/Object/System.h"
#include "f_op/f_op_scene.h"
#include "f_op/f_op_scene_mng.h"
#include "c/c_dylink.h"
#include "d/d_com_inf_game.h"
#include "d/d_com_lib_game.h"
#include "d/d_s_play.h"
#include "m_Do/m_Do_MemCardRWmng.h"
#include "m_Do/m_Do_audio.h"
#include "m_Do/m_Do_controller_pad.h"
#include "m_Do/m_Do_ext.h"
#include "m_Do/m_Do_graphic.h"
#include "m_Do/m_Do_machine.h"
#if VERSION == VERSION_PAL
#include "m_Do/m_Do_MemCard.h"
#endif
#include "m_Do/m_Do_Reset.h"
#include "m_Do/m_Do_dvd_thread.h"
#include "DynamicLink.h"
#include "JSystem/JKernel/JKRExpHeap.h"
#include "JSystem/JKernel/JKRAram.h"
#include "JSystem/JKernel/JKRAramBlock.h"
#include "JSystem/JKernel/JKRAramHeap.h"
#include "dolphin/os/OS.h"
#include "string.h"
#include "stdio.h"

mDoDvdThd_mountXArchive_c * l_anmCommand;
mDoDvdThd_mountXArchive_c * l_fmapCommand;
mDoDvdThd_mountXArchive_c * l_itemResCommand;
mDoDvdThd_mountXArchive_c * l_fmapResCommand;
mDoDvdThd_mountXArchive_c * l_dmapResCommand;
mDoDvdThd_mountXArchive_c * l_clctResCommand;
mDoDvdThd_mountXArchive_c * l_optResCommand;
mDoDvdThd_mountXArchive_c * l_saveResCommand;
mDoDvdThd_mountXArchive_c * l_clothResCommand;
mDoDvdThd_mountXArchive_c * l_itemiconCommand;
mDoDvdThd_mountXArchive_c * l_actioniconCommand;
mDoDvdThd_mountXArchive_c * l_scopeResCommand;
mDoDvdThd_mountXArchive_c * l_camResCommand;
mDoDvdThd_mountXArchive_c * l_swimResCommand;
mDoDvdThd_mountXArchive_c * l_windResCommand;
mDoDvdThd_mountXArchive_c * l_nameResCommand;
mDoDvdThd_mountXArchive_c * l_tmsgCommand;
#if VERSION > VERSION_DEMO
mDoDvdThd_mountXArchive_c * l_dmsgCommand;
#endif
mDoDvdThd_mountXArchive_c * l_errorResCommand;
mDoDvdThd_mountXArchive_c * l_msgDtCommand;
#if VERSION > VERSION_JPN
mDoDvdThd_mountXArchive_c * l_msgDtCommand2;
#endif
mDoDvdThd_mountXArchive_c * l_msgCommand;
mDoDvdThd_mountXArchive_c * l_menuCommand;
mDoDvdThd_mountXArchive_c * l_fontCommand;
mDoDvdThd_mountXArchive_c * l_rubyCommand;
mDoDvdThd_toMainRam_c * l_particleCommand;
mDoDvdThd_toMainRam_c * l_itemTableCommand;
mDoDvdThd_toMainRam_c * l_ActorDataCommand;
mDoDvdThd_toMainRam_c * l_FmapDataCommand;
#if VERSION == VERSION_DEMO
mDoDvdThd_callback_c * l_DmcMountCommand;
#else
mDoDvdThd_mountXArchive_c * l_lodCommand;
#endif

enum {
    ACT_nintendoInDraw = 0,
    ACT_nintendoOutDraw = 1,
    ACT_nintendoOut2Draw = 2,
    ACT_dolbyInDraw = 3,
    ACT_dolbyOutDraw = 4,
    ACT_progInDraw = 5,
    ACT_progSelDraw = 6,
    ACT_progOutDraw = 7,
    ACT_progSetDraw = 8,
    ACT_progChangeDraw = 9,
    ACT_dvdWaitDraw = 10,
};

/* 8022C0B4-8022C130       .text checkProgSelect__FP10dScnLogo_c */
void checkProgSelect(dScnLogo_c* i_this) {
#if VERSION == VERSION_DEMO
    if (VIGetDTVStatus() != 0 && (OSGetProgressiveMode() == 1 || CPad_CHECK_HOLD_B(0))) {
        i_this->field_0x1ea = 1;
        i_this->mInterFlag = 0;
    }
#elif VERSION <= VERSION_USA
    if (OSGetResetCode() == 0) {
        if (VIGetDTVStatus() != 0 && (OSGetProgressiveMode() == 1 || CPad_CHECK_HOLD_B(0))) {
            i_this->field_0x1ea = 1;
            i_this->mInterFlag = 0;
        }
    } else {
        i_this->field_0x1ea = 0;
    }
#else // VERSION_PAL
    if (OSGetResetCode() == 0 || OSGetResetCode() == 1) {
        if (OSGetEuRgb60Mode() == 1 || CPad_CHECK_HOLD_B(0)) {
            i_this->field_0x1ea = 1;
            i_this->mInterFlag = 0;
        }
    } else {
        i_this->field_0x1ea = 0;
    }
#endif
}

/* 8022C130-8022C1D8       .text nintendoInDraw__FP10dScnLogo_c */
BOOL nintendoInDraw(dScnLogo_c* i_this) {
    dComIfGd_set2DOpa(i_this->nintendoImg);
    if (i_this->mTimer == 0) {
        if (i_this->field_0x1ea != 0) {
            i_this->mAction = ACT_progInDraw;
            i_this->mTimer = 30;
        } else {
            i_this->mAction = ACT_nintendoOutDraw;
            i_this->mTimer = 30;
            mDoGph_gInf_c::startFadeOut(30);
        }
    }

    return TRUE;
}

/* 8022C1D8-8022C2AC       .text nintendoOutDraw__FP10dScnLogo_c */
BOOL nintendoOutDraw(dScnLogo_c* i_this) {
    dComIfGd_set2DOpa(i_this->nintendoImg);

    if (!i_this->mInterFlag)
        dComIfGd_set2DOpa(i_this->progImg);
    else
        dComIfGd_set2DOpa(i_this->interImg);

    if (i_this->mTimer == 0) {
        i_this->mAction = ACT_dolbyInDraw;
        i_this->mTimer = 90;
        mDoGph_gInf_c::startFadeIn(30);
    }

    return TRUE;
}

/* 8022C2AC-8022C35C       .text nintendoOut2Draw__FP10dScnLogo_c */
BOOL nintendoOut2Draw(dScnLogo_c* i_this) {
    dComIfGd_set2DOpa(i_this->nintendoImg);

    if (!i_this->mInterFlag)
        dComIfGd_set2DOpa(i_this->progImg);
    else
        dComIfGd_set2DOpa(i_this->interImg);

    if (i_this->mTimer == 0) {
        i_this->mAction = ACT_progChangeDraw;
        i_this->mTimer = 300;
    }

    return TRUE;
}

/* 8022C35C-8022C484       .text progInDraw__FP10dScnLogo_c */
BOOL progInDraw(dScnLogo_c* i_this) {
    dComIfGd_set2DOpa(i_this->nintendoImg);
    dComIfGd_set2DOpa(i_this->progchoiceImg);
    dComIfGd_set2DOpa(i_this->progyesImg);
    dComIfGd_set2DOpa(i_this->prognoImg);

    f32 temp = 1.0f - (i_this->mTimer / 30.0f);
    u8 alpha = temp * 0xFF;
    i_this->progchoiceImg->setAlpha(alpha);
    i_this->progyesImg->setAlpha(alpha);
    i_this->prognoImg->setAlpha(alpha);

    if (i_this->mTimer == 0) {
        i_this->mAction = ACT_progSelDraw;
#if VERSION <= VERSION_JPN
        i_this->mTimer = 300;
#else
        i_this->mTimer = 600;
#endif
        i_this->field_0x1ee = 30;
        i_this->field_0x1f0 = i_this->field_0x1ee;
        i_this->field_0x1f2 = 0;
        i_this->field_0x1eb = 0;
    }

    return TRUE;
}

/* 8022C484-8022CAA8       .text progSelDraw__FP10dScnLogo_c */
BOOL progSelDraw(dScnLogo_c* i_this) {
    dComIfGd_set2DOpa(i_this->nintendoImg);
    dComIfGd_set2DOpa(i_this->progchoiceImg);
    dComIfGd_set2DOpa(i_this->progyesImg);
    dComIfGd_set2DOpa(i_this->prognoImg);

    if (i_this->field_0x1eb == 0) {
        if (i_this->mInterFlag == 0) {
            if (CPad_CHECK_HOLD_RIGHT(0) || CPad_GET_STICK_POS_X(0) > 0.5f) {
                mDoAud_seStart(JA_SE_TALK_CURSOR);
                i_this->mInterFlag = 1;
                i_this->field_0x1ee = 30;
                i_this->field_0x1f0 = i_this->field_0x1ee;
                i_this->field_0x1f2 = 0;
            }
        } else {
            if (CPad_CHECK_HOLD_LEFT(0) || CPad_GET_STICK_POS_X(0) < -0.5f) {
                mDoAud_seStart(JA_SE_TALK_CURSOR);
                i_this->mInterFlag = 0;
                i_this->field_0x1ee = 30;
                i_this->field_0x1f0 = i_this->field_0x1ee;
                i_this->field_0x1f2 = 0;
            }
        }

        if (CPad_CHECK_TRIG_A(0) || i_this->mTimer == 0) {
            if (i_this->mInterFlag == 0)
                mDoAud_seStart(JA_SE_TALK_WIN_CLOSE);
            else
                mDoAud_seStart(JA_SE_TALK_SEL_CANCEL);

            const int temp = VERSION_SELECT(240, 240, 540, 540);
            if (i_this->mTimer > temp) {
                i_this->field_0x1eb = 1;
                i_this->field_0x1f4 = i_this->mTimer - temp;
            } else {
                i_this->mAction = ACT_progOutDraw;
                i_this->mTimer = 30;
                i_this->field_0x1ee = 30;
                i_this->field_0x1f0 = i_this->field_0x1ee;
                i_this->field_0x1f2 = 0;
            }
        }
    } else {
        if (i_this->field_0x1f4 == 0) {
            i_this->mAction = ACT_progOutDraw;
            i_this->mTimer = 30;
            i_this->field_0x1ee = 30;
            i_this->field_0x1f0 = i_this->field_0x1ee;
            i_this->field_0x1f2 = 0;
        } else {
            i_this->field_0x1f4--;
        }
    }

    f32 t = (f32)i_this->field_0x1f0 / (f32)i_this->field_0x1ee;
    if (i_this->field_0x1f2 != 0)
        t = 1.0f - t;
    u8 selR = t * 0xFF;
    u8 selG = t * 0xC8;

    if (i_this->mInterFlag) {
        i_this->progyesImg->getPicture()->setWhite((GXColor){0xA0, 0xA0, 0xA0, 0xFF});
        i_this->progyesImg->getPicture()->setBlack((GXColor){0x00, 0x00, 0x00, 0x00});
        i_this->prognoImg->getPicture()->setWhite((GXColor){0xFF, 0xC8, 0x00, 0xFF});
        i_this->prognoImg->getPicture()->setBlack((GXColor){selR, selG, 0x00, 0x00});
    } else {
        i_this->progyesImg->getPicture()->setWhite((GXColor){0xFF, 0xC8, 0x00, 0xFF});
        i_this->progyesImg->getPicture()->setBlack((GXColor){selR, selG, 0x00, 0x00});
        i_this->prognoImg->getPicture()->setWhite((GXColor){0xA0, 0xA0, 0xA0, 0xFF});
        i_this->prognoImg->getPicture()->setBlack((GXColor){0x00, 0x00, 0x00, 0x00});
    }

    if (i_this->field_0x1f0 == 0) {
        i_this->field_0x1f0 = i_this->field_0x1ee;
        i_this->field_0x1f2 = i_this->field_0x1f2 ^ 1;
    } else {
        i_this->field_0x1f0--;
    }

    return TRUE;
}

/* 8022CAA8-8022CC54       .text progOutDraw__FP10dScnLogo_c */
BOOL progOutDraw(dScnLogo_c* i_this) {
    f32 temp = i_this->mTimer / 30.0f;
    u8 alpha = temp * 0xFF;
    i_this->progchoiceImg->setAlpha(alpha);
    i_this->progyesImg->setAlpha(alpha);
    i_this->prognoImg->setAlpha(alpha);

    dComIfGd_set2DOpa(i_this->nintendoImg);
    dComIfGd_set2DOpa(i_this->progchoiceImg);
    dComIfGd_set2DOpa(i_this->progyesImg);
    dComIfGd_set2DOpa(i_this->prognoImg);

    if (i_this->mTimer == 0) {
#if VERSION == VERSION_PAL
        if (OSGetEuRgb60Mode() == 1 && !i_this->mInterFlag)
#else
        if (OSGetProgressiveMode() && !i_this->mInterFlag)
#endif
        {
            i_this->mAction = ACT_nintendoOut2Draw;
            i_this->mTimer = 30;
            mDoGph_gInf_c::startFadeOut(30);
        }
#if VERSION == VERSION_PAL
        else if (OSGetEuRgb60Mode() == 0 && i_this->mInterFlag)
#else
        else if (!OSGetProgressiveMode() && i_this->mInterFlag)
#endif
        {
            i_this->mAction = ACT_nintendoOutDraw;
            i_this->mTimer = 30;
            mDoGph_gInf_c::startFadeOut(30);
        } else {
            i_this->mAction = ACT_progSetDraw;
#if VERSION != VERSION_USA
            i_this->mTimer = 300;
#else
            i_this->mTimer = 600;
#endif
            i_this->field_0x1f0 = 30;
        }
    }

    return TRUE;
}

/* 8022CC54-8022CDC8       .text progSetDraw__FP10dScnLogo_c */
BOOL progSetDraw(dScnLogo_c* i_this) {
    u8 alpha;
    if (i_this->field_0x1f0 != 0) {
        f32 temp = 1.0f - (i_this->field_0x1f0 / 30.0f);
        alpha = temp * 0xFF;
        i_this->field_0x1f0--;
    } else {
        alpha = 0xFF;
    }

    i_this->progchoiceImg->setAlpha(alpha);
    i_this->progyesImg->setAlpha(alpha);
    i_this->prognoImg->setAlpha(alpha);

    dComIfGd_set2DOpa(i_this->nintendoImg);

    if (!i_this->mInterFlag) {
        i_this->progImg->setAlpha(alpha);
        dComIfGd_set2DOpa(i_this->progImg);
    } else {
        i_this->interImg->setAlpha(alpha);
        dComIfGd_set2DOpa(i_this->interImg);
    }

    if (i_this->mTimer == 0) {
        if (!i_this->mInterFlag) {
            i_this->mAction = ACT_nintendoOut2Draw;
        } else {
#if VERSION == VERSION_PAL
            OSSetEuRgb60Mode(0);
#else
            OSSetProgressiveMode(0);
#endif
            i_this->mAction = ACT_nintendoOutDraw;
        }

        i_this->mTimer = 30;
        mDoGph_gInf_c::startFadeOut(30);
    }

    return TRUE;
}

/* 8022CDC8-8022CE60       .text progChangeDraw__FP10dScnLogo_c */
BOOL progChangeDraw(dScnLogo_c* i_this) {
    if (i_this->mTimer == 299 && !i_this->mInterFlag) {
        mDoMch_render_c::setProgressiveMode();
#if VERSION == VERSION_PAL
        OSSetEuRgb60Mode(1);
#else
        OSSetProgressiveMode(1);
#endif
    }

    if (i_this->mTimer == 0) {
        i_this->mAction = ACT_dolbyInDraw;
        i_this->mTimer = 90;
        mDoGph_gInf_c::startFadeIn(30);
    }

    return TRUE;
}

/* 8022CE60-8022CEE8       .text dolbyInDraw__FP10dScnLogo_c */
BOOL dolbyInDraw(dScnLogo_c* i_this) {
    dComIfGd_set2DOpa(i_this->dolbyImg);

    if (i_this->mTimer == 0) {
        i_this->mAction = ACT_dolbyOutDraw;
        i_this->mTimer = 30;
        mDoGph_gInf_c::startFadeOut(30);
    }

    return TRUE;
}

/* 8022CEE8-8022CF44       .text dolbyOutDraw__FP10dScnLogo_c */
BOOL dolbyOutDraw(dScnLogo_c* i_this) {
    dComIfGd_set2DOpa(i_this->dolbyImg);

    if (i_this->mTimer == 0) {
        i_this->mAction = ACT_dvdWaitDraw;
    }

    return TRUE;
}

/* 8022CF44-8022D18C       .text dvdWaitDraw__FP10dScnLogo_c */
BOOL dvdWaitDraw(dScnLogo_c* i_this) {
    if (!dComIfG_syncAllObjectRes()
        && l_anmCommand->sync()
        && l_fmapCommand->sync()
        && l_itemResCommand->sync()
        && l_fmapResCommand->sync()
        && l_dmapResCommand->sync()
        && l_clctResCommand->sync()
        && l_optResCommand->sync()
        && l_saveResCommand->sync()
        && l_clothResCommand->sync()
        && l_itemiconCommand->sync()
        && l_actioniconCommand->sync()
        && l_scopeResCommand->sync()
        && l_camResCommand->sync()
        && l_swimResCommand->sync()
        && l_windResCommand->sync()
        && l_nameResCommand->sync()
        && l_tmsgCommand->sync()
#if VERSION > VERSION_DEMO
        && l_dmsgCommand->sync()
#endif
        && l_errorResCommand->sync()
        && l_msgDtCommand->sync()
#if VERSION > VERSION_JPN
        && l_msgDtCommand2->sync()
#endif
        && l_msgCommand->sync()
        && l_menuCommand->sync()
        && l_fontCommand->sync()
        && l_rubyCommand->sync()
        && l_particleCommand->sync()
        && l_itemTableCommand->sync()
        && l_ActorDataCommand->sync()
        && l_FmapDataCommand->sync()
#if VERSION == VERSION_DEMO
        && l_DmcMountCommand->sync()
#else
        && l_lodCommand->sync() && !mDoRst::isReset()
#endif
    ) {

        dComIfG_changeOpeningScene(i_this, fpcNm_OPENING_SCENE_e);
    }
    return TRUE;
}

typedef BOOL(*drawFunc)(dScnLogo_c* i_this);

/* 8022D18C-8022D1DC       .text dScnLogo_Draw__FP10dScnLogo_c */
static BOOL dScnLogo_Draw(dScnLogo_c* i_this) {
    static drawFunc l_execFunc[] = {
        nintendoInDraw,
        nintendoOutDraw,
        nintendoOut2Draw,
        dolbyInDraw,
        dolbyOutDraw,
        progInDraw,
        progSelDraw,
        progOutDraw,
        progSetDraw,
        progChangeDraw,
        dvdWaitDraw,
    };

    cLib_calcTimer(&i_this->mTimer);
    return l_execFunc[i_this->mAction](i_this);
}

/* 8022D1DC-8022D21C       .text dScnLogo_Execute__FP10dScnLogo_c */
static BOOL dScnLogo_Execute(dScnLogo_c* i_this) {
    if (mDoRst::isReset())
        fopScnM_ChangeReq(i_this, fpcNm_LOGO_SCENE_e, fpcNm_OVERLAP0_e, 5);
    return TRUE;
}

/* 8022D21C-8022D224       .text dScnLogo_IsDelete__FP10dScnLogo_c */
static BOOL dScnLogo_IsDelete(dScnLogo_c* i_this) {
    UNUSED(i_this);
    return TRUE;
}

/* 8022D224-8022D984       .text dScnLogo_Delete__FP10dScnLogo_c */
static BOOL dScnLogo_Delete(dScnLogo_c* i_this) {
    if (mDoRst::isReset())
        mDoRst_reset(0, DEMO_SELECT(0, 0x80000000), 0);

    delete i_this->nintendoImg;
    delete i_this->dolbyImg;
    delete i_this->progchoiceImg;
    delete i_this->progyesImg;
    delete i_this->prognoImg;
    delete i_this->progImg;
    delete i_this->interImg;

    dComIfGp_particle_createCommon(l_particleCommand->getMemAddress());

    dComIfGp_setAnmArchive(l_anmCommand->getArchive());
    dComIfGp_setFmapArchive(l_fmapCommand->getArchive());
    dComIfGp_setItemResArchive(l_itemResCommand->getArchive());
    dComIfGp_setFmapResArchive(l_fmapResCommand->getArchive());
    dComIfGp_setDmapResArchive(l_dmapResCommand->getArchive());
    dComIfGp_setCollectResArchive(l_clctResCommand->getArchive());
    dComIfGp_setOptionResArchive(l_optResCommand->getArchive());
    dComIfGp_setSaveResArchive(l_saveResCommand->getArchive());
    dComIfGp_setClothResArchive(l_clothResCommand->getArchive());
    dComIfGp_setItemIconArchive(l_itemiconCommand->getArchive());
    dComIfGp_setActionIconArchive(l_actioniconCommand->getArchive());
    dComIfGp_setScopeResArchive(l_scopeResCommand->getArchive());
    dComIfGp_setCameraResArchive(l_camResCommand->getArchive());
    dComIfGp_setSwimResArchive(l_swimResCommand->getArchive());
    dComIfGp_setWindResArchive(l_windResCommand->getArchive());
    dComIfGp_setNameResArchive(l_nameResCommand->getArchive());
    dComIfGp_setTactMsgArchive(l_tmsgCommand->getArchive());
#if VERSION > VERSION_DEMO
    dComIfGp_setDmsgArchive(l_dmsgCommand->getArchive());
#endif
    dComIfGp_setErrorResArchive(l_errorResCommand->getArchive());
    dComIfGp_setMsgDtArchive(l_msgDtCommand->getArchive());
#if VERSION > VERSION_JPN
    dComIfGp_setMsgDt2Archive(l_msgDtCommand2->getArchive());
#endif
    dComIfGp_setMsgArchive(l_msgCommand->getArchive());
    dComIfGp_setMenuArchive(l_menuCommand->getArchive());
    dComIfGp_setFontArchive(l_fontCommand->getArchive());
    // dComIfGp_setRubyArchive(l_rubyCommand->getArchive());

    delete l_anmCommand;
    delete l_fmapCommand;
    delete l_itemResCommand;
    delete l_fmapResCommand;
    delete l_dmapResCommand;
    delete l_clctResCommand;
    delete l_optResCommand;
    delete l_saveResCommand;
    delete l_clothResCommand;
    delete l_itemiconCommand;
    delete l_actioniconCommand;
    delete l_scopeResCommand;
    delete l_camResCommand;
    delete l_swimResCommand;
    delete l_windResCommand;
    delete l_nameResCommand;
    delete l_tmsgCommand;
#if VERSION > VERSION_DEMO
    delete l_dmsgCommand;
#endif
    delete l_errorResCommand;
    delete l_msgDtCommand;
#if VERSION > VERSION_JPN
    delete l_msgDtCommand2;
#endif
    delete l_msgCommand;
    delete l_menuCommand;
    delete l_fontCommand;
    delete l_rubyCommand;
    delete l_particleCommand;

    mDoExt_getMesgFont();
    mDoExt_getRubyFont();

#if VERSION <= VERSION_JPN
    if (g_msgDHIO.field_0x08 == 0 && dComIfGp_getFontArchive() != NULL) {
        dComIfGp_getFontArchive()->unmount();
        dComIfGp_setFontArchive(NULL);
    }
#endif

    dComIfGp_setItemTable(l_itemTableCommand->getMemAddress());
    delete l_itemTableCommand;

    dComIfGp_setActorData(l_ActorDataCommand->getMemAddress());
    dComIfGp_setFmapData(l_FmapDataCommand->getMemAddress());

    delete l_ActorDataCommand;
    delete l_FmapDataCommand;
#if VERSION == VERSION_DEMO
    delete l_DmcMountCommand;
#else
    delete l_lodCommand;
#endif

    ResTIMG * timg = (ResTIMG *)dComIfG_getObjectRes("Always", dRes_INDEX_ALWAYS_I4_BALL128B_e);
    dDlst_shadowControl_c::setSimpleTex(timg);
    dComIfG_deleteObjectRes("Logo");
    dComIfGp_setWindowNum(0);

    for (s32 i = 0; i < 3; i++) {
        dComIfGp_setPictureBoxData(JKRAllocFromAram(sizeof(card_pictdata), JKRAramHeap::HEAD), i);
        dComIfGp_offPictureFlag(i);
    }

    for (s32 i = 0; i < 4; i++) {
        dComIfGp_setBossBattleData(JKRAllocFromAram(sizeof(dSv_player_status_c_c), JKRAramHeap::HEAD), i);
    }

#if VERSION == VERSION_PAL
    g_dComIfG_gameInfo.play.field_0x4820 = JKRAllocFromAram(0xB000, JKRAramHeap::HEAD);
#endif

#if VERSION == VERSION_DEMO
    mDoRst::offReset();
#endif

#if VERSION > VERSION_DEMO
    mDoExt_setSafeGameHeapSize();
    mDoExt_setSafeZeldaHeapSize();
    mDoExt_setSafeCommandHeapSize();
    mDoExt_setSafeArchiveHeapSize();
#endif

    return TRUE;
}

/* 8022D984-8022DB20       .text phase_0__FP10dScnLogo_c */
cPhs_State phase_0(dScnLogo_c* i_this) {
#if VERSION == VERSION_DEMO
    if (!VIGetDTVStatus())
        OSSetProgressiveMode(0);
#elif VERSION <= VERSION_USA
    if (!OSGetResetCode()) {
        if (!VIGetDTVStatus())
            OSSetProgressiveMode(0);
    } else {
        if (OSGetProgressiveMode() == 1)
            mDoMch_render_c::setProgressiveMode();
    }
#endif

    if (!cDyl_InitAsyncIsDone())
        return cPhs_INIT_e;

    if (mDoAud_zelAudio_c::isInitFlag() && mDoAud_checkFirstWaves())
        return cPhs_INIT_e;

#if VERSION == VERSION_PAL
    if (mDoDvdThd::SyncWidthSound == 0)
        return cPhs_INIT_e;
#endif

    s32 rt;
    
    rt = dComIfG_setObjectRes("System", JKRArchive::DEFAULT_MOUNT_DIRECTION, NULL);

    JUT_ASSERT(VERSION_SELECT(1128, 1169, 1350, 1378), rt == 1);

#if VERSION <= VERSION_DEMO
    rt = dComIfG_setObjectRes("Logo", JKRArchive::MOUNT_DIRECTION_HEAD, NULL);
#else
    rt = dComIfG_setObjectRes("Logo", JKRArchive::MOUNT_DIRECTION_TAIL, NULL);
#endif
    JUT_ASSERT(VERSION_SELECT(1131, 1173, 1354, 1382), rt == 1);

#if VERSION == VERSION_PAL
    g_mDoMemCd_control.load2();
#endif

#if VERSION > VERSION_DEMO
    i_this->field_0x1ea = 0;
    archiveHeap->dump_sort();
#endif

    return cPhs_NEXT_e;
}

/* 8022DB20-8022DC58       .text phase_1__FP10dScnLogo_c */
cPhs_State phase_1(dScnLogo_c* i_this) {
    if (dComIfG_syncAllObjectRes() != 0)
        return cPhs_INIT_e;

#if VERSION == VERSION_PAL
    s32 rt = g_mDoMemCd_control.LoadSync2();
    if (rt == 0) {
        return cPhs_INIT_e;
    } else if (rt == 1) {
        if (g_mDoMemCd_control.field_0x165B >= 5) {
            g_mDoMemCd_control.field_0x165B = 0;
        }
        dComIfGs_setPalLanguage(g_mDoMemCd_control.field_0x165B);
    } else {
        u8 language = OSGetLanguage();
        if (language >= 5) {
            language = 0;
        }
        dComIfGs_setPalLanguage(language);
        g_mDoMemCd_control.field_0x165B = language;
    }
#endif

    ResTIMG * toonImage;

    toonImage = (ResTIMG *)dComIfG_getObjectRes("System", dRes_INDEX_SYSTEM_BTI_TOON_e);

    JUT_ASSERT(VERSION_SELECT(1161, 1208, 1426, 1466), toonImage != NULL);
    dDlst_list_c::setToonImage(toonImage);

    toonImage = (ResTIMG *)dComIfG_getObjectRes("System", dRes_INDEX_SYSTEM_BTI_TOONEX_e);
    JUT_ASSERT(VERSION_SELECT(1166, 1213, 1431, 1471), toonImage != NULL);
    dDlst_list_c::setToonExImage(toonImage);

    i_this->field_0x1f8 = mDoExt_getGameHeap()->alloc(0x3c8a0, 4);
#if VERSION == VERSION_DEMO
    i_this->field_0x1fc = mDoExt_getArchiveHeap()->alloc(0xf24e0, 4);
#endif

    return cPhs_NEXT_e;
}

/* 8022DC58-8022DC80       .text aramMount__FPCc */
mDoDvdThd_mountXArchive_c * aramMount(const char* pArc) {
    return mDoDvdThd_mountXArchive_c::create(pArc, JKRArchive::DEFAULT_MOUNT_DIRECTION, JKRArchive::MOUNT_ARAM);
}

/* 8022DC80-8022DCA8       .text onMemMount__FPCc */
mDoDvdThd_mountXArchive_c * onMemMount(const char* pArc) {
    return mDoDvdThd_mountXArchive_c::create(pArc, JKRArchive::DEFAULT_MOUNT_DIRECTION, JKRArchive::MOUNT_MEM);
}

/* 8022DCA8-8022E9B4       .text phase_2__FP10dScnLogo_c */
cPhs_State phase_2(dScnLogo_c* i_this) {
    s32 rt;
    
    rt = dComIfG_syncObjectRes("Logo");
    JUT_ASSERT(VERSION_SELECT(1202, 1251, 1469, 1509), rt >= 0);

    if (rt != 0)
        return cPhs_INIT_e;

    dComIfGp_particle_create();

    ResTIMG * timg;
    
    timg = (ResTIMG *)dComIfG_getObjectRes("Logo", dRes_INDEX_LOGO_BTI_NINTENDO_376X104_e);
    JUT_ASSERT(VERSION_SELECT(1214, 1264, 1482, 1522), timg != NULL);
    i_this->nintendoImg = new dDlst_2D_c(timg, 133, 170, 0);
    JUT_ASSERT(VERSION_SELECT(1216, 1267, 1485, 1525), i_this->nintendoImg != NULL);
    i_this->nintendoImg->setAlpha(0xFF);
#if VERSION <= VERSION_JPN
    // Blue Nintendo logo for JPN.
    i_this->nintendoImg->getPicture()->setWhite((GXColor){0x00, 0x46, 0xFF, 0xFF});
#else
    // Red Nintendo logo for other regions.
    i_this->nintendoImg->getPicture()->setWhite((GXColor){0xDC, 0x00, 0x00, 0xFF});
#endif

    timg = (ResTIMG *)dComIfG_getObjectRes("Logo", dRes_INDEX_LOGO_BTI_TITLE_DOLBY_MARK_e);
    JUT_ASSERT(VERSION_SELECT(1224, 1276, 1498, 1538), timg != NULL);
    i_this->dolbyImg = new dDlst_2D_c(timg, 218, 166, 0);
    JUT_ASSERT(VERSION_SELECT(1226, 1280, 1502, 1542), i_this->dolbyImg != NULL);
    i_this->dolbyImg->setAlpha(0xFF);

#if VERSION == VERSION_PAL
    static const u8 choice[] = {
        dRes_INDEX_LOGO_BTI_PROGRESSIVE_CHOICE_e,
        dRes_INDEX_LOGO_BTI_PROGRESSIVE_CHOICE_GM_e,
        dRes_INDEX_LOGO_BTI_PROGRESSIVE_CHOICE_FR_e,
        dRes_INDEX_LOGO_BTI_PROGRESSIVE_CHOICE_SP_e,
        dRes_INDEX_LOGO_BTI_PROGRESSIVE_CHOICE_IT_e,
    };
    static const u8 yes[] = {
        dRes_INDEX_LOGO_BTI_PROGRESSIVE_YES_e,
        dRes_INDEX_LOGO_BTI_PROGRESSIVE_YES_GM_e,
        dRes_INDEX_LOGO_BTI_PROGRESSIVE_YES_FR_e,
        dRes_INDEX_LOGO_BTI_PROGRESSIVE_YES_SP_e,
        dRes_INDEX_LOGO_BTI_PROGRESSIVE_YES_IT_e,
    };
    static const u8 no[] = {
        dRes_INDEX_LOGO_BTI_PROGRESSIVE_NO_e,
        dRes_INDEX_LOGO_BTI_PROGRESSIVE_NO_GM_e,
        dRes_INDEX_LOGO_BTI_PROGRESSIVE_NO_FR_e,
        dRes_INDEX_LOGO_BTI_PROGRESSIVE_NO_SP_e,
        dRes_INDEX_LOGO_BTI_PROGRESSIVE_NO_IT_e,
    };
    static const u8 prog[] = {
        dRes_INDEX_LOGO_BTI_PROGRESSIVE_PRO_e,
        dRes_INDEX_LOGO_BTI_PROGRESSIVE_PRO_GM_e,
        dRes_INDEX_LOGO_BTI_PROGRESSIVE_PRO_FR_e,
        dRes_INDEX_LOGO_BTI_PROGRESSIVE_PRO_SP_e,
        dRes_INDEX_LOGO_BTI_PROGRESSIVE_PRO_IT_e,
    };
    static const u8 intr[] = {
        dRes_INDEX_LOGO_BTI_PROGRESSIVE_INTER_e,
        dRes_INDEX_LOGO_BTI_PROGRESSIVE_INTER_GM_e,
        dRes_INDEX_LOGO_BTI_PROGRESSIVE_INTER_FR_e,
        dRes_INDEX_LOGO_BTI_PROGRESSIVE_INTER_SP_e,
        dRes_INDEX_LOGO_BTI_PROGRESSIVE_INTER_IT_e,
    };
#endif

#if VERSION == VERSION_PAL
    timg = (ResTIMG *)dComIfG_getObjectRes("Logo", choice[dComIfGs_getPalLanguage()]);
#else
    timg = (ResTIMG *)dComIfG_getObjectRes("Logo", dRes_INDEX_LOGO_BTI_PROGRESSIVE_CHOICE_e);
#endif
    JUT_ASSERT(VERSION_SELECT(1232, 1286, 1565, 1605), timg != NULL);
    i_this->progchoiceImg = new dDlst_2D_c(timg, 113, 281, 0);
    JUT_ASSERT(VERSION_SELECT(1234, 1288, 1567, 1607), i_this->progchoiceImg != NULL);
    i_this->progchoiceImg->setAlpha(0x00);

#if VERSION == VERSION_PAL
    timg = (ResTIMG *)dComIfG_getObjectRes("Logo", yes[dComIfGs_getPalLanguage()]);
#else
    timg = (ResTIMG *)dComIfG_getObjectRes("Logo", dRes_INDEX_LOGO_BTI_PROGRESSIVE_YES_e);
#endif
    JUT_ASSERT(VERSION_SELECT(1240, 1295, 1579, 1619), timg != NULL);
    i_this->progyesImg = new dDlst_2D_c(timg, 211, 372, 0);
    JUT_ASSERT(VERSION_SELECT(1242, 1297, 1581, 1621), i_this->progyesImg != NULL);
    i_this->progyesImg->getPicture()->setWhite((GXColor){0xFF, 0xC8, 0x00, 0xFF});
    i_this->progyesImg->setAlpha(0x00);

#if VERSION == VERSION_PAL
    timg = (ResTIMG *)dComIfG_getObjectRes("Logo", no[dComIfGs_getPalLanguage()]);
#else
    timg = (ResTIMG *)dComIfG_getObjectRes("Logo", dRes_INDEX_LOGO_BTI_PROGRESSIVE_NO_e);
#endif
    JUT_ASSERT(VERSION_SELECT(1249, 1305, 1594, 1634), timg != NULL);
    i_this->prognoImg = new dDlst_2D_c(timg, 350, 372, 0);
    JUT_ASSERT(VERSION_SELECT(1251, 1307, 1596, 1636), i_this->prognoImg != NULL);
    i_this->prognoImg->getPicture()->setWhite((GXColor){0xA0, 0xA0, 0xA0, 0xFF});
    i_this->prognoImg->setAlpha(0x00);

#if VERSION == VERSION_PAL
    timg = (ResTIMG *)dComIfG_getObjectRes("Logo", prog[dComIfGs_getPalLanguage()]);
#else
    timg = (ResTIMG *)dComIfG_getObjectRes("Logo", dRes_INDEX_LOGO_BTI_PROGRESSIVE_PRO_e);
#endif
    JUT_ASSERT(VERSION_SELECT(1258, 1315, 1609, 1649), timg != NULL);
    i_this->progImg = new dDlst_2D_c(timg, 153, 309, 0);
    JUT_ASSERT(VERSION_SELECT(1260, 1317, 1611, 1651), i_this->progImg != NULL);
    i_this->progImg->setAlpha(0x00);

#if VERSION == VERSION_PAL
    timg = (ResTIMG *)dComIfG_getObjectRes("Logo", intr[dComIfGs_getPalLanguage()]);
#else
    timg = (ResTIMG *)dComIfG_getObjectRes("Logo", dRes_INDEX_LOGO_BTI_PROGRESSIVE_INTER_e);
#endif
    JUT_ASSERT(VERSION_SELECT(1266, 1324, 1623, 1663), timg != NULL);
    i_this->interImg = new dDlst_2D_c(timg, 153, 309, 0);
    JUT_ASSERT(VERSION_SELECT(1268, 1326, 1625, 1665), i_this->interImg != NULL);
    i_this->interImg->setAlpha(0x00);

    JKRHeap::free(i_this->field_0x1f8, NULL);
#if VERSION == VERSION_DEMO
    JKRHeap::free(i_this->field_0x1fc, NULL);
#endif

#if VERSION > VERSION_DEMO
    l_lodCommand = aramMount("/res/Stage/sea/LODALL.arc");
    JUT_ASSERT(VERSION_SELECT(1346, 1346, 1645, 1685), l_lodCommand != NULL);
#endif
    
    rt = dComIfG_setObjectRes("Always", JKRArchive::DEFAULT_MOUNT_DIRECTION, NULL);
    JUT_ASSERT(VERSION_SELECT(1280, 1351, 1650, 1690), rt == 1);

#if VERSION > VERSION_DEMO
    archiveHeap->dump_sort();
#endif

    rt = dComIfG_setObjectRes("Link", JKRArchive::DEFAULT_MOUNT_DIRECTION, NULL);
    JUT_ASSERT(VERSION_SELECT(1283, 1356, 1655, 1695), rt == 1);

    rt = dComIfG_setObjectRes("Agb", JKRArchive::DEFAULT_MOUNT_DIRECTION, NULL);
    JUT_ASSERT(VERSION_SELECT(1286, 1360, 1659, 1699), rt == 1);

    l_anmCommand = aramMount("/res/Object/LkAnm.arc");
    l_fmapCommand = aramMount("/res/Fmap/Fmap.arc");
    l_itemResCommand = aramMount("/res/Msg/itemres.arc");
    l_fmapResCommand = aramMount("/res/Msg/fmapres.arc");
    l_dmapResCommand = aramMount("/res/Msg/dmapres.arc");
    l_clctResCommand = aramMount("/res/Msg/clctres.arc");
    l_optResCommand = aramMount("/res/Msg/optres.arc");
    l_clothResCommand = aramMount("/res/Msg/clothres.arc");
    l_itemiconCommand = aramMount("/res/Msg/itemicon.arc");

#if VERSION == VERSION_PAL
    delete g_dComIfG_gameInfo.play.field_0x4820;
    char buf[40];
    sprintf(buf, "/res/Msg/data%d/acticon.arc", dComIfGs_getPalLanguage());
    l_actioniconCommand = aramMount(buf);
#else
    l_actioniconCommand = aramMount("/res/Msg/acticon.arc");
#endif

    l_scopeResCommand = aramMount("/res/Msg/scoperes.arc");
    l_camResCommand = aramMount("/res/Msg/camres.arc");
    l_swimResCommand = onMemMount("/res/Msg/swimres.arc");
    l_windResCommand = aramMount("/res/Msg/windres.arc");
    l_nameResCommand = aramMount("/res/Msg/nameres.arc");
    l_tmsgCommand = aramMount("/res/Msg/tmsgres.arc");
#if VERSION > VERSION_DEMO
    l_dmsgCommand = aramMount("/res/Msg/dmsgres.arc");
#endif
    l_errorResCommand = aramMount("/res/Msg/errorres.arc");
    l_saveResCommand = aramMount("/res/Msg/saveres.arc");

#if VERSION == VERSION_PAL
    sprintf(buf, "/res/Msg/data%d/bmgres.arc", dComIfGs_getPalLanguage());
    l_msgDtCommand = onMemMount(buf);
#else
    l_msgDtCommand = onMemMount("/res/Msg/bmgres.arc");
#endif

#if VERSION > VERSION_JPN
    l_msgDtCommand2 = onMemMount("/res/Msg/bmgresh.arc");
#endif
    l_msgCommand = aramMount("/res/Msg/msgres.arc");
    l_menuCommand = onMemMount("/res/Msg/menures.arc");
#if VERSION <= VERSION_JPN
    l_fontCommand = mDoDvdThd_mountXArchive_c::create("/res/Msg/fontres.arc", JKRArchive::MOUNT_DIRECTION_HEAD, JKRArchive::MOUNT_MEM);
#else
    l_fontCommand = onMemMount("/res/Msg/fontres.arc");
#endif
    l_rubyCommand = onMemMount("/res/Msg/rubyres.arc");
    l_particleCommand = mDoDvdThd_toMainRam_c::create("/res/Particle/common.jpc", JKRArchive::DEFAULT_MOUNT_DIRECTION, dComIfGp_particle_getCommonHeap());
    l_itemTableCommand = mDoDvdThd_toMainRam_c::create("/res/ItemTable/item_table.bin", JKRArchive::DEFAULT_MOUNT_DIRECTION, NULL);
    JUT_ASSERT(VERSION_SELECT(1342, 1418, 1743, 1783), l_itemTableCommand != NULL);
    l_ActorDataCommand = mDoDvdThd_toMainRam_c::create("/res/ActorDat/ActorDat.bin", JKRArchive::DEFAULT_MOUNT_DIRECTION, NULL);
    JUT_ASSERT(VERSION_SELECT(1346, 1422, 1747, 1787), l_ActorDataCommand != NULL);
    l_FmapDataCommand = mDoDvdThd_toMainRam_c::create("/res/FmapDat/FmapDat.bin", JKRArchive::DEFAULT_MOUNT_DIRECTION, NULL);
    JUT_ASSERT(VERSION_SELECT(1350, 1426, 1751, 1791), l_FmapDataCommand != NULL);
#if VERSION == VERSION_DEMO
    l_DmcMountCommand = DynamicModuleControl::mountCreate();
    JUT_ASSERT(VERSION_SELECT(1354, 1426, 1751, 1791), l_DmcMountCommand != NULL);
#endif

    mDoAud_loadStaticWaves();
    mDoGph_gInf_c::setTickRate((OS_BUS_CLOCK / 4) / 60);
    mDoGph_gInf_c::waitBlanking(0);
    mDoGph_gInf_c::startFadeIn(30);
    i_this->mTimer = 90;

#if VERSION > VERSION_JPN
    mDoRst::offReset();
    mDoRst::offResetPrepare();
#endif

#if VERSION > VERSION_DEMO
    JUTGamePad::clearResetOccurred();
    JUTGamePad::setResetCallback(mDoRst_resetCallBack, NULL);
#endif

    return cPhs_COMPLEATE_e;
}

/* 8022E9B4-8022E9F4       .text dScnLogo_Create__FP11scene_class */
static cPhs_State dScnLogo_Create(scene_class* i_scn) {
    static cPhs__Handler l_method[] = {
        (cPhs__Handler)phase_0,
        (cPhs__Handler)phase_1,
        (cPhs__Handler)phase_2,
    };

    dScnLogo_c * i_this = (dScnLogo_c *)i_scn;
    checkProgSelect(i_this);
    return dComLbG_PhaseHandler(&i_this->mPhs, l_method, i_this);
}

static scene_method_class l_dScnLogo_Method = {
    (process_method_func)dScnLogo_Create,
    (process_method_func)dScnLogo_Delete,
    (process_method_func)dScnLogo_Execute,
    (process_method_func)dScnLogo_IsDelete,
    (process_method_func)dScnLogo_Draw,
};

scene_process_profile_definition g_profile_LOGO_SCENE = {
    /* Layer ID     */ fpcLy_ROOT_e,
    /* List ID      */ 1,
    /* List Prio    */ fpcPi_CURRENT_e,
    /* Proc Name    */ fpcNm_LOGO_SCENE_e,
    /* Proc SubMtd  */ &g_fpcNd_Method.base,
    /* Size         */ sizeof(dScnLogo_c),
    /* Size Other   */ 0,
    /* Parameters   */ 0,
    /* Node SubMtd  */ &g_fopScn_Method.base,
    /* Scene SubMtd */ &l_dScnLogo_Method,
};
