Add more grading stuff. Again courtesy of CreeperCraftYT
This commit is contained in:
		
							parent
							
								
									7b37de2bf3
								
							
						
					
					
						commit
						119756a90c
					
				
							
								
								
									
										
											BIN
										
									
								
								bin/DMGTRIS.GBC
								
								
								
								
							
							
						
						
									
										
											BIN
										
									
								
								bin/DMGTRIS.GBC
								
								
								
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										2382
									
								
								bin/DMGTRIS.map
								
								
								
								
							
							
						
						
									
										2382
									
								
								bin/DMGTRIS.map
								
								
								
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										2194
									
								
								bin/DMGTRIS.sym
								
								
								
								
							
							
						
						
									
										2194
									
								
								bin/DMGTRIS.sym
								
								
								
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							|  | @ -0,0 +1,487 @@ | |||
| ; DMGTRIS | ||||
| ; Copyright (C) 2023 - Randy Thiemann <randy.thiemann@gmail.com> | ||||
| 
 | ||||
| ; This program is free software: you can redistribute it and/or modify | ||||
| ; it under the terms of the GNU General Public License as published by | ||||
| ; the Free Software Foundation, either version 3 of the License, or | ||||
| ; (at your option) any later version. | ||||
| 
 | ||||
| ; This program is distributed in the hope that it will be useful, | ||||
| ; but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
| ; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||
| ; GNU General Public License for more details. | ||||
| 
 | ||||
| ; You should have received a copy of the GNU General Public License | ||||
| ; along with this program.  If not, see <https://www.gnu.org/licenses/>. | ||||
| 
 | ||||
| 
 | ||||
| IF !DEF(GRADING_ASM) | ||||
| DEF GRADING_ASM EQU 1 | ||||
| 
 | ||||
| 
 | ||||
| INCLUDE "globals.asm" | ||||
| 
 | ||||
| 
 | ||||
| SECTION "Grade Variables", WRAM0 | ||||
| wDecayRate:            ds 1 | ||||
| wGradePoints:          ds 1 | ||||
| wInternalGrade:        ds 1 | ||||
| wDisplayedGrade::      ds 1 | ||||
| wEffectTimer::         ds 1 | ||||
| wRankingDisqualified:: ds 1 | ||||
| 
 | ||||
| 
 | ||||
| SECTION "Grading Data", ROM0 | ||||
| ; The Score Thresholds are 3/4th of the original ones. | ||||
| sTGM1GradeScores: | ||||
|     dw $0003 ;00 — 8 | ||||
|     dw $0006 ;00 — 7 | ||||
|     dw $0009 ;00 — 6 | ||||
|     dw $0015 ;00 — 5 | ||||
|     dw $0021 ;00 — 4 | ||||
|     dw $0039 ;00 — 3 | ||||
|     dw $0060 ;00 — 2 | ||||
|     dw $0090 ;00 — 1 | ||||
|     dw $0120 ;00 — S1 | ||||
|     dw $0165 ;00 — S2 | ||||
|     dw $0225 ;00 — S3 | ||||
|     dw $0300 ;00 — S4 | ||||
|     dw $0390 ;00 — S5 | ||||
|     dw $0495 ;00 — S6 | ||||
|     dw $0615 ;00 — S7 | ||||
|     dw $0750 ;00 — S8 | ||||
|     dw $0900 ;00 — S9 | ||||
| 
 | ||||
| sTGM3InternalGradeSystem: | ||||
|     db 125, 10, 20, 40, 50 ;Decay rate, (Internal grade points awarded for:) Single, Double, Triple, Tetris | ||||
|     db 80,  10, 20, 30, 40 | ||||
|     db 80,  10, 20, 30, 40 | ||||
|     db 50,  10, 15, 30, 40 | ||||
|     db 45,  5,  15, 20, 40 | ||||
|     db 45,  5,  15, 20, 30 | ||||
|     db 45,  5,  10, 20, 30 | ||||
|     db 40,  5,  10, 15, 30 | ||||
|     db 40,  5,  10, 15, 30 | ||||
|     db 40,  5,  10, 15, 30 | ||||
|     db 40,  2,  12, 13, 30 | ||||
|     db 40,  2,  12, 13, 30 | ||||
|     db 30,  2,  12, 13, 30 | ||||
|     db 30,  2,  12, 13, 30 | ||||
|     db 30,  2,  12, 13, 30 | ||||
|     db 20,  2,  12, 13, 30 | ||||
|     db 20,  2,  12, 13, 30 | ||||
|     db 20,  2,  12, 13, 30 | ||||
|     db 20,  2,  12, 13, 30 | ||||
|     db 20,  2,  12, 13, 30 | ||||
|     db 15,  2,  12, 13, 30 | ||||
|     db 15,  2,  12, 13, 30 | ||||
|     db 15,  2,  12, 13, 30 | ||||
|     db 15,  2,  12, 13, 30 | ||||
|     db 15,  2,  12, 13, 30 | ||||
|     db 15,  2,  12, 13, 30 | ||||
|     db 15,  2,  12, 13, 30 | ||||
|     db 15,  2,  12, 13, 30 | ||||
|     db 15,  2,  12, 13, 30 | ||||
|     db 15,  2,  12, 13, 30 | ||||
|     db 10,  2,  12, 13, 30 | ||||
|     db 10,  2,  12, 13, 30 | ||||
| 
 | ||||
