自機挙動解析

  • 移動速度は最大で陸上1535,水中767と決まっている
    • 水流で流されている場合は水中でも1535
    • この速度制限処理はスプライトの処理よりも前にあるため,スプライトの力によって加速した場合はDoukutsuDebugの表示上1535を超える場合がある(例:扇風機)が,速度を位置に加算する処理も同様にスプライトの処理よりも前にあるため,実際の速度は1535を超えていない(処理順序参照)
    • この制限速度はあくまで「X速度/Y速度」という2つの変数にそれぞれ課されているものであり、ブロックの判定などで自機の位置が強制的に揃えられる処理などによる移動量はこれに含まれていない
  • 重力加速度は陸上80,水中40と決まっているが,場合により免除/緩和される

ダメージ時

  • ダメージタイマーが0でない場合何の処理もしない
  • Y速度を上向き1024にセット
  • ダメージタイマーを128にセット

空中の挙動

左右キーで一定の加速度(陸上32, 水中16)
自力移動の最大速度(陸上812, 水中406)以上の速度がついている場合は加速しない
  • 上記の仕様のため初速度によって最大速度には812~843の開きがある
    • 例:速度0から始めたとき 800->832と飛び越えるため832で加速が止まる
    • 例:速度10から始めたとき 810->842と飛び越えるため842で加速が止まる
    • ※歩行の瞬間最大速度は845なのでその瞬間に跳べば843よりも速くなれる

接地中の挙動

  • 毎フレーム陸上51,水中25のX方向速さ減少(以降摩擦と呼称)
    • 扇風機及びコアの風などで横向きに流されている場合は摩擦が無くなる
  • ブーストの停止
  • ジャンプが可能になる

歩行

  • 毎フレーム陸上85,水中42の加速度
    • 摩擦があるため実質加速度は陸上34,水中17
    • ※急ターン時などは歩行加速度と摩擦加速度が同方向に働くため実質加速度は85+51=136となる
    • 速度が自力移動の最大速度(陸上812, 水中406)以上の場合加速は行われない(摩擦のみがかかる)
    • ※陸上歩行の加速度85と摩擦51の最大公約数は17のため17の倍数しかでない

天井衝突

  • 自機の位置を自機の判定サイズに基づきめり込んでいない位置に調整
  • 上向きに256を超える速度がある場合
    • 効果音3番を再生
    • エフェクト13番を発生
  • 上向きの速度がある場合Y速度を0にする

横壁衝突

  • 自機の位置を自機の判定サイズに基づきめり込んでいない位置に調整
  • X速度が384を超えている場合384にセット
  • 壁の方向にキーが押されていない場合 X速度を0にセット

地面衝突

  • 自機の位置を自機の判定サイズに基づきめり込んでいない位置に調整
  • 効果音23番を再生
  • 下向きの速度がある場合Y速度を0にする

坂道衝突

  • 降りていく方向へX速度がある場合,降りていく方向のX速度を下向きのY速度に設定する(坂道を降りる際に一歩ごとに浮いてしまうのを防ぐためと思われる)
    • 例として下り坂をX速度500で降りた場合,Y速度も500になる
    • ※この速度は設定されたそのフレームで消えてしまうためDoukutsuDebugでは確認できない.
+ 速度が確認できない理由の解説
1.洞窟物語では自機の処理→タイルの判定処理→同期処理→次のフレームへという処理順序である。そのため、基本的に「自機の処理」において参照されるタイルの判定状態は前のフレームの情報となる。
2.この坂道を降りる際の下速度は「自機の処理」において付けられ、そのまま同じフレームで反映されている。
3.着地した際にY速度が0になる処理は「タイルの判定処理」において行われている。
以上により、この坂道を降りる際の下速度は(前のフレームのタイル判定情報に基づき)そのフレームで作られ、そのフレームで反映され、そのフレームで消える。
自機の処理とタイルの判定処理の間のタイミングで速度情報を取得すれば観測できるかもしれないが、軽快に動作している場合その時間は非常に短いため、観測は難しいと思われる。特にDoukutsuDebugでは同期処理の直前で情報を取得する仕様のため絶対に見えない。

