Added pokemon followers & script commands.

This commit is contained in:
Ariel Antonitis 2020-06-12 03:41:03 -04:00
parent a2c8ab6a09
commit 8a3dfbf252
26 changed files with 857 additions and 403 deletions

View File

@ -1625,6 +1625,11 @@
.2byte \quantity
.endm
@ Like callnative, but function expects a ctx
.macro callfunc func:req
.byte 0xe3
.4byte \func
.endm
@ Supplementary

View File

@ -1057,6 +1057,7 @@ Common_EventScript_LegendaryFlewAway:: @ 8273776
.include "data/scripts/move_tutors.inc"
.include "data/scripts/trainer_hill.inc"
.include "data/scripts/test_signpost.inc"
.include "data/scripts/follower.inc"
.include "data/text/frontier_brain.inc"
.include "data/text/save.inc"
.include "data/text/birch_speech.inc"

View File

@ -1,232 +1,233 @@
.align 2
gScriptCmdTable:: @ 81DB67C
.4byte ScrCmd_nop @ 0x00
.4byte ScrCmd_nop1 @ 0x01
.4byte ScrCmd_end @ 0x02
.4byte ScrCmd_return @ 0x03
.4byte ScrCmd_call @ 0x04
.4byte ScrCmd_goto @ 0x05
.4byte ScrCmd_goto_if @ 0x06
.4byte ScrCmd_call_if @ 0x07
.4byte ScrCmd_gotostd @ 0x08
.4byte ScrCmd_callstd @ 0x09
.4byte ScrCmd_gotostd_if @ 0x0a
.4byte ScrCmd_callstd_if @ 0x0b
.4byte ScrCmd_returnram @ 0x0c
.4byte ScrCmd_killscript @ 0x0d
.4byte ScrCmd_setmysteryeventstatus @ 0x0e
.4byte ScrCmd_loadword @ 0x0f
.4byte ScrCmd_loadbyte @ 0x10
.4byte ScrCmd_writebytetoaddr @ 0x11
.4byte ScrCmd_loadbytefromaddr @ 0x12
.4byte ScrCmd_setptrbyte @ 0x13
.4byte ScrCmd_copylocal @ 0x14
.4byte ScrCmd_copybyte @ 0x15
.4byte ScrCmd_setvar @ 0x16
.4byte ScrCmd_addvar @ 0x17
.4byte ScrCmd_subvar @ 0x18
.4byte ScrCmd_copyvar @ 0x19
.4byte ScrCmd_setorcopyvar @ 0x1a
.4byte ScrCmd_compare_local_to_local @ 0x1b
.4byte ScrCmd_compare_local_to_value @ 0x1c
.4byte ScrCmd_compare_local_to_addr @ 0x1d
.4byte ScrCmd_compare_addr_to_local @ 0x1e
.4byte ScrCmd_compare_addr_to_value @ 0x1f
.4byte ScrCmd_compare_addr_to_addr @ 0x20
.4byte ScrCmd_compare_var_to_value @ 0x21
.4byte ScrCmd_compare_var_to_var @ 0x22
.4byte ScrCmd_callnative @ 0x23
.4byte ScrCmd_gotonative @ 0x24
.4byte ScrCmd_special @ 0x25
.4byte ScrCmd_specialvar @ 0x26
.4byte ScrCmd_waitstate @ 0x27
.4byte ScrCmd_delay @ 0x28
.4byte ScrCmd_setflag @ 0x29
.4byte ScrCmd_clearflag @ 0x2a
.4byte ScrCmd_checkflag @ 0x2b
.4byte ScrCmd_initclock @ 0x2c
.4byte ScrCmd_dotimebasedevents @ 0x2d
.4byte ScrCmd_gettime @ 0x2e
.4byte ScrCmd_playse @ 0x2f
.4byte ScrCmd_waitse @ 0x30
.4byte ScrCmd_playfanfare @ 0x31
.4byte ScrCmd_waitfanfare @ 0x32
.4byte ScrCmd_playbgm @ 0x33
.4byte ScrCmd_savebgm @ 0x34
.4byte ScrCmd_fadedefaultbgm @ 0x35
.4byte ScrCmd_fadenewbgm @ 0x36
.4byte ScrCmd_fadeoutbgm @ 0x37
.4byte ScrCmd_fadeinbgm @ 0x38
.4byte ScrCmd_warp @ 0x39
.4byte ScrCmd_warpsilent @ 0x3a
.4byte ScrCmd_warpdoor @ 0x3b
.4byte ScrCmd_warphole @ 0x3c
.4byte ScrCmd_warpteleport @ 0x3d
.4byte ScrCmd_setwarp @ 0x3e
.4byte ScrCmd_setdynamicwarp @ 0x3f
.4byte ScrCmd_setdivewarp @ 0x40
.4byte ScrCmd_setholewarp @ 0x41
.4byte ScrCmd_getplayerxy @ 0x42
.4byte ScrCmd_getpartysize @ 0x43
.4byte ScrCmd_additem @ 0x44
.4byte ScrCmd_removeitem @ 0x45
.4byte ScrCmd_checkitemspace @ 0x46
.4byte ScrCmd_checkitem @ 0x47
.4byte ScrCmd_checkitemtype @ 0x48
.4byte ScrCmd_addpcitem @ 0x49
.4byte ScrCmd_checkpcitem @ 0x4a
.4byte ScrCmd_adddecoration @ 0x4b
.4byte ScrCmd_removedecoration @ 0x4c
.4byte ScrCmd_checkdecor @ 0x4d
.4byte ScrCmd_checkdecorspace @ 0x4e
.4byte ScrCmd_applymovement @ 0x4f
.4byte ScrCmd_applymovement_at @ 0x50
.4byte ScrCmd_waitmovement @ 0x51
.4byte ScrCmd_waitmovement_at @ 0x52
.4byte ScrCmd_removeobject @ 0x53
.4byte ScrCmd_removeobject_at @ 0x54
.4byte ScrCmd_addobject @ 0x55
.4byte ScrCmd_addobject_at @ 0x56
.4byte ScrCmd_setobjectxy @ 0x57
.4byte ScrCmd_showobject_at @ 0x58
.4byte ScrCmd_hideobject_at @ 0x59
.4byte ScrCmd_faceplayer @ 0x5a
.4byte ScrCmd_turnobject @ 0x5b
.4byte ScrCmd_trainerbattle @ 0x5c
.4byte ScrCmd_dotrainerbattle @ 0x5d
.4byte ScrCmd_gotopostbattlescript @ 0x5e
.4byte ScrCmd_gotobeatenscript @ 0x5f
.4byte ScrCmd_checktrainerflag @ 0x60
.4byte ScrCmd_settrainerflag @ 0x61
.4byte ScrCmd_cleartrainerflag @ 0x62
.4byte ScrCmd_setobjectxyperm @ 0x63
.4byte ScrCmd_copyobjectxytoperm @ 0x64
.4byte ScrCmd_setobjectmovementtype @ 0x65
.4byte ScrCmd_waitmessage @ 0x66
.4byte ScrCmd_message @ 0x67
.4byte ScrCmd_closemessage @ 0x68
.4byte ScrCmd_lockall @ 0x69
.4byte ScrCmd_lock @ 0x6a
.4byte ScrCmd_releaseall @ 0x6b
.4byte ScrCmd_release @ 0x6c
.4byte ScrCmd_waitbuttonpress @ 0x6d
.4byte ScrCmd_yesnobox @ 0x6e
.4byte ScrCmd_multichoice @ 0x6f
.4byte ScrCmd_multichoicedefault @ 0x70
.4byte ScrCmd_multichoicegrid @ 0x71
.4byte ScrCmd_drawbox @ 0x72
.4byte ScrCmd_erasebox @ 0x73
.4byte ScrCmd_drawboxtext @ 0x74
.4byte ScrCmd_showmonpic @ 0x75
.4byte ScrCmd_hidemonpic @ 0x76
.4byte ScrCmd_showcontestwinner @ 0x77
.4byte ScrCmd_braillemessage @ 0x78
.4byte ScrCmd_givemon @ 0x79
.4byte ScrCmd_giveegg @ 0x7a
.4byte ScrCmd_setmonmove @ 0x7b
.4byte ScrCmd_checkpartymove @ 0x7c
.4byte ScrCmd_bufferspeciesname @ 0x7d
.4byte ScrCmd_bufferleadmonspeciesname @ 0x7e
.4byte ScrCmd_bufferpartymonnick @ 0x7f
.4byte ScrCmd_bufferitemname @ 0x80
.4byte ScrCmd_bufferdecorationname @ 0x81
.4byte ScrCmd_buffermovename @ 0x82
.4byte ScrCmd_buffernumberstring @ 0x83
.4byte ScrCmd_bufferstdstring @ 0x84
.4byte ScrCmd_bufferstring @ 0x85
.4byte ScrCmd_pokemart @ 0x86
.4byte ScrCmd_pokemartdecoration @ 0x87
.4byte ScrCmd_pokemartdecoration2 @ 0x88
.4byte ScrCmd_playslotmachine @ 0x89
.4byte ScrCmd_setberrytree @ 0x8a
.4byte ScrCmd_choosecontestmon @ 0x8b
.4byte ScrCmd_startcontest @ 0x8c
.4byte ScrCmd_showcontestresults @ 0x8d
.4byte ScrCmd_contestlinktransfer @ 0x8e
.4byte ScrCmd_random @ 0x8f
.4byte ScrCmd_addmoney @ 0x90
.4byte ScrCmd_removemoney @ 0x91
.4byte ScrCmd_checkmoney @ 0x92
.4byte ScrCmd_showmoneybox @ 0x93
.4byte ScrCmd_hidemoneybox @ 0x94
.4byte ScrCmd_updatemoneybox @ 0x95
.4byte ScrCmd_getpricereduction @ 0x96
.4byte ScrCmd_fadescreen @ 0x97
.4byte ScrCmd_fadescreenspeed @ 0x98
.4byte ScrCmd_setflashradius @ 0x99
.4byte ScrCmd_animateflash @ 0x9a
.4byte ScrCmd_messageautoscroll @ 0x9b
.4byte ScrCmd_dofieldeffect @ 0x9c
.4byte ScrCmd_setfieldeffectarg @ 0x9d
.4byte ScrCmd_waitfieldeffect @ 0x9e
.4byte ScrCmd_setrespawn @ 0x9f
.4byte ScrCmd_checkplayergender @ 0xa0
.4byte ScrCmd_playmoncry @ 0xa1
.4byte ScrCmd_setmetatile @ 0xa2
.4byte ScrCmd_resetweather @ 0xa3
.4byte ScrCmd_setweather @ 0xa4
.4byte ScrCmd_doweather @ 0xa5
.4byte ScrCmd_setstepcallback @ 0xa6
.4byte ScrCmd_setmaplayoutindex @ 0xa7
.4byte ScrCmd_setobjectpriority @ 0xa8
.4byte ScrCmd_resetobjectpriority @ 0xa9
.4byte ScrCmd_createvobject @ 0xaa
.4byte ScrCmd_turnvobject @ 0xab
.4byte ScrCmd_opendoor @ 0xac
.4byte ScrCmd_closedoor @ 0xad
.4byte ScrCmd_waitdooranim @ 0xae
.4byte ScrCmd_setdooropen @ 0xaf
.4byte ScrCmd_setdoorclosed @ 0xb0
.4byte ScrCmd_addelevmenuitem @ 0xb1
.4byte ScrCmd_showelevmenu @ 0xb2
.4byte ScrCmd_checkcoins @ 0xb3
.4byte ScrCmd_addcoins @ 0xb4
.4byte ScrCmd_removecoins @ 0xb5
.4byte ScrCmd_setwildbattle @ 0xb6
.4byte ScrCmd_dowildbattle @ 0xb7
.4byte ScrCmd_setvaddress @ 0xb8
.4byte ScrCmd_vgoto @ 0xb9
.4byte ScrCmd_vcall @ 0xba
.4byte ScrCmd_vgoto_if @ 0xbb
.4byte ScrCmd_vcall_if @ 0xbc
.4byte ScrCmd_vmessage @ 0xbd
.4byte ScrCmd_vloadword @ 0xbe
.4byte ScrCmd_vbufferstring @ 0xbf
.4byte ScrCmd_showcoinsbox @ 0xc0
.4byte ScrCmd_hidecoinsbox @ 0xc1
.4byte ScrCmd_updatecoinsbox @ 0xc2
.4byte ScrCmd_incrementgamestat @ 0xc3
.4byte ScrCmd_setescapewarp @ 0xc4
.4byte ScrCmd_waitmoncry @ 0xc5
.4byte ScrCmd_bufferboxname @ 0xc6
.4byte ScrCmd_nop1 @ 0xc7
.4byte ScrCmd_nop1 @ 0xc8
.4byte ScrCmd_nop1 @ 0xc9
.4byte ScrCmd_nop1 @ 0xca
.4byte ScrCmd_nop1 @ 0xcb
.4byte ScrCmd_nop1 @ 0xcc
.4byte ScrCmd_setmoneventlegal @ 0xcd
.4byte ScrCmd_checkmoneventlegal @ 0xce
.4byte ScrCmd_gotoram @ 0xcf
.4byte ScrCmd_nop1 @ 0xd0
.4byte ScrCmd_warpspinenter @ 0xd1
.4byte ScrCmd_setmonmetlocation @ 0xd2
.4byte ScrCmd_moverotatingtileobjects @ 0xd3
.4byte ScrCmd_turnrotatingtileobjects @ 0xd4
.4byte ScrCmd_initrotatingtilepuzzle @ 0xd5
.4byte ScrCmd_freerotatingtilepuzzle @ 0xd6
.4byte ScrCmd_warpmossdeepgym @ 0xd7
.4byte ScrCmd_selectapproachingtrainer @ 0xd8
.4byte ScrCmd_lockfortrainer @ 0xd9
.4byte ScrCmd_closebraillemessage @ 0xda
.4byte ScrCmd_messageinstant @ 0xdb
.4byte ScrCmd_fadescreenswapbuffers @ 0xdc
.4byte ScrCmd_buffertrainerclassname @ 0xdd
.4byte ScrCmd_buffertrainername @ 0xde
.4byte ScrCmd_pokenavcall @ 0xdf
.4byte ScrCmd_warpsootopolislegend @ 0xe0
.4byte ScrCmd_buffercontesttype @ 0xe1
.4byte ScrCmd_bufferitemnameplural @ 0xe2
.4byte ScrCmd_nop
.4byte ScrCmd_nop1
.4byte ScrCmd_end
.4byte ScrCmd_return
.4byte ScrCmd_call
.4byte ScrCmd_goto
.4byte ScrCmd_goto_if
.4byte ScrCmd_call_if
.4byte ScrCmd_gotostd
.4byte ScrCmd_callstd
.4byte ScrCmd_gotostd_if
.4byte ScrCmd_callstd_if
.4byte ScrCmd_returnram
.4byte ScrCmd_killscript
.4byte ScrCmd_setmysteryeventstatus
.4byte ScrCmd_loadword
.4byte ScrCmd_loadbyte
.4byte ScrCmd_writebytetoaddr
.4byte ScrCmd_loadbytefromaddr
.4byte ScrCmd_setptrbyte
.4byte ScrCmd_copylocal
.4byte ScrCmd_copybyte
.4byte ScrCmd_setvar
.4byte ScrCmd_addvar
.4byte ScrCmd_subvar
.4byte ScrCmd_copyvar
.4byte ScrCmd_setorcopyvar
.4byte ScrCmd_compare_local_to_local
.4byte ScrCmd_compare_local_to_value
.4byte ScrCmd_compare_local_to_addr
.4byte ScrCmd_compare_addr_to_local
.4byte ScrCmd_compare_addr_to_value
.4byte ScrCmd_compare_addr_to_addr
.4byte ScrCmd_compare_var_to_value
.4byte ScrCmd_compare_var_to_var
.4byte ScrCmd_callnative
.4byte ScrCmd_gotonative
.4byte ScrCmd_special
.4byte ScrCmd_specialvar
.4byte ScrCmd_waitstate
.4byte ScrCmd_delay
.4byte ScrCmd_setflag
.4byte ScrCmd_clearflag
.4byte ScrCmd_checkflag
.4byte ScrCmd_initclock
.4byte ScrCmd_dotimebasedevents
.4byte ScrCmd_gettime
.4byte ScrCmd_playse
.4byte ScrCmd_waitse
.4byte ScrCmd_playfanfare
.4byte ScrCmd_waitfanfare
.4byte ScrCmd_playbgm
.4byte ScrCmd_savebgm
.4byte ScrCmd_fadedefaultbgm
.4byte ScrCmd_fadenewbgm
.4byte ScrCmd_fadeoutbgm
.4byte ScrCmd_fadeinbgm
.4byte ScrCmd_warp
.4byte ScrCmd_warpsilent
.4byte ScrCmd_warpdoor
.4byte ScrCmd_warphole
.4byte ScrCmd_warpteleport
.4byte ScrCmd_setwarp
.4byte ScrCmd_setdynamicwarp
.4byte ScrCmd_setdivewarp
.4byte ScrCmd_setholewarp
.4byte ScrCmd_getplayerxy
.4byte ScrCmd_getpartysize
.4byte ScrCmd_additem
.4byte ScrCmd_removeitem
.4byte ScrCmd_checkitemspace
.4byte ScrCmd_checkitem
.4byte ScrCmd_checkitemtype
.4byte ScrCmd_addpcitem
.4byte ScrCmd_checkpcitem
.4byte ScrCmd_adddecoration
.4byte ScrCmd_removedecoration
.4byte ScrCmd_checkdecor
.4byte ScrCmd_checkdecorspace
.4byte ScrCmd_applymovement
.4byte ScrCmd_applymovement_at
.4byte ScrCmd_waitmovement
.4byte ScrCmd_waitmovement_at
.4byte ScrCmd_removeobject
.4byte ScrCmd_removeobject_at
.4byte ScrCmd_addobject
.4byte ScrCmd_addobject_at
.4byte ScrCmd_setobjectxy
.4byte ScrCmd_showobject_at
.4byte ScrCmd_hideobject_at
.4byte ScrCmd_faceplayer
.4byte ScrCmd_turnobject
.4byte ScrCmd_trainerbattle
.4byte ScrCmd_dotrainerbattle
.4byte ScrCmd_gotopostbattlescript
.4byte ScrCmd_gotobeatenscript
.4byte ScrCmd_checktrainerflag
.4byte ScrCmd_settrainerflag
.4byte ScrCmd_cleartrainerflag
.4byte ScrCmd_setobjectxyperm
.4byte ScrCmd_copyobjectxytoperm
.4byte ScrCmd_setobjectmovementtype
.4byte ScrCmd_waitmessage
.4byte ScrCmd_message
.4byte ScrCmd_closemessage
.4byte ScrCmd_lockall
.4byte ScrCmd_lock
.4byte ScrCmd_releaseall
.4byte ScrCmd_release
.4byte ScrCmd_waitbuttonpress
.4byte ScrCmd_yesnobox
.4byte ScrCmd_multichoice
.4byte ScrCmd_multichoicedefault
.4byte ScrCmd_multichoicegrid
.4byte ScrCmd_drawbox
.4byte ScrCmd_erasebox
.4byte ScrCmd_drawboxtext
.4byte ScrCmd_showmonpic
.4byte ScrCmd_hidemonpic
.4byte ScrCmd_showcontestwinner
.4byte ScrCmd_braillemessage
.4byte ScrCmd_givemon
.4byte ScrCmd_giveegg
.4byte ScrCmd_setmonmove
.4byte ScrCmd_checkpartymove
.4byte ScrCmd_bufferspeciesname
.4byte ScrCmd_bufferleadmonspeciesname
.4byte ScrCmd_bufferpartymonnick
.4byte ScrCmd_bufferitemname
.4byte ScrCmd_bufferdecorationname
.4byte ScrCmd_buffermovename
.4byte ScrCmd_buffernumberstring
.4byte ScrCmd_bufferstdstring
.4byte ScrCmd_bufferstring
.4byte ScrCmd_pokemart
.4byte ScrCmd_pokemartdecoration
.4byte ScrCmd_pokemartdecoration2
.4byte ScrCmd_playslotmachine
.4byte ScrCmd_setberrytree
.4byte ScrCmd_choosecontestmon
.4byte ScrCmd_startcontest
.4byte ScrCmd_showcontestresults
.4byte ScrCmd_contestlinktransfer
.4byte ScrCmd_random
.4byte ScrCmd_addmoney
.4byte ScrCmd_removemoney
.4byte ScrCmd_checkmoney
.4byte ScrCmd_showmoneybox
.4byte ScrCmd_hidemoneybox
.4byte ScrCmd_updatemoneybox
.4byte ScrCmd_getpricereduction
.4byte ScrCmd_fadescreen
.4byte ScrCmd_fadescreenspeed
.4byte ScrCmd_setflashradius
.4byte ScrCmd_animateflash
.4byte ScrCmd_messageautoscroll
.4byte ScrCmd_dofieldeffect
.4byte ScrCmd_setfieldeffectarg
.4byte ScrCmd_waitfieldeffect
.4byte ScrCmd_setrespawn
.4byte ScrCmd_checkplayergender
.4byte ScrCmd_playmoncry
.4byte ScrCmd_setmetatile
.4byte ScrCmd_resetweather
.4byte ScrCmd_setweather
.4byte ScrCmd_doweather
.4byte ScrCmd_setstepcallback
.4byte ScrCmd_setmaplayoutindex
.4byte ScrCmd_setobjectpriority
.4byte ScrCmd_resetobjectpriority
.4byte ScrCmd_createvobject
.4byte ScrCmd_turnvobject
.4byte ScrCmd_opendoor
.4byte ScrCmd_closedoor
.4byte ScrCmd_waitdooranim
.4byte ScrCmd_setdooropen
.4byte ScrCmd_setdoorclosed
.4byte ScrCmd_addelevmenuitem
.4byte ScrCmd_showelevmenu
.4byte ScrCmd_checkcoins
.4byte ScrCmd_addcoins
.4byte ScrCmd_removecoins
.4byte ScrCmd_setwildbattle
.4byte ScrCmd_dowildbattle
.4byte ScrCmd_setvaddress
.4byte ScrCmd_vgoto
.4byte ScrCmd_vcall
.4byte ScrCmd_vgoto_if
.4byte ScrCmd_vcall_if
.4byte ScrCmd_vmessage
.4byte ScrCmd_vloadword
.4byte ScrCmd_vbufferstring
.4byte ScrCmd_showcoinsbox
.4byte ScrCmd_hidecoinsbox
.4byte ScrCmd_updatecoinsbox
.4byte ScrCmd_incrementgamestat
.4byte ScrCmd_setescapewarp
.4byte ScrCmd_waitmoncry
.4byte ScrCmd_bufferboxname
.4byte ScrCmd_nop1
.4byte ScrCmd_nop1
.4byte ScrCmd_nop1
.4byte ScrCmd_nop1
.4byte ScrCmd_nop1
.4byte ScrCmd_nop1
.4byte ScrCmd_setmonobedient
.4byte ScrCmd_checkmonobedience
.4byte ScrCmd_gotoram
.4byte ScrCmd_nop1
.4byte ScrCmd_warpD1
.4byte ScrCmd_setmonmetlocation
.4byte ScrCmd_moverotatingtileobjects
.4byte ScrCmd_turnrotatingtileobjects
.4byte ScrCmd_initrotatingtilepuzzle
.4byte ScrCmd_freerotatingtilepuzzle
.4byte ScrCmd_warpmossdeepgym
.4byte ScrCmd_cmdD8
.4byte ScrCmd_cmdD9
.4byte ScrCmd_closebraillemessage
.4byte ScrCmd_cmdDB
.4byte ScrCmd_fadescreenswapbuffers
.4byte ScrCmd_buffertrainerclassname
.4byte ScrCmd_buffertrainername
.4byte ScrCmd_pokenavcall
.4byte ScrCmd_warpsootopolislegend
.4byte ScrCmd_buffercontesttype
.4byte ScrCmd_bufferitemnameplural
.4byte ScrCmd_callfunc
gScriptCmdTableEnd:: @ 81DBA08
.4byte ScrCmd_nop

