mirror of
https://github.com/Ninjdai1/pokeemerald.git
synced 2024-12-26 03:34:15 +01:00
merge with be
This commit is contained in:
commit
1e22ae4cf2
8
.gitattributes
vendored
8
.gitattributes
vendored
@ -10,6 +10,14 @@ Makefile text eol=lf
|
||||
*.inc text eol=lf
|
||||
*.sha1 text eol=lf
|
||||
*.json text eol=lf
|
||||
*.sed text eol=lf
|
||||
*.cpp text eol=lf
|
||||
.gitattributes text eol=lf
|
||||
.gitignore text eol=lf
|
||||
*.hpp text eol=lf
|
||||
*.md text eol=lf
|
||||
*.ps1 text eol=crlf
|
||||
*.yml text eol=lf
|
||||
|
||||
*.png binary
|
||||
*.bin binary
|
||||
|
1
.gitignore
vendored
1
.gitignore
vendored
@ -33,3 +33,4 @@ porymap.project.cfg
|
||||
.vscode/
|
||||
*.a
|
||||
.fuse_hidden*
|
||||
*.sna
|
||||
|
38
Makefile
38
Makefile
@ -63,13 +63,13 @@ ASFLAGS := -mcpu=arm7tdmi --defsym MODERN=$(MODERN)
|
||||
|
||||
ifeq ($(MODERN),0)
|
||||
CC1 := tools/agbcc/bin/agbcc$(EXE)
|
||||
override CFLAGS += -mthumb-interwork -Wimplicit -Wparentheses -Werror -O2 -fhex-asm
|
||||
override CFLAGS += -mthumb-interwork -Wimplicit -Wparentheses -Werror -O2 -fhex-asm -g
|
||||
ROM := pokeemerald.gba
|
||||
OBJ_DIR := build/emerald
|
||||
LIBPATH := -L ../../tools/agbcc/lib
|
||||
else
|
||||
CC1 = $(shell $(CC) --print-prog-name=cc1) -quiet
|
||||
override CFLAGS += -mthumb -mthumb-interwork -O2 -mabi=apcs-gnu -mtune=arm7tdmi -march=armv4t -fno-toplevel-reorder -Wno-pointer-to-int-cast
|
||||
override CFLAGS += -mthumb -mthumb-interwork -O2 -mabi=apcs-gnu -mtune=arm7tdmi -march=armv4t -fno-toplevel-reorder -Wno-pointer-to-int-cast -g
|
||||
ROM := pokeemerald_modern.gba
|
||||
OBJ_DIR := build/modern
|
||||
LIBPATH := -L "$(dir $(shell $(CC) -mthumb -print-file-name=libgcc.a))" -L "$(dir $(shell $(CC) -mthumb -print-file-name=libc.a))"
|
||||
@ -136,6 +136,9 @@ C_ASM_OBJS := $(patsubst $(C_SUBDIR)/%.s,$(C_BUILDDIR)/%.o,$(C_ASM_SRCS))
|
||||
ASM_SRCS := $(wildcard $(ASM_SUBDIR)/*.s)
|
||||
ASM_OBJS := $(patsubst $(ASM_SUBDIR)/%.s,$(ASM_BUILDDIR)/%.o,$(ASM_SRCS))
|
||||
|
||||
# get all the data/*.s files EXCEPT the ones with specific rules
|
||||
REGULAR_DATA_ASM_SRCS := $(filter-out $(DATA_ASM_SUBDIR)/maps.s $(DATA_ASM_SUBDIR)/map_events.s, $(wildcard $(DATA_ASM_SUBDIR)/*.s))
|
||||
|
||||
DATA_ASM_SRCS := $(wildcard $(DATA_ASM_SUBDIR)/*.s)
|
||||
DATA_ASM_OBJS := $(patsubst $(DATA_ASM_SUBDIR)/%.s,$(DATA_ASM_BUILDDIR)/%.o,$(DATA_ASM_SRCS))
|
||||
|
||||
@ -275,23 +278,32 @@ endif
|
||||
$(C_BUILDDIR)/%.o: $(C_SUBDIR)/%.s $$(c_asm_dep)
|
||||
$(AS) $(ASFLAGS) -o $@ $<
|
||||
|
||||
ifeq ($(NODEP),1)
|
||||
$(ASM_BUILDDIR)/%.o: asm_dep :=
|
||||
else
|
||||
$(ASM_BUILDDIR)/%.o: asm_dep = $(shell $(SCANINC) -I "" $(ASM_SUBDIR)/$*.s)
|
||||
endif
|
||||
# The dep rules have to be explicit or else missing files won't be reported.
|
||||
# As a side effect, they're evaluated immediately instead of when the rule is invoked.
|
||||
# It doesn't look like $(shell) can be deferred so there might not be a better way.
|
||||
|
||||
$(ASM_BUILDDIR)/%.o: $(ASM_SUBDIR)/%.s $$(asm_dep)
|
||||
|
||||
ifeq ($(NODEP),1)
|
||||
$(ASM_BUILDDIR)/%.o: $(ASM_SUBDIR)/%.s
|
||||
$(AS) $(ASFLAGS) -o $@ $<
|
||||
|
||||
ifeq ($(NODEP),1)
|
||||
$(DATA_ASM_BUILDDIR)/%.o: data_dep :=
|
||||
else
|
||||
$(DATA_ASM_BUILDDIR)/%.o: data_dep = $(shell $(SCANINC) -I include -I "" $(DATA_ASM_SUBDIR)/$*.s)
|
||||
define ASM_DEP
|
||||
$1: $2 $$(shell $(SCANINC) -I include -I "" $2)
|
||||
$$(AS) $$(ASFLAGS) -o $$@ $$<
|
||||
endef
|
||||
$(foreach src, $(ASM_SRCS), $(eval $(call ASM_DEP,$(patsubst $(ASM_SUBDIR)/%.s,$(ASM_BUILDDIR)/%.o, $(src)),$(src))))
|
||||
endif
|
||||
|
||||
$(DATA_ASM_BUILDDIR)/%.o: $(DATA_ASM_SUBDIR)/%.s $$(data_dep)
|
||||
ifeq ($(NODEP),1)
|
||||
$(DATA_ASM_BUILDDIR)/%.o: $(DATA_ASM_SUBDIR)/%.s
|
||||
$(PREPROC) $< charmap.txt | $(CPP) -I include | $(AS) $(ASFLAGS) -o $@
|
||||
else
|
||||
define DATA_ASM_DEP
|
||||
$1: $2 $$(shell $(SCANINC) -I include -I "" $2)
|
||||
$$(PREPROC) $$< charmap.txt | $$(CPP) -I include | $$(AS) $$(ASFLAGS) -o $$@
|
||||
endef
|
||||
$(foreach src, $(REGULAR_DATA_ASM_SRCS), $(eval $(call DATA_ASM_DEP,$(patsubst $(DATA_ASM_SUBDIR)/%.s,$(DATA_ASM_BUILDDIR)/%.o, $(src)),$(src))))
|
||||
endif
|
||||
|
||||
$(SONG_BUILDDIR)/%.o: $(SONG_SUBDIR)/%.s
|
||||
$(AS) $(ASFLAGS) -I sound -o $@ $<
|
||||
|
@ -72,9 +72,9 @@
|
||||
special CallBattleTowerFunc
|
||||
.endm
|
||||
|
||||
@ Unknown. Destroys some link task if using wireless link. Wait for link?
|
||||
.macro tower_unklink
|
||||
setvar VAR_0x8004, BATTLE_TOWER_FUNC_13
|
||||
@ Attempts to close link connection. Used when finishing a link multi challenge.
|
||||
.macro tower_closelink
|
||||
setvar VAR_0x8004, BATTLE_TOWER_FUNC_TRY_CLOSE_LINK
|
||||
special CallBattleTowerFunc
|
||||
.endm
|
||||
|
||||
|
@ -1,7 +1,11 @@
|
||||
#!/bin/bash
|
||||
|
||||
OBJDUMP="$DEVKITARM/bin/arm-none-eabi-objdump -D -bbinary -marmv4t -Mforce-thumb"
|
||||
OPTIONS="--start-address=$(($1)) --stop-address=$(($1 + $2))"
|
||||
if [ $(($1)) -ge $((0x8000000)) ]; then
|
||||
OPTIONS="--adjust-vma=0x8000000 --start-address=$(($1)) --stop-address=$(($1 + $2))"
|
||||
else
|
||||
OPTIONS="--start-address=$(($1)) --stop-address=$(($1 + $2))"
|
||||
fi
|
||||
$OBJDUMP $OPTIONS baserom.gba > baserom.dump
|
||||
$OBJDUMP $OPTIONS pokeemerald.gba > pokeemerald.dump
|
||||
diff -u baserom.dump pokeemerald.dump
|
||||
|
@ -79,23 +79,16 @@ struct CoordEvent
|
||||
|
||||
struct BgEvent
|
||||
{
|
||||
/*0x00*/u16 x;
|
||||
/*0x02*/u16 y;
|
||||
/*0x04*/u8 elevation;
|
||||
/*0x05*/u8 kind;
|
||||
/*0x08*/union { // carried over from diego's FR/LG work, seems to be the same struct
|
||||
// in gen 3, "kind" (0x3 in BgEvent struct) determines the method to read the union.
|
||||
u16 x, y;
|
||||
u8 elevation;
|
||||
u8 kind; // The "kind" field determines how to access bgUnion union below.
|
||||
union {
|
||||
u8 *script;
|
||||
|
||||
// hidden item type
|
||||
struct {
|
||||
u16 item;
|
||||
u16 hiddenItemId; // flag offset to determine flag lookup
|
||||
u16 hiddenItemId;
|
||||
} hiddenItem;
|
||||
|
||||
// secret base type
|
||||
u32 secretBaseId;
|
||||
|
||||
} bgUnion;
|
||||
};
|
||||
|
||||
|
@ -2,11 +2,41 @@
|
||||
|
||||
.equiv PCM_DMA_BUF_SIZE, 1584
|
||||
|
||||
.equiv C_V, 0x40
|
||||
|
||||
.equiv TONEDATA_TYPE_CGB, 0x07
|
||||
.equiv TONEDATA_TYPE_FIX, 0x08
|
||||
.equiv TONEDATA_TYPE_REV, 0x10
|
||||
.equiv TONEDATA_TYPE_CMP, 0x20
|
||||
.equiv TONEDATA_TYPE_SPL, 0x40 @ key split
|
||||
.equiv TONEDATA_TYPE_RHY, 0x80 @ rhythm
|
||||
|
||||
.equiv TONEDATA_P_S_PAN, 0xc0
|
||||
|
||||
.equiv SOUND_CHANNEL_SF_START, 0x80
|
||||
.equiv SOUND_CHANNEL_SF_STOP, 0x40
|
||||
.equiv SOUND_CHANNEL_SF_SPECIAL, 0x20
|
||||
.equiv SOUND_CHANNEL_SF_LOOP, 0x10
|
||||
.equiv SOUND_CHANNEL_SF_IEC, 0x04
|
||||
.equiv SOUND_CHANNEL_SF_ENV, 0x03
|
||||
.equiv SOUND_CHANNEL_SF_ENV_ATTACK, 0x03
|
||||
.equiv SOUND_CHANNEL_SF_ENV_DECAY, 0x02
|
||||
.equiv SOUND_CHANNEL_SF_ENV_SUSTAIN, 0x01
|
||||
.equiv SOUND_CHANNEL_SF_ENV_RELEASE, 0x00
|
||||
.equiv SOUND_CHANNEL_SF_ON, (SOUND_CHANNEL_SF_START | SOUND_CHANNEL_SF_STOP | SOUND_CHANNEL_SF_IEC | SOUND_CHANNEL_SF_ENV)
|
||||
|
||||
.equiv CGB_CHANNEL_MO_PIT, 0x02
|
||||
.equiv CGB_CHANNEL_MO_VOL, 0x01
|
||||
|
||||
.equiv WAVE_DATA_FLAG_LOOP, 0xC0
|
||||
|
||||
.equiv MPT_FLG_VOLSET, 0x01
|
||||
.equiv MPT_FLG_VOLCHG, 0x03
|
||||
.equiv MPT_FLG_PITSET, 0x04
|
||||
.equiv MPT_FLG_PITCHG, 0x0C
|
||||
.equiv MPT_FLG_START, 0x40
|
||||
.equiv MPT_FLG_EXIST, 0x80
|
||||
|
||||
.macro struct_begin
|
||||
.struct 0
|
||||
.endm
|
||||
@ -16,6 +46,28 @@
|
||||
.struct \name + \size
|
||||
.endm
|
||||
|
||||
struct_begin
|
||||
struct_field o_WaveData_type, 2
|
||||
struct_field o_WaveData_d1, 1
|
||||
struct_field o_WaveData_flags, 1
|
||||
struct_field o_WaveData_freq, 4
|
||||
struct_field o_WaveData_loopStart, 4
|
||||
struct_field o_WaveData_size, 4
|
||||
struct_field o_WaveData_data, 0
|
||||
struct_field WaveData_size, 0
|
||||
|
||||
struct_begin
|
||||
struct_field o_ToneData_type, 1
|
||||
struct_field o_ToneData_key, 1
|
||||
struct_field o_ToneData_length, 1
|
||||
struct_field o_ToneData_pan_sweep, 1
|
||||
struct_field o_ToneData_wav, 4
|
||||
struct_field o_ToneData_attack, 1
|
||||
struct_field o_ToneData_decay, 1
|
||||
struct_field o_ToneData_sustain, 1
|
||||
struct_field o_ToneData_release, 1
|
||||
struct_field ToneData_size, 0
|
||||
|
||||
struct_begin
|
||||
struct_field o_SoundInfo_ident, 4
|
||||
struct_field o_SoundInfo_pcmDmaCounter, 1
|
||||
@ -32,8 +84,8 @@
|
||||
struct_field o_SoundInfo_pcmFreq, 4
|
||||
struct_field o_SoundInfo_divFreq, 4
|
||||
struct_field o_SoundInfo_cgbChans, 4
|
||||
struct_field o_SoundInfo_func, 4
|
||||
struct_field o_SoundInfo_intp, 4
|
||||
struct_field o_SoundInfo_MPlayMainHead, 4
|
||||
struct_field o_SoundInfo_musicPlayerHead, 4
|
||||
struct_field o_SoundInfo_CgbSound, 4
|
||||
struct_field o_SoundInfo_CgbOscOff, 4
|
||||
struct_field o_SoundInfo_MidiKeyToCgbFreq, 4
|
||||
@ -46,7 +98,7 @@
|
||||
struct_field SoundInfo_size, 0
|
||||
|
||||
struct_begin
|
||||
struct_field o_SoundChannel_status, 1
|
||||
struct_field o_SoundChannel_statusFlags, 1
|
||||
struct_field o_SoundChannel_type, 1
|
||||
struct_field o_SoundChannel_rightVolume, 1
|
||||
struct_field o_SoundChannel_leftVolume, 1
|
||||
@ -54,29 +106,29 @@
|
||||
struct_field o_SoundChannel_decay, 1
|
||||
struct_field o_SoundChannel_sustain, 1
|
||||
struct_field o_SoundChannel_release, 1
|
||||
struct_field o_SoundChannel_ky, 1
|
||||
struct_field o_SoundChannel_ev, 1
|
||||
struct_field o_SoundChannel_er, 1
|
||||
struct_field o_SoundChannel_el, 1
|
||||
struct_field o_SoundChannel_iev, 1
|
||||
struct_field o_SoundChannel_iel, 1
|
||||
struct_field o_SoundChannel_d1, 1
|
||||
struct_field o_SoundChannel_d2, 1
|
||||
struct_field o_SoundChannel_gt, 1
|
||||
struct_field o_SoundChannel_mk, 1
|
||||
struct_field o_SoundChannel_ve, 1
|
||||
struct_field o_SoundChannel_pr, 1
|
||||
struct_field o_SoundChannel_rp, 1
|
||||
struct_field o_SoundChannel_d3, 3
|
||||
struct_field o_SoundChannel_ct, 4
|
||||
struct_field o_SoundChannel_key, 1
|
||||
struct_field o_SoundChannel_envelopeVolume, 1
|
||||
struct_field o_SoundChannel_envelopeVolumeRight, 1
|
||||
struct_field o_SoundChannel_envelopeVolumeLeft, 1
|
||||
struct_field o_SoundChannel_pseudoEchoVolume, 1
|
||||
struct_field o_SoundChannel_pseudoEchoLength, 1
|
||||
struct_field o_SoundChannel_dummy1, 1
|
||||
struct_field o_SoundChannel_dummy2, 1
|
||||
struct_field o_SoundChannel_gateTime, 1
|
||||
struct_field o_SoundChannel_midiKey, 1
|
||||
struct_field o_SoundChannel_velocity, 1
|
||||
struct_field o_SoundChannel_priority, 1
|
||||
struct_field o_SoundChannel_rhythmPan, 1
|
||||
struct_field o_SoundChannel_dummy3, 3
|
||||
struct_field o_SoundChannel_count, 4
|
||||
struct_field o_SoundChannel_fw, 4
|
||||
struct_field o_SoundChannel_freq, 4
|
||||
struct_field o_SoundChannel_frequency, 4
|
||||
struct_field o_SoundChannel_wav, 4
|
||||
struct_field o_SoundChannel_cp, 4
|
||||
struct_field o_SoundChannel_currentPointer, 4
|
||||
struct_field o_SoundChannel_track, 4
|
||||
struct_field o_SoundChannel_pp, 4
|
||||
struct_field o_SoundChannel_np, 4
|
||||
struct_field o_SoundChannel_d4, 4
|
||||
struct_field o_SoundChannel_prevChannelPointer, 4
|
||||
struct_field o_SoundChannel_nextChannelPointer, 4
|
||||
struct_field o_SoundChannel_dummy4, 4
|
||||
struct_field o_SoundChannel_xpi, 2
|
||||
struct_field o_SoundChannel_xpc, 2
|
||||
struct_field SoundChannel_size, 0
|
||||
@ -112,8 +164,8 @@
|
||||
struct_field o_MusicPlayerTrack_lfoDelay, 1
|
||||
struct_field o_MusicPlayerTrack_lfoDelayC, 1
|
||||
struct_field o_MusicPlayerTrack_priority, 1
|
||||
struct_field o_MusicPlayerTrack_echoVolume, 1
|
||||
struct_field o_MusicPlayerTrack_echoLength, 1
|
||||
struct_field o_MusicPlayerTrack_pseudoEchoVolume, 1
|
||||
struct_field o_MusicPlayerTrack_pseudoEchoLength, 1
|
||||
struct_field o_MusicPlayerTrack_chan, 4
|
||||
struct_field o_MusicPlayerTrack_ToneData_type, 1
|
||||
struct_field o_MusicPlayerTrack_ToneData_key, 1
|
||||
@ -159,41 +211,41 @@
|
||||
struct_field MusicPlayerInfo_size, 0
|
||||
|
||||
struct_begin
|
||||
struct_field o_CgbChannel_sf, 1
|
||||
struct_field o_CgbChannel_ty, 1
|
||||
struct_field o_CgbChannel_statusFlags, 1
|
||||
struct_field o_CgbChannel_type, 1
|
||||
struct_field o_CgbChannel_rightVolume, 1
|
||||
struct_field o_CgbChannel_leftVolume, 1
|
||||
struct_field o_CgbChannel_at, 1
|
||||
struct_field o_CgbChannel_de, 1
|
||||
struct_field o_CgbChannel_su, 1
|
||||
struct_field o_CgbChannel_re, 1
|
||||
struct_field o_CgbChannel_ky, 1
|
||||
struct_field o_CgbChannel_ev, 1
|
||||
struct_field o_CgbChannel_eg, 1
|
||||
struct_field o_CgbChannel_ec, 1
|
||||
struct_field o_CgbChannel_echoVolume, 1
|
||||
struct_field o_CgbChannel_echoLength, 1
|
||||
struct_field o_CgbChannel_d1, 1
|
||||
struct_field o_CgbChannel_d2, 1
|
||||
struct_field o_CgbChannel_gt, 1
|
||||
struct_field o_CgbChannel_mk, 1
|
||||
struct_field o_CgbChannel_ve, 1
|
||||
struct_field o_CgbChannel_pr, 1
|
||||
struct_field o_CgbChannel_rp, 1
|
||||
struct_field o_CgbChannel_d3, 3
|
||||
struct_field o_CgbChannel_d5, 1
|
||||
struct_field o_CgbChannel_sg, 1
|
||||
struct_field o_CgbChannel_attack, 1
|
||||
struct_field o_CgbChannel_decay, 1
|
||||
struct_field o_CgbChannel_sustain, 1
|
||||
struct_field o_CgbChannel_release, 1
|
||||
struct_field o_CgbChannel_key, 1
|
||||
struct_field o_CgbChannel_envelopeVolume, 1
|
||||
struct_field o_CgbChannel_envelopeGoal, 1
|
||||
struct_field o_CgbChannel_envelopeCounter, 1
|
||||
struct_field o_CgbChannel_pseudoEchoVolume, 1
|
||||
struct_field o_CgbChannel_pseudoEchoLength, 1
|
||||
struct_field o_CgbChannel_dummy1, 1
|
||||
struct_field o_CgbChannel_dummy2, 1
|
||||
struct_field o_CgbChannel_gateTime, 1
|
||||
struct_field o_CgbChannel_midiKey, 1
|
||||
struct_field o_CgbChannel_velocity, 1
|
||||
struct_field o_CgbChannel_priority, 1
|
||||
struct_field o_CgbChannel_rhythmPan, 1
|
||||
struct_field o_CgbChannel_dummy3, 3
|
||||
struct_field o_CgbChannel_dummy5, 1
|
||||
struct_field o_CgbChannel_sustainGoal, 1
|
||||
struct_field o_CgbChannel_n4, 1
|
||||
struct_field o_CgbChannel_pan, 1
|
||||
struct_field o_CgbChannel_panMask, 1
|
||||
struct_field o_CgbChannel_mo, 1
|
||||
struct_field o_CgbChannel_le, 1
|
||||
struct_field o_CgbChannel_sw, 1
|
||||
struct_field o_CgbChannel_fr, 4
|
||||
struct_field o_CgbChannel_wp, 4
|
||||
struct_field o_CgbChannel_cp, 4
|
||||
struct_field o_CgbChannel_tp, 4
|
||||
struct_field o_CgbChannel_pp, 4
|
||||
struct_field o_CgbChannel_np, 4
|
||||
struct_field o_CgbChannel_d4, 8
|
||||
struct_field o_CgbChannel_modify, 1
|
||||
struct_field o_CgbChannel_length, 1
|
||||
struct_field o_CgbChannel_sweep, 1
|
||||
struct_field o_CgbChannel_frequency, 4
|
||||
struct_field o_CgbChannel_wavePointer, 4
|
||||
struct_field o_CgbChannel_currentPointer, 4
|
||||
struct_field o_CgbChannel_track, 4
|
||||
struct_field o_CgbChannel_prevChannelPointer, 4
|
||||
struct_field o_CgbChannel_nextChannelPointer, 4
|
||||
struct_field o_CgbChannel_dummy4, 8
|
||||
struct_field CgbChannel_size, 0
|
||||
|
@ -2805,6 +2805,10 @@ BattleScript_EffectDoubleHit::
|
||||
BattleScript_EffectRecoilIfMiss::
|
||||
attackcanceler
|
||||
accuracycheck BattleScript_MoveMissedDoDamage, ACC_CURR_MOVE
|
||||
.if B_CRASH_IF_TARGET_IMMUNE >= GEN_4
|
||||
typecalc
|
||||
jumpifbyte CMP_COMMON_BITS, gMoveResultFlags, MOVE_RESULT_DOESNT_AFFECT_FOE, BattleScript_MoveMissedDoDamage
|
||||
.endif
|
||||
goto BattleScript_HitFromAtkString
|
||||
BattleScript_MoveMissedDoDamage::
|
||||
jumpifability BS_ATTACKER, ABILITY_MAGIC_GUARD, BattleScript_PrintMoveMissed
|
||||
@ -2813,19 +2817,33 @@ BattleScript_MoveMissedDoDamage::
|
||||
pause 0x40
|
||||
resultmessage
|
||||
waitmessage 0x40
|
||||
.if B_CRASH_IF_TARGET_IMMUNE < GEN_4
|
||||
jumpifbyte CMP_COMMON_BITS, gMoveResultFlags, MOVE_RESULT_DOESNT_AFFECT_FOE, BattleScript_MoveEnd
|
||||
.endif
|
||||
printstring STRINGID_PKMNCRASHED
|
||||
waitmessage 0x40
|
||||
damagecalc
|
||||
typecalc
|
||||
adjustdamage
|
||||
.if B_CRASH_IF_TARGET_IMMUNE == GEN_4
|
||||
manipulatedamage DMG_RECOIL_FROM_IMMUNE
|
||||
.else
|
||||
manipulatedamage DMG_RECOIL_FROM_MISS
|
||||
.endif
|
||||
.if B_CRASH_IF_TARGET_IMMUNE >= GEN_4
|
||||
bichalfword gMoveResultFlags, MOVE_RESULT_MISSED | MOVE_RESULT_DOESNT_AFFECT_FOE
|
||||
.else
|
||||
bichalfword gMoveResultFlags, MOVE_RESULT_MISSED
|
||||
.endif
|
||||
orword gHitMarker, HITMARKER_IGNORE_SUBSTITUTE
|
||||
healthbarupdate BS_ATTACKER
|
||||
datahpupdate BS_ATTACKER
|
||||
tryfaintmon BS_ATTACKER, FALSE, NULL
|
||||
.if B_CRASH_IF_TARGET_IMMUNE >= GEN_4
|
||||
orhalfword gMoveResultFlags, MOVE_RESULT_MISSED | MOVE_RESULT_DOESNT_AFFECT_FOE
|
||||
.else
|
||||
orhalfword gMoveResultFlags, MOVE_RESULT_MISSED
|
||||
.endif
|
||||
goto BattleScript_MoveEnd
|
||||
|
||||
BattleScript_EffectMist::
|
||||
@ -5736,6 +5754,13 @@ BattleScript_PerishSongTakesLife::
|
||||
tryfaintmon BS_ATTACKER, FALSE, NULL
|
||||
end2
|
||||
|
||||
BattleScript_PerishBodyActivates::
|
||||
call BattleScript_AbilityPopUp
|
||||
printstring STRINGID_PKMNSWILLPERISHIN3TURNS
|
||||
waitmessage 0x40
|
||||
orword gHitMarker, HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_x100000
|
||||
return
|
||||
|
||||
BattleScript_PerishSongCountGoesDown::
|
||||
printstring STRINGID_PKMNPERISHCOUNTFELL
|
||||
waitmessage 0x40
|
||||
@ -6168,6 +6193,12 @@ BattleScript_AttackerFormChangeEnd3::
|
||||
call BattleScript_AttackerFormChange
|
||||
end3
|
||||
|
||||
BattleScript_BallFetch::
|
||||
call BattleScript_AbilityPopUp
|
||||
printstring STRINGID_FETCHEDPOKEBALL
|
||||
waitmessage 0x40
|
||||
end3
|
||||
|
||||
BattleScript_TargetFormChange::
|
||||
pause 0x5
|
||||
copybyte gBattlerAbility, gBattlerTarget
|
||||
@ -6192,6 +6223,32 @@ BattleScript_IllusionOff::
|
||||
waitmessage 0x40
|
||||
return
|
||||
|
||||
BattleScript_CottonDownActivates::
|
||||
setbyte sFIXED_ABILITY_POPUP, TRUE
|
||||
call BattleScript_AbilityPopUp
|
||||
copybyte gEffectBattler, gBattlerTarget
|
||||
savetarget
|
||||
setbyte gBattlerTarget, 0x0
|
||||
BattleScript_CottonDownLoop:
|
||||
setstatchanger STAT_SPEED, 1, TRUE
|
||||
jumpifbyteequal gBattlerTarget, gEffectBattler, BattleScript_CottonDownLoopIncrement
|
||||
statbuffchange STAT_BUFF_NOT_PROTECT_AFFECTED, BattleScript_CottonDownTargetSpeedCantGoLower
|
||||
setgraphicalstatchangevalues
|
||||
playanimation BS_TARGET, B_ANIM_STATS_CHANGE, sB_ANIM_ARG1
|
||||
printfromtable gStatDownStringIds
|
||||
waitmessage 0x40
|
||||
goto BattleScript_CottonDownLoopIncrement
|
||||
BattleScript_CottonDownTargetSpeedCantGoLower:
|
||||
printstring STRINGID_STATSWONTDECREASE
|
||||
waitmessage 0x40
|
||||
BattleScript_CottonDownLoopIncrement:
|
||||
addbyte gBattlerTarget, 0x1
|
||||
jumpifbytenotequal gBattlerTarget, gBattlersCount, BattleScript_CottonDownLoop
|
||||
BattleScript_CottonDownReturn:
|
||||
restoretarget
|
||||
destroyabilitypopup
|
||||
return
|
||||
|
||||
BattleScript_AnticipationActivates::
|
||||
pause 0x5
|
||||
call BattleScript_AbilityPopUp
|
||||
@ -6711,6 +6768,15 @@ BattleScript_SandstreamActivates::
|
||||
call BattleScript_WeatherFormChanges
|
||||
end3
|
||||
|
||||
BattleScript_SandSpitActivates::
|
||||
pause 0x20
|
||||
call BattleScript_AbilityPopUp
|
||||
printstring STRINGID_ASANDSTORMKICKEDUP
|
||||
waitstate
|
||||
playanimation BS_BATTLER_0, B_ANIM_SANDSTORM_CONTINUES, NULL
|
||||
call BattleScript_WeatherFormChanges
|
||||
return
|
||||
|
||||
BattleScript_ShedSkinActivates::
|
||||
call BattleScript_AbilityPopUp
|
||||
printstring STRINGID_PKMNSXCUREDYPROBLEM
|
||||
@ -7076,22 +7142,33 @@ BattleScript_MummyActivates::
|
||||
waitmessage 0x40
|
||||
return
|
||||
|
||||
BattleScript_AngryPointActivates::
|
||||
BattleScript_TargetsStatWasMaxedOut::
|
||||
call BattleScript_AbilityPopUp
|
||||
statbuffchange STAT_BUFF_NOT_PROTECT_AFFECTED | MOVE_EFFECT_CERTAIN, NULL
|
||||
setgraphicalstatchangevalues
|
||||
playanimation BS_TARGET, B_ANIM_STATS_CHANGE, sB_ANIM_ARG1
|
||||
printstring STRINGID_ANGRYPOINTACTIVATES
|
||||
printstring STRINGID_TARGETSSTATWASMAXEDOUT
|
||||
waitmessage 0x40
|
||||
return
|
||||
|
||||
BattleScript_TargetAbilityStatRaise::
|
||||
BattleScript_BattlerAbilityStatRaiseOnSwitchIn::
|
||||
copybyte gBattlerAbility, gBattlerAttacker
|
||||
call BattleScript_AbilityPopUp
|
||||
statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_BUFF_NOT_PROTECT_AFFECTED | MOVE_EFFECT_CERTAIN, NULL
|
||||
setgraphicalstatchangevalues
|
||||
playanimation BS_ATTACKER, B_ANIM_STATS_CHANGE, sB_ANIM_ARG1
|
||||
waitanimation
|
||||
printstring STRINGID_BATTLERABILITYRAISEDSTAT
|
||||
waitmessage 0x40
|
||||
end3
|
||||
|
||||
BattleScript_TargetAbilityStatRaiseOnMoveEnd::
|
||||
call BattleScript_AbilityPopUp
|
||||
statbuffchange STAT_BUFF_NOT_PROTECT_AFFECTED | MOVE_EFFECT_CERTAIN, NULL
|
||||
setgraphicalstatchangevalues
|
||||
playanimation BS_TARGET, B_ANIM_STATS_CHANGE, sB_ANIM_ARG1
|
||||
waitanimation
|
||||
printstring STRINGID_TARGETABILITYSTATRAISE
|
||||
printstring STRINGID_ABILITYRAISEDSTATDRASTICALLY
|
||||
waitmessage 0x40
|
||||
return
|
||||
|
||||
|
@ -443,7 +443,7 @@ BattleFrontier_BattleTowerBattleRoom_EventScript_WarpToLobbyMultis:: @ 82421F2
|
||||
end
|
||||
|
||||
BattleFrontier_BattleTowerBattleRoom_EventScript_WarpToLobbyLinkMultis:: @ 82421FC
|
||||
tower_unklink
|
||||
tower_closelink
|
||||
warp MAP_BATTLE_FRONTIER_BATTLE_TOWER_LOBBY, 255, 18, 6
|
||||
waitstate
|
||||
end
|
||||
|
@ -104,7 +104,7 @@
|
||||
"flag": "0"
|
||||
},
|
||||
{
|
||||
"graphics_id": "OBJ_EVENT_GFX_KECLEON_1",
|
||||
"graphics_id": "OBJ_EVENT_GFX_KECLEON",
|
||||
"x": 25,
|
||||
"y": 8,
|
||||
"elevation": 3,
|
||||
|
@ -28,7 +28,7 @@
|
||||
"flag": "0"
|
||||
},
|
||||
{
|
||||
"graphics_id": "OBJ_EVENT_GFX_KECLEON_1",
|
||||
"graphics_id": "OBJ_EVENT_GFX_KECLEON",
|
||||
"x": 4,
|
||||
"y": 4,
|
||||
"elevation": 3,
|
||||
|
@ -247,7 +247,11 @@ MossdeepCity_SpaceCenter_1F_EventScript_Grunt2:: @ 822321F
|
||||
copyobjectxytoperm LOCALID_STAIR_GRUNT
|
||||
switch VAR_FACING
|
||||
case DIR_WEST, MossdeepCity_SpaceCenter_1F_EventScript_MoveGruntFromStairsWest
|
||||
case DIR_WEST, MossdeepCity_SpaceCenter_1F_EventScript_MoveGruntFromStairsEast @ BUG: This was meant to be case DIR_EAST
|
||||
#ifdef BUGFIX
|
||||
case DIR_EAST, MossdeepCity_SpaceCenter_1F_EventScript_MoveGruntFromStairsEast
|
||||
#else
|
||||
case DIR_WEST, MossdeepCity_SpaceCenter_1F_EventScript_MoveGruntFromStairsEast
|
||||
#endif
|
||||
applymovement LOCALID_STAIR_GRUNT, MossdeepCity_SpaceCenter_1F_Movement_MoveGruntFromStairs
|
||||
waitmovement 0
|
||||
setvar VAR_MOSSDEEP_SPACE_CENTER_STAIR_GUARD_STATE, 2
|
||||
|
@ -78,7 +78,7 @@
|
||||
"flag": "0"
|
||||
},
|
||||
{
|
||||
"graphics_id": "OBJ_EVENT_GFX_KECLEON_1",
|
||||
"graphics_id": "OBJ_EVENT_GFX_KECLEON",
|
||||
"x": 39,
|
||||
"y": 4,
|
||||
"elevation": 3,
|
||||
|
@ -468,7 +468,7 @@
|
||||
"flag": "0"
|
||||
},
|
||||
{
|
||||
"graphics_id": "OBJ_EVENT_GFX_KECLEON_1",
|
||||
"graphics_id": "OBJ_EVENT_GFX_KECLEON",
|
||||
"x": 31,
|
||||
"y": 6,
|
||||
"elevation": 3,
|
||||
@ -481,7 +481,7 @@
|
||||
"flag": "FLAG_HIDE_ROUTE_119_KECLEON_1"
|
||||
},
|
||||
{
|
||||
"graphics_id": "OBJ_EVENT_GFX_KECLEON_1",
|
||||
"graphics_id": "OBJ_EVENT_GFX_KECLEON",
|
||||
"x": 25,
|
||||
"y": 15,
|
||||
"elevation": 3,
|
||||
|
@ -403,7 +403,7 @@
|
||||
"flag": "FLAG_ITEM_ROUTE_120_HYPER_POTION"
|
||||
},
|
||||
{
|
||||
"graphics_id": "OBJ_EVENT_GFX_KECLEON_1",
|
||||
"graphics_id": "OBJ_EVENT_GFX_KECLEON",
|
||||
"x": 12,
|
||||
"y": 16,
|
||||
"elevation": 4,
|
||||
@ -412,8 +412,8 @@
|
||||
"movement_range_y": 1,
|
||||
"trainer_type": "TRAINER_TYPE_NONE",
|
||||
"trainer_sight_or_berry_tree_id": "0",
|
||||
"script": "Route120_EventScript_InvisibleBridgeKecleon",
|
||||
"flag": "FLAG_HIDE_ROUTE_120_KECLEON_BRIDGE_INVISIBLE"
|
||||
"script": "Route120_EventScript_BridgeKecleon",
|
||||
"flag": "FLAG_HIDE_ROUTE_120_KECLEON_BRIDGE"
|
||||
},
|
||||
{
|
||||
"graphics_id": "OBJ_EVENT_GFX_STEVEN",
|
||||
@ -481,7 +481,7 @@
|
||||
"flag": "0"
|
||||
},
|
||||
{
|
||||
"graphics_id": "OBJ_EVENT_GFX_KECLEON_2",
|
||||
"graphics_id": "OBJ_EVENT_GFX_KECLEON_BRIDGE_SHADOW",
|
||||
"x": 12,
|
||||
"y": 16,
|
||||
"elevation": 3,
|
||||
@ -491,10 +491,10 @@
|
||||
"trainer_type": "TRAINER_TYPE_NONE",
|
||||
"trainer_sight_or_berry_tree_id": "0",
|
||||
"script": "0x0",
|
||||
"flag": "FLAG_HIDE_ROUTE_120_KECLEON_BRIDGE_VISIBLE"
|
||||
"flag": "FLAG_HIDE_ROUTE_120_KECLEON_BRIDGE_SHADOW"
|
||||
},
|
||||
{
|
||||
"graphics_id": "OBJ_EVENT_GFX_KECLEON_1",
|
||||
"graphics_id": "OBJ_EVENT_GFX_KECLEON",
|
||||
"x": 20,
|
||||
"y": 11,
|
||||
"elevation": 3,
|
||||
@ -507,7 +507,7 @@
|
||||
"flag": "FLAG_HIDE_ROUTE_120_KECLEON_1"
|
||||
},
|
||||
{
|
||||
"graphics_id": "OBJ_EVENT_GFX_KECLEON_1",
|
||||
"graphics_id": "OBJ_EVENT_GFX_KECLEON",
|
||||
"x": 27,
|
||||
"y": 2,
|
||||
"elevation": 3,
|
||||
@ -520,7 +520,7 @@
|
||||
"flag": "FLAG_HIDE_ROUTE_120_KECLEON_2"
|
||||
},
|
||||
{
|
||||
"graphics_id": "OBJ_EVENT_GFX_KECLEON_1",
|
||||
"graphics_id": "OBJ_EVENT_GFX_KECLEON",
|
||||
"x": 4,
|
||||
"y": 77,
|
||||
"elevation": 3,
|
||||
@ -533,7 +533,7 @@
|
||||
"flag": "FLAG_HIDE_ROUTE_120_KECLEON_3"
|
||||
},
|
||||
{
|
||||
"graphics_id": "OBJ_EVENT_GFX_KECLEON_1",
|
||||
"graphics_id": "OBJ_EVENT_GFX_KECLEON",
|
||||
"x": 7,
|
||||
"y": 51,
|
||||
"elevation": 3,
|
||||
@ -546,7 +546,7 @@
|
||||
"flag": "FLAG_HIDE_ROUTE_120_KECLEON_5"
|
||||
},
|
||||
{
|
||||
"graphics_id": "OBJ_EVENT_GFX_KECLEON_1",
|
||||
"graphics_id": "OBJ_EVENT_GFX_KECLEON",
|
||||
"x": 19,
|
||||
"y": 48,
|
||||
"elevation": 3,
|
||||
|
@ -1,6 +1,6 @@
|
||||
.set LOCALID_INVISIBLE_BRIDGE_KECLEON, 30
|
||||
.set LOCALID_BRIDGE_KECLEON, 30
|
||||
.set LOCALID_STEVEN, 31
|
||||
.set LOCALID_VISIBLE_BRIDGE_KECLEON, 36
|
||||
.set LOCALID_BRIDGE_KECLEON_SHADOW, 36 @ They use a second object which is identical to Kecleon but has a reflection palette tag for the bridge shadow
|
||||
|
||||
Route120_MapScripts:: @ 81F53EC
|
||||
map_script MAP_SCRIPT_ON_RESUME, Route120_OnResume
|
||||
@ -31,8 +31,8 @@ Route120_EventScript_RemoveBridgeKecleon:: @ 81F5449
|
||||
specialvar VAR_RESULT, GetBattleOutcome
|
||||
compare VAR_RESULT, B_OUTCOME_CAUGHT
|
||||
goto_if_ne Common_EventScript_NopReturn
|
||||
removeobject LOCALID_INVISIBLE_BRIDGE_KECLEON
|
||||
removeobject LOCALID_VISIBLE_BRIDGE_KECLEON
|
||||
removeobject LOCALID_BRIDGE_KECLEON
|
||||
removeobject LOCALID_BRIDGE_KECLEON_SHADOW
|
||||
return
|
||||
|
||||
Route120_EventScript_RemoveKecleon:: @ 81F5460
|
||||
@ -61,7 +61,7 @@ Route120_EventScript_SetBridgeClearMetatiles:: @ 81F54A3
|
||||
return
|
||||
|
||||
Route120_EventScript_SetBridgeKecleonMovement:: @ 81F54C8
|
||||
setobjectmovementtype LOCALID_VISIBLE_BRIDGE_KECLEON, MOVEMENT_TYPE_FACE_RIGHT
|
||||
setobjectmovementtype LOCALID_BRIDGE_KECLEON_SHADOW, MOVEMENT_TYPE_FACE_RIGHT
|
||||
return
|
||||
|
||||
Route120_OnTransition: @ 81F54CD
|
||||
@ -205,9 +205,9 @@ Route120_EventScript_StevenBattleKecleon:: @ 81F568B
|
||||
delay 20
|
||||
msgbox Route120_Text_StevenUsedDevonScope, MSGBOX_DEFAULT
|
||||
closemessage
|
||||
applymovement LOCALID_INVISIBLE_BRIDGE_KECLEON, Common_Movement_WalkInPlaceFastestRight
|
||||
applymovement LOCALID_BRIDGE_KECLEON, Common_Movement_WalkInPlaceFastestRight
|
||||
waitmovement 0
|
||||
applymovement LOCALID_INVISIBLE_BRIDGE_KECLEON, Movement_KecleonAppears
|
||||
applymovement LOCALID_BRIDGE_KECLEON, Movement_KecleonAppears
|
||||
waitmovement 0
|
||||
waitse
|
||||
playmoncry SPECIES_KECLEON, 2
|
||||
@ -230,8 +230,8 @@ Route120_EventScript_StevenBattleKecleon:: @ 81F568B
|
||||
|
||||
Route120_EventScript_RemoveBridgeKecleonPostBattle:: @ 81F571C
|
||||
fadescreenswapbuffers FADE_TO_BLACK
|
||||
removeobject LOCALID_INVISIBLE_BRIDGE_KECLEON
|
||||
removeobject LOCALID_VISIBLE_BRIDGE_KECLEON
|
||||
removeobject LOCALID_BRIDGE_KECLEON
|
||||
removeobject LOCALID_BRIDGE_KECLEON_SHADOW
|
||||
fadescreenswapbuffers FADE_FROM_BLACK
|
||||
goto Route120_EventScript_StevenGiveDeconScope
|
||||
end
|
||||
@ -276,7 +276,7 @@ Route120_Movement_ApproachKecleonWest: @ 81F57B9
|
||||
walk_left
|
||||
step_end
|
||||
|
||||
Route120_EventScript_InvisibleBridgeKecleon:: @ 81F57BC
|
||||
Route120_EventScript_BridgeKecleon:: @ 81F57BC
|
||||
msgbox Kecleon_Text_SomethingUnseeable, MSGBOX_NPC
|
||||
end
|
||||
|
||||
|
@ -28,7 +28,7 @@
|
||||
"flag": "0"
|
||||
},
|
||||
{
|
||||
"graphics_id": "OBJ_EVENT_GFX_KECLEON_1",
|
||||
"graphics_id": "OBJ_EVENT_GFX_KECLEON",
|
||||
"x": 2,
|
||||
"y": 3,
|
||||
"elevation": 3,
|
||||
|
@ -1,7 +1,7 @@
|
||||
|
||||
# Bugs and Glitches
|
||||
|
||||
These are known bugs and glitches in the original Pokémon Emerald game: code that clearly does not work as intended, or that only works in limited circumstances but has the possibility to fail or crash.
|
||||
These are known bugs and glitches in the original Pokémon Emerald game: code that clearly does not work as intended, or that only works in limited circumstances but has the possibility to fail or crash. Defining the `BUGFIX` preprocessor variable will fix some of these automatically.
|
||||
|
||||
Fixes are written in the `diff` format. If you've used Git before, this should look familiar:
|
||||
|
||||
@ -60,7 +60,7 @@ void CB2_InitTitleScreen(void)
|
||||
SetGpuReg(REG_OFFSET_BLDY, 0);
|
||||
...
|
||||
```
|
||||
This matches with the code of FR/LG and does what GF originally wanted to do.
|
||||
This matches what FRLG does and obtains the seed differently than RS, independently of the RTC.
|
||||
|
||||
## Scrolling through items in the bag causes the image to flicker
|
||||
|
||||
@ -95,3 +95,21 @@ Then edit `BagMenu_MoveCursorCallback` in [src/item_menu.c](https://github.com/p
|
||||
if (a != -2)
|
||||
...
|
||||
```
|
||||
|
||||
## Pokémon that have an affine transform as part of their entry animation glitch when going in and out of Poké Balls without a screen transition in between
|
||||
|
||||
**Fix:** Edit `sub_817F77C` in [src/pokemon_animation.c](https://github.com/pret/pokeemerald/blob/master/src/pokemon_animation.c#L1028):
|
||||
|
||||
```diff
|
||||
...
|
||||
-#ifdef BUGFIX
|
||||
else
|
||||
{
|
||||
// FIX: Reset these back to normal after they were changed so Poké Ball catch/release
|
||||
// animations without a screen transition in between don't break
|
||||
sprite->affineAnimPaused = FALSE;
|
||||
sprite->affineAnims = gUnknown_082FF694;
|
||||
}
|
||||
-#endif // BUGFIX
|
||||
}
|
||||
```
|
||||
|
Before Width: | Height: | Size: 681 B After Width: | Height: | Size: 681 B |
Before Width: | Height: | Size: 627 B After Width: | Height: | Size: 627 B |
@ -702,7 +702,11 @@ struct BattleSpriteData
|
||||
struct MonSpritesGfx
|
||||
{
|
||||
void* firstDecompressed; // ptr to the decompressed sprite of the first pokemon
|
||||
void* sprites[4];
|
||||
union
|
||||
{
|
||||
void* ptr[4];
|
||||
u8* byte[4];
|
||||
} sprites;
|
||||
struct SpriteTemplate templates[4];
|
||||
struct SpriteFrameImage field_74[4][4];
|
||||
u8 field_F4[0x80];
|
||||
@ -836,5 +840,7 @@ extern u8 gHealthboxSpriteIds[MAX_BATTLERS_COUNT];
|
||||
extern u8 gMultiUsePlayerCursor;
|
||||
extern u8 gNumberOfMovesToChoose;
|
||||
extern u8 gUnknown_03005D7C[MAX_BATTLERS_COUNT];
|
||||
extern bool8 gHasFetchedBall;
|
||||
extern u8 gLastUsedBall;
|
||||
|
||||
#endif // GUARD_BATTLE_H
|
||||
|
@ -1,8 +1,6 @@
|
||||
#ifndef GUARD_BATTLE_DEBUG_H
|
||||
#define GUARD_BATTLE_DEBUG_H
|
||||
|
||||
#define USE_BATTLE_DEBUG TRUE
|
||||
|
||||
void CB2_BattleDebugMenu(void);
|
||||
|
||||
#endif // GUARD_BATTLE_DEBUG_H
|
||||
|
@ -249,8 +249,8 @@ extern const u8 BattleScript_SturdiedMsg[];
|
||||
extern const u8 BattleScript_GravityEnds[];
|
||||
extern const u8 BattleScript_MoveStatDrain[];
|
||||
extern const u8 BattleScript_MoveStatDrain_PPLoss[];
|
||||
extern const u8 BattleScript_TargetAbilityStatRaise[];
|
||||
extern const u8 BattleScript_AngryPointActivates[];
|
||||
extern const u8 BattleScript_TargetAbilityStatRaiseOnMoveEnd[];
|
||||
extern const u8 BattleScript_TargetsStatWasMaxedOut[];
|
||||
extern const u8 BattleScript_AttackerAbilityStatRaise[];
|
||||
extern const u8 BattleScript_AttackerAbilityStatRaiseEnd3[];
|
||||
extern const u8 BattleScript_PoisonHealActivates[];
|
||||
@ -352,5 +352,10 @@ extern const u8 BattleScript_CheekPouchActivates[];
|
||||
extern const u8 BattleScript_TotemVar[];
|
||||
extern const u8 BattleScript_TotemFlaredToLife[];
|
||||
extern const u8 BattleScript_AnnounceAirLockCloudNine[];
|
||||
extern const u8 BattleScript_BattlerAbilityStatRaiseOnSwitchIn[];
|
||||
extern const u8 BattleScript_CottonDownActivates[];
|
||||
extern const u8 BattleScript_BallFetch[];
|
||||
extern const u8 BattleScript_SandSpitActivates[];
|
||||
extern const u8 BattleScript_PerishBodyActivates[];
|
||||
|
||||
#endif // GUARD_BATTLE_SCRIPTS_H
|
||||
|
@ -83,6 +83,6 @@ u8 GetFrontierEnemyMonLevel(u8 lvlMode);
|
||||
s32 GetHighestLevelInPlayerParty(void);
|
||||
u8 FacilityClassToGraphicsId(u8 facilityClass);
|
||||
bool32 ValidateBattleTowerRecord(u8 recordId); // unused
|
||||
void sub_8166188(void);
|
||||
void TrySetLinkBattleTowerEnemyPartyLevel(void);
|
||||
|
||||
#endif //GUARD_BATTLE_TOWER_H
|
||||
|
@ -15,9 +15,6 @@
|
||||
// printing system. Use NoCashGBAPrint() and NoCashGBAPrintf() like you
|
||||
// would normally use AGBPrint() and AGBPrintf().
|
||||
|
||||
// NOTE: Don't try to enable assert right now as many pointers
|
||||
// still exist in defines and WILL likely result in a broken ROM.
|
||||
|
||||
#define ENGLISH
|
||||
|
||||
#ifdef ENGLISH
|
||||
@ -26,9 +23,12 @@
|
||||
#define UNITS_METRIC
|
||||
#endif
|
||||
|
||||
// Uncomment to fix some identified minor bugs
|
||||
//#define BUGFIX
|
||||
|
||||
// Various undefined behavior bugs may or may not prevent compilation with
|
||||
// newer compilers. So always fix them when using a modern compiler.
|
||||
#if MODERN
|
||||
#if MODERN || defined(BUGFIX)
|
||||
#ifndef UBFIX
|
||||
#define UBFIX
|
||||
#endif
|
||||
|
@ -111,6 +111,7 @@
|
||||
#define B_MINIMIZE_DMG_ACC GEN_6 // In Gen6+, moves that causes double damage to minimized Pokémon will also skip accuracy checks.
|
||||
#define B_PP_REDUCED_BY_SPITE GEN_6 // In Gen4+, Spite reduces the foe's last move's PP by 4, instead of 2 to 5.
|
||||
#define B_CAN_SPITE_FAIL GEN_6 // In Gen4+, Spite can no longer fail if the foe's last move only has 1 remaining PP.
|
||||
#define B_CRASH_IF_TARGET_IMMUNE GEN_6 // In Gen4+, The user of Jump Kick or Hi Jump Kick will "keep going and crash" if it attacks a target that is immune to the move.
|
||||
|
||||
// Ability settings
|
||||
#define B_ABILITY_WEATHER GEN_6 // In Gen6+, ability-induced weather lasts 5 turns. Before, it lasted until the battle ended or until it was changed by a move.
|
||||
@ -166,7 +167,8 @@
|
||||
#define B_NEW_IMPACT_PALETTE TRUE // If set to TRUE, it updates the basic 'hit' palette.
|
||||
#define B_NEW_SURF_PARTICLE_PALETTE TRUE // If set to TRUE, it updates Surf's wave palette.
|
||||
|
||||
#define HIDE_HEALTHBOXES_DURING_ANIMS TRUE //if TRUE, hides healthboxes during move animations
|
||||
#define B_TERRAIN_BG_CHANGE TRUE // If TRUE, terrain moves permanently change the default battle background until the effect fades.
|
||||
#define HIDE_HEALTHBOXES_DURING_ANIMS TRUE // If set to TRUE, hides healthboxes during move animations
|
||||
#define B_TERRAIN_BG_CHANGE TRUE // If set to TRUE, terrain moves permanently change the default battle background until the effect fades.
|
||||
#define B_ENABLE_DEBUG TRUE // If set to TRUE, enables a debug menu to use in battles by pressing the Select button.
|
||||
|
||||
#endif // GUARD_CONSTANTS_BATTLE_CONFIG_H
|
||||
|
@ -52,7 +52,7 @@
|
||||
#define MAX_BATTLE_FRONTIER_POINTS 9999
|
||||
#define MAX_STREAK 9999
|
||||
|
||||
// These sets of facility ids would be redunant if the order was consistent
|
||||
// These sets of facility ids would be redundant if the order was consistent
|
||||
// The order is important for this set so that all the non-link records can be continuous
|
||||
#define RANKING_HALL_BATTLE_TOWER_SINGLES 0
|
||||
#define RANKING_HALL_BATTLE_TOWER_DOUBLES 1
|
||||
|
@ -178,6 +178,7 @@
|
||||
#define DMG_CURR_ATTACKER_HP 5
|
||||
#define DMG_BIG_ROOT 6
|
||||
#define DMG_1_2_ATTACKER_HP 7
|
||||
#define DMG_RECOIL_FROM_IMMUNE 8 // Used to calculate recoil for the Gen 4 version of Jump Kick
|
||||
|
||||
// Cmd_jumpifcantswitch
|
||||
#define SWITCH_IGNORE_ESCAPE_PREVENTION 0x80
|
||||
|
@ -452,7 +452,7 @@
|
||||
#define STRINGID_PSYCHICTERRAINENDS 448
|
||||
#define STRINGID_GRASSYTERRAINENDS 449
|
||||
#define STRINGID_TARGETABILITYSTATRAISE 450
|
||||
#define STRINGID_ANGRYPOINTACTIVATES 451
|
||||
#define STRINGID_TARGETSSTATWASMAXEDOUT 451
|
||||
#define STRINGID_ATTACKERABILITYSTATRAISE 452
|
||||
#define STRINGID_POISONHEALHPUP 453
|
||||
#define STRINGID_BADDREAMSDMG 454
|
||||
@ -551,16 +551,21 @@
|
||||
#define STRINGID_CLOAKEDINAFREEZINGLIGHT 547
|
||||
#define STRINGID_STATWASNOTLOWERED 548
|
||||
#define STRINGID_FERVENTWISHREACHED 549
|
||||
#define STRINGID_AURAFLAREDTOLIFE 550
|
||||
#define STRINGID_AIRLOCKACTIVATES 551
|
||||
#define STRINGID_PRESSUREENTERS 552
|
||||
#define STRINGID_DARKAURAENTERS 553
|
||||
#define STRINGID_FAIRYAURAENTERS 554
|
||||
#define STRINGID_AURABREAKENTERS 555
|
||||
#define STRINGID_COMATOSEENTERS 556
|
||||
#define STRINGID_SCREENCLEANERENTERS 557
|
||||
#define STRINGID_AIRLOCKACTIVATES 550
|
||||
#define STRINGID_PRESSUREENTERS 551
|
||||
#define STRINGID_DARKAURAENTERS 552
|
||||
#define STRINGID_FAIRYAURAENTERS 553
|
||||
#define STRINGID_AURABREAKENTERS 554
|
||||
#define STRINGID_COMATOSEENTERS 555
|
||||
#define STRINGID_SCREENCLEANERENTERS 556
|
||||
#define STRINGID_FETCHEDPOKEBALL 557
|
||||
#define STRINGID_BATTLERABILITYRAISEDSTAT 558
|
||||
#define STRINGID_ASANDSTORMKICKEDUP 559
|
||||
#define STRINGID_PKMNSWILLPERISHIN3TURNS 560
|
||||
#define STRINGID_ABILITYRAISEDSTATDRASTICALLY 561
|
||||
#define STRINGID_AURAFLAREDTOLIFE 562
|
||||
|
||||
#define BATTLESTRINGS_COUNT 558
|
||||
#define BATTLESTRINGS_COUNT 563
|
||||
|
||||
//// multichoice message IDs
|
||||
// switch in ability message
|
||||
|
@ -14,7 +14,7 @@
|
||||
#define BATTLE_TOWER_FUNC_LOAD_PARTNERS 10
|
||||
#define BATTLE_TOWER_FUNC_PARTNER_MSG 11
|
||||
#define BATTLE_TOWER_FUNC_LOAD_LINK_OPPONENTS 12
|
||||
#define BATTLE_TOWER_FUNC_13 13
|
||||
#define BATTLE_TOWER_FUNC_TRY_CLOSE_LINK 13
|
||||
#define BATTLE_TOWER_FUNC_SET_PARTNER_GFX 14
|
||||
#define BATTLE_TOWER_FUNC_SET_INTERVIEW_DATA 15
|
||||
|
||||
|
@ -205,7 +205,7 @@
|
||||
#define OBJ_EVENT_GFX_REGICE 201
|
||||
#define OBJ_EVENT_GFX_REGISTEEL 202
|
||||
#define OBJ_EVENT_GFX_SKITTY 203
|
||||
#define OBJ_EVENT_GFX_KECLEON_1 204
|
||||
#define OBJ_EVENT_GFX_KECLEON 204
|
||||
#define OBJ_EVENT_GFX_KYOGRE_2 205
|
||||
#define OBJ_EVENT_GFX_GROUDON_2 206
|
||||
#define OBJ_EVENT_GFX_RAYQUAZA_2 207
|
||||
@ -213,7 +213,7 @@
|
||||
#define OBJ_EVENT_GFX_PIKACHU 209
|
||||
#define OBJ_EVENT_GFX_AZUMARILL 210
|
||||
#define OBJ_EVENT_GFX_WINGULL 211
|
||||
#define OBJ_EVENT_GFX_KECLEON_2 212
|
||||
#define OBJ_EVENT_GFX_KECLEON_BRIDGE_SHADOW 212
|
||||
#define OBJ_EVENT_GFX_TUBER_M_SWIMMING 213
|
||||
#define OBJ_EVENT_GFX_AZURILL 214
|
||||
#define OBJ_EVENT_GFX_MOM 215
|
||||
|
@ -1012,7 +1012,7 @@
|
||||
#define FLAG_HIDE_MOSSDEEP_CITY_STEVENS_HOUSE_STEVEN 0x3C7
|
||||
#define FLAG_HIDE_MOSSDEEP_CITY_STEVENS_HOUSE_BELDUM_POKEBALL 0x3C8
|
||||
#define FLAG_HIDE_FORTREE_CITY_KECLEON 0x3C9
|
||||
#define FLAG_HIDE_ROUTE_120_KECLEON_BRIDGE_INVISIBLE 0x3CA
|
||||
#define FLAG_HIDE_ROUTE_120_KECLEON_BRIDGE 0x3CA
|
||||
#define FLAG_HIDE_LILYCOVE_CITY_RIVAL 0x3CB
|
||||
#define FLAG_HIDE_ROUTE_120_STEVEN 0x3CC
|
||||
#define FLAG_HIDE_SOOTOPOLIS_CITY_STEVEN 0x3CD
|
||||
@ -1023,7 +1023,7 @@
|
||||
#define FLAG_HIDE_AQUA_HIDEOUT_B1F_ELECTRODE_2 0x3D2
|
||||
#define FLAG_HIDE_OLDALE_TOWN_RIVAL 0x3D3
|
||||
#define FLAG_HIDE_UNDERWATER_SEA_FLOOR_CAVERN_STOLEN_SUBMARINE 0x3D4
|
||||
#define FLAG_HIDE_ROUTE_120_KECLEON_BRIDGE_VISIBLE 0x3D5
|
||||
#define FLAG_HIDE_ROUTE_120_KECLEON_BRIDGE_SHADOW 0x3D5
|
||||
#define FLAG_HIDE_ROUTE_120_KECLEON_1 0x3D6
|
||||
#define FLAG_HIDE_RUSTURF_TUNNEL_WANDA 0x3D7
|
||||
#define FLAG_HIDE_VERDANTURF_TOWN_WANDAS_HOUSE_WANDA 0x3D8
|
||||
|
@ -242,10 +242,10 @@
|
||||
// Battle move flags
|
||||
#define FLAG_MAKES_CONTACT (1 << 0)
|
||||
#define FLAG_PROTECT_AFFECTED (1 << 1)
|
||||
#define FLAG_MAGICCOAT_AFFECTED (1 << 2)
|
||||
#define FLAG_MAGIC_COAT_AFFECTED (1 << 2)
|
||||
#define FLAG_SNATCH_AFFECTED (1 << 3)
|
||||
#define FLAG_MIRROR_MOVE_AFFECTED (1 << 4)
|
||||
#define FLAG_KINGSROCK_AFFECTED (1 << 5)
|
||||
#define FLAG_KINGS_ROCK_AFFECTED (1 << 5)
|
||||
#define FLAG_HIGH_CRIT (1 << 6)
|
||||
#define FLAG_RECKLESS_BOOST (1 << 7)
|
||||
#define FLAG_IRON_FIST_BOOST (1 << 8)
|
||||
|
@ -417,36 +417,36 @@
|
||||
#define SPECIES_CHIMECHO 411
|
||||
#define SPECIES_EGG 412
|
||||
|
||||
#define SPECIES_UNOWN_B 413
|
||||
#define SPECIES_UNOWN_C 414
|
||||
#define SPECIES_UNOWN_D 415
|
||||
#define SPECIES_UNOWN_E 416
|
||||
#define SPECIES_UNOWN_F 417
|
||||
#define SPECIES_UNOWN_G 418
|
||||
#define SPECIES_UNOWN_H 419
|
||||
#define SPECIES_UNOWN_I 420
|
||||
#define SPECIES_UNOWN_J 421
|
||||
#define SPECIES_UNOWN_K 422
|
||||
#define SPECIES_UNOWN_L 423
|
||||
#define SPECIES_UNOWN_M 424
|
||||
#define SPECIES_UNOWN_N 425
|
||||
#define SPECIES_UNOWN_O 426
|
||||
#define SPECIES_UNOWN_P 427
|
||||
#define SPECIES_UNOWN_Q 428
|
||||
#define SPECIES_UNOWN_R 429
|
||||
#define SPECIES_UNOWN_S 430
|
||||
#define SPECIES_UNOWN_T 431
|
||||
#define SPECIES_UNOWN_U 432
|
||||
#define SPECIES_UNOWN_V 433
|
||||
#define SPECIES_UNOWN_W 434
|
||||
#define SPECIES_UNOWN_X 435
|
||||
#define SPECIES_UNOWN_Y 436
|
||||
#define SPECIES_UNOWN_Z 437
|
||||
#define SPECIES_UNOWN_EMARK 438
|
||||
#define SPECIES_UNOWN_QMARK 439
|
||||
|
||||
#define NUM_SPECIES SPECIES_EGG
|
||||
|
||||
#define SPECIES_UNOWN_B (NUM_SPECIES + 1)
|
||||
#define SPECIES_UNOWN_C (SPECIES_UNOWN_B + 1)
|
||||
#define SPECIES_UNOWN_D (SPECIES_UNOWN_B + 2)
|
||||
#define SPECIES_UNOWN_E (SPECIES_UNOWN_B + 3)
|
||||
#define SPECIES_UNOWN_F (SPECIES_UNOWN_B + 4)
|
||||
#define SPECIES_UNOWN_G (SPECIES_UNOWN_B + 5)
|
||||
#define SPECIES_UNOWN_H (SPECIES_UNOWN_B + 6)
|
||||
#define SPECIES_UNOWN_I (SPECIES_UNOWN_B + 7)
|
||||
#define SPECIES_UNOWN_J (SPECIES_UNOWN_B + 8)
|
||||
#define SPECIES_UNOWN_K (SPECIES_UNOWN_B + 9)
|
||||
#define SPECIES_UNOWN_L (SPECIES_UNOWN_B + 10)
|
||||
#define SPECIES_UNOWN_M (SPECIES_UNOWN_B + 11)
|
||||
#define SPECIES_UNOWN_N (SPECIES_UNOWN_B + 12)
|
||||
#define SPECIES_UNOWN_O (SPECIES_UNOWN_B + 13)
|
||||
#define SPECIES_UNOWN_P (SPECIES_UNOWN_B + 14)
|
||||
#define SPECIES_UNOWN_Q (SPECIES_UNOWN_B + 15)
|
||||
#define SPECIES_UNOWN_R (SPECIES_UNOWN_B + 16)
|
||||
#define SPECIES_UNOWN_S (SPECIES_UNOWN_B + 17)
|
||||
#define SPECIES_UNOWN_T (SPECIES_UNOWN_B + 18)
|
||||
#define SPECIES_UNOWN_U (SPECIES_UNOWN_B + 19)
|
||||
#define SPECIES_UNOWN_V (SPECIES_UNOWN_B + 20)
|
||||
#define SPECIES_UNOWN_W (SPECIES_UNOWN_B + 21)
|
||||
#define SPECIES_UNOWN_X (SPECIES_UNOWN_B + 22)
|
||||
#define SPECIES_UNOWN_Y (SPECIES_UNOWN_B + 23)
|
||||
#define SPECIES_UNOWN_Z (SPECIES_UNOWN_B + 24)
|
||||
#define SPECIES_UNOWN_EMARK (SPECIES_UNOWN_B + 25)
|
||||
#define SPECIES_UNOWN_QMARK (SPECIES_UNOWN_B + 26)
|
||||
|
||||
// National Dex Index Defines
|
||||
|
||||
#define NATIONAL_DEX_NONE 0
|
||||
@ -845,31 +845,31 @@
|
||||
|
||||
#define NATIONAL_DEX_COUNT NATIONAL_DEX_DEOXYS
|
||||
|
||||
#define NATIONAL_DEX_OLD_UNOWN_B 387
|
||||
#define NATIONAL_DEX_OLD_UNOWN_C 388
|
||||
#define NATIONAL_DEX_OLD_UNOWN_D 389
|
||||
#define NATIONAL_DEX_OLD_UNOWN_E 390
|
||||
#define NATIONAL_DEX_OLD_UNOWN_F 391
|
||||
#define NATIONAL_DEX_OLD_UNOWN_G 392
|
||||
#define NATIONAL_DEX_OLD_UNOWN_H 393
|
||||
#define NATIONAL_DEX_OLD_UNOWN_I 394
|
||||
#define NATIONAL_DEX_OLD_UNOWN_J 395
|
||||
#define NATIONAL_DEX_OLD_UNOWN_K 396
|
||||
#define NATIONAL_DEX_OLD_UNOWN_L 397
|
||||
#define NATIONAL_DEX_OLD_UNOWN_M 398
|
||||
#define NATIONAL_DEX_OLD_UNOWN_N 399
|
||||
#define NATIONAL_DEX_OLD_UNOWN_O 400
|
||||
#define NATIONAL_DEX_OLD_UNOWN_P 401
|
||||
#define NATIONAL_DEX_OLD_UNOWN_Q 402
|
||||
#define NATIONAL_DEX_OLD_UNOWN_R 403
|
||||
#define NATIONAL_DEX_OLD_UNOWN_S 404
|
||||
#define NATIONAL_DEX_OLD_UNOWN_T 405
|
||||
#define NATIONAL_DEX_OLD_UNOWN_U 406
|
||||
#define NATIONAL_DEX_OLD_UNOWN_V 407
|
||||
#define NATIONAL_DEX_OLD_UNOWN_W 408
|
||||
#define NATIONAL_DEX_OLD_UNOWN_X 409
|
||||
#define NATIONAL_DEX_OLD_UNOWN_Y 410
|
||||
#define NATIONAL_DEX_OLD_UNOWN_Z 411
|
||||
#define NATIONAL_DEX_OLD_UNOWN_B (NATIONAL_DEX_COUNT + 1)
|
||||
#define NATIONAL_DEX_OLD_UNOWN_C (NATIONAL_DEX_OLD_UNOWN_B + 1)
|
||||
#define NATIONAL_DEX_OLD_UNOWN_D (NATIONAL_DEX_OLD_UNOWN_B + 2)
|
||||
#define NATIONAL_DEX_OLD_UNOWN_E (NATIONAL_DEX_OLD_UNOWN_B + 3)
|
||||
#define NATIONAL_DEX_OLD_UNOWN_F (NATIONAL_DEX_OLD_UNOWN_B + 4)
|
||||
#define NATIONAL_DEX_OLD_UNOWN_G (NATIONAL_DEX_OLD_UNOWN_B + 5)
|
||||
#define NATIONAL_DEX_OLD_UNOWN_H (NATIONAL_DEX_OLD_UNOWN_B + 6)
|
||||
#define NATIONAL_DEX_OLD_UNOWN_I (NATIONAL_DEX_OLD_UNOWN_B + 7)
|
||||
#define NATIONAL_DEX_OLD_UNOWN_J (NATIONAL_DEX_OLD_UNOWN_B + 8)
|
||||
#define NATIONAL_DEX_OLD_UNOWN_K (NATIONAL_DEX_OLD_UNOWN_B + 9)
|
||||
#define NATIONAL_DEX_OLD_UNOWN_L (NATIONAL_DEX_OLD_UNOWN_B + 10)
|
||||
#define NATIONAL_DEX_OLD_UNOWN_M (NATIONAL_DEX_OLD_UNOWN_B + 11)
|
||||
#define NATIONAL_DEX_OLD_UNOWN_N (NATIONAL_DEX_OLD_UNOWN_B + 12)
|
||||
#define NATIONAL_DEX_OLD_UNOWN_O (NATIONAL_DEX_OLD_UNOWN_B + 13)
|
||||
#define NATIONAL_DEX_OLD_UNOWN_P (NATIONAL_DEX_OLD_UNOWN_B + 14)
|
||||
#define NATIONAL_DEX_OLD_UNOWN_Q (NATIONAL_DEX_OLD_UNOWN_B + 15)
|
||||
#define NATIONAL_DEX_OLD_UNOWN_R (NATIONAL_DEX_OLD_UNOWN_B + 16)
|
||||
#define NATIONAL_DEX_OLD_UNOWN_S (NATIONAL_DEX_OLD_UNOWN_B + 17)
|
||||
#define NATIONAL_DEX_OLD_UNOWN_T (NATIONAL_DEX_OLD_UNOWN_B + 18)
|
||||
#define NATIONAL_DEX_OLD_UNOWN_U (NATIONAL_DEX_OLD_UNOWN_B + 19)
|
||||
#define NATIONAL_DEX_OLD_UNOWN_V (NATIONAL_DEX_OLD_UNOWN_B + 20)
|
||||
#define NATIONAL_DEX_OLD_UNOWN_W (NATIONAL_DEX_OLD_UNOWN_B + 21)
|
||||
#define NATIONAL_DEX_OLD_UNOWN_X (NATIONAL_DEX_OLD_UNOWN_B + 22)
|
||||
#define NATIONAL_DEX_OLD_UNOWN_Y (NATIONAL_DEX_OLD_UNOWN_B + 23)
|
||||
#define NATIONAL_DEX_OLD_UNOWN_Z (NATIONAL_DEX_OLD_UNOWN_B + 24)
|
||||
|
||||
// Hoenn Dex Index Defines
|
||||
|
||||
@ -1264,30 +1264,30 @@
|
||||
#define HOENN_DEX_HO_OH 385
|
||||
#define HOENN_DEX_CELEBI 386
|
||||
|
||||
#define HOENN_DEX_OLD_UNOWN_B 387
|
||||
#define HOENN_DEX_OLD_UNOWN_C 388
|
||||
#define HOENN_DEX_OLD_UNOWN_D 389
|
||||
#define HOENN_DEX_OLD_UNOWN_E 390
|
||||
#define HOENN_DEX_OLD_UNOWN_F 391
|
||||
#define HOENN_DEX_OLD_UNOWN_G 392
|
||||
#define HOENN_DEX_OLD_UNOWN_H 393
|
||||
#define HOENN_DEX_OLD_UNOWN_I 394
|
||||
#define HOENN_DEX_OLD_UNOWN_J 395
|
||||
#define HOENN_DEX_OLD_UNOWN_K 396
|
||||
#define HOENN_DEX_OLD_UNOWN_L 397
|
||||
#define HOENN_DEX_OLD_UNOWN_M 398
|
||||
#define HOENN_DEX_OLD_UNOWN_N 399
|
||||
#define HOENN_DEX_OLD_UNOWN_O 400
|
||||
#define HOENN_DEX_OLD_UNOWN_P 401
|
||||
#define HOENN_DEX_OLD_UNOWN_Q 402
|
||||
#define HOENN_DEX_OLD_UNOWN_R 403
|
||||
#define HOENN_DEX_OLD_UNOWN_S 404
|
||||
#define HOENN_DEX_OLD_UNOWN_T 405
|
||||
#define HOENN_DEX_OLD_UNOWN_U 406
|
||||
#define HOENN_DEX_OLD_UNOWN_V 407
|
||||
#define HOENN_DEX_OLD_UNOWN_W 408
|
||||
#define HOENN_DEX_OLD_UNOWN_X 409
|
||||
#define HOENN_DEX_OLD_UNOWN_Y 410
|
||||
#define HOENN_DEX_OLD_UNOWN_Z 411
|
||||
#define HOENN_DEX_OLD_UNOWN_B (HOENN_DEX_CELEBI + 1)
|
||||
#define HOENN_DEX_OLD_UNOWN_C (HOENN_DEX_OLD_UNOWN_B + 1)
|
||||
#define HOENN_DEX_OLD_UNOWN_D (HOENN_DEX_OLD_UNOWN_B + 2)
|
||||
#define HOENN_DEX_OLD_UNOWN_E (HOENN_DEX_OLD_UNOWN_B + 3)
|
||||
#define HOENN_DEX_OLD_UNOWN_F (HOENN_DEX_OLD_UNOWN_B + 4)
|
||||
#define HOENN_DEX_OLD_UNOWN_G (HOENN_DEX_OLD_UNOWN_B + 5)
|
||||
#define HOENN_DEX_OLD_UNOWN_H (HOENN_DEX_OLD_UNOWN_B + 6)
|
||||
#define HOENN_DEX_OLD_UNOWN_I (HOENN_DEX_OLD_UNOWN_B + 7)
|
||||
#define HOENN_DEX_OLD_UNOWN_J (HOENN_DEX_OLD_UNOWN_B + 8)
|
||||
#define HOENN_DEX_OLD_UNOWN_K (HOENN_DEX_OLD_UNOWN_B + 9)
|
||||
#define HOENN_DEX_OLD_UNOWN_L (HOENN_DEX_OLD_UNOWN_B + 10)
|
||||
#define HOENN_DEX_OLD_UNOWN_M (HOENN_DEX_OLD_UNOWN_B + 11)
|
||||
#define HOENN_DEX_OLD_UNOWN_N (HOENN_DEX_OLD_UNOWN_B + 12)
|
||||
#define HOENN_DEX_OLD_UNOWN_O (HOENN_DEX_OLD_UNOWN_B + 13)
|
||||
#define HOENN_DEX_OLD_UNOWN_P (HOENN_DEX_OLD_UNOWN_B + 14)
|
||||
#define HOENN_DEX_OLD_UNOWN_Q (HOENN_DEX_OLD_UNOWN_B + 15)
|
||||
#define HOENN_DEX_OLD_UNOWN_R (HOENN_DEX_OLD_UNOWN_B + 16)
|
||||
#define HOENN_DEX_OLD_UNOWN_S (HOENN_DEX_OLD_UNOWN_B + 17)
|
||||
#define HOENN_DEX_OLD_UNOWN_T (HOENN_DEX_OLD_UNOWN_B + 18)
|
||||
#define HOENN_DEX_OLD_UNOWN_U (HOENN_DEX_OLD_UNOWN_B + 19)
|
||||
#define HOENN_DEX_OLD_UNOWN_V (HOENN_DEX_OLD_UNOWN_B + 20)
|
||||
#define HOENN_DEX_OLD_UNOWN_W (HOENN_DEX_OLD_UNOWN_B + 21)
|
||||
#define HOENN_DEX_OLD_UNOWN_X (HOENN_DEX_OLD_UNOWN_B + 22)
|
||||
#define HOENN_DEX_OLD_UNOWN_Y (HOENN_DEX_OLD_UNOWN_B + 23)
|
||||
#define HOENN_DEX_OLD_UNOWN_Z (HOENN_DEX_OLD_UNOWN_B + 24)
|
||||
|
||||
#endif // GUARD_CONSTANTS_SPECIES_H
|
||||
|
@ -67,52 +67,26 @@ struct ToneData
|
||||
u8 release;
|
||||
};
|
||||
|
||||
#define SOUND_CHANNEL_SF_START 0x80
|
||||
#define SOUND_CHANNEL_SF_STOP 0x40
|
||||
#define SOUND_CHANNEL_SF_LOOP 0x10
|
||||
#define SOUND_CHANNEL_SF_IEC 0x04
|
||||
#define SOUND_CHANNEL_SF_ENV 0x03
|
||||
#define SOUND_CHANNEL_SF_ENV_ATTACK 0x03
|
||||
#define SOUND_CHANNEL_SF_ENV_DECAY 0x02
|
||||
#define SOUND_CHANNEL_SF_ENV_SUSTAIN 0x01
|
||||
#define SOUND_CHANNEL_SF_ENV_RELEASE 0x00
|
||||
#define SOUND_CHANNEL_SF_ON (SOUND_CHANNEL_SF_START | SOUND_CHANNEL_SF_STOP | SOUND_CHANNEL_SF_IEC | SOUND_CHANNEL_SF_ENV)
|
||||
|
||||
#define CGB_CHANNEL_MO_PIT 0x02
|
||||
#define CGB_CHANNEL_MO_VOL 0x01
|
||||
|
||||
#define CGB_NRx2_ENV_DIR_DEC 0x00
|
||||
#define CGB_NRx2_ENV_DIR_INC 0x08
|
||||
|
||||
struct CgbChannel
|
||||
{
|
||||
u8 sf; // 0x0
|
||||
u8 ty; // 0x1
|
||||
u8 rightVolume; // 0x2
|
||||
u8 leftVolume; // 0x3
|
||||
u8 at; // 0x4
|
||||
u8 de; // 0x5
|
||||
u8 su; // 0x6
|
||||
u8 re; // 0x7
|
||||
u8 ky; // 0x8
|
||||
u8 ev; // 0x9
|
||||
u8 eg; // 0xA
|
||||
u8 ec; // 0xB
|
||||
u8 echoVolume; // 0xC
|
||||
u8 echoLength; // 0xD
|
||||
u8 d1; // 0xE
|
||||
u8 d2; // 0xF
|
||||
u8 gt; // 0x10
|
||||
u8 mk; // 0x11
|
||||
u8 ve; // 0x12
|
||||
u8 pr; // 0x13
|
||||
u8 rp; // 0x14
|
||||
u8 d3[3]; // 0x15, 0x16, 0x17
|
||||
u8 d5; // 0x18
|
||||
u8 sg; // 0x19
|
||||
u8 n4; // 0x1A
|
||||
u8 pan; // 0x1B
|
||||
u8 panMask; // 0x1C
|
||||
u8 mo; // 0x1D
|
||||
u8 le; // 0x1E
|
||||
u8 sw; // 0x1F
|
||||
u32 fr; // 0x20
|
||||
u32 *wp;
|
||||
u32 cp;
|
||||
u32 tp;
|
||||
u32 pp;
|
||||
u32 np;
|
||||
u8 d4[8];
|
||||
};
|
||||
|
||||
struct MusicPlayerTrack;
|
||||
|
||||
struct SoundChannel
|
||||
{
|
||||
u8 status;
|
||||
u8 statusFlags;
|
||||
u8 type;
|
||||
u8 rightVolume;
|
||||
u8 leftVolume;
|
||||
@ -120,29 +94,72 @@ struct SoundChannel
|
||||
u8 decay;
|
||||
u8 sustain;
|
||||
u8 release;
|
||||
u8 ky;
|
||||
u8 ev;
|
||||
u8 er;
|
||||
u8 el;
|
||||
u8 echoVolume;
|
||||
u8 echoLength;
|
||||
u8 d1;
|
||||
u8 d2;
|
||||
u8 gt;
|
||||
u8 mk;
|
||||
u8 ve;
|
||||
u8 pr;
|
||||
u8 rp;
|
||||
u8 d3[3];
|
||||
u32 ct;
|
||||
u32 fw;
|
||||
u32 freq;
|
||||
struct WaveData *wav;
|
||||
u32 cp;
|
||||
u8 key;
|
||||
u8 envelopeVolume;
|
||||
u8 envelopeGoal;
|
||||
u8 envelopeCounter;
|
||||
u8 pseudoEchoVolume;
|
||||
u8 pseudoEchoLength;
|
||||
u8 dummy1;
|
||||
u8 dummy2;
|
||||
u8 gateTime;
|
||||
u8 midiKey;
|
||||
u8 velocity;
|
||||
u8 priority;
|
||||
u8 rhythmPan;
|
||||
u8 dummy3[3];
|
||||
u8 dummy5;
|
||||
u8 sustainGoal;
|
||||
u8 n4; // NR[1-4]4 register (initial, length bit)
|
||||
u8 pan;
|
||||
u8 panMask;
|
||||
u8 modify;
|
||||
u8 length;
|
||||
u8 sweep;
|
||||
u32 frequency;
|
||||
u32 *wavePointer; // instructs CgbMain to load targeted wave
|
||||
u32 *currentPointer; // stores the currently loaded wave
|
||||
struct MusicPlayerTrack *track;
|
||||
u32 pp;
|
||||
u32 np;
|
||||
u32 d4;
|
||||
void *prevChannelPointer;
|
||||
void *nextChannelPointer;
|
||||
u8 dummy4[8];
|
||||
};
|
||||
|
||||
struct MusicPlayerTrack;
|
||||
|
||||
struct SoundChannel
|
||||
{
|
||||
u8 statusFlags;
|
||||
u8 type;
|
||||
u8 rightVolume;
|
||||
u8 leftVolume;
|
||||
u8 attack;
|
||||
u8 decay;
|
||||
u8 sustain;
|
||||
u8 release;
|
||||
u8 key; // midi key as it was translated into final pitch
|
||||
u8 envelopeVolume;
|
||||
u8 envelopeVolumeRight;
|
||||
u8 envelopeVolumeLeft;
|
||||
u8 pseudoEchoVolume;
|
||||
u8 pseudoEchoLength;
|
||||
u8 dummy1;
|
||||
u8 dummy2;
|
||||
u8 gateTime;
|
||||
u8 midiKey; // midi key as it was used in the track data
|
||||
u8 velocity;
|
||||
u8 priority;
|
||||
u8 rhythmPan;
|
||||
u8 dummy3[3];
|
||||
u32 count;
|
||||
u32 fw;
|
||||
u32 frequency;
|
||||
struct WaveData *wav;
|
||||
s8 *currentPointer;
|
||||
struct MusicPlayerTrack *track;
|
||||
void *prevChannelPointer;
|
||||
void *nextChannelPointer;
|
||||
u32 dummy4;
|
||||
u16 xpi;
|
||||
u16 xpc;
|
||||
};
|
||||
@ -151,6 +168,16 @@ struct SoundChannel
|
||||
|
||||
#define PCM_DMA_BUF_SIZE 1584 // size of Direct Sound buffer
|
||||
|
||||
struct MusicPlayerInfo;
|
||||
|
||||
typedef void (*MPlayFunc)();
|
||||
typedef void (*PlyNoteFunc)(u32, struct MusicPlayerInfo *, struct MusicPlayerTrack *);
|
||||
typedef void (*CgbSoundFunc)(void);
|
||||
typedef void (*CgbOscOffFunc)(u8);
|
||||
typedef u32 (*MidiKeyToCgbFreqFunc)(u8, u8, u8);
|
||||
typedef void (*ExtVolPitFunc)(void);
|
||||
typedef void (*MPlayMainFunc)(struct MusicPlayerInfo *);
|
||||
|
||||
struct SoundInfo
|
||||
{
|
||||
// This field is normally equal to ID_NUMBER but it is set to other
|
||||
@ -168,7 +195,7 @@ struct SoundInfo
|
||||
u8 freq;
|
||||
|
||||
u8 mode;
|
||||
u8 c15;
|
||||
u8 c15; // periodically counts from 14 down to 0 (15 states)
|
||||
u8 pcmDmaPeriod; // number of V-blanks per PCM DMA
|
||||
u8 maxLines;
|
||||
u8 gap[3];
|
||||
@ -176,14 +203,14 @@ struct SoundInfo
|
||||
s32 pcmFreq;
|
||||
s32 divFreq;
|
||||
struct CgbChannel *cgbChans;
|
||||
u32 func;
|
||||
u32 intp;
|
||||
void (*CgbSound)(void);
|
||||
void (*CgbOscOff)(u8);
|
||||
u32 (*MidiKeyToCgbFreq)(u8, u8, u8);
|
||||
u32 MPlayJumpTable;
|
||||
u32 plynote;
|
||||
u32 ExtVolPit;
|
||||
MPlayMainFunc MPlayMainHead;
|
||||
struct MusicPlayerInfo *musicPlayerHead;
|
||||
CgbSoundFunc CgbSound;
|
||||
CgbOscOffFunc CgbOscOff;
|
||||
MidiKeyToCgbFreqFunc MidiKeyToCgbFreq;
|
||||
MPlayFunc *MPlayJumpTable;
|
||||
PlyNoteFunc plynote;
|
||||
ExtVolPitFunc ExtVolPit;
|
||||
u8 gap2[16];
|
||||
struct SoundChannel chans[MAX_DIRECTSOUND_CHANNELS];
|
||||
s8 pcmBuffer[PCM_DMA_BUF_SIZE * 2];
|
||||
@ -270,8 +297,8 @@ struct MusicPlayerTrack
|
||||
u8 lfoDelay;
|
||||
u8 lfoDelayC;
|
||||
u8 priority;
|
||||
u8 echoVolume;
|
||||
u8 echoLength;
|
||||
u8 pseudoEchoVolume;
|
||||
u8 pseudoEchoLength;
|
||||
struct SoundChannel *chan;
|
||||
struct ToneData tone;
|
||||
u8 gap[10];
|
||||
@ -312,8 +339,8 @@ struct MusicPlayerInfo
|
||||
struct MusicPlayerTrack *tracks;
|
||||
struct ToneData *tone;
|
||||
u32 ident;
|
||||
u32 func;
|
||||
u32 intp;
|
||||
MPlayMainFunc MPlayMainNext;
|
||||
struct MusicPlayerInfo *musicPlayerNext;
|
||||
};
|
||||
|
||||
struct MusicPlayer
|
||||
@ -351,7 +378,7 @@ extern struct MusicPlayerTrack gPokemonCryTracks[];
|
||||
|
||||
extern char SoundMainRAM[];
|
||||
|
||||
extern void *gMPlayJumpTable[];
|
||||
extern MPlayFunc gMPlayJumpTable[];
|
||||
|
||||
typedef void (*XcmdFunc)(struct MusicPlayerInfo *, struct MusicPlayerTrack *);
|
||||
extern const XcmdFunc gXcmdTable[];
|
||||
@ -380,7 +407,7 @@ u32 umul3232H32(u32 multiplier, u32 multiplicand);
|
||||
void SoundMain(void);
|
||||
void SoundMainBTM(void);
|
||||
void TrackStop(struct MusicPlayerInfo *mplayInfo, struct MusicPlayerTrack *track);
|
||||
void MPlayMain(void);
|
||||
void MPlayMain(struct MusicPlayerInfo *);
|
||||
void RealClearChain(void *x);
|
||||
|
||||
void MPlayContinue(struct MusicPlayerInfo *mplayInfo);
|
||||
@ -400,7 +427,7 @@ void CgbOscOff(u8);
|
||||
void CgbModVol(struct CgbChannel *chan);
|
||||
u32 MidiKeyToCgbFreq(u8, u8, u8);
|
||||
void DummyFunc(void);
|
||||
void MPlayJumpTableCopy(void **mplayJumpTable);
|
||||
void MPlayJumpTableCopy(MPlayFunc *mplayJumpTable);
|
||||
void SampleFreqSet(u32 freq);
|
||||
void m4aSoundVSyncOn(void);
|
||||
void m4aSoundVSyncOff(void);
|
||||
@ -448,7 +475,7 @@ void ply_tune(struct MusicPlayerInfo *, struct MusicPlayerTrack *);
|
||||
void ply_port(struct MusicPlayerInfo *, struct MusicPlayerTrack *);
|
||||
void ply_xcmd(struct MusicPlayerInfo *, struct MusicPlayerTrack *);
|
||||
void ply_endtie(struct MusicPlayerInfo *, struct MusicPlayerTrack *);
|
||||
void ply_note(struct MusicPlayerInfo *, struct MusicPlayerTrack *);
|
||||
void ply_note(u32 note_cmd, struct MusicPlayerInfo *, struct MusicPlayerTrack *);
|
||||
|
||||
// extended sound command handler functions
|
||||
void ply_xxx(struct MusicPlayerInfo *, struct MusicPlayerTrack *);
|
||||
|
@ -195,15 +195,10 @@ struct ObjectEvent
|
||||
/*0x0C*/ struct Coords16 initialCoords;
|
||||
/*0x10*/ struct Coords16 currentCoords;
|
||||
/*0x14*/ struct Coords16 previousCoords;
|
||||
/*0x18*/ u8 facingDirection:4; // current direction?
|
||||
/*0x18*/ u8 movementDirection:4;
|
||||
/*0x19*/ union __attribute__((packed)) {
|
||||
u8 as_byte;
|
||||
struct __attribute__((packed)) {
|
||||
u8 x:4;
|
||||
u8 y:4;
|
||||
} ALIGNED(1) as_nybbles;
|
||||
} ALIGNED(1) range;
|
||||
/*0x18*/ u16 facingDirection:4; // current direction?
|
||||
u16 movementDirection:4;
|
||||
u16 rangeX:4;
|
||||
u16 rangeY:4;
|
||||
/*0x1A*/ u8 fieldEffectSpriteId;
|
||||
/*0x1B*/ u8 warpArrowSpriteId;
|
||||
/*0x1C*/ u8 movementActionId;
|
||||
@ -219,8 +214,8 @@ struct ObjectEvent
|
||||
struct ObjectEventGraphicsInfo
|
||||
{
|
||||
/*0x00*/ u16 tileTag;
|
||||
/*0x02*/ u16 paletteTag1;
|
||||
/*0x04*/ u16 paletteTag2;
|
||||
/*0x02*/ u16 paletteTag;
|
||||
/*0x04*/ u16 reflectionPaletteTag;
|
||||
/*0x06*/ u16 size;
|
||||
/*0x08*/ s16 width;
|
||||
/*0x0A*/ s16 height;
|
||||
|
@ -340,11 +340,12 @@ struct BattleDomeTrainer
|
||||
};
|
||||
|
||||
#define DOME_TOURNAMENT_TRAINERS_COUNT 16
|
||||
#define BATTLE_TOWER_RECORD_COUNT 5
|
||||
|
||||
struct BattleFrontier
|
||||
{
|
||||
/*0x64C*/ struct EmeraldBattleTowerRecord towerPlayer;
|
||||
/*0x738*/ struct EmeraldBattleTowerRecord towerRecords[5]; // From record mixing.
|
||||
/*0x738*/ struct EmeraldBattleTowerRecord towerRecords[BATTLE_TOWER_RECORD_COUNT]; // From record mixing.
|
||||
/*0xBEB*/ struct BattleTowerInterview towerInterview;
|
||||
/*0xBEC*/ struct BattleTowerEReaderTrainer ereaderTrainer;
|
||||
/*0xCA8*/ u8 challengeStatus;
|
||||
|
@ -5343,4 +5343,10 @@ extern const u16 gPokenavMessageBox_Pal[];
|
||||
extern const u32 gPokenavOptions_Gfx[];
|
||||
extern const u16 gPokenavOptions_Pal[];
|
||||
|
||||
// Object event pals
|
||||
extern const u16 gObjectEventPal_Brendan[];
|
||||
extern const u16 gObjectEventPal_May[];
|
||||
extern const u16 gObjectEventPal_RubySapphireBrendan[];
|
||||
extern const u16 gObjectEventPal_RubySapphireMay[];
|
||||
|
||||
#endif //GUARD_GRAPHICS_H
|
||||
|
@ -280,7 +280,7 @@ void CreateBattleTowerMon(struct Pokemon *mon, struct BattleTowerPokemon *src);
|
||||
void CreateBattleTowerMon2(struct Pokemon *mon, struct BattleTowerPokemon *src, bool8 lvl50);
|
||||
void CreateApprenticeMon(struct Pokemon *mon, const struct Apprentice *src, u8 monId);
|
||||
void CreateMonWithEVSpreadNatureOTID(struct Pokemon *mon, u16 species, u8 level, u8 nature, u8 fixedIV, u8 evSpread, u32 otId);
|
||||
void sub_80686FC(struct Pokemon *mon, struct BattleTowerPokemon *dest);
|
||||
void ConvertPokemonToBattleTowerPokemon(struct Pokemon *mon, struct BattleTowerPokemon *dest);
|
||||
void CreateObedientMon(struct Pokemon *mon, u16 species, u8 level, u8 fixedIV, u8 hasFixedPersonality, u32 fixedPersonality, u8 otIdType, u32 fixedOtId);
|
||||
bool8 sub_80688F8(u8 caseId, u8 battlerId);
|
||||
void SetDeoxysStats(void);
|
||||
@ -386,7 +386,7 @@ void ClearBattleMonForms(void);
|
||||
u16 GetBattleBGM(void);
|
||||
void PlayBattleBGM(void);
|
||||
void PlayMapChosenOrBattleBGM(u16 songId);
|
||||
void sub_806E694(u16 songId);
|
||||
void CreateTask_PlayMapChosenOrBattleBGM(u16 songId);
|
||||
const u32 *GetMonFrontSpritePal(struct Pokemon *mon);
|
||||
const u32 *GetMonSpritePalFromSpeciesAndPersonality(u16 species, u32 otId, u32 personality);
|
||||
const struct CompressedSpritePalette *GetMonSpritePalStruct(struct Pokemon *mon);
|
||||
|
@ -30,7 +30,7 @@ void sub_818603C(u8 arg0);
|
||||
u32 GetAiScriptsInRecordedBattle(void);
|
||||
void sub_8186444(void);
|
||||
bool8 sub_8186450(void);
|
||||
void sub_8186468(u8 *dst);
|
||||
void GetRecordedBattleRecordMixFriendName(u8 *dst);
|
||||
u8 GetRecordedBattleRecordMixFriendClass(void);
|
||||
u8 GetRecordedBattleApprenticeId(void);
|
||||
u8 GetRecordedBattleRecordMixFriendLanguage(void);
|
||||
|
@ -2330,7 +2330,7 @@ void AnimTask_TransformMon(u8 taskId)
|
||||
else
|
||||
position = GetBattlerPosition(gBattleAnimAttacker);
|
||||
|
||||
src = gMonSpritesGfxPtr->sprites[position] + (gBattleMonForms[gBattleAnimAttacker] << 11);
|
||||
src = gMonSpritesGfxPtr->sprites.ptr[position] + (gBattleMonForms[gBattleAnimAttacker] << 11);
|
||||
dest = animBg.bgTiles;
|
||||
CpuCopy32(src, dest, 0x800);
|
||||
LoadBgTiles(1, animBg.bgTiles, 0x800, animBg.tilesOffset);
|
||||
|
@ -331,7 +331,7 @@ static void HandleInputChooseAction(void)
|
||||
{
|
||||
SwapHpBarsWithHpText();
|
||||
}
|
||||
else if (USE_BATTLE_DEBUG && gMain.newKeys & SELECT_BUTTON)
|
||||
else if (B_ENABLE_DEBUG && gMain.newKeys & SELECT_BUTTON)
|
||||
{
|
||||
BtlController_EmitTwoReturnValues(1, B_ACTION_DEBUG, 0);
|
||||
PlayerBufferExecCompleted();
|
||||
|
@ -863,7 +863,9 @@ static const struct WindowTemplate sInfoCardWindowTemplates[] =
|
||||
.paletteNum = 15,
|
||||
.baseBlock = 372,
|
||||
},
|
||||
// UB: No DUMMY_WIN_TEMPLATE at the array's end.
|
||||
#ifdef UBFIX
|
||||
DUMMY_WIN_TEMPLATE,
|
||||
#endif
|
||||
};
|
||||
|
||||
static const struct ScanlineEffectParams sTourneyTreeScanlineEffectParams =
|
||||
@ -2526,7 +2528,11 @@ static void CreateDomeOpponentMon(u8 monPartyId, u16 tournamentTrainerId, u8 tou
|
||||
{
|
||||
int i;
|
||||
u8 friendship = MAX_FRIENDSHIP;
|
||||
u8 fixedIv = GetDomeTrainerMonIvs(tournamentTrainerId); // BUG: Should be using (DOME_TRAINERS[tournamentTrainerId].trainerId) instead of (tournamentTrainerId). As a result, all Pokemon have ivs of 3.
|
||||
#ifdef BUGFIX
|
||||
u8 fixedIv = GetDomeTrainerMonIvs(DOME_TRAINERS[tournamentTrainerId].trainerId);
|
||||
#else
|
||||
u8 fixedIv = GetDomeTrainerMonIvs(tournamentTrainerId); // BUG: Using the wrong ID. As a result, all Pokemon have ivs of 3.
|
||||
#endif
|
||||
u8 level = SetFacilityPtrsGetLevel();
|
||||
CreateMonWithEVSpreadNatureOTID(&gEnemyParty[monPartyId],
|
||||
gFacilityTrainerMons[DOME_MONS[tournamentTrainerId][tournamentMonId]].species,
|
||||
@ -5954,6 +5960,10 @@ static void DecideRoundWinners(u8 roundId)
|
||||
else if (tournamentId2 != 0xFF)
|
||||
{
|
||||
// BUG: points1 and points2 are not cleared at the beginning of the loop resulting in not fair results.
|
||||
#ifdef BUGFIX
|
||||
points1 = 0;
|
||||
points2 = 0;
|
||||
#endif
|
||||
|
||||
// Calculate points for both trainers.
|
||||
for (monId1 = 0; monId1 < FRONTIER_PARTY_SIZE; monId1++)
|
||||
|
@ -3905,7 +3905,11 @@ static void Swap_ShowSummaryMonSprite(void)
|
||||
personality = GetMonData(mon, MON_DATA_PERSONALITY, NULL);
|
||||
otId = GetMonData(mon, MON_DATA_OT_ID, NULL);
|
||||
|
||||
sFactorySwapScreen->unk2C.field0 = CreateMonPicSprite_HandleDeoxys(species, personality, otId, TRUE, 88, 32, 15, 0xFFFF); // BUG: otId and personality should be switched.
|
||||
#ifdef BUGFIX
|
||||
sFactorySwapScreen->unk2C.field0 = CreateMonPicSprite_HandleDeoxys(species, otId, personality, TRUE, 88, 32, 15, 0xFFFF);
|
||||
#else
|
||||
sFactorySwapScreen->unk2C.field0 = CreateMonPicSprite_HandleDeoxys(species, personality, otId, TRUE, 88, 32, 15, 0xFFFF);
|
||||
#endif
|
||||
gSprites[sFactorySwapScreen->unk2C.field0].centerToCornerVecX = 0;
|
||||
gSprites[sFactorySwapScreen->unk2C.field0].centerToCornerVecY = 0;
|
||||
|
||||
|
@ -6,6 +6,7 @@
|
||||
#include "constants/battle_anim.h"
|
||||
#include "battle_interface.h"
|
||||
#include "main.h"
|
||||
#include "dma3.h"
|
||||
#include "malloc.h"
|
||||
#include "graphics.h"
|
||||
#include "random.h"
|
||||
@ -578,7 +579,7 @@ static void BattleLoadMonSpriteGfx(struct Pokemon *mon, u32 battlerId, bool32 op
|
||||
if (opponent)
|
||||
{
|
||||
HandleLoadSpecialPokePic_DontHandleDeoxys(&gMonFrontPicTable[species],
|
||||
gMonSpritesGfxPtr->sprites[position],
|
||||
gMonSpritesGfxPtr->sprites.ptr[position],
|
||||
species, currentPersonality);
|
||||
}
|
||||
else
|
||||
@ -586,13 +587,13 @@ static void BattleLoadMonSpriteGfx(struct Pokemon *mon, u32 battlerId, bool32 op
|
||||
if (sub_80688F8(1, battlerId) == 1 || gBattleSpritesDataPtr->battlerData[battlerId].transformSpecies != SPECIES_NONE)
|
||||
{
|
||||
HandleLoadSpecialPokePic_DontHandleDeoxys(&gMonBackPicTable[species],
|
||||
gMonSpritesGfxPtr->sprites[position],
|
||||
gMonSpritesGfxPtr->sprites.ptr[position],
|
||||
species, currentPersonality);
|
||||
}
|
||||
else
|
||||
{
|
||||
HandleLoadSpecialPokePic(&gMonBackPicTable[species],
|
||||
gMonSpritesGfxPtr->sprites[position],
|
||||
gMonSpritesGfxPtr->sprites.ptr[position],
|
||||
species, currentPersonality);
|
||||
}
|
||||
}
|
||||
@ -641,7 +642,7 @@ void DecompressTrainerFrontPic(u16 frontPicId, u8 battlerId)
|
||||
{
|
||||
u8 position = GetBattlerPosition(battlerId);
|
||||
DecompressPicFromTable_2(&gTrainerFrontPicTable[frontPicId],
|
||||
gMonSpritesGfxPtr->sprites[position],
|
||||
gMonSpritesGfxPtr->sprites.ptr[position],
|
||||
SPECIES_NONE);
|
||||
LoadCompressedSpritePalette(&gTrainerFrontPicPaletteTable[frontPicId]);
|
||||
}
|
||||
@ -650,7 +651,7 @@ void DecompressTrainerBackPic(u16 backPicId, u8 battlerId)
|
||||
{
|
||||
u8 position = GetBattlerPosition(battlerId);
|
||||
DecompressPicFromTable_2(&gTrainerBackPicTable[backPicId],
|
||||
gMonSpritesGfxPtr->sprites[position],
|
||||
gMonSpritesGfxPtr->sprites.ptr[position],
|
||||
SPECIES_NONE);
|
||||
LoadCompressedPalette(gTrainerBackPicPaletteTable[backPicId].data,
|
||||
0x100 + 16 * battlerId, 0x20);
|
||||
@ -869,7 +870,7 @@ void HandleSpeciesGfxDataChange(u8 battlerAtk, u8 battlerDef, bool8 notTransform
|
||||
otId = gContestResources->moveAnim->otId;
|
||||
|
||||
HandleLoadSpecialPokePic_DontHandleDeoxys(&gMonBackPicTable[targetSpecies],
|
||||
gMonSpritesGfxPtr->sprites[0],
|
||||
gMonSpritesGfxPtr->sprites.ptr[0],
|
||||
targetSpecies,
|
||||
gContestResources->moveAnim->targetPersonality);
|
||||
}
|
||||
@ -888,7 +889,7 @@ void HandleSpeciesGfxDataChange(u8 battlerAtk, u8 battlerDef, bool8 notTransform
|
||||
otId = GetMonData(&gPlayerParty[gBattlerPartyIndexes[battlerAtk]], MON_DATA_OT_ID);
|
||||
|
||||
HandleLoadSpecialPokePic_DontHandleDeoxys(&gMonBackPicTable[targetSpecies],
|
||||
gMonSpritesGfxPtr->sprites[position],
|
||||
gMonSpritesGfxPtr->sprites.ptr[position],
|
||||
targetSpecies,
|
||||
gTransformedPersonalities[battlerAtk]);
|
||||
}
|
||||
@ -898,7 +899,7 @@ void HandleSpeciesGfxDataChange(u8 battlerAtk, u8 battlerDef, bool8 notTransform
|
||||
otId = GetMonData(&gEnemyParty[gBattlerPartyIndexes[battlerAtk]], MON_DATA_OT_ID);
|
||||
|
||||
HandleLoadSpecialPokePic_DontHandleDeoxys(&gMonFrontPicTable[targetSpecies],
|
||||
gMonSpritesGfxPtr->sprites[position],
|
||||
gMonSpritesGfxPtr->sprites.ptr[position],
|
||||
targetSpecies,
|
||||
gTransformedPersonalities[battlerAtk]);
|
||||
}
|
||||
@ -919,7 +920,7 @@ void HandleSpeciesGfxDataChange(u8 battlerAtk, u8 battlerDef, bool8 notTransform
|
||||
}
|
||||
else
|
||||
{
|
||||
src = gMonSpritesGfxPtr->sprites[position];
|
||||
src = gMonSpritesGfxPtr->sprites.ptr[position];
|
||||
dst = (void *)(VRAM + 0x10000 + gSprites[gBattlerSpriteIds[battlerAtk]].oam.tileNum * 32);
|
||||
DmaCopy32(3, src, dst, 0x800);
|
||||
paletteOffset = 0x100 + battlerAtk * 16;
|
||||
@ -963,18 +964,15 @@ void BattleLoadSubstituteOrMonSpriteGfx(u8 battlerId, bool8 loadMonSprite)
|
||||
position = GetBattlerPosition(battlerId);
|
||||
|
||||
if (IsContest())
|
||||
LZDecompressVram(gSubstituteDollTilemap, gMonSpritesGfxPtr->sprites[position]);
|
||||
LZDecompressVram(gSubstituteDollTilemap, gMonSpritesGfxPtr->sprites.ptr[position]);
|
||||
else if (GetBattlerSide(battlerId) != B_SIDE_PLAYER)
|
||||
LZDecompressVram(gSubstituteDollGfx, gMonSpritesGfxPtr->sprites[position]);
|
||||
LZDecompressVram(gSubstituteDollGfx, gMonSpritesGfxPtr->sprites.ptr[position]);
|
||||
else
|
||||
LZDecompressVram(gSubstituteDollTilemap, gMonSpritesGfxPtr->sprites[position]);
|
||||
LZDecompressVram(gSubstituteDollTilemap, gMonSpritesGfxPtr->sprites.ptr[position]);
|
||||
|
||||
for (i = 1; i < 4; i++)
|
||||
{
|
||||
u8 (*ptr)[4][0x800] = gMonSpritesGfxPtr->sprites[position];
|
||||
ptr++;ptr--; // Needed to match.
|
||||
|
||||
DmaCopy32Defvars(3, (*ptr)[0], (*ptr)[i], 0x800);
|
||||
Dma3CopyLarge32_(gMonSpritesGfxPtr->sprites.ptr[position], &gMonSpritesGfxPtr->sprites.byte[position][0x800 * i], 0x800);
|
||||
}
|
||||
|
||||
palOffset = (battlerId * 16) + 0x100;
|
||||
@ -1214,12 +1212,12 @@ void AllocateMonSpritesGfx(void)
|
||||
|
||||
for (i = 0; i < MAX_BATTLERS_COUNT; i++)
|
||||
{
|
||||
gMonSpritesGfxPtr->sprites[i] = gMonSpritesGfxPtr->firstDecompressed + (i * 0x2000);
|
||||
gMonSpritesGfxPtr->sprites.ptr[i] = gMonSpritesGfxPtr->firstDecompressed + (i * 0x2000);
|
||||
*(gMonSpritesGfxPtr->templates + i) = gUnknown_08329D98[i];
|
||||
|
||||
for (j = 0; j < 4; j++)
|
||||
{
|
||||
gMonSpritesGfxPtr->field_74[i][j].data = gMonSpritesGfxPtr->sprites[i] + (j * 0x800);
|
||||
gMonSpritesGfxPtr->field_74[i][j].data = gMonSpritesGfxPtr->sprites.ptr[i] + (j * 0x800);
|
||||
gMonSpritesGfxPtr->field_74[i][j].size = 0x800;
|
||||
}
|
||||
|
||||
@ -1241,10 +1239,10 @@ void FreeMonSpritesGfx(void)
|
||||
|
||||
FREE_AND_SET_NULL(gMonSpritesGfxPtr->barFontGfx);
|
||||
FREE_AND_SET_NULL(gMonSpritesGfxPtr->firstDecompressed);
|
||||
gMonSpritesGfxPtr->sprites[0] = NULL;
|
||||
gMonSpritesGfxPtr->sprites[1] = NULL;
|
||||
gMonSpritesGfxPtr->sprites[2] = NULL;
|
||||
gMonSpritesGfxPtr->sprites[3] = NULL;
|
||||
gMonSpritesGfxPtr->sprites.ptr[0] = NULL;
|
||||
gMonSpritesGfxPtr->sprites.ptr[1] = NULL;
|
||||
gMonSpritesGfxPtr->sprites.ptr[2] = NULL;
|
||||
gMonSpritesGfxPtr->sprites.ptr[3] = NULL;
|
||||
FREE_AND_SET_NULL(gMonSpritesGfxPtr);
|
||||
}
|
||||
|
||||
|
@ -586,7 +586,7 @@ void sub_8118FBC(int bgId, u8 arg1, u8 arg2, u8 battlerPosition, u8 arg4, u8 *ar
|
||||
int i, j;
|
||||
u8 battler = GetBattlerAtPosition(battlerPosition);
|
||||
int offset = tilesOffset;
|
||||
CpuCopy16(gMonSpritesGfxPtr->sprites[battlerPosition] + BG_SCREEN_SIZE * gBattleMonForms[battler], arg5, BG_SCREEN_SIZE);
|
||||
CpuCopy16(gMonSpritesGfxPtr->sprites.ptr[battlerPosition] + BG_SCREEN_SIZE * gBattleMonForms[battler], arg5, BG_SCREEN_SIZE);
|
||||
LoadBgTiles(bgId, arg5, 0x1000, tilesOffset);
|
||||
for (i = arg2; i < arg2 + 8; i++)
|
||||
{
|
||||
@ -604,7 +604,7 @@ void unref_sub_8119094(u8 arg0, u8 arg1, u8 battlerPosition, u8 arg3, u8 arg4, u
|
||||
{
|
||||
int i, j, offset;
|
||||
|
||||
DmaCopy16(3, gMonSpritesGfxPtr->sprites[battlerPosition] + BG_SCREEN_SIZE * arg3, (void *)BG_SCREEN_ADDR(0) + arg5, BG_SCREEN_SIZE);
|
||||
DmaCopy16(3, gMonSpritesGfxPtr->sprites.ptr[battlerPosition] + BG_SCREEN_SIZE * arg3, (void *)BG_SCREEN_ADDR(0) + arg5, BG_SCREEN_SIZE);
|
||||
offset = (arg5 >> 5) - (arg7 << 9);
|
||||
for (i = arg1; i < arg1 + 8; i++)
|
||||
{
|
||||
|
@ -229,6 +229,8 @@ EWRAM_DATA struct FieldTimer gFieldTimers = {0};
|
||||
EWRAM_DATA u8 gBattlerAbility = 0;
|
||||
EWRAM_DATA u16 gPartnerSpriteId = 0;
|
||||
EWRAM_DATA struct TotemBoost gTotemBoosts[MAX_BATTLERS_COUNT] = {0};
|
||||
EWRAM_DATA bool8 gHasFetchedBall = FALSE;
|
||||
EWRAM_DATA u8 gLastUsedBall = 0;
|
||||
|
||||
// IWRAM common vars
|
||||
void (*gPreBattleCallback1)(void);
|
||||
@ -1221,7 +1223,7 @@ static void CB2_HandleStartMultiPartnerBattle(void)
|
||||
case 16:
|
||||
if (BattleInitAllSprites(&gBattleCommunication[SPRITES_INIT_STATE1], &gBattleCommunication[SPRITES_INIT_STATE2]))
|
||||
{
|
||||
sub_8166188();
|
||||
TrySetLinkBattleTowerEnemyPartyLevel();
|
||||
gPreBattleCallback1 = gMain.callback1;
|
||||
gMain.callback1 = BattleMainCB1;
|
||||
SetMainCallback2(BattleMainCB2);
|
||||
@ -2622,7 +2624,7 @@ static void SpriteCB_AnimFaintOpponent(struct Sprite *sprite)
|
||||
}
|
||||
else // Erase bottom part of the sprite to create a smooth illusion of mon falling down.
|
||||
{
|
||||
u8 *dst = (u8 *)gMonSpritesGfxPtr->sprites[GetBattlerPosition(sprite->sBattler)] + (gBattleMonForms[sprite->sBattler] << 11) + (sprite->data[3] << 8);
|
||||
u8* dst = gMonSpritesGfxPtr->sprites.byte[GetBattlerPosition(sprite->sBattler)] + (gBattleMonForms[sprite->sBattler] << 11) + (sprite->data[3] << 8);
|
||||
|
||||
for (i = 0; i < 0x100; i++)
|
||||
*(dst++) = 0;
|
||||
@ -2887,6 +2889,9 @@ static void BattleStartClearSetData(void)
|
||||
gLastUsedMove = 0;
|
||||
gFieldStatuses = 0;
|
||||
|
||||
gHasFetchedBall = FALSE;
|
||||
gLastUsedBall = 0;
|
||||
|
||||
gBattlerAttacker = 0;
|
||||
gBattlerTarget = 0;
|
||||
gBattleWeather = 0;
|
||||
|
@ -584,7 +584,7 @@ static const u8 sText_ElectricTerrainEnds[] = _("The electricity disappeared\nfr
|
||||
static const u8 sText_MistyTerrainEnds[] = _("The mist disappeared\nfrom the battlefield.");
|
||||
static const u8 sText_PsychicTerrainEnds[] = _("The weirdness disappeared\nfrom the battlefield.");
|
||||
static const u8 sText_GrassyTerrainEnds[] = _("The grass disappeared\nfrom the battlefield.");
|
||||
static const u8 sText_AngryPointActivates[] = _("{B_DEF_NAME_WITH_PREFIX}'s {B_DEF_ABILITY} maxed\nits attack!");
|
||||
static const u8 sText_TargetsStatWasMaxedOut[] = _("{B_DEF_NAME_WITH_PREFIX}'s {B_DEF_ABILITY} maxed\nits {B_BUFF1}!");
|
||||
static const u8 sText_PoisonHealHpUp[] = _("The poisoning healed {B_ATK_NAME_WITH_PREFIX}\na little bit!");
|
||||
static const u8 sText_BadDreamsDmg[] = _("{B_DEF_NAME_WITH_PREFIX} is tormented\nby {B_ATK_ABILITY}!");
|
||||
static const u8 sText_MoldBreakerEnters[] = _("{B_SCR_ACTIVE_NAME_WITH_PREFIX} breaks the mold!");
|
||||
@ -686,9 +686,19 @@ static const u8 sText_FairyAuraActivates[] = _("{B_SCR_ACTIVE_NAME_WITH_PREFIX}
|
||||
static const u8 sText_AuraBreakActivates[] = _("{B_SCR_ACTIVE_NAME_WITH_PREFIX} reversed all\nother POKéMON's auras!");
|
||||
static const u8 sText_ComatoseActivates[] = _("{B_SCR_ACTIVE_NAME_WITH_PREFIX} is drowsing!");
|
||||
static const u8 sText_ScreenCleanerActivates[] = _("All screens on the field were\ncleansed!");
|
||||
static const u8 sText_FetchedPokeBall[] = _("{B_SCR_ACTIVE_NAME_WITH_PREFIX} found\na {B_LAST_ITEM}!");
|
||||
static const u8 sText_BattlerAbilityRaisedStat[] = _("{B_SCR_ACTIVE_NAME_WITH_PREFIX}'s {B_SCR_ACTIVE_ABILITY}\nraised its {B_BUFF1}!");
|
||||
static const u8 sText_ASandstormKickedUp[] = _("A sandstorm kicked up!");
|
||||
static const u8 sText_PkmnsWillPerishIn3Turns[] = _("Both Pokémon will perish\nin three turns!");
|
||||
static const u8 sText_AbilityRaisedStatDrastically[] = _("{B_DEF_ABILITY} raised {B_DEF_NAME_WITH_PREFIX}'s\n{B_BUFF1} drastically!");
|
||||
|
||||
const u8 *const gBattleStringsTable[BATTLESTRINGS_COUNT] =
|
||||
{
|
||||
[STRINGID_ABILITYRAISEDSTATDRASTICALLY - 12] = sText_AbilityRaisedStatDrastically,
|
||||
[STRINGID_PKMNSWILLPERISHIN3TURNS - 12] = sText_PkmnsWillPerishIn3Turns,
|
||||
[STRINGID_ASANDSTORMKICKEDUP - 12] = sText_ASandstormKickedUp,
|
||||
[STRINGID_BATTLERABILITYRAISEDSTAT - 12] = sText_BattlerAbilityRaisedStat,
|
||||
[STRINGID_FETCHEDPOKEBALL - 12] = sText_FetchedPokeBall,
|
||||
[STRINGID_STATWASNOTLOWERED - 12] = sText_StatWasNotLowered,
|
||||
[STRINGID_CLOAKEDINAFREEZINGLIGHT - 12] = sText_CloakedInAFreezingLight,
|
||||
[STRINGID_DESTINYKNOTACTIVATES - 12] = sText_DestinyKnotActivates,
|
||||
@ -1157,7 +1167,7 @@ const u8 *const gBattleStringsTable[BATTLESTRINGS_COUNT] =
|
||||
[STRINGID_PSYCHICTERRAINENDS - 12] = sText_PsychicTerrainEnds,
|
||||
[STRINGID_GRASSYTERRAINENDS - 12] = sText_GrassyTerrainEnds,
|
||||
[STRINGID_TARGETABILITYSTATRAISE - 12] = sText_TargetAbilityRaisedStat,
|
||||
[STRINGID_ANGRYPOINTACTIVATES - 12] = sText_AngryPointActivates,
|
||||
[STRINGID_TARGETSSTATWASMAXEDOUT - 12] = sText_TargetsStatWasMaxedOut,
|
||||
[STRINGID_ATTACKERABILITYSTATRAISE - 12] = sText_AttackerAbilityRaisedStat,
|
||||
[STRINGID_POISONHEALHPUP - 12] = sText_PoisonHealHpUp,
|
||||
[STRINGID_BADDREAMSDMG - 12] = sText_BadDreamsDmg,
|
||||
@ -2688,8 +2698,7 @@ static const u8* TryGetStatusString(u8 *src)
|
||||
statusPtr = status;
|
||||
for (i = 0; i < 8; i++)
|
||||
{
|
||||
if (*src == EOS)
|
||||
break;
|
||||
if (*src == EOS) break; // one line required to match -g
|
||||
*statusPtr = *src;
|
||||
src++;
|
||||
statusPtr++;
|
||||
|
@ -1757,7 +1757,9 @@ static bool8 SetPyramidObjectPositionsInAndNearSquare(u8 objType, u8 squareId)
|
||||
|
||||
r7 &= 1;
|
||||
}
|
||||
// free(floorLayoutOffsets); BUG: floorLayoutOffsets memory not freed
|
||||
#ifdef BUGFIX
|
||||
free(floorLayoutOffsets);
|
||||
#endif
|
||||
|
||||
return (numObjects / 2) > numPlacedObjects;
|
||||
}
|
||||
@ -1809,7 +1811,9 @@ static bool8 SetPyramidObjectPositionsNearSquare(u8 objType, u8 squareId)
|
||||
if (r8 == 4)
|
||||
break;
|
||||
}
|
||||
// free(floorLayoutOffsets); BUG: floorLayoutOffsets memory not freed
|
||||
#ifdef BUGFIX
|
||||
free(floorLayoutOffsets);
|
||||
#endif
|
||||
|
||||
return (numObjects / 2) > numPlacedObjects;
|
||||
}
|
||||
|
@ -1273,7 +1273,7 @@ static void Cmd_attackcanceler(void)
|
||||
|
||||
// Check Protean activation.
|
||||
GET_MOVE_TYPE(gCurrentMove, moveType);
|
||||
if (GetBattlerAbility(gBattlerAttacker) == ABILITY_PROTEAN
|
||||
if ((GetBattlerAbility(gBattlerAttacker) == ABILITY_PROTEAN || GetBattlerAbility(gBattlerAttacker) == ABILITY_LIBERO)
|
||||
&& (gBattleMons[gBattlerAttacker].type1 != moveType || gBattleMons[gBattlerAttacker].type2 != moveType ||
|
||||
(gBattleMons[gBattlerAttacker].type3 != moveType && gBattleMons[gBattlerAttacker].type3 != TYPE_MYSTERY))
|
||||
&& gCurrentMove != MOVE_STRUGGLE)
|
||||
@ -1328,7 +1328,7 @@ static void Cmd_attackcanceler(void)
|
||||
}
|
||||
|
||||
if (gProtectStructs[gBattlerTarget].bounceMove
|
||||
&& gBattleMoves[gCurrentMove].flags & FLAG_MAGICCOAT_AFFECTED
|
||||
&& gBattleMoves[gCurrentMove].flags & FLAG_MAGIC_COAT_AFFECTED
|
||||
&& !gProtectStructs[gBattlerAttacker].usesBouncedMove)
|
||||
{
|
||||
PressurePPLose(gBattlerAttacker, gBattlerTarget, MOVE_MAGIC_COAT);
|
||||
@ -1340,7 +1340,7 @@ static void Cmd_attackcanceler(void)
|
||||
return;
|
||||
}
|
||||
else if (GetBattlerAbility(gBattlerTarget) == ABILITY_MAGIC_BOUNCE
|
||||
&& gBattleMoves[gCurrentMove].flags & FLAG_MAGICCOAT_AFFECTED
|
||||
&& gBattleMoves[gCurrentMove].flags & FLAG_MAGIC_COAT_AFFECTED
|
||||
&& !gProtectStructs[gBattlerAttacker].usesBouncedMove)
|
||||
{
|
||||
RecordAbilityBattle(gBattlerTarget, ABILITY_MAGIC_BOUNCE);
|
||||
@ -5261,11 +5261,11 @@ bool32 CanBattlerSwitch(u32 battlerId)
|
||||
else
|
||||
party = gPlayerParty;
|
||||
|
||||
i = 0;
|
||||
lastMonId = 0;
|
||||
if (battlerId & 2)
|
||||
i = 3;
|
||||
lastMonId = 3;
|
||||
|
||||
for (lastMonId = i + 3; i < lastMonId; i++)
|
||||
for (i = lastMonId; i < lastMonId + 3; i++)
|
||||
{
|
||||
if (GetMonData(&party[i], MON_DATA_SPECIES) != SPECIES_NONE
|
||||
&& !GetMonData(&party[i], MON_DATA_IS_EGG)
|
||||
@ -5274,7 +5274,7 @@ bool32 CanBattlerSwitch(u32 battlerId)
|
||||
break;
|
||||
}
|
||||
|
||||
ret = (i != lastMonId);
|
||||
ret = (i != lastMonId + 3);
|
||||
}
|
||||
else if (gBattleTypeFlags & BATTLE_TYPE_MULTI)
|
||||
{
|
||||
@ -5284,18 +5284,18 @@ bool32 CanBattlerSwitch(u32 battlerId)
|
||||
{
|
||||
party = gPlayerParty;
|
||||
|
||||
i = 0;
|
||||
lastMonId = 0;
|
||||
if (GetLinkTrainerFlankId(GetBattlerMultiplayerId(battlerId)) == TRUE)
|
||||
i = 3;
|
||||
lastMonId = 3;
|
||||
}
|
||||
else
|
||||
{
|
||||
party = gEnemyParty;
|
||||
|
||||
if (battlerId == 1)
|
||||
i = 0;
|
||||
lastMonId = 0;
|
||||
else
|
||||
i = 3;
|
||||
lastMonId = 3;
|
||||
}
|
||||
}
|
||||
else
|
||||
@ -5305,12 +5305,12 @@ bool32 CanBattlerSwitch(u32 battlerId)
|
||||
else
|
||||
party = gPlayerParty;
|
||||
|
||||
i = 0;
|
||||
lastMonId = 0;
|
||||
if (GetLinkTrainerFlankId(GetBattlerMultiplayerId(battlerId)) == TRUE)
|
||||
i = 3;
|
||||
lastMonId = 3;
|
||||
}
|
||||
|
||||
for (lastMonId = i + 3; i < lastMonId; i++)
|
||||
for (i = lastMonId; i < lastMonId + 3; i++)
|
||||
{
|
||||
if (GetMonData(&party[i], MON_DATA_SPECIES) != SPECIES_NONE
|
||||
&& !GetMonData(&party[i], MON_DATA_IS_EGG)
|
||||
@ -5319,17 +5319,17 @@ bool32 CanBattlerSwitch(u32 battlerId)
|
||||
break;
|
||||
}
|
||||
|
||||
ret = (i != lastMonId);
|
||||
ret = (i != lastMonId + 3);
|
||||
}
|
||||
else if (gBattleTypeFlags & BATTLE_TYPE_TWO_OPPONENTS && GetBattlerSide(battlerId) == B_SIDE_OPPONENT)
|
||||
{
|
||||
party = gEnemyParty;
|
||||
|
||||
i = 0;
|
||||
lastMonId = 0;
|
||||
if (battlerId == B_POSITION_OPPONENT_RIGHT)
|
||||
i = 3;
|
||||
lastMonId = 3;
|
||||
|
||||
for (lastMonId = i + 3; i < lastMonId; i++)
|
||||
for (i = lastMonId; i < lastMonId + 3; i++)
|
||||
{
|
||||
if (GetMonData(&party[i], MON_DATA_SPECIES) != SPECIES_NONE
|
||||
&& !GetMonData(&party[i], MON_DATA_IS_EGG)
|
||||
@ -5338,7 +5338,7 @@ bool32 CanBattlerSwitch(u32 battlerId)
|
||||
break;
|
||||
}
|
||||
|
||||
ret = (i != lastMonId);
|
||||
ret = (i != lastMonId + 3);
|
||||
}
|
||||
else
|
||||
{
|
||||
@ -5627,14 +5627,9 @@ static void Cmd_openpartyscreen(void)
|
||||
hitmarkerFaintBits = gHitMarker >> 0x1C;
|
||||
|
||||
gBattlerFainted = 0;
|
||||
while (1)
|
||||
{
|
||||
if (gBitTable[gBattlerFainted] & hitmarkerFaintBits)
|
||||
break;
|
||||
if (gBattlerFainted >= gBattlersCount)
|
||||
break;
|
||||
while (!(gBitTable[gBattlerFainted] & hitmarkerFaintBits)
|
||||
&& gBattlerFainted < gBattlersCount)
|
||||
gBattlerFainted++;
|
||||
}
|
||||
|
||||
if (gBattlerFainted == gBattlersCount)
|
||||
gBattlescriptCurrInstr = jumpPtr;
|
||||
@ -8621,7 +8616,9 @@ static void Cmd_manipulatedamage(void)
|
||||
gBattleMoveDamage /= 2;
|
||||
if (gBattleMoveDamage == 0)
|
||||
gBattleMoveDamage = 1;
|
||||
if (B_RECOIL_IF_MISS_DMG >= GEN_5 || ((gBattleMons[gBattlerTarget].maxHP / 2) < gBattleMoveDamage))
|
||||
if (B_RECOIL_IF_MISS_DMG >= GEN_5)
|
||||
gBattleMoveDamage = gBattleMons[gBattlerAttacker].maxHP / 2;
|
||||
if ((B_RECOIL_IF_MISS_DMG <= GEN_4) && ((gBattleMons[gBattlerTarget].maxHP / 2) < gBattleMoveDamage))
|
||||
gBattleMoveDamage = gBattleMons[gBattlerTarget].maxHP / 2;
|
||||
break;
|
||||
case DMG_DOUBLED:
|
||||
@ -8644,6 +8641,9 @@ static void Cmd_manipulatedamage(void)
|
||||
case DMG_1_2_ATTACKER_HP:
|
||||
gBattleMoveDamage = gBattleMons[gBattlerAttacker].maxHP / 2;
|
||||
break;
|
||||
case DMG_RECOIL_FROM_IMMUNE:
|
||||
gBattleMoveDamage = gBattleMons[gBattlerTarget].maxHP / 2;
|
||||
break;
|
||||
}
|
||||
|
||||
gBattlescriptCurrInstr += 2;
|
||||
@ -12037,6 +12037,9 @@ static void Cmd_handleballthrow(void)
|
||||
}
|
||||
else // not caught
|
||||
{
|
||||
if (!gHasFetchedBall)
|
||||
gLastUsedBall = gLastUsedItem;
|
||||
|
||||
if (IsCriticalCapture())
|
||||
gBattleCommunication[MULTISTRING_CHOOSER] = shakes + 3;
|
||||
else
|
||||
|
@ -1582,8 +1582,7 @@ static s32 TrainerIdToRematchTableId(const struct RematchTrainer *table, u16 tra
|
||||
{
|
||||
for (j = 0; j < REMATCHES_COUNT; j++)
|
||||
{
|
||||
if (table[i].trainerIds[j] == 0)
|
||||
break;
|
||||
if (table[i].trainerIds[j] == 0) break; // one line required to match -g
|
||||
if (table[i].trainerIds[j] == trainerId)
|
||||
return i;
|
||||
}
|
||||
|
@ -354,11 +354,7 @@ static void GenerateOpponentMons(void)
|
||||
{
|
||||
u16 trainerId;
|
||||
s32 i, j, k;
|
||||
#ifndef NONMATCHING
|
||||
register const u16 *monSet asm("r9"); // Fix me. Compiler insists on moving that variable into stack.
|
||||
#else
|
||||
const u16 *monSet;
|
||||
#endif
|
||||
const u16 *monSet;
|
||||
u16 species[FRONTIER_PARTY_SIZE];
|
||||
u16 heldItems[FRONTIER_PARTY_SIZE];
|
||||
s32 monId = 0;
|
||||
@ -379,7 +375,8 @@ static void GenerateOpponentMons(void)
|
||||
} while (i != gSaveBlock2Ptr->frontier.curChallengeBattleNum);
|
||||
|
||||
gTrainerBattleOpponent_A = trainerId;
|
||||
while (gFacilityTrainers[gTrainerBattleOpponent_A].monSet[monId] != 0xFFFF)
|
||||
monSet = gFacilityTrainers[gTrainerBattleOpponent_A].monSet;
|
||||
while (monSet[monId] != 0xFFFF)
|
||||
monId++;
|
||||
if (monId > 8)
|
||||
break;
|
||||
|
@ -57,12 +57,12 @@ static void SetTowerBattleWon(void);
|
||||
static void AwardBattleTowerRibbons(void);
|
||||
static void SaveTowerChallenge(void);
|
||||
static void GetOpponentIntroSpeech(void);
|
||||
static void nullsub_61(void);
|
||||
static void nullsub_116(void);
|
||||
static void BattleTowerNop1(void);
|
||||
static void BattleTowerNop2(void);
|
||||
static void LoadMultiPartnerCandidatesData(void);
|
||||
static void ShowPartnerCandidateMessage(void);
|
||||
static void LoadLinkMultiOpponentsData(void);
|
||||
static void sub_8164DCC(void);
|
||||
static void TowerTryCloseLink(void);
|
||||
static void SetMultiPartnerGfx(void);
|
||||
static void SetTowerInterviewData(void);
|
||||
static void ValidateBattleTowerRecordChecksums(void);
|
||||
@ -811,12 +811,12 @@ static void (* const sBattleTowerFuncs[])(void) =
|
||||
[BATTLE_TOWER_FUNC_GIVE_RIBBONS] = AwardBattleTowerRibbons,
|
||||
[BATTLE_TOWER_FUNC_SAVE] = SaveTowerChallenge,
|
||||
[BATTLE_TOWER_FUNC_GET_OPPONENT_INTRO] = GetOpponentIntroSpeech,
|
||||
[BATTLE_TOWER_FUNC_NOP] = nullsub_61,
|
||||
[BATTLE_TOWER_FUNC_NOP2] = nullsub_116,
|
||||
[BATTLE_TOWER_FUNC_NOP] = BattleTowerNop1,
|
||||
[BATTLE_TOWER_FUNC_NOP2] = BattleTowerNop2,
|
||||
[BATTLE_TOWER_FUNC_LOAD_PARTNERS] = LoadMultiPartnerCandidatesData,
|
||||
[BATTLE_TOWER_FUNC_PARTNER_MSG] = ShowPartnerCandidateMessage,
|
||||
[BATTLE_TOWER_FUNC_LOAD_LINK_OPPONENTS] = LoadLinkMultiOpponentsData,
|
||||
[BATTLE_TOWER_FUNC_13] = sub_8164DCC,
|
||||
[BATTLE_TOWER_FUNC_TRY_CLOSE_LINK] = TowerTryCloseLink,
|
||||
[BATTLE_TOWER_FUNC_SET_PARTNER_GFX] = SetMultiPartnerGfx,
|
||||
[BATTLE_TOWER_FUNC_SET_INTERVIEW_DATA] = SetTowerInterviewData,
|
||||
};
|
||||
@ -999,7 +999,7 @@ static bool8 ChooseSpecialBattleTowerTrainer(void)
|
||||
return FALSE;
|
||||
|
||||
winStreak = GetCurrentBattleTowerWinStreak(lvlMode, battleMode);
|
||||
for (i = 0; i < 5; i++)
|
||||
for (i = 0; i < BATTLE_TOWER_RECORD_COUNT; i++)
|
||||
{
|
||||
u32 *record = (u32*)(&gSaveBlock2Ptr->frontier.towerRecords[i]);
|
||||
u32 recordHasData = 0;
|
||||
@ -1010,7 +1010,7 @@ static bool8 ChooseSpecialBattleTowerTrainer(void)
|
||||
checksum += record[j];
|
||||
}
|
||||
validMons = 0;
|
||||
for (j = 0; j < 4; j++)
|
||||
for (j = 0; j < MAX_FRONTIER_PARTY_SIZE; j++)
|
||||
{
|
||||
if (gSaveBlock2Ptr->frontier.towerRecords[i].party[j].species != 0
|
||||
&& gSaveBlock2Ptr->frontier.towerRecords[i].party[j].level <= GetFrontierEnemyMonLevel(lvlMode))
|
||||
@ -1324,7 +1324,7 @@ void PutNewBattleTowerRecord(struct EmeraldBattleTowerRecord *newRecordEm)
|
||||
struct EmeraldBattleTowerRecord *newRecord = newRecordEm; // Needed to match.
|
||||
|
||||
// Find a record slot of the same player and replace it.
|
||||
for (i = 0; i < 5; i++)
|
||||
for (i = 0; i < BATTLE_TOWER_RECORD_COUNT; i++)
|
||||
{
|
||||
k = 0;
|
||||
for (j = 0; j < TRAINER_ID_LENGTH; j++)
|
||||
@ -1336,10 +1336,15 @@ void PutNewBattleTowerRecord(struct EmeraldBattleTowerRecord *newRecordEm)
|
||||
{
|
||||
for (k = 0; k < PLAYER_NAME_LENGTH; k++)
|
||||
{
|
||||
// BUG: Wrong variable used, 'j' instead of 'k'.
|
||||
#ifdef BUGFIX
|
||||
if (gSaveBlock2Ptr->frontier.towerRecords[i].name[k] != newRecord->name[k])
|
||||
break;
|
||||
if (newRecord->name[k] == EOS)
|
||||
#else
|
||||
if (gSaveBlock2Ptr->frontier.towerRecords[i].name[j] != newRecord->name[j])
|
||||
break;
|
||||
if (newRecord->name[j] == EOS)
|
||||
#endif
|
||||
{
|
||||
k = PLAYER_NAME_LENGTH;
|
||||
break;
|
||||
@ -1350,19 +1355,19 @@ void PutNewBattleTowerRecord(struct EmeraldBattleTowerRecord *newRecordEm)
|
||||
if (k == PLAYER_NAME_LENGTH)
|
||||
break;
|
||||
}
|
||||
if (i < 5)
|
||||
if (i < BATTLE_TOWER_RECORD_COUNT)
|
||||
{
|
||||
gSaveBlock2Ptr->frontier.towerRecords[i] = *newRecord;
|
||||
return;
|
||||
}
|
||||
|
||||
// Find an empty record slot.
|
||||
for (i = 0; i < 5; i++)
|
||||
for (i = 0; i < BATTLE_TOWER_RECORD_COUNT; i++)
|
||||
{
|
||||
if (gSaveBlock2Ptr->frontier.towerRecords[i].winStreak == 0)
|
||||
break;
|
||||
}
|
||||
if (i < 5)
|
||||
if (i < BATTLE_TOWER_RECORD_COUNT)
|
||||
{
|
||||
gSaveBlock2Ptr->frontier.towerRecords[i] = *newRecord;
|
||||
return;
|
||||
@ -1373,7 +1378,7 @@ void PutNewBattleTowerRecord(struct EmeraldBattleTowerRecord *newRecordEm)
|
||||
slotIds[0] = 0;
|
||||
slotsCount++;
|
||||
|
||||
for (i = 1; i < 5; i++)
|
||||
for (i = 1; i < BATTLE_TOWER_RECORD_COUNT; i++)
|
||||
{
|
||||
for (j = 0; j < slotsCount; j++)
|
||||
{
|
||||
@ -1551,7 +1556,7 @@ void GetFrontierTrainerName(u8 *dst, u16 trainerId)
|
||||
{
|
||||
if (gBattleTypeFlags & BATTLE_TYPE_RECORDED)
|
||||
{
|
||||
sub_8186468(dst);
|
||||
GetRecordedBattleRecordMixFriendName(dst);
|
||||
return;
|
||||
}
|
||||
else
|
||||
@ -2070,7 +2075,7 @@ void DoSpecialTrainerBattle(void)
|
||||
if (gTrainerBattleOpponent_A == TRAINER_FRONTIER_BRAIN)
|
||||
FillFrontierTrainerParty(DOME_BATTLE_PARTY_SIZE);
|
||||
CreateTask(Task_StartBattleAfterTransition, 1);
|
||||
sub_806E694(0);
|
||||
CreateTask_PlayMapChosenOrBattleBGM(0);
|
||||
BattleTransition_StartOnField(GetSpecialBattleTransition(3));
|
||||
break;
|
||||
case SPECIAL_BATTLE_PALACE:
|
||||
@ -2178,7 +2183,7 @@ static void SaveCurrentWinStreak(void)
|
||||
gSaveBlock2Ptr->frontier.towerWinStreaks[battleMode][lvlMode] = winStreak;
|
||||
}
|
||||
|
||||
static void sub_8163EE4(void)
|
||||
static void SaveBattleTowerRecord(void)
|
||||
{
|
||||
s32 i;
|
||||
u8 lvlMode, battleMode, class;
|
||||
@ -2217,7 +2222,7 @@ static void sub_8163EE4(void)
|
||||
for (i = 0; i < MAX_FRONTIER_PARTY_SIZE; i++)
|
||||
{
|
||||
if (gSaveBlock2Ptr->frontier.selectedPartyMons[i] != 0)
|
||||
sub_80686FC(&gPlayerParty[gSaveBlock2Ptr->frontier.selectedPartyMons[i] - 1], &playerRecord->party[i]);
|
||||
ConvertPokemonToBattleTowerPokemon(&gPlayerParty[gSaveBlock2Ptr->frontier.selectedPartyMons[i] - 1], &playerRecord->party[i]);
|
||||
}
|
||||
|
||||
playerRecord->language = gGameLanguage;
|
||||
@ -2232,7 +2237,7 @@ static void SaveTowerChallenge(void)
|
||||
s32 challengeNum = (signed)(gSaveBlock2Ptr->frontier.towerWinStreaks[battleMode][lvlMode] / 7);
|
||||
|
||||
if (gSpecialVar_0x8005 == 0 && (challengeNum > 1 || gSaveBlock2Ptr->frontier.curChallengeBattleNum != 0))
|
||||
sub_8163EE4();
|
||||
SaveBattleTowerRecord();
|
||||
|
||||
gSaveBlock2Ptr->frontier.challengeStatus = gSpecialVar_0x8005;
|
||||
VarSet(VAR_TEMP_0, 0);
|
||||
@ -2240,12 +2245,12 @@ static void SaveTowerChallenge(void)
|
||||
SaveGameFrontier();
|
||||
}
|
||||
|
||||
static void nullsub_61(void)
|
||||
static void BattleTowerNop1(void)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
static void nullsub_116(void)
|
||||
static void BattleTowerNop2(void)
|
||||
{
|
||||
|
||||
}
|
||||
@ -2284,7 +2289,7 @@ static void GetRecordMixFriendMultiPartnerParty(u16 trainerId)
|
||||
u16 species2 = GetMonData(&gPlayerParty[1], MON_DATA_SPECIES, NULL);
|
||||
|
||||
count = 0;
|
||||
for (i = 0; i < 4; i++)
|
||||
for (i = 0; i < MAX_FRONTIER_PARTY_SIZE; i++)
|
||||
{
|
||||
if (gSaveBlock2Ptr->frontier.towerRecords[trainerId - TRAINER_RECORD_MIXING_FRIEND].party[i].species != species1
|
||||
&& gSaveBlock2Ptr->frontier.towerRecords[trainerId - TRAINER_RECORD_MIXING_FRIEND].party[i].species != species2
|
||||
@ -2406,7 +2411,7 @@ static void LoadMultiPartnerCandidatesData(void)
|
||||
}
|
||||
|
||||
r10 = 0;
|
||||
for (i = 0; i < 5; i++)
|
||||
for (i = 0; i < BATTLE_TOWER_RECORD_COUNT; i++)
|
||||
{
|
||||
u32 *record = (u32*)(&gSaveBlock2Ptr->frontier.towerRecords[i]);
|
||||
u32 recordHasData = 0;
|
||||
@ -2423,7 +2428,7 @@ static void LoadMultiPartnerCandidatesData(void)
|
||||
&& gSaveBlock2Ptr->frontier.towerRecords[i].checksum == checksum)
|
||||
{
|
||||
k = 0;
|
||||
for (j = 0; j < 4; j++)
|
||||
for (j = 0; j < MAX_FRONTIER_PARTY_SIZE; j++)
|
||||
{
|
||||
if (species1 != gSaveBlock2Ptr->frontier.towerRecords[i].party[j].species
|
||||
&& species2 != gSaveBlock2Ptr->frontier.towerRecords[i].party[j].species
|
||||
@ -2449,7 +2454,7 @@ static void LoadMultiPartnerCandidatesData(void)
|
||||
}
|
||||
}
|
||||
|
||||
static void sub_81646BC(u16 trainerId, u16 monId)
|
||||
static void GetPotentialPartnerMoveAndSpecies(u16 trainerId, u16 monId)
|
||||
{
|
||||
u16 move = 0;
|
||||
u16 species = 0;
|
||||
@ -2484,6 +2489,14 @@ static void sub_81646BC(u16 trainerId, u16 monId)
|
||||
StringCopy(gStringVar2, gSpeciesNames[species]);
|
||||
}
|
||||
|
||||
// For multi battles in the Battle Tower, the player may choose a partner by talking to them
|
||||
// These partners can be an NPC or a former/record-mixed Apprentice
|
||||
// When talked to, their response consists of:
|
||||
// PARTNER_MSGID_INTRO - A greeting
|
||||
// PARTNER_MSGID_MON1 - Naming one pokemon on their team, and a move it has
|
||||
// PARTNER_MSGID_MON2_ASK - Naming a second pokemon on their team, a move it has, and asking if they'd like to be their partner
|
||||
// PARTNER_MSGID_ACCEPT - If the player agrees to be their partner
|
||||
// PARTNER_MSGID_REJECT - If the player declines to be their partner
|
||||
static void ShowPartnerCandidateMessage(void)
|
||||
{
|
||||
s32 i, j, partnerId;
|
||||
@ -2526,11 +2539,11 @@ static void ShowPartnerCandidateMessage(void)
|
||||
break;
|
||||
case PARTNER_MSGID_MON1:
|
||||
monId = gSaveBlock2Ptr->frontier.trainerIds[8 + k * 2];
|
||||
sub_81646BC(trainerId, monId);
|
||||
GetPotentialPartnerMoveAndSpecies(trainerId, monId);
|
||||
break;
|
||||
case PARTNER_MSGID_MON2_ASK:
|
||||
monId = gSaveBlock2Ptr->frontier.trainerIds[9 + k * 2];
|
||||
sub_81646BC(trainerId, monId);
|
||||
GetPotentialPartnerMoveAndSpecies(trainerId, monId);
|
||||
break;
|
||||
case PARTNER_MSGID_ACCEPT:
|
||||
gPartnerTrainerId = trainerId;
|
||||
@ -2682,7 +2695,7 @@ static void LoadLinkMultiOpponentsData(void)
|
||||
}
|
||||
}
|
||||
|
||||
static void sub_8164DCC(void)
|
||||
static void TowerTryCloseLink(void)
|
||||
{
|
||||
if (gWirelessCommType != 0)
|
||||
SetCloseLinkCallback();
|
||||
@ -2726,7 +2739,7 @@ static void ValidateBattleTowerRecordChecksums(void)
|
||||
if (gSaveBlock2Ptr->frontier.towerPlayer.checksum != checksum)
|
||||
ClearBattleTowerRecord(&gSaveBlock2Ptr->frontier.towerPlayer);
|
||||
|
||||
for (i = 0; i < 5; i++)
|
||||
for (i = 0; i < BATTLE_TOWER_RECORD_COUNT; i++)
|
||||
{
|
||||
record = (u32*)(&gSaveBlock2Ptr->frontier.towerRecords[i]);
|
||||
checksum = 0;
|
||||
@ -2877,7 +2890,7 @@ static void FillEReaderTrainerWithPlayerData(void)
|
||||
}
|
||||
|
||||
for (i = 0; i < 3; i++)
|
||||
sub_80686FC(&gPlayerParty[i], &ereaderTrainer->party[i]);
|
||||
ConvertPokemonToBattleTowerPokemon(&gPlayerParty[i], &ereaderTrainer->party[i]);
|
||||
|
||||
SetEReaderTrainerChecksum(ereaderTrainer);
|
||||
}
|
||||
@ -3000,7 +3013,12 @@ static void FillPartnerParty(u16 trainerId)
|
||||
sStevenMons[i].species,
|
||||
sStevenMons[i].level,
|
||||
sStevenMons[i].fixedIV,
|
||||
TRUE, i, // BUG: personality was stored in the 'j' variable. As a result, Steven's pokemon do not have the intended natures.
|
||||
TRUE,
|
||||
#ifdef BUGFIX
|
||||
j,
|
||||
#else
|
||||
i, // BUG: personality was stored in the 'j' variable. As a result, Steven's pokemon do not have the intended natures.
|
||||
#endif
|
||||
OT_ID_PRESET, STEVEN_OTID);
|
||||
for (j = 0; j < PARTY_SIZE; j++)
|
||||
SetMonData(&gPlayerParty[MULTI_PARTY_SIZE + i], MON_DATA_HP_EV + j, &sStevenMons[i].evs[j]);
|
||||
@ -3172,9 +3190,12 @@ bool32 RubyBattleTowerRecordToEmerald(struct RSBattleTowerRecord *src, struct Em
|
||||
{
|
||||
dst->lvlMode = src->lvlMode;
|
||||
dst->winStreak = src->winStreak;
|
||||
// BUG: Reading outside the array. sRubyFacilityClassToEmerald has less than FACILITY_CLASSES_COUNT entries.
|
||||
// Fix by using ARRAY_COUNT(sRubyFacilityClassToEmerald)
|
||||
// UB: Reading outside the array. sRubyFacilityClassToEmerald has less than FACILITY_CLASSES_COUNT entries.
|
||||
#ifdef UBFIX
|
||||
for (i = 0; i < ARRAY_COUNT(sRubyFacilityClassToEmerald); i++)
|
||||
#else
|
||||
for (i = 0; i < FACILITY_CLASSES_COUNT; i++)
|
||||
#endif
|
||||
{
|
||||
if (sRubyFacilityClassToEmerald[i][0] == src->facilityClass)
|
||||
break;
|
||||
@ -3222,9 +3243,12 @@ bool32 EmeraldBattleTowerRecordToRuby(struct EmeraldBattleTowerRecord *src, stru
|
||||
{
|
||||
dst->lvlMode = src->lvlMode;
|
||||
dst->winStreak = src->winStreak;
|
||||
// BUG: Reading outside the array. sRubyFacilityClassToEmerald has less than FACILITY_CLASSES_COUNT entries.
|
||||
// Fix by using ARRAY_COUNT(sRubyFacilityClassToEmerald) instead
|
||||
// UB: Reading outside the array. sRubyFacilityClassToEmerald has less than FACILITY_CLASSES_COUNT entries.
|
||||
#ifdef UBFIX
|
||||
for (i = 0; i < ARRAY_COUNT(sRubyFacilityClassToEmerald); i++)
|
||||
#else
|
||||
for (i = 0; i < FACILITY_CLASSES_COUNT; i++)
|
||||
#endif
|
||||
{
|
||||
if (sRubyFacilityClassToEmerald[i][1] == src->facilityClass)
|
||||
break;
|
||||
@ -3386,16 +3410,16 @@ static u8 GetFrontierTrainerFixedIvs(u16 trainerId)
|
||||
return fixedIv;
|
||||
}
|
||||
|
||||
static u16 sub_8165D40(void)
|
||||
static u16 GetBattleTentTrainerId(void)
|
||||
{
|
||||
u32 facility = VarGet(VAR_FRONTIER_FACILITY);
|
||||
|
||||
if (facility == FRONTIER_FACILITY_PALACE)
|
||||
return Random() % 30;
|
||||
else if (facility == FRONTIER_FACILITY_ARENA)
|
||||
return Random() % 30;
|
||||
else if (facility == FRONTIER_FACILITY_FACTORY)
|
||||
return Random() % 30;
|
||||
if (facility == FRONTIER_FACILITY_PALACE) // Verdanturf Tent; uses Palace mechanics
|
||||
return Random() % NUM_BATTLE_TENT_TRAINERS;
|
||||
else if (facility == FRONTIER_FACILITY_ARENA) // Fallarbor Tent; uses Arena mechanics
|
||||
return Random() % NUM_BATTLE_TENT_TRAINERS;
|
||||
else if (facility == FRONTIER_FACILITY_FACTORY) // Slateport Tent; uses Factory mechanics
|
||||
return Random() % NUM_BATTLE_TENT_TRAINERS;
|
||||
else if (facility == FRONTIER_FACILITY_TOWER)
|
||||
return 0;
|
||||
else
|
||||
@ -3442,7 +3466,7 @@ static void SetNextBattleTentOpponent(void)
|
||||
|
||||
do
|
||||
{
|
||||
trainerId = sub_8165D40();
|
||||
trainerId = GetBattleTentTrainerId();
|
||||
for (i = 0; i < gSaveBlock2Ptr->frontier.curChallengeBattleNum; i++)
|
||||
{
|
||||
if (gSaveBlock2Ptr->frontier.trainerIds[i] == trainerId)
|
||||
@ -3605,7 +3629,7 @@ bool32 ValidateBattleTowerRecord(u8 recordId) // unused
|
||||
}
|
||||
}
|
||||
|
||||
void sub_8166188(void)
|
||||
void TrySetLinkBattleTowerEnemyPartyLevel(void)
|
||||
{
|
||||
if (gBattleTypeFlags & (BATTLE_TYPE_LINK | BATTLE_TYPE_x2000000))
|
||||
{
|
||||
|
@ -1956,10 +1956,7 @@ static bool8 Phase2_Ripple_Func2(struct Task *task)
|
||||
for (i = 0; i < 160; i++, r4 += r8)
|
||||
{
|
||||
s16 var = r4 >> 8;
|
||||
|
||||
var++;
|
||||
var--;
|
||||
gScanlineEffectRegBuffers[0][i] = sTransitionStructPtr->field_16 + Sin(var, r3);
|
||||
gScanlineEffectRegBuffers[0][i] = sTransitionStructPtr->field_16 + Sin(var & 0xffff, r3);
|
||||
}
|
||||
|
||||
if (++task->tData3 == 81)
|
||||
|
@ -140,7 +140,9 @@ void HandleAction_UseMove(void)
|
||||
if (gSideTimers[side].followmeTimer != 0
|
||||
&& gBattleMoves[gCurrentMove].target == MOVE_TARGET_SELECTED
|
||||
&& GetBattlerSide(gBattlerAttacker) != GetBattlerSide(gSideTimers[side].followmeTarget)
|
||||
&& gBattleMons[gSideTimers[side].followmeTarget].hp != 0)
|
||||
&& gBattleMons[gSideTimers[side].followmeTarget].hp != 0
|
||||
&& (GetBattlerAbility(gBattlerAttacker) != ABILITY_PROPELLER_TAIL
|
||||
|| GetBattlerAbility(gBattlerAttacker) != ABILITY_STALWART))
|
||||
{
|
||||
gBattlerTarget = gSideTimers[side].followmeTarget;
|
||||
}
|
||||
@ -158,9 +160,10 @@ void HandleAction_UseMove(void)
|
||||
if (side != GetBattlerSide(gActiveBattler)
|
||||
&& *(gBattleStruct->moveTarget + gBattlerAttacker) != gActiveBattler
|
||||
&& ((GetBattlerAbility(gActiveBattler) == ABILITY_LIGHTNING_ROD && moveType == TYPE_ELECTRIC)
|
||||
|| (GetBattlerAbility(gActiveBattler) == ABILITY_STORM_DRAIN && moveType == TYPE_WATER)
|
||||
)
|
||||
&& GetBattlerTurnOrderNum(gActiveBattler) < var)
|
||||
|| (GetBattlerAbility(gActiveBattler) == ABILITY_STORM_DRAIN && moveType == TYPE_WATER))
|
||||
&& GetBattlerTurnOrderNum(gActiveBattler) < var
|
||||
&& (GetBattlerAbility(gBattlerAttacker) != ABILITY_PROPELLER_TAIL
|
||||
|| GetBattlerAbility(gBattlerAttacker) != ABILITY_STALWART))
|
||||
{
|
||||
var = GetBattlerTurnOrderNum(gActiveBattler);
|
||||
}
|
||||
@ -589,9 +592,12 @@ void HandleAction_ThrowPokeblock(void)
|
||||
gBattleStruct->safariPkblThrowCounter++;
|
||||
if (gBattleStruct->safariEscapeFactor > 1)
|
||||
{
|
||||
// BUG: The safariEscapeFactor is unintetionally able to become 0 (but it can not become negative!). This causes the pokeblock throw glitch.
|
||||
// To fix that change the < in the if statement below to <=.
|
||||
// BUG: safariEscapeFactor can become 0 below. This causes the pokeblock throw glitch.
|
||||
#ifdef BUGFIX
|
||||
if (gBattleStruct->safariEscapeFactor <= sPkblToEscapeFactor[gBattleStruct->safariPkblThrowCounter][gBattleCommunication[MULTISTRING_CHOOSER]])
|
||||
#else
|
||||
if (gBattleStruct->safariEscapeFactor < sPkblToEscapeFactor[gBattleStruct->safariPkblThrowCounter][gBattleCommunication[MULTISTRING_CHOOSER]])
|
||||
#endif
|
||||
gBattleStruct->safariEscapeFactor = 1;
|
||||
else
|
||||
gBattleStruct->safariEscapeFactor -= sPkblToEscapeFactor[gBattleStruct->safariPkblThrowCounter][gBattleCommunication[MULTISTRING_CHOOSER]];
|
||||
@ -3936,6 +3942,24 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u16 ability, u8 special, u16 move
|
||||
effect++;
|
||||
}
|
||||
break;
|
||||
case ABILITY_INTREPID_SWORD:
|
||||
if (!gSpecialStatuses[battler].switchInAbilityDone)
|
||||
{
|
||||
gSpecialStatuses[battler].switchInAbilityDone = 1;
|
||||
SET_STATCHANGER(STAT_ATK, 1, FALSE);
|
||||
BattleScriptPushCursorAndCallback(BattleScript_BattlerAbilityStatRaiseOnSwitchIn);
|
||||
effect++;
|
||||
}
|
||||
break;
|
||||
case ABILITY_DAUNTLESS_SHIELD:
|
||||
if (!gSpecialStatuses[battler].switchInAbilityDone)
|
||||
{
|
||||
gSpecialStatuses[battler].switchInAbilityDone = 1;
|
||||
SET_STATCHANGER(STAT_DEF, 1, FALSE);
|
||||
BattleScriptPushCursorAndCallback(BattleScript_BattlerAbilityStatRaiseOnSwitchIn);
|
||||
effect++;
|
||||
}
|
||||
break;
|
||||
}
|
||||
break;
|
||||
case ABILITYEFFECT_ENDTURN: // 1
|
||||
@ -4108,6 +4132,20 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u16 ability, u8 special, u16 move
|
||||
effect++;
|
||||
}
|
||||
break;
|
||||
case ABILITY_BALL_FETCH:
|
||||
if (gBattleMons[battler].item == ITEM_NONE
|
||||
&& gBattleResults.catchAttempts[gLastUsedBall - ITEM_ULTRA_BALL] >= 1
|
||||
&& !gHasFetchedBall)
|
||||
{
|
||||
gBattleScripting.battler = battler;
|
||||
BtlController_EmitSetMonData(0, REQUEST_HELDITEM_BATTLE, 0, 2, &gLastUsedBall);
|
||||
MarkBattlerForControllerExec(battler);
|
||||
gHasFetchedBall = TRUE;
|
||||
gLastUsedItem = gLastUsedBall;
|
||||
BattleScriptPushCursorAndCallback(BattleScript_BallFetch);
|
||||
effect++;
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
break;
|
||||
@ -4249,7 +4287,7 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u16 ability, u8 special, u16 move
|
||||
{
|
||||
SET_STATCHANGER(STAT_ATK, 1, FALSE);
|
||||
BattleScriptPushCursor();
|
||||
gBattlescriptCurrInstr = BattleScript_TargetAbilityStatRaise;
|
||||
gBattlescriptCurrInstr = BattleScript_TargetAbilityStatRaiseOnMoveEnd;
|
||||
effect++;
|
||||
}
|
||||
break;
|
||||
@ -4262,7 +4300,7 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u16 ability, u8 special, u16 move
|
||||
{
|
||||
SET_STATCHANGER(STAT_SPEED, 1, FALSE);
|
||||
BattleScriptPushCursor();
|
||||
gBattlescriptCurrInstr = BattleScript_TargetAbilityStatRaise;
|
||||
gBattlescriptCurrInstr = BattleScript_TargetAbilityStatRaiseOnMoveEnd;
|
||||
effect++;
|
||||
}
|
||||
break;
|
||||
@ -4275,7 +4313,7 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u16 ability, u8 special, u16 move
|
||||
{
|
||||
SET_STATCHANGER(STAT_DEF, 2, FALSE);
|
||||
BattleScriptPushCursor();
|
||||
gBattlescriptCurrInstr = BattleScript_TargetAbilityStatRaise;
|
||||
gBattlescriptCurrInstr = BattleScript_TargetAbilityStatRaiseOnMoveEnd;
|
||||
effect++;
|
||||
}
|
||||
break;
|
||||
@ -4287,7 +4325,7 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u16 ability, u8 special, u16 move
|
||||
{
|
||||
SET_STATCHANGER(STAT_DEF, 1, FALSE);
|
||||
BattleScriptPushCursor();
|
||||
gBattlescriptCurrInstr = BattleScript_TargetAbilityStatRaise;
|
||||
gBattlescriptCurrInstr = BattleScript_TargetAbilityStatRaiseOnMoveEnd;
|
||||
effect++;
|
||||
}
|
||||
break;
|
||||
@ -4304,7 +4342,7 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u16 ability, u8 special, u16 move
|
||||
{
|
||||
SET_STATCHANGER(STAT_SPATK, 1, FALSE);
|
||||
BattleScriptPushCursor();
|
||||
gBattlescriptCurrInstr = BattleScript_TargetAbilityStatRaise;
|
||||
gBattlescriptCurrInstr = BattleScript_TargetAbilityStatRaiseOnMoveEnd;
|
||||
effect++;
|
||||
}
|
||||
break;
|
||||
@ -4357,6 +4395,7 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u16 ability, u8 special, u16 move
|
||||
case ABILITY_MUMMY:
|
||||
if (!(gMoveResultFlags & MOVE_RESULT_NO_EFFECT)
|
||||
&& IsBattlerAlive(gBattlerAttacker)
|
||||
&& TARGET_TURN_DAMAGED
|
||||
&& (gBattleMoves[move].flags & FLAG_MAKES_CONTACT))
|
||||
{
|
||||
switch (gBattleMons[gBattlerAttacker].ability)
|
||||
@ -4390,7 +4429,7 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u16 ability, u8 special, u16 move
|
||||
{
|
||||
SET_STATCHANGER(STAT_ATK, 12 - gBattleMons[battler].statStages[STAT_ATK], FALSE);
|
||||
BattleScriptPushCursor();
|
||||
gBattlescriptCurrInstr = BattleScript_AngryPointActivates;
|
||||
gBattlescriptCurrInstr = BattleScript_TargetsStatWasMaxedOut;
|
||||
effect++;
|
||||
}
|
||||
break;
|
||||
@ -4590,6 +4629,66 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u16 ability, u8 special, u16 move
|
||||
effect++;
|
||||
}
|
||||
break;
|
||||
case ABILITY_COTTON_DOWN:
|
||||
if (!(gMoveResultFlags & MOVE_RESULT_NO_EFFECT)
|
||||
&& gBattleMons[gBattlerAttacker].hp != 0
|
||||
&& !gProtectStructs[gBattlerAttacker].confusionSelfDmg
|
||||
&& TARGET_TURN_DAMAGED)
|
||||
{
|
||||
gEffectBattler = gBattlerTarget;
|
||||
BattleScriptPushCursor();
|
||||
gBattlescriptCurrInstr = BattleScript_CottonDownActivates;
|
||||
effect++;
|
||||
}
|
||||
break;
|
||||
case ABILITY_STEAM_ENGINE:
|
||||
if (!(gMoveResultFlags & MOVE_RESULT_NO_EFFECT)
|
||||
&& TARGET_TURN_DAMAGED
|
||||
&& IsBattlerAlive(battler)
|
||||
&& gBattleMons[battler].statStages[STAT_SPEED] != 12
|
||||
&& (moveType == TYPE_FIRE || moveType == TYPE_WATER))
|
||||
{
|
||||
SET_STATCHANGER(STAT_SPEED, 6, FALSE);
|
||||
BattleScriptPushCursor();
|
||||
gBattlescriptCurrInstr = BattleScript_TargetAbilityStatRaiseOnMoveEnd;
|
||||
effect++;
|
||||
}
|
||||
break;
|
||||
case ABILITY_SAND_SPIT:
|
||||
if (!(gMoveResultFlags & MOVE_RESULT_NO_EFFECT)
|
||||
&& !gProtectStructs[gBattlerAttacker].confusionSelfDmg
|
||||
&& TARGET_TURN_DAMAGED
|
||||
&& !(WEATHER_HAS_EFFECT && gBattleWeather & WEATHER_SANDSTORM_ANY)
|
||||
&& TryChangeBattleWeather(battler, ENUM_WEATHER_SANDSTORM, TRUE))
|
||||
{
|
||||
gBattleScripting.battler = gActiveBattler = battler;
|
||||
BattleScriptPushCursor();
|
||||
gBattlescriptCurrInstr = BattleScript_SandSpitActivates;
|
||||
effect++;
|
||||
}
|
||||
break;
|
||||
case ABILITY_PERISH_BODY:
|
||||
if (!(gMoveResultFlags & MOVE_RESULT_NO_EFFECT)
|
||||
&& !gProtectStructs[gBattlerAttacker].confusionSelfDmg
|
||||
&& TARGET_TURN_DAMAGED
|
||||
&& IsBattlerAlive(battler)
|
||||
&& (gBattleMoves[move].flags & FLAG_MAKES_CONTACT)
|
||||
&& !(gStatuses3[gBattlerAttacker] & STATUS3_PERISH_SONG))
|
||||
{
|
||||
if (!(gStatuses3[battler] & STATUS3_PERISH_SONG))
|
||||
{
|
||||
gStatuses3[battler] |= STATUS3_PERISH_SONG;
|
||||
gDisableStructs[battler].perishSongTimer = 3;
|
||||
gDisableStructs[battler].perishSongTimerStartValue = 3;
|
||||
}
|
||||
gStatuses3[gBattlerAttacker] |= STATUS3_PERISH_SONG;
|
||||
gDisableStructs[gBattlerAttacker].perishSongTimer = 3;
|
||||
gDisableStructs[gBattlerAttacker].perishSongTimerStartValue = 3;
|
||||
BattleScriptPushCursor();
|
||||
gBattlescriptCurrInstr = BattleScript_PerishBodyActivates;
|
||||
effect++;
|
||||
}
|
||||
break;
|
||||
}
|
||||
break;
|
||||
case ABILITYEFFECT_MOVE_END_ATTACKER: // Same as above, but for attacker
|
||||
@ -5746,7 +5845,7 @@ u8 ItemBattleEffects(u8 caseID, u8 battlerId, bool8 moveTurn)
|
||||
if (!(gMoveResultFlags & MOVE_RESULT_NO_EFFECT)
|
||||
&& TARGET_TURN_DAMAGED
|
||||
&& (Random() % 100) < atkHoldEffectParam
|
||||
&& gBattleMoves[gCurrentMove].flags & FLAG_KINGSROCK_AFFECTED
|
||||
&& gBattleMoves[gCurrentMove].flags & FLAG_KINGS_ROCK_AFFECTED
|
||||
&& gBattleMons[gBattlerTarget].hp)
|
||||
{
|
||||
gBattleScripting.moveEffect = MOVE_EFFECT_FLINCH;
|
||||
@ -6155,7 +6254,7 @@ u32 GetBattlerHoldEffect(u8 battlerId, bool32 checkNegating)
|
||||
|
||||
gPotentialItemEffectBattler = battlerId;
|
||||
|
||||
if (USE_BATTLE_DEBUG && gBattleStruct->debugHoldEffects[battlerId] != 0 && gBattleMons[battlerId].item)
|
||||
if (B_ENABLE_DEBUG && gBattleStruct->debugHoldEffects[battlerId] != 0 && gBattleMons[battlerId].item)
|
||||
return gBattleStruct->debugHoldEffects[battlerId];
|
||||
else if (gBattleMons[battlerId].item == ITEM_ENIGMA_BERRY)
|
||||
return gEnigmaBerries[battlerId].holdEffect;
|
||||
@ -6682,6 +6781,10 @@ static u32 CalcMoveBasePowerAfterModifiers(u16 move, u8 battlerAtk, u8 battlerDe
|
||||
if (moveType == TYPE_NORMAL && gBattleStruct->ateBoost[battlerAtk])
|
||||
MulModifier(&modifier, UQ_4_12(1.2));
|
||||
break;
|
||||
case ABILITY_PUNK_ROCK:
|
||||
if (gBattleMoves[move].flags & FLAG_SOUND)
|
||||
MulModifier(&modifier, UQ_4_12(1.3));
|
||||
break;
|
||||
}
|
||||
|
||||
// field abilities
|
||||
@ -6703,6 +6806,9 @@ static u32 CalcMoveBasePowerAfterModifiers(u16 move, u8 battlerAtk, u8 battlerDe
|
||||
if (IS_MOVE_SPECIAL(move))
|
||||
MulModifier(&modifier, UQ_4_12(1.3));
|
||||
break;
|
||||
case ABILITY_POWER_SPOT:
|
||||
MulModifier(&modifier, UQ_4_12(1.3));
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
@ -6988,6 +7094,10 @@ static u32 CalcAttackStat(u16 move, u8 battlerAtk, u8 battlerDef, u8 moveType, b
|
||||
RecordAbilityBattle(battlerDef, ABILITY_THICK_FAT);
|
||||
}
|
||||
break;
|
||||
case ABILITY_ICE_SCALES:
|
||||
if (IS_MOVE_SPECIAL(move))
|
||||
MulModifier(&modifier, UQ_4_12(0.5));
|
||||
break;
|
||||
}
|
||||
|
||||
// ally's abilities
|
||||
@ -7127,6 +7237,10 @@ static u32 CalcDefenseStat(u16 move, u8 battlerAtk, u8 battlerDef, u8 moveType,
|
||||
if (gBattleMons[battlerDef].species == SPECIES_CHERRIM && WEATHER_HAS_EFFECT && gBattleWeather & WEATHER_SUN_ANY && !usesDefStat)
|
||||
MulModifier(&modifier, UQ_4_12(1.5));
|
||||
break;
|
||||
case ABILITY_PUNK_ROCK:
|
||||
if (gBattleMoves[move].flags & FLAG_SOUND)
|
||||
MulModifier(&modifier, UQ_4_12(1.3));
|
||||
break;
|
||||
}
|
||||
|
||||
// ally's abilities
|
||||
@ -7624,7 +7738,7 @@ bool32 CanMegaEvolve(u8 battlerId)
|
||||
// Check if there is an entry in the evolution table for regular Mega Evolution.
|
||||
if (GetMegaEvolutionSpecies(species, itemId) != SPECIES_NONE)
|
||||
{
|
||||
if (USE_BATTLE_DEBUG && gBattleStruct->debugHoldEffects[battlerId])
|
||||
if (B_ENABLE_DEBUG && gBattleStruct->debugHoldEffects[battlerId])
|
||||
holdEffect = gBattleStruct->debugHoldEffects[battlerId];
|
||||
else if (itemId == ITEM_ENIGMA_BERRY)
|
||||
holdEffect = gEnigmaBerries[battlerId].holdEffect;
|
||||
|
@ -1852,7 +1852,9 @@ static void Task_HandleOpponent1(u8 taskId)
|
||||
gRecvCmds[1][BLENDER_COMM_SCORE] = LINKCMD_BLENDER_SCORE_GOOD;
|
||||
|
||||
// BUG: Overrwrote above assignment. Opponent 1 can't get Best at low speed
|
||||
#ifndef BUGFIX
|
||||
gRecvCmds[1][BLENDER_COMM_SCORE] = LINKCMD_BLENDER_SCORE_GOOD;
|
||||
#endif
|
||||
}
|
||||
else if (sBerryBlender->speed < 1500)
|
||||
{
|
||||
@ -2131,11 +2133,17 @@ static void UpdateOpponentScores(void)
|
||||
sBerryBlender->scores[i][SCORE_MISS]++;
|
||||
}
|
||||
|
||||
// BUG: Should [i][BLENDER_COMM_SCORE] below, not [BLENDER_COMM_SCORE][i]
|
||||
// BUG: Should be [i][BLENDER_COMM_SCORE] below, not [BLENDER_COMM_SCORE][i]
|
||||
// As a result the music tempo updates if any player misses, but only if 1 specific player hits
|
||||
#ifdef BUGFIX
|
||||
if (gRecvCmds[i][BLENDER_COMM_SCORE] == LINKCMD_BLENDER_SCORE_MISS
|
||||
|| gRecvCmds[i][BLENDER_COMM_SCORE] == LINKCMD_BLENDER_SCORE_BEST
|
||||
|| gRecvCmds[i][BLENDER_COMM_SCORE] == LINKCMD_BLENDER_SCORE_GOOD)
|
||||
#else
|
||||
if (gRecvCmds[i][BLENDER_COMM_SCORE] == LINKCMD_BLENDER_SCORE_MISS
|
||||
|| gRecvCmds[BLENDER_COMM_SCORE][i] == LINKCMD_BLENDER_SCORE_BEST
|
||||
|| gRecvCmds[BLENDER_COMM_SCORE][i] == LINKCMD_BLENDER_SCORE_GOOD)
|
||||
#endif
|
||||
{
|
||||
if (sBerryBlender->speed > 1500)
|
||||
m4aMPlayTempoControl(&gMPlayInfo_BGM, ((sBerryBlender->speed - 750) / 20) + 256);
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -3118,9 +3118,9 @@ static u8 CreateContestantSprite(u16 species, u32 otId, u32 personality, u32 ind
|
||||
species = SanitizeSpecies(species);
|
||||
|
||||
if (index == gContestPlayerMonIndex)
|
||||
HandleLoadSpecialPokePic_2(&gMonBackPicTable[species], gMonSpritesGfxPtr->sprites[0], species, personality);
|
||||
HandleLoadSpecialPokePic_2(&gMonBackPicTable[species], gMonSpritesGfxPtr->sprites.ptr[0], species, personality);
|
||||
else
|
||||
HandleLoadSpecialPokePic_DontHandleDeoxys(&gMonBackPicTable[species], gMonSpritesGfxPtr->sprites[0], species, personality);
|
||||
HandleLoadSpecialPokePic_DontHandleDeoxys(&gMonBackPicTable[species], gMonSpritesGfxPtr->sprites.ptr[0], species, personality);
|
||||
|
||||
LoadCompressedPalette(GetMonSpritePalFromSpeciesAndPersonality(species, otId, personality), 0x120, 0x20);
|
||||
SetMultiuseSpriteTemplateToPokemon(species, 0);
|
||||
|
@ -1734,8 +1734,9 @@ static void ContestAICmd_if_user_doesnt_have_exciting_move(void)
|
||||
// they're checking for an effect. Checking for a specific effect would make more sense,
|
||||
// but given that effects are normally read as a single byte and this reads 2 bytes, it
|
||||
// seems reading a move was intended and the AI script is using it incorrectly.
|
||||
// In any case, to fix it to correctly check for effects replace the u16 move assignment with
|
||||
// u16 move = gContestMoves[gContestMons[eContestAI.contestantId].moves[i]].effect;
|
||||
// The fix below aligns the function with how it's used by the script, rather than the apparent
|
||||
// intention of its usage
|
||||
|
||||
static void ContestAICmd_check_user_has_move(void)
|
||||
{
|
||||
int hasMove = FALSE;
|
||||
@ -1744,7 +1745,12 @@ static void ContestAICmd_check_user_has_move(void)
|
||||
|
||||
for (i = 0; i < MAX_MON_MOVES; i++)
|
||||
{
|
||||
#ifdef BUGFIX
|
||||
u16 move = gContestMoves[gContestMons[eContestAI.contestantId].moves[i]].effect;
|
||||
#else
|
||||
u16 move = gContestMons[eContestAI.contestantId].moves[i];
|
||||
#endif
|
||||
|
||||
if (move == targetMove)
|
||||
{
|
||||
hasMove = TRUE;
|
||||
|
@ -368,19 +368,19 @@ static void InitContestMonPixels(u16 species, u8 whichSprite)
|
||||
{
|
||||
HandleLoadSpecialPokePic_DontHandleDeoxys(
|
||||
&gMonFrontPicTable[species],
|
||||
gMonSpritesGfxPtr->sprites[1],
|
||||
gMonSpritesGfxPtr->sprites.ptr[1],
|
||||
species,
|
||||
gContestPaintingWinner->personality);
|
||||
_InitContestMonPixels(gMonSpritesGfxPtr->sprites[1], gContestPaintingMonPalette, (void *)gContestMonPixels);
|
||||
_InitContestMonPixels(gMonSpritesGfxPtr->sprites.ptr[1], gContestPaintingMonPalette, (void *)gContestMonPixels);
|
||||
}
|
||||
else
|
||||
{
|
||||
HandleLoadSpecialPokePic_DontHandleDeoxys(
|
||||
&gMonBackPicTable[species],
|
||||
gMonSpritesGfxPtr->sprites[0],
|
||||
gMonSpritesGfxPtr->sprites.ptr[0],
|
||||
species,
|
||||
gContestPaintingWinner->personality);
|
||||
_InitContestMonPixels(gMonSpritesGfxPtr->sprites[0], gContestPaintingMonPalette, (void *)gContestMonPixels);
|
||||
_InitContestMonPixels(gMonSpritesGfxPtr->sprites.ptr[0], gContestPaintingMonPalette, (void *)gContestMonPixels);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -166,11 +166,6 @@ static void SpriteCB_Confetti(struct Sprite *sprite);
|
||||
static void Task_ShowContestEntryMonPic(u8 taskId);
|
||||
static void Task_LinkContestWaitForConnection(u8 taskId);
|
||||
|
||||
extern const u16 gObjectEventPalette8[];
|
||||
extern const u16 gObjectEventPalette17[];
|
||||
extern const u16 gObjectEventPalette33[];
|
||||
extern const u16 gObjectEventPalette34[];
|
||||
|
||||
static const u16 sUnknown_0858D6B0[] = INCBIN_U16("graphics/unknown/unknown_58D6B0.gbapal");
|
||||
static const u8 sUnknown_0858D6D0[] = INCBIN_U8("graphics/unknown/unknown_58D6D0.4bpp");
|
||||
static const u16 sMiscBlank_Pal[] = INCBIN_U16("graphics/interface/blank.gbapal");
|
||||
@ -880,7 +875,7 @@ static void Task_ShowWinnerMonBanner(u8 taskId)
|
||||
{
|
||||
HandleLoadSpecialPokePic_2(
|
||||
&gMonFrontPicTable[species],
|
||||
gMonSpritesGfxPtr->sprites[1],
|
||||
gMonSpritesGfxPtr->sprites.ptr[1],
|
||||
species,
|
||||
personality);
|
||||
}
|
||||
@ -888,7 +883,7 @@ static void Task_ShowWinnerMonBanner(u8 taskId)
|
||||
{
|
||||
HandleLoadSpecialPokePic_DontHandleDeoxys(
|
||||
&gMonFrontPicTable[species],
|
||||
gMonSpritesGfxPtr->sprites[1],
|
||||
gMonSpritesGfxPtr->sprites.ptr[1],
|
||||
species,
|
||||
personality);
|
||||
}
|
||||
@ -2488,16 +2483,16 @@ void LoadLinkContestPlayerPalettes(void)
|
||||
if (version == VERSION_RUBY || version == VERSION_SAPPHIRE)
|
||||
{
|
||||
if (gLinkPlayers[i].gender == MALE)
|
||||
LoadPalette(gObjectEventPalette33, 0x160 + i * 0x10, 0x20);
|
||||
LoadPalette(gObjectEventPal_RubySapphireBrendan, 0x160 + i * 0x10, 0x20);
|
||||
else
|
||||
LoadPalette(gObjectEventPalette34, 0x160 + i * 0x10, 0x20);
|
||||
LoadPalette(gObjectEventPal_RubySapphireMay, 0x160 + i * 0x10, 0x20);
|
||||
}
|
||||
else
|
||||
{
|
||||
if (gLinkPlayers[i].gender == MALE)
|
||||
LoadPalette(gObjectEventPalette8, 0x160 + i * 0x10, 0x20);
|
||||
LoadPalette(gObjectEventPal_Brendan, 0x160 + i * 0x10, 0x20);
|
||||
else
|
||||
LoadPalette(gObjectEventPalette17, 0x160 + i * 0x10, 0x20);
|
||||
LoadPalette(gObjectEventPal_May, 0x160 + i * 0x10, 0x20);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -2552,9 +2547,9 @@ void ShowContestEntryMonPic(void)
|
||||
gTasks[taskId].data[0] = 0;
|
||||
gTasks[taskId].data[1] = species;
|
||||
if (gSpecialVar_0x8006 == gContestPlayerMonIndex)
|
||||
HandleLoadSpecialPokePic_2(&gMonFrontPicTable[species], gMonSpritesGfxPtr->sprites[1], species, personality);
|
||||
HandleLoadSpecialPokePic_2(&gMonFrontPicTable[species], gMonSpritesGfxPtr->sprites.ptr[1], species, personality);
|
||||
else
|
||||
HandleLoadSpecialPokePic_DontHandleDeoxys(&gMonFrontPicTable[species], gMonSpritesGfxPtr->sprites[1], species, personality);
|
||||
HandleLoadSpecialPokePic_DontHandleDeoxys(&gMonFrontPicTable[species], gMonSpritesGfxPtr->sprites.ptr[1], species, personality);
|
||||
|
||||
palette = GetMonSpritePalStructFromOtIdPersonality(species, otId, personality);
|
||||
LoadCompressedSpritePalette(palette);
|
||||
|
@ -295,11 +295,6 @@ const union AnimCmd *const gUnknown_082FF70C[] =
|
||||
#define SPECIES_PAL(species, pal) [SPECIES_##species] = {pal, SPECIES_##species}
|
||||
#define SPECIES_SHINY_PAL(species, pal) [SPECIES_##species] = {pal, SPECIES_##species + SPECIES_SHINY_TAG}
|
||||
|
||||
#define TRAINER_SPRITE(trainerPic, sprite, size) [TRAINER_PIC_##trainerPic] = {sprite, size, TRAINER_PIC_##trainerPic}
|
||||
#define TRAINER_PAL(trainerPic, pal) [TRAINER_PIC_##trainerPic] = {pal, TRAINER_PIC_##trainerPic}
|
||||
|
||||
#define TRAINER_BACK_PAL(trainerPic, pal) [TRAINER_BACK_PIC_##trainerPic] = {pal, TRAINER_BACK_PIC_##trainerPic}
|
||||
|
||||
#include "data/pokemon_graphics/unknown_anims.h"
|
||||
#include "data/pokemon_graphics/front_pic_coordinates.h"
|
||||
#include "data/pokemon_graphics/still_front_pic_table.h"
|
||||
|
File diff suppressed because it is too large
Load Diff
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user