Merge branch 'master' into gb-mobile-merged

This commit is contained in:
vulcandth 2023-08-23 18:06:19 -05:00
commit a68ad57f61
100 changed files with 1495 additions and 1293 deletions

View File

@ -69,9 +69,8 @@ jobs:
- name: Update symbols
if: ${{ github.event_name == 'push' && github.repository_owner == 'pret' }}
uses: EndBug/add-and-commit@v7
uses: EndBug/add-and-commit@v9
with:
branch: symbols
cwd: "./symbols"
add: "*.sym"
message: ${{ github.event.commits[0].message }}

View File

@ -324,7 +324,7 @@ gfx/mobile/mobile_adapter.2bpp: tools/gfx += --trim-whitespace
tools/gfx $(tools/gfx) -d1 -o $@ $@)
%.gbcpal: %.png
$(RGBGFX) -p $@ $<
$(RGBGFX) -c embedded -p $@ $<
%.dimensions: %.png
tools/png_dimensions $< $@

View File

@ -77,23 +77,32 @@ SECTION "Songs 4", ROMX
INCLUDE "audio/music/viridiancity.asm"
INCLUDE "audio/music/celadoncity.asm"
INCLUDE "audio/music/wildpokemonvictory.asm"
INCLUDE "audio/music/successfulcapture.asm"
assert BANK(Music_WildPokemonVictory) == BANK(Music_SuccessfulCapture)
INCLUDE "audio/music/gymleadervictory.asm"
INCLUDE "audio/music/mtmoonsquare.asm"
INCLUDE "audio/music/gym.asm"
INCLUDE "audio/music/pallettown.asm"
INCLUDE "audio/music/profoakspokemontalk.asm"
INCLUDE "audio/music/profoak.asm"
INCLUDE "audio/music/lookrival.asm"
INCLUDE "audio/music/aftertherivalfight.asm"
assert BANK(Music_LookRival) == BANK(Music_AfterTheRivalFight)
INCLUDE "audio/music/surf.asm"
INCLUDE "audio/music/nationalpark.asm"
INCLUDE "audio/music/azaleatown.asm"
INCLUDE "audio/music/cherrygrovecity.asm"
INCLUDE "audio/music/unioncave.asm"
INCLUDE "audio/music/johtowildbattle.asm"
INCLUDE "audio/music/johtowildbattlenight.asm"
assert BANK(Music_JohtoWildBattle) == BANK(Music_JohtoWildBattleNight)
INCLUDE "audio/music/johtotrainerbattle.asm"
INCLUDE "audio/music/lookyoungster.asm"
INCLUDE "audio/music/tintower.asm"
@ -106,8 +115,11 @@ INCLUDE "audio/music/pokemonmarch.asm"
INCLUDE "audio/music/goldsilveropening.asm"
INCLUDE "audio/music/goldsilveropening2.asm"
INCLUDE "audio/music/lookhiker.asm"
INCLUDE "audio/music/lookrocket.asm"
INCLUDE "audio/music/rockettheme.asm"
assert BANK(Music_LookRocket) == BANK(Music_RocketTheme)
INCLUDE "audio/music/mainmenu.asm"
INCLUDE "audio/music/lookkimonogirl.asm"
INCLUDE "audio/music/pokeflutechannel.asm"

View File

@ -1398,9 +1398,9 @@ MusicCommands:
dw Music_PitchOffset
dw MusicE7 ; unused
dw MusicE8 ; unused
dw Music_TempoRelative
dw Music_TempoRelative ; unused
dw Music_RestartChannel
dw Music_NewSong
dw Music_NewSong ; unused
dw Music_SFXPriorityOn
dw Music_SFXPriorityOff
dw MusicEE ; unused

View File

@ -75,9 +75,9 @@ DEF BATTLEANIM_BASE_TILE EQU 7 * 7 ; Maximum size of a pokemon picture
const ANIM_OBJ_FROZEN
const ANIM_OBJ_MASTER_BALL_SPARKLE
const ANIM_OBJ_RECOVER
const ANIM_OBJ_THUNDER1
const ANIM_OBJ_THUNDER2
const ANIM_OBJ_THUNDER3
const ANIM_OBJ_THUNDER_CENTER
const ANIM_OBJ_THUNDER_LEFT
const ANIM_OBJ_THUNDER_RIGHT
const ANIM_OBJ_THUNDER_WAVE
const ANIM_OBJ_SPARKS_CIRCLE_BIG
const ANIM_OBJ_THUNDERBOLT_BALL
@ -306,191 +306,191 @@ DEF NUM_BATTLEANIMFUNCS EQU const_value
; BattleAnimFrameData indexes (see data/battle_anims/framesets.asm)
const_def
const BATTLEANIMFRAMESET_00
const BATTLEANIMFRAMESET_01
const BATTLEANIMFRAMESET_02
const BATTLEANIMFRAMESET_03
const BATTLEANIMFRAMESET_04
const BATTLEANIMFRAMESET_05
const BATTLEANIMFRAMESET_06
const BATTLEANIMFRAMESET_07
const BATTLEANIMFRAMESET_08
const BATTLEANIMFRAMESET_09
const BATTLEANIMFRAMESET_0A
const BATTLEANIMFRAMESET_0B
const BATTLEANIMFRAMESET_0C
const BATTLEANIMFRAMESET_0D
const BATTLEANIMFRAMESET_0E
const BATTLEANIMFRAMESET_0F
const BATTLEANIMFRAMESET_10
const BATTLEANIMFRAMESET_11
const BATTLEANIMFRAMESET_12
const BATTLEANIMFRAMESET_13
const BATTLEANIMFRAMESET_14
const BATTLEANIMFRAMESET_15
const BATTLEANIMFRAMESET_16
const BATTLEANIMFRAMESET_17
const BATTLEANIMFRAMESET_18
const BATTLEANIMFRAMESET_19
const BATTLEANIMFRAMESET_1A
const BATTLEANIMFRAMESET_1B
const BATTLEANIMFRAMESET_1C
const BATTLEANIMFRAMESET_1D
const BATTLEANIMFRAMESET_1E
const BATTLEANIMFRAMESET_1F
const BATTLEANIMFRAMESET_20
const BATTLEANIMFRAMESET_21
const BATTLEANIMFRAMESET_22
const BATTLEANIMFRAMESET_23
const BATTLEANIMFRAMESET_24
const BATTLEANIMFRAMESET_25
const BATTLEANIMFRAMESET_26
const BATTLEANIMFRAMESET_27
const BATTLEANIMFRAMESET_28
const BATTLEANIMFRAMESET_29
const BATTLEANIMFRAMESET_2A
const BATTLEANIMFRAMESET_2B
const BATTLEANIMFRAMESET_2C
const BATTLEANIMFRAMESET_2D
const BATTLEANIMFRAMESET_2E
const BATTLEANIMFRAMESET_2F
const BATTLEANIMFRAMESET_30
const BATTLEANIMFRAMESET_31
const BATTLEANIMFRAMESET_32
const BATTLEANIMFRAMESET_33
const BATTLEANIMFRAMESET_34
const BATTLEANIMFRAMESET_35
const BATTLEANIMFRAMESET_36
const BATTLEANIMFRAMESET_37
const BATTLEANIMFRAMESET_38
const BATTLEANIMFRAMESET_39
const BATTLEANIMFRAMESET_3A
const BATTLEANIMFRAMESET_3B
const BATTLEANIMFRAMESET_3C
const BATTLEANIMFRAMESET_3D
const BATTLEANIMFRAMESET_3E
const BATTLEANIMFRAMESET_3F
const BATTLEANIMFRAMESET_40
const BATTLEANIMFRAMESET_41
const BATTLEANIMFRAMESET_42
const BATTLEANIMFRAMESET_43
const BATTLEANIMFRAMESET_44
const BATTLEANIMFRAMESET_45
const BATTLEANIMFRAMESET_46
const BATTLEANIMFRAMESET_47
const BATTLEANIMFRAMESET_48
const BATTLEANIMFRAMESET_49
const BATTLEANIMFRAMESET_4A
const BATTLEANIMFRAMESET_4B
const BATTLEANIMFRAMESET_4C
const BATTLEANIMFRAMESET_4D
const BATTLEANIMFRAMESET_4E
const BATTLEANIMFRAMESET_4F
const BATTLEANIMFRAMESET_50
const BATTLEANIMFRAMESET_51
const BATTLEANIMFRAMESET_52
const BATTLEANIMFRAMESET_53
const BATTLEANIMFRAMESET_54
const BATTLEANIMFRAMESET_55
const BATTLEANIMFRAMESET_56
const BATTLEANIMFRAMESET_57
const BATTLEANIMFRAMESET_58
const BATTLEANIMFRAMESET_59
const BATTLEANIMFRAMESET_5A
const BATTLEANIMFRAMESET_5B
const BATTLEANIMFRAMESET_5C
const BATTLEANIMFRAMESET_5D
const BATTLEANIMFRAMESET_5E
const BATTLEANIMFRAMESET_5F
const BATTLEANIMFRAMESET_60
const BATTLEANIMFRAMESET_61
const BATTLEANIMFRAMESET_62
const BATTLEANIMFRAMESET_63
const BATTLEANIMFRAMESET_64
const BATTLEANIMFRAMESET_65
const BATTLEANIMFRAMESET_66
const BATTLEANIMFRAMESET_67
const BATTLEANIMFRAMESET_68
const BATTLEANIMFRAMESET_69
const BATTLEANIMFRAMESET_6A
const BATTLEANIMFRAMESET_6B
const BATTLEANIMFRAMESET_6C
const BATTLEANIMFRAMESET_6D
const BATTLEANIMFRAMESET_6E
const BATTLEANIMFRAMESET_6F
const BATTLEANIMFRAMESET_70
const BATTLEANIMFRAMESET_71
const BATTLEANIMFRAMESET_72
const BATTLEANIMFRAMESET_73
const BATTLEANIMFRAMESET_74
const BATTLEANIMFRAMESET_75
const BATTLEANIMFRAMESET_76
const BATTLEANIMFRAMESET_77
const BATTLEANIMFRAMESET_78
const BATTLEANIMFRAMESET_79
const BATTLEANIMFRAMESET_7A
const BATTLEANIMFRAMESET_7B
const BATTLEANIMFRAMESET_7C
const BATTLEANIMFRAMESET_7D
const BATTLEANIMFRAMESET_7E
const BATTLEANIMFRAMESET_7F
const BATTLEANIMFRAMESET_80
const BATTLEANIMFRAMESET_81
const BATTLEANIMFRAMESET_82
const BATTLEANIMFRAMESET_83
const BATTLEANIMFRAMESET_84
const BATTLEANIMFRAMESET_85
const BATTLEANIMFRAMESET_86
const BATTLEANIMFRAMESET_87
const BATTLEANIMFRAMESET_88
const BATTLEANIMFRAMESET_89
const BATTLEANIMFRAMESET_8A
const BATTLEANIMFRAMESET_8B
const BATTLEANIMFRAMESET_8C
const BATTLEANIMFRAMESET_8D
const BATTLEANIMFRAMESET_8E
const BATTLEANIMFRAMESET_8F
const BATTLEANIMFRAMESET_90
const BATTLEANIMFRAMESET_91
const BATTLEANIMFRAMESET_92
const BATTLEANIMFRAMESET_93
const BATTLEANIMFRAMESET_94
const BATTLEANIMFRAMESET_95
const BATTLEANIMFRAMESET_96
const BATTLEANIMFRAMESET_97
const BATTLEANIMFRAMESET_98
const BATTLEANIMFRAMESET_99
const BATTLEANIMFRAMESET_9A
const BATTLEANIMFRAMESET_9B
const BATTLEANIMFRAMESET_9C
const BATTLEANIMFRAMESET_9D
const BATTLEANIMFRAMESET_9E
const BATTLEANIMFRAMESET_9F
const BATTLEANIMFRAMESET_A0
const BATTLEANIMFRAMESET_A1
const BATTLEANIMFRAMESET_A2
const BATTLEANIMFRAMESET_A3
const BATTLEANIMFRAMESET_A4
const BATTLEANIMFRAMESET_A5
const BATTLEANIMFRAMESET_A6
const BATTLEANIMFRAMESET_A7
const BATTLEANIMFRAMESET_A8
const BATTLEANIMFRAMESET_A9
const BATTLEANIMFRAMESET_AA
const BATTLEANIMFRAMESET_AB
const BATTLEANIMFRAMESET_AC
const BATTLEANIMFRAMESET_AD
const BATTLEANIMFRAMESET_AE
const BATTLEANIMFRAMESET_AF
const BATTLEANIMFRAMESET_B0
const BATTLEANIMFRAMESET_B1
const BATTLEANIMFRAMESET_B2
const BATTLEANIMFRAMESET_B3
const BATTLEANIMFRAMESET_B4
const BATTLEANIMFRAMESET_B5
const BATTLEANIMFRAMESET_B6
const BATTLEANIMFRAMESET_B7
const BATTLEANIMFRAMESET_B8
const BATTLEANIMFRAMESET_HIT_BIG
const BATTLEANIMFRAMESET_HIT
const BATTLEANIMFRAMESET_HIT_SMALL
const BATTLEANIMFRAMESET_PUNCH
const BATTLEANIMFRAMESET_KICK
const BATTLEANIMFRAMESET_PALM
const BATTLEANIMFRAMESET_FANG
const BATTLEANIMFRAMESET_PUNCH_SHAKE
const BATTLEANIMFRAMESET_BALL_POOF
const BATTLEANIMFRAMESET_POKE_BALL_1
const BATTLEANIMFRAMESET_POKE_BALL_2
const BATTLEANIMFRAMESET_POKE_BALL_3
const BATTLEANIMFRAMESET_POKE_BALL_4
const BATTLEANIMFRAMESET_POKE_BALL_5
const BATTLEANIMFRAMESET_DRAGON_RAGE
const BATTLEANIMFRAMESET_FLAMETHROWER
const BATTLEANIMFRAMESET_EMBER
const BATTLEANIMFRAMESET_BURNED
const BATTLEANIMFRAMESET_BLIZZARD
const BATTLEANIMFRAMESET_ICE
const BATTLEANIMFRAMESET_ICE_BEAM
const BATTLEANIMFRAMESET_POWDER_SNOW
const BATTLEANIMFRAMESET_RAZOR_LEAF_1
const BATTLEANIMFRAMESET_RAZOR_LEAF_2
const BATTLEANIMFRAMESET_EXPLOSION
const BATTLEANIMFRAMESET_BIG_ROCK
const BATTLEANIMFRAMESET_SMALL_ROCK
const BATTLEANIMFRAMESET_STRENGTH
const BATTLEANIMFRAMESET_SKULL_CROSSBONE
const BATTLEANIMFRAMESET_ACID
const BATTLEANIMFRAMESET_POISON_DROPLET_UNUSED
const BATTLEANIMFRAMESET_SLUDGE_BUBBLE
const BATTLEANIMFRAMESET_SLUDGE_BUBBLE_BURST
const BATTLEANIMFRAMESET_SMALL_BUBBLE
const BATTLEANIMFRAMESET_PULSING_BUBBLE
const BATTLEANIMFRAMESET_SURF
const BATTLEANIMFRAMESET_MUSIC_NOTE_1
const BATTLEANIMFRAMESET_MUSIC_NOTE_2
const BATTLEANIMFRAMESET_MUSIC_NOTE_3
const BATTLEANIMFRAMESET_WATER_GUN_1
const BATTLEANIMFRAMESET_WATER_GUN_2
const BATTLEANIMFRAMESET_WATER_GUN_3
const BATTLEANIMFRAMESET_HYDRO_PUMP
const BATTLEANIMFRAMESET_POWDER
const BATTLEANIMFRAMESET_BEAM
const BATTLEANIMFRAMESET_BEAM_TIP
const BATTLEANIMFRAMESET_ICE_BUILDUP
const BATTLEANIMFRAMESET_FROZEN
const BATTLEANIMFRAMESET_CIRCLING_SPARKLE
const BATTLEANIMFRAMESET_THUNDER_CENTER
const BATTLEANIMFRAMESET_THUNDER_LEFT
const BATTLEANIMFRAMESET_THUNDER_RIGHT
const BATTLEANIMFRAMESET_THUNDER_WAVE_DISABLE
const BATTLEANIMFRAMESET_THUNDER_WAVE_EXTRA
const BATTLEANIMFRAMESET_THUNDERBOLT_SPARKS
const BATTLEANIMFRAMESET_THUNDERBOLT_CORE
const BATTLEANIMFRAMESET_THUNDERSHOCK_SPARKS
const BATTLEANIMFRAMESET_THUNDERSHOCK_CORE
const BATTLEANIMFRAMESET_CLAMP
const BATTLEANIMFRAMESET_CLAMP_FLIPPED
const BATTLEANIMFRAMESET_BITE_1
const BATTLEANIMFRAMESET_BITE_2
const BATTLEANIMFRAMESET_CUT_DOWN_LEFT
const BATTLEANIMFRAMESET_CUT_DOWN_RIGHT
const BATTLEANIMFRAMESET_CUT_UP_RIGHT
const BATTLEANIMFRAMESET_CUT_LONG_DOWN_LEFT
const BATTLEANIMFRAMESET_CUT_LONG_DOWN_RIGHT
const BATTLEANIMFRAMESET_CHARGE_ORB_1
const BATTLEANIMFRAMESET_ABSORB_CENTER
const BATTLEANIMFRAMESET_GUST
const BATTLEANIMFRAMESET_VINE_WHIP_1
const BATTLEANIMFRAMESET_VINE_WHIP_2
const BATTLEANIMFRAMESET_RAZOR_WIND_1
const BATTLEANIMFRAMESET_RAZOR_WIND_2
const BATTLEANIMFRAMESET_SONICBOOM_JP
const BATTLEANIMFRAMESET_WARP
const BATTLEANIMFRAMESET_CHARGE_ORB_2
const BATTLEANIMFRAMESET_EGG
const BATTLEANIMFRAMESET_EGG_WOBBLE
const BATTLEANIMFRAMESET_EGG_CRACKED_TOP
const BATTLEANIMFRAMESET_EGG_CRACKED_BOTTOM
const BATTLEANIMFRAMESET_FOCUS
const BATTLEANIMFRAMESET_BIND_1
const BATTLEANIMFRAMESET_BIND_2
const BATTLEANIMFRAMESET_BIND_3
const BATTLEANIMFRAMESET_BIND_4
const BATTLEANIMFRAMESET_LEECH_SEED_1
const BATTLEANIMFRAMESET_LEECH_SEED_2
const BATTLEANIMFRAMESET_LEECH_SEED_3
const BATTLEANIMFRAMESET_SOUND_1
const BATTLEANIMFRAMESET_SOUND_2
const BATTLEANIMFRAMESET_SOUND_3
const BATTLEANIMFRAMESET_WAVE
const BATTLEANIMFRAMESET_CONFUSE_RAY_1
const BATTLEANIMFRAMESET_CONFUSE_RAY_2
const BATTLEANIMFRAMESET_LEER
const BATTLEANIMFRAMESET_REFLECT
const BATTLEANIMFRAMESET_CHICK_1
const BATTLEANIMFRAMESET_CHICK_2
const BATTLEANIMFRAMESET_AMNESIA_1
const BATTLEANIMFRAMESET_AMNESIA_2
const BATTLEANIMFRAMESET_AMNESIA_3
const BATTLEANIMFRAMESET_ASLEEP
const BATTLEANIMFRAMESET_DIG_SAND
const BATTLEANIMFRAMESET_DIG_PILE
const BATTLEANIMFRAMESET_SAND
const BATTLEANIMFRAMESET_STRING_SHOT_1
const BATTLEANIMFRAMESET_STRING_SHOT_2
const BATTLEANIMFRAMESET_STRING_SHOT_3
const BATTLEANIMFRAMESET_PARALYZED
const BATTLEANIMFRAMESET_PARALYZED_FLIPPED
const BATTLEANIMFRAMESET_HAZE
const BATTLEANIMFRAMESET_MIST
const BATTLEANIMFRAMESET_HORN
const BATTLEANIMFRAMESET_NEEDLE
const BATTLEANIMFRAMESET_FLOWER
const BATTLEANIMFRAMESET_BARRAGE_BALL
const BATTLEANIMFRAMESET_PAY_DAY
const BATTLEANIMFRAMESET_HEART
const BATTLEANIMFRAMESET_SPINNING_BONE
const BATTLEANIMFRAMESET_STAR
const BATTLEANIMFRAMESET_SPOON
const BATTLEANIMFRAMESET_SPARKLE
const BATTLEANIMFRAMESET_SKY_ATTACK
const BATTLEANIMFRAMESET_LICK
const BATTLEANIMFRAMESET_WITHDRAW_SHELL
const BATTLEANIMFRAMESET_SHRINKING_CHARGE_ORB
const BATTLEANIMFRAMESET_CONVERSION
const BATTLEANIMFRAMESET_SWORD
const BATTLEANIMFRAMESET_SPEED_LINE_1
const BATTLEANIMFRAMESET_SPEED_LINE_2
const BATTLEANIMFRAMESET_SPEED_LINE_3
const BATTLEANIMFRAMESET_SEISMIC_TOSS
const BATTLEANIMFRAMESET_SHARPEN
const BATTLEANIMFRAMESET_DEFENSE_CURL
const BATTLEANIMFRAMESET_METRONOME_HAND
const BATTLEANIMFRAMESET_AGILITY
const BATTLEANIMFRAMESET_COTTON
const BATTLEANIMFRAMESET_MILK_BOTTLE
const BATTLEANIMFRAMESET_SPIKE
const BATTLEANIMFRAMESET_ANGER_VEIN
const BATTLEANIMFRAMESET_HEAL_BELL
const BATTLEANIMFRAMESET_BATON_PASS
const BATTLEANIMFRAMESET_LOCK_ON_1
const BATTLEANIMFRAMESET_LOCK_ON_2
const BATTLEANIMFRAMESET_LOCK_ON_3
const BATTLEANIMFRAMESET_LOCK_ON_4
const BATTLEANIMFRAMESET_MIND_READER_1
const BATTLEANIMFRAMESET_MIND_READER_2
const BATTLEANIMFRAMESET_MIND_READER_3
const BATTLEANIMFRAMESET_MIND_READER_4
const BATTLEANIMFRAMESET_SAFEGUARD
const BATTLEANIMFRAMESET_MEGAPHONE_UNUSED
const BATTLEANIMFRAMESET_ITEM_BAG
const BATTLEANIMFRAMESET_SPIDER_WEB
const BATTLEANIMFRAMESET_UNUSED_CAKE
const BATTLEANIMFRAMESET_IMP
const BATTLEANIMFRAMESET_IMP_FLIPPED
const BATTLEANIMFRAMESET_CHERUB
const BATTLEANIMFRAMESET_PENCIL
const BATTLEANIMFRAMESET_ENCORE_HAND
const BATTLEANIMFRAMESET_ENCORE_HAND_FLIPPED
const BATTLEANIMFRAMESET_DESTINY_BOND
const BATTLEANIMFRAMESET_MORNING_SUN
const BATTLEANIMFRAMESET_GLIMMER
const BATTLEANIMFRAMESET_MOONLIGHT
const BATTLEANIMFRAMESET_CROSS_CHOP_1
const BATTLEANIMFRAMESET_CROSS_CHOP_2
const BATTLEANIMFRAMESET_ZAP_CANNON
const BATTLEANIMFRAMESET_CURSE_NAIL
const BATTLEANIMFRAMESET_FORESIGHT_SHINE
const BATTLEANIMFRAMESET_RAPID_SPIN
const BATTLEANIMFRAMESET_SWAGGER
const BATTLEANIMFRAMESET_MEAN_LOOK
const BATTLEANIMFRAMESET_UPSIDE_DOWN_PUNCH
const BATTLEANIMFRAMESET_GROWING_SPARKLE
const BATTLEANIMFRAMESET_RAIN
const BATTLEANIMFRAMESET_PSYCH_UP
const BATTLEANIMFRAMESET_SPIRAL_UNUSED
const BATTLEANIMFRAMESET_AEROBLAST
const BATTLEANIMFRAMESET_SANDSTORM
const BATTLEANIMFRAMESET_ENEMYFEET_1ROW
const BATTLEANIMFRAMESET_PLAYERHEAD_1ROW
const BATTLEANIMFRAMESET_ENEMYFEET_2ROW
const BATTLEANIMFRAMESET_PLAYERHEAD_2ROW
DEF NUM_BATTLEANIMFRAMESETS EQU const_value
; BattleAnimOAMData indexes (see data/battle_anims/oam.asm)
@ -713,6 +713,9 @@ DEF NUM_BATTLEANIMFRAMESETS EQU const_value
const BATTLEANIMOAMSET_D7
DEF NUM_BATTLEANIMOAMSETS EQU const_value
assert NUM_BATTLEANIMOAMSETS <= FIRST_OAM_CMD, \
"BATTLEANIMOAMSET_* constants overlap oam*_command constants"
; BattleBGEffects indexes (see engine/battle_anims/bg_effects.asm)
const_def 1
const ANIM_BG_FLASH_INVERTED

View File

@ -90,7 +90,7 @@ DEF SPDSPCDV_SHINY EQU $AA
const BATTLETYPE_FISH
const BATTLETYPE_ROAMING
const BATTLETYPE_CONTEST
const BATTLETYPE_SHINY
const BATTLETYPE_FORCESHINY
const BATTLETYPE_TREE
const BATTLETYPE_TRAP
const BATTLETYPE_FORCEITEM

View File

@ -23,7 +23,7 @@ DEF HONOR_ROLL_DATA_LENGTH EQU (PLAYER_NAME_LENGTH - 1) * HONOR_ROLL_ENTRIES
const BATTLETOWERACTION_LOADLEVELGROUP
const BATTLETOWERACTION_CHECKSAVEFILEISYOURS
const BATTLETOWERACTION_0A
const BATTLETOWERACTION_CHECKMOBILEEVENT
const BATTLETOWERACTION_GSBALL
const BATTLETOWERACTION_0C ; more time stuff in SRAM bank 5
const BATTLETOWERACTION_0D ; more time stuff in SRAM bank 5
const BATTLETOWERACTION_EGGTICKET
@ -46,8 +46,8 @@ DEF HONOR_ROLL_DATA_LENGTH EQU (PLAYER_NAME_LENGTH - 1) * HONOR_ROLL_ENTRIES
const BATTLETOWERACTION_SAVEOPTIONS
; BattleTowerAction return values
; - from BATTLETOWERACTION_CHECKMOBILEEVENT
DEF MOBILE_EVENT_OBJECT_GS_BALL EQU $b
; - from BATTLETOWERACTION_GSBALL
DEF GS_BALL_AVAILABLE EQU $b
; BattleTowerText arguments (see engine/events/battle_tower/trainer_text.asm)
const_def 1

View File

@ -22,7 +22,7 @@
const ENGINE_CAUGHT_POKERUS
const ENGINE_ROCKET_SIGNAL_ON_CH20
const ENGINE_CREDITS_SKIP
const ENGINE_MAIN_MENU_MOBILE_CHOICES
const ENGINE_MOBILE_SYSTEM ; unused
; wStatusFlags2
const ENGINE_BUG_CONTEST_TIMER
const ENGINE_SAFARI_ZONE

View File

@ -509,7 +509,7 @@
const EVENT_MET_BUENA
const EVENT_GOT_ODD_EGG
const EVENT_33F
const EVENT_GOT_GS_BALL_FROM_POKECOM_CENTER
const EVENT_GOT_GS_BALL_FROM_GOLDENROD_POKEMON_CENTER
; Unused: next 167 events
const_next 1000

View File

@ -59,6 +59,14 @@ DEF MAILBOX_CAPACITY EQU 10
DEF MAIL_STRUCT_LENGTH EQU $2f ; mailmsg struct
DEF MAIL_STRUCT_LENGTH_JP EQU $2a ; mailmsg_jp struct
; mail languages
const_def
const MAIL_LANG_ENGLISH
const MAIL_LANG_FRENCH
const MAIL_LANG_GERMAN
const MAIL_LANG_ITALIAN
const MAIL_LANG_SPANISH
; held item effects
const_def
const HELD_NONE

View File

@ -97,6 +97,7 @@ DEF RELATIVE_ATTRIBUTES EQU 1 << RELATIVE_ATTRIBUTES_F
DEF ABSOLUTE_TILE_ID EQU 1 << ABSOLUTE_TILE_ID_F
; map_object struct members (see macros/ram.asm)
; struct initialized by object_event macro (see macros/scripts/maps.asm)
rsreset
DEF MAPOBJECT_OBJECT_STRUCT_ID rb ; 0
DEF MAPOBJECT_SPRITE rb ; 1
@ -104,10 +105,14 @@ DEF MAPOBJECT_Y_COORD rb ; 2
DEF MAPOBJECT_X_COORD rb ; 3
DEF MAPOBJECT_MOVEMENT rb ; 4
DEF MAPOBJECT_RADIUS rb ; 5
DEF MAPOBJECT_HOUR rb ; 6
DEF MAPOBJECT_HOUR_1 rb ; 6
DEF MAPOBJECT_HOUR_2 rb ; 7
rsset MAPOBJECT_HOUR_2
DEF MAPOBJECT_TIMEOFDAY rb ; 7
DEF MAPOBJECT_COLOR rb ; 8
DEF MAPOBJECT_RANGE rb ; 9
DEF MAPOBJECT_PALETTE rb ; 8
rsset MAPOBJECT_PALETTE
DEF MAPOBJECT_TYPE rb ; 8
DEF MAPOBJECT_SIGHT_RANGE rb ; 9
DEF MAPOBJECT_SCRIPT_POINTER rw ; a
DEF MAPOBJECT_EVENT_FLAG rw ; c
rb_skip 2
@ -115,6 +120,9 @@ DEF MAPOBJECT_LENGTH EQU _RS
DEF NUM_OBJECTS EQU 16
DEF PLAYER_OBJECT EQU 0
DEF MAPOBJECT_PALETTE_MASK EQU %11110000
DEF MAPOBJECT_TYPE_MASK EQU %00001111
; SpriteMovementData struct members (see data/sprites/map_objects.asm)
rsreset
DEF SPRITEMOVEATTR_MOVEMENT rb ; 0

View File

@ -96,4 +96,4 @@ ENDC
DEF ZIPCODE_MAX_LENGTH EQU 7
DEF ZIPCODE_FRAME_RIGHT_MARGIN EQU 1
DEF REGION_NAME_MAX_LENGTH EQU 7
DEF REGION_NAME_MAX_LENGTH EQU 7

View File

@ -112,7 +112,8 @@ DEF CALLBACK_SIZE EQU 3 ; callback
DEF WARP_EVENT_SIZE EQU 5 ; warp_event
DEF COORD_EVENT_SIZE EQU 8 ; coord_event
DEF BG_EVENT_SIZE EQU 5 ; bg_event
DEF OBJECT_EVENT_SIZE EQU 13 ; object_event
; An object_event is a map_object without its initial MAPOBJECT_OBJECT_STRUCT_ID or final padding
DEF OBJECT_EVENT_SIZE EQU MAPOBJECT_LENGTH - 3 ; 13
; A coord_event for scene -1 will always activate,
; regardless of the map's scene variable value.

View File

@ -19,8 +19,10 @@ DEF USING_EXTERNAL_CLOCK EQU $01
DEF USING_INTERNAL_CLOCK EQU $02
DEF CONNECTION_NOT_ESTABLISHED EQU $ff
; length of a patch list (less than any of the signal bytes)
DEF SERIAL_PATCH_LIST_LENGTH EQU $fc
; length of a patch list
DEF SERIAL_PATCH_LIST_LENGTH EQU 200
; size of the patch area (offsets into this area may not have special values)
DEF SERIAL_PATCH_DATA_SIZE EQU $fc
; signals the start of an array of bytes transferred over the link cable
DEF SERIAL_PREAMBLE_BYTE EQU $fd
; this byte is used when there is no data to send
@ -30,15 +32,17 @@ DEF SERIAL_PATCH_LIST_PART_TERMINATOR EQU $ff
; used to replace SERIAL_NO_DATA_BYTE
DEF SERIAL_PATCH_REPLACEMENT_BYTE EQU $ff
DEF SERIAL_PREAMBLE_LENGTH EQU 6
DEF SERIAL_RN_PREAMBLE_LENGTH EQU 7
DEF SERIAL_RNS_LENGTH EQU 10
DEF SERIAL_PREAMBLE_LENGTH EQU 6
DEF SERIAL_RN_PREAMBLE_LENGTH EQU 7
DEF SERIAL_PATCH_PREAMBLE_LENGTH EQU 3
DEF SERIAL_RNS_LENGTH EQU 10
DEF SERIAL_MAIL_PREAMBLE_BYTE EQU $20
DEF SERIAL_MAIL_REPLACEMENT_BYTE EQU $21
DEF SERIAL_MAIL_PREAMBLE_LENGTH EQU 5
DEF SERIAL_MAIL_PREAMBLE_BYTE EQU $20
DEF SERIAL_MAIL_PREAMBLE_LENGTH EQU 5
; used to replace SERIAL_NO_DATA_BYTE
DEF SERIAL_MAIL_REPLACEMENT_BYTE EQU $21
; timeout duration after exchanging a byte
DEF SERIAL_LINK_BYTE_TIMEOUT EQU $5000
DEF SERIAL_LINK_BYTE_TIMEOUT EQU $5000
DEF MAX_MYSTERY_GIFT_PARTNERS EQU 5
DEF MAX_MYSTERY_GIFT_PARTNERS EQU 5

