1件ずつ表示 
--.--.-- --

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

続きを読む
Category: スポンサー広告
2017.04.14 Fri

Flow Flow.

m300000.jpg

確かにこいつなら暴怒持ってるだろうな。

記事書いてる現在も継続中なんですが、このシステムではだいたい最大HP+2500/minだそうです。
その理屈だとこの時点で約2時間くらいでしょうか。
4列を使えば効率はさらに倍以上になるわけで、3時間強で7桁が見える計算になります。
ただ、暴怒って炎上付与じゃなくて炎上ダメージを与える効果なので、クリブロは発生しちゃうんですねー。
そこだけはちょっともったいなかった。

もっともこの手法では現HPを最大HPにすることはできません。
画面上で約30万のHPでも実際には最大HPは50万を超えていると思われます。
(1ダメージで最大HP+3、クリブロなしなら最大HPは現HPの約1.5倍。クリが発生するのでおそらく50万前後)
しかしおめーよりによって一番アクセス多くなるEX戦のタイミングでやらんでもいいだろう。


さて、ここからは折角なのでオーバーフローの挙動予想を立ててみようと思います。
厳密に言えば、オーバーフローが起こるとどうなるのか?を簡単に説明。
そもそもオーバーフローとは何かを簡単に説明すれば、16進数で制御されているプログラムにおいて本来予想できない数字になってしまった際に、プログラムがその表示の桁を超えてしまったが故に誤作動を起こすバグの一種。
・・・んー、言葉では説明しづらいですね。
ものっそい簡単にプログラムの内部を書き出してみましょう。
実際には16進数ではなく2進数ですし、16進ダンプとかバイナリエディタとか用語が色々あるんですが、とりあえずここでは16進数で世界が表現されているものだと考えてもらっていいです。
もちろん中の人はそういうのが専門でもないですし、DGの内部がどうなってるかは分かりません。
あくまで予想であるということを念頭において、単純な一例を出します。

まず16進数の説明を簡単にしますと、1桁を16個の数字で表す手法で、PCでは良く用いられます。
9の次の数を10ではなくA、11をB・・・15をFとし、16で桁が繰り上がり10になる。
すなわち2桁で表せる最大の値がFF=256となる。

このメイファのHPは現在303214です。
これを0~9、A~Eの16進数で表した場合4a06eとなります。
これだけ理解してもらえば、大体OKです。

では、この画面にいるメイファを呼び出すプログラミングはどんななのか?
というのを一番単純な表現で考えてみますと、適当な部分もありますがこんな感じ。

01 3F 22 10 00 03 10 00 03 14 A0 6E 17 0E E2

例えばこうだった、としましょう。
多分意味が分からないと思います。そりゃあそうです。
で、本題は『この数字が何を表しているのか』を参照するデータとの兼ね合いなのです。
この一例の場合、私はこのように代入しました。

01 3F・・・ユニットの画像データを読み込む番号。メイファがこの番号かは分かりませんので当然適当です。
22・・・ユニットの位置情報を読み込む番号。縦2列目、横2列目。前に2マス進めば当然この値が24になるわけですね。
10 00 03・・・ユニットのもともとの攻撃力の値。
10 00 03・・・ユニットの現在攻撃力の値。
14 A0 6E・・・現在HP。頭の1については後で説明します。
17 0E E2・・・最大HP。適当に書きましたが、この場合は462562を表す値です。

こういう風に読み込むと、『データ13F=10進数でいう319番目の画像=メイファの画像の、縦2マス目、横3マス目にいる基本攻撃力3、現在攻撃力3、現在HP303214、最大HP462562のユニットである』というユニットデータが得られる記述である、と言えばなんとなくわかるでしょうか。
実際には他にも移動距離、攻撃属性、能力などのデータを参照するセルもあって、1体のユニットを表示するためのデータはもっと莫大になるでしょうが、基本はこういうものだと思っていただければ結構です。

そしてこれを読んだとき、ブリザードカーティス現象の発生原因もなんとなく予想がついたのではないでしょうか?
おそらく『カードの能力を表示するデータ』のカーティスの部分がルイラのものにさし変わってしまっていた、ということです。
当然挙動を読み込むためのデータがおかしくなってないので、実際には貫通攻撃のままなんですが。
逆にマリーンのように表示はそのまま挙動がおかしい場合、挙動の部分のデータが別の数字にさし変わってしまっている状態。

さて、ちょっと話がそれました。
この数字は普通の数字と同じように桁で計算されるように見えますが、実際には桁と同じような処理をするだけです。
これを説明するために実は攻撃力やHPの表記の部分にもわざと変な手間を加えました。
本当に詳しい人がいたらアレですんで、先に言っときます。
実際にはこんなトンデモ表記プログラミングは絶対にしません。

・・・まあ、それも置いておきましょう。分かりやすく解説するためのデータです・・・

さて、では一番わかりやすい攻撃力のデータで解説しましょう。
『0 00 03』の部分はなんとなく分かると思います。攻撃力3ですね。
じゃあ頭の1ってなぁに?というのを簡単に説明します。

