mirror of
https://github.com/ACreTeam/ac-decomp
synced 2026-05-23 06:34:18 -04:00
Merge pull request #246 from Cuyler36:ac_quest_manager
Implement & link ac_quest_manager.c
This commit is contained in:
@@ -430,6 +430,10 @@ ac_psnowman.c:
|
||||
.text: [0x80484098, 0x80484694]
|
||||
.rodata: [0x80644C30, 0x80644C60]
|
||||
.data: [0x8068A458, 0x8068A480]
|
||||
ac_quest_manager.c:
|
||||
.text: [0x80485508, 0x80487A78]
|
||||
.data: [0x8068A520, 0x8068ADF8]
|
||||
.bss: [0x812FC920, 0x812FC938]
|
||||
ac_rope.c:
|
||||
.text: [0x804967A4, 0x80496AB8]
|
||||
.rodata: [0x80644DB0, 0x80644DB8]
|
||||
|
||||
@@ -3,11 +3,264 @@
|
||||
|
||||
#include "types.h"
|
||||
#include "m_actor.h"
|
||||
#include "ac_npc.h"
|
||||
#include "m_submenu.h"
|
||||
#include "m_choice.h"
|
||||
#include "ac_quest_manager_clip.h"
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
#define aQMgr_REGIST_NUM 35
|
||||
|
||||
enum {
|
||||
aQMgr_TALK_STATE_INIT,
|
||||
aQMgr_TALK_STATE_SUB,
|
||||
|
||||
aQMgr_TALK_STATE_NUM
|
||||
};
|
||||
|
||||
enum {
|
||||
aQMgr_TALK_SUB_STATE_WAIT,
|
||||
aQMgr_TALK_SUB_STATE_MSG_DISAPPEAR_WAIT,
|
||||
aQMgr_TALK_SUB_STATE_MSG_APPEAR_WAIT,
|
||||
aQMgr_TALK_SUB_STATE_CHECK_BUTTON,
|
||||
aQMgr_TALK_SUB_STATE_HAND_ITEM_WAIT,
|
||||
aQMgr_TALK_SUB_STATE_NPC_HAND_WAIT,
|
||||
aQMgr_TALK_SUB_STATE_ITEM_WAIT,
|
||||
aQMgr_TALK_SUB_STATE_DEMO_ORDER_WAIT,
|
||||
aQMgr_TALK_SUB_STATE_NO_WAIT,
|
||||
aQMgr_TALK_SUB_STATE_NPC_HAND_WAIT_MSG_WAIT,
|
||||
aQMgr_TALK_SUB_STATE_ITEM_WAIT_END,
|
||||
aQMgr_TALK_SUB_STATE_ITEM_PLAYER_WAIT,
|
||||
|
||||
aQMgr_TALK_SUB_STATE_NUM
|
||||
};
|
||||
|
||||
enum {
|
||||
aQMgr_TALK_COMMON_SET_TARGET,
|
||||
aQMgr_TALK_COMMON_GET_ITEM_IDX,
|
||||
aQMgr_TALK_COMMON_SET_MSG_NO,
|
||||
aQMgr_TALK_COMMON_CLEAR_TALK_INFO,
|
||||
aQMgr_TALK_COMMON_SET_CHOICE_STR,
|
||||
aQMgr_TALK_COMMON_GET_SET_DATA,
|
||||
aQMgr_TALK_COMMON_SET_NPC_TAKEOUT_ITEM,
|
||||
aQMgr_TALK_COMMON_SET_NPC_TAKEOUT_REWARD,
|
||||
aQMgr_TALK_COMMON_TALK_INIT_OVL,
|
||||
aQMgr_TALK_COMMON_CHANGE_TALK_NORMAL,
|
||||
aQMgr_TALK_COMMON_CHANGE_TALK_ISLAND,
|
||||
|
||||
aQMgr_TALK_COMMON_NUM
|
||||
};
|
||||
|
||||
enum {
|
||||
aQMgr_TALK_KIND_QUEST,
|
||||
aQMgr_TALK_KIND_FIRST_JOB,
|
||||
aQMgr_TALK_KIND_NORMAL,
|
||||
aQMgr_TALK_KIND_ISLAND,
|
||||
|
||||
aQMgr_TALK_KIND_NUM
|
||||
};
|
||||
|
||||
enum {
|
||||
aQMgr_MSG_KIND_REQUEST_INIT,
|
||||
aQMgr_MSG_KIND_REQUEST_END,
|
||||
aQMgr_MSG_KIND_REQUEST_RECONF, // reconfirm?
|
||||
aQMgr_MSG_KIND_REQUEST_REJECT, // rejected offer
|
||||
aQMgr_MSG_KIND_COMPLETE_INIT,
|
||||
aQMgr_MSG_KIND_COMPLETE_END,
|
||||
aQMgr_MSG_KIND_FAILURE_INIT,
|
||||
aQMgr_MSG_KIND_FAILURE_END,
|
||||
aQMgr_MSG_KIND_FULL_ITEM, // pockets are full so can't give quests
|
||||
aQMgr_MSG_KIND_AFTER_REWARD,
|
||||
aQMgr_MSG_KIND_AFTER_REWARD_THANKS,
|
||||
aQMgr_MSG_KIND_REWARD_FULL_ITEM, // pockets are full so can't give reward
|
||||
aQMgr_MSG_KIND_REWARD_FULL_ITEM2, // pockets are still full
|
||||
aQMgr_MSG_KIND_NONE,
|
||||
|
||||
aQMgr_MSG_KIND_NUM = aQMgr_MSG_KIND_NONE
|
||||
};
|
||||
|
||||
enum {
|
||||
aQMgr_TIME_MORNING,
|
||||
aQMgr_TIME_DAY,
|
||||
aQMgr_TIME_EVENING,
|
||||
aQMgr_TIME_NIGHT,
|
||||
|
||||
aQMgr_TIME_NUM
|
||||
};
|
||||
|
||||
enum {
|
||||
aQMgr_QUEST_TARGET_RANDOM,
|
||||
aQMgr_QUEST_TARGET_RANDOM_EXCLUDED,
|
||||
aQMgr_QUEST_TARGET_ORIGINAL_TARGET, // same target as before?
|
||||
aQMgr_QUEST_TARGET_FOREIGN,
|
||||
aQMgr_QUEST_TARGET_LAST_REMOVE,
|
||||
aQMgr_QUEST_TARGET_CLIENT,
|
||||
|
||||
aQMgr_QUEST_TARGET_NUM
|
||||
};
|
||||
|
||||
enum {
|
||||
aQMgr_QUEST_ITEM_RANDOM,
|
||||
aQMgr_QUEST_ITEM_FRUIT,
|
||||
aQMgr_QUEST_ITEM_CLOTH,
|
||||
aQMgr_QUEST_ITEM_FROM_DATA,
|
||||
aQMgr_QUEST_ITEM_CURRENT_ITEM,
|
||||
aQMgr_QUEST_ITEM_NONE,
|
||||
|
||||
aQMgr_QUEST_ITEM_NUM
|
||||
};
|
||||
|
||||
enum {
|
||||
aQMgr_QUEST_REWARD_FTR,
|
||||
aQMgr_QUEST_REWARD_STATIONERY,
|
||||
aQMgr_QUEST_REWARD_CLOTH,
|
||||
aQMgr_QUEST_REWARD_CARPET,
|
||||
aQMgr_QUEST_REWARD_WALLPAPER,
|
||||
aQMgr_QUEST_REWARD_MONEY,
|
||||
aQMgr_QUEST_REWARD_WORN_CLOTH,
|
||||
aQMgr_QUEST_REWARD_7,
|
||||
|
||||
aQMgr_QUEST_REWARD_NUM
|
||||
};
|
||||
|
||||
typedef struct quest_manager_actor QUEST_MANAGER_ACTOR;
|
||||
|
||||
typedef union {
|
||||
mQst_base_c base;
|
||||
mQst_errand_c errand;
|
||||
mQst_delivery_c delivery;
|
||||
mQst_contest_c contest;
|
||||
} aQMgr_quest_c;
|
||||
|
||||
typedef struct quest_manager_order_s {
|
||||
u16 type;
|
||||
u16 value;
|
||||
} aQMgr_order_c;
|
||||
|
||||
typedef struct quest_manager_set_data_s {
|
||||
u32 to_type:3;
|
||||
u32 day_limit:6;
|
||||
u32 last_step:4;
|
||||
u32 handover_item:1;
|
||||
u32 src_item_type:3;
|
||||
mActor_name_t item;
|
||||
u8 reward_percentages[aQMgr_QUEST_REWARD_NUM];
|
||||
u32 max_pay;
|
||||
int msg_start[aQMgr_MSG_KIND_NUM];
|
||||
} aQMgr_set_data_c;
|
||||
|
||||
typedef struct quest_manager_flower_work_data_s {
|
||||
int exist_num;
|
||||
int goal_num;
|
||||
int remain_num;
|
||||
} aQMgr_flower_data_c;
|
||||
|
||||
typedef union {
|
||||
aQMgr_flower_data_c flower;
|
||||
} aQMgr_work_data_c;
|
||||
|
||||
typedef struct quest_manager_target_s {
|
||||
mQst_base_c quest_info;
|
||||
AnmPersonalID_c* from_id;
|
||||
AnmPersonalID_c* to_id;
|
||||
int quest_inv_item_idx;
|
||||
mActor_name_t quest_item;
|
||||
int reward_kind;
|
||||
mActor_name_t reward_item;
|
||||
u32 pay;
|
||||
lbRTC_time_c limit;
|
||||
aQMgr_set_data_c* set_data_p;
|
||||
int free_data_idx;
|
||||
mQst_base_c* free_data_p;
|
||||
u8 errand_type;
|
||||
aQMgr_work_data_c work;
|
||||
} aQMgr_target_c;
|
||||
|
||||
typedef struct quest_manager_regist_s aQMgr_regist_c;
|
||||
|
||||
typedef void (*aQMgr_CHECK_LIMIT_PROC)(QUEST_MANAGER_ACTOR*, aQMgr_regist_c*);
|
||||
typedef int (*aQMgr_CHECK_FINISH_PROC)(mQst_base_c*, Animal_c*);
|
||||
|
||||
struct quest_manager_regist_s {
|
||||
aQMgr_CHECK_LIMIT_PROC check_limit_proc;
|
||||
aQMgr_CHECK_FINISH_PROC check_finish_proc;
|
||||
mQst_base_c* quest_info;
|
||||
PersonalID_c* pid;
|
||||
AnmPersonalID_c from_id;
|
||||
AnmPersonalID_c to_id;
|
||||
mActor_name_t item;
|
||||
int animal_idx;
|
||||
};
|
||||
|
||||
typedef struct quest_manager_normal_info_s {
|
||||
Anmmem_c* memory;
|
||||
Anmplmail_c* anmplmail;
|
||||
u32 pay;
|
||||
int player_num_items; // valid items to trade
|
||||
int player_give_item_idx; // index to give item away
|
||||
mActor_name_t player_items[4]; // items which the player has in their inventory which match 'player_num_items'
|
||||
mActor_name_t selected_item;
|
||||
} aQMgr_normal_info_c;
|
||||
|
||||
typedef struct quest_manager_talk_wait_s {
|
||||
int flags[3];
|
||||
} aQMgr_talk_wait_info_c;
|
||||
|
||||
typedef struct quest_manager_choice_s {
|
||||
int choice_ids[mChoice_CHOICE_NUM];
|
||||
int choice_num;
|
||||
int talk_action;
|
||||
} aQMgr_choice_c;
|
||||
|
||||
typedef int (*aQMgr_TALK_COMMON_PROC)(QUEST_MANAGER_ACTOR*, int);
|
||||
typedef void (*aQMgr_ACTOR_CLEAR_REGIST_PROC)(aQMgr_regist_c*, int);
|
||||
typedef void (*aQMgr_ACTOR_REGIST_QUEST_PROC)(QUEST_MANAGER_ACTOR*, int*, aQMgr_quest_c*, int);
|
||||
typedef int (*aQMgr_GET_TIME_KIND_PROC)(int);
|
||||
typedef void (*aQMgr_TALK_INIT_PROC)(QUEST_MANAGER_ACTOR*);
|
||||
|
||||
/* sizeof(struct quest_manager_actor) == 0xAA0 */
|
||||
struct quest_manager_actor {
|
||||
/* 0x000 */ ACTOR actor_class;
|
||||
/* 0x174 */ Submenu* submenu;
|
||||
/* 0x178 */ ACTOR** client;
|
||||
/* 0x17C */ Anmmem_c** memory;
|
||||
/* 0x180 */ u8* mode;
|
||||
/* 0x184 */ u8 talk_state;
|
||||
/* 0x185 */ u8 sub_talk_state;
|
||||
/* 0x186 */ u8 talk_step;
|
||||
/* 0x188 */ aQMgr_choice_c choice;
|
||||
/* 0x1A8 */ int msg_no;
|
||||
/* 0x1AC */ int category_msg_no_start;
|
||||
/* 0x1B0 */ int msg_category;
|
||||
/* 0x1B4 */ aQMgr_order_c demo_order;
|
||||
/* 0x1B8 */ aQMgr_talk_wait_info_c wait_info;
|
||||
/* 0x1C4 */ mActor_name_t handover_item;
|
||||
/* 0x1C8 */ aQMgr_target_c target;
|
||||
/* 0x214 */ aQMgr_regist_c regist[aQMgr_REGIST_NUM];
|
||||
/* 0x930 */ int regist_idx;
|
||||
/* 0x934 */ int regist_use_no;
|
||||
/* 0x938 */ int _938;
|
||||
/* 0x93C */ int _93C;
|
||||
/* 0x940 */ aQMgr_Clip_c* clip;
|
||||
/* 0x944 */ aQMgr_TALK_INIT_PROC talk_init_proc;
|
||||
/* 0x948 */ aQMgr_TALK_COMMON_PROC talk_common_proc;
|
||||
/* 0x94C */ aQMgr_ACTOR_CLEAR_REGIST_PROC clear_regist_proc;
|
||||
/* 0x950 */ aQMgr_ACTOR_REGIST_QUEST_PROC regist_quest_proc;
|
||||
/* 0x954 */ aQMgr_GET_TIME_KIND_PROC get_time_kind_proc;
|
||||
/* 0x958 */ mActor_name_t cloth;
|
||||
/* 0x95A */ u8 talk_type;
|
||||
/* 0x95B */ u8 talk_change_type;
|
||||
/* 0x95C */ u8 errand_next[5];
|
||||
/* 0x962 */ Mail_c mail;
|
||||
/* 0xA8C */ Anmmem_c* mail_memory;
|
||||
/* 0xA90 */ u8 last_strings[7];
|
||||
/* 0xA98 */ mActor_name_t give_item;
|
||||
/* 0xA9C */ int _A9C;
|
||||
};
|
||||
|
||||
extern ACTOR_PROFILE Quest_Manager_Profile;
|
||||
|
||||
#ifdef __cplusplus
|
||||
|
||||
@@ -0,0 +1,25 @@
|
||||
#ifndef AC_QUEST_MANAGER_CLIP_H
|
||||
#define AC_QUEST_MANAGER_CLIP_H
|
||||
|
||||
#include "types.h"
|
||||
#include "ac_npc.h"
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
typedef int (*aQMgr_TALK_REQUEST_PROC)(ACTOR*);
|
||||
typedef int (*aQMgr_TALK_START_PROC)(ACTOR*);
|
||||
typedef int (*aQMgr_TALK_CHECK_PROC)(ACTOR*);
|
||||
|
||||
typedef struct quest_manager_clip_s {
|
||||
aQMgr_TALK_REQUEST_PROC talk_request_proc;
|
||||
aQMgr_TALK_START_PROC talk_start_proc;
|
||||
aQMgr_TALK_CHECK_PROC talk_check_proc;
|
||||
} aQMgr_Clip_c;
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,17 @@
|
||||
#ifndef AC_QUEST_TALK_FJ_INIT_H
|
||||
#define AC_QUEST_TALK_FJ_INIT_H
|
||||
|
||||
#include "types.h"
|
||||
#include "ac_quest_manager.h"
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
extern void aQMgr_talk_first_job_init(QUEST_MANAGER_ACTOR* manager);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,17 @@
|
||||
#ifndef AC_QUEST_TALK_GREETING_H
|
||||
#define AC_QUEST_TALK_GREETING_H
|
||||
|
||||
#include "types.h"
|
||||
#include "ac_quest_manager.h"
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
extern int aQMgr_get_hello_msg_no(ACTOR* client, aQMgr_GET_TIME_KIND_PROC time_proc, mActor_name_t give_item);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,17 @@
|
||||
#ifndef AC_QUEST_TALK_INIT_H
|
||||
#define AC_QUEST_TALK_INIT_H
|
||||
|
||||
#include "types.h"
|
||||
#include "ac_quest_manager.h"
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
extern void aQMgr_actor_move_talk_init(QUEST_MANAGER_ACTOR* manager);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,17 @@
|
||||
#ifndef AC_QUEST_TALK_ISLAND_H
|
||||
#define AC_QUEST_TALK_ISLAND_H
|
||||
|
||||
#include "types.h"
|
||||
#include "ac_quest_manager.h"
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
extern void aQMgr_talk_island_init(QUEST_MANAGER_ACTOR* manager);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,17 @@
|
||||
#ifndef AC_QUEST_TALK_NORMAL_INIT_H
|
||||
#define AC_QUEST_TALK_NORMAL_INIT_H
|
||||
|
||||
#include "types.h"
|
||||
#include "ac_quest_manager.h"
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
extern void aQMgr_talk_normal_init(QUEST_MANAGER_ACTOR* manager);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif
|
||||
+2
-1
@@ -22,6 +22,7 @@
|
||||
#include "ac_arrange_room.h"
|
||||
#include "ac_shop_umbrella.h"
|
||||
#include "ac_handOverItem.h"
|
||||
#include "ac_quest_manager_clip.h"
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
@@ -39,7 +40,7 @@ typedef struct clip_s {
|
||||
/* 0x060 */ aSM_Clip_c* shop_manekin_clip;
|
||||
/* 0x064 */ void* _064;
|
||||
/* 0x068 */ CLIP_NONE_PROC _068;
|
||||
/* 0x06C */ void* _06C;
|
||||
/* 0x06C */ aQMgr_Clip_c* quest_manager_clip;
|
||||
/* 0x070 */ aSI_Clip_c* shop_indoor_clip;
|
||||
/* 0x074 */ bIT_Clip_c* bg_item_clip;
|
||||
/* 0x078 */ aWeather_Clip_c* weather_clip;
|
||||
|
||||
+1
-1
@@ -23,7 +23,7 @@ extern "C" {
|
||||
#define SQ(x) ((x)*(x))
|
||||
#define CLAMP_MAX(x, min) ((min) < (x) ? (min) : (x))
|
||||
|
||||
/* Percent of 360 deg */
|
||||
/* Float modulo operator */
|
||||
#define MOD_F(a, m) (a - (int)((a) * (1.0f / (m))) * (m))
|
||||
|
||||
/* radians -> short angle */
|
||||
|
||||
@@ -2414,7 +2414,7 @@ extern int mNT_check_unknown(mActor_name_t item_no);
|
||||
#define SP_NPC_EV_GROUNDHOG_4 (SP_NPC_START + 140) // D08C
|
||||
#define SP_NPC_TURKEY (SP_NPC_START + 141) // D08D
|
||||
#define SP_NPC_HEM (SP_NPC_START + 142) // D08E
|
||||
|
||||
#define SP_NPC_EV_SUMMERCAMP_0 (SP_NPC_START + 143) // 0xD08F
|
||||
|
||||
#define NPC_START 0xE000
|
||||
// cats
|
||||
|
||||
+2
-1
@@ -35,6 +35,7 @@ extern "C" {
|
||||
#define mNpc_ISLAND_FTR_NUM 16
|
||||
#define mNpc_EVENT_NPC_NUM 5
|
||||
#define mNpc_MASK_NPC_NUM 3
|
||||
#define mNpc_ISLANDER_NO ANIMAL_NUM_MAX
|
||||
|
||||
enum {
|
||||
mNpc_MOOD_0,
|
||||
@@ -333,7 +334,7 @@ extern void mNpc_CopyAnimalInfo(Animal_c* dst, Animal_c* src);
|
||||
extern int mNpc_SearchAnimalinfo(Animal_c* animal, mActor_name_t npc_id, int count);
|
||||
extern Animal_c* mNpc_GetAnimalInfoP(mActor_name_t npc_id);
|
||||
extern int mNpc_SearchAnimalPersonalID(AnmPersonalID_c* anm_pid);
|
||||
extern AnmPersonalID_c* mNpc_GetOtherAnimalPersonalIDOtherBlock(AnmPersonalID_c* pids, int count, int bx, int bz, int check_flag);
|
||||
extern AnmPersonalID_c* mNpc_GetOtherAnimalPersonalIDOtherBlock(AnmPersonalID_c* exclude_pids, int count, int bx, int bz, int check_flag);
|
||||
extern AnmPersonalID_c* mNpc_GetOtherAnimalPersonalID(AnmPersonalID_c* pids, int count);
|
||||
extern void mNpc_SetAnimalThisLand(Animal_c* animal, int count);
|
||||
extern int mNpc_GetSameLooksNum(u8 looks);
|
||||
|
||||
@@ -55,6 +55,7 @@ extern void mPlib_Set_boat_angleZ(s16 angleZ);
|
||||
extern int mPlib_Get_end_player_demo_walk();
|
||||
extern int mPlib_request_main_demo_geton_boat_type1(f32 goal_x, f32 goal_z, s16 angleY);
|
||||
extern int mPlib_request_main_demo_getoff_boat_standup_type1(const xyz_t* pos, s16 angleY);
|
||||
extern int mPlib_check_player_actor_main_index_RecieveMove(GAME* game);
|
||||
|
||||
extern mPlayer_change_data_from_submenu_c* mPlib_Get_change_data_from_submenu_p();
|
||||
|
||||
|
||||
@@ -37,6 +37,8 @@ extern "C" {
|
||||
#define mQst_LETTER_OKAY_LENGTH 17
|
||||
#define mQst_LETTER_GOOD_LENGTH 49
|
||||
|
||||
#define mQst_DELIVERY_KIND_NUM 4
|
||||
|
||||
enum {
|
||||
mQst_QUEST_TYPE_DELIVERY, /* Deliver item quest */
|
||||
mQst_QUEST_TYPE_ERRAND, /* Villager 'can I help' quests */
|
||||
|
||||
+1
-1
@@ -46,7 +46,7 @@ enum zurumode_stage {
|
||||
};
|
||||
|
||||
#define ZURUMODE_ENABLED() (zurumode_flag >= 1)
|
||||
#define ZURUMODE2_ENALBED() (zurumode_flag >= 2)
|
||||
#define ZURUMODE2_ENABLED() (zurumode_flag >= 2)
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
|
||||
@@ -0,0 +1,180 @@
|
||||
static void aQMgr_actor_check_limit_and_clear_quest(mQst_contest_c* contest) {
|
||||
if (mQst_CheckLimitOver(&contest->base) == TRUE) {
|
||||
mQst_ClearContest(contest);
|
||||
}
|
||||
}
|
||||
|
||||
static void aQMgr_contest_check_limit(QUEST_MANAGER_ACTOR* manager, aQMgr_regist_c* regist) {
|
||||
aQMgr_actor_check_limit_and_clear_quest((mQst_contest_c*)regist->quest_info);
|
||||
}
|
||||
|
||||
static int aQMgr_actor_check_fin_fruit(mQst_base_c* quest_info, Animal_c* animal) {
|
||||
int res = FALSE;
|
||||
|
||||
if (quest_info->progress == 1 && aQMgr_actor_check_fin_item(quest_info, animal) == TRUE) {
|
||||
res = TRUE;
|
||||
}
|
||||
|
||||
return res;
|
||||
}
|
||||
|
||||
static int aQMgr_actor_check_fin_soccer(mQst_base_c* quest_info, Animal_c* animal) {
|
||||
int res = FALSE;
|
||||
|
||||
if (quest_info->progress == 1) {
|
||||
res = TRUE;
|
||||
}
|
||||
|
||||
return res;
|
||||
}
|
||||
|
||||
static void aQMgr_actor_contest_snowman_clear(QUEST_MANAGER_ACTOR* manager, aQMgr_regist_c* regist) {
|
||||
lbRTC_time_c* rtc_time = Common_GetPointer(time.rtc_time);
|
||||
|
||||
if (regist != NULL && regist->quest_info != NULL) {
|
||||
mQst_base_c* quest_info = regist->quest_info;
|
||||
|
||||
if (
|
||||
(rtc_time->month == lbRTC_FEBRUARY && rtc_time->day > 17) ||
|
||||
(rtc_time->month >= lbRTC_MARCH && rtc_time->month <= lbRTC_NOVEMBER) ||
|
||||
(rtc_time->month == lbRTC_DECEMBER && rtc_time->day < 25) ||
|
||||
(mQst_CheckLimitOver(quest_info) == TRUE)
|
||||
) {
|
||||
mQst_ClearContest((mQst_contest_c*)quest_info);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static int aQMgr_actor_check_fin_snowman(mQst_base_c* quest_info, Animal_c* animal) {
|
||||
int res = FALSE;
|
||||
|
||||
if (animal != NULL && quest_info != NULL) {
|
||||
mQst_contest_c* contest = (mQst_contest_c*)quest_info;
|
||||
|
||||
if (quest_info->progress == 1 &&
|
||||
mPr_NullCheckPersonalID(&contest->player_id) == FALSE &&
|
||||
mPr_CheckCmpPersonalID(&contest->player_id, &Common_Get(now_private)->player_ID) == TRUE) {
|
||||
res = TRUE;
|
||||
}
|
||||
}
|
||||
|
||||
return res;
|
||||
}
|
||||
|
||||
static void aQMgr_actor_contest_flower_clear(QUEST_MANAGER_ACTOR* manager, aQMgr_regist_c* regist) {
|
||||
lbRTC_time_c* rtc_time = Common_GetPointer(time.rtc_time);
|
||||
|
||||
if (regist != NULL && regist->quest_info != NULL) {
|
||||
mQst_base_c* quest_info = regist->quest_info;
|
||||
|
||||
if (
|
||||
(rtc_time->month == lbRTC_JANUARY) ||
|
||||
(rtc_time->month == lbRTC_FEBRUARY && rtc_time->day < 25) ||
|
||||
(rtc_time->month >= lbRTC_SEPTEMBER) ||
|
||||
(mQst_CheckLimitOver(quest_info) == TRUE)
|
||||
) {
|
||||
mQst_ClearContest((mQst_contest_c*)quest_info);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static int aQMgr_actor_check_flower(mQst_contest_c* contest, int bx, int bz) {
|
||||
int res = FALSE;
|
||||
int flower_num = mQst_GetFlowerSeedNum(bx, bz);
|
||||
|
||||
if (contest->base.progress == 1) {
|
||||
if (contest->info.flower_data.flowers_requested <= flower_num) {
|
||||
if (mPr_NullCheckPersonalID(&contest->player_id) == TRUE || mPr_CheckCmpPersonalID(&contest->player_id, &Common_Get(now_private)->player_ID) == TRUE) {
|
||||
res = TRUE;
|
||||
}
|
||||
}
|
||||
else {
|
||||
mPr_ClearPersonalID(&contest->player_id);
|
||||
}
|
||||
}
|
||||
|
||||
return res;
|
||||
}
|
||||
|
||||
static int aQMgr_actor_check_fin_flower(mQst_base_c* quest_info, Animal_c* animal) {
|
||||
mQst_contest_c* contest = (mQst_contest_c*)quest_info;
|
||||
|
||||
return aQMgr_actor_check_flower(contest, animal->home_info.block_x, animal->home_info.block_z);
|
||||
}
|
||||
|
||||
static int aQMgr_actor_check_fin_quest_have_item1(mQst_contest_c* contest, u8 item1_category) {
|
||||
int res = FALSE;
|
||||
|
||||
if (contest->base.progress == 1 && mPr_NullCheckPersonalID(&contest->player_id) == TRUE && mPr_GetPossessionItemIdxItem1Category(Common_Get(now_private), item1_category) != -1) {
|
||||
res = TRUE;
|
||||
}
|
||||
|
||||
return res;
|
||||
}
|
||||
|
||||
static int aQMgr_actor_check_fin_fish(mQst_base_c* quest_info, Animal_c* animal) {
|
||||
mQst_contest_c* contest = (mQst_contest_c*)quest_info;
|
||||
|
||||
return aQMgr_actor_check_fin_quest_have_item1(contest, ITEM1_CAT_FISH);
|
||||
}
|
||||
|
||||
static void aQMgr_actor_contest_insect_clear(QUEST_MANAGER_ACTOR* manager, aQMgr_regist_c* regist) {
|
||||
lbRTC_time_c* rtc_time = Common_GetPointer(time.rtc_time);
|
||||
|
||||
if (regist != NULL && regist->quest_info != NULL) {
|
||||
mQst_base_c* quest_info = regist->quest_info;
|
||||
|
||||
if (
|
||||
(rtc_time->month <= lbRTC_FEBRUARY) ||
|
||||
(rtc_time->month == lbRTC_NOVEMBER && rtc_time->day >= 29) ||
|
||||
(rtc_time->month == lbRTC_DECEMBER) ||
|
||||
(mQst_CheckLimitOver(quest_info) == TRUE)
|
||||
) {
|
||||
mQst_ClearContest((mQst_contest_c*)quest_info);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static int aQMgr_actor_check_fin_insect(mQst_base_c* quest_info, Animal_c* animal) {
|
||||
mQst_contest_c* contest = (mQst_contest_c*)quest_info;
|
||||
|
||||
return aQMgr_actor_check_fin_quest_have_item1(contest, ITEM1_CAT_INSECT);
|
||||
}
|
||||
|
||||
static int aQMgr_actor_check_fin_contest_letter(mQst_base_c* quest_info, Animal_c* animal) {
|
||||
mQst_contest_c* contest = (mQst_contest_c*)quest_info;
|
||||
int res = FALSE;
|
||||
|
||||
if (contest->base.progress == 1) {
|
||||
res = TRUE;
|
||||
}
|
||||
|
||||
return res;
|
||||
}
|
||||
|
||||
static void aQMgr_save_contest_flower(aQMgr_regist_c* regist) {
|
||||
mQst_contest_c* contest = (mQst_contest_c*)regist->quest_info;
|
||||
Anmhome_c* home = &Save_Get(animals[regist->animal_idx]).home_info;
|
||||
|
||||
if (aQMgr_actor_check_flower(contest, home->block_x, home->block_z) == TRUE) {
|
||||
mPr_ClearPersonalID(&contest->player_id);
|
||||
mPr_CopyPersonalID(&contest->player_id, &Common_Get(now_private)->player_ID);
|
||||
}
|
||||
}
|
||||
|
||||
typedef void (*aQMgr_CONTEST_SAVE_PROC)(aQMgr_regist_c*);
|
||||
|
||||
static void aQMgr_save_contest(aQMgr_regist_c* regist) {
|
||||
int contest_kind = regist->quest_info->quest_kind;
|
||||
static aQMgr_CONTEST_SAVE_PROC save_proc[mQst_CONTEST_KIND_NUM] = {
|
||||
(aQMgr_CONTEST_SAVE_PROC)&none_proc1,
|
||||
(aQMgr_CONTEST_SAVE_PROC)&none_proc1,
|
||||
(aQMgr_CONTEST_SAVE_PROC)&none_proc1,
|
||||
&aQMgr_save_contest_flower,
|
||||
(aQMgr_CONTEST_SAVE_PROC)&none_proc1,
|
||||
(aQMgr_CONTEST_SAVE_PROC)&none_proc1,
|
||||
(aQMgr_CONTEST_SAVE_PROC)&none_proc1
|
||||
};
|
||||
|
||||
(*save_proc[contest_kind])(regist);
|
||||
}
|
||||
@@ -0,0 +1,85 @@
|
||||
static void aQMgr_move_own_errand_cloth(QUEST_MANAGER_ACTOR* manager, aQMgr_regist_c* regist) {
|
||||
mActor_name_t player_cloth = Common_Get(now_private)->cloth.item;
|
||||
mQst_errand_c* errand = (mQst_errand_c*)regist->quest_info;
|
||||
mActor_name_t cloth = errand->item;
|
||||
|
||||
switch (errand->base.progress) {
|
||||
case 2:
|
||||
if (cloth == player_cloth) {
|
||||
errand->base.progress = 0;
|
||||
}
|
||||
|
||||
break;
|
||||
|
||||
case 0:
|
||||
if (cloth != player_cloth) {
|
||||
errand->base.progress = 2;
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
static void aQMgr_move_own_errand_seed(QUEST_MANAGER_ACTOR* manager, aQMgr_regist_c* regist) {
|
||||
mActor_name_t* item_p = Common_Get(now_private)->inventory.pockets;
|
||||
mQst_errand_c* errand = (mQst_errand_c*)regist->quest_info;
|
||||
|
||||
if (errand->base.progress == 2) {
|
||||
int i;
|
||||
|
||||
for (i = 0; i < mPr_POCKETS_SLOT_COUNT; i++) {
|
||||
if (ITEM_NAME_GET_TYPE(*item_p) == NAME_TYPE_ITEM1 && ITEM_NAME_GET_CAT(*item_p) == ITEM1_CAT_PLANT) {
|
||||
break;
|
||||
}
|
||||
|
||||
item_p++;
|
||||
}
|
||||
|
||||
// Reset progress if no plants in inventory
|
||||
if (i >= mPr_POCKETS_SLOT_COUNT) {
|
||||
errand->base.progress = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static void aQMgr_move_own_errand_letter(QUEST_MANAGER_ACTOR* manager, aQMgr_regist_c* regist) {
|
||||
mQst_errand_c* errand = (mQst_errand_c*)regist->quest_info;
|
||||
PersonalID_c* pid = &Common_Get(now_private)->player_ID;
|
||||
AnmPersonalID_c* to_id;
|
||||
Animal_c* animal = Save_Get(animals);
|
||||
Anmmem_c* memory;
|
||||
|
||||
if (errand->base.progress == 2 || errand->base.progress == 3) {
|
||||
int i;
|
||||
|
||||
to_id = &errand->recipient;
|
||||
for (i = 0; i < ANIMAL_NUM_MAX; i++) {
|
||||
if (mNpc_CheckCmpAnimalPersonalID(to_id, &animal->id) == TRUE) {
|
||||
int idx;
|
||||
|
||||
memory = animal->memories;
|
||||
idx = mNpc_GetAnimalMemoryIdx(pid, memory, ANIMAL_MEMORY_NUM);
|
||||
|
||||
if (idx != -1) {
|
||||
memory += idx;
|
||||
if (memory->letter_info.exists == TRUE) {
|
||||
errand->base.progress = 0;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
animal++;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static void aQMgr_move_own_errand_hello(QUEST_MANAGER_ACTOR* manager, aQMgr_regist_c* regist) {
|
||||
mQst_errand_c* errand = (mQst_errand_c*)regist->quest_info;
|
||||
|
||||
if (errand->base.progress == 2) {
|
||||
if (mNpc_CheckFriendAllAnimal(&Common_Get(now_private)->player_ID) == TRUE && mSC_check_ArbeitPlayer()) {
|
||||
errand->base.progress = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
File diff suppressed because it is too large
Load Diff
+8
-6
@@ -229,7 +229,7 @@ static s16 cKF_KeyCalc(s16 start_idx, s16 n_frames, s16* data_src, f32 frame) {
|
||||
// Search through all frames
|
||||
now = 0;
|
||||
next = 1;
|
||||
|
||||
|
||||
while (TRUE) {
|
||||
if (key_p[next].frame > frame) {
|
||||
f32 delta_frame = key_p[next].frame - key_p[now].frame;
|
||||
@@ -237,15 +237,16 @@ static s16 cKF_KeyCalc(s16 start_idx, s16 n_frames, s16* data_src, f32 frame) {
|
||||
if (!(F32_IS_ZERO(delta_frame))) {
|
||||
f32 t = (frame - key_p[now].frame) / delta_frame; // progress towards the next frame
|
||||
f32 tension = delta_frame * (1.0f / 30.0f);
|
||||
f32 calc = cKF_HermitCalc(t, tension, key_p[now].value, key_p[next].value, key_p[now].tangent, key_p[next].tangent);
|
||||
int key = calc + 0.5;
|
||||
f32 calc = cKF_HermitCalc(t, tension, key_p[now].value, key_p[next].value, key_p[now].tangent,
|
||||
key_p[next].tangent);
|
||||
int key = calc + 0.5; // Always round up
|
||||
|
||||
return key;
|
||||
} else {
|
||||
return key_p[now].value;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
now++;
|
||||
next++;
|
||||
}
|
||||
@@ -271,7 +272,7 @@ extern void cKF_SkeletonInfo_subRotInterpolation(f32 t, s16* out, s16 rot1, s16
|
||||
* Morphs current state towards a target state with a given step size.
|
||||
*
|
||||
* Adjusts 'now' values towards 'target' values based on 'step', performing this operation
|
||||
* for three consecutive s16 values starting from 'now' and 'target'.
|
||||
* for three consecutive s16 values (x->y->z) starting from 'now' and 'target'.
|
||||
*
|
||||
* @param now Pointer to the current values.
|
||||
* @param target Pointer to the target values to morph towards.
|
||||
@@ -527,7 +528,8 @@ extern int cKF_SkeletonInfo_R_play(cKF_SkeletonInfo_R_c* keyframe) {
|
||||
// Convert joint value to fixed-point format after scaling
|
||||
jointFlag >>= 1; // Shift flag for next component x -> y -> z
|
||||
|
||||
// Reduce the value by 10% and clamp to [0, 360) degrees converted back to binangle (s16)
|
||||
// Reduce the value by 90% and clamp to [0, 360) degrees converted back to binangle (s16)
|
||||
// This effectively limits any joint's maximum rotation to be in the range of [-36.8, 36.7] degrees
|
||||
adjustedJointValue = *jointValuePtr * 0.1f;
|
||||
*jointValuePtr++ = DEG2SHORT_ANGLE(MOD_F(adjustedJointValue, 360.0f));
|
||||
}
|
||||
|
||||
+1
-1
@@ -288,7 +288,7 @@ extern void mAGrw_RenewalFgItem(lbRTC_time_c* time) {
|
||||
mAGrw_RenewalFgItem_ovl(time, &haniwa_scheduled);
|
||||
Save_Set(haniwa_scheduled, haniwa_scheduled);
|
||||
|
||||
if (ZURUMODE2_ENALBED()) {
|
||||
if (ZURUMODE2_ENABLED()) {
|
||||
mAGrw_SetDebugData();
|
||||
}
|
||||
}
|
||||
|
||||
+4
-4
@@ -5185,13 +5185,13 @@ extern void mNpc_TalkInfoMove() {
|
||||
}
|
||||
}
|
||||
|
||||
extern void mNpc_TalkEndMove(int animal_idx, int feel) {
|
||||
if (animal_idx >= 0 && animal_idx < ARRAY_COUNT(l_npc_talk_info) && feel >= 0 && feel < mNpc_FEEL_NUM) {
|
||||
extern void mNpc_TalkEndMove(int animal_idx, int looks) {
|
||||
if (animal_idx >= 0 && animal_idx < ARRAY_COUNT(l_npc_talk_info) && looks >= 0 && looks < mNpc_LOOKS_NUM) {
|
||||
mNpc_Talk_Info_c* talk_info = &l_npc_talk_info[animal_idx];
|
||||
talk_info->timer = 1000;
|
||||
|
||||
if (mNpc_CountTalkNum(animal_idx, feel) == TRUE && mNpc_CheckOverImpatient(animal_idx, feel) == TRUE) {
|
||||
mNpc_SetUnlockTimer(&talk_info->unlock_timer, &talk_info->reset_timer, feel);
|
||||
if (mNpc_CountTalkNum(animal_idx, looks) == TRUE && mNpc_CheckOverImpatient(animal_idx, looks) == TRUE) {
|
||||
mNpc_SetUnlockTimer(&talk_info->unlock_timer, &talk_info->reset_timer, looks);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user