「LIVEMAKER関数のーと。」     

 LIVEMAKER関数のーと。



こちらでは、LIVEMAKER(以下LM)関数について、オンラインヘルプの補足解説? などを試みております。
(※ HUMANBALANCE様とは関係ございません。あくまでいちユーザーの作成支援試みページでございます)
目標は、LM関数を理解し(イメージをつかみ?)使えるようになろう、です
なお、記載してあるものはるきあの使用したことのあるものなので、すべてを網羅することにはならないと思われます(主にDB系。三角関数とかは手が出なそう…)
なお使用しておりますのは開発版です。

☆無事旅から戻れました。文中でのたまってました
“精霊使い”用の未完のらんちゃー(動かしたことすらない…)と未完のれしぴ(動かされたことすらない…)も“精霊使い”資料ぺーじにひきつづきこそっとおいてます。
もともとオープンソースにする予定でしたので、ご興味ありましたら…とはいってもビルドすら終わってないしろものですので、むしろ同梱の開発メモ???? のほうがお役に立つかも知れません。



◆DBって役に立つの? 何に使うといいの?
◆DBってどんなもの?
 (持っておくと理解と運用に助かるイメージ)

◆DBを使ってみよう 0〜テーブルをゲット!〜
(DB関数『DBCreateTable』を使って)
コラム◇“アクティブ”について。
◆DBを使ってみよう 1〜真っ白なテーブルを“使えるデータ表”にしよう〜
(DB関数『DBAddField』や『DBLoadTsvFile』を使って)←ぷち補足しました
◆DBを使ってみよう 2〜データを入れてみる。そのデータを取り出してみる〜
(DB関数『DBDirectSet○○』『DBDirectGet○○』を使って。事例とぷち応用)
  1(DBDirectGetStr)
  2(DBDirectSetStr)
  3(DBDirectGet/SetBool、DBDirectSet/GetInt)
◆DB関数をからめた記述・本格応用例(ここがヤマです!!)
◆応用 選択肢設定のところを低容量で記述する(しかも使いまわしできまくり! な)方法

コラム◇SetGetでやっちゃいがちなこと。


 →→→トップページへお戻りの際はブラウザバックでお願いしますm(__)m



※ 他サイト様や書籍様からの単なる抜書きは、決してしません(ご紹介はしても…ただの抜書き、かつこの規模では存在意義がヤバいです)。
疑惑も避けるため、他サイト様や書籍様と内容がダブらないように、逐次調査をしていきます。
もしダブってしまった(ている)ことが判明しました場合には、その旨明記、ご紹介致します。
ただし、調査のスピードは正直、遅いです(素人の個人ですもので…)。
そのためもし、まだるきあの気づいていないダブリを発見された場合、宜しければお知らせ下さい。新着情報としてご紹介(匿名希望可能です)→確認しだい、正式にご紹介と致します。
また、おそらく誤解、間違いも気をつけてはおりますが、やはりでてくるかと思われます。大変お手数ですが、ご指摘、ご指導を頂けますと幸いでございます。

メール下さるさいはここをぽちっとお願いします。

◆DBって役に立つの? 何に使うといいの?

正直、DBについてまっったく理解してなくても、LMでゲームは作れます。
変数だけで、なんとかなっちゃいます。
最悪、存在を知らなくっても平気なほどです…

それでも、DBは役に立つのです!!

DBが便利なのは、例えば多人数育成シミュレーションゲームなどです。
人数分のパラメータ用変数を、ぜんぶ作ったらすごく多い〜…などという場合には、DBにキャラたちのパラメータを持ってもらえば俄然楽になります。


…なお、DBを応用すれば、オリジナル言語開発もできます。
オリジナル言語開発というのはつまり『自分のよく使う機能を、短いコマンドワードで一括して呼び出すちびプログラムを作る』ということなので、いやでも便利な環境ができてしまうのです。
難点は、一応とはいえシステム全体を作るハメになること。オーサリングソフトを使用する利点が半減しますので、特別のこだわりや事情がある場合以外はお勧めしません。

↑の具体例。
るきあの場合、『精霊使い』の制作にあたって、

・『自機が95(爆)で、ネットにつなげるMEは親のパソ』という環境のため、ほっとくといつまでたっても具体的な制作作業すすまない
・お相手が10人、隠しひとり(のちにふたりに増えました(爆))、主人公は男女両方しかも性格タイプあり、という人口密度のために、人数分の処理を直接、GUIで記述するのは無理だった(手間も恐ろしいがそれ以上に容量が…)

…という状況につき『テキスト(系)ファイルに、選択肢や計算まで含めたシナリオ部分を記述したもの』を実行できるシステムがどーしても必要! だったので、なかばやむなく? やむにやまれず?? オリジナル言語開発をすることになったのです。

こんなことしてまでLMにこだわったのは、逆にこんなことまでできるソフトをるきあが知らないからです。
変数名を合成して記述することができるソフトを、るきあは他に知りません(関数AssignTempを利用するとできます(プロ用でなくてもできます!)。もう涙出るほどありがたかったです…)。
・20060527追記 nScriptでも変数名合成できそうです。いろんなもの全て自分指定っぽいので手におえなそうですが…


◆DBってどんなもの?
 (持っておくと理解と運用に助かるイメージ)

LMのDBについて…
かじりはじめに最初にひっかかるところがコレだと思われます。
『とにかく、どんなものかよくわからない。DBってなに? どういうものなの? 何に使うの?』

ぶっちゃけ、DBとはデータ表です(断言)。


具体的なイメージとしては…
身近なところで、エクセルを思い浮かべていただくといいかとおもわれます。
・シートにますめ…セルがたくさんあって、セルのなかに数値などのデータが入る。
・シートはエクセルと同じように、作ったり削除したりできる。何枚ももてて、それぞれが別個の表として使える。(“テーブル”と呼ばれます)

エクセルと違うところは、
・各“列”(タテの並びですな)にどういうデータが入るかが、かならず表の一番上に書いてある(項目タイトルと呼ばれます)。ってか、書かないといけない。
・セルの内容を直接、セルの中で計算したりとかはできない。そのへんはほんとに、単なる表とおなじ。
(内容はあくまで、変数や関数つかって扱う。変数にDBから数値を入れて計算したり、その結果をDBに書き込んだり…。このへん詳しくは、あとのコラムで。)


