Skip to content

Instantly share code, notes, and snippets.

@Kraballa
Last active July 15, 2019 20:41
Show Gist options
  • Save Kraballa/b21f5f5eb8898facd358409d395bb846 to your computer and use it in GitHub Desktop.
Save Kraballa/b21f5f5eb8898facd358409d395bb846 to your computer and use it in GitHub Desktop.
Wiki entry suggestion detailing how to edit pret/pokecrystal to allow instant text.

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
  2. Add instant text to options
  3. Fix text speed while holding a or b

1. Define wram constant

Edit constants/wram_constants.asm:

; 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:

.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.

.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:

PrintLetterDelay::
	...

; text speed
	ld a, [wOptions]
	and %111
+	jr z, .end
	jr .updatedelay

And there you go.

@Teit0
Copy link

Teit0 commented Jul 15, 2019

Cool, maybe add some GIFs and a screenshot of the Options screen

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment