複数のステート候補からランダムで1つのステートを付与する方法

#ツクルーム フォーラム RPGツクールMZ (RPG Maker MZ) 複数のステート候補からランダムで1つのステートを付与する方法

  • このトピックには8件の返信、3人の参加者があり、最後にPema23により1ヶ月、 2週前に更新されました。
10件の投稿を表示中 - 1 - 10件目 (全10件中)
  • 投稿者
    投稿
  • #705 返信
    D君
    ゲスト

    特定のアクターがパーティにいると、戦闘開始時、又は、ターン開始時に、確率で、複数のステート候補からランダムで1つのステートをパーティ全員に付与する方法を教えて下さい。

    【試したこと1】

    特定のアクターがパーティにいることを条件に、スキルとして用意した複数のステートを、コモンイベントで乱数を使って1つ抽選して、「戦闘行動の強制」で特定のアクターに抽選されたスキルを使用させ、バトルイベントで実行してステートを与える方法。

    【問題点】

    「戦闘行動の強制」の「対象」の影響か、スキルに設定された「範囲」が上手く適用されない点。

    【試したこと2】

    PassiveAutoBuff.jsの導入。

    【問題点】

    ステート付与の記述を複数設定しても、最後に設定したステートしか発動せず、ランダムに抽選できない点。

    #706 返信
    ツクールAI君
    メンバー

    ## RPGツクールMZ ステートランダム付与に関する質問の要約

    – **実現したいこと**: 特定アクターがパーティにいる場合、戦闘開始時またはターン開始時に、確率で複数のステート候補からランダムに1つを選択し、パーティ全員に付与。
    – **試したこと**:
    – コモンイベントで乱数を利用しスキルによるステート付与を試みるも、「戦闘行動の強制」の対象指定の影響でスキル範囲が正常に動作せず。
    – PassiveAutoBuff.js導入を試みるも、複数のステート設定が機能せず、最後のステート設定のみ有効となる。ランダム抽選機能なし。
    – **試用プラグイン**: PassiveAutoBuff.js (//raw.githubusercontent.com/triacontane/RPGMakerMV/mz_master/PassiveAutoBuff.js)
    – **問題点**:
    – 「戦闘行動の強制」によるスキル範囲の不具合。
    – PassiveAutoBuff.jsでの複数ステート設定とランダム抽選機能の不足。
    – **不明点**:
    – 確率での発動をどのように実装するか。
    – 戦闘開始時とターン開始時のどちらをトリガーにするかの明示。

    投稿者様、こちらの要約は意図通りでしょうか?不明点が補足・追記いただけると回答が得やすくなると思われます。

    ### 回答

    PassiveAutoBuff.jsを改造する以外に、プラグインなしで実現する方法を提案します。

    **方法:コモンイベントとJavaScriptの併用**

    1. **ステートIDを配列に格納:**
    JavaScriptでステート候補のIDを配列に格納します。

    “`javascript
    $gameVariables.setValue(1, [1, 2, 3, 4]); // 例: ステートID 1, 2, 3, 4 を候補とする
    “`

    変数1にステートIDの配列を格納します。必要に応じて変数番号を変更してください。

    2. **コモンイベントの作成:**
    以下の処理を行うコモンイベントを作成します。

    – **条件分岐**: 特定のアクターがパーティにいるか確認
    – **条件分岐**: 確率による発動判定 (例: 乱数0-99が20未満なら発動 = 20%の確率)
    – **JavaScriptの実行**: 以下のスクリプトを実行

    “`javascript
    const states = $gameVariables.value(1); // ステートID配列を取得
    const randomIndex = Math.floor(Math.random() * states.length);
    const randomStateId = states[randomIndex];
    $gameParty.members().forEach(member => {
    member.addState(randomStateId);
    });
    “`

    このスクリプトは、配列からランダムにステートIDを選択し、パーティメンバー全員に付与します。

    3. **コモンイベントの呼び出し:**
    戦闘開始時またはターン開始時に、作成したコモンイベントを呼び出します。
    – 戦闘開始時:バトルイベントのページ1の先頭で呼び出す。
    – ターン開始時:ターン開始時に実行されるコモンイベントから呼び出す。

    **利点**:
    – プラグイン不要
    – 確率による発動を容易に実装可能
    – 複数のステートを柔軟に設定可能

    **補足**:
    – ステートIDはデータベースで確認できます。
    – 確率は乱数の範囲を調整することで変更できます。
    – JavaScriptの知識が少し必要ですが、コードは比較的シンプルです。

    ※閲覧者の皆様、私の回答に問題がありましたら、ご指摘いただけると助かります。
    また、解決できた場合、トピックを編集し「トピックを解決済みにする」にチェックを入れてください。

    #710 返信
    munokura
    参加者

    AIの回答はURL以外は合っているようです。
    プラグインのURLは記載したほうが良い回答が得られやすいです。

    試したプラグインは下記ですか?
    https://plugin-mz.fungamemake.com/archives/4913

    一応、AIの回答を実験しました。
    設定方法の説明が回りくどい(色々な方法があるせい?)ので、実現できた例のスクリーンショットをアップします。


    また、コモンイベントを下記のように変数を使わない作りにすることも可能です。

    ◆条件分岐:リードがパーティにいる
    ◆スクリプト:// ステートID 7,8,9,10 を候補とする配列を設定
    :     :const states = [7, 8, 9, 10];
    :     :
    :     :const randomIndex = Math.floor(Math.random() * states.length);
    :     :const randomStateId = states[randomIndex];
    :     :$gameParty.members().forEach(member => {
    :     : member.addState(randomStateId);
    :     :});
    ◆
    :分岐終了

    • この返信は6ヶ月、 1週前にmunokuraが編集しました。理由: スクリーン・ショットの並びが間違っていたので修正
    #712 返信
    D君
    ゲスト

    ありがとうございます!動作の確認が取れました!大変勉強になります…。

    ただ、テストをしているとステートが付く時に何かしらのアニメを表示したいという更なる欲が出て来てしまい、最初に自作していたステート入りスキルを抽選し、行動の強制で実行するやり方に戻ってしまいました。強制行動の対象を「ランダム」に設定することでスキル側の効果範囲が上手く機能している?ような気がするので、何とかイメージには少しだけ近付けたかもしれません。

    もう一つの問題は、バトルイベントで実行する時に、戦闘開始時も含め、毎ターン、コマンド入力前に実行したかったのですが、戦闘開始時以外は、ターン開始時に上手く起動できず、強制行動が抽選されたアクターは1回分の行動を失ってしまうという問題も抱えております。

    こちらは、戦闘開始時(ターン0+0)とターン終了時に起動の2つイベントを用意して妥協しようかと悩んでおります;

    一先ずですが、質問の件は動作の確認が取れましたので解決として頂いてもOKです。

    #715 返信
    munokura
    参加者

    やりたいことが、もう一歩分かりません。

    なにかのついでの時にでも一読いただけると、質問が伝えやすくなるかも知れません。
    https://fungamemake.com/archives/8079

    どういう設定をしているのか直感的に分かりません。
    できるだけ箇条書きを使って、内容を分類いただけると伝わりやすいと思います。

    質問を整理すると下記のような疑問点があります。
    1. ステート付与時にアニメーションを表示したい
    「アニメーション」が指しているもの
    A.データベースに登録されているアニメーション
    B.アクターのモーション(攻撃やアイテムを使用しているような動作・SV戦闘)
    どちらか?それとも両方?

    2. 毎ターンのコマンド入力前にステート付与を行いたい
    A. 戦闘システムは何を使用していますか?
    システム1>戦闘システム
    ・ターン制
    ・タイムプログレス(アクティブ)
    ・タイムプログレス(ウェイト)
    毎ターンとのことで「ターン制」でしょうか?

    3. 行動を1回分失ってしまう
    強制行動の仕様なので、アクターのモーションを使用したい場合、「戦闘開始時(ターン0+0)とターン終了時」での設定は妥当だと思います。

    別の解決策で思いつくのは例えば、下記のようなプラグインでターンを消費しないスキルに指定する方法が考えられます。

    ▼Torigoya ターン消費なしスキル(Ruたん様作) – TorigoyaMZ_QuickSkill.js
    https://plugin-mz.fungamemake.com/archives/938
    選択するとターンを消費せずに即発動するスキルを追加します。

    4. アニメーションの表示方法の模索

    4-1.コモンイベントにアニメーション表示を追加(モーションなし)
    モーションが不要であれば、上記コモンイベントの中に下記のような「戦闘アニメーションの表示」を入れる方法でもアニメーションを表示できます。

    ◆戦闘アニメーションの表示:敵グループ全体, 光/全体2

    4-1-2. アニメーションをアクター全体に表示するスクリプト(モーションなし)
    ・コモンイベント作成

    
    ◆条件分岐:リードがパーティにいる
      ◆スクリプト:$gameParty.members().forEach(actor => {
      :     :    // 33の部分はアニメーションのID
      :     :    $gameTemp.requestAnimation([actor], 33);
      :     :});
      ◆スクリプト:// ステートID 7,8,9,10 を候補とする配列を設定
      :     :const states = [7,8,9,10];
      :     :
      :     :const randomIndex = Math.floor(Math.random() * states.length);
      :     :const randomStateId = states[randomIndex];
      :     :$gameParty.members().forEach(member => {
      :     :    member.addState(randomStateId);
      :     :});
      ◆
    :分岐終了
    

    ・バトルイベント作成
     ・戦闘開始時(ターン0+0)
     ・ターン終了時
    の2ページで上記コモンイベントを実行。

    4-2.プラグイン
    スキルを使用しないで、アニメーションをアクターに表示したい場合、下記のプラグインが利用できるかも知れません。

    ▼戦闘アニメーションの表示を拡張(あわやまたな様作) – BattleAnimationPlus.js
    https://plugin-mz.fungamemake.com/archives/6424
    「戦闘アニメーションの表示」を拡張します。

    ▼NUUN 戦闘中のアクターへのアニメーション実行(NUUN様作) – NUUN_BattleAnimationEX.js
    https://plugin-mz.fungamemake.com/archives/5723
    イベントコマンドの戦闘アニメーションの表示では敵グループにしか選択できません。このプラグインではアクターにも表示出来るようにします。また敵グループはデフォルトだと8番目までしか選択できませんが9番目以降でも指定できるようになります。指定の敵ID、アクターIDにアニメーションを表示することができます。

    どれかが希望に当てはまると良いのですが。

    • この返信は6ヶ月、 1週前にmunokuraが編集しました。理由: 重複部分を整理
    • この返信は6ヶ月、 1週前にmunokuraが編集しました。理由: スクリプト修正
    #719 返信
    D君
    ゲスト

    ありがとうございます。分かりにくくて申し訳ありません。やりたいことは質問の通りなのですが、もう少し全体像から記しておきます。

    【やりたいこと】

    フロントビュー、ターン制バトルで、特定のアクターがパーティにいる時に、戦闘開始時~毎ターン開始時に、ランダムで特殊効果が発動し、パーティに恩恵を与えたり、敵に不利益を与えたりする。

    この効果は、アクターと同じタイプの敵がバトル上にいる場合は敵側にも同様の効果が表れる。

    ①戦闘開始時~毎ターン開始時とは、コマンド入力前のことです。

    ②特殊効果、敵に不利益とは、様々なステートを指します。(例:ダメージ、状態異常、回避率アップ、再行動率アップ、戦闘後入手経験値上昇…など様々。)

    【試してみたこと】

    先の書き込み通りです。特定のアクターを条件に、ステートを仕込んだ複数のスキルを乱数で抽選し、戦闘行動の強制で抽選されたスキルを使用させています。(コモンで用意しバトルイベントで敵味方共に起動しています。)

    【上手くいかない点】

    毎ターン開始時(コマンド入力前)に起動できません。戦闘開始時の0+0は上手くいきますが、0+1とかになるとコマンド入力後に起動されて、強制行動のアクターの行動が消費されてしまいます。

    【妥協しようか悩んでいる点】

    上記の理由から、戦闘開始時の0+0と、ターン終了時のみ起動で諦めようかと思っています。ただ、ステートの効果によっては持続ターンが1回分損している?ような気がするので、今一つスマートじゃないかな…とは感じでいます。

    【質問の疑問点について】

    1.アニメーションについて

    データベースのアニメーションを指しています。

    2.戦闘システムについて

    フロントビュー。ターン制です。

    今制作中のものではなく、別の作品になりますが、サイドビュー、タイムプログレス制で、戦闘開始時のみ効果が発動するというものを、今回と同様の処理で作ったことがあります。

    3.行動を1回分失ってしまうについて

    その通りでございます…毎ターン開始時はデフォルトで用意されていそうな気もしていたのですが、意外と曲者でした。頭が痛いです。

    4.アニメーションの表示方法について

    行動を消費しないオートで発動するスキルというイメージなので、スキルを使用した時と同じイメージです。

    もし、教えて頂いたやり方で、抽選されたステートとその効果範囲ごとにアニメを個別に設定できるようでしたらそちらのやり方も試してみたいと思います。

    その他、教えて頂いたいくつかの方法は、今度時間が取れましたら一つずつ試してみたいと思います。お手数をお掛けして済みません、ありがとうございます!

    #720 返信
    munokura
    参加者

    条件を整理すると、下記のようなコモンイベントをバトルイベント(ターン0、ターン終了)で実行すれば済むと思いました。
    何かイメージと違ったらごめんなさい。

    
    ◆条件分岐:リードがパーティにいる
      ◆変数の操作:#0001 一時使用 = 乱数 1..4
      ◆条件分岐:一時使用 = 1
        ◆戦闘アニメーションの表示:敵グループ全体, 回復/全体2
        ◆敵キャラのステート変更:敵グループ全体, + 睡眠
        ◆
      :分岐終了
      ◆条件分岐:一時使用 = 2
        ◆戦闘アニメーションの表示:敵グループ全体, 無属性/全体3
        ◆敵キャラのステート変更:敵グループ全体, + 魅了
        ◆
      :分岐終了
      ◆条件分岐:一時使用 = 3
        ◆戦闘アニメーションの表示:敵グループ全体, 治療/全体2
        ◆ステートの変更:パーティ全体, + 睡眠
        ◆
      :分岐終了
      ◆条件分岐:一時使用 = 4
        ◆戦闘アニメーションの表示:敵グループ全体, 闇/全体3
        ◆ステートの変更:パーティ全体, + 激昂
        ◆
      :分岐終了
      ◆
    :分岐終了
    
    • この返信は6ヶ月前にmunokuraが編集しました。理由: コモンイベントの微修正
    #722 返信
    D君
    ゲスト

    ありがとうございます!私も(ほぼ)同じ作りです。

    違いは乱数の結果に「何も起こらない(発動無し)」も入れていることと、「アニメーション」と「ステート」を「スキル」として一つにまとめて実行しているので、バトルログにスキル発動時の「特殊効果~が発動した!」と、ステートに掛かった時の「~は~(ステート)になった!」まで見れるようにしてあることくらいです。

    最初に試しましたPassiveAutoBuff.jsが、ランダム抽選以外の全てを満たせる、まさに限りなくストライクゾーンに近いプラグインだったのですが、こちらはこちらとして引き続き使わせて頂き、また、AI君のスクリプトも「相手に気付かれずに密かに状態異常にかかる」ような別の効果物として利用できるかもしれないので、ストックしておこうかと思っています。

    色々とお手数をお掛けして申し訳ありません;こちらもターン0&ターン終了で妥協しようかと思っていますので、解決として頂いてOKです。ありがとうございました!

    *今回の件で、ちょっとした疑問なのですが、ツクール的には「ターン終了」とは「ターン開始」と同じ意味なのでしょうか?私の認識的には、進行中のターンの最後と、これから始まる新しいターン…という、処理的に「切り替わる前」と「後」という解釈だったのですが…。ステートの持続ターン数にも影響が出ている(1ターン損している?)ような気もしているのですが…

    あと、試してダメだったのでツクールの仕様と思うのですが「ターン0+0」で「スパン」を「ターン」にすれば、毎ターン、コマンド入力前に起動できそうな気もしてしまいました。

    #766 返信
    Evelyn
    参加者

    特定アクターがいる場合にランダムでステートを付与するには、コモンイベントで乱数を使い、配列からステートIDを選択してパーティ全員に付与し、戦闘開始時とターン終了時にバトルイベントで呼び出すのが簡単です。アニメーションは$gameTemp.requestAnimation([対象], アニメID)で表示可能。

    • この返信は1ヶ月、 4週前にEvelynが編集しました。
    #785 返信
    Pema23
    参加者

    戦闘勝利時の音楽をループさせたい場合は、勝利MEではなくBGMとして設定するのが適切です。具体的には、データベースで勝利MEを「なし」にし、戦闘結果画面用のプラグインで勝利BGMを直接再生します。リザルト画面への遷移ウェイトを0に設定すれば、キー入力があるまで音楽が途切れず再生され、ファンファーレやループ部分も自然につながります。

10件の投稿を表示中 - 1 - 10件目 (全10件中)
返信先: 複数のステート候補からランダムで1つのステートを付与する方法
あなたの情報:




ゲスト