From be202aa0fc6419e74561f09984dbe24ce9fb78fa Mon Sep 17 00:00:00 2001 From: guiyomu-dev <22749537+guiyomu-dev@users.noreply.github.com> Date: Wed, 17 Dec 2025 01:31:08 +0100 Subject: [PATCH 1/3] fix offsets --- pkg/memory/game_reader.go | 6 +++--- pkg/memory/keybindings.go | 2 +- pkg/memory/offset.go | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/pkg/memory/game_reader.go b/pkg/memory/game_reader.go index 0b1caa8..0a4f9b6 100644 --- a/pkg/memory/game_reader.go +++ b/pkg/memory/game_reader.go @@ -317,7 +317,7 @@ func (gd *GameReader) InCharacterSelectionScreen() bool { } func (gd *GameReader) GetSelectedCharacterName() string { - return gd.Process.ReadStringFromMemory(gd.Process.moduleBaseAddressPtr+0x20C3FF4, 0) + return gd.Process.ReadStringFromMemory(gd.Process.moduleBaseAddressPtr+0x2120FF4, 0) } func (gd *GameReader) LegacyGraphics() bool { @@ -437,11 +437,11 @@ func (gd *GameReader) IsDismissableModalPresent() (bool, string) { } func (gd *GameReader) LastGameName() string { - return gd.ReadStringFromMemory(gd.moduleBaseAddressPtr+0x25113A8, 0) + return gd.ReadStringFromMemory(gd.moduleBaseAddressPtr+0x29FB450, 0) } func (gd *GameReader) LastGamePass() string { - return gd.ReadStringFromMemory(gd.moduleBaseAddressPtr+0x2511408, 0) + return gd.ReadStringFromMemory(gd.moduleBaseAddressPtr+0x29FB4A8, 0) } func (gd *GameReader) FPS() int { diff --git a/pkg/memory/keybindings.go b/pkg/memory/keybindings.go index 6c30849..7236bfb 100644 --- a/pkg/memory/keybindings.go +++ b/pkg/memory/keybindings.go @@ -8,7 +8,7 @@ import ( ) func (gd *GameReader) GetKeyBindings() data.KeyBindings { - blob := gd.ReadBytesFromMemory(gd.moduleBaseAddressPtr+0x1D87CC4, 0x500) + blob := gd.ReadBytesFromMemory(gd.moduleBaseAddressPtr+0x1DE4CC4, 0x500) blobSkills := gd.ReadBytesFromMemory(gd.offset.KeyBindingsSkillsOffset, 0x500) skillsKB := [16]data.SkillBinding{} diff --git a/pkg/memory/offset.go b/pkg/memory/offset.go index 9b4349c..52dd2c9 100644 --- a/pkg/memory/offset.go +++ b/pkg/memory/offset.go @@ -98,7 +98,7 @@ func calculateOffsets(process *Process) Offset { questInfoOffset := pattern - process.moduleBaseAddressPtr + 7 + questInfoOffsetPtr // Terror Zones - tzOffset := uintptr(0x2955E20) + tzOffset := uintptr(0x29B2DF0) // Quest Bytes Data pattern = process.FindPattern(memory, "\x42\xc6\x84\x28\x00\x00\x00\x00\x00\x49\xff\xc5\x49\x83\xfd\x29", "xxxx?????xxxxxxx") From 3f559332fc2123a24623b9c7688b1d53542ed80c Mon Sep 17 00:00:00 2001 From: guiyomu-dev <22749537+guiyomu-dev@users.noreply.github.com> Date: Wed, 17 Dec 2025 11:50:26 +0100 Subject: [PATCH 2/3] add new key bindings --- pkg/data/keybindings.go | 3 +++ pkg/memory/keybindings.go | 8 ++++++++ 2 files changed, 11 insertions(+) diff --git a/pkg/data/keybindings.go b/pkg/data/keybindings.go index 1a77555..cb77d67 100644 --- a/pkg/data/keybindings.go +++ b/pkg/data/keybindings.go @@ -50,6 +50,9 @@ type KeyBindings struct { ClearMessages KeyBinding Zoom KeyBinding LegacyToggle KeyBinding + + PreviousStashPage KeyBinding + NextStashPage KeyBinding } type KeyBinding struct { diff --git a/pkg/memory/keybindings.go b/pkg/memory/keybindings.go index 7236bfb..24e9f9d 100644 --- a/pkg/memory/keybindings.go +++ b/pkg/memory/keybindings.go @@ -199,5 +199,13 @@ func (gd *GameReader) GetKeyBindings() data.KeyBindings { Key1: [2]byte{blob[0x488], blob[0x489]}, Key2: [2]byte{blob[0x492], blob[0x493]}, }, + PreviousStashPage: data.KeyBinding{ + Key1: [2]byte{blob[0x4c4], blob[0x4c5]}, + Key2: [2]byte{blob[0x4ce], blob[0x4cf]}, + }, + NextStashPage: data.KeyBinding{ + Key1: [2]byte{blob[0x4d8], blob[0x4d9]}, + Key2: [2]byte{blob[0x4e2], blob[0x4e3]}, + }, } } From 0481a1408c620abce67253e468edb8d9e081136b Mon Sep 17 00:00:00 2001 From: nitrogen617 Date: Fri, 19 Dec 2025 16:02:01 +0900 Subject: [PATCH 3/3] add runeword flag --- pkg/nip/rule.go | 23 +++++++++++++++++++++-- 1 file changed, 21 insertions(+), 2 deletions(-) diff --git a/pkg/nip/rule.go b/pkg/nip/rule.go index f44ece2..02ed810 100644 --- a/pkg/nip/rule.go +++ b/pkg/nip/rule.go @@ -252,7 +252,17 @@ func (r Rule) Evaluate(it data.Item) (RuleResult, error) { case "name": stage1Props["name"] = it.ID case "flag": - stage1Props["flag"] = map[bool]int{true: 1, false: 0}[it.Ethereal] + // 0x400000 (eth) | 0x4000000 (runeword) kolbot style + currentFlag := 0 + + if it.Ethereal { + currentFlag |= 0x400000 + } + if it.IsRuneword { + currentFlag |= 0x4000000 + } + + stage1Props["flag"] = currentFlag case "prefix": if it.Affixes.Rare.Prefix != 0 { stage1Props["prefix"] = int(it.Affixes.Rare.Prefix) @@ -439,7 +449,16 @@ func replaceStringPropertiesInStage1(stage1 string) (string, error) { case "name": replaceWith = strings.ReplaceAll(prop[0], prop[4], fmt.Sprintf("%d", item.GetIDByName(prop[4]))) case "flag": - replaceWith = strings.ReplaceAll(prop[0], prop[4], fmt.Sprintf("%d", 1)) + val := 0 + switch strings.ToLower(prop[4]) { + case "runeword": + val = 0x4000000 + case "ethereal": + val = 0x400000 + default: + val = 1 + } + replaceWith = strings.ReplaceAll(prop[0], prop[4], fmt.Sprintf("%d", val)) case "prefix", "suffix": // Handle prefix/suffix IDs replaceWith = strings.ReplaceAll(prop[0], prop[4], prop[4])