start working on trainer see

This commit is contained in:
DizzyEggg 2017-12-18 19:35:50 +01:00
parent 6a674e1e83
commit a612ef12a0
8 changed files with 252 additions and 228 deletions

View File

@ -5,127 +5,10 @@
.text
thumb_func_start CheckIfTrainerWantsBattle
@ u8 CheckIfTrainerWantsBattle(u8 trainerFieldObjectId)
CheckIfTrainerWantsBattle: @ 80B3D00
push {r4-r7,lr}
mov r7, r9
mov r6, r8
push {r6,r7}
lsls r0, 24
lsrs r5, r0, 24
movs r0, 0x1
mov r9, r0
bl InTrainerHill
cmp r0, 0x1
bne _080B3D1E
bl sub_81D62AC
b _080B3D24
_080B3D1E:
adds r0, r5, 0
bl GetFieldObjectScriptPointerByFieldObjectId
_080B3D24:
adds r7, r0, 0
bl InBattlePyramid
lsls r0, 24
cmp r0, 0
beq _080B3D3E
adds r0, r5, 0
bl GetBattlePyramidTrainerFlag
_080B3D36:
lsls r0, 24
_080B3D38:
cmp r0, 0
beq _080B3D56
b _080B3DE0
_080B3D3E:
bl InTrainerHill
cmp r0, 0x1
bne _080B3D4E
adds r0, r5, 0
bl GetTrainerHillTrainerFlag
b _080B3D36
_080B3D4E:
adds r0, r7, 0
bl GetTrainerFlagFromScriptPointer
b _080B3D38
_080B3D56:
lsls r4, r5, 3
adds r0, r4, r5
lsls r0, 2
ldr r1, =gMapObjects
adds r0, r1
bl CheckIfTrainerCanApproachPlayer
lsls r0, 24
lsrs r6, r0, 24
mov r8, r4
cmp r6, 0
beq _080B3DE0
ldrb r0, [r7, 0x1]
cmp r0, 0x4
beq _080B3D7C
cmp r0, 0x7
beq _080B3D7C
cmp r0, 0x6
bne _080B3D8A
_080B3D7C:
bl GetMonsStateToDoubles_2
lsls r0, 24
cmp r0, 0
bne _080B3DE0
movs r1, 0x2
mov r9, r1
_080B3D8A:
ldr r2, =gApproachingTrainers
ldr r4, =gNoOfApproachingTrainers
ldrb r1, [r4]
lsls r0, r1, 1
adds r0, r1
lsls r0, 2
adds r0, r2
strb r5, [r0]
ldrb r1, [r4]
lsls r0, r1, 1
adds r0, r1
lsls r0, 2
adds r1, r2, 0x4
adds r0, r1
str r7, [r0]
ldrb r1, [r4]
lsls r0, r1, 1
adds r0, r1
lsls r0, 2
adds r0, r2
strb r6, [r0, 0x1]
mov r1, r8
adds r0, r1, r5
lsls r0, 2
ldr r1, =gMapObjects
adds r0, r1
subs r1, r6, 0x1
lsls r1, 24
lsrs r1, 24
bl TrainerApproachPlayer
ldrb r0, [r4]
adds r0, 0x1
strb r0, [r4]
mov r0, r9
b _080B3DE2
.pool
_080B3DE0:
movs r0, 0
_080B3DE2:
pop {r3,r4}
mov r8, r3
mov r9, r4
pop {r4-r7}
pop {r1}
bx r1
thumb_func_end CheckIfTrainerWantsBattle
thumb_func_start CheckIfTrainerCanApproachPlayer
@ u8 CheckIfTrainerCanApproachPlayer(struct npc_state *trainerFieldObject)
CheckIfTrainerCanApproachPlayer: @ 80B3DF0
thumb_func_start GetTrainerApproachDistance
@ u8 GetTrainerApproachDistance(struct npc_state *trainerFieldObject)
GetTrainerApproachDistance: @ 80B3DF0
push {r4-r7,lr}
mov r7, r8
push {r7}
@ -140,7 +23,7 @@ CheckIfTrainerCanApproachPlayer: @ 80B3DF0
mov r8, r4
cmp r0, 0x1
bne _080B3E50
ldr r1, =gIsTrainerInRange
ldr r1, =sDirectionalApproachDistanceFuncs
ldrb r0, [r7, 0x18]
lsls r0, 28
lsrs r0, 26
@ -173,7 +56,7 @@ _080B3E4C:
_080B3E50:
movs r5, 0
_080B3E52:
ldr r0, =gIsTrainerInRange
ldr r0, =sDirectionalApproachDistanceFuncs
lsls r4, r5, 2
adds r4, r0
ldrb r1, [r7, 0x1D]
@ -210,11 +93,11 @@ _080B3E90:
pop {r1}
bx r1
.pool
thumb_func_end CheckIfTrainerCanApproachPlayer
thumb_func_end GetTrainerApproachDistance
thumb_func_start IsTrainerInRangeSouth
@ u8 IsTrainerInRangeSouth(struct npc_state *trainerFieldObject, u16 sightRange, u16 playerX, u16 playerY)
IsTrainerInRangeSouth: @ 80B3EA0
thumb_func_start GetTrainerApproachDistanceSouth
@ u8 GetTrainerApproachDistanceSouth(struct npc_state *trainerFieldObject, u16 sightRange, u16 playerX, u16 playerY)
GetTrainerApproachDistanceSouth: @ 80B3EA0
push {r4-r6,lr}
adds r4, r0, 0
lsls r1, 16
@ -250,11 +133,11 @@ _080B3EDC:
pop {r4-r6}
pop {r1}
bx r1
thumb_func_end IsTrainerInRangeSouth
thumb_func_end GetTrainerApproachDistanceSouth
thumb_func_start IsTrainerInRangeNorth
@ u8 IsTrainerInRangeNorth(struct npc_state *trainerFieldObject, u16 sightRange, u16 playerX, u16 playerY)
IsTrainerInRangeNorth: @ 80B3EE4
thumb_func_start GetTrainerApproachDistanceNorth
@ u8 GetTrainerApproachDistanceNorth(struct npc_state *trainerFieldObject, u16 sightRange, u16 playerX, u16 playerY)
GetTrainerApproachDistanceNorth: @ 80B3EE4
push {r4-r6,lr}
adds r4, r0, 0
lsls r1, 16
@ -290,11 +173,11 @@ _080B3F20:
pop {r4-r6}
pop {r1}
bx r1
thumb_func_end IsTrainerInRangeNorth
thumb_func_end GetTrainerApproachDistanceNorth
thumb_func_start IsTrainerInRangeWest
@ u8 IsTrainerInRangeWest(struct npc_state *trainerFieldObject, u16 sightRange, u16 playerX, u16 playerY)
IsTrainerInRangeWest: @ 80B3F28
thumb_func_start GetTrainerApproachDistanceWest
@ u8 GetTrainerApproachDistanceWest(struct npc_state *trainerFieldObject, u16 sightRange, u16 playerX, u16 playerY)
GetTrainerApproachDistanceWest: @ 80B3F28
push {r4-r6,lr}
adds r4, r0, 0
lsls r1, 16
@ -330,11 +213,11 @@ _080B3F64:
pop {r4-r6}
pop {r1}
bx r1
thumb_func_end IsTrainerInRangeWest
thumb_func_end GetTrainerApproachDistanceWest
thumb_func_start IsTrainerInRangeEast
@ u8 IsTrainerInRangeEast(struct npc_state *trainerFieldObject, u16 sightRange, u16 playerX, u16 playerY)
IsTrainerInRangeEast: @ 80B3F6C
thumb_func_start GetTrainerApproachDistanceEast
@ u8 GetTrainerApproachDistanceEast(struct npc_state *trainerFieldObject, u16 sightRange, u16 playerX, u16 playerY)
GetTrainerApproachDistanceEast: @ 80B3F6C
push {r4-r6,lr}
adds r4, r0, 0
lsls r1, 16
@ -370,7 +253,7 @@ _080B3FA8:
pop {r4-r6}
pop {r1}
bx r1
thumb_func_end IsTrainerInRangeEast
thumb_func_end GetTrainerApproachDistanceEast
thumb_func_start CheckPathBetweenTrainerAndPlayer
@ u8 CheckPathBetweenTrainerAndPlayer(struct npc_state *fieldObject, u8 a2, u8 direction)

