#include "commun.h"
#include "routines.h"
#include "texte.h"

#include "tilesystem.h"
#include "sprites.h"
#include "curseur.h"
#include "infos.h"
#include "aide.h"


ZONE_TEXTE zt_debug={buffer_debug,30,8};
u16 IN_EWRAM buffer_debug[30*8*16], buffer_infos[30*20*16];

const char *laide="©S1©C2©G1©I1Map interactive©G0©C1©I0©S0\n\nBienvenue dans la ©G1map interactive©G0 pour la ©C3©G1Game Boy Advance de Nintendo©G0.©C1\n"
"Ceci vous permettra #Ptest# de \"visiter\" le bâtiment de l'EMVs et de voir les projets présentés dans les diverses salles.\n\nUtilisez les touches directionnelles pour déplacer le curseur (la main) sur l'écran."
" Les zones et les salles pour lesquelles des informations sont diponibles sont marquées d'un point bleu."
" Lorsque vous touchez ce point, vous pouvez appuyer sur A pour placer le curseur dans la boîte d'informations et sélectionner le projet désiré à l'aide des touches directionnelles et du bouton A.\n"
"\nD'une manière générale, le bouton A est utilisé pour ©C4valider©C1 un choix et le bouton B pour ©C3annuler©C1. R fait apparaître un menu d'©C2aide contextuelle©C1.\n"
"\nA présent, vous pouvez appuyer sur B pour retourner à l'écran carte.";

int nFrame;

void Main_EffetsPalette()           {
    int i,j;
    
    PaletteObj[21]=RGB(nFrame&31,31-(nFrame&31),0);
    PaletteObj[22]=RGB(24+(nFrame&31)/4,31-(nFrame&31)/4,24-(nFrame&31)*3/4);
    PaletteObj[23]=RGB(31,31,31-(nFrame&31));

    i=nFrame&63;
    if (i>=32)      {
        i-=32;
        j=32-i;
        Palette[196]=RGB((i*couleurs[5][0]+j*couleurs[4][0])>>5,(i*couleurs[5][1]+j*couleurs[4][1])>>5,(i*couleurs[5][2]+j*couleurs[4][2])>>5);
//        Palette[196]=RGB(31,31-i,0);
    }
    else        {
        j=i;
        i=32-i;
        Palette[196]=RGB((i*couleurs[5][0]+j*couleurs[4][0])>>5,(i*couleurs[5][1]+j*couleurs[4][1])>>5,(i*couleurs[5][2]+j*couleurs[4][2])>>5);
//        Palette[196]=RGB(31,i,0);
    }
}

u32 action=0, ancienRegTouches;

