Merge branch 'testing-out-item-replacement' into melon-randomizer

This commit is contained in:
MelonSpeedruns 2022-05-30 14:01:16 -04:00 committed by GitHub
commit 96ff3f8a23
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
6 changed files with 312 additions and 39 deletions

View file

@ -105,8 +105,7 @@ static void set_fullscreen(bool on, bool call_callback) {
window_width = mode.w; window_width = mode.w;
window_height = mode.h; window_height = mode.h;
SDL_ShowCursor(false); SDL_ShowCursor(false);
} } else {
else {
window_width = DESIRED_SCREEN_WIDTH; window_width = DESIRED_SCREEN_WIDTH;
window_height = DESIRED_SCREEN_HEIGHT; window_height = DESIRED_SCREEN_HEIGHT;
} }
@ -210,8 +209,7 @@ static void gfx_sdl_get_dimensions(uint32_t* width, uint32_t* height) {
static int translate_scancode(int scancode) { static int translate_scancode(int scancode) {
if (scancode < 512) { if (scancode < 512) {
return inverted_scancode_table[scancode]; return inverted_scancode_table[scancode];
} } else {
else {
return 0; return 0;
} }
} }
@ -241,26 +239,27 @@ static void gfx_sdl_handle_events(void) {
switch (event.type) { switch (event.type) {
#ifndef TARGET_WEB #ifndef TARGET_WEB
// Scancodes are broken in Emscripten SDL2: https://bugzilla.libsdl.org/show_bug.cgi?id=3259 // Scancodes are broken in Emscripten SDL2: https://bugzilla.libsdl.org/show_bug.cgi?id=3259
case SDL_KEYDOWN: case SDL_KEYDOWN:
gfx_sdl_onkeydown(event.key.keysym.scancode); gfx_sdl_onkeydown(event.key.keysym.scancode);
break; break;
case SDL_KEYUP: case SDL_KEYUP:
gfx_sdl_onkeyup(event.key.keysym.scancode); gfx_sdl_onkeyup(event.key.keysym.scancode);
break; break;
#endif #endif
case SDL_WINDOWEVENT: case SDL_WINDOWEVENT:
if (event.window.event == SDL_WINDOWEVENT_SIZE_CHANGED) { if (event.window.event == SDL_WINDOWEVENT_SIZE_CHANGED) {
window_width = event.window.data1; window_width = event.window.data1;
window_height = event.window.data2; window_height = event.window.data2;
} }
break; break;
case SDL_DROPFILE: case SDL_DROPFILE:
#ifndef __linux__ #ifndef __linux__
LoadItemLocations(event.drop.file); LoadItemLocations(event.drop.file);
#endif #endif
break; break;
case SDL_QUIT: case SDL_QUIT:
exit(0); SDL_Quit(); // bandaid fix for linux window closing issue
exit(0);
} }
} }
} }
@ -346,4 +345,4 @@ struct GfxWindowManagerAPI gfx_sdl = {
gfx_sdl_get_detected_hz gfx_sdl_get_detected_hz
}; };
#endif #endif

View file

@ -448,11 +448,17 @@ namespace SohImGui {
EnhancementRadioButton("German", "gLanguages", 1); EnhancementRadioButton("German", "gLanguages", 1);
EnhancementRadioButton("French", "gLanguages", 2); EnhancementRadioButton("French", "gLanguages", 2);
*/ */
std::string make_invisible = "##";
make_invisible += text;
make_invisible += cvarName;
int val = CVar_GetS32(cvarName, 0); int val = CVar_GetS32(cvarName, 0);
if (ImGui::RadioButton(text, id == val)) { if (ImGui::RadioButton(make_invisible.c_str(), id == val)) {
CVar_SetS32(cvarName, id); CVar_SetS32(cvarName, id);
needs_save = true; needs_save = true;
} }
ImGui::SameLine();
ImGui::Text("%s", text);
} }
void EnhancementCheckbox(const char* text, const char* cvarName) void EnhancementCheckbox(const char* text, const char* cvarName)
@ -856,9 +862,48 @@ namespace SohImGui {
if (ImGui::BeginMenu("Graphics")) if (ImGui::BeginMenu("Graphics"))
{ {
if (ImGui::BeginMenu("Animated Link in Pause Menu")) {
ImGui::Text("Rotation");
EnhancementRadioButton("Disabled", "gPauseLiveRotation", 0);
EnhancementRadioButton("Rotate Link with D-pad", "gPauseLiveRotation", 1);
Tooltip("Allow you to rotate Link on the Equipment menu with the DPAD\nUse DPAD-Up or DPAD-Down to reset Link's rotation");
EnhancementRadioButton("Rotate Link with C-buttons", "gPauseLiveRotation", 2);
Tooltip("Allow you to rotate Link on the Equipment menu with the C-buttons\nUse C-Up or C-Down to reset Link's rotation");
if (CVar_GetS32("gPauseLiveRotation", 0) != 0) {
EnhancementSliderInt("Rotation Speed: %d", "##MinRotationSpeed", "gPauseLiveLinkRotationSpeed", 1, 20, "");
}
ImGui::Separator();
ImGui::Text("Static loop");
EnhancementRadioButton("Disabled", "gPauseLiveLink", 0);
EnhancementRadioButton("Idle (standing)", "gPauseLiveLink", 1);
EnhancementRadioButton("Idle (look around)", "gPauseLiveLink", 2);
EnhancementRadioButton("Idle (belt)", "gPauseLiveLink", 3);
EnhancementRadioButton("Idle (shield)", "gPauseLiveLink", 4);
EnhancementRadioButton("Idle (test sword)", "gPauseLiveLink", 5);
EnhancementRadioButton("Idle (yawn)", "gPauseLiveLink", 6);
EnhancementRadioButton("Battle Stance", "gPauseLiveLink", 7);
EnhancementRadioButton("Walking (no shield)", "gPauseLiveLink", 8);
EnhancementRadioButton("Walking (holding shield)", "gPauseLiveLink", 9);
EnhancementRadioButton("Running (no shield)", "gPauseLiveLink", 10);
EnhancementRadioButton("Running (holding shield)", "gPauseLiveLink", 11);
EnhancementRadioButton("Hand on hip", "gPauseLiveLink", 12);
EnhancementRadioButton("Spin attack charge", "gPauseLiveLink", 13);
EnhancementRadioButton("Look at hand", "gPauseLiveLink", 14);
ImGui::Separator();
ImGui::Text("Randomize");
EnhancementRadioButton("Random", "gPauseLiveLink", 15);
Tooltip("Randomize the animation played each time you open the menu");
EnhancementRadioButton("Random cycle", "gPauseLiveLink", 16);
Tooltip("andomize the animation played on hte menu after a certain time");
if (CVar_GetS32("gPauseLiveLink", 0) >= 16) {
EnhancementSliderInt("Frame to wait: %d", "##MinFrameCount", "gMinFrameCount", 1, 1000, "");
}
ImGui::EndMenu();
}
EnhancementCheckbox("N64 Mode", "gN64Mode"); EnhancementCheckbox("N64 Mode", "gN64Mode");
Tooltip("Sets aspect ratio to 4:3 and lowers resolution to 240p, the N64's native resolution"); Tooltip("Sets aspect ratio to 4:3 and lowers resolution to 240p, the N64's native resolution");
EnhancementCheckbox("Animated Link in Pause Menu", "gPauseLiveLink");
EnhancementCheckbox("Enable 3D Dropped items", "gNewDrops"); EnhancementCheckbox("Enable 3D Dropped items", "gNewDrops");
EnhancementCheckbox("Dynamic Wallet Icon", "gDynamicWalletIcon"); EnhancementCheckbox("Dynamic Wallet Icon", "gDynamicWalletIcon");
Tooltip("Changes the rupee in the wallet icon to match the wallet size you currently have"); Tooltip("Changes the rupee in the wallet icon to match the wallet size you currently have");

View file

@ -921,6 +921,29 @@ GetItemID Randomizer::GetItemFromGet(RandomizerGet randoGet, GetItemID ogItemId)
case SMALL_KEY_THIEVES_HIDEOUT: case SMALL_KEY_THIEVES_HIDEOUT:
case SMALL_KEY_WATER_TEMPLE: case SMALL_KEY_WATER_TEMPLE:
return GI_KEY_SMALL; return GI_KEY_SMALL;
// todo implement dungeon-specific maps/compasses
case MAP_DEKU_TREE:
case MAP_DODONGOS_CAVERN:
case MAP_JABU_JABUS_BELLY:
case MAP_FOREST_TEMPLE:
case MAP_FIRE_TEMPLE:
case MAP_WATER_TEMPLE:
case MAP_SPIRIT_TEMPLE:
case MAP_SHADOW_TEMPLE:
case MAP_BOTTOM_OF_THE_WELL:
case MAP_ICE_CAVERN:
return GI_MAP;
case COMPASS_DEKU_TREE:
case COMPASS_DODONGOS_CAVERN:
case COMPASS_JABU_JABUS_BELLY:
case COMPASS_FOREST_TEMPLE:
case COMPASS_FIRE_TEMPLE:
case COMPASS_WATER_TEMPLE:
case COMPASS_SPIRIT_TEMPLE:
case COMPASS_SHADOW_TEMPLE:
case COMPASS_BOTTOM_OF_THE_WELL:
case COMPASS_ICE_CAVERN:
return GI_COMPASS;
case MAGIC_METER: case MAGIC_METER:
switch (gSaveContext.magicLevel) { switch (gSaveContext.magicLevel) {
case 0: case 0:
@ -1136,6 +1159,8 @@ RandomizerCheck Randomizer::GetCheckFromActor(s16 sceneNum, s16 actorId, s16 act
return DMC_UPPER_GROTTO_CHEST; return DMC_UPPER_GROTTO_CHEST;
case 22985: case 22985:
return ZR_OPEN_GROTTO_CHEST; return ZR_OPEN_GROTTO_CHEST;
case 262:
return HF_TEKTITE_GROTTO_FREESTANDING_POH;
} }
case 64: case 64:
switch(actorParams) { switch(actorParams) {
@ -1153,9 +1178,15 @@ RandomizerCheck Randomizer::GetCheckFromActor(s16 sceneNum, s16 actorId, s16 act
return GRAVEYARD_ROYAL_FAMILYS_TOMB_CHEST; return GRAVEYARD_ROYAL_FAMILYS_TOMB_CHEST;
} }
case 72: case 72:
// todo make sure dampe gives the PoH when the chest is opened
// default logic seems to be give PoH when hookshot in inventory
switch(actorParams) { switch(actorParams) {
case 4352: case 4352:
return GRAVEYARD_HOOKSHOT_CHEST; return GRAVEYARD_HOOKSHOT_CHEST;
case 262:
return KAK_WINDMILL_FREESTANDING_POH;
case 1798:
return GRAVEYARD_DAMPE_RACE_FREESTANDING_POH;
} }
case 96: case 96:
switch(actorParams) { switch(actorParams) {
@ -1172,6 +1203,8 @@ RandomizerCheck Randomizer::GetCheckFromActor(s16 sceneNum, s16 actorId, s16 act
return GC_MAZE_RIGHT_CHEST; return GC_MAZE_RIGHT_CHEST;
case 23202: case 23202:
return GC_MAZE_CENTER_CHEST; return GC_MAZE_CENTER_CHEST;
case 7942:
return GC_POT_FREESTANDING_POH;
} }
case 88: case 88:
switch(actorParams) { switch(actorParams) {
@ -1182,6 +1215,10 @@ RandomizerCheck Randomizer::GetCheckFromActor(s16 sceneNum, s16 actorId, s16 act
switch(actorParams) { switch(actorParams) {
case 23200: case 23200:
return GV_CHEST; return GV_CHEST;
case 262:
return GV_WATERFALL_FREESTANDING_POH;
case 518:
return GV_CRATE_FREESTANDING_POH;
} }
case 93: case 93:
switch(actorParams) { switch(actorParams) {
@ -1422,6 +1459,8 @@ RandomizerCheck Randomizer::GetCheckFromActor(s16 sceneNum, s16 actorId, s16 act
return SPIRIT_TEMPLE_SILVER_GAUNTLETS_CHEST; return SPIRIT_TEMPLE_SILVER_GAUNTLETS_CHEST;
case 13673: case 13673:
return SPIRIT_TEMPLE_MIRROR_SHIELD_CHEST; return SPIRIT_TEMPLE_MIRROR_SHIELD_CHEST;
case 3334:
return COLOSSUS_FREESTANDING_POH;
} }
case 9: case 9:
switch(actorParams) { switch(actorParams) {
@ -1431,6 +1470,8 @@ RandomizerCheck Randomizer::GetCheckFromActor(s16 sceneNum, s16 actorId, s16 act
return ICE_CAVERN_COMPASS_CHEST; return ICE_CAVERN_COMPASS_CHEST;
case 5570: case 5570:
return ICE_CAVERN_IRON_BOOTS_CHEST; return ICE_CAVERN_IRON_BOOTS_CHEST;
case 262:
return ICE_CAVERN_FREESTANDING_POH;
} }
case 11: case 11:
switch(actorParams) { switch(actorParams) {
@ -1477,6 +1518,78 @@ RandomizerCheck Randomizer::GetCheckFromActor(s16 sceneNum, s16 actorId, s16 act
case 2860: case 2860:
return GERUDO_TRAINING_GROUND_MAZE_PATH_FINAL_CHEST; return GERUDO_TRAINING_GROUND_MAZE_PATH_FINAL_CHEST;
} }
case 13:
switch(actorParams) {
case 30857:
return GANONS_CASTLE_FOREST_TRIAL_CHEST;
case 24455:
return GANONS_CASTLE_WATER_TRIAL_LEFT_CHEST;
case 22790:
return GANONS_CASTLE_WATER_TRIAL_RIGHT_CHEST;
case 22664:
return GANONS_CASTLE_SHADOW_TRIAL_FRONT_CHEST;
case 14021:
return GANONS_CASTLE_SHADOW_TRIAL_GOLDEN_GAUNTLETS_CHEST;
case 22668:
return GANONS_CASTLE_LIGHT_TRIAL_FIRST_LEFT_CHEST;
case 24459:
return GANONS_CASTLE_LIGHT_TRIAL_SECOND_LEFT_CHEST;
case 22797:
return GANONS_CASTLE_LIGHT_TRIAL_THIRD_LEFT_CHEST;
case 24462:
return GANONS_CASTLE_LIGHT_TRIAL_FIRST_RIGHT_CHEST;
case 22890:
return GANONS_CASTLE_LIGHT_TRIAL_SECOND_RIGHT_CHEST;
case 24463:
return GANONS_CASTLE_LIGHT_TRIAL_THIRD_RIGHT_CHEST;
case 30800:
return GANONS_CASTLE_LIGHT_TRIAL_INVISIBLE_ENEMIES_CHEST;
case -30639:
return GANONS_CASTLE_LIGHT_TRIAL_LULLABY_CHEST;
case -29326:
return GANONS_CASTLE_SPIRIT_TRIAL_CRYSTAL_SWITCH_CHEST;
case 26964:
return GANONS_CASTLE_SPIRIT_TRIAL_INVISIBLE_CHEST;
}
case 10:
switch(actorParams) {
case 10219:
return GANONS_TOWER_BOSS_KEY_CHEST;
}
case 87:
switch(actorParams) {
case 7686:
return LH_FREESTANDING_POH;
}
case 76:
switch(actorParams) {
case 262:
return LLR_FREESTANDING_POH;
}
case 55:
switch(actorParams) {
case 262:
return KAK_IMPAS_HOUSE_FREESTANDING_POH;
}
case 83:
switch(actorParams) {
case 1030:
return GRAVEYARD_FREESTANDING_POH;
}
case 97:
switch(actorParams) {
case 2054:
return DMC_VOLCANO_FREESTANDING_POH;
case 518:
return DMC_WALL_FREESTANDING_POH;
}
case 89:
switch(actorParams) {
case 5126:
return ZF_BOTTOM_FREESTANDING_POH;
case 262:
return ZF_ICEBERG_FREESTANDING_POH;
}
} }
return UNKNOWN_CHECK; return UNKNOWN_CHECK;

View file

@ -1661,26 +1661,118 @@ void func_80091A24(GlobalContext* globalCtx, void* seg04, void* seg06, SkelAnime
CLOSE_DISPS(globalCtx->state.gfxCtx, "../z_player_lib.c", 3288); CLOSE_DISPS(globalCtx->state.gfxCtx, "../z_player_lib.c", 3288);
} }
uintptr_t SelectedAnim = 0; // Current Animaiton on the menu
s16 EquipedStance; // Link's current mode (Two handed, One handed...)
s16 FrameCountSinceLastAnim = 0; // Time since last animation
s16 MinFrameCount; // Frame to wait before checking if we need to change the animation
void func_8009214C(GlobalContext* globalCtx, u8* segment, SkelAnime* skelAnime, Vec3f* pos, Vec3s* rot, f32 scale, void func_8009214C(GlobalContext* globalCtx, u8* segment, SkelAnime* skelAnime, Vec3f* pos, Vec3s* rot, f32 scale,
s32 sword, s32 tunic, s32 shield, s32 boots) { s32 sword, s32 tunic, s32 shield, s32 boots) {
Input* p1Input = &globalCtx->state.input[0];
Vec3f eye = { 0.0f, 0.0f, -400.0f }; Vec3f eye = { 0.0f, 0.0f, -400.0f };
Vec3f at = { 0.0f, 0.0f, 0.0f }; Vec3f at = { 0.0f, 0.0f, 0.0f };
Vec3s* destTable; Vec3s* destTable;
Vec3s* srcTable; Vec3s* srcTable;
s32 i; s32 i;
bool canswitchrnd = false;
s16 SelectedMode = CVar_GetS32("gPauseLiveLink", 1);
MinFrameCount = CVar_GetS32("gMinFrameCount", 200);
gSegments[4] = VIRTUAL_TO_PHYSICAL(segment + 0x3800); gSegments[4] = VIRTUAL_TO_PHYSICAL(segment + 0x3800);
gSegments[6] = VIRTUAL_TO_PHYSICAL(segment + 0x8800); gSegments[6] = VIRTUAL_TO_PHYSICAL(segment + 0x8800);
if (CVar_GetS32("gPauseLiveLink", 0) || CVar_GetS32("gPauseTriforce", 0)) { uintptr_t* PauseMenuAnimSet[15][4] = {
uintptr_t anim = gPlayerAnim_003238; // idle { 0, 0, 0, 0 }, // 0 = none
// IDLE // Two Handed // No shield // Kid Hylian Shield
{ gPlayerAnim_003238, gPlayerAnim_002BE0, gPlayerAnim_003240, gPlayerAnim_003240 }, // Idle
{ gPlayerAnim_003200, gPlayerAnim_003200, gPlayerAnim_003200, gPlayerAnim_003200 }, // Idle look around
{ gPlayerAnim_0033E0, gPlayerAnim_0033E0, gPlayerAnim_0033E0, gPlayerAnim_0033E0 }, // Idle Belt
{ gPlayerAnim_003418, gPlayerAnim_003418, gPlayerAnim_003418, gPlayerAnim_003418 }, // Idle shield adjust
{ gPlayerAnim_003420, gPlayerAnim_003428, gPlayerAnim_003420, gPlayerAnim_003420 }, // Idle test sword
{ gPlayerAnim_0033F0, gPlayerAnim_0033F0, gPlayerAnim_0033F0, gPlayerAnim_0033F0 }, // Idle yawn
{ gPlayerAnim_0025D0, gPlayerAnim_002BD0, gPlayerAnim_0025D0, gPlayerAnim_0025D0 }, // Battle Stance
{ gPlayerAnim_003290, gPlayerAnim_002BF8, gPlayerAnim_003290, gPlayerAnim_003290 }, // Walking (No shield)
{ gPlayerAnim_003268, gPlayerAnim_002BF8, gPlayerAnim_003268, gPlayerAnim_003268 }, // Walking (Holding shield)
{ gPlayerAnim_003138, gPlayerAnim_002B40, gPlayerAnim_003138, gPlayerAnim_003138 }, // Running (No shield)
{ gPlayerAnim_003140, gPlayerAnim_002B40, gPlayerAnim_003140, gPlayerAnim_003140 }, // Running (Holding shield)
{ gPlayerAnim_0031A8, gPlayerAnim_0031A8, gPlayerAnim_0031A8, gPlayerAnim_0031A8 }, // Hand on hip
{ gPlayerAnim_002AF0, gPlayerAnim_002928, gPlayerAnim_002AF0, gPlayerAnim_002AF0 }, // Spin Charge
{ gPlayerAnim_002820, gPlayerAnim_002820, gPlayerAnim_002820, gPlayerAnim_002820 }, // Look at hand
};
s16 AnimArraySize = ARRAY_COUNT(PauseMenuAnimSet);
if (CUR_EQUIP_VALUE(EQUIP_SWORD) >= 3) if (CVar_GetS32("gPauseLiveLink", !0) || CVar_GetS32("gPauseTriforce", 0)) {
anim = gPlayerAnim_002BE0; // Two Handed Anim uintptr_t anim = 0; // Initialise anim
else if (CUR_EQUIP_VALUE(EQUIP_SHIELD) == 0)
anim = gPlayerAnim_003240; if (CUR_EQUIP_VALUE(EQUIP_SWORD) >= 3) {
else if (CUR_EQUIP_VALUE(EQUIP_SHIELD) == 2 && LINK_AGE_IN_YEARS == YEARS_CHILD) EquipedStance = 1;
anim = gPlayerAnim_003240; } else if (CUR_EQUIP_VALUE(EQUIP_SHIELD) == 0) {
EquipedStance = 2;
} else if (CUR_EQUIP_VALUE(EQUIP_SHIELD) == 2 && LINK_AGE_IN_YEARS == YEARS_CHILD) {
EquipedStance = 3;
} else {
// Link is idle so revert to 0
EquipedStance = 0;
}
if (SelectedMode == 16) {
// Apply Random function
s16 SwitchAtFrame = 0;
s16 CurAnimDuration = 0;
if (FrameCountSinceLastAnim == 0) {
// When opening Kaleido this will be passed one time
SelectedAnim = rand() % (AnimArraySize - 0);
if (SelectedAnim == 0) {
// prevent loading 0 that would result to a crash.
SelectedAnim = 1;
}
} else if (FrameCountSinceLastAnim >= 1) {
SwitchAtFrame = Animation_GetLastFrame(PauseMenuAnimSet[SelectedAnim][EquipedStance]);
CurAnimDuration = Animation_GetLastFrame(PauseMenuAnimSet[SelectedAnim][EquipedStance]);
if (SwitchAtFrame < MinFrameCount) {
// Animation frame count is lower than minimal wait time then we wait for another round.
// This will be looped to always add current animation time if that still lower than minimum time
while (SwitchAtFrame < MinFrameCount) {
SwitchAtFrame = SwitchAtFrame + CurAnimDuration;
}
} else if (CurAnimDuration >= MinFrameCount) {
// Since we have more (or same) animation time than min duration we set the wait time to animation
// time.
SwitchAtFrame = CurAnimDuration;
}
if (FrameCountSinceLastAnim >= SwitchAtFrame) {
SelectedAnim = rand() % (AnimArraySize - 0);
if (SelectedAnim == 0) {
// prevent loading 0 that would result to a crash.
SelectedAnim = 1;
}
FrameCountSinceLastAnim = 1;
}
anim = PauseMenuAnimSet[SelectedAnim][EquipedStance];
}
FrameCountSinceLastAnim++;
} else if (SelectedMode == 15) {
// When opening Kaleido this will be passed one time
if (FrameCountSinceLastAnim < 1) {
SelectedAnim = rand() % (AnimArraySize - 0);
FrameCountSinceLastAnim++;
if (SelectedAnim == 0) {
// prevent loading 0 that would result to a crash.
SelectedAnim = 1;
}
FrameCountSinceLastAnim = 1;
}
if (CHECK_BTN_ALL(p1Input->press.button, BTN_B) || CHECK_BTN_ALL(p1Input->press.button, BTN_START)) {
FrameCountSinceLastAnim = 0;
}
anim = PauseMenuAnimSet[SelectedAnim][EquipedStance];
} else if (SelectedMode < 16) {
// Not random so we place our CVar as SelectedAnim
SelectedAnim = SelectedMode;
anim = PauseMenuAnimSet[SelectedAnim][EquipedStance];
}
anim = PauseMenuAnimSet[SelectedAnim][EquipedStance];
//anim = gPlayerAnim_003428; // Use for biggoron sword? //anim = gPlayerAnim_003428; // Use for biggoron sword?

View file

@ -214,7 +214,7 @@ void func_809DF778(EnCow* this, GlobalContext* globalCtx) {
this->actor.parent = NULL; this->actor.parent = NULL;
this->actionFunc = func_809DF730; this->actionFunc = func_809DF730;
} else { } else {
func_8002F434(&this->actor, globalCtx, GID_MEDALLION_FIRE, 10000.0f, 100.0f); func_8002F434(&this->actor, globalCtx, GI_MILK, 10000.0f, 100.0f);
} }
} }

View file

@ -89,11 +89,17 @@ void KaleidoScope_DrawEquipmentImage(GlobalContext* globalCtx, void* source, u32
CLOSE_DISPS(globalCtx->state.gfxCtx, "../z_kaleido_equipment.c", 122); CLOSE_DISPS(globalCtx->state.gfxCtx, "../z_kaleido_equipment.c", 122);
} }
Vec3s link_kaleido_rot = { 0, 32300, 0 }; // Default rotation link face us.
void KaleidoScope_DrawPlayerWork(GlobalContext* globalCtx) { void KaleidoScope_DrawPlayerWork(GlobalContext* globalCtx) {
PauseContext* pauseCtx = &globalCtx->pauseCtx; PauseContext* pauseCtx = &globalCtx->pauseCtx;
Vec3f pos; Vec3f pos;
Vec3s rot; //Vec3s rot; // Removed for not having it use din the function
f32 scale; f32 scale;
Input* input = &globalCtx->state.input[0];
s16 RotationSpeed = 150 * CVar_GetS32("gPauseLiveLinkRotationSpeed", 0);
bool AllowCRotation = (CVar_GetS32("gPauseLiveLinkRotation", 0) == 2) ? true : false;
bool AllowDPadRotation = (CVar_GetS32("gPauseLiveLinkRotation", 0) == 1) ? true : false;
if (LINK_AGE_IN_YEARS == YEARS_CHILD) { if (LINK_AGE_IN_YEARS == YEARS_CHILD) {
pos.x = 2.0f; pos.x = 2.0f;
@ -112,11 +118,29 @@ void KaleidoScope_DrawPlayerWork(GlobalContext* globalCtx) {
scale = 0.047f; scale = 0.047f;
} }
rot.y = 32300; link_kaleido_rot.x = link_kaleido_rot.z = 0;
rot.x = rot.z = 0;
if (AllowDPadRotation && CHECK_BTN_ALL(input->cur.button, BTN_DLEFT) ||
AllowCRotation && CHECK_BTN_ALL(input->cur.button, BTN_CLEFT)) {
link_kaleido_rot.y = link_kaleido_rot.y - RotationSpeed;
} else if (AllowDPadRotation && CHECK_BTN_ALL(input->cur.button, BTN_DRIGHT) ||
AllowCRotation && CHECK_BTN_ALL(input->cur.button, BTN_CRIGHT)) {
link_kaleido_rot.y = link_kaleido_rot.y + RotationSpeed;
}
if (AllowDPadRotation && CHECK_BTN_ALL(input->press.button, BTN_DUP) ||
AllowDPadRotation && CHECK_BTN_ALL(input->press.button, BTN_DDOWN)) {
link_kaleido_rot.y = 32300;
} else if (AllowCRotation && CHECK_BTN_ALL(input->press.button, BTN_CUP) ||
AllowCRotation && CHECK_BTN_ALL(input->press.button, BTN_CDOWN)) {
link_kaleido_rot.y = 32300;
}
link_kaleido_rot.x = 0;
extern int fbTest; extern int fbTest;
gsSPSetFB(globalCtx->state.gfxCtx->polyOpa.p++, fbTest); gsSPSetFB(globalCtx->state.gfxCtx->polyOpa.p++, fbTest);
func_8009214C(globalCtx, pauseCtx->playerSegment, &pauseCtx->playerSkelAnime, &pos, &rot, scale, func_8009214C(globalCtx, pauseCtx->playerSegment, &pauseCtx->playerSkelAnime, &pos, &link_kaleido_rot, scale,
CUR_EQUIP_VALUE(EQUIP_SWORD), CUR_EQUIP_VALUE(EQUIP_TUNIC) - 1, CUR_EQUIP_VALUE(EQUIP_SHIELD), CUR_EQUIP_VALUE(EQUIP_SWORD), CUR_EQUIP_VALUE(EQUIP_TUNIC) - 1, CUR_EQUIP_VALUE(EQUIP_SHIELD),
CUR_EQUIP_VALUE(EQUIP_BOOTS) - 1); CUR_EQUIP_VALUE(EQUIP_BOOTS) - 1);
gsSPResetFB(globalCtx->state.gfxCtx->polyOpa.p++); gsSPResetFB(globalCtx->state.gfxCtx->polyOpa.p++);