static void updatefire(struct digger_draw_api *ddap, int n) { int16_t pix=0, fx, fy; int clfirst[TYPES],clcoll[SPRITES],i; bool clflag; if (digdat[n].notfiring) { if (digdat[n].rechargetime!=0) { digdat[n].rechargetime--; if (digdat[n].rechargetime == 0) { CALL_METHOD(&digdat[n].dob, recharge); } } else { if (getfirepflag(n-curplayer)) { if (digdat[n].dob.alive) { CALL_METHOD(&digdat[n].dob, discharge); digdat[n].rechargetime=levof10()*3+60; digdat[n].notfiring=false; switch (digdat[n].dob.dir) { case DIR_RIGHT: fx = digdat[n].dob.x + 8; fy = digdat[n].dob.y + 4; break; case DIR_UP: fx = digdat[n].dob.x + 4; fy = digdat[n].dob.y; break; case DIR_LEFT: fx = digdat[n].dob.x; fy = digdat[n].dob.y + 4; break; case DIR_DOWN: fx = digdat[n].dob.x + 4; fy = digdat[n].dob.y + 8; break; default: abort(); } bullet_obj_init(&digdat[n].bob, n - curplayer, digdat[n].dob.dir, fx, fy); CALL_METHOD(&digdat[n].bob, put); soundfire(n); } } } } else { switch (digdat[n].bob.dir) { case DIR_RIGHT: digdat[n].bob.x+=8; pix=ddap->ggetpix(digdat[n].bob.x,digdat[n].bob.y+4)| ddap->ggetpix(digdat[n].bob.x+4,digdat[n].bob.y+4); break; case DIR_UP: digdat[n].bob.y-=7; pix=0; for (i=0;i<7;i++) pix|=ddap->ggetpix(digdat[n].bob.x+4,digdat[n].bob.y+i); pix&=0xc0; break; case DIR_LEFT: digdat[n].bob.x-=8; pix=ddap->ggetpix(digdat[n].bob.x,digdat[n].bob.y+4)| ddap->ggetpix(digdat[n].bob.x+4,digdat[n].bob.y+4); break; case DIR_DOWN: digdat[n].bob.y+=7; pix=0; for (i=0;i<7;i++) pix|=ddap->ggetpix(digdat[n].bob.x,digdat[n].bob.y+i); pix&=0x3; break; } CALL_METHOD(&digdat[n].bob, animate); for (i=0;i<TYPES;i++) clfirst[i]=first[i]; for (i=0;i<SPRITES;i++) clcoll[i]=coll[i]; incpenalty(); i=clfirst[2]; while (i!=-1) { killmon(i-FIRSTMONSTER); scorekill(ddap, n); CALL_METHOD(&digdat[n].bob, explode); i=clcoll[i]; } i=clfirst[4]; while (i!=-1) { if (i-FIRSTDIGGER+curplayer!=n && !digdat[i-FIRSTDIGGER+curplayer].invin && digdat[i-FIRSTDIGGER+curplayer].dob.alive) { killdigger(i-FIRSTDIGGER+curplayer,3,0); CALL_METHOD(&digdat[n].bob, explode); } i=clcoll[i]; } if (clfirst[0]!=-1 || clfirst[1]!=-1 || clfirst[2]!=-1 || clfirst[3]!=-1 || clfirst[4]!=-1) clflag=true; else clflag=false; if (clfirst[0]!=-1 || clfirst[1]!=-1 || clfirst[3]!=-1) { CALL_METHOD(&digdat[n].bob, explode); i=clfirst[3]; while (i!=-1) { if (digdat[i-FIRSTFIREBALL+curplayer].bob.expsn==0) { CALL_METHOD(&digdat[i-FIRSTFIREBALL+curplayer].bob, explode); } i=clcoll[i]; } } switch (digdat[n].bob.dir) { case DIR_RIGHT: if (digdat[n].bob.x>296) { CALL_METHOD(&digdat[n].bob, explode); } else { if (pix!=0 && !clflag) { digdat[n].bob.x-=8; CALL_METHOD(&digdat[n].bob, animate); CALL_METHOD(&digdat[n].bob, explode); } } break; case DIR_UP: if (digdat[n].bob.y<15) { CALL_METHOD(&digdat[n].bob, explode); } else { if (pix!=0 && !clflag) { digdat[n].bob.y+=7; CALL_METHOD(&digdat[n].bob, animate); CALL_METHOD(&digdat[n].bob, explode); } } break; case DIR_LEFT: if (digdat[n].bob.x<16) { CALL_METHOD(&digdat[n].bob, explode); } else { if (pix!=0 && !clflag) { digdat[n].bob.x+=8; CALL_METHOD(&digdat[n].bob, animate); CALL_METHOD(&digdat[n].bob, explode); } } break; case DIR_DOWN: if (digdat[n].bob.y>183) { CALL_METHOD(&digdat[n].bob, explode); } else { if (pix!=0 && !clflag) { digdat[n].bob.y-=7; CALL_METHOD(&digdat[n].bob, animate); CALL_METHOD(&digdat[n].bob, explode); } } } } }
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;i<TYPES;i++) clfirst[i]=first[i]; for (i=0;i<SPRITES;i++) clcoll[i]=coll[i]; incpenalty(); i=clfirst[2]; while (i!=-1) { killmon(i-FIRSTMONSTER); scorekill(n); digdat[n].expsn=1; i=clcoll[i]; } i=clfirst[4]; while (i!=-1) { if (i-FIRSTDIGGER+curplayer!=n && !digdat[i-FIRSTDIGGER+curplayer].invin && digdat[i-FIRSTDIGGER+curplayer].alive) { killdigger(i-FIRSTDIGGER+curplayer,3,0); digdat[n].expsn=1; } i=clcoll[i]; } if (clfirst[0]!=-1 || clfirst[1]!=-1 || clfirst[2]!=-1 || clfirst[3]!=-1 || clfirst[4]!=-1) clflag=TRUE; else clflag=FALSE; if (clfirst[0]!=-1 || clfirst[1]!=-1 || clfirst[3]!=-1) { digdat[n].expsn=1; i=clfirst[3]; while (i!=-1) { if (digdat[i-FIRSTFIREBALL+curplayer].expsn==0) digdat[i-FIRSTFIREBALL+curplayer].expsn=1; i=clcoll[i]; } } switch (digdat[n].fdir) { case DIR_RIGHT: if (digdat[n].fx>296) 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); } } } }