#name "Save The Men 0.9a"
#include "usglib.h"
#include "lib\sprite_x.c"
#include "lib\rand.c"
#include "func\gray.c"
#include "func\gcp.c"


extern char pic1[8], dude_l[8] , dude_r[8] , nuoli[5], chae[], startpic[];
extern char dude[6];

main() {
int pl_x,x,y,pisteet,i,maara;
char c,cont;

x = 21; cont = 0; pl_x = 31;
pisteet=0; y = 10 << 8; maara=1;

 // graphpage();
 grayon();
 if (grayon()) {
 setxy_m(0,0);
 puts_m("Not enough memory");
 getkey();
 return; }

  clr();
  load_gcp(startpic);
  getkey();

  welcome(pl_x,cont,x,y,pisteet,maara);
  dothegame();
}


welcome(pl_x, cont, x, y, yn, g , pisteet, maara)
int pl_x,x[2],y[2],yn[2],g[2],pisteet,maara; char cont; {

int i2;
char menu,c;
grayoff();
clrscr; 
     
invtext;
        setxy(0,0);
        puts("    Save The Men     ");
        setxy_m(100,1);
        puts_m("v 0.9");
normtext;
setxy(3,5);
puts("New Game"); 

if ( cont == 1) { setxy(4,5); puts("Continue"); } else {
setxy(4,5);
puts("High Scores"); }

setxy(5,5);
puts("Quit To Usg");

sprite_x(nuoli, 20, 25, 8,5);

        menu = 25;

       while (1) { 
        c = getkey();
        if ( c == K_PLUS) contrast_up();
        if ( c == K_MINUS) contrast_down();
        if ( c == K_UP && menu > 25) {
        sprite_x(nuoli, 20, menu, 8,5);
        menu -= 8;
        sprite_x(nuoli, 20, menu, 8,5); }
        

        if ( c == K_DOWN && menu < 41) {
        sprite_x(nuoli, 20, menu, 8,5);
        menu += 8;
        sprite_x(nuoli, 20, menu, 8,5); }

        if ( c == K_ENTER) {

                if ( menu == 25 ) {
                grayon();
                clr();
                load_gcp(pic1);
                dothegame(cont);
                }

               if ( menu == 33) {
               if ( cont == 1) {
                grayon();
                clr();
                load_gcp(pic1);
       for (i2=0; i2<maara; i2++) sprite_X( dude,x[i2],(y[i2]>>8),8,6);
                sprite_x( dude_l , (pl_x)  , 55 , 8 , 8 );
                sprite_x( dude_r , (pl_x-8) , 55 , 8 , 8 );
                setxy(0,14);
                putn(pisteet);
                setxy(0,10);
                puts("Scores:");
                return; }
                } 

        if ( menu == 41 ){
                clr();
                grayoff();
invtext;
        setxy(0,0);
        puts("    Save The Men     ");
        setxy_m(100,1);
        puts_m("v 0.9");
normtext;
        setxy(2,1);
//            123456789012345678901
        puts("programmed by:");

        setxy(3,3);
        puts("Petri J rvisalo");
        setxy(3,10);
        puts(chae);
        setxy_m(30,31);
        puts_m("ptj@gnwmail.com");
        setxy(6,4);
        puts("please read");
        setxy(7,8);
        puts("savemen.txt");

        getkey();
               _exit();
               }

        }

 }
                clr();
                grayoff();
               _exit();

}

