「カルドセプトサーガ」にダイス目が偶数と奇数を繰り返すバグ 165
ストーリー by yoosee
ざわ…ざわ… 部門より
ざわ…ざわ… 部門より
ゴリアス 曰く、
株式会社バンダイナムコゲームス発売のXbox360向けゲームソフト「カルドセプトサーガ」に「次のダイス目が偶数か奇数か推測できる」という致命的バグが見つかりました。ちなみに「カルドセプト」はモノポリーに侵略要素を加えたようなボードゲームで、このようなバグはゲームの根幹に関わるものです。
カルドセプトサーガ不具合情報によりますと、「最大ダイス目が偶数のマップでの非AI戦において、ダイスによって導かれる数値は奇数と偶数を交互に繰り返す」とのこと。Youtubeに検証動画があります。 また最大ダイス目が奇数のマップでのダイス目に関しても法則性らしきものが見つかっています。
双六やモノポリーでダイス目が偏っていれば、ゲームとして成立しなくなります。 どういう事情があればボードゲームのダイス目に偏りがあるまま発売されたりするのでしょうか。 ボードゲームとしての価値を自分で全否定しているようなものです。 セガサターンから続いた名作ボードゲームの最新作がこんなことになってしまって、本当に悲しい。
擬似乱数 (スコア:4, 興味深い)
線形合同法みたいな擬似乱数の最下位ビットは0と1を繰り返したりする性質
があるから、そのままサイコロの目に合わそうとして6で割ったあまりを求め
たりすると奇数と偶数を繰り返してしまうんだよね(奇数か偶数かは最下位ビット
が決めるので)。
Re:擬似乱数 (スコア:4, 興味深い)
こんな感じのコードになっていて少し見直した覚えがあります。
int rand()
{
static unsigned long _hold; <-どこかで初期化してる
return ((_hold = _hold * 214013L + 2531011L) >> 16) & 0x7fff;
}
つまり、rand()の戻り値の範囲は[0,2^15)ですが、内部ではunsigned long変数を
使っているので周期は32768でなく、もっと長く(最良の場合2^32)になっていて、
しかも戻り値は上位ビットを使っているので元記事にあるような規則性を生み出す確率が
非常に小さいものになっています。C標準のrand()は悪いといろんなところで言われている
(Numerical Recipes in Cとか)ようですが、それほど悪くもないんじゃないかな、と。
どうやら、記事になった乱数発生のバグは、C標準のrand()を使うだけで避けられるんでは?
Re:擬似乱数 (スコア:2, 興味深い)
それでもお偉いさんには理解できないんですよね。
Re:擬似乱数 (スコア:1, すばらしい洞察)
Re:擬似乱数 (スコア:2, すばらしい洞察)
本体とあわせてかいました (スコア:4, 参考になる)
前作と比べると戦闘中のエフェクトがかかると一瞬動きが止まって全体のテンポが悪くなっています。
2chをみるとダイスのバグ以外にも、いろいろと不具合があがっている模様。
不具合情報・改善要望サイトがあるみたいですね。
・カルドセプトサーガ不具合情報 [bugfix.jp]
・CuldceptSagaWiki(改善要望) [atwiki.jp]
12月のアップデートで修正されるという話です。
テンポが改善されるまでは、ランブルローズでもやってます。
偶数引いたプレイヤーが圧倒的有利なんじゃ? (スコア:3, すばらしい洞察)
どういう条件で偶数奇数の割り振りが決まるのかわかりませんが、1ゲームを通じて、さいころ振ると偶数奇数が交互にでるようですね。各プレイヤーが振るさいころが偶数奇数ならまだ傷は浅かったのですが。
偶数プレイヤーでのプレイの場合、偶数を引いた人は少なくとも1ゲーム終わるまで延々偶数引いたままなわけですよね。となると、仮にさいころが1D6(6面ダイス1個のこと)ならば奇数に当たった人は1,3,5の中から一つ引き、偶数に当たった人は2,4,6から一つ引くことになる。となると、偶数の人は奇数の人に比べて常に+1の出目アドバンテージがあることになり、さいころを振れば振るほどその累積の有意差は広がっていくことになる。
特定プレイヤーがさいころを振れない状態にならないかぎり…
# rm -rf ./.
Re:偶数引いたプレイヤーが圧倒的有利なんじゃ? (スコア:2, 参考になる)
カルドセプトはこの点で典型的なモノポリタイプなので期待値の大きい方は有利です。
ただ、マップによってはダイスの最大値が奇数のマップもあった筈なので、その場合に限り公平ですね。
>偶数側はスタートから数えて奇数番目のマスには止まる可能性がありません。
モノポリタイプですので後半「止まりたくないマス」が多くなります。止まるマスの少ないことはある意味有利。
(ただし占領可能なマスが限定されるという点で不利なようにも思えますが)
また全マス同一サイズの周回制ですからどのマップでもマス數は偶数であり、よって停止マスは2周目移行も変化しません。
ハードウェアサポート (スコア:3, すばらしい洞察)
ゲームに乱数なんてつきものなんだから。
Re:ハードウェアサポート (スコア:2, おもしろおかしい)
ゲームをしてると「さいころを振って出た数を入力してください」と要求される。
「6面体さいころを12個振ってその合計値を入力してください」とか。
「お手元のカードを一枚引いてください」でも可。
個人で遊ぶゲームでズルをしてつまらなくするのはプレイヤーの勝手だし、
複数で遊ぶ場合は目をごまかせばケンカになるだけだから相互抑止が働く。
従って、ズルは意味をなさない。
コンピュータゲームである必然性が皆無になる以外は、良いアイデアかもしれない。
Re:ハードウェアサポート (スコア:1)
ゲームブックを思い出しますなあ。
ダイスのハードウェアサポート… (スコア:1)
専用シート上で良いから、振ると出目を認識してくれるってな感じで。
標準で 6面体が 2個付属。別途、(さまざまな色の)多面体ダイスが購入できると。
ID登録しておけば他者のと混じって降っても、それぞれ認識してくれると便利だな。
#10面体はどちらが十の位か登録もできなきゃだよね…ゴルフボールはイヤだし(^^;
タブレット中毒者。
Re:ハードウェアサポート (スコア:1)
T&Tですか?
タスのめんどいんですよねえ…
Re:ハードウェアサポート (スコア:1, 参考になる)
結構最近出てます。
さいころつきのゲームブック形式。
#18禁なのでリンクはしません。
(いや会社からなのでできません。)
Re:ハードウェアサポート (スコア:1)
ゲームブックをそのままPC上に持ってきたという男らしいソフトなので、ゲーム中に実際にサイコロを振る必要があります(が、別に振らなくても構いません)。
Re:ハードウェアサポート (スコア:2, 参考になる)
http://japanese.engadget.com/2005/12/06/dice-o-matic/ [engadget.com]
丁度一年前のネタだ・・・
Re:ハードウェアサポート (スコア:2, おもしろおかしい)
目は傾きセンサで読むのが良い。
任天堂なら、Wiiならなんとかしてくれる!
Wiiリモコンに正六面柱(鉛筆形)のガワ着せて
ころころ転がすと、d6さいころの出来上がり。
# できるのか?
Re:ハードウェアサポート (スコア:1)
目の配置が反対側と合計して7になるサイコロ使用しないと
ややこしい登録作業が必要かもしれませんが :-)
#「接地してる面の目を採用」というCPUに優しい方法も。
Re:ハードウェアサポート (スコア:1)
アレってなんで立ち消えたんだっけ?
#20年ぐらい昔、rand()の返値が「今のミリ秒」って恐ろしい物がありましたな。
Re:ハードウェアサポート (スコア:1, おもしろおかしい)
そんなに恐ろしかったですか?
実用的だったと思いますが。
ハードウェア乱数発生器ってのをみて、Z80のRレジスタ思い出しましたよ。
乱数レジスタと教えられて信じてました、純真だったな。
Re:ハードウェアサポート (スコア:1, すばらしい洞察)
>そんなに恐ろしかったですか?
>実用的だったと思いますが。
乱数を発生させるタイミングが周期的だったら、乱数にならないですよ。
Re:ハードウェアサポート (スコア:1)
まぁそれでも良いかって感じですから、確かに純粋に乱数じゃないですね
人の代わりにコンピューターが制御すればその値は予測出来るかな?
まぁコンピュータつかってインチキしようと考える人の居なかったのどかな時代の方法ですね
Re:ハードウェアサポート (スコア:1)
作るとは思いますよ
複数回呼ぶと相関がでてしいますからねぇ~
Re:ハードウェアサポート (スコア:1)
>今のミリ秒
pen4くらいで「今のクロックカウント」を疑似乱数に混ぜると結構いける気がする。
ちなみに同種ゲームを作ったヒトとしては (スコア:3, 参考になる)
キャラパラメータによってダイスをいじったり、いかにも乱数に見せかけたりとか
で、そんなに「きれいな」乱数じゃないはずですよ。
実際、過去につくったやつでは if文で範囲せばめるけど同じ値がつづきすぎたら
わざと外すとかって関数いれてました。
# ふつうに「中心値5.4で範囲が0.6」とかって結果を
# だしますからね>内部
なので、これはほぼ確実に仕様の積みかさねですね。
# どうせどの作品かバれないので名前出し
Re:ちなみに同種ゲームを作ったヒトとしては (スコア:2, おもしろおかしい)
コンピュータがテンホーするのは酷いと思うんだ……
Google八分 (スコア:2, 参考になる)
また、これらの不具合情報(を含むファンページの多く?)がGoogle八分と思われる状況にあった時期がありました。
これがメーカー側が行った対応によるものだとしたら相当問題のある行動だと思います。
公式に不具合の存在を告知すらしていないようですし。
悲しいはかなしい (スコア:1)
Yuzam
Re:悲しいはかなしい (スコア:1)
乱数に関連する現象で、プレイ不能とまではいかないが、「興をそぐ」「気になる」程度のことは、結構いろいろなゲームにあるようですね。
"監修"大宮ソフトなので (スコア:1, 参考になる)
監修責任について考えるところはあるものの、販売権はバンダイナムコ保有だし、デバッグより発売時期厳守が優先されてしまったのでは。
ファンとしてはXbox360版は黒歴史と認識して、Wiiあたりでの「カルドセプト サード」リリースに期待します。
Re:"監修"大宮ソフトなので (スコア:2, すばらしい洞察)
ユーザーには何ら責任はないでしょう。
ですから、期待をかけることが間違いとは思いません。
批判を浴びるようなゲームをリリースしてしまった
メーカーが、その責任を負うのは当然だと思います。
これだけバグに関する情報が出てきているのにも関わらず、
メーカーから何らの公式見解もない、というその姿勢も
批判に拍車を掛ける要因になっていると思います。
一刻も早くメーカーは今後の対応を示すべきです。
名前は看板でしょ (スコア:2, 興味深い)
監修だからって罪が減じられるわけではないですよ。仮にも自社の看板を掲げてる以上、そのクソゲーっぷりは
その会社の責任でもあります。
まあ今回はなぜかでしゃばってきたジャムズワークスの手抜きっぷりとバンダイナムコゲームスの体質に
問題の根があるように思いますが。
…たまたま耳にした噂話によると、バンダイナムコゲームスは『品質優先営業ナニソレ』なナムコ体質が
『販売機会優先品質二の次』なバンダイクオリティに汚染されているそうです。
(ナムコは社員の頭数が多いのに利益率が低いから社内発言力がない。……まあ開発部隊を社内に抱えたナムコと
基本的にプロデューサしかいないバンダイゲーム事業部の違いなんですが、それでも売れてるほうが
大きな顔をするのは当然といえば当然なわけで。旧ナムコ副社長の石川氏がバンナムゲーの社長なのですが、
実権を握っているのは旧バンダイのゲーム事業部の鵜之澤氏(ピピン@の悪夢の)だったりする)
ここからは推測なのですが、今年5月にバンダイナムコゲームスは開発中のXBOX360用ゲームを一本
お蔵入りにしました。
(フレームシティ [impress.co.jp]とゆー
アンリアルエンジン3を使ったゲームで、それなのになぜか秒間数フレームの速度(fps)でしか動かず
「1フレームシティ」との汚名を社内で頂いていたというのも風の噂)
マイクロソフトと「年間にn本ソフトを出すから開発予算を一部出資してくれ」という契約をしていた
バンナムとしては是が非でも今年中にXBOX360のソフトを一本多く出す必要があったわけです。
そのために多少品質がアレであっても違約金を払うよりはマシ、とバンナムは判断したのではないかな、というのが
僕の推測であります。
(まあ、それにしてももともとこのゲームは2006年夏発売予定(2006年5月発表時)→2006年秋(2006年7月当時)
という程度の発売予定だったので「納期をムリに早められて結果未完成のまま発売された」というよりは
「開発が遅れて本来ならば発売できるクオリティではないのに無理に発売させられた」という程度なのでしょうが)
で、A級戦犯は誰かって言ったら(順不同)
・プロデュース会社のジャムズワークス [jamsworks.com]
プロデュースといえば聞こえはいいが山師。こいつらたまにヒットは打つけど今回はどーしようもない。
・販売会社のバンダイナムコゲームス [bandainamcogames.co.jp]
お前の会社に品質管理部はないのか。ていうか、五月以降ナニをしてたおまいら。
・ゲームデザイン・監修の大宮ソフト [omiyasoft.com]
ろくに監修してねえじゃん!おまいらこのゲームしかネタ持ってないのに!
・プログラムを手がけたロケットスタジオ [rocketstd.co.jp]
乱数のプログラムも書けねえのにスタジオ気取りか、おい。
多少罪は減じられるが厳重注意B級戦犯
・ゲームバランス・チューニング猿楽庁 [sarugakucho.jp]
どこをどうチューニングしたんだ、言ってみろ。
と、そんな風に思ったりもします。
Re:理解できん (スコア:5, 参考になる)
だそうで、まさにこれが原因じゃないでしょうか。
Re:理解できん (スコア:2, 参考になる)
もしrand()が [0,1) のdoubleを返していたら、定番の「6を掛けて整数に切り捨て1を足す」というイディオムを使わざるを得ず、こういうバグは起きなかった。乱数を返す関数に小数を返す言語が多いのはこのあたりが理由ですかねえ。
ちなみに、ワードサイズ w (例えば2^31)の計算機における x[n+1] = ( a * x[n] + c) mod m の線形合同法について、Knuth翁は、m = w では最下位ビットは「定数になるか、確実に交代する」(やや不自然な訳)ので m = w±1 の方が望ましいが、 といわれております。
『The Art of Computer Programming Volume 2 Seminumerical Algorithms 日本語版』Donald E. Knuth著、有沢誠他監訳
Re:理解できん (スコア:1)
skiplistを試してみたとき、リストの深さを決定するのに、
while(rand()%2==1) {
level++;
}
みたいなことをしたんですが、深さは0が1しか得られませんでした。
おかげでskiplistなのに遅い遅い(笑)
NetBSD1.6のころだったっけ。
linuxでは一応期待したように動きましたが、rand()%2はアレなので止めました(笑)
Re:理解できん (スコア:3, 興味深い)
まるまるパクってきた使ったのでは?
不具合情報を見ると、線形合同法の欠点がもろ出ているように思えますが。
Re:理解できん (スコア:4, すばらしい洞察)
カードのシャッフルも最初に行ってるでしょうし。
対AI戦では、思考ルーチン内で乱数使ってるために、この問題は発生しないんでしょう。
Re:理解できん (スコア:1)
とりあえずVC++7.1付属のCRTでは、randの内部状態はスレッド毎に管理されているようですが。
Xbox360の開発環境ではどうなのかは知りませんが、似たような実装になっていればスレッドの使い方によってはこういう結果になるんじゃないでしょうか。
Re:理解できん (スコア:4, 興味深い)
これは気をつけないとセキュリティホールとかの温床になるかもしれない。
Re:理解できん (スコア:2, すばらしい洞察)
そこまでテストプレイでやりこんでなかったのなら、他のバグも大量に潜んでるんじゃないかな?
Re:理解できん (スコア:3, 参考になる)
正に大量でして。
一例を挙げると、
・選んだものと違うカードが使用される(場合によってはその局面では使用できないはずのものまで)
・CPUが突然逆方向に進み始める
・フリーズする
・ありえない量の報酬が出現
など。ゲームバランス調整なんてレベルじゃなく、デバッグもせずα版をそのまま出荷したんじゃないかという疑念さえ漂う一品です。
チューニングで参加している猿楽庁がいったい何をやったのか、非常に気になります。
Re:理解できん (スコア:1)
もう手戻りできない段階のとき、よくあるじゃん。
… まさか俺だけじゃないよな。
Re:理解できん (スコア:1)
直接的な原因は「質の悪い擬似乱数を、悪い方法で使っている」ことかもしれませんが、
テストプレイで見つからない(あるいは認識してはいたが見逃す判断をした)方がより
根深い問題でしょう。
続編ということで、ゲームバランスの確認まできちんとやっていなかった、とか…?
Re:理解できん (スコア:2, 興味深い)
戦闘シーンがもう冗長で不便で。とりあえずカード名は最初だけ表示してすぐに消すのに
毎回戦闘時の能力値変化とか特殊能力を一行づつ表示しやがる
(「アレスの応援」「能力値変化」「ポセイドンの応援」「能力値変化」なんか一度で表示できるでしょうに)とか
「○○無効化」「無効化できなかった」(相手に○○ないんですけど)とか
ダメージを受けた際のエフェクトのあと一息置いてカード破壊のエフェクトするとか
素人丸出しの仕様がてんこもり。
さらに今回のバージョンは目標額が上がっているらしく。
CPUとやってるはずなのにストーリーの初期ですらかなり時間掛かる。
#いろいろ問題はあったが今考えたらアヴァロンの鍵はプレイ時間短縮のために相当工夫してたよなと。
まあそもそもボードゲームカードゲームのバランス修正をきちんとできる人は
あんまりいないじゃないかと思うけどね。コンピュータ上で実装して
適正なプレイ時間とかゲームをプレイして楽しいという域まで持っていくのなんか奇跡に近い。
+=======------
| K.Hamaura a.k.a. SeyfertSluw
| 「SFはどこまで実現するか」 復刊希望は→http://www.fukkan.com/vote.php3?no=4901
Re:理解できん (スコア:1)
rand() % N
とすると法則性がでてしまうので、
(rand() / M) % N
/* M は適当に大きな数字 */
とかを使った方がより乱数性がよくなるとか。
Re:理解できん (スコア:4, 参考になる)
Re:理解できん (スコア:3, 参考になる)
○:M は適当に大きな素数
正確に理解&記憶しとこうね。素数かどうかで全然効果が違うから。
Re:乱数の生成 (スコア:4, 興味深い)
Re:youtubeの動画は削除 (スコア:1)
バグの検証動画って、「報道、批評、研究その他の引用の目的上正当な範囲内」にならんかね?
Re:正直言うと (スコア:1, おもしろおかしい)
旧正月に帰省ですか?