#include <gb.h>
#include <stdio.h>          //für printf, ...
#include <console.h>        //für gotoxy, ...

void printmen();
void zeichen();
void eingabe();
void tilesbsp();
void tilesbsp2();
void hilfe();

int borderlo = 28;
int borderro = 29;
int borderlu = 30;
int borderru = 31;
int borderh = 14;
int borderv = 15;
int pfeilo = 1;
int pfeilu = 2;
int pfeill = 3;
int pfeilr = 4;
unsigned int copyright = 189;

unsigned char border[] =
{ //0 links oben
  0xFF,0xFF,0x80,0xFF,0xBF,0xC0,0xA0,0xC0,
  0xA0,0xC0,0xA0,0xC0,0xA0,0xC0,0xA0,0xC0,
  //1 rechts oben
  0xFF,0xFF,0x01,0xFF,0xFD,0x03,0x05,0x03,
  0x05,0x03,0x05,0x03,0x05,0x03,0x05,0x03,
  //2 links unten
  0xA0,0xC0,0xA0,0xC0,0xA0,0xC0,0xA0,0xC0,
  0xA0,0xC0,0xBF,0xC0,0x80,0xFF,0xFF,0xFF,
  //3 rechts unten
  0x05,0x03,0x05,0x03,0x05,0x03,0x05,0x03,
  0x05,0x03,0xFD,0x03,0x01,0xFF,0xFF,0xFF,
  //4 mitte horizontal
  0x00,0x00,0xFF,0x00,0x00,0xFF,0xFF,0xFF,
  0xFF,0xFF,0x00,0xFF,0xFF,0x00,0x00,0x00,
  //5 links mitte horizontal
  0xA0,0xC0,0xBF,0xC0,0x80,0xFF,0xFF,0xFF,
  0xFF,0xFF,0x80,0xFF,0xBF,0xC0,0xA0,0xC0,
  //6 rechts mitte horizontal
  0x05,0x03,0xFD,0x03,0x01,0xFF,0xFF,0xFF,
  0xFF,0xFF,0x01,0xFF,0xFD,0x03,0x05,0x03,
  //7 oben
  0xFF,0xFF,0x00,0xFF,0xFF,0x00,0x00,0x00,
  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  //8 unten
  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  0x00,0x00,0xFF,0x00,0x00,0xFF,0xFF,0xFF,
  //9 rechts
  0x05,0x03,0x05,0x03,0x05,0x03,0x05,0x03,
  0x05,0x03,0x05,0x03,0x05,0x03,0x05,0x03,
  //10 links
  0xA0,0xC0,0xA0,0xC0,0xA0,0xC0,0xA0,0xC0,
  0xA0,0xC0,0xA0,0xC0,0xA0,0xC0,0xA0,0xC0,
  //11 unten mitte vertikal
  0x5A,0x3C,0x5A,0x3C,0x5A,0x3C,0x5A,0x3C,
  0x5A,0x3C,0xDB,0x3C,0x18,0xFF,0xFF,0xFF,
  //12 oben mitte vertikal
  0xFF,0xFF,0x18,0xFF,0xDB,0x3C,0x5A,0x3C,
  0x5A,0x3C,0x5A,0x3C,0x5A,0x3C,0x5A,0x3C,
  //13 mitte vertikal
  0x5A,0x3C,0x5A,0x3C,0x5A,0x3C,0x5A,0x3C,
  0x5A,0x3C,0x5A,0x3C,0x5A,0x3C,0x5A,0x3C
};

unsigned char smile[] =
{ //Smile Sprite
  0x3C,0x3C,0x42,0x42,0x81,0xA5,0x81,0x91,
  0x81,0x85,0x81,0xB9,0x42,0x42,0x3C,0x3C,               
};

unsigned char smile2[] =
{ //smile :|
  0x3C,0x3C,0x42,0x42,0x81,0xA5,0x81,0x91,
  0x81,0x85,0x81,0xB9,0x42,0x42,0x3C,0x3C,
  //smile :)
  0x3C,0x3C,0x42,0x42,0x81,0xA5,0x81,0x91,
  0x81,0x81,0x81,0x99,0x42,0x42,0x3C,0x3C
};

