Merge branch '_RHH/upcoming' into _RHH/pr/upcoming/lighting-expansion-v2

This commit is contained in:
Eduardo Quezada 2025-02-20 19:17:59 -03:00
commit 2428af66cd
444 changed files with 22191 additions and 9746 deletions

View File

@ -23,9 +23,10 @@ body:
label: Version
description: What version of pokeemerald-expansion are you using as a base?
options:
- 1.10.1 (Latest release)
- 1.10.2 (Latest release)
- master (default, unreleased bugfixes)
- upcoming (Edge)
- 1.10.1
- 1.10.0
- 1.9.4
- 1.9.3

View File

@ -23,9 +23,10 @@ body:
label: Version
description: What version of pokeemerald-expansion are you using as a base?
options:
- 1.10.1 (Latest release)
- 1.10.2 (Latest release)
- master (default, unreleased bugfixes)
- upcoming (Edge)
- 1.10.1
- 1.10.0
- 1.9.4
- 1.9.3

View File

@ -23,9 +23,10 @@ body:
label: Version
description: What version of pokeemerald-expansion are you using as a base?
options:
- 1.10.1 (Latest release)
- 1.10.2 (Latest release)
- master (default, unreleased bugfixes)
- upcoming (Edge)
- 1.10.1
- 1.10.0
- 1.9.4
- 1.9.3

4
.gitignore vendored
View File

@ -41,3 +41,7 @@ prefabs.json
/pokeemerald-*.png
src/data/map_group_count.h
tools/trainerproc/trainerproc
*.Identifier
*.smol
*.fastSmol
*.smolTM

View File

@ -1,6 +1,7 @@
# Pokeemerald-Expansion Changelogs
## 1.10.x
- **[Version 1.10.2](docs/changelogs/1.10.x/1.10.2.md) - 🧹 Bugfix Release**
- **[Version 1.10.1](docs/changelogs/1.10.x/1.10.1.md) - 🧹 Bugfix Release**
- **[Version 1.10.0](docs/changelogs/1.10.x/1.10.0.md) - ✨ Feature Release**

4
CREDITS.md Normal file
View File

