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