summaryrefslogtreecommitdiff
path: root/src/d/d_kankyo.cpp
diff options
context:
space:
mode:
authorJasper St. Pierre <jstpierre@mecheye.net>2023-12-01 21:21:00 -0800
committerJasper St. Pierre <jstpierre@mecheye.net>2023-12-01 21:21:00 -0800
commit440287c60ce431cc17059945b1167494e82689e3 (patch)
tree8d98e28a6c50c43d1cd54540dd9353dc8813841f /src/d/d_kankyo.cpp
parent6f6c73dc8bdd7de2b21c24f1ec7f7310d589ff89 (diff)
d_kankyo work
Diffstat (limited to 'src/d/d_kankyo.cpp')
-rw-r--r--src/d/d_kankyo.cpp327
1 files changed, 282 insertions, 45 deletions
diff --git a/src/d/d_kankyo.cpp b/src/d/d_kankyo.cpp
index 13b8e881..44b41921 100644
--- a/src/d/d_kankyo.cpp
+++ b/src/d/d_kankyo.cpp
@@ -17,6 +17,7 @@
#include "f_op/f_op_kankyo.h"
#include "m_Do/m_Do_audio.h"
#include "m_Do/m_Do_ext.h"
+#include "m_Do/m_Do_lib.h"
#include "m_Do/m_Do_mtx.h"
#include "m_Do/m_Do_printf.h"
#include "MSL_C/math.h"
@@ -383,7 +384,7 @@ void envcolor_init() {
g_env_light.mVrboxSoraColGatherRatio = 1.0f;
g_env_light.mVrboxKumoColGatherRatio = 1.0f;
- g_env_light.mItemGetCol_chg = 0;
+ g_env_light.mColChgFlag = 0;
g_env_light.field_0xc34 = 0.0f;
g_env_light.field_0xc2c = 0.0f;
g_env_light.field_0xc30 = 0.0f;
@@ -2342,6 +2343,28 @@ int dKy_Create(void*) {
return cPhs_COMPLEATE_e;
}
+kankyo_method_class l_dKy_Method = {
+ (process_method_func)dKy_Create,
+ (process_method_func)dKy_Delete,
+ (process_method_func)dKy_Execute,
+ (process_method_func)dKy_IsDelete,
+ (process_method_func)dKy_Draw,
+};
+
+kankyo_process_profile_definition g_profile_KANKYO = {
+ fpcLy_CURRENT_e,
+ 1,
+ fpcPi_CURRENT_e,
+ PROC_KANKYO,
+ &g_fpcLf_Method.mBase,
+ sizeof(sub_kankyo__class),
+ 0,
+ 0,
+ &g_fopKy_Method,
+ 0x002,
+ &l_dKy_Method,
+};
+
/* 80194974-80194BDC .text dKy_setLight_init__Fv */
void dKy_setLight_init() {
for (s32 i = 0; i < 8; i++)
@@ -2375,22 +2398,27 @@ void dKy_setLight() {
f32 v;
if (pPlayer != NULL) {
- v = 0.0f;
if (envLight.mBaseLightInfluence.mPower > 0.0f)
v = envLight.mBaseLightInfluence.mPos.abs(pPlayer->current.pos) / envLight.mBaseLightInfluence.mPower;
+ else
+ v = 0.0f;
} else {
v = 1.0f;
}
- if (1000.0f < envLight.mBaseLightInfluence.mFluctuation) {
- if (v > 1.0f) v = 1.0f;
- v = (1.0f - v) * 20.0f;
- if (v > 1.0f) v = 1.0f;
+ f32 fluc = envLight.mBaseLightInfluence.mFluctuation;
+ if (fluc < 1000.0f) {
+ if (v > 1.0f)
+ v = 1.0f;
+ v = (1.0f - v);
+ v = v * 20.0f;
+ if (v > 1.0f)
+ v = 1.0f;
- f32 wave = 255.0f - (envLight.mBaseLightInfluence.mFluctuation / 3.0f) * v;
+ f32 wave = 255.0f - (fluc / 3.0f) * v;
cLib_addCalc2(&target, (255.0f - wave) * cM_rndF(1.0f) + wave, 0.4f, 20.0f);
} else {
- target = envLight.mBaseLightInfluence.mFluctuation - 1000.0f;
+ target = fluc - 1000.0f;
}
lightStatusPt[0].mColor.r = target;
@@ -2423,12 +2451,15 @@ void dKy_setLight() {
f32 fluc = dKy_eflight_influence_yuragi(eflight);
if (fluc < 1000.0f) {
- if (v > 1.0f) v = 1.0f;
- v = (1.0f - v) * 20.0f;
- if (v > 1.0f) v = 1.0f;
+ if (v > 1.0f)
+ v = 1.0f;
+ v = (1.0f - v);
+ v = v * 20.0f;
+ if (v > 1.0f)
+ v = 1.0f;
f32 wave = 255.0f - fluc * v;
- cLib_addCalc2(&target, wave + (255.0f - wave) * cM_rndF(1.0f), 0.4f, 20.0f);
+ cLib_addCalc2(&target, wave + (255.0f - wave) * cM_rndF(1.0f), 0.5f, 20.0f);
} else {
target = fluc - 1000.0f;
}
@@ -2740,31 +2771,227 @@ void dKy_fog_startendz_set(f32 i_startZ, f32 i_endZ, f32 ratio) {
/* 80195F3C-80195F64 .text dKy_Itemgetcol_chg_on__Fv */
void dKy_Itemgetcol_chg_on() {
- if (g_env_light.mItemGetCol_chg == 0 || g_env_light.mItemGetCol_chg == 6) {
- g_env_light.mItemGetCol_chg = 1;
+ if (g_env_light.mColChgFlag == 0 || g_env_light.mColChgFlag == 6) {
+ g_env_light.mColChgFlag = 1;
}
}
/* 80195F64-80195F84 .text dKy_Itemgetcol_chg_off__Fv */
void dKy_Itemgetcol_chg_off() {
- if (g_env_light.mItemGetCol_chg == 4) {
- g_env_light.mItemGetCol_chg = 5;
+ if (g_env_light.mColChgFlag == 4) {
+ g_env_light.mColChgFlag = 5;
}
}
/* 80195F84-80196284 .text dKy_Itemgetcol_chg_move__Fv */
void dKy_Itemgetcol_chg_move() {
- /* Nonmatching */
+ camera_class* camera = dComIfGp_getCamera(0);
+ dScnKy_env_light_c& envLight = dKy_getEnvlight();
+ fopAc_ac_c* player = dComIfGp_getPlayer(0);
+
+ switch (envLight.mColChgFlag)
+ {
+ case 0:
+ break;
+ case 1:
+ {
+ envLight.mColChgLight.mColor.r = 0x00;
+ envLight.mColChgFlag = 2;
+ }
+ break;
+ case 2:
+ {
+ cXyz pos = player->current.pos;
+ s16 offsAngle;
+ s16 offsY;
+ if (toon_proc_check()) {
+ offsAngle = 13000;
+ offsY = -70;
+ } else {
+ offsAngle = 23000;
+ offsY = 280;
+ }
+
+ cXyz camfwd;
+ dKyr_get_vectle_calc(&camera->mLookat.mEye, &camera->mLookat.mCenter, &camfwd);
+ f32 cam_distXZ = sqrtf(camfwd.x*camfwd.x + camfwd.z*camfwd.z);
+ s16 angle = cM_atan2s(camfwd.x, camfwd.z) - offsAngle;
+ camfwd.x = cM_scos(0) * cM_ssin(angle);
+ camfwd.y = cM_ssin(0);
+ camfwd.z = cM_scos(0) * cM_scos(angle);
+ pos.x += camfwd.x * 80.0f;
+ pos.z += camfwd.z * 80.0f;
+ pos.y += offsY;
+ envLight.mColChgLight.mPos = pos;
+ envLight.mColChgLight.mColor.r = 0x00;
+ envLight.mColChgLight.mColor.g = 0x00;
+ envLight.mColChgLight.mColor.b = 0x00;
+ envLight.mColChgLight.mPower = 1000.0f;
+ envLight.mColChgLight.mFluctuation = 0.0f;
+ dKy_plight_priority_set(&envLight.mColChgLight);
+ envLight.mColChgFlag = 3;
+ }
+ break;
+ case 3:
+ {
+ envLight.mColChgLight.mColor.r++;
+ if (envLight.mColChgLight.mColor.r > 25)
+ envLight.mColChgFlag = 4;
+ }
+ break;
+ case 4:
+ {
+ cLib_addCalc(&envLight.field_0xc34, 1.0f, 0.5f, 0.1f, 0.001f);
+ }
+ break;
+ case 5:
+ {
+ dKy_plight_cut(&envLight.mColChgLight);
+ envLight.mColChgFlag = 6;
+ }
+ break;
+ case 6:
+ {
+ cLib_addCalc(&envLight.field_0xc34, 0.0f, 0.5f, 0.1f, 0.001f);
+ if (envLight.field_0xc34 < 0.000001f) {
+ envLight.field_0xc34 = 0.0f;
+ envLight.mColChgFlag = 0;
+ }
+ }
+ break;
+ }
+
+ envLight.field_0xc98 = 0;
+ if ((envLight.mColChgFlag & 7) != 0) {
+ envLight.field_0xc98 = 1;
+ dKy_actor_addcol_amb_set(180 - envLight.mActorC0.r, 180 - envLight.mActorC0.g, 180 - envLight.mActorC0.b, envLight.field_0xc34);
+ dKy_actor_addcol_dif_set(0xFF, 0xFF, 0xFF, envLight.field_0xc34);
+ }
}
/* 80196284-801962E0 .text dKy_arrowcol_chg_on__FP4cXyzi */
-void dKy_arrowcol_chg_on(cXyz*, int) {
- /* Nonmatching */
+void dKy_arrowcol_chg_on(cXyz*, int mode) {
+ dScnKy_env_light_c& envLight = dKy_getEnvlight();
+
+ if (envLight.mColChgFlag != 0)
+ return;
+
+ if (mode == 0)
+ envLight.mColChgFlag = 0x10;
+ else if (mode == 1)
+ envLight.mColChgFlag = 0x20;
+ else if (mode == 2)
+ envLight.mColChgFlag = 0x30;
+ else
+ envLight.mColChgFlag = 0x10;
}
/* 801962E0-80196764 .text dKy_arrowcol_chg_move__Fv */
void dKy_arrowcol_chg_move() {
- /* Nonmatching */
+ /* Nonmatching - regalloc */
+ dScnKy_env_light_c& envLight = dKy_getEnvlight();
+ s16 amb[3], dif[3];
+ s16 bg3_amb[3], bg3_dif[3];
+
+ switch (envLight.mColChgFlag) {
+ case 0x10:
+ case 0x40:
+ {
+ amb[0] = 0xBE;
+ amb[1] = 0x78;
+ amb[2] = 0x78;
+ dif[0] = 0x3C;
+ dif[1] = 0x00;
+ dif[2] = 0x00;
+ }
+ break;
+ case 0x20:
+ case 0x50:
+ {
+ dif[0] = 0x3C;
+ dif[1] = 0x96;
+ dif[2] = 0xE6;
+ amb[0] = 0x32;
+ amb[1] = 0x41;
+ amb[2] = 0x50;
+ }
+ break;
+ case 0x30:
+ case 0x60:
+ {
+ amb[0] = 0x50;
+ amb[1] = 0x50;
+ amb[2] = 0x14;
+ dif[0] = 0x1E;
+ dif[1] = 0x1E;
+ dif[2] = 0x01;
+ if (strcmp(dComIfGp_getStartStageName(), "GTower") == 0) {
+ amb[0] = 0x45;
+ amb[1] = 0x1B;
+ amb[2] = 0x00;
+ dif[0] = 0x74;
+ dif[1] = 0x65;
+ dif[2] = 0x10;
+ }
+ }
+ break;
+ }
+
+ switch (envLight.mColChgFlag) {
+ case 0x10:
+ case 0x20:
+ case 0x30:
+ {
+ cLib_addCalc(&envLight.field_0xc34, 1.0f, 0.5f, 0.1f, 0.001f);
+ if (envLight.field_0xc34 >= 1.0f)
+ envLight.mColChgFlag = envLight.mColChgFlag + 0x30;
+ }
+ break;
+ case 0x40:
+ case 0x50:
+ case 0x60:
+ {
+ cLib_addCalc(&envLight.field_0xc34, 0.0f, 0.5f, 0.05f, 0.001f);
+ if (envLight.field_0xc34 < 0.000001f) {
+ envLight.field_0xc34 = 0.0f;
+ envLight.mColChgFlag = 0;
+ }
+ }
+ break;
+ }
+ if ((envLight.mColChgFlag & 0xF0) != 0) {
+ dKy_actor_addcol_amb_set(amb[0] - envLight.mActorC0.r, amb[1] - envLight.mActorC0.g, amb[2] - envLight.mActorC0.b, envLight.field_0xc34);
+ dKy_bg_addcol_amb_set(amb[0] - envLight.mBG0_C0.r, amb[1] - envLight.mBG0_C0.g, amb[2] - envLight.mBG0_C0.b, envLight.field_0xc34);
+ if (strcmp(dComIfGp_getStartStageName(), "GTower") != 0) {
+ dKy_bg1_addcol_amb_set(amb[0] - envLight.mBG1_C0.r, amb[1] - envLight.mBG1_C0.g, amb[2] - envLight.mBG1_C0.b, envLight.field_0xc34);
+ }
+ dKy_bg2_addcol_amb_set(amb[0] - envLight.mBG2_C0.r, amb[1] - envLight.mBG2_C0.g, amb[2] - envLight.mBG2_C0.b, envLight.field_0xc34);
+ bg3_amb[0] = amb[0] - envLight.mBG3_C0.r;
+ bg3_amb[1] = amb[1] - envLight.mBG3_C0.g;
+ bg3_amb[2] = amb[2] - envLight.mBG3_C0.b;
+ if (strcmp(dComIfGp_getStartStageName(), "GTower") == 0) {
+ bg3_amb[0] = 0xB7 - envLight.mBG3_C0.r;
+ bg3_amb[1] = 0xB0 - envLight.mBG3_C0.g;
+ bg3_amb[2] = 0x88 - envLight.mBG3_C0.b;
+ }
+
+ dKy_bg3_addcol_amb_set(bg3_amb[0], bg3_amb[1], bg3_amb[2], envLight.field_0xc34);
+ dKy_actor_addcol_dif_set(dif[0] - envLight.mActorK0.r, dif[1] - envLight.mActorK0.g, dif[2] - envLight.mActorK0.b, envLight.field_0xc34);
+ dKy_bg_addcol_dif_set(dif[0] - envLight.mBG0_K0.r, dif[1] - envLight.mBG0_K0.g, dif[2] - envLight.mBG0_K0.b, envLight.field_0xc34);
+ if (strcmp(dComIfGp_getStartStageName(), "GTower") != 0) {
+ dKy_bg1_addcol_dif_set(dif[0] - envLight.mBG1_K0.r, dif[1] - envLight.mBG1_K0.g, dif[2] - envLight.mBG1_K0.b, envLight.field_0xc34);
+ }
+ dKy_bg2_addcol_dif_set(dif[0] - envLight.mBG2_K0.r, dif[1] - envLight.mBG2_K0.g, dif[2] - envLight.mBG2_K0.b, envLight.field_0xc34);
+ bg3_dif[0] = dif[0] - envLight.mBG3_K0.r;
+ bg3_dif[1] = dif[1] - envLight.mBG3_K0.g;
+ bg3_dif[2] = dif[2] - envLight.mBG3_K0.b;
+ if (strcmp(dComIfGp_getStartStageName(), "GTower") == 0) {
+ bg3_dif[0] = 0x8A - envLight.mBG3_C0.r;
+ bg3_dif[1] = 0x8A - envLight.mBG3_C0.g;
+ bg3_dif[2] = 0x44 - envLight.mBG3_C0.b;
+ }
+ dKy_bg3_addcol_dif_set(bg3_dif[0], bg3_dif[1], bg3_dif[2], envLight.field_0xc34);
+ }
}
/* 80196764-801967C4 .text dKy_checkEventNightStop__Fv */
@@ -2788,8 +3015,31 @@ void dKy_Sound_init() {
}
/* 801967F4-801969A8 .text dKy_Sound_set__F4cXyziUii */
-void dKy_Sound_set(cXyz, int, unsigned int, int) {
+void dKy_Sound_set(cXyz pos, int p2, unsigned int p3, int p4) {
/* Nonmatching */
+ camera_class* camera = dComIfGp_getCamera(0);
+
+ BOOL ret = FALSE;
+ f32 newDist = pos.abs(camera->mLookat.mEye);
+ f32 curDist = dKy_getEnvlight().mSound.field_0x0.abs(camera->mLookat.mEye);
+
+ if (newDist < curDist) {
+ if (curDist < 1500.0f) {
+ ret = TRUE;
+ } else {
+ if (dKy_getEnvlight().mSound.field_0xc < p2)
+ ret = TRUE;
+ }
+ }
+
+ if (ret) {
+ dKy_getEnvlight().mSound.field_0x0.x = pos.x;
+ dKy_getEnvlight().mSound.field_0x0.y = pos.y;
+ dKy_getEnvlight().mSound.field_0x0.z = pos.z;
+ dKy_getEnvlight().mSound.field_0xc = p2;
+ dKy_getEnvlight().mSound.field_0x14 = p3;
+ dKy_getEnvlight().mSound.field_0x10 = p4;
+ }
}
/* 801969A8-801969B8 .text dKy_Sound_get__Fv */
@@ -3188,8 +3438,17 @@ u32 dKy_moon_type_chk() {
}
/* 80197404-80197504 .text dKy_telescope_lookin_chk__FP4cXyzff */
-bool dKy_telescope_lookin_chk(cXyz* pPos, f32, f32) {
- /* Nonmatching */
+bool dKy_telescope_lookin_chk(cXyz* pPos, f32 maxDist, f32 minFov) {
+ bool ret = false;
+ if (dComIfGp_getScopeType() != 0 && dComIfGd_getView()->mFovy > minFov) {
+ cXyz proj;
+ cXyz center;
+ mDoLib_project((Vec*)pPos, &proj);
+ center.set(320.0f, 240.0f, 0.0f);
+ if (center.abs(proj) < maxDist)
+ ret = true;
+ }
+ return ret;
}
/* 80197504-80197558 .text dKy_moon_look_chk__Fv */
@@ -3283,25 +3542,3 @@ BOOL dKyr_player_overhead_bg_chk() {
return ret;
}
-
-kankyo_method_class l_dKy_Method = {
- (process_method_func)dKy_Create,
- (process_method_func)dKy_Delete,
- (process_method_func)dKy_Execute,
- (process_method_func)dKy_IsDelete,
- (process_method_func)dKy_Draw,
-};
-
-kankyo_process_profile_definition g_profile_KANKYO = {
- fpcLy_CURRENT_e,
- 1,
- fpcPi_CURRENT_e,
- PROC_KANKYO,
- &g_fpcLf_Method.mBase,
- sizeof(sub_kankyo__class),
- 0,
- 0,
- &g_fopKy_Method,
- 0x002,
- &l_dKy_Method,
-};