diff options
author | JaceCearK1 <JaceCearK1@users.noreply.github.com> | 2017-07-01 21:04:18 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2017-07-01 21:04:18 +0200 |
commit | 0dd804a99e5455a0eac8ff6ed87d9de16c7380b7 (patch) | |
tree | 7b3567978b63ee6548a7b945e075ea8ba37bef51 /src/trainer_see.c | |
parent | f1344efd2aff92292f58f7323bd9297a38fe9b02 (diff) | |
parent | 8d82578d3a101b06f9d2ced31738021007c4e533 (diff) |
Merge pull request #1 from pret/master
Update fork to match main fork.
Diffstat (limited to 'src/trainer_see.c')
-rw-r--r-- | src/trainer_see.c | 142 |
1 files changed, 107 insertions, 35 deletions
diff --git a/src/trainer_see.c b/src/trainer_see.c index 969bc94c1..9b7a47f6b 100644 --- a/src/trainer_see.c +++ b/src/trainer_see.c @@ -1,14 +1,13 @@ #include "global.h" #include "trainer_see.h" -#include "asm.h" #include "battle_setup.h" -#include "field_player_avatar.h" -#include "field_map_obj.h" -#include "asm_fieldmap.h" -#include "task.h" -#include "sprite.h" #include "field_effect.h" +#include "field_map_obj.h" +#include "field_player_avatar.h" #include "script.h" +#include "sprite.h" +#include "task.h" +#include "util.h" extern bool8 (*gIsTrainerInRange[])(struct MapObject *, u16, s16, s16); extern bool8 (*gTrainerSeeFuncList[])(u8, struct Task *, struct MapObject *); @@ -16,12 +15,14 @@ extern bool8 (*gTrainerSeeFuncList2[])(u8, struct Task *, struct MapObject *); extern u32 gUnknown_0202FF84[]; +extern struct SpriteTemplate gSpriteTemplate_839B510; +extern struct SpriteTemplate gSpriteTemplate_839B528; bool8 CheckTrainers(void) { u8 i; - - for(i = 0; i < 16; i++) + + for (i = 0; i < 16; i++) { if ( gMapObjects[i].active ) if ( gMapObjects[i].trainerType == 1 || gMapObjects[i].trainerType == 3 ) @@ -35,14 +36,14 @@ bool8 CheckTrainer(u8 trainer) { u8 *scriptPtr = GetFieldObjectScriptPointerByFieldObjectId(trainer); - if(GetTrainerFlagFromScriptPointer(scriptPtr)) + if (GetTrainerFlagFromScriptPointer(scriptPtr)) return FALSE; else { struct MapObject *trainerObj = &gMapObjects[trainer]; u8 canApproach = TrainerCanApproachPlayer(trainerObj); - if(canApproach != 0) + if (canApproach != 0) { TrainerWantsBattle(trainer, scriptPtr); sub_80842C8(trainerObj, (canApproach - 1)); @@ -60,7 +61,7 @@ bool8 TrainerCanApproachPlayer(struct MapObject *trainerObj) s16 x, y; u8 i; u8 playerCoord; - + PlayerGetDestCoords(&x, &y); if ( trainerObj->trainerType == 1 ) // trainers that don't spin { @@ -69,7 +70,7 @@ bool8 TrainerCanApproachPlayer(struct MapObject *trainerObj) } else // spinners { - for(i = 0; i < 4; i++) + for (i = 0; i < 4; i++) { playerCoord = gIsTrainerInRange[i](trainerObj, trainerObj->trainerRange_berryTreeId, x, y); if ( CheckPathBetweenTrainerAndPlayer((struct MapObject2 *)trainerObj, playerCoord, i + 1) ) // directions are 1-4 instead of 0-3. south north west east @@ -119,6 +120,12 @@ bool8 IsTrainerInRangeEast(struct MapObject *trainerObj, s16 vision, s16 x, s16 return FALSE; } +#ifdef BUGFIX_TRAINERAPPROACH +#define COLLISION_MASK ~1 +#else +#define COLLISION_MASK 1 +#endif + bool8 CheckPathBetweenTrainerAndPlayer(struct MapObject2 *trainerObj, u8 playerCoord, u8 direction) { s16 x, y; @@ -127,21 +134,18 @@ bool8 CheckPathBetweenTrainerAndPlayer(struct MapObject2 *trainerObj, u8 playerC u8 i; u8 var; - if ( !playerCoord ) + if (!playerCoord) return FALSE; x = trainerObj->coords2.x; y = trainerObj->coords2.y; - for(i = 0; i <= playerCoord - 1;) + for (i = 0; i <= playerCoord - 1; i++, MoveCoords(direction, &x, &y)) { var = sub_8060024((struct MapObject *)trainerObj, x, y, direction); - if (var != 0 && (var & 1) != 0 ) + if (var && (var & COLLISION_MASK)) return FALSE; - - i++; - MoveCoords(direction, &x, &y); } // preserve mapobj_unk_19 before clearing. @@ -154,7 +158,7 @@ bool8 CheckPathBetweenTrainerAndPlayer(struct MapObject2 *trainerObj, u8 playerC trainerObj->mapobj_unk_19 = unk19_temp; trainerObj->mapobj_unk_19b = unk19b_temp; - if ( var == 4 ) + if (var == 4) return playerCoord; return FALSE; @@ -173,7 +177,7 @@ void sub_80842FC(TaskFunc func) { TaskFunc func2 = RunTrainerSeeFuncList; u8 taskId = FindTaskIdByFunc(func2); - + SetTaskFuncWithFollowupFunc(taskId, RunTrainerSeeFuncList, func); gTasks[taskId].data[0] = 1; func2(taskId); @@ -201,7 +205,7 @@ s8 sub_8084398(u8 taskId, struct Task *task, struct MapObject *trainerObj) FieldObjectGetLocalIdAndMap(trainerObj, (u8 *)&gUnknown_0202FF84[0], (u8 *)&gUnknown_0202FF84[1], (u8 *)&gUnknown_0202FF84[2]); FieldEffectStart(0); - + direction = GetFaceDirectionAnimId(trainerObj->mapobj_unk_18); FieldObjectSetSpecialAnim(trainerObj, direction); @@ -228,7 +232,7 @@ s8 sub_808441C(u8 taskId, struct Task *task, struct MapObject *trainerObj) { if (!(FieldObjectIsSpecialAnimOrDirectionSequenceAnimActive(trainerObj)) || FieldObjectClearAnimIfSpecialAnimFinished(trainerObj)) { - if(task->data[3]) + if (task->data[3]) { FieldObjectSetSpecialAnim(trainerObj, GetGoSpeed0AnimId(trainerObj->mapobj_unk_18)); task->data[3]--; @@ -267,17 +271,17 @@ s8 sub_8084478(u8 taskId, struct Task *task, struct MapObject *trainerObj) s8 sub_8084534(u8 taskId, struct Task *task, struct MapObject *trainerObj) // technically only 1 parameter, but needs all 3 for TrainerSeeFuncList call. { struct MapObject *playerObj = &gMapObjects[gPlayerAvatar.mapObjectId]; - + if ( !FieldObjectIsSpecialAnimOrDirectionSequenceAnimActive(playerObj) || FieldObjectClearAnimIfSpecialAnimFinished(playerObj) ) SwitchTaskToFollowupFunc(taskId); - + return 0; } s8 sub_8084578(u8 taskId, struct Task *task, struct MapObject *trainerObj) { - if(!FieldObjectIsSpecialAnimOrDirectionSequenceAnimActive(trainerObj) + if (!FieldObjectIsSpecialAnimOrDirectionSequenceAnimActive(trainerObj) || FieldObjectClearAnimIfSpecialAnimFinished(trainerObj)) { FieldObjectSetSpecialAnim(trainerObj, 0x59); @@ -290,13 +294,13 @@ s8 sub_80845AC(u8 taskId, struct Task *task, struct MapObject *trainerObj) { if ( FieldObjectClearAnimIfSpecialAnimFinished(trainerObj) ) task->data[0] = 3; - + return 0; } s8 sub_80845C8(u8 taskId, struct Task *task, struct MapObject *trainerObj) { - if(!FieldObjectIsSpecialAnimOrDirectionSequenceAnimActive(trainerObj) + if (!FieldObjectIsSpecialAnimOrDirectionSequenceAnimActive(trainerObj) || FieldObjectClearAnimIfSpecialAnimFinished(trainerObj)) { FieldObjectSetSpecialAnim(trainerObj, 0x3E); @@ -307,7 +311,7 @@ s8 sub_80845C8(u8 taskId, struct Task *task, struct MapObject *trainerObj) s8 sub_80845FC(u8 taskId, struct Task *task, struct MapObject *trainerObj) { - if(FieldObjectCheckIfSpecialAnimFinishedOrInactive(trainerObj)) + if (FieldObjectCheckIfSpecialAnimFinishedOrInactive(trainerObj)) { gUnknown_0202FF84[0] = trainerObj->coords2.x; gUnknown_0202FF84[1] = trainerObj->coords2.y; @@ -323,11 +327,11 @@ s8 sub_8084654(u8 taskId, struct Task *task, struct MapObject *trainerObj) { struct Sprite *sprite; - if(gSprites[task->data[4]].animCmdIndex == 2) + 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); @@ -339,7 +343,7 @@ s8 sub_8084654(u8 taskId, struct Task *task, struct MapObject *trainerObj) s8 sub_80846C8(u8 taskId, struct Task *task, struct MapObject *trainerObj) { - if(!FieldEffectActiveListContains(49)) + if (!FieldEffectActiveListContains(49)) task->data[0] = 3; return 0; @@ -352,13 +356,13 @@ void sub_80846E4(u8 taskId) // another mapObj loaded into by loadword? LoadWordFromTwoHalfwords(&task->data[1], (u32 *)&mapObj); - if(!task->data[7]) + if (!task->data[7]) { FieldObjectClearAnim(mapObj); task->data[7]++; } gTrainerSeeFuncList2[task->data[0]](taskId, task, mapObj); - if(task->data[0] == 3 && !FieldEffectActiveListContains(49)) + if (task->data[0] == 3 && !FieldEffectActiveListContains(49)) { npc_set_running_behaviour_etc(mapObj, npc_running_behaviour_by_direction(mapObj->mapobj_unk_18)); sub_805C774(mapObj, npc_running_behaviour_by_direction(mapObj->mapobj_unk_18)); @@ -368,9 +372,9 @@ void sub_80846E4(u8 taskId) mapObj->mapobj_bit_7 = 0; } -void sub_8084794(u32 var) +void sub_8084794(struct MapObject *var) { - StoreWordInTwoHalfwords(&gTasks[CreateTask(sub_80846E4, 0)].data[1], var); + StoreWordInTwoHalfwords(&gTasks[CreateTask(sub_80846E4, 0)].data[1], (u32)var); } void sub_80847C8(void) @@ -383,3 +387,71 @@ void sub_80847D8(u8 taskId) DestroyTask(taskId); EnableBothScriptContexts(); } + +u8 FldEff_ExclamationMarkIcon1(void) +{ + u8 spriteId = CreateSpriteAtEnd(&gSpriteTemplate_839B510, 0, 0, 0x53); + + if (spriteId != 64) + sub_8084894(&gSprites[spriteId], 0, 0); + + return 0; +} + +u8 FldEff_ExclamationMarkIcon2(void) +{ + u8 spriteId = CreateSpriteAtEnd(&gSpriteTemplate_839B510, 0, 0, 0x52); + + if (spriteId != 64) + sub_8084894(&gSprites[spriteId], 33, 1); + + return 0; +} + +u8 FldEff_HeartIcon(void) +{ + u8 spriteId = CreateSpriteAtEnd(&gSpriteTemplate_839B528, 0, 0, 0x52); + + if (spriteId != 64) + sub_8084894(&gSprites[spriteId], 46, 0); + + return 0; +} + +void sub_8084894(struct Sprite *sprite, u16 a2, u8 a3) +{ + sprite->oam.priority = 1; + sprite->coordOffsetEnabled = 1; + + sprite->data0 = gUnknown_0202FF84[0]; + sprite->data1 = gUnknown_0202FF84[1]; + sprite->data2 = gUnknown_0202FF84[2]; + sprite->data3 = -5; + sprite->data7 = a2; + + StartSpriteAnim(sprite, a3); +} + +void objc_exclamation_mark_probably(struct Sprite *sprite) +{ + u8 mapObjId; + + if (TryGetFieldObjectIdByLocalIdAndMap(sprite->data0, sprite->data1, sprite->data2, &mapObjId) + || sprite->animEnded) + { + FieldEffectStop(sprite, (u8)sprite->data7); + } + else + { + struct Sprite *mapObjSprite = &gSprites[gMapObjects[mapObjId].spriteId]; + sprite->data4 += sprite->data3; + 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->data4; + if (sprite->data4) + sprite->data3++; + else + sprite->data3 = 0; + } +} |