X-Git-Url: https://deadsoftware.ru/gitweb?a=blobdiff_plain;ds=sidebyside;f=src%2Fgame%2Fg_panel.pas;h=bcd1c4c1d4040d2dc820e8c2747a663dd237b82b;hb=51bbf0eef2641d7766e22e188d6c349d9b836023;hp=809f78152feebf04a2591457eda8e4ec257b1963;hpb=1a0deddcb78946c8f7eba838d00fec5d6192501f;p=d2df-sdl.git diff --git a/src/game/g_panel.pas b/src/game/g_panel.pas index 809f781..bcd1c4c 100644 --- a/src/game/g_panel.pas +++ b/src/game/g_panel.pas @@ -571,7 +571,8 @@ var var px, py, pw, ph, dx, dy: Integer; begin - if (plr = nil) then exit; + // dead players leaves separate body entities, so don't move 'em + if (plr = nil) or not plr.alive then exit; plr.getMapBox(px, py, pw, ph); if (py+ph <> Y) then begin @@ -582,7 +583,7 @@ var plr.GameY := plr.GameY+dy; plr.positionChanged(); // check if we're squashed - if plr.live then + if plr.alive then begin plr.getMapBox(px, py, pw, ph); if g_Map_CollidePanel(px, py, pw, ph, (PANEL_WALL or PANEL_OPENDOOR or PANEL_CLOSEDOOR)) then @@ -600,6 +601,55 @@ var plr.positionChanged(); end; + procedure gibMove (gib: PGib); + var + px, py, pw, ph, dx, dy: Integer; + begin + if (gib = nil) or not gib.alive then exit; + gib.getMapBox(px, py, pw, ph); + { + writeln('gib: p=(', px, ',', py, '); obj=(', gib.Obj.X, ',', gib.Obj.Y, ')'); + px := gib.Obj.X; + py := gib.Obj.Y; + } + if (py+ph <> Y) then + begin + // push gib + if doPush(px, py, pw, ph, dx, dy) then + begin + gib.Obj.X += dx; + gib.Obj.Y += dy; + gib.positionChanged(); + end; + exit; + end; + if (px+pw <= X) then exit; + if (px >= X+Width) then exit; + gib.Obj.X += mMovingSpeed.X; + gib.Obj.Y += mMovingSpeed.Y; + gib.positionChanged(); + end; + + procedure corpseMove (cor: TCorpse); + var + px, py, pw, ph, dx, dy: Integer; + begin + if (cor = nil) then exit; + cor.getMapBox(px, py, pw, ph); + if (py+ph <> Y) then + begin + // push gib + if doPush(px, py, pw, ph, dx, dy) then + begin + cor.moveBy(dx, dy); // will call `positionChanged()` for us + end; + exit; + end; + if (px+pw <= X) then exit; + if (px >= X+Width) then exit; + cor.moveBy(mMovingSpeed.X, mMovingSpeed.Y); // will call `positionChanged()` for us + end; + var f: Integer; mon: TMonster; @@ -630,6 +680,10 @@ begin g_Mons_ForEachAt(nx, ny, Width, Height, monPush); // move and push players for f := 0 to High(gPlayers) do plrMove(gPlayers[f]); + // move and push gibs + for f := 0 to High(gGibs) do gibMove(@gGibs[f]); + // move and push corpses + for f := 0 to High(gCorpses) do corpseMove(gCorpses[f]); // reverse moving direction, if necessary if (mMovingSpeed.X < 0) and (nx <= mMovingStart.X) then mMovingSpeed.X := -mMovingSpeed.X else if (mMovingSpeed.X > 0) and (nx >= mMovingEnd.X) then mMovingSpeed.X := -mMovingSpeed.X; @@ -644,7 +698,7 @@ begin begin mon := monMoveList[f]; // check if it is squashed - if mon.live then + if mon.alive then begin mon.getMapBox(px, py, pw, ph); if g_Map_CollidePanel(px, py, pw, ph, (PANEL_WALL or PANEL_OPENDOOR or PANEL_CLOSEDOOR)) then