document underground vendors (#889)

This commit is contained in:
scbroede
2026-01-20 14:51:02 -05:00
committed by GitHub
parent 4e03cfcb49
commit ef9ef68e00
43 changed files with 1535 additions and 1516 deletions

140
generated/goods.txt Normal file
View File

@@ -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

View File

@@ -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'},

35
generated/traps.txt Normal file
View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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"

View File

@@ -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

View File

@@ -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,

View File

@@ -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);

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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);

View File

@@ -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

View File

@@ -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
}

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -654,7 +654,7 @@
]
},
{
"id": "pl_msg_00000634_00112",
"id": "UndergroundCommon_Text_PlayerTalkedWithSomeone",
"en_US": [
"{STRVAR_1 3, 0, 0} talked with\n",
"someone."

View File

@@ -2,165 +2,165 @@
"key": 10232,
"messages": [
{
"id": "pl_msg_00000636_00000",
"id": "UndergroundNPCs_Text_IllTradeYouSomething",
"en_US": [
"Youve got a Sphere or two?\n",
"If you do, Ill 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",
"Lets do this trade!"
]
},
{
"id": "pl_msg_00000636_00003",
"id": "UndergroundNPCs_Text_YouDontHaveRoom",
"en_US": [
"Oh, now wait a second!\n",
"You dont have any room for this!"
]
},
{
"id": "pl_msg_00000636_00004",
"id": "UndergroundNPCs_Text_WrongKindOfSphere",
"en_US": "Thats not the right kind of Sphere!"
},
{
"id": "pl_msg_00000636_00005",
"id": "UndergroundNPCs_Text_SphereTooSmall",
"en_US": [
"Hmm...\n",
"No, this Spheres 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": "Ill be seeing you, then!"
},
{
"id": "pl_msg_00000636_00010",
"id": "UndergroundNPCs_Text_ConfirmTradePrompt",
"en_US": [
"Youll 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",
"Lets trade!"
]
},
{
"id": "pl_msg_00000636_00012",
"id": "UndergroundNPCs_Text_YouDontHaveRoomForSphere_Unused",
"en_US": [
"Oh, now wait a second! You dont\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? Ill 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"

View File

@@ -3,19 +3,13 @@
#include <nitro.h>
#include <string.h>
#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;
}

View File

@@ -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',

View File

@@ -3,7 +3,7 @@
#include <nitro.h>
#include <string.h>
#include "constants/goods.h"
#include "generated/goods.h"
#include "struct_defs/underground.h"

View File

@@ -3,8 +3,8 @@
#include <nitro.h>
#include <string.h>
#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"

View File

@@ -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();
}

View File

@@ -1,955 +0,0 @@
#include "overlay023/ov23_022521F0.h"
#include <nitro.h>
#include <string.h>
#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, &param0->primaryWindow, 3, 19, 3, 12, v1 * 2, 13, ((((1024 - (18 + 12) - 9 - (32 * 8)) - (18 + 12 + 24)) - (27 * 4)) - 12 * 6));
Window_DrawStandardFrame(&param0->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 = &param0->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(&param0->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, &param0->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(&param0->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 = &param0->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(&param0->primaryWindow);
}
static void ov23_02252B90(UndergroundMenu *param0, BOOL param1)
{
if (Window_IsInUse(&param0->secondaryWindow)) {
Window_EraseStandardFrame(&param0->secondaryWindow, 1);
Window_Remove(&param0->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(&param0->secondaryWindow)) {
Window_Add(param0->fieldSystem->bgConfig, &param0->secondaryWindow, 3, 1, 12, 12, 4, 13, 1);
Window_DrawStandardFrame(&param0->secondaryWindow, 1, 1024 - (18 + 12) - 9, 11);
}
Window_FillTilemap(&param0->secondaryWindow, 15);
Window_CopyToVRAM(&param0->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);
}
}
}
}

View File

@@ -1,86 +0,0 @@
#include "overlay023/ov23_0225426C.h"
#include <nitro.h>
#include <string.h>
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];
}

View File

@@ -1,60 +0,0 @@
#include "overlay023/ov23_0225429C.h"
#include <nitro.h>
#include <string.h>
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];
}

View File

@@ -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"

View File

@@ -0,0 +1,62 @@
#include "overlay023/trap_prices.h"
#include <nitro.h>
#include <string.h>
#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;
}

View File

@@ -0,0 +1,86 @@
#include "overlay023/treasure_prices.h"
#include <nitro.h>
#include <string.h>
#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;
}

View File

@@ -4,7 +4,7 @@
#include <string.h>
#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);

View File

@@ -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);
}
}

View File

@@ -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)

View File

@@ -4,8 +4,8 @@
#include <string.h>
#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"

View File

@@ -0,0 +1,969 @@
#include "overlay023/underground_vendors.h"
#include <nitro.h>
#include <string.h>
#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);
}
}
}

View File

@@ -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;
}

View File

@@ -4,10 +4,10 @@
#include <string.h>
#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"

View File

@@ -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 },