| sTGM3GradeBoosts: | ||||
|     db 0 | ||||
|     db 1 | ||||
|     db 2 | ||||
|     db 3 | ||||
|     db 4 | ||||
|     db 5 | ||||
|     db 5 | ||||
|     db 6 | ||||
|     db 6 | ||||
|     db 7 | ||||
|     db 7 | ||||
|     db 7 | ||||
|     db 8 | ||||
|     db 8 | ||||
|     db 8 | ||||
|     db 9 | ||||
|     db 9 | ||||
|     db 10 | ||||
|     db 11 | ||||
|     db 12 | ||||
|     db 12 | ||||
|     db 12 | ||||
|     db 13 | ||||
|     db 13 | ||||
|     db 14 | ||||
|     db 14 | ||||
|     db 15 | ||||
|     db 15 | ||||
|     db 16 | ||||
|     db 16 | ||||
|     db 17 | ||||
| 
 | ||||
| ; sTGM3ComboMultipliers: | ||||
| ;     db 1,  1.0, 1.0, 1.0, 1.0   ; Combo size, (Multiplier for: ) Single, Double, Triple, Tetris | ||||
| ;     db 2,  1.0, 1.2, 1.4, 1.5 | ||||
| ;     db 3,  1.0, 1.2, 1.5, 1.8 | ||||
| ;     db 4,  1.0, 1.4, 1.6, 2.0 | ||||
| ;     db 5,  1.0, 1.4, 1.7, 2.2 | ||||
| ;     db 6,  1.0, 1.4, 1.8, 2.3 | ||||
| ;     db 7,  1.0, 1.4, 1.9, 2.4 | ||||
| ;     db 8,  1.0, 1.5, 2.0, 2.5 | ||||
| ;     db 9,  1.0, 1.5, 2.1, 2.6 | ||||
| ;     db 10, 2.0, 2.5, 3.0, 3.0 | ||||
| 
 | ||||
| sTGM3LevelMultiplier: | ||||
|     db 1 ; 000-249 | ||||
|     db 2 ; 250-499 | ||||
|     db 3 ; 500-749 | ||||
|     db 4 ; 750-999 | ||||
| 
 | ||||
| sTGM3BaselineCOOL: | ||||
|     db 52 ;070 (value in seconds) | ||||
|     db 52 ;170 | ||||
|     db 49 ;270 | ||||
|     db 45 ;370 | ||||
|     db 45 ;470 | ||||
|     db 42 ;570 | ||||
|     db 42 ;670 | ||||
|     db 38 ;770 | ||||
|     db 38 ;870 | ||||
| 
 | ||||
| sTGM3REGRETConditions: | ||||
|     db 1, 30 ;minutes, seconds | ||||
|     db 1, 15 | ||||
|     db 1, 15 | ||||
|     db 1, 8 | ||||
|     db 1, 0 | ||||
|     db 1, 0 | ||||
|     db 0, 50 | ||||
|     db 0, 50 | ||||
|     db 0, 50 | ||||
|     db 0, 50 | ||||
| 
 | ||||
| SECTION "Grading Functions", ROM0 | ||||
|     ; Wipe the grading variables. | ||||
| GradeInit:: | ||||
|     xor a, a | ||||
|     ld [wDecayRate], a | ||||
|     ld [wGradePoints], a | ||||
|     ld [wInternalGrade], a | ||||
|     ld [wDisplayedGrade], a | ||||
|     ld [wRankingDisqualified], a | ||||
|     ld [wEffectTimer], a | ||||
| 
 | ||||
|     ; Not all modes start at 9. | ||||
|     ; Death starts ungraded. | ||||
|     ld a, [wSpeedCurveState] | ||||
|     cp a, SCURVE_DEAT | ||||
|     jr nz, .notdeat | ||||
|     ld a, GRADE_NONE | ||||
|     ld [wDisplayedGrade], a | ||||
|     jr UpdateGrade | ||||
| 
 | ||||