View File

@ -1,83 +0,0 @@
.include "asm/macros.inc"
.include "constants/constants.inc"
.section .rodata
.align 2
gEmotion_ExclamationMarkGfx:: @ 85505AC
.incbin "graphics/misc/emotion_exclamation.4bpp"
.align 2
gEmotion_QuestionMarkGfx:: @ 855062C
.incbin "graphics/misc/emotion_question.4bpp"
.align 2
gEmotion_HeartGfx:: @ 85506AC
.incbin "graphics/misc/emotion_heart.4bpp"
.align 2
gIsTrainerInRange:: @ 855072C
.4byte IsTrainerInRangeSouth
.4byte IsTrainerInRangeNorth
.4byte IsTrainerInRangeWest
.4byte IsTrainerInRangeEast
.align 2
gTrainerSeeFuncList:: @ 855073C
.4byte sub_80B4178
.4byte sub_80B417C
.4byte sub_80B41C0
.4byte sub_80B4200
.4byte sub_80B425C
.4byte sub_80B4318
.4byte sub_80B435C
.4byte sub_80B4390
.4byte sub_80B43AC
.4byte sub_80B43E0
.4byte sub_80B4438
.4byte sub_80B44AC
.align 2
gTrainerSeeFuncList2:: @ 855076C
.4byte sub_80B43AC
.4byte sub_80B43E0
.4byte sub_80B4438
.4byte sub_80B44AC
.align 2
gOamData_855077C:: @ 855077C
.2byte 0x0000
.2byte 0x4000
.2byte 0x0400
.align 2
gSpriteImageTable_8550784:: @ 8550784
obj_frame_tiles gEmotion_ExclamationMarkGfx, 0x0080
obj_frame_tiles gEmotion_QuestionMarkGfx, 0x0080
.align 2
gSpriteImageTable_8550794:: @ 8550794
obj_frame_tiles gEmotion_HeartGfx, 0x0080
.align 2
gSpriteAnim_855079C:: @ 855079C
obj_image_anim_frame 0, 60
obj_image_anim_end
.align 2
gSpriteAnim_85507A4:: @ 85507A4
obj_image_anim_frame 1, 60
obj_image_anim_end
.align 2
gSpriteAnimTable_85507AC:: @ 85507AC
.4byte gSpriteAnim_855079C
.4byte gSpriteAnim_85507A4
.align 2
gSpriteTemplate_85507B4:: @ 85507B4
spr_template 0xffff, 0xffff, gOamData_855077C, gSpriteAnimTable_85507AC, gSpriteImageTable_8550784, gDummySpriteAffineAnimTable, objc_exclamation_mark_probably
.align 2
gSpriteTemplate_85507CC:: @ 85507CC
spr_template 0xffff, 0x1004, gOamData_855077C, gSpriteAnimTable_85507AC, gSpriteImageTable_8550794, gDummySpriteAffineAnimTable, objc_exclamation_mark_probably

