From 3d4d252857394f4e2bbcf72d706f654de40103d9 Mon Sep 17 00:00:00 2001 From: Ketmar Dark Date: Wed, 23 Aug 2017 21:22:58 +0300 Subject: [PATCH] fixed bug in grid update; one more mode for Holmes --- src/game/g_grid.pas | 34 ++++++++++++++++------------------ src/game/g_holmes.pas | 16 ++++++++++++++++ src/game/g_items.pas | 2 +- src/game/g_map.pas | 2 ++ src/game/g_monsters.pas | 8 +++++++- 5 files changed, 42 insertions(+), 20 deletions(-) diff --git a/src/game/g_grid.pas b/src/game/g_grid.pas index 2e7105e..b1b157f 100644 --- a/src/game/g_grid.pas +++ b/src/game/g_grid.pas @@ -395,6 +395,7 @@ begin for idx := 0 to High(mCells) do begin mCells[idx].bodies[0] := -1; + mCells[idx].bodies[GridCellBucketSize-1] := -1; // "has free room" flag mCells[idx].next := idx+1; end; mCells[High(mCells)].next := -1; // last cell @@ -446,7 +447,6 @@ procedure TBodyGridBase.forEachBodyCell (body: TBodyProxyId; cb: TCellQueryCB); var g, f, cidx: Integer; cc: PGridCell; - //px: PBodyProxyRec; begin if (body < 0) or (body > High(mProxies)) or not assigned(cb) then exit; for g := 0 to High(mGrid) do @@ -455,11 +455,10 @@ begin while (cidx <> -1) do begin cc := @mCells[cidx]; - for f := 0 to High(TGridCell.bodies) do + for f := 0 to GridCellBucketSize-1 do begin if (cc.bodies[f] = -1) then break; if (cc.bodies[f] = body) then cb((g mod mWidth)*mTileSize+mMinX, (g div mWidth)*mTileSize+mMinY); - //px := @mProxies[cc.bodies[f]]; end; // next cell cidx := cc.next; @@ -482,7 +481,7 @@ begin while (cidx <> -1) do begin cc := @mCells[cidx]; - for f := 0 to High(TGridCell.bodies) do + for f := 0 to GridCellBucketSize-1 do begin if (cc.bodies[f] = -1) then break; if cb(mProxies[cc.bodies[f]].mObj, mProxies[cc.bodies[f]].mTag) then begin result := mProxies[cc.bodies[f]].mObj; exit; end; @@ -560,7 +559,7 @@ begin for idx := mFreeCell to High(mCells) do begin mCells[idx].bodies[0] := -1; - mCells[idx].bodies[High(TGridCell.bodies)] := -1; // 'has free room' flag + mCells[idx].bodies[GridCellBucketSize-1] := -1; // 'has free room' flag mCells[idx].next := idx+1; end; mCells[High(mCells)].next := -1; // last cell @@ -569,7 +568,6 @@ begin pc := @mCells[result]; mFreeCell := pc.next; pc.next := -1; - //pc.bodies[0] := -1; Inc(mUsedCells); //e_WriteLog(Format('grid: allocated new cell #%d (total: %d)', [result, mUsedCells]), MSG_NOTIFY); end; @@ -582,7 +580,7 @@ begin with mCells[idx] do begin bodies[0] := -1; - bodies[High(TGridCell.bodies)] := -1; // 'has free room' flag + bodies[GridCellBucketSize-1] := -1; // 'has free room' flag next := mFreeCell; end; mFreeCell := idx; @@ -678,15 +676,16 @@ begin if (pc <> -1) then begin pi := @mCells[pc]; - if (pi.bodies[High(TGridCell.bodies)] = -1) then + // check "has room" flag + if (pi.bodies[GridCellBucketSize-1] = -1) then begin // can add here - for f := 0 to High(TGridCell.bodies) do + for f := 0 to GridCellBucketSize-1 do begin if (pi.bodies[f] = -1) then begin pi.bodies[f] := bodyId; - if (f+1 < Length(TGridCell.bodies)) then pi.bodies[f+1] := -1; + if (f+1 < GridCellBucketSize) then pi.bodies[f+1] := -1; exit; end; end; @@ -726,7 +725,7 @@ begin while (cidx <> -1) do begin pc := @mCells[cidx]; - for f := 0 to High(TGridCell.bodies) do + for f := 0 to GridCellBucketSize-1 do begin if (pc.bodies[f] = bodyId) then begin @@ -739,12 +738,12 @@ begin exit; end; // remove element from bucket - for c := f to High(TGridCell.bodies)-1 do + for c := f to GridCellBucketSize-2 do begin pc.bodies[c] := pc.bodies[c+1]; if (pc.bodies[c] = -1) then break; end; - pc.bodies[High(TGridCell.bodies)] := -1; // "has free room" flag + pc.bodies[GridCellBucketSize-1] := -1; // "has free room" flag exit; end; end; @@ -753,7 +752,6 @@ begin end; end; -// absolutely not tested procedure TBodyGridBase.removeInternal (body: TBodyProxyId); var px: PBodyProxyRec; @@ -1000,7 +998,7 @@ begin while (curci <> -1) do begin cc := @mCells[curci]; - for f := 0 to High(TGridCell.bodies) do + for f := 0 to GridCellBucketSize-1 do begin if (cc.bodies[f] = -1) then break; px := @mProxies[cc.bodies[f]]; @@ -1087,7 +1085,7 @@ begin while (curci <> -1) do begin cc := @mCells[curci]; - for f := 0 to High(TGridCell.bodies) do + for f := 0 to GridCellBucketSize-1 do begin if (cc.bodies[f] = -1) then break; px := @mProxies[cc.bodies[f]]; @@ -1392,7 +1390,7 @@ begin while (curci <> -1) do begin cc := @mCells[curci]; - for f := 0 to High(TGridCell.bodies) do + for f := 0 to GridCellBucketSize-1 do begin if (cc.bodies[f] = -1) then break; px := @mProxies[cc.bodies[f]]; @@ -1672,7 +1670,7 @@ begin while (curci <> -1) do begin cc := @mCells[curci]; - for f := 0 to High(TGridCell.bodies) do + for f := 0 to GridCellBucketSize-1 do begin if (cc.bodies[f] = -1) then break; px := @mProxies[cc.bodies[f]]; diff --git a/src/game/g_holmes.pas b/src/game/g_holmes.pas index 210368d..87788a4 100644 --- a/src/game/g_holmes.pas +++ b/src/game/g_holmes.pas @@ -104,6 +104,7 @@ var kbS: Word = 0; // keyboard modifiers state showMonsInfo: Boolean = false; showMonsLOS2Plr: Boolean = false; + showAllMonsCells: Boolean = false; // ////////////////////////////////////////////////////////////////////////// // @@ -372,6 +373,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; @@ -399,6 +406,8 @@ begin end; end; + if showAllMonsCells then g_Mons_ForEach(highlightAllMonsterCells); + //e_DrawPoint(16, laserX0, laserY0, 255, 255, 255); glPopMatrix(); @@ -453,6 +462,13 @@ begin 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; end; end; diff --git a/src/game/g_items.pas b/src/game/g_items.pas index 27dbc75..9956517 100644 --- a/src/game/g_items.pas +++ b/src/game/g_items.pas @@ -463,7 +463,7 @@ var begin if ForcedID < 0 then find_id := allocItem() else find_id := wantItemSlot(ForcedID); - {$IF DEFINED(D2F_DEBUG)}e_WriteLog(Format('allocated item #%d', [Integer(find_id)]), MSG_NOTIFY);{$ENDIF} + //{$IF DEFINED(D2F_DEBUG)}e_WriteLog(Format('allocated item #%d', [Integer(find_id)]), MSG_NOTIFY);{$ENDIF} it := @ggItems[find_id]; diff --git a/src/game/g_map.pas b/src/game/g_map.pas index bf4bd8a..746d85c 100644 --- a/src/game/g_map.pas +++ b/src/game/g_map.pas @@ -1139,10 +1139,12 @@ var // "enabled" flag has meaning only for doors and walls (engine assumes it); but meh... mapGrid.proxyEnabled[pan.proxyId] := pan.Enabled; {$IFDEF MAP_DEBUG_ENABLED_FLAG} + { if ((tag and (GridTagWall or GridTagDoor)) <> 0) then begin e_WriteLog(Format('INSERTED wall #%d(%d) enabled (%d)', [Integer(idx), Integer(pan.proxyId), Integer(mapGrid.proxyEnabled[pan.proxyId])]), MSG_NOTIFY); end; + } {$ENDIF} end; end; diff --git a/src/game/g_monsters.pas b/src/game/g_monsters.pas index ea7222f..05ec0b0 100644 --- a/src/game/g_monsters.pas +++ b/src/game/g_monsters.pas @@ -200,6 +200,8 @@ function g_Mons_ByIdx (uid: Integer): TMonster; inline; // can return null function g_Mons_ByIdx_NC (uid: Integer): TMonster; inline; +function g_Mons_TotalCount (): Integer; inline; + function g_Mons_IsAnyAliveAt (x, y: Integer; width, height: Integer): Boolean; function g_Mons_ForEach (cb: TEachMonsterCB): Boolean; @@ -4489,7 +4491,6 @@ begin if (result = nil) then raise Exception.Create('g_Mons_ByIdx: invalid monster id'); end; - // can return null function g_Mons_ByIdx_NC (uid: Integer): TMonster; inline; begin @@ -4497,6 +4498,11 @@ begin result := gMonsters[uid]; end; +function g_Mons_TotalCount (): Integer; inline; +begin + result := Length(gMonsters); +end; + function g_Mons_ForEach (cb: TEachMonsterCB): Boolean; var -- 2.29.2