Merge branch 'romhack' into lighting

This commit is contained in:
Ariel A 2022-01-03 02:08:14 -05:00
commit 609a304890
5 changed files with 916 additions and 310 deletions

View File

@ -7,45 +7,9 @@ gText_FollowerLostInThought::
gText_FollowerDefault:: gText_FollowerDefault::
.string "ERROR 404: Script not found.$" .string "ERROR 404: Script not found.$"
gText_FollowerUnhappyToBeWet::
.string "{STR_VAR_1} looks unhappy to be wet.$"
gText_FollowerSplashesAround::
.string "{STR_VAR_1} splashes around happily!$"
gText_WantsToFly:: gText_WantsToFly::
.string "{STR_VAR_1} looks up at the\nsky restlessly.\pWould you like to use FLY?$" .string "{STR_VAR_1} looks up at the\nsky restlessly.\pWould you like to use FLY?$"
gText_FollowerUnhappyFace::
.string "{STR_VAR_1} is making an unhappy face...$"
gText_FollowerHappyRain::
.string "{STR_VAR_1} seems to be happy\nabout the rain!$"
gText_FollowerMetLocation::
.string "{STR_VAR_1} looks around fondly.\nIt seems familiar with this place.$"
gText_FollowerSkeptical::
.string "{STR_VAR_1} looks skeptical...\pWhat could it mean?$"
gText_FollowerAppraising::
.string "{STR_VAR_1} carefully follows behind.$"
gText_FollowerHappyWalk::
.string "{STR_VAR_1} skips happily behind you!$"
gText_FollowerAboutToFall::
.string "{STR_VAR_1} seems to be about\nto fall over!$"
gText_FollowerTryingToKeepUp::
.string "{STR_VAR_1} is trying very hard\nto keep up with you...$"
gText_FollowerIsShivering::
.string "{STR_VAR_1} is shivering.$"
gText_FollowerBurnPainful::
.string "{STR_VAR_1}'s burn looks painful!$'"
.macro playfirstmoncry .macro playfirstmoncry
callfunc ScrFunc_playfirstmoncry callfunc ScrFunc_playfirstmoncry
.endm .endm
@ -83,49 +47,6 @@ EventScript_FollowerEnd::
release release
end end
EventScript_FollowerHappyWalk::
msgbox gText_FollowerHappyWalk, MSGBOX_DEFAULT
waitmoncry
return
EventScript_FollowerAppraising::
msgbox gText_FollowerAppraising, MSGBOX_DEFAULT
waitmoncry
return
EventScript_FollowerSkeptical::
msgbox gText_FollowerSkeptical, MSGBOX_DEFAULT
waitmoncry
return
EventScript_FollowerMetLocation::
applymovement 0xFE Common_Movement_QuestionMark
waitmoncry
waitmovement 0xFE
msgbox gText_FollowerMetLocation, MSGBOX_DEFAULT
return
EventScript_FollowerUnhappyFace::
msgbox gText_FollowerUnhappyFace, MSGBOX_DEFAULT
waitmoncry
return
EventScript_FollowerHappyRain::
msgbox gText_FollowerHappyRain, MSGBOX_DEFAULT
waitmoncry
return
EventScript_FollowerUnhappyToBeWet::
msgbox gText_FollowerUnhappyToBeWet, MSGBOX_DEFAULT
waitmoncry
return
EventScript_FollowerSplashesAbout::
applymovement 0xFE FollowerSplashMovement
waitmovement 0xFE
msgbox gText_FollowerSplashesAround, MSGBOX_DEFAULT
return
EventScript_FollowerLovesYou:: EventScript_FollowerLovesYou::
applymovement 0xFE ContestHall_Movement_Heart applymovement 0xFE ContestHall_Movement_Heart
waitmovement 0xFE waitmovement 0xFE
@ -133,26 +54,6 @@ EventScript_FollowerLovesYou::
msgbox gText_FollowerLovesYou, MSGBOX_DEFAULT msgbox gText_FollowerLovesYou, MSGBOX_DEFAULT
return return
EventScript_FollowerAboutToFall::
msgbox gText_FollowerAboutToFall, MSGBOX_DEFAULT
waitmoncry
return
EventScript_FollowerTryingToKeepUp::
msgbox gText_FollowerTryingToKeepUp, MSGBOX_DEFAULT
waitmoncry
return
EventScript_FollowerIsShivering::
msgbox gText_FollowerIsShivering, MSGBOX_DEFAULT
waitmoncry
return
EventScript_FollowerBurnPainful::
msgbox gText_FollowerBurnPainful, MSGBOX_DEFAULT
waitmoncry
return
@ Message address must be loaded into bank 0 @ Message address must be loaded into bank 0
EventScript_FollowerGeneric:: @ similar to Std_MsgboxDefault EventScript_FollowerGeneric:: @ similar to Std_MsgboxDefault
waitfieldeffect FLDEFF_EMOTE waitfieldeffect FLDEFF_EMOTE
@ -174,9 +75,573 @@ EnterPokeballMovement::
.byte 0x9F @ EnterPokeball .byte 0x9F @ EnterPokeball
step_end step_end
FollowerSplashMovement:: @ defined in movement.inc @ Movement scripts below, movements are defined in movement.inc
FollowerSplashMovement::
jump_in_place_down jump_in_place_down
delay_4 delay_4
jump_in_place_down jump_in_place_down
face_player face_player
step_end step_end
FollowerShiverVerticalMovement:
lock_facing_direction
slide_left
slide_right
slide_right
slide_left
unlock_facing_direction
step_end
FollowerShiverHorizontalMovement:
lock_facing_direction
slide_up
slide_down
slide_down
slide_up
unlock_facing_direction
step_end
FollowerNostalgiaMovement:
face_away_player
lock_facing_direction
jump_in_place_down
jump_in_place_down
jump_in_place_down
unlock_facing_direction
face_player
lock_facing_direction
jump_in_place_down
unlock_facing_direction
step_end
FollowerSkippingMovement:
lock_facing_direction
jump_in_place_down
delay_4
jump_in_place_down
unlock_facing_direction
step_end
FollowerJumpOnPlayerNorth:
jump_up
delay_4
lock_facing_direction
walk_fast_down
unlock_facing_direction
step_end
FollowerJumpOnPlayerSouth:
jump_down
delay_4
lock_facing_direction
walk_fast_up
unlock_facing_direction
step_end
FollowerJumpOnPlayerEast:
jump_right
delay_4
lock_facing_direction
walk_fast_left
unlock_facing_direction
step_end
FollowerJumpOnPlayerWest:
jump_left
delay_4
lock_facing_direction
walk_fast_right
unlock_facing_direction
step_end
FollowerCuddlingNorth:
face_left
lock_facing_direction
walk_up
walk_in_place_left
walk_in_place_left
unlock_facing_direction
walk_down
face_player
step_end
FollowerCuddlingSouth:
face_right
lock_facing_direction
walk_down
walk_in_place_right
walk_in_place_right
unlock_facing_direction
walk_up
face_player
step_end
FollowerCuddlingEast:
face_down
lock_facing_direction
walk_right
walk_in_place_down
walk_in_place_down
unlock_facing_direction
walk_left
face_player
step_end
FollowerCuddlingWest:
face_down
lock_facing_direction
walk_left
walk_in_place_down
walk_in_place_down
unlock_facing_direction
walk_right
face_player
step_end
FollowerGetCloserNorth:
walk_up
delay_16
lock_facing_direction
walk_down
unlock_facing_direction
step_end
FollowerGetCloserSouth:
walk_down
delay_16
lock_facing_direction
walk_up
unlock_facing_direction
step_end
FollowerGetCloserEast:
walk_right
delay_16
lock_facing_direction
walk_left
unlock_facing_direction
step_end
FollowerGetCloserWest:
walk_left
delay_16
lock_facing_direction
walk_right
unlock_facing_direction
step_end
FollowerPokeNorth:
walk_faster_up
delay_8
lock_facing_direction
walk_faster_down
delay_4
walk_faster_up
delay_4
walk_faster_down
unlock_facing_direction
step_end
FollowerPokeSouth:
walk_faster_down
delay_8
lock_facing_direction
walk_faster_up
delay_4
walk_faster_down
delay_4
walk_faster_up
unlock_facing_direction
step_end
FollowerPokeEast:
walk_faster_right
delay_8
lock_facing_direction
walk_faster_left
delay_4
walk_faster_right
delay_4
walk_faster_left
unlock_facing_direction
step_end
FollowerPokeWest:
walk_faster_left
delay_8
lock_facing_direction
walk_faster_right
delay_4
walk_faster_left
delay_4
walk_faster_right
unlock_facing_direction
step_end
FollowerLookAround:
face_away_player
delay_16
delay_16
face_left
delay_16
delay_16
face_up
delay_16
delay_16
face_down
delay_16
delay_16
step_end
FollowerLookAway:
face_away_player
delay_16
delay_16
step_end
FollowerLookAwayBark:
face_away_player
lock_facing_direction
jump_in_place_down
jump_in_place_down
unlock_facing_direction
step_end
FollowerLookAwayPokeG:
face_away_player
lock_facing_direction
walk_in_place_down
walk_in_place_down
walk_in_place_down
unlock_facing_direction
step_end
FollowerPokeGround:
lock_facing_direction
walk_in_place_down
walk_in_place_down
walk_in_place_down
unlock_facing_direction
step_end
FollowerStartled:
face_away_player
lock_facing_direction
jump_in_place_down
unlock_facing_direction
face_player
step_end
FollowerHopFast:
jump_in_place_up
jump_in_place_down
jump_in_place_left
jump_in_place_right
face_player
step_end
FollowerDizzy:
walk_in_place_left
walk_in_place_fast_right
walk_in_place_slow_up
walk_in_place_fast_down
delay_4
face_away_player
step_end
FollowerLookAroundScared:
face_up
delay_16
face_down
delay_16
face_left
delay_16
face_right
delay_16
face_up
delay_16
face_down
delay_16
face_left
delay_16
face_right
delay_16
face_player
step_end
FollowerDance:
lock_facing_direction
jump_in_place_up
unlock_facing_direction
walk_in_place_faster_up
walk_in_place_faster_left
walk_in_place_faster_down
walk_in_place_faster_right
walk_in_place_faster_up
walk_in_place_faster_left
walk_in_place_faster_down
walk_in_place_faster_right
walk_in_place_faster_up
walk_in_place_faster_left
walk_in_place_faster_down
walk_in_place_faster_right
walk_in_place_faster_up
walk_in_place_faster_left
walk_in_place_faster_down
walk_in_place_faster_right
walk_in_place_faster_up
walk_in_place_faster_left
walk_in_place_faster_down
walk_in_place_faster_right
jump_in_place_up
jump_in_place_down
jump_in_place_up
face_player
step_end
@ Movement scripts
EventScript_FollowerIsShivering::
compare VAR_FACING, DIR_NORTH
call_if_eq ShiverVertical
compare VAR_FACING, DIR_SOUTH
call_if_eq ShiverVertical
compare VAR_FACING, DIR_WEST
call_if_eq ShiverHorizontal
compare VAR_FACING, DIR_EAST
call_if_eq ShiverHorizontal
goto EventScript_FollowerGeneric
ShiverVertical:
applymovement 0xFE FollowerShiverVerticalMovement
waitmovement 0xFE
return
ShiverHorizontal:
applymovement 0xFE FollowerShiverHorizontalMovement
waitmovement 0xFE
return
EventScript_FollowerNostalgia::
applymovement 0xFE FollowerNostalgiaMovement
waitmovement 0xFE
goto EventScript_FollowerGeneric
EventScript_FollowerHopping::
applymovement 0xFE FollowerSkippingMovement
waitmovement 0xFE
goto EventScript_FollowerGeneric
JumpOnN:
applymovement 0xFE FollowerJumpOnPlayerNorth
waitmovement 0xFE
return
JumpOnS:
applymovement 0xFE FollowerJumpOnPlayerSouth
waitmovement 0xFE
return
JumpOnE:
applymovement 0xFE FollowerJumpOnPlayerEast
waitmovement 0xFE
return
JumpOnW:
applymovement 0xFE FollowerJumpOnPlayerWest
waitmovement 0xFE
return
EventScript_FollowerJumpOnPlayer::
compare VAR_FACING, DIR_NORTH
call_if_eq JumpOnS
compare VAR_FACING, DIR_SOUTH
call_if_eq JumpOnN
compare VAR_FACING, DIR_WEST
call_if_eq JumpOnE
compare VAR_FACING, DIR_EAST
call_if_eq JumpOnW
goto EventScript_FollowerGeneric
CuddleN:
applymovement 0xFE FollowerCuddlingNorth
waitmovement 0xFE
return
CuddleS:
applymovement 0xFE FollowerCuddlingSouth
waitmovement 0xFE
return
CuddleE:
applymovement 0xFE FollowerCuddlingEast
waitmovement 0xFE
return
CuddleW:
applymovement 0xFE FollowerCuddlingWest
waitmovement 0xFE
return
EventScript_FollowerCuddling:: @ similar to Std_MsgboxDefault
compare VAR_FACING, DIR_NORTH
call_if_eq CuddleS
compare VAR_FACING, DIR_SOUTH
call_if_eq CuddleN
compare VAR_FACING, DIR_WEST
call_if_eq CuddleE
compare VAR_FACING, DIR_EAST
call_if_eq CuddleW
goto EventScript_FollowerGeneric
ShCuddleN:
applymovement 0xFE FollowerShiverVerticalMovement
waitmovement 0xFE
applymovement 0xFE FollowerCuddlingNorth
waitmovement 0xFE
return
ShCuddleS:
applymovement 0xFE FollowerShiverVerticalMovement
waitmovement 0xFE
applymovement 0xFE FollowerCuddlingSouth
waitmovement 0xFE
return
ShCuddleE:
applymovement 0xFE FollowerShiverHorizontalMovement
waitmovement 0xFE
applymovement 0xFE FollowerCuddlingEast
waitmovement 0xFE
return
ShCuddleW:
applymovement 0xFE FollowerShiverHorizontalMovement
waitmovement 0xFE
applymovement 0xFE FollowerCuddlingWest
waitmovement 0xFE
return
EventScript_FollowerShiverCuddling::
compare VAR_FACING, DIR_NORTH
call_if_eq ShCuddleS
compare VAR_FACING, DIR_SOUTH
call_if_eq ShCuddleN
compare VAR_FACING, DIR_WEST
call_if_eq ShCuddleE
compare VAR_FACING, DIR_EAST
call_if_eq ShCuddleW
goto EventScript_FollowerGeneric
CreepCloserN:
applymovement 0xFE FollowerGetCloserNorth
waitmovement 0xFE
return
CreepCloserS:
applymovement 0xFE FollowerGetCloserSouth
waitmovement 0xFE
return
CreepCloserE:
applymovement 0xFE FollowerGetCloserEast
waitmovement 0xFE
return
CreepCloserW:
applymovement 0xFE FollowerGetCloserWest
waitmovement 0xFE
return
EventScript_FollowerGetCloser::
compare VAR_FACING, DIR_NORTH
call_if_eq CreepCloserS
compare VAR_FACING, DIR_SOUTH
call_if_eq CreepCloserN
compare VAR_FACING, DIR_WEST
call_if_eq CreepCloserE
compare VAR_FACING, DIR_EAST
call_if_eq CreepCloserW
goto EventScript_FollowerGeneric
PokePlayerN:
applymovement 0xFE FollowerGetCloserNorth
waitmovement 0xFE
return
PokePlayerS:
applymovement 0xFE FollowerGetCloserSouth
waitmovement 0xFE
return
PokePlayerE:
applymovement 0xFE FollowerGetCloserEast
waitmovement 0xFE
return
PokePlayerW:
applymovement 0xFE FollowerGetCloserWest
waitmovement 0xFE
return
EventScript_FollowerPokingPlayer::
compare VAR_FACING, DIR_NORTH
call_if_eq PokePlayerS
compare VAR_FACING, DIR_SOUTH
call_if_eq PokePlayerN
compare VAR_FACING, DIR_WEST
call_if_eq PokePlayerE
compare VAR_FACING, DIR_EAST
call_if_eq PokePlayerW
goto EventScript_FollowerGeneric
EventScript_FollowerLookAround::
applymovement 0xFE FollowerLookAround
waitmovement 0xFE
goto EventScript_FollowerGeneric
EventScript_FollowerLookAway::
applymovement 0xFE FollowerLookAway
waitmovement 0xFE
goto EventScript_FollowerGeneric
EventScript_FollowerLookAwayBark::
applymovement 0xFE FollowerLookAwayBark
waitmovement 0xFE
goto EventScript_FollowerGeneric
EventScript_FollowerLookAwayPoke::
applymovement 0xFE FollowerLookAwayPokeG
waitmovement 0xFE
goto EventScript_FollowerGeneric
EventScript_FollowerPokeGround::
applymovement 0xFE FollowerPokeGround
waitmovement 0xFE
goto EventScript_FollowerGeneric
EventScript_FollowerStartled::
applymovement 0xFE FollowerStartled
waitmovement 0xFE
goto EventScript_FollowerGeneric
EventScript_FollowerFastHopping::
applymovement 0xFE FollowerHopFast
waitmovement 0xFE
goto EventScript_FollowerGeneric
EventScript_FollowerDizzy::
applymovement 0xFE FollowerDizzy
waitmovement 0
goto EventScript_FollowerGeneric
EventScript_FollowerLookAroundScared::
applymovement 0xFE FollowerLookAroundScared
waitmovement 0xFE
goto EventScript_FollowerGeneric
EventScript_FollowerDance::
applymovement 0xFE FollowerDance
waitmovement 0
goto EventScript_FollowerGeneric

