diff --git a/.gitignore b/.gitignore index 135090ea..a5c37886 100644 --- a/.gitignore +++ b/.gitignore @@ -14,4 +14,6 @@ dump/* *.dll build.ninja ac-decomp.code-workspace -assets/ \ No newline at end of file +assets/ +tools/cli.ini +tools/cli.py \ No newline at end of file diff --git a/README.MD b/README.MD index 53827bfd..c8cc2092 100644 --- a/README.MD +++ b/README.MD @@ -1,6 +1,8 @@ -# Animal Crossing Decompilation [![Discord Channel][discord-badge]][discord] +# Animal Crossing Decompilation [![Discord Channel][discord-badge]][discord] ![rel progress] ![dol progress] [discord]: https://discord.gg/hKx3FJJgrV [discord-badge]: https://img.shields.io/discord/727908905392275526?color=%237289DA&logo=discord&logoColor=%23FFFFFF +[rel progress]: https://img.shields.io/endpoint?label=rel&url=https%3A%2F%2Fprogress.decomp.club%2Fdata%2Fanimalcrossing%2Fus%2Frel%2F%3Fmode%3Dshield%26measure%3Dcode +[dol progress]: https://img.shields.io/endpoint?label=dol&url=https%3A%2F%2Fprogress.decomp.club%2Fdata%2Fanimalcrossing%2Fus%2Fdol%2F%3Fmode%3Dshield%26measure%3Dcode Decompilation in progress of Animal Crossing (GAFE01) diff --git a/generate_progress.py b/generate_progress.py new file mode 100644 index 00000000..5c97a49e --- /dev/null +++ b/generate_progress.py @@ -0,0 +1,47 @@ +from argparse import ArgumentParser +import os.path +import pickle +import json +from typing import Dict, Tuple + +import common as c + +def load_progress_info(ctx: c.SourceContext, asm_list: str + ) -> Tuple[Dict[str, int], Dict[str, int]]: + assert os.path.exists(ctx.labels), "Error: analysis has not ran!" + + # Get data + raw = c.get_cmd_stdout(f"{c.PROGRESS} {ctx.binary} {ctx.labels} {ctx.slices}") + dat = json.loads(raw) + assert dat.get("version") == 2, "Outdated progress json version, try a clean & rebuild" + decomp_sizes = dat["decomp_slices_sizes"] + total_sizes = dat["total_sizes"] + symbol_sizes = dat["symbol_sizes"] + + # Subtract undecompiled functions in decompiled slices + # TODO: this assumes none of .init is decompiled + with open(asm_list, 'rb') as f: + funcs = pickle.load(f) + for func in funcs: + decomp_sizes[".text"] -= symbol_sizes[str(func)] + + return decomp_sizes, total_sizes + +def generate_frogress_json(dol_size, dol_total, rel_size, rel_total): + return json.dumps({ + "rel": { + "code": rel_size, + "code/total": rel_total + }, + "dol": { + "code": dol_size, + "code/total": dol_total + } + }) + +if __name__=="__main__": + decomp_sizes, total_sizes = load_progress_info(c.DOL_CTX, c.DOL_ASM_LIST) + rel_decomp_sizes, rel_total_sizes = load_progress_info(c.REL_CTX, c.REL_ASM_LIST) + json_str = generate_frogress_json(decomp_sizes[".text"], total_sizes[".text"], rel_decomp_sizes[".text"], rel_total_sizes[".text"]) + with open("out/progress.json", "w") as f: + f.write(json_str) diff --git a/include/m_name_table.h b/include/m_name_table.h index 78be918a..dd9a6d71 100644 --- a/include/m_name_table.h +++ b/include/m_name_table.h @@ -61,6 +61,78 @@ enum { mNT_TREE_TYPE_NUM }; +enum { + mNT_ITEM_TYPE_NONE, + mNT_ITEM_TYPE_APPLE, + mNT_ITEM_TYPE_ORANGE, + mNT_ITEM_TYPE_PEACH, + mNT_ITEM_TYPE_PEAR, + mNT_ITEM_TYPE_NUTS, + mNT_ITEM_TYPE_MATSUTAKE, + mNT_ITEM_TYPE_KABU, + mNT_ITEM_TYPE_FISH, + mNT_ITEM_TYPE_BAG, + mNT_ITEM_TYPE_LEAF, + mNT_ITEM_TYPE_ROLL, + mNT_ITEM_TYPE_BOX, + mNT_ITEM_TYPE_PACK, + mNT_ITEM_TYPE_PRESENT, + mNT_ITEM_TYPE_SEED, + mNT_ITEM_TYPE_HANIWA, + mNT_ITEM_TYPE_ETC, + mNT_ITEM_TYPE_CAGE, + mNT_ITEM_TYPE_TOOL, + mNT_ITEM_TYPE_FOSSIL, + mNT_ITEM_TYPE_TRASH, + mNT_ITEM_TYPE_LETTER, + mNT_ITEM_TYPE_OTOSI, + mNT_ITEM_TYPE_SHELLA, + mNT_ITEM_TYPE_SHELLB, + mNT_ITEM_TYPE_SHELLC, + mNT_ITEM_TYPE_CANDY, + mNT_ITEM_TYPE_COCONUT, + mNT_ITEM_TYPE_OMIKUJI, + mNT_ITEM_TYPE_CLOTH, + mNT_ITEM_TYPE_CARPET, + mNT_ITEM_TYPE_WALL, + mNT_ITEM_TYPE_AXE, + mNT_ITEM_TYPE_NET, + mNT_ITEM_TYPE_ROD, + mNT_ITEM_TYPE_SHOVEL, + mNT_ITEM_TYPE_AXE2, + mNT_ITEM_TYPE_NET2, + mNT_ITEM_TYPE_ROD2, + mNT_ITEM_TYPE_SHOVEL2, + mNT_ITEM_TYPE_UMBRELLA, + mNT_ITEM_TYPE_KAZA, + mNT_ITEM_TYPE_UTIWA, + mNT_ITEM_TYPE_PAPER, + mNT_ITEM_TYPE_FLOWER_SEED, + mNT_ITEM_TYPE_HUKUBUKURO, + mNT_ITEM_TYPE_TAISOU, + mNT_ITEM_TYPE_MD, + mNT_ITEM_TYPE_TICKET, + mNT_ITEM_TYPE_BONE, + mNT_ITEM_TYPE_DIARY, + mNT_ITEM_TYPE_FORK_ON, + + mNT_ITEM_TYPE_NUM +}; + +enum { + mNT_TREE_SIZE_FULL, + mNT_TREE_SIZE_S2, + mNT_TREE_SIZE_S1, + mNT_TREE_SIZE_S0, + + mNT_TREE_SIZE_NUM +}; + +typedef struct offset_table_s { + int type; + mCoBG_OffsetTable_c table; +} mNT_offset_table_c; + /* TODO: these should be calculated via definitions later */ #define NPC_NUM 236 #define NPC_ISLANDER_NUM 18 @@ -90,6 +162,9 @@ enum { #define NOT_SECRET_MD_NUM 52 #define UMBRELLA_NUM 32 +extern s16 move_obj_profile_table[]; +extern s16 actor_profile_table[]; +extern s16 props_profile_table[]; extern u8 npc_looks_table[]; extern int mNT_check_unknown(mActor_name_t item_no); diff --git a/rel/m_name_table.c b/rel/m_name_table.c index 43dd3fea..71a217d0 100644 --- a/rel/m_name_table.c +++ b/rel/m_name_table.c @@ -1,7 +1,59 @@ #include "m_name_table.h" +#include "m_actor.h" #include "m_npc_personal_id.h" +s16 move_obj_profile_table[] = { + mAc_PROFILE_AIRPLANE, + mAc_PROFILE_BALL, + mAc_PROFILE_MY_ROOM, + mAc_PROFILE_MBG, + mAc_PROFILE_BOXMANAGER, + mAc_PROFILE_BOXTRICK01, + mAc_PROFILE_ARRANGE_ROOM, + mAc_PROFILE_ARRANGE_FURNITURE, + mAc_PROFILE_EFFECT_CONTROL, + mAc_PROFILE_SHOP_DESIGN, + mAc_PROFILE_SHOP_MANEKIN, + mAc_PROFILE_SHOP_INDOOR, + mAc_PROFILE_SHOP_GOODS, + mAc_PROFILE_SNOWMAN, + mAc_PROFILE_SNOWMAN, + mAc_PROFILE_BROKER_DESIGN, + mAc_PROFILE_MY_INDOOR, + mAc_PROFILE_TRAIN_WINDOW, + mAc_PROFILE_UKI, + mAc_PROFILE_SHOP_UMBRELLA, + mAc_PROFILE_KAMAKURA_INDOOR, + mAc_PROFILE_HOUSE_CLOCK +}; + +s16 actor_profile_table[] = { + mAc_PROFILE_SAMPLE +}; + +s16 props_profile_table[] = { + mAc_PROFILE_MAILBOX, + mAc_PROFILE_MAILBOX, + mAc_PROFILE_MAILBOX, + mAc_PROFILE_MAILBOX, + mAc_PROFILE_HANIWA, + mAc_PROFILE_HANIWA, + mAc_PROFILE_HANIWA, + mAc_PROFILE_HANIWA, + mAc_PROFILE_PSNOWMAN, + mAc_PROFILE_PSNOWMAN, + mAc_PROFILE_PSNOWMAN, + mAc_PROFILE_PSNOWMAN, + mAc_PROFILE_PSNOWMAN, + mAc_PROFILE_PSNOWMAN, + mAc_PROFILE_PSNOWMAN, + mAc_PROFILE_PSNOWMAN, + mAc_PROFILE_PSNOWMAN, + mAc_PROFILE_TRAINDOOR, + mAc_PROFILE_NAMEPLATE +}; + u8 npc_looks_table[NPC_NUM] = { mNpc_LOOKS_BOY, mNpc_LOOKS_NANIWA_LADY, @@ -242,3 +294,510 @@ u8 npc_looks_table[NPC_NUM] = { mNpc_LOOKS_BOY, mNpc_LOOKS_KO_GIRL }; + +static u8 item1_0_tableNo[] = { + 44, 44, 44, 44, + 44, 44, 44, 44, + 44, 44, 44, 44, + 44, 44, 44, 44, + 44, 44, 44, 44, + 44, 44, 44, 44, + 44, 44, 44, 44, + 44, 44, 44, 44, + 44, 44, 44, 44, + 44, 44, 44, 44, + 44, 44, 44, 44, + 44, 44, 44, 44, + 44, 44, 44, 44, + 44, 44, 44, 44, + 44, 44, 44, 44, + 44, 44, 44, 44, + 44, 44, 44, 44, + 44, 44, 44, 44, + 44, 44, 44, 44, + 44, 44, 44, 44, + 44, 44, 44, 44, + 44, 44, 44, 44, + 44, 44, 44, 44, + 44, 44, 44, 44, + 44, 44, 44, 44, + 44, 44, 44, 44, + 44, 44, 44, 44, + 44, 44, 44, 44, + 44, 44, 44, 44, + 44, 44, 44, 44, + 44, 44, 44, 44, + 44, 44, 44, 44, + 44, 44, 44, 44, + 44, 44, 44, 44, + 44, 44, 44, 44, + 44, 44, 44, 44, + 44, 44, 44, 44, + 44, 44, 44, 44, + 44, 44, 44, 44, + 44, 44, 44, 44, + 44, 44, 44, 44, + 44, 44, 44, 44, + 44, 44, 44, 44, + 44, 44, 44, 44, + 44, 44, 44, 44, + 44, 44, 44, 44, + 44, 44, 44, 44, + 44, 44, 44, 44, + 44, 44, 44, 44, + 44, 44, 44, 44, + 44, 44, 44, 44, + 44, 44, 44, 44, + 44, 44, 44, 44, + 44, 44, 44, 44, + 44, 44, 44, 44, + 44, 44, 44, 44, + 44, 44, 44, 44, + 44, 44, 44, 44, + 44, 44, 44, 44, + 44, 44, 44, 44, + 44, 44, 44, 44, + 44, 44, 44, 44, + 44, 44, 44, 44, + 44, 44, 44, 44 +}; + +static u8 item1_1_tableNo[] = { + 9, 9, 9, 9 +}; + +static u8 item1_2_tableNo[] = { + 34, 33, 36, 35, + 41, 41, 41, 41, + 41, 41, 41, 41, + 41, 41, 41, 41, + 41, 41, 41, 41, + 41, 41, 41, 41, + 41, 41, 41, 41, + 41, 41, 41, 41, + 41, 41, 41, 41, + 41, 41, 41, 41, + 41, 41, 41, 41, + 19, 19, 19, 19, + 19, 19, 19, 19, + 19, 19, 19, 19, + 19, 38, 37, 40, + 39, 33, 33, 33, + 33, 33, 33, 33, + 19, 19, 19, 19, + 19, 19, 19, 19, + 42, 42, 42, 42, + 42, 42, 42, 42, + 43, 43, 43, 43, + 43, 43, 43, 43 +}; + +static u8 item1_3_tableNo[] = { + 8, 8, 8, 8, + 8, 8, 8, 8, + 8, 8, 8, 8, + 8, 8, 8, 8, + 8, 8, 8, 8, + 8, 8, 8, 8, + 8, 8, 8, 8, + 8, 8, 8, 8, + 8, 8, 8, 8, + 8, 8, 8, 8 +}; + +static u8 item1_4_tableNo[] = { + 30, 30, 30, 30, + 30, 30, 30, 30, + 30, 30, 30, 30, + 30, 30, 30, 30, + 30, 30, 30, 30, + 30, 30, 30, 30, + 30, 30, 30, 30, + 30, 30, 30, 30, + 30, 30, 30, 30, + 30, 30, 30, 30, + 30, 30, 30, 30, + 30, 30, 30, 30, + 30, 30, 30, 30, + 30, 30, 30, 30, + 30, 30, 30, 30, + 30, 30, 30, 30, + 30, 30, 30, 30, + 30, 30, 30, 30, + 30, 30, 30, 30, + 30, 30, 30, 30, + 30, 30, 30, 30, + 30, 30, 30, 30, + 30, 30, 30, 30, + 30, 30, 30, 30, + 30, 30, 30, 30, + 30, 30, 30, 30, + 30, 30, 30, 30, + 30, 30, 30, 30, + 30, 30, 30, 30, + 30, 30, 30, 30, + 30, 30, 30, 30, + 30, 30, 30, 30, + 30, 30, 30, 30, + 30, 30, 30, 30, + 30, 30, 30, 30, + 30, 30, 30, 30, + 30, 30, 30, 30, + 30, 30, 30, 30, + 30, 30, 30, 30, + 30, 30, 30, 30, + 30, 30, 30, 30, + 30, 30, 30, 30, + 30, 30, 30, 30, + 30, 30, 30, 30, + 30, 30, 30, 30, + 30, 30, 30, 30, + 30, 30, 30, 30, + 30, 30, 30, 30, + 30, 30, 30, 30, + 30, 30, 30, 30, + 30, 30, 30, 30, + 30, 30, 30, 30, + 30, 30, 30, 30, + 30, 30, 30, 30, + 30, 30, 30, 30, + 30, 30, 30, 30, + 30, 30, 30, 30, + 30, 30, 30, 30, + 30, 30, 30, 30, + 30, 30, 30, 30, + 30, 30, 30, 30, + 30, 30, 30, 30, + 30, 30, 30, 30, + 30, 30, 30 +}; + +static u8 item1_5_tableNo[] = { + 22, 13, 13, 13, + 13, 13, 13, 13, + 13, 13, 13, 13, + 13, 9, 21, 21, + 21, 20, 23, 29, + 25, 24, 24, 24, + 25, 25, 24, 26, + 14, 11, 19, 14, + 14, 14, 14, 47, + 47, 47, 47, 47, + 47, 47, 47, 47, + 47, 47, 47, 47, + 52 +}; + +static u8 item1_6_tableNo[] = { + 31, 31, 31, 31, + 31, 31, 31, 31, + 31, 31, 31, 31, + 31, 31, 31, 31, + 31, 31, 31, 31, + 31, 31, 31, 31, + 31, 31, 31, 31, + 31, 31, 31, 31, + 31, 31, 31, 31, + 31, 31, 31, 31, + 31, 31, 31, 31, + 31, 31, 31, 31, + 31, 31, 31, 31, + 31, 31, 31, 31, + 31, 31, 31, 31, + 31, 31, 31, 31, + 31, 31, 31 +}; + +static u8 item1_7_tableNo[] = { + 32, 32, 32, 32, + 32, 32, 32, 32, + 32, 32, 32, 32, + 32, 32, 32, 32, + 32, 32, 32, 32, + 32, 32, 32, 32, + 32, 32, 32, 32, + 32, 32, 32, 32, + 32, 32, 32, 32, + 32, 32, 32, 32, + 32, 32, 32, 32, + 32, 32, 32, 32, + 32, 32, 32, 32, + 32, 32, 32, 32, + 32, 32, 32, 32, + 32, 32, 32, 32, + 32, 32, 32 +}; + +static u8 item1_8_tableNo[] = { + 1, 5, 4, 3, + 2, 6, 27, 28 +}; + +static u8 item1_9_tableNo[] = { + 17, 17, 45, 45, + 45, 45, 45, 45, + 45, 45, 45 +}; + +static u8 item1_A_tableNo[] = { + 48, 48, 48, 48, + 48, 48, 48, 48, + 48, 48, 48, 48, + 48, 48, 48, 48, + 48, 48, 48, 48, + 48, 48, 48, 48, + 48, 48, 48, 48, + 48, 48, 48, 48, + 48, 48, 48, 48, + 48, 48, 48, 48, + 48, 48, 48, 48, + 48, 48, 48, 48, + 48, 48, 48, 48, + 48, 48, 48 +}; + +// ?? Shouldn't these be different from saplings? +static u8 item1_B_tableNo[] = { + 17, 17, 17, 17, + 17, 17, 17, 17, + 17, 17, 17, 17, + 17, 17, 17, 17 +}; + +static u8 item1_C_tableNo[] = { + 49, 49, 49, 49, + 49, 49, 49, 49, + 49, 49, 49, 49, + 49, 49, 49, 49, + 49, 49, 49, 49, + 49, 49, 49, 49, + 49, 49, 49, 49, + 49, 49, 49, 49, + 49, 49, 49, 49, + 49, 49, 49, 49, + 49, 49, 49, 49, + 49, 49, 49, 49, + 49, 49, 49, 49, + 49, 49, 49, 49, + 49, 49, 49, 49, + 49, 49, 49, 49, + 49, 49, 49, 49, + 49, 49, 49, 49, + 49, 49, 49, 49, + 49, 49, 49, 49, + 49, 49, 49, 49, + 49, 49, 49, 49, + 49, 49, 49, 49, + 49, 49, 49, 49 +}; + +static u8 item1_D_tableNo[] = { + 18, 18, 18, 18, + 18, 18, 18, 18, + 18, 18, 18, 18, + 18, 18, 18, 18, + 18, 18, 18, 18, + 18, 18, 18, 18, + 18, 18, 18, 18, + 18, 18, 18, 18, + 18, 18, 18, 18, + 18, 18, 18, 18, + 18, 18, 18, 18, + 18 +}; + +static u8 item1_E_tableNo[] = { + 46, 46 +}; + +static u8 item1_F_tableNo[] = { + 7, 7, 7, 7 +}; + +extern int mNT_get_itemTableNo(mActor_name_t item) { + static u8* item1_tableNo[ITEM1_CAT_NUM] = { + + }; + + switch (ITEM_NAME_GET_TYPE(item)) { + case NAME_TYPE_FTR0: + case NAME_TYPE_FTR1: + { + if (item >= FTR_DINO_START && item <= FTR_DINO_END) { + return mNT_ITEM_TYPE_BONE; + } + else if (item >= HANIWA_START && item <= HANIWA_END) { + return mNT_ITEM_TYPE_HANIWA; + } + else if (item >= ITM_DIARY_START && item <= ITM_DIARY15) { + return mNT_ITEM_TYPE_DIARY; + } + + return mNT_ITEM_TYPE_LEAF; + } + + case NAME_TYPE_ITEM1: + { + return item1_tableNo[ITEM_NAME_GET_CAT(item)][ITEM_NAME_GET_INDEX(item)]; + } + } + + return mNT_ITEM_TYPE_NONE; +} + +extern mActor_name_t mNT_FishIdx2FishItemNo(int idx) { + if (idx >= 0 && idx < (FISH_NUM + 2)) { + return ITM_FISH_START + idx; + } + + return EMPTY_NO; +} + +extern mActor_name_t bg_item_fg_sub(mActor_name_t item, s16 flag) { + // TODO: tree type enum + static mActor_name_t cnvfg[mNT_TREE_SIZE_NUM][mNT_TREE_TYPE_NUM] = { + { TREE_STUMP004, TREE_PALM_STUMP004, CEDAR_TREE_STUMP004, GOLD_TREE_STUMP004 }, + { TREE_STUMP003, TREE_PALM_STUMP003, CEDAR_TREE_STUMP003, GOLD_TREE_STUMP003 }, + { TREE_STUMP002, TREE_PALM_STUMP002, CEDAR_TREE_STUMP002, GOLD_TREE_STUMP002 }, + { TREE_STUMP001, TREE_PALM_STUMP001, CEDAR_TREE_STUMP001, GOLD_TREE_STUMP001 } + }; + + int tree_type = FGTreeType_check(item); + mActor_name_t conv = item; + + if (flag == 0) { + if ( + item == TREE || + item == TREE_1000BELLS || + item == TREE_10000BELLS || + item == TREE_30000BELLS || + item == TREE_100BELLS || + item == CEDAR_TREE || + item == GOLD_TREE_SHOVEL || + item == GOLD_TREE || + item == TREE_APPLE_NOFRUIT_0 || + item == TREE_APPLE_NOFRUIT_1 || + item == TREE_APPLE_NOFRUIT_2 || + item == TREE_APPLE_FRUIT || + item == TREE_ORANGE_NOFRUIT_0 || + item == TREE_ORANGE_NOFRUIT_1 || + item == TREE_ORANGE_NOFRUIT_2 || + item == TREE_ORANGE_FRUIT || + item == TREE_PEACH_NOFRUIT_0 || + item == TREE_PEACH_NOFRUIT_1 || + item == TREE_PEACH_NOFRUIT_2 || + item == TREE_PEACH_FRUIT || + item == TREE_PEAR_NOFRUIT_0 || + item == TREE_PEAR_NOFRUIT_1 || + item == TREE_PEAR_NOFRUIT_2 || + item == TREE_PEAR_FRUIT || + item == TREE_CHERRY_NOFRUIT_0 || + item == TREE_CHERRY_NOFRUIT_1 || + item == TREE_CHERRY_NOFRUIT_2 || + item == TREE_CHERRY_FRUIT || + item == TREE_PALM_NOFRUIT_0 || + item == TREE_PALM_NOFRUIT_1 || + item == TREE_PALM_NOFRUIT_2 || + item == TREE_PALM_FRUIT || + item == TREE_BEES || + item == TREE_FTR || + item == TREE_LIGHTS || + item == TREE_PRESENT || + item == TREE_BELLS || + item == CEDAR_TREE_BELLS || + item == CEDAR_TREE_FTR || + item == CEDAR_TREE_BEES || + item == CEDAR_TREE_LIGHTS || + item == GOLD_TREE_BELLS || + item == GOLD_TREE_FTR || + item == GOLD_TREE_BEES + ) { + conv = cnvfg[mNT_TREE_SIZE_FULL][tree_type]; + } + else if ( + item == TREE_S2 || + item == TREE_APPLE_S2 || + item == TREE_ORANGE_S2 || + item == TREE_PEACH_S2 || + item == TREE_PEAR_S2 || + item == TREE_CHERRY_S2 || + item == TREE_1000BELLS_S2 || + item == TREE_10000BELLS_S2 || + item == TREE_30000BELLS_S2 || + item == TREE_100BELLS_S2 || + item == TREE_PALM_S2 || + item == CEDAR_TREE_S2 || + item == GOLD_TREE_S2 + ) { + conv = cnvfg[mNT_TREE_SIZE_S2][tree_type]; + } + else if ( + item == TREE_S1 || + item == TREE_APPLE_S1 || + item == TREE_ORANGE_S1 || + item == TREE_PEACH_S1 || + item == TREE_PEAR_S1 || + item == TREE_CHERRY_S1 || + item == TREE_1000BELLS_S1 || + item == TREE_10000BELLS_S1 || + item == TREE_30000BELLS_S1 || + item == TREE_100BELLS_S1 || + item == TREE_PALM_S1 || + item == CEDAR_TREE_S1 || + item == GOLD_TREE_S1 + ) { + conv = cnvfg[mNT_TREE_SIZE_S1][tree_type]; + } + else if ( + item == TREE_S0 || + item == TREE_APPLE_S0 || + item == TREE_ORANGE_S0 || + item == TREE_PEACH_S0 || + item == TREE_PEAR_S0 || + item == TREE_CHERRY_S0 || + item == TREE_1000BELLS_S0 || + item == TREE_10000BELLS_S0 || + item == TREE_30000BELLS_S0 || + item == TREE_100BELLS_S0 || + item == TREE_PALM_S0 || + item == CEDAR_TREE_S0 || + item == GOLD_TREE_S0 + ) { + conv = cnvfg[mNT_TREE_SIZE_S0][tree_type]; + } + } + + return conv; +} + +extern mNT_offset_table_c* obj_hight_table_item0_nogrow(mActor_name_t item) { + static mNT_offset_table_c height_table[3] = { + + }; + + mNT_offset_table_c* table = &height_table[0]; + + if ( + item == FENCE0 || + item == FENCE1 || + item == MESSAGE_BOARD0 || + item == MESSAGE_BOARD1 || + item == WOOD_FENCE + ) { + table = &height_table[1]; + } + else if ( + item == MAP_BOARD0 || + item == MAP_BOARD1 || + item == MUSIC_BOARD0 || + item == MUSIC_BOARD1 + ) { + table = &height_table[2]; + } + + return height_table; +} + +extern mActor_name_t bg_item_fg_sub_tree_grow(mActor_name_t item, int past_days, int check_plant) { + +} diff --git a/upload_frogress.py b/upload_frogress.py new file mode 100644 index 00000000..673bb3d5 --- /dev/null +++ b/upload_frogress.py @@ -0,0 +1,76 @@ +#!/usr/bin/env python3 + +### +# Uploads progress information to https://github.com/decompals/frogress. +# +# Usage: +# python3 tools/upload_progress.py -b https://progress.decomp.club/ -p [project] -v [version] build/[version]/progress.json +# +# If changes are made, please submit a PR to +# https://github.com/encounter/dtk-template +### + +import argparse +import json +import os +import requests +import subprocess +import sys + + +def get_git_commit_timestamp() -> int: + return int( + subprocess.check_output(["git", "show", "-s", "--format=%ct"]) + .decode("ascii") + .rstrip() + ) + + +def get_git_commit_sha() -> str: + return subprocess.check_output(["git", "rev-parse", "HEAD"]).decode("ascii").strip() + + +def generate_url(args: argparse.Namespace) -> str: + url_components = [args.base_url.rstrip("/"), "data"] + + for arg in [args.project, args.version]: + if arg != "": + url_components.append(arg) + + return str.join("/", url_components) + "/" + + +if __name__ == "__main__": + parser = argparse.ArgumentParser(description="Upload progress information.") + parser.add_argument("-b", "--base_url", help="API base URL", required=True) + parser.add_argument("-a", "--api_key", help="API key (env var PROGRESS_API_KEY)") + parser.add_argument("-p", "--project", help="Project slug", required=True) + parser.add_argument("-v", "--version", help="Version slug", required=True) + parser.add_argument("input", help="Progress JSON input") + + args = parser.parse_args() + api_key = args.api_key or os.environ.get("PROGRESS_API_KEY") + if not api_key: + raise "API key required" + url = generate_url(args) + + entries = [] + with open(args.input, "r") as f: + data = json.load(f) + entries.append( + { + "timestamp": get_git_commit_timestamp(), + "git_hash": get_git_commit_sha(), + "categories": data, + } + ) + + print("Publishing entry to", url) + json.dump(entries[0], sys.stdout, indent=4) + print() + r = requests.post(url, json={ + "api_key": api_key, + "entries": entries, + }) + r.raise_for_status() + print("Done!") \ No newline at end of file