ドラゴンクエストXを支える失敗事例
株式会社スクウェア・エニックス
青山 公士
ドラゴンクエストXを支える失敗事例 © 2019 SQUARE ENIX CO., LTD. All Rights Reserved.
ドラゴンクエストXを支える失敗事例 © 2019 SQUARE ENIX CO., LTD. All Rights Reserved.
目次
自己紹介
本セッションについて
ドラゴンクエストXとは
開発ポリシー
失敗事例(3つ)
まとめ
ドラゴンクエストXを支える失敗事例 © 2019 SQUARE ENIX CO., LTD. All Rights Reserved.
目次
自己紹介
本セッションについて
ドラゴンクエストXとは
開発ポリシー
失敗事例(3つ)
まとめ
株式会社スクウェア・エニックス
第6ビジネス・ディビジョン
アオ ヤマ コウ ジ
青山 公士
ドラゴンクエストXを支える失敗事例 © 2019 SQUARE ENIX CO., LTD. All Rights Reserved.
自己紹介
テン
「ドラゴンクエストXを支える技術
-大規模オンラインRPGの舞台裏」
著者
ドラゴンクエストXを支える失敗事例 © 2019 SQUARE ENIX CO., LTD. All Rights Reserved.
自己紹介
テン
「ドラゴンクエストXを支える技術
-大規模オンラインRPGの舞台裏」
著者
ドラゴンクエストXを支える失敗事例 © 2019 SQUARE ENIX CO., LTD. All Rights Reserved.
自己紹介
今回はこの流れで
お声がけいただきました
テン
「ドラゴンクエストX オンライン」
プロデューサー
責任者
ドラゴンクエストXを支える失敗事例 © 2019 SQUARE ENIX CO., LTD. All Rights Reserved.
自己紹介
テン
「ドラゴンクエストX オンライン」
プロデューサー
責任者
ドラゴンクエストXを支える失敗事例 © 2019 SQUARE ENIX CO., LTD. All Rights Reserved.
自己紹介
こっちが本業
ドラゴンクエストXを支える失敗事例 © 2019 SQUARE ENIX CO., LTD. All Rights Reserved.
自己紹介
遡ると…
「ドラゴンクエストX」テクニカルディレクター
「PlayOnline」ディレクター、プログラマー
(他ゲーム会社)ディレクター、メインプログラマー
一つ前の本業
ドラゴンクエストXを支える失敗事例 © 2019 SQUARE ENIX CO., LTD. All Rights Reserved.
目次
自己紹介
本セッションについて
ドラゴンクエストXとは
開発ポリシー
失敗事例(3つ)
まとめ
本題に入る前に
本セッションを活かして欲しい部分
についてご説明します
ドラゴンクエストXを支える失敗事例 © 2019 SQUARE ENIX CO., LTD. All Rights Reserved.
本セッションについて
「ドラゴンクエストX オンライン」は
オンラインゲームです
(後ほどもう少し詳細に解説します)
ドラゴンクエストXを支える失敗事例 © 2019 SQUARE ENIX CO., LTD. All Rights Reserved.
本セッションについて
オンラインゲーム
ドラゴンクエストXを支える失敗事例 © 2019 SQUARE ENIX CO., LTD. All Rights Reserved.
本セッションについて
オンラインサービス
オンラインサービスは
リリース後の運営・運用が本番!
と言っても過言ではありません
ドラゴンクエストXを支える失敗事例 © 2019 SQUARE ENIX CO., LTD. All Rights Reserved.
本セッションについて
開発・検証 運営・運用
ドラゴンクエストXを支える失敗事例 © 2019 SQUARE ENIX CO., LTD. All Rights Reserved.
本セッションについて
リリース
フィードバック
開発・検証 運営・運用
ドラゴンクエストXを支える失敗事例 © 2019 SQUARE ENIX CO., LTD. All Rights Reserved.
本セッションについて
リリース
フィードバック
リリースは
完了ではなく
開発・検証 運営・運用
ドラゴンクエストXを支える失敗事例 © 2019 SQUARE ENIX CO., LTD. All Rights Reserved.
本セッションについて
リリース
フィードバック
お客さま対応の
始まりです
開発・検証 運営・運用
ドラゴンクエストXを支える失敗事例 © 2019 SQUARE ENIX CO., LTD. All Rights Reserved.
本セッションについて
リリース
フィードバック
その際
良い設計&実装なら
対応しやすいです
良い設計&実装
・要望への対応が柔軟
・不具合が出づらい
・不具合が出ても修正しやすい
(仕様が実現できる前提でのプラスアルファ)
ドラゴンクエストXを支える失敗事例 © 2019 SQUARE ENIX CO., LTD. All Rights Reserved.
本セッションについて
開発・検証 運営・運用
ドラゴンクエストXを支える失敗事例 © 2019 SQUARE ENIX CO., LTD. All Rights Reserved.
本セッションについて
リリース
フィードバック
そのために重要になるのが
運営・運用経験です
こういう改修要望が来た!
→柔軟な対応を可能に
こういう不具合が出た!
→同様の不具合が出ないように
or 早期発見&修正できるように
ドラゴンクエストXを支える失敗事例 © 2019 SQUARE ENIX CO., LTD. All Rights Reserved.
本セッションについて
ドラゴンクエストXでは
これまで多くの事例に対応し
その経験に支えられて
開発・運営をしています
ドラゴンクエストXを支える失敗事例 © 2019 SQUARE ENIX CO., LTD. All Rights Reserved.
本セッションについて
多くの事例を経験している人が
開発することが望ましいですが
ドラゴンクエストXを支える失敗事例 © 2019 SQUARE ENIX CO., LTD. All Rights Reserved.
本セッションについて
現実的には難しいので
他者の事例を共有する
ことも重要と考えます
ドラゴンクエストXを支える失敗事例 © 2019 SQUARE ENIX CO., LTD. All Rights Reserved.
本セッションについて
開発・検証 運営・運用
ドラゴンクエストXを支える失敗事例 © 2019 SQUARE ENIX CO., LTD. All Rights Reserved.
本セッションについて
リリース
フィードバック
本セッションでは
運営・運用中に発生した
失敗事例を中心に
ご紹介しますので
皆さんの経験値の一部に
なれば幸いです
ドラゴンクエストXを支える失敗事例 © 2019 SQUARE ENIX CO., LTD. All Rights Reserved.
本セッションについて
ドラゴンクエストXを支える失敗事例 © 2019 SQUARE ENIX CO., LTD. All Rights Reserved.
目次
自己紹介
本セッションについて
ドラゴンクエストXとは
開発ポリシー
失敗事例(3つ)
まとめ
ドラゴンクエストXを支える失敗事例 © 2019 SQUARE ENIX CO., LTD. All Rights Reserved.
ドラゴンクエストXとは
「ドラゴンクエストX オンライン」は
オンラインゲームです
現時点で約6年半運営しています
ドラゴンクエストXを支える失敗事例 © 2019 SQUARE ENIX CO., LTD. All Rights Reserved.
ドラゴンクエストXとは
より専門的には MMORPG に分類されます
ドラゴンクエストXを支える失敗事例 © 2019 SQUARE ENIX CO., LTD. All Rights Reserved.
ドラゴンクエストXとは
より専門的には MMORPG に分類されます
ロール プレイング ゲーム
Role Playing Game
というゲームジャンル
ドラゴンクエストXを支える失敗事例 © 2019 SQUARE ENIX CO., LTD. All Rights Reserved.
ドラゴンクエストXとは
より専門的には MMORPG に分類されます
大規模多人数参加型オンラインゲーム
Massively Multiplayer Online Game
ドラゴンクエストXを支える失敗事例 © 2019 SQUARE ENIX CO., LTD. All Rights Reserved.
ドラゴンクエストXとは
MMO
MO
(参考)
ゲームサーバ
ゲームクライアント
ゲームクライアントゲームクライアント
ゲームクライアント
ゲームクライアント
ゲームクライアントゲームクライアントゲームクライアント
ゲームクライアント
ゲームクライアントゲームクライアントゲームクライアント
(ホスト)
ドラゴンクエストXを支える失敗事例 © 2019 SQUARE ENIX CO., LTD. All Rights Reserved.
ドラゴンクエストXとは
ゲームサーバ
ゲームクライアント
ゲームクライアントゲームクライアントゲームクライアント
ゲームクライアント
ゲームクライアントゲームクライアントゲームクライアント
ゲームDB
見た目上の本体
真の本体
世界のデータ
本節では当セッションに関連する
MMORPGのアーキテクチャのみ
紹介しました
ドラゴンクエストXの特徴は
著書を参考にしてください
ドラゴンクエストXを支える失敗事例 © 2019 SQUARE ENIX CO., LTD. All Rights Reserved.
ドラゴンクエストXとは
ドラゴンクエストXを支える失敗事例 © 2019 SQUARE ENIX CO., LTD. All Rights Reserved.
目次
自己紹介
本セッションについて
ドラゴンクエストXとは
開発ポリシー
失敗事例(4つ)
まとめ
ドラゴンクエストXを支える失敗事例 © 2019 SQUARE ENIX CO., LTD. All Rights Reserved.
ドラゴンクエストXでは開発初期から
運営・運用が重要という想定があります
開発ポリシー
ドラゴンクエストXを支える失敗事例 © 2019 SQUARE ENIX CO., LTD. All Rights Reserved.
運営
運用
開発ポリシー
本セッションにおける
運営と運用は
ドラゴンクエストXを支える失敗事例 © 2019 SQUARE ENIX CO., LTD. All Rights Reserved.
運営=仕掛け(攻め)
※機能拡張・期間限定イベント等
運用=保守(守り)
※不具合修正・障害対応など等
開発ポリシー
ドラゴンクエストXを支える失敗事例 © 2019 SQUARE ENIX CO., LTD. All Rights Reserved.
運営=仕掛け(攻め)
※機能拡張・期間限定イベント等
→柔軟性が重要
運用=保守(守り)
※不具合修正・障害対応など等
→継続性が重要
開発ポリシー
ドラゴンクエストXを支える失敗事例 © 2019 SQUARE ENIX CO., LTD. All Rights Reserved.
開発ポリシー例
「一箇所に集約すべし」
(例)配列ループ
char buf[256];
for ( int i = 0; i < 256 ; i++ ) …
開発ポリシー
同じ意味はdefineして使う
ドラゴンクエストXを支える失敗事例 © 2019 SQUARE ENIX CO., LTD. All Rights Reserved.
目次
自己紹介
本セッションについて
ドラゴンクエストXとは
開発ポリシー
失敗事例(3つ)
まとめ
ドラゴンクエストXを支える失敗事例 © 2019 SQUARE ENIX CO., LTD. All Rights Reserved.
これから失敗事例を3つ共有します
失敗事例
ドラゴンクエストXを支える失敗事例 © 2019 SQUARE ENIX CO., LTD. All Rights Reserved.
失敗事例
実際の告知内容
不具合の内容
原因と対応
得られた教訓
ドラゴンクエストXを支える失敗事例 © 2019 SQUARE ENIX CO., LTD. All Rights Reserved.
失敗事例その1
失敗事例(1/3)
ドラゴンクエストXを支える失敗事例 © 2019 SQUARE ENIX CO., LTD. All Rights Reserved.
不具合告知内容
「キラージャグリング」「ゴッドジャグリン
グ」の効果音が鳴り続いたり、ノイズが発生
することがある。
失敗事例(1/3)
ドラゴンクエストXを支える失敗事例 © 2019 SQUARE ENIX CO., LTD. All Rights Reserved.
「キラージャグリング」
「ゴッドジャグリング」
は戦闘中の攻撃スキルで
複数回ダメージを与えます
失敗事例(1/3)
ドラゴンクエストXを支える失敗事例 © 2019 SQUARE ENIX CO., LTD. All Rights Reserved.
ある更新から突然
演出完了後も時々
効果音が止まらずに
鳴り続けるようになった
不具合です
失敗事例(1/3)
ドラゴンクエストXを支える失敗事例 © 2019 SQUARE ENIX CO., LTD. All Rights Reserved.
不具合の技術的な背景
失敗事例(1/3)
ドラゴンクエストXを支える失敗事例 © 2019 SQUARE ENIX CO., LTD. All Rights Reserved.
ゲームサーバ
ゲームクライアント
ゲームクライアントゲームクライアントゲームクライアント
ゲームクライアント
ゲームクライアントゲームクライアントゲームクライアント
ゲームDB
見た目上の本体
真の本体
世界のデータ
失敗事例(1/3)
ドラゴンクエストXを支える失敗事例 © 2019 SQUARE ENIX CO., LTD. All Rights Reserved.
失敗事例(1/3)
エフェクト
ドラゴンクエストXを支える失敗事例 © 2019 SQUARE ENIX CO., LTD. All Rights Reserved.
エフェクトは
視覚効果を演出します
失敗事例(1/3)
ドラゴンクエストXを支える失敗事例 © 2019 SQUARE ENIX CO., LTD. All Rights Reserved.
ドラゴンクエストXでは
表示形状、速度、加速度等
各種パラメータが設定された
データに基づいて動きます
失敗事例(1/3)
ドラゴンクエストXを支える失敗事例 © 2019 SQUARE ENIX CO., LTD. All Rights Reserved.
効果音の発音も
エフェクトデータで
制御できます
失敗事例(1/3)
ドラゴンクエストXを支える失敗事例 © 2019 SQUARE ENIX CO., LTD. All Rights Reserved.
戦闘スキルの効果音設定
失敗事例(1/3)
アクション音
発音
ヒット音
発音
(剣を振る音) (敵に当たる音)
デザイナー作成のデータで指定された
タイミングでC++処理が実施されます
ドラゴンクエストXを支える失敗事例 © 2019 SQUARE ENIX CO., LTD. All Rights Reserved.
不具合が発生したエフェクトの効果音設定
失敗事例(1/3)
アクション音
発音
効果音
停止
ヒット音
発音
(アクション音が継続型のため停止が必要)
ドラゴンクエストXを支える失敗事例 © 2019 SQUARE ENIX CO., LTD. All Rights Reserved.
不具合の直接的な原因
失敗事例(1/3)
ドラゴンクエストXを支える失敗事例 © 2019 SQUARE ENIX CO., LTD. All Rights Reserved.
不具合告知内容(再掲)
「キラージャグリング」「ゴッドジャグリン
グ」の効果音が鳴り続いたり、ノイズが発生
することがある。
失敗事例(1/3)
ドラゴンクエストXを支える失敗事例 © 2019 SQUARE ENIX CO., LTD. All Rights Reserved.
失敗事例(1/3)
アクション音
発音
効果音
停止
ヒット音
発音
効果音
停止
ミス音
発音
(実際にはこの形でした)
ドラゴンクエストXを支える失敗事例 © 2019 SQUARE ENIX CO., LTD. All Rights Reserved.
失敗事例(1/3)
アクション音
発音
効果音
停止
ヒット音
発音
効果音
停止
ミス音
発音
(データの変更はありませんでしたが ※あるある)
ドラゴンクエストXを支える失敗事例 © 2019 SQUARE ENIX CO., LTD. All Rights Reserved.
失敗事例(1/3)
アクション音
発音
効果音
停止
ヒット音
発音
効果音
停止
ミス音
発音
ミス時の効果音停止が
C++プログラムで無効化
されていました
ドラゴンクエストXを支える失敗事例 © 2019 SQUARE ENIX CO., LTD. All Rights Reserved.
なぜ?
失敗事例(1/3)
ドラゴンクエストXを支える失敗事例 © 2019 SQUARE ENIX CO., LTD. All Rights Reserved.
問題の更新より前の
内部検証で発覚した
ある別の戦闘スキルの
不具合修正によるエンバグ
でした
失敗事例(1/3)
ドラゴンクエストXを支える失敗事例 © 2019 SQUARE ENIX CO., LTD. All Rights Reserved.
失敗事例(1/3)
アクション音
発音
効果音
停止
ヒット音
発音
効果音
停止
ミス音
発音
別の戦闘スキルのエフェクトの効果音設定
ドラゴンクエストXを支える失敗事例 © 2019 SQUARE ENIX CO., LTD. All Rights Reserved.
失敗事例(1/3)
アクション音
発音
効果音
停止
ヒット音
発音
効果音
停止
ミス音
発音
別の戦闘スキルのエフェクトの効果音設定
ミス時に効果音を停止すると
不具合になることが
内部検証で発覚し
ドラゴンクエストXを支える失敗事例 © 2019 SQUARE ENIX CO., LTD. All Rights Reserved.
開発ポリシーを鑑みて
• 他にも同様の問題があるかも知れないから
システムで対応しよう!
• 意味的にもミス時は効果音を止めないべき
じゃね?
という判断になり
失敗事例(1/3)
ドラゴンクエストXを支える失敗事例 © 2019 SQUARE ENIX CO., LTD. All Rights Reserved.
「ミス時の効果音停止をC++で無効化」
したのが今回の不具合の原因です
失敗事例(1/3)
ドラゴンクエストXを支える失敗事例 © 2019 SQUARE ENIX CO., LTD. All Rights Reserved.
発覚後の対応
失敗事例(1/3)
ドラゴンクエストXを支える失敗事例 © 2019 SQUARE ENIX CO., LTD. All Rights Reserved.
失敗事例(1/3)
アクション音
発音
効果音
停止
ヒット音
発音
効果音
停止
ミス音
発音
内部検証で不具合が指摘されたエフェクトデータ
ドラゴンクエストXを支える失敗事例 © 2019 SQUARE ENIX CO., LTD. All Rights Reserved.
失敗事例(1/3)
アクション音
発音
効果音
停止
ヒット音
発音
効果音
停止
ミス音
発音
内部検証で不具合が指摘されたエフェクトデータ
専用処理に変更しました
ドラゴンクエストXを支える失敗事例 © 2019 SQUARE ENIX CO., LTD. All Rights Reserved.
• 他にも同様の問題があるかも知れないから
システムで対応しよう! → 個別対応へ
• 意味的にもミス時は効果音を止めないべき
じゃね? → 間違い
失敗事例(1/3)
ドラゴンクエストXを支える失敗事例 © 2019 SQUARE ENIX CO., LTD. All Rights Reserved.
得られた教訓
失敗事例(1/3)
ドラゴンクエストXを支える失敗事例 © 2019 SQUARE ENIX CO., LTD. All Rights Reserved.
• システム改修はBTSチケットに影響範囲を
明記し全影響範囲を再検証すべし
• 影響範囲は極力狭くすべし
失敗事例(1/3)
教訓
ドラゴンクエストXを支える失敗事例 © 2019 SQUARE ENIX CO., LTD. All Rights Reserved.
失敗事例その2
失敗事例(2/3)
ドラゴンクエストXを支える失敗事例 © 2019 SQUARE ENIX CO., LTD. All Rights Reserved.
不具合告知内容
6月10日(土)6:00の更新以降「邪神の宮殿」
にて、『同盟の仲間を自動で探す』を選択し
ても、パーティが組まれない場合がある。
失敗事例(2/3)
ドラゴンクエストXを支える失敗事例 © 2019 SQUARE ENIX CO., LTD. All Rights Reserved.
「邪神の宮殿」は
8人が協力して
強い敵と戦う
コンテンツです
失敗事例(2/3)
ドラゴンクエストXを支える失敗事例 © 2019 SQUARE ENIX CO., LTD. All Rights Reserved.
『同盟の仲間を自動で探す』
というオートマッチング機能
があり
失敗事例(2/3)
ドラゴンクエストXを支える失敗事例 © 2019 SQUARE ENIX CO., LTD. All Rights Reserved.
参加希望者8人で
自動的に同盟を組みます
失敗事例(2/3)
ドラゴンクエストXを支える失敗事例 © 2019 SQUARE ENIX CO., LTD. All Rights Reserved.
参加希望者が多数いても
同盟が成立しない
というのが本不具合です。
失敗事例(2/3)
ドラゴンクエストXを支える失敗事例 © 2019 SQUARE ENIX CO., LTD. All Rights Reserved.
不具合の技術的な背景
失敗事例(2/3)
ドラゴンクエストXを支える失敗事例 © 2019 SQUARE ENIX CO., LTD. All Rights Reserved.
邪神の宮殿の
戦闘エリアは
複数あり
失敗事例(2/3)
ドラゴンクエストXを支える失敗事例 © 2019 SQUARE ENIX CO., LTD. All Rights Reserved.
失敗事例(2/3)
例えば「封剣の門・三獄」には
ドラゴンクエストXを支える失敗事例 © 2019 SQUARE ENIX CO., LTD. All Rights Reserved.
このような参加条件が
設定されています。
失敗事例(2/3)
ドラゴンクエストXを支える失敗事例 © 2019 SQUARE ENIX CO., LTD. All Rights Reserved.
失敗事例(2/3)
ドラゴンクエストXの世界には
「戦士」「魔法使い」など複数の
職業があり転職が可能です
ドラゴンクエストXを支える失敗事例 © 2019 SQUARE ENIX CO., LTD. All Rights Reserved.
失敗事例(2/3)
今回は「占い師」に転職して
挑戦することを意味します
ドラゴンクエストXを支える失敗事例 © 2019 SQUARE ENIX CO., LTD. All Rights Reserved.
不具合告知内容(再掲)
6月10日(土)6:00の更新以降「邪神の宮殿」
にて、『同盟の仲間を自動で探す』を選択し
ても、パーティが組まれない場合がある。
失敗事例(2/3)
毎月10日と25日の朝6時(JST)に
条件が自動更新されます
ドラゴンクエストXを支える失敗事例 © 2019 SQUARE ENIX CO., LTD. All Rights Reserved.
不具合告知内容(再掲)
6月10日(土)6:00の更新以降「邪神の宮殿」
にて、『同盟の仲間を自動で探す』を選択し
ても、パーティが組まれない場合がある。
失敗事例(2/3)
この日の更新から条件不成立になりました
ドラゴンクエストXを支える失敗事例 © 2019 SQUARE ENIX CO., LTD. All Rights Reserved.
不具合の直接的な原因
失敗事例(2/3)
ドラゴンクエストXを支える失敗事例 © 2019 SQUARE ENIX CO., LTD. All Rights Reserved.
• 条件はプランナー作成のデータで設定されて
います
• 問題になりそうなデータはありませんでした
失敗事例(2/3)
ドラゴンクエストXを支える失敗事例 © 2019 SQUARE ENIX CO., LTD. All Rights Reserved.
失敗事例(2/3)
しかしゲームサーバにこんなソースがっ!
if ( 6月10日更新分 && 封剣の門・三獄 ) {
条件べた書き※データと異なる
}
ドラゴンクエストXを支える失敗事例 © 2019 SQUARE ENIX CO., LTD. All Rights Reserved.
ゲームサーバ
ゲームクライアント
ゲームクライアントゲームクライアントゲームクライアント
ゲームクライアント
ゲームクライアントゲームクライアントゲームクライアント
ゲームDB
一次チェック
(操作性向上)
最終チェック
(チート対策)
失敗事例(2/3)
ドラゴンクエストXを支える失敗事例 © 2019 SQUARE ENIX CO., LTD. All Rights Reserved.
ゲームサーバ
ゲームクライアント
ゲームクライアントゲームクライアントゲームクライアント
ゲームクライアント
ゲームクライアントゲームクライアントゲームクライアント
ゲームDB
データで設定
された条件
プログラムで設定
された条件
失敗事例(2/3)
ドラゴンクエストXを支える失敗事例 © 2019 SQUARE ENIX CO., LTD. All Rights Reserved.
ゲームサーバ
ゲームクライアント
ゲームクライアントゲームクライアントゲームクライアント
ゲームクライアント
ゲームクライアントゲームクライアントゲームクライアント
ゲームDB
データで設定
された条件
プログラムで設定
された条件
失敗事例(2/3)
全部不成立!
ドラゴンクエストXを支える失敗事例 © 2019 SQUARE ENIX CO., LTD. All Rights Reserved.
不具合告知内容(再掲)
6月10日(土)6:00の更新以降「邪神の宮殿」
にて、『同盟の仲間を自動で探す』を選択し
ても、パーティが組まれない場合がある。
失敗事例(2/3)
獄による
ドラゴンクエストXを支える失敗事例 © 2019 SQUARE ENIX CO., LTD. All Rights Reserved.
なぜこのソースが?
失敗事例(2/3)
ドラゴンクエストXを支える失敗事例 © 2019 SQUARE ENIX CO., LTD. All Rights Reserved.
遡ることちょうど1年…
失敗事例(2/3)
ドラゴンクエストXを支える失敗事例 © 2019 SQUARE ENIX CO., LTD. All Rights Reserved.
邪神の宮殿
マッチング条件
データフォーマット
ver. X
邪神の宮殿
マッチング条件
データフォーマット
ver. Y
データフォーマットを変更しました
失敗事例(2/3)
ドラゴンクエストXを支える失敗事例 © 2019 SQUARE ENIX CO., LTD. All Rights Reserved.
邪神の宮殿
マッチング条件
データフォーマット
ver. X
邪神の宮殿
マッチング条件
データフォーマット
ver. Y
運用中のオンラインサービスでは
シームレスな移行が重要ですが
失敗事例(2/3)
ドラゴンクエストXを支える失敗事例 © 2019 SQUARE ENIX CO., LTD. All Rights Reserved.
邪神の宮殿
マッチング条件
データフォーマット
ver. X
邪神の宮殿
マッチング条件
データフォーマット
ver. Y
移行のリリースタイミングが微妙なため
および全体への影響を避けるため
失敗事例(2/3)
ドラゴンクエストXを支える失敗事例 © 2019 SQUARE ENIX CO., LTD. All Rights Reserved.
邪神の宮殿
マッチング条件
データフォーマット
ver. X
邪神の宮殿
マッチング条件
データフォーマット
ver. Y
(1年前の)6月分の条件は暫定的に
ソースにべた書きすることにしました
失敗事例(2/3)
ドラゴンクエストXを支える失敗事例 © 2019 SQUARE ENIX CO., LTD. All Rights Reserved.
その暫定べた書きソースを消し忘れて
1年後に不具合発生というオチでした
失敗事例(2/3)
ドラゴンクエストXを支える失敗事例 © 2019 SQUARE ENIX CO., LTD. All Rights Reserved.
得られた教訓
失敗事例(2/3)
ドラゴンクエストXを支える失敗事例 © 2019 SQUARE ENIX CO., LTD. All Rights Reserved.
• 暫定対応は本対応完了までを
BTSチケットで管理すべし
失敗事例(2/3)
教訓
ドラゴンクエストXを支える失敗事例 © 2019 SQUARE ENIX CO., LTD. All Rights Reserved.
失敗事例その3
失敗事例(3/3)
ドラゴンクエストXを支える失敗事例 © 2019 SQUARE ENIX CO., LTD. All Rights Reserved.
不具合告知内容
釣りにて、「オウムガイ」のビッグサイズや
キングサイズを釣ったのに、釣り老師や魚交
換員から、ビッグサイズはノーマルサイズ、
キングサイズはビッグサイズとして扱われる
ことがある。
失敗事例(3/3)
ドラゴンクエストXを支える失敗事例 © 2019 SQUARE ENIX CO., LTD. All Rights Reserved.
ドラゴンクエストXでは
釣りができます
失敗事例(3/3)
ドラゴンクエストXを支える失敗事例 © 2019 SQUARE ENIX CO., LTD. All Rights Reserved.
魚には個々に大きさ(cm)があり
それに応じてサイズが
キング/ビッグ/ノーマル
に分類されます
失敗事例(3/3)
ドラゴンクエストXを支える失敗事例 © 2019 SQUARE ENIX CO., LTD. All Rights Reserved.
「オウムガイ」も釣れます
※釣れる魚(?)は現時点で123種類
失敗事例(3/3)
ドラゴンクエストXを支える失敗事例 © 2019 SQUARE ENIX CO., LTD. All Rights Reserved.
魚に分類されないものも釣れますが
本セッションでは便宜上
釣れるものを「魚」と呼びます
失敗事例(3/3)
ドラゴンクエストXを支える失敗事例 © 2019 SQUARE ENIX CO., LTD. All Rights Reserved.
失敗事例(3/3)
魚を釣った後
「釣り老師」
と話すと
ドラゴンクエストXを支える失敗事例 © 2019 SQUARE ENIX CO., LTD. All Rights Reserved.
失敗事例(3/3)
そのサイズに対応した
報酬がもらえます
ドラゴンクエストXを支える失敗事例 © 2019 SQUARE ENIX CO., LTD. All Rights Reserved.
失敗事例(3/3)
本件はその際
ビッグサイズの魚なのに
ノーマルサイズと判定される
という不具合です
ドラゴンクエストXを支える失敗事例 © 2019 SQUARE ENIX CO., LTD. All Rights Reserved.
不具合の技術的な背景
失敗事例(3/3)
ドラゴンクエストXを支える失敗事例 © 2019 SQUARE ENIX CO., LTD. All Rights Reserved.
大きさとサイズの分類は
魚ごとに決められています
失敗事例(3/3)
ドラゴンクエストXを支える失敗事例 © 2019 SQUARE ENIX CO., LTD. All Rights Reserved.
「オウムガイ」
1023mm以上でビッグサイズ
1022mm以下でノーマルサイズ
失敗事例(3/3)
ドラゴンクエストXを支える失敗事例 © 2019 SQUARE ENIX CO., LTD. All Rights Reserved.
ドラゴンクエストXの釣り実装は
C++とLuaが併用されています
失敗事例(3/3)
ドラゴンクエストXを支える失敗事例 © 2019 SQUARE ENIX CO., LTD. All Rights Reserved.
C++ではmm単位の情報をintで扱い
Luaではmおよびmmをdoubleで扱います
失敗事例(3/3)
ドラゴンクエストXを支える失敗事例 © 2019 SQUARE ENIX CO., LTD. All Rights Reserved.
不具合の原因
失敗事例(3/3)
ドラゴンクエストXを支える失敗事例 © 2019 SQUARE ENIX CO., LTD. All Rights Reserved.
C++ではmm単位の情報をintで扱い
Luaではmおよびmmをdoubleで扱います
失敗事例(3/3)
浮動小数点の誤差が気になる
ドラゴンクエストXを支える失敗事例 © 2019 SQUARE ENIX CO., LTD. All Rights Reserved.
「オウムガイ」
1023mm以上でビッグサイズ
1022mm以下でノーマルサイズ
doubleで1022-1023近辺の/1000*1000を検証
失敗事例(3/3)
ドラゴンクエストXを支える失敗事例 © 2019 SQUARE ENIX CO., LTD. All Rights Reserved.
1018 -> 1018 (+0) 1018.0000000000000
1019 -> 1018 (-1) 1018.9999999999999
1020 -> 1020 (+0) 1020.0000000000000
1021 -> 1020 (-1) 1020.9999999999999
1022 -> 1022 (+0) 1022.0000000000000
1023 -> 1022 (-1) 1022.9999999999999
1024 -> 1024 (+0) 1024.0000000000000
1025 -> 1025 (+0) 1025.0000000000000
1026 -> 1026 (+0) 1026.0000000000000
失敗事例(3/3)
ドラゴンクエストXを支える失敗事例 © 2019 SQUARE ENIX CO., LTD. All Rights Reserved.
1018 -> 1018 (+0) 1018.0000000000000
1019 -> 1018 (-1) 1018.9999999999999
1020 -> 1020 (+0) 1020.0000000000000
1021 -> 1020 (-1) 1020.9999999999999
1022 -> 1022 (+0) 1022.0000000000000
1023 -> 1022 (-1) 1022.9999999999999
1024 -> 1024 (+0) 1024.0000000000000
1025 -> 1025 (+0) 1025.0000000000000
1026 -> 1026 (+0) 1026.0000000000000
失敗事例(3/3)
浮動小数点の丸め処理の
統一規定は無さそうなため
環境で結果が変わる可能性
がありそうです
(今回の件とは無関係です)
ドラゴンクエストXを支える失敗事例 © 2019 SQUARE ENIX CO., LTD. All Rights Reserved.
担当プログラマーの名誉のために
フォローしておきますが
誤差補正処理はありました
失敗事例(3/3)
ドラゴンクエストXを支える失敗事例 © 2019 SQUARE ENIX CO., LTD. All Rights Reserved.
f_Result = math.floor((f_FishScale + 0.0004) * 1000) / 1000
失敗事例(3/3)
ドラゴンクエストXを支える失敗事例 © 2019 SQUARE ENIX CO., LTD. All Rights Reserved.
f_Result = math.floor((f_FishScale + 0.0004) * 1000) / 1000
失敗事例(3/3)
単位はmで1023/1000の
1.022999…が渡されます
ドラゴンクエストXを支える失敗事例 © 2019 SQUARE ENIX CO., LTD. All Rights Reserved.
f_Result = math.floor((f_FishScale + 0.0004) * 1000) / 1000
失敗事例(3/3)
1.022999…→1.023399…
(良い感じ!)
ドラゴンクエストXを支える失敗事例 © 2019 SQUARE ENIX CO., LTD. All Rights Reserved.
f_Result = math.floor((f_FishScale + 0.0004) * 1000) / 1000
失敗事例(3/3)
1.0233999…→1023.399…
ドラゴンクエストXを支える失敗事例 © 2019 SQUARE ENIX CO., LTD. All Rights Reserved.
f_Result = math.floor((f_FishScale + 0.0004) * 1000) / 1000
失敗事例(3/3)
1023.399… →1023
(できた!!)
ドラゴンクエストXを支える失敗事例 © 2019 SQUARE ENIX CO., LTD. All Rights Reserved.
f_Result = math.floor((f_FishScale + 0.0004) * 1000) / 1000
失敗事例(3/3)
1023→1.0229999…
ドラゴンクエストXを支える失敗事例 © 2019 SQUARE ENIX CO., LTD. All Rights Reserved.
傷口に塩を塗る
結果になっちゃいましたが
これは仕方がないと思います
失敗事例(3/3)
ドラゴンクエストXを支える失敗事例 © 2019 SQUARE ENIX CO., LTD. All Rights Reserved.
でもなぜ急に
問題になったのでしょう
(釣りの実績は十分ありました)
失敗事例(3/3)
ドラゴンクエストXを支える失敗事例 © 2019 SQUARE ENIX CO., LTD. All Rights Reserved.
ビッグサイズ
失敗事例(3/3)
サイズ分類決定
魚生成
大きさ決定
保存
1023mm
ドラゴンクエストXを支える失敗事例 © 2019 SQUARE ENIX CO., LTD. All Rights Reserved.
ビッグサイズ
失敗事例(3/3)
サイズ分類決定
魚生成
大きさ決定
保存
1023 1022
浮動小数点誤差の影響
ドラゴンクエストXを支える失敗事例 © 2019 SQUARE ENIX CO., LTD. All Rights Reserved.
ビッグサイズ
失敗事例(3/3)
サイズ分類決定
魚生成
大きさ決定
保存
1023 1022
ビッグ & 1022
再計算負荷軽減のため
両方の情報を保存
(不整合あり)
ドラゴンクエストXを支える失敗事例 © 2019 SQUARE ENIX CO., LTD. All Rights Reserved.
ゲームサーバ
ゲームクライアント
ゲームクライアントゲームクライアントゲームクライアント
ゲームクライアント
ゲームクライアントゲームクライアントゲームクライアント
ゲームDB
オウムガイ
(ビッグ&1022)
失敗事例(3/3)
ドラゴンクエストXを支える失敗事例 © 2019 SQUARE ENIX CO., LTD. All Rights Reserved.
あるとき(別の)不具合が発生し
サイズ分類の再計算が必要になり
失敗事例(3/3)
ドラゴンクエストXを支える失敗事例 © 2019 SQUARE ENIX CO., LTD. All Rights Reserved.
釣り老師に話したタイミングで
大きさ(mm)からサイズ分類を
再度求めることになりました
失敗事例(3/3)
ドラゴンクエストXを支える失敗事例 © 2019 SQUARE ENIX CO., LTD. All Rights Reserved.
オウムガイ
ビッグサイズ&1022mm
オウムガイ
ノーマルサイズ&1022mm
失敗事例(3/3)
ドラゴンクエストXを支える失敗事例 © 2019 SQUARE ENIX CO., LTD. All Rights Reserved.
不具合告知内容(再掲)
釣りにて、「オウムガイ」のビッグサイズや
キングサイズを釣ったのに、釣り老師や魚交
換員から、ビッグサイズはノーマルサイズ、
キングサイズはビッグサイズとして扱われる
ことがある。
失敗事例(3/3)
ドラゴンクエストXを支える失敗事例 © 2019 SQUARE ENIX CO., LTD. All Rights Reserved.
発覚後の対応
失敗事例(3/3)
ドラゴンクエストXを支える失敗事例 © 2019 SQUARE ENIX CO., LTD. All Rights Reserved.
サイズ分類も大きさの数値も
信用できない状態に
なりましたので
失敗事例(3/3)
ドラゴンクエストXを支える失敗事例 © 2019 SQUARE ENIX CO., LTD. All Rights Reserved.
再計算をしないように戻した後
ログとゲームDBの情報から
個別対応しました
※行動ログ超大事
失敗事例(3/3)
ドラゴンクエストXを支える失敗事例 © 2019 SQUARE ENIX CO., LTD. All Rights Reserved.
得られた教訓
失敗事例(3/3)
ドラゴンクエストXを支える失敗事例 © 2019 SQUARE ENIX CO., LTD. All Rights Reserved.
• 表面化していない不具合は
有る前提で対応すべし
失敗事例(3/3)
教訓
ドラゴンクエストXを支える失敗事例 © 2019 SQUARE ENIX CO., LTD. All Rights Reserved.
失敗事例の考察
失敗事例
ドラゴンクエストXを支える失敗事例 © 2019 SQUARE ENIX CO., LTD. All Rights Reserved.
これらの失敗事例を鑑み
柔軟性と継続性に加えて
開発ポリシーに追加すべきは
失敗事例考察
ドラゴンクエストXを支える失敗事例 © 2019 SQUARE ENIX CO., LTD. All Rights Reserved.
「リリース後の改修は要注意」
失敗事例考察
ドラゴンクエストXを支える失敗事例 © 2019 SQUARE ENIX CO., LTD. All Rights Reserved.
リリース後の改修は…
• 影響範囲を考察
• BTSチケットに登録
• 確実にチケットクローズまで
失敗事例考察
ドラゴンクエストXを支える失敗事例 © 2019 SQUARE ENIX CO., LTD. All Rights Reserved.
ドラゴンクエストX開発チームは
運営中に出た問題に対して
「どうすれば事前に防げたか」
を検討し
パターン別にまとめています
失敗事例考察
ドラゴンクエストXを支える失敗事例 © 2019 SQUARE ENIX CO., LTD. All Rights Reserved.
その中で最も多いパターンは
失敗事例考察
ドラゴンクエストXを支える失敗事例 © 2019 SQUARE ENIX CO., LTD. All Rights Reserved.
リリース後の改修は…
• 影響範囲を考察
• BTSチケットに登録
• 確実にチケットクローズまで
失敗事例考察
ドラゴンクエストXを支える失敗事例 © 2019 SQUARE ENIX CO., LTD. All Rights Reserved.
リリース後の改修は…
• 影響範囲を考察
• BTSチケットに登録
• 確実にチケットクローズ
失敗事例考察
開発担当者が軽く考える案件が
問題になりやすいようです
ドラゴンクエストXを支える失敗事例 © 2019 SQUARE ENIX CO., LTD. All Rights Reserved.
目次
自己紹介
本セッションについて
ドラゴンクエストXとは
開発ポリシー
失敗事例(3つ)
まとめ
• システム改修はBTSチケットに影響範囲を
明記し全影響範囲を再検証すべし
• 影響範囲は極力狭くすべし
ドラゴンクエストXを支える失敗事例 © 2019 SQUARE ENIX CO., LTD. All Rights Reserved.
まとめ
教訓再掲
ドラゴンクエストXを支える失敗事例 © 2019 SQUARE ENIX CO., LTD. All Rights Reserved.
• 暫定対応は本対応完了までを
BTSチケットで管理すべし
まとめ
教訓再掲
ドラゴンクエストXを支える失敗事例 © 2019 SQUARE ENIX CO., LTD. All Rights Reserved.
• 表面化していない不具合は
有る前提で対応すべし
まとめ
教訓再掲
これらの失敗事例が
皆さんの経験値の一部に
なれば幸いです
ドラゴンクエストXを支える失敗事例 © 2019 SQUARE ENIX CO., LTD. All Rights Reserved.
まとめ
当セッションの内容は以上ですが
「ドラゴンクエストXを支える技術」に
その他の事例を多数
載せていますので
併せて参考にしてください
ドラゴンクエストXを支える失敗事例 © 2019 SQUARE ENIX CO., LTD. All Rights Reserved.
まとめ

【15-A-1】ドラゴンクエストXを支える失敗事例