Skip to content

Commit 4831ac0

Browse files
Merge pull request #61 from HydrantDude/Crash-Detection
Crash detection
2 parents 42099fc + 1f24a53 commit 4831ac0

File tree

17 files changed

+636
-49
lines changed

17 files changed

+636
-49
lines changed

CHANGELOG.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
# Changelog
22

33
## [unreleased]
4+
* Crash Detection / Simulation
45
* Crunch Mode
56
* Marathon Mode
67
* Hidden Score Mode
@@ -13,6 +14,7 @@
1314
* Fixed CNROM legal screen CHR bank
1415
* Fixed CNROM legal to title flicker
1516
* Block Tool pieces wrap around
17+
* Always Next Box removed
1618
* 0001 seeds are ignored
1719
* Famicom Keyboard support
1820
* MMC3 Support

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,7 @@ Like in the original ROM, holding `a` `b` `select` and then pressing `start` wil
7676

7777
![Tetris](./assets/screens/levelmenu.png)
7878

79-
Same gameplay as A-Type, with some improvements: no score cap, no rocket, no curtain, no music, always next box, better pause, start on any level.
79+
Same gameplay as A-Type, with some improvements: no score cap, no rocket, no curtain, no music, better pause, start on any level.
8080

8181
### T-Spins
8282

src/chr/game_tileset.png

679 Bytes
Loading

src/constants.asm

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,7 @@ MODE_INVISIBLE
7575
MODE_HARDDROP
7676
MODE_SPEED_TEST
7777
MODE_SCORE_DISPLAY
78+
MODE_CRASH
7879
MODE_HZ_DISPLAY
7980
MODE_INPUT_DISPLAY
8081
MODE_DISABLE_FLASH
@@ -102,11 +103,16 @@ LINECAP_FLOOR := 2
102103
LINECAP_INVISIBLE := 3
103104
LINECAP_HALT := 4
104105

106+
CRASH_SHOW := 0
107+
CRASH_TOPOUT := 1
108+
CRASH_CRASH := 2
109+
CRASH_OFF := 3
110+
105111
LINECAP_WHEN_STRING_OFFSET := $10
106112
LINECAP_HOW_STRING_OFFSET := $12
107113

108114
MENU_SPRITE_Y_BASE := $47
109-
MENU_MAX_Y_SCROLL := $78
115+
MENU_MAX_Y_SCROLL := $80
110116
MENU_TOP_MARGIN_SCROLL := 7 ; in blocks
111117

112118
; menuConfigSizeLookup
@@ -134,6 +140,7 @@ MENU_TOP_MARGIN_SCROLL := 7 ; in blocks
134140
.byte $0 ; MODE_HARDDROP
135141
.byte $0 ; MODE_SPEED_TEST
136142
.byte $5 ; MODE_SCORE_DISPLAY
143+
.byte $3 ; MODE_CRASH
137144
.byte $1 ; MODE_HZ_DISPLAY
138145
.byte $1 ; MODE_INPUT_DISPLAY
139146
.byte $1 ; MODE_DISABLE_FLASH

src/gamemode/gametypemenu/menu.asm

Lines changed: 28 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -488,15 +488,16 @@ menuYTmp := tmp2
488488
cmp #MODE_SCORE_DISPLAY
489489
beq @renderScoreName
490490

491+
cmp #MODE_CRASH
492+
beq @renderCrashMode
493+
494+
495+
jsr menuItemY16Offset
496+
bne @loopNext
497+
txa
498+
491499
ldx oamStagingLength
492500

493-
; get Y offset
494-
lda menuCounter
495-
asl
496-
asl
497-
asl
498-
adc #MENU_SPRITE_Y_BASE + 1
499-
sbc menuScrollY
500501
sta oamStaging, x
501502
inx
502503
lda menuVars, y
@@ -547,6 +548,26 @@ menuYTmp := tmp2
547548
jsr stringSpriteAlignRight
548549
jmp @loopNext
549550

551+
@renderCrashMode:
552+
jsr menuItemY16Offset
553+
bne @loopNext
554+
@doRender:
555+
lda crashModifier
556+
cmp #CRASH_OFF
557+
bne @notOff
558+
lda #$F1
559+
@notOff:
560+
adc #$16
561+
sta spriteIndexInOamContentLookup
562+
lda #(MODE_CRASH*8) + MENU_SPRITE_Y_BASE + 1
563+
sec
564+
sbc menuScrollY
565+
sta spriteYOffset
566+
lda #$e9
567+
sta spriteXOffset
568+
jsr stringSpriteAlignRight
569+
jmp @loopNext
570+
550571
; <- menu item index in A
551572
; -> high byte of offset in A
552573
; -> low byte in X

src/gamemodestate/initstate.asm

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,11 @@ gameModeState_initGameState:
1313
lda #$05
1414
sta tetriminoX
1515

16+
;init for crash frame parity
17+
lda frameCounter
18+
and #$01
19+
sta startParity
20+
1621
; set seed init
1722
lda set_seed_input
1823
sta set_seed

