Files
ac-decomp/src/m_kankyo.c
T
2023-12-09 13:34:31 +01:00

2537 lines
72 KiB
C

#include "m_kankyo.h"
#include "m_room_type.h"
#include "m_scene_table.h"
#include "m_common_data.h"
#include "m_debug.h"
#include "m_npc_schedule.h"
#include "m_player_lib.h"
#define mEnv_TIME_TO_SECS(hour, min, sec) ((hour) * mTM_SECONDS_IN_HOUR + (min) * mTM_SECONDS_IN_MINUTE + (sec))
static int klight_chg_time[mEnv_TERM_NUM + 1] = {
mEnv_TIME_TO_SECS(0, 0, 0),
mEnv_TIME_TO_SECS(4, 0, 0),
mEnv_TIME_TO_SECS(6, 0, 0),
mEnv_TIME_TO_SECS(8, 0, 0),
mEnv_TIME_TO_SECS(12, 0, 0),
mEnv_TIME_TO_SECS(16, 0, 0),
mEnv_TIME_TO_SECS(18, 0, 0),
mEnv_TIME_TO_SECS(20, 0, 0),
mEnv_TIME_TO_SECS(24, 0, 0)
};
static BaseLight l_mEnv_kcolor_fine_data[mEnv_TERM_NUM] = {
/* 00:00 -> 03:59 */
{
{ 20, 10, 120 }, // ambient color
{ 73, 73, 73 }, // sun direction
{ 0, 0, 0 }, // sun color
{ 73, 73, 73 }, // moon direction
{ 120, 180, 80 }, // moon color
{ 20, 20, 80 }, // fog color
1799, // fog near
1000, // fog far
{ 0, 0, 50 }, // shadow color
{ 120, 160, 150 }, // room color
{ 120, 160, 150 }, // window sun color
{ 230, 230, 120 }, // window moon color
{ 28, 32, 92 } // background color
},
{
{ 0, 10, 120 }, // ambient color
{ 73, 73, 73 }, // sun direction
{ 0, 20, 40 }, // sun color
{ 73, 73, 73 }, // moon direction
{ 150, 200, 100 }, // moon color
{ 80, 100, 120 }, // fog color
1774, // fog near
1000, // fog far
{ 0, 0, 60 }, // shadow color
{ 140, 190, 190 }, // room color
{ 150, 170, 170 }, // window sun color
{ 230, 230, 120 }, // window moon color
{ 44, 52, 112 } // background color
},
{
{ 60, 60, 120 }, // ambient color
{ 73, 73, 73 }, // sun direction
{ 255, 255, 200 }, // sun color
{ 73, 73, 73 }, // moon direction
{ 10, 40, 60 }, // moon color
{ 120, 150, 150 }, // fog color
1749, // fog near
950, // fog far
{ 0, 10, 70 }, // shadow color
{ 180, 210, 210 }, // room color
{ 160, 180, 180 }, // window sun color
{ 230, 230, 120 }, // window moon color
{ 60, 76, 120 } // background color
},
{
{ 80, 80, 150 }, // ambient color
{ 73, 73, 73 }, // sun direction
{ 180, 220, 220 }, // sun color
{ 73, 73, 73 }, // moon direction
{ 0, 10, 20 }, // moon color
{ 80, 120, 150 }, // fog color
1749, // fog near
1000, // fog far
{ 0, 20, 70 }, // shadow color
{ 210, 240, 240 }, // room color
{ 190, 220, 220 }, // window sun color
{ 230, 230, 120 }, // window moon color
{ 56, 72, 140 } // background color
},
{
{ 80, 80, 150 }, // ambient color
{ 73, 73, 73 }, // sun direction
{ 200, 240, 240 }, // sun color
{ 73, 73, 73 }, // moon direction
{ 0, 0, 0 }, // moon color
{ 80, 120, 150 }, // fog color
1749, // fog near
1000, // fog far
{ 0, 30, 70 }, // shadow color
{ 220, 250, 250 }, // room color
{ 210, 240, 240 }, // window sun color
{ 230, 230, 120 }, // window moon color
{ 52, 78, 144 } // background color
},
{
{ 80, 80, 150 }, // ambient color
{ 73, 73, 73 }, // sun direction
{ 200, 240, 240 }, // sun color
{ 73, 73, 73 }, // moon direction
{ 10, 0, 30 }, // moon color
{ 80, 120, 150 }, // fog color
1749, // fog near
1000, // fog far
{ 0, 30, 90 }, // shadow color
{ 220, 250, 250 }, // room color
{ 220, 240, 240 }, // window sun color
{ 230, 230, 120 }, // window moon color
{ 48, 72, 140 } // background color
},
{
{ 60, 60, 150 }, // ambient color
{ 73, 73, 73 }, // sun direction
{ 200, 120, 0 }, // sun color
{ 73, 73, 73 }, // moon direction
{ 20, 0, 80 }, // moon color
{ 20, 20, 80 }, // fog color
1774, // fog near
1000, // fog far
{ 0, 10, 70 }, // shadow color
{ 190, 120, 120 }, // room color
{ 180, 120, 120 }, // window sun color
{ 230, 230, 120 }, // window moon color
{ 32, 32, 92 } // background color
},
{
{ 30, 30, 120 }, // ambient color
{ 73, 73, 73 }, // sun direction
{ 60, 60, 0 }, // sun color
{ 73, 73, 73 }, // moon direction
{ 120, 180, 80 }, // moon color
{ 20, 20, 80 }, // fog color
1774, // fog near
1000, // fog far
{ 0, 0, 60 }, // shadow color
{ 130, 160, 160 }, // room color
{ 180, 120, 120 }, // window sun color
{ 230, 230, 120 }, // window moon color
{ 28, 28, 92 } // background color
}
};
static BaseLight l_mEnv_kcolor_insect_fine_data[mEnv_TERM_NUM] = {
{
{ 12, 6, 72 }, // ambient color
{ 73, 73, 73 }, // sun direction
{ 0, 0, 0 }, // sun color
{ 73, 73, 73 }, // moon direction
{ 72, 108, 48 }, // moon color
{ 20, 20, 80 }, // fog color
1799, // fog near
1000, // fog far
{ 0, 0, 50 }, // shadow color
{ 72, 96, 90 }, // room color
{ 120, 160, 150 }, // window sun color
{ 230, 230, 120 }, // window moon color
{ 28, 32, 92 } // background color
},
{
{ 0, 6, 72 }, // ambient color
{ 73, 73, 73 }, // sun direction
{ 0, 12, 24 }, // sun color
{ 73, 73, 73 }, // moon direction
{ 90, 120, 60 }, // moon color
{ 80, 100, 120 }, // fog color
1774, // fog near
1000, // fog far
{ 0, 0, 60 }, // shadow color
{ 84, 114, 114 }, // room color
{ 150, 170, 170 }, // window sun color
{ 230, 230, 120 }, // window moon color
{ 44, 52, 112 } // background color
},
{
{ 36, 36, 72 }, // ambient color
{ 73, 73, 73 }, // sun direction
{ 153, 153, 120 }, // sun color
{ 73, 73, 73 }, // moon direction
{ 6, 24, 36 }, // moon color
{ 120, 150, 150 }, // fog color
1749, // fog near
950, // fog far
{ 0, 10, 70 }, // shadow color
{ 108, 126, 126 }, // room color
{ 160, 180, 180 }, // window sun color
{ 230, 230, 120 }, // window moon color
{ 60, 76, 120 } // background color
},
{
{ 80, 80, 150 }, // ambient color
{ 73, 73, 73 }, // sun direction
{ 180, 220, 220 }, // sun color
{ 73, 73, 73 }, // moon direction
{ 0, 10, 20 }, // moon color
{ 80, 120, 150 }, // fog color
1749, // fog near
1000, // fog far
{ 0, 20, 70 }, // shadow color
{ 210, 240, 240 }, // room color
{ 190, 220, 220 }, // window sun color
{ 230, 230, 120 }, // window moon color
{ 56, 72, 140 } // background color
},
{
{ 80, 80, 150 }, // ambient color
{ 73, 73, 73 }, // sun direction
{ 200, 240, 240 }, // sun color
{ 73, 73, 73 }, // moon direction
{ 0, 0, 0 }, // moon color
{ 80, 120, 150 }, // fog color
1749, // fog near
1000, // fog far
{ 0, 30, 70 }, // shadow color
{ 220, 250, 250 }, // room color
{ 210, 240, 240 }, // window sun color
{ 230, 230, 120 }, // window moon color
{ 52, 78, 144 } // background color
},
{
{ 80, 80, 150 }, // ambient color
{ 73, 73, 73 }, // sun direction
{ 200, 240, 240 }, // sun color
{ 73, 73, 73 }, // moon direction
{ 10, 0, 30 }, // moon color
{ 80, 120, 150 }, // fog color
1749, // fog near
1000, // fog far
{ 0, 30, 90 }, // shadow color
{ 220, 250, 250 }, // room color
{ 220, 240, 240 }, // window sun color
{ 230, 230, 120 }, // window moon color
{ 48, 72, 140 } // background color
},
{
{ 36, 36, 90 }, // ambient color
{ 73, 73, 73 }, // sun direction
{ 120, 72, 0 }, // sun color
{ 73, 73, 73 }, // moon direction
{ 12, 0, 48 }, // moon color
{ 20, 20, 80 }, // fog color
1774, // fog near
1000, // fog far
{ 0, 10, 70 }, // shadow color
{ 114, 72, 72 }, // room color
{ 180, 120, 120 }, // window sun color
{ 230, 230, 120 }, // window moon color
{ 32, 32, 92 } // background color
},
{
{ 18, 18, 72 }, // ambient color
{ 73, 73, 73 }, // sun direction
{ 36, 36, 0 }, // sun color
{ 73, 73, 73 }, // moon direction
{ 72, 108, 48 }, // moon color
{ 20, 20, 80 }, // fog color
1774, // fog near
1000, // fog far
{ 0, 0, 60 }, // shadow color
{ 78, 96, 96 }, // room color
{ 180, 120, 120 }, // window sun color
{ 230, 230, 120 }, // window moon color
{ 28, 28, 92 } // background color
}
};
static BaseLight l_mEnv_kcolor_rain_data[mEnv_TERM_NUM] = {
{
{ 18, 9, 108 }, // ambient color
{ 73, 73, 73 }, // sun direction
{ 0, 0, 0 }, // sun color
{ 73, 73, 73 }, // moon direction
{ 108, 162, 72 }, // moon color
{ 20, 20, 80 }, // fog color
1799, // fog near
1000, // fog far
{ 0, 0, 50 }, // shadow color
{ 108, 144, 135 }, // room color
{ 120, 160, 150 }, // window sun color
{ 230, 230, 120 }, // window moon color
{ 28, 32, 92 } // background color
},
{
{ 0, 9, 108 }, // ambient color
{ 73, 73, 73 }, // sun direction
{ 0, 18, 36 }, // sun color
{ 73, 73, 73 }, // moon direction
{ 135, 180, 90 }, // moon color
{ 80, 100, 120 }, // fog color
1774, // fog near
1000, // fog far
{ 0, 0, 60 }, // shadow color
{ 126, 171, 171 }, // room color
{ 150, 170, 170 }, // window sun color
{ 230, 230, 120 }, // window moon color
{ 44, 52, 112 } // background color
},
{
{ 54, 54, 108 }, // ambient color
{ 73, 73, 73 }, // sun direction
{ 229, 229, 180 }, // sun color
{ 73, 73, 73 }, // moon direction
{ 9, 36, 54 }, // moon color
{ 120, 150, 150 }, // fog color
1749, // fog near
950, // fog far
{ 0, 10, 70 }, // shadow color
{ 162, 189, 189 }, // room color
{ 160, 180, 180 }, // window sun color
{ 230, 230, 120 }, // window moon color
{ 60, 76, 120 } // background color
},
{
{ 72, 72, 135 }, // ambient color
{ 73, 73, 73 }, // sun direction
{ 162, 198, 198 }, // sun color
{ 73, 73, 73 }, // moon direction
{ 0, 9, 18 }, // moon color
{ 80, 120, 150 }, // fog color
1749, // fog near
1000, // fog far
{ 0, 20, 70 }, // shadow color
{ 189, 216, 216 }, // room color
{ 190, 220, 220 }, // window sun color
{ 230, 230, 120 }, // window moon color
{ 56, 72, 140 } // background color
},
{
{ 72, 72, 135 }, // ambient color
{ 73, 73, 73 }, // sun direction
{ 180, 216, 216 }, // sun color
{ 73, 73, 73 }, // moon direction
{ 0, 0, 0 }, // moon color
{ 80, 120, 150 }, // fog color
1749, // fog near
1000, // fog far
{ 0, 30, 70 }, // shadow color
{ 198, 225, 225 }, // room color
{ 210, 240, 240 }, // window sun color
{ 230, 230, 120 }, // window moon color
{ 52, 78, 144 } // background color
},
{
{ 72, 72, 135 }, // ambient color
{ 73, 73, 73 }, // sun direction
{ 180, 216, 216 }, // sun color
{ 73, 73, 73 }, // moon direction
{ 9, 0, 27 }, // moon color
{ 80, 120, 150 }, // fog color
1749, // fog near
1000, // fog far
{ 0, 30, 90 }, // shadow color
{ 198, 225, 225 }, // room color
{ 220, 240, 240 }, // window sun color
{ 230, 230, 120 }, // window moon color
{ 48, 72, 140 } // background color
},
{
{ 54, 54, 135 }, // ambient color
{ 73, 73, 73 }, // sun direction
{ 180, 108, 0 }, // sun color
{ 73, 73, 73 }, // moon direction
{ 18, 0, 72 }, // moon color
{ 20, 20, 80 }, // fog color
1774, // fog near
1000, // fog far
{ 0, 10, 70 }, // shadow color
{ 171, 108, 108 }, // room color
{ 180, 120, 120 }, // window sun color
{ 230, 230, 120 }, // window moon color
{ 32, 32, 92 } // background color
},
{
{ 27, 27, 108 }, // ambient color
{ 73, 73, 73 }, // sun direction
{ 54, 54, 0 }, // sun color
{ 73, 73, 73 }, // moon direction
{ 108, 162, 72 }, // moon color
{ 20, 20, 80 }, // fog color
1774, // fog near
1000, // fog far
{ 0, 0, 60 }, // shadow color
{ 117, 144, 144 }, // room color
{ 180, 120, 120 }, // window sun color
{ 230, 230, 120 }, // window moon color
{ 28, 28, 92 } // background color
}
};
static BaseLight l_mEnv_kcolor_insect_rain_data[mEnv_TERM_NUM] = {
{
{ 10, 5, 64 }, // ambient color
{ 73, 73, 73 }, // sun direction
{ 0, 0, 0 }, // sun color
{ 73, 73, 73 }, // moon direction
{ 64, 97, 43 }, // moon color
{ 20, 20, 80 }, // fog color
1799, // fog near
1000, // fog far
{ 0, 0, 50 }, // shadow color
{ 64, 86, 81 }, // room color
{ 120, 160, 150 }, // window sun color
{ 230, 230, 120 }, // window moon color
{ 28, 32, 92 } // background color
},
{
{ 0, 5, 64 }, // ambient color
{ 73, 73, 73 }, // sun direction
{ 0, 10, 21 }, // sun color
{ 73, 73, 73 }, // moon direction
{ 81, 108, 54 }, // moon color
{ 80, 100, 120 }, // fog color
1774, // fog near
1000, // fog far
{ 0, 0, 60 }, // shadow color
{ 75, 102, 102 }, // room color
{ 150, 170, 170 }, // window sun color
{ 230, 230, 120 }, // window moon color
{ 44, 52, 112 } // background color
},
{
{ 32, 32, 64 }, // ambient color
{ 73, 73, 73 }, // sun direction
{ 137, 137, 108 }, // sun color
{ 73, 73, 73 }, // moon direction
{ 5, 21, 32 }, // moon color
{ 120, 150, 150 }, // fog color
1749, // fog near
950, // fog far
{ 0, 10, 70 }, // shadow color
{ 97, 113, 113 }, // room color
{ 160, 180, 180 }, // window sun color
{ 230, 230, 120 }, // window moon color
{ 60, 76, 120 } // background color
},
{
{ 72, 72, 135 }, // ambient color
{ 73, 73, 73 }, // sun direction
{ 162, 198, 198 }, // sun color
{ 73, 73, 73 }, // moon direction
{ 0, 9, 18 }, // moon color
{ 80, 120, 150 }, // fog color
1749, // fog near
1000, // fog far
{ 0, 20, 70 }, // shadow color
{ 189, 216, 216 }, // room color
{ 190, 220, 220 }, // window sun color
{ 230, 230, 120 }, // window moon color
{ 56, 72, 140 } // background color
},
{
{ 72, 72, 135 }, // ambient color
{ 73, 73, 73 }, // sun direction
{ 180, 216, 216 }, // sun color
{ 73, 73, 73 }, // moon direction
{ 0, 0, 0 }, // moon color
{ 80, 120, 150 }, // fog color
1749, // fog near
1000, // fog far
{ 0, 30, 70 }, // shadow color
{ 198, 225, 225 }, // room color
{ 210, 240, 240 }, // window sun color
{ 230, 230, 120 }, // window moon color
{ 52, 78, 144 } // background color
},
{
{ 72, 72, 135 }, // ambient color
{ 73, 73, 73 }, // sun direction
{ 180, 216, 216 }, // sun color
{ 73, 73, 73 }, // moon direction
{ 9, 0, 27 }, // moon color
{ 80, 120, 150 }, // fog color
1749, // fog near
1000, // fog far
{ 0, 30, 90 }, // shadow color
{ 198, 225, 225 }, // room color
{ 220, 240, 240 }, // window sun color
{ 230, 230, 120 }, // window moon color
{ 48, 72, 140 } // background color
},
{
{ 32, 32, 81 }, // ambient color
{ 73, 73, 73 }, // sun direction
{ 108, 64, 0 }, // sun color
{ 73, 73, 73 }, // moon direction
{ 10, 0, 43 }, // moon color
{ 20, 20, 80 }, // fog color
1774, // fog near
1000, // fog far
{ 0, 10, 70 }, // shadow color
{ 102, 64, 64 }, // room color
{ 180, 120, 120 }, // window sun color
{ 230, 230, 120 }, // window moon color
{ 32, 32, 92 } // background color
},
{
{ 16, 16, 64 }, // ambient color
{ 73, 73, 73 }, // sun direction
{ 32, 32, 0 }, // sun color
{ 73, 73, 73 }, // moon direction
{ 64, 97, 43 }, // moon color
{ 20, 20, 80 }, // fog color
1774, // fog near
1000, // fog far
{ 0, 0, 60 }, // shadow color
{ 70, 86, 86 }, // room color
{ 180, 120, 120 }, // window sun color
{ 230, 230, 120 }, // window moon color
{ 28, 28, 92 } // background color
}
};
static BaseLight l_mEnv_kcolor_data_p_sel = {
{ 30, 30, 80 }, // ambient color
{ 0, 89, 79 }, // sun direction
{ 255, 255, 200 }, // sun color
{ 0, 185, 160 }, // moon direction
{ 0, 0, 0 }, // moon color
{ 100, 100, 120 }, // fog color
2000, // fog near
1280, // fog far
{ 0, 30, 70 }, // shadow color
{ 255, 255, 255 }, // room color
{ 0, 0, 0 }, // window sun color
{ 0, 0, 0 }, // window moon color
{ 22, 27, 94 } // background color
};
static BaseLight l_mEnv_kcolor_shop = {
{ 20, 10, 100 }, // ambient color
{ 0, 69, 97 }, // sun direction
{ 150, 160, 130 }, // sun color
{ 0, 223, 115 }, // moon direction
{ 50, 40, 20 }, // moon color
{ 100, 100, 120 }, // fog color
2000, // fog near
1280, // fog far
{ 0, 30, 70 }, // shadow color
{ 255, 255, 255 }, // room color
{ 0, 0, 0 }, // window sun color
{ 0, 0, 0 }, // window moon color
{ 22, 27, 94 } // background color
};
static BaseLight l_mEnv_kcolor_buggy = {
{ 30, 30, 30 }, // ambient color
{ 0, 69, 97 }, // sun direction
{ 0, 0, 0 }, // sun color
{ 0, 223, 115 }, // moon direction
{ 0, 60, 90 }, // moon color
{ 100, 100, 120 }, // fog color
2000, // fog near
1280, // fog far
{ 0, 20, 30 }, // shadow color
{ 175, 175, 155 }, // room color
{ 0, 0, 0 }, // window sun color
{ 0, 0, 0 }, // window moon color
{ 22, 27, 94 } // background color
};
static BaseLight l_mEnv_kcolor_broker = {
{ 20, 30, 40 }, // ambient color
{ 0, 69, 97 }, // sun direction
{ 100, 80, 80 }, // sun color
{ 0, 223, 115 }, // moon direction
{ 20, 10, 0 }, // moon color
{ 100, 100, 120 }, // fog color
2000, // fog near
1280, // fog far
{ 0, 0, 20 }, // shadow color
{ 140, 120, 120 }, // room color
{ 0, 0, 0 }, // window sun color
{ 0, 0, 0 }, // window moon color
{ 22, 27, 94 } // background color
};
static BaseLight l_mEnv_kcolor_kamakura = {
{ 50, 25, 20 }, // ambient color
{ 0, 69, 97 }, // sun direction
{ 50, 40, 5 }, // sun color
{ 0, 223, 115 }, // moon direction
{ 50, 80, 85 }, // moon color
{ 100, 100, 120 }, // fog color
2000, // fog near
1280, // fog far
{ 40, 50, 80 }, // shadow color
{ 250, 240, 160 }, // room color
{ 0, 0, 0 }, // window sun color
{ 0, 0, 0 }, // window moon color
{ 22, 27, 94 } // background color
};
static BaseLight l_mEnv_kcolor_museum_fossil = {
{ 50, 50, 60 }, // ambient color
{ 0, 69, 97 }, // sun direction
{ 60, 60, 80 }, // sun color
{ 0, 223, 115 }, // moon direction
{ 20, 10, 0 }, // moon color
{ 0, 0, 0 }, // fog color
2000, // fog near
1280, // fog far
{ 0, 10, 60 }, // shadow color
{ 255, 255, 255 }, // room color
{ 0, 0, 0 }, // window sun color
{ 0, 0, 0 }, // window moon color
{ 22, 27, 94 } // background color
};
static BaseLight l_mEnv_kcolor_museum_fish = {
{ 40, 50, 60 }, // ambient color
{ 0, 69, 97 }, // sun direction
{ 20, 30, 40 }, // sun color
{ 0, 223, 115 }, // moon direction
{ 0, 10, 20 }, // moon color
{ 0, 0, 0 }, // fog color
2000, // fog near
1280, // fog far
{ 0, 20, 30 }, // shadow color
{ 120, 90, 100 }, // room color
{ 0, 0, 0 }, // window sun color
{ 0, 0, 0 }, // window moon color
{ 22, 27, 94 } // background color
};
static BaseLight l_mEnv_kcolor_museum_picture = {
{ 30, 30, 60 }, // ambient color
{ 0, 69, 97 }, // sun direction
{ 120, 100, 80 }, // sun color
{ 0, 223, 115 }, // moon direction
{ 0, 10, 20 }, // moon color
{ 0, 0, 0 }, // fog color
2000, // fog near
1280, // fog far
{ 0, 10, 50 }, // shadow color
{ 255, 255, 255 }, // room color
{ 0, 0, 0 }, // window sun color
{ 0, 0, 0 }, // window moon color
{ 22, 27, 94 } // background color
};
static BaseLight l_mEnv_kcolor_basement = {
{ 35, 30, 25 }, // ambient color
{ 0, 69, 97 }, // sun direction
{ 0, 0, 0 }, // sun color
{ 0, 223, 115 }, // moon direction
{ 0, 0, 0 }, // moon color
{ 0, 0, 0 }, // fog color
2000, // fog near
1280, // fog far
{ 0, 5, 10 }, // shadow color
{ 53, 53, 33 }, // room color
{ 0, 0, 0 }, // window sun color
{ 0, 0, 0 }, // window moon color
{ 22, 27, 94 } // background color
};
static BaseLight l_mEnv_kcolor_lighthouse = {
{ 35, 30, 25 }, // ambient color
{ 0, 69, 97 }, // sun direction
{ 0, 0, 0 }, // sun color
{ 0, 223, 115 }, // moon direction
{ 0, 0, 0 }, // moon color
{ 0, 0, 0 }, // fog color
2000, // fog near
1280, // fog far
{ 0, 20, 30 }, // shadow color
{ 135, 125, 105 }, // room color
{ 0, 0, 0 }, // window sun color
{ 0, 0, 0 }, // window moon color
{ 0, 0, 0 } // background color
};
static BaseLight* l_mEnv_normal_kcolor_data[4] = {
l_mEnv_kcolor_fine_data, /* clear */
l_mEnv_kcolor_rain_data, /* rain */
l_mEnv_kcolor_rain_data, /* snow */
l_mEnv_kcolor_fine_data /* cherry blossoms */
};
static BaseLight* l_mEnv_normal_kcolor_insect_data[4] = {
l_mEnv_kcolor_insect_fine_data, /* clear */
l_mEnv_kcolor_insect_rain_data, /* rain */
l_mEnv_kcolor_insect_rain_data, /* snow */
l_mEnv_kcolor_insect_fine_data /* cherry blossoms */
};
typedef struct electric_light_s {
f32 point_light_percent;
u8 point_light_color[3];
s16 _08;
s16 now_weather;
s16 next_weather;
f32 change_weather_env_rate;
s16 light_animating_on;
s16 light_anime_frame;
int point_light_on_type;
int point_light_off_type;
f32 point_light_off_step;
s16 point_light_is_flame; /* flickering effect when non-zero */
f32 staffroll_fade_rate;
f32 sun_percent;
f32 shadow_adjust;
f32 windowlight_alpha;
Light_list* current_point_light;
s16 add_moon_color[3];
Light_list* point_light_list_buf[mEnv_POINT_LIGHT_NUM];
Lights point_lights[mEnv_POINT_LIGHT_NUM];
int switch_status;
f32 point_light_min;
f32 diffuse_light_effect_rate;
s16 _98;
s16 shadow_alpha;
f32 diffuse_adjust;
u8 shadow_alpha_adjust;
} mEnv_electric_light_c;
static mEnv_electric_light_c l_mEnv_electric_light;
static int mEnv_CheckNpcRoomPointLightNiceStatus();
static void mEnv_set_time(Kankyo* kankyo);
static void mEnv_MakeWindowLightAlpha(int enabled);
static void mEnv_InitWind();
static int mEnv_Pointlight_on_check();
static f32 mEnv_DiffuseLightEffectRate() {
if (mRmTp_GetNowSceneLightSwitchIndex() != -1) {
if (
!mSc_IS_SCENE_BASEMENT(Save_Get(scene_no)) &&
Save_Get(scene_no) != SCENE_LIGHTHOUSE &&
Save_Get(scene_no) != SCENE_TENT
) {
return 0.7f;
}
}
return l_mEnv_electric_light.diffuse_light_effect_rate;
}
#include "../src/m_kankyo_weather.c_inc"
extern void mEnv_regist_nature(Kankyo* kankyo, NATURE_PROC nature_proc, void* arg) {
kankyo->nature.proc = nature_proc;
kankyo->nature.arg = arg;
}
extern int mEnv_unregist_nature(Kankyo* kankyo, NATURE_PROC nature_proc) {
int res = FALSE;
if (nature_proc == kankyo->nature.proc) {
mEnv_regist_nature(kankyo, (NATURE_PROC)&none_proc1, NULL);
res = TRUE;
}
return res;
}
static int mEnv_GetNowRoomPointLightInfo(GAME_PLAY* play, s_xyz* pos, u8* color, s16* power, s16* is_flame) {
int res = TRUE;
switch (Common_Get(field_draw_type)) {
case FIELD_DRAW_TYPE_INDOORS:
{
color[0] = 160; // r
color[1] = 160; // g
color[2] = 160; // b
power[0] = 1000;
switch (Save_Get(scene_no)) {
case SCENE_MY_ROOM_S:
{
color[0] = 220; // r
color[1] = 220; // g
color[2] = 200; // b
pos->x = 120;
pos->y = 180;
pos->z = 180;
break;
}
case SCENE_MY_ROOM_M:
case SCENE_MY_ROOM_LL2:
{
color[0] = 220; // r
color[1] = 220; // g
color[2] = 200; // b
pos->x = 160;
pos->y = 180;
pos->z = 240;
break;
}
case SCENE_SHOP0:
case SCENE_POST_OFFICE:
{
color[0] = 220; // r
color[1] = 220; // g
color[2] = 200; // b
pos->x = 160;
pos->y = 180;
pos->z = 240;
break;
}
case SCENE_NPC_HOUSE:
case SCENE_COTTAGE_NPC:
{
pos->x = 160;
pos->y = 180;
pos->z = 240;
color[0] = 220; // r
color[1] = 220; // g
color[2] = 200; // b
break;
}
case SCENE_BUGGY:
{
pos->x = 160;
pos->y = 80;
pos->z = 200;
color[0] = 205; // r
color[1] = 165; // g
color[2] = 110; // b
power[0] = 155;
is_flame[0] = TRUE;
break;
}
case SCENE_MY_ROOM_BASEMENT_S:
case SCENE_MY_ROOM_BASEMENT_M:
case SCENE_MY_ROOM_BASEMENT_L:
case SCENE_MY_ROOM_BASEMENT_LL1:
{
color[0] = 220; // r
color[1] = 190; // g
color[2] = 190; // b
pos->x = 200;
pos->y = 220;
pos->z = 300;
break;
}
case SCENE_MY_ROOM_L:
case SCENE_MY_ROOM_LL1:
case SCENE_COTTAGE_MY:
{
color[0] = 220; // r
color[1] = 220; // g
color[2] = 200; // b
pos->x = 200;
pos->y = 220;
pos->z = 300;
break;
}
case SCENE_POLICE_BOX:
{
color[0] = 220; // r
color[1] = 220; // g
color[2] = 200; // b
pos->x = 200;
pos->y = 220;
pos->z = 300;
break;
}
case SCENE_KAMAKURA:
{
pos->x = 160;
pos->y = 80;
pos->z = 38;
color[0] = 250; // r
color[1] = 240; // g
color[2] = 120; // b
power[0] = 300;
is_flame[0] = TRUE;
break;
}
case SCENE_MUSEUM_ENTRANCE:
{
color[0] = 220; // r
color[1] = 220; // g
color[2] = 200; // b
pos->x = 240;
pos->y = 220;
pos->z = 280;
break;
}
case SCENE_MUSEUM_ROOM_PAINTING:
{
color[0] = 180; // r
color[1] = 180; // g
color[2] = 150; // b
pos->x = 320;
pos->y = 220;
pos->z = 280;
power[0] = 800;
break;
}
case SCENE_MUSEUM_ROOM_FOSSIL:
{
color[0] = 200; // r
color[1] = 200; // g
color[2] = 180; // b
pos->x = 320;
pos->y = 220;
pos->z = 280;
power[0] = 800;
break;
}
case SCENE_MUSEUM_ROOM_INSECT:
{
color[0] = 50; // r
color[1] = 50; // g
color[2] = 50; // b
pos->x = 280;
pos->y = 220;
pos->z = 320;
break;
}
case SCENE_MUSEUM_ROOM_FISH:
{
pos->x = 320;
pos->y = 220;
pos->z = 320;
color[0] = 100; // r
color[1] = 120; // g
color[2] = 130; // b
break;
}
case SCENE_NEEDLEWORK:
{
color[0] = 220; // r
color[1] = 220; // g
color[2] = 200; // b
pos->x = 200;
pos->y = 160;
pos->z = 280;
break;
}
case SCENE_LIGHTHOUSE:
{
pos->x = 120;
pos->y = 80;
pos->z = 160;
color[0] = 235; // r
color[1] = 190; // g
color[2] = 185; // b
power[0] = 6000;
break;
}
case SCENE_TENT:
{
pos->x = 120;
pos->y = 80;
pos->z = 120;
color[0] = 235; // r
color[1] = 190; // g
color[2] = 185; // b
power[0] = 6000;
break;
}
case SCENE_BROKER_SHOP:
{
color[0] = 170; // r
color[1] = 170; // g
color[2] = 160; // b
pos->x = 250;
pos->y = 1000;
pos->z = 378;
power[0] = 8000;
break;
}
default:
{
pos->x = 250;
pos->y = 1000;
pos->z = 378;
power[0] = 8000;
break;
}
}
break;
}
case FIELD_DRAW_TYPE_TRAIN:
{
switch (Save_Get(scene_no)) {
case SCENE_START_DEMO:
case SCENE_START_DEMO3:
{
Common_Set(sunlight_flag, FALSE);
break;
}
}
l_mEnv_electric_light.sun_percent = 0.0f;
pos->x = 80;
pos->y = 120;
pos->z = 510;
color[0] = 255;
color[1] = 255;
color[2] = 160;
power[0] = 1200;
break;
}
default:
res = FALSE;
break;
}
return res;
}
static void mEnv_RoomTypePointLightSet(GAME_PLAY* play) {
s_xyz pos;
u8 color[3];
s16 power;
int light_switch;
if (Save_Get(scene_no) == SCENE_TITLE_DEMO) {
mRmTp_SetDefaultLightSwitchData(FALSE);
mRmTp_IndexLightSwitchOFF(mRmTp_LIGHT_SWITCH_9);
}
else if (Save_Get(scene_no) == SCENE_NPC_HOUSE || Save_Get(scene_no) == SCENE_COTTAGE_NPC) {
if (mEnv_CheckNpcRoomPointLightNiceStatus() == FALSE) {
mRmTp_IndexLightSwitchOFF(mRmTp_LIGHT_SWITCH_NPC);
}
else {
mRmTp_IndexLightSwitchON(mRmTp_LIGHT_SWITCH_NPC);
}
}
l_mEnv_electric_light.point_light_is_flame = FALSE;
l_mEnv_electric_light.point_light_percent = 0.0f;
if (mEnv_GetNowRoomPointLightInfo(play, &pos, color, &power, &l_mEnv_electric_light.point_light_is_flame) == TRUE) {
Light_point_ct(&play->kankyo.point_light, pos.x, pos.y, pos.z, color[0], color[1], color[2], power);
l_mEnv_electric_light.point_light_color[0] = color[0];
l_mEnv_electric_light.point_light_color[1] = color[1];
l_mEnv_electric_light.point_light_color[2] = color[2];
l_mEnv_electric_light.current_point_light = Global_light_list_new(play, &play->global_light, &play->kankyo.point_light);
light_switch = mRmTp_GetNowSceneLightSwitchIndex();
if (light_switch != -1) {
int switch_status = mRmTp_Index2LightSwitchStatus(light_switch);
l_mEnv_electric_light.point_light_percent = switch_status != 0 ? 1.0f : l_mEnv_electric_light.point_light_min;
}
else {
l_mEnv_electric_light.point_light_percent = 1.0f;
}
}
}
static void mEnv_RoomTypediffuseLightSet(GAME_PLAY* play, Kankyo* kankyo) {
Light_diffuse_ct(&kankyo->sun_light, 1, 0, 0, 0, 0, 0);
Global_light_list_new(play, &play->global_light, &kankyo->sun_light);
Light_diffuse_ct(&kankyo->moon_light, 1, 0, 0, 0, 0, 0);
Global_light_list_new(play, &play->global_light, &kankyo->moon_light);
}
static void mEnv_RoomTypeLightSet(GAME_PLAY* play, Kankyo* kankyo) {
mEnv_RoomTypePointLightSet(play);
mEnv_RoomTypediffuseLightSet(play, kankyo);
}
static void mEnv_rainbow_check_set() {
if (mFI_CheckFieldData() != FALSE && mFI_GET_TYPE(mFI_GetFieldId()) == mFI_FIELD_FG && mEv_CheckTitleDemo() <= 0) {
if (Save_Get(rainbow_reserved)) {
if (
Common_Get(time).rtc_time.month == Save_Get(rainbow_month) &&
Common_Get(time).rtc_time.day == Save_Get(rainbow_day)
) {
int now_sec = Common_Get(time).now_sec;
if (
now_sec >= mEnv_RAINBOW_TIME_START &&
now_sec < mEnv_RAINBOW_TIME_END
) {
Save_Set(rainbow_reserved, FALSE);
if (Common_Get(time).season == mTM_SEASON_SUMMER) {
Common_Set(rainbow_opacity, 1.0f);
}
}
}
else {
Save_Set(rainbow_reserved, FALSE);
}
}
else if (Common_Get(rainbow_opacity) > 0.0f) {
if (
Common_Get(time).rtc_time.month != Save_Get(rainbow_month) ||
Common_Get(time).rtc_time.day != Save_Get(rainbow_day) ||
Common_Get(time).now_sec < mEnv_RAINBOW_TIME_START || // might need to break out time.now_sec into its own variable
Common_Get(time).now_sec >= mEnv_RAINBOW_TIME_BYE ||
Common_Get(time).season != mTM_SEASON_SUMMER
) {
Common_Set(rainbow_opacity, 0.0f);
}
}
}
}
extern void Global_kankyo_ct(GAME_PLAY* play, Kankyo* kankyo) {
bzero(&l_mEnv_electric_light, sizeof(l_mEnv_electric_light));
mRmTp_IndexLightSwitchOFF(mRmTp_LIGHT_SWITCH_NPC);
l_mEnv_electric_light.staffroll_fade_rate = 1.0f;
l_mEnv_electric_light.shadow_adjust = 1.0f;
l_mEnv_electric_light.sun_percent = 1.0f;
l_mEnv_electric_light.current_point_light = NULL;
if (Save_Get(scene_no) == SCENE_MUSEUM_ROOM_INSECT) {
l_mEnv_electric_light.diffuse_adjust = 0.5f;
}
else {
l_mEnv_electric_light.diffuse_adjust = 0.4f;
}
if (Save_Get(scene_no) == SCENE_MUSEUM_ROOM_INSECT) {
l_mEnv_electric_light.shadow_alpha_adjust = 100;
}
else {
l_mEnv_electric_light.shadow_alpha_adjust = 150;
}
l_mEnv_electric_light.change_weather_env_rate = 0.0f;
switch (Save_Get(scene_no)) {
case SCENE_LIGHTHOUSE:
case SCENE_TENT:
{
l_mEnv_electric_light.point_light_min = 0.14f;
break;
}
default:
{
l_mEnv_electric_light.point_light_min = 0.14f;
break;
}
}
l_mEnv_electric_light.diffuse_light_effect_rate = 1.0f;
bzero(kankyo, sizeof(Kankyo));
SETREG(MYKREG, 28, 100);
Common_Set(transition._00, 0);
mEnv_set_time(kankyo);
kankyo->countdown_timer = 0xFF;
mEnv_RoomTypeLightSet(play, kankyo);
mEnv_regist_nature(kankyo, (NATURE_PROC)none_proc1, NULL);
mEnv_MakeWindowLightAlpha(FALSE);
mEnv_InitWind();
l_mEnv_electric_light.switch_status = (u8)mEnv_Pointlight_on_check() ? mEnv_SWITCH_STATUS_TURNING_OFF : mEnv_SWITCH_STATUS_TURNING_ON;
mEnv_rainbow_check_set();
}
static void mEnv_MakeShadowInfo(Kankyo* kankyo) {
f32 time_adjust;
f32 weather_base_adjust;
f32 weather_change_adjust;
f32 shadow_pos;
lbRTC_time_c* rtc_time = Common_GetPointer(time.rtc_time);
int now_sec;
u8 transition_zero = FALSE;
int switch_index;
int min_sec = (rtc_time->min) * mTM_SECONDS_IN_MINUTE;
int hour_sec = (rtc_time->hour) * mTM_SECONDS_IN_HOUR;
now_sec = hour_sec + min_sec + rtc_time->sec;
switch_index = mRmTp_GetNowSceneLightSwitchIndex(); // unused
/*
* Time period overview for shadows
* [0] 00:00:00 - 03:59:29 | 0.4 (rate normal)
* [1] 03:59:30 - 04:00:02 | 0.4 (rate reduced)
* [2] 04:00:03 - 06:00:00 | 0.4 -> 1.0 (rate normal)
* [3] 06:00:01 - 17:59:59 | 1.0 (rate normal)
* [4] 18:00:00 - 19:59:30 | 1.0 -> 0.4 (rate normal)
* [5] 19:59:31 - 20:00:03 | 0.4 (rate reduced)
* [6] 20:00:04 - 23:59:59 | 0.4 (rate normal)
*/
if (now_sec > mEnv_TIME_TO_SECS(6, 0, 0) && now_sec < mEnv_TIME_TO_SECS(18, 0, 0)) {
time_adjust = 1.0f;
}
else if (now_sec < mEnv_TIME_TO_SECS(3, 59, 30) || now_sec > mEnv_TIME_TO_SECS(20, 0, 3)) {
time_adjust = 0.4f;
}
else if (now_sec >= mEnv_TIME_TO_SECS(4, 0, 3) && now_sec <= mEnv_TIME_TO_SECS(6, 0, 0)) {
time_adjust = 0.4f + ((f32)(now_sec - mEnv_TIME_TO_SECS(4, 0, 3)) / (f32)(mEnv_TIME_TO_SECS(6, 0, 0) - mEnv_TIME_TO_SECS(4, 0, 3))) * 0.6f;
}
else if (now_sec >= mEnv_TIME_TO_SECS(18, 0, 0) && now_sec <= mEnv_TIME_TO_SECS(19, 59, 30)) {
time_adjust = 0.4f + ((1.0f - (f32)(now_sec - mEnv_TIME_TO_SECS(18, 0, 0)) / (f32)(mEnv_TIME_TO_SECS(19, 59, 30) - mEnv_TIME_TO_SECS(18, 0, 0)))) * 0.6f;
}
else {
transition_zero = TRUE;
time_adjust = 0.4f;
}
if (transition_zero == TRUE) {
if (
(now_sec > mEnv_TIME_TO_SECS(3, 59, 55) && now_sec < mEnv_TIME_TO_SECS(4, 0, 3)) ||
(now_sec > mEnv_TIME_TO_SECS(19, 59, 55) && now_sec < mEnv_TIME_TO_SECS(20, 0, 3))
) {
add_calc(&l_mEnv_electric_light.shadow_adjust, 0.0f, 1.0f - sqrtf(0.5), 0.005f, 0.005f);
}
else {
add_calc(&l_mEnv_electric_light.shadow_adjust, 0.0f, 1.0f - sqrtf(0.9), 0.0006f, 0.0004f);
}
}
else {
add_calc(&l_mEnv_electric_light.shadow_adjust, 1.0f, 1.0f - sqrtf(0.9), 0.0005f, 0.00005f);
}
weather_base_adjust = (l_mEnv_electric_light.now_weather == mEnv_WEATHER_RAIN || l_mEnv_electric_light.now_weather == mEnv_WEATHER_SNOW) ? 0.75f : 1.0f;
weather_change_adjust = (l_mEnv_electric_light.next_weather == mEnv_WEATHER_RAIN || l_mEnv_electric_light.next_weather == mEnv_WEATHER_SNOW) ? 0.75f : 1.0f;
time_adjust *= (weather_base_adjust + l_mEnv_electric_light.change_weather_env_rate * (weather_change_adjust - weather_base_adjust));
kankyo->shadow_alpha = (time_adjust * 255.0f * l_mEnv_electric_light.shadow_adjust * 0.75f) * l_mEnv_electric_light.staffroll_fade_rate;
if (l_mEnv_electric_light.shadow_alpha != 0) {
kankyo->shadow_alpha = l_mEnv_electric_light.shadow_alpha;
}
else if (Save_Get(scene_no) != SCENE_FG && Save_Get(scene_no) != SCENE_MUSEUM_ROOM_INSECT) {
kankyo->shadow_alpha = (f32)kankyo->shadow_alpha + l_mEnv_electric_light.point_light_percent * ((f32)l_mEnv_electric_light.shadow_alpha_adjust - (f32)kankyo->shadow_alpha);
}
if (now_sec >= mEnv_TIME_TO_SECS(4, 0, 0) && now_sec <= mEnv_TIME_TO_SECS(20, 0, 0)) {
f32 diff = now_sec - mEnv_TIME_TO_SECS(4, 0, 0);
shadow_pos = diff / (f32)(mEnv_TIME_TO_SECS(20, 0, 0) - mEnv_TIME_TO_SECS(4, 0, 0));
}
else {
if (now_sec < mEnv_TIME_TO_SECS(20, 0, 0)) {
now_sec += mTM_SECONDS_IN_DAY;
}
shadow_pos = (f32)(now_sec - mEnv_TIME_TO_SECS(20, 0, 0)) / (f32)((mEnv_TIME_TO_SECS(4, 0, 0) + mTM_SECONDS_IN_DAY) - mEnv_TIME_TO_SECS(20, 0, 0));
}
kankyo->shadow_pos = shadow_pos * 200.0f - 100.0f;
}
static void mEnv_set_time(Kankyo* kankyo) {
rgba_t light_color;
int shadows_affected;
/* Convert day seconds from [0, 86400) -> [-0.5, 0.5) -> [-32768, 32768) (seconds -> bin-angle) */
s16 time_angle = ((Common_Get(time).now_sec - mTM_SECONDS_IN_HALFDAY) / (f32)mTM_SECONDS_IN_DAY) * 65536.0f;
f32 sin = sin_s(time_angle); // unused
f32 cos = cos_s(time_angle); // unused
mEnv_MakeShadowInfo(kankyo);
if (
Common_Get(clip).effect_clip != NULL &&
Common_Get(clip).effect_clip->effect_light_status(&light_color, &shadows_affected) != eEC_LIGHT_COLOR_DISABLED &&
shadows_affected == TRUE
) {
f32 color_add = light_color.r + light_color.g + light_color.b;
f32 adjusted_shadow_alpha = kankyo->shadow_alpha;
color_add = color_add > 200.0f ? 200.0f : color_add;
adjusted_shadow_alpha += (color_add / 200.0f) * 110.0f;
adjusted_shadow_alpha = adjusted_shadow_alpha > 255.0f ? 255.0f : adjusted_shadow_alpha;
adjusted_shadow_alpha = adjusted_shadow_alpha < 0.0f ? 0.0f : adjusted_shadow_alpha;
kankyo->shadow_alpha = adjusted_shadow_alpha;
}
mNPS_schedule_manager(); // This is a very odd place to put this. It would be better suited in game_play_Move().
}
static void mEnv_ChangeRGBLight(u8* dst, u8* src_nxt_w0, u8* src_nxt_w1, u8* src_now_w0, u8* src_now_w1, f32 f0, f32 f1) {
f32 weather_change_bias = l_mEnv_electric_light.change_weather_env_rate;
f32 inverse_weather_change_bias = 1.0f - weather_change_bias;
int i;
for (i = 0; i < 3; i++) {
dst[0] =
weather_change_bias * (f1 * (src_nxt_w0[0] + f0 * ((f32)src_nxt_w1[0] - (f32)src_nxt_w0[0]))) +
inverse_weather_change_bias * (f1 * (src_now_w0[0] + f0 * ((f32)src_now_w1[0] - (f32)src_now_w0[0])));
dst++;
src_nxt_w0++;
src_nxt_w1++;
src_now_w0++;
src_now_w1++;
}
}
static void mEnv_ChangeDiffuseVctlSet(BaseLight* base_light) {
switch (Save_Get(scene_no)) {
case SCENE_BROKER_SHOP:
case SCENE_BUGGY:
case SCENE_CONVENI:
case SCENE_SUPER:
case SCENE_DEPART:
case SCENE_DEPART_2:
case SCENE_KAMAKURA:
case SCENE_MUSEUM_ROOM_PAINTING:
case SCENE_MUSEUM_ROOM_FOSSIL:
case SCENE_MUSEUM_ROOM_FISH:
case SCENE_MY_ROOM_BASEMENT_S:
case SCENE_MY_ROOM_BASEMENT_M:
case SCENE_MY_ROOM_BASEMENT_L:
case SCENE_MY_ROOM_BASEMENT_LL1:
case SCENE_LIGHTHOUSE:
{
base_light->sun_dir[0] = 0; // x
base_light->sun_dir[1] = 69; // y
base_light->sun_dir[2] = 97; // z
base_light->moon_dir[0] = 0; // x
base_light->moon_dir[1] = -33; // y
base_light->moon_dir[2] = 115; // z
break;
}
default:
{
f32 dir_x;
f32 dir_y;
f32 dir_z;
switch (Common_Get(field_draw_type)) {
case FIELD_DRAW_TYPE_TRAIN:
case FIELD_DRAW_TYPE_PLAYER_SELECT:
{
dir_x = 0.0f;
dir_y = 60.0f;
dir_z = 60.0f;
break;
}
default:
{
/* second in the day -> [-32768, 32767] */
s16 bin_sec_radial = ((f32)(Common_Get(time).now_sec - mTM_SECONDS_IN_HALFDAY) / (f32)mTM_SECONDS_IN_HALFDAY) * (SHT_MAX + 1.0f);
dir_x = sin_s(bin_sec_radial) * 60.0f;
dir_y = cos_s(bin_sec_radial) * 60.0f;
dir_z = cos_s(bin_sec_radial) * 60.0f;
break;
}
}
base_light->sun_dir[0] = -dir_x; // x
base_light->sun_dir[1] = dir_y + 30.0f; // y
base_light->sun_dir[2] = dir_z + 20.0f; // z
base_light->moon_dir[0] = dir_x; // x
base_light->moon_dir[1] = 30.0f - dir_y; // y
base_light->moon_dir[2] = 20.0f - dir_z; // z
break;
}
}
}
static void mEnv_ChangeDiffuseLight(BaseLight* dst, BaseLight* src_nxt_w0, BaseLight* src_nxt_w1, BaseLight* src_now_w0, BaseLight* src_now_w1, f32 f0) {
f32 diffuse_light_effect_rate = mEnv_DiffuseLightEffectRate();
f32 f1;
mEnv_ChangeDiffuseVctlSet(dst);
if (Common_Get(sunlight_flag) == TRUE) {
add_calc(&l_mEnv_electric_light.sun_percent, 1.0f, 1.0f - sqrtf(0.5), 0.1f, 0.005f);
}
else {
add_calc(&l_mEnv_electric_light.sun_percent, 0.0f, 1.0f - sqrtf(0.5), 0.1f, 0.005f);
}
mEnv_ChangeRGBLight(dst->sun_color, src_nxt_w0->sun_color, src_nxt_w1->sun_color, src_now_w0->sun_color, src_now_w1->sun_color, f0, l_mEnv_electric_light.sun_percent * diffuse_light_effect_rate * l_mEnv_electric_light.staffroll_fade_rate);
mEnv_ChangeRGBLight(dst->moon_color, src_nxt_w0->moon_color, src_nxt_w1->moon_color, src_now_w0->moon_color, src_now_w1->moon_color, f0, l_mEnv_electric_light.sun_percent * diffuse_light_effect_rate * l_mEnv_electric_light.staffroll_fade_rate);
if (mRmTp_GetNowSceneLightSwitchIndex() != -1) {
/* If the room has a light switch point light, combine its power with the celestial body colors */
f32 celestial_adjust = (l_mEnv_electric_light.diffuse_adjust - 1.0f) * l_mEnv_electric_light.point_light_percent + 1.0f;
dst->sun_color[0] *= celestial_adjust;
dst->sun_color[1] *= celestial_adjust;
dst->sun_color[2] *= celestial_adjust;
dst->moon_color[0] *= celestial_adjust;
dst->moon_color[1] *= celestial_adjust;
dst->moon_color[2] *= celestial_adjust;
}
}
static void mEnv_ChangeFogLight(BaseLight* dst, BaseLight* src_nxt_w0, BaseLight* src_nxt_w1, BaseLight* src_now_w0, BaseLight* src_now_w1, f32 f0) {
f32 weather_change_bias = l_mEnv_electric_light.change_weather_env_rate;
f32 inverse_weather_change_bias = 1.0f - weather_change_bias;
f32 f1 = l_mEnv_electric_light.sun_percent * l_mEnv_electric_light.staffroll_fade_rate;
f32 fog_near;
f32 fog_far;
mEnv_ChangeRGBLight(dst->fog_color, src_nxt_w0->fog_color, src_nxt_w1->fog_color, src_now_w0->fog_color, src_now_w1->fog_color, f0, f1);
fog_near = weather_change_bias * ((f32)(src_nxt_w0->fog_near & 0x3FF) + f0 * ((f32)(src_nxt_w1->fog_near & 0x3FF) - (f32)(src_nxt_w0->fog_near & 0x3FF))) +
inverse_weather_change_bias * ((f32)(src_now_w0->fog_near & 0x3FF) + f0 * ((f32)(src_now_w1->fog_near & 0x3FF) - (f32)(src_now_w0->fog_near & 0x3FF)));
dst->fog_near = fog_near;
fog_far = weather_change_bias * ((f32)src_nxt_w0->fog_far + f0 * ((f32)src_nxt_w1->fog_far - (f32)src_nxt_w0->fog_far)) +
inverse_weather_change_bias * ((f32)src_now_w0->fog_far + f0 * ((f32)src_now_w1->fog_far - (f32)src_now_w0->fog_far));
dst->fog_far = fog_far;
}
static void mEnv_CalcSetLight_train(BaseLight* light) {
if (Save_Get(scene_no) == SCENE_START_DEMO || Save_Get(scene_no) == SCENE_START_DEMO3) {
if (l_mEnv_electric_light.sun_percent < 1.0f) {
f32 inv = 1.0f - l_mEnv_electric_light.sun_percent;
int add_r = inv * 35.0f;
int add_g = inv * 30.0f;
int add_b = inv * 40.0f;
light->ambient_color[0] += (u8)add_r;
light->ambient_color[1] += (u8)add_g;
light->ambient_color[2] += (u8)add_b;
}
}
}
static void mEnv_CalcSetLight(BaseLight* dst, BaseLight* src_nxt_w0, BaseLight* src_nxt_w1, BaseLight* src_now_w0, BaseLight* src_now_w1, Kankyo* kankyo, f32 f0) {
mEnv_ChangeRGBLight(dst->ambient_color, src_nxt_w0->ambient_color, src_nxt_w1->ambient_color, src_now_w0->ambient_color, src_now_w1->ambient_color, f0, l_mEnv_electric_light.sun_percent * l_mEnv_electric_light.staffroll_fade_rate);
mEnv_CalcSetLight_train(dst);
mEnv_ChangeDiffuseLight(dst, src_nxt_w0, src_nxt_w1, src_now_w0, src_now_w1, f0);
mEnv_ChangeFogLight(dst, src_nxt_w0, src_nxt_w1, src_now_w0, src_now_w1, f0);
/* @BUG - devs accidently used the wrong light parameter, should've been src_nxt_w1 but wrote src_now_w1 */
#ifndef BUGFIXES
mEnv_ChangeRGBLight(dst->shadow_color, src_nxt_w0->shadow_color, src_now_w1->shadow_color, src_now_w0->shadow_color, src_now_w1->shadow_color, f0, l_mEnv_electric_light.sun_percent * l_mEnv_electric_light.staffroll_fade_rate);
#else
mEnv_ChangeRGBLight(dst->shadow_color, src_nxt_w0->shadow_color, src_nxt_w1->shadow_color, src_now_w0->shadow_color, src_now_w1->shadow_color, f0, l_mEnv_electric_light.sun_percent * l_mEnv_electric_light.staffroll_fade_rate);
#endif
mEnv_ChangeRGBLight(dst->room_color, src_nxt_w0->room_color, src_nxt_w1->room_color, src_now_w0->room_color, src_now_w1->room_color, f0, l_mEnv_electric_light.sun_percent * l_mEnv_electric_light.staffroll_fade_rate);
mEnv_ChangeRGBLight(dst->sun_color_window, src_nxt_w0->sun_color_window, src_nxt_w1->sun_color_window, src_now_w0->sun_color_window, src_now_w1->sun_color_window, f0, l_mEnv_electric_light.sun_percent * l_mEnv_electric_light.staffroll_fade_rate);
mEnv_ChangeRGBLight(dst->moon_color_window, src_nxt_w0->moon_color_window, src_nxt_w1->moon_color_window, src_now_w0->moon_color_window, src_now_w1->moon_color_window, f0, l_mEnv_electric_light.sun_percent * l_mEnv_electric_light.staffroll_fade_rate);
mEnv_ChangeRGBLight(dst->background_color, src_nxt_w0->background_color, src_nxt_w1->background_color, src_now_w0->background_color, src_now_w1->background_color, f0, l_mEnv_electric_light.sun_percent * l_mEnv_electric_light.staffroll_fade_rate);
}
static int mEnv_GetNowTerm() {
int now_sec = Common_Get(time).now_sec;
int i;
for (i = 0; i < mEnv_TERM_NUM; i++) {
if (klight_chg_time[i + 1] >= now_sec) {
return i;
}
}
return 0;
}
static void mEnv_SetBaseLight(Kankyo* kankyo) {
int now_sec = Common_Get(time).now_sec;
int term = mEnv_GetNowTerm();
int weather = l_mEnv_electric_light.now_weather;
int fog_disabled = TRUE;
int next_term = term + 1;
f32 percent_towards_next_term = get_percent(klight_chg_time[next_term], klight_chg_time[term], now_sec);
switch (Common_Get(field_draw_type)) {
case FIELD_DRAW_TYPE_TRAIN:
{
int next_term = (term + 1) % mEnv_TERM_NUM;
BaseLight* src_w1 = l_mEnv_normal_kcolor_data[weather] + next_term;
BaseLight* src_w0 = l_mEnv_normal_kcolor_data[weather] + term;
mEnv_CalcSetLight(&kankyo->base_light, src_w0, src_w1, src_w0, src_w1, kankyo, percent_towards_next_term);
break;
}
case FIELD_DRAW_TYPE_PLAYER_SELECT:
{
mEnv_CalcSetLight(&kankyo->base_light, &l_mEnv_kcolor_data_p_sel, &l_mEnv_kcolor_data_p_sel, &l_mEnv_kcolor_data_p_sel, &l_mEnv_kcolor_data_p_sel, kankyo, 0.5f);
l_mEnv_electric_light.shadow_alpha = 200;
break;
}
default:
{
if (Save_Get(scene_no) == SCENE_CONVENI || Save_Get(scene_no) == SCENE_SUPER || Save_Get(scene_no) == SCENE_DEPART || Save_Get(scene_no) == SCENE_DEPART_2) {
mEnv_CalcSetLight(&kankyo->base_light, &l_mEnv_kcolor_shop, &l_mEnv_kcolor_shop, &l_mEnv_kcolor_shop, &l_mEnv_kcolor_shop, kankyo, 0.5f);
l_mEnv_electric_light.shadow_alpha = 150;
}
else if (Save_Get(scene_no) == SCENE_BUGGY) {
mEnv_CalcSetLight(&kankyo->base_light, &l_mEnv_kcolor_buggy, &l_mEnv_kcolor_buggy, &l_mEnv_kcolor_buggy, &l_mEnv_kcolor_buggy, kankyo, 0.5f);
l_mEnv_electric_light.shadow_alpha = 150;
}
else if (Save_Get(scene_no) == SCENE_KAMAKURA) {
mEnv_CalcSetLight(&kankyo->base_light, &l_mEnv_kcolor_kamakura, &l_mEnv_kcolor_kamakura, &l_mEnv_kcolor_kamakura, &l_mEnv_kcolor_kamakura, kankyo, 0.5f);
l_mEnv_electric_light.shadow_alpha = 150;
}
else if (Save_Get(scene_no) == SCENE_BROKER_SHOP) {
mEnv_CalcSetLight(&kankyo->base_light, &l_mEnv_kcolor_broker, &l_mEnv_kcolor_broker, &l_mEnv_kcolor_broker, &l_mEnv_kcolor_broker, kankyo, 0.5f);
l_mEnv_electric_light.shadow_alpha = 150;
}
else if (Save_Get(scene_no) == SCENE_MUSEUM_ROOM_FISH) {
mEnv_CalcSetLight(&kankyo->base_light, &l_mEnv_kcolor_museum_fish, &l_mEnv_kcolor_museum_fish, &l_mEnv_kcolor_museum_fish, &l_mEnv_kcolor_museum_fish, kankyo, 0.5f);
l_mEnv_electric_light.shadow_alpha = 150;
}
else if (Save_Get(scene_no) == SCENE_MUSEUM_ROOM_FOSSIL) {
mEnv_CalcSetLight(&kankyo->base_light, &l_mEnv_kcolor_museum_fossil, &l_mEnv_kcolor_museum_fossil, &l_mEnv_kcolor_museum_fossil, &l_mEnv_kcolor_museum_fossil, kankyo, 0.5f);
l_mEnv_electric_light.shadow_alpha = 150;
}
else if (Save_Get(scene_no) == SCENE_MUSEUM_ROOM_PAINTING) {
mEnv_CalcSetLight(&kankyo->base_light, &l_mEnv_kcolor_museum_picture, &l_mEnv_kcolor_museum_picture, &l_mEnv_kcolor_museum_picture, &l_mEnv_kcolor_museum_picture, kankyo, 0.5f);
l_mEnv_electric_light.shadow_alpha = 150;
}
else if (Save_Get(scene_no) == SCENE_MY_ROOM_BASEMENT_S || Save_Get(scene_no) == SCENE_MY_ROOM_BASEMENT_M || Save_Get(scene_no) == SCENE_MY_ROOM_BASEMENT_L || Save_Get(scene_no) == SCENE_MY_ROOM_BASEMENT_LL1) {
mEnv_CalcSetLight(&kankyo->base_light, &l_mEnv_kcolor_basement, &l_mEnv_kcolor_basement, &l_mEnv_kcolor_basement, &l_mEnv_kcolor_basement, kankyo, 0.5f);
l_mEnv_electric_light.shadow_alpha = 150;
}
else if (Save_Get(scene_no) == SCENE_LIGHTHOUSE) {
mEnv_CalcSetLight(&kankyo->base_light, &l_mEnv_kcolor_lighthouse, &l_mEnv_kcolor_lighthouse, &l_mEnv_kcolor_lighthouse, &l_mEnv_kcolor_lighthouse, kankyo, 0.5f);
l_mEnv_electric_light.shadow_alpha = 115;
}
else if (Save_Get(scene_no) == SCENE_MUSEUM_ROOM_INSECT) {
BaseLight* now = l_mEnv_normal_kcolor_insect_data[l_mEnv_electric_light.now_weather];
BaseLight* nxt = l_mEnv_normal_kcolor_insect_data[l_mEnv_electric_light.next_weather];
int next_term = (term + 1) % mEnv_TERM_NUM;
BaseLight* nxt_w0 = nxt + term;
BaseLight* nxt_w1 = nxt + next_term;
BaseLight* now_w0 = now + term;
BaseLight* now_w1 = now + next_term;
mEnv_CalcSetLight(
&kankyo->base_light,
nxt_w0,
nxt_w1,
now_w0,
now_w1,
kankyo,
percent_towards_next_term
);
}
else {
BaseLight* now = l_mEnv_normal_kcolor_data[l_mEnv_electric_light.now_weather];
BaseLight* nxt = l_mEnv_normal_kcolor_data[l_mEnv_electric_light.next_weather];
int next_term = (term + 1) % mEnv_TERM_NUM;
BaseLight* nxt_w0 = nxt + term;
BaseLight* nxt_w1 = nxt + next_term;
BaseLight* now_w0 = now + term;
BaseLight* now_w1 = now + next_term;
mEnv_CalcSetLight(
&kankyo->base_light,
nxt_w0,
nxt_w1,
now_w0,
now_w1,
kankyo,
percent_towards_next_term
);
}
if (Common_Get(field_type) == mFI_FIELDTYPE2_FG) {
fog_disabled = FALSE;
}
break;
}
}
if (fog_disabled == TRUE) {
kankyo->base_light.fog_color[2] = 0;
kankyo->base_light.fog_color[1] = 0;
kankyo->base_light.fog_color[0] = 0;
kankyo->base_light.fog_near = 2020;
kankyo->base_light.fog_far = 1000;
}
}
static u8 mEnv_LimitChkRGBColor(int c) {
if (c > 255) {
c = 255;
}
else if (c < 0) {
c = 0;
}
return c;
}
static void mEnv_AddAndSetRGBColor(u8* dst, u8* src0, s16* src1) {
int i;
for (i = 0; i < 3; i++) {
dst[0] = mEnv_LimitChkRGBColor(src0[0] + src1[0]);
dst++;
src0++;
src1++;
}
}
static void mEnv_SetDiffuseLight(Kankyo* kankyo) {
mEnv_AddAndSetRGBColor(kankyo->sun_light.lights.diffuse.color, kankyo->base_light.sun_color, kankyo->add_light_info.diffuse_color);
mEnv_AddAndSetRGBColor(kankyo->moon_light.lights.diffuse.color, kankyo->base_light.moon_color, l_mEnv_electric_light.add_moon_color);
kankyo->sun_light.lights.diffuse.x = kankyo->base_light.sun_dir[0];
kankyo->sun_light.lights.diffuse.y = kankyo->base_light.sun_dir[1];
kankyo->sun_light.lights.diffuse.z = kankyo->base_light.sun_dir[2];
kankyo->moon_light.lights.diffuse.x = kankyo->base_light.moon_dir[0];
kankyo->moon_light.lights.diffuse.y = kankyo->base_light.moon_dir[1];
kankyo->moon_light.lights.diffuse.z = kankyo->base_light.moon_dir[2];
}
static void mEnv_SetFog(Kankyo* kankyo, Global_light* global_light) {
int field_id = mFI_GetFieldId();
int fog_near;
int fog_far;
mEnv_AddAndSetRGBColor(global_light->fogColor, kankyo->base_light.fog_color, kankyo->add_light_info.fog_color);
fog_near = kankyo->base_light.fog_near + kankyo->add_light_info.fog_near;
if (fog_near <= mEnv_FOG_NEAR_MAX) {
global_light->fogNear = fog_near;
}
else {
global_light->fogNear = mEnv_FOG_NEAR_MAX;
}
fog_far = kankyo->base_light.fog_far + kankyo->add_light_info.fog_far;
if (fog_far <= mEnv_FOG_FAR_MAX) {
global_light->fogFar = fog_far;
}
else {
global_light->fogFar = mEnv_FOG_FAR_MAX;
}
if (mFI_GET_TYPE(field_id) != mFI_FIELD_FG) {
global_light->fogFar = 1000;
global_light->fogNear = 1000;
}
}
static void mEnv_PermitCheckDiffuseLight(Kankyo* kankyo) {
if (
kankyo->sun_light.lights.diffuse.x == 0 &&
kankyo->sun_light.lights.diffuse.y == 0 &&
kankyo->sun_light.lights.diffuse.z == 0
) {
kankyo->sun_light.lights.diffuse.x = 1;
}
if (
kankyo->moon_light.lights.diffuse.x == 0 &&
kankyo->moon_light.lights.diffuse.y == 0 &&
kankyo->moon_light.lights.diffuse.z == 0
) {
kankyo->moon_light.lights.diffuse.x = 1;
}
}
extern void mEnv_GetRoomPrimColor(u8* r, u8* g, u8* b, GAME_PLAY* play) {
u8 color[3];
f32 point_light_percent = l_mEnv_electric_light.point_light_percent;
f32 diffuse_light_effect_rate = mEnv_DiffuseLightEffectRate();
int c;
f32 f0 = 1.0f + point_light_percent * -0.3f;
f32 f1 = point_light_percent * 0.6f;
s16 flame = l_mEnv_electric_light.point_light_is_flame;
u8* point_light_color = l_mEnv_electric_light.point_light_color;
u8* room_color = play->kankyo.base_light.room_color;
int i;
for (i = 0; i < 3; i++) {
if (flame) {
c = (point_light_color[0] >> 1) + (room_color[0] >> 1); // take the average
}
else {
c = room_color[0] * f0 * diffuse_light_effect_rate + point_light_color[0] * f1;
}
if (c < 0) {
c = 0;
}
else if (c >= 256) {
c = 255;
}
color[i] = c;
point_light_color++;
room_color++;
}
r[0] = color[0];
g[0] = color[1];
b[0] = color[2];
}
extern void Global_kankyo_set_room_prim(GAME_PLAY* play) {
u8 r;
u8 g;
u8 b;
GRAPH* graph;
mEnv_GetRoomPrimColor(&r, &g, &b, play);
{
graph = play->game.graph;
OPEN_DISP(graph);
gDPPipeSync(NOW_POLY_OPA_DISP++);
gDPSetPrimColor(NOW_POLY_OPA_DISP++, 0, 128, r, g, b, 255);
gDPPipeSync(NOW_POLY_XLU_DISP++);
gDPSetPrimColor(NOW_POLY_XLU_DISP++, 0, 128, r, g, b, 255);
gDPPipeSync(NOW_BG_OPA_DISP++);
gDPSetPrimColor(NOW_BG_OPA_DISP++, 0, 128, r, g, b, 255);
CLOSE_DISP(graph);
}
}
static void mEnv_check_countdown_start(GAME_PLAY* play) {
if (mEv_check_status(mEv_EVENT_NEW_YEARS_EVE_COUNTDOWN, mEv_STATUS_PLAYSOUND) == FALSE) {
int bx;
int bz;
mFI_BlockKind2BkNum(&bx, &bz, mRF_BLOCKKIND_POOL);
if (bx != play->block_table.block_x || bz != play->block_table.block_z) {
if (Common_Get(time).now_sec >= mEnv_TIME_TO_SECS(23, 59, 0)) {
mEv_set_status(mEv_EVENT_NEW_YEARS_EVE_COUNTDOWN, mEv_STATUS_PLAYSOUND);
}
}
}
}
static void mEnv_countdown_proc(GAME_PLAY* play) {
if (Common_Get(field_draw_type) == FIELD_DRAW_TYPE_TRAIN || Common_Get(field_draw_type) == FIELD_DRAW_TYPE_PLAYER_SELECT) {
return;
}
if (mEv_check_status(mEv_EVENT_NEW_YEARS_EVE_COUNTDOWN, mEv_STATUS_ACTIVE) == TRUE) {
mEnv_check_countdown_start(play);
if (mEv_check_status(mEv_EVENT_NEW_YEARS_EVE_COUNTDOWN, mEv_STATUS_PLAYSOUND) == TRUE) {
u8 countdown_timer;
u8 now_countdown = play->kankyo.countdown_timer;
if (Common_Get(time.rtc_time).month != lbRTC_DECEMBER) {
countdown_timer = 0;
}
else {
countdown_timer = mTM_SECONDS_IN_DAY - Common_Get(time).now_sec;
}
if (countdown_timer != now_countdown) {
u16 sfx;
if (countdown_timer == 0) {
sfx = 0x151;
}
else if (countdown_timer <= 10) {
sfx = 0x150;
}
else {
sfx = 0x431;
}
sAdo_SysTrgStart(sfx);
play->kankyo.countdown_timer = countdown_timer;
}
}
}
}
extern int mEnv_RequestChangeLightON(GAME_PLAY* play, int light_on_type, int play_sfx) {
if (mRmTp_NowSceneLightSwitchON()) {
l_mEnv_electric_light.point_light_on_type = light_on_type;
if (light_on_type == mEnv_LIGHT_TYPE_PLAYER) {
PLAYER_ACTOR* player = get_player_actor_withoutCheck(play); // unused
l_mEnv_electric_light.light_animating_on = TRUE;
l_mEnv_electric_light.light_anime_frame = 0;
if (play_sfx == TRUE) {
sAdo_SysTrgStart(0x16);
}
}
return TRUE;
}
return FALSE;
}
extern int mEnv_RequestChangeLightOFF(GAME_PLAY* play, int light_off_type, f32 step) {
if (mRmTp_NowSceneLightSwitchOFF()) {
l_mEnv_electric_light.point_light_off_type = light_off_type;
l_mEnv_electric_light.point_light_off_step = ABS(step);
if (light_off_type == mEnv_LIGHT_TYPE_PLAYER) {
PLAYER_ACTOR* player = get_player_actor_withoutCheck(play); // unused
sAdo_SysTrgStart(0x17);
}
return TRUE;
}
return FALSE;
}
static void mEnv_LightAnimeToSwitchON() {
static f32 switch_on_anime_percent_table[mEnv_LIGHT_ANIME_FRAMES] = {
0.00f,
0.05f,
0.10f,
0.15f,
0.20f,
0.25f,
0.30f,
0.25f,
0.20f,
0.15f,
0.10f,
0.30f,
0.35f,
0.40f,
0.45f,
0.50f,
0.45f,
0.40f,
0.35f,
0.30f
};
int frame = l_mEnv_electric_light.light_anime_frame;
if (frame >= mEnv_LIGHT_ANIME_FRAMES) {
l_mEnv_electric_light.light_animating_on = FALSE;
return;
}
l_mEnv_electric_light.point_light_percent = l_mEnv_electric_light.point_light_min + (1.0f - l_mEnv_electric_light.point_light_min) * switch_on_anime_percent_table[frame];
l_mEnv_electric_light.light_anime_frame++;
}
extern void mEnv_ManagePointLight(GAME_PLAY* play, Kankyo* kankyo, Global_light* global_light) {
PLAYER_ACTOR* player = get_player_actor_withoutCheck(play); // unused
int lightswitch_on = mRmTp_Index2LightSwitchStatus(mRmTp_GetNowSceneLightSwitchIndex());
if (lightswitch_on) {
if (l_mEnv_electric_light.light_animating_on == TRUE) {
mEnv_LightAnimeToSwitchON();
}
else {
if (l_mEnv_electric_light.point_light_on_type == mEnv_LIGHT_TYPE_LIGHTHOUSE) {
add_calc(&l_mEnv_electric_light.point_light_percent, 1.0f, 0.02f, 0.02f, 0.00007f);
}
else {
add_calc(&l_mEnv_electric_light.point_light_percent, 1.0f, 0.01f, 0.01f, 0.01f);
}
if (chkTrigger(BUTTON_Z) && mRmTp_PleaseDrawLightSwitch()) {
mEnv_RequestChangeLightOFF(play, mEnv_LIGHT_TYPE_PLAYER, 0.0f);
}
}
}
else {
mActor_name_t field_id = mFI_GetFieldId();
if (l_mEnv_electric_light.point_light_off_type == mEnv_LIGHT_TYPE_PLAYER) {
add_calc(&l_mEnv_electric_light.point_light_percent, l_mEnv_electric_light.point_light_min, 0.2f, 0.2f, 0.02f);
}
else {
l_mEnv_electric_light.point_light_percent -= l_mEnv_electric_light.point_light_off_step;
if (l_mEnv_electric_light.point_light_percent < l_mEnv_electric_light.point_light_min) {
l_mEnv_electric_light.point_light_percent = l_mEnv_electric_light.point_light_min;
}
else if (l_mEnv_electric_light.point_light_percent > 1.0f) {
l_mEnv_electric_light.point_light_percent = 1.0f;
}
}
if (chkTrigger(BUTTON_Z) && mRmTp_PleaseDrawLightSwitch()) {
mEnv_RequestChangeLightON(play, mEnv_LIGHT_TYPE_PLAYER, TRUE);
}
else if (mFI_GET_TYPE(field_id) == mFI_FIELD_NPCROOM0 && Common_Get(last_scene_no) == SCENE_FG) {
mEnv_CheckNpcRoomPointLightNiceStatus();
}
}
if (mRmTp_GetNowSceneLightSwitchIndex() != -1) {
u8* color = play->kankyo.point_light.lights.point.color;
int i;
for (i = 0; i < 3; i++) {
color[i] = l_mEnv_electric_light.point_light_color[i] * l_mEnv_electric_light.point_light_percent;
}
}
}
static void mEnv_ManageChangeWeatherEnvRate() {
if (l_mEnv_electric_light.now_weather != l_mEnv_electric_light.next_weather) {
l_mEnv_electric_light.change_weather_env_rate += (1.0f / 600.0f);
if (l_mEnv_electric_light.change_weather_env_rate >= 1.0f) {
l_mEnv_electric_light.change_weather_env_rate = 1.0f;
if (aWeather_ChangingWeather() == FALSE) {
l_mEnv_electric_light.now_weather = l_mEnv_electric_light.next_weather;
l_mEnv_electric_light.change_weather_env_rate = 0.0f;
}
}
}
else {
l_mEnv_electric_light.change_weather_env_rate = 0.0f;
if (aWeather_ChangingWeather() == FALSE) {
l_mEnv_electric_light.now_weather = Common_Get(weather);
l_mEnv_electric_light.next_weather = Common_Get(weather);
}
}
}
static void mEnv_JudgeSwitchStatus() {
switch (l_mEnv_electric_light.switch_status) {
case mEnv_SWITCH_STATUS_ON:
l_mEnv_electric_light.switch_status = mEnv_SWITCH_STATUS_TURNING_OFF;
break;
case mEnv_SWITCH_STATUS_OFF:
l_mEnv_electric_light.switch_status = mEnv_SWITCH_STATUS_TURNING_ON;
break;
case mEnv_SWITCH_STATUS_TURNING_OFF:
if (mRmTp_Index2LightSwitchStatus(mRmTp_GetNowSceneLightSwitchIndex()) == FALSE) {
l_mEnv_electric_light.switch_status = mEnv_SWITCH_STATUS_OFF;
}
break;
case mEnv_SWITCH_STATUS_TURNING_ON:
if (mRmTp_Index2LightSwitchStatus(mRmTp_GetNowSceneLightSwitchIndex()) != FALSE) {
l_mEnv_electric_light.switch_status = mEnv_SWITCH_STATUS_ON;
}
break;
}
}
static void mEnv_rainbow_power_calc() {
if (
Save_Get(rainbow_reserved) &&
mFI_CheckFieldData() &&
mFI_GET_TYPE(mFI_GetFieldId()) == mFI_FIELD_FG &&
mEv_CheckTitleDemo() <= 0 &&
Common_Get(time.rtc_time).month == Save_Get(rainbow_month) &&
Common_Get(time.rtc_time).day == Save_Get(rainbow_day) &&
Common_Get(time).now_sec >= mEnv_RAINBOW_TIME_START && Common_Get(time).now_sec < mEnv_RAINBOW_TIME_END &&
Common_Get(time).season == mTM_SEASON_SUMMER
) {
if (chase_f(Common_GetPointer(rainbow_opacity), 1.0f, (1.0f / 1800.0f)) != FALSE) {
Save_Set(rainbow_reserved, FALSE); // rainbow has been shown
}
}
else {
chase_f(Common_GetPointer(rainbow_opacity), 0.0f, (1.0f / 108000.0f)); // slowly fade out rainbow
}
}
static void mEnv_TaimatuPointLightWaveMoveProc(GAME_PLAY* play);
static void mEnv_CheckNpcLight_ToSwitchON(GAME_PLAY* play);
extern void Global_kankyo_set(GAME_PLAY* play, Kankyo* kankyo, Global_light* global_light) {
mEnv_JudgeSwitchStatus();
mEnv_ManageChangeWeatherEnvRate();
mEnv_set_time(kankyo);
mEnv_SetBaseLight(kankyo);
mEnv_AddAndSetRGBColor(global_light->ambientColor, kankyo->base_light.ambient_color, kankyo->add_light_info.ambient_color);
mEnv_SetDiffuseLight(kankyo);
mEnv_SetFog(kankyo, global_light);
mEnv_PermitCheckDiffuseLight(kankyo);
mEnv_TaimatuPointLightWaveMoveProc(play);
mEnv_CheckNpcLight_ToSwitchON(play);
mEnv_countdown_proc(play);
mEnv_MakeWindowLightAlpha(TRUE);
mEnv_rainbow_power_calc();
if (l_mEnv_electric_light._98 < 10) {
l_mEnv_electric_light._98++;
}
}
static int mEnv_CheckNpcRoomPointLightNiceStatus() {
mNPS_schedule_c* schedule;
Animal_c* animal;
if (Save_Get(scene_no) == SCENE_COTTAGE_NPC) {
animal = Save_GetPointer(island.animal);
schedule = Common_GetPointer(npc_schedule[ANIMAL_NUM_MAX]);
if (schedule != NULL) {
if (
schedule->current_type == mNPS_SCHED_IN_HOUSE &&
animal->is_home == TRUE &&
(Common_Get(time).now_sec < mEnv_NPC_LIGHTS_OFF_TIME || Common_Get(time).now_sec >= mEnv_NPC_LIGHTS_ON_TIME)
) {
return TRUE;
}
}
}
else {
animal = mNpc_GetAnimalInfoP(Common_Get(house_owner_name));
if (
animal != NULL
) {
schedule = mNPS_get_schedule_area(&animal->id);
if (schedule != NULL) {
if (
schedule->current_type == mNPS_SCHED_IN_HOUSE &&
animal->is_home == TRUE &&
(Common_Get(time).now_sec < mEnv_NPC_LIGHTS_OFF_TIME || Common_Get(time).now_sec >= mEnv_NPC_LIGHTS_ON_TIME)
) {
return TRUE;
}
}
}
}
return FALSE;
}
static void mEnv_TaimatuPointLightWaveMoveProc(GAME_PLAY* play) {
static s16 point_light_wave_counter;
u8* point_light_color;
point_light_wave_counter += 400;
point_light_color = l_mEnv_electric_light.point_light_color;
if (l_mEnv_electric_light.point_light_is_flame) {
f32 wave = sin_s(point_light_wave_counter);
u8 c;
if (wave >= 0.0f) {
wave = sin_s(point_light_wave_counter);
}
else {
wave = -sin_s(point_light_wave_counter);
}
c = (wave * 40.0f) + 40.0f;
point_light_color[0] = 255 - c; // r
point_light_color[1] = 240 - c; // g
}
}
static void mEnv_CheckNpcLight_ToSwitchON(GAME_PLAY* play) {
// stubbed
}
static void mEnv_PointLightSet(GAME_PLAY* play, f32 fade_rate) {
PLAYER_ACTOR* player = get_player_actor_withoutCheck(play);
s16* kk_event_data = (s16*)mEv_get_save_area(mEv_EVENT_KK_SLIDER, 10);
Light_point_ct(
&play->kankyo.point_light,
player->actor_class.world.position.x,
player->actor_class.world.position.y,
player->actor_class.world.position.z - 25.0f,
255,
255,
220,
(f32)kk_event_data[0] * (1.0f - fade_rate)
);
l_mEnv_electric_light.point_light_color[0] = 255;
l_mEnv_electric_light.point_light_color[1] = 255;
l_mEnv_electric_light.point_light_color[2] = 220;
}
static Light_list* S_get_light_list;
extern void staffroll_light_init(GAME_PLAY* play) {
l_mEnv_electric_light.staffroll_fade_rate = 1.0f;
mEnv_PointLightSet(play, 1.0f);
S_get_light_list = Global_light_list_new(play, &play->global_light, &play->kankyo.point_light);
}
static void mEnv_DecideStaffrollFadeOutRate() {
l_mEnv_electric_light.staffroll_fade_rate -= 1.0f / (((f32)GETREG(CRV, 91) * 0.01f + 2.8f) * 60.0f);
if (l_mEnv_electric_light.staffroll_fade_rate <= 0.0f) {
l_mEnv_electric_light.staffroll_fade_rate = 0.0f;
}
}
static void mEnv_DecideStaffrollFadeInRate() {
l_mEnv_electric_light.staffroll_fade_rate += 1.0f / (((f32)GETREG(CRV, 91) * 0.01f + 2.8f) * 60.0f);
if (l_mEnv_electric_light.staffroll_fade_rate > 1.0f) {
l_mEnv_electric_light.staffroll_fade_rate = 1.0f;
}
}
extern void staffroll_light_proc_start(GAME_PLAY* play) {
mEnv_DecideStaffrollFadeOutRate();
mEnv_PointLightSet(play, l_mEnv_electric_light.staffroll_fade_rate);
}
extern int staffroll_light_proc_end(GAME_PLAY* play) {
mEnv_DecideStaffrollFadeInRate();
mEnv_PointLightSet(play, l_mEnv_electric_light.staffroll_fade_rate);
return l_mEnv_electric_light.staffroll_fade_rate == 1.0f;
}
extern void staffroll_light_dt(GAME_PLAY* play) {
Global_light_list_delete(&play->global_light, S_get_light_list);
}
extern void mEnv_GetShadowPrimColor_Light(u8* r, u8* g, u8* b, GAME* game) {
GAME_PLAY* play = (GAME_PLAY*)game;
r[0] = play->kankyo.base_light.shadow_color[0];
g[0] = play->kankyo.base_light.shadow_color[1];
b[0] = play->kankyo.base_light.shadow_color[2];
}
static int mEnv_Pointlight_on_check() {
return (l_mEnv_electric_light.point_light_percent <= l_mEnv_electric_light.point_light_min) ? FALSE : TRUE;
}
extern int mEnv_PointLightMin() {
return l_mEnv_electric_light.point_light_percent <= l_mEnv_electric_light.point_light_min;
}
/* @unused @fabricated - likely incorrect, real size is 0x68 (DnM+), this is 0x44 */
extern MATCH_FORCESTRIP int mEnv_HereIsPlayerSelect() {
static int place_chk[4] = { SCENE_PLAYERSELECT, SCENE_PLAYERSELECT_2, SCENE_PLAYERSELECT_3, SCENE_PLAYERSELECT_SAVE };
int i;
for (i = 0; i < 4; i++) {
if (place_chk[i] == Save_Get(scene_no)) {
return TRUE;
}
}
return FALSE;
}
static void mEnv_MakeWindowLightAlpha(int enabled) {
f32 step = 1.0f / 100.0f;
f32 target = 0.0f;
if (Common_Get(field_draw_type) == FIELD_DRAW_TYPE_INDOORS) {
int switch_idx = mRmTp_GetNowSceneLightSwitchIndex();
if (enabled == FALSE) {
l_mEnv_electric_light.windowlight_alpha = 0.0f;
step = 1.0f;
}
if (
ABS((s16)Common_Get(time).now_sec) < 120 ||
ABS((s16)(Common_Get(time).now_sec - mTM_SECONDS_IN_DAY)) < 120 ||
ABS((s16)(Common_Get(time).now_sec - mTM_SECONDS_IN_HALFDAY)) < 120
) {
target = 0.0f;
}
else if (switch_idx != -1) {
target = (1.0f - l_mEnv_electric_light.point_light_percent) * 0.78f + 0.22f;
}
else if (Common_Get(time).now_sec >= mEnv_NPC_LIGHTS_OFF_TIME && Common_Get(time).now_sec < mEnv_NPC_LIGHTS_ON_TIME) {
target = 1.0f;
}
add_calc(&l_mEnv_electric_light.windowlight_alpha, target, 1.0f - sqrtf(0.8), 0.5f * step, 0.5f * step);
}
}
extern f32 mKK_windowlight_alpha_get() {
return l_mEnv_electric_light.windowlight_alpha;
}
extern int mEnv_ReqeustChangeWeatherEnviroment(s16 now_weather, s16 next_weather) {
if (l_mEnv_electric_light.now_weather == l_mEnv_electric_light.next_weather) {
if (l_mEnv_normal_kcolor_data[now_weather & 3] != l_mEnv_normal_kcolor_data[next_weather & 3]) {
l_mEnv_electric_light.change_weather_env_rate = 0.0f;
l_mEnv_electric_light.now_weather = now_weather & 3;
l_mEnv_electric_light.next_weather = next_weather & 3;
}
return TRUE;
}
return FALSE;
}
extern int mEnv_ReservePointLight(GAME_PLAY* play, xyz_t* pos, u8 r, u8 g, u8 b, s16 power) {
Light_list* list;
Lights* point_light;
int i;
for (i = 0; i < mEnv_POINT_LIGHT_NUM; i++) {
if (l_mEnv_electric_light.point_light_list_buf[i] == NULL) {
point_light = &l_mEnv_electric_light.point_lights[i];
Light_point_ct(point_light, pos->x, pos->y, pos->z, r, g, b, power);
list = Global_light_list_new(play, &play->global_light, point_light);
if (list != NULL) {
l_mEnv_electric_light.point_light_list_buf[i] = list;
return i;
}
}
}
return -1;
}
extern void mEnv_OperateReservedPointLight_Position(int point_light_idx, xyz_t* pos) {
if (point_light_idx >= 0 && point_light_idx < mEnv_POINT_LIGHT_NUM) {
Lights* l = &l_mEnv_electric_light.point_lights[point_light_idx];
l->lights.point.x = pos->x;
l->lights.point.y = pos->y;
l->lights.point.z = pos->z;
}
}
extern void mEnv_OperateReservedPointLight_Color(int point_light_idx, u8 r, u8 g, u8 b) {
if (point_light_idx >= 0 && point_light_idx < mEnv_POINT_LIGHT_NUM) {
Lights* l = &l_mEnv_electric_light.point_lights[point_light_idx];
l->lights.point.color[0] = r;
l->lights.point.color[1] = g;
l->lights.point.color[2] = b;
}
}
extern void mEnv_OperateReservedPointLight_Power(int point_light_idx, s16 power) {
if (point_light_idx >= 0 && point_light_idx < mEnv_POINT_LIGHT_NUM) {
Lights* l = &l_mEnv_electric_light.point_lights[point_light_idx];
l->lights.point.radius = power;
}
}
extern void mEnv_OperateReservedPointLight(int point_light_idx, xyz_t* pos, u8 r, u8 g, u8 b, s16 power) {
mEnv_OperateReservedPointLight_Position(point_light_idx, pos);
mEnv_OperateReservedPointLight_Color(point_light_idx, r, g, b);
mEnv_OperateReservedPointLight_Power(point_light_idx, power);
}
extern int mEnv_CancelReservedPointLight(int point_light_idx, GAME_PLAY* play) {
if (point_light_idx >= 0 && point_light_idx < mEnv_POINT_LIGHT_NUM) {
Light_list** list = l_mEnv_electric_light.point_light_list_buf;
Global_light_list_delete(&play->global_light, list[point_light_idx]);
list[point_light_idx] = NULL;
point_light_idx = -1;
}
return point_light_idx;
}