【ウディタ】お店ごとに販売する商品をデータベースで管理する

レビニアでございます。今回はお店の商品をデータベースで管理しようという試みよ。まぁウディタでゲームを作る際には基本的な手法ね。

ただ、ちょっと珍しいテクニック(というか特殊文字)も活用していくから、知識学習にはなると思うわ。

お店商品管理用のDBを作成する


それじゃデータベースから作っていくわよ。ユーザーDBの空きIDに新規作成してね。
→「タイプ」欄の未使用欄(空白部分)をクリック
 ※空きがなければ「タイプ数の設定」で数を増やす
→「タイプの内容設定」をクリック

ちなみに1つの店で登録できる販売商品だけど、「アイテム」「武器」「防具」がそれぞれ20種づつの計60種とするわ(それだけ設定できれば十分よね?)。


「タイプの内容設定」をクリックするとこんな画面が表示されるから、各項目を以下のように設定してね。
→タイプ名:お店管理
→データIDの設定方法:手動で設定
→項目名0~19:名前「アイテム\d[0]」、初期値「-1」、設定方法「▼特」
 ※「\d[X]」については後述

そしたら各項目欄の「▼特」をクリックして以下のように設定してね。個別に入力するのは面倒だから、設定画面の下にあるコピペボタンを使うといいわよ。


1ページ目の0~19番はアイテムを選択する項目に設定するわ。以下のように設定して頂戴。
→設定方法:データベース参照「ユーザーDB2番(アイテム)」
→-1~-3の項目:すべて「なし」

ここで余談。いま使った「\d[x]」だけど、これはデータベースの項目名だけで使える特殊文字で、[]内に書いた数字+項目番号が表示されるの。

0~19番の項目名に「アイテム\d[0]」と入力したわよね。これが、


こんな感じで項目番号+カッコ内の値に変換されるわけ。要は直接数字を入力するより楽に連番を付けられるということね。

※詳細は「YADOT-WOLF」さんの解説ページをご参照ください。


DBの設定に戻るわ。まぁそんな感じで1ページ目(アイテム)設定が済んだら次は武器。2ページ目の20~39番に武器を設定するんだけど、項目番号が20番からになるから、今度は「\d[x]」には-20を入力するわ。
→項目名20~39:名前「武器\d[-20]」、初期値「-1」、設定方法「▼特」


アイテムの時と同じようにDBを参照して、今度は武器を選択するように設定するわ。
→設定方法:データベース参照「ユーザーDB3番(武器)」
→-1~-3の項目:すべて「なし」


2ページ目に武器を選択できる項目が作成されたわ。項目名に「\d[-20]」を使ったから、項目番号から-20された数値が連番として表示されているわね。


3ページ目の項目40~59番は防具用よ。項目番号が40番からになるから、今度は「\d[x]」には-40になるわね。
→項目名40~59:名前「防具\d[-40]」、初期値「-1」、設定方法「▼特」


アイテム、武器と同様にDBから防具を選択するように設定。
→設定方法:データベース参照「ユーザーDB4番(防具)」
→-1~-3の項目:すべて「なし」


3ページ目に防具を選択する項目ができたわね。これでDBの準備はOKよ。

DBを参照してお店処理を実行するコモンを作成する

次は、準備したDBから陳列商品を読み取って実行されるお店コモンを作りましょう。ちなみに処理の流れは↓のような感じよ。

  1. 基本システムのコモン「お店 初期化」を実行して陳列商品を初期化する。
  2. ユーザーDBのお店情報を読み取って、コモン「お店 商品の追加」を使いループ処理で順次商品を追加していく。
  3. コモン「お店処理 実行」を呼び出す


空きIDにコモンイベントを新規作成するわ。
→コモン作成:名前「〇お店呼出」、起動条件「呼び出しのみ」


使用するセルフ変数はこちら。


まずはコモン呼出時の入力設定。1ページ目はさっき作ったお店用DBの選択に使うわ。
→名前:どの店?
→初期値:0
→特殊設定:データベース参照「ユーザDB19番(お店管理)」


2ページ目はお店のタイプ設定。基本システムの店コモンを呼び出す時に必要になるわ。
→名前:お店のタイプ
→初期値:3
→特殊設定:選択肢を手動作成「[3]売り・買い両方」「[2]買いのみ」「[1]売りのみ」


