- Prepare for sudden death implementation
authorunc0rr
Sun, 06 Jul 2008 17:45:16 +0000
changeset 1054 80225c6af656
parent 1053 5dae89b2872d
child 1055 9af540b23409
- Prepare for sudden death implementation - Fix stats issues
hedgewars/uGears.pas
hedgewars/uMisc.pas
hedgewars/uStats.pas
--- a/hedgewars/uGears.pas	Sun Jul 06 14:09:41 2008 +0000
+++ b/hedgewars/uGears.pas	Sun Jul 06 17:45:16 2008 +0000
@@ -388,6 +388,20 @@
 	end;
 end;
 
+procedure HealthMachine;
+var Gear: PGear;
+begin
+Gear:= GearsList;
+
+while Gear <> nil do
+	begin
+	if Gear^.Kind = gtHedgehog then
+		Gear^.Damage:= min(cHealthDecrease, Gear^.Health - 1);
+
+	Gear:= Gear^.NextGear
+	end;
+end;
+
 procedure AddDamageTag(X, Y, Damage: LongWord; Gear: PGear);
 begin
 if cAltDamage then
@@ -397,13 +411,14 @@
 procedure ProcessGears;
 const delay: LongWord = 0;
       step: (stDelay, stChDmg, stTurnReact,
-             stAfterDelay, stChWin, stSpawn, stNTurn) = stDelay;
+             stAfterDelay, stChWin, stHealth, stSpawn, stNTurn) = stDelay;
+
 var Gear, t: PGear;
 begin
 PrvInactive:= AllInactive;
 AllInactive:= true;
 t:= GearsList;
-while t<>nil do
+while t <> nil do
       begin
       Gear:= t;
       t:= Gear^.NextGear;
@@ -423,7 +438,7 @@
                  end;
         stChDmg: if CheckNoDamage then inc(step) else step:= stDelay;
     stTurnReact: begin
-                 if not isInMultiShoot then
+                 if (not bBetweenTurns) and (not isInMultiShoot) then
                     begin
                     uStats.TurnReaction;
                     inc(step)
@@ -440,6 +455,15 @@
                     inc(step)
                  end;
         stChWin: if not CheckForWin then inc(step) else step:= stDelay;
+       stHealth: if (cHealthDecrease = 0)
+                   or bBetweenTurns
+                   or isInMultiShoot
+                   or (FinishedTurnsTotal = 0) then inc(step)
+                    else begin
+                    bBetweenTurns:= true;
+                    HealthMachine;
+                    step:= stChDmg
+                    end;
         stSpawn: begin
                  if not isInMultiShoot then SpawnBoxOfSmth;
                  inc(step)
@@ -448,6 +472,7 @@
                  if isInMultiShoot then isInMultiShoot:= false
                     else begin
                     ParseCommand('/nextturn', true);
+                    bBetweenTurns:= false
                     end;
                  step:= Low(step)
                  end;
--- a/hedgewars/uMisc.pas	Sun Jul 06 14:09:41 2008 +0000
+++ b/hedgewars/uMisc.pas	Sun Jul 06 17:45:16 2008 +0000
@@ -20,76 +20,80 @@
 interface
 uses uConsts, SDLh, uFloat, GL;
 {$INCLUDE options.inc}
-var isCursorVisible : boolean = false;
-    isTerminated    : boolean = false;
-    isInLag         : boolean = false;
-    isPaused        : boolean = false;
-    isSoundEnabled  : boolean = true;
-    isSEBackup      : boolean = true;
-    isInMultiShoot  : boolean = false;
-    isSpeed         : boolean = false;
+var
+	isCursorVisible : boolean = false;
+	isTerminated    : boolean = false;
+	isInLag         : boolean = false;
+	isPaused        : boolean = false;
+	isSoundEnabled  : boolean = true;
+	isSEBackup      : boolean = true;
+	isInMultiShoot  : boolean = false;
+	isSpeed         : boolean = false;
 
-    GameState     : TGameState = Low(TGameState);
-    GameType      : TGameType = gmtLocal;
-    GameFlags     : Longword = 0;
-    TurnTimeLeft  : Longword = 0;
-    cHedgehogTurnTime: Longword = 45000;
-    cMaxAIThinkTime  : Longword = 9000;
+	GameState     : TGameState = Low(TGameState);
+	GameType      : TGameType = gmtLocal;
+	GameFlags     : Longword = 0;
+	TurnTimeLeft  : Longword = 0;
+	cHedgehogTurnTime: Longword = 45000;
+	cMaxAIThinkTime  : Longword = 9000;
 
-    cCloudsNumber    : LongInt = 9;
-    cScreenWidth     : LongInt = 1024;
-    cScreenHeight    : LongInt = 768;
-    cBits            : LongInt = 16;
-    cBitsStr         : string[2] = '16';
-    cTagsMask        : byte = 7;
+	cCloudsNumber    : LongInt = 9;
+	cScreenWidth     : LongInt = 1024;
+	cScreenHeight    : LongInt = 768;
+	cBits            : LongInt = 16;
+	cBitsStr         : string[2] = '16';
+	cTagsMask        : byte = 7;
 
-    cWaterLine       : LongInt = 1024;
-    cVisibleWater    : LongInt = 128;
-    cGearScrEdgesDist: LongInt = 240;
-    cCursorEdgesDist : LongInt = 40;
-    cTeamHealthWidth : LongInt = 128;
-    cAltDamage       : boolean = true;
+	cWaterLine       : LongInt = 1024;
+	cVisibleWater    : LongInt = 128;
+	cGearScrEdgesDist: LongInt = 240;
+	cCursorEdgesDist : LongInt = 40;
+	cTeamHealthWidth : LongInt = 128;
+	cAltDamage       : boolean = true;
 
-    GameTicks     : LongWord = 0;
+	GameTicks     : LongWord = 0;
+
+	cSkyColor     : Longword = 0;
+	cWhiteColor   : Longword = $FFFFFFFF;
+	cColorNearBlack       : Longword = $FF000010;
+	cExplosionBorderColor : LongWord = $808080;
 
-    cSkyColor     : Longword = 0;
-    cWhiteColor   : Longword = $FFFFFFFF;
-    cColorNearBlack       : Longword = $FF000010;
-    cExplosionBorderColor : LongWord = $808080;
+	cShowFPS      : boolean = true;
+	cCaseFactor   : Longword = 5;  {0..9}
+	cLandAdditions: Longword = 4;
+	cFullScreen   : boolean = true;
+	cLocaleFName  : shortstring = 'en.txt';
+	cSeed         : shortstring = '';
+	cInitVolume   : LongInt = 128;
+	cVolumeDelta  : LongInt = 0;
+	cTimerInterval   : Longword = 5;
+	cHasFocus     : boolean = true;
+	cInactDelay   : Longword = 1500;
 
-    cShowFPS      : boolean = true;
-    cCaseFactor   : Longword = 5;  {0..9}
-    cLandAdditions: Longword = 4;
-    cFullScreen   : boolean = true;
-    cLocaleFName  : shortstring = 'en.txt';
-    cSeed         : shortstring = '';
-    cInitVolume   : LongInt = 128;
-    cVolumeDelta  : LongInt = 0;
-    cTimerInterval   : Longword = 5;
-    cHasFocus     : boolean = true;
-    cInactDelay   : Longword = 1500;
+	bBetweenTurns: boolean = false;
+	cHealthDecrease: LongWord = 1;
 
 {$WARNINGS OFF}
-    cAirPlaneSpeed: hwFloat = (isNegative: false; QWordValue:   6012954214); // 1.4
-    cBombsSpeed   : hwFloat = (isNegative: false; QWordValue:    429496729);
+	cAirPlaneSpeed: hwFloat = (isNegative: false; QWordValue:   6012954214); // 1.4
+	cBombsSpeed   : hwFloat = (isNegative: false; QWordValue:    429496729);
 {$WARNINGS ON}
 
 var
-    cSendEmptyPacketTime : LongWord = 2000;
-    cSendCursorPosTime   : LongWord = 50;
-    ShowCrosshair  : boolean;
-    cDrownSpeed,
-    cMaxWindSpeed,
-    cWindSpeed,
-    cGravity: hwFloat;
+	cSendEmptyPacketTime : LongWord = 2000;
+	cSendCursorPosTime   : LongWord = 50;
+	ShowCrosshair  : boolean;
+	cDrownSpeed,
+	cMaxWindSpeed,
+	cWindSpeed,
+	cGravity: hwFloat;
 
-    flagMakeCapture: boolean = false;
+	flagMakeCapture: boolean = false;
 
-    InitStepsFlags: Longword = 0;
+	InitStepsFlags: Longword = 0;
 
-    RealTicks: Longword = 0;
+	RealTicks: Longword = 0;
 
-    AttackBar: LongInt = 0; // 0 - none, 1 - just bar at the right-down corner, 2 - like in WWP
+	AttackBar: LongInt = 0; // 0 - none, 1 - just bar at the right-down corner, 2 - like in WWP
 
 function hwSign(r: hwFloat): LongInt;
 function Min(a, b: LongInt): LongInt;
--- a/hedgewars/uStats.pas	Sun Jul 06 14:09:41 2008 +0000
+++ b/hedgewars/uStats.pas	Sun Jul 06 17:45:16 2008 +0000
@@ -38,6 +38,8 @@
 procedure TurnReaction;
 procedure SendStats;
 
+var FinishedTurnsTotal: LongInt = -1;
+
 implementation
 uses uTeams, uSound, uMisc;
 var DamageGiven : Longword = 0;
@@ -48,12 +50,13 @@
     KillsTotal  : LongWord = 0;
     AmmoUsedCount : Longword = 0;
     AmmoDamagingUsed : boolean = false;
-    FinishedTurnsTotal: LongInt = -1;
     SkippedTurns: LongWord = 0;
     isTurnSkipped: boolean = false;
 
 procedure HedgehogDamaged(Gear: PGear);
 begin
+if bBetweenTurns then exit;
+
 if Gear <> CurrentHedgehog^.Gear then
 	inc(CurrentHedgehog^.stats.StepDamageGiven, Gear^.Damage);
 
@@ -81,6 +84,8 @@
 procedure TurnReaction;
 var i, t: LongInt;
 begin
+TryDo(not bBetweenTurns, 'Engine bug: TurnReaction between turns', true);
+
 inc(FinishedTurnsTotal);
 if FinishedTurnsTotal = 0 then exit;
 
@@ -112,7 +117,7 @@
 
 else if AmmoDamagingUsed then
 	PlaySound(sndMissed, false)
-else if AmmoUsedCount > 0 then
+else if (AmmoUsedCount > 0) and not isTurnSkipped then
 	// nothing ?
 else if isTurnSkipped then
 	PlaySound(sndBoring, false)