…こんなカンジのデータ表ファイルを、LMは自分の中に隠し持ってます。
これがLMのDBです。
(コンパイル→ランすると、デバッグが現われますが、これのDBというところで見られる表がそれのようです。表示されてない場合、更新ボタンをぽちっと行ってください。)
わたしたちユーザーは、このDBに計算結果を書き込んだり、逆にこのDBから数値などを持ってきて利用することができます。
(そして、このときに使うコマンドワードが、DB関数なのです。詳しくは後程!)



◆DBを使ってみよう 0〜テーブルをゲット!〜
(DB関数『DBCreateTable』を使って)

LMのDBとはつまり、いろんなデータを書き込んだり、逆に書き込んであるデータを読み出したりができる『データ表』です。
この『データ表』は、LMのシステムが、自分の内部に隠し持ってます。
…とはいっても、最初からもってるワケではないようです。

エクセルでも、最初はXLSファイルを作りますが…
LMでDBを使いたいときは最初に、DBの新しいテーブルをつくってやることが必要です。


●それをやるための具体的な方法。
たとえば てーぶる1、という名前のテーブルを作ろうと言う場合には…

・フラグ型変数fをつくっときます。
・チャートの、テーブル作りたい順番のとこに計算ノードを作ります。
・そこにf=DBCreateTable("てーぶる1",FALSE)と書きます。

これで、できます。
ここより後の工程で、DBテーブル てーぶる1を使うことができるようになります。


●…の、ざっと解説。
初のDB関数登場です。
その名も『DBCreateTable』
『指定名のテーブルを作成し、そのテーブルをアクティブにする。成功ならTRUEを返す。』という働きの関数です。
上の例では f=DBCreateTable("てーぶる1",FALSE) というカタチで、いろんなモジ引き連れて登場していて一瞬わけわかりませんので、大体の日本語訳をしてみます。

変数fを使ってね。
=
DBに新しいテーブルを作って下さい。テーブル作成が成功したら、=のまえで指定した変数にTRUE入れて下さい。んで、そのテーブルをアクティブにしといてちょ
(なおテーブルの名前はてーぶる1っす,
ステータス扱いかどうかは…FALSEです)

ステータス扱い、というのは後述? します。
とりあえず「ゲーム中のパラメータとか、ふつーの」入れとく用DBにしたければFALSEでOKです。
見たエンディングや見たCG、コンプ率とか(ゲームクリアしても値は元に戻されない。ずーっと継承されるやつ。)入れとく用DBだと、TRUEになります。

●推測に基づく初心者的Q&A。
Q テーブル作りたいだけなのに、どうして成否報告をfに入れて…とか必要なの?
A テーブル作りが失敗したときの対策が立てられるようにだと思われます。
作ったツモリでも、何らかの原因で実際できてなかったら当然使えない→ので、失敗したときのりかばりープロセスを用意とかしなきゃイケナイ→でも失敗したかどうかがわかんないとそもそもどーにもならない。そのために成否報告が必要だから、なんですな。

Q アクティブにする…って???
A すたんばいOK! 状態にすることです。
コラム◇“アクティブ”について。(…の最初。●アクティブにする、とは?)にまとめましたのでご参照下さい!
(その先はまだ読まなくて大丈夫です♪)

Q ステータス扱い…とかって??
A ゲームが終わったりしたときに初期化するかどうかとか。ちょっと感覚的なガイネンなので、本家LiveMakerホームページのヘルプページをご参照下さい。
図入りの例をあげて説明してありますため、わかりやすいです。



コラム◇アクティブについて。

●アクティブにする、とは?
すたんばいOK! 状態にすること。

・DBとそっくりさんのエクセルを例に取ると
『シート1にカーソルがあって、もーいつでも入力(とかカーソル移動ももちろん。)できますよ〜』という状態が『シート1がアクティブになってる』って状態。

・つまりDBでは
『テーブル“DB1”にカーソル(…でいいと思う)があって、もーいつでも入力(とかカーソル移動ももちろん。)できますナリ!』という状態が『“DB1”がアクティブになってる』って状態。

・つまり
『あるテーブル(とか)をアクティブにする』ってコトは、『そのテーブル(とか)に入力カーソルもってくる』ってコト。
…と考えるといいと思われます。


●アクティブにできるもの。
テーブル(エクセルていうシート)とレコード(ヨコ一列のデータのかたまり。)です。
たぶん正確には、エクセル同様のイメージで、
あるセル(…つまりデータ入りマス。)がアクティブになってる
→おかげで、そのセルがあるレコードもアクティブってコトになる。
→→おかげで、そのレコードがあるテーブルもアクティブってコトになれる。
でいいんだと思われますが…。

使われてる用語としては、「テーブルをアクティブにする」「レコードをアクティブにする」っです。
(ちなみに、“あるセル”を指定する場合には、「指定レコードの指定項目」を指定する、というカタチになります。クロス検索的に指定するわけですな♪)


●テーブル/レコードをアクティブにする方法。
すべてDB関数を使います。※どれも、成功ならTRUEを返してきます。

[テーブルをアクティブにするDB関数]
・DBCreateTable 指定名のテーブルを作成し、そのテーブルをアクティブにする。
・DBSetActive 指定名のテーブルをアクティブにする。

[レコードをアクティブにするDB関数]
・DBSetRecNo アクティブテーブルの指定番号(つまり上から〜番め)のレコードをアクティブにする。
・DBFindPrior/Next/Last/First アクティブテーブルのアクティブレコードの前/次/最後/最初のレコードをアクティブにする。 ・DBLocate アクティブテーブルの中から指定レコードを検索しアクティブにする。
・DBInsert アクティブテーブルにレコードを追加し、そのレコードをアクティブにする。
・DBDelete アクティブテーブルのアクティブレコードを削除し、その次のレコードをアクティブにする。

[じつはアクティブにしないらしいもの]
・DBDirect系の関数。各種型のデータをゲットorセットするが、このときにそれをしたいテーブル、レコードを指定できる。ただし、このときその「指定されたテーブルやレコード」をアクティブにはしないらしい?
2006.11.03 やっとこ検証できました! これは「しない」です。データをとりにいくだけで、ちゃんと元に戻ってくれます。うう、そりゃそうだったか…(涙)


