レストラン/ダイナーのミニゲームを作るには?

やあ!RPGツクールMVで、プレイヤーが料理を持ってNPC(客として行動する)に提供できるミニゲームを作れるか気になっていて、もし可能なら、どのように作成すればよいか知っている人がいたら教えてほしいです。とても楽しそうだし、プレイヤーがお金を稼ぐ方法にもなると思うんです!:smiley:

あと、客の忍耐時間を示すタイマーと、客からの注文機能も追加したいです。それらはどのように実装すればいいでしょうか?

はい、イベントだけで実装可能です。

核となるのは、プレイヤーが現在持っているアイテムを保持する変数です。キッチンやカウンターでのイベントがこの変数に値を設定し(1 = スープ、2 = パイなど)、プレイヤーの移動ルートを設定して「画像の変更」を行うことで、持ち物のスプライトに視覚的に切り替えることができます。

各顧客NPCには、その変数に対する条件分岐を設定する必要があります。変数の値が注文内容と一致する場合、「ゴールドの変更」を実行し、持ち物変数を0に戻して、プレイヤーの画像を元に戻します。一致しない場合は、何か言葉を発して何も起こりません。

注文については、各顧客に「変数の制御」→「ランダム」で独自の変数を与え、分岐で持ち物変数と比較するようにします。必要に応じて「タイマーの制御」を追加し、タイマーが終了したときに顧客が去るようにすることも可能です。

おっ!顧客をランダムに設定して、タイムリミットも追加できるかな?あと、変数や分岐についてはほとんど知識がないことを認めます。特に分岐については。正直、あまり賢くないんです(笑)。:sweat_smile:

もしよければ、これがどのように機能するかを示す画像の例をいくつか教えてもらえますか?

どちらも可能ですね。ランダムな顧客については、[コントロール変数] → [ランダム] で数値を生成し、その結果に応じて誰が入店し、何を注文するかを分岐させることで実装できます。また、時間制限については [コントロールタイマー] を使用します。

あなたが説明している内容とほぼ同じチュートリアルがあります。これはカウンターからコーヒーを取ってテーブルまで運ぶというカフェのアルバイトシミュレーションで、プラグインを使わずにイベントのみで構成されています。MZ 向けに作成されていますが、作者によると MV でも正常に動作するとのことです:Cafe Job/Minigame Tutorial RMMZ (No Plugins) | RPG Maker Forums

また、変数と分岐処理のみの部分については、ダウンロード可能なデモプロジェクトが用意されているこちらの方が、スクリーンショットよりも理解しやすいと思います。プロジェクトを開いて実際にクリックしながら操作できるのでおすすめです:RPG Maker MV - Switches, Branches & Variables [Basic] | RPG Maker Forums

そのチュートリアルは、顧客にコーヒーを振る舞うことしかできない場合にしか役立たないことが分かりました。どうやって注文をさせるか、タイマーを実装するかは分かりません。視的な例が本当に欲しいのですが、見つかりません。:sweat_smile::broken_heart:

タイマーや顧客リクエストの追加方法を視覚的な例で示してくれる方はいますか?お願いします。

ここでの顧客は1つのイベントページとして扱われ、トリガーは「アクションボタン」に設定されています。変数0011は注文内容、0012はプレイヤーが持っているもの、スイッチ0001はその顧客が何かを待っているかどうかを示します。

◆条件分岐: 変数 [0011: 注文] == 0
  ◆変数の操作: [0011: 注文] = 1〜3の乱数
  ◆タイマーの操作: 開始 (0分30秒)
  ◆スイッチの操作: [0001: 待機中] = ON
  ◆条件分岐: 変数 [0011: 注文] == 1
    ◆テキスト: スープをください!
  ◆それ以外
    ◆条件分岐: 変数 [0011: 注文] == 2
      ◆テキスト: パイをください。
    ◆それ以外
      ◆テキスト: お茶でお願いします。
◆それ以外
  ◆条件分岐: 変数 [0012: 所持品] == 変数 [0011: 注文]
    ◆テキスト: ありがとう!
    ◆ゴールドの操作: +100
    ◆変数の操作: [0012: 所持品] = 0
    ◆タイマーの操作: 停止
    ◆スイッチの操作: [0001: 待機中] = OFF
    ◆変数の操作: [0011: 注文] = 0
  ◆それ以外
    ◆テキスト: それは私が頼んだものではありません。

最初の分岐が全体の鍵となります。注文が0のままの場合、まだ注文していないことを意味するため、会話すると注文がランダムに決定され、タイマーが開始されます。それ以降のタイミングでは、注文は1、2、または3のいずれかになるため、同じイベントは「それ以外」側に分岐し、代わりにプレイヤーが何を持っているかをチェックします。2番目の条件分岐において、変数を選択する際、右側のボックスにも「変数」オプションがあり、これによって数値との比較ではなく、2つの変数同士を比較することができます。