| .notdeat | ||||
|     ; Shirase starts ungraded. | ||||
|     ld a, [wSpeedCurveState] | ||||
|     cp a, SCURVE_SHIR | ||||
|     jr nz, .notshir | ||||
|     ld a, GRADE_NONE | ||||
|     ld [wDisplayedGrade], a | ||||
|     jr UpdateGrade | ||||
| 
 | ||||
| .notshir | ||||
|     ; All the rest start at 9. | ||||
|     ld a, GRADE_9 | ||||
|     ld [wDisplayedGrade], a | ||||
|     jr UpdateGrade | ||||
| 
 | ||||
| 
 | ||||
|     ; Jumps to the grade update function for the current mode. | ||||
| UpdateGrade:: | ||||
|     ld hl, .gradejumptable | ||||
|     ld a, [wSpeedCurveState] | ||||
|     ld b, a | ||||
|     add a, b | ||||
|     add a, b | ||||
|     ld b, 0 | ||||
|     ld c,  a | ||||
|     add hl, bc | ||||
|     jp hl | ||||
| 
 | ||||
| .gradejumptable | ||||
|     jp UpdateGradeTGM1 ;DMGT | ||||
|     jp UpdateGradeTGM1 ;TGM1 | ||||
|     jp UpdateGradeTGM1 ;TGM3 | ||||
|     jp UpdateGradeDEAT ;DEAT | ||||
|     jp UpdateGradeSHIR ;SHIR | ||||
|     jp UpdateGradeTGM1 ;CHIL | ||||
| 
 | ||||
| 
 | ||||
|     ; Get the four most significant figures of the score in BC as BCD. | ||||
| PrepareScore: | ||||
|     ld a, [hScore+3] | ||||
|     ld b, a | ||||
|     ld a, [hScore+2] | ||||
|     swap a | ||||
|     or b | ||||
|     ld c, a | ||||
|     ld a, [hScore+1] | ||||
|     ld b, a | ||||
|     ld a, [hScore] | ||||
|     swap a | ||||
|     or b | ||||
|     ld b, a | ||||
|     ret | ||||
| 
 | ||||
| 
 | ||||
| UpdateGradeTGM1: | ||||
|     ; Bail if we're already GM. | ||||
|     ld a, [wDisplayedGrade] | ||||
|     cp a, GRADE_GM | ||||
|     ret z | ||||
| 
 | ||||
|     ; Skip to GM check if already S9. | ||||
|     cp a, GRADE_S9 | ||||
|     jr nc, .maybegm | ||||
| 
 | ||||
| .trygradeup | ||||
|     ; Otherwise, check if we can increase the grade. | ||||
|     ; Get our score into BC | ||||
|     call PrepareScore | ||||
| 
 | ||||
|     ; Double our current grade and use it as an offset into the scoring table. | ||||
|     ld a, [wDisplayedGrade] | ||||
|     add a | ||||
|     ld d, 0 | ||||
|     ld e, a | ||||
| 
 | ||||
|     ; Have HL point to the next required score and get it into DE. | ||||
|     ld hl, sTGM1GradeScores | ||||
|     add hl, de | ||||
| 
 | ||||
|     ; LSB | ||||
|     ld a, [hl+] | ||||
|     ld e, a | ||||
| 
 | ||||
|     ; MSB | ||||
|     ld a, [hl] | ||||
|     ld d, a | ||||
| 
 | ||||
|     ; Check if BC >= DE... | ||||
|     ; Return if B < D. | ||||
|     ld a, b | ||||
|     cp a, d | ||||
|     ret c | ||||
| 
 | ||||
|     ; We can confidently increase the grade if B > D. | ||||
|     jr nz, .increasegrade | ||||
| 
 | ||||
|     ; If B == D, we need to check C and E... | ||||
| 
 | ||||
|     ; Return if C < E. Otherwise increase the grade. | ||||
|     ld a, c | ||||
|     cp a, e | ||||
|     ret c | ||||
| 
 | ||||
| .increasegrade | ||||
|     ; Add 1 to the grade. | ||||
|     ld a, [wDisplayedGrade] | ||||
|     inc a | ||||
|     ld [wDisplayedGrade], a | ||||
| 
 | ||||
|     ; Play the jingle, if not already doing so. | ||||
|     ldh a, [hCurrentlyPlaying] | ||||
|     cp a, SFX_RANKUP | ||||
|     jr z, .skipjingle | ||||
|     ld a, SFX_RANKUP | ||||
|     call SFXEnqueue | ||||
| 
 | ||||
|     ; Prepare the effect stuff | ||||
| .skipjingle | ||||
|     ld a, $0F | ||||
|     ld [wEffectTimer], a | ||||
| 
 | ||||
|     ; Loop and see if we can increment more grades. | ||||
|     ld a, [wDisplayedGrade] | ||||
|     cp a, GRADE_S9 ; Don't go past S9. | ||||
|     ret z | ||||
|     jr .trygradeup | ||||
| 
 | ||||
| .maybegm | ||||
|     ; Level needs to be 1000 or greater. | ||||
|     ld a, [hCLevel] ; Level, thousands digit. | ||||
|     cp a, 1 | ||||
|     ret c | ||||
| 
 | ||||
|     ; Set the grade to GM | ||||
|     ld a, GRADE_GM | ||||
|     ld [wDisplayedGrade], a | ||||
| 
 | ||||
|     ; Sound effect | ||||
|     ld a, SFX_RANKGM | ||||
|     jp SFXEnqueue | ||||
| 
 | ||||
|     ; Prepare the effect stuff | ||||
|     ld a, $0F | ||||
|     ld [wEffectTimer], a | ||||
| 
 | ||||
|     ; Return | ||||
|     ret | ||||
| 
 | ||||
| 
 | ||||
| UpdateGradeDEAT: | ||||
|     ; If we're disqualified, don't update the grade. | ||||
|     ld a, [wRankingDisqualified] | ||||
|     cp a, $FF | ||||
|     ret z | ||||
| 
 | ||||
|     ; If we are already GM, don't do anything. | ||||
|     ld a, [wDisplayedGrade] | ||||
|     cp a, GRADE_GM | ||||
|     ret z | ||||
| 
 | ||||
| .notgm | ||||
|     ; If we're M, check if we should be GM. | ||||
|     cp a, GRADE_M | ||||
|     jr nz, .notm | ||||
| 
 | ||||
|     ; We should be GM if we're at or past level 1000. | ||||
|     ldh a, [hCLevel] ; Level, thousands digit. | ||||
|     cp a, 1 | ||||
|     ret c ; If less than 1000, return. | ||||
| 
 | ||||
|     ; Otherwise give the grade! | ||||
|     ld a, GRADE_GM | ||||
|     ld [wDisplayedGrade], a | ||||
| 
 | ||||
|     ; Play the jingle. | ||||
|     ld a, SFX_RANKGM | ||||
|     call SFXEnqueue | ||||
| 
 | ||||
|     ; Prepare the effect stuff | ||||
|     ld a, $0F | ||||
|     ld [wEffectTimer], a | ||||
|     ret | ||||
| 
 | ||||
| .notm | ||||
|     ; If we're not M, check if we should be M. | ||||
|     ldh a, [hCLevel+1] ; Level, hundreds digit. | ||||
|     cp a, 5 | ||||
|     ret c ; If less than 500, return. | ||||
| 
 | ||||
|     ; There's a 3:25 torikan for M. | ||||
|     ld b, 3 | ||||
|     ld c, 25 | ||||
|     call CheckTorikan | ||||
| 
 | ||||
|     ; If we failed the Torikan, disqualify from ranking. | ||||
|     cp a, $FF | ||||
|     jr nz, .disqualify | ||||
| 
 | ||||
|     ; Otherwise award M. | ||||
|     ld a, GRADE_M | ||||
|     ld [wDisplayedGrade], a | ||||
| 
 | ||||
|     ; Play the jingle. | ||||
|     ld a, SFX_RANKUP | ||||
|     call SFXEnqueue | ||||
| 
 | ||||
|     ; Prepare the effect stuff | ||||
|     ld a, $0F | ||||
|     ld [wEffectTimer], a | ||||
|     ret | ||||
| 
 | ||||
| .disqualify | ||||
|     ; Disqualify from ranking. | ||||
|     ld a, $FF | ||||
|     ld [wRankingDisqualified], a | ||||
|     ret | ||||
| 
 | ||||
| 
 | ||||
| UpdateGradeSHIR: | ||||
|     ; If we're disqualified, don't update the grade any higher. | ||||
|     ld a, [wRankingDisqualified] | ||||
|     cp a, $FF | ||||
|     ret z | ||||
| 
 | ||||
|     ; If we are already GM, don't do anything. | ||||
|     ld a, [wDisplayedGrade] | ||||
|     cp a, GRADE_S13 | ||||
|     ret z | ||||
| 
 | ||||
|     ; We don't give out a grade until level 100. | ||||
|     ldh a, [hCLevel+1] ; Level, hundreds digit. | ||||
|     cp a, 0 | ||||
|     ret z | ||||
| 
 | ||||
|     ; Get the hundreds and thousands of the level as a hex number. | ||||
|     ld b, a ; Hundreds | ||||
|     ldh a, [hCLevel] ; Thousands | ||||
|     swap a | ||||
|     or b | ||||
| 
 | ||||
