ウディタでランダムエンチャントを実装する

ゲーム開発

今回はランダムエンチャントの実装方法だー!自分的にはゲームにランダムエンチャントシステムがあるだけで、かなり面白く感じちゃうんだよね。気合入れていくぞッ!!

記事内で全ての工程を説明するものではありません。ランダムエンチャントコモンの実装の際は下記リンクからコモンをダウンロードして頂き、導入してください。この記事は、ウディタ初心者向けにランダムエンチャントの作り方の考え方やカスタマイズ例を提示しています。

参考にさせて頂いたコモン。基本システム2.10用 ランダムエンチャントコモン 作者:くれあ

ランダムエンチャントを実装する

ツールバーの説明

ウディタ上部のメニューにあるこれ。とても良く使うので覚えておこう。左から順に

ユーザーデータベース(UDB)、可変データベース(CDB)、システムデータベース(SDB)、タイルセット、マップの基本設定、コモンイベントエディタになる。

主な概要

  • UDB:未加工の原料が入ってる箱
  • CDB:UDBに入っている原料を加工した成果物を格納しておく箱
  • SDB:ウディタのシステムに関する変数が格納されている箱
  • タイルセット:マップを構成するマップチップを設定するとこ
  • マップの基本設定:現在開いているマップの設定を変更するとこ
  • コモンイベントエディタ:命令を記述することで、様々なシステムの動きを実装する。

今回お世話になるのはUDB、CDB、コモンイベントエディタの3つだね。

ざっくりとした流れ

  1. UDBに武器のデータを用意する。
  2. UDBに修飾語のデータベースを用意する
  3. UDBに用意した「修飾語のデータベース」と「武器のデータ」のデータを、コモンイベントエディタで加工する
  4. 加工したデータをCDBに格納する

分かり難いので物で例えてみる

  1. 道具箱Aに人形を用意しておく
  2. 道具箱Bに、人形に着せる為の装飾品(服)を用意しておく
  3. それぞれの箱から素材を取り出して、人形に装飾品を着せる(加工する)
  4. 完成した人形を完成箱へ格納する

コモンイベントってのは「何をどうこうしろ」という命令を記述する為のもの。つまり「作業場」がコモンイベントエディタという場所。「作業場で行う作業」がコモンイベントって訳。

素材(データベースとデータ)の準備

素材Aの準備

面倒な人向け

random.zip
をダウンロード
UDBの3:武器に「タイプ(データ含む)_003_武器.dbtype」を上書き

UDBの18:に「タイプ(データ含む)_018_武器修飾語.dbtype」を読込
CDBの20:に「タイプ(データ含む)_020_エンチャ武器格納庫.dbtype」を読込
コモンイベントで加工するまで進んでください。

ではでは、まずはユーザーデータベースを開いてみよう。タイプという所に「3:武器」が、「4:防具」というのがあるね。3:武器をクリックしてみよう。画面の右半分に、武器の名前や装備のタイプ、攻撃力の増減などがずら~っと表示されたね。

これがデフォルトでUDBの中に用意されている武器のデータベースだ。よく見てみるとデータが0~23まで用意されている中で空白の部分があるね。6、12、18、19、20、21が該当するね。

これはランダムエンチャントの処理をする上で邪魔になってしまうので削除してしまおう。5:木の杖をクリックして、Ctrl+Cでコピー。空白の6:をクリックしてCtrl+Vでペースト。

同様に11:鉄の杖を12:にコピペ。
17:ウィザードロッドを18~21にまでコピペ。コピペした元と先にアルファベットで識別がつくようにしておく。

どうせ作るのなら項目名も増やしてしまおう。「タイプ内容設定」を開いて「ページ2をクリック」。「レア度」と「捨てるか?」を追加。

「捨てるか?」は、▼特をクリックして画像の通りに設定しよう。

これで素材Aの準備は完了だね。

 素材Bの準備

タイプというところをスクロールして素材Bを探してみましょう。勿論無いですね。という訳で素材Bを作りましょう。

  1. 「タイプ数の設定」を押す
  2. タイプ数18→19に変更(1つ増やす)
  3. まっさらな状態の素材B用のデータベースが出来ました。

でもまっさらですよね。なので素材Aのデータベースを少々拝借しましょう。
タイプの「3:武器」を選択した状態でCtrl+C。18:を選択した状態でCtrl+V。これで全く同じ状態のデータベースが出来上がりました。

素材B用に変更していく

  1. 18:武器を選択。「タイプ内容設定」をクリック
  2. タイプ名を「武器」から「武器修飾語」に変更(画像内だと接続語になってるけどスルーして)
  3. データ数を24から5に変更
データ数を5に減らした訳だけど、自分で作る場合は自由だよ。例えば、修飾語が「低品質な、普通の、高品質な」の3つしか設定しないのであればデータ数も3で十分。逆に50以上のデータを用意する気合の入った人もいるよ。
それぞれのデータに入力をしていこう。
でかい画像だから大きくして見てね。データの0~4までに適当に名前を付けていく。文章も修飾語に合わせて変更する。画像で見る通り、修飾語のデータベースはページ2が存在する。
緑枠で囲った場所が単純なステータスの増減値を設定する場所。青枠は中級者向けなので、ここでの説明は割愛する。
ここで「UDB 3:武器」と少し違う作業が入る。エンチャントの加工をする際に単純な足し算引き算だけでなく、割合での増減を可能とする為の項目の追加だ。詳しくは画像で見て確認して欲しい。
数値が100なのは100%だから。100%=1倍。90%であれば0.9倍。150%であれば1.5倍ということになる。
単純な足し算引き算で増減値を決めてもいいが、私のオススメはメインとなるステータスに倍率を掛ける方法。武器の修飾語であれば攻撃力だけに
低品質なら0.7倍、普通なら1倍、高品質なら1.2倍、最高級なら1.5倍、神なら3倍と設定する。
残りのステータスは単純な足し算の数字を設定しておく。
ここまでの流れを軽くおさらいしよう。ダガーという武器に神のという修飾語が付いた流れを文字に表すと、「UDB:3武器」から「ダガー」が選ばれて、「UDB:18武器修飾語」から「神の」が選ばれる。すると二つが合体して「神のダガー」という名前になる。ステータスの上昇下降を合算し、出来た装備はコモンイベントでCDBに格納することになる訳だ。

計算の流れは適当に

  1. 「ダガー」のMaxHP変化値+「神の」MaxHP変化値→「神のダガー」のMaxHP変化値
  2. 「ダガー」のMaxMP変化値+「神の」MaxMP変化値→「神のダガー」のMaxMP変化値
  3. 「ダガー」の攻撃力増減×「神の」攻撃力増減→「神のダガー」の攻撃力増減

修飾語のレア度や修飾語の意味合いを参考に決めていけばいいだろう。「鋭い」だったら会心率を上げるだとか、「高品質な」だったらベース武器の全ステータスを105%にするなど。

これで素材Aと素材Bが揃ったことになる。次はこれをコモンイベントで加工することになるが、完成品を格納しておく箱も必要だろう。

CDBに用意するのだったよね。可変データベースを開こう。勿論、今の状態では完成品を格納する為の箱は用意されていない。先ほどUDBで増やしたやり方でタイプ数を1つ増やそう。

まっさらなDBが出来たら、今度はUDBを開いてタイプの3:武器を選択した状態でCtrl+C。CDBを開いて新しく出来たところを選択した状態でCtrl+V。

UDBからコピーしてきた3:武器というデータベースを、CDBに丸々コピーした状態だね。注意するのは、UDBのデータベースには項目を2つ追加しているから、それもちゃんとコピーされているか確認すること。確認したらデータベースの名前を変更しよう。名前は自由だけどエンチャ武器格納庫という名前に変更しよう。(ちょくちょくタイプ名が違っててごめん)

データ数が23までしかないね。これは24個しか武器を持てないということを指す。とりあえず300個くらい持てるように、データ数を変更してみよう。

そして最後に、元々入っている武器のデータも要らないね。ここに入る予定なのはエンチャントされた後の武器だからね。

ここまでで素材と、加工後の作品を格納しておく箱が出来上がったね。残すところは「加工」の工程だけとなる。

コモンイベントで素材を加工する

主な作業順序は以下。

  1. エンチャント装備が格納出来る領域を探す為のコモンの作成
  2. ベース装備を取得して、CDBに格納するコモンの作成
  3. CDBに格納されているベース装備に、修飾語をくっつけるコモンの作成

順番にやっていこう。

メニュー上部にある、画像で言えば一番右のEvというのがコモンイベントエディタのアイコンなのでクリックしよう。