View File

@ -340,3 +340,6 @@ DEF NUM_SPRITE_ANIM_FRAMESETS EQU const_value
const SPRITE_ANIM_OAMSET_EZCHAT_CURSOR_9 ; 8d
const SPRITE_ANIM_OAMSET_EZCHAT_CURSOR_10 ; 8e
DEF NUM_SPRITE_ANIM_OAMSETS EQU const_value
assert NUM_SPRITE_ANIM_OAMSETS <= FIRST_OAM_CMD, \
"SPRITE_ANIM_OAMSET_* constants overlap oam*_command constants"

View File

@ -20,7 +20,7 @@ DEF NUM_SPRITEDATA_FIELDS EQU _RS
const PAL_OW_GREEN ; 2
const PAL_OW_BROWN ; 3
const PAL_OW_PINK ; 4
const PAL_OW_SILVER ; 5
const PAL_OW_EMOTE ; 5
const PAL_OW_TREE ; 6
const PAL_OW_ROCK ; 7
@ -32,6 +32,6 @@ DEF NUM_SPRITEDATA_FIELDS EQU _RS
const PAL_NPC_GREEN ; a
const PAL_NPC_BROWN ; b
const PAL_NPC_PINK ; c
const PAL_NPC_SILVER ; d
const PAL_NPC_EMOTE ; d
const PAL_NPC_TREE ; e
const PAL_NPC_ROCK ; f

View File

@ -310,3 +310,11 @@ DEF DAYCAREMAN_ACTIVE_F EQU 7
; wDayCareLady::
DEF DAYCARELADY_HAS_MON_F EQU 0
DEF DAYCARELADY_ACTIVE_F EQU 7
; wUnlockedUnowns::
const_def
const UNLOCKED_UNOWNS_A_TO_K_F
const UNLOCKED_UNOWNS_L_TO_R_F
const UNLOCKED_UNOWNS_S_TO_W_F
const UNLOCKED_UNOWNS_X_TO_Z_F
DEF NUM_UNLOCKED_UNOWN_SETS EQU const_value

File diff suppressed because it is too large Load Diff

View File

