<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;