作ってみたよ

目的と目標

Chessなどで使われるRating System。点差が100点ある選手同士の勝率はだいたい1:2になるとゆー、便利なSystemだが、いまいち使う機会がない。
そこで、CARNAGE HEARTみたいなLogic弄って戦わせる系のGameで使ってみようと思ったが、以前持っていたCARNAGE HEARTはどっかいってるし(ライフスケイプっつークソゲーはちゃんとあるのに・・・)、MULTIPLY 29はなんかいまいち(Logicがデフォで20x20はでかすぎるし、Sub Routinとかいらね)なので、自分で作ることにした。

基本仕様

ベースはカルネージハート
真上見下ろし2Dグラフィック。
チーム戦も可能にする
初心者でも「ルーチン弄ったら強くなった!」が実感できるゲームバランス
Logicはパズル(だからサブルーチンとか要らないのだ)

ロジック仕様

動作系

  • 前後左右に移動
  • 前後左右にジャンプ
  • 左右回転
  • メインウエポン
  • サブウエポン

分岐系

  • 索敵分岐
  • 敵弾分岐
  • 味方分岐
  • 障害物分岐
  • 危険物分岐
  • 変数分岐

制御系

  • ウエイト
  • 動作ストップ
  • 動作終了待ち

ハードウェア仕様

プラットフォーム

  • 二足歩行型(重量制限あり。重量制限=エネルギー出力)
  • 多足歩行型(重量制限あり。重量制限=エネルギー出力)
  • 戦車型(重量制限なし。移動速度=エネルギー出力÷重量)

メインウエポン

  • アサルトガン
  • ショットガン
  • ガトリングガン
  • カノン
  • レーザー
  • クロー
  • (タックル)

サブウエポン

  • ホーミングミサイル
  • 地雷

  • フレア

  • レーダージャマー

プログラミングメモ

試合管理関連の変数の使用

  • 試合時間経過
  • 障害物座標x(障害物ナンバ)
  • 障害物座標y(障害物ナンバ)
  • チームナンバ(機体ナンバ)
  • メンバーナンバ(機体ナンバ)

機体関連の変数の仕様

  • 機体データ(機体ナンバ)
  • 機体フラグ(機体ナンバ)
  • 機体名(機体ナンバ)
  • 機体HP(機体ナンバ)
  • 機体燃料(機体ナンバ)
  • 機体重量(機体ナンバ)
  • 機体装甲重量(機体ナンバ)
  • 機体座標x(機体ナンバ)
  • 機体座標y(機体ナンバ)
  • 機体方向(機体ナンバ)

動作関連の変数の仕様

  • ジャンプカウンタ(機体ナンバ)
  • ジャンプ方向(機体ナンバ)
  • ジャンプ速度(機体ナンバ)

機体性能関連の変数の仕様

  • CPUサイズx(機体ナンバ)
  • CPUサイズy(機体ナンバ)
  • CPU速度(機体ナンバ)
  • 前移動スピード(機体ナンバ)
  • 後移動スピード(機体ナンバ)
  • 横移動スピード(機体ナンバ)
  • 回転スピード(機体ナンバ)
  • 前ジャンプ距離(機体ナンバ)
  • 後ジャンプ距離(機体ナンバ)
  • 横ジャンプ距離(機体ナンバ)
  • 前着地時間(機体ナンバ)
  • 後着地時間(機体ナンバ)
  • 横着地時間(機体ナンバ)
  • メインウエポン可動角度(機体ナンバ)
  • 装甲性能(機体ナンバ)
  • 燃費(機体ナンバ)
  • 前移動燃料消費(機体ナンバ)
  • 後移動燃料消費(機体ナンバ)
  • 横移動燃料消費(機体ナンバ)
  • 回転燃料消費(機体ナンバ)
  • 前ジャンプ燃料消費(機体ナンバ)
  • 後ジャンプ燃料消費(機体ナンバ)
  • 横ジャンプ燃料消費(機体ナンバ)
  • 右メインウエポン種類(機体ナンバ)
  • 左メインウエポン種類(機体ナンバ)
  • 第1サブウエポン種類(機体ナンバ)
  • 第2サブウエポン種類(機体ナンバ)
  • 第3サブウエポン種類(機体ナンバ)
  • 第4サブウエポン種類(機体ナンバ)
  • 最大出力(機体ナンバ)
  • 当たり判定半径(機体ナンバ)

メインウエポン関連の変数の仕様

  • ウエポンカウンタ(機体ナンバ)
  • ウエポン残量(機体ナンバ)

