X-Git-Url: https://deadsoftware.ru/gitweb?a=blobdiff_plain;f=src%2Fgame%2Fg_panel.pas;h=d104593da3eeb95a875366263c08c5c78b2554f7;hb=66d9ad247935e99fe7161849b71ed952cbb85508;hp=f1aa0078ede8d0e6d64e1ff1a680348d859f1409;hpb=98ad2c936a61bb810453f3552d7ed273eeaeaef3;p=d2df-sdl.git diff --git a/src/game/g_panel.pas b/src/game/g_panel.pas index f1aa007..d104593 100644 --- a/src/game/g_panel.pas +++ b/src/game/g_panel.pas @@ -31,6 +31,9 @@ type TPanel = Class (TObject) private + const + private + mGUID: Integer; // will be assigned in "g_map.pas" FTextureWidth: Word; FTextureHeight: Word; FAlpha: Byte; @@ -52,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; @@ -65,14 +83,17 @@ type FMoved: Boolean; FLiftType: Byte; FLastAnimLoop: Byte; + // sorry, there fields are public to allow setting 'em in g_map; this should be fixed later + // for now, PLEASE, don't modify 'em, or all hell will break loose arrIdx: Integer; // index in one of internal arrays; sorry - tag: Integer; // used in coldets and such; sorry + tag: Integer; // used in coldets and such; sorry; see g_map.GridTagXXX proxyId: Integer; // proxy id in map grid (DO NOT USE!) + mapId: AnsiString; // taken directly from map file; dunno why it is here constructor Create(PanelRec: TDynRecord; AddTextures: TAddTextureArray; CurTex: Integer; - var Textures: TLevelTextureArray); + var Textures: TLevelTextureArray; aguid: Integer); destructor Destroy(); override; procedure Draw(); @@ -87,10 +108,23 @@ type procedure SaveState(var Mem: TBinMemoryWriter); procedure LoadState(var Mem: TBinMemoryReader); + 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 published + property guid: Integer read mGUID; // will be assigned in "g_map.pas" property x0: Integer read FX; property y0: Integer read FY; property x1: Integer read getx1; // inclusive! @@ -107,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; @@ -131,7 +181,7 @@ const constructor TPanel.Create(PanelRec: TDynRecord; AddTextures: TAddTextureArray; CurTex: Integer; - var Textures: TLevelTextureArray); + var Textures: TLevelTextureArray; aguid: Integer); var i: Integer; begin @@ -146,6 +196,9 @@ begin LastAnimLoop := 0; Moved := False; + mapId := PanelRec.id; + mGUID := aguid; + mMovingSpeed := PanelRec.moveSpeed; mMovingStart := PanelRec.moveStart; mMovingEnd := PanelRec.moveEnd; @@ -295,6 +348,31 @@ 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.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 xx, yy: Integer; @@ -406,6 +484,24 @@ begin end; +procedure TPanel.positionChanged (); inline; +var + px, py, pw, ph: Integer; +begin + if (proxyId >= 0) then + begin + monsGrid.getBodyDims(proxyId, px, py, pw, ph); + if (px <> x) or (py <> y) or (pw <> Width) or (ph <> Height) then + begin + 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; + + var monMoveList: array of TMonster = nil; monMoveListUsed: Integer = 0; @@ -438,8 +534,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); @@ -453,8 +550,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); @@ -513,12 +611,12 @@ begin 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); + //g_Mark(X, Y, Width, Height, MARK_WALL, false); X := nx; Y := ny; - g_Mark(nx, ny, Width, Height, MARK_WALL); + //g_Mark(nx, ny, Width, Height, MARK_WALL); // fix grid - if (proxyId >= 0) then mapGrid.moveBody(proxyId, nx, ny); + positionChanged(); // notify moved monsters about their movement for f := 0 to monMoveListUsed-1 do monMoveList[f].positionChanged(); end; @@ -745,7 +843,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.