まず、攻撃力が変動する要素があったとしましょう。
簡単にいえば今『3』が入っている桁に数字をプラスマイナスする処理が入るというものです。
プラスならいいんですよ。例えば10 00 0Aになったら攻撃力11です。

ではセクメトによって『攻撃力が-5されたらどうなるの?』ということを考えてみます。

~22 10 00 03~
これが
~22 0F FF FE~
桁が繰り下がるとこうなるわけです。
で、この『01』という部分。
これも簡素に説明すると『ここが1なら正の値、ここが0になったらマイナスの値として処理』という命令を実行するパートです。

そうすると
10 00 00⇒0
0F FF FF⇒-1
0F FF FE⇒-2
このように処理することが出来るわけです。
DGでは攻撃力0以下も内部的に計算されているのは、こんなような処理がされていると思ってください。

で、もしもDGが攻撃力を減らすことを想定していないゲームだったら?
簡単に言えば、マイナスの値を想定していないゲームであれば、ということです。
もちろんその場合攻撃力を下げるカードなんて出ないでしょうが、もし間違って出ちゃったら。

すなわちマイナスの値を表記するデータを無くす。
先ほどのデータの
01 3F 22 10 00 03 ... という部分が、
01 3F 22 00 00 03 ...という風に00 00 03だけで攻撃力を表そうとしていた場合を考えて見ます。
この場合頭の1がなくなりますので、攻撃力がFF FF FFの6桁(16777215)まで表示可能になるわけです。
ここで攻撃力が-5された場合、表示は
01 3F 21 FF FF FE ...となってしまいます。
具体的にどうなるかっつーと、『22』はユニットの位置を表すつもりの場所。
結果的にはメイファが英雄の下の位置にズレながら攻撃力が16777214になります。
これはオーバーフローの逆で『アンダーフロー』といいます。
もちろんその逆も然り。
この手法での表示限界であるFF FF FF=16777215を超えた場合。
01 3F 22 FF FF FF⇒攻撃力16777215
01 3F 23 00 00 00⇒攻撃力が0になり、メイファが右に1マスずれる。
これが『オーバーフロー』です。
要するに想定してない数字を超えてしまった場合に、関係ない桁が繰り上がって処理がおかしくなる状態はこう発生します。
このオーバーフローとアンダーフロー、プログラミングのバグの根源というか、原始的かつもっとも防ぎにくいバグなのです。
数字で処理をする以上『これだけ桁を確保しておけば大丈夫だろ』を超えてしまった場合の対策をしなければならない。

昔のRPGやなんかで、ステータスの上限が『255』であることに疑問を持ったことがある方はいないでしょうか?
これは『16進数の最大値であるFF以上にならない』という処理の都合上なのです。


さて、ここからが本題。
攻撃力と違って、HPはマイナスの値になった場合・・・つまり、先頭の1が0になった瞬間にユニットは死亡します。
故に、もしこの表記のように先頭の1と、残りの0 00 03のように16進数5桁で攻撃力やHPを管理していたのだとしたら・・・
FF 10 00 01⇒FE FF FF FFとなるような、要するに1048578ダメージ以上を与えられなければアンダーフローは起こりません。

・・・が。
攻撃力の際にもあえて触れないでおきましたが、もしこの正負の値を判定する0か1が
『2』になってしまったら処理はどうなってしまうのか。
1F FF FF⇒HP1048575
20 00 00⇒HP・・・!?

