From 8a3dfbf252039ce68e61715cadd172893cacc793 Mon Sep 17 00:00:00 2001 From: Ariel Antonitis Date: Fri, 12 Jun 2020 03:41:03 -0400 Subject: [PATCH] Added pokemon followers & script commands. --- asm/macros/event.inc | 5 + data/event_scripts.s | 1 + data/script_cmd_table.inc | 455 +++++++++--------- data/scripts/follower.inc | 23 + graphics/object_events/palettes/altaria.pal | 19 + graphics/object_events/palettes/togetic.pal | 19 + .../object_events/pics/misc/animated_ball.png | Bin 0 -> 4840 bytes .../object_events/pics/pokemon/marshtomp.png | Bin 5691 -> 7353 bytes .../object_events/pics/pokemon/togetic.png | Bin 0 -> 4519 bytes include/constants/event_object_movement.h | 2 + include/constants/event_objects.h | 9 +- include/event_object_movement.h | 6 +- include/event_scripts.h | 2 + include/field_effect.h | 1 + spritesheet_rules.mk | 6 + .../movement_action_func_tables.h | 20 + .../object_events/movement_type_func_tables.h | 2 +- src/data/object_events/object_event_anims.h | 194 ++++++-- .../object_events/object_event_graphics.h | 4 + .../object_event_graphics_info.h | 6 +- .../object_event_graphics_info_pointers.h | 4 + .../object_events/object_event_pic_tables.h | 21 +- src/event_object_movement.c | 323 ++++++++++--- src/field_effect.c | 100 ++-- src/overworld.c | 5 + src/scrcmd.c | 33 +- 26 files changed, 857 insertions(+), 403 deletions(-) create mode 100644 data/scripts/follower.inc create mode 100644 graphics/object_events/palettes/altaria.pal create mode 100644 graphics/object_events/palettes/togetic.pal create mode 100644 graphics/object_events/pics/misc/animated_ball.png create mode 100644 graphics/object_events/pics/pokemon/togetic.png diff --git a/asm/macros/event.inc b/asm/macros/event.inc index 4625f8df6c..fa8d805316 100644 --- a/asm/macros/event.inc +++ b/asm/macros/event.inc @@ -1625,6 +1625,11 @@ .2byte \quantity .endm + @ Like callnative, but function expects a ctx + .macro callfunc func:req + .byte 0xe3 + .4byte \func + .endm @ Supplementary diff --git a/data/event_scripts.s b/data/event_scripts.s index 8039be6876..878fea8ee1 100644 --- a/data/event_scripts.s +++ b/data/event_scripts.s @@ -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" diff --git a/data/script_cmd_table.inc b/data/script_cmd_table.inc index a26ce6bf25..b6e7a6b4a9 100644 --- a/data/script_cmd_table.inc +++ b/data/script_cmd_table.inc @@ -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 diff --git a/data/scripts/follower.inc b/data/scripts/follower.inc new file mode 100644 index 0000000000..2b782d4799 --- /dev/null +++ b/data/scripts/follower.inc @@ -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 diff --git a/graphics/object_events/palettes/altaria.pal b/graphics/object_events/palettes/altaria.pal new file mode 100644 index 0000000000..b364496ff2 --- /dev/null +++ b/graphics/object_events/palettes/altaria.pal @@ -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 diff --git a/graphics/object_events/palettes/togetic.pal b/graphics/object_events/palettes/togetic.pal new file mode 100644 index 0000000000..596c66d286 --- /dev/null +++ b/graphics/object_events/palettes/togetic.pal @@ -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 diff --git a/graphics/object_events/pics/misc/animated_ball.png b/graphics/object_events/pics/misc/animated_ball.png new file mode 100644 index 0000000000000000000000000000000000000000..da7a678e10512cc45708b7bfec5d3ad0b1b4bfa9 GIT binary patch literal 4840 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 O0000we-a)tk66p!pi5B`*1vdhI#GuRr~L4?e%| z?@#?a#qU2o?&7y6A`c~grmtUZd|p3zy!`QoZ}$lE=f_?9JQLgJLZ2tTT`=j+y4(J7 zkvty19uN6*p?*F~?#+H&>ijHqeO~yM^7)tSUHbb)^t=1Tm?zckY&O7kZ7`RyAEx-M8fA{1+`EvIzg(xVP zrMy_NuBggo8Oof#^C}V&?k8{M1^C<7C;k41!cwVbUZyZNHaPtJy2LEukJ?Hv&xzL+ zetva-MR2x17a&C3yRev$$bhdQl~9AX7%c?i*htV|1mLxoD211xlu!-q>@W1wODBmbQ?9*TuZIhsz7d7vTVhw znKkP+T57qKR-3ifdK*3V1O}E~yY<$4A0xVd!Hovj8oYk+$c!`1Jj<-pW}AJEMft3} z%Bss&TYZfkciO7$=bEW-Td5ixlb55!IzsQ^;b$`vAQn$ zU~f$KfD_Z7U2n40Z<>kNTj9LmmHZeQ+R@Pnn2(Zq)mWDqamWiy7XIbc8 z{Qopij@v|kEZyV=#Zst3EpO#p%dm1*uQRa-zhgG)k2Z)2LBmzgEvwXa6F)kC`-;1? zGXiR)SG&?M3*LcwRxa)4v)ecax*{BeChtm%>^`|dwi)JXw|D|}4uD!qw&ji|!hvvy zyW?2J!i0{iX|6KehIC=SWK7&VfGM#3vsMi*@fisq8ZIi3;UvrGLhq0`FEay%(S_?C`lRyI^ z?Ln0M(i!U}B7FlHxe5bwMIVvRKqA=vxT)UI0Y#u^C%a189pJzQO;)m5+G0T`v&A_l z3)tkLq9(Q@YGFo2Er?Z4UWytC@+@U@@kxH#2KUy=A(v2E9|ENqTD>uUZ}1aDtL_4v z1dPRkzzNMe*}SpCG>KKxR=Hrvynsx1zn8U9V;E=e+5>ai@m5u5sxLSiu<6F4S8o{d@@gp@3o@ ztmCXSE9mo&8`gDYUYAys0G)9B2HLX&^ z8yTmX+jJ)6x_qF%`5VffTApV?Mlh)ri+lIez@uUv(n_P;X5+N7Pg5c*_nOn&-0&v& zQ_J+XcSP^yj)|0!~3N+;LgC)w+3i&1ih;zeeCd2_}rmQ>xUdOF%rboPq@(L31vU z^SKptpKVbK6B(qfvd7s83mJx+=2ihxokkC<2Hh*dcA#~Cgc1lJzhG?aHo+^Js80Nd z5FLj>t%A}69kv!-0}RoCA~W^cGO$YArfsK8_Ls3Ms02v^yMRO`P*AzGJ?lo=SWmas zHUkW((xK~ib|+s7JQW(87nBP1ti8(3AO-OZt&9tR8gj0IiZy{l6iExQ(`jBBO1|ef zis;bN=pjmfglMG&<7UjtVxS+cMp|0C$9sp zX1#gubPBtbcJpv-h0|816+Ej!ReGbE<|OGAE`Z9A;S`Re)d(c-p+ni<92mWIh)TF8 zoXM^_SZEEHpL^y2e`3GF=H28FAVF~vyzMe@U}TVgY}U6ouyVDE0!`4P8L^}@xEk`o z5}aIM=J-|}5fY8CWqPPM@($rKXayvo*QK>02f*W8LAR^osco`KVb#Moz0G!Jc-7j8%3uY;ywlCD z;4@gzBnt?Ph3=wm4~n0%5z5Gbp@Lhg%FC zMyHh&kqbf;>Z=HSeZ}~xD@Vz?B|6l4pm-p73EUyJ;O@vW=}Bl7niw5oybDl?qO4AV zLn)4pp-Z~rwxBGwvV*Z*^4w6sR61aP+4^iSJJ?y^=?+yOB)~R27FsXB0NGJ7sxcO) z8_*i_qLk<|$}~Vq2uooUP}o6C$dpae@^fEkG9?5uD(dv@Y(s@uU$h0r6+NCbTcT6t z#6%O=Hqb1*Fx$ z8;}hG0D%yQC=E-uhCpu%)TtwECR~LzSVQBk=|RZ+1u+iw#`b7^EHafT z{X&B9o|qel>gQ%gl>=FWCX=g1_)Vk@0Kj!9+Y>4U+%l2fcx)2Gb4uJqE=80_HCItg zg2ICw_B6^X=BmjJK+;4CwD#YBb#@qwHUf`!ThKq6l}_Cnss#*jeY)XBqzsLRZlgQX zA=%}iVNn(rtZK1ix`eFv6jzX}bQW2}8UF^V4cy+E9(9~c4Oh+~6l#Bb;lU$A%hBFs5#LDRHENDo4PZs5(RGO*QR zafFPm>@2n0J;E0#-Pc9}Gj}Y_OG^iED4}-%URwQ8aQ50Q#m#Q%zpY*aJW?=?QN&!m903uCbAFYQIKs10m1JR(V z2w5bQNU0ekwTj?za0;}RGAWgf^(sWZJg;Yu6v~8JE-1AwUR&4;Xf-YYTzLu>tyoFG z`p6nwS-=S zD;5~tA^DPJCjkX`YtZz|Pl;wbeoxglV7L>)oMofWo1;CIJsg$ER|YyxwIofiYNwiE zoEWt%ThhpAIV=UxO++jy zP=-PBHq+=RM8r3L@>RqcfqGgTTZAh@G$N5Pv@}cV9V*hum3U0eA(yxaLS@H9hK_+_ zY5I{3ZbQCeiZl+n>`jeZu2((LY!NW&5;f?#ZLW|n7P)DOqY^*?!`T^>2zZJhv1Swp zpv~fHs>mrsAD~7+510)B;1l+6qz7FVSwECScc%yp1SG8Nf+mi9-i0NG(n8Rf7~y)cY5&KorhfSy6}3W{sGQK-W)thFIXiAaj^Y+Ba>$ zUwA1?mI;j(Mx!PO1O?Q-COB|n(MT}Ku9X)V_mfz0NHH_1)_0tbOaJK&jry`N|BmHK!r#pV^J^A zieO2E<8n(4P=k2~D#kIXAStV7H8I)THp2u|82pHTNW^p7$=)(xu6Fv4LK+qLMa%&%IqWWvrZs6PSc;o{n!9irR*2-m9D_HOwWW@! zt}Gio=naQUc_6g71}a194*d`}E4aw`=Zx_fppr(k^t+QuCnXpQC0h?tI>6|HfdiJA zL`IP;l-v7MygO117PWRQ&d0$LWhsZg4L05$R>@_v6qXrlHgk zzJ*^%6V?xPiA|u_HdGv6?IJrTeMQ6@kd9*Clqa%pN+~pu2~&_XVx^tXE!mLZvZZU& zc*s(WG&l`DKqTvOA^=$rCJVmjpD5uY3)&7bBq5rH$P6ptOp5k|UZOifP8(ivcglE_^r zz)J^8A%}yDQ1yY3al>nPI-^Pb8ygvX28%TA1#I9b(%@Q{4g?iKjPT@DMF#QWZ9Tew z4T7gQhC_IxjA#Lc4-)C@RaSU|kW<5d9E03t1RyJ1Nhzup@YA4E0#qn3>Loio4+WZa zx&SUA|K8HLI3zJK4uN_{W`GKpE}akIYmryP0m0RoM$wVBLlOr$kEmI)2Q{b0PH=GH z0(6gug=t+f0OeNFN}e(9Q~HX!#zudJksDWOu8DAzavY5kwlvI33>`@Z~6=hGd)r?#I(K!H56^-!+iA zI0B-@vw}9D68x5^$jX?eQ5BQrAEa8?4Zj44xt{2{bRxQ5bKn&{si>3~b*6;2#!ing zek(Zzcpj8q*Qpo&QKQZ!?e8RibrQEVje$vyr>Mw}refm>Yrr;X8mCA=oX{K2HxeoB zogfV)KTCGl6tofhEofI*Dq|%!jfNQUkKg>!M*z?UHYl?PV!#^(EO(0g3-Bna*NLl9 zY9Qh@(K;0e0;tY3q5zP9Sga;(Fxuod5#nAeFKA0+cm5JB3X%}Z)C7osP>Y4;Q1&xx z5_9NN>Y0i`uMC;{7`r+z*A5gCBGl5L6KJaK2nnUc?+boO?|_9^ji`%pSxIfwkk0-t z-bQl~{vw`7Sa>Xi1Q-g5A9-5JVDk;K>LZJDhg|JemE%P+q>AeI12H;%#BoYZo2If8 zsoM~|o3eDMS?sz-tM7P!1+hgHAt30uIM7N6aPr-Ch6DC?5=X^B)p(IpHGGXY(#_Vu zIoc{G;y}ftf)2X=^_S)y+=QbfyB z4WvqI1m^qrn%d@lbY5dvNh(1Q86i!8x*EM%x%iC^aSB|*un1d!Uh> zpFP`+GscinaVXWMna9-;jHav$dLP@(Bq4-2pgbs8>IHP4;W=VVQzQi76|kp?x`x+V z(}3Phb3vqT9msf)onAw#Nw#2qv8n@&2oUI)H>yB!m+w<4ig{oiWNaJqbs#CR89EcE zR0tR?LN6h8It)yIU(n5mo59DBiPu>gN@c2>z_~N-&_?XgvsbgFfjGmaqI(>L1;0@) zv_;hj9ZfzFwOKQ(fvecxS4Jttw@rF@L&@=(G02BF)E8ddVNS}JnaF;Q-#gZjFCL?BoKl+ z>WG0=&|YLVYl_n}g;p^Dd^*vf3?d|(b<2kAfk8uF(M`%ANAWn~N~8c4;bGdFsUge) z?lYo|+12%|72QouK$-#Es*qC!f9^H+!ZKC(|MbXzMg#Cvxfm~3i@<=g>GUg};kjdE zED}JU%R(g(hIiP2;#Ms6840W;P=iX(1bZuo=olSluFaYWk7nO*7}+%42dH#Dau7uo z-+`7wQc-?7;>%pl`aAB?X$q19Qv?5X9ncbAJhJJSPk0OrF3Os|*%;t0utV=?J`XhN z6D^^C;(cXJqHGN;0(>9MJTc{OEYrF^+|nv|LtCT5s_Y51sE?hYS|GdfIBy|836wWT zv~0Lv=bP+$&M6nEf$k!3(Xhjy8{PpexW!+w>*FjN0MJDCrt!{|kEX)#+5);|(-UMc zh#-X7SfXDG@7I;ZVjp z%H~Nh2hE59?rc_w`wrEY4_mKPvG-d+IpHtDt90tG+c)bPR-4H23w{sqRD2Nb{9yPXh2xaCK~fR6$}?9p!}ZHK8f0(X_Tc?m|WYLM{`SOdHq!lmlS5ggQXM@Q{0Xuyx*e&%okVi5V?YRg35rWglAl$iHz|`OrEFLdp7C>jDg^VyFREMia({PAFB6^c+H)C#RSm|Xe=O&XFE7e~Rh;NZt%)xpJCR|i)?5c~jfa&%I3krMxx z6k5c1aNLh~_a1le0DryARI_6oP&La)CE`LRyD9`<(S;Dg=*O_cOnpuilkgm0_we!c zF2=LG&;2=im7K`{pFljze{{nl-XNadv~EJ1_- z8C8@}hJ_fd8Yw1Hv>*5I4?2F4Tr#;zVB}ap1u7)R5B>+gyEXHZe-my}C=PVK*!IT= z5ZnbCHQW9^w(Z6V5O@Zzw3fe82WCD=ueG%35zw~{TwJ#_c@MbU0S2CQ$&ef=K+~Vk z1Mg?_O<5p(3-qkHy*2l7`T(SZBJMhu457rOm_e+Ay2#;F=pfysEw&sT1ULI1_|N!W%(Y4Xe*%Zz^0;q4FXVoN zknPxxe=u^JK`k@Wv`uK%vXBll&>X3blYF)zH^?+7NTX3c)4&N{HGKpine}--xSPFuZ7_Z>YE7oVSg8L}CRRviRub>bMxtNPb1$RXNuqza# z7)#hL1$V?$PUp`=L9+i61c9h3NWXvP0vi-0#nbTS7=i>6+AIZHa}6t(7f(%(tRXKf zzi>AaNLb~wvrIv{JQsyK2q;2al;1iF@f;AsQ98y$iBL{Q4GJ0x0000DNk~Le0001x0000W1Oos701u+<{r~_H2zpdl zbW&k=AaHVTW@&6?Aar?fWgumEX=VTbc-pO*X>ubs5=Q^y6mtY5fW&efB$f!@V2(d8 zitoY#vwdiya{dtYe1Pkcgo|CZ0NUQhma_;R3;rLEj3r*yL9`21g95#-nJMy7=KLAmn46@3O{E*_did5n(s66Pr0n`9P#2$-w^%j zc>cV9`f}sXh|&ai^Zvbe_j}K4b+c45THhV@BwIc%!-+=9^YgLFqw!1E^6Zbn zqsJK+CEsyHEb`oUJoj7Dx$_oIO~S>5kNo8$eD~%*d4zkHr${`Rxj(rguH=197+yL5 zpR*{4+;`pdN$|(xUH7Q0QJv23IQPrwVd(fe?=31)OT3dCHn=QA}wAI#HZ==ngd+FM1Z@u@? z=SU-ifja7FqmMD>Okr}P$+afuPmWl!Y{k@nsx|92Y%bbom8Gk$w)z@t?zHm;CU)Iz z_dWJJ5)Mdl%F$C#JN=9^FTHm2Emv>7?e;tF{H)r$s(*O=gR059YU!zzpVvOC#?jE) z$0fw!M7?HIEES>R%_~4dC$CxTQcCj5dClTT4233wRIg3g;uWKWX!bla=}aY|EOG`bbqYdpHyu-&#k9ouPOAL#?15`!laM-ym0|~Gx1md_s`+q zUtq|9x~gsxcr`GQy2de^r;K`x6z6)0{gVD(Qq^*=tj>Xc$wIuMBnU2>bI%gVqL3#E z%A~i<#Zt0T?;w?&3|DT-Cd_v&o7Px=3sR>P&8XPkGG=KDSZ^_pL~3)ON~flE2@Bk) zNQ1OGH9V^U!lNsvd247n`F2=itX-`f&S}z;A_&3v}#Vf zXX`PqR@ZGyd26O)HCP*&j;d|MymwkGgiFp5Q!QfTZ?zlmS~Q)FtUGIqMliw+x0I8f zC#|8?dFgk~W7S@s>|NE7Q1vXKAXe z#}OjSRqaeZ4@86Bk$FYI0o-SQZibLCNGs~sP6}6_PNGa?BV|r)CndPKP>UnA-{h5E zG{C$pQ5@WgBFdASv7k8li z8*oqvK3FM*yE!Z+n^DG`Ngzh{n3S2S=K0aPA z0F>GQZ=chk)?81y)+SNuqzEA6rrA+H-K!7O=99X$PKyliY*=SxQt9X9x*1C&ec7MV1o#B%?nYb1{VSsw{$du9-)O>W8wl^h;!lTvc(_w1w7E~&x5_vr z-d0TR=%G`t631X!5n8(|Uq-}>1n%uh`;gFdpdIFO0#eQo^D1*vmJjJrBZ3)bZ%LR_ zfn#|4q^U-xxb4Mzt?R>*Tr_u3X|`njl~LHJKAZ4XH{Jm> zHn?`SF^#*N4Lz%Wm!_g|$pOU{iVEbMO+pyj?5R-h$Lx_%P0(FJI%L5TqRXc{LmN(o zb*nI00|^X>fQ{L78;w&+n7Y?}=EA4-d3~9zbI&eT?_uVx!I6H{8i(6ah9ip~(+;-- zQuJmh%s2@F85(roNDXJlQ5Z&tHK9`u3WD67PKQSTpmn2vOtf98`Rvxk!86eB%Pzg0 z;h_vsY)~}2s#jnLWJzin@Bj$oMb%J7K%aiS%_v#h6qB0Iz#0qM0WeMlb|mEkU4*Wh z<1AW>aQ3BnNqWhTsxXAXXz=6e!z_})Lvsd-Nu$-ph|P2XzTLr%J#6z)Nb@qwWNuWM zV1|2I!Fg_f>m;cTtrr=g%~q(85#)9E?Rb%HT`yRS8IoR^e|)Z^CbXMa6HMSLa2>`X zX@z}AjB*b}L`*NK9()aBX*U9di;7LhUIoC{Zjak2x(6;N(NTb6qf>m;X!3JO0`7>s zZ9qP94+tMyC)>zsyqV&HAj{B8n;;MrXhis)k5Gkw97kR(7Q2Sa0wJ*wU^t!3%!mWo zRHzPKw*+7?#ULe3%-xpHplC^ern|1?qVsmTti=_WMC}eniy0-9x&UNEKuL)XPQzJG z5pU{1j5%~M0MNxgMA7`jL-y&D0C3WqL;-Nnb0kYU9SN3T6*Vt1UV;1?3p_S3k~7|O zc3nV!1EYvBysTxk069Y>hbw7ZGiTTbs9^StycoSm$Mcb%NF?wN36iyhJiREG7O}{S z3a=hkKK?;w8C!(%WfqskGcurkNjb$y6SB^zmINc;=?gtjX=Cu6qy%GC7v+a_XjsX( zg1+_Iq2WruvsNbX7G{anAzTY8C=q2JwH_3IJZ*FZO+g+3r9j9uPP)TYW`^M?>ePhM zWb8S+DbzoI4?M%7jEIaD}x%IFv~<#2Jq|!`vZfkfYAHWstgY9QJoH zpbIXWqqIRbjY|RFoSvy=AW)1s)`r1ikT!Ou7Kqv*szxq(P@jC{07UfIuy9(PFRj>=~!a8BgGttNsuI9qThL%gAiB{QA?VoI|cX@+nQt?E1z{+?(ap27NH7b`F^ma~bW@?b5WBIXFj56e?*%)q*S zP2h0?9B!O!8|hS>xRx@UNwN2k5Fq4cHr25A+$d_ z36g=H(JSJ;spudO26=?wLYN+mDLz4i;Wf_11ty67qNl)|JCF!xKrRI=gl}mVgI5-= z^fp)PtPiRp;^mbgLJN#zb&RZkOE};2P55=f`JQjWuM^Jqd=q{q9L;}4IN$S4_>ORt zvzS!y6K%MP;cWUs_48`EO2bQkkODj)sxvgp16#t#9X<-lnE2LSC;j-mGO&-nOL7