これがコモンイベントエディタの画面だ。何やら文字が沢山表示されているが、左側のメニューがコモン本体。右側の画面はそれぞれのコモンをクリックした時に表示されるもので、それぞれのコモンの中身が表示されている。

とりあえずデータ最大数の変更というボタンを押して、適当に最大数を増やしておこう。それではランダムエンチャントのコモンを作成をしていく。

 

 「未使用箇所取得」というコモンを作ろう

CDBに作ったエンチャ武器倉庫の空いている部分を探してくれるコモンだ。コモンイベント一覧の219:に作ってみよう。

プログラムの流れを辿ってみよう。

コモンを呼び出す時の引数はcself0。0だったら武器の空きチェック。1だったら防具の空きチェックをする。チェックを開始する前に、格納庫という変数cself10に-1を代入して初期化する。

ループ開始後、すぐに格納庫という変数に+1を加えることで、エンチャ武器格納庫の0番目から順々に空き状況を調べていくことになる。その際にチェックする項目は、「使用チェック」という項目。使用チェックという項目が1の間はループをし続けて、1回ループする毎にcself10に+1を加算していく。使用チェック0を見つけたらループを終了。

さて、使用チェックが0のところを見つけたとして、そのcself10をどうやって教えればいいのか?

設定を押すと入力内容のウィンドウが開く。画面の下部に「結果を返す」という文字が見えるね。そこにチェックを入れて、名前をコード番号(自由)、返す値をcself10(コモンセルフ10)にしてあげよう。

このコモンを呼び出すと、エンチャントの武器や防具を手に入れた時に格納する場所を見つけることが出来るよ。

 ランダムエンチャントの本体となるコモンを作る

「218:」に作ろうか。早速、「未使用箇所取得コモン」が出てきていますね。コモンの設定はどうすればいいか。武器エンチャなので、取得モードは武器ですね。武器を格納出来る場所は、このコモン内の変数であるcself2に代入しましょう。ちなみに、CSelf2[空いている場所]とは自分で付けた変数名です。変数名も自分で付けることが出来るのはわかっているとは思うので、自分の分かりやすい変数名をつけて混乱しないようにしましょう。

cself0には「UDB3(3:武器)」を指し示す3を入れ、cself1には「UDB18(18:武器修飾語)」を指す18を入れます。これで格納出来る場所を示す変数、ベース武器の変数、修飾語の変数が揃いました。

続いて、ベース武器を取得するコモンと、エンチャントを付加するコモンを作ります。

 ベースとなる武器を取得するコモン

「220:」に作ろう。わかりやすく名前に武器取得(ベース)とでもつけておこう。

これが「UDB 3:武器」からランダムでベース武器を取得して、「CDB 20:エンチャ武器格納庫」にコピーするコモンです。ちょっとミスってますね。ループ変数を1にして説明文もループ内で処理した方が良かったです。

Cself20を条件判定としてIF文を使っています。武器とエンチャ武器格納庫は項目名が[31]までなので、1回ループする毎にCself20に1を足していくことで大幅に記述の削減をしています。

Cself10=乱数0~20というのがありますね。これは 8000000 という7桁の数字がウディタの中で乱数を表しています。8000020だと0~20の21個の中からランダムで数字を1つ取得しろということです。なぜここで、20という数字が出てきたかというと、「UDB 3:武器」に存在する武器データが0~20までの計21個だからです。存在するデータが50なら8000050ということ。

レア度によって色を変えるといった処理もしていますが、比較的単純なコモンなので順を追って確認してみてください。(色は2色のみしか設定してないので、カスタマイズしてみてね)

 ランダムエンチャントするコモンを作る

長いわ。ループなり使えれば良かったのですが、項目名がちょくちょくズレてたりしたので、単純な計算式でエンチャをしました。こちらでもレア度によって文字色を変更しています。現在はレア度2以下とレア度3以上という、2つしか選択肢がありませんが5つや6つに増やすことも簡単なので、是非カスタマイズしてみてください。

後は、装備説明を 「修飾語の説明文」+「ベース装備の説明文」という形で繋げたくらいですかね。流石にコモンの流れを説明するというのは大変なので、全体の処理の流れを確認は、ご自分でお願いします。

 ランダムエンチャントコモン完成……?

