71 lines
1.8 KiB
OCaml
71 lines
1.8 KiB
OCaml
open import "prelude.ml"
|
|
open import "../pretty.ml"
|
|
open import "../mem/decode.ml"
|
|
open import "../mem/int.ml"
|
|
|
|
type inventory = Inventory of {
|
|
items: list u8,
|
|
ammo: list s8,
|
|
equipment: u16,
|
|
upgrades: u32,
|
|
quest_items: u32,
|
|
dungeon_items: list u8,
|
|
dungeon_keys: list s8,
|
|
defense_hearts: s8,
|
|
gs_tokens: s16
|
|
}
|
|
|
|
let rec private init_tailrec i f acc =
|
|
if i <= 0 then
|
|
acc
|
|
else
|
|
init_tailrec (i - 1) f ((f i) :: acc)
|
|
|
|
let init i f =
|
|
init_tailrec i f []
|
|
|
|
instance decode inventory begin
|
|
let decode addr =
|
|
let! items = traverse decode (init 24 (fun i -> addr + 0x00 + i))
|
|
let! ammo = traverse decode (init 16 (fun i -> addr + 0x18 + i))
|
|
let! equipment = decode (addr + 0x28)
|
|
let! upgrades = decode (addr + 0x2C)
|
|
let! quest_items = decode (addr + 0x30)
|
|
let! dungeon_items = traverse decode (init 20 (fun i -> addr + 0x34 + i))
|
|
let! dungeon_keys = traverse decode (init 19 (fun i -> addr + 0x48 + i))
|
|
let! defense_hearts = decode (addr + 0x5B)
|
|
let! gs_tokens = decode (addr + 0x5C)
|
|
let inventory = Inventory {
|
|
items = items,
|
|
ammo = ammo,
|
|
equipment = equipment,
|
|
upgrades = upgrades,
|
|
quest_items = quest_items,
|
|
dungeon_items = dungeon_items,
|
|
dungeon_keys = dungeon_keys,
|
|
defense_hearts = defense_hearts,
|
|
gs_tokens = gs_tokens
|
|
}
|
|
pure inventory
|
|
end
|
|
|
|
instance prettyrecord inventory begin
|
|
let name _ = "Inventory"
|
|
let fields (Inventory x) =
|
|
[
|
|
("items", S x.items),
|
|
("ammo", S x.ammo),
|
|
("equipment", S x.equipment),
|
|
("upgrades", S x.upgrades),
|
|
("quest_items", S x.quest_items),
|
|
("dungeon_items", S x.dungeon_items),
|
|
("dungeon_keys", S x.dungeon_keys),
|
|
("defense_hearts", S x.defense_hearts),
|
|
("gs_tokens", S x.gs_tokens)
|
|
]
|
|
end
|
|
|
|
instance pretty inventory begin
|
|
let pretty = pretty_from_record
|
|
end
|