23
data/scripts/follower.inc Normal file
View File

@ -0,0 +1,23 @@
gText_Follower::
.string "{STR_VAR_1} loves you!$"
.macro playfirstmoncry
callfunc ScrFunc_playfirstmoncry
.endm
.macro bufferlivemonspeciesname out:req
callfunc ScrFunc_bufferlivemonspeciesname
.byte \out
.endm
EventScript_Follower::
lock
faceplayer
playfirstmoncry
applymovement 0xFE ContestHall_Movement_Heart
waitmoncry
bufferlivemonspeciesname 0
msgbox gText_Follower, MSGBOX_DEFAULT
release
end

View File

@ -0,0 +1,19 @@
JASC-PAL
0100
16
208 144 200
0 0 0
0 2 6
72 80 104
40 104 152
0 132 6
40 128 168
112 128 144
64 168 216
96 192 232
168 176 192
208 224 232
248 248 248
0 0 0
0 0 0
0 0 0

View File

@ -0,0 +1,19 @@
JASC-PAL
0100
16
56 144 88
0 0 0
40 40 40
40 48 88
216 80 88
128 144 144
96 168 224
160 176 216
232 232 248
0 0 0
0 0 0
0 0 0
0 0 0
0 0 0
0 0 0
0 0 0

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.6 KiB

