アカウント名:
パスワード:
30年の時を経て当事者が直接語るというのは感慨深いが、話の中身自体は特に何か当事者にしか知り得ない興味深い事情とか裏話があるわけではなく、現象(8回なにかすると別のフラグが立つ)から容易に想像がつく、フットプリントできるだけ小さくするための実装上の制約以上のものではなかったですね。
しかし逃げるコマンドの回数をカウントしなきゃいけない理由がわからない。雑魚敵に対して>>ドラクエIVでは4回目の「にげる」で必ず逃げられるという仕様は限られたメモリ空間を3bitも消費する価値があるほど重要だったのだろうか。一回あたりの逃げ成功確立を適当に設定しておけば十分な気が。あと「4回試行でかならず成功」を実装するだけならカウンタは2bitで十分な気が。
> あと「4回試行でかならず成功」を実装するだけならカウンタは2bitで十分な気が。
ニコニコ大百科の記事によると、逃げる回数のカウンタは下位2ビットで、下から3ビット目は「時の砂を使用したかどうか」のフラグのようですね。
単純に加算で実装していたから逃げ続けると2ビットをオーバーして3ビット目4ビット目までどんどん立っちゃうって話じゃないの?
2bitの逃げるカウンタと会心フラグの間に他のフラグがある事も容易に想像がつくはずですが?
>2bitの逃げるカウンタと会心フラグの間に他のフラグがある事も容易に想像がつくはずですが?ああそのとおりですね、4回目以降8回目までにも別フラグが立つことによる副作用がありえたわけですね、会心の一撃フラグがあまりに強烈なので8回という数字が際立っただけで。逃げ続けると他のフラグもたって何かべつのことが起きてるのだろうか。
まあ、ストーリーの元になった記事からして「逃げるカウンタが3bit」って間違えちゃってますので、しかたないですけど、
下位から順番に1~2: 逃げ回数(通常の戦闘は 11 = 3回逃げた時は確実に逃げられるはずなので、2bitで十分)3: 時の砂使用済(戦闘状態の保存処理を0の場合のみ行うことで、使った時の状態に差し戻せるようにする)4: パルプンテの結果が「ちからがみなぎってきた」だった(すべての攻撃が会心の一撃になる)5: 敵を倒した(1体でも倒したら戦闘終了時のメッセージが「○○をやっつけた」になり、1体も倒せなかった時は「○○はいなくなった」に)6: 不明7: 敵が複数種類かどうか(戦闘終了時の「○○(モンスター名)をやっつけた」が、「まもののむれ」表記になる)8: 不思議な霧状態かどうか(該当時は敵味方全員呪文の効果がなくなる)と、戦闘中の状態をbitフラグで管理しています。たくさん逃げ続ければ他の状態も変更可能ですが、戦闘中に使って意味ありそうなのはあとは8bit目ぐらいでしょうか。
また、3bit目は時の砂フラグなので「時の砂を使う+4回逃げる」でも8逃げ可能。
となると、さらにもう1度8回逃げると普通に戻るわけですね。
時の砂は「使った時の状態に戻る」んじゃなくて「使った時にひとつ前のターンに戻る」だぞい
すみません、なんか勘違いしてました。
戦闘中に2回以上時の砂が使われることはないので、時の砂を使って巻き戻した後は、もう巻き戻すことはないから状態保存は不要ってことで負荷軽減のためらしいですね。
涙ぐましすぎる…
Zガンダム「君は、時の涙を見る」
だんだん脱線してきたけど、
>3: 時の砂使用済(戦闘状態の保存処理を0の場合のみ行うことで、使った時の状態に差し戻せるようにする)
爪に火を灯すレベルのメモリ節約をしてんのに、なんでこんな"戦闘状態の保存"を必要とする時の砂なんてアイテムを実装したんだろうか、ゲームの本質ともストーリーイベントともかかわってこないのに。
ドラクエIVにもなると(カセット側に積んだ)RAMにかなり余裕ができて比較的自由に使えるようになってたんだろうかね。そうするとIVにおける2bit逃げカウンタと各種フラグのパックは、I,IIを実装した際に沁みついたプログラマの性でそうしただけで、もうこの世代ではハードウェア的には必ずしも要求されてたわけではないのかも。
カートリッジ側に128KBのRAMを積んでいても、そのうち同時にマッピングできるのは8KBで一時的な退避ならともかく、ワークエリアとしては使い辛いのではないかと。
それにこの種のカウンタはゼロページに置きたいしね。(0000h~00FFhのアドレスはレジスタ的な使い方ができる。)
6502の命令調べてみないとだけど、bit testでjnzするほうが命令数少なそう。
0回、1回、2回、3回目のインクリメントで4以下の数字をランダムで求める。4の場合は逃げられる。それ以外は2以下の数を書き込む。必ず成功しなくなる。
ビット制約があり正しい作りなならこういう作りかな?
ファミコンではその「ランダム」も曲者っていう印象だけど一つの乱数を共用している場合「4」までしか発生しない(乱数に制限を設ける)ということができないように思う「逃げている」とかをフラグ管理しようと思ったら、メモリ等の制約上それはそれで難しそうだし
あのあたりの実装だと、1バイトの乱数を線形合同法で回してるぐらいじゃないかな。4まで欲しければ2bit取ればいい。綺麗な乱数ではないから、使い方を誤ると悲劇が起こる [srad.jp]
メモリをケチった状況での乱数といえばドルアーガの塔。全60面ありますが、面番号を種とした8bit乱数を使ってアルゴリズム生成した迷路なので、マップデータはゼロ。FLOOR 60 だけは面番号ではなく255を種にしていて、その結果乱数が「オール1になる」という偏りが発生し、「生成した壁が必ず左方向に伸びていく」ので、横線だけという最終面にふさわしい乱数感のないマップのできあがり。乱数の偏りを逆手に取った面白いアイデアと思いました。
乱数の偶数奇数って挙動で発生した残念 [fc2.com]な仕様 [fc2.com]は「ロマンシング サガ -ミンストレルソング-」って作品でもありましたね。クロスクレイモア欲しかった。2本目(3本目)のエスパーダ・ロペラも。
何かの時間(フレーム)とかをキーに乱数テーブルから拾ってくればいい。だから真面目に乱数を拾ってこなくてもいいんだよ。10ステップくらいで求められるレベルで作るのがコツでしょ。これが工夫。
ランダムを音にすると値がホワイトノイズになります。アナログ値読み取る場合は半導体から出るノイズをランダム値として使えます。
サンプリングしたホワイトノイズをループさせても配列から読み取っているのと同じになります。
>乱数テーブルから拾ってくればいい
乱数ルーチンを置くなら常駐の16Kbyteの中に書かなきゃならんので、そんなテーブルを置く余裕はないです。
タイミング次第で最悪ループしますよね。計算で求めた(擬似)乱数にソルトとして加えるならば分かりますが、時間だけで結果が決まるのは危険だと思いますね。
最近、この手の「昔は無理だったことを今の技術知識でできるからって、昔の製品(の製作者)に対してマウントを取りに行く」人をよく見かけますねぇ
しかもたいていは妄想と思い込みが前提で主張が間違っているw
より多くのコメントがこの議論にあるかもしれませんが、JavaScriptが有効ではない環境を使用している場合、クラシックなコメントシステム(D1)に設定を変更する必要があります。
開いた括弧は必ず閉じる -- あるプログラマー
まあそうだろうなと (スコア:0)
30年の時を経て当事者が直接語るというのは感慨深いが、
話の中身自体は特に何か当事者にしか知り得ない興味深い事情とか裏話があるわけではなく、
現象(8回なにかすると別のフラグが立つ)から容易に想像がつく、フットプリントできるだけ小さくするための
実装上の制約以上のものではなかったですね。
しかし逃げるコマンドの回数をカウントしなきゃいけない理由がわからない。
雑魚敵に対して
>>ドラクエIVでは4回目の「にげる」で必ず逃げられる
という仕様は限られたメモリ空間を3bitも消費する価値があるほど重要だったのだろうか。
一回あたりの逃げ成功確立を適当に設定しておけば十分な気が。
あと「4回試行でかならず成功」を実装するだけならカウンタは2bitで十分な気が。
Re: (スコア:0)
> あと「4回試行でかならず成功」を実装するだけならカウンタは2bitで十分な気が。
ニコニコ大百科の記事によると、逃げる回数のカウンタは下位2ビットで、下から3ビット目は「時の砂を使用したかどうか」のフラグのようですね。
Re: (スコア:0)
単純に加算で実装していたから逃げ続けると2ビットをオーバーして3ビット目4ビット目までどんどん立っちゃうって話じゃないの?
Re: (スコア:0)
2bitの逃げるカウンタと会心フラグの間に他のフラグがある事も容易に想像がつくはずですが?
Re: (スコア:0)
>2bitの逃げるカウンタと会心フラグの間に他のフラグがある事も容易に想像がつくはずですが?
ああそのとおりですね、4回目以降8回目までにも別フラグが立つことによる副作用がありえたわけですね、
会心の一撃フラグがあまりに強烈なので8回という数字が際立っただけで。
逃げ続けると他のフラグもたって何かべつのことが起きてるのだろうか。
Re:まあそうだろうなと (スコア:1)
まあ、ストーリーの元になった記事からして「逃げるカウンタが3bit」って間違えちゃってますので、しかたないですけど、
下位から順番に
1~2: 逃げ回数(通常の戦闘は 11 = 3回逃げた時は確実に逃げられるはずなので、2bitで十分)
3: 時の砂使用済(戦闘状態の保存処理を0の場合のみ行うことで、使った時の状態に差し戻せるようにする)
4: パルプンテの結果が「ちからがみなぎってきた」だった(すべての攻撃が会心の一撃になる)
5: 敵を倒した(1体でも倒したら戦闘終了時のメッセージが「○○をやっつけた」になり、1体も倒せなかった時は「○○はいなくなった」に)
6: 不明
7: 敵が複数種類かどうか(戦闘終了時の「○○(モンスター名)をやっつけた」が、「まもののむれ」表記になる)
8: 不思議な霧状態かどうか(該当時は敵味方全員呪文の効果がなくなる)
と、戦闘中の状態をbitフラグで管理しています。
たくさん逃げ続ければ他の状態も変更可能ですが、戦闘中に使って意味ありそうなのはあとは8bit目ぐらいでしょうか。
また、3bit目は時の砂フラグなので「時の砂を使う+4回逃げる」でも8逃げ可能。
Re: (スコア:0)
となると、さらにもう1度8回逃げると普通に戻るわけですね。
Re: (スコア:0)
時の砂は「使った時の状態に戻る」んじゃなくて「使った時にひとつ前のターンに戻る」だぞい
Re:まあそうだろうなと (スコア:1)
すみません、なんか勘違いしてました。
戦闘中に2回以上時の砂が使われることはないので、
時の砂を使って巻き戻した後は、もう巻き戻すことはないから状態保存は不要
ってことで負荷軽減のためらしいですね。
涙ぐましすぎる…
Re: (スコア:0)
涙ぐましすぎる…
Zガンダム「君は、時の涙を見る」
Re: (スコア:0)
だんだん脱線してきたけど、
>3: 時の砂使用済(戦闘状態の保存処理を0の場合のみ行うことで、使った時の状態に差し戻せるようにする)
爪に火を灯すレベルのメモリ節約をしてんのに、なんでこんな"戦闘状態の保存"を必要とする時の砂なんてアイテムを実装したんだろうか、ゲームの本質ともストーリーイベントともかかわってこないのに。
ドラクエIVにもなると(カセット側に積んだ)RAMにかなり余裕ができて比較的自由に使えるようになってたんだろうかね。
そうするとIVにおける2bit逃げカウンタと各種フラグのパックは、I,IIを実装した際に沁みついたプログラマの性でそうしただけで、
もうこの世代ではハードウェア的には必ずしも要求されてたわけではないのかも。
Re: (スコア:0)
カートリッジ側に128KBのRAMを積んでいても、そのうち同時にマッピングできるのは8KBで
一時的な退避ならともかく、ワークエリアとしては使い辛いのではないかと。
それにこの種のカウンタはゼロページに置きたいしね。
(0000h~00FFhのアドレスはレジスタ的な使い方ができる。)
Re: (スコア:0)
6502の命令調べてみないとだけど、bit testでjnzするほうが命令数少なそう。
Re: (スコア:0)
するためには回数をカウントする必要がある
成功率そのものが逃げるたびにだんんだん上がっていって4回目で100%に到達という仕様
Re: (スコア:0)
0回、1回、2回、
3回目のインクリメントで4以下の数字をランダムで求める。
4の場合は逃げられる。それ以外は2以下の数を書き込む。
必ず成功しなくなる。
ビット制約があり正しい作りなならこういう作りかな?
Re: (スコア:0)
ファミコンではその「ランダム」も曲者っていう印象だけど
一つの乱数を共用している場合「4」までしか発生しない(乱数に制限を設ける)ということができないように思う
「逃げている」とかをフラグ管理しようと思ったら、メモリ等の制約上それはそれで難しそうだし
Re: (スコア:0)
あのあたりの実装だと、1バイトの乱数を線形合同法で回してるぐらいじゃないかな。
4まで欲しければ2bit取ればいい。
綺麗な乱数ではないから、使い方を誤ると悲劇が起こる [srad.jp]
Re:まあそうだろうなと (スコア:2)
メモリをケチった状況での乱数といえばドルアーガの塔。
全60面ありますが、面番号を種とした8bit乱数を使ってアルゴリズム生成した迷路なので、マップデータはゼロ。
FLOOR 60 だけは面番号ではなく255を種にしていて、その結果乱数が「オール1になる」という偏りが発生し、
「生成した壁が必ず左方向に伸びていく」ので、横線だけという最終面にふさわしい乱数感のないマップのできあがり。
乱数の偏りを逆手に取った面白いアイデアと思いました。
Re: (スコア:0)
乱数の偶数奇数って挙動で発生した残念 [fc2.com]な仕様 [fc2.com]は「ロマンシング サガ -ミンストレルソング-」って作品でもありましたね。
クロスクレイモア欲しかった。2本目(3本目)のエスパーダ・ロペラも。
Re: (スコア:0)
何かの時間(フレーム)とかをキーに乱数テーブルから拾ってくればいい。
だから真面目に乱数を拾ってこなくてもいいんだよ。
10ステップくらいで求められるレベルで作るのがコツでしょ。
これが工夫。
ランダムを音にすると値がホワイトノイズになります。
アナログ値読み取る場合は半導体から出るノイズを
ランダム値として使えます。
サンプリングしたホワイトノイズをループさせても
配列から読み取っているのと同じになります。
Re: (スコア:0)
>乱数テーブルから拾ってくればいい
乱数ルーチンを置くなら常駐の16Kbyteの中に書かなきゃならんので、そんなテーブルを置く余裕はないです。
Re: (スコア:0)
タイミング次第で最悪ループしますよね。計算で求めた(擬似)乱数にソルトとして加えるならば分かりますが、時間だけで結果が決まるのは危険だと思いますね。
Re: (スコア:0)
最近、この手の
「昔は無理だったことを今の技術知識でできるからって、昔の製品(の製作者)に対してマウントを取りに行く」
人をよく見かけますねぇ
しかもたいていは妄想と思い込みが前提で主張が間違っているw