X-Git-Url: http://deadsoftware.ru/gitweb?a=blobdiff_plain;f=src%2Fgame%2Fg_panel.pas;h=19a6af815b51077098b1fec363f77bfabdf4370e;hb=082b546b38711030b4490facbefa37a331cb1a37;hp=8a2265af842d9a546aa5eea28bd1c384875b43b1;hpb=ff104a8cdc79693b7546d839605ec73ae135d904;p=d2df-sdl.git diff --git a/src/game/g_panel.pas b/src/game/g_panel.pas index 8a2265a..19a6af8 100644 --- a/src/game/g_panel.pas +++ b/src/game/g_panel.pas @@ -1,3 +1,19 @@ +(* Copyright (C) DooM 2D:Forever Developers + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + *) +{$INCLUDE ../shared/a_modes.inc} unit g_panel; interface @@ -25,6 +41,11 @@ type True: (AnTex: TAnimation); end; + private + function getx1 (): Integer; inline; + function gety1 (): Integer; inline; + function getvisvalid (): Boolean; inline; + public FCurTexture: Integer; // Íîìåð òåêóùåé òåêñòóðû FCurFrame: Integer; @@ -35,8 +56,12 @@ type SaveIt: Boolean; // Ñîõðàíÿòü ïðè SaveState? Enabled: Boolean; Door: Boolean; + Moved: Boolean; LiftType: Byte; LastAnimLoop: Byte; + arrIdx: Integer; // index in one of internal arrays; sorry + tag: Integer; // used in coldets and such; sorry + proxyId: Integer; // proxy id in map grid (DO NOT USE!) constructor Create(PanelRec: TPanelRec_1; AddTextures: TAddTextureArray; @@ -45,6 +70,7 @@ type destructor Destroy(); override; procedure Draw(); + procedure DrawShadowVolume(lightX: Integer; lightY: Integer; radius: Integer); procedure Update(); procedure SetFrame(Frame: Integer; Count: Byte); procedure NextTexture(AnimLoop: Byte = 0); @@ -54,15 +80,22 @@ type procedure SaveState(var Mem: TBinMemoryWriter); procedure LoadState(var Mem: TBinMemoryReader); + + property x0: Integer read X; + property y0: Integer read Y; + property x1: Integer read getx1; // inclusive! + property y1: Integer read gety1; // inclusive! + property visvalid: Boolean read getvisvalid; // panel is "visvalid" when it's width and height are positive end; + PPanel = ^TPanel; TPanelArray = Array of TPanel; implementation uses - g_basic, g_map, MAPDEF, g_game, e_graphics, - g_console, g_language; + SysUtils, g_basic, g_map, MAPDEF, g_game, e_graphics, + g_console, g_language, e_log, GL; const PANEL_SIGNATURE = $4C4E4150; // 'PANL' @@ -85,6 +118,7 @@ begin FCurFrame := 0; FCurFrameCount := 0; LastAnimLoop := 0; + Moved := False; // Òèï ïàíåëè: PanelType := PanelRec.PanelType; @@ -197,7 +231,15 @@ begin SaveIt := True; // Åñëè íå ñïåöòåêñòóðà, òî çàäàåì ðàçìåðû: - if not g_Map_IsSpecialTexture(Textures[PanelRec.TextureNum].TextureName) then + if PanelRec.TextureNum > High(Textures) then + begin + e_WriteLog(Format('WTF?! PanelRec.TextureNum is out of limits! (%d : %d)', [PanelRec.TextureNum, High(Textures)]), MSG_FATALERROR); + FTextureWidth := 2; + FTextureHeight := 2; + FAlpha := 0; + FBlending := ByteBool(0); + end + else if not g_Map_IsSpecialTexture(Textures[PanelRec.TextureNum].TextureName) then begin FTextureWidth := Textures[PanelRec.TextureNum].Width; FTextureHeight := Textures[PanelRec.TextureNum].Height; @@ -218,6 +260,10 @@ begin Inherited; end; +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; + procedure TPanel.Draw(); var xx, yy: Integer; @@ -282,6 +328,53 @@ begin end; end; +procedure TPanel.DrawShadowVolume(lightX: Integer; lightY: Integer; radius: Integer); + procedure extrude (x: Integer; y: Integer); + begin + glVertex2i(x+(x-lightX)*500, y+(y-lightY)*500); + //e_WriteLog(Format(' : (%d,%d)', [x+(x-lightX)*300, y+(y-lightY)*300]), MSG_WARNING); + end; + + procedure drawLine (x0: Integer; y0: Integer; x1: Integer; y1: Integer); + begin + // does this side facing the light? + if ((x1-x0)*(lightY-y0)-(lightX-x0)*(y1-y0) >= 0) then exit; + //e_WriteLog(Format('lightpan: (%d,%d)-(%d,%d)', [x0, y0, x1, y1]), MSG_WARNING); + // this edge is facing the light, extrude and draw it + glVertex2i(x0, y0); + glVertex2i(x1, y1); + extrude(x1, y1); + extrude(x0, y0); + end; + +begin + if radius < 4 then exit; + if Enabled and (FCurTexture >= 0) and (Width > 0) and (Height > 0) and (FAlpha < 255) and g_Collide(X, Y, Width, Height, sX, sY, sWidth, sHeight) then + begin + if not FTextureIDs[FCurTexture].Anim then + begin + case FTextureIDs[FCurTexture].Tex of + TEXTURE_SPECIAL_WATER: exit; + TEXTURE_SPECIAL_ACID1: exit; + TEXTURE_SPECIAL_ACID2: exit; + TEXTURE_NONE: exit; + end; + end; + if (X+Width < lightX-radius) then exit; + if (Y+Height < lightY-radius) then exit; + if (X > lightX+radius) then exit; + if (Y > lightY+radius) then exit; + //e_DrawFill(FTextureIDs[FCurTexture].Tex, X, Y, Width div FTextureWidth, Height div FTextureHeight, FAlpha, True, FBlending); + + glBegin(GL_QUADS); + drawLine(x, y, x+width, y); // top + drawLine(x+width, y, x+width, y+height); // right + drawLine(x+width, y+height, x, y+height); // bottom + drawLine(x, y+height, x, y); // left + glEnd(); + end; +end; + procedure TPanel.Update(); begin if Enabled and (FCurTexture >= 0) and @@ -443,6 +536,9 @@ begin Mem.WriteByte(LiftType); // Íîìåð òåêóùåé òåêñòóðû: Mem.WriteInt(FCurTexture); +// Êîîðäû + Mem.WriteInt(X); + Mem.WriteInt(Y); // Àíèìèðîâàííàÿ ëè òåêóùàÿ òåêñòóðà: if (FCurTexture >= 0) and (FTextureIDs[FCurTexture].Anim) then begin @@ -478,6 +574,9 @@ begin Mem.ReadByte(LiftType); // Íîìåð òåêóùåé òåêñòóðû: Mem.ReadInt(FCurTexture); +// Êîîðäû + Mem.ReadInt(X); + Mem.ReadInt(Y); // Àíèìèðîâàííàÿ ëè òåêóùàÿ òåêñòóðà: Mem.ReadBoolean(anim); // Åñëè äà - çàãðóæàåì àíèìàöèþ: