<1>/* Graphics Not Rendered in HTML */




<2>/* Graphics Not Rendered in HTML */



<3>/* Graphics Not Rendered in HTML */




<4>/* Graphics Not Rendered in HTML */





<5>/* Graphics Not Rendered in HTML */




<6>/* Graphics Not Rendered in HTML */



#define MAX_CONVEYERS 15
#define MAX_GEARS     30
#define GEAR_WIDTH    20
#define GEAR_HEIGHT   20

U8 num_gears=0;
U8 num_conveyers=0;

I64 GearsX[MAX_GEARS];
I64 GearsY[MAX_GEARS];
I64 GearsType[MAX_GEARS];
I64 ConveyersStartX[MAX_CONVEYERS];
I64 ConveyersStartY[MAX_CONVEYERS];
I64 ConveyersEndX[MAX_CONVEYERS];
I64 ConveyersEndY[MAX_CONVEYERS];
Bool Gear_mode=1;
Bool Conveyer_mode=0;
Bool PlacingConveyer=0;
Bool Clicking=0;


Bool Collision(I64 x, I64 y, I64 radius,
             I64 x2,I64 y2)
{


 F64 distX=x-x2;
 F64 distY=y-y2;
 F64 Dist=Sqrt((distX*distX)+
               (distY*distY));

 return(Dist<=radius);

}


I64 Check_Gears(I64 x,I64 y)
{
U8 i;
 for(i=0;i<MAX_GEARS;i++){
   if(Collision(x,y,GEAR_WIDTH,
                    GearsX[i],GearsY[i]))
    return i;
  }
 return 0;
}


I64 CheckGears_ButSkip(I64 x,I64 y,I64 skip)
{
I64 i;
 for(i=0;i<MAX_GEARS;i++){
   if(Collision(GearsX[i],GearsY[i],GEAR_WIDTH,
                    x,y)){
    if(i!=skip)
    return i;
   }
  }
 return 0;
}


I64 Check_Conveyer(I64 x,I64 y)
{
U8 i;
 for(i=0;i<MAX_CONVEYERS;i++){
   if(ConveyersStartX[i]!=0&&
      ConveyersStartY[i]!=0&&
      ConveyersEndX[i]!=0&&
      ConveyersEndY[i]!=0){

   if(Collision(x,y,GEAR_WIDTH,
                ConveyersStartX[i],
                ConveyersStartY[i]))
    return i;

   if(Collision(x,y,GEAR_WIDTH,
                ConveyersEndX[i],
                ConveyersEndY[i]))
    return i;
   }
  }
 return 0;
}



U0 UpdateGears(I64 UpdatedGear)
{
I64 i;
I64 d;
I64 g;
I64 j;
I64 k;
I64 h;

for(i=0;i<MAX_GEARS;i++){ 
/* Check Touching Gears         */
g=CheckGears_ButSkip(GearsX[i],
                     GearsY[i],i);
 for(d=i;d>0;d--)
 {
 if(g!=0&&GearsType[g]!=0)
  {
   GearsType[g]=GearsType[i];
     }else{
   g=CheckGears_ButSkip(GearsX[g],
                      GearsY[g],g);  
    }
 g=CheckGears_ButSkip(GearsX[g],
                      GearsY[g],g);  
  } 
 }
 for(i=0;i<MAX_GEARS;i++){
 j=Check_Conveyer(GearsX[i],GearsY[i]);
/* Check conveyers               */
 if(j!=0){
  k=Check_Gears(ConveyersStartX[j],ConveyersStartY[j]);
  h=Check_Gears(ConveyersEndX[j],ConveyersEndY[j]);
  if(h!=UpdatedGear&&k!=UpdatedGear)
  {
  if(ConveyersStartX[j]==GearsX[i]&&
     ConveyersStartY[j]==GearsY[i]){
  GearsType[h]=GearsType[i];
  }else if(ConveyersEndX[j]==GearsX[i]&&
     ConveyersEndY[j]==GearsY[i]){          
  GearsType[k]=GearsType[i];
   }
  }else{
  if(h==UpdatedGear)
  GearsType[k]=GearsType[h];
  else
  GearsType[h]=GearsType[k];
   }
  }
 }
}
U0 Init()
{
U8 i;
for(i=0;i<MAX_GEARS;i++){
  GearsX[i]=0;
  GearsY[i]=0;
  GearsType[i]=0;
 }
 for(i=0;i<MAX_CONVEYERS;i++){
  ConveyersStartX[i]=0;
  ConveyersStartY[i]=0;
  ConveyersEndX[i]=0;
  ConveyersEndY[i]=0;
  }
 GearsX[1]=Fs->pix_width>>1;
 GearsY[1]=Fs->pix_height>>1;
 GearsX[2]=GearsX[1];
 GearsY[2]=GearsY[1]-50;
 GearsType[2]=2;
 GearsType[1]=2;
 ConveyersStartX[1]=GearsX[1];
 ConveyersStartY[1]=GearsY[1];
 ConveyersEndX[1]=GearsX[2];
 ConveyersEndY[1]=GearsY[2];

 num_gears=2;
 num_conveyers=1;
 PlacingConveyer=FALSE;
 UpdateGears(2);
}