@ -20,379 +20,379 @@ BattleAnimObjects:
; entries correspond to ANIM_OBJ_* constants
table_width BATTLEANIMOBJ_LENGTH, BattleAnimObjects
; ANIM_OBJ_HIT_BIG_YFIX
battleanimobj RELATIVE_X, $ff, BATTLEANIMFRAMESET_00, BATTLEANIMFUNC_NULL, PAL_BATTLE_OB_GRAY, ANIM_GFX_HIT
battleanimobj RELATIVE_X, $ff, BATTLEANIMFRAMESET_HIT_BIG, BATTLEANIMFUNC_NULL, PAL_BATTLE_OB_GRAY, ANIM_GFX_HIT
; ANIM_OBJ_HIT_YFIX
battleanimobj RELATIVE_X, $ff, BATTLEANIMFRAMESET_01, BATTLEANIMFUNC_NULL, PAL_BATTLE_OB_GRAY, ANIM_GFX_HIT
battleanimobj RELATIVE_X, $ff, BATTLEANIMFRAMESET_HIT, BATTLEANIMFUNC_NULL, PAL_BATTLE_OB_GRAY, ANIM_GFX_HIT
; ANIM_OBJ_HIT_SMALL_YFIX
battleanimobj RELATIVE_X, $ff, BATTLEANIMFRAMESET_02, BATTLEANIMFUNC_NULL, PAL_BATTLE_OB_GRAY, ANIM_GFX_HIT
battleanimobj RELATIVE_X, $ff, BATTLEANIMFRAMESET_HIT_SMALL, BATTLEANIMFUNC_NULL, PAL_BATTLE_OB_GRAY, ANIM_GFX_HIT
; ANIM_OBJ_HIT_BIG
battleanimobj RELATIVE_X, $90, BATTLEANIMFRAMESET_00, BATTLEANIMFUNC_NULL, PAL_BATTLE_OB_GRAY, ANIM_GFX_HIT
battleanimobj RELATIVE_X, $90, BATTLEANIMFRAMESET_HIT_BIG, BATTLEANIMFUNC_NULL, PAL_BATTLE_OB_GRAY, ANIM_GFX_HIT
; ANIM_OBJ_HIT
battleanimobj RELATIVE_X, $90, BATTLEANIMFRAMESET_01, BATTLEANIMFUNC_NULL, PAL_BATTLE_OB_GRAY, ANIM_GFX_HIT
battleanimobj RELATIVE_X, $90, BATTLEANIMFRAMESET_HIT, BATTLEANIMFUNC_NULL, PAL_BATTLE_OB_GRAY, ANIM_GFX_HIT
; ANIM_OBJ_HIT_SMALL
battleanimobj RELATIVE_X, $90, BATTLEANIMFRAMESET_02, BATTLEANIMFUNC_NULL, PAL_BATTLE_OB_GRAY, ANIM_GFX_HIT
battleanimobj RELATIVE_X, $90, BATTLEANIMFRAMESET_HIT_SMALL, BATTLEANIMFUNC_NULL, PAL_BATTLE_OB_GRAY, ANIM_GFX_HIT
; ANIM_OBJ_PUNCH
battleanimobj RELATIVE_X, $ff, BATTLEANIMFRAMESET_03, BATTLEANIMFUNC_NULL, PAL_BATTLE_OB_GRAY, ANIM_GFX_HIT
battleanimobj RELATIVE_X, $ff, BATTLEANIMFRAMESET_PUNCH, BATTLEANIMFUNC_NULL, PAL_BATTLE_OB_GRAY, ANIM_GFX_HIT
; ANIM_OBJ_KICK
battleanimobj RELATIVE_X, $ff, BATTLEANIMFRAMESET_04, BATTLEANIMFUNC_KICK, PAL_BATTLE_OB_GRAY, ANIM_GFX_HIT
battleanimobj RELATIVE_X, $ff, BATTLEANIMFRAMESET_KICK, BATTLEANIMFUNC_KICK, PAL_BATTLE_OB_GRAY, ANIM_GFX_HIT
; ANIM_OBJ_PALM
battleanimobj RELATIVE_X, $ff, BATTLEANIMFRAMESET_05, BATTLEANIMFUNC_NULL, PAL_BATTLE_OB_GRAY, ANIM_GFX_HIT
battleanimobj RELATIVE_X, $ff, BATTLEANIMFRAMESET_PALM, BATTLEANIMFUNC_NULL, PAL_BATTLE_OB_GRAY, ANIM_GFX_HIT
; ANIM_OBJ_FANG
battleanimobj RELATIVE_X, $ff, BATTLEANIMFRAMESET_06, BATTLEANIMFUNC_NULL, PAL_BATTLE_OB_GRAY, ANIM_GFX_HIT
battleanimobj RELATIVE_X, $ff, BATTLEANIMFRAMESET_FANG, BATTLEANIMFUNC_NULL, PAL_BATTLE_OB_GRAY, ANIM_GFX_HIT
; ANIM_OBJ_PUNCH_SHAKE
battleanimobj RELATIVE_X, $90, BATTLEANIMFRAMESET_07, BATTLEANIMFUNC_SHAKE, PAL_BATTLE_OB_GRAY, ANIM_GFX_HIT
battleanimobj RELATIVE_X, $90, BATTLEANIMFRAMESET_PUNCH_SHAKE, BATTLEANIMFUNC_SHAKE, PAL_BATTLE_OB_GRAY, ANIM_GFX_HIT
; ANIM_OBJ_EMBER
battleanimobj RELATIVE_X, $aa, BATTLEANIMFRAMESET_10, BATTLEANIMFUNC_EMBER, PAL_BATTLE_OB_RED, ANIM_GFX_FIRE
battleanimobj RELATIVE_X, $aa, BATTLEANIMFRAMESET_EMBER, BATTLEANIMFUNC_EMBER, PAL_BATTLE_OB_RED, ANIM_GFX_FIRE
; ANIM_OBJ_DRAGON_RAGE
battleanimobj RELATIVE_X, $90, BATTLEANIMFRAMESET_0E, BATTLEANIMFUNC_WAVE_TO_TARGET, PAL_BATTLE_OB_RED, ANIM_GFX_FIRE
battleanimobj RELATIVE_X, $90, BATTLEANIMFRAMESET_DRAGON_RAGE, BATTLEANIMFUNC_WAVE_TO_TARGET, PAL_BATTLE_OB_RED, ANIM_GFX_FIRE
; ANIM_OBJ_FLAMETHROWER
battleanimobj RELATIVE_X, $90, BATTLEANIMFRAMESET_0F, BATTLEANIMFUNC_MOVE_IN_CIRCLE, PAL_BATTLE_OB_RED, ANIM_GFX_FIRE
battleanimobj RELATIVE_X, $90, BATTLEANIMFRAMESET_FLAMETHROWER, BATTLEANIMFUNC_MOVE_IN_CIRCLE, PAL_BATTLE_OB_RED, ANIM_GFX_FIRE
; ANIM_OBJ_FIRE_SPIN
battleanimobj RELATIVE_X, $90, BATTLEANIMFRAMESET_10, BATTLEANIMFUNC_USER_TO_TARGET_SPIN, PAL_BATTLE_OB_RED, ANIM_GFX_FIRE
battleanimobj RELATIVE_X, $90, BATTLEANIMFRAMESET_EMBER, BATTLEANIMFUNC_USER_TO_TARGET_SPIN, PAL_BATTLE_OB_RED, ANIM_GFX_FIRE
; ANIM_OBJ_FIRE_BLAST
battleanimobj RELATIVE_X, $90, BATTLEANIMFRAMESET_0F, BATTLEANIMFUNC_FIRE_BLAST, PAL_BATTLE_OB_RED, ANIM_GFX_FIRE
battleanimobj RELATIVE_X, $90, BATTLEANIMFRAMESET_FLAMETHROWER, BATTLEANIMFUNC_FIRE_BLAST, PAL_BATTLE_OB_RED, ANIM_GFX_FIRE
; ANIM_OBJ_BURNED
battleanimobj RELATIVE_X, $90, BATTLEANIMFRAMESET_11, BATTLEANIMFUNC_MOVE_IN_CIRCLE, PAL_BATTLE_OB_RED, ANIM_GFX_FIRE
battleanimobj RELATIVE_X, $90, BATTLEANIMFRAMESET_BURNED, BATTLEANIMFUNC_MOVE_IN_CIRCLE, PAL_BATTLE_OB_RED, ANIM_GFX_FIRE
; ANIM_OBJ_BLIZZARD
battleanimobj RELATIVE_X, $90, BATTLEANIMFRAMESET_12, BATTLEANIMFUNC_USER_TO_TARGET_SPIN, PAL_BATTLE_OB_BLUE, ANIM_GFX_ICE
battleanimobj RELATIVE_X, $90, BATTLEANIMFRAMESET_BLIZZARD, BATTLEANIMFUNC_USER_TO_TARGET_SPIN, PAL_BATTLE_OB_BLUE, ANIM_GFX_ICE
; ANIM_OBJ_ICE
battleanimobj RELATIVE_X, $90, BATTLEANIMFRAMESET_13, BATTLEANIMFUNC_NULL, PAL_BATTLE_OB_BLUE, ANIM_GFX_ICE
battleanimobj RELATIVE_X, $90, BATTLEANIMFRAMESET_ICE, BATTLEANIMFUNC_NULL, PAL_BATTLE_OB_BLUE, ANIM_GFX_ICE
; ANIM_OBJ_ICE_BEAM
battleanimobj RELATIVE_X, $90, BATTLEANIMFRAMESET_14, BATTLEANIMFUNC_USER_TO_TARGET, PAL_BATTLE_OB_BLUE, ANIM_GFX_ICE
battleanimobj RELATIVE_X, $90, BATTLEANIMFRAMESET_ICE_BEAM, BATTLEANIMFUNC_USER_TO_TARGET, PAL_BATTLE_OB_BLUE, ANIM_GFX_ICE
; ANIM_OBJ_RAZOR_LEAF
battleanimobj RELATIVE_X | X_FLIP, $78, BATTLEANIMFRAMESET_16, BATTLEANIMFUNC_RAZOR_LEAF, PAL_BATTLE_OB_GREEN, ANIM_GFX_PLANT
battleanimobj RELATIVE_X | X_FLIP, $78, BATTLEANIMFRAMESET_RAZOR_LEAF_1, BATTLEANIMFUNC_RAZOR_LEAF, PAL_BATTLE_OB_GREEN, ANIM_GFX_PLANT
; ANIM_OBJ_POKE_BALL
battleanimobj ABSOLUTE_X, $00, BATTLEANIMFRAMESET_09, BATTLEANIMFUNC_POKEBALL, PAL_BATTLE_OB_RED, ANIM_GFX_POKE_BALL
battleanimobj ABSOLUTE_X, $00, BATTLEANIMFRAMESET_POKE_BALL_1, BATTLEANIMFUNC_POKEBALL, PAL_BATTLE_OB_RED, ANIM_GFX_POKE_BALL
; ANIM_OBJ_POKE_BALL_BLOCKED
battleanimobj ABSOLUTE_X, $00, BATTLEANIMFRAMESET_09, BATTLEANIMFUNC_POKEBALL_BLOCKED, PAL_BATTLE_OB_RED, ANIM_GFX_POKE_BALL
battleanimobj ABSOLUTE_X, $00, BATTLEANIMFRAMESET_POKE_BALL_1, BATTLEANIMFUNC_POKEBALL_BLOCKED, PAL_BATTLE_OB_RED, ANIM_GFX_POKE_BALL
; ANIM_OBJ_EXPLOSION1
battleanimobj RELATIVE_X, $90, BATTLEANIMFRAMESET_18, BATTLEANIMFUNC_NULL, PAL_BATTLE_OB_RED, ANIM_GFX_EXPLOSION
battleanimobj RELATIVE_X, $90, BATTLEANIMFRAMESET_EXPLOSION, BATTLEANIMFUNC_NULL, PAL_BATTLE_OB_RED, ANIM_GFX_EXPLOSION
; ANIM_OBJ_EXPLOSION2
battleanimobj RELATIVE_X, $ff, BATTLEANIMFRAMESET_18, BATTLEANIMFUNC_NULL, PAL_BATTLE_OB_RED, ANIM_GFX_EXPLOSION
battleanimobj RELATIVE_X, $ff, BATTLEANIMFRAMESET_EXPLOSION, BATTLEANIMFUNC_NULL, PAL_BATTLE_OB_RED, ANIM_GFX_EXPLOSION
; ANIM_OBJ_ACID
battleanimobj RELATIVE_X, $90, BATTLEANIMFRAMESET_1D, BATTLEANIMFUNC_THROW_TO_TARGET_DISAPPEAR, PAL_BATTLE_OB_GRAY, ANIM_GFX_POISON
battleanimobj RELATIVE_X, $90, BATTLEANIMFRAMESET_ACID, BATTLEANIMFUNC_THROW_TO_TARGET_DISAPPEAR, PAL_BATTLE_OB_GRAY, ANIM_GFX_POISON
; ANIM_OBJ_SLUDGE
battleanimobj RELATIVE_X, $b4, BATTLEANIMFRAMESET_1F, BATTLEANIMFUNC_SLUDGE, PAL_BATTLE_OB_GRAY, ANIM_GFX_POISON
battleanimobj RELATIVE_X, $b4, BATTLEANIMFRAMESET_SLUDGE_BUBBLE, BATTLEANIMFUNC_SLUDGE, PAL_BATTLE_OB_GRAY, ANIM_GFX_POISON
; ANIM_OBJ_BETA_BALL_POOF
battleanimobj RELATIVE_X, $90, BATTLEANIMFRAMESET_08, BATTLEANIMFUNC_NULL, PAL_BATTLE_OB_GRAY, ANIM_GFX_SMOKE
battleanimobj RELATIVE_X, $90, BATTLEANIMFRAMESET_BALL_POOF, BATTLEANIMFUNC_NULL, PAL_BATTLE_OB_GRAY, ANIM_GFX_SMOKE
; ANIM_OBJ_BALL_POOF
battleanimobj RELATIVE_X, $a0, BATTLEANIMFRAMESET_08, BATTLEANIMFUNC_NULL, PAL_BATTLE_OB_GRAY, ANIM_GFX_SMOKE
battleanimobj RELATIVE_X, $a0, BATTLEANIMFRAMESET_BALL_POOF, BATTLEANIMFUNC_NULL, PAL_BATTLE_OB_GRAY, ANIM_GFX_SMOKE
; ANIM_OBJ_BIG_ROCK
battleanimobj RELATIVE_X, $ff, BATTLEANIMFRAMESET_19, BATTLEANIMFUNC_DROP, PAL_BATTLE_OB_BROWN, ANIM_GFX_ROCKS
battleanimobj RELATIVE_X, $ff, BATTLEANIMFRAMESET_BIG_ROCK, BATTLEANIMFUNC_DROP, PAL_BATTLE_OB_BROWN, ANIM_GFX_ROCKS
; ANIM_OBJ_SMALL_ROCK
battleanimobj RELATIVE_X, $ff, BATTLEANIMFRAMESET_1A, BATTLEANIMFUNC_DROP, PAL_BATTLE_OB_BROWN, ANIM_GFX_ROCKS
battleanimobj RELATIVE_X, $ff, BATTLEANIMFRAMESET_SMALL_ROCK, BATTLEANIMFUNC_DROP, PAL_BATTLE_OB_BROWN, ANIM_GFX_ROCKS
; ANIM_OBJ_STRENGTH
battleanimobj RELATIVE_X, $b0, BATTLEANIMFRAMESET_1B, BATTLEANIMFUNC_STRENGTH_SEISMIC_TOSS, PAL_BATTLE_OB_BROWN, ANIM_GFX_ROCKS
battleanimobj RELATIVE_X, $b0, BATTLEANIMFRAMESET_STRENGTH, BATTLEANIMFUNC_STRENGTH_SEISMIC_TOSS, PAL_BATTLE_OB_BROWN, ANIM_GFX_ROCKS
; ANIM_OBJ_SEISMIC_TOSS
battleanimobj RELATIVE_X, $b0, BATTLEANIMFRAMESET_84, BATTLEANIMFUNC_STRENGTH_SEISMIC_TOSS, PAL_BATTLE_OB_BLUE, ANIM_GFX_GLOBE
battleanimobj RELATIVE_X, $b0, BATTLEANIMFRAMESET_SEISMIC_TOSS, BATTLEANIMFUNC_STRENGTH_SEISMIC_TOSS, PAL_BATTLE_OB_BLUE, ANIM_GFX_GLOBE
; ANIM_OBJ_BUBBLE
battleanimobj RELATIVE_X, $90, BATTLEANIMFRAMESET_21, BATTLEANIMFUNC_BUBBLE, PAL_BATTLE_OB_BLUE, ANIM_GFX_BUBBLE
battleanimobj RELATIVE_X, $90, BATTLEANIMFRAMESET_SMALL_BUBBLE, BATTLEANIMFUNC_BUBBLE, PAL_BATTLE_OB_BLUE, ANIM_GFX_BUBBLE
; ANIM_OBJ_SURF
battleanimobj ABSOLUTE_X, $00, BATTLEANIMFRAMESET_23, BATTLEANIMFUNC_SURF, PAL_BATTLE_OB_BLUE, ANIM_GFX_BUBBLE
battleanimobj ABSOLUTE_X, $00, BATTLEANIMFRAMESET_SURF, BATTLEANIMFUNC_SURF, PAL_BATTLE_OB_BLUE, ANIM_GFX_BUBBLE
; ANIM_OBJ_SING
battleanimobj RELATIVE_X, $90, BATTLEANIMFRAMESET_24, BATTLEANIMFUNC_SING, PAL_BATTLE_OB_GRAY, ANIM_GFX_NOISE
battleanimobj RELATIVE_X, $90, BATTLEANIMFRAMESET_MUSIC_NOTE_1, BATTLEANIMFUNC_SING, PAL_BATTLE_OB_GRAY, ANIM_GFX_NOISE
; ANIM_OBJ_WATER_GUN
battleanimobj RELATIVE_X | X_FLIP | Y_FLIP, $80, BATTLEANIMFRAMESET_27, BATTLEANIMFUNC_WATER_GUN, PAL_BATTLE_OB_BLUE, ANIM_GFX_WATER
battleanimobj RELATIVE_X | X_FLIP | Y_FLIP, $80, BATTLEANIMFRAMESET_WATER_GUN_1, BATTLEANIMFUNC_WATER_GUN, PAL_BATTLE_OB_BLUE, ANIM_GFX_WATER
; ANIM_OBJ_HYDRO_PUMP
battleanimobj RELATIVE_X, $b4, BATTLEANIMFRAMESET_2A, BATTLEANIMFUNC_NULL, PAL_BATTLE_OB_BLUE, ANIM_GFX_WATER
battleanimobj RELATIVE_X, $b4, BATTLEANIMFRAMESET_HYDRO_PUMP, BATTLEANIMFUNC_NULL, PAL_BATTLE_OB_BLUE, ANIM_GFX_WATER
; ANIM_OBJ_POWDER
battleanimobj RELATIVE_X, $40, BATTLEANIMFRAMESET_2B, BATTLEANIMFUNC_POWDER, PAL_BATTLE_OB_GREEN, ANIM_GFX_POWDER
battleanimobj RELATIVE_X, $40, BATTLEANIMFRAMESET_POWDER, BATTLEANIMFUNC_POWDER, PAL_BATTLE_OB_GREEN, ANIM_GFX_POWDER
; ANIM_OBJ_BEAM
battleanimobj RELATIVE_X | X_FLIP | Y_FLIP, $98, BATTLEANIMFRAMESET_2C, BATTLEANIMFUNC_NULL, PAL_BATTLE_OB_YELLOW, ANIM_GFX_BEAM
battleanimobj RELATIVE_X | X_FLIP | Y_FLIP, $98, BATTLEANIMFRAMESET_BEAM, BATTLEANIMFUNC_NULL, PAL_BATTLE_OB_YELLOW, ANIM_GFX_BEAM
; ANIM_OBJ_BEAM_TIP
battleanimobj RELATIVE_X | X_FLIP | Y_FLIP, $98, BATTLEANIMFRAMESET_2D, BATTLEANIMFUNC_SHAKE, PAL_BATTLE_OB_YELLOW, ANIM_GFX_BEAM
battleanimobj RELATIVE_X | X_FLIP | Y_FLIP, $98, BATTLEANIMFRAMESET_BEAM_TIP, BATTLEANIMFUNC_SHAKE, PAL_BATTLE_OB_YELLOW, ANIM_GFX_BEAM
; ANIM_OBJ_ICE_BUILDUP
battleanimobj RELATIVE_X, $b8, BATTLEANIMFRAMESET_2E, BATTLEANIMFUNC_NULL, PAL_BATTLE_OB_BLUE, ANIM_GFX_ICE
battleanimobj RELATIVE_X, $b8, BATTLEANIMFRAMESET_ICE_BUILDUP, BATTLEANIMFUNC_NULL, PAL_BATTLE_OB_BLUE, ANIM_GFX_ICE
; ANIM_OBJ_FROZEN
battleanimobj RELATIVE_X, $b8, BATTLEANIMFRAMESET_2F, BATTLEANIMFUNC_NULL, PAL_BATTLE_OB_BLUE, ANIM_GFX_ICE
battleanimobj RELATIVE_X, $b8, BATTLEANIMFRAMESET_FROZEN, BATTLEANIMFUNC_NULL, PAL_BATTLE_OB_BLUE, ANIM_GFX_ICE
; ANIM_OBJ_MASTER_BALL_SPARKLE
battleanimobj RELATIVE_X, $b8, BATTLEANIMFRAMESET_30, BATTLEANIMFUNC_RECOVER, PAL_BATTLE_OB_BROWN, ANIM_GFX_SPEED
battleanimobj RELATIVE_X, $b8, BATTLEANIMFRAMESET_CIRCLING_SPARKLE, BATTLEANIMFUNC_RECOVER, PAL_BATTLE_OB_BROWN, ANIM_GFX_SPEED
; ANIM_OBJ_RECOVER
battleanimobj RELATIVE_X, $90, BATTLEANIMFRAMESET_21, BATTLEANIMFUNC_RECOVER, PAL_BATTLE_OB_YELLOW, ANIM_GFX_BUBBLE
; ANIM_OBJ_THUNDER1
battleanimobj RELATIVE_X | X_FLIP, $b0, BATTLEANIMFRAMESET_31, BATTLEANIMFUNC_NULL, PAL_BATTLE_OB_YELLOW, ANIM_GFX_LIGHTNING
; ANIM_OBJ_THUNDER2
battleanimobj RELATIVE_X | X_FLIP, $b0, BATTLEANIMFRAMESET_32, BATTLEANIMFUNC_NULL, PAL_BATTLE_OB_YELLOW, ANIM_GFX_LIGHTNING
; ANIM_OBJ_THUNDER3
battleanimobj RELATIVE_X | X_FLIP, $b0, BATTLEANIMFRAMESET_33, BATTLEANIMFUNC_NULL, PAL_BATTLE_OB_YELLOW, ANIM_GFX_LIGHTNING
battleanimobj RELATIVE_X, $90, BATTLEANIMFRAMESET_SMALL_BUBBLE, BATTLEANIMFUNC_RECOVER, PAL_BATTLE_OB_YELLOW, ANIM_GFX_BUBBLE
; ANIM_OBJ_THUNDER_CENTER
battleanimobj RELATIVE_X | X_FLIP, $b0, BATTLEANIMFRAMESET_THUNDER_CENTER, BATTLEANIMFUNC_NULL, PAL_BATTLE_OB_YELLOW, ANIM_GFX_LIGHTNING
; ANIM_OBJ_THUNDER_LEFT
battleanimobj RELATIVE_X | X_FLIP, $b0, BATTLEANIMFRAMESET_THUNDER_LEFT, BATTLEANIMFUNC_NULL, PAL_BATTLE_OB_YELLOW, ANIM_GFX_LIGHTNING
; ANIM_OBJ_THUNDER_RIGHT
battleanimobj RELATIVE_X | X_FLIP, $b0, BATTLEANIMFRAMESET_THUNDER_RIGHT, BATTLEANIMFUNC_NULL, PAL_BATTLE_OB_YELLOW, ANIM_GFX_LIGHTNING
; ANIM_OBJ_THUNDER_WAVE
battleanimobj RELATIVE_X | X_FLIP, $90, BATTLEANIMFRAMESET_34, BATTLEANIMFUNC_THUNDER_WAVE, PAL_BATTLE_OB_YELLOW, ANIM_GFX_LIGHTNING
; ANIM_OBJ_SPARKS_CIRCLE_BIG
battleanimobj RELATIVE_X | X_FLIP, $90, BATTLEANIMFRAMESET_36, BATTLEANIMFUNC_NULL, PAL_BATTLE_OB_YELLOW, ANIM_GFX_LIGHTNING
; ANIM_OBJ_THUNDERBOLT_BALL
battleanimobj RELATIVE_X | X_FLIP, $90, BATTLEANIMFRAMESET_37, BATTLEANIMFUNC_MOVE_IN_CIRCLE, PAL_BATTLE_OB_GRAY, ANIM_GFX_EXPLOSION
; ANIM_OBJ_SPARKS_CIRCLE
battleanimobj RELATIVE_X | X_FLIP, $90, BATTLEANIMFRAMESET_38, BATTLEANIMFUNC_NULL, PAL_BATTLE_OB_YELLOW, ANIM_GFX_LIGHTNING
; ANIM_OBJ_THUNDERSHOCK_BALL
battleanimobj RELATIVE_X | X_FLIP, $90, BATTLEANIMFRAMESET_39, BATTLEANIMFUNC_MOVE_IN_CIRCLE, PAL_BATTLE_OB_GRAY, ANIM_GFX_EXPLOSION
battleanimobj RELATIVE_X | X_FLIP, $90, BATTLEANIMFRAMESET_THUNDER_WAVE_DISABLE, BATTLEANIMFUNC_THUNDER_WAVE, PAL_BATTLE_OB_YELLOW, ANIM_GFX_LIGHTNING
; ANIM_OBJ_THUNDERBOLT_SPARKS
battleanimobj RELATIVE_X | X_FLIP, $90, BATTLEANIMFRAMESET_THUNDERBOLT_SPARKS, BATTLEANIMFUNC_NULL, PAL_BATTLE_OB_YELLOW, ANIM_GFX_LIGHTNING
; ANIM_OBJ_THUNDERBOLT_CORE
battleanimobj RELATIVE_X | X_FLIP, $90, BATTLEANIMFRAMESET_THUNDERBOLT_CORE, BATTLEANIMFUNC_MOVE_IN_CIRCLE, PAL_BATTLE_OB_GRAY, ANIM_GFX_EXPLOSION
; ANIM_OBJ_THUNDERSHOCK_SPARKS
battleanimobj RELATIVE_X | X_FLIP, $90, BATTLEANIMFRAMESET_THUNDERSHOCK_SPARKS, BATTLEANIMFUNC_NULL, PAL_BATTLE_OB_YELLOW, ANIM_GFX_LIGHTNING
; ANIM_OBJ_THUNDERSHOCK_CORE
battleanimobj RELATIVE_X | X_FLIP, $90, BATTLEANIMFRAMESET_THUNDERSHOCK_CORE, BATTLEANIMFUNC_MOVE_IN_CIRCLE, PAL_BATTLE_OB_GRAY, ANIM_GFX_EXPLOSION
; ANIM_OBJ_CLAMP
battleanimobj RELATIVE_X | X_FLIP, $90, BATTLEANIMFRAMESET_3A, BATTLEANIMFUNC_CLAMP_ENCORE, PAL_BATTLE_OB_GRAY, ANIM_GFX_CUT
battleanimobj RELATIVE_X | X_FLIP, $90, BATTLEANIMFRAMESET_CLAMP, BATTLEANIMFUNC_CLAMP_ENCORE, PAL_BATTLE_OB_GRAY, ANIM_GFX_CUT
; ANIM_OBJ_BITE
battleanimobj RELATIVE_X, $90, BATTLEANIMFRAMESET_3C, BATTLEANIMFUNC_BITE, PAL_BATTLE_OB_GRAY, ANIM_GFX_CUT
battleanimobj RELATIVE_X, $90, BATTLEANIMFRAMESET_BITE_1, BATTLEANIMFUNC_BITE, PAL_BATTLE_OB_GRAY, ANIM_GFX_CUT
; ANIM_OBJ_CUT_DOWN_LEFT
battleanimobj RELATIVE_X | X_FLIP, $ff, BATTLEANIMFRAMESET_3E, BATTLEANIMFUNC_NULL, PAL_BATTLE_OB_GRAY, ANIM_GFX_CUT
battleanimobj RELATIVE_X | X_FLIP, $ff, BATTLEANIMFRAMESET_CUT_DOWN_LEFT, BATTLEANIMFUNC_NULL, PAL_BATTLE_OB_GRAY, ANIM_GFX_CUT
; ANIM_OBJ_CUT_DOWN_RIGHT
battleanimobj RELATIVE_X | X_FLIP, $ff, BATTLEANIMFRAMESET_3F, BATTLEANIMFUNC_NULL, PAL_BATTLE_OB_GRAY, ANIM_GFX_CUT
battleanimobj RELATIVE_X | X_FLIP, $ff, BATTLEANIMFRAMESET_CUT_DOWN_RIGHT, BATTLEANIMFUNC_NULL, PAL_BATTLE_OB_GRAY, ANIM_GFX_CUT
; ANIM_OBJ_CUT_UP_RIGHT
battleanimobj RELATIVE_X | X_FLIP, $ff, BATTLEANIMFRAMESET_40, BATTLEANIMFUNC_NULL, PAL_BATTLE_OB_GRAY, ANIM_GFX_CUT
battleanimobj RELATIVE_X | X_FLIP, $ff, BATTLEANIMFRAMESET_CUT_UP_RIGHT, BATTLEANIMFUNC_NULL, PAL_BATTLE_OB_GRAY, ANIM_GFX_CUT
; ANIM_OBJ_CUT_LONG_DOWN_LEFT
battleanimobj RELATIVE_X | X_FLIP, $ff, BATTLEANIMFRAMESET_41, BATTLEANIMFUNC_NULL, PAL_BATTLE_OB_GRAY, ANIM_GFX_CUT
battleanimobj RELATIVE_X | X_FLIP, $ff, BATTLEANIMFRAMESET_CUT_LONG_DOWN_LEFT, BATTLEANIMFUNC_NULL, PAL_BATTLE_OB_GRAY, ANIM_GFX_CUT
; ANIM_OBJ_CUT_LONG_DOWN_RIGHT
battleanimobj RELATIVE_X | X_FLIP, $ff, BATTLEANIMFRAMESET_42, BATTLEANIMFUNC_NULL, PAL_BATTLE_OB_GRAY, ANIM_GFX_CUT
battleanimobj RELATIVE_X | X_FLIP, $ff, BATTLEANIMFRAMESET_CUT_LONG_DOWN_RIGHT, BATTLEANIMFUNC_NULL, PAL_BATTLE_OB_GRAY, ANIM_GFX_CUT
; ANIM_OBJ_SOLAR_BEAM_CHARGE
battleanimobj RELATIVE_X, $88, BATTLEANIMFRAMESET_43, BATTLEANIMFUNC_SOLAR_BEAM, PAL_BATTLE_OB_GREEN, ANIM_GFX_CHARGE
battleanimobj RELATIVE_X, $88, BATTLEANIMFRAMESET_CHARGE_ORB_1, BATTLEANIMFUNC_SOLAR_BEAM, PAL_BATTLE_OB_GREEN, ANIM_GFX_CHARGE
; ANIM_OBJ_ABSORB_CENTER
battleanimobj RELATIVE_X, $88, BATTLEANIMFRAMESET_44, BATTLEANIMFUNC_NULL, PAL_BATTLE_OB_GREEN, ANIM_GFX_CHARGE
battleanimobj RELATIVE_X, $88, BATTLEANIMFRAMESET_ABSORB_CENTER, BATTLEANIMFUNC_NULL, PAL_BATTLE_OB_GREEN, ANIM_GFX_CHARGE
; ANIM_OBJ_GUST
battleanimobj RELATIVE_X | X_FLIP, $b8, BATTLEANIMFRAMESET_45, BATTLEANIMFUNC_GUST, PAL_BATTLE_OB_GRAY, ANIM_GFX_WIND
battleanimobj RELATIVE_X | X_FLIP, $b8, BATTLEANIMFRAMESET_GUST, BATTLEANIMFUNC_GUST, PAL_BATTLE_OB_GRAY, ANIM_GFX_WIND
; ANIM_OBJ_VINE_WHIP1
battleanimobj RELATIVE_X | X_FLIP, $ff, BATTLEANIMFRAMESET_46, BATTLEANIMFUNC_NULL, PAL_BATTLE_OB_GRAY, ANIM_GFX_WHIP
battleanimobj RELATIVE_X | X_FLIP, $ff, BATTLEANIMFRAMESET_VINE_WHIP_1, BATTLEANIMFUNC_NULL, PAL_BATTLE_OB_GRAY, ANIM_GFX_WHIP
; ANIM_OBJ_VINE_WHIP2
battleanimobj RELATIVE_X | X_FLIP, $ff, BATTLEANIMFRAMESET_47, BATTLEANIMFUNC_NULL, PAL_BATTLE_OB_GRAY, ANIM_GFX_WHIP
battleanimobj RELATIVE_X | X_FLIP, $ff, BATTLEANIMFRAMESET_VINE_WHIP_2, BATTLEANIMFUNC_NULL, PAL_BATTLE_OB_GRAY, ANIM_GFX_WHIP
; ANIM_OBJ_RAZOR_WIND1
battleanimobj RELATIVE_X | X_FLIP, $ff, BATTLEANIMFRAMESET_48, BATTLEANIMFUNC_RAZOR_WIND, PAL_BATTLE_OB_GRAY, ANIM_GFX_WHIP
battleanimobj RELATIVE_X | X_FLIP, $ff, BATTLEANIMFRAMESET_RAZOR_WIND_1, BATTLEANIMFUNC_RAZOR_WIND, PAL_BATTLE_OB_GRAY, ANIM_GFX_WHIP
; ANIM_OBJ_RAZOR_WIND2
battleanimobj RELATIVE_X | X_FLIP, $ff, BATTLEANIMFRAMESET_49, BATTLEANIMFUNC_RAZOR_WIND, PAL_BATTLE_OB_GRAY, ANIM_GFX_WHIP
battleanimobj RELATIVE_X | X_FLIP, $ff, BATTLEANIMFRAMESET_RAZOR_WIND_2, BATTLEANIMFUNC_RAZOR_WIND, PAL_BATTLE_OB_GRAY, ANIM_GFX_WHIP
; ANIM_OBJ_SONICBOOM_JP
battleanimobj RELATIVE_X | X_FLIP, $98, BATTLEANIMFRAMESET_4A, BATTLEANIMFUNC_USER_TO_TARGET, PAL_BATTLE_OB_GRAY, ANIM_GFX_WHIP
battleanimobj RELATIVE_X | X_FLIP, $98, BATTLEANIMFRAMESET_SONICBOOM_JP, BATTLEANIMFUNC_USER_TO_TARGET, PAL_BATTLE_OB_GRAY, ANIM_GFX_WHIP
; ANIM_OBJ_WARP
battleanimobj RELATIVE_X | X_FLIP, $80, BATTLEANIMFRAMESET_4B, BATTLEANIMFUNC_NULL, PAL_BATTLE_OB_YELLOW, ANIM_GFX_SPEED
battleanimobj RELATIVE_X | X_FLIP, $80, BATTLEANIMFRAMESET_WARP, BATTLEANIMFUNC_NULL, PAL_BATTLE_OB_YELLOW, ANIM_GFX_SPEED
; ANIM_OBJ_ABSORB
battleanimobj RELATIVE_X, $88, BATTLEANIMFRAMESET_4C, BATTLEANIMFUNC_ABSORB, PAL_BATTLE_OB_GREEN, ANIM_GFX_CHARGE
battleanimobj RELATIVE_X, $88, BATTLEANIMFRAMESET_CHARGE_ORB_2, BATTLEANIMFUNC_ABSORB, PAL_BATTLE_OB_GREEN, ANIM_GFX_CHARGE
; ANIM_OBJ_EGG
battleanimobj RELATIVE_X | X_FLIP, $b0, BATTLEANIMFRAMESET_4D, BATTLEANIMFUNC_EGG, PAL_BATTLE_OB_GRAY, ANIM_GFX_EGG
battleanimobj RELATIVE_X | X_FLIP, $b0, BATTLEANIMFRAMESET_EGG, BATTLEANIMFUNC_EGG, PAL_BATTLE_OB_GRAY, ANIM_GFX_EGG
; ANIM_OBJ_FOCUS
battleanimobj RELATIVE_X, $b0, BATTLEANIMFRAMESET_51, BATTLEANIMFUNC_MOVE_UP, PAL_BATTLE_OB_YELLOW, ANIM_GFX_SPEED
battleanimobj RELATIVE_X, $b0, BATTLEANIMFRAMESET_FOCUS, BATTLEANIMFUNC_MOVE_UP, PAL_BATTLE_OB_YELLOW, ANIM_GFX_SPEED
; ANIM_OBJ_BIND1
battleanimobj RELATIVE_X | X_FLIP, $ff, BATTLEANIMFRAMESET_52, BATTLEANIMFUNC_WRAP, PAL_BATTLE_OB_GREEN, ANIM_GFX_ROPE
battleanimobj RELATIVE_X | X_FLIP, $ff, BATTLEANIMFRAMESET_BIND_1, BATTLEANIMFUNC_WRAP, PAL_BATTLE_OB_GREEN, ANIM_GFX_ROPE
; ANIM_OBJ_BIND2
battleanimobj RELATIVE_X | X_FLIP, $ff, BATTLEANIMFRAMESET_54, BATTLEANIMFUNC_WRAP, PAL_BATTLE_OB_GREEN, ANIM_GFX_ROPE
battleanimobj RELATIVE_X | X_FLIP, $ff, BATTLEANIMFRAMESET_BIND_3, BATTLEANIMFUNC_WRAP, PAL_BATTLE_OB_GREEN, ANIM_GFX_ROPE
; ANIM_OBJ_LEECH_SEED
battleanimobj RELATIVE_X | X_FLIP, $68, BATTLEANIMFRAMESET_56, BATTLEANIMFUNC_LEECH_SEED, PAL_BATTLE_OB_GREEN, ANIM_GFX_PLANT
battleanimobj RELATIVE_X | X_FLIP, $68, BATTLEANIMFRAMESET_LEECH_SEED_1, BATTLEANIMFUNC_LEECH_SEED, PAL_BATTLE_OB_GREEN, ANIM_GFX_PLANT
; ANIM_OBJ_SOUND
battleanimobj RELATIVE_X | X_FLIP, $90, BATTLEANIMFRAMESET_59, BATTLEANIMFUNC_SOUND, PAL_BATTLE_OB_GRAY, ANIM_GFX_NOISE
battleanimobj RELATIVE_X | X_FLIP, $90, BATTLEANIMFRAMESET_SOUND_1, BATTLEANIMFUNC_SOUND, PAL_BATTLE_OB_GRAY, ANIM_GFX_NOISE
; ANIM_OBJ_WAVE
battleanimobj RELATIVE_X | X_FLIP, $90, BATTLEANIMFRAMESET_5C, BATTLEANIMFUNC_USER_TO_TARGET_DISAPPEAR, PAL_BATTLE_OB_GRAY, ANIM_GFX_PSYCHIC
battleanimobj RELATIVE_X | X_FLIP, $90, BATTLEANIMFRAMESET_WAVE, BATTLEANIMFUNC_USER_TO_TARGET_DISAPPEAR, PAL_BATTLE_OB_GRAY, ANIM_GFX_PSYCHIC
; ANIM_OBJ_CONFUSE_RAY
battleanimobj RELATIVE_X, $90, BATTLEANIMFRAMESET_5D, BATTLEANIMFUNC_CONFUSE_RAY, PAL_BATTLE_OB_YELLOW, ANIM_GFX_SPEED
battleanimobj RELATIVE_X, $90, BATTLEANIMFRAMESET_CONFUSE_RAY_1, BATTLEANIMFUNC_CONFUSE_RAY, PAL_BATTLE_OB_YELLOW, ANIM_GFX_SPEED
; ANIM_OBJ_LEER
battleanimobj RELATIVE_X | X_FLIP | Y_FLIP, $88, BATTLEANIMFRAMESET_5F, BATTLEANIMFUNC_NULL, PAL_BATTLE_OB_YELLOW, ANIM_GFX_BEAM
battleanimobj RELATIVE_X | X_FLIP | Y_FLIP, $88, BATTLEANIMFRAMESET_LEER, BATTLEANIMFUNC_NULL, PAL_BATTLE_OB_YELLOW, ANIM_GFX_BEAM
; ANIM_OBJ_LEER_TIP
battleanimobj RELATIVE_X | X_FLIP | Y_FLIP, $88, BATTLEANIMFRAMESET_2D, BATTLEANIMFUNC_SHAKE, PAL_BATTLE_OB_YELLOW, ANIM_GFX_BEAM
battleanimobj RELATIVE_X | X_FLIP | Y_FLIP, $88, BATTLEANIMFRAMESET_BEAM_TIP, BATTLEANIMFUNC_SHAKE, PAL_BATTLE_OB_YELLOW, ANIM_GFX_BEAM
; ANIM_OBJ_SCREEN
battleanimobj RELATIVE_X | X_FLIP, $88, BATTLEANIMFRAMESET_60, BATTLEANIMFUNC_NULL, PAL_BATTLE_OB_YELLOW, ANIM_GFX_REFLECT
battleanimobj RELATIVE_X | X_FLIP, $88, BATTLEANIMFRAMESET_REFLECT, BATTLEANIMFUNC_NULL, PAL_BATTLE_OB_YELLOW, ANIM_GFX_REFLECT
; ANIM_OBJ_HARDEN
battleanimobj RELATIVE_X | X_FLIP, $80, BATTLEANIMFRAMESET_60, BATTLEANIMFUNC_NULL, PAL_BATTLE_OB_GRAY, ANIM_GFX_REFLECT
battleanimobj RELATIVE_X | X_FLIP, $80, BATTLEANIMFRAMESET_REFLECT, BATTLEANIMFUNC_NULL, PAL_BATTLE_OB_GRAY, ANIM_GFX_REFLECT
; ANIM_OBJ_CHICK
battleanimobj RELATIVE_X | X_FLIP, $50, BATTLEANIMFRAMESET_61, BATTLEANIMFUNC_DIZZY, PAL_BATTLE_OB_YELLOW, ANIM_GFX_STATUS
battleanimobj RELATIVE_X | X_FLIP, $50, BATTLEANIMFRAMESET_CHICK_1, BATTLEANIMFUNC_DIZZY, PAL_BATTLE_OB_YELLOW, ANIM_GFX_STATUS
; ANIM_OBJ_AMNESIA
battleanimobj RELATIVE_X, $80, BATTLEANIMFRAMESET_63, BATTLEANIMFUNC_AMNESIA, PAL_BATTLE_OB_GRAY, ANIM_GFX_STATUS
battleanimobj RELATIVE_X, $80, BATTLEANIMFRAMESET_AMNESIA_1, BATTLEANIMFUNC_AMNESIA, PAL_BATTLE_OB_GRAY, ANIM_GFX_STATUS
; ANIM_OBJ_ASLEEP
battleanimobj RELATIVE_X, $80, BATTLEANIMFRAMESET_66, BATTLEANIMFUNC_FLOAT_UP, PAL_BATTLE_OB_GRAY, ANIM_GFX_STATUS
; ANIM_OBJ_SKULL
battleanimobj RELATIVE_X, $50, BATTLEANIMFRAMESET_1C, BATTLEANIMFUNC_NULL, PAL_BATTLE_OB_GRAY, ANIM_GFX_POISON
battleanimobj RELATIVE_X, $80, BATTLEANIMFRAMESET_ASLEEP, BATTLEANIMFUNC_FLOAT_UP, PAL_BATTLE_OB_GRAY, ANIM_GFX_STATUS
; ANIM_OBJ_SKULL_CROSSBONE
battleanimobj RELATIVE_X, $50, BATTLEANIMFRAMESET_SKULL_CROSSBONE, BATTLEANIMFUNC_NULL, PAL_BATTLE_OB_GRAY, ANIM_GFX_POISON
; ANIM_OBJ_DIG_SAND
battleanimobj RELATIVE_X | X_FLIP, $a8, BATTLEANIMFRAMESET_67, BATTLEANIMFUNC_DIG, PAL_BATTLE_OB_BROWN, ANIM_GFX_SAND
battleanimobj RELATIVE_X | X_FLIP, $a8, BATTLEANIMFRAMESET_DIG_SAND, BATTLEANIMFUNC_DIG, PAL_BATTLE_OB_BROWN, ANIM_GFX_SAND
; ANIM_OBJ_DIG_PILE
battleanimobj RELATIVE_X | X_FLIP, $a8, BATTLEANIMFRAMESET_68, BATTLEANIMFUNC_NULL, PAL_BATTLE_OB_BROWN, ANIM_GFX_SAND
battleanimobj RELATIVE_X | X_FLIP, $a8, BATTLEANIMFRAMESET_DIG_PILE, BATTLEANIMFUNC_NULL, PAL_BATTLE_OB_BROWN, ANIM_GFX_SAND
; ANIM_OBJ_SAND
battleanimobj RELATIVE_X | X_FLIP, $90, BATTLEANIMFRAMESET_69, BATTLEANIMFUNC_USER_TO_TARGET, PAL_BATTLE_OB_GRAY, ANIM_GFX_SAND
battleanimobj RELATIVE_X | X_FLIP, $90, BATTLEANIMFRAMESET_SAND, BATTLEANIMFUNC_USER_TO_TARGET, PAL_BATTLE_OB_GRAY, ANIM_GFX_SAND
; ANIM_OBJ_PARALYZED
battleanimobj RELATIVE_X | X_FLIP, $90, BATTLEANIMFRAMESET_6D, BATTLEANIMFUNC_PARALYZED, PAL_BATTLE_OB_YELLOW, ANIM_GFX_STATUS
battleanimobj RELATIVE_X | X_FLIP, $90, BATTLEANIMFRAMESET_PARALYZED, BATTLEANIMFUNC_PARALYZED, PAL_BATTLE_OB_YELLOW, ANIM_GFX_STATUS
; ANIM_OBJ_STRING_SHOT
battleanimobj RELATIVE_X | X_FLIP, $90, BATTLEANIMFRAMESET_6A, BATTLEANIMFUNC_STRING, PAL_BATTLE_OB_GRAY, ANIM_GFX_WEB
battleanimobj RELATIVE_X | X_FLIP, $90, BATTLEANIMFRAMESET_STRING_SHOT_1, BATTLEANIMFUNC_STRING, PAL_BATTLE_OB_GRAY, ANIM_GFX_WEB
; ANIM_OBJ_HAZE
battleanimobj ABSOLUTE_X, $00, BATTLEANIMFRAMESET_6F, BATTLEANIMFUNC_SPIRAL_DESCENT, PAL_BATTLE_OB_GRAY, ANIM_GFX_HAZE
battleanimobj ABSOLUTE_X, $00, BATTLEANIMFRAMESET_HAZE, BATTLEANIMFUNC_SPIRAL_DESCENT, PAL_BATTLE_OB_GRAY, ANIM_GFX_HAZE
; ANIM_OBJ_MIST
battleanimobj RELATIVE_X | X_FLIP, $48, BATTLEANIMFRAMESET_70, BATTLEANIMFUNC_SPIRAL_DESCENT, PAL_BATTLE_OB_GRAY, ANIM_GFX_HAZE
battleanimobj RELATIVE_X | X_FLIP, $48, BATTLEANIMFRAMESET_MIST, BATTLEANIMFUNC_SPIRAL_DESCENT, PAL_BATTLE_OB_GRAY, ANIM_GFX_HAZE
; ANIM_OBJ_SMOG
battleanimobj RELATIVE_X | X_FLIP, $48, BATTLEANIMFRAMESET_6F, BATTLEANIMFUNC_SPIRAL_DESCENT, PAL_BATTLE_OB_GRAY, ANIM_GFX_HAZE
battleanimobj RELATIVE_X | X_FLIP, $48, BATTLEANIMFRAMESET_HAZE, BATTLEANIMFUNC_SPIRAL_DESCENT, PAL_BATTLE_OB_GRAY, ANIM_GFX_HAZE
; ANIM_OBJ_POISON_GAS
battleanimobj RELATIVE_X | X_FLIP, $78, BATTLEANIMFRAMESET_6F, BATTLEANIMFUNC_POISON_GAS, PAL_BATTLE_OB_GRAY, ANIM_GFX_HAZE
battleanimobj RELATIVE_X | X_FLIP, $78, BATTLEANIMFRAMESET_HAZE, BATTLEANIMFUNC_POISON_GAS, PAL_BATTLE_OB_GRAY, ANIM_GFX_HAZE
; ANIM_OBJ_HORN
battleanimobj RELATIVE_X | X_FLIP | Y_FLIP, $90, BATTLEANIMFRAMESET_71, BATTLEANIMFUNC_HORN, PAL_BATTLE_OB_GRAY, ANIM_GFX_HORN
battleanimobj RELATIVE_X | X_FLIP | Y_FLIP, $90, BATTLEANIMFRAMESET_HORN, BATTLEANIMFUNC_HORN, PAL_BATTLE_OB_GRAY, ANIM_GFX_HORN
; ANIM_OBJ_NEEDLE
battleanimobj RELATIVE_X | X_FLIP | Y_FLIP, $90, BATTLEANIMFRAMESET_72, BATTLEANIMFUNC_NEEDLE, PAL_BATTLE_OB_GRAY, ANIM_GFX_HORN
battleanimobj RELATIVE_X | X_FLIP | Y_FLIP, $90, BATTLEANIMFRAMESET_NEEDLE, BATTLEANIMFUNC_NEEDLE, PAL_BATTLE_OB_GRAY, ANIM_GFX_HORN
; ANIM_OBJ_PETAL_DANCE
battleanimobj RELATIVE_X, $48, BATTLEANIMFRAMESET_73, BATTLEANIMFUNC_PETAL_DANCE, PAL_BATTLE_OB_RED, ANIM_GFX_FLOWER
battleanimobj RELATIVE_X, $48, BATTLEANIMFRAMESET_FLOWER, BATTLEANIMFUNC_PETAL_DANCE, PAL_BATTLE_OB_RED, ANIM_GFX_FLOWER
; ANIM_OBJ_SLUDGE_BOMB
battleanimobj RELATIVE_X, $90, BATTLEANIMFRAMESET_74, BATTLEANIMFUNC_THROW_TO_TARGET_DISAPPEAR, PAL_BATTLE_OB_GRAY, ANIM_GFX_EGG
battleanimobj RELATIVE_X, $90, BATTLEANIMFRAMESET_BARRAGE_BALL, BATTLEANIMFUNC_THROW_TO_TARGET_DISAPPEAR, PAL_BATTLE_OB_GRAY, ANIM_GFX_EGG
; ANIM_OBJ_PAY_DAY
battleanimobj RELATIVE_X, $ff, BATTLEANIMFRAMESET_75, BATTLEANIMFUNC_THIEF_PAYDAY, PAL_BATTLE_OB_BROWN, ANIM_GFX_STATUS
battleanimobj RELATIVE_X, $ff, BATTLEANIMFRAMESET_PAY_DAY, BATTLEANIMFUNC_THIEF_PAYDAY, PAL_BATTLE_OB_BROWN, ANIM_GFX_STATUS
; ANIM_OBJ_SONICBOOM_JP_UNUSED
battleanimobj RELATIVE_X | X_FLIP, $90, BATTLEANIMFRAMESET_4A, BATTLEANIMFUNC_USER_TO_TARGET_DISAPPEAR, PAL_BATTLE_OB_GRAY, ANIM_GFX_WHIP
battleanimobj RELATIVE_X | X_FLIP, $90, BATTLEANIMFRAMESET_SONICBOOM_JP, BATTLEANIMFUNC_USER_TO_TARGET_DISAPPEAR, PAL_BATTLE_OB_GRAY, ANIM_GFX_WHIP
; ANIM_OBJ_MIMIC
battleanimobj RELATIVE_X, $80, BATTLEANIMFRAMESET_30, BATTLEANIMFUNC_ABSORB_CIRCLE, PAL_BATTLE_OB_GRAY, ANIM_GFX_SPEED
battleanimobj RELATIVE_X, $80, BATTLEANIMFRAMESET_CIRCLING_SPARKLE, BATTLEANIMFUNC_ABSORB_CIRCLE, PAL_BATTLE_OB_GRAY, ANIM_GFX_SPEED
; ANIM_OBJ_ATTRACT
battleanimobj RELATIVE_X, $78, BATTLEANIMFRAMESET_76, BATTLEANIMFUNC_POISON_GAS, PAL_BATTLE_OB_RED, ANIM_GFX_OBJECTS
battleanimobj RELATIVE_X, $78, BATTLEANIMFRAMESET_HEART, BATTLEANIMFUNC_POISON_GAS, PAL_BATTLE_OB_RED, ANIM_GFX_OBJECTS
; ANIM_OBJ_BONEMERANG
battleanimobj RELATIVE_X, $80, BATTLEANIMFRAMESET_77, BATTLEANIMFUNC_BONEMERANG, PAL_BATTLE_OB_GRAY, ANIM_GFX_MISC
battleanimobj RELATIVE_X, $80, BATTLEANIMFRAMESET_SPINNING_BONE, BATTLEANIMFUNC_BONEMERANG, PAL_BATTLE_OB_GRAY, ANIM_GFX_MISC
; ANIM_OBJ_BONE_CLUB
battleanimobj RELATIVE_X, $90, BATTLEANIMFRAMESET_77, BATTLEANIMFUNC_USER_TO_TARGET_DISAPPEAR, PAL_BATTLE_OB_GRAY, ANIM_GFX_MISC
battleanimobj RELATIVE_X, $90, BATTLEANIMFRAMESET_SPINNING_BONE, BATTLEANIMFUNC_USER_TO_TARGET_DISAPPEAR, PAL_BATTLE_OB_GRAY, ANIM_GFX_MISC
; ANIM_OBJ_BONE_RUSH
battleanimobj RELATIVE_X, $ff, BATTLEANIMFRAMESET_77, BATTLEANIMFUNC_NULL, PAL_BATTLE_OB_GRAY, ANIM_GFX_MISC
battleanimobj RELATIVE_X, $ff, BATTLEANIMFRAMESET_SPINNING_BONE, BATTLEANIMFUNC_NULL, PAL_BATTLE_OB_GRAY, ANIM_GFX_MISC
; ANIM_OBJ_SWIFT
battleanimobj RELATIVE_X, $80, BATTLEANIMFRAMESET_78, BATTLEANIMFUNC_USER_TO_TARGET_SPIN, PAL_BATTLE_OB_YELLOW, ANIM_GFX_OBJECTS
battleanimobj RELATIVE_X, $80, BATTLEANIMFRAMESET_STAR, BATTLEANIMFUNC_USER_TO_TARGET_SPIN, PAL_BATTLE_OB_YELLOW, ANIM_GFX_OBJECTS
; ANIM_OBJ_KINESIS
battleanimobj RELATIVE_X | X_FLIP, $90, BATTLEANIMFRAMESET_79, BATTLEANIMFUNC_NULL, PAL_BATTLE_OB_GRAY, ANIM_GFX_MISC
battleanimobj RELATIVE_X | X_FLIP, $90, BATTLEANIMFRAMESET_SPOON, BATTLEANIMFUNC_NULL, PAL_BATTLE_OB_GRAY, ANIM_GFX_MISC
; ANIM_OBJ_FLASH
battleanimobj RELATIVE_X, $ff, BATTLEANIMFRAMESET_7A, BATTLEANIMFUNC_SHINY, PAL_BATTLE_OB_YELLOW, ANIM_GFX_SPEED
battleanimobj RELATIVE_X, $ff, BATTLEANIMFRAMESET_SPARKLE, BATTLEANIMFUNC_SHINY, PAL_BATTLE_OB_YELLOW, ANIM_GFX_SPEED
; ANIM_OBJ_SHINY
battleanimobj RELATIVE_X, $88, BATTLEANIMFRAMESET_7A, BATTLEANIMFUNC_SHINY, PAL_BATTLE_OB_YELLOW, ANIM_GFX_SPEED
battleanimobj RELATIVE_X, $88, BATTLEANIMFRAMESET_SPARKLE, BATTLEANIMFUNC_SHINY, PAL_BATTLE_OB_YELLOW, ANIM_GFX_SPEED
; ANIM_OBJ_SKY_ATTACK
battleanimobj RELATIVE_X | X_FLIP, $88, BATTLEANIMFRAMESET_7B, BATTLEANIMFUNC_SKY_ATTACK, PAL_BATTLE_OB_GRAY, ANIM_GFX_SKY_ATTACK
battleanimobj RELATIVE_X | X_FLIP, $88, BATTLEANIMFRAMESET_SKY_ATTACK, BATTLEANIMFUNC_SKY_ATTACK, PAL_BATTLE_OB_GRAY, ANIM_GFX_SKY_ATTACK
; ANIM_OBJ_LICK
battleanimobj RELATIVE_X | X_FLIP, $98, BATTLEANIMFRAMESET_7C, BATTLEANIMFUNC_NULL, PAL_BATTLE_OB_GRAY, ANIM_GFX_WATER
battleanimobj RELATIVE_X | X_FLIP, $98, BATTLEANIMFRAMESET_LICK, BATTLEANIMFUNC_NULL, PAL_BATTLE_OB_GRAY, ANIM_GFX_WATER
; ANIM_OBJ_WITHDRAW
battleanimobj RELATIVE_X | X_FLIP, $80, BATTLEANIMFRAMESET_7D, BATTLEANIMFUNC_NULL, PAL_BATTLE_OB_GRAY, ANIM_GFX_REFLECT
battleanimobj RELATIVE_X | X_FLIP, $80, BATTLEANIMFRAMESET_WITHDRAW_SHELL, BATTLEANIMFUNC_NULL, PAL_BATTLE_OB_GRAY, ANIM_GFX_REFLECT
; ANIM_OBJ_DRAIN
battleanimobj RELATIVE_X, $80, BATTLEANIMFRAMESET_21, BATTLEANIMFUNC_ABSORB_CIRCLE, PAL_BATTLE_OB_BLUE, ANIM_GFX_BUBBLE
battleanimobj RELATIVE_X, $80, BATTLEANIMFRAMESET_SMALL_BUBBLE, BATTLEANIMFUNC_ABSORB_CIRCLE, PAL_BATTLE_OB_BLUE, ANIM_GFX_BUBBLE
; ANIM_OBJ_GROWTH
battleanimobj RELATIVE_X, $b0, BATTLEANIMFRAMESET_7E, BATTLEANIMFUNC_GROWTH_SWORDS_DANCE, PAL_BATTLE_OB_YELLOW, ANIM_GFX_CHARGE
battleanimobj RELATIVE_X, $b0, BATTLEANIMFRAMESET_SHRINKING_CHARGE_ORB, BATTLEANIMFUNC_GROWTH_SWORDS_DANCE, PAL_BATTLE_OB_YELLOW, ANIM_GFX_CHARGE
; ANIM_OBJ_CONVERSION2
battleanimobj RELATIVE_X, $80, BATTLEANIMFRAMESET_7F, BATTLEANIMFUNC_ABSORB_CIRCLE, PAL_BATTLE_OB_GRAY, ANIM_GFX_EXPLOSION
battleanimobj RELATIVE_X, $80, BATTLEANIMFRAMESET_CONVERSION, BATTLEANIMFUNC_ABSORB_CIRCLE, PAL_BATTLE_OB_GRAY, ANIM_GFX_EXPLOSION
; ANIM_OBJ_SMOKE
battleanimobj RELATIVE_X | X_FLIP, $a0, BATTLEANIMFRAMESET_6F, BATTLEANIMFUNC_SMOKE_FLAME_WHEEL, PAL_BATTLE_OB_GRAY, ANIM_GFX_HAZE
battleanimobj RELATIVE_X | X_FLIP, $a0, BATTLEANIMFRAMESET_HAZE, BATTLEANIMFUNC_SMOKE_FLAME_WHEEL, PAL_BATTLE_OB_GRAY, ANIM_GFX_HAZE
; ANIM_OBJ_SMOKESCREEN
battleanimobj RELATIVE_X | X_FLIP, $a0, BATTLEANIMFRAMESET_74, BATTLEANIMFUNC_PRESENT_SMOKESCREEN, PAL_BATTLE_OB_GRAY, ANIM_GFX_EGG
battleanimobj RELATIVE_X | X_FLIP, $a0, BATTLEANIMFRAMESET_BARRAGE_BALL, BATTLEANIMFUNC_PRESENT_SMOKESCREEN, PAL_BATTLE_OB_GRAY, ANIM_GFX_EGG
; ANIM_OBJ_SWORDS_DANCE
battleanimobj RELATIVE_X | X_FLIP, $b0, BATTLEANIMFRAMESET_80, BATTLEANIMFUNC_GROWTH_SWORDS_DANCE, PAL_BATTLE_OB_GRAY, ANIM_GFX_WHIP
battleanimobj RELATIVE_X | X_FLIP, $b0, BATTLEANIMFRAMESET_SWORD, BATTLEANIMFUNC_GROWTH_SWORDS_DANCE, PAL_BATTLE_OB_GRAY, ANIM_GFX_WHIP
; ANIM_OBJ_SPEED_LINE
battleanimobj RELATIVE_X, $88, BATTLEANIMFRAMESET_81, BATTLEANIMFUNC_SPEED_LINE, PAL_BATTLE_OB_GRAY, ANIM_GFX_SPEED
battleanimobj RELATIVE_X, $88, BATTLEANIMFRAMESET_SPEED_LINE_1, BATTLEANIMFUNC_SPEED_LINE, PAL_BATTLE_OB_GRAY, ANIM_GFX_SPEED
; ANIM_OBJ_SHARPEN
battleanimobj RELATIVE_X, $88, BATTLEANIMFRAMESET_85, BATTLEANIMFUNC_NULL, PAL_BATTLE_OB_GRAY, ANIM_GFX_SHAPES
battleanimobj RELATIVE_X, $88, BATTLEANIMFRAMESET_SHARPEN, BATTLEANIMFUNC_NULL, PAL_BATTLE_OB_GRAY, ANIM_GFX_SHAPES
; ANIM_OBJ_DEFENSE_CURL
battleanimobj RELATIVE_X, $88, BATTLEANIMFRAMESET_86, BATTLEANIMFUNC_NULL, PAL_BATTLE_OB_GRAY, ANIM_GFX_SHAPES
battleanimobj RELATIVE_X, $88, BATTLEANIMFRAMESET_DEFENSE_CURL, BATTLEANIMFUNC_NULL, PAL_BATTLE_OB_GRAY, ANIM_GFX_SHAPES
; ANIM_OBJ_METRONOME_HAND
battleanimobj RELATIVE_X, $90, BATTLEANIMFRAMESET_87, BATTLEANIMFUNC_METRONOME_HAND, PAL_BATTLE_OB_GRAY, ANIM_GFX_MISC
battleanimobj RELATIVE_X, $90, BATTLEANIMFRAMESET_METRONOME_HAND, BATTLEANIMFUNC_METRONOME_HAND, PAL_BATTLE_OB_GRAY, ANIM_GFX_MISC
; ANIM_OBJ_METRONOME_SPARKLE
battleanimobj RELATIVE_X, $80, BATTLEANIMFRAMESET_30, BATTLEANIMFUNC_METRONOME_SPARKLE_SKETCH, PAL_BATTLE_OB_YELLOW, ANIM_GFX_SPEED
battleanimobj RELATIVE_X, $80, BATTLEANIMFRAMESET_CIRCLING_SPARKLE, BATTLEANIMFUNC_METRONOME_SPARKLE_SKETCH, PAL_BATTLE_OB_YELLOW, ANIM_GFX_SPEED
; ANIM_OBJ_DISABLE
battleanimobj RELATIVE_X | X_FLIP, $90, BATTLEANIMFRAMESET_34, BATTLEANIMFUNC_NULL, PAL_BATTLE_OB_YELLOW, ANIM_GFX_LIGHTNING
battleanimobj RELATIVE_X | X_FLIP, $90, BATTLEANIMFRAMESET_THUNDER_WAVE_DISABLE, BATTLEANIMFUNC_NULL, PAL_BATTLE_OB_YELLOW, ANIM_GFX_LIGHTNING
; ANIM_OBJ_AGILITY
battleanimobj RELATIVE_X | X_FLIP | PRIORITY, $88, BATTLEANIMFRAMESET_88, BATTLEANIMFUNC_AGILITY, PAL_BATTLE_OB_BLUE, ANIM_GFX_WIND
battleanimobj RELATIVE_X | X_FLIP | PRIORITY, $88, BATTLEANIMFRAMESET_AGILITY, BATTLEANIMFUNC_AGILITY, PAL_BATTLE_OB_BLUE, ANIM_GFX_WIND
; ANIM_OBJ_HEART
battleanimobj RELATIVE_X, $80, BATTLEANIMFRAMESET_76, BATTLEANIMFUNC_FLOAT_UP, PAL_BATTLE_OB_RED, ANIM_GFX_OBJECTS
battleanimobj RELATIVE_X, $80, BATTLEANIMFRAMESET_HEART, BATTLEANIMFUNC_FLOAT_UP, PAL_BATTLE_OB_RED, ANIM_GFX_OBJECTS
; ANIM_OBJ_FLAME_WHEEL
battleanimobj RELATIVE_X, $98, BATTLEANIMFRAMESET_10, BATTLEANIMFUNC_SMOKE_FLAME_WHEEL, PAL_BATTLE_OB_RED, ANIM_GFX_FIRE
battleanimobj RELATIVE_X, $98, BATTLEANIMFRAMESET_EMBER, BATTLEANIMFUNC_SMOKE_FLAME_WHEEL, PAL_BATTLE_OB_RED, ANIM_GFX_FIRE
; ANIM_OBJ_SACRED_FIRE
battleanimobj RELATIVE_X, $a8, BATTLEANIMFRAMESET_0F, BATTLEANIMFUNC_SACRED_FIRE, PAL_BATTLE_OB_RED, ANIM_GFX_FIRE
battleanimobj RELATIVE_X, $a8, BATTLEANIMFRAMESET_FLAMETHROWER, BATTLEANIMFUNC_SACRED_FIRE, PAL_BATTLE_OB_RED, ANIM_GFX_FIRE
; ANIM_OBJ_COTTON_SPORE
battleanimobj RELATIVE_X | X_FLIP, $68, BATTLEANIMFRAMESET_89, BATTLEANIMFUNC_SPIRAL_DESCENT, PAL_BATTLE_OB_GRAY, ANIM_GFX_MISC
battleanimobj RELATIVE_X | X_FLIP, $68, BATTLEANIMFRAMESET_COTTON, BATTLEANIMFUNC_SPIRAL_DESCENT, PAL_BATTLE_OB_GRAY, ANIM_GFX_MISC
; ANIM_OBJ_MILK_DRINK
battleanimobj RELATIVE_X | X_FLIP, $b0, BATTLEANIMFRAMESET_8A, BATTLEANIMFUNC_NULL, PAL_BATTLE_OB_GRAY, ANIM_GFX_MISC
battleanimobj RELATIVE_X | X_FLIP, $b0, BATTLEANIMFRAMESET_MILK_BOTTLE, BATTLEANIMFUNC_NULL, PAL_BATTLE_OB_GRAY, ANIM_GFX_MISC
; ANIM_OBJ_ANGER
battleanimobj RELATIVE_X | X_FLIP, $80, BATTLEANIMFRAMESET_8C, BATTLEANIMFUNC_NULL, PAL_BATTLE_OB_GRAY, ANIM_GFX_MISC
battleanimobj RELATIVE_X | X_FLIP, $80, BATTLEANIMFRAMESET_ANGER_VEIN, BATTLEANIMFUNC_NULL, PAL_BATTLE_OB_GRAY, ANIM_GFX_MISC
; ANIM_OBJ_HEAL_BELL
battleanimobj RELATIVE_X | X_FLIP, $50, BATTLEANIMFRAMESET_8D, BATTLEANIMFUNC_NULL, PAL_BATTLE_OB_YELLOW, ANIM_GFX_MISC
battleanimobj RELATIVE_X | X_FLIP, $50, BATTLEANIMFRAMESET_HEAL_BELL, BATTLEANIMFUNC_NULL, PAL_BATTLE_OB_YELLOW, ANIM_GFX_MISC
; ANIM_OBJ_HEAL_BELL_NOTE
battleanimobj RELATIVE_X, $40, BATTLEANIMFRAMESET_24, BATTLEANIMFUNC_HEAL_BELL_NOTES, PAL_BATTLE_OB_GRAY, ANIM_GFX_NOISE
battleanimobj RELATIVE_X, $40, BATTLEANIMFRAMESET_MUSIC_NOTE_1, BATTLEANIMFUNC_HEAL_BELL_NOTES, PAL_BATTLE_OB_GRAY, ANIM_GFX_NOISE
; ANIM_OBJ_BATON_PASS
battleanimobj RELATIVE_X | X_FLIP, $a8, BATTLEANIMFRAMESET_8E, BATTLEANIMFUNC_BATON_PASS, PAL_BATTLE_OB_RED, ANIM_GFX_MISC
battleanimobj RELATIVE_X | X_FLIP, $a8, BATTLEANIMFRAMESET_BATON_PASS, BATTLEANIMFUNC_BATON_PASS, PAL_BATTLE_OB_RED, ANIM_GFX_MISC
; ANIM_OBJ_LOCK_ON
battleanimobj RELATIVE_X | X_FLIP, $88, BATTLEANIMFRAMESET_8F, BATTLEANIMFUNC_LOCK_ON_MIND_READER, PAL_BATTLE_OB_GRAY, ANIM_GFX_MISC
battleanimobj RELATIVE_X | X_FLIP, $88, BATTLEANIMFRAMESET_LOCK_ON_1, BATTLEANIMFUNC_LOCK_ON_MIND_READER, PAL_BATTLE_OB_GRAY, ANIM_GFX_MISC
; ANIM_OBJ_MIND_READER
battleanimobj RELATIVE_X | X_FLIP, $88, BATTLEANIMFRAMESET_93, BATTLEANIMFUNC_LOCK_ON_MIND_READER, PAL_BATTLE_OB_GRAY, ANIM_GFX_MISC
battleanimobj RELATIVE_X | X_FLIP, $88, BATTLEANIMFRAMESET_MIND_READER_1, BATTLEANIMFUNC_LOCK_ON_MIND_READER, PAL_BATTLE_OB_GRAY, ANIM_GFX_MISC
; ANIM_OBJ_SAFEGUARD
battleanimobj RELATIVE_X | X_FLIP, $90, BATTLEANIMFRAMESET_97, BATTLEANIMFUNC_SAFEGUARD_PROTECT, PAL_BATTLE_OB_GRAY, ANIM_GFX_MISC
battleanimobj RELATIVE_X | X_FLIP, $90, BATTLEANIMFRAMESET_SAFEGUARD, BATTLEANIMFUNC_SAFEGUARD_PROTECT, PAL_BATTLE_OB_GRAY, ANIM_GFX_MISC
; ANIM_OBJ_PROTECT
battleanimobj RELATIVE_X | X_FLIP, $90, BATTLEANIMFRAMESET_78, BATTLEANIMFUNC_SAFEGUARD_PROTECT, PAL_BATTLE_OB_YELLOW, ANIM_GFX_OBJECTS
battleanimobj RELATIVE_X | X_FLIP, $90, BATTLEANIMFRAMESET_STAR, BATTLEANIMFUNC_SAFEGUARD_PROTECT, PAL_BATTLE_OB_YELLOW, ANIM_GFX_OBJECTS
; ANIM_OBJ_THIEF
battleanimobj RELATIVE_X, $ff, BATTLEANIMFRAMESET_99, BATTLEANIMFUNC_THIEF_PAYDAY, PAL_BATTLE_OB_GRAY, ANIM_GFX_STATUS
battleanimobj RELATIVE_X, $ff, BATTLEANIMFRAMESET_ITEM_BAG, BATTLEANIMFUNC_THIEF_PAYDAY, PAL_BATTLE_OB_GRAY, ANIM_GFX_STATUS
; ANIM_OBJ_OCTAZOOKA
battleanimobj RELATIVE_X | X_FLIP, $a0, BATTLEANIMFRAMESET_74, BATTLEANIMFUNC_USER_TO_TARGET_DISAPPEAR, PAL_BATTLE_OB_GRAY, ANIM_GFX_EGG
battleanimobj RELATIVE_X | X_FLIP, $a0, BATTLEANIMFRAMESET_BARRAGE_BALL, BATTLEANIMFUNC_USER_TO_TARGET_DISAPPEAR, PAL_BATTLE_OB_GRAY, ANIM_GFX_EGG
; ANIM_OBJ_PRESENT
battleanimobj RELATIVE_X | X_FLIP, $a0, BATTLEANIMFRAMESET_99, BATTLEANIMFUNC_PRESENT_SMOKESCREEN, PAL_BATTLE_OB_RED, ANIM_GFX_STATUS
battleanimobj RELATIVE_X | X_FLIP, $a0, BATTLEANIMFRAMESET_ITEM_BAG, BATTLEANIMFUNC_PRESENT_SMOKESCREEN, PAL_BATTLE_OB_RED, ANIM_GFX_STATUS
; ANIM_OBJ_SPIKES
battleanimobj RELATIVE_X | X_FLIP, $70, BATTLEANIMFRAMESET_8B, BATTLEANIMFUNC_SPIKES, PAL_BATTLE_OB_GRAY, ANIM_GFX_MISC
battleanimobj RELATIVE_X | X_FLIP, $70, BATTLEANIMFRAMESET_SPIKE, BATTLEANIMFUNC_SPIKES, PAL_BATTLE_OB_GRAY, ANIM_GFX_MISC
; ANIM_OBJ_POWDER_SNOW
battleanimobj RELATIVE_X, $90, BATTLEANIMFRAMESET_15, BATTLEANIMFUNC_USER_TO_TARGET_SPIN, PAL_BATTLE_OB_GRAY, ANIM_GFX_ICE
battleanimobj RELATIVE_X, $90, BATTLEANIMFRAMESET_POWDER_SNOW, BATTLEANIMFUNC_USER_TO_TARGET_SPIN, PAL_BATTLE_OB_GRAY, ANIM_GFX_ICE
; ANIM_OBJ_DRAGONBREATH
battleanimobj RELATIVE_X, $90, BATTLEANIMFRAMESET_11, BATTLEANIMFUNC_USER_TO_TARGET_DISAPPEAR, PAL_BATTLE_OB_RED, ANIM_GFX_FIRE
battleanimobj RELATIVE_X, $90, BATTLEANIMFRAMESET_BURNED, BATTLEANIMFUNC_USER_TO_TARGET_DISAPPEAR, PAL_BATTLE_OB_RED, ANIM_GFX_FIRE
; ANIM_OBJ_CONVERSION
battleanimobj RELATIVE_X, $80, BATTLEANIMFRAMESET_7F, BATTLEANIMFUNC_CONVERSION, PAL_BATTLE_OB_GRAY, ANIM_GFX_EXPLOSION
battleanimobj RELATIVE_X, $80, BATTLEANIMFRAMESET_CONVERSION, BATTLEANIMFUNC_CONVERSION, PAL_BATTLE_OB_GRAY, ANIM_GFX_EXPLOSION
; ANIM_OBJ_SPIDER_WEB
battleanimobj RELATIVE_X, $90, BATTLEANIMFRAMESET_9A, BATTLEANIMFUNC_NULL, PAL_BATTLE_OB_GRAY, ANIM_GFX_WEB
battleanimobj RELATIVE_X, $90, BATTLEANIMFRAMESET_SPIDER_WEB, BATTLEANIMFUNC_NULL, PAL_BATTLE_OB_GRAY, ANIM_GFX_WEB
; ANIM_OBJ_CAKE_UNUSED
battleanimobj RELATIVE_X | X_FLIP, $a0, BATTLEANIMFRAMESET_9B, BATTLEANIMFUNC_PRESENT_SMOKESCREEN, PAL_BATTLE_OB_RED, ANIM_GFX_OBJECTS
battleanimobj RELATIVE_X | X_FLIP, $a0, BATTLEANIMFRAMESET_UNUSED_CAKE, BATTLEANIMFUNC_PRESENT_SMOKESCREEN, PAL_BATTLE_OB_RED, ANIM_GFX_OBJECTS
; ANIM_OBJ_NIGHTMARE
battleanimobj RELATIVE_X | X_FLIP, $80, BATTLEANIMFRAMESET_9C, BATTLEANIMFUNC_DIZZY, PAL_BATTLE_OB_GRAY, ANIM_GFX_ANGELS
battleanimobj RELATIVE_X | X_FLIP, $80, BATTLEANIMFRAMESET_IMP, BATTLEANIMFUNC_DIZZY, PAL_BATTLE_OB_GRAY, ANIM_GFX_ANGELS
; ANIM_OBJ_IN_NIGHTMARE
battleanimobj RELATIVE_X | X_FLIP, $80, BATTLEANIMFRAMESET_9D, BATTLEANIMFUNC_FLOAT_UP, PAL_BATTLE_OB_GRAY, ANIM_GFX_ANGELS
battleanimobj RELATIVE_X | X_FLIP, $80, BATTLEANIMFRAMESET_IMP_FLIPPED, BATTLEANIMFUNC_FLOAT_UP, PAL_BATTLE_OB_GRAY, ANIM_GFX_ANGELS
; ANIM_OBJ_LOVELY_KISS
battleanimobj RELATIVE_X | X_FLIP, $80, BATTLEANIMFRAMESET_9C, BATTLEANIMFUNC_NULL, PAL_BATTLE_OB_GRAY, ANIM_GFX_ANGELS
battleanimobj RELATIVE_X | X_FLIP, $80, BATTLEANIMFRAMESET_IMP, BATTLEANIMFUNC_NULL, PAL_BATTLE_OB_GRAY, ANIM_GFX_ANGELS
; ANIM_OBJ_SWEET_KISS
battleanimobj RELATIVE_X | X_FLIP, $80, BATTLEANIMFRAMESET_9E, BATTLEANIMFUNC_NULL, PAL_BATTLE_OB_BLUE, ANIM_GFX_ANGELS
battleanimobj RELATIVE_X | X_FLIP, $80, BATTLEANIMFRAMESET_CHERUB, BATTLEANIMFUNC_NULL, PAL_BATTLE_OB_BLUE, ANIM_GFX_ANGELS
; ANIM_OBJ_SKETCH
battleanimobj RELATIVE_X | X_FLIP | Y_FLIP, $80, BATTLEANIMFRAMESET_9F, BATTLEANIMFUNC_METRONOME_SPARKLE_SKETCH, PAL_BATTLE_OB_GREEN, ANIM_GFX_OBJECTS
battleanimobj RELATIVE_X | X_FLIP | Y_FLIP, $80, BATTLEANIMFRAMESET_PENCIL, BATTLEANIMFUNC_METRONOME_SPARKLE_SKETCH, PAL_BATTLE_OB_GREEN, ANIM_GFX_OBJECTS
; ANIM_OBJ_ENCORE_HAND
battleanimobj RELATIVE_X | X_FLIP, $80, BATTLEANIMFRAMESET_A0, BATTLEANIMFUNC_CLAMP_ENCORE, PAL_BATTLE_OB_GRAY, ANIM_GFX_OBJECTS
battleanimobj RELATIVE_X | X_FLIP, $80, BATTLEANIMFRAMESET_ENCORE_HAND, BATTLEANIMFUNC_CLAMP_ENCORE, PAL_BATTLE_OB_GRAY, ANIM_GFX_OBJECTS
; ANIM_OBJ_ENCORE_STAR
battleanimobj RELATIVE_X | X_FLIP, $70, BATTLEANIMFRAMESET_78, BATTLEANIMFUNC_ENCORE_BELLY_DRUM, PAL_BATTLE_OB_YELLOW, ANIM_GFX_OBJECTS
battleanimobj RELATIVE_X | X_FLIP, $70, BATTLEANIMFRAMESET_STAR, BATTLEANIMFUNC_ENCORE_BELLY_DRUM, PAL_BATTLE_OB_YELLOW, ANIM_GFX_OBJECTS
; ANIM_OBJ_DESTINY_BOND
battleanimobj RELATIVE_X | X_FLIP, $c0, BATTLEANIMFRAMESET_A2, BATTLEANIMFUNC_USER_TO_TARGET, PAL_BATTLE_OB_GRAY, ANIM_GFX_ANGELS
battleanimobj RELATIVE_X | X_FLIP, $c0, BATTLEANIMFRAMESET_DESTINY_BOND, BATTLEANIMFUNC_USER_TO_TARGET, PAL_BATTLE_OB_GRAY, ANIM_GFX_ANGELS
; ANIM_OBJ_MORNING_SUN
battleanimobj RELATIVE_X | X_FLIP, $40, BATTLEANIMFRAMESET_A3, BATTLEANIMFUNC_SWAGGER_MORNING_SUN, PAL_BATTLE_OB_YELLOW, ANIM_GFX_SHINE
battleanimobj RELATIVE_X | X_FLIP, $40, BATTLEANIMFRAMESET_MORNING_SUN, BATTLEANIMFUNC_SWAGGER_MORNING_SUN, PAL_BATTLE_OB_YELLOW, ANIM_GFX_SHINE
; ANIM_OBJ_GLIMMER
battleanimobj RELATIVE_X, $80, BATTLEANIMFRAMESET_A4, BATTLEANIMFUNC_NULL, PAL_BATTLE_OB_GRAY, ANIM_GFX_SHINE
battleanimobj RELATIVE_X, $80, BATTLEANIMFRAMESET_GLIMMER, BATTLEANIMFUNC_NULL, PAL_BATTLE_OB_GRAY, ANIM_GFX_SHINE
; ANIM_OBJ_MOONLIGHT
battleanimobj RELATIVE_X, $80, BATTLEANIMFRAMESET_A5, BATTLEANIMFUNC_NULL, PAL_BATTLE_OB_YELLOW, ANIM_GFX_SHINE
battleanimobj RELATIVE_X, $80, BATTLEANIMFRAMESET_MOONLIGHT, BATTLEANIMFUNC_NULL, PAL_BATTLE_OB_YELLOW, ANIM_GFX_SHINE
; ANIM_OBJ_HIDDEN_POWER
battleanimobj RELATIVE_X, $88, BATTLEANIMFRAMESET_43, BATTLEANIMFUNC_HIDDEN_POWER, PAL_BATTLE_OB_RED, ANIM_GFX_CHARGE
battleanimobj RELATIVE_X, $88, BATTLEANIMFRAMESET_CHARGE_ORB_1, BATTLEANIMFUNC_HIDDEN_POWER, PAL_BATTLE_OB_RED, ANIM_GFX_CHARGE
; ANIM_OBJ_CROSS_CHOP1
battleanimobj RELATIVE_X | X_FLIP, $ff, BATTLEANIMFRAMESET_A6, BATTLEANIMFUNC_NULL, PAL_BATTLE_OB_GRAY, ANIM_GFX_CUT
battleanimobj RELATIVE_X | X_FLIP, $ff, BATTLEANIMFRAMESET_CROSS_CHOP_1, BATTLEANIMFUNC_NULL, PAL_BATTLE_OB_GRAY, ANIM_GFX_CUT
; ANIM_OBJ_CROSS_CHOP2
battleanimobj RELATIVE_X | X_FLIP, $ff, BATTLEANIMFRAMESET_A7, BATTLEANIMFUNC_NULL, PAL_BATTLE_OB_GRAY, ANIM_GFX_CUT
battleanimobj RELATIVE_X | X_FLIP, $ff, BATTLEANIMFRAMESET_CROSS_CHOP_2, BATTLEANIMFUNC_NULL, PAL_BATTLE_OB_GRAY, ANIM_GFX_CUT
; ANIM_OBJ_SANDSTORM
battleanimobj RELATIVE_X | X_FLIP, $00, BATTLEANIMFRAMESET_B4, BATTLEANIMFUNC_RAIN_SANDSTORM, PAL_BATTLE_OB_BROWN, ANIM_GFX_POWDER
battleanimobj RELATIVE_X | X_FLIP, $00, BATTLEANIMFRAMESET_SANDSTORM, BATTLEANIMFUNC_RAIN_SANDSTORM, PAL_BATTLE_OB_BROWN, ANIM_GFX_POWDER
; ANIM_OBJ_ZAP_CANNON
battleanimobj RELATIVE_X | X_FLIP, $90, BATTLEANIMFRAMESET_A8, BATTLEANIMFUNC_USER_TO_TARGET_DISAPPEAR, PAL_BATTLE_OB_YELLOW, ANIM_GFX_LIGHTNING
battleanimobj RELATIVE_X | X_FLIP, $90, BATTLEANIMFRAMESET_ZAP_CANNON, BATTLEANIMFUNC_USER_TO_TARGET_DISAPPEAR, PAL_BATTLE_OB_YELLOW, ANIM_GFX_LIGHTNING
; ANIM_OBJ_SPITE
battleanimobj RELATIVE_X | X_FLIP, $40, BATTLEANIMFRAMESET_9C, BATTLEANIMFUNC_POWDER, PAL_BATTLE_OB_GRAY, ANIM_GFX_ANGELS
battleanimobj RELATIVE_X | X_FLIP, $40, BATTLEANIMFRAMESET_IMP, BATTLEANIMFUNC_POWDER, PAL_BATTLE_OB_GRAY, ANIM_GFX_ANGELS
; ANIM_OBJ_CURSE
battleanimobj RELATIVE_X | X_FLIP | Y_FLIP, $90, BATTLEANIMFRAMESET_A9, BATTLEANIMFUNC_CURSE, PAL_BATTLE_OB_GRAY, ANIM_GFX_OBJECTS
battleanimobj RELATIVE_X | X_FLIP | Y_FLIP, $90, BATTLEANIMFRAMESET_CURSE_NAIL, BATTLEANIMFUNC_CURSE, PAL_BATTLE_OB_GRAY, ANIM_GFX_OBJECTS
; ANIM_OBJ_PERISH_SONG
battleanimobj ABSOLUTE_X, $00, BATTLEANIMFRAMESET_24, BATTLEANIMFUNC_PERISH_SONG, PAL_BATTLE_OB_GRAY, ANIM_GFX_NOISE
battleanimobj ABSOLUTE_X, $00, BATTLEANIMFRAMESET_MUSIC_NOTE_1, BATTLEANIMFUNC_PERISH_SONG, PAL_BATTLE_OB_GRAY, ANIM_GFX_NOISE
; ANIM_OBJ_FORESIGHT
battleanimobj RELATIVE_X, $80, BATTLEANIMFRAMESET_AA, BATTLEANIMFUNC_NULL, PAL_BATTLE_OB_GRAY, ANIM_GFX_SHINE
battleanimobj RELATIVE_X, $80, BATTLEANIMFRAMESET_FORESIGHT_SHINE, BATTLEANIMFUNC_NULL, PAL_BATTLE_OB_GRAY, ANIM_GFX_SHINE
; ANIM_OBJ_RAPID_SPIN
battleanimobj RELATIVE_X | X_FLIP, $b8, BATTLEANIMFRAMESET_AB, BATTLEANIMFUNC_RAPID_SPIN, PAL_BATTLE_OB_GRAY, ANIM_GFX_WIND
battleanimobj RELATIVE_X | X_FLIP, $b8, BATTLEANIMFRAMESET_RAPID_SPIN, BATTLEANIMFUNC_RAPID_SPIN, PAL_BATTLE_OB_GRAY, ANIM_GFX_WIND
; ANIM_OBJ_SWAGGER
battleanimobj RELATIVE_X | X_FLIP, $90, BATTLEANIMFRAMESET_AC, BATTLEANIMFUNC_SWAGGER_MORNING_SUN, PAL_BATTLE_OB_GRAY, ANIM_GFX_WIND
battleanimobj RELATIVE_X | X_FLIP, $90, BATTLEANIMFRAMESET_SWAGGER, BATTLEANIMFUNC_SWAGGER_MORNING_SUN, PAL_BATTLE_OB_GRAY, ANIM_GFX_WIND
; ANIM_OBJ_BELLY_DRUM_HAND
battleanimobj RELATIVE_X, $a8, BATTLEANIMFRAMESET_05, BATTLEANIMFUNC_NULL, PAL_BATTLE_OB_GRAY, ANIM_GFX_HIT
battleanimobj RELATIVE_X, $a8, BATTLEANIMFRAMESET_PALM, BATTLEANIMFUNC_NULL, PAL_BATTLE_OB_GRAY, ANIM_GFX_HIT
; ANIM_OBJ_BELLY_DRUM_NOTE
battleanimobj RELATIVE_X, $90, BATTLEANIMFRAMESET_24, BATTLEANIMFUNC_ENCORE_BELLY_DRUM, PAL_BATTLE_OB_GRAY, ANIM_GFX_NOISE
battleanimobj RELATIVE_X, $90, BATTLEANIMFRAMESET_MUSIC_NOTE_1, BATTLEANIMFUNC_ENCORE_BELLY_DRUM, PAL_BATTLE_OB_GRAY, ANIM_GFX_NOISE
; ANIM_OBJ_MEAN_LOOK
battleanimobj RELATIVE_X, $88, BATTLEANIMFRAMESET_AD, BATTLEANIMFUNC_NULL, PAL_BATTLE_OB_BLUE, ANIM_GFX_PSYCHIC
battleanimobj RELATIVE_X, $88, BATTLEANIMFRAMESET_MEAN_LOOK, BATTLEANIMFUNC_NULL, PAL_BATTLE_OB_BLUE, ANIM_GFX_PSYCHIC
; ANIM_OBJ_BETA_PURSUIT
battleanimobj RELATIVE_X, $a8, BATTLEANIMFRAMESET_AE, BATTLEANIMFUNC_BETA_PURSUIT, PAL_BATTLE_OB_GRAY, ANIM_GFX_HIT
battleanimobj RELATIVE_X, $a8, BATTLEANIMFRAMESET_UPSIDE_DOWN_PUNCH, BATTLEANIMFUNC_BETA_PURSUIT, PAL_BATTLE_OB_GRAY, ANIM_GFX_HIT
; ANIM_OBJ_SHOOTING_SPARKLE
battleanimobj RELATIVE_X | X_FLIP, $90, BATTLEANIMFRAMESET_AF, BATTLEANIMFUNC_USER_TO_TARGET, PAL_BATTLE_OB_YELLOW, ANIM_GFX_SPEED
battleanimobj RELATIVE_X | X_FLIP, $90, BATTLEANIMFRAMESET_GROWING_SPARKLE, BATTLEANIMFUNC_USER_TO_TARGET, PAL_BATTLE_OB_YELLOW, ANIM_GFX_SPEED
; ANIM_OBJ_RAIN
battleanimobj RELATIVE_X | X_FLIP, $00, BATTLEANIMFRAMESET_B0, BATTLEANIMFUNC_RAIN_SANDSTORM, PAL_BATTLE_OB_GRAY, ANIM_GFX_WATER
battleanimobj RELATIVE_X | X_FLIP, $00, BATTLEANIMFRAMESET_RAIN, BATTLEANIMFUNC_RAIN_SANDSTORM, PAL_BATTLE_OB_GRAY, ANIM_GFX_WATER
; ANIM_OBJ_B0
battleanimobj ABSOLUTE_X, $00, BATTLEANIMFRAMESET_70, BATTLEANIMFUNC_ANIM_OBJ_B0, PAL_BATTLE_OB_RED, ANIM_GFX_HAZE
battleanimobj ABSOLUTE_X, $00, BATTLEANIMFRAMESET_MIST, BATTLEANIMFUNC_ANIM_OBJ_B0, PAL_BATTLE_OB_RED, ANIM_GFX_HAZE
; ANIM_OBJ_PSYCH_UP
battleanimobj RELATIVE_X, $88, BATTLEANIMFRAMESET_B1, BATTLEANIMFUNC_PSYCH_UP, PAL_BATTLE_OB_GRAY, ANIM_GFX_STATUS
battleanimobj RELATIVE_X, $88, BATTLEANIMFRAMESET_PSYCH_UP, BATTLEANIMFUNC_PSYCH_UP, PAL_BATTLE_OB_GRAY, ANIM_GFX_STATUS
; ANIM_OBJ_ANCIENTPOWER
battleanimobj RELATIVE_X, $b8, BATTLEANIMFRAMESET_19, BATTLEANIMFUNC_ANCIENT_POWER, PAL_BATTLE_OB_BROWN, ANIM_GFX_ROCKS
battleanimobj RELATIVE_X, $b8, BATTLEANIMFRAMESET_BIG_ROCK, BATTLEANIMFUNC_ANCIENT_POWER, PAL_BATTLE_OB_BROWN, ANIM_GFX_ROCKS
; ANIM_OBJ_AEROBLAST
battleanimobj RELATIVE_X | X_FLIP | Y_FLIP, $98, BATTLEANIMFRAMESET_B3, BATTLEANIMFUNC_NULL, PAL_BATTLE_OB_YELLOW, ANIM_GFX_AEROBLAST
battleanimobj RELATIVE_X | X_FLIP | Y_FLIP, $98, BATTLEANIMFRAMESET_AEROBLAST, BATTLEANIMFUNC_NULL, PAL_BATTLE_OB_YELLOW, ANIM_GFX_AEROBLAST
; ANIM_OBJ_SHADOW_BALL
battleanimobj RELATIVE_X | X_FLIP | Y_FLIP, $98, BATTLEANIMFRAMESET_74, BATTLEANIMFUNC_WAVE_TO_TARGET, PAL_BATTLE_OB_BLUE, ANIM_GFX_EGG
battleanimobj RELATIVE_X | X_FLIP | Y_FLIP, $98, BATTLEANIMFRAMESET_BARRAGE_BALL, BATTLEANIMFUNC_WAVE_TO_TARGET, PAL_BATTLE_OB_BLUE, ANIM_GFX_EGG
; ANIM_OBJ_ROCK_SMASH
battleanimobj RELATIVE_X | X_FLIP, $ff, BATTLEANIMFRAMESET_19, BATTLEANIMFUNC_ROCK_SMASH, PAL_BATTLE_OB_BROWN, ANIM_GFX_ROCKS
battleanimobj RELATIVE_X | X_FLIP, $ff, BATTLEANIMFRAMESET_BIG_ROCK, BATTLEANIMFUNC_ROCK_SMASH, PAL_BATTLE_OB_BROWN, ANIM_GFX_ROCKS
; ANIM_OBJ_FLOWER
battleanimobj RELATIVE_X, $90, BATTLEANIMFRAMESET_73, BATTLEANIMFUNC_USER_TO_TARGET_SPIN, PAL_BATTLE_OB_RED, ANIM_GFX_FLOWER
battleanimobj RELATIVE_X, $90, BATTLEANIMFRAMESET_FLOWER, BATTLEANIMFUNC_USER_TO_TARGET_SPIN, PAL_BATTLE_OB_RED, ANIM_GFX_FLOWER
; ANIM_OBJ_COTTON
battleanimobj RELATIVE_X, $ff, BATTLEANIMFRAMESET_89, BATTLEANIMFUNC_COTTON, PAL_BATTLE_OB_RED, ANIM_GFX_MISC
battleanimobj RELATIVE_X, $ff, BATTLEANIMFRAMESET_COTTON, BATTLEANIMFUNC_COTTON, PAL_BATTLE_OB_RED, ANIM_GFX_MISC
; ANIM_OBJ_ENEMYFEET_1ROW
battleanimobj ABSOLUTE_X, $00, BATTLEANIMFRAMESET_B5, BATTLEANIMFUNC_NULL, PAL_BATTLE_OB_ENEMY, ANIM_GFX_PLAYERHEAD
battleanimobj ABSOLUTE_X, $00, BATTLEANIMFRAMESET_ENEMYFEET_1ROW, BATTLEANIMFUNC_NULL, PAL_BATTLE_OB_ENEMY, ANIM_GFX_PLAYERHEAD
; ANIM_OBJ_PLAYERHEAD_1ROW
battleanimobj ABSOLUTE_X, $00, BATTLEANIMFRAMESET_B6, BATTLEANIMFUNC_NULL, PAL_BATTLE_OB_PLAYER, ANIM_GFX_ENEMYFEET
battleanimobj ABSOLUTE_X, $00, BATTLEANIMFRAMESET_PLAYERHEAD_1ROW, BATTLEANIMFUNC_NULL, PAL_BATTLE_OB_PLAYER, ANIM_GFX_ENEMYFEET
; ANIM_OBJ_ENEMYFEET_2ROW
battleanimobj ABSOLUTE_X, $00, BATTLEANIMFRAMESET_B7, BATTLEANIMFUNC_NULL, PAL_BATTLE_OB_ENEMY, ANIM_GFX_PLAYERHEAD
battleanimobj ABSOLUTE_X, $00, BATTLEANIMFRAMESET_ENEMYFEET_2ROW, BATTLEANIMFUNC_NULL, PAL_BATTLE_OB_ENEMY, ANIM_GFX_PLAYERHEAD
; ANIM_OBJ_PLAYERHEAD_2ROW
battleanimobj ABSOLUTE_X, $00, BATTLEANIMFRAMESET_B8, BATTLEANIMFUNC_NULL, PAL_BATTLE_OB_PLAYER, ANIM_GFX_ENEMYFEET
battleanimobj ABSOLUTE_X, $00, BATTLEANIMFRAMESET_PLAYERHEAD_2ROW, BATTLEANIMFUNC_NULL, PAL_BATTLE_OB_PLAYER, ANIM_GFX_ENEMYFEET
assert_table_length NUM_ANIM_OBJS

