diff --git a/generated/goods.txt b/generated/goods.txt new file mode 100644 index 0000000000..d3fdbba2f1 --- /dev/null +++ b/generated/goods.txt @@ -0,0 +1,140 @@ +UG_GOOD_NONE +UG_GOOD_PC_NORMAL_FLAG +UG_GOOD_PC_BRONZE_FLAG +UG_GOOD_PC_SILVER_FLAG +UG_GOOD_PC_GOLD_FLAG +UG_GOOD_PC_PLATINUM_FLAG +UG_GOOD_BIG_BOULDER +UG_GOOD_YELLOW_CUSHION +UG_GOOD_BLUE_CUSHION +UG_GOOD_WOODEN_CHAIR +UG_GOOD_BIG_TABLE +UG_GOOD_PLAIN_TABLE +UG_GOOD_SMALL_TABLE +UG_GOOD_LONG_TABLE +UG_GOOD_WIDE_TABLE +UG_GOOD_POKE_TABLE +UG_GOOD_BIG_BOOKSHELF +UG_GOOD_SMALL_BOOKSHELF +UG_GOOD_RESEARCH_SHELF +UG_GOOD_BIKE_RACK +UG_GOOD_SHOP_SHELF +UG_GOOD_DISPLAY_SHELF +UG_GOOD_CUPBOARD +UG_GOOD_WOOD_DRESSER +UG_GOOD_PINK_DRESSER +UG_GOOD_TV +UG_GOOD_REFRIGERATOR +UG_GOOD_PRETTY_SINK +UG_GOOD_FEATHERY_BED +UG_GOOD_TRASH_CAN +UG_GOOD_CARDBOARD_BOX +UG_GOOD_CRATE +UG_GOOD_CONTAINER +UG_GOOD_OIL_DRUM +UG_GOOD_BIG_OIL_DRUM +UG_GOOD_IRON_BEAM +UG_GOOD_POTTED_PLANT +UG_GOOD_POKE_FLOWER +UG_GOOD_HEALING_MACHINE +UG_GOOD_LAB_MACHINE +UG_GOOD_TEST_MACHINE +UG_GOOD_GAME_SYSTEM +UG_GOOD_VENDING_MACHINE +UG_GOOD_RED_BIKE +UG_GOOD_GREEN_BIKE +UG_GOOD_BINOCULARS +UG_GOOD_GLOBE +UG_GOOD_GYM_STATUE +UG_GOOD_RED_TENT +UG_GOOD_BLUE_TENT +UG_GOOD_CLEAR_TENT +UG_GOOD_MAZE_BLOCK_1 +UG_GOOD_MAZE_BLOCK_2 +UG_GOOD_MAZE_BLOCK_3 +UG_GOOD_MAZE_BLOCK_4 +UG_GOOD_MAZE_BLOCK_5 +UG_GOOD_HOLE_TOOL +UG_GOOD_PIT_TOOL +UG_GOOD_SMOKE_TOOL +UG_GOOD_BIG_SMOKE_TOOL +UG_GOOD_ROCK_TOOL +UG_GOOD_ROCKFALL_TOOL +UG_GOOD_FOAM_TOOL +UG_GOOD_BUBBLE_TOOL +UG_GOOD_ALERT_TOOL_1 +UG_GOOD_ALERT_TOOL_2 +UG_GOOD_ALERT_TOOL_3 +UG_GOOD_ALERT_TOOL_4 +UG_GOOD_LEAF_TOOL +UG_GOOD_FLOWER_TOOL +UG_GOOD_EMBER_TOOL +UG_GOOD_FIRE_TOOL +UG_GOOD_CUTE_CUP +UG_GOOD_COOL_CUP +UG_GOOD_BEAUTY_CUP +UG_GOOD_TOUGH_CUP +UG_GOOD_CLEVER_CUP +UG_GOOD_BLUE_CRYSTAL +UG_GOOD_PINK_CRYSTAL +UG_GOOD_RED_CRYSTAL +UG_GOOD_YELLOW_CRYSTAL +UG_GOOD_PRETTY_GEM +UG_GOOD_SHINY_GEM +UG_GOOD_MYSTIC_GEM +UG_GOOD_GLITTER_GEM +UG_GOOD_BRONZE_TROPHY +UG_GOOD_SILVER_TROPHY +UG_GOOD_GOLD_TROPHY +UG_GOOD_GREAT_TROPHY_UNUSED +UG_GOOD_BALL_ORNAMENT_UNUSED +UG_GOOD_ROUND_ORNAMENT_UNUSED +UG_GOOD_CLEAR_ORNAMENT_UNUSED +UG_GOOD_CHARMANDER_DOLL +UG_GOOD_BULBASAUR_DOLL +UG_GOOD_SQUIRTLE_DOLL +UG_GOOD_CYNDAQUIL_DOLL +UG_GOOD_CHIKORITA_DOLL +UG_GOOD_TOTODILE_DOLL +UG_GOOD_TORCHIC_DOLL +UG_GOOD_TREECKO_DOLL +UG_GOOD_MUDKIP_DOLL +UG_GOOD_CHIMCHAR_DOLL +UG_GOOD_TURTWIG_DOLL +UG_GOOD_PIPLUP_DOLL +UG_GOOD_PIKACHU_DOLL +UG_GOOD_PLUSLE_DOLL +UG_GOOD_MINUN_DOLL +UG_GOOD_CLEFAIRY_DOLL +UG_GOOD_JIGGLYPUFF_DOLL +UG_GOOD_WOBBUFFET_DOLL +UG_GOOD_MEOWTH_DOLL +UG_GOOD_SKITTY_DOLL +UG_GOOD_GLAMEOW_DOLL +UG_GOOD_BUNEARY_DOLL +UG_GOOD_WEAVILE_DOLL +UG_GOOD_MUNCHLAX_DOLL +UG_GOOD_BONSLY_DOLL +UG_GOOD_MIME_JR_DOLL +UG_GOOD_LUCARIO_DOLL +UG_GOOD_MANTYKE_DOLL +UG_GOOD_BUIZEL_DOLL +UG_GOOD_CHATOT_DOLL +UG_GOOD_MANAPHY_DOLL_UNUSED +UG_GOOD_SNORLAX_DOLL +UG_GOOD_WAILORD_DOLL +UG_GOOD_MAGNEZONE_DOLL_UNUSED +UG_GOOD_DRIFLOON_DOLL +UG_GOOD_HAPPINY_DOLL +UG_GOOD_PACHIRISU_DOLL +UG_GOOD_BASE_ENTRANCE_NORTH +UG_GOOD_BASE_ENTRANCE_SOUTH +UG_GOOD_BASE_ENTRANCE_WEST +UG_GOOD_BASE_ENTRANCE_EAST +UG_GOOD_WIDE_SOFA +UG_GOOD_BONSAI +UG_GOOD_DAINTY_FLOWERS +UG_GOOD_LOVELY_FLOWERS +UG_GOOD_PRETTY_FLOWERS +UG_GOOD_LAVISH_FLOWERS +UG_GOOD_MAX \ No newline at end of file diff --git a/generated/meson.build b/generated/meson.build index 11401a4615..e476ed7035 100644 --- a/generated/meson.build +++ b/generated/meson.build @@ -51,14 +51,15 @@ metang_generators = { 'egg_groups': { 'type': 'enum', 'tag': 'EggGroup' }, 'evolution_methods': { 'type': 'enum', 'tag': 'EvolutionMethod' }, 'exp_rates': { 'type': 'enum', 'tag': 'ExpRate' }, - 'game_records': { 'type': 'enum', 'tag': 'GameRecord' }, 'fade_types': { 'type': 'enum', 'tag': 'FadeType' }, 'first_arrival_to_zones': { 'type': 'enum', 'tag': 'FirstArrivalToZone' }, 'footprint_sizes': { 'type': 'enum', 'tag': 'FootprintSize' }, 'frontier_trainers': { 'type': 'enum', 'tag': 'FrontierTrainerID' }, + 'game_records': { 'type': 'enum', 'tag': 'GameRecord' }, 'gender_ratios': { 'type': 'enum', 'tag': 'GenderRatio' }, 'genders': { 'type': 'enum', 'tag': 'Gender' }, 'giratina_shadow_animations': {'type': 'enum', 'tag': 'GiratinaShadowAnimation'}, + 'goods': { 'type': 'enum', 'tag': 'Good' }, 'hidden_locations': { 'type': 'enum', 'tag': 'HiddenLocation' }, 'item_ai_categories': { 'type': 'enum', 'tag': 'ItemAICategory' }, 'item_battle_categories': { 'type': 'enum', 'tag': 'ItemBattleCategory' }, @@ -110,6 +111,7 @@ metang_generators = { 'trainer_message_types': { 'type': 'enum', 'tag': 'TrainerMessageType' }, 'trainer_score_events': { 'type': 'enum', 'tag': 'TrainerScoreEvent' }, 'trainer_types': { 'type': 'enum', 'tag': 'TrainerType' }, + 'traps': { 'type': 'enum', 'tag': 'Trap' }, 'tutor_locations': {'type': 'enum', 'tag': 'TutorLocation'}, 'vars_flags': {'type': 'enum', 'tag': 'VarFlag'}, 'versions': {'type': 'enum', 'tag': 'Version'}, diff --git a/generated/traps.txt b/generated/traps.txt new file mode 100644 index 0000000000..03633b25c4 --- /dev/null +++ b/generated/traps.txt @@ -0,0 +1,35 @@ +TRAP_NONE +TRAP_MOVE_UP +TRAP_MOVE_RIGHT +TRAP_MOVE_DOWN +TRAP_MOVE_LEFT +TRAP_HURL_UP +TRAP_HURL_RIGHT +TRAP_HURL_DOWN +TRAP_HURL_LEFT +TRAP_WARP_DUMMY +TRAP_HI_WARP_DUMMY +TRAP_HOLE +TRAP_PIT +TRAP_REVERSE +TRAP_CONFUSE +TRAP_RUN_DUMMY +TRAP_FADE_DUMMY +TRAP_SLOW_DUMMY +TRAP_SMOKE +TRAP_BIG_SMOKE +TRAP_ROCK +TRAP_ROCKFALL +TRAP_FOAM +TRAP_BUBBLE +TRAP_ALERT_1 +TRAP_ALERT_2 +TRAP_ALERT_3 +TRAP_ALERT_4 +TRAP_LEAF +TRAP_FLOWER +TRAP_EMBER +TRAP_FIRE +TRAP_RADAR_DUMMY +TRAP_DIGGER_DRILL +TRAP_MAX \ No newline at end of file diff --git a/include/constants/goods.h b/include/constants/goods.h deleted file mode 100644 index 095f51875b..0000000000 --- a/include/constants/goods.h +++ /dev/null @@ -1,144 +0,0 @@ -#ifndef POKEPLATINUM_CONSTANTS_GOODS_H -#define POKEPLATINUM_CONSTANTS_GOODS_H - -#define UG_GOOD_NONE 0 -#define UG_GOOD_PC_NORMAL_FLAG 1 -#define UG_GOOD_PC_BRONZE_FLAG 2 -#define UG_GOOD_PC_SILVER_FLAG 3 -#define UG_GOOD_PC_GOLD_FLAG 4 -#define UG_GOOD_PC_PLATINUM_FLAG 5 -#define UG_GOOD_BIG_BOULDER 6 -#define UG_GOOD_YELLOW_CUSHION 7 -#define UG_GOOD_BLUE_CUSHION 8 -#define UG_GOOD_WOODEN_CHAIR 9 -#define UG_GOOD_BIG_TABLE 10 -#define UG_GOOD_PLAIN_TABLE 11 -#define UG_GOOD_SMALL_TABLE 12 -#define UG_GOOD_LONG_TABLE 13 -#define UG_GOOD_WIDE_TABLE 14 -#define UG_GOOD_POKE_TABLE 15 -#define UG_GOOD_BIG_BOOKSHELF 16 -#define UG_GOOD_SMALL_BOOKSHELF 17 -#define UG_GOOD_RESEARCH_SHELF 18 -#define UG_GOOD_BIKE_RACK 19 -#define UG_GOOD_SHOP_SHELF 20 -#define UG_GOOD_DISPLAY_SHELF 21 -#define UG_GOOD_CUPBOARD 22 -#define UG_GOOD_WOOD_DRESSER 23 -#define UG_GOOD_PINK_DRESSER 24 -#define UG_GOOD_TV 25 -#define UG_GOOD_REFRIGERATOR 26 -#define UG_GOOD_PRETTY_SINK 27 -#define UG_GOOD_FEATHERY_BED 28 -#define UG_GOOD_TRASH_CAN 29 -#define UG_GOOD_CARDBOARD_BOX 30 -#define UG_GOOD_CRATE 31 -#define UG_GOOD_CONTAINER 32 -#define UG_GOOD_OIL_DRUM 33 -#define UG_GOOD_BIG_OIL_DRUM 34 -#define UG_GOOD_IRON_BEAM 35 -#define UG_GOOD_POTTED_PLANT 36 -#define UG_GOOD_POKE_FLOWER 37 -#define UG_GOOD_HEALING_MACHINE 38 -#define UG_GOOD_LAB_MACHINE 39 -#define UG_GOOD_TEST_MACHINE 40 -#define UG_GOOD_GAME_SYSTEM 41 -#define UG_GOOD_VENDING_MACHINE 42 -#define UG_GOOD_RED_BIKE 43 -#define UG_GOOD_GREEN_BIKE 44 -#define UG_GOOD_BINOCULARS 45 -#define UG_GOOD_GLOBE 46 -#define UG_GOOD_GYM_STATUE 47 -#define UG_GOOD_RED_TENT 48 -#define UG_GOOD_BLUE_TENT 49 -#define UG_GOOD_CLEAR_TENT 50 -#define UG_GOOD_MAZE_BLOCK_1 51 -#define UG_GOOD_MAZE_BLOCK_2 52 -#define UG_GOOD_MAZE_BLOCK_3 53 -#define UG_GOOD_MAZE_BLOCK_4 54 -#define UG_GOOD_MAZE_BLOCK_5 55 -#define UG_GOOD_HOLE_TOOL 56 -#define UG_GOOD_PIT_TOOL 57 -#define UG_GOOD_SMOKE_TOOL 58 -#define UG_GOOD_BIG_SMOKE_TOOL 59 -#define UG_GOOD_ROCK_TOOL 60 -#define UG_GOOD_ROCKFALL_TOOL 61 -#define UG_GOOD_FOAM_TOOL 62 -#define UG_GOOD_BUBBLE_TOOL 63 -#define UG_GOOD_ALERT_TOOL_1 64 -#define UG_GOOD_ALERT_TOOL_2 65 -#define UG_GOOD_ALERT_TOOL_3 66 -#define UG_GOOD_ALERT_TOOL_4 67 -#define UG_GOOD_LEAF_TOOL 68 -#define UG_GOOD_FLOWER_TOOL 69 -#define UG_GOOD_EMBER_TOOL 70 -#define UG_GOOD_FIRE_TOOL 71 -#define UG_GOOD_CUTE_CUP 72 -#define UG_GOOD_COOL_CUP 73 -#define UG_GOOD_BEAUTY_CUP 74 -#define UG_GOOD_TOUGH_CUP 75 -#define UG_GOOD_CLEVER_CUP 76 -#define UG_GOOD_BLUE_CRYSTAL 77 -#define UG_GOOD_PINK_CRYSTAL 78 -#define UG_GOOD_RED_CRYSTAL 79 -#define UG_GOOD_YELLOW_CRYSTAL 80 -#define UG_GOOD_PRETTY_GEM 81 -#define UG_GOOD_SHINY_GEM 82 -#define UG_GOOD_MYSTIC_GEM 83 -#define UG_GOOD_GLITTER_GEM 84 -#define UG_GOOD_BRONZE_TROPHY 85 -#define UG_GOOD_SILVER_TROPHY 86 -#define UG_GOOD_GOLD_TROPHY 87 -#define UG_GOOD_GREAT_TROPHY_UNUSED 88 -#define UG_GOOD_BALL_ORNAMENT_UNUSED 89 -#define UG_GOOD_ROUND_ORNAMENT_UNUSED 90 -#define UG_GOOD_CLEAR_ORNAMENT_UNUSED 91 -#define UG_GOOD_CHARMANDER_DOLL 92 -#define UG_GOOD_BULBASAUR_DOLL 93 -#define UG_GOOD_SQUIRTLE_DOLL 94 -#define UG_GOOD_CYNDAQUIL_DOLL 95 -#define UG_GOOD_CHIKORITA_DOLL 96 -#define UG_GOOD_TOTODILE_DOLL 97 -#define UG_GOOD_TORCHIC_DOLL 98 -#define UG_GOOD_TREECKO_DOLL 99 -#define UG_GOOD_MUDKIP_DOLL 100 -#define UG_GOOD_CHIMCHAR_DOLL 101 -#define UG_GOOD_TURTWIG_DOLL 102 -#define UG_GOOD_PIPLUP_DOLL 103 -#define UG_GOOD_PIKACHU_DOLL 104 -#define UG_GOOD_PLUSLE_DOLL 105 -#define UG_GOOD_MINUN_DOLL 106 -#define UG_GOOD_CLEFAIRY_DOLL 107 -#define UG_GOOD_JIGGLYPUFF_DOLL 108 -#define UG_GOOD_WOBBUFFET_DOLL 109 -#define UG_GOOD_MEOWTH_DOLL 110 -#define UG_GOOD_SKITTY_DOLL 111 -#define UG_GOOD_GLAMEOW_DOLL 112 -#define UG_GOOD_BUNEARY_DOLL 113 -#define UG_GOOD_WEAVILE_DOLL 114 -#define UG_GOOD_MUNCHLAX_DOLL 115 -#define UG_GOOD_BONSLY_DOLL 116 -#define UG_GOOD_MIME_JR_DOLL 117 -#define UG_GOOD_LUCARIO_DOLL 118 -#define UG_GOOD_MANTYKE_DOLL 119 -#define UG_GOOD_BUIZEL_DOLL 120 -#define UG_GOOD_CHATOT_DOLL 121 -#define UG_GOOD_MANAPHY_DOLL_UNUSED 122 -#define UG_GOOD_SNORLAX_DOLL 123 -#define UG_GOOD_WAILORD_DOLL 124 -#define UG_GOOD_MAGNEZONE_DOLL_UNUSED 125 -#define UG_GOOD_DRIFLOON_DOLL 126 -#define UG_GOOD_HAPPINY_DOLL 127 -#define UG_GOOD_PACHIRISU_DOLL 128 -#define UG_GOOD_BASE_ENTRANCE_NORTH 129 -#define UG_GOOD_BASE_ENTRANCE_SOUTH 130 -#define UG_GOOD_BASE_ENTRANCE_WEST 131 -#define UG_GOOD_BASE_ENTRANCE_EAST 132 -#define UG_GOOD_WIDE_SOFA 133 -#define UG_GOOD_BONSAI 134 -#define UG_GOOD_DAINTY_FLOWERS 135 -#define UG_GOOD_LOVELY_FLOWERS 136 -#define UG_GOOD_PRETTY_FLOWERS 137 -#define UG_GOOD_LAVISH_FLOWERS 138 - -#endif // POKEPLATINUM_CONSTANTS_GOODS_H diff --git a/include/constants/traps.h b/include/constants/traps.h deleted file mode 100644 index 97f7a9f552..0000000000 --- a/include/constants/traps.h +++ /dev/null @@ -1,39 +0,0 @@ -#ifndef POKEPLATINUM_CONSTANTS_TRAPS_H -#define POKEPLATINUM_CONSTANTS_TRAPS_H - -#define TRAP_NONE 0 -#define TRAP_MOVE_UP 1 -#define TRAP_MOVE_RIGHT 2 -#define TRAP_MOVE_DOWN 3 -#define TRAP_MOVE_LEFT 4 -#define TRAP_HURL_UP 5 -#define TRAP_HURL_RIGHT 6 -#define TRAP_HURL_DOWN 7 -#define TRAP_HURL_LEFT 8 -#define TRAP_WARP_DUMMY 9 -#define TRAP_HI_WARP_DUMMY 10 -#define TRAP_HOLE 11 -#define TRAP_PIT 12 -#define TRAP_REVERSE 13 -#define TRAP_CONFUSE 14 -#define TRAP_RUN_DUMMY 15 -#define TRAP_FADE_DUMMY 16 -#define TRAP_SLOW_DUMMY 17 -#define TRAP_SMOKE 18 -#define TRAP_BIG_SMOKE 19 -#define TRAP_ROCK 20 -#define TRAP_ROCKFALL 21 -#define TRAP_FOAM 22 -#define TRAP_BUBBLE 23 -#define TRAP_ALERT_1 24 -#define TRAP_ALERT_2 25 -#define TRAP_ALERT_3 26 -#define TRAP_ALERT_4 27 -#define TRAP_LEAF 28 -#define TRAP_FLOWER 29 -#define TRAP_EMBER 30 -#define TRAP_FIRE 31 -#define TRAP_RADAR_DUMMY 32 -#define TRAP_DIGGER_DRILL 33 - -#endif // POKEPLATINUM_CONSTANTS_TRAPS_H diff --git a/include/data/mart_items.h b/include/data/mart_items.h index 5a7e7f8669..790ccaac99 100644 --- a/include/data/mart_items.h +++ b/include/data/mart_items.h @@ -1,5 +1,5 @@ -#include "constants/goods.h" #include "constants/items.h" +#include "generated/goods.h" #include "generated/mart_decor_id.h" #include "generated/mart_frontier_id.h" #include "generated/mart_seal_id.h" diff --git a/include/goods.h b/include/goods.h index e5ea42c386..930c353b6e 100644 --- a/include/goods.h +++ b/include/goods.h @@ -1,15 +1,17 @@ #ifndef POKEPLATINUM_GOODS_H #define POKEPLATINUM_GOODS_H -u8 Good_GetWidth(int goodID); -u8 Good_GetDepth(int goodID); -const u8 *Good_GetCollision(int goodID); -u8 Good_GetSpherePriceType(int goodID); -u8 Good_GetSpherePriceMinSize(int goodID); -u8 Good_GetSpherePriceMaxSize(int goodID); -int Good_GetMoneyPrice(int goodID); -int Good_GetInteractMessageID(int goodID); -BOOL Good_IsNatDexRequired(int goodID); -BOOL Good_IsUngiftable(int goodID); +#include "generated/goods.h" + +u8 Good_GetWidth(enum Good goodID); +u8 Good_GetDepth(enum Good goodID); +const u8 *Good_GetCollision(enum Good goodID); +u8 Good_GetSpherePriceType(enum Good goodID); +u8 Good_GetSpherePriceMinSize(enum Good goodID); +u8 Good_GetSpherePriceMaxSize(enum Good goodID); +int Good_GetMoneyPrice(enum Good goodID); +int Good_GetInteractMessageID(enum Good goodID); +BOOL Good_IsNatDexRequired(enum Good goodID); +BOOL Good_IsUngiftable(enum Good goodID); #endif // POKEPLATINUM_GOODS_H diff --git a/include/overlay023/ov23_0223E140.h b/include/overlay023/ov23_0223E140.h index ab71258b92..e989ca958e 100644 --- a/include/overlay023/ov23_0223E140.h +++ b/include/overlay023/ov23_0223E140.h @@ -50,7 +50,8 @@ BOOL ov23_02241670(void); void ov23_02241690(int param0, int param1); enum MiningObjectIDs { - MINING_SMALL_PRISM_SPHERE = 1, + MINING_TREASURE_NONE = 0, + MINING_SMALL_PRISM_SPHERE, MINING_SMALL_PALE_SPHERE, MINING_SMALL_RED_SPHERE, MINING_SMALL_BLUE_SPHERE, diff --git a/include/overlay023/ov23_02241F74.h b/include/overlay023/ov23_02241F74.h index fa3f9cd5e7..10e2695597 100644 --- a/include/overlay023/ov23_02241F74.h +++ b/include/overlay023/ov23_02241F74.h @@ -18,7 +18,9 @@ enum UndergroundStoredPosKeys { UNDERGROUND_STORED_POS_NONE = 0, UNDERGROUND_STORED_POS_KEY_PC, UNDERGROUND_STORED_POS_KEY_START_MENU, - UNDERGROUND_STORED_POS_KEY_3, + UNDERGROUND_STORED_POS_KEY_GOODS_VENDOR, + UNDERGROUND_STORED_POS_KEY_TRAPS_VENDOR, + UNDERGROUND_STORED_POS_KEY_TREASURES_VENDOR, }; enum UndergroundMenuKeys { @@ -28,16 +30,16 @@ enum UndergroundMenuKeys { UNDERGROUND_MENU_KEY_SPHERES, UNDERGROUND_MENU_KEY_GOODS, UNDERGROUND_MENU_KEY_TREASURES, - UNDERGROUND_MENU_KEY_12, - UNDERGROUND_MENU_KEY_13, - UNDERGROUND_MENU_KEY_14, - UNDERGROUND_MENU_KEY_15, - UNDERGROUND_MENU_KEY_16, - UNDERGROUND_MENU_KEY_17, - UNDERGROUND_MENU_KEY_18, - UNDERGROUND_MENU_KEY_19, + UNDERGROUND_MENU_KEY_PAY_WITH_SPHERES, + UNDERGROUND_MENU_KEY_BUY_GOODS, + UNDERGROUND_MENU_KEY_BUY_TRAPS, + UNDERGROUND_MENU_KEY_BUY_TREASURES_UNUSED, + UNDERGROUND_MENU_KEY_SELL_GOODS, + UNDERGROUND_MENU_KEY_SELL_TRAPS, + UNDERGROUND_MENU_KEY_SELL_TREASURES, + UNDERGROUND_MENU_KEY_VENDOR_OPTIONS, UNDERGROUND_MENU_KEY_PC_RADAR = 22, - UNDERGROUND_MENU_KEY_PC + UNDERGROUND_MENU_KEY_PC, }; #define BIT_TRAPS_FULL 1 << 4 @@ -86,14 +88,14 @@ void CommManUnderground_SetSphereRadarActive(void); void CommManUnderground_SetTrapRadarActive(void); void CommManUnderground_SetTreasureRadarActive(void); void ov23_0224300C(int param0, int param1); -void ov23_02243020(int param0); +void CommManUnderground_QueueTalkedToVendorMessage(int param0); void UndergroundMan_SetReturnLog(int param0); void ov23_022430B8(int param0); void CommManUnderground_SetStoredPosKey(u16 menuKey); void CommManUnderground_StoreCursorAndListPos(u16 menuKey, u16 cursorPos, u16 listPos); u16 CommManUnderground_GetStoredListPos(u16 menuKey); u16 CommManUnderground_GetStoredCursorPos(u16 menuKey); -void ov23_022431C4(int param0, int param1, void *param2, void *param3); +void CommManUnderground_ProcessVendorTalkRequest(int param0, int param1, void *param2, void *param3); void CommManUnderground_SetCurrentSysTask(void *ctx, SysTask *sysTask, EndSysTaskFunc endFunc); void CommManUnderground_ClearCurrentSysTaskInfo(void); BOOL ov23_0224321C(void); diff --git a/include/overlay023/ov23_022521F0.h b/include/overlay023/ov23_022521F0.h deleted file mode 100644 index 94907b4082..0000000000 --- a/include/overlay023/ov23_022521F0.h +++ /dev/null @@ -1,19 +0,0 @@ -#ifndef POKEPLATINUM_OV23_022521F0_H -#define POKEPLATINUM_OV23_022521F0_H - -#include "field/field_system_decl.h" -#include "overlay023/underground_menu.h" - -int ov23_02252C70(void *param0); -void *ov23_02252C98(BOOL param0, FieldSystem *fieldSystem, int param2); -int ov23_02252C9C(int param0); -void ov23_02252CD4(void); -void ov23_02252CE0(int param0, int param1); -void ov23_02252CF4(int param0, int param1); -void ov23_02252D08(int param0, int param1); -void UndergroundMenu_PrintMenuDescription(UndergroundMenu *param0, int param1); -void UndergroundMenu_RemoveDescriptionWindow(UndergroundMenu *param0); -void UndergroundMenu_RemoveDescriptionWindowInstant(UndergroundMenu *param0); -void ov23_022534A0(FieldSystem *fieldSystem); - -#endif // POKEPLATINUM_OV23_022521F0_H diff --git a/include/overlay023/ov23_0225426C.h b/include/overlay023/ov23_0225426C.h deleted file mode 100644 index 1c7f589dee..0000000000 --- a/include/overlay023/ov23_0225426C.h +++ /dev/null @@ -1,8 +0,0 @@ -#ifndef POKEPLATINUM_OV23_0225426C_H -#define POKEPLATINUM_OV23_0225426C_H - -const u8 ov23_0225426C(const int param0); -const u8 ov23_0225427C(const int param0); -const u8 ov23_0225428C(const int param0); - -#endif // POKEPLATINUM_OV23_0225426C_H diff --git a/include/overlay023/ov23_0225429C.h b/include/overlay023/ov23_0225429C.h deleted file mode 100644 index 8d2c223507..0000000000 --- a/include/overlay023/ov23_0225429C.h +++ /dev/null @@ -1,8 +0,0 @@ -#ifndef POKEPLATINUM_OV23_0225429C_H -#define POKEPLATINUM_OV23_0225429C_H - -const u8 ov23_0225429C(const int param0); -const u8 ov23_022542AC(const int param0); -const u8 ov23_022542BC(const int param0); - -#endif // POKEPLATINUM_OV23_0225429C_H diff --git a/include/overlay023/trap_prices.h b/include/overlay023/trap_prices.h new file mode 100644 index 0000000000..77e9b843cf --- /dev/null +++ b/include/overlay023/trap_prices.h @@ -0,0 +1,10 @@ +#ifndef POKEPLATINUM_UNDERGROUND_TRAP_PRICES_H +#define POKEPLATINUM_UNDERGROUND_TRAP_PRICES_H + +#define RANDOM_SPHERE_TYPE 6 + +const u8 TrapGetSpherePriceType(const int trapID); +const u8 TrapGetSpherePriceMinSize(const int trapID); +const u8 TrapGetSpherePriceMaxSize(const int trapID); + +#endif // POKEPLATINUM_UNDERGROUND_TRAP_PRICES_H diff --git a/include/overlay023/treasure_prices.h b/include/overlay023/treasure_prices.h new file mode 100644 index 0000000000..bebdcb0e40 --- /dev/null +++ b/include/overlay023/treasure_prices.h @@ -0,0 +1,8 @@ +#ifndef POKEPLATINUM_UNDERGROUND_TREASURE_PRICES_H +#define POKEPLATINUM_UNDERGROUND_TREASURE_PRICES_H + +u8 Treasure_GetSpherePriceType(int treasureID); +u8 Treasure_GetSpherePriceMinSize(int treasureID); +u8 Treasure_GetSpherePriceMaxSize(int treasureID); + +#endif // POKEPLATINUM_UNDERGROUND_TREASURE_PRICES_H diff --git a/include/overlay023/underground_defs.h b/include/overlay023/underground_defs.h index 2507cdb3f4..d817e75869 100644 --- a/include/overlay023/underground_defs.h +++ b/include/overlay023/underground_defs.h @@ -26,6 +26,7 @@ enum SphereTypes { RED_SPHERE, BLUE_SPHERE, GREEN_SPHERE, + SPHERE_TYPE_MAX, }; typedef struct Coordinates { @@ -38,4 +39,10 @@ typedef struct Coordinates2D { u16 y; } Coordinates2D; +typedef struct SpherePrice { + u8 sphereType; + u8 minSize; + u8 maxSize; +} SpherePrice; + #endif // POKEPLATINUM_UNDERGROUND_TYPES_H diff --git a/include/overlay023/underground_menu.h b/include/overlay023/underground_menu.h index b66fc86280..20dfa6b1fa 100644 --- a/include/overlay023/underground_menu.h +++ b/include/overlay023/underground_menu.h @@ -1,5 +1,5 @@ -#ifndef POKEPLATINUM_OV23_0224F294_H -#define POKEPLATINUM_OV23_0224F294_H +#ifndef POKEPLATINUM_UNDERGROUND_MENU_H +#define POKEPLATINUM_UNDERGROUND_MENU_H #include "struct_defs/underground.h" @@ -29,6 +29,8 @@ enum UndergroundStartMenuOptions { UNDERGROUND_START_MENU_OPTION_COUNT, }; +#define SHOP_INVENTORY_SIZE 5 + typedef void (*ExitCallback)(int selectedID); typedef int (*GetItemCountFunc)(void *menu); typedef int (*GetItemFunc)(int slot, void *menu); @@ -44,11 +46,11 @@ typedef struct UndergroundMenu { Window menuDescriptionWindow; StringList *menuOptions; StringList *itemSelectedOptions; - ListMenu *unk_48; + ListMenu *listMenu; UndergroundItemListMenu *itemListMenu; ListMenu *itemSelectedMenu; Menu *menu; - StringList *unk_58; + u8 padding[4]; Menu *yesNoMenu; CursorCallback cursorCallback; PrintCallback printCallback; @@ -63,27 +65,25 @@ typedef struct UndergroundMenu { GetItemFunc getItem; GetSphereSizeFunc getSphereSize; RecordScreenContext *checkFlagsCtx; - u8 unk_274[5]; - u8 unk_279[5]; - u8 unk_27E[5]; - BOOL unk_284; - int unk_288; - int unk_28C; + u8 shopInventory[SHOP_INVENTORY_SIZE]; + u8 shopPriceTypes[SHOP_INVENTORY_SIZE]; + u8 shopPriceSizes[SHOP_INVENTORY_SIZE]; + u8 padding2[4]; + int vendorIndex; + int printerID; // pointless; written to in one place but never read int listMenuCursorPos; int listMenuListPos; - u32 unk_298; + u8 padding3[4]; u16 menuCursorPos; u32 startMenuInput; - u16 unk_2A4; - u8 unk_2A6; - u8 unk_2A7; - u8 unk_2A8; + u8 padding4[4]; + u8 shopSelection; u8 nextState; u8 state; - u8 unk_2AB; - u8 unk_2AC; - u16 unk_2AE; - u16 itemSelectedMenuCursorPos; + u8 isSelling; + u8 vendorType; + u16 listMenuPos; + u16 itemSelectedMenuPos; } UndergroundMenu; void UndergroundMenuContext_Init(Underground *underground); @@ -103,16 +103,16 @@ void UndergroundMenu_Start(ExitCallback exitCallback, FieldSystem *fieldSystem); void UndergroundMenu_EraseCurrentMenu(UndergroundMenu *menu); void UndergroundMenu_RemoveSelectedTrap(int trapID); void UndergroundMenu_PrintTrapDescription(ListMenu *listMenu, u32 index, u8 onInit); -void ov23_0224FDBC(UndergroundMenu *menu); +void UndergroundMenu_OpenSellTrapsMenu(UndergroundMenu *menu); void UndergroundMenu_OpenTrapsMenu(UndergroundMenu *menu); void UndergroundMenu_RemoveSelectedSphere(int sphereType); -void ov23_02250184(UndergroundMenu *menu); +void UndergroundMenu_OpenPayWithSpheresMenu(UndergroundMenu *menu); void UndergroundMenu_PrintTreasureDescription(ListMenu *listMenu, u32 index, u8 onInit); -void ov23_02250578(UndergroundMenu *menu); +void UndergroundMenu_OpenSellTreasuresMenu(UndergroundMenu *menu); void UndergroundMenu_OpenTreasuresMenu(UndergroundMenu *menu); void UndergroundMenu_StartHoldingFlag(ExitCallback exitCallback, FieldSystem *fieldSystem); void UndergroundMenu_PrintGoodDescription(ListMenu *listMenu, u32 index, u8 onInit); -void ov23_02250CB0(UndergroundMenu *menu); +void UndergroundMenu_OpenSellGoodsMenu(UndergroundMenu *menu); void UndergroundMenu_OpenGoodsMenu(UndergroundMenu *menu); void UndergroundMenu_OpenStoreGoodsMenu(UndergroundMenu *menu); void UndergroundMenu_OpenWithdrawGoodsMenu(UndergroundMenu *menu); @@ -122,4 +122,4 @@ void UndergroundMenu_MoveListCursorPosInBounds(UndergroundMenu *menu, int maxDis void UndergroundMenu_ResetBrightnessAndExit(SysTask *sysTask, void *data); void UndergroundMenu_UpdateScrollPrompts(UndergroundMenu *menu, int listPos, int count, int maxDisplay); -#endif // POKEPLATINUM_OV23_0224F294_H +#endif // POKEPLATINUM_UNDERGROUND_MENU_H diff --git a/include/overlay023/underground_player.h b/include/overlay023/underground_player.h index 097987f211..6207bb56ec 100644 --- a/include/overlay023/underground_player.h +++ b/include/overlay023/underground_player.h @@ -41,8 +41,8 @@ void UndergroundPlayer_ProcessHeldFlagOwnerInfoAck(int unused0, int unused1, voi BOOL UndergroundPlayer_HaveLinksReceivedHeldFlagData(void); void ov23_0224AC4C(void); BOOL UndergroundPlayer_IsAffectedByTrap(int netID); -void ov23_0224ACE8(int netID, int unused1, void *unused2, void *unused3); -void ov23_0224ACF8(int unused0, int unused1, void *data, void *unused3); +void UndergroundPlayer_ProcessVendorTalk(int netID, int unused1, void *unused2, void *unused3); +void UndergroundPlayer_ProcessVendorTalkServer(int unused0, int unused1, void *data, void *unused3); int UndergroundPlayer_GetXPos(int netID); int UndergroundPlayer_GetZPos(int netID); void UndergroundPlayer_UpdateStatus(int netID, int status); diff --git a/include/overlay023/underground_vendors.h b/include/overlay023/underground_vendors.h new file mode 100644 index 0000000000..1781116145 --- /dev/null +++ b/include/overlay023/underground_vendors.h @@ -0,0 +1,19 @@ +#ifndef POKEPLATINUM_UNDERGROUND_VENDORS_H +#define POKEPLATINUM_UNDERGROUND_VENDORS_H + +#include "field/field_system_decl.h" +#include "overlay023/underground_menu.h" + +int UndergroundVendors_ReturnFFFE(void *unused); +void *UndergroundVendors_ReturnNull(BOOL unused0, FieldSystem *unused1, int unused2); +int UndergroundVendors_PrintNPCMessage(int bankEntry); +void UndergroundVendors_EraseMessageBoxWindow(void); +void UndergroundVendors_SetTreasureNameForPrinter(int index, int treasureID); +void UndergroundVendors_SetTrapNameForPrinter(int index, int trapID); +void UndergroundVendors_SetGoodNameForPrinter(int index, int goodID); +void UndergroundMenu_PrintMenuDescription(UndergroundMenu *menu, int bankEntry); +void UndergroundMenu_RemoveDescriptionWindow(UndergroundMenu *menu); +void UndergroundMenu_RemoveDescriptionWindowInstant(UndergroundMenu *menu); +void UndergroundVendors_StartShopMenuTask(FieldSystem *fieldSystem); + +#endif // POKEPLATINUM_UNDERGROUND_VENDORS_H diff --git a/platinum.us/main.lsf b/platinum.us/main.lsf index 0b47693057..01d03652ff 100644 --- a/platinum.us/main.lsf +++ b/platinum.us/main.lsf @@ -852,11 +852,11 @@ Overlay overlay23 Object main.nef.p/src_overlay023_underground_player_talk.c.o Object main.nef.p/src_overlay023_underground_menu.c.o Object main.nef.p/src_overlay023_underground_pc.c.o - Object main.nef.p/src_overlay023_ov23_022521F0.c.o + Object main.nef.p/src_overlay023_underground_vendors.c.o Object main.nef.p/src_overlay023_underground_records.c.o Object main.nef.p/src_overlay023_underground_text_printer.c.o - Object main.nef.p/src_overlay023_ov23_0225426C.c.o - Object main.nef.p/src_overlay023_ov23_0225429C.c.o + Object main.nef.p/src_overlay023_treasure_prices.c.o + Object main.nef.p/src_overlay023_trap_prices.c.o Object main.nef.p/src_overlay023_decoration_menu.c.o Object main.nef.p/src_overlay023_base_decoration.c.o } diff --git a/res/field/scripts/scripts_battle_tower.s b/res/field/scripts/scripts_battle_tower.s index d597fca8a1..39244c2428 100644 --- a/res/field/scripts/scripts_battle_tower.s +++ b/res/field/scripts/scripts_battle_tower.s @@ -1,7 +1,7 @@ #include "macros/scrcmd.inc" #include "res/text/bank/battle_tower.h" #include "res/text/bank/menu_entries.h" -#include "constants/goods.h" +#include "generated/goods.h" ScriptEntry BattleTower_SingleDoubleBattleRoomAttendant diff --git a/res/field/scripts/scripts_eterna_city_underground_man_house.s b/res/field/scripts/scripts_eterna_city_underground_man_house.s index 735bb57e3e..b46c9dd87b 100644 --- a/res/field/scripts/scripts_eterna_city_underground_man_house.s +++ b/res/field/scripts/scripts_eterna_city_underground_man_house.s @@ -1,7 +1,7 @@ #include "macros/scrcmd.inc" #include "res/text/bank/eterna_city_underground_man_house.h" -#include "constants/goods.h" -#include "constants/traps.h" +#include "generated/goods.h" +#include "generated/traps.h" ScriptEntry _001A diff --git a/res/field/scripts/scripts_hearthome_city.s b/res/field/scripts/scripts_hearthome_city.s index 186b8ca0b7..d891a446b0 100644 --- a/res/field/scripts/scripts_hearthome_city.s +++ b/res/field/scripts/scripts_hearthome_city.s @@ -1,6 +1,6 @@ #include "macros/scrcmd.inc" #include "res/text/bank/hearthome_city.h" -#include "constants/goods.h" +#include "generated/goods.h" ScriptEntry _0082 diff --git a/res/text/underground_common.json b/res/text/underground_common.json index 9c5831e044..7cae40e96d 100644 --- a/res/text/underground_common.json +++ b/res/text/underground_common.json @@ -654,7 +654,7 @@ ] }, { - "id": "pl_msg_00000634_00112", + "id": "UndergroundCommon_Text_PlayerTalkedWithSomeone", "en_US": [ "{STRVAR_1 3, 0, 0} talked with\n", "someone." diff --git a/res/text/underground_npcs.json b/res/text/underground_npcs.json index d4c4e825bd..f0b4cb4f6b 100644 --- a/res/text/underground_npcs.json +++ b/res/text/underground_npcs.json @@ -2,165 +2,165 @@ "key": 10232, "messages": [ { - "id": "pl_msg_00000636_00000", + "id": "UndergroundNPCs_Text_IllTradeYouSomething", "en_US": [ "You’ve got a Sphere or two?\n", "If you do, I’ll trade you something." ] }, { - "id": "pl_msg_00000636_00001", + "id": "UndergroundNPCs_Text_PickSpherePrompt", "en_US": [ "Which Sphere will you trade me for\n", "my {STRVAR_1 25, 2, 0}?" ] }, { - "id": "pl_msg_00000636_00002", + "id": "UndergroundNPCs_Text_LetsDoThisTrade", "en_US": [ "All right!\n", "Let’s do this trade!" ] }, { - "id": "pl_msg_00000636_00003", + "id": "UndergroundNPCs_Text_YouDontHaveRoom", "en_US": [ "Oh, now wait a second!\n", "You don’t have any room for this!" ] }, { - "id": "pl_msg_00000636_00004", + "id": "UndergroundNPCs_Text_WrongKindOfSphere", "en_US": "That’s not the right kind of Sphere!" }, { - "id": "pl_msg_00000636_00005", + "id": "UndergroundNPCs_Text_SphereTooSmall", "en_US": [ "Hmm...\n", "No, this Sphere’s not big enough." ] }, { - "id": "pl_msg_00000636_00006", + "id": "UndergroundNPCs_Text_ItemWasObtained", "en_US": [ "The {STRVAR_1 25, 2, 0}\n", "was obtained!" ] }, { - "id": "pl_msg_00000636_00007", + "id": "UndergroundNPCs_Text_YouObtainedSphere", "en_US": [ "You obtained a {STRVAR_1 25, 2, 0},\n", "size {STRVAR_1 51, 6, 0}." ] }, { - "id": "pl_msg_00000636_00008", + "id": "UndergroundNPCs_Text_DoYouNeedAnythingElse", "en_US": "Do you need anything else?" }, { - "id": "pl_msg_00000636_00009", + "id": "UndergroundNPCs_Text_BeSeeingYouThen", "en_US": "I’ll be seeing you, then!" }, { - "id": "pl_msg_00000636_00010", + "id": "UndergroundNPCs_Text_ConfirmTradePrompt", "en_US": [ "You’ll trade your {STRVAR_1 25, 2, 0}\n", "for my {STRVAR_1 25, 4, 0}?" ] }, { - "id": "pl_msg_00000636_00011", + "id": "UndergroundNPCs_Text_AllRightLetsTrade", "en_US": [ "All right!\n", "Let’s trade!" ] }, { - "id": "pl_msg_00000636_00012", + "id": "UndergroundNPCs_Text_YouDontHaveRoomForSphere_Unused", "en_US": [ "Oh, now wait a second! You don’t\n", "have room for another Sphere!" ] }, { - "id": "pl_msg_00000636_00013", + "id": "UndergroundNPCs_Text_GetTrap", "en_US": "GET TRAP" }, { - "id": "pl_msg_00000636_00014", + "id": "UndergroundNPCs_Text_GiveTrap", "en_US": "GIVE TRAP" }, { - "id": "pl_msg_00000636_00015", + "id": "UndergroundNPCs_Text_Exit_Trap", "en_US": "EXIT" }, { - "id": "pl_msg_00000636_00016", + "id": "UndergroundNPCs_Text_GetGoods", "en_US": "GET GOODS" }, { - "id": "pl_msg_00000636_00017", + "id": "UndergroundNPCs_Text_GiveGoods", "en_US": "GIVE GOODS" }, { - "id": "pl_msg_00000636_00018", + "id": "UndergroundNPCs_Text_Exit_Goods", "en_US": "EXIT" }, { - "id": "pl_msg_00000636_00019", + "id": "UndergroundNPCs_Text_SpheresOnHand", "en_US": [ "Spheres\n", " on hand" ] }, { - "id": "pl_msg_00000636_00020", + "id": "UndergroundNPCs_Text_TrapsOnHand", "en_US": [ "Traps on\n", " hand" ] }, { - "id": "pl_msg_00000636_00021", + "id": "UndergroundNPCs_Text_GoodsOnHand", "en_US": [ "Goods on\n", " hand" ] }, { - "id": "pl_msg_00000636_00022", + "id": "UndergroundNPCs_Text_Cancel", "en_US": "CANCEL" }, { - "id": "pl_msg_00000636_00023", + "id": "UndergroundNPCs_Text_RequiredSphere", "en_US": "Required Sphere" }, { - "id": "pl_msg_00000636_00024", + "id": "UndergroundNPCs_Text_OfferedSphere", "en_US": "Offered Sphere" }, { - "id": "pl_msg_00000636_00025", + "id": "UndergroundNPCs_Text_SphereTemplate", "en_US": "{STRVAR_1 25, 2, 0} {STRVAR_1 51, 6, 0}" }, { - "id": "pl_msg_00000636_00026", + "id": "UndergroundNPCs_Text_NotForSale", "en_US": "NOT FOR SALE" }, { - "id": "pl_msg_00000636_00027", + "id": "UndergroundNPCs_Text_IllTradeSpheresForTreasures", "en_US": [ "You have any treasures? I’ll trade\n", "you some Spheres for them." ] }, { - "id": "pl_msg_00000636_00028", + "id": "UndergroundNPCs_Text_GiveTreasures", "en_US": "GIVE TREASURES" }, { - "id": "pl_msg_00000636_00029", + "id": "UndergroundNPCs_Text_TreasuresOnHand", "en_US": [ "Treasures\n", " on hand" diff --git a/src/goods.c b/src/goods.c index 7444523097..46ef831cc8 100644 --- a/src/goods.c +++ b/src/goods.c @@ -3,19 +3,13 @@ #include #include -#include "constants/goods.h" +#include "generated/goods.h" #include "overlay023/underground_defs.h" #include "res/text/bank/underground_records.h" -typedef struct SpherePrice { - u8 sphereType; - u8 minSize; - u8 maxSize; -} SpherePrice; - -typedef struct Good { +typedef struct GoodData { u8 width; u8 depth; u8 collision[9]; @@ -24,10 +18,10 @@ typedef struct Good { int interactMessageID; u8 natDexRequired; u8 ungiftable; -} Good; +} GoodData; // clang-format off -static const Good sGoods[] = { +static const GoodData sGoodData[] = { [UG_GOOD_NONE] = { .width = 0, .depth = 0, @@ -2533,52 +2527,52 @@ static const Good sGoods[] = { }; // clang-format on -u8 Good_GetWidth(int goodID) +u8 Good_GetWidth(enum Good goodID) { - return sGoods[goodID].width; + return sGoodData[goodID].width; } -u8 Good_GetDepth(int goodID) +u8 Good_GetDepth(enum Good goodID) { - return sGoods[goodID].depth; + return sGoodData[goodID].depth; } -const u8 *Good_GetCollision(int goodID) +const u8 *Good_GetCollision(enum Good goodID) { - return sGoods[goodID].collision; + return sGoodData[goodID].collision; } -u8 Good_GetSpherePriceType(int goodID) +u8 Good_GetSpherePriceType(enum Good goodID) { - return sGoods[goodID].spherePrice.sphereType; + return sGoodData[goodID].spherePrice.sphereType; } -u8 Good_GetSpherePriceMinSize(int goodID) +u8 Good_GetSpherePriceMinSize(enum Good goodID) { - return sGoods[goodID].spherePrice.minSize; + return sGoodData[goodID].spherePrice.minSize; } -u8 Good_GetSpherePriceMaxSize(int goodID) +u8 Good_GetSpherePriceMaxSize(enum Good goodID) { - return sGoods[goodID].spherePrice.maxSize; + return sGoodData[goodID].spherePrice.maxSize; } -int Good_GetMoneyPrice(int goodID) +int Good_GetMoneyPrice(enum Good goodID) { - return sGoods[goodID].moneyPrice; + return sGoodData[goodID].moneyPrice; } -int Good_GetInteractMessageID(int goodID) +int Good_GetInteractMessageID(enum Good goodID) { - return sGoods[goodID].interactMessageID; + return sGoodData[goodID].interactMessageID; } -BOOL Good_IsNatDexRequired(int goodID) +BOOL Good_IsNatDexRequired(enum Good goodID) { - return sGoods[goodID].natDexRequired; + return sGoodData[goodID].natDexRequired; } -BOOL Good_IsUngiftable(int goodID) +BOOL Good_IsUngiftable(enum Good goodID) { - return sGoods[goodID].ungiftable; + return sGoodData[goodID].ungiftable; } diff --git a/src/meson.build b/src/meson.build index 3aa2e44df2..34f1d09870 100644 --- a/src/meson.build +++ b/src/meson.build @@ -652,11 +652,11 @@ pokeplatinum_c = files( 'overlay023/underground_player_talk.c', 'overlay023/underground_menu.c', 'overlay023/underground_pc.c', - 'overlay023/ov23_022521F0.c', + 'overlay023/underground_vendors.c', 'overlay023/underground_records.c', 'overlay023/underground_text_printer.c', - 'overlay023/ov23_0225426C.c', - 'overlay023/ov23_0225429C.c', + 'overlay023/treasure_prices.c', + 'overlay023/trap_prices.c', 'overlay023/decoration_menu.c', 'overlay023/base_decoration.c', 'applications/poketch/unavailable/graphics.c', diff --git a/src/overlay023/base_decoration.c b/src/overlay023/base_decoration.c index 0fb4bbd571..066245ead8 100644 --- a/src/overlay023/base_decoration.c +++ b/src/overlay023/base_decoration.c @@ -3,7 +3,7 @@ #include #include -#include "constants/goods.h" +#include "generated/goods.h" #include "struct_defs/underground.h" diff --git a/src/overlay023/ov23_0223E140.c b/src/overlay023/ov23_0223E140.c index b728d8918a..8ecd2bb1d3 100644 --- a/src/overlay023/ov23_0223E140.c +++ b/src/overlay023/ov23_0223E140.c @@ -3,8 +3,8 @@ #include #include -#include "constants/traps.h" #include "generated/trainer_score_events.h" +#include "generated/traps.h" #include "struct_defs/struct_02099F80.h" #include "struct_defs/underground.h" diff --git a/src/overlay023/ov23_02241F74.c b/src/overlay023/ov23_02241F74.c index 72efc459c6..0cca8b1ff4 100644 --- a/src/overlay023/ov23_02241F74.c +++ b/src/overlay023/ov23_02241F74.c @@ -12,7 +12,6 @@ #include "overlay005/land_data.h" #include "overlay005/ov5_021EAFA4.h" #include "overlay023/ov23_0223E140.h" -#include "overlay023/ov23_022521F0.h" #include "overlay023/secret_bases.h" #include "overlay023/struct_ov23_02241A80.h" #include "overlay023/struct_ov23_02241A88.h" @@ -23,6 +22,7 @@ #include "overlay023/underground_spheres.h" #include "overlay023/underground_text_printer.h" #include "overlay023/underground_traps.h" +#include "overlay023/underground_vendors.h" #include "comm_player_manager.h" #include "communication_information.h" @@ -49,6 +49,7 @@ #include "vars_flags.h" #include "res/graphics/trap_effects/trap_effects.naix.h" +#include "res/text/bank/underground_common.h" typedef BOOL (*UnkFuncPtr_ov23_02242540)(int, int); @@ -72,7 +73,7 @@ typedef struct { u16 storedPositionKey; u8 unk_C2[8]; u8 unk_CA[8]; - u8 unk_D2[8]; + u8 talkedToVendorMessagesQueued[MAX_CONNECTED_PLAYERS]; String *unk_DC[8]; u8 unk_FC[8]; u8 unk_104[8]; @@ -139,9 +140,9 @@ static void CommManUnderground_Init(CommManUnderground *param0, FieldSystem *fie Graphics_LoadPalette(NARC_INDEX_DATA__UG_TRAP, text_window_NCLR, 0, 10 * 0x20, 4 * 0x20, HEAP_ID_FIELD1); LoadStandardWindowGraphics(sCommManUnderground->fieldSystem->bgConfig, 3, 1024 - (18 + 12) - 9, 11, 2, HEAP_ID_FIELD1); - for (i = 0; i < (7 + 1); i++) { + for (i = 0; i < MAX_CONNECTED_PLAYERS; i++) { sCommManUnderground->unk_C2[i] = 0xff; - sCommManUnderground->unk_D2[i] = 0xff; + sCommManUnderground->talkedToVendorMessagesQueued[i] = 0xff; sCommManUnderground->unk_DC[i] = NULL; } @@ -278,11 +279,11 @@ static BOOL ov23_02242308(String *param0) } } - if (sCommManUnderground->unk_D2[i] != 0xff) { + if (sCommManUnderground->talkedToVendorMessagesQueued[i] != 0xff) { v3 = CommInfo_TrainerInfo(i); - sCommManUnderground->unk_D2[i] = 0xff; + sCommManUnderground->talkedToVendorMessagesQueued[i] = 0xff; - if (CommManUnderground_FormatCommonStringWithTrainerName(v3, 0, 112, param0)) { + if (CommManUnderground_FormatCommonStringWithTrainerName(v3, 0, UndergroundCommon_Text_PlayerTalkedWithSomeone, param0)) { return 1; } } @@ -1018,10 +1019,10 @@ void ov23_0224300C(int param0, int param1) } } -void ov23_02243020(int param0) +void CommManUnderground_QueueTalkedToVendorMessage(int netID) { if (sCommManUnderground) { - sCommManUnderground->unk_D2[param0] = 1; + sCommManUnderground->talkedToVendorMessagesQueued[netID] = TRUE; } } @@ -1113,13 +1114,13 @@ u16 CommManUnderground_GetStoredCursorPos(u16 menuKey) return 0; } -void ov23_022431C4(int param0, int param1, void *param2, void *param3) +void CommManUnderground_ProcessVendorTalkRequest(int unused0, int unused1, void *data, void *unused3) { - u8 *v0 = param2; - int v1 = v0[0]; + u8 *buffer = data; + int netID = *buffer; - if (v1 == CommSys_CurNetId()) { - ov23_022534A0(sCommManUnderground->fieldSystem); + if (netID == CommSys_CurNetId()) { + UndergroundVendors_StartShopMenuTask(sCommManUnderground->fieldSystem); CommSys_SendMessage(25); CommPlayerMan_PauseFieldSystem(); } diff --git a/src/overlay023/ov23_022521F0.c b/src/overlay023/ov23_022521F0.c deleted file mode 100644 index a4a0c665b7..0000000000 --- a/src/overlay023/ov23_022521F0.c +++ /dev/null @@ -1,955 +0,0 @@ -#include "overlay023/ov23_022521F0.h" - -#include -#include - -#include "constants/field_base_tiles.h" - -#include "struct_decls/struct_02061AB4_decl.h" -#include "struct_defs/underground.h" - -#include "field/field_system.h" -#include "overlay023/ov23_02241F74.h" -#include "overlay023/ov23_0225426C.h" -#include "overlay023/ov23_0225429C.h" -#include "overlay023/underground_item_list_menu.h" -#include "overlay023/underground_menu.h" -#include "overlay023/underground_text_printer.h" - -#include "bg_window.h" -#include "comm_player_manager.h" -#include "communication_information.h" -#include "communication_system.h" -#include "field_system.h" -#include "goods.h" -#include "heap.h" -#include "list_menu.h" -#include "map_header_data.h" -#include "map_object.h" -#include "menu.h" -#include "message.h" -#include "pokedex.h" -#include "render_window.h" -#include "savedata.h" -#include "sound_playback.h" -#include "string_gf.h" -#include "string_list.h" -#include "string_template.h" -#include "sys_task.h" -#include "sys_task_manager.h" -#include "system.h" -#include "text.h" -#include "unk_0202854C.h" - -typedef struct { - u16 unk_00; - u16 unk_02; - u16 unk_04; -} UnkStruct_ov23_02257674; - -static void ov23_02252D1C(UndergroundMenu *param0); -static void ov23_02252C78(UndergroundMenu *param0); - -UnkStruct_ov23_02257674 Unk_ov23_02257674[] = { - { 0x0, 0x48, 0x68 }, - { 0x0, 0x1A8, 0x57 }, - { 0x0, 0xC8, 0xB9 }, - { 0x0, 0x14F, 0x108 }, - { 0x0, 0xAF, 0x117 }, - { 0x0, 0x1A8, 0x1B7 }, - { 0x0, 0x57, 0x1C8 }, - { 0x0, 0x137, 0x166 }, - { 0x1, 0xE8, 0x57 }, - { 0x1, 0x148, 0x97 }, - { 0x1, 0xE8, 0xD7 }, - { 0x1, 0xE8, 0x12A }, - { 0x1, 0x117, 0x148 }, - { 0x1, 0x117, 0x1C8 }, - { 0x1, 0xB7, 0x188 }, - { 0x1, 0x117, 0xF5 }, - { 0x2, 0x28, 0x1D7 }, - { 0x2, 0x1D7, 0x48 }, - { 0x2, 0x1D7, 0x1D7 }, - { 0x2, 0x28, 0x48 } -}; - -static const WindowTemplate Unk_ov23_022569D8 = { - 0x3, - 0x19, - 0xD, - 0x6, - 0x4, - 0xD, - 0x21F -}; - -static void ov23_022521F0(UndergroundMenu *param0, int param1) -{ - MATHRandContext16 v0; - int v1, v2, v3, v4, v5; - Underground *v6 = SaveData_GetUnderground(FieldSystem_GetSaveData(param0->fieldSystem)); - - MATH_InitRand16(&v0, Underground_GetRandomSeed(v6) + param1); - - for (v5 = 0; v5 < 5; v5++) { - if (v5 == 0) { - v1 = 33; - } else { - v1 = MATH_Rand16(&v0, 34 - 1) + 1; - } - - for (v4 = 0; v4 < v5; v4++) { - if (param0->unk_274[v4] == v1) { - v1 = 0; - } - } - - if (v1 == 0) { - v5--; - continue; - } - - v3 = ov23_022542AC(v1); - v2 = ov23_022542BC(v1); - - if ((v3 == 0) && (v2 == 0)) { - v5--; - continue; - } - - param0->unk_274[v5] = v1; - param0->unk_279[v5] = ov23_0225429C(v1); - - if (param0->unk_279[v5] == 6) { - param0->unk_279[v5] = MATH_Rand16(&v0, 6 - 1) + 1; - } - - param0->unk_27E[v5] = MATH_Rand16(&v0, v2 - v3) + v3; - } -} - -static void ov23_022522F0(UndergroundMenu *param0, int param1) -{ - MATHRandContext16 v0; - int v2, v3, v4, v5; - SaveData *saveData = FieldSystem_GetSaveData(param0->fieldSystem); - Underground *v7 = SaveData_GetUnderground(saveData); - BOOL natdexObtained = Pokedex_IsNationalDexObtained(SaveData_GetPokedex(saveData)); - - MATH_InitRand16(&v0, Underground_GetRandomSeed(v7) + param1); - - for (v5 = 0; v5 < 5; v5++) { - int v1 = MATH_Rand16(&v0, 139 - 1) + 1; - - for (v4 = 0; v4 < v5; v4++) { - if (param0->unk_274[v4] == v1) { - v1 = 0; - } - } - - if (v1 == 0) { - v5--; - continue; - } - - param0->unk_274[v5] = v1; - param0->unk_279[v5] = Good_GetSpherePriceType(v1); - - if ((natdexObtained == 0) && (1 == Good_IsNatDexRequired(v1))) { - v5--; - continue; - } - - if (param0->unk_279[v5] == 0) { - v5--; - continue; - } else if (param0->unk_279[v5] == 6) { - param0->unk_279[v5] = MATH_Rand16(&v0, 6 - 1) + 1; - } - - v3 = Good_GetSpherePriceMinSize(v1); - v2 = Good_GetSpherePriceMaxSize(v1); - - param0->unk_27E[v5] = MATH_Rand16(&v0, v2 - v3) + v3; - } -} - -static int ov23_02252404(UndergroundMenu *param0, int param1, int param2) -{ - BOOL v0 = 0; - Underground *v1 = SaveData_GetUnderground(FieldSystem_GetSaveData(param0->fieldSystem)); - - if (param0->unk_279[param1] != UndergroundMenu_GetSphereTypeAtSlot(param2, param0)) { - return 0xfffd; - } - - if (param0->unk_27E[param1] > UndergroundMenu_GetSphereSizeAtSlot(param2, param0)) { - return 0xfffb; - } - - if (param0->unk_2AC == 1) { - v0 = Underground_TryAddTrap(v1, param0->unk_274[param1]); - } else if (param0->unk_2AC == 0) { - v0 = Underground_TryAddGoodBag(v1, param0->unk_274[param1]); - } else if (param0->unk_2AC == 2) { - v0 = Underground_TryAddTreasure(v1, param0->unk_274[param1]); - } - - if (v0) { - Underground_RemoveSphereAtSlot(v1, param2); - } else { - return 0xfffc; - } - - return param0->unk_274[param1]; -} - -static void *ov23_022524B8(UndergroundMenu *param0) -{ - ListMenuTemplate v0; - int v1 = 3; - - if (param0->unk_2AC == 2) { - v1 = 2; - } - - UndergroundMenu_EraseCurrentMenu(param0); - - param0->menuOptions = StringList_New(v1, HEAP_ID_FIELD1); - - Window_Add(param0->fieldSystem->bgConfig, ¶m0->primaryWindow, 3, 19, 3, 12, v1 * 2, 13, ((((1024 - (18 + 12) - 9 - (32 * 8)) - (18 + 12 + 24)) - (27 * 4)) - 12 * 6)); - Window_DrawStandardFrame(¶m0->primaryWindow, 1, 1024 - (18 + 12) - 9, 11); - - { - int v2, v3; - - if (param0->unk_2AC == 1) { - v3 = 13; - ov23_022521F0(param0, param0->unk_288); - StringList_AddFromMessageBank(param0->menuOptions, UndergroundTextPrinter_GetMessageLoader(CommManUnderground_GetMiscTextPrinter()), v3, 0); - StringList_AddFromMessageBank(param0->menuOptions, UndergroundTextPrinter_GetMessageLoader(CommManUnderground_GetMiscTextPrinter()), v3 + 1, 1); - StringList_AddFromMessageBank(param0->menuOptions, UndergroundTextPrinter_GetMessageLoader(CommManUnderground_GetMiscTextPrinter()), v3 + 2, 0xfffffffe); - } else if (param0->unk_2AC == 0) { - v3 = 16; - ov23_022522F0(param0, param0->unk_288); - StringList_AddFromMessageBank(param0->menuOptions, UndergroundTextPrinter_GetMessageLoader(CommManUnderground_GetMiscTextPrinter()), v3, 0); - StringList_AddFromMessageBank(param0->menuOptions, UndergroundTextPrinter_GetMessageLoader(CommManUnderground_GetMiscTextPrinter()), v3 + 1, 1); - StringList_AddFromMessageBank(param0->menuOptions, UndergroundTextPrinter_GetMessageLoader(CommManUnderground_GetMiscTextPrinter()), v3 + 2, 0xfffffffe); - } else { - v3 = 28; - StringList_AddFromMessageBank(param0->menuOptions, UndergroundTextPrinter_GetMessageLoader(CommManUnderground_GetMiscTextPrinter()), 28, 0); - StringList_AddFromMessageBank(param0->menuOptions, UndergroundTextPrinter_GetMessageLoader(CommManUnderground_GetMiscTextPrinter()), 22, 0xfffffffe); - } - } - - MI_CpuCopy8(UndergroundTextPrinter_GetListMenuTemplate(), &v0, sizeof(ListMenuTemplate)); - - v0.choices = param0->menuOptions; - v0.window = ¶m0->primaryWindow; - v0.count = v1; - v0.maxDisplay = v1; - - param0->listMenuListPos = CommManUnderground_GetStoredListPos(19); - param0->listMenuCursorPos = CommManUnderground_GetStoredCursorPos(19); - - UndergroundMenu_MoveListCursorPosInBounds(param0, v0.maxDisplay, v0.count); - - param0->unk_48 = ListMenu_New(&v0, param0->listMenuListPos, param0->listMenuCursorPos, HEAP_ID_FIELD1); - param0->unk_2AE = param0->listMenuCursorPos; - - Window_CopyToVRAM(¶m0->primaryWindow); - - return param0; -} - -static void ov23_0225265C(ListMenu *param0, u32 param1, u8 param2) -{ - UndergroundMenu *v0 = (UndergroundMenu *)ListMenu_GetAttribute(param0, 19); - u32 v1 = param1; - - Window_FillTilemap(&v0->secondaryWindow, 15); - MessageLoader_GetString(UndergroundTextPrinter_GetMessageLoader(CommManUnderground_GetMiscTextPrinter()), 23 + v0->unk_2AB, v0->string); - Text_AddPrinterWithParams(&v0->secondaryWindow, FONT_SYSTEM, v0->string, 1, 1, TEXT_SPEED_NO_TRANSFER, NULL); - - if (param1 != 0xfffffffe) { - StringTemplate_SetUndergroundItemName(v0->template, 2, v0->unk_279[v1]); - StringTemplate_SetNumber(v0->template, 6, v0->unk_27E[v1], 2, 1, 1); - MessageLoader_GetString(UndergroundTextPrinter_GetMessageLoader(CommManUnderground_GetMiscTextPrinter()), 25, v0->string); - StringTemplate_Format(v0->template, v0->fmtString, v0->string); - Text_AddPrinterWithParams(&v0->secondaryWindow, FONT_SYSTEM, v0->fmtString, 1, 17, TEXT_SPEED_NO_TRANSFER, NULL); - } else { - (void)0; - } - - Window_ScheduleCopyToVRAM(&v0->secondaryWindow); - - if (v1 == 0xfffffffe) { - v1 = 0xfffffffe; - } - - if (v0->unk_2AC == 1) { - UndergroundMenu_PrintTrapDescription(param0, v1, param2); - } else if (v0->unk_2AC == 0) { - UndergroundMenu_PrintGoodDescription(param0, v1, param2); - } else { - UndergroundMenu_PrintTreasureDescription(param0, v1, param2); - } -} - -static void ov23_02252754(ListMenu *param0, u32 index, u8 onInit) -{ - MATHRandContext16 v0; - UndergroundMenu *v1 = (UndergroundMenu *)ListMenu_GetAttribute(param0, 19); - Underground *v2 = SaveData_GetUnderground(FieldSystem_GetSaveData(v1->fieldSystem)); - int v3 = index, v4, v5; - int v7 = 0, v8; - - Window_FillTilemap(&v1->secondaryWindow, 15); - - if (index != 0xfffffffe) { - if (v1->unk_2AC == 1) { - int v6 = UndergroundMenu_GetTrapAtSlot(v3, v1); - MATH_InitRand16(&v0, Underground_GetRandomSeed(v2) + v1->unk_288 + v6); - v7 = ov23_0225429C(v6); - - if (v7 == 6) { - v7 = MATH_Rand16(&v0, 6 - 1) + 1; - } - - v4 = ov23_022542AC(v6); - v5 = ov23_022542BC(v6); - v8 = MATH_Rand16(&v0, v5 - v4) + v4; - v8 = v8 / 2; - } else if (v1->unk_2AC == 0) { - const int v6 = UndergroundMenu_GetGoodAtSlotBag(v3, v1); - MATH_InitRand16(&v0, Underground_GetRandomSeed(v2) + v1->unk_288 + v6); - v7 = Good_GetSpherePriceType(v6); - - if (v7 == 6) { - v7 = MATH_Rand16(&v0, 6 - 1) + 1; - } - - v4 = Good_GetSpherePriceMinSize(v6); - v5 = Good_GetSpherePriceMaxSize(v6); - v8 = MATH_Rand16(&v0, v5 - v4) + v4; - v8 = v8 / 2; - } else { - int v6 = UndergroundMenu_GetTreasureAtSlot(v3, v1); - MATH_InitRand16(&v0, Underground_GetRandomSeed(v2) + v1->unk_288 + v6); - v7 = ov23_0225426C(v6); - - if (v7 == 6) { - v7 = MATH_Rand16(&v0, 6 - 1) + 1; - } - - v4 = ov23_0225427C(v6); - v5 = ov23_0225428C(v6); - v8 = MATH_Rand16(&v0, v5 - v4) + v4; - } - } - - MessageLoader_GetString(UndergroundTextPrinter_GetMessageLoader(CommManUnderground_GetMiscTextPrinter()), 23 + v1->unk_2AB, v1->string); - Text_AddPrinterWithParams(&v1->secondaryWindow, FONT_SYSTEM, v1->string, 1, 1, TEXT_SPEED_NO_TRANSFER, NULL); - - if (index == 0xfffffffe) { - (void)0; - } else if (v7 != 0) { - StringTemplate_SetUndergroundItemName(v1->template, 2, v7); - StringTemplate_SetNumber(v1->template, 6, v8, 2, 1, 1); - MessageLoader_GetString(UndergroundTextPrinter_GetMessageLoader(CommManUnderground_GetMiscTextPrinter()), 25, v1->string); - StringTemplate_Format(v1->template, v1->fmtString, v1->string); - Text_AddPrinterWithParams(&v1->secondaryWindow, FONT_SYSTEM, v1->fmtString, 1, 17, TEXT_SPEED_NO_TRANSFER, NULL); - - v1->unk_279[0] = v7; - v1->unk_27E[0] = v8; - } else { - v1->unk_279[0] = v7; - - MessageLoader_GetString(UndergroundTextPrinter_GetMessageLoader(CommManUnderground_GetMiscTextPrinter()), 26, v1->string); - Text_AddPrinterWithParams(&v1->secondaryWindow, FONT_SYSTEM, v1->string, 1, 17, TEXT_SPEED_NO_TRANSFER, NULL); - } - - Window_ScheduleCopyToVRAM(&v1->secondaryWindow); - - if (v1->unk_2AC == 1) { - UndergroundMenu_PrintTrapDescription(param0, index, onInit); - } else if (v1->unk_2AC == 0) { - UndergroundMenu_PrintGoodDescription(param0, index, onInit); - } else { - UndergroundMenu_PrintTreasureDescription(param0, index, onInit); - } -} - -static int ov23_02252A04(int param0, void *param1) -{ - UndergroundMenu *v0 = param1; - - if (param0 >= 5) { - return 0; - } - - return v0->unk_274[param0]; -} - -static void ov23_02252A18(UndergroundMenu *param0) -{ - ListMenuTemplate v0; - const int v1 = 5 + 1; - - UndergroundMenu_EraseCurrentMenu(param0); - param0->menuOptions = StringList_New(v1, HEAP_ID_FIELD1); - - Window_Add(param0->fieldSystem->bgConfig, ¶m0->primaryWindow, 3, 19, 3, 12, v1 * 2, 13, (((((1024 - (18 + 12) - 9 - (32 * 8)) - (18 + 12 + 24)) - (27 * 4)) - 12 * 6) - 12 * 12)); - Window_DrawStandardFrame(¶m0->primaryWindow, 1, 1024 - (18 + 12) - 9, 11); - - { - MessageLoader *v2; - int v3; - - if (param0->unk_2AC == 1) { - v2 = MessageLoader_Init(MSG_LOADER_PRELOAD_ENTIRE_BANK, NARC_INDEX_MSGDATA__PL_MSG, TEXT_BANK_UNDERGROUND_TRAPS, HEAP_ID_FIELD1); - UndergroundTextPrinter_ChangeMessageLoaderBank(CommManUnderground_GetItemNameTextPrinter(), TEXT_BANK_UNDERGROUND_TRAPS, MSG_LOADER_PRELOAD_ENTIRE_BANK); - } else if (param0->unk_2AC == 0) { - v2 = MessageLoader_Init(MSG_LOADER_PRELOAD_ENTIRE_BANK, NARC_INDEX_MSGDATA__PL_MSG, TEXT_BANK_UNDERGROUND_GOODS, HEAP_ID_FIELD1); - UndergroundTextPrinter_ChangeMessageLoaderBank(CommManUnderground_GetItemNameTextPrinter(), TEXT_BANK_UNDERGROUND_GOODS, MSG_LOADER_PRELOAD_ENTIRE_BANK); - } else { - v2 = MessageLoader_Init(MSG_LOADER_PRELOAD_ENTIRE_BANK, NARC_INDEX_MSGDATA__PL_MSG, TEXT_BANK_UNDERGROUND_ITEMS, HEAP_ID_FIELD1); - UndergroundTextPrinter_ChangeMessageLoaderBank(CommManUnderground_GetItemNameTextPrinter(), TEXT_BANK_UNDERGROUND_ITEMS, MSG_LOADER_PRELOAD_ENTIRE_BANK); - } - - for (v3 = 0; v3 < v1 - 1; v3++) { - StringList_AddFromMessageBank(param0->menuOptions, v2, param0->unk_274[v3], v3); - } - - StringList_AddFromMessageBank(param0->menuOptions, v2, 0, 0xfffffffe); - MessageLoader_Free(v2); - } - - MI_CpuCopy8(UndergroundTextPrinter_GetListMenuTemplate(), &v0, sizeof(ListMenuTemplate)); - - v0.choices = param0->menuOptions; - v0.window = ¶m0->primaryWindow; - v0.count = v1; - v0.maxDisplay = v1; - v0.cursorCallback = ov23_0225265C; - v0.parent = param0; - - param0->getItem = ov23_02252A04; - param0->listMenuListPos = CommManUnderground_GetStoredListPos(13 + param0->unk_2AC); - param0->listMenuCursorPos = CommManUnderground_GetStoredCursorPos(13 + param0->unk_2AC); - param0->unk_2AE = param0->listMenuCursorPos; - - UndergroundMenu_MoveListCursorPosInBounds(param0, v0.maxDisplay, v0.count); - param0->unk_48 = ListMenu_New(&v0, param0->listMenuListPos, param0->listMenuCursorPos, HEAP_ID_FIELD1); - Window_CopyToVRAM(¶m0->primaryWindow); -} - -static void ov23_02252B90(UndergroundMenu *param0, BOOL param1) -{ - if (Window_IsInUse(¶m0->secondaryWindow)) { - Window_EraseStandardFrame(¶m0->secondaryWindow, 1); - Window_Remove(¶m0->secondaryWindow); - } - - UndergroundMenu_EraseCurrentMenu(param0); -} - -static void ov23_02252BB8(int param0, UndergroundMenu *param1) -{ - int v0; - - if (param1->unk_2AC == 1) { - v0 = UndergroundMenu_GetTrapAtSlot(param0, param1); - ov23_02252CF4(2, v0); - } else if (param1->unk_2AC == 0) { - v0 = UndergroundMenu_GetGoodAtSlotBag(param0, param1); - ov23_02252D08(2, v0); - } else { - v0 = UndergroundMenu_GetTreasureAtSlot(param0, param1); - ov23_02252CE0(2, v0); - } - - ov23_02252CE0(4, param1->unk_279[0]); - ov23_02252C9C(10); -} - -static u32 ov23_02252C08(UndergroundMenu *param0) -{ - Underground *v0 = SaveData_GetUnderground(FieldSystem_GetSaveData(param0->fieldSystem)); - - if (UndergroundInventory_TryAddSphere(param0->unk_279[0], param0->unk_27E[0])) { - if (param0->unk_2AC == 1) { - Underground_RemoveTrapAtSlot(v0, param0->unk_2A8); - } else if (param0->unk_2AC == 0) { - Underground_RemoveGoodAtSlotBag(v0, param0->unk_2A8); - } else if (param0->unk_2AC == 2) { - Underground_RemoveTreasureAtSlot(v0, param0->unk_2A8); - } - - return param0->unk_279[0]; - } - - return 0xfffc; -} - -int ov23_02252C70(void *param0) -{ - UndergroundMenu *v0 = param0; - u32 v1 = 0xfffe; - u32 v2 = 0xfffe; - u16 v3, v4; - - return v2; -} - -static void ov23_02252C78(UndergroundMenu *param0) -{ - String_Free(param0->string); - String_Free(param0->fmtString); - StringTemplate_Free(param0->template); - Heap_Free(param0); -} - -void *ov23_02252C98(int param0, FieldSystem *fieldSystem, int param2) -{ - UndergroundMenu *v0 = NULL; - return v0; -} - -int ov23_02252C9C(int param0) -{ - UndergroundTextPrinter_ChangeMessageLoaderBank(CommManUnderground_GetMiscTextPrinter(), TEXT_BANK_UNDERGROUND_NPCS, MSG_LOADER_LOAD_ON_DEMAND); - UndergroundTextPrinter_SetPlayerNameIndex0(CommManUnderground_GetMiscTextPrinter(), CommInfo_TrainerInfo(CommSys_CurNetId())); - - return UndergroundTextPrinter_PrintText(CommManUnderground_GetMiscTextPrinter(), param0, FALSE, NULL); -} - -void ov23_02252CD4(void) -{ - UndergroundTextPrinter_EraseMessageBoxWindow(CommManUnderground_GetMiscTextPrinter()); -} - -void ov23_02252CE0(int param0, int param1) -{ - UndergroundTextPrinter_SetUndergroundItemName(CommManUnderground_GetMiscTextPrinter(), param0, param1); -} - -void ov23_02252CF4(int param0, int param1) -{ - UndergroundTextPrinter_SetUndergroundTrapNameWithIndex(CommManUnderground_GetMiscTextPrinter(), param0, param1); -} - -void ov23_02252D08(int param0, int param1) -{ - UndergroundTextPrinter_SetGoodNameWithIndex(CommManUnderground_GetMiscTextPrinter(), param0, param1); -} - -static void ov23_02252D1C(UndergroundMenu *param0) -{ - if (!Window_IsInUse(¶m0->secondaryWindow)) { - Window_Add(param0->fieldSystem->bgConfig, ¶m0->secondaryWindow, 3, 1, 12, 12, 4, 13, 1); - Window_DrawStandardFrame(¶m0->secondaryWindow, 1, 1024 - (18 + 12) - 9, 11); - } - - Window_FillTilemap(¶m0->secondaryWindow, 15); - Window_CopyToVRAM(¶m0->secondaryWindow); -} - -void UndergroundMenu_PrintMenuDescription(UndergroundMenu *menu, int bankEntry) -{ - Window_Add(menu->fieldSystem->bgConfig, &menu->menuDescriptionWindow, BG_LAYER_MAIN_3, 1, 1, 7, 4, 13, 51); - Window_DrawStandardFrame(&menu->menuDescriptionWindow, TRUE, BASE_TILE_STANDARD_WINDOW_FRAME, 11); - - Window_FillTilemap(&menu->menuDescriptionWindow, 15); - Window_CopyToVRAM(&menu->menuDescriptionWindow); - - MessageLoader_GetString(UndergroundTextPrinter_GetMessageLoader(CommManUnderground_GetMiscTextPrinter()), bankEntry, menu->string); - Text_AddPrinterWithParams(&menu->menuDescriptionWindow, FONT_SYSTEM, menu->string, 1, 1, TEXT_SPEED_NO_TRANSFER, NULL); - Window_ScheduleCopyToVRAM(&menu->menuDescriptionWindow); -} - -void UndergroundMenu_RemoveDescriptionWindow(UndergroundMenu *menu) -{ - if (Window_IsInUse(&menu->menuDescriptionWindow)) { - Window_EraseStandardFrame(&menu->menuDescriptionWindow, TRUE); - Window_Remove(&menu->menuDescriptionWindow); - } -} - -void UndergroundMenu_RemoveDescriptionWindowInstant(UndergroundMenu *menu) -{ - if (Window_IsInUse(&menu->menuDescriptionWindow)) { - Window_EraseStandardFrame(&menu->menuDescriptionWindow, FALSE); - Window_Remove(&menu->menuDescriptionWindow); - } -} - -static int ov23_02252E3C(int param0, int param1, int *param2) -{ - int v0, v1 = NELEMS(Unk_ov23_02257674); - - for (v0 = 0; v0 < v1; v0++) { - if ((Unk_ov23_02257674[v0].unk_02 == param0) && (Unk_ov23_02257674[v0].unk_04 == param1)) { - *param2 = v0; - return Unk_ov23_02257674[v0].unk_00; - } - } - - GF_ASSERT(0); - return 0; -} - -static void ov23_02252E70(SysTask *param0, void *param1) -{ - UndergroundMenu *v0 = param1; - u32 v1 = 0xfffe; - u32 v2 = 0xfffe; - u16 v3, v4, v5; - - switch (v0->state) { - case 0: - if (v0->unk_2AC == 2) { - ov23_02252C9C(27); - } else { - ov23_02252C9C(0); - } - - v0->state = 1; - break; - case 1: - if (UndergroundTextPrinter_IsPrinterActive(CommManUnderground_GetMiscTextPrinter()) == FALSE) { - v0->state = 2; - } - break; - case 2: - ov23_022524B8(v0); - v0->state = 3; - break; - case 3: - v1 = ListMenu_ProcessInput(v0->unk_48); - ListMenu_GetListAndCursorPos(v0->unk_48, &v3, &v4); - CommManUnderground_StoreCursorAndListPos(UNDERGROUND_MENU_KEY_19, v4, v3); - - v5 = v0->unk_2AE; - ListMenu_CalcTrueCursorPos(v0->unk_48, &v0->unk_2AE); - - if (v5 != v0->unk_2AE) { - Sound_PlayEffect(SEQ_SE_CONFIRM); - } - - switch (v1) { - case 0xfffffffe: - Sound_PlayEffect(SEQ_SE_CONFIRM); - ov23_02252B90(v0, 0); - v0->state = 17; - break; - case 0xffffffff: - break; - default: - if (v0->unk_2AC == 2) { - v0->unk_2AB = 1; - v0->state = 12; - } else { - v0->unk_2AB = v1; - - if (v1 == 0) { - Sound_PlayEffect(SEQ_SE_CONFIRM); - v0->state = 4; - } else { - Sound_PlayEffect(SEQ_SE_CONFIRM); - v0->state = 12; - } - } - break; - } - break; - case 4: - ov23_02252D1C(v0); - ov23_02252A18(v0); - v0->state = 5; - break; - case 5: - v1 = ListMenu_ProcessInput(v0->unk_48); - ListMenu_GetListAndCursorPos(v0->unk_48, &v3, &v4); - CommManUnderground_StoreCursorAndListPos(UNDERGROUND_MENU_KEY_13 + v0->unk_2AC, v4, v3); - - v5 = v0->unk_2AE; - ListMenu_CalcTrueCursorPos(v0->unk_48, &v0->unk_2AE); - - if (v5 != v0->unk_2AE) { - Sound_PlayEffect(SEQ_SE_CONFIRM); - } - - if (v1 == 0xfffffffe) { - v1 = 0xfffffffe; - } - - if (v1 != 0xffffffff) { - UndergroundTextPrinter_EraseMessageBoxWindow(CommManUnderground_GetItemNameTextPrinter()); - } - - switch (v1) { - case 0xfffffffe: - Sound_PlayEffect(SEQ_SE_CONFIRM); - ov23_02252B90(v0, 1); - v0->state = 2; - break; - case 0xffffffff: - break; - default: - Sound_PlayEffect(SEQ_SE_CONFIRM); - v0->unk_2A8 = v1; - - if (v0->unk_2AC == 1) { - ov23_02252CF4(2, v0->unk_274[v0->unk_2A8]); - } else if (v0->unk_2AC == 0) { - ov23_02252D08(2, v0->unk_274[v0->unk_2A8]); - } - - ov23_02252C9C(1); - v0->state = 6; - break; - } - break; - case 6: - if (UndergroundTextPrinter_IsPrinterActive(CommManUnderground_GetMiscTextPrinter()) == FALSE) { - if (gSystem.pressedKeys & PAD_BUTTON_A) { - v0->state = 7; - } - } - break; - case 7: - UndergroundMenu_EraseCurrentMenu(v0); - - v0->listMenuCursorPos = CommManUnderground_GetStoredCursorPos(12); - v0->listMenuListPos = CommManUnderground_GetStoredListPos(12); - - ov23_02250184(v0); - UndergroundMenu_PrintMenuDescription(v0, 19); - - if (v0->unk_2AC == 1) { - ov23_02252CF4(2, v0->unk_274[v0->unk_2A8]); - } else if (v0->unk_2AC == 0) { - ov23_02252D08(2, v0->unk_274[v0->unk_2A8]); - } - - v0->state = 8; - break; - case 8: - if (UndergroundTextPrinter_IsPrinterActive(CommManUnderground_GetMiscTextPrinter()) == FALSE) { - v1 = UndergroundItemListMenu_ProcessInput(v0->itemListMenu); - ListMenu_GetListAndCursorPos(v0->itemListMenu->listMenu, &v3, &v4); - CommManUnderground_StoreCursorAndListPos(UNDERGROUND_MENU_KEY_12, v4, v3); - - if (v1 != 0xffffffff) { - UndergroundTextPrinter_EraseMessageBoxWindow(CommManUnderground_GetItemNameTextPrinter()); - } - - switch (v1) { - case 0xffffffff: - break; - case 0xfffffffe: - UndergroundMenu_RemoveDescriptionWindow(v0); - v0->state = 4; - break; - default: - v1 = ov23_02252404(v0, v0->unk_2A8, v1); - ov23_02252B90(v0, 1); - UndergroundMenu_RemoveDescriptionWindow(v0); - - if (v1 == 0xfffc) { - ov23_02252C9C(3); - v0->state = 10; - } else if (v1 == 0xfffd) { - ov23_02252C9C(4); - v0->state = 10; - } else if (v1 == 0xfffb) { - ov23_02252C9C(5); - v0->state = 10; - } else { - v0->unk_2A8 = v1; - ov23_02252C9C(2); - v0->state = 9; - } - break; - } - } - break; - case 11: - ov23_02252C9C(3); - v0->state = 10; - break; - case 9: - if (UndergroundTextPrinter_IsPrinterActive(CommManUnderground_GetMiscTextPrinter()) == FALSE) { - if (gSystem.pressedKeys & PAD_BUTTON_A) { - if (v0->unk_2AC == 1) { - ov23_02252CF4(2, v0->unk_2A8); - } else if (v0->unk_2AC == 0) { - ov23_02252D08(2, v0->unk_2A8); - } - - ov23_02252C9C(6); - Sound_PlayEffect(SEQ_SE_DP_PIRORIRO2); - - v0->state = 10; - } - } - break; - case 10: - if (UndergroundTextPrinter_IsPrinterActive(CommManUnderground_GetMiscTextPrinter()) == FALSE) { - if (gSystem.pressedKeys & PAD_BUTTON_A) { - ov23_02252C9C(8); - v0->state = 2; - } - } - break; - case 12: - ov23_02252D1C(v0); - - v0->listMenuCursorPos = CommManUnderground_GetStoredCursorPos(16 + v0->unk_2AC); - v0->listMenuListPos = CommManUnderground_GetStoredListPos(16 + v0->unk_2AC); - v0->cursorCallback = ov23_02252754; - - if (v0->unk_2AC == 1) { - ov23_0224FDBC(v0); - UndergroundMenu_PrintMenuDescription(v0, 20); - } else if (v0->unk_2AC == 0) { - ov23_02250CB0(v0); - UndergroundMenu_PrintMenuDescription(v0, 21); - } else { - ov23_02250578(v0); - UndergroundMenu_PrintMenuDescription(v0, 29); - } - - v0->state = 13; - break; - case 13: - v1 = UndergroundItemListMenu_ProcessInput(v0->itemListMenu); - ListMenu_GetListAndCursorPos(v0->itemListMenu->listMenu, &v3, &v4); - CommManUnderground_StoreCursorAndListPos(UNDERGROUND_MENU_KEY_16 + v0->unk_2AC, v4, v3); - - switch (v1) { - case 0xfffffffe: - UndergroundTextPrinter_EraseMessageBoxWindow(CommManUnderground_GetItemNameTextPrinter()); - ov23_02252B90(v0, 1); - UndergroundMenu_RemoveDescriptionWindow(v0); - v0->state = 2; - break; - case 0xffffffff: - break; - default: - if (v0->unk_279[0] != 0) { - UndergroundTextPrinter_EraseMessageBoxWindow(CommManUnderground_GetItemNameTextPrinter()); - v0->unk_2A8 = v1; - ov23_02252B90(v0, 1); - UndergroundMenu_RemoveDescriptionWindow(v0); - ov23_02252BB8(v1, v0); - v0->state = 14; - } - break; - } - break; - case 14: - if (UndergroundTextPrinter_IsPrinterActive(CommManUnderground_GetMiscTextPrinter()) == FALSE) { - v0->yesNoMenu = Menu_MakeYesNoChoice(v0->fieldSystem->bgConfig, &Unk_ov23_022569D8, 1024 - (18 + 12) - 9, 11, 4); - v0->state = 15; - } - break; - case 15: - v1 = Menu_ProcessInputAndHandleExit(v0->yesNoMenu, 4); - - if (v1 == 0xffffffff) { - return; - } else if (v1 == 0) { - v1 = ov23_02252C08(v0); - - if (v1 == 0xfffc) { - ov23_02252C9C(3); - v0->state = 10; - } else { - ov23_02252C9C(11); - v0->state = 16; - } - } else { - v0->state = 17; - } - - v0->yesNoMenu = NULL; - break; - case 16: - if (UndergroundTextPrinter_IsPrinterActive(CommManUnderground_GetMiscTextPrinter()) == FALSE) { - if (gSystem.pressedKeys & PAD_BUTTON_A) { - UndergroundTextPrinter_SetTwoDigitNumber(CommManUnderground_GetMiscTextPrinter(), v0->unk_27E[0]); - ov23_02252CE0(2, v0->unk_279[0]); - ov23_02252C9C(7); - - Sound_PlayEffect(SEQ_SE_DP_PIRORIRO2); - - v0->state = 10; - } - } - break; - case 17: - ov23_02252C9C(9); - v0->state = 18; - break; - case 18: - if (UndergroundTextPrinter_IsPrinterActive(CommManUnderground_GetMiscTextPrinter()) == FALSE) { - if (gSystem.pressedKeys & (PAD_BUTTON_A | PAD_BUTTON_B)) { - ov23_02252CD4(); - ov23_02252C78(v0); - CommManUnderground_ClearCurrentSysTaskInfo(); - SysTask_Done(param0); - CommPlayerMan_ResumeFieldSystem(); - } - } - break; - default: - break; - } -} - -void ov23_022534A0(FieldSystem *fieldSystem) -{ - ListMenuTemplate v0; - int v1 = CommPlayer_GetXInFrontOfPlayer(CommSys_CurNetId()); - int v2 = CommPlayer_GetZInFrontOfPlayer(CommSys_CurNetId()); - int v3 = CommPlayer_GetOppositeDir(CommPlayer_Dir(CommSys_CurNetId())); - UndergroundMenu *v4; - const int v5 = 6; - int v6; - int v7 = ov23_02252E3C(v1, v2, &v6); - - CommManUnderground_SetStoredPosKey(UNDERGROUND_STORED_POS_KEY_3 + v7); - - v4 = Heap_Alloc(HEAP_ID_FIELD1, sizeof(UndergroundMenu)); - MI_CpuClear8(v4, sizeof(UndergroundMenu)); - - v4->fieldSystem = fieldSystem; - v4->unk_2AC = v7; - v4->unk_288 = v6; - v4->string = String_Init((50 * 2), HEAP_ID_FIELD1); - v4->fmtString = String_Init((50 * 2), HEAP_ID_FIELD1); - v4->template = StringTemplate_Default(HEAP_ID_FIELD1); - v4->state = 0; - - Sound_PlayEffect(SEQ_SE_CONFIRM); - v4->sysTask = SysTask_Start(ov23_02252E70, v4, 10000); - CommManUnderground_SetCurrentSysTask(v4, v4->sysTask, UndergroundMenu_ResetBrightnessAndExit); - - { - int objEventCount, i; - const ObjectEvent *objEventList; - MapObject *mapObj; - - objEventCount = MapHeaderData_GetNumObjectEvents(v4->fieldSystem); - objEventList = MapHeaderData_GetObjectEvents(v4->fieldSystem); - - for (i = 0; i < objEventCount; i++) { - if (objEventList[i].x == v1 && objEventList[i].z == v2) { - mapObj = MapObjMan_LocalMapObjByIndex(v4->fieldSystem->mapObjMan, i); - MapObject_TryFace(mapObj, v3); - } - } - } -} diff --git a/src/overlay023/ov23_0225426C.c b/src/overlay023/ov23_0225426C.c deleted file mode 100644 index 88450f9c26..0000000000 --- a/src/overlay023/ov23_0225426C.c +++ /dev/null @@ -1,86 +0,0 @@ -#include "overlay023/ov23_0225426C.h" - -#include -#include - -typedef struct { - u8 unk_00[3]; -} UnkStruct_ov23_02256A00; - -static const UnkStruct_ov23_02256A00 Unk_ov23_02256A00[] = { - { 0x0, 0x0, 0x0 }, - { 0x0, 0x0, 0x0 }, - { 0x0, 0x0, 0x0 }, - { 0x0, 0x0, 0x0 }, - { 0x0, 0x0, 0x0 }, - { 0x0, 0x0, 0x0 }, - { 0x0, 0x0, 0x0 }, - { 0x0, 0x0, 0x0 }, - { 0x0, 0x0, 0x0 }, - { 0x0, 0x0, 0x0 }, - { 0x0, 0x0, 0x0 }, - { 0x2, 0xF, 0x14 }, - { 0x1, 0x32, 0x3C }, - { 0x3, 0x19, 0x23 }, - { 0x2, 0x23, 0x2D }, - { 0x2, 0x19, 0x23 }, - { 0x3, 0x19, 0x23 }, - { 0x1, 0x19, 0x23 }, - { 0x2, 0x19, 0x23 }, - { 0x3, 0x19, 0x23 }, - { 0x4, 0x19, 0x23 }, - { 0x5, 0x19, 0x23 }, - { 0x4, 0x0, 0x0 }, - { 0x4, 0x1E, 0x32 }, - { 0x5, 0x1E, 0x32 }, - { 0x4, 0x1E, 0x32 }, - { 0x5, 0x1E, 0x32 }, - { 0x1, 0x1E, 0x32 }, - { 0x2, 0x19, 0x23 }, - { 0x2, 0x5, 0xA }, - { 0x2, 0x28, 0x32 }, - { 0x3, 0x14, 0x19 }, - { 0x4, 0x14, 0x19 }, - { 0x1, 0x14, 0x19 }, - { 0x5, 0x14, 0x19 }, - { 0x3, 0x5, 0xA }, - { 0x4, 0x1E, 0x32 }, - { 0x5, 0x1E, 0x32 }, - { 0x2, 0x28, 0x32 }, - { 0x1, 0x28, 0x32 }, - { 0x2, 0x23, 0x28 }, - { 0x1, 0x23, 0x28 }, - { 0x3, 0x28, 0x32 }, - { 0x4, 0x28, 0x32 }, - { 0x3, 0x46, 0x50 }, - { 0x4, 0x46, 0x50 }, - { 0x1, 0x46, 0x50 }, - { 0x5, 0x46, 0x50 }, - { 0x4, 0x46, 0x50 }, - { 0x1, 0x46, 0x50 }, - { 0x2, 0x46, 0x50 }, - { 0x5, 0x46, 0x50 }, - { 0x4, 0x46, 0x50 }, - { 0x2, 0x46, 0x50 }, - { 0x5, 0x46, 0x50 }, - { 0x1, 0x46, 0x50 }, - { 0x2, 0x46, 0x50 }, - { 0x3, 0x46, 0x50 }, - { 0x3, 0x46, 0x50 }, - { 0x1, 0x46, 0x50 } -}; - -const u8 ov23_0225426C(const int param0) -{ - return Unk_ov23_02256A00[param0].unk_00[0]; -} - -const u8 ov23_0225427C(const int param0) -{ - return Unk_ov23_02256A00[param0].unk_00[1]; -} - -const u8 ov23_0225428C(const int param0) -{ - return Unk_ov23_02256A00[param0].unk_00[2]; -} diff --git a/src/overlay023/ov23_0225429C.c b/src/overlay023/ov23_0225429C.c deleted file mode 100644 index 0cac930b1a..0000000000 --- a/src/overlay023/ov23_0225429C.c +++ /dev/null @@ -1,60 +0,0 @@ -#include "overlay023/ov23_0225429C.h" - -#include -#include - -typedef struct { - u8 unk_00[3]; -} UnkStruct_ov23_02256AB4; - -static const UnkStruct_ov23_02256AB4 Unk_ov23_02256AB4[] = { - { 0x0, 0x0, 0x0 }, - { 0x4, 0x3, 0x6 }, - { 0x3, 0x3, 0x6 }, - { 0x4, 0x3, 0x6 }, - { 0x3, 0x3, 0x6 }, - { 0x4, 0xC, 0xF }, - { 0x3, 0xC, 0xF }, - { 0x4, 0xC, 0xF }, - { 0x3, 0xC, 0xF }, - { 0x0, 0x0, 0x0 }, - { 0x0, 0x0, 0x0 }, - { 0x1, 0x3, 0x6 }, - { 0x1, 0xC, 0xF }, - { 0x2, 0xA, 0xC }, - { 0x2, 0xA, 0xC }, - { 0x0, 0x0, 0x0 }, - { 0x0, 0x0, 0x0 }, - { 0x0, 0x0, 0x0 }, - { 0x3, 0x5, 0x7 }, - { 0x3, 0xC, 0x10 }, - { 0x4, 0x3, 0x6 }, - { 0x4, 0x8, 0xF }, - { 0x4, 0x5, 0x7 }, - { 0x4, 0xC, 0x10 }, - { 0x2, 0x5, 0x9 }, - { 0x2, 0x5, 0x9 }, - { 0x2, 0x5, 0x9 }, - { 0x2, 0x5, 0x9 }, - { 0x5, 0xF, 0x13 }, - { 0x5, 0x1E, 0x28 }, - { 0x3, 0x5, 0x9 }, - { 0x3, 0x14, 0x1E }, - { 0x0, 0x0, 0x0 }, - { 0x6, 0xF, 0x14 } -}; - -const u8 ov23_0225429C(const int param0) -{ - return Unk_ov23_02256AB4[param0].unk_00[0]; -} - -const u8 ov23_022542AC(const int param0) -{ - return Unk_ov23_02256AB4[param0].unk_00[1]; -} - -const u8 ov23_022542BC(const int param0) -{ - return Unk_ov23_02256AB4[param0].unk_00[2]; -} diff --git a/src/overlay023/secret_bases.c b/src/overlay023/secret_bases.c index 3353977f03..892123878e 100644 --- a/src/overlay023/secret_bases.c +++ b/src/overlay023/secret_bases.c @@ -5,12 +5,12 @@ #include "constants/field/map_prop.h" #include "constants/field_base_tiles.h" -#include "constants/goods.h" #include "constants/heap.h" #include "constants/map_object.h" -#include "constants/traps.h" +#include "generated/goods.h" #include "generated/movement_actions.h" #include "generated/trainer_score_events.h" +#include "generated/traps.h" #include "struct_defs/underground.h" #include "struct_defs/underground_record.h" diff --git a/src/overlay023/trap_prices.c b/src/overlay023/trap_prices.c new file mode 100644 index 0000000000..174363496f --- /dev/null +++ b/src/overlay023/trap_prices.c @@ -0,0 +1,62 @@ +#include "overlay023/trap_prices.h" + +#include +#include + +#include "generated/traps.h" + +#include "overlay023/underground_defs.h" + +// TODO: make this error if it doesn't contain an entry for every trap +static const SpherePrice sTrapPrices[] = { + [TRAP_NONE] = { .sphereType = SPHERE_NONE, .minSize = 0, .maxSize = 0 }, + [TRAP_MOVE_UP] = { .sphereType = BLUE_SPHERE, .minSize = 3, .maxSize = 6 }, + [TRAP_MOVE_RIGHT] = { .sphereType = RED_SPHERE, .minSize = 3, .maxSize = 6 }, + [TRAP_MOVE_DOWN] = { .sphereType = BLUE_SPHERE, .minSize = 3, .maxSize = 6 }, + [TRAP_MOVE_LEFT] = { .sphereType = RED_SPHERE, .minSize = 3, .maxSize = 6 }, + [TRAP_HURL_UP] = { .sphereType = BLUE_SPHERE, .minSize = 12, .maxSize = 15 }, + [TRAP_HURL_RIGHT] = { .sphereType = RED_SPHERE, .minSize = 12, .maxSize = 15 }, + [TRAP_HURL_DOWN] = { .sphereType = BLUE_SPHERE, .minSize = 12, .maxSize = 15 }, + [TRAP_HURL_LEFT] = { .sphereType = RED_SPHERE, .minSize = 12, .maxSize = 15 }, + [TRAP_WARP_DUMMY] = { .sphereType = SPHERE_NONE, .minSize = 0, .maxSize = 0 }, + [TRAP_HI_WARP_DUMMY] = { .sphereType = SPHERE_NONE, .minSize = 0, .maxSize = 0 }, + [TRAP_HOLE] = { .sphereType = PRISM_SPHERE, .minSize = 3, .maxSize = 6 }, + [TRAP_PIT] = { .sphereType = PRISM_SPHERE, .minSize = 12, .maxSize = 15 }, + [TRAP_REVERSE] = { .sphereType = PALE_SPHERE, .minSize = 10, .maxSize = 12 }, + [TRAP_CONFUSE] = { .sphereType = PALE_SPHERE, .minSize = 10, .maxSize = 12 }, + [TRAP_RUN_DUMMY] = { .sphereType = SPHERE_NONE, .minSize = 0, .maxSize = 0 }, + [TRAP_FADE_DUMMY] = { .sphereType = SPHERE_NONE, .minSize = 0, .maxSize = 0 }, + [TRAP_SLOW_DUMMY] = { .sphereType = SPHERE_NONE, .minSize = 0, .maxSize = 0 }, + [TRAP_SMOKE] = { .sphereType = RED_SPHERE, .minSize = 5, .maxSize = 7 }, + [TRAP_BIG_SMOKE] = { .sphereType = RED_SPHERE, .minSize = 12, .maxSize = 16 }, + [TRAP_ROCK] = { .sphereType = BLUE_SPHERE, .minSize = 3, .maxSize = 6 }, + [TRAP_ROCKFALL] = { .sphereType = BLUE_SPHERE, .minSize = 8, .maxSize = 15 }, + [TRAP_FOAM] = { .sphereType = BLUE_SPHERE, .minSize = 5, .maxSize = 7 }, + [TRAP_BUBBLE] = { .sphereType = BLUE_SPHERE, .minSize = 12, .maxSize = 16 }, + [TRAP_ALERT_1] = { .sphereType = PALE_SPHERE, .minSize = 5, .maxSize = 9 }, + [TRAP_ALERT_2] = { .sphereType = PALE_SPHERE, .minSize = 5, .maxSize = 9 }, + [TRAP_ALERT_3] = { .sphereType = PALE_SPHERE, .minSize = 5, .maxSize = 9 }, + [TRAP_ALERT_4] = { .sphereType = PALE_SPHERE, .minSize = 5, .maxSize = 9 }, + [TRAP_LEAF] = { .sphereType = GREEN_SPHERE, .minSize = 15, .maxSize = 19 }, + [TRAP_FLOWER] = { .sphereType = GREEN_SPHERE, .minSize = 30, .maxSize = 40 }, + [TRAP_EMBER] = { .sphereType = RED_SPHERE, .minSize = 5, .maxSize = 9 }, + [TRAP_FIRE] = { .sphereType = RED_SPHERE, .minSize = 20, .maxSize = 30 }, + [TRAP_RADAR_DUMMY] = { .sphereType = SPHERE_NONE, .minSize = 0, .maxSize = 0 }, + [TRAP_DIGGER_DRILL] = { .sphereType = RANDOM_SPHERE_TYPE, .minSize = 15, .maxSize = 20 } +}; + +// params need to be const to match +const u8 TrapGetSpherePriceType(const int trapID) +{ + return sTrapPrices[trapID].sphereType; +} + +const u8 TrapGetSpherePriceMinSize(const int trapID) +{ + return sTrapPrices[trapID].minSize; +} + +const u8 TrapGetSpherePriceMaxSize(const int trapID) +{ + return sTrapPrices[trapID].maxSize; +} diff --git a/src/overlay023/treasure_prices.c b/src/overlay023/treasure_prices.c new file mode 100644 index 0000000000..0145c4ef47 --- /dev/null +++ b/src/overlay023/treasure_prices.c @@ -0,0 +1,86 @@ +#include "overlay023/treasure_prices.h" + +#include +#include + +#include "overlay023/ov23_0223E140.h" +#include "overlay023/underground_defs.h" + +// TODO: make this error if it doesn't contain an entry for every treasure +static const SpherePrice sTreasurePrices[] = { + [MINING_TREASURE_NONE] = { .sphereType = SPHERE_NONE, .minSize = 0, .maxSize = 0 }, + [MINING_SMALL_PRISM_SPHERE] = { .sphereType = SPHERE_NONE, .minSize = 0, .maxSize = 0 }, + [MINING_SMALL_PALE_SPHERE] = { .sphereType = SPHERE_NONE, .minSize = 0, .maxSize = 0 }, + [MINING_SMALL_RED_SPHERE] = { .sphereType = SPHERE_NONE, .minSize = 0, .maxSize = 0 }, + [MINING_SMALL_BLUE_SPHERE] = { .sphereType = SPHERE_NONE, .minSize = 0, .maxSize = 0 }, + [MINING_SMALL_GREEN_SPHERE] = { .sphereType = SPHERE_NONE, .minSize = 0, .maxSize = 0 }, + [MINING_LARGE_PRISM_SPHERE] = { .sphereType = SPHERE_NONE, .minSize = 0, .maxSize = 0 }, + [MINING_LARGE_PALE_SPHERE] = { .sphereType = SPHERE_NONE, .minSize = 0, .maxSize = 0 }, + [MINING_LARGE_RED_SPHERE] = { .sphereType = SPHERE_NONE, .minSize = 0, .maxSize = 0 }, + [MINING_LARGE_BLUE_SPHERE] = { .sphereType = SPHERE_NONE, .minSize = 0, .maxSize = 0 }, + [MINING_LARGE_GREEN_SPHERE] = { .sphereType = SPHERE_NONE, .minSize = 0, .maxSize = 0 }, + [MINING_TREASURE_OVAL_STONE] = { .sphereType = PALE_SPHERE, .minSize = 15, .maxSize = 20 }, + [MINING_TREASURE_ODD_KEYSTONE] = { .sphereType = PRISM_SPHERE, .minSize = 50, .maxSize = 60 }, + [MINING_TREASURE_SUN_STONE] = { .sphereType = RED_SPHERE, .minSize = 25, .maxSize = 35 }, + [MINING_TREASURE_STAR_PIECE] = { .sphereType = PALE_SPHERE, .minSize = 35, .maxSize = 45 }, + [MINING_TREASURE_MOON_STONE] = { .sphereType = PALE_SPHERE, .minSize = 25, .maxSize = 35 }, + [MINING_TREASURE_HARD_STONE] = { .sphereType = RED_SPHERE, .minSize = 25, .maxSize = 35 }, + [MINING_TREASURE_THUNDERSTONE] = { .sphereType = PRISM_SPHERE, .minSize = 25, .maxSize = 35 }, + [MINING_TREASURE_EVERSTONE] = { .sphereType = PALE_SPHERE, .minSize = 25, .maxSize = 35 }, + [MINING_TREASURE_FIRE_STONE] = { .sphereType = RED_SPHERE, .minSize = 25, .maxSize = 35 }, + [MINING_TREASURE_WATER_STONE] = { .sphereType = BLUE_SPHERE, .minSize = 25, .maxSize = 35 }, + [MINING_TREASURE_LEAF_STONE] = { .sphereType = GREEN_SPHERE, .minSize = 25, .maxSize = 35 }, + [MINING_TREASURE_NUGGET_UNUSED] = { .sphereType = BLUE_SPHERE, .minSize = 0, .maxSize = 0 }, + [MINING_TREASURE_HELIX_FOSSIL] = { .sphereType = BLUE_SPHERE, .minSize = 30, .maxSize = 50 }, + [MINING_TREASURE_DOME_FOSSIL] = { .sphereType = GREEN_SPHERE, .minSize = 30, .maxSize = 50 }, + [MINING_TREASURE_CLAW_FOSSIL] = { .sphereType = BLUE_SPHERE, .minSize = 30, .maxSize = 50 }, + [MINING_TREASURE_ROOT_FOSSIL] = { .sphereType = GREEN_SPHERE, .minSize = 30, .maxSize = 50 }, + [MINING_TREASURE_OLD_AMBER] = { .sphereType = PRISM_SPHERE, .minSize = 30, .maxSize = 50 }, + [MINING_TREASURE_RARE_BONE] = { .sphereType = PALE_SPHERE, .minSize = 25, .maxSize = 35 }, + [MINING_TREASURE_REVIVE] = { .sphereType = PALE_SPHERE, .minSize = 5, .maxSize = 10 }, + [MINING_TREASURE_MAX_REVIVE] = { .sphereType = PALE_SPHERE, .minSize = 40, .maxSize = 50 }, + [MINING_TREASURE_RED_SHARD] = { .sphereType = RED_SPHERE, .minSize = 20, .maxSize = 25 }, + [MINING_TREASURE_BLUE_SHARD] = { .sphereType = BLUE_SPHERE, .minSize = 20, .maxSize = 25 }, + [MINING_TREASURE_YELLOW_SHARD] = { .sphereType = PRISM_SPHERE, .minSize = 20, .maxSize = 25 }, + [MINING_TREASURE_GREEN_SHARD] = { .sphereType = GREEN_SPHERE, .minSize = 20, .maxSize = 25 }, + [MINING_TREASURE_HEART_SCALE] = { .sphereType = RED_SPHERE, .minSize = 5, .maxSize = 10 }, + [MINING_TREASURE_ARMOR_FOSSIL] = { .sphereType = BLUE_SPHERE, .minSize = 30, .maxSize = 50 }, + [MINING_TREASURE_SKULL_FOSSIL] = { .sphereType = GREEN_SPHERE, .minSize = 30, .maxSize = 50 }, + [MINING_TREASURE_LIGHT_CLAY] = { .sphereType = PALE_SPHERE, .minSize = 40, .maxSize = 50 }, + [MINING_TREASURE_IRON_BALL] = { .sphereType = PRISM_SPHERE, .minSize = 40, .maxSize = 50 }, + [MINING_TREASURE_ICY_ROCK] = { .sphereType = PALE_SPHERE, .minSize = 35, .maxSize = 40 }, + [MINING_TREASURE_SMOOTH_ROCK] = { .sphereType = PRISM_SPHERE, .minSize = 35, .maxSize = 40 }, + [MINING_TREASURE_HEAT_ROCK] = { .sphereType = RED_SPHERE, .minSize = 40, .maxSize = 50 }, + [MINING_TREASURE_DAMP_ROCK] = { .sphereType = BLUE_SPHERE, .minSize = 40, .maxSize = 50 }, + [MINING_TREASURE_FLAME_PLATE] = { .sphereType = RED_SPHERE, .minSize = 70, .maxSize = 80 }, + [MINING_TREASURE_SPLASH_PLATE] = { .sphereType = BLUE_SPHERE, .minSize = 70, .maxSize = 80 }, + [MINING_TREASURE_ZAP_PLATE] = { .sphereType = PRISM_SPHERE, .minSize = 70, .maxSize = 80 }, + [MINING_TREASURE_MEADOW_PLATE] = { .sphereType = GREEN_SPHERE, .minSize = 70, .maxSize = 80 }, + [MINING_TREASURE_ICICLE_PLATE] = { .sphereType = BLUE_SPHERE, .minSize = 70, .maxSize = 80 }, + [MINING_TREASURE_FIST_PLATE] = { .sphereType = PRISM_SPHERE, .minSize = 70, .maxSize = 80 }, + [MINING_TREASURE_TOXIC_PLATE] = { .sphereType = PALE_SPHERE, .minSize = 70, .maxSize = 80 }, + [MINING_TREASURE_EARTH_PLATE] = { .sphereType = GREEN_SPHERE, .minSize = 70, .maxSize = 80 }, + [MINING_TREASURE_SKY_PLATE] = { .sphereType = BLUE_SPHERE, .minSize = 70, .maxSize = 80 }, + [MINING_TREASURE_MIND_PLATE] = { .sphereType = PALE_SPHERE, .minSize = 70, .maxSize = 80 }, + [MINING_TREASURE_INSECT_PLATE] = { .sphereType = GREEN_SPHERE, .minSize = 70, .maxSize = 80 }, + [MINING_TREASURE_STONE_PLATE] = { .sphereType = PRISM_SPHERE, .minSize = 70, .maxSize = 80 }, + [MINING_TREASURE_SPOOKY_PLATE] = { .sphereType = PALE_SPHERE, .minSize = 70, .maxSize = 80 }, + [MINING_TREASURE_DRACO_PLATE] = { .sphereType = RED_SPHERE, .minSize = 70, .maxSize = 80 }, + [MINING_TREASURE_DREAD_PLATE] = { .sphereType = RED_SPHERE, .minSize = 70, .maxSize = 80 }, + [MINING_TREASURE_IRON_PLATE] = { .sphereType = PRISM_SPHERE, .minSize = 70, .maxSize = 80 } +}; + +u8 Treasure_GetSpherePriceType(int treasureID) +{ + return sTreasurePrices[treasureID].sphereType; +} + +u8 Treasure_GetSpherePriceMinSize(int treasureID) +{ + return sTreasurePrices[treasureID].minSize; +} + +u8 Treasure_GetSpherePriceMaxSize(int treasureID) +{ + return sTreasurePrices[treasureID].maxSize; +} diff --git a/src/overlay023/underground_menu.c b/src/overlay023/underground_menu.c index dcd904219c..c2e02ec909 100644 --- a/src/overlay023/underground_menu.c +++ b/src/overlay023/underground_menu.c @@ -4,7 +4,7 @@ #include #include "constants/heap.h" -#include "constants/traps.h" +#include "generated/traps.h" #include "struct_defs/underground.h" @@ -12,7 +12,6 @@ #include "overlay005/sprite_resource_manager.h" #include "overlay023/ov23_0223E140.h" #include "overlay023/ov23_02241F74.h" -#include "overlay023/ov23_022521F0.h" #include "overlay023/secret_bases.h" #include "overlay023/underground_item_list_menu.h" #include "overlay023/underground_player.h" @@ -20,6 +19,7 @@ #include "overlay023/underground_spheres.h" #include "overlay023/underground_text_printer.h" #include "overlay023/underground_traps.h" +#include "overlay023/underground_vendors.h" #include "bag.h" #include "bg_window.h" @@ -547,7 +547,7 @@ static void UndergroundMenu_InitStartMenu(UndergroundMenu *menu) template.loopAround = TRUE; menu->menu = Menu_New(&template, 28, 4, menu->menuCursorPos, HEAP_ID_FIELD2, PAD_BUTTON_B | PAD_BUTTON_X); - menu->unk_48 = NULL; + menu->listMenu = NULL; Window_ScheduleCopyToVRAM(&menu->primaryWindow); UndergroundMenu_InitStartMenuSprites(menu, optionList, NELEMS(sUndergroundMenuOptions)); @@ -696,9 +696,9 @@ void UndergroundMenu_EraseCurrentMenu(UndergroundMenu *menu) menu->itemListMenu = NULL; } - if (menu->unk_48) { - ListMenu_Free(menu->unk_48, NULL, NULL); - menu->unk_48 = NULL; + if (menu->listMenu) { + ListMenu_Free(menu->listMenu, NULL, NULL); + menu->listMenu = NULL; } else if (menu->spriteCount) { UndergroundMenu_FreeSprites(menu); Menu_Free(menu->menu, NULL); @@ -830,7 +830,7 @@ void UndergroundMenu_PrintTrapDescription(ListMenu *listMenu, u32 index, u8 onIn UndergroundTextPrinter_PrintTextInstant(CommManUnderground_GetItemNameTextPrinter(), bankEntry, FALSE, NULL); } -void ov23_0224FDBC(UndergroundMenu *menu) +void UndergroundMenu_OpenSellTrapsMenu(UndergroundMenu *menu) { menu->getItemCount = UndergroundMenu_GetTrapCount; menu->getItem = UndergroundMenu_GetTrapAtSlot; @@ -847,7 +847,7 @@ void UndergroundMenu_OpenTrapsMenu(UndergroundMenu *menu) menu->getItem = UndergroundMenu_GetTrapAtSlot; menu->cursorCallback = UndergroundMenu_PrintTrapDescription; menu->printCallback = NULL; - menu->itemSelectedMenuCursorPos = menu->listMenuCursorPos; + menu->itemSelectedMenuPos = menu->listMenuCursorPos; UndergroundMenu_InitTrapsMenu(menu, Underground_MoveTrapInInventory); } @@ -947,11 +947,11 @@ static BOOL UndergroundMenu_HandleTrapSelectedMenu(SysTask *sysTask, void *data) UndergroundMenu *menu = data; u32 input = ListMenu_ProcessInput(menu->itemSelectedMenu); - u16 prevPos = menu->itemSelectedMenuCursorPos; + u16 prevPos = menu->itemSelectedMenuPos; - ListMenu_CalcTrueCursorPos(menu->itemSelectedMenu, &menu->itemSelectedMenuCursorPos); + ListMenu_CalcTrueCursorPos(menu->itemSelectedMenu, &menu->itemSelectedMenuPos); - if (prevPos != menu->itemSelectedMenuCursorPos) { + if (prevPos != menu->itemSelectedMenuPos) { Sound_PlayEffect(SEQ_SE_CONFIRM); } @@ -1010,7 +1010,7 @@ static void UndergroundMenu_PrintSphereDescription(ListMenu *listMenu, u32 index UndergroundTextPrinter_PrintTextInstant(CommManUnderground_GetItemNameTextPrinter(), bankEntry, FALSE, NULL); } -void ov23_02250184(UndergroundMenu *menu) +void UndergroundMenu_OpenPayWithSpheresMenu(UndergroundMenu *menu) { menu->getItemCount = UndergroundMenu_GetSphereCount; menu->getItem = UndergroundMenu_GetSphereTypeAtSlot; @@ -1028,7 +1028,7 @@ static void UndergroundMenu_OpenSpheresMenu(UndergroundMenu *menu) menu->getItem = UndergroundMenu_GetSphereTypeAtSlot; menu->getSphereSize = UndergroundMenu_GetSphereSizeAtSlot; menu->cursorCallback = UndergroundMenu_PrintSphereDescription; - menu->itemSelectedMenuCursorPos = menu->listMenuCursorPos; + menu->itemSelectedMenuPos = menu->listMenuCursorPos; UndergroundMenu_InitSpheresMenu(menu, Underground_MoveSphereInInventory); } @@ -1122,11 +1122,11 @@ static BOOL UndergroundMenu_HandleSphereSelectedMenu(SysTask *sysTask, void *dat UndergroundMenu *menu = data; u32 input = ListMenu_ProcessInput(menu->itemSelectedMenu); - u16 prevPos = menu->itemSelectedMenuCursorPos; + u16 prevPos = menu->itemSelectedMenuPos; - ListMenu_CalcTrueCursorPos(menu->itemSelectedMenu, &menu->itemSelectedMenuCursorPos); + ListMenu_CalcTrueCursorPos(menu->itemSelectedMenu, &menu->itemSelectedMenuPos); - if (prevPos != menu->itemSelectedMenuCursorPos) { + if (prevPos != menu->itemSelectedMenuPos) { Sound_PlayEffect(SEQ_SE_CONFIRM); } @@ -1182,7 +1182,7 @@ void UndergroundMenu_PrintTreasureDescription(ListMenu *listMenu, u32 index, u8 UndergroundTextPrinter_PrintTextInstant(CommManUnderground_GetItemNameTextPrinter(), bankEntry, FALSE, NULL); } -void ov23_02250578(UndergroundMenu *menu) +void UndergroundMenu_OpenSellTreasuresMenu(UndergroundMenu *menu) { menu->getItemCount = UndergroundMenu_GetTreasureCount; menu->getItem = UndergroundMenu_GetTreasureAtSlot; @@ -1197,7 +1197,7 @@ void UndergroundMenu_OpenTreasuresMenu(UndergroundMenu *menu) menu->getItemCount = UndergroundMenu_GetTreasureCount; menu->getItem = UndergroundMenu_GetTreasureAtSlot; menu->cursorCallback = UndergroundMenu_PrintTreasureDescription; - menu->itemSelectedMenuCursorPos = menu->listMenuCursorPos; + menu->itemSelectedMenuPos = menu->listMenuCursorPos; UndergroundMenu_InitTreasuresMenu(menu, Underground_MoveTreasureInInventory); } @@ -1290,11 +1290,11 @@ static BOOL UndergroundMenu_HandleTreasureSelectedMenu(SysTask *sysTask, void *d UndergroundMenu *menu = data; u32 input = ListMenu_ProcessInput(menu->itemSelectedMenu); - u16 prevPos = menu->itemSelectedMenuCursorPos; + u16 prevPos = menu->itemSelectedMenuPos; - ListMenu_CalcTrueCursorPos(menu->itemSelectedMenu, &menu->itemSelectedMenuCursorPos); + ListMenu_CalcTrueCursorPos(menu->itemSelectedMenu, &menu->itemSelectedMenuPos); - if (prevPos != menu->itemSelectedMenuCursorPos) { + if (prevPos != menu->itemSelectedMenuPos) { Sound_PlayEffect(SEQ_SE_CONFIRM); } @@ -1360,7 +1360,7 @@ static void UndergroundMenu_GoUpCallback(UndergroundMenu *menu) UndergroundTextPrinter_PrintText(CommManUnderground_GetCommonTextPrinter(), UndergroundCommon_Text_CantReturnFromSecretBase, FALSE, NULL); menu->state = UNDERGROUND_MENU_STATE_CLOSE_AFTER_TEXT; } else { - menu->unk_28C = UndergroundTextPrinter_PrintText(CommManUnderground_GetCommonTextPrinter(), UndergroundCommon_Text_WouldYouLikeToReturnToSurface, FALSE, NULL); + menu->printerID = UndergroundTextPrinter_PrintText(CommManUnderground_GetCommonTextPrinter(), UndergroundCommon_Text_WouldYouLikeToReturnToSurface, FALSE, NULL); menu->state = UNDERGROUND_MENU_STATE_GO_UP_SELECTED; } } @@ -1546,7 +1546,7 @@ static void UndergroundMenu_ColorPlacedGoods(ListMenu *listMenu, u32 index, u8 y } } -void ov23_02250CB0(UndergroundMenu *menu) +void UndergroundMenu_OpenSellGoodsMenu(UndergroundMenu *menu) { menu->getItemCount = UndergroundMenu_GetGoodsCountBag; menu->getItem = UndergroundMenu_GetGoodAtSlotBag; @@ -1563,7 +1563,7 @@ void UndergroundMenu_OpenGoodsMenu(UndergroundMenu *menu) menu->getItem = UndergroundMenu_GetGoodAtSlotBag; menu->cursorCallback = UndergroundMenu_PrintGoodDescription; menu->printCallback = NULL; - menu->itemSelectedMenuCursorPos = menu->listMenuCursorPos; + menu->itemSelectedMenuPos = menu->listMenuCursorPos; UndergroundMenu_InitGoodsMenu(menu, Underground_MoveGoodBag); } @@ -1678,11 +1678,11 @@ static BOOL UndergroundMenu_HandleGoodSelectedMenu(SysTask *sysTask, void *data) UndergroundMenu *menu = data; u32 input = ListMenu_ProcessInput(menu->itemSelectedMenu); - u16 prevPos = menu->itemSelectedMenuCursorPos; + u16 prevPos = menu->itemSelectedMenuPos; - ListMenu_CalcTrueCursorPos(menu->itemSelectedMenu, &menu->itemSelectedMenuCursorPos); + ListMenu_CalcTrueCursorPos(menu->itemSelectedMenu, &menu->itemSelectedMenuPos); - if (prevPos != menu->itemSelectedMenuCursorPos) { + if (prevPos != menu->itemSelectedMenuPos) { Sound_PlayEffect(SEQ_SE_CONFIRM); } @@ -1823,7 +1823,7 @@ void *UndergroundMenu_StartGiftMenu(ExitCallback exitCallback, FieldSystem *fiel menu->exitCallback = exitCallback; menu->state = UNDERGROUND_MENU_STATE_INIT; menu->spriteCount = 0; - menu->unk_48 = NULL; + menu->listMenu = NULL; menu->cursorCallback = NULL; menu->string = String_Init(50 * 2, HEAP_ID_FIELD1); menu->fmtString = String_Init(50 * 2, HEAP_ID_FIELD1); diff --git a/src/overlay023/underground_pc.c b/src/overlay023/underground_pc.c index a703ef06ee..ce3d49fd8b 100644 --- a/src/overlay023/underground_pc.c +++ b/src/overlay023/underground_pc.c @@ -12,7 +12,6 @@ #include "overlay023/base_decoration.h" #include "overlay023/ov23_0223E140.h" #include "overlay023/ov23_02241F74.h" -#include "overlay023/ov23_022521F0.h" #include "overlay023/secret_bases.h" #include "overlay023/underground_item_list_menu.h" #include "overlay023/underground_menu.h" @@ -21,6 +20,7 @@ #include "overlay023/underground_spheres.h" #include "overlay023/underground_text_printer.h" #include "overlay023/underground_traps.h" +#include "overlay023/underground_vendors.h" #include "bg_window.h" #include "brightness_controller.h" @@ -308,9 +308,9 @@ static BOOL UndergroundPC_HandleMenu(SysTask *sysTask, void *data) { UndergroundMenu *menu = data; - u32 input = ListMenu_ProcessInput(menu->unk_48); + u32 input = ListMenu_ProcessInput(menu->listMenu); u16 listPos, cursorPos; - ListMenu_GetListAndCursorPos(menu->unk_48, &listPos, &cursorPos); + ListMenu_GetListAndCursorPos(menu->listMenu, &listPos, &cursorPos); CommManUnderground_StoreCursorAndListPos(UNDERGROUND_MENU_KEY_PC, cursorPos, listPos); UndergroundPC_UpdateCursorPos(menu); @@ -402,7 +402,7 @@ static void UndergroundPC_InitMenu(UndergroundMenu *menu, int startBankEntry, in template.parent = menu; UndergroundMenu_MoveListCursorPosInBounds(menu, trueOptionCount, template.count); - menu->unk_48 = ListMenu_New(&template, menu->listMenuListPos, menu->listMenuCursorPos, HEAP_ID_FIELD1); + menu->listMenu = ListMenu_New(&template, menu->listMenuListPos, menu->listMenuCursorPos, HEAP_ID_FIELD1); } static void UndergroundPC_InitRadarMenu(UndergroundMenu *menu, int startBankEntry, int optionCount, CursorCallback cursorCallback, int unused) @@ -442,17 +442,17 @@ static void UndergroundPC_InitRadarMenu(UndergroundMenu *menu, int startBankEntr template.parent = menu; UndergroundMenu_MoveListCursorPosInBounds(menu, trueOptionCount, template.count); - menu->unk_48 = ListMenu_New(&template, menu->listMenuListPos, menu->listMenuCursorPos, HEAP_ID_FIELD1); + menu->listMenu = ListMenu_New(&template, menu->listMenuListPos, menu->listMenuCursorPos, HEAP_ID_FIELD1); } static BOOL UndergroundPC_HandleRadarMenu(SysTask *sysTask, void *data) { UndergroundMenu *menu = data; - u32 input = ListMenu_ProcessInput(menu->unk_48); + u32 input = ListMenu_ProcessInput(menu->listMenu); u16 listPos, cursorPos; - ListMenu_GetListAndCursorPos(menu->unk_48, &listPos, &cursorPos); + ListMenu_GetListAndCursorPos(menu->listMenu, &listPos, &cursorPos); CommManUnderground_StoreCursorAndListPos(UNDERGROUND_MENU_KEY_PC_RADAR, cursorPos, listPos); UndergroundPC_UpdateCursorPos(menu); @@ -689,7 +689,7 @@ static void UndergroundPC_Main(SysTask *sysTask, void *data) UndergroundMenu_RemoveDescriptionWindowInstant(menu); menu->listMenuCursorPos = CommManUnderground_GetStoredCursorPos(UNDERGROUND_MENU_KEY_PC); menu->listMenuListPos = CommManUnderground_GetStoredListPos(UNDERGROUND_MENU_KEY_PC); - menu->unk_2AE = menu->listMenuCursorPos; + menu->listMenuPos = menu->listMenuCursorPos; UndergroundPC_InitMenu(menu, UndergroundPC_Text_Decorate, 5, UndergroundPC_PrintMenuItemDescription, 0); menu->state = UG_PC_MENU_STATE_MAIN; break; @@ -718,7 +718,7 @@ static void UndergroundPC_Main(SysTask *sysTask, void *data) UndergroundTextPrinter_EraseMessageBoxWindow(CommManUnderground_GetMiscTextPrinter()); menu->listMenuCursorPos = CommManUnderground_GetStoredCursorPos(UNDERGROUND_MENU_KEY_PC_RADAR); menu->listMenuListPos = CommManUnderground_GetStoredListPos(UNDERGROUND_MENU_KEY_PC_RADAR); - menu->unk_2AE = menu->listMenuCursorPos; + menu->listMenuPos = menu->listMenuCursorPos; UndergroundPC_InitRadarMenu(menu, UndergroundPC_Text_TreasureSearch, 3, UndergroundPC_PrintRadarMenuItemDescription, 1); menu->state = UG_PC_MENU_STATE_RADAR_MENU_MAIN; break; @@ -951,10 +951,10 @@ void UndergroundPC_ProcessTakenFlag(int unused0, int unused1, void *data, void * static void UndergroundPC_UpdateCursorPos(UndergroundMenu *menu) { - u16 prevPos = menu->unk_2AE; - ListMenu_CalcTrueCursorPos(menu->unk_48, &menu->unk_2AE); + u16 prevPos = menu->listMenuPos; + ListMenu_CalcTrueCursorPos(menu->listMenu, &menu->listMenuPos); - if (prevPos != menu->unk_2AE) { + if (prevPos != menu->listMenuPos) { Sound_PlayEffect(SEQ_SE_CONFIRM); } } diff --git a/src/overlay023/underground_player.c b/src/overlay023/underground_player.c index 9efd4de95d..62274dfb70 100644 --- a/src/overlay023/underground_player.c +++ b/src/overlay023/underground_player.c @@ -663,16 +663,16 @@ BOOL UndergroundPlayer_IsAffectedByTrap(int netID) return FALSE; } -void ov23_0224ACE8(int netID, int unused1, void *unused2, void *unused3) +void UndergroundPlayer_ProcessVendorTalk(int netID, int unused1, void *unused2, void *unused3) { u8 data = netID; CommSys_SendDataFixedSizeServer(26, &data); } -void ov23_0224ACF8(int unused0, int unused1, void *data, void *unused3) +void UndergroundPlayer_ProcessVendorTalkServer(int unused0, int unused1, void *data, void *unused3) { u8 *netID = data; - ov23_02243020(*netID); + CommManUnderground_QueueTalkedToVendorMessage(*netID); } int UndergroundPlayer_GetXPos(int netID) diff --git a/src/overlay023/underground_traps.c b/src/overlay023/underground_traps.c index c96a056b9c..23dc34cce1 100644 --- a/src/overlay023/underground_traps.c +++ b/src/overlay023/underground_traps.c @@ -4,8 +4,8 @@ #include #include "constants/map_object.h" -#include "constants/traps.h" #include "generated/trainer_score_events.h" +#include "generated/traps.h" #include "struct_defs/underground.h" #include "struct_defs/underground_record.h" diff --git a/src/overlay023/underground_vendors.c b/src/overlay023/underground_vendors.c new file mode 100644 index 0000000000..8f89400962 --- /dev/null +++ b/src/overlay023/underground_vendors.c @@ -0,0 +1,969 @@ +#include "overlay023/underground_vendors.h" + +#include +#include + +#include "constants/field_base_tiles.h" +#include "generated/goods.h" +#include "generated/traps.h" + +#include "struct_decls/struct_02061AB4_decl.h" +#include "struct_defs/underground.h" + +#include "field/field_system.h" +#include "overlay023/ov23_02241F74.h" +#include "overlay023/trap_prices.h" +#include "overlay023/treasure_prices.h" +#include "overlay023/underground_item_list_menu.h" +#include "overlay023/underground_menu.h" +#include "overlay023/underground_text_printer.h" + +#include "bg_window.h" +#include "comm_player_manager.h" +#include "communication_information.h" +#include "communication_system.h" +#include "field_system.h" +#include "goods.h" +#include "heap.h" +#include "list_menu.h" +#include "map_header_data.h" +#include "map_object.h" +#include "menu.h" +#include "message.h" +#include "pokedex.h" +#include "render_window.h" +#include "savedata.h" +#include "sound_playback.h" +#include "string_gf.h" +#include "string_list.h" +#include "string_template.h" +#include "sys_task.h" +#include "sys_task_manager.h" +#include "system.h" +#include "text.h" +#include "unk_0202854C.h" + +#include "res/text/bank/underground_npcs.h" + +#define TRAP_VENDOR_OPTIONS_START UndergroundNPCs_Text_GetTrap +#define GOOD_VENDOR_OPTIONS_START UndergroundNPCs_Text_GetGoods + +#define RESULT_SPHERE_TOO_SMALL 0xFFFB +#define RESULT_BAG_FULL 0xFFFC +#define RESULT_WRONG_SPHERE_TYPE 0xFFFD + +enum VendorType { + VENDOR_TYPE_GOODS = 0, + VENDOR_TYPE_TRAPS, + VENDOR_TYPE_TREASURES, +}; + +enum ShopMenuState { + SHOP_MENU_STATE_INTRO_MESSAGE = 0, + SHOP_MENU_STATE_WAIT_FOR_TEXT, + SHOP_MENU_STATE_INIT_OPTIONS_MENU, + SHOP_MENU_STATE_OPTIONS_MENU, + SHOP_MENU_STATE_INIT_BUY_MENU, + SHOP_MENU_STATE_BUY_MENU, + SHOP_MENU_STATE_BUY_WAIT_FOR_TEXT, + SHOP_MENU_STATE_INIT_PAY_MENU, + SHOP_MENU_STATE_PAY_MENU, + SHOP_MENU_STATE_BUY_SUCCESS, + SHOP_MENU_STATE_END_TRANSACTION, + SHOP_MENU_STATE_11_UNUSED, + SHOP_MENU_STATE_INIT_SELL_MENU, + SHOP_MENU_STATE_SELL_MENU, + SHOP_MENU_STATE_INIT_CONFIRM_SELL_MENU, + SHOP_MENU_STATE_CONFIRM_SELL, + SHOP_MENU_STATE_SELL_SUCCESS, + SHOP_MENU_STATE_EXIT_MESSAGE, + SHOP_MENU_STATE_EXIT_AFTER_TEXT, +}; + +typedef struct UndergroundVendor { + u16 vendorType; + u16 x; + u16 z; +} UndergroundVendor; + +static void UndergroundVendors_DrawPriceWindow(UndergroundMenu *menu); +static void UndergroundVendors_FreeMenu(UndergroundMenu *menu); + +UndergroundVendor sUndergroundVendors[] = { + { .vendorType = VENDOR_TYPE_GOODS, .x = 72, .z = 104 }, + { .vendorType = VENDOR_TYPE_GOODS, .x = 424, .z = 87 }, + { .vendorType = VENDOR_TYPE_GOODS, .x = 200, .z = 185 }, + { .vendorType = VENDOR_TYPE_GOODS, .x = 335, .z = 264 }, + { .vendorType = VENDOR_TYPE_GOODS, .x = 175, .z = 279 }, + { .vendorType = VENDOR_TYPE_GOODS, .x = 424, .z = 439 }, + { .vendorType = VENDOR_TYPE_GOODS, .x = 87, .z = 456 }, + { .vendorType = VENDOR_TYPE_GOODS, .x = 311, .z = 358 }, + { .vendorType = VENDOR_TYPE_TRAPS, .x = 232, .z = 87 }, + { .vendorType = VENDOR_TYPE_TRAPS, .x = 328, .z = 151 }, + { .vendorType = VENDOR_TYPE_TRAPS, .x = 232, .z = 215 }, + { .vendorType = VENDOR_TYPE_TRAPS, .x = 232, .z = 298 }, + { .vendorType = VENDOR_TYPE_TRAPS, .x = 279, .z = 328 }, + { .vendorType = VENDOR_TYPE_TRAPS, .x = 279, .z = 456 }, + { .vendorType = VENDOR_TYPE_TRAPS, .x = 183, .z = 392 }, + { .vendorType = VENDOR_TYPE_TRAPS, .x = 279, .z = 245 }, + { .vendorType = VENDOR_TYPE_TREASURES, .x = 40, .z = 471 }, + { .vendorType = VENDOR_TYPE_TREASURES, .x = 471, .z = 72 }, + { .vendorType = VENDOR_TYPE_TREASURES, .x = 471, .z = 471 }, + { .vendorType = VENDOR_TYPE_TREASURES, .x = 40, .z = 72 } +}; + +static const WindowTemplate sWindowTemplate = { + .bgLayer = BG_LAYER_MAIN_3, + .tilemapLeft = 25, + .tilemapTop = 13, + .width = 6, + .height = 4, + .palette = 13, + .baseTile = BASE_TILE_MESSAGE_WINDOW - 6 * 4 +}; + +static void UndergroundVendors_InitTrapsVendorInventory(UndergroundMenu *menu, int vendorIndex) +{ + Underground *underground = SaveData_GetUnderground(FieldSystem_GetSaveData(menu->fieldSystem)); + + MATHRandContext16 rand; + MATH_InitRand16(&rand, Underground_GetRandomSeed(underground) + vendorIndex); + + int trapID; + + for (int i = 0; i < SHOP_INVENTORY_SIZE; i++) { + if (i == 0) { + trapID = TRAP_DIGGER_DRILL; + } else { + trapID = MATH_Rand16(&rand, TRAP_MAX - 1) + 1; + } + + for (int j = 0; j < i; j++) { + if (menu->shopInventory[j] == trapID) { + trapID = TRAP_NONE; + } + } + + if (trapID == TRAP_NONE) { + i--; + continue; + } + int maxSize; // needs to be declared before below variable to match + int minSize = TrapGetSpherePriceMinSize(trapID); + maxSize = TrapGetSpherePriceMaxSize(trapID); + + if (minSize == 0 && maxSize == 0) { + i--; + continue; + } + + menu->shopInventory[i] = trapID; + menu->shopPriceTypes[i] = TrapGetSpherePriceType(trapID); + + if (menu->shopPriceTypes[i] == RANDOM_SPHERE_TYPE) { + menu->shopPriceTypes[i] = MATH_Rand16(&rand, 6 - 1) + 1; + } + + menu->shopPriceSizes[i] = MATH_Rand16(&rand, maxSize - minSize) + minSize; + } +} + +static void UndergroundVendors_InitGoodsVendorInventory(UndergroundMenu *menu, int vendorIndex) +{ + MATHRandContext16 rand; + int maxSize, minSize; + SaveData *saveData = FieldSystem_GetSaveData(menu->fieldSystem); + Underground *underground = SaveData_GetUnderground(saveData); + BOOL natDexObtained = Pokedex_IsNationalDexObtained(SaveData_GetPokedex(saveData)); + + MATH_InitRand16(&rand, Underground_GetRandomSeed(underground) + vendorIndex); + + for (int i = 0; i < SHOP_INVENTORY_SIZE; i++) { + int goodID = MATH_Rand16(&rand, UG_GOOD_MAX - 1) + 1; + + for (int j = 0; j < i; j++) { + if (menu->shopInventory[j] == goodID) { + goodID = UG_GOOD_NONE; + } + } + + if (goodID == UG_GOOD_NONE) { + i--; + continue; + } + + menu->shopInventory[i] = goodID; + menu->shopPriceTypes[i] = Good_GetSpherePriceType(goodID); + + if (!natDexObtained && Good_IsNatDexRequired(goodID) == TRUE) { + i--; + continue; + } + + if (menu->shopPriceTypes[i] == SPHERE_NONE) { + i--; + continue; + } else if (menu->shopPriceTypes[i] == RANDOM_SPHERE_TYPE) { + menu->shopPriceTypes[i] = MATH_Rand16(&rand, 6 - 1) + 1; + } + + minSize = Good_GetSpherePriceMinSize(goodID); + maxSize = Good_GetSpherePriceMaxSize(goodID); + + menu->shopPriceSizes[i] = MATH_Rand16(&rand, maxSize - minSize) + minSize; + } +} + +static int UndergroundVendors_TryBuyItem(UndergroundMenu *menu, int itemSlot, int sphereSlot) +{ + BOOL itemAdded = FALSE; + Underground *underground = SaveData_GetUnderground(FieldSystem_GetSaveData(menu->fieldSystem)); + + if (menu->shopPriceTypes[itemSlot] != UndergroundMenu_GetSphereTypeAtSlot(sphereSlot, menu)) { + return RESULT_WRONG_SPHERE_TYPE; + } + + if (menu->shopPriceSizes[itemSlot] > UndergroundMenu_GetSphereSizeAtSlot(sphereSlot, menu)) { + return RESULT_SPHERE_TOO_SMALL; + } + + if (menu->vendorType == VENDOR_TYPE_TRAPS) { + itemAdded = Underground_TryAddTrap(underground, menu->shopInventory[itemSlot]); + } else if (menu->vendorType == VENDOR_TYPE_GOODS) { + itemAdded = Underground_TryAddGoodBag(underground, menu->shopInventory[itemSlot]); + } else if (menu->vendorType == VENDOR_TYPE_TREASURES) { + itemAdded = Underground_TryAddTreasure(underground, menu->shopInventory[itemSlot]); + } + + if (itemAdded) { + Underground_RemoveSphereAtSlot(underground, sphereSlot); + } else { + return RESULT_BAG_FULL; + } + + return menu->shopInventory[itemSlot]; +} + +static void *UndergroundVendors_InitVendorOptionsMenu(UndergroundMenu *menu) +{ + int optionCount = 3; + + if (menu->vendorType == VENDOR_TYPE_TREASURES) { + optionCount = 2; + } + + UndergroundMenu_EraseCurrentMenu(menu); + + menu->menuOptions = StringList_New(optionCount, HEAP_ID_FIELD1); + + Window_Add(menu->fieldSystem->bgConfig, &menu->primaryWindow, BG_LAYER_MAIN_3, 19, 3, 12, optionCount * 2, 13, BASE_TILE_MESSAGE_WINDOW - 12 * 6); + Window_DrawStandardFrame(&menu->primaryWindow, TRUE, BASE_TILE_STANDARD_WINDOW_FRAME, 11); + + if (menu->vendorType == VENDOR_TYPE_TRAPS) { + int baseBankEntry = TRAP_VENDOR_OPTIONS_START; + UndergroundVendors_InitTrapsVendorInventory(menu, menu->vendorIndex); + StringList_AddFromMessageBank(menu->menuOptions, UndergroundTextPrinter_GetMessageLoader(CommManUnderground_GetMiscTextPrinter()), baseBankEntry, 0); + StringList_AddFromMessageBank(menu->menuOptions, UndergroundTextPrinter_GetMessageLoader(CommManUnderground_GetMiscTextPrinter()), baseBankEntry + 1, 1); + StringList_AddFromMessageBank(menu->menuOptions, UndergroundTextPrinter_GetMessageLoader(CommManUnderground_GetMiscTextPrinter()), baseBankEntry + 2, LIST_CANCEL); + } else if (menu->vendorType == VENDOR_TYPE_GOODS) { + int baseBankEntry = GOOD_VENDOR_OPTIONS_START; + UndergroundVendors_InitGoodsVendorInventory(menu, menu->vendorIndex); + StringList_AddFromMessageBank(menu->menuOptions, UndergroundTextPrinter_GetMessageLoader(CommManUnderground_GetMiscTextPrinter()), baseBankEntry, 0); + StringList_AddFromMessageBank(menu->menuOptions, UndergroundTextPrinter_GetMessageLoader(CommManUnderground_GetMiscTextPrinter()), baseBankEntry + 1, 1); + StringList_AddFromMessageBank(menu->menuOptions, UndergroundTextPrinter_GetMessageLoader(CommManUnderground_GetMiscTextPrinter()), baseBankEntry + 2, LIST_CANCEL); + } else { + StringList_AddFromMessageBank(menu->menuOptions, UndergroundTextPrinter_GetMessageLoader(CommManUnderground_GetMiscTextPrinter()), UndergroundNPCs_Text_GiveTreasures, 0); + StringList_AddFromMessageBank(menu->menuOptions, UndergroundTextPrinter_GetMessageLoader(CommManUnderground_GetMiscTextPrinter()), UndergroundNPCs_Text_Cancel, LIST_CANCEL); + } + + ListMenuTemplate template; + MI_CpuCopy8(UndergroundTextPrinter_GetListMenuTemplate(), &template, sizeof(ListMenuTemplate)); + + template.choices = menu->menuOptions; + template.window = &menu->primaryWindow; + template.count = optionCount; + template.maxDisplay = optionCount; + + menu->listMenuListPos = CommManUnderground_GetStoredListPos(UNDERGROUND_MENU_KEY_VENDOR_OPTIONS); + menu->listMenuCursorPos = CommManUnderground_GetStoredCursorPos(UNDERGROUND_MENU_KEY_VENDOR_OPTIONS); + + UndergroundMenu_MoveListCursorPosInBounds(menu, template.maxDisplay, template.count); + + menu->listMenu = ListMenu_New(&template, menu->listMenuListPos, menu->listMenuCursorPos, HEAP_ID_FIELD1); + menu->listMenuPos = menu->listMenuCursorPos; + + Window_CopyToVRAM(&menu->primaryWindow); + + return menu; +} + +static void UndergroundVendors_PrintItemDescriptionAndBuyPrice(ListMenu *listMenu, u32 index, u8 onInit) +{ + UndergroundMenu *menu = (UndergroundMenu *)ListMenu_GetAttribute(listMenu, LIST_MENU_PARENT); + + Window_FillTilemap(&menu->secondaryWindow, 15); + MessageLoader_GetString(UndergroundTextPrinter_GetMessageLoader(CommManUnderground_GetMiscTextPrinter()), UndergroundNPCs_Text_RequiredSphere + menu->isSelling, menu->string); + Text_AddPrinterWithParams(&menu->secondaryWindow, FONT_SYSTEM, menu->string, 1, 1, TEXT_SPEED_NO_TRANSFER, NULL); + + if (index != LIST_CANCEL) { + StringTemplate_SetUndergroundItemName(menu->template, 2, menu->shopPriceTypes[index]); + StringTemplate_SetNumber(menu->template, 6, menu->shopPriceSizes[index], 2, PADDING_MODE_SPACES, CHARSET_MODE_EN); + MessageLoader_GetString(UndergroundTextPrinter_GetMessageLoader(CommManUnderground_GetMiscTextPrinter()), UndergroundNPCs_Text_SphereTemplate, menu->string); + StringTemplate_Format(menu->template, menu->fmtString, menu->string); + Text_AddPrinterWithParams(&menu->secondaryWindow, FONT_SYSTEM, menu->fmtString, 1, 17, TEXT_SPEED_NO_TRANSFER, NULL); + } + + Window_ScheduleCopyToVRAM(&menu->secondaryWindow); + + // make sure we have the right type of -2 + if (index == MENU_CANCELED) { + index = LIST_CANCEL; + } + + if (menu->vendorType == VENDOR_TYPE_TRAPS) { + UndergroundMenu_PrintTrapDescription(listMenu, index, onInit); + } else if (menu->vendorType == VENDOR_TYPE_GOODS) { + UndergroundMenu_PrintGoodDescription(listMenu, index, onInit); + } else { + UndergroundMenu_PrintTreasureDescription(listMenu, index, onInit); + } +} + +static void UndergroundVendors_PrintItemDescriptionAndSellPrice(ListMenu *listMenu, u32 index, u8 onInit) +{ + MATHRandContext16 rand; + UndergroundMenu *menu = (UndergroundMenu *)ListMenu_GetAttribute(listMenu, LIST_MENU_PARENT); + Underground *underground = SaveData_GetUnderground(FieldSystem_GetSaveData(menu->fieldSystem)); + int minSize, maxSize; + int sphereType = SPHERE_NONE, sphereSize; + + Window_FillTilemap(&menu->secondaryWindow, 15); + + if (index != LIST_CANCEL) { + if (menu->vendorType == VENDOR_TYPE_TRAPS) { + const int trapID = UndergroundMenu_GetTrapAtSlot(index, menu); + MATH_InitRand16(&rand, Underground_GetRandomSeed(underground) + menu->vendorIndex + trapID); + sphereType = TrapGetSpherePriceType(trapID); + + if (sphereType == RANDOM_SPHERE_TYPE) { + sphereType = MATH_Rand16(&rand, SPHERE_TYPE_MAX - 1) + 1; + } + + minSize = TrapGetSpherePriceMinSize(trapID); + maxSize = TrapGetSpherePriceMaxSize(trapID); + sphereSize = MATH_Rand16(&rand, maxSize - minSize) + minSize; + sphereSize /= 2; + } else if (menu->vendorType == VENDOR_TYPE_GOODS) { + const int goodID = UndergroundMenu_GetGoodAtSlotBag(index, menu); + MATH_InitRand16(&rand, Underground_GetRandomSeed(underground) + menu->vendorIndex + goodID); + sphereType = Good_GetSpherePriceType(goodID); + + if (sphereType == RANDOM_SPHERE_TYPE) { + sphereType = MATH_Rand16(&rand, SPHERE_TYPE_MAX - 1) + 1; + } + + minSize = Good_GetSpherePriceMinSize(goodID); + maxSize = Good_GetSpherePriceMaxSize(goodID); + sphereSize = MATH_Rand16(&rand, maxSize - minSize) + minSize; + sphereSize /= 2; + } else { + const int treasureID = UndergroundMenu_GetTreasureAtSlot(index, menu); + MATH_InitRand16(&rand, Underground_GetRandomSeed(underground) + menu->vendorIndex + treasureID); + sphereType = Treasure_GetSpherePriceType(treasureID); + + if (sphereType == RANDOM_SPHERE_TYPE) { + sphereType = MATH_Rand16(&rand, SPHERE_TYPE_MAX - 1) + 1; + } + + minSize = Treasure_GetSpherePriceMinSize(treasureID); + maxSize = Treasure_GetSpherePriceMaxSize(treasureID); + sphereSize = MATH_Rand16(&rand, maxSize - minSize) + minSize; + } + } + + MessageLoader_GetString(UndergroundTextPrinter_GetMessageLoader(CommManUnderground_GetMiscTextPrinter()), UndergroundNPCs_Text_RequiredSphere + menu->isSelling, menu->string); + Text_AddPrinterWithParams(&menu->secondaryWindow, FONT_SYSTEM, menu->string, 1, 1, TEXT_SPEED_NO_TRANSFER, NULL); + + if (index != LIST_CANCEL) { + if (sphereType != SPHERE_NONE) { + StringTemplate_SetUndergroundItemName(menu->template, 2, sphereType); + StringTemplate_SetNumber(menu->template, 6, sphereSize, 2, PADDING_MODE_SPACES, CHARSET_MODE_EN); + MessageLoader_GetString(UndergroundTextPrinter_GetMessageLoader(CommManUnderground_GetMiscTextPrinter()), UndergroundNPCs_Text_SphereTemplate, menu->string); + StringTemplate_Format(menu->template, menu->fmtString, menu->string); + Text_AddPrinterWithParams(&menu->secondaryWindow, FONT_SYSTEM, menu->fmtString, 1, 17, TEXT_SPEED_NO_TRANSFER, NULL); + + menu->shopPriceTypes[0] = sphereType; + menu->shopPriceSizes[0] = sphereSize; + } else { + menu->shopPriceTypes[0] = sphereType; + + MessageLoader_GetString(UndergroundTextPrinter_GetMessageLoader(CommManUnderground_GetMiscTextPrinter()), UndergroundNPCs_Text_NotForSale, menu->string); + Text_AddPrinterWithParams(&menu->secondaryWindow, FONT_SYSTEM, menu->string, 1, 17, TEXT_SPEED_NO_TRANSFER, NULL); + } + } + + Window_ScheduleCopyToVRAM(&menu->secondaryWindow); + + if (menu->vendorType == VENDOR_TYPE_TRAPS) { + UndergroundMenu_PrintTrapDescription(listMenu, index, onInit); + } else if (menu->vendorType == VENDOR_TYPE_GOODS) { + UndergroundMenu_PrintGoodDescription(listMenu, index, onInit); + } else { + UndergroundMenu_PrintTreasureDescription(listMenu, index, onInit); + } +} + +static int UndergroundVendors_GetItemAtInventorySlot(int slot, void *menu) +{ + UndergroundMenu *ugMenu = menu; + + if (slot >= SHOP_INVENTORY_SIZE) { + return 0; + } + + return ugMenu->shopInventory[slot]; +} + +static void UndergroundVendors_InitBuyMenu(UndergroundMenu *menu) +{ + const int optionCount = SHOP_INVENTORY_SIZE + 1; + + UndergroundMenu_EraseCurrentMenu(menu); + menu->menuOptions = StringList_New(optionCount, HEAP_ID_FIELD1); + + Window_Add(menu->fieldSystem->bgConfig, &menu->primaryWindow, BG_LAYER_MAIN_3, 19, 3, 12, optionCount * 2, 13, BASE_TILE_MESSAGE_WINDOW - 12 * 6 - 12 * 12); + Window_DrawStandardFrame(&menu->primaryWindow, TRUE, BASE_TILE_STANDARD_WINDOW_FRAME, 11); + + MessageLoader *loader; + + if (menu->vendorType == VENDOR_TYPE_TRAPS) { + loader = MessageLoader_Init(MSG_LOADER_PRELOAD_ENTIRE_BANK, NARC_INDEX_MSGDATA__PL_MSG, TEXT_BANK_UNDERGROUND_TRAPS, HEAP_ID_FIELD1); + UndergroundTextPrinter_ChangeMessageLoaderBank(CommManUnderground_GetItemNameTextPrinter(), TEXT_BANK_UNDERGROUND_TRAPS, MSG_LOADER_PRELOAD_ENTIRE_BANK); + } else if (menu->vendorType == VENDOR_TYPE_GOODS) { + loader = MessageLoader_Init(MSG_LOADER_PRELOAD_ENTIRE_BANK, NARC_INDEX_MSGDATA__PL_MSG, TEXT_BANK_UNDERGROUND_GOODS, HEAP_ID_FIELD1); + UndergroundTextPrinter_ChangeMessageLoaderBank(CommManUnderground_GetItemNameTextPrinter(), TEXT_BANK_UNDERGROUND_GOODS, MSG_LOADER_PRELOAD_ENTIRE_BANK); + } else { + loader = MessageLoader_Init(MSG_LOADER_PRELOAD_ENTIRE_BANK, NARC_INDEX_MSGDATA__PL_MSG, TEXT_BANK_UNDERGROUND_ITEMS, HEAP_ID_FIELD1); + UndergroundTextPrinter_ChangeMessageLoaderBank(CommManUnderground_GetItemNameTextPrinter(), TEXT_BANK_UNDERGROUND_ITEMS, MSG_LOADER_PRELOAD_ENTIRE_BANK); + } + + for (int i = 0; i < optionCount - 1; i++) { + StringList_AddFromMessageBank(menu->menuOptions, loader, menu->shopInventory[i], i); + } + + StringList_AddFromMessageBank(menu->menuOptions, loader, 0, LIST_CANCEL); + MessageLoader_Free(loader); + + ListMenuTemplate template; + MI_CpuCopy8(UndergroundTextPrinter_GetListMenuTemplate(), &template, sizeof(ListMenuTemplate)); + + template.choices = menu->menuOptions; + template.window = &menu->primaryWindow; + template.count = optionCount; + template.maxDisplay = optionCount; + template.cursorCallback = UndergroundVendors_PrintItemDescriptionAndBuyPrice; + template.parent = menu; + + menu->getItem = UndergroundVendors_GetItemAtInventorySlot; + menu->listMenuListPos = CommManUnderground_GetStoredListPos(UNDERGROUND_MENU_KEY_BUY_GOODS + menu->vendorType); + menu->listMenuCursorPos = CommManUnderground_GetStoredCursorPos(UNDERGROUND_MENU_KEY_BUY_GOODS + menu->vendorType); + menu->listMenuPos = menu->listMenuCursorPos; + + UndergroundMenu_MoveListCursorPosInBounds(menu, template.maxDisplay, template.count); + menu->listMenu = ListMenu_New(&template, menu->listMenuListPos, menu->listMenuCursorPos, HEAP_ID_FIELD1); + Window_CopyToVRAM(&menu->primaryWindow); +} + +static void UndergroundVendors_EraseCurrentMenu(UndergroundMenu *menu, BOOL unused) +{ + if (Window_IsInUse(&menu->secondaryWindow)) { + Window_EraseStandardFrame(&menu->secondaryWindow, TRUE); + Window_Remove(&menu->secondaryWindow); + } + + UndergroundMenu_EraseCurrentMenu(menu); +} + +static void UndergroundVendors_PrintConfirmSellPrompt(int slot, UndergroundMenu *menu) +{ + if (menu->vendorType == VENDOR_TYPE_TRAPS) { + int trapID = UndergroundMenu_GetTrapAtSlot(slot, menu); + UndergroundVendors_SetTrapNameForPrinter(2, trapID); + } else if (menu->vendorType == VENDOR_TYPE_GOODS) { + int goodID = UndergroundMenu_GetGoodAtSlotBag(slot, menu); + UndergroundVendors_SetGoodNameForPrinter(2, goodID); + } else { + int treasureID = UndergroundMenu_GetTreasureAtSlot(slot, menu); + UndergroundVendors_SetTreasureNameForPrinter(2, treasureID); + } + + UndergroundVendors_SetTreasureNameForPrinter(4, menu->shopPriceTypes[0]); + UndergroundVendors_PrintNPCMessage(UndergroundNPCs_Text_ConfirmTradePrompt); +} + +static u32 UndergroundVendors_TrySellItem(UndergroundMenu *menu) +{ + Underground *underground = SaveData_GetUnderground(FieldSystem_GetSaveData(menu->fieldSystem)); + + if (UndergroundInventory_TryAddSphere(menu->shopPriceTypes[0], menu->shopPriceSizes[0])) { + if (menu->vendorType == VENDOR_TYPE_TRAPS) { + Underground_RemoveTrapAtSlot(underground, menu->shopSelection); + } else if (menu->vendorType == VENDOR_TYPE_GOODS) { + Underground_RemoveGoodAtSlotBag(underground, menu->shopSelection); + } else if (menu->vendorType == VENDOR_TYPE_TREASURES) { + Underground_RemoveTreasureAtSlot(underground, menu->shopSelection); + } + + return menu->shopPriceTypes[0]; + } + + return RESULT_BAG_FULL; +} + +int UndergroundVendors_ReturnFFFE(void *unused) +{ + return 0xFFFE; +} + +static void UndergroundVendors_FreeMenu(UndergroundMenu *menu) +{ + String_Free(menu->string); + String_Free(menu->fmtString); + StringTemplate_Free(menu->template); + Heap_Free(menu); +} + +void *UndergroundVendors_ReturnNull(int unused0, FieldSystem *unused1, int unused2) +{ + return NULL; +} + +int UndergroundVendors_PrintNPCMessage(int bankEntry) +{ + UndergroundTextPrinter_ChangeMessageLoaderBank(CommManUnderground_GetMiscTextPrinter(), TEXT_BANK_UNDERGROUND_NPCS, MSG_LOADER_LOAD_ON_DEMAND); + UndergroundTextPrinter_SetPlayerNameIndex0(CommManUnderground_GetMiscTextPrinter(), CommInfo_TrainerInfo(CommSys_CurNetId())); + + return UndergroundTextPrinter_PrintText(CommManUnderground_GetMiscTextPrinter(), bankEntry, FALSE, NULL); +} + +void UndergroundVendors_EraseMessageBoxWindow(void) +{ + UndergroundTextPrinter_EraseMessageBoxWindow(CommManUnderground_GetMiscTextPrinter()); +} + +void UndergroundVendors_SetTreasureNameForPrinter(int index, int treasureID) +{ + UndergroundTextPrinter_SetUndergroundItemName(CommManUnderground_GetMiscTextPrinter(), index, treasureID); +} + +void UndergroundVendors_SetTrapNameForPrinter(int index, int trapID) +{ + UndergroundTextPrinter_SetUndergroundTrapNameWithIndex(CommManUnderground_GetMiscTextPrinter(), index, trapID); +} + +void UndergroundVendors_SetGoodNameForPrinter(int index, int goodID) +{ + UndergroundTextPrinter_SetGoodNameWithIndex(CommManUnderground_GetMiscTextPrinter(), index, goodID); +} + +static void UndergroundVendors_DrawPriceWindow(UndergroundMenu *menu) +{ + if (!Window_IsInUse(&menu->secondaryWindow)) { + Window_Add(menu->fieldSystem->bgConfig, &menu->secondaryWindow, BG_LAYER_MAIN_3, 1, 12, 12, 4, 13, 1); + Window_DrawStandardFrame(&menu->secondaryWindow, TRUE, BASE_TILE_STANDARD_WINDOW_FRAME, 11); + } + + Window_FillTilemap(&menu->secondaryWindow, 15); + Window_CopyToVRAM(&menu->secondaryWindow); +} + +void UndergroundMenu_PrintMenuDescription(UndergroundMenu *menu, int bankEntry) +{ + Window_Add(menu->fieldSystem->bgConfig, &menu->menuDescriptionWindow, BG_LAYER_MAIN_3, 1, 1, 7, 4, 13, 51); + Window_DrawStandardFrame(&menu->menuDescriptionWindow, TRUE, BASE_TILE_STANDARD_WINDOW_FRAME, 11); + + Window_FillTilemap(&menu->menuDescriptionWindow, 15); + Window_CopyToVRAM(&menu->menuDescriptionWindow); + + MessageLoader_GetString(UndergroundTextPrinter_GetMessageLoader(CommManUnderground_GetMiscTextPrinter()), bankEntry, menu->string); + Text_AddPrinterWithParams(&menu->menuDescriptionWindow, FONT_SYSTEM, menu->string, 1, 1, TEXT_SPEED_NO_TRANSFER, NULL); + Window_ScheduleCopyToVRAM(&menu->menuDescriptionWindow); +} + +void UndergroundMenu_RemoveDescriptionWindow(UndergroundMenu *menu) +{ + if (Window_IsInUse(&menu->menuDescriptionWindow)) { + Window_EraseStandardFrame(&menu->menuDescriptionWindow, TRUE); + Window_Remove(&menu->menuDescriptionWindow); + } +} + +void UndergroundMenu_RemoveDescriptionWindowInstant(UndergroundMenu *menu) +{ + if (Window_IsInUse(&menu->menuDescriptionWindow)) { + Window_EraseStandardFrame(&menu->menuDescriptionWindow, FALSE); + Window_Remove(&menu->menuDescriptionWindow); + } +} + +static int UndergroundVendors_FindVendorAtCoordinates(int x, int z, int *outIndex) +{ + int vendorTotal = NELEMS(sUndergroundVendors); + + for (int i = 0; i < vendorTotal; i++) { + if (sUndergroundVendors[i].x == x && sUndergroundVendors[i].z == z) { + *outIndex = i; + return sUndergroundVendors[i].vendorType; + } + } + + GF_ASSERT(FALSE); + return 0; +} + +static void UndergroundVendors_ShopMenuTask(SysTask *sysTask, void *data) +{ + UndergroundMenu *menu = data; + u32 input; + u16 listPos, cursorPos, prevPos; + + switch (menu->state) { + case SHOP_MENU_STATE_INTRO_MESSAGE: + if (menu->vendorType == VENDOR_TYPE_TREASURES) { + UndergroundVendors_PrintNPCMessage(UndergroundNPCs_Text_IllTradeSpheresForTreasures); + } else { + UndergroundVendors_PrintNPCMessage(UndergroundNPCs_Text_IllTradeYouSomething); + } + + menu->state = SHOP_MENU_STATE_WAIT_FOR_TEXT; + break; + case SHOP_MENU_STATE_WAIT_FOR_TEXT: + if (!UndergroundTextPrinter_IsPrinterActive(CommManUnderground_GetMiscTextPrinter())) { + menu->state = SHOP_MENU_STATE_INIT_OPTIONS_MENU; + } + break; + case SHOP_MENU_STATE_INIT_OPTIONS_MENU: + UndergroundVendors_InitVendorOptionsMenu(menu); + menu->state = SHOP_MENU_STATE_OPTIONS_MENU; + break; + case SHOP_MENU_STATE_OPTIONS_MENU: + input = ListMenu_ProcessInput(menu->listMenu); + ListMenu_GetListAndCursorPos(menu->listMenu, &listPos, &cursorPos); + CommManUnderground_StoreCursorAndListPos(UNDERGROUND_MENU_KEY_VENDOR_OPTIONS, cursorPos, listPos); + + prevPos = menu->listMenuPos; + ListMenu_CalcTrueCursorPos(menu->listMenu, &menu->listMenuPos); + + if (prevPos != menu->listMenuPos) { + Sound_PlayEffect(SEQ_SE_CONFIRM); + } + + switch (input) { + case LIST_CANCEL: + Sound_PlayEffect(SEQ_SE_CONFIRM); + UndergroundVendors_EraseCurrentMenu(menu, FALSE); + menu->state = SHOP_MENU_STATE_EXIT_MESSAGE; + break; + case LIST_NOTHING_CHOSEN: + break; + default: + if (menu->vendorType == VENDOR_TYPE_TREASURES) { + menu->isSelling = TRUE; + menu->state = SHOP_MENU_STATE_INIT_SELL_MENU; + } else { + menu->isSelling = input; + + if (input == 0) { + Sound_PlayEffect(SEQ_SE_CONFIRM); + menu->state = SHOP_MENU_STATE_INIT_BUY_MENU; + } else { + Sound_PlayEffect(SEQ_SE_CONFIRM); + menu->state = SHOP_MENU_STATE_INIT_SELL_MENU; + } + } + break; + } + break; + case SHOP_MENU_STATE_INIT_BUY_MENU: + UndergroundVendors_DrawPriceWindow(menu); + UndergroundVendors_InitBuyMenu(menu); + menu->state = SHOP_MENU_STATE_BUY_MENU; + break; + case SHOP_MENU_STATE_BUY_MENU: + input = ListMenu_ProcessInput(menu->listMenu); + ListMenu_GetListAndCursorPos(menu->listMenu, &listPos, &cursorPos); + CommManUnderground_StoreCursorAndListPos(UNDERGROUND_MENU_KEY_BUY_GOODS + menu->vendorType, cursorPos, listPos); + + prevPos = menu->listMenuPos; + ListMenu_CalcTrueCursorPos(menu->listMenu, &menu->listMenuPos); + + if (prevPos != menu->listMenuPos) { + Sound_PlayEffect(SEQ_SE_CONFIRM); + } + + // make sure we have the right type of -2 + if (input == MENU_CANCELED) { + input = LIST_CANCEL; + } + + if (input != LIST_NOTHING_CHOSEN) { + UndergroundTextPrinter_EraseMessageBoxWindow(CommManUnderground_GetItemNameTextPrinter()); + } + + switch (input) { + case LIST_CANCEL: + Sound_PlayEffect(SEQ_SE_CONFIRM); + UndergroundVendors_EraseCurrentMenu(menu, TRUE); + menu->state = SHOP_MENU_STATE_INIT_OPTIONS_MENU; + break; + case LIST_NOTHING_CHOSEN: + break; + default: + Sound_PlayEffect(SEQ_SE_CONFIRM); + menu->shopSelection = input; + + if (menu->vendorType == VENDOR_TYPE_TRAPS) { + UndergroundVendors_SetTrapNameForPrinter(2, menu->shopInventory[menu->shopSelection]); + } else if (menu->vendorType == VENDOR_TYPE_GOODS) { + UndergroundVendors_SetGoodNameForPrinter(2, menu->shopInventory[menu->shopSelection]); + } + + UndergroundVendors_PrintNPCMessage(UndergroundNPCs_Text_PickSpherePrompt); + menu->state = SHOP_MENU_STATE_BUY_WAIT_FOR_TEXT; + break; + } + break; + case SHOP_MENU_STATE_BUY_WAIT_FOR_TEXT: + if (!UndergroundTextPrinter_IsPrinterActive(CommManUnderground_GetMiscTextPrinter())) { + if (JOY_NEW(PAD_BUTTON_A)) { + menu->state = SHOP_MENU_STATE_INIT_PAY_MENU; + } + } + break; + case SHOP_MENU_STATE_INIT_PAY_MENU: + UndergroundMenu_EraseCurrentMenu(menu); + + menu->listMenuCursorPos = CommManUnderground_GetStoredCursorPos(UNDERGROUND_MENU_KEY_PAY_WITH_SPHERES); + menu->listMenuListPos = CommManUnderground_GetStoredListPos(UNDERGROUND_MENU_KEY_PAY_WITH_SPHERES); + + UndergroundMenu_OpenPayWithSpheresMenu(menu); + UndergroundMenu_PrintMenuDescription(menu, UndergroundNPCs_Text_SpheresOnHand); + + if (menu->vendorType == VENDOR_TYPE_TRAPS) { + UndergroundVendors_SetTrapNameForPrinter(2, menu->shopInventory[menu->shopSelection]); + } else if (menu->vendorType == VENDOR_TYPE_GOODS) { + UndergroundVendors_SetGoodNameForPrinter(2, menu->shopInventory[menu->shopSelection]); + } + + menu->state = SHOP_MENU_STATE_PAY_MENU; + break; + case SHOP_MENU_STATE_PAY_MENU: + if (!UndergroundTextPrinter_IsPrinterActive(CommManUnderground_GetMiscTextPrinter())) { + input = UndergroundItemListMenu_ProcessInput(menu->itemListMenu); + ListMenu_GetListAndCursorPos(menu->itemListMenu->listMenu, &listPos, &cursorPos); + CommManUnderground_StoreCursorAndListPos(UNDERGROUND_MENU_KEY_PAY_WITH_SPHERES, cursorPos, listPos); + + if (input != LIST_NOTHING_CHOSEN) { + UndergroundTextPrinter_EraseMessageBoxWindow(CommManUnderground_GetItemNameTextPrinter()); + } + + switch (input) { + case LIST_NOTHING_CHOSEN: + break; + case LIST_CANCEL: + UndergroundMenu_RemoveDescriptionWindow(menu); + menu->state = SHOP_MENU_STATE_INIT_BUY_MENU; + break; + default: + int result = UndergroundVendors_TryBuyItem(menu, menu->shopSelection, input); + UndergroundVendors_EraseCurrentMenu(menu, TRUE); + UndergroundMenu_RemoveDescriptionWindow(menu); + + if (result == RESULT_BAG_FULL) { + UndergroundVendors_PrintNPCMessage(UndergroundNPCs_Text_YouDontHaveRoom); + menu->state = SHOP_MENU_STATE_END_TRANSACTION; + } else if (result == RESULT_WRONG_SPHERE_TYPE) { + UndergroundVendors_PrintNPCMessage(UndergroundNPCs_Text_WrongKindOfSphere); + menu->state = SHOP_MENU_STATE_END_TRANSACTION; + } else if (result == RESULT_SPHERE_TOO_SMALL) { + UndergroundVendors_PrintNPCMessage(UndergroundNPCs_Text_SphereTooSmall); + menu->state = SHOP_MENU_STATE_END_TRANSACTION; + } else { + menu->shopSelection = result; + UndergroundVendors_PrintNPCMessage(UndergroundNPCs_Text_LetsDoThisTrade); + menu->state = SHOP_MENU_STATE_BUY_SUCCESS; + } + break; + } + } + break; + case SHOP_MENU_STATE_11_UNUSED: + UndergroundVendors_PrintNPCMessage(UndergroundNPCs_Text_YouDontHaveRoom); + menu->state = SHOP_MENU_STATE_END_TRANSACTION; + break; + case SHOP_MENU_STATE_BUY_SUCCESS: + if (!UndergroundTextPrinter_IsPrinterActive(CommManUnderground_GetMiscTextPrinter())) { + if (JOY_NEW(PAD_BUTTON_A)) { + if (menu->vendorType == VENDOR_TYPE_TRAPS) { + UndergroundVendors_SetTrapNameForPrinter(2, menu->shopSelection); + } else if (menu->vendorType == VENDOR_TYPE_GOODS) { + UndergroundVendors_SetGoodNameForPrinter(2, menu->shopSelection); + } + + UndergroundVendors_PrintNPCMessage(UndergroundNPCs_Text_ItemWasObtained); + Sound_PlayEffect(SEQ_SE_DP_PIRORIRO2); + + menu->state = SHOP_MENU_STATE_END_TRANSACTION; + } + } + break; + case SHOP_MENU_STATE_END_TRANSACTION: + if (!UndergroundTextPrinter_IsPrinterActive(CommManUnderground_GetMiscTextPrinter())) { + if (JOY_NEW(PAD_BUTTON_A)) { + UndergroundVendors_PrintNPCMessage(UndergroundNPCs_Text_DoYouNeedAnythingElse); + menu->state = SHOP_MENU_STATE_INIT_OPTIONS_MENU; + } + } + break; + case SHOP_MENU_STATE_INIT_SELL_MENU: + UndergroundVendors_DrawPriceWindow(menu); + + menu->listMenuCursorPos = CommManUnderground_GetStoredCursorPos(UNDERGROUND_MENU_KEY_SELL_GOODS + menu->vendorType); + menu->listMenuListPos = CommManUnderground_GetStoredListPos(UNDERGROUND_MENU_KEY_SELL_GOODS + menu->vendorType); + menu->cursorCallback = UndergroundVendors_PrintItemDescriptionAndSellPrice; + + if (menu->vendorType == VENDOR_TYPE_TRAPS) { + UndergroundMenu_OpenSellTrapsMenu(menu); + UndergroundMenu_PrintMenuDescription(menu, UndergroundNPCs_Text_TrapsOnHand); + } else if (menu->vendorType == VENDOR_TYPE_GOODS) { + UndergroundMenu_OpenSellGoodsMenu(menu); + UndergroundMenu_PrintMenuDescription(menu, UndergroundNPCs_Text_GoodsOnHand); + } else { + UndergroundMenu_OpenSellTreasuresMenu(menu); + UndergroundMenu_PrintMenuDescription(menu, UndergroundNPCs_Text_TreasuresOnHand); + } + + menu->state = SHOP_MENU_STATE_SELL_MENU; + break; + case SHOP_MENU_STATE_SELL_MENU: + input = UndergroundItemListMenu_ProcessInput(menu->itemListMenu); + ListMenu_GetListAndCursorPos(menu->itemListMenu->listMenu, &listPos, &cursorPos); + CommManUnderground_StoreCursorAndListPos(UNDERGROUND_MENU_KEY_SELL_GOODS + menu->vendorType, cursorPos, listPos); + + switch (input) { + case LIST_CANCEL: + UndergroundTextPrinter_EraseMessageBoxWindow(CommManUnderground_GetItemNameTextPrinter()); + UndergroundVendors_EraseCurrentMenu(menu, TRUE); + UndergroundMenu_RemoveDescriptionWindow(menu); + menu->state = SHOP_MENU_STATE_INIT_OPTIONS_MENU; + break; + case LIST_NOTHING_CHOSEN: + break; + default: + if (menu->shopPriceTypes[0] != SPHERE_NONE) { + UndergroundTextPrinter_EraseMessageBoxWindow(CommManUnderground_GetItemNameTextPrinter()); + menu->shopSelection = input; + UndergroundVendors_EraseCurrentMenu(menu, TRUE); + UndergroundMenu_RemoveDescriptionWindow(menu); + UndergroundVendors_PrintConfirmSellPrompt(input, menu); + menu->state = SHOP_MENU_STATE_INIT_CONFIRM_SELL_MENU; + } + break; + } + break; + case SHOP_MENU_STATE_INIT_CONFIRM_SELL_MENU: + if (!UndergroundTextPrinter_IsPrinterActive(CommManUnderground_GetMiscTextPrinter())) { + menu->yesNoMenu = Menu_MakeYesNoChoice(menu->fieldSystem->bgConfig, &sWindowTemplate, BASE_TILE_STANDARD_WINDOW_FRAME, 11, HEAP_ID_FIELD1); + menu->state = SHOP_MENU_STATE_CONFIRM_SELL; + } + break; + case SHOP_MENU_STATE_CONFIRM_SELL: + input = Menu_ProcessInputAndHandleExit(menu->yesNoMenu, HEAP_ID_FIELD1); + + if (input == LIST_NOTHING_CHOSEN) { + return; + } else if (input == 0) { + int result = UndergroundVendors_TrySellItem(menu); + + if (result == RESULT_BAG_FULL) { + UndergroundVendors_PrintNPCMessage(UndergroundNPCs_Text_YouDontHaveRoom); + menu->state = SHOP_MENU_STATE_END_TRANSACTION; + } else { + UndergroundVendors_PrintNPCMessage(UndergroundNPCs_Text_AllRightLetsTrade); + menu->state = SHOP_MENU_STATE_SELL_SUCCESS; + } + } else { + menu->state = SHOP_MENU_STATE_EXIT_MESSAGE; + } + + menu->yesNoMenu = NULL; + break; + case SHOP_MENU_STATE_SELL_SUCCESS: + if (!UndergroundTextPrinter_IsPrinterActive(CommManUnderground_GetMiscTextPrinter())) { + if (JOY_NEW(PAD_BUTTON_A)) { + UndergroundTextPrinter_SetTwoDigitNumber(CommManUnderground_GetMiscTextPrinter(), menu->shopPriceSizes[0]); + UndergroundVendors_SetTreasureNameForPrinter(2, menu->shopPriceTypes[0]); + UndergroundVendors_PrintNPCMessage(UndergroundNPCs_Text_YouObtainedSphere); + + Sound_PlayEffect(SEQ_SE_DP_PIRORIRO2); + + menu->state = SHOP_MENU_STATE_END_TRANSACTION; + } + } + break; + case SHOP_MENU_STATE_EXIT_MESSAGE: + UndergroundVendors_PrintNPCMessage(UndergroundNPCs_Text_BeSeeingYouThen); + menu->state = SHOP_MENU_STATE_EXIT_AFTER_TEXT; + break; + case SHOP_MENU_STATE_EXIT_AFTER_TEXT: + if (!UndergroundTextPrinter_IsPrinterActive(CommManUnderground_GetMiscTextPrinter())) { + if (JOY_NEW(PAD_BUTTON_A | PAD_BUTTON_B)) { + UndergroundVendors_EraseMessageBoxWindow(); + UndergroundVendors_FreeMenu(menu); + CommManUnderground_ClearCurrentSysTaskInfo(); + SysTask_Done(sysTask); + CommPlayerMan_ResumeFieldSystem(); + } + } + break; + default: + break; + } +} + +void UndergroundVendors_StartShopMenuTask(FieldSystem *fieldSystem) +{ + int x = CommPlayer_GetXInFrontOfPlayer(CommSys_CurNetId()); + int z = CommPlayer_GetZInFrontOfPlayer(CommSys_CurNetId()); + int dir = CommPlayer_GetOppositeDir(CommPlayer_Dir(CommSys_CurNetId())); + const int unused = 6; + int vendorIndex; + int vendorType = UndergroundVendors_FindVendorAtCoordinates(x, z, &vendorIndex); + + CommManUnderground_SetStoredPosKey(UNDERGROUND_STORED_POS_KEY_GOODS_VENDOR + vendorType); + + UndergroundMenu *menu = Heap_Alloc(HEAP_ID_FIELD1, sizeof(UndergroundMenu)); + MI_CpuClear8(menu, sizeof(UndergroundMenu)); + + menu->fieldSystem = fieldSystem; + menu->vendorType = vendorType; + menu->vendorIndex = vendorIndex; + menu->string = String_Init(50 * 2, HEAP_ID_FIELD1); + menu->fmtString = String_Init(50 * 2, HEAP_ID_FIELD1); + menu->template = StringTemplate_Default(HEAP_ID_FIELD1); + menu->state = SHOP_MENU_STATE_INTRO_MESSAGE; + + Sound_PlayEffect(SEQ_SE_CONFIRM); + menu->sysTask = SysTask_Start(UndergroundVendors_ShopMenuTask, menu, 10000); + CommManUnderground_SetCurrentSysTask(menu, menu->sysTask, UndergroundMenu_ResetBrightnessAndExit); + + int objEventCount = MapHeaderData_GetNumObjectEvents(menu->fieldSystem); + const ObjectEvent *objEventList = MapHeaderData_GetObjectEvents(menu->fieldSystem); + + for (int i = 0; i < objEventCount; i++) { + if (objEventList[i].x == x && objEventList[i].z == z) { + MapObject *mapObj = MapObjMan_LocalMapObjByIndex(menu->fieldSystem->mapObjMan, i); + MapObject_TryFace(mapObj, dir); + } + } +} diff --git a/src/scrcmd.c b/src/scrcmd.c index b32544abb0..a9bad5726d 100644 --- a/src/scrcmd.c +++ b/src/scrcmd.c @@ -90,7 +90,7 @@ #include "overlay007/shop_menu.h" #include "overlay008/ov8_02249960.h" #include "overlay009/ov9_02249960.h" -#include "overlay023/ov23_022521F0.h" +#include "overlay023/underground_vendors.h" #include "overlay090/struct_ov90_021D0D80.h" #include "overlay098/struct_ov98_02247168.h" #include "overlay104/struct_ov104_02230BE4.h" @@ -5663,7 +5663,7 @@ static BOOL ScrCmd_19E(ScriptContext *ctx) u16 v3 = ScriptContext_ReadHalfWord(ctx); ctx->data[0] = v3; - *v0 = ov23_02252C98(v2, ctx->fieldSystem, MapObject_GetLocalID(*v1)); + *v0 = UndergroundVendors_ReturnNull(v2, ctx->fieldSystem, MapObject_GetLocalID(*v1)); ScriptContext_Pause(ctx, sub_020441C8); return TRUE; @@ -5674,9 +5674,9 @@ static BOOL sub_020441C8(ScriptContext *ctx) void **v0 = FieldSystem_GetScriptMemberPtr(ctx->fieldSystem, SCRIPT_MANAGER_DATA_PTR); u16 *v1 = FieldSystem_GetVarPointer(ctx->fieldSystem, ctx->data[0]); - *v1 = ov23_02252C70(*v0); + *v1 = UndergroundVendors_ReturnFFFE(*v0); - if ((*v1) == 0xfffe) { + if (*v1 == 0xFFFE) { return FALSE; } @@ -5687,7 +5687,7 @@ static BOOL ScrCmd_19F(ScriptContext *ctx) { u8 *v0 = FieldSystem_GetScriptMemberPtr(ctx->fieldSystem, SCRIPT_MANAGER_MESSAGE_ID); - *v0 = ov23_02252C9C(ScriptContext_GetVar(ctx)); + *v0 = UndergroundVendors_PrintNPCMessage(ScriptContext_GetVar(ctx)); ScriptContext_Pause(ctx, sub_02044240); return TRUE; @@ -5701,7 +5701,7 @@ static BOOL sub_02044240(ScriptContext *ctx) static BOOL ScrCmd_1A0(ScriptContext *ctx) { - ov23_02252CD4(); + UndergroundVendors_EraseMessageBoxWindow(); return FALSE; } @@ -5710,7 +5710,7 @@ static BOOL ScrCmd_Unused_1A1(ScriptContext *ctx) u8 v0 = ScriptContext_ReadByte(ctx); u16 v1 = ScriptContext_GetVar(ctx); - ov23_02252CE0(v0, v1); + UndergroundVendors_SetTreasureNameForPrinter(v0, v1); return FALSE; } @@ -5719,7 +5719,7 @@ static BOOL ScrCmd_Unused_1A2(ScriptContext *ctx) u8 v0 = ScriptContext_ReadByte(ctx); u16 v1 = ScriptContext_GetVar(ctx); - ov23_02252CF4(v0, v1); + UndergroundVendors_SetTrapNameForPrinter(v0, v1); return FALSE; } diff --git a/src/unk_0202854C.c b/src/unk_0202854C.c index 82678d184a..a8eada8091 100644 --- a/src/unk_0202854C.c +++ b/src/unk_0202854C.c @@ -4,10 +4,10 @@ #include #include "constants/charcode.h" -#include "constants/goods.h" #include "constants/items.h" #include "constants/map_object.h" -#include "constants/traps.h" +#include "generated/goods.h" +#include "generated/traps.h" #include "struct_defs/underground.h" #include "struct_defs/underground_record.h" diff --git a/src/unk_02099500.c b/src/unk_02099500.c index ac31dd77ad..16a3a04aa5 100644 --- a/src/unk_02099500.c +++ b/src/unk_02099500.c @@ -48,9 +48,9 @@ static int sub_02099508(void) static const CommCmdTable Unk_020F68A4[] = { { CommPlayer_RecvLocation, CommPacketSizeOf_RecvLocation, NULL }, { CommPlayer_RecvLocationAndInit, CommPacketSizeOf_RecvLocationAndInit, NULL }, - { ov23_022431C4, CommPacketSizeOf_NetId, NULL }, - { ov23_0224ACE8, CommPacketSizeOf_Nothing, NULL }, // 25 - { ov23_0224ACF8, CommPacketSizeOf_NetId, NULL }, + { CommManUnderground_ProcessVendorTalkRequest, CommPacketSizeOf_NetId, NULL }, + { UndergroundPlayer_ProcessVendorTalk, CommPacketSizeOf_Nothing, NULL }, // 25 + { UndergroundPlayer_ProcessVendorTalkServer, CommPacketSizeOf_NetId, NULL }, { UndergroundPlayer_ProcessOpenMenuRequest, CommPacketSizeOf_Nothing, NULL }, { ov23_022428D8, ov23_022428D4, NULL }, { UndergroundPlayer_ProcessOpenMenuEvent, CommPacketSizeOf_Variable, NULL },