int main(void)
{
    char str[100];
    int i, maj_requise=0;
    int transp=0, zero=0, pauseActive=0;
    CURSEUR curs;
    ECRAN ecr;
    SPRITE_PARAM sprParam;
    INFO *info=NULL, *lastInfo=NULL;
    int TOUCHES;

    InitFS();

    InitEcran(&ecr);
    init_sound();
    ModeSon(1);                             //Mode interne, là c'est pour la carte

    nFrame=0;
    
    InitCouleurs();
    
    SRAM_ChargeTout();

    if (numero_musique<0 || numero_musique>=sizeof(musiques)/sizeof(musiques[0]))
        numero_musique=0;
    JoueMusique((char*)musiques[numero_musique]);
    
    REG_WSCNT=0x4317;                   //Booste la ROM (recommandé)
//    REG_WSRAM=0x0E000020;               //Booste la RAM (non-recommandé, dangereux)

reset_systeme:
    //Vidage complet de la mémoire vidéo
    MemSet(&zero,CharBaseBlock(0),16384,DMA_32im);
    
    //Valeur hyper-lentes pour tester
//    REG_WSCNT=0x000c;
//    REG_WAITRAM=0x01000020;

    REG_DISPCNT = (VIDEO_MODE0 | VIDEO_BG0_ENABLED | VIDEO_BG1_ENABLED | VIDEO_BG3_ENABLED | OBJ_ENABLED | 0x40);
    REG_BG0CNT = BG_TEXTE_256x256 | BG_1_PALETTE | BG_WRAP | 31<<8 | 3;
    REG_BG1CNT = BG_TEXTE_256x256 | BG_16_PALETTES | BG_WRAP | 30<<8 | 1 | BG_CHARBLOCK_2;
    //Debug only
    REG_BG3CNT = BG_TEXTE_256x256 | BG_16_PALETTES | BG_WRAP | 29<<8 | 0 | BG_CHARBLOCK_2;

    //192 couleurs par défaut
    CopieDMA((void*)plan_palette,Palette,192,DMA_16im);

    InitTileSystem();                           //Pourquoi je nomme cette fonction en anglais?
    InitSprites();
    InitCurseur(&curs);
    InitBteDialogue();
    CopieDMA((void*)point_palette,nPalObj(1),16,DMA_16im);

    Palette[0]=RGB(31,31,31);

    EffaceScreenBlock(29);
    PrepareMap(ScreenBaseBlock(29),0,0,512,30,8);
    ChangePaletteMap(ScreenBaseBlock(29),0,0,30,8,12);

    EffaceScreenBlock(30);
    PrepareMap(ScreenBaseBlock(30),0,0,0,16,8);
    ChangePaletteMap(ScreenBaseBlock(30),0,0,16,8,12);

    SelectZoneTexte(&zt_debug);

    lastInfo=NULL;

    //Sauve le nombre d'objets utilisés jusqu'à maintenant
    SauveSpriteParam(&sprParam);
    
    ancienRegTouches=REG_TOUCHES;
    
    ChangeCouleursBteDialogue();

    while(1)        {
        GereCurseur(&curs,&ecr);

        //Initialisation de mon système de tiles
        depassement=0;
        //Utilisation de mon moteur de tiles optimisé
        Exec(CopieMap,ecr.x>>3,ecr.y>>3,200,122);

        RestoreSpriteParam(&sprParam,1);

        //Cette petite manipulation permet de ne récupérer que les touches qui viennent d'être préssées (de passer à 1)
        TOUCHES=(REG_TOUCHES)&~ancienRegTouches;
        ancienRegTouches=REG_TOUCHES;
        
        if (TOUCHES&TOUCHE_R && !maj_requise)       {
            JoueSon("curs2.son");
            LTMain("aide.txt");
            maj_requise=1;
            goto reset_systeme;
        }

        if (TOUCHES&TOUCHE_START && !maj_requise /*&& transp==16*/)          {
            MemSet((void*)&zero,(void*)CharBaseBlock(2)+32,16*16*10,DMA_16im);
            if (!pauseActive)
                DessineInfo(&evPause,-1);
            pauseActive=1;
        }
        
        if (pauseActive)        {
            PlaceBteDialogue(60,40);
            endroit_x=60, endroit_y=40;
        }

        info=TesteInfos(&curs);
        AffichePoints(&curs,&ecr,info);
        
        if (info && !pauseActive)       {
            if (transp==0 || lastInfo!=info || (maj_requise && transp==16))     {
                DessineInfo(&evenements[info->event],-1);
            }
            
            if (transp==15 || (maj_requise && transp==16) || (lastInfo!=info && transp==16))
                CopieDMA((void*)buffer_infos,(void*)CharBaseBlock(2)+32,16*16*10,DMA_16im);
            if (transp<16)
                transp++;
        }
        else    {
            MemSet((void*)&zero,(void*)CharBaseBlock(2)+32,16*16*10,DMA_16im);
            if (transp>0 && !pauseActive)
                transp--;
        }
        lastInfo=info;

        if (bCPUMetre)      {
            ChangeFonte(Verdana);
            SelectZoneTexte(&zt_debug);
            EffaceZone(&zt_debug);
            sprintf(str,"CPU: %i%%",UtilCPU()/10);
            DessTexte(0,0,str,1);
        }

        //Attend la fin du retracement de l'écran
        AttendVSync();

        InitTimers();

        //Applique les coefficients de défilement sur le BG0
        REG_BG0HOFS=ecr.x&7;
        REG_BG0VOFS=ecr.y&7;
        //Copie la map virtuelle du BG0 vers la map matérielle
        CopieDMA0((void*)tableau,(void*)ScreenBaseBlock(31),(32*22)>>1,DMA_32im);

        if (PlaceMiniMessage(0)==0)      {               //Afficheur de message tout en bas?
            CopieDMA((void*)buffer_debug,(void*)CharBaseBlock(3)+32,sizeof(buffer_debug)>>1,DMA_16im);
            if (bCPUMetre)
                REG_BG3VOFS=0;
        }

replaceBoite:
        //Travail relatif au coefficient d'alpha-blend et du placement de la fenêtre
        if (transp!=0)      {
            i=(1<<11)/(transp);
            rotData[0].pa=i;
            rotData[0].pd=(i*64*2)/(y_ww);
            if (!pauseActive)
                PlacementBteDialogue(&curs,&ecr,transp==1?1:0);
        }
        else        {
            PlaceBteDialogue(240,160);
        }
        
        Main_EffetsPalette(nFrame);

        if (bTransp)
            REG_COLEV = (transp>>1) + ((16-(transp>>1)) << 8);
        else
            REG_COLEV = transp + ((16-transp) << 8);

        //Copie le tableau des attributs des sprites virtuels vers les sprites matériels
        CopieDMA0(MonOAM,pOAM,1024>>2,DMA_32im);
        nFrame++;

        if (pauseActive)        {
            if (transp>=16)      {
                if (action==1)
                    REG_COLEV=0;
                else
                    JoueSon("curs2.son");
                SelectionneProjet(&curs,&evPause);
                SRAM_SauveTout();
                RetourneObjetH_Non(curs.no_sprite);
                action=0;
                maj_requise=0;
                pauseActive=0;
                MemSet((void*)&zero,(void*)CharBaseBlock(2)+32,16*16*10,DMA_16im);
                if (info)       {
                    transp=15;
                    DessineInfo(&evenements[info->event],-1);
                    PlacementBteDialogue(&curs,&ecr,0);
                    goto replaceBoite;
                }
                else
                    transp=0;
            }
            else
                transp=16;
        }

        if ((TOUCHES&TOUCHE_A && !maj_requise && info && nEvenement && transp==16) || action==1)          {
            if (action==1)
                REG_COLEV=0;
            else
                JoueSon("curs2.son");
            if (SelectionneProjet(&curs,&evenements[info->event]))          {
                maj_requise=1;
                action=1;
                goto reset_systeme;
            }
            else        {
                //Annule la sélection
                DessineInfo(&evenements[info->event],-1);
                //Copie sur l'écran
                CopieDMA((void*)buffer_infos,(void*)CharBaseBlock(2)+32,16*16*10,DMA_16im);
                //Replace la main à l'endroit
                RetourneObjetH_Non(curs.no_sprite);
                action=0;
                maj_requise=0;
            }
        }

        FadeOut();
        REG_BLDMOD = 0x2f10;

        maj_requise=0;
    }
    
    return 0;
}


/* END OF FILE */