View File

@ -13,6 +13,7 @@ Unknown_170470:
db $27
db $42
db $24
.end
Unknown_17047e:
db $03, 4

View File

@ -63,10 +63,10 @@ EngineFlags:
engine_flag wKantoBadges, EARTHBADGE
; unown sets (see data/wild/unlocked_unowns.asm)
engine_flag wUnlockedUnowns, 0 ; A-K
engine_flag wUnlockedUnowns, 1 ; L-R
engine_flag wUnlockedUnowns, 2 ; S-W
engine_flag wUnlockedUnowns, 3 ; X-Z
engine_flag wUnlockedUnowns, UNLOCKED_UNOWNS_A_TO_K_F
engine_flag wUnlockedUnowns, UNLOCKED_UNOWNS_L_TO_R_F
engine_flag wUnlockedUnowns, UNLOCKED_UNOWNS_S_TO_W_F
engine_flag wUnlockedUnowns, UNLOCKED_UNOWNS_X_TO_Z_F
engine_flag wUnlockedUnowns, 4 ; unused
engine_flag wUnlockedUnowns, 5 ; unused
engine_flag wUnlockedUnowns, 6 ; unused

View File

@ -173,7 +173,7 @@ SpecialsPointers::
add_special StubbedTrainerRankings_Healings
add_special RefreshSprites
add_special Function1037c2
add_special Mobile_DummyReturnFalse
add_special CheckMobileAdapterStatusSpecial
add_special Function103780
add_special Function10387b
add_special AskRememberPassword