|     ; Convert the BCD to hex. | ||||
|     ld c, a     ; C = A | ||||
|     and a, $F0  ; A = A & $F0. A is now $00 to $90 if the number was correct BCD. | ||||
|     srl a       ; A = A >> 1 | ||||
|     ld b, a     ; B = A | ||||
|     srl a | ||||
|     srl a       ; A = A >> 2 | ||||
|     add a, b    ; A += B | ||||
|     ld b, a     ; B = A. At this point B is 10, 20, 30, ... 90. | ||||
|     ld a, c     ; A = C | ||||
|     and a, $0F  ; A = A & $0F. A is now $00 to $09 if the number was correct BCD. | ||||
|     add a, b    ; Adding B to A gives us the converted number. | ||||
| 
 | ||||
|     ; Adding GRADE_1 to this will give us the grade. | ||||
|     add a, GRADE_1 | ||||
|     ld b, a | ||||
|     ld a, [wDisplayedGrade] | ||||
|     cp a, b | ||||
|     ret z ; If the grade is already correct, return. | ||||
|     ld [wDisplayedGrade], a ; Otherwise, set the grade. | ||||
| 
 | ||||
|     ; Play the jingle. | ||||
|     ld a, SFX_RANKUP | ||||
|     call SFXEnqueue | ||||
| 
 | ||||
|     ; Prepare the effect stuff | ||||
|     ld a, $0F | ||||
|     ld [wEffectTimer], a | ||||
| 
 | ||||
|     ; There's a few torikans for Shirase. | ||||
|     ld a, [wDisplayedGrade] | ||||
| .s5torikan | ||||
|     cp a, GRADE_S5 | ||||
|     jr nz, .s10torikan | ||||
| 
 | ||||
|     ; There's a 2:28 torikan after S5. | ||||
|     ld b, 2 | ||||
|     ld c, 28 | ||||
|     call CheckTorikan | ||||
| 
 | ||||
|     ; If we failed the Torikan, disqualify from ranking up further. | ||||
|     cp a, $FF | ||||
|     jr nz, .disqualify | ||||
|     ret | ||||
| 
 | ||||
| .s10torikan | ||||
|     cp a, GRADE_S10 | ||||
|     ret nz | ||||
| 
 | ||||
|     ; There's a 4:56 torikan after S10. | ||||
|     ld b, 4 | ||||
|     ld c, 56 | ||||
|     call CheckTorikan | ||||
| 
 | ||||
|     ; If we failed the Torikan, disqualify from ranking up further. | ||||
|     cp a, $FF | ||||
|     jr nz, .disqualify | ||||
|     ret | ||||
| 
 | ||||
| .disqualify | ||||
|     ld a, $FF | ||||
|     ld [wRankingDisqualified], a | ||||
|     ret | ||||
| 
 | ||||
| ENDC | ||||
|  | @ -1,164 +0,0 @@ | |||
| ; DMGTRIS | ||||
| ; Copyright (C) 2023 - Randy Thiemann <randy.thiemann@gmail.com> | ||||
| 
 | ||||
| ; This program is free software: you can redistribute it and/or modify | ||||
| ; it under the terms of the GNU General Public License as published by | ||||
| ; the Free Software Foundation, either version 3 of the License, or | ||||
| ; (at your option) any later version. | ||||
| 
 | ||||
| ; This program is distributed in the hope that it will be useful, | ||||
| ; but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
| ; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||
| ; GNU General Public License for more details. | ||||
| 
 | ||||
| ; You should have received a copy of the GNU General Public License | ||||
| ; along with this program.  If not, see <https://www.gnu.org/licenses/>. | ||||
| 
 | ||||
| 
 | ||||
| IF !DEF(GRADING_SYSTEMS_ASM) | ||||
| DEF GRADING_SYSTEMS_ASM EQU 1 | ||||
| 
 | ||||
| 
 | ||||
| INCLUDE "globals.asm" | ||||
| 
 | ||||
| 
 | ||||
| SECTION "Grade Variables", WRAM0 | ||||
| wDecayRate:       ds 1 | ||||
| wGradePoints:     ds 1 | ||||
| wInternalGrade:   ds 1 | ||||
| wDisplayedGrade:: ds 1 | ||||
| 
 | ||||
| 
 | ||||
| SECTION "Grading Data", ROM0 | ||||
| sGradeScores: | ||||
|     dw $0004 ;00 — 8 | ||||
|     dw $0008 ;00 — 7 | ||||
|     dw $0014 ;00 — 6 | ||||
|     dw $0020 ;00 — 5 | ||||
|     dw $0035 ;00 — 4 | ||||
|     dw $0055 ;00 — 3 | ||||
|     dw $0080 ;00 — 2 | ||||
|     dw $0120 ;00 — 1 | ||||
|     dw $0160 ;00 — S1 | ||||
|     dw $0220 ;00 — S2 | ||||
|     dw $0300 ;00 — S3 | ||||
|     dw $0400 ;00 — S4 | ||||
|     dw $0520 ;00 — S5 | ||||
|     dw $0660 ;00 — S6 | ||||
|     dw $0820 ;00 — S7 | ||||
|     dw $1000 ;00 — S8 | ||||
|     dw $1200 ;00 — S9 | ||||
| 
 | ||||