View File

@ -5,7 +5,7 @@
#define SPECIES_SHINY_TAG 500 #define SPECIES_SHINY_TAG 500
#define N_FOLLOWER_HAPPY_MESSAGES 31 #define N_FOLLOWER_HAPPY_MESSAGES 31
#define N_FOLLOWER_NEUTRAL_MESSAGES 15 #define N_FOLLOWER_NEUTRAL_MESSAGES 14
#define N_FOLLOWER_SAD_MESSAGES 3 #define N_FOLLOWER_SAD_MESSAGES 3
#define N_FOLLOWER_UPSET_MESSAGES 3 #define N_FOLLOWER_UPSET_MESSAGES 3
#define N_FOLLOWER_ANGRY_MESSAGES 5 #define N_FOLLOWER_ANGRY_MESSAGES 5
@ -13,7 +13,7 @@
#define N_FOLLOWER_LOVE_MESSAGES 10 #define N_FOLLOWER_LOVE_MESSAGES 10
#define N_FOLLOWER_SURPRISE_MESSAGES 20 #define N_FOLLOWER_SURPRISE_MESSAGES 20
#define N_FOLLOWER_CURIOUS_MESSAGES 7 #define N_FOLLOWER_CURIOUS_MESSAGES 7
#define N_FOLLOWER_MUSIC_MESSAGES 15 #define N_FOLLOWER_MUSIC_MESSAGES 14
#define N_FOLLOWER_POISONED_MESSAGES 1 #define N_FOLLOWER_POISONED_MESSAGES 1
#define MAX_TRAINER_ITEMS 4 #define MAX_TRAINER_ITEMS 4
@ -92,13 +92,19 @@ struct Trainer
#define TRAINER_ENCOUNTER_MUSIC(trainer)((gTrainers[trainer].encounterMusic_gender & 0x7F)) #define TRAINER_ENCOUNTER_MUSIC(trainer)((gTrainers[trainer].encounterMusic_gender & 0x7F))
struct FollowerMsgInfo {
const u8 *text;
const u8 *script;
};
struct FollowerMessagePool struct FollowerMessagePool
{ {
const char * const * messages; const struct FollowerMsgInfo * messages;
const u8 * script; const u8 * script;
u16 length; u16 length;
}; };
extern const u16 gMinigameDigits_Pal[]; extern const u16 gMinigameDigits_Pal[];
extern const u32 gMinigameDigits_Gfx[]; extern const u32 gMinigameDigits_Gfx[];
@ -146,16 +152,16 @@ extern const u8 gSpeciesNames[][POKEMON_NAME_LENGTH + 1];
extern const u8 gMoveNames[MOVES_COUNT][MOVE_NAME_LENGTH + 1]; extern const u8 gMoveNames[MOVES_COUNT][MOVE_NAME_LENGTH + 1];
// Follower text messages // Follower text messages
extern const char * const gFollowerHappyMessages[]; extern const struct FollowerMsgInfo gFollowerHappyMessages[];
extern const char * const gFollowerNeutralMessages[]; extern const struct FollowerMsgInfo gFollowerNeutralMessages[];
extern const char * const gFollowerSadMessages[]; extern const struct FollowerMsgInfo gFollowerSadMessages[];
extern const char * const gFollowerUpsetMessages[]; extern const struct FollowerMsgInfo gFollowerUpsetMessages[];
extern const char * const gFollowerAngryMessages[]; extern const struct FollowerMsgInfo gFollowerAngryMessages[];
extern const char * const gFollowerPensiveMessages[]; extern const struct FollowerMsgInfo gFollowerPensiveMessages[];
extern const char * const gFollowerLoveMessages[]; extern const struct FollowerMsgInfo gFollowerLoveMessages[];
extern const char * const gFollowerSurpriseMessages[]; extern const struct FollowerMsgInfo gFollowerSurpriseMessages[];
extern const char * const gFollowerCuriousMessages[]; extern const struct FollowerMsgInfo gFollowerCuriousMessages[];
extern const char * const gFollowerMusicMessages[]; extern const struct FollowerMsgInfo gFollowerMusicMessages[];
extern const char * const gFollowerPoisonedMessages[]; extern const struct FollowerMsgInfo gFollowerPoisonedMessages[];
#endif // GUARD_DATA_H #endif // GUARD_DATA_H

