summaryrefslogtreecommitdiff
path: root/engine/events/happiness_egg.asm
diff options
context:
space:
mode:
Diffstat (limited to 'engine/events/happiness_egg.asm')
-rwxr-xr-xengine/events/happiness_egg.asm223
1 files changed, 223 insertions, 0 deletions
diff --git a/engine/events/happiness_egg.asm b/engine/events/happiness_egg.asm
new file mode 100755
index 000000000..a4ae8b7e6
--- /dev/null
+++ b/engine/events/happiness_egg.asm
@@ -0,0 +1,223 @@
+GetFirstPokemonHappiness: ; 718d
+ ld hl, PartyMon1Happiness
+ ld bc, PARTYMON_STRUCT_LENGTH
+ ld de, PartySpecies
+.loop
+ ld a, [de]
+ cp EGG
+ jr nz, .done
+ inc de
+ add hl, bc
+ jr .loop
+
+.done
+ ld [wd265], a
+ ld a, [hl]
+ ld [ScriptVar], a
+ call GetPokemonName
+ jp CopyPokemonName_Buffer1_Buffer3
+
+CheckFirstMonIsEgg: ; 71ac
+ ld a, [PartySpecies]
+ ld [wd265], a
+ cp EGG
+ ld a, $1
+ jr z, .egg
+ xor a
+
+.egg
+ ld [ScriptVar], a
+ call GetPokemonName
+ jp CopyPokemonName_Buffer1_Buffer3
+
+ChangeHappiness: ; 71c2
+; Perform happiness action c on CurPartyMon
+
+ ld a, [CurPartyMon]
+ inc a
+ ld e, a
+ ld d, 0
+ ld hl, PartySpecies - 1
+ add hl, de
+ ld a, [hl]
+ cp EGG
+ ret z
+
+ push bc
+ ld hl, PartyMon1Happiness
+ ld bc, PARTYMON_STRUCT_LENGTH
+ ld a, [CurPartyMon]
+ call AddNTimes
+ pop bc
+
+ ld d, h
+ ld e, l
+
+ push de
+ ld a, [de]
+ cp HAPPINESS_THRESHOLD_1
+ ld e, 0
+ jr c, .ok
+ inc e
+ cp HAPPINESS_THRESHOLD_2
+ jr c, .ok
+ inc e
+
+.ok
+ dec c
+ ld b, 0
+ ld hl, HappinessChanges
+ add hl, bc
+ add hl, bc
+ add hl, bc
+ ld d, 0
+ add hl, de
+ ld a, [hl]
+ cp $64 ; why not $80?
+ pop de
+
+ ld a, [de]
+ jr nc, .negative
+ add [hl]
+ jr nc, .done
+ ld a, -1
+ jr .done
+
+.negative
+ add [hl]
+ jr c, .done
+ xor a
+
+.done
+ ld [de], a
+ ld a, [wBattleMode]
+ and a
+ ret z
+ ld a, [CurPartyMon]
+ ld b, a
+ ld a, [wPartyMenuCursor]
+ cp b
+ ret nz
+ ld a, [de]
+ ld [BattleMonHappiness], a
+ ret
+
+
+INCLUDE "data/happiness_changes.asm"
+
+
+StepHappiness:: ; 725a
+; Raise the party's happiness by 1 point every other step cycle.
+
+ ld hl, wHappinessStepCount
+ ld a, [hl]
+ inc a
+ and 1
+ ld [hl], a
+ ret nz
+
+ ld de, PartyCount
+ ld a, [de]
+ and a
+ ret z
+
+ ld c, a
+ ld hl, PartyMon1Happiness
+.loop
+ inc de
+ ld a, [de]
+ cp EGG
+ jr z, .next
+ inc [hl]
+ jr nz, .next
+ ld [hl], $ff
+
+.next
+ push de
+ ld de, PARTYMON_STRUCT_LENGTH
+ add hl, de
+ pop de
+ dec c
+ jr nz, .loop
+ ret
+
+
+DayCareStep:: ; 7282
+; Raise the experience of Day-Care Pokémon every step cycle.
+
+ ld a, [wDayCareMan]
+ bit 0, a
+ jr z, .day_care_lady
+
+ ld a, [wBreedMon1Level] ; level
+ cp MAX_LEVEL
+ jr nc, .day_care_lady
+ ld hl, wBreedMon1Exp + 2 ; exp
+ inc [hl]
+ jr nz, .day_care_lady
+ dec hl
+ inc [hl]
+ jr nz, .day_care_lady
+ dec hl
+ inc [hl]
+ ld a, [hl]
+ cp HIGH(MAX_DAY_CARE_EXP >> 8)
+ jr c, .day_care_lady
+ ld a, HIGH(MAX_DAY_CARE_EXP >> 8)
+ ld [hl], a
+
+.day_care_lady
+ ld a, [wDayCareLady]
+ bit 0, a
+ jr z, .check_egg
+
+ ld a, [wBreedMon2Level] ; level
+ cp MAX_LEVEL
+ jr nc, .check_egg
+ ld hl, wBreedMon2Exp + 2 ; exp
+ inc [hl]
+ jr nz, .check_egg
+ dec hl
+ inc [hl]
+ jr nz, .check_egg
+ dec hl
+ inc [hl]
+ ld a, [hl]
+ cp HIGH(MAX_DAY_CARE_EXP >> 8)
+ jr c, .check_egg
+ ld a, HIGH(MAX_DAY_CARE_EXP >> 8)
+ ld [hl], a
+
+.check_egg
+ ld hl, wDayCareMan
+ bit 5, [hl] ; egg
+ ret z
+ ld hl, wStepsToEgg
+ dec [hl]
+ ret nz
+
+ call Random
+ ld [hl], a
+ callfar CheckBreedmonCompatibility
+ ld a, [wd265]
+ cp 230
+ ld b, 32 percent - 1
+ jr nc, .okay
+ ld a, [wd265]
+ cp 170
+ ld b, 16 percent
+ jr nc, .okay
+ ld a, [wd265]
+ cp 110
+ ld b, 12 percent
+ jr nc, .okay
+ ld b, 4 percent
+
+.okay
+ call Random
+ cp b
+ ret nc
+ ld hl, wDayCareMan
+ res 5, [hl]
+ set 6, [hl]
+ ret