| 
 | ||||
| SECTION "Grading Functions", ROM0 | ||||
|     ; Wipe the grading variables. | ||||
| GradeInit:: | ||||
|     xor a, a | ||||
|     ld [wDecayRate], a | ||||
|     ld [wGradePoints], a | ||||
|     ld [wInternalGrade], a | ||||
|     ld [wDisplayedGrade], a | ||||
|     ret | ||||
| 
 | ||||
| 
 | ||||
|     ; Gets the highest grade the player qualifies for. | ||||
| UpdateGrade:: | ||||
|     ; Skip to GM check if past S9. | ||||
|     ld a, [wDisplayedGrade] | ||||
|     cp a, GRADE_S9 | ||||
|     jr c, .trygradeup | ||||
|     jr CheckForGM | ||||
| 
 | ||||
| .trygradeup | ||||
|     ; Get our score into BC | ||||
|     call PrepareScore | ||||
| 
 | ||||
|     ; Double our current grade and use it as an offset into the scoring table. | ||||
|     ld a, [wDisplayedGrade] | ||||
|     add a | ||||
|     ld d, 0 | ||||
|     ld e, a | ||||
| 
 | ||||
|     ; Have HL point to the next required score and get it into DE. | ||||
|     ld hl, sGradeScores | ||||
|     add hl, de | ||||
| 
 | ||||
|     ; LSB | ||||
|     ld a, [hl+] | ||||
|     ld e, a | ||||
| 
 | ||||
|     ; MSB | ||||
|     ld a, [hl] | ||||
|     ld d, a | ||||
| 
 | ||||
|     ; Check if BC >= DE... | ||||
|     ; Return if B < D. | ||||
|     ld a, b | ||||
|     cp a, d | ||||
|     ret c | ||||
| 
 | ||||
|     ; We can confidently increase the grade if B > D. | ||||
|     jr nz, .increasegrade | ||||
| 
 | ||||
|     ; If B == D, we need to check C and E... | ||||
| 
 | ||||
|     ; Return if C < E. Otherwise increase the grade. | ||||
|     ld a, c | ||||
|     cp a, e | ||||
|     ret c | ||||
| 
 | ||||
| .increasegrade | ||||
|     ; Add 1 to the grade. | ||||
|     ld a, [wDisplayedGrade] | ||||
|     inc a | ||||
|     ld [wDisplayedGrade], a | ||||
| 
 | ||||
|     ; Play the jingle. | ||||
|     ld a, SFX_RANKUP | ||||
|     call SFXEnqueue | ||||
| 
 | ||||
|     ; Loop and see if we can increment more grades. | ||||
|     ld a, [wDisplayedGrade] | ||||
|     cp a, GRADE_S9 | ||||
|     ret z | ||||
|     jr .trygradeup | ||||
| 
 | ||||
| 
 | ||||
| CheckForGM: | ||||
|     ; Grade has to be S9. | ||||
|     ld a, [wDisplayedGrade] | ||||
|     cp a, GRADE_S9 | ||||
|     ret nz | ||||
| 
 | ||||
|     ; Level needs to be 1000 or greater. | ||||
|     ld a, [hCLevel] | ||||
|     cp a, 1 | ||||
|     ret c | ||||
| 
 | ||||
|     ; Set the grade to GM | ||||
|     ld a, GRADE_GM | ||||
|     ld [wDisplayedGrade], a | ||||
| 
 | ||||
|     ; Sound effect | ||||
|     ld a, SFX_RANKGM | ||||
|     jp SFXEnqueue | ||||
| 
 | ||||
| 
 | ||||
|     ; Get the four most significant figures of the score in BC as BCD. | ||||
| PrepareScore: | ||||
|     ld a, [hScore+3] | ||||
|     ld b, a | ||||
|     ld a, [hScore+2] | ||||
|     swap a | ||||
|     or b | ||||
|     ld c, a | ||||
|     ld a, [hScore+1] | ||||
|     ld b, a | ||||
|     ld a, [hScore] | ||||
|     swap a | ||||
|     or b | ||||
|     ld b, a | ||||
|     ret | ||||
| 
 | ||||
| 
 | ||||
