mirror of
https://gitlab.com/xCrystal/pokecrystal-board.git
synced 2024-09-09 09:51:34 -07:00
218 lines
3.9 KiB
NASM
Executable File
218 lines
3.9 KiB
NASM
Executable File
ClearedLevelScreen:
|
|
xor a
|
|
ldh [hMapAnims], a
|
|
ldh [hLCDStatIntRequired], a
|
|
ldh [hSCY], a
|
|
ld a, -$4
|
|
ldh [hSCX], a
|
|
call DisableLCD
|
|
call ClearTilemap
|
|
call ClearBGMap0or2
|
|
call LoadFrame
|
|
call LoadStandardFont
|
|
call ClearMenuAndWindowData
|
|
ld b, CGB_DIPLOMA
|
|
call GetCGBLayout
|
|
call SetDefaultBGPAndOBP
|
|
call EnableLCD
|
|
ld hl, .LevelCleared1Text
|
|
bccoord 3, 1
|
|
call PrintTextboxTextAt
|
|
ld hl, .LevelCleared2Text
|
|
bccoord 3, 3
|
|
call PrintTextboxTextAt
|
|
.loop
|
|
call DelayFrame
|
|
call GetJoypad
|
|
ldh a, [hJoyPressed]
|
|
bit A_BUTTON_F, a
|
|
jr nz, .exit
|
|
bit B_BUTTON_F, a
|
|
jr z, .loop
|
|
.exit
|
|
call AddLevelCoinsToBalance
|
|
call ClearLevel
|
|
jp UnlockLevels
|
|
|
|
.LevelCleared1Text:
|
|
text " L E V E L"
|
|
done
|
|
|
|
.LevelCleared2Text:
|
|
text "C L E A R E D"
|
|
done
|
|
|
|
AddLevelCoinsToBalance:
|
|
; givecoins YOUR_COINS, COINS_FROM_RAM | wCurLevelCoins
|
|
ld de, wCoins ; YOUR_COINS
|
|
ld hl, wCurLevelCoins
|
|
ld bc, hCoinsTemp
|
|
push bc
|
|
ld a, [hli]
|
|
ld [bc], a
|
|
inc bc
|
|
ld a, [hli]
|
|
ld [bc], a
|
|
inc bc
|
|
ld a, [hl]
|
|
ld [bc], a
|
|
pop bc
|
|
farcall GiveCoins
|
|
ret
|
|
|
|
ClearLevel:
|
|
ld a, [wCurSpaceEffect] ; End Space effect byte contains STAGE_*_F
|
|
ld [wLastClearedLevelStage], a
|
|
call GetClearedLevelsStageAddress
|
|
ld b, CHECK_FLAG
|
|
ld d, 0
|
|
ld a, [wCurLevel]
|
|
ld e, a
|
|
push de
|
|
call FlagAction
|
|
pop de
|
|
jr nz, .already_cleared ; return if this level stage already cleared
|
|
ld b, SET_FLAG
|
|
call FlagAction
|
|
ret
|
|
.already_cleared
|
|
ld a, $ff
|
|
ld [wLastClearedLevelStage], a
|
|
ret
|
|
|
|
UnlockLevels:
|
|
call ComputeLevelsToUnlock
|
|
jp SaveUnlockedLevels
|
|
|
|
ComputeLevelsToUnlock:
|
|
ld hl, LevelUnlockRequirements
|
|
ld de, wUnlockedLevels - 1
|
|
ld b, 0
|
|
.next_byte
|
|
ld c, 8
|
|
inc de
|
|
ld a, [de]
|
|
.next_bit
|
|
srl a
|
|
push af
|
|
call nc, .CheckUnlockLevel ; skip if level is already unlocked
|
|
inc b
|
|
ld a, b
|
|
cp NUM_LEVELS
|
|
jr z, .done ; done if went through all existing levels
|
|
ld a, [wLastUnlockedLevelsCount]
|
|
cp MAX_UNLOCK_LEVELS_AT_ONCE
|
|
jr nc, .done ; done if reached the capacity of wLastUnlockedLevels
|
|
; advance hl to next level in LevelUnlockRequirements
|
|
.loop
|
|
ld a, [hli]
|
|
inc a ; cp $ff
|
|
jr nz, .loop
|
|
pop af
|
|
dec c
|
|
jr z, .next_byte
|
|
jr .next_bit
|
|
|
|
.done
|
|
pop af
|
|
ret
|
|
|
|
; check if the LevelUnlockRequirements[b] at hl for unlocking level b are met.
|
|
; return hl pointing to up to the $ff byte of this LevelUnlockRequirements entry.
|
|
.CheckUnlockLevel:
|
|
push de
|
|
push bc
|
|
ld a, [hl]
|
|
cp $ff
|
|
jr z, .reqs_met ; jump if no specific reqs to unlock this level
|
|
inc hl
|
|
cp UNLOCK_WHEN_LEVELS_CLEARED
|
|
jr z, .check_levels_cleared_loop
|
|
cp UNLOCK_WHEN_NUMBER_OF_LEVELS_CLEARED
|
|
jr z, .check_number_of_levels_cleared
|
|
cp UNLOCK_WHEN_TECHNIQUES_CLEARED
|
|
jr .check_techniques_cleared
|
|
|
|
.check_levels_cleared_loop
|
|
ld a, [hli] ; which level
|
|
ld e, a
|
|
inc a ; cp $ff
|
|
jr z, .reqs_met ; jump when no more required levels and all passed so far
|
|
ld a, [hli] ; which stage
|
|
push hl
|
|
call GetClearedLevelsStageAddress
|
|
ld b, CHECK_FLAG
|
|
ld d, 0
|
|
call FlagAction
|
|
pop hl
|
|
jr z, .reqs_not_met ; if this level is not cleared, requirements aren't met
|
|
jr .check_levels_cleared_loop ; otherwise check next level in list
|
|
|
|
.check_number_of_levels_cleared
|
|
push hl
|
|
ld hl, wClearedLevelsStage1
|
|
ld b, ((NUM_LEVELS + 7) / 8) * 4
|
|
call CountSetBits
|
|
pop hl
|
|
ld a, [hli]
|
|
cp c
|
|
jr c, .reqs_met
|
|
jr z, .reqs_met
|
|
jr .reqs_not_met
|
|
|
|
.check_techniques_cleared
|
|
ld bc, 0
|
|
.check_techniques_cleared_loop
|
|
ld a, [hli]
|
|
ld e, a
|
|
push hl
|
|
ld hl, wUnlockedTechniques
|
|
add hl, bc
|
|
and [hl]
|
|
cp e
|
|
pop hl
|
|
jr nz, .reqs_not_met
|
|
inc c
|
|
ld a, c
|
|
cp (NUM_TECHNIQUES + 7) / 8
|
|
jr nc, .reqs_met
|
|
jr .check_techniques_cleared_loop
|
|
|
|
.reqs_met
|
|
; add level to wLastUnlockedLevels
|
|
pop bc ; b = which level
|
|
push hl
|
|
ld a, [wLastUnlockedLevelsCount]
|
|
ld e, a
|
|
ld d, 0
|
|
ld hl, wLastUnlockedLevels
|
|
add hl, de
|
|
ld [hl], b
|
|
inc hl
|
|
ld [hl], $ff
|
|
inc a
|
|
ld [wLastUnlockedLevelsCount], a
|
|
pop hl
|
|
pop de
|
|
ret
|
|
|
|
.reqs_not_met
|
|
pop bc
|
|
pop de
|
|
ret
|
|
|
|
SaveUnlockedLevels:
|
|
ld hl, wLastUnlockedLevels
|
|
.loop
|
|
ld a, [hli]
|
|
ld e, a
|
|
inc a ; cp $ff
|
|
ret z
|
|
push hl
|
|
ld b, SET_FLAG
|
|
call UnlockedLevelsFlagAction
|
|
pop hl
|
|
jr .loop
|
|
|
|
INCLUDE "data/levels/levels.asm"
|