X-Git-Url: http://deadsoftware.ru/gitweb?a=blobdiff_plain;f=src%2Fgame%2Fg_holmes.pas;h=34fac81284217c51e8303d09c2a0ffd89f2d9855;hb=6d7e09e8e5f8c6c202c093df86385c75ca10ffef;hp=c3c29df5646f86a93c0c3c6b42474c611f6dd17d;hpb=82a1406ad9697d26709a7aa1aeb7c78441bee530;p=d2df-sdl.git diff --git a/src/game/g_holmes.pas b/src/game/g_holmes.pas index c3c29df..34fac81 100644 --- a/src/game/g_holmes.pas +++ b/src/game/g_holmes.pas @@ -1,4 +1,4 @@ -(* Copyright (C) DooM 2D:Forever Developers +(* 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 @@ -19,7 +19,7 @@ unit g_holmes; interface uses - {$IFDEF USE_MEMPOOL}mempool,{$ENDIF} geom, + mempool, geom, e_log, e_input, g_textures, g_basic, e_graphics, g_phys, g_grid, g_player, g_monsters, g_window, g_map, g_triggers, g_items, g_game, g_panel, g_console, g_gfx, @@ -32,8 +32,7 @@ uses procedure g_Holmes_Draw (); procedure g_Holmes_DrawUI (); -procedure g_Holmes_MouseEvent (var ev: TFUIMouseEvent); -procedure g_Holmes_KeyEvent (var ev: TFUIKeyEvent); +procedure g_Holmes_OnEvent (var ev: TFUIEvent); // hooks for player procedure g_Holmes_plrViewPos (viewPortX, viewPortY: Integer); @@ -49,8 +48,9 @@ var implementation uses + {$INCLUDE ../nogl/noGLuses.inc} {rttiobj,} typinfo, e_texture, - SysUtils, Classes, GL, SDL2, + SysUtils, Classes, SDL2, MAPDEF, g_main, g_options, utils, hashtable, xparser; @@ -201,7 +201,7 @@ procedure createHelpWindow (); box.appendChild(stx); // span span := TUISpan.Create(); - span.flDefaultSize := TLaySize.Create(4, 1); + span.flDefaultSize := TLaySize.Create(12, 1); span.flExpand := true; box.appendChild(span); // text @@ -331,6 +331,7 @@ begin //winHelp.appendChild(llb); uiLayoutCtl(winHelp); + winHelp.escClose := true; winHelp.centerInScreen(); end; @@ -488,10 +489,15 @@ end; procedure toggleHelpWindow (arg: Integer=-1); begin - if (winHelp = nil) then createHelpWindow(); + if (winHelp = nil) then + begin + if (arg = 0) then exit; + createHelpWindow(); + end; if (arg < 0) then begin if not uiVisibleWindow(winHelp) then uiAddWindow(winHelp) else uiRemoveWindow(winHelp); end else if (arg = 0) then begin if uiVisibleWindow(winHelp) then uiRemoveWindow(winHelp); end - else begin if not uiVisibleWindow(winHelp) then uiAddWindow(winHelp); end + else begin if (not uiVisibleWindow(winHelp)) then uiAddWindow(winHelp); end; + if (not uiVisibleWindow(winHelp)) then FreeAndNil(winHelp); end; procedure toggleOptionsWindow (arg: Integer=-1); @@ -543,16 +549,6 @@ function pmsCurMapX (): Integer; inline; begin result := round(msX/g_dbg_scale)+ function pmsCurMapY (): Integer; inline; begin result := round(msY/g_dbg_scale)+vpy; end; -procedure plrDebugMouse (var ev: TFUIMouseEvent); -begin - //e_WriteLog(Format('mouse: x=%d; y=%d; but=%d; bstate=%d', [msx, msy, but, bstate]), MSG_NOTIFY); - if (gPlayer1 = nil) or not vpSet then exit; - //if (ev.kind <> TFUIMouseEvent.Press) then exit; - //e_WriteLog(Format('mev: %d', [Integer(ev.kind)]), MSG_NOTIFY); - msbindExecute(ev); -end; - - {$IFDEF HOLMES_OLD_OUTLINES} var edgeBmp: array of Byte = nil; @@ -956,7 +952,7 @@ procedure plrDebugDraw (); pdy := pmsCurMapY-(py+ph div 2); hlmContext.color := TGxRGBA.Create(255, 0, 255, 200); hlmContext.line(px+pw div 2, py+ph div 2, px+pw div 2+pdx, py+ph div 2+pdy); - pan := mapGrid.traceBox(ex, ey, px, py, pw, ph, pdx, pdy, nil, GridTagObstacle); + pan := mapGrid.traceBox(ex, ey, px, py, pw, ph, pdx, pdy, GridTagObstacle); if (pan = nil) then begin hlmContext.color := TGxRGBA.Create(255, 255, 255, 180); @@ -977,6 +973,17 @@ procedure plrDebugDraw (); hlmContext.fillRect(cx, cy, monsGrid.tileSize, monsGrid.tileSize); end; + procedure hilightBodyCells (proxyId: Integer); + var + it: CellCoordIter; + pcellxy: PGridCellCoord; + begin + //monsGrid.forEachBodyCell(mon.proxyId, hilightCell); + it := monsGrid.forEachBodyCell(proxyId); + for pcellxy in it do hilightCell(pcellxy^.x, pcellxy^.y); + it.release(); + end; + procedure hilightCell1 (cx, cy: Integer); begin //e_WriteLog(Format('h1: (%d,%d)', [cx, cy]), MSG_NOTIFY); @@ -995,12 +1002,11 @@ procedure plrDebugDraw (); hlmContext.fillRect(pan.X, pan.Y, pan.Width, pan.Height); end; - function monsCollector (mon: TMonster; tag: Integer): Boolean; + procedure monsCollector (mon: TMonster); var ex, ey: Integer; mx, my, mw, mh: Integer; begin - result := false; mon.getMapBox(mx, my, mw, mh); hlmContext.color := TGxRGBA.Create(255, 255, 0, 160); hlmContext.rect(mx, my, mw, mh); @@ -1079,7 +1085,8 @@ procedure plrDebugDraw (); mon.getMapBox(mx, my, mw, mh); //mx += mw div 2; - monsGrid.forEachBodyCell(mon.proxyId, hilightCell); + //monsGrid.forEachBodyCell(mon.proxyId, hilightCell); + hilightBodyCells(mon.proxyId); if showMonsInfo then begin @@ -1118,7 +1125,8 @@ procedure plrDebugDraw (); function highlightAllMonsterCells (mon: TMonster): Boolean; begin result := false; // don't stop - monsGrid.forEachBodyCell(mon.proxyId, hilightCell); + //monsGrid.forEachBodyCell(mon.proxyId, hilightCell); + hilightBodyCells(mon.proxyId); end; procedure drawSelectedPlatformCells (); @@ -1128,7 +1136,8 @@ procedure plrDebugDraw (); if not showGrid then exit; pan := g_Map_PanelByGUID(platMarkedGUID); if (pan = nil) then exit; - mapGrid.forEachBodyCell(pan.proxyId, hilightCell); + //mapGrid.forEachBodyCell(pan.proxyId, hilightCell); + hilightBodyCells(pan.proxyId); hlmContext.color := TGxRGBA.Create(0, 200, 0, 200); hlmContext.rect(pan.x, pan.y, pan.width, pan.height); end; @@ -1236,9 +1245,13 @@ procedure plrDebugDraw (); var mon: TMonster; + mit: PMonster; + it: TMonsterGrid.Iter; mx, my, mw, mh: Integer; //pan: TPanel; //ex, ey: Integer; + s: AnsiString; + dx, dy: Integer; begin if (gPlayer1 = nil) then exit; @@ -1260,7 +1273,13 @@ begin if (showGrid) then drawTileGrid(); drawOutlines(); - if (laserSet) then g_Mons_AlongLine(laserX0, laserY0, laserX1, laserY1, monsCollector, true); + if (laserSet) then + begin + //g_Mons_AlongLine(laserX0, laserY0, laserX1, laserY1, monsCollector, true); + it := monsGrid.forEachAlongLine(laserX0, laserY0, laserX1, laserY1, -1, true); + for mit in it do monsCollector(mit^); + it.release(); + end; if (monMarkedUID <> -1) then begin @@ -1307,45 +1326,28 @@ 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, gWinSizeY-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, gWinSizeY-10, s); gxSetContext(nil); end; end; // ////////////////////////////////////////////////////////////////////////// // -procedure g_Holmes_MouseEvent (var ev: TFUIMouseEvent); -var - he: TFUIMouseEvent; -begin - if g_Game_IsNet then exit; - if not g_holmes_enabled then exit; - if g_holmes_imfunctional then exit; - - holmesInitCommands(); - holmesInitBinds(); - msX := ev.x; - msY := ev.y; - msB := ev.bstate; - kbS := ev.kstate; - msB := msB; - he := ev; - he.x := he.x; - he.y := he.y; - uiMouseEvent(he); - if (he.alive) then plrDebugMouse(he); - ev.eat(); -end; - - -// ////////////////////////////////////////////////////////////////////////// // -procedure g_Holmes_KeyEvent (var ev: TFUIKeyEvent); -var - doeat: Boolean = false; +procedure onKeyEvent (var ev: TFUIEvent); {$IF DEFINED(D2F_DEBUG)} +var pan: TPanel; ex, ey: Integer; dx, dy: Integer; @@ -1356,32 +1358,13 @@ var end; begin - if g_Game_IsNet then exit; - if not g_holmes_enabled then exit; - if g_holmes_imfunctional then exit; - - holmesInitCommands(); - holmesInitBinds(); - - msB := ev.bstate; - kbS := ev.kstate; - case ev.scan of - SDL_SCANCODE_LCTRL, SDL_SCANCODE_RCTRL, - SDL_SCANCODE_LALT, SDL_SCANCODE_RALT, - SDL_SCANCODE_LSHIFT, SDL_SCANCODE_RSHIFT: - doeat := true; - end; - - uiKeyEvent(ev); - if (not ev.alive) then exit; - if keybindExecute(ev) then begin ev.eat(); exit; end; // press if (ev.press) then begin {$IF DEFINED(D2F_DEBUG)} // C-UP, C-DOWN, C-LEFT, C-RIGHT: trace 10 pixels from cursor in the respective direction if ((ev.scan = SDL_SCANCODE_UP) or (ev.scan = SDL_SCANCODE_DOWN) or (ev.scan = SDL_SCANCODE_LEFT) or (ev.scan = SDL_SCANCODE_RIGHT)) and - ((ev.kstate and TFUIKeyEvent.ModCtrl) <> 0) then + ((ev.kstate and TFUIEvent.ModCtrl) <> 0) then begin ev.eat(); dx := pmsCurMapX; @@ -1406,7 +1389,61 @@ begin end; {$ENDIF} end; +end; + + +// ////////////////////////////////////////////////////////////////////////// // +procedure g_Holmes_OnEvent (var ev: TFUIEvent); +{$IF not DEFINED(HEADLESS)} +var + doeat: Boolean = false; +{$ENDIF} +begin +{$IF not DEFINED(HEADLESS)} + if g_Game_IsNet then exit; + if not g_holmes_enabled then exit; + if g_holmes_imfunctional then exit; + + holmesInitCommands(); + holmesInitBinds(); + + msB := ev.bstate; + kbS := ev.kstate; + + if (ev.key) then + begin + case ev.scan of + SDL_SCANCODE_LCTRL, SDL_SCANCODE_RCTRL, + SDL_SCANCODE_LALT, SDL_SCANCODE_RALT, + SDL_SCANCODE_LSHIFT, SDL_SCANCODE_RSHIFT: + doeat := true; + end; + end + else if (ev.mouse) then + begin + msX := ev.x; + msY := ev.y; + msB := ev.bstate; + kbS := ev.kstate; + msB := msB; + end; + + uiDispatchEvent(ev); + if (not ev.alive) then exit; + + if (ev.mouse) then + begin + if (gPlayer1 <> nil) and (vpSet) then msbindExecute(ev); + ev.eat(); + end + else + begin + if keybindExecute(ev) then ev.eat(); + if (ev.alive) then onKeyEvent(ev); + end; + if (doeat) then ev.eat(); +{$ENDIF} end; @@ -1414,6 +1451,8 @@ end; procedure g_Holmes_Draw (); begin if g_Game_IsNet then exit; + if not g_holmes_enabled then exit; + if g_holmes_imfunctional then exit; {$IF not DEFINED(HEADLESS)} holmesInitCommands(); @@ -1437,6 +1476,7 @@ begin if g_Game_IsNet then exit; if not g_holmes_enabled then exit; if g_holmes_imfunctional then exit; + {$IF not DEFINED(HEADLESS)} gGfxDoClear := false; //if assigned(prerenderFrameCB) then prerenderFrameCB(); @@ -1508,7 +1548,7 @@ procedure dbgToggleTraceBox (arg: Integer=-1); begin if (arg < 0) then showTrace procedure dbgToggleHolmesPause (arg: Integer=-1); begin if (arg < 0) then g_Game_HolmesPause(not gPauseHolmes) else g_Game_HolmesPause(arg > 0); end; procedure cbAtcurSelectMonster (); - function monsAtDump (mon: TMonster; tag: Integer): Boolean; + function monsAtDump (mon: TMonster{; tag: Integer}): Boolean; begin result := true; // stop e_WriteLog(Format('monster #%d (UID:%u) (proxyid:%d)', [mon.arrIdx, mon.UID, mon.proxyId]), TMsgType.Notify); @@ -1518,6 +1558,8 @@ procedure cbAtcurSelectMonster (); var plr: TPlayer; x, y, w, h: Integer; + mit: PMonster; + it: TMonsterGrid.Iter; begin monMarkedUID := -1; if (Length(gPlayers) > 0) then @@ -1533,24 +1575,34 @@ begin end; end; //e_WriteLog('===========================', MSG_NOTIFY); - monsGrid.forEachAtPoint(pmsCurMapX, pmsCurMapY, monsAtDump); + it := monsGrid.forEachAtPoint(pmsCurMapX, pmsCurMapY); + for mit in it do monsAtDump(mit^); + it.release(); //e_WriteLog('---------------------------', MSG_NOTIFY); end; procedure cbAtcurDumpMonsters (); - function monsAtDump (mon: TMonster; tag: Integer): Boolean; + function monsAtDump (mon: TMonster{; tag: Integer}): Boolean; begin result := false; // don't stop e_WriteLog(Format('monster #%d (UID:%u) (proxyid:%d)', [mon.arrIdx, mon.UID, mon.proxyId]), TMsgType.Notify); end; +var + mit: PMonster; + it: TMonsterGrid.Iter; begin - e_WriteLog('===========================', TMsgType.Notify); - monsGrid.forEachAtPoint(pmsCurMapX, pmsCurMapY, monsAtDump); - e_WriteLog('---------------------------', TMsgType.Notify); + it := monsGrid.forEachAtPoint(pmsCurMapX, pmsCurMapY); + if (it.length > 0) then + begin + e_WriteLog('===========================', TMsgType.Notify); + for mit in it do monsAtDump(mit^); + e_WriteLog('---------------------------', TMsgType.Notify); + end; + it.release(); end; procedure cbAtcurDumpWalls (); - function wallToggle (pan: TPanel; tag: Integer): Boolean; + function wallToggle (pan: TPanel{; tag: Integer}): Boolean; begin result := false; // don't stop if (platMarkedGUID = -1) then platMarkedGUID := pan.guid; @@ -1561,11 +1613,18 @@ var hasTrigs: Boolean = false; f: Integer; trig: PTrigger; + mwit: PPanel; + it: TPanelGrid.Iter; begin platMarkedGUID := -1; - e_WriteLog('=== TOGGLE WALL ===', TMsgType.Notify); - mapGrid.forEachAtPoint(pmsCurMapX, pmsCurMapY, wallToggle, (GridTagWall or GridTagDoor)); - e_WriteLog('--- toggle wall ---', TMsgType.Notify); + it := mapGrid.forEachAtPoint(pmsCurMapX, pmsCurMapY, (GridTagWall or GridTagDoor)); + if (it.length > 0) then + begin + e_WriteLog('=== TOGGLE WALL ===', TMsgType.Notify); + for mwit in it do wallToggle(mwit^); + e_WriteLog('--- toggle wall ---', TMsgType.Notify); + end; + it.release(); if showTriggers then begin for f := 0 to High(gTriggers) do @@ -1582,16 +1641,21 @@ begin end; procedure cbAtcurToggleWalls (); - function wallToggle (pan: TPanel; tag: Integer): Boolean; + function wallToggle (pan: TPanel{; tag: Integer}): Boolean; begin result := false; // don't stop //e_WriteLog(Format('wall #%d(%d); enabled=%d (%d); (%d,%d)-(%d,%d)', [pan.arrIdx, pan.proxyId, Integer(pan.Enabled), Integer(mapGrid.proxyEnabled[pan.proxyId]), pan.X, pan.Y, pan.Width, pan.Height]), MSG_NOTIFY); if pan.Enabled then g_Map_DisableWallGUID(pan.guid) else g_Map_EnableWallGUID(pan.guid); end; +var + mwit: PPanel; + it: TPanelGrid.Iter; begin //e_WriteLog('=== TOGGLE WALL ===', MSG_NOTIFY); - mapGrid.forEachAtPoint(pmsCurMapX, pmsCurMapY, wallToggle, (GridTagWall or GridTagDoor)); //e_WriteLog('--- toggle wall ---', MSG_NOTIFY); + it := mapGrid.forEachAtPoint(pmsCurMapX, pmsCurMapY, (GridTagWall or GridTagDoor)); + for mwit in it do wallToggle(mwit^); + it.release(); end; @@ -1715,24 +1779,12 @@ begin end; -procedure onMouseEvent (var ev: TFUIMouseEvent); -begin - if not g_holmes_enabled then exit; - if g_holmes_imfunctional then exit; - g_Holmes_MouseEvent(ev); -end; - -procedure onKeyEvent (var ev: TFUIKeyEvent); begin - if not g_holmes_enabled then exit; - if g_holmes_imfunctional then exit; - g_Holmes_KeyEvent(ev); -end; - + // shut up, fpc! + msB := msB; + vpSet := vpSet; -begin - evMouseCB := onMouseEvent; - evKeyCB := onKeyEvent; + fuiEventCB := g_Holmes_OnEvent; //uiContext.font := 'win14'; conRegVar('hlm_ui_scale', @fuiRenderScale, 0.01, 5.0, 'Holmes UI scale', '', false);