diff options
author | Vinzent <vinz.corno@web.de> | 2019-07-15 18:14:18 +0200 |
---|---|---|
committer | Vinzent <vinz.corno@web.de> | 2019-07-15 18:14:18 +0200 |
commit | d11adf99d9d2d4257116ab737e22f11328b811e2 (patch) | |
tree | 10f295a4483abc3d452e5b1eca351840757dfcf9 | |
parent | cf0f97e98657700b668494d47b5a9705ea696174 (diff) |
Created Adding option for instant text (markdown)
-rw-r--r-- | Adding-option-for-instant-text.md | 136 |
1 files changed, 136 insertions, 0 deletions
diff --git a/Adding-option-for-instant-text.md b/Adding-option-for-instant-text.md new file mode 100644 index 0000000..1ce0d84 --- /dev/null +++ b/Adding-option-for-instant-text.md @@ -0,0 +1,136 @@ +This tutorial details how to add an additional text speed option. As an example we'll implement an option for instant text. + + +## Contents + +1. [Define wram constant](#1-define-wram-constant) +2. [Add instant text to options](#2-add-instant-text-to-options) +3. [Fix text speed while holding a or b](#3-fix-text-speed-while-holding-a-or-b) + + +## 1. Define wram constant + +Edit [constants/wram_constants.asm](../blob/master/constants/wram_constants.asm): + +```diff +; wOptions:: ; cfcc +TEXT_DELAY_MASK EQU %111 + const_def 4 + const NO_TEXT_SCROLL ; 4 + const STEREO ; 5 + const BATTLE_SHIFT ; 6 + const BATTLE_SCENE ; 7 + ++TEXT_DELAY_NONE EQU %000 ; 0 +TEXT_DELAY_FAST EQU %001 ; 1 +TEXT_DELAY_MED EQU %011 ; 3 +TEXT_DELAY_SLOW EQU %101 ; 5 +``` + +As you can see we defined `TEXT_DELAY_NONE` as 0, which will print all characters with 0 frame delay. + + +## 2. Add instant text to options + +Edit [engine/menus/options_menu.asm](../blob/master/engine/menu/options_menu.asm): + +```diff +.Pointers: + dw Options_TextSpeed + ... + + const_def + const OPT_TEXT_SPEED_FAST ; 0 + const OPT_TEXT_SPEED_MED ; 1 + const OPT_TEXT_SPEED_SLOW ; 2 ++ const OPT_TEXT_SPEED_NONE ; 3 + +Options_TextSpeed: + call GetTextSpeed + ldh a, [hJoyPressed] + bit D_LEFT_F, a + jr nz, .LeftPressed + bit D_RIGHT_F, a + jr z, .NonePressed + ld a, c ; right pressed +- cp OPT_TEXT_SPEED_SLOW ++ cp OPT_TEXT_SPEED_NONE + jr c, .Increase +... + +.LeftPressed: + ld a, c + and a + jr nz, .Decrease + ld c, OPT_TEXT_SPEED_NONE + 1 +``` + +This will make it cycleable in the options menu but it won't actually work quite yet. We still need to define its string and load the correct previous & next value into registers, otherwise it won't display the selected value correctly. + +```diff +.Strings: +; entries correspond to OPT_TEXT_SPEED_* constants + dw .Fast + dw .Mid + dw .Slow ++ dw .None + +.Fast: db "FAST@" +.Mid: db "MID @" +.Slow: db "SLOW@" ++.None: db "NONE@" + +GetTextSpeed: +; converts TEXT_DELAY_* value in a to OPT_TEXT_SPEED_* value in c, +; with previous/next TEXT_DELAY_* values in d/e + ld a, [wOptions] + and TEXT_DELAY_MASK + cp TEXT_DELAY_SLOW + jr z, .slow + cp TEXT_DELAY_FAST + jr z, .fast ++ cp TEXT_DELAY_NONE ++ jr z, .none + ; none of the above + ld c, OPT_TEXT_SPEED_MED + lb de, TEXT_DELAY_FAST, TEXT_DELAY_SLOW + ret + +.slow + ld c, OPT_TEXT_SPEED_SLOW +- lb de, TEXT_DELAY_MED, TEXT_DELAY_FAST ++ lb de, TEXT_DELAY_MED, TEXT_DELAY_NONE + ret + +.fast + ld c, OPT_TEXT_SPEED_FAST +- lb de, TEXT_DELAY_SLOW, TEXT_DELAY_MED ++ lb de, TEXT_DELAY_NONE, TEXT_DELAY_MED ++ ret ++ ++.none ++ ld c, OPT_TEXT_SPEED_NONE ++ lb de, TEXT_DELAY_SLOW, TEXT_DELAY_FAST + ret +``` + +Note how `lb de, <previous>, <next>` correspond to the order defined with the `OPT_TEXT_SPEED_<speed>` constants. If your custom text speed is not 0 like mine you're done. + +## 3. Fix text speed while holding a or b + +There is one last quirk that needs fixing. When you hold a or b while text is scrolling it does so at `TEXT_DELAY_FAST`. Since our custom text speed is faster than that we need to modify that piece of code. + +Edit [home/print_text.asm](../blob/master/home/print_text.asm): + +```diff +PrintLetterDelay:: + ... + +; text speed + ld a, [wOptions] + and %111 ++ jr z, .end + jr .updatedelay +``` + +And there you go. |