serverlessで作った対戦サーバのテストをしていたら、特定キャラの能力を発動すると100%でエラーになる不具合に遭遇しました。苦労してログを調べてみると
"ValidationException: The parameter cannot be converted to a numeric value: Infinity",
というのが出ていました。メッセージを読んだだけでは原因が全く分かりませんでしたが、DynamoDBにJavaScriptのInfinityをセットしようとしたことが原因のようです。自作ゲームのGブレイバーバーストでは大半の効果に持続ターンが設定されているのですが、永続効果は持続ターン数をInfinityに設定していました。JavaScriptには標準でInfinityという無限大を表現できるオブジェクトが用意されています。これが結構便利で、
const a = Infinity
const b = a - 1;
b;       // Infinity
0 < b; // true
みたいなこと出来ます。ターン経過で効果が消えるコードでも、変数にInfinityさえセットすればコード変更無しで永続効果が実装できます。ただ、DynamoDBのドキュメントを確認すると、Infinityはサポートされていないようです。




Gブレイバーバーストでは簡易的なドメイン駆動設計を取り入れており、ドメイン層でInfinityで永続効果を表現しています。ここでとるべき戦略は(1)外部リソースにInfinityをダンプ、リストアできるようにする、(2)永続効果にInfinityを使わないようにする、の2つです。個人的に永続効果、ターン制限効果が全く同じ形をしていることに違和感を感じました。また、実装当時にInfinityで永続効果を表現したのは、コーディングで楽をするためでした。つまりは技術的負債ですね。という訳で、(2)の方法で修正することにしました。↓が(2)の修正のプルリクエストです。修正範囲が大きくて大変でしたが、修正内容自体はシンプルですね。 

 


最後になりますが、Gブレイバーバーストは↓のリンクから遊ぶことができます。ネット対戦機能実装までは、もう少しお待ちください。