Sound improvements

This commit is contained in:
Luke Hubmayer-Werner 2019-11-22 13:33:47 +10:30
parent 0b48599dac
commit 9628a249b4
3 changed files with 63 additions and 35 deletions

View File

@ -22,7 +22,7 @@ class SRT:
var slide_idxs = {}
while (file.get_position() < (length-2)):
var noteline = file.get_csv_line()
var time_hit := (float(noteline[0]) + float(noteline[1])) * beats_per_measure
var time_hit := (float(noteline[0]) + (float(noteline[1]))-1.0) * beats_per_measure
var duration := float(noteline[2]) * beats_per_measure
var column := int(noteline[3])
var id := int(noteline[4])

View File

@ -9,17 +9,37 @@ var slide_trail_shadermaterial := preload("res://shaders/slidetrail.tres")
var snd_miss := preload("res://assets/miss.wav")
var snd_clap := preload("res://assets/softclap.wav")
var snd_judgement = [snd_clap, snd_clap, snd_clap, snd_clap]
## Constants for the overall notefield
#var GameTheme.RADIAL_COL_ANGLES := PoolRealArray() # ideally const
#var GameTheme.RADIAL_UNIT_VECTORS := PoolVector2Array() # ideally const
#
#func init_radial_values():
# for i in range(Rules.COLS):
# var angle = deg2rad(fmod(Rules.FIRST_COLUMN_ANGLE_DEG + (i * Rules.COLS_ANGLE_DEG), 360.0))
# GameTheme.RADIAL_COL_ANGLES.push_back(angle)
# GameTheme.RADIAL_UNIT_VECTORS.push_back(Vector2(cos(angle), sin(angle)))
var snd_count_in := snd_clap
var snd_judgement := {
0: snd_clap,
1: snd_clap,
-1: snd_clap,
2: snd_clap,
-2: snd_clap,
3: snd_miss,
-3: snd_miss,
"MISS": snd_miss
}
var db_judgement := {
0: 0.0,
1: -1.5,
-1: -1.5,
2: -3.0,
-2: -3.0,
3: -6.0,
-3: -6.0,
"MISS": 0.0
}
var pitch_judgement := {
0: 1.0,
-1: 1.0/0.75,
1: 0.75,
-2: 1.0/0.60,
2: 0.60,
-3: 1.5,
3: 1.5,
"MISS": 1.0
}
const SQRT2 := sqrt(2)
const DEG45 := deg2rad(45.0)
@ -238,7 +258,7 @@ func make_slide_trail_mesh(note) -> ArrayMesh:
#----------------------------------------------------------------------------------------------------------------------------------------------
func activate_note(note, judgement):
active_judgement_texts.append({col=note.column, judgement=judgement, time=t})
SFXPlayer.play(SFXPlayer.Type.NON_POSITIONAL, self, snd_judgement[judgement])
SFXPlayer.play(SFXPlayer.Type.NON_POSITIONAL, self, snd_judgement[judgement], db_judgement[judgement], pitch_judgement[judgement])
scores[note.type][judgement] += 1
note.time_activated = t
@ -255,7 +275,7 @@ func button_pressed(col):
continue
if note.time_activated != INF:
continue
var hit_delta = (t - note.time_hit) * 60.0/bpm # Judgement times are in seconds not gametime
var hit_delta = real_time(t - note.time_hit) # Judgement times are in seconds not gametime
if hit_delta >= 0.0:
if hit_delta > Rules.JUDGEMENT_TIMES_POST[-1]:
continue # missed
@ -359,14 +379,6 @@ func _draw():
# draw_mesh(mesh, tex)
var textmesh := ArrayMesh.new()
# make_judgement_text(textmesh, TextWord.PERFECT+TextStyle.ARC, 0, fmod(t, 1.0))
# make_judgement_text(textmesh, TextWord.GREAT+TextStyle.ARC_LATE, 1, ease(fmod(t, 1.0), 1.25))
# make_judgement_text(textmesh, TextWord.GOOD+TextStyle.ARC_EARLY, 2, clamp(fmod(t, 2.0)-1, 0, 1))
# make_judgement_text(textmesh, TextWord.ALMOST+TextStyle.ARC_LATE, 3, ease(clamp(fmod(t, 2.0)-1, 0, 1), 1.25))
# make_judgement_text(textmesh, TextWord.MISS+TextStyle.ARC, 4, clamp(fmod(t, 2.0)-0.5, 0, 1))
# make_judgement_text(textmesh, TextWord.NICE+TextStyle.ARC, 5, ease(clamp(fmod(t, 2.0)-0.5, 0, 1), 1.25))
# make_judgement_text(textmesh, TextWord.OK+TextStyle.ARC, 6, fmod(t, 2.0)*0.5)
# make_judgement_text(textmesh, TextWord.NG+TextStyle.ARC, 7, ease(fmod(t, 2.0)*0.5, 1.25))
for text in active_judgement_texts:
make_judgement_text(textmesh, TextJudgement[text.judgement], text.col, (t-text.time)/GameTheme.judge_text_duration)
$JudgeText.set_mesh(textmesh)
@ -432,20 +444,23 @@ func _ready():
$"/root/main/InputHandler".connect("touchbutton_released", self, "touchbutton_released")
func intro_click():
SFXPlayer.play(SFXPlayer.Type.NON_POSITIONAL, self, snd_count_in)
func game_time(realtime: float) -> float:
return time * bpm / 60.0
return realtime * bpm / 60.0
func real_time(gametime: float) -> float:
return gametime * 60.0 / bpm
func video_start_time() -> float:
# We give a 4 beat delay until the first note of the chart. Should have a sound for each beat.
var four_beats := 4.0 * 60.0/bpm
return four_beats - sync_offset_video
return -sync_offset_video
func audio_start_time() -> float:
var four_beats := 4.0 * 60.0/bpm
return four_beats - sync_offset_audio
return -sync_offset_audio
# Called every frame. 'delta' is the elapsed time since the previous frame.
var timers_set := false
func _process(delta):
$meshinstance.material.set_shader_param("bps", bpm/60.0)
$notelines.material.set_shader_param("bps", bpm/60.0)
@ -454,6 +469,19 @@ func _process(delta):
time += delta
t = game_time(time)
if (not timers_set) and (t > -5.0):
timers_set = true
for i in [-4.0, -3.0, -2.0, -1.0]:
var delay := real_time(i) - time
var timer = Timer.new()
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):
# get_node("/root/main/video").play()
var vt_delta := time - video_start_time()
@ -475,7 +503,7 @@ func _process(delta):
active_judgement_texts.append({col=note.column, judgement="MISS", time=t})
scores[note.type]["MISS"] += 1
note.missed = true
SFXPlayer.play(SFXPlayer.Type.NON_POSITIONAL, self, snd_miss)
SFXPlayer.play(SFXPlayer.Type.NON_POSITIONAL, self, snd_judgement["MISS"], db_judgement["MISS"])
# Clean out expired judgement texts
# By design they will always be in order so we can ignore anything past the first index

