Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- eGleeok::eGleeok(fix,fix,int Id,int Clk) : enemy((fix)120,(fix)48,Id,Clk)
- {
- hzsz = 32; // can't be jumped.
- flameclk=0;
- misc=clk; // total head count
- clk3=clk; // live head count
- clk=0;
- clk2=60; // fire ball clock
- // hp=(guysbuf[eGLEEOK2+(misc-2)].misc2)*(misc-1)*DAMAGE_MULTIPLIER+guysbuf[eGLEEOK2+(misc-2)].hp;
- hp=(guysbuf[id&0xFFF].misc2)*(misc-1)*DAMAGE_MULTIPLIER+guysbuf[id&0xFFF].hp;
- dir = down;
- hxofs=4;
- hxsz=8;
- // frate=17*4;
- fading=fade_blue_poof;
- //nets+5420;
- if(get_bit(quest_rules,qr_NEWENEMYTILES))
- {
- /*
- necktile=o_tile+8;
- if (dmisc3)
- {
- necktile+=8;
- }
- */
- necktile=o_tile+dmisc6;
- }
- else
- {
- necktile=s_tile;
- }
- }
- bool eGleeok::animate(int index)
- {
- if(dying)
- return Dead(index);
- if(clk==0)
- {
- removearmos(x,y);
- }
- // Check if a head was killed somehow...
- if(index+1+clk3>=guys.Count())
- clk3=guys.Count()-index-1;
- if(index+1+misc>=guys.Count())
- misc=guys.Count()-index-1;
- //fix for the "kill all enemies" item
- if(hp==-1000)
- {
- for(int i=0; i<clk3; ++i)
- {
- // I haven't seen this fail, but it seems like it ought to be
- // possible, so I'm checking for it. - Saf
- if((((enemy*)guys.spr(index+i+1))->id&0xFFF)!=(id&0xFFF))
- break;
- ((enemy*)guys.spr(index+i+1))->hp=1; // re-animate each head,
- ((enemy*)guys.spr(index+i+1))->misc = -1; // disconnect it,
- ((enemy*)guys.spr(index+i+1))->animate(index+i+1); // let it animate one frame,
- ((enemy*)guys.spr(index+i+1))->hp=-1000; // and kill it for good
- }
- clk3=0;
- for(int i=0; i<misc; i++)
- {
- if((((enemy*)guys.spr(index+i+1))->id&0xFFF)!=(id&0xFFF))
- break;
- ((enemy*)guys.spr(index+i+1))->misc = -2; // give the signal to disappear
- }
- }
- for(int i=0; i<clk3; i++)
- {
- enemy *head = ((enemy*)guys.spr(index+i+1));
- head->dummy_int[1]=necktile;
- if(get_bit(quest_rules,qr_NEWENEMYTILES))
- {
- head->dummy_int[2]=o_tile+dmisc8; //connected head tile
- head->dummy_int[3]=o_tile+dmisc9; //flying head tile
- }
- else
- {
- head->dummy_int[2]=necktile+1; //connected head tile
- head->dummy_int[3]=necktile+2; //flying head tile
- }
- head->dmisc5=dmisc5; //neck segments
- /*
- if (dmisc3)
- {
- head->dummy_bool[0]=true;
- }
- */
- if(head->hclk)
- {
- if(hclk==0)
- {
- hp -= 1000 - head->hp;
- hclk = 33;
- if(hitsfx>0) sfx(hitsfx,pan(int(head->x)));
- sfx(WAV_EHIT,pan(int(head->x)));
- }
- head->hclk = 0;
- }
- // Must be set in case of naughty ZScripts
- head->hp = 1000;
- }
- if(hp<=(guysbuf[id&0xFFF].misc2)*(clk3-1)*DAMAGE_MULTIPLIER)
- {
- ((enemy*)guys.spr(index+clk3))->misc = -1; // give signal to fly off
- hp=(guysbuf[id&0xFFF].misc2)*(--clk3)*DAMAGE_MULTIPLIER;
- }
- if(!dmisc3)
- {
- if(++clk2>72 && !(rand()&3))
- {
- int i=rand()%misc;
- enemy *head = ((enemy*)guys.spr(index+i+1));
- addEwpn(head->x,head->y,head->z,wpn,3,wdp,dir,getUID());
- sfx(wpnsfx(wpn),pan(int(x)));
- clk2=0;
- }
- }
- else
- {
- if(++clk2>100 && !(rand()&3))
- {
- enemy *head = ((enemy*)guys.spr(rand()%misc+index+1));
- head->timer=rand()%50+50;
- clk2=0;
- }
- }
- if(hp<=0)
- {
- for(int i=0; i<misc; i++)
- ((enemy*)guys.spr(index+i+1))->misc = -2; // give the signal to disappear
- if(flags&guy_neverret) never_return(index);
- }
- return enemy::animate(index);
- }
- int eGleeok::takehit(weapon*)
- {
- return 0;
- }
- void eGleeok::draw(BITMAP *dest)
- {
- tile=o_tile;
- if(dying)
- {
- enemy::draw(dest);
- return;
- }
- int f=clk/17;
- if(get_bit(quest_rules,qr_NEWENEMYTILES))
- {
- // body
- xofs=-8;
- yofs=32;
- switch(f)
- {
- case 0:
- tile+=0;
- break;
- case 1:
- tile+=2;
- break;
- case 2:
- tile+=4;
- break;
- default:
- tile+=6;
- break;
- }
- }
- else
- {
- // body
- xofs=-8;
- yofs=32;
- switch(f)
- {
- case 0:
- tile+=0;
- break;
- case 2:
- tile+=4;
- break;
- default:
- tile+=2;
- break;
- }
- }
- enemy::drawblock(dest,15);
- }
- void eGleeok::draw2(BITMAP *dest)
- {
- // the neck stub
- tile=necktile;
- xofs=0;
- yofs=playing_field_offset;
- if(get_bit(quest_rules,qr_NEWENEMYTILES))
- {
- tile+=((clk&24)>>3);
- }
- /*
- else
- {
- tile=145;
- }
- */
- /*
- if(hp>0 && !dont_draw())
- sprite::draw(dest);
- */
- if(hp > 0 && !dont_draw())
- {
- if((tmpscr->flags3&fINVISROOM)&& !(current_item(itype_amulet)))
- sprite::drawcloaked(dest);
- else
- sprite::draw(dest);
- }
- }
- esGleeok::esGleeok(fix X,fix Y,int Id,int Clk, sprite * prnt) : enemy(X,Y,Id,Clk), parent(prnt)
- {
- xoffset=0;
- yoffset=(fix)((dmisc5*4+2));
- // dummy_bool[0]=false;
- timer=0;
- /* fixing */
- hp=1000;
- step=1;
- item_set=0;
- //x=120; y=70;
- x = xoffset+parent->x;
- y = yoffset+parent->y;
- hxofs=4;
- hxsz=8;
- yofs=playing_field_offset;
- clk2=clk; // how long to wait before moving first time
- clk=0;
- mainguy=count_enemy=false;
- dir=rand();
- clk3=((dir&2)>>1)+2; // left or right
- dir&=1; // up or down
- dmisc5=vbound(dmisc5,1,255);
- for(int i=0; i<dmisc5; i++)
- {
- nxoffset[i] = 0;
- nyoffset[i] = 0;
- nx[i] = ((((i*(int)x) + (dmisc5-i)*((int)parent->x))) /dmisc5);
- ny[i] = ((((i*(int)y) + (dmisc5-i)*((int)parent->y))) /dmisc5);
- }
- necktile=0;
- //TODO compatibility? -DD
- /*
- for(int i=0; i<4; i++)
- {
- nx[i]=124;
- ny[i]=i*6+48;
- }*/
- bgsfx=-1;
- //no need for deadsfx
- }
- bool esGleeok::animate(int index)
- {
- // don't call removearmos() - it's a segment.
- dmisc5=vbound(dmisc5,1,255);
- if(misc == 0)
- {
- x = (xoffset+parent->x);
- y = (yoffset+parent->y);
- for(int i=0; i<dmisc5; i++)
- {
- nx[i] = ((((i*(int)x) + (dmisc5-i)*((int)parent->x))) /dmisc5) + 3 + nxoffset[i];
- ny[i] = ((((i*(int)y) + (dmisc5-i)*((int)parent->y))) /dmisc5) + nyoffset[i];
- }
- }
- // set up the head tiles
- // headtile=nets+5588; //5580, actually. must adjust for direction later on
- /*
- if (dummy_bool[0]) //if this is a flame gleeok
- {
- headtile+=180;
- }
- */
- headtile=dummy_int[2]; //5580, actually. must adjust for direction later on
- flyingheadtile=dummy_int[3];
- // set up the neck tiles
- necktile=dummy_int[1];
- if(get_bit(quest_rules,qr_NEWENEMYTILES))
- {
- necktile+=((clk&24)>>3);
- }
- /*
- else
- {
- necktile=145;
- }
- */
- // ?((dummy_bool[0])?(nets+4052+(16+((clk&24)>>3))):(nets+4040+(8+((clk&24)>>3)))):145)
- switch(misc)
- {
- case 0: // live head
- // set up the attached head tiles
- tile=headtile;
- if(get_bit(quest_rules,qr_NEWENEMYTILES))
- {
- tile+=((clk&24)>>3);
- /*
- if (dummy_bool[0]) {
- tile+=1561;
- }
- */
- }
- /*
- else
- {
- tile=146;
- }
- */
- if(++clk2>=0 && !(clk2&3))
- {
- if(y<= (int)parent->y + 8) dir=down;
- if(y>= (int)parent->y + dmisc5*8) dir = up;
- if(y<= (int)parent->y + 10 && !(rand()&31))
- {
- dir^=1;
- }
- fix tempx = x;
- fix tempy = y;
- sprite::move(step);
- xoffset += (x-tempx);
- yoffset += (y-tempy);
- if(clk2>=4)
- {
- clk3^=1;
- clk2=-4;
- }
- else
- {
- if(x <= (int)parent->x-(dmisc5*6))
- {
- clk3=right;
- }
- if(x >= (int)parent->x+(dmisc5*6))
- {
- clk3=left;
- }
- if(y <= (int)parent->y+(dmisc5*6) && !(rand()&15))
- {
- clk3^=1; // x jig
- }
- else
- {
- if(y<=(int)parent->y+(dmisc5*4) && !(rand()&31))
- {
- clk3^=1; // x switch back
- }
- clk2=-4;
- }
- }
- zc_swap(dir,clk3);
- tempx = x;
- tempy = y;
- sprite::move(step);
- xoffset += (x-tempx);
- yoffset += (y-tempy);
- zc_swap(dir,clk3);
- for(int i=1; i<dmisc5; i++)
- {
- nxoffset[i] = (rand()%3);
- nyoffset[i] = (rand()%3);
- }
- }
- break;
- case 1: // flying head
- if(clk>=0)
- {
- variable_walk_8(rate,homing,hrate,spw_floater);
- }
- break;
- // the following are messages sent from the main guy...
- case -1: // got chopped off
- {
- misc=1;
- superman=1;
- hxofs=xofs=0;
- hxsz=16;
- cs=8;
- clk=-24;
- clk2=40;
- dir=(rand()&7)+8;
- step=8.0/9.0;
- }
- break;
- case -2: // the big guy is dead
- return true;
- }
- if(timer)
- {
- if(!(timer%8))
- {
- FireBreath(true);
- }
- --timer;
- }
- return enemy::animate(index);
- }
- int esGleeok::takehit(weapon *w)
- {
- int ret = enemy::takehit(w);
- if(ret==-1)
- return 2; // force it to wait a frame before checking sword attacks again
- return ret;
- }
- void esGleeok::draw(BITMAP *dest)
- {
- dmisc5=vbound(dmisc5,1,255);
- switch(misc)
- {
- case 0: //neck
- if(!dont_draw())
- {
- for(int i=1; i<dmisc5; i++) //draw the neck
- {
- if(get_bit(quest_rules,qr_NEWENEMYTILES))
- {
- if((tmpscr->flags3&fINVISROOM)&& !(current_item(itype_amulet)))
- overtilecloaked16(dest,necktile+(i*dmisc7),nx[i]-4,ny[i]+playing_field_offset,0);
- else
- overtile16(dest,necktile+(i*dmisc7),nx[i]-4,ny[i]+playing_field_offset,cs,0);
- }
- else
- {
- if((tmpscr->flags3&fINVISROOM)&& !(current_item(itype_amulet)))
- overtilecloaked16(dest,necktile,nx[i]-4,ny[i]+playing_field_offset,0);
- else
- overtile16(dest,necktile,nx[i]-4,ny[i]+playing_field_offset,cs,0);
- }
- }
- }
- break;
- case 1: //flying head
- tile=flyingheadtile;
- if(get_bit(quest_rules,qr_NEWENEMYTILES))
- {
- tile+=((clk&24)>>3);
- break;
- }
- /*
- else
- {
- tile=(clk&1)?147:148;
- break;
- }
- */
- }
- }
- void esGleeok::draw2(BITMAP *dest)
- {
- enemy::draw(dest);
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement