diff --git a/Bezel.gd b/Bezel.gd index e966ae8..8398a6f 100644 --- a/Bezel.gd +++ b/Bezel.gd @@ -12,12 +12,12 @@ func arc_point_list(center: Vector2, radius: float, angle_from:=0.0, angle_to:=3 return point_list func _draw(): - var bezel_colors := PoolColorArray([GameTheme.bezel_color if not Engine.editor_hint else Color.red]) + var bezel_colors := PoolColorArray([GameTheme.bezel_color]) var bezel_points: PoolVector2Array - + var screen_size = $"/root".get_visible_rect().size var screen_height = 1080 # min(screen_size.x, screen_size.y) - + var screen_height2 = screen_height/2.0 # draw_rect(Rect2(-screen_height2, -screen_height2, -x_margin, screen_height), GameTheme.bezel_color) @@ -40,4 +40,4 @@ func _draw(): draw_polygon(bezel_points, bezel_colors) func _ready(): - $"/root".connect("size_changed", self, "update") \ No newline at end of file + $"/root".connect("size_changed", self, "update") diff --git a/FileLoader.gd b/FileLoader.gd index 1aa4407..5ba0adc 100644 --- a/FileLoader.gd +++ b/FileLoader.gd @@ -129,4 +129,4 @@ func load_image(filename) -> ImageTexture: var img = Image.new() img.load(filename) tex.create_from_image(img) - return tex \ No newline at end of file + return tex diff --git a/GameTheme.gd b/GameTheme.gd index 39ab1ff..b88d220 100644 --- a/GameTheme.gd +++ b/GameTheme.gd @@ -69,7 +69,7 @@ var screen_filter_min_alpha := 0.2 var screen_filter := Color(0.0, 0.0, 0.0, screen_filter_min_alpha) signal screen_filter_changed() var receptor_color := Color.blue -var bezel_color := Color.black +var bezel_color := Color.black if not Engine.editor_hint else Color.red var RADIAL_COL_ANGLES := PoolRealArray() # ideally const var RADIAL_UNIT_VECTORS := PoolVector2Array() # ideally const @@ -100,4 +100,4 @@ func color_array_tap(alpha: float, double:=false) -> PoolColorArray: else: var col := COLOR_DOUBLE if double else COLOR_TAP var color = Color(col.r, col.g, col.b, alpha) - return PoolColorArray([color, color, color, color]) \ No newline at end of file + return PoolColorArray([color, color, color, color]) diff --git a/InputHandler.gd b/InputHandler.gd index ebad28e..4d0967e 100644 --- a/InputHandler.gd +++ b/InputHandler.gd @@ -34,8 +34,11 @@ func _ready(): set_fingers(0) # connect("button_pressed", self, "print_pressed") $"/root".connect("size_changed", self, "resize") + $VsyncButton.connect("toggled", self, "update_vsync") resize() +func update_vsync(setting: bool): + OS.vsync_enabled = setting func print_pressed(col: int): print("Pressed %d"%col) diff --git a/Menu.gd b/Menu.gd index 2e2c4e0..b32ccc7 100644 --- a/Menu.gd +++ b/Menu.gd @@ -1,5 +1,6 @@ #tool -extends Node2D +#extends Node2D +extends Control var song_defs = {} var song_images = {} @@ -203,7 +204,7 @@ func _draw_song_select(center: Vector2) -> Array: var subsize = size * scales[0] var gx = center.x - (subsize + spacer_x) * selected_song_delta var genre = genres.keys()[g] - draw_string_centered(GenreFont, Vector2(0, gy), genre) + draw_string_centered(GenreFont, Vector2(center.x, gy), genre) var songslist = genres[genre] var s = len(songslist) var key = songslist[selected_song_vis % s] @@ -239,7 +240,7 @@ func _draw_chart_select(center: Vector2) -> Array: touchrects.append({rect=r, chart_idx=diff}) x += size + spacer_x draw_string_centered(TitleFont, Vector2(center.x, center.y+size+64), song_defs[song_key]["title"], Color(0.95, 0.95, 1.0)) - touchrects.append({rect=Rect2(-450.0, 150.0, 900.0, 300.0), chart_idx=-1}) + touchrects.append({rect=Rect2(center.x-450.0, center.y+310.0, 900.0, 300.0), chart_idx=-1}) return touchrects func _draw_score_screen(center: Vector2) -> Array: @@ -329,19 +330,19 @@ func _draw_score_screen(center: Vector2) -> Array: draw_string_centered(TitleFont, Vector2(x, y2+y_spacing*7), "Early : Late", Color(0.95, 0.95, 1.0)) draw_string_centered(TitleFont, Vector2(x, y2+y_spacing*8), "%3d%% : %3d%%"%[notecount_early*100/notecount_total, notecount_late*100/notecount_total], Color(0.95, 0.95, 1.0)) - var rect_songselect := Rect2(-100.0, 300.0, 400.0, 100.0) + var rect_songselect := Rect2(x-100.0, y+660.0, 400.0, 100.0) draw_rect(rect_songselect, Color.red) - draw_string_centered(TitleFont, Vector2(x+100, 320), "Song Select", Color(0.95, 0.95, 1.0)) + draw_string_centered(TitleFont, Vector2(x+100, y+680), "Song Select", Color(0.95, 0.95, 1.0)) touchrects.append({rect=rect_songselect, next_menu=MenuMode.SONG_SELECT}) - var rect_save := Rect2(-300.0, 300.0, 180.0, 100.0) + var rect_save := Rect2(x-300.0, y+660.0, 180.0, 100.0) if not scorescreen_saved: draw_rect(rect_save, Color.blue) - draw_string_centered(TitleFont, Vector2(x-210, 320), "Save", Color(0.95, 0.95, 1.0)) + draw_string_centered(TitleFont, Vector2(x-210, y+680), "Save", Color(0.95, 0.95, 1.0)) touchrects.append({rect=rect_save, action="save"}) else: draw_rect(rect_save, Color.darkgray) - draw_string_centered(TitleFont, Vector2(x-210, 320), "Saved", Color(0.95, 0.95, 1.0)) + draw_string_centered(TitleFont, Vector2(x-210, y+680), "Saved", Color(0.95, 0.95, 1.0)) return touchrects func _draw_gameplay(center: Vector2) -> Array: @@ -349,9 +350,9 @@ func _draw_gameplay(center: Vector2) -> Array: var x = center.x var y = center.y - var rect_songselect := Rect2(-960.0, 440.0, 100.0, 100.0) + var rect_songselect := Rect2(x-960.0, y+440.0, 100.0, 100.0) draw_rect(rect_songselect, Color.red) - draw_string_centered(TitleFont, Vector2(-910, 470), "Stop", Color(0.95, 0.95, 1.0)) + draw_string_centered(TitleFont, center+Vector2(-910, 470), "Stop", Color(0.95, 0.95, 1.0)) touchrects.append({rect=rect_songselect, action="stop"}) return touchrects @@ -360,15 +361,16 @@ func _draw(): var songs = len(song_defs) var size = 216 var outline_px = 3 - var center = Vector2(0.0, -160.0) + var center = Vector2(540.0, 540.0-160.0) # Vector2(0.0, -160.0) touch_rects = [] + $ScoreText.hide() for i in MenuMode: touch_rects.append([]) if menu_mode_prev_fade_timer > 0.0: var progress = 1.0 - menu_mode_prev_fade_timer/menu_mode_prev_fade_timer_duration - var center_prev = lerp(center, Vector2(0.0, 900.0), progress) - var center_next = lerp(Vector2(0.0, -900.0), center, progress) + var center_prev = lerp(center, center+Vector2(0.0, 900.0), progress) + var center_next = lerp(center+Vector2(0.0, -900.0), center, progress) match menu_mode_prev: MenuMode.SONG_SELECT: _draw_song_select(center_prev) @@ -391,6 +393,7 @@ func _draw(): GameTheme.set_screen_filter_alpha(1.0 - progress) MenuMode.SCORE_SCREEN: _draw_score_screen(center_next) + $ScoreText.show() else: match menu_mode: MenuMode.SONG_SELECT: @@ -407,6 +410,7 @@ func _draw(): MenuMode.SCORE_SCREEN: GameTheme.set_screen_filter_alpha(1.0) touch_rects[menu_mode] = _draw_score_screen(center) + $ScoreText.show() func set_menu_mode(mode): menu_mode_prev = menu_mode diff --git a/Note.gd b/Note.gd index 619f970..db5f9bc 100644 --- a/Note.gd +++ b/Note.gd @@ -86,6 +86,7 @@ class NoteSlide extends NoteBase: Note.SlideType.ARC_ACW: var circle_angle : float = lerp(values.start_a, values.end_a, progress) return polar2cartesian(GameTheme.receptor_ring_radius, circle_angle) + return Vector2(0.0, 0.0) func get_angle(progress: float) -> float: match slide_type: @@ -97,6 +98,7 @@ class NoteSlide extends NoteBase: Note.SlideType.ARC_ACW: var circle_angle : float = lerp(values.start_a, values.end_a, progress) return circle_angle - PI/2.0 + return 0.0 func get_slide_length() -> float: # Return unit-circle (r=1) length of slide trail @@ -107,6 +109,7 @@ class NoteSlide extends NoteBase: return fposmod(GameTheme.RADIAL_COL_ANGLES[column_release] - GameTheme.RADIAL_COL_ANGLES[column], TAU) Note.SlideType.ARC_ACW: return fposmod(GameTheme.RADIAL_COL_ANGLES[column] - GameTheme.RADIAL_COL_ANGLES[column_release], TAU) + return 0.0 diff --git a/NoteHandler.gd b/NoteHandler.gd index 8244f4f..2a2588d 100644 --- a/NoteHandler.gd +++ b/NoteHandler.gd @@ -575,6 +575,7 @@ func load_track(data: Dictionary, difficulty_idx: int): meshinstance.material.set_shader_param("bps", bpm/60.0) meshinstance.material.set_shader_param("screen_size", get_viewport().get_size()) meshinstance.set_texture(tex) + initialise_scores() # Remove old score func stop(): $"/root/main/music".stop() @@ -620,12 +621,12 @@ func _process(delta): for i in [-4.0, -3.0, -2.0, -1.0]: var delay := real_time(i) - time var timer = Timer.new() + add_child(timer) timer.set_one_shot(false) # timer.set_timer_process_mode(Timer.TIMER_PROCESS_FIXED) timer.set_wait_time(delay) timer.connect("timeout", self, "intro_click") timer.start() - add_child(timer) timer.connect("timeout", timer, "queue_free") # if (t_old < 0) and (t >= 0): diff --git a/Receptors.gd b/Receptors.gd index 2e362c7..5f1552f 100644 --- a/Receptors.gd +++ b/Receptors.gd @@ -1,4 +1,4 @@ -#tool +tool extends MeshInstance2D var ring_px := 4 # Analogous to diameter @@ -7,6 +7,9 @@ var shadow_px := 8 # Outer edge, analogous to radius var shadow_color := Color.black var center := Vector2(0.0, 0.0) +var ring_vertex_count := 36 +var ring_skew := 0.0 + func make_ring_mesh(inner_vertices: int, thickness: float, radius: float, skew:=0.5, repeat_start:=true): # This makes a trianglestrip around the ring, consisting of chords on the inside and tangents on the outside. # The goal is to exchange some fragment and vertex processing load: @@ -91,10 +94,8 @@ func draw_tris(): var ring_vertices func update_ring_mesh(): - var mesh_v = $"../InputHandler/VerticesSlider".value - var skew = $"../InputHandler/SkewSlider".value var ring_thickness = receptor_px + shadow_px*2 - ring_vertices = make_ring_mesh(mesh_v, ring_thickness, GameTheme.receptor_ring_radius, skew) + ring_vertices = make_ring_mesh(ring_vertex_count, ring_thickness, GameTheme.receptor_ring_radius, ring_skew) var temp_mesh = ArrayMesh.new() var mesh_arrays = [] mesh_arrays.resize(Mesh.ARRAY_MAX) @@ -108,18 +109,16 @@ func update_ring_mesh(): func _draw(): # draw_old(true, true) # draw_tris() - var mesh_v = $"../InputHandler/VerticesSlider".value - var skew = $"../InputHandler/SkewSlider".value + var mesh_v = ring_vertex_count var ring_thickness = receptor_px + shadow_px*2 var estimated_area = circumscribe_polygon_area(GameTheme.receptor_ring_radius+ring_thickness*0.5, mesh_v) - inscribe_polygon_area(GameTheme.receptor_ring_radius-ring_thickness*0.5, mesh_v) var ideal_ring_area = PI * (pow(GameTheme.receptor_ring_radius+receptor_px/2+shadow_px, 2) - pow(GameTheme.receptor_ring_radius-receptor_px/2-shadow_px, 2)) -# var l = len(ring_vertices) -# for i in l: -# estimated_area += triangle_area(ring_vertices[i], ring_vertices[(i+1)%l], ring_vertices[(i+2)%l]) var quad_area = 4*pow(GameTheme.receptor_ring_radius+receptor_px/2+shadow_px, 2) var fps = Performance.get_monitor(Performance.TIME_FPS) - $"/root/main/InputHandler".text = "Vertices: %d*2 Skew: %.3f\nArea: %.0f\n(%.0f%% ideal ring)\n(%.0f%% quad)\nFPS: %.0f"%[mesh_v, skew, estimated_area, 100.0*estimated_area/ideal_ring_area, 100.0*estimated_area/quad_area, fps] + var audio_latency = Performance.get_monitor(Performance.AUDIO_OUTPUT_LATENCY) +# $"/root/main/InputHandler".text = "Vertices: %d*2 Skew: %.3f\nArea: %.0f\n(%.0f%% ideal ring)\n(%.0f%% quad)\nFPS: %.0f"%[mesh_v, skew, estimated_area, 100.0*estimated_area/ideal_ring_area, 100.0*estimated_area/quad_area, fps] + $"/root/main/InputHandler".text = "FPS: %.0f\nAudio Latency: %.2fms"%[fps, audio_latency*1000] material.set_shader_param("dot_radius", 0.5*receptor_px/GameTheme.receptor_ring_radius) material.set_shader_param("line_thickness", 0.5*ring_px/GameTheme.receptor_ring_radius) @@ -127,8 +126,13 @@ func _draw(): material.set_shader_param("shadow_thickness_taper", -0.75) material.set_shader_param("px", 0.5/GameTheme.receptor_ring_radius) -func update_ring_mesh_1arg(arg1): - # Hack because signals can't discard arguments when connected to smaller slots :( +func set_ring_vertex_count(num: int): + assert(num > 3) + ring_vertex_count = num + update_ring_mesh() + +func set_ring_skew(skew: int): + ring_skew = skew update_ring_mesh() func _ready(): @@ -144,10 +148,10 @@ func _ready(): material.set_shader_param("num_receptors", Rules.COLS) update_ring_mesh() - $"../InputHandler/VerticesSlider".connect("value_changed", self, "update_ring_mesh_1arg") - $"../InputHandler/SkewSlider".connect("value_changed", self, "update_ring_mesh_1arg") +# $"../InputHandler/VerticesSlider".connect("value_changed", self, "set_ring_vertex_count") +# $"../InputHandler/SkewSlider".connect("value_changed", self, "set_ring_skew") $"/root".connect("size_changed", self, "update") func _process(delta): if not Engine.editor_hint: - update() \ No newline at end of file + update() diff --git a/Rules.gd b/Rules.gd index e3583eb..9a626c8 100644 --- a/Rules.gd +++ b/Rules.gd @@ -17,4 +17,4 @@ const JUDGEMENT_TIMES_SLIDE_PRE := [0.090, 0.240, 0.375, 60.000] # Small grace const JUDGEMENT_TIMES_SLIDE_POST := [0.090, 0.140, 0.175, 0.200] const SCORE_STRINGS = ["SSS", "SS", "S", "A⁺", "A", "B⁺", "B", "C⁺", "C", "F"] -const SCORE_CUTOFFS = [1.0, 0.975, 0.95, 0.9, 0.85, 0.8, 0.7, 0.6, 0.5] \ No newline at end of file +const SCORE_CUTOFFS = [1.0, 0.975, 0.95, 0.9, 0.85, 0.8, 0.7, 0.6, 0.5] diff --git a/ScreenFilter.gd b/ScreenFilter.gd index 885c22f..d37b7d0 100644 --- a/ScreenFilter.gd +++ b/ScreenFilter.gd @@ -6,4 +6,4 @@ func _draw(): draw_rect(Rect2(-screen_height/2, -screen_height/2, screen_height, screen_height), GameTheme.screen_filter) func _ready(): - GameTheme.connect("screen_filter_changed", self, "update") \ No newline at end of file + GameTheme.connect("screen_filter_changed", self, "update") diff --git a/main.tscn b/main.tscn index 8d1ab5a..cc9ac2b 100644 --- a/main.tscn +++ b/main.tscn @@ -1,4 +1,4 @@ -[gd_scene load_steps=22 format=2] +[gd_scene load_steps=23 format=2] [ext_resource path="res://main.gd" type="Script" id=1] [ext_resource path="res://video.gd" type="Script" id=2] @@ -17,6 +17,7 @@ [ext_resource path="res://Bezel.gd" type="Script" id=15] [ext_resource path="res://assets/NotoSans.tres" type="DynamicFont" id=16] [ext_resource path="res://InputHandler.gd" type="Script" id=17] +[ext_resource path="res://assets/test/TIT FOR TAT.avi" type="VideoStream" id=18] [sub_resource type="ShaderMaterial" id=1] shader = ExtResource( 4 ) @@ -30,14 +31,14 @@ shader_param/shadow_thickness = 0.01 shader_param/shadow_thickness_taper = 0.33 shader_param/px = 0.002 -[sub_resource type="ShaderMaterial" id=3] +[sub_resource type="ShaderMaterial" id=2] shader = ExtResource( 9 ) shader_param/bps = null shader_param/star_color = null shader_param/held_color = null shader_param/screen_size = null -[sub_resource type="ShaderMaterial" id=2] +[sub_resource type="ShaderMaterial" id=3] shader = ExtResource( 10 ) shader_param/line_color = Color( 0.8, 0.8, 1, 0.8 ) shader_param/line_color_double = Color( 1, 1, 0.6, 0.9 ) @@ -61,6 +62,18 @@ __meta__ = { "_edit_vertical_guides_": [ ] } +[node name="VideoPlayer" type="VideoPlayer" parent="."] +visible = false +margin_left = -640.0 +margin_top = -360.0 +margin_right = 640.0 +margin_bottom = 360.0 +stream = ExtResource( 18 ) +volume_db = -80.0 +__meta__ = { +"_edit_use_anchors_": false +} + [node name="music" type="AudioStreamPlayer" parent="."] [node name="video" type="VideoPlayer" parent="."] @@ -105,17 +118,26 @@ scale = Vector2( 0.5, 0.5 ) texture = ExtResource( 8 ) [node name="meshinstance" type="MeshInstance2D" parent="NoteHandler/Viewport/Center"] -material = SubResource( 3 ) +material = SubResource( 2 ) [node name="notelines" type="MeshInstance2D" parent="NoteHandler/Viewport/Center"] -material = SubResource( 2 ) +material = SubResource( 3 ) [node name="Painter" type="Node2D" parent="NoteHandler"] material = SubResource( 4 ) script = ExtResource( 11 ) -[node name="Menu" type="Node2D" parent="."] +[node name="Menu" type="Control" parent="."] +margin_left = -540.0 +margin_top = -540.0 +margin_right = 540.0 +margin_bottom = 540.0 +rect_pivot_offset = Vector2( 540, 540 ) +rect_clip_content = true script = ExtResource( 12 ) +__meta__ = { +"_edit_use_anchors_": false +} [node name="ScoreText" type="Node2D" parent="Menu"] material = ExtResource( 13 ) @@ -132,37 +154,40 @@ margin_bottom = 540.0 custom_fonts/font = ExtResource( 16 ) text = "Fingers on the screen:" script = ExtResource( 17 ) +__meta__ = { +"_edit_use_anchors_": false +} -[node name="VerticesSlider" type="HSlider" parent="InputHandler"] -margin_left = 10.0 -margin_top = 280.0 -margin_right = 310.0 -margin_bottom = 296.0 -min_value = 3.0 -max_value = 72.0 -value = 36.0 -tick_count = 2 -ticks_on_borders = true - -[node name="SkewSlider" type="HSlider" parent="InputHandler"] -margin_left = 10.0 -margin_top = 310.0 -margin_right = 310.0 -margin_bottom = 320.0 -grow_horizontal = 2 -grow_vertical = 2 -size_flags_horizontal = 3 -size_flags_vertical = 3 -max_value = 0.5 -step = 0.01 -tick_count = 3 -ticks_on_borders = true +[node name="Label" type="Label" parent="InputHandler"] +margin_top = 136.0 +margin_right = 116.0 +margin_bottom = 150.0 +text = "Subsampling (X, Y)" [node name="SSXSlider" type="HSlider" parent="InputHandler"] margin_left = 10.0 -margin_top = 400.0 +margin_top = 160.0 margin_right = 310.0 -margin_bottom = 410.0 +margin_bottom = 156.0 +grow_horizontal = 2 +grow_vertical = 2 +size_flags_horizontal = 3 +size_flags_vertical = 3 +min_value = 0.1 +max_value = 2.0 +step = 0.01 +value = 1.0 +tick_count = 3 +ticks_on_borders = true +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="SSYSlider" type="HSlider" parent="InputHandler"] +margin_left = 10.0 +margin_top = 176.0 +margin_right = 310.0 +margin_bottom = 186.0 grow_horizontal = 2 grow_vertical = 2 size_flags_horizontal = 3 @@ -174,18 +199,12 @@ value = 1.0 tick_count = 3 ticks_on_borders = true -[node name="SSYSlider" type="HSlider" parent="InputHandler"] -margin_left = 10.0 -margin_top = 430.0 -margin_right = 310.0 -margin_bottom = 440.0 -grow_horizontal = 2 -grow_vertical = 2 -size_flags_horizontal = 3 -size_flags_vertical = 3 -min_value = 0.1 -max_value = 2.0 -step = 0.01 -value = 1.0 -tick_count = 3 -ticks_on_borders = true +[node name="VsyncButton" type="CheckButton" parent="InputHandler"] +margin_left = 4.0 +margin_top = 90.0 +margin_right = 121.0 +margin_bottom = 130.0 +text = "Vsync" +__meta__ = { +"_edit_use_anchors_": false +} diff --git a/project.godot b/project.godot index 575adb1..c648e86 100644 --- a/project.godot +++ b/project.godot @@ -17,11 +17,11 @@ _global_script_class_icons={ config/name="Rhythm" run/main_scene="res://main.tscn" -config/icon="res://icon.png" +config/icon="res://assets/spritesheet.png" [audio] -output_latency=5 +output_latency=4 channel_disable_threshold_db=-100.0 channel_disable_time=5.0 @@ -36,7 +36,7 @@ SFXPlayer="*res://SFXPlayer.gd" [debug] gdscript/warnings/unused_variable=false -gdscript/warnings/unused_class_variable=false +gdscript/warnings/shadowed_variable=false gdscript/warnings/unused_argument=false gdscript/warnings/unused_signal=false gdscript/warnings/return_value_discarded=false @@ -55,6 +55,7 @@ window/stretch/aspect="keep_height" [gdnative] singletons=[ "res://addons/videodecoder.gdnlib" ] +singletons_disabled=[ ] [rendering]