hedgewars/GSHandlers.inc
changeset 789 3d976d2579eb
parent 776 8fc7e59d9cb4
child 798 02753868d459
equal deleted inserted replaced
788:00720357601f 789:3d976d2579eb
   543 ////////////////////////////////////////////////////////////////////////////////
   543 ////////////////////////////////////////////////////////////////////////////////
   544 
   544 
   545 procedure doStepRopeWork(Gear: PGear);
   545 procedure doStepRopeWork(Gear: PGear);
   546 const flCheck: boolean = false;
   546 const flCheck: boolean = false;
   547 var HHGear: PGear;
   547 var HHGear: PGear;
   548     len, cs, cc, tx, ty: hwFloat;
   548     len, cs, cc, tx, ty, nx, ny: hwFloat;
   549     lx, ly: LongInt;
   549     lx, ly: LongInt;
   550 
   550 
   551     procedure DeleteMe;
   551     procedure DeleteMe;
   552     begin
   552     begin
   553       with HHGear^ do
   553       with HHGear^ do
   578 if not TestCollisionYwithGear(HHGear, 1) then HHGear^.dY:= HHGear^.dY + cGravity;
   578 if not TestCollisionYwithGear(HHGear, 1) then HHGear^.dY:= HHGear^.dY + cGravity;
   579 
   579 
   580 cs:= Gear^.dY + HHGear^.dY;
   580 cs:= Gear^.dY + HHGear^.dY;
   581 cc:= Gear^.dX + HHGear^.dX;
   581 cc:= Gear^.dX + HHGear^.dX;
   582 len:= _1 / Distance(cc, cs);
   582 len:= _1 / Distance(cc, cs);
   583 cc:= cc * len;
   583 cc:= cc * len; // rope vector plus hedgehog direction vector normalized
   584 cs:= cs * len;
   584 cs:= cs * len;
       
   585 
       
   586 nx:= hwAbs(cs) * hwSign(HHGear^.dX) * 3; // hedgehog direction normalized with length 3
       
   587 ny:= hwAbs(cc) * hwSign(HHGear^.dY) * 3;
   585 
   588 
   586 flCheck:= not flCheck;
   589 flCheck:= not flCheck;
   587 if flCheck then  // check whether rope needs dividing
   590 if flCheck then  // check whether rope needs dividing
   588    begin
   591    begin
   589    len:= Gear^.Elasticity - _20;
   592    len:= Gear^.Elasticity - _20;
   590    while len > _5 do
   593    while len > _5 do
   591          begin
   594          begin
   592          tx:= cc*len;
   595          tx:= cc*len;
   593          ty:= cs*len;
   596          ty:= cs*len;
   594          lx:= hwRound(Gear^.X + tx) + hwSign(HHGear^.dX)*2;
   597          lx:= hwRound(Gear^.X + tx + nx);
   595          ly:= hwRound(Gear^.Y + ty) + hwSign(HHGear^.dY)*2;
   598          ly:= hwRound(Gear^.Y + ty + ny);
   596          if ((ly and $FFFFFC00) = 0) and ((lx and $FFFFF800) = 0) and (Land[ly, lx] <> 0) then
   599          if ((ly and $FFFFFC00) = 0) and ((lx and $FFFFF800) = 0) and (Land[ly, lx] <> 0) then
   597            begin
   600            begin
   598            with RopePoints.ar[RopePoints.Count] do
   601            with RopePoints.ar[RopePoints.Count] do
   599                 begin
   602                 begin
   600                 X:= Gear^.X;
   603                 X:= Gear^.X;
   604                 dLen:= len
   607                 dLen:= len
   605                 end;
   608                 end;
   606            Gear^.X:= Gear^.X + tx;
   609            Gear^.X:= Gear^.X + tx;
   607            Gear^.Y:= Gear^.Y + ty;
   610            Gear^.Y:= Gear^.Y + ty;
   608            inc(RopePoints.Count);
   611            inc(RopePoints.Count);
       
   612            TryDo(RopePoints.Count <= MAXROPEPOINTS, 'Rope points overflow', true);
   609            Gear^.Elasticity:= Gear^.Elasticity - len;
   613            Gear^.Elasticity:= Gear^.Elasticity - len;
   610            Gear^.Friction:= Gear^.Friction - len;
   614            Gear^.Friction:= Gear^.Friction - len;
   611            break
   615            break
   612            end;
   616            end;
   613          len:= len - _3
   617          len:= len - _2
   614          end;
   618          end;
   615    end else
   619    end else
   616    if RopePoints.Count > 0 then // check whether the last dividing point could be removed
   620    if RopePoints.Count > 0 then // check whether the last dividing point could be removed
   617       begin
   621       begin
   618       tx:= RopePoints.ar[Pred(RopePoints.Count)].X;
   622       tx:= RopePoints.ar[Pred(RopePoints.Count)].X;
   655 
   659 
   656 if TestCollisionXwithGear(HHGear, hwSign(HHGear^.dX)) then
   660 if TestCollisionXwithGear(HHGear, hwSign(HHGear^.dX)) then
   657    HHGear^.dX:= -_0_6 * HHGear^.dX;
   661    HHGear^.dX:= -_0_6 * HHGear^.dX;
   658 if TestCollisionYwithGear(HHGear, hwSign(HHGear^.dY)) then
   662 if TestCollisionYwithGear(HHGear, hwSign(HHGear^.dY)) then
   659    HHGear^.dY:= -_0_6 * HHGear^.dY;
   663    HHGear^.dY:= -_0_6 * HHGear^.dY;
       
   664 
       
   665 len:= Distance(HHGear^.dX, HHGear^.dY);
       
   666 if len > _0_5 then
       
   667    begin
       
   668    len:= _0_5 / len;
       
   669    HHGear^.dX:= HHGear^.dX * len;
       
   670    HHGear^.dY:= HHGear^.dY * len;
       
   671    end;
   660 
   672 
   661 if (Gear^.Message and gm_Attack) <> 0 then
   673 if (Gear^.Message and gm_Attack) <> 0 then
   662    if (Gear^.State and gsttmpFlag) <> 0 then DeleteMe else
   674    if (Gear^.State and gsttmpFlag) <> 0 then DeleteMe else
   663 else if (Gear^.State and gsttmpFlag) = 0 then Gear^.State:= Gear^.State or gsttmpFlag;
   675 else if (Gear^.State and gsttmpFlag) = 0 then Gear^.State:= Gear^.State or gsttmpFlag;
   664 end;
   676 end;