●「テーブルをアクティブにした」とき、レコードは?。
「直前にそのテーブルつかってたとき、アクティブだったレコード」がアクティブになると思われます。(検証中です)



◆DBを使ってみよう 1〜真っ白なテーブルを“使えるデータ表”にしよう〜
(DB関数『DBAddField』や『DBLoadTsvFile』を使って)
前のこらむでは、DB関数『DBCreateTable』を使って、DBテーブル てーぶる1を作成しました。
よっしゃ、これでデータを出し入れできるかな…と思ってしまいますが、それをするためにはもう1ステップの作業が必要です。
表の一番上の行に、項目タイトルを書き込まなければいけません。


エクセルの場合ですと、シートを作った瞬間もうマスができています。
マスの並ぶ列、行にはABC…や123…という名前、番号がふってあって、たとえば「A200にジャンプ☆」なんてこともそのまんますぐできてしまいます。

しかし、DBのテーブルはそうでないのです。
ABC…や123…などは、振られていません。
項目タイトルがまだ書き込まれていない状態なのです。

なら書き込もう。というわけで関数ヘルプを見てみると、まっさきに候補に上がるのがコレです。
DB関数『DBAddField』
説明:アクティブテーブルに項目を追加する。成功ならTRUEを返す。
例文は
f=DBAddField("キャラ名",PT_STR,8)

↑例によって日本語訳しますと、

変数fを使ってね。
=
いまアクティブなテーブルに、新しいタテ列を確保して下さい。成功したら、=のまえで指定した変数にTRUE入れて下さい。
(タテ列につける名前はキャラ名っす,
そこに入るデータは文字ね。,
字数は8文字までぷりーず。(←※入れるデータが文字じゃないならここは0でいい))

となります。
つまり…
まえのコラムで作った計算ノードにはいって、まえに書いた文のあとにここでの例文を書き足すと、てーぶる1に「キャラ名」という名を冠した一列が現われるわけです!
ここには、8文字まで文字を入れられます。もちろん、もっと長いキャラ名使いたいときには8より大きな数字を入れるべし。

数字やフラグ用の列を入れたいときはこんなカンジ。
f=DBAddField("HP",PT_INT,0) ※小数使いたいならINTでなくFLOATとかく。
f=DBAddField("仲間にしてるか",PT_BOOL,0)
(←※入れるデータが文字じゃないなら最後のとこは0でいい)

これで(RPGとかだと基本的な?)「キャラ名」「HP」「仲間にしてるかどーか」の項目ができちゃいました。


しかし、一瞬の喜びの後、気づくモンダイ。
「まだSTRとかINTとかいろいろあるぢゃん…(汗)」
いや、この二つだけならまだしも(コピペして書き換えればいい)、さらにVITとかDEXとかカリスマ、アライメントとか相性値とか(←全部「オウガ」系(笑))…
しかも、それらにはそれぞれ値を(また他の式使って)入れなきゃならないとなると、この瞬間でDB使うの断念したくなります。


しかし、断念する必要はありません。
もっとラクな方法があるのです!!


例のような場合だと、すでにエクセルなどで名前、初期HP…などの設定表を作っていることと思われます。

そう、こんなカンジで。

名前  HP  仲間か  ・・・
みけ  30  TRUE
しろ  46  TRUE
さば  38  FALSE


この設定表がTSVファイル(特徴や作り方はこらむ参照。意外とカンタンです!)なら、関数一発で読み込めます。

DB関数『DBLoadTsvFile』
説明:アクティブテーブルに項目を追加する。成功ならTRUEを返す。
例文:
f=DBLoadTsvFile("キャラデータ.tsv")(※補足あり)

↑例によって日本語訳しますと、

変数fを使ってね。
=
いまアクティブなテーブルに、表をまるまる一枚よみこんで下さい。成功したら、=のまえで指定した変数にTRUE入れて下さい。
(表の名前(ファイル名)はキャラデータ.tsvっす(場所はプロジェクトファイルの直下ね★))

となります。
つまり、まえのコラムで作った計算ノードにはいって、まえに書いた文のあとにこの例文を書き足すと、てーぶる1に「キャラデータ.tsv」の内容がまるまる書き移されるわけです!
具体的には…
一番最初の行、名前…とかはいっている行が、そのまま項目タイトルとして設定されるし、各セルに入ってる数字などもちゃんと入力されます。


…かくして、真っ白だったテーブルが、“これから使えるデータ表”になりました。
以降、必要に応じてデータを書きこんだり、逆にここからとり出したりできるようになりました!

※ 補足。
例文の場合だと、キャラデータ.tsvは、プロジェクトのrunimageファイルの直下にあることになります(つまり…プロジェクト別のファイル開けると、いくつかのファイルやフォルダに混じってぽんとキャラデータ.tsvが置いてあるカンジ)。
もし「やっぱむき出しだと収拾つかなくなるから、どっかフォルダ作っていれときたい!」という場合はこんなカンジにすればOKです。

runimageファイルの直下に新しくフォルダを作り、わかりやすい…でももともとあるのとダブらない名前をつけます。
(仮に『TSV-FOLDA』とします)
このTSV-FOLDAのなかに、キャラデータ.tsvを移動。例文はこう書き換えます。

f=DBLoadTsvFile("TSV-FOLDA\\キャラデータ.tsv")

「作ってたら増えたから、さらに入れ子にしたいんですけど…とりあえず、TSV-FOLDAのなかにキャラふぁいるってフォルダ作ってキャラデータ.tsvはこっちにうつしました♪」というときにはこうします。
f=DBLoadTsvFile("TSV-FOLDA\\キャラふぁいる\\キャラデータ.tsv")


☆「あれ? 円マークはひとつでいいんじゃ?」と思われた方にさらに補足。
コレがひとつだと、LMは「あっこのあと特殊文字ねっよし来い!」と思うだけで、コレだと思ってくれません。
…というか、これ自体がそういうイミづけをもった、特殊文字なのです
(その名もエスケープ・シーケンス。パソまわり的に広くこういうことになってます)。
なので、とりあえず\\とふたつ重ねます。
するとLMは「(ひとつめ)あっこのあと特殊文字ねっ」→「(ふたつめ)なるほど\なのねっ」→「そうかTSV-FOLDAのなかのキャラデータ.tsvを指定したいワケねOK」と思ってくれる。
というわけで、円マークはふたつでOKです。


