# Taking back attribute and skill points (mods/respec.cpp) Request of 2026-10-16: a − button on each row of the character panel (inventory, Attribute / Fertigkeiten) gives back one invested point. A skill at level 1 is removed and a new one can be chosen in its place. ## Data (cCreatureArts, hero +0x3a8, measured 2026-10-16) | Offset | What | |---|---| | +0x1c[6] | attribute points invested, in panel order (Stärke, Widerstand, Geschick, Physische Reg., Mentale Reg., Charisma); the shown values add class and level growth | | +0x23 | free attribute points (index 7 of the same array) | | +0x24[8] | skill id per row (0: empty) | | +0x2c[8] | bought skill level per row (a chosen skill starts at 1) | | +0x34[8] | skill levels from items | | +0x42 | free skill points | | +0x44 | new skills still to choose | | +0x56 | highest skill level allowed | Game functions (all on cCreatureArts): - `0x5a03a0 (index, delta)` adds to an attribute byte; the + does (row, 1) then (7, −1), then `0x579560 (0, 1)` recalculates the hero (0x580d50). - `0x582360 (row, delta, spend)` adds skill levels; with `spend` it takes them from the free skill points (a negative delta gives them back). - `0x580fe0 (skill)` puts a chosen skill into the first empty row at level 1 and uses up one choice; `0x580f30` lists the skills still choosable. Each of them also writes the hero's +0x3b0.. block, xor-ed, into a protected page (0x182cddc / 0x182cde0). Changing the fields directly without that made the hero's life show 0. The mod therefore only changes fields through these functions; after removing a skill it calls `0x582360 (row, 0, 1)` to refresh the copy. ## Panel (cUI_StatisticsChar, vtable 0x8942d8) - +0x164 bit 0x10: attributes shown (else skills); +0xf84: choosing a new skill. - +0x2cc: the 8 + buttons (cUI_Button, 0xbc bytes each, laid out by 0x6ac120: x 232, rows 19 px apart from y 72, 16×16). - +0x8ac: a second array of 8 buttons that the game constructs and destroys but never lays out or uses. These are the − buttons now. - The panel renders while hidden (inventory closed); the − buttons check its visible flag. cUI_Button images (render 0x72af90): normal at +0x64 (u0, u1, v0, v1) with texture +0x84, pressed at +0x54 / +0x80. Image descriptors are static, 0x54 bytes each (texture +0x28, pixel rect +0x2c..+0x38, converted to UVs at start-up). The + uses 0x9ed2d0 (pressed 0x9ed324) in UI atlas 0x26a. The names UI_BUTT_MINUS_UP/DW are registered, but neither UI atlas (0x26a, 0x289; both drawn whole once and looked at) has a minus image. The − is therefore the + with the vertical arm of its cross covered by two grey patches, measured from a screenshot: arm x 6.5..8.8, y 4.0..6.9 and 9.0..11.5 in icon pixels.