diff --git a/src/game/g_phys.pas b/src/game/g_phys.pas
index e92e49b1a6a9ba171d187a2acc2aa4e167df4fe8..1e543d4f4b31c980be889bbdad0c5088d8783a24 100644 (file)
--- a/src/game/g_phys.pas
+++ b/src/game/g_phys.pas
-(* Copyright (C) DooM 2D:Forever Developers
+(* Copyright (C) Doom 2D: Forever Developers
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
function g_Obj_CollideLiquid(Obj: PObj; XInc, YInc: Integer): Boolean; inline;
function g_Obj_CollidePanel(Obj: PObj; XInc, YInc: Integer; PanelType: Word): Boolean; inline;
function g_Obj_StayOnStep(Obj: PObj): Boolean; inline;
+function g_Obj_CanMoveY(Obj: PObj; YInc: Integer): Boolean; inline;
procedure g_Obj_Push(Obj: PObj; VelX, VelY: Integer); inline;
procedure g_Obj_PushA(Obj: PObj; Vel: Integer; Angle: SmallInt); inline;
procedure g_Obj_SetSpeed(Obj: PObj; s: Integer); inline;
PANEL_STEP, False);
end;
+function g_Obj_CanMoveY(Obj: PObj; YInc: Integer): Boolean; inline;
+begin
+ // Åñëè øàãíóòü â ïî âåðòèêàëè, à òàì ñòåíà => øàãàòü íåëüçÿ
+ // Èëè åñëè øàãíóòü âíèç, à òàì ñòóïåíü => øàãàòü íåëüçÿ
+ Result := not(g_Obj_CollideLevel(Obj, 0, YInc) or ((YInc > 0) and g_Obj_StayOnStep(Obj)));
+end;
+
function CollideLiquid(Obj: PObj; XInc, YInc: Integer): Boolean; inline;
begin
Result := g_Map_CollidePanel(Obj^.X+Obj^.Rect.X+XInc, Obj^.Y+Obj^.Rect.Y+YInc,
begin
result := true;
if (not g_Obj_CollideLevel(Obj, sx, -12)) and // çàáèðàåìñÿ íà 12 ïèêñåëåé âëåâî/âïðàâî
- g_Obj_CollidePanel(Obj, 0, 1, PANEL_WALL or PANEL_STEP) then // òîëüêî åñëè åñòü çåìëÿ ïîä íîãàìè
+ (sy >= 0) and (not g_Obj_CanMoveY(Obj, sy)) then // òîëüêî åñëè åñòü çåìëÿ ïîä íîãàìè
begin
slope(-1);
end
if Blocked(Obj, 0, sy) then st := st or MOVE_BLOCK;
end;
- // Åñëè øàãíóòü â ïî âåðòèêàëè, à òàì ñòåíà => øàãàòü íåëüçÿ
- // Èëè åñëè øàãíóòü âíèç, à òàì ñòóïåíü => øàãàòü íåëüçÿ
- if g_Obj_CollideLevel(Obj, 0, sy) or ((sy > 0) and g_Obj_StayOnStep(Obj)) then
+ // Åñëè øàãàòü íåëüçÿ
+ if not g_Obj_CanMoveY(Obj, sy) then
begin
if sy > 0 then
st := st or MOVE_HITLAND
}
// Âûëåòåë çà íèæíþþ ãðàíèöó êàðòû?
- if (Obj^.Y > gMapInfo.Height+128) then begin result := MOVE_FALLOUT; Obj.slopeUpLeft := 0; Obj.slopeFramesLeft := 0; exit; end;
+ if (Obj^.Y > Integer(gMapInfo.Height)+128) then begin result := MOVE_FALLOUT; Obj.slopeUpLeft := 0; Obj.slopeFramesLeft := 0; exit; end;
// Ìåíÿåì ñêîðîñòü è óñêîðåíèå òîëüêî ïî ÷åòíûì êàäðàì
c := (gTime mod (GAME_TICK*2) <> 0);