解決)マップ画面でのステート解除を時間制に仕様変更

アバター
Plasma Dark
記事: 676
登録日時: 2020年2月08日(土) 02:29
連絡を取る:

Re: マップ画面でのステート解除条件をリアルタイムに仕様変更

投稿記事by Plasma Dark » 2020年2月29日(土) 17:58

おお、雑に読み流しただけではやはり穴がありましたね。失礼しました。

ChronoモードとABSモードの違いがヘルプから読み取れないのが辛いところですね。
名前から察するに、前者はクロノトリガーに関連している感じでしょうか。未プレイのためうまくイメージできず。
今回は後者のABSモードとのことで、おそらく Action Battle System か何かの略なのでしょう。

もう一度読み直してみましたが、$gameSystem.isChronoMode() で分岐していて、たしかに $gameMap._battlersOnScreen の操作を行っていないみたいですね。
ABSモードでのバトラー一覧の取得方法はおそらく下記の通りです。

コード: 全て選択

$gameMap.players().map(player => player.battler()).concat(
  $gameMap.allEnemiesOnMap().map(enemyEvent => enemyEvent.battler())
)


敵味方に共通の処理が行えたほうが良いだろうということで、敵味方両方全て取得するスクリプトになっています。
これを前に書いたコードの $gameMap._battlersOnScreen と置き換えてみてください。

アバター
にゃたま
記事: 837
登録日時: 2016年1月13日(水) 23:53
お住まい: 床下の猫王国-すみませんが体調悪いのでサポートはお休みさせていただきます
連絡を取る:

Re: マップ画面でのステート解除条件をリアルタイムに仕様変更

投稿記事by にゃたま » 2020年2月29日(土) 18:57

Plasma Dark様

お世話になっています。
置き換えましたがやはりうまく動作しないようです。

スクリーンショット 2020-02-29 18.38.34.png


StatesDurationは10で
毒解除ターンは2で並列で10フレームおきに実施しましたが
この設定で3分程度は待ちましたが毒は一向に解除される気配なく…

お手数おかけして申し訳ございません。
私自身スクリプトは勉強中で
正直提示頂いたコードが何故バトラー一覧を取得できる動作を行っているのかわかりません。
もはや言われるように実装するしかないといった状況です。
よろしくおねがいします。
アバター
Plasma Dark
記事: 676
登録日時: 2020年2月08日(土) 02:29
連絡を取る:

Re: マップ画面でのステート解除条件をリアルタイムに仕様変更

投稿記事by Plasma Dark » 2020年2月29日(土) 19:20

失礼しました。先程の記事に書いたのはマップ上のバトラー一覧を取得するだけのスクリプトですので、バトラーそれぞれに対してステートの時間を進行させる処理を書く必要があります。

全体を書くと以下のようになります。

コード: 全て選択

$gameMap.players().map(player => player.battler()).concat(
  $gameMap.allEnemiesOnMap().map(enemyEvent => enemyEvent.battler())
).forEach(battler => {
  $gameChrono.updateStatesTurn(battler, null);
});


MOG_ChronoEngine では、マップ上の戦闘可能なユニットに対して、バトラー情報を取得する battler メソッドが定義されています。

$gameMap.players() では、プレイヤーキャラクターとフォロワー(ついてくる仲間)の一覧が取得でき、それらの battler メソッドで味方のバトラー一覧が取得できます。
$gameMap.allEnemiesOnMap は、マップ上の敵キャライベント一覧を取得します。こちらも battler メソッドで敵のバトラー一覧が取得できます。
(どちらも MOG_ChronoEngine.js 内で定義されています)

.map(x => y) のような配列操作関数については、MDNのドキュメントに詳しく書かれているので、必要ならそちらを参照してみてください。
https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/map

これらをconcatでくっつけて一つの配列にし、それぞれについて updateStatesTurn を実行させ、ステートの時間を進行させれば解除に至るはずです。
ただ、解除されたことを目視するためにはステートに関する描画を更新しないといけないので、もしかしたら SceneManager.updateScene() も合わせて実行しないと解除されたことがわからないかもしれません。

そこまで加味すると最終的に以下のようになるかと思います。

コード: 全て選択

$gameMap.players().map(player => player.battler()).concat(
  $gameMap.allEnemiesOnMap().map(enemyEvent => enemyEvent.battler())
).forEach(battler => {
  $gameChrono.updateStatesTurn(battler, null);
});
SceneManager.updateScene();
アバター
にゃたま
記事: 837
登録日時: 2016年1月13日(水) 23:53
お住まい: 床下の猫王国-すみませんが体調悪いのでサポートはお休みさせていただきます
連絡を取る:

Re: マップ画面でのステート解除条件をリアルタイムに仕様変更

投稿記事by にゃたま » 2020年2月29日(土) 19:47

Plasma Dark様

ありがとうございます。
おかげさまで自動的に毒が解除されるようになりました。
私自身こちらのMOG_ChronoEngineには興味があり
いずれ使ってみたいと思っていたので今回の件は非常に参考になりました。
元々はこめかみ様の質問に回答したことが始まりでしたが
MOG_ChronoEngineとはご縁があるみたいですね(^^;
私ではスクリプトはそれほど知識なく解決できないのでお願いして正解でした。
紹介いただいたMDNのサイトは時間のあるときに見ておきます。
とても勉強になりそうなサイトの紹介ありがとうございました。



こめかみ様

前にPlasma Dark様が書かれたコード(SceneManager.updateScene();の無し版)
で解決できますのでお試しください。
直接的に力にはなれなかったですが間接的には目的に到達できてよかったです。
お礼は私ではなくPlasma Dark様にお願いします。
それでは私の役目は終わったのでこれにて失礼します。


追記
マップイベントでなくとも並列処理のコモンイベントで動作しましたので付け加えておきます
アバター
こめかみ
記事: 104
登録日時: 2017年9月06日(水) 19:34
連絡を取る:

Re: マップ画面でのステート解除条件をリアルタイムに仕様変更

投稿記事by こめかみ » 2020年3月02日(月) 20:35

>にゃたま様
>Plasma Dark 様
返信が遅れ申し訳ございません。
記載のコードにてステートの時間解除ができました!
ややこしいプラグインにも関わらず解析頂いた Plasma Dark 様
そして丸投げしたにも関わらず、解決まで親切に対応頂いた にゃたま様
本当にありがとうございました!

“MV:質問” へ戻る