●推測に基づく初心者的(てかめんどくさがり的)Q&A。
Q:DBAddField、DBLoadTsvFileにくらべて面倒…。紹介したイミは??
A:流れです(泣)。
もっとちゃんといいますと、ヘルプみて最初に目が行くのDBAddFieldだし(H2はそうだった)、飛ばすのも不自然かなと…。
それにもし、もっと柔軟にてーぶるの構造が変わるようなことになった場合、知ってると便利かなと思いまして。
シミュレーションゲームとかで、一時的に、ユニットによって異なる種類の多項目の計算用データ表を内部で展開して、また消して(作りっぱなしだとたぶん重いから)、てコトをするときとか…
DBLoadTsvFileだと、セルのデータ型(文字列とか。)が指定できないので、『絶対絶対型違われたら困るんだよ!!』 というときに必要かと。
(たしかに現時点H2も使ってません(爆)。でもそのうちお世話になるかも…)

Q:項目タイトル、わざわざ書かなきゃ使えないの? 面倒…。デフォルトでAとかB入ってないの??
A:残念なことに、答えはYES、NOのようです。
デフォルトでAやBが入っていないのは、コンパイル実行をすると出てくるデバッグ板で確認できます。
DBだけを作成しただけの状態でコンパイル実行→デバッグ板のDBを見ると、文字どおり真っ白です。
そしてこの状態では、データの書き込みや取り出しができないのです。
その理由は…。
DBでは“あるセル”を指定する場合には、「指定レコードの指定項目」を指定する、というカタチでクロス検索的に指定します。
しかし、できたばかりのテーブルは真っ白、項目タイトルがはいってない→「データ出し入れの操作をしたいセル」を指定したくても、十分な手がかりがなくてどーもならない
…とこういうわけなのです。
よって、ひと手間かかりますが、項目タイトルは指定して下さいませ。
※ するだけの価値はあります。自分の好きに項目タイトルつけられるので、データの書き込み取り出しのときに間違いづらいです。
そして、うまく担当? 変数名と同じにすると、データの書き込み取り出しの記述が5倍(感覚的に。)はラクにできます。多ければ多いほど楽になるとこです♪
(←詳しくは、データの書き込みや取り出しのところでご紹介します)


※ こらむになりかけの文章。
TSVファイル…タブ区切りテキストファイル。同じ行にあるデータとデータのあいだには、区切り記号としてタブが入っているもの。テキストエディタで開くことができる。
つくりかた
・エクセルで、TSVファイル形式で保存、というのができれば、それをすればOK。
・できない場合、エクセルなどの表計算ソフトからテキストファイルへ、必要な部分まるごとコピペして保存、一旦閉じて拡張子を.TSVにすればできあがり。
・表計算ソフトも使いたくない(重かったりして…。)場合、テキストファイルの拡張子を.TSVにして開き(←データ入れた後でもいい)、自分でデータとタブ交互に入れてつくる。ただし列がズレるのが恐いので、できあがったのを表計算ソフトにコピペしてみて確認するべし。


◆DBを使ってみよう 2〜データを入れてみる。そのデータを取り出してみる〜 1(DBDirectGetStr)
(DB関数『DBDirectSet○○』『DBDirectGet○○』を使って)

前のこらむでは、DBテーブル てーぶる1をフォーマット&データ入れをしました。
これでDBを使う準備は万全です。さっそく使ってみましょう!

とりあえず、中に入っているものをだして見ます。
↓てーぶる1はこんなふうになってるとします。
キャラNo  名前  HP  仲間か  ・・・
1     みけ  30  TRUE
2     しろ  46  TRUE
3     さば  38  FALSE

…で、設定はとりあえず「多人数育てゲー。その日一緒に行動するキャラ選んでふたりでパラメータ上げする。」というようなことにしときます。


1 名前を表示。
今回主人公は「キャラ1」とします。
最近では? 登場キャラ、特に主人公の名前を変えられるゲームがほとんどです。

よってスクリプトも、

誰かが大声で呼んだ。「みけ〜」

…と書くよりは

誰かが大声で呼んだ。「(変数:主人公名)〜」

のように書くことがほとんどだと思います。

というわけでこれを前提に、主人公の名前を表示するようにしてみます。


まず、文字列変数「主人公名」をつくっときます。

そして、キャラNo1のヒト(…猫?)の名前を取り出します。
計算ノードを作ってこんな記述をします。
主人公名=DBDirectGetStr("てーぶる1","キャラNo",1,TRUE,FALSE,"名前","") これで変数「主人公名」に「みけ」が入ります。

こうすると、以降のシナリオノードで、

誰かが大声で呼んだ。「[?主人公名]〜」
([]はホントは、右クリックメニューとかで入れられる四角囲みのアレ。)

っとかくと、ゲーム画面には

誰かが大声で呼んだ。「みけ〜」

と出るようになるのです。



いつもながらの日本語訳。

今回使用したのは、DB関数DBDirectGetStrでした。
「DBとレコードを直指定して、そこに入ってる値をゲット」のDBDirectGet系関数の、文字列限定バージョンです。
ゲットしたいものが文字列と分かってる場合や、「2とかなんだけど〜これはちょっと文字列としてゲットしたいです〜」というときに使えます。

では訳します。

=のまえに入れてある変数に、データを文字列のカタチで入れて下さい。データとってほしいてーぶるとレコードについては直指定しますので。 (テーブル名は"てーぶる1"です, 項目タイトル"キャラNo"の列に…,
1が入ってるレコードをオネガイなのです。, 項目タイトルや中身見るとき、大文字小文字は区別しないで下さいね☆, (↑2009.03.03 TRUEだと「しなくていい」であることが判明致しましたため訂正させていただきました…大変失礼致しました) なおかつ、条件に完全に一致するものだけがほしいのです(部分的…じゃダメっす)。, …以上の条件に合うレコードの、項目タイトルが"名前"のとこにはいってるデータを下さい。, 諸般の事情でデータゲットできなかったら、最初に指定した変数には""をいれてくれればいいです)
とこんなカンジです。
もちろん、それぞれのところは(""つけた)文字列だけじゃなく、(""ナシの)変数を入れて指定してもいいのです。


