Advertisement
ZoriaRPG

Gleeok.cpp

Nov 17th, 2019
269
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 13.44 KB | None | 0 0
  1. eGleeok::eGleeok(fix,fix,int Id,int Clk) : enemy((fix)120,(fix)48,Id,Clk)
  2. {
  3.     hzsz = 32; // can't be jumped.
  4.     flameclk=0;
  5.     misc=clk;                                                 // total head count
  6.     clk3=clk;                                                 // live head count
  7.     clk=0;
  8.     clk2=60;                                                  // fire ball clock
  9.     //    hp=(guysbuf[eGLEEOK2+(misc-2)].misc2)*(misc-1)*DAMAGE_MULTIPLIER+guysbuf[eGLEEOK2+(misc-2)].hp;
  10.     hp=(guysbuf[id&0xFFF].misc2)*(misc-1)*DAMAGE_MULTIPLIER+guysbuf[id&0xFFF].hp;
  11.     dir = down;
  12.     hxofs=4;
  13.     hxsz=8;
  14.     //    frate=17*4;
  15.     fading=fade_blue_poof;
  16.    
  17.     //nets+5420;
  18.     if(get_bit(quest_rules,qr_NEWENEMYTILES))
  19.     {
  20.         /*
  21.             necktile=o_tile+8;
  22.             if (dmisc3)
  23.             {
  24.               necktile+=8;
  25.             }
  26.         */
  27.         necktile=o_tile+dmisc6;
  28.     }
  29.     else
  30.     {
  31.         necktile=s_tile;
  32.     }
  33. }
  34.  
  35. bool eGleeok::animate(int index)
  36. {
  37.     if(dying)
  38.         return Dead(index);
  39.        
  40.     if(clk==0)
  41.     {
  42.         removearmos(x,y);
  43.     }
  44.    
  45.     // Check if a head was killed somehow...
  46.     if(index+1+clk3>=guys.Count())
  47.         clk3=guys.Count()-index-1;
  48.     if(index+1+misc>=guys.Count())
  49.         misc=guys.Count()-index-1;
  50.    
  51.     //fix for the "kill all enemies" item
  52.     if(hp==-1000)
  53.     {
  54.         for(int i=0; i<clk3; ++i)
  55.         {
  56.             // I haven't seen this fail, but it seems like it ought to be
  57.             // possible, so I'm checking for it. - Saf
  58.             if((((enemy*)guys.spr(index+i+1))->id&0xFFF)!=(id&0xFFF))
  59.                 break;
  60.             ((enemy*)guys.spr(index+i+1))->hp=1;                   // re-animate each head,
  61.             ((enemy*)guys.spr(index+i+1))->misc = -1;              // disconnect it,
  62.             ((enemy*)guys.spr(index+i+1))->animate(index+i+1);     // let it animate one frame,
  63.             ((enemy*)guys.spr(index+i+1))->hp=-1000;               // and kill it for good
  64.         }
  65.        
  66.         clk3=0;
  67.        
  68.         for(int i=0; i<misc; i++)
  69.         {
  70.             if((((enemy*)guys.spr(index+i+1))->id&0xFFF)!=(id&0xFFF))
  71.                 break;
  72.             ((enemy*)guys.spr(index+i+1))->misc = -2;             // give the signal to disappear
  73.         }
  74.     }
  75.    
  76.     for(int i=0; i<clk3; i++)
  77.     {
  78.         enemy *head = ((enemy*)guys.spr(index+i+1));
  79.         head->dummy_int[1]=necktile;
  80.        
  81.         if(get_bit(quest_rules,qr_NEWENEMYTILES))
  82.         {
  83.             head->dummy_int[2]=o_tile+dmisc8; //connected head tile
  84.             head->dummy_int[3]=o_tile+dmisc9; //flying head tile
  85.         }
  86.         else
  87.         {
  88.             head->dummy_int[2]=necktile+1; //connected head tile
  89.             head->dummy_int[3]=necktile+2; //flying head tile
  90.         }
  91.        
  92.         head->dmisc5=dmisc5; //neck segments
  93.        
  94.         /*
  95.             if (dmisc3)
  96.             {
  97.               head->dummy_bool[0]=true;
  98.             }
  99.         */
  100.         if(head->hclk)
  101.         {
  102.             if(hclk==0)
  103.             {
  104.                 hp -= 1000 - head->hp;
  105.                 hclk = 33;
  106.                
  107.                 if(hitsfx>0) sfx(hitsfx,pan(int(head->x)));
  108.                
  109.                 sfx(WAV_EHIT,pan(int(head->x)));
  110.             }
  111.            
  112.             head->hclk = 0;
  113.         }
  114.        
  115.         // Must be set in case of naughty ZScripts
  116.         head->hp = 1000;
  117.     }
  118.    
  119.     if(hp<=(guysbuf[id&0xFFF].misc2)*(clk3-1)*DAMAGE_MULTIPLIER)
  120.     {
  121.         ((enemy*)guys.spr(index+clk3))->misc = -1;              // give signal to fly off
  122.         hp=(guysbuf[id&0xFFF].misc2)*(--clk3)*DAMAGE_MULTIPLIER;
  123.     }
  124.    
  125.     if(!dmisc3)
  126.     {
  127.         if(++clk2>72 && !(rand()&3))
  128.         {
  129.             int i=rand()%misc;
  130.             enemy *head = ((enemy*)guys.spr(index+i+1));
  131.             addEwpn(head->x,head->y,head->z,wpn,3,wdp,dir,getUID());
  132.             sfx(wpnsfx(wpn),pan(int(x)));
  133.             clk2=0;
  134.         }
  135.     }
  136.     else
  137.     {
  138.         if(++clk2>100 && !(rand()&3))
  139.         {
  140.             enemy *head = ((enemy*)guys.spr(rand()%misc+index+1));
  141.             head->timer=rand()%50+50;
  142.             clk2=0;
  143.         }
  144.     }
  145.    
  146.     if(hp<=0)
  147.     {
  148.         for(int i=0; i<misc; i++)
  149.             ((enemy*)guys.spr(index+i+1))->misc = -2;             // give the signal to disappear
  150.            
  151.         if(flags&guy_neverret) never_return(index);
  152.     }
  153.    
  154.     return enemy::animate(index);
  155. }
  156.  
  157. int eGleeok::takehit(weapon*)
  158. {
  159.     return 0;
  160. }
  161.  
  162. void eGleeok::draw(BITMAP *dest)
  163. {
  164.     tile=o_tile;
  165.    
  166.     if(dying)
  167.     {
  168.         enemy::draw(dest);
  169.         return;
  170.     }
  171.    
  172.     int f=clk/17;
  173.    
  174.     if(get_bit(quest_rules,qr_NEWENEMYTILES))
  175.     {
  176.         // body
  177.         xofs=-8;
  178.         yofs=32;
  179.        
  180.         switch(f)
  181.        
  182.         {
  183.         case 0:
  184.             tile+=0;
  185.             break;
  186.            
  187.         case 1:
  188.             tile+=2;
  189.             break;
  190.            
  191.         case 2:
  192.             tile+=4;
  193.             break;
  194.            
  195.         default:
  196.             tile+=6;
  197.             break;
  198.         }
  199.     }
  200.     else
  201.     {
  202.         // body
  203.         xofs=-8;
  204.         yofs=32;
  205.        
  206.         switch(f)
  207.         {
  208.         case 0:
  209.             tile+=0;
  210.             break;
  211.            
  212.         case 2:
  213.             tile+=4;
  214.             break;
  215.            
  216.         default:
  217.             tile+=2;
  218.             break;
  219.         }
  220.     }
  221.    
  222.     enemy::drawblock(dest,15);
  223. }
  224.  
  225. void eGleeok::draw2(BITMAP *dest)
  226. {
  227.     // the neck stub
  228.     tile=necktile;
  229.     xofs=0;
  230.     yofs=playing_field_offset;
  231.    
  232.     if(get_bit(quest_rules,qr_NEWENEMYTILES))
  233.     {
  234.         tile+=((clk&24)>>3);
  235.     }
  236.    
  237.     /*
  238.       else
  239.       {
  240.         tile=145;
  241.       }
  242.     */
  243.     /*
  244.       if(hp>0 && !dont_draw())
  245.       sprite::draw(dest);
  246.       */
  247.     if(hp > 0 && !dont_draw())
  248.     {
  249.         if((tmpscr->flags3&fINVISROOM)&& !(current_item(itype_amulet)))
  250.             sprite::drawcloaked(dest);
  251.         else
  252.             sprite::draw(dest);
  253.     }
  254. }
  255.  
  256. esGleeok::esGleeok(fix X,fix Y,int Id,int Clk, sprite * prnt) : enemy(X,Y,Id,Clk), parent(prnt)
  257. {
  258.     xoffset=0;
  259.     yoffset=(fix)((dmisc5*4+2));
  260. //  dummy_bool[0]=false;
  261.     timer=0;
  262.     /*  fixing */
  263.     hp=1000;
  264.     step=1;
  265.     item_set=0;
  266.     //x=120; y=70;
  267.     x = xoffset+parent->x;
  268.     y = yoffset+parent->y;
  269.     hxofs=4;
  270.     hxsz=8;
  271.     yofs=playing_field_offset;
  272.     clk2=clk;                                                 // how long to wait before moving first time
  273.     clk=0;
  274.     mainguy=count_enemy=false;
  275.     dir=rand();
  276.     clk3=((dir&2)>>1)+2;                                      // left or right
  277.     dir&=1;                                                   // up or down
  278.     dmisc5=vbound(dmisc5,1,255);
  279.    
  280.     for(int i=0; i<dmisc5; i++)
  281.     {
  282.         nxoffset[i] = 0;
  283.         nyoffset[i] = 0;
  284.         nx[i] = ((((i*(int)x) + (dmisc5-i)*((int)parent->x))) /dmisc5);
  285.         ny[i] = ((((i*(int)y) + (dmisc5-i)*((int)parent->y))) /dmisc5);
  286.     }
  287.    
  288.     necktile=0;
  289.     //TODO compatibility? -DD
  290.     /*
  291.     for(int i=0; i<4; i++)
  292.     {
  293.       nx[i]=124;
  294.       ny[i]=i*6+48;
  295.     }*/
  296.     bgsfx=-1;
  297.     //no need for deadsfx
  298. }
  299.  
  300. bool esGleeok::animate(int index)
  301. {
  302.     // don't call removearmos() - it's a segment.
  303.    
  304.     dmisc5=vbound(dmisc5,1,255);
  305.    
  306.     if(misc == 0)
  307.     {
  308.         x = (xoffset+parent->x);
  309.         y = (yoffset+parent->y);
  310.        
  311.         for(int i=0; i<dmisc5; i++)
  312.         {
  313.             nx[i] = ((((i*(int)x) + (dmisc5-i)*((int)parent->x))) /dmisc5) + 3 + nxoffset[i];
  314.             ny[i] = ((((i*(int)y) + (dmisc5-i)*((int)parent->y))) /dmisc5) + nyoffset[i];
  315.         }
  316.     }
  317.    
  318.     //  set up the head tiles
  319. //  headtile=nets+5588;                                       //5580, actually.  must adjust for direction later on
  320.     /*
  321.       if (dummy_bool[0])                                        //if this is a flame gleeok
  322.       {
  323.         headtile+=180;
  324.       }
  325.     */
  326.     headtile=dummy_int[2];                                       //5580, actually.  must adjust for direction later on
  327.     flyingheadtile=dummy_int[3];
  328.    
  329.     //  set up the neck tiles
  330.     necktile=dummy_int[1];
  331.    
  332.     if(get_bit(quest_rules,qr_NEWENEMYTILES))
  333.     {
  334.         necktile+=((clk&24)>>3);
  335.     }
  336.    
  337.     /*
  338.       else
  339.       {
  340.         necktile=145;
  341.       }
  342.     */
  343.     //    ?((dummy_bool[0])?(nets+4052+(16+((clk&24)>>3))):(nets+4040+(8+((clk&24)>>3)))):145)
  344.    
  345.     switch(misc)
  346.     {
  347.     case 0:                                                 // live head
  348.         //  set up the attached head tiles
  349.         tile=headtile;
  350.        
  351.         if(get_bit(quest_rules,qr_NEWENEMYTILES))
  352.         {
  353.             tile+=((clk&24)>>3);
  354.             /*
  355.               if (dummy_bool[0]) {
  356.               tile+=1561;
  357.               }
  358.               */
  359.         }
  360.        
  361.         /*
  362.             else
  363.             {
  364.               tile=146;
  365.             }
  366.         */
  367.         if(++clk2>=0 && !(clk2&3))
  368.         {
  369.             if(y<= (int)parent->y + 8) dir=down;
  370.            
  371.             if(y>= (int)parent->y + dmisc5*8) dir = up;
  372.            
  373.             if(y<= (int)parent->y + 10 && !(rand()&31))
  374.             {
  375.                 dir^=1;
  376.             }
  377.            
  378.             fix tempx = x;
  379.             fix tempy = y;
  380.            
  381.             sprite::move(step);
  382.             xoffset += (x-tempx);
  383.             yoffset += (y-tempy);
  384.            
  385.             if(clk2>=4)
  386.             {
  387.                 clk3^=1;
  388.                 clk2=-4;
  389.             }
  390.             else
  391.             {
  392.                 if(x <= (int)parent->x-(dmisc5*6))
  393.                 {
  394.                     clk3=right;
  395.                 }
  396.                
  397.                 if(x >= (int)parent->x+(dmisc5*6))
  398.                 {
  399.                     clk3=left;
  400.                 }
  401.                
  402.                 if(y <= (int)parent->y+(dmisc5*6) && !(rand()&15))
  403.                 {
  404.                     clk3^=1;                                        // x jig
  405.                 }
  406.                 else
  407.                 {
  408.                     if(y<=(int)parent->y+(dmisc5*4) && !(rand()&31))
  409.                     {
  410.                         clk3^=1;                                      // x switch back
  411.                     }
  412.                    
  413.                     clk2=-4;
  414.                 }
  415.             }
  416.            
  417.             zc_swap(dir,clk3);
  418.             tempx = x;
  419.             tempy = y;
  420.             sprite::move(step);
  421.             xoffset += (x-tempx);
  422.             yoffset += (y-tempy);
  423.             zc_swap(dir,clk3);
  424.            
  425.             for(int i=1; i<dmisc5; i++)
  426.             {
  427.                 nxoffset[i] = (rand()%3);
  428.                 nyoffset[i] = (rand()%3);
  429.             }
  430.         }
  431.        
  432.         break;
  433.        
  434.     case 1:                                                 // flying head
  435.         if(clk>=0)
  436.        
  437.         {
  438.             variable_walk_8(rate,homing,hrate,spw_floater);
  439.         }
  440.        
  441.         break;
  442.        
  443.         // the following are messages sent from the main guy...
  444.     case -1:                                                // got chopped off
  445.     {
  446.         misc=1;
  447.         superman=1;
  448.         hxofs=xofs=0;
  449.         hxsz=16;
  450.         cs=8;
  451.         clk=-24;
  452.         clk2=40;
  453.         dir=(rand()&7)+8;
  454.         step=8.0/9.0;
  455.     }
  456.     break;
  457.    
  458.     case -2:                                                // the big guy is dead
  459.         return true;
  460.     }
  461.    
  462.     if(timer)
  463.     {
  464.         if(!(timer%8))
  465.         {
  466.             FireBreath(true);
  467.         }
  468.        
  469.         --timer;
  470.     }
  471.    
  472.     return enemy::animate(index);
  473. }
  474.  
  475. int esGleeok::takehit(weapon *w)
  476. {
  477.     int ret = enemy::takehit(w);
  478.    
  479.     if(ret==-1)
  480.         return 2; // force it to wait a frame before checking sword attacks again
  481.        
  482.     return ret;
  483. }
  484.  
  485. void esGleeok::draw(BITMAP *dest)
  486. {
  487.     dmisc5=vbound(dmisc5,1,255);
  488.    
  489.     switch(misc)
  490.     {
  491.     case 0:                                                 //neck
  492.         if(!dont_draw())
  493.         {
  494.             for(int i=1; i<dmisc5; i++)                              //draw the neck
  495.             {
  496.                 if(get_bit(quest_rules,qr_NEWENEMYTILES))
  497.                 {
  498.                     if((tmpscr->flags3&fINVISROOM)&& !(current_item(itype_amulet)))
  499.                         overtilecloaked16(dest,necktile+(i*dmisc7),nx[i]-4,ny[i]+playing_field_offset,0);
  500.                     else
  501.                         overtile16(dest,necktile+(i*dmisc7),nx[i]-4,ny[i]+playing_field_offset,cs,0);
  502.                 }
  503.                 else
  504.                 {
  505.                     if((tmpscr->flags3&fINVISROOM)&& !(current_item(itype_amulet)))
  506.                         overtilecloaked16(dest,necktile,nx[i]-4,ny[i]+playing_field_offset,0);
  507.                     else
  508.                         overtile16(dest,necktile,nx[i]-4,ny[i]+playing_field_offset,cs,0);
  509.                 }
  510.             }
  511.         }
  512.        
  513.         break;
  514.        
  515.     case 1:                                                 //flying head
  516.         tile=flyingheadtile;
  517.        
  518.         if(get_bit(quest_rules,qr_NEWENEMYTILES))
  519.         {
  520.             tile+=((clk&24)>>3);
  521.             break;
  522.         }
  523.        
  524.         /*
  525.             else
  526.             {
  527.               tile=(clk&1)?147:148;
  528.               break;
  529.             }
  530.         */
  531.     }
  532. }
  533.  
  534. void esGleeok::draw2(BITMAP *dest)
  535. {
  536.     enemy::draw(dest);
  537. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement