mirror of
https://github.com/HarbourMasters/Shipwright.git
synced 2024-12-21 23:58:51 -05:00
Merge pull request #1769 from HarbourMasters/develop-zhora
zhora -> dev
This commit is contained in:
commit
350315a5d1
@ -7,8 +7,8 @@ set(CMAKE_CXX_STANDARD 20 CACHE STRING "The C++ standard to use")
|
|||||||
set(CMAKE_OSX_DEPLOYMENT_TARGET "10.15" CACHE STRING "Minimum OS X deployment version" FORCE)
|
set(CMAKE_OSX_DEPLOYMENT_TARGET "10.15" CACHE STRING "Minimum OS X deployment version" FORCE)
|
||||||
|
|
||||||
project(Ship LANGUAGES C CXX
|
project(Ship LANGUAGES C CXX
|
||||||
VERSION 4.0.2)
|
VERSION 4.0.3)
|
||||||
set(PROJECT_BUILD_NAME "ZHORA CHARLIE" CACHE STRING "")
|
set(PROJECT_BUILD_NAME "ZHORA DELTA" CACHE STRING "")
|
||||||
set(PROJECT_TEAM "github.com/harbourmasters" CACHE STRING "")
|
set(PROJECT_TEAM "github.com/harbourmasters" CACHE STRING "")
|
||||||
|
|
||||||
set_property(DIRECTORY ${CMAKE_SOURCE_DIR} PROPERTY VS_STARTUP_PROJECT soh)
|
set_property(DIRECTORY ${CMAKE_SOURCE_DIR} PROPERTY VS_STARTUP_PROJECT soh)
|
||||||
|
@ -253,6 +253,13 @@ void gfx_direct3d_common_build_shader(char buf[4096], size_t& len, size_t& num_f
|
|||||||
append_line(buf, &len, "[RootSignature(RS)]");
|
append_line(buf, &len, "[RootSignature(RS)]");
|
||||||
}
|
}
|
||||||
append_line(buf, &len, "float4 PSMain(PSInput input, float4 screenSpace : SV_Position) : SV_TARGET {");
|
append_line(buf, &len, "float4 PSMain(PSInput input, float4 screenSpace : SV_Position) : SV_TARGET {");
|
||||||
|
|
||||||
|
// Reference approach to color wrapping as per GLideN64
|
||||||
|
// Return wrapped value of x in interval [low, high)
|
||||||
|
// Mod implementation of GLSL sourced from https://registry.khronos.org/OpenGL-Refpages/gl4/html/mod.xhtml
|
||||||
|
append_line(buf, &len, "#define MOD(x, y) ((x) - (y) * floor((x)/(y)))");
|
||||||
|
append_line(buf, &len, "#define WRAP(x, low, high) MOD((x)-(low), (high)-(low)) + (low)");
|
||||||
|
|
||||||
for (int i = 0; i < 2; i++) {
|
for (int i = 0; i < 2; i++) {
|
||||||
if (cc_features.used_textures[i]) {
|
if (cc_features.used_textures[i]) {
|
||||||
len += sprintf(buf + len, " float2 tc%d = input.uv%d;\r\n", i, i);
|
len += sprintf(buf + len, " float2 tc%d = input.uv%d;\r\n", i, i);
|
||||||
@ -294,11 +301,18 @@ void gfx_direct3d_common_build_shader(char buf[4096], size_t& len, size_t& num_f
|
|||||||
append_formula(buf, &len, cc_features.c[c], cc_features.do_single[c][0], cc_features.do_multiply[c][0], cc_features.do_mix[c][0], cc_features.opt_alpha, false, cc_features.opt_alpha);
|
append_formula(buf, &len, cc_features.c[c], cc_features.do_single[c][0], cc_features.do_multiply[c][0], cc_features.do_mix[c][0], cc_features.opt_alpha, false, cc_features.opt_alpha);
|
||||||
}
|
}
|
||||||
append_line(buf, &len, ";");
|
append_line(buf, &len, ";");
|
||||||
|
|
||||||
|
if (c == 0) {
|
||||||
|
append_str(buf, &len, "texel = WRAP(texel, -1.01, 1.01);");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (cc_features.opt_texture_edge && cc_features.opt_alpha) {
|
if (cc_features.opt_texture_edge && cc_features.opt_alpha) {
|
||||||
append_line(buf, &len, " if (texel.a > 0.19) texel.a = 1.0; else discard;");
|
append_line(buf, &len, " if (texel.a > 0.19) texel.a = 1.0; else discard;");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
append_str(buf, &len, "texel = WRAP(texel, -0.51, 1.51);");
|
||||||
|
append_str(buf, &len, "texel = clamp(texel, 0.0, 1.0);");
|
||||||
// TODO discard if alpha is 0?
|
// TODO discard if alpha is 0?
|
||||||
if (cc_features.opt_fog) {
|
if (cc_features.opt_fog) {
|
||||||
if (cc_features.opt_alpha) {
|
if (cc_features.opt_alpha) {
|
||||||
|
@ -414,6 +414,10 @@ static struct ShaderProgram* gfx_opengl_create_and_load_new_shader(uint64_t shad
|
|||||||
|
|
||||||
append_line(fs_buf, &fs_len, "void main() {");
|
append_line(fs_buf, &fs_len, "void main() {");
|
||||||
|
|
||||||
|
// Reference approach to color wrapping as per GLideN64
|
||||||
|
// Return wrapped value of x in interval [low, high)
|
||||||
|
append_line(fs_buf, &fs_len, "#define WRAP(x, low, high) mod((x)-(low), (high)-(low)) + (low)");
|
||||||
|
|
||||||
for (int i = 0; i < 2; i++) {
|
for (int i = 0; i < 2; i++) {
|
||||||
if (cc_features.used_textures[i]) {
|
if (cc_features.used_textures[i]) {
|
||||||
bool s = cc_features.clamp[i][0], t = cc_features.clamp[i][1];
|
bool s = cc_features.clamp[i][0], t = cc_features.clamp[i][1];
|
||||||
@ -448,7 +452,14 @@ static struct ShaderProgram* gfx_opengl_create_and_load_new_shader(uint64_t shad
|
|||||||
append_formula(fs_buf, &fs_len, cc_features.c[c], cc_features.do_single[c][0], cc_features.do_multiply[c][0], cc_features.do_mix[c][0], cc_features.opt_alpha, false, cc_features.opt_alpha);
|
append_formula(fs_buf, &fs_len, cc_features.c[c], cc_features.do_single[c][0], cc_features.do_multiply[c][0], cc_features.do_mix[c][0], cc_features.opt_alpha, false, cc_features.opt_alpha);
|
||||||
}
|
}
|
||||||
append_line(fs_buf, &fs_len, ";");
|
append_line(fs_buf, &fs_len, ";");
|
||||||
|
|
||||||
|
if (c == 0) {
|
||||||
|
append_str(fs_buf, &fs_len, "texel = WRAP(texel, -1.01, 1.01);");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
append_str(fs_buf, &fs_len, "texel = WRAP(texel, -0.51, 1.51);");
|
||||||
|
append_str(fs_buf, &fs_len, "texel = clamp(texel, 0.0, 1.0);");
|
||||||
// TODO discard if alpha is 0?
|
// TODO discard if alpha is 0?
|
||||||
if (cc_features.opt_fog)
|
if (cc_features.opt_fog)
|
||||||
{
|
{
|
||||||
|
@ -480,7 +480,7 @@ namespace Ship {
|
|||||||
WmApi = &gfx_dxgi_api;
|
WmApi = &gfx_dxgi_api;
|
||||||
#endif
|
#endif
|
||||||
#ifdef ENABLE_DX11
|
#ifdef ENABLE_DX11
|
||||||
RenderingApi = &gfx_direct3d11_api;
|
RenderingApi = &gfx_direct3d11_api;
|
||||||
WmApi = &gfx_dxgi_api;
|
WmApi = &gfx_dxgi_api;
|
||||||
#endif
|
#endif
|
||||||
#ifdef __WIIU__
|
#ifdef __WIIU__
|
||||||
|
@ -298,6 +298,8 @@ namespace GameMenuBar {
|
|||||||
CVar_SetS32("gCrouchStabHammerFix", 0);
|
CVar_SetS32("gCrouchStabHammerFix", 0);
|
||||||
// Fix all crouch stab
|
// Fix all crouch stab
|
||||||
CVar_SetS32("gCrouchStabFix", 0);
|
CVar_SetS32("gCrouchStabFix", 0);
|
||||||
|
// Fix Gerudo Warrior's clothing colors
|
||||||
|
CVar_SetS32("gGerudoWarriorClothingFix", 0);
|
||||||
|
|
||||||
// Red Ganon blood
|
// Red Ganon blood
|
||||||
CVar_SetS32("gRedGanonBlood", 0);
|
CVar_SetS32("gRedGanonBlood", 0);
|
||||||
@ -1084,6 +1086,8 @@ namespace GameMenuBar {
|
|||||||
UIWidgets::PaddedEnhancementCheckbox("Remove power crouch stab", "gCrouchStabFix", true, false);
|
UIWidgets::PaddedEnhancementCheckbox("Remove power crouch stab", "gCrouchStabFix", true, false);
|
||||||
UIWidgets::Tooltip("Make crouch stabbing always do the same damage as a regular slash");
|
UIWidgets::Tooltip("Make crouch stabbing always do the same damage as a regular slash");
|
||||||
}
|
}
|
||||||
|
UIWidgets::PaddedEnhancementCheckbox("Fix Gerudo Warrior's clothing colors", "gGerudoWarriorClothingFix", true, false);
|
||||||
|
UIWidgets::Tooltip("Prevent the Gerudo Warrior's clothes changing color when changing Link's tunic or using bombs in front of her");
|
||||||
|
|
||||||
ImGui::EndMenu();
|
ImGui::EndMenu();
|
||||||
}
|
}
|
||||||
|
@ -2502,13 +2502,6 @@ u8 Item_CheckObtainability(u8 item) {
|
|||||||
} else {
|
} else {
|
||||||
return ITEM_NONE;
|
return ITEM_NONE;
|
||||||
}
|
}
|
||||||
} else if ( gSaveContext.n64ddFlag &&
|
|
||||||
((item >= RG_GERUDO_FORTRESS_SMALL_KEY) && (item <= RG_GANONS_CASTLE_SMALL_KEY) ||
|
|
||||||
(item >= RG_FOREST_TEMPLE_BOSS_KEY) && (item <= RG_GANONS_CASTLE_BOSS_KEY) ||
|
|
||||||
(item >= RG_DEKU_TREE_MAP) && (item <= RG_ICE_CAVERN_MAP) ||
|
|
||||||
(item >= RG_DEKU_TREE_COMPASS) && (item <= RG_ICE_CAVERN_COMPASS))
|
|
||||||
) {
|
|
||||||
return ITEM_NONE;
|
|
||||||
} else if ((item == ITEM_KEY_BOSS) || (item == ITEM_COMPASS) || (item == ITEM_DUNGEON_MAP)) {
|
} else if ((item == ITEM_KEY_BOSS) || (item == ITEM_COMPASS) || (item == ITEM_DUNGEON_MAP)) {
|
||||||
return ITEM_NONE;
|
return ITEM_NONE;
|
||||||
} else if (item == ITEM_KEY_SMALL) {
|
} else if (item == ITEM_KEY_SMALL) {
|
||||||
|
@ -577,6 +577,14 @@ void func_808FD5F4(BossGanon2* this, GlobalContext* globalCtx) {
|
|||||||
BossGanon2_SetObjectSegment(this, globalCtx, OBJECT_GANON_ANIME3, false);
|
BossGanon2_SetObjectSegment(this, globalCtx, OBJECT_GANON_ANIME3, false);
|
||||||
func_8002DF54(globalCtx, &this->actor, 0x54);
|
func_8002DF54(globalCtx, &this->actor, 0x54);
|
||||||
this->unk_314 = 3;
|
this->unk_314 = 3;
|
||||||
|
|
||||||
|
// At this point, the actor has Ganon's skeleton but is still playing an animation for Ganondorf. This
|
||||||
|
// causes issues when trying to access the limb posotions as Ganon has more limbs than Ganondorf. When
|
||||||
|
// animating, data from past the end of the animation data is accessed. This is a hack solution so
|
||||||
|
// that we are at least playing an animation meant for Ganon. There is no visible change since Ganon is
|
||||||
|
// off-screen. There is actually 1 frame where he is visible, and in the vanilla game he is an
|
||||||
|
// explosion of limbs since half of them are in random positions from the junk data accessed.
|
||||||
|
Animation_PlayOnce(&this->skelAnime, &gGanonUncurlAndFlailAnim);
|
||||||
}
|
}
|
||||||
// fake, tricks the compiler into using stack the way we need it to
|
// fake, tricks the compiler into using stack the way we need it to
|
||||||
if (zero) {
|
if (zero) {
|
||||||
|
@ -249,28 +249,30 @@ s32 EnGe3_OverrideLimbDraw(GlobalContext* globalCtx, s32 limbIndex, Gfx** dList,
|
|||||||
case GELDB_LIMB_HEAD:
|
case GELDB_LIMB_HEAD:
|
||||||
rot->x += this->headRot.y;
|
rot->x += this->headRot.y;
|
||||||
|
|
||||||
// This is a hack to fix the color-changing clothes this Gerudo has on N64 versions
|
|
||||||
default:
|
default:
|
||||||
OPEN_DISPS(globalCtx->state.gfxCtx);
|
if (CVar_GetS32("gGerudoWarriorClothingFix", 0)) {
|
||||||
switch (limbIndex) {
|
// This is a hack to fix the color-changing clothes this Gerudo has on N64 versions
|
||||||
case GELDB_LIMB_NECK:
|
OPEN_DISPS(globalCtx->state.gfxCtx);
|
||||||
break;
|
switch (limbIndex) {
|
||||||
case GELDB_LIMB_HEAD:
|
case GELDB_LIMB_NECK:
|
||||||
gDPPipeSync(POLY_OPA_DISP++);
|
break;
|
||||||
gDPSetEnvColor(POLY_OPA_DISP++, 80, 60, 10, 255);
|
case GELDB_LIMB_HEAD:
|
||||||
break;
|
gDPPipeSync(POLY_OPA_DISP++);
|
||||||
case GELDB_LIMB_R_SWORD:
|
gDPSetEnvColor(POLY_OPA_DISP++, 80, 60, 10, 255);
|
||||||
case GELDB_LIMB_L_SWORD:
|
break;
|
||||||
gDPPipeSync(POLY_OPA_DISP++);
|
case GELDB_LIMB_R_SWORD:
|
||||||
gDPSetEnvColor(POLY_OPA_DISP++, 140, 170, 230, 255);
|
case GELDB_LIMB_L_SWORD:
|
||||||
gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, 255, 255, 255, 255);
|
gDPPipeSync(POLY_OPA_DISP++);
|
||||||
break;
|
gDPSetEnvColor(POLY_OPA_DISP++, 140, 170, 230, 255);
|
||||||
default:
|
gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, 255, 255, 255, 255);
|
||||||
gDPPipeSync(POLY_OPA_DISP++);
|
break;
|
||||||
gDPSetEnvColor(POLY_OPA_DISP++, 140, 0, 0, 255);
|
default:
|
||||||
break;
|
gDPPipeSync(POLY_OPA_DISP++);
|
||||||
|
gDPSetEnvColor(POLY_OPA_DISP++, 140, 0, 0, 255);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
CLOSE_DISPS(globalCtx->state.gfxCtx);
|
||||||
}
|
}
|
||||||
CLOSE_DISPS(globalCtx->state.gfxCtx);
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
|
@ -401,7 +401,7 @@ void func_80ABA9B8(EnNiwLady* this, GlobalContext* globalCtx) {
|
|||||||
} else {
|
} else {
|
||||||
// TODO: get-item-rework Adult trade sequence
|
// TODO: get-item-rework Adult trade sequence
|
||||||
this->getItemEntry = Randomizer_GetItemFromKnownCheck(RC_KAK_ANJU_AS_ADULT, GI_POCKET_EGG);
|
this->getItemEntry = Randomizer_GetItemFromKnownCheck(RC_KAK_ANJU_AS_ADULT, GI_POCKET_EGG);
|
||||||
GiveItemEntryFromActor(&this->actor, globalCtx, this->getItemEntry, 200.0f, 100.0f);
|
gSaveContext.itemGetInf[2] |= 0x1000;
|
||||||
}
|
}
|
||||||
|
|
||||||
this->actionFunc = func_80ABAC00;
|
this->actionFunc = func_80ABAC00;
|
||||||
@ -431,7 +431,14 @@ void func_80ABAB08(EnNiwLady* this, GlobalContext* globalCtx) {
|
|||||||
case 0:
|
case 0:
|
||||||
Message_CloseTextbox(globalCtx);
|
Message_CloseTextbox(globalCtx);
|
||||||
this->actor.parent = NULL;
|
this->actor.parent = NULL;
|
||||||
func_8002F434(&this->actor, globalCtx, GI_COJIRO, 200.0f, 100.0f);
|
if (!gSaveContext.n64ddFlag) {
|
||||||
|
func_8002F434(&this->actor, globalCtx, GI_COJIRO, 200.0f, 100.0f);
|
||||||
|
} else {
|
||||||
|
// TODO: get-item-rework Adult trade sequence
|
||||||
|
this->getItemEntry = Randomizer_GetItemFromKnownCheck(RC_KAK_TRADE_POCKET_CUCCO, GI_COJIRO);
|
||||||
|
Randomizer_ConsumeAdultTradeItem(globalCtx, ITEM_POCKET_CUCCO);
|
||||||
|
gSaveContext.itemGetInf[2] |= 0x4000;
|
||||||
|
}
|
||||||
this->actionFunc = func_80ABAC00;
|
this->actionFunc = func_80ABAC00;
|
||||||
break;
|
break;
|
||||||
case 1:
|
case 1:
|
||||||
@ -455,18 +462,14 @@ void func_80ABAC00(EnNiwLady* this, GlobalContext* globalCtx) {
|
|||||||
} else {
|
} else {
|
||||||
getItemId = this->getItemId;
|
getItemId = this->getItemId;
|
||||||
if (LINK_IS_ADULT) {
|
if (LINK_IS_ADULT) {
|
||||||
getItemId = !(gSaveContext.itemGetInf[2] & 0x1000) ? GI_POCKET_EGG : GI_COJIRO;
|
if (!gSaveContext.n64ddFlag) {
|
||||||
|
getItemId = !(gSaveContext.itemGetInf[2] & 0x1000) ? GI_POCKET_EGG : GI_COJIRO;
|
||||||
if (gSaveContext.n64ddFlag) {
|
} else {
|
||||||
if (getItemId == GI_POCKET_EGG) {
|
// TODO: get-item-rework Adult trade sequence
|
||||||
// TODO: get-item-rework Adult trade sequence
|
getItemId = this->getItemEntry.getItemId;
|
||||||
this->getItemEntry = Randomizer_GetItemFromKnownCheck(RC_KAK_ANJU_AS_ADULT, GI_POCKET_EGG);
|
GiveItemEntryFromActor(&this->actor, globalCtx, this->getItemEntry, 200.0f, 100.0f);
|
||||||
GiveItemEntryFromActor(&this->actor, globalCtx, this->getItemEntry, 200.0f, 100.0f);
|
// Skip setting item flags because that was done earlier
|
||||||
} else {
|
this->actionFunc = func_80ABA778;
|
||||||
this->getItemEntry = Randomizer_GetItemFromKnownCheck(RC_KAK_TRADE_POCKET_CUCCO, GI_COJIRO);
|
|
||||||
Randomizer_ConsumeAdultTradeItem(globalCtx, ITEM_POCKET_CUCCO);
|
|
||||||
GiveItemEntryFromActor(&this->actor, globalCtx, this->getItemEntry, 200.0f, 100.0f);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (this->getItemEntry.getItemId == GI_NONE) {
|
if (this->getItemEntry.getItemId == GI_NONE) {
|
||||||
|
@ -820,6 +820,19 @@ void func_80AF3F20(EnRu2* this, GlobalContext* globalCtx) {
|
|||||||
void EnRu2_Draw(Actor* thisx, GlobalContext* globalCtx) {
|
void EnRu2_Draw(Actor* thisx, GlobalContext* globalCtx) {
|
||||||
EnRu2* this = (EnRu2*)thisx;
|
EnRu2* this = (EnRu2*)thisx;
|
||||||
|
|
||||||
|
// FAST3D: This is a hack for the issue of both TEXEL0 and TEXEL1 using the same texture with different settings.
|
||||||
|
// Ruto's earring uses both TEXEL0 and TEXEL1 to render. The issue is that it never loads anything into TEXEL1, so
|
||||||
|
// it reuses whatever happens to be there, which is the water temple brick texture. It just so happens that the
|
||||||
|
// earring texture loads into the same place in tmem as the brick texture, so when it comes to rendering, TEXEL1
|
||||||
|
// uses the earring texture with diffrent clamp settings, and it displays without noticeable error. However, both
|
||||||
|
// texel samplers are not intended to be used for the same texture with different settings, so this misuse confuses
|
||||||
|
// our texture cache, and we load the wrong settings for the earrings texture. This patch is a hack that replaces
|
||||||
|
// TEXEL1 with TEXEL0, which is most likely the original intention, and all is well.
|
||||||
|
Gfx* gfx = ResourceMgr_LoadGfxByName(gAdultRutoHeadDL);
|
||||||
|
Gfx patch = gsDPSetCombineLERP(TEXEL0, 0, PRIMITIVE, 0, TEXEL0, 0, ENVIRONMENT, 0, 0, 0, 0, COMBINED, TEXEL0, 0,
|
||||||
|
PRIM_LOD_FRAC, COMBINED);
|
||||||
|
gfx[0xA2] = patch;
|
||||||
|
|
||||||
if ((this->drawConfig < 0) || (this->drawConfig >= ARRAY_COUNT(sDrawFuncs)) ||
|
if ((this->drawConfig < 0) || (this->drawConfig >= ARRAY_COUNT(sDrawFuncs)) ||
|
||||||
(sDrawFuncs[this->drawConfig] == 0)) {
|
(sDrawFuncs[this->drawConfig] == 0)) {
|
||||||
// "Draw Mode is improper!"
|
// "Draw Mode is improper!"
|
||||||
|
@ -6252,21 +6252,27 @@ s32 func_8083E5A8(Player* this, GlobalContext* globalCtx) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Skip cutscenes from picking up items when they come from bushes/rocks/etc, but nowhere else.
|
// Show the cutscene for picking up an item. In vanilla, this happens in bombchu bowling alley (because getting bombchus need to show the cutscene)
|
||||||
uint8_t skipItemCutscene = CVar_GetS32("gFastDrops", 0) && interactedActor->id == ACTOR_EN_ITEM00 &&
|
// and whenever the player doesn't have the item yet. In rando, we're overruling this because we need to keep showing the cutscene
|
||||||
interactedActor->params != 6 && interactedActor->params != 17;
|
// because those items can be randomized and thus it's important to keep showing the cutscene.
|
||||||
|
uint8_t showItemCutscene = globalCtx->sceneNum == SCENE_BOWLING || Item_CheckObtainability(giEntry.itemId) == ITEM_NONE || gSaveContext.n64ddFlag;
|
||||||
|
|
||||||
// Same as above but for rando. We need this specifically for rando because we need to be enable the cutscenes everywhere else in the game
|
// Only skip cutscenes for drops when they're items/consumables from bushes/rocks/enemies.
|
||||||
// because the items are randomized and thus it's important to show the get item animation.
|
uint8_t isDropToSkip = (interactedActor->id == ACTOR_EN_ITEM00 && interactedActor->params != 6 && interactedActor->params != 17) ||
|
||||||
uint8_t skipItemCutsceneRando = gSaveContext.n64ddFlag &&
|
interactedActor->id == ACTOR_EN_KAREBABA ||
|
||||||
Item_CheckObtainability(giEntry.itemId) != ITEM_NONE &&
|
interactedActor->id == ACTOR_EN_DEKUBABA;
|
||||||
interactedActor->id == ACTOR_EN_ITEM00 &&
|
|
||||||
interactedActor->params != 6 && interactedActor->params != 17;
|
|
||||||
|
|
||||||
// Show cutscene when picking up a item that the player doesn't own yet.
|
// Skip cutscenes from picking up consumables with "Fast Pickup Text" enabled, even when the player never picked it up before.
|
||||||
// We want to ALWAYS show "get item animations" for items when they're randomized to account for
|
// But only for bushes/rocks/enemies because otherwise it can lead to softlocks in deku mask theatre and potentially other places.
|
||||||
// randomized freestanding items etc, but we still don't want to show it every time you pick up a consumable from a pot/bush etc.
|
uint8_t skipItemCutscene = CVar_GetS32("gFastDrops", 0) && isDropToSkip;
|
||||||
if ((globalCtx->sceneNum == SCENE_BOWLING || Item_CheckObtainability(giEntry.itemId) == ITEM_NONE || gSaveContext.n64ddFlag) && !skipItemCutscene && !skipItemCutsceneRando) {
|
|
||||||
|
// Same as above but for rando. Rando is different because we want to enable cutscenes for items that the player already has because
|
||||||
|
// those items could be a randomized item coming from scrubs, freestanding PoH's and keys. So we need to once again overrule
|
||||||
|
// this specifically for items coming from bushes/rocks/enemies when the player has already picked that item up.
|
||||||
|
uint8_t skipItemCutsceneRando = gSaveContext.n64ddFlag && Item_CheckObtainability(giEntry.itemId) != ITEM_NONE && isDropToSkip;
|
||||||
|
|
||||||
|
// Show cutscene when picking up a item.
|
||||||
|
if (showItemCutscene && !skipItemCutscene && !skipItemCutsceneRando) {
|
||||||
|
|
||||||
func_808323B4(globalCtx, this);
|
func_808323B4(globalCtx, this);
|
||||||
func_8083AE40(this, giEntry.objectId);
|
func_8083AE40(this, giEntry.objectId);
|
||||||
@ -6282,7 +6288,7 @@ s32 func_8083E5A8(Player* this, GlobalContext* globalCtx) {
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Don't show cutscene when picking up an item
|
// Don't show cutscene when picking up an item.
|
||||||
func_8083E4C4(globalCtx, this, &giEntry);
|
func_8083E4C4(globalCtx, this, &giEntry);
|
||||||
this->getItemId = GI_NONE;
|
this->getItemId = GI_NONE;
|
||||||
this->getItemEntry = (GetItemEntry)GET_ITEM_NONE;
|
this->getItemEntry = (GetItemEntry)GET_ITEM_NONE;
|
||||||
|
Loading…
Reference in New Issue
Block a user