花AI塚のAIはLua5.1(本家サイト、日本語版リファレンス)で記述します。 花映塚の対戦が開始するとスクリプトがロードされ、以後対戦が終了するまで毎フレームmain関数が呼び出されます。 大戦終了後はスクリプトがアンロードされます。
セキュリティ上の都合により、提供する標準ライブラリを制限しています。
以下の関数はAIスクリプト内で使用できません。
以下の関数はAIスクリプト内で使用できますが、本来の関数よりも機能が制限されています。
これらはいずれも指定できるファイルパスが制限されています。 これらの関数に渡すファイルパスfilenameは
string.match(filename, '^[%w_%-]+%.%w+$')
にマッチしなければいけません。マッチしない場合はファイルオープンに失敗するなどのエラーが発生します。
以下のfilenameはマッチします。
以下のfilenameはマッチしません。
なお、これらの関数で指定したファイルパスはAIスクリプトのある場所からの相対パスとして解釈されます。 したがって、これらの関数はAIスクリプトのあるフォルダ内のファイルへのみアクセスできます。
また、dofileおよびloadfileでバイトコードをロードすることはできません。
花映塚のゲーム情報を取得したり、キー入力を送信するための関数やオブジェクトがAIスクリプトへ提供されます。
提供されるものとしては以下のものがあります。
現在プレイしている自機に対するキー入力を花映塚へ送ります。 key_state
には整数値を指定し、各ビットがそれぞれどのキーを押すかを表します。
最下位ビットからそれぞれ
となっています。
2つのHitBodyオブジェクトhitbody_a
とhitbody_b
の当たり判定処理を行います。 hitbody_a
とhitbody_b
とがぶつかっている時はtrueを、そうでなければfalseを返します。
呼び出すと、呼び出したフレームでのスナップショットを保存します。保存先は花映塚のデフォルトの保存先です。 この関数は設定で「スクリプトからのスナップショット取得を許可」を有効にしたときだけ使用できます。
2つのGameSide からなる配列で、game_sides[1]
は1P側の、game_sides[2]
は2P側のゲーム状態を表します。 このグローバル変数は毎フレーム更新されます。
この変数を経由して得られるすべての値は次フレームで破壊的に変更される可能性があります。 例えばある時点でgame_sides[1].enemies[1]
が敵Aを表していたとして、 次のフレームでは敵Bのデータに書き換えられている可能性があります。 そのためgame_sides
のフィールドへの参照を保存して次フレームで参照するのは非推奨です。 ある時点でのデータを次フレームに渡したい場合は深いコピーを行うなどして下さい。
この変数はこのAIスクリプトが1P側か2P側かを表します。 1P側ならば
player_side == 1
2P側ならば
player_side == 2
です。
この変数は現在のゲームの難易度を表します。
難易度 | difficultyの値 |
---|---|
Easy | 0 |
Normal | 1 |
Hard | 2 |
Lunatic | 3 |
Extra | 4 |
この変数は対戦開始からの経過ラウンド数を表します。
GameSideオブジェクトは対戦の各サイドのゲーム状態を表します。 このオブジェクトは以下のフィールドを持ちます。
Playerオブジェクトは自機に関する情報を表します。 このオブジェクトは以下のフィールドを持ちます。
Enemyオブジェクトは個々の敵に関する情報を表します。 このオブジェクトは以下のフィールドを持ちます。
現在生きている敵かどうかをブール値で表します。
このフィールドは以前の設計において必要だったのが惰性で残った感じの代物で、今後廃止される恐れがあります。この敵が擬似的な敵かどうかをブール値で表します。
擬似的な敵とは弾幕の設置のためだけに存在する(多くの場合不可視な)敵のことです。 たとえば咲夜さんのC2やC3でナイフが配置される際には、擬似的な敵が出現しナイフを配置しています。
敵の当たり判定を表すHitBodyオブジェクトです。 この当たり判定は敵vs自機の衝突判定で用いるものです。
Bulletオブジェクトは個々の弾やレーザーに関する情報を表します。 EXアタックによって発生する弾のいくつかについてはExAttackオブジェクトとして扱われます。 Bulletオブジェクトは以下のフィールドを持ちます。
現在有効な弾かどうかをブール値で表します。
このフィールドは以前の設計において必要だったのが惰性で残った感じの代物で、今後廃止される恐れがあります。弾の当たり判定を表すHitBodyオブジェクトです。 この当たり判定は弾vs自機の衝突判定で用いるものです。
ExAttackオブジェクトはEXアタックによって発生する弾やメディの毒霧、四季映姫のなんかもやもやのやつなどに関する情報を表します。
EXアタックによって発生する弾のすべてがExAttackオブジェクトで表されるとは限りません。 たとえば小野塚小町のEXアタックでは個々の弾はBulletオブジェクトで表され、弾源のみがExAttackオブジェクトで表されます。
ExAttackオブジェクトは以下のフィールドを持ちます。
現在の速度を表します。
BUG: 1P/2P間をまたぐ間、速度が正しく取得できない(咲夜さんのEXアタックのみ取得可)。現在有効なEXアタックかどうかをブール値で表します。
このフィールドは以前の設計において必要だったのが惰性で残った感じの代物で、今後廃止される恐れがあります。有効な当たり判定を持つかどうかをブール値で表します。
EXアタックは必ずしも有効な当たり判定を持つとは限りません(特に弾源としてのみ機能する場合)。EXアタックの当たり判定を表すHitBodyオブジェクトです。 この当たり判定はEXアタックvs自機の衝突判定で用いるものです。
注意 hittable = false
のときはhitBodyがnil
であるケースがあります。
Itemオブジェクトは画面中のアイテムに関する情報を表します。 このオブジェクトは以下のフィールドを持ちます。
現在有効なアイテムかどうかをブール値で表します。
このフィールドは以前の設計において必要だったのが惰性で残った感じの代物で、今後廃止される恐れがあります。アイテムの当たり判定を表すHitBodyオブジェクトです。
HitBodyオブジェクトは当たり判定に関する情報を表します。 このオブジェクトは以下のフィールドを持ちます。
type = HitType.Circle
のとき、当たり判定の半径を表します。
type = HitType.RotatableRect
のとき、当たり判定の回転角を表します。
HitBody.typeの値によって、当たり判定処理のときにどのフィールドを用いるかが異なります。
HitBody.type | x | y | width | height | radius | angle |
---|---|---|---|---|---|---|
HitType.Rect | ◯ | ◯ | ◯ | ◯ | ||
HitType.Circle | ◯ | ◯ | ◯ | |||
HitType.RotatableRect | ◯ | ◯ | ◯ | ◯ | ◯ |
それぞれの種別の当たり判定の形状を図示すると以下のようになります。
当たり判定の形状一覧
EXアタックの種別を表す定数群です。
ExAttackType.Reimu | 霊夢のEXアタック(陰陽玉) |
ExAttackType.Marisa | 魔理沙のEXアタック(レーザーを発するビット) |
ExAttackType.Sakuya | 咲夜さんのEXアタック(ナイフ) |
ExAttackType.Youmu | 妖夢のEXアタック(なんか設置されるやつ) |
ExAttackType.Reisen | 鈴仙のEXアタック(膨張する丸弾) |
ExAttackType.Cirno | チルノのEXアタック(つらら) |
ExAttackType.Lyrica | リリカのEXアタック(弾源) |
ExAttackType.Merlin | メルランのEXアタック(弾源) |
ExAttackType.Lunasa | ルナサのEXアタック(弾源) |
ExAttackType.Mystia_Ex | ミスティアのEXアタック(鳥型弾源) |
ExAttackType.Mystia_Charge2 | ミスティアのC2(鳥型弾源) |
ExAttackType.Mystia_Charge3 | ミスティアのC3(鳥型弾源) |
ExAttackType.Mystia_Boss1 | ミスティアのボスアタック時の弾(鳥型弾源) |
ExAttackType.Mystia_Boss2 | ミスティアのボスアタック時の弾(鳥型弾源) |
ExAttackType.Tewi | てゐのEXアタック(丸い跳ね返るやつ) |
ExAttackType.Aya | 射命丸のEXアタック(高速丸弾) |
ExAttackType.Medicine | メディスンのEXアタック(毒霧) |
ExAttackType.Yuuka | 幽香のEXアタック(向日葵) |
ExAttackType.Komachi | 小町のEXアタック(弾源) |
ExAttackType.Eiki | 映姫のEXアタック(弾幕の罪を表面化するもやもや) |
アイテムの種別を表す定数群です。
ItemType.G | G |
ItemType.Bullet | 弾 |
ItemType.Ex | Ex |
ItemType.Score | 点 |
当たり判定の種別を表す定数群です。
HitType.Rect | 矩形 |
HitType.Circle | 円形 |
HitType.RotatableRect | 回転可能な矩形 |
自機のキャラクター種別を表す定数群です。
CharacterType.Reimu | 博麗霊夢 |
CharacterType.Marisa | 霧雨魔理沙 |
CharacterType.Sakuya | 十六夜咲夜 |
CharacterType.Youmu | 魂魄妖夢 |
CharacterType.Reisen | 鈴仙・優曇華院・イナバ |
CharacterType.Cirno | チルノ |
CharacterType.Lyrica | リリカ・プリズムリバー |
CharacterType.Mystia | ミスティア・ローレライ |
CharacterType.Tewi | 因幡てゐ |
CharacterType.Yuuka | 風見幽香 |
CharacterType.Aya | 射命丸文 |
CharacterType.Medicine | メディスン・メランコリー |
CharacterType.Komachi | 小野塚小町 |
CharacterType.Eiki | 四季映姫・ヤマザナドゥ |
CharacterType.Merlin | メルラン・プリズムリバー |
CharacterType.Lunasa | ルナサ・プリズムリバー |
チャージタイプを表す定数群です。
ChargeType.Slow | Z長押しでチャージ、Shiftで低速 |
ChargeType.Charge | Shiftでチャージ、Z長押しで低速 |
自機の位置や弾の速度など、ゲームに関する位置情報はすべて以下の座標系でのものです。
ゲーム状態に関する座標系
この座標系はY軸が下向きかつ画面上部でYが0であり、X軸が右向きかつ各陣の画面中央でXが0である座標系です。
花映塚において当たり判定処理は
のいずれかを行うことで実現しています。 Playerオブジェクトで述べたように、自機には円形と矩形の両方の当たり判定がありますが、 円形の当たり判定(Player.hitBodyCircle)が用いられるのは円形の当たり判定との当たり判定処理を行うときだけで、それ以外の当たり判定では矩形の当たり判定を用います。