X-Git-Url: http://deadsoftware.ru/gitweb?a=blobdiff_plain;f=src%2Fgame%2Fg_panel.pas;h=7e6a135bf13bb233ca5b9b65f03af49ac21fec26;hb=17c43bf44dcda54fa7d87e278357c803eb3eea2f;hp=3b2830e634d471e3eb0796b37b5d504cf50ea1e8;hpb=a0b4df67e96c6b5e55e95269a87975df67692e6b;p=d2df-sdl.git diff --git a/src/game/g_panel.pas b/src/game/g_panel.pas index 3b2830e..7e6a135 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; @@ -65,14 +68,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 +93,24 @@ type procedure SaveState(var Mem: TBinMemoryWriter); procedure LoadState(var Mem: TBinMemoryReader); + procedure positionChanged (); inline; + + 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 + + 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! @@ -120,7 +140,7 @@ type implementation uses - SysUtils, g_basic, g_map, g_game, e_graphics, + SysUtils, g_basic, g_map, g_game, g_gfx, e_graphics, g_console, g_language, g_monsters, g_player, e_log, GL; const @@ -131,7 +151,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 +166,9 @@ begin LastAnimLoop := 0; Moved := False; + mapId := PanelRec.id; + mGUID := aguid; + mMovingSpeed := PanelRec.moveSpeed; mMovingStart := PanelRec.moveStart; mMovingEnd := PanelRec.moveEnd; @@ -295,6 +318,16 @@ 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; + procedure TPanel.Draw(); var xx, yy: Integer; @@ -303,7 +336,7 @@ var begin if {Enabled and} (FCurTexture >= 0) and (Width > 0) and (Height > 0) and (FAlpha < 255) and - (g_dbg_scale_05 or g_Collide(X, Y, Width, Height, sX, sY, sWidth, sHeight)) then + ((g_dbg_scale <> 1.0) or g_Collide(X, Y, Width, Height, sX, sY, sWidth, sHeight)) then begin if FTextureIDs[FCurTexture].Anim then begin // Àíèìèðîâàííàÿ òåêñòóðà @@ -406,6 +439,12 @@ begin end; +procedure TPanel.positionChanged (); inline; +begin + if (proxyId >= 0) then mapGrid.moveBody(proxyId, X, Y); +end; + + var monMoveList: array of TMonster = nil; monMoveListUsed: Integer = 0; @@ -501,18 +540,25 @@ begin monMoveListUsed := 0; nx := X+mMovingSpeed.X; ny := Y+mMovingSpeed.Y; + // move monsters on lifts g_Mons_ForEachAt(X, Y-1, Width, 1, monMove); + // push monsters g_Mons_ForEachAt(nx, ny, Width, Height, monPush); + // move and push players for f := 0 to High(gPlayers) do plrMove(gPlayers[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; 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; - //!!!g_Mark(X, Y, Width, Height, MARK_FREE); + // awake particles + g_Mark(X, Y, Width, Height, MARK_WALL, false); X := nx; Y := ny; - //!!!g_Mark(X, Y, Width, Height, MARK_WALL); - if (proxyId >= 0) then mapGrid.moveBody(proxyId, nx, 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(); end; end; @@ -653,8 +699,8 @@ var sig: DWORD; anim: Boolean; begin - if (not SaveIt) or (Mem = nil) then - Exit; + if (Mem = nil) then exit; + //if not SaveIt then exit; // Ñèãíàòóðà ïàíåëè: sig := PANEL_SIGNATURE; // 'PANL' @@ -695,9 +741,10 @@ procedure TPanel.LoadState(var Mem: TBinMemoryReader); var sig: DWORD; anim: Boolean; + //ox, oy: Integer; begin - if (not SaveIt) or (Mem = nil) then - Exit; + if (Mem = nil) then exit; + //if not SaveIt then exit; // Ñèãíàòóðà ïàíåëè: Mem.ReadDWORD(sig); @@ -712,8 +759,11 @@ begin // Íîìåð òåêóùåé òåêñòóðû: Mem.ReadInt(FCurTexture); // Êîîðäû + //ox := FX; + //oy := FY; Mem.ReadInt(FX); Mem.ReadInt(FY); + //e_LogWritefln('panel %s(%s): old=(%s,%s); new=(%s,%s); delta=(%s,%s)', [arrIdx, proxyId, ox, oy, FX, FY, FX-ox, FY-oy]); // Àíèìèðîâàííàÿ ëè òåêóùàÿ òåêñòóðà: Mem.ReadBoolean(anim); // Åñëè äà - çàãðóæàåì àíèìàöèþ: @@ -733,6 +783,9 @@ begin Mem.ReadInt(mMovingEnd.X); Mem.ReadInt(mMovingEnd.Y); Mem.ReadBoolean(mMovingActive); + + positionChanged(); + mapGrid.proxyEnabled[proxyId] := FEnabled; end; end.