sm64coopdx/src/game/characters.c
2022-01-15 20:44:11 -08:00

448 lines
No EOL
23 KiB
C

#include "sm64.h"
#include "types.h"
#include "characters.h"
#include "hud.h"
#include "model_ids.h"
#include "object_constants.h"
#include "audio_defines.h"
#include "luigi_audio_defines.h"
#include "pc/configfile.h"
#include "audio/external.h"
#include "engine/graph_node.h"
extern Gfx mario_cap_seg3_dl_03022F48[];
extern Gfx luigi_cap_seg3_dl_03022F48[];
extern Gfx toad_player_dl_cap[];
extern Gfx toad_player_dl_cap_decal[];
extern Gfx waluigi_cap_seg3_dl_03022F48[];
extern ALIGNED8 const u8 texture_hud_char_mario_head[];
extern ALIGNED8 const u8 texture_hud_char_luigi_head[];
extern ALIGNED8 const u8 texture_hud_char_toad_head[];
extern ALIGNED8 const u8 texture_hud_char_waluigi_head[];
struct Character gCharacters[CT_MAX] = {
[CT_MARIO] = {
.name = "Mario",
.hudHead = ',',
.hudHeadTexture = texture_hud_char_mario_head,
.cameraHudHead = GLYPH_CAM_MARIO_HEAD,
.modelId = MODEL_MARIO,
.capModelId = MODEL_MARIOS_CAP,
.capMetalModelId = MODEL_MARIOS_METAL_CAP,
.capWingModelId = MODEL_MARIOS_WING_CAP,
.capMetalWingModelId = MODEL_MARIOS_WINGED_METAL_CAP,
.capEnemyLayer = LAYER_OPAQUE,
.capEnemyGfx = mario_cap_seg3_dl_03022F48,
.capEnemyDecalGfx = NULL,
// anim
.animOffsetEnabled = false,
// sounds
.soundFreqScale = 1.0f,
.soundYahWahHoo = SOUND_MARIO_YAH_WAH_HOO,
.soundHoohoo = SOUND_MARIO_HOOHOO,
.soundYahoo = SOUND_MARIO_YAHOO,
.soundUh = SOUND_MARIO_UH,
.soundHrmm = SOUND_MARIO_HRMM,
.soundWah2 = SOUND_MARIO_WAH2,
.soundWhoa = SOUND_MARIO_WHOA,
.soundEeuh = SOUND_MARIO_EEUH,
.soundAttacked = SOUND_MARIO_ATTACKED,
.soundOoof = SOUND_MARIO_OOOF,
.soundOoof2 = SOUND_MARIO_OOOF2,
.soundHereWeGo = SOUND_MARIO_HERE_WE_GO,
.soundYawning = SOUND_MARIO_YAWNING,
.soundSnoring1 = SOUND_MARIO_SNORING1,
.soundSnoring2 = SOUND_MARIO_SNORING2,
.soundWaaaooow = SOUND_MARIO_WAAAOOOW,
.soundHaha = SOUND_MARIO_HAHA,
.soundHaha_2 = SOUND_MARIO_HAHA_2,
.soundUh2 = SOUND_MARIO_UH2,
.soundUh2_2 = SOUND_MARIO_UH2_2,
.soundOnFire = SOUND_MARIO_ON_FIRE,
.soundDying = SOUND_MARIO_DYING,
.soundPantingCold = SOUND_MARIO_PANTING_COLD,
.soundPanting = SOUND_MARIO_PANTING,
.soundCoughing1 = SOUND_MARIO_COUGHING1,
.soundCoughing2 = SOUND_MARIO_COUGHING2,
.soundCoughing3 = SOUND_MARIO_COUGHING3,
.soundPunchYah = SOUND_MARIO_PUNCH_YAH,
.soundPunchHoo = SOUND_MARIO_PUNCH_HOO,
.soundMamaMia = SOUND_MARIO_MAMA_MIA,
.soundGroundPoundWah = SOUND_MARIO_GROUND_POUND_WAH,
.soundDrowning = SOUND_MARIO_DROWNING,
.soundPunchWah = SOUND_MARIO_PUNCH_WAH,
.soundYahooWahaYippee = SOUND_MARIO_YAHOO_WAHA_YIPPEE,
.soundDoh = SOUND_MARIO_DOH,
.soundGameOver = SOUND_MARIO_GAME_OVER,
.soundHello = SOUND_MARIO_HELLO,
.soundPressStartToPlay = SOUND_MARIO_PRESS_START_TO_PLAY,
.soundTwirlBounce = SOUND_MARIO_TWIRL_BOUNCE,
.soundSnoring3 = SOUND_MARIO_SNORING3,
.soundSoLongaBowser = SOUND_MARIO_SO_LONGA_BOWSER,
.soundImaTired = SOUND_MARIO_IMA_TIRED,
},
[CT_LUIGI] = {
.name = "Luigi",
.hudHead = '.',
.hudHeadTexture = texture_hud_char_luigi_head,
.cameraHudHead = GLYPH_CAM_LUIGI_HEAD,
.modelId = MODEL_LUIGI,
.capModelId = MODEL_LUIGIS_CAP,
.capMetalModelId = MODEL_LUIGIS_METAL_CAP,
.capWingModelId = MODEL_LUIGIS_WING_CAP,
.capMetalWingModelId = MODEL_LUIGIS_WINGED_METAL_CAP,
.capEnemyLayer = LAYER_OPAQUE,
.capEnemyGfx = luigi_cap_seg3_dl_03022F48,
.capEnemyDecalGfx = NULL,
// anim
.animOffsetEnabled = false,
// sounds
.soundFreqScale = 1.0f,
.soundYahWahHoo = SOUND_LUIGI_YAH_WAH_HOO,
.soundHoohoo = SOUND_LUIGI_HOOHOO,
.soundYahoo = SOUND_LUIGI_YAHOO,
.soundUh = SOUND_LUIGI_UH,
.soundHrmm = SOUND_LUIGI_HRMM,
.soundWah2 = SOUND_LUIGI_WAH2,
.soundWhoa = SOUND_LUIGI_WHOA,
.soundEeuh = SOUND_LUIGI_EEUH,
.soundAttacked = SOUND_LUIGI_ATTACKED,
.soundOoof = SOUND_LUIGI_OOOF,
.soundOoof2 = SOUND_LUIGI_OOOF2,
.soundHereWeGo = SOUND_LUIGI_HERE_WE_GO,
.soundYawning = SOUND_LUIGI_YAWNING,
.soundSnoring1 = SOUND_LUIGI_SNORING1,
.soundSnoring2 = SOUND_LUIGI_SNORING2,
.soundWaaaooow = SOUND_LUIGI_WAAAOOOW,
.soundHaha = SOUND_LUIGI_HAHA,
.soundHaha_2 = SOUND_LUIGI_HAHA_2,
.soundUh2 = SOUND_LUIGI_UH2,
.soundUh2_2 = SOUND_LUIGI_UH2_2,
.soundOnFire = SOUND_LUIGI_ON_FIRE,
.soundDying = SOUND_LUIGI_DYING,
.soundPantingCold = SOUND_LUIGI_PANTING_COLD,
.soundPanting = SOUND_LUIGI_PANTING,
.soundCoughing1 = SOUND_LUIGI_COUGHING1,
.soundCoughing2 = SOUND_LUIGI_COUGHING2,
.soundCoughing3 = SOUND_LUIGI_COUGHING3,
.soundPunchYah = SOUND_LUIGI_PUNCH_YAH,
.soundPunchHoo = SOUND_LUIGI_PUNCH_HOO,
.soundMamaMia = SOUND_LUIGI_MAMA_MIA,
.soundGroundPoundWah = SOUND_LUIGI_GROUND_POUND_WAH,
.soundDrowning = SOUND_LUIGI_DROWNING,
.soundPunchWah = SOUND_LUIGI_PUNCH_WAH,
.soundYahooWahaYippee = SOUND_LUIGI_YAHOO_WAHA_YIPPEE,
.soundDoh = SOUND_LUIGI_DOH,
.soundGameOver = SOUND_LUIGI_GAME_OVER,
.soundHello = SOUND_LUIGI_HELLO,
.soundPressStartToPlay = SOUND_LUIGI_PRESS_START_TO_PLAY,
.soundTwirlBounce = SOUND_LUIGI_TWIRL_BOUNCE,
.soundSnoring3 = SOUND_LUIGI_SNORING3,
.soundSoLongaBowser = SOUND_LUIGI_SO_LONGA_BOWSER,
.soundImaTired = SOUND_LUIGI_IMA_TIRED,
},
[CT_TOAD] = {
.name = "Toad",
.hudHead = '/',
.hudHeadTexture = texture_hud_char_toad_head,
.cameraHudHead = GLYPH_CAM_TOAD_HEAD,
.modelId = MODEL_TOAD_PLAYER,
.capModelId = MODEL_TOADS_CAP,
.capMetalModelId = MODEL_TOADS_METAL_CAP,
.capWingModelId = MODEL_TOADS_WING_CAP,
.capMetalWingModelId = MODEL_TOADS_WING_CAP,
.capEnemyLayer = LAYER_TRANSPARENT,
.capEnemyGfx = toad_player_dl_cap,
.capEnemyDecalGfx = toad_player_dl_cap_decal,
// anim
.animOffsetEnabled = false,
// sounds
.soundFreqScale = 1.25f,
.soundYahWahHoo = SOUND_MARIO_YAH_WAH_HOO,
.soundHoohoo = SOUND_MARIO_HOOHOO,
.soundYahoo = SOUND_MARIO_YAHOO,
.soundUh = SOUND_MARIO_UH,
.soundHrmm = SOUND_MARIO_HRMM,
.soundWah2 = SOUND_MARIO_WAH2,
.soundWhoa = SOUND_MARIO_WHOA,
.soundEeuh = SOUND_MARIO_EEUH,
.soundAttacked = SOUND_MARIO_ATTACKED,
.soundOoof = SOUND_MARIO_OOOF,
.soundOoof2 = SOUND_MARIO_OOOF2,
.soundHereWeGo = SOUND_MARIO_HERE_WE_GO,
.soundYawning = SOUND_MARIO_YAWNING,
.soundSnoring1 = SOUND_MARIO_SNORING1,
.soundSnoring2 = SOUND_MARIO_SNORING2,
.soundWaaaooow = SOUND_MARIO_WAAAOOOW,
.soundHaha = SOUND_MARIO_HAHA,
.soundHaha_2 = SOUND_MARIO_HAHA_2,
.soundUh2 = SOUND_MARIO_UH2,
.soundUh2_2 = SOUND_MARIO_UH2_2,
.soundOnFire = SOUND_MARIO_ON_FIRE,
.soundDying = SOUND_MARIO_DYING,
.soundPantingCold = SOUND_MARIO_PANTING_COLD,
.soundPanting = SOUND_MARIO_PANTING,
.soundCoughing1 = SOUND_MARIO_COUGHING1,
.soundCoughing2 = SOUND_MARIO_COUGHING2,
.soundCoughing3 = SOUND_MARIO_COUGHING3,
.soundPunchYah = SOUND_MARIO_PUNCH_YAH,
.soundPunchHoo = SOUND_MARIO_PUNCH_HOO,
.soundMamaMia = SOUND_MARIO_MAMA_MIA,
.soundGroundPoundWah = SOUND_MARIO_GROUND_POUND_WAH,
.soundDrowning = SOUND_MARIO_DROWNING,
.soundPunchWah = SOUND_MARIO_PUNCH_WAH,
.soundYahooWahaYippee = SOUND_MARIO_YAHOO_WAHA_YIPPEE,
.soundDoh = SOUND_MARIO_DOH,
.soundGameOver = SOUND_MARIO_GAME_OVER,
.soundHello = SOUND_MARIO_HELLO,
.soundPressStartToPlay = SOUND_MARIO_PRESS_START_TO_PLAY,
.soundTwirlBounce = SOUND_MARIO_TWIRL_BOUNCE,
.soundSnoring3 = SOUND_MARIO_SNORING3,
.soundSoLongaBowser = SOUND_MARIO_SO_LONGA_BOWSER,
.soundImaTired = SOUND_MARIO_IMA_TIRED,
},
[CT_WALUIGI] = {
.name = "Waluigi",
.hudHead = 'z',
.hudHeadTexture = texture_hud_char_waluigi_head,
.cameraHudHead = GLYPH_CAM_WALUIGI_HEAD,
.modelId = MODEL_WALUIGI,
.capModelId = MODEL_WALUIGIS_CAP,
.capMetalModelId = MODEL_WALUIGIS_METAL_CAP,
.capWingModelId = MODEL_WALUIGIS_WING_CAP,
.capMetalWingModelId = MODEL_WALUIGIS_WINGED_METAL_CAP,
.capEnemyLayer = LAYER_OPAQUE,
.capEnemyGfx = waluigi_cap_seg3_dl_03022F48,
.capEnemyDecalGfx = NULL,
// anim
.animOffsetEnabled = true,
.animOffsetLowYPoint = 11,
.animOffsetFeet = 25,
.animOffsetHand = -10,
// sounds
.soundFreqScale = 0.99f,
.soundYahWahHoo = SOUND_LUIGI_YAH_WAH_HOO,
.soundHoohoo = SOUND_LUIGI_HOOHOO,
.soundYahoo = SOUND_LUIGI_YAHOO,
.soundUh = SOUND_LUIGI_UH,
.soundHrmm = SOUND_LUIGI_HRMM,
.soundWah2 = SOUND_LUIGI_WAH2,
.soundWhoa = SOUND_LUIGI_WHOA,
.soundEeuh = SOUND_LUIGI_EEUH,
.soundAttacked = SOUND_LUIGI_ATTACKED,
.soundOoof = SOUND_LUIGI_OOOF,
.soundOoof2 = SOUND_LUIGI_OOOF2,
.soundHereWeGo = SOUND_LUIGI_HERE_WE_GO,
.soundYawning = SOUND_LUIGI_YAWNING,
.soundSnoring1 = SOUND_LUIGI_SNORING1,
.soundSnoring2 = SOUND_LUIGI_SNORING2,
.soundWaaaooow = SOUND_LUIGI_WAAAOOOW,
.soundHaha = SOUND_LUIGI_HAHA,
.soundHaha_2 = SOUND_LUIGI_HAHA_2,
.soundUh2 = SOUND_LUIGI_UH2,
.soundUh2_2 = SOUND_LUIGI_UH2_2,
.soundOnFire = SOUND_LUIGI_ON_FIRE,
.soundDying = SOUND_LUIGI_DYING,
.soundPantingCold = SOUND_LUIGI_PANTING_COLD,
.soundPanting = SOUND_LUIGI_PANTING,
.soundCoughing1 = SOUND_LUIGI_COUGHING1,
.soundCoughing2 = SOUND_LUIGI_COUGHING2,
.soundCoughing3 = SOUND_LUIGI_COUGHING3,
.soundPunchYah = SOUND_LUIGI_PUNCH_YAH,
.soundPunchHoo = SOUND_LUIGI_PUNCH_HOO,
.soundMamaMia = SOUND_LUIGI_MAMA_MIA,
.soundGroundPoundWah = SOUND_LUIGI_GROUND_POUND_WAH,
.soundDrowning = SOUND_LUIGI_DROWNING,
.soundPunchWah = SOUND_LUIGI_PUNCH_WAH,
.soundYahooWahaYippee = SOUND_LUIGI_YAHOO_WAHA_YIPPEE,
.soundDoh = SOUND_LUIGI_DOH,
.soundGameOver = SOUND_LUIGI_GAME_OVER,
.soundHello = SOUND_LUIGI_HELLO,
.soundPressStartToPlay = SOUND_LUIGI_PRESS_START_TO_PLAY,
.soundTwirlBounce = SOUND_LUIGI_TWIRL_BOUNCE,
.soundSnoring3 = SOUND_LUIGI_SNORING3,
.soundSoLongaBowser = SOUND_LUIGI_SO_LONGA_BOWSER,
.soundImaTired = SOUND_LUIGI_IMA_TIRED,
},
};
enum AnimType {
ANIM_TYPE_NONE,
ANIM_TYPE_LOWY,
ANIM_TYPE_FEET,
ANIM_TYPE_HAND,
};
#define ANIM_TYPE_MAX 209
u8 sAnimTypes[ANIM_TYPE_MAX] = {
ANIM_TYPE_HAND, ANIM_TYPE_LOWY, ANIM_TYPE_NONE, ANIM_TYPE_NONE, ANIM_TYPE_NONE,
ANIM_TYPE_NONE, ANIM_TYPE_NONE, ANIM_TYPE_NONE, ANIM_TYPE_NONE, ANIM_TYPE_NONE,
ANIM_TYPE_NONE, ANIM_TYPE_NONE, ANIM_TYPE_NONE, ANIM_TYPE_NONE, ANIM_TYPE_NONE,
ANIM_TYPE_LOWY, ANIM_TYPE_LOWY, ANIM_TYPE_LOWY, ANIM_TYPE_LOWY, ANIM_TYPE_FEET,
ANIM_TYPE_LOWY, ANIM_TYPE_NONE, ANIM_TYPE_FEET, ANIM_TYPE_FEET, ANIM_TYPE_FEET,
ANIM_TYPE_LOWY, ANIM_TYPE_LOWY, ANIM_TYPE_LOWY, ANIM_TYPE_NONE, ANIM_TYPE_LOWY,
ANIM_TYPE_LOWY, ANIM_TYPE_LOWY, ANIM_TYPE_LOWY, ANIM_TYPE_LOWY, ANIM_TYPE_LOWY,
ANIM_TYPE_FEET, ANIM_TYPE_FEET, ANIM_TYPE_FEET, ANIM_TYPE_NONE, ANIM_TYPE_LOWY,
ANIM_TYPE_NONE, ANIM_TYPE_NONE, ANIM_TYPE_NONE, ANIM_TYPE_HAND, ANIM_TYPE_LOWY,
ANIM_TYPE_NONE, ANIM_TYPE_LOWY, ANIM_TYPE_LOWY, ANIM_TYPE_LOWY, ANIM_TYPE_LOWY,
ANIM_TYPE_LOWY, ANIM_TYPE_HAND, ANIM_TYPE_FEET, ANIM_TYPE_HAND, ANIM_TYPE_LOWY,
ANIM_TYPE_LOWY, ANIM_TYPE_LOWY, ANIM_TYPE_FEET, ANIM_TYPE_NONE, ANIM_TYPE_NONE,
ANIM_TYPE_NONE, ANIM_TYPE_NONE, ANIM_TYPE_NONE, ANIM_TYPE_LOWY, ANIM_TYPE_LOWY,
ANIM_TYPE_NONE, ANIM_TYPE_LOWY, ANIM_TYPE_NONE, ANIM_TYPE_NONE, ANIM_TYPE_NONE,
ANIM_TYPE_LOWY, ANIM_TYPE_LOWY, ANIM_TYPE_FEET, ANIM_TYPE_NONE, ANIM_TYPE_LOWY,
ANIM_TYPE_LOWY, ANIM_TYPE_NONE, ANIM_TYPE_LOWY, ANIM_TYPE_LOWY, ANIM_TYPE_FEET,
ANIM_TYPE_NONE, ANIM_TYPE_NONE, ANIM_TYPE_LOWY, ANIM_TYPE_LOWY, ANIM_TYPE_LOWY,
ANIM_TYPE_FEET, ANIM_TYPE_NONE, ANIM_TYPE_LOWY, ANIM_TYPE_NONE, ANIM_TYPE_LOWY,
ANIM_TYPE_LOWY, ANIM_TYPE_NONE, ANIM_TYPE_HAND, ANIM_TYPE_HAND, ANIM_TYPE_LOWY,
ANIM_TYPE_FEET, ANIM_TYPE_FEET, ANIM_TYPE_LOWY, ANIM_TYPE_LOWY, ANIM_TYPE_LOWY,
ANIM_TYPE_LOWY, ANIM_TYPE_LOWY, ANIM_TYPE_LOWY, ANIM_TYPE_LOWY, ANIM_TYPE_LOWY,
ANIM_TYPE_LOWY, ANIM_TYPE_LOWY, ANIM_TYPE_LOWY, ANIM_TYPE_LOWY, ANIM_TYPE_LOWY,
ANIM_TYPE_LOWY, ANIM_TYPE_NONE, ANIM_TYPE_NONE, ANIM_TYPE_LOWY, ANIM_TYPE_FEET,
ANIM_TYPE_FEET, ANIM_TYPE_LOWY, ANIM_TYPE_LOWY, ANIM_TYPE_NONE, ANIM_TYPE_NONE,
ANIM_TYPE_NONE, ANIM_TYPE_LOWY, ANIM_TYPE_LOWY, ANIM_TYPE_LOWY, ANIM_TYPE_LOWY,
ANIM_TYPE_LOWY, ANIM_TYPE_LOWY, ANIM_TYPE_LOWY, ANIM_TYPE_LOWY, ANIM_TYPE_LOWY,
ANIM_TYPE_LOWY, ANIM_TYPE_LOWY, ANIM_TYPE_LOWY, ANIM_TYPE_NONE, ANIM_TYPE_NONE,
ANIM_TYPE_NONE, ANIM_TYPE_NONE, ANIM_TYPE_NONE, ANIM_TYPE_LOWY, ANIM_TYPE_LOWY,
ANIM_TYPE_LOWY, ANIM_TYPE_LOWY, ANIM_TYPE_NONE, ANIM_TYPE_LOWY, ANIM_TYPE_NONE,
ANIM_TYPE_NONE, ANIM_TYPE_FEET, ANIM_TYPE_LOWY, ANIM_TYPE_LOWY, ANIM_TYPE_LOWY,
ANIM_TYPE_LOWY, ANIM_TYPE_FEET, ANIM_TYPE_LOWY, ANIM_TYPE_NONE, ANIM_TYPE_LOWY,
ANIM_TYPE_LOWY, ANIM_TYPE_LOWY, ANIM_TYPE_LOWY, ANIM_TYPE_NONE, ANIM_TYPE_NONE,
ANIM_TYPE_NONE, ANIM_TYPE_NONE, ANIM_TYPE_NONE, ANIM_TYPE_NONE, ANIM_TYPE_NONE,
ANIM_TYPE_NONE, ANIM_TYPE_NONE, ANIM_TYPE_NONE, ANIM_TYPE_NONE, ANIM_TYPE_NONE,
ANIM_TYPE_NONE, ANIM_TYPE_NONE, ANIM_TYPE_NONE, ANIM_TYPE_NONE, ANIM_TYPE_NONE,
ANIM_TYPE_NONE, ANIM_TYPE_NONE, ANIM_TYPE_NONE, ANIM_TYPE_NONE, ANIM_TYPE_NONE,
ANIM_TYPE_NONE, ANIM_TYPE_LOWY, ANIM_TYPE_LOWY, ANIM_TYPE_LOWY, ANIM_TYPE_LOWY,
ANIM_TYPE_LOWY, ANIM_TYPE_LOWY, ANIM_TYPE_LOWY, ANIM_TYPE_LOWY, ANIM_TYPE_LOWY,
ANIM_TYPE_LOWY, ANIM_TYPE_NONE, ANIM_TYPE_LOWY, ANIM_TYPE_NONE, ANIM_TYPE_LOWY,
ANIM_TYPE_LOWY, ANIM_TYPE_LOWY, ANIM_TYPE_LOWY, ANIM_TYPE_HAND, ANIM_TYPE_HAND,
ANIM_TYPE_LOWY, ANIM_TYPE_LOWY, ANIM_TYPE_FEET, ANIM_TYPE_LOWY, ANIM_TYPE_LOWY,
ANIM_TYPE_LOWY, ANIM_TYPE_LOWY, ANIM_TYPE_NONE, ANIM_TYPE_NONE,
};
struct Character* get_character(struct MarioState* m) {
return (m == NULL || m->character == NULL)
? &gCharacters[CT_MARIO]
: m->character;
}
static s32 get_character_sound(struct MarioState* m, enum CharacterSound characterSound) {
if (m == NULL || m->marioObj == NULL) { return 0; }
struct Character* character = ((m == NULL || m->character == NULL) ? &gCharacters[CT_MARIO] : m->character);
switch (characterSound) {
case CHAR_SOUND_YAH_WAH_HOO: return character->soundYahWahHoo;
case CHAR_SOUND_HOOHOO: return character->soundHoohoo;
case CHAR_SOUND_YAHOO: return character->soundYahoo;
case CHAR_SOUND_UH: return character->soundUh;
case CHAR_SOUND_HRMM: return character->soundHrmm;
case CHAR_SOUND_WAH2: return character->soundWah2;
case CHAR_SOUND_WHOA: return character->soundWhoa;
case CHAR_SOUND_EEUH: return character->soundEeuh;
case CHAR_SOUND_ATTACKED: return character->soundAttacked;
case CHAR_SOUND_OOOF: return character->soundOoof;
case CHAR_SOUND_OOOF2: return character->soundOoof2;
case CHAR_SOUND_HERE_WE_GO: return character->soundHereWeGo;
case CHAR_SOUND_YAWNING: return character->soundYawning;
case CHAR_SOUND_SNORING1: return character->soundSnoring1;
case CHAR_SOUND_SNORING2: return character->soundSnoring2;
case CHAR_SOUND_WAAAOOOW: return character->soundWaaaooow;
case CHAR_SOUND_HAHA: return character->soundHaha;
case CHAR_SOUND_HAHA_2: return character->soundHaha_2;
case CHAR_SOUND_UH2: return character->soundUh2;
case CHAR_SOUND_UH2_2: return character->soundUh2_2;
case CHAR_SOUND_ON_FIRE: return character->soundOnFire;
case CHAR_SOUND_DYING: return character->soundDying;
case CHAR_SOUND_PANTING_COLD: return character->soundPantingCold;
case CHAR_SOUND_PANTING: return character->soundPanting;
case CHAR_SOUND_COUGHING1: return character->soundCoughing1;
case CHAR_SOUND_COUGHING2: return character->soundCoughing2;
case CHAR_SOUND_COUGHING3: return character->soundCoughing3;
case CHAR_SOUND_PUNCH_YAH: return character->soundPunchYah;
case CHAR_SOUND_PUNCH_HOO: return character->soundPunchHoo;
case CHAR_SOUND_MAMA_MIA: return character->soundMamaMia;
case CHAR_SOUND_GROUND_POUND_WAH: return character->soundGroundPoundWah;
case CHAR_SOUND_DROWNING: return character->soundDrowning;
case CHAR_SOUND_PUNCH_WAH: return character->soundPunchWah;
case CHAR_SOUND_YAHOO_WAHA_YIPPEE: return character->soundYahooWahaYippee;
case CHAR_SOUND_DOH: return character->soundDoh;
case CHAR_SOUND_GAME_OVER: return character->soundGameOver;
case CHAR_SOUND_HELLO: return character->soundHello;
case CHAR_SOUND_PRESS_START_TO_PLAY: return character->soundPressStartToPlay;
case CHAR_SOUND_TWIRL_BOUNCE: return character->soundTwirlBounce;
case CHAR_SOUND_SNORING3: return character->soundSnoring3;
case CHAR_SOUND_SO_LONGA_BOWSER: return character->soundSoLongaBowser;
case CHAR_SOUND_IMA_TIRED: return character->soundImaTired;
default: return 0;
}
}
void play_character_sound(struct MarioState* m, enum CharacterSound characterSound) {
s32 sound = get_character_sound(m, characterSound);
if (sound == 0) { return; }
struct Character* character = get_character(m);
play_sound_with_freq_scale(sound, m->marioObj->header.gfx.cameraToObject, character->soundFreqScale);
}
void play_character_sound_offset(struct MarioState* m, enum CharacterSound characterSound, u32 offset) {
s32 sound = get_character_sound(m, characterSound);
if (sound == 0) { return; }
struct Character* character = get_character(m);
play_sound_with_freq_scale(sound + offset, m->marioObj->header.gfx.cameraToObject, character->soundFreqScale);
}
void play_character_sound_if_no_flag(struct MarioState* m, enum CharacterSound characterSound, u32 flags) {
if ((m->flags & flags) == 0) {
play_character_sound(m, characterSound);
m->flags |= flags;
}
}
f32 get_character_anim_offset(struct MarioState* m) {
if (m == NULL || m->marioObj == NULL) { return 0; }
struct Object* marioObj = m->marioObj;
struct Character* c = get_character(m);
if (!c->animOffsetEnabled) { return 0; }
s32 animID = marioObj->header.gfx.unk38.animID;
if (animID < 0 || animID >= ANIM_TYPE_MAX) { return 0; }
switch (sAnimTypes[animID]) {
case ANIM_TYPE_LOWY:
if (m->minimumBoneY < c->animOffsetLowYPoint) {
return -(m->minimumBoneY - c->animOffsetLowYPoint);
}
break;
case ANIM_TYPE_FEET:
return c->animOffsetFeet;
break;
case ANIM_TYPE_HAND:
return c->animOffsetHand;
break;
}
return 0;
}
void update_character_anim_offset(struct MarioState* m) {
if (m == NULL || m->marioObj == NULL) { return; }
struct Object* marioObj = m->marioObj;
struct Character* c = get_character(m);
if (!c->animOffsetEnabled) { return; }
f32 targetOffset = get_character_anim_offset(m);
// smooth
f32 alpha = (fabs(targetOffset - m->curAnimOffset) / 80.0f) + 0.5f;
alpha = (alpha + 0.5f) / 2.0f;
alpha *= alpha;
m->curAnimOffset = (m->curAnimOffset * alpha) + (targetOffset * (1.0f - alpha));
if (m->curAnimOffset > 40) { m->curAnimOffset = 40; }
if (m->curAnimOffset < -40) { m->curAnimOffset = -40; }
//s32 animID = marioObj->header.gfx.unk38.animID;
//LOG_INFO(">>> [%d] : %d :: %f, %f", animID, sAnimTypes[animID], m->curAnimOffset, m->minimumBoneY);
marioObj->header.gfx.pos[1] = m->pos[1] + m->curAnimOffset;
marioObj->header.gfx.node.flags |= GRAPH_RENDER_PLAYER;
}