◆DBを使ってみよう 2〜データを入れてみる。そのデータを取り出してみる〜 2(DBDirectSetStr)
(DB関数『DBDirectSet○○』『DBDirectGet○○』を使って)

2 名前チェンジ。
さて、この主人公の名前ですが、当然変える事ができます。
計算ノードを作ってこんなの入力します。
f=DBDirectSetStr("てーぶる1","キャラNo",1,TRUE,FALSE,"名前","みけちゃん")
(※ 補足あり。)
これで(よほどのことがない限り)、DBのなかで主人公(キャラ1)の名前が変更されます。

※ ここより前に文字列入力ノードを作っておき、その値を入れた変数を"みけちゃん"のところにかわりにいれれば、「選択肢や、文字列入力でユーザーが入力したものを使う!」ができます。


さてでは、本当に変更されてるかチェックしてみましょう。
さっきおこなった『主人公名を変数に入れ→表示』を、そのままやってみるのです。

これのあとにまた計算ノードを作ります。
さっきとまったく同じものを入力。
主人公名=DBDirectGetStr("てーぶる1","キャラNo",1,TRUE,FALSE,"名前","") そのあとにシナリオノードを作り

誰かが大声で呼んだ。「[?主人公名]〜」
([]はホントは、右クリックメニューとかで入れられる四角囲みのアレ。)

っとかいてコンパイル実行すると、画面には

誰かが大声で呼んだ。「みけちゃん〜」

と出るはずです。


(これだけの単純な記述なら、あまり考えられませんが、出ない理由として考えられること…
・メッセージウィンドウを出し忘れていたら出して下さい
・シナリオノードの文章の末尾にクリックまちなどが入っていなかったら入れて下さい。これがなくて、目にも止まらぬ早さで表示されてしまっているのかもしれません。
・実行時に、Ctrlキーから手を放しておいて下さい。これを押していると早送りになり、目にも止まらぬ以下同文。)


忘れちゃいけない日本語訳。

今回使用したのは、DB関数DBDirectSetStrでした。
「DBとレコードを直指定して、そこに値をセット」のDBDirectSet系関数の、文字列限定バージョンです。
セットしたいものが文字列と分かってる場合や、「2とかなんだけど〜これはちょっと文字列としてセットしたいです〜」というときに使えます。
…ご覧戴いて分かるとおり、文のカタチはGetとあんまりかわりません。助かる。


では訳します。

=のまえに入れてある変数に、文字列セットが成功したらTRUE入れて下さい。セットの詳細は以下。 (テーブル名は"てーぶる1"です, 項目タイトル"キャラNo"の列に…,
1が入ってるレコードが、データ入れたいレコードなんです。, 項目タイトルや中身見るとき、大文字小文字は区別して下さいね☆, 条件に完全に一致するレコみつからなかったら失敗でいいです。。, …以上の条件に合うレコードあったら、項目タイトルが"名前"のとこのセルに、データ入れて下さい。, データはずばりコレです!)
とこんなカンジです。
もちろん、それぞれのところは(""つけた)文字列だけじゃなく、(""ナシの)変数を入れて指定してもいいのです。


実のところ…正直ここまでだと、ありがたみはあんまり感じられません。
ふつーに直に変数あつかいした方が簡単なくらいです(爆)。
しかし、DBの真価の発揮はここからです。
あとひとコラム(くらい)だけ、お付き合い下さいませ。



◆DBを使ってみよう 2〜データを入れてみる。そのデータを取り出してみる〜 3(DBDirectGet/SetBool、DBDirectSet/GetInt)
(DB関数『DBDirectSet○○』『DBDirectGet○○』を使って)

さきの項目では、DBDirectSet/GetStrについて解説致しました。
ここではその仲間たち(?)について、事例付きでざっくり解説致します。

・DBDirectGetBool(TRUE/FALSEをゲットする)
DBDirectGetBoolは、DBDirectGetStrのフラグ専用バージョンといっていいでしょう。
DBDirectSetStrは、指定DBの指定レコードの指定項目から「文字列」を読み出すためのものでしたが、こちらはフラグの「TRUE/FALSE」…いいかえるなら、スイッチのオン/オフを読み出すためのものです。

<使用イベント例>
自由行動フェーズで、空き地に行くとさばと出会える。
このとき、さばが仲間でない場合は、突如「かにばさみ」を仕掛けてくる(爆)。

…いきなりかっとんだ例ですが、とりあえず解説です。

[作成例]
・あらかじめ、変数「ふらぐ01」(フラグ型)をつくっておく。
(こんな抽象的な名前にしたのは理由があります。(=使いまわしやすいように)
あとの項目に、変数名のネーミングについてのコラムがございます。ご参照下さいませ)

さばと出会った後の計算ノードにこれを入れます。

ふらぐ01=DBDirectGetBool("てーぶる1","キャラNo",3,TRUE,FALSE,"仲間か",FALSE)

これのあとにふたつのシナリオノードを作り、ここからの分岐をだします。「ふらぐ01がTRUE」と無条件(=すなわちふらぐ01がFALSE)。

TRUEの側のシナリオノードに「かにばさみ仕掛けられイベント」を記述。そっちでないほうに、そうでないイベントを記述。


・DBDirectSetBool(TRUE/FALSEをセットする)
DBDirectSetBoolは、DBDirectSetStrのフラグ専用バージョンといっていいでしょう。
DBDirectSetStrは、指定DBの指定レコードの指定項目に「文字列」を入れるためのものでしたが、こちらはフラグの「TRUE/FALSE」…いいかえるなら、スイッチのオン/オフを入れるためのものです。

<使用イベント例>
それまで仲間だったしろが、夏休みだってんで田舎に帰ってしまいました(←いきなり脱退イベントかい!)。
そんなときは
f=DBDirectSetBool("てーぶる1","キャラNo",2,TRUE,FALSE,"仲間か",FALSE)
(キャラ3の仲間ふらぐをオフ。)

こうしてキャラナンバーで指定するようにすると、名前がかわっても大丈夫になります。
つまり自由に名前をつけたいならこちら。

