騎乗した状態で攻撃した騎乗可能モンスターに乗ってしまう
敵対モンスターに乗馬している状態を確認しました。調査します。 上記現象を再現したいので、直前のセーブデータを保管できたり、再現する手順を用意できたら教えてください。
似た現象として、変幻の魔公に乗ったままテレポート巻物を読むと魔公が (乗馬中) のまま分離しました。 本件の原因の全てではないかもしれませんが、問題のコードは特定したので書いておきます。
spells-teleport.c の teleport_player() 内の以下のコードですが、v2.2.1 (spells3.c 481行目) と判定が逆になっています。 ここは本来「@から距離1以内の乗騎でないモンスターがテレポ追尾を持っていたら追尾する」というロジックですが、判定が逆なので乗騎がテレポ追尾を行ってしまい、結果として乗馬中のまま分離してしまうようです。
<報告用セーブデータ0203>アップしました。 敵に乗ることに関しては再現はできました。 taotao氏がご指摘の通り、変幻の魔公に乗った状態でテレポートすると乗馬状態が継続したまま近くに変幻の魔公(乗馬中)が現れます。 この表示がおかしい状態は一度乗馬から降りるコマンドをしてから魔公に乗りなおさないと直りません。 ここで乗りなおさずに分離したまま騎乗可能モンスターに攻撃すると、時々そのモンスターに乗ってしまうようです。 最初の報告の事例の際も、戦闘前に気づかないうちにテレポートで魔公が分離していたのかもしれません。 データはテレポで魔公と分離後、ワイアームを殴るために隣接した状態です。
調査結果を記載します。
テレポート追尾処理のフラグ反転によりridingフラグを維持したまま乗馬と分離することがある件はtaotao氏の報告通りです。
敵対モンスターと重なってしまう現象ですが、ridingフラグTRUEのplayerへの攻撃処理に原因があります。
ridingフラグTRUEのplayerへの攻撃は1/2でキャンセルされ、乗馬への攻撃処理に移行します。
乗馬への攻撃処理の開始時にはモンスターのdo_moveフラグがTRUEで、処理の途中でdo_moveフラグをFALSEにしています。
ridingフラグTRUEかつ同座標に乗馬がいない場合、この処理が行われずdo_moveフラグTRUEが継続します。
その結果、モンスターがプレイヤーと同座標に移動します。(monster-move.c / process_monster_movement() )
結論として、taotao氏の指摘箇所を修正して乗馬分離の件を解決すれば敵対モンスターと重なる件も改善します。
https://osdn.net/projects/hengband/scm/git/hengband/commits/3de4d7dfe19999dfbc0ba41c991ae6566f163e3c
修正コミットをしたので確認お願いします。
修正箇所確認の上マージしました。完了とします。
Details