From e59dc970a60b95f58ee97bae2e30a8c20c01d315 Mon Sep 17 00:00:00 2001 From: Rangi Date: Wed, 27 Nov 2019 16:19:50 -0500 Subject: Cleanup --- Add-a-new-level-cap.md | 218 --------------------- Add-a-new-scene-script.md | 74 +++++++ Add-a-new-spawn-point.md | 60 ++++++ Adding-a-Scene-Script.md | 74 ------- Colored-trainer-card-badges.md | 7 - Level-cap.md | 218 +++++++++++++++++++++ ...he-tops-of-leaders-heads-on-the-trainer-card.md | 10 +- Spawn-Point-(for-Fly-or-Teleport).md | 60 ------ Tutorials.md | 13 +- 9 files changed, 366 insertions(+), 368 deletions(-) delete mode 100644 Add-a-new-level-cap.md create mode 100644 Add-a-new-scene-script.md create mode 100644 Add-a-new-spawn-point.md delete mode 100644 Adding-a-Scene-Script.md create mode 100644 Level-cap.md delete mode 100644 Spawn-Point-(for-Fly-or-Teleport).md diff --git a/Add-a-new-level-cap.md b/Add-a-new-level-cap.md deleted file mode 100644 index fbe21ff..0000000 --- a/Add-a-new-level-cap.md +++ /dev/null @@ -1,218 +0,0 @@ -This tutorial guides you through changing the max level. You will add a new variable, modify level cap logic, and optionally remove gaining exp. once a pokemon is the max level. - -**TODO**: -Investigate wether one is able to set the level cap by modifying `MAX_LEVEL EQU [0-255]` in `constants/battle_constants.asm`. - -## 1. Add Level Cap variable -First, we want to add a `wLevelCap` variable to `wram.asm` in the root folder. -In `wram.asm`, go to line 2668, `wBeverlyFightCount:: db ; unused`. -Since this byte is unused, you can replace it. -Replace this line with `wLevelCap:: db`. -This is the value we'll be checking for the level cap - -```diff -; fight counts -wJackFightCount:: db ; d9f2 -- wBeverlyFightCount:: db ; unused -+ wLevelCap:: db -wHueyFightCount:: db -wGavenFightCount:: db -``` - -To set the level cap, write this in a script: -`loadmem wLevelCap, [0-255] ; number from 0 to 255 representing what your level cap should be` - -## 2. Replace first level cap check - -In `engine/pokemon/experience.asm`, go to line 9: `cp LOW(MAX_LEVEL + 1)`. -This is what we first need to change. -Before the `ld a, d` on the line before it, add code to load the new level cap into register `b`. - -```diff -.next_level - inc d -+ ld a, [wLevelCap] -+ inc a -+ push bc -+ ld b, a - ld a, d -+ cp b -+ pop bc - cp LOW(MAX_LEVEL + 1) - jr z, .got_level - call CalcExpAtLevel -``` - -## 3. Replace the rest of the cap checks - -There are now five more instances of `MAX_LEVEL` that you'll need to change. -First, go to the `.no_exp_overflow` label located in `engine/battle/core.asm`. -Instead of storing the `MAX_LEVEL` value, we load our custom max level. - -```diff -.no_exp_overflow - ld a, [wCurPartyMon] - ld e, a - ld d, 0 - ld hl, wPartySpecies - add hl, de - ld a, [hl] - ld [wCurSpecies], a - call GetBaseData - push bc -- ld d, MAX_LEVEL -+ push af -+ ld a, [wLevelCap] -+ ld d, a -+ pop af - callfar CalcExpAtLevel -``` - -Next, `ctrl + f` for the next instance of `MAX_LEVEL`, located in the `.not_max_exp` label. You'll notice that the line before this reads `ld a, [hl]` Before this line, load the level cap into register b. Then, after `ld a, [hl]`, add a comparison and restore the `bc` register. Here we use the comparison to control the jump. - -```diff -.not_max_exp -; Check if the mon leveled up - xor a ; PARTYMON - ld [wMonType], a - predef CopyMonToTempMon - callfar CalcLevel - pop bc - ld hl, MON_LEVEL - add hl, bc -+ ld a, [wLevelCap] -+ push bc -+ ld b, a - ld a, [hl] -+ cp b -+ pop bc -- cp MAX_LEVEL - jp nc, .next_mon -``` - -Third, ctrl + f for the next instance of MAX_LEVEL, located in the `AnimateExpBar` label. You'll notice there's a `ld a, [wBattleMonLevel]` before it. Before this, add - -```diff -AnimateExpBar: - push bc - - ld hl, wCurPartyMon - ld a, [wCurBattleMon] - cp [hl] - jp nz, .finish - -+ ld a, [wLevelCap] -+ push bc -+ ld b, a - ld a, [wBattleMonLevel] -+ cp b -+ pop bc -- cp MAX_LEVEL - jp nc, .finish -``` - -Fourth, ctrl + f for the next instance of MAX_LEVEL. Replace `ld d, MAX_LEVEL` with loading the custom max level. - -```diff - ld [hli], a - ld [hl], a - -.NoOverflow: -+ push af -+ ld a, [wLevelCap] -+ ld d, a -+ pop af - callfar CalcExpAtLevel - ldh a, [hProduct + 1] - ld b, a -``` - -Fifth, ctrl + f for the final instance of MAX_LEVEL. You'll notice before it reads `ld a, e`. Before this, lod the level cap into b, then do the comparison on that. - -```diff - ld a, e - ld d, a - -.LoopLevels: -+ ld a, [wLevelCap] -+ push bc -+ ld b, a - ld a, e -- cp MAX_LEVEL -+ cp b -+ pop bc - jr nc, .FinishExpBar - cp d - jr z, .FinishExpBar - inc a -``` - -Now you're done with replacing the max level checks with the level cap checks. - -## 4. Optional: Remove exp. gain text at max level - -You'll notice that the exp. gain text still displays when you reach the level cap. -To remove this, go to line 7059 in `engine/battle/core.asm`, which should be about the lines of - -```diff -.stat_exp_awarded - inc de - inc de - dec c - jr nz, .stat_exp_loop -+ pop bc -+ ld hl, MON_LEVEL -+ add hl, bc -+ ld a, [wLevelCap] -+ push bc -+ ld b, a -+ ld a, [hl] -+ cp b -+ pop bc -+ jp nc, .next_mon -+ push bc - xor a - ldh [hMultiplicand + 0], a - ldh [hMultiplicand + 1], a - ld a, [wEnemyMonBaseExp] -``` - -Next, go to - -```diff -.EvenlyDivideExpAmongParticipants: -; count number of battle participants - ld a, [wBattleParticipantsNotFainted] - ld b, a - ld c, PARTY_LENGTH - ld d, 0 -.count_loop -+ push bc -+ push de -+ ld a, [wLevelCap] -+ ld b, a -+ ld a, [wPartyCount] -+ cp c -+ jr c, .no_mon -+ ld a, c -+ dec a -+ ld hl, wPartyMon1Level -+ call GetPartyLocation -+ ld a, [hl] -+.no_mon -+ cp b -+ pop de -+ pop bc -+ jr nz, .gains_exp -+ srl b -+ ld a, d -+ jr .no_exp -+.gains_exp - xor a - srl b - adc d - ld d, a -+.no_exp - dec c - jr nz, .count_loop -``` diff --git a/Add-a-new-scene-script.md b/Add-a-new-scene-script.md new file mode 100644 index 0000000..d74bc48 --- /dev/null +++ b/Add-a-new-scene-script.md @@ -0,0 +1,74 @@ +This tutorial is for adding a scene event to a map. We'll be Using Azalea Gym as an example. + +## Contents +1. [Define SceneID in WRAM](#1-define-sceneid-in-wram) +2. [Define scene_var](#2-define-scene_var) +3. [Define the Scene](#3-define-the-scene) +4. [Add the Scene to Azalea Gym](#4-add-the-scene-to-azalea-gym) + +## 1. Define SceneID in WRAM +Azalea Town Doesn't have a SceneID yet, so we need to define it. Edit [wram.asm](../blob/master/wram.asm): +```diff +INCLUDE "constants.asm" + +INCLUDE "macros/wram.asm" +... +wMobileTradeRoomSceneID:: db ; d9bf +wMobileBattleRoomSceneID:: db ; d9c0 ++wAzaleaGymSceneID:: db ; d9c1 + +- ds 49 ++ ds 48 + +``` +If you add more Scene Ids in the future you'll have to decrement the number after `ds` accordingly + + +## 2. Define scene_var +Edit [data/maps/scenes.asm](../blob/master/data/maps/scenes.asm): +```diff +scene_var: MACRO +; map, variable +... + scene_var MOBILE_BATTLE_ROOM, wMobileBattleRoomSceneID ++ scene_var AZALEA_GYM, wAzaleaGymSceneID + db -1 ; end + +``` + + +## 3. Define the scene +Edit [constants/scene_constants.asm](../blob/master/constants/scene_constants.asm): +```diff +; See data/maps/scenes.asm for which maps have scene variables. +; Each scene_script and coord_event is associated with a current scene ID. +... +; wFastShip1FSceneID + const_def 1 + const SCENE_FASTSHIP1F_ENTER_SHIP ; 1 + const SCENE_FASTSHIP1F_MEET_GRANDPA ; 2 + ++; wAzaleaGymSceneID ++ const_def ++ const SCENE_AZALEAGYM_NOTHING ++ const SCENE_AZALEAGYM_SCENE +``` +## 4. Add the Scene to Azalea Gym +Edit [maps/AzaleaGym.asm](../blob/master/maps/AzaleaGym.asm): +```diff + object_const_def ; object_event constants + const AZALEAGYM_BUGSY +... +AzaleaGym_MapScripts: +- db 0 ; scene scripts ++ db 2 ; scene scripts ++ scene_script .DummyScene0 ; SCENE_AZALEAGYM_NOTHING ++ scene_script .DummyScene1 ; SCENE_AZALEAGYM_SCENE + + db 0 ; callbacks + ++.DummyScene0 ++.DummyScene1 ++ end +``` +That's it! Now you can use these scenes for a Coord event. \ No newline at end of file diff --git a/Add-a-new-spawn-point.md b/Add-a-new-spawn-point.md new file mode 100644 index 0000000..4f088a3 --- /dev/null +++ b/Add-a-new-spawn-point.md @@ -0,0 +1,60 @@ +This tutorial is for how to add a new spawn point for fly. + +After successfully achieved the "[Add a new map and landmark](https://github.com/pret/pokecrystal/wiki/Add-a-new-map-and-landmark)" tutorial, + +Simply edit [constants/map_data_constants.asm]: + +```diff +; johto + const SPAWN_NEW_BARK + ... + const SPAWN_GOLDENROD ++ const SPAWN_GLOBALTERMINAL` +``` + +Then edit [data/maps/spawn_points.asm]: + +```diff +SpawnPoints: + + ... + spawn GOLDENROD_CITY, 15, 28 ++ spawn GLOBAL_TERMINAL_OUTSIDE, 8, 10 +``` + +Then edit [data/maps/flypoints.asm] + +```diff +Flypoints: + +... +; Johto + ... + flypoint GOLDENROD, GOLDENROD_CITY ++ flypoint GLOBALTERMINAL, GLOBAL_TERMINAL` +``` + +Then edit [constants/engine_flags.asm] + +```diff +... +; wVisitedSpawns + const ENGINE_FLYPOINT_GOLDENROD ++ const ENGINE_FLYPOINT_GLOBALTERMINAL` +``` + +Then edit [maps/GlobalTerminalOutSide.asm] + +```diff +... +GlobalTerminalOutside_MapScripts: + db 0 ; scene scripts ++ db 1 ; callbacks ++ callback MAPCALLBACK_NEWMAP, .Flypoint + ++ .Flypoint: ++ setflag ENGINE_FLYPOINT_GLOBALTERMINAL ++ return` +``` + +Then compile your project and you're done \ No newline at end of file diff --git a/Adding-a-Scene-Script.md b/Adding-a-Scene-Script.md deleted file mode 100644 index d74bc48..0000000 --- a/Adding-a-Scene-Script.md +++ /dev/null @@ -1,74 +0,0 @@ -This tutorial is for adding a scene event to a map. We'll be Using Azalea Gym as an example. - -## Contents -1. [Define SceneID in WRAM](#1-define-sceneid-in-wram) -2. [Define scene_var](#2-define-scene_var) -3. [Define the Scene](#3-define-the-scene) -4. [Add the Scene to Azalea Gym](#4-add-the-scene-to-azalea-gym) - -## 1. Define SceneID in WRAM -Azalea Town Doesn't have a SceneID yet, so we need to define it. Edit [wram.asm](../blob/master/wram.asm): -```diff -INCLUDE "constants.asm" - -INCLUDE "macros/wram.asm" -... -wMobileTradeRoomSceneID:: db ; d9bf -wMobileBattleRoomSceneID:: db ; d9c0 -+wAzaleaGymSceneID:: db ; d9c1 - -- ds 49 -+ ds 48 - -``` -If you add more Scene Ids in the future you'll have to decrement the number after `ds` accordingly - - -## 2. Define scene_var -Edit [data/maps/scenes.asm](../blob/master/data/maps/scenes.asm): -```diff -scene_var: MACRO -; map, variable -... - scene_var MOBILE_BATTLE_ROOM, wMobileBattleRoomSceneID -+ scene_var AZALEA_GYM, wAzaleaGymSceneID - db -1 ; end - -``` - - -## 3. Define the scene -Edit [constants/scene_constants.asm](../blob/master/constants/scene_constants.asm): -```diff -; See data/maps/scenes.asm for which maps have scene variables. -; Each scene_script and coord_event is associated with a current scene ID. -... -; wFastShip1FSceneID - const_def 1 - const SCENE_FASTSHIP1F_ENTER_SHIP ; 1 - const SCENE_FASTSHIP1F_MEET_GRANDPA ; 2 - -+; wAzaleaGymSceneID -+ const_def -+ const SCENE_AZALEAGYM_NOTHING -+ const SCENE_AZALEAGYM_SCENE -``` -## 4. Add the Scene to Azalea Gym -Edit [maps/AzaleaGym.asm](../blob/master/maps/AzaleaGym.asm): -```diff - object_const_def ; object_event constants - const AZALEAGYM_BUGSY -... -AzaleaGym_MapScripts: -- db 0 ; scene scripts -+ db 2 ; scene scripts -+ scene_script .DummyScene0 ; SCENE_AZALEAGYM_NOTHING -+ scene_script .DummyScene1 ; SCENE_AZALEAGYM_SCENE - - db 0 ; callbacks - -+.DummyScene0 -+.DummyScene1 -+ end -``` -That's it! Now you can use these scenes for a Coord event. \ No newline at end of file diff --git a/Colored-trainer-card-badges.md b/Colored-trainer-card-badges.md index 2e37758..10866c4 100644 --- a/Colored-trainer-card-badges.md +++ b/Colored-trainer-card-badges.md @@ -32,9 +32,6 @@ Edit [engine/gfx/cgb_layouts.asm](../blob/master/engine/gfx/cgb_layouts.asm): ```diff _CGB_TrainerCard: ... - ld a, PRYCE - call GetTrainerPalettePointer - call LoadPalette_White_Col1_Col2_Black - ld a, PREDEFPAL_CGB_BADGE - call GetPredefPal - call LoadHLPaletteIntoDE @@ -42,10 +39,6 @@ Edit [engine/gfx/cgb_layouts.asm](../blob/master/engine/gfx/cgb_layouts.asm): + ld bc, 8 palettes + ld a, BANK(wOBPals1) + call FarCopyWRAM - - ; fill screen with opposite-gender palette for the card border - hlcoord 0, 0, wAttrMap - ld bc, SCREEN_WIDTH * SCREEN_HEIGHT ... ret + diff --git a/Level-cap.md b/Level-cap.md new file mode 100644 index 0000000..fbe21ff --- /dev/null +++ b/Level-cap.md @@ -0,0 +1,218 @@ +This tutorial guides you through changing the max level. You will add a new variable, modify level cap logic, and optionally remove gaining exp. once a pokemon is the max level. + +**TODO**: +Investigate wether one is able to set the level cap by modifying `MAX_LEVEL EQU [0-255]` in `constants/battle_constants.asm`. + +## 1. Add Level Cap variable +First, we want to add a `wLevelCap` variable to `wram.asm` in the root folder. +In `wram.asm`, go to line 2668, `wBeverlyFightCount:: db ; unused`. +Since this byte is unused, you can replace it. +Replace this line with `wLevelCap:: db`. +This is the value we'll be checking for the level cap + +```diff +; fight counts +wJackFightCount:: db ; d9f2 +- wBeverlyFightCount:: db ; unused ++ wLevelCap:: db +wHueyFightCount:: db +wGavenFightCount:: db +``` + +To set the level cap, write this in a script: +`loadmem wLevelCap, [0-255] ; number from 0 to 255 representing what your level cap should be` + +## 2. Replace first level cap check + +In `engine/pokemon/experience.asm`, go to line 9: `cp LOW(MAX_LEVEL + 1)`. +This is what we first need to change. +Before the `ld a, d` on the line before it, add code to load the new level cap into register `b`. + +```diff +.next_level + inc d ++ ld a, [wLevelCap] ++ inc a ++ push bc ++ ld b, a + ld a, d ++ cp b ++ pop bc + cp LOW(MAX_LEVEL + 1) + jr z, .got_level + call CalcExpAtLevel +``` + +## 3. Replace the rest of the cap checks + +There are now five more instances of `MAX_LEVEL` that you'll need to change. +First, go to the `.no_exp_overflow` label located in `engine/battle/core.asm`. +Instead of storing the `MAX_LEVEL` value, we load our custom max level. + +```diff +.no_exp_overflow + ld a, [wCurPartyMon] + ld e, a + ld d, 0 + ld hl, wPartySpecies + add hl, de + ld a, [hl] + ld [wCurSpecies], a + call GetBaseData + push bc +- ld d, MAX_LEVEL ++ push af ++ ld a, [wLevelCap] ++ ld d, a ++ pop af + callfar CalcExpAtLevel +``` + +Next, `ctrl + f` for the next instance of `MAX_LEVEL`, located in the `.not_max_exp` label. You'll notice that the line before this reads `ld a, [hl]` Before this line, load the level cap into register b. Then, after `ld a, [hl]`, add a comparison and restore the `bc` register. Here we use the comparison to control the jump. + +```diff +.not_max_exp +; Check if the mon leveled up + xor a ; PARTYMON + ld [wMonType], a + predef CopyMonToTempMon + callfar CalcLevel + pop bc + ld hl, MON_LEVEL + add hl, bc ++ ld a, [wLevelCap] ++ push bc ++ ld b, a + ld a, [hl] ++ cp b ++ pop bc +- cp MAX_LEVEL + jp nc, .next_mon +``` + +Third, ctrl + f for the next instance of MAX_LEVEL, located in the `AnimateExpBar` label. You'll notice there's a `ld a, [wBattleMonLevel]` before it. Before this, add + +```diff +AnimateExpBar: + push bc + + ld hl, wCurPartyMon + ld a, [wCurBattleMon] + cp [hl] + jp nz, .finish + ++ ld a, [wLevelCap] ++ push bc ++ ld b, a + ld a, [wBattleMonLevel] ++ cp b ++ pop bc +- cp MAX_LEVEL + jp nc, .finish +``` + +Fourth, ctrl + f for the next instance of MAX_LEVEL. Replace `ld d, MAX_LEVEL` with loading the custom max level. + +```diff + ld [hli], a + ld [hl], a + +.NoOverflow: ++ push af ++ ld a, [wLevelCap] ++ ld d, a ++ pop af + callfar CalcExpAtLevel + ldh a, [hProduct + 1] + ld b, a +``` + +Fifth, ctrl + f for the final instance of MAX_LEVEL. You'll notice before it reads `ld a, e`. Before this, lod the level cap into b, then do the comparison on that. + +```diff + ld a, e + ld d, a + +.LoopLevels: ++ ld a, [wLevelCap] ++ push bc ++ ld b, a + ld a, e +- cp MAX_LEVEL ++ cp b ++ pop bc + jr nc, .FinishExpBar + cp d + jr z, .FinishExpBar + inc a +``` + +Now you're done with replacing the max level checks with the level cap checks. + +## 4. Optional: Remove exp. gain text at max level + +You'll notice that the exp. gain text still displays when you reach the level cap. +To remove this, go to line 7059 in `engine/battle/core.asm`, which should be about the lines of + +```diff +.stat_exp_awarded + inc de + inc de + dec c + jr nz, .stat_exp_loop ++ pop bc ++ ld hl, MON_LEVEL ++ add hl, bc ++ ld a, [wLevelCap] ++ push bc ++ ld b, a ++ ld a, [hl] ++ cp b ++ pop bc ++ jp nc, .next_mon ++ push bc + xor a + ldh [hMultiplicand + 0], a + ldh [hMultiplicand + 1], a + ld a, [wEnemyMonBaseExp] +``` + +Next, go to + +```diff +.EvenlyDivideExpAmongParticipants: +; count number of battle participants + ld a, [wBattleParticipantsNotFainted] + ld b, a + ld c, PARTY_LENGTH + ld d, 0 +.count_loop ++ push bc ++ push de ++ ld a, [wLevelCap] ++ ld b, a ++ ld a, [wPartyCount] ++ cp c ++ jr c, .no_mon ++ ld a, c ++ dec a ++ ld hl, wPartyMon1Level ++ call GetPartyLocation ++ ld a, [hl] ++.no_mon ++ cp b ++ pop de ++ pop bc ++ jr nz, .gains_exp ++ srl b ++ ld a, d ++ jr .no_exp ++.gains_exp + xor a + srl b + adc d + ld d, a ++.no_exp + dec c + jr nz, .count_loop +``` diff --git a/Show-the-tops-of-leaders-heads-on-the-trainer-card.md b/Show-the-tops-of-leaders-heads-on-the-trainer-card.md index 75f81e1..6004ed8 100644 --- a/Show-the-tops-of-leaders-heads-on-the-trainer-card.md +++ b/Show-the-tops-of-leaders-heads-on-the-trainer-card.md @@ -27,11 +27,11 @@ Edit [engine/gfx/cgb_layouts.asm](../blob/master/engine/gfx/cgb_layouts.asm): ```diff _CGB_TrainerCard: ... -.got_gender2 - call FillBoxCGB - ; top-right corner still uses the border's palette - hlcoord 18, 1, wAttrMap - ld [hl], $1 + .got_gender2 + call FillBoxCGB + ; top-right corner still uses the border's palette + hlcoord 18, 1, wAttrMap + ld [hl], $1 - hlcoord 2, 11, wAttrMap - lb bc, 2, 4 + hlcoord 3, 10, wAttrMap diff --git a/Spawn-Point-(for-Fly-or-Teleport).md b/Spawn-Point-(for-Fly-or-Teleport).md deleted file mode 100644 index 4f088a3..0000000 --- a/Spawn-Point-(for-Fly-or-Teleport).md +++ /dev/null @@ -1,60 +0,0 @@ -This tutorial is for how to add a new spawn point for fly. - -After successfully achieved the "[Add a new map and landmark](https://github.com/pret/pokecrystal/wiki/Add-a-new-map-and-landmark)" tutorial, - -Simply edit [constants/map_data_constants.asm]: - -```diff -; johto - const SPAWN_NEW_BARK - ... - const SPAWN_GOLDENROD -+ const SPAWN_GLOBALTERMINAL` -``` - -Then edit [data/maps/spawn_points.asm]: - -```diff -SpawnPoints: - - ... - spawn GOLDENROD_CITY, 15, 28 -+ spawn GLOBAL_TERMINAL_OUTSIDE, 8, 10 -``` - -Then edit [data/maps/flypoints.asm] - -```diff -Flypoints: - -... -; Johto - ... - flypoint GOLDENROD, GOLDENROD_CITY -+ flypoint GLOBALTERMINAL, GLOBAL_TERMINAL` -``` - -Then edit [constants/engine_flags.asm] - -```diff -... -; wVisitedSpawns - const ENGINE_FLYPOINT_GOLDENROD -+ const ENGINE_FLYPOINT_GLOBALTERMINAL` -``` - -Then edit [maps/GlobalTerminalOutSide.asm] - -```diff -... -GlobalTerminalOutside_MapScripts: - db 0 ; scene scripts -+ db 1 ; callbacks -+ callback MAPCALLBACK_NEWMAP, .Flypoint - -+ .Flypoint: -+ setflag ENGINE_FLYPOINT_GLOBALTERMINAL -+ return` -``` - -Then compile your project and you're done \ No newline at end of file diff --git a/Tutorials.md b/Tutorials.md index e60c1d8..3ad5a75 100644 --- a/Tutorials.md +++ b/Tutorials.md @@ -49,10 +49,10 @@ Tutorials may use diff syntax to show edits: - [Unown puzzle chamber](Add-a-new-Unown-puzzle-chamber) - [Fishing rod](Add-a-new-fishing-rod) - [Battle transition](Add-a-new-battle-transition) -- [Spawn point (for Fly or Teleport)](https://github.com/pret/pokecrystal/wiki/Spawn-Point-(for-Fly-or-Teleport)) -- [Level cap](Add-a-new-level-cap) +- [Spawn point (for Fly or Teleport)](Add-a-new-spawn-point) - [Text scrolling speed](Add-a-new-text-scrolling-speed) -- [Scene script](https://github.com/pret/pokecrystal/wiki/Adding-a-Scene-Script) +- [Scene script](Add-a-new-scene-script) + ## How to edit the… @@ -79,7 +79,6 @@ Tutorials may use diff syntax to show edits: - [Short beeping noise for low HP](Short-beeping-noise-for-low-HP) - [Remove the artificial save delay](Remove-the-artificial-save-delay) - [Option to show shiny colors in Pokédex](Option-to-show-shiny-colors-in-Pokédex) -- [Making items that act like HM Field Moves](Adding-items-that-act-like-HMs) ## Removing features @@ -113,6 +112,12 @@ Tutorials may use diff syntax to show edits: - [Gain experience from catching Pokémon](Gain-experience-from-catching-Pokémon) +## Custom features + +- [Items that act like HM field moves](Adding-items-that-act-like-HMs) +- [Level cap](Level-cap) + + ## Assembly programming - [Optimizing assembly code](Optimizing-assembly-code) -- cgit v1.2.3