X-Git-Url: https://deadsoftware.ru/gitweb?a=blobdiff_plain;f=src%2Fgame%2Fg_player.pas;h=8981721df6bbddeb5e0cde76baa242b1e8c0cab6;hb=b79ddd98d923ee15f4bfd1db5111e669fc19964a;hp=c1b7c087645cce6d7e413ff3237812e18e5a06ca;hpb=829537fc7b2b29baaab7287e54fba2cdd8d00b5c;p=d2df-sdl.git diff --git a/src/game/g_player.pas b/src/game/g_player.pas index c1b7c08..8981721 100644 --- a/src/game/g_player.pas +++ b/src/game/g_player.pas @@ -314,6 +314,8 @@ type //WARNING! this does nothing for now, but still call it! procedure positionChanged (); //WARNING! call this after monster position was changed, or coldet will not work right! + procedure getMapBox (out x, y, w, h: Integer); inline; + property Name: String read FName write FName; property Model: TPlayerModel read FModel; property Health: Integer read FHealth write FHealth; @@ -517,8 +519,9 @@ implementation uses e_log, g_map, g_items, g_console, SysUtils, g_gfx, Math, - g_options, g_triggers, g_menu, MAPDEF, g_game, - wadreader, g_main, g_monsters, CONFIG, g_language, g_net, g_netmsg; + g_options, g_triggers, g_menu, MAPDEF, g_game, g_grid, + wadreader, g_main, g_monsters, CONFIG, g_language, + g_net, g_netmsg; type TBotProfile = record @@ -2301,6 +2304,58 @@ begin end; procedure TPlayer.DrawAim(); + procedure drawCast (sz: Integer; ax0, ay0, ax1, ay1: Integer); + + 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(ax0, ay0, ax1, ay1, mx, my, mw, mh, ex, ey) then + begin + e_DrawPoint(8, ex, ey, 0, 255, 0); + end; + end; + + var + ex, ey: Integer; + //mon: TMonster; + //mx, my, mw, mh: Integer; + begin + e_DrawLine(sz, ax0, ay0, ax1, ay1, 255, 0, 0, 96); + if g_Map_traceToNearestWall(ax0, ay0, ax1, ay1, @ex, @ey) then + begin + e_DrawLine(sz, ax0, ay0, ex, ey, 0, 255, 0, 96); + e_DrawPoint(4, ex, ey, 255, 127, 0); + end + else + begin + e_DrawLine(sz, ax0, ay0, ex, ey, 0, 0, 255, 96); + end; + + { + mon := g_Mons_ByIdx(0); + mon.getMapBox(mx, my, mw, mh); + ax1 := mx+mw div 2; + ay1 := my+mh div 2; + e_DrawLine(2, ax0, ay0, ax1, ay1, 0, 96, 96, 96); + + if lineAABBIntersects(ax0, ay0, ax1, ay1, mx, my, mw, mh, ex, ey) then + begin + e_DrawLine(2, ax0, ay0, ex, ey, 255, 255, 0, 96); + end + else + begin + e_DrawLine(2, ax0, ay0, ex, ey, 255, 127, 0, 96); + end; + } + + g_Mons_AlongLine(ax0, ay0, ax1, ay1, monsCollector, true); + end; + var wx, wy, xx, yy: Integer; angle: SmallInt; @@ -2387,7 +2442,11 @@ 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} + drawCast(sz, wx, wy, xx, yy); + {$ENDIF} end; procedure TPlayer.DrawGUI(); @@ -3121,7 +3180,7 @@ begin end else if g_GetUIDType(SpawnerUID) = UID_MONSTER then begin // Óáèò ìîíñòðîì - mon := g_Monsters_Get(SpawnerUID); + mon := g_Monsters_ByUID(SpawnerUID); if mon = nil then s := '?' else @@ -4813,7 +4872,7 @@ begin DecMin(FPain, 5, 0); DecMin(FPickup, 1, 0); - if FLive and (FObj.Y > gMapInfo.Height+128) and AnyServer then + if FLive and (FObj.Y > Integer(gMapInfo.Height)+128) and AnyServer then begin // Îáíóëèòü äåéñòâèÿ ïðèìî÷åê, ÷òîáû ôîí ïðîïàë FMegaRulez[MR_SUIT] := 0; @@ -4998,6 +5057,14 @@ begin if FKeys[b].Time = 0 then FKeys[b].Pressed := False else Dec(FKeys[b].Time); end; +procedure TPlayer.getMapBox (out x, y, w, h: Integer); inline; +begin + x := FObj.X+PLAYER_RECT.X; + y := FObj.Y+PLAYER_RECT.Y; + w := PLAYER_RECT.Width; + h := PLAYER_RECT.Height; +end; + function TPlayer.Collide(X, Y: Integer; Width, Height: Word): Boolean; begin Result := g_Collide(FObj.X+PLAYER_RECT.X, @@ -6304,10 +6371,10 @@ var vsPlayer, vsMonster, ok: Boolean; - function monsUpdate (monidx: Integer; mon: TMonster): Boolean; + function monsUpdate (mon: TMonster): Boolean; begin result := false; // don't stop - if (mon <> nil) and (mon.Live) and (mon.MonsterType <> MONSTER_BARREL) then + if mon.Live and (mon.MonsterType <> MONSTER_BARREL) then begin if not TargetOnScreen(mon.Obj.X+mon.Obj.Rect.X, mon.Obj.Y+mon.Obj.Rect.Y) then exit; @@ -6393,7 +6460,7 @@ begin if (g_GetUIDType(Target.UID) = UID_MONSTER) and vsMonster then begin // Ìîíñòð - mon := g_Monsters_Get(Target.UID); + mon := g_Monsters_ByUID(Target.UID); if mon <> nil then begin Target.X := mon.Obj.X; @@ -6626,7 +6693,7 @@ begin end else begin // Öåëü - ìîíñòð - mon := g_Monsters_Get(Target.UID); + mon := g_Monsters_ByUID(Target.UID); if (mon = nil) or (not mon.Live) then Target.UID := 0; // òî çàáûòü öåëü end; @@ -7378,7 +7445,7 @@ begin if (g_GetUIDType(FLastSpawnerUID) = UID_MONSTER) and LongBool(gGameSettings.Options and GAME_OPTION_BOTVSMONSTER) then begin // Ìîíñòð - mon := g_Monsters_Get(FLastSpawnerUID); + mon := g_Monsters_ByUID(FLastSpawnerUID); ok := not TargetOnScreen(mon.Obj.X + mon.Obj.Rect.X, mon.Obj.Y + mon.Obj.Rect.Y); end;