diff --git a/.vscode/launch.json b/.vscode/launch.json index f009285..38a3f7a 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -9,6 +9,7 @@ "request": "launch", "name": "Launch in Emulicious", "program": "${workspaceFolder}\\bin\\DMGTRIS.gbc", + "emuliciousPath": "K:\\TGM\\dmgtris\\tools", "port": 58870, "stopOnEntry": false, "preLaunchTask": "buildrom" diff --git a/DMGTRIS.GBC b/DMGTRIS.GBC index 4f6fe55..9941386 100644 Binary files a/DMGTRIS.GBC and b/DMGTRIS.GBC differ diff --git a/src/field.asm b/src/field.asm index 040aa2e..6d14a17 100644 --- a/src/field.asm +++ b/src/field.asm @@ -54,8 +54,8 @@ hClearedLines: ds 4 hLineClearCt: ds 1 hComboCt: ds 1 hLockDelayForce: ds 1 -hHighestStack: ds 1 hDownFrames: ds 1 +hAwardDownBonus: ds 1 hStalePiece: ds 1 hBravo: ds 1 @@ -64,8 +64,6 @@ SECTION "Field Functions", ROM0 FieldInit:: xor a, a ldh [hBravo], a - ld a, 23 - ldh [hHighestStack], a ld a, 1 ldh [hComboCt], a ld hl, wField @@ -528,6 +526,7 @@ TrySpawnPiece:: xor a, a ldh [hStalePiece], a ldh [hDownFrames], a + ldh [hAwardDownBonus], a ldh [hLockDelayForce], a ldh a, [hCurrentLockDelay] ldh [hCurrentLockDelayRemaining], a @@ -682,33 +681,6 @@ FindMaxG: ldh a, [hCurrentPieceX] call XYToSFieldPtr -;DEF EXPERIMENTAL_OPTIMIZATION EQU 1 -IF DEF(EXPERIMENTAL_OPTIMIZATION) - ; The stack height marker gives a lower bound to how far the piece can fall. - ldh a, [hHighestStack] - sub a, 4 - ld b, a - ld a, [hCurrentPieceY] - cp a, b - jr nc, .unoptimized ; If our piece is already past that, we can't optimize. - - ; But if we're NOT, that means we can assume a minimum fall distance! -.optimized - ld c, a - ld a, b - sub a, c - inc a - ldh [hActualG], a - dec a - ld de, 14 -: add hl, de - dec a - jr nz, :- - push hl - jr .try -ENDC - -.unoptimized push hl ld a, 1 ldh [hActualG], a @@ -1212,7 +1184,10 @@ FieldProcess:: ; ************************************************************** ; HANDLE UP - ; Is a hard/sonic drop requested? + ; Is a hard/sonic drop requested? Skip if in 20G mode. + ldh a, [hCurrentGravityPerTick] + cp a, 20 + jr z, .postdrop ldh a, [hUpState] cp a, 0 jr z, .postdrop @@ -1226,9 +1201,8 @@ FieldProcess:: ; Sonic drop. .sonicdrop - ldh a, [hDownFrames] - add a, 10 - ldh [hDownFrames], a + ld a, $FF + ldh [hAwardDownBonus], a ld a, 20 ldh [hWantedG], a ldh a, [hTicksUntilG] @@ -1241,9 +1215,8 @@ FieldProcess:: ; Hard drop. .harddrop - ldh a, [hDownFrames] - add a, 10 - ldh [hDownFrames], a + ld a, $FF + ldh [hAwardDownBonus], a ld a, 20 ld b, a ldh a, [hActualG] @@ -1423,7 +1396,7 @@ FieldProcess:: jr z, .ghost ldh a, [hEvenFrame] cp a, 1 - jr nz, :+ + jr nz, .postghost .ghost ldh a, [hYPosAtStartOfFrame] @@ -1444,8 +1417,8 @@ FieldProcess:: pop de call DrawPiece - ; If the lock delay is at the highest value, draw the piece normally. .postghost + ; If the lock delay is at the highest value, draw the piece normally. ldh a, [hCurrentPiece] ld b, TILE_PIECE_0 add a, b @@ -1463,19 +1436,10 @@ FieldProcess:: ldh [hWantedTile], a ldh a, [hCurrentLockDelayRemaining] cp a, 0 - jr nz, :+ - - ; Check if the stack usage went up. - ldh a, [hHighestStack] - ld b, a - ldh a, [hCurrentPieceY] - cp a, b - jr nc, .drawpiece - ldh [hHighestStack], a - jr .drawpiece + jr z, .drawpiece ; Otherwise, look it up. -: call GetTileShade + call GetTileShade .drawpiece ldh a, [hCurrentPieceY] @@ -1857,37 +1821,64 @@ FieldDelay:: ld c, a xor a, a ld b, a + + ; Lock bonus? + ldh a, [hAwardDownBonus] + cp a, $FF + jr nz, .premultiplier + ld a, 10 + add a, c + ld c, a + + ; Final total pre-multipliers. +.premultiplier add hl, bc - ; Copy the running total. + ; Copy the running total for multiplication. ld b, h ld c, l - ; Get a multiplier consisting of... - xor a, a - ld d, a - - ldh a, [hBravo] ; 4 if the field is empty and... + ; Do we have a bravo? x4 if so. +.bravo + ldh a, [hBravo] cp a, 0 - jr nz, :+ - ld a, 4 - ld d, a + jr nz, .lineclears + add hl, bc + add hl, bc + add hl, bc + ld b, h + ld c, l -: ldh a, [hLineClearCt] ; The number of lines cleared and... - add a, d - ld d, a - - ldh a, [hComboCt] ; The combo count. + ; x line clears +.lineclears + ldh a, [hLineClearCt] dec a - add a, d - - ; Multiply the running total by the multiplier. + jr z, .combo : add hl, bc dec a - cp a, 0 jr nz, :- + ld b, h + ld c, l + + ; x combo +.combo + ldh a, [hComboCt] + dec a + jr z, .applyscore +: add hl, bc + jr c, .forcemax + dec a + jr nz, :- + jr .applyscore + + ; Overflow = 65535 +.forcemax + ld a, $FF + ld h, a + ld l, a ; And apply the score. +.applyscore ld a, l ldh [hScoreIncrement], a ld a, h @@ -2078,9 +2069,6 @@ ClearLines: ; If it does, increment the clearing counter, but skip this line. jr nz, .clear\@ - ldh a, [hHighestStack] - inc a - ldh [hHighestStack], a inc de inc de inc de @@ -2136,13 +2124,6 @@ ClearLines: DEF row -= 1 ENDR - ; Check if the stack marker is out of bounds. - ldh a, [hHighestStack] - cp a, 23 - jr c, .fixgarbo - ld a, 23 - ldh [hHighestStack], a - ; Make sure there's no garbage in the top de lines. .fixgarbo ld hl, wField diff --git a/src/gbc.asm b/src/gbc.asm index a588098..eaa1179 100644 --- a/src/gbc.asm +++ b/src/gbc.asm @@ -460,7 +460,7 @@ GBCGameplayInit:: ldh [rOCPD], a ; Pal 2 (purple, S) - ld bc, R3 | B3 + ld bc, R2 | B3 ld a, c ldh [rBCPD], a ldh [rOCPD], a @@ -468,7 +468,7 @@ GBCGameplayInit:: ldh [rBCPD], a ldh [rOCPD], a - ld bc, R2 | B2 + ld bc, R1 | B2 ld a, c ldh [rBCPD], a ldh [rOCPD], a @@ -476,7 +476,7 @@ GBCGameplayInit:: ldh [rBCPD], a ldh [rOCPD], a - ld bc, R1 | B1 + ld bc, R0 | B1 ld a, c ldh [rBCPD], a ldh [rOCPD], a @@ -734,16 +734,44 @@ GBCGameplayProcess:: cp a, $11 ret nz - ; 20G? + ; Color based on mode. + ld a, [wSpeedCurveState] + cp a, SCURVE_DMGT + ld a, $03 ;Blue + jr z, .higoverride + ld a, [wSpeedCurveState] + cp a, SCURVE_TGM1 + ld a, $05 ;Yellow + jr z, .higoverride + ld a, [wSpeedCurveState] + cp a, SCURVE_TGM3 + ld a, $04 ;Orange + jr z, .higoverride + ld a, [wSpeedCurveState] + cp a, SCURVE_DEAT + ld a, $06 ;Cyan + jr z, .higoverride + ld a, [wSpeedCurveState] + cp a, SCURVE_SHIR + ld a, $00 ;Red + jr z, .colorfield ;Always red + ld a, [wSpeedCurveState] + cp a, SCURVE_CHIL + ld a, $01 ;Green + jr z, .higoverride + + ; Are we 20G? +.higoverride + ld d, a ldh a, [hCurrentGravityPerTick] cp a, 20 - jr nz, :+ + jr nz, .colorfield + + ; Strobe the frame. ld a, $00 - jr .colorfield -: ld a, $03 + ld d, a .colorfield - ld d, a ld hl, wShadowTileAttrs ld bc, 32-12 @@ -861,6 +889,45 @@ GBCGameplayProcess:: dec a ld [wOuterReps], a jr nz, .outer2 + + ; Maybe flash numbers. + ldh a, [hCurrentGravityPerTick] + cp a, 20 + jr nz, .black + + ld hl, hFrameCtr + bit 1, [hl] + jr z, .lighter + +.darker + ld a, OCPSF_AUTOINC | (7*8)+(3*2) + ldh [rOCPS], a + ld bc, R2 | G2 + wait_vram + ld a, c + ldh [rOCPD], a + ld a, b + ldh [rOCPD], a + ret + +.lighter + ld a, OCPSF_AUTOINC | (7*8)+(3*2) + ldh [rOCPS], a + ld bc, R3 | G3 + wait_vram + ld a, c + ldh [rOCPD], a + ld a, b + ldh [rOCPD], a + ret + +.black + ld a, OCPSF_AUTOINC | (7*8)+(3*2) + ldh [rOCPS], a + xor a, a + wait_vram + ldh [rOCPD], a + ldh [rOCPD], a ret diff --git a/src/level.asm b/src/level.asm index 0d2a77c..ceba027 100644 --- a/src/level.asm +++ b/src/level.asm @@ -137,9 +137,9 @@ LevelUp:: add a, l ld l, a adc a, h - sub l + sub a, l ldh [hLevel+1], a - ld l, a + ld a, l ldh [hLevel], a ; Save the current hundred digit. @@ -191,6 +191,11 @@ LevelUp:: ldh [hCLevel+1], a ldh [hCLevel+2], a ldh [hCLevel+3], a + ld hl, 9999 + ld a, l + ldh [hLevel], a + ld a, h + ldh [hLevel+1], a call DoSpeedUp ld a, SFX_RANKUP call SFXEnqueue diff --git a/src/main.asm b/src/main.asm index f44747a..0599344 100644 --- a/src/main.asm +++ b/src/main.asm @@ -53,6 +53,7 @@ rRotModeState:: ds 1 rDropModeState:: ds 1 rSpeedCurveState:: ds 1 rAlways20GState:: ds 1 +rSelectedStartLevel:: ds 2 SECTION "Stack", WRAM0 @@ -122,7 +123,7 @@ Main:: cp a, "G" jr nz, .nosavedata ld a, [rMagic+3] - cp a, "0" + cp a, "1" jr nz, .nosavedata .savedata @@ -138,6 +139,10 @@ Main:: ld [wSpeedCurveState], a ld a, [rAlways20GState] ld [wAlways20GState], a + ld a, [rSelectedStartLevel] + ldh [hStartSpeed], a + ld a, [rSelectedStartLevel+1] + ldh [hStartSpeed+1], a jr .otherinit .nosavedata @@ -147,7 +152,7 @@ Main:: ld [rMagic+1], a ld a, "G" ld [rMagic+2], a - ld a, "0" + ld a, "1" ld [rMagic+3], a ld a, BUTTON_MODE_NORM @@ -178,12 +183,15 @@ Main:: ld [rAlways20GState], a ld [wAlways20GState], a -.otherinit ld hl, sSpeedCurve ld a, l ldh [hStartSpeed], a + ld [rSelectedStartLevel], a ld a, h ldh [hStartSpeed+1], a + ld [rSelectedStartLevel+1], a + +.otherinit call TimeInit call IntrInit call InputInit diff --git a/src/res/sources/tiles.gbr b/src/res/sources/tiles.gbr index 885ea18..11afa88 100644 Binary files a/src/res/sources/tiles.gbr and b/src/res/sources/tiles.gbr differ diff --git a/src/res/tiles.inc b/src/res/tiles.inc index f1ec1ea..e8b011b 100644 --- a/src/res/tiles.inc +++ b/src/res/tiles.inc @@ -530,8 +530,8 @@ Tiles:: DB $4A,$4A,$4A,$4A,$E4,$E4,$00,$00 DB $CA,$CA,$2A,$2A,$2A,$2A,$4E,$4E DB $82,$82,$82,$82,$E2,$E2,$00,$00 - DB $FE,$FE,$06,$06,$0C,$0C,$38,$38 - DB $60,$60,$C0,$C0,$FE,$FE,$00,$00 + DB $FF,$FF,$81,$81,$24,$24,$3C,$3C + DB $24,$24,$81,$81,$FF,$FF,$00,$00 TilesEnd:: diff --git a/src/state_title.asm b/src/state_title.asm index b07e9eb..a22860c 100644 --- a/src/state_title.asm +++ b/src/state_title.asm @@ -114,9 +114,6 @@ SwitchToTitle:: ; GBC init call GBCTitleInit - ; Make sure the speed curve is aimed at the right place. - call InitSpeedCurve - ; Install the event loop handlers. ld a, 0 ldh [hGameState], a @@ -301,8 +298,10 @@ DecrementLevel: add hl, bc ld a, l ldh [hStartSpeed], a + ld [rSelectedStartLevel], a ld a, h ldh [hStartSpeed+1], a + ld [rSelectedStartLevel+1], a jp CheckLevelRange @@ -414,8 +413,10 @@ IncrementLevel: add hl, bc ld a, l ldh [hStartSpeed], a + ld [rSelectedStartLevel], a ld a, h ldh [hStartSpeed+1], a + ld [rSelectedStartLevel+1], a jp CheckLevelRange InitSpeedCurve: @@ -425,8 +426,10 @@ InitSpeedCurve: .set ld a, l ldh [hStartSpeed], a + ld [rSelectedStartLevel], a ld a, h ldh [hStartSpeed+1], a + ld [rSelectedStartLevel+1], a ret @@ -492,8 +495,10 @@ CheckLevelRange: jr nz, .notatend call GetStart ld a, l + ld [rSelectedStartLevel], a ldh [hStartSpeed], a ld a, h + ld [rSelectedStartLevel+1], a ldh [hStartSpeed+1], a .notatend @@ -513,8 +518,10 @@ CheckLevelRange: ld l, c add hl, de ld a, l + ld [rSelectedStartLevel], a ldh [hStartSpeed], a ld a, h + ld [rSelectedStartLevel+1], a ldh [hStartSpeed+1], a .notatstart