View File

@ -31,52 +31,52 @@ MACRO connection
; Calculate tile offsets for source (current) and target maps
DEF _src = 0
DEF _tgt = (\4) + 3
DEF _tgt = (\4) + MAP_CONNECTION_PADDING_WIDTH
if _tgt < 0
DEF _src = -_tgt
DEF _tgt = 0
endc
if !STRCMP("\1", "north")
DEF _blk = \3_WIDTH * (\3_HEIGHT - 3) + _src
DEF _blk = \3_WIDTH * (\3_HEIGHT - MAP_CONNECTION_PADDING_WIDTH) + _src
DEF _map = _tgt
DEF _win = (\3_WIDTH + 6) * \3_HEIGHT + 1
DEF _win = (\3_WIDTH + MAP_CONNECTION_PADDING_WIDTH * 2) * \3_HEIGHT + 1
DEF _y = \3_HEIGHT * 2 - 1
DEF _x = (\4) * -2
DEF _len = CURRENT_MAP_WIDTH + 3 - (\4)
DEF _len = CURRENT_MAP_WIDTH + MAP_CONNECTION_PADDING_WIDTH - (\4)
if _len > \3_WIDTH
DEF _len = \3_WIDTH
endc
elif !STRCMP("\1", "south")
DEF _blk = _src
DEF _map = (CURRENT_MAP_WIDTH + 6) * (CURRENT_MAP_HEIGHT + 3) + _tgt
DEF _win = \3_WIDTH + 7
DEF _map = (CURRENT_MAP_WIDTH + MAP_CONNECTION_PADDING_WIDTH * 2) * (CURRENT_MAP_HEIGHT + MAP_CONNECTION_PADDING_WIDTH) + _tgt
DEF _win = \3_WIDTH + MAP_CONNECTION_PADDING_WIDTH * 2 + 1
DEF _y = 0
DEF _x = (\4) * -2
DEF _len = CURRENT_MAP_WIDTH + 3 - (\4)
DEF _len = CURRENT_MAP_WIDTH + MAP_CONNECTION_PADDING_WIDTH - (\4)
if _len > \3_WIDTH
DEF _len = \3_WIDTH
endc
elif !STRCMP("\1", "west")
DEF _blk = (\3_WIDTH * _src) + \3_WIDTH - 3
DEF _map = (CURRENT_MAP_WIDTH + 6) * _tgt
DEF _win = (\3_WIDTH + 6) * 2 - 6
DEF _blk = (\3_WIDTH * _src) + \3_WIDTH - MAP_CONNECTION_PADDING_WIDTH
DEF _map = (CURRENT_MAP_WIDTH + MAP_CONNECTION_PADDING_WIDTH * 2) * _tgt
DEF _win = (\3_WIDTH + MAP_CONNECTION_PADDING_WIDTH * 2) * 2 - MAP_CONNECTION_PADDING_WIDTH * 2
DEF _y = (\4) * -2
DEF _x = \3_WIDTH * 2 - 1
DEF _len = CURRENT_MAP_HEIGHT + 3 - (\4)
DEF _len = CURRENT_MAP_HEIGHT + MAP_CONNECTION_PADDING_WIDTH - (\4)
if _len > \3_HEIGHT
DEF _len = \3_HEIGHT
endc
elif !STRCMP("\1", "east")
DEF _blk = (\3_WIDTH * _src)
DEF _map = (CURRENT_MAP_WIDTH + 6) * _tgt + CURRENT_MAP_WIDTH + 3
DEF _win = \3_WIDTH + 7
DEF _map = (CURRENT_MAP_WIDTH + MAP_CONNECTION_PADDING_WIDTH * 2) * _tgt + CURRENT_MAP_WIDTH + MAP_CONNECTION_PADDING_WIDTH
DEF _win = \3_WIDTH + MAP_CONNECTION_PADDING_WIDTH * 2 + 1
DEF _y = (\4) * -2
DEF _x = 0
DEF _len = CURRENT_MAP_HEIGHT + 3 - (\4)
DEF _len = CURRENT_MAP_HEIGHT + MAP_CONNECTION_PADDING_WIDTH - (\4)
if _len > \3_HEIGHT
DEF _len = \3_HEIGHT
endc

View File

@ -1,7 +1,7 @@
BattleAnimations::
; entries correspond to constants/move_constants.asm
table_width 2, BattleAnimations
dw BattleAnim_0
dw BattleAnim_Dummy
dw BattleAnim_Pound
dw BattleAnim_KarateChop
dw BattleAnim_Doubleslap
@ -254,9 +254,9 @@ BattleAnimations::
dw BattleAnim_Whirlpool
dw BattleAnim_BeatUp
assert_table_length NUM_ATTACKS + 1
dw BattleAnim_252
dw BattleAnim_253
dw BattleAnim_254
dw BattleAnim_Dummy
dw BattleAnim_Dummy
dw BattleAnim_Dummy
dw BattleAnim_SweetScent2
assert_table_length $100
; $100
@ -284,10 +284,7 @@ BattleAnimations::
dw BattleAnim_HitConfusion
assert_table_length NUM_BATTLE_ANIMS + 1
BattleAnim_0:
BattleAnim_252:
BattleAnim_253:
BattleAnim_254:
BattleAnim_Dummy:
BattleAnim_MirrorMove:
anim_ret
@ -1243,7 +1240,7 @@ BattleAnim_Thunderpunch:
anim_obj ANIM_OBJ_PUNCH_SHAKE, 136, 56, $43
anim_bgeffect ANIM_BG_FLASH_INVERTED, $0, $8, $2
anim_sound 0, 1, SFX_THUNDER
anim_obj ANIM_OBJ_THUNDER3, 152, 68, $0
anim_obj ANIM_OBJ_THUNDER_RIGHT, 152, 68, $0
anim_wait 64
anim_ret
@ -1283,13 +1280,13 @@ BattleAnim_Thunder:
anim_1gfx ANIM_GFX_LIGHTNING
anim_bgeffect ANIM_BG_FLASH_INVERTED, $0, $6, $20
anim_sound 0, 1, SFX_THUNDER
anim_obj ANIM_OBJ_THUNDER2, 120, 68, $0
anim_obj ANIM_OBJ_THUNDER_LEFT, 120, 68, $0
anim_wait 16
anim_sound 0, 1, SFX_THUNDER
anim_obj ANIM_OBJ_THUNDER3, 152, 68, $0
anim_obj ANIM_OBJ_THUNDER_RIGHT, 152, 68, $0
anim_wait 16
anim_sound 0, 1, SFX_THUNDER
anim_obj ANIM_OBJ_THUNDER1, 136, 68, $0
anim_obj ANIM_OBJ_THUNDER_CENTER, 136, 68, $0
anim_wait 48
anim_ret
@ -2648,7 +2645,7 @@ BattleAnim_TriAttack:
anim_wait 16
anim_bgeffect ANIM_BG_FLASH_INVERTED, $0, $4, $4
anim_sound 0, 1, SFX_THUNDER
anim_obj ANIM_OBJ_THUNDER3, 152, 68, $0
anim_obj ANIM_OBJ_THUNDER_RIGHT, 152, 68, $0
anim_wait 16
anim_ret

View File

@ -101,7 +101,7 @@ OverworldSprites:
overworld_sprite FamicomSpriteGFX, 4, STILL_SPRITE, PAL_OW_RED
overworld_sprite FruitTreeSpriteGFX, 4, STILL_SPRITE, PAL_OW_TREE
overworld_sprite GoldTrophySpriteGFX, 4, STILL_SPRITE, PAL_OW_BROWN
overworld_sprite SilverTrophySpriteGFX, 4, STILL_SPRITE, PAL_OW_SILVER
overworld_sprite SilverTrophySpriteGFX, 4, STILL_SPRITE, PAL_OW_EMOTE
overworld_sprite KrisSpriteGFX, 12, WALKING_SPRITE, PAL_OW_BLUE
overworld_sprite KrisBikeSpriteGFX, 12, WALKING_SPRITE, PAL_OW_BLUE
overworld_sprite KurtOutsideSpriteGFX, 12, STANDING_SPRITE, PAL_OW_BROWN

View File

@ -1,6 +1,7 @@
TypeNames:
; entries correspond to types (see constants/type_constants.asm)
table_width 2, TypeNames
dw Normal
dw Fighting
dw Flying
@ -12,17 +13,13 @@ TypeNames:
dw Ghost
dw Steel
assert_table_length UNUSED_TYPES
rept UNUSED_TYPES_END - UNUSED_TYPES - 1 ; discount CURSE_TYPE
dw Normal
dw Normal
dw Normal
dw Normal
dw Normal
dw Normal
dw Normal
dw Normal
dw Normal
endr
dw CurseType
assert_table_length UNUSED_TYPES_END
dw Fire
dw Water
dw Grass

View File

@ -7,12 +7,13 @@ endr
ENDM
UnlockedUnownLetterSets:
; entries correspond to wUnlockedUnowns bits
dw .Set_A_K ; ENGINE_UNLOCKED_UNOWNS_A_TO_K
dw .Set_L_R ; ENGINE_UNLOCKED_UNOWNS_L_TO_R
dw .Set_S_W ; ENGINE_UNLOCKED_UNOWNS_S_TO_W
dw .Set_X_Z ; ENGINE_UNLOCKED_UNOWNS_X_TO_Z
.End
; entries correspond to UNLOCKED_UNOWNS_* constants
table_width 2, UnlockedUnownLetterSets
dw .Set_A_K ; UNLOCKED_UNOWNS_A_TO_K_F
dw .Set_L_R ; UNLOCKED_UNOWNS_L_TO_R_F
dw .Set_S_W ; UNLOCKED_UNOWNS_S_TO_W_F
dw .Set_X_Z ; UNLOCKED_UNOWNS_X_TO_Z_F
assert_table_length NUM_UNLOCKED_UNOWN_SETS
.Set_A_K:
unown_set A, B, C, D, E, F, G, H, I, J, K

View File