| ENDC | ||||
|  | @ -326,6 +326,25 @@ DEF GRADE_S6            EQU 14 | |||
| DEF GRADE_S7            EQU 15 | ||||
| DEF GRADE_S8            EQU 16 | ||||
| DEF GRADE_S9            EQU 17 | ||||
| DEF GRADE_GM            EQU 18 | ||||
| DEF GRADE_S10           EQU 18 | ||||
| DEF GRADE_S11           EQU 19 | ||||
| DEF GRADE_S12           EQU 20 | ||||
| DEF GRADE_S13           EQU 21 | ||||
| DEF GRADE_M1            EQU 22 | ||||
| DEF GRADE_M2            EQU 23 | ||||
| DEF GRADE_M3            EQU 24 | ||||
| DEF GRADE_M4            EQU 25 | ||||
| DEF GRADE_M5            EQU 26 | ||||
| DEF GRADE_M6            EQU 27 | ||||
| DEF GRADE_M7            EQU 28 | ||||
| DEF GRADE_M8            EQU 29 | ||||
| DEF GRADE_M9            EQU 30 | ||||
| DEF GRADE_M             EQU 31 | ||||
| DEF GRADE_MK            EQU 32 | ||||
| DEF GRADE_MV            EQU 33 | ||||
| DEF GRADE_MO            EQU 34 | ||||
| DEF GRADE_MM            EQU 35 | ||||
| DEF GRADE_GM            EQU 36 | ||||
| DEF GRADE_NONE          EQU 37 | ||||
| 
 | ||||
| ENDC | ||||
|  |  | |||
							
								
								
									
										103
									
								
								src/sprites.asm
								
								
								
								
							
							
						
						
									
										103
									
								
								src/sprites.asm
								
								
								
								
							|  | @ -615,20 +615,44 @@ GradeRendering:: | |||
|     add a, $8 | ||||
|     ld [wGrade1+1], a | ||||
| 
 | ||||
|     ; Set the palette of the grade objects. | ||||
|     ld a, $7 | ||||
|     ld [wGrade0+3], a | ||||
|     ld [wGrade1+3], a | ||||
| 
 | ||||
|     ; Set the grades to blank | ||||
|     ld a, $1 | ||||
|     ld a, TILE_BLANK | ||||
|     ld [wGrade0+2], a | ||||
|     ld [wGrade1+2], a | ||||
| 
 | ||||
|     ; Is the grade S1 or better? | ||||
|     ; If our grade is GRADE_NONE, we don't need to do anything else. | ||||
|     ld a, [wDisplayedGrade] | ||||
|     cp a, GRADE_NONE | ||||
|     ret z | ||||
| 
 | ||||
|     ; If the effect timer is greater than 0, decrement it and do some palette magic. | ||||
|     ld a, [wEffectTimer] | ||||
|     cp a, 0 | ||||
|     jr z, .noeffect | ||||
|     dec a | ||||
|     ld [wEffectTimer], a | ||||
| 
 | ||||
|     ; Cycle the palette of the grade objects. | ||||
| .effect | ||||
|     ld a, [wGrade0+3] | ||||
|     inc a | ||||
|     and a, OAMF_PALMASK | ||||
|     or a, OAMF_PAL1 | ||||
|     ld [wGrade0+3], a | ||||
|     ld [wGrade1+3], a | ||||
|     jr .drawgrade | ||||
| 
 | ||||
|     ; Set the palette of the grade objects to the normal palette. | ||||
| .noeffect | ||||
|     ld a, 7 | OAMF_PAL1 | ||||
|     ld [wGrade0+3], a | ||||
|     ld [wGrade1+3], a | ||||
| 
 | ||||
|     ; Do we draw this as a regular grade? | ||||
| .drawgrade | ||||
|     ld a, [wDisplayedGrade] | ||||
|     cp a, GRADE_S1 | ||||
|     jr nc, .sgrade | ||||
|     jr nc, .sgrade ; No. S or better. | ||||
| 
 | ||||
| .regulargrade | ||||
|     ; Draw as a regular grade. | ||||
|  | @ -639,9 +663,9 @@ GradeRendering:: | |||
|     ret | ||||
| 
 | ||||
| .sgrade | ||||
|     ; Is the grade a GM? | ||||
|     cp a, GRADE_GM | ||||
|     jr z, .gmgrade | ||||
|     ; Is the grade M1 or better? | ||||
|     cp a, GRADE_M1 | ||||
|     jr nc, .mgrade | ||||
| 
 | ||||
|     ; Draw as S grade. | ||||
|     ld a, "S" | ||||
|  | @ -654,6 +678,63 @@ GradeRendering:: | |||
|     ld [wGrade1+2], a | ||||
|     ret | ||||
| 
 | ||||
| .mgrade | ||||
|     ; Is the grade one of the letter grades? | ||||
|     cp a, GRADE_M | ||||
|     jr nc, .lettergrade | ||||
| 
 | ||||
