ここでは、アダルトゲームを手がけるブランドアリスソフトが公開しているゲームエンジン(およびその開発環境)である System4 について取り上げます。
System4SDK の特色は、C 言語や C++ 言語といった既存の言語と近しい形式でプログラミングができるところにあります。単にテキストと画像とエフェクトを指定してゲームを進めるだけでなく、数値や文字列を扱う各種API関数、各種演算子、クラス機能などを活用しながら自由にプログラムすることが可能です。これにより、System4 はアドベンチャーゲームだけでなくロールプレイングゲームやシミュレーションゲーム、シューティングゲームなどの様々なジャンルに対応することを可能です。しかしその分、初心者には優しくない言語となってしまっていることも確かです。
System4 はアリスソフトのウェブサイトから入手することが可能ですが、ダウンロードするには会員である必要があります。もっとも、ウェブメールのアドレスが一つあれば登録することは可能なので、多少の手間を惜しまなければ実質誰でも手に入ります。
lzh 形式でアーカイブされた System4SDK をダウンロードしたら適当なディレクトリに展開します。以下、ディレクトリの概要。
/入門者向けセット/ポポリタン/マニュアル/ /開発環境/BGM/ /CG/ /Run/ /Source/ /各種ツール/System4IDE/ 熟練者向けセット/DLL開発/DLL/ /Interface/ /マニュアル/ /開発キット/ /HLLライブラリ/ /チュートリアル/サンプル/ /プログラマ雑記/ /マニュアル/ /開発環境/Run/ /Source/ /各種ツール/CG圧縮/ /NL5/ /Setup/ /Sys40Reg/ /Sys42IDE/ /wavLinker/ /$マクロ展開/
ポポリタンとは System4 上に作成された、アドベンチャーゲーム製作用のクラスライブラリ郡です。アダルトゲーム絡みのゲーム制作ツールというと、プログラムの初心者でも簡単にゲームが作れるかのようなイメージを持つ方もいます。おそらく、そういった需要に答えるためにポポリタンをサンプルとして提供しているのでしょう。もちろんサンプルソースを触って新しい言語になじむことも大事ですが、私としては一から自分で作り始めて生きたいと思っていますので、まず最小構成プロジェクトを作るところから始めていきます。
その前に少しだけ準備をしておきます。別に大したことではありませんが、/熟練者向けセット/各種ツール/Sys42IDE/Sys42IDE.exe へのショートカットをどこか使いやすい場所に作成しておき、/熟練者向けセット/マニュアル/index.htm へのショートカットを同様に処理しておきます。
意外と苦労しました。以下に、System4 と System4 をサポートする SACT2 ライブラリを含み、かつ必要最低限コンパイルを通すのに必要な手順をメモしておきます。手順が結構煩雑なので、これが最良のやり方であるという保証はありません。
// システムソースコード一覧
SystemSource = {
"system\system.inc" // API等が含まれる
}
// ソースコード一覧
Source = {
"game.inc" // 自分で書いたコードはこちらに含まれる
}
以上の手順を踏んだら、もういちど IDE を起動して /web用/web用.prj を読込み、F7 キーを押してコンパイルします。何もエラーが出なければコンパイル成功です。F5 キーを押すとコンパイルしたゲームが実行されます。今の時点では真っ黒な画面が表示されるだけで何も起きませんが、これで正常です。
game_main.jaf を以下の内容に書き換えます。
void game_main()
{
for( ; ; )
{
'Hello,World!'A;
'繰り返します'R;
}
}
シングルクォートで括った文字は基本的にそのまま表示されます。後ろにつく A とか R はあらかじめ機能を定義されたオブジェクトで、それぞれクリック(もしくは Enter キー等)待ちと改行を意味します。こういったオブジェクトやAPI関数についてはヘルプの中にリファレンスとして一通りまとめられていますので、プログラミングの経験がある方ははっきりいってこんなページ見なくても(以下略)。私もことこまかく紹介は致しません。
構造化言語としての System4 に少し触れてみます。というか C 言語の経験者なら余裕です。というわけでいきなりソースコード
void game_main()
{
// 変数の定義
int r = 255;
int g = 255;
int b = 255;
// ループ制御
for( ; ; )
{
// 分岐制御
if( r != 0 )
r--;
else if( g != 0 )
g--;
else if( b != 0 )
b--;
else
return;
// 1ミリ秒のウェイト
W( 1 );
// 画面色の適用
WP_SET_COLOR( r , g , b );
}
}
実行すると、真っ白な画面が少しずつ青みがかっていき、最後には真っ黒になって自動的にプログラムが終了します。変数の型や基本的な構文について C 言語と多少異なるところがあるので、やはりその辺はマニュアルを読んで確認することをお勧めします。例えば、私が割とよく使う do while 構文は System4SDK では使用できません。
次はオブジェクト指向言語としての System4 です。クラス設計をやったことのある人ならば楽勝です。
// クラス定義 : スプライト
class Sprite
{
public:
void initialize( int PRIMARY_KEY ); // スプライト初期化
void setCoordinate( int X_COORD , int Y_COORD ); // 座標をセット
private:
int m_primaryKey; // 主キー
};
// スプライト初期化
void Sprite::initialize( int PRIMARY_KEY )
{
// 主キーを保持
m_primaryKey = PRIMARY_KEY;
// 番号 , 幅 , 高さ , 赤 , 緑 , 青 , アルファ値(濃さ) , 表示フラグ
SP_CREATE( m_primaryKey , 320 , 240 , 255 , 255 , 255 , 255 , true);
}
// スプライト座標設定
void Sprite::setCoordinate( int X_COORD , int Y_COORD )
{
// 座標を更新( System4 では慣習的に x が先で y が後 )
SP_SET_POS( m_primaryKey , X_COORD , Y_COORD );
}
void game_main()
{
Sprite testUnit;
testUnit.initialize( 1 );
int temp = 0;
for( ; ; )
{
if( KEY_IS_DOWN( VK_RIGHT ) == true )
temp++;
testUnit.setCoordinate( temp , 0 );
// 擬似簡易 60 フレーム
W( 1000 / 60 );
}
}
サンプルなんで凄く適当なコードですが、とりあえず白くて四角いスプライトを表示して動かしています。
以下に書く事柄を試すためにはアリスソフトのゲームを所有している必要があります。
今度は何をしたいかというと、市販されているアリスソフトのゲームから画像を拝借して表示させてみます。もちろんアリスソフトのゲームCDまたはDVDが必要です。何でもよい訳ではなく、Windowsに対応していないゲーム、表示色数 256 色以下のゲームは使えないようです。
なお、この方法で作ったゲームの配布については注意が必要であると思われます。市販のゲームCGを添付して不特定多数に公開する行為が法的に真っ黒であることは疑う余地が無いと思いますが、市販のゲームCGを省きプログラム部分だけを配布する行為が法的に(あるいはアリスソフトのスタンスとして)どう扱われるのか確たることは言えません。SDK 付属のドキュメントを読む限り、プログラムの配布くらいは問題無いだろうと私は理解していますが、私から皆さんにそれを保証するわけではないことはご注意ください。
それでは話を進めます。まず必要なものですが、ゲームディスクから ??????GA.ALD というファイルを /web用/Run ディレクトリにコピーします。ファイル名はゲームごとに可変ですが、末尾が GA.ALD となっているものを選んでください。コピーが完了したら、ファイル名をweb用GA.ALD の様に書き換えます。作業が終わったら以下のコードを書いて実行します。
// クラス定義 : スプライト
class Sprite
{
public:
void initialize( int PRIMARY_KEY , int LINKED_CG_NUMBER ); // スプライト初期化
void setCoordinate( int X_COORD , int Y_COORD ); // 座標をセット
void setCG( int LINKED_CG_NUMBER ); // CGをセット
private:
int m_primaryKey; // 主キー
};
// スプライト初期化
void Sprite::initialize( int PRIMARY_KEY , int LINKED_CG_NUMBER )
{
// 主キーを保持
m_primaryKey = PRIMARY_KEY;
// スプライト番号 . CG番号 , 表示フラグ
SP_SET_CG( m_primaryKey , LINKED_CG_NUMBER , true );
}
// スプライト座標設定
void Sprite::setCoordinate( int X_COORD , int Y_COORD )
{
SP_SET_POS( m_primaryKey , X_COORD , Y_COORD );
}
// スプライト上のCGを変更
void Sprite::setCG( int LINKED_CG_NUMBER )
{
SP_SET_CG( m_primaryKey , LINKED_CG_NUMBER , true );
}
void game_main()
{
Sprite testCG;
int cgnum = 1;
testCG.initialize( 1 , cgnum );
for( ; ; )
{
testCG.setCG( cgnum++ );
W( 1000 / 100 );
}
}
クラス定義を多少書き換え、スプライトをCGで初期化し、スプライトのCG番号を随時更新できるようにしました。うまくいけば、ゲームCGが怒涛の勢いで表示されていくことと思います。この原理を応用すれば、アリスソフトのゲームの背景や音声を流用してゲームを作ることも可能であると思われます。