【解決済み】スクリプトでの状態異常付与・解除の不具合?

hatisen

ユーザー
スクリプトでステートを付与してから解除した後、しばらくの間スクリプトでステート付与できない現象が起こってしまいます?
イベント1:話しかけると「$gameActors.actor(1).addState(4)」で毒付与
イベント2:話しかけると「$gameActors.actor(1).removeState(4)」で毒解除
という2つのテストイベントを主人公に隣接するように配置しまして、イベント1→イベント2→イベント1と話しかけた場合、最後のイベント1では毒が付与されなくなります
そのまま時間を置いても、何回話しかけても毒付与されません
しかし歩行して一旦離れてからまた戻り、イベント1に話しかけると付与されるようになります
これはどういう原因でこのような挙動になってしまっているのでしょうか、解決方法などはあるのでしょうか?
 
なぜスクリプトでステートを付加しなければならないのでしょう。
ステートの変更イベントコマンドを使えない理由はありますか?

それはそれとして、挙動がおかしいようです。デフォルトのプロジェクト(コアスクリプト1.10.0)では再現しない挙動のようです。
何もプラグインを導入していないデフォルトのプロジェクトで試されていますか?
何か並列実行のイベントが裏で走っているということもありませんか?
コアスクリプトの更新を行った後も再現しますか?

追記: 早とちりしてMZで確認していました。MVだとまた違いますね
 
最後に編集:
なぜスクリプトでステートを付加しなければならないのでしょう。
ステートの変更イベントコマンドを使えない理由はありますか?

それはそれとして、挙動がおかしいようです。デフォルトのプロジェクト(コアスクリプト1.10.0)では再現しない挙動のようです。
何もプラグインを導入していないデフォルトのプロジェクトで試されていますか?
何か並列実行のイベントが裏で走っているということもありませんか?
コアスクリプトの更新を行った後も再現しますか?
500種類ほどのステートを扱いたいので、できればスクリプトで付与したいと思っています
デフォルトのプロジェクトで試したのでプラグインなどの影響は無いと思います
使用しているのはSteamで購入したRPGツクールMVのVer1.6.3です
 
var actor = $gameActors.actor(1);
if (!actor.isStateAffected(4)) {
actor._states.push(4);
actor.sortStates();
actor.refresh();
$gamePlayer.refresh();
}
一旦離れると付与されるならこれで強制的に出来ると思いますが
普通にイベントコマンドでやった方が楽だと思われます
 
var actor = $gameActors.actor(1);
if (!actor.isStateAffected(4)) {
actor._states.push(4);
actor.sortStates();
actor.refresh();
$gamePlayer.refresh();
}
一旦離れると付与されるならこれで強制的に出来ると思いますが
普通にイベントコマンドでやった方が楽だと思われます
え!?
「add」だけでなく「push」でもステート追加処理ができるという事をはじめて知りました!
addではなくpushで付与してみたところ、それだけで問題は起こらなくなりました
ありがとうございます
 
MVの場合、ステート付加可否の条件判定に、「バトラーに対する直近の行動結果で対象ステートが解除されていない」というものがあります。
単にremoveStateを呼んでしまうと、バトラーに対する直近の行動結果がリセットされず、そこで解除したステートが再度付加できません。

ステートの変更のイベントコマンドは、その直後に「対象アクターに対する行動結果をリセットする」処理があるため、イベントコマンドで付加すればこの問題は発生しません。
また、プレイヤーが歩いた際にも、全てのパーティメンバーに対して、そのアクターに対する直近の行動結果がリセットされるため、解除したステートを再度付加できます。

「add」だけでなく「push」でもステート追加処理ができるという事をはじめて知りました!