@ -0,0 +1,4 @@
## Mega Evolution Overworld Sprite Credits:
- [princess-phoenix](https://www.deviantart.com/princess-phoenix)
- [larryturbo](https://www.deviantart.com/larryturbo)
- [kidkatt](https://www.deviantart.com/kidkatt)

View File

@ -10,7 +10,7 @@ The main advantage of using vanilla pokeemerald as a base is being able to link
If you use pokeemerald-expansion in your hack, please add RHH (Rom Hacking Hideout) to your credits list. Optionally, you can list the version used, so it can help players know what features to expect.
You can phrase it as the following:
```
Based off RHH's pokeemerald-expansion 1.10.1 https://github.com/rh-hideout/pokeemerald-expansion/
Based off RHH's pokeemerald-expansion 1.10.2 https://github.com/rh-hideout/pokeemerald-expansion/
```
#### Important: DO NOT use GitHub's "Download Zip" option. Using this option will not download the commit history required to update your expansion version or merge other feature branches. Instead, please read [this guide](https://github.com/Pawkkie/Team-Aquas-Asset-Repo/wiki/The-Basics-of-GitHub) to learn how to fork the repository and clone locally from there.

View File

@ -57,7 +57,7 @@
special CallBattleDomeFunction
.endm
@ Sets gTrainerBattleOpponent_A to the trainer ID of the next opponent
@ Sets gTrainerBattleParameter.params.opponentA to the trainer ID of the next opponent
.macro dome_setopponent
setvar VAR_0x8004, BATTLE_DOME_FUNC_SET_OPPONENT_ID
special CallBattleDomeFunction

View File

@ -115,14 +115,13 @@
.macro multi_2_vs_2 trainer1Id:req, trainer1LoseText:req, trainer2Id:req, trainer2LoseText:req, partnerId:req
special SavePlayerParty
trainerbattle TRAINER_BATTLE_SET_TRAINER_A, \trainer1Id, 0, NULL, \trainer1LoseText @ set first trainer mons
trainerbattle TRAINER_BATTLE_SET_TRAINER_B, \trainer2Id, 0, NULL, \trainer2LoseText @ set second trainer mons
trainerbattle TRAINER_BATTLE_SET_TRAINERS_FOR_MULTI_BATTLE, OBJ_ID_NONE, \trainer1Id, NULL, \trainer1LoseText, NULL, OBJ_ID_NONE, \trainer2Id, NULL, \trainer2LoseText, NULL, NULL, NULL, FALSE, TRUE, FALSE, FALSE
multi_do MULTI_BATTLE_2_VS_2, \partnerId
.endm
.macro multi_2_vs_1 trainer1Id:req, trainer1LoseText:req, partnerId:req
special SavePlayerParty
trainerbattle TRAINER_BATTLE_SET_TRAINER_A, \trainer1Id, 0, NULL, \trainer1LoseText @ set first trainer mons
trainerbattle TRAINER_BATTLE_SET_TRAINERS_FOR_MULTI_BATTLE, OBJ_ID_NONE, \trainer1Id, NULL, \trainer1LoseText, NULL, OBJ_ID_NONE, TRAINER_NONE, NULL, NULL, NULL, NULL, NULL, FALSE, TRUE, FALSE, FALSE
multi_do MULTI_BATTLE_2_VS_1, \partnerId
.endm
@ -145,14 +144,13 @@
.macro multi_fixed_2_vs_2 trainer1Id:req, trainer1LoseText:req, trainer2Id:req, trainer2LoseText:req, partnerId:req
special SavePlayerParty
trainerbattle TRAINER_BATTLE_SET_TRAINER_A, \trainer1Id, 0, NULL, \trainer1LoseText @ set first trainer mons
trainerbattle TRAINER_BATTLE_SET_TRAINER_B, \trainer2Id, 0, NULL, \trainer2LoseText @ set second trainer mons
trainerbattle TRAINER_BATTLE_SET_TRAINERS_FOR_MULTI_BATTLE, OBJ_ID_NONE, \trainer1Id, NULL, \trainer1LoseText, NULL, OBJ_ID_NONE, \trainer2Id, NULL, \trainer2LoseText, NULL, NULL, NULL, FALSE, TRUE, FALSE, FALSE
multi_do_fixed MULTI_BATTLE_2_VS_2, \partnerId
.endm
.macro multi_fixed_2_vs_1 trainer1Id:req, trainer1LoseText:req, partnerId:req
special SavePlayerParty
trainerbattle TRAINER_BATTLE_SET_TRAINER_A, \trainer1Id, 0, NULL, \trainer1LoseText @ set first trainer mons
trainerbattle TRAINER_BATTLE_SET_TRAINERS_FOR_MULTI_BATTLE, OBJ_ID_NONE, \trainer1Id, NULL, \trainer1LoseText, NULL, OBJ_ID_NONE, TRAINER_NONE, NULL, NULL, NULL, NULL, NULL, FALSE, TRUE, FALSE, FALSE
multi_do_fixed MULTI_BATTLE_2_VS_1, \partnerId
.endm

View File

@ -133,7 +133,7 @@
special CallFrontierUtilFunc
.endm
@ Buffer the name of gTrainerBattleOpponent_A in STR_VAR_1 (0) or STR_VAR_2 (1)
@ Buffer the name of gTrainerBattleParameter.params.opponentA in STR_VAR_1 (0) or STR_VAR_2 (1)
.macro frontier_gettrainername stringVar:req
setvar VAR_0x8004, FRONTIER_UTIL_FUNC_BUFFER_TRAINER_NAME
.if \stringVar == STR_VAR_1

View File

@ -1277,8 +1277,9 @@
.byte 0xef
.endm
.macro givecaughtmon
.macro givecaughtmon passInstr:req
.byte 0xf0
.4byte \passInstr
.endm
.macro trysetcaughtmondexflags failInstr:req
@ -1290,9 +1291,8 @@
.byte 0xf2
.endm
.macro trygivecaughtmonnick successInstr:req
.macro trygivecaughtmonnick
.byte 0xf3
.4byte \successInstr
.endm
.macro subattackerhpbydmg
@ -1555,13 +1555,43 @@
.4byte \failInstr
.endm
.macro trysetstatus1, ptr:req
callnative BS_TrySetStatus1
.macro trysetparalysis, ptr:req
callnative BS_TrySetParalysis
.4byte \ptr
.endm
.macro trysetstatus2, ptr:req
callnative BS_TrySetStatus2
.macro trysetpoison, ptr:req
callnative BS_TrySetPoison
.4byte \ptr
.endm
.macro trysetpoisonparalysis, ptr:req
callnative BS_TrySetPoisonParalyzis
.4byte \ptr
.endm
.macro tryseteffectspore, ptr:req
callnative BS_TrySetEffectSpore
.4byte \ptr
.endm
.macro trysetconfusion, ptr:req
callnative BS_TrySetConfusion
.4byte \ptr
.endm
.macro trysetinfatuation, ptr:req
callnative BS_TrySetInfatuation
.4byte \ptr
.endm
.macro trysetescapeprevention, ptr:req
callnative BS_TrySetEscapePrevention
.4byte \ptr
.endm
.macro trysettorment, ptr:req
callnative BS_TrySetTorment
.4byte \ptr
.endm
@ -1611,8 +1641,8 @@
callnative BS_TryTriggerStatusForm
.endm
.macro setphotongeysercategory
callnative BS_SetPhotonGeyserCategory
.macro setdynamicmovecategory
callnative BS_SetDynamicMoveCategory
.endm
.macro tryupperhand failInstr:req
@ -1727,11 +1757,6 @@
.4byte \failInstr
.endm
.macro tryhitswitchtarget failInstr:req
callnative BS_TryHitSwitchTarget
.4byte \failInstr
.endm
.macro setmagiccoattarget
callnative BS_SetMagicCoatTarget
.endm
@ -1762,6 +1787,15 @@
callnative BS_RemoveTerrain
.endm
.macro tryspectralthiefsteal jumpInstr:req
callnative BS_TrySpectralThiefSteal
.4byte \jumpInstr
.endm
.macro spectralthiefprintstats
callnative BS_SpectralThiefPrintStats
.endm
.macro setmoveresultflags flags:req
callnative BS_SetMoveResultFlags
.2byte \flags
@ -2078,10 +2112,6 @@
various \battler, VARIOUS_SET_POWDER
.endm
.macro spectralthiefprintstats
various BS_ATTACKER, VARIOUS_SPECTRAL_THIEF
.endm
.macro bringdownairbornebattler battler:req
various \battler, VARIOUS_GRAVITY_ON_AIRBORNE_MONS
.endm

View File

@ -694,59 +694,31 @@
.byte \direction
.endm
NULL = 0
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, trainer:req, local_id:req, pointer1:req, pointer2, pointer3, pointer4
.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
.byte SCR_OP_TRAINERBATTLE
.byte \type
.2byte \trainer
.2byte \local_id
.if \type == TRAINER_BATTLE_SINGLE
.4byte \pointer1 @ text
.4byte \pointer2 @ text
.elseif \type == TRAINER_BATTLE_CONTINUE_SCRIPT_NO_MUSIC
.4byte \pointer1 @ text
.4byte \pointer2 @ text
.4byte \pointer3 @ event script
.elseif \type == TRAINER_BATTLE_CONTINUE_SCRIPT
.4byte \pointer1 @ text
.4byte \pointer2 @ text
.4byte \pointer3 @ event script
.elseif \type == TRAINER_BATTLE_SINGLE_NO_INTRO_TEXT
.4byte \pointer1 @ text
.elseif \type == TRAINER_BATTLE_DOUBLE
.4byte \pointer1 @ text
.4byte \pointer2 @ text
.4byte \pointer3 @ text
.elseif \type == TRAINER_BATTLE_REMATCH
.4byte \pointer1 @ text
.4byte \pointer2 @ text
.elseif \type == TRAINER_BATTLE_CONTINUE_SCRIPT_DOUBLE
.4byte \pointer1 @ text
.4byte \pointer2 @ text
.4byte \pointer3 @ text
.4byte \pointer4 @ event script
.elseif \type == TRAINER_BATTLE_REMATCH_DOUBLE
.4byte \pointer1 @ text
.4byte \pointer2 @ text
.4byte \pointer3 @ text
.elseif \type == TRAINER_BATTLE_CONTINUE_SCRIPT_DOUBLE_NO_MUSIC
.4byte \pointer1 @ text
.4byte \pointer2 @ text
.4byte \pointer3 @ text
.4byte \pointer4 @ event script
.elseif \type == TRAINER_BATTLE_PYRAMID
.4byte \pointer1 @ text
.4byte \pointer2 @ text
.elseif \type == TRAINER_BATTLE_SET_TRAINER_A
.4byte \pointer1 @ text
.4byte \pointer2 @ text
.elseif \type == TRAINER_BATTLE_SET_TRAINER_B
.4byte \pointer1 @ text
.4byte \pointer2 @ text
.elseif \type == TRAINER_BATTLE_HILL
.4byte \pointer1 @ text
.4byte \pointer2 @ text
.endif
.set trainerbattle_flags, 0
.ifgt \isDouble; .set trainerbattle_flags, trainerbattle_flags | (1 << 0); .endif
.ifgt \isRematch; .set trainerbattle_flags, trainerbattle_flags | (1 << 1); .endif
.ifgt \playMusicA; .set trainerbattle_flags, trainerbattle_flags | (1 << 2); .endif
.ifgt \playMusicB; .set trainerBattle_flags, trainerbattle_flags | (1 << 3); .endif
.ifgt \type; .set trainerbattle_flags, trainerbattle_flags | (\type << 4); .endif
.byte trainerbattle_flags
.byte \localIdA @ objEventLocalIdA
.2byte \trainer_a @ opponentA
.4byte \intro_text_a @ introTextA
.4byte \lose_text_a @ defeatTextA
.4byte \event_script_a @ retAddrA
.byte \localIdB @ objEventLocalIdB
.2byte \trainer_b @ opponentB
.4byte \intro_text_b @ introTextB
.4byte \lose_text_b @ defeatTextB
.4byte \event_script_b @ retAddrB
.4byte \victory_text @ victoryText
.4byte \cannot_battle @ cannotBattle
.endm
NO_MUSIC = FALSE
@ -755,11 +727,11 @@
@ 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, \trainer, 0, \intro_text, \lose_text
trainerbattle TRAINER_BATTLE_SINGLE, OBJ_ID_NONE, \trainer, \intro_text, \lose_text, NULL, OBJ_ID_NONE, TRAINER_NONE, NULL, NULL, NULL, NULL, NULL, FALSE, TRUE, FALSE, FALSE
.elseif \music == TRUE
trainerbattle TRAINER_BATTLE_CONTINUE_SCRIPT, \trainer, 0, \intro_text, \lose_text, \event_script
trainerbattle TRAINER_BATTLE_CONTINUE_SCRIPT, OBJ_ID_NONE, \trainer, \intro_text, \lose_text, \event_script, OBJ_ID_NONE, TRAINER_NONE, NULL, NULL, NULL, NULL, NULL, FALSE, TRUE, FALSE, FALSE
.else
trainerbattle TRAINER_BATTLE_CONTINUE_SCRIPT_NO_MUSIC, \trainer, 0, \intro_text, \lose_text, \event_script
trainerbattle TRAINER_BATTLE_CONTINUE_SCRIPT_NO_MUSIC, OBJ_ID_NONE, \trainer, \intro_text, \lose_text, \event_script, OBJ_ID_NONE, TRAINER_NONE, NULL, NULL, NULL, NULL, NULL, FALSE, TRUE, FALSE, FALSE
.endif
.endm
@ -767,38 +739,33 @@
@ 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, \trainer, 0, \intro_text, \lose_text, \not_enough_pkmn_text
trainerbattle TRAINER_BATTLE_DOUBLE, OBJ_ID_NONE, \trainer, \intro_text, \lose_text, NULL, OBJ_ID_NONE, TRAINER_NONE, NULL, NULL, NULL, NULL, \not_enough_pkmn_text, TRUE, TRUE, FALSE, FALSE
.elseif \music == TRUE
trainerbattle TRAINER_BATTLE_CONTINUE_SCRIPT_DOUBLE, \trainer, 0, \intro_text, \lose_text, \not_enough_pkmn_text, \event_script
trainerbattle TRAINER_BATTLE_CONTINUE_SCRIPT_DOUBLE, OBJ_ID_NONE, \trainer, \intro_text, \lose_text, \event_script, OBJ_ID_NONE, TRAINER_NONE, NULL, NULL, NULL, NULL, \not_enough_pkmn_text, TRUE, TRUE, FALSE, FALSE
.else
trainerbattle TRAINER_BATTLE_CONTINUE_SCRIPT_DOUBLE_NO_MUSIC, \trainer, 0, \intro_text, \lose_text, \not_enough_pkmn_text, \event_script
trainerbattle TRAINER_BATTLE_CONTINUE_SCRIPT_DOUBLE_NO_MUSIC, OBJ_ID_NONE, \trainer, \intro_text, \lose_text, \event_script, OBJ_ID_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, \trainer, 0, \intro_text, \lose_text
trainerbattle TRAINER_BATTLE_REMATCH, OBJ_ID_NONE, \trainer, \intro_text, \lose_text, NULL, OBJ_ID_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, \trainer, 0, \intro_text, \lose_text, \not_enough_pkmn_text
trainerbattle TRAINER_BATTLE_REMATCH_DOUBLE, OBJ_ID_NONE, \trainer, \intro_text, \lose_text, NULL, OBJ_ID_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, \trainer, 0, \lose_text
trainerbattle TRAINER_BATTLE_SINGLE_NO_INTRO_TEXT, OBJ_ID_NONE, \trainer, NULL, \lose_text, NULL, OBJ_ID_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
.byte 0x5c
.byte TRAINER_BATTLE_TWO_TRAINERS_NO_INTRO
.2byte \trainer_a
.4byte \lose_text_a
.2byte \trainer_b
.4byte \lose_text_b
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 using the battle information stored in RAM (usually by the scripts in trainer_battle.inc, which
@ -2375,7 +2342,7 @@
@ Stores the position of the given object in destX and destY. Mode CURRENT_POSITION will take the object's current position. Mode TEMPLATE_POSITION will take the object's template position.
.macro getobjectxy localId:req, posType:req, destX:req, destY:req
callnative ScrCmd_getobjectxy, request_effects=1
callnative ScrCmd_getobjectxy, requests_effects=1
.2byte \localId
.2byte \posType
.2byte \destX
@ -2383,7 +2350,7 @@
.endm
.macro getobjecttemplatexy localId:req, posType = TEMPLATE_POSITION, destX:req, destY:req
callnative ScrCmd_getobjectxy, request_effects=1
callnative ScrCmd_getobjectxy, requests_effects=1
.2byte \localId
.2byte \posType
.2byte \destX
@ -2391,7 +2358,7 @@
.endm
.macro getobjectcurrentxy localId:req, posType = CURRENT_POSITION, destX:req, destY:req
callnative ScrCmd_getobjectxy, request_effects=1
callnative ScrCmd_getobjectxy, requests_effects=1
.2byte \localId
.2byte \posType
.2byte \destX
@ -2400,7 +2367,7 @@
@ Return TRUE to dest if there is an object at the position x and y.
.macro checkobjectat x:req, y:req, dest = VAR_RESULT
callnative ScrCmd_checkobjectat, request_effects=1
callnative ScrCmd_checkobjectat, requests_effects=1
.2byte \x
.2byte \y
.2byte \dest
@ -2408,28 +2375,28 @@
@ Returns the state of the Pokedex Seen Flag to VAR_RESULT for the Pokemon with speciesId
.macro getseenmon species:req
callnative Scrcmd_getsetpokedexflag, request_effects=1
callnative Scrcmd_getsetpokedexflag, requests_effects=1
.2byte \species
.2byte FLAG_GET_SEEN
.endm
@ Returns the state of the Pokedex Caught Flag to VAR_RESULT for the Pokemon with speciesId
.macro getcaughtmon species:req
callnative Scrcmd_getsetpokedexflag, request_effects=1
callnative Scrcmd_getsetpokedexflag, requests_effects=1
.2byte \species
.2byte FLAG_GET_CAUGHT
.endm
@ Sets the Pokedex Seen Flag for the Pokemon with speciesId
.macro setseenmon species:req
callnative Scrcmd_getsetpokedexflag, request_effects=1
callnative Scrcmd_getsetpokedexflag, requests_effects=1
.2byte \species
.2byte FLAG_SET_SEEN
.endm
@ Sets the Pokedex Caught Flag for the Pokemon with speciesId
.macro setcaughtmon species:req
callnative Scrcmd_getsetpokedexflag, request_effects=1
callnative Scrcmd_getsetpokedexflag, requests_effects=1
.2byte \species
.2byte FLAG_SET_CAUGHT
.endm
@ -2439,10 +2406,10 @@
.if \mode == OPEN_PARTY_SCREEN
special ChoosePartyMon
waitstate
callnative Scrcmd_checkspecies_choose, request_effects=1
callnative Scrcmd_checkspecies_choose, requests_effects=1
.2byte \speciesId
.else
callnative Scrcmd_checkspecies, request_effects=1
callnative Scrcmd_checkspecies, requests_effects=1
.2byte \speciesId
.endif
.endm
@ -2453,11 +2420,17 @@
@ Gets the facing direction of a given event object and stores it in the variable dest.
.macro getobjectfacingdirection localId:req, dest:req
callnative Scrcmd_getobjectfacingdirection, request_effects=1
callnative Scrcmd_getobjectfacingdirection, requests_effects=1
.2byte \localId
.2byte \dest
.endm
@ Hides any follower Pokémon if present, putting them into their Poké Ball; by default waits for their movement to finish.
.macro hidefollower wait=1
callnative ScrFunc_hidefollower
.2byte \wait
.endm
.macro increasedifficulty
callnative Script_IncreaseDifficulty, requests_effects=1
.endm
@ -2540,11 +2513,3 @@
compare \a, \b
cant_see_if 5
.endm
@ hide any follower pokemon if present,
@ putting them into their pokeball;
@ by default waits for their movement to finish
.macro hidefollower wait=1
callnative ScrFunc_hidefollower
.2byte \wait
.endm

View File

@ -2228,7 +2228,7 @@ gBattleAnimMove_ZenHeadbutt::
createvisualtask AnimTask_ShakeMonInPlace, 2, ANIM_ATTACKER, 2, 0, 4, 1
createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 5, 0, 6, 1
createsprite gBowMonSpriteTemplate, ANIM_ATTACKER, 1, 2
createsprite gAquaTailHitSpriteTemplate, ANIM_TARGER, 131, 0, 0, 1, 1
createsprite gAquaTailHitSpriteTemplate, ANIM_TARGET, 131, 0, 0, 1, 1
playsewithpan SE_M_VITAL_THROW2, SOUND_PAN_TARGET
waitforvisualfinish
createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, 1, 4, 4, 0, 0
@ -2246,22 +2246,22 @@ gBattleAnimMove_MirrorShot::
createvisualtask AnimTask_BlendBattleAnimPalExclude, 5, 5, 2, 0, 10, RGB_WHITEALPHA
createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_IMPACT, 0, 12, 12, RGB(21, 21, 21)
waitforvisualfinish
createsprite gRandomPosHitSplatSpriteTemplate, ANIM_TARGER, 131, 1, 2
createsprite gRandomPosHitSplatSpriteTemplate, ANIM_TARGET, 131, 1, 2
createvisualtask SoundTask_PlaySE1WithPanning, 5, SE_M_VITAL_THROW2, SOUND_PAN_TARGET
delay 3
createsprite gRandomPosHitSplatSpriteTemplate, ANIM_TARGER, 131, 1, 2
createsprite gRandomPosHitSplatSpriteTemplate, ANIM_TARGET, 131, 1, 2
createvisualtask SoundTask_PlaySE1WithPanning, 5, SE_M_VITAL_THROW2, SOUND_PAN_TARGET
delay 3
createsprite gRandomPosHitSplatSpriteTemplate, ANIM_TARGER, 131, 1, 2
createsprite gRandomPosHitSplatSpriteTemplate, ANIM_TARGET, 131, 1, 2
createvisualtask SoundTask_PlaySE1WithPanning, 5, SE_M_VITAL_THROW2, SOUND_PAN_TARGET
delay 3
createsprite gRandomPosHitSplatSpriteTemplate, ANIM_TARGER, 131, 1, 2
createsprite gRandomPosHitSplatSpriteTemplate, ANIM_TARGET, 131, 1, 2
createvisualtask SoundTask_PlaySE1WithPanning, 5, SE_M_VITAL_THROW2, SOUND_PAN_TARGET
delay 3
createsprite gRandomPosHitSplatSpriteTemplate, ANIM_TARGER, 131, 1, 2
createsprite gRandomPosHitSplatSpriteTemplate, ANIM_TARGET, 131, 1, 2
createvisualtask SoundTask_PlaySE1WithPanning, 5, SE_M_VITAL_THROW2, SOUND_PAN_TARGET
delay 3
createsprite gRandomPosHitSplatSpriteTemplate, ANIM_TARGER, 131, 1, 2
createsprite gRandomPosHitSplatSpriteTemplate, ANIM_TARGET, 131, 1, 2
createvisualtask SoundTask_PlaySE1WithPanning, 5, SE_M_VITAL_THROW2, SOUND_PAN_TARGET
waitforvisualfinish
createvisualtask AnimTask_BlendBattleAnimPalExclude, 5, 5, 2, 10, 0, RGB_WHITEALPHA
@ -11970,7 +11970,7 @@ PrismaticLaserRain:
return
gBattleAnimMove_SpectralThief::
choosetwoturnanim SpectralThiefSteal SpectralThiefUnleash
choosetwoturnanim SpectralThiefUnleash SpectralThiefSteal
SpectralThiefUnleash:
loadspritegfx ANIM_TAG_HANDS_AND_FEET @Black Colour
loadspritegfx ANIM_TAG_QUICK_GUARD_HAND @Black Colour
@ -13238,7 +13238,7 @@ gBattleAnimMove_MagicPowder::
gBattleAnimMove_DragonDarts::
loadspritegfx ANIM_TAG_DREEPY_SHINY
loadspritegfx ANIM_TAG_DREEPY
loadspritegfx ANIM_TAG_AIR_WAVE
loadspritegfx ANIM_TAG_AIR_WAVE
loadspritegfx ANIM_TAG_EXPLOSION
playsewithpan SE_FALL, SOUND_PAN_ATTACKER
createdragondartsprite ANIM_TARGET, 2, 0x0, 0x0, 0x19
@ -14034,9 +14034,9 @@ gBattleAnimMove_ExpandingForce::
createvisualtask AnimTask_BlendColorCycle, 2, F_PAL_ATTACKER, F_PAL_ATTACKER, 2, 0, 8, RGB(31, 23, 0)
waitforvisualfinish
playsewithpan SE_M_MEGA_KICK, SOUND_PAN_TARGET
choosetwoturnanim EXPANDING_FORCE_SINGLE_TARGET EXPANDING_FORCE_BOTH_TARGETS
choosetwoturnanim ExpandingForceSingleTarget ExpandingForceBothTargets
EXPANDING_FORCE_SINGLE_TARGET:
ExpandingForceSingleTarget:
createsprite gSpriteTemplate_SpiritBreakChargeBall, ANIM_TARGET, 1, ANIM_TARGET
waitforvisualfinish
createvisualtask AnimTask_ShakeTargetBasedOnMovePowerOrDmg, 0x2, 0x0, 0x1, 0x18, 0x1, 0x0
@ -14046,7 +14046,7 @@ EXPANDING_FORCE_SINGLE_TARGET:
clearmonbg ANIM_DEF_PARTNER
end
EXPANDING_FORCE_BOTH_TARGETS:
ExpandingForceBothTargets:
createsprite gSpriteTemplate_SpiritBreakChargeBall, ANIM_TARGET, 1, ANIM_TARGET
createsprite gSpriteTemplate_SpiritBreakChargeBall, ANIM_TARGET, 1, ANIM_DEF_PARTNER
waitforvisualfinish
@ -14178,9 +14178,9 @@ gBattleAnimMove_MeteorBeam::
loadspritegfx ANIM_TAG_ROCKS
fadetobg BG_COSMIC
waitbgfadeout
choosetwoturnanim METEOR_BEAM_CHARGE METEOR_BEAM_BLAST
choosetwoturnanim MeteorBeamCharge MeteorBeamBlast
METEOR_BEAM_CHARGE:
MeteorBeamCharge:
createvisualtask AnimTask_StartSlidingBg, 0x5, 0x0, 0xFC00, FALSE, 0xffff
waitbgfadein
monbg ANIM_ATK_PARTNER
@ -14193,7 +14193,7 @@ METEOR_BEAM_CHARGE:
call UnsetPsychicBg
end
METEOR_BEAM_BLAST:
MeteorBeamBlast:
createvisualtask AnimTask_StartSlidingBg, 0x5, 0xf700, 0x0, TRUE, 0xffff @;Scroll right/left
waitbgfadein
monbg ANIM_TARGET
@ -18066,10 +18066,199 @@ PopulationBombContinue:
gBattleAnimMove_RevivalBlessing::
goto gBattleAnimMove_LunarBlessing
gBattleAnimMove_TeraStarstorm::
loadspritegfx ANIM_TAG_STARSTORM
loadspritegfx ANIM_TAG_YELLOW_STAR
loadspritegfx ANIM_TAG_IMPACT
fadetobg BG_COSMIC
waitbgfadein
playsewithpan SE_FALL, SOUND_PAN_ATTACKER
call TeraStarstormCreateBeam
delay 2
call TeraStarstormCreateBeam
delay 2
call TeraStarstormCreateBeam
delay 2
call TeraStarstormCreateBeam
delay 2
call TeraStarstormCreateBeam
delay 2
call TeraStarstormCreateBeam
delay 2
call TeraStarstormCreateBeam
delay 2
call TeraStarstormCreateBeam
delay 2
call TeraStarstormCreateBeam
delay 2
jumpifmovetypeequal TYPE_STELLAR, TeraStarstormStellar
goto TeraStarstormSingle
TeraStarstormStellar:
jumpifdoublebattle TeraStarstormDouble
TeraStarstormSingle:
createsprite gTeraStarSpriteTemplate, ANIM_BATTLER, 3, 0, 0, 10, 0, 30, 0, 1
delay 3
createsprite gTeraStarSpriteTemplate, ANIM_BATTLER, 3, 0, 0, 0, 0, 30, 0, 1
delay 2
createsprite gTeraStarSpriteTemplate, ANIM_BATTLER, 3, 0, 0, -10, 0, 30, 0, 1
delay 3
createsprite gTeraStarSpriteTemplate, ANIM_BATTLER, 3, 0, 0, 5, -5, 30, 0, 1
delay 2
createsprite gTeraStarSpriteTemplate, ANIM_BATTLER, 3, 0, 0, 5, 5, 30, 0, 1
delay 3
playsewithpan SE_M_ICY_WIND, SOUND_PAN_TARGET
createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 5, 5, 1, 1
createsprite gTeraStarSpriteTemplate, ANIM_BATTLER, 3, 0, 0, -5, 5, 30, 0, 1
delay 2
createsprite gTeraStarSpriteTemplate, ANIM_BATTLER, 3, 0, 0, 10, -5, 30, 0, 1
delay 3
playsewithpan SE_M_ICY_WIND, SOUND_PAN_TARGET
createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 5, 5, 1, 1
createsprite gTeraStarSpriteTemplate, ANIM_BATTLER, 3, 0, 0, 0, 0, 30, 0, 1
delay 2
createsprite gTeraStarSpriteTemplate, ANIM_BATTLER, 3, 0, 0, -10, 5, 30, 0, 1
delay 3
playsewithpan SE_M_ICY_WIND, SOUND_PAN_TARGET
createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 5, 5, 1, 1
createsprite gTeraStarSpriteTemplate, ANIM_BATTLER, 3, 0, 0, 5, -5, 30, 0, 1
delay 2
createsprite gTeraStarSpriteTemplate, ANIM_BATTLER, 3, 0, 0, 5, 5, 30, 0, 1
delay 3
createsprite gTeraStarSpriteTemplate, ANIM_BATTLER, 3, 0, 0, -5, 5, 30, 0, 1
playsewithpan SE_M_ICY_WIND, SOUND_PAN_TARGET
createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 5, 5, 1, 1
delay 5
playsewithpan SE_M_ICY_WIND, SOUND_PAN_TARGET
createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 5, 5, 1, 1
delay 5
playsewithpan SE_M_ICY_WIND, SOUND_PAN_TARGET
createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 5, 5, 1, 1
waitforvisualfinish
restorebg
waitbgfadeout
end
TeraStarstormDouble:
createsprite gTeraStarSpriteTemplate, ANIM_BATTLER, 3, 0, 0, 10, 0, 30, 0, 1
createsprite gTeraStarSpriteTemplate, ANIM_BATTLER, 3, 0, 0, 10, 0, 30, 1, 1
delay 2
createsprite gTeraStarSpriteTemplate, ANIM_BATTLER, 3, 0, 0, 0, 0, 30, 0, 1
createsprite gTeraStarSpriteTemplate, ANIM_BATTLER, 3, 0, 0, 0, 0, 30, 1, 1
delay 3
createsprite gTeraStarSpriteTemplate, ANIM_BATTLER, 3, 0, 0, -10, 0, 30, 0, 1
createsprite gTeraStarSpriteTemplate, ANIM_BATTLER, 3, 0, 0, -10, 0, 30, 1, 1
delay 2
createsprite gTeraStarSpriteTemplate, ANIM_BATTLER, 3, 0, 0, 5, -5, 30, 0, 1
createsprite gTeraStarSpriteTemplate, ANIM_BATTLER, 3, 0, 0, 5, -5, 30, 1, 1
delay 3
createsprite gTeraStarSpriteTemplate, ANIM_BATTLER, 3, 0, 0, 5, 5, 30, 0, 1
createsprite gTeraStarSpriteTemplate, ANIM_BATTLER, 3, 0, 0, 5, 5, 30, 1, 1
delay 2
createsprite gTeraStarSpriteTemplate, ANIM_BATTLER, 3, 0, 0, -5, 5, 30, 0, 1
createsprite gTeraStarSpriteTemplate, ANIM_BATTLER, 3, 0, 0, -5, 5, 30, 1, 1
delay 3
createsprite gTeraStarSpriteTemplate, ANIM_BATTLER, 3, 0, 0, -5, 10, 30, 0, 1
createsprite gTeraStarSpriteTemplate, ANIM_BATTLER, 3, 0, 0, -5, 10, 30, 1, 1
playsewithpan SE_M_ICY_WIND, SOUND_PAN_TARGET
createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 5, 5, 1, 1
createvisualtask AnimTask_ShakeMon, 2, ANIM_DEF_PARTNER, 5, 5, 1, 1
delay 2
createsprite gTeraStarSpriteTemplate, ANIM_BATTLER, 3, 0, 0, 10, 0, 30, 0, 1
createsprite gTeraStarSpriteTemplate, ANIM_BATTLER, 3, 0, 0, 10, 0, 30, 1, 1
delay 3
createsprite gTeraStarSpriteTemplate, ANIM_BATTLER, 3, 0, 0, 0, 0, 30, 0, 1
createsprite gTeraStarSpriteTemplate, ANIM_BATTLER, 3, 0, 0, 0, 0, 30, 1, 1
playsewithpan SE_M_ICY_WIND, SOUND_PAN_TARGET
createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 5, 5, 1, 1
createvisualtask AnimTask_ShakeMon, 2, ANIM_DEF_PARTNER, 5, 5, 1, 1
delay 2
createsprite gTeraStarSpriteTemplate, ANIM_BATTLER, 3, 0, 0, -10, 0, 30, 0, 1
createsprite gTeraStarSpriteTemplate, ANIM_BATTLER, 3, 0, 0, -10, 0, 30, 1, 1
delay 3
createsprite gTeraStarSpriteTemplate, ANIM_BATTLER, 3, 0, 0, 5, -5, 30, 0, 1
createsprite gTeraStarSpriteTemplate, ANIM_BATTLER, 3, 0, 0, 5, -5, 30, 1, 1
playsewithpan SE_M_ICY_WIND, SOUND_PAN_TARGET
createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 5, 5, 1, 1
createvisualtask AnimTask_ShakeMon, 2, ANIM_DEF_PARTNER, 5, 5, 1, 1
delay 2
createsprite gTeraStarSpriteTemplate, ANIM_BATTLER, 3, 0, 0, 5, 5, 30, 0, 1
createsprite gTeraStarSpriteTemplate, ANIM_BATTLER, 3, 0, 0, 5, 5, 30, 1, 1
delay 3
createsprite gTeraStarSpriteTemplate, ANIM_BATTLER, 3, 0, 0, -5, 5, 30, 0, 1
createsprite gTeraStarSpriteTemplate, ANIM_BATTLER, 3, 0, 0, -5, 5, 30, 1, 1
playsewithpan SE_M_ICY_WIND, SOUND_PAN_TARGET
createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 5, 5, 1, 1
createvisualtask AnimTask_ShakeMon, 2, ANIM_DEF_PARTNER, 5, 5, 1, 1
delay 5
playsewithpan SE_M_ICY_WIND, SOUND_PAN_TARGET
createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 5, 5, 1, 1
createvisualtask AnimTask_ShakeMon, 2, ANIM_DEF_PARTNER, 5, 5, 1, 1
delay 5
playsewithpan SE_M_ICY_WIND, SOUND_PAN_TARGET
createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 5, 5, 1, 1
createvisualtask AnimTask_ShakeMon, 2, ANIM_DEF_PARTNER, 5, 5, 1, 1
delay 5
playsewithpan SE_M_ICY_WIND, SOUND_PAN_TARGET
createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 5, 5, 1, 1
createvisualtask AnimTask_ShakeMon, 2, ANIM_DEF_PARTNER, 5, 5, 1, 1
waitforvisualfinish
restorebg
waitbgfadeout
end
TeraStarstormCreateBeam::
createsprite gTeraStarstormBeamSpriteTemplate, ANIM_BATTLER, 1, -3, 1, 0, 0, 20
createsprite gTeraStarstormBeamSpriteTemplate, ANIM_BATTLER, 1, 1, 0, 0, 0, 20
createsprite gTeraStarstormBeamSpriteTemplate, ANIM_BATTLER, 1, 3, -1, 0, 0, 20
createsprite gTeraStarstormBeamSpriteTemplate, ANIM_BATTLER, 1, -2, 0, 0, 0, 20
createsprite gTeraStarstormBeamSpriteTemplate, ANIM_BATTLER, 1, 0, 1, 0, 0, 20
createsprite gTeraStarstormBeamSpriteTemplate, ANIM_BATTLER, 1, -1, -1, 0, 0, 20
createsprite gTeraStarstormBeamSpriteTemplate, ANIM_BATTLER, 1, 2, 0, 0, 0, 20
return
gBattleAnimMove_TachyonCutter::
loadspritegfx ANIM_TAG_CUT
loadspritegfx ANIM_TAG_BUBBLE
createsprite gTachyonCutterSpriteTemplate, ANIM_ATTACKER, 2, 40, -32, 0
createsprite gTachyonCutterSpriteTemplate, ANIM_ATTACKER, 2, 40, -32, 1
playsewithpan SE_M_RAZOR_WIND2, SOUND_PAN_ATTACKER
waitforvisualfinish
end
gBattleAnimMove_SaltCure::
loadspritegfx ANIM_TAG_SALT_PARTICLE
loadspritegfx ANIM_TAG_WATER_ORB
call SaltCureEffect
call SaltCureEffect
call SaltCureEffect
playsewithpan SE_M_ICY_WIND, SOUND_PAN_TARGET
waitforvisualfinish
call gBattleAnimGeneral_SaltCureDamage
end
SaltCureEffect:
createsprite gSaltCureSwirlSpriteTemplate, ANIM_TARGET, 2, 0, 28, 384, 50, 8, 50, ANIM_TARGET
delay 2
playsewithpan SE_M_ICY_WIND, SOUND_PAN_TARGET
createsprite gSaltCureSwirlSpriteTemplate, ANIM_TARGET, 2, 0, 32, 240, 40, 11, -46, ANIM_TARGET
delay 2
playsewithpan SE_M_ICY_WIND, SOUND_PAN_TARGET
createsprite gSaltCureSwirlSpriteTemplate, ANIM_TARGET, 2, 0, 33, 416, 40, 4, 42, ANIM_TARGET
delay 2
playsewithpan SE_M_ICY_WIND, SOUND_PAN_TARGET
createsprite gSaltCureSwirlSpriteTemplate, ANIM_TARGET, 2, 0, 31, 288, 45, 6, -42, ANIM_TARGET
delay 2
playsewithpan SE_M_ICY_WIND, SOUND_PAN_TARGET
createsprite gSaltCureSwirlSpriteTemplate, ANIM_TARGET, 2, 0, 28, 448, 45, 11, 46, ANIM_TARGET
delay 2
playsewithpan SE_M_ICY_WIND, SOUND_PAN_TARGET
createsprite gSaltCureSwirlSpriteTemplate, ANIM_TARGET, 2, 0, 33, 464, 50, 10, -50, ANIM_TARGET
delay 2
playsewithpan SE_M_ICY_WIND, SOUND_PAN_TARGET
return
gBattleAnimMove_TeraBlast::
gBattleAnimMove_OrderUp::
gBattleAnimMove_GlaiveRush::
gBattleAnimMove_SaltCure::
gBattleAnimMove_TripleDive::
gBattleAnimMove_Doodle::
gBattleAnimMove_Ruination::
@ -18083,9 +18272,7 @@ gBattleAnimMove_CombatTorque::
gBattleAnimMove_MagicalTorque::
gBattleAnimMove_Psyblade::
gBattleAnimMove_MatchaGotcha::
gBattleAnimMove_TeraStarstorm::
gBattleAnimMove_MightyCleave::
gBattleAnimMove_TachyonCutter::
gBattleAnimMove_SupercellSlam::
end @to do
@ -28779,7 +28966,41 @@ General_AffectionHangedOn_3Hearts:
end
gBattleAnimGeneral_SaltCureDamage::
goto gBattleAnimStatus_Freeze
loadspritegfx ANIM_TAG_SALT_PARTICLE
createsprite gSaltCureCrystalSpriteTemplate, ANIM_TARGET, 2, -10, -10, 1
playsewithpan SE_M_ICY_WIND, SOUND_PAN_TARGET
delay 4
createsprite gSaltCureCrystalSpriteTemplate, ANIM_TARGET, 2, 10, 20, 1
playsewithpan SE_M_ICY_WIND, SOUND_PAN_TARGET
delay 4
createsprite gSaltCureCrystalSpriteTemplate, ANIM_TARGET, 2, -29, 0, 1
playsewithpan SE_M_ICY_WIND, SOUND_PAN_TARGET
delay 4
createsprite gSaltCureCrystalSpriteTemplate, ANIM_TARGET, 2, 29, -20, 1
playsewithpan SE_M_ICY_WIND, SOUND_PAN_TARGET
delay 4
createsprite gSaltCureCrystalSpriteTemplate, ANIM_TARGET, 2, -5, 10, 1
playsewithpan SE_M_ICY_WIND, SOUND_PAN_TARGET
delay 4
createsprite gSaltCureCrystalSpriteTemplate, ANIM_TARGET, 2, 17, -12, 1
playsewithpan SE_M_ICY_WIND, SOUND_PAN_TARGET
delay 4
createsprite gSaltCureCrystalSpriteTemplate, ANIM_TARGET, 2, -20, 0, 1
playsewithpan SE_M_ICY_WIND, SOUND_PAN_TARGET
delay 4
createsprite gSaltCureCrystalSpriteTemplate, ANIM_TARGET, 2, -15, 15, 1
playsewithpan SE_M_ICY_WIND, SOUND_PAN_TARGET
delay 4
createsprite gSaltCureCrystalSpriteTemplate, ANIM_TARGET, 2, 26, -5, 1
playsewithpan SE_M_ICY_WIND, SOUND_PAN_TARGET
delay 4
createsprite gSaltCureCrystalSpriteTemplate, ANIM_TARGET, 2, 0, 0, 1
playsewithpan SE_M_ICY_WIND, SOUND_PAN_TARGET
delay 4
createsprite gSaltCureCrystalSpriteTemplate, ANIM_TARGET, 2, 20, 2, 1
playsewithpan SE_M_ICY_WIND, SOUND_PAN_TARGET
waitforvisualfinish
end
gBattleAnimGeneral_Rainbow::
call RainDrops

View File

@ -836,8 +836,8 @@ BattleScript_FlingMissed:
ppreduce
goto BattleScript_MoveMissedPause
BattleScript_EffectPhotonGeyser::
setphotongeysercategory
BattleScript_EffectDynamicCategory::
setdynamicmovecategory
goto BattleScript_EffectHit
BattleScript_EffectAuraWheel:: @ Aura Wheel can only be used by Morpeko
@ -956,15 +956,6 @@ BattleScript_MoveEffectIonDeluge::
waitmessage B_WAIT_TIME_LONG
return
BattleScript_EffectSparklySwirl::
call BattleScript_EffectHit_Ret
tryfaintmon BS_TARGET
healpartystatus
waitstate
updatestatusicon BS_ATTACKER_WITH_PARTNER
waitstate
goto BattleScript_MoveEnd
BattleScript_MoveEffectHaze::
printstring STRINGID_STATCHANGESGONE
waitmessage B_WAIT_TIME_LONG
@ -1299,12 +1290,33 @@ BattleScript_VCreateStatLossRet:
return
BattleScript_SpectralThiefSteal::
setbyte sB_ANIM_TURN, 1
playmoveanimation BS_ATTACKER, MOVE_SPECTRAL_THIEF
waitanimation
setbyte sB_ANIM_TURN, 0
printstring STRINGID_SPECTRALTHIEFSTEAL
waitmessage B_WAIT_TIME_LONG
setbyte sB_ANIM_ARG2, 0
playanimation BS_ATTACKER, B_ANIM_STATS_CHANGE, sB_ANIM_ARG1
spectralthiefprintstats
return
flushtextbox
goto BattleScript_EffectSpectralThiefFromDamage
BattleScript_EffectSpectralThief::
attackcanceler
accuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE
attackstring
ppreduce
typecalc
tryspectralthiefsteal BattleScript_SpectralThiefSteal
BattleScript_EffectSpectralThiefFromDamage:
critcalc
damagecalc
adjustdamage
call BattleScript_Hit_RetFromAtkAnimation
tryfaintmon BS_TARGET
moveendall
end
BattleScript_EffectPartingShot::
attackcanceler
@ -1806,25 +1818,17 @@ BattleScript_EffectFinalGambit::
tryfaintmon BS_ATTACKER
goto BattleScript_MoveEnd
BattleScript_EffectHitSwitchTarget::
call BattleScript_EffectHit_Ret
tryfaintmon BS_TARGET
jumpiffainted BS_TARGET, TRUE, BattleScript_MoveEnd
jumpifability BS_TARGET, ABILITY_SUCTION_CUPS, BattleScript_AbilityPreventsPhasingOut
jumpifability BS_TARGET, ABILITY_GUARD_DOG, BattleScript_MoveEnd
jumpifstatus3 BS_TARGET, STATUS3_ROOTED, BattleScript_PrintMonIsRooted
jumpiftargetdynamaxed BattleScript_HitSwitchTargetDynamaxed
tryhitswitchtarget BattleScript_MoveEnd
BattleScript_TryHitSwitchTarget::
forcerandomswitch BattleScript_HitSwitchTargetForceRandomSwitchFailed
goto BattleScript_MoveEnd
return
BattleScript_HitSwitchTargetDynamaxed:
BattleScript_HitSwitchTargetDynamaxed::
printstring STRINGID_MOVEBLOCKEDBYDYNAMAX
waitmessage B_WAIT_TIME_LONG
BattleScript_HitSwitchTargetForceRandomSwitchFailed:
hitswitchtargetfailed
setbyte sSWITCH_CASE, B_SWITCH_NORMAL
goto BattleScript_MoveEnd
return
BattleScript_EffectToxicThread::
setstatchanger STAT_SPEED, 1, TRUE
@ -4083,13 +4087,16 @@ BattleScript_EffectHealBell::
attackcanceler
attackstring
ppreduce
healpartystatus
waitstate
attackanimation
waitanimation
BattleScript_EffectHealBell_FromHeal::
healpartystatus
waitstate
printfromtable gPartyStatusHealStringIds
waitmessage B_WAIT_TIME_LONG
jumpifnotmove MOVE_HEAL_BELL, BattleScript_PartyHealEnd
jumpifblockedbysoundproof BS_ATTACKER_PARTNER, BattleScript_HealBellSoundproof
goto BattleScript_PartyHealEnd
BattleScript_HealBellSoundproof::
jumpifbyte CMP_NO_COMMON_BITS, cMULTISTRING_CHOOSER, B_MSG_BELL_SOUNDPROOF_ATTACKER, BattleScript_CheckHealBellMon2Unaffected
printstring STRINGID_PKMNSXBLOCKSY
waitmessage B_WAIT_TIME_LONG
@ -5597,7 +5604,7 @@ BattleScript_LocalBattleLost::
jumpifbattletype BATTLE_TYPE_FRONTIER, BattleScript_LocalBattleLostPrintTrainersWinText
jumpifbattletype BATTLE_TYPE_TRAINER_HILL, BattleScript_LocalBattleLostPrintTrainersWinText
jumpifbattletype BATTLE_TYPE_EREADER_TRAINER, BattleScript_LocalBattleLostEnd
jumpifhalfword CMP_EQUAL, gTrainerBattleOpponent_A, TRAINER_SECRET_BASE, BattleScript_LocalBattleLostEnd
jumpifhalfword CMP_EQUAL, gTrainerBattleParameter + 2, TRAINER_SECRET_BASE, BattleScript_LocalBattleLostEnd
BattleScript_LocalBattleLostPrintWhiteOut::
.if B_WHITEOUT_MONEY >= GEN_4
jumpifbattletype BATTLE_TYPE_TRAINER, BattleScript_LocalBattleLostEnd
@ -5960,10 +5967,14 @@ BattleScript_SafeguardEnds::
waitmessage B_WAIT_TIME_LONG
end2
@ Leech Seed end turn effect
@ attacker is the victim
@ target is the leech seeder (recieving HP)
BattleScript_LeechSeedTurnDrainLiquidOoze::
call BattleScript_LeechSeedTurnDrain
copybyte gBattlerAbility, gBattlerAttacker
call BattleScript_AbilityPopUp
copybyte gBattlerAttacker, gBattlerTarget @ needed to get liquid ooze message correct
goto BattleScript_LeechSeedTurnDrainGainHp
BattleScript_LeechSeedTurnDrainHealBlock::
@ -6722,6 +6733,12 @@ BattleScript_PrintMonIsRooted::
waitmessage B_WAIT_TIME_LONG
goto BattleScript_MoveEnd
BattleScript_PrintMonIsRootedRet::
pause B_WAIT_TIME_SHORT
printstring STRINGID_PKMNANCHOREDITSELF
waitmessage B_WAIT_TIME_LONG
return
BattleScript_AtkDefDown::
setbyte sSTAT_ANIM_PLAYED, FALSE
playstatchangeanimation BS_ATTACKER, BIT_DEF | BIT_ATK, STAT_CHANGE_CANT_PREVENT | STAT_CHANGE_NEGATIVE | STAT_CHANGE_MULTIPLE_STATS
@ -7766,8 +7783,12 @@ BattleScript_IntimidateEffect:
printstring STRINGID_PKMNCUTSATTACKWITH
BattleScript_IntimidateEffect_WaitString:
waitmessage B_WAIT_TIME_LONG
saveattacker
savetarget
copybyte sBATTLER, gBattlerTarget
call BattleScript_TryIntimidateHoldEffects
restoreattacker
restoretarget
BattleScript_IntimidateLoopIncrement:
addbyte gBattlerTarget, 1
jumpifbytenotequal gBattlerTarget, gBattlersCount, BattleScript_IntimidateLoop
@ -8196,11 +8217,15 @@ BattleScript_FlashFireBoost::
goto BattleScript_MoveEnd
BattleScript_AbilityPreventsPhasingOut::
call BattleScript_AbilityPreventsPhasingOutRet
goto BattleScript_MoveEnd
BattleScript_AbilityPreventsPhasingOutRet::
pause B_WAIT_TIME_SHORT
call BattleScript_AbilityPopUp
call BattleScript_AbilityPopUpTarget
printstring STRINGID_PKMNANCHORSITSELFWITH
waitmessage B_WAIT_TIME_LONG
goto BattleScript_MoveEnd
return
BattleScript_AbilityNoStatLoss::
pause B_WAIT_TIME_SHORT
@ -9693,7 +9718,7 @@ BattleScript_EffectMaxMove::
resultmessage
waitmessage B_WAIT_TIME_LONG
tryfaintmon BS_TARGET
setmaxmoveeffect
setadditionaleffects
moveendall
end
@ -9767,61 +9792,158 @@ BattleScript_EffectTryReducePP::
waitmessage B_WAIT_TIME_LONG
goto BattleScript_MoveEnd
BattleScript_EffectStatus1Foes::
BattleScript_EffectParalyzeSide::
savetarget
copybyte sBATTLER, gBattlerTarget
BattleScript_Status1FoesLoop:
jumpifabsent BS_TARGET, BattleScript_Status1FoesIncrement
trysetstatus1 BattleScript_Status1FoesIncrement
BattleScript_ParalyzeSideLoop:
jumpifabsent BS_TARGET, BattleScript_ParalyzeSideIncrement
trysetparalysis BattleScript_ParalyzeSideIncrement
statusanimation BS_TARGET
updatestatusicon BS_TARGET
printfromtable gStatusConditionsStringIds
waitmessage B_WAIT_TIME_LONG
updatestatusicon BS_EFFECT_BATTLER
waitstate
BattleScript_Status1FoesIncrement:
jumpifbytenotequal gBattlerTarget, sBATTLER, BattleScript_Status1FoesEnd
setallytonexttarget BattleScript_Status1FoesLoop
BattleScript_Status1FoesEnd:
BattleScript_ParalyzeSideIncrement:
jumpifbytenotequal gBattlerTarget, sBATTLER, BattleScript_ParalyzeSideEnd
setallytonexttarget BattleScript_ParalyzeSideLoop
BattleScript_ParalyzeSideEnd:
restoretarget
goto BattleScript_MoveEnd
BattleScript_EffectStatus2Foes::
BattleScript_EffectPoisonSide::
savetarget
copybyte sBATTLER, gBattlerTarget
BattleScript_Status2FoesLoop:
jumpifabsent BS_TARGET, BattleScript_Status2FoesIncrement
trysetstatus2 BattleScript_Status2FoesIncrement
jumpifbyte CMP_EQUAL, gBattleCommunication, 1, BattleScript_DoConfuseAnim
jumpifbyte CMP_EQUAL, gBattleCommunication, 2, BattleScript_DoInfatuationAnim
BattleScript_Status2FoesPrintMessage:
BattleScript_PoisonSideLoop:
jumpifabsent BS_TARGET, BattleScript_PoisonSideIncrement
trysetpoison BattleScript_PoisonSideIncrement
statusanimation BS_TARGET
updatestatusicon BS_TARGET
printfromtable gStatusConditionsStringIds
waitmessage B_WAIT_TIME_LONG
updatestatusicon BS_EFFECT_BATTLER
waitstate
BattleScript_PoisonSideIncrement:
jumpifbytenotequal gBattlerTarget, sBATTLER, BattleScript_PoisonSideEnd
setallytonexttarget BattleScript_PoisonSideLoop
BattleScript_PoisonSideEnd:
restoretarget
goto BattleScript_MoveEnd
BattleScript_EffectPoisonParalyzeSide::
savetarget
copybyte sBATTLER, gBattlerTarget
BattleScript_PoisonParalyzeSideLoop:
jumpifabsent BS_TARGET, BattleScript_PoisonParalyzeSideIncrement
trysetpoisonparalysis BattleScript_PoisonParalyzeSideIncrement
statusanimation BS_TARGET
updatestatusicon BS_TARGET
printfromtable gStatusConditionsStringIds
waitmessage B_WAIT_TIME_LONG
updatestatusicon BS_EFFECT_BATTLER
waitstate
BattleScript_PoisonParalyzeSideIncrement:
jumpifbytenotequal gBattlerTarget, sBATTLER, BattleScript_PoisonParalyzeSideEnd
setallytonexttarget BattleScript_PoisonParalyzeSideLoop
BattleScript_PoisonParalyzeSideEnd:
restoretarget
goto BattleScript_MoveEnd
BattleScript_EffectEffectSporeSide::
savetarget
copybyte sBATTLER, gBattlerTarget
BattleScript_EffectSporeSideLoop:
jumpifabsent BS_TARGET, BattleScript_EffectSporeSideIncrement
tryseteffectspore BattleScript_EffectSporeSideIncrement
statusanimation BS_TARGET
updatestatusicon BS_TARGET
printfromtable gStatusConditionsStringIds
waitmessage B_WAIT_TIME_LONG
updatestatusicon BS_EFFECT_BATTLER
waitstate
BattleScript_EffectSporeSideIncrement:
jumpifbytenotequal gBattlerTarget, sBATTLER, BattleScript_EffectSporeSideEnd
setallytonexttarget BattleScript_EffectSporeSideLoop
BattleScript_EffectSporeSideEnd:
restoretarget
goto BattleScript_MoveEnd
BattleScript_EffectConfuseSide::
savetarget
copybyte sBATTLER, gBattlerTarget
BattleScript_ConfuseSideLoop:
jumpifabsent BS_TARGET, BattleScript_ConfuseSideIncrement
trysetconfusion BattleScript_ConfuseSideIncrement
status2animation BS_EFFECT_BATTLER, STATUS2_CONFUSION
BattleScript_ConfuseSidePrintMessage:
printfromtable gStatus2StringIds
waitmessage B_WAIT_TIME_LONG
BattleScript_Status2FoesIncrement:
jumpifbytenotequal gBattlerTarget, sBATTLER, BattleScript_Status2FoesEnd
setallytonexttarget BattleScript_Status2FoesLoop
BattleScript_Status2FoesEnd:
BattleScript_ConfuseSideIncrement:
jumpifbytenotequal gBattlerTarget, sBATTLER, BattleScript_ConfuseSideEnd
setallytonexttarget BattleScript_ConfuseSideLoop
BattleScript_ConfuseSideEnd:
restoretarget
jumpifbyte CMP_EQUAL, gBattleCommunication + 1, 1, BattleScript_PrintCoinsScattered @ Gold Rush
goto BattleScript_MoveEnd
BattleScript_DoConfuseAnim:
status2animation BS_EFFECT_BATTLER, STATUS2_CONFUSION
goto BattleScript_Status2FoesPrintMessage
BattleScript_DoInfatuationAnim:
status2animation BS_EFFECT_BATTLER, STATUS2_INFATUATION
goto BattleScript_Status2FoesPrintMessage
BattleScript_PrintCoinsScattered:
printstring STRINGID_COINSSCATTERED
goto BattleScript_MoveEnd
BattleScript_EffectInfatuateSide::
savetarget
copybyte sBATTLER, gBattlerTarget
BattleScript_InfatuateSideLoop:
jumpifabsent BS_TARGET, BattleScript_InfatuateSideIncrement
trysetinfatuation BattleScript_InfatuateSideIncrement
status2animation BS_EFFECT_BATTLER, STATUS2_INFATUATION
BattleScript_InfatuateSidePrintMessage:
printfromtable gStatus2StringIds
waitmessage B_WAIT_TIME_LONG
BattleScript_InfatuateSideIncrement:
jumpifbytenotequal gBattlerTarget, sBATTLER, BattleScript_InfatuateSideEnd
setallytonexttarget BattleScript_InfatuateSideLoop
BattleScript_InfatuateSideEnd:
restoretarget
goto BattleScript_MoveEnd
BattleScript_EffectTormentSide::
savetarget
copybyte sBATTLER, gBattlerTarget
BattleScript_TormentSideLoop:
jumpifabsent BS_TARGET, BattleScript_TormentSideIncrement
trysettorment BattleScript_TormentSideIncrement
BattleScript_TormentSidePrintMessage:
printfromtable gStatus2StringIds
waitmessage B_WAIT_TIME_LONG
BattleScript_TormentSideIncrement:
jumpifbytenotequal gBattlerTarget, sBATTLER, BattleScript_TormentSideEnd
setallytonexttarget BattleScript_TormentSideLoop
BattleScript_TormentSideEnd:
restoretarget
goto BattleScript_MoveEnd
BattleScript_TormentEnds::
printstring STRINGID_TORMENTEDNOMORE
waitmessage B_WAIT_TIME_LONG
end2
BattleScript_EffectMeanLookSide::
savetarget
copybyte sBATTLER, gBattlerTarget
BattleScript_MeanLookSideLoop:
jumpifabsent BS_TARGET, BattleScript_MeanLookSideIncrement
trysetescapeprevention BattleScript_MeanLookSideIncrement
BattleScript_MeanLookSidePrintMessage:
printfromtable gStatus2StringIds
waitmessage B_WAIT_TIME_LONG
BattleScript_MeanLookSideIncrement:
jumpifbytenotequal gBattlerTarget, sBATTLER, BattleScript_MeanLookSideEnd
setallytonexttarget BattleScript_MeanLookSideLoop
BattleScript_MeanLookSideEnd:
restoretarget
goto BattleScript_MoveEnd
BattleScript_EffectRaiseCritAlliesAnim::
savetarget
copybyte gBattlerTarget, gBattlerAttacker
@ -9859,29 +9981,6 @@ BattleScript_HealOneSixthAlliesEnd:
restoretarget
goto BattleScript_MoveEnd
BattleScript_EffectCureStatusAllies::
jumpifteamhealthy BS_ATTACKER, BattleScript_MoveEnd
savetarget
copybyte gBattlerTarget, gBattlerAttacker
BattleScript_CureStatusAlliesLoop:
jumpifabsent BS_TARGET, BattleScript_CureStatusAlliesIncrement
jumpifstatus BS_TARGET, STATUS1_ANY, BattleScript_CureStatusActivate
BattleScript_CureStatusAlliesIncrement:
jumpifbytenotequal gBattlerTarget, gBattlerAttacker, BattleScript_CureStatusAlliesEnd
setallytonexttarget BattleScript_CureStatusAlliesLoop
BattleScript_CureStatusAlliesEnd:
restoretarget
goto BattleScript_MoveEnd
BattleScript_CureStatusActivate:
curestatus BS_TARGET
updatestatusicon BS_TARGET
swapattackerwithtarget
printstring STRINGID_PKMNSTATUSNORMAL
waitmessage B_WAIT_TIME_LONG
swapattackerwithtarget
goto BattleScript_CureStatusAlliesIncrement
BattleScript_EffectRecycleBerriesAllies::
savetarget
copybyte gBattlerTarget, gBattlerAttacker
@ -9899,12 +9998,6 @@ BattleScript_RecycleBerriesAlliesEnd:
restoretarget
goto BattleScript_MoveEnd
BattleScript_EffectStonesurge::
setstealthrock BattleScript_MoveEnd
printfromtable gDmgHazardsStringIds
waitmessage B_WAIT_TIME_LONG
goto BattleScript_MoveEnd
BattleScript_EffectSteelsurge::
setsteelsurge BattleScript_MoveEnd
printfromtable gDmgHazardsStringIds

View File

@ -195,13 +195,13 @@ BattleScript_TryNicknameCaughtMon::
printstring STRINGID_GIVENICKNAMECAPTURED
waitstate
setbyte gBattleCommunication, 0
trygivecaughtmonnick BattleScript_GiveCaughtMonEnd
givecaughtmon
trygivecaughtmonnick
givecaughtmon BattleScript_SuccessBallThrowEnd
printfromtable gCaughtMonStringIds
waitmessage B_WAIT_TIME_LONG
goto BattleScript_SuccessBallThrowEnd
BattleScript_GiveCaughtMonEnd::
givecaughtmon
givecaughtmon BattleScript_SuccessBallThrowEnd
BattleScript_SuccessBallThrowEnd::
setbyte gBattleOutcome, B_OUTCOME_CAUGHT
finishturn

View File

@ -89,7 +89,7 @@ gSpecialVars::
.4byte gSpecialVar_MonBoxId
.4byte gSpecialVar_MonBoxPos
.4byte gSpecialVar_Unused_0x8014
.4byte gTrainerBattleOpponent_A
.4byte gTrainerBattleParameter + 2 // gTrainerBattleParameter.params.opponentA
.include "data/specials.inc"

View File

@ -105,7 +105,7 @@ BattlePyramid_WarpToTop::
@ TRAINER_PHILLIP is used as a placeholder
BattlePyramid_TrainerBattle::
trainerbattle TRAINER_BATTLE_PYRAMID, TRAINER_PHILLIP, 0, BattleFacility_TrainerBattle_PlaceholderText, BattleFacility_TrainerBattle_PlaceholderText
trainerbattle TRAINER_BATTLE_HILL, OBJ_ID_NONE, TRAINER_PHILLIP, BattleFacility_TrainerBattle_PlaceholderText, BattleFacility_TrainerBattle_PlaceholderText, NULL, OBJ_ID_NONE, TRAINER_NONE, NULL, NULL, NULL, NULL, NULL, FALSE, FALSE, FALSE, FALSE
pyramid_showhint
waitmessage
waitbuttonpress

View File

@ -51,138 +51,60 @@ BattleFrontier_Lounge5_Text_NatureGirlNoneShown::
.string "Boo!\n"
.string "Cheapie!$"
BattleFrontier_Lounge5_Text_NatureGirlHardy::
BattleFrontier_Lounge5_Text_NatureGirlAttackHighAttackLow::
.string "Hmhm…\p"
.string "This one says it likes to battle!\n"
.string "It will battle even if it has a lot\l"
.string "of ouchies!$"
BattleFrontier_Lounge5_Text_NatureGirlLonely::
.string "Hmhm…\p"
.string "This one says it likes to be sneaky!\n"
.string "But if it gets enough ouchies,\l"
.string "it will hit back!$"
BattleFrontier_Lounge5_Text_NatureGirlBrave::
BattleFrontier_Lounge5_Text_NatureGirlAttackHighDefenseLow::
.string "Hmhm…\p"
.string "This one says it likes to battle!\n"
.string "But if it gets enough ouchies,\l"
.string "it will worry about itself!$"
BattleFrontier_Lounge5_Text_NatureGirlAdamant::
.string "Hmhm…\p"
.string "This one says it likes to battle!\n"
.string "It will battle even if it has a lot\l"
.string "of ouchies!$"
BattleFrontier_Lounge5_Text_NatureGirlNaughty::
.string "Hmhm…\p"
.string "This one says it looks after itself!\n"
.string "But if it gets enough ouchies,\l"
.string "it will hit back!$"
BattleFrontier_Lounge5_Text_NatureGirlBold::
.string "Hmhm…\p"
.string "This one says it likes to be sneaky!\n"
.string "But if it gets enough ouchies,\l"
.string "it will worry about itself!$"
BattleFrontier_Lounge5_Text_NatureGirlDocileNaiveQuietQuirky::
.string "Hmhm…\p"
.string "This one says it likes to battle!\n"
.string "It will battle even if it has a lot\l"
.string "of ouchies!$"
BattleFrontier_Lounge5_Text_NatureGirlRelaxed::
.string "Hmhm…\p"
.string "This one says it likes to be sneaky!\n"
.string "But if it gets enough ouchies,\l"
.string "it will hit back!$"
BattleFrontier_Lounge5_Text_NatureGirlImpish::
.string "Hmhm…\p"
.string "This one says it likes to battle!\n"
.string "But if it gets enough ouchies,\l"
.string "it will worry about itself!$"
BattleFrontier_Lounge5_Text_NatureGirlLax::
.string "Hmhm…\p"
.string "This one says it likes to be sneaky!\n"
.string "It says it likes to be sneaky even\l"
.string "if it has a lot of ouchies!$"
BattleFrontier_Lounge5_Text_NatureGirlTimid::
BattleFrontier_Lounge5_Text_NatureGirlAttackHighSupportLow::
.string "Hmhm…\p"
.string "This one says it likes to battle!\n"
.string "But if it gets enough ouchies,\l"
.string "it will turn sneaky!$"
BattleFrontier_Lounge5_Text_NatureGirlHasty::
BattleFrontier_Lounge5_Text_NatureGirlDefenseHighAttackLow::
.string "Hmhm…\p"
.string "This one says it likes to battle!\n"
.string "It will battle even if it has a lot\l"
.string "of ouchies!$"
BattleFrontier_Lounge5_Text_NatureGirlSerious::
.string "Hmhm…\p"
.string "This one says it likes to be sneaky!\n"
.string "It says it likes to be sneaky even\l"
.string "if it has a lot of ouchies!$"
BattleFrontier_Lounge5_Text_NatureGirlJolly::
.string "Hmhm…\p"
.string "This one says it likes to be sneaky!\n"
.string "This one says it looks after itself!\n"
.string "But if it gets enough ouchies,\l"
.string "it will worry about itself!$"
.string "it will hit back!$"
BattleFrontier_Lounge5_Text_NatureGirlModest::
BattleFrontier_Lounge5_Text_NatureGirlDefenseHighDefenseLow::
.string "Hmhm…\p"
.string "This one says it looks after itself!\n"
.string "It says it worries about itself whether\l"
.string "or not it has a lot of ouchies!$"
BattleFrontier_Lounge5_Text_NatureGirlMild::
BattleFrontier_Lounge5_Text_NatureGirlDefenseHighSupportLow::
.string "Hmhm…\p"
.string "This one says it looks after itself!\n"
.string "But if it gets enough ouchies,\l"
.string "it will turn sneaky!$"
BattleFrontier_Lounge5_Text_NatureGirlBashful::
BattleFrontier_Lounge5_Text_NatureGirlSupportHighAttackLow::
.string "Hmhm…\p"
.string "This one says it looks after itself!\n"
.string "It says it worries about itself even\l"
.string "if it has a lot of ouchies!$"
.string "This one says it likes to be sneaky!\n"
.string "But if it gets enough ouchies,\l"
.string "it will hit back!$"
BattleFrontier_Lounge5_Text_NatureGirlRash::
BattleFrontier_Lounge5_Text_NatureGirlSupportHighDefenseLow::
.string "Hmhm…\p"
.string "This one says it likes to be sneaky!\n"
.string "But if it gets enough ouchies,\l"
.string "it will worry about itself!$"
BattleFrontier_Lounge5_Text_NatureGirlSupportHighSupportLow::
.string "Hmhm…\p"
.string "This one says it likes to be sneaky!\n"
.string "It says it likes to be sneaky even\l"
.string "if it has a lot of ouchies!$"
BattleFrontier_Lounge5_Text_NatureGirlCalm::
.string "Hmhm…\p"
.string "This one says it looks after itself!\n"
.string "It says it worries about itself even\l"
.string "if it has a lot of ouchies!$"
BattleFrontier_Lounge5_Text_NatureGirlGentle::
.string "Hmhm…\p"
.string "This one says it looks after itself!\n"
.string "But if it gets enough ouchies,\l"
.string "it will hit back!$"
BattleFrontier_Lounge5_Text_NatureGirlSassy::
.string "Hmhm…\p"
.string "This one says it likes to battle!\n"
.string "But if it gets enough ouchies,\l"
.string "it will turn sneaky!$"
BattleFrontier_Lounge5_Text_NatureGirlCareful::
.string "Hmhm…\p"
.string "This one says it looks after itself!\n"
.string "But if it gets enough ouchies,\l"
.string "it will turn sneaky!$"
BattleFrontier_Lounge5_Text_NatureGirlEgg::
.string "That's silly! An EGG is asleep!\n"
.string "I can't talk to it!$"

View File

@ -104,7 +104,7 @@ LavaridgeTown_Gym_1F_EventScript_FlanneryRematch::
end
LavaridgeTown_Gym_1F_EventScript_Cole::
trainerbattle TRAINER_BATTLE_CONTINUE_SCRIPT, TRAINER_COLE, LOCALID_COLE, LavaridgeTown_Gym_1F_Text_ColeIntro, LavaridgeTown_Gym_1F_Text_ColeDefeat, LavaridgeTown_Gym_EventScript_CheckTrainerScript
trainerbattle TRAINER_BATTLE_CONTINUE_SCRIPT, LOCALID_COLE, TRAINER_COLE, LavaridgeTown_Gym_1F_Text_ColeIntro, LavaridgeTown_Gym_1F_Text_ColeDefeat, LavaridgeTown_Gym_EventScript_CheckTrainerScript, OBJ_ID_NONE, TRAINER_NONE, NULL, NULL, NULL, NULL, NULL, FALSE, TRUE, FALSE, FALSE
msgbox LavaridgeTown_Gym_1F_Text_ColePostBattle, MSGBOX_AUTOCLOSE
end
@ -116,37 +116,37 @@ LavaridgeTown_Gym_EventScript_CheckTrainerScript::
end
LavaridgeTown_Gym_1F_EventScript_Axle::
trainerbattle TRAINER_BATTLE_CONTINUE_SCRIPT, TRAINER_AXLE, LOCALID_AXLE, LavaridgeTown_Gym_1F_Text_AxleIntro, LavaridgeTown_Gym_1F_Text_AxleDefeat, LavaridgeTown_Gym_EventScript_CheckTrainerScript
trainerbattle TRAINER_BATTLE_CONTINUE_SCRIPT, LOCALID_AXLE, TRAINER_AXLE, LavaridgeTown_Gym_1F_Text_AxleIntro, LavaridgeTown_Gym_1F_Text_AxleDefeat, LavaridgeTown_Gym_EventScript_CheckTrainerScript, OBJ_ID_NONE, TRAINER_NONE, NULL, NULL, NULL, NULL, NULL, FALSE, TRUE, FALSE, FALSE
msgbox LavaridgeTown_Gym_1F_Text_AxlePostBattle, MSGBOX_AUTOCLOSE
end
LavaridgeTown_Gym_B1F_EventScript_Keegan::
trainerbattle TRAINER_BATTLE_CONTINUE_SCRIPT, TRAINER_KEEGAN, LOCALID_KEEGAN, LavaridgeTown_Gym_B1F_Text_KeeganIntro, LavaridgeTown_Gym_B1F_Text_KeeganDefeat, LavaridgeTown_Gym_EventScript_CheckTrainerScript
trainerbattle TRAINER_BATTLE_CONTINUE_SCRIPT, LOCALID_KEEGAN, TRAINER_KEEGAN, LavaridgeTown_Gym_B1F_Text_KeeganIntro, LavaridgeTown_Gym_B1F_Text_KeeganDefeat, LavaridgeTown_Gym_EventScript_CheckTrainerScript, OBJ_ID_NONE, TRAINER_NONE, NULL, NULL, NULL, NULL, NULL, FALSE, TRUE, FALSE, FALSE
msgbox LavaridgeTown_Gym_B1F_Text_KeeganPostBattle, MSGBOX_AUTOCLOSE
end
LavaridgeTown_Gym_1F_EventScript_Danielle::
trainerbattle TRAINER_BATTLE_CONTINUE_SCRIPT, TRAINER_DANIELLE, LOCALID_DANIELLE, LavaridgeTown_Gym_1F_Text_DanielleIntro, LavaridgeTown_Gym_1F_Text_DanielleDefeat, LavaridgeTown_Gym_EventScript_CheckTrainerScript
trainerbattle TRAINER_BATTLE_CONTINUE_SCRIPT, LOCALID_DANIELLE, TRAINER_DANIELLE, LavaridgeTown_Gym_1F_Text_DanielleIntro, LavaridgeTown_Gym_1F_Text_DanielleDefeat, LavaridgeTown_Gym_EventScript_CheckTrainerScript, OBJ_ID_NONE, TRAINER_NONE, NULL, NULL, NULL, NULL, NULL, FALSE, TRUE, FALSE, FALSE
msgbox LavaridgeTown_Gym_1F_Text_DaniellePostBattle, MSGBOX_AUTOCLOSE
end
LavaridgeTown_Gym_1F_EventScript_Gerald::
trainerbattle TRAINER_BATTLE_CONTINUE_SCRIPT, TRAINER_GERALD, LOCALID_GERALD, LavaridgeTown_Gym_1F_Text_GeraldIntro, LavaridgeTown_Gym_1F_Text_GeraldDefeat, LavaridgeTown_Gym_EventScript_CheckTrainerScript
trainerbattle TRAINER_BATTLE_CONTINUE_SCRIPT, LOCALID_GERALD, TRAINER_GERALD, LavaridgeTown_Gym_1F_Text_GeraldIntro, LavaridgeTown_Gym_1F_Text_GeraldDefeat, LavaridgeTown_Gym_EventScript_CheckTrainerScript, OBJ_ID_NONE, TRAINER_NONE, NULL, NULL, NULL, NULL, NULL, FALSE, TRUE, FALSE, FALSE
msgbox LavaridgeTown_Gym_1F_Text_GeraldPostBattle, MSGBOX_AUTOCLOSE
end
LavaridgeTown_Gym_B1F_EventScript_Jace::
trainerbattle TRAINER_BATTLE_CONTINUE_SCRIPT, TRAINER_JACE, LOCALID_JACE, LavaridgeTown_Gym_B1F_Text_JaceIntro, LavaridgeTown_Gym_B1F_Text_JaceDefeat, LavaridgeTown_Gym_EventScript_CheckTrainerScript
trainerbattle TRAINER_BATTLE_CONTINUE_SCRIPT, LOCALID_JACE, TRAINER_JACE, LavaridgeTown_Gym_B1F_Text_JaceIntro, LavaridgeTown_Gym_B1F_Text_JaceDefeat, LavaridgeTown_Gym_EventScript_CheckTrainerScript, OBJ_ID_NONE, TRAINER_NONE, NULL, NULL, NULL, NULL, NULL, FALSE, TRUE, FALSE, FALSE
msgbox LavaridgeTown_Gym_B1F_Text_JacePostBattle, MSGBOX_AUTOCLOSE
end
LavaridgeTown_Gym_B1F_EventScript_Jeff::
trainerbattle TRAINER_BATTLE_CONTINUE_SCRIPT, TRAINER_JEFF, LOCALID_JEFF, LavaridgeTown_Gym_B1F_Text_JeffIntro, LavaridgeTown_Gym_B1F_Text_JeffDefeat, LavaridgeTown_Gym_EventScript_CheckTrainerScript
trainerbattle TRAINER_BATTLE_CONTINUE_SCRIPT, LOCALID_JEFF, TRAINER_JEFF, LavaridgeTown_Gym_B1F_Text_JeffIntro, LavaridgeTown_Gym_B1F_Text_JeffDefeat, LavaridgeTown_Gym_EventScript_CheckTrainerScript, OBJ_ID_NONE, TRAINER_NONE, NULL, NULL, NULL, NULL, NULL, FALSE, TRUE, FALSE, FALSE
msgbox LavaridgeTown_Gym_B1F_Text_JeffPostBattle, MSGBOX_AUTOCLOSE
end
LavaridgeTown_Gym_B1F_EventScript_Eli::
trainerbattle TRAINER_BATTLE_CONTINUE_SCRIPT, TRAINER_ELI, LOCALID_ELI, LavaridgeTown_Gym_B1F_Text_EliIntro, LavaridgeTown_Gym_B1F_Text_EliDefeat, LavaridgeTown_Gym_EventScript_CheckTrainerScript
trainerbattle TRAINER_BATTLE_CONTINUE_SCRIPT, LOCALID_ELI, TRAINER_ELI, LavaridgeTown_Gym_B1F_Text_EliIntro, LavaridgeTown_Gym_B1F_Text_EliDefeat, LavaridgeTown_Gym_EventScript_CheckTrainerScript, OBJ_ID_NONE, TRAINER_NONE, NULL, NULL, NULL, NULL, NULL, FALSE, TRUE, FALSE, FALSE
msgbox LavaridgeTown_Gym_B1F_Text_EliPostBattle, MSGBOX_AUTOCLOSE
end

View File

@ -34,7 +34,7 @@ EventScript_PkmnCenterNurse_IllTakeYourPkmn2::
EventScript_PkmnCenterNurse_TakeAndHealPkmn::
hidefollower 0
applymovement VAR_0x800B, Movement_PkmnCenterNurse_Turn @ Changed from Common_Movement_WalkInPlaceFasterLeft to force the follower to enter their Poké Ball
applymovement VAR_0x800B, Movement_PkmnCenterNurse_Turn
waitmovement 0
dofieldeffect FLDEFF_POKECENTER_HEAL
.if OW_UNION_DISABLE_CHECK == FALSE && OW_FLAG_MOVE_UNION_ROOM_CHECK != 0

View File

@ -60,7 +60,7 @@ TrainerHill_1F_Movement_SetInvisible::
@ TRAINER_PHILLIP is an actual Trainer on the SS Tidal, but is used as a placeholder here
TrainerHill_EventScript_TrainerBattle::
trainerbattle TRAINER_BATTLE_HILL, TRAINER_PHILLIP, 0, BattleFacility_TrainerBattle_PlaceholderText, BattleFacility_TrainerBattle_PlaceholderText
trainerbattle TRAINER_BATTLE_HILL, OBJ_ID_NONE, TRAINER_PHILLIP, BattleFacility_TrainerBattle_PlaceholderText, BattleFacility_TrainerBattle_PlaceholderText, NULL, OBJ_ID_NONE, TRAINER_NONE, NULL, NULL, NULL, NULL, NULL, FALSE, FALSE, FALSE, FALSE
trainerhill_postbattletext
waitmessage
waitbuttonpress

View File

@ -561,3 +561,5 @@ gSpecials::
def_special Script_GetChosenMonOffensiveIVs
def_special Script_GetChosenMonDefensiveIVs
def_special UseBlankMessageToCancelPokemonPic
def_special EnterCode
def_special GetCodeFeedback

View File

@ -22,6 +22,12 @@ gText_PkmnTransferredLanettesPCBoxFull::
.string "{STR_VAR_2} was transferred to\n"
.string "BOX “{STR_VAR_1}.”$"
gText_PkmnSentToPCAfterCatch::
.string "{STR_VAR_2} was sent to\n"
.string "{B_PC_CREATOR_NAME} PC.\p"
.string "It was placed in \n"
.string "BOX “{STR_VAR_1}”.$"
gText_NoMoreRoomForPokemon::
.string "There's no more room for POKéMON!\p"
.string "The POKéMON BOXES are full and\n"

View File

@ -22,6 +22,7 @@
- [Day/Night System FAQ](tutorials/dns.md)
- [Changelog](./CHANGELOG.md)
- [1.10.x]()
- [Version 1.10.2](changelogs/1.10.x/1.10.2.md)
- [Version 1.10.1](changelogs/1.10.x/1.10.1.md)
- [Version 1.10.0](changelogs/1.10.x/1.10.0.md)
- [1.9.x]()

View File

@ -0,0 +1,143 @@
# Version 1.10.2
```md
## How to update
- If you haven't set up a remote, run the command `git remote add RHH https://github.com/rh-hideout/pokeemerald-expansion`.
- Once you have your remote set up, run the command `git pull RHH expansion/1.10.2`.
```
## 🧬 General 🧬
### Changed
* Add manual breaking back to "What will (mon) do?" message by @kittenchilly in [#5908](https://github.com/rh-hideout/pokeemerald-expansion/pull/5908)
### Fixed
* Explicitly specify dependencies for teachable learnset helper by @ravepossum in [#6015](https://github.com/rh-hideout/pokeemerald-expansion/pull/6015)
* Add dependency on json files to learnset helper by @ravepossum in [#6083](https://github.com/rh-hideout/pokeemerald-expansion/pull/6083)
## 🗺️ Overworld 🗺️
### Fixed
* Field effect for cutting grass is missing setfieldeffectargument. Issue #5766 by @shachar700 and @kasenn for finding the source of the issue, @hedara90 for the help with github in [#5952](https://github.com/rh-hideout/pokeemerald-expansion/pull/5952)
* Fix Match Call Behavior (#5931) by @MercedesCL in [#6033](https://github.com/rh-hideout/pokeemerald-expansion/pull/6033)
* Fixes HGSS dex not compiling currently by @hedara90 in [#6051](https://github.com/rh-hideout/pokeemerald-expansion/pull/6051)
* Fixed Liquid Voice's dynamic type for normal moves by @fdeblasio in [#6092](https://github.com/rh-hideout/pokeemerald-expansion/pull/6092)
* Fix Crash if something costs 0 in shop by @DizzyEggg in [#6106](https://github.com/rh-hideout/pokeemerald-expansion/pull/6106)
* Fixed Hoenn dex off by 1 issues by @fdeblasio in [#6104](https://github.com/rh-hideout/pokeemerald-expansion/pull/6104)
## 🐉 Pokémon 🐉
### Changed
* Add Clodsire second frame and fixed Grookey backsprite + overworld by @kittenchilly in [#6047](https://github.com/rh-hideout/pokeemerald-expansion/pull/6047)
* Duraludon battle animation by @Cafeei in [#6086](https://github.com/rh-hideout/pokeemerald-expansion/pull/6086)
### Fixed
* Fix Enamorus not changing forms by @Bassoonian in [#6093](https://github.com/rh-hideout/pokeemerald-expansion/pull/6093)
## ⚔️ Battle General ⚔️
### Changed
* Adds static assert for `DamageCalculationData` by @AlexOn1ine in [#6063](https://github.com/rh-hideout/pokeemerald-expansion/pull/6063)
### Fixed
* Fixes Trainer Slide messages causing corruption for recoil damage by @AlexOn1ine in [#5926](https://github.com/rh-hideout/pokeemerald-expansion/pull/5926)
* Fixes broken link battles by @hedara90 and @AsparagusEduardo for finding out that the `gBitTable` removal was the source of the bug. in [#5940](https://github.com/rh-hideout/pokeemerald-expansion/pull/5940)
* fixed interaction between Innards Out and Future Sight by @wiz1989 in [#5966](https://github.com/rh-hideout/pokeemerald-expansion/pull/5966)
* Fixes various Dynamax HP conversions/calculations by @PhallenTree in [#5933](https://github.com/rh-hideout/pokeemerald-expansion/pull/5933)
* Fixes Parting Shot / Eject Pack interaction by @AlexOn1ine in [#5963](https://github.com/rh-hideout/pokeemerald-expansion/pull/5963)
* Fixes Shell Bell including heal amount from Future Sight when triggered by @AlexOn1ine in [#5962](https://github.com/rh-hideout/pokeemerald-expansion/pull/5962)
* Fixes Tera giving boost to dynamic bp moves by @AlexOn1ine in [#6008](https://github.com/rh-hideout/pokeemerald-expansion/pull/6008)
* Fixes Z-Move trigger sprite on B button exit by @AlexOn1ine in [#6009](https://github.com/rh-hideout/pokeemerald-expansion/pull/6009)
* Fixed multiple transform/form change graphical issues by @AsparagusEduardo in [#6005](https://github.com/rh-hideout/pokeemerald-expansion/pull/6005)
- Dynamax and Tera color tinting now stays during Transform/Form Change animations.
- Dynamax no longer resets Transformed mon sprites.
- Transform no longer transforms into a Gigantamax Pokémon unless the transformee has Gigantamax Factor and transforms into a base form with a Gigantamax Form.
* Fixes defrosting if frozen mon is not damaged by opponent by @AlexOn1ine in [#6016](https://github.com/rh-hideout/pokeemerald-expansion/pull/6016)
* Fix Redirection Abilities Not Drawing in Ally Moves by @ghoulslash in [#6026](https://github.com/rh-hideout/pokeemerald-expansion/pull/6026)
* fixed bug giving immunity to full-paralysis when B_MAGIC_GUARD is >= GEN_4 by @AERDU in [#6032](https://github.com/rh-hideout/pokeemerald-expansion/pull/6032)
* Fixes large battle messages being cut off instead of being prompted to advance by @PhallenTree in [#6052](https://github.com/rh-hideout/pokeemerald-expansion/pull/6052)
* Fixes Rapid Spin / Toxic Debris interaction by @AlexOn1ine in [#6023](https://github.com/rh-hideout/pokeemerald-expansion/pull/6023)
* Fixes Eject Pack triggering twice on Intimidate by @AlexOn1ine in [#6072](https://github.com/rh-hideout/pokeemerald-expansion/pull/6072)
* Trainerslide animation fix by @hedara90 in [#6040](https://github.com/rh-hideout/pokeemerald-expansion/pull/6040)
- `B_ENEMY_MON_SHADOW_STYLE` set to `GEN_LATEST` since that setting no longer interferes with trainerslides. Set it to `GEN_3` to use regular Gen 3 shadow style.
* Fixes Charge effect not boosting and tests by @AlexOn1ine in [#6102](https://github.com/rh-hideout/pokeemerald-expansion/pull/6102)
* Fix seeds softlocking the game when a battler with a Surge ability enters the field by @PhallenTree in [#6110](https://github.com/rh-hideout/pokeemerald-expansion/pull/6110)
* Fix MindBlown crash on MyBoy/No Cash by @DizzyEggg in [#6112](https://github.com/rh-hideout/pokeemerald-expansion/pull/6112)
* Fix Double Iron Bash move animation crash on MyBoy/No$ by @DizzyEggg in [#6114](https://github.com/rh-hideout/pokeemerald-expansion/pull/6114)
* Fix safari zone crash on No Cash by @DizzyEggg in [#6132](https://github.com/rh-hideout/pokeemerald-expansion/pull/6132)
## 🤹 Moves 🤹
### Fixed
* Fixed a bunch of move anims by @hedara90 in [#5936](https://github.com/rh-hideout/pokeemerald-expansion/pull/5936)
## 🧶 Items 🧶
### Changed
* Added the Gen. 4+ berries to gBerryCrush_BerryData by @LOuroboros in [#5937](https://github.com/rh-hideout/pokeemerald-expansion/pull/5937)
### Fixed
* Reverts wrongly done partial Eject Pack fix by @AlexOn1ine in [#5928](https://github.com/rh-hideout/pokeemerald-expansion/pull/5928)
## 🤖 Battle AI 🤖
### Fixed
* Fix Entrainment AI scoring bug by @Pawkkie in [#6056](https://github.com/rh-hideout/pokeemerald-expansion/pull/6056)
* Removed stray semi-colon in AI code by @hedara90 in [#6134](https://github.com/rh-hideout/pokeemerald-expansion/pull/6134)
## 🧹 Other Cleanup 🧹
* Clear unneeded braces from 5922 by @Pawkkie in [#5927](https://github.com/rh-hideout/pokeemerald-expansion/pull/5927)
* Removed references to `HANDLE_EXPANDED_MOVE_NAME` in docs by @AsparagusEduardo in [#5955](https://github.com/rh-hideout/pokeemerald-expansion/pull/5955)
* Rename `AI_FLAG_PREFER_STRONGEST_MOVE` by @Pawkkie in [#5972](https://github.com/rh-hideout/pokeemerald-expansion/pull/5972)
* Removed `OW_AUTO_SIGNPOST` by @AlexOn1ine in [#5978](https://github.com/rh-hideout/pokeemerald-expansion/pull/5978)
* `CreateFacilityMon` error: `'personality' may be used uninitialized` by @DizzyEggg in [#5981](https://github.com/rh-hideout/pokeemerald-expansion/pull/5981)
* PlayerHandleStatusXor - change `u8` to `u32` by @DizzyEggg in [#5988](https://github.com/rh-hideout/pokeemerald-expansion/pull/5988)
* Follow up for Innards Out / Future Sight interaction by @AlexOn1ine in [#5967](https://github.com/rh-hideout/pokeemerald-expansion/pull/5967)
* Remove out of bounds `gSprites` access in move relearner by @DizzyEggg in [#5991](https://github.com/rh-hideout/pokeemerald-expansion/pull/5991)
* Use `gCurrentMove` instead of checking `0xFF` move by @AlexOn1ine in [#5999](https://github.com/rh-hideout/pokeemerald-expansion/pull/5999)
* Wrong undefs by @AlexOn1ine in [#6024](https://github.com/rh-hideout/pokeemerald-expansion/pull/6024)
* Fixed whitespace issue with trainerproc by @AsparagusEduardo in [#6042](https://github.com/rh-hideout/pokeemerald-expansion/pull/6042)
* Remove redundant line in `Cmd_setcharge` by @AlexOn1ine in [#6053](https://github.com/rh-hideout/pokeemerald-expansion/pull/6053)
* Put Identifier and smol in gitignore by @DizzyEggg in [#6105](https://github.com/rh-hideout/pokeemerald-expansion/pull/6105)
* Move flag fixes by @fdeblasio in [#6107](https://github.com/rh-hideout/pokeemerald-expansion/pull/6107)
* Remove `formToChangeInto` (Unused) by @AlexOn1ine in [#6137](https://github.com/rh-hideout/pokeemerald-expansion/pull/6137)
## 🧪 Test Runner 🧪
### Changed
* Insomnia test used the wrong move in Turn section by @AlexOn1ine in [#5939](https://github.com/rh-hideout/pokeemerald-expansion/pull/5939)
* Updated Makefile to allow for the creation of specific tests by @pkmnsnfrn and @mrgriffin in [#5993](https://github.com/rh-hideout/pokeemerald-expansion/pull/5993)
* Adds Liquid Ooze and Aromatic Mist test by @AlexOn1ine in [#6012](https://github.com/rh-hideout/pokeemerald-expansion/pull/6012)
* Improved Hidden Power test by @AsparagusEduardo and @hedara90, who recommended this implementation. in [#6014](https://github.com/rh-hideout/pokeemerald-expansion/pull/6014)
* Add known failing learnset cap test by @Bassoonian in [#6046](https://github.com/rh-hideout/pokeemerald-expansion/pull/6046)
* Fix Symbiosis Needing battler Argument + Tests by @ghoulslash in [#6039](https://github.com/rh-hideout/pokeemerald-expansion/pull/6039)
* Added some `TO_DO` tests by @hedara90 in [#6140](https://github.com/rh-hideout/pokeemerald-expansion/pull/6140)
### Fixed
* Fixed Gimmick tests failing when running first by @AsparagusEduardo in [#6001](https://github.com/rh-hideout/pokeemerald-expansion/pull/6001)
* Ported Makefile fix from upcoming by @hedara90 and @mrgriffin Wrote the fix on upcoming in [#6007](https://github.com/rh-hideout/pokeemerald-expansion/pull/6007)
## 📚 Documentation 📚
* Fix formatting in `WSL.md` by @Cafeei in [#5942](https://github.com/rh-hideout/pokeemerald-expansion/pull/5942)
* Update scope.md by @Pawkkie in [#5948](https://github.com/rh-hideout/pokeemerald-expansion/pull/5948)
* Removed references to `HANDLE_EXPANDED_MOVE_NAME` in docs by @AsparagusEduardo in [#5955](https://github.com/rh-hideout/pokeemerald-expansion/pull/5955)
* Update scope.md (again) by @Pawkkie and @kithr1 in [#5971](https://github.com/rh-hideout/pokeemerald-expansion/pull/5971)
* Codify new expansion release schedule by @pkmnsnfrn and @Pawkkie in [#5916](https://github.com/rh-hideout/pokeemerald-expansion/pull/5916)
* Workflow for Scope Discussion by @Pawkkie in [#6022](https://github.com/rh-hideout/pokeemerald-expansion/pull/6022)
* Update `constants/pokemon.h` with nature comments by @bassforte123 in [#6133](https://github.com/rh-hideout/pokeemerald-expansion/pull/6133)
## 📦 Branch Synchronisation 📦
### pret
* 17 of January in [#6045](https://github.com/rh-hideout/pokeemerald-expansion/pull/6045)
* Slight contest documentation by @AsparagusEduardo in [pret#2078](https://github.com/pret/pokeemerald/pull/2078)
* Update vars.h (cleanup) by @shachar700 in [pret#2082](https://github.com/pret/pokeemerald/pull/2082)
* missing const in extern gBasicHitSplatSpriteTemplate by @DizzyEggg in [pret#2083](https://github.com/pret/pokeemerald/pull/2083)
* extern gAncientPowerRockSpriteTemplate fix by @DizzyEggg in [pret#2084](https://github.com/pret/pokeemerald/pull/2084)
* remove undef TASK_NONE from list_menu by @DizzyEggg in [pret#2085](https://github.com/pret/pokeemerald/pull/2085)
* Fix CaveTransition pals by @DizzyEggg in [pret#2095](https://github.com/pret/pokeemerald/pull/2095)
* Define field script opcode constants by @rayrobdod in [pret#2005](https://github.com/pret/pokeemerald/pull/2005)
* Document bard music by @GriffinRichards in [pret#2053](https://github.com/pret/pokeemerald/pull/2053)
* Extern gSprites and gOamMatrices with known array size by @DizzyEggg in [pret#2090](https://github.com/pret/pokeemerald/pull/2090)
* Fix conflicting types for rotating gate functions by @DizzyEggg in [pret#2087](https://github.com/pret/pokeemerald/pull/2087)
## New Contributors
* @shachar700 made their first contribution in [#5952](https://github.com/rh-hideout/pokeemerald-expansion/pull/5952)
* @MercedesCL made their first contribution in [#6033](https://github.com/rh-hideout/pokeemerald-expansion/pull/6033)
* @bassforte123 made their first contribution in [#6133](https://github.com/rh-hideout/pokeemerald-expansion/pull/6133)
**Full Changelog**: https://github.com/rh-hideout/pokeemerald-expansion/compare/expansion/1.10.1...expansion/1.10.2
<!--Last PR: 6133-->
<!--Used to keep track of the last PR merged in case new ones come in before the changelog is done.-->

View File

@ -0,0 +1,395 @@
## How to use the code entry system
This system involves using the `EnterCode` special to prompt the player to enter a text string, and then the `GetCodeFeedback` special to perform some function based on the string entered. Using this system to make your own cheat codes or mystery gifts will involve both scripting and editing the `GetCodeFeedback` function itself to include your new functionality, and may involve further changes to the codebase if you want to implement something more far reaching (ie. a grindrunning mode).
This tutorial will use the example of entering the string "CaughtEmAll" to flag every Pokemon as caught
### 1. Choose where to initiaze your event scripting
This can be anywhere or anything, pre-existing or added by you in porymap. I usually like using signs for testing things but this can be anything. I'm going to give the main script a more generic name, and you can attach it to whatever object you like.
In that object's event script, add the following:
```diff
EventScript_CodeEntry::
special EnterCode
waitstate
special GetCodeFeedback
end
```
This will prompt text entry from the object and prepare it to handle reading the entered text after it's been entered, but it won't do anything yet. Next we need to add our functionality to `GetCodeFeedback`.
### 2. Add code string and code function to `GetCodeFeedback`
You can find `GetCodeFeedback` in `src/field_specials.c`. Let's start by taking a look at the function:
```
void GetCodeFeedback(void)
{
static const u8 sText_SampleCode[] = _("SampleCode");
if (!StringCompare(gStringVar2, sText_SampleCode))
gSpecialVar_Result = 1;
else
gSpecialVar_Result = 0;
}
```
What this function does is compare the input string (`gStringVar2`) against a specified string (`sText_SampleCode`) and returns a value depending on whether the strings matched (`gSpecialVar_Result`). Note that due to the way `StringCompare` works, the comparison does need to be negated with `!`. By default, this sample setup returns 1 when the string "SampleCode" is entered by the player.
Let's leave that functionality alone in case we ever want to reference it again, and just add a brand new code instead. We want to use the string "CaughtEmAll" as our code, so we'll start by making a string for it, and a new conditional that checks if the entered string matches. We'll also want to make sure we return a new unique number for `gSpecialVar_Result` so our event script knows what happened.
```diff
void GetCodeFeedback(void)
{
static const u8 sText_SampleCode[] = _("SampleCode");
+ static const u8 sText_CaughtEmAll_[] = _("CaughtEmAll"); // Mark entire Pokedex as caught
if (!StringCompare(gStringVar2, sText_SampleCode))
gSpecialVar_Result = 1;
+ else if (!StringCompare(gStringVar2, sText_CaughtEmAll))
+ {
+ // TODO
+ gSpecialVar_Result = 2;
+ }
else
gSpecialVar_Result = 0;
}
```
Great! Now we have a new case to handle our new code, but it still doesn't do anything. This is the part that will change dramatically depending on what you want to do, and you can do anything you want, from setting flags to calling other functions or anything else! Just make sure you do it from within the conditional that matches your code. In our case we want to iterate through the Pokedex to mark everything as caught, which I'll just do here for simplicity.
```diff
void GetCodeFeedback(void)
{
static const u8 sText_SampleCode[] = _("SampleCode");
static const u8 sText_CaughtEmAll_[] = _("CaughtEmAll"); // Mark entire Pokedex as caught
if (!StringCompare(gStringVar2, sText_SampleCode))
gSpecialVar_Result = 1;
else if (!StringCompare(gStringVar2, sText_CaughtEmAll))
{
+ u32 i;
+ for (i = 0; i < NATIONAL_DEX_COUNT; i++)
+ {
+ GetSetPokedexFlag(i + 1, FLAG_SET_CAUGHT);
+ }
gSpecialVar_Result = 2;
}
else
gSpecialVar_Result = 0;
}
```
Awesome! Now our `GetCodeFeedback` function performs the task we want it to, and returns a 2 to our event script so it can handle the situation appropriately. That's our next and final step!
### 3. Handle new `GetCodeFeedback` case in event script
To clarify, this step is *optional*. You don't need to do anything else after `GetCodeFeedback` has run if you don't want to, as all the functionality is there; once that function finishes, everything in the Pokedex will be marked as caught.
The reason we might want to do this step, and the reason we pass results back to the event script in the first place, is so we can handle providing the player with some dialogue based on what they're doing.
Let's go back to our event script.
```
EventScript_CodeEntry::
special EnterCode
waitstate
special GetCodeFeedback
end
```
Maybe we first want to prompt the player with a message that says something like "Enter a code?"
```diff
EventScript_CodeEntry::
+ lockall
+ msgbox EnterCode_EnterCodeText, MSGBOX_YESNO
+ compare VAR_RESULT, 0
+ goto_if_eq CodeExit
special EnterCode
waitstate
special GetCodeFeedback
end
+CodeExit::
+ releaseall
+ end
+
+EnterCode_EnterCodeText:
+ .string "Enter a code?$"
```
This is all straightforward scripting stuff, the sign will first give the player a YES / NO box and ask whether they'd like to enter a code. Let's now add some cases and messages that handle the different results of the code entry from `GetCodeFeedback`. Let's look at the sign first:
```diff
EventScript_CodeEntry::
lockall
msgbox EnterCode_EnterCodeText, MSGBOX_YESNO
compare VAR_RESULT, 0
goto_if_eq CodeExit
special EnterCode
waitstate
special GetCodeFeedback
+ goto_if_eq VAR_RESULT, 0, CodeFailed
+ goto_if_eq VAR_RESULT, 1, CodeSampleCode
+ goto_if_eq VAR_RESULT, 2, CodeCaughtEmAll
end
```
Now we're handling cases for each of the possible return values from `GetCodeFeedback`! except we don't have any of those functions, so this will cause errors as the script has nothing to `goto_if_eq`. Let's write those too:
```diff
CodeFailed::
msgbox EnterCode_FailedText, MSGBOX_DEFAULT
releaseall
end
CodeSampleString::
msgbox EnterCode_SucceededText, MSGBOX_DEFAULT
msgbox CodeSampleCode_Text, MSGBOX_DEFAULT
releaseall
end
CodeCaughtEmAll::
msgbox EnterCode_SucceededText, MSGBOX_DEFAULT
msgbox CodeCaughtEmAll_Text, MSGBOX_DEFAULT
releaseall
end
```
And lastly, we'll need to add all of the strings we now need to reference:
```
EnterCode_FailedText:
.string "...nothing happened.$"
EnterCode_SucceededText:
.string "The code worked!$"
CodeSampleCode_Text
.string "You entered the sample code!$"
CodeCaughtEmAll_Text
.string "Encyclopedic knowledge fills your head.\n"
.string "It's like you've caught 'em all!$"
```
So to finish up, our event script file now looks like this, with all said and done:
```
EventScript_CodeEntry::
lockall
msgbox EnterCode_EnterCodeText, MSGBOX_YESNO
compare VAR_RESULT, 0
goto_if_eq CodeExit
special EnterCode
waitstate
special GetCodeFeedback
goto_if_eq VAR_RESULT, 0, CodeFailed
goto_if_eq VAR_RESULT, 1, CodeSampleCode
goto_if_eq VAR_RESULT, 2, CodeCaughtEmAll
end
CodeExit::
releaseall
end
CodeFailed::
msgbox EnterCode_FailedText, MSGBOX_DEFAULT
releaseall
end
CodeSampleString::
msgbox EnterCode_SucceededText, MSGBOX_DEFAULT
msgbox CodeSampleCode_Text, MSGBOX_DEFAULT
releaseall
end
CodeCaughtEmAll::
msgbox EnterCode_SucceededText, MSGBOX_DEFAULT
msgbox CodeCaughtEmAll_Text, MSGBOX_DEFAULT
releaseall
end
EnterCode_EnterCodeText:
.string "Enter a code?$"
EnterCode_FailedText:
.string "...nothing happened.$"
EnterCode_SucceededText:
.string "The code worked!$"
CodeSampleCode_Text
.string "You entered the sample code!$"
CodeCaughtEmAll_Text
.string "Encyclopedic knowledge fills your head.\n"
.string "It's like you've caught 'em all!$"
```
And that's it! Feel free to expand this in whatever way you wish, the pattern can just be repeated as much as you like, and you can made the code called from `GetCodeFeedback` do whatever you like.
## Can I change the icon on the name entry screen?
Absolutely! In `naming_screen.c`, look for the `NamingScreen_CreateCodeIcon` function. It's very short. There's one relevant line that needs to be changed:
```
spriteId = CreateObjectGraphicsSprite(OBJ_EVENT_GFX_MYSTERY_GIFT_MAN, SpriteCallbackDummy, 56, 37, 0);
```
Just swap out `OBJ_EVENT_GFX_MYSTERY_GIFT_MAN` for whatever event object sprite you'd like to use instead. You may need to adjust the position (the 56 and 37 in this example) depending on your sprite.
## What about a mystery gift setup?
I'd like to cover this separately because it's best handled via `givemon` script commands, which means we don't do much in `GetCodeFeedback` other than return a unique identifier. I'm gonna reference @PCG06's mystery gift implementation which is based on this code entry system for a clean and really thorough example.
### 3. Mystery Gift `GetCodeFeedback`
Let's say you have two mystery gift mons and no other cases you want to handle, one for Celebi and one for Jirachi. Your `GetCodeFeedback` function will look something like this:
```
{
static const u8 sText_CodeCelebi[] = _("Celebi");
static const u8 sText_CodeJirachi[] = _("Jirachi");
if (!StringCompare(gStringVar2, sText_CodeCelebi))
gSpecialVar_Result = 1;
else if (!StringCompare(gStringVar2, sText_CodeJirachi))
gSpecialVar_Result = 2;
else
gSpecialVar_Result = 0;
}
```
and that's it, super simple. All of the other handling will have to be done on the scripting end, as we'll be leaning on `givemon` and its associated handling.
### 2. Mystery Gift Scripting
Let's return back to our EventScript_CodeEntry pattern from before, but instead use our new codes.
```
EventScript_CodeEntry::
lockall
msgbox EnterCode_EnterCodeText, MSGBOX_YESNO
compare VAR_RESULT, 0
goto_if_eq CodeExit
special EnterCode
waitstate
special GetCodeFeedback
goto_if_eq VAR_RESULT, 0, CodeFailed
goto_if_eq VAR_RESULT, 1, MysteryGift_EventScript_Celebi
goto_if_eq VAR_RESULT, 2, MysteryGift_EventScript_Jirachi
end
```
Straightforward enough! The actual work is in writing `MysteryGift_EventScript_Celebi` and `MysteryGift_EventScript_Jirachi` to handle their givemons appropriately, prompt nicknaming, send them to the PC if the party is full, etc. We should also keep in mind that each Mystery Gift should only be entered once, so we'll want to track that with a flag; conveniently, expansion already has 15 flags we can use for the purpose. Let's do Celebi first.
```
MysteryGift_EventScript_Celebi::
goto_if_set FLAG_MYSTERY_GIFT_1, MysteryGift_EventScript_Redeemed
bufferspeciesname STR_VAR_1, SPECIES_CELEBI
setvar VAR_TEMP_TRANSFERRED_SPECIES, SPECIES_CELEBI
givemon SPECIES_CELEBI, 100, ITEM_LIFE_ORB, ITEM_CHERISH_BALL, NATURE_TIMID, 0, MON_GENDERLESS, 0, 0, 4, 252, 252, 0, 31, 31, 31, 30, 31, 31, MOVE_ENERGY_BALL, MOVE_PSYCHIC, MOVE_NASTY_PLOT, MOVE_CELEBRATE, TRUE, FALSE, TYPE_PSYCHIC
setflag FLAG_MYSTERY_GIFT_1
call MysteryGift_EventScript_ReceivedMon
releaseall
end
```
Walking through this, it's clear we'll need some more scripting. We first check if Celebi's corresponding Mystery Gift flag has been set, and if it has, we need to tell the player they've already redeemed it and can't again. If they haven't though, we get ourselves setup for the givemon, do the givemon, and set the mystery gift flag. Then we need soem more generic handling to prompt nicknaming and some fanfare.
Two things, then; an event script to handle the case where a mystery gift mon has already been redeemed, and an event script to handle when a mystery gift mon has successfully been received.
Just for the sake of simplicity, I'm going to handle entering a used mystery gift code the same way I'd handle an incorrect code. You're welcome to add more complex scripting if you prefer.
```
MysteryGift_EventScript_Redeemed::
msgbox EnterCode_FailedText, MSGBOX_DEFAULT
releaseall
end
```
And then the scripto handle the player having successfully received a mon:
```
MysteryGift_EventScript_ReceivedMon::
msgbox MysteryGift_Text_SucceededText, MSGBOX_DEFAULT
playfanfare MUS_OBTAIN_ITEM
message MysteryGift_Text_ReceivedGiftMon
waitfanfare
goto_if_eq VAR_RESULT, MON_GIVEN_TO_PARTY, MysteryGift_EventScript_NicknamePartyMon
goto_if_eq VAR_RESULT, MON_GIVEN_TO_PC, MysteryGift_EventScript_NicknamePCMon
goto Common_EventScript_NoMoreRoomForPokemon
msgbox MysteryGift_Text_PleaseVisitAgain, MSGBOX_DEFAULT
end
```
Almost done! Just need to handle the specific nicknaming scripts, and then add all of the text.
```
MysteryGift_EventScript_NicknamePartyMon::
msgbox gText_NicknameThisPokemon, MSGBOX_YESNO
goto_if_eq VAR_RESULT, NO, MysteryGift_EventScript_Exit
call Common_EventScript_GetGiftMonPartySlot
call Common_EventScript_NameReceivedPartyMon
goto MysteryGift_EventScript_Exit
end
MysteryGift_EventScript_NicknamePCMon::
msgbox gText_NicknameThisPokemon, MSGBOX_YESNO
goto_if_eq VAR_RESULT, NO, MysteryGift_EventScript_TransferredToPC
call Common_EventScript_NameReceivedBoxMon
call Common_EventScript_TransferredToPC
releaseall
end
MysteryGift_EventScript_TransferredToPC::
call Common_EventScript_TransferredToPC
releaseall
end
MysteryGift_Text_WelcomeToMysteryGiftSystem:
.string "Hello, {PLAYER}!\p"
.string "Welcome to the Mystery Gift System!\p"
.string "Would you like to enter a code?$"
MysteryGift_Text_CurrentlyUnavailable:
.string "I'm sorry, but the Mystery Gift System\n"
.string "is currently unavailable.\p"
.string "Please try again later.\p"
.string "Thank you!$"
MysteryGift_Text_PleaseVisitAgain:
.string "Please visit again!$"
MysteryGift_Text_EnterCode:
.string "Please enter the code.$"
MysteryGift_Text_SucceededText:
.string "The code was valid!\p"
.string "Enjoy your gift!$"
MysteryGift_Text_FailedText:
.string "The code was invalid!\p"
.string "Would you like to enter a new code?$"
MysteryGift_Text_RedeemedText:
.string "This code was already redeemed!\p"
.string "Would you like you enter a new code?$"
MysteryGift_Text_ReceivedGiftMon:
.string "{PLAYER} received a {STR_VAR_1}!$"
```
Goodness, so much infrastructure scripting! The nice thing is that now that all the infrastructure is set up, much like before, adding new cases becomes really straightforward. With Celebi and all of the skeleton scripting finished, let's add Jirachi.
```
MysteryGift_EventScript_Jirachi::
goto_if_set FLAG_MYSTERY_GIFT_2, MysteryGift_EventScript_Redeemed
bufferspeciesname STR_VAR_1, SPECIES_JIRACHI
setvar VAR_TEMP_TRANSFERRED_SPECIES, SPECIES_JIRACHI
givemon SPECIES_JIRACHI, 100, ITEM_LIFE_ORB, ITEM_CHERISH_BALL, NATURE_ADAMANT, 0, MON_GENDERLESS, 0, 252, 4, 252, 0, 0, 31, 31, 31, 31, 31, 31, MOVE_IRON_HEAD, MOVE_ZEN_HEADBUTT, MOVE_PLAY_ROUGH, MOVE_CELEBRATE, TRUE, FALSE, TYPE_STEEL
setflag FLAG_MYSTERY_GIFT_2
call MysteryGift_EventScript_ReceivedMon
releaseall
end
```
And that's it! Super straightforward from here, just make sure to iterate `FLAG_MYSTERY_GIFT` each time you add a new mon, and of course add their code to both `GetCodeFeedback` and the main script controlling code entry.

View File

@ -70,11 +70,11 @@ If your new Trainer Slide needs to check for beforen initalized, a function is d
```diff
void SetTrainerSlideMessage(enum DifficultyLevel, u32, u32);
void TryInitalizeFirstSTABMoveTrainerSlide(u32, u32, u32);
void TryInitalizeTrainerSlidePlayerLandsFirstCriticalHit(u32);
+ void TryInitalizeTrainerSlideEnemyLandsFirstCriticalHit(u32);
void TryInitalizeTrainerSlidePlayerLandsFirstSuperEffectiveHit(u32);
void TryInitalizeTrainerSlideEnemyMonUnaffected(u32);
void TryInitializeFirstSTABMoveTrainerSlide(u32, u32, u32);
void TryInitializeTrainerSlidePlayerLandsFirstCriticalHit(u32);
+ void TryInitializeTrainerSlideEnemyLandsFirstCriticalHit(u32);
void TryInitializeTrainerSlidePlayerLandsFirstSuperEffectiveHit(u32);
void TryInitializeTrainerSlideEnemyMonUnaffected(u32);
bool32 IsTrainerSlideInitialized(enum TrainerSlideType);
```
### `src/trainer_slide.c`
@ -111,7 +111,7 @@ The function that determines if a Slide should play has different function for m
InitalizeTrainerSlide(slideId);
}
+void TryInitalizeTrainerSlideEnemyLandsFirstCriticalHit(u32 target)
+void TryInitializeTrainerSlideEnemyLandsFirstCriticalHit(u32 target)
+{
+ enum TrainerSlideType slideId = TRAINER_SLIDE_ENEMY_LANDS_FIRST_CRITICAL_HIT;
+
@ -150,13 +150,13 @@ In `BattleTurnPassed`, most Trainer Slides are checked to see if they should run
{
PrepareStringBattle(STRINGID_CRITICALHIT, gBattlerAttacker);
+ TryInitalizeTrainerSlideEnemyLandsFirstCriticalHit(gBattlerTarget);
TryInitalizeTrainerSlidePlayerLandsFirstCriticalHit(gBattlerTarget);
+ TryInitializeTrainerSlideEnemyLandsFirstCriticalHit(gBattlerTarget);
TryInitializeTrainerSlidePlayerLandsFirstCriticalHit(gBattlerTarget);
gBattleCommunication[MSG_DISPLAY] = 1;
```
The actual usage of `TryInitalizeTrainerSlideEnemyLandsFirstCriticalHit` is added and is checked whenever a critical hit is scored.
The actual usage of `TryInitializeTrainerSlideEnemyLandsFirstCriticalHit` is added and is checked whenever a critical hit is scored.
### `test/battle/trainer_slides.c`
```diff

View File

@ -1,178 +0,0 @@
# How to add a new trainer class
## Content
* [Quick Summary](#quick-summary)
* [The Graphics](#the-graphics)
* [1. Edit the sprites](#2-edit-the-sprites)
* [2. Register the sprites](#2-register-the-sprites)
* [3. The Animation](#2-the-animation)
* [4. Connecting pictures to the data](#2-connecting-pictures-to-the-data)
* [The Data](#the-data)
* [5. Defining the trainer class](#2-defining-the-trainer-class)
* [Usage](#usage)
## Quick Summary
(Page contains out of date information, [new instructions for Sprites here](https://github.com/rh-hideout/pokeemerald-expansion/pull/3597).)
If you've done this before and just need a quick lookup, here's what files you need:
1. GFX into [graphics/trainers/front_pics](https://github.com/rh-hideout/pokeemerald-expansion/blob/master/graphics/trainers/front_pics)
2. Palette into [graphics/trainers/palettes](https://github.com/rh-hideout/pokeemerald-expansion/blob/master/graphics/trainers/palettes)
3. Register sprites to [include/graphics.h](https://github.com/rh-hideout/pokeemerald-expansion/blob/master/include/graphics.h)
4. Point game to where graphic files are found: [src/data/graphics/trainers](https://github.com/rh-hideout/pokeemerald-expansion/blob/master/src/data/graphics/trainers.h)
5. Add animation to: [src/data/trainer_graphics/front_pic_anims.h](https://github.com/rh-hideout/pokeemerald-expansion/blob/master/src/data/trainer_graphics/front_pic_anims.h)
6. Add the trainer to all three structs in: [src/data/trainer_graphics/front_pic_table.h](https://github.com/rh-hideout/pokeemerald-expansion/blob/master/src/data/trainer_graphics/front_pic_table.h)
7. Add trainer to [include/constants/trainers.h](https://github.com/rh-hideout/pokeemerald-expansion/blob/master/include/constants/trainers.h)
## The Graphics
### 1. Edit the sprites
We will start with a graphic that we want to use for our new trainer class. Unlike with adding Pokémon, the trainer sprites aren't sorted in individual folders, but rather in one folder:
[graphics/trainers/front_pics](https://github.com/rh-hideout/pokeemerald-expansion/blob/master/graphics/trainers/front_pics)
**Remember to limit yourself to 16 colors including transparency in the first slot!**
Export the pallette and place into the same folder.
### 2. Register the sprites
Sadly, just putting the image files into the graphics folder is not enough. To use the sprites we have to register them, which is kind of tedious. First, create constants for the file paths.
Edit [include/graphics.h](https://github.com/rh-hideout/pokeemerald-expansion/blob/master/include/graphics.h):
```diff
extern const u32 gTrainerFrontPic_RubySapphireMay[];
+ extern const u32 gTrainerFrontPic_myTrainerClass[];
extern const u32 gTrainerPalette_Hiker[];
...
...
extern const u32 gTrainerPalette_RubySapphireMay[];
+ extern const u32 gTrainerPalette_myTrainerClass[];
extern const u8 gTrainerBackPic_Brendan[];
```
Now link the graphic files.
[src/data/graphics/trainers](https://github.com/rh-hideout/pokeemerald-expansion/blob/master/src/data/graphics/trainers.h):
```diff
const u32 gTrainerPalette_RubySapphireBrendan[] = INCBIN_U32("graphics/trainers/palettes/ruby_sapphire_brendan.gbapal.lz");
const u32 gTrainerFrontPic_RubySapphireMay[] = INCBIN_U32("graphics/trainers/front_pics/ruby_sapphire_may_front_pic.4bpp.lz");
const u32 gTrainerPalette_RubySapphireMay[] = INCBIN_U32("graphics/trainers/palettes/ruby_sapphire_may.gbapal.lz");
+ const u32 gTrainerFrontPic_Sheriff[] = INCBIN_U32("graphics/trainers/front_pics/myTrainerClass_front_pic.4bpp.lz");
+ const u32 gTrainerPalette_Sheriff[] = INCBIN_U32("graphics/trainers/palettes/myTrainerClass.gbapal.lz");
const u8 gTrainerBackPic_Brendan[] = INCBIN_U8("graphics/trainers/back_pics/brendan_back_pic.4
```
### 3. The Animation
Add the Animation of the trainer here:
[src/data/trainer_graphics/front_pic_anims.h](https://github.com/rh-hideout/pokeemerald-expansion/blob/master/src/data/trainer_graphics/front_pic_anims.h)
The trainers don't really move, but in theory they could, it's just that the animation defined for each trainer just shows one frame:
```diff
static const union AnimCmd *const sAnims_RubySapphireMay[] ={
sAnim_GeneralFrame0,
};
+ static const union AnimCmd *const sAnims_MyTrainerClass[] ={
+ sAnim_GeneralFrame0,
+ };
const union AnimCmd *const *const gTrainerFrontAnimsPtrTable[] =
{
[TRAINER_PIC_HIKER] = sAnims_Hiker,
[TRAINER_PIC_AQUA_GRUNT_M] = sAnims_AquaGruntM,
[TRAINER_PIC_POKEMON_BREEDER_F] = sAnims_PokemonBreederF,
...
...
[TRAINER_PIC_RS_BRENDAN] = sAnims_RubySapphireBrendan,
[TRAINER_PIC_RS_MAY] = sAnims_RubySapphireMay,
+ [TRAINER_PIC_MYTRAINERCLASS] = sAnims_MyTrainerClass,
};
```
### 4. Connecting the Pictures to the Data
The last few things we have to do is prepare the graphics for usage. In [src/data/trainer_graphics/front_pic_table.h](https://github.com/rh-hideout/pokeemerald-expansion/blob/master/src/data/trainer_graphics/front_pic_table.h) you'll find the structs, we need to add the trainer to all of these. You can just copy the last trainer type defined and edit it, but as far as I understand, these are what they do:
1. gTrainerFrontPicCoords: Pretty self explanatory. Coordinates like size and offset on the y-axis to position the sprite on screen.
2. gTrainerFrontPicTable: Connects the trainer type with the image we defined earlier.
3. gTrainerFrontPicPaletteTable: Connects the trainer type with the palette we defined earlier.
So, finally, it needs to look like this:
```diff
const struct MonCoords gTrainerFrontPicCoords[] =
{
[TRAINER_PIC_HIKER] = {.size = 8, .y_offset = 1},
[TRAINER_PIC_AQUA_GRUNT_M] = {.size = 8, .y_offset = 1},
...
...
[TRAINER_PIC_RS_BRENDAN] = {.size = 8, .y_offset = 1},
[TRAINER_PIC_RS_MAY] = {.size = 8, .y_offset = 1},
+ [TRAINER_PIC_MYTRAINERCLASS] = {.size = 8, .y_offset = 1},
};
#define TRAINER_SPRITE(trainerPic, sprite, size) [TRAINER_PIC_##trainerPic] = {sprite, size, TRAINER_PIC_##trainerPic}
const struct CompressedSpriteSheet gTrainerFrontPicTable[] =
{
TRAINER_SPRITE(HIKER, gTrainerFrontPic_Hiker, 0x800),
TRAINER_SPRITE(AQUA_GRUNT_M, gTrainerFrontPic_AquaGruntM, 0x800),
TRAINER_SPRITE(POKEMON_BREEDER_F, gTrainerFrontPic_PokemonBreederF, 0x800),
TRAINER_SPRITE(COOLTRAINER_M, gTrainerFrontPic_CoolTrainerM, 0x800),
...
...
TRAINER_SPRITE(RS_BRENDAN, gTrainerFrontPic_RubySapphireBrendan, 0x800),
TRAINER_SPRITE(RS_MAY, gTrainerFrontPic_RubySapphireMay, 0x800),
+ TRAINER_SPRITE(MYTRAINERCLASS, gTrainerFrontPic_MyTrainerClass, 0x800),
};
#define TRAINER_PAL(trainerPic, pal) [TRAINER_PIC_##trainerPic] = {pal, TRAINER_PIC_##trainerPic}
const struct CompressedSpritePalette gTrainerFrontPicPaletteTable[] =
{
TRAINER_PAL(HIKER, gTrainerPalette_Hiker),
TRAINER_PAL(AQUA_GRUNT_M, gTrainerPalette_AquaGruntM),
TRAINER_PAL(POKEMON_BREEDER_F, gTrainerPalette_PokemonBreederF),
...
...
TRAINER_PAL(RS_BRENDAN, gTrainerPalette_RubySapphireBrendan),
TRAINER_PAL(RS_MAY, gTrainerPalette_RubySapphireMay),
+ TRAINER_PAL(MYTRAINERCLASS, gTrainerPalette_MyTrainerClass),
};
```
### The Data
#### 5. Defining the trainer class
Finally, let's bring it all together by defining our new trainer class in [include/constants/trainers.h](https://github.com/rh-hideout/pokeemerald-expansion/blob/master/include/constants/trainers.h):
```diff
#define TRAINER_PIC_RS_MAY 92
+ #define TRAINER_PIC_MYTRAINERCLASS 93
#define TRAINER_BACK_PIC_BRENDAN 0
#define TRAINER_BACK_PIC_MAY 1
```
Remember to count the number next to the trainer class up by one!
## Usage
You can test your trainer type by going to [src/data/trainers](https://github.com/rh-hideout/pokeemerald-expansion/blob/master/src/data/trainers.h) and changing a trainer type. For example:
```diff
[TRAINER_BRENDAN_PLACEHOLDER] =
{
.partyFlags = 0,
.trainerClass = TRAINER_CLASS_RS_PROTAG,
.encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE,
- .trainerPic = TRAINER_PIC_RS_BRENDAN,
+ .trainerPic = TRAINER_PIC_MYTRAINERCLASS,
.trainerName = _("BRENDAN"),
.items = {},
.doubleBattle = FALSE,
.aiFlags = 0,
.partySize = ARRAY_COUNT(sParty_BrendanLinkPlaceholder),
.party = {.NoItemDefaultMoves = sParty_BrendanLinkPlaceholder},
},
```

View File

@ -0,0 +1,122 @@
# How to use Trainer Party Pools
Trainer Party Pools (TPP) is a way to introduce a bit of unpredictability to trainer battles by allowing trainer to generate parties from pools defined by the user.
The maximum number of mons that can be in a single trainer's pool is 255.
## Turning on TPP with `trainer.sparty`
To use TPP with `trainers.party`, all that's needed is to define a `Party Size` that's smaller than than the number of defined mons for the trainer.
## Turning on TPP with `trainers.h`
To use TPP with `trainers.h`, the trainer need to have the `.poolSize` field set to a value that's larger than the `.partySize` and equal to the number of mons defined in the trainer.
## How the pool works
When generating a party for a trainer with a pool, the party is picked from the pool randomly according to rules set for the pool and tags assigned to individual mons in the pool.
### Pool Rules
Pool rules are defined in `src/data/battle_pool_rules.h`. To begin with some default pools are defined, `defaultPoolRules` which any trainer that doesn't otherwise have a specified pool ruleset uses, and some custom rules for common scenarios.
- `POOL_RULESET_BASIC`, a ruleset that will pick a mon from the pool with the tag `MON_POOL_TAG_LEAD` if possible to put in the first slot and `MON_POOL_TAG_ACE` in the last slot, and not pick mons with those tags for any other position.
- `POOL_RULESET_DOUBLES`, a ruleset that will pick up to two mons from the pool with the tag `MON_POOL_TAG_LEAD` if possible to put in the first two slots and `MON_POOL_TAG_ACE` in the last two slots, and not pick mons with those tags for any other position.
- `POOL_RULESET_WEATHER_SINGLES`, a ruleset that will pick at most one mon with the tag `MON_POOL_TAG_WEATHER_SETTER` if possible, and at least one mon with the tag `MON_POOL_TAG_WEATHER_ABUSER` if possible, in addition to the same conditions as `POOL_RULESET_BASIC`.
- `POOL_RULESET_WEATHER_DOUBLES`, a ruleset that will pick at most one mon with the tag `MON_POOL_TAG_WEATHER_SETTER` if possible, and at least one mon with the tag `MON_POOL_TAG_WEATHER_ABUSER` if possible, in addition to the same conditions as `POOL_RULESET_DOUBLES`.
- `POOL_RULESET_SUPPORT_DOUBLES`, a ruleset that will pick at most one mon with the tag `MON_POOL_TAG_SUPPORT` if possible, in addition to the same conditions as `POOL_RULESET_DOUBLES`.
All these pools also have the options `.speciesClause`, `.excludeForms`, `.itemClause` and `.itemClauseExclusions` set to the values defined in `include/config/battle.h` under `B_POOL_RULE_<rule>`.
- `.speciesClause` if set to `TRUE` means that the same exact species as defined by `.species` can't be picked twice for the party from the pool.
- `.excludeForms` if set to `FALSE` means that the same exact species as defined by NetDex number can't be picked twice for the party from the pool.
- `.itemClause` if set to `TRUE` means that pokemon with the same held item can't be picked twice for the party from the pool.
- `.itemClauseExclusions` if set to `TRUE` means that multiple pokemon with the same item can be picked for the party if the item is listed in `poolItemClauseExclusions`. By default `ITEM_ORAN_BERRY` and `ITEM_SITRUS_BERRY` are the only items in the list of exclusions.
Individual tags can have rules which change how they're included.
By setting the `.tagMaxMembers[POOL_TAG_<tag>]` field to a number, only that many mons with that tag will at max be part of the party, or if set to `POOL_MEMBER_COUNT_NONE` no mons with this tag will be included, and if set to `POOL_MEMBER_COUNT_UNLIMITED` no restrictions on the number of mons with the tag will apply.
By setting `.tagRequired[POOL_TAG_<tag>]` option field to `TRUE`, this tag will be picked before any tags that are not required, after the tag has been picked for the pool it will be set to `FALSE` for that tag.
The tags `Lead` and `Ace` has special handling where they will be picked for the first or last party position respectively.
### Tags
There are currently 8 tags specified in the TPP implementation, `Lead`, `Ace`, `Weather Setter`, `Weather Abuser`, `Support`, `Tag 5`, `Tag 6` and `Tag 7`.
If using `trainers.party`, these tags are applied to mons with the field `Tags: `, separated by `/`. Example `Tags: Lead / Weather Setter`
If using `trainers.h`, these tags are applied to mons with the field `.tags`, separated by `|`. Example: `.tags = MON_POOL_TAG_LEAD | MON_POOL_TAG_WEATHER_SETTER`
Pokemon can have up to 32 different tags, but anything beyond the 8 initial tags has to be implemented. The numbered tags can be renamed too to better signify their purpose for developers.
## Trainer options
A few more trainer options are introduced in order to further customize how the pool picking process works.
- `Pool Pick Functions` (`.poolPickIndex`) controls which functons are used to pick mons from the pool, they're split into Lead, Ace, and Other.
By default, only `Default<position>PickFunction` and `PickLowest` are implemented. Must be an `enum` value in `enum PoolPickFunctions`.
- `Pool Prune` (`.poolPruneIndex`) controls if members in the pool should be removed before party members are picked from the pool.
By default, only `POOL_PRUNE_NONE`, which doesn't remove anything from the pool, and `POOL_PRUNE_TEST`, which removes Wobbuffet from the pool, are implemented. Must be an `enum` value in `enum PoolPruneOptions`.
## Example pool
```
=== TRAINER_TIANA ===
Name: TIANA
Class: Lass
Pic: Lass
Gender: Female
Music: Female
Double Battle: Yes
AI: Check Bad Move
Party Size: 4
Pool Rules: Weather Doubles
Pool Pick Index: Default
Zigzagoon
Level: 4
IVs: 0 HP / 0 Atk / 0 Def / 0 SpA / 0 SpD / 0 Spe
Shroomish
Level: 4
IVs: 0 HP / 0 Atk / 0 Def / 0 SpA / 0 SpD / 0 Spe
Psyduck
Level: 4
IVs: 0 HP / 0 Atk / 0 Def / 0 SpA / 0 SpD / 0 Spe
Shellder
Level: 4
IVs: 0 HP / 0 Atk / 0 Def / 0 SpA / 0 SpD / 0 Spe
Mew
Level: 4
IVs: 0 HP / 0 Atk / 0 Def / 0 SpA / 0 SpD / 0 Spe
Tags: Ace
Giratina
Level: 4
IVs: 0 HP / 0 Atk / 0 Def / 0 SpA / 0 SpD / 0 Spe
Tags: Ace
Vulpix
Ability: Drought
Level: 4
Tags: Lead / Weather Setter
Torkoal
Ability: Drought
Level: 4
Tags: Lead / Weather Setter
Bulbasaur
Ability: Chlorophyll
Level: 4
Tags: Lead / Weather Abuser
Cherrim
Level: 4
Tags: Lead / Weather Abuser
```
Here Tiana has been given a pool that's set up for a double battle with weather. Using the default pool rule `Weather Doubles` it will only pick one of each of the weather setters and abusers which Tiana will lead with. Tiana will also pick either Mew or Giratina as her Ace mon, and the last slot will be filled with one of Zigzagoon, Shroomish, Psyduck or Shellder.
## Pool settings
If no pool rule is specified in the trainer, the default rules will be used, which sets rules according to some defaults from `include/config/battle.h`.
This file also has settings for other pool options.
- `B_POOL_SETTING_CONSISTENT_RNG`, `TRUE` or `FALSE`, the party generated will always be the same on a particular save (RNG dependant on trainerId and encountered trainer).
- `B_POOL_SETTING_USE_FIXED_SEED`, `TRUE` or `FALSE`, the party generated will always be the same on a particular compiled ROM (RNG dependant on a chosen seed and encountered trainer).
- `B_POOL_SETTING_FIXED_SEED`, seed to use for fixed seed, does nothing if `B_POOL_SETTING_USE_FIXED_SEED` is `FALSE`.

View File

@ -0,0 +1,98 @@
# How to add a new trainer pic
## Content
* [Quick Summary](#quick-summary)
* [The Graphics](#the-graphics)
* [1. Edit the sprites](#2-edit-the-sprites)
* [2. Register the sprites](#2-register-the-sprites)
* [3. Connecting pictures to the data](#2-connecting-pictures-to-the-data)
* [The Data](#the-data)
* [4. Defining the trainer pic](#2-defining-the-trainer-pic)
* [Usage](#usage)
## Quick Summary
If you've done this before and just need a quick lookup, here's what files you need:
1. GFX into [graphics/trainers/front_pics](https://github.com/rh-hideout/pokeemerald-expansion/blob/master/graphics/trainers/front_pics)
2. Palette into [graphics/trainers/palettes](https://github.com/rh-hideout/pokeemerald-expansion/blob/master/graphics/trainers/palettes)
3. Point game to where graphic files are found: [src/data/graphics/trainers](https://github.com/rh-hideout/pokeemerald-expansion/blob/master/src/data/graphics/trainers.h)
4. Add trainer to [include/constants/trainers.h](https://github.com/rh-hideout/pokeemerald-expansion/blob/master/include/constants/trainers.h)
## The Graphics
### 1. Edit the sprites
We will start with a graphic that we want to use for our new trainer pic. Unlike with adding Pokémon, the trainer sprites aren't sorted in individual folders, but rather in one folder:
[graphics/trainers/front_pics](https://github.com/rh-hideout/pokeemerald-expansion/blob/master/graphics/trainers/front_pics)
**Remember to limit yourself to 16 colors including transparency in the first slot!**
Export the palette and place into the same folder.
### 2. Register the sprites
Sadly, just putting the image files into the graphics folder is not enough. To use the sprites we have to register them by linking the graphic files.
[src/data/graphics/trainers](https://github.com/rh-hideout/pokeemerald-expansion/blob/master/src/data/graphics/trainers.h):
```diff
const u32 gTrainerPalette_RubySapphireBrendan[] = INCBIN_U32("graphics/trainers/palettes/ruby_sapphire_brendan.gbapal.lz");
const u32 gTrainerFrontPic_RubySapphireMay[] = INCBIN_U32("graphics/trainers/front_pics/ruby_sapphire.4bpp.lz");
const u32 gTrainerPalette_RubySapphireMay[] = INCBIN_U32("graphics/trainers/palettes/ruby_sapphire_may.gbapal.lz");
+ const u32 gTrainerFrontPic_myTrainerClass[] = INCBIN_U32("graphics/trainers/front_pics/myTrainerClass.4bpp.lz");
+ const u32 gTrainerPalette_myTrainerClass[] = INCBIN_U32("graphics/trainers/palettes/myTrainerClass.gbapal.lz");
const u8 gTrainerBackPic_Brendan[] = INCBIN_U8("graphics/trainers/back_pics/brendan.4bpp");
```
### 3. Connecting the Pictures to the Data
The last few things we have to do is prepare the graphics for usage. In [src/data/graphics/trainers.h](https://github.com/rh-hideout/pokeemerald-expansion/blob/master/src/data/graphics/trainers.h) you'll find the gTrainerSprites struct, we need to add the trainer to this. You can just copy the last trainer type defined and edit it, but this is what it does: Connects the trainer type with the image we defined earlier.
So, finally, it needs to look like this:
```diff
define TRAINER_SPRITE(trainerPic, picFile, paletteFile, ...) \
[trainerPic] = \
{ \
.frontPic = {picFile, TRAINER_PIC_SIZE, trainerPic}, \
.palette = {paletteFile, trainerPic}, \
.mugshotCoords = {DEFAULT(0, __VA_ARGS__), DEFAULT_2(0, __VA_ARGS__)}, \
.mugshotRotation = DEFAULT_3(0x200, __VA_ARGS__), \
}
const struct TrainerSprite gTrainerSprites[] =
{
TRAINER_SPRITE(TRAINER_PIC_HIKER, gTrainerFrontPic_Hiker, gTrainerPalette_Hiker),
TRAINER_SPRITE(TRAINER_PIC_AQUA_GRUNT_M, gTrainerFrontPic_AquaGruntM, gTrainerPalette_AquaGruntM),
...
TRAINER_SPRITE(TRAINER_PIC_RS_MAY, gTrainerFrontPic_RubySapphireMay, gTrainerPalette_RubySapphireMay),
TRAINER_SPRITE(TRAINER_PIC_MY_TRAINER_CLASS, gTrainerFrontPic_myTrainerClass, gTrainerPalette_myTrainerClass)
};
```
### The Data
#### 4. Defining the trainer pic
Finally, let's bring it all together by defining our new trainer pic in [include/constants/trainers.h](https://github.com/rh-hideout/pokeemerald-expansion/blob/master/include/constants/trainers.h):
```diff
#define TRAINER_PIC_RS_MAY 92
+ #define TRAINER_PIC_MY_TRAINER_CLASS 93
#define TRAINER_BACK_PIC_BRENDAN 0
#define TRAINER_BACK_PIC_MAY 1
```
Remember to count the number next to the trainer pic up by one!
## Usage
You can test your trainer type by going to [src/data/trainers](https://github.com/rh-hideout/pokeemerald-expansion/blob/master/src/data/trainers.h) and changing a trainer type. For example:
```diff
[TRAINER_BRENDAN_PLACEHOLDER] =
{
.partyFlags = 0,
.trainerClass = TRAINER_CLASS_RS_PROTAG,
.encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE,
- .trainerPic = TRAINER_PIC_RS_BRENDAN,
+ .trainerPic = TRAINER_PIC_MY_TRAINER_CLASS,
.trainerName = _("BRENDAN"),
.items = {},
.doubleBattle = FALSE,
.aiFlags = 0,
.partySize = ARRAY_COUNT(sParty_BrendanLinkPlaceholder),
.party = {.NoItemDefaultMoves = sParty_BrendanLinkPlaceholder},
},
```

Binary file not shown.

After

Width:  |  Height:  |  Size: 239 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 300 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 291 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 295 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 KiB

View File

@ -0,0 +1,19 @@
JASC-PAL
0100
16
136 245 178
48 72 56
48 120 64
50 86 102
80 80 80
122 122 122
48 152 72
120 120 152
0 0 0
160 168 200
192 136 208
184 192 208
156 233 255
216 216 232
201 255 255
232 232 248

View File

@ -0,0 +1,19 @@
JASC-PAL
0100
16
136 245 178
41 66 79
26 113 141
50 86 102
80 80 80
122 122 122
16 141 183
120 120 152
0 0 0
160 168 200
192 136 208
184 192 208
156 233 255
216 216 232
201 255 255
232 232 248

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

View File

@ -0,0 +1,19 @@
JASC-PAL
0100
16
136 245 178
40 48 64
64 72 88
64 72 96
128 32 32
96 104 128
120 128 160
0 0 0
176 184 200
208 216 232
232 232 248
96 104 128
120 128 160
40 48 64
0 0 0
0 0 0

View File

@ -0,0 +1,19 @@
JASC-PAL
0100
16
136 245 178
72 32 40
124 38 38
64 72 96
128 32 32
192 56 56
240 88 88
0 0 0
176 184 200
208 216 232
232 232 248
96 104 128
120 128 160
40 48 64
0 0 0
0 0 0

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

View File

@ -0,0 +1,19 @@
JASC-PAL
0100
16
136 245 178
62 62 62
96 16 16
92 92 92
72 64 96
122 122 122
128 88 128
128 112 176
0 0 0
144 136 200
184 136 192
176 176 224
200 200 208
232 232 248
0 0 0
0 0 0

View File

@ -0,0 +1,19 @@
JASC-PAL
0100
16
136 245 178
62 62 62
96 16 16
92 92 92
72 64 96
122 122 122
79 76 138
169 112 176
0 0 0
186 136 200
112 116 222
208 176 224
200 200 208
232 232 248
0 0 0
0 0 0

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

View File

@ -0,0 +1,19 @@
JASC-PAL
0100
16
179 226 255
48 40 56
72 64 80
104 96 112
97 97 120
97 108 120
208 88 88
64 96 128
104 144 200
128 128 144
153 153 174
176 176 192
0 0 0
208 208 216
232 232 248
104 96 112

View File

@ -0,0 +1,19 @@
JASC-PAL
0100
16
179 226 255
16 56 48
32 88 88
48 128 120
120 110 97
120 99 97
208 88 88
64 96 128
208 88 88
64 167 157
174 164 153
192 185 176
0 0 0
216 212 208
248 241 232
108 105 100

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

View File

@ -0,0 +1,19 @@
JASC-PAL
0100
16
179 226 255
37 37 40
71 42 23
111 79 63
93 93 99
144 120 56
201 65 59
144 109 96
216 168 48
248 216 96
176 176 184
176 176 188
0 0 0
232 232 248
0 0 0
0 0 0

View File

@ -0,0 +1,19 @@
JASC-PAL
0100
16
179 226 255
37 37 40
71 42 23
142 72 100
93 93 99
144 120 56
201 65 59
193 103 130
216 168 48
248 216 96
176 176 184
176 176 188
0 0 0
232 232 248
0 0 0
0 0 0

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 KiB

View File

@ -0,0 +1,19 @@
JASC-PAL
0100
16
136 245 178
0 32 96
0 64 104
72 80 104
40 104 152
40 128 168
112 128 144
64 168 216
96 192 232
0 0 0
168 176 192
208 224 232
248 248 248
0 0 0
0 0 0
0 0 0

View File

@ -0,0 +1,19 @@
JASC-PAL
0100
16
136 245 178
77 96 16
104 95 18
72 80 104
151 146 55
167 149 58
112 128 144
215 194 85
231 209 115
0 0 0
168 176 192
208 224 232
248 248 248
0 0 0
0 0 0
0 0 0

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

View File

@ -0,0 +1,19 @@
JASC-PAL
0100
16
179 226 255
104 88 8
48 56 64
80 96 112
128 24 8
184 56 16
240 88 80
152 128 24
200 160 32
240 208 88
112 128 152
136 152 176
184 200 224
0 0 0
232 232 248
0 0 0

View File

@ -0,0 +1,19 @@
JASC-PAL
0100
16
179 226 255
98 43 91
48 56 64
80 96 112
8 62 128
16 74 184
80 165 240
147 75 141
187 98 185
226 161 225
112 128 152
136 152 176
184 200 224
0 0 0
232 232 248
0 0 0

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

View File

@ -0,0 +1,19 @@
JASC-PAL
0100
16
136 245 178
112 64 72
128 88 24
184 144 24
216 192 72
226 115 139
209 165 186
0 0 0
248 224 136
240 202 222
248 228 238
248 248 248
0 0 0
0 0 0
0 0 0
0 0 0

View File

@ -0,0 +1,19 @@
JASC-PAL
0100
16
136 245 178
112 64 104
128 88 24
184 144 24
216 192 72
184 144 24
209 165 186
0 0 0
248 224 136
233 202 240
245 228 248
248 248 248
0 0 0
0 0 0
0 0 0
0 0 0

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

View File

@ -0,0 +1,19 @@
JASC-PAL
0100
16
179 226 255
44 36 58
72 56 16
120 96 24
71 58 87
100 87 115
160 128 40
200 160 48
178 90 154
135 115 144
213 106 188
243 120 219
0 0 0
0 0 0
0 0 0
0 0 0

View File

@ -0,0 +1,19 @@
JASC-PAL
0100
16
179 226 255
32 59 58
72 56 16
120 96 24
52 85 89
81 114 117
160 128 40
200 160 48
178 90 154
109 135 146
213 106 188
243 120 219
0 0 0
0 0 0
0 0 0
0 0 0

Binary file not shown.

After

Width:  |  Height:  |  Size: 944 B

View File

@ -0,0 +1,19 @@
JASC-PAL
0100
16
179 226 255
51 49 47
51 50 47
104 80 40
80 80 80
192 40 64
183 143 49
245 202 48
144 144 144
154 152 145
245 231 171
0 0 0
192 192 192
210 220 221
232 232 248
255 255 255

View File

@ -0,0 +1,19 @@
JASC-PAL
0100
16
179 226 255
51 49 47
51 50 47
69 104 42
80 80 80
44 81 173
100 183 54
107 245 56
144 144 144
154 152 145
245 231 171
0 0 0
192 192 192
210 220 221
232 232 248
255 255 255

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

View File

@ -0,0 +1,19 @@
JASC-PAL
0100
16
136 245 178
72 40 8
48 56 88
80 80 80
160 8 48
128 80 8
176 112 24
152 136 80
200 168 80
240 200 80
64 120 216
112 152 224
136 136 136
184 184 184
0 0 0
232 232 248

View File

@ -0,0 +1,19 @@
JASC-PAL
0100
16
136 245 178
56 67 11
66 56 79
80 80 80
160 8 48
86 118 14
128 165 32
152 136 80
200 168 80
240 200 80
120 96 184
154 135 200
136 136 136
184 184 184
0 0 0
232 232 248

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

View File

@ -0,0 +1,19 @@
JASC-PAL
0100
16
179 226 255
97 21 7
114 42 38
78 78 78
112 88 64
176 38 38
219 60 53
238 122 36
237 106 99
176 128 80
208 184 88
248 208 80
32 96 184
240 224 152
255 242 183
0 0 0

View File

@ -0,0 +1,19 @@
JASC-PAL
0100
16
179 226 255
97 48 7
114 42 38
78 78 78
112 88 64
176 80 38
219 110 53
238 122 36
237 148 99
176 128 80
208 184 88
248 208 80
32 96 184
240 224 152
255 242 183
0 0 0

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

View File

@ -0,0 +1,19 @@
JASC-PAL
0100
16
179 226 255
32 37 41
88 32 32
48 56 64
96 85 64
88 96 96
178 53 27
213 77 26
227 111 51
128 112 80
217 132 42
235 192 61
160 152 120
192 184 152
0 0 0
248 248 248

View File

@ -0,0 +1,19 @@
JASC-PAL
0100
16
179 226 255
32 37 41
57 57 62
48 56 64
96 85 64
88 96 96
96 94 118
213 77 26
142 134 159
128 112 80
217 132 42
235 192 61
160 152 120
192 184 152
0 0 0
248 248 248

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

View File

@ -0,0 +1,19 @@
JASC-PAL
0100
16
136 245 178
30 31 36
80 29 52
126 40 64
74 78 90
91 94 103
107 109 115
40 96 142
74 132 189
57 173 255
126 178 213
160 160 160
0 0 0
149 209 241
165 231 255
216 216 248

View File

@ -0,0 +1,19 @@
JASC-PAL
0100
16
136 245 178
30 31 36
80 29 52
126 40 64
45 83 75
62 116 105
71 136 123
142 40 54
189 74 84
57 173 255
126 178 213
160 160 160
0 0 0
149 209 241
165 231 255
216 216 248

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

View File

@ -0,0 +1,19 @@
JASC-PAL
0100
16
179 226 255
96 48 0
96 64 0
40 72 88
192 16 32
144 64 32
200 88 40
248 120 56
248 184 16
216 168 48
240 208 112
64 128 128
160 160 160
0 0 0
216 216 248
0 0 0

View File

@ -0,0 +1,19 @@
JASC-PAL
0100
16
179 226 255
53 34 65
77 76 80
118 33 45
192 16 32
86 72 106
115 96 142
146 122 178
248 184 16
163 161 167
196 194 199
160 61 70
160 160 160
0 0 0
216 216 248
0 0 0

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

View File

@ -0,0 +1,19 @@
JASC-PAL
0100
16
179 226 255
45 46 58
75 77 101
167 41 91
198 152 98
116 120 150
217 95 170
182 166 178
227 199 137
242 154 218
0 0 0
225 213 222
0 0 0
0 0 0
0 0 0
0 0 0

View File

@ -0,0 +1,19 @@
JASC-PAL
0100
16
179 226 255
45 46 58
144 36 77
161 42 109
198 152 98
116 120 150
217 100 143
211 127 159
227 199 137
243 148 184
0 0 0
255 177 207
0 0 0
0 0 0
0 0 0
0 0 0

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 891 B

View File

@ -8,7 +8,7 @@ JASC-PAL
16 16 16
81 96 101
226 157 109
253 248 236
242 211 111
118 138 154
149 163 164
8 36 82

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

View File

@ -0,0 +1,19 @@
JASC-PAL
0100
16
179 226 255
88 22 39
0 72 16
24 104 96
72 72 80
128 32 56
184 48 72
222 65 90
24 144 48
48 176 64
23 175 192
104 200 224
136 136 152
0 0 0
208 208 224
232 232 248

View File

@ -0,0 +1,19 @@
JASC-PAL
0100
16
179 226 255
110 43 28
0 37 72
54 69 73
72 72 80
174 69 44
229 114 66
242 135 82
24 88 144
48 125 176
87 112 128
149 164 178
136 136 152
0 0 0
208 208 224
232 232 248

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

View File

@ -0,0 +1,19 @@
JASC-PAL
0100
16
136 245 178
48 48 80
72 80 120
104 104 104
128 48 16
184 64 24
192 152 0
248 224 8
96 112 160
120 152 200
168 168 168
0 0 0
232 232 248
0 0 0
0 0 0
0 0 0

View File

@ -0,0 +1,19 @@
JASC-PAL
0100
16
136 245 178
80 48 73
120 72 118
104 104 104
122 35 93
177 52 139
192 152 0
248 224 8
157 96 160
185 120 200
168 168 168
0 0 0
232 232 248
0 0 0
0 0 0
0 0 0

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

View File

@ -0,0 +1,19 @@
JASC-PAL
0100
16
179 226 255
16 64 32
72 72 80
128 32 56
184 48 72
240 104 104
40 128 56
72 176 88
104 200 128
128 128 144
168 168 176
0 0 0
200 200 216
232 232 248
200 200 216
168 168 176

View File

@ -0,0 +1,19 @@
JASC-PAL
0100
16
179 226 255
48 64 80
48 48 48
152 96 48
216 136 64
240 176 80
72 166 198
122 207 217
158 217 241
128 128 144
208 192 216
0 0 0
232 216 248
248 248 248
96 104 120
48 64 80

Binary file not shown.

After

Width:  |  Height:  |  Size: 947 B

View File

@ -0,0 +1,19 @@
JASC-PAL
0100
16
179 226 255
57 42 72
87 59 107
96 66 116
200 16 40
179 124 91
213 83 98
230 160 26
158 81 143
130 97 153
221 97 170
177 155 189
0 0 0
216 202 224
0 0 0
0 0 0

View File

@ -0,0 +1,19 @@
JASC-PAL
0100
16
179 226 255
108 108 108
147 147 147
178 178 178
200 16 40
179 124 91
75 75 75
230 160 26
224 139 211
231 231 231
251 159 231
205 183 216
0 0 0
236 226 241
0 0 0
0 0 0

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

View File

@ -0,0 +1,19 @@
JASC-PAL
0100
16
179 226 255
29 29 33
40 40 56
57 57 65
34 82 113
86 86 90
80 80 96
218 21 21
112 120 136
40 129 192
98 189 238
152 160 176
169 175 188
0 0 0
215 221 220
197 205 230

View File

@ -0,0 +1,19 @@
JASC-PAL
0100
16
179 226 255
29 29 33
40 40 56
57 57 65
34 82 113
86 86 90
80 80 96
218 21 21
112 120 136
186 98 71
98 189 238
152 160 176
169 175 188
0 0 0
215 221 220
197 205 230

Some files were not shown because too many files have changed in this diff Show More