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

アバター
こめかみ
記事: 104
登録日時: 2017年9月06日(水) 19:34
連絡を取る:

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

投稿記事by こめかみ » 2020年2月25日(火) 18:16

お読みいただきありがとうございます。
ステートの解除条件[自己解除のタイミング]の[ターン終了時]はマップ画面では歩数で判定されると思うのですが(20歩で1ターン扱い?)、これを歩数関係なく、時間の経過(ターン数の項目にフレーム単位で指定)で解除にする方法はないでしょうか?

ゲーム内で変数やコモンイベントを使うのではなく、rpg_objectsを直接改変してでできれば良いのですが。
2220行目あたりのstateturnと3500行目あたりのstateStepsがそれらしきでしょうか……
最後に編集したユーザー こめかみ on 2020年3月02日(月) 20:36 [ 編集 3 回目 ]

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

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

投稿記事by にゃたま » 2020年2月25日(火) 22:07

komekami様

こんばんは。
恐らくやりたいことはマップでステート付与させたとき時間経過で解除ということで
回答させていただきますが、以下の感じで並列処理を利用すれば可能と思います。
タイマーを使ってもできますしウェイトでもできます。
ステートは仮に毒としています。ともに10秒経過で解除されます。
戦闘シーンは考慮していませんのでご了承ください。



○先ずはタイマーから。但しタイマーが実行されるとマップに表示されるので
非表示したい場合は別途スクリプトをいじって(若しくはプラグインで)対策する必要あります。

コモンイベント8に以下を実装(名前:ステート解除タイマー トリガー:並列処理 スイッチ:12 ステート解除タイマー)

コード: 全て選択

◆条件分岐:タイマー ≤ 0分0秒
  ◆ステートの変更:ハロルド, - 毒
  ◆タイマーの操作:停止
  ◆スイッチの操作:#0012 ステート解除タイマー = OFF
  ◆
:分岐終了


マップイベントに以下を実装

コード: 全て選択

◆ステートの変更:ハロルド, + 毒
◆タイマーの操作:始動, 0分10秒
◆スイッチの操作:#0012 ステート解除タイマー = ON




○ウェイトで行う方法。この場合フレーム単位での実装が可能です。

コモンイベント9に以下を実装(名前:ステート解除フレーム トリガー:並列処理 スイッチ:13 ステート解除フレーム)

コード: 全て選択

◆ウェイト:600フレーム
◆ステートの変更:ハロルド, - 毒
◆スイッチの操作:#0013 ステート解除フレーム = OFF


マップイベントに以下を実装

コード: 全て選択

◆ステートの変更:ハロルド, + 毒
◆スイッチの操作:#0013 ステート解除フレーム = ON




当方の環境ではこれでできました。ご参考くださいませ。


追記
戦闘でステート付与された場合の対策方法としてステート付与時コモンイベント実行のプラグインが使えます。
https://plugin.fungamemake.com/archives/2103

まずハロルドのメモ欄に以下を記載

コード: 全て選択

<AddState4Common:7>


コモンイベント7に以下を実装

コード: 全て選択

◆スイッチの操作:#0013 ステート解除フレーム = ON


これでハロルドにステート4の毒が付与されたらコモンイベント7で並列処理スイッチがオン
されてフレームウェイトが開始されます。マップに戻ったときにカウント開始します。
他にも方法は多数あると思いますが一例として。
アバター
こめかみ
記事: 104
登録日時: 2017年9月06日(水) 19:34
連絡を取る:

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

投稿記事by こめかみ » 2020年2月26日(水) 06:43

>にゃたま様
回答ありがとうございます。
プレイヤーキャラに関して、ご提案頂いた方法で解決しました (^^)

ただ、別途使用しているアクションRPGプラグインの仕様にて、マップ上でプレイヤー・敵イベント双方にステートを付加できるのですが(敵イベントに関してマップ上での指定が難しく)ステートの仕様そのものを時間で強制的に解除させる方法を探しておりました。
こちらに関してはもう少し模索させて頂こうと思います<(_ _)>
アバター
にゃたま
記事: 837
登録日時: 2016年1月13日(水) 23:53
お住まい: 床下の猫王国-すみませんが体調悪いのでサポートはお休みさせていただきます
連絡を取る:

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

投稿記事by にゃたま » 2020年2月26日(水) 07:53

Komekami様

なるほど了解です。別プラグインを使用しているとの記載がなかった為、プラグインを使用してない標準の状態でのやり方を、記載しました。

よろしければその別に使っているプラグインの名前を教えて頂けたらこちらでも調査できますがいかがでしょうか?
ただ解決出来るかは別の話になりますが…
そのプラグインは私の知らないもののような気がします…
アバター
こめかみ
記事: 104
登録日時: 2017年9月06日(水) 19:34
連絡を取る:

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

投稿記事by こめかみ » 2020年2月26日(水) 10:04

>にゃたま様
別プラグインを記載すると逆にややこしいかもと、無記載でした申し訳ございません :oops:

もし差し支えなければゲームデータ自体を見て頂くのが早いかも知れません。宜しくお願いいたします。
アバター
にゃたま
記事: 837
登録日時: 2016年1月13日(水) 23:53
お住まい: 床下の猫王国-すみませんが体調悪いのでサポートはお休みさせていただきます
連絡を取る:

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

