mirror of
https://github.com/ACreTeam/ac-decomp
synced 2026-06-26 00:14:34 -04:00
118 lines
2.8 KiB
C
118 lines
2.8 KiB
C
#include "m_snowman.h"
|
|
|
|
#include "m_common_data.h"
|
|
#include "libultra/libultra.h"
|
|
#include "m_field_info.h"
|
|
#include "m_police_box.h"
|
|
#include "m_name_table.h"
|
|
#include "m_time.h"
|
|
|
|
|
|
extern int mSN_check_life(mActor_name_t* ac, int idx){
|
|
int ret = 0;
|
|
|
|
if(Common_Get(time.season) == mTM_SEASON_WINTER){
|
|
if((((*ac - SNOWMAN0) % 3) + idx) < mSN_SAVE_COUNT){
|
|
ret = 1;
|
|
}
|
|
}
|
|
return ret;
|
|
}
|
|
|
|
extern int mSN_ClearSnowmanData(mActor_name_t* ac, int idx){
|
|
|
|
bzero(Save_GetPointer(snowmen.snowmen_data[idx]), sizeof(mSN_snowman_data_c));
|
|
*ac = 0;
|
|
}
|
|
|
|
int mSN_ClearSnowman(u16* ac){
|
|
int ret = 0;
|
|
u32 snowId = *ac;
|
|
|
|
if((snowId >= SNOWMAN0) && (snowId <= SNOWMAN8)){
|
|
mSN_ClearSnowmanData(ac, (int)(snowId - SNOWMAN0) / mSN_SAVE_COUNT);
|
|
ret = 1;
|
|
}
|
|
return ret;
|
|
}
|
|
|
|
extern int mSN_MeltSnowman(mActor_name_t* ac, int days){
|
|
int ret;
|
|
u32 snowId;
|
|
int snowmelt;
|
|
mSN_snowman_data_c* snowman;
|
|
snowId = *ac;
|
|
ret = 0;
|
|
|
|
if((snowId >= SNOWMAN0) && (snowId <= SNOWMAN8)){
|
|
snowmelt = ((int)(snowId - SNOWMAN0) / mSN_SAVE_COUNT);
|
|
if(days < 0){
|
|
days = 1;
|
|
Save_Set(snowman_year, 0);
|
|
Save_Set(snowman_month, 0);
|
|
Save_Set(snowman_day, 0);
|
|
Save_Set(snowman_hour, 0);
|
|
|
|
}
|
|
if(mSN_check_life(ac, days) == 0){
|
|
mSN_ClearSnowmanData(ac, snowmelt);
|
|
}
|
|
else{
|
|
snowman = Save_GetPointer(snowmen.snowmen_data[snowmelt]);
|
|
*ac += days;
|
|
for(; days != 0; days--){
|
|
snowman->head_size = 0.8f * snowman->head_size;
|
|
snowman->body_size = 0.8f * snowman->body_size;
|
|
}
|
|
}
|
|
ret = 1;
|
|
}
|
|
|
|
return ret;
|
|
}
|
|
|
|
extern int mSN_get_free_space(void){
|
|
int ret = 0;
|
|
int i;
|
|
mSN_snowman_data_c* snowman = Save_GetPointer(snowmen.snowmen_data[0]);;
|
|
|
|
for(i = mSN_SAVE_COUNT; i != 0; i--){
|
|
if(snowman->exists == 0){
|
|
return ret;
|
|
}
|
|
snowman++;
|
|
ret++;
|
|
}
|
|
return -1;
|
|
}
|
|
|
|
extern void mSN_regist_snowman_society(mSN_snowman_info_c* info){
|
|
|
|
xyz_t spos = info->pos;
|
|
mActor_name_t ac = *mFI_GetUnitFG(spos);
|
|
int snowId = mSN_get_free_space();
|
|
xyz_t npos;
|
|
xyz_t ypos;
|
|
if(snowId != -1){
|
|
mem_copy((u8*)Save_GetPointer(snowmen.snowmen_data[snowId]), (u8*)info, 4);
|
|
if(ac != 0){
|
|
mPB_keep_item(ac);
|
|
npos = info->pos;
|
|
mFI_Wpos2DepositOFF(npos);
|
|
}
|
|
ypos = info->pos;
|
|
mFI_SetFG_common((u16)(snowId * mSN_SAVE_COUNT + SNOWMAN0),info->pos,1);
|
|
}
|
|
|
|
}
|
|
|
|
extern void mSN_decide_msg(){
|
|
|
|
Common_Set(snowman_msg_id, fqrand() * 3.0f);
|
|
}
|
|
|
|
extern void mSN_snowman_init(){
|
|
|
|
bzero(Save_GetPointer(snowmen), sizeof(mSN_snowman_save_c));
|
|
mSN_decide_msg();
|
|
} |