Added getobjectposition

This commit is contained in:
pkmnsnfrn 2024-08-10 21:17:50 -07:00
parent 73953b3e39
commit 811b5d286e
5 changed files with 45 additions and 9 deletions

View File

@ -2327,3 +2327,10 @@
callnative RemoveAllItem
.2byte \itemId
.endm
@ return current (posType = 0) or map (posType = 1) position of object to VAR_0x8007 (x), VAR_0x8008 (y)
.macro getobjectxy localId:req, posType:req
setvar VAR_0x8000, \localId
setvar VAR_0x8001, \posType
special GetObjectPosition
.endm

View File

@ -554,3 +554,4 @@ gSpecials::
def_special Script_GetChosenMonDefensiveEVs
def_special Script_GetChosenMonOffensiveIVs
def_special Script_GetChosenMonDefensiveIVs
def_special GetObjectPosition

View File

@ -126,6 +126,7 @@ bool8 TryGetObjectEventIdByLocalIdAndMap(u8 localId, u8 mapNum, u8 mapGroupId, u
u8 GetObjectEventIdByXY(s16 x, s16 y);
void SetObjectEventDirection(struct ObjectEvent *objectEvent, u8 direction);
u8 GetFirstInactiveObjectEventId(void);
u8 GetObjectEventIdByLocalId(u8);
void RemoveObjectEventByLocalIdAndMap(u8 localId, u8 mapNum, u8 mapGroup);
void LoadSpecialObjectReflectionPalette(u16 tag, u8 slot);
void TryMoveObjectEventToMapCoords(u8 localId, u8 mapNum, u8 mapGroup, s16 x, s16 y);
@ -210,6 +211,7 @@ void ObjectEventForceSetHeldMovement(struct ObjectEvent *objectEvent, u8 movemen
bool8 ObjectEventIsMovementOverridden(struct ObjectEvent *objectEvent);
u8 ObjectEventCheckHeldMovementStatus(struct ObjectEvent *objectEvent);
u8 ObjectEventGetHeldMovementActionId(struct ObjectEvent *objectEvent);
const struct ObjectEventTemplate *FindObjectEventTemplateByLocalId(u8, const struct ObjectEventTemplate *, u8);
void TryOverrideTemplateCoordsForObjectEvent(const struct ObjectEvent *objectEvent, u8 movementType);
void OverrideTemplateCoordsForObjectEvent(const struct ObjectEvent *objectEvent);
void ShiftStillObjectEventCoords(struct ObjectEvent *objEvent);

View File

@ -157,7 +157,6 @@ static void ApplyLevitateMovement(u8);
static bool8 MovementType_Disguise_Callback(struct ObjectEvent *, struct Sprite *);
static bool8 MovementType_Buried_Callback(struct ObjectEvent *, struct Sprite *);
static void CreateReflectionEffectSprites(void);
static u8 GetObjectEventIdByLocalId(u8);
static u8 GetObjectEventIdByLocalIdAndMapInternal(u8, u8, u8);
static bool8 GetAvailableObjectEventId(u16, u8, u8, u8 *);
static void SetObjectEventDynamicGraphicsId(struct ObjectEvent *);
@ -179,7 +178,6 @@ static void SpriteCB_CameraObject(struct Sprite *);
static void CameraObject_Init(struct Sprite *);
static void CameraObject_UpdateMove(struct Sprite *);
static void CameraObject_UpdateFrozen(struct Sprite *);
static const struct ObjectEventTemplate *FindObjectEventTemplateByLocalId(u8, const struct ObjectEventTemplate *, u8);
static void ObjectEventSetSingleMovement(struct ObjectEvent *, struct Sprite *, u8);
static void SetSpriteDataForNormalStep(struct Sprite *, u8, u8);
static void InitSpriteForFigure8Anim(struct Sprite *);
@ -1298,7 +1296,7 @@ static u8 GetObjectEventIdByLocalIdAndMapInternal(u8 localId, u8 mapNum, u8 mapG
return OBJECT_EVENTS_COUNT;
}
static u8 GetObjectEventIdByLocalId(u8 localId)
u8 GetObjectEventIdByLocalId(u8 localId)
{
u8 i;
for (i = 0; i < OBJECT_EVENTS_COUNT; i++)
@ -1493,7 +1491,7 @@ static s16 ReallocSpriteTiles(struct Sprite *sprite, u32 byteSize)
{
i = -1;
}
sprite->invisible = wasVisible;
return i;
}
@ -1510,7 +1508,7 @@ u16 LoadSheetGraphicsInfo(const struct ObjectEventGraphicsInfo *info, u16 uuid,
bool32 oldInvisible;
if (tag == TAG_NONE)
tag = COMP_OW_TILE_TAG_BASE + uuid;
if (sprite)
{
oldInvisible = sprite->invisible;
@ -1547,7 +1545,7 @@ u16 LoadSheetGraphicsInfo(const struct ObjectEventGraphicsInfo *info, u16 uuid,
{
FieldEffectFreeTilesIfUnused(oldTiles);
}
if (sprite)
{
sprite->sheetTileStart = tileStart;
@ -1566,7 +1564,7 @@ u16 LoadSheetGraphicsInfo(const struct ObjectEventGraphicsInfo *info, u16 uuid,
{
sprite->oam.tileNum = sprite->sheetTileStart;
sprite->usingSheet = FALSE;
}
else if (sprite && !sprite->sheetTileStart && sprite->oam.size != info->oam->size)
{
@ -1925,7 +1923,7 @@ static u8 LoadDynamicFollowerPalette(u16 species, u8 form, bool32 shiny)
spritePalette.data = gSpeciesInfo[species].overworldShinyPalette;
else
spritePalette.data = gSpeciesInfo[species].overworldPalette;
// Check if pal data must be decompressed
if (IsLZ77Data(spritePalette.data, PLTT_SIZE_4BPP, PLTT_SIZE_4BPP))
{
@ -3306,7 +3304,7 @@ static const struct ObjectEventTemplate *GetObjectEventTemplateByLocalIdAndMap(u
return FindObjectEventTemplateByLocalId(localId, templates, count);
}
static const struct ObjectEventTemplate *FindObjectEventTemplateByLocalId(u8 localId, const struct ObjectEventTemplate *templates, u8 count)
const struct ObjectEventTemplate *FindObjectEventTemplateByLocalId(u8 localId, const struct ObjectEventTemplate *templates, u8 count)
{
u8 i;

View File

@ -4266,3 +4266,31 @@ void PreparePartyForSkyBattle(void)
VarSet(B_VAR_SKY_BATTLE,participatingPokemonSlot);
CompactPartySlots();
}
// get position (0 for current, 1 for map) of object event, return to VAR_0x8007, VAR_0x8008
void GetObjectPosition(void)
{
u16 localId = gSpecialVar_0x8000;
u16 useTemplate = gSpecialVar_0x8001;
u16 *x = &gSpecialVar_0x8007;
u16 *y = &gSpecialVar_0x8008;
if (!useTemplate)
{
/* current position */
const u16 objId = GetObjectEventIdByLocalId(localId);
const struct ObjectEvent *objEvent = &gObjectEvents[objId];
*x = objEvent->currentCoords.x - 7; // subtract out camera size
*y = objEvent->currentCoords.y - 7;
}
else
{
const struct ObjectEventTemplate *objTemplate =
FindObjectEventTemplateByLocalId(localId,
gSaveBlock1Ptr->objectEventTemplates,
gMapHeader.events->objectEventCount);
*x = objTemplate->x;
*y = objTemplate->y;
}
}