@ -59,6 +59,7 @@ Fixes in the [multi-player battle engine](#multi-player-battle-engine) category
- [AI makes a false assumption about `CheckTypeMatchup`](#ai-makes-a-false-assumption-about-checktypematchup)
- [AI use of Full Heal or Full Restore does not cure Nightmare status](#ai-use-of-full-heal-or-full-restore-does-not-cure-nightmare-status)
- [AI use of Full Heal does not cure confusion status](#ai-use-of-full-heal-does-not-cure-confusion-status)
- [AI might use its base reward value as an item](#ai-might-use-its-base-reward-value-as-an-item)
- [Wild Pokémon can always Teleport regardless of level difference](#wild-pok%C3%A9mon-can-always-teleport-regardless-of-level-difference)
- [`RIVAL2` has lower DVs than `RIVAL1`](#rival2-has-lower-dvs-than-rival1)
- [`HELD_CATCH_CHANCE` has no effect](#held_catch_chance-has-no-effect)
@ -614,10 +615,15 @@ This bug affects Attract, Curse, Foresight, Mean Look, Mimic, Nightmare, Spider
```diff
CheckHiddenOpponent:
-; BUG: Lock-On and Mind Reader don't always bypass Fly and Dig (see docs/bugs_and_glitches.md)
- ld a, BATTLE_VARS_SUBSTATUS3_OPP
- call GetBattleVar
- and 1 << SUBSTATUS_FLYING | 1 << SUBSTATUS_UNDERGROUND
+ xor a
+ ld a, BATTLE_VARS_SUBSTATUS5_OPP
+ call GetBattleVar
+ cpl
+ and 1 << SUBSTATUS_LOCK_ON
+ ret z
+
ld a, BATTLE_VARS_SUBSTATUS3_OPP
call GetBattleVar
and 1 << SUBSTATUS_FLYING | 1 << SUBSTATUS_UNDERGROUND
ret
```
@ -1450,6 +1456,33 @@ Pryce's dialog ("That BADGE will raise the SPECIAL stats of POKéMON.") implies
ret
```
### AI might use its base reward value as an item
In the `AI_TryItem` routine, an item pointer is set to `wEnemyTrainerItem1` and then increments to `wEnemyTrainerItem2` to see if either of the AI's items are in the `AI_Items` list. However, if the AI has used its first item (or its first one is `ITEM_NONE`) and hasn't used its second item, the item pointer can increment from `wEnemyTrainerItem2` to `wEnemyTrainerBaseReward`. If the value at this address then matches an item in the `AI_Items` list, the AI could mistakenly use it.
**Fix:** Edit `AI_TryItem` in [engine/battle/ai/items.asm](https://github.com/pret/pokecrystal/blob/master/engine/battle/ai/items.asm):
```diff
AI_TryItem:
...
ld a, [wTrainerClass]
dec a
ld hl, TrainerClassAttributes + TRNATTR_AI_ITEM_SWITCH
ld bc, NUM_TRAINER_ATTRIBUTES
call AddNTimes
ld b, h
ld c, l
ld hl, AI_Items
-; BUG: AI might use its base reward value as an item (see docs/bugs_and_glitches.md)
- ld de, wEnemyTrainerItem1
.loop
+ ld de, wEnemyTrainerItem1
ld a, [hl]
and a
inc a
ret z
```
### Wild Pokémon can always Teleport regardless of level difference

View File

@ -14,6 +14,7 @@ These are parts of the code that do not work *incorrectly*, like [bugs and glitc
- [The 6-bit caught level can only record up to level 63](#the-6-bit-caught-level-can-only-record-up-to-level-63)
- [Identical sine wave code and data is repeated five times](#identical-sine-wave-code-and-data-is-repeated-five-times)
- [`GetForestTreeFrame` works, but it's still bad](#getforesttreeframe-works-but-its-still-bad)
- [The overworld scripting engine assumes no more than 127 banks](#the-overworld-scripting-engine-assumes-no-more-than-127-banks)
## Pic banks are offset by `PICS_FIX`
@ -816,3 +817,36 @@ Edit `GetForestTreeFrame`:
+ add a
ret
```
## The overworld scripting engine assumes no more than 127 banks
The `CallCallback` and `ExitScriptSubroutine` functions in [engine/overworld/scripting.asm](https://github.com/pret/pokecrystal/blob/master/engine/overworld/scripting.asm) use the highest bit of the bank value, to store whether a certain script stack position should be treated as a return from a callback. However, it seems it was opted to explicitly use the `endcallback` command for this purpose, instead.
As such, this bit serves no purpose but to make map scripts living in the higher banks of mappers such as Japanese Crystal's MBC30 crash for weird reasons.
**Fix:**
Remove the bit mask for the bank value in `ExitScriptSubroutine`:
```diff
ExitScriptSubroutine:
...
add hl, de
ld a, [hli]
ld b, a
- and $7f
ld [wScriptBank], a
ld a, [hli]
ld e, a
```
And in `CallCallback`:
```diff
CallCallback::
- ld a, [wScriptBank]
- or $80
- ld [wScriptBank], a
jp ScriptCall
```

View File

@ -175,6 +175,7 @@ AI_TryItem:
ld b, h
ld c, l
ld hl, AI_Items
; BUG: AI might use its base reward value as an item (see docs/bugs_and_glitches.md)
ld de, wEnemyTrainerItem1
.loop
ld a, [hl]

View File

@ -3682,7 +3682,7 @@ TryToRunAwayFromBattle:
jp z, .cant_escape
cp BATTLETYPE_CELEBI
jp z, .cant_escape
cp BATTLETYPE_SHINY
cp BATTLETYPE_FORCESHINY
jp z, .cant_escape
cp BATTLETYPE_SUICUNE
jp z, .cant_escape
@ -6108,7 +6108,7 @@ LoadEnemyMon:
; Forced shiny battle type
; Used by Red Gyarados at Lake of Rage
cp BATTLETYPE_SHINY
cp BATTLETYPE_FORCESHINY
jr nz, .GenerateDVs
ld b, ATKDEFDV_SHINY ; $ea
@ -6476,7 +6476,7 @@ CheckUnownLetter:
inc e
inc e
ld a, e
cp UnlockedUnownLetterSets.End - UnlockedUnownLetterSets
cp NUM_UNLOCKED_UNOWN_SETS * 2
jr c, .loop
; Hasn't been unlocked, or the letter is invalid
@ -8350,7 +8350,7 @@ CheckPayDay:
ShowLinkBattleParticipantsAfterEnd:
farcall StubbedTrainerRankings_LinkBattles
farcall BackupMobileEventIndex
farcall BackupGSBallFlag
ld a, [wCurOTMon]
ld hl, wOTPartyMon1Status
call GetPartyLocation
@ -8396,7 +8396,7 @@ DisplayLinkBattleResult:
.store_result
hlcoord 6, 8
call PlaceString
farcall BackupMobileEventIndex
farcall BackupGSBallFlag
ld c, 200
call DelayFrames

View File

@ -4161,14 +4161,14 @@ RaiseStat:
add hl, bc
ld b, [hl]
inc b
ld a, $d
ld a, MAX_STAT_LEVEL
cp b
jp c, .cant_raise_stat
ld a, [wLoweredStat]
and $f0
jr z, .got_num_stages
inc b
ld a, $d
ld a, MAX_STAT_LEVEL
cp b
jr nc, .got_num_stages
ld b, a
@ -4176,7 +4176,7 @@ RaiseStat:
ld [hl], b
push hl
ld a, c
cp $5
cp ACCURACY
jr nc, .done_calcing_stats
ld hl, wBattleMonStats + 1
ld de, wPlayerStats
@ -4684,7 +4684,7 @@ LowerStat:
.got_num_stages
ld [hl], b
ld a, c
cp 5
cp ACCURACY
jr nc, .accuracy_evasion
push hl
@ -4955,7 +4955,7 @@ SetBattleDraw:
BattleCommand_ForceSwitch:
ld a, [wBattleType]
cp BATTLETYPE_SHINY
cp BATTLETYPE_FORCESHINY
jp z, .fail
cp BATTLETYPE_TRAP
jp z, .fail

View File

@ -1,6 +1,6 @@
BattleCommand_Teleport:
ld a, [wBattleType]
cp BATTLETYPE_SHINY
cp BATTLETYPE_FORCESHINY
jr z, .failed
cp BATTLETYPE_TRAP
jr z, .failed

View File

@ -20,11 +20,11 @@ ShowPlayerMonsRemaining:
ld de, wPartyCount
call StageBallTilesData
; ldpixel wPlaceBallsX, 12, 12
ld a, 12 * 8
ld a, 12 * TILE_WIDTH
ld hl, wPlaceBallsX
ld [hli], a
ld [hl], a
ld a, 8
ld a, TILE_WIDTH
ld [wPlaceBallsDirection], a
ld hl, wShadowOAMSprite00
jp LoadTrainerHudOAM
@ -36,10 +36,10 @@ ShowOTTrainerMonsRemaining:
call StageBallTilesData
; ldpixel wPlaceBallsX, 9, 4
ld hl, wPlaceBallsX
ld a, 9 * 8
ld a, 9 * TILE_WIDTH
ld [hli], a
ld [hl], 4 * 8
ld a, -8
ld [hl], 4 * TILE_WIDTH
ld a, -TILE_WIDTH
ld [wPlaceBallsDirection], a
ld hl, wShadowOAMSprite00 + PARTY_LENGTH * SPRITEOAMSTRUCT_LENGTH
jp LoadTrainerHudOAM
@ -182,10 +182,10 @@ LinkBattle_TrainerHuds:
ld de, wPartyCount
call StageBallTilesData
ld hl, wPlaceBallsX
ld a, 10 * 8
ld a, 10 * TILE_WIDTH
ld [hli], a
ld [hl], 8 * 8
ld a, 8
ld [hl], 8 * TILE_WIDTH
ld a, TILE_WIDTH
ld [wPlaceBallsDirection], a
ld hl, wShadowOAMSprite00
call LoadTrainerHudOAM
@ -194,9 +194,9 @@ LinkBattle_TrainerHuds:
ld de, wOTPartyCount
call StageBallTilesData
ld hl, wPlaceBallsX
ld a, 10 * 8
ld a, 10 * TILE_WIDTH
ld [hli], a
ld [hl], 13 * 8
ld [hl], 13 * TILE_WIDTH
ld hl, wShadowOAMSprite00 + PARTY_LENGTH * SPRITEOAMSTRUCT_LENGTH
jp LoadTrainerHudOAM

View File

@ -243,7 +243,7 @@ InitBattleAnimBuffer:
add hl, bc
ld a, [hli]
ld d, a
ld a, (-10 * 8) + 4
ld a, (-10 * TILE_WIDTH) + 4
sub d
ld [wBattleAnimTempXCoord], a
ld a, [hli]
@ -251,7 +251,7 @@ InitBattleAnimBuffer:
ld a, [wBattleAnimTempFixY]
cp $ff
jr nz, .check_kinesis_softboiled_milkdrink
ld a, 5 * 8
ld a, 5 * TILE_WIDTH
add d
jr .done
@ -270,7 +270,7 @@ InitBattleAnimBuffer:
jr nz, .no_sub
.do_sub
pop af
sub 1 * 8
sub 1 * TILE_WIDTH
jr .done
.no_sub

View File

@ -13,6 +13,7 @@ DoBattleAnimFrame:
.Jumptable:
; entries correspond to BATTLEANIMFUNC_* constants
table_width 2, DoBattleAnimFrame.Jumptable
dw BattleAnimFunction_Null
dw BattleAnimFunction_MoveFromUserToTarget
dw BattleAnimFunction_MoveFromUserToTargetAndDisappear
@ -93,6 +94,7 @@ DoBattleAnimFrame:
dw BattleAnimFunction_AncientPower
dw BattleAnimFunction_RockSmash
dw BattleAnimFunction_Cotton
assert_table_length NUM_BATTLEANIMFUNCS
BattleAnimFunction_Null:
call BattleAnim_AnonJumptable
@ -301,14 +303,14 @@ BattleAnimFunction_PokeBall:
add hl, bc
add [hl]
ld [hl], a
ld a, BATTLEANIMFRAMESET_0B
ld a, BATTLEANIMFRAMESET_POKE_BALL_3
call ReinitBattleAnimFrameset
call BattleAnim_IncAnonJumptableIndex
ret
.three
call BattleAnim_IncAnonJumptableIndex
ld a, BATTLEANIMFRAMESET_09
ld a, BATTLEANIMFRAMESET_POKE_BALL_1
call ReinitBattleAnimFrameset
ld hl, BATTLEANIMSTRUCT_VAR1
add hl, bc
@ -338,13 +340,13 @@ BattleAnimFunction_PokeBall:
sub $4
ld [hl], a
ret nz
ld a, BATTLEANIMFRAMESET_0C
ld a, BATTLEANIMFRAMESET_POKE_BALL_4
call ReinitBattleAnimFrameset
call BattleAnim_IncAnonJumptableIndex
ret
.six
ld a, BATTLEANIMFRAMESET_0D
ld a, BATTLEANIMFRAMESET_POKE_BALL_5
call ReinitBattleAnimFrameset
ld hl, BATTLEANIMSTRUCT_JUMPTABLE_INDEX
add hl, bc
@ -356,7 +358,7 @@ BattleAnimFunction_PokeBall:
.seven
call GetBallAnimPal
ld a, BATTLEANIMFRAMESET_0A
ld a, BATTLEANIMFRAMESET_POKE_BALL_2
call ReinitBattleAnimFrameset
call BattleAnim_IncAnonJumptableIndex
ld hl, BATTLEANIMSTRUCT_VAR2
@ -493,7 +495,7 @@ BattleAnimFunction_Ember:
.three
call BattleAnim_IncAnonJumptableIndex
ld a, BATTLEANIMFRAMESET_0F
ld a, BATTLEANIMFRAMESET_FLAMETHROWER
call ReinitBattleAnimFrameset
.four
ret
@ -731,7 +733,7 @@ BattleAnimFunction_FireBlast:
ld [hl], a
cp $7
jr z, .seven
ld a, BATTLEANIMFRAMESET_11
ld a, BATTLEANIMFRAMESET_BURNED
call ReinitBattleAnimFrameset
ret
@ -750,7 +752,7 @@ BattleAnimFunction_FireBlast:
.set_up_eight
call BattleAnim_IncAnonJumptableIndex
ld a, BATTLEANIMFRAMESET_10
ld a, BATTLEANIMFRAMESET_EMBER
call ReinitBattleAnimFrameset
.eight
ld hl, BATTLEANIMSTRUCT_VAR1
@ -839,7 +841,7 @@ BattleAnimFunction_RazorLeaf:
add hl, bc
ld [hli], a
ld [hl], a
ld a, BATTLEANIMFRAMESET_17
ld a, BATTLEANIMFRAMESET_RAZOR_LEAF_2
call ReinitBattleAnimFrameset
ld hl, BATTLEANIMSTRUCT_PARAM
add hl, bc
@ -935,7 +937,7 @@ BattleAnimFunction_RazorLeaf:
ret
.three
ld a, BATTLEANIMFRAMESET_16
ld a, BATTLEANIMFRAMESET_RAZOR_LEAF_1
call ReinitBattleAnimFrameset
ld hl, BATTLEANIMSTRUCT_OAMFLAGS
add hl, bc
@ -1012,7 +1014,7 @@ BattleAnimFunction_RockSmash:
and $40
rlca
rlca
add BATTLEANIMFRAMESET_19
add BATTLEANIMFRAMESET_BIG_ROCK
ld hl, BATTLEANIMSTRUCT_FRAMESET_ID
add hl, bc
ld [hl], a
@ -1091,7 +1093,7 @@ BattleAnimFunction_Bubble:
ld hl, BATTLEANIMSTRUCT_VAR1
add hl, bc
ld [hl], $0
ld a, BATTLEANIMFRAMESET_22
ld a, BATTLEANIMFRAMESET_PULSING_BUBBLE
call ReinitBattleAnimFrameset
.two
ld hl, BATTLEANIMSTRUCT_XCOORD
@ -1241,8 +1243,8 @@ BattleAnimFunction_Sing:
call BattleAnim_IncAnonJumptableIndex
ld hl, BATTLEANIMSTRUCT_PARAM
add hl, bc
ld a, BATTLEANIMFRAMESET_24
add [hl] ; BATTLEANIMFRAMESET_25 BATTLEANIMFRAMESET_26
ld a, BATTLEANIMFRAMESET_MUSIC_NOTE_1
add [hl] ; BATTLEANIMFRAMESET_MUSIC_NOTE_2 BATTLEANIMFRAMESET_MUSIC_NOTE_3
call ReinitBattleAnimFrameset
.one
@ -1299,7 +1301,7 @@ BattleAnimFunction_WaterGun:
.run_down
call BattleAnim_IncAnonJumptableIndex
ld a, BATTLEANIMFRAMESET_28
ld a, BATTLEANIMFRAMESET_WATER_GUN_2
call ReinitBattleAnimFrameset
ld hl, BATTLEANIMSTRUCT_YOFFSET
add hl, bc
@ -1323,7 +1325,7 @@ BattleAnimFunction_WaterGun:
.splash
call BattleAnim_IncAnonJumptableIndex
ld a, BATTLEANIMFRAMESET_29
ld a, BATTLEANIMFRAMESET_WATER_GUN_3
call ReinitBattleAnimFrameset
.three
ret
@ -1441,7 +1443,7 @@ BattleAnimFunction_ThunderWave:
.one
call BattleAnim_IncAnonJumptableIndex
ld a, BATTLEANIMFRAMESET_35
ld a, BATTLEANIMFRAMESET_THUNDER_WAVE_EXTRA
call ReinitBattleAnimFrameset
.zero
.two
@ -1587,11 +1589,11 @@ BattleAnimFunction_Bite:
ld [hl], a
bit 7, a
jr nz, .flipped2
ld a, BATTLEANIMFRAMESET_3D
ld a, BATTLEANIMFRAMESET_BITE_2
jr .got_frameset
.flipped2
ld a, BATTLEANIMFRAMESET_3C
ld a, BATTLEANIMFRAMESET_BITE_1
.got_frameset
call ReinitBattleAnimFrameset
ld hl, BATTLEANIMSTRUCT_VAR1
@ -1842,8 +1844,8 @@ BattleAnimFunction_Wrap:
ld hl, BATTLEANIMSTRUCT_FRAMESET_ID
add hl, bc
ld a, [hl]
inc a ; BATTLEANIMFRAMESET_53
; BATTLEANIMFRAMESET_55
inc a ; BATTLEANIMFRAMESET_BIND_2
; BATTLEANIMFRAMESET_BIND_4
call ReinitBattleAnimFrameset
call BattleAnim_IncAnonJumptableIndex
ld hl, BATTLEANIMSTRUCT_VAR1 ; Unused?
@ -1878,7 +1880,7 @@ BattleAnimFunction_LeechSeed:
.sprout
ld [hl], $40
ld a, BATTLEANIMFRAMESET_57
ld a, BATTLEANIMFRAMESET_LEECH_SEED_2
call ReinitBattleAnimFrameset
call BattleAnim_IncAnonJumptableIndex
ret
@ -1894,7 +1896,7 @@ BattleAnimFunction_LeechSeed:
.flutter
call BattleAnim_IncAnonJumptableIndex
ld a, BATTLEANIMFRAMESET_58
ld a, BATTLEANIMFRAMESET_LEECH_SEED_3
call ReinitBattleAnimFrameset
.three
ret
@ -2195,7 +2197,7 @@ BattleAnimFunction_Egg:
.seven
; Switches Softboiled frameset to egg wobbling
ld a, BATTLEANIMFRAMESET_4E ; Egg wobbling
ld a, BATTLEANIMFRAMESET_EGG_WOBBLE ; Egg wobbling
call ReinitBattleAnimFrameset
call BattleAnim_IncAnonJumptableIndex
ret
@ -2216,7 +2218,7 @@ BattleAnimFunction_Egg:
.nine
; First Softboiled ANIM_OBJ_EGG turns into the bottom half frameset
ld a, BATTLEANIMFRAMESET_50 ; Cracked egg bottom
ld a, BATTLEANIMFRAMESET_EGG_CRACKED_BOTTOM ; Cracked egg bottom
call ReinitBattleAnimFrameset
ld hl, BATTLEANIMSTRUCT_YOFFSET
add hl, bc
@ -2226,7 +2228,7 @@ BattleAnimFunction_Egg:
.eleven
; Second Softboiled ANIM_OBJ_EGG
ld a, BATTLEANIMFRAMESET_4F ; Cracked egg top
ld a, BATTLEANIMFRAMESET_EGG_CRACKED_TOP ; Cracked egg top
call ReinitBattleAnimFrameset
call BattleAnim_IncAnonJumptableIndex
ld hl, BATTLEANIMSTRUCT_VAR1
@ -2317,7 +2319,7 @@ BattleAnimFunction_MoveUp:
BattleAnimFunction_Sound:
; Moves object back and forth in one of three angles using a sine behavior and disappear after 8 frames. Used in Growl, Snore and Kinesis
; Obj Param: Used to define object angle. How much to increase from base frameset, which is hardcoded as BATTLEANIMFRAMESET_59
; Obj Param: Used to define object angle. How much to increase from base frameset, which is hardcoded as BATTLEANIMFRAMESET_SOUND_1
call BattleAnim_AnonJumptable
.anon_dw
dw .zero
@ -2341,8 +2343,8 @@ BattleAnimFunction_Sound:
ld [hl], $8 ; duration
ld hl, BATTLEANIMSTRUCT_PARAM
add hl, bc
ld a, BATTLEANIMFRAMESET_59
add [hl] ; BATTLEANIMFRAMESET_5A BATTLEANIMFRAMESET_5B
ld a, BATTLEANIMFRAMESET_SOUND_1
add [hl] ; BATTLEANIMFRAMESET_SOUND_2 BATTLEANIMFRAMESET_SOUND_3
call ReinitBattleAnimFrameset
ret
@ -2418,7 +2420,7 @@ BattleAnimFunction_ConfuseRay:
and $80
rlca
ld [hl], a
add BATTLEANIMFRAMESET_5D ; BATTLEANIMFRAMESET_5E
add BATTLEANIMFRAMESET_CONFUSE_RAY_1 ; BATTLEANIMFRAMESET_CONFUSE_RAY_2
call ReinitBattleAnimFrameset
ret
@ -2541,7 +2543,7 @@ BattleAnimFunction_Dizzy:
BattleAnimFunction_Amnesia:
; Creates 3 objects based on Obj Param
; Obj Param: How much to increase from base frameset, which is hardcoded as BATTLEANIMFRAMESET_63
; Obj Param: How much to increase from base frameset, which is hardcoded as BATTLEANIMFRAMESET_AMNESIA_1
; anim_incobj is used to DeInit object (used by Present)
call BattleAnim_AnonJumptable
.anon_dw
@ -2554,7 +2556,7 @@ BattleAnimFunction_Amnesia:
ld hl, BATTLEANIMSTRUCT_PARAM
add hl, bc
ld a, [hl]
add BATTLEANIMFRAMESET_63 ; BATTLEANIMFRAMESET_64 BATTLEANIMFRAMESET_65
add BATTLEANIMFRAMESET_AMNESIA_1 ; BATTLEANIMFRAMESET_AMNESIA_2 BATTLEANIMFRAMESET_AMNESIA_3
call ReinitBattleAnimFrameset
ld hl, BATTLEANIMSTRUCT_PARAM
add hl, bc
@ -2642,7 +2644,7 @@ BattleAnimFunction_String:
add hl, bc
set OAM_Y_FLIP, [hl]
.not_param_zero
add BATTLEANIMFRAMESET_6A ; BATTLEANIMFRAMESET_6B BATTLEANIMFRAMESET_6C
add BATTLEANIMFRAMESET_STRING_SHOT_1 ; BATTLEANIMFRAMESET_STRING_SHOT_2 BATTLEANIMFRAMESET_STRING_SHOT_3
call ReinitBattleAnimFrameset
.one
ret
@ -2683,7 +2685,7 @@ BattleAnimFunction_Paralyzed:
xor $ff
inc a
ld [hl], a
ld a, BATTLEANIMFRAMESET_6E
ld a, BATTLEANIMFRAMESET_PARALYZED_FLIPPED
call ReinitBattleAnimFrameset
ret
@ -3539,7 +3541,7 @@ BattleAnimFunction_SpeedLine:
add hl, bc
ld a, [hl]
and $7f
add BATTLEANIMFRAMESET_81 ; BATTLEANIMFRAMESET_82 BATTLEANIMFRAMESET_83
add BATTLEANIMFRAMESET_SPEED_LINE_1 ; BATTLEANIMFRAMESET_SPEED_LINE_2 BATTLEANIMFRAMESET_SPEED_LINE_3
call ReinitBattleAnimFrameset
.one
ld hl, BATTLEANIMSTRUCT_PARAM
@ -3558,7 +3560,7 @@ BattleAnimFunction_SpeedLine:
ret
BattleAnimFunction_Sludge:
; Object moves upward for $c frames and switches to FRAMESET_20
; Object moves upward for $c frames and switches to BATTLEANIMFRAMESET_SLUDGE_BUBBLE_BURST
call BattleAnim_AnonJumptable
.anon_dw
dw .zero
@ -3583,7 +3585,7 @@ BattleAnimFunction_Sludge:
.done
call BattleAnim_IncAnonJumptableIndex
ld a, BATTLEANIMFRAMESET_20
ld a, BATTLEANIMFRAMESET_SLUDGE_BUBBLE_BURST
call ReinitBattleAnimFrameset
.two
ld hl, BATTLEANIMSTRUCT_YOFFSET
@ -3771,8 +3773,8 @@ BattleAnimFunction_HealBellNotes:
call BattleAnim_IncAnonJumptableIndex
ld hl, BATTLEANIMSTRUCT_PARAM
add hl, bc
ld a, BATTLEANIMFRAMESET_24
add [hl] ; BATTLEANIMFRAMESET_25 BATTLEANIMFRAMESET_26
ld a, BATTLEANIMFRAMESET_MUSIC_NOTE_1
add [hl] ; BATTLEANIMFRAMESET_MUSIC_NOTE_2 BATTLEANIMFRAMESET_MUSIC_NOTE_3
call ReinitBattleAnimFrameset
.one
ld hl, BATTLEANIMSTRUCT_YOFFSET

View File

@ -154,7 +154,7 @@ Function170139:
; easy chat messages
ld a, BANK(sEZChatBeginBattleMessage)
call OpenSRAM
ld hl, sEZChatBeginBattleMessage
ld hl, sEZChatBattleMessages
ld bc, EASY_CHAT_MESSAGE_LENGTH * 3
call CopyBytes
call CloseSRAM
@ -249,7 +249,7 @@ RunBattleTowerTrainer:
jr nz, .lost
farcall StubbedTrainerRankings_BattleTowerWins
farcall BackupMobileEventIndex
farcall BackupGSBallFlag
ld a, BANK(sNrOfBeatenBattleTowerTrainers)
call OpenSRAM
@ -513,7 +513,7 @@ Function17042c:
ld a, [hli]
and a
jr z, .empty
cp 15
cp (Unknown_170470.end - Unknown_170470) + 1
jr nc, .copy_data
push hl
@ -526,7 +526,7 @@ Function17042c:
pop hl
; If Unknown_170470[a-1] <= b, overwrite the current trainer's data
; with Unknown17047e, and exit the inner loop.
; with Unknown_17047e, and exit the inner loop.
cp b
jr c, .copy_data
jr z, .copy_data
@ -534,9 +534,9 @@ Function17042c:
.empty
; If a == 0 and b >= $fc, overwrite the current trainer's data with
; Unknown17047e, and exit the inner loop.
; Unknown_17047e, and exit the inner loop.
ld a, b
cp $fc
cp NUM_POKEMON + 1
jr nc, .copy_data
.next_iteration
@ -901,7 +901,7 @@ BattleTowerAction:
dw LoadBattleTowerLevelGroup
dw BattleTower_CheckSaveFileExistsAndIsYours
dw BattleTowerAction_0A
dw CheckMobileEventIndex
dw BattleTowerAction_GSBall
dw BattleTowerAction_0C
dw BattleTowerAction_0D
dw BattleTowerAction_EggTicket
@ -1212,10 +1212,10 @@ BattleTowerAction_0A:
call MaxVolume
ret
CheckMobileEventIndex: ; something to do with GS Ball
ld a, BANK(sMobileEventIndex)
BattleTowerAction_GSBall:
ld a, BANK(sGSBallFlag)
call OpenSRAM
ld a, [sMobileEventIndex]
ld a, [sGSBallFlag]
ld [wScriptVar], a
call CloseSRAM
ret

View File

@ -31,8 +31,8 @@ if DEF(_CRYSTAL11)
maskbits BATTLETOWER_NUM_UNIQUE_TRAINERS
cp BATTLETOWER_NUM_UNIQUE_TRAINERS
else
; Crystal 1.0 used the wrong constant here, so only the first 21
; trainers in BattleTowerTrainers can be sampled.
; BUG: Crystal 1.0 used the wrong constant here, so only the first
; 21 trainers in BattleTowerTrainers can be sampled.
maskbits BATTLETOWER_NUM_UNIQUE_MON
cp BATTLETOWER_NUM_UNIQUE_MON
endc

View File

@ -10,10 +10,9 @@ BattleTowerText::
;if DEF(_CRYSTAL11)
; ld hl, wBT_OTTrainerClass
;else
; BUG ALERT
; Instead of loading the Trainer Class, this routine
; loads the 6th character in the Trainer's name, then
; uses it to get the gender of the trainer.
; BUG: Instead of loading the trainer class,
; Crystal 1.0 loads the 6th character in the trainer's
; name, then uses it to get the trainer's gender.
; As a consequence, the enemy trainer's dialog will
; always be sampled from the female array.
; ld hl, wBT_OTName + NAME_LENGTH_JAPANESE - 1

View File

@ -348,7 +348,7 @@ FlyToAnim:
ld [hl], SPRITE_ANIM_SEQ_FLY_TO
ld hl, SPRITEANIMSTRUCT_VAR4
add hl, bc
ld [hl], 11 * 8
ld [hl], 11 * TILE_WIDTH
ld a, 64
ld [wFrameCounter], a
.loop

View File

@ -76,7 +76,7 @@ _UnownPrinter:
ldh a, [hJoyPressed]
vc_patch Forbid_printing_Unown
if DEF(_CRYSTAL11_VC)
and 0
and NO_INPUT
else
and A_BUTTON
endc

View File

@ -681,7 +681,7 @@ Slots_InitReelTiles:
ld [hl], d
ld hl, REEL_X_COORD
add hl, bc
ld [hl], 6 * 8
ld [hl], 6 * TILE_WIDTH
call .OAM
ld bc, wReel2
@ -699,7 +699,7 @@ Slots_InitReelTiles:
ld [hl], d
ld hl, REEL_X_COORD
add hl, bc
ld [hl], 10 * 8
ld [hl], 10 * TILE_WIDTH
call .OAM
ld bc, wReel3
@ -717,7 +717,7 @@ Slots_InitReelTiles:
ld [hl], d
ld hl, REEL_X_COORD
add hl, bc
ld [hl], 14 * 8
ld [hl], 14 * TILE_WIDTH
call .OAM
ret
@ -785,7 +785,7 @@ Slots_UpdateReelPositionAndOAM:
add hl, bc
ld a, [hl]
ld [wCurReelXCoord], a
ld a, 10 * 8
ld a, 10 * TILE_WIDTH
ld [wCurReelYCoord], a
ld hl, REEL_POSITION
add hl, bc
@ -2019,7 +2019,7 @@ Slots_AnimateGolem:
jr c, .play_sound
dec [hl]
ld e, a
ld d, 14 * 8
ld d, 14 * TILE_WIDTH
farcall BattleAnim_Sine_e
ld a, e
ld hl, SPRITEANIMSTRUCT_YOFFSET
@ -2046,7 +2046,7 @@ Slots_AnimateGolem:
ld a, [hl]
inc [hl]
inc [hl]
cp 9 * 8
cp 9 * TILE_WIDTH
jr nc, .restart
and $3
ret nz
@ -2090,7 +2090,7 @@ Slots_AnimateChansey:
add hl, bc
ld a, [hl]
inc [hl]
cp 13 * 8
cp 13 * TILE_WIDTH
jr z, .limit
and $f
ret nz

View File

@ -882,7 +882,7 @@ InitCGBPals::
ldh [rVBK], a
ld a, 1 << rBGPI_AUTO_INCREMENT
ldh [rBGPI], a
ld c, 4 * 8
ld c, 4 * TILE_WIDTH
.bgpals_loop
ld a, LOW(PALRGB_WHITE)
ldh [rBGPD], a
@ -892,7 +892,7 @@ InitCGBPals::
jr nz, .bgpals_loop
ld a, 1 << rOBPI_AUTO_INCREMENT
ldh [rOBPI], a
ld c, 4 * 8
ld c, 4 * TILE_WIDTH
.obpals_loop
ld a, LOW(PALRGB_WHITE)
ldh [rOBPD], a

View File

@ -88,11 +88,11 @@ Mobile_InitAnimatedMonIcon:
ld [hl], a
ld hl, SPRITEANIMSTRUCT_XCOORD
add hl, bc
ld a, 6 * 8
ld a, 6 * TILE_WIDTH
ld [hl], a
ld hl, SPRITEANIMSTRUCT_YCOORD
add hl, bc
ld a, 16 * 8
ld a, 16 * TILE_WIDTH
ld [hl], a
ret
@ -105,11 +105,11 @@ Mobile_InitPartyMenuBGPal71:
ld [hl], a
ld hl, SPRITEANIMSTRUCT_XCOORD
add hl, bc
ld a, 3 * 8
ld a, 3 * TILE_WIDTH
ld [hl], a
ld hl, SPRITEANIMSTRUCT_YCOORD
add hl, bc
ld a, 9 * 8
ld a, 9 * TILE_WIDTH
ld [hl], a
ld a, c
ld [wc608], a
@ -234,8 +234,8 @@ MoveList_InitAnimatedMonIcon:
ld [wCurIcon], a
xor a
call GetIconGFX
ld d, 3 * 8 + 2 ; depixel 3, 4, 2, 4
ld e, 4 * 8 + 4
ld d, 3 * TILE_WIDTH + 2 ; depixel 3, 4, 2, 4
ld e, 4 * TILE_WIDTH + 4
ld a, SPRITE_ANIM_INDEX_PARTY_MON
call _InitSpriteAnimStruct
ld hl, SPRITEANIMSTRUCT_ANIM_SEQ_ID

View File

@ -380,7 +380,7 @@ AnimSeq_SlotsChanseyEgg:
ld hl, SPRITEANIMSTRUCT_XCOORD
add hl, bc
ld a, [hl]
cp 15 * 8
cp 15 * TILE_WIDTH
jr c, .move_right
call DeinitializeSprite
ld a, $4
@ -682,7 +682,7 @@ AnimSeq_FlyLeaf:
ld hl, SPRITEANIMSTRUCT_XCOORD
add hl, bc
ld a, [hl]
cp -9 * 8
cp -9 * TILE_WIDTH
jr nc, .delete_leaf
inc [hl]
inc [hl]
@ -711,7 +711,7 @@ AnimSeq_FlyTo:
ld hl, SPRITEANIMSTRUCT_YCOORD
add hl, bc
ld a, [hl]
cp 10 * 8 + 4
cp 10 * TILE_WIDTH + 4
ret z
ld hl, SPRITEANIMSTRUCT_YCOORD

View File

@ -90,7 +90,7 @@ endc
ld hl, wLinkData
ld de, wOTPartyData
ld bc, SERIAL_PREAMBLE_LENGTH + NAME_LENGTH + 1 + PARTY_LENGTH + 1 + (REDMON_STRUCT_LENGTH + NAME_LENGTH * 2) * PARTY_LENGTH + 3
ld bc, SERIAL_PREAMBLE_LENGTH + NAME_LENGTH + (1 + PARTY_LENGTH + 1) + (REDMON_STRUCT_LENGTH + NAME_LENGTH * 2) * PARTY_LENGTH + 3
vc_hook Wireless_ExchangeBytes_Gen2toGen1_party_structs
call Serial_ExchangeBytes
ld a, SERIAL_NO_DATA_BYTE
@ -98,7 +98,7 @@ endc
ld hl, wPlayerPatchLists
ld de, wOTPatchLists
ld bc, 200
ld bc, SERIAL_PATCH_LIST_LENGTH
vc_hook Wireless_ExchangeBytes_Gen2toGen1_patch_lists
call Serial_ExchangeBytes
@ -122,11 +122,11 @@ endc
jp nc, ExitLinkCommunications
ld de, wLinkData
ld bc, NAME_LENGTH + 1 + PARTY_LENGTH + 1 + (REDMON_STRUCT_LENGTH + NAME_LENGTH * 2) * PARTY_LENGTH + 3
ld bc, NAME_LENGTH + (1 + PARTY_LENGTH + 1) + (REDMON_STRUCT_LENGTH + NAME_LENGTH * 2) * PARTY_LENGTH + 3
call Link_CopyOTData
ld de, wOTPatchLists
ld hl, wLinkPatchList1
ld hl, wTimeCapsulePlayerData
ld c, 2
.loop
ld a, [de]
@ -152,11 +152,11 @@ endc
jr .loop
.next
ld hl, wLinkPatchList2
ld hl, wTimeCapsulePlayerData + SERIAL_PATCH_DATA_SIZE
dec c
jr nz, .loop
ld hl, wLinkPlayerName
ld hl, wLinkData
ld de, wOTPlayerName
ld bc, NAME_LENGTH
call CopyBytes
@ -247,7 +247,7 @@ endc
ldh [rIE], a
ld hl, wLinkBattleRNPreamble
ld de, wEnemyMon
ld de, wOTLinkBattleRNData
ld bc, SERIAL_RN_PREAMBLE_LENGTH + SERIAL_RNS_LENGTH
vc_hook Wireless_ExchangeBytes_RNG_state
call Serial_ExchangeBytes
@ -256,7 +256,7 @@ endc
ld hl, wLinkData
ld de, wOTPartyData
ld bc, SERIAL_PREAMBLE_LENGTH + NAME_LENGTH + 1 + PARTY_LENGTH + 1 + 2 + (PARTYMON_STRUCT_LENGTH + NAME_LENGTH * 2) * PARTY_LENGTH + 3
ld bc, SERIAL_PREAMBLE_LENGTH + NAME_LENGTH + (1 + PARTY_LENGTH + 1) + 2 + (PARTYMON_STRUCT_LENGTH + NAME_LENGTH * 2) * PARTY_LENGTH + 3
vc_hook Wireless_ExchangeBytes_party_structs
call Serial_ExchangeBytes
ld a, SERIAL_NO_DATA_BYTE
@ -264,7 +264,7 @@ endc
ld hl, wPlayerPatchLists
ld de, wOTPatchLists
ld bc, 200
ld bc, SERIAL_PATCH_LIST_LENGTH
vc_hook Wireless_ExchangeBytes_patch_lists
call Serial_ExchangeBytes
@ -276,8 +276,8 @@ endc
ld bc, wLinkPlayerMailEnd - wLinkPlayerMail
vc_hook Wireless_ExchangeBytes_mail
call ExchangeBytes
.not_trading
xor a
ldh [rIF], a
ld a, (1 << JOYPAD) | (1 << SERIAL) | (1 << TIMER) | (1 << VBLANK)
@ -293,8 +293,8 @@ endc
ld bc, NAME_LENGTH + 1 + PARTY_LENGTH + 1 + 2 + (PARTYMON_STRUCT_LENGTH + NAME_LENGTH * 2) * PARTY_LENGTH
call Link_CopyOTData
ld de, wPlayerTrademon
ld hl, wLinkPatchList1
ld de, wOTPatchLists
ld hl, wLinkPlayerData
ld c, 2
.loop1
ld a, [de]
@ -320,7 +320,7 @@ endc
jr .loop1
.next1
ld hl, wLinkPatchList2
ld hl, wLinkPlayerData + SERIAL_PATCH_DATA_SIZE
dec c
jr nz, .loop1
@ -339,10 +339,14 @@ endc
cp SERIAL_MAIL_PREAMBLE_BYTE
jr z, .loop3
dec hl
ld de, wLinkOTMail
ld bc, wLinkDataEnd - wLinkOTMail ; should be wLinkOTMailEnd - wLinkOTMail
call CopyBytes
ld hl, wLinkOTMail
; Replace SERIAL_MAIL_REPLACEMENT_BYTE with SERIAL_NO_DATA_BYTE across all mail
; message bodies.
ld hl, wLinkOTMailMessages
ld bc, (MAIL_MSG_LENGTH + 1) * PARTY_LENGTH
.loop4
ld a, [hl]
@ -355,7 +359,8 @@ endc
ld a, b
or c
jr nz, .loop4
ld de, wOTPlayerMailPatchSet
ld de, wLinkOTMailPatchSet
.loop5
ld a, [de]
inc de
@ -406,7 +411,7 @@ endc
.fix_mail_loop
push bc
push de
farcall IsMailEuropean
farcall ParseMailLanguage
ld a, c
or a
jr z, .next
@ -434,7 +439,7 @@ endc
ld [de], a
.skip_mail
ld hl, wLinkPlayerName
ld hl, wLinkData
ld de, wOTPlayerName
ld bc, NAME_LENGTH
call CopyBytes
@ -615,6 +620,7 @@ FixDataForLinkTransfer:
dec b
jr nz, .preamble_loop
; Initialize random seed, making sure special bytes are omitted
assert wLinkBattleRNPreamble + SERIAL_RN_PREAMBLE_LENGTH == wLinkBattleRNs
ld b, SERIAL_RNS_LENGTH
.rn_loop
@ -625,60 +631,66 @@ FixDataForLinkTransfer:
dec b
jr nz, .rn_loop
; Clear the patch list
ld hl, wPlayerPatchLists
ld a, SERIAL_PREAMBLE_BYTE
rept SERIAL_PATCH_PREAMBLE_LENGTH
ld [hli], a
ld [hli], a
ld [hli], a
ld b, 200
endr
ld b, SERIAL_PATCH_LIST_LENGTH
xor a
.loop1
.clear_loop
ld [hli], a
dec b
jr nz, .loop1
jr nz, .clear_loop
ld hl, (wLinkData + SERIAL_PREAMBLE_LENGTH + NAME_LENGTH + 1 + PARTY_LENGTH + 1) - 1
ld de, wPlayerPatchLists + 10 ; ???
; Loop through all the patchable link data
ld hl, wLinkData + SERIAL_PREAMBLE_LENGTH + NAME_LENGTH + (1 + PARTY_LENGTH + 1) - 1
ld de, wPlayerPatchLists + SERIAL_RNS_LENGTH ; ???
lb bc, 0, 0
.loop2
.patch_loop
; Check if we've gone over the entire area
inc c
ld a, c
cp SERIAL_PATCH_LIST_LENGTH + 1
jr z, .next1
cp SERIAL_PATCH_DATA_SIZE + 1
jr z, .data1_done
; If we're processing the second patch area, check if we've reached the end
ld a, b
dec a
jr nz, .next2
jr nz, .process
push bc
ld a, [wLinkMode]
cp LINK_TIMECAPSULE
ld b, REDMON_STRUCT_LENGTH * PARTY_LENGTH - SERIAL_PATCH_LIST_LENGTH + 1
jr z, .got_value
ld b, 2 + PARTYMON_STRUCT_LENGTH * PARTY_LENGTH - SERIAL_PATCH_LIST_LENGTH + 1
.got_value
ld b, REDMON_STRUCT_LENGTH * PARTY_LENGTH - SERIAL_PATCH_DATA_SIZE + 1
jr z, .got_size
ld b, 2 + PARTYMON_STRUCT_LENGTH * PARTY_LENGTH - SERIAL_PATCH_DATA_SIZE + 1
.got_size
ld a, c
cp b
pop bc
jr z, .done
.next2
jr z, .data2_done
.process
; Replace the "no data" byte, and record it in the array
inc hl
ld a, [hl]
cp SERIAL_NO_DATA_BYTE
jr nz, .loop2
jr nz, .patch_loop
ld a, c
ld [de], a
inc de
ld [hl], SERIAL_PATCH_REPLACEMENT_BYTE
jr .loop2
jr .patch_loop
.next1
.data1_done
ld a, SERIAL_PATCH_LIST_PART_TERMINATOR
ld [de], a
inc de
lb bc, 1, 0
jr .loop2
jr .patch_loop
.done
.data2_done
ld a, SERIAL_PATCH_LIST_PART_TERMINATOR
ld [de], a
ret
@ -857,11 +869,11 @@ Link_PrepPartyData_Gen2:
ld de, wLinkData
ld a, SERIAL_PREAMBLE_BYTE
ld b, SERIAL_PREAMBLE_LENGTH
.loop1
.preamble_loop
ld [de], a
inc de
dec b
jr nz, .loop1
jr nz, .preamble_loop
ld hl, wPlayerName
ld bc, NAME_LENGTH
@ -893,7 +905,7 @@ Link_PrepPartyData_Gen2:
ret nz
; Fill 5 bytes at wLinkPlayerMailPreamble with $20
ld de, wLinkPlayerMailPreamble
ld de, wLinkPlayerMail
ld a, SERIAL_MAIL_PREAMBLE_BYTE
call Link_CopyMailPreamble
@ -902,7 +914,7 @@ Link_PrepPartyData_Gen2:
call OpenSRAM
ld hl, sPartyMail
ld b, PARTY_LENGTH
.loop2
.message_loop
push bc
ld bc, MAIL_MSG_LENGTH + 1
call CopyBytes
@ -910,11 +922,12 @@ Link_PrepPartyData_Gen2:
add hl, bc
pop bc
dec b
jr nz, .loop2
jr nz, .message_loop
; Copy the mail data to wLinkPlayerMailMetadata
ld hl, sPartyMail
ld b, PARTY_LENGTH
.loop3
.metadata_loop
push bc
ld bc, MAIL_MSG_LENGTH + 1
add hl, bc
@ -922,29 +935,31 @@ Link_PrepPartyData_Gen2:
call CopyBytes
pop bc
dec b
jr nz, .loop3
jr nz, .metadata_loop
; Translate the messages if necessary
ld b, PARTY_LENGTH
ld de, sPartyMail
ld hl, wLinkPlayerMailMessages
.loop4
.translate_loop
push bc
push hl
push de
push hl
farcall IsMailEuropean
farcall ParseMailLanguage
pop de
ld a, c
or a
jr z, .next
sub $3
or a ; MAIL_LANG_ENGLISH
jr z, .translate_next
sub MAIL_LANG_ITALIAN
jr nc, .italian_spanish
farcall ConvertFrenchGermanMailToEnglish
jr .next
jr .translate_next
.italian_spanish
cp $2
jr nc, .next
cp (MAIL_LANG_SPANISH + 1) - MAIL_LANG_ITALIAN
jr nc, .translate_next
farcall ConvertSpanishItalianMailToEnglish
.next
.translate_next
pop de
ld hl, MAIL_STRUCT_LENGTH
add hl, de
@ -955,41 +970,42 @@ Link_PrepPartyData_Gen2:
add hl, bc
pop bc
dec b
jr nz, .loop4
jr nz, .translate_loop
call CloseSRAM
; The SERIAL_NO_DATA_BYTE value isn't allowed anywhere in message text
ld hl, wLinkPlayerMailMessages
ld bc, (MAIL_MSG_LENGTH + 1) * PARTY_LENGTH
.loop5
.message_patch_loop
ld a, [hl]
cp SERIAL_NO_DATA_BYTE
jr nz, .skip2
jr nz, .message_patch_skip
ld [hl], SERIAL_MAIL_REPLACEMENT_BYTE
.skip2
.message_patch_skip
inc hl
dec bc
ld a, b
or c
jr nz, .loop5
jr nz, .message_patch_loop
; Calculate the patch offsets for the mail metadata
ld hl, wLinkPlayerMailMetadata
ld de, wLinkPlayerMailPatchSet
ld b, (MAIL_STRUCT_LENGTH - (MAIL_MSG_LENGTH + 1)) * PARTY_LENGTH
ld c, 0
.loop6
.metadata_patch_loop
inc c
ld a, [hl]
cp SERIAL_NO_DATA_BYTE
jr nz, .skip3
jr nz, .metadata_patch_skip
ld [hl], SERIAL_PATCH_REPLACEMENT_BYTE
ld a, c
ld [de], a
inc de
.skip3
.metadata_patch_skip
inc hl
dec b
jr nz, .loop6
jr nz, .metadata_patch_loop
ld a, SERIAL_PATCH_LIST_PART_TERMINATOR
ld [de], a
ret
@ -1193,7 +1209,7 @@ Link_CopyRandomNumbers:
ldh a, [hSerialConnectionStatus]
cp USING_INTERNAL_CLOCK
ret z
ld hl, wEnemyMonSpecies
ld hl, wOTLinkBattleRNData
call Link_FindFirstNonControlCharacter_AllowZero
ld de, wLinkBattleRNs
ld c, 10
@ -2018,7 +2034,7 @@ LinkTrade:
.save
farcall SaveAfterLinkTrade
farcall StubbedTrainerRankings_Trades
farcall BackupMobileEventIndex
farcall BackupGSBallFlag
ld c, 40
call DelayFrames
hlcoord 0, 12

View File

@ -76,7 +76,7 @@ endc
jp z, .LinkCanceled
cp MG_OKAY
jp nz, .CommunicationError
ld a, [wMysteryGiftGameVersion]
ld a, [wMysteryGiftPartnerGameVersion]
cp POKEMON_PIKACHU_2_VERSION
jr z, .skip_checks
call .CheckAlreadyGotFiveGiftsToday
@ -92,17 +92,17 @@ endc
ld a, [wMysteryGiftPartnerBackupItem]
and a
jp nz, .FriendNotReady
ld a, [wMysteryGiftGameVersion]
ld a, [wMysteryGiftPartnerGameVersion]
cp POKEMON_PIKACHU_2_VERSION
jr z, .skip_append_save
call .AddMysteryGiftPartnerID
ld a, [wMysteryGiftGameVersion]
ld a, [wMysteryGiftPartnerGameVersion]
cp RESERVED_GAME_VERSION
jr z, .skip_append_save
call .SaveMysteryGiftTrainerName
farcall RestoreMobileEventIndex
farcall RestoreGSBallFlag
farcall StubbedTrainerRankings_MysteryGift
farcall BackupMobileEventIndex
farcall BackupGSBallFlag
.skip_append_save
ld a, [wMysteryGiftPartnerSentDeco]
and a
@ -307,7 +307,7 @@ endc
ldh a, [hMGRole]
cp IR_SENDER
jr z, SenderExchangeMysteryGiftDataPayloads
; receiver
ld hl, hMGExchangedByte
ld b, 1
call TryReceivingIRDataBlock
@ -522,7 +522,7 @@ EndOrContinueMysteryGiftIRCommunication:
ldh a, [hMGRole]
cp IR_SENDER
jr z, .sender
; receiver
call BeginReceivingIRCommunication
jr nz, EndOrContinueMysteryGiftIRCommunication
jp ReceiverExchangeMysteryGiftDataPayloads
@ -563,7 +563,7 @@ ExchangeNameCardData:
ldh a, [hMGRole]
cp IR_SENDER
jr z, .sender
; receiver
; Receive the data payload
call ReceiveNameCardDataPayload
jp nz, EndNameCardIRCommunication
@ -1748,7 +1748,7 @@ StageDataForNameCard:
ld a, [sCrystalData + 0]
ld [de], a
inc de
ld a, 4 ; MBC30 bank used by JP Crystal; inaccessible by MBC3
ld a, BANK(sEZChatIntroductionMessage) ; aka BANK(sEZChatMessages) ; MBC30 bank used by JP Crystal; inaccessible by MBC3
call OpenSRAM
ld hl, sPhoneNumber ; address of MBC30 bank
ld bc, PHONE_NUMBER_LENGTH

View File

@ -63,7 +63,7 @@ NewGame:
ld [wDebugFlags], a
call ResetWRAM
call NewGame_ClearTilemapEtc
call AreYouABoyOrAreYouAGirl
call PlayerProfileSetup
call OakSpeech
call InitializeWorld
@ -77,17 +77,16 @@ NewGame:
ldh [hMapEntryMethod], a
jp FinishContinueFunction
AreYouABoyOrAreYouAGirl:
PlayerProfileSetup:
call InitSRAMZipcode
farcall Mobile_AlwaysReturnNotCarry ; mobile
farcall CheckMobileAdapterStatus ; mobile
jr c, .ok
farcall InitGender
ret
.ok
ld c, 0
farcall InitMobileProfile ; mobile
farcall InitMobileProfile
ret
InitSRAMZipcode:
@ -236,7 +235,7 @@ endc
farcall DeletePartyMonMail
farcall DeleteMobileEventIndex
farcall ClearGSBallFlag
call ResetGameTime
ret
@ -416,12 +415,9 @@ PostCreditsSpawn:
ldh [hMapEntryMethod], a
ret
Continue_MobileAdapterMenu:
farcall Mobile_AlwaysReturnNotCarry ; mobile check
Continue_MobileAdapterMenu: ; unused
farcall CheckMobileAdapterStatus
ret nc
; the rest of this stuff is never reached because
; the previous function returns with carry not set
ld hl, wd479
bit 1, [hl]
ret nz
@ -971,10 +967,10 @@ Intro_PlacePlayerSprite:
.sprites
db 4
; y pxl, x pxl, tile offset
db 9 * 8 + 4, 9 * 8, 0
db 9 * 8 + 4, 10 * 8, 1
db 10 * 8 + 4, 9 * 8, 2
db 10 * 8 + 4, 10 * 8, 3
db 9 * TILE_WIDTH + 4, 9 * TILE_WIDTH, 0
db 9 * TILE_WIDTH + 4, 10 * TILE_WIDTH, 1
db 10 * TILE_WIDTH + 4, 9 * TILE_WIDTH, 2
db 10 * TILE_WIDTH + 4, 10 * TILE_WIDTH, 3
const_def

View File

@ -217,7 +217,7 @@ MainMenu_GetWhichMenu:
; jr .ok
hlcoord 1, 14
farcall Mobile_AlwaysReturnNotCarry
farcall CheckMobileAdapterStatus
jr nc, .ok
ld a, $7
@ -234,7 +234,7 @@ MainMenu_GetWhichMenu:
.ok
; jr .ok2
hlcoord 1, 14
farcall Mobile_AlwaysReturnNotCarry
farcall CheckMobileAdapterStatus
jr nc, .ok2
ld a, $7
@ -259,7 +259,7 @@ MainMenu_GetWhichMenu:
; jr .ok3
hlcoord 1, 14
farcall Mobile_AlwaysReturnNotCarry
farcall CheckMobileAdapterStatus
jr nc, .ok3
ld a, $7
@ -275,7 +275,7 @@ MainMenu_GetWhichMenu:
.ok3
hlcoord 1, 14
farcall Mobile_AlwaysReturnNotCarry
farcall CheckMobileAdapterStatus
jr nc, .ok4
ld a, $7

View File

@ -375,7 +375,7 @@ NamingScreenJoypadLoop:
depixel 10, 3
call NamingScreen_IsTargetBox
jr nz, .got_cursor_position
ld d, 8 * 8
ld d, 8 * TILE_WIDTH
.got_cursor_position
ld a, SPRITE_ANIM_INDEX_NAMING_SCREEN_CURSOR
call InitSpriteAnimStruct

View File

@ -104,7 +104,7 @@ MoveMonWOMail_InsertMon_SaveGame:
call SaveBackupPokemonData
call SaveBackupChecksum
farcall BackupPartyMonMail
farcall BackupMobileEventIndex
farcall BackupGSBallFlag
farcall SaveRTC
call LoadBox
call ResumeGameLogic
@ -161,17 +161,17 @@ AddHallOfFameEntry:
ld bc, wHallOfFamePokemonListEnd - wHallOfFamePokemonList + 1
call CopyBytes
call CloseSRAM
; This vc_hook causes the Virtual Console to set [sMobileEventIndex] and [sMobileEventIndexBackup]
; to MOBILE_EVENT_OBJECT_GS_BALL, which enables you to get the GS Ball, take it to Kurt, and
; encounter Celebi. It assumes that sMobileEventIndex and sMobileEventIndexBackup are at their
; This vc_hook causes the Virtual Console to set [sGSBallFlag] and [sGSBallFlagBackup]
; to GS_BALL_AVAILABLE, which enables you to get the GS Ball, take it to Kurt, and
; encounter Celebi. It assumes that sGSBallFlag and sGSBallFlagBackup are at their
; original addresses.
vc_hook Enable_GS_Ball_mobile_event
vc_assert BANK(sMobileEventIndex) == $1 && sMobileEventIndex == $be3c, \
"sMobileEventIndex is no longer located at 01:be3c."
vc_assert BANK(sMobileEventIndexBackup) == $1 && sMobileEventIndexBackup == $be44, \
"sMobileEventIndexBackup is no longer located at 01:be44."
vc_assert MOBILE_EVENT_OBJECT_GS_BALL == $0b, \
"MOBILE_EVENT_OBJECT_GS_BALL is no longer equal to $0b."
vc_assert BANK(sGSBallFlag) == $1 && sGSBallFlag == $be3c, \
"sGSBallFlag is no longer located at 01:be3c."
vc_assert BANK(sGSBallFlagBackup) == $1 && sGSBallFlagBackup == $be44, \
"sGSBallFlagBackup is no longer located at 01:be44."
vc_assert GS_BALL_AVAILABLE == $b, \
"GS_BALL_AVAILABLE is no longer equal to $b."
ret
SaveGameData:
@ -281,7 +281,7 @@ _SaveGameData:
call SaveBackupChecksum
call UpdateStackTop
farcall BackupPartyMonMail
farcall BackupMobileEventIndex
farcall BackupGSBallFlag
farcall SaveRTC
; ld a, BANK(sBattleTowerChallengeState)
; call OpenSRAM
@ -367,7 +367,7 @@ ErasePreviousSave:
call SaveData
call Function14d6c
call Function14d83
call Function14d93
call DisableMobileStadium
; the stack stuff here doesn't happen in the japanese version
; doesn't have anything to do with mobile though so that should probably stay here
ld a, BANK(sStackTop)
@ -408,27 +408,27 @@ EraseHallOfFame:
jp CloseSRAM
InitDefaultEZChatMsgs:
ld a, BANK(sEZChatIntroductionMessage)
ld a, BANK(sEZChatMessages)
call OpenSRAM
ld hl, .Data
ld de, sEZChatIntroductionMessage
ld bc, 4 * (2 * 4) ; words
ld de, sEZChatMessages
ld bc, 4 * EASY_CHAT_MESSAGE_LENGTH ; words
call CopyBytes
jp CloseSRAM
.Data:
; introduction
dw $020d, $0500 ; `HELLO` `!`
dw $020e, $0501 ; `GOOD-BYE` `!!`
db $0d, EZCHAT_GREETINGS, $00, EZCHAT_EXCLAMATIONS
db $0e, EZCHAT_GREETINGS, $01, EZCHAT_EXCLAMATIONS
; begin battle
dw $0629, $0503 ; `READY` `?`
dw $0d0d, $0401 ; `LET'S` `GO!`
db $29, EZCHAT_CONVERSATION, $03, EZCHAT_EXCLAMATIONS
db $0d, EZCHAT_FAREWELLS, $01, EZCHAT_BATTLE
; win battle
dw $053d, $0500 ; `YAY` `!`
dw $0404, $0501 ; `I WIN` `!!`
db $3d, EZCHAT_EXCLAMATIONS, $00, EZCHAT_EXCLAMATIONS
db $04, EZCHAT_BATTLE, $01, EZCHAT_EXCLAMATIONS
; lose battle
dw $050f, $0505 ; `URGH` `...!`
dw $0638, $0504 ; `NO WAY` `...`
db $0f, EZCHAT_EXCLAMATIONS, $05, EZCHAT_EXCLAMATIONS
db $38, EZCHAT_CONVERSATION, $04, EZCHAT_EXCLAMATIONS
EraseBattleTowerStatus: ; Call_005_4d09 in crystal jp
; ld a, BANK(sBattleTowerChallengeState)
@ -487,11 +487,11 @@ Function14d83:
call CloseSRAM
ret
Function14d93: ; unreferenced
ld a, 7 ; MBC30 bank used by JP Crystal; inaccessible by MBC3
DisableMobileStadium: ; unreferenced
ld a, BANK(sMobileStadiumFlag)
call OpenSRAM
xor a
ld [$a000], a ; address of MBC30 bank
ld [sMobileStadiumFlag], a
call CloseSRAM
ret
@ -628,7 +628,7 @@ TryLoadSaveFile:
call LoadPokemonData
call LoadBox
farcall RestorePartyMonMail
farcall RestoreMobileEventIndex
farcall RestoreGSBallFlag
farcall RestoreMysteryGift
call ValidateBackupSave
call SaveBackupOptions
@ -645,7 +645,7 @@ TryLoadSaveFile:
call LoadBackupPokemonData
call LoadBox
farcall RestorePartyMonMail
farcall RestoreMobileEventIndex
farcall RestoreGSBallFlag
farcall RestoreMysteryGift
call ValidateSave
call SaveOptions

View File

@ -546,10 +546,10 @@ TryObjectEvent:
ldh a, [hLastTalked]
call GetMapObject
ld hl, MAPOBJECT_COLOR
ld hl, MAPOBJECT_TYPE
add hl, bc
ld a, [hl]
and %00001111
and MAPOBJECT_TYPE_MASK
; BUG: TryObjectEvent arbitrary code execution (see docs/bugs_and_glitches.md)
push bc

View File

@ -880,12 +880,12 @@ MovementFunction_Shadow:
add hl, de
ld a, [hl]
maskbits NUM_DIRECTIONS
ld d, 1 * 8 + 6
ld d, 1 * TILE_WIDTH + 6
cp DOWN
jr z, .ok
cp UP
jr z, .ok
ld d, 1 * 8 + 4
ld d, 1 * TILE_WIDTH + 4
.ok
ld hl, OBJECT_SPRITE_Y_OFFSET
add hl, bc
@ -909,7 +909,7 @@ MovementFunction_Emote:
ld [hl], 0
ld hl, OBJECT_SPRITE_Y_OFFSET
add hl, bc
ld [hl], -2 * 8
ld [hl], -2 * TILE_WIDTH
ld hl, OBJECT_SPRITE_X_OFFSET
add hl, bc
ld [hl], 0
@ -2034,7 +2034,7 @@ SpawnShadow:
.ShadowObject:
; vtile, palette, movement
db $00, PAL_OW_SILVER, SPRITEMOVEDATA_SHADOW
db $00, PAL_OW_EMOTE, SPRITEMOVEDATA_SHADOW
SpawnStrengthBoulderDust:
push bc
@ -2046,7 +2046,7 @@ SpawnStrengthBoulderDust:
.BoulderDustObject:
; vtile, palette, movement
db $00, PAL_OW_SILVER, SPRITEMOVEDATA_BOULDERDUST
db $00, PAL_OW_EMOTE, SPRITEMOVEDATA_BOULDERDUST
SpawnEmote:
push bc
@ -2058,7 +2058,7 @@ SpawnEmote:
.EmoteObject:
; vtile, palette, movement
db $00, PAL_OW_SILVER, SPRITEMOVEDATA_EMOTE
db $00, PAL_OW_EMOTE, SPRITEMOVEDATA_EMOTE
ShakeGrass:
push bc
@ -2085,7 +2085,7 @@ ShakeScreen:
.ScreenShakeObject:
; vtile, palette, movement
db $00, PAL_OW_SILVER, SPRITEMOVEDATA_SCREENSHAKE
db $00, PAL_OW_EMOTE, SPRITEMOVEDATA_SCREENSHAKE
DespawnEmote:
push bc

View File

@ -27,7 +27,7 @@ SpawnPlayer:
call PlayerSpawn_ConvertCoords
ld a, PLAYER_OBJECT
call GetMapObject
ld hl, MAPOBJECT_COLOR
ld hl, MAPOBJECT_PALETTE
add hl, bc
ln e, PAL_NPC_RED, OBJECTTYPE_SCRIPT
ld a, [wPlayerSpriteSetupFlags]
@ -188,10 +188,10 @@ CopyMapObjectToObjectStruct:
call GetSpritePalette
ld [wTempObjectCopyPalette], a
ld hl, MAPOBJECT_COLOR
ld hl, MAPOBJECT_PALETTE
add hl, bc
ld a, [hl]
and $f0
and MAPOBJECT_PALETTE_MASK
jr z, .skip_color_override
swap a
and PALETTE_MASK
@ -203,7 +203,7 @@ CopyMapObjectToObjectStruct:
ld a, [hl]
ld [wTempObjectCopyMovement], a
ld hl, MAPOBJECT_RANGE
ld hl, MAPOBJECT_SIGHT_RANGE
add hl, bc
ld a, [hl]
ld [wTempObjectCopyRange], a

View File

@ -2555,10 +2555,10 @@ Pokedex_GetArea:
.PlayerOAM:
; y pxl, x pxl, tile offset
db -1 * 8, -1 * 8, 0 ; top left
db -1 * 8, 0 * 8, 1 ; top right
db 0 * 8, -1 * 8, 2 ; bottom left
db 0 * 8, 0 * 8, 3 ; bottom right
db -1 * TILE_WIDTH, -1 * TILE_WIDTH, 0 ; top left
db -1 * TILE_WIDTH, 0 * TILE_WIDTH, 1 ; top right
db 0 * TILE_WIDTH, -1 * TILE_WIDTH, 2 ; bottom left
db 0 * TILE_WIDTH, 0 * TILE_WIDTH, 3 ; bottom right
db $80 ; terminator
.CheckPlayerLocation:

View File

@ -779,9 +779,9 @@ EggHatch_CrackShell:
ret nc
swap a
srl a
add 9 * 8 + 4
add 9 * TILE_WIDTH + 4
ld d, a
ld e, 11 * 8
ld e, 11 * TILE_WIDTH
ld a, SPRITE_ANIM_INDEX_EGG_CRACK
call InitSpriteAnimStruct
ld hl, SPRITEANIMSTRUCT_TILE_ID
@ -838,7 +838,7 @@ Hatch_InitShellFragments:
MACRO shell_fragment
; y tile, y pxl, x tile, x pxl, frameset offset, ???
db (\1 * 8) % $100 + \2, (\3 * 8) % $100 + \4, \5 - SPRITE_ANIM_FRAMESET_EGG_HATCH_1, \6
db (\1 * TILE_WIDTH) % $100 + \2, (\3 * TILE_WIDTH) % $100 + \4, \5 - SPRITE_ANIM_FRAMESET_EGG_HATCH_1, \6
ENDM
.SpriteData:

View File

@ -1,29 +1,24 @@
IsMailEuropean:
; return 1 if French
; return 2 if German
; return 3 if Italian
; return 4 if Spanish
; return 0 if none of the above
ld c, $0
ParseMailLanguage:
ld c, MAIL_LANG_ENGLISH
ld hl, sPartyMon1MailNationality - sPartyMon1Mail
add hl, de
ld a, [hli]
cp "E"
ret nz
ld a, [hli]
inc c
inc c ; MAIL_LANG_FRENCH
cp "F"
ret z
inc c
inc c ; MAIL_LANG_GERMAN
cp "G"
ret z
inc c
inc c ; MAIL_LANG_ITALIAN
cp "I"
ret z
inc c
inc c ; MAIL_LANG_SPANISH
cp "S"
ret z
ld c, $0
ld c, MAIL_LANG_ENGLISH
ret
; The regular font.

View File

@ -53,7 +53,7 @@ HealPartyMon:
ret
ComputeHPBarPixels:
; e = bc * (6 * 8) / de
; e = bc * HP_BAR_LENGTH_PX / de
ld a, b
or c
jr z, .zero
@ -64,7 +64,7 @@ ComputeHPBarPixels:
ldh [hMultiplicand + 1], a
ld a, c
ldh [hMultiplicand + 2], a
ld a, 6 * 8
ld a, HP_BAR_LENGTH_PX
ldh [hMultiplier], a
call Multiply
; We need de to be under 256 because hDivisor is only 1 byte.

View File

@ -31,14 +31,14 @@ ReadAnyMail:
push de
ld a, BANK(sPartyMail)
call OpenSRAM
farcall IsMailEuropean
farcall ParseMailLanguage
call CloseSRAM
ld a, c
ld de, StandardEnglishFont
or a
or a ; MAIL_LANG_ENGLISH
jr z, .got_font
ld de, FrenchGermanFont
sub $3
sub MAIL_LANG_ITALIAN
jr c, .got_font
ld de, SpanishItalianFont
@ -69,7 +69,7 @@ ReadAnyMail:
jr z, .loop
vc_patch Forbid_printing_mail
if DEF(_CRYSTAL11_VC)
and 0
and NO_INPUT
else
and START
endc

View File

@ -430,7 +430,7 @@ StatsScreen_InitUpperHalf:
hlcoord 14, 0
call PrintLevel
ld hl, .NicknamePointers
call GetNicknamenamePointer
call GetNicknamePointer
call CopyNickname
hlcoord 8, 2
call PlaceString
@ -791,7 +791,7 @@ LoadBluePage:
ld de, wTempMonID
call PrintNum
ld hl, .OTNamePointers
call GetNicknamenamePointer
call GetNicknamePointer
call CopyNickname
farcall CorrectNickErrors
hlcoord 2, 13
@ -1159,7 +1159,7 @@ CopyNickname:
pop de
ret
GetNicknamenamePointer:
GetNicknamePointer:
ld a, [wMonType]
add a
ld c, a

View File

@ -227,7 +227,7 @@ CheckObjectVisibility::
ret
CheckObjectTime::
ld hl, MAPOBJECT_HOUR
ld hl, MAPOBJECT_HOUR_1
add hl, bc
ld a, [hl]
cp -1
@ -264,10 +264,10 @@ CheckObjectTime::
db NITE
.check_hour
ld hl, MAPOBJECT_HOUR
ld hl, MAPOBJECT_HOUR_1
add hl, bc
ld d, [hl]
ld hl, MAPOBJECT_TIMEOFDAY
ld hl, MAPOBJECT_HOUR_2
add hl, bc
ld e, [hl]
ld hl, hHours

View File

@ -114,7 +114,7 @@ Serial_ExchangeBytes::
dec hl
cp SERIAL_PREAMBLE_BYTE
jr nz, .loop
xor a
xor a ; FALSE
ldh [hSerialIgnoringInitialData], a
jr .loop

View File

@ -31,10 +31,10 @@ _CheckTrainerBattle::
jr z, .next
; Is a trainer
ld hl, MAPOBJECT_COLOR
ld hl, MAPOBJECT_TYPE
add hl, de
ld a, [hl]
and $f
and MAPOBJECT_TYPE_MASK
cp OBJECTTYPE_TRAINER
jr nz, .next
@ -51,7 +51,7 @@ _CheckTrainerBattle::
jr nc, .next
; ...within their sight range
ld hl, MAPOBJECT_RANGE
ld hl, MAPOBJECT_SIGHT_RANGE
add hl, de
ld a, [hl]
cp b

View File

@ -3431,9 +3431,9 @@ Function111664:
Function111686:
xor a
ldh [rTAC], a
ld c, $ff
ld c, LOW(rIE)
ldh a, [c]
and $f3
and ~(1 << SERIAL | 1 << TIMER)
ldh [c], a
ld a, [wMobileSDK_PacketBuffer + 1]
ld [wc86a], a

View File

@ -402,3 +402,6 @@ DEF happinesschecknpc EQUS "HappinessCheckScript"
; constants/sprite_constants.asm
DEF SPRITE_BUENA EQUS "SPRITE_BEAUTY"
DEF PAL_NPC_SILVER EQUS "PAL_NPC_EMOTE"
DEF PAL_OW_SILVER EQUS "PAL_OW_EMOTE"

View File

@ -330,18 +330,20 @@ MACRO object_struct
ENDM
MACRO map_object
\1ObjectStructID:: db
\1ObjectSprite:: db
\1ObjectYCoord:: db
\1ObjectXCoord:: db
\1ObjectMovement:: db
\1ObjectRadius:: db
\1ObjectHour:: db
\1ObjectTimeOfDay:: db
\1ObjectColor:: db
\1ObjectRange:: db
\1ObjectScript:: dw
\1ObjectEventFlag:: dw
\1ObjectStructID:: db
\1ObjectSprite:: db
\1ObjectYCoord:: db
\1ObjectXCoord:: db
\1ObjectMovement:: db
\1ObjectRadius:: db
\1ObjectHour1:: db
\1ObjectHour2::
\1ObjectTimeOfDay:: db
\1ObjectPalette::
\1ObjectType:: db
\1ObjectSightRange:: db
\1ObjectScript:: dw
\1ObjectEventFlag:: dw
ds 2
ENDM

View File

@ -192,7 +192,7 @@ ENDM
const tempo_relative_cmd ; $e9
MACRO tempo_relative
db tempo_relative_cmd
bigdw \1 ; tempo adjustment
db \1 ; tempo adjustment
ENDM
const restart_channel_cmd ; $ea
@ -204,7 +204,7 @@ ENDM
const new_song_cmd ; $eb
MACRO new_song
db new_song_cmd
bigdw \1 ; id
dw \1 ; id
ENDM
const sfx_priority_on_cmd ; $ec

View File

@ -18,8 +18,8 @@ MACRO anim_obj
else
; LEGACY: Support the tile+offset format
db \1 ; object
db (\2) * 8 + (\3) ; x_tile, x
db (\4) * 8 + (\5) ; y_tile, y
db (\2) * TILE_WIDTH + (\3) ; x_tile, x
db (\4) * TILE_WIDTH + (\5) ; y_tile, y
db \6 ; param
endc
ENDM

View File

@ -114,7 +114,7 @@ MACRO object_event
; * if h1 == h2, the object_event will always appear
; * if h1 == -1, h2 is treated as a time-of-day value:
; a combo of MORN, DAY, and/or NITE, or -1 to always appear
;\9: color: a PAL_NPC_* constant, or 0 for sprite default
;\9: palette: a PAL_NPC_* constant, or 0 for sprite default
;\<10>: function: a OBJECTTYPE_* constant
;\<11>: sight range: applies to OBJECTTYPE_TRAINER
;\<12>: script pointer

View File

@ -36,3 +36,5 @@ ENDM
MACRO oamdelete
db oamdelete_command
ENDM
DEF FIRST_OAM_CMD EQU LOW(const_value + 1)

View File

@ -12,7 +12,7 @@ BattleTowerOutside_MapScripts:
callback MAPCALLBACK_OBJECTS, BattleTowerOutsideShowCiviliansCallback
BattleTowerOutsideDoorsCallback:
special Mobile_DummyReturnFalse
special CheckMobileAdapterStatusSpecial
iftrue .doorsopen;$7CE6
changeblock 8, 8, $2C
endcallback
@ -22,7 +22,7 @@ BattleTowerOutsideDoorsCallback:
endcallback
BattleTowerOutsideShowCiviliansCallback:
special Mobile_DummyReturnFalse
special CheckMobileAdapterStatusSpecial
iffalse .nomobile
clearevent EVENT_BATTLE_TOWER_OPEN_CIVILIANS
@ -30,7 +30,7 @@ BattleTowerOutsideShowCiviliansCallback:
endcallback
BattleTowerOutsideYoungsterScript:
special Mobile_DummyReturnFalse
special CheckMobileAdapterStatusSpecial
iftrue .mobile
jumptextfaceplayer BattleTowerOutsideYoungsterText_NotYetOpen
@ -38,7 +38,7 @@ BattleTowerOutsideYoungsterScript:
jumptextfaceplayer BattleTowerOutsideYoungsterText_Mobile
BattleTowerOutsideBeautyScript:
special Mobile_DummyReturnFalse
special CheckMobileAdapterStatusSpecial
iftrue .mobile
jumptextfaceplayer BattleTowerOutsideBeautyText_NotYetOpen
@ -49,7 +49,7 @@ BattleTowerOutsideSailorScript:
jumptextfaceplayer BattleTowerOutsideSailorText_Mobile
BattleTowerOutsideSign:
special Mobile_DummyReturnFalse
special CheckMobileAdapterStatusSpecial
iftrue .mobile
jumptext BattleTowerOutsideSignText_NotYetOpen
@ -57,7 +57,7 @@ BattleTowerOutsideSign:
jumptext BattleTowerOutsideSignText
BattleTowerOutsideDoor:
special Mobile_DummyReturnFalse
special CheckMobileAdapterStatusSpecial
iftrue .mobile
jumptext BattleTowerOutsideText_DoorsClosed

View File

@ -254,8 +254,8 @@ BurnedTowerB1F_MapEvents:
object_event 7, 3, SPRITE_RAIKOU, SPRITEMOVEDATA_POKEMON, 0, 0, -1, -1, PAL_NPC_BROWN, OBJECTTYPE_SCRIPT, 0, ObjectEvent, EVENT_BURNED_TOWER_B1F_BEASTS_1
object_event 12, 3, SPRITE_ENTEI, SPRITEMOVEDATA_POKEMON, 0, 0, -1, -1, PAL_NPC_RED, OBJECTTYPE_SCRIPT, 0, ObjectEvent, EVENT_BURNED_TOWER_B1F_BEASTS_1
object_event 10, 4, SPRITE_SUICUNE, SPRITEMOVEDATA_POKEMON, 0, 0, -1, -1, PAL_NPC_BLUE, OBJECTTYPE_SCRIPT, 0, ObjectEvent, EVENT_BURNED_TOWER_B1F_BEASTS_1
object_event 7, 3, SPRITE_RAIKOU, SPRITEMOVEDATA_STANDING_DOWN, 0, 0, -1, -1, PAL_NPC_SILVER, OBJECTTYPE_SCRIPT, 0, ObjectEvent, EVENT_BURNED_TOWER_B1F_BEASTS_2
object_event 12, 3, SPRITE_ENTEI, SPRITEMOVEDATA_STANDING_DOWN, 0, 0, -1, -1, PAL_NPC_SILVER, OBJECTTYPE_SCRIPT, 0, ObjectEvent, EVENT_BURNED_TOWER_B1F_BEASTS_2
object_event 10, 4, SPRITE_SUICUNE, SPRITEMOVEDATA_STANDING_DOWN, 0, 0, -1, -1, PAL_NPC_SILVER, OBJECTTYPE_SCRIPT, 0, ObjectEvent, EVENT_BURNED_TOWER_B1F_BEASTS_2
object_event 7, 3, SPRITE_RAIKOU, SPRITEMOVEDATA_STANDING_DOWN, 0, 0, -1, -1, PAL_NPC_EMOTE, OBJECTTYPE_SCRIPT, 0, ObjectEvent, EVENT_BURNED_TOWER_B1F_BEASTS_2
object_event 12, 3, SPRITE_ENTEI, SPRITEMOVEDATA_STANDING_DOWN, 0, 0, -1, -1, PAL_NPC_EMOTE, OBJECTTYPE_SCRIPT, 0, ObjectEvent, EVENT_BURNED_TOWER_B1F_BEASTS_2
object_event 10, 4, SPRITE_SUICUNE, SPRITEMOVEDATA_STANDING_DOWN, 0, 0, -1, -1, PAL_NPC_EMOTE, OBJECTTYPE_SCRIPT, 0, ObjectEvent, EVENT_BURNED_TOWER_B1F_BEASTS_2
object_event 16, 4, SPRITE_POKE_BALL, SPRITEMOVEDATA_STILL, 0, 0, -1, -1, 0, OBJECTTYPE_ITEMBALL, 0, BurnedTowerB1FTMEndure, EVENT_BURNED_TOWER_B1F_TM_ENDURE
object_event 10, 12, SPRITE_SUPER_NERD, SPRITEMOVEDATA_STANDING_UP, 0, 0, -1, -1, PAL_NPC_BLUE, OBJECTTYPE_SCRIPT, 0, BurnedTowerB1FEusine, EVENT_EUSINE_IN_BURNED_TOWER

View File

@ -12,7 +12,7 @@ CeruleanPokecenter1FNurseScript:
jumpstd PokecenterNurseScript
CeruleanPokecenter1FSuperNerdScript:
special Mobile_DummyReturnFalse
special CheckMobileAdapterStatusSpecial
iftrue .mobile
jumptextfaceplayer CeruleanPokecenter1FSuperNerdText

View File

@ -33,7 +33,7 @@ CianwoodGymGuideScript:
end
CianwoodPokecenter1FSuperNerdScript:
special Mobile_DummyReturnFalse
special CheckMobileAdapterStatusSpecial
iftrue .mobile
jumptextfaceplayer CianwoodPokecenter1FPreMobileText

View File

@ -23,7 +23,7 @@ DayCareEggCheckCallback:
DayCareManScript_Inside:
faceplayer
opentext
special Mobile_DummyReturnFalse
special CheckMobileAdapterStatusSpecial
iffalse .AlreadyHaveOddEgg
checkevent EVENT_GOT_ODD_EGG
iftrue .AlreadyHaveOddEgg

View File

@ -59,7 +59,7 @@ EcruteakPokecenter1FNurseScript:
jumpstd PokecenterNurseScript
EcruteakPokecenter1FPokefanMScript:
special Mobile_DummyReturnFalse
special CheckMobileAdapterStatusSpecial
iftrue .mobile
jumptextfaceplayer EcruteakPokecenter1FPokefanMText

View File

@ -339,7 +339,7 @@ ElmAfterTheftScript:
writetext ElmAfterTheftText5
promptbutton
setevent EVENT_GAVE_MYSTERY_EGG_TO_ELM
setflag ENGINE_MAIN_MENU_MOBILE_CHOICES
setflag ENGINE_MOBILE_SYSTEM
setmapscene ROUTE_29, SCENE_ROUTE29_CATCH_TUTORIAL
clearevent EVENT_ROUTE_30_YOUNGSTER_JOEY
setevent EVENT_ROUTE_30_BATTLE

View File

@ -47,7 +47,7 @@ TrainerGuitaristClyde:
.Script:
endifjustbattled
special Mobile_DummyReturnFalse
special CheckMobileAdapterStatusSpecial
iftrue .mobile
opentext
writetext GuitaristClydeAfterBattleText

View File

@ -1,6 +1,6 @@
object_const_def
const GOLDENRODPOKECENTER1F_NURSE
const GOLDENRODPOKECENTER1F_LINK_RECEPTIONIST
const GOLDENRODPOKECENTER1F_PCC_TRADE_CORNER_RECEPTIONIST
const GOLDENRODPOKECENTER1F_SUPER_NERD ; $04
const GOLDENRODPOKECENTER1F_LASS2 ; $05
const GOLDENRODPOKECENTER1F_YOUNGSTER
@ -35,7 +35,7 @@ GoldenrodPokecenter1F_MapScripts:
end
.prepareMap
special Mobile_DummyReturnFalse
special CheckMobileAdapterStatusSpecial
iftrue .mobile ; $5067
moveobject GOLDENRODPOKECENTER1F_LASS2, 16, 9 ; this is 71 in jp crystal???
moveobject GOLDENRODPOKECENTER1F_GRAMPS, 0, 7
@ -247,7 +247,7 @@ scenejmp02: ; 568B5
sjump PlayerHasEggTicket.receivedOddEgg ; $A968
GoldenrodPokecenter1F_NewsMachineScript:
special Mobile_DummyReturnFalse ; 568B9
special CheckMobileAdapterStatusSpecial ; 568B9
iftrue .mobileEnabled ; $C268
jumptext GoldenrodPokecomCenterNewsMachineNotYetText ; $1F76
.mobileEnabled
@ -319,48 +319,48 @@ Unreferenced:
end
GoldenrodPokecenter1F_GSBallSceneLeft:
setval $0B ; 56940 (load mobile event index)
setval BATTLETOWERACTION_GSBALL ; 56940 (load mobile event index)
special BattleTowerAction
iffalse GoldenrodPokecenter1F_GSBallSceneRight.nogsball ; $9769
checkevent EVENT_GOT_GS_BALL_FROM_POKECOM_CENTER ; 340
checkevent EVENT_GOT_GS_BALL_FROM_GOLDENROD_POKEMON_CENTER ; 340
iftrue GoldenrodPokecenter1F_GSBallSceneRight.nogsball ; $9769
moveobject GOLDENRODPOKECENTER1F_LINK_RECEPTIONIST, 12, 11
moveobject GOLDENRODPOKECENTER1F_PCC_TRADE_CORNER_RECEPTIONIST, 12, 11
sjump GoldenrodPokecenter1F_GSBallSceneRight.gsball ; 6769
GoldenrodPokecenter1F_GSBallSceneRight:
setval $0B ; 56955 (load mobile event index)
setval BATTLETOWERACTION_GSBALL ; 56955 (load mobile event index)
special BattleTowerAction
iffalse .nogsball ; $9769
checkevent EVENT_GOT_GS_BALL_FROM_POKECOM_CENTER ; 340
checkevent EVENT_GOT_GS_BALL_FROM_GOLDENROD_POKEMON_CENTER ; 340
iftrue .nogsball ; $9769
moveobject GOLDENRODPOKECENTER1F_LINK_RECEPTIONIST, 13, 11
moveobject GOLDENRODPOKECENTER1F_PCC_TRADE_CORNER_RECEPTIONIST, 13, 11
.gsball ; 56769
disappear GOLDENRODPOKECENTER1F_LINK_RECEPTIONIST
appear GOLDENRODPOKECENTER1F_LINK_RECEPTIONIST
disappear GOLDENRODPOKECENTER1F_PCC_TRADE_CORNER_RECEPTIONIST
appear GOLDENRODPOKECENTER1F_PCC_TRADE_CORNER_RECEPTIONIST
playmusic MUSIC_SHOW_ME_AROUND
applymovement GOLDENRODPOKECENTER1F_LINK_RECEPTIONIST, GoldenrodPokeCenter1FLinkReceptionistApproachPlayerMovement ; $0F6A
applymovement GOLDENRODPOKECENTER1F_PCC_TRADE_CORNER_RECEPTIONIST, GoldenrodPokeCenter1FLinkReceptionistApproachPlayerMovement ; $0F6A
turnobject PLAYER, UP
opentext
writetext GoldenrodPokeCenter1FLinkReceptionistPleaseAcceptGSBallText
waitbutton
verbosegiveitem GS_BALL
setevent EVENT_GOT_GS_BALL_FROM_POKECOM_CENTER
setevent EVENT_GOT_GS_BALL_FROM_GOLDENROD_POKEMON_CENTER
setevent EVENT_CAN_GIVE_GS_BALL_TO_KURT
writetext GoldenrodPokeCenter1FLinkReceptionistPleaseDoComeAgainText
waitbutton
closetext
applymovement GOLDENRODPOKECENTER1F_LINK_RECEPTIONIST, GoldenrodPokeCenter1FLinkReceptionistWalkBackMovement ; $196A
applymovement GOLDENRODPOKECENTER1F_PCC_TRADE_CORNER_RECEPTIONIST, GoldenrodPokeCenter1FLinkReceptionistWalkBackMovement ; $196A
special RestartMapMusic
moveobject GOLDENRODPOKECENTER1F_LINK_RECEPTIONIST, 16, 8
disappear GOLDENRODPOKECENTER1F_LINK_RECEPTIONIST
appear GOLDENRODPOKECENTER1F_LINK_RECEPTIONIST
moveobject GOLDENRODPOKECENTER1F_PCC_TRADE_CORNER_RECEPTIONIST, 16, 8
disappear GOLDENRODPOKECENTER1F_PCC_TRADE_CORNER_RECEPTIONIST
appear GOLDENRODPOKECENTER1F_PCC_TRADE_CORNER_RECEPTIONIST
.nogsball
end
GoldenrodPokecenter1FSuperNerdScript:
special Mobile_DummyReturnFalse ; 56998
special CheckMobileAdapterStatusSpecial ; 56998
iftrue .mobile ; $A169
jumptextfaceplayer GoldenrodPokecenter1FMobileOffSuperNerdText ; $E071
@ -368,7 +368,7 @@ GoldenrodPokecenter1FSuperNerdScript:
jumptextfaceplayer GoldenrodPokecenter1FMobileOnSuperNerdText ; $1E72
GoldenrodPokecenter1FLass2Script:
special Mobile_DummyReturnFalse ; 569A4
special CheckMobileAdapterStatusSpecial ; 569A4
iftrue .mobile
jumptextfaceplayer GoldenrodPokecenter1FMobileOffLassText ; $AD72
@ -395,7 +395,7 @@ GoldenrodPokecenter1FLass2Script:
jumptextfaceplayer GoldenrodPokecenter1FMobileOnLassText2 ; $2373
GoldenrodPokecenter1FYoungsterScript:
special Mobile_DummyReturnFalse ; 569D6
special CheckMobileAdapterStatusSpecial ; 569D6
iftrue .mobile ; $DF69
jumptextfaceplayer GoldenrodPokecenter1FMobileOffYoungsterText ; $5473
@ -403,7 +403,7 @@ GoldenrodPokecenter1FYoungsterScript:
jumptextfaceplayer GoldenrodPokecenter1FMobileOnYoungsterText ; $1074
GoldenrodPokecenter1FTeacherScript:
special Mobile_DummyReturnFalse ; 569E2
special CheckMobileAdapterStatusSpecial ; 569E2
iftrue .mobile ; $EB69
jumptextfaceplayer GoldenrodPokecenter1FMobileOffTeacherText ; $8273
@ -411,7 +411,7 @@ GoldenrodPokecenter1FTeacherScript:
jumptextfaceplayer GoldenrodPokecenter1FMobileOnTeacherText ; $3274
GoldenrodPokecenter1FRockerScript:
special Mobile_DummyReturnFalse ; 569EE
special CheckMobileAdapterStatusSpecial ; 569EE
iftrue .mobile ; $F769
jumptextfaceplayer GoldenrodPokecenter1FMobileOffRockerText ; $D073
@ -419,7 +419,7 @@ GoldenrodPokecenter1FRockerScript:
jumptextfaceplayer GoldenrodPokecenter1FMobileOnRockerText ; $5474
GoldenrodPokecenter1FGrampsScript:
special Mobile_DummyReturnFalse ; 569FD
special CheckMobileAdapterStatusSpecial ; 569FD
iftrue .mobile ; $066A
jumptextfaceplayer GoldenrodPokecenter1FMobileOffGrampsText ; $D674

View File

@ -85,7 +85,7 @@ RedGyarados:
cry GYARADOS
closetext
loadwildmon GYARADOS, 30
loadvar VAR_BATTLETYPE, BATTLETYPE_SHINY
loadvar VAR_BATTLETYPE, BATTLETYPE_FORCESHINY
startbattle
ifequal LOSE, .NotBeaten
disappear LAKEOFRAGE_GYARADOS

View File

@ -105,7 +105,7 @@ OlivineLighthouseSign:
jumptext OlivineLighthouseSignText
OlivineCityBattleTowerSign:
special Mobile_DummyReturnFalse
special CheckMobileAdapterStatusSpecial
iftrue .mobile
jumptext OlivineCityBattleTowerSignPreMobileText

View File

@ -73,7 +73,7 @@ LinkReceptionistScript_Trade:
writetext Text_TradeReceptionistIntro
yesorno
iffalse .Cancel
special Mobile_DummyReturnFalse ; always returns false
special CheckMobileAdapterStatusSpecial
iffalse .NoMobile
writetext Text_TradeReceptionistMobile
special AskMobileOrCable
@ -175,7 +175,7 @@ LinkReceptionistScript_Battle:
writetext Text_BattleReceptionistIntro
yesorno
iffalse .Cancel
special Mobile_DummyReturnFalse ; always returns false
special CheckMobileAdapterStatusSpecial
iffalse .NoMobile
writetext Text_BattleReceptionistMobile
special AskMobileOrCable

View File

@ -19,7 +19,7 @@ Route40_MapScripts:
callback MAPCALLBACK_OBJECTS, Route40MonicaCallback
Route40MonicaCallback:
special Mobile_DummyReturnFalse
special CheckMobileAdapterStatusSpecial
iffalse .nomobile
clearevent EVENT_BATTLE_TOWER_OPEN_CIVILIANS
@ -81,7 +81,7 @@ Route40Lass1Script:
jumptextfaceplayer Route40Lass1Text
Route40PokefanMScript:
special Mobile_DummyReturnFalse
special CheckMobileAdapterStatusSpecial
iftrue .mobile
jumptextfaceplayer Route40PokefanMText

View File

@ -9,7 +9,7 @@ Route40BattleTowerGate_MapScripts:
callback MAPCALLBACK_OBJECTS, RouteBattleTowerGateShowSailorCallback
RouteBattleTowerGateShowSailorCallback:
special Mobile_DummyReturnFalse
special CheckMobileAdapterStatusSpecial
iffalse .nomobile
clearevent EVENT_BATTLE_TOWER_OPEN_CIVILIANS
@ -20,7 +20,7 @@ Route40BattleTowerGateRockerScript:
jumptextfaceplayer Route40BattleTowerGateUnusedText3
Route40BattleTowerGateTwinScript:
special Mobile_DummyReturnFalse
special CheckMobileAdapterStatusSpecial
iftrue .mobile
jumptextfaceplayer Route40BattleTowerGateUnusedText1

View File

@ -125,7 +125,7 @@ RuinsOfAlphResearchCenterScientist2Script:
end
.GotAllUnown:
special Mobile_DummyReturnFalse
special CheckMobileAdapterStatusSpecial
iftrue .mobile
writetext RuinsOfAlphResearchCenterUnusedText1 ; 5141
waitbutton

View File

@ -13,7 +13,7 @@ SaffronPokecenter1FNurseScript:
jumpstd PokecenterNurseScript
SaffronPokecenter1FTeacherScript:
special Mobile_DummyReturnFalse
special CheckMobileAdapterStatusSpecial
iftrue .mobile
jumptextfaceplayer SaffronPokecenter1FTeacherText

View File

@ -77,7 +77,7 @@ VioletPokecenter1F_ElmsAideScript:
sjump .AskTakeEgg
VioletPokecenter1FGameboyKidScript:
special Mobile_DummyReturnFalse
special CheckMobileAdapterStatusSpecial
iftrue .mobile
jumptextfaceplayer VioletPokecenterGameboyKidPreMobileText

View File

@ -407,9 +407,9 @@ Function11c1b9:
Function11c254:
push af
ld a, BANK(sEZChatIntroductionMessage)
ld a, BANK(sEZChatMessages)
call OpenSRAM
ld hl, sEZChatIntroductionMessage
ld hl, sEZChatMessages
pop af
; a * 4 * 2
sla a
@ -419,7 +419,7 @@ Function11c254:
ld b, 0
add hl, bc
ld de, wEZChatWords
ld bc, EZCHAT_WORD_COUNT * 2
ld bc, EASY_CHAT_MESSAGE_LENGTH
call CopyBytes
call CloseSRAM
ret
@ -528,8 +528,8 @@ EZChat_MasterLoop:
depixel 3, 1, 2, 5
ld a, SPRITE_ANIM_INDEX_EZCHAT_CURSOR
call InitSpriteAnimStruct
depixel 8, 1, 2, 5
depixel 8, 1, 2, 5
ld a, SPRITE_ANIM_INDEX_EZCHAT_CURSOR
call InitSpriteAnimStruct
ld hl, SPRITEANIMSTRUCT_VAR1
@ -2242,9 +2242,9 @@ EZChatMenu_MessageTypeMenu: ; Message Type Menu Controls (Intro/Battle Start/Win
ld a, [hl]
and a
jr nz, .clicksound
ld a, BANK(sEZChatIntroductionMessage)
ld a, BANK(sEZChatMessages)
call OpenSRAM
ld hl, sEZChatIntroductionMessage
ld hl, sEZChatMessages
ld a, [wMenuCursorY]
dec a
sla a
@ -2254,7 +2254,7 @@ EZChatMenu_MessageTypeMenu: ; Message Type Menu Controls (Intro/Battle Start/Win
ld b, 0
add hl, bc
ld de, wEZChatWords
ld c, EZCHAT_WORD_COUNT * 2
ld c, EASY_CHAT_MESSAGE_LENGTH
.save_message
ld a, [de]
ld [hli], a
@ -3144,12 +3144,12 @@ AnimateEZChatCursor: ; EZChat cursor drawing code, extends all the way down to r
ret
.nine
ld d, -13 * 8
ld d, -13 * TILE_WIDTH
ld a, SPRITE_ANIM_FRAMESET_EZCHAT_CURSOR_7 ; $2c
jr .eight_nine_load
.eight
ld d, 2 * 8
ld d, 2 * TILE_WIDTH
ld a, SPRITE_ANIM_FRAMESET_EZCHAT_CURSOR_6 ; $2b
.eight_nine_load
push de
@ -3161,7 +3161,7 @@ AnimateEZChatCursor: ; EZChat cursor drawing code, extends all the way down to r
ld e, a
sla a
add e
add 8 * 8
add 8 * TILE_WIDTH
ld hl, SPRITEANIMSTRUCT_YCOORD
add hl, bc
ld [hld], a

View File

@ -80,7 +80,7 @@ Function8b35d: ; unreferenced
Function8b363: ; unreferenced
push bc
farcall Mobile_AlwaysReturnNotCarry
farcall CheckMobileAdapterStatus
pop bc
ret

View File

@ -2430,14 +2430,14 @@ Unknown_100feb:
db -1 ; end
Unknown_100ff3:
macro_100fc0 wdc41, 1
macro_100fc0 wPlayerName, NAME_LENGTH
macro_100fc0 wPlayerName, NAME_LENGTH
macro_100fc0 wPlayerID, 2
macro_100fc0 wSecretID, 2
macro_100fc0 wPlayerGender, 1
macro_100fc0 sPhoneNumber, PHONE_NUMBER_LENGTH
macro_100fc0 sEZChatIntroductionMessage, EASY_CHAT_MESSAGE_LENGTH * 4
macro_100fc0 wdc41, 1
macro_100fc0 wPlayerName, NAME_LENGTH
macro_100fc0 wPlayerName, NAME_LENGTH
macro_100fc0 wPlayerID, 2
macro_100fc0 wSecretID, 2
macro_100fc0 wPlayerGender, 1
macro_100fc0 sPhoneNumber, PHONE_NUMBER_LENGTH
macro_100fc0 sEZChatMessages, EASY_CHAT_MESSAGE_LENGTH * 4
db -1 ; end
Unknown_10102c:
@ -5189,7 +5189,7 @@ Function102423:
ret nc
farcall SaveAfterLinkTrade
farcall StubbedTrainerRankings_Trades
farcall BackupMobileEventIndex
farcall BackupGSBallFlag
ld hl, wcd4b
set 1, [hl]
ld a, 0
@ -7390,7 +7390,7 @@ MenuData_103648:
db "CABLE@" ; "ケーブル@"
Function103654:
farcall Mobile_AlwaysReturnNotCarry
farcall CheckMobileAdapterStatus
bit 7, c
jr nz, .asm_103666
ld hl, wcd2a
@ -7405,7 +7405,7 @@ Function103654:
ret
Mobile_SelectThreeMons:
farcall Mobile_AlwaysReturnNotCarry
farcall CheckMobileAdapterStatus
bit 7, c
jr z, .asm_10369b
ld hl, MobileBattleMustPickThreeMonText
@ -7665,8 +7665,7 @@ MobileBattleNoTimeLeftForLinkingText:
text_end
MobileCheckRemainingBattleTime:
; Returns carry if less than one minute remains
farcall Mobile_AlwaysReturnNotCarry
farcall CheckMobileAdapterStatus
bit 7, c
jr nz, .ok
farcall MobileBattleGetRemainingTime
@ -7714,7 +7713,7 @@ PickThreeMonForMobileBattleText:
text_end
Function10387b:
farcall Mobile_AlwaysReturnNotCarry
farcall CheckMobileAdapterStatus
bit 7, c
ret nz
farcall MobileBattleGetRemainingTime

View File

@ -512,15 +512,15 @@ CalculateTrainerRankingsChecksum:
pop bc
ret
BackupMobileEventIndex:
ld a, BANK(sMobileEventIndex)
BackupGSBallFlag:
ld a, BANK(sGSBallFlag)
call OpenSRAM
ld a, [sMobileEventIndex]
ld a, [sGSBallFlag]
push af
ld a, BANK(sMobileEventIndexBackup)
ld a, BANK(sGSBallFlagBackup)
call OpenSRAM
pop af
ld [sMobileEventIndexBackup], a
ld [sGSBallFlagBackup], a
call CloseSRAM
; ret
@ -535,15 +535,15 @@ BackupMobileEventIndex:
call CloseSRAM;$2fad
ret
RestoreMobileEventIndex:
ld a, BANK(sMobileEventIndexBackup)
RestoreGSBallFlag:
ld a, BANK(sGSBallFlagBackup)
call OpenSRAM
ld a, [sMobileEventIndexBackup]
ld a, [sGSBallFlagBackup]
push af
ld a, BANK(sMobileEventIndex)
ld a, BANK(sGSBallFlag)
call OpenSRAM
pop af
ld [sMobileEventIndex], a
ld [sGSBallFlag], a
call CloseSRAM
; ret
@ -569,11 +569,11 @@ VerifyTrainerRankingsChecksum:
cp [hl]
ret
DeleteMobileEventIndex: ; after Call_041_6208 in jp
ld a, BANK(sMobileEventIndex)
ClearGSBallFlag:
ld a, BANK(sGSBallFlag)
call OpenSRAM
xor a
ld [sMobileEventIndex], a
ld [sGSBallFlag], a
call CloseSRAM
; ret
@ -826,54 +826,51 @@ endr
; functions related to the cable club and various NPC scripts referencing communications
Mobile_DummyReturnFalse:
call Function106331
CheckMobileAdapterStatusSpecial:
call CheckMobileAdapterStatus
ld a, c
ld [wScriptVar], a
ret
Stubbed_Function106314:
SetMobileAdapterStatus:
; ret
ld a, BANK(s4_b000)
ld a, BANK(sMobileAdapterStatus)
call OpenSRAM
ld a, c
cpl
ld [s4_b000], a
ld [sMobileAdapterStatus], a
call CloseSRAM
ld a, BANK(s7_a800)
ld a, BANK(sMobileAdapterStatus2)
call OpenSRAM
ld a, c
ld [s7_a800], a
ld [sMobileAdapterStatus2], a
call CloseSRAM
ret
Mobile_AlwaysReturnNotCarry:
CheckMobileAdapterStatus: ; unused
; or a
; ret
Function106331:
; called by Mobile_DummyReturnFalse in Crystal-J
; check ~[4:b000] == [7:a800]
ld a, BANK(s4_b000)
ld a, BANK(sMobileAdapterStatus)
call OpenSRAM
ld a, [s4_b000]
ld a, [sMobileAdapterStatus]
cpl
ld b, a
call CloseSRAM
ld a, BANK(s7_a800)
ld a, BANK(sMobileAdapterStatus2)
call OpenSRAM
ld a, [s7_a800]
ld a, [sMobileAdapterStatus2]
ld c, a
call CloseSRAM
ld a, c
cp b
jr nz, .nope
; check [s7_a800] != 0
; check [sMobileAdapterStatus2] != 0
and a
jr z, .nope
; check !([s7_a800] & %01110000)
; check !([sMobileAdapterStatus2] & %01110000)
and %10001111
cp c
jr nz, .nope
@ -929,7 +926,7 @@ Function106392:
ret
.asm_1063a2
call Mobile_AlwaysReturnNotCarry
call CheckMobileAdapterStatus
ld a, c
and a
jr nz, .asm_1063b4
@ -1004,14 +1001,14 @@ Function106403:
or c
inc a
ld c, a
call Stubbed_Function106314
call SetMobileAdapterStatus
ld a, [wMobileCommsJumptableIndex]
inc a
ld [wMobileCommsJumptableIndex], a
ret
.asm_106426
call Mobile_AlwaysReturnNotCarry
call CheckMobileAdapterStatus
ld a, c
and a
jr z, .asm_106435
@ -1022,7 +1019,7 @@ Function106403:
.asm_106435
ld c, $0
call Stubbed_Function106314
call SetMobileAdapterStatus
ld a, [wMobileCommsJumptableIndex]
inc a
ld [wMobileCommsJumptableIndex], a
@ -1075,13 +1072,13 @@ Function106464::
Function10649b: ; unreferenced
ld a, [wTextboxFrame]
maskbits NUM_FRAMES
ld bc, 6 * LEN_1BPP_TILE
ld bc, TEXTBOX_FRAME_TILES * LEN_1BPP_TILE
ld hl, Frames
call AddNTimes
ld d, h
ld e, l
ld hl, vTiles2 tile "┌" ; $79
ld c, 6 ; "┌" to "┘"
ld c, TEXTBOX_FRAME_TILES ; "┌" to "┘"
ld b, BANK(Frames)
call Function1064c3
ld hl, vTiles2 tile " " ; $7f

View File

@ -1516,9 +1516,9 @@ MobileTradeAnim_AnimateSentPulse:
ld hl, SPRITEANIMSTRUCT_YCOORD
add hl, bc
ld a, [hl]
cp -1 * 8 - 6
cp -1 * TILE_WIDTH - 6
jr z, .delete
sub 1 * 8
sub 1 * TILE_WIDTH
ld [hl], a
ret
@ -1530,9 +1530,9 @@ MobileTradeAnim_AnimateOTPulse:
ld hl, SPRITEANIMSTRUCT_YCOORD
add hl, bc
ld a, [hl]
cp 9 * 8 + 2
cp 9 * TILE_WIDTH + 2
ret z
add 1 * 8
add 1 * TILE_WIDTH
ld [hl], a
ret

View File

@ -7454,10 +7454,10 @@ Function11b3d9:
jr .loop1
.skip
ld b, 14 * 8
ld b, 14 * TILE_WIDTH
.load_sprites
ld a, 2 * 8 + 5
ld a, 2 * TILE_WIDTH + 5
add b
pop hl
ld [hli], a
@ -7474,7 +7474,7 @@ Function11b3d9:
jr z, .version2
.version1
ld a, 19 * 8 + 3
ld a, 19 * TILE_WIDTH + 3
ld [hli], a
ld a, [wcd4c]
add $3c
@ -7485,7 +7485,7 @@ Function11b3d9:
ret
.version2
ld a, 19 * 8 + 3
ld a, 19 * TILE_WIDTH + 3
ld [hli], a
ld a, $39
ld [hli], a

View File

@ -867,8 +867,8 @@ INCBIN "gfx/mobile/stadium2_n64.2bpp"
Stadium2N64Tilemap:
;if DEF(_CRYSTAL11)
; Crystal 1.1 corrupted this tilemap by treating $0a bytes as Unix newlines,
; and converting them to $0d $0a Windows newlines.
; BUG: Crystal 1.1 corrupted this tilemap by treating $0a bytes as
; Unix newlines, and converting them to $0d $0a Windows newlines.
;INCBIN "gfx/mobile/stadium2_n64_corrupt.tilemap"
;else
INCBIN "gfx/mobile/stadium2_n64.tilemap"

View File

@ -3028,7 +3028,7 @@ IncCrashCheckPointer_SaveChecksum:
inc_crash_check_pointer_farcall SaveChecksum
IncCrashCheckPointer_SaveTrainerRankingsChecksum:
inc_crash_check_pointer_farcall UpdateTrainerRankingsChecksum2, BackupMobileEventIndex
inc_crash_check_pointer_farcall UpdateTrainerRankingsChecksum2, BackupGSBallFlag
Function17e3e0:
call IncCrashCheckPointer
@ -3919,7 +3919,7 @@ Function17f1d0:
call Function17f4f6
add hl, de
ld a, [hl]
ld a, $1
ld a, BANK(wNamedObjectIndex)
ldh [rSVBK], a
ld [wNamedObjectIndex], a
call GetPokemonName

View File

@ -136,11 +136,11 @@ sHallOfFameEnd::
SECTION "SRAM Crystal Data", SRAM
sMobileEventIndex:: db
sGSBallFlag:: db
sCrystalData:: ds wCrystalDataEnd - wCrystalData
sMobileEventIndexBackup:: db
sGSBallFlagBackup:: db
SECTION "SRAM Battle Tower", SRAM
@ -204,10 +204,14 @@ SECTION "Boxes 8-14", SRAM
SECTION "SRAM Mobile 1", SRAM
ds $7 ; former location of sCrystalData
sEZChatMessages::
sEZChatIntroductionMessage:: ds EASY_CHAT_MESSAGE_LENGTH
sEZChatBeginBattleMessage:: ds EASY_CHAT_MESSAGE_LENGTH
sEZChatWinBattleMessage:: ds EASY_CHAT_MESSAGE_LENGTH
sEZChatLoseBattleMessage:: ds EASY_CHAT_MESSAGE_LENGTH
sEZChatBattleMessages::
sEZChatBeginBattleMessage:: ds EASY_CHAT_MESSAGE_LENGTH
sEZChatWinBattleMessage:: ds EASY_CHAT_MESSAGE_LENGTH
sEZChatLoseBattleMessage:: ds EASY_CHAT_MESSAGE_LENGTH
sCardFolderPasscode:: ds 4
sCardFolderData:: ds CARD_FOLDER_ENTRY_LENGTH * NUM_CARD_FOLDER_ENTRIES ; a03b
sPhoneNumber:: ds PHONE_NUMBER_LENGTH
@ -217,12 +221,12 @@ s4_a60e:: ds 2
ds 496
sMobileBattleTimer:: ds 3
ds 797
s4_b000:: ds 1
sMobileAdapterStatus:: db
SECTION "SRAM Mobile 2", SRAM
sMobileEventIndexJP:: db ; JP: location of sMobileEventIndex
sGSBallFlagJP:: db
sTrainerRankings::
sTrainerRankingGameTimeHOF:: ds 4
@ -270,7 +274,7 @@ sTrainerRankingBugContestScore:: ds 2
sTrainerRankingsChecksum:: ds 2
sTrainerRankingsEnd::
sMobileEventIndexBackupJP:: db ; JP: location of sMobileEventIndexBackup
sGSBallFlagBackupJP:: db
sTrainerRankingsBackup:: ds sTrainerRankingsEnd - sTrainerRankings
@ -388,8 +392,8 @@ s6_a006:: ds $1000
SECTION "SRAM Mobile 4", SRAM
; Bank 7 in bank 6??
s7_a000:: db
sMobileStadiumFlag:: db
s7_a001:: ds $799
s7_a800:: ds $800
sMobileAdapterStatus2:: ds $800
s7_b000:: ds $fea
s7_bfea:: ds 1

View File

@ -617,8 +617,8 @@ wBattleEnd::
SECTION UNION "Miscellaneous", WRAM0
; link patch lists
wPlayerPatchLists:: ds 200
wOTPatchLists:: ds 200
wPlayerPatchLists:: ds SERIAL_PATCH_LIST_LENGTH
wOTPatchLists:: ds SERIAL_PATCH_LIST_LENGTH
SECTION UNION "Miscellaneous", WRAM0
@ -756,7 +756,8 @@ if DEF(_CRYSTAL11)
wPokedexStatus:: db
wPokedexDataEnd::
else
wPokedexDataEnd:: ds 1
wPokedexDataEnd::
ds 1
endc
ds 2
@ -1018,10 +1019,6 @@ for n, 1, PARTY_LENGTH + 1
wTimeCapsulePartyMon{d:n}Nickname:: ds MON_NAME_LENGTH
endr
NEXTU
; link patch lists
wLinkPatchList1:: ds SERIAL_PATCH_LIST_LENGTH
wLinkPatchList2:: ds SERIAL_PATCH_LIST_LENGTH
ENDU
@ -1046,13 +1043,14 @@ wLinkPlayerMail::
wLinkPlayerMailPreamble:: ds SERIAL_MAIL_PREAMBLE_LENGTH
wLinkPlayerMailMessages:: ds (MAIL_MSG_LENGTH + 1) * PARTY_LENGTH
wLinkPlayerMailMetadata:: ds (MAIL_STRUCT_LENGTH - (MAIL_MSG_LENGTH + 1)) * PARTY_LENGTH
wLinkPlayerMailPatchSet:: ds 103
wLinkPlayerMailPatchSet:: ds 100 + SERIAL_PATCH_PREAMBLE_LENGTH
wLinkPlayerMailEnd::
ds 10
wLinkOTMail::
wLinkOTMailMessages:: ds (MAIL_MSG_LENGTH + 1) * PARTY_LENGTH
wLinkOTMailMetadata:: ds (MAIL_STRUCT_LENGTH - (MAIL_MSG_LENGTH + 1)) * PARTY_LENGTH
wOTPlayerMailPatchSet:: ds 103 + SERIAL_MAIL_PREAMBLE_LENGTH
wLinkOTMailPatchSet:: ds 100 + SERIAL_PATCH_PREAMBLE_LENGTH
wLinkOTMailPadding:: ds SERIAL_MAIL_PREAMBLE_LENGTH
wLinkOTMailEnd::
ds 10
@ -1091,7 +1089,7 @@ ENDU
ds 138
wMysteryGiftPartnerData::
wMysteryGiftGameVersion:: db
wMysteryGiftPartnerGameVersion:: db
wMysteryGiftPartnerID:: dw
wMysteryGiftPartnerName:: ds NAME_LENGTH
wMysteryGiftPartnerDexCaught:: db
@ -1105,7 +1103,7 @@ wMysteryGiftPartnerDataEnd::
ds 60
wMysteryGiftPlayerData::
ds 1
wMysteryGiftPlayerGameVersion:: db
wMysteryGiftPlayerID:: dw
wMysteryGiftPlayerName:: ds NAME_LENGTH
wMysteryGiftPlayerDexCaught:: db
@ -1596,8 +1594,10 @@ wPrevDexEntryJumptableIndex:: db
if DEF(_CRYSTAL11)
wPrevDexEntryBackup:: db
else
wPrevDexEntryBackup::
wPokedexStatus:: db
; BUG: Crystal 1.0 reused the same byte in WRAM for
; wPokedexStatus and wPrevDexEntryBackup.
wPokedexStatus::
wPrevDexEntryBackup:: db
endc
wUnusedPokedexByte:: db
@ -2057,8 +2057,15 @@ wSwitchItemBuffer:: ds 2 ; may store 1 or 2 bytes
SECTION UNION "Miscellaneous WRAM 1", WRAMX
; switching pokemon in party
; may store NAME_LENGTH, PARTYMON_STRUCT_LENGTH, or MAIL_STRUCT_LENGTH bytes
wSwitchMonBuffer:: ds 48
; may store a name, partymon, or mail
wSwitchMonBuffer::
UNION
ds NAME_LENGTH
NEXTU
ds PARTYMON_STRUCT_LENGTH
NEXTU
ds MAIL_STRUCT_LENGTH
ENDU
SECTION UNION "Miscellaneous WRAM 1", WRAMX
@ -2694,11 +2701,15 @@ ENDU
wTempEnemyMonSpecies:: db
wTempBattleMonSpecies:: db
UNION
wOTLinkBattleRNData:: ds SERIAL_RN_PREAMBLE_LENGTH + SERIAL_RNS_LENGTH
NEXTU
wEnemyMon:: battle_struct wEnemyMon
wEnemyMonBaseStats:: ds NUM_EXP_STATS
wEnemyMonCatchRate:: db
wEnemyMonBaseExp:: db
wEnemyMonEnd::
ENDU
wBattleMode::
; 0: overworld

34
tools/dupeframes.py Executable file
View File

@ -0,0 +1,34 @@
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Usage: python dupeframes.py
Check for duplicate frames in Pokemon sprites (gfx/pokemon/*/front.png).
"""
import sys
import glob
import png
def check_duplicate_frames(filename):
with open(filename, 'rb') as file:
width, height, rows = png.Reader(file).asRGBA8()[:3]
rows = list(rows)
if height % width:
print(f'{filename} is not a vertical strip of square frames!', file=sys.stderr)
return
num_frames = height // width
frames = [rows[i*width:(i+1)*width] for i in range(num_frames)]
for i in range(num_frames):
for j in range(i + 1, num_frames):
if frames[i] == frames[j]:
print(f'{filename}: frame {j} is a duplicate of frame {i}', file=sys.stderr)
def main():
for filename in sorted(glob.glob('gfx/pokemon/*/front.png')):
check_duplicate_frames(filename)
if __name__ == '__main__':
main()

View File

@ -38,17 +38,25 @@ function register_bank(amount) {
printf "Bank %3d: %5d/16384 (%.2f%%)\n", bank_num, amount, amount * 100 / 16384
}
}
function register_bank_str(str) {
if (str ~ /\$[0-9A-F]+/) {
register_bank(strtonum("0x" substr(str, 2)))
} else {
printf "Malformed number? \"%s\" does not start with '$'\n", str
}
}
rom_bank && toupper($0) ~ /^[ \t]*EMPTY$/ {
# Empty bank
register_bank(16384)
}
rom_bank && toupper($0) ~ /^[ \t]*SLACK:[ \t]/ {
if ($2 ~ /\$[0-9A-F]+/) {
register_bank(strtonum("0x" substr($2, 2)))
} else {
printf "Malformed slack line? \"%s\" does not start with '$'\n", $2
}
# Old (rgbds <=0.6.0) end-of-bank free space
register_bank_str($2)
}
rom_bank && toupper($0) ~ /^[ \t]*TOTAL EMPTY:[ \t]/ {
# New (rgbds >=0.6.1) total free space
register_bank_str($3)
}
END {

View File

@ -3,6 +3,8 @@
#include "common.h"
#include <ctype.h>
void parse_args(int argc, char *argv[], bool *strict) {
struct option long_options[] = {
{"strict", no_argument, 0, 's'},
@ -40,31 +42,47 @@ void scan_file(const char *filename, bool strict) {
fclose(f);
contents[size] = '\0';
for (char *ptr = contents; ptr && ptr - contents < size; ptr++) {
bool is_incbin = false, is_include = false;
for (char *ptr = contents; ptr && ptr < contents + size; ptr++) {
ptr = strpbrk(ptr, ";\"Ii");
if (!ptr) {
break;
}
switch (*ptr) {
case ';':
ptr = strchr(ptr, '\n');
if (!ptr) {
fprintf(stderr, "%s: no newline at end of file\n", filename);
}
break;
case '"':
ptr++;
ptr = strchr(ptr, '"');
if (ptr) {
// Skip comments until the end of the line
ptr += strcspn(ptr + 1, "\r\n");
if (*ptr) {
ptr++;
} else {
fprintf(stderr, "%s: unterminated string\n", filename);
}
break;
case '"':
// Skip string literal until the closing quote
ptr += strcspn(ptr + 1, "\"");
if (*ptr) {
ptr++;
}
break;
case 'I':
case 'i':
is_incbin = !strncmp(ptr, "INCBIN", 6) || !strncmp(ptr, "incbin", 6);
is_include = !strncmp(ptr, "INCLUDE", 7) || !strncmp(ptr, "include", 7);
/* empty statement between the label and the variable declaration */;
// Check that an INCLUDE/INCBIN starts as its own token
char before = ptr > contents ? *(ptr - 1) : '\n';
if (!isspace((unsigned)before) && before != ':') {
break;
}
bool is_incbin = !strncmp(ptr, "INCBIN", 6) || !strncmp(ptr, "incbin", 6);
bool is_include = !strncmp(ptr, "INCLUDE", 7) || !strncmp(ptr, "include", 7);
if (is_incbin || is_include) {
ptr = strchr(ptr, '"');
if (ptr) {
// Check that an INCLUDE/INCBIN ends as its own token
ptr += is_include ? 7 : 6;
if (!isspace((unsigned)*ptr) && *ptr != '"') {
break;
}
ptr += strspn(ptr, " \t");
if (*ptr == '"') {
// Print the file path and recursively scan INCLUDEs
ptr++;
char *include_path = ptr;
size_t length = strcspn(ptr, "\"");
@ -74,6 +92,12 @@ void scan_file(const char *filename, bool strict) {
if (is_include) {
scan_file(include_path, strict);
}
} else {
fprintf(stderr, "%s: no file path after INC%s\n", filename, is_include ? "LUDE" : "BIN");
// Continue to process a comment
if (*ptr == ';') {
ptr--;
}
}
}
break;