I64 AbsoluteVal(I64 num)
{
 I64 AbsoluteNum;
 if(num<0)
 AbsoluteNum=(-1)*num;
 else
 AbsoluteNum=num;

 return AbsoluteNum;
}

U0 Put_Gear(I64 x,I64 y){

I64 i=Check_Gears(x,y);
if(!Collision(x,y,GEAR_WIDTH-5,GearsX[i],GearsY[i]))
{
   num_gears++;
   GearsX[num_gears]=x;
   GearsY[num_gears]=y;
   GearsType[num_gears]=1;
   UpdateGears(num_gears);
 }
}

U0 Put_Motor(I64 x, I64 y)
{
 I64 i=Check_Gears(x,y);
 I64 j=Check_Conveyer(x,y);
 I64 g=CheckGears_ButSkip(GearsX[i],GearsY[i],i);
 I64 d;
 Print("%d",i);
 if(i!=0){
  if(GearsType[i]!=2)
  {
  GearsType[i]=2;
  }else{
  GearsType[i]=1;
  }
if(i!=0)
 UpdateGears(i);
else
 UpdateGears(num_gears);
 }
}

U0 Put_Conveyer(I64 x, I64 y)
{
 I64 j=Check_Gears(x,y);
 I64 i=Check_Conveyer(x,y);
 if(num_conveyers<MAX_CONVEYERS)
 {
 if(!PlacingConveyer){
 if(j!=0&&i==0)
 {
 num_conveyers++;
 ConveyersStartX[num_conveyers]=GearsX[j];
 ConveyersStartY[num_conveyers]=GearsY[j];
 PlacingConveyer=TRUE;
  }
 }else{
 if(j!=0&&i==0&&
 ConveyersStartX[num_conveyers]!=GearsX[j]&&
 ConveyersStartY[num_conveyers]!=GearsY[j])
 {
 ConveyersEndX[num_conveyers]=GearsX[j];
 ConveyersEndY[num_conveyers]=GearsY[j];
 PlacingConveyer=FALSE; 
   }
  }
 }
}

