From a612ef12a0a647fe0614f8003ce39448d46b02ef Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Mon, 18 Dec 2017 19:35:50 +0100 Subject: start working on trainer see --- src/egg_hatch.c | 2 +- src/trainer_see.c | 226 +++++++++++++++++++++++++++++++++++++++++++++++++++++- 2 files changed, 225 insertions(+), 3 deletions(-) (limited to 'src') diff --git a/src/egg_hatch.c b/src/egg_hatch.c index a31eb0520..9e9a192de 100644 --- a/src/egg_hatch.c +++ b/src/egg_hatch.c @@ -91,7 +91,7 @@ static void CreateRandomEggShardSprite(void); static void CreateEggShardSprite(u8 x, u8 y, s16 data1, s16 data2, s16 data3, u8 spriteAnimIndex); // IWRAM bss -static IWRAM_DATA struct EggHatchData* sEggHatchData; +static IWRAM_DATA struct EggHatchData *sEggHatchData; // rom data static const u16 sEggPalette[] = INCBIN_U16("graphics/pokemon/palettes/egg_palette.gbapal"); diff --git a/src/trainer_see.c b/src/trainer_see.c index b30f27347..b396d26e7 100644 --- a/src/trainer_see.c +++ b/src/trainer_see.c @@ -1,15 +1,158 @@ #include "global.h" #include "trainer_see.h" #include "battle_setup.h" +#include "pokemon.h" +#include "sprite.h" +#include "field_map_obj.h" +#include "pokenav.h" +#include "task.h" extern u8 gApproachingTrainerId; extern u8 gNoOfApproachingTrainers; extern u8 gUnknown_030060AC; extern u16 gUnknown_03006080; +extern bool8 InBattlePyramid(void); +extern bool32 InTrainerHill(void); +extern bool8 GetBattlePyramidTrainerFlag(u8 mapObjectId); +extern bool8 GetTrainerHillTrainerFlag(u8 mapObjectId); + // this file's functions -u8 CheckIfTrainerWantsBattle(u8 mapObjectId); +static u8 CheckTrainer(u8 mapObjectId); +u8 GetTrainerApproachDistance(struct MapObject *trainerObj); +void TrainerApproachPlayer(struct MapObject *trainerObj, u8 radius); + +u8 GetTrainerApproachDistanceSouth(struct MapObject *trainerObj, s16 range, s16 x, s16 y); +u8 GetTrainerApproachDistanceNorth(struct MapObject *trainerObj, s16 range, s16 x, s16 y); +u8 GetTrainerApproachDistanceWest(struct MapObject *trainerObj, s16 range, s16 x, s16 y); +u8 GetTrainerApproachDistanceEast(struct MapObject *trainerObj, s16 range, s16 x, s16 y); + +bool8 sub_80B4178(u8 taskId, struct Task *task, struct MapObject *trainerObj); +bool8 sub_80B417C(u8 taskId, struct Task *task, struct MapObject *trainerObj); +bool8 sub_80B41C0(u8 taskId, struct Task *task, struct MapObject *trainerObj); +bool8 sub_80B4200(u8 taskId, struct Task *task, struct MapObject *trainerObj); +bool8 sub_80B425C(u8 taskId, struct Task *task, struct MapObject *trainerObj); +bool8 sub_80B4318(u8 taskId, struct Task *task, struct MapObject *trainerObj); +bool8 sub_80B435C(u8 taskId, struct Task *task, struct MapObject *trainerObj); +bool8 sub_80B4390(u8 taskId, struct Task *task, struct MapObject *trainerObj); +bool8 sub_80B43AC(u8 taskId, struct Task *task, struct MapObject *trainerObj); +bool8 sub_80B43E0(u8 taskId, struct Task *task, struct MapObject *trainerObj); +bool8 sub_80B4438(u8 taskId, struct Task *task, struct MapObject *trainerObj); +bool8 sub_80B44AC(u8 taskId, struct Task *task, struct MapObject *trainerObj); + +bool8 sub_80B43AC(u8 taskId, struct Task *task, struct MapObject *trainerObj); +bool8 sub_80B43E0(u8 taskId, struct Task *task, struct MapObject *trainerObj); +bool8 sub_80B4438(u8 taskId, struct Task *task, struct MapObject *trainerObj); +bool8 sub_80B44AC(u8 taskId, struct Task *task, struct MapObject *trainerObj); + +void objc_exclamation_mark_probably(struct Sprite *sprite); + +// const rom data +const u8 gEmotion_ExclamationMarkGfx[] = INCBIN_U8("graphics/misc/emotion_exclamation.4bpp"); +const u8 gEmotion_QuestionMarkGfx[] = INCBIN_U8("graphics/misc/emotion_question.4bpp"); +const u8 gEmotion_HeartGfx[] = INCBIN_U8("graphics/misc/emotion_heart.4bpp"); + +u8 (*const sDirectionalApproachDistanceFuncs[])(struct MapObject *trainerObj, s16 range, s16 x, s16 y) = +{ + GetTrainerApproachDistanceSouth, + GetTrainerApproachDistanceNorth, + GetTrainerApproachDistanceWest, + GetTrainerApproachDistanceEast, +}; + +bool8 (*const gTrainerSeeFuncList[])(u8 taskId, struct Task *task, struct MapObject *trainerObj) = +{ + sub_80B4178, + sub_80B417C, + sub_80B41C0, + sub_80B4200, + sub_80B425C, + sub_80B4318, + sub_80B435C, + sub_80B4390, + sub_80B43AC, + sub_80B43E0, + sub_80B4438, + sub_80B44AC +}; + +bool8 (*const gTrainerSeeFuncList2[])(u8 taskId, struct Task *task, struct MapObject *trainerObj) = +{ + sub_80B43AC, + sub_80B43E0, + sub_80B4438, + sub_80B44AC, +}; + +const struct OamData gOamData_855077C = +{ + .y = 0, + .affineMode = 0, + .objMode = 0, + .mosaic = 0, + .bpp = 0, + .shape = 0, + .x = 0, + .matrixNum = 0, + .size = 1, + .tileNum = 0, + .priority = 1, + .paletteNum = 0, + .affineParam = 0, +}; + +const struct SpriteFrameImage gSpriteImageTable_8550784[] = +{ + {gEmotion_ExclamationMarkGfx, 0x80}, + {gEmotion_QuestionMarkGfx, 0x80} +}; +const struct SpriteFrameImage gSpriteImageTable_8550794[] = +{ + {gEmotion_HeartGfx, 0x80} +}; + +const union AnimCmd gSpriteAnim_855079C[] = +{ + ANIMCMD_FRAME(0, 60), + ANIMCMD_END +}; + +const union AnimCmd gSpriteAnim_85507A4[] = +{ + ANIMCMD_FRAME(1, 60), + ANIMCMD_END +}; + +const union AnimCmd *const gSpriteAnimTable_85507AC[] = +{ + gSpriteAnim_855079C, + gSpriteAnim_85507A4 +}; + +const struct SpriteTemplate gSpriteTemplate_85507B4 = +{ + .tileTag = 0xffff, + .paletteTag = 0xffff, + .oam = &gOamData_855077C, + .anims = gSpriteAnimTable_85507AC, + .images = gSpriteImageTable_8550784, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = objc_exclamation_mark_probably +}; + +const struct SpriteTemplate gSpriteTemplate_85507CC = +{ + .tileTag = 0xffff, + .paletteTag = 0x1004, + .oam = &gOamData_855077C, + .anims = gSpriteAnimTable_85507AC, + .images = gSpriteImageTable_8550794, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = objc_exclamation_mark_probably +}; + +// code bool8 CheckForTrainersWantingBattle(void) { u8 i; @@ -26,7 +169,7 @@ bool8 CheckForTrainersWantingBattle(void) if (gMapObjects[i].trainerType != 1 && gMapObjects[i].trainerType != 3) continue; - retVal = CheckIfTrainerWantsBattle(i); + retVal = CheckTrainer(i); if (retVal == 2) break; // two trainers have been found @@ -66,3 +209,82 @@ bool8 CheckForTrainersWantingBattle(void) return FALSE; } } + +static u8 CheckTrainer(u8 mapObjectId) +{ + const u8 *scriptPtr; + u8 ret = 1; + u8 approachDistance; + + if (InTrainerHill() == TRUE) + scriptPtr = sub_81D62AC(); + else + scriptPtr = GetFieldObjectScriptPointerByFieldObjectId(mapObjectId); + + if (InBattlePyramid()) + { + if (GetBattlePyramidTrainerFlag(mapObjectId)) + return 0; + } + else if (InTrainerHill() == TRUE) + { + if (GetTrainerHillTrainerFlag(mapObjectId)) + return 0; + } + else + { + if (GetTrainerFlagFromScriptPointer(scriptPtr)) + return 0; + } + + approachDistance = GetTrainerApproachDistance(&gMapObjects[mapObjectId]); + + if (approachDistance != 0) + { + if (scriptPtr[1] == TRAINER_BATTLE_DOUBLE + || scriptPtr[1] == TRAINER_BATTLE_REMATCH_DOUBLE + || scriptPtr[1] == TRAINER_BATTLE_CONTINUE_SCRIPT_DOUBLE) + { + if (GetMonsStateToDoubles_2() != 0) + return 0; + + ret = 2; + } + + gApproachingTrainers[gNoOfApproachingTrainers].mapObjectId = mapObjectId; + gApproachingTrainers[gNoOfApproachingTrainers].trainerScriptPtr = scriptPtr; + gApproachingTrainers[gNoOfApproachingTrainers].radius = approachDistance; + TrainerApproachPlayer(&gMapObjects[mapObjectId], approachDistance - 1); + gNoOfApproachingTrainers++; + + return ret; + } + + return 0; +} + +/* +u8 GetTrainerApproachDistance(struct MapObject *trainerObj) +{ + s16 x, y; + u8 i; + u8 approachDistance; + + PlayerGetDestCoords(&x, &y); + if (trainerObj->trainerType == 1) // can only see in one direction + { + approachDistance = sDirectionalApproachDistanceFuncs[trainerObj->mapobj_unk_18 - 1](trainerObj, trainerObj->trainerRange_berryTreeId, x, y); + return CheckPathBetweenTrainerAndPlayer((struct MapObject2 *)trainerObj, approachDistance, trainerObj->mapobj_unk_18); + } + else // can see in all directions + { + for (i = 0; i < 4; i++) + { + approachDistance = sDirectionalApproachDistanceFuncs[i](trainerObj, trainerObj->trainerRange_berryTreeId, x, y); + if (CheckPathBetweenTrainerAndPlayer((struct MapObject2 *)trainerObj, approachDistance, i + 1)) // directions are 1-4 instead of 0-3. south north west east + return approachDistance; + } + } + return 0; +} +*/ -- cgit v1.2.3 From 574435698942634f7e1bdf800a62391e6c03b064 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Mon, 18 Dec 2017 23:26:44 +0100 Subject: decompile trainer see --- src/field_map_obj.c | 18 +- src/scrcmd.c | 2 +- src/trainer_see.c | 486 +++++++++++++++++++++++++++++++++++++++++++++++++++- 3 files changed, 489 insertions(+), 17 deletions(-) (limited to 'src') diff --git a/src/field_map_obj.c b/src/field_map_obj.c index 6a99890a4..fc23a6e37 100755 --- a/src/field_map_obj.c +++ b/src/field_map_obj.c @@ -1174,11 +1174,11 @@ void npc_by_local_id_and_map_set_field_1_bit_x20(u8 localId, u8 mapNum, u8 mapGr } } -void FieldObjectGetLocalIdAndMap(struct MapObject *mapObject, u8 *localId, u8 *mapNum, u8 *mapGroup) +void FieldObjectGetLocalIdAndMap(struct MapObject *mapObject, void *localId, void *mapNum, void *mapGroup) { - *localId = mapObject->localId; - *mapNum = mapObject->mapNum; - *mapGroup = mapObject->mapGroup; + *(u8*)(localId) = mapObject->localId; + *(u8*)(mapNum) = mapObject->mapNum; + *(u8*)(mapGroup) = mapObject->mapGroup; } void sub_808E75C(s16 x, s16 y) @@ -3426,7 +3426,7 @@ void FieldObjectCB_TreeDisguise(struct Sprite *sprite) mapObject = &gMapObjects[sprite->data[0]]; if (mapObject->mapobj_unk_21 == 0 || (mapObject->mapobj_unk_21 == 1 && !sprite->data[7])) { - FieldObjectGetLocalIdAndMap(mapObject, (u8 *)&gFieldEffectArguments[0], (u8 *)&gFieldEffectArguments[1], (u8 *)&gFieldEffectArguments[2]); + FieldObjectGetLocalIdAndMap(mapObject, &gFieldEffectArguments[0], &gFieldEffectArguments[1], &gFieldEffectArguments[2]); mapObject->mapobj_unk_1A = FieldEffectStart(FLDEFF_TREE_DISGUISE); mapObject->mapobj_unk_21 = 1; sprite->data[7] ++; @@ -3447,7 +3447,7 @@ void FieldObjectCB_MountainDisguise(struct Sprite *sprite) mapObject = &gMapObjects[sprite->data[0]]; if (mapObject->mapobj_unk_21 == 0 || (mapObject->mapobj_unk_21 == 1 && !sprite->data[7])) { - FieldObjectGetLocalIdAndMap(mapObject, (u8 *)&gFieldEffectArguments[0], (u8 *)&gFieldEffectArguments[1], (u8 *)&gFieldEffectArguments[2]); + FieldObjectGetLocalIdAndMap(mapObject, &gFieldEffectArguments[0], &gFieldEffectArguments[1], &gFieldEffectArguments[2]); mapObject->mapobj_unk_1A = FieldEffectStart(FLDEFF_MOUNTAIN_DISGUISE); mapObject->mapobj_unk_21 = 1; sprite->data[7] ++; @@ -4694,7 +4694,7 @@ bool8 sub_80954CC(struct MapObject *mapObject, struct Sprite *sprite) bool8 do_exclamation_mark_bubble_1(struct MapObject *mapObject, struct Sprite *sprite) { - FieldObjectGetLocalIdAndMap(mapObject, (u8 *)&gFieldEffectArguments[0], (u8 *)&gFieldEffectArguments[1], (u8 *)&gFieldEffectArguments[2]); + FieldObjectGetLocalIdAndMap(mapObject, &gFieldEffectArguments[0], &gFieldEffectArguments[1], &gFieldEffectArguments[2]); FieldEffectStart(FLDEFF_EXCLAMATION_MARK_ICON_1); sprite->data[2] = 1; return TRUE; @@ -4702,7 +4702,7 @@ bool8 do_exclamation_mark_bubble_1(struct MapObject *mapObject, struct Sprite *s bool8 do_exclamation_mark_bubble_2(struct MapObject *mapObject, struct Sprite *sprite) { - FieldObjectGetLocalIdAndMap(mapObject, (u8 *)&gFieldEffectArguments[0], (u8 *)&gFieldEffectArguments[1], (u8 *)&gFieldEffectArguments[2]); + FieldObjectGetLocalIdAndMap(mapObject, &gFieldEffectArguments[0], &gFieldEffectArguments[1], &gFieldEffectArguments[2]); FieldEffectStart(FLDEFF_EXCLAMATION_MARK_ICON_2); sprite->data[2] = 1; return TRUE; @@ -4710,7 +4710,7 @@ bool8 do_exclamation_mark_bubble_2(struct MapObject *mapObject, struct Sprite *s bool8 do_heart_bubble(struct MapObject *mapObject, struct Sprite *sprite) { - FieldObjectGetLocalIdAndMap(mapObject, (u8 *)&gFieldEffectArguments[0], (u8 *)&gFieldEffectArguments[1], (u8 *)&gFieldEffectArguments[2]); + FieldObjectGetLocalIdAndMap(mapObject, &gFieldEffectArguments[0], &gFieldEffectArguments[1], &gFieldEffectArguments[2]); FieldEffectStart(FLDEFF_HEART_ICON); sprite->data[2] = 1; return TRUE; diff --git a/src/scrcmd.c b/src/scrcmd.c index 1b10501fc..412f8acd1 100644 --- a/src/scrcmd.c +++ b/src/scrcmd.c @@ -2332,7 +2332,7 @@ bool8 ScrCmd_mossdeepgym4(struct ScriptContext *ctx) bool8 ScrCmd_cmdD8(struct ScriptContext *ctx) { - gSelectedMapObject = sub_80B47BC(); + gSelectedMapObject = GetCurrentApproachingTrainerMapObjectId(); return FALSE; } diff --git a/src/trainer_see.c b/src/trainer_see.c index b396d26e7..26d00192e 100644 --- a/src/trainer_see.c +++ b/src/trainer_see.c @@ -3,24 +3,37 @@ #include "battle_setup.h" #include "pokemon.h" #include "sprite.h" +#include "field_effect.h" #include "field_map_obj.h" +#include "field_player_avatar.h" +#include "map_obj_8097404.h" #include "pokenav.h" #include "task.h" +#include "util.h" +#include "script.h" +#include "event_data.h" +#include "script_movement.h" extern u8 gApproachingTrainerId; extern u8 gNoOfApproachingTrainers; extern u8 gUnknown_030060AC; extern u16 gUnknown_03006080; +extern u8 gUnknown_03006084[]; extern bool8 InBattlePyramid(void); extern bool32 InTrainerHill(void); extern bool8 GetBattlePyramidTrainerFlag(u8 mapObjectId); extern bool8 GetTrainerHillTrainerFlag(u8 mapObjectId); +extern void sub_809BE48(u16 npcId); // this file's functions -static u8 CheckTrainer(u8 mapObjectId); +u8 CheckTrainer(u8 mapObjectId); u8 GetTrainerApproachDistance(struct MapObject *trainerObj); -void TrainerApproachPlayer(struct MapObject *trainerObj, u8 radius); +void TrainerApproachPlayer(struct MapObject *trainerObj, u8 range); +u8 CheckPathBetweenTrainerAndPlayer(struct MapObject *trainerObj, u8 approachDistance, u8 direction); +void Task_RunTrainerSeeFuncList(u8 taskId); +void Task_DestroyTrainerApproachTask(u8 taskId); +void sub_80B46D8(struct Sprite *sprite, u16 a2, u8 a3); u8 GetTrainerApproachDistanceSouth(struct MapObject *trainerObj, s16 range, s16 x, s16 y); u8 GetTrainerApproachDistanceNorth(struct MapObject *trainerObj, s16 range, s16 x, s16 y); @@ -210,7 +223,7 @@ bool8 CheckForTrainersWantingBattle(void) } } -static u8 CheckTrainer(u8 mapObjectId) +u8 CheckTrainer(u8 mapObjectId) { const u8 *scriptPtr; u8 ret = 1; @@ -263,7 +276,6 @@ static u8 CheckTrainer(u8 mapObjectId) return 0; } -/* u8 GetTrainerApproachDistance(struct MapObject *trainerObj) { s16 x, y; @@ -274,17 +286,477 @@ u8 GetTrainerApproachDistance(struct MapObject *trainerObj) if (trainerObj->trainerType == 1) // can only see in one direction { approachDistance = sDirectionalApproachDistanceFuncs[trainerObj->mapobj_unk_18 - 1](trainerObj, trainerObj->trainerRange_berryTreeId, x, y); - return CheckPathBetweenTrainerAndPlayer((struct MapObject2 *)trainerObj, approachDistance, trainerObj->mapobj_unk_18); + return CheckPathBetweenTrainerAndPlayer(trainerObj, approachDistance, trainerObj->mapobj_unk_18); } else // can see in all directions { for (i = 0; i < 4; i++) { approachDistance = sDirectionalApproachDistanceFuncs[i](trainerObj, trainerObj->trainerRange_berryTreeId, x, y); - if (CheckPathBetweenTrainerAndPlayer((struct MapObject2 *)trainerObj, approachDistance, i + 1)) // directions are 1-4 instead of 0-3. south north west east + if (CheckPathBetweenTrainerAndPlayer(trainerObj, approachDistance, i + 1)) // directions are 1-4 instead of 0-3. south north west east return approachDistance; } } + + return 0; +} + +// Returns how far south the player is from trainer. 0 if out of trainer's sight. +u8 GetTrainerApproachDistanceSouth(struct MapObject *trainerObj, s16 range, s16 x, s16 y) +{ + if (trainerObj->coords2.x == x + && y > trainerObj->coords2.y + && y <= trainerObj->coords2.y + range) + return (y - trainerObj->coords2.y); + else + return 0; +} + +// Returns how far north the player is from trainer. 0 if out of trainer's sight. +u8 GetTrainerApproachDistanceNorth(struct MapObject *trainerObj, s16 range, s16 x, s16 y) +{ + if (trainerObj->coords2.x == x + && y < trainerObj->coords2.y + && y >= trainerObj->coords2.y - range) + return (trainerObj->coords2.y - y); + else + return 0; +} + +// Returns how far west the player is from trainer. 0 if out of trainer's sight. +u8 GetTrainerApproachDistanceWest(struct MapObject *trainerObj, s16 range, s16 x, s16 y) +{ + if (trainerObj->coords2.y == y + && x < trainerObj->coords2.x + && x >= trainerObj->coords2.x - range) + return (trainerObj->coords2.x - x); + else + return 0; +} + +// Returns how far east the player is from trainer. 0 if out of trainer's sight. +u8 GetTrainerApproachDistanceEast(struct MapObject *trainerObj, s16 range, s16 x, s16 y) +{ + if (trainerObj->coords2.y == y + && x > trainerObj->coords2.x + && x <= trainerObj->coords2.x + range) + return (x - trainerObj->coords2.x); + else + return 0; +} + +#define COLLISION_MASK (~1) + +u8 CheckPathBetweenTrainerAndPlayer(struct MapObject *trainerObj, u8 approachDistance, u8 direction) +{ + s16 x, y; + u8 unk19_temp; + u8 unk19b_temp; + u8 i; + u8 collision; + + if (approachDistance == 0) + return 0; + + x = trainerObj->coords2.x; + y = trainerObj->coords2.y; + + MoveCoords(direction, &x, &y); + for (i = 0; i < approachDistance - 1; i++, MoveCoords(direction, &x, &y)) + { + collision = sub_8092C8C(trainerObj, x, y, direction); + if (collision != 0 && (collision & COLLISION_MASK)) + return 0; + } + + // preserve mapobj_unk_19 before clearing. + unk19_temp = trainerObj->range.as_nybbles.x; + unk19b_temp = trainerObj->range.as_nybbles.y; + trainerObj->range.as_nybbles.x = 0; + trainerObj->range.as_nybbles.y = 0; + + collision = npc_block_way(trainerObj, x, y, direction); + + trainerObj->range.as_nybbles.x = unk19_temp; + trainerObj->range.as_nybbles.y = unk19b_temp; + if (collision == 4) + return approachDistance; + return 0; } -*/ + +#define tFuncId data[0] +#define tTrainerRange data[3] +#define tTrainerMapObjectId data[7] + +void TrainerApproachPlayer(struct MapObject *trainerObj, u8 range) +{ + struct Task *task; + + gApproachingTrainers[gNoOfApproachingTrainers].taskId = CreateTask(Task_RunTrainerSeeFuncList, 0x50); + task = &gTasks[gApproachingTrainers[gNoOfApproachingTrainers].taskId]; + task->tTrainerRange = range; + task->tTrainerMapObjectId = gApproachingTrainers[gNoOfApproachingTrainers].mapObjectId; +} + +void sub_80B40C8(TaskFunc followupFunc) +{ + u8 taskId; + TaskFunc taskFunc; + + if (gApproachingTrainerId == 0) + taskId = gApproachingTrainers[0].taskId; + else + taskId = gApproachingTrainers[1].taskId; + + taskFunc = Task_RunTrainerSeeFuncList; + SetTaskFuncWithFollowupFunc(taskId, taskFunc, followupFunc); + gTasks[taskId].tFuncId = 1; + taskFunc(taskId); +} + +void Task_RunTrainerSeeFuncList(u8 taskId) +{ + struct Task *task = &gTasks[taskId]; + struct MapObject *trainerObj = &gMapObjects[task->tTrainerMapObjectId]; + + if (!trainerObj->active) + { + SwitchTaskToFollowupFunc(taskId); + } + else + { + while (gTrainerSeeFuncList[task->tFuncId](taskId, task, trainerObj)); + } +} + +bool8 sub_80B4178(u8 taskId, struct Task *task, struct MapObject *trainerObj) +{ + return FALSE; +} + +bool8 sub_80B417C(u8 taskId, struct Task *task, struct MapObject *trainerObj) +{ + u8 direction; + + FieldObjectGetLocalIdAndMap(trainerObj, &gFieldEffectArguments[0], &gFieldEffectArguments[1], &gFieldEffectArguments[2]); + FieldEffectStart(FLDEFF_EXCLAMATION_MARK_ICON_1); + direction = GetFaceDirectionAnimId(trainerObj->mapobj_unk_18); + FieldObjectSetSpecialAnim(trainerObj, direction); + task->tFuncId++; + return TRUE; +} + +bool8 sub_80B41C0(u8 taskId, struct Task *task, struct MapObject *trainerObj) +{ + if (FieldEffectActiveListContains(0)) + { + return FALSE; + } + else + { + task->data[0]++; + if (trainerObj->animPattern == 57 || trainerObj->animPattern == 58) + task->data[0] = 6; + if (trainerObj->animPattern == 63) + task->data[0] = 8; + return TRUE; + } +} + +bool8 sub_80B4200(u8 taskId, struct Task *task, struct MapObject *trainerObj) +{ + if (!(FieldObjectIsSpecialAnimOrDirectionSequenceAnimActive(trainerObj)) || FieldObjectClearAnimIfSpecialAnimFinished(trainerObj)) + { + if (task->data[3]) + { + FieldObjectSetSpecialAnim(trainerObj, GetGoSpeed0AnimId(trainerObj->mapobj_unk_18)); + task->data[3]--; + } + else + { + FieldObjectSetSpecialAnim(trainerObj, 0x3E); + task->data[0]++; + } + } + return FALSE; +} + +bool8 sub_80B425C(u8 taskId, struct Task *task, struct MapObject *trainerObj) +{ + struct MapObject *playerObj; + + if (FieldObjectIsSpecialAnimOrDirectionSequenceAnimActive(trainerObj) && !FieldObjectClearAnimIfSpecialAnimFinished(trainerObj)) + return FALSE; + + npc_set_running_behaviour_etc(trainerObj, npc_running_behaviour_by_direction(trainerObj->mapobj_unk_18)); + sub_808F23C(trainerObj, npc_running_behaviour_by_direction(trainerObj->mapobj_unk_18)); + sub_808F208(trainerObj); + + playerObj = &gMapObjects[gPlayerAvatar.mapObjectId]; + if (FieldObjectIsSpecialAnimOrDirectionSequenceAnimActive(playerObj) && !FieldObjectClearAnimIfSpecialAnimFinished(playerObj)) + return FALSE; + + sub_808BCE8(); + FieldObjectSetSpecialAnim(&gMapObjects[gPlayerAvatar.mapObjectId], GetFaceDirectionAnimId(GetOppositeDirection(trainerObj->mapobj_unk_18))); + task->data[0]++; + return FALSE; +} + +bool8 sub_80B4318(u8 taskId, struct Task *task, struct MapObject *trainerObj) +{ + struct MapObject *playerObj = &gMapObjects[gPlayerAvatar.mapObjectId]; + + if (!FieldObjectIsSpecialAnimOrDirectionSequenceAnimActive(playerObj) + || FieldObjectClearAnimIfSpecialAnimFinished(playerObj)) + SwitchTaskToFollowupFunc(taskId); + return FALSE; +} + +bool8 sub_80B435C(u8 taskId, struct Task *task, struct MapObject *trainerObj) +{ + if (!FieldObjectIsSpecialAnimOrDirectionSequenceAnimActive(trainerObj) + || FieldObjectClearAnimIfSpecialAnimFinished(trainerObj)) + { + FieldObjectSetSpecialAnim(trainerObj, 0x59); + task->data[0]++; + } + return FALSE; +} + +bool8 sub_80B4390(u8 taskId, struct Task *task, struct MapObject *trainerObj) +{ + if (FieldObjectClearAnimIfSpecialAnimFinished(trainerObj)) + task->data[0] = 3; + + return FALSE; +} + +bool8 sub_80B43AC(u8 taskId, struct Task *task, struct MapObject *trainerObj) +{ + if (!FieldObjectIsSpecialAnimOrDirectionSequenceAnimActive(trainerObj) + || FieldObjectClearAnimIfSpecialAnimFinished(trainerObj)) + { + FieldObjectSetSpecialAnim(trainerObj, 0x3E); + task->data[0]++; + } + return FALSE; +} + +bool8 sub_80B43E0(u8 taskId, struct Task *task, struct MapObject *trainerObj) +{ + if (FieldObjectCheckIfSpecialAnimFinishedOrInactive(trainerObj)) + { + gFieldEffectArguments[0] = trainerObj->coords2.x; + gFieldEffectArguments[1] = trainerObj->coords2.y; + gFieldEffectArguments[2] = gSprites[trainerObj->spriteId].subpriority - 1; + gFieldEffectArguments[3] = 2; + task->data[4] = FieldEffectStart(FLDEFF_POP_OUT_OF_ASH); + task->data[0]++; + } + return FALSE; +} + +bool8 sub_80B4438(u8 taskId, struct Task *task, struct MapObject *trainerObj) +{ + struct Sprite *sprite; + + if (gSprites[task->data[4]].animCmdIndex == 2) + { + trainerObj->mapobj_bit_26 = 0; + trainerObj->mapobj_bit_2 = 1; + + sprite = &gSprites[trainerObj->spriteId]; + sprite->oam.priority = 2; + FieldObjectClearAnimIfSpecialAnimFinished(trainerObj); + FieldObjectSetSpecialAnim(trainerObj, sub_80934BC(trainerObj->mapobj_unk_18)); + task->data[0]++; + } + + return FALSE; +} + +bool8 sub_80B44AC(u8 taskId, struct Task *task, struct MapObject *trainerObj) +{ + if (!FieldEffectActiveListContains(49)) + task->data[0] = 3; + + return FALSE; +} + +void sub_80B44C8(u8 taskId) +{ + struct Task *task = &gTasks[taskId]; + struct MapObject *mapObj; + + // another mapObj loaded into by loadword? + LoadWordFromTwoHalfwords(&task->data[1], (u32 *)&mapObj); + if (!task->data[7]) + { + FieldObjectClearAnim(mapObj); + task->data[7]++; + } + gTrainerSeeFuncList2[task->data[0]](taskId, task, mapObj); + if (task->data[0] == 3 && !FieldEffectActiveListContains(49)) + { + npc_set_running_behaviour_etc(mapObj, npc_running_behaviour_by_direction(mapObj->mapobj_unk_18)); + sub_808F23C(mapObj, npc_running_behaviour_by_direction(mapObj->mapobj_unk_18)); + DestroyTask(taskId); + } + else + { + mapObj->mapobj_bit_7 = 0; + } +} + +void sub_80B4578(struct MapObject *var) +{ + StoreWordInTwoHalfwords(&gTasks[CreateTask(sub_80B44C8, 0)].data[1], (u32)var); +} + +void EndTrainerApproach(void) +{ + sub_80B40C8(Task_DestroyTrainerApproachTask); +} + +void Task_DestroyTrainerApproachTask(u8 taskId) +{ + DestroyTask(taskId); + EnableBothScriptContexts(); +} + +void sub_80B45D0(void) +{ + if (gNoOfApproachingTrainers == 2) + { + if (gApproachingTrainerId == 0) + { + gApproachingTrainerId++; + gSpecialVar_Result = 1; + UnfreezeMapObjects(); + sub_80974D0(gApproachingTrainers[1].mapObjectId); + } + else + { + gApproachingTrainerId = 0; + gSpecialVar_Result = 0; + } + } + else + { + gSpecialVar_Result = 0; + } +} + +u8 FldEff_ExclamationMarkIcon1(void) +{ + u8 spriteId = CreateSpriteAtEnd(&gSpriteTemplate_85507B4, 0, 0, 0x53); + + if (spriteId != MAX_SPRITES) + sub_80B46D8(&gSprites[spriteId], 0, 0); + + return 0; +} + +u8 FldEff_ExclamationMarkIcon2(void) +{ + u8 spriteId = CreateSpriteAtEnd(&gSpriteTemplate_85507B4, 0, 0, 0x52); + + if (spriteId != MAX_SPRITES) + sub_80B46D8(&gSprites[spriteId], 33, 1); + + return 0; +} + +u8 FldEff_HeartIcon(void) +{ + u8 spriteId = CreateSpriteAtEnd(&gSpriteTemplate_85507CC, 0, 0, 0x52); + + if (spriteId != MAX_SPRITES) + { + struct Sprite *sprite = &gSprites[spriteId]; + + sub_80B46D8(sprite, 46, 0); + sprite->oam.paletteNum = 2; + } + + return 0; +} + +void sub_80B46D8(struct Sprite *sprite, u16 a2, u8 a3) +{ + sprite->oam.priority = 1; + sprite->coordOffsetEnabled = 1; + + sprite->data[0] = gFieldEffectArguments[0]; + sprite->data[1] = gFieldEffectArguments[1]; + sprite->data[2] = gFieldEffectArguments[2]; + sprite->data[3] = -5; + sprite->data[7] = a2; + + StartSpriteAnim(sprite, a3); +} + +void objc_exclamation_mark_probably(struct Sprite *sprite) +{ + u8 mapObjId; + + if (TryGetFieldObjectIdByLocalIdAndMap(sprite->data[0], sprite->data[1], sprite->data[2], &mapObjId) + || sprite->animEnded) + { + FieldEffectStop(sprite, sprite->data[7]); + } + else + { + struct Sprite *mapObjSprite = &gSprites[gMapObjects[mapObjId].spriteId]; + sprite->data[4] += sprite->data[3]; + sprite->pos1.x = mapObjSprite->pos1.x; + sprite->pos1.y = mapObjSprite->pos1.y - 16; + sprite->pos2.x = mapObjSprite->pos2.x; + sprite->pos2.y = mapObjSprite->pos2.y + sprite->data[4]; + if (sprite->data[4]) + sprite->data[3]++; + else + sprite->data[3] = 0; + } +} + +u8 GetCurrentApproachingTrainerMapObjectId(void) +{ + if (gApproachingTrainerId == 0) + return gApproachingTrainers[0].mapObjectId; + else + return gApproachingTrainers[1].mapObjectId; +} + +u8 GetChosenApproachingTrainerMapObjectId(u8 arrayId) +{ + if (arrayId >= ARRAY_COUNT(gApproachingTrainers)) + return 0; + else if (arrayId == 0) + return gApproachingTrainers[0].mapObjectId; + else + return gApproachingTrainers[1].mapObjectId; +} + +void sub_80B4808(void) +{ + struct MapObject *trainerObj; + + if (gUnknown_030060AC == 1) + { + trainerObj = &gMapObjects[gApproachingTrainers[gUnknown_03006080].mapObjectId]; + gUnknown_03006084[0] = GetFaceDirectionAnimId(GetOppositeDirection(trainerObj->mapobj_unk_18)); + gUnknown_03006084[1] = 0xFE; + ScriptMovement_StartObjectMovementScript(0xFF, gSaveBlock1Ptr->location.mapNum, gSaveBlock1Ptr->location.mapGroup, gUnknown_03006084); + } + else + { + trainerObj = &gMapObjects[gPlayerAvatar.mapObjectId]; + gUnknown_03006084[0] = GetFaceDirectionAnimId(trainerObj->mapobj_unk_18); + gUnknown_03006084[1] = 0xFE; + ScriptMovement_StartObjectMovementScript(0xFF, gSaveBlock1Ptr->location.mapNum, gSaveBlock1Ptr->location.mapGroup, gUnknown_03006084); + } + + sub_809BE48(0xFF); +} -- cgit v1.2.3 From b7a23353471ade3bffa5108e45b79eb1a6f19a65 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Tue, 19 Dec 2017 17:18:44 +0100 Subject: clean up trainer see file --- src/trainer_see.c | 263 +++++++++++++++++++++++++++++------------------------- 1 file changed, 139 insertions(+), 124 deletions(-) (limited to 'src') diff --git a/src/trainer_see.c b/src/trainer_see.c index 26d00192e..b8dbda0c1 100644 --- a/src/trainer_see.c +++ b/src/trainer_see.c @@ -27,45 +27,40 @@ extern bool8 GetTrainerHillTrainerFlag(u8 mapObjectId); extern void sub_809BE48(u16 npcId); // this file's functions -u8 CheckTrainer(u8 mapObjectId); -u8 GetTrainerApproachDistance(struct MapObject *trainerObj); -void TrainerApproachPlayer(struct MapObject *trainerObj, u8 range); -u8 CheckPathBetweenTrainerAndPlayer(struct MapObject *trainerObj, u8 approachDistance, u8 direction); -void Task_RunTrainerSeeFuncList(u8 taskId); -void Task_DestroyTrainerApproachTask(u8 taskId); -void sub_80B46D8(struct Sprite *sprite, u16 a2, u8 a3); - -u8 GetTrainerApproachDistanceSouth(struct MapObject *trainerObj, s16 range, s16 x, s16 y); -u8 GetTrainerApproachDistanceNorth(struct MapObject *trainerObj, s16 range, s16 x, s16 y); -u8 GetTrainerApproachDistanceWest(struct MapObject *trainerObj, s16 range, s16 x, s16 y); -u8 GetTrainerApproachDistanceEast(struct MapObject *trainerObj, s16 range, s16 x, s16 y); - -bool8 sub_80B4178(u8 taskId, struct Task *task, struct MapObject *trainerObj); -bool8 sub_80B417C(u8 taskId, struct Task *task, struct MapObject *trainerObj); -bool8 sub_80B41C0(u8 taskId, struct Task *task, struct MapObject *trainerObj); -bool8 sub_80B4200(u8 taskId, struct Task *task, struct MapObject *trainerObj); -bool8 sub_80B425C(u8 taskId, struct Task *task, struct MapObject *trainerObj); -bool8 sub_80B4318(u8 taskId, struct Task *task, struct MapObject *trainerObj); -bool8 sub_80B435C(u8 taskId, struct Task *task, struct MapObject *trainerObj); -bool8 sub_80B4390(u8 taskId, struct Task *task, struct MapObject *trainerObj); -bool8 sub_80B43AC(u8 taskId, struct Task *task, struct MapObject *trainerObj); -bool8 sub_80B43E0(u8 taskId, struct Task *task, struct MapObject *trainerObj); -bool8 sub_80B4438(u8 taskId, struct Task *task, struct MapObject *trainerObj); -bool8 sub_80B44AC(u8 taskId, struct Task *task, struct MapObject *trainerObj); - -bool8 sub_80B43AC(u8 taskId, struct Task *task, struct MapObject *trainerObj); -bool8 sub_80B43E0(u8 taskId, struct Task *task, struct MapObject *trainerObj); -bool8 sub_80B4438(u8 taskId, struct Task *task, struct MapObject *trainerObj); -bool8 sub_80B44AC(u8 taskId, struct Task *task, struct MapObject *trainerObj); - -void objc_exclamation_mark_probably(struct Sprite *sprite); +static u8 CheckTrainer(u8 mapObjectId); +static u8 GetTrainerApproachDistance(struct MapObject *trainerObj); +static u8 CheckPathBetweenTrainerAndPlayer(struct MapObject *trainerObj, u8 approachDistance, u8 direction); +static void TrainerApproachPlayer(struct MapObject *trainerObj, u8 range); +static void Task_RunTrainerSeeFuncList(u8 taskId); +static void Task_DestroyTrainerApproachTask(u8 taskId); +static void SetIconSpriteData(struct Sprite *sprite, u16 fldEffId, u8 spriteAnimNum); + +static u8 GetTrainerApproachDistanceSouth(struct MapObject *trainerObj, s16 range, s16 x, s16 y); +static u8 GetTrainerApproachDistanceNorth(struct MapObject *trainerObj, s16 range, s16 x, s16 y); +static u8 GetTrainerApproachDistanceWest(struct MapObject *trainerObj, s16 range, s16 x, s16 y); +static u8 GetTrainerApproachDistanceEast(struct MapObject *trainerObj, s16 range, s16 x, s16 y); + +static bool8 sub_80B4178(u8 taskId, struct Task *task, struct MapObject *trainerObj); +static bool8 sub_80B417C(u8 taskId, struct Task *task, struct MapObject *trainerObj); +static bool8 sub_80B41C0(u8 taskId, struct Task *task, struct MapObject *trainerObj); +static bool8 sub_80B4200(u8 taskId, struct Task *task, struct MapObject *trainerObj); +static bool8 sub_80B425C(u8 taskId, struct Task *task, struct MapObject *trainerObj); +static bool8 sub_80B4318(u8 taskId, struct Task *task, struct MapObject *trainerObj); +static bool8 sub_80B435C(u8 taskId, struct Task *task, struct MapObject *trainerObj); +static bool8 sub_80B4390(u8 taskId, struct Task *task, struct MapObject *trainerObj); +static bool8 sub_80B43AC(u8 taskId, struct Task *task, struct MapObject *trainerObj); +static bool8 sub_80B43E0(u8 taskId, struct Task *task, struct MapObject *trainerObj); +static bool8 sub_80B4438(u8 taskId, struct Task *task, struct MapObject *trainerObj); +static bool8 sub_80B44AC(u8 taskId, struct Task *task, struct MapObject *trainerObj); + +static void SpriteCB_TrainerIcons(struct Sprite *sprite); // const rom data -const u8 gEmotion_ExclamationMarkGfx[] = INCBIN_U8("graphics/misc/emotion_exclamation.4bpp"); -const u8 gEmotion_QuestionMarkGfx[] = INCBIN_U8("graphics/misc/emotion_question.4bpp"); -const u8 gEmotion_HeartGfx[] = INCBIN_U8("graphics/misc/emotion_heart.4bpp"); +static const u8 sEmotion_ExclamationMarkGfx[] = INCBIN_U8("graphics/misc/emotion_exclamation.4bpp"); +static const u8 sEmotion_QuestionMarkGfx[] = INCBIN_U8("graphics/misc/emotion_question.4bpp"); +static const u8 sEmotion_HeartGfx[] = INCBIN_U8("graphics/misc/emotion_heart.4bpp"); -u8 (*const sDirectionalApproachDistanceFuncs[])(struct MapObject *trainerObj, s16 range, s16 x, s16 y) = +static u8 (*const sDirectionalApproachDistanceFuncs[])(struct MapObject *trainerObj, s16 range, s16 x, s16 y) = { GetTrainerApproachDistanceSouth, GetTrainerApproachDistanceNorth, @@ -73,7 +68,7 @@ u8 (*const sDirectionalApproachDistanceFuncs[])(struct MapObject *trainerObj, s1 GetTrainerApproachDistanceEast, }; -bool8 (*const gTrainerSeeFuncList[])(u8 taskId, struct Task *task, struct MapObject *trainerObj) = +static bool8 (*const sTrainerSeeFuncList[])(u8 taskId, struct Task *task, struct MapObject *trainerObj) = { sub_80B4178, sub_80B417C, @@ -89,7 +84,7 @@ bool8 (*const gTrainerSeeFuncList[])(u8 taskId, struct Task *task, struct MapObj sub_80B44AC }; -bool8 (*const gTrainerSeeFuncList2[])(u8 taskId, struct Task *task, struct MapObject *trainerObj) = +static bool8 (*const sTrainerSeeFuncList2[])(u8 taskId, struct Task *task, struct MapObject *trainerObj) = { sub_80B43AC, sub_80B43E0, @@ -97,7 +92,7 @@ bool8 (*const gTrainerSeeFuncList2[])(u8 taskId, struct Task *task, struct MapOb sub_80B44AC, }; -const struct OamData gOamData_855077C = +static const struct OamData sOamData_Icons = { .y = 0, .affineMode = 0, @@ -114,55 +109,55 @@ const struct OamData gOamData_855077C = .affineParam = 0, }; -const struct SpriteFrameImage gSpriteImageTable_8550784[] = +static const struct SpriteFrameImage sSpriteImageTable_ExclamationQuestionMark[] = { - {gEmotion_ExclamationMarkGfx, 0x80}, - {gEmotion_QuestionMarkGfx, 0x80} + {sEmotion_ExclamationMarkGfx, 0x80}, + {sEmotion_QuestionMarkGfx, 0x80} }; -const struct SpriteFrameImage gSpriteImageTable_8550794[] = +static const struct SpriteFrameImage sSpriteImageTable_HeartIcon[] = { - {gEmotion_HeartGfx, 0x80} + {sEmotion_HeartGfx, 0x80} }; -const union AnimCmd gSpriteAnim_855079C[] = +static const union AnimCmd sSpriteAnim_Icons1[] = { ANIMCMD_FRAME(0, 60), ANIMCMD_END }; -const union AnimCmd gSpriteAnim_85507A4[] = +static const union AnimCmd sSpriteAnim_Icons2[] = { ANIMCMD_FRAME(1, 60), ANIMCMD_END }; -const union AnimCmd *const gSpriteAnimTable_85507AC[] = +static const union AnimCmd *const sSpriteAnimTable_Icons[] = { - gSpriteAnim_855079C, - gSpriteAnim_85507A4 + sSpriteAnim_Icons1, + sSpriteAnim_Icons2 }; -const struct SpriteTemplate gSpriteTemplate_85507B4 = +static const struct SpriteTemplate sSpriteTemplate_ExclamationQuestionMark = { .tileTag = 0xffff, .paletteTag = 0xffff, - .oam = &gOamData_855077C, - .anims = gSpriteAnimTable_85507AC, - .images = gSpriteImageTable_8550784, + .oam = &sOamData_Icons, + .anims = sSpriteAnimTable_Icons, + .images = sSpriteImageTable_ExclamationQuestionMark, .affineAnims = gDummySpriteAffineAnimTable, - .callback = objc_exclamation_mark_probably + .callback = SpriteCB_TrainerIcons }; -const struct SpriteTemplate gSpriteTemplate_85507CC = +static const struct SpriteTemplate sSpriteTemplate_HeartIcon = { .tileTag = 0xffff, .paletteTag = 0x1004, - .oam = &gOamData_855077C, - .anims = gSpriteAnimTable_85507AC, - .images = gSpriteImageTable_8550794, + .oam = &sOamData_Icons, + .anims = sSpriteAnimTable_Icons, + .images = sSpriteImageTable_HeartIcon, .affineAnims = gDummySpriteAffineAnimTable, - .callback = objc_exclamation_mark_probably + .callback = SpriteCB_TrainerIcons }; // code @@ -223,7 +218,7 @@ bool8 CheckForTrainersWantingBattle(void) } } -u8 CheckTrainer(u8 mapObjectId) +static u8 CheckTrainer(u8 mapObjectId) { const u8 *scriptPtr; u8 ret = 1; @@ -276,7 +271,7 @@ u8 CheckTrainer(u8 mapObjectId) return 0; } -u8 GetTrainerApproachDistance(struct MapObject *trainerObj) +static u8 GetTrainerApproachDistance(struct MapObject *trainerObj) { s16 x, y; u8 i; @@ -302,7 +297,7 @@ u8 GetTrainerApproachDistance(struct MapObject *trainerObj) } // Returns how far south the player is from trainer. 0 if out of trainer's sight. -u8 GetTrainerApproachDistanceSouth(struct MapObject *trainerObj, s16 range, s16 x, s16 y) +static u8 GetTrainerApproachDistanceSouth(struct MapObject *trainerObj, s16 range, s16 x, s16 y) { if (trainerObj->coords2.x == x && y > trainerObj->coords2.y @@ -313,7 +308,7 @@ u8 GetTrainerApproachDistanceSouth(struct MapObject *trainerObj, s16 range, s16 } // Returns how far north the player is from trainer. 0 if out of trainer's sight. -u8 GetTrainerApproachDistanceNorth(struct MapObject *trainerObj, s16 range, s16 x, s16 y) +static u8 GetTrainerApproachDistanceNorth(struct MapObject *trainerObj, s16 range, s16 x, s16 y) { if (trainerObj->coords2.x == x && y < trainerObj->coords2.y @@ -324,7 +319,7 @@ u8 GetTrainerApproachDistanceNorth(struct MapObject *trainerObj, s16 range, s16 } // Returns how far west the player is from trainer. 0 if out of trainer's sight. -u8 GetTrainerApproachDistanceWest(struct MapObject *trainerObj, s16 range, s16 x, s16 y) +static u8 GetTrainerApproachDistanceWest(struct MapObject *trainerObj, s16 range, s16 x, s16 y) { if (trainerObj->coords2.y == y && x < trainerObj->coords2.x @@ -335,7 +330,7 @@ u8 GetTrainerApproachDistanceWest(struct MapObject *trainerObj, s16 range, s16 x } // Returns how far east the player is from trainer. 0 if out of trainer's sight. -u8 GetTrainerApproachDistanceEast(struct MapObject *trainerObj, s16 range, s16 x, s16 y) +static u8 GetTrainerApproachDistanceEast(struct MapObject *trainerObj, s16 range, s16 x, s16 y) { if (trainerObj->coords2.y == y && x > trainerObj->coords2.x @@ -347,7 +342,7 @@ u8 GetTrainerApproachDistanceEast(struct MapObject *trainerObj, s16 range, s16 x #define COLLISION_MASK (~1) -u8 CheckPathBetweenTrainerAndPlayer(struct MapObject *trainerObj, u8 approachDistance, u8 direction) +static u8 CheckPathBetweenTrainerAndPlayer(struct MapObject *trainerObj, u8 approachDistance, u8 direction) { s16 x, y; u8 unk19_temp; @@ -387,9 +382,10 @@ u8 CheckPathBetweenTrainerAndPlayer(struct MapObject *trainerObj, u8 approachDis #define tFuncId data[0] #define tTrainerRange data[3] +#define tOutOfAshSpriteId data[4] #define tTrainerMapObjectId data[7] -void TrainerApproachPlayer(struct MapObject *trainerObj, u8 range) +static void TrainerApproachPlayer(struct MapObject *trainerObj, u8 range) { struct Task *task; @@ -399,7 +395,7 @@ void TrainerApproachPlayer(struct MapObject *trainerObj, u8 range) task->tTrainerMapObjectId = gApproachingTrainers[gNoOfApproachingTrainers].mapObjectId; } -void sub_80B40C8(TaskFunc followupFunc) +static void sub_80B40C8(TaskFunc followupFunc) { u8 taskId; TaskFunc taskFunc; @@ -415,7 +411,7 @@ void sub_80B40C8(TaskFunc followupFunc) taskFunc(taskId); } -void Task_RunTrainerSeeFuncList(u8 taskId) +static void Task_RunTrainerSeeFuncList(u8 taskId) { struct Task *task = &gTasks[taskId]; struct MapObject *trainerObj = &gMapObjects[task->tTrainerMapObjectId]; @@ -426,16 +422,16 @@ void Task_RunTrainerSeeFuncList(u8 taskId) } else { - while (gTrainerSeeFuncList[task->tFuncId](taskId, task, trainerObj)); + while (sTrainerSeeFuncList[task->tFuncId](taskId, task, trainerObj)); } } -bool8 sub_80B4178(u8 taskId, struct Task *task, struct MapObject *trainerObj) +static bool8 sub_80B4178(u8 taskId, struct Task *task, struct MapObject *trainerObj) { return FALSE; } -bool8 sub_80B417C(u8 taskId, struct Task *task, struct MapObject *trainerObj) +static bool8 sub_80B417C(u8 taskId, struct Task *task, struct MapObject *trainerObj) { u8 direction; @@ -447,42 +443,42 @@ bool8 sub_80B417C(u8 taskId, struct Task *task, struct MapObject *trainerObj) return TRUE; } -bool8 sub_80B41C0(u8 taskId, struct Task *task, struct MapObject *trainerObj) +static bool8 sub_80B41C0(u8 taskId, struct Task *task, struct MapObject *trainerObj) { - if (FieldEffectActiveListContains(0)) + if (FieldEffectActiveListContains(FLDEFF_EXCLAMATION_MARK_ICON_1)) { return FALSE; } else { - task->data[0]++; + task->tFuncId++; if (trainerObj->animPattern == 57 || trainerObj->animPattern == 58) - task->data[0] = 6; + task->tFuncId = 6; if (trainerObj->animPattern == 63) - task->data[0] = 8; + task->tFuncId = 8; return TRUE; } } -bool8 sub_80B4200(u8 taskId, struct Task *task, struct MapObject *trainerObj) +static bool8 sub_80B4200(u8 taskId, struct Task *task, struct MapObject *trainerObj) { if (!(FieldObjectIsSpecialAnimOrDirectionSequenceAnimActive(trainerObj)) || FieldObjectClearAnimIfSpecialAnimFinished(trainerObj)) { - if (task->data[3]) + if (task->tTrainerRange) { FieldObjectSetSpecialAnim(trainerObj, GetGoSpeed0AnimId(trainerObj->mapobj_unk_18)); - task->data[3]--; + task->tTrainerRange--; } else { FieldObjectSetSpecialAnim(trainerObj, 0x3E); - task->data[0]++; + task->tFuncId++; } } return FALSE; } -bool8 sub_80B425C(u8 taskId, struct Task *task, struct MapObject *trainerObj) +static bool8 sub_80B425C(u8 taskId, struct Task *task, struct MapObject *trainerObj) { struct MapObject *playerObj; @@ -499,11 +495,11 @@ bool8 sub_80B425C(u8 taskId, struct Task *task, struct MapObject *trainerObj) sub_808BCE8(); FieldObjectSetSpecialAnim(&gMapObjects[gPlayerAvatar.mapObjectId], GetFaceDirectionAnimId(GetOppositeDirection(trainerObj->mapobj_unk_18))); - task->data[0]++; + task->tFuncId++; return FALSE; } -bool8 sub_80B4318(u8 taskId, struct Task *task, struct MapObject *trainerObj) +static bool8 sub_80B4318(u8 taskId, struct Task *task, struct MapObject *trainerObj) { struct MapObject *playerObj = &gMapObjects[gPlayerAvatar.mapObjectId]; @@ -513,37 +509,37 @@ bool8 sub_80B4318(u8 taskId, struct Task *task, struct MapObject *trainerObj) return FALSE; } -bool8 sub_80B435C(u8 taskId, struct Task *task, struct MapObject *trainerObj) +static bool8 sub_80B435C(u8 taskId, struct Task *task, struct MapObject *trainerObj) { if (!FieldObjectIsSpecialAnimOrDirectionSequenceAnimActive(trainerObj) || FieldObjectClearAnimIfSpecialAnimFinished(trainerObj)) { FieldObjectSetSpecialAnim(trainerObj, 0x59); - task->data[0]++; + task->tFuncId++; } return FALSE; } -bool8 sub_80B4390(u8 taskId, struct Task *task, struct MapObject *trainerObj) +static bool8 sub_80B4390(u8 taskId, struct Task *task, struct MapObject *trainerObj) { if (FieldObjectClearAnimIfSpecialAnimFinished(trainerObj)) - task->data[0] = 3; + task->tFuncId = 3; return FALSE; } -bool8 sub_80B43AC(u8 taskId, struct Task *task, struct MapObject *trainerObj) +static bool8 sub_80B43AC(u8 taskId, struct Task *task, struct MapObject *trainerObj) { if (!FieldObjectIsSpecialAnimOrDirectionSequenceAnimActive(trainerObj) || FieldObjectClearAnimIfSpecialAnimFinished(trainerObj)) { FieldObjectSetSpecialAnim(trainerObj, 0x3E); - task->data[0]++; + task->tFuncId++; } return FALSE; } -bool8 sub_80B43E0(u8 taskId, struct Task *task, struct MapObject *trainerObj) +static bool8 sub_80B43E0(u8 taskId, struct Task *task, struct MapObject *trainerObj) { if (FieldObjectCheckIfSpecialAnimFinishedOrInactive(trainerObj)) { @@ -551,17 +547,17 @@ bool8 sub_80B43E0(u8 taskId, struct Task *task, struct MapObject *trainerObj) gFieldEffectArguments[1] = trainerObj->coords2.y; gFieldEffectArguments[2] = gSprites[trainerObj->spriteId].subpriority - 1; gFieldEffectArguments[3] = 2; - task->data[4] = FieldEffectStart(FLDEFF_POP_OUT_OF_ASH); - task->data[0]++; + task->tOutOfAshSpriteId = FieldEffectStart(FLDEFF_POP_OUT_OF_ASH); + task->tFuncId++; } return FALSE; } -bool8 sub_80B4438(u8 taskId, struct Task *task, struct MapObject *trainerObj) +static bool8 sub_80B4438(u8 taskId, struct Task *task, struct MapObject *trainerObj) { struct Sprite *sprite; - if (gSprites[task->data[4]].animCmdIndex == 2) + if (gSprites[task->tOutOfAshSpriteId].animCmdIndex == 2) { trainerObj->mapobj_bit_26 = 0; trainerObj->mapobj_bit_2 = 1; @@ -570,21 +566,26 @@ bool8 sub_80B4438(u8 taskId, struct Task *task, struct MapObject *trainerObj) sprite->oam.priority = 2; FieldObjectClearAnimIfSpecialAnimFinished(trainerObj); FieldObjectSetSpecialAnim(trainerObj, sub_80934BC(trainerObj->mapobj_unk_18)); - task->data[0]++; + task->tFuncId++; } return FALSE; } -bool8 sub_80B44AC(u8 taskId, struct Task *task, struct MapObject *trainerObj) +static bool8 sub_80B44AC(u8 taskId, struct Task *task, struct MapObject *trainerObj) { - if (!FieldEffectActiveListContains(49)) - task->data[0] = 3; + if (!FieldEffectActiveListContains(FLDEFF_POP_OUT_OF_ASH)) + task->tFuncId = 3; return FALSE; } -void sub_80B44C8(u8 taskId) +#undef tFuncId +#undef tTrainerRange +#undef tOutOfAshSpriteId +#undef tTrainerMapObjectId + +static void sub_80B44C8(u8 taskId) { struct Task *task = &gTasks[taskId]; struct MapObject *mapObj; @@ -596,8 +597,8 @@ void sub_80B44C8(u8 taskId) FieldObjectClearAnim(mapObj); task->data[7]++; } - gTrainerSeeFuncList2[task->data[0]](taskId, task, mapObj); - if (task->data[0] == 3 && !FieldEffectActiveListContains(49)) + sTrainerSeeFuncList2[task->data[0]](taskId, task, mapObj); + if (task->data[0] == 3 && !FieldEffectActiveListContains(FLDEFF_POP_OUT_OF_ASH)) { npc_set_running_behaviour_etc(mapObj, npc_running_behaviour_by_direction(mapObj->mapobj_unk_18)); sub_808F23C(mapObj, npc_running_behaviour_by_direction(mapObj->mapobj_unk_18)); @@ -619,7 +620,7 @@ void EndTrainerApproach(void) sub_80B40C8(Task_DestroyTrainerApproachTask); } -void Task_DestroyTrainerApproachTask(u8 taskId) +static void Task_DestroyTrainerApproachTask(u8 taskId) { DestroyTask(taskId); EnableBothScriptContexts(); @@ -648,79 +649,93 @@ void sub_80B45D0(void) } } +#define sLocalId data[0] +#define sMapNum data[1] +#define sMapGroup data[2] +#define sData3 data[3] +#define sData4 data[4] +#define sFldEffId data[7] + u8 FldEff_ExclamationMarkIcon1(void) { - u8 spriteId = CreateSpriteAtEnd(&gSpriteTemplate_85507B4, 0, 0, 0x53); + u8 spriteId = CreateSpriteAtEnd(&sSpriteTemplate_ExclamationQuestionMark, 0, 0, 0x53); if (spriteId != MAX_SPRITES) - sub_80B46D8(&gSprites[spriteId], 0, 0); + SetIconSpriteData(&gSprites[spriteId], FLDEFF_EXCLAMATION_MARK_ICON_1, 0); return 0; } u8 FldEff_ExclamationMarkIcon2(void) { - u8 spriteId = CreateSpriteAtEnd(&gSpriteTemplate_85507B4, 0, 0, 0x52); + u8 spriteId = CreateSpriteAtEnd(&sSpriteTemplate_ExclamationQuestionMark, 0, 0, 0x52); if (spriteId != MAX_SPRITES) - sub_80B46D8(&gSprites[spriteId], 33, 1); + SetIconSpriteData(&gSprites[spriteId], FLDEFF_EXCLAMATION_MARK_ICON_2, 1); return 0; } u8 FldEff_HeartIcon(void) { - u8 spriteId = CreateSpriteAtEnd(&gSpriteTemplate_85507CC, 0, 0, 0x52); + u8 spriteId = CreateSpriteAtEnd(&sSpriteTemplate_HeartIcon, 0, 0, 0x52); if (spriteId != MAX_SPRITES) { struct Sprite *sprite = &gSprites[spriteId]; - sub_80B46D8(sprite, 46, 0); + SetIconSpriteData(sprite, FLDEFF_HEART_ICON, 0); sprite->oam.paletteNum = 2; } return 0; } -void sub_80B46D8(struct Sprite *sprite, u16 a2, u8 a3) +static void SetIconSpriteData(struct Sprite *sprite, u16 fldEffId, u8 spriteAnimNum) { sprite->oam.priority = 1; sprite->coordOffsetEnabled = 1; - sprite->data[0] = gFieldEffectArguments[0]; - sprite->data[1] = gFieldEffectArguments[1]; - sprite->data[2] = gFieldEffectArguments[2]; - sprite->data[3] = -5; - sprite->data[7] = a2; + sprite->sLocalId = gFieldEffectArguments[0]; + sprite->sMapNum = gFieldEffectArguments[1]; + sprite->sMapGroup = gFieldEffectArguments[2]; + sprite->sData3 = -5; + sprite->sFldEffId = fldEffId; - StartSpriteAnim(sprite, a3); + StartSpriteAnim(sprite, spriteAnimNum); } -void objc_exclamation_mark_probably(struct Sprite *sprite) +static void SpriteCB_TrainerIcons(struct Sprite *sprite) { u8 mapObjId; - if (TryGetFieldObjectIdByLocalIdAndMap(sprite->data[0], sprite->data[1], sprite->data[2], &mapObjId) + if (TryGetFieldObjectIdByLocalIdAndMap(sprite->sLocalId, sprite->sMapNum, sprite->sMapGroup, &mapObjId) || sprite->animEnded) { - FieldEffectStop(sprite, sprite->data[7]); + FieldEffectStop(sprite, sprite->sFldEffId); } else { struct Sprite *mapObjSprite = &gSprites[gMapObjects[mapObjId].spriteId]; - sprite->data[4] += sprite->data[3]; + sprite->sData4 += sprite->sData3; sprite->pos1.x = mapObjSprite->pos1.x; sprite->pos1.y = mapObjSprite->pos1.y - 16; sprite->pos2.x = mapObjSprite->pos2.x; - sprite->pos2.y = mapObjSprite->pos2.y + sprite->data[4]; - if (sprite->data[4]) - sprite->data[3]++; + sprite->pos2.y = mapObjSprite->pos2.y + sprite->sData4; + if (sprite->sData4) + sprite->sData3++; else - sprite->data[3] = 0; + sprite->sData3 = 0; } } +#undef sLocalId +#undef sMapNum +#undef sMapGroup +#undef sData3 +#undef sData4 +#undef sFldEffId + u8 GetCurrentApproachingTrainerMapObjectId(void) { if (gApproachingTrainerId == 0) -- cgit v1.2.3 From 4abc2eea8aee0efc714df8519533c55fbabae5f1 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Tue, 19 Dec 2017 17:33:07 +0100 Subject: ram vars to C files --- src/battle_setup.c | 5 +---- src/trainer_see.c | 16 ++++++++++------ 2 files changed, 11 insertions(+), 10 deletions(-) (limited to 'src') diff --git a/src/battle_setup.c b/src/battle_setup.c index 3d4f5afcc..be23a28c9 100644 --- a/src/battle_setup.c +++ b/src/battle_setup.c @@ -88,9 +88,6 @@ extern u32 GetGameStat(u8 statId); extern u32 gBattleTypeFlags; extern u8 gBattleOutcome; extern void (*gFieldCallback)(void); -extern u8 gApproachingTrainerId; -extern u8 gNoOfApproachingTrainers; -extern u16 gUnknown_03006080; // this file's functions static void DoBattlePikeWildBattle(void); @@ -113,7 +110,7 @@ static void HandleRematchVarsOnBattleEnd(void); static const u8 *GetIntroSpeechOfApproachingTrainer(void); static const u8 *GetTrainerCantBattleSpeech(void); -// ewram data +// ewram vars EWRAM_DATA static u16 sTrainerBattleMode = 0; EWRAM_DATA u16 gTrainerBattleOpponent_A = 0; EWRAM_DATA u16 gTrainerBattleOpponent_B = 0; diff --git a/src/trainer_see.c b/src/trainer_see.c index b8dbda0c1..53bc5cbbb 100644 --- a/src/trainer_see.c +++ b/src/trainer_see.c @@ -14,12 +14,6 @@ #include "event_data.h" #include "script_movement.h" -extern u8 gApproachingTrainerId; -extern u8 gNoOfApproachingTrainers; -extern u8 gUnknown_030060AC; -extern u16 gUnknown_03006080; -extern u8 gUnknown_03006084[]; - extern bool8 InBattlePyramid(void); extern bool32 InTrainerHill(void); extern bool8 GetBattlePyramidTrainerFlag(u8 mapObjectId); @@ -55,6 +49,16 @@ static bool8 sub_80B44AC(u8 taskId, struct Task *task, struct MapObject *trainer static void SpriteCB_TrainerIcons(struct Sprite *sprite); +// IWRAM common +u16 gUnknown_03006080; +u8 gUnknown_03006084[4]; +struct ApproachingTrainer gApproachingTrainers[2]; +u8 gNoOfApproachingTrainers; +u8 gUnknown_030060AC; + +// EWRAM +EWRAM_DATA u8 gApproachingTrainerId = 0; + // const rom data static const u8 sEmotion_ExclamationMarkGfx[] = INCBIN_U8("graphics/misc/emotion_exclamation.4bpp"); static const u8 sEmotion_QuestionMarkGfx[] = INCBIN_U8("graphics/misc/emotion_question.4bpp"); -- cgit v1.2.3 From a705a863d1f59411a6f18fdd95e81de76f66fd66 Mon Sep 17 00:00:00 2001 From: Diegoisawesome Date: Thu, 21 Dec 2017 12:26:00 -0600 Subject: Fix incorrect slash in battle_bg.c --- src/battle_bg.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src') diff --git a/src/battle_bg.c b/src/battle_bg.c index 24a88c4f5..82355273b 100644 --- a/src/battle_bg.c +++ b/src/battle_bg.c @@ -1,7 +1,7 @@ #include "global.h" #include "battle.h" #include "sprite.h" -#include "constants\trainers.h" +#include "constants/trainers.h" #include "graphics.h" #include "decompress.h" #include "bg.h" -- cgit v1.2.3