この認識をされているのであれば尚更、スクリプトによるステート付加はやめておいたほうが良いのではないかと思います。
コードをコピーしてもそれが読めないままだと、また何か問題が発生した際に対応できなくなります。
デフォルトの毒だけならまだしも、blue frameさんが貼ってくださったコードには通常のステート付加のフローから、行動制約に関するものが抜けています。
500種類ものステートを扱いたいというのであれば尚更、未来の自分をいたずらに混乱させる作り方は避けておいたほうが良いです。
(そもそも500種類もステートを扱うべきなのか、それによって実現したい仕様とは何なのか、というところも気にはなりますが)

どうしてもやるなら、Game_Interpreter.prototype.command313を読んでステートの変更イベントコマンドの処理を理解し、同じように動作するスクリプトやプラグインコマンドを書くほうが、混乱は少ないでしょう。
新しく戦闘不能が付加された時の処理はややノイズかもしれませんが、それを除けば単純にaddState/removeStateと行動結果のリセットをしているだけなので、読みやすいと思います。
 
最後に編集:
MVの場合、ステート付加可否の条件判定に、「バトラーに対する直近の行動結果で対象ステートが解除されていない」というものがあります。
単にremoveStateを呼んでしまうと、バトラーに対する直近の行動結果がリセットされず、そこで解除したステートが再度付加できません。

ステートの変更のイベントコマンドは、その直後に「対象アクターに対する行動結果をリセットする」処理があるため、イベントコマンドで付加すればこの問題は発生しません。
また、プレイヤーが歩いた際にも、全てのパーティメンバーに対して、そのアクターに対する直近の行動結果がリセットされるため、解除したステートを再度付加できます。



この認識をされているのであれば尚更、スクリプトによるステート付加はやめておいたほうが良いのではないかと思います。
コードをコピーしてもそれが読めないままだと、また何か問題が発生した際に対応できなくなります。
デフォルトの毒だけならまだしも、blue frameさんが貼ってくださったコードには通常のステート付加のフローから、行動制約に関するものが抜けています。
500種類ものステートを扱いたいというのであれば尚更、未来の自分をいたずらに混乱させる作り方は避けておいたほうが良いです。
(そもそも500種類もステートを扱うべきなのか、それによって実現したい仕様とは何なのか、というところも気にはなりますが)

どうしてもやるなら、Game_Interpreter.prototype.command313を読んでステートの変更イベントコマンドの処理を理解し、同じように動作するスクリプトやプラグインコマンドを書くほうが、混乱は少ないでしょう。
新しく戦闘不能が付加された時の処理はややノイズかもしれませんが、それを除けば単純にaddState/removeStateと行動結果のリセットをしているだけなので、読みやすいと思います。
とても丁寧な解説をして頂きありがとうございます、とても助かります
コマンドでの処理には、単純な付与解除処理だけではなく付随する処理や判定も合わさっていたわけですね
大方のコマンドでは、対象選択や操作の選択に変数を使用することが出来ず(ステートの変更では対象アクターは変数指定できるがステート種類はリスト指定しかできない)、条件分岐を並べるのでは実行内容が長くなりすぎる場合に、コマンド代わりに同処理のスクリプトを調べて変数指定して使えばよい…という感覚でスクリプトを使ってきましたが、同処理とも限らないのですね
まずは教えて頂いたイベントコマンドの処理内容を、Consoleから読んでひとつづつ処理内容を理解していきたいと思います

500種類のステートは、「アビリティ」的な要素でプレイヤーが選択してアクターに装備され、それぞれのステートによって異なるステータスがUPしたり特徴を付与したり…という用途で考えています
イベントでのみ付与・解除がされ、解除条件は無く、フィールド上も戦闘中も常に付与され続けます
戦闘不能時に解除されないように「戦闘不能後継続ステートプラグイン(StateAfterDeath.js)」、
逃げた時にステートが解除される不具合を防ぐために「逃走行動によってステート・強化・弱体解除(DarkPlasma_RemoveStateBuffByEscapeAction.js)」、
のプラグインを利用させて頂いています
 
Back
トップ