X-Git-Url: https://deadsoftware.ru/gitweb?a=blobdiff_plain;f=src%2Fgame%2Fg_holmes.pas;h=d96d234503f202420944fdd9c4e7e840fb602745;hb=52cb3c5b37a706c085c14e89b33361ac349bbe74;hp=d03d7b42840010d4b9ace73684791a7c494b4af3;hpb=71d6aff3ac19f4c810c1be46816f395447b76d87;p=d2df-sdl.git diff --git a/src/game/g_holmes.pas b/src/game/g_holmes.pas index d03d7b4..d96d234 100644 --- a/src/game/g_holmes.pas +++ b/src/game/g_holmes.pas @@ -37,15 +37,15 @@ type WheelDown = $0010; // event types - Motion = 0; + Release = 0; Press = 1; - Release = 2; + Motion = 2; public kind: Byte; // motion, press, release x, y: Integer; dx, dy: Integer; // for wheel this is wheel motion, otherwise this is relative mouse motion - but: Word; // current pressed button or 0 + but: Word; // current pressed/released button, or 0 for motion bstate: Word; // button state kstate: Word; // keyboard state (see THKeyEvent); end; @@ -53,9 +53,21 @@ type THKeyEvent = record public const + // modifiers ModCtrl = $0001; ModAlt = $0002; ModShift = $0004; + + // event types + Release = 0; + Press = 1; + + public + kind: Byte; + scan: Word; // SDL_SCANCODE_XXX + sym: Word; // SDLK_XXX + bstate: Word; // button state + kstate: Word; // keyboard state end; @@ -80,7 +92,7 @@ var implementation uses - SysUtils, GL, + SysUtils, GL, SDL2, MAPDEF, g_options; @@ -90,11 +102,17 @@ var msY: Integer = -666; msB: Word = 0; // button state kbS: Word = 0; // keyboard modifiers state + showGrid: Boolean = true; + showMonsInfo: Boolean = false; + showMonsLOS2Plr: Boolean = false; + showAllMonsCells: Boolean = false; + showMapCurPos: Boolean = false; // ////////////////////////////////////////////////////////////////////////// // {$INCLUDE g_holmes.inc} + // ////////////////////////////////////////////////////////////////////////// // procedure g_Holmes_VidModeChanged (); begin @@ -128,6 +146,7 @@ var laserX0, laserY0, laserX1, laserY1: Integer; monMarkedUID: Integer = -1; + procedure g_Holmes_plrView (viewPortX, viewPortY, viewPortW, viewPortH: Integer); begin vpSet := true; @@ -144,6 +163,7 @@ begin laserY0 := ay0; laserX1 := ax1; laserY1 := ay1; + laserSet := laserSet; // shut up, fpc! end; @@ -156,7 +176,11 @@ procedure plrDebugMouse (var ev: THMouseEvent); function wallToggle (pan: TPanel; tag: Integer): Boolean; begin result := false; // don't stop - if pan.Enabled then g_Map_DisableWall(pan.arrIdx) else g_Map_EnableWall(pan.arrIdx); + 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 ((kbS and THKeyEvent.ModAlt) <> 0) then + begin + if pan.Enabled then g_Map_DisableWall(pan.arrIdx) else g_Map_EnableWall(pan.arrIdx); + end; end; function monsAtDump (mon: TMonster; tag: Integer): Boolean; @@ -175,9 +199,11 @@ procedure plrDebugMouse (var ev: THMouseEvent); begin //e_WriteLog(Format('mouse: x=%d; y=%d; but=%d; bstate=%d', [msx, msy, but, bstate]), MSG_NOTIFY); - if (gPlayer1 = nil) then exit; + if (gPlayer1 = nil) or not vpSet then exit; if (ev.kind <> THMouseEvent.Press) then exit; + e_WriteLog(Format('mev: %d', [Integer(ev.kind)]), MSG_NOTIFY); + if (ev.but = THMouseEvent.Left) then begin if ((kbS and THKeyEvent.ModShift) <> 0) then @@ -190,7 +216,9 @@ begin else begin // toggle wall + e_WriteLog('=== TOGGLE WALL ===', MSG_NOTIFY); mapGrid.forEachAtPoint(pmsCurMapX, pmsCurMapY, wallToggle, (GridTagWall or GridTagDoor)); + e_WriteLog('--- toggle wall ---', MSG_NOTIFY); end; exit; end; @@ -235,6 +263,20 @@ procedure plrDebugDraw (); fillRect(cx, cy, monsGrid.tileSize, monsGrid.tileSize, 0, 128, 0, 64); end; + procedure hilightCell1 (cx, cy: Integer); + begin + //e_WriteLog(Format('h1: (%d,%d)', [cx, cy]), MSG_NOTIFY); + fillRect(cx, cy, monsGrid.tileSize, monsGrid.tileSize, 255, 255, 0, 92); + end; + + function hilightWallTrc (pan: TPanel; tag: Integer; x, y, prevx, prevy: Integer): Boolean; + begin + 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); + end; + function monsCollector (mon: TMonster; tag: Integer): Boolean; var ex, ey: Integer; @@ -252,9 +294,60 @@ procedure plrDebugDraw (); procedure drawMonsterInfo (mon: TMonster); var mx, my, mw, mh: Integer; - emx, emy, emw, emh: Integer; - enemy: TMonster; - eplr: TPlayer; + + procedure drawMonsterTargetLine (); + var + emx, emy, emw, emh: Integer; + enemy: TMonster; + eplr: TPlayer; + ex, ey: Integer; + begin + if (g_GetUIDType(mon.MonsterTargetUID) = UID_PLAYER) then + begin + eplr := g_Player_Get(mon.MonsterTargetUID); + if (eplr <> nil) then eplr.getMapBox(emx, emy, emw, emh) else exit; + end + else if (g_GetUIDType(mon.MonsterTargetUID) = UID_MONSTER) then + begin + enemy := g_Monsters_ByUID(mon.MonsterTargetUID); + if (enemy <> nil) then enemy.getMapBox(emx, emy, emw, emh) else exit; + end + else + begin + 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); + 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); + end; + end; + + procedure drawLOS2Plr (); + var + emx, emy, emw, emh: Integer; + eplr: TPlayer; + ex, ey: Integer; + begin + eplr := gPlayers[0]; + 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); + {$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); + end; + {$IF DEFINED(D2F_DEBUG)} + //mapGrid.dbgRayTraceTileHitCB := nil; + {$ENDIF} + end; + begin if (mon = nil) then exit; mon.getMapBox(mx, my, mw, mh); @@ -262,7 +355,7 @@ procedure plrDebugDraw (); monsGrid.forEachBodyCell(mon.proxyId, hilightCell); - if ((kbS and THKeyEvent.ModCtrl) <> 0) then + if showMonsInfo then begin //fillRect(mx-4, my-7*8-6, 110, 7*8+6, 0, 0, 94, 250); shadeRect(mx-4, my-7*8-6, 110, 7*8+6, 128); @@ -282,29 +375,10 @@ procedure plrDebugDraw (); // 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; - - mon.getMapBox(mx, my, mw, mh); - end; - - if (g_GetUIDType(mon.MonsterTargetUID) = UID_PLAYER) then - begin - eplr := g_Player_Get(mon.MonsterTargetUID); - if (eplr <> nil) then - begin - eplr.getMapBox(emx, emy, emw, emh); - drawLine(mx+mw div 2, my+mh div 2, emx+emw div 2, emy+emh div 2, 255, 0, 0, 128); - end; - end - else if (g_GetUIDType(mon.MonsterTargetUID) = UID_MONSTER) then - begin - enemy := g_Monsters_ByUID(mon.MonsterTargetUID); - if (enemy <> nil) then - begin - enemy.getMapBox(emx, emy, emw, emh); - drawLine(mx+mw div 2, my+mh div 2, emx+emw div 2, emy+emh div 2, 255, 0, 0, 128); - end; end; + drawMonsterTargetLine(); + if showMonsLOS2Plr then drawLOS2Plr(); { property MonsterRemoved: Boolean read FRemoved write FRemoved; property MonsterPain: Integer read FPain write FPain; @@ -312,6 +386,12 @@ procedure plrDebugDraw (); } end; + function highlightAllMonsterCells (mon: TMonster): Boolean; + begin + result := false; // don't stop + monsGrid.forEachBodyCell(mon.proxyId, hilightCell); + end; + var mon: TMonster; mx, my, mw, mh: Integer; @@ -324,9 +404,9 @@ begin glPushMatrix(); glTranslatef(-vpx, -vpy, 0); - drawTileGrid(); + if (showGrid) then drawTileGrid(); - g_Mons_AlongLine(laserX0, laserY0, laserX1, laserY1, monsCollector, true); + if (laserSet) then g_Mons_AlongLine(laserX0, laserY0, laserX1, laserY1, monsCollector, true); if (monMarkedUID <> -1) then begin @@ -339,9 +419,11 @@ begin end; end; - //e_DrawPoint(16, laserX0, laserY0, 255, 255, 255); + if showAllMonsCells then g_Mons_ForEach(highlightAllMonsterCells); glPopMatrix(); + + if showMapCurPos then drawText8(4, gWinSizeY-10, Format('mappos:(%d,%d)', [pmsCurMapX, pmsCurMapY]), 255, 255, 0); end; @@ -353,13 +435,128 @@ begin msY := ev.y; msB := ev.bstate; kbS := ev.kstate; + msB := msB; plrDebugMouse(ev); end; function g_Holmes_KeyEvent (var ev: THKeyEvent): Boolean; +var + mon: TMonster; + pan: TPanel; + x, y, w, h: Integer; + ex, ey: Integer; + dx, dy: Integer; + + procedure dummyWallTrc (cx, cy: Integer); + begin + end; + begin 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; + end; + // press + if (ev.kind = THKeyEvent.Press) then + begin + // M-M: one monster think step + if (ev.scan = SDL_SCANCODE_M) and ((ev.kstate and THKeyEvent.ModAlt) <> 0) then + begin + result := true; + gmon_debug_think := false; + gmon_debug_one_think_step := true; // do one step + exit; + end; + // M-I: toggle monster info + if (ev.scan = SDL_SCANCODE_I) and ((ev.kstate and THKeyEvent.ModAlt) <> 0) then + begin + result := true; + showMonsInfo := not showMonsInfo; + exit; + end; + // M-L: toggle monster LOS to player + if (ev.scan = SDL_SCANCODE_L) and ((ev.kstate and THKeyEvent.ModAlt) <> 0) then + begin + result := true; + showMonsLOS2Plr := not showMonsLOS2Plr; + exit; + end; + // M-G: toggle "show all cells occupied by monsters" + if (ev.scan = SDL_SCANCODE_G) and ((ev.kstate and THKeyEvent.ModAlt) <> 0) then + begin + result := true; + showAllMonsCells := not showAllMonsCells; + exit; + end; + // M-A: wake up monster + if (ev.scan = SDL_SCANCODE_A) and ((ev.kstate and THKeyEvent.ModAlt) <> 0) then + begin + result := true; + if (monMarkedUID <> -1) then + begin + mon := g_Monsters_ByUID(monMarkedUID); + if (mon <> nil) then mon.WakeUp(); + end; + exit; + end; + // C-T: teleport player + if (ev.scan = SDL_SCANCODE_T) and ((ev.kstate and THKeyEvent.ModCtrl) <> 0) then + begin + result := true; + //e_WriteLog(Format('TELEPORT: (%d,%d)', [pmsCurMapX, pmsCurMapY]), MSG_NOTIFY); + if (gPlayers[0] <> nil) then + begin + gPlayers[0].getMapBox(x, y, w, h); + gPlayers[0].TeleportTo(pmsCurMapX-w div 2, pmsCurMapY-h div 2, true, 69); // 69: don't change dir + end; + exit; + end; + // C-P: show cursor position on the map + if (ev.scan = SDL_SCANCODE_P) and ((ev.kstate and THKeyEvent.ModCtrl) <> 0) then + begin + result := true; + showMapCurPos := not showMapCurPos; + exit; + end; + // C-G: toggle grid + if (ev.scan = SDL_SCANCODE_G) and ((ev.kstate and THKeyEvent.ModCtrl) <> 0) then + begin + result := true; + showGrid := not showGrid; + exit; + end; + // 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 THKeyEvent.ModCtrl) <> 0) then + begin + result := true; + dx := pmsCurMapX; + dy := pmsCurMapY; + case ev.scan of + SDL_SCANCODE_UP: dy -= 120; + SDL_SCANCODE_DOWN: dy += 120; + SDL_SCANCODE_LEFT: dx -= 120; + SDL_SCANCODE_RIGHT: dx += 120; + end; + {$IF DEFINED(D2F_DEBUG)} + //mapGrid.dbgRayTraceTileHitCB := dummyWallTrc; + mapGrid.dbgShowTraceLog := true; + {$ENDIF} + pan := g_Map_traceToNearest(pmsCurMapX, pmsCurMapY, dx, dy, (GridTagWall or GridTagDoor or GridTagStep or GridTagAcid1 or GridTagAcid2 or GridTagWater), @ex, @ey); + {$IF DEFINED(D2F_DEBUG)} + //mapGrid.dbgRayTraceTileHitCB := nil; + mapGrid.dbgShowTraceLog := false; + {$ENDIF} + e_LogWritefln('v-trace: (%d,%d)-(%d,%d); end=(%d,%d); hit=%d', [pmsCurMapX, pmsCurMapY, dx, dy, ex, ey, (pan <> nil)]); + exit; + end; + end; end; @@ -381,6 +578,8 @@ begin //drawText8Prop(10, 20, 'Hi there, I''m Holmes!', 255, 255, 0); drawCursor(); + + laserSet := false; end;