X-Git-Url: http://deadsoftware.ru/gitweb?a=blobdiff_plain;f=src%2Fgame%2Fg_player.pas;h=69cc9021fc74547423ced6a82f1c626c4155cb93;hb=c185246bfc49a2ae31fc79ef7c73dc6bcc1073e2;hp=8981721df6bbddeb5e0cde76baa242b1e8c0cab6;hpb=b79ddd98d923ee15f4bfd1db5111e669fc19964a;p=d2df-sdl.git diff --git a/src/game/g_player.pas b/src/game/g_player.pas index 8981721..69cc902 100644 --- a/src/game/g_player.pas +++ b/src/game/g_player.pas @@ -249,6 +249,11 @@ type FDummy: Boolean; FFireTime: Integer; + // debug: viewport offset + viewPortX, viewPortY, viewPortW, viewPortH: Integer; + + function isValidViewPort (): Boolean; inline; + constructor Create(); virtual; destructor Destroy(); override; procedure Respawn(Silent: Boolean; Force: Boolean = False); virtual; @@ -521,7 +526,7 @@ uses e_log, g_map, g_items, g_console, SysUtils, g_gfx, Math, g_options, g_triggers, g_menu, MAPDEF, g_game, g_grid, wadreader, g_main, g_monsters, CONFIG, g_language, - g_net, g_netmsg; + g_net, g_netmsg, g_window, GL; type TBotProfile = record @@ -1845,6 +1850,8 @@ end; { T P l a y e r : } +function TPlayer.isValidViewPort (): Boolean; inline; begin result := (viewPortW > 0) and (viewPortH > 0); end; + procedure TPlayer.BFGHit(); begin g_Weapon_BFGHit(FObj.X+FObj.Rect.X+(FObj.Rect.Width div 2), @@ -1988,6 +1995,11 @@ end; constructor TPlayer.Create(); begin + viewPortX := 0; + viewPortY := 0; + viewPortW := 0; + viewPortH := 0; + FIamBot := False; FDummy := False; FSpawned := False; @@ -2303,20 +2315,124 @@ begin DrawAim(); end; + +var + plrMouseX: Integer = -666; + plrMouseY: Integer = -666; + vpx, vpy: Integer; + //vpw, vph: Integer; + laserX0, laserY0, laserX1, laserY1: Integer; + monMarkedUID: Integer = -1; + +function pmsCurMapX (): Integer; inline; begin result := plrMouseX+vpx; end; +function pmsCurMapY (): Integer; inline; begin result := plrMouseY+vpy; end; + +procedure plrDebugMouse (msx, msy, but: Integer; bstate: Integer); + + 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); + end; + + function monsAtDump (mon: TMonster; tag: Integer): Boolean; + begin + result := false; // don't stop + e_WriteLog(Format('monster #%d; UID=%d', [mon.arrIdx, mon.UID]), MSG_NOTIFY); + monMarkedUID := mon.UID; + //if pan.Enabled then g_Map_DisableWall(pan.arrIdx) else g_Map_EnableWall(pan.arrIdx); + end; + +begin + plrMouseX := msx; + plrMouseY := msy; + //e_WriteLog(Format('mouse: x=%d; y=%d; but=%d; bstate=%d', [msx, msy, but, bstate]), MSG_NOTIFY); + if (gPlayer1 = nil) then exit; + + if (but = MouseLeft) then + begin + mapGrid.forEachAtPoint(pmsCurMapX, pmsCurMapY, wallToggle, (GridTagWall or GridTagDoor)); + exit; + end; + + if (but = MouseRight) then + begin + monMarkedUID := -1; + e_WriteLog('===========================', MSG_NOTIFY); + monsGrid.forEachAtPoint(pmsCurMapX, pmsCurMapY, monsAtDump); + e_WriteLog('---------------------------', MSG_NOTIFY); + exit; + end; +end; + + +procedure plrDebugDrawMouse (); + + function monsCollector (mon: TMonster; tag: Integer): Boolean; + var + ex, ey: Integer; + mx, my, mw, mh: Integer; + begin + result := false; + mon.getMapBox(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); + end; + end; + +var + mon: TMonster; + mx, my, mw, mh: Integer; +begin + e_DrawPoint(4, plrMouseX, plrMouseY, 255, 0, 255); + if (gPlayer1 = nil) then exit; + + //e_WriteLog(Format('(%d,%d)-(%d,%d)', [laserX0, laserY0, laserX1, laserY1]), MSG_NOTIFY); + + glPushMatrix(); + glTranslatef(-vpx, -vpy, 0); + + g_Mons_AlongLine(laserX0, laserY0, laserX1, laserY1, monsCollector, true); + + if (monMarkedUID <> -1) then + begin + mon := g_Monsters_ByUID(monMarkedUID); + 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); + end; + end; + + //e_DrawPoint(16, laserX0, laserY0, 255, 255, 255); + + glPopMatrix(); +end; + + procedure TPlayer.DrawAim(); procedure drawCast (sz: Integer; ax0, ay0, ax1, ay1: Integer); - function monsCollector (mon: TMonster; tag: Integer): Boolean; + procedure drawTileGrid (); var - ex, ey: Integer; - mx, my, mw, mh: Integer; + x, y: Integer; begin - result := false; - mon.getMapBox(mx, my, mw, mh); - e_DrawQuad(mx, my, mx+mw-1, my+mh-1, 255, 255, 0, 96); - if lineAABBIntersects(ax0, ay0, ax1, ay1, mx, my, mw, mh, ex, ey) then + y := mapGrid.gridY0; + while (y < mapGrid.gridY0+mapGrid.gridHeight) do begin - e_DrawPoint(8, ex, ey, 0, 255, 0); + x := mapGrid.gridX0; + while (x < mapGrid.gridX0+mapGrid.gridWidth) do + begin + if (x+mapGrid.tileSize > viewPortX) and (y+mapGrid.tileSize > viewPortY) and + (x < viewPortX+viewPortW) and (y < viewPortY+viewPortH) then + begin + e_DrawQuad(x, y, x+mapGrid.tileSize-1, y+mapGrid.tileSize-1, 96, 96, 96, 96); + end; + Inc(x, mapGrid.tileSize); + end; + Inc(y, mapGrid.tileSize); end; end; @@ -2325,11 +2441,25 @@ procedure TPlayer.DrawAim(); //mon: TMonster; //mx, my, mw, mh: Integer; begin + if isValidViewPort and (self = gPlayer1) then + begin + vpx := viewPortX; + vpy := viewPortY; + //vpw := viewPortW; + //vpy := viewPortH; + evMouseCB := plrDebugMouse; + postdrawMouse := plrDebugDrawMouse; + end; + + laserX0 := ax0; + laserY0 := ay0; + laserX1 := ax1; + laserY1 := ay1; + e_DrawLine(sz, ax0, ay0, ax1, ay1, 255, 0, 0, 96); - if g_Map_traceToNearestWall(ax0, ay0, ax1, ay1, @ex, @ey) then + if (g_Map_traceToNearestWall(ax0, ay0, ax1, ay1, @ex, @ey) <> nil) then begin e_DrawLine(sz, ax0, ay0, ex, ey, 0, 255, 0, 96); - e_DrawPoint(4, ex, ey, 255, 127, 0); end else begin @@ -2353,7 +2483,7 @@ procedure TPlayer.DrawAim(); end; } - g_Mons_AlongLine(ax0, ay0, ax1, ay1, monsCollector, true); + drawTileGrid(); end; var @@ -2442,10 +2572,10 @@ begin end; xx := Trunc(Cos(-DegToRad(angle)) * len) + wx; yy := Trunc(Sin(-DegToRad(angle)) * len) + wy; - {$IF FALSE} - e_DrawLine(sz, wx, wy, xx, yy, 255, 0, 0, 96); - {$ELSE} + {$IF DEFINED(D2F_DEBUG)} drawCast(sz, wx, wy, xx, yy); + {$ELSE} + e_DrawLine(sz, wx, wy, xx, yy, 255, 0, 0, 96); {$ENDIF} end;