ootAI/oot/save_context.ml

151 lines
4.4 KiB
OCaml

open import "prelude.ml"
open import "../pretty.ml"
open import "../mem/decode.ml"
open import "../mem/int.ml"
open import "./item_equips.ml"
open import "./inventory.ml"
type save_context = SaveContext of {
entrance_index: s32,
link_age: s32,
cutscene_index: s32,
day_time: u16,
night_flag: s32,
num_days: s32,
claim_days: s32,
(* char newf[6], *)
deaths: s16,
(* char playerName[8], *)
n64dd_flag: s16,
health_capacity: s16,
health: s16,
magic_level: s8,
magic: s8,
rupees: s16,
sword_health: u16,
navi_timer: u16,
magic_acquired: u8,
(* char unk_3B[0x01], *)
double_magic: u8,
double_defense: u8,
bgs_flag: u8,
ocarina_game_reward: u8,
child_equips: item_equips,
adult_equips: item_equips,
(* u32 unk_54, *)
(* char unk_58[0x0E], *)
saved_scene_num: s16,
equips: item_equips,
inventory: inventory
}
instance decode save_context begin
let decode addr =
let! entrance_index = decode (addr + 0x0000)
let! link_age = decode (addr + 0x0004)
let! cutscene_index = decode (addr + 0x0008)
let! day_time = decode (addr + 0x000C)
let! night_flag = decode (addr + 0x0010)
let! num_days = decode (addr + 0x0014)
let! claim_days = decode (addr + 0x0018)
(* newf, *)
let! deaths = decode (addr + 0x0022)
(* player_name, *)
let! n64dd_flag = decode (addr + 0x002C)
let! health_capacity = decode (addr + 0x002E)
let! health = decode (addr + 0x0030)
let! magic_level = decode (addr + 0x0032)
let! magic = decode (addr + 0x0033)
let! rupees = decode (addr + 0x0034)
let! sword_health = decode (addr + 0x0036)
let! navi_timer = decode (addr + 0x0038)
let! magic_acquired = decode (addr + 0x003A)
(* unk_3B *)
let! double_magic = decode (addr + 0x003C)
let! double_defense = decode (addr + 0x003D)
let! bgs_flag = decode (addr + 0x003E)
let! ocarina_game_reward = decode (addr + 0x003F)
let! child_equips = decode (addr + 0x0040)
let! adult_equips = decode (addr + 0x004A)
(* unk_54, *)
let! saved_scene_num = decode (addr + 0x0066)
let! equips = decode (addr + 0x0068)
let! inventory = decode (addr + 0x0074)
let save_context = SaveContext {
entrance_index = entrance_index,
link_age = link_age,
cutscene_index = cutscene_index,
day_time = day_time,
night_flag = night_flag,
num_days = num_days,
claim_days = claim_days,
(* newf = *)
deaths = deaths,
(* playerName = *)
n64dd_flag = n64dd_flag,
health_capacity = health_capacity,
health = health,
magic_level = magic_level,
magic = magic,
rupees = rupees,
sword_health = sword_health,
navi_timer = navi_timer,
magic_acquired = magic_acquired,
(* unk_3B = *)
double_magic = double_magic,
double_defense = double_defense,
bgs_flag = bgs_flag,
ocarina_game_reward = ocarina_game_reward,
child_equips = child_equips,
adult_equips = adult_equips,
(* unk_54 = *)
(* unk_58 = *)
saved_scene_num = saved_scene_num,
equips = equips,
inventory: inventory
}
pure save_context
end
instance prettyrecord save_context begin
let name _ = "SaveContext"
let fields (SaveContext x) =
[
("entrance_index", S x.entrance_index),
("link_age", S x.link_age),
("cutscene_index", S x.cutscene_index),
("day_time", S x.day_time),
("night_flag", S x.night_flag),
("num_days", S x.num_days),
("claim_days", S x.claim_days),
(* ("newf", S x.newf ), *)
("deaths", S x.deaths),
(* ("player_name", S x.player_name) *)
("n64dd_flag", S x.n64dd_flag),
("health_capacity", S x.health_capacity),
("health", S x.health),
("magic_level", S x.magic_level),
("magic", S x.magic),
("rupees", S x.rupees),
("sword_health", S x.sword_health),
("navi_timer", S x.navi_timer),
("magic_acquired", S x.magic_acquired),
(* ("unk_3B", *)
("double_magic", S x.double_magic),
("double_defense", S x.double_defense),
("bgs_flag", S x.bgs_flag),
("ocarina_game_reward", S x.ocarina_game_reward),
("child_equips", P x.child_equips),
("adult_equips", P x.adult_equips),
(* ("unk_54" *)
(* ("unk_58" *)
("saved_scene_num", S x.saved_scene_num),
("equips", P x.equips),
("inventory", P x.inventory)
]
end
instance pretty save_context begin
let pretty = pretty_from_record
end