X-Git-Url: http://deadsoftware.ru/gitweb?p=d2df-sdl.git;a=blobdiff_plain;f=src%2Fgame%2Fg_holmes.pas;h=c173bd00312e9686a7e4cb9df0165251e0de4ce4;hp=f4fe415cbf97a6f499b01b65e342e0ae1b12136e;hb=676995a77ad243efc0abee75841f81e86a7262a0;hpb=ad4f5ec68b851b9b2dba627e3b199b93f529dc86 diff --git a/src/game/g_holmes.pas b/src/game/g_holmes.pas index f4fe415..c173bd0 100644 --- a/src/game/g_holmes.pas +++ b/src/game/g_holmes.pas @@ -2,8 +2,7 @@ * * 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. + * the Free Software Foundation, version 3 of the License ONLY. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of @@ -48,8 +47,9 @@ var implementation uses - {rttiobj,} typinfo, e_texture, - SysUtils, Classes, GL, SDL2, + {$INCLUDE ../nogl/noGLuses.inc} + {rttiobj,} typinfo, e_texture, e_res, + SysUtils, Classes, SDL2, MAPDEF, g_main, g_options, utils, hashtable, xparser; @@ -559,7 +559,7 @@ var procedure clearEdgeBmp (); begin - SetLength(edgeBmp, (gWinSizeX+4)*(gWinSizeY+4)); + SetLength(edgeBmp, (gScreenWidth+4)*(gScreenHeight+4)); FillChar(edgeBmp[0], Length(edgeBmp)*sizeof(edgeBmp[0]), 0); end; @@ -574,19 +574,19 @@ var begin sx := pan.X-(vpx-1); len := pan.Width; - if (len > gWinSizeX+4) then len := gWinSizeX+4; + if (len > gScreenWidth+4) then len := gScreenWidth+4; if (sx < 0) then begin len += sx; sx := 0; end; - if (sx+len > gWinSizeX+4) then len := gWinSizeX+4-sx; + if (sx+len > gScreenWidth+4) then len := gScreenWidth+4-sx; if (len < 1) then exit; assert(sx >= 0); - assert(sx+len <= gWinSizeX+4); + assert(sx+len <= gScreenWidth+4); y0 := pan.Y-(vpy-1); y1 := y0+pan.Height; if (y0 < 0) then y0 := 0; - if (y1 > gWinSizeY+4) then y1 := gWinSizeY+4; + if (y1 > gScreenHeight+4) then y1 := gScreenHeight+4; while (y0 < y1) do begin - FillChar(edgeBmp[y0*(gWinSizeX+4)+sx], len*sizeof(edgeBmp[0]), 1); + FillChar(edgeBmp[y0*(gScreenWidth+4)+sx], len*sizeof(edgeBmp[0]), 1); Inc(y0); end; end @@ -651,15 +651,15 @@ var glColor4f(r/255.0, g/255.0, b/255.0, 1.0); for y := 1 to vph do begin - a := @edgeBmp[y*(gWinSizeX+4)+1]; + a := @edgeBmp[y*(gScreenWidth+4)+1]; startLine(y); for x := 1 to vpw do begin if (a[0] <> 0) then begin - if (a[-1] = 0) or (a[1] = 0) or (a[-(gWinSizeX+4)] = 0) or (a[gWinSizeX+4] = 0) or - (a[-(gWinSizeX+4)-1] = 0) or (a[-(gWinSizeX+4)+1] = 0) or - (a[gWinSizeX+4-1] = 0) or (a[gWinSizeX+4+1] = 0) then + if (a[-1] = 0) or (a[1] = 0) or (a[-(gScreenWidth+4)] = 0) or (a[gScreenWidth+4] = 0) or + (a[-(gScreenWidth+4)-1] = 0) or (a[-(gScreenWidth+4)+1] = 0) or + (a[gScreenWidth+4-1] = 0) or (a[gScreenWidth+4+1] = 0) then begin putPixel(x); end; @@ -684,7 +684,7 @@ var glColor4f(r/255.0, g/255.0, b/255.0, 1.0); for y := 1 to vph do begin - a := @edgeBmp[y*(gWinSizeX+4)+1]; + a := @edgeBmp[y*(gScreenWidth+4)+1]; startLine(y); for x := 1 to vpw do begin @@ -974,21 +974,13 @@ procedure plrDebugDraw (); procedure hilightBodyCells (proxyId: Integer); var - pmark: PoolMark; - hitcount: Integer; + it: CellCoordIter; pcellxy: PGridCellCoord; begin //monsGrid.forEachBodyCell(mon.proxyId, hilightCell); - pmark := framePool.mark(); - hitcount := monsGrid.forEachBodyCell(proxyId); - pcellxy := PGridCellCoord(framePool.getPtr(pmark)); - while (hitcount > 0) do - begin - hilightCell(pcellxy^.x, pcellxy^.y); - Inc(pcellxy); - Dec(hitcount); - end; - framePool.release(pmark); + it := monsGrid.forEachBodyCell(proxyId); + for pcellxy in it do hilightCell(pcellxy^.x, pcellxy^.y); + it.release(); end; procedure hilightCell1 (cx, cy: Integer); @@ -1252,12 +1244,13 @@ procedure plrDebugDraw (); var mon: TMonster; + mit: PMonster; + it: TMonsterGrid.Iter; mx, my, mw, mh: Integer; //pan: TPanel; //ex, ey: Integer; - pmark: PoolMark; - hitcount: Integer; - pmon: PMonster; + s: AnsiString; + dx, dy: Integer; begin if (gPlayer1 = nil) then exit; @@ -1265,7 +1258,7 @@ begin gxSetContext(hlmContext); try - //glScissor(0, gWinSizeY-gPlayerScreenSize.Y-1, vpw, vph); + //glScissor(0, gScreenHeight-gPlayerScreenSize.Y-1, vpw, vph); //hlmContext.clip := TGxRect.Create(0, gScreenHeight-gPlayerScreenSize.Y-1, gPlayerScreenSize.X, gPlayerScreenSize.Y); { @@ -1282,16 +1275,9 @@ begin if (laserSet) then begin //g_Mons_AlongLine(laserX0, laserY0, laserX1, laserY1, monsCollector, true); - pmark := framePool.mark(); - hitcount := monsGrid.forEachAlongLine(laserX0, laserY0, laserX1, laserY1, -1, true); - pmon := PMonster(framePool.getPtr(pmark)); - while (hitcount > 0) do - begin - monsCollector(pmon^); - Inc(pmon); - Dec(hitcount); - end; - framePool.release(pmark); + it := monsGrid.forEachAlongLine(laserX0, laserY0, laserX1, laserY1, -1, true); + for mit in it do monsCollector(mit^); + it.release(); end; if (monMarkedUID <> -1) then @@ -1339,10 +1325,19 @@ begin if showMapCurPos then begin + s := Format('mappos:(%d,%d)', [pmsCurMapX, pmsCurMapY]); gxSetContext(hlmContext); hlmContext.font := 'win8'; + hlmContext.color := TGxRGBA.Create(0, 0, 0); + for dy := -1 to 1 do + begin + for dx := -1 to 1 do + begin + if (dx <> 0) or (dy <> 0) then hlmContext.drawText(4+dx, gScreenHeight-10+dy, s); + end; + end; hlmContext.color := TGxRGBA.Create(255, 255, 0); - hlmContext.drawText(4, gWinSizeY-10, Format('mappos:(%d,%d)', [pmsCurMapX, pmsCurMapY])); + hlmContext.drawText(4, gScreenHeight-10, s); gxSetContext(nil); end; end; @@ -1562,9 +1557,8 @@ procedure cbAtcurSelectMonster (); var plr: TPlayer; x, y, w, h: Integer; - pmark: PoolMark; - hitcount: Integer; - pmon: PMonster; + mit: PMonster; + it: TMonsterGrid.Iter; begin monMarkedUID := -1; if (Length(gPlayers) > 0) then @@ -1580,16 +1574,9 @@ begin end; end; //e_WriteLog('===========================', MSG_NOTIFY); - pmark := framePool.mark(); - hitcount := monsGrid.forEachAtPoint(pmsCurMapX, pmsCurMapY); - pmon := PMonster(framePool.getPtr(pmark)); - while (hitcount > 0) do - begin - monsAtDump(pmon^); - Inc(pmon); - Dec(hitcount); - end; - framePool.release(pmark); + it := monsGrid.forEachAtPoint(pmsCurMapX, pmsCurMapY); + for mit in it do monsAtDump(mit^); + it.release(); //e_WriteLog('---------------------------', MSG_NOTIFY); end; @@ -1600,25 +1587,17 @@ procedure cbAtcurDumpMonsters (); e_WriteLog(Format('monster #%d (UID:%u) (proxyid:%d)', [mon.arrIdx, mon.UID, mon.proxyId]), TMsgType.Notify); end; var - pmark: PoolMark; - hitcount: Integer; - pmon: PMonster; + mit: PMonster; + it: TMonsterGrid.Iter; begin - pmark := framePool.mark(); - hitcount := monsGrid.forEachAtPoint(pmsCurMapX, pmsCurMapY); - if (hitcount > 0) then + it := monsGrid.forEachAtPoint(pmsCurMapX, pmsCurMapY); + if (it.length > 0) then begin e_WriteLog('===========================', TMsgType.Notify); - pmon := PMonster(framePool.getPtr(pmark)); - while (hitcount > 0) do - begin - monsAtDump(pmon^); - Inc(pmon); - Dec(hitcount); - end; + for mit in it do monsAtDump(mit^); e_WriteLog('---------------------------', TMsgType.Notify); end; - framePool.release(pmark); + it.release(); end; procedure cbAtcurDumpWalls (); @@ -1633,26 +1612,18 @@ var hasTrigs: Boolean = false; f: Integer; trig: PTrigger; - pmark: PoolMark; - hitcount: Integer; - ppan: PPanel; + mwit: PPanel; + it: TPanelGrid.Iter; begin platMarkedGUID := -1; - pmark := framePool.mark(); - hitcount := mapGrid.forEachAtPoint(pmsCurMapX, pmsCurMapY, (GridTagWall or GridTagDoor)); - if (hitcount > 0) then + it := mapGrid.forEachAtPoint(pmsCurMapX, pmsCurMapY, (GridTagWall or GridTagDoor)); + if (it.length > 0) then begin e_WriteLog('=== TOGGLE WALL ===', TMsgType.Notify); - ppan := PPanel(framePool.getPtr(pmark)); - while (hitcount > 0) do - begin - wallToggle(ppan^); - Inc(ppan); - Dec(hitcount); - end; + for mwit in it do wallToggle(mwit^); e_WriteLog('--- toggle wall ---', TMsgType.Notify); end; - framePool.release(pmark); + it.release(); if showTriggers then begin for f := 0 to High(gTriggers) do @@ -1676,22 +1647,14 @@ procedure cbAtcurToggleWalls (); if pan.Enabled then g_Map_DisableWallGUID(pan.guid) else g_Map_EnableWallGUID(pan.guid); end; var - pmark: PoolMark; - hitcount: Integer; - ppan: PPanel; + mwit: PPanel; + it: TPanelGrid.Iter; begin //e_WriteLog('=== TOGGLE WALL ===', MSG_NOTIFY); //e_WriteLog('--- toggle wall ---', MSG_NOTIFY); - pmark := framePool.mark(); - hitcount := mapGrid.forEachAtPoint(pmsCurMapX, pmsCurMapY, (GridTagWall or GridTagDoor)); - ppan := PPanel(framePool.getPtr(pmark)); - while (hitcount > 0) do - begin - wallToggle(ppan^); - Inc(ppan); - Dec(hitcount); - end; - framePool.release(pmark); + it := mapGrid.forEachAtPoint(pmsCurMapX, pmsCurMapY, (GridTagWall or GridTagDoor)); + for mwit in it do wallToggle(mwit^); + it.release(); end; @@ -1777,7 +1740,7 @@ begin // load bindings from file try - st := openDiskFileRO(GameDir+'holmes.rc'); + st := e_OpenResourceRO(ConfigDirs, 'holmes.rc'); pr := TFileTextParser.Create(st); conwriteln('parsing "holmes.rc"...'); while (pr.tokType <> pr.TTEOF) do