diff --git a/linker_scripts/code_script.txt b/linker_scripts/code_script.txt index 69ddf04606..b0e931bfe0 100644 --- a/linker_scripts/code_script.txt +++ b/linker_scripts/code_script.txt @@ -2565,7 +2565,7 @@ SECTIONS build/src/overlays/actors/ovl_Obj_Lightswitch/z_obj_lightswitch.o(.text) build/src/overlays/actors/ovl_Obj_Lightswitch/z_obj_lightswitch.o(.data) build/src/overlays/actors/ovl_Obj_Lightswitch/z_obj_lightswitch.o(.rodata) - build/asm/overlays/ovl_Obj_Lightswitch_rodata.o(.rodata) + build/src/overlays/actors/ovl_Obj_Lightswitch/z_obj_lightswitch_overlay.o(.ovl) } SegmentEnd = .; SegmentSize = SegmentEnd - SegmentStart; diff --git a/linker_scripts/object_script.txt b/linker_scripts/object_script.txt index 4c8dd73f55..28d90d9704 100644 --- a/linker_scripts/object_script.txt +++ b/linker_scripts/object_script.txt @@ -549,9 +549,12 @@ D_06001180 = 0x06001180; D_06001A70 = 0x06001A70; /* z_obj_lightswitch */ -D_06000C20 = 0x6000C20; -D_06000420 = 0x6000420; -D_06001420 = 0x6001420; +D_06000260 = 0x06000260; +D_06000398 = 0x06000398; +D_06000408 = 0x06000408; +D_06000420 = 0x06000420; +D_06000C20 = 0x06000C20; +D_06001420 = 0x06001420; /* z_obj_milk_bin */ D_060004B0 = 0x060004B0; diff --git a/src/overlays/actors/ovl_Obj_Lightswitch/z_obj_lightswitch.c b/src/overlays/actors/ovl_Obj_Lightswitch/z_obj_lightswitch.c index f7727e46f6..bd0a66793f 100644 --- a/src/overlays/actors/ovl_Obj_Lightswitch/z_obj_lightswitch.c +++ b/src/overlays/actors/ovl_Obj_Lightswitch/z_obj_lightswitch.c @@ -20,6 +20,10 @@ void ObjLightSwitch_SetupDisabled(ObjLightswitch* this); void ObjLightSwitch_Disabled(ObjLightswitch* this, GlobalContext* globalCtx); void ObjLightswitch_Idle(ObjLightswitch* this, GlobalContext* globalCtx); +extern Gfx D_06000260[]; +extern Gfx D_06000398[]; +extern Gfx D_06000408[]; + const ActorInit Obj_Lightswitch_InitVars = { ACTOR_OBJ_LIGHTSWITCH, ACTORCAT_SWITCH, @@ -60,24 +64,15 @@ static ColliderJntSphInit sJntSphInit = { }; // different face addresses for (sleep -> waking -> awake) of light switch face -Gfx* lightswitchFaceGfx[] = { +static Gfx* sLightswitchFaceGfx[] = { D_06000C20, D_06000420, D_06001420, }; -Color_RGBA8 lightswitchEffectPrimColor = { - 0xFF, - 0xFF, - 0xA0, - 0xA0, -}; -Color_RGBA8 lightswitchEffectEnvColor = { - 0xFF, - 0x0, - 0x0, - 0x0, -}; +static Color_RGBA8 sLightswitchEffectPrimColor = { 255, 255, 160, 160 }; + +static Color_RGBA8 sLightswitchEffectEnvColor = { 255, 0, 0, 0 }; static InitChainEntry sInitChain[] = { ICHAIN_VEC3F_DIV1000(scale, 100, ICHAIN_CONTINUE), @@ -91,7 +86,7 @@ void ObjLightswitch_InitCollider(ObjLightswitch* this, GlobalContext* globalCtx) Collider_InitJntSph(globalCtx, &this->collider); Collider_SetJntSph(globalCtx, &this->collider, &this->actor, &sJntSphInit, &this->elements); - this->actor.colChkInfo.mass = 0xFF; + this->actor.colChkInfo.mass = MASS_IMMOVABLE; SysMatrix_SetStateRotationAndTranslation( this->actor.world.pos.x, this->actor.world.pos.y + (this->actor.shape.yOffset * this->actor.scale.y), this->actor.world.pos.z, &this->actor.shape.rot); @@ -109,89 +104,58 @@ void ObjLightswitch_UpdateSwitchFlags(ObjLightswitch* this, GlobalContext* globa } } -#if NON_EQUIVELENT -// issues: a lot of ordering issues leading up to the big effect spawn function call -// there are a lot of temps, some might have been removed that were required by accident -// however, constantly on the edge of stack oversize, so something has to go void ObjLightswitch_SpawnEffects(ObjLightswitch* this, GlobalContext* globalCtx) { Vec3f effectPos; f32 sinResult; f32 cosResult; f32 tempResult; - f32 tempResult2; // must exist because of condition assignemt? - f32 tempResult_shorter; // tempResult - 30 - f32 randomOutput; - f32 tempResult5; + f32 tempResultDiff; + f32 rand; + s32 alpha; sinResult = Math_SinS(this->actor.shape.rot.y); cosResult = Math_CosS(this->actor.shape.rot.y); - if (this->colorAlpha >= 0x1900) { - // late rodata: 6.127451e-05f = 1 / 16320 ? - tempResult = (1.0f - (this->colorAlpha * 6.127451e-05f)) * 400.0f; + alpha = this->colorAlpha; - if (tempResult > 60.0f) { - tempResult2 = 60.0f; - } else { - tempResult2 = tempResult; - } - - tempResult = Rand_ZeroOne() * ((tempResult2 - 30.0f) + 30.0f); - tempResult_shorter = tempResult - 30.0f; + if (alpha >= (100 << 6)) { + tempResult = (1.0f - (alpha * (1.0f / (255 << 6)))) * 400.0f; + tempResult = ((CLAMP_MAX(tempResult, 60.0f) - 30.0f) + 30.0f) * Rand_ZeroOne(); + tempResultDiff = tempResult - 30.0f; if (tempResult > 30.0f) { tempResult = 30.0f; } else { - tempResult = 900.0f - SQ(tempResult_shorter); - if (tempResult < 100.0f) { - tempResult = 100.0f; - } + tempResult = SQ(30.0f) - SQ(tempResultDiff); + tempResult = CLAMP_MIN(tempResult, SQ(10.0f)); tempResult = sqrtf(tempResult); } - tempResult5 = 2.0f * ((Rand_ZeroOne() - 0.5f) * tempResult); + tempResult = 2.0f * ((Rand_ZeroOne() - 0.5f) * tempResult); + rand = ((30.0f - fabsf(tempResult)) * 0.5f) + (Rand_ZeroOne() * 10.0f); - // permuter seems to think something could be added to fix ordering here, but doesn't fix enough - // goto dummy_label_809848; dummy_label_809848: ; // minor regalloc fix - // if (cosResult){} // minor regalloc fix, but breaks some code + effectPos.x = this->actor.world.pos.x + ((rand * sinResult) + (tempResult * cosResult)); + effectPos.y = this->actor.world.pos.y + tempResultDiff + 10.0f; + effectPos.z = this->actor.world.pos.z + ((rand * cosResult) - (tempResult * sinResult)); - // saving fabsf result as a temp might help, but need to reduce temps - // fabsResult = fabsf(tempResult5); - // randomOutput = (Rand_ZeroOne() * 10.0f) + ((30.0f - fabsResult) * 0.5f); - // randomOutput = fabsf(tempResult5); - // randomOutput = (Rand_ZeroOne() * 10.0f) + ((30.0f - randomOutput) * 0.5f); - randomOutput = (Rand_ZeroOne() * 10.0f) + ((30.0f - fabsf(tempResult5)) * 0.5f); - - effectPos.x = this->actor.world.pos.x + ((randomOutput * sinResult) + (tempResult5 * cosResult)); - effectPos.y = this->actor.world.pos.y + tempResult_shorter + 10.0f; - effectPos.z = this->actor.world.pos.z + ((randomOutput * cosResult) - (tempResult5 * sinResult)); - // weirdly, using a temp here make a big difference, but.. is that right? just one temp? prob ordering issue - // above - // tempResult = this->actor.world.pos.z + ((randomOutput * cosResult) - (tempResult5 * sinResult)); - // effectPos.z = tempResult; - - EffectSsDeadDb_Spawn(globalCtx, &effectPos, &D_801D15B0, &D_801D15B0, &lightswitchEffectPrimColor, - &lightswitchEffectEnvColor, 100, 0, 9); + EffectSsDeadDb_Spawn(globalCtx, &effectPos, &D_801D15B0, &D_801D15B0, &sLightswitchEffectPrimColor, + &sLightswitchEffectEnvColor, 100, 0, 9); } } -#else -void ObjLightswitch_SpawnEffects(ObjLightswitch* this, GlobalContext* globalCtx); -#pragma GLOBAL_ASM("./asm/non_matchings/overlays/ovl_Obj_Lightswitch_0x8095FBF0/ObjLightswitch_SpawnEffects.asm") -#endif void ObjLightswitch_Init(Actor* thisx, GlobalContext* globalCtx) { ObjLightswitch* this = THIS; s32 pad; - u32 switchFlagResult; + u32 isSwitchActivated; s32 isTriggered; - switchFlagResult = Flags_GetSwitch(globalCtx, GET_LIGHTSWITCH_SWITCHFLAG(this)); - isTriggered = 0; + isSwitchActivated = Flags_GetSwitch(globalCtx, GET_LIGHTSWITCH_SWITCHFLAG(this)); + isTriggered = false; Actor_ProcessInitChain(&this->actor, sInitChain); Actor_SetHeight(&this->actor, 0.0f); - if (switchFlagResult != 0) { + if (isSwitchActivated) { if (GET_LIGHTSWITCH_TYPE(this) == LIGHTSWITCH_TYPE_FAKE) { - isTriggered = 1; + isTriggered = true; } else { ObjLightSwitch_SetupEnabled(this); } @@ -235,10 +199,10 @@ void ObjLightswitch_PlayCinema(ObjLightswitch* this, GlobalContext* globalCtx) { void ObjLightswitch_SetupIdle(ObjLightswitch* this) { this->faceState = LIGHTSWITCH_FACE_ASLEEP; - this->colorR = 0x26C0; - this->colorG = 0x1F40; - this->colorB = 0x3FC0; - this->colorAlpha = 0x3FC0; + this->colorR = 155 << 6; + this->colorG = 125 << 6; + this->colorB = 255 << 6; + this->colorAlpha = 255 << 6; this->actionFunc = ObjLightswitch_Idle; } @@ -271,8 +235,8 @@ void ObjLightSwitch_Asleep(ObjLightswitch* this, GlobalContext* globalCtx) { Math_StepToS(&this->edgeRotSpeed, -0xAA, 0xA); this->edgeRot += this->edgeRotSpeed; - this->colorR = (this->colorShiftTimer * 0x140) + 0x26C0; - this->colorG = (this->colorShiftTimer * 0x1A0) + 0x1F40; + this->colorR = (this->colorShiftTimer * (5 << 6)) + (155 << 6); + this->colorG = (this->colorShiftTimer * ((6 << 6) + 32)) + (125 << 6); if (this->colorShiftTimer >= 20) { ObjLightSwitch_SetupEnabled(this); @@ -284,10 +248,10 @@ void ObjLightSwitch_Asleep(ObjLightswitch* this, GlobalContext* globalCtx) { void ObjLightSwitch_SetupEnabled(ObjLightswitch* this) { this->faceState = LIGHTSWITCH_FACE_FULLAWAKE; - this->colorR = 0x3FC0; - this->colorG = 0x3FC0; - this->colorB = 0x3FC0; - this->colorAlpha = 0x3FC0; + this->colorR = 255 << 6; + this->colorG = 255 << 6; + this->colorB = 255 << 6; + this->colorAlpha = 255 << 6; this->edgeRotSpeed = -0xAA; this->colorShiftTimer = 0; this->actionFunc = ObjLightSwitch_Enabled; @@ -298,7 +262,7 @@ void ObjLightSwitch_Enabled(ObjLightswitch* this, GlobalContext* globalCtx) { if (actorType == LIGHTSWITCH_TYPE_REGULAR) { // switch can be disabled outside of this actor by flag - if (Flags_GetSwitch(globalCtx, GET_LIGHTSWITCH_SWITCHFLAG(this)) == 0) { + if (!Flags_GetSwitch(globalCtx, GET_LIGHTSWITCH_SWITCHFLAG(this))) { ObjLightSwitch_SetupDisabled(this); } } else if (actorType == LIGHTSWITCH_TYPE_FLIP) { @@ -311,7 +275,7 @@ void ObjLightSwitch_Enabled(ObjLightswitch* this, GlobalContext* globalCtx) { ObjLightswitch_UpdateSwitchFlags(this, globalCtx, 0); ObjLightSwitch_SetupDisabled(this); } else { - this->colorShiftTimer += 1; + this->colorShiftTimer++; } } else { this->colorShiftTimer = 0; @@ -329,8 +293,8 @@ void ObjLightSwitch_Disabled(ObjLightswitch* this, GlobalContext* globalCtx) { this->colorShiftTimer--; Math_StepToS(&this->edgeRotSpeed, 0, 0xA); this->edgeRot += this->edgeRotSpeed; - this->colorR = (this->colorShiftTimer * 0x140) + 0x26C0; - this->colorG = (this->colorShiftTimer * 0x1A0) + 0x1F40; + this->colorR = (this->colorShiftTimer * (5 << 6)) + (155 << 6); + this->colorG = (this->colorShiftTimer * ((6 << 6) + 32)) + (125 << 6); if (this->colorShiftTimer <= 0) { ObjLightswitch_SetupIdle(this); @@ -341,12 +305,12 @@ void ObjLightSwitch_Disabled(ObjLightswitch* this, GlobalContext* globalCtx) { } void ObjLightSwitch_SetupFade(ObjLightswitch* this) { - this->colorAlpha = 0x3FC0; + this->colorAlpha = 255 << 6; this->actionFunc = ObjLightSwitch_Fade; } void ObjLightSwitch_Fade(ObjLightswitch* this, GlobalContext* globalCtx) { - this->colorAlpha -= 0xC8; + this->colorAlpha -= 200; ObjLightswitch_SpawnEffects(this, globalCtx); // spawn burning fire effect if (this->colorAlpha < 0) { Actor_MarkForDeath(&this->actor); @@ -389,126 +353,88 @@ void ObjLightswitch_Update(Actor* thisx, GlobalContext* globalCtx) { } this->actionFunc(this, globalCtx); - if (this->actor.update != 0) { + if (this->actor.update != NULL) { this->previousACFlags = this->collider.base.acFlags; CollisionCheck_SetOC(globalCtx, &globalCtx->colChkCtx, &this->collider.base); CollisionCheck_SetAC(globalCtx, &globalCtx->colChkCtx, &this->collider.base); } } -#if NON_EQUIVELENT -// gDPSetEnvColor parameter load order is different than the order in which the value is built -// also massive regalloc probably caused by the above void ObjLightSwitch_DrawOpa(ObjLightswitch* this, GlobalContext* globalCtx) { + s32 pad; Vec3f tempPos; Vec3s tempRot; OPEN_DISPS(globalCtx->state.gfxCtx); func_8012C28C(globalCtx->state.gfxCtx); - - // temp_v0->words.w1 = ((((s32) this->colorB >> 6) & 0xFF) << 8) - //| (((s32) this->colorR >> 6) << 0x18) - //| ((((s32) this->colorG >> 6) & 0xFF) << 0x10) - //| (((s32) this->colorAlpha >> 6) & 0xFF); - // load order issues with loading this in the right order for the function - gDPSetEnvColor(POLY_OPA_DISP++, this->colorR >> 6, this->colorG >> 6, this->colorB >> 6, this->colorAlpha >> 6); - - gSPSegment(POLY_OPA_DISP++, 0x09, D_801AEFA0); + gDPSetEnvColor(POLY_OPA_DISP++, (u8)(this->colorR >> 6), (u8)(this->colorG >> 6), (0, (u8)(this->colorB >> 6)), (u8)(this->colorAlpha >> 6)); + gSPSegment(POLY_OPA_DISP++, 0x09, &D_801AEFA0); tempPos.x = this->actor.world.pos.x; tempPos.y = this->actor.world.pos.y + (this->actor.shape.yOffset * this->actor.scale.y); tempPos.z = this->actor.world.pos.z; - gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(globalCtx->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); - - gSPSegment(POLY_OPA_DISP++, 0x08, Lib_SegmentedToVirtual(D_80960BC4[this->faceState])); - - gSPDisplayList(POLY_OPA_DISP++, 0x6000260); + gSPSegment(POLY_OPA_DISP++, 0x08, Lib_SegmentedToVirtual(sLightswitchFaceGfx[this->faceState])); + gSPDisplayList(POLY_OPA_DISP++, D_06000260); tempRot.x = this->actor.shape.rot.x; tempRot.y = this->actor.shape.rot.y; tempRot.z = this->actor.shape.rot.z + this->edgeRot; - SysMatrix_SetStateRotationAndTranslation(tempPos.z, tempPos.y, tempPos.x, &tempRot); - Matrix_Scale(this->actor.scale.x, this->actor.scale.y, this->actor.scale.z, 1); - + SysMatrix_SetStateRotationAndTranslation(tempPos.x, tempPos.y, tempPos.z, &tempRot); + Matrix_Scale(this->actor.scale.x, this->actor.scale.y, this->actor.scale.z, MTXMODE_APPLY); gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(globalCtx->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); - - gSPDisplayList(POLY_OPA_DISP++, 0x6000398); + gSPDisplayList(POLY_OPA_DISP++, D_06000398); tempRot.z = this->actor.shape.rot.z - this->edgeRot; - SysMatrix_SetStateRotationAndTranslation(tempPos.z, tempPos.y, tempPos.x, &tempRot); - Matrix_Scale(this->actor.scale.x, this->actor.scale.y, this->actor.scale.z, 1); - + SysMatrix_SetStateRotationAndTranslation(tempPos.x, tempPos.y, tempPos.z, &tempRot); + Matrix_Scale(this->actor.scale.x, this->actor.scale.y, this->actor.scale.z, MTXMODE_APPLY); gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(globalCtx->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); - - gSPDisplayList(POLY_OPA_DISP++, 0x6000408); + gSPDisplayList(POLY_OPA_DISP++, D_06000408); CLOSE_DISPS(globalCtx->state.gfxCtx); } -#else -void ObjLightSwitch_DrawOpa(ObjLightswitch* this, GlobalContext* globalCtx); -#pragma GLOBAL_ASM("./asm/non_matchings/overlays/ovl_Obj_Lightswitch_0x8095FBF0/ObjLightSwitch_DrawOpa.asm") -#endif -#if NON_EQUIVELENT -// same issue as above void ObjLightSwitch_DrawXlu(ObjLightswitch* this, GlobalContext* globalCtx) { + s32 pad; Vec3f tempPos; Vec3s tempRot; OPEN_DISPS(globalCtx->state.gfxCtx); func_8012C2DC(globalCtx->state.gfxCtx); - - // temp_v0->words.w1 = ((((s32) this->colorB >> 6) & 0xFF) << 8) - //| (((s32) this->colorR >> 6) << 0x18) - //| ((((s32) this->colorG >> 6) & 0xFF) << 0x10) - //| (((s32) this->colorAlpha >> 6) & 0xFF); - gDPSetEnvColor(POLY_XLU_DISP++, this->colorR >> 6, this->colorG >> 6, this->colorB >> 6, this->colorAlpha >> 6); - - gSPSegment(POLY_XLU_DISP++, 0x09, D_801AEF88); + gDPSetEnvColor(POLY_XLU_DISP++, (u8)(this->colorR >> 6), (u8)(this->colorG >> 6), (0, (u8)(this->colorB >> 6)), (u8)(this->colorAlpha >> 6)); + gSPSegment(POLY_XLU_DISP++, 0x09, &D_801AEF88); tempPos.x = this->actor.world.pos.x; tempPos.y = this->actor.world.pos.y + (this->actor.shape.yOffset * this->actor.scale.y); tempPos.z = this->actor.world.pos.z; - gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(globalCtx->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); - - gSPSegment(POLY_XLU_DISP++, 0x08, Lib_SegmentedToVirtual(D_80960BC4[this->faceState])); - - gSPDisplayList(POLY_XLU_DISP++, 0x6000260); + gSPSegment(POLY_XLU_DISP++, 0x08, Lib_SegmentedToVirtual(sLightswitchFaceGfx[this->faceState])); + gSPDisplayList(POLY_XLU_DISP++, D_06000260); tempRot.x = this->actor.shape.rot.x; tempRot.y = this->actor.shape.rot.y; tempRot.z = this->actor.shape.rot.z + this->edgeRot; SysMatrix_SetStateRotationAndTranslation(tempPos.x, tempPos.y, tempPos.z, &tempRot); - Matrix_Scale(this->actor.scale.x, this->actor.scale.y, this->actor.scale.z, 1); - + Matrix_Scale(this->actor.scale.x, this->actor.scale.y, this->actor.scale.z, MTXMODE_APPLY); gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(globalCtx->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); - - gSPDisplayList(POLY_XLU_DISP++, 0x6000398); + gSPDisplayList(POLY_XLU_DISP++, D_06000398); tempRot.z = this->actor.shape.rot.z - this->edgeRot; SysMatrix_SetStateRotationAndTranslation(tempPos.x, tempPos.y, tempPos.z, &tempRot); - Matrix_Scale(this->actor.scale.x, this->actor.scale.y, this->actor.scale.z, 1); - + Matrix_Scale(this->actor.scale.x, this->actor.scale.y, this->actor.scale.z, MTXMODE_APPLY); gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(globalCtx->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); - - gSPDisplayList(POLY_XLU_DISP++, 0x6000408); + gSPDisplayList(POLY_XLU_DISP++, D_06000408); CLOSE_DISPS(globalCtx->state.gfxCtx); } -#else -void ObjLightSwitch_DrawXlu(ObjLightswitch* this, GlobalContext* globalCtx); -#pragma GLOBAL_ASM("./asm/non_matchings/overlays/ovl_Obj_Lightswitch_0x8095FBF0/ObjLightSwitch_DrawXlu.asm") -#endif void ObjLightswitch_Draw(Actor* thisx, GlobalContext* globalCtx) { ObjLightswitch* this = THIS; - s32 alpha = (this->colorAlpha >> 6) & 0xFF; + s32 alpha = (u8)(this->colorAlpha >> 6); - if ((GET_LIGHTSWITCH_TYPE(this) == LIGHTSWITCH_TYPE_FAKE) && (alpha > 0) && (alpha < 0xFF)) { + if ((GET_LIGHTSWITCH_TYPE(this) == LIGHTSWITCH_TYPE_FAKE) && (alpha > 0) && (alpha < 255)) { ObjLightSwitch_DrawXlu(this, globalCtx); } else { ObjLightSwitch_DrawOpa(this, globalCtx); diff --git a/tables/variables.txt b/tables/variables.txt index 18bd328e8f..30131e7480 100644 --- a/tables/variables.txt +++ b/tables/variables.txt @@ -9396,9 +9396,9 @@ 0x80960B70:("Obj_Lightswitch_InitVars","UNK_TYPE1","",0x1), 0x80960B90:("D_80960B90","UNK_TYPE1","",0x1), 0x80960BB4:("D_80960BB4","UNK_TYPE1","",0x1), - 0x80960BC4:("lightswitchFaceGfx","UNK_TYPE1","",0x1), - 0x80960BD0:("lightswitchEffectPrimColor","UNK_TYPE1","",0x1), - 0x80960BD4:("lightswitchEffectEnvColor","UNK_TYPE1","",0x1), + 0x80960BC4:("sLightswitchFaceGfx","UNK_TYPE1","",0x1), + 0x80960BD0:("sLightswitchEffectPrimColor","UNK_TYPE1","",0x1), + 0x80960BD4:("sLightswitchEffectEnvColor","UNK_TYPE1","",0x1), 0x80960BD8:("D_80960BD8","UNK_TYPE1","",0x1), 0x80960BF0:("D_80960BF0","f32","",0x4), 0x80960C00:("objLightswitchOverlayInfo","OverlayRelocationSection","",0x14),