インベントリ内のアイテムの消し方に関する混乱

バグリストを見ていると、C343-52,218,275 など「装備中のアイテムが消失する」ことが原因のバグがいくつかあるようです。

インベントリ内のアイテムの消し方
  1. 装備中なら、適切な関数を呼んで装備を解除する
  2. obj_extract_self() でインベントリ・チェインから外す
  3. obfree()

この 1. が問題で、

  • 忘れられやすい
  • 「適切な関数」が死ぬほどいっぱいある(でも、remove_worn_item()を呼べばOK)
  • 単純に setnotworn() を呼んでしまっている箇所もある(useupall()など)
  • 逆にremove_worn_item()のサブセットのようなものもそこら中にある(lava_effects()など)

なので、これを obj_extract_self() の中、つまり freeinv() の中でやってしまうことにすれば、アイテムを消すのに

  1. obj_extract_self()
  2. obfree()

だけでよくなり、つまりは useupall() あるいは delobj() を呼ぶだけで済むようになりそうです。

副作用
merged() 装備中の所持品同士を#adjustでマージしようとした場合に現在と結果が異なる?