これが、オーバーフローの恐怖です。
まあ、この正負の判定は16進数ではなく0か1でしか行われていない可能性もあります。(っていうかおそらく多分そう)
その場合は1F FF FF⇒1 00 00 00となり、次の桁に悪影響は出るもののHPが-1048576となって死亡します。
先ほどの例で言えば、『もともとの攻撃力』がなぜか+1されると同時に即死します。
そしてさらに言えばこの理屈の場合、内部で最大HPが別個に計算されていれば最大HPが1048576を越えた瞬間に...
01 3F 22 10 00 03 10 00 03 1B 23 F5 1F FF FF(現HP+730101、最大HP+1048575)
これに最大HPを+1すると・・・
01 3F 22 10 00 03 10 00 03 1B 23 F6 00 00 00(現HP+730102、最大HP-1048575
最大HPがオーバーフローを起こし、ユニットが死亡すると思われます。

マーレなどの例を見て分かるとおり、最大HPが減っても現在HPは記憶されます。
ただし最大HPが減ればそれにあわせて現在HPも減り、0以下になれば現在HPがいくつであろうと死ぬようにできてます。
つまり最大HPのオーバーフローが起こってしまった場合、おそらくユニットは死ぬしかないであろうと考えられます。

もちろんプログラム側がそうならないよう、上限を設定している可能性もあります。
先ほどのRPGにしても、LV50で攻撃力が255になったぞ!
⇒LV51になったらなんか攻撃力が0になって画像が別のキャラになったんだけど・・・
なーんてことにはなりませんよね?
先ほどの例で言えば、『もしHPが1F FF FFになった場合、それ以上足されてもそこで止まる』という命令が存在する場合です。
そうなれば、このゲームのHPの理論上最大上限値が判明するということになります。

私はこれを捜し求めているのだよ!!

・・・とはいえ、この表示上限の桁がどれだけ用意されているか、というのが問題のすべてなんですが。
16進数で考えるのならば、当然桁が1つ増えれば表示できる数字が×16されるということ。
先ほどの例のように
0or1 F FF FFであるならば1048576が限界数値なわけですが、
もし仮にFF FF FF FFとかまで用意されてたらHP4294967295まで増やさないといけないわけです。
もしそうだとしたら、1週間のメンテまでの期間内に到達するのはまず不可能でしょう。
まーそれはそれで『気にしなくていい』という結論が出るともいえますが、それはちょっとさびしいなあ。

同様にカードデータを収納するセル、手札を収納するセル、そういったものそれぞれにこのような内部的上限が存在します。
それを突破してしまったとき、オーバーフローであふれ出た数字がどこに悪影響を及ぼすのか。
これはゲームというプログラムの記述を読み解かないことには、実際に起こしてみないと分からないものなのです。
もちろん『起こすことそのもの』がグレーゾーンっちゅう解釈もあるかと思いますが・・・

とはいえ、何らかの予想だにしてなかったカードの効果によってオーバーフローが発生してしまう可能性があるなら、プレイヤーで可能ならそれを考慮してあらかじめ探っておくのも大事なんじゃないでしょうか?
ゲーム本体を製作している時点では予想もしていなかった挙動のカードだってあると思います。
実は攻撃力やHPのほかに、いくつかオーバーフローの可能性を考えているモノがあります。
その中でも1つ、わかりやすく可能性を感じるもの。
『手札の待機値』

・・・これ、今のところ試した方がいらっしゃるのか気になっています。
手札の待機値は、普通そのカードに設定されている上限を超えることがありません。
が、それをぶち壊すカードである『ハデス』そうお前だよ。
例えばですが墓地をバニ3枚にし、ジン3体で毎回回収。
ハデスがいる状態で毎ターン打てば手札のカード1枚は1ターンごとに待機値が+8されていきます。

もし『待機値』の上限が設定されておらずオーバーフローしてしまったら?
その場合、あふれた数字は当然他の手札の『何か』に悪影響を及ぼすでしょう。
もしかしたらいきなり手札が1枚増えたり減ったり、別のカードになったりとかも十分ありえます。
しかもこれは『ハデスがいて、相手が奇襲デッキだったから手札の奇襲無効カードの待機値を増やしてどうあがいても奇襲が通らないようにしよう!』とかで実際に起こりえるプレイングかもしれません。
実際に起こりえるプレイングに影響してしまうバグが存在するなら、それは周知しておかないといけませんよね?
まーそういう検証や報告が無い時点で『ねーよ』って話な気がしなくも無いが。


とまあ、私がこういう下らない事に熱意を燃やす意味を一端ほどでも理解してもらえたらなー、と思います。
いわゆるTASやRTAといったものでも、メモリ破壊によるエンディング呼び出し(ACEと呼ばれる手法だそうな)の研究が進んでいるそうです。
どれほどゲームの時代が進んでも、プログラムはプログラムである以上、避けられないのがバグなのです。
最後にもう一度念押ししときますが、仮になんか見つけちゃっても悪用する気はまったくありませんので。
スポンサーサイト

続きを読む
Category: 未分類 Comments (7) Trackbacks (0)

この記事へのコメント:

何て迷惑なお客さんだw
BANくらわない程度に検証頑張ってください。
死の淵はFlash Playerのオーバーフローをついてしまったんですかね?
カバンもメールもいっぱいなのに、世界探索をやりまくるとかはどうでしょう?
アイテム全部消えたりして・・・
クリブロ防止の為になら☆5カンヘル
入れてもいいんじゃねえかな まあ一体分の暴怒減少に足るかはわからんけど
いやいや、大事な場面で予想だにしないバグを防止するためです!

死の淵に関しては、なんだかプログラム的にめんどくさそうな処理をしそうですからね。
どっかおかしくなってもおかしくないのかもしれません。

カンヘル入れれば最大体力の伸びは速くなるけど、現在体力が増えにくくなるジレンマ。
めっちゃ処理落ちしてますね HPが増えすぎて攻撃力が表示されてない・・w
負荷試験代行乙w
HPは7桁になっても、ちゃんと右にずれるので被らないんですよ。
攻撃力が上がると3桁目以降が体力と被ってしまうようです。

さすがに自分ではここまで長いことやる気は起きないです。
1048576が上限でないことが分かった時点で、正直『あ、これ無理だな』感は結構あります。

この記事へコメントする:

    

この記事のトラックバックURL:

http://dgmiria.blog.fc2.com/tb.php/274-549384b5

この記事に対するトラックバック:

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。