From 2d8c4ea8cd88816a241fa784089424fe67821221 Mon Sep 17 00:00:00 2001 From: Luke Hubmayer-Werner Date: Tue, 10 Dec 2019 00:12:18 +1030 Subject: [PATCH] Basic scorescreen --- GameTheme.gd | 11 +++++ Menu.gd | 107 +++++++++++++++++++++++++++++++++++++------------ NoteHandler.gd | 12 +++++- 3 files changed, 104 insertions(+), 26 deletions(-) diff --git a/GameTheme.gd b/GameTheme.gd index 0878b24..853f555 100644 --- a/GameTheme.gd +++ b/GameTheme.gd @@ -23,8 +23,10 @@ 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_HOLD := Color(1, 0.15, 0.15, 1) const COLOR_HOLD_HELD := Color(1, 1, 1, 1) +const COLOR_HOLD_MISS := Color(0.33, 0.05, 0.05, 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_MISS := Color(0.33, 0.33, 0, 1) const COLOR_TEXT := Color(1, 1, 1, 1) const COLOR_DIFFICULTY := PoolColorArray([ # Background, foreground for each @@ -46,12 +48,21 @@ var COLOR_ARRAY_HOLD_HELD := PoolColorArray([ COLOR_HOLD_HELD, COLOR_HOLD_HELD, COLOR_HOLD_HELD, COLOR_HOLD_HELD, COLOR_HOLD_HELD, COLOR_HOLD_HELD, COLOR_HOLD_HELD, COLOR_HOLD_HELD ]) +var COLOR_ARRAY_HOLD_MISS := PoolColorArray([ + COLOR_HOLD_MISS, COLOR_HOLD_MISS, COLOR_HOLD_MISS, COLOR_HOLD_MISS, + COLOR_HOLD_MISS, COLOR_HOLD_MISS, COLOR_HOLD_MISS, COLOR_HOLD_MISS + ]) var COLOR_ARRAY_STAR := PoolColorArray([COLOR_STAR, COLOR_STAR, COLOR_STAR, COLOR_STAR]) var COLOR_ARRAY_DOUBLE_4 := PoolColorArray([COLOR_DOUBLE, COLOR_DOUBLE, COLOR_DOUBLE, COLOR_DOUBLE]) var COLOR_ARRAY_DOUBLE_8 := PoolColorArray([ COLOR_DOUBLE, COLOR_DOUBLE, COLOR_DOUBLE, COLOR_DOUBLE, COLOR_DOUBLE, COLOR_DOUBLE, COLOR_DOUBLE, COLOR_DOUBLE ]) +var COLOR_ARRAY_DOUBLE_MISS_4 := PoolColorArray([COLOR_DOUBLE_MISS, COLOR_DOUBLE_MISS, COLOR_DOUBLE_MISS, COLOR_DOUBLE_MISS]) +var COLOR_ARRAY_DOUBLE_MISS_8 := PoolColorArray([ + COLOR_DOUBLE_MISS, COLOR_DOUBLE_MISS, COLOR_DOUBLE_MISS, COLOR_DOUBLE_MISS, + COLOR_DOUBLE_MISS, COLOR_DOUBLE_MISS, COLOR_DOUBLE_MISS, COLOR_DOUBLE_MISS + ]) var screen_filter := Color(0.0, 0.0, 0.0, 0.2) var receptor_color := Color.blue diff --git a/Menu.gd b/Menu.gd index ead43b4..95ff6ff 100644 --- a/Menu.gd +++ b/Menu.gd @@ -5,7 +5,7 @@ var song_images = {} var genres = {} enum ChartDifficulty {EASY, BASIC, ADV, EXPERT, MASTER} -enum MenuMode {SONG_SELECT, CHART_SELECT, OPTIONS, GAMEPLAY} +enum MenuMode {SONG_SELECT, CHART_SELECT, OPTIONS, GAMEPLAY, SCORE_SCREEN} var selected_genre: int = 0 var selected_song: int = 0 @@ -19,8 +19,10 @@ var menu_mode_prev_fade_timer := 0.0 var menu_mode_prev_fade_timer_duration := 0.25 var currently_playing := false -var touchrects = [] -var touchrects2 = [] +var scorescreen_song_key := "" +var scorescreen_score_data := {} + +var touch_rects = [] var TitleFont := preload("res://assets/MenuTitleFont.tres") var GenreFont := preload("res://assets/MenuGenreFont.tres") @@ -55,6 +57,7 @@ func scan_library(): func _ready(): scan_library() + $"/root/main/NoteHandler".connect("finished_song", self, "finished_song") # Called every frame. 'delta' is the elapsed time since the previous frame. func _process(delta): @@ -164,14 +167,44 @@ func _draw_chart_select(center: Vector2) -> Array: touchrects.append({rect=Rect2(-450.0, 150.0, 900.0, 300.0), chart_idx=-1}) return touchrects +func _draw_score_screen(center: Vector2) -> Array: + var size = 192 + var spacer_x = 12 + var touchrects = [] + var songslist = genres[genres.keys()[selected_genre]] + var song_key = scorescreen_song_key + var x = center.x + var y = center.y - 200 + draw_songtile(song_key, Vector2(x-size/2.0, y), size, false, selected_difficulty, 3) + draw_string_centered(TitleFont, Vector2(x, y+size), song_defs[song_key]["title"], Color(0.95, 0.95, 1.0)) + var notestrs = ["Tap", "Hold", "Slide"] + var judgestrs = ["Perfect", "Great", "Good", "Almost", "Miss"] + for i in len(judgestrs): + draw_string_centered(TitleFont, Vector2(x-300+(120*(i+1)), y+size+64), judgestrs[i], Color(0.95, 0.95, 1.0)) + for i in len(notestrs): + draw_string_centered(TitleFont, Vector2(x-300, y+size+128+64*i), notestrs[i]+"s:", Color(0.95, 0.95, 1.0)) + for j in len(judgestrs): + var score + if j == 0: + score = str(scorescreen_score_data[i][0]) + elif j == 4: + score = str(scorescreen_score_data[i]["MISS"]) + else: + score = str(scorescreen_score_data[i][j] + scorescreen_score_data[i][-j]) + draw_string_centered(TitleFont, Vector2(x-300+(120*(j+1)), y+size+128+64*i), score, Color(0.95, 0.95, 1.0)) +# touchrects.append({rect=r, chart_idx=diff}) + touchrects.append({rect=Rect2(-450.0, 150.0, 900.0, 300.0), next_menu=MenuMode.SONG_SELECT}) + return touchrects + func _draw(): var songs = len(song_defs) var size = 216 var outline_px = 3 var center = Vector2(0.0, -160.0) - touchrects = [] - touchrects2 = [] + touch_rects = [] + 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 @@ -186,6 +219,8 @@ func _draw(): pass MenuMode.GAMEPLAY: pass + MenuMode.SCORE_SCREEN: + _draw_score_screen(center_prev) match menu_mode: MenuMode.SONG_SELECT: _draw_song_select(center_next) @@ -195,16 +230,20 @@ func _draw(): pass MenuMode.GAMEPLAY: pass + MenuMode.SCORE_SCREEN: + _draw_score_screen(center_next) else: match menu_mode: MenuMode.SONG_SELECT: - touchrects = _draw_song_select(center) + touch_rects[menu_mode] = _draw_song_select(center) MenuMode.CHART_SELECT: - touchrects2 = _draw_chart_select(center) + touch_rects[menu_mode] = _draw_chart_select(center) MenuMode.OPTIONS: pass MenuMode.GAMEPLAY: pass + MenuMode.SCORE_SCREEN: + touch_rects[menu_mode] = _draw_score_screen(center) func set_menu_mode(mode): menu_mode_prev = menu_mode @@ -231,26 +270,44 @@ func touch_select_chart(touchdict): self.selected_difficulty = touchdict.chart_idx SFXPlayer.play(SFXPlayer.Type.NON_POSITIONAL, self, snd_interact, -4.5) +func touch_score_screen(touchdict): + if touchdict.has("next_menu"): + set_menu_mode(touchdict.next_menu) + +func finished_song(song_key, score_data): + scorescreen_song_key = song_key + scorescreen_score_data = score_data + set_menu_mode(MenuMode.SCORE_SCREEN) + func _input(event): if event is InputEventScreenTouch: if event.pressed: var pos = event.position - get_global_transform_with_canvas().get_origin() - for d in touchrects: - if d.rect.has_point(pos): - touch_select_song(d) - for d in touchrects2: - if d.rect.has_point(pos): - touch_select_chart(d) - elif event.is_action_pressed("ui_right"): - selected_song += 1 - elif event.is_action_pressed("ui_left"): - selected_song -= 1 - elif event.is_action_pressed("ui_up"): - selected_genre = int(max(0, selected_genre - 1)) - elif event.is_action_pressed("ui_down"): - selected_genre = int(min(1, selected_genre + 1)) - elif event.is_action_pressed("ui_page_up"): - selected_difficulty = int(max(0, selected_difficulty - 1)) - elif event.is_action_pressed("ui_page_down"): - selected_difficulty = int(min(4, selected_difficulty + 1)) + match menu_mode: + MenuMode.SONG_SELECT: + for d in touch_rects[MenuMode.SONG_SELECT]: + if d.rect.has_point(pos): + touch_select_song(d) + MenuMode.CHART_SELECT: + for d in touch_rects[MenuMode.CHART_SELECT]: + if d.rect.has_point(pos): + touch_select_chart(d) + MenuMode.SCORE_SCREEN: + for d in touch_rects[MenuMode.SCORE_SCREEN]: + if d.rect.has_point(pos): + touch_score_screen(d) + match menu_mode: + MenuMode.SONG_SELECT: + if event.is_action_pressed("ui_right"): + selected_song += 1 + elif event.is_action_pressed("ui_left"): + selected_song -= 1 + elif event.is_action_pressed("ui_up"): + selected_genre = int(max(0, selected_genre - 1)) + elif event.is_action_pressed("ui_down"): + selected_genre = int(min(1, selected_genre + 1)) + elif event.is_action_pressed("ui_page_up"): + selected_difficulty = int(max(0, selected_difficulty - 1)) + elif event.is_action_pressed("ui_page_down"): + selected_difficulty = int(min(4, selected_difficulty + 1)) diff --git a/NoteHandler.gd b/NoteHandler.gd index df6bd8d..b44c70d 100644 --- a/NoteHandler.gd +++ b/NoteHandler.gd @@ -1,7 +1,9 @@ extends "res://main.gd" # This script will draw all note events. +signal finished_song(song_key, score_data) var running := false +var song_key = "" var tex := preload("res://assets/spritesheet-4k.png") var tex_judgement_text := preload("res://assets/text-4k.png") @@ -342,9 +344,13 @@ func _draw(): color = GameTheme.color_array_tap(clamp((note.time_death-t)/Note.DEATH_DELAY, 0.0, 1.0), note.double_hit) make_tap_mesh(mesh, note_center, scale, color) Note.NOTE_HOLD: - color = GameTheme.COLOR_ARRAY_DOUBLE_8 if note.double_hit else GameTheme.COLOR_ARRAY_HOLD if note.is_held: color = GameTheme.COLOR_ARRAY_HOLD_HELD + note_center = GameTheme.RADIAL_UNIT_VECTORS[note.column] * GameTheme.receptor_ring_radius + elif position > 1.0: + color = GameTheme.COLOR_ARRAY_DOUBLE_MISS_8 if note.double_hit else GameTheme.COLOR_ARRAY_HOLD_MISS + else: + color = GameTheme.COLOR_ARRAY_DOUBLE_8 if note.double_hit else GameTheme.COLOR_ARRAY_HOLD var position_rel : float = (t+GameTheme.note_forecast_beats-note.time_release)/GameTheme.note_forecast_beats if position_rel > 0: var note_rel_center := (GameTheme.RADIAL_UNIT_VECTORS[note.column] * position_rel * GameTheme.receptor_ring_radius) @@ -429,6 +435,7 @@ func load_track(data: Dictionary, difficulty_idx: int): active_notes = [] all_notes = [] next_note_to_load = 0 + self.song_key = data.directory.rsplit("/", true, 1)[1] all_notes = FileLoader.SRT.load_file(data.directory + "/" + data.chart_filelist[difficulty_idx]) bpm = data.bpm_values[0] sync_offset_audio = data.audio_offsets[0] @@ -565,6 +572,9 @@ func _process(delta): # if (len(active_notes) < 1) and (next_note_to_load >= len(all_notes)) and (time > 10.0) and not get_node("/root/main/video").is_playing(): # time = -10.0 # next_note_to_load = 0 + if (len(active_notes) < 1) and (next_note_to_load >= len(all_notes)) and not get_node("/root/main/music").is_playing(): + self.running = false + emit_signal("finished_song", song_key, scores) # Redraw $meshinstance.material.set_shader_param("screen_size", get_viewport().get_size())