Implement & link m_quest.c

This commit is contained in:
Cuyler36
2023-09-15 06:25:28 -04:00
parent eecb4922a0
commit e3b384bb9b
9 changed files with 1259 additions and 7 deletions
+5
View File
@@ -157,6 +157,11 @@ m_private.c:
.rodata: [0x806431D8, 0x80643208]
.data: [0x8065BF00, 0x8065C030]
.bss: [0x8129CD40, 0x8129F2B0]
m_quest.c:
.text: [0x803E2990, 0x803E4B20]
.rodata: [0x80643208, 0x80643218]
.data: [0x8065C030, 0x8065C098]
.bss: [0x8129F2B0, 0x8129F2E8]
m_random_field.c:
.text: [0x803E4B20, 0x803E50E4]
.rodata: [0x80643218, 0x80643240]
+15 -2
View File
@@ -5,6 +5,7 @@
#include "m_actor.h"
#include "m_play.h"
#include "ac_npc_h.h"
#include "m_npc_schedule.h"
#include "m_actor_dlftbls.h"
#ifdef __cplusplus
@@ -25,6 +26,8 @@ typedef void (*aNPC_FREE_OVERLAY_AREA_PROC)(ACTOR_DLFTBL*);
typedef ACTOR* (*aNPC_GET_ACTOR_AREA_PROC)(size_t, const char*, int);
typedef void (*aNPC_FREE_ACTOR_AREA_PROC)(ACTOR*);
typedef int (*aNPC_FORCE_CALL_REQ_PROC)(NPC_ACTOR*, int);
struct ac_npc_clip_s {
aNPC_SETUP_ACTOR_PROC setupActor_proc;
void* _004;
@@ -32,13 +35,23 @@ struct ac_npc_clip_s {
aNPC_GET_ACTOR_AREA_PROC get_actor_area_proc;
aNPC_FREE_ACTOR_AREA_PROC free_actor_area_proc;
aNPC_DMA_DRAW_DATA_PROC dma_draw_data_proc;
void* _018[(0x12C - 0x018) / sizeof(void*)];
void* _018[(0x124 - 0x018) / sizeof(void*)];
aNPC_FORCE_CALL_REQ_PROC force_call_req_proc;
void* _128;
};
typedef struct npc_info_s {
mNPS_schedule_c* schedule;
mNpc_NpcList_c* list;
Animal_c* animal;
void* event; // TODO: EventNpc struct
} NpcActorInfo_c;
struct npc_actor_s {
ACTOR actor_class;
NpcActorInfo_c npc_info;
// TODO: finish
u8 _174[0x718 - 0x174];
u8 _174[0x718 - 0x184];
int texture_bank_idx; // TEMP: this is part of draw struct
u8 _71C[0x9D8 - 0x71C];
};
+1
View File
@@ -243,6 +243,7 @@ extern s8* mEv_get_save_area(int type, s8 id);
extern int mEv_ArbeitPlayer(u32 player_no);
extern u16 mEv_get_special_event_type();
extern int mEv_ClearEventSaveInfo(mEv_event_save_c* event_save_data);
extern void mEv_EventON(u32 event_kind);
extern int mEv_weekday2day(lbRTC_month_t month, int week_type, lbRTC_weekday_t weekday);
extern void mEv_ClearEventInfo();
+1
View File
@@ -163,6 +163,7 @@ extern void mFI_LposInBKtoWpos(xyz_t* wpos, xyz_t lpos, int block_x, int block_z
extern f32 mFI_GetBlockWidth();
extern f32 mFI_GetBlockHeight();
extern int mFI_Wpos2BkandUtNuminBlock(int* block_x, int* block_z, int* ut_x, int* ut_z, xyz_t wpos);
extern int mFI_GetItemNumOnBlockInField(int block_x, int block_z, mActor_name_t start_item, mActor_name_t end_item);
extern void mFI_PrintNowBGNum(gfxprint_t* gfxprint);
extern void mFI_PrintFgAttr(gfxprint_t* gfxprint);
+2
View File
@@ -218,6 +218,8 @@ struct message_window_s {
extern int mMsg_Get_Length_String(u8* buf, size_t buf_size);
extern mMsg_Window_c* mMsg_Get_base_window_p();
extern void mMsg_Set_free_str(mMsg_Window_c* msg, int free_str_no, u8* str, int str_size);
extern void mMsg_Set_free_str_art(mMsg_Window_c* msg, int free_str_no, u8* str, int str_size, int article_no);
extern void mMsg_Set_item_str_art(mMsg_Window_c* msg, int free_str_no, u8* str, int str_size, int article_no);
extern void mMsg_ct(GAME_PLAY*);
extern void mMsg_dt(GAME_PLAY*);
extern void mMsg_Main(GAME_PLAY*);
+4
View File
@@ -212,6 +212,10 @@ extern void mNpc_InitNpcAllInfo(int malloc_flag);
extern void mNpc_SetRemoveAnimalNo(u8* remove_animal_no, Animal_c* animals, int remove_no);
extern void mNpc_ClearAnimalPersonalID(AnmPersonalID_c* id);
extern int mNpc_CheckCmpAnimalPersonalID(AnmPersonalID_c* id0, AnmPersonalID_c* id1);
extern int mNpc_SearchAnimalPersonalID(AnmPersonalID_c* id);
extern void mNpc_GetActorWorldName(u8* buf, mActor_name_t id);
extern u8 mNpc_CheckNormalMail_length(int* len, u8* body);
extern mActor_name_t mNpc_GetNpcFurniture(AnmPersonalID_c* pid);
extern void mNpc_PrintRemoveInfo(gfxprint_t* gfxprint);
extern void mNpc_PrintFriendship_fdebug(gfxprint_t* gfxprint);
+2 -1
View File
@@ -82,7 +82,8 @@ enum {
#define mPr_FOREIGN_MAP_COUNT 8
#define mPr_ORIGINAL_DESIGN_COUNT 8
#define mPr_GET_ITEM_COND(all_cond, slot_no) (((all_cond) >> (2 * (slot_no))) & 3)
#define mPr_GET_ITEM_COND(all_cond, slot_no) (((all_cond) >> (((u32)(slot_no)) << 1)) & mPr_ITEM_COND_NUM)
#define mPr_SET_ITEM_COND(all_cond, slot_no, cond) (((all_cond) & ~((u32)mPr_ITEM_COND_NUM << ((u32)(slot_no) << 1))) | ((u32)(cond) << ((u32)(i) << 1)))
enum {
mPr_SUNBURN_RANK_MIN,
+103 -4
View File
@@ -12,11 +12,38 @@
extern "C" {
#endif
#define mQst_MAX_TIME_LIMIT_DAYS 28
#define mQst_CHECK_NPC_RECEIPIENT 0
#define mQst_CHECK_NPC_SENDER 1
#define mQst_LETTER_RANK_MIN 0
#define mQst_LETTER_RANK_0 mQst_LETTER_RANK_MIN
#define mQst_LETTER_RANK_1 1
#define mQst_LETTER_RANK_2 2
#define mQst_LETTER_RANK_3 3
#define mQst_LETTER_RANK_4 4
#define mQst_LETTER_RANK_5 5
#define mQst_LETTER_RANK_6 6
#define mQst_LETTER_RANK_7 7
#define mQst_LETTER_RANK_8 8
#define mQst_LETTER_RANK_9 9
#define mQst_LETTER_RANK_10 10
#define mQst_LETTER_RANK_11 11
#define mQst_LETTER_RANK_MAX mQst_LETTER_RANK_11 + 1
#define mQst_LETTER_SCORE_BONUS 3 /* Given when the raw score of the letter has passed the threshold */
#define mQst_LETTER_PRESENT_BONUS 6 /* Given when a present is attached */
#define mQst_LETTER_OKAY_LENGTH 17
#define mQst_LETTER_GOOD_LENGTH 49
enum {
mQst_QUEST_TYPE_DELIVERY, /* Deliver item quest */
mQst_QUEST_TYPE_ERRAND, /* Villager 'can I help' quests */
mQst_QUEST_TYPE_CONTEST, /* Villager send letter, plant flowers, bring ball, etc */
mQst_QUEST_TYPE_NONE
mQst_QUEST_TYPE_NONE,
mQst_QUEST_TYPE_NUM = mQst_QUEST_TYPE_NONE
};
/* sizeof(mQst_base_c) == 0xC */
@@ -40,7 +67,9 @@ enum {
mQst_CONTEST_KIND_FLOWER, /* plant flowers for villager */
mQst_CONTEST_KIND_FISH, /* get fish for villager */
mQst_CONTEST_KIND_INSECT, /* get insect for villager */
mQst_CONTEST_KIND_LETTER /* send letter to villager */
mQst_CONTEST_KIND_LETTER, /* send letter to villager */
mQst_CONTEST_KIND_NUM
};
/* sizeof(mQst_contest_info_u) == 4 */
@@ -77,10 +106,33 @@ typedef struct quest_delivery_s {
#define mQst_ERRAND_FIRST_JOB_ANIMAL_NUM 2
#define mQst_ERRAND_CHAIN_ANIMAL_NUM 3
enum {
mQst_ERRAND_REQUEST,
mQst_ERRAND_REQUEST_CONTINUE,
mQst_ERRAND_REQUEST_FINAL,
mQst_ERRAND_FIRSTJOB_CHANGE_CLOTH,
mQst_ERRAND_FIRSTJOB_PLANT_FLOWER,
mQst_ERRAND_FIRSTJOB_DELIVER_FTR,
mQst_ERRAND_FIRSTJOB_SEND_LETTER,
mQst_ERRAND_FIRSTJOB_DELIVER_CARPET,
mQst_ERRAND_FIRSTJOB_DELIVER_AXE,
mQst_ERRAND_FIRSTJOB_POST_NOTICE,
mQst_ERRAND_FIRSTJOB_SEND_LETTER2,
mQst_ERRAND_FIRSTJOB_DELIVER_AXE2,
mQst_ERRAND_FIRSTJOB_INTRODUCTIONS,
mQst_ERRAND_FIRSTJOB_OPEN,
mQst_ERRAND_FIRSTJOB_START,
mQst_ERRAND_NUM
};
enum {
mQst_ERRAND_TYPE_NONE,
mQst_ERRAND_TYPE_CHAIN,
mQst_ERRAND_TYPE_FIRST_JOB
mQst_ERRAND_TYPE_FIRST_JOB,
mQst_ERRAND_TYPE_NUM
};
/* sizeof(mQst_first_job_c) == 0x20 */
@@ -119,8 +171,55 @@ typedef struct not_saved_quest_s {
u8 h;
} mQst_not_saved_c;
extern void mQst_PrintQuestInfo(gfxprint_t* gfxprint);
extern void mQst_ClearQuestInfo(mQst_base_c* quest);
extern void mQst_ClearDelivery(mQst_delivery_c* delivery, int num);
extern void mQst_ClearErrand(mQst_errand_c* errand, int num);
extern void mQst_ClearContest(mQst_contest_c* contest);
extern void mQst_ClearNotSaveQuest(mQst_not_saved_c* not_saved);
extern void mQst_CopyQuestInfo(mQst_base_c* dst, mQst_base_c* src);
extern void mQst_CopyDelivery(mQst_delivery_c* dst, mQst_delivery_c* src);
extern void mQst_CopyErrand(mQst_errand_c* dst, mQst_errand_c* src);
extern int mQst_CheckFreeQuest(mQst_base_c* quest);
extern int mQst_CheckLimitOver(mQst_base_c* quest);
extern int mQst_GetOccuredDeliveryIdx(int delivery_kind);
extern int mQst_ClearQuestbyPossessionIdx(int idx);
extern int mQst_CheckLimitbyPossessionIdx(int idx);
extern void mQst_ClearGrabItemInfo();
extern void mQst_CheckGrabItem(mActor_name_t item, int pocket_idx);
extern void mQst_CheckPutItem(mActor_name_t item, int pocket_idx);
extern int mQst_CheckNpcExistbyItemIdx(int idx, int sender_or_receipient);
extern int mQst_GetToFromName(u8* to_name, u8* from_name, int idx);
extern int mQst_GetOccuredContestIdx(int kind);
extern int mQst_GetFlowerSeedNum(int block_x, int block_z);
extern int mQst_GetFlowerNum(int block_x, int block_z);
extern int mQst_GetNullNoNum(int block_x, int block_z);
extern void mQst_SetItemNameStr(mActor_name_t item, int string_no);
extern void mQst_SetItemNameFreeStr(mActor_name_t item, int string_no);
extern int mQst_SendRemail(mQst_contest_c* contest, AnmPersonalID_c* sender_id);
extern void mQst_SetReceiveLetter(mQst_contest_c* contest, PersonalID_c* sender_id, u8* body, mActor_name_t present);
extern mQst_errand_c* mQst_GetFirstJobData();
extern int mQst_CheckFirstJobQuestbyItemIdx(int idx);
extern int mQst_CheckFirstJobFin(mQst_errand_c* errand);
extern int mQst_CheckRemoveTarget(mQst_errand_c* errand);
extern void mQst_SetFirstJobStart(mQst_errand_c* errand);
extern void mQst_SetFirstJobChangeCloth(mQst_errand_c* errand, mActor_name_t item);
extern void mQst_SetFirstJobSeed(mQst_errand_c* errand);
extern void mQst_SetFirstJobHello(mQst_errand_c* errand);
extern void mQst_SetFirstJobFurniture(mQst_errand_c* errand, AnmPersonalID_c* pid, mActor_name_t item, u8 slot);
extern void mQst_SetFirstJobLetter(mQst_errand_c* errand, AnmPersonalID_c* pid);
extern void mQst_SetFirstJobLetter2(mQst_errand_c* errand, AnmPersonalID_c* pid);
extern void mQst_SetFirstJobOpenQuest(mQst_errand_c* errand);
extern void mQst_SetFirstJobCarpet(mQst_errand_c* errand, AnmPersonalID_c* pid, mActor_name_t item, u8 slot);
extern void mQst_SetFirstJobAxe(mQst_errand_c* errand, AnmPersonalID_c* pid, mActor_name_t item, u8 slot);
extern void mQst_SetFirstJobAxe2(mQst_errand_c* errand, AnmPersonalID_c* pid, mActor_name_t item, u8 slot);
extern void mQst_SetFirstJobNotice(mQst_errand_c* errand);
extern int mQst_GetRandom(int max);
extern void mQst_GetGoods_common(mActor_name_t* item, AnmPersonalID_c* pid, int category, mActor_name_t* exist_table, int exist_num, int list);
extern int mQst_CheckSoccerTarget(ACTOR* actor);
extern void mQst_NextSoccer(ACTOR* actor);
extern void mQst_NextSnowman(xyz_t snowman_pos);
extern void mQst_BackSnowman(xyz_t snowman_pos);
extern void mQst_PrintQuestInfo(gfxprint_t* gfxprint);
#ifdef __cplusplus
}
+1126
View File
File diff suppressed because it is too large Load Diff