コモンイベントエディタの「218:」に先ほど作った、エンチャント取得コモン。これでようやく動きますね。未使用箇所取得コモンで取得出来る場所を探して、素材Aと素材Bの場所の数値を変数に渡してあげて、その変数を使って武器ベース取得のコモンと、エンチャント付加コモンを呼び出す。

最後に、使用チェックと所持個数に1を加え完了。後は呼び出すだけで、ランダムエンチャントが成された武器が手に入ります。

ランダムエンチャントを確認しよう

適当にイベントを配置して、コモンを呼び出す!

うおおおおおおおおおおおおおおおおお

ランダムエンチャント完成

と思いきや、「UDB 3:武器」から「CDB20:エンチャ武器格納庫」に記述を変えないといけないコモンが他にも結構あったのであった orz

例えば、主人公がダガーを装備した時のことを例に出すとデフォルトのシステムでは
「UDB3:武器」のダガーから各ステータスを参照し、各装備の所持数で「CDB8:所持武器個数」で管理をしている。

だがこの度作ったエンチャントコモンでは、新しく生成し格納した「CDB:20エンチャ武器格納庫」から各武器のステータスを参照し、武器の所持数も同じ場所で管理している。この変更に伴って、既存のデフォルトシステムの随所を書き換える必要がある。

ウディタでデフォルトで組み込まれているコモンに「110:X[移]アイテム一覧算出」というコモンがあります。開いてみますと……

赤文字でチェックポイントと表示されている箇所が5つあります。これは私がチェックをつけたものですが、その各所の一つ下を見てください。4つが「UDB3:武器」のデータを、1つが「CDB8:所持武器個数」のデータを変数に格納しています。

この変数へ格納している参照元を全て「CDB20:エンチャ武器格納庫」に変更する必要があります。処理の変更自体は簡単ですが、修正箇所が多いと中々に根気の必要となる作業になります。

今回の修正の場合は「UDB3:武器」を参照元としている命令がかかれている箇所をチェックする必要があるので、検索を使いましょう。

コモンウィンドウの上にある検索をクリックすると、検索ウィンドウが開きます。

検索語は、「ユーザDB[ 武器」ですね。(武器の前には半角空白が入っているよ)検索する対象はコマンド文。検索する範囲は全てのイベントになりますね。修正箇所を見比べて変更する必要があるかどうか、判断していきましょう。同じ方法で「CDB8:所持武器個数」を参照している場所も修正していきます。全て修正が出来れば、めでたくランダムエンチャントのコモンが完成します。

 カスタマイズする力をつける

ランダムエンチャントは好きな人が多いゲームシステムです。自分の作品にも取り入れたい!と考える人も多いでしょう。ですが、実装する為には壁が存在するのも確かです。

幸いにもランダムエンチャントのコモンを公開してくれている作者さんがいるので、実装すること自体は難しいことではありません。ですが、コモンを読み込んで終わり……ではなく、それらの作り方を理解しておくのは作品作りやカスタマイズの際に、生きてくることです。

ありがちな問題で、ある程度ゲームを作ってしまっている状態でコモンを読み込むと、既に読み込んでいるコモンと競合が起きてしまって動かない時があります。全く動かなくて諦めてしまう人もいます。そんな時でも、多少なりとも自分で修正をする力をつけておけば、競合箇所をどのように解決すれば良いかが理解できます。

 先人に感謝して

基本システム2.10用 ランダムエンチャントコモン 作者:くれあを導入して、自分好みのランダムエンチャントシステムへとカスタマイズしていこう。コモン作者さんへの感謝も忘れずに!

ここまでお付き合いいただきありがとうございました。

 実際に作るとこんな感じになる

 

面白いゲームを目指したはずの 開発報告03
コマンド勇者の開発報告のその3。こうやってみるとウディタって何でも出来るね。今回は、マップに表示されているキャラクターの可愛い動きや、ランダムエンチャントと自動売却といったシステムをgif動画にて公開させていただいた。

ベース名と修飾語を繋ぐ場合、実際には修飾語+ベース名という表記になる。この時、修飾語の色はベース名の色は別々に着くことになるが、贅沢を言えば、修飾語の例えば、豪華なという修飾語がある場合、「な」の部分まで色が付いてしまうことが少し残念。この繋ぎの一文字はアルゴリズムで判定するのが非常に難しく、一括で繋ぎの文字か否かを判定するのは実質不可能だと考えてよいだろう。

コメント

タイトルとURLをコピーしました