タイマーが切れた場合の処理については、顧客イベントは会話した時のみ実行されるため、これとは別に「並列」トリガーを持つイベントを作成する必要があります。

◆条件分岐: スイッチ [0001: 待機中] がON
  ◆条件分岐: タイマー 0分0秒以下
    ◆テキスト: やめです、帰ります。
    ◆スイッチの操作: [0001: 待機中] = OFF
    ◆変数の操作: [0011: 注文] = 0

外側のスイッチチェックが重要です。停止しているタイマーは0として読み取られるため、このチェックがないとマップ読み込み直後にその分岐が実行されてしまいます。

これを基に構築を進める前に知っておくべき点として、MVではゲーム全体で使えるタイマーは1つしかないため、各顧客に個別のカウントダウンを与えることはできません。1人ずつなら問題ありませんが、複数の顧客が同時に待機する状態にしたい場合は、並列イベント内で変数を使ってカウントダウンを行う方式に変更する必要があります。そのバージョンのコードも作成できます。

おお!本当にありがとうございます!家に帰ったら試して、結果をお知らせしますね!

すみません、例がうまく理解できません。動画の例の人のシステムに合わせてやってみましたが、彼のシステムとこちらの例をどう組み合わせればいいのかわかりません。これまで試したことを載せます。:')

大丈夫です。2つの設定は同じ役割を異なる方法で果たしているので、それらを統合するよりも、どちらか一方を選ぶ方が簡単だと思います。

アイテムごとにスイッチを設けると、プレイヤーが持って歩けるアイテムごとに、すべてのテーブルに個別のページが必要になります。さらに、顧客が実際に注文した内容を記録する場所がありません。そこで私が提案するのは、コーヒーあり/ケーキあり/ピザありのスイッチを、1つの変数に置き換えることです。これにより、各テーブルは1つのページに戻り、ランダムな注文が可能になります。

空いている変数、例えば「0011 持ち物」を選びましょう。0は両手が空の状態、1=コーヒー、2=サンドイッチ、3=ハンバーガー、4=サラダ、5=ケーキ、6=エッグ、7=ピザとします。このリストはどこかに書き留めておいてください。頻繁に参照することになります。

ケーキのイベントは以下のようになります:

条件分岐:変数 0011 持ち物 == 0
   テキスト:ケーキのスライスを持ち上げた!
   変数操作:0011 持ち物 = 5
   キャラクター画像変更:(ケーキを持っている)
 : Else
   テキスト:すでに両手が一杯だ!
 : End

他の食べ物イベントも、同じブロックで数字だけ異なるため、イベントをコピーして2か所を変更するだけで済みます。

次に、各テーブルに個別の注文変数、例えば「0012 テーブル2 注文」を設定します。顧客が座った時点で、「変数操作 → 0012 → ランダム 1〜7」で料理を選びます。テーブルのページは以下のようになります:

条件分岐:変数 0011 持ち物 == 変数 0012 テーブル2 注文
   SE再生
   変数操作:0011 持ち物 = 0
   ゴールド操作:+ 料理の代金
   セルフスイッチ操作:A = ON
   キャラクター画像変更:(両手が空)
 : Else
   テキスト:それは私が注文したものと違う!
 : End

条件分岐ウィンドウの変数タブで、2番目のボックスにあるラジオボタンを「定数」から「変数」に切り替えると、2つの変数を比較できるようになります。

セルフスイッチAと「すでに提供済み」というメッセージを含むページ2は、そのまま引き継がれます。変更は不要です。

顧客が何を望んでいるかを伝える部分では、会話イベント内で変数0012に基づいて分岐させ、番号ごとに1つの分岐を用意し、対応するテキストを表示します。一度番号体系が決まれば、すべてがその番号に基づいて動作します。

コーヒーやその他の食べ物を「持ち運び変数」にどう設定すればいいですか?あなたのやり方を試してみたいのですが、もしこれらの質問がすごく馬鹿げているようでしたらごめんなさい。私はこれが本当に苦手でして…

全く心配しないでください。

その「制御変数」の設定は、まさにあなたが望んでいることをしています。変数というのは単に箱に入った数字に過ぎないので、それ自体が何かを引き起こすわけではありません。「持ち物:食べ物?」に 1 を設定することは、テーブルイベントが後で読み取れる場所に「グリルチーズ」と書き込んでいるようなものです。マリアが実際にそれを抱えているように見えるようにするのは、その直下にある「アクター画像の変更」行です。