ジャンプ

  • ジャンプボタンを押した瞬間のフレームの処理
    • 上向きに加速度(陸上1280,水中640)
      • ※後述のように緩和された重力加速度がかかるため実質的には1248の加速度となる
      • ※ブースターv0.8の装着時のみ実質加速度1216となる現象を確認。現在調査中
    • 効果音15番を再生
  • ジャンプボタン押下中の処理
    • 重力加速度を緩和(陸上32,水中16)
      • ※ただしY速度が上向きの間に限る

ブースターv2.0

  • ジャンプボタンを押した瞬間のフレームの処理
    • 方向キーの向きに加速度1535
      • ただしこの数字は最大速度と等しいため実際には1Fで最大速度に達する
      • 加速度の向き決定は上→左→右→下の優先度で決定される(方向キーを押していない場合上になる)
    • ブーストのエフェクトを発生
    • 他の向きの速度を0にセット
  • ブースト中の処理
    • ブースター残量を1減ずる
    • 最初に横方向で噴射を始めた場合
      • 向いてる方向へX方向に加速度32
      • 横壁に衝突中の場合,Y速度を-256(上向き256)にセット
    • 最初に縦方向で噴射を始めた場合
      • 噴射方向へX方向に加速度32
    • ※要するに横噴射で始めた場合は方向転換が出来るが縦噴射で始めた場合不可能
    • ブースター残量を3で割った余りが1の時ブーストのエフェクトを発生
    • 効果音113番を再生
  • ブースト後,ジャンプボタンを離したorガス欠したフレームの処理
    • ブースト方向の速度が半分になる(下方向の場合を除く)
    • ※丸めが起きるので陸上の場合floor(1535/2)=floor(767.5)=767になる
  • 着地した際の処理
    • ブースター残量を50にセット

ブースターv0.8

  • ジャンプを押したフレームの処理
    • 下方向のy速度が256を超えている場合y速度が半分になる
  • ブースト中の処理
    • ブースター残量を1減ずる
    • 重力加速度なし
    • 頭をぶつけた場合Y速度を512にセット
    • 上方向に加速度32
      • ただし水流で上に流されている場合加速しない
      • 上向きに1024以上の速度が付いている場合加速しない,かつ重力加速度あり(ジャンプ中の処理に準ずる)
  • 着地した際の処理
    • ブースター残量を50にセット

