Merge branch '_RHH/upcoming' into _RHH/pr/upcoming/lighting-expansion-v2
@ -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
|
||||
|
||||
@ -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
|
||||
|
||||
3
.github/ISSUE_TEMPLATE/04_other_errors.yaml
vendored
@ -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
@ -41,3 +41,7 @@ prefabs.json
|
||||
/pokeemerald-*.png
|
||||
src/data/map_group_count.h
|
||||
tools/trainerproc/trainerproc
|
||||
*.Identifier
|
||||
*.smol
|
||||
*.fastSmol
|
||||
*.smolTM
|
||||
|
||||
@ -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
@ -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)
|
||||
@ -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.
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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
|
||||
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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"
|
||||
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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!$"
|
||||
|
||||
@ -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
|
||||
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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
|
||||
|
||||
@ -561,3 +561,5 @@ gSpecials::
|
||||
def_special Script_GetChosenMonOffensiveIVs
|
||||
def_special Script_GetChosenMonDefensiveIVs
|
||||
def_special UseBlankMessageToCancelPokemonPic
|
||||
def_special EnterCode
|
||||
def_special GetCodeFeedback
|
||||
|
||||
@ -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"
|
||||
|
||||
@ -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]()
|
||||
|
||||
143
docs/changelogs/1.10.x/1.10.2.md
Normal 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.-->
|
||||
395
docs/tutorials/how_to_code_entry.md
Normal 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.
|
||||
@ -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
|
||||
|
||||
@ -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},
|
||||
},
|
||||
```
|
||||
122
docs/tutorials/how_to_trainer_party_pool.md
Normal 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`.
|
||||
98
docs/tutorials/how_to_trainer_pic.md
Normal 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},
|
||||
},
|
||||
```
|
||||
BIN
graphics/battle_anims/sprites/salt_particle.png
Normal file
|
After Width: | Height: | Size: 239 B |
BIN
graphics/battle_anims/sprites/starstorm_beam.png
Normal file
|
After Width: | Height: | Size: 300 B |
BIN
graphics/battle_interface/move_info_window_l.png
Normal file
|
After Width: | Height: | Size: 291 B |
BIN
graphics/battle_interface/move_info_window_r.png
Normal file
|
After Width: | Height: | Size: 295 B |
BIN
graphics/pokemon/abomasnow/mega/overworld.png
Normal file
|
After Width: | Height: | Size: 1.8 KiB |
19
graphics/pokemon/abomasnow/mega/overworld_normal.pal
Normal 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
|
||||
19
graphics/pokemon/abomasnow/mega/overworld_shiny.pal
Normal 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
|
||||
BIN
graphics/pokemon/absol/mega/overworld.png
Normal file
|
After Width: | Height: | Size: 1.5 KiB |
19
graphics/pokemon/absol/mega/overworld_normal.pal
Normal 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
|
||||
19
graphics/pokemon/absol/mega/overworld_shiny.pal
Normal 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
|
||||
BIN
graphics/pokemon/aerodactyl/mega/overworld.png
Normal file
|
After Width: | Height: | Size: 1.6 KiB |
19
graphics/pokemon/aerodactyl/mega/overworld_normal.pal
Normal 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
|
||||
19
graphics/pokemon/aerodactyl/mega/overworld_shiny.pal
Normal 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
|
||||
BIN
graphics/pokemon/aggron/mega/overworld.png
Normal file
|
After Width: | Height: | Size: 1.7 KiB |
19
graphics/pokemon/aggron/mega/overworld_normal.pal
Normal 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
|
||||
19
graphics/pokemon/aggron/mega/overworld_shiny.pal
Normal 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
|
||||
BIN
graphics/pokemon/alakazam/mega/overworld.png
Normal file
|
After Width: | Height: | Size: 1.1 KiB |
19
graphics/pokemon/alakazam/mega/overworld_normal.pal
Normal 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
|
||||
19
graphics/pokemon/alakazam/mega/overworld_shiny.pal
Normal 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
|
||||
BIN
graphics/pokemon/altaria/mega/overworld.png
Normal file
|
After Width: | Height: | Size: 1.8 KiB |
19
graphics/pokemon/altaria/mega/overworld_normal.pal
Normal 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
|
||||
19
graphics/pokemon/altaria/mega/overworld_shiny.pal
Normal 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
|
||||
BIN
graphics/pokemon/ampharos/mega/overworld.png
Normal file
|
After Width: | Height: | Size: 1.4 KiB |
19
graphics/pokemon/ampharos/mega/overworld_normal.pal
Normal 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
|
||||
19
graphics/pokemon/ampharos/mega/overworld_shiny.pal
Normal 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
|
||||
BIN
graphics/pokemon/audino/mega/overworld.png
Normal file
|
After Width: | Height: | Size: 1.1 KiB |
19
graphics/pokemon/audino/mega/overworld_normal.pal
Normal 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
|
||||
19
graphics/pokemon/audino/mega/overworld_shiny.pal
Normal 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
|
||||
BIN
graphics/pokemon/banette/mega/overworld.png
Normal file
|
After Width: | Height: | Size: 1.1 KiB |
19
graphics/pokemon/banette/mega/overworld_normal.pal
Normal 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
|
||||
19
graphics/pokemon/banette/mega/overworld_shiny.pal
Normal 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
|
||||
BIN
graphics/pokemon/beedrill/mega/overworld.png
Normal file
|
After Width: | Height: | Size: 944 B |
19
graphics/pokemon/beedrill/mega/overworld_normal.pal
Normal 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
|
||||
19
graphics/pokemon/beedrill/mega/overworld_shiny.pal
Normal 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
|
||||
BIN
graphics/pokemon/blastoise/mega/overworld.png
Normal file
|
After Width: | Height: | Size: 1.1 KiB |
19
graphics/pokemon/blastoise/mega/overworld_normal.pal
Normal 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
|
||||
19
graphics/pokemon/blastoise/mega/overworld_shiny.pal
Normal 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
|
||||
BIN
graphics/pokemon/blaziken/mega/overworld.png
Normal file
|
After Width: | Height: | Size: 1.5 KiB |
19
graphics/pokemon/blaziken/mega/overworld_normal.pal
Normal 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
|
||||
19
graphics/pokemon/blaziken/mega/overworld_shiny.pal
Normal 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
|
||||
BIN
graphics/pokemon/camerupt/mega/overworld.png
Normal file
|
After Width: | Height: | Size: 1.5 KiB |
19
graphics/pokemon/camerupt/mega/overworld_normal.pal
Normal 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
|
||||
19
graphics/pokemon/camerupt/mega/overworld_shiny.pal
Normal 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
|
||||
BIN
graphics/pokemon/charizard/mega_x/overworld.png
Normal file
|
After Width: | Height: | Size: 1.1 KiB |
19
graphics/pokemon/charizard/mega_x/overworld_normal.pal
Normal 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
|
||||
19
graphics/pokemon/charizard/mega_x/overworld_shiny.pal
Normal 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
|
||||
BIN
graphics/pokemon/charizard/mega_y/overworld.png
Normal file
|
After Width: | Height: | Size: 1.2 KiB |
19
graphics/pokemon/charizard/mega_y/overworld_normal.pal
Normal 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
|
||||
19
graphics/pokemon/charizard/mega_y/overworld_shiny.pal
Normal 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
|
||||
BIN
graphics/pokemon/diancie/mega/overworld.png
Normal file
|
After Width: | Height: | Size: 1.7 KiB |
19
graphics/pokemon/diancie/mega/overworld_normal.pal
Normal 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
|
||||
19
graphics/pokemon/diancie/mega/overworld_shiny.pal
Normal 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
|
||||
BIN
graphics/pokemon/duraludon/anim_front.png
Normal file
|
After Width: | Height: | Size: 1.6 KiB |
|
Before Width: | Height: | Size: 891 B |
@ -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
|
||||
|
||||
BIN
graphics/pokemon/gallade/mega/overworld.png
Normal file
|
After Width: | Height: | Size: 1.3 KiB |
19
graphics/pokemon/gallade/mega/overworld_normal.pal
Normal 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
|
||||
19
graphics/pokemon/gallade/mega/overworld_shiny.pal
Normal 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
|
||||
BIN
graphics/pokemon/garchomp/mega/overworld.png
Normal file
|
After Width: | Height: | Size: 1.5 KiB |
19
graphics/pokemon/garchomp/mega/overworld_normal.pal
Normal 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
|
||||
19
graphics/pokemon/garchomp/mega/overworld_shiny.pal
Normal 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
|
||||
BIN
graphics/pokemon/gardevoir/mega/overworld.png
Normal file
|
After Width: | Height: | Size: 1.2 KiB |
19
graphics/pokemon/gardevoir/mega/overworld_normal.pal
Normal 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
|
||||
19
graphics/pokemon/gardevoir/mega/overworld_shiny.pal
Normal 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
|
||||
BIN
graphics/pokemon/gengar/mega/overworld.png
Normal file
|
After Width: | Height: | Size: 947 B |
19
graphics/pokemon/gengar/mega/overworld_normal.pal
Normal 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
|
||||
19
graphics/pokemon/gengar/mega/overworld_shiny.pal
Normal 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
|
||||
BIN
graphics/pokemon/glalie/mega/overworld.png
Normal file
|
After Width: | Height: | Size: 1.4 KiB |
19
graphics/pokemon/glalie/mega/overworld_normal.pal
Normal 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
|
||||
19
graphics/pokemon/glalie/mega/overworld_shiny.pal
Normal 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
|
||||