View File

@ -2,22 +2,28 @@
#define GUARD_EVENT_SCRIPTS_H #define GUARD_EVENT_SCRIPTS_H
extern const u8 EventScript_Follower[]; extern const u8 EventScript_Follower[];
extern const u8 EventScript_FollowerUnhappyToBeWet[];
extern const u8 EventScript_FollowerSplashesAbout[];
extern const u8 EventScript_FollowerLovesYou[];
extern const u8 EventScript_FollowerUnhappyFace[];
extern const u8 EventScript_FollowerHappyRain[];
extern const u8 EventScript_FollowerMetLocation[];
extern const u8 EventScript_FollowerEnd[]; extern const u8 EventScript_FollowerEnd[];
extern const u8 EventScript_FollowerSkeptical[];
extern const u8 EventScript_FollowerAppraising[];
extern const u8 EventScript_FollowerHappyWalk[];
extern const u8 EventScript_FollowerAboutToFall[];
extern const u8 EventScript_FollowerTryingToKeepUp[];
extern const u8 EventScript_FollowerIsShivering[];
extern const u8 EventScript_FollowerBurnPainful[];
extern const u8 EventScript_FollowerGeneric[]; extern const u8 EventScript_FollowerGeneric[];
extern const u8 EventScript_FollowerLove[]; extern const u8 EventScript_FollowerLovesYou[];
extern const u8 EventScript_FollowerIsShivering[];
extern const u8 EventScript_FollowerNostalgia[];
extern const u8 EventScript_FollowerHopping[];
extern const u8 EventScript_FollowerJumpOnPlayer[];
extern const u8 EventScript_FollowerCuddling[];
extern const u8 EventScript_FollowerShiverCuddling[];
extern const u8 EventScript_FollowerGetCloser[];
extern const u8 EventScript_FollowerPokingPlayer[];
extern const u8 EventScript_FollowerLookAround[];
extern const u8 EventScript_FollowerLookAway[];
extern const u8 EventScript_FollowerLookAwayBark[];
extern const u8 EventScript_FollowerLookAwayPoke[];
extern const u8 EventScript_FollowerPokeGround[];
extern const u8 EventScript_FollowerStartled[];
extern const u8 EventScript_FollowerFastHopping[];
extern const u8 EventScript_FollowerDizzy[];
extern const u8 EventScript_FollowerLookAroundScared[];
extern const u8 EventScript_FollowerDance[];
extern const u8 EnterPokeballMovement[]; extern const u8 EnterPokeballMovement[];
extern const u8 EventScript_TestSignpostMsg[]; extern const u8 EventScript_TestSignpostMsg[];

View File

