Queek C の仕様

マップ関数

Queek II では、マップごとにその動作を定義するための「マップ関数」とよばれる特殊な関数を関連付けています。マップ関数を宣言するには、static 等の記憶クラスを宣言せずに、戻り値型の代わりに mapfunc というキーワードを書きます (サンプルスクリプトもしくはチュートリアル参照)。マップ関数はユーザーが呼び出すことはできず、システムがマップをロードすると自動的に呼び出されます。マップ関数が終了すると、SetMap 関数を用いて設定された次のマップがロードされ、そのマップに関連付けられたマップ関数が呼び出される、という一連の流れになります。ニューゲームを開始する際は総合開発環境の一般設定で設定された初期マップがロードされます。セーブデータをロードする際は、セーブ時にいたマップがロードされます。

localsave と globalsave 記憶クラス

グローバル変数に指定できる Queek C 独自の特殊な記憶クラスに、localsaveglobalsave があります。これらの記憶クラスは変数宣言の一番初めに書きます。これらの記憶クラスを指定すると、その変数はゲームがセーブされたときに保存され、ロードされると以前の内容が復元されます。フラグなど、セーブしたいデータに指定します。これらの記憶クラスは、ポインタには使用できません。なぜなら、ソースコード中で同じ変数であっても実行毎に割り当てられる領域は変化しうるからです。localsave と globalsave の違いは、localsave 記憶クラスが RPG のセーブデータファイル "Local??.qs" に保存され、セーブデータごとに独立して管理されるのに対し、globalsave 記憶クラスは各セーブデータ間で共通の "Global.qs" に保存され、値が共有されるという点です。globalsave 記憶クラスに指定された変数の内容は、RPG 実行中にデータがセーブされずにロードされてもロード前の値を保持し続け、セーブされずに終了された場合も値は保存されます。globalsave 記憶クラスは、例えば「ゲームのクリア回数」などのようにセーブデータが変わっても保存しておきたいフラグ値等の管理に使うことができます。なお、localsave や globalsave に指定された変数の内容は、static なものについてはスクリプトファイル名の順に、非 static なものはそれらの後に、宣言された順番で書き込まれます。このため、スクリプトファイル名を変更・追加したり、宣言順を変更したり、新たな保存クラス変数を追加したりするとそれ以前のセーブデータ "*.qs" は使えなくなりますので注意してください。

未サポートの言語機能

Queek C では、コンパイラ製作時間の都合上などから実装できなかった C 言語の機能がいくつかあります。C 言語を習得済みの方はあらかじめご承知ください。どうしてもこの機能は実装してほしい、などのクレームがあればご意見いただきたいと思いますが、必ずしもご要望に応えられるとは限りません。未サポート機能の一覧および言い訳は以下の通り。

プリプロセッサプリプロセッサ命令は一切サポートしていません。しかし、関数プロトタイプ宣言やグローバル変数の外部リンケージ宣言などが不要となっていますので、ヘッダファイル等は極力使わずに済むようになっています。定数の宣言には const を使用してください。
unsignedQueek C の整数型はすべて signed です。また、short や long といったキーワードもサポートしていません。
構造体
共用体
列挙型
実装が大変なので時間的にサポートできませんでした。ただ、RPG の製作に必要なデータ構造はすべて内部的に実装されていますので、RPG 以外のゲームを作りたい場合などを除いてはそこまで不自由しないと思います。
typedef構造体などが使えないので、なくてもさほど問題ないと思います。
静的な多次元配列Queek C は、配列型とポインタ型の区別があまり厳密ではありません。そのため、コンパイラレベルでの多次元配列は使用できません。なお、同様の理由から、配列形式での引数は使えません。ただし、要素列へのポインタ配列を動的に確保することで malloc 的に多次元配列を使うことはできます。→詳細
関数ポインタ実装は難しくないと思いますが、需要がそこまであるとも思えないのでサポートしていません。

他にも「使おうとしたらできなかった」というのが出てくるかもしれませんがご了承ください。

リンケージ仕様

そもそも Queek C はインタプリタなのでコンパイル、リンクという用語があまり適切ではないかもしれませんが、一応ソースコード処理のフェーズとして区別しています。前述のように、外部ファイルスコープに存在する変数や関数の宣言が不要となっていますので、ローカル変数以外の識別子はリンクの段階で処理されます。このため、データ型に関するエラーはコンパイル段階ではなくリンク段階で出力されるようになっています。詳細はスコープの「ファイルスコープ」に関する記述をご覧下さい。それから、const 定数とソースコード中の定数の数式処理はコンパイル段階で可能な限り行われます。

文字列の扱いについて

C 言語基礎講座をお読みいただいた方はすでにわかっていただけたかと思いますが、Queek C では文字列を扱うために char 型配列を使用しません。文字列は C++ のストリングクラスに相当する string という組み込み型を使います。string 型そのものは、文字列長 int データ 1 個と文字列バッファのポインタで合計 8 バイトですが、内部的にバッファの確保・解放などを行っていますのでメモリの使用に関しては動的に扱われます。現段階では文字列をバイト単位で処理する方法は提供されていませんが、需要が多ければ考えます。

標準ライブラリ関数のサポートについて

Queek II のシステム関数として実装されている標準関数は一部の数学関数などだけです。データのセーブに関しても特殊な記憶クラスを使用することにより実装していますので、ファイル入出力関数等もサポートしていません。標準ライブラリ関数や Windows API 関数等で実装してほしいものがあれば、ご要望いただきたいと思います。ものにもよりますが、多くの場合次のバージョンで簡単に実装できると思います。

<PrevSec | ▲ChTop | ▲PageTop | NextSec>
Copyright (c) 1999-2006 インターネット停留所