Added rudimentary hit combo counter
This commit is contained in:
parent
458bf30b4e
commit
1297a6f342
|
@ -1,7 +1,8 @@
|
||||||
[gd_scene load_steps=18 format=2]
|
[gd_scene load_steps=21 format=2]
|
||||||
|
|
||||||
[ext_resource path="res://scripts/InputHandler.gd" type="Script" id=1]
|
[ext_resource path="res://scripts/InputHandler.gd" type="Script" id=1]
|
||||||
[ext_resource path="res://assets/text-4k.png" type="Texture" id=2]
|
[ext_resource path="res://assets/text-4k.png" type="Texture" id=2]
|
||||||
|
[ext_resource path="res://assets/fonts/Sniglet-Regular.ttf" type="DynamicFontData" id=3]
|
||||||
[ext_resource path="res://scripts/ScreenFilter.gd" type="Script" id=4]
|
[ext_resource path="res://scripts/ScreenFilter.gd" type="Script" id=4]
|
||||||
[ext_resource path="res://scripts/NoteViewport.gd" type="Script" id=5]
|
[ext_resource path="res://scripts/NoteViewport.gd" type="Script" id=5]
|
||||||
[ext_resource path="res://scripts/NotePainter.gd" type="Script" id=6]
|
[ext_resource path="res://scripts/NotePainter.gd" type="Script" id=6]
|
||||||
|
@ -50,10 +51,32 @@ shader_param/array_postmul = Vector3( 1, 1, 1 )
|
||||||
shader_param/array_sidelen = 16
|
shader_param/array_sidelen = 16
|
||||||
shader_param/array_size = 256
|
shader_param/array_size = 256
|
||||||
|
|
||||||
[sub_resource type="CanvasItemMaterial" id=4]
|
[sub_resource type="DynamicFont" id=4]
|
||||||
|
size = 48
|
||||||
|
outline_size = 2
|
||||||
|
outline_color = Color( 0, 0, 0, 1 )
|
||||||
|
font_data = ExtResource( 3 )
|
||||||
|
|
||||||
|
[sub_resource type="GDScript" id=7]
|
||||||
|
script/source = "extends Label
|
||||||
|
|
||||||
|
const colors = [Color.gray, Color.lightgray, Color.aqua, Color.gold]
|
||||||
|
|
||||||
|
|
||||||
|
func _on_NoteHandler_combo_changed(value) -> void:
|
||||||
|
text = str(value)
|
||||||
|
visible = (value > 0)
|
||||||
|
add_color_override('font_color', colors[int(min(3, value/50))])
|
||||||
|
|
||||||
|
|
||||||
|
func _on_NoteHandler_finished_song(song_key, score_data) -> void:
|
||||||
|
visible = false
|
||||||
|
"
|
||||||
|
|
||||||
|
[sub_resource type="CanvasItemMaterial" id=5]
|
||||||
blend_mode = 4
|
blend_mode = 4
|
||||||
|
|
||||||
[sub_resource type="Curve" id=5]
|
[sub_resource type="Curve" id=6]
|
||||||
min_value = -1.0
|
min_value = -1.0
|
||||||
_data = [ Vector2( -1, -1 ), 0.0, 0.0, 0, 0, Vector2( 0, 0 ), 2.0, 2.0, 1, 1, Vector2( 1, 1 ), 0.0, 0.0, 0, 0 ]
|
_data = [ Vector2( -1, -1 ), 0.0, 0.0, 0, 0, Vector2( 0, 0 ), 2.0, 2.0, 1, 1, Vector2( 1, 1 ), 0.0, 0.0, 0, 0 ]
|
||||||
|
|
||||||
|
@ -130,8 +153,29 @@ material = SubResource( 2 )
|
||||||
[node name="notelines" type="MeshInstance2D" parent="Square/NoteHandler/Viewport/Center"]
|
[node name="notelines" type="MeshInstance2D" parent="Square/NoteHandler/Viewport/Center"]
|
||||||
material = SubResource( 3 )
|
material = SubResource( 3 )
|
||||||
|
|
||||||
|
[node name="lbl_combo" type="Label" parent="Square/NoteHandler"]
|
||||||
|
visible = false
|
||||||
|
anchor_left = 0.5
|
||||||
|
anchor_top = 0.5
|
||||||
|
anchor_right = 0.5
|
||||||
|
anchor_bottom = 0.5
|
||||||
|
margin_left = -20.0
|
||||||
|
margin_top = -7.0
|
||||||
|
margin_right = 20.0
|
||||||
|
margin_bottom = 7.0
|
||||||
|
grow_horizontal = 2
|
||||||
|
grow_vertical = 2
|
||||||
|
custom_fonts/font = SubResource( 4 )
|
||||||
|
text = "0"
|
||||||
|
align = 1
|
||||||
|
valign = 1
|
||||||
|
script = SubResource( 7 )
|
||||||
|
__meta__ = {
|
||||||
|
"_edit_use_anchors_": false
|
||||||
|
}
|
||||||
|
|
||||||
[node name="Painter" type="Control" parent="Square"]
|
[node name="Painter" type="Control" parent="Square"]
|
||||||
material = SubResource( 4 )
|
material = SubResource( 5 )
|
||||||
anchor_right = 1.0
|
anchor_right = 1.0
|
||||||
anchor_bottom = 1.0
|
anchor_bottom = 1.0
|
||||||
script = ExtResource( 6 )
|
script = ExtResource( 6 )
|
||||||
|
@ -144,7 +188,7 @@ anchor_right = 1.0
|
||||||
anchor_bottom = 1.0
|
anchor_bottom = 1.0
|
||||||
NoteHandlerPath = NodePath("../NoteHandler")
|
NoteHandlerPath = NodePath("../NoteHandler")
|
||||||
ReceptorsPath = NodePath("../Receptors")
|
ReceptorsPath = NodePath("../Receptors")
|
||||||
ease_curve = SubResource( 5 )
|
ease_curve = SubResource( 6 )
|
||||||
|
|
||||||
[node name="Bezel" type="Control" parent="Square"]
|
[node name="Bezel" type="Control" parent="Square"]
|
||||||
anchor_right = 1.0
|
anchor_right = 1.0
|
||||||
|
@ -163,5 +207,7 @@ __meta__ = {
|
||||||
}
|
}
|
||||||
|
|
||||||
[connection signal="item_rect_changed" from="Square" to="Square/NoteHandler/Viewport" method="_on_Square_item_rect_changed"]
|
[connection signal="item_rect_changed" from="Square" to="Square/NoteHandler/Viewport" method="_on_Square_item_rect_changed"]
|
||||||
|
[connection signal="combo_changed" from="Square/NoteHandler" to="Square/NoteHandler/lbl_combo" method="_on_NoteHandler_combo_changed"]
|
||||||
|
[connection signal="finished_song" from="Square/NoteHandler" to="Square/NoteHandler/lbl_combo" method="_on_NoteHandler_finished_song"]
|
||||||
[connection signal="column_pressed" from="Square/InputHandler" to="Square/NoteHandler" method="_on_InputHandler_column_pressed"]
|
[connection signal="column_pressed" from="Square/InputHandler" to="Square/NoteHandler" method="_on_InputHandler_column_pressed"]
|
||||||
[connection signal="column_released" from="Square/InputHandler" to="Square/NoteHandler" method="_on_InputHandler_column_released"]
|
[connection signal="column_released" from="Square/InputHandler" to="Square/NoteHandler" method="_on_InputHandler_column_released"]
|
||||||
|
|
|
@ -393,8 +393,9 @@ func _draw_score_screen(center: Vector2) -> Array:
|
||||||
ScoreText.score_sub = '%2.3f%%'%(overall_score*100.0)
|
ScoreText.score_sub = '%2.3f%%'%(overall_score*100.0)
|
||||||
ScoreText.update()
|
ScoreText.update()
|
||||||
|
|
||||||
draw_string_centered(TitleFont, center+Vector2(0, y3+y_spacing*7), 'Early : Late')
|
draw_string_centered(TitleFont, center+Vector2(-150, y3+y_spacing*7), 'Early : Late')
|
||||||
draw_string_centered(TitleFont, center+Vector2(0, y3+y_spacing*8), '%3d%% : %3d%%'%[notecount_early*100/max(notecount_total, 1), notecount_late*100/max(notecount_total, 1)])
|
draw_string_centered(TitleFont, center+Vector2(-150, y3+y_spacing*8), '%3d%% : %3d%%'%[notecount_early*100/max(notecount_total, 1), notecount_late*100/max(notecount_total, 1)])
|
||||||
|
draw_string_centered(TitleFont, center+Vector2(150, y3+y_spacing*7.5), 'Max Combo: %d'%scorescreen_score_data.get('max_combo', 0)) # Safety for older saves
|
||||||
|
|
||||||
var txt_offset = Vector2.DOWN*10*f_scale
|
var txt_offset = Vector2.DOWN*10*f_scale
|
||||||
var rect_songs := Rect2(center+Vector2(-100.0, 300.0)*f_scale, Vector2(400.0, 100.0)*f_scale)
|
var rect_songs := Rect2(center+Vector2(-100.0, 300.0)*f_scale, Vector2(400.0, 100.0)*f_scale)
|
||||||
|
|
|
@ -4,6 +4,7 @@ var screen_height := 1080
|
||||||
|
|
||||||
# This script will draw all note events.
|
# This script will draw all note events.
|
||||||
signal finished_song(song_key, score_data)
|
signal finished_song(song_key, score_data)
|
||||||
|
signal combo_changed(value)
|
||||||
var running := false
|
var running := false
|
||||||
var song_key = ''
|
var song_key = ''
|
||||||
|
|
||||||
|
@ -15,6 +16,7 @@ onready var SlideTrailHandler = $'Viewport/Center/SlideTrailHandler'
|
||||||
onready var JudgeText = $'Viewport/Center/JudgeText'
|
onready var JudgeText = $'Viewport/Center/JudgeText'
|
||||||
onready var notelines = $'Viewport/Center/notelines'
|
onready var notelines = $'Viewport/Center/notelines'
|
||||||
onready var meshinstance = $'Viewport/Center/meshinstance'
|
onready var meshinstance = $'Viewport/Center/meshinstance'
|
||||||
|
onready var lbl_combo = $lbl_combo
|
||||||
|
|
||||||
const SQRT2 := sqrt(2)
|
const SQRT2 := sqrt(2)
|
||||||
const DEG45 := deg2rad(45.0)
|
const DEG45 := deg2rad(45.0)
|
||||||
|
@ -71,6 +73,16 @@ const TextJudgementStraight := {
|
||||||
'MISS': TextWord.MISS + TextStyle.STRAIGHT
|
'MISS': TextWord.MISS + TextStyle.STRAIGHT
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var current_combo := 0
|
||||||
|
func increment_combo():
|
||||||
|
current_combo += 1
|
||||||
|
emit_signal('combo_changed', current_combo) # Make text or something?
|
||||||
|
func end_combo(no_reset := false):
|
||||||
|
scores['max_combo'] = max(current_combo, scores.get('max_combo', 0))
|
||||||
|
if not no_reset: # A bit hacky, but we want the ability to cash in the max combo without resetting the counter for... playlist reasons?
|
||||||
|
current_combo = 0
|
||||||
|
emit_signal('combo_changed', 0) # Womp womp effect somewhere?
|
||||||
|
|
||||||
func initialise_scores():
|
func initialise_scores():
|
||||||
scores = {}
|
scores = {}
|
||||||
for type in [Note.NOTE_TAP, Note.NOTE_HOLD, Note.NOTE_STAR]:
|
for type in [Note.NOTE_TAP, Note.NOTE_HOLD, Note.NOTE_STAR]:
|
||||||
|
@ -82,6 +94,8 @@ func initialise_scores():
|
||||||
scores[Note.RELEASE_SCORE_TYPES[type]] = {}
|
scores[Note.RELEASE_SCORE_TYPES[type]] = {}
|
||||||
for key in TextJudgement:
|
for key in TextJudgement:
|
||||||
scores[Note.RELEASE_SCORE_TYPES[type]][key] = 0
|
scores[Note.RELEASE_SCORE_TYPES[type]][key] = 0
|
||||||
|
scores['max_combo'] = 0
|
||||||
|
current_combo = 0
|
||||||
|
|
||||||
func make_text_mesh(mesh: ArrayMesh, text_id: int, pos: Vector2, angle: float, alpha:=1.0, scale:=1.0):
|
func make_text_mesh(mesh: ArrayMesh, text_id: int, pos: Vector2, angle: float, alpha:=1.0, scale:=1.0):
|
||||||
var r := GameTheme.judge_text_size2 * scale
|
var r := GameTheme.judge_text_size2 * scale
|
||||||
|
@ -219,6 +233,11 @@ func activate_note(note, judgement):
|
||||||
Note.NOTE_HOLD:
|
Note.NOTE_HOLD:
|
||||||
note.is_held = true
|
note.is_held = true
|
||||||
|
|
||||||
|
if abs(judgement) < 3:
|
||||||
|
increment_combo() # For now, only hits count toward building and maintaining combo. Releases and slides do not.
|
||||||
|
else:
|
||||||
|
end_combo()
|
||||||
|
|
||||||
func activate_note_release(note, judgement):
|
func activate_note_release(note, judgement):
|
||||||
# Only for Hold, Slide
|
# Only for Hold, Slide
|
||||||
scores[Note.RELEASE_SCORE_TYPES[note.type]][judgement] += 1
|
scores[Note.RELEASE_SCORE_TYPES[note.type]][judgement] += 1
|
||||||
|
@ -582,6 +601,7 @@ func _process(delta):
|
||||||
elif note.time_activated == INF: # Check if notes have been missed
|
elif note.time_activated == INF: # Check if notes have been missed
|
||||||
if ((t-note.time_hit) > miss_time) and not note.missed:
|
if ((t-note.time_hit) > miss_time) and not note.missed:
|
||||||
note.missed = true
|
note.missed = true
|
||||||
|
end_combo()
|
||||||
make_judgement_column('MISS', note.column)
|
make_judgement_column('MISS', note.column)
|
||||||
scores[note.type]['MISS'] += 1
|
scores[note.type]['MISS'] += 1
|
||||||
if Note.RELEASE_SCORE_TYPES.has(note.type):
|
if Note.RELEASE_SCORE_TYPES.has(note.type):
|
||||||
|
@ -624,6 +644,7 @@ func _process(delta):
|
||||||
):
|
):
|
||||||
self.running = false
|
self.running = false
|
||||||
self.timers_set = false
|
self.timers_set = false
|
||||||
|
end_combo(true)
|
||||||
emit_signal('finished_song', song_key, scores)
|
emit_signal('finished_song', song_key, scores)
|
||||||
|
|
||||||
# Redraw
|
# Redraw
|
||||||
|
|
Loading…
Reference in New Issue