void dodigger(struct digger_draw_api *ddap) { int n; int16_t tdir; newframe(); if (gauntlet) { drawlives(ddap); if (cgtime<ftime) timeout=true; cgtime-=ftime; } for (n=curplayer;n<diggers+curplayer;n++) { if (digdat[n].bob.expsn!=0) drawexplosion(n); else updatefire(ddap, n); if (digvisible) { if (digdat[n].dob.alive) if (digdat[n].bagtime!=0) { tdir = digdat[n].dob.dir; digdat[n].dob.dir = digdat[n].mdir; drawdig(n); digdat[n].dob.dir = tdir; incpenalty(); digdat[n].bagtime--; } else updatedigger(ddap, n); else diggerdie(ddap, n); } if (digdat[n].emocttime>0) digdat[n].emocttime--; } if (bonusmode && isalive()) { if (bonustimeleft!=0) { bonustimeleft--; if (startbonustimeleft!=0 || bonustimeleft<20) { startbonustimeleft--; if (bonustimeleft&1) { ddap->ginten(0); soundbonus(); } else { ddap->ginten(1); soundbonus(); } if (startbonustimeleft==0) { music(0); soundbonusoff(); ddap->ginten(1); } } } else { endbonusmode(ddap); soundbonusoff(); music(1); } } if (bonusmode && !isalive()) { endbonusmode(ddap); soundbonusoff(); music(1); } }
static void updatedigger(struct digger_draw_api *ddap, int n) { int16_t dir,ddir,diggerox,diggeroy,nmon; bool push=true,bagf; int clfirst[TYPES],clcoll[SPRITES],i; readdirect(n-curplayer); dir=getdirect(n-curplayer); if (dir==DIR_RIGHT || dir==DIR_UP || dir==DIR_LEFT || dir==DIR_DOWN) ddir=dir; else ddir=DIR_NONE; if (digdat[n].rx==0 && (ddir==DIR_UP || ddir==DIR_DOWN)) digdat[n].dob.dir=digdat[n].mdir=ddir; if (digdat[n].ry==0 && (ddir==DIR_RIGHT || ddir==DIR_LEFT)) digdat[n].dob.dir=digdat[n].mdir=ddir; if (dir==DIR_NONE) digdat[n].mdir=DIR_NONE; else digdat[n].mdir=digdat[n].dob.dir; if ((digdat[n].dob.x==292 && digdat[n].mdir==DIR_RIGHT) || (digdat[n].dob.x==12 && digdat[n].mdir==DIR_LEFT) || (digdat[n].dob.y==180 && digdat[n].mdir==DIR_DOWN) || (digdat[n].dob.y==18 && digdat[n].mdir==DIR_UP)) digdat[n].mdir=DIR_NONE; diggerox=digdat[n].dob.x; diggeroy=digdat[n].dob.y; if (digdat[n].mdir!=DIR_NONE) eatfield(diggerox,diggeroy,digdat[n].mdir); switch (digdat[n].mdir) { case DIR_RIGHT: drawrightblob(digdat[n].dob.x,digdat[n].dob.y); digdat[n].dob.x+=4; break; case DIR_UP: drawtopblob(digdat[n].dob.x,digdat[n].dob.y); digdat[n].dob.y-=3; break; case DIR_LEFT: drawleftblob(digdat[n].dob.x,digdat[n].dob.y); digdat[n].dob.x-=4; break; case DIR_DOWN: drawbottomblob(digdat[n].dob.x,digdat[n].dob.y); digdat[n].dob.y+=3; break; } if (hitemerald((digdat[n].dob.x-12)/20,(digdat[n].dob.y-18)/18, (digdat[n].dob.x-12)%20,(digdat[n].dob.y-18)%18, digdat[n].mdir)) { if (digdat[n].emocttime==0) digdat[n].emn=0; scoreemerald(ddap, n); soundem(); soundemerald(digdat[n].emn); digdat[n].emn++; if (digdat[n].emn==8) { digdat[n].emn=0; scoreoctave(ddap, n); } digdat[n].emocttime=9; } drawdig(n); for (i=0;i<TYPES;i++) clfirst[i]=first[i]; for (i=0;i<SPRITES;i++) clcoll[i]=coll[i]; incpenalty(); i=clfirst[1]; bagf=false; while (i!=-1) { if (bagexist(i-FIRSTBAG)) { bagf=true; break; } i=clcoll[i]; } if (bagf) { if (digdat[n].mdir==DIR_RIGHT || digdat[n].mdir==DIR_LEFT) { push=pushbags(ddap, digdat[n].mdir,clfirst,clcoll); digdat[n].bagtime++; } else if (!pushudbags(ddap, clfirst,clcoll)) push=false; if (!push) { /* Strange, push not completely defined */ digdat[n].dob.x=diggerox; digdat[n].dob.y=diggeroy; digdat[n].dob.dir = digdat[n].mdir; drawdig(n); incpenalty(); digdat[n].dob.dir=reversedir(digdat[n].mdir); } } if (clfirst[2]!=-1 && bonusmode && digdat[n].dob.alive) for (nmon=killmonsters(clfirst,clcoll);nmon!=0;nmon--) { soundeatm(); sceatm(ddap, n); } if (clfirst[0]!=-1) { scorebonus(ddap, n); initbonusmode(ddap); } digdat[n].h=(digdat[n].dob.x-12)/20; digdat[n].rx=(digdat[n].dob.x-12)%20; digdat[n].v=(digdat[n].dob.y-18)/18; digdat[n].ry=(digdat[n].dob.y-18)%18; }
void dodigger(void) { int n; newframe(); if (gauntlet) { drawlives(); if (cgtime<ftime) timeout=TRUE; cgtime-=ftime; } for (n=curplayer;n<diggers+curplayer;n++) { if (digdat[n].expsn!=0) drawexplosion(n); else updatefire(n); if (digvisible) if (digdat[n].alive) if (digdat[n].bagtime!=0) { drawdig(n,digdat[n].mdir,digdat[n].x,digdat[n].y, digdat[n].notfiring && digdat[n].rechargetime==0); incpenalty(); digdat[n].bagtime--; } else updatedigger(n); else diggerdie(n); if (digdat[n].emocttime>0) 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); } }