dothegame(cont) char cont; {
int clock,pisteet;
int x[2] ,y[2] , yn[2], g[2],i,pl_x,i2,oikein[2],maara;
char c;

clock = 1; pisteet = 0;
cont = 0; pl_x = 31; maara = 1;
for (i2=0; i2<2; i2++) {
yn[i2] = rando();
g[i2] = rando();
x[i2]= 21;
y[i2] = (ranko() << 8);
}


       setxy(0,14);
       putn(pisteet);
       setxy(0,10);
       puts("Scores:");
       sprite_x( dude_l , (pl_x)  , 55 , 8 , 8 );
       sprite_x( dude_r , (pl_x-8) , 55 , 8 , 8 );
   for (i2=0; i2<maara; i2++) sprite_X( dude,x[i2],(y[i2]>>8),8,6);

   do
  {
      c = chkkey();
      if (c == K_EXIT) { cont = 1; welcome(pl_x,cont,x,y,yn,g,pisteet,maara); } // subscriptit poistettu
      if (c == K_NOKEY) clock += 1;
      if (clock == 150)   {
      if ( maara == 1 && (x[1]-pl_x)+yn[1] >= 80 ) { maara = 2;
      sprite_X(dude,x[1],(y[1]>>8),8,6); }

      for ( i2 = 0; i2 < maara ; i2 ++) {
               oikein[i2]=0;
       sprite_X(dude,x[i2],(y[i2]>>8),8,6);
         x[i2]++;
         yn[i2]+= g[i2];
         y[i2] += yn[i2];
         if ( (y[i2] >> 8) > 50 )  { yn[i2]-= 2*yn[i2];
             for (i=0; i<10; i++) {
                if ( x[i2] == (pl_x+i) || x[i2] == (pl_x-i) || x[i2] == pl_x) {
                        oikein[i2] +=1; }
                        }
                if (oikein[i2]==0) {cont = 0; welcome(cont); } 
              }
        if ( x[i2] > 109 ) { x[i2] = 21;
                pisteet +=1; 
                setxy(0,14);
                putn(pisteet);
                setxy(0,10);
                puts("Scores:");
                y[i2] = (ranko() << 8);
                yn[i2] = rando();
                g[i2] = rando();   
        }
        sprite_x( dude, x[i2] ,(y[i2] >> 8) , 8 , 6 );
        }
        clock=1; 
      }
   
      if ( c == K_LEFT && pl_x > 31 ) {
      pl_x -= 3;
      sprite_x( dude_l , pl_x , 55 , 8 , 8 );  // draw new sprite 
      sprite_x( dude_r , (pl_x-8),55, 8 ,8 );
      sprite_x( dude_l , pl_x+3    ,55, 8 ,8 ); // erase prev sprite
      sprite_x( dude_r , (pl_x-8)+3,55, 8 ,8 ); 
      } 

      if ( c == K_RIGHT && pl_x < 109 ) {
      pl_x += 3;
      sprite_x( dude_l , pl_x    ,55, 8 ,8 );  //draw new sprite
      sprite_x( dude_r , (pl_x-8),55, 8 ,8 );
      sprite_x( dude_l , pl_x-3     ,55, 8 , 8 ); // erase sprite
      sprite_x( dude_r , (pl_x-8)-3 ,55, 8 ,8 ); 
      } 


    } while (1); 
       
//       getkey();
//       _exit();
   }

ranko() {
 int g;
 while (1) {
 g = (rand() % 3);
 if ( g == 1) return 10;
 if ( g == 2) return 24;
 if ( g == 3) return 40; 
 }
}

rando() {
 int g;
 while (1) {
 g = (rand() % 40);
 if ( g >= 13) return g;
 }
}

/* Clear the screen between images */
clr()  {
#asm
   ld  hl,(PAGE1ADDR)
   ld  bc,1024-1
   call OTH_CLEAR
   ld  hl,(PAGE2ADDR)
   ld  bc,1024-1
   call OTH_CLEAR
#endasm
}

contrast_up() {
#asm
    ld a, (CONTRAST)                ; get contrast value
    cp $1f                          ; is it at max?
    ret z                           ; then quit
    inc a                           ; else increment it
    out (2), a                      ; and output it to the contrast port
    ld (CONTRAST), a                ; and update the value in RAM
#endasm
}

contrast_down() {
#asm
    ld a, (CONTRAST)                ; get contrast value
    cp $00                          ; is it minimum?
    ret z                           ; then quit
    dec a                           ; else increment it
    out (2), a                      ; and output it to the contrast port
    ld (CONTRAST), a                ; and update the value in RAM
#endasm
}

chkkey() {
#asm
   call GET_KEY
   ld l,a
   xor a
   ld h,a
#endasm
}


#asm
chae:
.db 145,0

dude_r:
.db %01100000
.db %11010000
.db %01100000
.db %01000000
.db %11111111
.db %01000000
.db %01100000
.db %10010000
dude_l:
.db %00000110
.db %00001011
.db %00000110
.db %00000010
.db %11111111
.db %00000010
.db %00000110
.db %00001001
nuoli:
.db %00110000
.db %00011100
.db %11111111
.db %00011100
.db %00110000
dude:
.db %00010000
.db %11100001
.db %00010010
.db %01111100
.db %00000011
.db %00000111 
pic1:
#include "tausta.asm"
startpic:
#include "alkuku.asm"
#endasm
