こんにちは!音楽ゲーム『CoLane』開発者のハヤブサと言います!
『CoLane』の裏話について、第五弾です!
前回ゲームの裏話を話したんですが...
あの程度で全部書ききったとでも思いましたか?
とはいえ、後から思い出しただけなんですが。
ということでこの記事では『CoLane』のゲーム自体の裏話第二回です!
前回書いてなかったことについて書こうと思います!
よろしくお願いします!
『CoLane』は、背景のスポットライトの色に応じてレーンが切り替わる、PC向け音楽ゲームです。
一つのレーンに対応するキーが複数になることもあり、ノーツの取り方(運指)が多様に存在するのが特徴となっています。
さらに練習モードが実装されており、様々な運指を試してみることができます。
以上! 詳しくは以下をご覧ください!

実はこのゲーム、スコアとライフの計算式がめっちゃ独特です。
普通の音ゲーだとどうですかね?大体一ノーツにつき固定値の増減だと思うんです。
まあパーセントで表記する音ゲーも見たことはありますが。
ただ『CoLane』はそんなんじゃありません。完全に独自の計算式を使用しています。
まずスコアについて。 計算式をまず出しましょう。(読み飛ばしてもらっても構いません)
分かるわけないですね!順に説明します。
まず譜面の総ノーツ数を補正をかけながら計算します。
タップするノーツ数+ホールドするノーツ数ですね。
この時、ホールドするノーツ数に補正をかけるための定数を掛け算します。
次にそれを0.25乗します。要するにルート、4乗根の計算ですね。
それにより、総ノーツと総スコアの関係が単純な比例関係ではなくなります。
正確にいうなら、総ノーツが増えれば増えるほど総スコアも増えるが、総ノーツ増えるほど総スコアが増えづらくなるような状態です。
次にそれに一千万を掛けます。
これはただスコアの数値をそれっぽくするためだけの計算です。
次にそれの上位二桁以外を全て切り捨てます。
それにより、理論値を取ったときにきれいな数値になるように調整しています。
ちなみにこの時点での数値が総スコアの数値になります。
次にそれを総ノーツ数で割ります。
こっちもホールドノーツは補正を掛けます。
これで1ノーツごとの最高スコアを計算できます。
最後に、各ノーツの判定に合わせて補正を掛けながら足し合わせてスコアを導き出します。
この時、ホールドノーツは補正を掛けます。
うん。めっちゃややこしいですね。
なんでこんなことになったかというと...
総ノーツが増えれば総スコアも増えるようにしたくて、そのうえでそこまで差が広がり過ぎないようにしたかったんです。
なので、このような計算式になっています。
こちらの方が簡単ですね。
一旦計算式をば...(同じく読み飛ばしても構いません)
やっぱややこしいですね。ただこれは簡単に説明できます。
どういうことかというと、一定の割合ミスするとライフが無くなる仕様になっています。
実際何パーセントかは忘れましたが、例えば全体の50%ミスるとライフが無くなるとか。
それをちゃんと計算すると上の計算式になると思います。
あとは、Fast・Lateの時も減らします。
ただその時はMissほど減らさず、多分Missの半分ぐらい?減らしてたと思います。
次に判定するノーツの優先度の話です。
このゲーム、同じレーンに大量にノーツが流れてきます。
なので判定ラインに一番近いノーツを優先して取る仕様だと、少しずれるとミスが多発します。
その対策として、このゲームでは同じ判定ならば一番下にあるノーツを優先して処理するという仕組みが搭載されています。
直感的では無いですが、そうでもしないと自分でもまともにプレイできなかったので...
最後にタイトル画面の小ネタです。
実はタイトル画面、めっちゃこだわって作ってます。
背景のライトの色の変わり方の話です。
タイトル画面に使用している音楽、4分弱あるんですが...
4分間、全て色の変わり方を指定しました。
中途半端に楽曲の途中でループしたりはしません。楽曲がループするまでは背景もループしません。
なんでそんなこだわったかって?ノリです。深い理由はないです。
楽曲の途中でちゃんとしたグラデーションになったり、このゲーム特有の並びに戻ったり...
楽曲の雰囲気に合わせて光るライトの数が変わったり、色々考えて作りました。
ここまで見てくださり、ありがとうございます!
この話は「『CoLane』裏話」とは別で、粗方書き終わった後に追加の裏話を思い出し、書いた話となります。
時系列的には裏話#4公開直前ぐらいに書いてます。
多分裏話は粗方話しきったので、もしかしたら『CoLane』裏話シリーズは終わりかも...?
正式版公開もそろそろですしね。
ということで最後に裏話シリーズをまとめておきます!
見てないものがありましたら、ぜひ見てみてください~!
「アイデアの原点」「開発時に発生した問題」「譜面作りの話」「ゲーム自体の裏話」「ゲーム自体の裏話2(この記事)」
以上です!
α(総スコア) = f(g(10000000×((x+g(y×a))^0.25))) f関数は上位二桁以外を全て0にする操作 g関数は小数点以下を切り捨てる操作 xはタップするノーツ数 yはホールドするノーツ数 aは補正用の定数 現在は0.1
β = α÷(x+(y×a))
スコア = Σ[k=1→x+(y×a)]β×h(k)×i(k) hは入力された番号のノーツの判定(Perfect、Greatなど)における補正値を返す関数 iは入力された番号のノーツがタップノーツの場合は1を、ホールドノーツの場合はaを返す関数α = 1÷x xは総ノーツ数
ライフ = g(1000-(Σ[k=1→x]f(k)×α)) fは入力された番号のノーツの判定に合わせて対応する数値を返す関数 gは入力された数値が0以下だった場合に0を、それ以外の場合は入力された数値をそのまま返す関数フォローすると、開発ログや新作ゲームの公開が通知されます