diff --git a/RadialGame.tscn b/RadialGame.tscn index 234438b..7cb0a96 100644 --- a/RadialGame.tscn +++ b/RadialGame.tscn @@ -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://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/NoteViewport.gd" type="Script" id=5] [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_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 -[sub_resource type="Curve" id=5] +[sub_resource type="Curve" id=6] 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 ] @@ -130,8 +153,29 @@ material = SubResource( 2 ) [node name="notelines" type="MeshInstance2D" parent="Square/NoteHandler/Viewport/Center"] 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"] -material = SubResource( 4 ) +material = SubResource( 5 ) anchor_right = 1.0 anchor_bottom = 1.0 script = ExtResource( 6 ) @@ -144,7 +188,7 @@ anchor_right = 1.0 anchor_bottom = 1.0 NoteHandlerPath = NodePath("../NoteHandler") ReceptorsPath = NodePath("../Receptors") -ease_curve = SubResource( 5 ) +ease_curve = SubResource( 6 ) [node name="Bezel" type="Control" parent="Square"] 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="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_released" from="Square/InputHandler" to="Square/NoteHandler" method="_on_InputHandler_column_released"] diff --git a/scripts/Menu.gd b/scripts/Menu.gd index c470cf4..7ad5b33 100644 --- a/scripts/Menu.gd +++ b/scripts/Menu.gd @@ -393,8 +393,9 @@ func _draw_score_screen(center: Vector2) -> Array: ScoreText.score_sub = '%2.3f%%'%(overall_score*100.0) ScoreText.update() - draw_string_centered(TitleFont, center+Vector2(0, 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*7), 'Early : Late') + 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 rect_songs := Rect2(center+Vector2(-100.0, 300.0)*f_scale, Vector2(400.0, 100.0)*f_scale) diff --git a/scripts/NoteHandler.gd b/scripts/NoteHandler.gd index 482e40c..903077d 100644 --- a/scripts/NoteHandler.gd +++ b/scripts/NoteHandler.gd @@ -4,6 +4,7 @@ var screen_height := 1080 # This script will draw all note events. signal finished_song(song_key, score_data) +signal combo_changed(value) var running := false var song_key = '' @@ -15,6 +16,7 @@ onready var SlideTrailHandler = $'Viewport/Center/SlideTrailHandler' onready var JudgeText = $'Viewport/Center/JudgeText' onready var notelines = $'Viewport/Center/notelines' onready var meshinstance = $'Viewport/Center/meshinstance' +onready var lbl_combo = $lbl_combo const SQRT2 := sqrt(2) const DEG45 := deg2rad(45.0) @@ -71,6 +73,16 @@ const TextJudgementStraight := { '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(): scores = {} 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]] = {} for key in TextJudgement: 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): var r := GameTheme.judge_text_size2 * scale @@ -219,6 +233,11 @@ func activate_note(note, judgement): Note.NOTE_HOLD: 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): # Only for Hold, Slide 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 if ((t-note.time_hit) > miss_time) and not note.missed: note.missed = true + end_combo() make_judgement_column('MISS', note.column) scores[note.type]['MISS'] += 1 if Note.RELEASE_SCORE_TYPES.has(note.type): @@ -624,6 +644,7 @@ func _process(delta): ): self.running = false self.timers_set = false + end_combo(true) emit_signal('finished_song', song_key, scores) # Redraw