投稿記事by にゃたま » 2020年2月28日(金) 22:29

Twitterにて連絡いただきMOG_ChronoEngineを解析していましたが
私の技術力ではどうしても解決できなさそうでした。

こめかみ様のやりたいこととしては以下のとおりです。
MOG_ChronoEngineを使ってマップイベントを敵として配置しています。
攻撃スキルに毒ステート100%の使用効果の攻撃を加え毒ステートを付加させ
これを時間経過により解除したいということです。

ステートのターン制だと動かないと解除されないので(敵イベントは固定されている)
動かなくとも時間で解除されるようなプラグイン
(例えばステートのメモ欄に<ReleaseTimer:60>←数字はフレーム単位の解除時間
と書かれているとマップ上で時間制で解除されるようなもの)
があると理想ですが探してみた限りではそういった機能のプラグインが見つかりませんでした。
こうしたプラグインをご存知の方見えましたら報告いただけましたら幸いです。

プレイヤーに対しては先述した私のやり方で解決できますが敵に対してはこの方法は使えません。
もし敵のステート情報を取得、更には変更できると並列処理のウェイトを使用して出来そうですが…。

なにか良い知恵がある方見えましたら私に変わってご助力願えませんでしょうか?
アバター
Plasma Dark
記事: 676
登録日時: 2020年2月08日(土) 02:29
連絡を取る:

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

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

MOG系はゲームの根っこを大きく書き換える上、コードとして可読性を投げ捨てているので、まずサポートしてもらえないものと思ったほうが良いです。
MOG_ChronoEngine.js も1万行オーバーの凄まじいコードなので、まず読むだけでもしんどいですね。

雑に読んだ限りだと、 $gameMap._battlersOnScreen なる変数がいます。
使われ方から見るに、画面内の戦闘可能なユニット一覧を表す配列です。
リジェネ、ステートやバフのターン経過や持続ダメージは updateStatesTurn メソッドでターン経過処理を行っているようです。

なので、めちゃくちゃ雑に実現するとすれば、以下のスクリプトを一定時間ごとに起動できれば良いのではないかと思います。

コード: 全て選択

$gameMap._battlersOnScreen.forEach(character => {
  $gameChrono.updateStatesTurn(character.battler(), null);
});


ターン経過ごとの処理を時間経過ごとにやっちゃう感じになるので、これだと毒の持続ダメージとかも時間経過ごとにガシガシ入ることになります。それはそれで楽しそうですが。

もしそれを避けたいのであれば、 Game_Chrono.prototype.updateStatesTurn ライクな処理を新しく書いたプラグインを用意するとやや柔軟になるかと。
アバター
にゃたま
記事: 837
登録日時: 2016年1月13日(水) 23:53
お住まい: 床下の猫王国-すみませんが体調悪いのでサポートはお休みさせていただきます
連絡を取る:

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

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

Plasma Dark様

解決策を提示いただきありがとうございます。仰られたように
単純にマップに以下のように並列イベントを配置し一定時間ごと(60フレームごと)
に起動しましたがうまくいかず時間経過で毒が解除されませんでした。
スクリーンショット 2020-02-29 9.19.38.png

毒ステートは以下のような設定です
スクリーンショット 2020-02-29 9.23.55.png

このやり方でどこか問題あるでしょうか?
アバター
Plasma Dark
記事: 676
登録日時: 2020年2月08日(土) 02:29
連絡を取る:

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

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

MOG_ChronoEngine.jsのStates Durationパラメータの設定はどうなっているでしょう。

Game_Chrono.prototype.updateStatesTurn の処理を読めばわかる通り、このメソッド1回の呼び出しについて、1単位時間だけステートが進行します。
States Duration×1単位時間 経過したときに、ステートのターンが経過します。
States Durationのデフォルト値は240ですので、3ターン経過するために必要な単位時間は240 x 3 = 720です。

720秒 = 12分(実際には処理の遅延で+α?)で自動解除されるんじゃないかと思いますが、動作確認してないのでなんとも。(ひょっとしたら、描画を更新するために SceneManager.updateScene() を呼び出す必要があるかも?)
持続時間分待っても解除されないのであれば、状態異常になっている対象エネミーが $gameMap._battlersOnScreen の中に含まれているかどうかご確認いただいたほうが良いかもしれません。
アバター
にゃたま
記事: 837
登録日時: 2016年1月13日(水) 23:53
お住まい: 床下の猫王国-すみませんが体調悪いのでサポートはお休みさせていただきます
連絡を取る:

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

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

PlasmaDark様

迅速に対応いただきありがとうございます。
一つ重要なことを伝え忘れておりました。
MOG_ChronoEngineではBattleModeにABSモードを使用しているという点です。
クロノモードではないのでどうも以下の関数を実行しないようです。
Game_Map.prototype.targetsOnScreen
したがってthis._battlersOnScreen.push(character);によりプッシュされておらず
つまり $gameMap._battlersOnScreenの中にはなにも入らないようです。
これが理由でどうもうまくいかないようです。
ABSモード時の方法はありませんでしょうか?

尚、States Durationは初期設定の240でしたのでこれですと確認に時間がかかるので60に変更
しました。これでも時間がかかるのならもっと小さくするべきでしょうか?

“MV:質問” へ戻る