src/gamemodestate/updatecounters.asm

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ gameModeState_updateCountersAndNonPlayerState:
66
; next code makes acc behave as normal
77
; (dont edit unless you know what you're doing)
88
lda newlyPressedButtons_player1
9-
and #$20
9+
and #BUTTON_SELECT
1010
beq @ret
1111
lda displayNextPiece
1212
eor #$01

src/nametables/game_type_menu.js

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,7 @@ drawTiles(buffer, lookup, `
6565
#a TAP/ROLL SPEED d#
6666
`);drawTiles(extra, lookup, `
6767
#a SCORING d#
68+
#a CRASH d#
6869
#a HZ DISPLAY d#
6970
#a INPUT DISPLAY d#
7071
#a DISABLE FLASH d#
@@ -93,15 +94,14 @@ drawTiles(buffer, lookup, `
9394
#a d#
9495
#a d#
9596
#a d#
96-
#a d#
9797
`);
9898

9999

100100
drawRect(buffer, 8, 2, 10, 5, 0xB0); // draw logo
101101
// drawRect(extra, 20, 0, 5, 5, 0x9A); // draw QR code
102102

103103
const urlX = 3;
104-
const urlY = 13;
104+
const urlY = 14;
105105
drawRect(extra, urlX, urlY, 12, 1, 0x74);
106106
drawRect(extra, urlX+12, urlY, 12, 1, 0x84);
107107

@@ -134,8 +134,8 @@ drawAttrs(extra, [`
134134
2222222222222222
135135
2222222222222222
136136
2222222222222222
137-
2333333333333332
138137
2222222222222222
138+
2333333333333332
139139
`, screen]);
140140

141141
writeRLE(

src/nmi/nmi.asm

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,8 @@ nmi: pha
2525
jsr generateNextPseudorandomNumber
2626
jsr copyCurrentScrollAndCtrlToPPU
2727
jsr pollControllerButtons
28+
lda #$00
29+
sta lagState ; clear flag after lag frame achieved
2830
.if KEYBOARD
2931
; Read Family BASIC Keyboard
3032
jsr pollKeyboard
@@ -33,6 +35,9 @@ nmi: pha
3335
sta verticalBlankingInterval
3436
pla
3537
tay
38+
tsx
39+
lda stack+4,x
40+
sta nmiReturnAddr
3641
pla
3742
tax
3843
pla

src/nmi/render_mode_play_and_demo.asm

Lines changed: 42 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -20,13 +20,19 @@ render_mode_play_and_demo:
2020
and #$01
2121
beq @renderLevel
2222

23+
ldx #linesPrev-lines
24+
lda lagState
25+
and #$02
26+
bne @doLinesRender
27+
ldx #$00
28+
@doLinesRender:
2329
lda #$20
2430
sta PPUADDR
2531
lda #$73
2632
sta PPUADDR
27-
lda lines+1
33+
lda lines+1,x
2834
sta PPUDATA
29-
lda lines
35+
lda lines,x
3036
jsr twoDigsToPPU
3137
jmp @doneRenderingLines
3238

@@ -54,7 +60,13 @@ render_mode_play_and_demo:
5460
sta PPUADDR
5561
lda #$B9
5662
sta PPUADDR
57-
lda levelNumber
63+
ldx #levelPrev-levelNumber
64+
lda lagState
65+
and #$01
66+
bne @doLevelRender
67+
ldx #$00
68+
@doLevelRender:
69+
lda levelNumber,x
5870
jsr renderByteBCD
5971
jmp @renderLevelEnd
6072

@@ -90,6 +102,26 @@ render_mode_play_and_demo:
90102
; 3 added in float
91103

92104
; scorecap
105+
lda crashModifier
106+
cmp #CRASH_SHOW
107+
bne @noCrash
108+
lda crashState
109+
cmp #$F0
110+
bne @noCrash
111+
112+
lda #$20
113+
sta PPUADDR
114+
lda #$FD
115+
sta PPUADDR
116+
lda #$D8
117+
sta PPUDATA
118+
lda #$3F
119+
sta PPUADDR
120+
lda #$0D
121+
sta PPUADDR
122+
lda #$3D
123+
sta PPUDATA
124+
@noCrash:
93125
lda scoringModifier
94126
cmp #SCORING_HIDDEN
95127
bne @notHidden
@@ -275,7 +307,13 @@ rightColumns:
275307
.byte $05,$06,$07,$08,$09
276308
; Set Background palette 2 and Sprite palette 2
277309
updatePaletteForLevel:
278-
lda levelNumber
310+
ldx #levelPrev-levelNumber
311+
lda lagState
312+
and #$01
313+
bne @loadLevelNumber
314+
ldx #$00
315+
@loadLevelNumber:
316+
lda levelNumber,x
279317
@mod10: cmp #$0A
280318
bmi @copyPalettes ; bcc fixes the colour bug
281319
sec

0 commit comments

Comments
 (0)