逆に、しろの名前がぜったいかわらないときはこちらでもOKです
f=DBDirectSetBool("てーぶる1","キャラ名","しろ",TRUE,FALSE,"仲間か",FALSE)
(キャラ名しろの仲間ふらぐをオフ。)
こっちは一見してわかりやすいです。
が、この式を使いまわしたいときはオススメできません。

実際のところ『仲間が脱退したときは、仲間フラグオフのほかに、親密度が動いたりメッセージやジングルが出たり…という処理が一緒におきる』場合がほとんどですため、その定型処理の一部分として使いまわしにしたいことが多いと思われます。
そういうときはこんなカンジにするのがオススメです。

[作成例]
・あらかじめ、変数「対象者No」(整数型)をつくっておく。


・『仲間フラグオフのほかに、親密度が動いたりメッセージやジングルが出たり…』の定型処理を記述したチャートを作っておく。名前は分かりやすく『脱退処理』とする。
そのさい、仲間フラグをオフにするところはこういう記述に。

f=DBDirectSetBool("てーぶる1","キャラNo",対象者No,TRUE,FALSE,"仲間か",FALSE)

※ここです! 対象者Noを変数で指定しているところがミソです!

 (ついでに…
  ここで親密度が自動でゼロに戻る(え゛)としたら、この式に続けて…
  f=DBDirectSetInt("てーぶる1","キャラNo",対象者No,TRUE,FALSE,"親密度",0)
  ここについては次の項目でもうすこし詳しく解説致します)


・そして、じっさいキャラの脱退がおきたイベントを記述しているチャートで、そのキャラのキャラNoを変数「対象者No」に入れておく

・脱退処理をしたいところで、チャート呼び出しをする。呼び出すのはもちろん『脱退処理』

もちろん、これと同様にして『加入』もできます。
f=DBDirectSetBool("てーぶる1","キャラNo",対象者No,TRUE,FALSE,"仲間か",TRUE)
にすればOKです。定型処理セットの名前は『加入処理』がいいでしょう。


・DBDirectSet/GetInt(数値をDBにセットする、DBからゲットする)
こんどは整数バージョンずです。
(みじかめなので、まとめてお送りします。)
もし整数でなく小数がいいときは、IntをFloatに変えて下さい。

<使用例1>
さきの項目の[作成例]ではこんなことをちらりと出しました。

  ここで親密度が自動でゼロに戻る(え゛)としたら、この式に続けて…
  f=DBDirectSetInt("てーぶる1","キャラNo",対象者No,TRUE,FALSE,"親密度",0)

これがずばり使用例です。

…が、正直これではあんまりなので(色々な意味で…)、もうちょっとシビアでない方法をご紹介致します。


<使用例2>
親密度が0になるのではなく、現在の値から−10される処理にする場合、

整数01=DBDirectGetInt("てーぶる1","キャラNo",対象者No,TRUE,FALSE,"親密度",0)
整数01=整数01-10
f=DBDirectSetInt("てーぶる1","キャラNo",対象者No,TRUE,FALSE,"親密度",整数01)

こっちにするとOKです。

ミソは整数01。
これを「とりあえず、今使ってる数いれば」として使うことで、
・数の操作ができるようになる(-10できた)
・変数「対象者No」とのコラボで、「いまどのキャラの親密度を操作しているのか」「操作に使う値がいくつか」をまったく意識しないですむようになる
というメリットが生まれます。

・1番目は、基本的なとこで? 設計の自由度を増してくれます。
・2番目は実際の作成のときに極めて強力です。
こうすることで、
・・ここに直接キャラNoを入れなくていい→ここでのキャラNoのタイプミスが絶対に0になる。
・・よって、操作する値(ここでは-10)も1回いれればいい→システム的な変更がおきても(やっぱり-5にしようという場合でも)そこひとつをなおせばいい。ここでの操作値のタイプミスが絶対に0になる。
…ようになるからです。

ここのところを直記述コピペでやるとどうしても修正がもれます。
そのチェックがごっそりなくなるのは、四捨五入して10キャラを越える頃になるとありがたみが身に染みます(実話)。

※ なんらかの原因で親密度がゲットできなかったらやっぱり0…
もしこれも悲しすぎるなら、
・一番最後のを0でなく10とかにする とか、
・これを記述したノードの次に、fがFALSEだった場合、という分岐をもうけて対策とる
…などの方法を取られるとよろしいかと存じます。
ここんとこはそれぞれのゲームで代わる“キモ”なところですので、あえてここでは突っ込みません♪ その時の親密度によって増減がかわるなどいくらでも凝れます♪♪
(H2は凝りすぎてしまうので逆に気をつけてます、ハイ…(汗))


さて、長い道のりでしたがここまでで一応の使用関数解説が終わりました。
次の項目からは、より本格的に「DB使うほうが絶対便利!」な事例をご紹介できます。
いうなれば、作る変数や処理部分の数が、何キャラいても1セットですむようになる方法です。



◆DB関数をからめた記述・本格応用例

ではそのままのノリでいきましょう。

サンプルゲームの設定はとりあえず「多人数育てゲー。その日一緒に行動するキャラ選んでふたりでパラメータ上げする。」というようなことにしといてました。
ので、ここではパラメータ上げまわりにハナシを絞って応用例をご紹介します。

●具体例背景。
ここんとこは、パートナーと一緒に武者修行することにしました。
パートナー選びはとりあえず朝にしときます。
朝が来ると、おはよーとか言ってからパートナー選びになるわけです。
選択肢部分はこんなカンジで普通に作れます

選択肢No1
「式で設定」のとこにチェックを入れ、文章…キャラNo1のキャラの名前が入るような式、表示条件…キャラNo1のキャラをゲットしていることを示すフラグを出してくれる式、を入れる。
上のコラム参照していただけば、どちらの式もコピペで作れます。
ここでの注意点は、キャラNoと選択肢Noをあわせることです。
こうしておけば、システム変数@SELINDの値を、そのまま選んだキャラのNoとして取得できるからです。

ここで、ジャンプ先は一本だけだします。人数分作る必要はありません(←出ました、ラクになるポイントその1)!
無条件の矢印を、新しい計算ノード(パ代入ノードとしておきましょう)につなげておけばOKです。