@ -1,183 +1,298 @@
extern const u8 EventScript_FollowerIsShivering[];
extern const u8 EventScript_FollowerNostalgia[];
extern const u8 EventScript_FollowerHopping[];
extern const u8 EventScript_FollowerJumpOnPlayer[];
extern const u8 EventScript_FollowerCuddling[];
extern const u8 EventScript_FollowerShiverCuddling[];
extern const u8 EventScript_FollowerGetCloser[];
extern const u8 EventScript_FollowerPokingPlayer[];
extern const u8 EventScript_FollowerLookAround[];
extern const u8 EventScript_FollowerLookAway[];
extern const u8 EventScript_FollowerLookAwayBark[];
extern const u8 EventScript_FollowerLookAwayPoke[];
extern const u8 EventScript_FollowerPokeGround[];
extern const u8 EventScript_FollowerStartled[];
extern const u8 EventScript_FollowerFastHopping[];
extern const u8 EventScript_FollowerDizzy[];
extern const u8 EventScript_FollowerLookAroundScared[];
extern const u8 EventScript_FollowerDance[];
// 'Generic', unconditional happy messages // 'Generic', unconditional happy messages
const char * const gFollowerHappyMessages[] = { static const u8 sHappyMsg00[] = _("{STR_VAR_1} began poking you in the\nstomach.");
(const char []) _("{STR_VAR_1} began poking you in the\nstomach."), static const u8 sHappyMsg01[] = _("{STR_VAR_1} is happy but shy.");
(const char []) _("{STR_VAR_1} is happy but shy."), static const u8 sHappyMsg02[] = _("{STR_VAR_1} is coming along happily.");
(const char []) _("{STR_VAR_1} is coming along happily."), static const u8 sHappyMsg03[] = _("{STR_VAR_1} is composed.");
(const char []) _("{STR_VAR_1} is composed."), static const u8 sHappyMsg04[] = _("{STR_VAR_1} seems to be feeling\ngreat about walking with you!");
(const char []) _("{STR_VAR_1} seems to be feeling\ngreat about walking with you!"), static const u8 sHappyMsg05[] = _("{STR_VAR_1} is glowing with health.");
(const char []) _("{STR_VAR_1} is glowing with health."), static const u8 sHappyMsg06[] = _("{STR_VAR_1} looks very happy.");
(const char []) _("{STR_VAR_1} looks very happy."), static const u8 sHappyMsg07[] = _("{STR_VAR_1} put in extra effort.");
(const char []) _("{STR_VAR_1} put in extra effort."), static const u8 sHappyMsg08[] = _("{STR_VAR_1} is smelling the scents\nof the surrounding air.");
(const char []) _("{STR_VAR_1} is smelling the scents\nof the surrounding air."), static const u8 sHappyMsg09[] = _("{STR_VAR_1} is jumping for joy!");
(const char []) _("{STR_VAR_1} is jumping for joy!"), static const u8 sHappyMsg10[] = _("{STR_VAR_1} is still feeling great!");
(const char []) _("{STR_VAR_1} is still feeling great!"), static const u8 sHappyMsg11[] = _("Your pokemon has caught the scent of\nsmoke.");
(const char []) _("Your pokemon has caught the scent of\nsmoke."), static const u8 sHappyMsg12[] = _("{STR_VAR_1} is poking at your belly.");
(const char []) _("{STR_VAR_1} is poking at your belly."), static const u8 sHappyMsg13[] = _("Your pokemon stretched out its body\nand is relaxing.");
(const char []) _("Your pokemon stretched out its body\nand is relaxing."), static const u8 sHappyMsg14[] = _("{STR_VAR_1} looks like it wants to\nlead!");
(const char []) _("{STR_VAR_1} looks like it wants to\nlead!"), static const u8 sHappyMsg15[] = _("{STR_VAR_1} is doing it's best to\nkeep up with you.");
(const char []) _("{STR_VAR_1} is doing it's best to\nkeep up with you."), static const u8 sHappyMsg16[] = _("{STR_VAR_1} is happily cuddling up\nto you!");
(const char []) _("{STR_VAR_1} is happily cuddling up\nto you!"), static const u8 sHappyMsg17[] = _("{STR_VAR_1} is full of life!");
(const char []) _("{STR_VAR_1} is full of life!"), static const u8 sHappyMsg18[] = _("{STR_VAR_1} seems to be very happy!");
(const char []) _("{STR_VAR_1} seems to be very happy!"), static const u8 sHappyMsg19[] = _("{STR_VAR_1} is so happy that it\ncan't stand still!");
(const char []) _("{STR_VAR_1} is so happy that it\ncan't stand still!"), static const u8 sHappyMsg20[] = _("{STR_VAR_1} nodded slowly.");
(const char []) _("{STR_VAR_1} nodded slowly."), static const u8 sHappyMsg21[] = _("{STR_VAR_1} is very eager!");
(const char []) _("{STR_VAR_1} is very eager!"), static const u8 sHappyMsg22[] = _("{STR_VAR_1} is wandering around and\nlistening to the different sounds.");
(const char []) _("{STR_VAR_1} is wandering around and\nlistening to the different sounds."), static const u8 sHappyMsg23[] = _("{STR_VAR_1} looks very interested.");
(const char []) _("{STR_VAR_1} looks very interested."), static const u8 sHappyMsg24[] = _("{STR_VAR_1} is somehow forcing\nitself to keep going.");
(const char []) _("{STR_VAR_1} is somehow forcing\nitself to keep going."), static const u8 sHappyMsg25[] = _("{STR_VAR_1} gave you a sunny look!");
(const char []) _("{STR_VAR_1} gave you a sunny look!"), static const u8 sHappyMsg26[] = _("{STR_VAR_1} gives you a happy look\nand a smile.");
(const char []) _("{STR_VAR_1} gives you a happy look\nand a smile."), static const u8 sHappyMsg27[] = _("Your pokemon is smelling the scent\nof flowers.");
(const char []) _("Your pokemon is smelling the scent\nof flowers."), static const u8 sHappyMsg28[] = _("{STR_VAR_1} seems very happy to see\nyou!");
(const char []) _("{STR_VAR_1} seems very happy to see\nyou!"), static const u8 sHappyMsg29[] = _("{STR_VAR_1} faced this way and\ngrinned.");
(const char []) _("{STR_VAR_1} faced this way and\ngrinned."), static const u8 sHappyMsg30[] = _("{STR_VAR_1} happily cuddled up to\nyou!");
(const char []) _("{STR_VAR_1} happily cuddled up to\nyou!"),
// Conditional messages begin here, index 31 // Conditional messages begin here, index 31
(const char []) _("Your pokemon seems happy about the\ngreat weather."), static const u8 sHappyMsg31[] = _("Your pokemon seems happy about the\ngreat weather.");
const struct FollowerMsgInfo gFollowerHappyMessages[] = {
{sHappyMsg00, EventScript_FollowerPokingPlayer},
{sHappyMsg01}, {sHappyMsg02}, {sHappyMsg03}, {sHappyMsg04}, {sHappyMsg05}, {sHappyMsg06}, {sHappyMsg07},
{sHappyMsg08, EventScript_FollowerLookAround},
{sHappyMsg09, EventScript_FollowerHopping},
{sHappyMsg10}, {sHappyMsg11},
{sHappyMsg12, EventScript_FollowerPokingPlayer},
{sHappyMsg13, EventScript_FollowerLookAround},
{sHappyMsg14}, {sHappyMsg15},
{sHappyMsg16, EventScript_FollowerCuddling},
{sHappyMsg17}, {sHappyMsg18},
{sHappyMsg19, EventScript_FollowerFastHopping},
{sHappyMsg20}, {sHappyMsg21}, {sHappyMsg22}, {sHappyMsg23}, {sHappyMsg24}, {sHappyMsg25}, {sHappyMsg26}, {sHappyMsg27}, {sHappyMsg28}, {sHappyMsg29},
{sHappyMsg30, EventScript_FollowerCuddling},
{sHappyMsg31},
}; };
// Unconditional neutral messages // Unconditional neutral messages
const char * const gFollowerNeutralMessages[] = { static const u8 sNeutralMsg00[] = _("{STR_VAR_1} is steadily poking at\nthe ground.");
(const char []) _("{STR_VAR_1} is steadily poking at\nthe ground."), static const u8 sNeutralMsg01[] = _("{STR_VAR_1} is standing guard.");
(const char []) _("{STR_VAR_1} is standing guard."), static const u8 sNeutralMsg02[] = _("{STR_VAR_1} is staring patiently at\nnothing at all.");
(const char []) _("{STR_VAR_1} is staring patiently at\nnothing at all."), static const u8 sNeutralMsg03[] = _("{STR_VAR_1} is wandering around.");
(const char []) _("{STR_VAR_1} is wandering around."), static const u8 sNeutralMsg04[] = _("Your pokemon yawned loudly!");
(const char []) _("Your pokemon yawned loudly!"), static const u8 sNeutralMsg05[] = _("Your pokemon is looking around\nrestlessly.");
(const char []) _("Your pokemon is looking around\nrestlessly."), static const u8 sNeutralMsg06[] = _("{STR_VAR_1} is looking this way and\nsmiling.");
(const char []) _("{STR_VAR_1} is steadily poking at\nthe ground."), static const u8 sNeutralMsg07[] = _("{STR_VAR_1} is gazing around\nrestlessly.");
(const char []) _("{STR_VAR_1} is looking this way and\nsmiling."), static const u8 sNeutralMsg08[] = _("{STR_VAR_1} let out a battle cry.");
(const char []) _("{STR_VAR_1} is gazing around\nrestlessly."), static const u8 sNeutralMsg09[] = _("{STR_VAR_1} danced a wonderful\ndance!");
(const char []) _("{STR_VAR_1} let out a battle cry."), static const u8 sNeutralMsg10[] = _("{STR_VAR_1} is very eager.");
(const char []) _("{STR_VAR_1} danced a wonderful\ndance!"), static const u8 sNeutralMsg11[] = _("{STR_VAR_1} is staring intently into\nthe distance.");
(const char []) _("{STR_VAR_1} is very eager."), static const u8 sNeutralMsg12[] = _("{STR_VAR_1} is on the lookout!");
(const char []) _("{STR_VAR_1} is staring intently into\nthe distance."), static const u8 sNeutralMsg13[] = _("{STR_VAR_1} looked off into the\ndistance and barked!");
(const char []) _("{STR_VAR_1} is on the lookout!"),
(const char []) _("{STR_VAR_1} looked off into the\ndistance and barked!"), const struct FollowerMsgInfo gFollowerNeutralMessages[] = {
{sNeutralMsg00, EventScript_FollowerPokeGround},
{sNeutralMsg01},
{sNeutralMsg02, EventScript_FollowerLookAway},
{sNeutralMsg03, EventScript_FollowerLookAround},
{sNeutralMsg04},
{sNeutralMsg05, EventScript_FollowerLookAround},
{sNeutralMsg06}, {sNeutralMsg07}, {sNeutralMsg08},
{sNeutralMsg09, EventScript_FollowerDance},
{sNeutralMsg10},
{sNeutralMsg11, EventScript_FollowerLookAway},
{sNeutralMsg12},
{sNeutralMsg13, EventScript_FollowerLookAwayBark},
}; };
// Unconditional sad messages // Unconditional sad messages
const char * const gFollowerSadMessages[] = { static const u8 sSadMsg00[] = _("{STR_VAR_1} is dizzy.");
(const char []) _("{STR_VAR_1} is dizzy."), static const u8 sSadMsg01[] = _("{STR_VAR_1} is stepping on your\nfeet!");
(const char []) _("{STR_VAR_1} is stepping on your\nfeet!"), static const u8 sSadMsg02[] = _("{STR_VAR_1} seems a little tired.");
(const char []) _("{STR_VAR_1} seems a little tired."),
// Conditional messages begin, index 3 // Conditional messages begin, index 3
(const char []) _("{STR_VAR_1} is not happy."), static const u8 sSadMsg03[] = _("{STR_VAR_1} is not happy.");
(const char []) _("{STR_VAR_1} is going to fall down!\n"), static const u8 sSadMsg04[] = _("{STR_VAR_1} is going to fall down!\n");
(const char []) _("{STR_VAR_1} seems to be about to\nfall over!"), static const u8 sSadMsg05[] = _("{STR_VAR_1} seems to be about to\nfall over!");
(const char []) _("{STR_VAR_1} is trying very hard to\nkeep up with you..."), static const u8 sSadMsg06[] = _("{STR_VAR_1} is trying very hard to\nkeep up with you...");
const struct FollowerMsgInfo gFollowerSadMessages[] = {
{sSadMsg00, EventScript_FollowerDizzy},
{sSadMsg01}, {sSadMsg02},
{sSadMsg03}, {sSadMsg04}, {sSadMsg05}, {sSadMsg06},
}; };
// Unconditional upset messages // Unconditional upset messages
const char * const gFollowerUpsetMessages[] = { static const u8 sUpsetMsg00[] = _("{STR_VAR_1} seems unhappy somehow...");
(const char []) _("{STR_VAR_1} seems unhappy somehow..."), static const u8 sUpsetMsg01[] = _("{STR_VAR_1} is making an unhappy\nface.");
(const char []) _("{STR_VAR_1} is making an unhappy\nface."), static const u8 sUpsetMsg02[] = _(".....Your pokemon seems a little\ncold.");
(const char []) _(".....Your pokemon seems a little\ncold."),
// Conditional messages, index 3 // Conditional messages, index 3
(const char []) _("{STR_VAR_1} is taking shelter in the\ngrass from the rain."), static const u8 sUpsetMsg03[] = _("{STR_VAR_1} is taking shelter in the\ngrass from the rain.");
const struct FollowerMsgInfo gFollowerUpsetMessages[] = {
{sUpsetMsg00}, {sUpsetMsg01},
{sUpsetMsg02, EventScript_FollowerIsShivering},
{sUpsetMsg03},
}; };
// Unconditional angry messages // Unconditional angry messages
const char * const gFollowerAngryMessages[] = { static const u8 sAngryMsg00[] = _("{STR_VAR_1} let out a roar!");
(const char []) _("{STR_VAR_1} let out a roar!"), static const u8 sAngryMsg01[] = _("{STR_VAR_1} is making a face like\nits angry!");
(const char []) _("{STR_VAR_1} is making a face like\nits angry!"), static const u8 sAngryMsg02[] = _("{STR_VAR_1} seems to be angry for\nsome reason.");
(const char []) _("{STR_VAR_1} seems to be angry for\nsome reason."), static const u8 sAngryMsg03[] = _("Your pokemon turned to face the\nother way, showing a defiant\pexpression.");
(const char []) _("Your pokemon turned to face the\nother way, showing a defiant\pexpression."), static const u8 sAngryMsg04[] = _("{STR_VAR_1} cried out.");
(const char []) _("{STR_VAR_1} cried out."),
const struct FollowerMsgInfo gFollowerAngryMessages[] = {
{sAngryMsg00}, {sAngryMsg01}, {sAngryMsg02},
{sAngryMsg03, EventScript_FollowerLookAway},
{sAngryMsg04},
}; };
// Unconditional pensive messages // Unconditional pensive messages
const char * const gFollowerPensiveMessages[] = { static const u8 sPensiveMsg00[] = _("{STR_VAR_1} is looking down\nsteadily.");
(const char []) _("{STR_VAR_1} is looking down\nsteadily."), static const u8 sPensiveMsg01[] = _("{STR_VAR_1} is surveying the area.");
(const char []) _("{STR_VAR_1} is surveying the area."), static const u8 sPensiveMsg02[] = _("{STR_VAR_1} is peering down.");
(const char []) _("{STR_VAR_1} is peering down."), static const u8 sPensiveMsg03[] = _("{STR_VAR_1} is somehow fighting off\nsleep...");
(const char []) _("{STR_VAR_1} is somehow fighting off\nsleep..."), static const u8 sPensiveMsg04[] = _("{STR_VAR_1} seems to be wandering\naround.");
(const char []) _("{STR_VAR_1} seems to be wandering\naround."), static const u8 sPensiveMsg05[] = _("{STR_VAR_1} is looking around\nabsentmindedly.");
(const char []) _("{STR_VAR_1} is looking around\nabsentmindedly."), static const u8 sPensiveMsg06[] = _("{STR_VAR_1} yawned very loudly!");
(const char []) _("{STR_VAR_1} yawned very loudly!"), static const u8 sPensiveMsg07[] = _("{STR_VAR_1} is relaxing comfortably.");
(const char []) _("{STR_VAR_1} is relaxing comfortably."), static const u8 sPensiveMsg08[] = _("{STR_VAR_1} is staring steadfastly\nat your face.");
(const char []) _("{STR_VAR_1} is staring steadfastly\nat your face."), static const u8 sPensiveMsg09[] = _("{STR_VAR_1} is staring intently at\nyour face.");
(const char []) _("{STR_VAR_1} is staring intently at\nyour face."), static const u8 sPensiveMsg10[] = _("{STR_VAR_1} is focusing its\nattention on you.");
(const char []) _("{STR_VAR_1} is focusing its\nattention on you."), static const u8 sPensiveMsg11[] = _("{STR_VAR_1} is staring into the\ndepths.");
(const char []) _("{STR_VAR_1} is staring into the\ndepths."), static const u8 sPensiveMsg12[] = _("{STR_VAR_1} is sniffing at the\nground.");
(const char []) _("{STR_VAR_1} is sniffing at the\nground."), static const u8 sPensiveMsg13[] = _("Your pokemon is staring intently at\nnothing.");
(const char []) _("Your pokemon is staring intently at\nnothing."), static const u8 sPensiveMsg14[] = _("{STR_VAR_1} focused with a sharp\ngaze!");
(const char []) _("{STR_VAR_1} focused with a sharp\ngaze!"), static const u8 sPensiveMsg15[] = _("{STR_VAR_1} is concentrating.");
(const char []) _("{STR_VAR_1} is concentrating."), static const u8 sPensiveMsg16[] = _("{STR_VAR_1} faced this way and\nnodded.");
(const char []) _("{STR_VAR_1} faced this way and\nnodded."), static const u8 sPensiveMsg17[] = _("{STR_VAR_1} seems a bit nervous...");
(const char []) _("{STR_VAR_1} seems a bit nervous..."), static const u8 sPensiveMsg18[] = _("{STR_VAR_1} is looking at your\nfootprints.");
(const char []) _("{STR_VAR_1} is looking at your\nfootprints."), static const u8 sPensiveMsg19[] = _("{STR_VAR_1} is staring straight into\nyour eyes.");
(const char []) _("{STR_VAR_1} is staring straight into\nyour eyes."),
const struct FollowerMsgInfo gFollowerPensiveMessages[] = {
{sPensiveMsg00},
{sPensiveMsg01, EventScript_FollowerLookAround},
{sPensiveMsg02}, {sPensiveMsg03}, {sPensiveMsg04},
{sPensiveMsg05, EventScript_FollowerLookAround},
{sPensiveMsg06}, {sPensiveMsg07}, {sPensiveMsg08}, {sPensiveMsg09}, {sPensiveMsg10},
{sPensiveMsg11, EventScript_FollowerLookAway},
{sPensiveMsg12, EventScript_FollowerPokeGround},
{sPensiveMsg13, EventScript_FollowerLookAway},
{sPensiveMsg14}, {sPensiveMsg15}, {sPensiveMsg16}, {sPensiveMsg17}, {sPensiveMsg18}, {sPensiveMsg19},
}; };
// All 'love' messages are unconditional // All 'love' messages are unconditional
const char * const gFollowerLoveMessages[] = { static const u8 sLoveMsg00[] = _("{STR_VAR_1} suddenly started walking\ncloser!");
(const char []) _("{STR_VAR_1} suddenly started walking\ncloser!"), static const u8 sLoveMsg01[] = _("{STR_VAR_1} cheeks are becoming\nrosy!");
(const char []) _("{STR_VAR_1} cheeks are becoming\nrosy!"), static const u8 sLoveMsg02[] = _("Woah! {STR_VAR_1} suddenly hugged\nyou!");
(const char []) _("Woah! {STR_VAR_1} suddenly hugged\nyou!"), static const u8 sLoveMsg03[] = _("Woah! {STR_VAR_1} is suddenly\nplayful!");
(const char []) _("Woah! {STR_VAR_1} is suddenly\nplayful!"), static const u8 sLoveMsg04[] = _("{STR_VAR_1} is rubbing against your\nlegs!");
(const char []) _("{STR_VAR_1} is rubbing against your\nlegs!"), static const u8 sLoveMsg05[] = _("{STR_VAR_1} blushes.");
(const char []) _("{STR_VAR_1} blushes."), static const u8 sLoveMsg06[] = _("Ah! {STR_VAR_1} cuddles you!");
(const char []) _("Ah! {STR_VAR_1} cuddles you!"), static const u8 sLoveMsg07[] = _("{STR_VAR_1} is regarding you with\nadoration!");
(const char []) _("{STR_VAR_1} is regarding you with\nadoration!"), static const u8 sLoveMsg08[] = _("{STR_VAR_1} got closer to you.");
(const char []) _("{STR_VAR_1} got closer to you."), static const u8 sLoveMsg09[] = _("{STR_VAR_1} is keeping close to your\nfeet.");
(const char []) _("{STR_VAR_1} is keeping close to your\nfeet."),
const struct FollowerMsgInfo gFollowerLoveMessages[] = {
{sLoveMsg00, EventScript_FollowerGetCloser},
{sLoveMsg01},
{sLoveMsg02, EventScript_FollowerCuddling},
{sLoveMsg03},
{sLoveMsg04, EventScript_FollowerCuddling},
{sLoveMsg05},
{sLoveMsg06, EventScript_FollowerCuddling},
{sLoveMsg07},
{sLoveMsg08, EventScript_FollowerGetCloser},
{sLoveMsg09},
}; };
// Unconditional surprised messages // Unconditional surprised messages
const char * const gFollowerSurpriseMessages[] = { static const u8 sSurpriseMsg00[] = _("{STR_VAR_1} is in danger of falling\nover!");
(const char []) _("{STR_VAR_1} is in danger of falling\nover!"), static const u8 sSurpriseMsg01[] = _("{STR_VAR_1} bumped into you!");
(const char []) _("{STR_VAR_1} bumped into you!"), static const u8 sSurpriseMsg02[] = _("{STR_VAR_1} doesn't seem to be used\nto its own name yet.");
(const char []) _("{STR_VAR_1} doesn't seem to be used\nto its own name yet."), static const u8 sSurpriseMsg03[] = _("{STR_VAR_1} is peering down.");
(const char []) _("{STR_VAR_1} is peering down."), static const u8 sSurpriseMsg04[] = _("Your pokemon stumbled and nearly\nfell!");
(const char []) _("Your pokemon stumbled and nearly\nfell!"), static const u8 sSurpriseMsg05[] = _("{STR_VAR_1} feels something and is\nhowling!");
(const char []) _("{STR_VAR_1} feels something and is\nhowling!"), static const u8 sSurpriseMsg06[] = _("{STR_VAR_1} seems refreshed!");
(const char []) _("{STR_VAR_1} seems refreshed!"), static const u8 sSurpriseMsg07[] = _("{STR_VAR_1} suddenly turned around\nand started barking!");
(const char []) _("{STR_VAR_1} suddenly turned around\nand started barking!"), static const u8 sSurpriseMsg08[] = _("{STR_VAR_1} suddenly turned around!");
(const char []) _("{STR_VAR_1} suddenly turned around!"), static const u8 sSurpriseMsg09[] = _("Your pokemon was surprised that you\nsuddenly spoke to it!");
(const char []) _("Your pokemon was surprised that you\nsuddenly spoke to it!"), static const u8 sSurpriseMsg10[] = _("Sniff sniff, something smells really\ngood!");
(const char []) _("Sniff sniff, something smells really\ngood!"), static const u8 sSurpriseMsg11[] = _("{STR_VAR_1} feels refreshed.");
(const char []) _("{STR_VAR_1} feels refreshed."), static const u8 sSurpriseMsg12[] = _("{STR_VAR_1} is wobbling and seems\nabout to fall over.");
(const char []) _("{STR_VAR_1} is wobbling and seems\nabout to fall over."), static const u8 sSurpriseMsg13[] = _("{STR_VAR_1} is in danger of falling\nover.");
(const char []) _("{STR_VAR_1} is in danger of falling\nover."), static const u8 sSurpriseMsg14[] = _("{STR_VAR_1} is walking along\ncautiously.");
(const char []) _("{STR_VAR_1} is walking along\ncautiously."), static const u8 sSurpriseMsg15[] = _("{STR_VAR_1} is getting tense with\nnervous energy.");
(const char []) _("{STR_VAR_1} is getting tense with\nnervous energy."), static const u8 sSurpriseMsg16[] = _("{STR_VAR_1} sensed something strange\nand was surprised!");
(const char []) _("{STR_VAR_1} sensed something strange\nand was surprised!"), static const u8 sSurpriseMsg17[] = _("{STR_VAR_1} is scared and snuggled\nup to you!");
(const char []) _("{STR_VAR_1} is scared and snuggled\nup to you!"), static const u8 sSurpriseMsg18[] = _("{STR_VAR_1} is feeling an unusual\npresence...");
(const char []) _("{STR_VAR_1} is feeling an unusual\npresence..."), static const u8 sSurpriseMsg19[] = _("{STR_VAR_1} is getting tense with\nnervous energy.");
(const char []) _("{STR_VAR_1} is getting tense with\nnervous energy."),
// Conditional messages, index 20 // Conditional messages, index 20
(const char []) _("{STR_VAR_1} seems to be very\nsurprised that it is raining!"), static const u8 sSurpriseMsg20[] = _("{STR_VAR_1} seems to be very\nsurprised that it is raining!");
const struct FollowerMsgInfo gFollowerSurpriseMessages[] = {
{sSurpriseMsg00},
{sSurpriseMsg01, EventScript_FollowerPokingPlayer},
{sSurpriseMsg02}, {sSurpriseMsg03}, {sSurpriseMsg04}, {sSurpriseMsg05}, {sSurpriseMsg06},
{sSurpriseMsg07, EventScript_FollowerLookAwayBark},
{sSurpriseMsg08, EventScript_FollowerLookAway},
{sSurpriseMsg09},
{sSurpriseMsg10, EventScript_FollowerLookAround},
{sSurpriseMsg11}, {sSurpriseMsg12}, {sSurpriseMsg13}, {sSurpriseMsg14}, {sSurpriseMsg15}, {sSurpriseMsg16},
{sSurpriseMsg17, EventScript_FollowerCuddling},
{sSurpriseMsg18},
{sSurpriseMsg19, EventScript_FollowerLookAround},
{sSurpriseMsg20},
}; };
// Unconditional curious messages // Unconditional curious messages
const char * const gFollowerCuriousMessages[] = { static const u8 sCuriousMsg00[] = _("Your pokemon is looking around\nrestlessly for something.");
(const char []) _("Your pokemon is looking around\nrestlessly for something."), static const u8 sCuriousMsg01[] = _("Your pokemon wasn't watching where\nit was going and ran into you!");
(const char []) _("Your pokemon wasn't watching where\nit was going and ran into you!"), static const u8 sCuriousMsg02[] = _("Sniff, sniff! Is there something\nnearby?");
(const char []) _("Sniff, sniff! Is there something\nnearby?"), static const u8 sCuriousMsg03[] = _("{STR_VAR_1} is rolling a pebble\naround playfully.");
(const char []) _("{STR_VAR_1} is rolling a pebble\naround playfully."), static const u8 sCuriousMsg04[] = _("{STR_VAR_1} is wandering around and\nsearching for something.");
(const char []) _("{STR_VAR_1} is wandering around and\nsearching for something."), static const u8 sCuriousMsg05[] = _("{STR_VAR_1} is sniffing at you.");
(const char []) _("{STR_VAR_1} is sniffing at you."), static const u8 sCuriousMsg06[] = _("{STR_VAR_1} seems to be a little\nhesitant...");
(const char []) _("{STR_VAR_1} seems to be a little\nhesitant..."),
const struct FollowerMsgInfo gFollowerCuriousMessages[] = {
{sCuriousMsg00, EventScript_FollowerLookAround},
{sCuriousMsg01, EventScript_FollowerPokingPlayer},
{sCuriousMsg02}, {sCuriousMsg03},
{sCuriousMsg04, EventScript_FollowerLookAround},
{sCuriousMsg05}, {sCuriousMsg06},
}; };
// Unconditional music messages // Unconditional music messages
const char * const gFollowerMusicMessages[] = { static const u8 sMusicMsg00[] = _("{STR_VAR_1} is showing off its\nagility!");
(const char []) _("{STR_VAR_1} is showing off its\nagility!"), static const u8 sMusicMsg01[] = _("{STR_VAR_1} is moving around\nhappily!");
(const char []) _("{STR_VAR_1} is moving around\nhappily!"), static const u8 sMusicMsg02[] = _("Woah! {STR_VAR_1} suddenly started\ndancing in happiness!");
(const char []) _("Woah! {STR_VAR_1} suddenly started\ndancing in happiness!"), static const u8 sMusicMsg03[] = _("{STR_VAR_1} is steadily keeping up\nwith you!");
(const char []) _("{STR_VAR_1} is steadily keeping up\nwith you!"), static const u8 sMusicMsg04[] = _("{STR_VAR_1} seems to want to play\nwith you.");
(const char []) _("{STR_VAR_1} is very happy about the\nrain."), static const u8 sMusicMsg05[] = _("{STR_VAR_1} is happy skipping about.");
(const char []) _("{STR_VAR_1} seems to want to play\nwith you."), static const u8 sMusicMsg06[] = _("{STR_VAR_1} is singing and humming.");
(const char []) _("{STR_VAR_1} is happy skipping about."), static const u8 sMusicMsg07[] = _("{STR_VAR_1} is nipping at your feet!");
(const char []) _("{STR_VAR_1} is singing and humming."), static const u8 sMusicMsg08[] = _("{STR_VAR_1} turns around and looks\nat you.");
(const char []) _("{STR_VAR_1} is nipping at your feet!"), static const u8 sMusicMsg09[] = _("{STR_VAR_1} is working hard to show\noff its mighty power!");
(const char []) _("{STR_VAR_1} turns around and looks\nat you."), static const u8 sMusicMsg10[] = _("Whoa! {STR_VAR_1} suddenly danced in\nhappiness!");
(const char []) _("{STR_VAR_1} is working hard to show\noff its mighty power!"), static const u8 sMusicMsg11[] = _("{STR_VAR_1} is cheerful!");
(const char []) _("Whoa! {STR_VAR_1} suddenly danced in\nhappiness!"), static const u8 sMusicMsg12[] = _("{STR_VAR_1} is jumping around in a\ncarefree way!");
(const char []) _("{STR_VAR_1} is cheerful!"), static const u8 sMusicMsg13[] = _("Your pokemon seems to be smelling a\nnostalgically familiar scent...");
(const char []) _("{STR_VAR_1} is jumping around in a\ncarefree way!"), // Conditional music messages, index 14
(const char []) _("Your pokemon seems to be smelling a\nnostalgically familiar scent..."), static const u8 sMusicMsg14[] = _("{STR_VAR_1} is very happy about the\nrain.");
const struct FollowerMsgInfo gFollowerMusicMessages[] = {
{sMusicMsg00, EventScript_FollowerLookAround},
{sMusicMsg01},
{sMusicMsg02, EventScript_FollowerDance},
{sMusicMsg03},
{sMusicMsg04, EventScript_FollowerHopping},
{sMusicMsg05, EventScript_FollowerHopping},
{sMusicMsg06}, {sMusicMsg07}, {sMusicMsg08}, {sMusicMsg09},
{sMusicMsg10, EventScript_FollowerDance},
{sMusicMsg11},
{sMusicMsg12, EventScript_FollowerHopping},
{sMusicMsg13, EventScript_FollowerNostalgia},
{sMusicMsg14}
}; };
const char * const gFollowerPoisonedMessages[] = {
(const char []) _("{STR_VAR_1} is shivering with the\neffects of being poisoned."), static const u8 sPoisonedMsg00[] = _("{STR_VAR_1} is shivering with the\neffects of being poisoned.");
const struct FollowerMsgInfo gFollowerPoisonedMessages[] = {
{sPoisonedMsg00, EventScript_FollowerIsShivering},
}; };

