From e52b70e46fa46787387595e231dde9e88c5f0872 Mon Sep 17 00:00:00 2001 From: Ariel Antonitis Date: Mon, 15 Jun 2020 14:07:37 -0400 Subject: [PATCH] Updated follower scripting (applymovement). --- data/scripts/follower.inc | 58 +++++++- graphics/object_events/palettes/charizard.pal | 19 +++ .../object_events/pics/pokemon/charizard.png | Bin 0 -> 5896 bytes graphics/pokemon/togetic/anim_front.png | Bin 830 -> 6367 bytes include/constants/event_objects.h | 3 +- include/event_object_movement.h | 7 +- include/event_scripts.h | 4 + spritesheet_rules.mk | 3 + .../movement_action_func_tables.h | 7 +- .../object_events/movement_type_func_tables.h | 6 +- .../object_events/object_event_graphics.h | 2 + .../object_event_graphics_info.h | 1 + .../object_event_graphics_info_pointers.h | 3 + .../object_events/object_event_pic_tables.h | 9 ++ src/event_object_movement.c | 126 +++++++++++------- src/scrcmd.c | 19 +++ 16 files changed, 204 insertions(+), 63 deletions(-) create mode 100644 graphics/object_events/palettes/charizard.pal create mode 100644 graphics/object_events/pics/pokemon/charizard.png diff --git a/data/scripts/follower.inc b/data/scripts/follower.inc index 2b782d4799..bc4d2f4d34 100644 --- a/data/scripts/follower.inc +++ b/data/scripts/follower.inc @@ -1,6 +1,18 @@ -gText_Follower:: +gText_FollowerLovesYou:: .string "{STR_VAR_1} loves you!$" +gText_FollowerLostInThought:: + .string "{STR_VAR_1} seems lost in thought.$" + +gText_FollowerDefault:: + .string "ERROR 404: Script not found.$" + +gText_FollowerHasWetFeet:: + .string "{STR_VAR_1} seems unhappy about getting\nits feet wet.$" + +gText_FollowerSplashesAround:: + .string "{STR_VAR_1} splashes around happily!$" + .macro playfirstmoncry callfunc ScrFunc_playfirstmoncry .endm @@ -14,10 +26,44 @@ callfunc ScrFunc_bufferlivemonspeciesname EventScript_Follower:: lock faceplayer - playfirstmoncry - applymovement 0xFE ContestHall_Movement_Heart - waitmoncry - bufferlivemonspeciesname 0 - msgbox gText_Follower, MSGBOX_DEFAULT + callfunc ScrFunc_getfolloweraction + msgbox gText_FollowerDefault, MSGBOX_DEFAULT + release + end + +EventScript_FollowerHasWetFeet:: + bufferlivemonspeciesname 0 + playfirstmoncry + msgbox gText_FollowerHasWetFeet, MSGBOX_DEFAULT + waitmoncry + release + end + +EventScript_FollowerSplashesAbout:: + bufferlivemonspeciesname 0 + playfirstmoncry + applymovement 0xFE FollowerSplashMovement + waitmovement 0xFE + msgbox gText_FollowerSplashesAround, MSGBOX_DEFAULT + release + end + +EnterPokeballMovement:: + .byte 0x9F @ EnterPokeball + step_end + +FollowerSplashMovement:: + jump_in_place_left_right + jump_in_place_left_right + face_player + step_end + +EventScript_FollowerLovesYou:: + playfirstmoncry + applymovement 0xFE ContestHall_Movement_Heart + waitmovement 0xFE + waitmoncry + bufferlivemonspeciesname 0 + msgbox gText_FollowerLovesYou, MSGBOX_DEFAULT release end diff --git a/graphics/object_events/palettes/charizard.pal b/graphics/object_events/palettes/charizard.pal new file mode 100644 index 0000000000..274fd57f8c --- /dev/null +++ b/graphics/object_events/palettes/charizard.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +160 176 128 +0 0 0 +96 48 0 +192 16 32 +40 72 88 +96 64 0 +144 64 32 +200 88 40 +64 128 128 +248 120 56 +160 160 160 +216 168 48 +248 184 16 +240 208 112 +216 216 248 +0 0 0 diff --git a/graphics/object_events/pics/pokemon/charizard.png b/graphics/object_events/pics/pokemon/charizard.png new file mode 100644 index 0000000000000000000000000000000000000000..62a369dbc31b6ff3c65ae340953425f65ddbadb2 GIT binary patch literal 5896 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.x; @@ -1621,51 +1626,44 @@ u8 SpawnFollowingPokemon(void) { // Spawn a following pokemon TODO: Avoid this o // template.script = EventScript_Follower; // This does nothing because scripts are templated objectEventId = SpawnSpecialObjectEvent(&template); gObjectEvents[objectEventId].invisible = TRUE; - gObjectEvents[objectEventId].hasShadow = TRUE; return objectEventId; } +struct ObjectEvent * GetFollowerObject(void) { // Return follower ObjectEvent or NULL + u8 i; + for (i=0; i < OBJECT_EVENTS_COUNT; i++) { + if (gObjectEvents[i].localId == OBJ_EVENT_ID_FOLLOWER) { + return &gObjectEvents[i]; + } + } + return NULL; +} + void UpdateFollowingPokemon(void) { u8 i; u8 graphicsId; - struct ObjectEvent *objectEvent = NULL; - struct Pokemon *mon; - - // TODO: Improve finding player following pokemon - for (i=0; i < OBJECT_EVENTS_COUNT; i++) { - if (gObjectEvents[i].localId == 0xFE) { - objectEvent = &gObjectEvents[i]; - break; - } - } + struct ObjectEvent *objectEvent = GetFollowerObject(); + struct Pokemon *mon = GetFirstLiveMon(); if (objectEvent == NULL) { return; } - mon = GetFirstLiveMon(); if (mon == NULL) { // TODO: Fainted party return; } graphicsId = SpeciesToGraphicsId(GetMonData(mon, MON_DATA_SPECIES)); if (graphicsId != objectEvent->graphicsId) { // Mark as invisible MoveObjectEventToMapCoords(objectEvent, gObjectEvents[gPlayerAvatar.objectEventId].currentCoords.x, gObjectEvents[gPlayerAvatar.objectEventId].currentCoords.y); + objectEvent->graphicsId = graphicsId; objectEvent->invisible = TRUE; gSprites[objectEvent->spriteId].data[1] = 0; // set state gSprites[objectEvent->spriteId].data[6] = 0; // set graphicsId gSprites[objectEvent->spriteId].data[7] = 0; // set animation data } - objectEvent->graphicsId = graphicsId; return; } void RemoveFollowingPokemon(void) { - struct ObjectEvent *objectEvent = NULL; - u8 i; - for (i=0; i < OBJECT_EVENTS_COUNT; i++) { - if (gObjectEvents[i].localId == 0xFE) { - objectEvent = &gObjectEvents[i]; - break; - } - } + struct ObjectEvent *objectEvent = GetFollowerObject(); if (objectEvent == NULL) { return; } @@ -1676,6 +1674,34 @@ static bool8 IsFollowerVisible(void) { // Determine whether follower should be v return !TestPlayerAvatarFlags(PLAYER_AVATAR_FLAG_SURFING | PLAYER_AVATAR_FLAG_ACRO_BIKE | PLAYER_AVATAR_FLAG_MACH_BIKE); } +bool8 ScrFunc_getfolloweraction(struct ScriptContext *ctx) +{ + u16 value; + u16 species; + u32 behavior; + struct ObjectEvent *objEvent = &gObjectEvents[GetObjectEventIdByLocalIdAndMap(OBJ_EVENT_ID_FOLLOWER, gSaveBlock1Ptr->location.mapNum, gSaveBlock1Ptr->location.mapGroup)]; + struct Pokemon *follower = GetFirstLiveMon(); + if (follower == NULL) { + return FALSE; + } + behavior = MapGridGetMetatileBehaviorAt(objEvent->currentCoords.x, objEvent->currentCoords.y); + species = GetMonData(follower, MON_DATA_SPECIES); + if (MetatileBehavior_IsPuddle(behavior) || MetatileBehavior_IsShallowFlowingWater(behavior)) { + if (gBaseStats[species].type1 == TYPE_FIRE || gBaseStats[species].type2 == TYPE_FIRE) { + ScriptJump(ctx, EventScript_FollowerHasWetFeet); + return FALSE; + } else if (GetObjectEventGraphicsInfo(objEvent->graphicsId)->tracks) { // if follower leaves tracks + ScriptJump(ctx, EventScript_FollowerSplashesAbout); + return FALSE; + } + } + if (GetCurrentWeather() == WEATHER_RAIN || GetCurrentWeather() == WEATHER_RAIN_THUNDERSTORM) { + ScriptJump(ctx, EventScript_FollowerLovesYou); + } + ScriptJump(ctx, EventScript_FollowerLovesYou); + return FALSE; +} + void TrySpawnObjectEvents(s16 cameraX, s16 cameraY) { u8 i; @@ -4525,23 +4551,19 @@ bool8 CopyablePlayerMovement_Jump(struct ObjectEvent *objectEvent, struct Sprite movement_type_def(MovementType_FollowPlayer, gMovementTypeFuncs_FollowPlayer) -bool8 MovementType_FollowPlayer_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) +bool8 MovementType_FollowPlayer_Shadow(struct ObjectEvent *objectEvent, struct Sprite *sprite) { ClearObjectEventMovement(objectEvent, sprite); - if (sprite->data[6]) { // Restore graphicsId TODO: Change this hack - ObjectEventSetGraphicsId(objectEvent, sprite->data[6]); - sprite->data[6] = 0; - } if (!IsFollowerVisible()) { // Shadow player's position - objectEvent->invisible = TRUE; MoveObjectEventToMapCoords(objectEvent, gObjectEvents[gPlayerAvatar.objectEventId].currentCoords.x, gObjectEvents[gPlayerAvatar.objectEventId].currentCoords.y); return FALSE; } - sprite->data[1] = 1; + // __asm__(".2byte 0xBE00"); + sprite->data[1] = 1; // Enter idle state return TRUE; } -bool8 MovementType_FollowPlayer_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) +bool8 MovementType_FollowPlayer_Active(struct ObjectEvent *objectEvent, struct Sprite *sprite) { if (gObjectEvents[gPlayerAvatar.objectEventId].movementActionId == 0xFF || gPlayerAvatar.tileTransitionState == T_TILE_CENTER) { // do nothing if player is stationary return FALSE; @@ -4550,32 +4572,36 @@ bool8 MovementType_FollowPlayer_Step1(struct ObjectEvent *objectEvent, struct Sp return gFollowPlayerMovementFuncs[PlayerGetCopyableMovement()](objectEvent, sprite, GetPlayerMovementDirection(), NULL); } -bool8 MovementType_FollowPlayer_Step2(struct ObjectEvent *objectEvent, struct Sprite *sprite) +bool8 MovementType_FollowPlayer_Moving(struct ObjectEvent *objectEvent, struct Sprite *sprite) { if (ObjectEventExecSingleMovementAction(objectEvent, sprite)) { objectEvent->singleMovementActive = 0; - sprite->data[1] = 1; + if (sprite->data[1]) { // restore nonzero state + sprite->data[1] = 1; + } } - objectEvent->invisible = FALSE; return FALSE; } bool8 FollowablePlayerMovement_Idle(struct ObjectEvent *objectEvent, struct Sprite *sprite, u8 playerDirection, bool8 tileCallback(u8)) { u8 direction; - if (!IsFollowerVisible()) { // Animate entering pokeball - if (objectEvent->invisible) { + if (!IsFollowerVisible()) { + if (objectEvent->invisible) { // Return to shadowing state + sprite->data[1] = 0; return FALSE; } + // Animate entering pokeball ClearObjectEventMovement(objectEvent, sprite); ObjectEventSetSingleMovement(objectEvent, sprite, MOVEMENT_ACTION_ENTER_POKEBALL); objectEvent->singleMovementActive = 1; sprite->animCmdIndex = 0; // Needed because of weird animCmdIndex stuff - sprite->data[1] = 2; // movement action sets state to 0 later + sprite->data[1] = 2; // movement action sets state to 0 return TRUE; } else if (!objectEvent->singleMovementActive) { // walk in place ObjectEventSetSingleMovement(objectEvent, sprite, GetWalkInPlaceNormalMovementAction(objectEvent->facingDirection)); + sprite->data[1] = 1; objectEvent->singleMovementActive = 1; return TRUE; } else if (ObjectEventExecSingleMovementAction(objectEvent, sprite)) { // finish movement action @@ -6168,7 +6194,7 @@ static u8 LoadWhiteFlashPalette(struct ObjectEvent *objectEvent, struct Sprite * bool8 MovementAction_ExitPokeball_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { - + objectEvent->invisible = FALSE; if (TestPlayerAvatarFlags(PLAYER_AVATAR_FLAG_DASH)) { sub_8094554(objectEvent, sprite, DIR_SOUTH, GetMoveDirectionFastestAnimNum(DIR_NORTH), 8); sprite->data[7] = 0; // fast speed @@ -6214,13 +6240,9 @@ bool8 MovementAction_EnterPokeball_Step0(struct ObjectEvent *objectEvent, struct bool8 MovementAction_EnterPokeball_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) { sprite->data[3]--; - if (sprite->data[3] == 0) - { + if (sprite->data[3] == 0) { sprite->data[2] = 2; - sprite->animPaused = TRUE; - return TRUE; - } else if (sprite->data[3] == 1) { // Change state - sprite->data[1] = 0; + return FALSE; } else if (sprite->data[3] == 11) { // Set palette to white LoadWhiteFlashPalette(objectEvent, sprite); } else if (sprite->data[3] == 7) { // Free white palette and change to pokeball @@ -6230,6 +6252,16 @@ bool8 MovementAction_EnterPokeball_Step1(struct ObjectEvent *objectEvent, struct return FALSE; } +bool8 MovementAction_EnterPokeball_Step2(struct ObjectEvent *objectEvent, struct Sprite *sprite) +{ + ObjectEventSetGraphicsId(objectEvent, sprite->data[6]); + objectEvent->invisible = TRUE; + sprite->data[1] = 0; + sprite->data[6] = 0; + sprite->animPaused = TRUE; + return TRUE; +} + bool8 MovementAction_WalkInPlaceSlowUp_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { sub_8094554(objectEvent, sprite, DIR_NORTH, GetMoveDirectionAnimNum(DIR_NORTH), 32); @@ -8386,13 +8418,13 @@ static void (*const sGroundEffectTracksFuncs[])(struct ObjectEvent *objEvent, st void GroundEffect_SandTracks(struct ObjectEvent *objEvent, struct Sprite *sprite) { const struct ObjectEventGraphicsInfo *info = GetObjectEventGraphicsInfo(objEvent->graphicsId); - sGroundEffectTracksFuncs[info->tracks](objEvent, sprite, 0); + sGroundEffectTracksFuncs[objEvent->invisible ? TRACKS_NONE : info->tracks](objEvent, sprite, 0); } void GroundEffect_DeepSandTracks(struct ObjectEvent *objEvent, struct Sprite *sprite) { const struct ObjectEventGraphicsInfo *info = GetObjectEventGraphicsInfo(objEvent->graphicsId); - sGroundEffectTracksFuncs[info->tracks](objEvent, sprite, 1); + sGroundEffectTracksFuncs[objEvent->invisible ? TRACKS_NONE : info->tracks](objEvent, sprite, 1); } static void DoTracksGroundEffect_None(struct ObjectEvent *objEvent, struct Sprite *sprite, u8 a) diff --git a/src/scrcmd.c b/src/scrcmd.c index 825c3d0f87..537233abd8 100644 --- a/src/scrcmd.c +++ b/src/scrcmd.c @@ -15,6 +15,7 @@ #include "field_effect.h" #include "event_object_lock.h" #include "event_object_movement.h" +#include "event_scripts.h" #include "field_message_box.h" #include "field_player_avatar.h" #include "field_screen_effect.h" @@ -1003,9 +1004,27 @@ bool8 ScrCmd_applymovement(struct ScriptContext *ctx) { u16 localId = VarGet(ScriptReadHalfword(ctx)); const void *movementScript = (const void *)ScriptReadWord(ctx); + struct ObjectEvent *objEvent; + ScriptMovement_StartObjectMovementScript(localId, gSaveBlock1Ptr->location.mapNum, gSaveBlock1Ptr->location.mapGroup, movementScript); sMovingNpcId = localId; + if (localId != OBJ_EVENT_ID_FOLLOWER) { // Force follower into pokeball + objEvent = GetFollowerObject(); + // return early if no follower or in shadowing state + if (objEvent == NULL || gSprites[objEvent->spriteId].data[1] == 0) { + return FALSE; + } + // ClearEventObjectMovement( + objEvent->singleMovementActive = 0; + objEvent->heldMovementActive = FALSE; + objEvent->heldMovementFinished = FALSE; + objEvent->movementActionId = 0xFF; + gSprites[objEvent->spriteId].data[1] = 0; + // ) + gSprites[objEvent->spriteId].animCmdIndex = 0; // Needed because of weird animCmdIndex stuff + ScriptMovement_StartObjectMovementScript(OBJ_EVENT_ID_FOLLOWER, gSaveBlock1Ptr->location.mapNum, gSaveBlock1Ptr->location.mapGroup, EnterPokeballMovement); + } return FALSE; }