Files
WacK/Scripts/Scenes/Play.cs
T

136 lines
3.5 KiB
C#
Raw Normal View History

2023-09-17 01:24:53 -07:00
using System.Collections.Generic;
using System.Linq;
2023-09-16 00:40:36 -07:00
using System.Reflection.PortableExecutable;
2023-07-30 00:22:03 -07:00
using Godot;
2023-09-15 12:00:12 -07:00
using WacK.Data.Chart;
using WacK.Data.Mer;
2023-09-16 00:40:36 -07:00
using WacK.Things.TunnelObjects;
2023-07-30 00:22:03 -07:00
namespace WacK.Scenes
{
public class PlayParameters
{
/* TODO: store song ID from internal database
public string songID;
public Difficulty diff;
*/
public string chartPath;
public string soundPath;
public PlayParameters(string chPath, string snPath)
{
chartPath = chPath;
soundPath = snPath;
}
}
public partial class Play : Node
{
// initialized by another scene, BEFORE loading this one!
public static PlayParameters playParams;
2023-09-16 00:40:36 -07:00
// TunnelObjects we can instantiate
public static PackedScene noteTouch = GD.Load<PackedScene>("res://Things/TunnelObjects/Notes/NoteTouch.tscn");
public static PackedScene noteHold = GD.Load<PackedScene>("res://Things/TunnelObjects/Notes/NoteHold.tscn");
2023-09-16 00:40:36 -07:00
[Export]
public Control noteDisplay;
[Export]
public Control scrollDisplay;
2023-09-16 00:40:36 -07:00
[Export]
public Viewport mainViewport;
[Export]
public Viewport leftViewport;
[Export]
public Viewport rightViewport;
2023-09-15 12:00:12 -07:00
private Chart chart;
2023-07-30 00:22:03 -07:00
// scroll speed
private const float PIXELS_PER_SECOND = 2000;
2023-09-15 12:00:12 -07:00
public override void _Ready()
{
// so we can see objects outside of the 0-60min. region
leftViewport.World2D = mainViewport.World2D;
rightViewport.World2D = mainViewport.World2D;
2023-09-16 00:40:36 -07:00
// parse mer and create chart for current play
2023-09-15 12:00:12 -07:00
chart = new(playParams.chartPath);
2023-09-16 00:40:36 -07:00
RealizeChart();
}
/// <summary>
/// Instantiates necessary notes onto noteDisplay for the player to see.
2023-09-16 00:40:36 -07:00
/// </summary>
private void RealizeChart()
{
foreach (var msNote in chart.playNotes)
{
foreach (var note in msNote.Value)
{
THNotePlay nNote;
switch (note.type)
2023-09-16 00:40:36 -07:00
{
case NotePlayType.HoldStart:
nNote = noteHold.Instantiate<THNoteHold>();
2023-09-17 01:24:53 -07:00
RealizeHolds(note as NoteHold);
break;
case NotePlayType.Touch:
nNote = noteTouch.Instantiate<THNotePlay>();
2023-09-16 00:40:36 -07:00
break;
default:
continue;
2023-09-16 00:40:36 -07:00
}
nNote.Init(note);
var nPos = nNote.Position;
nPos.Y = msNote.Key * -PIXELS_PER_SECOND;
2023-09-16 00:40:36 -07:00
nNote.Position = nPos;
noteDisplay.AddChild(nNote);
}
}
}
2023-09-17 01:24:53 -07:00
private void RealizeHolds(NoteHold note)
{
List<Vector2> verts = new(note.points.Count*2 + 2);
// HoldStart's pos
verts.Add(new Vector2((float)note.position * 1920/60, (float)note.time * -PIXELS_PER_SECOND));
// ascending -- "left" side
foreach (var (t, n) in note.points)
{
verts.Add(new Vector2((float)n.position * 1920/60, t * -PIXELS_PER_SECOND));
}
2023-09-17 01:43:12 -07:00
// descending -- "right" side
2023-09-17 01:24:53 -07:00
foreach (var (t, n) in note.points.Reverse())
{
verts.Add(new Vector2((float)((int)n.position + (int)n.size) * 1920/60, t * -PIXELS_PER_SECOND));
}
2023-09-17 01:43:12 -07:00
// HoldStart's pos + size
2023-09-17 01:24:53 -07:00
verts.Add(new Vector2((float)((int)note.position + (int)note.size) * 1920/60, (float)note.time * -PIXELS_PER_SECOND));
2023-09-17 01:43:12 -07:00
var p2d = new Polygon2D
{
Polygon = verts.ToArray(),
Antialiased = true,
Modulate = new Color("#FFFFFFD0")
2023-09-17 01:24:53 -07:00
};
scrollDisplay.AddChild(p2d);
}
2023-09-16 00:40:36 -07:00
public override void _Process(double delta)
{
var nPos = noteDisplay.Position;
nPos.Y += (float)delta * PIXELS_PER_SECOND;
2023-09-17 01:24:53 -07:00
// nPos.Y = 142375.875f; // Bad Apple Expert: OOB hold note
2023-09-16 00:40:36 -07:00
noteDisplay.Position = nPos;
scrollDisplay.Position = nPos;
2023-09-16 00:40:36 -07:00
}
private void OnDestroy()
2023-07-30 00:22:03 -07:00
{
playParams = null;
}
}
}