当たり判定サイズ

  • 基本的な自機の判定サイズ:中央から上下に8ドット,左右に5ドットのサイズ

  • タイルのブロックとの判定
    • ブロックの判定サイズ:横からぶつかる場合
      • 中央から上下に4ドット,左右に8ドットの大きさ
      • 自機の位置調整では上下に8ドットの計算で行われる(見た目通り)
    • ブロックの判定サイズ:上下からぶつかる場合
      • 中央から上下に8ドット,左右に5ドットの大きさ
      • 自機の位置調整では左右に8ドットの計算で行われる(見た目通り)

  • 坂道との判定
    • 見た目通りに斜めの判定(ただし裏側からの接触を考慮したアルゴリズムではないため,バグ挙動の詳細なメカニズムは調査中)

  • タイルの水流/風との判定
    • 中央から上下左右に6ドットの大きさ

  • タイルの水との判定
    • 中央から上と左右に5ドット, 下に0ドットの大きさ

  • タイルのトゲとの判定
    • 自機の判定サイズ:中央から上下左右に4ドットのサイズ
    • トゲの判定サイズ:中央から上下に3ドット,左右に4ドットのサイズ

  • タイルの赤い酸/水中トゲとの判定
    • タイルのトゲとの判定に準ずる(水中判定もトゲの条件で生じる)

  • フラグ0x01も0x40も設定されていないスプライトとの判定
    • 自機の判定サイズ:中央から上下左右に1024(2ドット)の大きさ
    • スプライトの判定サイズ:npc.tblに基づく

  • フラグ0x01の設定されたスプライトとの判定
    • 自機の判定サイズ:中央から上下に8ドット,左右に5ドットのサイズ
    • スプライトの判定サイズ:横からぶつかる場合
      • npc.tblで指定したサイズよりも上下がそれぞれ3ドットずつ小さいサイズ
      • ※スプライトの右から衝突する場合の処理において,なぜかスプライトの判定を1ドット右にずらす処理がある. 左からの衝突と右からの衝突の判定を同時に起こさないためと思われる
    • スプライトの判定サイズ:上下からぶつかる場合
      • npc.tblで指定したサイズよりも左右がそれぞれ3ドットずつ小さいサイズ

  • フラグ0x40の設定されたスプライトとの判定
    • よく分からない条件で分岐している("自機中央とスプライト中央を結ぶ線分の傾き"と"スプライト中央とスプライト右上角を結ぶ線分の傾き"を比較している)恐らくぶつかった角度で分岐させようとしている
    • 分岐A(横からの衝突)
      • npc.tblの通りの判定サイズ(ただし左側のサイズに右側のサイズの数値が使われる)
    • 分岐B(上下からの衝突)
      • npc.tblの通りの判定サイズ

スプライトとの衝突

  • 0x01フラグのスプライトとの衝突
    • 横からぶつかった場合
      • ぶつかった方向に256以上の速度がある場合,跳ね返る(反対方向への加速度512)
    • 下からぶつかった場合
      • 上向きのY速度がある場合Y速度を0にする
    • 上からぶつかった場合
      • スプライトに0x10のフラグがある場合
        • 自機のY速度をスプライトのY速度と同じにした上,上向きにに加速度512
      • スプライトに0x10のフラグがない場合
        • 自機の速度をスプライトの速度と同じにする
        • 自機の位置を判定サイズに基づき位置調整し,下へ1ドットめり込ませる

  • 0x40フラグのスプライトとの衝突
    • よく分からない条件で分岐している("自機中央とスプライト中央を結ぶ線分の傾き"と"スプライト中央とスプライト右上角を結ぶ線分の傾き"を比較している)恐らくぶつかった角度で分岐させようとしている
    • 分岐A(横からの衝突)
      • 判定サイズ通りに自機のX位置を調整
      • 衝突方向へ相対X速度がある場合,自機の速度をスプライトの速度と同じにする
    • 分岐B(上下からの衝突)
      • 上からぶつかった場合
        • 自機の位置を判定サイズに基づき位置調整し,下へ1ドットめり込ませる
        • 衝突方向へ相対Y速度がある場合0にする(スプライトと同じY速度にする)
        • 相対Y速度が1024を超えている場合着地の効果音を再生
        • スプライトにフラグ0x10がある場合
          • 自機のY速度をスプライトのY速度と同じにした上で上向きに加速度512
        • スプライトにフラグ0x10がない場合
          • 自機の速度をスプライトの速度と同じにする
        • 自機の位置を判定サイズに基づき位置調整し,下へ1ドットめり込ませる
      • 下からぶつかった場合
        • 自機の位置を判定サイズに基づき位置調整し,下へ1ドットずらす
        • 衝突方向へ相対Y速度がある場合0にする(スプライトと同じY速度にする)

水流

各方向へ一定の加速度
上向き->128
左右->136
下向き->85

マシンガン

上向きに撃つ->下向きに加速度256
下向きに撃つ->上向きに加速度512
  • 計算の結果速度が1024を超えた場合1024に揃える
  • 計算の前に1024を超えている場合加速を行わない
最終更新:2018年10月06日 03:58