(実はここは、人数分の変数使ったほうが記述がみじかくなるので講座のコンセプト的にヤバいかんじではあります(爆)
ここについては実のところもう1ステップの説明が必要になってきますので、ここはこれでとりあえず流しておいて下さいませ。みじかくできます。)


●具体例準備。
上の「パ代入ノード」をもちろんつくっておくこと。
用意する変数は以下。
まず「敵No」。
そして「パ名」「パHP」「パSTR」…「パ親密度」と、武者修業で使うのを「パ(ートナー)」名前で一通り。
もちろん、自分名前のと敵名前のも必要なので全部で3せっと必要です。
ちょびっとめんどうですが、これはこの3セットだけ作れば何キャラいてもぜーんぶ使いまわせますので(全員分作らなくていい。←ここが(も)キモです!)、コピペ駆使して作ってみて下さいませ。
ひとセットつくったらプロジェクト自体をコピーし、そのコピーして増やしたプロジェクトから変数とりこみするとわりとラクです(裏技?)

※ もし、読み込み部分もっと楽したい! という場合は、ステータス名部分(HPとか)を数字にするテもありです。ただし、読み込みなどの操作部分づくりは激楽になるものの、混同しやすいので一長一短。コードブックをつくって常に手放さないならOKです♪


●具体例本番!
ではここから本番です。
えらんだパートナーのキャラナンバーからそのキャラのステータスを検索し、「パ●●」に入れていきます。

まず「しろ」(てかキャラNo2の仲間)をパートナーに選んだとします。ストーリー上行き先はさばのいる空き地(つまり敵キャラはきゃらNo3)にいくことに問答無用でなるとしましょう。
 →@SELINDには2がはいってます。
 →敵Noには3。

この状態で、次々読み込みさせるわけです。

・れべる1な書き込み法(わかりやすさならこれ。すこしたるいので2がおすすめ)
「パ代入ノード」にこんな風に書き込んでいきます。
パ名=DBDirectGetStr("てーぶる1","キャラNo",@SELIND,TRUE,FALSE,"名前","") パHP=DBDirectGetIND("てーぶる1","キャラNo",@SELIND,TRUE,FALSE,"HP","") パSTR=DBDirectGetIND("てーぶる1","キャラNo",@SELIND,TRUE,FALSE,"STR","") …

そのつぎに「自代入ノード」
自名=DBDirectGetStr("てーぶる1","キャラNo",1,TRUE,FALSE,"名前","") 自HP=DBDirectGetIND("てーぶる1","キャラNo",1,TRUE,FALSE,"HP","") 自STR=DBDirectGetIND("てーぶる1","キャラNo",1,TRUE,FALSE,"STR","") …

そのつぎに「敵代入ノード」
敵名=DBDirectGetStr("てーぶる1","キャラNo",敵No,TRUE,FALSE,"名前","") 敵HP=DBDirectGetIND("てーぶる1","キャラNo",敵No,TRUE,FALSE,"HP","") 敵STR=DBDirectGetIND("てーぶる1","キャラNo",敵No,TRUE,FALSE,"STR","") …
コピペでわりとラクにいけます。
とにかくわかりやすいのがウリ。


・れべる2な書き込み法
れべる1はわかりやすいですがいまいち繰り返し多くてたるいのでこういう風にします。
概要:『代入パラメータ名前を合成』&『代入パラメータ名前の「もと」によって代入さーち用のナンバー』かえる。これで代入部分を使いまわしまくる。

・整数型変数「代入中No」を作る。
・文字型変数「代入中P」を作る。

・「パ代入ノード−1」てのを作る。選択ノードからの矢印は「パ代入ノード」でなくここにつなげる。「パ代入ノード−1」から矢印をだし、「パ代入ノード」へつなぐ

・「パ代入ノード−1」にこう書き込む。
S = S 代入 "パ"
代入中No = 代入中No 代入 @SELIND
※Sは文字列変数。いままで例でさんざん使ってたのであると仮定してつかわせていただきました

・「パ代入ノード」にこう書き込む
代入中P = S ++ 名
AssignTemp(代入中P)
@Temp=DBDirectGetStr("てーぶる1","キャラNo",@SELIND,TRUE,FALSE,"名前","") 代入中P= S ++ HP
AssignTemp(代入中P)
@Temp=DBDirectGetIND("てーぶる1","キャラNo",@SELIND,TRUE,FALSE,"HP","") 代入中P= S ++ STR
AssignTemp(代入中P)
@Temp=DBDirectGetIND("てーぶる1","キャラNo",@SELIND,TRUE,FALSE,"STR","") …
やっぱコピペ。

・「代入ノード(自)」「代入ノード(敵)」をつくる。シナリオノード「代入終わり」を作る。

・「パ代入ノード」から↑のノードずへ三つの矢印を出す。それらの優先順位と条件は…
1 S=="パ"(…のとき行くってこと。) これは「代入ノード(自)」へ
2 S=="自"(…のとき行くってこと。) これは「代入ノード(自)」へ
3 条件なし これは「代入終わり」へ

・「代入ノード(自)」にこう入力し矢印を「パ代入ノード」へつなぐ。
S = S 代入 "自"
代入中No = 代入中No 代入 1

自分=1だから、1でOK。


・「代入ノード(敵)」にこう入力し矢印を「パ代入ノード」へつなぐ。
S = S 代入 "敵"
代入中No = 代入中No 代入 敵No

ちなみに今の例だと敵Noは3

・シナリオノード「代入終わり」はあえてカラにしとく(あとで調整はいったりするし)。
(ここから矢印だして、武者修業シーンにいく…)


こうすると、れべる1同様
まずパ名前の設定で一通りパラメータ代入
→パ名前だから、次は自名前ってせっていにして。
→パラ代入。
→自名前だから次は敵名前ってせっていにして。
→パ代入。
→敵名前だから次は…おしまい
という風に動いてくれるはずです。


・れべる2+な書き込み法
いままでのを応用して、STRとかの部分も別てーぶるから読み込みしたりにもできます。
ただここまでやると入れ子の入れ子でさすがに自分が面倒になってくるので、2くらいでとどめとくのが多分ベストです。