View File

@ -9,9 +9,9 @@ const COLS_TOUCH_ARC_DEG := 240.0/COLS
const JUDGEMENT_STRINGS := ["Perfect", "Great", "Good", "Almost"]
const JUDGEMENT_TIERS := 4
const JUDGEMENT_TIMES_PRE := [0.040, 0.090, 0.135, 0.175]
const JUDGEMENT_TIMES_POST := [0.040, 0.090, 0.135, 0.175]
const JUDGEMENT_TIMES_RELEASE_PRE := [0.050, 0.090, 0.135, 0.175]
const JUDGEMENT_TIMES_RELEASE_POST := [0.100, 0.140, 0.155, 0.225] # Small grace period
const JUDGEMENT_TIMES_SLIDE_PRE := [0.090, 0.135, 0.180, 0.225] # Small grace period, sort-of
const JUDGEMENT_TIMES_SLIDE_POST := [0.090, 0.135, 0.180, 0.225]
const JUDGEMENT_TIMES_PRE := [0.040, 0.090, 0.125, 0.150]
const JUDGEMENT_TIMES_POST := [0.040, 0.090, 0.125, 0.150]
const JUDGEMENT_TIMES_RELEASE_PRE := [0.040, 0.090, 0.125, 0.150]
const JUDGEMENT_TIMES_RELEASE_POST := [0.090, 0.140, 0.175, 0.200] # Small grace period
const JUDGEMENT_TIMES_SLIDE_PRE := [0.090, 0.140, 0.175, 0.200] # Small grace period, sort-of
const JUDGEMENT_TIMES_SLIDE_POST := [0.090, 0.140, 0.175, 0.200]