mirror of
https://github.com/ACreTeam/ac-decomp
synced 2026-05-22 22:24:16 -04:00
Implement & link m_kankyo.c
This commit is contained in:
@@ -327,7 +327,7 @@ COMMON_DEFINES = [
|
||||
]
|
||||
DOL_DEFINES = COMMON_DEFINES + []
|
||||
REL_DEFINES = COMMON_DEFINES + [
|
||||
"-d OPTIMIZED_SQRTF",
|
||||
#"-d OPTIMIZED_SQRTF",
|
||||
"-d IS_REL"
|
||||
]
|
||||
BASE_DOL_CFLAGS = CFLAGS + [
|
||||
|
||||
@@ -122,6 +122,11 @@ m_kabu_manager.c:
|
||||
.text: [0x803B5CC4, 0x803B6280]
|
||||
.rodata: [0x80642480, 0x806424C0]
|
||||
.data: [0x80655D48, 0x80655D78]
|
||||
m_kankyo.c:
|
||||
.text: [0x803B6280, 0x803BAB0C]
|
||||
.rodata: [0x806424C0, 0x80642640]
|
||||
.data: [0x80655D78, 0x80656670]
|
||||
.bss: [0x81297A68, 0x81297B18]
|
||||
m_lights.c:
|
||||
.text: [0x803BB960, 0x803BC510]
|
||||
.rodata: [0x80642680, 0x806426D8]
|
||||
|
||||
@@ -8,6 +8,8 @@
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
extern int aWeather_ChangingWeather();
|
||||
|
||||
extern ACTOR_PROFILE Weather_Profile;
|
||||
|
||||
#ifdef __cplusplus
|
||||
|
||||
@@ -19,11 +19,25 @@ enum effect_type {
|
||||
eEC_EFFECT_NUM = 126
|
||||
};
|
||||
|
||||
enum {
|
||||
eEC_LIGHT_COLOR_DISABLED,
|
||||
eEC_LIGHT_COLOR_INCREASING,
|
||||
eEC_LIGHT_COLOR_MAXIMUM,
|
||||
eEC_LIGHT_COLOR_DECREASING,
|
||||
|
||||
eEC_LIGHT_COLOR_NUM
|
||||
};
|
||||
|
||||
typedef void (*eEC_NAME2EFFECTMAKE_PROC)(int, xyz_t, int, short, GAME*, u16, s16, s16);
|
||||
|
||||
typedef int (*eEC_EFFECTLIGHTSTATUS_PROC)(rgba_t*, int*); // returns eEC_LIGHT_COLOR_*
|
||||
|
||||
typedef struct effect_control_clip_s {
|
||||
eEC_NAME2EFFECTMAKE_PROC effect_make_proc;
|
||||
/* TODO: finish */
|
||||
/* 0x00 */ eEC_NAME2EFFECTMAKE_PROC effect_make_proc;
|
||||
/* 0x04 */ u8 _04[0x3C - 0x04];
|
||||
/* 0x3C */ eEC_EFFECTLIGHTSTATUS_PROC effect_light_status;
|
||||
/* 0x40 */ void* _40;
|
||||
/* 0x44 */ void* _44;
|
||||
} eEC_EffectControl_Clip_c;
|
||||
|
||||
typedef struct effect_control_s EFFECT_CONTROL_ACTOR;
|
||||
|
||||
@@ -307,6 +307,13 @@ enum actor_profile_table {
|
||||
mAc_PROFILE_NUM
|
||||
};
|
||||
|
||||
enum {
|
||||
mAc_HILITE_OPAQUE,
|
||||
mAc_HILITE_TRANSLUCENT,
|
||||
|
||||
mAc_HILITE_NUM
|
||||
};
|
||||
|
||||
/* sizeof(ACTOR_PROFILE) == 0x24 */
|
||||
struct actor_profile_s {
|
||||
/* 0x00 */ s16 id; /* unique actor type ID */
|
||||
|
||||
+20
-6
@@ -151,7 +151,11 @@ typedef struct Save_s {
|
||||
/* 0x024177 */ u8 gyoei_term_transition_offset; /* days offset from end of term to begin transition */
|
||||
/* 0x024178 */ mFAs_GoodField_c good_field; /* field assessment last info */
|
||||
/* 0x024184 */ u8 bg_tex_idx; /* Grass type */
|
||||
/* 0x024185 */ u8 _24185[0x2418A - 0x24185];
|
||||
/* 0x024185 */ lbRTC_month_t rainbow_month;
|
||||
/* 0x024186 */ lbRTC_day_t rainbow_day;
|
||||
/* 0x024187 */ u8 rainbow_reserved;
|
||||
/* 0x024188 */ u8 _24188;
|
||||
/* 0x024189 */ u8 _24189;
|
||||
/* 0x02418A */ u8 town_day;
|
||||
/* 0x02418B */ u8 _2418B[0x241A0 - 0x2418B];
|
||||
/* 0x0241A0 */ lbRTC_time_c saved_auto_nwrite_time; /* save data notice time used for fishing tourney results? */
|
||||
@@ -163,6 +167,13 @@ typedef union save_u {
|
||||
//u8 raw[0x26000]; /* Temp to force length */
|
||||
} Save;
|
||||
|
||||
typedef struct transition_s {
|
||||
u8 _00; // only set in Global_kankyo_ct?
|
||||
u8 fade_rate;
|
||||
u8 wipe_rate;
|
||||
u8 wipe_type;
|
||||
} Transition_c;
|
||||
|
||||
/* sizeof(common_data_t) == 0x2DC00 */
|
||||
typedef struct common_data_s {
|
||||
/* 0x000000 */ Save save;
|
||||
@@ -178,10 +189,10 @@ typedef struct common_data_s {
|
||||
/* 0x026140 */ mHm_hs_c* now_home;
|
||||
/* 0x026144 */ u8 map_flag;
|
||||
/* 0x026145 */ u8 fish_location;
|
||||
/* 0x026146 */ u8 tmp0[0x2614D - 0x26146];
|
||||
/* 0x02614D */ u8 transFadeDuration;
|
||||
/* 0x02614E */ u8 transWipeSpeed;
|
||||
/* 0x02614F */ u8 wipeType; /* maybe unused? */
|
||||
/* 0x026146 */ u8 npc_is_summercamper;
|
||||
/* 0x026147 */ u8 player_select_animal_no;
|
||||
/* 0x026148 */ u8 _26148[0x2614C - 0x26148];
|
||||
/* 0x02614C */ Transition_c transition;
|
||||
/* 0x026150 */ s16 bg_item_type;
|
||||
/* 0x026152 */ s16 bg_item_profile;
|
||||
/* 0x026154 */ u8 _26154[0x26164 - 0x26154];
|
||||
@@ -273,7 +284,10 @@ typedef struct common_data_s {
|
||||
/* 0x02DB40 */ u8 auto_nwrite_set; /* when true, saved nwrite time will be utilized. Seems to be used to keep same date for fishing tourney stuff. */
|
||||
/* 0x02DB42 */ u16 select_last_select_no;
|
||||
/* 0x02DB44 */ u16 select_last_top_no;
|
||||
/* 0x02DB46 */ u8 tmp3[0x2DBAC - 0x2DB46];
|
||||
/* 0x02DB46 */ u8 _2DB46[0x2DBA2 - 0x2DB46];
|
||||
/* 0x02DBA2 */ s16 island_weather;
|
||||
/* 0x02DBA4 */ s16 island_weather_intensity;
|
||||
/* 0x02DBA6 */ u8 _2DBA6[0x2DBAC - 0x2DBA6];
|
||||
/* 0X02DBAC */ int famicom_2DBAC;
|
||||
/* 0x02DBB0 */ s16 can_look_goki_count;
|
||||
/* 0x02DBB4 */ f32 rainbow_opacity; /* current opacity of rainbow (0.0f - 1.0f) */
|
||||
|
||||
@@ -496,6 +496,9 @@ extern void mEv_EventON(u32 event_kind);
|
||||
extern int mEv_CheckGateway();
|
||||
extern int mEv_check_schedule(int event);
|
||||
extern mEv_place_data_c* mEv_get_common_place(int type, s8 id);
|
||||
extern void mEv_set_status(int event, s16 status);
|
||||
extern void mEv_GetEventWeather(s16* weather, s16* intensity);
|
||||
extern int mEv_CheckRealArbeit();
|
||||
|
||||
extern int mEv_weekday2day(lbRTC_month_t month, int week_type, lbRTC_weekday_t weekday);
|
||||
extern void mEv_ClearEventInfo();
|
||||
|
||||
+115
-11
@@ -3,12 +3,27 @@
|
||||
|
||||
#include "types.h"
|
||||
#include "m_lights.h"
|
||||
#include "game.h"
|
||||
#include "m_play_h.h"
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
#define mEnv_POINT_LIGHT_NUM 4
|
||||
#define mEnv_RAINBOW_TIME_START (9 * mTM_SECONDS_IN_HOUR)
|
||||
#define mEnv_RAINBOW_TIME_END (15 * mTM_SECONDS_IN_HOUR)
|
||||
#define mEnv_RAINBOW_TIME_BYE (15 * mTM_SECONDS_IN_HOUR + 30 * mTM_SECONDS_IN_MINUTE)
|
||||
#define mEnv_TERM_NUM 8
|
||||
#define mEnv_FOG_NEAR_MAX 996
|
||||
#define mEnv_FOG_FAR_MAX 1600
|
||||
#define mEnv_LIGHT_ANIME_FRAMES 20
|
||||
#define mEnv_NPC_LIGHTS_OFF_TIME (5 * mTM_SECONDS_IN_HOUR)
|
||||
#define mEnv_NPC_LIGHTS_ON_TIME (18 * mTM_SECONDS_IN_HOUR)
|
||||
|
||||
#define mEnv_WEATHER_TERM_NUM 20
|
||||
#define mEnv_WIND_TERM_NUM 4u
|
||||
#define mEnv_WIND_CHANGE_RATE (f32)(10*mTM_SECONDS_IN_MINUTE*60) // 60fps, 10 minutes
|
||||
|
||||
enum weather {
|
||||
mEnv_WEATHER_CLEAR,
|
||||
mEnv_WEATHER_RAIN,
|
||||
@@ -28,9 +43,59 @@ enum weather_intensity {
|
||||
mEnv_WEATHER_INTENSITY_NUM,
|
||||
};
|
||||
|
||||
enum {
|
||||
mEnv_LIGHT_TYPE_PLAYER,
|
||||
mEnv_LIGHT_TYPE_TENT,
|
||||
mEnv_LIGHT_TYPE_LIGHTHOUSE,
|
||||
|
||||
mEnv_LIGHT_TYPE_NUM
|
||||
};
|
||||
|
||||
enum {
|
||||
mEnv_SWITCH_STATUS_ON,
|
||||
mEnv_SWITCH_STATUS_OFF,
|
||||
mEnv_SWITCH_STATUS_TURNING_OFF,
|
||||
mEnv_SWITCH_STATUS_TURNING_ON,
|
||||
|
||||
mEnv_SWITCH_STATUS_NUM
|
||||
};
|
||||
|
||||
enum {
|
||||
mEnv_WIND_STATE_STEADY,
|
||||
mEnv_WIND_STATE_FAST,
|
||||
mEnv_WIND_STATE_SLOW,
|
||||
mEnv_WIND_STATE_REDUCING,
|
||||
|
||||
mEnv_WIND_STATE_NUM
|
||||
};
|
||||
|
||||
#define mEnv_SAVE_GET_WEATHER_TYPE(w) (((w) & 0xF0) >> 4)
|
||||
#define mEnv_SAVE_GET_WEATHER_INTENSITY(w) ((w) & 0xF)
|
||||
|
||||
typedef struct base_light_s {
|
||||
u8 ambient_color[3];
|
||||
s8 sun_dir[3];
|
||||
u8 sun_color[3];
|
||||
s8 moon_dir[3];
|
||||
u8 moon_color[3];
|
||||
u8 fog_color[3];
|
||||
s16 fog_near;
|
||||
s16 fog_far;
|
||||
u8 shadow_color[3];
|
||||
u8 room_color[3];
|
||||
u8 sun_color_window[3];
|
||||
u8 moon_color_window[3];
|
||||
u8 background_color[3];
|
||||
} BaseLight;
|
||||
|
||||
typedef struct add_light_info_s {
|
||||
s16 ambient_color[3];
|
||||
s16 diffuse_color[3];
|
||||
s16 fog_color[3];
|
||||
s16 fog_near;
|
||||
s16 fog_far;
|
||||
} AddLightInfo;
|
||||
|
||||
typedef void (*NATURE_PROC)(ACTOR*);
|
||||
|
||||
typedef struct nature_s {
|
||||
@@ -40,20 +105,59 @@ typedef struct nature_s {
|
||||
|
||||
typedef struct kankyo_s {
|
||||
/* 0x00 */ Lights sun_light;
|
||||
/* 0x0E */ u8 pad[0x9A - 0x0E];
|
||||
/* 0x9A */ u8 ambientColor[3];
|
||||
/* 0x9E */ u8 pad2[0xC0 - 0x9E];
|
||||
/* 0xC0 */ f32 unkC0;
|
||||
/* 0xC4 */ u8 unkC4;
|
||||
/* 0x0E */ Lights moon_light;
|
||||
/* 0x1C */ Lights* lamp_light;
|
||||
/* 0x20 */ Lights point_light;
|
||||
/* 0x30 */ int _30;
|
||||
/* 0x34 */ u8 _34[0x78 - 0x34];
|
||||
/* 0x78 */ AddLightInfo add_light_info; /* extra values added to specific light parameters */
|
||||
/* 0x90 */ int _90;
|
||||
/* 0x94 */ BaseLight base_light;
|
||||
/* 0xBA */ u8 _BA[0xC0 - 0xBA];
|
||||
/* 0xC0 */ f32 shadow_pos;
|
||||
/* 0xC4 */ u8 shadow_alpha;
|
||||
/* 0xC5 */ u8 countdown_timer;
|
||||
/* 0xC8 */ Nature nature;
|
||||
} Kankyo;
|
||||
|
||||
extern void Global_kankyo_ct(GAME_PLAY*, Kankyo*);
|
||||
extern void mEnv_regist_nature(Kankyo* kankyo, NATURE_PROC nature_proc, void* arg);
|
||||
extern int mEnv_unregist_nature(Kankyo* kankyo, NATURE_PROC nature_proc);
|
||||
extern void Global_kankyo_ct(GAME_PLAY* play, Kankyo* kankyo);
|
||||
extern void mEnv_GetRoomPrimColor(u8* r, u8* g, u8* b, GAME_PLAY* play);
|
||||
extern void Global_kankyo_set_room_prim(GAME_PLAY* play);
|
||||
extern int mEnv_RequestChangeLightON(GAME_PLAY* play, int light_on_type, int play_sfx);
|
||||
extern int mEnv_RequestChangeLightOFF(GAME_PLAY* play, int light_off_type, f32 step);
|
||||
extern void mEnv_ManagePointLight(GAME_PLAY* play, Kankyo* kankyo, Global_light* global_light);
|
||||
extern void Global_kankyo_set(GAME_PLAY* play, Kankyo* kankyo, Global_light* global_light);
|
||||
extern void staffroll_light_init(GAME_PLAY* play);
|
||||
extern void staffroll_light_proc_start(GAME_PLAY* play);
|
||||
extern int staffroll_light_proc_end(GAME_PLAY* play);
|
||||
extern void staffroll_light_dt(GAME_PLAY* play);
|
||||
extern void mEnv_GetShadowPrimColor_Light(u8* r, u8* g, u8* b, GAME* game);
|
||||
extern int mEnv_PointLightMin();
|
||||
extern int mEnv_HereIsPlayerSelect();
|
||||
extern f32 mKK_windowlight_alpha_get();
|
||||
extern int mEnv_ReqeustChangeWeatherEnviroment(s16 now_weather, s16 next_weather);
|
||||
extern int mEnv_ReservePointLight(GAME_PLAY* play, xyz_t* pos, u8 r, u8 g, u8 b, s16 power);
|
||||
extern void mEnv_OperateReservedPointLight_Position(int point_light_idx, xyz_t* pos);
|
||||
extern void mEnv_OperateReservedPointLight_Color(int point_light_idx, u8 r, u8 g, u8 b);
|
||||
extern void mEnv_OperateReservedPointLight_Power(int point_light_idx, s16 power);
|
||||
extern void mEnv_OperateReservedPointLight(int point_light_idx, xyz_t* pos, u8 r, u8 g, u8 b, s16 power);
|
||||
extern int mEnv_CancelReservedPointLight(int point_light_idx, GAME_PLAY* play);
|
||||
extern void mEnv_DecideWindDirect(s_xyz* dir, s16 x, s16 z);
|
||||
extern void mEnv_RandomWeather(s16* next_weather, s16* next_intensity);
|
||||
extern s16 mEnv_GetWindAngleS();
|
||||
extern f32 mEnv_GetWindPowerF();
|
||||
extern f32 mEnv_GetWindPowerF_Windmill();
|
||||
extern void mEnv_DecideTodayWindPowerRange();
|
||||
extern void mEnv_ChangeWind();
|
||||
extern void mEnv_WindMove();
|
||||
extern void mEnv_DecideWeather_GameStart();
|
||||
extern void mEnv_DecideWeather_FirstGameStart();
|
||||
extern void mEnv_PreRainNowFine_Init();
|
||||
extern void mEnv_DecideWeather_NormalGameStart();
|
||||
extern int mEnv_NowWeather();
|
||||
extern int mEnv_WindMove();
|
||||
extern void mEnv_ManagePointLight(GAME_PLAY*, Kankyo*, Global_light*);
|
||||
extern void Global_kankyo_set(GAME_PLAY*, Kankyo*, Global_light*);
|
||||
extern void mEnv_GetShadowPrimColor_Light(u8*,u8*,u8*,GAME*);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
+11
-12
@@ -37,27 +37,26 @@ typedef struct lights_s {
|
||||
} Lights;
|
||||
|
||||
|
||||
typedef struct LightNode {
|
||||
typedef struct light_list {
|
||||
/* 0x0 */ Lights* info;
|
||||
/* 0x4 */ struct LightNode* prev;
|
||||
/* 0x8 */ struct LightNode* next;
|
||||
} LightNode; // size = 0xC
|
||||
/* 0x4 */ struct light_list* prev;
|
||||
/* 0x8 */ struct light_list* next;
|
||||
} Light_list; // size = 0xC
|
||||
|
||||
typedef struct light_buf_s{
|
||||
int current;
|
||||
int idx;
|
||||
LightNode lights[32];
|
||||
}Light_buffer;
|
||||
|
||||
Light_list lights[32];
|
||||
} Light_buffer;
|
||||
|
||||
typedef struct lightsn_s{
|
||||
u8 diffuse_count;
|
||||
Ambient a;
|
||||
Light_new l[7];
|
||||
}LightsN;
|
||||
} LightsN;
|
||||
|
||||
typedef struct global_light_s {
|
||||
/* 0x0 */ LightNode* list;
|
||||
/* 0x0 */ Light_list* list;
|
||||
/* 0x4 */ u8 ambientColor[3];
|
||||
/* 0x7 */ u8 fogColor[3];
|
||||
/* 0xA */ s16 fogNear;
|
||||
@@ -71,11 +70,11 @@ extern void Light_point_ct(Lights* lights, s16 x, s16 y, s16 z, u8 r, u8 g, u8 b
|
||||
extern void Light_diffuse_ct(Lights* lights, s8 x, s8 y, s8 z, u8 r, u8 g, u8 b);
|
||||
extern void LightsN_disp_BG(LightsN* lights, GRAPH* graph);
|
||||
extern void LightsN_disp(LightsN* lights, GRAPH* graph);
|
||||
extern void LightsN_list_check(LightsN* lights, LightNode* node, xyz_t* pos);
|
||||
extern void LightsN_list_check(LightsN* lights, Light_list* node, xyz_t* pos);
|
||||
extern void Global_light_ct(Global_light* glight);
|
||||
extern LightsN* Global_light_read(Global_light* glight, GRAPH* graph);
|
||||
extern void Global_light_list_new(GAME_PLAY*, Global_light* glight, Lights* light);
|
||||
extern void Global_light_list_delete(Global_light* glight, LightNode* light);
|
||||
extern Light_list* Global_light_list_new(GAME_PLAY*, Global_light* glight, Lights* light);
|
||||
extern void Global_light_list_delete(Global_light* glight, Light_list* light);
|
||||
extern void Light_list_point_draw(GAME_PLAY* play);
|
||||
|
||||
#ifdef __cplusplus
|
||||
|
||||
@@ -240,6 +240,7 @@ extern void mNpc_SetNpcFurnitureRandom(mFM_fg_data_c** fg_data_list, int fg_name
|
||||
extern void mNpc_SetNpcHomeYpos();
|
||||
extern void mNpc_SendRegisteredGoodbyMail();
|
||||
extern void mNpc_IslandNpcRoomDataSet(mFM_fg_data_c** sorted_fg_data_list, int fg_name_start);
|
||||
extern Animal_c* mNpc_GetAnimalInfoP(mActor_name_t npc_name);
|
||||
|
||||
extern void mNpc_PrintRemoveInfo(gfxprint_t* gfxprint);
|
||||
extern void mNpc_PrintFriendship_fdebug(gfxprint_t* gfxprint);
|
||||
|
||||
@@ -8,7 +8,11 @@
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
|
||||
extern mNPS_schedule_c* mNPS_get_schedule_area(AnmPersonalID_c* anm_id);
|
||||
extern void mNPS_set_island_schedule_area(AnmPersonalID_c* anm_id);
|
||||
extern void mNPS_reset_schedule_area(AnmPersonalID_c* anm_id);
|
||||
extern void mNPS_schedule_manager();
|
||||
extern void mNPS_set_all_schedule_area();
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
|
||||
@@ -111,6 +111,24 @@ typedef struct room_type_place_info_s {
|
||||
|
||||
#define FTR1_NO_START 0x3000
|
||||
|
||||
enum {
|
||||
mRmTp_LIGHT_SWITCH_HOUSE0_MAIN_UPPER,
|
||||
mRmTp_LIGHT_SWITCH_HOUSE0_BASEMENT,
|
||||
mRmTp_LIGHT_SWITCH_HOUSE1_MAIN_UPPER,
|
||||
mRmTp_LIGHT_SWITCH_HOUSE1_BASEMENT,
|
||||
mRmTp_LIGHT_SWITCH_HOUSE2_MAIN_UPPER,
|
||||
mRmTp_LIGHT_SWITCH_HOUSE2_BASEMENT,
|
||||
mRmTp_LIGHT_SWITCH_HOUSE3_MAIN_UPPER,
|
||||
mRmTp_LIGHT_SWITCH_HOUSE3_BASEMENT,
|
||||
mRmTp_LIGHT_SWITCH_COTTAGE_MY,
|
||||
mRmTp_LIGHT_SWITCH_9,
|
||||
mRmTp_LIGHT_SWITCH_NPC,
|
||||
mRmTp_LIGHT_SWITCH_LIGHTHOUSE,
|
||||
mRmTp_LIGHT_SWITCH_TENT,
|
||||
|
||||
mRmTp_LIGHT_SWITCH_NUM
|
||||
};
|
||||
|
||||
extern void mRmTp_DrawFamicomInfo(gfxprint_t* gfxprint);
|
||||
extern void mRmTp_MakeFamicom_Fdebug();
|
||||
|
||||
@@ -125,5 +143,11 @@ extern void mRmTp_SetDefaultLightSwitchData(int state);
|
||||
extern int mRmTp_GetEntranceBasePosition(xyz_t* pos);
|
||||
extern mActor_name_t mRmTp_GetPlayerRoomCollisionIdx(mActor_name_t field_name, mActor_name_t bg_name);
|
||||
extern u8 mRmTp_GetFloorIdx();
|
||||
extern int mRmTp_GetNowSceneLightSwitchIndex();
|
||||
extern void mRmTp_IndexLightSwitchOFF(int index);
|
||||
extern void mRmTp_IndexLightSwitchON(int index);
|
||||
extern int mRmTp_Index2LightSwitchStatus(int index);
|
||||
extern int mRmTp_NowSceneLightSwitchON();
|
||||
extern int mRmTp_NowSceneLightSwitchOFF();
|
||||
|
||||
#endif
|
||||
@@ -85,6 +85,12 @@ enum scene_table {
|
||||
(scene) == SCENE_MY_ROOM_BASEMENT_M || (scene) == (SCENE_MY_ROOM_BASEMENT_L) || (scene) == SCENE_MY_ROOM_BASEMENT_LL1 || \
|
||||
(scene) == SCENE_COTTAGE_MY)
|
||||
|
||||
#define mSc_IS_SCENE_BASEMENT(scene) \
|
||||
((scene) == SCENE_MY_ROOM_BASEMENT_S || \
|
||||
(scene) == SCENE_MY_ROOM_BASEMENT_M || \
|
||||
(scene) == SCENE_MY_ROOM_BASEMENT_L || \
|
||||
(scene) == SCENE_MY_ROOM_BASEMENT_LL1)
|
||||
|
||||
#define mSc_IS_SCENE_MUSEUM_ROOM(scene) \
|
||||
((scene) >= SCENE_MUSEUM_ENTRANCE && (scene) <= SCENE_MUSEUM_ROOM_FISH)
|
||||
|
||||
|
||||
+2
-2
@@ -58,8 +58,8 @@ enum {
|
||||
|
||||
#define mTM_SECONDS_IN_MINUTE 60
|
||||
#define mTM_SECONDS_IN_HOUR 60*60
|
||||
#define mTM_SECONDS_IN_HALFDAY 12*60*60
|
||||
#define mTM_SECONDS_IN_DAY 24*60*60
|
||||
#define mTM_SECONDS_IN_HALFDAY (12*60*60)
|
||||
#define mTM_SECONDS_IN_DAY (24*60*60)
|
||||
|
||||
#define mTM_MINUTES_IN_HOUR 60
|
||||
|
||||
|
||||
@@ -130,7 +130,7 @@ static void aAL_title_game_data_init_start_select(ANIMAL_LOGO_ACTOR* actor, GAME
|
||||
|
||||
play->fb_fade_type = 8;
|
||||
play->fb_wipe_type = 3;
|
||||
Common_Set(wipeType, 3);
|
||||
Common_Set(transition.wipe_type, 3);
|
||||
mBGMPsComp_make_ps_wipe(0x1168);
|
||||
}
|
||||
|
||||
|
||||
@@ -505,7 +505,7 @@ static void aTrainWindow_SetLightPrimColorDetail(GAME* game, u32 r, u32 g, u32 b
|
||||
GRAPH* graph;
|
||||
|
||||
for(i = 0; i < 3; i++){
|
||||
current_color = play->global_light.ambientColor[i] + play->kankyo.ambientColor[i];
|
||||
current_color = play->global_light.ambientColor[i] + play->kankyo.base_light.sun_color[i];
|
||||
switch(i){
|
||||
case 0:
|
||||
current_color += r;
|
||||
|
||||
@@ -54,7 +54,7 @@ void mActorShadow_AdjustRate(f32* rate) {
|
||||
void mActorShadow_GetTimeAngleY_TimeAlpha(Shadow_Info* shadow, GAME_PLAY* play){
|
||||
f32 timef;
|
||||
int timesec = Common_Get(time.now_sec);
|
||||
shadow->unk1C = play->kankyo.unkC4;
|
||||
shadow->unk1C = play->kankyo.shadow_alpha;
|
||||
|
||||
// Between 4 a.m and 8 p.m
|
||||
if((timesec >= 14400) && ( timesec < 72000)){
|
||||
|
||||
+1
-1
@@ -10,7 +10,7 @@ extern void common_data_reinit(){
|
||||
state = Common_Get(pad_connected);
|
||||
|
||||
bzero(&common_data, sizeof(common_data));
|
||||
Common_Set(wipeType, -1);
|
||||
Common_Set(transition.wipe_type, -1);
|
||||
Common_Set(game_started,1);
|
||||
Common_Set(last_scene_no, -1);
|
||||
Common_Set(demo_profiles[0], mAc_PROFILE_NUM); /* cleared state */
|
||||
|
||||
+3
-3
@@ -33,8 +33,8 @@ void fbdemo_fade_move(fbdemo_fade* this, int rate) {
|
||||
|
||||
if (this->type != 7) {
|
||||
this->frame += rate;
|
||||
if (this->frame >= Common_Get(transFadeDuration)) {
|
||||
this->frame = Common_Get(transFadeDuration);
|
||||
if (this->frame >= Common_Get(transition).fade_rate) {
|
||||
this->frame = Common_Get(transition).fade_rate;
|
||||
this->isDone = 1;
|
||||
}
|
||||
ftimer = (f32)this->frame;
|
||||
@@ -42,7 +42,7 @@ void fbdemo_fade_move(fbdemo_fade* this, int rate) {
|
||||
ftimer = 0.0f;
|
||||
}
|
||||
|
||||
alpha = (255.0f * ftimer) / Common_Get(transFadeDuration);
|
||||
alpha = (255.0f * ftimer) / Common_Get(transition).fade_rate;
|
||||
if (this->type == 1) {
|
||||
this->color.a = 255 - alpha;
|
||||
} else {
|
||||
|
||||
@@ -53,13 +53,13 @@ fbdemo_wipe1* fbdemo_wipe1_init(fbdemo_wipe1* this) {
|
||||
|
||||
void fbdemo_wipe1_move(fbdemo_wipe1* this, int rate) {
|
||||
if (this->direction != 0) {
|
||||
this->texY += (((void)0, Common_Get(transWipeSpeed)) * 3) / rate;
|
||||
this->texY += (((void)0, Common_Get(transition).wipe_rate) * 3) / rate;
|
||||
if (this->texY >= (int)(153 * (1 << 2))) {
|
||||
this->texY = (int)(153 * (1 << 2));
|
||||
this->finished = 1;
|
||||
}
|
||||
} else {
|
||||
this->texY -= (((void)0, Common_Get(transWipeSpeed)) * 3) / rate;
|
||||
this->texY -= (((void)0, Common_Get(transition).wipe_rate) * 3) / rate;
|
||||
if (this->texY <= (int)(83.25f * (1 << 2))) {
|
||||
this->texY = (int)(83.25f * (1 << 2));
|
||||
this->finished = 1;
|
||||
|
||||
+2536
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,554 @@
|
||||
extern void mEnv_DecideWindDirect(s_xyz* dir, s16 x, s16 z) {
|
||||
xyz_t wind_dir = { 0.0f, -100.0f, 0.0f };
|
||||
f32 x_f = x;
|
||||
f32 z_f = z;
|
||||
s16 rot_x = (RANDOM_F(x_f) - x_f); // range of [-x, x)
|
||||
s16 rot_z = (RANDOM_F(z_f) - z_f); // range of [-z, z)
|
||||
|
||||
sMath_RotateX(&wind_dir, SHORTANGLE2RAD(rot_x));
|
||||
sMath_RotateZ(&wind_dir, SHORTANGLE2RAD(rot_z));
|
||||
|
||||
dir->x = wind_dir.x;
|
||||
dir->y = wind_dir.y;
|
||||
dir->z = wind_dir.z;
|
||||
}
|
||||
|
||||
static int mEnv_GetWeatherChangeStep() {
|
||||
static u8 weather_term_table[mEnv_WEATHER_TERM_NUM][2] = {
|
||||
{ lbRTC_JANUARY, 7 }, // January 1st - January 7th
|
||||
{ lbRTC_FEBRUARY, 24 }, // January 8th - February 24th
|
||||
{ lbRTC_MARCH, 31 }, // February 25th - March 31st
|
||||
{ lbRTC_APRIL, 4 }, // April 1st - April 4th
|
||||
{ lbRTC_APRIL, 7 }, // April 5th - April 7th
|
||||
{ lbRTC_APRIL, 8 }, // April 8th - April 8th
|
||||
{ lbRTC_APRIL, 19 }, // April 9th - April 19th
|
||||
{ lbRTC_APRIL, 20 }, // April 20th - April 20th
|
||||
{ lbRTC_JUNE, 25 }, // April 21st - June 25th
|
||||
{ lbRTC_JULY, 15 }, // June 26th - July 15th
|
||||
{ lbRTC_AUGUST, 31 }, // July 16th - August 31st
|
||||
{ lbRTC_SEPTEMBER, 30 }, // September 1st - September 30th
|
||||
{ lbRTC_OCTOBER, 30 }, // October 1st - October 30th
|
||||
{ lbRTC_OCTOBER, 31 }, // October 31st - Octber 31st
|
||||
{ lbRTC_NOVEMBER, 15 }, // November 1st - November 15th
|
||||
{ lbRTC_DECEMBER, 9 }, // November 16th - December 9th
|
||||
{ lbRTC_DECEMBER, 10 }, // December 10th - December 10th
|
||||
{ lbRTC_DECEMBER, 23 }, // December 11th - December 23rd
|
||||
{ lbRTC_DECEMBER, 30 }, // December 24th - December 30th
|
||||
{ lbRTC_DECEMBER, 31 } // December 31st - December 31st
|
||||
};
|
||||
|
||||
lbRTC_month_t month = Common_Get(time.rtc_time).month;
|
||||
lbRTC_day_t day = Common_Get(time.rtc_time).day;
|
||||
int i;
|
||||
|
||||
for (i = 0; i < mEnv_WEATHER_TERM_NUM; i++) {
|
||||
if (month < weather_term_table[i][0]) {
|
||||
return i;
|
||||
}
|
||||
else if (month == weather_term_table[i][0] && day <= weather_term_table[i][1]) {
|
||||
return i;
|
||||
}
|
||||
}
|
||||
|
||||
return 1; /* default is between Jan 8 & Feb 24 */
|
||||
}
|
||||
|
||||
#define mEnv_MAKE_WEATHER_TABLE_ENTRY(clear, rain, thunder, snow, blizzard, sakura, heavy_sakura) \
|
||||
( \
|
||||
(((clear) & 0xF) << 24) | \
|
||||
(((rain) & 0xF) << 16) | \
|
||||
(((thunder) & 0xF) << 20) | \
|
||||
(((snow) & 0xF) << 8) | \
|
||||
(((blizzard) & 0xF) << 12) | \
|
||||
(((sakura) & 0xF) << 0) | \
|
||||
(((heavy_sakura) & 0xF) << 4) \
|
||||
)
|
||||
|
||||
extern void mEnv_RandomWeather(s16* next_weather, s16* next_intensity) {
|
||||
/* note: entries must add up to 10 for this to function properly */
|
||||
static const u32 weather_table[mEnv_WEATHER_TERM_NUM] = {
|
||||
mEnv_MAKE_WEATHER_TABLE_ENTRY(10, 0, 0, 0, 0, 0, 0), // 100% chance of clear weather
|
||||
mEnv_MAKE_WEATHER_TABLE_ENTRY( 7, 0, 0, 2, 1, 0, 0), // 70% chance of clear weather, 20% chance of snow, 10% chance of blizzard
|
||||
mEnv_MAKE_WEATHER_TABLE_ENTRY( 8, 2, 0, 0, 0, 0, 0), // 80% chance of clear weather, 20% chance of rain
|
||||
mEnv_MAKE_WEATHER_TABLE_ENTRY(10, 0, 0, 0, 0, 0, 0), // 100% chance of clear weather
|
||||
mEnv_MAKE_WEATHER_TABLE_ENTRY(0, 0, 0, 0, 0, 10, 0), // 100% chance of light cherry blossoms
|
||||
mEnv_MAKE_WEATHER_TABLE_ENTRY(0, 0, 0, 0, 0, 0, 10), // 100% chance of heavy cherry blossoms
|
||||
mEnv_MAKE_WEATHER_TABLE_ENTRY( 8, 2, 0, 0, 0, 0, 0), // 80% chance of clear weather, 20% chance of rain
|
||||
mEnv_MAKE_WEATHER_TABLE_ENTRY(10, 0, 0, 0, 0, 0, 0), // 100% chance of clear weather
|
||||
mEnv_MAKE_WEATHER_TABLE_ENTRY( 7, 2, 1, 0, 0, 0, 0), // 70% chance of clear weather, 20% chance of rain, 10% chance of thunderstorms
|
||||
mEnv_MAKE_WEATHER_TABLE_ENTRY( 5, 3, 2, 0, 0, 0, 0), // 50% chance of clear weather, 30% chance of rain, 20% chance of thunderstorms
|
||||
mEnv_MAKE_WEATHER_TABLE_ENTRY( 9, 0, 1, 0, 0, 0, 0), // 90% chance of clear weather, 10% chance of thunderstorms
|
||||
mEnv_MAKE_WEATHER_TABLE_ENTRY( 6, 0, 4, 0, 0, 0, 0), // 60% chance of clear weather, 40% chance of thunderstorms
|
||||
mEnv_MAKE_WEATHER_TABLE_ENTRY( 8, 2, 0, 0, 0, 0, 0), // 80% chance of clear weather, 20% chance of rain
|
||||
mEnv_MAKE_WEATHER_TABLE_ENTRY(10, 0, 0, 0, 0, 0, 0), // 100% chance of clear weather
|
||||
mEnv_MAKE_WEATHER_TABLE_ENTRY( 8, 1, 0, 1, 0, 0, 0), // 80% chance of clear weather, 10% chance of rain, 10% chance of snow
|
||||
mEnv_MAKE_WEATHER_TABLE_ENTRY( 7, 0, 0, 3, 0, 0, 0), // 70% chance of clear weather, 30% chance of snow
|
||||
mEnv_MAKE_WEATHER_TABLE_ENTRY(0, 0, 0, 0, 10, 0, 0), // 100% chance of blizzard
|
||||
mEnv_MAKE_WEATHER_TABLE_ENTRY( 4, 0, 0, 4, 2, 0, 0), // 40% chance of clear weather, 40% chance of snow, 20% chance of blizzard
|
||||
mEnv_MAKE_WEATHER_TABLE_ENTRY( 0, 0, 0, 6, 4, 0, 0), // 60% chance of snow, 40% chance of blizzard
|
||||
mEnv_MAKE_WEATHER_TABLE_ENTRY(10, 0, 0, 0, 0, 0, 0) // 100% chance of clear weather
|
||||
};
|
||||
|
||||
int step = mEnv_GetWeatherChangeStep();
|
||||
|
||||
u32 weather = weather_table[step];
|
||||
u32 selected;
|
||||
u32 c0;
|
||||
u32 c1;
|
||||
u32 c2;
|
||||
u32 c3;
|
||||
u32 c4;
|
||||
u32 c5;
|
||||
|
||||
c0 = (weather >> 24) & 0xF; // clear
|
||||
c1 = (weather >> 16) & 0xF; // light rain
|
||||
c2 = (weather >> 20) & 0xF; // thunderstorm
|
||||
c3 = (weather >> 8) & 0xF; // light snow
|
||||
c4 = (weather >> 12) & 0xF; // blizzard
|
||||
#ifndef BUGFIXES
|
||||
c5 = (weather >> 8) & 0xF; // @BUG - this is almost certainly supposed to be (weather >> 0) & 0xF
|
||||
#else
|
||||
c5 = (weather >> 0) & 0xF; // light cherry blossoms
|
||||
#endif
|
||||
|
||||
selected = RANDOM_F(10.0f);
|
||||
|
||||
if (selected < c0) {
|
||||
next_weather[0] = mEnv_WEATHER_CLEAR;
|
||||
next_intensity[0] = mEnv_WEATHER_INTENSITY_LIGHT;
|
||||
}
|
||||
else if (selected < c0 + c1) {
|
||||
next_weather[0] = mEnv_WEATHER_RAIN;
|
||||
next_intensity[0] = mEnv_WEATHER_INTENSITY_LIGHT;
|
||||
}
|
||||
else if (selected < c0 + c1 + c2) {
|
||||
next_weather[0] = mEnv_WEATHER_RAIN;
|
||||
next_intensity[0] = mEnv_WEATHER_INTENSITY_HEAVY;
|
||||
}
|
||||
else if (selected < c0 + c1 + c2 + c3) {
|
||||
next_weather[0] = mEnv_WEATHER_SNOW;
|
||||
next_intensity[0] = mEnv_WEATHER_INTENSITY_LIGHT;
|
||||
}
|
||||
else if (selected < c0 + c1 + c2 + c3 + c4) {
|
||||
next_weather[0] = mEnv_WEATHER_SNOW;
|
||||
next_intensity[0] = mEnv_WEATHER_INTENSITY_HEAVY;
|
||||
}
|
||||
else if (selected < c0 + c1 + c2 + c3 + c4 + c5) {
|
||||
next_weather[0] = mEnv_WEATHER_SAKURA;
|
||||
next_intensity[0] = mEnv_WEATHER_INTENSITY_LIGHT;
|
||||
}
|
||||
else {
|
||||
next_weather[0] = mEnv_WEATHER_SAKURA;
|
||||
next_intensity[0] = mEnv_WEATHER_INTENSITY_HEAVY;
|
||||
}
|
||||
}
|
||||
|
||||
typedef struct wind_power_range_s {
|
||||
int calm_percent;
|
||||
int normal_percent;
|
||||
int gusty_percent;
|
||||
} mEnv_wind_power_range_c;
|
||||
|
||||
typedef struct wind_info_s {
|
||||
int wind_change_timer; /* timer until wind direction & base power changes */
|
||||
|
||||
f32 target_wind_angle;
|
||||
f32 wind_angle;
|
||||
f32 wind_angle_step;
|
||||
|
||||
f32 wind_power_range_max;
|
||||
f32 wind_power_range_min;
|
||||
|
||||
f32 target_wind_power;
|
||||
f32 wind_power; /* base wind power */
|
||||
f32 wind_power_step;
|
||||
|
||||
int wind_state;
|
||||
int gust_timer;
|
||||
s16 wind_power_timer;
|
||||
|
||||
f32 gust_wind_power; /* power during gusts */
|
||||
f32 last_wind_power; /* saved base power for returning from gusts */
|
||||
} mEnv_wind_info_c;
|
||||
|
||||
static mEnv_wind_info_c mEnv_wind_info = {
|
||||
0,
|
||||
|
||||
/* angle */
|
||||
DEG2SHORT_ANGLE(45.0f), /* 0x2000 */
|
||||
DEG2SHORT_ANGLE(45.0f),
|
||||
0.0f,
|
||||
|
||||
/* power range */
|
||||
1.0f,
|
||||
0.0f,
|
||||
|
||||
/* power */
|
||||
0.5f,
|
||||
0.5f,
|
||||
0.0f,
|
||||
|
||||
mEnv_WIND_STATE_STEADY,
|
||||
0,
|
||||
0,
|
||||
|
||||
0.0f,
|
||||
0.0f
|
||||
};
|
||||
|
||||
extern s16 mEnv_GetWindAngleS() {
|
||||
return mEnv_wind_info.wind_angle; /* angle is stored as a binangle (short angle), but in float type */
|
||||
}
|
||||
|
||||
extern f32 mEnv_GetWindPowerF() {
|
||||
if (mEnv_wind_info.wind_power < 0.0f) {
|
||||
return 0.0f;
|
||||
}
|
||||
else if (mEnv_wind_info.wind_power > 1.0f) {
|
||||
return 1.0f;
|
||||
}
|
||||
else {
|
||||
return mEnv_wind_info.wind_power;
|
||||
}
|
||||
}
|
||||
|
||||
extern f32 mEnv_GetWindPowerF_Windmill() {
|
||||
return mEnv_wind_info.wind_power; // unclamped for gusts/luls
|
||||
}
|
||||
|
||||
static u8 wind_term[mEnv_WIND_TERM_NUM][2] = {
|
||||
{ lbRTC_JANUARY, 7 }, /* January 1st - January 7th */
|
||||
{ lbRTC_APRIL, 5 }, /* January 8th - April 5th */
|
||||
{ lbRTC_AUGUST, 19 }, /* April 6th - August 19th */
|
||||
{ lbRTC_SEPTEMBER, 30 } /* August 20th - September 30th */
|
||||
/* October 1st - December 31st */
|
||||
};
|
||||
|
||||
static int mEnv_GetWindPowerTableTerm(lbRTC_time_c* time) {
|
||||
lbRTC_month_t month = time->month;
|
||||
lbRTC_day_t day = time->day;
|
||||
int i;
|
||||
|
||||
for (i = 0; i < mEnv_WIND_TERM_NUM; i++) {
|
||||
if (month < wind_term[i][0]) {
|
||||
return i;
|
||||
}
|
||||
else if (month == wind_term[i][0] && day <= wind_term[i][1]) {
|
||||
return i;
|
||||
}
|
||||
}
|
||||
|
||||
return i; /* must be the final term */
|
||||
}
|
||||
|
||||
static int mEnv_GetWindPowerPercent(lbRTC_time_c* time, mEnv_wind_power_range_c* wind_power_range) {
|
||||
static mEnv_wind_power_range_c pow_table[mEnv_WIND_TERM_NUM + 1] = {
|
||||
{ 10, 80, 10 },
|
||||
{ 0, 70, 30 },
|
||||
{ 10, 80, 10 },
|
||||
{ 0, 70, 30 },
|
||||
{ 10, 80, 10 }
|
||||
};
|
||||
|
||||
static mEnv_wind_power_range_c error_data = { 33, 33, 34 };
|
||||
|
||||
int power_table_term = mEnv_GetWindPowerTableTerm(time);
|
||||
*wind_power_range = error_data;
|
||||
|
||||
if (power_table_term >= 0 && power_table_term < mEnv_WIND_TERM_NUM) {
|
||||
*wind_power_range = pow_table[power_table_term];
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
extern void mEnv_DecideTodayWindPowerRange() {
|
||||
mEnv_wind_power_range_c power_range_percents;
|
||||
int selected = RANDOM(100);
|
||||
|
||||
mEnv_GetWindPowerPercent(Common_GetPointer(time.rtc_time), &power_range_percents);
|
||||
|
||||
if (selected < power_range_percents.calm_percent) {
|
||||
mEnv_wind_info.wind_power_range_max = 0.4f;
|
||||
mEnv_wind_info.wind_power_range_min = 0.0f;
|
||||
}
|
||||
else if (selected < power_range_percents.calm_percent + power_range_percents.normal_percent) {
|
||||
mEnv_wind_info.wind_power_range_max = 0.6f;
|
||||
mEnv_wind_info.wind_power_range_min = 0.4f;
|
||||
}
|
||||
else {
|
||||
mEnv_wind_info.wind_power_range_max = 1.0f;
|
||||
mEnv_wind_info.wind_power_range_min = 0.6f;
|
||||
}
|
||||
}
|
||||
|
||||
extern void mEnv_ChangeWind() {
|
||||
if (mEv_check_schedule(mEv_EVENT_KOINOBORI)) {
|
||||
mEnv_wind_info.target_wind_angle = DEG2SHORT_ANGLE(135.0f); /* 0x6000 */
|
||||
mEnv_wind_info.wind_angle = DEG2SHORT_ANGLE(135.0f);
|
||||
mEnv_wind_info.target_wind_power = 1.0f;
|
||||
mEnv_wind_info.wind_power = 1.0f;
|
||||
mEnv_wind_info.wind_angle_step = 0.0f;
|
||||
mEnv_wind_info.wind_power_step = 0.0f;
|
||||
}
|
||||
else {
|
||||
f32 wind_angle_adjust = RANDOM_F(DEG2SHORT_ANGLE(30.0f)) - (f32)DEG2SHORT_ANGLE(30.0f) / 2.0f;
|
||||
f32 w = fqrand();
|
||||
f32 min = mEnv_wind_info.wind_power_range_min;
|
||||
f32 max = mEnv_wind_info.wind_power_range_max;
|
||||
|
||||
mEnv_wind_info.target_wind_angle = mEnv_wind_info.wind_angle + wind_angle_adjust;
|
||||
mEnv_wind_info.wind_angle_step = wind_angle_adjust / mEnv_WIND_CHANGE_RATE;
|
||||
mEnv_wind_info.target_wind_power = min + w * (max - min);
|
||||
mEnv_wind_info.wind_power_step = (mEnv_wind_info.target_wind_power - mEnv_wind_info.wind_power) / mEnv_WIND_CHANGE_RATE;
|
||||
}
|
||||
}
|
||||
|
||||
static void mEnv_InitWind() {
|
||||
if (mEv_check_schedule(mEv_EVENT_KOINOBORI)) {
|
||||
mEnv_wind_info.target_wind_angle = DEG2SHORT_ANGLE(135.0f); /* 0x6000 */
|
||||
mEnv_wind_info.target_wind_power = 1.0f;
|
||||
}
|
||||
else {
|
||||
f32 angle = RANDOM_F(65536);
|
||||
f32 t = fqrand();
|
||||
f32 min = mEnv_wind_info.wind_power_range_min;
|
||||
f32 max = mEnv_wind_info.wind_power_range_max;
|
||||
|
||||
mEnv_wind_info.target_wind_angle = angle; /* completely random wind direction */
|
||||
mEnv_wind_info.target_wind_power = min + t * (max - min);
|
||||
}
|
||||
|
||||
mEnv_wind_info.wind_state = mEnv_WIND_STATE_STEADY;
|
||||
mEnv_wind_info.wind_change_timer = mEnv_WIND_CHANGE_RATE;
|
||||
mEnv_wind_info.wind_angle = mEnv_wind_info.target_wind_angle;
|
||||
mEnv_wind_info.wind_angle_step = 0.0f;
|
||||
mEnv_wind_info.wind_power = mEnv_wind_info.target_wind_power;
|
||||
mEnv_wind_info.wind_power_step = 0.0f;
|
||||
}
|
||||
|
||||
extern void mEnv_WindMove() {
|
||||
if (mEnv_wind_info.wind_state == mEnv_WIND_STATE_STEADY) {
|
||||
if (
|
||||
(mEnv_wind_info.target_wind_angle > mEnv_wind_info.wind_angle && mEnv_wind_info.wind_angle_step < 0.0f) ||
|
||||
(mEnv_wind_info.target_wind_angle < mEnv_wind_info.wind_angle && mEnv_wind_info.wind_angle_step > 0.0f)
|
||||
) {
|
||||
mEnv_wind_info.wind_angle_step *= -1.0f; // invert wind angle step direction
|
||||
}
|
||||
|
||||
if (
|
||||
(mEnv_wind_info.target_wind_power > mEnv_wind_info.wind_power && mEnv_wind_info.wind_power_step < 0.0f) ||
|
||||
(mEnv_wind_info.target_wind_power < mEnv_wind_info.wind_power && mEnv_wind_info.wind_power_step > 0.0f)
|
||||
) {
|
||||
mEnv_wind_info.wind_power_step *= -1.0f; // invert wind power step direction
|
||||
}
|
||||
|
||||
/* process change in wind angle */
|
||||
if (mEnv_wind_info.target_wind_angle != mEnv_wind_info.wind_angle) {
|
||||
mEnv_wind_info.wind_angle += mEnv_wind_info.wind_angle_step;
|
||||
|
||||
/* stop wind angle step once target is reached */
|
||||
if (mEnv_wind_info.wind_angle_step > 0.0f) {
|
||||
if (mEnv_wind_info.wind_angle >= mEnv_wind_info.target_wind_angle) {
|
||||
mEnv_wind_info.wind_angle_step = 0.0f;
|
||||
}
|
||||
}
|
||||
else if (mEnv_wind_info.wind_angle_step < 0.0f) {
|
||||
if (mEnv_wind_info.wind_angle <= mEnv_wind_info.target_wind_angle) {
|
||||
mEnv_wind_info.wind_angle_step = 0.0f;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* process change in wind power */
|
||||
if (mEnv_wind_info.target_wind_power != mEnv_wind_info.wind_power) {
|
||||
mEnv_wind_info.wind_power += mEnv_wind_info.wind_power_step;
|
||||
|
||||
/* stop wind power step once target is reached */
|
||||
if (mEnv_wind_info.wind_power_step > 0.0f) {
|
||||
if (mEnv_wind_info.wind_power >= mEnv_wind_info.target_wind_power) {
|
||||
mEnv_wind_info.wind_power_step = 0.0f;
|
||||
}
|
||||
}
|
||||
else if (mEnv_wind_info.wind_power_step < 0.0f) {
|
||||
if (mEnv_wind_info.wind_power <= mEnv_wind_info.target_wind_power) {
|
||||
mEnv_wind_info.wind_power_step = 0.0f;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (mEnv_wind_info.gust_timer <= 0) {
|
||||
int res = (int)(fqrand() * 100.0f) & 1;
|
||||
f32 rng1 = fqrand();
|
||||
f32 rng2 = fqrand();
|
||||
|
||||
mEnv_wind_info.wind_state = (res == 1 || mEnv_wind_info.wind_power_range_min == 0.0f) ? mEnv_WIND_STATE_FAST : mEnv_WIND_STATE_SLOW;
|
||||
mEnv_wind_info.last_wind_power = mEnv_wind_info.wind_power;
|
||||
mEnv_wind_info.wind_power_timer = 200.0f + rng2 * 100.0f;
|
||||
|
||||
if (mEnv_wind_info.wind_state == mEnv_WIND_STATE_FAST) {
|
||||
mEnv_wind_info.gust_wind_power = mEnv_wind_info.wind_power_range_max + 0.3f + rng1 * ((mEnv_wind_info.wind_power_range_max + 0.4f) - (mEnv_wind_info.wind_power_range_max + 0.3f)); // ??
|
||||
}
|
||||
else {
|
||||
mEnv_wind_info.gust_wind_power = mEnv_wind_info.wind_power_range_min - 0.3f + rng1 * ((mEnv_wind_info.wind_power_range_min - 0.4f) - (mEnv_wind_info.wind_power_range_min - 0.3f)); // ??
|
||||
}
|
||||
}
|
||||
else {
|
||||
if (mEnv_wind_info.gust_timer > 0) {
|
||||
mEnv_wind_info.gust_timer--;
|
||||
}
|
||||
|
||||
if (mEnv_wind_info.wind_change_timer <= 0) {
|
||||
mEnv_ChangeWind();
|
||||
mEnv_wind_info.wind_change_timer = mEnv_WIND_CHANGE_RATE;
|
||||
}
|
||||
}
|
||||
}
|
||||
else if (mEnv_wind_info.wind_state == mEnv_WIND_STATE_FAST) {
|
||||
add_calc(&mEnv_wind_info.wind_power, mEnv_wind_info.gust_wind_power, 0.05f, 0.05f, 0.0001f);
|
||||
|
||||
if (mEnv_wind_info.wind_power_timer <= 0) {
|
||||
mEnv_wind_info.wind_state = mEnv_WIND_STATE_REDUCING;
|
||||
}
|
||||
else {
|
||||
mEnv_wind_info.wind_power_timer--;
|
||||
}
|
||||
}
|
||||
else if (mEnv_wind_info.wind_state == mEnv_WIND_STATE_SLOW) {
|
||||
add_calc(&mEnv_wind_info.wind_power, mEnv_wind_info.gust_wind_power, 0.05f, 0.05f, 0.0001f);
|
||||
|
||||
if (mEnv_wind_info.wind_power_timer <= 0) {
|
||||
mEnv_wind_info.wind_state = mEnv_WIND_STATE_REDUCING;
|
||||
}
|
||||
else {
|
||||
mEnv_wind_info.wind_power_timer--;
|
||||
}
|
||||
}
|
||||
else {
|
||||
add_calc(&mEnv_wind_info.wind_power, mEnv_wind_info.last_wind_power, 0.032f, 0.032f, 0.000005f);
|
||||
|
||||
if (mEnv_wind_info.wind_power == mEnv_wind_info.last_wind_power) {
|
||||
f32 rng = fqrand();
|
||||
|
||||
mEnv_wind_info.gust_timer = rng * 450.0f + 150.0f;
|
||||
mEnv_wind_info.wind_state = mEnv_WIND_STATE_STEADY;
|
||||
}
|
||||
}
|
||||
|
||||
if (mEnv_wind_info.wind_change_timer > 0) {
|
||||
mEnv_wind_info.wind_change_timer--;
|
||||
}
|
||||
}
|
||||
|
||||
extern void mEnv_DecideWeather_GameStart() {
|
||||
s16 weather;
|
||||
s16 intensity;
|
||||
s16 event_weather;
|
||||
s16 event_intensity;
|
||||
|
||||
mEnv_RandomWeather(&weather, &intensity);
|
||||
mEv_GetEventWeather(&event_weather, &event_intensity);
|
||||
|
||||
if (event_weather != -1) {
|
||||
weather = event_weather;
|
||||
intensity = event_intensity;
|
||||
}
|
||||
|
||||
if (mEv_CheckRealArbeit() == TRUE && weather == mEnv_WEATHER_RAIN) {
|
||||
weather = mEnv_WEATHER_CLEAR;
|
||||
intensity = mEnv_WEATHER_INTENSITY_NONE;
|
||||
}
|
||||
|
||||
Common_Set(weather, weather);
|
||||
Common_Set(weather_intensity, intensity);
|
||||
Common_Set(weather_time, Common_Get(time.rtc_time));
|
||||
}
|
||||
|
||||
extern void mEnv_DecideWeather_FirstGameStart() {
|
||||
mEnv_DecideWeather_GameStart();
|
||||
Save_Set(weather, ((u8)Common_Get(weather_intensity) | (u8)Common_Get(weather) << 4));
|
||||
|
||||
if (mTM_check_renew_time(mTM_RENEW_TIME_WEATHER)) {
|
||||
mTM_off_renew_time(mTM_RENEW_TIME_WEATHER);
|
||||
}
|
||||
}
|
||||
|
||||
static void mEnv_Rainbow_reserve() {
|
||||
Save_Set(rainbow_reserved, TRUE);
|
||||
Save_Set(rainbow_month, Common_Get(time.rtc_time).month);
|
||||
Save_Set(rainbow_day, Common_Get(time.rtc_time).day);
|
||||
}
|
||||
|
||||
extern void mEnv_PreRainNowFine_Init() {
|
||||
mAGrw_OrderSetHaniwa();
|
||||
mEnv_Rainbow_reserve();
|
||||
}
|
||||
|
||||
extern void mEnv_DecideWeather_NormalGameStart() {
|
||||
u8 weather;
|
||||
u8 intensity;
|
||||
|
||||
if (mTM_check_renew_time(mTM_RENEW_TIME_WEATHER)) {
|
||||
u8 save_weather;
|
||||
|
||||
mEnv_DecideWeather_GameStart();
|
||||
mTM_off_renew_time(mTM_RENEW_TIME_WEATHER);
|
||||
weather = Common_Get(weather);
|
||||
intensity = Common_Get(weather_intensity);
|
||||
save_weather = mEnv_SAVE_GET_WEATHER_TYPE(Save_Get(weather));
|
||||
|
||||
if (
|
||||
(weather == mEnv_WEATHER_CLEAR || weather == mEnv_WEATHER_SAKURA) &&
|
||||
(save_weather == mEnv_WEATHER_SNOW || save_weather == mEnv_WEATHER_RAIN)
|
||||
) {
|
||||
mEnv_PreRainNowFine_Init();
|
||||
}
|
||||
|
||||
Save_Set(weather, intensity | (weather << 4));
|
||||
}
|
||||
else {
|
||||
weather = mEnv_SAVE_GET_WEATHER_TYPE(Save_Get(weather));
|
||||
intensity = mEnv_SAVE_GET_WEATHER_INTENSITY(Save_Get(weather));
|
||||
|
||||
if (mEv_CheckRealArbeit() == TRUE && weather == mEnv_WEATHER_RAIN) {
|
||||
weather = mEnv_WEATHER_CLEAR;
|
||||
intensity = mEnv_WEATHER_INTENSITY_NONE;
|
||||
|
||||
Save_Set(weather, (intensity | (u8)weather << 4));
|
||||
}
|
||||
|
||||
Common_Set(weather, weather);
|
||||
Common_Set(weather_intensity, intensity);
|
||||
}
|
||||
|
||||
if (fqrand() < (f32)GETREG(TAKREG, 50) * 0.1f + 0.8f) {
|
||||
Common_Set(island_weather, mEnv_WEATHER_CLEAR);
|
||||
Common_Set(island_weather_intensity, mEnv_WEATHER_INTENSITY_NONE);
|
||||
}
|
||||
else {
|
||||
Common_Set(island_weather, mEnv_WEATHER_RAIN);
|
||||
Common_Set(island_weather_intensity, mEnv_WEATHER_INTENSITY_HEAVY);
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
extern int mEnv_NowWeather() {
|
||||
switch (mEv_CheckTitleDemo()) {
|
||||
case 1:
|
||||
return mEnv_WEATHER_SAKURA;
|
||||
case 2:
|
||||
return mEnv_WEATHER_RAIN;
|
||||
case 3:
|
||||
case 4:
|
||||
return mEnv_WEATHER_CLEAR;
|
||||
case 5:
|
||||
return mEnv_WEATHER_SNOW;
|
||||
}
|
||||
|
||||
if (mFI_GET_TYPE(mFI_GetFieldId()) == mFI_FIELD_FG) {
|
||||
return Common_Get(weather);
|
||||
}
|
||||
|
||||
return mEnv_WEATHER_CLEAR;
|
||||
}
|
||||
+11
-10
@@ -214,8 +214,7 @@ static void LightsN__diffuse_proc(LightsN* lights, LightParams* lightInfo){
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
extern void LightsN_list_check(LightsN* lights, LightNode* node, xyz_t* pos){
|
||||
extern void LightsN_list_check(LightsN* lights, Light_list* node, xyz_t* pos){
|
||||
|
||||
const static light_point_proc poslight_type_proc[] = {
|
||||
LightsN__point_proc,
|
||||
@@ -243,9 +242,9 @@ extern void LightsN_list_check(LightsN* lights, LightNode* node, xyz_t* pos){
|
||||
}
|
||||
}
|
||||
|
||||
static LightNode* Light_list_buf_new(){
|
||||
static Light_list* Light_list_buf_new(){
|
||||
|
||||
LightNode* light;
|
||||
Light_list* light;
|
||||
|
||||
if(light_list_buf.current >= 32){
|
||||
return NULL;
|
||||
@@ -268,11 +267,11 @@ static LightNode* Light_list_buf_new(){
|
||||
return light;
|
||||
}
|
||||
|
||||
static void Light_list_buf_delete(LightNode* light){
|
||||
static void Light_list_buf_delete(Light_list* light){
|
||||
if(light != NULL){
|
||||
light_list_buf.current--;
|
||||
light->info = NULL;
|
||||
light_list_buf.idx = (light - light_list_buf.lights) / (int)(sizeof(LightNode));
|
||||
light_list_buf.idx = (light - light_list_buf.lights) / (int)(sizeof(Light_list));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -312,9 +311,9 @@ static void Global_light_list_ct(Global_light* glight){
|
||||
glight->list = NULL;
|
||||
}
|
||||
|
||||
extern void Global_light_list_new(GAME_PLAY* play, Global_light* glight, Lights* light){
|
||||
extern Light_list* Global_light_list_new(GAME_PLAY* play, Global_light* glight, Lights* light){
|
||||
|
||||
LightNode* clight;
|
||||
Light_list* clight;
|
||||
|
||||
clight = Light_list_buf_new();
|
||||
|
||||
@@ -329,9 +328,11 @@ extern void Global_light_list_new(GAME_PLAY* play, Global_light* glight, Lights*
|
||||
|
||||
glight->list = clight;
|
||||
}
|
||||
|
||||
return clight;
|
||||
}
|
||||
|
||||
extern void Global_light_list_delete(Global_light* glight, LightNode* light){
|
||||
extern void Global_light_list_delete(Global_light* glight, Light_list* light){
|
||||
|
||||
if(light != NULL){
|
||||
if(light->prev != NULL){
|
||||
@@ -367,7 +368,7 @@ static LightsN* new_LightsN(GRAPH* graph, u8 r, u8 g, u8 b){
|
||||
|
||||
extern void Light_list_point_draw(GAME_PLAY* play){
|
||||
LightPoint* lightInfo;
|
||||
LightNode* light;
|
||||
Light_list* light;
|
||||
GRAPH* g = play->game.graph;
|
||||
f32 rad;
|
||||
Gfx* dl;
|
||||
|
||||
+5
-5
@@ -167,8 +167,8 @@ void Game_play_fbdemo_wipe_init(GAME_PLAY* play){
|
||||
|
||||
play->fbdemo_wipe.wipe_procs.init_proc(&wipe->wipe_data);
|
||||
|
||||
Common_Set(transWipeSpeed, 28);
|
||||
Common_Set(transFadeDuration, 30);
|
||||
Common_Set(transition.wipe_rate, 28);
|
||||
Common_Set(transition.fade_rate, 30);
|
||||
|
||||
wipe->wipe_procs.setcolor_proc(&wipe->wipe_data,0);
|
||||
|
||||
@@ -478,9 +478,9 @@ void play_init(GAME* game){
|
||||
play->fb_wipe_mode = 0;
|
||||
play->fb_fade_type = 1;
|
||||
|
||||
if(Common_Get(wipeType) != 0xFF){
|
||||
type = Common_Get(wipeType);
|
||||
Common_Set(wipeType, 0xFF);
|
||||
if(Common_Get(transition.wipe_type) != 0xFF){
|
||||
type = Common_Get(transition.wipe_type);
|
||||
Common_Set(transition.wipe_type, 0xFF);
|
||||
}
|
||||
|
||||
play->fb_wipe_type = type;
|
||||
|
||||
+1
-1
@@ -192,7 +192,7 @@ static void trademark_goto_demo_scene(GAME_TRADEMARK* trademark) {
|
||||
mTM_demotime_set(demo_no); // set demo date, time, and weather
|
||||
mPr_RandomSetPlayerData_title_demo(); // randomize player data
|
||||
set_npc_4_title_demo(trademark); // set animals in the demo
|
||||
Common_Set(wipeType, 3);
|
||||
Common_Set(transition.wipe_type, 3);
|
||||
}
|
||||
|
||||
Save_Set(scene_no, SCENE_TITLE_DEMO);
|
||||
|
||||
Reference in New Issue
Block a user