Repository navigation
Fix two tables that did not read and correct key targets in eight more - #250
Merged
SnosMe merged 1 commit intoOct 14, 2026
Merged
Conversation
PoE 1 MapDeviceLayouts and PoE 2 ExpeditionDeals read offsets that were never written. MapDeviceLayouts has a bool, an i32 and a list of i32 where the schema had i32, string, bool, i32, i32. ExpeditionDeals has one key to SoundEffects where the schema had a string and two i32. PoE 1 calls the same key NPCShop, but it reads UseOrb on 81 deals and Sharpening on set_quality. Two targets from poe-tool-dev#249 were wrong. AfflictionQuestFogBankValues points at EndgameMapAtlas: its keys are the 20 AtlasLeagueDeliriumInnerNode rows. CharacterStartStates.SupportGems holds attribute passives that are also in the row's PassiveSkillsKeys, and the list after it names the attribute chosen for each. The two untargeted lists before them hold passives as well. QuestAchievements.QuestStates is a list of QuestFlags keys in both games. In PoE 2, NPCTalk.Music1 and Music2 are WorldAreas, MapDeviceRecipes.WorldArea is a list, and the first unnamed columns of WeaponImpactSoundData and RecombinableClasses are keys to WeaponSoundTypes and BaseItemTypes. Checked against PoE 2 0.5.5.4.2 and PoE 1 3.29.3.3.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Ten tables, checked against PoE 2 0.5.5.4.2 and PoE 1 3.29.3.3. Two of the changes correct targets I got wrong in #249.
Each change passed three checks: the bytes have the shape of the new type in every row, the values resolve to rows that make sense next to the row's other columns, and with the change every table still reads with no key out of range and no list data left unread.
The pointer columns were first flagged by comparing the schema with what the game client's own loader fixes up for each table. Everything below is from the table data itself.
Corrections to #249 (PoE 2)
AfflictionQuestFogBankValues points at
EndgameMapAtlas, notNPCs.EndgameMapAtlasthose are exactlyAtlasLeagueDeliriumInnerNode1to20, the rows with themap_endgame_fog_depth…stats.NPCsthe same range starts and ends in the middle of the Incursion NPCs. Both tables have enough rows, which is why the range check passed last time.CharacterStartStates:
SupportGemsdoes not hold support gems.PassiveSkills(strengthN,dexterityN,intelligenceN,attributesN), and 732 of them are also in the same row'sPassiveSkillsKeys. They follow the class: rows for theStrFourbcharacter hold strength nodes, rows forIntFourintelligence nodes.PassiveSkillsare nearly all attribute nodes andSupportGemshas 637 rows, so every index fits both tables.generic_attribute_strength,generic_attribute_dexterityorgeneric_attribute_intelligence_: the attribute chosen for each node.stun_threshold11forWarriorActTwo,accuracy18andaccuracy8forRangerActTwo. AsBaseItemTypesthe same values giveRandomFossilOutcome124,RunedArtifact3andTalisman9End.Tables that did not read
MapDeviceLayouts (PoE 1; PoE 2 has no such file):
i32, string, bool, i32, i32becomesbool, i32, [i32], the same 21 bytes.NoSlotRecipe, the next list points back at an earlier row's copy.ExpeditionDeals (PoE 2):
string, i32, i32becomes one key toSoundEffects. Every row readsUseOrb.ExpeditionDeals (PoE 1):
NPCShop: NPCShopbecomesSoundEffect: SoundEffects.set_qualityholds another.SoundEffectsthose areUseOrbandSharpening. AsNPCShopthey areExpeditionGamblerandExpeditionDealer.Types and targets
QuestAchievements (both games):
QuestStates: [i32]becomesQuestFlags: [QuestFlags].AllAscendancyPointslistsAscendancyPoints1to4;LabyrinthAllCompletelistsLabyrinthComplete1to3andLabyrinthCompleteMaps.[i32], three quarters of the list data is never read.NPCTalk (PoE 2):
Music1andMusic2becomeWorldArea1andWorldArea2.HoodedMentorreadsG1_town,LilyRothsCrewFirstMatereadsG4_town, and the threeFarrowAct1Dungeonrows readExpeditionSubArea_Kalguur_Act1,Act2andAct3.Musicthe same values are PoE 1 tracks:Act7_FellshrineRuins,LegionIdleState,A3_JungleDepths.MapDeviceRecipes (PoE 2):
WorldAreais a list. All 14 rows hold a count of 1 and an offset, not a key; theReliquary…recipes listMapVoidReliquary.WeaponImpactSoundData (PoE 2): the 16 bytes after
Idare a key toWeaponSoundTypes.CleavingreadsSword2H,SlashingreadsSword1H,BludgeoningreadsMace2HWood,PuncturingreadsStab1HMetal,AnimalClawreadsBeast,BowArrowreadsArrow.RecombinableClasses (PoE 2): the 16 bytes after
Idare a key toBaseItemTypes. Weapons readExpeditionVendorCurrencyFaction1, amulets and ringsExpeditionVendorCurrencyFaction2.Names
The new names (
AttributePassives,AttributeChoices,SoundEffect,WorldArea1,WorldArea2,WorldAreas,QuestFlags,Currency,WeaponSoundType) are my reading of what the values are. I am happy to change any of them.