View File

@ -1864,7 +1864,6 @@ bool8 ScrFunc_emote(struct ScriptContext *ctx) {
} }
struct SpecialEmote { // Used for storing conditional emotes struct SpecialEmote { // Used for storing conditional emotes
const u8 * script;
u16 index; u16 index;
u8 emotion; u8 emotion;
}; };
@ -1873,7 +1872,7 @@ struct SpecialEmote { // Used for storing conditional emotes
bool8 ScrFunc_getfolloweraction(struct ScriptContext *ctx) // Essentially a big switch for follower messages bool8 ScrFunc_getfolloweraction(struct ScriptContext *ctx) // Essentially a big switch for follower messages
{ {
u16 species; u16 species;
u32 behavior; s32 multi;
s16 health_percent; s16 health_percent;
u8 friendship; u8 friendship;
struct SpecialEmote cond_emotes[16] = {0}; struct SpecialEmote cond_emotes[16] = {0};
@ -1889,16 +1888,9 @@ bool8 ScrFunc_getfolloweraction(struct ScriptContext *ctx) // Essentially a big
// If map is not flyable, set the script to jump past the fly check TODO: Should followers ask to fly? // If map is not flyable, set the script to jump past the fly check TODO: Should followers ask to fly?
if (TRUE || !Overworld_MapTypeAllowsTeleportAndFly(gMapHeader.mapType)) if (TRUE || !Overworld_MapTypeAllowsTeleportAndFly(gMapHeader.mapType))
ScriptJump(ctx, EventScript_FollowerEnd); ScriptJump(ctx, EventScript_FollowerEnd);
behavior = MapGridGetMetatileBehaviorAt(objEvent->currentCoords.x, objEvent->currentCoords.y); multi = MapGridGetMetatileBehaviorAt(objEvent->currentCoords.x, objEvent->currentCoords.y);
species = GetMonData(mon, MON_DATA_SPECIES); species = GetMonData(mon, MON_DATA_SPECIES);
friendship = GetMonData(mon, MON_DATA_FRIENDSHIP); friendship = GetMonData(mon, MON_DATA_FRIENDSHIP);
// // 1. Puddle splash or wet feet
// if (MetatileBehavior_IsPuddle(behavior) || MetatileBehavior_IsShallowFlowingWater(behavior)) {
// if (SpeciesHasType(species, TYPE_FIRE))
// message_choices[n_choices++] = EventScript_FollowerUnhappyToBeWet;
// else if (SpeciesToGraphicsInfo(species, 0)->tracks) // if follower is grounded
// message_choices[n_choices++] = EventScript_FollowerSplashesAbout;
// }
// Happy weights // Happy weights
emotion_weight[FOLLOWER_EMOTION_HAPPY] = 10; emotion_weight[FOLLOWER_EMOTION_HAPPY] = 10;
if (friendship > 170) if (friendship > 170)
@ -1933,10 +1925,11 @@ bool8 ScrFunc_getfolloweraction(struct ScriptContext *ctx) // Essentially a big
cond_emotes[n_choices++] = (struct SpecialEmote) {.emotion=FOLLOWER_EMOTION_HAPPY, .index=31}; cond_emotes[n_choices++] = (struct SpecialEmote) {.emotion=FOLLOWER_EMOTION_HAPPY, .index=31};
else if (GetCurrentWeather() == WEATHER_RAIN || GetCurrentWeather() == WEATHER_RAIN_THUNDERSTORM) { else if (GetCurrentWeather() == WEATHER_RAIN || GetCurrentWeather() == WEATHER_RAIN_THUNDERSTORM) {
if (SpeciesHasType(species, TYPE_FIRE)) { if (SpeciesHasType(species, TYPE_FIRE)) {
emotion_weight[FOLLOWER_EMOTION_SAD] = 30; emotion_weight[FOLLOWER_EMOTION_SAD] = 30;
cond_emotes[n_choices++] = (struct SpecialEmote) {.emotion=FOLLOWER_EMOTION_SAD, .index=3}; cond_emotes[n_choices++] = (struct SpecialEmote) {.emotion=FOLLOWER_EMOTION_SAD, .index=3};
cond_emotes[n_choices++] = (struct SpecialEmote) {.emotion=FOLLOWER_EMOTION_UPSET, .index=3}; cond_emotes[n_choices++] = (struct SpecialEmote) {.emotion=FOLLOWER_EMOTION_UPSET, .index=3};
} } else
cond_emotes[n_choices++] = (struct SpecialEmote) {.emotion = FOLLOWER_EMOTION_MUSIC, .index=14};
cond_emotes[n_choices++] = (struct SpecialEmote) {.emotion=FOLLOWER_EMOTION_SURPRISE, .index=20}; cond_emotes[n_choices++] = (struct SpecialEmote) {.emotion=FOLLOWER_EMOTION_SURPRISE, .index=20};
} }
// Health & status-related // Health & status-related
@ -1955,26 +1948,20 @@ bool8 ScrFunc_getfolloweraction(struct ScriptContext *ctx) // Essentially a big
if (mon->status & 0x8) // STATUS1_POISON if (mon->status & 0x8) // STATUS1_POISON
emotion = FOLLOWER_EMOTION_POISONED; emotion = FOLLOWER_EMOTION_POISONED;
ObjectEventEmote(objEvent, emotion); ObjectEventEmote(objEvent, emotion);
multi = Random() % followerBasicMessages[emotion].length;
if (Random() & 1) { // With 50% chance, select special message using reservoir sampling if (Random() & 1) { // With 50% chance, select special message using reservoir sampling
u8 i, j = 1; u8 i, j = 1;
struct SpecialEmote *choice = 0; struct SpecialEmote *choice = 0;
for (i = 0; i < n_choices; i++) { for (i = 0; i < n_choices; i++) {
if (cond_emotes[i].emotion == emotion) { if (cond_emotes[i].emotion == emotion && (Random() < 0x10000 / (j++))) // Replace item with 1/j chance
if (Random() < 0x10000 / (j++)) // Replace item with 1/j chance choice = &cond_emotes[i];
choice = &cond_emotes[i];
}
}
if (choice) { // Only continue if a script was actually chosen
ctx->data[0] = (u32) followerBasicMessages[emotion].messages[choice->index];
if (choice->script)
ScriptCall(ctx, choice->script);
else
ScriptCall(ctx, followerBasicMessages[emotion].script);
return FALSE;
} }
if (choice)
multi = choice->index;
} }
ctx->data[0] = (u32) followerBasicMessages[emotion].messages[Random() % followerBasicMessages[emotion].length]; ctx->data[0] = (u32) followerBasicMessages[emotion].messages[multi].text; // Load message text
ScriptCall(ctx, followerBasicMessages[emotion].script); ScriptCall(ctx, followerBasicMessages[emotion].messages[multi].script ?
followerBasicMessages[emotion].messages[multi].script : followerBasicMessages[emotion].script);
return FALSE; return FALSE;
} }
@ -4839,8 +4826,14 @@ bool8 MovementType_FollowPlayer_Active(struct ObjectEvent *objectEvent, struct S
bool8 MovementType_FollowPlayer_Moving(struct ObjectEvent *objectEvent, struct Sprite *sprite) bool8 MovementType_FollowPlayer_Moving(struct ObjectEvent *objectEvent, struct Sprite *sprite)
{ {
if (ObjectEventExecSingleMovementAction(objectEvent, sprite)) #ifdef MB_SIDEWAYS_STAIRS_RIGHT_SIDE
{ // Copied from ObjectEventExecSingleMovementAction
if (gMovementActionFuncs[objectEvent->movementActionId][sprite->sActionFuncId](objectEvent, sprite)) {
objectEvent->movementActionId = MOVEMENT_ACTION_NONE;
sprite->sActionFuncId = 0;
#else
if (ObjectEventExecSingleMovementAction(objectEvent, sprite)) {
#endif
objectEvent->singleMovementActive = 0; objectEvent->singleMovementActive = 0;
if (sprite->data[1]) { // restore nonzero state if (sprite->data[1]) { // restore nonzero state
sprite->data[1] = 1; sprite->data[1] = 1;
@ -4870,6 +4863,9 @@ bool8 FollowablePlayerMovement_Step(struct ObjectEvent *objectEvent, struct Spri
s16 y; s16 y;
s16 targetX; s16 targetX;
s16 targetY; s16 targetY;
#ifdef MB_SIDEWAYS_STAIRS_RIGHT_SIDE
u8 playerAction = gObjectEvents[gPlayerAvatar.objectEventId].movementActionId;
#endif
targetX = gObjectEvents[gPlayerAvatar.objectEventId].previousCoords.x; targetX = gObjectEvents[gPlayerAvatar.objectEventId].previousCoords.x;
targetY = gObjectEvents[gPlayerAvatar.objectEventId].previousCoords.y; targetY = gObjectEvents[gPlayerAvatar.objectEventId].previousCoords.y;
@ -4896,12 +4892,27 @@ bool8 FollowablePlayerMovement_Step(struct ObjectEvent *objectEvent, struct Spri
// Follow player // Follow player
direction = GetDirectionToFace(x, y, targetX, targetY); direction = GetDirectionToFace(x, y, targetX, targetY);
ObjectEventMoveDestCoords(objectEvent, direction, &x, &y); #ifdef MB_SIDEWAYS_STAIRS_RIGHT_SIDE // https://github.com/ghoulslash/pokeemerald/tree/sideways_stairs
if (TestPlayerAvatarFlags(PLAYER_AVATAR_FLAG_DASH)) { // Set follow speed accordingly MoveCoords(direction, &x, &y);
ObjectEventSetSingleMovement(objectEvent, sprite, GetWalkFastMovementAction(direction)); GetCollisionAtCoords(objectEvent, x, y, direction); // Sets directionOverwrite for stairs
if (TestPlayerAvatarFlags(PLAYER_AVATAR_FLAG_DASH)) { // Set follow speed according to player's speed
if (playerAction >= MOVEMENT_ACTION_RUN_DOWN_SLOW && playerAction <= MOVEMENT_ACTION_RUN_RIGHT_SLOW)
objectEvent->movementActionId = GetWalkNormalMovementAction(direction);
else
objectEvent->movementActionId = GetWalkFastMovementAction(direction);
} else { } else {
ObjectEventSetSingleMovement(objectEvent, sprite, GetWalkNormalMovementAction(direction)); if (playerAction >= MOVEMENT_ACTION_WALK_SLOW_DOWN && playerAction <= MOVEMENT_ACTION_WALK_SLOW_RIGHT)
ObjectEventSetSingleMovement(objectEvent, sprite, GetWalkSlowMovementAction(direction));
else
objectEvent->movementActionId = GetWalkNormalMovementAction(direction);
} }
sprite->sActionFuncId = 0;
#else
if (TestPlayerAvatarFlags(PLAYER_AVATAR_FLAG_DASH)) // Set follow speed according to player's speed
ObjectEventSetSingleMovement(objectEvent, sprite, GetWalkFastMovementAction(direction));
else
ObjectEventSetSingleMovement(objectEvent, sprite, GetWalkNormalMovementAction(direction));
#endif
objectEvent->singleMovementActive = 1; objectEvent->singleMovementActive = 1;
sprite->data[1] = 2; sprite->data[1] = 2;
return TRUE; return TRUE;
@ -5396,6 +5407,9 @@ static bool8 DoesObjectCollideWithObjectAt(struct ObjectEvent *objectEvent, s16
u8 i; u8 i;
struct ObjectEvent *curObject; struct ObjectEvent *curObject;
if (objectEvent->localId == OBJ_EVENT_ID_FOLLOWER)
return FALSE; // follower cannot collide with other objects, but they can collide with it
for (i = 0; i < OBJECT_EVENTS_COUNT; i++) for (i = 0; i < OBJECT_EVENTS_COUNT; i++)
{ {
curObject = &gObjectEvents[i]; curObject = &gObjectEvents[i];