unsigned char figur[] =
{ //Tile 0
  0x00,0x00,0x38,0x38,0x7C,0x44,0x7F,0x7F,
  0x44,0x74,0x46,0x7C,0x40,0x78,0x24,0x3C,
  //Tile 1
  0x18,0x3C,0x00,0x24,0x00,0x24,0x00,0x24,
  0x00,0x24,0x00,0x36,0x00,0x00,0x00,0x00,
  //Tile 2
  0x00,0x00,0x38,0x38,0x7C,0x44,0x7F,0x7F,
  0x44,0x74,0x46,0x7C,0x40,0x78,0x24,0x3C,
  //Tile 3
  0x18,0x3C,0x00,0x22,0x00,0x22,0x00,0x22,
  0x00,0x23,0x00,0x30,0x00,0x00,0x00,0x00,
  //Tile 4
  0x00,0x00,0x38,0x38,0x7C,0x44,0x7F,0x7F,
  0x44,0x74,0x46,0x7C,0x40,0x78,0x24,0x3C,
  //Tile 5
  0x18,0x3C,0x00,0x42,0x00,0x42,0x00,0x42,
  0x00,0x42,0x00,0x63,0x00,0x00,0x00,0x00,
  //Tile 6
  0x00,0x00,0x38,0x38,0x7C,0x44,0x7F,0x7F,
  0x44,0x74,0x46,0x7C,0x40,0x78,0x24,0x3C,
  //Tile 7
  0x18,0x3C,0x00,0x44,0x00,0x44,0x00,0x44,
  0x00,0x64,0x00,0x06,0x00,0x00,0x00,0x00
};

void main()
{   int i=0;
    char ende=0;
    
    printmen();                             //Menü ausgeben
    gotoxy(2,i+2);                          //Pfeil ausgeben
    setchar (0x3);
    
    while (!ende)                           //Solange nicht Ende gewählt
    {   switch (joypad())                   //je nach Taste
        {   case (J_UP):                    //Hinauf, Zeiger nach oben
            {   gotoxy(2,i+2);              //ausser überlauf
                setchar (' ');
                i--;
                if (i==-1)
                    i = 5;
                gotoxy(2,i+2);
                setchar (0x3);
                delay(200);
                break;
            }
            case (J_DOWN):                  //Hinunter, Zeiger nach unten
            {   gotoxy(2,i+2);              //ausser überlauf
                setchar (' ');
                i++;
                if (i==6)
                    i = 0;
                gotoxy(2,i+2);
                setchar (0x3);
                delay(200);
                break;
            }
            case (J_A):                     //Funktion wird aufgerufen
            {   switch (i)                  //je nach Position eine andere
                {   case (0):
                    {   zeichen();          //Funktion
                        cls();              //danach clear Screen
                        printmen();         //Menü und Cursor neu ausgeben
                        gotoxy(2,i+2);
                        setchar (0x3);
                        break;
                    }
                    case (1):
                    {   eingabe();
                        cls();
                        printmen();
                        gotoxy(2,i+2);
                        setchar (0x3);
                        break;
                    }
                    case (2):
                    {   tilesbsp();
                        cls();
                        printmen();
                        gotoxy(2,i+2);
                        setchar (0x3);
                        break;
                    }
                    case (3):
                    {   tilesbsp2();
                        cls();
                        printmen();
                        gotoxy(2,i+2);
                        setchar (0x3);
                        break;
                    }
                    case (4):
                    {   hilfe();
                        cls();
                        printmen();
                        gotoxy(2,i+2);
                        setchar (0x3);
                        break;
                    }
                    default:
                    {   ende = 1;           //Ende angewählt
                    }
                }
            }
        }
    }
    cls();                                  //am Ende Copyright ausgeben
    gotoxy(0,4);
    printf ("       %c WeDi\n\n\n\n", copyright);
    printf (" http://members.aon.\n at/werner.dichler");
}

