#ifndef SPIEL
#define SPIEL
#include "co.h"
#include "engine.h"

#define Boundary 10000
enum SpriteStack {
    Sprites=64,           //nes master genesis tg16 sprites limit xD
    SSEnd=Sprites/2,
    SSBegin=Sprites-2,
    SpriteStackPointer=Sprites-1
};

typedef Cnt Xs[Sprites];
typedef Cnt Ys[Sprites];
typedef Routine Rs[Sprites];
typedef Let Ts[Sprites];

typedef struct Spr {
    const Let ** map;
    Cnt x;
    Cnt y;
    Cnt w;
    Cnt h;
    Let ss;
    Rs rs; // routine associated to sprite
    Xs xs;
    Ys ys;
    //Ts ts; // id like to deprecate this, tmp sprite dont need while they have rs
} Spr; // sizeof(Spr) => 459 bytes on 8/16bits arch (53 bytes til 512)

Spr SNew();

void SActr(Co);
void SNext(Co,Let,Routine);
Let SSReq(Co);
void SSFlush(Co);
void SprFocus(Co,Let);
void SMove(Co,Let,Cnt,Cnt);
//Let Stm(Co,Let);
Cnt SCol(Co,Let);
Cnt SRow(Co,Let);

void SDrw(Co,Let**);
void SXpmDrw(Co,char**);

void SLvl(Co,Let *, Let *);
Let SAt(Co,Cnt,Cnt);
void Say(Co,Let*,Let,Let,Color);
//Let SSnake(Co, Let,Let,Cnt,Cnt,Color,Let);
void SSPrnt(Co,Cnt,Cnt,Let**,Let);
void SPlot(Co,Let,Let,Cnt,Cnt,Color);
void SStamp(Co,Let,Let,Color);
Let SLft(Co,Let);
Let SRgt(Co,Let);
Let SAbv(Co,Let);
Let SBtm(Co,Let);
void SGoLft(Co,Let);
void SGoRgt(Co,Let);
void SGoAbv(Co,Let);
void SGoBtm(Co,Let);

Let Clock(Co);
Let Pressed(Co,Let);

#endif
