Files
ac-decomp/rel/m_snowman.c
T
2023-08-09 17:12:09 +02:00

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();
}