From 5898c3e2b0603acfb0cb55f7d1226853f9dfefaf Mon Sep 17 00:00:00 2001
From: Isghj <42048411+isghj5@users.noreply.github.com>
Date: Sat, 6 Dec 2025 12:03:15 -0800
Subject: [PATCH] `EnPoComposer` and `object_po_composer` further documented
(#1833)
* PoComposer: some docs
* PoComposer: the rest of the object documented
* PoComposer: docs tweaked
* PoComposer: missing weekevent reg in a schedule file wasnt found by rename script
* PoComposer: document tweaks
* PoComposer: forgot the texture name
---
assets/xml/objects/object_po_composer.xml | 30 ++--
include/z64save.h | 4 +-
.../ovl_Bg_Iknv_Doukutu/z_bg_iknv_doukutu.c | 7 +-
.../actors/ovl_Bg_Iknv_Obj/z_bg_iknv_obj.c | 2 +-
.../actors/ovl_En_Door/scheduleScripts.schl | 2 +-
src/overlays/actors/ovl_En_Hgo/z_en_hgo.c | 2 +-
src/overlays/actors/ovl_En_Jso/z_en_jso.c | 8 +-
.../actors/ovl_En_Pamera/z_en_pamera.c | 9 +-
.../ovl_En_Po_Composer/z_en_po_composer.c | 168 ++++++++++--------
.../ovl_En_Po_Composer/z_en_po_composer.h | 13 +-
.../actors/ovl_En_Railgibud/z_en_railgibud.c | 2 +-
tools/disasm/n64-us/functions.txt | 6 +-
tools/overlayhelpers/mscriptdis.py | 4 +-
tools/weekeventregconvert.py | 4 +-
14 files changed, 142 insertions(+), 119 deletions(-)
diff --git a/assets/xml/objects/object_po_composer.xml b/assets/xml/objects/object_po_composer.xml
index 51b07ac7f2..d2f4488508 100644
--- a/assets/xml/objects/object_po_composer.xml
+++ b/assets/xml/objects/object_po_composer.xml
@@ -22,9 +22,9 @@
-
+
-
+
@@ -32,18 +32,20 @@
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/include/z64save.h b/include/z64save.h
index 5d0f5bff57..36e9f3bae2 100644
--- a/include/z64save.h
+++ b/include/z64save.h
@@ -744,8 +744,8 @@ typedef enum {
// Attempted Cremia Cart Ride
#define WEEKEVENTREG_14_01 PACK_WEEKEVENTREG_FLAG(14, 0x01)
-#define WEEKEVENTREG_14_02 PACK_WEEKEVENTREG_FLAG(14, 0x02)
-#define WEEKEVENTREG_14_04 PACK_WEEKEVENTREG_FLAG(14, 0x04)
+#define WEEKEVENTREG_SHARP_HOSTILE_CONVERSATION PACK_WEEKEVENTREG_FLAG(14, 0x02)
+#define WEEKEVENTREG_IKANA_SPRING_RESTORED PACK_WEEKEVENTREG_FLAG(14, 0x04)
#define WEEKEVENTREG_DRANK_CHATEAU_ROMANI PACK_WEEKEVENTREG_FLAG(14, 0x08)
#define WEEKEVENTREG_WON_DEKU_PLAYGROUND_DAY_1 PACK_WEEKEVENTREG_FLAG(14, 0x10)
#define WEEKEVENTREG_WON_DEKU_PLAYGROUND_DAY_2 PACK_WEEKEVENTREG_FLAG(14, 0x20)
diff --git a/src/overlays/actors/ovl_Bg_Iknv_Doukutu/z_bg_iknv_doukutu.c b/src/overlays/actors/ovl_Bg_Iknv_Doukutu/z_bg_iknv_doukutu.c
index 974de0ffb3..96d2cf9fc0 100644
--- a/src/overlays/actors/ovl_Bg_Iknv_Doukutu/z_bg_iknv_doukutu.c
+++ b/src/overlays/actors/ovl_Bg_Iknv_Doukutu/z_bg_iknv_doukutu.c
@@ -51,7 +51,8 @@ void BgIknvDoukutu_Init(Actor* thisx, PlayState* play) {
this->actionFunc = func_80BD71BC;
this->cueType = CS_CMD_ACTOR_CUE_516;
this->unk_160 = 1.0f;
- if (CHECK_WEEKEVENTREG(WEEKEVENTREG_14_04) || CHECK_WEEKEVENTREG(WEEKEVENTREG_CLEARED_STONE_TOWER_TEMPLE)) {
+ if (CHECK_WEEKEVENTREG(WEEKEVENTREG_IKANA_SPRING_RESTORED) ||
+ CHECK_WEEKEVENTREG(WEEKEVENTREG_CLEARED_STONE_TOWER_TEMPLE)) {
this->dyna.actor.draw = func_80BD7768;
this->actionFunc = func_80BD73D0;
play->envCtx.lightSettingOverride = 25;
@@ -67,7 +68,7 @@ void BgIknvDoukutu_Init(Actor* thisx, PlayState* play) {
DynaPolyActor_Init(&this->dyna, 0);
CollisionHeader_GetVirtual(&object_iknv_obj_Colheader_012788, &colHeader);
this->dyna.bgId = DynaPoly_SetBgActor(play, &play->colCtx.dyna, &this->dyna.actor, colHeader);
- if (!CHECK_WEEKEVENTREG(WEEKEVENTREG_14_04)) {
+ if (!CHECK_WEEKEVENTREG(WEEKEVENTREG_IKANA_SPRING_RESTORED)) {
Actor_Kill(&this->dyna.actor);
}
break;
@@ -78,7 +79,7 @@ void BgIknvDoukutu_Init(Actor* thisx, PlayState* play) {
DynaPolyActor_Init(&this->dyna, 0);
CollisionHeader_GetVirtual(&object_iknv_obj_Colheader_0117C8, &colHeader);
this->dyna.bgId = DynaPoly_SetBgActor(play, &play->colCtx.dyna, &this->dyna.actor, colHeader);
- if (CHECK_WEEKEVENTREG(WEEKEVENTREG_14_04)) {
+ if (CHECK_WEEKEVENTREG(WEEKEVENTREG_IKANA_SPRING_RESTORED)) {
this->unk_160 = 1.0f;
this->dyna.actor.world.pos.y += 68.0f;
} else {
diff --git a/src/overlays/actors/ovl_Bg_Iknv_Obj/z_bg_iknv_obj.c b/src/overlays/actors/ovl_Bg_Iknv_Obj/z_bg_iknv_obj.c
index e6aff53d4d..9d3c36e31b 100644
--- a/src/overlays/actors/ovl_Bg_Iknv_Obj/z_bg_iknv_obj.c
+++ b/src/overlays/actors/ovl_Bg_Iknv_Obj/z_bg_iknv_obj.c
@@ -127,7 +127,7 @@ s32 func_80BD7CEC(BgIknvObj* this) {
}
void BgIknvObj_UpdateWaterwheel(BgIknvObj* this, PlayState* play) {
- if (CHECK_WEEKEVENTREG(WEEKEVENTREG_14_04)) {
+ if (CHECK_WEEKEVENTREG(WEEKEVENTREG_IKANA_SPRING_RESTORED)) {
this->dyna.actor.shape.rot.z -= 0x64;
Actor_PlaySeq_FlaggedMusicBoxHouse(&this->dyna.actor);
Actor_PlaySfx_Flagged(&this->dyna.actor, NA_SE_EV_WOOD_WATER_WHEEL - SFX_FLAG);
diff --git a/src/overlays/actors/ovl_En_Door/scheduleScripts.schl b/src/overlays/actors/ovl_En_Door/scheduleScripts.schl
index ab52716182..4419a2d5cb 100644
--- a/src/overlays/actors/ovl_En_Door/scheduleScripts.schl
+++ b/src/overlays/actors/ovl_En_Door/scheduleScripts.schl
@@ -406,7 +406,7 @@ sDoorSch_RomaniRanchBedroom {
sDoorSch_IkanaCanyonMusicBoxHouse {
not if_week_event_reg (WEEKEVENTREG_CLEARED_STONE_TOWER_TEMPLE) {
not if_week_event_reg (WEEKEVENTREG_75_20) {
- not if_week_event_reg (WEEKEVENTREG_14_04) {
+ not if_week_event_reg (WEEKEVENTREG_IKANA_SPRING_RESTORED) {
return_s (0x1D)
} else not if_week_event_reg (WEEKEVENTREG_59_01) {
if_week_event_reg (WEEKEVENTREG_61_02) {
diff --git a/src/overlays/actors/ovl_En_Hgo/z_en_hgo.c b/src/overlays/actors/ovl_En_Hgo/z_en_hgo.c
index 9352c9d7b0..63baddd8ba 100644
--- a/src/overlays/actors/ovl_En_Hgo/z_en_hgo.c
+++ b/src/overlays/actors/ovl_En_Hgo/z_en_hgo.c
@@ -224,7 +224,7 @@ void EnHgo_HandlePlayerChoice(EnHgo* this, PlayState* play) {
break;
case 0x1590:
- if (CHECK_WEEKEVENTREG(WEEKEVENTREG_14_04)) {
+ if (CHECK_WEEKEVENTREG(WEEKEVENTREG_IKANA_SPRING_RESTORED)) {
Message_StartTextbox(play, 0x1591, &this->actor);
this->textId = 0x1591;
break;
diff --git a/src/overlays/actors/ovl_En_Jso/z_en_jso.c b/src/overlays/actors/ovl_En_Jso/z_en_jso.c
index 4d308530ad..adb560d76c 100644
--- a/src/overlays/actors/ovl_En_Jso/z_en_jso.c
+++ b/src/overlays/actors/ovl_En_Jso/z_en_jso.c
@@ -1232,28 +1232,28 @@ void EnJso_TellHint(EnJso* this, PlayState* play) {
case EN_JSO_HINT_VARIABLE_1:
textId = 0x139D; // Hint about Pamela's family being in the house with the waterwheel
- if (CHECK_WEEKEVENTREG(WEEKEVENTREG_14_04)) {
+ if (CHECK_WEEKEVENTREG(WEEKEVENTREG_IKANA_SPRING_RESTORED)) {
textId = 0x13A1; // Hint about using the Song of Healing on Pamela's father
}
break;
case EN_JSO_HINT_VARIABLE_2:
textId = 0x139E; // Hint about Pamela leaving her house to check something
- if (CHECK_WEEKEVENTREG(WEEKEVENTREG_14_04)) {
+ if (CHECK_WEEKEVENTREG(WEEKEVENTREG_IKANA_SPRING_RESTORED)) {
textId = 0x13A2; // Hint about the well being connected to Ikana Castle
}
break;
case EN_JSO_HINT_VARIABLE_3:
textId = 0x139F; // Hint about restoring the river by going into Sharp's cave
- if (CHECK_WEEKEVENTREG(WEEKEVENTREG_14_04)) {
+ if (CHECK_WEEKEVENTREG(WEEKEVENTREG_IKANA_SPRING_RESTORED)) {
textId = 0x13A3; // Hint about the Gibdos in the well wanting items
}
break;
case EN_JSO_HINT_VARIABLE_4:
textId = 0x13A0; // Hint about needing the Song of Storms to pacify Sharp
- if (CHECK_WEEKEVENTREG(WEEKEVENTREG_14_04)) {
+ if (CHECK_WEEKEVENTREG(WEEKEVENTREG_IKANA_SPRING_RESTORED)) {
textId = 0x13A4; // Hint about the items the Gibdos want being in the well
}
break;
diff --git a/src/overlays/actors/ovl_En_Pamera/z_en_pamera.c b/src/overlays/actors/ovl_En_Pamera/z_en_pamera.c
index 2607390655..7c6e89a05d 100644
--- a/src/overlays/actors/ovl_En_Pamera/z_en_pamera.c
+++ b/src/overlays/actors/ovl_En_Pamera/z_en_pamera.c
@@ -170,8 +170,9 @@ void EnPamera_Init(Actor* thisx, PlayState* play) {
func_80BD8588(this, play);
func_80BD8658(this);
- if (!CHECK_WEEKEVENTREG(WEEKEVENTREG_14_04) || CHECK_WEEKEVENTREG(WEEKEVENTREG_CLEARED_STONE_TOWER_TEMPLE) ||
- CHECK_WEEKEVENTREG(WEEKEVENTREG_75_20) || (gSaveContext.save.entrance == ENTRANCE(IKANA_CANYON, 9))) {
+ if (!CHECK_WEEKEVENTREG(WEEKEVENTREG_IKANA_SPRING_RESTORED) ||
+ CHECK_WEEKEVENTREG(WEEKEVENTREG_CLEARED_STONE_TOWER_TEMPLE) || CHECK_WEEKEVENTREG(WEEKEVENTREG_75_20) ||
+ (gSaveContext.save.entrance == ENTRANCE(IKANA_CANYON, 9))) {
Actor_Kill(&this->actor);
}
@@ -593,7 +594,7 @@ void func_80BD9840(EnPamera* this, PlayState* play) {
func_80BD9E60(this);
func_80BD9904(this);
}
- if (CHECK_WEEKEVENTREG(WEEKEVENTREG_14_04)) {
+ if (CHECK_WEEKEVENTREG(WEEKEVENTREG_IKANA_SPRING_RESTORED)) {
func_801A0204(NA_BGM_MUSIC_BOX_HOUSE);
} else {
func_801A0204(NA_BGM_INSIDE_A_HOUSE);
@@ -898,7 +899,7 @@ void func_80BDA344(Actor* thisx, PlayState* play) {
Collider_UpdateCylinder(&this->actor, &this->collider);
CollisionCheck_SetOC(play, &play->colChkCtx, &this->collider.base);
}
- if (CHECK_WEEKEVENTREG(WEEKEVENTREG_14_04)) {
+ if (CHECK_WEEKEVENTREG(WEEKEVENTREG_IKANA_SPRING_RESTORED)) {
play->roomCtx.unk7A[0]++;
}
}
diff --git a/src/overlays/actors/ovl_En_Po_Composer/z_en_po_composer.c b/src/overlays/actors/ovl_En_Po_Composer/z_en_po_composer.c
index bc60c0bcc2..044ee3210d 100644
--- a/src/overlays/actors/ovl_En_Po_Composer/z_en_po_composer.c
+++ b/src/overlays/actors/ovl_En_Po_Composer/z_en_po_composer.c
@@ -30,7 +30,7 @@ void EnPoComposer_Roll(EnPoComposer* this, PlayState* play);
void EnPoComposer_SetupAwaitPlayer(EnPoComposer* this);
void EnPoComposer_SetupStartCutscene(EnPoComposer* this);
void EnPoComposer_SetupStartedCutscene(EnPoComposer* this);
-void EnPoComposer_StepLightAlpha(EnPoComposer* this);
+void EnPoComposer_StepMainAlpha(EnPoComposer* this);
ActorProfile En_Po_Composer_Profile = {
/**/ ACTOR_EN_PO_COMPOSER,
@@ -93,6 +93,7 @@ static ColliderJntSphInit sJntSphInit = {
static CollisionCheckInfoInit sColChkInfoInit = { 4, 25, 50, 40 };
+// Unused. Interesting that they had planned for a fight at some point, maybe flat?
static DamageTable sDamageTable = {
/* Deku Nut */ DMG_ENTRY(0, 0x0),
/* Deku Stick */ DMG_ENTRY(2, 0x0),
@@ -120,7 +121,7 @@ static DamageTable sDamageTable = {
/* Zora punch */ DMG_ENTRY(4, 0x0),
/* Spin attack */ DMG_ENTRY(2, 0x0),
/* Sword beam */ DMG_ENTRY(2, 0x0),
- /* Normal Roll */ DMG_ENTRY(8, 0x0),
+ /* Normal Roll */ DMG_ENTRY(8, 0x0), // 8 damage? on rolling?
/* UNK_DMG_0x1B */ DMG_ENTRY(4, 0x0),
/* UNK_DMG_0x1C */ DMG_ENTRY(0, 0x0),
/* Unblockable */ DMG_ENTRY(0, 0x0),
@@ -161,9 +162,10 @@ static AnimationInfo sAnimationInfo[POE_COMPOSER_ANIM_MAX] = {
/* 12 */ { &gPoeComposerAttackAnim, 1.0f, 0.0f, 0.0f, ANIMMODE_LOOP, 0.0f },
};
-static Color_RGBA8 sLightColorInit = { 255, 255, 210, 0 };
+// also used for robe hem base color, but it gets overridden by sSharpClothingColor2 (bug?)
+static Color_RGBA8 sEyeColor = { 255, 255, 210, 0 };
-static Color_RGBA8 sEnvColorInit = { 0, 0, 0, 255 };
+static Color_RGBA8 sLightColorInit = { 0, 0, 0, 255 };
static Color_RGBA8 sSharpClothingColor1 = { 75, 20, 25, 255 };
@@ -195,27 +197,29 @@ void EnPoComposer_Init(Actor* thisx, PlayState* play) {
Lights_PointGlowSetInfo(&this->lightInfo, this->actor.home.pos.x, this->actor.home.pos.y, this->actor.home.pos.z,
255, 255, 255, 0);
this->actor.flags &= ~ACTOR_FLAG_ATTENTION_ENABLED;
+ this->eyeColor = sEyeColor;
this->lightColor = sLightColorInit;
- this->envColor = sEnvColorInit;
this->cueId = POE_COMPOSER_CUEID_NONE;
if (POE_COMPOSER_IS_FLAT(&this->actor)) {
this->sharpCsNum = 0;
this->inCutscene = true;
EnPoComposer_SetupStartedCutscene(this);
- } else if (POE_COMPOSER_4000(&this->actor)) {
+ } else if (POE_COMPOSER_SHARP_HEALED(&this->actor)) {
+ // Player spawned in the cave after music house river cutscene
if (gSaveContext.save.entrance != ENTRANCE(IKANA_CANYON, 10)) {
Actor_Kill(&this->actor);
return;
}
- this->sharpCsNum = SHARP_CS_ENCOUNTER_FIRST;
+
+ this->sharpCsNum = SHARP_CS_ENCOUNTER_HEALED_TALK;
this->inCutscene = true;
EnPoComposer_SetupStartedCutscene(this);
- } else {
+ } else { // Sharp (hostile)
s32 i;
s16 csId = this->actor.csId;
- if (CHECK_WEEKEVENTREG(WEEKEVENTREG_14_04)) {
+ if (CHECK_WEEKEVENTREG(WEEKEVENTREG_IKANA_SPRING_RESTORED)) {
Actor_Kill(&this->actor);
return;
}
@@ -228,11 +232,12 @@ void EnPoComposer_Init(Actor* thisx, PlayState* play) {
csId = CutsceneManager_GetAdditionalCsId(csId);
}
- if (CHECK_WEEKEVENTREG(WEEKEVENTREG_14_02)) {
- this->sharpCsNum = SHARP_CS_ENCOUNTER_OTHER;
+ if (CHECK_WEEKEVENTREG(WEEKEVENTREG_SHARP_HOSTILE_CONVERSATION)) {
+ this->sharpCsNum = SHARP_CS_ENCOUNTER_AGRO_TALK;
} else {
- this->sharpCsNum = SHARP_CS_ENCOUNTER_FIRST;
+ this->sharpCsNum = SHARP_CS_ENCOUNTER_HEALED_TALK;
}
+
this->inCutscene = false;
EnPoComposer_SetupAwaitPlayer(this);
}
@@ -293,6 +298,7 @@ void EnPoComposer_PlayCurse(EnPoComposer* this, PlayState* play) {
// Damage the player every second
if (this->actionTimer == 20) {
+ // Quarter heart damage (4)
func_800B8D10(play, &this->actor, 0.0f, 0, 0.0f, 1, 4);
this->actionTimer = 0;
} else {
@@ -417,7 +423,7 @@ void EnPoComposer_Roll(EnPoComposer* this, PlayState* play) {
Actor_PlaySfx(&this->actor, NA_SE_EN_SHARP_REACTION);
Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, POE_COMPOSER_ANIM_ROLLING);
}
- } else if (Animation_OnFrame(&this->skelAnime, 1.0f) && (this->lightColor.a > 32)) {
+ } else if (Animation_OnFrame(&this->skelAnime, 1.0f) && (this->eyeColor.a > 32)) {
if (this->csCueTimer == 1) {
Actor_PlaySfx(&this->actor, NA_SE_EN_LAST3_DEAD_WIND2_OLD);
this->csCueTimer = 2;
@@ -429,7 +435,7 @@ void EnPoComposer_Roll(EnPoComposer* this, PlayState* play) {
}
void EnPoComposer_SharpCutsceneDone(EnPoComposer* this) {
- SET_WEEKEVENTREG(WEEKEVENTREG_14_04);
+ SET_WEEKEVENTREG(WEEKEVENTREG_IKANA_SPRING_RESTORED);
Actor_Kill(&this->actor);
}
@@ -504,7 +510,7 @@ s32 EnPoComposer_UpdateAction(EnPoComposer* this, PlayState* play) {
Cutscene_ActorTranslate(&this->actor, play, cueChannel);
}
- EnPoComposer_StepLightAlpha(this);
+ EnPoComposer_StepMainAlpha(this);
if ((this->sharpCsNum == SHARP_CS_SONG_STORMS) && (play->csCtx.curFrame == 204)) {
Audio_PlaySfx(NA_SE_SY_DIZZY_EFFECT);
@@ -521,14 +527,14 @@ s32 EnPoComposer_UpdateAction(EnPoComposer* this, PlayState* play) {
if (POE_COMPOSER_IS_FLAT(&this->actor)) {
EnPoComposer_SetupStartedCutscene(this);
- } else if (POE_COMPOSER_4000(&this->actor)) {
+ } else if (POE_COMPOSER_SHARP_HEALED(&this->actor)) {
EnPoComposer_SetupStartedCutscene(this);
- } else {
+ } else { // Sharp is hostile
this->inCutscene = false;
if (this->sharpCsNum < SHARP_CS_SONG_STORMS) {
- if (!CHECK_WEEKEVENTREG(WEEKEVENTREG_14_02)) {
- SET_WEEKEVENTREG(WEEKEVENTREG_14_02);
+ if (!CHECK_WEEKEVENTREG(WEEKEVENTREG_SHARP_HOSTILE_CONVERSATION)) {
+ SET_WEEKEVENTREG(WEEKEVENTREG_SHARP_HOSTILE_CONVERSATION);
}
EnPoComposer_SetupPlayCurse(this);
} else {
@@ -541,55 +547,57 @@ s32 EnPoComposer_UpdateAction(EnPoComposer* this, PlayState* play) {
return false;
}
-void EnPoComposer_StepLightAlpha(EnPoComposer* this) {
- if ((this->visible == true) && (this->lightColor.a != 255)) {
- if (this->lightColor.a > 247) {
- this->lightColor.a = 255;
+void EnPoComposer_StepMainAlpha(EnPoComposer* this) {
+ if ((this->visible == true) && (this->mainAlpha.a != 255)) {
+ if (this->mainAlpha.a > 247) {
+ this->mainAlpha.a = 255;
} else {
- this->lightColor.a += 7;
+ this->mainAlpha.a += 7;
}
- } else if (!this->visible && (this->lightColor.a != 0)) {
- if (this->lightColor.a < 8) {
- this->lightColor.a = 0;
+ } else if (!this->visible && (this->mainAlpha.a != 0)) {
+ if (this->mainAlpha.a < 8) {
+ this->mainAlpha.a = 0;
} else {
- this->lightColor.a -= 7;
+ this->mainAlpha.a -= 7;
}
}
}
-void EnPoComposer_StepLightColor(EnPoComposer* this) {
+void EnPoComposer_StepEyeColor(EnPoComposer* this) {
s16 color;
- color = this->lightColor.r + 5;
- this->lightColor.r = CLAMP_MAX(color, 255);
+ color = this->eyeColor.r + 5;
+ this->eyeColor.r = CLAMP_MAX(color, 255);
- color = this->lightColor.g + 5;
- this->lightColor.g = CLAMP_MAX(color, 255);
+ color = this->eyeColor.g + 5;
+ this->eyeColor.g = CLAMP_MAX(color, 255);
- if (this->lightColor.b > 210) {
- color = this->lightColor.b - 5;
- this->lightColor.b = CLAMP_MIN(color, 210);
+ if (this->eyeColor.b > 210) {
+ color = this->eyeColor.b - 5;
+ this->eyeColor.b = CLAMP_MIN(color, 210);
} else {
- color = this->lightColor.b + 5;
- this->lightColor.b = CLAMP_MAX(color, 210);
+ color = this->eyeColor.b + 5;
+ this->eyeColor.b = CLAMP_MAX(color, 210);
}
}
-void EnPoComposer_UpdateEnvColor(EnPoComposer* this) {
+void EnPoComposer_UpdateLightColor(EnPoComposer* this) {
if ((this->actionFunc == EnPoComposer_Appear) && (this->skelAnime.curFrame < 12.0f)) {
// Step rgb from 55 to 255 and alpha from 0 to 200 over the first 12 frames of the appear anim
- this->envColor.r = this->envColor.g = this->envColor.b = 55.0f + this->skelAnime.curFrame * 16.66f;
- this->envColor.a = this->skelAnime.curFrame * (200.0f / 12.0f);
+ this->lightColor.r = this->lightColor.g = this->lightColor.b = 55.0f + this->skelAnime.curFrame * 16.66f;
+ this->lightColor.a = this->skelAnime.curFrame * (200.0f / 12.0f);
} else {
- f32 rand = Rand_ZeroOne();
+ // Flame Flicker
+ f32 lightIntensity = Rand_ZeroOne();
- this->envColor.r = 225 + (s32)(rand * 30.0f);
- this->envColor.g = 155 + (s32)(rand * 100.0f);
- this->envColor.b = 95 + (s32)(rand * 160.0f);
- this->envColor.a = 200;
+ this->lightColor.r = 225 + (s32)(lightIntensity * 30.0f);
+ this->lightColor.g = 155 + (s32)(lightIntensity * 100.0f);
+ this->lightColor.b = 95 + (s32)(lightIntensity * 160.0f);
+ this->lightColor.a = 200;
}
- if (this->lightColor.a == 0) {
- this->envColor.a = 0;
+
+ if (this->mainAlpha.a == 0) {
+ this->lightColor.a = 0;
}
}
@@ -602,7 +610,7 @@ void EnPoComposer_UpdateCollision(EnPoComposer* this, PlayState* play) {
void EnPoComposer_Update(Actor* thisx, PlayState* play) {
EnPoComposer* this = (EnPoComposer*)thisx;
- EnPoComposer_UpdateEnvColor(this);
+ EnPoComposer_UpdateLightColor(this);
SkelAnime_Update(&this->skelAnime);
Actor_SetFocus(&this->actor, 42.0f);
@@ -617,16 +625,19 @@ s32 EnPoComposer_OverrideLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, V
Gfx** gfx) {
EnPoComposer* this = (EnPoComposer*)thisx;
- if ((this->lightColor.a == 0) || (limbIndex == POE_COMPOSER_LIMB_LANTERN)) {
+ if ((this->mainAlpha.a == 0) || (limbIndex == POE_COMPOSER_LIMB_LANTERN)) {
+ // The lantern limb is never drawn because the limb only contains the lantern base for some reason
+ // Instead, the whole lantern is drawn manually in EnPoComposer_Draw
+ // This was likely done to give tighter lantern color control
*dList = NULL;
} else if (POE_COMPOSER_IS_FLAT(&this->actor) && (limbIndex == POE_COMPOSER_LIMB_HEAD)) {
*dList = gPoeComposerFlatHeadDL;
}
if (limbIndex == 19) {
- //! @bug skeleton does not have a limb 19, this is leftover from OoT Poes
+ //! @Bug skeleton does not have a limb 19, this is leftover from OoT Poes
gDPPipeSync((*gfx)++);
- gDPSetEnvColor((*gfx)++, this->lightColor.r, this->lightColor.g, this->lightColor.b, this->lightColor.a);
+ gDPSetEnvColor((*gfx)++, this->eyeColor.r, this->eyeColor.g, this->eyeColor.b, this->eyeColor.a);
}
return false;
@@ -645,39 +656,42 @@ void EnPoComposer_Draw(Actor* thisx, PlayState* play) {
EnPoComposer* this = (EnPoComposer*)thisx;
s32 pad;
Gfx* gfx;
+ // Clothing color draws on robe top, coat, hat, and the emblem on the lantern
Color_RGBA8* clothingColor;
- Color_RGBA8* var_t0;
+ // Overrides clothingColor: hat, robe top, robe hem (overrides eye color)
+ Color_RGBA8* clothingColor2;
Vec3f lightOffset;
Vec3s lightPos;
OPEN_DISPS(play->state.gfxCtx);
- EnPoComposer_StepLightColor(this);
+ EnPoComposer_StepEyeColor(this);
// Select colors
if (POE_COMPOSER_IS_FLAT(&this->actor)) {
clothingColor = &sFlatClothingColor1;
- var_t0 = &sFlatClothingColor2;
+ clothingColor2 = &sFlatClothingColor2;
} else {
clothingColor = &sSharpClothingColor1;
- var_t0 = &sSharpClothingColor2;
+ clothingColor2 = &sSharpClothingColor2;
}
// Draw skeleton
- if ((this->lightColor.a == 255) || (this->lightColor.a == 0)) {
+ if ((this->mainAlpha.a == 255) || (this->mainAlpha.a == 0)) {
Gfx_SetupDL25_Opa(play->state.gfxCtx);
- gSPSegment(POLY_OPA_DISP++, 0x08,
- Gfx_EnvColor(play->state.gfxCtx, this->lightColor.r, this->lightColor.g, this->lightColor.b,
- this->lightColor.a));
+ gSPSegment(
+ POLY_OPA_DISP++, 0x08,
+ Gfx_EnvColor(play->state.gfxCtx, this->eyeColor.r, this->eyeColor.g, this->eyeColor.b, this->eyeColor.a));
gSPSegment(
POLY_OPA_DISP++, 0x0A,
- Gfx_EnvColor(play->state.gfxCtx, clothingColor->r, clothingColor->g, clothingColor->b, this->lightColor.a));
+ Gfx_EnvColor(play->state.gfxCtx, clothingColor->r, clothingColor->g, clothingColor->b, this->mainAlpha.a));
gSPSegment(POLY_OPA_DISP++, 0x0B,
- Gfx_EnvColor(play->state.gfxCtx, var_t0->r, var_t0->g, var_t0->b, this->lightColor.a));
- gSPSegment(POLY_OPA_DISP++, 0x0C, D_801AEFA0);
+ Gfx_EnvColor(play->state.gfxCtx, clothingColor2->r, clothingColor2->g, clothingColor2->b,
+ this->mainAlpha.a));
+ gSPSegment(POLY_OPA_DISP++, 0x0C, D_801AEFA0); // empty DL
POLY_OPA_DISP =
SkelAnime_DrawFlex(play, this->skelAnime.skeleton, this->skelAnime.jointTable, this->skelAnime.dListCount,
@@ -686,25 +700,26 @@ void EnPoComposer_Draw(Actor* thisx, PlayState* play) {
Gfx_SetupDL25_Opa(play->state.gfxCtx);
Gfx_SetupDL25_Xlu(play->state.gfxCtx);
- gSPSegment(POLY_XLU_DISP++, 0x08,
- Gfx_EnvColor(play->state.gfxCtx, this->lightColor.r, this->lightColor.g, this->lightColor.b,
- this->lightColor.a));
+ gSPSegment(
+ POLY_XLU_DISP++, 0x08,
+ Gfx_EnvColor(play->state.gfxCtx, this->eyeColor.r, this->eyeColor.g, this->eyeColor.b, this->eyeColor.a));
gSPSegment(
POLY_XLU_DISP++, 0x0A,
- Gfx_EnvColor(play->state.gfxCtx, clothingColor->r, clothingColor->g, clothingColor->b, this->lightColor.a));
+ Gfx_EnvColor(play->state.gfxCtx, clothingColor->r, clothingColor->g, clothingColor->b, this->mainAlpha.a));
gSPSegment(POLY_XLU_DISP++, 0x0B,
- Gfx_EnvColor(play->state.gfxCtx, var_t0->r, var_t0->g, var_t0->b, this->lightColor.a));
- gSPSegment(POLY_XLU_DISP++, 0x0C, D_801AEF88);
+ Gfx_EnvColor(play->state.gfxCtx, clothingColor2->r, clothingColor2->g, clothingColor2->b,
+ this->mainAlpha.a));
+ gSPSegment(POLY_XLU_DISP++, 0x0C, D_801AEF88); // transparency DL
POLY_XLU_DISP =
SkelAnime_DrawFlex(play, this->skelAnime.skeleton, this->skelAnime.jointTable, this->skelAnime.dListCount,
EnPoComposer_OverrideLimbDraw, EnPoComposer_PostLimbDraw, &this->actor, POLY_XLU_DISP);
}
- if (this->lightColor.a != 0) {
+ if (this->mainAlpha.a != 0) {
// Draw lantern if visible
- if (this->lightColor.a == 255) {
+ if (this->mainAlpha.a == 255) {
Scene_SetRenderModeXlu(play, 0, 1);
gfx = POLY_OPA_DISP;
} else {
@@ -713,7 +728,8 @@ void EnPoComposer_Draw(Actor* thisx, PlayState* play) {
}
gDPPipeSync(&gfx[0]);
- gDPSetEnvColor(&gfx[1], this->envColor.r, this->envColor.g, this->envColor.b, this->lightColor.a);
+ // Light color reused for lantern glass
+ gDPSetEnvColor(&gfx[1], this->lightColor.r, this->lightColor.g, this->lightColor.b, this->mainAlpha.a);
Matrix_Put(&this->lanternMtxF);
MATRIX_FINALIZE_AND_LOAD(&gfx[2], play->state.gfxCtx);
@@ -722,10 +738,10 @@ void EnPoComposer_Draw(Actor* thisx, PlayState* play) {
gSPDisplayList(&gfx[4], gPoeComposerLanternGlassDL);
gDPPipeSync(&gfx[5]);
- gDPSetEnvColor(&gfx[6], clothingColor->r, clothingColor->g, clothingColor->b, this->lightColor.a);
+ gDPSetEnvColor(&gfx[6], clothingColor->r, clothingColor->g, clothingColor->b, this->mainAlpha.a);
gSPDisplayList(&gfx[7], gPoeComposerLanternTopDL);
- if (this->lightColor.a == 255) {
+ if (this->mainAlpha.a == 255) {
POLY_OPA_DISP = &gfx[8];
} else {
POLY_XLU_DISP = &gfx[8];
@@ -739,8 +755,8 @@ void EnPoComposer_Draw(Actor* thisx, PlayState* play) {
lightPos.y += TRUNCF_BINANG(lightOffset.y);
lightPos.z += TRUNCF_BINANG(lightOffset.z);
- Lights_PointGlowSetInfo(&this->lightInfo, lightPos.x, lightPos.y, lightPos.z, this->envColor.r, this->envColor.g,
- this->envColor.b, this->envColor.a * (200.0f / 255.0f));
+ Lights_PointGlowSetInfo(&this->lightInfo, lightPos.x, lightPos.y, lightPos.z, this->lightColor.r,
+ this->lightColor.g, this->lightColor.b, this->lightColor.a * (200.0f / 255.0f));
CLOSE_DISPS(play->state.gfxCtx);
}
diff --git a/src/overlays/actors/ovl_En_Po_Composer/z_en_po_composer.h b/src/overlays/actors/ovl_En_Po_Composer/z_en_po_composer.h
index 7033d838b8..d0a8d8b56f 100644
--- a/src/overlays/actors/ovl_En_Po_Composer/z_en_po_composer.h
+++ b/src/overlays/actors/ovl_En_Po_Composer/z_en_po_composer.h
@@ -5,7 +5,7 @@
#include "assets/objects/object_po_composer/object_po_composer.h"
#define POE_COMPOSER_IS_FLAT(thisx) ((thisx)->params & 0x8000)
-#define POE_COMPOSER_4000(thisx) ((thisx)->params & 0x4000)
+#define POE_COMPOSER_SHARP_HEALED(thisx) ((thisx)->params & 0x4000)
typedef enum {
/* 1 */ POE_COMPOSER_CUEID_IDLE = 1,
@@ -22,8 +22,8 @@ typedef enum {
} EnPoComposerCueId;
typedef enum {
- /* 0 */ SHARP_CS_ENCOUNTER_FIRST,
- /* 1 */ SHARP_CS_ENCOUNTER_OTHER,
+ /* 0 */ SHARP_CS_ENCOUNTER_HEALED_TALK,
+ /* 1 */ SHARP_CS_ENCOUNTER_AGRO_TALK,
/* 2 */ SHARP_CS_SONG_HEALING,
/* 3 */ SHARP_CS_SONG_STORMS,
/* 4 */ SHARP_CS_MAX
@@ -53,8 +53,11 @@ typedef struct EnPoComposer {
/* 0x330 */ s16 inCutscene;
/* 0x332 */ s16 visible;
/* 0x334 */ u16 cueId;
- /* 0x336 */ Color_RGBA8 lightColor;
- /* 0x33A */ Color_RGBA8 envColor;
+ /* 0x336 */ union {
+ Color_RGBA8 mainAlpha; // the alpha is used as general alpha for the whole body
+ Color_RGBA8 eyeColor; // also used for robe bottom
+ };
+ /* 0x33A */ Color_RGBA8 lightColor; // used by lantern light, and lantern glass tint
} EnPoComposer; // size = 0x340
#endif // Z_EN_PO_COMPOSER_H
diff --git a/src/overlays/actors/ovl_En_Railgibud/z_en_railgibud.c b/src/overlays/actors/ovl_En_Railgibud/z_en_railgibud.c
index ae658e0a12..3c168c5fdd 100644
--- a/src/overlays/actors/ovl_En_Railgibud/z_en_railgibud.c
+++ b/src/overlays/actors/ovl_En_Railgibud/z_en_railgibud.c
@@ -273,7 +273,7 @@ void EnRailgibud_Init(Actor* thisx, PlayState* play) {
Collider_InitCylinder(play, &this->collider);
Collider_SetCylinder(play, &this->collider, &this->actor, &sCylinderInit);
CollisionCheck_SetInfo2(&this->actor.colChkInfo, &sDamageTable, &sColChkInfoInit);
- if (CHECK_WEEKEVENTREG(WEEKEVENTREG_14_04)) {
+ if (CHECK_WEEKEVENTREG(WEEKEVENTREG_IKANA_SPRING_RESTORED)) {
Actor_Kill(&this->actor);
}
diff --git a/tools/disasm/n64-us/functions.txt b/tools/disasm/n64-us/functions.txt
index 72ac32155a..c81547ca8f 100644
--- a/tools/disasm/n64-us/functions.txt
+++ b/tools/disasm/n64-us/functions.txt
@@ -15564,9 +15564,9 @@ EnPoComposer_SetupRoll = 0x80BC5898; // type:func
EnPoComposer_Roll = 0x80BC58E0; // type:func
EnPoComposer_SharpCutsceneDone = 0x80BC59BC; // type:func
EnPoComposer_UpdateAction = 0x80BC59EC; // type:func
-EnPoComposer_StepLightAlpha = 0x80BC5CC8; // type:func
-EnPoComposer_StepLightColor = 0x80BC5D34; // type:func
-EnPoComposer_UpdateEnvColor = 0x80BC5DEC; // type:func
+EnPoComposer_StepMainAlpha = 0x80BC5CC8; // type:func
+EnPoComposer_StepEyeColor = 0x80BC5D34; // type:func
+EnPoComposer_UpdateLightColor = 0x80BC5DEC; // type:func
EnPoComposer_UpdateCollision = 0x80BC5FE8; // type:func
EnPoComposer_Update = 0x80BC6048; // type:func
EnPoComposer_OverrideLimbDraw = 0x80BC60BC; // type:func
diff --git a/tools/overlayhelpers/mscriptdis.py b/tools/overlayhelpers/mscriptdis.py
index d82ccf7670..8369e3f8d9 100644
--- a/tools/overlayhelpers/mscriptdis.py
+++ b/tools/overlayhelpers/mscriptdis.py
@@ -174,8 +174,8 @@ week_event_reg = {
(13 << 8) | 0x40: "WEEKEVENTREG_RECEIVED_OCEANSIDE_WALLET_UPGRADE",
(13 << 8) | 0x80: "WEEKEVENTREG_OCEANSIDE_SPIDER_HOUSE_COLLECTED_REWARD",
(14 << 8) | 0x01: "WEEKEVENTREG_14_01",
- (14 << 8) | 0x02: "WEEKEVENTREG_14_02",
- (14 << 8) | 0x04: "WEEKEVENTREG_14_04",
+ (14 << 8) | 0x02: "WEEKEVENTREG_SHARP_HOSTILE_CONVERSATION",
+ (14 << 8) | 0x04: "WEEKEVENTREG_IKANA_SPRING_RESTORED",
(14 << 8) | 0x08: "WEEKEVENTREG_DRANK_CHATEAU_ROMANI",
(14 << 8) | 0x10: "WEEKEVENTREG_WON_DEKU_PLAYGROUND_DAY_1",
(14 << 8) | 0x20: "WEEKEVENTREG_WON_DEKU_PLAYGROUND_DAY_2",
diff --git a/tools/weekeventregconvert.py b/tools/weekeventregconvert.py
index e975f48120..2ca67f4666 100755
--- a/tools/weekeventregconvert.py
+++ b/tools/weekeventregconvert.py
@@ -117,8 +117,8 @@ weekEventReg = {
(13 << 8) | 0x40: "WEEKEVENTREG_RECEIVED_OCEANSIDE_WALLET_UPGRADE",
(13 << 8) | 0x80: "WEEKEVENTREG_OCEANSIDE_SPIDER_HOUSE_COLLECTED_REWARD",
(14 << 8) | 0x01: "WEEKEVENTREG_14_01",
- (14 << 8) | 0x02: "WEEKEVENTREG_14_02",
- (14 << 8) | 0x04: "WEEKEVENTREG_14_04",
+ (14 << 8) | 0x02: "WEEKEVENTREG_SHARP_HOSTILE_CONVERSATION",
+ (14 << 8) | 0x04: "WEEKEVENTREG_IKANA_SPRING_RESTORED",
(14 << 8) | 0x08: "WEEKEVENTREG_DRANK_CHATEAU_ROMANI",
(14 << 8) | 0x10: "WEEKEVENTREG_WON_DEKU_PLAYGROUND_DAY_1",
(14 << 8) | 0x20: "WEEKEVENTREG_WON_DEKU_PLAYGROUND_DAY_2",