#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; }