Advertisement
izu000

Get Item Manipulation

Jul 15th, 2016
353
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.11 KB | None | 0 0
  1. 「何故 GIM を使うと、最初のアイテムとも宝箱のアイテムともまったく無関係のアイテムが手に入るのか」の部分だけわかったので一旦まとめ。
  2. 何かおかしな部分があったら教えて下さい。ツイッターとかで。
  3. This is a Japanese explanation of a basic mechanics of GIM.
  4. It's not a new discovery at all and everything explained in this document can be seen here.
  5. http://forums.zeldaspeedruns.com/index.php?topic=1785.0
  6. http://www.zeldaspeedruns.com/oot/tech/get-item-manipulation
  7.  
  8. --------------------------------------------------------------------------------
  9.  
  10. 値の名前
  11. Get Item Table: アイテム入手に関係する ID が入った表。ここで見ることができる。
  12. http://wiki.cloudmodding.com/oot/Get_Items_(ovl_player_actor)#Get_Item_Table
  13. Get Item Value: アイテム入手の時一番最初に取得される値で、Get Item Table の参照に使う。Get Item Table の Index と同じ値。
  14. Item: Get Item Table の 1 つめの列。メニュー画面に追加するアイテムのデータ ID。
  15. RBA に使う値と同じ(デクの棒 = 0, フロル = 13, ムシ = 29)。ただしデクの実など一部例外あり。
  16. Text: アイテム入手時に表示するテキストの ID。
  17. 他の列の ID は調査中...
  18.  
  19. アイテムを入手する時の大体の流れは以下の通り。
  20. 1. アイテムに触れる、または宝箱の前に立つことで Get Item Value を取得する。
  21. 宝箱の前に立つときはマイナス付きで Get Item Value を取得する。
  22. 2. 宝箱の場合は、宝箱を開くときに Get Item Value をプラスに戻す。
  23. 3. アイテムをかかげる。Get Item Value を使って Get Item Table のオフセットを計算し、表の中から入手したアイテムと対応する ID を探して取得する。
  24. 4. ID を使ってモデルデータ、アイテムデータ、テキストデータなど、対応する各ファイルにアクセスしてデータを取得する。
  25.  
  26. GIM を行う場合は、この手順の後以下の操作を行う。
  27. 5. 宝箱の前に立って新しい Get Item Value (マイナス付き)を取得する。
  28. 6. 水に入ることで「アイテムを掲げる」アクションが呼び出され、もう一度手順 3 と 4 が繰り返される。
  29.  
  30. おかしな現象が起きる原因のひとつはこの「宝箱の前に立つと Get Item Value がマイナス付きで保存されること」にある。Get Item Value は本来「Get Item Table の何番目の行を見ればいいのか」を表すための値なので、これがマイナスであるということは表の最初の行よりも上、つまりまったく別のファイルのデータを見ることになり、結果関係のないデータをアイテムの ID だと思い込んで無関係なアイテムファイルにアクセスしてしまう、ということである。
  31.  
  32. 青いクスリ GIM を例として実際のデータを見てみる。
  33. 1. デクの実に触れて、Get Item Value 2 を取得する。
  34. 2. 宝箱ではないので符号変換操作は行わない。
  35. 3. デクの実を掲げる。Get Item Value は 2 なので、これを使ってオフセットを計算。計算式は (index-1) * 6 なので、6 がデクの実用の Get Item Table オフセットとなる。やや複雑だが、この計算結果と Get Item Table の始まりのアドレスを足せば Get Item Table 内のデクの実のデータ開始アドレスが計算できる、ということである。
  36. http://i.imgur.com/B36E9Hx.jpg
  37. 計算で出したアドレスから、アイテム ID = 0x8C、 Flag = 0x0C, GI ID = 0xEE...と、1 バイトずつ各 ID を取り出す。
  38. 4. 取り出した ID から各ファイルにアクセスし、デクの実のデータを取得する。
  39. 5. マップの宝箱の前に立ち、マップの Get Item Value をマイナス付きで取得する。マップの Get Item Value は 0x41 (10 進数では 65)なので、Get Item Value として -0x41 (-65) が読み込まれる。
  40. 6. 水に入り、手順 3 を繰り返す。新しい Get Item Value を使ってオフセットを計算。計算式 (index-1) * 6 を使うと、 (-65 - 1) * 6 = -396 となるので、Get Item Table 開始アドレスから 0x18C (396) を「引いた」値がこれから ID を取得しようとしているアドレスとなる。実際にそのアドレスを見てみると、17EA 0167 0009 という数値が見つかる。本来はアイテム入手とは関係のないデータだが、これを順に ID と見なし、アイテム ID = 0x17, Flag = 0x0C, GI ID = 0x01, Text ID = 0x67...と取り出す。最後にこの ID(として取り出した値)を使って各ファイルにアクセスする。
  41.  
  42. Get Item Table または ZSR の Item Chart を見ると 0x17 (10 進数では 23) は青い薬のアイテム ID であることがわかる。また、4 回目に取り出される ID は 0x67 だが、これは Get Item Table を見るとコンパスの行の Text ID と一致する。
  43. http://i.imgur.com/AWkGeAL.jpg
  44. *アドレスは 1.2 版のもの。
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement