インベントリ内のアイテムの消し方に関する混乱
バグリストを見ていると、C343-52,218,275 など「装備中のアイテムが消失する」ことが原因のバグがいくつかあるようです。
インベントリ内のアイテムの消し方
- 装備中なら、適切な関数を呼んで装備を解除する
- obj_extract_self() でインベントリ・チェインから外す
- obfree()
この 1. が問題で、
- 忘れられやすい
- 「適切な関数」が死ぬほどいっぱいある(でも、remove_worn_item()を呼べばOK)
- 単純に setnotworn() を呼んでしまっている箇所もある(useupall()など)
- 逆にremove_worn_item()のサブセットのようなものもそこら中にある(lava_effects()など)
なので、これを obj_extract_self() の中、つまり freeinv() の中でやってしまうことにすれば、アイテムを消すのに
- obj_extract_self()
- obfree()
だけでよくなり、つまりは useupall() あるいは delobj() を呼ぶだけで済むようになりそうです。
- 副作用
- merged() 装備中の所持品同士を#adjustでマージしようとした場合に現在と結果が異なる?