File: GAME.C | Size: 7,220 bytes | Download file | Back to directory listing | BWPOW's homepage
#include <all312.h>
#include "sprite.h"
#include "map.h"
 
char tbuf[60];
 
// informacie
char life=5;
char sil=0,riad=0;
char vybuchol=0;
short energy=100,shield=0;
 
int body=0;
 
char hra_sa=0;
// program
 
char tim=1;
char next_str;
void timer()
{
  tim=1;
  if(next_str>0) next_str--;
}
END_OF_FUNCTION(timer);
 
 
typedef struct{
  short x,y;
  char t,s,r;
}METEOR;
 
typedef struct{
  short x,y;
  char s,r;
}VYBUCH;
 
typedef struct{
  short x,y;
  char t,r;
}VEC;
 
typedef struct{
  short x,y,tx;
  char r,t;
}STRELA;
 
METEOR meteor[30];
VYBUCH vybuch[30];
STRELA strela[30];
VEC vec;
 
 
char nm=0,ns=0,max_m=3,nv=0;
char spad_m=0;
short n_zostrel=0;
 
void delete_meteor(char i)
{
  meteor[i]=meteor[nm-1];
  nm--;
}
 
void delete_strela(char i)
{
  strela[i]=strela[ns-1];
  ns--;
}
 
void draw_info()
{
  sprintf(tbuf,"energy: %3d%%",energy);
  textout(screen,font,tbuf,490,0,254);
 
  sprintf(tbuf,"lives: %d",life);
  textout(screen,font,tbuf,490,10,254);
 
  textout(screen,font,"Stones:",490,30,254);
  sprintf(tbuf,"shot down: %d",n_zostrel);
  textout(screen,font,tbuf,510,40,254);
 
  sprintf(tbuf,"missed: %d",spad_m);
  textout(screen,font,tbuf,510,50,254);
 
  sprintf(tbuf,"rockets: %d",sil+1);
  textout(screen,font,tbuf,490,70,254);
 
  if(riad) textout(screen,font,"* homing missiles *",490,80,254);
 
  sprintf(tbuf,"shield: %3d%%",shield);
  textout(screen,font,tbuf,490,90,254);
}
 
void make_vybuch(int x,int y,char r)
{
  if(nv>=30) return;
  play_sample(spritegfx[BOOM_SPL].dat,255,(int)((float)x/0.94),1000,0);
  vybuch[nv].x=x;
  vybuch[nv].y=y;
  vybuch[nv].r=r;
  vybuch[nv].s=0;
  nv++;
}
 
void move_alles(short x)
{
  char i,c,t;
//  body++;
 
  if(vec.x!=-1){
    vec.y+=vec.r;
    if(vec.y>390&&abs(vec.x-x)<50){
      vec.x=-1;
      if(vec.t==0){
        sil++;
        if(sil>2) sil=2;
      }
      if(vec.t==1){
        shield+=34;
        if(shield>100) shield=100;
      }
      if(vec.t==2) riad=1;
      if(vec.t==3){
        energy+=30;
        if(energy>100) energy=100;
      }
      play_sample(spritegfx[BER_SPL].dat,255,(int)((float)x/0.94),1000,0);
      body+=1000;
    }
    if(vec.y>480) vec.x=-1;
  }
 
  for(i=0;i<nm;i++){
    meteor[i].y+=meteor[i].r;
    meteor[i].s++;
    if(meteor[i].s>14) meteor[i].s=0;
 
    if(meteor[i].y>=480){
      spad_m++;
      body-=200;
      delete_meteor(i);
      draw_info();
    }
    if(meteor[i].y>390&&abs(meteor[i].x-x)<50){
      make_vybuch(meteor[i].x,meteor[i].y,0);
      delete_meteor(i);
      n_zostrel++;
      body+=20;
 
      if(hra_sa){
        energy-=50-shield/2;
        shield-=20;
        if(shield<0) shield=0;
        if(energy<=0){
          make_vybuch(x,430,0);
          vybuchol=1;
          energy=0;
        }
      }
      draw_info();
 
    }
  }
 
  if(nm<max_m&&n_zostrel<1200){
    meteor[nm].x=random()%420+30;
    meteor[nm].y=0;
    meteor[nm].r=random()%5+1;
    meteor[nm].t=random()%3;
    nm++;
  }
 
  for(i=0;i<nv;i++){
     vybuch[i].y+=vybuch[i].r;
     vybuch[i].s+=1;
     if(vybuch[i].s>=4){
       vybuch[i]=vybuch[nv-1];
       nv--;
     }
  }
 
  for(i=0;i<ns;i++){
    strela[i].y-=strela[i].r;
    strela[i].r*=2;
    if(strela[i].r>20) strela[i].r=20;
 
    if(strela[i].t==1){
      if(strela[i].x<strela[i].tx) strela[i].x+=5;
      if(strela[i].x>strela[i].tx) strela[i].x-=5;
    }
 
    for(c=0;c<nm;c++){
      if(abs(strela[i].x-meteor[c].x)<30&&abs(strela[i].y-meteor[c].y)<30){
        delete_strela(i);
        make_vybuch(meteor[c].x,meteor[c].y,meteor[c].r);
        n_zostrel++;
        body+=50;
        if(n_zostrel%50==0){
          t=random()%4;
          if(t==0&&sil>=2) t=1;
          if(t==2&&riad==1) t=3;
          vec.x=meteor[c].x;
          vec.y=meteor[c].y;
          vec.r=5;
          vec.t=t;
          max_m+=1;
        }
        delete_meteor(c);
        draw_info();
      }
 
    }
 
    if(strela[i].y<0) delete_strela(i);
 
  }
 
}
char ohen=0;
short rry=100;
 
void draw_alles(BITMAP *bmp,int x,char s)
{
  char i;
  for(i=0;i<nm;i++)
    draw_rle_sprite(bmp,spritegfx[meteor[i].t*15+meteor[i].s].dat,meteor[i].x-30,meteor[i].y-30);
 
  for(i=0;i<ns;i++)
    draw_rle_sprite(bmp,spritegfx[ROCKET].dat,strela[i].x-6,strela[i].y);
 
  for(i=0;i<nv;i++)
    draw_rle_sprite(bmp,explosion[vybuch[i].s],vybuch[i].x-40,vybuch[i].y-40);
 
  if(vybuchol==0){
    draw_rle_sprite(bmp,spritegfx[ENGINE1+ohen].dat,x-7,450+rry);
    draw_rle_sprite(bmp,spritegfx[SHIP1+s].dat,x-40,404+rry);
  }
 
  if(vec.x!=-1)
    draw_rle_sprite(bmp,spritegfx[VEC0+vec.t].dat,vec.x-24,vec.y-24);
 
 
  ohen++;
  if(ohen>6) ohen=0;
}
 
void make_strela(int x)
{
  if(next_str>0) return;
  next_str=10;
  if(ns>=27) return;
 
  if(sil!=1){
    strela[ns].x=x;
    strela[ns].y=400;
    strela[ns].r=1;
    strela[ns].t=riad;
    if(riad==1){
      char i,cc;
      short min=900,c;
      for(i=0;i<nm;i++){
        c=abs(x-meteor[i].x);
        if(c<min){min=c;cc=i;}
      }
      strela[ns].tx=meteor[cc].x;
    }
    ns++;
  }
  if(sil>0){
    strela[ns].x=x-30;
    strela[ns].y=410;
    strela[ns].r=1;
    strela[ns].t=riad;
    if(riad==1){
      strela[ns].tx=meteor[random()%nm].x;
    }
    ns++;
 
    strela[ns].x=x+27;
    strela[ns].y=410;
    strela[ns].r=1;
    strela[ns].t=riad;
    if(riad==1){
      strela[ns].tx=meteor[random()%nm].x;
    }
    ns++;
  }
 
  play_sample(spritegfx[SHOOT_SPL].dat,255,(int)((float)x/0.94),1000,0);
}
 
 
char game()
{
  BITMAP *bmp;
  int x=240,y=470;
  char c=1,s=2,k=0;
 
  vec.x=-1;
 
  LOCK_FUNCTION(timer);
  install_int_ex(timer,BPS_TO_TIMER(20));
 
  bmp=create_bitmap(480,480);
  clear(bmp);
 
  draw_info();
 
  textout(screen,font,"By Samuel Kupka",510,470,254);
 
  while(k==0){
    if(tim==1){
      tim=0;
 
      move_alles(x);
 
      zobraz(bmp,x);
      draw_alles(bmp,x,s);
//      vsync();
 
      blit(bmp,screen,0,0,0,0,480,480);
 
      sprintf(tbuf,"Points: %d",body);
      textout(screen,font,tbuf,490,110,254);
 
 
      if(vybuchol){
        vybuchol=0;
        hra_sa=0;
        rry=100;
        life--;
        x=240;s=2;
        if(life<0) k=-1;
        energy=100;
        draw_info();
      }
 
      if(spad_m>50){
        k=-2;
      }
      if(n_zostrel>1200&&nm==0){
        hra_sa=0;
      }
 
      if(hra_sa){
        c=0;
        if(key[KEY_LEFT]){x-=10;s--;c=1;}
        if(key[KEY_RIGHT]){x+=10;s++;c=1;}
        if(x<40) x=40;
        if(x>440) x=440;
 
        if(c==0){
          if(s<2) s++;
          if(s>2) s--;
        }
 
        if(s<0) s=0;
        if(s>4) s=4;
 
        if(key[KEY_SPACE]){
          make_strela(x);
        }
      }
      else{
        if(n_zostrel>1200){
          rry-=8;
          s=2;
          if(rry<-460) k=2;
        }
        else{
          if(rry>0) rry-=4;
          if(rry<=0&&vybuchol==0&&life>=0) hra_sa=1;
        }
      }
 
 
    }
    if(key[KEY_ESC]) k=1;
  }
  fade_out(3);
  return k;
}