void printmen()                             //Menü ausgeben
{   gotoxy(0,0);
    printf ("%c%c%c%c%c", borderlo, borderh, borderh, borderh, borderh);
    printf ("%c%cMenue%c%c%c", borderh, borderh, borderh, borderh, borderh);
    printf ("%c%c%c%c%c%c", borderh, borderh, borderh, borderh, borderro);
    gotoxy(0,1);
    printf ("%c                  %c", borderv, borderv);
    printf ("%c     Zeichen      %c", borderv, borderv);
    printf ("%c     EingabeBsp   %c", borderv, borderv);
    printf ("%c     TilesBsp     %c", borderv, borderv);
    printf ("%c     TilesBsp2    %c", borderv, borderv);
    printf ("%c     Hilfe        %c", borderv, borderv);
    printf ("%c     Ende         %c", borderv, borderv);
    printf ("%c                  %c", borderv, borderv);
    printf ("%c                  %c", borderv, borderv);
    printf ("%c                  %c", borderv, borderv);
    printf ("%c                  %c", borderv, borderv);
    printf ("%c                  %c", borderv, borderv);
    printf ("%c                  %c", borderv, borderv);
    printf ("%c                  %c", borderv, borderv);
    printf ("%c                  %c", borderv, borderv);
    printf ("%c                  %c", borderv, borderv);
    printf ("%c%c%c%c%c", borderlu, borderh, borderh, borderh, borderh);
    printf ("%c%c%c%c%c", borderh, borderh, borderh, borderh, borderh);
    printf ("%c%c%c%c%c", borderh, borderh, borderh, borderh, borderh);
    printf ("%c%c%c%c", borderh, borderh, borderh, borderh);
    setchar (borderru);
}

void zeichen()
{   int key=0;
    unsigned int x=0;
    int ende=0;
    
    cls();                                  //Umrandung ausgeben
    gotoxy(0,0);
    printf ("%c%c%cZeichenausgabe", borderlo, borderh, borderh);
    printf ("%c%c%c", borderh, borderh, borderro);
    printf ("%c                  %c", borderv, borderv);
    printf ("%c                  %c", borderv, borderv);
    printf ("%c                  %c", borderv, borderv);
    printf ("%c                  %c", borderv, borderv);
    printf ("%c                  %c", borderv, borderv);
    printf ("%c                  %c", borderv, borderv);
    printf ("%c                  %c", borderv, borderv);
    printf ("%c                  %c", borderv, borderv);
    printf ("%c                  %c", borderv, borderv);
    printf ("%c                  %c", borderv, borderv);
    printf ("%c                  %c", borderv, borderv);
    printf ("%c                  %c", borderv, borderv);
    printf ("%c                  %c", borderv, borderv);
    printf ("%c                  %c", borderv, borderv);
    printf ("%c                  %c", borderv, borderv);
    printf ("%c                  %c", borderv, borderv);
    printf ("%c%c%c%c%c", borderlu, borderh, borderh, borderh, borderh);
    printf ("%c%c%c%c%c", borderh, borderh, borderh, borderh, borderh);
    printf ("%c%c%c%c%c", borderh, borderh, borderh, borderh, borderh);
    printf ("%c%c%c%c", borderh, borderh, borderh, borderh);
    setchar (borderru);
    gotoxy(3,13);
    printf ("%c ... naechstes", pfeilo);
    gotoxy(3,14);
    printf ("%c ... letztes", pfeilu);
    gotoxy(3,15);
    printf ("S ... Menue");
    
    gotoxy(4,4);
    printf ("%u - %c", x, x);
    
    while ((key=joypad()) != J_START)       //solange nicht Start gedrückt
    {   switch (key)                        //je nach Taste
        {   case (J_UP):                    //Hinauf --> Zähler inkrementieren
            {   x++;                        //           u. zugehörige Zeichen
                gotoxy(4,4);                //           ausgeben
                if (x!=10)
                    printf ("%u - %c     ", x, x);
                else
                    printf ("10 - nl    ");
                delay(200);
                break;
            }
            case (J_DOWN):                  //Hinab --> Zähler dekrementieren
            {   x--;                        //          ...
                gotoxy(4,4);
                if (x!=10)
                    printf ("%u - %c     ", x, x);
                else
                    printf ("10 - nl    ");
                delay(200);
                break;
            }
        }
    };
}

void eingabe()
{   char name[10];

    cls();
    printf ("Name: ");                      //Testen der Eingabe des GBs
    gets (name);
    printf ("\n\n Guten Tag %s", name);
    delay(200);
    while (joypad() != J_START)
    {};
}

