購入後の所持金と福引券取得の関係
DQ1・2
【判定法】プログラムのROMアドレス(PC)004812-004827
購入後の所持金を16進数にして3バイト(#$00-FF)の合計を計算する。
一番下の位(0-F)が1か3であれば条件を満たす。
(アイテムの空きの検索処理は未確認だが空きが2つ以上ないと貰えないはず)
一覧表はこちらから
所持金Xはメモリの7E0C81,7E0C82,7E0C83に格納されている。
・エクセル的に条件を書くと以下のようになる
A: 7E0C81の一の位 MOD(X;16)
B: 7E0C82の一の位 MOD(INT(X/256);16)
C: 7E0C83の一の位 MOD(INT(X/65536);16)
IF(OR(MOD(A+B+C;16)=1;MOD(A+B+C;16)=3);"もらえる";"もらえない")
【数学的に考えてみる】→従来の式は間違ってはいない。電卓使って16進数で考える方が楽
購入後の所持金をY、「Yを65536で割った時の商をA」,余りをq(1)とする。
Y = 65536×A + q(1)
q(1)を「256で割ったときの商をB」,余りをq(2)とする。
q(1) = 256×B + q(2)
A,B,q(2)の和を16で割ったときの商をC,余りをXとする。
A+B+q(2) = 16×C + X
Y = 65536×A + 256×B + (16×C + X - A - B) ①
(= 65535×A + 255×B + 16×C + X ②(要注意))
X = Y + A + B - (65536×A + 256×B + 16×C) ③
Xが1または3となるYが福引券をもらうことのできる金額である。
所持金が65536未満であればA=0なので従来の式「255*m+16*n+1,3」は間違ってはいない。
ただ、mが所持金を256で割ったときの商であることに気づかないと間違った結果になる。
~式に関する注意~
Bは255で割ったときの商ではなく、256で割ったときの商である!(Aも同様)
例えば511の場合に②の式を使って
511 = 65535×(0) + 255×(2) + 16×(0) + 1
とすると間違いである(511<256*2 A=0,B=2,C=0,X=1)
正しくは③式より
X = 511 + 0 + 1 - (65536×0 + 256×1 + 16×C) = 256 - 16×C = 0
(A=0,B=1,C=16)
【(所持金<65536(=#$10000)の時の)16進数で金額のばらつきについて考える】
ここでは+1型と+3型は比較せず、同型の貰える金額の差を考えてゆく。
・一般的に貰える金額は#$10間隔である。(#$01,11,21,...,F1)
・1,2桁目(1と16の位)が繰り上がるときは3桁目が+1されるので1桁目は-1されなければならない。
そのため間隔は#$0Fとなる。(#$0F1->100; 5FC->60B; EF5->F04)
1,2,3桁目が繰り上がるときも同様である(_FF2->_001(+F)※_は0~E)
ただし、1の位が0の時は1,2桁目が繰り上がるには#$10以上増えなければならないので-1するかわりに+Fされ、間隔が#$1Fとなる。
(#$01F0->20F; 11F0->120F) 1,2桁目が繰り上がるのは16回に一回、金額が#$10*0F+0For1F = #$FFor10F( =255or271)増えるたびに起きるはずである。
間隔が1Fとなるのも同様に16*16=256回に一回、つまり#$1000(10進数で4096)増えるたびに起きる
<間隔が奇数になった例>
#$100→#$20F(+#$10F) →#$30E(+FF) →...→#$1001(+FF) →#$1100(+FF) →#$120F(+10F)
#$30→#$40F(+#$10F) →#$50E(+FF) →...→#$1201(+FF) →#$1300(+FF) →#$140F(+10F)
購入後の所持金を16進数にして3バイト(#$00-FF)の合計を計算する。
一番下の位(0-F)が1か3であれば条件を満たす。
(アイテムの空きの検索処理は未確認だが空きが2つ以上ないと貰えないはず)
一覧表はこちらから
所持金Xはメモリの7E0C81,7E0C82,7E0C83に格納されている。
・エクセル的に条件を書くと以下のようになる
A: 7E0C81の一の位 MOD(X;16)
B: 7E0C82の一の位 MOD(INT(X/256);16)
C: 7E0C83の一の位 MOD(INT(X/65536);16)
IF(OR(MOD(A+B+C;16)=1;MOD(A+B+C;16)=3);"もらえる";"もらえない")
【数学的に考えてみる】→従来の式は間違ってはいない。電卓使って16進数で考える方が楽
購入後の所持金をY、「Yを65536で割った時の商をA」,余りをq(1)とする。
Y = 65536×A + q(1)
q(1)を「256で割ったときの商をB」,余りをq(2)とする。
q(1) = 256×B + q(2)
A,B,q(2)の和を16で割ったときの商をC,余りをXとする。
A+B+q(2) = 16×C + X
Y = 65536×A + 256×B + (16×C + X - A - B) ①
(= 65535×A + 255×B + 16×C + X ②(要注意))
X = Y + A + B - (65536×A + 256×B + 16×C) ③
Xが1または3となるYが福引券をもらうことのできる金額である。
所持金が65536未満であればA=0なので従来の式「255*m+16*n+1,3」は間違ってはいない。
ただ、mが所持金を256で割ったときの商であることに気づかないと間違った結果になる。
~式に関する注意~
Bは255で割ったときの商ではなく、256で割ったときの商である!(Aも同様)
例えば511の場合に②の式を使って
511 = 65535×(0) + 255×(2) + 16×(0) + 1
とすると間違いである(511<256*2 A=0,B=2,C=0,X=1)
正しくは③式より
X = 511 + 0 + 1 - (65536×0 + 256×1 + 16×C) = 256 - 16×C = 0
(A=0,B=1,C=16)
【(所持金<65536(=#$10000)の時の)16進数で金額のばらつきについて考える】
ここでは+1型と+3型は比較せず、同型の貰える金額の差を考えてゆく。
・一般的に貰える金額は#$10間隔である。(#$01,11,21,...,F1)
・1,2桁目(1と16の位)が繰り上がるときは3桁目が+1されるので1桁目は-1されなければならない。
そのため間隔は#$0Fとなる。(#$0F1->100; 5FC->60B; EF5->F04)
1,2,3桁目が繰り上がるときも同様である(_FF2->_001(+F)※_は0~E)
ただし、1の位が0の時は1,2桁目が繰り上がるには#$10以上増えなければならないので-1するかわりに+Fされ、間隔が#$1Fとなる。
(#$01F0->20F; 11F0->120F) 1,2桁目が繰り上がるのは16回に一回、金額が#$10*0F+0For1F = #$FFor10F( =255or271)増えるたびに起きるはずである。
間隔が1Fとなるのも同様に16*16=256回に一回、つまり#$1000(10進数で4096)増えるたびに起きる
<間隔が奇数になった例>
#$100→#$20F(+#$10F) →#$30E(+FF) →...→#$1001(+FF) →#$1100(+FF) →#$120F(+10F)
#$30→#$40F(+#$10F) →#$50E(+FF) →...→#$1201(+FF) →#$1300(+FF) →#$140F(+10F)
PR
Comment form
カレンダー
10 | 2024/11 | 12 |
S | M | T | W | T | F | S |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
最新記事
(12/18)
(04/18)
(09/15)
(09/11)
(06/21)
プロフィール
HN:
bamboo
性別:
非公開
自己紹介:
2010年の3月ごろニコニコ生放送のゲーム放送でRTAを知ってよく見るようになった。
どちらかというとゲームはプレイするものじゃなくてプレイを"みる"ものだと思っている。
逆アセンブル解析というのをかじったものの放置していたが、某放送の影響で解析を再開。
2を初クリアしたのは2011.3.10。ブログの内容はSFC版ドラクエ1・2の解析がメイン。最近はjavascriptとかluaをある程度扱えるようになったので、botでルート検証とかできたらと思いつつも進んでいない。
要点をまとめたり文章書くのが苦手なので記事が長ったらしかったり、日本語のようで日本語でなかったりする。プログラム用語が使えるようになりたいかも。
ツイッター: https://twitter.com/bamb00h
ブログに公開せずツイートのみの情報もあり(twilog)
どちらかというとゲームはプレイするものじゃなくてプレイを"みる"ものだと思っている。
逆アセンブル解析というのをかじったものの放置していたが、某放送の影響で解析を再開。
2を初クリアしたのは2011.3.10。ブログの内容はSFC版ドラクエ1・2の解析がメイン。最近はjavascriptとかluaをある程度扱えるようになったので、botでルート検証とかできたらと思いつつも進んでいない。
要点をまとめたり文章書くのが苦手なので記事が長ったらしかったり、日本語のようで日本語でなかったりする。プログラム用語が使えるようになりたいかも。
ツイッター: https://twitter.com/bamb00h
ブログに公開せずツイートのみの情報もあり(twilog)
ブログ内検索
最古記事
(09/17)
(09/17)
(09/18)
(02/04)
(02/07)
カウンター
忍者アナライズ