#include "commun.h"

int objetsUtilises = 0;
SPRITE_GBA sprGba[MAX_SPRITES_GBA] EWRAM_DATA;        //Sprites hardware.
unsigned int nSprGba, n_tile;

//Place l'objet aux positions définies en tenant compte du scrolling.
void PositionRelativeObjet16x16(int posX, int posY, int x, int y, int *resultatX, int *resultatY)
{
        int i, j;
        i = posX - x;
        if (i > 240)
                i = 240;
        if (i < 0 && i > -16)
                i = 512 + i;
        j = posY - y;
        if (j > 160)
                j = 160;
        if (j < 0 && j > -16)
                j = 256 + j;
        if (i < 0)
                i = 240;
        if (j < 0)
                j = 160;
        *resultatX = i;
        *resultatY = j;
}

//Initialise le système de sprites

/*inline void ReInitSysSprites()       {
    nSprGba=0;
}*/
//unsigned int ((*pAjSprite)(const unsigned char *, unsigned short))=AjSprite;

//unsigned int ((*pAjSpriteRapide)(const unsigned char *, unsigned short))=AjSpriteRapide;
void ExecSprScriptEx2(u32 x, u32 y, const u8 *tiles, const SCRIPT_BLOCK *s, u32 palette, u16 alpha, u16 prio)
{
        u32 i, tilebase, offset;
        const SPRITE_SCRIPT *spt = s->script;
        offset = spt->numTile;
        tilebase = ExecFct(AjSprite, tiles + 8 * 4 * offset, s->tileLen * 8 * 8);
        for (i = 0; i < s->sptLen; i++)
        {
                CreeObjetStandardEx(x + spt[i].offsetX,
                                                        y + spt[i].offsetY,
                                                        alpha,
                                                        prio,
                                                        0,
                                                        0,
                                                        tilebase + spt[i].numTile - offset,
                                                        palette,
                                                        spt[i].forme,
                                                        spt[i].taille);
        }
}

void ExecSprScript(u32 x, u32 y, const u8 *tiles, const SCRIPT_BLOCK *s, u32 palette)
{
        u32 i, tilebase, offset;
        const SPRITE_SCRIPT *spt = s->script;
        offset = spt->numTile;
        tilebase = ExecFct(AjSprite, tiles + 8 * 4 * offset, s->tileLen * 8 * 8);
        for (i = 0; i < s->sptLen; i++)
        {
                CreeObjetStandard(x + spt[i].offsetX,
                                                  y + spt[i].offsetY,
                                                  tilebase + spt[i].numTile - offset,
                                                  palette,
                                                  spt[i].forme,
                                                  spt[i].taille);
        }
}

const u16 slargeurs[3][4] = { { 8, 16, 32, 64 }, { 16, 32, 32, 64 }, { 8, 8, 16, 32 }, };

const u16 shauteurs[3][4] = { { 8, 16, 32, 64 }, { 8, 8, 16, 32 }, { 16, 32, 32, 64 }, };

void ExecSprScriptEx(
        PERSO *p,
        const u8 *tiles,
        const SCRIPT_BLOCK *s,
        u32 palette,
        u16 alpha,
        u16 prio,
        u16 mh,
        u16 mv)
{
        u32 i, tilebase, offset, x, y;
        const SPRITE_SCRIPT *spt = s->script;
        offset = spt->numTile;
        tilebase = ExecFct(AjSprite, tiles + 8 * 4 * offset, s->tileLen * 8 * 8);
        for (i = 0; i < s->sptLen; i++)
        {
                if (mh)
                        x = (p->x + p->largeur) - spt[i].offsetX - slargeurs[spt[i].forme][spt[i].taille];
                else
                        x = p->x + spt[i].offsetX;

                //MV pas testé
                if (mv)
                        y = (p->y + p->hauteur) - spt[i].offsetY - shauteurs[spt[i].forme][spt[i].taille];
                else
                        y = p->y + spt[i].offsetY;

                //        if (mv) y=p->hauteur-y;
                CreeObjetStandardEx(x,
                                                        y,
                                                        alpha,
                                                        prio,
                                                        mh,
                                                        mv,
                                                        tilebase + spt[i].numTile - offset,
                                                        palette,
                                                        spt[i].forme,
                                                        spt[i].taille);
        }
}

void ExecSprScriptExPlus(
        u32 x,
        u32 y,
        u32 largeur,
        u32 hauteur,
        const char *tiles,
        const SCRIPT_BLOCK *s,
        u32 palette,
        u16 alpha,
        u16 prio,
        u16 mh,
        u16 mv)
{
        u32 i, tilebase, offset, xx, yy;
        const SPRITE_SCRIPT *spt = s->script;
        offset = spt->numTile;
        tilebase = ExecFct(AjSprite, tiles + 8 * 4 * offset, s->tileLen * 8 * 8);
        for (i = 0; i < s->sptLen; i++)
        {
                if (mh)
                        xx = (x + largeur) - spt[i].offsetX - slargeurs[spt[i].forme][spt[i].taille];
                else
                        xx = x + spt[i].offsetX;

                //MV pas testé
                if (mv)
                        yy = (y + hauteur) - spt[i].offsetY - shauteurs[spt[i].forme][spt[i].taille];
                else
                        yy = y + spt[i].offsetY;

                //        if (mv) y=p->hauteur-y;
                CreeObjetStandardEx(xx,
                                                        yy,
                                                        alpha,
                                                        prio,
                                                        mh,
                                                        mv,
                                                        tilebase + spt[i].numTile - offset,
                                                        palette,
                                                        spt[i].forme,
                                                        spt[i].taille);
        }
}