B1#aEkHAK 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 FV1i<1mjM6( literal 0 HcmV?d00001 diff --git a/include/constants/event_object_movement.h b/include/constants/event_object_movement.h index 25f133f0e1..e10294a68a 100755 --- a/include/constants/event_object_movement.h +++ b/include/constants/event_object_movement.h @@ -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 diff --git a/include/constants/event_objects.h b/include/constants/event_objects.h index deb775271f..ba53c13fe5 100644 --- a/include/constants/event_objects.h +++ b/include/constants/event_objects.h @@ -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 diff --git a/include/event_object_movement.h b/include/event_object_movement.h index a6264419c4..8f7b0ed82e 100644 --- a/include/event_object_movement.h +++ b/include/event_object_movement.h @@ -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)); diff --git a/include/event_scripts.h b/include/event_scripts.h index 79ef0ea142..395bdb0bff 100644 --- a/include/event_scripts.h +++ b/include/event_scripts.h @@ -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[]; diff --git a/include/field_effect.h b/include/field_effect.h index 731fb9c59f..073fc3b4cc 100644 --- a/include/field_effect.h +++ b/include/field_effect.h @@ -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); diff --git a/spritesheet_rules.mk b/spritesheet_rules.mk index e030a66c5a..48ff32db28 100644 --- a/spritesheet_rules.mk +++ b/spritesheet_rules.mk @@ -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 diff --git a/src/data/object_events/movement_action_func_tables.h b/src/data/object_events/movement_action_func_tables.h index 8cf7d1699f..5b3dfcb733 100755 --- a/src/data/object_events/movement_action_func_tables.h +++ b/src/data/object_events/movement_action_func_tables.h @@ -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, diff --git a/src/data/object_events/movement_type_func_tables.h b/src/data/object_events/movement_type_func_tables.h index 083e69432a..0fe364afe1 100755 --- a/src/data/object_events/movement_type_func_tables.h +++ b/src/data/object_events/movement_type_func_tables.h @@ -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, diff --git a/src/data/object_events/object_event_anims.h b/src/data/object_events/object_event_anims.h index f443ea572b..5d7f52878a 100755 --- a/src/data/object_events/object_event_anims.h +++ b/src/data/object_events/object_event_anims.h @@ -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}, diff --git a/src/data/object_events/object_event_graphics.h b/src/data/object_events/object_event_graphics.h index 47d15eac0a..3c04b78deb 100755 --- a/src/data/object_events/object_event_graphics.h +++ b/src/data/object_events/object_event_graphics.h @@ -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"); diff --git a/src/data/object_events/object_event_graphics_info.h b/src/data/object_events/object_event_graphics_info.h index 661db38c46..a97f143574 100755 --- a/src/data/object_events/object_event_graphics_info.h +++ b/src/data/object_events/object_event_graphics_info.h @@ -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}; diff --git a/src/data/object_events/object_event_graphics_info_pointers.h b/src/data/object_events/object_event_graphics_info_pointers.h index cb94026ee9..61d8c0e7d5 100755 --- a/src/data/object_events/object_event_graphics_info_pointers.h +++ b/src/data/object_events/object_event_graphics_info_pointers.h @@ -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[] = { diff --git a/src/data/object_events/object_event_pic_tables.h b/src/data/object_events/object_event_pic_tables.h index f63f265278..8ddd851780 100755 --- a/src/data/object_events/object_event_pic_tables.h +++ b/src/data/object_events/object_event_pic_tables.h @@ -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), diff --git a/src/event_object_movement.c b/src/event_object_movement.c index c57b39e73d..69b6008150 100644 --- a/src/event_object_movement.c +++ b/src/event_object_movement.c @@ -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 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; diff --git a/src/field_effect.c b/src/field_effect.c index 162a530caf..8e2a3b067f 100644 --- a/src/field_effect.c +++ b/src/field_effect.c @@ -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; } } - diff --git a/src/overworld.c b/src/overworld.c index 60512a850c..50527c50d6 100644 --- a/src/overworld.c +++ b/src/overworld.c @@ -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); diff --git a/src/scrcmd.c b/src/scrcmd.c index 7caaa194bc..825c3d0f87 100644 --- a/src/scrcmd.c +++ b/src/scrcmd.c @@ -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);