View File

@ -78,6 +78,7 @@ u8 FieldObjectClearAnimIfSpecialAnimFinished(struct MapObject *);
u8 GetFieldObjectIdByXYZ(u16 x, u16 y, u8 z);
void npc_set_running_behaviour_etc(struct MapObject *mapObject, u8 animPattern);
u8 npc_running_behaviour_by_direction(u8 direction);
const u8 *GetFieldObjectScriptPointerByFieldObjectId(u8 mapObjectId);
// Exported data declarations

View File

@ -2,5 +2,6 @@
#define GUARD_POKENAV_H
bool8 sub_81D5C18(void);
const u8 *sub_81D62AC(void);
#endif //GUARD_POKENAV_H

View File

@ -4,7 +4,7 @@
struct ApproachingTrainer
{
u8 mapObjectId;
u8 radius;
u8 radius; // plus 1
u8 field_2;
u8 field_3;
const u8 *trainerScriptPtr;

View File

@ -379,7 +379,7 @@ SECTIONS {
data/field_screen.o(.rodata);
src/battle_setup.o(.rodata);
data/cable_club.o(.rodata);
data/trainer_see.o(.rodata);
src/trainer_see.o(.rodata);
data/wild_encounter.o(.rodata);
data/field_effect.o(.rodata);
data/option_menu.o(.rodata);

View File

@ -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");

View File

@ -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;
// this file's functions
u8 CheckIfTrainerWantsBattle(u8 mapObjectId);
extern bool8 InBattlePyramid(void);
extern bool32 InTrainerHill(void);
extern bool8 GetBattlePyramidTrainerFlag(u8 mapObjectId);
extern bool8 GetTrainerHillTrainerFlag(u8 mapObjectId);
// this file's functions
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;
}
*/