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

  1. /*                  ╬≡≤µΦσ Σαδⁿφσπε ΣσΘ±≥ΓΦ 
  2.  *            ╬≡παφΦτα÷Φ  ∩σ≡σ∞σ∙α■∙Φ⌡±  αφΦ∞α÷ΦΘ.*/
  3. #include "ddini.h"
  4. #include "ResFile.h"
  5. #include "FastDraw.h"
  6. #include "mgraph.h"
  7. #include "mouse.h"
  8. #include "menu.h"
  9. #include "MapDiscr.h"
  10. #include "walls.h"
  11. #include "Nucl.h"
  12. #include <math.h>
  13. #include "GSound.h"
  14. #define MaxExpl 8192
  15. #define ExMask (MaxExpl-1)
  16. extern word FlyMops[256][256];
  17. int NUCLUSE[4];
  18. bool EUsage[MaxExpl];
  19. word LastAnmIndex;
  20. AnmObject* GAnm[MaxExpl];
  21. short TSin[257];
  22. short TCos[257];
  23. short TAtg[257];
  24. word ID_FIRE;
  25. word ID_FIREX;
  26. word ID_FIRE1;
  27. word ID_MAGW;
  28. word ID_EXPL1;
  29. word ID_EXPL2;
  30. word ID_GLASSFLY;
  31. word ID_GLASSBROKEN;
  32. word ID_FLYFIRE;
  33. word ID_MAGEXP;
  34. word ID_FOG;
  35. word ID_FOG1;
  36. int nEused;
  37. word LastReq;
  38. short randoma[8192];
  39. word rpos;
  40. void InitExplosions(){
  41.     for(int i=0;i<MaxExpl;i++)GAnm[i]=new AnmObject;
  42.     for(i=0;i<257;i++){
  43.         TSin[i]=short(256*sin(2*3.1415927*i/256));
  44.         TCos[i]=short(256*cos(2*3.1415927*i/256));
  45.         TAtg[i]=short(128*atan2(i,256)/3.1415927);
  46.     };
  47.     memset(&EUsage,0,MaxExpl);
  48.     LastReq=0;
  49.     nEused=0;
  50.     ResFile rf=RReset("random.lst");
  51.     RBlockRead(rf,randoma,16384);
  52.     RClose(rf);
  53. //    for(i=0;i<8192;i++){
  54. //        randoma[i]=rand();
  55. //    };
  56.     rpos=0;
  57.     //ResFile rf=RRewrite("random.lst");
  58.     //RBlockWrite(rf,randoma,16384);
  59.     //RClose(rf);
  60.  
  61. };
  62. short rando(){
  63.     rpos++;
  64.     rpos&=8191;
  65.     return randoma[rpos];
  66. };
  67. void CloseExu(int i){
  68.     if(EUsage[i]){
  69.         EUsage[i]=false;
  70.         nEused--;
  71.     };
  72. };
  73. void CloseExplosions(){
  74.     for(int i=0;i<MaxExpl;i++)free(GAnm[i]);
  75. };
  76. void Weapon::CreateWeapon(Nation* Nat,word Ind,byte ExplCount,byte Kind){
  77.     Vis=(Visuals*)Nat->Mon[Ind];
  78.     NextWeapon=NULL;
  79.     MinDamage=byte(Vis->info.Basic.MinDamage);
  80.     MaxDamage=byte(Vis->info.Basic.MaxDamage);
  81.     Force=byte(Vis->info.Basic.MaxLife);
  82.     if(ExplCount>1)FDecrement=Force/ExplCount;else FDecrement=Force;
  83.     ExplPath=Vis->info.Basic.AttackRange*3;
  84.     atime=0;
  85.     switch(Kind){
  86.     case 0://simple weapon
  87.         Probab1=0;
  88.         Probab2=0;
  89.         DirectFactor=0;
  90.         break;
  91.     case 1://weak division
  92.         Probab1=160;
  93.         Probab2=32;
  94.         DirectFactor=196;
  95.         break;
  96.     case 2://strontg division
  97.         Probab1=0;
  98.         Probab2=120;
  99.         DirectFactor=196;
  100.         break;
  101.     case 3://total elimination
  102.         Probab1=0;
  103.         Probab2=128;
  104.         DirectFactor=196;
  105.         break;
  106.     default://Don't use this value. It leads to elimination of 
  107.             //everything everywhere
  108.         Probab1=255;
  109.         Probab2=255;
  110.         DirectFactor=0;
  111.     };
  112. };
  113. void Weapon::CreateNWeapon(int r1,int r2,int time){
  114.     //ar1=r1;
  115.     //ar2=r2;
  116.     atime=time;
  117. };
  118. byte CreateLeadingObject(Weapon* Wep,int x,int y,
  119.                  short v,byte Mask,
  120.                  OneObject* Send,
  121.                  word DestAnm){
  122.     if(!EUsage[DestAnm])return 0;
  123.     AnmObject* EO=GAnm[DestAnm];
  124.     int vv=int(v)<<8;
  125.     if(Wep->atime){
  126.         if(Send)CreateStrangeObject(Wep->atime,Send->NNUM,x>>7,y>>7,Send->Index);
  127.         else CreateStrangeObject(Wep->atime,255,x>>7,y>>7,0);
  128.         return 0;
  129.     };
  130.     int dx=EO->x-(int(x)<<8);
  131.     int dy=EO->y-(int(y)<<8);
  132.     short i=LastReq;
  133.     while(EUsage[i]&&i<MaxExpl)i++;    
  134.     if(i>=MaxExpl){
  135.         i=0;
  136.         while(EUsage[i]&&i<LastReq)i++;
  137.     };
  138.     LastAnmIndex=-1;
  139.     if(EUsage[i])return 0;
  140.     LastAnmIndex=i;
  141.     LastReq=(i+1)&ExMask;
  142.     EUsage[i]=true;
  143.     nEused++;
  144.     AnmObject* AO=GAnm[i];
  145.     AO->DestObj=DestAnm;
  146.     AO->DSerial=EO->ASerial;
  147.     AO->ASerial=rando();
  148.     AO->Transparent=Wep->Transparent;
  149.     AO->destX=0;
  150.     AO->destY=0;
  151.     AO->v=v;
  152.     AO->AnmLead=true;
  153.     if(Send){
  154.         AO->UATT=Send->Ref.General->WATT;
  155.         AO->SATT=Send->Ref.General->WATT;
  156.         AO->WATT=Send->Ref.General->WATT;
  157.         AO->AATT=Send->Ref.General->AATT;
  158.         AO->P100=Send->Ref.General->P100;
  159.         AO->T3X3=Send->Ref.General->T3X3;
  160.     }else{
  161.         AO->UATT=false;
  162.         AO->SATT=false;
  163.         AO->WATT=false;
  164.         AO->AATT=false;
  165.         AO->P100=false;
  166.         AO->T3X3=false;
  167.     };
  168.     if(dx!=0||dy!=0){
  169.         int adx=abs(dx>>8);
  170.         int ady=abs(dy>>8);
  171.         if(adx>ady)AO->PhDir=byte(TAtg[div(ady<<8,adx).quot]);else
  172.                    AO->PhDir=64-byte(TAtg[div(adx<<8,ady).quot]);
  173.         if(dx<0)AO->PhDir=128-AO->PhDir;
  174.         if(dy<0)AO->PhDir=256-AO->PhDir;
  175.     }else AO->PhDir=64+128;
  176.     AO->MaxPath=(256+2)<<7;
  177.     //if(int(Send))AO->MaxPath=int(Send->Ref.Visual->info.Basic.AttackRange+2)<<7;
  178.     //else AO->MaxPath=int(Wep->ExplPath+2)<<7;
  179.     AO->NMask=Mask;
  180.     AO->Sender=Send;
  181.     if(Send){
  182.         AO->MinDamage=(int(Send->GetMinDam())*Send->xForce)>>4;
  183.         AO->MaxDamage=(int(Send->GetMaxDam())*Send->xForce)>>4;
  184.     }else{
  185.         AO->MinDamage=Wep->MinDamage;
  186.         AO->MaxDamage=Wep->MaxDamage;
  187.     };
  188.     //AO->PhDir+=(rando()-16384)>>18;
  189.     AO->Direction=((AO->PhDir+80)&255)>>5;
  190.     if(dx||dy){
  191.         int ddx=dx>>8;
  192.         int ddy=dy>>8;
  193.         int ab=sqrt(ddx*ddx+ddy*ddy);
  194.         AO->vx=div(dx*v,ab).quot;
  195.         AO->vy=div(dy*v,ab).quot;
  196.     }else{
  197.         AO->vx=(TCos[AO->PhDir]*v);
  198.         AO->vy=(TSin[AO->PhDir]*v);
  199.     };
  200.     AO->Wpn=Wep;
  201.     AO->Path=0;
  202.     AO->Visible=false;
  203.     AO->x=x<<8;
  204.     AO->y=y<<8;
  205.     AO->xm=x>>7;
  206.     AO->xm0=AO->xm;
  207.     AO->ym=y>>7;
  208.     AO->ym0=AO->ym;
  209.     Octant* OC=AO->Wpn->Vis->lpFAnim[0].Anm;
  210.     if(AO->Wpn->Vis->cpbRotation) 
  211.         if(AO->Direction<5)AO->Kino=OC[AO->Direction].Movie;
  212.         else AO->Kino=OC[8-AO->Direction].Movie;
  213.     else AO->Kino=OC->Movie;
  214.     if(!AO->Wpn->Vis->cpbMoving)AO->OneTime=true;else AO->OneTime=false;
  215.     AO->Nanm=OC->count;
  216.     AO->Canm=0;
  217.     AO->Force=Wep->Force;
  218.     AO->Decrement=Wep->FDecrement;
  219.     return AO->Direction;
  220. };
  221. byte CreateUniversalExplosion(Weapon* Wep,int x,int y,
  222.                  short v,byte Mask,
  223.                  OneObject* Send,
  224.                  byte dsx,byte dsy,
  225.                  word DOBJ,
  226.                  word Dist){
  227.     AddWarEffect(x>>7,y>>7,Wep->SoundID);
  228.     int vv=int(v)<<8;
  229.     if(Wep->atime){
  230.         if(Send)CreateStrangeObject(Wep->atime,Send->NNUM,x>>7,y>>7,Send->Index);
  231.         else CreateStrangeObject(Wep->atime,255,x>>7,y>>7,0);
  232.         return 0;
  233.     };
  234.     int dx=(int(dsx)<<(7+8))-int(x<<8);
  235.     int dy=(int(dsy)<<(7+8))-int(y<<8);
  236.     short i=LastReq;
  237.     while(EUsage[i]&&i<MaxExpl)i++;    
  238.     if(i>=MaxExpl){
  239.         i=0;
  240.         while(EUsage[i]&&i<LastReq)i++;
  241.     };
  242.     LastAnmIndex=-1;
  243.     if(EUsage[i])return 0;
  244.     LastAnmIndex=i;
  245.     LastReq=(i+1)&ExMask;
  246.     EUsage[i]=true;
  247.     nEused++;
  248.     AnmObject* AO=GAnm[i];
  249.     AO->ASerial=rando();
  250.     AO->Transparent=Wep->Transparent;
  251.     AO->destX=dsx;
  252.     AO->destY=dsy;
  253.     AO->v=v;
  254.     AO->AnmLead=false;
  255.     if(Send){
  256.         AO->UATT=Send->Ref.General->WATT;
  257.         AO->SATT=Send->Ref.General->WATT;
  258.         AO->WATT=Send->Ref.General->WATT;
  259.         AO->AATT=Send->Ref.General->AATT;
  260.         AO->P100=Send->Ref.General->P100;
  261.         AO->T3X3=Send->Ref.General->T3X3;
  262.     }else{
  263.         AO->UATT=false;
  264.         AO->SATT=false;
  265.         AO->WATT=false;
  266.         AO->AATT=false;
  267.         AO->P100=false;
  268.         AO->T3X3=false;
  269.     };
  270.     if(DOBJ!=0xFFFF){
  271.         OneObject* OB=Group[DOBJ];
  272.         if(OB){
  273.             AO->DestObj=DOBJ;
  274.             AO->DSerial=OB->Serial;
  275.         }else AO->DestObj=0xFFFF;
  276.     }else AO->DestObj=0xFFFF;
  277.     if(dx!=0||dy!=0){
  278.         int adx=abs(dx>>8);
  279.         int ady=abs(dy>>8);
  280.         if(adx>ady)AO->PhDir=byte(TAtg[div(ady<<8,adx).quot]);else
  281.                    AO->PhDir=64-byte(TAtg[div(adx<<8,ady).quot]);
  282.         if(dx<0)AO->PhDir=128-AO->PhDir;
  283.         if(dy<0)AO->PhDir=256-AO->PhDir;
  284.     }else AO->PhDir=64+128;
  285.     AO->MaxPath=(Dist+2)<<7;
  286.     //if(int(Send))AO->MaxPath=int(Send->Ref.Visual->info.Basic.AttackRange+2)<<7;
  287.     //else AO->MaxPath=int(Wep->ExplPath+2)<<7;
  288.     AO->NMask=Mask;
  289.     AO->Sender=Send;
  290.     if(Send){
  291.         AO->MinDamage=(int(Send->GetMinDam())*Send->xForce)>>4;
  292.         AO->MaxDamage=(int(Send->GetMaxDam())*Send->xForce)>>4;
  293.     }else{
  294.         AO->MinDamage=Wep->MinDamage;
  295.         AO->MaxDamage=Wep->MaxDamage;
  296.     };
  297.     //AO->PhDir+=(rando()-16384)>>18;
  298.     AO->Direction=((AO->PhDir+80)&255)>>5;
  299.     if(dx||dy){
  300.         int ddx=dx>>8;
  301.         int ddy=dy>>8;
  302.         int ab=sqrt(ddx*ddx+ddy*ddy);
  303.         AO->vx=div(dx*v,ab).quot;
  304.         AO->vy=div(dy*v,ab).quot;
  305.     }else{
  306.         AO->vx=(TCos[AO->PhDir]*v);
  307.         AO->vy=(TSin[AO->PhDir]*v);
  308.     };
  309.     AO->Wpn=Wep;
  310.     AO->Path=0;
  311.     AO->Visible=false;
  312.     AO->x=x<<8;
  313.     AO->y=y<<8;
  314.     AO->xm=x>>7;
  315.     AO->xm0=AO->xm;
  316.     AO->ym=y>>7;
  317.     AO->ym0=AO->ym;
  318.     Octant* OC=AO->Wpn->Vis->lpFAnim[0].Anm;
  319.     if(AO->Wpn->Vis->cpbRotation) 
  320.         if(AO->Direction<5)AO->Kino=OC[AO->Direction].Movie;
  321.         else AO->Kino=OC[8-AO->Direction].Movie;
  322.     else AO->Kino=OC->Movie;
  323.     if(!AO->Wpn->Vis->cpbMoving)AO->OneTime=true;else AO->OneTime=false;
  324.     AO->Nanm=OC->count;
  325.     AO->Canm=0;
  326.     AO->Force=Wep->Force;
  327.     AO->Decrement=Wep->FDecrement;
  328.     return AO->Direction;
  329. };
  330. byte AttackByWeapon(Weapon* Wep,short x,short y,OneObject* Send,word DOBJ){
  331.     if(!(Wep&&Send&&DOBJ!=0xFFFF))return 0;
  332.     OneObject* DOB=Group[DOBJ];
  333.     if(!DOB)return 0;
  334.     Visuals* GO=(Visuals*)Send->Ref.General;
  335.     return CreateUniversalExplosion(Wep,x,y,GO->WepSpeed,Send->NMask,Send,DOB->x,DOB->y,DOBJ,GO->info.Basic.AttackRange+8);
  336. };
  337.  
  338. byte CreateUniExObj(Weapon* Wep,int x,int y,
  339.                  short v,byte Mask,
  340.                  OneObject* Send,
  341.                  byte dsx,byte dsy,
  342.                  word DOBJ){
  343.     if(Send)return CreateUniversalExplosion(Wep,x,y,v,Mask,Send,dsx,dsy,DOBJ,128);//Send->Ref.Visual->info.Basic.AttackRange+8);
  344.     else return CreateUniversalExplosion(Wep,x,y,v,Mask,Send,dsx,dsy,DOBJ,Wep->ExplPath+8);
  345. };
  346. byte CreateExObjDPoint(Weapon* Wep,short x,short y,
  347.                        short dx,short dy,short v,byte Mask,OneObject* Send,byte dsx,byte dsy){
  348.     if(Send)return CreateUniversalExplosion(Wep,x,y,v,Mask,Send,dsx,dsy,0xFFFF,Send->Ref.Visual->info.Basic.AttackRange+8);
  349.     else return CreateUniversalExplosion(Wep,x,y,v,Mask,Send,dsx,dsy,0xFFFF,Wep->ExplPath+8);
  350. };
  351.  
  352. /*byte CreateExObjR(Weapon* Wep,short x,short y,
  353.                  short dx,short dy,short v,byte Mask,OneObject* Send,word Dist){
  354.     if(Wep->atime){
  355.         if(Send)CreateStrangeObject(Wep->atime,Send->NNUM,x>>7,y>>7,Send->Index);
  356.         else CreateStrangeObject(Wep->atime,255,x>>7,y>>7,0);
  357.         return 0;
  358.     };
  359.     short i=LastReq;
  360.     while(EUsage[i]&&i<MaxExpl)i++;    
  361.     if(i>=MaxExpl){
  362.         i=0;
  363.         while(EUsage[i]&&i<LastReq)i++;
  364.     };
  365.     if(EUsage[i])return 0;
  366.     LastReq=(i+1)&ExMask;
  367.     EUsage[i]=true;
  368.     nEused++;
  369.     AnmObject* AO=GAnm[i];
  370.     AO->destX=255;
  371.     AO->destY=255;
  372.     AO->v=v;
  373.     AO->DestObj=0xFFFF;
  374.     if(dx!=0||dy!=0){
  375.         short adx=abs(dx);
  376.         short ady=abs(dy);
  377.         if(adx>ady)AO->PhDir=byte(TAtg[div(ady<<8,adx).quot]);else
  378.                    AO->PhDir=64-byte(TAtg[div(adx<<8,ady).quot]);
  379.         if(dx<0)AO->PhDir=128-AO->PhDir;
  380.         if(dy<0)AO->PhDir=256-AO->PhDir;
  381.     }else AO->PhDir=64+128;
  382.     AO->MaxPath=(Dist+2)<<7;
  383.     AO->Transparent=Wep->Transparent;
  384.     AO->NMask=Mask;
  385.     AO->Sender=Send;
  386.     if(Send){
  387.         AO->MinDamage=(int(Send->GetMinDam())*Send->xForce)>>4;
  388.         AO->MaxDamage=(int(Send->GetMaxDam())*Send->xForce)>>4;
  389.     }else{
  390.         AO->MinDamage=Wep->MinDamage;
  391.         AO->MaxDamage=Wep->MaxDamage;
  392.     };
  393.     AO->PhDir+=(rando()-16384)>>18;
  394.     AO->Direction=((AO->PhDir+80)&255)>>5;
  395.     AO->vx=(TCos[AO->PhDir]*v)>>8;
  396.     AO->vy=(TSin[AO->PhDir]*v)>>8;
  397.     AO->Wpn=Wep;
  398.     AO->Path=0;
  399.     AO->Visible=false;
  400.     AO->x=x;
  401.     AO->y=y;
  402.     AO->xm=x>>7;
  403.     AO->xm0=AO->xm;
  404.     AO->ym=y>>7;
  405.     AO->ym0=AO->ym;
  406.     Octant* OC=AO->Wpn->Vis->lpFAnim[0].Anm;
  407.     if(AO->Wpn->Vis->cpbRotation) 
  408.         if(AO->Direction<5)AO->Kino=OC[AO->Direction].Movie;
  409.         else AO->Kino=OC[8-AO->Direction].Movie;
  410.     else AO->Kino=OC->Movie;
  411.     if(!AO->Wpn->Vis->cpbMoving)AO->OneTime=true;else AO->OneTime=false;
  412.     AO->Nanm=OC->count;
  413.     AO->Canm=0;
  414.     AO->Force=Wep->Force;
  415.     AO->Decrement=Wep->FDecrement;
  416.     return AO->Direction;
  417. };
  418. byte CreateExObj(Weapon* Wep,short x,short y,
  419.                  short dx,short dy,short v,byte Mask,OneObject* Send){
  420.     if(Wep->atime){
  421.         if(Send)CreateStrangeObject(Wep->atime,Send->NNUM,x>>7,y>>7,Send->Index);
  422.         else CreateStrangeObject(Wep->atime,255,x>>7,y>>7,0);
  423.         return 0;
  424.     };
  425.     short i=LastReq;
  426.     while(EUsage[i]&&i<MaxExpl)i++;    
  427.     if(i>=MaxExpl){
  428.         i=0;
  429.         while(EUsage[i]&&i<LastReq)i++;
  430.     };
  431.     if(EUsage[i])return 0;
  432.     LastReq=(i+1)&ExMask;
  433.     EUsage[i]=true;
  434.     nEused++;
  435.     AnmObject* AO=GAnm[i];
  436.     AO->destX=255;
  437.     AO->destY=255;
  438.     AO->v=v;
  439.     AO->DestObj=0xFFFF;
  440.     if(dx!=0||dy!=0){
  441.         short adx=abs(dx);
  442.         short ady=abs(dy);
  443.         if(adx>ady)AO->PhDir=byte(TAtg[div(ady<<8,adx).quot]);else
  444.                    AO->PhDir=64-byte(TAtg[div(adx<<8,ady).quot]);
  445.         if(dx<0)AO->PhDir=128-AO->PhDir;
  446.         if(dy<0)AO->PhDir=256-AO->PhDir;
  447.     }else AO->PhDir=64+128;
  448.     if(int(Send))AO->MaxPath=int(Send->Ref.Visual->info.Basic.AttackRange+2)<<7;
  449.     else AO->MaxPath=int(Wep->ExplPath+2)<<7;
  450.     AO->Transparent=Wep->Transparent;
  451.     AO->NMask=Mask;
  452.     AO->Sender=Send;
  453.     if(Send){
  454.         AO->MinDamage=(int(Send->GetMinDam())*Send->xForce)>>4;
  455.         AO->MaxDamage=(int(Send->GetMaxDam())*Send->xForce)>>4;
  456.     }else{
  457.         AO->MinDamage=Wep->MinDamage;
  458.         AO->MaxDamage=Wep->MaxDamage;
  459.     };
  460.     AO->PhDir+=(rando()-16384)>>18;
  461.     AO->Direction=((AO->PhDir+80)&255)>>5;
  462.     AO->vx=(TCos[AO->PhDir]*v)>>8;
  463.     AO->vy=(TSin[AO->PhDir]*v)>>8;
  464.     AO->Wpn=Wep;
  465.     AO->Path=0;
  466.     AO->Visible=false;
  467.     AO->x=x;
  468.     AO->y=y;
  469.     AO->xm=x>>7;
  470.     AO->xm0=AO->xm;
  471.     AO->ym=y>>7;
  472.     AO->ym0=AO->ym;
  473.     Octant* OC=AO->Wpn->Vis->lpFAnim[0].Anm;
  474.     if(AO->Wpn->Vis->cpbRotation) 
  475.         if(AO->Direction<5)AO->Kino=OC[AO->Direction].Movie;
  476.         else AO->Kino=OC[8-AO->Direction].Movie;
  477.     else AO->Kino=OC->Movie;
  478.     if(!AO->Wpn->Vis->cpbMoving)AO->OneTime=true;else AO->OneTime=false;
  479.     AO->Nanm=OC->count;
  480.     AO->Canm=0;
  481.     AO->Force=Wep->Force;
  482.     AO->Decrement=Wep->FDecrement;
  483.     return AO->Direction;
  484. };
  485. byte CreateExObjDPoint(Weapon* Wep,short x,short y,
  486.                  short dx,short dy,short v,byte Mask,OneObject* Send,byte dsx,byte dsy){
  487.     if(Wep->atime){
  488.         if(Send)CreateStrangeObject(Wep->atime,Send->NNUM,x>>7,y>>7,Send->Index);
  489.         else CreateStrangeObject(Wep->atime,255,x>>7,y>>7,0);
  490.         return 0;
  491.     };
  492.     short i=LastReq;
  493.     while(EUsage[i]&&i<MaxExpl)i++;    
  494.     if(i>=MaxExpl){
  495.         i=0;
  496.         while(EUsage[i]&&i<LastReq)i++;
  497.     };
  498.     if(EUsage[i])return 0;
  499.     LastReq=(i+1)&ExMask;
  500.     EUsage[i]=true;
  501.     nEused++;
  502.     AnmObject* AO=GAnm[i];
  503.     AO->Transparent=Wep->Transparent;
  504.     AO->destX=dsx;
  505.     AO->destY=dsy;
  506.     AO->v=v;
  507.     AO->DestObj=0xFFFF;
  508.     if(dx!=0||dy!=0){
  509.         short adx=abs(dx);
  510.         short ady=abs(dy);
  511.         if(adx>ady)AO->PhDir=byte(TAtg[div(ady<<8,adx).quot]);else
  512.                    AO->PhDir=64-byte(TAtg[div(adx<<8,ady).quot]);
  513.         if(dx<0)AO->PhDir=128-AO->PhDir;
  514.         if(dy<0)AO->PhDir=256-AO->PhDir;
  515.     }else AO->PhDir=64+128;
  516.     if(int(Send))AO->MaxPath=int(Send->Ref.Visual->info.Basic.AttackRange+2)<<7;
  517.     else AO->MaxPath=int(Wep->ExplPath+3)<<7;
  518.     AO->NMask=Mask;
  519.     AO->Sender=Send;
  520.     if(Send){
  521.         AO->MinDamage=(int(Send->GetMinDam())*Send->xForce)>>4;
  522.         AO->MaxDamage=(int(Send->GetMaxDam())*Send->xForce)>>4;
  523.     }else{
  524.         AO->MinDamage=Wep->MinDamage;
  525.         AO->MaxDamage=Wep->MaxDamage;
  526.     };
  527.     //AO->PhDir+=(rando()-16384)>>18;
  528.     AO->Direction=((AO->PhDir+80)&255)>>5;
  529.     AO->vx=(TCos[AO->PhDir]*v)>>8;
  530.     AO->vy=(TSin[AO->PhDir]*v)>>8;
  531.     AO->Wpn=Wep;
  532.     AO->Path=0;
  533.     AO->Visible=false;
  534.     AO->x=x;
  535.     AO->y=y;
  536.     AO->xm=x>>7;
  537.     AO->xm0=AO->xm;
  538.     AO->ym=y>>7;
  539.     AO->ym0=AO->ym;
  540.     Octant* OC=AO->Wpn->Vis->lpFAnim[0].Anm;
  541.     if(AO->Wpn->Vis->cpbRotation) 
  542.         if(AO->Direction<5)AO->Kino=OC[AO->Direction].Movie;
  543.         else AO->Kino=OC[8-AO->Direction].Movie;
  544.     else AO->Kino=OC->Movie;
  545.     if(!AO->Wpn->Vis->cpbMoving)AO->OneTime=true;else AO->OneTime=false;
  546.     AO->Nanm=OC->count;
  547.     AO->Canm=0;
  548.     AO->Force=Wep->Force;
  549.     AO->Decrement=Wep->FDecrement;
  550.     return AO->Direction;
  551. };
  552. byte CreateExObjDPointR(Weapon* Wep,short x,short y,
  553.                  short dx,short dy,short v,byte Mask,OneObject* Send,byte dsx,byte dsy,word Range){
  554.     if(Wep->atime){
  555.         if(Send)CreateStrangeObject(Wep->atime,Send->NNUM,x>>7,y>>7,Send->Index);
  556.         else CreateStrangeObject(Wep->atime,255,x>>7,y>>7,0);
  557.         return 0;
  558.     };
  559.     short i=LastReq;
  560.     while(EUsage[i]&&i<MaxExpl)i++;    
  561.     if(i>=MaxExpl){
  562.         i=0;
  563.         while(EUsage[i]&&i<LastReq)i++;
  564.     };
  565.     if(EUsage[i])return 0;
  566.     LastReq=(i+1)&ExMask;
  567.     EUsage[i]=true;
  568.     nEused++;
  569.     AnmObject* AO=GAnm[i];
  570.     AO->Transparent=Wep->Transparent;
  571.     AO->destX=dsx;
  572.     AO->destY=dsy;
  573.     AO->v=v;
  574.     AO->DestObj=0xFFFF;
  575.     if(dx!=0||dy!=0){
  576.         short adx=abs(dx);
  577.         short ady=abs(dy);
  578.         if(adx>ady)AO->PhDir=byte(TAtg[div(ady<<8,adx).quot]);else
  579.                    AO->PhDir=64-byte(TAtg[div(adx<<8,ady).quot]);
  580.         if(dx<0)AO->PhDir=128-AO->PhDir;
  581.         if(dy<0)AO->PhDir=256-AO->PhDir;
  582.     }else AO->PhDir=64+128;
  583.     AO->MaxPath=int(Range+3)<<7;
  584.     AO->NMask=Mask;
  585.     AO->Sender=Send;
  586.     if(Send){
  587.         AO->MinDamage=(int(Send->GetMinDam())*Send->xForce)>>4;
  588.         AO->MaxDamage=(int(Send->GetMaxDam())*Send->xForce)>>4;
  589.     }else{
  590.         AO->MinDamage=Wep->MinDamage;
  591.         AO->MaxDamage=Wep->MaxDamage;
  592.     };
  593.     //AO->PhDir+=(rando()-16384)>>18;
  594.     AO->Direction=((AO->PhDir+80)&255)>>5;
  595.     AO->vx=(TCos[AO->PhDir]*v)>>8;
  596.     AO->vy=(TSin[AO->PhDir]*v)>>8;
  597.     AO->Wpn=Wep;
  598.     AO->Path=0;
  599.     AO->Visible=false;
  600.     AO->x=x;
  601.     AO->y=y;
  602.     AO->xm=x>>7;
  603.     AO->xm0=AO->xm;
  604.     AO->ym=y>>7;
  605.     AO->ym0=AO->ym;
  606.     Octant* OC=AO->Wpn->Vis->lpFAnim[0].Anm;
  607.     if(AO->Wpn->Vis->cpbRotation) 
  608.         if(AO->Direction<5)AO->Kino=OC[AO->Direction].Movie;
  609.         else AO->Kino=OC[8-AO->Direction].Movie;
  610.     else AO->Kino=OC->Movie;
  611.     if(!AO->Wpn->Vis->cpbMoving)AO->OneTime=true;else AO->OneTime=false;
  612.     AO->Nanm=OC->count;
  613.     AO->Canm=0;
  614.     AO->Force=Wep->Force;
  615.     AO->Decrement=Wep->FDecrement;
  616.     return AO->Direction;
  617. };*/
  618. void CreateExObjD(Weapon* Wep,int x,int y,
  619.                  short PDir,short v,byte Mask,OneObject* Send){
  620.     AddWarEffect(x>>7,y>>7,Wep->SoundID);
  621.     if(Wep->atime){
  622.         if(Send)CreateStrangeObject(Wep->atime,Send->NNUM,x>>7,y>>7,Send->Index);
  623.         else CreateStrangeObject(Wep->atime,255,x>>7,y>>7,0);
  624.         return;
  625.     };
  626.     short i=LastReq;
  627.     while(EUsage[i]&&i<MaxExpl)i++;    
  628.     if(i>=MaxExpl){
  629.         i=0;
  630.         while(EUsage[i]&&i<LastReq)i++;
  631.     };
  632.     if(EUsage[i])return;
  633.     LastReq=(i+1)&ExMask;
  634.     EUsage[i]=true;
  635.     nEused++;
  636.     AnmObject* AO=GAnm[i];
  637.     AO->ASerial=rando();
  638.     AO->Transparent=Wep->Transparent;
  639.     AO->destX=255;
  640.     AO->destY=255;
  641.     AO->v=v;
  642.     AO->MaxPath=1000;
  643.     AO->DestObj=0xFFFF;
  644.     AO->NMask=Mask;
  645.     AO->Sender=Send;
  646.     AO->PhDir=byte(PDir);
  647.     AO->Direction=((AO->PhDir+80)&255)>>5;
  648.     AO->vx=(TCos[AO->PhDir]*v);
  649.     AO->vy=(TSin[AO->PhDir]*v);
  650.     AO->Wpn=Wep;
  651.     AO->Path=0;
  652.     AO->Visible=false;
  653.     AO->x=x<<8;
  654.     AO->y=y<<8;
  655.     AO->xm=x>>7;
  656.     AO->xm0=AO->xm;
  657.     AO->ym=y>>7;
  658.     AO->ym0=AO->ym;
  659.     AO->AnmLead=false;
  660.     AO->SATT=false;
  661.     AO->UATT=false;
  662.     AO->WATT=false;
  663.     AO->AATT=false;
  664.     AO->P100=false;
  665.     AO->T3X3=false;
  666.     Octant* OC=AO->Wpn->Vis->lpFAnim[0].Anm;
  667.     if(AO->Wpn->Vis->cpbRotation) 
  668.         if(AO->Direction<5)AO->Kino=OC[AO->Direction].Movie;
  669.         else AO->Kino=OC[8-AO->Direction].Movie;
  670.     else AO->Kino=OC->Movie;
  671.     if(!AO->Wpn->Vis->cpbMoving)AO->OneTime=true;else AO->OneTime=false;
  672.     AO->Nanm=OC->count;
  673.     AO->Canm=0;
  674.     AO->Force=Wep->Force;
  675.     AO->Decrement=Wep->FDecrement;
  676.     if(Send){
  677.         AO->MinDamage=(int(Send->GetMinDam())*Send->xForce)>>4;
  678.         AO->MaxDamage=(int(Send->GetMaxDam())*Send->xForce)>>4;
  679.     }else{
  680.         AO->MinDamage=Wep->MinDamage;
  681.         AO->MaxDamage=Wep->MaxDamage;
  682.     };
  683.     if(int(Send))AO->MaxPath=int(Send->Ref.Visual->info.Basic.AttackRange+2)<<7;
  684.     else AO->MaxPath=int(Wep->ExplPath+2)<<7;
  685. };
  686. void CreateRandObj(Weapon* Wep,short x,short y,
  687.                  short PDir,short v,short dist,int corr,byte Mask,OneObject* Send){
  688.     int dir1=((((255-corr)*(rando()-16384))>>15)+256+PDir)&255;
  689.     int x1=x+(dist*TCos[dir1]>>8);
  690.     int y1=y+(dist*TSin[dir1]>>8);
  691.     CreateExObjD(Wep,x1,y1,dir1,v,Mask,Send);
  692. };/*
  693. word GetEnemy(int x,int y,byte NMask){
  694.     int xs=(x>>7)&254;
  695.     int ys=(y>>7)&254;
  696.     int xs1=(x+64)>>2;
  697.     int ys1=(y+64)>>2;
  698.     word MID;
  699.     word BMID=0xFFFF;
  700.     int dss;
  701.     int dst=1000;
  702.     for(int tx=0;tx<2;tx++)
  703.         for(int ty=0;ty<2;ty++){
  704.             MID=Mops[ys+ty][xs+tx];
  705.             if(MID==0xFFFF)MID=FlyMops[ys+ty][xs+tx];
  706.             if(MID!=0xFFFF){
  707.                 OneObject* OB=Group[MID];
  708.                 if(!(OB->NMask&NMask)){
  709.                     dss=abs(((xs+tx)<<5)-xs1)+abs(((ys+ty)<<5)-ys1);
  710.                     if(dss<128&&dss<dst){
  711.                         dst=dss;
  712.                         BMID=MID;
  713.                     };
  714.                 };
  715.             };
  716.     };
  717.     return BMID;
  718. };*/
  719. void damWalls(word dam,byte xm,byte ym){
  720.     word LNK=Links[ym][xm];
  721.     if(LNK!=0xFFFF){
  722.         word CID=LIndex[ym][xm];
  723.         WallCluster* WC=&GWALLS.GWC[LNK];
  724.         WallCell* OC=&WC->Cells[CID];
  725.         GWALLS.DamageCell(xm,ym,255,dam<<1);
  726.     };
  727. };
  728. void ProcessExpl(){
  729.     for(int i=0;i<MaxExpl;i++)if(EUsage[i]){
  730.         AnmObject* AO=GAnm[i];
  731.         byte xm=(AO->x+64*256)>>15;
  732.         byte ym=(AO->y+64*256)>>15;
  733.         if(xm<=0||xm>=msx||ym<0||ym>=msy)
  734.         CloseExu(i);else{
  735.             if(AO->Force<=0&&AO->Canm>=AO->Nanm-1)CloseExu(i);
  736.             AO->xm=xm;
  737.             AO->ym=ym;
  738.             if(xm>mapx-1&&xm<=mapx+smaplx&&
  739.                 ym>mapy-1&&ym<=mapy+smaply)AO->Visible=true;else
  740.                 AO->Visible=true;
  741.             /*word LNK=Links[ym][xm];
  742.             if(LNK!=0xFFFF&&AO->Canm==AO->Nanm-1){
  743.                 word CID=LIndex[ym][xm];
  744.                 WallCluster* WC=&GWALLS.GWC[LNK];
  745.                 if((1<<WC->OwnerID)&AO->NMask)goto rdea;
  746.                 WallCell* OC=&WC->Cells[CID];
  747.                 word fn=rando();
  748.                 if(fn>8000)goto rdea;
  749.                 Weapon* Wp=AO->Wpn;    
  750.                 short prob=rando()>>7;
  751.                 small dam=Wp->MaxDamage+Wp->MinDamage;
  752.                 GWALLS.DamageCell(xm,ym,255,dam);
  753.                 Weapon* NW=AO->Wpn->NextWeapon;
  754.                 if(int(NW)){
  755.                     CreateExObjD(NW,AO->x>>8,AO->y>>8,0,0,255,AO->Sender);    
  756.                 };
  757.                 AO->Force-=AO->Decrement;
  758.                 if(AO->Force<=0)CloseExu(i);
  759.             };
  760. rdea:
  761.             word MID=0xFFFF;
  762.             if(!AO->P100){
  763.                 MID=Mops[ym][xm];
  764.                 if(MID==0xFFFF&&AO->AATT)MID=FlyMops[ym][xm];
  765.             };
  766.             if(MID!=0xFFFF&&(AO->xm0!=xm||AO->ym0!=ym)&&AO->Force>0){
  767.                 if(!AO->Canm){//AO->Nanm-1){
  768.                     OneObject* OB=Group[MID];
  769.                     if(OB&&!(OB->NMask&AO->NMask)){
  770.                         OB->MakeDamage(AO->MaxDamage,AO->MinDamage,AO->Sender);
  771.                         Weapon* Wp=AO->Wpn;    
  772.                         Weapon* NW=AO->Wpn->NextWeapon;
  773.                         if(int(NW))CreateExObjD(NW,AO->x>>8,AO->y>>8,0,0,255,AO->Sender);    
  774.                         AO->Force-=AO->Decrement;
  775.                     };
  776.                 };
  777.             };*/
  778.             AO->Path+=AO->v;
  779.             if(AO->Path>AO->MaxPath||(xm==AO->destX&&ym==AO->destY)){
  780.                 if(AO->T3X3){
  781.                     for(int dx=-1;dx<2;dx++)
  782.                         for(int dy=-1;dy<2;dy++){
  783.                             damWalls(AO->MaxDamage<<2,xm+dx,ym+dy);
  784.                             word MID=Mops[ym+dy][xm+dx];
  785.                             if(MID!=0xFFFF){
  786.                                 OneObject* OB=Group[MID];
  787.                                 if(OB&&!(OB->Sdoxlo||OB->NMask&AO->NMask)){
  788.                                     if(dx||dy)OB->MakeDamage(AO->MaxDamage>>2,AO->MinDamage>>2,AO->Sender);
  789.                                     else OB->MakeDamage(AO->MaxDamage,AO->MinDamage,AO->Sender);
  790.                                 };
  791.                             };
  792.                             if(AO->AATT){
  793.                                 MID=FlyMops[ym+dy][xm+dx];
  794.                                 if(MID!=0xFFFF){
  795.                                     OneObject* OB=Group[MID];
  796.                                     if(OB&&!(OB->Sdoxlo||OB->NMask&AO->NMask)){
  797.                                         if(dx||dy)OB->MakeDamage(AO->MaxDamage>>2,AO->MinDamage>>2,AO->Sender);
  798.                                         else OB->MakeDamage(AO->MaxDamage,AO->MinDamage,AO->Sender);
  799.                                     };
  800.                                 };
  801.                             };
  802.                         };
  803.                 };
  804.                 if((!AO->AnmLead)&&AO->DestObj!=0xFFFF&&AO->P100){
  805.                     OneObject* OB=Group[AO->DestObj];
  806.                     if(OB){
  807.                         if(OB->Serial==AO->DSerial){
  808.                             //short dam=AO->MinDamage+
  809.                             //    ((int(AO->MaxDamage-AO->MinDamage)*rando())>>15);
  810.                             OB->MakeDamage(AO->MaxDamage,AO->MinDamage,AO->Sender);
  811.                         };
  812.                     };
  813.                 };
  814.                 damWalls(AO->MaxDamage<<3,xm,ym);
  815.                 Weapon* NW=AO->Wpn->NextWeapon;
  816.                 if(NW){
  817.                     if(NW->atime)CreateExObjD(NW,AO->x>>8,AO->y>>8,0,0,255,AO->Sender);
  818.                     else CreateExObjD(NW,AO->x>>8,AO->y>>8,0,0,255,NULL);
  819.                 };
  820.                 CloseExu(i);
  821.                 goto CycEnd;
  822.             };
  823.             if(AO->Visible){
  824.                 if(MiniMode){
  825.                     OneSlide* Oc1=&(AO->Kino[AO->Canm]);
  826.                     if(AO->Transparent==2){
  827.                         if(AO->Direction<5)
  828.                             ShowRLCItemMutno((AO->x>>(2+8+1))-(mapx<<4)+smapx+(Oc1->dx>>1),
  829.                                         (AO->y>>(2+8+1))-(mapy<<4)+smapy+(Oc1->dy>>1),
  830.                                     &miniMImage[Oc1->FileID],Oc1->spr);else
  831.                             ShowRLCItemMutno((AO->x>>11)-(mapx<<4)+smapx+16-(Oc1->dx>>1),
  832.                                         (AO->y>>11)-(mapy<<4)+smapy+(Oc1->dy>>1),
  833.                                     &miniMImage[Oc1->FileID],Oc1->spr+4096);
  834.                     }else if(AO->Transparent==4){
  835.                         if(AO->Direction<5)
  836.                             ShowRLCItemFired((AO->x>>11)-(mapx<<4)+smapx+(Oc1->dx>>1),
  837.                                         (AO->y>>11)-(mapy<<4)+smapy+(Oc1->dy>>1),
  838.                                     &miniMImage[Oc1->FileID],Oc1->spr);else
  839.                             ShowRLCItemFired((AO->x>>11)-(mapx<<4)+smapx+16-(Oc1->dx>>1),
  840.                                         (AO->y>>11)-(mapy<<4)+smapy+(Oc1->dy>>1),
  841.                                     &miniMImage[Oc1->FileID],Oc1->spr+4096);
  842.                     }else{
  843.                         if(AO->Direction<5)
  844.                         ShowRLCItem((AO->x>>11)-(mapx<<4)+smapx+(Oc1->dx>>1),
  845.                                     (AO->y>>11)-(mapy<<4)+smapy+(Oc1->dy>>1),
  846.                                 &miniMImage[Oc1->FileID],Oc1->spr,0);else
  847.                         ShowRLCItem((AO->x>>11)-(mapx<<4)+smapx+16-(Oc1->dx>>1),
  848.                                     (AO->y>>11)-(mapy<<4)+smapy+(Oc1->dy>>1),
  849.                                 &miniMImage[Oc1->FileID],Oc1->spr+4096,0);
  850.                     
  851.                     };
  852.                 }else{
  853.                     OneSlide* Oc1=&(AO->Kino[AO->Canm]);
  854.                     if(AO->Transparent==2){
  855.                         if(AO->Direction<5)
  856.                             ShowRLCItemMutno((AO->x>>(2+8))-(mapx*32)+smapx+Oc1->dx,
  857.                                         (AO->y>>(2+8))-(mapy*32)+smapy+Oc1->dy,
  858.                                     &MImage[Oc1->FileID],Oc1->spr);else
  859.                             ShowRLCItemMutno((AO->x>>10)-(mapx*32)+smapx+32-Oc1->dx,
  860.                                         (AO->y>>10)-(mapy*32)+smapy+Oc1->dy,
  861.                                     &MImage[Oc1->FileID],Oc1->spr+4096);
  862.                     }else if(AO->Transparent==4){
  863.                         if(AO->Direction<5)
  864.                             ShowRLCItemFired((AO->x>>10)-(mapx*32)+smapx+Oc1->dx,
  865.                                         (AO->y>>10)-(mapy*32)+smapy+Oc1->dy,
  866.                                     &MImage[Oc1->FileID],Oc1->spr);else
  867.                             ShowRLCItemFired((AO->x>>10)-(mapx*32)+smapx+32-Oc1->dx,
  868.                                         (AO->y>>10)-(mapy*32)+smapy+Oc1->dy,
  869.                                     &MImage[Oc1->FileID],Oc1->spr+4096);
  870.                     }else{
  871.                         if(AO->Direction<5)
  872.                         ShowRLCItem((AO->x>>10)-(mapx*32)+smapx+Oc1->dx,
  873.                                     (AO->y>>10)-(mapy*32)+smapy+Oc1->dy,
  874.                                 &MImage[Oc1->FileID],Oc1->spr,0);else
  875.                         ShowRLCItem((AO->x>>10)-(mapx*32)+smapx+32-Oc1->dx,
  876.                                     (AO->y>>10)-(mapy*32)+smapy+Oc1->dy,
  877.                                 &MImage[Oc1->FileID],Oc1->spr+4096,0);
  878.                     
  879.                     };
  880.                 };
  881.             };
  882.             AO->Canm++;
  883.             if(AO->OneTime&&AO->Canm>=AO->Nanm){
  884.                 short prob=rando()>>7;
  885.                 Weapon* NW=AO->Wpn->NextWeapon;    
  886.                 Weapon* Wp=AO->Wpn;
  887.                 if(int(NW)){
  888.                 CreateExObjD(NW,AO->x>>8,AO->y>>8,0,0,255,AO->Sender);
  889.                 };
  890.                     if(prob<AO->Wpn->Probab1){        
  891.                     CreateRandObj(Wp,AO->x>>8,AO->y>>8,AO->PhDir,8,16,64,AO->NMask,AO->Sender);
  892.                 };
  893.                 /*int pr2=div(AO->Wpn->Probab2*(MaxExpl-nEused),MaxExpl).quot;
  894.                     if(prob<pr2){    
  895.                     CreateRandObj(Wp,AO->x,AO->y,AO->PhDir,8,0,128);
  896.                     CreateRandObj(Wp,AO->x,AO->y,AO->PhDir,8,0,128);
  897.                 };*/
  898.             };
  899.             if(AO->WATT&&WMap[ym][xm])CloseExu(i);
  900.             if(AO->Canm>=AO->Nanm){
  901.                 if(AO->OneTime){
  902.                     Weapon* Wp=AO->Wpn;
  903.                     word MID=Mops[ym][xm];
  904.                     if(MID==0xFFFF)MID=FlyMops[ym][xm];
  905.                     if(MID!=0xFFFF){
  906.                         OneObject* OB=Group[MID];
  907.                         //short dam=AO->MinDamage+
  908.                         //((int(AO->MaxDamage-AO->MinDamage)*rando())>>15);
  909.                         //if(OB->Life>dam)OB->Life-=dam;else OB->Life=0;
  910.                         OB->MakeDamage(AO->MaxDamage,AO->MinDamage,AO->Sender);
  911.                     };
  912.                     CloseExu(i);
  913.                 }else AO->Canm=0;
  914.             };
  915. CycEnd:
  916.             if(AO->AnmLead){
  917.                 word DAO=AO->DestObj;
  918.                 AnmObject* EO=GAnm[DAO];
  919.                 if(EUsage[DAO]&&EO->ASerial==AO->DSerial){
  920.                     AO->vx=(EO->x-AO->x)>>8;
  921.                     AO->vy=(EO->y-AO->y)>>8;
  922.                     int dss=sqrt(AO->vx*AO->vx+AO->vy*AO->vy);
  923.                     if(dss){
  924.                         AO->vx=div(int(AO->v)*AO->vx,dss).quot<<8;
  925.                         AO->vy=div(int(AO->v)*AO->vy,dss).quot<<8;
  926.                     };
  927.                     if(dss<128){
  928.                         EUsage[DAO]=false;
  929.                         Weapon* NW=AO->Wpn->NextWeapon;    
  930.                         Weapon* Wp=AO->Wpn;
  931.                         if(int(NW))
  932.                             CreateExObjD(NW,AO->x>>8,AO->y>>8,0,0,255,AO->Sender);
  933.                     };
  934.                 }else{
  935.                     CloseExu(i);
  936.                 };
  937.             };
  938.             AO->x+=AO->vx;
  939.             AO->y+=AO->vy;
  940.         };
  941.     };
  942. };
  943. void Nation::AssignWeapon(Weapon* Wpn,int i){
  944.     if(i<NMon){
  945.         Mon[i]->Weap=Wpn;
  946.     };
  947. }
  948.  
  949.  
  950.  
  951.  
  952.