つまり、各食べ物のイベントは、数字だけが異なる同じブロックになります。例えば、1 = グリルチーズ、2 = コーヒー、3 = ハンバーガー、4 = サラダ、といった具合です。どの数字を使うかによりますが、そのリストはどこかに書き留めておいてください。頻繁に確認することになるでしょう。

もう一つ、「Else」分岐についてですが。これは「持ち物:食べ物?」が 0 ではない場合に常に実行されるため、グリルチーズだけでなく、手に何かを持っているすべての場合に発動します。現在の記述では、実際にサラダを持っているのに、グリルチーズを顧客に持っていけというメッセージが表示されてしまう可能性があります。こちらはむしろ「すでに手一杯です」という単純なメッセージに変更したほうが良いでしょう。スイッチ 0131「持ち物:食べ物」も不要になります。変数がその役割を今では担っているからです。

本当に申し訳ありません…できる限りの努力をしましたが、どうしても理解できません。このミニゲームを作りたいのに、次にどう進めばいいか全く分かりません。完全に壊れてしまっているようです。あまりお世話になりすぎていたら申し訳ありませんが、プロジェクトを送ったら、解決策を見つけていただけますか?Discordは使われていますか?もう一人でどうにもできなくなってしまいました。

あなたのイベントは実際には非常に近い状態にあります。スクリーンショットを見る限り、3つの問題が発生しているようですが、これらはすべて最初から作り直すのではなく、小さな修正で済むものばかりです。

  1. Random 0..2 の行について。0がこの範囲に含まれているため、時々彼女は0を振り、何も注文しないため、彼女と話しても何も起こりません。その Control Variables の行をダブルクリックし、Random 1..2 に変更してください。

  2. 「Carrying Food? = Customer Order」のチェックが配置されている場所について。現在、これは注文を生成する部分の中にあり、そのため彼女は注文し、同じ訪問中にあなたがすでにそれを保持していることを期待しています。これはあなたのコメントで説明されている状況です。注文と配達を別々の訪問に分ける必要があります。「If : Customer Order = 0」の行をダブルクリックし、「Create Else Branch」にチェックを入れてOKをクリックしてください。イベントの下部に新しいElseが現れ、配達のチェックをそこに移動できます。

  3. フリーズについて。テーブルの移動経路にある「Move Down」が原因だと考えています。テーブルは実際に下へ移動できません(何か障害物があるため)、かつ「Wait」がチェックされているため、ゲームは完了しない移動を待ってフリーズしてしまいます。画像変更は単独では正常に機能するため、その移動経路を開いて「Move Down」の行を削除してください。

これらの修正を行うと、あなたの名前を使用して、全体として以下のようなイベントになります:

◆If : Customer Order = 0
  ◆Control Variables : #0013 Customer Order = Random 1..2
  ◆Control Switches : #0132 Waiting = ON
  ◆If : Customer Order = 1
    ◆Text : I'll have some Grilled Cheese please!
  ◆Else
    ◆Text : I'll have some Coffee please!
  ◆End
◆Else
  ◆If : Carrying Food? = Customer Order
    ◆Set Movement Route : Table 1 (Wait)
    :                   : ◇Image : Puddles(5)
    ◆Change Actor Images : Maria (empty hands)
    ◆Text : Thank you!
    ◆Change Gold : + 100
    ◆Control Switches : #0132 Waiting = OFF
    ◆Control Variables : Carrying Food? = 0
    ◆Control Variables : #0013 Customer Order = 0
  ◆Else
    ◆Text : That's not what I ordered!
  ◆End
◆End

末尾の2つの Control Variables は、Orderが0に戻り、あなたの手が空になるため、次回彼女が再度注文できるようにするためのものです。後に別の料理を追加する場合は、上半分(注文部分)に別のElseとTextを追加するだけで、配達部分(下半分)は変更されません。テーブルの上の皿が料理に一致させる場合、配達部分には「Set Movement Route」だけを囲む独自の「If Customer Order = 1 / Else」が必要ですが、まずは1つの皿の画像で動作するようにすることを推奨します。

おっと!0に設定して、テーブルを「下に移動」にしていたなんて気づきませんでした!「角度を下げる」に設定していると思ってたんです!

そんな私に辛抱強く教えてくれてありがとうございます。最後のメッセージを送った後、プロジェクトを送っても大丈夫か不安で、時々ゲームのサポートをしてくれる友達に相談しました。もともと彼らに聞くべきだったのですが、迷惑がられないかという不安から友達に助けを求めるのがいつも心配で、聞けずにいました。イベントの設定が画像で確認できるのはとても助かりますし、自分でも少しいじってみようと思います!もし友達と私で解決できない場合は、DMで連絡します!本当にありがとうございます!:smiley:

@Baz がまたもや救世主!この質問を投げてくれた @StressedAsHell さん、そして楽しいハバーズのみんな、ありがとう!