手順001〜008 システムフォルダの準備
手順009〜018 シナリオフォルダの準備
手順019〜027 imageフォルダへのファイルの配置
手順028〜039 スクリプト(構造体)の基本
手順040〜052 オリシナの起動に必要な最小限のスクリプトを作成
本書はななあし氏が開発しました国盗り型戦略SLG「ヴァーレントゥーガ」のオリジナルシナリオ(以降オリシナ)を作成する為の手順です。
手順書の体裁を取りますが、本書の作者は有識者ではなく、初心者です。
何も知らない状態から作成していく為、所謂「最適の手順」ではないという点にご注意下さい。
本書の目的は、ヴァーレントゥーガの既存ファイルに極力依存しない単独起動シナリオを作成することです。
本書で使用するヴァーレントゥーガ本体のバージョンは5.00です。
ヴァーレントゥーガ本体の入手方法につきましては、変更の可能性がありますのでここでは明記しません。
本書記述時点では「ヴァーレントゥーガまとめwiki」から辿れるアップローダーからダウンロードしました。
本書は現時点では完成版ではなく、作者の作業進捗に従って加筆されていきます。
このような背景色で表示されている場合、その部分の説明には、未確認または不明な事項が含まれている事を表します。
任意の場所に、好きな名前でフォルダを作成します。
オリシナをプログラム本体込みで配布する場合は、このフォルダを丸ごと圧縮することになります。
手順001で作成したフォルダに、ヴァーレントゥーガ本体から"Vahren.exe"ファイルのコピーを配置します。
この段階ではまだプログラムを起動してもエラーになります。
手順001で作成したフォルダに、特殊なオプションをつけて起動する為のバッチファイルを任意のファイル名"*.bat"で作成します。(必要な場合のみ)
詳細は確認後に記述します。
手順001で作成したフォルダに、"a_system"という名前のフォルダを作成します。
このフォルダには、"Vahren.exe"がシナリオに関係なく使用するファイルを配置します。
a_systemフォルダにマウスカーソルファイルを、"mouse.cur"という名前で配置します。
このファイルがゲーム中で使用されるカーソルになります。
このファイルが無い場合、ゲーム中でマウスカーソルは変化しません。
a_systemフォルダにロックオン画像ファイルを、"lockon.???"という名前で配置します。
この画像ファイルは、戦闘中にプレイヤーが指定した射撃・回復目標地点を指す為に使用されます。
ファイル名の"???"の部分は画像フォーマットによって変わります?(未確認)("bmp" "png" "jpg")
画像ファイルのサイズは、64x64ピクセルです。
背景の透過色は「RGB(0,0,0)」です。
このファイルが無い場合、戦闘中に射撃・回復目標地点を設定しても、何も表示されません。
a_systemフォルダにロード画像ファイルを、"load.png"という名前で配置します。
この画像は、プログラム起動(+シナリオ選択)後、シナリオのロード中に表示されます。
ファイル形式はPNGのみです。
原則、ウィンドウ中央に拡大・縮小なしで表示されますが、画像サイズによっては表示時に若干のリサイズが発生するようです。
予想では画像ファイルの高さが100の倍数ピクセルでない場合に、近似する100の倍数ピクセルにリサイズされます。
このファイルが無い場合、起動時に画像が表示されません。
a_systemフォルダにMIDI音源をリセットする為のMIDIファイルを、"reset.mid"という名前で配置します。
このmidiファイルは、全トラックで音色・ボリュームなどの情報を一定の状態に戻す処理を行っているファイルです。
音は全く鳴らしていませんので、ヴァーレントゥーガ本体のファイルをコピーするのが無難です。
このファイルが無い場合、未確認ですが再生するmidiファイルによっては再生停止後も特定の音がなり続ける問題が発生したり、次に演奏する曲のボリュームが変化したりする可能性があります。
手順001で作成したフォルダに、任意の名前でフォルダを作成します。
このフォルダには、シナリオ専用のファイルを配置します。
このフォルダは複数配置する事ができます。
複数配置しますと、プログラム起動直後にシナリオ選択の画面が表示されます。
このフォルダが無い場合、プログラム起動時にエラーが発生します。
手順009で作成したフォルダに、"bgm"という名前のフォルダを作成します。
このフォルダには、ゲーム中で使用するBGM(*.mid, *.mp3)を配置します。
このフォルダが無い場合でも、プログラムは起動しますが、BGMは演奏されません。
手順009で作成したフォルダに、"face"という名前のフォルダを作成します。
このフォルダには、ゲーム中に使用する顔画像(*.bmp,*.png)を配置します。
このフォルダが無い場合でも、プログラムは起動しますが、顔画像は表示されません。
手順009で作成したフォルダに、"flag"という名前のフォルダを作成します。
このフォルダには、ゲーム中に使用する旗画像(*.bmp)を配置します。
このフォルダが無い場合でも、プログラムは起動しますが、旗画像は表示されません。
手順009で作成したフォルダに、"icon"という名前のフォルダを作成します。
このフォルダには、ゲーム中に使用するスキルアイコン(*.png)を配置します。
このフォルダが無い場合でも、プログラムは起動しますが、スキルアイコンは表示されません。
手順009で作成したフォルダに、"image"という名前のフォルダを作成します。
このフォルダには、ゲーム中に使用するワールドマップ、背景、一枚絵、システム画像等(*.jpg,*.bmp,*.png)を配置します。
このフォルダが無い場合でも、プログラムは起動しますが、ゲームモード選択画面から先に進めません。
手順009で作成したフォルダに、"picture"という名前のフォルダを作成します。
このフォルダには、ゲーム中に使用する立ち絵画像(*.bmp,*.png)を配置します。
このフォルダが無い場合でも、プログラムは起動しますが、立ち絵は表示されません。
手順009で作成したフォルダに、"script"という名前のフォルダを作成します。
このフォルダには、スクリプト(*.dat)を配置します。
このフォルダの下にさらにフォルダを作成し、その中にスクリプトを配置することもできます
このフォルダが無い場合、プログラム起動時にエラーが発生します
手順009で作成したフォルダに、"sound"という名前のフォルダを作成します。
このフォルダには、効果音(*.wav)を配置します。
このフォルダが無い場合でも、プログラムは起動しますが、効果音は再生されません。
手順009で作成したフォルダに、"stage"という名前のフォルダを作成します。
このフォルダには、戦闘マップ(*.map)を配置します。
このフォルダが無い場合でも、プログラムは起動しますが、戦闘画面ではマップが表示されません。
また、戦闘画面でユニットを選択して右ドラッグすると、強制終了が発生します。
imageフォルダにタイトル画像を"title.???"という名前で配置します。
このファイルは、プログラム起動時のゲームモード選択画面で表示される背景画像です。
ファイル名の"???"の部分は画像フォーマットによって変わります。("bmp" "png" "jpg")
このファイルの表示方式は、画像ファイルの形式によって異なります。
BMP、JPEG形式のファイルを設定した場合、タイトル画像はウィンドウサイズに合わせて拡大・縮小されます。
PNG形式のファイルを設定した場合、タイトル画像は、ウィンドウサイズに関係なく、ウィンドウの左上に、拡大・縮小なしで表示されます。
このファイルはimageフォルダの代わりに、a_systemフォルダに配置することも可能です。
ただし、a_systemフォルダに配置する場合は、PNG形式のファイルのみ設定可能となります。
imageフォルダとa_systemフォルダの両方にファイルが存在する場合、imageフォルダの画像が優先されます。
このファイルが存在しない場合、タイトル画面の背景は何も表示されません。
imageフォルダにウィンドウフレーム画像を"wnd*.png"という名前で配置します。
このファイルは、ゲーム中に表示されるウィンドウやボタンの枠画像です。
このファイルは現在判明している限りでは、以下の通り使われています。
"wnd0.png" 主要なウィンドウを表示するのに使用されます。
"wnd1.png" 戦闘中や、操作説明などのウィンドウを表示するのに使用されます。
"wnd2.png" 人材、クラスの説明を表示するウィンドウに使用されます。
"wnd3.png" 確認ウィンドウを表示するのに使用されます。
"wnd4.png" 戦略フェーズでのイベント会話を表示するウィンドウに使用されます。
"wnd5.png" (デフォルトのボタン背景、スクリプトで変更可能)
"wnd6.png" 不明
"wnd7.png" 不明
"wnd8.png" 不明
ファイル形式はPNGのみです。
これらのファイルが一つも無い場合は、ウィンドウが正しく表示されません。
ファイルの一部が足りない場合については詳細に確認していないので現時点では不明です。
imageフォルダに全部隊選択ボタン用ファイルを"alltp.png"という名前で配置します。
このファイルは、戦闘画面の全部隊選択ボタンとして表示されます。
ファイル形式はPNGのみです。
ボタンのサイズは幅32ピクセル、高さ32ピクセルです。
ただし、戦闘画面では周囲2ピクセルの縁が上書きされますので、実際に表示されるのは中央の30x30ピクセルという事になります。
背景色の透過はありません。
imageフォルダの代わりに、a_systemフォルダに配置することもできます。
imageフォルダとa_systemフォルダの両方にファイルが存在する場合、imageフォルダの画像が優先されます。
imageフォルダにメッセージ送り表示用アイコン画像ファイルを"nextmsg.png"という名前で配置します。
この画像ファイルは、ゲーム中に次のメッセージ表示を促すアイコンとして表示されます。
ファイル形式はPNGのみです。
画像ファイルのサイズは幅24ピクセル、高さ24ピクセルです。
背景の透過色は「RGB(0,0,0)」です。
このファイルが存在しない場合の動作は現在確認できていません。
imageフォルダにプレイモード選択ボタン用ファイルを配置します。
この画像ファイルは、シナリオ起動直後のタイトル画面からプレイモード等を選択する為のボタンとして表示されます。
ファイルの名前と、ゲーム中の表示は以下の通り対応しています。
"easy.png" :イージーモードでゲーム開始(※)
"normal.png" :ノーマルモードでゲーム開始(※)
"hard.png" :ハードモードでゲーム開始(※)
"luna.png" :ルナティック(?)モードでゲーム開始(※)
"continue.png":セーブした所からプレイ再開
"tool.png" :機能・設定画面の表示
※実際にどのような難易度設定をするかは、スクリプトによって変更する事ができます。
ファイル形式はPNGのみです。
画像ファイルのサイズは幅162ピクセル、高さ32ピクセルです。
背景の透過色は「RGB(0,0,0)」です。
このファイルが存在しない場合、タイトル画面に該当するボタンが表示されず、そのボタンに対応する機能が選択できなくなります。
imageフォルダにワールド画像ファイルを"pre*.jpg"という名前で配置します。
このファイルは、サブシナリオ選択画面にて、背景画像として表示されます。
ファイル形式はJPEGのみです。
ファイル名の"*"の部分には任意の文字を指定します。先頭が"pre"になっていれば全て適用されるようです。
サブシナリオ選択画面に表示される画像は、該当するファイルの中からランダムで決定され、ウィンドウサイズに合わせて拡大または縮小して表示されます。
ファイルが存在しない場合、サブシナリオ選択画面には何も表示されません。
imageフォルダにワールド画像ファイルを"world.???"という名前で配置します。
この画像は、戦略フェーズのワールドマップ画像として表示されます。
ただし、スクリプトで何も設定していない場合のデフォルト画像です。
スクリプトで個別に設定している場合は、その画像ファイルが適用されます。
ファイル名の"???"の部分は画像フォーマットによって変わります。("bmp" "png" "jpg")
画像のサイズがそのままワールドマップの大きさになります。
ただし、画像サイズがウィンドウサイズより小さい場合は、画面の表示に乱れが発生(※1)する可能性があります。
また、画像サイズがあまりにも大きい場合、それだけでかなり動作速度が低下(※2)します。
※1 640x480ピクセルの画像ファイルを設定した場合、ウィンドウの右側に画像の一部が表示されました。
※2 例えば私の環境では、1280x960ピクセルの場合と、2560x1920ピクセルの場合で比較しますと、4〜8倍程度ロード時間が長くなりました。
このファイルが存在せず、スクリプトでも何も設定していない場合、ワールドマップ画像は真っ黒な状態で表示されます。
スクリプトで指定したファイルが存在しない場合は、デフォルトのファイルが存在したとしても、ワールドマップ画像は真っ黒な状態で表示されます。
imageフォルダにキャラチップ・マップチップ格納ファイルを配置します。
このファイルは"image.dat"と"imagedata.dat"のセットで、ゲーム中で使用するキャラクターアイコン画像、マップチップ画像が格納されます。
このファイルは、ヴァーレントゥーガ本体(アップローダー版)に同梱されているImageMakerを使用して作成します。
このファイルが存在しない場合でも、プログラムの起動には成功しますが、ゲーム中の主要な画像が表示されなくなります。
imageフォルダにスキルエフェクトチップ格納ファイルを配置します。
このファイルは"image2.dat"と"imagedata2.dat"のセットで、ゲーム中で使用するキャラクターアイコン画像、マップチップ画像が格納されます。
このファイルは、ヴァーレントゥーガ本体(アップローダー版)に同梱されているImageMakerを使用して作成します。
このファイルが存在しない場合でも、プログラムの起動には成功しますが、ゲーム中の主要なエフェクトが表示されなくなります。
まず、以降「ヴァーレントゥーガ」と書きましたら、「ヴァーレントゥーガというプログラム(具体的には"Vahren.exe")」の事を表します。
ヴァーレントゥーガから見て、スクリプトとは、scriptフォルダ以下のフォルダに格納された、拡張子が"dat"である全てのファイルの事を指します。
本書でも、以降、スクリプトと書きましたらこのようなファイルの事を表します。
ヴァーレントゥーガから見て、構造体とは、スクリプトの中に、あらかじめ決められた書式で記述された情報の事を指します。
本書でも、以降、構造体と書きましたらこのような情報の事を表します。
ファーレントゥーガのオリシナを作成した事がある方であれば、
ファーレントゥーガにおける"CharacterData"や"EventScript"や"AreaData"などのファイルを、ヴァーレントゥーガではひとまとめに「スクリプト」と総称すると認識頂ければよいかと思います。
また、ファーレントゥーガでは"CharacterData"や"EventScript"や"AreaData"などファイルで分かれていたものが、ヴァーレントゥーガでは"構造体"という情報の種類で分かれる、ということになります。
構造体は、その種類によって書式が異なりますが、全ての構造体で共通する書式もあります。
その一つが、「構造体の宣言」です。
「構造体の宣言」とは、オリシナの中で、その構造体が「どんな種類」で「どんな名前」で「何を継承した(※)」情報かを、「ヴァーレントゥーガに対して宣言する」という意味です。
ヴァーレントゥーガは、その「構造体の宣言」を受けて、はじめてその情報が自身にとってどんな意味を持つ情報なのかを認識するという事になります。
※「継承」については、別の項で詳しく説明します。
構造体の宣言は以下の書式となります。
種類名 (タグ名) : (継承タグ名)
{
(変数)
(関数)
}
※「ヴァーレントゥーガまとめ@wiki シナリオ製作講座」より抜粋
種類名
とは、あらかじめヴァーレントゥーガが名前を決めた、構造体の種類を表します。
例えば、"context構造体"を作りたい場合は、種類名の所に"context"と書きます。
タグ名
とは、オリシナの中で、その構造体がどんな名前で識別されるかを表します。
これは、好きな名前をつけることができます。
例えば、mirrorという名前のunit構造体を作りたい場合は、"unit mirror"と書きます。
なぜ名前がひつようになるかというと、一般的に同じ種類の構造体を、複数作成することになるので、名前がないとどれがどれだかわからなくなるからです。
よって、同じ種類名
で同じタグ名
の構造体を複数作る事はあまり意味がないという事になります。
タグ名
は、つけなくてもいい場合があります。
オリシナの中で、「一つしか存在できない種類の構造体」は、一つしかないので、名前をつける必要がありません。
(このような性質を持つ情報のことをユニークやシングルトンなどと表現します)
ヴァーレントゥーガでタグ名
をつけなくてもよい構造体は、下記の通りです。
context
sound
attribute
detail
workspace
継承タグ名
とは、「継承」する構造体のタグ名
を表します。
「継承」とは、なじみの薄い方にはわかりにくい言葉ですが、まず短く説明しますと、ヴァーレントゥーガから見たとき、そのタグ名の構造体は、「継承タグ名
の情報を継承した別の構造体である」という意味になります。
継承タグ名に設定する構造体の種類は、宣言する構造体の種類と同じでないといけません。
これだけだとわかりにくいので少しヴァーレントゥーガを離れ、ドラゴンボールのキャラで例えて継承を説明します。
例えば、
「孫悟空はサイヤ人(ネタバレしてすいません)」
「ピッコロ大魔王はナメック星人(ネタバレして(r」
「べジータはサイヤ人」
「クリリンは地球人」
という情報を、ヴァーレントゥーガの構造体宣言の書式を使い、継承の関係として表しますと、下記のような感じになります。
ドラゴンボールのキャラ サイヤ人 {}
ドラゴンボールのキャラ ナメック星人 {}
ドラゴンボールのキャラ 地球人 {}
ドラゴンボールのキャラ 孫悟空 : サイヤ人 {}
ドラゴンボールのキャラ べジータ : サイヤ人 {}
ドラゴンボールのキャラ ピッコロ大魔王 : ナメック星人 {}
ドラゴンボールのキャラ クリリン : 地球人 {}
※注意:実際にヴァーレントゥーガがこのスクリプトを
認識できるというわけではありません
上記のように記述する事で、「ドラゴンボールのキャラにはサイヤ人がいて、孫悟空とべジータは同じサイヤ人である」という事を宣言するのが、「継承」である、という事になります。
重要なのは、「継承」とは、単に情報の繋がりを表すだけで、それ自体に意味は無いということです。
上記の例で言えば、ドラゴンボールのキャラがどの星の生まれかを表す為に、キャラ個人と何星人かという本質の異なる情報を、「継承」という表現を使って繋いでみただけということです。
算数の=と同じ記号のようなもので、実際に:という記号を使って表現しています。
この単なる情報の繋がりをどのように解釈するかは、あくまでそれを読む側、この場ではヴァーレントゥーガに委ねられるという事になります。
話をヴァーレントゥーガに戻して、繰り返しになりますが、ヴァーレントゥーガはこのように継承タグ名
が書かれた構造体を、「継承タグ名
で示された構造体が持つ情報と、同じ情報をもとに作られた、別の構造体」であると認識します。
よって、その構造体の中に何も書かなかった場合、その構造体は、継承タグ名
で示された構造体の中に書かれた情報と、全く同じ情報を持つことになります。
unit mirror { name = ミラー }
unit killer : mirror {}
上記のような記述がされた場合、killerという名前のunit構造体の中にある、nameという変数の中身は、mirrorという名前のunit構造体に設定された"ミラー"である、ということになります。
ここは手順ではなく、余談ですので飛ばして下さい(^^;
ヴァーレントゥーガまとめwikiに下記のような記述があります。
継承を適切に用いる事でデータの設計と保守が容易となります。
この「適切に用いる」という所で省略されている文言を展開して説明しますと、下記のようになります。
継承関係を使用したデータ設計が、極端に小規模である場合、または、同データ設計のうち、少なくとも継承関係の構造化に関する定義とそれを指標とするデータ定義については、明確な仕様に基づいて行われ、さらにその妥当性が概ね検証された場合に限り、継承関係を使用しなかった場合に比べてデータの保守が容易となります。
(意訳:ただしハンサムに限る)
どういう事かと言いますと、例えばAを継承してBとCを作成した場合に、Aのある情報を変更しないといけなくなった場合、
まず、Aの情報を変更する事で、Aを継承するBとCが影響を受けるかどうかを確認する必要があります。
次に、BとCに対して、影響を受ける場合でも、影響を受けない場合でも、「それでいいのか」確認する必要があります。
つまり、Aを修正してしまうと、絶対にA、B,Cを確認しなければ安全が保障できないという事になります。
この時点で既に継承を使わない場合より保守が困難になっています。逆を言えば、「継承を適切に用いる」とは、少なくともこの状況を設計段階で完全に回避しない限り、継承を使わない場合に比べて、保守が容易とはならないわけです。
継承を使ったデータ構築は、上手くいっている限りは非常に効率が良いですが、何か問題が発生した途端にとんでもないリスクになるという特徴があります。
ヴァーレントゥーガに限って言えば、そこまで継承で苦しむ事もないと思いますので、気楽に継承を使った設計を楽しんでいただければと思います。
構造体は、その種類によって異なる変数
が決められていますが、その変数を設定する方法は「構造体の宣言」と同様に共通しています。
(変数名) = (変数に設定する値)
上記のように記述すると、ヴァーレントゥーガはその構造体の変数に、記述した値が設定されていると認識します。
変数名
は、構造体によって様々ですので、各構造体の仕様をご確認頂くことになります。
変数に設定する値
にどのような値を設定したらいいかは、変数によって異なるという点に注意してください。
変数の設定を省略した場合にどうなるかは、継承している場合とそうでない場合とでことなります。
その構造体が別の構造体を継承している場合は、継承元の構造体に設定された値と同じになります。
継承していない場合、省略された変数がどのような値を表すかは、変数によって異なりますので、これも注意の必要があります。
構造体の中で、関数
を記述する事ができます。
関数名((関数に渡す値), ...)
ヴァーレントゥーガの構造体における関数とは、「その構造体が読み込まれた時に行われる操作」を意味すると考えていいと思います。
(プログラマ向けには、javascriptにおけるfunctionの中で他の関数を呼んでいるだけの状態、というのが最も近い表現になります)
定義の話をすると難解ですが、実際に書くべき事、どこで書かないといけないか、どう書けばよいかは構造体の種類によってだいたい決まっていますので、実践の方はそれほど難しくないと思います。これにつきましても、詳しくは各構造体の仕様をご確認下さい。
以下の記述により、スクリプトの中にコメントを挟む事ができます。
// (コメントの内容)
ヴァーレントゥーガはスクリプトの中で、先頭に"//"の記述された行は読み飛ばします。
オリシナ作者にとっての「目印」や「メモ」として利用する事で、後々の保守が容易になるかもしれません。
本項からは、起動に必要な最小限のスクリプトを記述する手順を説明します。
前提として、手順001から手順027については準備ができているものとします。
オリシナの起動に最低限必要な構造体は、以下の通りです。
context構造体
movetype構造体
race構造体
skill構造体
class構造体
unit構造体
field構造体
spot構造体
power構造体
scenario構造体
context構造体を作成します。
この構造体は、オリシナのシステムを設定するとても重要な構造体で、ここでは省略していますが、本来はとてもたくさんの変数があります。
context構造体は、ユニークですので名前を設定する必要がありません。
context {
title_name = VTMinimumPack
mode_normal = nodown, samecall
mode_hard = nodown, samecall, steal, hostil
mode_luna = nodown, samecall, escape, dead
mode_easy_text = プレイヤーと敵勢力は同じ条件で戦います。
mode_normal_text = 敵勢力のユニットは自身と同じ上位クラスの兵士を雇用します。
mode_hard_text = ノーマルの条件に加えて$プレイヤーの家臣は忠誠度が低いと離反
します。$プレイヤーの国は警戒され易くなります。
mode_luna_text = 人材ユニットが戦死します。
}
title_name
は、ウィンドウのタイトルバーに表示される文字列になります。
mode_*
は、各ゲームモードで、どのような難易度設定をするかを表します。ここでは、VTデフォルトシナリオと同じ設定にしています。
mode_*_text
は、ゲームモードを選択する画面でボタンを選択した時、左上に表示される説明の文言です。
movetype構造体を作成します。
この構造体は、ユニットに設定する移動タイプを定義します。移動タイプ毎に、地形毎の移動速度を変更する事ができます。
movetype構造体はは複数作成可能です。
movetype normal {
name = 普通
help = 普通の移動タイプです。
consti = grass*6, mud*5, wood*4, rock*3, sand*5, mersh*3, snow*5, sea*3
}
name
は移動タイプの名前です。
help
は移動タイプを説明する文言です。
consti
は地形毎の移動速度を表します。ここに出てくるgrass,mud,wood,rock,sand,mersh,snow,seaが、地形の最も基本的な分類という事になります。
race構造体を作成します。
この構造体はユニットに設定する種族を定義します。種族毎に特徴的な耐性をつけることもできるようです。
race構造体はは複数作成可能です。
race monster {
name = モンスター
brave = 70
movetype = normal
}
name
は種族名前です。
brave
は種族毎の勇猛さを表し、戦闘中にHPがどのくらい減少したら逃げ出すかを表すようです。。
movetype
は手順43で作成したmovetype構造体の名前を設定します。
skill構造体を作成します。
この構造体は、戦闘中におけるユニットの行動手段(スキル)を定義します。行動手段以外にも様々な情報が定義できるようです。
skill構造体はは複数作成可能です。
skill attack00 {
func = sword
name = 接近攻撃
help = 隣接する敵を攻撃します
special = off
talent = off
mp = 0
str = attack*120
}
func
はスキルの種別を表します。ここでは近接攻撃を意味しています。
name
は画面に表示されるスキルの名称です。
help
は必殺技の説明文です。
special
は必殺技かどうかを意味します。
talent
は人材固有の必殺技である事を意味します?
mp
はスキルの使用により消費するMPです。
str
スキルの威力を表します。ここでは、攻撃力の120%と定義しています。
class構造体を作成します。
この構造体は、ユニットのクラスを定義します。ユニットとクラスは関係が深く、クラスに設定できる変数は概ねユニットにも個別に設定できます。また、クラスそのものをユニットとして扱う事もできるようです。
class構造体はは複数作成可能です。
class kuma {
name = 熊
price = 100
cost = 0
hasexp = 100
medical = 5
level = 1
hp = 1000
mp = 100
attack = 100
defense = 50
magic = 100
magdef = 50
speed = 50
dext = 50
move = 100
hprec = 32
mprec = 16
exp = 100
exp_mul = 50
skill = attack00
}
skill
には、手順45で作成したskill構造体の名前を設定します。
unit構造体を作成します。
この構造体がユニット(キャラクター)を表します。
unit構造体はは複数作成可能です。
unit kumada {
name = 熊田熊男
talent = on
sex = male
race = monster
class = kuma
image = unit
dead = 守りたい、その笑顔、クマ…
retreat = 当たらなければどうということはないクマー
join = スキルの性能差が決定的な戦力の差ではないという事を教えてやるクマ!
}
unit kumagai {
name = 熊谷熊之助
talent = on
sex = male
race = monster
class = kuma
image = unit
dead = や、やらないか、クマ…
retreat = いいのかいホイホイ着いてきちまってクマ
join = ところでこいつを見てくれ…こいつをどう思う…クマ?
}
race
には、手順44で作成したrace構造体の名前を設定します。
class
には、手順46で作成したclass構造体の名前を設定します。
image
は、そのユニットを表示するのに使用するアイコンです。手順26で作成したキャラチップ・マップチップ格納ファイルの中にある画像の名前を設定します。
field構造体を作成します。
この構造体はマップチップ単体の情報を表します。
field構造体はは複数作成可能です。
戦闘マップファイルに設定したマップチップに合わせて、この構造体を定義しないと戦闘マップが正しく表示されません。
field kusa
{
color = 64, 64, 128
attr = grass
alt = 0
alt_max = 32
}
タグ名
は、手順26で作成したキャラチップ・マップチップ格納ファイルの中にあるチップ画像の名前と一致する必要があります(※)
※image変数を省略せずに、画像名を定義すれば、タグ名を一致させる必要はありません。
attr
は、手順43で作成したmovetype構造体のconsti変数で出てきたgrass,mud,wood,rock,sand,mersh,snow,seaのうちどれかを設定します。
spot構造体を作成します。
この構造体は戦略フェイズにおけるエリア単体の情報を表します。
spot構造体はは複数作成可能です。
spot s1 {
name = 西の原っぱ
image = kusa
x = 240
y = 500
member = kumada
map = kusamap1
}
spot s2
{
name = 東の原っぱ
image = kusa
x = 400
y = 500
member = kumagai
map = kusamap1
}
image
は、手順26で作成したキャラチップ・マップチップ格納ファイルの中にあるアイコン画像の名前と一致する必要があります。
member
には、手順47で作成したユニットのうち、このエリアに配置したいものを設定します。
map
には、"stage"フォルダに置いた、戦闘マップの名前を設定します。
power構造体を作成します。
この構造体は戦略フェイズにおいて、戦争や外交などの行動を行う勢力単体の情報を定義します。
power構造体はは複数作成可能です。
power p1 {
name = クマダ王国
master = kumada
home = s1
staff = kuma
head = クマダ王国国王
diff = 低
text = 熊田熊男が作ったガチロリ共の桃源郷。だが幼女はいない。;
member = s1
}
power p2 {
name = クマガイ共和国
master = kumagai
home = s2
staff = kuma
head = クマガイ共和国大統領
diff = 高
text = 熊谷熊之助が作ったガチホモ共の桃源郷。だがノンケしかいない。;
member = s2
}
master
は、手順47で作成したユニットのうち、この勢力のマスターとしたいものを設定します。
member
は、この陣営が所有するエリアを、手順49で作成したspot構造体の名前で設定します。
scenario構造体を作成します。
この構造体は、サブシナリオ全体の情報を設定します。サブシナリオ選択画面に出てくる文言、登場する勢力、エリアなどを定義します。
scenario構造体はは複数作成可能です。
scenario sc1
{
name = ヴァーレントゥーガミニマムシナリオ
locate_x = 0
locate_y = 0
text = できるだけ少ない情報で作った最小構成パックです。
ここからいろいろいじってみてください。
;
base_level = 1
monster_level = 1
training_up = 1
nozone = off
party = off
power = p1, p2;
spot = s1, s2;
// エリアの表示
showSpot(s1)
showSpot(s2)
linkSpot(s1, s2)
}
power
にはこのシナリオで登場する勢力を、手順50で作成したpower構造体の名前で設定します。
spot
にはこのシナリオで登場するエリアを、手順49で作成したspot構造体の名前で設定します。
赤字の部分が、このシナリオでエリアを表示する為に使用する関数です。
showSpot関数
は、手順49で作成したspot構造体のエリアをワールドマップに表示する事を意味します。これを指定しないと、画面にそのエリアは表示されず、そのエリアに存在するマスターやユニットを選択することもできなくなります。
linkSpot関数
は、指定したエリア同士を繋げる事を意味します。一つもつなげない場合、エリア間の移動や侵攻ができなくなります。
以上で最小構成用のスクリプトが揃った事になります。
ここから先は、後日にこの最小構成パックを拡張する形で、他の構造体などを説明していきます。