diff --git a/data/evolution_mode_indicator_sets.asm b/data/evolution_mode_indicator_sets.asm index f82dfb5..b159c31 100644 --- a/data/evolution_mode_indicator_sets.asm +++ b/data/evolution_mode_indicator_sets.asm @@ -1,153 +1,160 @@ -Data_1298b: ; 0x1298b -; This has to do with which indicators will need to be hit to evolve the pokemon. - db $01 ; BULBASAUR - db $02 ; IVYSAUR - db $03 ; VENUSAUR - db $01 ; CHARMANDER - db $02 ; CHARMELEON - db $03 ; CHARIZARD - db $01 ; SQUIRTLE - db $02 ; WARTORTLE - db $03 ; BLASTOISE - db $01 ; CATERPIE - db $02 ; METAPOD - db $03 ; BUTTERFREE - db $01 ; WEEDLE - db $02 ; KAKUNA - db $03 ; BEEDRILL - db $01 ; PIDGEY - db $02 ; PIDGEOTTO - db $03 ; PIDGEOT - db $01 ; RATTATA - db $03 ; RATICATE - db $01 ; SPEAROW - db $03 ; FEAROW - db $01 ; EKANS - db $03 ; ARBOK - db $01 ; PIKACHU - db $03 ; RAICHU - db $01 ; SANDSHREW - db $03 ; SANDSLASH - db $01 ; NIDORAN_F - db $02 ; NIDORINA - db $04 ; NIDOQUEEN - db $01 ; NIDORAN_M - db $02 ; NIDORINO - db $04 ; NIDOKING - db $02 ; CLEFAIRY - db $03 ; CLEFABLE - db $02 ; VULPIX - db $03 ; NINETALES - db $02 ; JIGGLYPUFF - db $03 ; WIGGLYTUFF - db $02 ; ZUBAT - db $03 ; GOLBAT - db $01 ; ODDISH - db $02 ; GLOOM - db $04 ; VILEPLUME - db $02 ; PARAS - db $03 ; PARASECT - db $02 ; VENONAT - db $03 ; VENOMOTH - db $02 ; DIGLETT - db $03 ; DUGTRIO - db $02 ; MEOWTH - db $03 ; PERSIAN - db $02 ; PSYDUCK - db $03 ; GOLDUCK - db $02 ; MANKEY - db $03 ; PRIMEAPE - db $02 ; GROWLITHE - db $03 ; ARCANINE - db $01 ; POLIWAG - db $02 ; POLIWHIRL - db $04 ; POLIWRATH - db $01 ; ABRA - db $02 ; KADABRA - db $04 ; ALAKAZAM - db $01 ; MACHOP - db $02 ; MACHOKE - db $04 ; MACHAMP - db $01 ; BELLSPROUT - db $02 ; WEEPINBELL - db $04 ; VICTREEBEL - db $02 ; TENTACOOL - db $03 ; TENTACRUEL - db $01 ; GEODUDE - db $02 ; GRAVELER - db $04 ; GOLEM - db $02 ; PONYTA - db $03 ; RAPIDASH - db $02 ; SLOWPOKE - db $03 ; SLOWBRO - db $02 ; MAGNEMITE - db $03 ; MAGNETON - db $04 ; FARFETCH_D - db $02 ; DODUO - db $03 ; DODRIO - db $02 ; SEEL - db $03 ; DEWGONG - db $02 ; GRIMER - db $03 ; MUK - db $02 ; SHELLDER - db $03 ; CLOYSTER - db $01 ; GASTLY - db $02 ; HAUNTER - db $04 ; GENGAR - db $04 ; ONIX - db $02 ; DROWZEE - db $03 ; HYPNO - db $02 ; KRABBY - db $03 ; KINGLER - db $02 ; VOLTORB - db $03 ; ELECTRODE - db $02 ; EXEGGCUTE - db $03 ; EXEGGUTOR - db $02 ; CUBONE - db $03 ; MAROWAK - db $04 ; HITMONLEE - db $04 ; HITMONCHAN - db $04 ; LICKITUNG - db $02 ; KOFFING - db $03 ; WEEZING - db $02 ; RHYHORN - db $03 ; RHYDON - db $04 ; CHANSEY - db $04 ; TANGELA - db $04 ; KANGASKHAN - db $04 ; HORSEA - db $04 ; SEADRA - db $02 ; GOLDEEN - db $03 ; SEAKING - db $02 ; STARYU - db $03 ; STARMIE - db $04 ; MR_MIME - db $04 ; SCYTHER - db $04 ; JYNX - db $04 ; ELECTABUZZ - db $04 ; MAGMAR - db $04 ; PINSIR - db $04 ; TAUROS - db $02 ; MAGIKARP - db $03 ; GYARADOS - db $04 ; LAPRAS - db $04 ; DITTO - db $02 ; EEVEE - db $03 ; VAPOREON - db $03 ; JOLTEON - db $03 ; FLAREON - db $04 ; PORYGON - db $02 ; OMANYTE - db $03 ; OMASTAR - db $02 ; KABUTO - db $03 ; KABUTOPS - db $04 ; AERODACTYL - db $04 ; SNORLAX - db $04 ; ARTICUNO - db $04 ; ZAPDOS - db $04 ; MOLTRES - db $01 ; DRATINI - db $02 ; DRAGONAIR - db $04 ; DRAGONITE - db $04 ; MEWTWO - db $06 ; MEW +MonEvolutionObjectCounts: ; 0x1298b +; See wNumPossibleEvolutionObjects +; The values in this table are effectively 3 less than the actual number of +; possible evolution objects that can produce trinkets. For example, IVYSAUR +; specifies a value of 2 in this table. This means that a total of 5 field +; objects are candidates that could produce an evolution trinket when hit with +; the pinball. +; +; There are some unused values in this table, which have functional support: 0, 5, and 7. + db 1 ; BULBASAUR + db 2 ; IVYSAUR + db 3 ; VENUSAUR + db 1 ; CHARMANDER + db 2 ; CHARMELEON + db 3 ; CHARIZARD + db 1 ; SQUIRTLE + db 2 ; WARTORTLE + db 3 ; BLASTOISE + db 1 ; CATERPIE + db 2 ; METAPOD + db 3 ; BUTTERFREE + db 1 ; WEEDLE + db 2 ; KAKUNA + db 3 ; BEEDRILL + db 1 ; PIDGEY + db 2 ; PIDGEOTTO + db 3 ; PIDGEOT + db 1 ; RATTATA + db 3 ; RATICATE + db 1 ; SPEAROW + db 3 ; FEAROW + db 1 ; EKANS + db 3 ; ARBOK + db 1 ; PIKACHU + db 3 ; RAICHU + db 1 ; SANDSHREW + db 3 ; SANDSLASH + db 1 ; NIDORAN_F + db 2 ; NIDORINA + db 4 ; NIDOQUEEN + db 1 ; NIDORAN_M + db 2 ; NIDORINO + db 4 ; NIDOKING + db 2 ; CLEFAIRY + db 3 ; CLEFABLE + db 2 ; VULPIX + db 3 ; NINETALES + db 2 ; JIGGLYPUFF + db 3 ; WIGGLYTUFF + db 2 ; ZUBAT + db 3 ; GOLBAT + db 1 ; ODDISH + db 2 ; GLOOM + db 4 ; VILEPLUME + db 2 ; PARAS + db 3 ; PARASECT + db 2 ; VENONAT + db 3 ; VENOMOTH + db 2 ; DIGLETT + db 3 ; DUGTRIO + db 2 ; MEOWTH + db 3 ; PERSIAN + db 2 ; PSYDUCK + db 3 ; GOLDUCK + db 2 ; MANKEY + db 3 ; PRIMEAPE + db 2 ; GROWLITHE + db 3 ; ARCANINE + db 1 ; POLIWAG + db 2 ; POLIWHIRL + db 4 ; POLIWRATH + db 1 ; ABRA + db 2 ; KADABRA + db 4 ; ALAKAZAM + db 1 ; MACHOP + db 2 ; MACHOKE + db 4 ; MACHAMP + db 1 ; BELLSPROUT + db 2 ; WEEPINBELL + db 4 ; VICTREEBEL + db 2 ; TENTACOOL + db 3 ; TENTACRUEL + db 1 ; GEODUDE + db 2 ; GRAVELER + db 4 ; GOLEM + db 2 ; PONYTA + db 3 ; RAPIDASH + db 2 ; SLOWPOKE + db 3 ; SLOWBRO + db 2 ; MAGNEMITE + db 3 ; MAGNETON + db 4 ; FARFETCH_D + db 2 ; DODUO + db 3 ; DODRIO + db 2 ; SEEL + db 3 ; DEWGONG + db 2 ; GRIMER + db 3 ; MUK + db 2 ; SHELLDER + db 3 ; CLOYSTER + db 1 ; GASTLY + db 2 ; HAUNTER + db 4 ; GENGAR + db 4 ; ONIX + db 2 ; DROWZEE + db 3 ; HYPNO + db 2 ; KRABBY + db 3 ; KINGLER + db 2 ; VOLTORB + db 3 ; ELECTRODE + db 2 ; EXEGGCUTE + db 3 ; EXEGGUTOR + db 2 ; CUBONE + db 3 ; MAROWAK + db 4 ; HITMONLEE + db 4 ; HITMONCHAN + db 4 ; LICKITUNG + db 2 ; KOFFING + db 3 ; WEEZING + db 2 ; RHYHORN + db 3 ; RHYDON + db 4 ; CHANSEY + db 4 ; TANGELA + db 4 ; KANGASKHAN + db 4 ; HORSEA + db 4 ; SEADRA + db 2 ; GOLDEEN + db 3 ; SEAKING + db 2 ; STARYU + db 3 ; STARMIE + db 4 ; MR_MIME + db 4 ; SCYTHER + db 4 ; JYNX + db 4 ; ELECTABUZZ + db 4 ; MAGMAR + db 4 ; PINSIR + db 4 ; TAUROS + db 2 ; MAGIKARP + db 3 ; GYARADOS + db 4 ; LAPRAS + db 4 ; DITTO + db 2 ; EEVEE + db 3 ; VAPOREON + db 3 ; JOLTEON + db 3 ; FLAREON + db 4 ; PORYGON + db 2 ; OMANYTE + db 3 ; OMASTAR + db 2 ; KABUTO + db 3 ; KABUTOPS + db 4 ; AERODACTYL + db 4 ; SNORLAX + db 4 ; ARTICUNO + db 4 ; ZAPDOS + db 4 ; MOLTRES + db 1 ; DRATINI + db 2 ; DRAGONAIR + db 4 ; DRAGONITE + db 4 ; MEWTWO + db 6 ; MEW diff --git a/engine/pinball_game/catchem_mode.asm b/engine/pinball_game/catchem_mode.asm index a5593c7..20498d2 100644 --- a/engine/pinball_game/catchem_mode.asm +++ b/engine/pinball_game/catchem_mode.asm @@ -1114,7 +1114,7 @@ ResetIndicatorStates: ; 0x107a5 jr nz, .loop ret -Func_107b0: ; 0x107b0 +CloseSlotCave_: ; 0x107b0 xor a ld [wSlotIsOpen], a ld [wIndicatorStates + 4], a @@ -1249,7 +1249,7 @@ Func_10871: ; 0x10871 jr nz, .loop xor a ld [wRightAlleyCount], a - call Func_107b0 + call CloseSlotCave_ ld a, $4 ld [wd7ad], a ld de, MUSIC_CATCH_EM_BLUE ; This is either MUSIC_CATCH_EM_BLUE or MUSIC_CATCH_EM_RED. They happen to have the same id in their respective audio Banks. diff --git a/engine/pinball_game/draw_sprites/draw_blue_field_sprites.asm b/engine/pinball_game/draw_sprites/draw_blue_field_sprites.asm index 9776e22..c2a3748 100644 --- a/engine/pinball_game/draw_sprites/draw_blue_field_sprites.asm +++ b/engine/pinball_game/draw_sprites/draw_blue_field_sprites.asm @@ -284,7 +284,7 @@ DrawEvolutionTrinket_BlueFieldTop: ; 0x1f4f8 ld a, [wEvolutionObjectsDisabled] and a ret z - ld de, wd566 + ld de, wActiveEvolutionTrinkets ld hl, EvolutionTrinketOAMOffsets_BlueFieldTop ld b, $c ld c, $47 @@ -294,7 +294,7 @@ DrawEvolutionTrinket_BlueFieldBottom: ; 0x1f509 ld a, [wEvolutionObjectsDisabled] and a ret z - ld de, wd572 + ld de, wActiveEvolutionTrinkets + 12 ld hl, EvolutionTrinketOAMOffsets_BlueFieldBottom ld b, $6 ld c, $40 diff --git a/engine/pinball_game/draw_sprites/draw_red_field_sprites.asm b/engine/pinball_game/draw_sprites/draw_red_field_sprites.asm index 9e870b6..340d879 100644 --- a/engine/pinball_game/draw_sprites/draw_red_field_sprites.asm +++ b/engine/pinball_game/draw_sprites/draw_red_field_sprites.asm @@ -476,7 +476,7 @@ DrawEvolutionTrinket_RedFieldTop: ; 0x17f64 ld a, [wEvolutionObjectsDisabled] and a ret z - ld de, wd566 + ld de, wActiveEvolutionTrinkets ld hl, EvolutionTrinketOAMOffsets_RedFieldTop ld b, $c ld c, $39 @@ -486,7 +486,7 @@ DrawEvolutionTrinket_RedFieldBottom: ; 0x17f75 ld a, [wEvolutionObjectsDisabled] and a ret z - ld de, wd572 + ld de, wActiveEvolutionTrinkets + 12 ld hl, EvolutionTrinketOAMOffsets_RedFieldBottom ld b, $6 ld c, $40 diff --git a/engine/pinball_game/evolution_mode.asm b/engine/pinball_game/evolution_mode.asm index 7446144..011425b 100644 --- a/engine/pinball_game/evolution_mode.asm +++ b/engine/pinball_game/evolution_mode.asm @@ -389,18 +389,18 @@ InitEvolutionModeForMon: ; 0x10d1d ld a, [wCurrentCatchEmMon] ld c, a ld b, $0 - ld hl, Data_1298b + ld hl, MonEvolutionObjectCounts add hl, bc ld a, [hl] - add $2 - ld [wd555], a + add 2 + ld [wNumPossibleEvolutionObjects], a xor a - ld hl, wd566 - ld b, $13 -.asm_10d40 + ld hl, wActiveEvolutionTrinkets + ld b, 18 + 1 ; This goes out of bounds by 1--it's supposed to be 18. Doesn't result in any bad behavior, though. +.clearEvoTrinketsLoop ld [hli], a dec b - jr nz, .asm_10d40 + jr nz, .clearEvoTrinketsLoop ld a, [wCurrentCatchEmMon] ld c, a ld b, $0 @@ -432,17 +432,17 @@ InitEvolutionModeForMon: ; 0x10d1d .countMonEvolutionsLoop ld a, [hli] and a - jr z, .noEvolution + jr z, .nextEvolution inc c -.noEvolution +.nextEvolution inc hl dec b jr nz, .countMonEvolutionsLoop ld a, c cp $ff - jr nz, .asm_10d8a + jr nz, .chooseEvolution xor a -.asm_10d8a +.chooseEvolution call RandomRange sla a ld c, a @@ -451,37 +451,40 @@ InitEvolutionModeForMon: ; 0x10d1d ld a, [hli] ; a = mon id of evolution dec a ld [wCurrentEvolutionMon], a - ld a, [hl] ; a = evoluion type id + ld a, [hl] ; a = evolution type id ld [wCurrentEvolutionType], a xor a ld [wNumEvolutionTrinkets], a ld [wEvolutionTrinketCooldownFrames], a ld [wEvolutionTrinketCooldownFrames + 1], a - ld hl, wd55c - ld a, $1 - ld b, $3 -.asm_10dac + ; Randomly set three entries in wEvolutionObjectStates to $1. + ; Each mon has a specified range of which entries can be set to $1. + ; The idea is that rarer mons can have harder-to-hit objects. + ld hl, wEvolutionObjectStates + ld a, 1 + ld b, 3 +.initLoop1 ld [hli], a dec b - jr nz, .asm_10dac + jr nz, .initLoop1 xor a - ld b, $7 -.asm_10db3 + ld b, 7 +.initLoop2 ld [hli], a dec b - jr nz, .asm_10db3 - ld de, wd55c - ld a, [wd555] + jr nz, .initLoop2 + ld de, wEvolutionObjectStates + ld a, [wNumPossibleEvolutionObjects] ld c, a inc a ld b, a -.asm_10dc0 +.shuffleLoop push bc ld a, c call RandomRange ld c, a ld b, $0 - ld hl, wd55c + ld hl, wEvolutionObjectStates add hl, bc ld c, [hl] ld a, [de] @@ -491,7 +494,7 @@ InitEvolutionModeForMon: ; 0x10d1d pop bc inc de dec b - jr nz, .asm_10dc0 + jr nz, .shuffleLoop callba InitBallSaverForCatchEmMode call ShowStartEvolutionModeText call Func_3579 @@ -609,11 +612,11 @@ StartEvolutionMode_RedField: ; 0x10ebb ret z call SelectPokemonToEvolve call InitEvolutionModeForMon - ld a, [wd555] - sub $2 + ld a, [wNumPossibleEvolutionObjects] + sub 2 ld c, a sla c - ld hl, IndicatorStatesPointerTable_10f3b + ld hl, InitialIndicatorStates_RedField add hl, bc ld a, [hli] ld h, [hl] @@ -628,7 +631,7 @@ StartEvolutionMode_RedField: ; 0x10ebb jr nz, .loop xor a ld [wLeftAlleyCount], a - call Func_107b0 + call CloseSlotCave_ ld a, $2 ld [wd7ad], a ld de, MUSIC_CATCH_EM_BLUE ; Either MUSIC_CATCH_EM_BLUE or MUSIC_CATCH_EM_RED. They have the same id in their respective audio Banks. @@ -657,38 +660,38 @@ StartEvolutionMode_RedField: ; 0x10ebb callba nz, Func_102bc ret -IndicatorStatesPointerTable_10f3b: ; 0x10f3b - dw IndicatorStates_10f4b - dw IndicatorStates_10f5e - dw IndicatorStates_10f71 - dw IndicatorStates_10f84 - dw IndicatorStates_10f97 - dw IndicatorStates_10faa - dw IndicatorStates_10fbd - dw IndicatorStates_10fd0 +InitialIndicatorStates_RedField: ; 0x10f3b + dw InitialIndicatorStates0_RedField + dw InitialIndicatorStates1_RedField + dw InitialIndicatorStates2_RedField + dw InitialIndicatorStates3_RedField + dw InitialIndicatorStates4_RedField + dw InitialIndicatorStates5_RedField + dw InitialIndicatorStates6_RedField + dw InitialIndicatorStates7_RedField -IndicatorStates_10f4b: ; 0x10f4b +InitialIndicatorStates0_RedField: ; 0x10f4b db $00, $00, $00, $00, $00, $00, $00, $00, $00, $01, $00, $00, $00, $01, $01, $00, $00, $00, $00 -IndicatorStates_10f5e: ; 0x10f5e +InitialIndicatorStates1_RedField: ; 0x10f5e db $00, $00, $00, $00, $00, $00, $00, $00, $00, $01, $00, $01, $00, $01, $01, $00, $00, $00, $00 -IndicatorStates_10f71: ; 0x10f71 +InitialIndicatorStates2_RedField: ; 0x10f71 db $00, $00, $00, $00, $00, $00, $00, $00, $00, $01, $00, $01, $01, $01, $01, $00, $00, $00, $00 -IndicatorStates_10f84: ; 0x10f84 +InitialIndicatorStates3_RedField: ; 0x10f84 db $00, $00, $00, $00, $00, $00, $00, $00, $01, $01, $00, $01, $01, $01, $01, $00, $00, $00, $00 -IndicatorStates_10f97: ; 0x10f97 +InitialIndicatorStates4_RedField: ; 0x10f97 db $00, $00, $00, $80, $00, $00, $00, $00, $01, $01, $01, $01, $01, $01, $01, $00, $00, $00, $00 -IndicatorStates_10faa: ; 0x10faa +InitialIndicatorStates5_RedField: ; 0x10faa db $00, $00, $80, $80, $00, $00, $00, $00, $01, $01, $01, $01, $01, $01, $01, $00, $00, $00, $00 -IndicatorStates_10fbd: ; 0x10fbd +InitialIndicatorStates6_RedField: ; 0x10fbd db $00, $00, $80, $80, $00, $00, $00, $01, $01, $01, $01, $01, $01, $01, $01, $00, $00, $00, $00 -IndicatorStates_10fd0: ; 0x10fd0 +InitialIndicatorStates7_RedField: ; 0x10fd0 db $00, $00, $80, $80, $00, $00, $01, $01, $01, $01, $01, $01, $01, $01, $01, $00, $00, $00, $00 ConcludeEvolutionMode_RedField: ; 0x10fe3 @@ -745,11 +748,11 @@ StartEvolutionMode_BlueField: ; 0x11061 call InitEvolutionModeForMon ld a, $1 ld [wd643], a - ld a, [wd555] - sub $2 + ld a, [wNumPossibleEvolutionObjects] + sub 2 ld c, a sla c - ld hl, IndicatorStatesPointerTable_110ed + ld hl, InitialIndicatorStates_BlueField add hl, bc ld a, [hli] ld h, [hl] @@ -793,38 +796,38 @@ StartEvolutionMode_BlueField: ; 0x11061 callba nz, Func_102bc ret -IndicatorStatesPointerTable_110ed: ; 0x110ed - dw IndicatorStates_110fd - dw IndicatorStates_11110 - dw IndicatorStates_11123 - dw IndicatorStates_11136 - dw IndicatorStates_11149 - dw IndicatorStates_1115c - dw IndicatorStates_1116f - dw IndicatorStates_11182 +InitialIndicatorStates_BlueField: ; 0x110ed + dw InitialIndicatorStates0_BlueField + dw InitialIndicatorStates1_BlueField + dw InitialIndicatorStates2_BlueField + dw InitialIndicatorStates3_BlueField + dw InitialIndicatorStates4_BlueField + dw InitialIndicatorStates5_BlueField + dw InitialIndicatorStates6_BlueField + dw InitialIndicatorStates7_BlueField -IndicatorStates_110fd: ; 0x110fd +InitialIndicatorStates0_BlueField: ; 0x110fd db $00, $00, $00, $00, $00, $00, $00, $00, $00, $01, $00, $00, $00, $01, $01, $00, $00, $00, $00 -IndicatorStates_11110: ; 0x11110 +InitialIndicatorStates1_BlueField: ; 0x11110 db $00, $00, $00, $00, $00, $00, $00, $00, $00, $01, $00, $01, $00, $01, $01, $00, $00, $00, $00 -IndicatorStates_11123: ; 0x11123 +InitialIndicatorStates2_BlueField: ; 0x11123 db $00, $00, $00, $00, $00, $00, $00, $00, $00, $01, $00, $01, $01, $01, $01, $00, $00, $00, $00 -IndicatorStates_11136: ; 0x11136 +InitialIndicatorStates3_BlueField: ; 0x11136 db $00, $00, $80, $00, $00, $00, $00, $00, $01, $01, $00, $01, $01, $01, $01, $00, $00, $00, $00 -IndicatorStates_11149: ; 0x11149 +InitialIndicatorStates4_BlueField: ; 0x11149 db $00, $00, $80, $80, $00, $00, $00, $00, $01, $01, $01, $01, $01, $01, $01, $00, $00, $00, $00 -IndicatorStates_1115c: ; 0x1115c +InitialIndicatorStates5_BlueField: ; 0x1115c db $00, $00, $80, $80, $00, $00, $00, $00, $01, $01, $01, $01, $01, $01, $01, $00, $00, $00, $00 -IndicatorStates_1116f: ; 0x1116f +InitialIndicatorStates6_BlueField: ; 0x1116f db $80, $00, $80, $80, $00, $00, $00, $01, $01, $01, $01, $01, $01, $01, $01, $00, $00, $00, $00 -IndicatorStates_11182: ; 0x11182 +InitialIndicatorStates7_BlueField: ; 0x11182 db $80, $00, $80, $80, $00, $00, $01, $01, $01, $01, $01, $01, $01, $01, $01, $00, $00, $00, $00 ConcludeEvolutionMode_BlueField: ; 0x11195 diff --git a/engine/pinball_game/evolution_mode/evolution_mode_blue_field.asm b/engine/pinball_game/evolution_mode/evolution_mode_blue_field.asm index ee077ef..a5eb68d 100644 --- a/engine/pinball_game/evolution_mode/evolution_mode_blue_field.asm +++ b/engine/pinball_game/evolution_mode/evolution_mode_blue_field.asm @@ -46,12 +46,12 @@ HandleEvolutionMode_BlueField: ; 0x20c08 ret z dec a bit 0, b - jr z, .asm_20c18 - add $c -.asm_20c18 + jr z, .checkTrinketActive + add 12 +.checkTrinketActive ld c, a ld b, $0 - ld hl, wd566 + ld hl, wActiveEvolutionTrinkets add hl, bc ld a, [hl] and a @@ -274,10 +274,10 @@ HandleShellderCollision_EvolutionMode: ; 0x20e34 jr z, .disabled xor a ld [wIndicatorStates + 9], a - ld a, [wd55c] + ld a, [wEvolutionObjectStates + 0] and a ld a, $0 - ld [wd55c], a + ld [wEvolutionObjectStates + 0], a jp nz, CreateEvolutionTrinket_BlueField jp EvolutionTrinketNotFound_BlueField @@ -295,10 +295,10 @@ HandleCloysterCollision_EvolutionMode: ; 0x20e5e xor a ld [wIndicatorStates + 3], a ld [wIndicatorStates + 10], a - ld a, [wd562] + ld a, [wEvolutionObjectStates + 6] and a ld a, $0 - ld [wd562], a + ld [wEvolutionObjectStates + 6], a jp nz, CreateEvolutionTrinket_BlueField jp EvolutionTrinketNotFound_BlueField @@ -316,10 +316,10 @@ HandleSlowpokeCollision_EvolutionMode: ; 0x20e82 xor a ld [wIndicatorStates + 8], a ld [wIndicatorStates + 2], a - ld a, [wd561] + ld a, [wEvolutionObjectStates + 5] and a ld a, $0 - ld [wd561], a + ld [wEvolutionObjectStates + 5], a jp nz, CreateEvolutionTrinket_BlueField jp EvolutionTrinketNotFound_BlueField @@ -336,10 +336,10 @@ HandlePoliwagCollision_EvolutionMode: ; 0x20ea6 jr z, .disabled xor a ld [wIndicatorStates + 13], a - ld a, [wd55d] + ld a, [wEvolutionObjectStates + 1] and a ld a, $0 - ld [wd55d], a + ld [wEvolutionObjectStates + 1], a jp nz, CreateEvolutionTrinket_BlueField jp EvolutionTrinketNotFound_BlueField @@ -356,10 +356,10 @@ HandlePsyduckCollision_EvolutionMode: ; 0x20ec7 jr z, .disabled xor a ld [wIndicatorStates + 14], a - ld a, [wd55e] + ld a, [wEvolutionObjectStates + 2] and a ld a, $0 - ld [wd55e], a + ld [wEvolutionObjectStates + 2], a jp nz, CreateEvolutionTrinket_BlueField jp EvolutionTrinketNotFound_BlueField @@ -376,10 +376,10 @@ HandleLeftBonusMultiplierCollision_EvolutionMode_BlueField: ; 0x20ee8 jr z, .disabled xor a ld [wIndicatorStates + 11], a - ld a, [wd55f] + ld a, [wEvolutionObjectStates + 3] and a ld a, $0 - ld [wd55f], a + ld [wEvolutionObjectStates + 3], a jp nz, CreateEvolutionTrinket_BlueField jp EvolutionTrinketNotFound_BlueField @@ -396,10 +396,10 @@ HandleRightBonusMultiplierCollision_EvolutionMode_BlueField: ; 0x20f09 jr z, .disabled xor a ld [wIndicatorStates + 12], a - ld a, [wd560] + ld a, [wEvolutionObjectStates + 4] and a ld a, $0 - ld [wd560], a + ld [wEvolutionObjectStates + 4], a jp nz, CreateEvolutionTrinket_BlueField jp EvolutionTrinketNotFound_BlueField @@ -416,10 +416,10 @@ HandleBallUpgradeCollision_EvolutionMode_BlueField: ; 0x20f2a jr z, .disabled xor a ld [wIndicatorStates + 6], a - ld a, [wd565] + ld a, [wEvolutionObjectStates + 9] and a ld a, $0 - ld [wd565], a + ld [wEvolutionObjectStates + 9], a jp nz, CreateEvolutionTrinket_BlueField jp EvolutionTrinketNotFound_BlueField @@ -439,10 +439,10 @@ HandleSpinnerCollision_EvolutionMode_BlueField: ; 0x20f4b jr z, .disabled xor a ld [wIndicatorStates + 7], a - ld a, [wd564] + ld a, [wEvolutionObjectStates + 8] and a ld a, $0 - ld [wd564], a + ld [wEvolutionObjectStates + 8], a jp nz, CreateEvolutionTrinket_BlueField jp EvolutionTrinketNotFound_BlueField @@ -578,10 +578,10 @@ HandleLeftTriggerCollision_EvolutionMode_BlueField: ; 0x21089 jr z, .asm_210a8 xor a ld [wIndicatorStates], a - ld a, [wd563] + ld a, [wEvolutionObjectStates + 7] and a ld a, $0 - ld [wd563], a + ld [wEvolutionObjectStates + 7], a jp nz, CreateEvolutionTrinket_BlueField jp EvolutionTrinketNotFound_BlueField @@ -640,11 +640,11 @@ RecoverPokemon_BlueField: ret ChooseNextEvolutionTrinketLocation_BlueField: ; 0x2111d - ld a, $11 + ld a, 17 call RandomRange ld c, a ld b, $0 - ld hl, wd566 + ld hl, wActiveEvolutionTrinkets add hl, bc ret diff --git a/engine/pinball_game/evolution_mode/evolution_mode_red_field.asm b/engine/pinball_game/evolution_mode/evolution_mode_red_field.asm index a62dea4..11d3a4c 100644 --- a/engine/pinball_game/evolution_mode/evolution_mode_red_field.asm +++ b/engine/pinball_game/evolution_mode/evolution_mode_red_field.asm @@ -48,12 +48,12 @@ HandleEvolutionMode_RedField: ; 0x205e0 ret z dec a bit 0, b - jr z, .asm_205f0 - add $c -.asm_205f0 + jr z, .checkTrinketActive + add 12 +.checkTrinketActive ld c, a ld b, $0 - ld hl, wd566 + ld hl, wActiveEvolutionTrinkets add hl, bc ld a, [hl] and a @@ -277,10 +277,10 @@ HandleVoltorbCollision_EvolutionMode: ; 0x2080f jr z, .disabled xor a ld [wIndicatorStates + 9], a - ld a, [wd55c] + ld a, [wEvolutionObjectStates + 0] and a ld a, $0 - ld [wd55c], a + ld [wEvolutionObjectStates + 0], a jp nz, CreateEvolutionTrinket_RedField jp EvolutionTrinketNotFound_RedField @@ -297,10 +297,10 @@ HandleStaryuAlleyTriggerCollision_EvolutionMode: ; 0x20839 jr z, .disabled xor a ld [wIndicatorStates + 2], a - ld a, [wd563] + ld a, [wEvolutionObjectStates + 7] and a ld a, $0 - ld [wd563], a + ld [wEvolutionObjectStates + 7], a jp nz, CreateEvolutionTrinket_RedField jp EvolutionTrinketNotFound_RedField @@ -321,10 +321,10 @@ HandleBellsproutCollision_EvolutionMode: ; 0x2085a xor a ld [wIndicatorStates + 3], a ld [wIndicatorStates + 10], a - ld a, [wd562] + ld a, [wEvolutionObjectStates + 6] and a ld a, $0 - ld [wd562], a + ld [wEvolutionObjectStates + 6], a jp nz, CreateEvolutionTrinket_RedField jp EvolutionTrinketNotFound_RedField @@ -341,10 +341,10 @@ HandleStaryuCollision_EvolutionMode: ; 0x20887 jr z, .disabled xor a ld [wIndicatorStates + 8], a - ld a, [wd561] + ld a, [wEvolutionObjectStates + 5] and a ld a, $0 - ld [wd561], a + ld [wEvolutionObjectStates + 5], a jp nz, CreateEvolutionTrinket_RedField jp EvolutionTrinketNotFound_RedField @@ -361,10 +361,10 @@ HandleLeftDiglettCollision_EvolutionMode: ; 0x208a8 jr z, .disabled xor a ld [wIndicatorStates + 13], a ;flick off indicator - ld a, [wd55d] + ld a, [wEvolutionObjectStates + 1] and a ld a, $0 - ld [wd55d], a ;make ??? 0 + ld [wEvolutionObjectStates + 1], a ;make ??? 0 jp nz, CreateEvolutionTrinket_RedField jp EvolutionTrinketNotFound_RedField @@ -381,10 +381,10 @@ HandleRightDiglettCollision_EvolutionMode: ; 0x208c9 jr z, .disabled xor a ld [wIndicatorStates + 14], a - ld a, [wd55e] + ld a, [wEvolutionObjectStates + 2] and a ld a, $0 - ld [wd55e], a + ld [wEvolutionObjectStates + 2], a jp nz, CreateEvolutionTrinket_RedField jp EvolutionTrinketNotFound_RedField @@ -401,10 +401,10 @@ HandleLeftBonusMultiplierCollision_EvolutionMode_RedField: ; 0x208ea jr z, .disabled xor a ld [wIndicatorStates + 11], a - ld a, [wd55f] + ld a, [wEvolutionObjectStates + 3] and a ld a, $0 - ld [wd55f], a + ld [wEvolutionObjectStates + 3], a jp nz, CreateEvolutionTrinket_RedField jp EvolutionTrinketNotFound_RedField @@ -421,10 +421,10 @@ HandleRightBonusMultiplierCollision_EvolutionMode_RedField: ; 0x2090b jr z, .disabled xor a ld [wIndicatorStates + 12], a - ld a, [wd560] + ld a, [wEvolutionObjectStates + 4] and a ld a, $0 - ld [wd560], a + ld [wEvolutionObjectStates + 4], a jp nz, CreateEvolutionTrinket_RedField jp EvolutionTrinketNotFound_RedField @@ -441,10 +441,10 @@ HandleBallUpgradeCollision_EvolutionMode_RedField: ; 0x2092c jr z, .disabled xor a ld [wIndicatorStates + 6], a - ld a, [wd565] + ld a, [wEvolutionObjectStates + 9] and a ld a, $0 - ld [wd565], a + ld [wEvolutionObjectStates + 9], a jp nz, CreateEvolutionTrinket_RedField jp EvolutionTrinketNotFound_RedField @@ -464,10 +464,10 @@ HandleSpinnerCollision_EvolutionMode_RedField: ; 0x2094d jr z, .disabled xor a ld [wIndicatorStates + 7], a - ld a, [wd564] + ld a, [wEvolutionObjectStates + 8] and a ld a, $0 - ld [wd564], a + ld [wEvolutionObjectStates + 8], a jp nz, CreateEvolutionTrinket_RedField jp EvolutionTrinketNotFound_RedField @@ -639,11 +639,11 @@ RecoverPokemon_RedField: ret ChooseNextEvolutionTrinketLocation_RedField: ; 0x20af5 - ld a, $11 + ld a, 17 call RandomRange ld c, a ld b, $0 - ld hl, wd566 + ld hl, wActiveEvolutionTrinkets add hl, bc ret diff --git a/engine/pinball_game/map_move.asm b/engine/pinball_game/map_move.asm index b0285c0..d17095c 100644 --- a/engine/pinball_game/map_move.asm +++ b/engine/pinball_game/map_move.asm @@ -117,7 +117,7 @@ Func_311b4: ; 0x311b4 ld [wStageCollisionMap + $e3], a ld a, $67 ld [wStageCollisionMap + $103], a - callba Func_107b0 + callba CloseSlotCave_ ld a, $4 ld [wd7ad], a ld de, MUSIC_HURRY_UP_BLUE ; Either MUSIC_HURRY_UP_BLUE or MUSIC_HURRY_UP_RED. They have the same id in their respective audio Banks. diff --git a/engine/pinball_game/object_collision/red_stage_resolve_collision.asm b/engine/pinball_game/object_collision/red_stage_resolve_collision.asm index ebbb419..53b0240 100644 --- a/engine/pinball_game/object_collision/red_stage_resolve_collision.asm +++ b/engine/pinball_game/object_collision/red_stage_resolve_collision.asm @@ -435,7 +435,7 @@ HitRightDiglett3Times: ; 0x14920 ld hl, wNumDugtrioTriples call Increment_Max100 jr nc, .asm_14937 - ld c, $a + ld c, 10 call Modulo_C callba z, AddExtraBall .asm_14937 @@ -448,7 +448,7 @@ HitLeftDiglett3Times: ; 0x14947 ld hl, wNumDugtrioTriples call Increment_Max100 jr nc, .asm_1495e - ld c, $a + ld c, 10 call Modulo_C callba z, AddExtraBall .asm_1495e @@ -1580,7 +1580,7 @@ ResolveBellsproutCollision: ; 0x15e93 ld hl, wNumBellsproutEntries call Increment_Max100 ret nc - ld c, $19 + ld c, 25 call Modulo_C callba z, AddExtraBall ret @@ -2406,7 +2406,7 @@ UpdatePikachuSaverAnimation_RedField: ; 0x1669e ld hl, wNumPikachuSaves call Increment_Max100 jr nc, .asm_166f0 - ld c, $a + ld c, 10 call Modulo_C callba z, AddExtraBall .asm_166f0 @@ -2731,7 +2731,7 @@ ResolveRedStageBonusMultiplierCollision: ; 016d9d .asm_16e10 ld [wCurBonusMultiplier], a jr nc, .asm_16e24 - ld c, $19 + ld c, 25 call Modulo_C callba z, AddExtraBall .asm_16e24 diff --git a/engine/pinball_game/slot.asm b/engine/pinball_game/slot.asm index 8823178..67b5dee 100644 --- a/engine/pinball_game/slot.asm +++ b/engine/pinball_game/slot.asm @@ -8,7 +8,7 @@ DoSlotRewardRoulette: ; 0xed8e ld a, [wBallType] ld c, a ld b, $0 - ld hl, BallTypeMultipliers + ld hl, BallTypeIncreases add hl, bc ld a, [hl] ld [wSlotBallIncrease], a @@ -235,14 +235,13 @@ IsRightOrLeftFlipperKeyPressed: ; 0xef1e pop bc ret -BallTypeMultipliers: ; 0xef2f -; Score multiplier for each ball type. - db $00 ; POKE_BALL - db $00 - db $01 ; GREAT_BALL - db $02 ; ULTRA_BALL - db $02 - db $02 ; MASTER_BALL +BallTypeIncreases: ; 0xef2f + db 0 ; POKE_BALL + db 0 + db 1 ; GREAT_BALL + db 2 ; ULTRA_BALL + db 2 + db 2 ; MASTER_BALL INCLUDE "engine/pinball_game/ball_saver/ball_saver_30.asm" INCLUDE "engine/pinball_game/ball_saver/ball_saver_60.asm" diff --git a/home/random.asm b/home/random.asm index ac09436..3ec87d6 100644 --- a/home/random.asm +++ b/home/random.asm @@ -110,7 +110,7 @@ UpdateRNG: ; 0x9fa ret RandomRange: ; 0xa21 -; Random value 0 <= x < a +; Random value 0 <= x <= a push bc push hl ld c, a diff --git a/wram.asm b/wram.asm index 33648ef..1b95d7e 100644 --- a/wram.asm +++ b/wram.asm @@ -543,7 +543,7 @@ wCollidedAlleyTriggers:: ; 0xd521 ds $6 ; free space -wIndicatorStates:: ; 0xd52f 0 = evo arrows, 1 = catch arrows, 2 = left small alley, 3 = bellsprout, 4 = slot. bit 7 controls if enabled and flashing, bit 1 and 2 control is solid (set = solid), +9 is the arrow pointing to voltorb on red evo mode +wIndicatorStates:: ; 0xd52f ds $13 wLeftAlleyTrigger:: ; 0xd542 @@ -611,7 +611,11 @@ wCurrentEvolutionType:: ; 0xd553 wNumEvolutionTrinkets:: ; 0xd554 ds $1 -wd555:: ; 0xd555 +wNumPossibleEvolutionObjects:: ; 0xd555 +; Each mon has a different number of possible field objects that can produce trinkets. +; This number is used to randomly choose objects that fall within that set, which will +; produce trinkets when hit with the pinball. This also corresponds to the blinking +; arrows that are displayed when the player is trying to hit one of the objects. ds $1 wEvolutionTrinketCooldownFrames:: ; 0xd556 @@ -634,41 +638,43 @@ wMapMoveDirection:: ; 0xd55a wRareMonsFlag:: ; 0xd55b ds $1 -wd55c:: ; 0xd55c - ds $1 +wEvolutionObjectStates:: ; 0xd55c +; There are 10 possible objects to hit that can spawn an evolution trinket. However, only three +; will actually spawn the trinket. The rest are "duds". This list of states keeps track of which +; ones will spawn the trinket. $1 = spawn trinket, $0 otherwise. +; The indexes in this list correspond to the following objects: +; Blue Field: +; 0: Any of the 3 Shellder bumpers +; 1: Poliwag +; 2: Psyduck +; 3: Left Bonus Multiplier railing +; 4: Right Bonus Multiplier railing +; 5: Slowpoke +; 6: Cloyster +; 7: Left alley trigger point +; 8: Spinner +; 9: Any of the 3 Ball Upgrade lights +; Red Field: +; 0: Any of the 3 Voltorb bumpers +; 1: Left Diglett +; 2: Right Diglett +; 3: Left Bonus Multiplier railing +; 4: Right Bonus Multiplier railing +; 5: Staryu +; 6: Bellsprout +; 7: Staryu alley trigger point +; 8: Spinner +; 9: Any of the 3 Ball Upgrade lights + ds 10 -wd55d:: ; 0xd55d - ds $1 - -wd55e:: ; 0xd55e - ds $1 - -wd55f:: ; 0xd55f - ds $1 - -wd560:: ; 0xd560 - ds $1 - -wd561:: ; 0xd561 - ds $1 - -wd562:: ; 0xd562 - ds $1 - -wd563:: ; 0xd563 - ds $1 - -wd564:: ; 0xd564 - ds $1 - -wd565:: ; 0xd565 - ds $1 - -wd566:: ; 0xd566 - ds $c - -wd572:: ; 0xd572 - ds $6 +wActiveEvolutionTrinkets:: ; 0xd566 +; There are 18 different positions that an evolution trinket can exist. +; Each entry in this list corresponds to one of those positions. The values +; in this list are evolution type constants, and $0 if the trinket is inactive. +; (See constants/evolution_type_constants.asm) +; During gameplay, only one of these trinkets is ever active at a given time. +; However, the game logic perfectly supports multiple being active. + ds 18 wCollidedPointIndex:: ; 0xd578 ; Stores the result of the PinballCollidesWithPoints function.