弾丸関連の変数の仕様 

  • 弾丸フラグ(機体ナンバ,弾丸ナンバ)
  • 弾丸座標x(機体ナンバ,弾丸ナンバ)
  • 弾丸座標y(機体ナンバ,弾丸ナンバ)
  • 弾丸方向(機体ナンバ,弾丸ナンバ)
  • 弾丸速度(機体ナンバ,弾丸ナンバ)
  • 弾丸距離(機体ナンバ,弾丸ナンバ)
  • 弾丸威力(機体ナンバ,弾丸ナンバ)

ミサイル関連の変数の仕様

  • ミサイルフラグ(機体ナンバ,ミサイルナンバ)
  • ミサイル座標x(機体ナンバ,ミサイルナンバ)
  • ミサイル座標y(機体ナンバ,ミサイルナンバ)
  • ミサイル目標(機体ナンバ,ミサイルナンバ)
  • ミサイル目標座標x(機体ナンバ,ミサイルナンバ)
  • ミサイル目標座標y(機体ナンバ,ミサイルナンバ)
  • ミサイル方向(機体ナンバ,ミサイルナンバ)
  • ミサイル速度x(機体ナンバ,ミサイルナンバ)
  • ミサイル速度y(機体ナンバ,ミサイルナンバ)
  • ミサイル距離(機体ナンバ,ミサイルナンバ)
  • ミサイル威力(機体ナンバ,ミサイルナンバ)
  • ミサイル出力(機体ナンバ,ミサイルナンバ)
  • ミサイル最高速度(機体ナンバ,ミサイルナンバ)
  • ミサイルシーカー角度(機体ナンバ,ミサイルナンバ)
  • ミサイルシーカー距離(機体ナンバ,ミサイルナンバ)
  • ミサイル変針性能(機体ナンバ,ミサイルナンバ)

レーザー関連の変数の仕様

  • レーザーフラグ(機体ナンバ,レーザーナンバ)
  • レーザー発射座標x(機体ナンバ,レーザーナンバ)
  • レーザー発射座標y(機体ナンバ,レーザーナンバ)
  • レーザー発射方向y(機体ナンバ,レーザーナンバ)
  • レーザー威力(機体ナンバ,レーザーナンバ)

地雷関連の変数の仕様(地雷は置いたら敵味方自分関係なしでいいよね)

  • 地雷フラグ(地雷ナンバ)
  • 地雷座標x(地雷ナンバ)
  • 地雷座標y(地雷ナンバ)
  • 地雷威力(地雷ナンバ)
  • 地雷攻撃範囲(地雷ナンバ)
  • 地雷索敵範囲(地雷ナンバ)


フレア関連の変数の仕様 

  • フレアフラグ(フレアナンバ)
  • フレア座標x(フレアナンバ)
  • フレア座標y(フレアナンバ)
  • フレア方向(フレアナンバ)
  • フレア速度(フレアナンバ)
  • フレア距離(フレアナンバ)


索敵分岐関連の変数の仕様

  • 敵機方向(自分の機体ナンバ,対象の機体ナンバ)
  • 敵機距離(自分の機体ナンバ,対象の機体ナンバ)
  • 最近敵機方向(自分の機体ナンバ,対象の機体ナンバ)
  • 最近敵機距離(自分の機体ナンバ,対象の機体ナンバ)

敵弾分岐関連の変数の仕様

  • 敵弾方向(自分の機体ナンバ,対象の機体ナンバ,対象の弾丸ナンバ)
  • 敵弾距離(自分の機体ナンバ,対象の機体ナンバ,対象の弾丸ナンバ)

敵ミサイル分岐関連の変数の仕様

  • 敵ミサイル方向(自分の機体ナンバ,対象の機体ナンバ,対象のミサイルナンバ)
  • 敵ミサイル距離(自分の機体ナンバ,対象の機体ナンバ,対象のミサイルナンバ)

味方分岐関連の変数の仕様

  • 味方方向(自分の機体ナンバ,対象の機体ナンバ)
  • 味方距離(自分の機体ナンバ,対象の機体ナンバ)

障害物分岐関連の変数の仕様

  • 障害物方向(自分の機体ナンバ,対象の障害物ナンバ)
  • 障害物距離(自分の機体ナンバ,対象の障害物ナンバ)

危険物分岐関連の変数の仕様

  • 危険物方向(自分の機体ナンバ,対象の地雷ナンバ)
  • 危険物距離(自分の機体ナンバ,対象の地雷ナンバ)

Logic関連の変数の仕様

  • コードカウンタ(機体ナンバ)
  • 命令レジスタ(機体ナンバ)
  • 方向レジスタ(機体ナンバ)
  • 分岐キャッシュ(機体ナンバ)
  • 分岐キャッシュ(機体ナンバ)
  • ウエイトカウンタ(機体ナンバ)
  • レジスタ(機体ナンバ,レジスタ数)
  • キャッシュ(機体ナンバ,キャッシュ)
  • 機体変数(機体ナンバ,変数ナンバ)

フローチャート

前処理

  • 機体読み込み画面
  • Logicを読み込む
  • 機体性能関連の変数に代入する処理

機体動作処理

  • 敵機情報処理
  • ジャンプ処理
  • ハードウェア動作処理

弾丸処理

  • 弾丸消去処理
  • 弾丸移動処理
  • 弾丸当たり判定処理

ミサイル処理

  • ミサイル消去処理
  • ミサイル目標変更処理←フレアとかで。
  • ミサイル向き変更処理
  • ミサイル慣性処理
  • ミサイル移動処理
  • ミサイル当たり判定処理

レーザー処理(レーザー処理の一部はハードウエア動作処理で行う)

  • レーザー当たり判定処理

地雷処理

  • 地雷消去処理
  • 地雷当たり判定処理

フレア処理

  • フレア消去処理
  • フレア移動処理


ロジック処理

  • 命令を命令レジスタに代入
  • 命令レジスタの内容で処理を決定
  • 動作系なら動作スイッチをオンにする
  • 分岐系なら判定して、分岐する
  • 制御系なら制御する

表示処理

処理のメモ

レーザーの当たり判定について

索敵について。

  • 機体数ぶんのループを作る。
  • 調べる機体が敵か味方か調べる。
  • 敵なら、その機体への方角と距離を求める
  • その機体が、索敵範囲内にあったら、分岐する。

障害物分岐について

  • やり方は索敵分岐と同じ
  • 基本的に障害物の中心の点を座標にする
  • フィールドの端の壁については、点にできないから困ってる。
  • レーダーを、方角と角度の扇形ではなく、方角だけの線形にすれば、やり方はわかる。
  • 扇形でのやり方誰か教えて。。

CPUの性能差について

  • 1命令実行するごとに、強制的にウエイトがかかる
  • 低速…4フレーム、中速…2フレーム、高速…1フレーム

機体データの仕様

  • 1行目 機体名
  • 2行目 プラットフォームの種類
  • 3行目 CPUの種類
  • 4行目 エネルギージェネレーターの種類
  • 5行目 燃料容量
  • 6行目 装甲の種類
  • 7行目 右メインウエポンの種類
  • 8行目 左メインウエポンの種類
  • 9行目 第1サブウエポンの種類(以下、積めない分は空欄)
  • 10行目 第2サブウエポンの種類
  • 11行目 第3サブウエポンの種類
  • 12行目 第4サブウエポンの種類
  • 以下Logicデータ

Logicの仕様

  • 命令名1行+出口の方向1行+オプション8行(???)
  • 出口の方向は0が無し。1-4が↑→↓←。十の位は分岐

プラットフォームの種類

  • 00 テスト用。二足歩行。HP100。移動速度すべて1。ジャンプカウンタ20。着地ロス10。回転速度0.01。ウエポン可動角度左右1。最大燃料200.0。フレーム重量500.0。装甲重量200.0

CPUの種類

  • 00 テスト用。低速 4x4

エネルギージェネレータの種類

  • 00 テスト用。最大出力1000.0 燃費10.0 重量100.0

装甲の種類

  • 00 テスト用。ダメージを1低減する。重量係数1.0

メインウエポンの種類

  • 00 練習用アサルトガン 威力5

サブウエポンの種類

  • 00 ターミナル。つまり何もつまない 重量0.0

燃費の意味

  • 1フレーム当たりの消費燃料=出力÷燃費×燃料消費係数
  • テスト用ボディの場合、歩行0.001、回転0.001、ジャンプ0.05・・・みたいな感じで決める

初期配置

  • 対面配置
  • ランダム配置

ミサイル目標について

  • ミサイルは発射した時点でもっとも近い敵機をロックする。
  • ロックした機体の付近にフレアがあれば、時々そっちにロックが移る
  • ロックが移る確率は、機体とフレアの距離に反比例する。
  • でも、フレアにロックが移った後でも、フレアからもとの機体にロックが戻る可能性もある。