#include "sprites.h"

void SamusFall(Co co);
void SamusWalkLeft(Co co);
void SamusWalkRight(Co co);
void SamusJump(Co co);

void SamusFall(Co co)
{
    if (SBtm(co,samus) == ' ')
    SGoBtm(co,samus);

    if (Pressed(co,'a'))
    Next(co,SamusWalkLeft);
    else if (Pressed(co,'d'))
    Next(co,SamusWalkRight);
    else if (SBtm(co,samus) == ' ')
    Next(co,SamusFall);
    else
    Next(co,MtrdSamus);

    SStamp(co,samus,Ninja,CR);
    SprFocus(co,samus);
}

void SamusWalkLeft(Co co)
{
    if (Stm(co,samus) == 0)
    Next(co,SamusFall);
    else 
    if (SLft(co,samus) == ' ')
    {
        SGoLft(co,samus);

        if (Pressed(co,'s'))
        Next(co,SamusFall);
        else if (Pressed(co,'w'))
        Next(co,SamusJump);
        else if (Pressed(co,'d'))
        Next(co,SamusWalkRight);
        else
        Next(co,SamusWalkLeft);
    }
    else
    Next(co,SamusFall);

    const Let chr[] = {Ninja,Pixel,Pixel,0};
    const Let color[] = {CR,Red,Red, 0};
    const Let * sprite[] = {
        color,
        chr,
        "!__",
        0
    };
    SSPrnt(co,SCol(co,samus),SRow(co,samus),sprite,0);

    SStamp(co,samus,Ninja,CR);
    SprFocus(co,samus);
}
void SamusWalkRight(Co co)
{
    if (Stm(co,samus) == 0)
    Next(co,SamusFall);
    else 
    if (SRgt(co,samus) == ' ')
    {
        SGoRgt(co,samus);

        if (Pressed(co,'s'))
        Next(co,SamusFall);
        else if (Pressed(co,'w'))
        Next(co,SamusJump);
        else if (Pressed(co,'a'))
        Next(co,SamusWalkLeft);
        //else
        //Next(co,SamusWalkRight);
    }
    else
    Next(co,SamusFall);

    const Let chr[] = {Pixel,Pixel,0};
    const Let color[] = {Red,Red, 0};
    const Let * sprite[] = {
        color,
        chr,
        "__!",
        0
    };
    SSPrnt(co,SCol(co,samus),SRow(co,samus),sprite,0);

    SStamp(co,samus,Ninja,CR);
    SprFocus(co,samus);
}
void SamusJump(Co co)
{
    if (SAbv(co,samus) != ' ')
    Next(co,SamusFall);
    else if (Stm(co,samus) == 0)
    Next(co,SamusFall);
    else
    {
        if (Pressed(co,'s'))
        Next(co,SamusFall);
        else if (Pressed(co,'a'))
        Next(co,SamusWalkLeft);
        else if (Pressed(co,'d'))
        Next(co,SamusWalkRight);
        else
        Next(co,SamusJump);

        SGoAbv(co,samus);

        const Let chr[] = {Ninja,Pixel,Pixel,0};
        const Let color[] = {CR,Red,Red, 0};
        const Let * sprite[] = {
            color,
            chr,
            "!",
            "_",
            "_",
            0
        };
        SSPrnt(co,SCol(co,samus),SRow(co,samus),sprite,0);
    }

    SStamp(co,samus,Ninja,CR);
    SprFocus(co,samus);
}
void MtrdSamus(Co co)
{
    if (SBtm(co,samus) == ' ')
    Next(co,SamusFall);
    else if (Pressed(co,'w'))
    {
    Stms(co,samus,5);
    Next(co,SamusJump);
    }
    else if (Pressed(co,'a'))
    {
    Stms(co,samus,5);
    Next(co,SamusWalkLeft);
    }
    else if (Pressed(co,'d'))
    {
    Stms(co,samus,5);
    Next(co,SamusWalkRight);
    }

    SStamp(co,samus,Ninja,CR);
    SprFocus(co,samus);
}

/*

on solid
--add mmt
            [jmp]
              ^
              |
    [bwd]<-[stand]->[fwd]
              ^
              |
            [fall]

not on solid

            [stand]
               |
               v
     [bwd]<-[fall]->[fwd]
               |
               V
            [fall]

while mmt


   [stand]<-[fwd]->[run?]       
              |
              v
            [fwd]

            [bwd]->
              |
              v
            [bwd]

            [jmp]->
              |
              v
            [jmp]


*/

