summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorVinzent <vinz.corno@web.de>2019-07-15 18:14:18 +0200
committerVinzent <vinz.corno@web.de>2019-07-15 18:14:18 +0200
commitd11adf99d9d2d4257116ab737e22f11328b811e2 (patch)
tree10f295a4483abc3d452e5b1eca351840757dfcf9
parentcf0f97e98657700b668494d47b5a9705ea696174 (diff)
Created Adding option for instant text (markdown)
-rw-r--r--Adding-option-for-instant-text.md136
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.