どうもノアです!
最近あのラグナロクオンラインの動向に注目してたんですが、そこでまさかのバグが発生してると見かけました。
語弊を恐れず誰にでも伝わる表現をするなら「お金が増殖してしまう」というありきたりだけどゲームとして致命的なバグ!
今回はラグナロクオンライン21周年のアニバーサリーイベント中に起きた、この致命的なバグの解説と、なぜこんなことが起こってしまったのかを元プロのデバッガー目線で考察していきたいと思います。
先に結論
まず先にこのバグの内容を知っていて、どうして起きたのかが気になる人に向けて結論を書きます。
(確定情報ではなく推測なので推論かな?)
ズバリ「直前に急遽行ったグラフィック変更の際にエンバグしてしまった」と推測しています。
※エンバグ…バグを直した際に新たに別のバグを入れ込んでしまうこと
一体どういうことなのか?気になる方は順に読み進めていってみてください。
バグの症状
まずは今回のバグの症状に関して、公式から発表されたバグの内容は以下の通り。
■オークションに入札を行い、落札できなかった時に返還される「夜市券」が、入札した枚数より多い場合がある。
夜市券とは、開催されているアニバーサリーオークションでのみ使用可能な通貨です。
ラグナロクオンラインのゲーム内では「zeny」という単価の通貨を使用しますが、このzenyを支払って夜市券を購入、購入した夜市券をオークションで入札して落札を競い合うというイベントでした。
夜市券には「夜市券(1K)」「夜市券(1M)」「夜市券(1G)」の三種類が存在し、それぞれ1,000zeny、1,000,000zeny、1,000,000,000zenyでNPCからの購入が可能です。
一度夜市券に変換してしまうと、zenyに戻すことはできないため、厳密には「お金が増える」バグではないのですが、この夜市券は取引が可能なアイテムなので、増殖した1Mの夜市券を800Kzenyで他者に売却するといった方法で実質的な所持金を増やすことができてしまいます。
(更に厳密にいうとシステム内の総zeny量は増えないわけですがややこしい話なので割愛)
公式からの発表では、オークションで入札し、商品を競り落とせなかった際に戻ってくるはずの夜市券の枚数が増えてしまうということのようです。
バグの詳細
ここからは私がTwitterやYoutubeなどから仕入れた情報を元にお話していきます。実際の症状とは違うケースもあると思いますが、参考情報ということでご了承ください。
増える時と増えない時がある
どうやら全てのプレイヤーで増殖したわけではないようです。
返金された際に増えたというプレイヤー、増えなかったプレイヤーの2パターンがありました。
消失した、減った、という情報は見受けられなかったのが気になる所。
別種の夜市券を使用した際に増える?
どうも複数の夜市券を使用したプレイヤーで増殖が確認されている様子でした。
例えば夜市券(1M)で入札した後、夜市券(1K)を追加で入れて入札額を増やしたプレイヤーが増殖したことを確認しているようです。
NPCからのメッセージは正常で受け取った額に誤りがある
夜市券はNPCに話しかけることで返却が行われるという仕様ですが、この際に「〇〇枚の夜市券を返却しました」といった表示が行われるそうです。
そして、この表示された夜市券の枚数は正常に入札した総額と同じ額だった、といわれています。
ですが、実際にアイテムバックに入った夜市券の枚数を確認すると、倍の枚数になってしまっていたということでした。
バグの原因と経緯の推測
上記のバグの詳細が全て正しい情報だったという前提で、今回のバグの原因とどんな経緯で発生したかを推測してみようと思います。
まず、このイベントは21周年イベントというプレイヤーだけではなく運営、開発サイドにとってもとても大きなイベントです。
更にオークションという形でプレイヤーに巨額のお金を使わせるイベントとなるわけですから、今回のようなお金絡みのバグは開発サイドとして絶対に見落としたり残したりしてはいけないバグと認識しているはずです。
なのにこんな簡単な条件で増殖してしまうようなバグが発生してしまった。デバッガー目線で見ても、こんな簡単な条件の見落としはまずありえません。何故なのか。
冒頭に書いた結論の通り、答えは「直前に急遽行った仕様変更の際にエンバグしてしまった」であると推測します。
ここからはその急遽行った仕様変更とは何か、なぜ必要だったのかを時系列順に整理して話したいと思います。
価格詐欺が横行していた
夜市券はプレイヤーから購入する以外に、イベントをクリアすることでプレイヤーに配られるというものでもあったので、配られた夜市券をNPC購入よりも安い価格で販売することで現金化しようとするプレイヤーもいました。
オークションに参加したい人はNPCよりも安い価格で夜市券が買え、オークションに参加しないプレイヤーは換金ができてWin-Winというわけです。
ところが、ここで問題が発生します。
夜市券は3種類あると説明しましたが、実は三種類とも見た目がまったく同じグラフィックだったため、詐欺露店が横行していました。
上の画像の様に「値段が少し安い夜市券(1M)」と思わせて夜市券(1K)をお店に出すプレイヤーが続出しました。
この事態を重く見たのか、公式は次の手を打ちました。
夜市券のグラフィックの変更
公式は夜市券のグラフィックを変更することによって、詐欺被害を抑えるという手段に出ました。
他にも発生していたバグ修正を行うついでに、「夜市券(1G)」と「夜市券(1K)」のグラフィックを変更したのです。
ここでミソなのは「夜市券1Mは変更されていない」という点。
そして私の推測ですが、これが今回のバグの原因になっていると思われます。
ラグナロクオンラインの定期メンテナンスは火曜日なので、11/28(火)がメンテ日だったのですが、この対応が行われたのは11/30(木)の16:00~18:00の臨時メンテの時でした。
詐欺が横行しだしたのは11/28(火)の夜から11/29(水)にかけてだったので、恐らく11/29(水)の夜から11/30(木)の朝にかけて、開発サイドで仕様の変更を検討、11/30(木)に予定していたバグ修正のための臨時メンテナンスに入れ込む形でこのグラフィック変更を差し込んだものと思われます。
つまり仕様変更の決定から実装までほぼノータイムで行われたわけです。
恐らくこの仕様変更に対してオークション周りまでデバッグを行う時間はなかったとみられます。臨時メンテの直接の原因になったバグもかなり致命的なものだったので、デバッグのリソースは主にそちらに割かれていたことでしょう。
どんな仕組みでバグが起きたのか
では、改めてどんな仕組みで今回の増殖バグが起きたのかを推測したいと思います。
別チケットを使った入札で増殖が発生しているということだったので、恐らくは「夜市券(1K)」が「夜市券(1M)」に化けてしまったと推測されます。
どういう仕組みでプログラミングされているのか詳細は分かりませんが、グラフィックの差し替えを行った際にアイテムIDのようなものも同時に変更されてしまった可能性が高いです。
それによって本来「夜市券(1K)」を返却するための処理が正常に動かず、判定できず、「夜市券(1M)」が代わりに返却されてしまったのではないでしょうか。
オークション君「夜市券(1K)を返したいのにデータベースにそんなアイテム無いって言われる!う~ん…とりあえず一番近いデータの夜市券(1M)を返しちゃえ!」
みたいな感じで!
夜市券はzenyと違って数値ではなくアイテムです。本来システムから排出されるべきアイテムが出せない場合、家庭用ゲームだとフリーズすることが多いです。
しかしネットワークゲームだとフリーズさせるわけにはいかないので、何らかの緊急処理が働き、代替えとして別のアイテムが出された、それが夜市券だったため「増殖した」と捉えられているのが真相ではないかと推測しています。
まとめ
夜市券の増殖は、オークション開始直前に実施した夜市券のグラフィックの変更の影響によるエンバグであると推測され、グラフィック変更の影響がオークションでの払い戻しにまで影響していることを確認できないまま実装してしまったことによって起きてしまった、と推測しています。
公式から発表されている情報以外は私の観測した情報や推測、憶測であり、確定情報ではないことにご注意ください。
実際にこのバグの発生が発覚したのが12/1の0:20、一回目のオークション締め切り直後であり、同日の1:00には既にオークションが中断されていたので、公式運営の対応速度は大変早く、この現場判断は大いに評価されるべき点かなと思っています。
オークション会場への入場人数には限りがありましたし、1:00までなら入札者を把握して増殖してしまったプレイヤーを割り出すことはまだ難しくないでしょう。
もしあのままオークションを続けていたら、どんどん増殖が進んで本当にとんでもない事態にまで発展してしまっていたはずです。
今回の件、バグの確認不足が悪いのか、詐欺を働くプレイヤーが悪いのか、急な実装が悪かったのか、何かを誰かを悪者にしようと思えばいくらでもできますが、それは建設的な話ではないと思います。
バグの原因究明と対処、そしてせっかくのアニバーサリーですから、オークションの無事な再開と開発、運営スタッフの方々がお体を壊さないことを祈っております。
コメント