コミットのこと

Desigeonには、キャラクタに「コミット」というデータ反映機能を作ってあって、随時呼び出しています。

「コミット」は、キャラクタに何か変化をもたらす際に、まとめてデータ更新するための機能です。戦闘や罠で1ポイントのダメージを受けたら、HPから1を減らす処理が必要になりますが、それをこの「コミット」がやっているわけです。

「コミット」というのはコンピュータのデータベース用語です。目的も似ています。(理屈の上では「ロールバック」もできるようになっていますが、オンラインゲームではないので実装していません)


コミットは、何かパラメータ変化が起きるたびに呼び出しているので、かなり頻繁に使われています。

どういうときに使われるかというと、コマンドを実行して、対象に何かアクションを発生させたときには影響者ぶんを適用します。戦闘ターンの終わりと、迷路で一歩歩いたときには全員分を適用します。酒場や迷路で待機中のキャラクタの分も適用します。

コミットでは、以下の処理をすべてやっています。機能更新の蓄積があるとはいえ、こうしてみると結構ヘビーですね。たった1ポイントのダメージを適用するだけでも、かなりたくさんの仕事が動いていることになります。

  1. 経験値が増えるなら経験値を増やす
  2. レベルドレインが発生しているならレベルドレインを施す
  3. ステート削除が要求されていたらステートを削除
  4. ステート付与が要求されていたらステートを付与
  5. アイテムが壊れたならアイテムを削除
  6. 全能力値の変化を調べる
    1. 成長値が増減するなら成長値を増減させる
    2. 適正値が設定されていたら適正値に合わせる
    3. 現在値が増減するなら現在値を増減させる
    4. 戦闘中の一時増減値が増減するなら一時増減値を増減させる
  7. コマンドレベルの増減が発生していたらコマンドレベルを増減。習得および忘却
  8. コマンドが実行されたら、コマンドの威力の統計をとる
  9. コマンドが実行されたら、コマンドの命中の統計をとる
  10. 装備部位の有効性を判定し、装備できない装備アイテムを外す
  11. 能力値の現在値が範囲外になっていたら、範囲内に丸める
  12. 習得条件を満たしたコマンドを習得

たった一発のコマンドでも、どんな影響が出ているかはコミット処理がすべて調べます。能力値やステートが増えると、処理が重くなるのはコミット処理の影響が大きいです。

ゲームプレイヤーがシンプルに「ダメージ10だけのコマンド」と認識していても、その背後でコマンド習得やステート付与やアイテム破損などが起こっているかもしれませんから、それらをすべて調べる必要があります。

この辺、深く考えずに攻撃コマンドのプログラムで、「HP=HP−攻撃ダメージ」といったコードを書いてしまうと、ちょっと新しい機能を追加しようとしたときに、大変な労を求められることになったり。

たった一つの行動から連動する要素を考え始めると、ゲームって本当に複雑だなと思います。