X-Git-Url: http://deadsoftware.ru/gitweb?a=blobdiff_plain;f=src%2Fgame%2Fg_panel.pas;h=809f78152feebf04a2591457eda8e4ec257b1963;hb=bab60f8ad58f03e8a35dbb44aba77bb9ff9201f9;hp=3c95a56ffe7f3b07724ad060b99a995f7fad3c26;hpb=d3ce22f70dfe266676a3fb95d5193238ff5b9e72;p=d2df-sdl.git diff --git a/src/game/g_panel.pas b/src/game/g_panel.pas index 3c95a56..809f781 100644 --- a/src/game/g_panel.pas +++ b/src/game/g_panel.pas @@ -55,6 +55,21 @@ type function gety1 (): Integer; inline; function getvisvalid (): Boolean; inline; + function getMovingSpeedX (): Integer; inline; + procedure setMovingSpeedX (v: Integer); inline; + function getMovingSpeedY (): Integer; inline; + procedure setMovingSpeedY (v: Integer); inline; + + function getMovingStartX (): Integer; inline; + procedure setMovingStartX (v: Integer); inline; + function getMovingStartY (): Integer; inline; + procedure setMovingStartY (v: Integer); inline; + + function getMovingEndX (): Integer; inline; + procedure setMovingEndX (v: Integer); inline; + function getMovingEndY (): Integer; inline; + procedure setMovingEndY (v: Integer); inline; + public FCurTexture: Integer; // Íîìåð òåêóùåé òåêñòóðû FCurFrame: Integer; @@ -93,18 +108,17 @@ type procedure SaveState(var Mem: TBinMemoryWriter); procedure LoadState(var Mem: TBinMemoryReader); - procedure positionChanged (); - - function isGBack (): Boolean; inline; // gRenderBackgrounds - function isGStep (): Boolean; inline; // gSteps - function isGWall (): Boolean; inline; // gWalls - function isGAcid1 (): Boolean; inline; // gAcid1 - function isGAcid2 (): Boolean; inline; // gAcid2 - function isGWater (): Boolean; inline; // gWater - function isGFore (): Boolean; inline; // gRenderForegrounds - function isGLift (): Boolean; inline; // gLifts - function isGBlockMon (): Boolean; inline; // gBlockMon + procedure positionChanged (); inline; + function getIsGBack (): Boolean; inline; // gRenderBackgrounds + function getIsGStep (): Boolean; inline; // gSteps + function getIsGWall (): Boolean; inline; // gWalls + function getIsGAcid1 (): Boolean; inline; // gAcid1 + function getIsGAcid2 (): Boolean; inline; // gAcid2 + function getIsGWater (): Boolean; inline; // gWater + function getIsGFore (): Boolean; inline; // gRenderForegrounds + function getIsGLift (): Boolean; inline; // gLifts + function getIsGBlockMon (): Boolean; inline; // gBlockMon public property visvalid: Boolean read getvisvalid; // panel is "visvalid" when it's width and height are positive @@ -127,8 +141,24 @@ type property liftType: Byte read FLiftType write FLiftType; // Ñîõðàíÿòü ïðè SaveState? property lastAnimLoop: Byte read FLastAnimLoop write FLastAnimLoop; // Ñîõðàíÿòü ïðè SaveState? + property movingSpeedX: Integer read getMovingSpeedX write setMovingSpeedX; + property movingSpeedY: Integer read getMovingSpeedY write setMovingSpeedY; + property movingStartX: Integer read getMovingStartX write setMovingStartX; + property movingStartY: Integer read getMovingStartY write setMovingStartY; + property movingEndX: Integer read getMovingEndX write setMovingEndX; + property movingEndY: Integer read getMovingEndY write setMovingEndY; property movingActive: Boolean read mMovingActive write mMovingActive; + property isGBack: Boolean read getIsGBack; + property isGStep: Boolean read getIsGStep; + property isGWall: Boolean read getIsGWall; + property isGAcid1: Boolean read getIsGAcid1; + property isGAcid2: Boolean read getIsGAcid2; + property isGWater: Boolean read getIsGWater; + property isGFore: Boolean read getIsGFore; + property isGLift: Boolean read getIsGLift; + property isGBlockMon: Boolean read getIsGBlockMon; + public property movingSpeed: TDFPoint read mMovingSpeed write mMovingSpeed; property movingStart: TDFPoint read mMovingStart write mMovingStart; @@ -137,10 +167,15 @@ type TPanelArray = Array of TPanel; +var + g_dbgpan_mplat_active: Boolean = {$IF DEFINED(D2F_DEBUG)}false{$ELSE}true{$ENDIF}; + g_dbgpan_mplat_step: Boolean = false; // one step, and stop + + implementation uses - SysUtils, g_basic, g_map, g_game, g_gfx, e_graphics, + SysUtils, g_basic, g_map, g_game, g_gfx, e_graphics, g_weapons, g_console, g_language, g_monsters, g_player, e_log, GL; const @@ -318,15 +353,30 @@ function TPanel.getx1 (): Integer; inline; begin result := X+Width-1; end; function TPanel.gety1 (): Integer; inline; begin result := Y+Height-1; end; function TPanel.getvisvalid (): Boolean; inline; begin result := (Width > 0) and (Height > 0); end; -function TPanel.isGBack (): Boolean; inline; begin result := ((tag and GridTagBack) <> 0); end; -function TPanel.isGStep (): Boolean; inline; begin result := ((tag and GridTagStep) <> 0); end; -function TPanel.isGWall (): Boolean; inline; begin result := ((tag and (GridTagWall or GridTagDoor)) <> 0); end; -function TPanel.isGAcid1 (): Boolean; inline; begin result := ((tag and GridTagAcid1) <> 0); end; -function TPanel.isGAcid2 (): Boolean; inline; begin result := ((tag and GridTagAcid2) <> 0); end; -function TPanel.isGWater (): Boolean; inline; begin result := ((tag and GridTagWater) <> 0); end; -function TPanel.isGFore (): Boolean; inline; begin result := ((tag and GridTagFore) <> 0); end; -function TPanel.isGLift (): Boolean; inline; begin result := ((tag and GridTagLift) <> 0); end; -function TPanel.isGBlockMon (): Boolean; inline; begin result := ((tag and GridTagBlockMon) <> 0); end; +function TPanel.getMovingSpeedX (): Integer; inline; begin result := mMovingSpeed.X; end; +procedure TPanel.setMovingSpeedX (v: Integer); inline; begin mMovingSpeed.X := v; end; +function TPanel.getMovingSpeedY (): Integer; inline; begin result := mMovingSpeed.Y; end; +procedure TPanel.setMovingSpeedY (v: Integer); inline; begin mMovingSpeed.Y := v; end; + +function TPanel.getMovingStartX (): Integer; inline; begin result := mMovingStart.X; end; +procedure TPanel.setMovingStartX (v: Integer); inline; begin mMovingStart.X := v; end; +function TPanel.getMovingStartY (): Integer; inline; begin result := mMovingStart.Y; end; +procedure TPanel.setMovingStartY (v: Integer); inline; begin mMovingStart.Y := v; end; + +function TPanel.getMovingEndX (): Integer; inline; begin result := mMovingEnd.X; end; +procedure TPanel.setMovingEndX (v: Integer); inline; begin mMovingEnd.X := v; end; +function TPanel.getMovingEndY (): Integer; inline; begin result := mMovingEnd.Y; end; +procedure TPanel.setMovingEndY (v: Integer); inline; begin mMovingEnd.Y := v; end; + +function TPanel.getIsGBack (): Boolean; inline; begin result := ((tag and GridTagBack) <> 0); end; +function TPanel.getIsGStep (): Boolean; inline; begin result := ((tag and GridTagStep) <> 0); end; +function TPanel.getIsGWall (): Boolean; inline; begin result := ((tag and (GridTagWall or GridTagDoor)) <> 0); end; +function TPanel.getIsGAcid1 (): Boolean; inline; begin result := ((tag and GridTagAcid1) <> 0); end; +function TPanel.getIsGAcid2 (): Boolean; inline; begin result := ((tag and GridTagAcid2) <> 0); end; +function TPanel.getIsGWater (): Boolean; inline; begin result := ((tag and GridTagWater) <> 0); end; +function TPanel.getIsGFore (): Boolean; inline; begin result := ((tag and GridTagFore) <> 0); end; +function TPanel.getIsGLift (): Boolean; inline; begin result := ((tag and GridTagLift) <> 0); end; +function TPanel.getIsGBlockMon (): Boolean; inline; begin result := ((tag and GridTagBlockMon) <> 0); end; procedure TPanel.Draw(); var @@ -439,9 +489,25 @@ begin end; -procedure TPanel.positionChanged (); +procedure TPanel.positionChanged (); inline; +var + px, py, pw, ph: Integer; begin - if (proxyId >= 0) then mapGrid.moveBody(proxyId, X, Y); + if (proxyId >= 0) then + begin + mapGrid.getBodyDims(proxyId, px, py, pw, ph); + if (px <> x) or (py <> y) or (pw <> Width) or (ph <> Height) then + begin + { + e_LogWritefln('panel moved: arridx=%s; guid=%s; proxyid=%s; old:(%s,%s)-(%sx%s); new:(%s,%s)-(%sx%s)', + [arrIdx, mGUID, proxyId, px, py, pw, ph, x, y, width, height]); + } + g_Mark(px, py, pw, ph, MARK_WALL, false); + if (pw <> Width) or (ph <> Height) then mapGrid.moveResizeBody(proxyId, X, Y, Width, Height) + else mapGrid.moveBody(proxyId, X, Y); + g_Mark(X, Y, Width, Height, MARK_WALL); + end; + end; end; @@ -452,7 +518,6 @@ var procedure TPanel.Update(); var nx, ny: Integer; - f: Integer; function doPush (px, py, pw, ph: Integer; out dx, dy: Integer): Boolean; begin @@ -477,8 +542,9 @@ var function monMove (mon: TMonster): Boolean; begin result := false; // don't stop - mon.GameX := mon.GameX+mMovingSpeed.X; - mon.GameY := mon.GameY+mMovingSpeed.Y; + //mon.GameX := mon.GameX+mMovingSpeed.X; + //mon.GameY := mon.GameY+mMovingSpeed.Y; + mon.setPosition(mon.GameX+mMovingSpeed.X, mon.GameY+mMovingSpeed.Y, false); // we can't call `positionChanged()` in grid callback if (monMoveListUsed >= Length(monMoveList)) then SetLength(monMoveList, monMoveListUsed+64); monMoveList[monMoveListUsed] := mon; Inc(monMoveListUsed); @@ -492,8 +558,9 @@ var mon.getMapBox(px, py, pw, ph); if doPush(px, py, pw, ph, dx, dy) then begin - mon.GameX := mon.GameX+dx; - mon.GameY := mon.GameY+dy; + //mon.GameX := mon.GameX+dx; + //mon.GameY := mon.GameY+dy; + mon.setPosition(mon.GameX+dx, mon.GameY+dy, false); // we can't call `positionChanged()` in grid callback if (monMoveListUsed >= Length(monMoveList)) then SetLength(monMoveList, monMoveListUsed+64); monMoveList[monMoveListUsed] := mon; Inc(monMoveListUsed); @@ -514,6 +581,15 @@ var plr.GameX := plr.GameX+dx; plr.GameY := plr.GameY+dy; plr.positionChanged(); + // check if we're squashed + if plr.live 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 + begin + plr.Damage(15000, 0, 0, 0, HIT_TRAP); + end; + end; end; exit; end; @@ -524,6 +600,10 @@ var plr.positionChanged(); end; +var + f: Integer; + mon: TMonster; + px, py, pw, ph: Integer; begin if Enabled and (FCurTexture >= 0) and (FTextureIDs[FCurTexture].Anim) and @@ -535,13 +615,17 @@ begin FCurFrameCount := FTextureIDs[FCurTexture].AnTex.CurrentCounter; end; - if mMovingActive and (not mMovingSpeed.isZero) then + if mMovingActive and (not mMovingSpeed.isZero) and g_dbgpan_mplat_active then begin monMoveListUsed := 0; nx := X+mMovingSpeed.X; ny := Y+mMovingSpeed.Y; // move monsters on lifts g_Mons_ForEachAt(X, Y-1, Width, 1, monMove); + X := nx; + Y := ny; + // fix grid + positionChanged(); // push monsters g_Mons_ForEachAt(nx, ny, Width, Height, monPush); // move and push players @@ -551,15 +635,24 @@ begin else if (mMovingSpeed.X > 0) and (nx >= mMovingEnd.X) then mMovingSpeed.X := -mMovingSpeed.X; if (mMovingSpeed.Y < 0) and (ny <= mMovingStart.Y) then mMovingSpeed.Y := -mMovingSpeed.Y else if (mMovingSpeed.Y > 0) and (ny >= mMovingEnd.Y) then mMovingSpeed.Y := -mMovingSpeed.Y; - // awake particles - g_Mark(X, Y, Width, Height, MARK_WALL, false); - X := nx; - Y := ny; - g_Mark(nx, ny, Width, Height, MARK_WALL); - // fix grid - positionChanged(); // notify moved monsters about their movement - for f := 0 to monMoveListUsed-1 do monMoveList[f].positionChanged(); + for f := 0 to monMoveListUsed-1 do + begin + monMoveList[f].positionChanged(); + end; + for f := 0 to monMoveListUsed-1 do + begin + mon := monMoveList[f]; + // check if it is squashed + if mon.live 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 + begin + mon.Damage(15000, 0, 0, 0, HIT_TRAP); + end; + end; + end; end; end; @@ -784,7 +877,8 @@ begin Mem.ReadInt(mMovingEnd.Y); Mem.ReadBoolean(mMovingActive); - if (proxyId >= 0) then mapGrid.moveBody(proxyId, X, Y); + positionChanged(); + //mapGrid.proxyEnabled[proxyId] := FEnabled; // done in g_map.pas end; end.