#include "def.h" #include "sprite.h" #include "input.h" #include "hardware.h" #include "digger.h" #include "drawing.h" #include "main.h" #include "sound.h" #include "monster.h" #include "scores.h" #include "bags.h" #ifdef _WINDOWS #include "win_dig.h" #endif struct digger { Sint4 x,y,h,v,rx,ry,mdir,dir,bagtime,rechargetime,fx,fy,fdir,expsn, deathstage,deathbag,deathani,deathtime,emocttime,emn,msc,lives,ivt; bool notfiring,alive,firepressed,dead,levdone,invin; } digdat[DIGGERS]; Sint4 startbonustimeleft=0,bonustimeleft; Sint4 emmask=0; Sint3 emfield[MSIZE]; bool bonusvisible=FALSE,bonusmode=FALSE,digvisible; void updatedigger(int n); void diggerdie(int n); void initbonusmode(void); void endbonusmode(void); bool getfirepflag(int n); void drawdig(int n,int d,int x,int y,bool f); void initdigger(void) { int dig; for (dig=curplayer;dig !dead but dead => !alive */ digdat[dig].invin=FALSE; digdat[dig].ivt=0; digdat[dig].deathstage=1; digdat[dig].y=digdat[dig].v*18+18; movedrawspr(dig+FIRSTDIGGER-curplayer,digdat[dig].x,digdat[dig].y); digdat[dig].notfiring=TRUE; digdat[dig].emocttime=0; digdat[dig].firepressed=FALSE; digdat[dig].expsn=0; digdat[dig].rechargetime=0; digdat[dig].emn=0; digdat[dig].msc=1; } digvisible=TRUE; bonusvisible=bonusmode=FALSE; } Uint5 curtime,ftime; #ifdef INTDRF Uint5 frame; #endif void newframe(void) { #ifndef ARM Uint5 t; if (synchvid) { for (;curtimet && t>curtime); curtime=t; } #else for (;curtime0) digdat[n].emocttime--; } if (bonusmode && isalive()) { if (bonustimeleft!=0) { bonustimeleft--; if (startbonustimeleft!=0 || bonustimeleft<20) { startbonustimeleft--; if (bonustimeleft&1) { ginten(0); soundbonus(); } else { ginten(1); soundbonus(); } if (startbonustimeleft==0) { music(0); soundbonusoff(); ginten(1); } } } else { endbonusmode(); soundbonusoff(); music(1); } } if (bonusmode && !isalive()) { endbonusmode(); soundbonusoff(); music(1); } } void updatefire(int n) { Sint4 pix; int clfirst[TYPES],clcoll[SPRITES],i; bool clflag; if (digdat[n].notfiring) { if (digdat[n].rechargetime!=0) digdat[n].rechargetime--; else if (getfirepflag(n-curplayer)) if (digdat[n].alive) { digdat[n].rechargetime=levof10()*3+60; digdat[n].notfiring=FALSE; switch (digdat[n].dir) { case DIR_RIGHT: digdat[n].fx=digdat[n].x+8; digdat[n].fy=digdat[n].y+4; break; case DIR_UP: digdat[n].fx=digdat[n].x+4; digdat[n].fy=digdat[n].y; break; case DIR_LEFT: digdat[n].fx=digdat[n].x; digdat[n].fy=digdat[n].y+4; break; case DIR_DOWN: digdat[n].fx=digdat[n].x+4; digdat[n].fy=digdat[n].y+8; } digdat[n].fdir=digdat[n].dir; movedrawspr(FIRSTFIREBALL+n-curplayer,digdat[n].fx,digdat[n].fy); soundfire(n); } } else { switch (digdat[n].fdir) { case DIR_RIGHT: digdat[n].fx+=8; pix=ggetpix(digdat[n].fx,digdat[n].fy+4)| ggetpix(digdat[n].fx+4,digdat[n].fy+4); break; case DIR_UP: digdat[n].fy-=7; pix=0; for (i=0;i<7;i++) pix|=ggetpix(digdat[n].fx+4,digdat[n].fy+i); pix&=0xc0; break; case DIR_LEFT: digdat[n].fx-=8; pix=ggetpix(digdat[n].fx,digdat[n].fy+4)| ggetpix(digdat[n].fx+4,digdat[n].fy+4); break; case DIR_DOWN: digdat[n].fy+=7; pix=0; for (i=0;i<7;i++) pix|=ggetpix(digdat[n].fx,digdat[n].fy+i); pix&=0x3; break; } drawfire(n-curplayer,digdat[n].fx,digdat[n].fy,0); for (i=0;i296) digdat[n].expsn=1; else if (pix!=0 && !clflag) { digdat[n].expsn=1; digdat[n].fx-=8; drawfire(n-curplayer,digdat[n].fx,digdat[n].fy,0); } break; case DIR_UP: if (digdat[n].fy<15) digdat[n].expsn=1; else if (pix!=0 && !clflag) { digdat[n].expsn=1; digdat[n].fy+=7; drawfire(n-curplayer,digdat[n].fx,digdat[n].fy,0); } break; case DIR_LEFT: if (digdat[n].fx<16) digdat[n].expsn=1; else if (pix!=0 && !clflag) { digdat[n].expsn=1; digdat[n].fx+=8; drawfire(n-curplayer,digdat[n].fx,digdat[n].fy,0); } break; case DIR_DOWN: if (digdat[n].fy>183) digdat[n].expsn=1; else if (pix!=0 && !clflag) { digdat[n].expsn=1; digdat[n].fy-=7; drawfire(n-curplayer,digdat[n].fx,digdat[n].fy,0); } } } } void erasediggers(void) { int i; for (i=0;idigdat[n].y) digdat[n].y=bagy(digdat[n].deathbag)+6; drawdigger(n-curplayer,15,digdat[n].x,digdat[n].y,FALSE); incpenalty(); if (getbagdir(digdat[n].deathbag)+1==0) { soundddie(); digdat[n].deathtime=5; digdat[n].deathstage=2; digdat[n].deathani=0; digdat[n].y-=6; } break; case 2: if (digdat[n].deathtime!=0) { digdat[n].deathtime--; break; } if (digdat[n].deathani==0) music(2); drawdigger(n-curplayer,14-digdat[n].deathani,digdat[n].x,digdat[n].y, FALSE); for (i=0;i1) digdat[n].deathtime=60; else digdat[n].deathtime=10; } break; case 3: digdat[n].deathstage=5; digdat[n].deathani=0; digdat[n].deathtime=0; break; case 5: if (digdat[n].deathani>=0 && digdat[n].deathani<=6) { drawdigger(n-curplayer,15,digdat[n].x, digdat[n].y-deatharc[digdat[n].deathani],FALSE); if (digdat[n].deathani==6 && !isalive()) musicoff(); incpenalty(); digdat[n].deathani++; if (digdat[n].deathani==1) soundddie(); if (digdat[n].deathani==7) { digdat[n].deathtime=5; digdat[n].deathani=0; digdat[n].deathstage=2; } } break; case 4: if (digdat[n].deathtime!=0) digdat[n].deathtime--; else { digdat[n].dead=TRUE; alldead=TRUE; for (i=0;i0) { if (!gauntlet) digdat[n].lives--; drawlives(); if (digdat[n].lives>0) { digdat[n].v=9; digdat[n].mdir=4; digdat[n].h=(diggers==1) ? 7 : (8-n*2); digdat[n].x=digdat[n].h*20+12; digdat[n].dir=(n==0) ? DIR_RIGHT : DIR_LEFT; digdat[n].rx=0; digdat[n].ry=0; digdat[n].bagtime=0; digdat[n].alive=TRUE; digdat[n].dead=FALSE; digdat[n].invin=TRUE; digdat[n].ivt=50; digdat[n].deathstage=1; digdat[n].y=digdat[n].v*18+18; erasespr(n+FIRSTDIGGER-curplayer); movedrawspr(n+FIRSTDIGGER-curplayer,digdat[n].x,digdat[n].y); digdat[n].notfiring=TRUE; digdat[n].emocttime=0; digdat[n].firepressed=FALSE; digdat[n].expsn=0; digdat[n].rechargetime=0; digdat[n].emn=0; digdat[n].msc=1; } clearfire(n); if (bonusmode) music(0); else music(1); } } } } void createbonus(void) { bonusvisible=TRUE; drawbonus(292,18); } void initbonusmode(void) { int i; bonusmode=TRUE; erasebonus(); ginten(1); bonustimeleft=250-levof10()*20; startbonustimeleft=20; for (i=0;i4) { digdat[n].alive=FALSE; digdat[n].deathstage=stage; digdat[n].deathbag=bag; } } void makeemfield(void) { Sint4 x,y; emmask=1<