home *** CD-ROM | disk | FTP | other *** search
/ WarCraft 2000 - Nuclear Epidemic / W2000.nrg / SOURCE.War2000 / Strange.cpp < prev    next >
C/C++ Source or Header  |  1998-09-01  |  22KB  |  874 lines

  1. #include "ddini.h"
  2. #include "ResFile.h"
  3. #include "FastDraw.h"
  4. #include "mgraph.h"
  5. #include "mouse.h"
  6. #include "menu.h"
  7. #include "MapDiscr.h"
  8. #include "multipl.h"
  9. #include "fog.h"
  10. #include "walls.h"
  11. #include "Nature.h"
  12. #include "WeaponID.h"
  13. #include <time.h>
  14. #include "Nucl.h"
  15. #include "TopZones.h"
  16. #include "Megapolis.h"
  17. #include "3DSurf.h"
  18. #include "MapEdit.h"
  19. const wdrx[8]={0,1,1,1,0,-1,-1,-1};
  20. const wdry[8]={-1,-1,0,1,1,1,0,-1};
  21. extern short TSin[257];
  22. extern short TCos[257];
  23. extern short TAtg[257];
  24. extern int NUCLUSE[4];
  25. word GetOwner(int x,int y);
  26. #include "Strange.h"
  27.  
  28. StrangeWeapon::StrangeWeapon(){
  29.     Enabled=false;
  30. };
  31. word CheckFriend(byte NI,int x,int y){
  32.     if(x<1||x>=msx||y<1||y>=msy)return 0xFFFF;
  33.     word MID=GetOwner((x<<5)+16,(y<<5)+16);
  34.     if(MID!=0xFFFF){
  35.         OneObject* OB=Group[MID];
  36.         if(OB)return MID;
  37.         if(NI==OB->NNUM)return MID;
  38.     };
  39.     return 0xFFFF;
  40. };
  41. word FindFriend(byte NI,int x,int y){
  42.     word MID=CheckFriend(NI,x,y);
  43.     if(MID!=0xFFFF)return MID;
  44.     MID=CheckFriend(NI,x+1,y);
  45.     if(MID!=0xFFFF)return MID;
  46.     MID=CheckFriend(NI,x-1,y);
  47.     if(MID!=0xFFFF)return MID;
  48.     MID=CheckFriend(NI,x,y-1);
  49.     if(MID!=0xFFFF)return MID;
  50.     MID=CheckFriend(NI,x,y+1);
  51.     if(MID!=0xFFFF)return MID;
  52.     MID=CheckFriend(NI,x-1,y-1);
  53.     if(MID!=0xFFFF)return MID;
  54.     MID=CheckFriend(NI,x+1,y-1);
  55.     if(MID!=0xFFFF)return MID;
  56.     MID=CheckFriend(NI,x-1,y+1);
  57.     if(MID!=0xFFFF)return MID;
  58.     MID=CheckFriend(NI,x+1,y+1);
  59.     if(MID!=0xFFFF)return MID;
  60.     return 0xFFFF;
  61. };
  62. void MakeExpl(int xx,int yy);
  63. void MakeFog(int xx,int yy){
  64.     //if(rando()<2048){
  65.         //CreateExObjD(WPLIST[ID_FIREX],
  66.         //    xx,yy,rando()&255,0,0,NULL);
  67.     //    CreateExObjD(WPLIST[ID_FIREX],
  68.     //        xx+12,yy,rando()&255,0,0,NULL);
  69.     //};
  70.     if(rando()<512)
  71.         CreateExObjD(WPLIST[ID_FOG1],
  72.             xx,yy-50,64,4,0,NULL);
  73.         else 
  74.         CreateExObjD(WPLIST[ID_FOG],
  75.             xx,yy-60,64,4,0,NULL);
  76.  
  77. };
  78. void MakeRFog(int xx,int yy){
  79.     //if(rando()<2048){
  80.         //CreateExObjD(WPLIST[ID_FIREX],
  81.         //    xx,yy,rando()&255,0,0,NULL);
  82.     //    CreateExObjD(WPLIST[ID_FIREX],
  83.     //        xx+12,yy,rando()&255,0,0,NULL);
  84.     //};
  85.     if(rando()<5000)
  86.         CreateExObjD(WPLIST[ID_FOG1],
  87.             xx,yy-50,64,4,0,NULL);
  88.         else 
  89.         CreateExObjD(WPLIST[ID_FOG],
  90.             xx,yy-60,64,4,0,NULL);
  91.  
  92. };
  93.  
  94. void MakeExpl(int xx,int yy){
  95.     if(rando()<512)
  96.         CreateExObjD(WPLIST[ID_EXPL1],
  97.             xx,yy-50,64,4,0,NULL);
  98.         else 
  99.         CreateExObjD(WPLIST[ID_EXPL2],
  100.             xx,yy-60,64,4,0,NULL);
  101.  
  102. };
  103. void HandleHugeBomb(StrangeWeapon* SW);
  104. void StrangeWeapon::CreateHugeBomb(int ex,int ey,int er1,int er2,int time,word MagID){
  105.     OneObject* OB=Group[MagID];
  106.     Nation* NT=OB->Nat;
  107.     if(OB->Magic<NT->WMagic[0])return;
  108.     OB->Magic-=NT->WMagic[0];
  109.     x=ex<<7;
  110.     y=ey<<7;
  111.     OwnerID=MagID;
  112.     if(OB)OwnerSerial=OB->Serial;
  113.     HugeBomb.Radius1=er1;
  114.     HugeBomb.Radius2=er2;
  115.     HugeBomb.NR1=5;
  116.     HugeBomb.Radius1=er1;
  117.     HugeBomb.Radius2=er2;
  118.     HugeBomb.r1=32;
  119.     HugeBomb.r2=64;
  120.     HugeBomb.vr1=div(er1-32,time).quot;
  121.     HugeBomb.vr2=div(er2-64,time).quot;
  122.     Enabled=true;
  123.     SWH=&HandleHugeBomb;
  124. };
  125. void HandleHugeBomb(StrangeWeapon* SW){
  126.     if(SW->Enabled){
  127.         OneObject* OB=Group[SW->OwnerID];
  128.         for(int j=0;j<0;j++){
  129.             byte angl=rando()&255;
  130.             int rad=rando()&511;
  131.             int xx=SW->x+((rad*TSin[angl])>>8)+90;
  132.             int yy=SW->y+((rad*TCos[angl])>>8)+90;
  133.             byte xxx=byte(xx>>7);
  134.             byte yyy=byte(xx>>7);
  135.             word MID=Mops[yyy][xxx];
  136.             if(MID!=0xFFFF&&int(Group[MID]))
  137.                 Group[MID]->MakeDamage(0,3,OB);
  138.             if(rando()<8192)MakeFog(xx,yy);
  139.             //    CreateExObjD(WPLIST[NUCLUSE[rando()&3]],xx,yy,angl,8,255,NULL);
  140.             SW->HugeBomb.r1++;
  141.         };
  142.         int rx=SW->HugeBomb.r2;
  143.         if(rx>30)rx=50;
  144.         for(j=0;j<rx;j++){
  145.             byte angl=rando()&255;
  146.             int rr=SW->HugeBomb.r2+(rando()&127);
  147.             int xx=SW->x+((rr*TSin[angl])>>8)+90;
  148.             int yy=SW->y+((rr*TCos[angl])>>8)+90;
  149.             byte xxx=byte(xx>>7);
  150.             byte yyy=byte(yy>>7);
  151.             word MID=Mops[yyy][xxx];
  152.             if(MID!=0xFFFF&&int(Group[MID]))
  153.                 Group[MID]->MakeDamage(0,3,OB);
  154.             if(rando()<8192)MakeFog(xx,yy);
  155.             //CreateExObjD(WPLIST[NUCLUSE[rando()&3]],xx,yy,angl,16,255,NULL);
  156.             SW->HugeBomb.r2++;
  157.         };
  158.         if(SW->HugeBomb.r2>SW->HugeBomb.Radius2)SW->Enabled=false;
  159.     };
  160. };
  161. //SEA OF FIRE: 1
  162. void HandleFireSea(StrangeWeapon* SW);
  163. void StrangeWeapon::CreateFireSea(int ex,int ey,word MagID){
  164.     OneObject* OB=Group[MagID];
  165.     Nation* NT=OB->Nat;
  166.     if(OB->Magic<NT->WMagic[1])return;
  167.     OB->Magic-=NT->WMagic[1];
  168.     Enabled=true;
  169.     x=ex<<7;
  170.     y=ey<<7;
  171.     OwnerID=MagID;
  172.     if(OB)OwnerSerial=OB->Serial;
  173.     else{
  174.         Enabled=false;
  175.         return;
  176.     };
  177.     HugeBomb.r1=100;
  178.     MagAmount=10;
  179.     MagSpeed=1;
  180.     MagMaxConsume=NT->WMagic[1];
  181.     MagConsume=0;
  182.     NNUM=OB->NNUM;
  183.     SWH=&HandleFireSea;
  184. };
  185. void HandleFireSea(StrangeWeapon* SW){
  186.     if(SW->Enabled){
  187.         OneObject* OB=Group[SW->OwnerID];
  188.         if(!OB||(OB&&
  189.         (OB->Serial!=SW->OwnerSerial||OB->Magic<SW->MagSpeed))){
  190.             SW->MagSpeed=0;
  191.             return;
  192.         };
  193.         SW->MagConsume+=SW->MagSpeed;
  194.         //OB->Magic-=SW->MagSpeed;
  195.         if(SW->MagConsume>=SW->MagMaxConsume)SW->MagSpeed=0;
  196.         if(SW->HugeBomb.r1)SW->HugeBomb.r1--;
  197.         else SW->Enabled=false;
  198.         //Body of graphic routine
  199.         for(int i=0;i<8;i++){
  200.             int xx=SW->x+(rando()>>6)-256;
  201.             int yy=SW->y+(rando()>>6)-256;
  202.             if(SW->MagSpeed){
  203.                 if(rando()<6000)
  204.                     CreateExObjD(WPLIST[ID_FIRE1],
  205.                     xx,yy,rando()&255,16,0,NULL);
  206.                 else CreateExObjD(WPLIST[ID_FIRE],
  207.                     xx,yy,rando()&255,16,0,NULL);
  208.             };
  209.             word MID=Mops[yy>>7][xx>>7];
  210.             if(MID!=0xFFFF){
  211.                 OneObject* OB1=Group[MID];
  212.                 if(OB1){
  213.                     if(rando()>8000)OB1->MakeDamage(0,2,OB);
  214.                 };
  215.             };
  216.             MakeFog(xx,yy);
  217.         };
  218.         //end of graphic routine
  219.     };
  220. };
  221.  
  222. //END SEA OF FIRE: 1
  223. //BLIZZARD: 2
  224. void HandleBlizzard(StrangeWeapon* SW);
  225. void StrangeWeapon::CreateBlizzard(int ex,int ey,word MagID){
  226.     OneObject* OB=Group[MagID];
  227.     Nation* NT=OB->Nat;
  228.     if(OB->Magic<NT->WMagic[2])return;
  229.     OB->Magic-=NT->WMagic[2];
  230.     Enabled=true;
  231.     x=ex<<7;
  232.     y=ey<<7;
  233.     OwnerID=MagID;
  234.     if(OB)OwnerSerial=OB->Serial;
  235.     else{
  236.         Enabled=false;
  237.         return;
  238.     };
  239.     MagAmount=10;
  240.     MagSpeed=1;
  241.     MagMaxConsume=NT->WMagic[2];
  242.     MagConsume=0;
  243.     NNUM=OB->NNUM;
  244.     SWH=&HandleBlizzard;
  245. };
  246. void HandleBlizzard(StrangeWeapon* SW){
  247.     if(SW->Enabled){
  248.         OneObject* OB=Group[SW->OwnerID];
  249.         if(!OB||(OB&&
  250.         (OB->Serial!=SW->OwnerSerial||OB->Magic<SW->MagSpeed))){
  251.             SW->Enabled=false;
  252.             return;
  253.         };
  254.         SW->MagConsume+=SW->MagSpeed;
  255.         //OB->Magic-=SW->MagSpeed;
  256.         if(SW->MagConsume>=SW->MagMaxConsume)SW->Enabled=false;
  257.         //Body of graphic routine
  258.         for(int i=0;i<8;i++){
  259.             int xx=SW->x+(rando()>>6)-256;
  260.             int yy=SW->y+(rando()>>6)-256;
  261.             CreateExObjD(WPLIST[ID_GLASSFLY],
  262.                 xx-100-100,yy-500-100,50,64,255,NULL);
  263.         };
  264.         //end of graphic routine
  265.     };
  266. };
  267.  
  268. //END BLIZZARD: 2
  269. //MAGIC EXPLOSION: 3
  270. void HandleMExplosion(StrangeWeapon* SW);
  271. void StrangeWeapon::CreateMExplosion(int ex,int ey,word MagID){
  272.     OneObject* OB=Group[MagID];
  273.     Nation* NT=OB->Nat;
  274.     if(OB->Magic<NT->WMagic[3])return;
  275.     Enabled=true;
  276.     x=ex<<7;
  277.     y=ey<<7;
  278.     OwnerID=MagID;
  279.     if(OB)OwnerSerial=OB->Serial;
  280.     else{
  281.         Enabled=false;
  282.         return;
  283.     };
  284.     MagAmount=10;
  285.     MagSpeed=1;
  286.     MagMaxConsume=100;
  287.     MagConsume=0;
  288.     NNUM=OB->NNUM;
  289.     MExp.r=1;
  290.     MExp.r1=300;
  291.     SWH=&HandleMExplosion;
  292. };
  293. void HandleMExplosion(StrangeWeapon* SW){
  294.     if(SW->Enabled){
  295.         OneObject* OB=Group[SW->OwnerID];
  296.         if(!OB||(OB&&
  297.         (OB->Serial!=SW->OwnerSerial||OB->Magic<SW->MagSpeed))){
  298.             SW->Enabled=false;
  299.             return;
  300.         };
  301.         SW->MagConsume+=SW->MagSpeed;
  302.         OB->Magic-=rando()&1;
  303.         if(SW->MagConsume>=SW->MagMaxConsume)SW->Enabled=false;
  304.         //Body of graphic routine
  305.         int rr=SW->MExp.r;
  306.         SW->MExp.r+=8;
  307.         int n=(rr>>3)+4;
  308.         for(int i=0;i<n;i++){
  309.             byte angl=rando()&255;
  310.             int xx=SW->x+((rr*TSin[angl])>>8);
  311.             int yy=SW->y+((rr*TCos[angl])>>8);
  312.             word MID=Mops[yy>>7][xx>>7];
  313.             if(MID!=0xFFFF){
  314.                 OneObject* OBX=Group[MID];
  315.                 if(OBX){
  316.                     if(OBX->NNUM==OB->NNUM){
  317.                         if(OBX->xForce>=32&&OBX->MTime<980){
  318.                             OBX->xForce=48;
  319.                             OBX->MTime=1000;
  320.                         }else if(OBX->xForce>=48&&OBX->MTime<980){
  321.                             OBX->xForce=64;
  322.                             OBX->MTime=1000;
  323.                         }else{
  324.                             if(OBX->xForce>16){
  325.                                 OBX->MTime=1000;
  326.                             }else{;
  327.                                 OBX->xForce=32;
  328.                                 OBX->MTime=1000;
  329.                             };
  330.                         };
  331.                     };
  332.                 };
  333.             };
  334.             //byte xxx=byte(xx>>7);
  335.             //byte yyy=byte(yy>>7);
  336.             CreateExObjD(WPLIST[ID_MAGEXP],
  337.                 xx,yy,angl,16,255,NULL);
  338.         };
  339.         //end of graphic routine
  340.     };
  341. };
  342.  
  343. //END MAGIC EXPLOSION : 3
  344. //MAGIC EXPLOSION 1 : 4
  345. void HandleMExplosion1(StrangeWeapon* SW);
  346. void StrangeWeapon::CreateMExplosion1(int ex,int ey,word MagID){
  347.     OneObject* OB=Group[MagID];
  348.     Nation* NT=OB->Nat;
  349.     if(OB->Magic<NT->WMagic[4])return;
  350.     Enabled=true;
  351.     x=ex<<7;
  352.     y=ey<<7;
  353.     OwnerID=MagID;
  354.     if(OB)OwnerSerial=OB->Serial;
  355.     else{
  356.         Enabled=false;
  357.         return;
  358.     };
  359.     MagAmount=10;
  360.     MagSpeed=1;
  361.     MagMaxConsume=100;
  362.     MagConsume=0;
  363.     NNUM=OB->NNUM;
  364.     MExp.r=20;
  365.     MExp.r1=0;
  366.     SWH=&HandleMExplosion1;
  367. };
  368. void HandleMExplosion1(StrangeWeapon* SW){
  369.     if(SW->Enabled){
  370.         OneObject* OB=Group[SW->OwnerID];
  371.         if(!OB||(OB&&
  372.         (OB->Serial!=SW->OwnerSerial||OB->Magic<SW->MagSpeed))){
  373.             SW->Enabled=false;
  374.             return;
  375.         };
  376.         SW->MagConsume+=SW->MagSpeed;
  377.         OB->Magic-=rando()&1;
  378.         if(SW->MagConsume>=SW->MagMaxConsume)SW->Enabled=false;
  379.         //Body of graphic routine
  380.         int rr=SW->MExp.r;
  381.         SW->MExp.r+=8;
  382.         SW->MExp.r1+=2;
  383.         //int n=(rr>>3)+4;
  384.         for(int i=0;i<20;i++){
  385.             byte angl=(((rando()&7)<<5)+SW->MExp.r1)&255;
  386.             rr-=8;
  387.             int xx=SW->x+((rr*TSin[angl])>>8);
  388.             int yy=SW->y+((rr*TCos[angl])>>8);
  389.             //byte xxx=byte(xx>>7);
  390.             //byte yyy=byte(yy>>7);
  391.             word MID=Mops[yy>>7][xx>>7];
  392.             if(MID!=0xFFFF){
  393.                 OneObject* OBX=Group[MID];
  394.                 if(OBX){
  395.                     if(OBX->NNUM!=OB->NNUM){
  396.                         OBX->xForce=8;
  397.                         OBX->MTime=300;
  398.                     };
  399.                 };
  400.             };
  401.             CreateExObjD(WPLIST[ID_MAGEXP],
  402.                 xx,yy,angl,0,255,NULL);
  403.         };
  404.         //end of graphic routine
  405.     };
  406. };
  407.  
  408. //END MAGIC EXPLOSION1 : 4
  409. //MAGIC FIREWALL : 5
  410. void HandleFireWall(StrangeWeapon* SW);
  411. void StrangeWeapon::CreateFireWall(int ex,int ey,word MagID){
  412.     OneObject* OB=Group[MagID];
  413.     Nation* NT=OB->Nat;
  414.     if(OB->Magic<NT->WMagic[5])return;
  415.     word MD=CheckFriend(NNUM,ex,ey);
  416.     if(MD==0xFFFF)return; 
  417.     OneObject* POB=Group[MD];
  418.     if(POB){
  419.         HugeBomb.PID=MD;
  420.         HugeBomb.PSerialID=POB->Serial;
  421.     }else return;
  422.     Enabled=true;
  423.     x=ex<<7;
  424.     y=ey<<7;
  425.     OwnerID=MagID;
  426.     if(OB)OwnerSerial=OB->Serial;
  427.     else{
  428.         Enabled=false;
  429.         return;
  430.     };
  431.     MagAmount=10;
  432.     MagSpeed=1;
  433.     MagMaxConsume=300;
  434.     MagConsume=0;
  435.     NNUM=OB->NNUM;
  436.     MExp.r=1;
  437.     MExp.r1=300;
  438.     SWH=&HandleFireWall;
  439. };
  440. void HandleFireWall(StrangeWeapon* SW){
  441.     if(SW->Enabled){
  442.         OneObject* OB=Group[SW->OwnerID];
  443.         if(!OB||(OB&&
  444.         (OB->Serial!=SW->OwnerSerial||OB->Magic<SW->MagSpeed))){
  445.             SW->Enabled=false;
  446.             return;
  447.         };
  448.         OneObject* POB=Group[SW->HugeBomb.PID];
  449.         if(!POB||(POB&&SW->HugeBomb.PSerialID!=POB->Serial)){
  450.             SW->Enabled=false;
  451.             return;
  452.         };
  453.         SW->MagConsume+=SW->MagSpeed;
  454.         if(rando()<8000)OB->Magic-=rando()&1;
  455.         if(SW->MagConsume>=SW->MagMaxConsume)SW->Enabled=false;
  456.         //Body of graphic routine
  457.         int rr=400;
  458.         //SW->MExp.r+=8;
  459.         //int n=(rr>>5)+4;
  460.         int mx=(int(POB->x)<<5)+POB->Addx;
  461.         int my=(int(POB->y)<<5)+POB->Addy;
  462.         if(POB->isMoving){
  463.             int nsp=POB->CurAnm->count;
  464.             if(nsp>3){
  465.                 mx+=div(34*POB->CurrentSprite*wdrx[POB->Direction],nsp).quot;
  466.                 my+=div(32*POB->CurrentSprite*wdry[POB->Direction],nsp).quot;
  467.             };
  468.         };
  469.         mx=mx<<2;
  470.         my=my<<2;
  471.         for(int i=0;i<2;i++){
  472.             byte angl=rando()&255;
  473.             int xx=mx+((rr*TSin[angl])>>8);
  474.             int yy=my+((rr*TCos[angl])>>8);
  475.             //byte xxx=byte(xx>>7);
  476.             //byte yyy=byte(yy>>7);
  477.             word MID=Mops[yy>>7][xx>>7];
  478.             if(MID!=0xFFFF){
  479.                 OneObject* OB1=Group[MID];
  480.                 if(OB1&&!(OB1->NMask&POB->NMask)){
  481.                     OB1->MakeDamage(0,8,OB);
  482.                 };
  483.             };
  484.             MakeFog(xx,yy);
  485.         };
  486.         //end of graphic routine
  487.     };
  488. };
  489. //END FIREWALL : 6
  490. //SUPER VISION :7
  491. void HandleSuperVision(StrangeWeapon* SW);
  492. void StrangeWeapon::CreateSuperVision(int ex,int ey,word MagID){
  493.     OneObject* OB=Group[MagID];
  494.     Nation* NT=OB->Nat;
  495.     if(OB->Magic<NT->WMagic[7])return;
  496.     Enabled=true;
  497.     x=ex<<7;
  498.     y=ey<<7;
  499.     OwnerID=MagID;
  500.     if(OB)OwnerSerial=OB->Serial;
  501.     else{
  502.         Enabled=false;
  503.         return;
  504.     };
  505.     MagAmount=10;
  506.     MagSpeed=1;
  507.     MagMaxConsume=10000;
  508.     MagConsume=0;
  509.     NNUM=OB->NNUM;
  510.     MExp.r=1;
  511.     MExp.r1=300;
  512.     SWH=&HandleSuperVision;
  513. };
  514. void HandleSuperVision(StrangeWeapon* SW){
  515.     if(SW->Enabled){
  516.         OneObject* OB=Group[SW->OwnerID];
  517.         if(!OB||(OB&&
  518.         (OB->Serial!=SW->OwnerSerial||OB->Magic<SW->MagSpeed))){
  519.             SW->Enabled=false;
  520.             return;
  521.         };
  522.         SW->MagConsume+=SW->MagSpeed;
  523.         if(!(rando()&7))OB->Magic-=rando()&1;
  524.         if(SW->MagConsume>=SW->MagMaxConsume)SW->Enabled=false;
  525.         //Body of graphic routine
  526.         for(int i=0;i<16;i++){
  527.             int xx=(SW->x>>7);
  528.             int yy=(SW->y>>7);
  529.             int dx=-16+(rando()&31);
  530.             int dy=-16+(rando()&31);
  531.             if(SW->NNUM==MyNation&&dx*dx+dy*dy<256)
  532.                 for(int fx=-2;fx<2;fx++)
  533.                     for(int fy=-2;fy<2;fy++){
  534.                         int hx=xx+dx+fx;
  535.                         int hy=yy+dy+fy;
  536.                         if(hx>1&&hx<msx&&hy>1&&hy<msy){
  537.                             if(fmap[hy][hx]<3800)fmap[hy][hx]+=600;
  538.                         };
  539.                     };
  540.         };
  541.         
  542.         //end of graphic routine
  543.     };
  544. };
  545. //END SUPER VISION : 7
  546. void HandleFlyUP(StrangeWeapon* SW);
  547. void StrangeWeapon::CreateFlyUP(int ex,int ey,int er1,int er2,int time,word MagID){
  548.     OneObject* OB=Group[MagID];
  549.     Nation* NT=OB->Nat;
  550.     if(OB->Magic<NT->WMagic[8])return;
  551.     OB->Magic-=NT->WMagic[9];
  552.     x=ex<<7;
  553.     y=ey<<7;
  554.     OwnerID=MagID;
  555.     if(OB)OwnerSerial=OB->Serial;
  556.     HugeBomb.Radius1=er1;
  557.     HugeBomb.Radius2=er2;
  558.     HugeBomb.NR1=5;
  559.     HugeBomb.Radius1=er1;
  560.     HugeBomb.Radius2=er2;
  561.     HugeBomb.r1=32;
  562.     HugeBomb.r2=64;
  563.     HugeBomb.vr1=div(er1-32,time).quot;
  564.     HugeBomb.vr2=div(er2-64,time).quot;
  565.     Enabled=true;
  566.     SWH=&HandleFlyUP;
  567. };
  568. void HandleFlyUP(StrangeWeapon* SW){
  569.     if(SW->Enabled){
  570.         OneObject* OB=Group[SW->OwnerID];
  571.         for(int j=0;j<0;j++){
  572.             byte angl=rando()&255;
  573.             int rad=rando()&511;
  574.             int xx=SW->x+((rad*TSin[angl])>>8);
  575.             int yy=SW->y+((rad*TCos[angl])>>8);
  576.             byte xxx=byte(xx>>7);
  577.             byte yyy=byte(xx>>7);
  578.             word MID=Mops[yyy][xxx];
  579.             if(MID!=0xFFFF){
  580.                 OneObject* OB=Group[MID];
  581.                 if(OB)OB->MakeMeFly(SW->OwnerID);
  582.             };
  583.             MakeFog(xx,yy);
  584.             SW->HugeBomb.r1++;
  585.         };
  586.         int rx=SW->HugeBomb.r2;
  587.         if(rx>30)rx=50;
  588.         for(j=0;j<rx;j++){
  589.             byte angl=rando()&255;
  590.             int rr=SW->HugeBomb.r2+(rando()&127);
  591.             int xx=SW->x+((rr*TSin[angl])>>8);
  592.             int yy=SW->y+((rr*TCos[angl])>>8);
  593.             byte xxx=byte(xx>>7);
  594.             byte yyy=byte(yy>>7);
  595.             word MID=Mops[yyy][xxx];
  596.             if(MID!=0xFFFF){
  597.                 OneObject* OB=Group[MID];
  598.                 if(OB)OB->MakeMeFly(SW->OwnerID);
  599.             };
  600.             MakeFog(xx,yy);
  601.             SW->HugeBomb.r2++;
  602.         };
  603.         if(SW->HugeBomb.r2>SW->HugeBomb.Radius2)SW->Enabled=false;
  604.     };
  605. };
  606. void HandleNucl(StrangeWeapon* SW);
  607. void StrangeWeapon::CreateNucl(int ex,int ey,int er1,int er2,int time){
  608.     x=ex<<7;
  609.     y=ey<<7;
  610.     HugeBomb.Radius1=er1;
  611.     HugeBomb.Radius2=er2;
  612.     HugeBomb.NR1=5;
  613.     HugeBomb.Radius1=er1;
  614.     HugeBomb.Radius2=er2;
  615.     HugeBomb.r1=32;
  616.     HugeBomb.r2=64;
  617.     HugeBomb.vr1=div(er1-32,time).quot;
  618.     HugeBomb.vr2=div(er2-64,time).quot;
  619.     Enabled=true;
  620.     SWH=&HandleNucl;
  621. };
  622. void HandleNucl(StrangeWeapon* SW){
  623.     if(SW->Enabled){
  624.         OneObject* OB=Group[SW->OwnerID];
  625.         for(int j=0;j<0;j++){
  626.             byte angl=rando()&255;
  627.             int rad=rando()&511;
  628.             int xx=SW->x+((rad*TSin[angl])>>8);
  629.             int yy=SW->y+((rad*TCos[angl])>>8);
  630.             byte xxx=byte(xx>>7);
  631.             byte yyy=byte(xx>>7);
  632.             word MID=Mops[yyy][xxx];
  633.             if(MID!=0xFFFF&&int(Group[MID]))
  634.                 Group[MID]->Die();
  635.             MakeExpl(xx,yy);
  636.             //MakeRFog(xx,yy);
  637.             if(rando()<2048){
  638.                 PutPoint(xxx,yyy,1,5);
  639.             };
  640.             if(rando()<3024){
  641.                 CreateBlob(xxx,yyy,-45-(rando()&7),2);
  642.             };
  643.             //    CreateExObjD(WPLIST[NUCLUSE[rando()&3]],xx,yy,angl,8,255,NULL);
  644.             SW->HugeBomb.r1++;
  645.         };
  646.         int rx=SW->HugeBomb.r2;
  647.         if(rx>30)rx=50;
  648.         for(j=0;j<rx;j++){
  649.             byte angl=rando()&255;
  650.             int rr=SW->HugeBomb.r2+(rando()&127);
  651.             int xx=SW->x+((rr*TSin[angl])>>8);
  652.             int yy=SW->y+((rr*TCos[angl])>>8);
  653.             byte xxx=byte(xx>>7);
  654.             byte yyy=byte(yy>>7);
  655.             word MID=Mops[yyy][xxx];
  656.             if(MID!=0xFFFF&&int(Group[MID]))
  657.                 Group[MID]->Die();
  658.             MakeExpl(xx,yy);
  659.             //MakeFog(xx,yy);
  660.             if(rando()<1900){
  661.                 PutPoint(xxx,yyy,1,5);
  662.             };
  663.             if(rando()<1024){
  664.                 CreateBlob(xxx,yyy,-45-(rando()&7),2);
  665.             };
  666.             //CreateExObjD(WPLIST[NUCLUSE[rando()&3]],xx,yy,angl,16,255,NULL);
  667.             SW->HugeBomb.r2++;
  668.         };
  669.         if(SW->HugeBomb.r2>SW->HugeBomb.Radius2)SW->Enabled=false;
  670.     };
  671. };
  672. void HandleFog(StrangeWeapon* SW);
  673. void StrangeWeapon::CreateFog(int ex,int ey,int er1,int er2,int time){
  674.     x=ex<<7;
  675.     y=ey<<7;
  676.     HugeBomb.Radius1=er1;
  677.     HugeBomb.Radius2=er2;
  678.     HugeBomb.NR1=5;
  679.     HugeBomb.Radius1=er1;
  680.     HugeBomb.Radius2=er2;
  681.     HugeBomb.r1=32;
  682.     HugeBomb.r2=64;
  683.     HugeBomb.vr1=div(er1-32,time).quot;
  684.     HugeBomb.vr2=div(er2-64,time).quot;
  685.     Enabled=true;
  686.     SWH=&HandleFog;
  687. };
  688. void HandleFog(StrangeWeapon* SW){
  689.     if(SW->Enabled){
  690.         OneObject* OB=Group[SW->OwnerID];
  691.         for(int j=0;j<0;j++){
  692.             byte angl=rando()&255;
  693.             int rad=rando()&511;
  694.             int xx=SW->x+((rad*TSin[angl])>>8);
  695.             int yy=SW->y+((rad*TCos[angl])>>8);
  696.             byte xxx=byte(xx>>7);
  697.             byte yyy=byte(xx>>7);
  698.             word MID=Mops[yyy][xxx];
  699.             MakeFog(xx,yy);
  700.             //    CreateExObjD(WPLIST[NUCLUSE[rando()&3]],xx,yy,angl,8,255,NULL);
  701.             SW->HugeBomb.r1++;
  702.         };
  703.         int rx=SW->HugeBomb.r2;
  704.         if(rx>30)rx=50;
  705.         for(j=0;j<rx;j++){
  706.             byte angl=rando()&255;
  707.             int rr=SW->HugeBomb.r2+(rando()&127);
  708.             int xx=SW->x+((rr*TSin[angl])>>8);
  709.             int yy=SW->y+((rr*TCos[angl])>>8);
  710.             byte xxx=byte(xx>>7);
  711.             byte yyy=byte(yy>>7);
  712.             word MID=Mops[yyy][xxx];
  713.             MakeFog(xx,yy);
  714.             //CreateExObjD(WPLIST[NUCLUSE[rando()&3]],xx,yy,angl,16,255,NULL);
  715.             SW->HugeBomb.r2++;
  716.         };
  717.         if(SW->HugeBomb.r2>SW->HugeBomb.Radius2)SW->Enabled=false;
  718.     };
  719. };
  720. //FIRE PROTECTOR
  721. /*void HandleFireProtection(StrangeWeapon* SW);
  722. void StrangeWeapon::CreateFireProtection(int ex,int ey,word MagID){
  723.     OneObject* OB=Group[MagID];
  724.     Nation* NT=OB->Nat;
  725.     if(OB->Magic<NT->WMagic[5])return;
  726.     Enabled=true;
  727.     x=ex<<7;
  728.     y=ey<<7;
  729.     OwnerID=MagID;
  730.     if(OB)OwnerSerial=OB->Serial;
  731.     else{
  732.         Enabled=false;
  733.         return;
  734.     };
  735.     MagAmount=10;
  736.     MagSpeed=1;
  737.     MagMaxConsume=10000;
  738.     MagConsume=0;
  739.     NNUM=OB->NNUM;
  740.     MExp.r=1;
  741.     MExp.r1=300;
  742.     SWH=&HandleSuperVision;
  743. };
  744. void HandleSuperVision(StrangeWeapon* SW){
  745.     if(SW->Enabled){
  746.         OneObject* OB=Group[SW->OwnerID];
  747.         if(!OB||(OB&&
  748.         (OB->Serial!=SW->OwnerSerial||OB->Magic<SW->MagSpeed))){
  749.             SW->Enabled=false;
  750.             return;
  751.         };
  752.         SW->MagConsume+=SW->MagSpeed;
  753.         if(!(rando()&7))OB->Magic-=rando()&1;
  754.         if(SW->MagConsume>=SW->MagMaxConsume)SW->Enabled=false;
  755.         //Body of graphic routine
  756.         if(SW->NNUM==MyNation){
  757.             for(int i=0;i<128;i++){
  758.                 int xx=(SW->x>>7);
  759.                 int yy=(SW->y>>7);
  760.                 int dx=-16+(rando()&31);
  761.                 int dy=-16+(rando()&31);
  762.                 if(dx*dx+dy*dy<256)
  763.                     for(int fx=-2;fx<2;fx++)
  764.                         for(int fy=-4;fy<5;fy++){
  765.                             int hx=xx+dx+fx;
  766.                             int hy=yy+dy+fy;
  767.                             if(hx>1&&hx<msx&&hy>1&&hy<msy)
  768.                                 fmap[hy][hx]+=(rando()&127)-32;
  769.                         };
  770.             };
  771.         };
  772.         
  773.         //end of graphic routine
  774.     };
  775. };*/
  776. //END FIRE PROTECTOR
  777. //USAGE
  778. StrangeWeapon SWEAP[64];
  779. void AddHugeBomb(int ex,int ey,int er1,int er2,int time,word ID){
  780.     for(int i=0;SWEAP[i].Enabled&&i<64;i++);
  781.     if(i<64)
  782.         SWEAP[i].CreateHugeBomb(ex,ey,er1,er2,time,ID);
  783. };
  784. void AddFireSea(int ex,int ey,word ID){
  785.     for(int i=0;SWEAP[i].Enabled&&i<64;i++);
  786.     if(i<64)
  787.         SWEAP[i].CreateFireSea(ex,ey,ID);
  788. };
  789. void AddBlizzard(int ex,int ey,word ID){
  790.     for(int i=0;SWEAP[i].Enabled&&i<64;i++);
  791.     if(i<64)
  792.         SWEAP[i].CreateBlizzard(ex,ey,ID);
  793. };
  794. void AddMExpl(int ex,int ey,word ID){
  795.     for(int i=0;SWEAP[i].Enabled&&i<64;i++);
  796.     if(i<64)
  797.         SWEAP[i].CreateMExplosion(ex,ey,ID);
  798. };
  799. void AddMExpl1(int ex,int ey,word ID){
  800.     for(int i=0;SWEAP[i].Enabled&&i<64;i++);
  801.     if(i<64)
  802.         SWEAP[i].CreateMExplosion1(ex,ey,ID);
  803. };
  804. void AddFireWall(int ex,int ey,word ID){
  805.     for(int i=0;SWEAP[i].Enabled&&i<64;i++);
  806.     if(i<64)
  807.         SWEAP[i].CreateFireWall(ex,ey,ID);
  808. };
  809. void AddSuperVision(int ex,int ey,word ID){
  810.     for(int i=0;SWEAP[i].Enabled&&i<64;i++);
  811.     if(i<64)
  812.         SWEAP[i].CreateSuperVision(ex,ey,ID);
  813. };
  814. void AddFlyBomb(int ex,int ey,int er1,int er2,int time,word ID){
  815.     for(int i=0;SWEAP[i].Enabled&&i<64;i++);
  816.     if(i<64)
  817.         SWEAP[i].CreateFlyUP(ex,ey,er1,er2,time,ID);
  818. };
  819. void AddNuclExpl(int ex,int ey,int er1,int er2,int time,word ID){
  820.     for(int i=0;SWEAP[i].Enabled&&i<64;i++);
  821.     if(i<64)
  822.         SWEAP[i].CreateNucl(ex,ey,er1,er2,time);
  823. };
  824. void AddFog(int ex,int ey,int er1,int er2,int time,word ID){
  825.     for(int i=0;SWEAP[i].Enabled&&i<64;i++);
  826.     if(i<64)
  827.         SWEAP[i].CreateFog(ex,ey,er1,er2,time);
  828. };
  829. void CreateStrangeObject(int i,byte NI,int x,int y,word ID){
  830.     switch(i){
  831.     case 1:
  832.         AddHugeBomb(x,y,50,300,50,ID);
  833.         break;
  834.     case 2:
  835.         AddHugeBomb(x,y,150,600,50,ID);
  836.         break;
  837.     case 3:
  838.         AddFireSea(x,y,ID);
  839.         break;
  840.     case 4:
  841.         AddBlizzard(x,y,ID);
  842.         break;
  843.     case 5:
  844.         AddMExpl(x,y,ID);
  845.         break;
  846.     case 6:
  847.         AddMExpl1(x,y,ID);
  848.         break;
  849.     case 7:
  850.         AddFireWall(x,y,ID);
  851.         break;
  852.     case 8:
  853.         AddSuperVision(x,y,ID);
  854.         break;
  855.     case 9:
  856.         AddFlyBomb(x,y,50,300,50,ID);
  857.         break;
  858.     case 10:
  859.         AddNuclExpl(x,y,300,1000,50,ID);
  860.         break;
  861.     case 11:
  862.         AddFog(x,y,50,300,50,ID);
  863.         break;
  864.     };
  865. };
  866. void HandleSW(){
  867.     for(int i=0;i<64;i++){
  868.         StrangeWeapon* SW=&SWEAP[i];
  869.         if(SW->Enabled&&SW->SWH)
  870.         SW->SWH(&SWEAP[i]);
  871.     };
  872. };
  873.  
  874.