Basic input handling and judgement text
This commit is contained in:
parent
3ed63d81b9
commit
b8502e6f02
6
Bezel.gd
6
Bezel.gd
|
@ -4,12 +4,12 @@ extends "res://main.gd"
|
||||||
var center := Vector2(0.0, 0.0)
|
var center := Vector2(0.0, 0.0)
|
||||||
|
|
||||||
func _draw():
|
func _draw():
|
||||||
var bezel_colors := PoolColorArray([theme.bezel_color])
|
var bezel_colors := PoolColorArray([GameTheme.bezel_color])
|
||||||
var bezel_points: PoolVector2Array
|
var bezel_points: PoolVector2Array
|
||||||
var screen_height2 := screen_height/2.0
|
var screen_height2 := screen_height/2.0
|
||||||
|
|
||||||
draw_rect(Rect2(-screen_height2, -screen_height2, -x_margin, screen_height), theme.bezel_color)
|
draw_rect(Rect2(-screen_height2, -screen_height2, -x_margin, screen_height), GameTheme.bezel_color)
|
||||||
draw_rect(Rect2(screen_height2, -screen_height2, x_margin, screen_height), theme.bezel_color)
|
draw_rect(Rect2(screen_height2, -screen_height2, x_margin, screen_height), GameTheme.bezel_color)
|
||||||
|
|
||||||
bezel_points = arc_point_list(center, screen_height2, 0, -90)
|
bezel_points = arc_point_list(center, screen_height2, 0, -90)
|
||||||
bezel_points.push_back(Vector2(screen_height2, -screen_height2))
|
bezel_points.push_back(Vector2(screen_height2, -screen_height2))
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
extends Node
|
extends Node
|
||||||
|
|
||||||
var receptor_ring_radius := 460
|
var receptor_ring_radius := 460.0
|
||||||
var note_forecast_beats := 2.0 # Notes start to appear this many beats before you need to tap them
|
var note_forecast_beats := 2.0 # Notes start to appear this many beats before you need to tap them
|
||||||
const INNER_NOTE_CIRCLE_RATIO := 0.3 # Notes under this far from the center will zoom into existence
|
const INNER_NOTE_CIRCLE_RATIO := 0.3 # Notes under this far from the center will zoom into existence
|
||||||
const SLIDE_DELAY := 0.5 # Time in beats between the tap of the star and the start of the visual slide
|
const SLIDE_DELAY := 0.5 # Time in beats between the tap of the star and the start of the visual slide
|
||||||
|
@ -8,6 +8,14 @@ const SLIDE_DELAY := 0.5 # Time in beats between the tap of the star and the st
|
||||||
var sprite_size := 128
|
var sprite_size := 128
|
||||||
var sprite_size2 := sprite_size/2
|
var sprite_size2 := sprite_size/2
|
||||||
|
|
||||||
|
var judge_text_size := 256
|
||||||
|
# Text is rendered from center.
|
||||||
|
const JUDGE_TEXT_ANG2 := atan(1.0/4.0)
|
||||||
|
const JUDGE_TEXT_ANG1 := PI - JUDGE_TEXT_ANG2
|
||||||
|
const JUDGE_TEXT_ANG3 := PI + JUDGE_TEXT_ANG2
|
||||||
|
const JUDGE_TEXT_ANG4 := -JUDGE_TEXT_ANG2
|
||||||
|
var judge_text_size2 := 0.5*judge_text_size/cos(JUDGE_TEXT_ANG2)
|
||||||
|
|
||||||
# Color definitions
|
# Color definitions
|
||||||
const COLOR_TAP := Color(1, 0.15, 0.15, 1)
|
const COLOR_TAP := Color(1, 0.15, 0.15, 1)
|
||||||
const COLOR_TAP2 := Color(0.75, 0.5, 0, 1) # High-score taps ("breaks" in maimai)
|
const COLOR_TAP2 := Color(0.75, 0.5, 0, 1) # High-score taps ("breaks" in maimai)
|
||||||
|
@ -15,6 +23,7 @@ const COLOR_HOLD := Color(1, 0.15, 0.15, 1)
|
||||||
const COLOR_HOLD_HELD := Color(1, 1, 1, 1)
|
const COLOR_HOLD_HELD := Color(1, 1, 1, 1)
|
||||||
const COLOR_STAR := Color(0, 0, 1, 1)
|
const COLOR_STAR := Color(0, 0, 1, 1)
|
||||||
const COLOR_DOUBLE := Color(1, 1, 0, 1) # When two (or more in master) hit events coincide
|
const COLOR_DOUBLE := Color(1, 1, 0, 1) # When two (or more in master) hit events coincide
|
||||||
|
const COLOR_TEXT := Color(1, 1, 1, 1)
|
||||||
|
|
||||||
var COLOR_ARRAY_TAP := PoolColorArray([COLOR_TAP, COLOR_TAP, COLOR_TAP, COLOR_TAP])
|
var COLOR_ARRAY_TAP := PoolColorArray([COLOR_TAP, COLOR_TAP, COLOR_TAP, COLOR_TAP])
|
||||||
var COLOR_ARRAY_TAP2 := PoolColorArray([COLOR_TAP2, COLOR_TAP2, COLOR_TAP2, COLOR_TAP2])
|
var COLOR_ARRAY_TAP2 := PoolColorArray([COLOR_TAP2, COLOR_TAP2, COLOR_TAP2, COLOR_TAP2])
|
||||||
|
@ -45,3 +54,8 @@ func init_radial_values():
|
||||||
var angle = deg2rad(fmod(Rules.FIRST_COLUMN_ANGLE_DEG + (i * Rules.COLS_ANGLE_DEG), 360.0))
|
var angle = deg2rad(fmod(Rules.FIRST_COLUMN_ANGLE_DEG + (i * Rules.COLS_ANGLE_DEG), 360.0))
|
||||||
RADIAL_COL_ANGLES.push_back(angle)
|
RADIAL_COL_ANGLES.push_back(angle)
|
||||||
RADIAL_UNIT_VECTORS.push_back(Vector2(cos(angle), sin(angle)))
|
RADIAL_UNIT_VECTORS.push_back(Vector2(cos(angle), sin(angle)))
|
||||||
|
|
||||||
|
|
||||||
|
func color_array_text(alpha: float) -> PoolColorArray:
|
||||||
|
var color := Color(COLOR_TEXT.r, COLOR_TEXT.g, COLOR_TEXT.b, alpha)
|
||||||
|
return PoolColorArray([color, color, color, color])
|
|
@ -6,14 +6,32 @@ var fingers = 0 setget set_fingers # setter for show fingers number on scree
|
||||||
var txt_ball = preload("res://assets/ball.png") # preload our ball texture
|
var txt_ball = preload("res://assets/ball.png") # preload our ball texture
|
||||||
var default_font = preload("res://assets/NotoSans.tres") # point to godot standard font
|
var default_font = preload("res://assets/NotoSans.tres") # point to godot standard font
|
||||||
|
|
||||||
|
var buttons_pressed := PoolByteArray()
|
||||||
|
var touchbuttons_pressed := PoolByteArray()
|
||||||
|
signal button_pressed(index) # Add int type to these once Godot supports typed signals
|
||||||
|
signal button_released(index)
|
||||||
|
signal touchbutton_pressed(index)
|
||||||
|
signal touchbutton_released(index)
|
||||||
|
const TOUCHBUTTON_MIN_DIST := 0.8
|
||||||
|
const TOUCHBUTTON_MAX_DIST := 1.05
|
||||||
|
const BUTTON_MIN_DIST := TOUCHBUTTON_MAX_DIST
|
||||||
|
const BUTTON_MAX_DIST := 1.25
|
||||||
|
|
||||||
func _init():
|
func _init():
|
||||||
pass
|
buttons_pressed.resize(Rules.COLS)
|
||||||
|
touchbuttons_pressed.resize(Rules.COLS)
|
||||||
|
for i in Rules.COLS:
|
||||||
|
buttons_pressed[i] = 0
|
||||||
|
touchbuttons_pressed[i] = 0
|
||||||
|
|
||||||
func _ready():
|
func _ready():
|
||||||
set_process_unhandled_input(true) # process user input
|
set_process_unhandled_input(true) # process user input
|
||||||
set_fingers(0)
|
set_fingers(0)
|
||||||
|
connect("button_pressed", self, "print_pressed")
|
||||||
|
|
||||||
|
|
||||||
|
func print_pressed(col: int):
|
||||||
|
print("Pressed %d"%col)
|
||||||
|
|
||||||
|
|
||||||
##########################################################################
|
##########################################################################
|
||||||
|
@ -26,6 +44,7 @@ func _draw():
|
||||||
# DRAW POINTS ################################################
|
# DRAW POINTS ################################################
|
||||||
draw_texture(txt_ball, point.position - Vector2(24, 24))
|
draw_texture(txt_ball, point.position - Vector2(24, 24))
|
||||||
draw_string(default_font, point.position - Vector2(24, 24), str(i))
|
draw_string(default_font, point.position - Vector2(24, 24), str(i))
|
||||||
|
draw_string(default_font, point.position + Vector2(-24, 48), str(point.position))
|
||||||
# if len(touch_positions) > 1:
|
# if len(touch_positions) > 1:
|
||||||
# for i in range(len(touch_positions)-1):
|
# for i in range(len(touch_positions)-1):
|
||||||
# # Draw line
|
# # Draw line
|
||||||
|
@ -35,6 +54,35 @@ func update_data():
|
||||||
touch_positions.clear()
|
touch_positions.clear()
|
||||||
for i in touch_points:
|
for i in touch_points:
|
||||||
touch_positions.push_back(touch_points[i].position)
|
touch_positions.push_back(touch_points[i].position)
|
||||||
|
|
||||||
|
|
||||||
|
var buttons_pressed_temp := []
|
||||||
|
var touchbuttons_pressed_temp := []
|
||||||
|
for i in Rules.COLS:
|
||||||
|
buttons_pressed_temp.append(false)
|
||||||
|
touchbuttons_pressed_temp.append(false)
|
||||||
|
|
||||||
|
for pos in touch_positions:
|
||||||
|
pos -= Vector2(960, 540) # Change this if we move the node
|
||||||
|
var pol = cartesian2polar(pos.x, pos.y)
|
||||||
|
var dist = pol.x/GameTheme.receptor_ring_radius
|
||||||
|
var angle = rad2deg(pol.y)
|
||||||
|
if dist < TOUCHBUTTON_MIN_DIST:
|
||||||
|
continue
|
||||||
|
# bin the angle
|
||||||
|
angle -= Rules.FIRST_COLUMN_ANGLE_DEG - Rules.COLS_TOUCH_ARC_DEG/2.0
|
||||||
|
if fmod(angle, Rules.COLS_ANGLE_DEG) > Rules.COLS_TOUCH_ARC_DEG:
|
||||||
|
continue
|
||||||
|
var col := int(floor(angle/Rules.COLS_ANGLE_DEG))
|
||||||
|
if dist < TOUCHBUTTON_MAX_DIST:
|
||||||
|
touchbuttons_pressed_temp[col] = true
|
||||||
|
elif dist < BUTTON_MAX_DIST:
|
||||||
|
buttons_pressed_temp[col] = true
|
||||||
|
|
||||||
|
for i in Rules.COLS:
|
||||||
|
set_button_state(i, buttons_pressed_temp[i])
|
||||||
|
set_touchbutton_state(i, touchbuttons_pressed_temp[i])
|
||||||
|
|
||||||
set_fingers(len(touch_positions))
|
set_fingers(len(touch_positions))
|
||||||
update()
|
update()
|
||||||
|
|
||||||
|
@ -58,8 +106,23 @@ func _input(event):
|
||||||
##########################################################################
|
##########################################################################
|
||||||
# write how many fingers are tapping the screen
|
# write how many fingers are tapping the screen
|
||||||
func set_fingers(value):
|
func set_fingers(value):
|
||||||
fingers = value
|
fingers = max(value, 0)
|
||||||
if fingers > 0:
|
set_text("Fingers: %d" % fingers)
|
||||||
set_text("Fingers: " + str(fingers))
|
|
||||||
else:
|
func set_button_state(index: int, state: bool):
|
||||||
set_text("Fingers: 0")
|
var new_state = int(state)
|
||||||
|
match new_state - buttons_pressed[index]:
|
||||||
|
1:
|
||||||
|
emit_signal("button_pressed", index)
|
||||||
|
-1:
|
||||||
|
emit_signal("button_released", index)
|
||||||
|
buttons_pressed[index] = new_state
|
||||||
|
|
||||||
|
func set_touchbutton_state(index: int, state: bool):
|
||||||
|
var new_state = int(state)
|
||||||
|
match new_state - touchbuttons_pressed[index]:
|
||||||
|
1:
|
||||||
|
emit_signal("touchbutton_pressed", index)
|
||||||
|
-1:
|
||||||
|
emit_signal("touchbutton_released", index)
|
||||||
|
touchbuttons_pressed[index] = new_state
|
||||||
|
|
22
Note.gd
22
Note.gd
|
@ -36,17 +36,17 @@ class NoteSlide extends NoteBase:
|
||||||
func update_slide_variables():
|
func update_slide_variables():
|
||||||
match slide_type:
|
match slide_type:
|
||||||
Note.SlideType.CHORD:
|
Note.SlideType.CHORD:
|
||||||
values.start = theme.RADIAL_UNIT_VECTORS[column] * theme.receptor_ring_radius
|
values.start = GameTheme.RADIAL_UNIT_VECTORS[column] * GameTheme.receptor_ring_radius
|
||||||
values.end = theme.RADIAL_UNIT_VECTORS[column_release] * theme.receptor_ring_radius
|
values.end = GameTheme.RADIAL_UNIT_VECTORS[column_release] * GameTheme.receptor_ring_radius
|
||||||
values.angle = (values.end - values.start).angle()
|
values.angle = (values.end - values.start).angle()
|
||||||
Note.SlideType.ARC_CW:
|
Note.SlideType.ARC_CW:
|
||||||
values.start_a = theme.RADIAL_COL_ANGLES[column]
|
values.start_a = GameTheme.RADIAL_COL_ANGLES[column]
|
||||||
values.end_a = theme.RADIAL_COL_ANGLES[column_release]
|
values.end_a = GameTheme.RADIAL_COL_ANGLES[column_release]
|
||||||
if values.end_a < values.start_a:
|
if values.end_a < values.start_a:
|
||||||
values.end_a += TAU
|
values.end_a += TAU
|
||||||
Note.SlideType.ARC_ACW:
|
Note.SlideType.ARC_ACW:
|
||||||
values.start_a = theme.RADIAL_COL_ANGLES[column]
|
values.start_a = GameTheme.RADIAL_COL_ANGLES[column]
|
||||||
values.end_a = theme.RADIAL_COL_ANGLES[column_release]
|
values.end_a = GameTheme.RADIAL_COL_ANGLES[column_release]
|
||||||
if values.end_a > values.start_a:
|
if values.end_a > values.start_a:
|
||||||
values.end_a -= TAU
|
values.end_a -= TAU
|
||||||
|
|
||||||
|
@ -56,10 +56,10 @@ class NoteSlide extends NoteBase:
|
||||||
return lerp(values.start, values.end, progress)
|
return lerp(values.start, values.end, progress)
|
||||||
Note.SlideType.ARC_CW:
|
Note.SlideType.ARC_CW:
|
||||||
var circle_angle : float = lerp(values.start_a, values.end_a, progress)
|
var circle_angle : float = lerp(values.start_a, values.end_a, progress)
|
||||||
return polar2cartesian(theme.receptor_ring_radius, circle_angle)
|
return polar2cartesian(GameTheme.receptor_ring_radius, circle_angle)
|
||||||
Note.SlideType.ARC_ACW:
|
Note.SlideType.ARC_ACW:
|
||||||
var circle_angle : float = lerp(values.start_a, values.end_a, progress)
|
var circle_angle : float = lerp(values.start_a, values.end_a, progress)
|
||||||
return polar2cartesian(theme.receptor_ring_radius, circle_angle)
|
return polar2cartesian(GameTheme.receptor_ring_radius, circle_angle)
|
||||||
|
|
||||||
func get_angle(progress: float) -> float:
|
func get_angle(progress: float) -> float:
|
||||||
match slide_type:
|
match slide_type:
|
||||||
|
@ -76,11 +76,11 @@ class NoteSlide extends NoteBase:
|
||||||
# Return unit-circle (r=1) length of slide trail
|
# Return unit-circle (r=1) length of slide trail
|
||||||
match slide_type:
|
match slide_type:
|
||||||
Note.SlideType.CHORD:
|
Note.SlideType.CHORD:
|
||||||
return 2*abs(sin((theme.RADIAL_COL_ANGLES[column_release] - theme.RADIAL_COL_ANGLES[column])/2))
|
return 2*abs(sin((GameTheme.RADIAL_COL_ANGLES[column_release] - GameTheme.RADIAL_COL_ANGLES[column])/2))
|
||||||
Note.SlideType.ARC_CW:
|
Note.SlideType.ARC_CW:
|
||||||
return fposmod(theme.RADIAL_COL_ANGLES[column_release] - theme.RADIAL_COL_ANGLES[column], TAU)
|
return fposmod(GameTheme.RADIAL_COL_ANGLES[column_release] - GameTheme.RADIAL_COL_ANGLES[column], TAU)
|
||||||
Note.SlideType.ARC_ACW:
|
Note.SlideType.ARC_ACW:
|
||||||
return fposmod(theme.RADIAL_COL_ANGLES[column] - theme.RADIAL_COL_ANGLES[column_release], TAU)
|
return fposmod(GameTheme.RADIAL_COL_ANGLES[column] - GameTheme.RADIAL_COL_ANGLES[column_release], TAU)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
122
NoteHandler.gd
122
NoteHandler.gd
|
@ -2,19 +2,20 @@ extends "res://main.gd"
|
||||||
|
|
||||||
# This script will draw all note events.
|
# This script will draw all note events.
|
||||||
|
|
||||||
var tex := preload("res://assets/spritesheet-1024.png")
|
var tex := preload("res://assets/spritesheet-4k.png")
|
||||||
var tex_slide_arrow := preload("res://assets/slide-arrow-512.png")
|
var tex_judgement_text := preload("res://assets/text-4k.png")
|
||||||
|
var tex_slide_arrow := preload("res://assets/slide-arrow-4k.png")
|
||||||
var slide_trail_shadermaterial := preload("res://shaders/slidetrail.tres")
|
var slide_trail_shadermaterial := preload("res://shaders/slidetrail.tres")
|
||||||
|
|
||||||
## Constants for the overall notefield
|
## Constants for the overall notefield
|
||||||
#var theme.RADIAL_COL_ANGLES := PoolRealArray() # ideally const
|
#var GameTheme.RADIAL_COL_ANGLES := PoolRealArray() # ideally const
|
||||||
#var theme.RADIAL_UNIT_VECTORS := PoolVector2Array() # ideally const
|
#var GameTheme.RADIAL_UNIT_VECTORS := PoolVector2Array() # ideally const
|
||||||
#
|
#
|
||||||
#func init_radial_values():
|
#func init_radial_values():
|
||||||
# for i in range(Rules.COLS):
|
# for i in range(Rules.COLS):
|
||||||
# var angle = deg2rad(fmod(Rules.FIRST_COLUMN_ANGLE_DEG + (i * Rules.COLS_ANGLE_DEG), 360.0))
|
# var angle = deg2rad(fmod(Rules.FIRST_COLUMN_ANGLE_DEG + (i * Rules.COLS_ANGLE_DEG), 360.0))
|
||||||
# theme.RADIAL_COL_ANGLES.push_back(angle)
|
# GameTheme.RADIAL_COL_ANGLES.push_back(angle)
|
||||||
# theme.RADIAL_UNIT_VECTORS.push_back(Vector2(cos(angle), sin(angle)))
|
# GameTheme.RADIAL_UNIT_VECTORS.push_back(Vector2(cos(angle), sin(angle)))
|
||||||
|
|
||||||
const SQRT2 := sqrt(2)
|
const SQRT2 := sqrt(2)
|
||||||
const DEG45 := deg2rad(45.0)
|
const DEG45 := deg2rad(45.0)
|
||||||
|
@ -54,10 +55,42 @@ var NORMAL_ARRAY_8 := PoolVector3Array([
|
||||||
DEFAULT_NORMAL, DEFAULT_NORMAL, DEFAULT_NORMAL, DEFAULT_NORMAL
|
DEFAULT_NORMAL, DEFAULT_NORMAL, DEFAULT_NORMAL, DEFAULT_NORMAL
|
||||||
])
|
])
|
||||||
|
|
||||||
|
# Text UVs
|
||||||
|
var text_UV_arrays := []
|
||||||
|
func make_text_UV(row: int, column: int) -> PoolVector2Array:
|
||||||
|
return PoolVector2Array([Vector2(column/4.0, row/8.0), Vector2((column+1)/4.0, row/8.0), Vector2(column/4.0, (row+1)/8.0), Vector2((column+1)/4.0, (row+1)/8.0)])
|
||||||
|
func make_text_UVs():
|
||||||
|
for row in 8:
|
||||||
|
for column in 4:
|
||||||
|
text_UV_arrays.append(make_text_UV(row, column))
|
||||||
|
enum TextStyle {STRAIGHT=0, ARC=1, ARC_EARLY=2, ARC_LATE=3}
|
||||||
|
enum TextWord {NICE=0, OK=4, NG=8, PERFECT=12, GREAT=16, GOOD=20, ALMOST=24, MISS=28}
|
||||||
|
|
||||||
|
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 vertex_array := PoolVector2Array([
|
||||||
|
pos+polar2cartesian(r, angle+GameTheme.JUDGE_TEXT_ANG2), # TODO: fix this UV/vertex order mess
|
||||||
|
pos+polar2cartesian(r, angle+GameTheme.JUDGE_TEXT_ANG1),
|
||||||
|
pos+polar2cartesian(r, angle+GameTheme.JUDGE_TEXT_ANG4),
|
||||||
|
pos+polar2cartesian(r, angle+GameTheme.JUDGE_TEXT_ANG3)
|
||||||
|
])
|
||||||
|
var arrays = []
|
||||||
|
arrays.resize(Mesh.ARRAY_MAX)
|
||||||
|
arrays[Mesh.ARRAY_VERTEX] = vertex_array
|
||||||
|
arrays[Mesh.ARRAY_TEX_UV] = text_UV_arrays[text_id]
|
||||||
|
arrays[Mesh.ARRAY_COLOR] = GameTheme.color_array_text(alpha)
|
||||||
|
mesh.add_surface_from_arrays(Mesh.PRIMITIVE_TRIANGLE_STRIP, arrays)
|
||||||
|
|
||||||
|
func make_judgement_text(mesh: ArrayMesh, text_id: int, col: int, progress:=0.0):
|
||||||
|
make_text_mesh(mesh, text_id,
|
||||||
|
GameTheme.RADIAL_UNIT_VECTORS[col] * GameTheme.receptor_ring_radius * lerp(0.85, 0.8, progress),
|
||||||
|
GameTheme.RADIAL_COL_ANGLES[col]-PI/2.0, lerp(1.0, 0.0, progress), lerp(1.0, 0.5, progress)
|
||||||
|
)
|
||||||
|
|
||||||
# ----------------------------------------------------------------------------------------------------------------------------------------------------
|
# ----------------------------------------------------------------------------------------------------------------------------------------------------
|
||||||
# Helper functions to generate meshes from vertex arrays
|
# Helper functions to generate meshes from vertex arrays
|
||||||
func make_tap_mesh(mesh: ArrayMesh, note_center: Vector2, scale:=1.0, color_array:=theme.COLOR_ARRAY_TAP):
|
func make_tap_mesh(mesh: ArrayMesh, note_center: Vector2, scale:=1.0, color_array:=GameTheme.COLOR_ARRAY_TAP):
|
||||||
var dim = theme.sprite_size2 * scale
|
var dim = GameTheme.sprite_size2 * scale
|
||||||
var vertex_array = PoolVector2Array([note_center + Vector2(-dim, -dim), note_center + Vector2(dim, -dim), note_center + Vector2(-dim, dim), note_center + Vector2(dim, dim)])
|
var vertex_array = PoolVector2Array([note_center + Vector2(-dim, -dim), note_center + Vector2(dim, -dim), note_center + Vector2(-dim, dim), note_center + Vector2(dim, dim)])
|
||||||
var arrays = []
|
var arrays = []
|
||||||
arrays.resize(Mesh.ARRAY_MAX)
|
arrays.resize(Mesh.ARRAY_MAX)
|
||||||
|
@ -67,8 +100,8 @@ func make_tap_mesh(mesh: ArrayMesh, note_center: Vector2, scale:=1.0, color_arra
|
||||||
arrays[Mesh.ARRAY_COLOR] = color_array
|
arrays[Mesh.ARRAY_COLOR] = color_array
|
||||||
mesh.add_surface_from_arrays(Mesh.PRIMITIVE_TRIANGLE_STRIP, arrays)
|
mesh.add_surface_from_arrays(Mesh.PRIMITIVE_TRIANGLE_STRIP, arrays)
|
||||||
|
|
||||||
func make_hold_mesh(mesh: ArrayMesh, note_center: Vector2, note_center_rel: Vector2, scale:=1.0, angle:=0.0, color_array = theme.COLOR_ARRAY_HOLD):
|
func make_hold_mesh(mesh: ArrayMesh, note_center: Vector2, note_center_rel: Vector2, scale:=1.0, angle:=0.0, color_array = GameTheme.COLOR_ARRAY_HOLD):
|
||||||
var dim = theme.sprite_size2 * scale
|
var dim = GameTheme.sprite_size2 * scale
|
||||||
var dim2 = dim * SQRT2
|
var dim2 = dim * SQRT2
|
||||||
var a1 = angle - DEG45
|
var a1 = angle - DEG45
|
||||||
var a2 = angle + DEG45
|
var a2 = angle + DEG45
|
||||||
|
@ -90,8 +123,8 @@ func make_hold_mesh(mesh: ArrayMesh, note_center: Vector2, note_center_rel: Vect
|
||||||
arrays[Mesh.ARRAY_COLOR] = color_array
|
arrays[Mesh.ARRAY_COLOR] = color_array
|
||||||
mesh.add_surface_from_arrays(Mesh.PRIMITIVE_TRIANGLE_STRIP, arrays)
|
mesh.add_surface_from_arrays(Mesh.PRIMITIVE_TRIANGLE_STRIP, arrays)
|
||||||
|
|
||||||
func make_star_mesh(mesh: ArrayMesh, note_center: Vector2, scale:=1.0, angle:=0.0, color_array:=theme.COLOR_ARRAY_STAR):
|
func make_star_mesh(mesh: ArrayMesh, note_center: Vector2, scale:=1.0, angle:=0.0, color_array:=GameTheme.COLOR_ARRAY_STAR):
|
||||||
var dim = theme.sprite_size2 * scale * SQRT2
|
var dim = GameTheme.sprite_size2 * scale * SQRT2
|
||||||
var a1 = angle - DEG45
|
var a1 = angle - DEG45
|
||||||
var a2 = angle + DEG45
|
var a2 = angle + DEG45
|
||||||
var a3 = angle - DEG135
|
var a3 = angle - DEG135
|
||||||
|
@ -108,7 +141,7 @@ func make_star_mesh(mesh: ArrayMesh, note_center: Vector2, scale:=1.0, angle:=0.
|
||||||
arrays[Mesh.ARRAY_COLOR] = color_array
|
arrays[Mesh.ARRAY_COLOR] = color_array
|
||||||
mesh.add_surface_from_arrays(Mesh.PRIMITIVE_TRIANGLE_STRIP, arrays)
|
mesh.add_surface_from_arrays(Mesh.PRIMITIVE_TRIANGLE_STRIP, arrays)
|
||||||
|
|
||||||
#func make_arrow_mesh(mesh: ArrayMesh, vertex_array, color_array = theme.COLOR_ARRAY_TAP):
|
#func make_arrow_mesh(mesh: ArrayMesh, vertex_array, color_array = GameTheme.COLOR_ARRAY_TAP):
|
||||||
# var arrays = []
|
# var arrays = []
|
||||||
# arrays.resize(Mesh.ARRAY_MAX)
|
# arrays.resize(Mesh.ARRAY_MAX)
|
||||||
# arrays[Mesh.ARRAY_VERTEX] = vertex_array
|
# arrays[Mesh.ARRAY_VERTEX] = vertex_array
|
||||||
|
@ -127,7 +160,7 @@ func make_slide_trail_mesh(note) -> ArrayMesh:
|
||||||
var vertices := PoolVector2Array()
|
var vertices := PoolVector2Array()
|
||||||
var uvs := PoolVector2Array()
|
var uvs := PoolVector2Array()
|
||||||
var colors := PoolColorArray()
|
var colors := PoolColorArray()
|
||||||
var size := theme.sprite_size2
|
var size := GameTheme.sprite_size2
|
||||||
var color := Color(0.67, 0.67, 1.0)
|
var color := Color(0.67, 0.67, 1.0)
|
||||||
if note.double_hit:
|
if note.double_hit:
|
||||||
color = Color(1.0, 1.0, 0.35)
|
color = Color(1.0, 1.0, 0.35)
|
||||||
|
@ -180,7 +213,8 @@ func make_slide_trail_mesh(note) -> ArrayMesh:
|
||||||
|
|
||||||
func _init():
|
func _init():
|
||||||
Input.set_mouse_mode(Input.MOUSE_MODE_HIDDEN)
|
Input.set_mouse_mode(Input.MOUSE_MODE_HIDDEN)
|
||||||
theme.init_radial_values()
|
GameTheme.init_radial_values()
|
||||||
|
make_text_UVs()
|
||||||
|
|
||||||
func _draw():
|
func _draw():
|
||||||
var mesh := ArrayMesh.new()
|
var mesh := ArrayMesh.new()
|
||||||
|
@ -190,40 +224,40 @@ func _draw():
|
||||||
var j := 0
|
var j := 0
|
||||||
|
|
||||||
for note in active_notes:
|
for note in active_notes:
|
||||||
var position : float = (t+theme.note_forecast_beats-note.time_hit)/theme.note_forecast_beats
|
var position : float = (t+GameTheme.note_forecast_beats-note.time_hit)/GameTheme.note_forecast_beats
|
||||||
var scale := 1.0
|
var scale := 1.0
|
||||||
noteline_data.set_pixel(i%16, i/16, Color(position, note.column, theme.RADIAL_COL_ANGLES[note.column]))
|
noteline_data.set_pixel(i%16, i/16, Color(position, note.column, GameTheme.RADIAL_COL_ANGLES[note.column]))
|
||||||
i += 1
|
i += 1
|
||||||
if position < theme.INNER_NOTE_CIRCLE_RATIO:
|
if position < GameTheme.INNER_NOTE_CIRCLE_RATIO:
|
||||||
scale *= position/theme.INNER_NOTE_CIRCLE_RATIO
|
scale *= position/GameTheme.INNER_NOTE_CIRCLE_RATIO
|
||||||
position = theme.INNER_NOTE_CIRCLE_RATIO
|
position = GameTheme.INNER_NOTE_CIRCLE_RATIO
|
||||||
var note_center = (theme.RADIAL_UNIT_VECTORS[note.column] * position * theme.receptor_ring_radius)
|
var note_center = (GameTheme.RADIAL_UNIT_VECTORS[note.column] * position * GameTheme.receptor_ring_radius)
|
||||||
match note.type:
|
match note.type:
|
||||||
Note.NOTE_TAP:
|
Note.NOTE_TAP:
|
||||||
var color = theme.COLOR_ARRAY_DOUBLE_4 if note.double_hit else theme.COLOR_ARRAY_TAP
|
var color = GameTheme.COLOR_ARRAY_DOUBLE_4 if note.double_hit else GameTheme.COLOR_ARRAY_TAP
|
||||||
make_tap_mesh(mesh, note_center, scale, color)
|
make_tap_mesh(mesh, note_center, scale, color)
|
||||||
Note.NOTE_HOLD:
|
Note.NOTE_HOLD:
|
||||||
var color = theme.COLOR_ARRAY_DOUBLE_8 if note.double_hit else theme.COLOR_ARRAY_HOLD
|
var color = GameTheme.COLOR_ARRAY_DOUBLE_8 if note.double_hit else GameTheme.COLOR_ARRAY_HOLD
|
||||||
var position_rel : float = (t+theme.note_forecast_beats-note.time_release)/theme.note_forecast_beats
|
var position_rel : float = (t+GameTheme.note_forecast_beats-note.time_release)/GameTheme.note_forecast_beats
|
||||||
if position_rel > 0:
|
if position_rel > 0:
|
||||||
var note_rel_center := (theme.RADIAL_UNIT_VECTORS[note.column] * position_rel * theme.receptor_ring_radius)
|
var note_rel_center := (GameTheme.RADIAL_UNIT_VECTORS[note.column] * position_rel * GameTheme.receptor_ring_radius)
|
||||||
noteline_data.set_pixel(j%16, 15, Color(position_rel, note.column, theme.RADIAL_COL_ANGLES[note.column]))
|
noteline_data.set_pixel(j%16, 15, Color(position_rel, note.column, GameTheme.RADIAL_COL_ANGLES[note.column]))
|
||||||
j += 1
|
j += 1
|
||||||
if position_rel < theme.INNER_NOTE_CIRCLE_RATIO:
|
if position_rel < GameTheme.INNER_NOTE_CIRCLE_RATIO:
|
||||||
position_rel = theme.INNER_NOTE_CIRCLE_RATIO
|
position_rel = GameTheme.INNER_NOTE_CIRCLE_RATIO
|
||||||
var note_center_rel = (theme.RADIAL_UNIT_VECTORS[note.column] * position_rel * theme.receptor_ring_radius)
|
var note_center_rel = (GameTheme.RADIAL_UNIT_VECTORS[note.column] * position_rel * GameTheme.receptor_ring_radius)
|
||||||
make_hold_mesh(mesh, note_center, note_center_rel, scale, theme.RADIAL_COL_ANGLES[note.column], color)
|
make_hold_mesh(mesh, note_center, note_center_rel, scale, GameTheme.RADIAL_COL_ANGLES[note.column], color)
|
||||||
Note.NOTE_SLIDE:
|
Note.NOTE_SLIDE:
|
||||||
var color = theme.COLOR_ARRAY_DOUBLE_4 if note.double_hit else theme.COLOR_ARRAY_STAR
|
var color = GameTheme.COLOR_ARRAY_DOUBLE_4 if note.double_hit else GameTheme.COLOR_ARRAY_STAR
|
||||||
var angle = fmod(t/note.duration, 1.0)*TAU
|
var angle = fmod(t/note.duration, 1.0)*TAU
|
||||||
make_star_mesh(mesh, note_center, scale, angle, color)
|
make_star_mesh(mesh, note_center, scale, angle, color)
|
||||||
var trail_alpha := 1.0
|
var trail_alpha := 1.0
|
||||||
if position < theme.INNER_NOTE_CIRCLE_RATIO:
|
if position < GameTheme.INNER_NOTE_CIRCLE_RATIO:
|
||||||
trail_alpha = 0.0
|
trail_alpha = 0.0
|
||||||
elif position < 1.0:
|
elif position < 1.0:
|
||||||
trail_alpha = min(1.0, (position-theme.INNER_NOTE_CIRCLE_RATIO)/(1-theme.INNER_NOTE_CIRCLE_RATIO*2))
|
trail_alpha = min(1.0, (position-GameTheme.INNER_NOTE_CIRCLE_RATIO)/(1-GameTheme.INNER_NOTE_CIRCLE_RATIO*2))
|
||||||
else:
|
else:
|
||||||
var trail_progress : float = clamp((t - note.time_hit - theme.SLIDE_DELAY)/(note.duration - theme.SLIDE_DELAY), 0.0, 1.0)
|
var trail_progress : float = clamp((t - note.time_hit - GameTheme.SLIDE_DELAY)/(note.duration - GameTheme.SLIDE_DELAY), 0.0, 1.0)
|
||||||
var star_pos : Vector2 = note.get_position(trail_progress)
|
var star_pos : Vector2 = note.get_position(trail_progress)
|
||||||
var star_angle : float = note.get_angle(trail_progress)
|
var star_angle : float = note.get_angle(trail_progress)
|
||||||
make_star_mesh(mesh, star_pos, 1.33, star_angle, color)
|
make_star_mesh(mesh, star_pos, 1.33, star_angle, color)
|
||||||
|
@ -238,6 +272,18 @@ func _draw():
|
||||||
$notelines.set_texture(noteline_data_tex)
|
$notelines.set_texture(noteline_data_tex)
|
||||||
|
|
||||||
$meshinstance.set_mesh(mesh)
|
$meshinstance.set_mesh(mesh)
|
||||||
|
|
||||||
|
var textmesh := ArrayMesh.new()
|
||||||
|
make_judgement_text(textmesh, TextWord.PERFECT+TextStyle.ARC, 0, 0.0)
|
||||||
|
make_judgement_text(textmesh, TextWord.GREAT+TextStyle.ARC_LATE, 1, 0.0)
|
||||||
|
make_judgement_text(textmesh, TextWord.GOOD+TextStyle.ARC_EARLY, 2, 0.1)
|
||||||
|
make_judgement_text(textmesh, TextWord.ALMOST+TextStyle.ARC_LATE, 3, 0.2)
|
||||||
|
make_judgement_text(textmesh, TextWord.MISS+TextStyle.ARC, 4, 0.4)
|
||||||
|
make_judgement_text(textmesh, TextWord.NICE+TextStyle.ARC, 5, 0.6)
|
||||||
|
make_judgement_text(textmesh, TextWord.OK+TextStyle.ARC, 6, 0.8)
|
||||||
|
make_judgement_text(textmesh, TextWord.NG+TextStyle.ARC, 7, 0.9)
|
||||||
|
$JudgeText.set_mesh(textmesh)
|
||||||
|
|
||||||
# draw_mesh(mesh, tex)
|
# draw_mesh(mesh, tex)
|
||||||
|
|
||||||
var noteline_array_image := Image.new()
|
var noteline_array_image := Image.new()
|
||||||
|
@ -251,13 +297,13 @@ func _ready():
|
||||||
all_notes = []
|
all_notes = []
|
||||||
next_note_to_load = 0
|
next_note_to_load = 0
|
||||||
|
|
||||||
$meshinstance.material.set_shader_param("star_color", theme.COLOR_STAR)
|
$meshinstance.material.set_shader_param("star_color", GameTheme.COLOR_STAR)
|
||||||
$meshinstance.material.set_shader_param("held_color", theme.COLOR_HOLD_HELD)
|
$meshinstance.material.set_shader_param("held_color", GameTheme.COLOR_HOLD_HELD)
|
||||||
$meshinstance.material.set_shader_param("bps", bpm/60.0)
|
$meshinstance.material.set_shader_param("bps", bpm/60.0)
|
||||||
$meshinstance.material.set_shader_param("screen_size", get_viewport().get_size())
|
$meshinstance.material.set_shader_param("screen_size", get_viewport().get_size())
|
||||||
$meshinstance.set_texture(tex)
|
$meshinstance.set_texture(tex)
|
||||||
|
|
||||||
var rec_scale1 = (float(screen_height)/float(theme.receptor_ring_radius))*0.5
|
var rec_scale1 = (float(screen_height)/float(GameTheme.receptor_ring_radius))*0.5
|
||||||
var uv_array_playfield := PoolVector2Array([Vector2(-1.0, -1.0)*rec_scale1, Vector2(-1.0, 1.0)*rec_scale1, Vector2(1.0, -1.0)*rec_scale1, Vector2(1.0, 1.0)*rec_scale1])
|
var uv_array_playfield := PoolVector2Array([Vector2(-1.0, -1.0)*rec_scale1, Vector2(-1.0, 1.0)*rec_scale1, Vector2(1.0, -1.0)*rec_scale1, Vector2(1.0, 1.0)*rec_scale1])
|
||||||
# var vertex_array_playfield := PoolVector2Array([
|
# var vertex_array_playfield := PoolVector2Array([
|
||||||
# Vector2(x_margin, screen_height), Vector2(x_margin, 0.0),
|
# Vector2(x_margin, screen_height), Vector2(x_margin, 0.0),
|
||||||
|
@ -332,7 +378,7 @@ func _process(delta):
|
||||||
if next_note_to_load >= len(all_notes):
|
if next_note_to_load >= len(all_notes):
|
||||||
# All notes have been loaded, maybe do something
|
# All notes have been loaded, maybe do something
|
||||||
break
|
break
|
||||||
if all_notes[next_note_to_load].time_hit > (t + theme.note_forecast_beats):
|
if all_notes[next_note_to_load].time_hit > (t + GameTheme.note_forecast_beats):
|
||||||
# Next chronological note isn't ready to load yet
|
# Next chronological note isn't ready to load yet
|
||||||
break
|
break
|
||||||
# Next chronological note is ready to load, load it
|
# Next chronological note is ready to load, load it
|
||||||
|
|
10
Receptors.gd
10
Receptors.gd
|
@ -8,11 +8,11 @@ var center := Vector2(0.0, 0.0)
|
||||||
|
|
||||||
func _draw():
|
func _draw():
|
||||||
# Screen filter
|
# Screen filter
|
||||||
draw_rect(Rect2(-screen_height/2, -screen_height/2, screen_height, screen_height), theme.screen_filter)
|
draw_rect(Rect2(-screen_height/2, -screen_height/2, screen_height, screen_height), GameTheme.screen_filter)
|
||||||
|
|
||||||
# Receptor ring
|
# Receptor ring
|
||||||
var receptor_circle := arc_point_list(center, theme.receptor_ring_radius, 0.0, 360.0, 360)
|
var receptor_circle := arc_point_list(center, GameTheme.receptor_ring_radius, 0.0, 360.0, 360)
|
||||||
var receptor_centers := arc_point_list(center, theme.receptor_ring_radius, Rules.FIRST_COLUMN_ANGLE_DEG, Rules.FIRST_COLUMN_ANGLE_DEG+360.0-Rules.COLS_ANGLE_DEG, Rules.COLS)
|
var receptor_centers := arc_point_list(center, GameTheme.receptor_ring_radius, Rules.FIRST_COLUMN_ANGLE_DEG, Rules.FIRST_COLUMN_ANGLE_DEG+360.0-Rules.COLS_ANGLE_DEG, Rules.COLS)
|
||||||
|
|
||||||
# Shadows
|
# Shadows
|
||||||
for i in range(len(receptor_circle)-1):
|
for i in range(len(receptor_circle)-1):
|
||||||
|
@ -22,7 +22,7 @@ func _draw():
|
||||||
|
|
||||||
# Foregrounds
|
# Foregrounds
|
||||||
for i in range(len(receptor_circle)-1):
|
for i in range(len(receptor_circle)-1):
|
||||||
draw_line(receptor_circle[i], receptor_circle[i+1], theme.receptor_color, ring_px, true)
|
draw_line(receptor_circle[i], receptor_circle[i+1], GameTheme.receptor_color, ring_px, true)
|
||||||
for i in range(len(receptor_centers)):
|
for i in range(len(receptor_centers)):
|
||||||
draw_circle(receptor_centers[i], receptor_px/2, theme.receptor_color)
|
draw_circle(receptor_centers[i], receptor_px/2, GameTheme.receptor_color)
|
||||||
|
|
||||||
|
|
29
main.tscn
29
main.tscn
|
@ -1,18 +1,19 @@
|
||||||
[gd_scene load_steps=13 format=2]
|
[gd_scene load_steps=14 format=2]
|
||||||
|
|
||||||
[ext_resource path="res://main.gd" type="Script" id=1]
|
[ext_resource path="res://main.gd" type="Script" id=1]
|
||||||
[ext_resource path="res://songs/cirno_1080p_rt_cpu1_3M.webm" type="VideoStream" id=2]
|
[ext_resource path="res://songs/cirno_1080p_rt_cpu1_3M.webm" type="VideoStream" id=2]
|
||||||
[ext_resource path="res://video.gd" type="Script" id=3]
|
[ext_resource path="res://video.gd" type="Script" id=3]
|
||||||
[ext_resource path="res://Receptors.gd" type="Script" id=4]
|
[ext_resource path="res://Receptors.gd" type="Script" id=4]
|
||||||
[ext_resource path="res://NoteHandler.gd" type="Script" id=5]
|
[ext_resource path="res://NoteHandler.gd" type="Script" id=5]
|
||||||
[ext_resource path="res://shaders/notelines.shader" type="Shader" id=6]
|
[ext_resource path="res://assets/text-4k.png" type="Texture" id=6]
|
||||||
[ext_resource path="res://shaders/notemesh.shader" type="Shader" id=7]
|
[ext_resource path="res://shaders/notelines.shader" type="Shader" id=7]
|
||||||
[ext_resource path="res://Bezel.gd" type="Script" id=8]
|
[ext_resource path="res://shaders/notemesh.shader" type="Shader" id=8]
|
||||||
[ext_resource path="res://assets/NotoSans.tres" type="DynamicFont" id=9]
|
[ext_resource path="res://Bezel.gd" type="Script" id=9]
|
||||||
[ext_resource path="res://InputHandler.gd" type="Script" id=10]
|
[ext_resource path="res://assets/NotoSans.tres" type="DynamicFont" id=10]
|
||||||
|
[ext_resource path="res://InputHandler.gd" type="Script" id=11]
|
||||||
|
|
||||||
[sub_resource type="ShaderMaterial" id=1]
|
[sub_resource type="ShaderMaterial" id=1]
|
||||||
shader = ExtResource( 6 )
|
shader = ExtResource( 7 )
|
||||||
shader_param/line_color = Plane( 0.8, 0.8, 1, 0.8 )
|
shader_param/line_color = Plane( 0.8, 0.8, 1, 0.8 )
|
||||||
shader_param/line_color_double = Plane( 1, 1, 0.6, 0.9 )
|
shader_param/line_color_double = Plane( 1, 1, 0.6, 0.9 )
|
||||||
shader_param/dot_color = Plane( 1, 1, 1, 0.8 )
|
shader_param/dot_color = Plane( 1, 1, 1, 0.8 )
|
||||||
|
@ -24,7 +25,7 @@ shader_param/dot_fullbright_thickness = 0.013
|
||||||
shader_param/max_angle = 1.0708
|
shader_param/max_angle = 1.0708
|
||||||
|
|
||||||
[sub_resource type="ShaderMaterial" id=2]
|
[sub_resource type="ShaderMaterial" id=2]
|
||||||
shader = ExtResource( 7 )
|
shader = ExtResource( 8 )
|
||||||
shader_param/bps = null
|
shader_param/bps = null
|
||||||
shader_param/star_color = null
|
shader_param/star_color = null
|
||||||
shader_param/held_color = null
|
shader_param/held_color = null
|
||||||
|
@ -34,7 +35,8 @@ shader_param/screen_size = null
|
||||||
position = Vector2( 960, 540 )
|
position = Vector2( 960, 540 )
|
||||||
script = ExtResource( 1 )
|
script = ExtResource( 1 )
|
||||||
__meta__ = {
|
__meta__ = {
|
||||||
"_edit_vertical_guides_": [ 1450.0 ]
|
"_edit_horizontal_guides_": [ ],
|
||||||
|
"_edit_vertical_guides_": [ 420.85, 1500.91 ]
|
||||||
}
|
}
|
||||||
|
|
||||||
[node name="video" type="VideoPlayer" parent="."]
|
[node name="video" type="VideoPlayer" parent="."]
|
||||||
|
@ -61,6 +63,9 @@ script = ExtResource( 5 )
|
||||||
|
|
||||||
[node name="SlideTrailHandler" type="Node2D" parent="NoteHandler"]
|
[node name="SlideTrailHandler" type="Node2D" parent="NoteHandler"]
|
||||||
|
|
||||||
|
[node name="JudgeText" type="MeshInstance2D" parent="NoteHandler"]
|
||||||
|
texture = ExtResource( 6 )
|
||||||
|
|
||||||
[node name="notelines" type="MeshInstance2D" parent="NoteHandler"]
|
[node name="notelines" type="MeshInstance2D" parent="NoteHandler"]
|
||||||
material = SubResource( 1 )
|
material = SubResource( 1 )
|
||||||
|
|
||||||
|
@ -68,13 +73,13 @@ material = SubResource( 1 )
|
||||||
material = SubResource( 2 )
|
material = SubResource( 2 )
|
||||||
|
|
||||||
[node name="Bezel" type="Node2D" parent="."]
|
[node name="Bezel" type="Node2D" parent="."]
|
||||||
script = ExtResource( 8 )
|
script = ExtResource( 9 )
|
||||||
|
|
||||||
[node name="InputHandler" type="Label" parent="."]
|
[node name="InputHandler" type="Label" parent="."]
|
||||||
margin_left = -960.0
|
margin_left = -960.0
|
||||||
margin_top = -540.0
|
margin_top = -540.0
|
||||||
margin_right = 960.0
|
margin_right = 960.0
|
||||||
margin_bottom = 540.0
|
margin_bottom = 540.0
|
||||||
custom_fonts/font = ExtResource( 9 )
|
custom_fonts/font = ExtResource( 10 )
|
||||||
text = "Fingers on the screen:"
|
text = "Fingers on the screen:"
|
||||||
script = ExtResource( 10 )
|
script = ExtResource( 11 )
|
||||||
|
|
|
@ -30,7 +30,7 @@ channel_disable_time=5.0
|
||||||
Note="*res://Note.gd"
|
Note="*res://Note.gd"
|
||||||
FileLoader="*res://FileLoader.gd"
|
FileLoader="*res://FileLoader.gd"
|
||||||
Rules="*res://Rules.gd"
|
Rules="*res://Rules.gd"
|
||||||
theme="*res://theme.gd"
|
GameTheme="*res://GameTheme.gd"
|
||||||
|
|
||||||
[debug]
|
[debug]
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue