X-Git-Url: https://deadsoftware.ru/gitweb?a=blobdiff_plain;f=src%2Fgame%2Fg_holmes.pas;h=bcb2cfadb4ed56f09d3816b4121e313213a34b49;hb=f671ef276ead1f6faafaf14bb9cd6be9293908b9;hp=3b630ab674faa7c70df292c70143bdf6f30a0bde;hpb=73dcd471279fb6cc58e944fb56ad863955eb742e;p=d2df-sdl.git diff --git a/src/game/g_holmes.pas b/src/game/g_holmes.pas index 3b630ab..bcb2cfa 100644 --- a/src/game/g_holmes.pas +++ b/src/game/g_holmes.pas @@ -19,19 +19,21 @@ unit g_holmes; interface uses - mempool, geom, + {$IFDEF USE_MEMPOOL}mempool,{$ENDIF} 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, xprofiler, - sdlcarcass, glgfx, gh_ui; + sdlcarcass, + fui_common, fui_events, fui_ctls, + fui_gfx_gl; procedure g_Holmes_Draw (); procedure g_Holmes_DrawUI (); -function g_Holmes_MouseEvent (var ev: THMouseEvent): Boolean; // returns `true` if event was eaten -function g_Holmes_KeyEvent (var ev: THKeyEvent): Boolean; // returns `true` if event was eaten +procedure g_Holmes_MouseEvent (var ev: THMouseEvent); +procedure g_Holmes_KeyEvent (var ev: THKeyEvent); // hooks for player procedure g_Holmes_plrViewPos (viewPortX, viewPortY: Integer); @@ -53,6 +55,7 @@ uses var + hlmContext: TGxContext = nil; //globalInited: Boolean = false; msX: Integer = -666; msY: Integer = -666; @@ -96,10 +99,10 @@ var // ////////////////////////////////////////////////////////////////////////// // var - winHelp: THTopWindow = nil; - winOptions: THTopWindow = nil; - winLayers: THTopWindow = nil; - winOutlines: THTopWindow = nil; + winHelp: TUITopWindow = nil; + winOptions: TUITopWindow = nil; + winLayers: TUITopWindow = nil; + winOutlines: TUITopWindow = nil; procedure createHelpWindow (); forward; @@ -108,8 +111,9 @@ procedure createLayersWindow (); forward; procedure createOutlinesWindow (); forward; -procedure toggleLayersWindowCB (me: THControl; checked: Integer); +procedure toggleLayersWindowCB (me: TUIControl); begin + showLayersWindow := not showLayersWindow; if showLayersWindow then begin if (winLayers = nil) then createLayersWindow(); @@ -121,9 +125,9 @@ begin end; end; - -procedure toggleOutlineWindowCB (me: THControl; checked: Integer); +procedure toggleOutlineWindowCB (me: TUIControl); begin + showOutlineWindow := not showOutlineWindow; if showOutlineWindow then begin if (winOutlines = nil) then createOutlinesWindow(); @@ -137,17 +141,102 @@ end; procedure createHelpWindow (); + procedure addHelpEmptyLine (); + var + stx: TUIStaticText; + begin + stx := TUIStaticText.Create(); + stx.flExpand := true; + stx.halign := 0; // center + stx.text := ''; + stx.header := false; + stx.line := false; + winHelp.appendChild(stx); + end; + + procedure addHelpCaptionLine (const txt: AnsiString); + var + stx: TUIStaticText; + begin + stx := TUIStaticText.Create(); + stx.flExpand := true; + stx.halign := 0; // center + stx.text := txt; + stx.header := true; + stx.line := true; + winHelp.appendChild(stx); + end; + + procedure addHelpCaption (const txt: AnsiString); + var + stx: TUIStaticText; + begin + stx := TUIStaticText.Create(); + stx.flExpand := true; + stx.halign := 0; // center + stx.text := txt; + stx.header := true; + stx.line := false; + winHelp.appendChild(stx); + end; + + procedure addHelpKeyMouse (const key, txt, grp: AnsiString); + var + box: TUIHBox; + span: TUISpan; + stx: TUIStaticText; + begin + box := TUIHBox.Create(); + box.flExpand := true; + // key + stx := TUIStaticText.Create(); + stx.flExpand := true; + stx.halign := 1; // right + stx.valign := 0; // center + stx.text := key; + stx.header := true; + stx.line := false; + stx.flHGroup := grp; + box.appendChild(stx); + // span + span := TUISpan.Create(); + span.flDefaultSize := TLaySize.Create(4, 1); + span.flExpand := true; + box.appendChild(span); + // text + stx := TUIStaticText.Create(); + stx.flExpand := true; + stx.halign := -1; // left + stx.valign := 0; // center + stx.text := txt; + stx.header := false; + stx.line := false; + box.appendChild(stx); + winHelp.appendChild(box); + end; + + procedure addHelpKey (const key, txt: AnsiString); begin addHelpKeyMouse(key, txt, 'help-keys'); end; + procedure addHelpMouse (const key, txt: AnsiString); begin addHelpKeyMouse(key, txt, 'help-mouse'); end; + var - llb: THCtlSimpleText; slist: array of AnsiString = nil; cmd: PHolmesCommand; bind: THolmesBinding; - f, maxkeylen: Integer; + f: Integer; + { + llb: TUISimpleText; + maxkeylen: Integer; s: AnsiString; + } begin + winHelp := TUITopWindow.Create('Holmes Help'); + winHelp.escClose := true; + winHelp.flHoriz := false; + + // keyboard for cmd in cmdlist do cmd.helpmark := false; - maxkeylen := 0; + //maxkeylen := 0; for bind in keybinds do begin if (Length(bind.key) = 0) then continue; @@ -156,7 +245,7 @@ begin if (Length(cmd.help) > 0) then begin cmd.helpmark := true; - if (maxkeylen < Length(bind.key)) then maxkeylen := Length(bind.key); + //if (maxkeylen < Length(bind.key)) then maxkeylen := Length(bind.key); end; end; end; @@ -164,7 +253,7 @@ begin for cmd in cmdlist do begin if not cmd.helpmark then continue; - if (Length(cmd.help) = 0) then continue; + if (Length(cmd.help) = 0) then begin cmd.helpmark := false; continue; end; f := 0; while (f < Length(slist)) and (CompareText(slist[f], cmd.section) <> 0) do Inc(f); if (f = Length(slist)) then @@ -174,11 +263,14 @@ begin end; end; - llb := THCtlSimpleText.Create(0, 0); + addHelpCaptionLine('KEYBOARD'); + //llb := TUISimpleText.Create(0, 0); for f := 0 to High(slist) do begin - if (f > 0) then llb.appendItem(''); - llb.appendItem(slist[f], true, true); + //if (f > 0) then llb.appendItem(''); + if (f > 0) then addHelpEmptyLine(); + //llb.appendItem(slist[f], true, true); + addHelpCaption(slist[f]); for cmd in cmdlist do begin if not cmd.helpmark then continue; @@ -188,16 +280,20 @@ begin if (Length(bind.key) = 0) then continue; if (cmd.name = bind.cmdName) then begin - s := bind.key; - while (Length(s) < maxkeylen) do s += ' '; - s := ' '+s+' -- '+cmd.help; - llb.appendItem(s); + //s := bind.key; + //while (Length(s) < maxkeylen) do s += ' '; + //s := ' '+s+' -- '+cmd.help; + //llb.appendItem(s); + addHelpMouse(bind.key, cmd.help); end; end; end; end; - maxkeylen := 0; + // mouse + for cmd in cmdlist do cmd.helpmark := false; + + //maxkeylen := 0; for bind in msbinds do begin if (Length(bind.key) = 0) then continue; @@ -206,13 +302,15 @@ begin if (Length(cmd.help) > 0) then begin cmd.helpmark := true; - if (maxkeylen < Length(bind.key)) then maxkeylen := Length(bind.key); + //if (maxkeylen < Length(bind.key)) then maxkeylen := Length(bind.key); end; end; end; - llb.appendItem(''); - llb.appendItem('mouse', true, true); + //llb.appendItem(''); + //llb.appendItem('mouse', true, true); + if (f > 0) then addHelpEmptyLine(); + addHelpCaptionLine('MOUSE'); for bind in msbinds do begin if (Length(bind.key) = 0) then continue; @@ -220,84 +318,155 @@ begin begin if (Length(cmd.help) > 0) then begin - s := bind.key; - while (Length(s) < maxkeylen) do s += ' '; - s := ' '+s+' -- '+cmd.help; - llb.appendItem(s); + //s := bind.key; + //while (Length(s) < maxkeylen) do s += ' '; + //s := ' '+s+' -- '+cmd.help; + //llb.appendItem(s); + addHelpKey(bind.key, cmd.help); end; end; end; - winHelp := THTopWindow.Create('Holmes Help', 10, 10); - winHelp.escClose := true; - winHelp.appendChild(llb); + //winHelp.appendChild(llb); + + uiLayoutCtl(winHelp); winHelp.centerInScreen(); end; -procedure winLayersClosed (me: THControl; dummy: Integer); begin showLayersWindow := false; end; -procedure winOutlinesClosed (me: THControl; dummy: Integer); begin showOutlineWindow := false; end; +procedure winLayersClosed (me: TUIControl); begin showLayersWindow := false; end; +procedure winOutlinesClosed (me: TUIControl); begin showOutlineWindow := false; end; + +procedure addCheckBox (parent: TUIControl; const text: AnsiString; pvar: PBoolean; const aid: AnsiString=''); +var + cb: TUICheckBox; +begin + cb := TUICheckBox.Create(); + cb.flExpand := true; + cb.setVar(pvar); + cb.text := text; + cb.id := aid; + parent.appendChild(cb); +end; + +procedure addButton (parent: TUIControl; const text: AnsiString; cb: TUIControl.TActionCB); +var + but: TUIButton; +begin + but := TUIButton.Create(); + //but.flExpand := true; + but.actionCB := cb; + but.text := text; + parent.appendChild(but); +end; + + +procedure actionFillWalls (cb: TUIControl); +begin + TUICheckBox(cb).checked := not TUICheckBox(cb).checked; + TUICheckBox(cb.topLevel['cbcontour']).enabled := not TUICheckBox(cb).checked; +end; procedure createLayersWindow (); var - llb: THCtlCBListBox; + box: TUIVBox; begin - llb := THCtlCBListBox.Create(0, 0); - llb.appendItem('background', @g_rlayer_back); - llb.appendItem('steps', @g_rlayer_step); - llb.appendItem('walls', @g_rlayer_wall); - llb.appendItem('doors', @g_rlayer_door); - llb.appendItem('acid1', @g_rlayer_acid1); - llb.appendItem('acid2', @g_rlayer_acid2); - llb.appendItem('water', @g_rlayer_water); - llb.appendItem('foreground', @g_rlayer_fore); - winLayers := THTopWindow.Create('layers', 10, 10); + winLayers := TUITopWindow.Create('layers'); + winLayers.flHoriz := false; + winLayers.x0 := 10; + winLayers.y0 := 10; + winLayers.flHoriz := false; winLayers.escClose := true; - winLayers.appendChild(llb); winLayers.closeCB := winLayersClosed; + + box := TUIVBox.Create(); + addCheckBox(box, '~background', @g_rlayer_back); + addCheckBox(box, '~steps', @g_rlayer_step); + addCheckBox(box, '~walls', @g_rlayer_wall); + addCheckBox(box, '~doors', @g_rlayer_door); + addCheckBox(box, 'acid~1', @g_rlayer_acid1); + addCheckBox(box, 'acid~2', @g_rlayer_acid2); + addCheckBox(box, 'wate~r', @g_rlayer_water); + addCheckBox(box, '~foreground', @g_rlayer_fore); + winLayers.appendChild(box); + + uiLayoutCtl(winLayers); end; procedure createOutlinesWindow (); var - llb: THCtlCBListBox; + box: TUIVBox; begin - llb := THCtlCBListBox.Create(0, 0); - llb.appendItem('background', @g_ol_rlayer_back); - llb.appendItem('steps', @g_ol_rlayer_step); - llb.appendItem('walls', @g_ol_rlayer_wall); - llb.appendItem('doors', @g_ol_rlayer_door); - llb.appendItem('acid1', @g_ol_rlayer_acid1); - llb.appendItem('acid2', @g_ol_rlayer_acid2); - llb.appendItem('water', @g_ol_rlayer_water); - llb.appendItem('foreground', @g_ol_rlayer_fore); - llb.appendItem('OPTIONS', nil); - llb.appendItem('fill walls', @g_ol_fill_walls); - llb.appendItem('contours', @g_ol_nice); - winOutlines := THTopWindow.Create('outlines', 100, 10); + winOutlines := TUITopWindow.Create('outlines'); + winOutlines.flHoriz := false; + winOutlines.x0 := 100; + winOutlines.y0 := 30; + winOutlines.flHoriz := false; winOutlines.escClose := true; - winOutlines.appendChild(llb); winOutlines.closeCB := winOutlinesClosed; + + box := TUIVBox.Create(); + box.hasFrame := true; + box.caption := 'layers'; + addCheckBox(box, '~background', @g_ol_rlayer_back); + addCheckBox(box, '~steps', @g_ol_rlayer_step); + addCheckBox(box, '~walls', @g_ol_rlayer_wall); + addCheckBox(box, '~doors', @g_ol_rlayer_door); + addCheckBox(box, 'acid~1', @g_ol_rlayer_acid1); + addCheckBox(box, 'acid~2', @g_ol_rlayer_acid2); + addCheckBox(box, 'wate~r', @g_ol_rlayer_water); + addCheckBox(box, '~foreground', @g_ol_rlayer_fore); + winOutlines.appendChild(box); + + box := TUIVBox.Create(); + box.hasFrame := true; + box.caption := 'options'; + addCheckBox(box, 'fi~ll walls', @g_ol_fill_walls, 'cbfill'); + addCheckBox(box, 'con~tours', @g_ol_nice, 'cbcontour'); + winOutlines.appendChild(box); + + winOutlines.setActionCBFor('cbfill', actionFillWalls); + + uiLayoutCtl(winOutlines); end; procedure createOptionsWindow (); var - llb: THCtlCBListBox; + box: TUIBox; + span: TUISpan; begin - llb := THCtlCBListBox.Create(0, 0); - llb.appendItem('map grid', @showGrid); - llb.appendItem('cursor position on map', @showMapCurPos); - llb.appendItem('monster info', @showMonsInfo); - llb.appendItem('monster LOS to player', @showMonsLOS2Plr); - llb.appendItem('monster cells (SLOW!)', @showAllMonsCells); - llb.appendItem('draw triggers (SLOW!)', @showTriggers); - llb.appendItem('WINDOWS', nil); - llb.appendItem('layers window', @showLayersWindow, toggleLayersWindowCB); - llb.appendItem('outline window', @showOutlineWindow, toggleOutlineWindowCB); - winOptions := THTopWindow.Create('Holmes Options', 100, 100); + winOptions := TUITopWindow.Create('Holmes Options'); + winOptions.flHoriz := false; + winOptions.flHoriz := false; winOptions.escClose := true; - winOptions.appendChild(llb); + + box := TUIVBox.Create(); + box.hasFrame := true; + box.caption := 'visual'; + addCheckBox(box, 'map ~grid', @showGrid); + addCheckBox(box, 'cursor ~position on map', @showMapCurPos); + addCheckBox(box, '~monster info', @showMonsInfo); + addCheckBox(box, 'monster LO~S to player', @showMonsLOS2Plr); + addCheckBox(box, 'monster ~cells (SLOW!)', @showAllMonsCells); + addCheckBox(box, 'draw ~triggers (SLOW!)', @showTriggers); + winOptions.appendChild(box); + + box := TUIHBox.Create(); + box.hasFrame := true; + box.caption := 'windows'; + box.captionAlign := 0; + box.flAlign := 0; + addButton(box, '~layers', toggleLayersWindowCB); + span := TUISpan.Create(); + span.flExpand := true; + span.flDefaultSize := TLaySize.Create(4, 1); + box.appendChild(span); + addButton(box, '~outline', toggleOutlineWindowCB); + winOptions.appendChild(box); + + uiLayoutCtl(winOptions); winOptions.centerInScreen(); end; @@ -305,13 +474,15 @@ end; procedure toggleLayersWindow (arg: Integer=-1); begin if (arg < 0) then showLayersWindow := not showLayersWindow else showLayersWindow := (arg > 0); - toggleLayersWindowCB(nil, 0); + showLayersWindow := not showLayersWindow; // hack for callback + toggleLayersWindowCB(nil); end; procedure toggleOutlineWindow (arg: Integer=-1); begin if (arg < 0) then showOutlineWindow := not showOutlineWindow else showOutlineWindow := (arg > 0); - toggleOutlineWindowCB(nil, 0); + showOutlineWindow := not showOutlineWindow; // hack for callback + toggleOutlineWindowCB(nil); end; procedure toggleHelpWindow (arg: Integer=-1); @@ -688,6 +859,7 @@ var g := ag; b := ab; if g_ol_nice then clearOliner(); + hlmContext.color := TGxRGBA.Create(r, g, b); for f := 0 to High(parr) do begin pan := parr[f]; @@ -702,11 +874,11 @@ var end; if g_ol_fill_walls then begin - fillRect(pan.X, pan.Y, pan.Width, pan.Height, r, g, b); + hlmContext.fillRect(pan.X, pan.Y, pan.Width, pan.Height); end else if not g_ol_nice then begin - drawRect(pan.X, pan.Y, pan.Width, pan.Height, r, g, b); + hlmContext.rect(pan.X, pan.Y, pan.Width, pan.Height); end; end; if g_ol_nice then @@ -735,14 +907,16 @@ procedure plrDebugDraw (); var x, y: Integer; begin + hlmContext.color := TGxRGBA.Create(96, 96, 96); for y := 0 to (mapGrid.gridHeight div mapGrid.tileSize) do begin - drawLine(mapGrid.gridX0, mapGrid.gridY0+y*mapGrid.tileSize, mapGrid.gridX0+mapGrid.gridWidth, mapGrid.gridY0+y*mapGrid.tileSize, 96, 96, 96, 255); + hlmContext.line(mapGrid.gridX0, mapGrid.gridY0+y*mapGrid.tileSize, mapGrid.gridX0+mapGrid.gridWidth, mapGrid.gridY0+y*mapGrid.tileSize); end; + hlmContext.color := TGxRGBA.Create(96, 96, 96); for x := 0 to (mapGrid.gridWidth div mapGrid.tileSize) do begin - drawLine(mapGrid.gridX0+x*mapGrid.tileSize, mapGrid.gridY0, mapGrid.gridX0+x*mapGrid.tileSize, mapGrid.gridY0+y*mapGrid.gridHeight, 96, 96, 96, 255); + hlmContext.line(mapGrid.gridX0+x*mapGrid.tileSize, mapGrid.gridY0, mapGrid.gridX0+x*mapGrid.tileSize, mapGrid.gridY0+y*mapGrid.gridHeight); end; end; @@ -750,13 +924,14 @@ procedure plrDebugDraw (); var x, y: Integer; begin + hlmContext.color := TGxRGBA.Create(128, 0, 128, 64); for y := 0 to (mapGrid.gridHeight div mapGrid.tileSize) do begin for x := 0 to (mapGrid.gridWidth div mapGrid.tileSize) do begin if awmIsSetHolmes(x*mapGrid.tileSize+mapGrid.gridX0+1, y*mapGrid.tileSize++mapGrid.gridY0+1) then begin - fillRect(x*mapGrid.tileSize++mapGrid.gridX0, y*mapGrid.tileSize++mapGrid.gridY0, monsGrid.tileSize, monsGrid.tileSize, 128, 0, 128, 64); + hlmContext.fillRect(x*mapGrid.tileSize++mapGrid.gridX0, y*mapGrid.tileSize++mapGrid.gridY0, monsGrid.tileSize, monsGrid.tileSize); end; end; end; @@ -774,25 +949,31 @@ procedure plrDebugDraw (); plr := gPlayers[0]; if (plr = nil) then exit; plr.getMapBox(px, py, pw, ph); - drawRect(px, py, pw, ph, 255, 0, 255, 200); + hlmContext.color := TGxRGBA.Create(255, 0, 255, 200); + hlmContext.rect(px, py, pw, ph); pdx := pmsCurMapX-(px+pw div 2); pdy := pmsCurMapY-(py+ph div 2); - drawLine(px+pw div 2, py+ph div 2, px+pw div 2+pdx, py+ph div 2+pdy, 255, 0, 255, 200); + 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); if (pan = nil) then begin - drawRect(px+pdx, py+pdy, pw, ph, 255, 255, 255, 180); + hlmContext.color := TGxRGBA.Create(255, 255, 255, 180); + hlmContext.rect(px+pdx, py+pdy, pw, ph); end else begin - drawRect(px+pdx, py+pdy, pw, ph, 255, 255, 0, 180); + hlmContext.color := TGxRGBA.Create(255, 255, 0, 180); + hlmContext.rect(px+pdx, py+pdy, pw, ph); end; - drawRect(ex, ey, pw, ph, 255, 127, 0, 180); + hlmContext.color := TGxRGBA.Create(255, 127, 0, 180); + hlmContext.rect(ex, ey, pw, ph); end; procedure hilightCell (cx, cy: Integer); begin - fillRect(cx, cy, monsGrid.tileSize, monsGrid.tileSize, 0, 128, 0, 64); + hlmContext.color := TGxRGBA.Create(0, 128, 0, 64); + hlmContext.fillRect(cx, cy, monsGrid.tileSize, monsGrid.tileSize); end; procedure hilightCell1 (cx, cy: Integer); @@ -800,7 +981,8 @@ procedure plrDebugDraw (); //e_WriteLog(Format('h1: (%d,%d)', [cx, cy]), MSG_NOTIFY); cx := cx and (not (monsGrid.tileSize-1)); cy := cy and (not (monsGrid.tileSize-1)); - fillRect(cx, cy, monsGrid.tileSize, monsGrid.tileSize, 255, 255, 0, 92); + hlmContext.color := TGxRGBA.Create(255, 255, 0, 92); + hlmContext.fillRect(cx, cy, monsGrid.tileSize, monsGrid.tileSize); end; function hilightWallTrc (pan: TPanel; tag: Integer; x, y, prevx, prevy: Integer): Boolean; @@ -808,7 +990,8 @@ procedure plrDebugDraw (); result := false; // don't stop if (pan = nil) then exit; // cell completion, ignore //e_WriteLog(Format('h1: (%d,%d)', [cx, cy]), MSG_NOTIFY); - fillRect(pan.X, pan.Y, pan.Width, pan.Height, 0, 128, 128, 64); + hlmContext.color := TGxRGBA.Create(0, 128, 128, 64); + hlmContext.fillRect(pan.X, pan.Y, pan.Width, pan.Height); end; function monsCollector (mon: TMonster; tag: Integer): Boolean; @@ -818,10 +1001,14 @@ procedure plrDebugDraw (); begin result := false; mon.getMapBox(mx, my, mw, mh); - e_DrawQuad(mx, my, mx+mw-1, my+mh-1, 255, 255, 0, 96); + hlmContext.color := TGxRGBA.Create(255, 255, 0, 160); + hlmContext.rect(mx, my, mw, mh); + //e_DrawQuad(mx, my, mx+mw-1, my+mh-1, 255, 255, 0, 96); if lineAABBIntersects(laserX0, laserY0, laserX1, laserY1, mx, my, mw, mh, ex, ey) then begin - e_DrawPoint(8, ex, ey, 0, 255, 0); + //e_DrawPoint(8, ex, ey, 0, 255, 0); + hlmContext.color := TGxRGBA.Create(0, 255, 0, 220); + hlmContext.fillRect(ex-2, ey-2, 7, 7); end; end; @@ -851,10 +1038,12 @@ procedure plrDebugDraw (); exit; end; mon.getMapBox(mx, my, mw, mh); - drawLine(mx+mw div 2, my+mh div 2, emx+emw div 2, emy+emh div 2, 255, 0, 0, 255); + hlmContext.color := TGxRGBA.Create(255, 0, 0); + hlmContext.line(mx+mw div 2, my+mh div 2, emx+emw div 2, emy+emh div 2); if (g_Map_traceToNearestWall(mx+mw div 2, my+mh div 2, emx+emw div 2, emy+emh div 2, @ex, @ey) <> nil) then begin - drawLine(mx+mw div 2, my+mh div 2, ex, ey, 0, 255, 0, 255); + hlmContext.color := TGxRGBA.Create(0, 255, 0); + hlmContext.line(mx+mw div 2, my+mh div 2, ex, ey); end; end; @@ -868,14 +1057,16 @@ procedure plrDebugDraw (); if (eplr = nil) then exit; eplr.getMapBox(emx, emy, emw, emh); mon.getMapBox(mx, my, mw, mh); - drawLine(mx+mw div 2, my+mh div 2, emx+emw div 2, emy+emh div 2, 255, 0, 0, 255); + hlmContext.color := TGxRGBA.Create(255, 0, 0); + hlmContext.line(mx+mw div 2, my+mh div 2, emx+emw div 2, emy+emh div 2); {$IF DEFINED(D2F_DEBUG)} mapGrid.dbgRayTraceTileHitCB := hilightCell1; {$ENDIF} if (g_Map_traceToNearestWall(mx+mw div 2, my+mh div 2, emx+emw div 2, emy+emh div 2, @ex, @ey) <> nil) then //if (mapGrid.traceRay(ex, ey, mx+mw div 2, my+mh div 2, emx+emw div 2, emy+emh div 2, hilightWallTrc, (GridTagWall or GridTagDoor)) <> nil) then begin - drawLine(mx+mw div 2, my+mh div 2, ex, ey, 0, 255, 0, 255); + hlmContext.color := TGxRGBA.Create(0, 255, 0); + hlmContext.line(mx+mw div 2, my+mh div 2, ex, ey); end; {$IF DEFINED(D2F_DEBUG)} mapGrid.dbgRayTraceTileHitCB := nil; @@ -892,23 +1083,26 @@ procedure plrDebugDraw (); if showMonsInfo then begin //fillRect(mx-4, my-7*8-6, 110, 7*8+6, 0, 0, 94, 250); - darkenRect(mx-4, my-7*8-6, 110, 7*8+6, 128); + hlmContext.font := 'msx'; + hlmContext.color := TGxRGBA.Create(255, 127, 0); + + hlmContext.darkenRect(mx-4, my-7*hlmContext.charWidth(' ')-6, 110, 7*hlmContext.charWidth(' ')+6, 128); my -= 8; my -= 2; // type - drawText6(mx, my, Format('%s(U:%u)', [monsTypeToString(mon.MonsterType), mon.UID]), 255, 127, 0); my -= 8; + hlmContext.drawText(mx, my, Format('%s(U:%u)', [monsTypeToString(mon.MonsterType), mon.UID])); my -= hlmContext.charWidth(' '); // beh - drawText6(mx, my, Format('Beh: %s', [monsBehToString(mon.MonsterBehaviour)]), 255, 127, 0); my -= 8; + hlmContext.drawText(mx, my, Format('Beh: %s', [monsBehToString(mon.MonsterBehaviour)])); my -= hlmContext.charWidth(' '); // state - drawText6(mx, my, Format('State:%s (%d)', [monsStateToString(mon.MonsterState), mon.MonsterSleep]), 255, 127, 0); my -= 8; + hlmContext.drawText(mx, my, Format('State:%s (%d)', [monsStateToString(mon.MonsterState), mon.MonsterSleep])); my -= hlmContext.charWidth(' '); // health - drawText6(mx, my, Format('Health:%d', [mon.MonsterHealth]), 255, 127, 0); my -= 8; + hlmContext.drawText(mx, my, Format('Health:%d', [mon.MonsterHealth])); my -= hlmContext.charWidth(' '); // ammo - drawText6(mx, my, Format('Ammo:%d', [mon.MonsterAmmo]), 255, 127, 0); my -= 8; + hlmContext.drawText(mx, my, Format('Ammo:%d', [mon.MonsterAmmo])); my -= hlmContext.charWidth(' '); // target - drawText6(mx, my, Format('TgtUID:%u', [mon.MonsterTargetUID]), 255, 127, 0); my -= 8; - drawText6(mx, my, Format('TgtTime:%d', [mon.MonsterTargetTime]), 255, 127, 0); my -= 8; + hlmContext.drawText(mx, my, Format('TgtUID:%u', [mon.MonsterTargetUID])); my -= hlmContext.charWidth(' '); + hlmContext.drawText(mx, my, Format('TgtTime:%d', [mon.MonsterTargetTime])); my -= hlmContext.charWidth(' '); end; drawMonsterTargetLine(); @@ -934,7 +1128,8 @@ procedure plrDebugDraw (); pan := g_Map_PanelByGUID(platMarkedGUID); if (pan = nil) then exit; mapGrid.forEachBodyCell(pan.proxyId, hilightCell); - drawRect(pan.x, pan.y, pan.width, pan.height, 0, 200, 0, 200); + hlmContext.color := TGxRGBA.Create(0, 200, 0, 200); + hlmContext.rect(pan.x, pan.y, pan.width, pan.height); end; procedure drawTrigger (var trig: TTrigger); @@ -945,24 +1140,26 @@ procedure plrDebugDraw (); begin pan := g_Map_PanelByGUID(pguid); if (pan = nil) then exit; - drawLine( - trig.trigCenter.x, trig.trigCenter.y, - pan.x+pan.width div 2, pan.y+pan.height div 2, - 255, 0, 255, 220); + hlmContext.color := TGxRGBA.Create(255, 0, 255, 220); + hlmContext.line(trig.trigCenter.x, trig.trigCenter.y, pan.x+pan.width div 2, pan.y+pan.height div 2); end; var tts: AnsiString; tx: Integer; begin - fillRect(trig.x, trig.y, trig.width, trig.height, 255, 0, 255, 96); + hlmContext.font := 'msx'; + hlmContext.color := TGxRGBA.Create(255, 0, 255, 96); + hlmContext.fillRect(trig.x, trig.y, trig.width, trig.height); tts := trigType2Str(trig.TriggerType); tx := trig.x+(trig.width-Length(tts)*6) div 2; - darkenRect(tx-2, trig.y-10, Length(tts)*6+4, 10, 64); - drawText6(tx, trig.y-9, tts, 255, 127, 0); + hlmContext.darkenRect(tx-2, trig.y-10, Length(tts)*6+4, 10, 64); + hlmContext.color := TGxRGBA.Create(255, 127, 0); + hlmContext.drawText(tx, trig.y-9, tts); tx := trig.x+(trig.width-Length(trig.mapId)*6) div 2; - darkenRect(tx-2, trig.y-20, Length(trig.mapId)*6+4, 10, 64); - drawText6(tx, trig.y-19, trig.mapId, 255, 255, 0); + hlmContext.darkenRect(tx-2, trig.y-20, Length(trig.mapId)*6+4, 10, 64); + hlmContext.color := TGxRGBA.Create(255, 255, 0); + hlmContext.drawText(tx, trig.y-19, trig.mapId); drawPanelDest(trig.trigPanelGUID); case trig.TriggerType of TRIGGER_NONE: begin end; @@ -983,15 +1180,15 @@ procedure plrDebugDraw (); begin if (trig.trigDataRec.trigTWidth > 0) and (trig.trigDataRec.trigTHeight > 0) then begin - fillRect( + hlmContext.color := TGxRGBA.Create(0, 255, 255, 42); + hlmContext.fillRect( trig.trigDataRec.trigTX, trig.trigDataRec.trigTY, - trig.trigDataRec.trigTWidth, trig.trigDataRec.trigTHeight, - 0, 255, 255, 42); - drawLine( + trig.trigDataRec.trigTWidth, trig.trigDataRec.trigTHeight); + hlmContext.color := TGxRGBA.Create(255, 0, 255, 220); + hlmContext.line( trig.trigCenter.x, trig.trigCenter.y, trig.trigDataRec.trigTX+trig.trigDataRec.trigTWidth div 2, - trig.trigDataRec.trigTY+trig.trigDataRec.trigTHeight div 2, - 255, 0, 255, 220); + trig.trigDataRec.trigTY+trig.trigDataRec.trigTHeight div 2); end; end; TRIGGER_SOUND: begin end; @@ -1030,13 +1227,13 @@ procedure plrDebugDraw (); if gib.alive then begin gib.getMapBox(px, py, pw, ph); - drawRect(px, py, pw, ph, 255, 0, 255); + hlmContext.color := TGxRGBA.Create(255, 0, 255); + hlmContext.rect(px, py, pw, ph); end; end; end; var - scisave: TScissorSave; mon: TMonster; mx, my, mw, mh: Integer; //pan: TPanel; @@ -1044,14 +1241,20 @@ var begin if (gPlayer1 = nil) then exit; - scisave.save(true); // enable scissoring - glPushMatrix(); + if (hlmContext = nil) then hlmContext := TGxContext.Create(); + + gxSetContext(hlmContext); try //glScissor(0, gWinSizeY-gPlayerScreenSize.Y-1, vpw, vph); - glScissor(0, gScreenHeight-gPlayerScreenSize.Y-1, gPlayerScreenSize.X, gPlayerScreenSize.Y); + //hlmContext.clip := TGxRect.Create(0, gScreenHeight-gPlayerScreenSize.Y-1, gPlayerScreenSize.X, gPlayerScreenSize.Y); + { glScalef(g_dbg_scale, g_dbg_scale, 1.0); glTranslatef(-vpx, -vpy, 0); + } + hlmContext.glSetScaleTrans(g_dbg_scale, -vpx, -vpy); + glEnable(GL_SCISSOR_TEST); + glScissor(0, gScreenHeight-gPlayerScreenSize.Y-1, gPlayerScreenSize.X, gPlayerScreenSize.Y); if (showGrid) then drawTileGrid(); drawOutlines(); @@ -1064,7 +1267,9 @@ begin if (mon <> nil) then begin mon.getMapBox(mx, my, mw, mh); - e_DrawQuad(mx, my, mx+mw-1, my+mh-1, 255, 0, 0, 30); + //e_DrawQuad(mx, my, mx+mw-1, my+mh-1, 255, 0, 0, 30); + hlmContext.color := TGxRGBA.Create(255, 0, 0, 220); + hlmContext.rect(mx, my, mw, mh); drawMonsterInfo(mon); end; end; @@ -1096,25 +1301,30 @@ begin *) finally - glPopMatrix(); - scisave.restore(); + gxSetContext(nil); end; - if showMapCurPos then drawText8(4, gWinSizeY-10, Format('mappos:(%d,%d)', [pmsCurMapX, pmsCurMapY]), 255, 255, 0); + if showMapCurPos then + begin + gxSetContext(hlmContext); + hlmContext.font := 'dos'; + hlmContext.color := TGxRGBA.Create(255, 255, 0); + hlmContext.drawText(4, gWinSizeY-10, Format('mappos:(%d,%d)', [pmsCurMapX, pmsCurMapY])); + gxSetContext(nil); + end; end; // ////////////////////////////////////////////////////////////////////////// // -function g_Holmes_MouseEvent (var ev: THMouseEvent): Boolean; +procedure g_Holmes_MouseEvent (var ev: THMouseEvent); var he: THMouseEvent; begin - if g_Game_IsNet then begin result := false; exit; end; - if not g_holmes_enabled then begin result := false; exit; end; + if g_Game_IsNet then exit; + if not g_holmes_enabled then exit; holmesInitCommands(); holmesInitBinds(); - result := true; msX := ev.x; msY := ev.y; msB := ev.bstate; @@ -1123,14 +1333,17 @@ begin he := ev; he.x := he.x; he.y := he.y; - if not uiMouseEvent(he) then plrDebugMouse(he); + uiMouseEvent(he); + if (not he.eaten) then plrDebugMouse(he); + ev.eat(); end; // ////////////////////////////////////////////////////////////////////////// // -function g_Holmes_KeyEvent (var ev: THKeyEvent): Boolean; -{$IF DEFINED(D2F_DEBUG)} +procedure g_Holmes_KeyEvent (var ev: THKeyEvent); var + doeat: Boolean = false; +{$IF DEFINED(D2F_DEBUG)} pan: TPanel; ex, ey: Integer; dx, dy: Integer; @@ -1141,22 +1354,24 @@ var end; begin - if g_Game_IsNet then begin result := false; exit; end; - if not g_holmes_enabled then begin result := false; exit; end; + if g_Game_IsNet then exit; + if not g_holmes_enabled then exit; holmesInitCommands(); holmesInitBinds(); - result := false; + 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: - result := true; + doeat := true; end; - if uiKeyEvent(ev) then begin result := true; exit; end; - if keybindExecute(ev) then begin result := true; exit; end; + + uiKeyEvent(ev); + if (ev.eaten) then exit; + if keybindExecute(ev) then begin ev.eat(); exit; end; // press if (ev.press) then begin @@ -1165,7 +1380,7 @@ begin 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 THKeyEvent.ModCtrl) <> 0) then begin - result := true; + ev.eat(); dx := pmsCurMapX; dy := pmsCurMapY; case ev.scan of @@ -1188,6 +1403,7 @@ begin end; {$ENDIF} end; + if (doeat) then ev.eat(); end; @@ -1495,15 +1711,16 @@ begin end; -function onMouseEvent (var ev: THMouseEvent): Boolean; +procedure onMouseEvent (var ev: THMouseEvent); begin - result := g_Holmes_MouseEvent(ev); + if not g_holmes_enabled then exit; + g_Holmes_MouseEvent(ev); end; -function onKeyEvent (var ev: THKeyEvent): Boolean; +procedure onKeyEvent (var ev: THKeyEvent); begin - if not g_holmes_enabled then begin result := false; exit; end; - result := g_Holmes_keyEvent(ev); + if not g_holmes_enabled then exit; + g_Holmes_KeyEvent(ev); end; @@ -1511,5 +1728,5 @@ begin evMouseCB := onMouseEvent; evKeyCB := onKeyEvent; - conRegVar('hlm_ui_scale', @gh_ui_scale, 0.01, 5.0, 'Holmes UI scale', '', false); + conRegVar('hlm_ui_scale', @fuiRenderScale, 0.01, 5.0, 'Holmes UI scale', '', false); end.