Skip to content

fix(pour): read potion spell from extra_values, not raw val[1]#3635

Merged
bylins merged 3 commits into
masterfrom
fix/pour-potion-extra-values
Jul 22, 2026
Merged

fix(pour): read potion spell from extra_values, not raw val[1]#3635
bylins merged 3 commits into
masterfrom
fix/pour-potion-extra-values

Conversation

@bylins

@bylins bylins commented Jul 22, 2026

Copy link
Copy Markdown
Owner

Бог: «load obj 808 (отвар подорожника), лить отвар мехПусто», хотя зелье только что создано.

Причина

Тот же класс, что #3611/#3615. do_pour умеет переливать зелье в сосуд (делает многоглотковую жидкость), но мерил «пустоту» зелья по сырому val[1]:

if (GET_OBJ_VAL(from_obj, 1) == 0) {   // "Пусто" -- return

У зелья val[1] был первым заклинанием. После миграции магических предметов на extra_values сырые val[] у зелий обнулены (заклинание теперь в kSpell1Num), поэтому val[1] == 0 у любого зелья → всегда «Пусто», и до логики перелива (copy_potion_values) дело не доходит.

Плюс имя сосуда генерировалось по заклинанию из val[1] (=0):

drinkcon::generate_drinkcon_name(to_obj, static_cast<ESpell>(GET_OBJ_VAL(from_obj, 1)));

Фикс

  • проверка «Пусто» не применяется к kPotion — зелье это одна единица, полная пока существует; пустота осмысленна только для сосудов и колодцев;
  • имя сосуда берётся из from_obj->GetSpellItemSpellNum(1), а не из val[1].

После этого отвар штатно переливается в мех и становится многоглотковой жидкостью — то, ради чего перелив и существует.

Остальные чтения val в do_pour — в ветке источника-сосуда (kLiquidContainer), где val проксируется через liquid_core и корректен; спотыкались только эти два места для зелья.

Проверка

Сборка release + build_tests=true, без варнингов, 604 теста проходят.

Проверяется в игре: load obj 808, лить отвар <сосуд> — должно перелить, а не «Пусто»; сосуд получает имя по заклинанию отвара.

🤖 Generated with Claude Code

bylins and others added 3 commits July 22, 2026 13:41
"лить отвар мех" (перелить зелье в сосуд) отвечало "Пусто", хотя зелье
полное. do_pour мерил пустоту зелья по GET_OBJ_VAL(from_obj, 1), а у зелий
заклинание переехало в extra_values (миграция магических предметов), и
сырой val[1] теперь всегда 0 -- любое зелье считалось пустым, до логики
перелива дело не доходило.

Тот же класс, что #3611/#3615: код читал сырые val[] там, где данные ушли
в ключи ObjVal.

Две правки:
- проверка "Пусто" не применяется к kPotion (зелье -- одна единица, полная
  пока существует; пустота осмысленна только для сосудов/колодцев);
- имя сосуда по заклинанию зелья берётся из GetSpellItemSpellNum(1), а не
  из val[1].

После этого отвар штатно переливается в мех и становится многоглотковой
жидкостью.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
"лить зелье земля" опустошал зелье по логике сосуда (обнуление val +
reset_potion_values), оставляя пустой "отвар" без заклинания в руках.
Зелье -- одна единица: при выливании его надо уничтожать. Извлекаем.

Остальные чтения val ниже безопасны: источник-зелье всегда завершается
return в блоке kPotion (выше по функции), поэтому ветки для
kLiquidContainer/kFountain зелье не достигает, а там val проксируется
через liquid_core.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Перелив зелья в сосуд терял заклинание ("у данного зелья отсутствуют
заклинания"): помощники перелива читали сырой val зелья, обнулённый
миграцией магических предметов на extra_values.

- copy_value: заклинание/уровень зелья брались из val[num]/val[0] (=0) ->
  в сосуд копировался пустой закл. Теперь из ключей kSpell<num>Num.
- check_potion_spell: сравнивало заклинание/уровень зелья по сырому val, а
  сосуд по ключу -> при смешивании в непустой сосуд закл не совпадал.
- check_equal_potions: гейт цикла по val[i] (=0) -> сверка заклов зелья
  не выполнялась вообще, всегда "равны".
- check_equal_drinkcon: гейт по val (у сосуда это объём/тип/отрава) ->
  позиция 3 сверялась только при наличии отравы. Гейт по ключу.

mix_potion_values проверен -- он уже на ключах (MagicItemSkill/Stat,
kLiquidTimer), путь к нему чинится фиксом check_equal_potions.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@bylins
bylins merged commit eb60ecf into master Jul 22, 2026
20 checks passed
@bylins
bylins deleted the fix/pour-potion-extra-values branch July 22, 2026 13:00
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant