hedgewars/GSHandlers.inc
changeset 1528 3fee15104c1d
parent 1507 d18c67b7ad4c
child 1545 76b90ff9739a
equal deleted inserted replaced
1527:4a610e970b66 1528:3fee15104c1d
   540 ////////////////////////////////////////////////////////////////////////////////
   540 ////////////////////////////////////////////////////////////////////////////////
   541 var BTPrevAngle, BTSteps: LongInt;
   541 var BTPrevAngle, BTSteps: LongInt;
   542 
   542 
   543 procedure doStepBlowTorchWork(Gear: PGear);
   543 procedure doStepBlowTorchWork(Gear: PGear);
   544 var HHGear: PGear;
   544 var HHGear: PGear;
   545     b: boolean;
   545 	b: boolean;
       
   546 	prevX: LongInt;
   546 begin
   547 begin
   547 AllInactive:= false;
   548 AllInactive:= false;
   548 dec(Gear^.Timer);
   549 dec(Gear^.Timer);
   549 HHGear:= PHedgehog(Gear^.Hedgehog)^.Gear;
   550 HHGear:= PHedgehog(Gear^.Hedgehog)^.Gear;
   550 
   551 
   551 HedgehogChAngle(HHGear);
   552 HedgehogChAngle(HHGear);
   552 
   553 
   553 b:= false;
   554 b:= false;
   554 
   555 
   555 if abs(LongInt(HHGear^.Angle) - BTPrevAngle) > 7  then
   556 if abs(LongInt(HHGear^.Angle) - BTPrevAngle) > 7  then
   556    begin
   557 	begin
   557    Gear^.dX:= SignAs(AngleSin(HHGear^.Angle) * _0_5, HHGear^.dX);
   558 	Gear^.dX:= SignAs(AngleSin(HHGear^.Angle) * _0_5, HHGear^.dX);
   558    Gear^.dY:= AngleCos(HHGear^.Angle) * ( - _0_5);
   559 	Gear^.dY:= AngleCos(HHGear^.Angle) * ( - _0_5);
   559    BTPrevAngle:= HHGear^.Angle;
   560 	BTPrevAngle:= HHGear^.Angle;
   560    b:= true
   561 	b:= true
   561    end;
   562 	end;
       
   563 
       
   564 if ((HHGear^.State and gstMoving) <> 0) then
       
   565 	begin
       
   566 	doStepHedgehogMoving(HHGear);
       
   567 	if (HHGear^.Damage > 0) then Gear^.Timer:= 0
       
   568 	end;
   562 
   569 
   563 if Gear^.Timer mod cHHStepTicks = 0 then
   570 if Gear^.Timer mod cHHStepTicks = 0 then
   564    begin
   571 	begin
   565    b:= true;
   572 	b:= true;
   566    if Gear^.dX.isNegative then HHGear^.Message:= (HHGear^.Message or gm_Left) and not gm_Right
   573 	if Gear^.dX.isNegative then
   567                           else HHGear^.Message:= (HHGear^.Message or gm_Right) and not gm_Left;
   574 		HHGear^.Message:= (HHGear^.Message or gm_Left) and not gm_Right
   568 
   575 	else
   569    HHGear^.State:= HHGear^.State and not gstAttacking;
   576 		HHGear^.Message:= (HHGear^.Message or gm_Right) and not gm_Left;
   570    HedgehogStep(HHGear);
   577 
   571    HHGear^.State:= HHGear^.State or gstAttacking;
   578 	if ((HHGear^.State and gstMoving) = 0) then
   572 
   579 		begin
   573    inc(BTSteps);
   580 		HHGear^.State:= HHGear^.State and not gstAttacking;
   574    if BTSteps = 7 then
   581 		prevX:= hwRound(HHGear^.X);
   575       begin
   582 		
   576       BTSteps:= 0;
   583 		HedgehogStep(HHGear);
   577       Gear^.X:= HHGear^.X + Gear^.dX * (cHHRadius + cBlowTorchC);
   584 		
   578       Gear^.Y:= HHGear^.Y + Gear^.dY * (cHHRadius + cBlowTorchC);
   585 		if (prevX = hwRound(HHGear^.X)) then HHGear^.X:= HHGear^.X + SignAs(_1, HHGear^.dX);
   579       HHGear^.State:= HHGear^.State or gstNoDamage;
   586 		HHGear^.State:= HHGear^.State or gstAttacking
   580       AmmoShove(Gear, 2, 10);
   587 		end;
   581       HHGear^.State:= HHGear^.State and not gstNoDamage
   588 
   582       end;
   589 	inc(BTSteps);
   583 
   590 	if BTSteps = 7 then
   584    if (HHGear^.State and gstMoving) <> 0 then Gear^.Timer:= 0
   591 		begin
   585    end;
   592 		BTSteps:= 0;
       
   593 		Gear^.X:= HHGear^.X + Gear^.dX * (cHHRadius + cBlowTorchC);
       
   594 		Gear^.Y:= HHGear^.Y + Gear^.dY * (cHHRadius + cBlowTorchC);
       
   595 		HHGear^.State:= HHGear^.State or gstNoDamage;
       
   596 		AmmoShove(Gear, 2, 10);
       
   597 		HHGear^.State:= HHGear^.State and not gstNoDamage
       
   598 		end;
       
   599 	end;
   586 
   600 
   587 if b then
   601 if b then
   588    DrawTunnel(HHGear^.X - Gear^.dX * cHHRadius, HHGear^.Y - _4 - Gear^.dY * cHHRadius + hwAbs(Gear^.dY) * 7,
   602    DrawTunnel(HHGear^.X - Gear^.dX * cHHRadius, HHGear^.Y - _4 - Gear^.dY * cHHRadius + hwAbs(Gear^.dY) * 7,
   589               Gear^.dX, Gear^.dY,
   603               Gear^.dX, Gear^.dY,
   590               cHHRadius * 5, cHHRadius * 2 + 7);
   604               cHHRadius * 5, cHHRadius * 2 + 7);
   591 
   605 
   592 if (Gear^.Timer = 0) or ((HHGear^.Message and gm_Attack) <> 0) then
   606 if (Gear^.Timer = 0) or ((HHGear^.Message and gm_Attack) <> 0) then
   593    begin
   607 	begin
   594    HHGear^.Message:= 0;
   608 	HHGear^.Message:= 0;
   595    DeleteGear(Gear);
   609 	HHGear^.State:= HHGear^.State and (not gstNotKickable);
   596    AfterAttack
   610 	DeleteGear(Gear);
   597    end
   611 	AfterAttack
       
   612 	end
   598 end;
   613 end;
   599 
   614 
   600 procedure doStepBlowTorch(Gear: PGear);
   615 procedure doStepBlowTorch(Gear: PGear);
   601 var HHGear: PGear;
   616 var HHGear: PGear;
   602 begin
   617 begin
   603 BTPrevAngle:= High(LongInt);
   618 BTPrevAngle:= High(LongInt);
   604 BTSteps:= 0;
   619 BTSteps:= 0;
   605 HHGear:= PHedgehog(Gear^.Hedgehog)^.Gear;
   620 HHGear:= PHedgehog(Gear^.Hedgehog)^.Gear;
   606 HHGear^.Message:= 0;
   621 HHGear^.Message:= 0;
       
   622 HHGear^.State:= HHGear^.State or gstNotKickable;
   607 Gear^.doStep:= @doStepBlowTorchWork
   623 Gear^.doStep:= @doStepBlowTorchWork
   608 end;
   624 end;
   609 
   625 
   610 ////////////////////////////////////////////////////////////////////////////////
   626 ////////////////////////////////////////////////////////////////////////////////
   611 
   627 
  1109 		exit
  1125 		exit
  1110 		end
  1126 		end
  1111 	end else begin
  1127 	end else begin
  1112 	if Gear^.Timer > 0 then dec(Gear^.Timer)
  1128 	if Gear^.Timer > 0 then dec(Gear^.Timer)
  1113 		else begin
  1129 		else begin
  1114 		Gear^.Radius:= 5;
  1130 		Gear^.Radius:= 7;
  1115 		AmmoShove(Gear, 3, 100);
  1131 		AmmoShove(Gear, 3, 100);
  1116 		Gear^.Radius:= 1;
  1132 		Gear^.Radius:= 1;
  1117 		doMakeExplosion(hwRound(Gear^.X), hwRound(Gear^.Y), 4, EXPLNoDamage);
  1133 		doMakeExplosion(hwRound(Gear^.X), hwRound(Gear^.Y), 4, EXPLNoDamage);
  1118 		dec(Gear^.Health);
  1134 		dec(Gear^.Health);
  1119 		Gear^.Timer:= 1250 - Gear^.Tag * 12
  1135 		Gear^.Timer:= 1250 - Gear^.Tag * 12