diff --git a/asm/macros/event.inc b/asm/macros/event.inc index eb8bc7e8a4..5c64ed1eab 100644 --- a/asm/macros/event.inc +++ b/asm/macros/event.inc @@ -732,7 +732,10 @@ OBJ_ID_NONE = 0 @ Configures the arguments for a trainer battle, then jumps to the appropriate script in scripts/trainer_battle.inc - .macro trainerbattle type:req localIdA:req, trainer_a:req, intro_text_a:req, lose_text_a:req, event_script_a:req, localIdB:req, trainer_b:req, intro_text_b:req, lose_text_b:req, event_script_b:req, victory_text:req, cannot_battle:req, isDouble:req, playMusicA:req, playMusicB:req, isRematch:req, rival_battle_flags=0 + .macro trainerbattle type:req \ + localIdA:req, trainer_a:req, intro_text_a:req, lose_text_a:req, event_script_a:req, \ + localIdB:req, trainer_b:req, intro_text_b:req, lose_text_b:req, event_script_b:req, \ + victory_text:req, cannot_battle:req, isDouble:req, playMusicA:req, playMusicB:req, isRematch:req, rival_battle_flags=0 .byte SCR_OP_TRAINERBATTLE .set trainerbattle_flags, 0 .ifgt \isDouble; .set trainerbattle_flags, trainerbattle_flags | (1 << 0); .endif @@ -762,11 +765,20 @@ @ When used with an event script, you can also pass in an optional flag to disable music .macro trainerbattle_single trainer:req, intro_text:req, lose_text:req, event_script=FALSE, music=TRUE .if \event_script == FALSE - trainerbattle TRAINER_BATTLE_SINGLE, LOCALID_NONE, \trainer, \intro_text, \lose_text, NULL, LOCALID_NONE, TRAINER_NONE, NULL, NULL, NULL, NULL, NULL, FALSE, TRUE, FALSE, FALSE + trainerbattle TRAINER_BATTLE_SINGLE, \ + LOCALID_NONE, \trainer, \intro_text, \lose_text, NULL, \ + LOCALID_NONE, TRAINER_NONE, NULL, NULL, NULL, \ + NULL, NULL, FALSE, TRUE, FALSE, FALSE .elseif \music == TRUE - trainerbattle TRAINER_BATTLE_CONTINUE_SCRIPT, LOCALID_NONE, \trainer, \intro_text, \lose_text, \event_script, LOCALID_NONE, TRAINER_NONE, NULL, NULL, NULL, NULL, NULL, FALSE, TRUE, FALSE, FALSE + trainerbattle TRAINER_BATTLE_CONTINUE_SCRIPT, \ + LOCALID_NONE, \trainer, \intro_text, \lose_text, \event_script, \ + LOCALID_NONE, TRAINER_NONE, NULL, NULL, NULL, \ + NULL, NULL, FALSE, TRUE, FALSE, FALSE .else - trainerbattle TRAINER_BATTLE_CONTINUE_SCRIPT_NO_MUSIC, LOCALID_NONE, \trainer, \intro_text, \lose_text, \event_script, LOCALID_NONE, TRAINER_NONE, NULL, NULL, NULL, NULL, NULL, FALSE, TRUE, FALSE, FALSE + trainerbattle TRAINER_BATTLE_CONTINUE_SCRIPT_NO_MUSIC, \ + LOCALID_NONE, \trainer, \intro_text, \lose_text, \event_script, \ + LOCALID_NONE, TRAINER_NONE, NULL, NULL, NULL, \ + NULL, NULL, FALSE, TRUE, FALSE, FALSE .endif .endm @@ -774,38 +786,62 @@ @ and an optional event script. When used with an event script you can pass in an optional flag to disable music .macro trainerbattle_double trainer:req, intro_text:req, lose_text:req, not_enough_pkmn_text:req, event_script=FALSE, music=TRUE .if \event_script == FALSE - trainerbattle TRAINER_BATTLE_DOUBLE, LOCALID_NONE, \trainer, \intro_text, \lose_text, NULL, LOCALID_NONE, TRAINER_NONE, NULL, NULL, NULL, NULL, \not_enough_pkmn_text, TRUE, TRUE, FALSE, FALSE + trainerbattle TRAINER_BATTLE_DOUBLE, \ + LOCALID_NONE, \trainer, \intro_text, \lose_text, NULL, \ + LOCALID_NONE, TRAINER_NONE, NULL, NULL, NULL, \ + NULL, \not_enough_pkmn_text, TRUE, TRUE, FALSE, FALSE .elseif \music == TRUE - trainerbattle TRAINER_BATTLE_CONTINUE_SCRIPT_DOUBLE, LOCALID_NONE, \trainer, \intro_text, \lose_text, \event_script, LOCALID_NONE, TRAINER_NONE, NULL, NULL, NULL, NULL, \not_enough_pkmn_text, TRUE, TRUE, FALSE, FALSE + trainerbattle TRAINER_BATTLE_CONTINUE_SCRIPT_DOUBLE, \ + LOCALID_NONE, \trainer, \intro_text, \lose_text, \event_script, \ + LOCALID_NONE, TRAINER_NONE, NULL, NULL, NULL, \ + NULL, \not_enough_pkmn_text, TRUE, TRUE, FALSE, FALSE .else - trainerbattle TRAINER_BATTLE_CONTINUE_SCRIPT_DOUBLE_NO_MUSIC, LOCALID_NONE, \trainer, \intro_text, \lose_text, \event_script, LOCALID_NONE, TRAINER_NONE, NULL, NULL, NULL, NULL, \not_enough_pkmn_text, TRUE, FALSE, FALSE, FALSE + trainerbattle TRAINER_BATTLE_CONTINUE_SCRIPT_DOUBLE_NO_MUSIC, \ + LOCALID_NONE, \trainer, \intro_text, \lose_text, \event_script, \ + LOCALID_NONE, TRAINER_NONE, NULL, NULL, NULL, \ + NULL, \not_enough_pkmn_text, TRUE, FALSE, FALSE, FALSE .endif .endm @ Starts a rematch battle. Takes a trainer, intro text and loss text .macro trainerbattle_rematch trainer:req, intro_text:req, lose_text:req - trainerbattle TRAINER_BATTLE_REMATCH, LOCALID_NONE, \trainer, \intro_text, \lose_text, NULL, LOCALID_NONE, TRAINER_NONE, NULL, NULL, NULL, NULL, NULL, FALSE, TRUE, FALSE, TRUE + trainerbattle TRAINER_BATTLE_REMATCH, \ + LOCALID_NONE, \trainer, \intro_text, \lose_text, NULL, \ + LOCALID_NONE, TRAINER_NONE, NULL, NULL, NULL, \ + NULL, NULL, FALSE, TRUE, FALSE, TRUE .endm @ Starts a rematch double battle. Takes a trainer, intro text, loss text, and text for when you have too few pokemon .macro trainerbattle_rematch_double trainer:req, intro_text:req, lose_text:req, not_enough_pkmn_text:req - trainerbattle TRAINER_BATTLE_REMATCH_DOUBLE, LOCALID_NONE, \trainer, \intro_text, \lose_text, NULL, LOCALID_NONE, TRAINER_NONE, NULL, NULL, NULL, NULL, \not_enough_pkmn_text, FALSE, TRUE, FALSE, TRUE + trainerbattle TRAINER_BATTLE_REMATCH_DOUBLE, \ + LOCALID_NONE, \trainer, \intro_text, \lose_text, NULL, \ + LOCALID_NONE, TRAINER_NONE, NULL, NULL, NULL, \ + NULL, \not_enough_pkmn_text, FALSE, TRUE, FALSE, TRUE .endm @ Starts a trainer battle, skipping intro text. Takes a trainer and loss text .macro trainerbattle_no_intro trainer:req, lose_text:req - trainerbattle TRAINER_BATTLE_SINGLE_NO_INTRO_TEXT, LOCALID_NONE, \trainer, NULL, \lose_text, NULL, LOCALID_NONE, TRAINER_NONE, NULL, NULL, NULL, NULL, NULL, FALSE, TRUE, FALSE, FALSE + trainerbattle TRAINER_BATTLE_SINGLE_NO_INTRO_TEXT, \ + LOCALID_NONE, \trainer, NULL, \lose_text, NULL, \ + LOCALID_NONE, TRAINER_NONE, NULL, NULL, NULL, \ + NULL, NULL, FALSE, TRUE, FALSE, FALSE .endm @ Starts a double battle with the player against two trainers @ Takes two trainers and defeat text for each .macro trainerbattle_two_trainers trainer_a:req, lose_text_a:req, trainer_b:req, lose_text_b:req - trainerbattle TRAINER_BATTLE_TWO_TRAINERS_NO_INTRO, OBJ_ID_NONE, \trainer_a, NULL, \lose_text_a, NULL, OBJ_ID_NONE, \trainer_b, NULL, \lose_text_b, NULL, NULL, NULL, FALSE, TRUE, FALSE, FALSE + trainerbattle TRAINER_BATTLE_TWO_TRAINERS_NO_INTRO, \ + OBJ_ID_NONE, \trainer_a, NULL, \lose_text_a, NULL, \ + OBJ_ID_NONE, \trainer_b, NULL, \lose_text_b, NULL, \ + NULL, NULL, FALSE, TRUE, FALSE, FALSE .endm @ Starts a trainer battle with victory text if the player loses. If flags is nonzero, the player will be healed after battle (and its assumed to be the tutorial battle) .macro trainerbattle_earlyrival trainer:req, flags:req, lose_text:req, victory_text:req - trainerbattle TRAINER_BATTLE_EARLY_RIVAL, OBJ_ID_NONE, \trainer, NULL, \lose_text, NULL, OBJ_ID_NONE, TRAINER_NONE, NULL, NULL, NULL, \victory_text, NULL, FALSE, TRUE, FALSE, FALSE, \flags + trainerbattle TRAINER_BATTLE_EARLY_RIVAL, \ + OBJ_ID_NONE, \trainer, NULL, \lose_text, NULL, \ + OBJ_ID_NONE, TRAINER_NONE, NULL, NULL, NULL, \ + \victory_text, NULL, FALSE, TRUE, FALSE, FALSE, \flags .endm @ Starts a trainer battle using the battle information stored in RAM (usually by the scripts in trainer_battle.inc, which @@ -1017,7 +1053,12 @@ @ Gives the player a Pokémon of the specified species and level, and allows to customize extra parameters. @ VAR_RESULT will be set to MON_GIVEN_TO_PARTY, MON_GIVEN_TO_PC, or MON_CANT_GIVE depending on the outcome. - .macro givemon species:req, level:req, item, ball, nature, abilityNum, gender, hpEv, atkEv, defEv, speedEv, spAtkEv, spDefEv, hpIv, atkIv, defIv, speedIv, spAtkIv, spDefIv, move1, move2, move3, move4, shinyMode, gmaxFactor, teraType, dmaxLevel + .macro givemon species:req, level:req, \ + item, ball, nature, abilityNum, gender, \ + hpEv, atkEv, defEv, speedEv, spAtkEv, spDefEv, \ + hpIv, atkIv, defIv, speedIv, spAtkIv, spDefIv, \ + move1, move2, move3, move4, \ + shinyMode, gmaxFactor, teraType, dmaxLevel callnative ScrCmd_createmon, requests_effects=1 .byte 0 .byte PARTY_SIZE @ assign to first empty slot @@ -1079,7 +1120,12 @@ @ creates a mon for a given party and slot @ otherwise - .macro createmon side:req, slot:req, species:req, level:req, item, ball, nature, abilityNum, gender, hpEv, atkEv, defEv, speedEv, spAtkEv, spDefEv, hpIv, atkIv, defIv, speedIv, spAtkIv, spDefIv, move1, move2, move3, move4, shinyMode, gmaxFactor, teraType, dmaxLevel + .macro createmon side:req, slot:req, species:req, level:req, \ + item, ball, nature, abilityNum, gender, \ + hpEv, atkEv, defEv, speedEv, spAtkEv, spDefEv, \ + hpIv, atkIv, defIv, speedIv, spAtkIv, spDefIv, \ + move1, move2, move3, move4, \ + shinyMode, gmaxFactor, teraType, dmaxLevel callnative ScrCmd_createmon, requests_effects=1 .byte \side @ 0 - player, 1 - opponent .byte \slot @ 0-5 diff --git a/tools/preproc/asm_file.cpp b/tools/preproc/asm_file.cpp index 6daf0d841a..105a819719 100644 --- a/tools/preproc/asm_file.cpp +++ b/tools/preproc/asm_file.cpp @@ -38,6 +38,7 @@ AsmFile::AsmFile(std::string filename, bool isStdin, bool doEnum) : m_filename(f m_lineNum = 1; m_lineStart = 0; + ConsumeLineSkip(); RemoveComments(); } @@ -123,6 +124,31 @@ void AsmFile::RemoveComments() } } +void AsmFile::ConsumeLineSkip() +{ + long pos = 0; + + while (m_buffer[pos] != 0) + { + if (m_buffer[pos] == '\\') + { + long p = pos; + pos++; + + while (m_buffer[pos] == ' ' || m_buffer[pos] == '\t') + pos++; + + if (m_buffer[pos] == '\n') + { + m_buffer[p] = ' '; + m_buffer[pos] = ' '; + } + } + + pos++; + } +} + // Checks if we're at a particular directive and if so, consumes it. // Returns whether the directive was found. bool AsmFile::CheckForDirective(std::string name) diff --git a/tools/preproc/asm_file.h b/tools/preproc/asm_file.h index 0b25c7ad2b..e1f6addea4 100644 --- a/tools/preproc/asm_file.h +++ b/tools/preproc/asm_file.h @@ -76,6 +76,7 @@ private: bool ConsumeComma(); int ReadPadLength(); void RemoveComments(); + void ConsumeLineSkip(); bool CheckForDirective(std::string name); void SkipWhitespace(); void ExpectEmptyRestOfLine();