Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
branch: master
Fetching contributors…

Cannot retrieve contributors at this time

156 lines (113 sloc) 4.737 kb
-*- coding: sjis-dos; -*-
スクリプト言語 Hayat
「ハヤット」と読みます。
クラスベースの動的型オブジェクト指向スクリプト言語です。
ゲーム機上で動作するように作成されました。
Rubyを参考にして作ったので、Rubyに似ています。
例えばこんなスクリプトを書けます:
男 = new Person("宇絵夫")
女 = new Person("久家子")
3.times {
男「愛してるよ、{女.name}」
女「わたしもよ、{男.name}」
}
ゲームスクリプターには理解しやすいのではないでしょうか。
receiver「string1{value}string2」 という形式は、
ヒアドキュメントに似て非なるsayCommandという仕組みです。
「 」 の替わりに << >> を使って
receiver<<string1{value}string2>> とも書けます。
他言語のヒアドキュメントでは、全てが文字列に変換されて結合される訳ですが、
Hayatでは要素毎に逐次実行します。
内部的に複数のメソッド呼び出しに分解され実行されます。
receiver.sayCommandStart(1,1) // 通し番号、行数
receiver.sayCommand(string1)
receiver.sayCommand(value)
receiver.sayCommand(string2)
receiver.sayCommandEnd()
プログラマは、sayCommandStart, sayCommand, sayCommandEnd を定義した
クラスを用意します。
これにより、途中で文字の色を変えたりサイズを変えたりといった動作が
わかりやすく記述できます。
アインシュタイン「人生は{青}退屈すれば長く{白}、
{赤}充実すれば短い{白}。」
これは以下の動作となります。
アインシュタイン.sayCommandStart(1,2)
アインシュタイン.sayCommand("人生は")
アインシュタイン.sayCommand(青)
アインシュタイン.sayCommand("退屈すれば長く")
アインシュタイン.sayCommand(白)
アインシュタイン.sayCommand("、\n")
アインシュタイン.sayCommand(赤)
アインシュタイン.sayCommand("充実すれば短い")
アインシュタイン.sayCommand(白)
アインシュタイン.sayCommand("。")
アインシュタイン.sayCommandEnd()
sayCommand内で、BLUE,RED,WHITE などの値を解釈するようにしておけば
良いのです。
enum { 白, 青, 赤 } // 0,1,2
class Person
def sayCommandStart(serialNo, numLines) {}
def sayCommand(x) {
if (x.getClass() == Int)
Font.setColor(x)
else
myGamePrintString(x)
}
def sayCommandEnd() {}
end
======== その他の特徴 ========
●インタプリタではない
コンパイラにてバイトコードにコンパイルしてから、エンジンで実行します。
しかし、実行中にバイトコードの差し替えができるので、インタプリタと同様に
動作中にスクリプトの挙動を変更する事ができます。
●動作環境
過去動作した事のある環境は以下の通り:
linux
cygwin
Microsoft VisualStudio 2008
Nintendo DS
SONY PSP
SONY PS3
なお、linux、cygwin、VisualStudio以外は、機種依存コードを同梱していません。
●C++にて作られている
今時C言語しか使わないプロジェクトも無いかと思います。
実機上で動作する部分では、boostやSTLなどのテンプレートライブラリを使用していません。
コンパイラも実機上で動かす可能性があったので、同様です。(動かした事はありません)
独自開発のPEGパーサジェネレータを使用しています。
STL使用禁止プロジェクトでも動作させる事ができます。(そんなプロジェクトがあるのか?)
●フレーム単位の実行
ゲーム機上での動作を主眼として、フレーム単位での処理を前提としています。
1tick毎に、 Hayat::Engine::gThreadManager.exec1tick(); を呼んでもらいます。
OSネイティブスレッドに対応していません。
マルチスレッドセーフではありません。
Hayat標準ライブラリのThreadクラスは、エンジン内部でフレーム単位での
動作切り替えをサポートするクラスです。
●文字コード
スクリプトで使用する文字コードとして UTF-8, SJIS, EUCJP を使用できます。
バイトコードに出力する文字コードとして UTF-8, SJIS, EUCJP を指定する事が
できます。スクリプトとバイトコードで文字コードが異なる場合には、コンパイラが
変換します。
識別子に全角文字を使用する事ができます。
スペース文字として、全角スペースを使用する事ができます。
●インクリメンタルGCを実装
GCはインクリメンタルに実行しますので、時々コントロールできないタイミングで
GCの処理が重くなって処理落ちするといった事は少ないはずです。
●実行速度が遅い
パフォーマンスチューニングをしていません。Ruby1.8より倍くらい遅いかと。
特にメソッド検索が遅い事はわかっているので、まずはメソッドオーバーロードの
仕組みを無くすか簡略化すべきとは思っています。
しかしそれでも、DS上で動作するアドベンチャーとかボードゲームなどでは
十分処理は間に合っていました。
●名前の由来
出身地のお寺「光前寺」に伝わる「霊犬早太郎の伝説」から名前の一部を頂いて
Hayat としました。
●今後
ゲーム業界から足を洗ってしまったので、今後のサポートを期待されても
あまり対応出来ないかと思います…。
xtal とか squirrel とかが sayCommand の仕組みを入れて識別子に全角を
使えるようになれば、そっちを使う方が良いだろうと思います。
●ライセンス
MITラインセンスです。
どんどん改造して無断で有料ソフトにて使用してもかまいません。
無保証です。
Copyright (c) 2011 福澤 正 alien@apple.nifty.jp
Jump to Line
Something went wrong with that request. Please try again.