Files
khallaandClaude Opus 5.5 6ca96d54b4 Shared chest tabs, rune stacks and rune master, Q pickup, Kettenblitz tooltip and range
- Shared chest: tabs "Truhe"/"Gemeinsam" as a column left of the grid
  (game tab sheet), grids placed every tick, persistent across heroes
- Inventory tab texts capitalized (RegisterText / CapitalizeText)
- Combat-art runes stack like potions (itemstack, renamed from potionstack)
- Rune master: any rune for any number of runes, price by rune count
  (4 runes = 1,000, x10 per missing rune), bought rune goes into the
  backpack, Buy disabled without runes, gold or room, last rune remembered
  per hero (saved), the chosen rune's name below its icon, dropping a
  stack gives up one rune
- Keys: the old key handling no longer takes over after the save screen
  (text field focus only counts while its dialog is shown)
- Esc crash: tooltips forgotten when the game destroys them
- Pick up (Q) sends the pickup order directly; search reach doubled
- Kettenblitz: tooltip shows hits per chain, chains, cast and jump range;
  cast range 900 (longer ray segments), jumps half of that

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-10-17 03:40:42 +02:00

55 lines
2.8 KiB
Markdown

# Rune master (`src/mods/runetrade.cpp`)
## Requests (2026-10-17)
1. Dropping a rune stack into the rune master takes one rune off the stack.
2. Buying: runes can always be exchanged directly for a chosen rune; the
number of runes given lowers the price (decided: 4 runes 1,000, each
missing rune x10: 3 runes 10,000, 2 runes 100,000, 1 rune 1,000,000). The
rune to buy can always be chosen; Buy works only with at least one rune
and enough gold. The last rune bought is remembered (decided: per hero,
saved).
## The original window (`cUI_MasterLotto`, read)
| Offset | What |
|---|---|
| +0x154 + i * 0x114 | slot control i (0..3), hit test vf1c(x, y) |
| +0x24c + i * 0x114 | slot i's item descriptor {u16 kind 1, u16 class 0x1c, u32 id, ...} |
| +0x5a4 / +0x620 | arrows: next / previous rune (`doLottoSelect` mode 1 / 0) |
| +0x69c | the bought rune's control; +0x794 its descriptor, +0x798 id, +0x79c type |
| +0x7b4 | the chosen rune (item type) |
| +0x7c8 | Buy button |
- Prices: u32 table at `0xad2aac` by rune count; the game fills 2..4 from
its settings (`0x5efc7b`); read by the render, the button state
(`0x6d4390`, `0x6d3df0`) and the pay helper `0x6d3ce0(pay)` (gold at
hero +0x3ee, paid with `cCreatureArts::AddGold` `0x57fc40`).
- Buy (`0x6d42a0`): 2 runes give a random rune, 3 a random one of the hero's
class, 4 the chosen one. Buying needed 2 runes (`cmp dx, 2` at `0x6d3e20`,
`0x6d4544`, `0x6d4a13`).
- `0x6d3d50` after slot changes: with 4 runes shows the arrows and keeps the
choice (`doLottoSelect(hero type, 2)`, index in the global `0x17e81d0`),
otherwise hides them and clears +0x7b4.
## Mod
- Owns the window's event hook (hud.cpp centres it via `hud::HandleCentred`).
- Prices: `kPrices` written into the table (on game start and with each
window event); the three `cmp dx, 2` become 1.
- `0x6d3d50` replaced: arrows always shown (unless a bought rune waits), a
rune always chosen; when none is chosen (window opened) the hero's last
bought rune is chosen by stepping `doLottoSelect` forward to it.
- Buy press handled here (`CanBuy`): at least one rune, a chosen rune, gold
(`0x6d3ce0(0)`) and room in the backpack (a stack of that rune with room,
or a free cell). Buying pays (`0x6d3ce0(1)`), destroys the slot runes and
puts the rune straight into the backpack (follow-up 2026-10-17: a bought
rune taken from the window vanished; the window's waiting slot +0x794 /
+0x798 is no longer used). The rune is remembered for the hero.
- The Buy button looks disabled whenever `CanBuy` fails: the render sets its
colours each frame with `cUI_Button::SetColours` (`0x6d5d90`), hooked to
hand it the disabled set (`0x9f0290`, text `0x9f028c`).
- Remembered rune: `"hero": {"lastRune": type}` in the hero's inventory JSON
(`inventory_save::RegisterHeroData`); cleared when the session ends.
- Stack drops: see docs/item-stacks.md.