-
Notifications
You must be signed in to change notification settings - Fork 817
Automatically reuse Repel
Starting in B2/W2, when a Repel, Super Repel, or Max Repel expires and you have another one of the same type, the "Repel's effect wore off…" message will be followed by the option to use another.
Implementing this feature in Gen 2 is relatively simple, but does involve a number of different areas:
- WRAM and SRAM need space to save the type of Repel
- The Repel item effect needs to save its type
- The script that notifies when a Repel wears off needs to check if you have another one and let you choose to reuse it
- There needs to be an alternative notification message including the "Use another?" question text
There's already this line in wram.asm:
wRepelEffect:: db ; If a Repel is in use, it contains the nr of steps it's still active
It's between the wPlayerData
and wPlayerDataEnd
labels. That means it's part of the saved data, so resetting the game will still remember how many Repel steps you have left.
We need to add a wRepelType
byte that works the same way. It's just one byte since it stores the item ID. There's free space nearby, so let's use that:
wLuckyNumberShowFlag:: db ; dc9d
- ds 1
+wRepelType:: db
wLuckyIDNumber:: dw ; dc9f
wRepelEffect:: db ; If a Repel is in use, it contains the nr of steps it's still active
wBikeStep:: dw
wKurtApricornQuantity:: db
The file that defines item effects is, predictably, engine/item_effects.asm. It turns out that Repel, Super Repel, and Max Repel all use the same code, so we don't have to write anything three times.
SuperRepel: ; f462
ld b, 200
jr UseRepel
; f466
MaxRepel: ; f466
ld b, 250
jr UseRepel
; f466
Repel: ; f46a
ld b, 100
; f46c
UseRepel: ; f46c
ld a, [wRepelEffect]
and a
ld hl, TextJump_RepelUsedEarlierIsStillInEffect
jp nz, PrintText
ld a, b
ld [wRepelEffect], a
+ ld a, [CurItem]
+ ld [wRepelType], a
jp UseItemText
TextJump_RepelUsedEarlierIsStillInEffect: ; 0xf47d
; The REPEL used earlier is still in effect.
text_jump Text_RepelUsedEarlierIsStillInEffect
db "@"
; 0xf482
Edit engine/events.asm:
DoRepelStep: ; 96bd7
ld a, [wRepelEffect]
and a
ret z
dec a
ld [wRepelEffect], a
ret nz
+ ld a, [wRepelType]
+ ld [CurItem], a
+ ld hl, NumItems
+ call CheckItem
ld a, BANK(RepelWoreOffScript)
ld hl, RepelWoreOffScript
jr nc, .okay
+ ld a, BANK(UseAnotherRepelScript)
+ ld hl, UseAnotherRepelScript
+.okay
call CallScript
scf
ret
; 96beb
Note that UseAnotherRepelScript
hasn't been defined yet, so we'll do that next.
Edit engine/events/misc_scripts_2.asm:
RepelWoreOffScript:: ; 0x13619
opentext
writetext .text
waitbutton
closetext
end
.text ; 0x13620
; REPEL's effect wore off.
text_jump UnknownText_0x1bd308
db "@"
+UseAnotherRepelScript::
+ opentext
+ writetext .text
+ yesorno
+ iffalse .done
+ callasm DoItemEffect
+.done
+ closetext
+ end
+
+.text:
+ text_jump UseAnotherRepelText
+ db "@"
Again, we have not yet defined UseAnotherRepelText
, so let's finish up with that.
Edit data/text/common_1.asm:
UnknownText_0x1bd308::
text "REPEL's effect"
line "wore off."
done
+UseAnotherRepelText::
+ text "REPEL's effect"
+ line "wore off."
+
+ para "Use another?"
+ done
Finally, the feature works!