diff --git a/include/mario/mario.h b/include/mario/mario.h index fa65469..6d8ec9f 100644 --- a/include/mario/mario.h +++ b/include/mario/mario.h @@ -5,51 +5,86 @@ #pragma enumsalwaysint off typedef enum MarioMotion { - kStay, //0x0 - kWalk, //0x1 - kDash, //0x2 - kJump, //0x3 - kJumpNPC, //0x4 - kJumpSw, //0x5 - kJumpStand, //0x6 - kJump2, //0x7 - kJump3, //0x8 - kJumpSmall, //0x9 - kFall, //0xA - kFall2, //0xB - kUpstairs, //0xC - kLand, //0xD - kTalk, //0xE - kGetItem, //0xF - kHip, //0x10 - kHip2, //0x11 - kHammer, //0x12 - kHammer2, //0x13 - kJabara, //0x14 - kSlit, //0x15 - kRoll, //0x16 - kKaze, //0x17 - kPlane, //0x18 - kShip, //0x19 - kYoshi, //0x1A - kCloud, //0x1B - kVivian, //0x1C - kDokan, //0x1D - kGrasp, //0x1E - kDamage, //0x1F - kDamageToge, //0x20 - kBottomless, //0x21 - kForceReset, //0x22 - kShadow, //0x23 - kPartyUse, //0x24 - kKpaSwim, //0x25 - kKpaPowUp, //0x26 - kKpaPowDown, //0x27 - kDummy, //0x28 - kMotionMax = 0xFFFF + MARIO_MOTION_STAY, //0x0 + MARIO_MOTION_WALK, //0x1 + MARIO_MOTION_DASH, //0x2 + MARIO_MOTION_JUMP, //0x3 + MARIO_MOTION_JUMP_NPC, //0x4 + MARIO_MOTION_JUMP_SW, //0x5 + MARIO_MOTION_JUMP_STAND, //0x6 + MARIO_MOTION_JUMP_2, //0x7 + MARIO_MOTION_JUMP_3, //0x8 + MARIO_MOTION_JUMP_SMALL, //0x9 + MARIO_MOTION_FALL, //0xA + MARIO_MOTION_FALL_2, //0xB + MARIO_MOTION_UPSTAIRS, //0xC + MARIO_MOTION_LAND, //0xD + MARIO_MOTION_TALK, //0xE + MARIO_MOTION_GET_ITEM, //0xF + MARIO_MOTION_HIP, //0x10 + MARIO_MOTION_HIP_2, //0x11 + MARIO_MOTION_HAMMER, //0x12 + MARIO_MOTION_HAMMER_2, //0x13 + MARIO_MOTION_JABARA, //0x14 + MARIO_MOTION_SLIT, //0x15 + MARIO_MOTION_ROLL, //0x16 + MARIO_MOTION_KAZE, //0x17 + MARIO_MOTION_PLANE, //0x18 + MARIO_MOTION_SHIP, //0x19 + MARIO_MOTION_YOSHI, //0x1A + MARIO_MOTION_CLOUD, //0x1B + MARIO_MOTION_VIVIAN, //0x1C + MARIO_MOTION_DOKAN, //0x1D + MARIO_MOTION_GRASP, //0x1E + MARIO_MOTION_DAMAGE, //0x1F + MARIO_MOTION_DAMAGE_TOGE, //0x20 + MARIO_MOTION_BOTTOMLESS, //0x21 + MARIO_MOTION_FORCE_RESET, //0x22 + MARIO_MOTION_SHADOW, //0x23 + MARIO_MOTION_PARTY_USE, //0x24 + MARIO_MOTION_KPA_SWIM, //0x25 + MARIO_MOTION_KPA_POW_UP, //0x26 + MARIO_MOTION_KPA_POW_DOWN, //0x27 + MARIO_MOTION_DUMMY, //0x28 + MARIO_MOTION_MOTION_MAX = 0xFFFF } MarioMotion; #pragma enumsalwaysint on +#pragma enumsalwaysint off +typedef enum MarioFlags { + MARIO_FLAG_ACTIVE = (1 << 0), + MARIO_FLAG_CTRL_OFF = (1 << 1), + MARIO_FLAG_CTRL_OFF_2 = (1 << 2), + MARIO_FLAG_KEY_OFF = (1 << 3), + MARIO_FLAG_FORCED_MOVEMENT = (1 << 5), + MARIO_FLAG_USE_FORCE_DIRECTION = (1 << 6), + MARIO_FLAG_STOP_AIR_MOVEMENT = (1 << 7), + MARIO_FLAG_FLOORS_DISABLED = (1 << 8), + MARIO_FLAG_FORCE_WALL = (1 << 9), + MARIO_FLAG_WALLS_DISABLED = (1 << 10), + MARIO_FLAG_HAMMER_HIT_WALL = (1 << 11), + MARIO_FLAG_PRE_BATTLE_PHYSICS = (1 << 12), + MARIO_FLAG_IS_CARRYING_BOBBERY = (1 << 13), + MARIO_FLAG_ITEM_GET_DISABLED = (1 << 14), + MARIO_FLAG_IS_PUSHING = (1 << 15), + MARIO_FLAG_IS_JUMPING = (1 << 16), + MARIO_FLAG_IS_FALLING = (1 << 17), + MARIO_FLAG_IS_STEPPING = (1 << 18), + MARIO_FLAG_HAS_INPUT_JUMP = (1 << 19), + MARIO_FLAG_PAPER_MODE = (1 << 20), + MARIO_FLAG_GONE_THROUGH_BARS = (1 << 21), + MARIO_FLAG_PARTY_WALK_DISABLED = (1 << 22), + MARIO_FLAG_SLIT_ABILITY_DISABLED = (1 << 23), + MARIO_FLAG_TUBE_MODE = (1 << 24), + MARIO_FLAG_BG_MODE = (1 << 25), + MARIO_FLAG_IN_SHALLOW_WATER = (1 << 26), + MARIO_FLAG_IS_TOUCHING_CEILING = (1 << 27), + MARIO_FLAG_CHG_MOT_DISABLED = (1 << 28), + MARIO_FLAG_IS_SHADOW_MARIO = (1 << 30), + MARIO_FLAG_IS_8_BIT = (1 << 31) +} MarioFlags; +#pragma enumsalwaysint on + //TODO: US struct is bigger, 0x2F8 vs 0x2E0 typedef struct MarioWork { u32 flags; //0x0 @@ -70,7 +105,10 @@ typedef struct MarioWork { s8 colorId; //0x3D u8 field_0x3E[0x44 - 0x3E]; //0x3E u32 currSubMotionId; //0x44 - u8 field_0x48[0x5C - 0x48]; //0x48 + u32 multiTimer; //0x48, ??? + u8 field_0x4C[0x50 - 0x4C]; //0x4C + s16 airTimer; // 0x50 + u8 field_0x52[0x5C - 0x52]; //0x52 s16 unk5C; //0x5C s16 unk5E; //0x5E s16 unk60; //0x60 @@ -94,9 +132,7 @@ typedef struct MarioWork { f32 unk144; //0x144 f32 unk148; //0x148 f32 unk14C; //0x14C - f32 unk150; //0x150 - f32 unk154; //0x154 - f32 unk158; //0x158 + Vec unk150; //0x150 f32 camFollowRate; //0x15C u8 unk160[0x168 - 0x160]; //0x160 s32 unk168; //0x168 diff --git a/include/mario/mario_cam.h b/include/mario/mario_cam.h index d547681..6b4e18e 100644 --- a/include/mario/mario_cam.h +++ b/include/mario/mario_cam.h @@ -2,4 +2,5 @@ #include -s32 marioGetCamId(void); \ No newline at end of file +s32 marioGetCamId(void); +void marioCamZoomOffReq2(s32); diff --git a/include/mario/mario_sbr.h b/include/mario/mario_sbr.h index 95f17c3..3b14d4a 100644 --- a/include/mario/mario_sbr.h +++ b/include/mario/mario_sbr.h @@ -5,3 +5,4 @@ void marioSetBottomlessResetPosition(f32 x, f32 y, f32 z); f32 revise360(f32 angle); f32 toMovedir(f32 angle); +void marioAdjustMoveDir(void); diff --git a/include/party.h b/include/party.h index e915b5f..c066a2c 100644 --- a/include/party.h +++ b/include/party.h @@ -5,29 +5,65 @@ #pragma enumsalwaysint off typedef enum PartyMember { - PARTY_NONE, //0 - PARTY_GOOMBELLA, //1 - PARTY_KOOPS, //2 - PARTY_BOBBERY, //3 - PARTY_YOSHI, //4 - PARTY_FLURRIE, //5 - PARTY_VIVIAN, //6 - PARTY_MS_MOWZ, //7 - PARTY_EGG, //8 - PARTY_FLAVIO, //9 - PARTY_PUNIO, //10 - PARTY_FRANKLY, //11 - PARTY_GUS, //12 - PARTY_GOOMBELLA_FOLLOWER, //13 - PARTY_KOOPS_FOLLOWER, //14 - PARTY_BOBBERY_FOLLOWER, //15 - PARTY_YOSHI_FOLLOWER, //16 - PARTY_FLURRIE_FOLLOWER, //17 - PARTY_VIVIAN_FOLLOWER, //18 - PARTY_MS_MOWZ_FOLLOWER //19 + PARTY_MEMBER_NONE, //0 + PARTY_MEMBER_GOOMBELLA, //1 + PARTY_MEMBER_KOOPS, //2 + PARTY_MEMBER_BOBBERY, //3 + PARTY_MEMBER_YOSHI, //4 + PARTY_MEMBER_FLURRIE, //5 + PARTY_MEMBER_VIVIAN, //6 + PARTY_MEMBER_MS_MOWZ, //7 + PARTY_MEMBER_EGG, //8 + PARTY_MEMBER_FLAVIO, //9 + PARTY_MEMBER_PUNIO, //10 + PARTY_MEMBER_FRANKLY, //11 + PARTY_MEMBER_CRAW, //12 + PARTY_MEMBER_GOOMBELLA_FOLLOWER, //13 + PARTY_MEMBER_KOOPS_FOLLOWER, //14 + PARTY_MEMBER_BOBBERY_FOLLOWER, //15 + PARTY_MEMBER_YOSHI_FOLLOWER, //16 + PARTY_MEMBER_FLURRIE_FOLLOWER, //17 + PARTY_MEMBER_VIVIAN_FOLLOWER, //18 + PARTY_MEMBER_MS_MOWZ_FOLLOWER //19 } PartyMember; #pragma enumsalwaysint on +#pragma enumsalwaysint off +typedef enum PartyFlags { + PARTY_FLAG_IS_ACTIVE = (1 << 0), + PARTY_FLAG_IS_GROUNDED = (1 << 1), + PARTY_FLAG_IS_FOLLOWER = (1 << 2), + PARTY_FLAG_IS_PARTNER = (1 << 3), + PARTY_FLAG_IS_JUMPING = (1 << 4), + PARTY_FLAG_IS_FALLING = (1 << 5), + PARTY_FLAG_IS_STEPPING = (1 << 6), + PARTY_FLAG_IN_SHALLOW_WATER = (1 << 7), + PARTY_FLAG_IS_BEING_USED = (1 << 8), + PARTY_FLAG_PAPER_MODE = (1 << 12), + PARTY_FLAG_MOT_SLIT_FLOOR = (1 << 13), + PARTY_FLAG_IS_RIDING_PLANE = (1 << 16), + PARTY_FLAG_IS_RIDING_SHIP = (1 << 17), + PARTY_FLAG_IS_BEHIND_MARIO = (1 << 19), + PARTY_FLAG_SLEEP_ON = (1 << 22), + PARTY_FLAG_BG_MODE = (1 << 23), + PARTY_FLAG_DISABLE_FRONT_WALL_CHK = (1 << 24), + PARTY_FLAG_FORCE_FALL = (1 << 25), + PARTY_FLAG_DISABLE_FLOORS = (1 << 26), + PARTY_FLAG_RUN_OFF = (1 << 28), + PARTY_FLAG_CTRL_OFF = (1 << 29), + PARTY_FLAG_CTRL_OFF_2 = (1 << 30), + PARTY_FLAG_IS_EVT_USE = (1 << 31) +} PartyFlags; +#pragma enumsalwaysint on + +#pragma enumsalwaysint off +typedef enum PartySlotId { + PARTY_SLOT_PARTY = 0, //0x0 + PARTY_SLOT_FOLLOWER = 1, //0x1 + PARTY_SLOT_NONE = -1 +} PartySlotId; +#pragma enumsalwaysint on + typedef struct PartyEntry { u32 flags; //0x0 u32 flags2; //0x4 @@ -39,10 +75,17 @@ typedef struct PartyEntry { s8 currentSlotId; //0x2F u8 field_0x30; //0x30 s8 currentMemberId; //0x31, PartyMembers - u8 field_0x32[0x160 - 0x32]; //0x32 + u8 field_0x32[0x39 - 0x32]; //0x32 + u8 useMotionId; //0x39 + u8 field_0x3A[0x58 - 0x3A]; //0x3A + Vec position; //0x58 + u8 field_0x3a[0x160 - 0x64]; //0x64 MarioWork* playerPtr; //0x160 s32 camId; //0x164 - u8 field_0x168[0x188 - 0x168]; //0x168 + s32 yoshiPsndSFXId ; //0x168 + s32 unk16C; //0x16C + void* useStruct; //0x170 + u8 field_0x168[0x188 - 0x174]; //0x174 } PartyEntry; PartyEntry* partyGetPtr(s32 id); diff --git a/include/party/party_cloud.h b/include/party/party_cloud.h index bbf1d4d..f644aa1 100644 --- a/include/party/party_cloud.h +++ b/include/party/party_cloud.h @@ -2,4 +2,20 @@ #include +typedef struct PartyCloud { + f32 unk0; //0x0 + f32 unk4; //0x4 + f32 unk8; //0x8 + u8 field_0xC[0x20 - 0xC]; // 0xC + s32 unk20; //0x20 + s32 unk24; //0x24 + s32 unk28; //0x28 + s32 unk2C; //0x2C + u8 field_0x30[0x48 - 0xC]; +} PartyCloud; + void cloudGetAt(Vec* position); +void cloudResetAt(); +u8 cloudGetStatus(); +f32 cloudGetBreathDir(void); +s32 cloudGetHitBreathout(s32 param_1); diff --git a/src/mario/mario.c b/src/mario/mario.c index 76fafe5..a9a1135 100644 --- a/src/mario/mario.c +++ b/src/mario/mario.c @@ -126,7 +126,7 @@ BOOL marioItemGetOk(void) { } BOOL marioCaseEventValidChk(void) { - if (mp->currMotionId == kPlane) { + if (mp->currMotionId == MARIO_MOTION_PLANE) { return FALSE; } else { @@ -135,7 +135,7 @@ BOOL marioCaseEventValidChk(void) { } BOOL mario8005BB80(void) { - if (mp->currMotionId == kRoll || mp->flags & 0x100000) { + if (mp->currMotionId == MARIO_MOTION_ROLL || mp->flags & 0x100000) { return FALSE; } return TRUE; @@ -285,7 +285,7 @@ void mario80058374(void) { MarioMotion mot = wp->currMotionId; s32 flags; - if (mot != kShip && mot != kRoll && mot != kPlane && mot != kJabara && mot != kYoshi) { + if (mot != MARIO_MOTION_SHIP && mot != MARIO_MOTION_ROLL && mot != MARIO_MOTION_PLANE && mot != MARIO_MOTION_JABARA && mot != MARIO_MOTION_YOSHI) { flags = wp->dispFlags; if (!(flags & 0x1000000)) { marioChgPose("M_D_1"); //inline diff --git a/src/mario/mario_cam.c b/src/mario/mario_cam.c index dbf9d6c..8344b4d 100644 --- a/src/mario/mario_cam.c +++ b/src/mario/mario_cam.c @@ -22,9 +22,9 @@ void marioResetCamShift(void) { void marioResetCamShiftRate(void) { MarioWork* mario = marioGetPtr(); - mario->unk150 = 0.03; - mario->unk154 = 0.06; - mario->unk158 = 0.06; + mario->unk150.x = 0.03; + mario->unk150.y = 0.06; + mario->unk150.z = 0.06; mario->unk64 = 0.0f; mario->unk68 = 2.0f; mario->unk6C = (Vec){ 0.0f, 0.0f, 0.0f }; @@ -195,7 +195,7 @@ BOOL marioCamZoomUp(void) { yOffset = (320.0f - (f32)mario->unk16C) / 3.5f; } - if (party && party->currentMemberId == PARTY_FLURRIE && party->flags & 0x100) { + if (party && party->currentMemberId == PARTY_MEMBER_FLURRIE && party->flags & 0x100) { angleAdjust = toMovedir(mario->unk1A8) >= 180.0f ? -70.0f : 70.0f; tempX = mario->unk168; zoomDistance = 550.0f; diff --git a/src/party/party_cloud.c b/src/party/party_cloud.c index c70afd6..c58fc20 100644 --- a/src/party/party_cloud.c +++ b/src/party/party_cloud.c @@ -1,5 +1,13 @@ #include "party/party_cloud.h" +#include "dolphin/types.h" +#include "musyx/musyx.h" #include "party.h" +#include "mario/mario.h" +#include "mario/mario_sbr.h" +#include "mario/mario_party.h" +#include "mario/mario_cam.h" +#include "system.h" +#include Vec cloud_at; @@ -8,7 +16,7 @@ void cloudGetAt(Vec* position) { u32 partyId = marioGetPartyId(); PartyEntry* party = partyGetPtr(partyId); - if (party == NULL || (party->currentMemberId == PARTY_FLURRIE && (party->flags & (1 << 8)) == 0)) { + if (party == NULL || (party->currentMemberId == PARTY_MEMBER_FLURRIE && (party->flags & PARTY_FLAG_IS_BEING_USED) == 0)) { return; } @@ -23,3 +31,168 @@ void cloudGetAt(Vec* position) { } } } + +void cloudResetAt() { + MarioWork* mario = marioGetPtr(); + u32 partyId = marioGetPartyId(); + PartyEntry* party = partyGetPtr(partyId); + + if(party != NULL && party->currentMemberId == PARTY_MEMBER_FLURRIE) { + cloud_at.x = camGetPtr(CAMERA_3D)->target.x; + cloud_at.y = camGetPtr(CAMERA_3D)->target.y; + cloud_at.z = camGetPtr(CAMERA_3D)->target.z; + + marioCamZoomOffReq2(600); + } + + mario->dispFlags &= ~(1 << 8); //kDisableMakeDispDir + mario->dispFlags &= ~(1 << 2); //kForceFrontPose + marioAdjustMoveDir(); + mario->unk150.x = 0.01f; + mario->unk138 = 0.0f; +} + +u8 cloudGetStatus() { + u32 partyId = marioGetPartyId(); + PartyEntry* party = partyGetPtr(partyId); + u8 status = 2; + + if (party == NULL || (party->currentMemberId == PARTY_MEMBER_FLURRIE && (party->flags & PARTY_FLAG_IS_BEING_USED) == 0)) { + status = 0; + return status; + } + else if (party->useMotionId == 10 && party->useMotionId < 20) { + status = 1; + } + + return status; +} + +void mot_cloud() { + MarioWork* mario = marioGetPtr(); + + if((mario->trigFlags & 0x1) != 0) { + mario->trigFlags &= ~0x1; + mario->flags &= ~(MARIO_FLAG_HAS_INPUT_JUMP|MARIO_FLAG_IS_STEPPING|MARIO_FLAG_IS_FALLING|MARIO_FLAG_IS_JUMPING); + mario->multiTimer = 0; + mario->airTimer = 0; + mario->currSubMotionId = 0; + } +} + +f32 cloudGetBreathDir() { + PartyEntry* party = partyGetPtr(PARTY_SLOT_PARTY); + f32 breathDir; + + if (party == NULL) { + return 0.0f; + } + + if ((party->flags & PARTY_FLAG_IS_BEING_USED) != 0 && (party->useMotionId < MARIO_MOTION_FALL)){ + breathDir = -1.0f; + } + else if (party->useStruct == NULL) { + breathDir = 0.0f; + } + else { + PartyCloud* cloud = (PartyCloud*)party->useStruct; + breathDir = toMovedir(cloud->unk4); + } + + return breathDir; +} + +f32 cloudGetBreathDist() { + u32 partyId = marioGetPartyId(); + PartyEntry* party = partyGetPtr(partyId); + f32 breathDist; + + if (party == NULL) { + breathDist = 0.0f; + return breathDist; + } + + if ((party->currentMemberId != PARTY_MEMBER_FLURRIE || (party->flags & PARTY_FLAG_IS_BEING_USED) == 0) || party->useMotionId < MARIO_MOTION_FALL) { + breathDist = 0.0f; + } + else { + PartyCloud* cloud = (PartyCloud*)party->useStruct; + breathDist = cloud->unk8; + } + + return breathDist; +} + +f32 cloudGetBreathPower(f32 param_1, Vec* param_2) { + PartyEntry* party = partyGetPtr(PARTY_SLOT_PARTY); + f32 breathPower; + f32 dist; + f32 angle; + f32 unk8; + f32 val; + + breathPower = 0.0f; + if (party == NULL) { + return breathPower; + } + + val = 10.0f; + if( + party->currentMemberId == PARTY_MEMBER_FLURRIE + && (party->flags & PARTY_FLAG_IS_BEING_USED) != 0 + && party->useMotionId >= MARIO_MOTION_FALL + && ((fabs(party->position.y - param_2->y - 18.0f)) <= val) + ) { + PartyCloud* cloud = (PartyCloud*)party->useStruct; + unk8 = cloud->unk8; + if (-((0.5f * param_1) - distABf(party->position.x, party->position.z, param_2->x, param_2->z)) <= unk8) { + PartyCloud* cloud = (PartyCloud*)party->useStruct; + dist = toMovedir(cloud->unk4); + angle = angleABf(party->position.x, party->position.z, param_2->x, param_2->z); + dist = revise360(angle - dist); + + if (dist <= 30.0f || dist >= 330.0f) { + breathPower = cos((3.1415927f * dist) / 180.0f); + val = 100.0f; + breathPower = val * fabsf(breathPower); + } + } + } + + return breathPower; +} + + +s32 cloudGetHitBreathout(s32 param_1) { + u32 partyId = marioGetPartyId(); + PartyEntry* party = partyGetPtr(partyId); + s32 hitBreathout; + + if (party == NULL) { + return 0; + } + + if ( + party->currentMemberId != PARTY_MEMBER_FLURRIE + || (party->flags & PARTY_FLAG_IS_BEING_USED) == 0 + || party->useMotionId < MARIO_MOTION_FALL + ){ + return 0; + } + + hitBreathout = 0; + if (param_1 == 0) { + hitBreathout = ((PartyCloud*)party->useStruct)->unk20; + } + else if (param_1 == 1) { + hitBreathout = ((PartyCloud*)party->useStruct)->unk24; + } + else if (param_1 == 2) { + hitBreathout = ((PartyCloud*)party->useStruct)->unk28; + } + else if (param_1 == 3) { + hitBreathout = ((PartyCloud*)party->useStruct)->unk2C; + } + + return hitBreathout; +} diff --git a/src/party/party_kuribo.c b/src/party/party_kuribo.c index 7c9f7d6..1af8c3a 100644 --- a/src/party/party_kuribo.c +++ b/src/party/party_kuribo.c @@ -9,7 +9,7 @@ u32 msg_ep; //unknown since it only gets written to once and never used BOOL christineGetStatus(void) { PartyEntry* party = partyGetPtr(marioGetPartyId()); - if (!party || party->currentMemberId != PARTY_GOOMBELLA || !(party->flags & 0x100)) { + if (!party || party->currentMemberId != PARTY_MEMBER_GOOMBELLA || !(party->flags & 0x100)) { return FALSE; } return TRUE;