From e969a8ad0167d0375a040ae1a3acc4e04ea39401 Mon Sep 17 00:00:00 2001 From: Anders Jenbo Date: Fri, 21 Apr 2023 06:09:44 +0200 Subject: [PATCH] Invert player to vision relation --- Source/items.cpp | 2 +- Source/levels/gendung.cpp | 4 +- Source/levels/gendung.h | 2 +- Source/lighting.cpp | 122 +++++++++++--------------------------- Source/lighting.h | 11 ++-- Source/loadsave.cpp | 31 +++++----- Source/missiles.cpp | 2 +- Source/msg.cpp | 2 +- Source/objects.cpp | 2 +- Source/player.cpp | 6 +- Source/player.h | 1 - 11 files changed, 67 insertions(+), 118 deletions(-) diff --git a/Source/items.cpp b/Source/items.cpp index cec7de76c..a63dae103 100644 --- a/Source/items.cpp +++ b/Source/items.cpp @@ -2661,7 +2661,7 @@ void CalcPlrItemVals(Player &player, bool loadgfx) if (player._pLightRad != lrad) { ChangeLightRadius(player.lightId, lrad); - ChangeVisionRadius(player._pvid, lrad); + ChangeVisionRadius(player.getId(), lrad); player._pLightRad = lrad; } diff --git a/Source/levels/gendung.cpp b/Source/levels/gendung.cpp index a86e87413..9eb65f790 100644 --- a/Source/levels/gendung.cpp +++ b/Source/levels/gendung.cpp @@ -36,7 +36,7 @@ dungeon_type setlvltype; Point ViewPosition; uint_fast8_t MicroTileLen; int8_t TransVal; -bool TransList[256]; +std::array TransList; uint16_t dPiece[MAXDUNX][MAXDUNY]; MICROS DPieceMicros[MAXTILES]; int8_t dTransVal[MAXDUNX][MAXDUNY]; @@ -501,7 +501,7 @@ void SetDungeonMicros() void DRLG_InitTrans() { memset(dTransVal, 0, sizeof(dTransVal)); - memset(TransList, 0, sizeof(TransList)); + TransList = {}; // TODO duplicate reset in InitLighting() TransVal = 1; } diff --git a/Source/levels/gendung.h b/Source/levels/gendung.h index db21f7994..6e4dcea02 100644 --- a/Source/levels/gendung.h +++ b/Source/levels/gendung.h @@ -186,7 +186,7 @@ extern DVL_API_FOR_TEST Point ViewPosition; extern uint_fast8_t MicroTileLen; extern int8_t TransVal; /** Specifies the active transparency indices. */ -extern bool TransList[256]; +extern std::array TransList; /** Contains the piece IDs of each tile on the map. */ extern DVL_API_FOR_TEST uint16_t dPiece[MAXDUNX][MAXDUNY]; /** Map of micros that comprises a full tile for any given dungeon piece. */ diff --git a/Source/lighting.cpp b/Source/lighting.cpp index 0d0991a5e..5e7494074 100644 --- a/Source/lighting.cpp +++ b/Source/lighting.cpp @@ -16,11 +16,10 @@ namespace devilution { +std::array VisionActive; Light VisionList[MAXVISION]; -int VisionCount; -int VisionId; Light Lights[MAXLIGHTS]; -uint8_t ActiveLights[MAXLIGHTS]; +std::array ActiveLights; int ActiveLightCount; std::array, NumLightingLevels> LightTables; std::array InfravisionTable; @@ -451,19 +450,13 @@ void InitLighting() ActiveLightCount = 0; UpdateLighting = false; UpdateVision = false; - VisionCount = 0; - VisionId = 1; #ifdef _DEBUG DisableLighting = false; #endif - for (int i = 0; i < MAXLIGHTS; i++) { - ActiveLights[i] = i; - } - - for (int i = 0; i < TransVal; i++) { - TransList[i] = false; - } + std::iota(ActiveLights.begin(), ActiveLights.end(), 0); + VisionActive = {}; + TransList = {}; } int AddLight(Point position, uint8_t radius) @@ -618,54 +611,36 @@ void SavePreLighting() memcpy(dPreLight, dLight, sizeof(dPreLight)); } -int AddVision(Point position, int r, bool mine) +void ActivateVision(Point position, int r, int id) { - if (VisionCount >= MAXVISION) - return -1; - - auto &vision = VisionList[VisionCount]; + auto &vision = VisionList[id]; vision.position.tile = position; vision.radius = r; - vision._lid = VisionId; vision.isInvalid = false; vision.hasChanged = false; - vision._lflags = mine; + VisionActive[id] = true; - VisionId++; - VisionCount++; UpdateVision = true; - - return vision._lid; } void ChangeVisionRadius(int id, int r) { - for (int i = 0; i < VisionCount; i++) { - auto &vision = VisionList[i]; - if (vision._lid != id) - continue; - - vision.hasChanged = true; - vision.position.old = vision.position.tile; - vision.oldRadius = vision.radius; - vision.radius = r; - UpdateVision = true; - } + auto &vision = VisionList[id]; + vision.hasChanged = true; + vision.position.old = vision.position.tile; + vision.oldRadius = vision.radius; + vision.radius = r; + UpdateVision = true; } void ChangeVisionXY(int id, Point position) { - for (int i = 0; i < VisionCount; i++) { - auto &vision = VisionList[i]; - if (vision._lid != id) - continue; - - vision.hasChanged = true; - vision.position.old = vision.position.tile; - vision.oldRadius = vision.radius; - vision.position.tile = position; - UpdateVision = true; - } + auto &vision = VisionList[id]; + vision.hasChanged = true; + vision.position.old = vision.position.tile; + vision.oldRadius = vision.radius; + vision.position.tile = position; + UpdateVision = true; } void ProcessVisionList() @@ -673,58 +648,33 @@ void ProcessVisionList() if (!UpdateVision) return; - for (int i = 0; i < VisionCount; i++) { - auto &vision = VisionList[i]; - if (vision.isInvalid) { + for (int i = 0; i < TransVal; i++) { + TransList[i] = false; + } + + for (const Player &player : Players) { + int id = player.getId(); + if (!VisionActive[id]) + continue; + Light &vision = VisionList[id]; + if (!player.plractive || !player.isOnActiveLevel()) { DoUnVision(vision.position.tile, vision.radius); + VisionActive[id] = false; + continue; } if (vision.hasChanged) { DoUnVision(vision.position.old, vision.oldRadius); vision.hasChanged = false; } - } - for (int i = 0; i < TransVal; i++) { - TransList[i] = false; - } - for (int i = 0; i < VisionCount; i++) { - auto &vision = VisionList[i]; - if (vision.isInvalid) - continue; - MapExplorationType doautomap = MAP_EXP_SELF; - if (!vision._lflags) { - doautomap = MAP_EXP_OTHERS; - for (const Player &player : Players) { - // Find player for this vision - if (!player.plractive || !player.isOnActiveLevel() || player._pvid != vision._lid) - continue; - // Check that player allows automap sharing - if (!player.friendlyMode) - doautomap = MAP_EXP_NONE; - break; - } - } + if (&player != MyPlayer) + doautomap = player.friendlyMode ? MAP_EXP_OTHERS : MAP_EXP_NONE; DoVision( vision.position.tile, vision.radius, doautomap, - vision._lflags); - } - bool delflag; - do { - delflag = false; - for (int i = 0; i < VisionCount; i++) { - auto &vision = VisionList[i]; - if (!vision.isInvalid) - continue; - - VisionCount--; - if (VisionCount > 0 && i != VisionCount) { - vision = VisionList[VisionCount]; - } - delflag = true; - } - } while (delflag); + &player == MyPlayer); + } UpdateVision = false; } diff --git a/Source/lighting.h b/Source/lighting.h index f4cb543e3..95e0f8407 100644 --- a/Source/lighting.h +++ b/Source/lighting.h @@ -20,7 +20,7 @@ namespace devilution { #define MAXLIGHTS 32 -#define MAXVISION 32 +#define MAXVISION 4 /** @brief Number of supported light levels */ constexpr size_t NumLightingLevels = 16; #define NO_LIGHT -1 @@ -39,15 +39,12 @@ struct Light { uint8_t oldRadius; bool isInvalid; bool hasChanged; - int _lid; - bool _lflags; }; extern Light VisionList[MAXVISION]; -extern int VisionCount; -extern int VisionId; +extern std::array VisionActive; extern Light Lights[MAXLIGHTS]; -extern uint8_t ActiveLights[MAXLIGHTS]; +extern std::array ActiveLights; extern int ActiveLightCount; constexpr char LightsMax = 15; extern std::array, NumLightingLevels> LightTables; @@ -75,7 +72,7 @@ void ChangeLightOffset(int i, Displacement offset); void ChangeLight(int i, Point position, uint8_t radius); void ProcessLightList(); void SavePreLighting(); -int AddVision(Point position, int r, bool mine); +void ActivateVision(Point position, int r, int id); void ChangeVisionRadius(int id, int r); void ChangeVisionXY(int id, Point position); void ProcessVisionList(); diff --git a/Source/loadsave.cpp b/Source/loadsave.cpp index 765813f86..1bf1917cb 100644 --- a/Source/loadsave.cpp +++ b/Source/loadsave.cpp @@ -356,7 +356,7 @@ void LoadPlayer(LoadHelper &file, Player &player) player.AnimInfo.currentFrame = file.NextLENarrow(-1); file.Skip(3); // Skip _pAnimWidth, _pAnimWidth2, _peflag player.lightId = file.NextLE(); - player._pvid = file.NextLE(); + file.Skip(); // _pvid player.queuedSpell.spellId = static_cast(file.NextLE()); player.queuedSpell.spellType = static_cast(file.NextLE()); @@ -871,7 +871,7 @@ void LoadLighting(LoadHelper *file, Light *pLight) pLight->position.tile.x = file->NextLE(); pLight->position.tile.y = file->NextLE(); pLight->radius = file->NextLE(); - pLight->_lid = file->NextLE(); + file->Skip(); // _lid pLight->isInvalid = file->NextBool32(); pLight->hasChanged = file->NextBool32(); file->Skip(4); // Unused @@ -880,7 +880,7 @@ void LoadLighting(LoadHelper *file, Light *pLight) pLight->oldRadius = file->NextLE(); pLight->position.offset.deltaX = file->NextLE(); pLight->position.offset.deltaY = file->NextLE(); - pLight->_lflags = file->NextBool32(); + file->Skip(); // _lflags } void LoadPortal(LoadHelper *file, int i) @@ -1134,7 +1134,7 @@ void SavePlayer(SaveHelper &file, const Player &player) file.WriteLE(CalculateWidth2(animWidth)); file.Skip(); // Skip _peflag file.WriteLE(player.lightId); - file.WriteLE(player._pvid); + file.WriteLE(1); // _pvid file.WriteLE(static_cast(player.queuedSpell.spellId)); file.WriteLE(static_cast(player.queuedSpell.spellType)); @@ -1610,12 +1610,12 @@ void SaveQuest(SaveHelper *file, int i) file->Skip(sizeof(int32_t)); // Skip DoomQuestState } -void SaveLighting(SaveHelper *file, Light *pLight) +void SaveLighting(SaveHelper *file, Light *pLight, bool vision = false) { file->WriteLE(pLight->position.tile.x); file->WriteLE(pLight->position.tile.y); file->WriteLE(pLight->radius); - file->WriteLE(pLight->_lid); + file->WriteLE(vision ? 1 : 0); // _lid file->WriteLE(pLight->isInvalid ? 1 : 0); file->WriteLE(pLight->hasChanged ? 1 : 0); file->Skip(4); // Unused @@ -1624,7 +1624,7 @@ void SaveLighting(SaveHelper *file, Light *pLight) file->WriteLE(pLight->oldRadius); file->WriteLE(pLight->position.offset.deltaX); file->WriteLE(pLight->position.offset.deltaY); - file->WriteLE(pLight->_lflags ? 1 : 0); + file->WriteLE(vision ? 1 : 0); } void SavePortal(SaveHelper *file, int i) @@ -2156,11 +2156,13 @@ void LoadGame(bool firstflag) for (int i = 0; i < ActiveLightCount; i++) LoadLighting(&file, &Lights[ActiveLights[i]]); - VisionId = file.NextBE(); - VisionCount = file.NextBE(); + file.Skip(); // VisionId + int visionCount = file.NextBE(); - for (int i = 0; i < VisionCount; i++) + for (int i = 0; i < visionCount; i++) { LoadLighting(&file, &VisionList[i]); + VisionActive[i] = true; + } } LoadDroppedItems(file, savedItemCount); @@ -2419,11 +2421,12 @@ void SaveGameData(SaveWriter &saveWriter) for (int i = 0; i < ActiveLightCount; i++) SaveLighting(&file, &Lights[ActiveLights[i]]); - file.WriteBE(VisionId); - file.WriteBE(VisionCount); + int visionCount = Players.size(); + file.WriteBE(visionCount + 1); // VisionId + file.WriteBE(visionCount); - for (int i = 0; i < VisionCount; i++) - SaveLighting(&file, &VisionList[i]); + for (const Player &player : Players) + SaveLighting(&file, &VisionList[player.getId()], true); } auto itemIndexes = SaveDroppedItems(file); diff --git a/Source/missiles.cpp b/Source/missiles.cpp index e70cef3e9..34eb35821 100644 --- a/Source/missiles.cpp +++ b/Source/missiles.cpp @@ -3623,7 +3623,7 @@ void ProcessTeleport(Missile &missile) dPlayer[player.position.tile.x][player.position.tile.y] = id + 1; if (leveltype != DTYPE_TOWN) { ChangeLightXY(player.lightId, player.position.tile); - ChangeVisionXY(player._pvid, player.position.tile); + ChangeVisionXY(player.getId(), player.position.tile); } if (&player == MyPlayer) { ViewPosition = player.position.tile; diff --git a/Source/msg.cpp b/Source/msg.cpp index a84127647..52a55d1be 100644 --- a/Source/msg.cpp +++ b/Source/msg.cpp @@ -2117,7 +2117,7 @@ size_t OnPlayerJoinLevel(const TCmd *pCmd, size_t pnum) dFlags[player.position.tile.x][player.position.tile.y] |= DungeonFlag::DeadPlayer; } - player._pvid = AddVision(player.position.tile, player._pLightRad, &player == MyPlayer); + ActivateVision(player.position.tile, player._pLightRad, player.getId()); } } diff --git a/Source/objects.cpp b/Source/objects.cpp index fd775f2f5..f84b48bae 100644 --- a/Source/objects.cpp +++ b/Source/objects.cpp @@ -4315,7 +4315,7 @@ void RedoPlayerVision() { for (const Player &player : Players) { if (player.plractive && player.isOnActiveLevel()) { - ChangeVisionXY(player._pvid, player.position.tile); + ChangeVisionXY(player.getId(), player.position.tile); } } } diff --git a/Source/player.cpp b/Source/player.cpp index f7655a65c..c99735033 100644 --- a/Source/player.cpp +++ b/Source/player.cpp @@ -506,7 +506,7 @@ bool DoWalk(Player &player, int variant) // Update the coordinates for lighting and vision entries for the player if (leveltype != DTYPE_TOWN) { ChangeLightXY(player.lightId, player.position.tile); - ChangeVisionXY(player._pvid, player.position.tile); + ChangeVisionXY(player.getId(), player.position.tile); } if (player.walkpath[0] != WALK_NONE) { @@ -2581,7 +2581,7 @@ void InitPlayer(Player &player, bool firstTime) } else { player.lightId = NO_LIGHT; } - player._pvid = AddVision(player.position.tile, player._pLightRad, &player == MyPlayer); + ActivateVision(player.position.tile, player._pLightRad, player.getId()); } SpellID s = PlayersData[static_cast(player._pClass)].skill; @@ -2639,7 +2639,7 @@ void FixPlayerLocation(Player &player, Direction bDir) ViewPosition = player.position.tile; } ChangeLightXY(player.lightId, player.position.tile); - ChangeVisionXY(player._pvid, player.position.tile); + ChangeVisionXY(player.getId(), player.position.tile); } void StartStand(Player &player, Direction dir) diff --git a/Source/player.h b/Source/player.h index cb66932af..a6cdd48bf 100644 --- a/Source/player.h +++ b/Source/player.h @@ -237,7 +237,6 @@ struct Player { Item HoldItem; int lightId; - int _pvid; int _pNumInv; int _pStrength;