…以上で『いうなれば、作る変数や処理部分の数が、何キャラいても1セットですむようになる方法』が粗削りながら、ひととおりご紹介できたわけです。

まあ…作る変数や代入処理式自体が多いのでやっぱり面倒は面倒なんですが(爆)、これを素直に全員分作るのに比べたらはるかに楽かつ低容量ですみますことは、経験者にならお分かりいただけるかと存じます。
とくに、変更が入るハメになったときなど…。

以降は、これにもとずいた他の応用例をご紹介してまいります。
とりあえずは、さきほどさらっと流していただいた「選択肢のところの短くし方」となると思われます。ご期待くださいませ!



◆応用 選択肢設定のところを低容量で記述する(しかも使いまわしできまくり! な)方法

さきの例では、選択肢設定のところに一つずつ、あの長い式を入れていました。
しかしここももっとラクにできます。
容量もすくなく、かつタイプミスも避けられるようになります。
しかもこの選択肢と選択肢設定は、一度このカタチで作り、呼び出しで使うチャートとしてしまえば、ゲーム中のすべてのキャラクター選択で使えます。
以下、その方法(選択肢部分チャートのつくりかた!)をご紹介します。



●ここで作るもの
べんりチャート。呼び出すだけで、
「いまDBに入っているデータをもとに、自動で「いまいる仲間選択」の選択肢をつくり、表示してくれる。
えらんだ仲間のキャラナンバーを、整数型変数「選択したナンバー」にインプットしといてくれる。」
…ということをしてくれるチャート。



●キモ部分のしくみ概要
「変数名を合成指定できる特殊な変数@Temp、ふつうの整数型変数カウンターを使って、読み込み対象をつぎつぎ切り替え設定しては読み込み(→して、選択肢表示に利用する)」



●具体例・背景
朝、「今日の修行に同行させる仲間をえらぶ」選択肢を作る。
とりあえず、仲間になる(=この選択肢に出うる)人数は3名とする。
仲間は、現在仲間になってれば選べる。けんかしてるとか、そういったほかの条件は、この選択肢には一切関係なし。仲間かだけ。



●具体例・下準備(変数編)
まずこれらの変数を用意します。
※ほかはチャート内変数でも全体変数でもいいですが、「選択したナンバー」だけは全体の変数リストに作ること。おすすめは、ほかのプロセスでも使いまわすことを見込んで全体変数で。
・よみこみテーブル名(文字列型)
・カウンター、選択したナンバー(どちらも整数型)
・代入中P(文字型。前にも出ていたものを流用)
・名前1、名前2、名前3(つまり名前+キャラNoというカタチのものを人数分。すべて文字列型)
・チェッカ1、チェッカ2、チェッカ3(つまりチェッカ+キャラNoというカタチのものを人数分。すべてフラグ型)



●具体例・下準備(チャート編)
新規チャートを用意します。名前は「選択肢設定」がいいでしょう。



●具体例
変数とチャート「選択肢設定」が用意できたら、コレをチャート「選択肢設定」上に記述します


凡例

・ノード名(断りがない場合、すべて計算ノード)
※ コメント

ノード内容

 ジャンプ条件→ジャンプ先のノード名




・開始ノード(開始ノード)

(無条件)→-1
※ 本来は0につなげます。今回は説明があるためあえて。



・-1
※選択肢に必要な、名前とかののってるデータよみこみ先を指定(ここはむしろ、ここにくる前のプロセスがわにあるはずのところですが、紹介のためここに記載。)

よみこみテーブル名="てーぶる1"

(無条件)→0



・0
※ ここでカウンターを初期化しときます。スムーズな実行のお約束として。

カウンター = 0

(無条件)→1



・1
※ カウンター加算して、変数名合成にそなえます。
カウンター = カウンター + 1

(無条件)→2


・2
※ ここがキモ。よみこみ対象変数名合成。これを@Tempにわりつけ、適切なDB関数で内容読み込みをさせる。
代入中P = 名前 ++ カウンター
AssignTemp(代入中P)
@Temp=DBDirectGetStr("てーぶる1","キャラNo",@SELIND,TRUE,FALSE,"名前","") ※ コレと同様にして
代入中P = チェッカ ++ カウンター
AssignTemp(代入中P)
@Temp=DBDirectGetBool("てーぶる1","キャラNo",@SELIND,TRUE,FALSE,"名前","")

カウンター >= 3→選択肢
(無条件)→1


・選択肢(文字列選択ノード)
選択肢No1
式で記述のところにチェック
スクリプトのところには 名前1
表示条件のところには チェッカ1

以下、選択肢No2、3についても同じように入れていく。

(わかりづらい場合ご参照。この例だと選択肢No2は、
式で記述のところにチェック
スクリプトのところには 名前2
表示条件のところには チェッカ2
となります。
つまり、「選択肢番号」と、「使う変数の末尾の番号」をそろえるわけです。)
※ ちょっと入力手間ですが、エクセル使って合成しといたのをコピペなどしてやっちゃってください。面倒なのは今だけです♪

(無条件)→選択したナンバー取得


・選択したナンバー取得
選択したナンバー = @Selind
※@Selindはシステム変数で、『いま選択した選択肢の番号』が自動ではいる変数です。自分で用意しなくてももともと入ってます。これを、自前の変数『選択したナンバー』に入れて固定するわけです。

(無条件)→終了ノード



・終了ノード(終了ノード)



以上です。お疲れ様でした!

なお今までに使ってきた例ですと、キャラNo1は主人公=自分ですので、「自分を選択=ひとりでいくおあ分身の術でいく(爆)」というシステムにしないのであれば「自分を仲間にしているか」フラグは常にオフにしておく、といった工夫が必要となります。



●さらなる応用
選択肢ノードをさらに独立チャートとして切り出し…
チェッカのところの読み込みを、別の条件にすれば、いくらでも使いまわせます。
名前のところも同様に換骨奪胎すれば、
「選択肢文章と選択肢表示可否を、シナリオの流れに沿って逐次設定し、最後にどんと選択肢として出す!」というカタチにできます。推理ゲーにきっと便利。
(「精霊使い」用の自作らんちゃーは実際そのシステムになっています)






 →→→トップページへお戻りの際はブラウザバックでお願いしますm(__)m