2023-09-17 23:09:19 -07:00
|
|
|
using System.Linq;
|
2023-09-17 23:51:50 -07:00
|
|
|
using System.Reflection.Metadata;
|
2023-09-16 00:40:36 -07:00
|
|
|
using Godot;
|
2023-09-17 23:51:50 -07:00
|
|
|
using WacK.Configuration;
|
2023-09-16 00:40:36 -07:00
|
|
|
using WacK.Data.Chart;
|
2023-09-17 23:09:19 -07:00
|
|
|
using WacK.Scenes;
|
2023-09-16 00:40:36 -07:00
|
|
|
|
|
|
|
|
namespace WacK.Things.TunnelObjects
|
|
|
|
|
{
|
|
|
|
|
public partial class THNoteHold : THNotePlay
|
|
|
|
|
{
|
2023-09-17 23:09:19 -07:00
|
|
|
public NoteHold holdNoteData;
|
|
|
|
|
private Node2D longThing;
|
2023-09-16 00:40:36 -07:00
|
|
|
|
2023-09-17 23:09:19 -07:00
|
|
|
public void InitHold(NoteHold noteData, Control holdScroll)
|
2023-09-16 00:40:36 -07:00
|
|
|
{
|
2023-09-17 23:09:19 -07:00
|
|
|
holdNoteData = noteData;
|
|
|
|
|
BuildLongThing(holdScroll);
|
2023-09-16 00:40:36 -07:00
|
|
|
}
|
2023-09-17 23:09:19 -07:00
|
|
|
|
|
|
|
|
// Create longThing in segments.
|
2023-09-18 02:14:19 -07:00
|
|
|
private void BuildLongThing(Control holdScroll)
|
2023-09-17 23:09:19 -07:00
|
|
|
{
|
|
|
|
|
longThing = new Node2D();
|
|
|
|
|
holdScroll.AddChild(longThing);
|
2023-09-29 22:37:40 -07:00
|
|
|
longThing.Position = new Vector2(0, (float)-holdNoteData.time * Play.ScrollPxPerSec);
|
2023-09-17 23:09:19 -07:00
|
|
|
|
|
|
|
|
if (holdNoteData.points.Count > 0)
|
|
|
|
|
{
|
|
|
|
|
NotePlay lastHold = holdNoteData;
|
|
|
|
|
float segmentPos = 0;
|
|
|
|
|
foreach (var (_, curNote) in holdNoteData.points)
|
|
|
|
|
{
|
2023-09-29 22:37:40 -07:00
|
|
|
var curLength = Play.ScrollPxPerSec * (float)(curNote.time - lastHold.time);
|
2023-09-17 23:09:19 -07:00
|
|
|
var segment = CreateSegment(lastHold, curNote);
|
|
|
|
|
longThing.AddChild(segment);
|
|
|
|
|
segment.Position = new Vector2(0, segmentPos);
|
|
|
|
|
|
|
|
|
|
segmentPos -= curLength;
|
|
|
|
|
lastHold = curNote;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
GD.PrintErr("Tried to create a long note with no segments!");
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private Polygon2D CreateSegment(NotePlay origin, NotePlay destination)
|
|
|
|
|
{
|
2023-09-17 23:51:50 -07:00
|
|
|
float minuteSize = Constants.BASE_2D_RESOLUTION / 60;
|
2023-09-17 23:09:19 -07:00
|
|
|
|
2023-09-29 22:37:40 -07:00
|
|
|
var length = Play.ScrollPxPerSec * (float)(destination.time - origin.time);
|
2023-09-17 23:09:19 -07:00
|
|
|
var verts = new Vector2[4];
|
|
|
|
|
|
|
|
|
|
int originPos;
|
|
|
|
|
int originSize;
|
|
|
|
|
int destPos;
|
|
|
|
|
int destSize;
|
|
|
|
|
if (3 <= origin.size && origin.size <= 59)
|
|
|
|
|
{
|
|
|
|
|
originPos = ((int)origin.pos + 1)%60;
|
|
|
|
|
originSize = (int)origin.size - 2;
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
originPos = (int)origin.pos;
|
|
|
|
|
originSize = (int)origin.size;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (3 <= destination.size && destination.size <= 59)
|
|
|
|
|
{
|
|
|
|
|
destPos = ((int)destination.pos + 1)%60;
|
|
|
|
|
destSize = (int)destination.size - 2;
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
destPos = (int)destination.pos;
|
|
|
|
|
destSize = (int)destination.size;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
destPos = (int)Util.NearestMinute(originPos, destPos);
|
|
|
|
|
verts[0] = new Vector2(originPos * minuteSize, 0);
|
|
|
|
|
verts[1] = new Vector2(verts[0].X + originSize * minuteSize, 0);
|
|
|
|
|
verts[2] = new Vector2(minuteSize * (destPos + destSize), -length);
|
|
|
|
|
verts[3] = new Vector2(minuteSize * destPos, -length);
|
|
|
|
|
var segment = new Polygon2D() { Polygon = verts, Antialiased = true };
|
|
|
|
|
|
|
|
|
|
// draw overflow
|
|
|
|
|
var originFinalPos = originPos + originSize;
|
|
|
|
|
var destinationFinalPos = destPos + destSize;
|
|
|
|
|
if (originFinalPos > 60 || destinationFinalPos > 60)
|
|
|
|
|
{
|
|
|
|
|
var subSegment = new Polygon2D() { Polygon = verts, Antialiased = true };
|
|
|
|
|
subSegment.Translate(new Vector2(-60 * minuteSize, 0));
|
|
|
|
|
segment.AddChild(subSegment);
|
|
|
|
|
}
|
|
|
|
|
if (originFinalPos < 60 || destinationFinalPos < 60)
|
|
|
|
|
{
|
|
|
|
|
var subSegment = new Polygon2D() { Polygon = verts, Antialiased = true };
|
|
|
|
|
subSegment.Translate(new Vector2(60 * minuteSize, 0));
|
|
|
|
|
segment.AddChild(subSegment);
|
|
|
|
|
}
|
2023-09-18 02:14:19 -07:00
|
|
|
segment.Modulate = new Color("#FFFFFFD0");
|
2023-09-17 23:09:19 -07:00
|
|
|
return segment;
|
|
|
|
|
}
|
2023-09-16 00:40:36 -07:00
|
|
|
}
|
|
|
|
|
}
|