Competitive-formatted parties (#3545)
$ python3 migration_scripts/convert_parties.py src/data/trainers.h src/data/trainer_parties.h src/data/npc_trainers.party Is available to convert Trainer Control-formatted trainers/parties into Competitive-formatted ones. Multiple '#include's can be placed in the trainer section of src/data.c to support spreading the trainers across multiple .party files. trainerproc does not interpret the values, leaving that job to the C compiler, so we use '#line' to associate those errors with the lines in the .party file(s). Because the columns don't make sense we use -fno-show-column and -fno-diagostics-show-caret. We might want to move gTrainers into its own file so that the rest of src/data.c isn't affected by those flags. Extensions (misfeatures, imo): - .party files are passed through cpp, so '#define's are supported, and so are '// ...' and '/* ... */' comments. - .party files also support writing, e.g. 'SPECIES_PIKACHU' instead of 'Pikachu'. This allows people to write constants explicitly if they like. Pragmas: - '#pragma trainerproc ivs explicit' requires an explicit 'IVs:' line rather than defaulting to 31s. - '#pragma trainerproc ivs <IVs>' changes the default IVs. - '#pragma trainerproc level explicit' requires an explicit 'Level:' line rather than defaulting to 100. - '#pragma trainerproc level <level>' changes the default level. Co-authored-by: Eduardo Quezada <eduardo602002@gmail.com> Co-authored-by: Alex <93446519+AlexOn1ine@users.noreply.github.com>
This commit is contained in:
parent
d8af6205e9
commit
8bd5ac2e7a
9
Makefile
9
Makefile
@ -166,11 +166,12 @@ JSONPROC := tools/jsonproc/jsonproc$(EXE)
|
|||||||
PATCHELF := tools/patchelf/patchelf$(EXE)
|
PATCHELF := tools/patchelf/patchelf$(EXE)
|
||||||
ROMTEST ?= $(shell { command -v mgba-rom-test || command -v tools/mgba/mgba-rom-test$(EXE); } 2>/dev/null)
|
ROMTEST ?= $(shell { command -v mgba-rom-test || command -v tools/mgba/mgba-rom-test$(EXE); } 2>/dev/null)
|
||||||
ROMTESTHYDRA := tools/mgba-rom-test-hydra/mgba-rom-test-hydra$(EXE)
|
ROMTESTHYDRA := tools/mgba-rom-test-hydra/mgba-rom-test-hydra$(EXE)
|
||||||
|
TRAINERPROC := tools/trainerproc/trainerproc$(EXE)
|
||||||
|
|
||||||
PERL := perl
|
PERL := perl
|
||||||
|
|
||||||
# Inclusive list. If you don't want a tool to be built, don't add it here.
|
# Inclusive list. If you don't want a tool to be built, don't add it here.
|
||||||
TOOLDIRS := tools/aif2pcm tools/bin2c tools/gbafix tools/gbagfx tools/jsonproc tools/mapjson tools/mid2agb tools/preproc tools/ramscrgen tools/rsfont tools/scaninc
|
TOOLDIRS := tools/aif2pcm tools/bin2c tools/gbafix tools/gbagfx tools/jsonproc tools/mapjson tools/mid2agb tools/preproc tools/ramscrgen tools/rsfont tools/scaninc tools/trainerproc
|
||||||
CHECKTOOLDIRS = tools/patchelf tools/mgba-rom-test-hydra
|
CHECKTOOLDIRS = tools/patchelf tools/mgba-rom-test-hydra
|
||||||
TOOLBASE = $(TOOLDIRS:tools/%=%)
|
TOOLBASE = $(TOOLDIRS:tools/%=%)
|
||||||
TOOLS = $(foreach tool,$(TOOLBASE),tools/$(tool)/$(tool)$(EXE))
|
TOOLS = $(foreach tool,$(TOOLBASE),tools/$(tool)/$(tool)$(EXE))
|
||||||
@ -335,6 +336,10 @@ $(CRY_SUBDIR)/uncomp_%.bin: $(CRY_SUBDIR)/uncomp_%.aif ; $(AIF) $< $@
|
|||||||
$(CRY_SUBDIR)/%.bin: $(CRY_SUBDIR)/%.aif ; $(AIF) $< $@ --compress
|
$(CRY_SUBDIR)/%.bin: $(CRY_SUBDIR)/%.aif ; $(AIF) $< $@ --compress
|
||||||
sound/%.bin: sound/%.aif ; $(AIF) $< $@
|
sound/%.bin: sound/%.aif ; $(AIF) $< $@
|
||||||
|
|
||||||
|
COMPETITIVE_PARTY_SYNTAX := $(shell echo 'COMPETITIVE_PARTY_SYNTAX' | $(CPP) $(CPPFLAGS) -imacros include/global.h | tail -n1)
|
||||||
|
ifeq ($(COMPETITIVE_PARTY_SYNTAX),1)
|
||||||
|
%.h: %.party tools ; $(CPP) $(CPPFLAGS) - < $< | sed '/#[^p]/d' | $(TRAINERPROC) -o $@ -i $< -
|
||||||
|
endif
|
||||||
|
|
||||||
ifeq ($(MODERN),0)
|
ifeq ($(MODERN),0)
|
||||||
$(C_BUILDDIR)/libc.o: CC1 := tools/agbcc/bin/old_agbcc$(EXE)
|
$(C_BUILDDIR)/libc.o: CC1 := tools/agbcc/bin/old_agbcc$(EXE)
|
||||||
@ -354,6 +359,8 @@ $(C_BUILDDIR)/librfu_intr.o: CFLAGS := -O2 -mthumb-interwork -quiet
|
|||||||
else
|
else
|
||||||
$(C_BUILDDIR)/librfu_intr.o: CFLAGS := -mthumb-interwork -O2 -mabi=apcs-gnu -mtune=arm7tdmi -march=armv4t -fno-toplevel-reorder -Wno-pointer-to-int-cast
|
$(C_BUILDDIR)/librfu_intr.o: CFLAGS := -mthumb-interwork -O2 -mabi=apcs-gnu -mtune=arm7tdmi -march=armv4t -fno-toplevel-reorder -Wno-pointer-to-int-cast
|
||||||
$(C_BUILDDIR)/pokedex_plus_hgss.o: CFLAGS := -mthumb -mthumb-interwork -O2 -mabi=apcs-gnu -mtune=arm7tdmi -march=armv4t -Wno-pointer-to-int-cast -std=gnu17 -Werror -Wall -Wno-strict-aliasing -Wno-attribute-alias -Woverride-init
|
$(C_BUILDDIR)/pokedex_plus_hgss.o: CFLAGS := -mthumb -mthumb-interwork -O2 -mabi=apcs-gnu -mtune=arm7tdmi -march=armv4t -Wno-pointer-to-int-cast -std=gnu17 -Werror -Wall -Wno-strict-aliasing -Wno-attribute-alias -Woverride-init
|
||||||
|
# Annoyingly we can't turn this on just for src/data/trainers.h
|
||||||
|
$(C_BUILDDIR)/data.o: CFLAGS += -fno-show-column -fno-diagnostics-show-caret
|
||||||
endif
|
endif
|
||||||
|
|
||||||
ifeq ($(DINFO),1)
|
ifeq ($(DINFO),1)
|
||||||
|
|||||||
@ -70,6 +70,7 @@
|
|||||||
#define POKEDEX_PLUS_HGSS FALSE // If TRUE, enables the custom HGSS style Pokedex.
|
#define POKEDEX_PLUS_HGSS FALSE // If TRUE, enables the custom HGSS style Pokedex.
|
||||||
#define SUMMARY_SCREEN_NATURE_COLORS TRUE // If TRUE, nature-based stat boosts and reductions will be red and blue in the summary screen.
|
#define SUMMARY_SCREEN_NATURE_COLORS TRUE // If TRUE, nature-based stat boosts and reductions will be red and blue in the summary screen.
|
||||||
#define HQ_RANDOM TRUE // If TRUE, replaces the default RNG with an implementation of SFC32 RNG. May break code that relies on RNG.
|
#define HQ_RANDOM TRUE // If TRUE, replaces the default RNG with an implementation of SFC32 RNG. May break code that relies on RNG.
|
||||||
|
#define COMPETITIVE_PARTY_SYNTAX TRUE // If TRUE, parties are defined in "competitive syntax".
|
||||||
|
|
||||||
// Measurement system constants to be used for UNITS
|
// Measurement system constants to be used for UNITS
|
||||||
#define UNITS_IMPERIAL 0 // Inches, feet, pounds
|
#define UNITS_IMPERIAL 0 // Inches, feet, pounds
|
||||||
|
|||||||
@ -935,6 +935,7 @@
|
|||||||
// Signature Z Moves
|
// Signature Z Moves
|
||||||
#define MOVE_CATASTROPIKA (MOVES_COUNT + 18)
|
#define MOVE_CATASTROPIKA (MOVES_COUNT + 18)
|
||||||
#define MOVE_10000000_VOLT_THUNDERBOLT (MOVES_COUNT + 19)
|
#define MOVE_10000000_VOLT_THUNDERBOLT (MOVES_COUNT + 19)
|
||||||
|
#define MOVE_10_000_000_VOLT_THUNDERBOLT MOVE_10000000_VOLT_THUNDERBOLT
|
||||||
#define MOVE_STOKED_SPARKSURFER (MOVES_COUNT + 20)
|
#define MOVE_STOKED_SPARKSURFER (MOVES_COUNT + 20)
|
||||||
#define MOVE_EXTREME_EVOBOOST (MOVES_COUNT + 21)
|
#define MOVE_EXTREME_EVOBOOST (MOVES_COUNT + 21)
|
||||||
#define MOVE_PULVERIZING_PANCAKE (MOVES_COUNT + 22)
|
#define MOVE_PULVERIZING_PANCAKE (MOVES_COUNT + 22)
|
||||||
|
|||||||
@ -1633,4 +1633,138 @@
|
|||||||
|
|
||||||
#define NUM_SPECIES SPECIES_EGG
|
#define NUM_SPECIES SPECIES_EGG
|
||||||
|
|
||||||
|
// Competitive format aliases
|
||||||
|
#define SPECIES_ALCREMIE_GMAX SPECIES_ALCREMIE_GIGANTAMAX
|
||||||
|
#define SPECIES_APPLETUN_GMAX SPECIES_APPLETUN_GIGANTAMAX
|
||||||
|
#define SPECIES_ARCANINE_HISUI SPECIES_ARCANINE_HISUIAN
|
||||||
|
#define SPECIES_ARTICUNO_GALAR SPECIES_ARTICUNO_GALARIAN
|
||||||
|
#define SPECIES_AVALUGG_HISUI SPECIES_AVALUGG_HISUIAN
|
||||||
|
#define SPECIES_BLASTOISE_GMAX SPECIES_BLASTOISE_GIGANTAMAX
|
||||||
|
#define SPECIES_BRAVIARY_HISUI SPECIES_BRAVIARY_HISUIAN
|
||||||
|
#define SPECIES_BURMY_SANDY SPECIES_BURMY_SANDY_CLOAK
|
||||||
|
#define SPECIES_BURMY_TRASH SPECIES_BURMY_TRASH_CLOAK
|
||||||
|
#define SPECIES_BUTTERFREE_GMAX SPECIES_BUTTERFREE_GIGANTAMAX
|
||||||
|
#define SPECIES_CALYREX_ICE SPECIES_CALYREX_ICE_RIDER
|
||||||
|
#define SPECIES_CALYREX_SHADOW SPECIES_CALYREX_SHADOW_RIDER
|
||||||
|
#define SPECIES_CENTISKORCH_GMAX SPECIES_CENTISKORCH_GIGANTAMAX
|
||||||
|
#define SPECIES_CHARIZARD_GMAX SPECIES_CHARIZARD_GIGANTAMAX
|
||||||
|
#define SPECIES_CINDERACE_GMAX SPECIES_CINDERACE_GIGANTAMAX
|
||||||
|
#define SPECIES_COALOSSAL_GMAX SPECIES_COALOSSAL_GIGANTAMAX
|
||||||
|
#define SPECIES_COPPERAJAH_GMAX SPECIES_COPPERAJAH_GIGANTAMAX
|
||||||
|
#define SPECIES_CORSOLA_GALAR SPECIES_CORSOLA_GALARIAN
|
||||||
|
#define SPECIES_CORVIKNIGHT_GMAX SPECIES_CORVIKNIGHT_GIGANTAMAX
|
||||||
|
#define SPECIES_DARMANITAN_GALAR SPECIES_DARMANITAN_GALARIAN_STANDARD_MODE
|
||||||
|
#define SPECIES_DARMANITAN_GALAR_ZEN SPECIES_DARMANITAN_GALARIAN_ZEN_MODE
|
||||||
|
#define SPECIES_DARMANITAN_ZEN SPECIES_DARMANITAN_ZEN_MODE
|
||||||
|
#define SPECIES_DARUMAKA_GALAR SPECIES_DARUMAKA_GALARIAN
|
||||||
|
#define SPECIES_DECIDUEYE_HISUI SPECIES_DECIDUEYE_HISUIAN
|
||||||
|
#define SPECIES_DIGLETT_ALOLA SPECIES_DIGLETT_ALOLAN
|
||||||
|
#define SPECIES_DREDNAW_GMAX SPECIES_DREDNAW_GIGANTAMAX
|
||||||
|
#define SPECIES_DUGTRIO_ALOLA SPECIES_DUGTRIO_ALOLAN
|
||||||
|
#define SPECIES_DURALUDON_GMAX SPECIES_DURALUDON_GIGANTAMAX
|
||||||
|
#define SPECIES_EEVEE_GMAX SPECIES_EEVEE_GIGANTAMAX
|
||||||
|
#define SPECIES_EEVEE_STARTER SPECIES_EEVEE_PARTNER
|
||||||
|
#define SPECIES_EISCUE_NOICE SPECIES_EISCUE_NOICE_FACE
|
||||||
|
#define SPECIES_ELECTRODE_HISUI SPECIES_ELECTRODE_HISUIAN
|
||||||
|
#define SPECIES_EXEGGUTOR_ALOLA SPECIES_EXEGGUTOR_ALOLAN
|
||||||
|
#define SPECIES_FARFETCHD_GALAR SPECIES_FARFETCHD_GALARIAN
|
||||||
|
#define SPECIES_FLAPPLE_GMAX SPECIES_FLAPPLE_GIGANTAMAX
|
||||||
|
#define SPECIES_FLOETTE_ETERNAL SPECIES_FLOETTE_ETERNAL_FLOWER
|
||||||
|
#define SPECIES_GARBODOR_GMAX SPECIES_GARBODOR_GIGANTAMAX
|
||||||
|
#define SPECIES_GASTRODON_EAST SPECIES_GASTRODON_EAST_SEA
|
||||||
|
#define SPECIES_GENESECT_BURN SPECIES_GENESECT_BURN_DRIVE
|
||||||
|
#define SPECIES_GENESECT_CHILL SPECIES_GENESECT_CHILL_DRIVE
|
||||||
|
#define SPECIES_GENESECT_DOUSE SPECIES_GENESECT_DOUSE_DRIVE
|
||||||
|
#define SPECIES_GENESECT_SHOCK SPECIES_GENESECT_SHOCK_DRIVE
|
||||||
|
#define SPECIES_GENGAR_GMAX SPECIES_GENGAR_GIGANTAMAX
|
||||||
|
#define SPECIES_GEODUDE_ALOLA SPECIES_GEODUDE_ALOLAN
|
||||||
|
#define SPECIES_GOLEM_ALOLA SPECIES_GOLEM_ALOLAN
|
||||||
|
#define SPECIES_GOODRA_HISUI SPECIES_GOODRA_HISUIAN
|
||||||
|
#define SPECIES_GRAVELER_ALOLA SPECIES_GRAVELER_ALOLAN
|
||||||
|
#define SPECIES_GRENINJA_BOND SPECIES_GRENINJA_BATTLE_BOND
|
||||||
|
#define SPECIES_GRIMER_ALOLA SPECIES_GRIMER_ALOLAN
|
||||||
|
#define SPECIES_GRIMMSNARL_GMAX SPECIES_GRIMMSNARL_GIGANTAMAX
|
||||||
|
#define SPECIES_GROWLITHE_HISUI SPECIES_GROWLITHE_HISUIAN
|
||||||
|
#define SPECIES_HATTERENE_GMAX SPECIES_HATTERENE_GIGANTAMAX
|
||||||
|
#define SPECIES_INTELEON_GMAX SPECIES_INTELEON_GIGANTAMAX
|
||||||
|
#define SPECIES_KINGLER_GMAX SPECIES_KINGLER_GIGANTAMAX
|
||||||
|
#define SPECIES_LAPRAS_GMAX SPECIES_LAPRAS_GIGANTAMAX
|
||||||
|
#define SPECIES_LILLIGANT_HISUI SPECIES_LILLIGANT_HISUIAN
|
||||||
|
#define SPECIES_LINOONE_GALAR SPECIES_LINOONE_GALARIAN
|
||||||
|
#define SPECIES_MACHAMP_GMAX SPECIES_MACHAMP_GIGANTAMAX
|
||||||
|
#define SPECIES_MAGEARNA_ORIGINAL SPECIES_MAGEARNA_ORIGINAL_COLOR
|
||||||
|
#define SPECIES_MAROWAK_ALOLA SPECIES_MAROWAK_ALOLAN
|
||||||
|
#define SPECIES_MAROWAX_ALOLA_TOTEM SPECIES_MAROWAK_ALOLAN_TOTEM
|
||||||
|
#define SPECIES_MAUSHOLD_FOUR SPECIES_MAUSHOLD_FAMILY_OF_FOUR
|
||||||
|
#define SPECIES_MELMETAL_GMAX SPECIES_MELMETAL_GIGANTAMAX
|
||||||
|
#define SPECIES_MEOWTH_ALOLA SPECIES_MEOWTH_ALOLAN
|
||||||
|
#define SPECIES_MEOWTH_GALAR SPECIES_MEOWTH_GALARIAN
|
||||||
|
#define SPECIES_MEOWTH_GMAX SPECIES_MEOWTH_GIGANTAMAX
|
||||||
|
#define SPECIES_MOLTRES_GALAR SPECIES_MOLTRES_GALARIAN
|
||||||
|
#define SPECIES_MR_MIME_GALAR SPECIES_MR_MIME_GALARIAN
|
||||||
|
#define SPECIES_MUK_ALOLA SPECIES_MUK_ALOLAN
|
||||||
|
#define SPECIES_NINETALES_ALOLA SPECIES_NINETALES_ALOLAN
|
||||||
|
#define SPECIES_ORBEETLE_GMAX SPECIES_ORBEETLE_GIGANTAMAX
|
||||||
|
#define SPECIES_PERSIAN_ALOLA SPECIES_PERSIAN_ALOLAN
|
||||||
|
#define SPECIES_PIKACHU_ALOLA SPECIES_PIKACHU_ALOLA_CAP
|
||||||
|
#define SPECIES_PIKACHU_GMAX SPECIES_PIKACHU_GIGANTAMAX
|
||||||
|
#define SPECIES_PIKACHU_HOENN SPECIES_PIKACHU_HOENN_CAP
|
||||||
|
#define SPECIES_PIKACHU_KALOS SPECIES_PIKACHU_KALOS_CAP
|
||||||
|
#define SPECIES_PIKACHU_ORIGINAL SPECIES_PIKACHU_ORIGINAL_CAP
|
||||||
|
//#define SPECIES_PIKACHU_PARTNER SPECIES_PIKACHU_PARTNER_CAP
|
||||||
|
#define SPECIES_PIKACHU_PHD SPECIES_PIKACHU_PH_D
|
||||||
|
#define SPECIES_PIKACHU_SINNOH SPECIES_PIKACHU_SINNOH_CAP
|
||||||
|
#define SPECIES_PIKACHU_STARTER SPECIES_PIKACHU_PARTNER
|
||||||
|
#define SPECIES_PIKACHU_UNOVA SPECIES_PIKACHU_UNOVA_CAP
|
||||||
|
#define SPECIES_PIKACHU_WORLD SPECIES_PIKACHU_WORLD_CAP
|
||||||
|
#define SPECIES_PONYTA_GALAR SPECIES_PONYTA_GALARIAN
|
||||||
|
#define SPECIES_QWILFISH_HISUI SPECIES_QWILFISH_HISUIAN
|
||||||
|
#define SPECIES_RAICHU_ALOLA SPECIES_RAICHU_ALOLAN
|
||||||
|
#define SPECIES_RAPIDASH_GALAR SPECIES_RAPIDASH_GALARIAN
|
||||||
|
#define SPECIES_RATICATE_ALOLA SPECIES_RATICATE_ALOLAN
|
||||||
|
#define SPECIES_RATICATE_ALOLA_TOTEM SPECIES_RATICATE_ALOLAN_TOTEM
|
||||||
|
#define SPECIES_RATTATA_ALOLA SPECIES_RATTATA_ALOLAN
|
||||||
|
#define SPECIES_RILLABOOM_GMAX SPECIES_RILLABOOM_GIGANTAMAX
|
||||||
|
#define SPECIES_SAMUROTT_HISUI SPECIES_SAMUROTT_HISUIAN
|
||||||
|
#define SPECIES_SANDACONDA_GMAX SPECIES_SANDACONDA_GIGANTAMAX
|
||||||
|
#define SPECIES_SANDSHREW_ALOLA SPECIES_SANDSHREW_ALOLAN
|
||||||
|
#define SPECIES_SANDSLASH_ALOLA SPECIES_SANDSLASH_ALOLAN
|
||||||
|
#define SPECIES_SHELLOS_EAST SPECIES_SHELLOS_EAST_SEA
|
||||||
|
#define SPECIES_SLIGGOO_HISUI SPECIES_SLIGGOO_HISUIAN
|
||||||
|
#define SPECIES_SLOWBRO_GALAR SPECIES_SLOWBRO_GALARIAN
|
||||||
|
#define SPECIES_SLOWKING_GALAR SPECIES_SLOWKING_GALARIAN
|
||||||
|
#define SPECIES_SLOWPOKE_GALAR SPECIES_SLOWPOKE_GALARIAN
|
||||||
|
#define SPECIES_SNEASEL_HISUI SPECIES_SNEASEL_HISUIAN
|
||||||
|
#define SPECIES_SNORLAX_GMAX SPECIES_SNORLAX_GIGANTAMAX
|
||||||
|
#define SPECIES_SQUAWKABILLY_BLUE SPECIES_SQUAWKABILLY_BLUE_PLUMAGE
|
||||||
|
#define SPECIES_SQUAWKABILLY_WHITE SPECIES_SQUAWKABILLY_WHITE_PLUMAGE
|
||||||
|
#define SPECIES_SQUAWKABILLY_YELLOW SPECIES_SQUAWKABILLY_YELLOW_PLUMAGE
|
||||||
|
#define SPECIES_STUNFISK_GALAR SPECIES_STUNFISK_GALARIAN
|
||||||
|
#define SPECIES_TAUROS_PALDEA_AQUA SPECIES_TAUROS_PALDEAN_AQUA_BREED
|
||||||
|
#define SPECIES_TAUROS_PALDEA_BLAZE SPECIES_TAUROS_PALDEAN_BLAZE_BREED
|
||||||
|
#define SPECIES_TAUROS_PALDEA_COMBAT SPECIES_TAUROS_PALDEAN_COMBAT_BREED
|
||||||
|
#define SPECIES_TOXTRICITY_AMPED_GMAX SPECIES_TOXTRICITY_AMPED_GIGANTAMAX
|
||||||
|
#define SPECIES_TOXTRICITY_LOW_KEY_GMAX SPECIES_TOXTRICITY_LOW_KEY_GIGANTAMAX
|
||||||
|
#define SPECIES_TYPHLOSION_HISUI SPECIES_TYPHLOSION_HISUIAN
|
||||||
|
#define SPECIES_UNOWN_EXCLAMATION SPECIES_UNOWN_EMARK
|
||||||
|
#define SPECIES_UNOWN_QUESTION SPECIES_UNOWN_QMARK
|
||||||
|
#define SPECIES_URSHIFU_GMAX SPECIES_URSHIFU_SINGLE_STRIKE_STYLE_GIGANTAMAX
|
||||||
|
#define SPECIES_URSHIFU_RAPID_STRIKE SPECIES_URSHIFU_RAPID_STRIKE_STYLE
|
||||||
|
#define SPECIES_URSHIFU_RAPID_STRIKE_GMAX SPECIES_URSHIFU_RAPID_STRIKE_STYLE_GIGANTAMAX
|
||||||
|
#define SPECIES_VENUSAUR_GMAX SPECIES_VENUSAUR_GIGANTAMAX
|
||||||
|
#define SPECIES_VIVILLON_POKEBALL SPECIES_VIVILLON_POKE_BALL
|
||||||
|
#define SPECIES_VOLTORB_HISUI SPECIES_VOLTORB_HISUIAN
|
||||||
|
#define SPECIES_VULPIX_ALOLA SPECIES_VULPIX_ALOLAN
|
||||||
|
#define SPECIES_WEEZING_GALAR SPECIES_WEEZING_GALARIAN
|
||||||
|
#define SPECIES_WOOPER_PALDEA SPECIES_WOOPER_PALDEAN
|
||||||
|
#define SPECIES_WORMADAM_SANDY SPECIES_WORMADAM_SANDY_CLOAK
|
||||||
|
#define SPECIES_WORMADAM_TRASH SPECIES_WORMADAM_TRASH_CLOAK
|
||||||
|
#define SPECIES_YAMASK_GALAR SPECIES_YAMASK_GALARIAN
|
||||||
|
#define SPECIES_ZACIAN_CROWNED SPECIES_ZACIAN_CROWNED_SWORD
|
||||||
|
#define SPECIES_ZAMAZENTA_CROWNED SPECIES_ZAMAZENTA_CROWNED_SHIELD
|
||||||
|
#define SPECIES_ZAPDOS_GALAR SPECIES_ZAPDOS_GALARIAN
|
||||||
|
#define SPECIES_ZIGZAGOON_GALAR SPECIES_ZIGZAGOON_GALARIAN
|
||||||
|
#define SPECIES_ZOROARK_HISUI SPECIES_ZOROARK_HISUIAN
|
||||||
|
#define SPECIES_ZORUA_HISUI SPECIES_ZORUA_HISUIAN
|
||||||
|
|
||||||
#endif // GUARD_CONSTANTS_SPECIES_H
|
#endif // GUARD_CONSTANTS_SPECIES_H
|
||||||
|
|||||||
@ -371,7 +371,8 @@
|
|||||||
#define F_TRAINER_FEMALE (1 << 7)
|
#define F_TRAINER_FEMALE (1 << 7)
|
||||||
|
|
||||||
// Trainer party defines
|
// Trainer party defines
|
||||||
#define TRAINER_MON_MALE 1
|
#define TRAINER_MON_MALE 1
|
||||||
#define TRAINER_MON_FEMALE 2
|
#define TRAINER_MON_FEMALE 2
|
||||||
|
#define TRAINER_MON_RANDOM_GENDER 3
|
||||||
|
|
||||||
#endif // GUARD_TRAINERS_H
|
#endif // GUARD_TRAINERS_H
|
||||||
|
|||||||
330
migration_scripts/convert_parties.py
Normal file
330
migration_scripts/convert_parties.py
Normal file
@ -0,0 +1,330 @@
|
|||||||
|
# If you have extra members in 'TrainerMon':
|
||||||
|
# 1. Add a regular expression which matches that member (e.g. 'shadow_definition').
|
||||||
|
# 2. Match that regular expression in 'convert' and write into 'attributes' with the key that 'trainerproc' should parse.
|
||||||
|
# 3. Add the key used in 'attributes' to 'pokemon_attribute_order'.
|
||||||
|
# 4. Update 'trainerproc.c' to parse the new key.
|
||||||
|
|
||||||
|
import re
|
||||||
|
import sys
|
||||||
|
|
||||||
|
is_blank = re.compile(r'^[ \t]*(//.*)?$')
|
||||||
|
|
||||||
|
begin_party_definition = re.compile(r'struct TrainerMon (\w+)\[\] =')
|
||||||
|
end_party_definition = re.compile(r'^};')
|
||||||
|
begin_pokemon_definition = re.compile(r'^ { *$')
|
||||||
|
end_pokemon_definition = re.compile(r'^ },? *$')
|
||||||
|
level_definition = re.compile(r'\.lvl = (\d+)')
|
||||||
|
species_definition = re.compile(r'\.species = SPECIES_(\w+)')
|
||||||
|
gender_definition = re.compile(r'\.gender = TRAINER_MON_(\w+)')
|
||||||
|
nickname_definition = re.compile(r'\.nickname = COMPOUND_STRING\("([^"]+)"\)')
|
||||||
|
item_definition = re.compile(r'\.heldItem = ITEM_(\w+)')
|
||||||
|
ball_definition = re.compile(r'\.ball = ITEM_(\w+)')
|
||||||
|
ability_definition = re.compile(r'\.ability = ABILITY_(\w+)')
|
||||||
|
friendship_definition = re.compile(r'\.friendship = (\d+)')
|
||||||
|
shiny_definition = re.compile(r'\.isShiny = (\w+)')
|
||||||
|
ivs_definition = re.compile(r'\.iv = TRAINER_PARTY_IVS\(([0-9 ]+),([0-9 ]+),([0-9 ]+),([0-9 ]+),([0-9 ]+),([0-9 ]+)\)')
|
||||||
|
evs_definition = re.compile(r'\.ev = TRAINER_PARTY_EVS\(([0-9 ]+),([0-9 ]+),([0-9 ]+),([0-9 ]+),([0-9 ]+),([0-9 ]+)\)')
|
||||||
|
moves_definition = re.compile(r'\.moves = \{([^}]+)\}')
|
||||||
|
move_definition = re.compile(r'MOVE_(\w+)')
|
||||||
|
nature_definition = re.compile(r'\.nature = NATURE_(\w+)')
|
||||||
|
|
||||||
|
# NOTE: These are just for aesthetics, the Pokemon would still compile
|
||||||
|
# without them.
|
||||||
|
species_replacements = {
|
||||||
|
"CHIEN_PAO": "Chien-Pao",
|
||||||
|
"CHI_YU": "Chi-Yu",
|
||||||
|
"HAKAMO_O": "Hakamo-o",
|
||||||
|
"HO_OH": "Ho-Oh",
|
||||||
|
"JANGMO_O": "Jangmo-o",
|
||||||
|
"KOMMO_O": "Kommo-o",
|
||||||
|
"PORYGON_Z": "Porygon-Z",
|
||||||
|
"ROTOM_": "Rotom-",
|
||||||
|
"TING_LU": "Ting-Lu",
|
||||||
|
"TYPE_NULL": "Type: Null",
|
||||||
|
"WO_CHIEN": "Wo-Chien",
|
||||||
|
|
||||||
|
"_ALOLAN": "-Alola",
|
||||||
|
"_AQUA_BREED": "-Aqua",
|
||||||
|
"_BATTLE_BOND": "-Bond",
|
||||||
|
"_BLAZE_BREED": "-Blaze",
|
||||||
|
"_CAP": "",
|
||||||
|
"_CLOAK": "",
|
||||||
|
"_COMBAT_BREED": "-Combat",
|
||||||
|
"_CROWED_SHIELD": "-Crowned",
|
||||||
|
"_CROWED_SWORD": "-Crowned",
|
||||||
|
"_DRIVE": "",
|
||||||
|
"_EAST_SEA": "-East",
|
||||||
|
"_FAMILY_OF_FOUR": "-Four",
|
||||||
|
"_FEMALE": "-F",
|
||||||
|
"_FLOWER": "",
|
||||||
|
"_GALARIAN": "-Galar",
|
||||||
|
"_GIGANTAMAX": "-Gmax",
|
||||||
|
"_HISUIAN": "-Hisui",
|
||||||
|
"_ICE_RIDER": "-Ice",
|
||||||
|
"_NOICE_FACE": "-Noice",
|
||||||
|
"_ORIGIN": "-Origin",
|
||||||
|
"_ORIGINAL_COLOR": "-Original",
|
||||||
|
"_PALDEAN": "-Paldea",
|
||||||
|
"_PLUMAGE": "",
|
||||||
|
"_POKE_BALL": "-Pokeball",
|
||||||
|
"_SHADOW_RIDER": "-Shadow",
|
||||||
|
"_STRIKE_STYLE": "-Style",
|
||||||
|
"_TOTEM": "-Totem",
|
||||||
|
"_ZEN_MODE": "-Zen",
|
||||||
|
}
|
||||||
|
|
||||||
|
pokemon_attribute_order = ['Level', 'Ability', 'IVs', 'EVs', 'Happiness', 'Shiny', 'Ball']
|
||||||
|
|
||||||
|
class Pokemon:
|
||||||
|
def __init__(self):
|
||||||
|
self.nickname = None
|
||||||
|
self.species = None
|
||||||
|
self.gender = None
|
||||||
|
self.item = None
|
||||||
|
self.nature = None
|
||||||
|
self.attributes = {}
|
||||||
|
self.attributes['IVs'] = "0 HP / 0 Atk / 0 Def / 0 SpA / 0 SpD / 0 Spe"
|
||||||
|
self.moves = []
|
||||||
|
|
||||||
|
def convert_parties(in_path, in_h):
|
||||||
|
party_identifier = None
|
||||||
|
party = None
|
||||||
|
pokemon = None
|
||||||
|
parties = {}
|
||||||
|
|
||||||
|
for line_no, line in enumerate(in_h, 1):
|
||||||
|
try:
|
||||||
|
line = line[:-1]
|
||||||
|
if m := begin_party_definition.search(line):
|
||||||
|
if party:
|
||||||
|
raise Exception(f"unexpected start of party")
|
||||||
|
[identifier] = m.groups()
|
||||||
|
party_identifier = identifier
|
||||||
|
party = []
|
||||||
|
elif end_party_definition.search(line):
|
||||||
|
if not party:
|
||||||
|
raise Exception(f"unexpected end of party")
|
||||||
|
parties[party_identifier] = party
|
||||||
|
party = None
|
||||||
|
elif begin_pokemon_definition.search(line):
|
||||||
|
if pokemon:
|
||||||
|
raise Exception(f"unexpected start of Pokemon")
|
||||||
|
pokemon = Pokemon()
|
||||||
|
elif end_pokemon_definition.search(line):
|
||||||
|
if not pokemon:
|
||||||
|
raise Exception(f"unexpected end of Pokemon")
|
||||||
|
else:
|
||||||
|
party.append(pokemon)
|
||||||
|
pokemon = None
|
||||||
|
elif m := level_definition.search(line):
|
||||||
|
[level] = m.groups()
|
||||||
|
pokemon.attributes['Level'] = level
|
||||||
|
elif m := species_definition.search(line):
|
||||||
|
[species_] = m.groups()
|
||||||
|
for match, replacement in species_replacements.items():
|
||||||
|
species_ = species_.replace(match, replacement)
|
||||||
|
pokemon.species = species_.replace("_", " ").title()
|
||||||
|
elif m := gender_definition.search(line):
|
||||||
|
[gender_] = m.groups()
|
||||||
|
if gender_ == 'MALE':
|
||||||
|
pokemon.gender = 'M'
|
||||||
|
elif gender_ == 'FEMALE':
|
||||||
|
pokemon.gender = 'F'
|
||||||
|
else:
|
||||||
|
raise Exception(f"unknown gender: '{gender_}'")
|
||||||
|
elif m := nickname_definition.search(line):
|
||||||
|
[nickname] = m.groups()
|
||||||
|
pokemon.nickname = nickname
|
||||||
|
elif m := item_definition.search(line):
|
||||||
|
[item_] = m.groups()
|
||||||
|
pokemon.item = item_.replace("_", " ").title()
|
||||||
|
elif m := ball_definition.search(line):
|
||||||
|
[ball] = m.groups()
|
||||||
|
pokemon.attributes['Ball'] = ball.replace("_", " ").title()
|
||||||
|
elif m := ability_definition.search(line):
|
||||||
|
[ability] = m.groups()
|
||||||
|
pokemon.attributes['Ability'] = ability.replace("_", " ").title()
|
||||||
|
elif m := friendship_definition.search(line):
|
||||||
|
[friendship] = m.groups()
|
||||||
|
pokemon.attributes['Happiness'] = friendship
|
||||||
|
elif m := shiny_definition.search(line):
|
||||||
|
[shiny] = m.groups()
|
||||||
|
if shiny == 'TRUE':
|
||||||
|
pokemon.attributes['Shiny'] = 'Yes'
|
||||||
|
elif shiny == 'FALSE':
|
||||||
|
pokemon.attributes['Shiny'] = 'No'
|
||||||
|
else:
|
||||||
|
raise Exception(f"unknown isShiny: '{shiny}'")
|
||||||
|
elif m := ivs_definition.search(line):
|
||||||
|
[hp, attack, defense, speed, special_attack, special_defense] = [stat.strip() for stat in m.groups()]
|
||||||
|
stats = {"HP": hp, "Atk": attack, "Def": defense, "SpA": special_attack, "SpD": special_defense, "Spe": speed}
|
||||||
|
pokemon.attributes['IVs'] = ' / '.join(f"{value} {key}" for key, value in stats.items())
|
||||||
|
elif m := evs_definition.search(line):
|
||||||
|
[hp, attack, defense, speed, special_attack, special_defense] = [stat.strip() for stat in m.groups()]
|
||||||
|
stats = {"HP": hp, "Atk": attack, "Def": defense, "SpA": special_attack, "SpD": special_defense, "Spe": speed}
|
||||||
|
pokemon.attributes['EVs'] = ' / '.join(f"{value} {key}" for key, value in stats.items() if value != '0')
|
||||||
|
elif m := moves_definition.search(line):
|
||||||
|
[moves_] = m.groups()
|
||||||
|
pokemon.moves = [move.replace("_", " ").title() for move in move_definition.findall(moves_) if move != "NONE"]
|
||||||
|
elif m := nature_definition.search(line):
|
||||||
|
[nature_] = m.groups()
|
||||||
|
pokemon.nature = nature_.replace("_", " ").title()
|
||||||
|
elif is_blank.search(line):
|
||||||
|
pass
|
||||||
|
else:
|
||||||
|
raise Exception(f"could not parse '{line.strip()}'")
|
||||||
|
except Exception as e:
|
||||||
|
print(f"{in_path}:{line_no}: {e}")
|
||||||
|
return parties
|
||||||
|
|
||||||
|
is_trainer_skip = re.compile(r'(const struct Trainer gTrainers\[\] = \{)|(^ \{$)|(\.partySize =)|(\.party = NULL)|(\.mugshotEnabled = TRUE)|(\};)')
|
||||||
|
|
||||||
|
begin_trainer_definition = re.compile(r' \[(TRAINER_\w+)\] =')
|
||||||
|
end_trainer_definition = re.compile(r' }')
|
||||||
|
trainer_class_definition = re.compile(r'\.trainerClass = TRAINER_CLASS_(\w+)')
|
||||||
|
encounter_music_gender_definition = re.compile(r'\.encounterMusic_gender = (F_TRAINER_FEMALE \| )?TRAINER_ENCOUNTER_MUSIC_(\w+)')
|
||||||
|
trainer_pic_definition = re.compile(r'\.trainerPic = TRAINER_PIC_(\w+)')
|
||||||
|
trainer_name_definition = re.compile(r'\.trainerName = _\("([^"]*)"\)')
|
||||||
|
trainer_items_definition = re.compile(r'\.items = \{([^}]*)\}')
|
||||||
|
trainer_item_definition = re.compile(r'ITEM_(\w+)')
|
||||||
|
trainer_double_battle_definition = re.compile(r'\.doubleBattle = (\w+)')
|
||||||
|
trainer_ai_flags_definition = re.compile(r'\.aiFlags = (.*)')
|
||||||
|
trainer_ai_flag_definition = re.compile(r'AI_FLAG_(\w+)')
|
||||||
|
trainer_party_definition = re.compile(r'\.party = TRAINER_PARTY\((\w+)\)')
|
||||||
|
trainer_mugshot_definition = re.compile(r'\.mugshotColor = MUGSHOT_COLOR_(\w+)')
|
||||||
|
trainer_starting_status_definition = re.compile(r'\.startingStatus = STARTING_STATUS_(\w+)')```
|
||||||
|
|
||||||
|
class_fixups = {
|
||||||
|
"Rs": "RS",
|
||||||
|
}
|
||||||
|
|
||||||
|
pic_fixups = {
|
||||||
|
"Rs": "RS",
|
||||||
|
}
|
||||||
|
|
||||||
|
class Trainer:
|
||||||
|
def __init__(self, id_):
|
||||||
|
self.id = id_
|
||||||
|
self.class_ = None
|
||||||
|
self.encounter_music = None
|
||||||
|
self.gender = None
|
||||||
|
self.pic = None
|
||||||
|
self.name = None
|
||||||
|
self.items = []
|
||||||
|
self.double_battle = None
|
||||||
|
self.ai_flags = None
|
||||||
|
self.mugshot = None
|
||||||
|
self.starting_status = None
|
||||||
|
self.party = None
|
||||||
|
|
||||||
|
def convert_trainers(in_path, in_h, parties, out_party):
|
||||||
|
newlines = 0
|
||||||
|
trainer = None
|
||||||
|
for line_no, line in enumerate(in_h, 1):
|
||||||
|
try:
|
||||||
|
line = line[:-1]
|
||||||
|
if m := begin_trainer_definition.search(line):
|
||||||
|
if trainer:
|
||||||
|
raise Exception(f"unexpected start of trainer")
|
||||||
|
[id_] = m.groups()
|
||||||
|
trainer = Trainer(id_)
|
||||||
|
elif m := trainer_class_definition.search(line):
|
||||||
|
[class_] = m.groups()
|
||||||
|
class_ = class_.replace("_", " ").title()
|
||||||
|
for match, replacement in class_fixups.items():
|
||||||
|
class_ = class_.replace(match, replacement)
|
||||||
|
trainer.class_ = class_
|
||||||
|
elif m := encounter_music_gender_definition.search(line):
|
||||||
|
[is_female, music] = m.groups()
|
||||||
|
trainer.gender = 'Female' if is_female else 'Male'
|
||||||
|
trainer.encounter_music = music.replace("_", " ").title()
|
||||||
|
elif m := trainer_pic_definition.search(line):
|
||||||
|
[pic] = m.groups()
|
||||||
|
pic = pic.replace("_", " ").title()
|
||||||
|
for match, replacement in pic_fixups.items():
|
||||||
|
pic = pic.replace(match, replacement)
|
||||||
|
trainer.pic = pic
|
||||||
|
elif m := trainer_name_definition.search(line):
|
||||||
|
[name] = m.groups()
|
||||||
|
trainer.name = name
|
||||||
|
elif m := trainer_items_definition.search(line):
|
||||||
|
[items] = m.groups()
|
||||||
|
trainer.items = " / ".join(item.replace("_", " ").title() for item in trainer_item_definition.findall(items) if item != "NONE")
|
||||||
|
elif m := trainer_double_battle_definition.search(line):
|
||||||
|
[double_battle] = m.groups()
|
||||||
|
if double_battle == 'TRUE':
|
||||||
|
trainer.double_battle = "Yes"
|
||||||
|
elif double_battle == 'FALSE':
|
||||||
|
trainer.double_battle = "No"
|
||||||
|
else:
|
||||||
|
raise Exception(f"unknown doubleBattle: '{double_battle}'")
|
||||||
|
elif m := trainer_ai_flags_definition.search(line):
|
||||||
|
[ai_flags] = m.groups()
|
||||||
|
trainer.ai_flags = " / ".join(ai_flag.replace("_", " ").title() for ai_flag in trainer_ai_flag_definition.findall(ai_flags))
|
||||||
|
elif m := trainer_mugshot_definition.search(line):
|
||||||
|
[color] = m.groups()
|
||||||
|
trainer.mugshot = color.title()
|
||||||
|
elif m := trainer_starting_status_definition.search(line):
|
||||||
|
[starting_status] = m.groups()
|
||||||
|
trainer.starting_status = starting_status.replace("_", " ").title()
|
||||||
|
elif m := trainer_party_definition.search(line):
|
||||||
|
[party] = m.groups()
|
||||||
|
trainer.party = parties[party]
|
||||||
|
elif end_trainer_definition.search(line):
|
||||||
|
if not trainer:
|
||||||
|
raise Exception(f"unexpected end of trainer")
|
||||||
|
while newlines > 0:
|
||||||
|
out_party.write(f"\n")
|
||||||
|
newlines -= 1
|
||||||
|
newlines = 1
|
||||||
|
out_party.write(f"=== {trainer.id} ===\n")
|
||||||
|
out_party.write(f"Name: {trainer.name}\n")
|
||||||
|
out_party.write(f"Class: {trainer.class_}\n")
|
||||||
|
out_party.write(f"Pic: {trainer.pic}\n")
|
||||||
|
out_party.write(f"Gender: {trainer.gender}\n")
|
||||||
|
out_party.write(f"Music: {trainer.encounter_music}\n")
|
||||||
|
if trainer.items:
|
||||||
|
out_party.write(f"Items: {trainer.items}\n")
|
||||||
|
out_party.write(f"Double Battle: {trainer.double_battle}\n")
|
||||||
|
if trainer.ai_flags:
|
||||||
|
out_party.write(f"AI: {trainer.ai_flags}\n")
|
||||||
|
if trainer.mugshot:
|
||||||
|
out_party.write(f"Mugshot: {trainer.mugshot}\n")
|
||||||
|
if trainer.starting_status:
|
||||||
|
out_party.write(f"Starting Status: {trainer.starting_status}\n")
|
||||||
|
if trainer.party:
|
||||||
|
for i, pokemon in enumerate(trainer.party):
|
||||||
|
out_party.write(f"\n")
|
||||||
|
if pokemon.nickname:
|
||||||
|
out_party.write(f"{pokemon.nickname} ({pokemon.species})")
|
||||||
|
else:
|
||||||
|
out_party.write(f"{pokemon.species}")
|
||||||
|
if pokemon.gender:
|
||||||
|
out_party.write(f" ({pokemon.gender})")
|
||||||
|
if pokemon.item and pokemon.item != 'None':
|
||||||
|
out_party.write(f" @ {pokemon.item}")
|
||||||
|
out_party.write(f"\n")
|
||||||
|
if pokemon.nature:
|
||||||
|
out_party.write(f"{pokemon.nature} Nature\n")
|
||||||
|
for key in pokemon_attribute_order:
|
||||||
|
if key in pokemon.attributes:
|
||||||
|
out_party.write(f"{key}: {pokemon.attributes[key]}\n")
|
||||||
|
for move in pokemon.moves:
|
||||||
|
out_party.write(f"- {move}\n")
|
||||||
|
trainer = None
|
||||||
|
elif is_blank.search(line) or is_trainer_skip.search(line):
|
||||||
|
pass
|
||||||
|
else:
|
||||||
|
raise Exception(f"could not parse '{line.strip()}'")
|
||||||
|
except Exception as e:
|
||||||
|
print(f"{in_path}:{line_no}: {e}")
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
try:
|
||||||
|
[argv0, trainers_in_path, parties_in_path, out_path] = sys.argv
|
||||||
|
except:
|
||||||
|
print(f"usage: python3 {sys.argv[0]} <trainers.h> <trainer_parties.h> <out>")
|
||||||
|
else:
|
||||||
|
with open(trainers_in_path, "r") as trainers_in_h, open(parties_in_path, "r") as parties_in_h, open(out_path, "w") as out_party:
|
||||||
|
parties = convert_parties(parties_in_path, parties_in_h)
|
||||||
|
trainers = convert_trainers(trainers_in_path, trainers_in_h, parties, out_party)
|
||||||
@ -2180,7 +2180,9 @@ void ModifyPersonalityForNature(u32 *personality, u32 newNature)
|
|||||||
u32 GeneratePersonalityForGender(u32 gender, u32 species)
|
u32 GeneratePersonalityForGender(u32 gender, u32 species)
|
||||||
{
|
{
|
||||||
const struct SpeciesInfo *speciesInfo = &gSpeciesInfo[species];
|
const struct SpeciesInfo *speciesInfo = &gSpeciesInfo[species];
|
||||||
if (gender == MON_MALE)
|
if (gender == MON_GENDERLESS)
|
||||||
|
return 0;
|
||||||
|
else if (gender == MON_MALE)
|
||||||
return ((255 - speciesInfo->genderRatio) / 2) + speciesInfo->genderRatio;
|
return ((255 - speciesInfo->genderRatio) / 2) + speciesInfo->genderRatio;
|
||||||
else
|
else
|
||||||
return speciesInfo->genderRatio / 2;
|
return speciesInfo->genderRatio / 2;
|
||||||
@ -2254,6 +2256,8 @@ u8 CreateNPCTrainerPartyFromTrainer(struct Pokemon *party, const struct Trainer
|
|||||||
personalityValue = (personalityValue & 0xFFFFFF00) | GeneratePersonalityForGender(MON_MALE, partyData[i].species);
|
personalityValue = (personalityValue & 0xFFFFFF00) | GeneratePersonalityForGender(MON_MALE, partyData[i].species);
|
||||||
else if (partyData[i].gender == TRAINER_MON_FEMALE)
|
else if (partyData[i].gender == TRAINER_MON_FEMALE)
|
||||||
personalityValue = (personalityValue & 0xFFFFFF00) | GeneratePersonalityForGender(MON_FEMALE, partyData[i].species);
|
personalityValue = (personalityValue & 0xFFFFFF00) | GeneratePersonalityForGender(MON_FEMALE, partyData[i].species);
|
||||||
|
else if (partyData[i].gender == TRAINER_MON_RANDOM_GENDER)
|
||||||
|
personalityValue = (personalityValue & 0xFFFFFF00) | GeneratePersonalityForGender(Random() & 1 ? MON_MALE : MON_FEMALE, partyData[i].species);
|
||||||
ModifyPersonalityForNature(&personalityValue, partyData[i].nature);
|
ModifyPersonalityForNature(&personalityValue, partyData[i].nature);
|
||||||
if (partyData[i].isShiny)
|
if (partyData[i].isShiny)
|
||||||
{
|
{
|
||||||
|
|||||||
@ -226,4 +226,8 @@ const union AnimCmd *const sAnims_Trainer[] ={
|
|||||||
};
|
};
|
||||||
|
|
||||||
#include "data/trainer_parties.h"
|
#include "data/trainer_parties.h"
|
||||||
|
|
||||||
|
const struct Trainer gTrainers[] =
|
||||||
|
{
|
||||||
#include "data/trainers.h"
|
#include "data/trainers.h"
|
||||||
|
};
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
42215
src/data/trainers.h
42215
src/data/trainers.h
File diff suppressed because it is too large
Load Diff
16800
src/data/trainers.party
Normal file
16800
src/data/trainers.party
Normal file
File diff suppressed because it is too large
Load Diff
@ -11,47 +11,16 @@
|
|||||||
#include "constants/trainers.h"
|
#include "constants/trainers.h"
|
||||||
#include "constants/battle.h"
|
#include "constants/battle.h"
|
||||||
|
|
||||||
|
static const struct Trainer sTestTrainers[] =
|
||||||
static const struct TrainerMon sTestParty1[] =
|
|
||||||
{
|
{
|
||||||
{
|
#include "trainer_control.h"
|
||||||
.species = SPECIES_WOBBUFFET,
|
|
||||||
.ball = ITEM_MASTER_BALL,
|
|
||||||
.ability = ABILITY_TELEPATHY,
|
|
||||||
.friendship = 42,
|
|
||||||
.gender = TRAINER_MON_FEMALE,
|
|
||||||
.heldItem = ITEM_ASSAULT_VEST,
|
|
||||||
.isShiny = TRUE,
|
|
||||||
.iv = TRAINER_PARTY_IVS(25,26,27,28,29,30),
|
|
||||||
.ev = TRAINER_PARTY_EVS(252, 0, 0, 252, 4, 0),
|
|
||||||
.lvl = 67,
|
|
||||||
.moves = {MOVE_AIR_SLASH, MOVE_BARRIER, MOVE_SOLAR_BEAM, MOVE_EXPLOSION},
|
|
||||||
.nature = NATURE_HASTY,
|
|
||||||
.nickname = COMPOUND_STRING("Bubbles"),
|
|
||||||
.dynamaxLevel = 5,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
.species = SPECIES_WOBBUFFET,
|
|
||||||
.ability = ABILITY_SHADOW_TAG,
|
|
||||||
.lvl = 5,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
.species = SPECIES_WYNAUT,
|
|
||||||
.lvl = 5,
|
|
||||||
},
|
|
||||||
};
|
|
||||||
|
|
||||||
static const struct Trainer sTestTrainer1 =
|
|
||||||
{
|
|
||||||
.trainerName = _("Test1"),
|
|
||||||
.party = TRAINER_PARTY(sTestParty1),
|
|
||||||
};
|
};
|
||||||
|
|
||||||
TEST("CreateNPCTrainerPartyForTrainer generates customized Pokémon")
|
TEST("CreateNPCTrainerPartyForTrainer generates customized Pokémon")
|
||||||
{
|
{
|
||||||
struct Pokemon *testParty = Alloc(6 * sizeof(struct Pokemon));
|
struct Pokemon *testParty = Alloc(6 * sizeof(struct Pokemon));
|
||||||
u8 nickBuffer[20];
|
u8 nickBuffer[20];
|
||||||
CreateNPCTrainerPartyFromTrainer(testParty, &sTestTrainer1, TRUE, BATTLE_TYPE_TRAINER);
|
CreateNPCTrainerPartyFromTrainer(testParty, &sTestTrainers[0], TRUE, BATTLE_TYPE_TRAINER);
|
||||||
EXPECT(IsMonShiny(&testParty[0]));
|
EXPECT(IsMonShiny(&testParty[0]));
|
||||||
EXPECT(!IsMonShiny(&testParty[1]));
|
EXPECT(!IsMonShiny(&testParty[1]));
|
||||||
|
|
||||||
@ -118,7 +87,7 @@ TEST("CreateNPCTrainerPartyForTrainer generates customized Pokémon")
|
|||||||
EXPECT(GetNature(&testParty[1]) == NATURE_HARDY);
|
EXPECT(GetNature(&testParty[1]) == NATURE_HARDY);
|
||||||
|
|
||||||
EXPECT_EQ(GetMonData(&testParty[0], MON_DATA_DYNAMAX_LEVEL), 5);
|
EXPECT_EQ(GetMonData(&testParty[0], MON_DATA_DYNAMAX_LEVEL), 5);
|
||||||
EXPECT_EQ(GetMonData(&testParty[1], MON_DATA_DYNAMAX_LEVEL), 0);
|
EXPECT_EQ(GetMonData(&testParty[1], MON_DATA_DYNAMAX_LEVEL), 10);
|
||||||
|
|
||||||
Free(testParty);
|
Free(testParty);
|
||||||
}
|
}
|
||||||
@ -126,7 +95,7 @@ TEST("CreateNPCTrainerPartyForTrainer generates customized Pokémon")
|
|||||||
TEST("CreateNPCTrainerPartyForTrainer generates different personalities for different mons")
|
TEST("CreateNPCTrainerPartyForTrainer generates different personalities for different mons")
|
||||||
{
|
{
|
||||||
struct Pokemon *testParty = Alloc(6 * sizeof(struct Pokemon));
|
struct Pokemon *testParty = Alloc(6 * sizeof(struct Pokemon));
|
||||||
CreateNPCTrainerPartyFromTrainer(testParty, &sTestTrainer1, TRUE, BATTLE_TYPE_TRAINER);
|
CreateNPCTrainerPartyFromTrainer(testParty, &sTestTrainers[0], TRUE, BATTLE_TYPE_TRAINER);
|
||||||
EXPECT(testParty[0].box.personality != testParty[1].box.personality);
|
EXPECT(testParty[0].box.personality != testParty[1].box.personality);
|
||||||
Free(testParty);
|
Free(testParty);
|
||||||
}
|
}
|
||||||
|
|||||||
88
test/battle/trainer_control.h
Normal file
88
test/battle/trainer_control.h
Normal file
@ -0,0 +1,88 @@
|
|||||||
|
//
|
||||||
|
// DO NOT MODIFY THIS FILE! It is auto-generated from test/battle/trainer_control.party
|
||||||
|
//
|
||||||
|
// If you want to modify this file set COMPETITIVE_PARTY_SYNTAX to FALSE
|
||||||
|
// in include/config.h and remove this notice.
|
||||||
|
// Use sed -i '/^#line/d' 'test/battle/trainer_control.h' to remove #line markers.
|
||||||
|
//
|
||||||
|
|
||||||
|
#line 1 "test/battle/trainer_control.party"
|
||||||
|
|
||||||
|
#line 1
|
||||||
|
[0] =
|
||||||
|
{
|
||||||
|
#line 2
|
||||||
|
.trainerName = _("Test1"),
|
||||||
|
#line 3
|
||||||
|
.trainerClass = TRAINER_CLASS_PKMN_TRAINER_1,
|
||||||
|
#line 4
|
||||||
|
.trainerPic = TRAINER_PIC_RED,
|
||||||
|
.encounterMusic_gender =
|
||||||
|
#line 6
|
||||||
|
TRAINER_ENCOUNTER_MUSIC_MALE,
|
||||||
|
#line 7
|
||||||
|
.doubleBattle = FALSE,
|
||||||
|
.partySize = 3,
|
||||||
|
.party = (const struct TrainerMon[])
|
||||||
|
{
|
||||||
|
{
|
||||||
|
#line 9
|
||||||
|
.nickname = COMPOUND_STRING("Bubbles"),
|
||||||
|
#line 9
|
||||||
|
.species = SPECIES_WOBBUFFET,
|
||||||
|
#line 9
|
||||||
|
.gender = TRAINER_MON_FEMALE,
|
||||||
|
#line 9
|
||||||
|
.heldItem = ITEM_ASSAULT_VEST,
|
||||||
|
#line 14
|
||||||
|
.ev = TRAINER_PARTY_EVS(252, 0, 0, 252, 4, 0),
|
||||||
|
#line 13
|
||||||
|
.iv = TRAINER_PARTY_IVS(25, 26, 27, 28, 29, 30),
|
||||||
|
#line 12
|
||||||
|
.ability = ABILITY_TELEPATHY,
|
||||||
|
#line 11
|
||||||
|
.lvl = 67,
|
||||||
|
#line 17
|
||||||
|
.ball = ITEM_MASTER_BALL,
|
||||||
|
#line 15
|
||||||
|
.friendship = 42,
|
||||||
|
#line 10
|
||||||
|
.nature = NATURE_HASTY,
|
||||||
|
#line 16
|
||||||
|
.isShiny = TRUE,
|
||||||
|
#line 18
|
||||||
|
.dynamaxLevel = 5,
|
||||||
|
.moves = {
|
||||||
|
#line 19
|
||||||
|
MOVE_AIR_SLASH,
|
||||||
|
MOVE_BARRIER,
|
||||||
|
MOVE_SOLAR_BEAM,
|
||||||
|
MOVE_EXPLOSION,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
#line 24
|
||||||
|
.species = SPECIES_WOBBUFFET,
|
||||||
|
.gender = TRAINER_MON_RANDOM_GENDER,
|
||||||
|
#line 27
|
||||||
|
.iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0),
|
||||||
|
#line 26
|
||||||
|
.ability = ABILITY_SHADOW_TAG,
|
||||||
|
#line 25
|
||||||
|
.lvl = 5,
|
||||||
|
.nature = NATURE_HARDY,
|
||||||
|
.dynamaxLevel = MAX_DYNAMAX_LEVEL,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
#line 29
|
||||||
|
.species = SPECIES_WYNAUT,
|
||||||
|
.gender = TRAINER_MON_RANDOM_GENDER,
|
||||||
|
#line 31
|
||||||
|
.iv = TRAINER_PARTY_IVS(0, 0, 0, 0, 0, 0),
|
||||||
|
#line 30
|
||||||
|
.lvl = 5,
|
||||||
|
.nature = NATURE_HARDY,
|
||||||
|
.dynamaxLevel = MAX_DYNAMAX_LEVEL,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
31
test/battle/trainer_control.party
Normal file
31
test/battle/trainer_control.party
Normal file
@ -0,0 +1,31 @@
|
|||||||
|
=== 0 ===
|
||||||
|
Name: Test1
|
||||||
|
Class: Pkmn Trainer 1
|
||||||
|
Pic: Red
|
||||||
|
Gender: Male
|
||||||
|
Music: Male
|
||||||
|
Double Battle: No
|
||||||
|
|
||||||
|
Bubbles (Wobbuffet) (F) @ Assault Vest
|
||||||
|
Hasty Nature
|
||||||
|
Level: 67
|
||||||
|
Ability: Telepathy
|
||||||
|
IVs: 25 HP / 26 Atk / 27 Def / 29 SpA / 30 SpD / 28 Spe
|
||||||
|
EVs: 252 HP / 4 SpA / 252 Spe
|
||||||
|
Happiness: 42
|
||||||
|
Shiny: Yes
|
||||||
|
Ball: Master Ball
|
||||||
|
Dynamax Level: 5
|
||||||
|
- Air Slash
|
||||||
|
- Barrier
|
||||||
|
- Solar Beam
|
||||||
|
- Explosion
|
||||||
|
|
||||||
|
Wobbuffet
|
||||||
|
Level: 5
|
||||||
|
Ability: Shadow Tag
|
||||||
|
IVs: 0 HP / 0 Atk / 0 Def / 0 SpA / 0 SpD / 0 Spe
|
||||||
|
|
||||||
|
Wynaut
|
||||||
|
Level: 5
|
||||||
|
IVs: 0 HP / 0 Atk / 0 Def / 0 SpA / 0 SpD / 0 Spe
|
||||||
1
tools/trainerproc/.gitignore
vendored
Normal file
1
tools/trainerproc/.gitignore
vendored
Normal file
@ -0,0 +1 @@
|
|||||||
|
trainerproc
|
||||||
20
tools/trainerproc/Makefile
Normal file
20
tools/trainerproc/Makefile
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
.PHONY: all clean
|
||||||
|
|
||||||
|
CFLAGS := -Wall -O2
|
||||||
|
|
||||||
|
SRCS := main.c
|
||||||
|
|
||||||
|
ifeq ($(OS),Windows_NT)
|
||||||
|
EXE := .exe
|
||||||
|
else
|
||||||
|
EXE :=
|
||||||
|
endif
|
||||||
|
|
||||||
|
all: trainerproc$(EXE)
|
||||||
|
@:
|
||||||
|
|
||||||
|
trainerproc$(EXE): $(SRCS)
|
||||||
|
$(CC) $(CFLAGS) $(SRCS) -o $@ $(LDFLAGS)
|
||||||
|
|
||||||
|
clean:
|
||||||
|
$(RM) trainerproc$(EXE)
|
||||||
1990
tools/trainerproc/main.c
Normal file
1990
tools/trainerproc/main.c
Normal file
File diff suppressed because it is too large
Load Diff
Loading…
x
Reference in New Issue
Block a user