ウディタ講座 第7回 お店の改造
ウディタの基本システムにあるお店システム、よくできてますよね。でも売買できるのは1つずつだし装備可否の表示欄は何だかズレてるし……微妙にかゆいところに手が届かないのも事実。今回はこれらの点を改造してみましょう。
この講座でやること
・装備可否欄の整列
・まとめ買い用、個数選択コモンの作成
・お店実行コモンの改造。上記のまとめ買いコモンを呼び出す
Step1 装備可否欄の整列
まずは装備可否欄を揃えることから始めましょう。デフォルトだと名前の長さが異なるキャラがいる場合、装備可否欄の表示がズレてしまいます。これをなるべく手軽に修正する方法を考えてみます。
まずコモン86『X[移]┗ お店内部情報更新』の下の方を見てください。装備可否を示すメッセージを生成する処理が見えますね。
ここを次のように変更します。スペースの後に<R>(右揃え命令)を、改行後に<L>(左揃え命令)追加します。また、右揃えの都合で「■装備中」の後ろに全角スペースを追加します(文字数を揃えておく必要がある為)。
実際に表示して、ズレが無くなっていることを確認しておきましょう。現在のパーティ中で一番名前の長いキャラを基準として、全角スペース1文字分の隙間を空けて装備可否が表示されます。
もし現在パーティのキャラ名によらず常に同じ位置に表示したいなら、ループを抜けた後で、最後の行に改行+全角スペース11個を追記してください。全角5文字以下のキャラしかいないならこれで常に同じ位置に表示されます(全角スペースを12個にすると6文字のキャラにも対応できます。ただしその場合、ウインドウからはみ出しはしないもののかなり右寄りに表示されますが)。
Step2 まとめ買いコモンの仕様検討
本題のまとめ買いコモンの作成に入ります。今回は以下のような仕様で作ってみましょう。
・コモン84『X[移]お店実行』から呼び出す
・購入モードと売却モードを用意
・戻り値は選択した個数(0ならキャンセル)
・個数選択処理の最小個数は0、最大個数はモード次第(後述)
引数と戻り値は以下のようにします。
・引数1 : モード(1=購入モード 2=売却モード)
・引数2 : アイテム番号 ※注釈1
・引数3 : 単価 ※注釈2
・戻り値 : 選択個数
購入/売却できる最大個数は以下の式で計算できます。
・購入モード:次の(A),(B)のうち小さい方
(A)アイテム最大数(udb[17:0:0]) - そのアイテムの所持数
(B)所持金 / 単価
・売却モード:そのアイテムの所持数
※注釈1
アイテム番号は5桁の数で、19999以下なら道具、29999以下なら武器、39999以下なら防具を指します。例えば10008は道具No.8『癒しの雨の巻物』、20013は武器No.13『銀のダガー』、30004は防具No.4『綿のローブ』といった具合です。
※注釈2
原価はアイテム番号から取得できますが、割り引きされる可能性がある為、引数で受け取るようにしてます。
Step3 まとめ買いコモンの作成
コモン226を『お店個数選択』と名付けて、ここにまとめ買い用コモンを作成します。Step2で検討した仕様に従って作成していきます。
まずは引数と戻り値の設定。数値1~3にチェックを付けて、それぞれモード・アイテム番号・単価と名付けます。
数値1の設定は「選択肢を手動作成」してください(画像参考)。
数値2~3は「特殊な設定方法を使用しない」にしてください。
戻り値はcself[4]です。購入・売却個数は最終的にこの変数に入るようにします。
内部処理の作成に入ります。計算・描画に必要なデータをDBや引数から取得します。アイテム番号は10000で割るとアイテム分類に、10000での剰余を取ると分類内のアイテム番号になります。
【計算用】
・cslef[12] アイテムの所持可能な最大数
・cslef[13] このアイテムの現在の所持数
・cself[14] 現在の所持金
・cself[15] アイテム分類(1:道具 2:武器 3:防具)
・cself[16] 分類内のアイテム番号
【描画用】
・cself[5] アイテム名
・cself[6] ウインドウ画像
・cself[20] ピクチャのベース番号 ※注釈3
・cself[22] フォントサイズ
※注釈3
例ではピクチャ番号16000~を使う設定にしています。他の番号でもかまいませんが、12000~や15000~はお店の表示とかち合うので他の番号にしてください(不安ならお店画面でF7キーを使ってピクチャ番号を確認してください)。
Step2の式に従って売買可能な最大個数を計算します。購入モードと売却モードで計算式が異なります。
個数選択のループ前半、描画処理です。ピクチャ番号・座標・表示内容は以下のようにしています。
16000 ( 20, 200) 左上 ウインドウ(サイズ360x90)
16001 (200, 220) 中心 アイテム名(cself[5])
16002 (130, 235) 左上 個数と金額の文字列(cself[7])
16003 (270, 235) 右上 個数と金額の数値(cself[8])
文字列の先頭に\f[\cself[22]]とありますが、これはフォントサイズをcself[22]の値にする命令です。
ループ後半、キー入力処理です。左右キーで±1個、上下キーで±10個、個数を変化させます。決定時はそのままループを抜け、キャンセル時は選択個数を0にしてループを抜けます。当然、個数は0~<最大個数>の範囲に収まるように制限をかけます。ループを抜けた後、コモンの末尾では使用したピクチャ(16000~16003)を消去します。
キー入力処理の中身はこのようにしてください。4方向キーと決定・キャンセルを受け付けて、キーが押されるまで待つようにしてください。
Step4 まとめ買いコモンの呼び出し
コモン84『X[移]お店実行』をコモン225にコピーして、まとめ買いコモンを呼び出すように改造します。まずは購入時の処理から。
123行目付近に「買う処理」と題して処理アイテムと処理金額(単価)を代入している箇所があります。ここにまとめ買いコモンを挿入します。戻り値(取引個数)をcself[30]に受け取り、これを金額にかけます。
まとめ買いコモンの呼び出し設定は次のようになります。
この少し下、139、153、167行目付近に道具・武器・防具の増減処理があります。増減数はデフォルトでは1固定になっている為、ここをcself[30]にします(まとめ買いコモンの戻り値を受け取った変数です)。
185行目付近の「売る処理」についても同様の変更を行います。まとめ買いコモンを呼び出す時に売却モードにすることと、取引個数の符号をマイナスにすることを除けば、購入時とまったく同じです。もちろんアイテム増減数の変更(3箇所)もお忘れなく……
Step5 テストプレイ
さて、実行タイムです。
・購入時、選択した個数だけアイテムが増えて所持金が減っているか?
・売却時、選択した個数だけアイテムが減って所持金が増えているか?
以上の点を重点的に確認してください。
道具・武器・防具の3種類全てについて確認できたら成功です。