hedgewars/GSHandlers.inc
changeset 6474 42e9773eedfd
parent 6473 2bed5ba1a7ea
child 6490 531bf083e8db
equal deleted inserted replaced
6473:2bed5ba1a7ea 6474:42e9773eedfd
  1376         Gear^.State := Gear^.State and (not gsttmpflag);
  1376         Gear^.State := Gear^.State and (not gsttmpflag);
  1377         Gear^.doStep := @doStepRope;
  1377         Gear^.doStep := @doStepRope;
  1378     end
  1378     end
  1379 end;
  1379 end;
  1380 
  1380 
       
  1381 procedure RopeDeleteMe(Gear, HHGear: PGear);
       
  1382 begin
       
  1383     with HHGear^ do
       
  1384     begin
       
  1385         Message := Message and (not gmAttack);
       
  1386         State := (State or gstMoving) and (not gstWinner);
       
  1387     end;
       
  1388     DeleteGear(Gear)
       
  1389 end;
       
  1390 
       
  1391 procedure RopeWaitCollision(Gear, HHGear: PGear);
       
  1392 begin
       
  1393     with HHGear^ do
       
  1394     begin
       
  1395         Message := Message and (not gmAttack);
       
  1396         State := State or gstMoving;
       
  1397     end;
       
  1398     RopePoints.Count := 0;
       
  1399     Gear^.Elasticity := _0;
       
  1400     Gear^.doStep := @doStepRopeAfterAttack
       
  1401 end;
       
  1402 
  1381 procedure doStepRopeWork(Gear: PGear);
  1403 procedure doStepRopeWork(Gear: PGear);
  1382 var 
  1404 var 
  1383     HHGear: PGear;
  1405     HHGear: PGear;
  1384     len, tx, ty, nx, ny, ropeDx, ropeDy, mdX, mdY: hwFloat;
  1406     len, tx, ty, nx, ny, ropeDx, ropeDy, mdX, mdY: hwFloat;
  1385     lx, ly, cd: LongInt;
  1407     lx, ly, cd: LongInt;
  1386     haveCollision,
  1408     haveCollision,
  1387     haveDivided: boolean;
  1409     haveDivided: boolean;
  1388 
  1410 
  1389 procedure DeleteMe;
       
  1390 begin
       
  1391     with HHGear^ do
       
  1392     begin
       
  1393         Message := Message and (not gmAttack);
       
  1394         State := (State or gstMoving) and (not gstWinner);
       
  1395     end;
       
  1396     DeleteGear(Gear)
       
  1397 end;
       
  1398 
       
  1399 procedure WaitCollision;
       
  1400 begin
       
  1401     with HHGear^ do
       
  1402     begin
       
  1403         Message := Message and (not gmAttack);
       
  1404         State := State or gstMoving;
       
  1405     end;
       
  1406     RopePoints.Count := 0;
       
  1407     Gear^.Elasticity := _0;
       
  1408     Gear^.doStep := @doStepRopeAfterAttack
       
  1409 end;
       
  1410 
       
  1411 begin
  1411 begin
  1412     HHGear := Gear^.Hedgehog^.Gear;
  1412     HHGear := Gear^.Hedgehog^.Gear;
  1413 
  1413 
  1414     if ((HHGear^.State and gstHHDriven) = 0)
  1414     if ((HHGear^.State and gstHHDriven) = 0)
  1415        or (CheckGearDrowning(HHGear)) then
  1415        or (CheckGearDrowning(HHGear)) then
  1416         begin
  1416         begin
  1417         PlaySound(sndRopeRelease);
  1417         PlaySound(sndRopeRelease);
  1418         DeleteMe;
  1418         RopeDeleteMe(Gear, HHGear);
  1419         exit
  1419         exit
  1420         end;
  1420         end;
  1421 
  1421 
  1422     if (Gear^.Message and gmLeft  <> 0) and (not TestCollisionXwithGear(HHGear, -1)) then
  1422     if (Gear^.Message and gmLeft  <> 0) and (not TestCollisionXwithGear(HHGear, -1)) then
  1423         HHGear^.dX := HHGear^.dX - _0_0002;
  1423         HHGear^.dX := HHGear^.dX - _0_0002;
  1627         if (Gear^.State and gsttmpFlag) <> 0 then
  1627         if (Gear^.State and gsttmpFlag) <> 0 then
  1628             with Gear^.Hedgehog^ do
  1628             with Gear^.Hedgehog^ do
  1629                 begin
  1629                 begin
  1630                 PlaySound(sndRopeRelease);
  1630                 PlaySound(sndRopeRelease);
  1631                 if CurAmmoType <> amParachute then
  1631                 if CurAmmoType <> amParachute then
  1632                     WaitCollision
  1632                     RopeWaitCollision(Gear, HHGear)
  1633                 else
  1633                 else
  1634                     DeleteMe
  1634                     RopeDeleteMe(Gear, HHGear)
  1635                 end
  1635                 end
  1636         end
  1636         end
  1637     else
  1637     else
  1638         if (Gear^.State and gsttmpFlag) = 0 then
  1638         if (Gear^.State and gsttmpFlag) = 0 then
  1639             Gear^.State := Gear^.State or gsttmpFlag;
  1639             Gear^.State := Gear^.State or gsttmpFlag;
  1640 end;
  1640 end;
  1641 
  1641 
       
  1642 procedure RopeRemoveFromAmmo(Gear, HHGear: PGear);
       
  1643 begin
       
  1644     if (Gear^.State and gstAttacked) = 0 then
       
  1645     begin
       
  1646         OnUsedAmmo(HHGear^.Hedgehog^);
       
  1647         Gear^.State := Gear^.State or gstAttacked
       
  1648     end;
       
  1649     ApplyAmmoChanges(HHGear^.Hedgehog^)
       
  1650 end;
       
  1651 
  1642 procedure doStepRopeAttach(Gear: PGear);
  1652 procedure doStepRopeAttach(Gear: PGear);
  1643 var 
  1653 var 
  1644     HHGear: PGear;
  1654     HHGear: PGear;
  1645     tx, ty, tt: hwFloat;
  1655     tx, ty, tt: hwFloat;
  1646 
       
  1647 procedure RemoveFromAmmo;
       
  1648 begin
       
  1649     if (Gear^.State and gstAttacked) = 0 then
       
  1650     begin
       
  1651         OnUsedAmmo(HHGear^.Hedgehog^);
       
  1652         Gear^.State := Gear^.State or gstAttacked
       
  1653     end;
       
  1654     ApplyAmmoChanges(HHGear^.Hedgehog^)
       
  1655 end;
       
  1656 
       
  1657 begin
  1656 begin
  1658     Gear^.X := Gear^.X - Gear^.dX;
  1657     Gear^.X := Gear^.X - Gear^.dX;
  1659     Gear^.Y := Gear^.Y - Gear^.dY;
  1658     Gear^.Y := Gear^.Y - Gear^.dY;
  1660     Gear^.Elasticity := Gear^.Elasticity + _1;
  1659     Gear^.Elasticity := Gear^.Elasticity + _1;
  1661 
  1660 
  1700                     begin
  1699                     begin
  1701                     State := State and (not (gstAttacking or gstHHJumping or gstHHHJump));
  1700                     State := State and (not (gstAttacking or gstHHJumping or gstHHHJump));
  1702                     Message := Message and (not gmAttack)
  1701                     Message := Message and (not gmAttack)
  1703                     end;
  1702                     end;
  1704 
  1703 
  1705                 RemoveFromAmmo;
  1704                 RopeRemoveFromAmmo(Gear, HHGear);
  1706 
  1705 
  1707                 tt := _0;
  1706                 tt := _0;
  1708                 exit
  1707                 exit
  1709                 end;
  1708                 end;
  1710             tx := tx + Gear^.dX + Gear^.dX;
  1709             tx := tx + Gear^.dX + Gear^.dX;
  1726             begin
  1725             begin
  1727             State := State and (not (gstAttacking or gstHHJumping or gstHHHJump));
  1726             State := State and (not (gstAttacking or gstHHJumping or gstHHHJump));
  1728             Message := Message and (not gmAttack)
  1727             Message := Message and (not gmAttack)
  1729             end;
  1728             end;
  1730 
  1729 
  1731         RemoveFromAmmo;
  1730         RopeRemoveFromAmmo(Gear, HHGear);
  1732 
  1731 
  1733         exit
  1732         exit
  1734         end;
  1733         end;
  1735 
  1734 
  1736     if (Gear^.Elasticity > Gear^.Friction)
  1735     if (Gear^.Elasticity > Gear^.Friction)