one for the books (#765)

* func_802A1518_78BB18

* btl_state_update_select_target

* wip

* btl_state_draw_select_target and WIP

* cleanup

* render_shaded_sprite and wip

* WIP/cleanup

* wip

* reset_player_status

* btl_state_update_player_move and cleanup

* func_802A2C84

* func_80242FE0 wip

* btl_state_update_normal_start and cleanup

* WIP

* btl_state_update_end_turn

* btl_state_update_enemy_striking_first

* cleanup

* cleanup & wip

* item_entity_update & cleanup

* update_item_entity_temp

* appendGfx_item_entity

* E21870

* mdl_create_mode

* cleanup

* func_802A9310_42D220

* area_flo2 battle funcs dun

* b_area_isk_part_1_ChompChainUpdate

* wip and rip

* clean

* partner_move_to_goal

* partner_get_out

* wip

* cleanup

* func_802BD1AC_31CD1C

* func_802BD754_31D2C4

* Cleanin

* fix func def

* UnkShadowFunc001

* a bunch of kpa funcs

* comment
This commit is contained in:
Ethan Roseman 2022-09-08 21:21:07 +09:00 committed by GitHub
parent c108f11cab
commit 408c49cb75
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
135 changed files with 6291 additions and 11426 deletions

View File

@ -634,8 +634,8 @@ typedef struct UiStatus {
/* 0x38 */ s16 showTimer;
/* 0x3A */ s8 hidden;
/* 0x3B */ s8 unk_3B[2];
/* 0x3D */ u8 displayHP;
/* 0x3E */ u8 displayFP;
/* 0x3D */ s8 displayHP;
/* 0x3E */ s8 displayFP;
/* 0x3F */ char unk_3F;
/* 0x40 */ s16 displayCoins;
/* 0x42 */ s16 displayStarpoints;
@ -644,20 +644,22 @@ typedef struct UiStatus {
/* 0x47 */ s8 disabled; /* set != 0 for menu to be disabled completely */
/* 0x48 */ s16 displaySP;
/* 0x4A */ s8 hpBlinking; /* bool */
/* 0x4B */ u8 hpBlinkCounter;
/* 0x4C */ u8 hpBlinkTimer; /* until stop */
/* 0x4B */ s8 hpBlinkCounter;
/* 0x4C */ s8 hpBlinkTimer; /* until stop */
/* 0x4D */ s8 fpBlinking; /* bool */
/* 0x4E */ u8 fpBlinkCounter;
/* 0x4F */ u8 fpBlinkTimer; /* until stop */
/* 0x4E */ s8 fpBlinkCounter;
/* 0x4F */ s8 fpBlinkTimer; /* until stop */
/* 0x50 */ s8 spBlinking;
/* 0x51 */ u8 spBlinkCounter;
/* 0x51 */ s8 spBlinkCounter;
/* 0x52 */ s8 starpointsBlinking; /* bool */
/* 0x53 */ u8 starpointsBlinkCounter;
/* 0x53 */ s8 starpointsBlinkCounter;
/* 0x54 */ s8 coinsBlinking; /* bool */
/* 0x55 */ u8 coinsBlinkCounter;
/* 0x56 */ u8 coinsBlinkTimer; /* until stop */
/* 0x57 */ char unk_57[3];
/* 0x5A */ u8 spBarsToBlink; /* how many sp bars to blink */
/* 0x55 */ s8 coinsBlinkCounter;
/* 0x56 */ s8 coinsBlinkTimer; /* until stop */
/* 0x57 */ u8 unk_57;
/* 0x58 */ u8 unk_58;
/* 0x59 */ u8 unk_59;
/* 0x5A */ s8 spBarsToBlink; /* how many sp bars to blink */
/* 0x5B */ char unk_5B;
/* 0x5C */ s32 iconIndex10;
/* 0x60 */ s32 iconIndex11;
@ -799,11 +801,6 @@ typedef struct Camera {
/* 0x556 */ s16 unk_556;
} Camera; // size = 0x558
typedef struct FGModelData {
/* 0x00 */ char unk_00[0x18];
/* 0x18 */ s32* idList;
} FGModelData; // size = unknown
typedef struct BattleStatus {
/* 0x000 */ s32 flags1;
/* 0x004 */ s32 flags2;
@ -813,7 +810,9 @@ typedef struct BattleStatus {
/* */ void* varTablePtr[16];
/* */ };
/* 0x048 */ s8 currentSubmenu;
/* 0x049 */ char unk_49[3];
/* 0x049 */ s8 unk_49;
/* 0x04A */ s8 unk_4A;
/* 0x04B */ s8 unk_4B;
/* 0x04C */ s8 unk_4C[16];
/* 0x05C */ s8 unk_5C[16];
/* 0x06C */ s16 unk_6C;
@ -928,9 +927,9 @@ typedef struct BattleStatus {
/* 0x430 */ s8 holdInputBufferPos;
/* 0x431 */ s8 inputBufferPos;
/* 0x432 */ s8 unk_432;
/* 0x433 */ char unk_433;
/* 0x433 */ u8 unk_433;
/* 0x434 */ s32* unk_434;
/* 0x438 */ FGModelData* foregroundModelData;
/* 0x438 */ struct Stage* currentStage;
/* 0x43C */ struct EffectInstance* buffEffect;
/* 0x440 */ u8 tattleFlags[28];
/* 0x45C */ char unk_45C[4];
@ -1107,8 +1106,8 @@ typedef struct ItemEntity {
/* 0x22 */ char unk_22[2];
/* 0x24 */ u32* readPos;
/* 0x28 */ u32* savedReadPos;
/* 0x2C */ s8 lookupRasterIndex;
/* 0x2D */ s8 lookupPaletteIndex;
/* 0x2C */ u8 lookupRasterIndex;
/* 0x2D */ u8 lookupPaletteIndex;
/* 0x2E */ u8 nextUpdate;
/* 0x2F */ u8 alpha;
/* 0x30 */ f32 scale;
@ -2318,11 +2317,11 @@ typedef struct SpriteShadingLightSource {
} SpriteShadingLightSource; // size = 0x18
typedef struct SpriteShadingProfile {
/* 0x00 */ s16 flags;
/* 0x00 */ u16 flags;
/* 0x02 */ char unk_02[0x2];
/* 0x04 */ SpriteShadingLightSource sources[7];
/* 0xAC */ Color_RGB8 ambientColor;
/* 0xAF */ s8 ambientPower; // ?
/* 0xAF */ u8 ambientPower; // ?
} SpriteShadingProfile; // size = 0xB0
typedef struct FoldImageRecPart {
@ -2457,4 +2456,18 @@ typedef struct CreditsUnkBeta {
/* 0x02 */ s16 size;
} CreditsUnkBeta; // size = 0x4
typedef struct TempE20110 {
/* 0x00 */ Vec3f pos;
/* 0x0C */ f32 scale;
/* 0x10 */ f32 unk_10;
/* 0x14 */ char unk_14[0x4];
/* 0x18 */ s32 unk_18;
/* 0x1C */ s32 unk_1C;
/* 0x20 */ s8 unk_20;
/* 0x21 */ s8 unk_21;
/* 0x22 */ s8 unk_22;
/* 0x23 */ s8 unk_23;
/* 0x24 */ s32 unk_24;
} TempE20110; // size = 0x28
#endif

View File

@ -494,6 +494,8 @@ enum Easings {
enum SoundIDs {
SOUND_0 = 0x00000000,
SOUND_1 = 0x00000001,
SOUND_2 = 0x00000002,
SOUND_3 = 0x00000003,
SOUND_4 = 0x00000004,
SOUND_MENU_BADGE_EQUIP = 0x00000005,
@ -558,6 +560,7 @@ enum SoundIDs {
SOUND_73 = 0x00000073,
SOUND_74 = 0x00000074,
SOUND_77 = 0x00000077,
SOUND_7D = 0x0000007D,
SOUND_82 = 0x00000082,
SOUND_83 = 0x00000083,
SOUND_84 = 0x00000084,
@ -603,7 +606,9 @@ enum SoundIDs {
SOUND_CC = 0x000000CC,
SOUND_CD = 0x000000CD,
SOUND_CE = 0x000000CE,
SOUND_D1 = 0x000000D1,
SOUND_D2 = 0x000000D2,
SOUND_D3 = 0x000000D3,
SOUND_D4 = 0x000000D4,
SOUND_D5 = 0x000000D5,
SOUND_D6 = 0x000000D6,
@ -622,6 +627,7 @@ enum SoundIDs {
SOUND_HIT_FIRE = 0x000000EA,
SOUND_HIT_ICE = 0x000000EB,
SOUND_F1 = 0x000000F1,
SOUND_F2 = 0x000000F2,
SOUND_F3 = 0x000000F3,
SOUND_F4 = 0x000000F4,
SOUND_F5 = 0x000000F5,
@ -735,6 +741,7 @@ enum SoundIDs {
SOUND_1D0 = 0x000001D0,
SOUND_1D1 = 0x000001D1,
SOUND_1D2 = 0x000001D2,
SOUND_1D3 = 0x000001D3,
SOUND_1D4 = 0x000001D4,
SOUND_1D5 = 0x000001D5,
SOUND_CREAKY_ROCKING_CHAIR = 0x000001D6,
@ -1064,6 +1071,7 @@ enum SoundIDs {
SOUND_205F = 0x0000205F,
SOUND_2060 = 0x00002060,
SOUND_2061 = 0x00002061,
SOUND_2063 = 0x00002063,
SOUND_2064 = 0x00002064,
SOUND_2065 = 0x00002065,
SOUND_2066 = 0x00002066,
@ -3719,6 +3727,7 @@ enum BattleStatusFlags2 {
BS_FLAGS2_4 = 0x00000004,
BS_FLAGS2_8 = 0x00000008,
BS_FLAGS2_10 = 0x00000010,
BS_FLAGS2_20 = 0x00000020,
BS_FLAGS2_40 = 0x00000040,
BS_FLAGS2_80 = 0x00000080,
BS_FLAGS2_100 = 0x00000100,

View File

@ -148,7 +148,6 @@ s32 general_heap_free(void* data);
s32 integer_log(s32 number, u32 base);
void set_battle_formation(s32);
void set_battle_stage(s32);
void load_battle(s32);
@ -221,6 +220,7 @@ void get_dpad_input_radial(f32* angle, f32* magnitude);
void transform_point(Matrix4f mtx, f32 inX, f32 inY, f32 inZ, f32 inS, f32* outX, f32* outY, f32* outZ, f32* outS);
void try_player_footstep_sounds(s32 arg0);
void phys_update_interact_collider(void);
void phys_reset_spin_history(void);
s32 phys_adjust_cam_on_landing(void);
s32 phys_should_player_be_sliding(void);
void phys_init_integrator_for_current_state(void);
@ -299,6 +299,10 @@ void init_model_animators(void);
void play_model_animation(s32, s16*);
s32 heap_free(void* ptr);
void load_battle_hit_asset(const char* hitName);
void load_data_for_models(struct ModelNode* model, s32 romOffset, s32 size);
void load_player_actor(void);
void btl_state_update_normal_start(void);
void btl_state_draw_normal_start(void);
void btl_state_update_begin_turn(void);
@ -520,6 +524,7 @@ s32 bgm_set_song(s32 playerIndex, s32 songID, s32 variation, s32 fadeOutTime, s1
void bgm_set_battle_song(s32, s32);
void bgm_push_battle_song(void);
s32 bgm_adjust_proximity(s32 playerIndex, s32 arg1, s16 arg2);
void func_801491E4(s32, s32, s32, s32, s32, s32 alpha);
s32 func_8014A964(s32 playerIndex, s32 songID, s32 variation, s32 fadeInTime, s16 arg4, s16 arg5);
#include "audio/public.h"
@ -721,6 +726,8 @@ void state_step_demo(void);
void state_drawUI_demo(void);
void game_mode_set_fpDrawAuxUI(s32 i, void (*fn)(void));
void func_80260A60(void);
void func_802B2000(void);
void func_802B203C(void);
void func_802B2078(void);
@ -796,7 +803,7 @@ void mdl_get_copied_vertices(s32 copyIndex, Vtx** firstVertex, Vtx** copiedVerti
void mdl_draw_hidden_panel_surface(Gfx** arg0, u16 treeIndex);
s32 func_8011CFBC(void);
void set_screen_overlay_center_worldpos(s32 idx, s32 posIdx, s32 x, s32 y, s32 z);
s32 mdl_get_next_texture_address(s32);
void* mdl_get_next_texture_address(s32);
void draw_msg(s32 msgID, s32 posX, s32 posY, s32 opacity, s32 palette, u8 style);
void get_background_color_blend(u8* r, u8* g, u8* b, u8* a);
@ -892,16 +899,22 @@ s32 add_badge(s32 itemID);
void hide_coin_counter_immediately(void);
void hide_popup_menu(void);
void destroy_popup_menu(void);
void reset_player_status(void);;
void reset_player_status(void);
s32 has_valid_conversation_npc(void);
s32 func_800E06D8(void);
void func_800E4F10(void);
void func_800E5520(void);
void func_800E6B68(void);
void func_800E9810(void);
s32 func_800E9860(void);
void func_800E98C4(void);
void func_800E98EC(void);
void func_800E9900(void);
void func_800F0D5C(void);
void func_800F0C9C(void);
void func_800F0CB0(s32, f32, f32, f32);
void func_800F0D5C(void);
void func_800F0D80(void);
void func_800F102C(void);
s32 get_item_count(void);
s32 get_stored_empty_count(void);
s32 get_stored_count(void);
@ -970,6 +983,9 @@ void status_menu_start_blinking_sp(void);
void status_menu_stop_blinking_fp(void);
void status_menu_stop_blinking_hp(void);
void status_menu_stop_blinking_sp(void);
void status_menu_start_blinking_sp_bars(s8 numBarsToBlink);
void status_menu_draw_number(s32 iconID, s32 x, s32 y, s32 value, s32 numDigits);
void status_menu_draw_stat(s32 id, s32 x, s32 y, s32, s32);
void set_background_size(s16, s16, s16, s16);
void read_background_size(BackgroundHeader*);
void set_max_SP(s8);

View File

@ -9,6 +9,26 @@ typedef union ModelNodePropertyData {
s32* p;
} ModelNodePropertyData;
// In memory this is a list of ModelNodeProperty, but due to the way it uses
// the fields (storing into the "type" field) we decided to make a struct for this
typedef struct ModelBoundingBox {
/* 0x00 */ s32 key; // MODEL_PROP_KEY_BOUNDING_BOX
/* 0x04 */ s32 halfSizeX;
/* 0x08 */ f32 minX;
/* 0x0C */ char unk_0C[0x04];
/* 0x10 */ s32 halfSizeY;
/* 0x14 */ f32 minY;
/* 0x18 */ char unk_18[0x04];
/* 0x1C */ s32 halfSizeZ;
/* 0x20 */ f32 minZ;
/* 0x24 */ char unk_24[0x8];
/* 0x2C */ f32 maxX;
/* 0x30 */ char unk_30[0x8];
/* 0x38 */ f32 maxY;
/* 0x3C */ char unk_3C[0x8];
/* 0x44 */ f32 maxZ;
} ModelBoundingBox; // size = 0x48?
typedef struct ModelNodeProperty {
/* 0x0 */ s32 key;
/* 0x4 */ s32 dataType;
@ -26,12 +46,12 @@ typedef struct ModelNode {
typedef struct Model {
/* 0x00 */ u16 flags;
/* 0x02 */ u16 modelID;
/* 0x04 */ Matrix4s* currentMatrix;
/* 0x04 */ Mtx* currentMatrix;
/* 0x08 */ ModelNode* modelNode;
/* 0x0C */ ModelGroupData* groupData;
/* 0x10 */ s32* currentSpecialMatrix;
/* 0x14 */ char unk_14[4];
/* 0x18 */ Matrix4s specialMatrix;
/* 0x18 */ Mtx specialMatrix;
/* 0x58 */ Matrix4f transformMatrix;
/* 0x98 */ Vec3f center;
/* 0xA4 */ u8 texPannerID;
@ -92,7 +112,7 @@ typedef struct ModelBlueprint {
/* 0x2 */ char unk_02[0x2];
/* 0x4 */ ModelNode* mdlNode;
/* 0x8 */ ModelGroupData* groupData;
/* 0xC */ Matrix4s* mtx;
/* 0xC */ Mtx* mtx;
} ModelBlueprint; // size = 0x10
typedef void(*ModelCustomGfxBuilderFunc)(s32 index);
@ -100,26 +120,6 @@ typedef void(*ModelCustomGfxBuilderFunc)(s32 index);
typedef Gfx* ModelCustomGfxList[32];
typedef ModelCustomGfxBuilderFunc ModelCustomGfxBuilderList[32];
// In memory this is a list of ModelNodeProperty, but due to the way it uses
// the fields (storing into the "type" field) we decided to make a struct for this
typedef struct ModelBoundingBox {
/* 0x00 */ s32 key; // MODEL_PROP_KEY_BOUNDING_BOX
/* 0x04 */ s32 halfSizeX;
/* 0x08 */ f32 minX;
/* 0x0C */ char unk_0C[0x04];
/* 0x10 */ s32 halfSizeY;
/* 0x14 */ f32 minY;
/* 0x18 */ char unk_18[0x04];
/* 0x1C */ s32 halfSizeZ;
/* 0x20 */ f32 minZ;
/* 0x24 */ char unk_24[0x8];
/* 0x2C */ f32 maxX;
/* 0x30 */ char unk_30[0x8];
/* 0x38 */ f32 maxY;
/* 0x3C */ char unk_3C[0x8];
/* 0x44 */ f32 maxZ;
} ModelBoundingBox; // size = 0x48?
typedef enum ModelPropertyKeys {
MODEL_PROP_KEY_RENDER_MODE = 0x5C,
MODEL_PROP_KEY_CAMERA_DATA = 0x5D,

View File

@ -348,7 +348,7 @@ typedef struct Encounter {
typedef struct EncounterStatus {
/* 0x000 */ s32 flags;
/* 0x004 */ s8 eFirstStrike; /* 0 = none, 1 = player, 2 = enemy */
/* 0x004 */ s8 firstStrikeType; /* 0 = none, 1 = player, 2 = enemy */
/* 0x005 */ s8 hitType; /* 1 = none/enemy, 2 = jump */
/* 0x006 */ s8 hitTier; /* 0 = normal, 1 = super, 2 = ultra */
/* 0x007 */ char unk_07;
@ -360,7 +360,7 @@ typedef struct EncounterStatus {
/* 0x00D */ char unk_0D;
/* 0x00E */ s16 coinsEarned; /* valid after battle */
/* 0x010 */ char unk_10;
/* 0x011 */ u8 allowFleeing;
/* 0x011 */ s8 allowFleeing;
/* 0x012 */ s8 unk_12;
/* 0x013 */ u8 dropWhackaBump;
/* 0x014 */ s32 songID;

View File

@ -29,7 +29,7 @@ extern u8 D_800DC4EB; // in the middle of the previous var
extern s32 D_800DC4E0;
extern s32 D_800DC4EC;
extern s32 D_800DC4F0;
extern s32 D_800DC4F4;
extern struct Battle* D_800DC4F4;
extern s32 D_800DC4F8;
extern s32 gBattleDmaDest;
@ -96,7 +96,7 @@ extern MessagePrintState* SaveBlockResultPrinter;
extern Entity* SwitchToLink;
extern s32 CreateEntityVarArgBuffer[4];
extern f32 DefaultMoveSpeeds[4];
extern f32 D_800F7B74;
extern CollisionData gZoneCollisionData;
@ -164,7 +164,7 @@ extern s16 D_800A0922;
extern s32 wMapTexName;
extern char wMapHitName[];
extern char wMapShapeName[];
extern s32* D_80210000;
extern struct ModelNode* D_80210000;
extern u8 D_802D9D70; // player alpha1 copy?
extern u8 D_802D9D71; // player alpha2 copy?

View File

@ -46,7 +46,7 @@ void state_step_enter_world(void) {
}
gGameStatusPtr->prevArea = gGameStatusPtr->areaID;
set_time_freeze_mode(0);
set_time_freeze_mode(TIME_FREEZE_NORMAL);
if (gGameStatusPtr->demoState == 0) {
disable_player_input();
}
@ -135,7 +135,7 @@ void state_step_change_map(void) {
gGameStatusPtr->isBattle = FALSE;
gGameStatusPtr->disableScripts = FALSE;
load_map_by_IDs(gGameStatusPtr->areaID, gGameStatusPtr->mapID, 0);
set_time_freeze_mode(0);
set_time_freeze_mode(TIME_FREEZE_NORMAL);
nuContRmbForceStopEnd();
if (gGameStatusPtr->demoState == 0) {
disable_player_input();

File diff suppressed because it is too large Load Diff

View File

@ -904,8 +904,8 @@ void btl_update_starpoints_display(void) {
}
for (; i < ARRAY_COUNT(D_8029EFC0); i++) {
hud_element_set_flags(D_8029EFC0[i], 2);
hud_element_set_flags(D_8029EFE8[i], 2);
hud_element_set_flags(D_8029EFC0[i], HUD_ELEMENT_FLAGS_FILTER_TEX);
hud_element_set_flags(D_8029EFE8[i], HUD_ELEMENT_FLAGS_FILTER_TEX);
}
posX = D_8029DA40;
@ -929,7 +929,7 @@ void btl_update_starpoints_display(void) {
}
for (; i < ARRAY_COUNT(D_8029F010); i++) {
hud_element_set_flags(D_8029F010[i], 2);
hud_element_set_flags(D_8029F010[i], HUD_ELEMENT_FLAGS_FILTER_TEX);
}
}
}

View File

@ -425,7 +425,7 @@ INCLUDE_ASM(s32, "181810", load_tattle_flags);
ApiStatus func_80253FB0(Evt* script, s32 isInitialCall) {
gCurrentEncounter.battleOutcome = 3;
btl_set_state(0x20);
btl_set_state(BATTLE_STATE_END_BATTLE);
return ApiStatus_DONE2;
}

View File

@ -229,7 +229,7 @@ void btl_state_update_celebration(void) {
if (partner != NULL) {
partner->flags &= ~(ACTOR_FLAG_4000000 | ACTOR_FLAG_8000000);
}
battleStatus->battlePhase = 5;
battleStatus->battlePhase = PHASE_5;
script = start_script(&PlayerScriptDispatcher, EVT_PRIORITY_A, 0);
player->takeTurnScript = script;
player->takeTurnID = script->id;
@ -762,7 +762,7 @@ void btl_state_update_celebration(void) {
hud_element_free(D_8029FB48);
set_background_color_blend(0, 0, 0, 0);
btl_set_state(0x20);
btl_set_state(BATTLE_STATE_END_BATTLE);
gBattleState2 = BATTLE_STATE2_UNK_2;
break;
case BATTLE_STATE2_UNK_F:
@ -837,7 +837,7 @@ void btl_state_update_celebration(void) {
if (partner != NULL && does_script_exist(partner->takeTurnID)) {
kill_script_by_ID(partner->takeTurnID);
}
btl_set_state(0x20);
btl_set_state(BATTLE_STATE_END_BATTLE);
gBattleState2 = BATTLE_STATE2_UNK_2;
break;
}

View File

@ -232,7 +232,7 @@ s32 btl_check_player_defeated(void) {
}
D_800DC4E4 = gBattleState;
D_800DC4D8 = gBattleState2;
btl_set_state(0x1B);
btl_set_state(BATTLE_STATE_DEFEAT);
return TRUE;
}
@ -1279,7 +1279,7 @@ Actor* create_actor(Formation formation) {
}
actor = battleStatus->enemyActors[i] = heap_malloc(sizeof(*actor));
ASSERT(actor != NULL);
actor->unk_134 = battleStatus->unk_93++;
@ -2603,10 +2603,10 @@ void reset_all_actor_sounds(Actor* actor) {
}
void hide_foreground_models_unchecked(void) {
FGModelData* data = gBattleStatus.foregroundModelData;
Stage* data = gBattleStatus.currentStage;
if (data != NULL && data->idList != NULL) {
s32* idList = data->idList;
if (data != NULL && data->foregroundModelList != NULL) {
s32* idList = data->foregroundModelList;
while (*idList != 0) {
s32 id = *idList++;
if (id >= 0) {
@ -2618,10 +2618,10 @@ void hide_foreground_models_unchecked(void) {
}
void show_foreground_models_unchecked(void) {
FGModelData* data = gBattleStatus.foregroundModelData;
Stage* data = gBattleStatus.currentStage;
if (data != NULL && data->idList != NULL) {
s32* idList = data->idList;
if (data != NULL && data->foregroundModelList != NULL) {
s32* idList = data->foregroundModelList;
while (*idList != 0) {
s32 id = *idList++;
if (id >= 0) {
@ -2633,10 +2633,10 @@ void show_foreground_models_unchecked(void) {
}
void hide_foreground_models(void) {
FGModelData* data = gBattleStatus.foregroundModelData;
Stage* data = gBattleStatus.currentStage;
if (data != NULL && data->idList != NULL) {
s32* idList = data->idList;
if (data != NULL && data->foregroundModelList != NULL) {
s32* idList = data->foregroundModelList;
while (*idList != 0) {
s32 id = *idList++;
if (id < 0) {
@ -2651,10 +2651,10 @@ void hide_foreground_models(void) {
}
void show_foreground_models(void) {
FGModelData* data = gBattleStatus.foregroundModelData;
Stage* data = gBattleStatus.currentStage;
if (data != NULL && data->idList != NULL) {
s32* idList = data->idList;
if (data != NULL && data->foregroundModelList != NULL) {
s32* idList = data->foregroundModelList;
while (*idList != 0) {
s32 id = *idList++;
if (id < 0) {

View File

@ -14,6 +14,8 @@ extern f32 D_800A0BA4;
extern EffectInstance* WorldMerleeOrbEffect;
extern EffectInstance* WorldMerleeWaveEffect;
void set_battle_formation(Battle*);
s32 get_defeated(s32 mapID, s32 encounterID) {
EncounterStatus* currentEncounter = &gCurrentEncounter;
s32 encounterIdx = encounterID / 32;
@ -389,7 +391,7 @@ void update_encounters_pre_battle(void) {
}
if (currentEncounter->songID < 0) {
switch (currentEncounter->eFirstStrike) {
switch (currentEncounter->firstStrikeType) {
case 0:
bgm_set_battle_song(SONG_NORMAL_BATTLE, FIRST_STRIKE_NONE);
break;
@ -443,7 +445,7 @@ void update_encounters_pre_battle(void) {
sfx_stop_sound(SOUND_2112);
sfx_stop_sound(SOUND_2113);
sfx_stop_sound(SOUND_2114);
set_battle_formation(0);
set_battle_formation(NULL);
set_battle_stage(encounter->stage);
load_battle(encounter->battle);
currentEncounter->unk_07 = 1;
@ -582,7 +584,7 @@ void show_first_strike_message(void) {
screenWidthHalf = SCREEN_WIDTH / 2;
switch (currentEncounter->eFirstStrike) {
switch (currentEncounter->firstStrikeType) {
case FIRST_STRIKE_PLAYER:
switch (currentEncounter->hitType) {
case 2:
@ -815,7 +817,7 @@ s32 check_conversation_trigger(void) {
enemy->encountered = ENCOUNTER_TRIGGER_CONVERSATION;
encounterStatus->currentEncounter = encounter;
encounterStatus->currentEnemy = enemy;
encounterStatus->eFirstStrike = FIRST_STRIKE_PLAYER;
encounterStatus->firstStrikeType = FIRST_STRIKE_PLAYER;
return TRUE;
}
}

View File

@ -28,6 +28,7 @@ void get_npc_pos(s32 npcID, f32* outX, f32* outY, f32* outZ, s32* arg4) {
}
void func_8005DECC(Npc* npc, s32 arg1, void* arg2, f32 arg3, f32 arg4, s32 arg5, s32 arg6);
INCLUDE_ASM(s32, "39210_len_aa0", func_8005DECC);
INCLUDE_ASM(s32, "39210_len_aa0", func_8005DFD4);

File diff suppressed because it is too large Load Diff

View File

@ -36,7 +36,6 @@ void update_player_input(void) {
}
}
#ifdef NON_MATCHING
void reset_player_status(void) {
PlayerStatus* playerStatus = &gPlayerStatus;
MapSettings* mapSettings;
@ -80,11 +79,11 @@ void reset_player_status(void) {
gGameStatusPtr->peachCookingIngredient = 0;
}
// This grossness is needed for matching
floatsTemp = &DefaultMoveSpeeds[0];
playerStatus->walkSpeed = *(floatsTemp++) * one;
playerStatus->runSpeed = *(floatsTemp++) * one;
playerStatus->maxJumpSpeed = *(floatsTemp++) * one;
// TODO required to match
floatsTemp = &(&D_800F7B74)[-1]; // index of 0 does not work
playerStatus->walkSpeed = *floatsTemp++ * one;
playerStatus->runSpeed = *floatsTemp++ * one;
playerStatus->maxJumpSpeed = *floatsTemp++ * one;
set_action_state(ACTION_STATE_IDLE);
@ -103,7 +102,7 @@ void reset_player_status(void) {
playerStatus->unk_90[CAM_TATTLE] = 0.0f;
playerStatus->unk_90[CAM_3] = 0.0f;
mapSettings = gAreas[gGameStatusPtr->areaID].maps[gGameStatusPtr->mapID].config;
mapSettings = gAreas[gGameStatusPtr->areaID].maps[gGameStatusPtr->mapID].settings;
if (mapSettings->entryList != NULL) {
if (gGameStatusPtr->entryID < mapSettings->entryCount) {
@ -118,12 +117,9 @@ void reset_player_status(void) {
gCameras[CAM_DEFAULT].targetPos.y = playerStatus->position.y;
gCameras[CAM_DEFAULT].targetPos.z = playerStatus->position.z;
phys_reset_spin_history(mapSettings);
phys_reset_spin_history();
mem_clear(&gPlayerSpinState, sizeof(gPlayerSpinState));
}
#else
INCLUDE_ASM(s32, "7B440", reset_player_status);
#endif
void get_packed_buttons(s32* arg0) {
PlayerStatus* playerStatus = &gPlayerStatus;

View File

@ -233,12 +233,12 @@ block_17:
switch (D_8010CCF8) {
case 0:
if (playerStatus->flags & PLAYER_STATUS_FLAGS_40) {
sfx_play_sound(0x21D);
sfx_play_sound(SOUND_MENU_ERROR);
if (D_8010C9C0) {
func_800E6860();
playerStatus->flags &= ~PLAYER_STATUS_FLAGS_20;
gOverrideFlags &= ~GLOBAL_OVERRIDES_40;
set_time_freeze_mode(0);
set_time_freeze_mode(TIME_FREEZE_NORMAL);
}
} else {
numEntries = setup_partner_popup(popup);
@ -280,7 +280,7 @@ block_17:
func_800E6860();
playerStatus->flags &= ~PLAYER_STATUS_FLAGS_20;
gOverrideFlags &= ~GLOBAL_OVERRIDES_40;
set_time_freeze_mode(0);
set_time_freeze_mode(TIME_FREEZE_NORMAL);
}
} else {
D_8010CCFA--;
@ -299,7 +299,7 @@ block_17:
return;
}
create_popup_menu(popup);
set_time_freeze_mode(3);
set_time_freeze_mode(TIME_FREEZE_PARTNER_MENU);
if (partnerActionStatus->partnerActionState == 0) {
set_action_state(ACTION_STATE_IDLE);
}
@ -353,7 +353,7 @@ block_17:
func_800E6860();
playerStatus->flags &= ~PLAYER_STATUS_FLAGS_20;
gOverrideFlags &= ~GLOBAL_OVERRIDES_40;
set_time_freeze_mode(0);
set_time_freeze_mode(TIME_FREEZE_NORMAL);
}
break;
case 10:

View File

@ -1,10 +1,20 @@
#include "common.h"
#include "hud_element.h"
extern HudScript* TimesHudScript;
extern HudScript* SPIncrementHudScripts[];
extern HudScript* SPStarHudScripts[];
extern s32 D_800F7FE8;
extern s32 D_800F7FEC;
extern s32 D_800F7FF0;
extern s32 D_800F7FF4;
extern s32 D_800F7FF8;
extern s32 D_800F7FFC;
extern s32 D_800F8000[];
extern s16 D_8010CD10;
extern s16 D_8010CD12;
extern s32 TimesHudScript;
extern s32 DigitHudScripts[10];
extern HudScript HES_StatusHP;
@ -16,6 +26,8 @@ extern HudScript HES_StatusStarPoint;
extern HudScript HES_StatusStar1;
extern HudScript HES_StatusTimes;
extern HudScript HES_StatusSPShine;
extern HudScript HES_StatusSPEmptyIncrement;
extern HudScript HES_StatusStarEmpty;
extern HudScript SlashHudScript;
@ -325,10 +337,10 @@ void initialize_status_menu(void) {
uiStatus->starpointsBlinkCounter = 0;
uiStatus->unk_6C[2] = -1;
uiStatus->unk_3B[1] = 0;
uiStatus->unk_57[0] = 0;
uiStatus->unk_57[1] = 0;
uiStatus->unk_57[2] = 0;
uiStatus->unk_57[3] = 0;
uiStatus->unk_57 = 0;
uiStatus->unk_58 = 0;
uiStatus->unk_59 = 0;
uiStatus->spBarsToBlink = 0;
uiStatus->unk_6C[0] = 0;
uiStatus->unk_6C[1] = 0;
uiStatus->iconIndex12 = -1;
@ -955,13 +967,14 @@ void reset_status_menu(void) {
// Weird order of loading stuff
#ifdef NON_EQUIVALENT
s32 is_ability_active(s32 ability) {
s32 abilityMoveID;
PlayerData* playerData = &gPlayerData;
s32 attackFXArray[6];
s32 abilityMoveID;
s32 ret;
s32 attackFXIndex;
s32 badgeMoveID;
s32 i;
s32 badgeMoveID;
u8* moveID;
ret = 0;
attackFXIndex = 0;
@ -974,17 +987,15 @@ s32 is_ability_active(s32 ability) {
return 0;
}
for (i = 0; i < ARRAY_COUNT(playerData->equippedBadges); i++) {
s32 b = playerData->equippedBadges[i];
badgeMoveID = playerData->equippedBadges[i];
if (b != 0) {
badgeMoveID = gItemTable[b].moveID;
if (badgeMoveID != 0) {
moveID = &gItemTable[badgeMoveID].moveID;
badgeMoveID = *moveID;
}
switch (ability) {
default:
continue;
case ABILITY_DODGE_MASTER:
abilityMoveID = 0x4c;
break;
@ -1178,6 +1189,9 @@ s32 is_ability_active(s32 ability) {
case ABILITY_HEALTHY_HEALTHY:
abilityMoveID = 0x4a;
break;
default:
do { } while (0);
continue;
}
if (badgeMoveID == abilityMoveID) {
ret++;
@ -1193,7 +1207,6 @@ s32 is_ability_active(s32 ability) {
INCLUDE_ASM(s32, "80850_len_3060", is_ability_active);
#endif
s32 is_partner_ability_active(s32 ability) {
return 0;
}
@ -1274,14 +1287,14 @@ void add_SP(s32 amt) {
s32 phi_v1;
s32 maxPower;
uiStatus->unk_57[0] = 1;
uiStatus->unk_57[1] = 60;
uiStatus->unk_57 = 1;
uiStatus->unk_58 = 60;
phi_v1 = playerData->specialBarsFilled;
if (playerData->specialBarsFilled < 0) {
phi_v1 = playerData->specialBarsFilled + 31;
}
uiStatus->unk_57[2] = phi_v1 >> 5;
uiStatus->unk_59 = phi_v1 >> 5;
playerData->specialBarsFilled += amt;

View File

@ -401,20 +401,20 @@ s32 popup_menu_update(void) {
case 9:
case 12:
set_window_update(WINDOW_ID_14, (s32)basic_window_update);
sfx_play_sound(1);
sfx_play_sound(SOUND_1);
set_window_update(WINDOW_ID_19, (s32)basic_window_update);
break;
case 1:
case 4:
set_window_update(WINDOW_ID_14, (s32)basic_window_update);
sfx_play_sound(2);
sfx_play_sound(SOUND_2);
set_window_update(WINDOW_ID_19, (s32)basic_window_update);
break;
case 10:
case 11:
case 13:
set_window_update(WINDOW_ID_14, (s32)basic_window_update);
sfx_play_sound(1);
sfx_play_sound(SOUND_1);
break;
}
set_window_update(WINDOW_ID_21, WINDOW_UPDATE_SHOW);

View File

@ -4,13 +4,19 @@
#include "pause/pause_common.h"
#include "world/partners.h"
#include "sparkle_script.h"
#include "item_entity.h"
#define MAX_ITEM_ENTITIES 256
extern SparkleScript SparkleScript_Coin;
extern Gfx D_8014B870[];
extern Gfx D_8014BBD8[];
extern Lights1 D_8014C6C8;
extern HudCacheEntry* gHudElementCacheTableRaster;
extern HudCacheEntry* gHudElementCacheTablePalette;
extern s32 ItemEntitiesCreated;
extern s32 D_80155D80;
extern s32 ItemEntityAlternatingSpawn;
@ -45,6 +51,7 @@ void update_item_entity_static(ItemEntity*);
void func_801356C4(ItemEntity*);
void func_801356CC(ItemEntity*);
void func_801356D4(ItemEntity*);
void func_801363A0(ItemEntity*);
void update_item_entity_temp(ItemEntity*);
s32 draw_image_with_clipping(IMG_PTR raster, s32 width, s32 height, s32 fmt, s32 bitDepth, s16 posX, s16 posY, u16 clipULx,
u16 clipULy, u16 clipLRx, u16 clipRLy);
@ -668,10 +675,53 @@ s32 make_item_entity_at_player(s32 itemID, s32 arg1, s32 pickupMsgFlags) {
return id;
}
//TODO remove this
static const f32 rodata_padding_2 = 0.0f;
void item_entity_update(ItemEntity* entity) {
s32* args;
s32 max, threshold;
INCLUDE_ASM(s32, "C50A0", item_entity_update);
entity->nextUpdate--;
if (entity->nextUpdate != 0) {
return;
}
do {
args = entity->readPos;
switch(*args++) {
case ITEM_SCRIPT_OP_End:
entity->nextUpdate = 60;
return;
case ITEM_SCRIPT_OP_SetImage:
entity->nextUpdate = *args++;
*args++;
*args++;
if (!gGameStatusPtr->isBattle) {
entity->lookupRasterIndex = *args++ & 0xFFFF;
entity->lookupPaletteIndex = *args++ & 0xFFFF;
} else {
entity->lookupRasterIndex = *args++ >> 16;
entity->lookupPaletteIndex = *args++ >> 16;
}
entity->readPos = args;
return;
case ITEM_SCRIPT_OP_Restart:
entity->readPos = entity->savedReadPos;
break;
case ITEM_SCRIPT_OP_Loop:
entity->savedReadPos = args;
entity->readPos = args;
break;
case ITEM_SCRIPT_OP_RandomRestart:
max = *args++;
threshold = *args++;
if (rand_int(max) < threshold) {
entity->readPos = entity->savedReadPos;
} else {
entity->readPos = args;
}
break;
}
} while (TRUE);
}
void update_item_entities(void) {
ItemEntity* entity;
@ -761,7 +811,153 @@ void update_item_entities(void) {
}
}
INCLUDE_ASM(s32, "C50A0", appendGfx_item_entity);
void appendGfx_item_entity(void* data) {
ItemEntity* itemEntity = (ItemEntity*)data;
Mtx sp18;
Matrix4f sp58, sp98, spD8;
s32 alpha = 255;
s32 yOffset;
f32 rot;
if (itemEntity->flags & (ITEM_ENTITY_FLAGS_8000000 | ITEM_ENTITY_FLAGS_TRANSPARENT)) {
if (itemEntity->flags & ITEM_ENTITY_FLAGS_TRANSPARENT) {
alpha = 255;
alpha = (itemEntity->alpha * alpha) / 255;
}
if (itemEntity->flags & ITEM_ENTITY_FLAGS_8000000) {
u8 r, g, b, a;
get_background_color_blend(&r, &g, &b, &a);
alpha = (alpha * (255 - a)) / 255;
}
}
if (!(itemEntity->flags & ITEM_ENTITY_FLAGS_40000)) {
yOffset = -2;
} else {
yOffset = -3;
}
if (itemEntity->itemID == ITEM_COIN || itemEntity->itemID == ITEM_STAR_POINT || itemEntity->itemID == ITEM_HEART) {
itemEntity->scale = 1.0f;
}
rot = clamp_angle(180.0f - gCameras[gCurrentCamID].currentYaw);
guTranslateF(sp58, itemEntity->position.x, itemEntity->position.y + yOffset, itemEntity->position.z);
guRotateF(sp98, rot, 0.0f, 1.0f, 0.0f);
if (itemEntity->flags & ITEM_ENTITY_FLAGS_TINY) {
guScaleF(spD8, itemEntity->scale, itemEntity->scale, itemEntity->scale);
guMtxCatF(sp98, spD8, sp98);
}
guMtxCatF(sp98, sp58, sp58);
guMtxF2L(sp58, &sp18);
gDisplayContext->matrixStack[gMatrixListPos] = sp18;
gSPMatrix(gMasterGfxPos++, &gDisplayContext->matrixStack[gMatrixListPos++],
G_MTX_PUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
if (D_80151328->flags != 0) {
gSPDisplayList(gMasterGfxPos++, D_8014BBD8);
} else {
gSPDisplayList(gMasterGfxPos++, D_8014B870);
}
gSPClearGeometryMode(gMasterGfxPos++, G_CULL_BOTH | G_LIGHTING);
gSPDisplayList(gMasterGfxPos++, D_8014C620);
if (itemEntity->flags & (ITEM_ENTITY_FLAGS_8000000 | ITEM_ENTITY_FLAGS_TRANSPARENT)) {
if (D_80151328->flags != 0) {
gDPSetRenderMode(gMasterGfxPos++, AA_EN | IM_RD | CVG_DST_SAVE | ZMODE_OPA | FORCE_BL | G_RM_PASS,
AA_EN | IM_RD | CVG_DST_SAVE | ZMODE_OPA | FORCE_BL |
GBL_c2(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA));
} else {
gDPSetRenderMode(gMasterGfxPos++, AA_EN | IM_RD | CVG_DST_SAVE | ZMODE_OPA | FORCE_BL |
GBL_c1(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA),
AA_EN | IM_RD | CVG_DST_SAVE | ZMODE_OPA | FORCE_BL |
GBL_c2(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA));
gDPSetCombineLERP(gMasterGfxPos++, PRIMITIVE, 0, TEXEL0, 0, PRIMITIVE, 0, TEXEL0, 0, PRIMITIVE, 0,
TEXEL0, 0, TEXEL0, 0, PRIMITIVE, 0);
gDPSetPrimColor(gMasterGfxPos++, 0, 0, 255, 255, 255, alpha);
}
}
if (!(itemEntity->flags & ITEM_ENTITY_FLAGS_40000)) {
gDPLoadTLUT_pal16(gMasterGfxPos++, 0, gHudElementCacheTablePalette[itemEntity->lookupPaletteIndex].data);
if (D_80151328->flags != 0) {
gDPSetTextureImage(gMasterGfxPos++, G_IM_FMT_CI, G_IM_SIZ_8b, 12, gHudElementCacheTableRaster[itemEntity->lookupRasterIndex].data);
gDPSetTile(gMasterGfxPos++, G_IM_FMT_CI, G_IM_SIZ_8b, 2, 0x0000, G_TX_LOADTILE, 0, G_TX_NOMIRROR |
G_TX_CLAMP, 8, G_TX_NOLOD, G_TX_NOMIRROR | G_TX_CLAMP, 8, G_TX_NOLOD);
gDPLoadSync(gMasterGfxPos++);
gDPLoadTile(gMasterGfxPos++, G_TX_LOADTILE, 0, 0, 0x002E, 0x005C);
gDPPipeSync(gMasterGfxPos++);
gDPSetTile(gMasterGfxPos++, G_IM_FMT_CI, G_IM_SIZ_4b, 2, 0x0000, 1, 0, G_TX_NOMIRROR | G_TX_CLAMP, 8,
G_TX_NOLOD, G_TX_NOMIRROR | G_TX_CLAMP, 8, G_TX_NOLOD);
gDPSetTileSize(gMasterGfxPos++, 1, 0x0400, 0x0400, 0x045C, 0x045C);
gDPSetTile(gMasterGfxPos++, G_IM_FMT_CI, G_IM_SIZ_4b, 2, 0x0000, G_TX_RENDERTILE, 1,
G_TX_NOMIRROR | G_TX_CLAMP, 8, G_TX_NOLOD, G_TX_NOMIRROR | G_TX_CLAMP, 8, G_TX_NOLOD);
gDPSetTile(gMasterGfxPos++, G_IM_FMT_RGBA, G_IM_SIZ_16b, 4, 0x0100, 2, 0, G_TX_NOMIRROR | G_TX_WRAP,
G_TX_NOMASK, G_TX_NOLOD, G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMASK, G_TX_NOLOD);
gDPSetTileSize(gMasterGfxPos++, 2, 0, 0, 0x00FC, 0);
if (itemEntity->flags & (ITEM_ENTITY_FLAGS_8000000 | ITEM_ENTITY_FLAGS_TRANSPARENT)) {
func_801491E4(&sp58, 0, 0, 0x18, 0x18, alpha);
} else {
func_801491E4(&sp58, 0, 0, 0x18, 0x18, 255);
}
} else {
gDPSetTextureImage(gMasterGfxPos++, G_IM_FMT_CI, G_IM_SIZ_8b, 12, gHudElementCacheTableRaster[itemEntity->lookupRasterIndex].data);
gDPSetTile(gMasterGfxPos++, G_IM_FMT_CI, G_IM_SIZ_8b, 2, 0x0000, G_TX_LOADTILE, 0,
G_TX_NOMIRROR | G_TX_CLAMP, 8, G_TX_NOLOD, G_TX_NOMIRROR | G_TX_CLAMP, 8, G_TX_NOLOD);
gDPLoadSync(gMasterGfxPos++);
gDPLoadTile(gMasterGfxPos++, G_TX_LOADTILE, 0, 0, 0x002E, 0x005C);
gDPPipeSync(gMasterGfxPos++);
gDPSetTile(gMasterGfxPos++, G_IM_FMT_CI, G_IM_SIZ_4b, 2, 0x0000, G_TX_RENDERTILE, 0,
G_TX_NOMIRROR | G_TX_CLAMP, 8, G_TX_NOLOD, G_TX_NOMIRROR | G_TX_CLAMP, 8, G_TX_NOLOD);
gDPSetTileSize(gMasterGfxPos++, G_TX_RENDERTILE, 0x0400, 0x0400, 0x045C, 0x045C);
}
gSPDisplayList(gMasterGfxPos++, D_8014C678);
} else {
gDPLoadTLUT_pal16(gMasterGfxPos++, 0, gHudElementCacheTablePalette[itemEntity->lookupPaletteIndex].data);
if (D_80151328->flags != 0) {
gDPSetTextureImage(gMasterGfxPos++, G_IM_FMT_CI, G_IM_SIZ_8b, 16, gHudElementCacheTableRaster[itemEntity->lookupRasterIndex].data);
gDPSetTile(gMasterGfxPos++, G_IM_FMT_CI, G_IM_SIZ_8b, 2, 0x0000, G_TX_LOADTILE, 0,
G_TX_NOMIRROR | G_TX_CLAMP, 8, G_TX_NOLOD, G_TX_NOMIRROR | G_TX_CLAMP, 8, G_TX_NOLOD);
gDPLoadSync(gMasterGfxPos++);
gDPLoadTile(gMasterGfxPos++, G_TX_LOADTILE, 0, 0, 0x003E, 0x007C);
gDPPipeSync(gMasterGfxPos++);
gDPSetTile(gMasterGfxPos++, G_IM_FMT_CI, G_IM_SIZ_4b, 2, 0x0000, 1, 0, G_TX_NOMIRROR | G_TX_CLAMP,
8, G_TX_NOLOD, G_TX_NOMIRROR | G_TX_CLAMP, 8, G_TX_NOLOD);
gDPSetTileSize(gMasterGfxPos++, 1, 0x0400, 0x0400, 0x047C, 0x047C);
gDPSetTile(gMasterGfxPos++, G_IM_FMT_CI, G_IM_SIZ_4b, 2, 0x0000, G_TX_RENDERTILE, 1,
G_TX_NOMIRROR | G_TX_CLAMP, 8, G_TX_NOLOD, G_TX_NOMIRROR | G_TX_CLAMP, 8, G_TX_NOLOD);
gDPSetTile(gMasterGfxPos++, G_IM_FMT_RGBA, G_IM_SIZ_16b, 4, 0x0100, 2, 0, G_TX_NOMIRROR | G_TX_WRAP,
G_TX_NOMASK, G_TX_NOLOD, G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMASK, G_TX_NOLOD);
gDPSetTileSize(gMasterGfxPos++, 2, 0, 0, 0x00FC, 0);
if (itemEntity->flags & (ITEM_ENTITY_FLAGS_8000000 | ITEM_ENTITY_FLAGS_TRANSPARENT)) {
func_801491E4(&sp58, 0, 0, 0x20, 0x20, alpha);
} else {
func_801491E4(&sp58, 0, 0, 0x20, 0x20, 255);
}
} else {
gDPSetTextureImage(gMasterGfxPos++, G_IM_FMT_CI, G_IM_SIZ_8b, 16, gHudElementCacheTableRaster[itemEntity->lookupRasterIndex].data);
gDPSetTile(gMasterGfxPos++, G_IM_FMT_CI, G_IM_SIZ_8b, 2, 0x0000, G_TX_LOADTILE, 0,
G_TX_NOMIRROR | G_TX_CLAMP, 8, G_TX_NOLOD, G_TX_NOMIRROR | G_TX_CLAMP, 8, G_TX_NOLOD);
gDPLoadSync(gMasterGfxPos++);
gDPLoadTile(gMasterGfxPos++, G_TX_LOADTILE, 0, 0, 0x003E, 0x007C);
gDPPipeSync(gMasterGfxPos++);
gDPSetTile(gMasterGfxPos++, G_IM_FMT_CI, G_IM_SIZ_4b, 2, 0x0000, G_TX_RENDERTILE, 0,
G_TX_NOMIRROR | G_TX_CLAMP, 8, G_TX_NOLOD, G_TX_NOMIRROR | G_TX_CLAMP, 8, G_TX_NOLOD);
gDPSetTileSize(gMasterGfxPos++, G_TX_RENDERTILE, 0x0400, 0x0400, 0x047C, 0x047C);
}
gSPDisplayList(gMasterGfxPos++, D_8014C6A0);
}
gSPPopMatrix(gMasterGfxPos++, G_MTX_MODELVIEW);
gDPPipeSync(gMasterGfxPos++);
if (itemEntity->itemID == ITEM_COIN) {
draw_coin_sparkles(itemEntity);
}
}
void draw_item_entities(void) {
RenderTask rt;
@ -961,7 +1157,7 @@ s32 test_item_player_collision(ItemEntity* item) {
return FALSE;
}
if (gOverrideFlags & 0x200000) {
if (gOverrideFlags & GLOBAL_OVERRIDES_200000) {
return FALSE;
}
@ -1622,8 +1818,392 @@ void func_801356CC(ItemEntity* itemEntity) {
void func_801356D4(ItemEntity* itemEntity) {
}
INCLUDE_ASM(s32, "C50A0", update_item_entity_temp);
void update_item_entity_temp(ItemEntity* itemEntity) {
PlayerData* playerData = &gPlayerData;
PlayerStatus* playerStatus = &gPlayerStatus;
PopupMenu* menu = &D_801565B0;
ItemData* itemData;
s32 numEntries;
s32 msgID;
s32 i;
if (itemEntity->state == 0) {
isPickingUpItem = TRUE;
if (!(itemEntity->flags & ITEM_ENTITY_FLAGS_2000000)) {
disable_player_input();
partner_disable_input();
gOverrideFlags |= GLOBAL_OVERRIDES_40;
set_time_freeze_mode(TIME_FREEZE_FULL);
}
item_entity_disable_shadow(itemEntity);
itemEntity->state = 1;
}
switch (itemEntity->state) {
case 1:
if (!(itemEntity->flags & ITEM_ENTITY_FLAGS_2000000)) {
s32 actionState = playerStatus->actionState;
if (!(playerStatus->animFlags & PLAYER_STATUS_ANIM_FLAGS_10000000) &&
((playerStatus->timeInAir == 0 &&
actionState != ACTION_STATE_JUMP &&
actionState != ACTION_STATE_FALLING) ||
!playerStatus->enableCollisionOverlapsCheck ||
playerStatus->inputEnabledCounter == 0) &&
actionState != ACTION_STATE_LAUNCH &&
actionState != ACTION_STATE_RIDE &&
actionState != ACTION_STATE_IDLE &&
(actionState != ACTION_STATE_USE_SPINNING_FLOWER || playerStatus->fallState != 1)
) {
break;
}
}
if (!(itemEntity->pickupMsgFlags & 1)) {
if (gItemTable[itemEntity->itemID].typeFlags & ITEM_TYPE_FLAG_BADGE) {
sfx_play_sound(SOUND_D3);
} else if (gItemTable[itemEntity->itemID].typeFlags & ITEM_TYPE_FLAG_KEY) {
sfx_play_sound(SOUND_D2);
} else if (itemEntity->itemID == ITEM_COIN) {
sfx_play_sound_at_position(
SOUND_211, 0, itemEntity->position.x, itemEntity->position.y, itemEntity->position.z
);
} else {
sfx_play_sound(SOUND_D1);
}
}
D_801568E0 = hud_element_create(gItemHudScripts[gItemTable[itemEntity->itemID].hudElemID].enabled);
hud_element_set_flags(D_801568E0, 0x80);
hud_element_set_render_pos(D_801568E0, -100, -100);
itemEntity->state = 2;
if (!(itemEntity->flags & ITEM_ENTITY_FLAGS_2000000)) {
if (gItemTable[itemEntity->itemID].typeFlags & ITEM_TYPE_FLAG_CONSUMABLE) {
for (i = 0; i < ARRAY_COUNT(playerData->invItems); i++)