void tilesbsp()
{   int i=0;
    unsigned char borderlo[] = {242};       //Tile Position
    unsigned char borderro[] = {243};
    unsigned char borderlu[] = {244};
    unsigned char borderru[] = {245};
    unsigned char bordero[] = {249};
    unsigned char borderu[] = {250};
    unsigned char borderr[] = {251};
    unsigned char borderl[] = {252};
    cls();
    SPRITES_8x8;
    set_bkg_data(242,14,border);            //StartPosition, Anzahl, Daten

    set_bkg_tiles(0,0,1,1,borderlo);        //x, y, w, h, welches Tile
    set_bkg_tiles(19,0,1,1,borderro);
    set_bkg_tiles(0,17,1,1,borderlu);
    set_bkg_tiles(19,17,1,1,borderru);
    for (i=1; i<19; i++)
    {   set_bkg_tiles(i,0,1,1,bordero);
    }
    for (i=1; i<19; i++)
    {   set_bkg_tiles(i,17,1,1,borderu);
    }
    for (i=1; i<17; i++)
    {   set_bkg_tiles(19,i,1,1,borderr);
    }
    for (i=1; i<17; i++)
    {   set_bkg_tiles(0,i,1,1,borderl);
    }
    
    SHOW_BKG;
    delay(1000);
    
    set_sprite_data (0,1,smile);            //StartPosition, Anzahl, Daten
    set_sprite_data (1,2,smile2);
    
    set_sprite_tile(0,0);                   //TileNr0 wird zu TileNr0 vom Sprite
    set_sprite_tile(1,1);
    set_sprite_tile(2,2);
    
    move_sprite(0,0,0);                     //TileNr, x, y
    SHOW_SPRITES;
    
    for (i=0; i<20; i++)
    {   move_sprite(0,i*8,i*8);             //Smile links oben --> rechts unten
        delay(200);
    }
    move_sprite(0,0,0);
    
    while (joypad() != J_START)
    {   delay(200);
        move_sprite(1,200,200);
        move_sprite(2,75,75);

        delay(200);
        move_sprite(2,200,200);
        move_sprite(1,75,75);
    };
    
    move_sprite(1,200,200);
    move_sprite(2,200,200);
}

void tilesbsp2()
{   int spr=0;
    int x=15;
    int y=75;

    cls();
    SPRITES_8x16;                           //8x16 mode

    set_sprite_data(0, 8, figur);
    set_sprite_tile(0,spr);
    move_sprite(0,x,y);
    SHOW_SPRITES;

    while(joypad()!=J_START)                //solange nicht Start gedrückt
    {   if(joypad()==J_RIGHT)        
        {   x++; 
            spr+=2;
            if(spr==8)
                spr=0;
            set_sprite_tile(0,spr);
            set_sprite_prop(0,0);           //Einstellungen auf Normal
            move_sprite(0,x,y);
            delay(75);
        }

        if(joypad()==J_LEFT)
        {   x--;
            spr+=2;
            if(spr==8)
                spr=0;
            set_sprite_tile(0,spr);
                                            //flipx Bit des 0ten Sprites mit 1
                                            //verODERn --> Horizontal tauschen
            set_sprite_prop(0,S_FLIPX | 0x01);
            move_sprite(0,x,y);
            delay(75);
        }

        if(joypad()==J_UP)
        {   y--;
            spr+=2;
            if(spr==8)
                spr=0;
            set_sprite_tile(0,spr);   
            move_sprite(0,x,y);
            delay(75);
        }

        if(joypad()==J_DOWN)
        {   y++;
            spr+=2;
            if(spr==8)
                spr=0;
            set_sprite_tile(0,spr);   
            move_sprite(0,x,y);
            delay(75);
        } 
    }
    
    move_sprite(0,200,200);
}

void hilfe()
{   cls();
    gotoxy(0,0);
    printf ("\n\n");
    printf (" Dieses kleine Pro-\n");
    printf (" gramm dient als\n");
    printf (" Demonstration der\n");
    printf (" GameBoy Programm-\n");
    printf (" ierung. Der Code\n");
    printf (" wurde zum Teil aus\n");
    printf (" anderen Beispielen\n");
    printf (" entnommen und soll\n");
    printf (" als eine Anregung\n");
    printf (" dienen.");
    printf ("\n\n\n MFG Werner");
    delay(200);
    while (joypad() != J_START)
    {};
}
