Skip to content

Useful Scripting Specials

ghoulslash edited this page Jul 30, 2022 · 25 revisions

Useful Scripting Specials/Macros

This page will add some new scripting commands that may be useful for developing more advanced scripts.

All specials need to be added to the table in data/specials.inc following other special definitions

1. getobjectposition

credits to ghoulslash

This command will get either the map template position, or the current position of any object.

  1. First, our scripting macro:
@ 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
  1. Next, our special. You can add this to any .c file, I suggest src/event_object_movement or src/field_specials.c
// 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;
    }
}

2. checkobjectat

credits to ghoulslash

Checks in any object is at a given position

  1. scripting macro
@ checks if there is any object at a given position
.macro checkobjectat x:req, y:req
setorcopyvar VAR_0x8005, \x
setorcopyvar VAR_0x8006, \y
specialvar VAR_RESULT, CheckObjectAtXY
.endm
  1. code
// special to check if there is any object at a given position
u16 CheckObjectAtXY(void)
{
    u16 x = gSpecialVar_0x8005 + 7;
    u16 y = gSpecialVar_0x8006 + 7;
    u32 i;
    
    for (i = 0; i < OBJECT_EVENTS_COUNT; i++)
    {        
        if (gObjectEvents[i].active && gObjectEvents[i].currentCoords.x == x && gObjectEvents[i].currentCoords.y == y)
            return TRUE;
    }
    return FALSE;
}
Clone this wiki locally