それじゃイベントコマンドを書いていきましょう。まず最初はお店の初期化、これを実行しないと以前に実行したお店の商品が残ってしまうから忘れないでね。
→■イベントの挿入[名]: [“【1】 お店 初期化”] <コモンEv 33>


そしたらループ処理で商品をユーザーDBから読み取り追加していくわ。まずはアイテムから。
→■変数操作: CSelf10[項番指定用] = 0 + 0
→■回数付きループ [ 20 ]回
→|■DB読込(ユーザ): CSelf11[品物ID] = ユーザDB[ お店管理 : CSelf0[どの店?] : CSelf10[項番指定用] ] (19 : – : -)
→|■条件分岐(変数): 【1】 CSelf11[品物ID] が 0 以上
→|-◇分岐: 【1】 [ CSelf11[品物ID] が 0 以上 ]の場合↓
→| |■イベントの挿入[名]: [“【2】 お店 商品の追加”] <コモンEv 34> / 1:アイテム[A] / CSelf11[品物ID] / -1:<なし> / -1:<なし>
→|◇分岐終了◇
→|■変数操作: CSelf10[項番指定用] += 1 + 0
→◇ループここまで◇◇


追加するアイテムには、変数呼び出し値でセルフ変数11番を指定するのよ。

これで、最初に作成したユーザーDBを読み取ってお店で販売するアイテムが設定されるわけね。


同じようにループを使って販売する武器も追加していくわ。
→■回数付きループ [ 20 ]回
→|■DB読込(ユーザ): CSelf11[品物ID] = ユーザDB[ お店管理 : CSelf0[どの店?] : CSelf10[項番指定用] ] (19 : – : -)
→|■条件分岐(変数): 【1】 CSelf11[品物ID] が 0 以上
→|-◇分岐: 【1】 [ CSelf11[品物ID] が 0 以上 ]の場合↓
→| |■イベントの挿入[名]: [“【2】 お店 商品の追加”] <コモンEv 34> / 2:武器[B] / -1:<なし> / CSelf11[品物ID] / -1:<なし>
→|◇分岐終了◇
→|■変数操作: CSelf10[項番指定用] += 1 + 0
→◇ループここまで◇◇


商品追加コモンの入力値も武器用に設定してね。


そして同じように防具も追加
→■回数付きループ [ 20 ]回
→|■DB読込(ユーザ): CSelf11[品物ID] = ユーザDB[ お店管理 : CSelf0[どの店?] : CSelf10[項番指定用] ] (19 : – : -)
→|■条件分岐(変数): 【1】 CSelf11[品物ID] が 0 以上
→|-◇分岐: 【1】 [ CSelf11[品物ID] が 0 以上 ]の場合↓
→| |■イベントの挿入[名]: [“【2】 お店 商品の追加”] <コモンEv 34> / 3:防具[C] / -1:<なし> / -1:<なし> / CSelf11[品物ID]
→|◇分岐終了◇
→|■変数操作: CSelf10[項番指定用] += 1 + 0
→◇ループここまで◇◇


防具用の入力設定。

これでユーザーDBで設定したアイテム、武器、防具の各20種がお店の商品に追加されたわ。


あとはお店実行コモンを呼び出すだけ。入力値の「お店のタイプ」にはセルフ変数1番を指定するのを忘れないでね(変数呼び出し値を使うのよ)。
→■イベントの挿入[名]: [“【3】 お店処理 実行”] <コモンEv 35> / CSelf1[お店のタイプ]

これでお店呼び出し用コモンは作成完了よ。

お店呼び出しコモンを試してみる


作成したコモンをマップイベントから呼び出して試してみましょう。ユーザーDBであらかじめ作ったお店設定を選択して実行するのよ。


今回はデータ0番に作成しておいたテスト用のショップを呼び出すわね。


ゲームを開始してマップイベントから実行したものがこちら。ユーザーDB「お店管理」で設定したとおりに商品が陳列されていれば成功よ。

お店の商品をデータベースから設定して実行する方法はこんな感じよ。お店の数が少ないならマップイベントで直接商品追加してもいいけど、お店がたくさんあるならこうやってDBを使うった方がいいわね。

お店に限った話じゃないけど、ゲーム中で使う何かしらの「値」というものはコモンイベントやマップイベントで直接指定するのではなく、なるべくデータベースで管理した方がいいわ。

※例えば、宝箱のアイテムやゲーム中の会話文とかね。

そうしておけば、後から追加修正したりする場合にいちいちイベントの方を修正しなくても、データベースからいじれるからとても楽になるのよ。