After

Width:  |  Height:  |  Size: 7.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.4 KiB

View File

@ -242,6 +242,8 @@
#define MOVEMENT_ACTION_FIGURE_8 0x9B
#define MOVEMENT_ACTION_FLY_UP 0x9C
#define MOVEMENT_ACTION_FLY_DOWN 0x9D
#define MOVEMENT_ACTION_EXIT_POKEBALL 0x9E
#define MOVEMENT_ACTION_ENTER_POKEBALL 0x9F
#define MOVEMENT_ACTION_STEP_END 0xFE

View File

@ -240,10 +240,12 @@
#define OBJ_EVENT_GFX_LINK_RS_MAY 236
#define OBJ_EVENT_GFX_LUGIA 237
#define OBJ_EVENT_GFX_HOOH 238
#define OBJ_EVENT_GFX_MARSHTOMP 239
#define OBJ_EVENT_GFX_ALTARIA 240
#define OBJ_EVENT_GFX_ANIMATED_BALL 239
#define OBJ_EVENT_GFX_MARSHTOMP 240
#define OBJ_EVENT_GFX_ALTARIA 241
#define OBJ_EVENT_GFX_TOGETIC 242
#define NUM_OBJ_EVENT_GFX 241
#define NUM_OBJ_EVENT_GFX 243
// These are dynamic object gfx ids.
@ -283,5 +285,6 @@
#define OBJ_EVENT_ID_PLAYER 0xFF
#define OBJ_EVENT_ID_CAMERA 0x7F
#define OBJ_EVENT_ID_FOLLOWER 0xFE
#endif // GUARD_CONSTANTS_EVENT_OBJECTS_H

View File

@ -94,7 +94,11 @@ u8 GetFaceDirectionAnimNum(u8);
void SetSpritePosToOffsetMapCoords(s16 *, s16 *, s16, s16);
void ObjectEventClearHeldMovement(struct ObjectEvent *);
void ObjectEventClearHeldMovementIfActive(struct ObjectEvent *);
u8 SpeciesToGraphicsId(u16 species);
struct Pokemon * GetFirstLiveMon(void);
u8 SpawnFollowingPokemon(void);
void UpdateFollowingPokemon(void);
void RemoveFollowingPokemon(void);
void TrySpawnObjectEvents(s16, s16);
u8 CreateObjectSprite(u8 graphicsId, u8 a1, s16 x, s16 y, u8 z, u8 direction);
u8 AddPseudoObjectEvent(u16, void (*)(struct Sprite *), s16 x, s16 y, u8 subpriority);
@ -421,7 +425,7 @@ u8 MovementType_FollowPlayer_Step2(struct ObjectEvent *, struct Sprite *);
bool8 FollowablePlayerMovement_Idle(struct ObjectEvent *, struct Sprite *, u8, bool8(u8));
bool8 FollowablePlayerMovement_FaceDirection(struct ObjectEvent *, struct Sprite *, u8, bool8(u8));
bool8 FollowablePlayerMovement_GoSpeed0(struct ObjectEvent *, struct Sprite *, u8, bool8(u8));
bool8 FollowablePlayerMovement_Step(struct ObjectEvent *, struct Sprite *, u8, bool8(u8));
bool8 FollowablePlayerMovement_GoSpeed1(struct ObjectEvent *, struct Sprite *, u8, bool8(u8));
bool8 FollowablePlayerMovement_GoSpeed2(struct ObjectEvent *, struct Sprite *, u8, bool8(u8));
bool8 FollowablePlayerMovement_Slide(struct ObjectEvent *, struct Sprite *, u8, bool8(u8));

View File

@ -1,6 +1,8 @@
#ifndef GUARD_EVENT_SCRIPTS_H
#define GUARD_EVENT_SCRIPTS_H
extern const u8 EventScript_Follower[];
extern const u8 EventScript_TestSignpostMsg[];
extern const u8 EventScript_TryGetTrainerScript[];
extern const u8 EventScript_StartTrainerApproach[];

View File

@ -13,6 +13,7 @@ u32 FieldEffectStart(u8);
bool8 FieldEffectActiveListContains(u8 id);
void FieldEffectActiveListClear(void);
void ReturnToFieldFromFlyMapSelect(void);
void FieldCallback_Fly(void);
u8 AddNewGameBirchObject(s16, s16, u8);
void FieldEffectStop(struct Sprite *sprite, u8 id);
u8 CreateTrainerSprite(u8 trainerSpriteID, s16 x, s16 y, u8 subpriority, u8 *buffer);

View File

@ -468,12 +468,18 @@ $(OBJEVENTGFXDIR)/pokemon/wingull.4bpp: %.4bpp: %.png
$(OBJEVENTGFXDIR)/pokemon/zigzagoon.4bpp: %.4bpp: %.png
$(GFX) $< $@ -mwidth 2 -mheight 2
$(OBJEVENTGFXDIR)/misc/animated_ball.4bpp: %.4bpp: %.png
$(GFX) $< $@ -mwidth 2 -mheight 4
$(OBJEVENTGFXDIR)/pokemon/marshtomp.4bpp: %.4bpp: %.png
$(GFX) $< $@ -mwidth 2 -mheight 4
$(OBJEVENTGFXDIR)/pokemon/altaria.4bpp: %.4bpp: %.png
$(GFX) $< $@ -mwidth 4 -mheight 4
$(OBJEVENTGFXDIR)/pokemon/togetic.4bpp: %.4bpp: %.png
$(GFX) $< $@ -mwidth 4 -mheight 4
$(OBJEVENTGFXDIR)/berry_trees/aguav.4bpp: %.4bpp: %.png
$(GFX) $< $@ -mwidth 2 -mheight 4

View File

