Basic scorescreen
This commit is contained in:
parent
2b99f4fc4f
commit
2d8c4ea8cd
11
GameTheme.gd
11
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
|
||||
|
|
107
Menu.gd
107
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))
|
||||
|
|
|
@ -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())
|
||||
|
|
Loading…
Reference in New Issue