X-Git-Url: http://deadsoftware.ru/gitweb?a=blobdiff_plain;f=src%2Fgame%2Fg_panel.pas;h=07bd4ec95d088c7413f41eb2f8254e3b9cf8a26b;hb=64cf710bf7eb902971736580b36bcf8ce20400d8;hp=abdb26d803ce88559ed170b957973e73aa703977;hpb=8028f947967b9156e80eea51b7f8b50f3c5862b3;p=d2df-sdl.git diff --git a/src/game/g_panel.pas b/src/game/g_panel.pas index abdb26d..07bd4ec 100644 --- a/src/game/g_panel.pas +++ b/src/game/g_panel.pas @@ -25,14 +25,11 @@ uses type TAddTextureArray = array of record Texture: Cardinal; // Textures[Texture] - Anim: Boolean; end; ATextureID = array of record Texture: Cardinal; // Textures[Texture] - case Anim: Boolean of - False: (); - True: (AnTex: TAnimationState); + AnTex: TAnimState; end; PPanel = ^TPanel; @@ -223,15 +220,42 @@ var implementation -uses - g_basic, g_map, g_game, g_gfx, g_weapons, g_triggers, g_items, - g_console, g_language, g_monsters, g_player, g_grid, e_log, geom, utils, xstreams; + uses + {$IFDEF ENABLE_GFX} + g_gfx, + {$ENDIF} + {$IFDEF ENABLE_GIBS} + g_gibs, + {$ENDIF} + {$IFDEF ENABLE_CORPSES} + g_corpses, + {$ENDIF} + g_basic, g_map, g_game, g_weapons, g_triggers, g_items, + g_console, g_language, g_monsters, g_player, g_grid, e_log, geom, utils, xstreams + ; const PANEL_SIGNATURE = $4C4E4150; // 'PANL' { T P a n e l : } + function FindTextureByName (const name: String): Integer; + var i: Integer; + begin + Result := -1; + if Textures <> nil then + begin + for i := 0 to High(Textures) do + begin + if Textures[i].TextureName = name then + begin + Result := i; + break; + end + end + end + end; + constructor TPanel.Create(PanelRec: TDynRecord; AddTextures: TAddTextureArray; CurTex: Integer; @@ -313,20 +337,11 @@ begin (not ByteBool(PanelRec.Flags and PANEL_FLAG_WATERTEXTURES)) then begin SetLength(FTextureIDs, 1); - FTextureIDs[0].Anim := False; - -{ - // !!! set this case PanelRec.PanelType of - PANEL_WATER: - FTextureIDs[0].Tex := LongWord(TEXTURE_SPECIAL_WATER); - PANEL_ACID1: - FTextureIDs[0].Tex := LongWord(TEXTURE_SPECIAL_ACID1); - PANEL_ACID2: - FTextureIDs[0].Tex := LongWord(TEXTURE_SPECIAL_ACID2); + PANEL_WATER: FTextureIDs[0].Texture := FindTextureByName(TEXTURE_NAME_WATER); + PANEL_ACID1: FTextureIDs[0].Texture := FindTextureByName(TEXTURE_NAME_ACID1); + PANEL_ACID2: FTextureIDs[0].Texture := FindTextureByName(TEXTURE_NAME_ACID2); end; -} - FCurTexture := 0; Exit; end; @@ -344,13 +359,10 @@ begin for i := 0 to Length(FTextureIDs)-1 do begin FTextureIDs[i].Texture := AddTextures[i].Texture; - FTextureIDs[i].Anim := AddTextures[i].Anim; - if FTextureIDs[i].Anim then - begin // Àíèìèðîâàííàÿ òåêñòóðà - FTextureIDs[i].AnTex := TAnimationState.Create(True, Textures[AddTextures[i].Texture].Speed, Textures[AddTextures[i].Texture].FramesCount); - FTextureIDs[i].AnTex.Blending := ByteBool(PanelRec.Flags and PANEL_FLAG_BLENDING); - FTextureIDs[i].AnTex.Alpha := PanelRec.Alpha; - end + if Textures[AddTextures[i].Texture].FramesCount > 0 then + FTextureIDs[i].AnTex := TAnimState.Create(True, Textures[AddTextures[i].Texture].Speed, Textures[AddTextures[i].Texture].FramesCount) + else + FTextureIDs[i].AnTex.Invalidate; end; // Òåêñòóð íåñêîëüêî - íóæíî ñîõðàíÿòü òåêóùóþ: @@ -374,14 +386,8 @@ begin end; destructor TPanel.Destroy(); -var - i: Integer; begin - for i := 0 to High(FTextureIDs) do - if FTextureIDs[i].Anim then - FTextureIDs[i].AnTex.Free(); SetLength(FTextureIDs, 0); - Inherited; end; @@ -440,7 +446,9 @@ 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); + {$IFDEF ENABLE_GFX} + g_Mark(px, py, pw, ph, MARK_WALL, false); + {$ENDIF} if (Width < 1) or (Height < 1) then begin mapGrid.proxyEnabled[proxyId] := false; @@ -457,7 +465,9 @@ begin begin mapGrid.moveBody(proxyId, X, Y); end; - g_Mark(X, Y, Width, Height, MARK_WALL); + {$IFDEF ENABLE_GFX} + g_Mark(X, Y, Width, Height, MARK_WALL); + {$ENDIF} end; end; end; @@ -571,22 +581,23 @@ var px, py, pw, ph, pdx, pdy: Integer; squash: Boolean; plr: TPlayer; - gib: PGib; - cor: TCorpse; + {$IFDEF ENABLE_GIBS} + gib: PGib; + {$ENDIF} + {$IFDEF ENABLE_CORPSES} + cor: TCorpse; + {$ENDIF} + ontop: Boolean; mon: TMonster; flg: PFlag; itm: PItem; mpfrid: LongWord; - ontop: Boolean; actMoveTrig: Boolean; actSizeTrig: Boolean; begin if (not Enabled) or (Width < 1) or (Height < 1) then exit; - if (FCurTexture >= 0) and - (FTextureIDs[FCurTexture].Anim) and - (FTextureIDs[FCurTexture].AnTex <> nil) and - (FAlpha < 255) then + if (FCurTexture >= 0) and (FTextureIDs[FCurTexture].AnTex.IsValid()) and (FAlpha < 255) then begin FTextureIDs[FCurTexture].AnTex.Update(); FCurFrame := FTextureIDs[FCurTexture].AnTex.CurrentFrame; @@ -691,33 +702,37 @@ begin if not g_Game_IsClient and squash then plr.Damage(15000, 0, 0, 0, HIT_TRAP); end; - // process gibs - for f := 0 to High(gGibs) do - begin - gib := @gGibs[f]; - if not gib.alive then continue; - gib.getMapBox(px, py, pw, ph); - if not g_Collide(px, py, pw, ph, cx0, cy0, cw, ch) then continue; - if tryMPlatMove(px, py, pw, ph, pdx, pdy, squash, @ontop) then + {$IFDEF ENABLE_GIBS} + // process gibs + for f := 0 to High(gGibs) do begin - // set new position - gib.moveBy(pdx, pdy); // this will call `positionChanged()` for us + gib := @gGibs[f]; + if not gib.alive then continue; + gib.getMapBox(px, py, pw, ph); + if not g_Collide(px, py, pw, ph, cx0, cy0, cw, ch) then continue; + if tryMPlatMove(px, py, pw, ph, pdx, pdy, squash, @ontop) then + begin + // set new position + gib.moveBy(pdx, pdy); // this will call `positionChanged()` for us + end; end; - end; + {$ENDIF} - // move and push corpses - for f := 0 to High(gCorpses) do - begin - cor := gCorpses[f]; - if (cor = nil) then continue; - cor.getMapBox(px, py, pw, ph); - if not g_Collide(px, py, pw, ph, cx0, cy0, cw, ch) then continue; - if tryMPlatMove(px, py, pw, ph, pdx, pdy, squash, @ontop) then + {$IFDEF ENABLE_CORPSES} + // move and push corpses + for f := 0 to High(gCorpses) do begin - // set new position - cor.moveBy(pdx, pdy); // this will call `positionChanged()` for us + cor := gCorpses[f]; + if (cor = nil) then continue; + cor.getMapBox(px, py, pw, ph); + if not g_Collide(px, py, pw, ph, cx0, cy0, cw, ch) then continue; + if tryMPlatMove(px, py, pw, ph, pdx, pdy, squash, @ontop) then + begin + // set new position + cor.moveBy(pdx, pdy); // this will call `positionChanged()` for us + end; end; - end; + {$ENDIF} // move and push flags if gGameSettings.GameMode = GM_CTF then @@ -854,10 +869,7 @@ procedure TPanel.SetFrame(Frame: Integer; Count: Byte); end; begin - if Enabled and (FCurTexture >= 0) and - (FTextureIDs[FCurTexture].Anim) and - (FTextureIDs[FCurTexture].AnTex <> nil) and - (Width > 0) and (Height > 0) and (FAlpha < 255) then + if Enabled and (FCurTexture >= 0) and (FTextureIDs[FCurTexture].AnTex.IsValid()) and (Width > 0) and (Height > 0) and (FAlpha < 255) then begin FCurFrame := ClampInt(Frame, 0, FTextureIDs[FCurTexture].AnTex.TotalFrames - 1); FCurFrameCount := Count; @@ -893,20 +905,12 @@ begin end; // Ïåðåêëþ÷èëèñü íà âèäèìóþ àíèì. òåêñòóðó: - if (FCurTexture >= 0) and FTextureIDs[FCurTexture].Anim then + if (FCurTexture >= 0) and FTextureIDs[FCurTexture].AnTex.IsValid() then begin - if (FTextureIDs[FCurTexture].AnTex = nil) then - begin - g_FatalError(_lc[I_GAME_ERROR_SWITCH_TEXTURE]); - Exit; - end; - if AnimLoop = 1 then FTextureIDs[FCurTexture].AnTex.Loop := True - else - if AnimLoop = 2 then - FTextureIDs[FCurTexture].AnTex.Loop := False; - + else if AnimLoop = 2 then + FTextureIDs[FCurTexture].AnTex.Loop := False; FTextureIDs[FCurTexture].AnTex.Reset(); end; @@ -919,53 +923,39 @@ begin FCurTexture := ID; // Ïåðåêëþ÷èëèñü íà âèäèìóþ àíèì. òåêñòóðó: - if (FCurTexture >= 0) and FTextureIDs[FCurTexture].Anim then + if (FCurTexture >= 0) and FTextureIDs[FCurTexture].AnTex.IsValid() then begin - if (FTextureIDs[FCurTexture].AnTex = nil) then - begin - g_FatalError(_lc[I_GAME_ERROR_SWITCH_TEXTURE]); - Exit; - end; - if AnimLoop = 1 then FTextureIDs[FCurTexture].AnTex.Loop := True - else - if AnimLoop = 2 then - FTextureIDs[FCurTexture].AnTex.Loop := False; - + else if AnimLoop = 2 then + FTextureIDs[FCurTexture].AnTex.Loop := False; FTextureIDs[FCurTexture].AnTex.Reset(); end; LastAnimLoop := AnimLoop; end; -function TPanel.GetTextureID(): DWORD; -begin - Result := LongWord(TEXTURE_NONE); -// if (FCurTexture >= 0) then -// begin -// if FTextureIDs[FCurTexture].Anim then -// Result := Textures[FTextureIDs[FCurTexture].Texture].FramesID -// else -// Result := Textures[FTextureIDs[FCurTexture].Texture].TextureID -{ - // !!! old behavior - if FTextureIDs[FCurTexture].Anim then - Result := FTextureIDs[FCurTexture].AnTex.FramesID - else - Result := FTextureIDs[FCurTexture].Tex; -} -// end -end; + function TPanel.GetTextureID(): DWORD; + var Texture: Integer; + begin + Result := LongWord(TEXTURE_NONE); + if (FCurTexture >= 0) then + begin + Texture := FTextureIDs[FCurTexture].Texture; + case Textures[Texture].TextureName of + TEXTURE_NAME_WATER: Result := DWORD(TEXTURE_SPECIAL_WATER); + TEXTURE_NAME_ACID1: Result := DWORD(TEXTURE_SPECIAL_ACID1); + TEXTURE_NAME_ACID2: Result := DWORD(TEXTURE_SPECIAL_ACID2); + end + end + end; function TPanel.GetTextureCount(): Integer; begin Result := Length(FTextureIDs); if Enabled and (FCurTexture >= 0) then - if (FTextureIDs[FCurTexture].Anim) and - (FTextureIDs[FCurTexture].AnTex <> nil) and - (Width > 0) and (Height > 0) and (FAlpha < 255) then - Result := Result + 100; + if (FTextureIDs[FCurTexture].AnTex.IsValid()) and (Width > 0) and (Height > 0) and (FAlpha < 255) then + Result := Result + 100; end; function TPanel.CanChangeTexture(): Boolean; @@ -997,18 +987,10 @@ begin utils.writeInt(st, Word(FWidth)); utils.writeInt(st, Word(FHeight)); // Àíèìèðîâàíà ëè òåêóùàÿ òåêñòóðà - if (FCurTexture >= 0) and (FTextureIDs[FCurTexture].Anim) then - begin - assert(FTextureIDs[FCurTexture].AnTex <> nil, 'TPanel.SaveState: No animation object'); - anim := true; - end - else - begin - anim := false; - end; + anim := (FCurTexture >= 0) and (FTextureIDs[FCurTexture].AnTex.IsValid()); utils.writeBool(st, anim); // Åñëè äà - ñîõðàíÿåì àíèìàöèþ - if anim then FTextureIDs[FCurTexture].AnTex.SaveState(st); + if anim then FTextureIDs[FCurTexture].AnTex.SaveState(st, FAlpha, FBlending); // moving platform state utils.writeInt(st, Integer(mMovingSpeed.X)); @@ -1057,11 +1039,8 @@ begin if utils.readBool(st) then begin // Åñëè äà - çàãðóæàåì àíèìàöèþ - Assert((FCurTexture >= 0) and - (FTextureIDs[FCurTexture].Anim) and - (FTextureIDs[FCurTexture].AnTex <> nil), - 'TPanel.LoadState: No animation object'); - FTextureIDs[FCurTexture].AnTex.LoadState(st); + Assert((FCurTexture >= 0) and (FTextureIDs[FCurTexture].AnTex.IsValid()), 'TPanel.LoadState: No animation object'); + FTextureIDs[FCurTexture].AnTex.LoadState(st, FAlpha, FBlending); end; // moving platform state