@ -66,6 +66,8 @@ u8 MovementAction_WalkInPlaceSlowLeft_Step0(struct ObjectEvent *, struct Sprite
u8 MovementAction_WalkInPlaceSlowRight_Step0(struct ObjectEvent *, struct Sprite *);
u8 MovementAction_WalkInPlaceNormalDown_Step0(struct ObjectEvent *, struct Sprite *);
u8 MovementAction_WalkInPlace_Step1(struct ObjectEvent *, struct Sprite *);
u8 MovementAction_ExitPokeball_Step1(struct ObjectEvent *, struct Sprite *);
u8 MovementAction_EnterPokeball_Step1(struct ObjectEvent *, struct Sprite *);
u8 MovementAction_WalkInPlaceNormalUp_Step0(struct ObjectEvent *, struct Sprite *);
u8 MovementAction_WalkInPlaceNormalLeft_Step0(struct ObjectEvent *, struct Sprite *);
u8 MovementAction_WalkInPlaceNormalRight_Step0(struct ObjectEvent *, struct Sprite *);
@ -74,6 +76,8 @@ u8 MovementAction_WalkInPlaceFastUp_Step0(struct ObjectEvent *, struct Sprite *)
u8 MovementAction_WalkInPlaceFastLeft_Step0(struct ObjectEvent *, struct Sprite *);
u8 MovementAction_WalkInPlaceFastRight_Step0(struct ObjectEvent *, struct Sprite *);
u8 MovementAction_WalkInPlaceFastestDown_Step0(struct ObjectEvent *, struct Sprite *);
u8 MovementAction_ExitPokeball_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite);
u8 MovementAction_EnterPokeball_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite);
u8 MovementAction_WalkInPlaceFastestUp_Step0(struct ObjectEvent *, struct Sprite *);
u8 MovementAction_WalkInPlaceFastestLeft_Step0(struct ObjectEvent *, struct Sprite *);
u8 MovementAction_WalkInPlaceFastestRight_Step0(struct ObjectEvent *, struct Sprite *);
@ -300,6 +304,8 @@ u8 (*const gMovementActionFuncs_WalkInPlaceFastUp[])(struct ObjectEvent *, struc
u8 (*const gMovementActionFuncs_WalkInPlaceFastLeft[])(struct ObjectEvent *, struct Sprite *);
u8 (*const gMovementActionFuncs_WalkInPlaceFastRight[])(struct ObjectEvent *, struct Sprite *);
u8 (*const gMovementActionFuncs_WalkInPlaceFastestDown[])(struct ObjectEvent *, struct Sprite *);
u8 (*const gMovementActionFuncs_ExitPokeball[])(struct ObjectEvent *, struct Sprite *);
u8 (*const gMovementActionFuncs_EnterPokeball[])(struct ObjectEvent *, struct Sprite *);
u8 (*const gMovementActionFuncs_WalkInPlaceFastestUp[])(struct ObjectEvent *, struct Sprite *);
u8 (*const gMovementActionFuncs_WalkInPlaceFastestLeft[])(struct ObjectEvent *, struct Sprite *);
u8 (*const gMovementActionFuncs_WalkInPlaceFastestRight[])(struct ObjectEvent *, struct Sprite *);
@ -580,6 +586,8 @@ u8 (*const *const gMovementActionFuncs[])(struct ObjectEvent *, struct Sprite *)
[MOVEMENT_ACTION_FIGURE_8] = gMovementActionFuncs_Figure8,
[MOVEMENT_ACTION_FLY_UP] = gMovementActionFuncs_FlyUp,
[MOVEMENT_ACTION_FLY_DOWN] = gMovementActionFuncs_FlyDown,
[MOVEMENT_ACTION_EXIT_POKEBALL] = gMovementActionFuncs_ExitPokeball,
[MOVEMENT_ACTION_ENTER_POKEBALL] = gMovementActionFuncs_EnterPokeball,
};
u8 (*const gMovementActionFuncs_FaceDown[])(struct ObjectEvent *, struct Sprite *) = {
@ -865,6 +873,18 @@ u8 (*const gMovementActionFuncs_WalkInPlaceFastestDown[])(struct ObjectEvent *,
MovementAction_PauseSpriteAnim,
};
u8 (*const gMovementActionFuncs_ExitPokeball[])(struct ObjectEvent *, struct Sprite *) = {
MovementAction_ExitPokeball_Step0,
MovementAction_ExitPokeball_Step1,
MovementAction_PauseSpriteAnim,
};
u8 (*const gMovementActionFuncs_EnterPokeball[])(struct ObjectEvent *, struct Sprite *) = {
MovementAction_EnterPokeball_Step0,
MovementAction_EnterPokeball_Step1,
MovementAction_PauseSpriteAnim,
};
u8 (*const gMovementActionFuncs_WalkInPlaceFastestUp[])(struct ObjectEvent *, struct Sprite *) = {
MovementAction_WalkInPlaceFastestUp_Step0,
MovementAction_WalkInPlace_Step1,

View File

@ -410,7 +410,7 @@ u8 (*const gMovementTypeFuncs_FollowPlayer[])(struct ObjectEvent *, struct Sprit
bool8 (*const gFollowPlayerMovementFuncs[])(struct ObjectEvent *, struct Sprite *, u8, bool8(u8)) = {
FollowablePlayerMovement_Idle,
FollowablePlayerMovement_Idle,
FollowablePlayerMovement_GoSpeed0,
FollowablePlayerMovement_Step,
FollowablePlayerMovement_GoSpeed1,
FollowablePlayerMovement_GoSpeed2,
FollowablePlayerMovement_Slide,

View File

@ -181,24 +181,43 @@ const union AnimCmd gObjectEventImageAnim_FaceSouth[] =
ANIMCMD_JUMP(0),
};
const union AnimCmd gObjectEventImageAnim_FaceNorth[] =
{
ANIMCMD_FRAME(1, 16),
ANIMCMD_JUMP(0),
};
const union AnimCmd gObjectEventImageAnim_FaceNorth2F[] =
{
ANIMCMD_FRAME(2, 16),
ANIMCMD_JUMP(0),
};
const union AnimCmd gObjectEventImageAnim_FaceWest[] =
{
ANIMCMD_FRAME(2, 16),
ANIMCMD_JUMP(0),
};
const union AnimCmd gObjectEventImageAnim_FaceWest2F[] =
{
ANIMCMD_FRAME(4, 16),
ANIMCMD_JUMP(0),
};
const union AnimCmd gObjectEventImageAnim_FaceEast[] =
{
ANIMCMD_FRAME(2, 16, .hFlip = TRUE),
ANIMCMD_JUMP(0),
};
const union AnimCmd gObjectEventImageAnim_FaceEast2F[] =
{
ANIMCMD_FRAME(4, 16, .hFlip = TRUE),
ANIMCMD_JUMP(0),
};
const union AnimCmd gObjectEventImageAnim_GoSouth[] =
{
ANIMCMD_FRAME(3, 8),
@ -210,9 +229,9 @@ const union AnimCmd gObjectEventImageAnim_GoSouth[] =
const union AnimCmd gObjectEventImageAnim_GoSouth2F[] =
{
ANIMCMD_FRAME(3, 6),
ANIMCMD_FRAME(4, 6),
ANIMCMD_FRAME(4, 6),
ANIMCMD_FRAME(0, 6),
ANIMCMD_FRAME(1, 6),
ANIMCMD_FRAME(1, 6),
ANIMCMD_FRAME(0, 6),
ANIMCMD_JUMP(0),
};
@ -228,11 +247,11 @@ const union AnimCmd gObjectEventImageAnim_GoNorth[] =
const union AnimCmd gObjectEventImageAnim_GoNorth2F[] =
{
ANIMCMD_FRAME(5, 6),
ANIMCMD_FRAME(6, 6),
ANIMCMD_FRAME(6, 6),
ANIMCMD_FRAME(1, 6),
ANIMCMD_JUMP(0),
ANIMCMD_FRAME(2, 6),
ANIMCMD_FRAME(3, 6),
ANIMCMD_FRAME(3, 6),
ANIMCMD_FRAME(2, 6),
ANIMCMD_JUMP(0),
};
const union AnimCmd gObjectEventImageAnim_GoWest[] =
@ -246,10 +265,10 @@ const union AnimCmd gObjectEventImageAnim_GoWest[] =
const union AnimCmd gObjectEventImageAnim_GoWest2F[] =
{
ANIMCMD_FRAME(7, 6),
ANIMCMD_FRAME(8, 6),
ANIMCMD_FRAME(8, 6),
ANIMCMD_FRAME(2, 6),
ANIMCMD_FRAME(4, 6),
ANIMCMD_FRAME(5, 6),
ANIMCMD_FRAME(5, 6),
ANIMCMD_FRAME(4, 6),
ANIMCMD_JUMP(0),
};
@ -264,10 +283,10 @@ const union AnimCmd gObjectEventImageAnim_GoEast[] =
const union AnimCmd gObjectEventImageAnim_GoEast2F[] =
{
ANIMCMD_FRAME(7, 6, .hFlip = TRUE),
ANIMCMD_FRAME(8, 6, .hFlip = TRUE),
ANIMCMD_FRAME(8, 6, .hFlip = TRUE),
ANIMCMD_FRAME(2, 6, .hFlip = TRUE),
ANIMCMD_FRAME(4, 6, .hFlip = TRUE),
ANIMCMD_FRAME(5, 6, .hFlip = TRUE),
ANIMCMD_FRAME(5, 6, .hFlip = TRUE),
ANIMCMD_FRAME(4, 6, .hFlip = TRUE),
ANIMCMD_JUMP(0),
};
@ -280,6 +299,15 @@ const union AnimCmd gObjectEventImageAnim_GoFastSouth[] =
ANIMCMD_JUMP(0),
};
const union AnimCmd gObjectEventImageAnim_GoFastSouth2F[] =
{
ANIMCMD_FRAME(0, 4),
ANIMCMD_FRAME(1, 4),
ANIMCMD_FRAME(1, 4),
ANIMCMD_FRAME(0, 4),
ANIMCMD_JUMP(0),
};
const union AnimCmd gObjectEventImageAnim_GoFastNorth[] =
{
ANIMCMD_FRAME(5, 4),
@ -289,6 +317,15 @@ const union AnimCmd gObjectEventImageAnim_GoFastNorth[] =
ANIMCMD_JUMP(0),
};
const union AnimCmd gObjectEventImageAnim_GoFastNorth2F[] =
{
ANIMCMD_FRAME(2, 4),
ANIMCMD_FRAME(3, 4),
ANIMCMD_FRAME(3, 4),
ANIMCMD_FRAME(2, 4),
ANIMCMD_JUMP(0),
};
const union AnimCmd gObjectEventImageAnim_GoFastWest[] =
{
ANIMCMD_FRAME(7, 4),
@ -298,6 +335,15 @@ const union AnimCmd gObjectEventImageAnim_GoFastWest[] =
ANIMCMD_JUMP(0),
};
const union AnimCmd gObjectEventImageAnim_GoFastWest2F[] =
{
ANIMCMD_FRAME(4, 4),
ANIMCMD_FRAME(5, 4),
ANIMCMD_FRAME(5, 4),
ANIMCMD_FRAME(4, 4),
ANIMCMD_JUMP(0),
};
const union AnimCmd gObjectEventImageAnim_GoFastEast[] =
{
ANIMCMD_FRAME(7, 4, .hFlip = TRUE),
@ -307,6 +353,15 @@ const union AnimCmd gObjectEventImageAnim_GoFastEast[] =
ANIMCMD_JUMP(0),
};
const union AnimCmd gObjectEventImageAnim_GoFastEast2F[] =
{
ANIMCMD_FRAME(4, 4, .hFlip = TRUE),
ANIMCMD_FRAME(5, 4, .hFlip = TRUE),
ANIMCMD_FRAME(5, 4, .hFlip = TRUE),
ANIMCMD_FRAME(4, 4, .hFlip = TRUE),
ANIMCMD_JUMP(0),
};
const union AnimCmd gObjectEventImageAnim_GoFasterSouth[] =
{
ANIMCMD_FRAME(3, 2),
@ -316,6 +371,31 @@ const union AnimCmd gObjectEventImageAnim_GoFasterSouth[] =
ANIMCMD_JUMP(0),
};
const union AnimCmd gObjectEventImageAnim_ExitPokeball[] =
{
ANIMCMD_FRAME(0, 1),
ANIMCMD_FRAME(0, 3),
ANIMCMD_FRAME(0, 1),
ANIMCMD_FRAME(1, 1),
ANIMCMD_FRAME(2, 1),
ANIMCMD_FRAME(3, 1),
ANIMCMD_FRAME(4, 1),
ANIMCMD_FRAME(0, 6),
ANIMCMD_JUMP(0),
};
const union AnimCmd gObjectEventImageAnim_EnterSouth[] =
{
ANIMCMD_FRAME(0, 8),
ANIMCMD_FRAME(4, 1),
ANIMCMD_FRAME(3, 1),
ANIMCMD_FRAME(2, 1),
ANIMCMD_FRAME(1, 1),
ANIMCMD_FRAME(0, 1),
ANIMCMD_FRAME(0, 3),
ANIMCMD_JUMP(0),
};
const union AnimCmd gObjectEventImageAnim_GoFasterNorth[] =
{
ANIMCMD_FRAME(5, 2),
@ -325,6 +405,18 @@ const union AnimCmd gObjectEventImageAnim_GoFasterNorth[] =
ANIMCMD_JUMP(0),
};
const union AnimCmd gObjectEventImageAnim_EnterNorth[] =
{
ANIMCMD_FRAME(2, 8),
ANIMCMD_FRAME(4, 1),
ANIMCMD_FRAME(3, 1),
ANIMCMD_FRAME(2, 1),
ANIMCMD_FRAME(1, 1),
ANIMCMD_FRAME(0, 1),
ANIMCMD_FRAME(0, 3),
ANIMCMD_JUMP(0),
};
const union AnimCmd gObjectEventImageAnim_GoFasterWest[] =
{
ANIMCMD_FRAME(7, 2),
@ -334,6 +426,18 @@ const union AnimCmd gObjectEventImageAnim_GoFasterWest[] =
ANIMCMD_JUMP(0),
};
const union AnimCmd gObjectEventImageAnim_EnterWest[] =
{
ANIMCMD_FRAME(4, 8),
ANIMCMD_FRAME(4, 1),
ANIMCMD_FRAME(3, 1),
ANIMCMD_FRAME(2, 1),
ANIMCMD_FRAME(1, 1),
ANIMCMD_FRAME(0, 1),
ANIMCMD_FRAME(0, 3),
ANIMCMD_JUMP(0),
};
const union AnimCmd gObjectEventImageAnim_GoFasterEast[] =
{
ANIMCMD_FRAME(7, 2, .hFlip = TRUE),
@ -343,6 +447,18 @@ const union AnimCmd gObjectEventImageAnim_GoFasterEast[] =
ANIMCMD_JUMP(0),
};
const union AnimCmd gObjectEventImageAnim_EnterEast[] =
{
ANIMCMD_FRAME(4, 8, .hFlip = TRUE),
ANIMCMD_FRAME(4, 1),
ANIMCMD_FRAME(3, 1),
ANIMCMD_FRAME(2, 1),
ANIMCMD_FRAME(1, 1),
ANIMCMD_FRAME(0, 1),
ANIMCMD_FRAME(0, 3),
ANIMCMD_JUMP(0),
};
const union AnimCmd gObjectEventImageAnim_GoFastestSouth[] =
{
ANIMCMD_FRAME(3, 1),
@ -352,6 +468,18 @@ const union AnimCmd gObjectEventImageAnim_GoFastestSouth[] =
ANIMCMD_JUMP(0),
};
const union AnimCmd gObjectEventImageAnim_ExitPokeballFast[] =
{
ANIMCMD_FRAME(0, 1),
ANIMCMD_FRAME(1, 1),
ANIMCMD_FRAME(2, 1),
ANIMCMD_FRAME(3, 1),
ANIMCMD_FRAME(4, 1),
ANIMCMD_FRAME(0, 1),
ANIMCMD_FRAME(0, 1),
ANIMCMD_JUMP(0),
};
const union AnimCmd gObjectEventImageAnim_GoFastestNorth[] =
{
ANIMCMD_FRAME(5, 1),
@ -883,25 +1011,25 @@ const union AnimCmd *const gObjectEventImageAnimTable_Standard[] = {
const union AnimCmd *const gObjectEventImageAnimTable_Following[] = {
gObjectEventImageAnim_FaceSouth,
gObjectEventImageAnim_FaceNorth,
gObjectEventImageAnim_FaceWest,
gObjectEventImageAnim_FaceEast,
gObjectEventImageAnim_FaceNorth2F,
gObjectEventImageAnim_FaceWest2F,
gObjectEventImageAnim_FaceEast2F,
gObjectEventImageAnim_GoSouth2F,
gObjectEventImageAnim_GoNorth2F,
gObjectEventImageAnim_GoWest2F,
gObjectEventImageAnim_GoEast2F,
gObjectEventImageAnim_GoFastSouth,
gObjectEventImageAnim_GoFastNorth,
gObjectEventImageAnim_GoFastWest,
gObjectEventImageAnim_GoFastEast,
gObjectEventImageAnim_GoFasterSouth,
gObjectEventImageAnim_GoFasterNorth,
gObjectEventImageAnim_GoFasterWest,
gObjectEventImageAnim_GoFasterEast,
gObjectEventImageAnim_GoFastestSouth,
gObjectEventImageAnim_GoFastestNorth,
gObjectEventImageAnim_GoFastestWest,
gObjectEventImageAnim_GoFastestEast,
gObjectEventImageAnim_GoFastSouth2F,
gObjectEventImageAnim_GoFastNorth2F,
gObjectEventImageAnim_GoFastWest2F,
gObjectEventImageAnim_GoFastEast2F,
gObjectEventImageAnim_EnterSouth,
gObjectEventImageAnim_EnterNorth,
gObjectEventImageAnim_EnterWest,
gObjectEventImageAnim_EnterEast,
gObjectEventImageAnim_ExitPokeball,
gObjectEventImageAnim_ExitPokeballFast,
gObjectEventImageAnim_ExitPokeball,
gObjectEventImageAnim_ExitPokeball,
};
const union AnimCmd *const gObjectEventImageAnimTable_HoOh[] = {
@ -1203,6 +1331,10 @@ const struct UnkStruct_085094AC gUnknown_085094AC[] = {
.anims = gObjectEventImageAnimTable_Standard,
.animPos = {1, 3, 0, 2},
},
{
.anims = gObjectEventImageAnimTable_Following,
.animPos = {1, 3, 0, 2},
},
{
.anims = gObjectEventImageAnimTable_BrendanMayNormal,
.animPos = {1, 3, 0, 2},

View File

@ -69,6 +69,8 @@ const u16 gObjectEventPal_Npc2Reflection[] = INCBIN_U16("graphics/object_events/
const u16 gObjectEventPal_Npc3Reflection[] = INCBIN_U16("graphics/object_events/palettes/npc_3_reflection.gbapal");
const u16 gObjectEventPal_Npc4Reflection[] = INCBIN_U16("graphics/object_events/palettes/npc_4_reflection.gbapal");
const u16 gObjectEventPaletteMarshtomp[] = INCBIN_U16("graphics/object_events/palettes/marshtomp.gbapal");
const u16 gObjectEventPaletteAltaria[] = INCBIN_U16("graphics/object_events/palettes/altaria.gbapal");
const u16 gObjectEventPaletteTogetic[] = INCBIN_U16("graphics/object_events/palettes/togetic.gbapal");
const u32 gObjectEventPic_NinjaBoy[] = INCBIN_U32("graphics/object_events/pics/people/ninja_boy.4bpp");
const u32 gObjectEventPic_Twin[] = INCBIN_U32("graphics/object_events/pics/people/twin.4bpp");
const u32 gObjectEventPic_Boy1[] = INCBIN_U32("graphics/object_events/pics/people/boy_1.4bpp");
@ -361,6 +363,8 @@ const u32 gObjectEventPic_Lugia[] = INCBIN_U32("graphics/object_events/pics/poke
const u16 gObjectEventPal_Lugia[] = INCBIN_U16("graphics/object_events/palettes/lugia.gbapal");
const u32 gObjectEventPic_HoOh[] = INCBIN_U32("graphics/object_events/pics/pokemon/ho_oh.4bpp");
const u16 gObjectEventPal_HoOh[] = INCBIN_U16("graphics/object_events/palettes/ho_oh.gbapal");
const u32 gObjectEventPic_AnimatedBall[] = INCBIN_U32("graphics/object_events/pics/misc/animated_ball.4bpp");
const u32 gObjectEventPic_Marshtomp[] = INCBIN_U32("graphics/object_events/pics/pokemon/marshtomp.4bpp");
const u32 gObjectEventPic_Altaria[] = INCBIN_U32("graphics/object_events/pics/pokemon/altaria.4bpp");
const u32 gObjectEventPic_Togetic[] = INCBIN_U32("graphics/object_events/pics/pokemon/togetic.4bpp");
const u16 gObjectEventPalette31[] = INCBIN_U16("graphics/object_events/palettes/31.gbapal");

View File

@ -243,5 +243,7 @@ const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_RubySapphireBrenda
const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_RubySapphireMay = {0xFFFF, OBJ_EVENT_PAL_TAG_RS_MAY, OBJ_EVENT_PAL_TAG_NONE, 256, 16, 32, 10, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_16x32, gObjectEventSpriteOamTables_16x32, gObjectEventImageAnimTable_Standard, gObjectEventPicTable_RubySapphireMay, gDummySpriteAffineAnimTable};
const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Lugia = {0xFFFF, OBJ_EVENT_PAL_TAG_LUGIA, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 10, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, gObjectEventSpriteOamTables_32x32, gObjectEventImageAnimTable_Standard, gObjectEventPicTable_Lugia, gDummySpriteAffineAnimTable};
const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_HoOh = {0xFFFF, OBJ_EVENT_PAL_TAG_HO_OH, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 10, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, gObjectEventSpriteOamTables_32x32, gObjectEventImageAnimTable_HoOh, gObjectEventPicTable_HoOh, gDummySpriteAffineAnimTable};
const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Marshtomp = {0xFFFF, OBJ_EVENT_PAL_TAG_MARSHTOMP, OBJ_EVENT_PAL_TAG_NONE, 256, 16, 32, 10, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_16x32, gObjectEventSpriteOamTables_16x32, gObjectEventImageAnimTable_Following, gObjectEventPicTable_Marshtomp, gDummySpriteAffineAnimTable};
const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Altaria = {0xFFFF, OBJ_EVENT_PAL_TAG_MARSHTOMP, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 10, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, gObjectEventSpriteOamTables_32x32, gObjectEventImageAnimTable_Following, gObjectEventPicTable_Altaria, gDummySpriteAffineAnimTable};
const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_AnimatedBall = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_2, OBJ_EVENT_PAL_TAG_NONE, 256, 16, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_16x32, gObjectEventSpriteOamTables_16x32, gObjectEventImageAnimTable_Following, gObjectEventPicTable_AnimatedBall, gDummySpriteAffineAnimTable};
const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Marshtomp = {0xFFFF, OBJ_EVENT_PAL_TAG_MARSHTOMP, OBJ_EVENT_PAL_TAG_NONE, 256, 16, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_16x32, gObjectEventSpriteOamTables_16x32, gObjectEventImageAnimTable_Following, gObjectEventPicTable_Marshtomp, gDummySpriteAffineAnimTable};
const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Altaria = {0xFFFF, OBJ_EVENT_PAL_TAG_ALTARIA, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, gObjectEventSpriteOamTables_32x32, gObjectEventImageAnimTable_Standard, gObjectEventPicTable_Altaria, gDummySpriteAffineAnimTable};
const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Togetic = {0xFFFF, OBJ_EVENT_PAL_TAG_TOGETIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, gObjectEventSpriteOamTables_32x32, gObjectEventImageAnimTable_Following, gObjectEventPicTable_Togetic, gDummySpriteAffineAnimTable};

View File

@ -237,8 +237,10 @@ const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_RubySapphireBrenda
const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_RubySapphireMay;
const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Lugia;
const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_HoOh;
const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_AnimatedBall;
const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Marshtomp;
const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Altaria;
const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Togetic;
const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Bard;
const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Hipster;
@ -489,8 +491,10 @@ const struct ObjectEventGraphicsInfo *const gObjectEventGraphicsInfoPointers[NUM
[OBJ_EVENT_GFX_LINK_RS_MAY] = &gObjectEventGraphicsInfo_RubySapphireMay,
[OBJ_EVENT_GFX_LUGIA] = &gObjectEventGraphicsInfo_Lugia,
[OBJ_EVENT_GFX_HOOH] = &gObjectEventGraphicsInfo_HoOh,
[OBJ_EVENT_GFX_ANIMATED_BALL] = &gObjectEventGraphicsInfo_AnimatedBall,
[OBJ_EVENT_GFX_MARSHTOMP] = &gObjectEventGraphicsInfo_Marshtomp,
[OBJ_EVENT_GFX_ALTARIA] = &gObjectEventGraphicsInfo_Altaria,
[OBJ_EVENT_GFX_TOGETIC] = &gObjectEventGraphicsInfo_Togetic,
};
const struct ObjectEventGraphicsInfo *const gMauvilleOldManGraphicsInfoPointers[] = {

View File

@ -2149,6 +2149,15 @@ const struct SpriteFrameImage gObjectEventPicTable_HoOh[] = {
overworld_frame(gObjectEventPic_HoOh, 4, 4, 1),
};
const struct SpriteFrameImage gObjectEventPicTable_AnimatedBall[] = {
overworld_frame(gObjectEventPic_AnimatedBall, 2, 4, 0),
overworld_frame(gObjectEventPic_AnimatedBall, 2, 4, 1),
overworld_frame(gObjectEventPic_AnimatedBall, 2, 4, 2),
overworld_frame(gObjectEventPic_AnimatedBall, 2, 4, 3),
overworld_frame(gObjectEventPic_AnimatedBall, 2, 4, 4),
overworld_frame(gObjectEventPic_AnimatedBall, 2, 4, 5),
};
const struct SpriteFrameImage gObjectEventPicTable_Marshtomp[] = {
overworld_frame(gObjectEventPic_Marshtomp, 2, 4, 0),
overworld_frame(gObjectEventPic_Marshtomp, 2, 4, 1),
@ -2156,9 +2165,6 @@ const struct SpriteFrameImage gObjectEventPicTable_Marshtomp[] = {
overworld_frame(gObjectEventPic_Marshtomp, 2, 4, 3),
overworld_frame(gObjectEventPic_Marshtomp, 2, 4, 4),
overworld_frame(gObjectEventPic_Marshtomp, 2, 4, 5),
overworld_frame(gObjectEventPic_Marshtomp, 2, 4, 6),
overworld_frame(gObjectEventPic_Marshtomp, 2, 4, 7),
overworld_frame(gObjectEventPic_Marshtomp, 2, 4, 8),
};
const struct SpriteFrameImage gObjectEventPicTable_Altaria[] = {
@ -2173,6 +2179,15 @@ const struct SpriteFrameImage gObjectEventPicTable_Altaria[] = {
overworld_frame(gObjectEventPic_Altaria, 4, 4, 8),
};
const struct SpriteFrameImage gObjectEventPicTable_Togetic[] = {
overworld_frame(gObjectEventPic_Togetic, 4, 4, 0),
overworld_frame(gObjectEventPic_Togetic, 4, 4, 1),
overworld_frame(gObjectEventPic_Togetic, 4, 4, 2),
overworld_frame(gObjectEventPic_Togetic, 4, 4, 3),
overworld_frame(gObjectEventPic_Togetic, 4, 4, 4),
overworld_frame(gObjectEventPic_Togetic, 4, 4, 5),
};
const struct SpriteFrameImage gObjectEventPicTable_RubySapphireBrendan[] = {
overworld_frame(gObjectEventPic_RubySapphireBrendanNormal, 2, 4, 0),
overworld_frame(gObjectEventPic_RubySapphireBrendanNormal, 2, 4, 1),

View File

@ -16,6 +16,7 @@
#include "metatile_behavior.h"
#include "overworld.h"
#include "palette.h"
#include "pokemon.h"
#include "random.h"
#include "sprite.h"
#include "task.h"
@ -27,6 +28,7 @@
#include "constants/field_effects.h"
#include "constants/items.h"
#include "constants/mauville_old_man.h"
#include "constants/species.h"
#include "constants/trainer_types.h"
#include "constants/union_room.h"
@ -440,6 +442,8 @@ const u8 gInitialMovementTypeFacingDirections[] = {
#define OBJ_EVENT_PAL_TAG_RS_BRENDAN 0x1122
#define OBJ_EVENT_PAL_TAG_RS_MAY 0x1123
#define OBJ_EVENT_PAL_TAG_MARSHTOMP 0x1124
#define OBJ_EVENT_PAL_TAG_ALTARIA 0x1125
#define OBJ_EVENT_PAL_TAG_TOGETIC 0x1126
#define OBJ_EVENT_PAL_TAG_NONE 0x11FF
#include "data/object_events/object_event_graphics_info_pointers.h"
@ -487,6 +491,8 @@ static const struct SpritePalette sObjectEventSpritePalettes[] = {
{gObjectEventPal_RubySapphireBrendan, OBJ_EVENT_PAL_TAG_RS_BRENDAN},
{gObjectEventPal_RubySapphireMay, OBJ_EVENT_PAL_TAG_RS_MAY},
{gObjectEventPaletteMarshtomp, OBJ_EVENT_PAL_TAG_MARSHTOMP},
{gObjectEventPaletteAltaria, OBJ_EVENT_PAL_TAG_ALTARIA},
{gObjectEventPaletteTogetic, OBJ_EVENT_PAL_TAG_TOGETIC},
{NULL, 0x0000},
};
@ -1368,24 +1374,8 @@ static u8 TrySetupObjectEventSprite(struct ObjectEventTemplate *objectEventTempl
objectEvent = &gObjectEvents[objectEventId];
graphicsInfo = GetObjectEventGraphicsInfo(objectEvent->graphicsId);
<<<<<<< HEAD
paletteSlot = graphicsInfo->paletteSlot;
if (paletteSlot == 0)
{
LoadPlayerObjectReflectionPalette(graphicsInfo->paletteTag, 0);
}
else if (paletteSlot == 10)
{
LoadSpecialObjectReflectionPalette(graphicsInfo->paletteTag, 10);
}
else if (paletteSlot >= 16)
{
paletteSlot -= 16;
sub_808EAB0(graphicsInfo->paletteTag, paletteSlot);
=======
if (spriteTemplate->paletteTag != 0xffff) {
LoadObjectEventPalette(spriteTemplate->paletteTag);
>>>>>>> ecbde8db7 (Added dynamic overworld palettes (github.com/pret/pokeemerald/wiki/Dynamic-overworld-palette-system))
}
if (objectEvent->movementType == MOVEMENT_TYPE_INVISIBLE)
@ -1585,24 +1575,107 @@ u8 CreateObjectSprite(u8 graphicsId, u8 a1, s16 x, s16 y, u8 z, u8 direction)
return spriteId;
}
u8 SpawnFollowingPokemon(void) {
u8 SpeciesToGraphicsId(u16 species) { // TODO: Eventually graphicsIds will have to be u16's
switch (species) {
case SPECIES_MARSHTOMP:
return OBJ_EVENT_GFX_MARSHTOMP;
break;
case SPECIES_ALTARIA:
return OBJ_EVENT_GFX_ALTARIA;
break;
case SPECIES_TOGETIC:
return OBJ_EVENT_GFX_TOGETIC;
break;
default:
return OBJ_EVENT_GFX_DUSCLOPS; // TODO: Change this
}
}
struct Pokemon * GetFirstLiveMon(void) { // Return address of first conscious party mon or NULL
struct Pokemon *mon;
u8 i;
for (i=0; i<PARTY_SIZE;i++) {
if (gPlayerParty[i].hp > 0 && !(gPlayerParty[i].box.isEgg || gPlayerParty[i].box.isBadEgg)) {
return &gPlayerParty[i];
}
}
return NULL;
}
u8 SpawnFollowingPokemon(void) { // Spawn a following pokemon TODO: Avoid this on certain maps
struct Pokemon *mon;
u8 graphicsId;
u8 objectEventId;
struct ObjectEventTemplate template = {0};
template.localId = 0xFE;
template.graphicsId = OBJ_EVENT_GFX_MARSHTOMP;
template.localId = OBJ_EVENT_ID_FOLLOWER;
mon = GetFirstLiveMon();
if (mon == NULL) { // fainted party, don't spawn an object TODO
return 0;
}
template.graphicsId = SpeciesToGraphicsId(GetMonData(mon, MON_DATA_SPECIES));
template.x = gSaveBlock1Ptr->pos.x;
template.y = gSaveBlock1Ptr->pos.y;
template.elevation = 5;
template.movementType = MOVEMENT_TYPE_FOLLOW_PLAYER;
template.trainerType = 0xFE;
template.script = NULL;
// template.script = EventScript_Follower; // This does nothing because scripts are templated
objectEventId = SpawnSpecialObjectEvent(&template);
gObjectEvents[objectEventId].invisible = TRUE;
gObjectEvents[objectEventId].hasShadow = TRUE;
return objectEventId;
}
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;
}
}
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->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;
}
}
if (objectEvent == NULL) {
return;
}
RemoveObjectEvent(objectEvent);
}
static bool8 IsFollowerVisible(void) { // Determine whether follower should be visible
return !TestPlayerAvatarFlags(PLAYER_AVATAR_FLAG_SURFING | PLAYER_AVATAR_FLAG_ACRO_BIKE | PLAYER_AVATAR_FLAG_MACH_BIKE);
}
void TrySpawnObjectEvents(s16 cameraX, s16 cameraY)
{
u8 i;
@ -1720,28 +1793,9 @@ static void sub_808E1B8(u8 objectEventId, s16 x, s16 y)
spriteFrameImage.size = graphicsInfo->size;
MakeObjectTemplateFromObjectEventGraphicsInfoWithCallbackIndex(objectEvent->graphicsId, objectEvent->movementType, &spriteTemplate, &subspriteTables);
spriteTemplate.images = &spriteFrameImage;
<<<<<<< HEAD
*(u16 *)&spriteTemplate.paletteTag = 0xFFFF;
paletteSlot = graphicsInfo->paletteSlot;
if (paletteSlot == 0)
{
LoadPlayerObjectReflectionPalette(graphicsInfo->paletteTag, graphicsInfo->paletteSlot);
}
else if (paletteSlot == 10)
{
LoadSpecialObjectReflectionPalette(graphicsInfo->paletteTag, graphicsInfo->paletteSlot);
}
else if (paletteSlot >= 16)
{
paletteSlot -= 16;
sub_808EAB0(graphicsInfo->paletteTag, paletteSlot);
}
*(u16 *)&spriteTemplate.paletteTag = 0xFFFF;
=======
if (spriteTemplate.paletteTag != 0xffff) {
LoadObjectEventPalette(spriteTemplate.paletteTag);
}
>>>>>>> ecbde8db7 (Added dynamic overworld palettes (github.com/pret/pokeemerald/wiki/Dynamic-overworld-palette-system))
spriteId = CreateSprite(&spriteTemplate, 0, 0, 0);
if (spriteId != MAX_SPRITES)
{
@ -1798,30 +1852,40 @@ void ObjectEventSetGraphicsId(struct ObjectEvent *objectEvent, u8 graphicsId)
{
const struct ObjectEventGraphicsInfo *graphicsInfo;
struct Sprite *sprite;
u8 paletteSlot;
u16 i;
u8 paletteNum;
u16 *debugPtr = (u16*) 0x0203d008;
graphicsInfo = GetObjectEventGraphicsInfo(graphicsId);
sprite = &gSprites[objectEvent->spriteId];
paletteSlot = graphicsInfo->paletteSlot;
if (paletteSlot == 0)
{
PatchObjectPalette(graphicsInfo->paletteTag, graphicsInfo->paletteSlot);
}
else if (paletteSlot == 10)
{
LoadSpecialObjectReflectionPalette(graphicsInfo->paletteTag, graphicsInfo->paletteSlot);
}
else if (paletteSlot >= 16)
{
paletteSlot -= 16;
sub_808EAB0(graphicsInfo->paletteTag, paletteSlot);
*debugPtr = graphicsId;
*(debugPtr + 1) = graphicsInfo->paletteSlot;
if (graphicsInfo->paletteSlot == 0) { // Hack until I can fix this
PatchObjectPalette(graphicsInfo->paletteTag1, graphicsInfo->paletteSlot);
paletteNum = 0;
} else {
paletteNum = sprite->oam.paletteNum;
// Free old palette if otherwise unused
sprite->inUse = FALSE;
FieldEffectFreePaletteIfUnused(paletteNum);
sprite->inUse = TRUE;
i = FindObjectEventPaletteIndexByTag(graphicsInfo->paletteTag1);
*(debugPtr + 2) = i;
paletteNum = IndexOfSpritePaletteTag(sObjectEventSpritePalettes[i].tag);
*(debugPtr + 3) = paletteNum;
if (paletteNum == 0xFF) { // Load palette
paletteNum = LoadSpritePalette(&sObjectEventSpritePalettes[i]);
}
}
*(debugPtr + 4) = paletteNum;
sprite->oam.paletteNum = paletteNum;
*((u32*) (debugPtr + 6)) = (u32) &sprite->oam;
sprite->oam.shape = graphicsInfo->oam->shape;
sprite->oam.size = graphicsInfo->oam->size;
sprite->images = graphicsInfo->images;
sprite->anims = graphicsInfo->anims;
sprite->subspriteTables = graphicsInfo->subspriteTables;
sprite->oam.paletteNum = paletteSlot;
objectEvent->inanimate = graphicsInfo->inanimate;
objectEvent->graphicsId = graphicsId;
SetSpritePosToMapCoords(objectEvent->currentCoords.x, objectEvent->currentCoords.y, &sprite->pos1.x, &sprite->pos1.y);
@ -2374,6 +2438,9 @@ void SetObjectEventDirection(struct ObjectEvent *objectEvent, u8 direction)
static const u8 *GetObjectEventScriptPointerByLocalIdAndMap(u8 localId, u8 mapNum, u8 mapGroup)
{
if (localId == OBJ_EVENT_ID_FOLLOWER) {
return EventScript_Follower;
}
return GetObjectEventTemplateByLocalIdAndMap(localId, mapNum, mapGroup)->script;
}
@ -4461,7 +4528,11 @@ movement_type_def(MovementType_FollowPlayer, gMovementTypeFuncs_FollowPlayer)
bool8 MovementType_FollowPlayer_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite)
{
ClearObjectEventMovement(objectEvent, sprite);
if (TestPlayerAvatarFlags(PLAYER_AVATAR_FLAG_SURFING | PLAYER_AVATAR_FLAG_ACRO_BIKE | PLAYER_AVATAR_FLAG_MACH_BIKE)) {
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;
@ -4472,10 +4543,10 @@ bool8 MovementType_FollowPlayer_Step0(struct ObjectEvent *objectEvent, struct Sp
bool8 MovementType_FollowPlayer_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite)
{
if (gObjectEvents[gPlayerAvatar.objectEventId].movementActionId == 0xFF || gPlayerAvatar.tileTransitionState == T_TILE_CENTER)
{
if (gObjectEvents[gPlayerAvatar.objectEventId].movementActionId == 0xFF || gPlayerAvatar.tileTransitionState == T_TILE_CENTER) { // do nothing if player is stationary
return FALSE;
}
// TODO: Remove dependence on PlayerGetCopyableMovement
return gFollowPlayerMovementFuncs[PlayerGetCopyableMovement()](objectEvent, sprite, GetPlayerMovementDirection(), NULL);
}
@ -4486,55 +4557,67 @@ bool8 MovementType_FollowPlayer_Step2(struct ObjectEvent *objectEvent, struct Sp
objectEvent->singleMovementActive = 0;
sprite->data[1] = 1;
}
objectEvent->invisible = FALSE;
return FALSE;
}
bool8 FollowablePlayerMovement_Idle(struct ObjectEvent *objectEvent, struct Sprite *sprite, u8 playerDirection, bool8 tileCallback(u8))
{
if (!objectEvent->singleMovementActive) {
u8 direction;
if (!IsFollowerVisible()) { // Animate entering pokeball
if (objectEvent->invisible) {
return FALSE;
}
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
return TRUE;
} else if (!objectEvent->singleMovementActive) { // walk in place
ObjectEventSetSingleMovement(objectEvent, sprite, GetWalkInPlaceNormalMovementAction(objectEvent->facingDirection));
objectEvent->singleMovementActive = 1;
return TRUE;
}
if (ObjectEventExecSingleMovementAction(objectEvent, sprite)) {
} else if (ObjectEventExecSingleMovementAction(objectEvent, sprite)) { // finish movement action
objectEvent->singleMovementActive = 0;
}
return FALSE;
}
bool8 FollowablePlayerMovement_GoSpeed0(struct ObjectEvent *objectEvent, struct Sprite *sprite, u8 playerDirection, bool8 tileCallback(u8))
bool8 FollowablePlayerMovement_Step(struct ObjectEvent *objectEvent, struct Sprite *sprite, u8 playerDirection, bool8 tileCallback(u8))
{
u32 direction;
s16 x;
s16 y;
s16 targetX;
s16 targetY;
u32 *debugPtr;
debugPtr = (u32*) 0x0203d000;
u32 *debugPtr = (u32*) 0x0203d000;
*(debugPtr) = (u32) &sprite->data[0];
targetX = gObjectEvents[gPlayerAvatar.objectEventId].previousCoords.x;
targetY = gObjectEvents[gPlayerAvatar.objectEventId].previousCoords.y;
x = gObjectEvents[gPlayerAvatar.objectEventId].currentCoords.x;
y = gObjectEvents[gPlayerAvatar.objectEventId].currentCoords.y;
*debugPtr = (u32) x + (y << 16);
*(debugPtr + 1) = (u32) targetX + (targetY << 16);
if (x == targetX && y == targetY) { // don't move if the player collided
if ((x == targetX && y == targetY) || !IsFollowerVisible()) { // don't move on player collision or if not visible
return FALSE;
}
x = objectEvent->currentCoords.x;
y = objectEvent->currentCoords.y;
*(debugPtr + 2) = (u32) x + (y << 16);
if (x == targetX && y == targetY) { // don't move if already in the player's last position
ClearObjectEventMovement(objectEvent, sprite);
if (objectEvent->invisible) { // Animate exiting pokeball
MoveObjectEventToMapCoords(objectEvent, targetX, targetY);
ObjectEventSetSingleMovement(objectEvent, sprite, MOVEMENT_ACTION_EXIT_POKEBALL);
objectEvent->singleMovementActive = 1;
sprite->animCmdIndex = 0; // Needed because of weird animCmdIndex stuff
sprite->data[1] = 2;
return TRUE;
} else if (x == targetX && y == targetY) { // don't move if already in the player's last position
return FALSE;
}
ClearObjectEventMovement(objectEvent, sprite);
// Change state to invisible
if (TestPlayerAvatarFlags(PLAYER_AVATAR_FLAG_SURFING | PLAYER_AVATAR_FLAG_ACRO_BIKE | PLAYER_AVATAR_FLAG_MACH_BIKE)) {
objectEvent->invisible = TRUE;
sprite->data[1] = 0;
return FALSE;
}
objectEvent->invisible = FALSE;
// Follow player
direction = GetDirectionToFace(x, y, targetX, targetY);
ObjectEventMoveDestCoords(objectEvent, direction, &x, &y);
if (TestPlayerAvatarFlags(PLAYER_AVATAR_FLAG_DASH)) { // Set follow speed accordingly
@ -5059,7 +5142,7 @@ static bool8 DoesObjectCollideWithObjectAt(struct ObjectEvent *objectEvent, s16
for (i = 0; i < OBJECT_EVENTS_COUNT; i++)
{
curObject = &gObjectEvents[i];
if (curObject->active && (curObject->trainerType != 0xFE || objectEvent != &gObjectEvents[gPlayerAvatar.objectEventId]) && curObject != objectEvent)
if (curObject->active && (curObject->movementType != MOVEMENT_TYPE_FOLLOW_PLAYER || objectEvent != &gObjectEvents[gPlayerAvatar.objectEventId]) && curObject != objectEvent)
{
if ((curObject->currentCoords.x == x && curObject->currentCoords.y == y) || (curObject->previousCoords.x == x && curObject->previousCoords.y == y))
{
@ -6066,6 +6149,87 @@ bool8 MovementAction_WalkInPlaceSlowDown_Step0(struct ObjectEvent *objectEvent,
return MovementAction_WalkInPlaceSlow_Step1(objectEvent, sprite);
}
// Copy and load objectEvent's palette, but set all opaque colors to white
static u8 LoadWhiteFlashPalette(struct ObjectEvent *objectEvent, struct Sprite *sprite) {
struct SpritePalette dynamicPalette;
u16 paletteData[16];
u16 i = GetObjectEventGraphicsInfo(objectEvent->graphicsId)->paletteTag1;
u8 j;
i = FindObjectEventPaletteIndexByTag(i);
dynamicPalette.tag = OBJ_EVENT_PAL_TAG_NONE-1; // TODO: Use a proper palette tag here
dynamicPalette.data = paletteData;
paletteData[0] = sObjectEventSpritePalettes[i].data[0];
for (j=1; j<16; j++) {
paletteData[j] = 0xFFFF;
}
sprite->oam.paletteNum = LoadSpritePalette(&dynamicPalette);
return sprite->oam.paletteNum;
}
bool8 MovementAction_ExitPokeball_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) {
if (TestPlayerAvatarFlags(PLAYER_AVATAR_FLAG_DASH)) {
sub_8094554(objectEvent, sprite, DIR_SOUTH, GetMoveDirectionFastestAnimNum(DIR_NORTH), 8);
sprite->data[7] = 0; // fast speed
} else {
sub_8094554(objectEvent, sprite, DIR_SOUTH, GetMoveDirectionFastestAnimNum(DIR_SOUTH), 16);
sprite->data[7] = 1; // slow speed
}
sprite->data[6] = objectEvent->graphicsId;
ObjectEventSetGraphicsId(objectEvent, OBJ_EVENT_GFX_ANIMATED_BALL);
return MovementAction_ExitPokeball_Step1(objectEvent, sprite);
}
bool8 MovementAction_ExitPokeball_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite)
{
u8 duration = sprite->data[7] & 0xF;
sprite->data[3]--;
if (sprite->data[3] == 0)
{
sprite->data[2] = 2;
sprite->animPaused = TRUE;
return TRUE;
// Restore graphicsId and set palette to white
} else if ((duration == 0 && sprite->data[3] == 3) || (duration == 1 && sprite->data[3] == 7)) {
ObjectEventSetGraphicsId(objectEvent, sprite->data[6]);
sprite->data[7] = (sprite->oam.paletteNum << 4) | (sprite->data[7] & 0xFF0F); // Save old paletteNum
LoadWhiteFlashPalette(objectEvent, sprite);
// Restore original palette
} else if ((duration == 0 && sprite->data[3] == 1) || (duration == 1 && sprite->data[3] == 3)) {
FreeSpritePaletteByTag(OBJ_EVENT_PAL_TAG_NONE-1);
sprite->oam.paletteNum = (sprite->data[7] >> 4) & 0xF;
}
return FALSE;
}
bool8 MovementAction_EnterPokeball_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) {
u8 direction = objectEvent->facingDirection;
sub_8094554(objectEvent, sprite, direction, GetMoveDirectionFasterAnimNum(direction), 16);
sprite->data[7] = 1; // slow speed
sprite->data[6] = objectEvent->graphicsId;
return MovementAction_EnterPokeball_Step1(objectEvent, sprite);
}
bool8 MovementAction_EnterPokeball_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite)
{
sprite->data[3]--;
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;
} 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
FreeSpritePaletteByTag(OBJ_EVENT_PAL_TAG_NONE-1);
ObjectEventSetGraphicsId(objectEvent, OBJ_EVENT_GFX_ANIMATED_BALL);
}
return FALSE;
}
bool8 MovementAction_WalkInPlaceSlowUp_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite)
{
sub_8094554(objectEvent, sprite, DIR_NORTH, GetMoveDirectionAnimNum(DIR_NORTH), 32);
@ -7849,7 +8013,8 @@ static void GetGroundEffectFlags_ShallowFlowingWater(struct ObjectEvent *objEven
|| (MetatileBehavior_IsPacifidlogLog(objEvent->currentMetatileBehavior)
&& MetatileBehavior_IsPacifidlogLog(objEvent->previousMetatileBehavior)))
{
if (!objEvent->inShallowFlowingWater)
// Only set flags if objEvent leaves tracks
if (!objEvent->inShallowFlowingWater && GetObjectEventGraphicsInfo(objEvent->graphicsId)->tracks)
{
objEvent->inShallowFlowingWater = 0;
objEvent->inShallowFlowingWater = 1;

View File

@ -66,7 +66,6 @@ static void PokeballGlowEffect_WaitForSound(struct Sprite *);
static void PokeballGlowEffect_Idle(struct Sprite *);
static void SpriteCB_PokeballGlow(struct Sprite *);
static void FieldCallback_UseFly(void);
static void Task_UseFly(u8);
static void FieldCallback_FlyIntoMap(void);
static void Task_FlyIntoMap(u8);
@ -407,35 +406,35 @@ static const struct SpriteFrameImage sPicTable_HofMonitorSmall[] =
static const struct Subsprite sSubsprites_PokecenterMonitor[] =
{
{
.x = -12,
.y = -8,
.shape = SPRITE_SHAPE(16x8),
.x = -12,
.y = -8,
.shape = SPRITE_SHAPE(16x8),
.size = SPRITE_SIZE(16x8),
.tileOffset = 0,
.tileOffset = 0,
.priority = 2
},
{
.x = 4,
.x = 4,
.y = -8,
.shape = SPRITE_SHAPE(8x8),
.size = SPRITE_SIZE(8x8),
.tileOffset = 2,
.priority = 2
},
{
.x = -12,
.y = 0,
.shape = SPRITE_SHAPE(16x8),
.size = SPRITE_SIZE(16x8),
.tileOffset = 3,
.shape = SPRITE_SHAPE(8x8),
.size = SPRITE_SIZE(8x8),
.tileOffset = 2,
.priority = 2
},
{
.x = 4,
.y = 0,
.shape = SPRITE_SHAPE(8x8),
.size = SPRITE_SIZE(8x8),
.tileOffset = 5,
.x = -12,
.y = 0,
.shape = SPRITE_SHAPE(16x8),
.size = SPRITE_SIZE(16x8),
.tileOffset = 3,
.priority = 2
},
{
.x = 4,
.y = 0,
.shape = SPRITE_SHAPE(8x8),
.size = SPRITE_SIZE(8x8),
.tileOffset = 5,
.priority = 2
}
};
@ -445,35 +444,35 @@ static const struct SubspriteTable sSubspriteTable_PokecenterMonitor = subsprite
static const struct Subsprite sSubsprites_HofMonitorBig[] =
{
{
.x = -32,
.y = -8,
.shape = SPRITE_SHAPE(32x8),
.x = -32,
.y = -8,
.shape = SPRITE_SHAPE(32x8),
.size = SPRITE_SIZE(32x8),
.tileOffset = 0,
.tileOffset = 0,
.priority = 2
},
{
.x = 0,
.y = -8,
.shape = SPRITE_SHAPE(32x8),
.x = 0,
.y = -8,
.shape = SPRITE_SHAPE(32x8),
.size = SPRITE_SIZE(32x8),
.tileOffset = 4,
.tileOffset = 4,
.priority = 2
},
{
.x = -32,
.y = 0,
.shape = SPRITE_SHAPE(32x8),
.x = -32,
.y = 0,
.shape = SPRITE_SHAPE(32x8),
.size = SPRITE_SIZE(32x8),
.tileOffset = 8,
.tileOffset = 8,
.priority = 2
},
{
.x = 0,
.y = 0,
.shape = SPRITE_SHAPE(32x8),
.x = 0,
.y = 0,
.shape = SPRITE_SHAPE(32x8),
.size = SPRITE_SIZE(32x8),
.tileOffset = 12,
.tileOffset = 12,
.priority = 2
}
};
@ -936,19 +935,19 @@ void MultiplyInvertedPaletteRGBComponents(u16 i, u8 r, u8 g, u8 b)
{
int curRed, curGreen, curBlue;
u16 color = gPlttBufferUnfaded[i];
curRed = (color & RGB_RED);
curGreen = (color & RGB_GREEN) >> 5;
curBlue = (color & RGB_BLUE) >> 10;
curRed += (((0x1F - curRed) * r) >> 4);
curGreen += (((0x1F - curGreen) * g) >> 4);
curBlue += (((0x1F - curBlue) * b) >> 4);
color = curRed;
color |= (curGreen << 5);
color |= (curBlue << 10);
gPlttBufferFaded[i] = color;
}
@ -957,19 +956,19 @@ void MultiplyPaletteRGBComponents(u16 i, u8 r, u8 g, u8 b)
{
int curRed, curGreen, curBlue;
u16 color = gPlttBufferUnfaded[i];
curRed = (color & RGB_RED);
curGreen = (color & RGB_GREEN) >> 5;
curBlue = (color & RGB_BLUE) >> 10;
curRed -= ((curRed * r) >> 4);
curGreen -= ((curGreen * g) >> 4);
curBlue -= ((curBlue * b) >> 4);
color = curRed;
color |= (curGreen << 5);
color |= (curBlue << 10);
gPlttBufferFaded[i] = color;
}
@ -1328,10 +1327,10 @@ static void SpriteCB_HallOfFameMonitor(struct Sprite *sprite)
void ReturnToFieldFromFlyMapSelect(void)
{
SetMainCallback2(CB2_ReturnToField);
gFieldCallback = FieldCallback_UseFly;
gFieldCallback = FieldCallback_Fly;
}
static void FieldCallback_UseFly(void)
void FieldCallback_Fly(void)
{
FadeInFromBlack();
CreateTask(Task_UseFly, 0);
@ -1714,7 +1713,7 @@ static bool8 EscalatorWarpIn_Init(struct Task *task)
// If dest is down escalator tile, player is riding up
behavior = TRUE;
task->tState = 3; // jump to EscalatorWarpIn_Up_Init
}
}
else // MB_UP_ESCALATOR
{
// If dest is up escalator tile, player is riding down
@ -2264,7 +2263,7 @@ static void EscapeRopeWarpOutEffect_Spin(struct Task *task)
gFieldCallback = FieldCallback_EscapeRopeWarpIn;
SetMainCallback2(CB2_LoadMap);
DestroyTask(FindTaskIdByFunc(Task_EscapeRopeWarpOut));
}
}
else if (task->tSpinDelay == 0 || (--task->tSpinDelay) == 0)
{
ObjectEventSetHeldMovement(objectEvent, GetFaceDirectionMovementAction(spinDirections[objectEvent->facingDirection]));
@ -3886,4 +3885,3 @@ static void Task_MoveDeoxysRock(u8 taskId)
break;
}
}

View File

@ -1604,6 +1604,11 @@ static void CB2_LoadMapOnReturnToFieldCableClub(void)
void CB2_ReturnToField(void)
{
if (gFieldCallback == FieldCallback_Fly) {
RemoveFollowingPokemon();
} else {
UpdateFollowingPokemon();
}
if (IsUpdateLinkStateCBActive() == TRUE)
{
SetMainCallback2(CB2_ReturnToFieldLink);

View File

@ -52,6 +52,7 @@
typedef u16 (*SpecialFunc)(void);
typedef void (*NativeFunc)(void);
typedef bool8 (*ScrFunc)(struct ScriptContext*);
EWRAM_DATA const u8 *gRamScriptRetAddr = NULL;
static EWRAM_DATA u32 sAddressOffset = 0; // For relative addressing in vgoto etc., used by saved scripts (e.g. Mystery Event)
@ -133,12 +134,17 @@ bool8 ScrCmd_specialvar(struct ScriptContext *ctx)
bool8 ScrCmd_callnative(struct ScriptContext *ctx)
{
NativeFunc func = (NativeFunc)ScriptReadWord(ctx);
func();
u32 func = ScriptReadWord(ctx);
((NativeFunc) func)();
return FALSE;
}
bool8 ScrCmd_callfunc(struct ScriptContext *ctx)
{
u32 func = ScriptReadWord(ctx);
return ((ScrFunc) func)(ctx);
}
bool8 ScrCmd_waitstate(struct ScriptContext *ctx)
{
ScriptContext1_Stop();
@ -459,7 +465,7 @@ bool8 ScrCmd_compare_var_to_var(struct ScriptContext *ctx)
return FALSE;
}
// Note: addvar doesn't support adding from a variable in vanilla. If you were to
// Note: addvar doesn't support adding from a variable in vanilla. If you were to
// add a VarGet() to the above, make sure you change the `addvar VAR_*, -1`
// in the contest scripts to `subvar VAR_*, 1`, else contests will break.
bool8 ScrCmd_addvar(struct ScriptContext *ctx)
@ -649,7 +655,7 @@ bool8 ScrCmd_fadescreenswapbuffers(struct ScriptContext *ctx)
switch (mode)
{
case FADE_TO_BLACK:
case FADE_TO_WHITE:
case FADE_TO_WHITE:
default:
CpuCopy32(gPlttBufferUnfaded, gPaletteDecompressionBuffer, PLTT_DECOMP_BUFFER_SIZE);
FadeScreen(mode, 0);
@ -1567,6 +1573,16 @@ bool8 ScrCmd_bufferleadmonspeciesname(struct ScriptContext *ctx)
return FALSE;
}
bool8 ScrFunc_bufferlivemonspeciesname(struct ScriptContext *ctx)
{
u8 stringVarIndex = ScriptReadByte(ctx);
u8 *dest = sScriptStringVars[stringVarIndex];
u32 species = GetMonData(GetFirstLiveMon(), MON_DATA_SPECIES);
StringCopy(dest, gSpeciesNames[species]);
return FALSE;
}
bool8 ScrCmd_bufferpartymonnick(struct ScriptContext *ctx)
{
u8 stringVarIndex = ScriptReadByte(ctx);
@ -2026,6 +2042,13 @@ bool8 ScrCmd_playmoncry(struct ScriptContext *ctx)
return FALSE;
}
bool8 ScrFunc_playfirstmoncry(struct ScriptContext *ctx)
{
u16 species = GetMonData(GetFirstLiveMon(), MON_DATA_SPECIES);
PlayCry5(species, 0);
return FALSE;
}
bool8 ScrCmd_waitmoncry(struct ScriptContext *ctx)
{
SetupNativeScript(ctx, IsCryFinished);