equal
deleted
inserted
replaced
569 |
569 |
570 if Gear^.Timer mod cHHStepTicks = 0 then |
570 if Gear^.Timer mod cHHStepTicks = 0 then |
571 begin |
571 begin |
572 b:= true; |
572 b:= true; |
573 if Gear^.dX.isNegative then |
573 if Gear^.dX.isNegative then |
574 HHGear^.Message:= (HHGear^.Message and gm_Attack) or gm_Left |
574 HHGear^.Message:= (HHGear^.Message and (gm_Attack or gm_Up or gm_Down)) or gm_Left |
575 else |
575 else |
576 HHGear^.Message:= (HHGear^.Message and gm_Attack) or gm_Right; |
576 HHGear^.Message:= (HHGear^.Message and (gm_Attack or gm_Up or gm_Down)) or gm_Right; |
577 |
577 |
578 if ((HHGear^.State and gstMoving) = 0) then |
578 if ((HHGear^.State and gstMoving) = 0) then |
579 begin |
579 begin |
580 HHGear^.State:= HHGear^.State and not gstAttacking; |
580 HHGear^.State:= HHGear^.State and not gstAttacking; |
581 prevX:= hwRound(HHGear^.X); |
581 prevX:= hwRound(HHGear^.X); |
626 //////////////////////////////////////////////////////////////////////////////// |
626 //////////////////////////////////////////////////////////////////////////////// |
627 |
627 |
628 procedure doStepRopeWork(Gear: PGear); |
628 procedure doStepRopeWork(Gear: PGear); |
629 const flCheck: boolean = false; |
629 const flCheck: boolean = false; |
630 var HHGear: PGear; |
630 var HHGear: PGear; |
631 len, cs, cc, tx, ty, nx, ny: hwFloat; |
631 len, cs, cc, tx, ty, nx, ny, ropeDx, ropeDy: hwFloat; |
632 lx, ly: LongInt; |
632 lx, ly: LongInt; |
633 |
633 |
634 procedure DeleteMe; |
634 procedure DeleteMe; |
635 begin |
635 begin |
636 with HHGear^ do |
636 with HHGear^ do |
649 begin |
649 begin |
650 DeleteMe; |
650 DeleteMe; |
651 exit |
651 exit |
652 end; |
652 end; |
653 |
653 |
654 Gear^.dX:= HHGear^.X - Gear^.X; |
654 ropeDx:= HHGear^.X - Gear^.X; // vector between hedgehog and rope attaching point |
655 Gear^.dY:= HHGear^.Y - Gear^.Y; |
655 ropeDy:= HHGear^.Y - Gear^.Y; |
656 |
656 |
657 if (Gear^.Message and gm_Left <> 0) then HHGear^.dX:= HHGear^.dX - _0_0002 else |
657 if (Gear^.Message and gm_Left <> 0) then HHGear^.dX:= HHGear^.dX - _0_0002 else |
658 if (Gear^.Message and gm_Right <> 0) then HHGear^.dX:= HHGear^.dX + _0_0002; |
658 if (Gear^.Message and gm_Right <> 0) then HHGear^.dX:= HHGear^.dX + _0_0002; |
659 |
659 |
660 if not TestCollisionYwithGear(HHGear, 1) then HHGear^.dY:= HHGear^.dY + cGravity; |
660 if not TestCollisionYwithGear(HHGear, 1) then HHGear^.dY:= HHGear^.dY + cGravity; |
661 |
661 |
662 cs:= Gear^.dY + HHGear^.dY; |
662 cc:= ropeDx + HHGear^.dX; |
663 cc:= Gear^.dX + HHGear^.dX; |
663 cs:= ropeDy + HHGear^.dY; |
664 len:= _1 / Distance(cc, cs); |
664 len:= _1 / Distance(cc, cs); |
665 cc:= cc * len; // rope vector plus hedgehog direction vector normalized |
665 cc:= cc * len; // rope vector plus hedgehog direction vector normalized |
666 cs:= cs * len; |
666 cs:= cs * len; |
667 |
667 |
668 nx:= SignAs(cs, HHGear^.dX) * 7; // hedgehog direction normalized with length 7 |
668 nx:= SignAs(cs, HHGear^.dX) * 7; // hedgehog direction normalized with length 7 |
694 TryDo(RopePoints.Count <= MAXROPEPOINTS, 'Rope points overflow', true); |
694 TryDo(RopePoints.Count <= MAXROPEPOINTS, 'Rope points overflow', true); |
695 Gear^.Elasticity:= Gear^.Elasticity - len; |
695 Gear^.Elasticity:= Gear^.Elasticity - len; |
696 Gear^.Friction:= Gear^.Friction - len; |
696 Gear^.Friction:= Gear^.Friction - len; |
697 break |
697 break |
698 end; |
698 end; |
699 len:= len - _0_5 |
699 len:= len - _3 |
700 end; |
700 end; |
701 end else |
701 end else |
702 if RopePoints.Count > 0 then // check whether the last dividing point could be removed |
702 if RopePoints.Count > 0 then // check whether the last dividing point could be removed |
703 begin |
703 begin |
704 tx:= RopePoints.ar[Pred(RopePoints.Count)].X; |
704 tx:= RopePoints.ar[Pred(RopePoints.Count)].X; |