summaryrefslogtreecommitdiff
path: root/events
diff options
context:
space:
mode:
authorRemy Oukaour <remy.oukaour@gmail.com>2017-12-26 22:57:19 -0500
committerRemy Oukaour <remy.oukaour@gmail.com>2017-12-26 22:57:19 -0500
commit172dba3c0b38eeea09342efe297ccc7ea9b4d3d3 (patch)
tree26575c7076c457c80703429a086e4d4e23f8d94e /events
parentc4a18b13295cd9f2777bfa27a37aafc09eb31684 (diff)
Rename some sections
engine/battle_tower.asm fits better in events/
Diffstat (limited to 'events')
-rw-r--r--events/battle_tower.asm502
-rw-r--r--events/battle_tower_rules.asm342
-rwxr-xr-xevents/happiness_egg.asm4
-rw-r--r--events/odd_egg.asm96
4 files changed, 626 insertions, 318 deletions
diff --git a/events/battle_tower.asm b/events/battle_tower.asm
index de6022145..b880a099b 100644
--- a/events/battle_tower.asm
+++ b/events/battle_tower.asm
@@ -1,342 +1,210 @@
-CheckForMobileBattleRules: ; 8b1e1
- ld de, .PointerTables
- call BattleTower_ExecuteJumptable
- ret z
- call BattleTower_PleaseReturnWhenReady
- scf
- ret
-; 8b1ed
-
-.PointerTables: ; 8b1ed
- db 2
- dw .Functions
- dw .TextPointers
-
-.Functions: ; 8b1f2
- dw BattleTower_CheckPartyLengthIs3
- dw BattleTower_CheckPartyHasThreeMonsThatAreNotEggs
-; 8b1f6
-
-.TextPointers: ; 8b1f6
- dw .ExcuseMeText
- dw JumpText_NeedAtLeastThreeMon
- dw JumpText_EggDoesNotQualify
-; 8b1fc
-
-.ExcuseMeText: ; 0x8b1fc
- ; Excuse me!
- text_jump UnknownText_0x1c5937
- db "@"
-; 0x8b201
-
-CheckForBattleTowerRules: ; 8b201
- ld hl, StringBuffer2
- ld [hl], "3"
- inc hl
- ld [hl], "@"
- ld de, .PointerTables
- call BattleTower_ExecuteJumptable
- ret z
- call BattleTower_PleaseReturnWhenReady
- scf
- ret
-; 8b215
-
-.PointerTables: ; 8b215
- db 4
- dw .Functions
- dw .TextPointers
-
-.Functions: ; 8b21a
- dw Function_PartyCountEq3
- dw Function_PartySpeciesAreUnique
- dw Function_PartyItemsAreUnique
- dw Function_HasPartyAnEgg
-; 8b222
-
-.TextPointers: ; 8b222
- dw JumpText_ExcuseMeYoureNotReady
- dw JumpText_OnlyThreePkmnMayBeEntered
- dw JumpText_ThePkmnMustAllBeDifferentKinds
- dw JumpText_ThePkmnMustNotHoldTheSameItems
- dw JumpText_YouCantTakeAnEgg
-; 8b22c
-
-JumpText_ExcuseMeYoureNotReady: ; 0x8b22c
- ; Excuse me. You're not ready.
- text_jump Text_ExcuseMeYoureNotReady
- db "@"
-; 0x8b231
-
-BattleTower_PleaseReturnWhenReady: ; 8b231
- ld hl, .PleaseReturnWhenReady
- call PrintText
- ret
-; 8b238
-
-.PleaseReturnWhenReady: ; 0x8b238
- ; Please return when you're ready.
- text_jump UnknownText_0x1c5962
- db "@"
-; 0x8b23d
-
-JumpText_NeedAtLeastThreeMon: ; 0x8b23d
- ; You need at least three #MON.
- text_jump UnknownText_0x1c5983
- db "@"
-; 0x8b242
-
-JumpText_EggDoesNotQualify: ; 0x8b242
- ; Sorry, an EGG doesn't qualify.
- text_jump UnknownText_0x1c59a3
- db "@"
-; 0x8b247
-
-JumpText_OnlyThreePkmnMayBeEntered: ; 0x8b247
- ; Only three #MON may be entered.
- text_jump Text_OnlyThreePkmnMayBeEntered
- db "@"
-; 0x8b24c
-
-JumpText_ThePkmnMustAllBeDifferentKinds: ; 0x8b24c
- ; The @ #MON must all be different kinds.
- text_jump Text_ThePkmnMustAllBeDifferentKinds
- db "@"
-; 0x8b251
+Function_LoadOpponentTrainerAndPokemons: ; 1f8000
+ ld a, [rSVBK]
+ push af
+ ld a, BANK(BT_OTTrainer)
+ ld [rSVBK], a
+
+ ; Fill BT_OTTrainer with zeros
+ xor a
+ ld hl, BT_OTTrainer
+ ld bc, BT_OTTrainerEnd - BT_OTTrainer
+ call ByteFill
+
+ ; Write $ff into the Item-Slots
+ ld a, $ff
+ ld [BT_OTPkmn1Item], a
+ ld [BT_OTPkmn2Item], a
+ ld [BT_OTPkmn3Item], a
+
+ ; Set BT_OTTrainer as start address to write the following data to
+ ld de, BT_OTTrainer
+
+ ld a, [hRandomAdd]
+ ld b, a
+.resample ; loop to find a random trainer
+ call Random
+ ld a, [hRandomAdd]
+ add b
+ ld b, a ; b contains the nr of the trainer
+IF DEF(CRYSTAL11)
+ and (1 << 7) - 1
+ cp 70
+ELSE
+ and (1 << 5) - 1
+ cp 21
+ENDC
+ jr nc, .resample
+ ld b, a
-JumpText_ThePkmnMustNotHoldTheSameItems: ; 0x8b251
- ; The @ #MON must not hold the same items.
- text_jump Text_ThePkmnMustNotHoldTheSameItems
- db "@"
-; 0x8b256
+ ld a, BANK(sBTTrainers)
+ call GetSRAMBank
-JumpText_YouCantTakeAnEgg: ; 0x8b256
- ; You can't take an EGG!
- text_jump Text_YouCantTakeAnEgg
- db "@"
-; 0x8b25b
+ ld c, BATTLETOWER_NROFTRAINERS
+ ld hl, sBTTrainers
+.next_trainer
+ ld a, [hli]
+ cp b
+ jr z, .resample
+ dec c
+ jr nz, .next_trainer ; c <= 7 initialise all 7 trainers?
-BattleTower_ExecuteJumptable: ; 8b25b
- ld bc, 0
-.loop
- call .DoJumptableFunction
- call c, .PrintFailureText
- call .Next_CheckReachedEnd
- jr nz, .loop
+ ld hl, sBTTrainers
+ ld a, [sNrOfBeatenBattleTowerTrainers]
+ ld c, a
ld a, b
- and a
- ret
-; 8b26c
-
-.DoJumptableFunction: ; 8b26c
- push de
- push bc
- call .GetFunctionPointer
- ld a, c
- rst JumpTable
- pop bc
- pop de
- ret
-; 8b276
-
-.Next_CheckReachedEnd: ; 8b276
- inc c
- ld a, [de]
- cp c
- ret
-; 8b27a
-
-.GetFunctionPointer: ; 8b27a
- inc de
- ld a, [de]
- ld l, a
+ ld b, 0
+ add hl, bc
+ ld [hl], a
+
+ call CloseSRAM
+
+ push af
+; Copy name (10 bytes) and class (1 byte) of trainer
+ ld hl, BattleTowerTrainers
+ ld bc, NAME_LENGTH
+ call AddNTimes
+ ld bc, NAME_LENGTH
+ call CopyBytes
+
+ call Function_LoadRandomBattleTowerPkmn
+ pop af
+
+ ld hl, BattleTowerTrainerData
+ ld bc, BATTLETOWER_TRAINERDATALENGTH
+ call AddNTimes
+ ld bc, BATTLETOWER_TRAINERDATALENGTH
+.copy_bt_trainer_data_loop
+ ld a, BANK(BattleTowerTrainerData)
+ call GetFarByte
+ ld [de], a
+ inc hl
inc de
- ld a, [de]
- ld h, a
- ret
-; 8b281
+ dec bc
+ ld a, b
+ or c
+ jr nz, .copy_bt_trainer_data_loop
-.GetTextPointers: ; 8b281
- inc de
- inc de
- inc de
- ld a, [de]
- ld l, a
- inc de
- ld a, [de]
- ld h, a
- ret
-; 8b28a
+ pop af
+ ld [rSVBK], a
-.LoadTextPointer: ; 8b28a
- ld a, [hli]
- ld h, [hl]
- ld l, a
ret
-; 8b28e
-.PrintFailureText: ; 8b28e
- push de
- push bc
- ld a, b
- and a
- call z, .PrintFirstText
- pop bc
- call .PrintNthText
- ld b, $1
- pop de
- ret
-; 8b29d
-.PrintFirstText: ; 8b29d
- push de
- call .GetTextPointers
- call .LoadTextPointer
- call PrintText
- pop de
- ret
-; 8b2a9
-
-.PrintNthText: ; 8b2a9
+Function_LoadRandomBattleTowerPkmn: ; 1f8081
+ ld c, BATTLETOWER_NROFPKMNS
+.loop
push bc
- call .GetTextPointers
- inc hl
- inc hl
- ld b, $0
- add hl, bc
- add hl, bc
- call .LoadTextPointer
- call PrintText
- pop bc
- ret
-; 8b2bb
+ ld a, BANK(sBTPkmnPrevTrainer1)
+ call GetSRAMBank
-BattleTower_CheckPartyLengthIs3: ; 8b2bb
- ld a, [PartyCount]
- cp 3
- ret
-; 8b2c1
+.FindARandomBattleTowerPkmn:
+ ; From Which LevelGroup are the Pkmn loaded
+ ; a = 1..10
+ ld a, [wBTChoiceOfLvlGroup] ; [$d800]
+ dec a
+ ld hl, BattleTowerMons
+ ld bc, BattleTowerMons2 - BattleTowerMons1
+ call AddNTimes
-BattleTower_CheckPartyHasThreeMonsThatAreNotEggs: ; 8b2c1
- ld hl, PartyCount
+ ld a, [hRandomAdd]
+ ld b, a
+.resample
+ call Random
+ ld a, [hRandomAdd]
+ add b
+ ld b, a
+ and $1f
+ cp BATTLETOWER_NRMONSPERLEVELBRACKET
+ jr nc, .resample
+ ; in register 'a' is the chosen Pkmn of the LevelGroup
+
+ ; Check if Pkmn was already loaded before
+ ; Check current and the 2 previous teams
+ ; includes check if item is double at the current team
+ ld bc, PARTYMON_STRUCT_LENGTH + PKMN_NAME_LENGTH
+ call AddNTimes
ld a, [hli]
- ld b, $0
+ ld b, a
+ ld a, [hld]
ld c, a
-.loop
- ld a, [hli]
- cp EGG
- jr z, .egg
- inc b
-
-.egg
- dec c
- jr nz, .loop
- ld a, [PartyCount]
+ ld a, [BT_OTPkmn1]
cp b
- ret z
- ld a, b
- cp 3
- ret
-; 8b2da
-
-Function_PartyCountEq3: ; 8b2da
- ld a, [PartyCount]
- cp 3
- ret z
- scf
- ret
-; 8b2e2
+ jr z, .FindARandomBattleTowerPkmn
+ ld a, [BT_OTPkmn1Item]
+ cp c
+ jr z, .FindARandomBattleTowerPkmn
+ ld a, [BT_OTPkmn2]
+ cp b
+ jr z, .FindARandomBattleTowerPkmn
+ ld a, [BT_OTPkmn2Item]
+ cp c
+ jr z, .FindARandomBattleTowerPkmn
+ ld a, [BT_OTPkmn3]
+ cp b
+ jr z, .FindARandomBattleTowerPkmn
+ ld a, [BT_OTPkmn3Item]
+ cp c
+ jr z, .FindARandomBattleTowerPkmn
+ ld a, [sBTPkmnPrevTrainer1]
+ cp b
+ jr z, .FindARandomBattleTowerPkmn
+ ld a, [sBTPkmnPrevTrainer2]
+ cp b
+ jr z, .FindARandomBattleTowerPkmn
+ ld a, [sBTPkmnPrevTrainer3]
+ cp b
+ jr z, .FindARandomBattleTowerPkmn
+ ld a, [sBTPkmnPrevPrevTrainer1]
+ cp b
+ jr z, .FindARandomBattleTowerPkmn
+ ld a, [sBTPkmnPrevPrevTrainer2]
+ cp b
+ jr z, .FindARandomBattleTowerPkmn
+ ld a, [sBTPkmnPrevPrevTrainer3]
+ cp b
+ jr z, .FindARandomBattleTowerPkmn
-Function_PartySpeciesAreUnique: ; 8b2e2
- ld hl, PartyMon1Species
- call VerifyUniqueness
- ret
-; 8b2e9
+ ld bc, PARTYMON_STRUCT_LENGTH + PKMN_NAME_LENGTH
+ call CopyBytes
-VerifyUniqueness: ; 8b2e9
- ld de, PartyCount
- ld a, [de]
- inc de
- dec a
- jr z, .done
- ld b, a
-.loop
- push hl
+ ld a, [wNamedObjectIndexBuffer]
+ push af
push de
- ld c, b
- call .isegg
- jr z, .next
+ ld hl, - (PARTYMON_STRUCT_LENGTH + PKMN_NAME_LENGTH)
+ add hl, de
ld a, [hl]
- and a
- jr z, .next
-.loop2
- call .nextmon
- call .isegg
- jr z, .next2
- cp [hl]
- jr z, .gotcha
-
-.next2
- dec c
- jr nz, .loop2
-
-.next
- pop de
- pop hl
- call .nextmon
- dec b
- jr nz, .loop
-
-.done
- and a
- ret
-
-.gotcha
- pop de
- pop hl
- scf
- ret
-; 8b31a
-
-.nextmon ; 8b31a
- push bc
+ ld [wNamedObjectIndexBuffer], a
ld bc, PARTYMON_STRUCT_LENGTH
add hl, bc
- inc de
- pop bc
- ret
-; 8b322
+ push hl
+ call GetPokemonName
+ ld h, d
+ ld l, e
+ pop de
+ ld bc, PKMN_NAME_LENGTH
+ call CopyBytes
-.isegg ; 8b322
- push bc
- ld b, a
- ld a, [de]
- cp EGG
- ld a, b
+ pop de
+ pop af
+ ld [wNamedObjectIndexBuffer], a
pop bc
- ret
-; 8b32a
-
-Function_PartyItemsAreUnique: ; 8b32a
- ld hl, PartyMon1Item
- call VerifyUniqueness
- ret
-; 8b331
-
-Function_HasPartyAnEgg: ; 8b331
- ld hl, PartyCount
- ld a, [hli]
- ld c, a
-.loop
- ld a, [hli]
- cp EGG
- jr z, .found
dec c
- jr nz, .loop
- and a
- ret
-
-.found
- scf
- ret
-; 8b342
+ jp nz, .loop
+
+ ld a, [sBTPkmnPrevTrainer1]
+ ld [sBTPkmnPrevPrevTrainer1], a
+ ld a, [sBTPkmnPrevTrainer2]
+ ld [sBTPkmnPrevPrevTrainer2], a
+ ld a, [sBTPkmnPrevTrainer3]
+ ld [sBTPkmnPrevPrevTrainer3], a
+ ld a, [BT_OTPkmn1]
+ ld [sBTPkmnPrevTrainer1], a
+ ld a, [BT_OTPkmn2]
+ ld [sBTPkmnPrevTrainer2], a
+ ld a, [BT_OTPkmn3]
+ ld [sBTPkmnPrevTrainer3], a
+ call CloseSRAM
+ ret
+; 1f814e
+
+INCLUDE "data/battle_tower.asm"
diff --git a/events/battle_tower_rules.asm b/events/battle_tower_rules.asm
new file mode 100644
index 000000000..de6022145
--- /dev/null
+++ b/events/battle_tower_rules.asm
@@ -0,0 +1,342 @@
+CheckForMobileBattleRules: ; 8b1e1
+ ld de, .PointerTables
+ call BattleTower_ExecuteJumptable
+ ret z
+ call BattleTower_PleaseReturnWhenReady
+ scf
+ ret
+; 8b1ed
+
+.PointerTables: ; 8b1ed
+ db 2
+ dw .Functions
+ dw .TextPointers
+
+.Functions: ; 8b1f2
+ dw BattleTower_CheckPartyLengthIs3
+ dw BattleTower_CheckPartyHasThreeMonsThatAreNotEggs
+; 8b1f6
+
+.TextPointers: ; 8b1f6
+ dw .ExcuseMeText
+ dw JumpText_NeedAtLeastThreeMon
+ dw JumpText_EggDoesNotQualify
+; 8b1fc
+
+.ExcuseMeText: ; 0x8b1fc
+ ; Excuse me!
+ text_jump UnknownText_0x1c5937
+ db "@"
+; 0x8b201
+
+CheckForBattleTowerRules: ; 8b201
+ ld hl, StringBuffer2
+ ld [hl], "3"
+ inc hl
+ ld [hl], "@"
+ ld de, .PointerTables
+ call BattleTower_ExecuteJumptable
+ ret z
+ call BattleTower_PleaseReturnWhenReady
+ scf
+ ret
+; 8b215
+
+.PointerTables: ; 8b215
+ db 4
+ dw .Functions
+ dw .TextPointers
+
+.Functions: ; 8b21a
+ dw Function_PartyCountEq3
+ dw Function_PartySpeciesAreUnique
+ dw Function_PartyItemsAreUnique
+ dw Function_HasPartyAnEgg
+; 8b222
+
+.TextPointers: ; 8b222
+ dw JumpText_ExcuseMeYoureNotReady
+ dw JumpText_OnlyThreePkmnMayBeEntered
+ dw JumpText_ThePkmnMustAllBeDifferentKinds
+ dw JumpText_ThePkmnMustNotHoldTheSameItems
+ dw JumpText_YouCantTakeAnEgg
+; 8b22c
+
+JumpText_ExcuseMeYoureNotReady: ; 0x8b22c
+ ; Excuse me. You're not ready.
+ text_jump Text_ExcuseMeYoureNotReady
+ db "@"
+; 0x8b231
+
+BattleTower_PleaseReturnWhenReady: ; 8b231
+ ld hl, .PleaseReturnWhenReady
+ call PrintText
+ ret
+; 8b238
+
+.PleaseReturnWhenReady: ; 0x8b238
+ ; Please return when you're ready.
+ text_jump UnknownText_0x1c5962
+ db "@"
+; 0x8b23d
+
+JumpText_NeedAtLeastThreeMon: ; 0x8b23d
+ ; You need at least three #MON.
+ text_jump UnknownText_0x1c5983
+ db "@"
+; 0x8b242
+
+JumpText_EggDoesNotQualify: ; 0x8b242
+ ; Sorry, an EGG doesn't qualify.
+ text_jump UnknownText_0x1c59a3
+ db "@"
+; 0x8b247
+
+JumpText_OnlyThreePkmnMayBeEntered: ; 0x8b247
+ ; Only three #MON may be entered.
+ text_jump Text_OnlyThreePkmnMayBeEntered
+ db "@"
+; 0x8b24c
+
+JumpText_ThePkmnMustAllBeDifferentKinds: ; 0x8b24c
+ ; The @ #MON must all be different kinds.
+ text_jump Text_ThePkmnMustAllBeDifferentKinds
+ db "@"
+; 0x8b251
+
+JumpText_ThePkmnMustNotHoldTheSameItems: ; 0x8b251
+ ; The @ #MON must not hold the same items.
+ text_jump Text_ThePkmnMustNotHoldTheSameItems
+ db "@"
+; 0x8b256
+
+JumpText_YouCantTakeAnEgg: ; 0x8b256
+ ; You can't take an EGG!
+ text_jump Text_YouCantTakeAnEgg
+ db "@"
+; 0x8b25b
+
+BattleTower_ExecuteJumptable: ; 8b25b
+ ld bc, 0
+.loop
+ call .DoJumptableFunction
+ call c, .PrintFailureText
+ call .Next_CheckReachedEnd
+ jr nz, .loop
+ ld a, b
+ and a
+ ret
+; 8b26c
+
+.DoJumptableFunction: ; 8b26c
+ push de
+ push bc
+ call .GetFunctionPointer
+ ld a, c
+ rst JumpTable
+ pop bc
+ pop de
+ ret
+; 8b276
+
+.Next_CheckReachedEnd: ; 8b276
+ inc c
+ ld a, [de]
+ cp c
+ ret
+; 8b27a
+
+.GetFunctionPointer: ; 8b27a
+ inc de
+ ld a, [de]
+ ld l, a
+ inc de
+ ld a, [de]
+ ld h, a
+ ret
+; 8b281
+
+.GetTextPointers: ; 8b281
+ inc de
+ inc de
+ inc de
+ ld a, [de]
+ ld l, a
+ inc de
+ ld a, [de]
+ ld h, a
+ ret
+; 8b28a
+
+.LoadTextPointer: ; 8b28a
+ ld a, [hli]
+ ld h, [hl]
+ ld l, a
+ ret
+; 8b28e
+
+.PrintFailureText: ; 8b28e
+ push de
+ push bc
+ ld a, b
+ and a
+ call z, .PrintFirstText
+ pop bc
+ call .PrintNthText
+ ld b, $1
+ pop de
+ ret
+; 8b29d
+
+.PrintFirstText: ; 8b29d
+ push de
+ call .GetTextPointers
+ call .LoadTextPointer
+ call PrintText
+ pop de
+ ret
+; 8b2a9
+
+.PrintNthText: ; 8b2a9
+ push bc
+ call .GetTextPointers
+ inc hl
+ inc hl
+ ld b, $0
+ add hl, bc
+ add hl, bc
+ call .LoadTextPointer
+ call PrintText
+ pop bc
+ ret
+; 8b2bb
+
+BattleTower_CheckPartyLengthIs3: ; 8b2bb
+ ld a, [PartyCount]
+ cp 3
+ ret
+; 8b2c1
+
+BattleTower_CheckPartyHasThreeMonsThatAreNotEggs: ; 8b2c1
+ ld hl, PartyCount
+ ld a, [hli]
+ ld b, $0
+ ld c, a
+.loop
+ ld a, [hli]
+ cp EGG
+ jr z, .egg
+ inc b
+
+.egg
+ dec c
+ jr nz, .loop
+ ld a, [PartyCount]
+ cp b
+ ret z
+ ld a, b
+ cp 3
+ ret
+; 8b2da
+
+Function_PartyCountEq3: ; 8b2da
+ ld a, [PartyCount]
+ cp 3
+ ret z
+ scf
+ ret
+; 8b2e2
+
+Function_PartySpeciesAreUnique: ; 8b2e2
+ ld hl, PartyMon1Species
+ call VerifyUniqueness
+ ret
+; 8b2e9
+
+VerifyUniqueness: ; 8b2e9
+ ld de, PartyCount
+ ld a, [de]
+ inc de
+ dec a
+ jr z, .done
+ ld b, a
+.loop
+ push hl
+ push de
+ ld c, b
+ call .isegg
+ jr z, .next
+ ld a, [hl]
+ and a
+ jr z, .next
+.loop2
+ call .nextmon
+ call .isegg
+ jr z, .next2
+ cp [hl]
+ jr z, .gotcha
+
+.next2
+ dec c
+ jr nz, .loop2
+
+.next
+ pop de
+ pop hl
+ call .nextmon
+ dec b
+ jr nz, .loop
+
+.done
+ and a
+ ret
+
+.gotcha
+ pop de
+ pop hl
+ scf
+ ret
+; 8b31a
+
+.nextmon ; 8b31a
+ push bc
+ ld bc, PARTYMON_STRUCT_LENGTH
+ add hl, bc
+ inc de
+ pop bc
+ ret
+; 8b322
+
+.isegg ; 8b322
+ push bc
+ ld b, a
+ ld a, [de]
+ cp EGG
+ ld a, b
+ pop bc
+ ret
+; 8b32a
+
+Function_PartyItemsAreUnique: ; 8b32a
+ ld hl, PartyMon1Item
+ call VerifyUniqueness
+ ret
+; 8b331
+
+Function_HasPartyAnEgg: ; 8b331
+ ld hl, PartyCount
+ ld a, [hli]
+ ld c, a
+.loop
+ ld a, [hli]
+ cp EGG
+ jr z, .found
+ dec c
+ jr nz, .loop
+ and a
+ ret
+
+.found
+ scf
+ ret
+; 8b342
diff --git a/events/happiness_egg.asm b/events/happiness_egg.asm
index a1ade1364..a4ae8b7e6 100755
--- a/events/happiness_egg.asm
+++ b/events/happiness_egg.asm
@@ -73,7 +73,7 @@ ChangeHappiness: ; 71c2
ld d, 0
add hl, de
ld a, [hl]
- cp $64 ; $80?
+ cp $64 ; why not $80?
pop de
ld a, [de]
@@ -141,7 +141,9 @@ StepHappiness:: ; 725a
jr nz, .loop
ret
+
DayCareStep:: ; 7282
+; Raise the experience of Day-Care Pokémon every step cycle.
ld a, [wDayCareMan]
bit 0, a
diff --git a/events/odd_egg.asm b/events/odd_egg.asm
new file mode 100644
index 000000000..4cbeb34dc
--- /dev/null
+++ b/events/odd_egg.asm
@@ -0,0 +1,96 @@
+GiveOddEgg: ; 1fb4b6
+ ; Figure out which egg to give.
+
+ ; Compare a random word to
+ ; probabilities out of 0xffff.
+ call Random
+ ld hl, OddEggProbabilities
+ ld c, 0
+ ld b, c
+.loop
+ ld a, [hli]
+ ld e, a
+ ld a, [hli]
+ ld d, a
+
+ ; Break on $ffff.
+ ld a, d
+ cp HIGH($ffff)
+ jr nz, .not_done
+ ld a, e
+ cp LOW($ffff)
+ jr z, .done
+.not_done
+
+ ; Break when [hRandom] <= de.
+ ld a, [hRandom + 1]
+ cp d
+ jr c, .done
+ jr z, .ok
+ jr .next
+.ok
+ ld a, [hRandom + 0]
+ cp e
+ jr c, .done
+ jr z, .done
+.next
+ inc bc
+ jr .loop
+.done
+
+ ld hl, OddEggs
+ ld a, OddEgg2 - OddEgg1
+ call AddNTimes
+
+ ld de, OddEggSpecies
+ ld bc, PARTYMON_STRUCT_LENGTH + 2 * PKMN_NAME_LENGTH
+ call CopyBytes
+
+ ld a, EGG_TICKET
+ ld [CurItem], a
+ ld a, 1
+ ld [wItemQuantityChangeBuffer], a
+ ld a, -1
+ ld [CurItemQuantity], a
+ ld hl, NumItems
+ call TossItem
+
+ ; load species in wcd2a
+ ld a, EGG
+ ld [wMobileMonSpeciesBuffer], a
+
+ ; load pointer to (wMobileMonSpeciesBuffer - 1) in wMobileMonSpeciesPointerBuffer
+ ld a, LOW(wMobileMonSpeciesBuffer - 1)
+ ld [wMobileMonSpeciesPointerBuffer], a
+ ld a, HIGH(wMobileMonSpeciesBuffer - 1)
+ ld [wMobileMonSpeciesPointerBuffer + 1], a
+ ; load pointer to OddEggSpecies in wMobileMonStructurePointerBuffer
+ ld a, LOW(OddEggSpecies)
+ ld [wMobileMonStructurePointerBuffer], a
+ ld a, HIGH(OddEggSpecies)
+ ld [wMobileMonStructurePointerBuffer + 1], a
+
+ ; load Odd Egg Name in wTempOddEggNickname
+ ld hl, .Odd
+ ld de, wTempOddEggNickname
+ ld bc, PKMN_NAME_LENGTH
+ call CopyBytes
+
+ ; load pointer to wTempOddEggNickname in wMobileMonOTNamePointerBuffer
+ ld a, LOW(wTempOddEggNickname)
+ ld [wMobileMonOTNamePointerBuffer], a
+ ld a, HIGH(wTempOddEggNickname)
+ ld [wMobileMonOTNamePointerBuffer + 1], a
+ ; load pointer to wOddEggName in wMobileMonNicknamePointerBuffer
+ ld a, LOW(wOddEggName)
+ ld [wMobileMonNicknamePointerBuffer], a
+ ld a, HIGH(wOddEggName)
+ ld [wMobileMonNicknamePointerBuffer + 1], a
+ farcall AddMobileMonToParty
+ ret
+; 1fb546
+
+.Odd:
+ db "ODD@@@@@@@@@"
+
+INCLUDE "data/odd_eggs.asm"