hedgewars/GSHandlers.inc
changeset 3714 c407f00d2851
parent 3713 f8778904600d
child 3717 d88719b0f0dc
equal deleted inserted replaced
3713:f8778904600d 3714:c407f00d2851
  1439     else // gsttmpFlag = 0
  1439     else // gsttmpFlag = 0
  1440         if TurnTimeLeft = 0 then Gear^.State := Gear^.State or gsttmpFlag;
  1440         if TurnTimeLeft = 0 then Gear^.State := Gear^.State or gsttmpFlag;
  1441 end;
  1441 end;
  1442 
  1442 
  1443 ////////////////////////////////////////////////////////////////////////////////
  1443 ////////////////////////////////////////////////////////////////////////////////
  1444 procedure doStepSMine(Gear: PGear); forward;
  1444 procedure doStepSMine(Gear: PGear);
  1445 procedure doStepSMineSticked(Gear: PGear);
  1445 begin
  1446 begin
  1446     DeleteCI(Gear);
  1447     if (hwAbs(Gear^.dX) > _0) or (hwAbs(Gear^.dY) > _0) then // moving - "unstick" (better solution?)
  1447     // TODO: do real calculation?
  1448     begin
  1448     if TestCollisionXwithGear(Gear, 2) and TestCollisionYwithGear(Gear, -2) then
  1449         Gear^.doStep:= @doStepSMine;
  1449     begin
  1450         Gear^.doStep(Gear);
  1450         Gear^.dX:= _0;
  1451         exit;
  1451         Gear^.dY:= _0;
  1452     end;
  1452         Gear^.DirAngle:= 225
       
  1453     end
       
  1454     else if TestCollisionXwithGear(Gear, -2) and TestCollisionYwithGear(Gear, -2) then
       
  1455     begin
       
  1456         Gear^.dX:= _0;
       
  1457         Gear^.dY:= _0;
       
  1458         Gear^.DirAngle:= 135
       
  1459     end
       
  1460     else if TestCollisionXwithGear(Gear, 2) and TestCollisionYwithGear(Gear, 2) then
       
  1461     begin
       
  1462         Gear^.dX:= _0;
       
  1463         Gear^.dY:= _0;
       
  1464         Gear^.DirAngle:= 315
       
  1465     end
       
  1466     else if TestCollisionXwithGear(Gear, -2) and TestCollisionYwithGear(Gear, 2) then
       
  1467     begin
       
  1468         Gear^.dX:= _0;
       
  1469         Gear^.dY:= _0;
       
  1470         Gear^.DirAngle:= 45
       
  1471     end
       
  1472     else if TestCollisionYwithGear(Gear, -2) then
       
  1473     begin
       
  1474         Gear^.dX:= _0;
       
  1475         Gear^.dY:= _0;
       
  1476         Gear^.DirAngle:= 180
       
  1477     end
       
  1478     else if TestCollisionYwithGear(Gear, 2) then
       
  1479     begin
       
  1480         Gear^.dX:= _0;
       
  1481         Gear^.dY:= _0;
       
  1482         Gear^.DirAngle:= 0
       
  1483     end
       
  1484     else if TestCollisionXwithGear(Gear, -2) then
       
  1485     begin
       
  1486         Gear^.dX:= _0;
       
  1487         Gear^.dY:= _0;
       
  1488         Gear^.DirAngle:= 90
       
  1489     end
       
  1490     else if TestCollisionXwithGear(Gear, 2) then
       
  1491     begin
       
  1492         Gear^.dX:= _0;
       
  1493         Gear^.dY:= _0;
       
  1494         Gear^.DirAngle:= 270
       
  1495     end
       
  1496     else
       
  1497     begin
       
  1498         doStepFallingGear(Gear);
       
  1499         AllInactive := false;
       
  1500         CalcRotationDirAngle(Gear);
       
  1501     end;
       
  1502     AddGearCI(Gear);
       
  1503 
  1453     if ((Gear^.State and gsttmpFlag) <> 0) and (Gear^.Health <> 0) then
  1504     if ((Gear^.State and gsttmpFlag) <> 0) and (Gear^.Health <> 0) then
  1454         if ((Gear^.State and gstAttacking) = 0) then
  1505         if ((Gear^.State and gstAttacking) = 0) then
  1455         begin
  1506         begin
  1456             if ((GameTicks and $1F) = 0) then
  1507             if ((GameTicks and $1F) = 0) then
  1457                 if CheckGearNear(Gear, gtHedgehog, 46, 32) <> nil then Gear^.State := Gear^.State or
  1508                 if CheckGearNear(Gear, gtHedgehog, 46, 32) <> nil then Gear^.State := Gear^.State or
  1469         end;
  1520         end;
  1470         dec(Gear^.Timer);
  1521         dec(Gear^.Timer);
  1471     end
  1522     end
  1472     else // gsttmpFlag = 0
  1523     else // gsttmpFlag = 0
  1473         if TurnTimeLeft = 0 then Gear^.State := Gear^.State or gsttmpFlag;
  1524         if TurnTimeLeft = 0 then Gear^.State := Gear^.State or gsttmpFlag;
  1474 end;
       
  1475 
       
  1476 procedure doStepSMine(Gear: PGear);
       
  1477 begin
       
  1478     if ((Gear^.State and gstCollision) <> 0) and (Gear^.dX < _0_2) and (Gear^.dY < _0_2) then
       
  1479     begin
       
  1480         Gear^.dX:= _0;
       
  1481         Gear^.dY:= _0;
       
  1482         Gear^.doStep:= @doStepSMineSticked;
       
  1483         Gear^.doStep(Gear);
       
  1484         exit
       
  1485     end;
       
  1486     if (Gear^.State and gstMoving) <> 0 then
       
  1487     begin
       
  1488         DeleteCI(Gear);
       
  1489         doStepFallingGear(Gear);
       
  1490         if (Gear^.State and gstMoving) = 0 then
       
  1491             AddGearCI(Gear);
       
  1492     end;
       
  1493     CalcRotationDirAngle(Gear);
       
  1494     AllInactive := false
       
  1495 end;
  1525 end;
  1496 
  1526 
  1497 ////////////////////////////////////////////////////////////////////////////////
  1527 ////////////////////////////////////////////////////////////////////////////////
  1498 procedure doStepDynamite(Gear: PGear);
  1528 procedure doStepDynamite(Gear: PGear);
  1499 begin
  1529 begin