This commit is contained in:
Salem 2026-03-21 23:38:08 +01:00 committed by GitHub
commit cdf04993b0
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with 87 additions and 14 deletions

View File

@ -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

View File

@ -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)

View File

@ -76,6 +76,7 @@ private:
bool ConsumeComma();
int ReadPadLength();
void RemoveComments();
void ConsumeLineSkip();
bool CheckForDirective(std::string name);
void SkipWhitespace();
void ExpectEmptyRestOfLine();