home *** CD-ROM | disk | FTP | other *** search
/ WarCraft 2000 - Nuclear Epidemic / W2000.nrg / SOURCE.War2000 / Transp.cpp < prev    next >
C/C++ Source or Header  |  1998-09-17  |  6KB  |  243 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 <time.h>
  13. #include "Nucl.h"
  14. #include "TopZones.h"
  15. #include "Megapolis.h"
  16. bool FindLEmpty(int* x,int* y,int r);
  17. void GoToTransportLink(OneObject* OBJ);
  18. bool CheckCostPoint(int x,int y,word TZ){
  19.     if(x>0&&y>0&&x<=msx&&y<=msy){
  20.         if((!TrMap[y][x])&&TZones[y][x]==TZ)return true;
  21.         else return false;
  22.     }else return false;
  23. };
  24. bool CheckTransportOnCost(OneObject* OB,word TZ){
  25.     int xx=OB->x;
  26.     int yy=OB->y;
  27.     if( CheckCostPoint(xx+3,yy,TZ)||
  28.         CheckCostPoint(xx,yy+3,TZ)||
  29.         CheckCostPoint(xx-3,yy,TZ)||
  30.         CheckCostPoint(xx,yy-3,TZ)||
  31.         CheckCostPoint(xx+2,yy+2,TZ)||
  32.         CheckCostPoint(xx-2,yy-2,TZ)||
  33.         CheckCostPoint(xx+2,yy-2,TZ)||
  34.         CheckCostPoint(xx-2,yy+2,TZ)
  35.     )return true;
  36.     return false;
  37. };
  38. bool GetTransCoor(OneObject* OB,OneObject* ME,int* x,int* y){
  39.     int bx,by,xx,yy,dd;
  40.     int tz=TZones[ME->y][ME->x];
  41.     for(int i=1;i<4;i++){
  42.         int x0=int(OB->x)-i;
  43.         int y0=int(OB->y)-i;
  44.         int lx=i+i+1;
  45.         int dis=1000;
  46.         for( int j=0;j<lx;j++){
  47.             xx=x0;
  48.             yy=y0+j;
  49.             if((!TrMap[yy][xx])&&TZones[yy][xx]==tz){
  50.                 dd=ME->DistTo(xx,yy);
  51.                 if(dis>dd){
  52.                     dis=dd;
  53.                     bx=xx;
  54.                     by=yy;
  55.                 };
  56.             };
  57.         };
  58.         for(j=0;j<lx;j++){
  59.             xx=x0+lx-1;
  60.             yy=y0+j;
  61.             if((!TrMap[yy][xx])&&TZones[yy][xx]==tz){
  62.                 dd=ME->DistTo(xx,yy);
  63.                 if(dis>dd){
  64.                     dis=dd;
  65.                     bx=xx;
  66.                     by=yy;
  67.                 };
  68.             };
  69.         };
  70.         for(j=1;j<lx-1;j++){
  71.             xx=x0+j;
  72.             yy=y0;
  73.             if((!TrMap[yy][xx])&&TZones[yy][xx]==tz){
  74.                 dd=ME->DistTo(xx,yy);
  75.                 if(dis>dd){
  76.                     dis=dd;
  77.                     bx=xx;
  78.                     by=yy;
  79.                 };
  80.             };
  81.         };
  82.         for(j=1;j<lx-1;j++){
  83.             xx=x0+j;
  84.             yy=y0+lx-1;
  85.             if((!TrMap[yy][xx])&&TZones[yy][xx]==tz){
  86.                 dd=ME->DistTo(xx,yy);
  87.                 if(dis>dd){
  88.                     dis=dd;
  89.                     bx=xx;
  90.                     by=yy;
  91.                 };
  92.             };
  93.         };
  94.         if(dis<1000){
  95.             *x=bx;
  96.             *y=by;
  97.             return true;
  98.         };
  99.     };
  100.     return false;
  101. };
  102. bool OneObject::GoToTransport(word MID,byte Prio){
  103.     if(Media||capBuilding)return false;
  104.     OneObject* OB=Group[MID];
  105.     if(OB->NNUM!=NNUM)return false;
  106.     if(!OB->Transport||NInside>=18)return false;
  107.     Order1* OR1=GetOrdBlock();
  108.     OR1->NextOrder=LocalOrder;
  109.     OR1->DoLink=&GoToTransportLink;
  110.     LocalOrder=OR1;
  111.     OR1->PrioryLevel=Prio&127;
  112.     OR1->OrderType=149;
  113.     OR1->OrderTime=0;
  114.     OR1->info.MoveToObj.ObjIndex=MID;
  115.     OR1->info.MoveToObj.SN=OB->Serial;
  116.     OR1->info.MoveToObj.PrevDist=30000;
  117.     return true;
  118. };
  119. void GoToTransportLink(OneObject* OBJ){
  120.     word MID=OBJ->LocalOrder->info.MoveToObj.ObjIndex;
  121.     word SN=OBJ->LocalOrder->info.MoveToObj.SN;
  122.     OneObject* OB=Group[MID];
  123.     if((!OB)||(OB&&(OB->Serial!=SN||OB->NInside>=18))){
  124.         Order1* OR1=OBJ->LocalOrder;
  125.         OBJ->LocalOrder=OR1->NextOrder;
  126.         OBJ->FreeOrdBlock(OR1);
  127.         return;
  128.     };
  129.     int xx=0;
  130.     int yy=0;
  131.     if(!CheckTransportOnCost(OB,TZones[OBJ->y][OBJ->x])){
  132.         Order1* OR1=OB->LocalOrder;
  133.         if(OR1&&OR1->OrderType==2){
  134.             byte x1=OR1->info.MoveToXY.x;
  135.             byte y1=OR1->info.MoveToXY.y;
  136.             if(OB->DistTo(x1,y1)>OB->DistTo(OBJ->x,OBJ->y))
  137.                 OB->SendTo(OBJ->x,OBJ->y,16);
  138.         }else OB->SendTo(OBJ->x,OBJ->y,16);
  139.     }else if(GetTransCoor(OB,OBJ,&xx,&yy)){
  140.         if(OBJ->x==xx&&OBJ->y==yy){
  141.             //'ve come
  142.             OB->Inside[OB->NInside]=OBJ->Index;
  143.             Mops[OBJ->y][OBJ->x]=0xFFFF;
  144.             LLock[OBJ->y][OBJ->x]=0;
  145.             TrMap[OBJ->y][OBJ->x]=0;
  146.             DecLock(OBJ->x,OBJ->y);
  147.             TCInf[OBJ->NNUM][OBJ->y>>2][OBJ->x>>2].UnitsAmount[OBJ->Kind]--;
  148.             OBJ->Absent=true;
  149.             OB->NInside++;
  150.             if(OBJ->InLineCom)OBJ->FreeAsmLink();
  151.             OBJ->ClearOrders();
  152.             OBJ->FreeAsmLink();
  153.             //now inside
  154.             return;
  155.         };
  156.         if(!OBJ->InLineCom)OBJ->CreatePath(xx,yy);
  157.         return;
  158.     };
  159.     //OBJ->LocalOrder->info.MoveToObj.PrevDist=dis;
  160.     //move more
  161.     //if(!OBJ->InLineCom)OBJ->CreatePath(OB->x,OB->y);
  162. };
  163. void UnloadPassangersLink(OneObject* OB);
  164. bool OneObject::UnloadPassangers(byte x ,byte y) {
  165.     if(!(Transport&&NInside))return false;
  166.     if(LLock[y][x])return false;
  167.     Order1* OR1=GetOrdBlock();
  168.     OR1->NextOrder=LocalOrder;
  169.     OR1->DoLink=&GoToTransportLink;
  170.     LocalOrder=OR1;
  171.     OR1->PrioryLevel=16;
  172.     OR1->OrderType=110;
  173.     OR1->OrderTime=0;
  174.     OR1->info.MoveToXY.x=x;
  175.     OR1->info.MoveToXY.y=y;
  176.     OR1->info.MoveToXY.PrevDist=30000;
  177.     OR1->DoLink=&UnloadPassangersLink;
  178.     OR1->info.MoveToXY.Times=0;
  179.     return true;
  180. };
  181. bool WFindTLEmpty(int* x,int* y,int r,ZType z1);
  182. bool WFindTLEmptyDirect(int* x,int* y,ZType z1,int xd,int yd);
  183. void UnloadPassangersLink(OneObject* OBJ){
  184.     int xx=OBJ->LocalOrder->info.MoveToXY.x;
  185.     int yy=OBJ->LocalOrder->info.MoveToXY.y;
  186.     WMap[OBJ->y][OBJ->x]=0;
  187.     if(WMap[yy][xx]){
  188.         if(WFindTLEmptyDirect(&xx,&yy,TZones[OBJ->y][OBJ->x],OBJ->x,OBJ->y)){
  189.             OBJ->LocalOrder->info.MoveToXY.x=xx;
  190.             OBJ->LocalOrder->info.MoveToXY.y=yy;
  191.         }else{
  192.             OBJ->LocalOrder->info.MoveToXY.x=OBJ->x;
  193.             OBJ->LocalOrder->info.MoveToXY.y=OBJ->y;
  194.         };
  195.     };
  196.     xx=OBJ->LocalOrder->info.MoveToXY.x;
  197.     yy=OBJ->LocalOrder->info.MoveToXY.y;
  198.     int dis1=OBJ->LocalOrder->info.MoveToXY.PrevDist;
  199.     int dst=OBJ->DistTo(xx,yy);
  200.     OBJ->LocalOrder->info.MoveToXY.PrevDist=dst;
  201.     if(!dst){
  202.         OBJ->LocalOrder->info.MoveToXY.Times++;
  203.         //if(OBJ->LocalOrder->info.MoveToXY.Times>=8){
  204.             //is there a small piece of land ?
  205.             int x1=OBJ->x;
  206.             int y1=OBJ->y;
  207.             if(FindLEmpty(&x1,&y1,10)){
  208.                 int NINS=OBJ->NInside;
  209.                 for(int i=0;i<NINS;i++){
  210.                     x1=OBJ->x;
  211.                     y1=OBJ->y;
  212.                     if(FindLEmpty(&x1,&y1,10)){
  213.                         OBJ->NInside--;
  214.                         word MID=OBJ->Inside[OBJ->NInside];
  215.                         OneObject* OB=Group[MID];
  216.                         if(OB){
  217.                             OB->x=x1;
  218.                             OB->y=y1;
  219.                             OB->Absent=false;
  220.                             LLock[y1][x1]=true;
  221.                             IncLock(x1,y1);
  222.                             Mops[y1][x1]=OB->Index;
  223.                             TCInf[OBJ->NNUM][y1>>2][x1>>2].UnitsAmount[OBJ->Kind]++;
  224.                             OB->ClearOrders();
  225.                             if(OB->InLineCom)OB->FreeAsmLink();
  226.                         };
  227.                     };
  228.                 };
  229.                 Order1* OR1=OBJ->LocalOrder;
  230.                 OBJ->LocalOrder=OR1->NextOrder;
  231.                 OBJ->FreeOrdBlock(OR1);
  232.                 return;
  233.             };
  234.         //}else {
  235.         //    OBJ->LocalOrder->info.MoveToXY.Times++;
  236.         //    OBJ->CreateWPath(OBJ->LocalOrder->info.MoveToXY.x,OBJ->LocalOrder->info.MoveToXY.y);
  237.         //    return;
  238.         //};
  239.     };
  240.     //OBJ->LocalOrder->info.MoveToXY.Times=0;
  241.     OBJ->CreateWPath(OBJ->LocalOrder->info.MoveToXY.x,OBJ->LocalOrder->info.MoveToXY.y);
  242. };
  243.