U0 DrawIt(CTask *task, CDC *dc)
{
U8 i;

for(i=0;i<MAX_GEARS;i++){
 if(GearsType[i]==1)
 Sprite3(dc,GearsX[i],GearsY[i],0,<1>);

 if(GearsType[i]==2){
 Sprite3ZB(dc,GearsX[i],GearsY[i],0,<2>,2*tS);
  }
 }
for(i=0;i<MAX_CONVEYERS;i++)
{
 if(ConveyersEndX[i]!=0){
 GrCircle(dc,ConveyersStartX[i],
             ConveyersStartY[i],5);
 
 GrCircle(dc,ConveyersEndX[i],
             ConveyersEndY[i],5);
 if(AbsoluteVal(ConveyersStartY[i]-ConveyersEndY[i])<
    AbsoluteVal(ConveyersStartX[i]-ConveyersEndX[i]))
 {
 GrLine(dc,ConveyersStartX[i],
      ConveyersStartY[i]+5,
      ConveyersEndX[i],
      ConveyersEndY[i]+5);
 GrLine(dc,ConveyersStartX[i],
      ConveyersStartY[i]-5,
      ConveyersEndX[i],
      ConveyersEndY[i]-5);
 }else{
 GrLine(dc,ConveyersStartX[i]+5,
      ConveyersStartY[i],
      ConveyersEndX[i]+5,
      ConveyersEndY[i]);
 GrLine(dc,ConveyersStartX[i]-5,
      ConveyersStartY[i],
      ConveyersEndX[i]-5,
      ConveyersEndY[i]);
   }
  }else if(ConveyersStartX[i]!=0){
 GrCircle(dc,ConveyersStartX[i],
             ConveyersStartY[i],5); 
 GrCircle(dc,ms.pos.x,
             ms.pos.y,5);
 if(AbsoluteVal(ConveyersStartY[i]-ms.pos.y)<
    AbsoluteVal(ConveyersStartX[i]-ms.pos.x)){
 GrLine(dc,ConveyersStartX[i],
      ConveyersStartY[i]+5,
      ms.pos.x,
      ms.pos.y+5);
 GrLine(dc,ConveyersStartX[i],
       ConveyersStartY[i]-5,
      ms.pos.x,
      ms.pos.y-5);
 }else{
 GrLine(dc,ConveyersStartX[i]+5,
      ConveyersStartY[i],
      ms.pos.x+5,
      ms.pos.y);
 GrLine(dc,ConveyersStartX[i]-5,
      ConveyersStartY[i],
      ms.pos.x-5,
      ms.pos.y);
  }
 GrPrint(dc,70,5,"%dx,%dy",AbsoluteVal(ms.pos.x),
                AbsoluteVal(ms.pos.y));
 }
}
Sprite3(dc,35,35,0,<5>);
Sprite3(dc,65,35,0,<6>);
GrPrint(dc,15,15,"Right click to make gear rotate");
GrPrint(dc,30,30,"Left click to place gear");
if(Collision(35,35,25,ms.pos.x,ms.pos.y))
{
if(!Gear_mode&&Clicking){
Gear_mode=TRUE;

if(PlacingConveyer){
 ConveyersStartX[num_conveyers]=0;
 ConveyersStartY[num_conveyers]=0;
 num_conveyers--;
 PlacingConveyer=FALSE;
  }
Conveyer_mode=FALSE;
}else if(Clicking){
Gear_mode=FALSE;
 }
Clicking=FALSE;
}           
if(Collision(70,35,30,ms.pos.x,ms.pos.y))
{
 if(!Conveyer_mode&&Clicking){
 Conveyer_mode=TRUE;
 Gear_mode=FALSE;
 }else if(Clicking){
 Conveyer_mode=FALSE;
 if(PlacingConveyer){
 ConveyersStartX[num_conveyers]=0;
 ConveyersStartY[num_conveyers]=0;
 num_conveyers--;
 PlacingConveyer=FALSE;
  }
 }
}
if(Clicking==TRUE&&Gear_mode==TRUE)
  Put_Gear(ms.pos.x,ms.pos.y);
else if(Clicking==TRUE&&Conveyer_mode==TRUE)
  Put_Conveyer(ms.pos.x,ms.pos.y);
Clicking=FALSE;

if(Gear_mode)
Sprite3(dc,ms.pos.x,ms.pos.y,0,<3>);
else if(Conveyer_mode)
Sprite3(dc,ms.pos.x,ms.pos.y,0,<4>);

}

U0 Gears()
{
 I64 ch, sc, arg1, arg2, msg_code;
 DocClear;
 Fs->win_inhibit|=WIF_SELF_MS_L|WIF_SELF_MS_R;
 Fs->draw_it=&DrawIt;
 WinMax;
 WinBorder;
 Init;
while(TRUE){    
if (msg_code=ScanMsg(&arg1,&arg2,1<<MSG_KEY_DOWN | 1<<MSG_KEY_UP
                                |1<<MSG_MS_L_UP|1<<MSG_MS_R_UP
                                |1<<MSG_MS_R_D_UP|1<<MSG_MS_L_D_UP)) 
{
sc=arg2; ch=arg1;
 switch(ch){
  case CH_SHIFT_ESC:
  case CH_ESC:
  goto da_end;
 }
 if(msg_code==MSG_MS_L_UP&&!Clicking)
 Clicking=TRUE;
 if(msg_code==MSG_MS_R_UP)
 Put_Motor(ms.pos.x,ms.pos.y);
 if(msg_code==MSG_MS_R_D_UP)
 Init;
}
UpdateGears(num_gears);
Sleep(5);
}
da_end:
}


Gears;