Files
sacred_k/docs/teleport-potion.md
T
khallaandClaude Opus 5.5 3978060954 Teleportationstrank: the running campaign's portal list
In the Underworld the potion opens the Underworld portals (busy dialog mode
6, as the teleporters there do); g_campaign moved to game/addresses.h.

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

43 lines
2.2 KiB
Markdown

# Teleportationstrank
Request (2026-10-17): the yellow potion becomes "Teleportationstrank";
drinking it opens the window of known portals and the hero can teleport to
one of them.
## Measured
- The yellow potions come in stages (small / medium / large; seen types
0x1434 and 0x141a), all potion kind 5 (logged in
cCreature::UseItem 0x54a8f0).
- Touching a teleporter logs `cInterpretSQW::Teleporter(hex=N)` (0x4ae330):
it sets bit N in the hero's known portals (hero +0x578) and posts a UI event
(constructor 0x553080) of type 0x39 to `DEFAULT_BUSYDLG` with +8 = 2,
+0xc = 5 (mode: portals; 6 for underworld portals above 0xd) and +0x10 = the
mask. cUI_BusyDlg::HandleEvent (0x720c10) calls SetMode (0x720180).
- Choosing a portal: the engine's portal case (0x619671, log `EE_USEPORTAL`)
teleports the hero with cCreature::Teleport (0x54d840), returning to 0x6197c8.
## Mod (src/mods/teleportpotion.cpp)
- Every item type of potion kind 5 counts. Their name, "Trank der
Konzentration", is replaced in every game text from the DLL's start
(`game::ReplaceInTexts`, applied where the game fetches a text): the item
names (stage words in front stay) and the bottom bar's quick-select tooltip
("Trank der Konzentration [R]", its own text id). Before (until
2026-10-19) the names were collected from the item types at game start, so
the main menu (options' key bindings) still had the old name.
- cCreature::UseItem (hooked in itemstack.cpp) asks `teleportpotion::UseItem`
first: for the hero's Teleportationstrank it posts the teleporter's event
with the hero's mask instead of the drink.
- The potion is used up (flag, RemoveItem, DestroyObject as UseItem does; a
stack loses one) only when cCreature::Teleport is called from the portal
case while it is pending; closing the window keeps it.
## Campaign (2026-10-21)
The potion showed Ancaria's portals in the Underworld. cInterpretSQW::Teleporter
(0x4ae330) chooses the busy dialog's mode by the portal touched: index > 0xd
(Underworld) mode 6, else mode 5, both with the hero's known-portal mask
(+0x578). The potion now chooses by the running campaign, g_campaign
(0x182cdc8, u16: 0 Ancaria, 1 Underworld): mode 6 in the Underworld.