hedgewars/GSHandlers.inc
changeset 1103 1ff3db3c12af
parent 1090 c4ff49d0fe9b
child 1106 f868b7307003
equal deleted inserted replaced
1102:87f083365e44 1103:1ff3db3c12af
  1479 Gear^.Timer:= 550;
  1479 Gear^.Timer:= 550;
  1480 
  1480 
  1481 Gear^.doStep:= @doStepKamikazeIdle
  1481 Gear^.doStep:= @doStepKamikazeIdle
  1482 end;
  1482 end;
  1483 
  1483 
       
  1484 ////////////////////////////////////////////////////////////////////////////////
       
  1485 const cakeh = 27;
       
  1486 var CakePoints: array[0..Pred(cakeh)] of record x, y: hwFloat; end;
       
  1487 	CakeI: Longword;
       
  1488 
  1484 procedure doStepCakeWork(Gear: PGear);
  1489 procedure doStepCakeWork(Gear: PGear);
  1485 const dirs: array[0..3] of TPoint = ((x: 0; y: -1), (x: 1; y: 0),(x: 0; y: 1),(x: -1; y: 0));
  1490 const dirs: array[0..3] of TPoint = ((x: 0; y: -1), (x: 1; y: 0),(x: 0; y: 1),(x: -1; y: 0));
  1486 var xx, yy, xxn, yyn: LongInt;
  1491 var xx, yy, xxn, yyn: LongInt;
  1487 	da: LongInt;
  1492 	da: LongInt;
       
  1493 	tdx, tdy: hwFloat;
  1488 
  1494 
  1489 	procedure PrevAngle;
  1495 	procedure PrevAngle;
  1490 	begin
  1496 	begin
  1491 	Gear^.Angle:= (Gear^.Angle + 4 - dA) mod 4
  1497 	Gear^.Angle:= (Gear^.Angle + 4 - dA) mod 4
  1492 	end;
  1498 	end;
  1497 	end;
  1503 	end;
  1498 	
  1504 	
  1499 begin
  1505 begin
  1500 inc(Gear^.Tag);
  1506 inc(Gear^.Tag);
  1501 if Gear^.Tag < 5 then exit;
  1507 if Gear^.Tag < 5 then exit;
  1502 
       
  1503 
  1508 
  1504 dA:= hwSign(Gear^.dX);
  1509 dA:= hwSign(Gear^.dX);
  1505 xx:= dirs[Gear^.Angle].x;
  1510 xx:= dirs[Gear^.Angle].x;
  1506 yy:= dirs[Gear^.Angle].y;
  1511 yy:= dirs[Gear^.Angle].y;
  1507 xxn:= dirs[(Gear^.Angle + 4 + dA) mod 4].x;
  1512 xxn:= dirs[(Gear^.Angle + 4 + dA) mod 4].x;
  1524 		Gear^.Tag:= 0;
  1529 		Gear^.Tag:= 0;
  1525 		Gear^.X:= Gear^.X + int2hwFloat(xx);
  1530 		Gear^.X:= Gear^.X + int2hwFloat(xx);
  1526 		if not TestCollisionYwithGear(Gear, yyn) then NextAngle
  1531 		if not TestCollisionYwithGear(Gear, yyn) then NextAngle
  1527 		end;
  1532 		end;
  1528 
  1533 
       
  1534 if Gear^.Tag = 0 then
       
  1535 	begin
       
  1536 	CakeI:= (CakeI + 1) mod cakeh;
       
  1537 	tdx:= CakePoints[CakeI].x - Gear^.X;
       
  1538 	tdy:= - CakePoints[CakeI].y + Gear^.Y;
       
  1539 	CakePoints[CakeI].x:= Gear^.X;
       
  1540 	CakePoints[CakeI].y:= Gear^.Y;
       
  1541 	Gear^.DirAngle:= DxDy2Angle(tdx, tdy);
       
  1542 	end;
       
  1543 
  1529 dec(Gear^.Health);
  1544 dec(Gear^.Health);
  1530 if (Gear^.Health = 0) or ((Gear^.Message and gm_Attack) <> 0) then
  1545 if (Gear^.Health = 0) or ((Gear^.Message and gm_Attack) <> 0) then
  1531 	begin
  1546 	begin
  1532 	doMakeExplosion(hwRound(Gear^.X), hwRound(Gear^.Y), 75, EXPLAutoSound);
  1547 	doMakeExplosion(hwRound(Gear^.X), hwRound(Gear^.Y), 75, EXPLAutoSound);
  1533 	AfterAttack;
  1548 	AfterAttack;
  1534 	DeleteGear(Gear)
  1549 	DeleteGear(Gear)
  1535 	end
  1550 	end
  1536 end;
  1551 end;
  1537 
  1552 
       
  1553 procedure doStepCakeUp(Gear: PGear);
       
  1554 var i: Longword;
       
  1555 begin
       
  1556 AllInactive:= false;
       
  1557 
       
  1558 	begin
       
  1559 	for i:= 0 to Pred(cakeh) do
       
  1560 		begin
       
  1561 		CakePoints[i].x:= Gear^.X;
       
  1562 		CakePoints[i].y:= Gear^.Y
       
  1563 		end;
       
  1564 	CakeI:= 0;
       
  1565 	Gear^.doStep:= @doStepCakeWork
       
  1566 	end
       
  1567 end;
       
  1568 
  1538 procedure doStepCakeFall(Gear: PGear);
  1569 procedure doStepCakeFall(Gear: PGear);
  1539 begin
  1570 begin
  1540 AllInactive:= false;
  1571 AllInactive:= false;
  1541 
  1572 
  1542 Gear^.dY:= Gear^.dY + cGravity;
  1573 Gear^.dY:= Gear^.dY + cGravity;
  1543 if TestCollisionYwithGear(Gear, 1) then
  1574 if TestCollisionYwithGear(Gear, 1) then
  1544 	Gear^.doStep:= @doStepCakeWork
  1575 	Gear^.doStep:= @doStepCakeUp
  1545 else
  1576 else
  1546 	begin
  1577 	begin
  1547 	Gear^.Y:= Gear^.Y + Gear^.dY;
  1578 	Gear^.Y:= Gear^.Y + Gear^.dY;
  1548 	if CheckGearDrowning(Gear) then AfterAttack
  1579 	if CheckGearDrowning(Gear) then AfterAttack
  1549 	end
  1580 	end
  1553 var HHGear: PGear;
  1584 var HHGear: PGear;
  1554 begin
  1585 begin
  1555 AllInactive:= false;
  1586 AllInactive:= false;
  1556 
  1587 
  1557 HHGear:= PHedgehog(Gear^.Hedgehog)^.Gear;
  1588 HHGear:= PHedgehog(Gear^.Hedgehog)^.Gear;
       
  1589 HHGear^.Message:= HHGear^.Message and (not gm_Attack);
  1558 DeleteCI(HHGear);
  1590 DeleteCI(HHGear);
  1559 
  1591 
  1560 Gear^.doStep:= @doStepCakeFall
  1592 Gear^.doStep:= @doStepCakeFall
  1561 end;
  1593 end;
  1562 
  1594