天候システムに関して

Arigataさんが、天候システムについて何やら分析をして下さったようです。
情報系のくせに、統計学をほうり投げるというあるまじき学生だったので、分析とかWhat?状態。
研究も理論寄りなことをやっていたので、使わなかったしなぁ。
天候システムのようなものこそ、分析して検証すべきなんですけどね。


で、シナリオも半分終わったので、そろそろ仕様を書いてもいいかな〜と。
ところで、この天候システムを配布用インクルとして公開したら需要あるのかな……
天候の効果や天候の種類などなど、面倒なものがてんこ盛りですが。
 ・この辺りは、作者によって欲しい効果が異なるので自分で書く必要がある


"汎用的"なものを作る、という事を学ぶためにも少し考えてみよう。



以下、Bloody Tearsの天候仕様に関してチマチマと


【確定的な要素】
 ① 戦闘開始時の天候とターン数
 ② Next天候(ステージで設定している場合)
 ③ 予報確率の底上げ(ステージで設定している場合)


この2つは、作者が戦闘開始前に決定しています。
なので、確率もクソもありません。
②は、ステージによって設定or設定なしです。
戦闘開始時の予測確率が100%の場合が、これに該当します。
とはいえ、これを設定していないステージのほうが少なかったりします。
(現時点では、第二話だけ設定無し)
この次からは、確率的な変化になります。
したがって、Next天候までに流れを作っておかないと厳しい仕様になっています。


③は、難易度が高めだったり特殊な戦闘の時に設定されます。
(現時点では、第六話と第七話)
設定した値*10%が、天候変化時に決まった予報に加算される仕様です。
例えば、底上げ40%と設定した場合、予報が最低でも50%になるということです。
ただし底上げされる確率は2/3、100%じゃない辺りが酷い。
この2/3、消そうかな……とも思ってます、本来の意図から外れてる感が強いので。
……そして、見直してみると底上げ機能が十分に動いていなかった件。
自分で仕様を決めておきながら、仕様を間違えるとかドンダケー……
次の更新時に修正しておきます、ハイ。



【確率で左右される要素】
・予報天候とターン数
・予測確率(10%刻み)、最大値100%
・予報外天候とターン数、変化乱数
・2つ後の天候、ターン数、予測確率


一定ターン数が経過し、天候変化ターンとなった時に上記の要素が計算されます。
まず、1〜3で予報天候とターン数を決定。
予測確率を(1〜10)*10%で決定します。
画面上に表示されるデータは、これらの値です。
この時点では、次の天候は決まっていません。


次に、予報外天候、ターン数、変化乱数を決めます。
予報天候と異なる天気を50%の確率で決定、ターン数を1〜3で決定。
変化乱数は0〜99のランダム関数でセット。


天候が変わる時、最初に予報と変化乱数を比較します。
予報≧変化乱数ならば、予報天候とターン数を発現。
予報<変化乱数ならば、予報外天候とターン数を発現。
こういう仕組みになっています。


最後に、2つ後の天候(予報天候終了後の予報天候)を決定します。
最初の予報天候と同じ方法です。
Qセーブ&ロードを使っても天候が変化しないのは、ここで既に決定されている為です。
したがって、3つ後の天候はQセーブ&ロードで変化します。


言葉で説明となると、非常に解りづらいなぁ……
配列で表現すると、こんな感じです。


WeatherBox[0] = 晴 or 曇 or 雨
WeatherBox[1] = 1〜3
WeatherBox[2] = (1〜10)* 10 %
WeatherBox[3] = 晴 or 曇 or 雨 ※WeatherBox[0]とは異なるものを入れる
WeatherBox[4] = 1〜3
WeatherBox[5] = 0 〜99
WeatherBox[6] = 晴 or 曇 or 雨
WeatherBox[7] = 1〜3
WeatherBox[8] = (1〜10)* 10 %


天候変化ターンになると……
① WeatherBox[2]とWeatherBox[5]を比較
② WeatherBox[2]≧WeatherBox[5] なら、[0]〜[2]をフィールドに発現。
  WeatherBox[2]<WeatherBox[5] なら、[3]〜[4]をフィールドに発現。
③ [6]〜[8]の値を対応した[0]〜[2]に設定
④ 新しい[3]〜[5]と[6]〜[8]を設定


この①〜④を繰り返しているだけです。
内部ロジックは単純なのですが、これを表示(発現)するのが面倒。
時間の概念もあるし、補正値計算も入ってきます。
一度作りなおしてスッキリさせたいなぁ、というのが本音だったりします(汗)