hedgewars/uGears.pas
changeset 1849 2a989e5abda6
parent 1797 fedd8649fdd9
child 1854 6e05013899b2
equal deleted inserted replaced
1848:1eb88d41ccc6 1849:2a989e5abda6
    26 type PGear = ^TGear;
    26 type PGear = ^TGear;
    27 	TGearStepProcedure = procedure (Gear: PGear);
    27 	TGearStepProcedure = procedure (Gear: PGear);
    28 	TGear = record
    28 	TGear = record
    29 			NextGear, PrevGear: PGear;
    29 			NextGear, PrevGear: PGear;
    30 			Active: Boolean;
    30 			Active: Boolean;
       
    31 			Invulnerable: Boolean;
    31 			Ammo : PAmmo;
    32 			Ammo : PAmmo;
    32 			State : Longword;
    33 			State : Longword;
    33 			X : hwFloat;
    34 			X : hwFloat;
    34 			Y : hwFloat;
    35 			Y : hwFloat;
    35 			dX: hwFloat;
    36 			dX: hwFloat;
    55 			uid: Longword;
    56 			uid: Longword;
    56 			end;
    57 			end;
    57 
    58 
    58 function  AddGear(X, Y: LongInt; Kind: TGearType; State: Longword; dX, dY: hwFloat; Timer: LongWord): PGear;
    59 function  AddGear(X, Y: LongInt; Kind: TGearType; State: Longword; dX, dY: hwFloat; Timer: LongWord): PGear;
    59 procedure ProcessGears;
    60 procedure ProcessGears;
       
    61 procedure ResetUtilities;
    60 procedure SetAllToActive;
    62 procedure SetAllToActive;
    61 procedure SetAllHHToActive;
    63 procedure SetAllHHToActive;
    62 procedure DrawGears;
    64 procedure DrawGears;
    63 procedure FreeGearsList;
    65 procedure FreeGearsList;
    64 procedure AddMiscGears;
    66 procedure AddMiscGears;
   419 Dispose(Gear)
   421 Dispose(Gear)
   420 end;
   422 end;
   421 
   423 
   422 function CheckNoDamage: boolean; // returns TRUE in case of no damaged hhs
   424 function CheckNoDamage: boolean; // returns TRUE in case of no damaged hhs
   423 var Gear: PGear;
   425 var Gear: PGear;
       
   426     dmg: LongInt;
   424 begin
   427 begin
   425 CheckNoDamage:= true;
   428 CheckNoDamage:= true;
   426 Gear:= GearsList;
   429 Gear:= GearsList;
   427 while Gear <> nil do
   430 while Gear <> nil do
   428 	begin
   431 	begin
   429 	if Gear^.Kind = gtHedgehog then
   432 	if Gear^.Kind = gtHedgehog then
   430 		if Gear^.Damage <> 0 then
   433         begin
   431 		begin
   434 		if (Gear^.Damage <> 0) and
   432 		CheckNoDamage:= false;
   435 		(not Gear^.Invulnerable) then
   433 		uStats.HedgehogDamaged(Gear);
   436 		    begin
   434 
   437             CheckNoDamage:= false;
   435 		if Gear^.Health < Gear^.Damage then
   438             uStats.HedgehogDamaged(Gear);
   436 			Gear^.Health:= 0
   439             dmg:= HwRound(int2HwFloat(Gear^.Damage) * cDamageModifier);
   437 		else
   440             if Gear^.Health < dmg then
   438 			dec(Gear^.Health, Gear^.Damage);
   441                 Gear^.Health:= 0
   439 
   442             else
   440 		AddGear(hwRound(Gear^.X), hwRound(Gear^.Y) - cHHRadius - 12,
   443                 dec(Gear^.Health, dmg);
   441 				gtHealthTag, Gear^.Damage, _0, _0, 0)^.Hedgehog:= Gear^.Hedgehog;
   444 
   442 
   445             AddGear(hwRound(Gear^.X), hwRound(Gear^.Y) - cHHRadius - 12,
   443 		RenderHealth(PHedgehog(Gear^.Hedgehog)^);
   446                     gtHealthTag, dmg, _0, _0, 0)^.Hedgehog:= Gear^.Hedgehog;
   444 		RecountTeamHealth(PHedgehog(Gear^.Hedgehog)^.Team);
   447 
   445 
   448             RenderHealth(PHedgehog(Gear^.Hedgehog)^);
   446 		Gear^.Damage:= 0
   449             RecountTeamHealth(PHedgehog(Gear^.Hedgehog)^.Team);
   447 		end;
   450 
       
   451 		    end;
       
   452 	    Gear^.Damage:= 0;
       
   453         end;
   448 	Gear:= Gear^.NextGear
   454 	Gear:= Gear^.NextGear
   449 	end;
   455 	end;
   450 end;
   456 end;
   451 
   457 
   452 procedure HealthMachine;
   458 procedure HealthMachine;
   555 			inc(step)
   561 			inc(step)
   556 			end;
   562 			end;
   557 	stNTurn: begin
   563 	stNTurn: begin
   558 			if isInMultiShoot then isInMultiShoot:= false
   564 			if isInMultiShoot then isInMultiShoot:= false
   559 			else begin
   565 			else begin
       
   566             ResetUtilities;
   560 			ParseCommand('/nextturn', true);
   567 			ParseCommand('/nextturn', true);
   561 			SwitchHedgehog;
   568 			SwitchHedgehog;
   562 
   569 
   563 			inc(step);
   570 			inc(step);
   564 
   571 
   587 	SendIPCTimeInc;
   594 	SendIPCTimeInc;
   588 	inc(hiTicks) // we do not recieve a message for this
   595 	inc(hiTicks) // we do not recieve a message for this
   589 	end;
   596 	end;
   590 
   597 
   591 inc(GameTicks)
   598 inc(GameTicks)
       
   599 end;
       
   600 
       
   601 (* Purpose, to reset all transient attributes toggled by a utility.  Right now that is just Low Gravity and Extra Damage and Invulnerability.
       
   602 Other possibilities include: Laser Sight... more?
       
   603 *)
       
   604 procedure ResetUtilities;
       
   605 begin
       
   606     cGravity:= cMaxWindSpeed;
       
   607     cDamageModifier:= _1;
       
   608     if (CurrentHedgehog^.Gear <> nil) then
       
   609         CurrentHedgehog^.Gear^.Invulnerable:= false;
   592 end;
   610 end;
   593 
   611 
   594 procedure SetAllToActive;
   612 procedure SetAllToActive;
   595 var t: PGear;
   613 var t: PGear;
   596 begin
   614 begin
  1221 				gtTarget,
  1239 				gtTarget,
  1222 				gtFlame: begin
  1240 				gtFlame: begin
  1223 						//{$IFDEF DEBUGFILE}AddFileLog('Damage: ' + inttostr(dmg));{$ENDIF}
  1241 						//{$IFDEF DEBUGFILE}AddFileLog('Damage: ' + inttostr(dmg));{$ENDIF}
  1224 						if (Mask and EXPLNoDamage) = 0 then
  1242 						if (Mask and EXPLNoDamage) = 0 then
  1225 							begin
  1243 							begin
  1226 							inc(Gear^.Damage, dmg);
  1244                             if not Gear^.Invulnerable then
       
  1245 							   inc(Gear^.Damage, dmg);
  1227 							if Gear^.Kind = gtHedgehog then
  1246 							if Gear^.Kind = gtHedgehog then
  1228 								AddDamageTag(hwRound(Gear^.X), hwRound(Gear^.Y), dmg, PHedgehog(Gear^.Hedgehog)^.Team^.Clan^.Color)
  1247 								AddDamageTag(hwRound(Gear^.X), hwRound(Gear^.Y), dmg, PHedgehog(Gear^.Hedgehog)^.Team^.Clan^.Color)
  1229 							end;
  1248 							end;
  1230 						if ((Mask and EXPLDoNotTouchHH) = 0) or (Gear^.Kind <> gtHedgehog) then
  1249 						if ((Mask and EXPLDoNotTouchHH) = 0) or (Gear^.Kind <> gtHedgehog) then
  1231 							begin
  1250 							begin
  1265 	case t^.Kind of
  1284 	case t^.Kind of
  1266 		gtHedgehog,
  1285 		gtHedgehog,
  1267 			gtMine,
  1286 			gtMine,
  1268 			gtCase,
  1287 			gtCase,
  1269 			gtTarget: begin
  1288 			gtTarget: begin
  1270 					inc(t^.Damage, dmg);
  1289                     if (not Gear^.Invulnerable) then
       
  1290 					    inc(t^.Damage, dmg);
  1271 
  1291 
  1272 					if t^.Kind = gtHedgehog then
  1292 					if t^.Kind = gtHedgehog then
  1273 						AddDamageTag(hwRound(Gear^.X), hwRound(Gear^.Y), dmg, PHedgehog(t^.Hedgehog)^.Team^.Clan^.Color);
  1293 						AddDamageTag(hwRound(Gear^.X), hwRound(Gear^.Y), dmg, PHedgehog(t^.Hedgehog)^.Team^.Clan^.Color);
  1274 
  1294 
  1275 					DeleteCI(t);
  1295 					DeleteCI(t);