|     ; Draw as M grade. | ||||
|     ld a, "M" | ||||
|     ld [wGrade0+2], a | ||||
|     ld a, [wDisplayedGrade] | ||||
|     sub a, GRADE_M1 | ||||
|     ld b, a | ||||
|     ld a, "1" | ||||
|     add a, b | ||||
|     ld [wGrade1+2], a | ||||
|     ret | ||||
| 
 | ||||
| .lettergrade | ||||
|     ; Is the grade GM? | ||||
|     cp a, GRADE_GM | ||||
|     jr z, .gmgrade | ||||
| 
 | ||||
|     ; Draw as MX grade. | ||||
|     ld a, "M" | ||||
|     ld [wGrade0+2], a | ||||
|     ld a, [wDisplayedGrade] | ||||
|     cp a, GRADE_M | ||||
|     ret z ; No second letter for M. | ||||
| 
 | ||||
|     ; Otherwise jump to the right letter. | ||||
|     cp a, GRADE_MK | ||||
|     jr z, .mk | ||||
|     cp a, GRADE_MV | ||||
|     jr z, .mv | ||||
|     cp a, GRADE_MO | ||||
|     jr z, .mo | ||||
|     jr .mm | ||||
| 
 | ||||
| .mk | ||||
|     ld a, "K" | ||||
|     ld [wGrade1+2], a | ||||
|     ret | ||||
| 
 | ||||
| .mv | ||||
|     ld a, "V" | ||||
|     ld [wGrade1+2], a | ||||
|     ret | ||||
| 
 | ||||
| .mo | ||||
|     ld a, "O" | ||||
|     ld [wGrade1+2], a | ||||
|     ret | ||||
| 
 | ||||
| .mm | ||||
|     ld a, "M" | ||||
|     ld [wGrade1+2], a | ||||
|     ret | ||||
| 
 | ||||
| .gmgrade | ||||
|     ; Draw as GM grade. | ||||
|     ld a, "G" | ||||
|  |  | |||
|  | @ -225,6 +225,7 @@ GamePlayEventLoopHandlerB:: | |||
|     ldh a, [hNextPiece] | ||||
|     ldh [hCurrentPiece], a | ||||
|     call GetNextPiece | ||||
|     call ResetGameTime | ||||
|     jp .drawStaticInfo | ||||
| 
 | ||||
| 
 | ||||
|  | @ -848,6 +849,7 @@ GamePlayBigEventLoopHandlerB: | |||
|     ldh a, [hNextPiece] | ||||
|     ldh [hCurrentPiece], a | ||||
|     call GetNextPiece | ||||
|     call ResetGameTime | ||||
|     jp .drawStaticInfo | ||||
| 
 | ||||
| 
 | ||||
|  |  | |||
							
								
								
									
										35
									
								
								src/time.asm
								
								
								
								
							
							
						
						
									
										35
									
								
								src/time.asm
								
								
								
								
							|  | @ -49,13 +49,46 @@ TimeInit:: | |||
| 
 | ||||
| 
 | ||||
|     ; Resets the minute-second timer. | ||||
| ResetTime:: | ||||
| ResetGameTime:: | ||||
|     xor a, a | ||||
|     ld [wMinutes], a | ||||
|     ld [wSeconds], a | ||||
|     ld [wFrames], a | ||||
|     ret | ||||
| 
 | ||||
|     ; Checks if the minute-second timer has reached a certain value. | ||||
|     ; Call with max minutes in B and max seconds in C. | ||||
|     ; A will be $FF if the torikan has succeeded, and $00 otherwise. | ||||
| CheckTorikan:: | ||||
|     ; Okay if minutes are less than max minutes. | ||||
|     ld a, [wMinutes] | ||||
|     cp a, b | ||||
|     jr c, .success | ||||
| 
 | ||||
|     ; Check seconds if minutes are equal. | ||||
|     jr nz, .failure | ||||
| 
 | ||||
|     ; Okay if seconds are less than max seconds. | ||||
|     ld a, [wSeconds] | ||||
|     cp a, c | ||||
|     jr c, .success | ||||
| 
 | ||||
|     ; Check frames if seconds are equal. | ||||
|     jr nz, .failure | ||||
| 
 | ||||
|     ; Okay if frames are exactly 0. | ||||
|     ld a, [wFrames] | ||||
|     cp a, 0 | ||||
|     jr z, .success | ||||
| 
 | ||||
| .failure | ||||
|     xor a, a | ||||
|     ret | ||||
| 
 | ||||
| .success | ||||
|     ld a, $FF | ||||
|     ret | ||||
| 
 | ||||
| 
 | ||||
|     ; Increments the global timer. Also saves whether we're on an even frame. | ||||
| HandleTimers:: | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue