DEADSOFTWARE

center player when the game is scaled (lighting is not working correctly yet, tho)
[d2df-sdl.git] / src / game / g_player.pas
index 1c01e2f032ae7750f7531d20322c569baac24623..98535cc9ef2f36220f98ba05b4cbb0a401598cac 100644 (file)
@@ -318,9 +318,10 @@ type
     procedure   CatchFire(Attacker: Word);
 
     //WARNING! this does nothing for now, but still call it!
-    procedure positionChanged (); //WARNING! call this after monster position was changed, or coldet will not work right!
+    procedure positionChanged (); //WARNING! call this after entity position was changed, or coldet will not work right!
 
     procedure getMapBox (out x, y, w, h: Integer); inline;
+    procedure moveBy (dx, dy: Integer); inline;
 
   public
     property    Vel: TPoint2i read FObj.Vel;
@@ -413,6 +414,7 @@ type
     procedure   LoadState(var Mem: TBinMemoryReader); override;
   end;
 
+  PGib = ^TGib;
   TGib = record
     alive:     Boolean;
     ID:       DWORD;
@@ -421,10 +423,14 @@ type
     Color:    TRGB;
     Obj:      TObj;
 
-    procedure positionChanged (); //WARNING! call this after monster position was changed, or coldet will not work right!
+    procedure getMapBox (out x, y, w, h: Integer); inline;
+    procedure moveBy (dx, dy: Integer); inline;
+
+    procedure positionChanged (); inline; //WARNING! call this after entity position was changed, or coldet will not work right!
   end;
 
 
+  PShell = ^TShell;
   TShell = record
     SpriteID: DWORD;
     alive:     Boolean;
@@ -434,7 +440,10 @@ type
     CX, CY:   Integer;
     Obj:      TObj;
 
-    procedure positionChanged (); //WARNING! call this after monster position was changed, or coldet will not work right!
+    procedure getMapBox (out x, y, w, h: Integer); inline;
+    procedure moveBy (dx, dy: Integer); inline;
+
+    procedure positionChanged ();  inline; //WARNING! call this after entity position was changed, or coldet will not work right!
   end;
 
   TCorpse = class (TObject)
@@ -457,9 +466,14 @@ type
     procedure   SaveState(var Mem: TBinMemoryWriter);
     procedure   LoadState(var Mem: TBinMemoryReader);
 
-    procedure positionChanged (); //WARNING! call this after monster position was changed, or coldet will not work right!
+    procedure getMapBox (out x, y, w, h: Integer); inline;
+    procedure moveBy (dx, dy: Integer); inline;
 
-    property    Obj: TObj read FObj;
+    procedure positionChanged ();  inline; //WARNING! call this after entity position was changed, or coldet will not work right!
+
+    function ObjPtr (): PObj; inline;
+
+    property    Obj: TObj read FObj; // copies object
     property    State: Byte read FState;
     property    Mess: Boolean read FMess;
   end;
@@ -616,10 +630,6 @@ var
   BotList: Array of TBotProfile;
 
 
-procedure TGib.positionChanged (); begin end;
-procedure TShell.positionChanged (); begin end;
-
-
 function Lerp(X, Y, Factor: Integer): Integer;
 begin
   Result := X + ((Y - X) div Factor);
@@ -1712,6 +1722,49 @@ begin
         end;
 end;
 
+
+procedure TGib.getMapBox (out x, y, w, h: Integer); inline;
+begin
+  x := Obj.X+Obj.Rect.X;
+  y := Obj.Y+Obj.Rect.Y;
+  w := Obj.Rect.Width;
+  h := Obj.Rect.Height;
+end;
+
+procedure TGib.moveBy (dx, dy: Integer); inline;
+begin
+  if (dx <> 0) or (dy <> 0) then
+  begin
+    Obj.X += dx;
+    Obj.Y += dy;
+    positionChanged();
+  end;
+end;
+
+
+procedure TShell.getMapBox (out x, y, w, h: Integer); inline;
+begin
+  x := Obj.X;
+  y := Obj.Y;
+  w := Obj.Rect.Width;
+  h := Obj.Rect.Height;
+end;
+
+procedure TShell.moveBy (dx, dy: Integer); inline;
+begin
+  if (dx <> 0) or (dy <> 0) then
+  begin
+    Obj.X += dx;
+    Obj.Y += dy;
+    positionChanged();
+  end;
+end;
+
+
+procedure TGib.positionChanged (); inline; begin end;
+procedure TShell.positionChanged (); inline; begin end;
+
+
 procedure g_Player_DrawCorpses();
 var
   i: Integer;
@@ -2046,7 +2099,7 @@ begin
   resetWeaponQueue();
 end;
 
-procedure TPlayer.positionChanged ();
+procedure TPlayer.positionChanged (); inline;
 begin
 end;
 
@@ -3169,7 +3222,7 @@ begin
         if mon = nil then
           s := '?'
         else
-          s := g_Monsters_GetKilledBy(mon.MonsterType);
+          s := g_Mons_GetKilledByTypeId(mon.MonsterType);
 
         case KillType of
           K_HARDKILL:
@@ -3927,15 +3980,17 @@ begin
         if not (R_BERSERK in FRulez) then
         begin
           Include(FRulez, R_BERSERK);
-          if FBFGFireCounter = -1 then
+          if gBerserkAutoswitch and (gDebugMode or gCheats) and (FBFGFireCounter = -1) then
           begin
             FCurrWeap := WEAPON_KASTET;
             resetWeaponQueue();
             FModel.SetWeapon(WEAPON_KASTET);
           end;
           if gFlash <> 0 then
+          begin
             Inc(FPain, 100);
             if gFlash = 2 then Inc(FPickup, 5);
+          end;
           FBerserk := gTime+30000;
           Result := True;
           remove := True;
@@ -5042,6 +5097,7 @@ begin
     if FKeys[b].Time = 0 then FKeys[b].Pressed := False else Dec(FKeys[b].Time);
 end;
 
+
 procedure TPlayer.getMapBox (out x, y, w, h: Integer); inline;
 begin
   x := FObj.X+PLAYER_RECT.X;
@@ -5050,6 +5106,18 @@ begin
   h := PLAYER_RECT.Height;
 end;
 
+
+procedure TPlayer.moveBy (dx, dy: Integer); inline;
+begin
+  if (dx <> 0) or (dy <> 0) then
+  begin
+    FObj.X += dx;
+    FObj.Y += dy;
+    positionChanged();
+  end;
+end;
+
+
 function TPlayer.Collide(X, Y: Integer; Width, Height: Word): Boolean;
 begin
   Result := g_Collide(FObj.X+PLAYER_RECT.X,
@@ -6095,7 +6163,29 @@ begin
   inherited;
 end;
 
-procedure TCorpse.positionChanged (); begin end;
+function TCorpse.ObjPtr (): PObj; inline; begin result := @FObj; end;
+
+procedure TCorpse.positionChanged (); inline; begin end;
+
+procedure TCorpse.moveBy (dx, dy: Integer); inline;
+begin
+  if (dx <> 0) or (dy <> 0) then
+  begin
+    FObj.X += dx;
+    FObj.Y += dy;
+    positionChanged();
+  end;
+end;
+
+
+procedure TCorpse.getMapBox (out x, y, w, h: Integer); inline;
+begin
+  x := FObj.X+PLAYER_CORPSERECT.X;
+  y := FObj.Y+PLAYER_CORPSERECT.Y;
+  w := PLAYER_CORPSERECT.Width;
+  h := PLAYER_CORPSERECT.Height;
+end;
+
 
 procedure TCorpse.Damage(Value: Word; vx, vy: Integer);
 var
@@ -7524,4 +7614,7 @@ begin
   FDifficult := TDifficult(p^);
 end;
 
+
+begin
+  conRegVar('cheat_berserk_autoswitch', @gBerserkAutoswitch, 'autoswitch to fist when berserk pack taken', '',  true, true);
 end.