Compare commits
25 Commits
678e145271
...
0.5.0-rc2
Author | SHA1 | Date | |
---|---|---|---|
388a41cb55 | |||
3b23f78960 | |||
4fce8369f0 | |||
373554912a | |||
46039f6a12 | |||
9b872654d5 | |||
2c4ac3191c | |||
20632d9b54 | |||
28cad97bbb | |||
75652ecff1 | |||
1734cf9b72 | |||
5eb9786a7c | |||
16be67dc75 | |||
a7dfaa4558 | |||
3b65dbea5b | |||
3ed7e566dd | |||
f3549353f3 | |||
78bb820f9e | |||
b954dda676 | |||
1be5cc77ca | |||
bf942cbe45 | |||
79bfd6764c | |||
dcc92bb024 | |||
15e9217f93 | |||
79240fdfe8 |
52
Assets/Cryville/Common/Math/FractionUtils.cs
Normal file
52
Assets/Cryville/Common/Math/FractionUtils.cs
Normal file
@@ -0,0 +1,52 @@
|
|||||||
|
using System;
|
||||||
|
|
||||||
|
namespace Cryville.Common.Math {
|
||||||
|
/// <summary>
|
||||||
|
/// Provides a set of <see langword="static" /> methods related to fractions.
|
||||||
|
/// </summary>
|
||||||
|
public static class FractionUtils {
|
||||||
|
/// <summary>
|
||||||
|
/// Converts a <see cref="double" /> decimal to a fraction.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="value">The decimal.</param>
|
||||||
|
/// <param name="error">The error.</param>
|
||||||
|
/// <param name="n">The numerator.</param>
|
||||||
|
/// <param name="d">The denominator.</param>
|
||||||
|
/// <exception cref="ArgumentOutOfRangeException"><paramref name="value" /> is less than 0 or <paramref name="error" /> is not greater than 0 or not less than 1.</exception>
|
||||||
|
public static void ToFraction(double value, double error, out int n, out int d) {
|
||||||
|
if (value < 0.0)
|
||||||
|
throw new ArgumentOutOfRangeException("value", "Must be >= 0.");
|
||||||
|
if (error <= 0.0 || error >= 1.0)
|
||||||
|
throw new ArgumentOutOfRangeException("accuracy", "Must be > 0 and < 1.");
|
||||||
|
|
||||||
|
int num = (int)System.Math.Floor(value);
|
||||||
|
value -= num;
|
||||||
|
|
||||||
|
if (value < error) { n = num; d = 1; return; }
|
||||||
|
if (1 - error < value) { n = num + 1; d = 1; return; }
|
||||||
|
|
||||||
|
int lower_n = 0;
|
||||||
|
int lower_d = 1;
|
||||||
|
int upper_n = 1;
|
||||||
|
int upper_d = 1;
|
||||||
|
while (true) {
|
||||||
|
int middle_n = lower_n + upper_n;
|
||||||
|
int middle_d = lower_d + upper_d;
|
||||||
|
|
||||||
|
if (middle_d * (value + error) < middle_n) {
|
||||||
|
upper_n = middle_n;
|
||||||
|
upper_d = middle_d;
|
||||||
|
}
|
||||||
|
else if (middle_n < (value - error) * middle_d) {
|
||||||
|
lower_n = middle_n;
|
||||||
|
lower_d = middle_d;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
n = num * middle_d + middle_n;
|
||||||
|
d = middle_d;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
11
Assets/Cryville/Common/Math/FractionUtils.cs.meta
Normal file
11
Assets/Cryville/Common/Math/FractionUtils.cs.meta
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 6829ada596979a545a935785eeea2972
|
||||||
|
MonoImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
serializedVersion: 2
|
||||||
|
defaultReferences: []
|
||||||
|
executionOrder: 0
|
||||||
|
icon: {instanceID: 0}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
@@ -62,7 +62,7 @@ namespace Cryville.Crtr.Browsing {
|
|||||||
var meta = new ChartMeta();
|
var meta = new ChartMeta();
|
||||||
string name = item.Name;
|
string name = item.Name;
|
||||||
string desc = "(Unknown)";
|
string desc = "(Unknown)";
|
||||||
var metaFile = new FileInfo(item.FullName + "/meta.json");
|
var metaFile = new FileInfo(item.FullName + "/.umgc");
|
||||||
if (metaFile.Exists) {
|
if (metaFile.Exists) {
|
||||||
using (var reader = new StreamReader(metaFile.FullName)) {
|
using (var reader = new StreamReader(metaFile.FullName)) {
|
||||||
meta = JsonConvert.DeserializeObject<ChartMeta>(reader.ReadToEnd());
|
meta = JsonConvert.DeserializeObject<ChartMeta>(reader.ReadToEnd());
|
||||||
@@ -91,7 +91,7 @@ namespace Cryville.Crtr.Browsing {
|
|||||||
public ChartDetail GetItemDetail(int id) {
|
public ChartDetail GetItemDetail(int id) {
|
||||||
var item = items[id];
|
var item = items[id];
|
||||||
var meta = new ChartMeta();
|
var meta = new ChartMeta();
|
||||||
var metaFile = new FileInfo(item.FullName + "/meta.json");
|
var metaFile = new FileInfo(item.FullName + "/.umgc");
|
||||||
if (metaFile.Exists) {
|
if (metaFile.Exists) {
|
||||||
using (var reader = new StreamReader(metaFile.FullName)) {
|
using (var reader = new StreamReader(metaFile.FullName)) {
|
||||||
meta = JsonConvert.DeserializeObject<ChartMeta>(reader.ReadToEnd());
|
meta = JsonConvert.DeserializeObject<ChartMeta>(reader.ReadToEnd());
|
||||||
@@ -114,7 +114,13 @@ namespace Cryville.Crtr.Browsing {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public string GetItemPath(int id) {
|
public string GetItemPath(int id) {
|
||||||
return items[id].Name + "/.umgc";
|
var item = items[id];
|
||||||
|
var meta = new ChartMeta();
|
||||||
|
var metaFile = new FileInfo(item.FullName + "/.umgc");
|
||||||
|
using (var reader = new StreamReader(metaFile.FullName)) {
|
||||||
|
meta = JsonConvert.DeserializeObject<ChartMeta>(reader.ReadToEnd());
|
||||||
|
}
|
||||||
|
return string.Format("{0}/{1}.json", items[id].Name, meta.data);
|
||||||
}
|
}
|
||||||
|
|
||||||
public bool ImportItemFrom(string path) {
|
public bool ImportItemFrom(string path) {
|
||||||
@@ -137,29 +143,38 @@ namespace Cryville.Crtr.Browsing {
|
|||||||
var tres = (RawChartResource)res;
|
var tres = (RawChartResource)res;
|
||||||
var dir = new DirectoryInfo(_rootPath + "/charts/" + res.Name);
|
var dir = new DirectoryInfo(_rootPath + "/charts/" + res.Name);
|
||||||
if (!dir.Exists) dir.Create();
|
if (!dir.Exists) dir.Create();
|
||||||
using (var writer = new StreamWriter(dir.FullName + "/.umgc")) {
|
using (var writer = new StreamWriter(dir.FullName + "/.json")) {
|
||||||
writer.Write(JsonConvert.SerializeObject(tres.Main, Game.GlobalJsonSerializerSettings));
|
writer.Write(JsonConvert.SerializeObject(tres.Main, Game.GlobalJsonSerializerSettings));
|
||||||
}
|
}
|
||||||
using (var writer = new StreamWriter(dir.FullName + "/meta.json")) {
|
using (var writer = new StreamWriter(dir.FullName + "/.umgc")) {
|
||||||
|
tres.Meta.data = "";
|
||||||
writer.Write(JsonConvert.SerializeObject(tres.Meta, Game.GlobalJsonSerializerSettings));
|
writer.Write(JsonConvert.SerializeObject(tres.Meta, Game.GlobalJsonSerializerSettings));
|
||||||
}
|
}
|
||||||
|
if (tres.Meta.cover != null)
|
||||||
|
new FileInfo(Path.Combine(file.Directory.FullName, tres.Meta.cover))
|
||||||
|
.CopyTo(Path.Combine(dir.FullName, tres.Meta.cover), true);
|
||||||
}
|
}
|
||||||
else if (res is FileResource) {
|
else if (res is FileResource) {
|
||||||
var tres = (FileResource)res;
|
var tres = (FileResource)res;
|
||||||
FileInfo dest;
|
DirectoryInfo dest;
|
||||||
// TODO chart, ruleset, skin
|
if (res is ChartResource)
|
||||||
if (res is CoverResource)
|
dest = new DirectoryInfo(_rootPath + "/charts/" + res.Name);
|
||||||
dest = new FileInfo(_rootPath + "/charts/" + res.Name + "/" + tres.Source.Name);
|
else if (res is RulesetResource)
|
||||||
|
dest = new DirectoryInfo(_rootPath + "/rulesets/" + res.Name);
|
||||||
|
else if (res is SkinResource)
|
||||||
|
dest = new DirectoryInfo(_rootPath + "/skins/" + (res as SkinResource).RulesetName + "/" + res.Name);
|
||||||
else if (res is SongResource)
|
else if (res is SongResource)
|
||||||
dest = new FileInfo(_rootPath + "/songs/" + res.Name + "/" + tres.Source.Extension);
|
dest = new DirectoryInfo(_rootPath + "/songs/" + res.Name);
|
||||||
else {
|
else {
|
||||||
LogAndPopup(3, "Attempt to import unsupported file resource: {0}", res);
|
LogAndPopup(3, "Attempt to import unsupported file resource: {0}", res);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
var dir = dest.Directory;
|
|
||||||
if (!dest.Exists) {
|
if (!dest.Exists) {
|
||||||
if (!dir.Exists) dir.Create();
|
dest.Create();
|
||||||
tres.Source.CopyTo(dest.FullName);
|
tres.Master.CopyTo(Path.Combine(dest.FullName, tres.Master.Extension));
|
||||||
|
foreach (var attachment in tres.Attachments) {
|
||||||
|
attachment.CopyTo(Path.Combine(dest.FullName, attachment.Name));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else LogAndPopup(1, "Resource already exists: {0}", res);
|
else LogAndPopup(1, "Resource already exists: {0}", res);
|
||||||
}
|
}
|
||||||
|
@@ -1,5 +1,7 @@
|
|||||||
using Cryville.Common;
|
using Cryville.Common;
|
||||||
|
using Newtonsoft.Json;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
|
using System.Collections.ObjectModel;
|
||||||
using System.IO;
|
using System.IO;
|
||||||
|
|
||||||
namespace Cryville.Crtr.Browsing {
|
namespace Cryville.Crtr.Browsing {
|
||||||
@@ -26,25 +28,53 @@ namespace Cryville.Crtr.Browsing {
|
|||||||
public override bool Valid { get { return true; } }
|
public override bool Valid { get { return true; } }
|
||||||
}
|
}
|
||||||
public abstract class FileResource : Resource {
|
public abstract class FileResource : Resource {
|
||||||
public FileResource(string name, FileInfo src) : base(name) {
|
public FileResource(string name, FileInfo master) : base(name) {
|
||||||
Source = src;
|
Master = master;
|
||||||
|
Attachments = new List<FileInfo>();
|
||||||
|
}
|
||||||
|
public FileInfo Master { get; private set; }
|
||||||
|
public List<FileInfo> Attachments { get; private set; }
|
||||||
|
public override bool Valid {
|
||||||
|
get {
|
||||||
|
if (!Master.Exists) return false;
|
||||||
|
foreach (var file in Attachments) {
|
||||||
|
if (!file.Exists) return false;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
public FileInfo Source { get; private set; }
|
|
||||||
public override bool Valid { get { return Source.Exists; } }
|
|
||||||
}
|
}
|
||||||
public class ChartResource : FileResource {
|
public class ChartResource : FileResource {
|
||||||
public ChartResource(string name, FileInfo src) : base(name, src) { }
|
public ChartResource(string name, FileInfo master) : base(name, master) {
|
||||||
}
|
using (var reader = new StreamReader(master.FullName)) {
|
||||||
public class CoverResource : FileResource {
|
var meta = JsonConvert.DeserializeObject<ChartMeta>(reader.ReadToEnd());
|
||||||
public CoverResource(string name, FileInfo src) : base(name, src) { }
|
Attachments.Add(new FileInfo(Path.Combine(master.Directory.FullName, meta.data + ".json")));
|
||||||
|
if (meta.cover != null) Attachments.Add(new FileInfo(Path.Combine(master.Directory.FullName, meta.cover)));
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
public class SongResource : FileResource {
|
public class SongResource : FileResource {
|
||||||
public SongResource(string name, FileInfo src) : base(name, src) { }
|
public SongResource(string name, FileInfo master) : base(name, master) { }
|
||||||
}
|
}
|
||||||
public class RulesetResource : FileResource {
|
public class RulesetResource : FileResource {
|
||||||
public RulesetResource(string name, FileInfo src) : base(name, src) { }
|
public RulesetResource(string name, FileInfo master) : base(name, master) {
|
||||||
|
using (var reader = new StreamReader(master.FullName)) {
|
||||||
|
var meta = JsonConvert.DeserializeObject<Ruleset>(reader.ReadToEnd());
|
||||||
|
Attachments.Add(new FileInfo(Path.Combine(master.Directory.FullName, meta.data + ".pdt")));
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
public class SkinResource : FileResource {
|
public class SkinResource : FileResource {
|
||||||
public SkinResource(string name, FileInfo src) : base(name, src) { }
|
public string RulesetName { get; private set; }
|
||||||
|
public SkinResource(string name, FileInfo master) : base(name, master) {
|
||||||
|
using (var reader = new StreamReader(master.FullName)) {
|
||||||
|
var meta = JsonConvert.DeserializeObject<Skin>(reader.ReadToEnd());
|
||||||
|
RulesetName = meta.ruleset;
|
||||||
|
Attachments.Add(new FileInfo(Path.Combine(master.Directory.FullName, meta.data + ".pdt")));
|
||||||
|
foreach (var frame in meta.frames) {
|
||||||
|
Attachments.Add(new FileInfo(Path.Combine(master.Directory.FullName, frame)));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
@@ -377,14 +377,6 @@ namespace Cryville.Crtr {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public Note() {
|
|
||||||
SubmitPropSrc("track", new PropSrc.Float(() => {
|
|
||||||
var i = motions.FirstOrDefault(m => m.RelativeNode == null && m.Name == "track");
|
|
||||||
if (i == null) return ((Vec1)ChartPlayer.motionRegistry["track"].InitValue).Value;
|
|
||||||
else return ((Vec1)i.AbsoluteValue).Value;
|
|
||||||
}));
|
|
||||||
}
|
|
||||||
|
|
||||||
public override EventList GetEventsOfType(string type) {
|
public override EventList GetEventsOfType(string type) {
|
||||||
switch (type) {
|
switch (type) {
|
||||||
case "judges": return new EventList<Judge>(judges);
|
case "judges": return new EventList<Judge>(judges);
|
||||||
|
@@ -250,6 +250,7 @@ namespace Cryville.Crtr {
|
|||||||
status.text = sttext;
|
status.text = sttext;
|
||||||
}
|
}
|
||||||
void OnCameraPostRender(Camera cam) {
|
void OnCameraPostRender(Camera cam) {
|
||||||
|
if (!logEnabled) return;
|
||||||
if (started) timetext = string.Format(
|
if (started) timetext = string.Format(
|
||||||
"\nSTime: {0:R}\nATime: {1:R}\nITime: {2:R}",
|
"\nSTime: {0:R}\nATime: {1:R}\nITime: {2:R}",
|
||||||
cbus.Time,
|
cbus.Time,
|
||||||
@@ -355,7 +356,7 @@ namespace Cryville.Crtr {
|
|||||||
skin = JsonConvert.DeserializeObject<Skin>(reader.ReadToEnd(), new JsonSerializerSettings() {
|
skin = JsonConvert.DeserializeObject<Skin>(reader.ReadToEnd(), new JsonSerializerSettings() {
|
||||||
MissingMemberHandling = MissingMemberHandling.Error
|
MissingMemberHandling = MissingMemberHandling.Error
|
||||||
});
|
});
|
||||||
if (skin.format != 1) throw new FormatException("Invalid skin file version");
|
if (skin.format != Skin.CURRENT_FORMAT) throw new FormatException("Invalid skin file version");
|
||||||
}
|
}
|
||||||
|
|
||||||
loadThread = new Thread(new ParameterizedThreadStart(Load));
|
loadThread = new Thread(new ParameterizedThreadStart(Load));
|
||||||
@@ -508,7 +509,6 @@ namespace Cryville.Crtr {
|
|||||||
throw new ArgumentException("Input config not completed\nPlease complete the input settings");
|
throw new ArgumentException("Input config not completed\nPlease complete the input settings");
|
||||||
}
|
}
|
||||||
|
|
||||||
cbus.AttachSystems(pskin, judge);
|
|
||||||
Logger.Log("main", 0, "Load/WorkerThread", "Attaching handlers");
|
Logger.Log("main", 0, "Load/WorkerThread", "Attaching handlers");
|
||||||
var ch = new ChartHandler(chart, dir);
|
var ch = new ChartHandler(chart, dir);
|
||||||
cbus.RootState.AttachHandler(ch);
|
cbus.RootState.AttachHandler(ch);
|
||||||
@@ -526,6 +526,7 @@ namespace Cryville.Crtr {
|
|||||||
ts.Value.AttachHandler(th);
|
ts.Value.AttachHandler(th);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
cbus.AttachSystems(pskin, judge);
|
||||||
Logger.Log("main", 0, "Load/WorkerThread", "Prehandling (iteration 1)");
|
Logger.Log("main", 0, "Load/WorkerThread", "Prehandling (iteration 1)");
|
||||||
using (var pbus = cbus.Clone(16)) {
|
using (var pbus = cbus.Clone(16)) {
|
||||||
pbus.Forward();
|
pbus.Forward();
|
||||||
@@ -553,7 +554,7 @@ namespace Cryville.Crtr {
|
|||||||
ruleset = JsonConvert.DeserializeObject<Ruleset>(reader.ReadToEnd(), new JsonSerializerSettings() {
|
ruleset = JsonConvert.DeserializeObject<Ruleset>(reader.ReadToEnd(), new JsonSerializerSettings() {
|
||||||
MissingMemberHandling = MissingMemberHandling.Error
|
MissingMemberHandling = MissingMemberHandling.Error
|
||||||
});
|
});
|
||||||
if (ruleset.format != 1) throw new FormatException("Invalid ruleset file version");
|
if (ruleset.format != Ruleset.CURRENT_FORMAT) throw new FormatException("Invalid ruleset file version");
|
||||||
ruleset.LoadPdt(dir);
|
ruleset.LoadPdt(dir);
|
||||||
pruleset = ruleset.Root;
|
pruleset = ruleset.Root;
|
||||||
pruleset.Optimize(etor);
|
pruleset.Optimize(etor);
|
||||||
|
28
Assets/Cryville/Crtr/Components/MeshBase.cs
Normal file
28
Assets/Cryville/Crtr/Components/MeshBase.cs
Normal file
@@ -0,0 +1,28 @@
|
|||||||
|
using System;
|
||||||
|
|
||||||
|
namespace Cryville.Crtr.Components {
|
||||||
|
public abstract class MeshBase : SkinComponent {
|
||||||
|
public MeshBase() {
|
||||||
|
SubmitProperty("zindex", new PropOp.Integer(v => ZIndex = (short)v));
|
||||||
|
}
|
||||||
|
|
||||||
|
protected MeshWrapper mesh = new MeshWrapper();
|
||||||
|
|
||||||
|
short _zindex;
|
||||||
|
public short ZIndex {
|
||||||
|
get {
|
||||||
|
return _zindex;
|
||||||
|
}
|
||||||
|
set {
|
||||||
|
if (value < 0 || value > 5000)
|
||||||
|
throw new ArgumentOutOfRangeException("value", "Z-index must be in [0..5000]");
|
||||||
|
_zindex = value;
|
||||||
|
UpdateZIndex();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
protected void UpdateZIndex() {
|
||||||
|
if (!mesh.Initialized) return;
|
||||||
|
mesh.Renderer.material.renderQueue = _zindex;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
11
Assets/Cryville/Crtr/Components/MeshBase.cs.meta
Normal file
11
Assets/Cryville/Crtr/Components/MeshBase.cs.meta
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 75daba44e5811b943a08e6f137cc2b0c
|
||||||
|
MonoImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
serializedVersion: 2
|
||||||
|
defaultReferences: []
|
||||||
|
executionOrder: 0
|
||||||
|
icon: {instanceID: 0}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
@@ -5,11 +5,10 @@ using System.Collections.Generic;
|
|||||||
using UnityEngine;
|
using UnityEngine;
|
||||||
|
|
||||||
namespace Cryville.Crtr.Components {
|
namespace Cryville.Crtr.Components {
|
||||||
public abstract class SectionalGameObject : SkinComponent {
|
public abstract class SectionalGameObject : MeshBase {
|
||||||
protected Vector3? prevpt;
|
protected Vector3? prevpt;
|
||||||
protected Quaternion? prevrot;
|
protected Quaternion? prevrot;
|
||||||
protected int vertCount = 0;
|
protected int vertCount = 0;
|
||||||
protected MeshWrapper mesh = new MeshWrapper();
|
|
||||||
|
|
||||||
protected override void OnDestroy() {
|
protected override void OnDestroy() {
|
||||||
mesh.Destroy();
|
mesh.Destroy();
|
||||||
@@ -56,7 +55,6 @@ namespace Cryville.Crtr.Components {
|
|||||||
SubmitProperty("head", new PropOp.String(v => head.FrameName = v));
|
SubmitProperty("head", new PropOp.String(v => head.FrameName = v));
|
||||||
SubmitProperty("body", new PropOp.String(v => body.FrameName = v));
|
SubmitProperty("body", new PropOp.String(v => body.FrameName = v));
|
||||||
SubmitProperty("tail", new PropOp.String(v => tail.FrameName = v));
|
SubmitProperty("tail", new PropOp.String(v => tail.FrameName = v));
|
||||||
SubmitProperty("transparent", new PropOp.Boolean(v => transparent = v));
|
|
||||||
SubmitProperty("shape", new op_set_shape(this));
|
SubmitProperty("shape", new op_set_shape(this));
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -94,7 +92,6 @@ namespace Cryville.Crtr.Components {
|
|||||||
public SpriteInfo body = new SpriteInfo();
|
public SpriteInfo body = new SpriteInfo();
|
||||||
public SpriteInfo tail = new SpriteInfo();
|
public SpriteInfo tail = new SpriteInfo();
|
||||||
|
|
||||||
public bool transparent;
|
|
||||||
List<Vector3> vertices;
|
List<Vector3> vertices;
|
||||||
List<float> lengths;
|
List<float> lengths;
|
||||||
float sumLength = 0;
|
float sumLength = 0;
|
||||||
@@ -106,7 +103,7 @@ namespace Cryville.Crtr.Components {
|
|||||||
body.Load();
|
body.Load();
|
||||||
tail.Load();
|
tail.Load();
|
||||||
|
|
||||||
mesh.Init(transform, transparent);
|
mesh.Init(transform);
|
||||||
|
|
||||||
List<Material> materials = new List<Material>();
|
List<Material> materials = new List<Material>();
|
||||||
if (head.FrameName != null) AddMat(materials, head.FrameName);
|
if (head.FrameName != null) AddMat(materials, head.FrameName);
|
||||||
|
@@ -2,14 +2,12 @@
|
|||||||
using UnityEngine;
|
using UnityEngine;
|
||||||
|
|
||||||
namespace Cryville.Crtr.Components {
|
namespace Cryville.Crtr.Components {
|
||||||
public abstract class SpriteBase : SkinComponent {
|
public abstract class SpriteBase : MeshBase {
|
||||||
public SpriteBase() {
|
public SpriteBase() {
|
||||||
SubmitProperty("bound", new op_set_bound(this));
|
SubmitProperty("bound", new op_set_bound(this));
|
||||||
SubmitProperty("transparent", new PropOp.Boolean(v => transparent = v));
|
|
||||||
SubmitProperty("pivot", new PropOp.Vector2(v => Pivot = v));
|
SubmitProperty("pivot", new PropOp.Vector2(v => Pivot = v));
|
||||||
SubmitProperty("scale", new PropOp.Vector2(v => Scale = v));
|
SubmitProperty("scale", new PropOp.Vector2(v => Scale = v));
|
||||||
SubmitProperty("ui", new PropOp.Boolean(v => UI = v));
|
SubmitProperty("ui", new PropOp.Boolean(v => UI = v));
|
||||||
SubmitProperty("zindex", new PropOp.Integer(v => ZIndex = (short)v));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#pragma warning disable IDE1006
|
#pragma warning disable IDE1006
|
||||||
@@ -27,8 +25,6 @@ namespace Cryville.Crtr.Components {
|
|||||||
}
|
}
|
||||||
#pragma warning restore IDE1006
|
#pragma warning restore IDE1006
|
||||||
|
|
||||||
protected MeshWrapper mesh = new MeshWrapper();
|
|
||||||
|
|
||||||
protected override void OnDestroy() {
|
protected override void OnDestroy() {
|
||||||
mesh.Destroy();
|
mesh.Destroy();
|
||||||
}
|
}
|
||||||
@@ -82,21 +78,6 @@ namespace Cryville.Crtr.Components {
|
|||||||
if (da.x != 0) _scale.x = dp.x / da.x;
|
if (da.x != 0) _scale.x = dp.x / da.x;
|
||||||
if (da.y != 0) _scale.y = dp.z / da.y;
|
if (da.y != 0) _scale.y = dp.z / da.y;
|
||||||
}
|
}
|
||||||
|
|
||||||
short _zindex;
|
|
||||||
public short ZIndex {
|
|
||||||
get {
|
|
||||||
return _zindex;
|
|
||||||
}
|
|
||||||
set {
|
|
||||||
_zindex = value;
|
|
||||||
UpdateZIndex();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
protected void UpdateZIndex() {
|
|
||||||
if (!mesh.Initialized) return;
|
|
||||||
mesh.Renderer.sortingOrder = _zindex;
|
|
||||||
}
|
|
||||||
|
|
||||||
static readonly Quaternion uirot
|
static readonly Quaternion uirot
|
||||||
= Quaternion.Euler(new Vector3(-90, 0, 0));
|
= Quaternion.Euler(new Vector3(-90, 0, 0));
|
||||||
@@ -109,10 +90,8 @@ namespace Cryville.Crtr.Components {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public bool transparent = false;
|
|
||||||
|
|
||||||
protected void InternalInit(string meshName = "quad") {
|
protected void InternalInit(string meshName = "quad") {
|
||||||
mesh.Init(transform, transparent);
|
mesh.Init(transform);
|
||||||
mesh.Mesh = GenericResources.Meshes[meshName];
|
mesh.Mesh = GenericResources.Meshes[meshName];
|
||||||
UpdateScale();
|
UpdateScale();
|
||||||
UpdateZIndex();
|
UpdateZIndex();
|
||||||
|
@@ -4,8 +4,6 @@ namespace Cryville.Crtr.Components {
|
|||||||
public class SpriteRect : SpriteBase {
|
public class SpriteRect : SpriteBase {
|
||||||
public SpriteRect() {
|
public SpriteRect() {
|
||||||
SubmitProperty("color", new PropOp.Color(v => Color = v));
|
SubmitProperty("color", new PropOp.Color(v => Color = v));
|
||||||
|
|
||||||
transparent = true;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
Color _color;
|
Color _color;
|
||||||
|
@@ -86,7 +86,7 @@ namespace Cryville.Crtr.Components {
|
|||||||
else if (frameHeight != f.Value.Rect.height) throw new Exception("Inconsistent frame height");
|
else if (frameHeight != f.Value.Rect.height) throw new Exception("Inconsistent frame height");
|
||||||
if (!meshes.ContainsKey(f.Value.Frame.Texture)) {
|
if (!meshes.ContainsKey(f.Value.Frame.Texture)) {
|
||||||
var m = new MeshWrapper();
|
var m = new MeshWrapper();
|
||||||
m.Init(mesh.MeshTransform, transparent);
|
m.Init(mesh.MeshTransform);
|
||||||
m.Mesh = new Mesh();
|
m.Mesh = new Mesh();
|
||||||
m.Renderer.material.mainTexture = f.Value.Frame.Texture;
|
m.Renderer.material.mainTexture = f.Value.Frame.Texture;
|
||||||
meshes.Add(f.Value.Frame.Texture, m);
|
meshes.Add(f.Value.Frame.Texture, m);
|
||||||
|
@@ -35,7 +35,7 @@ namespace Cryville.Crtr.Config {
|
|||||||
ruleset = JsonConvert.DeserializeObject<Ruleset>(reader.ReadToEnd(), new JsonSerializerSettings() {
|
ruleset = JsonConvert.DeserializeObject<Ruleset>(reader.ReadToEnd(), new JsonSerializerSettings() {
|
||||||
MissingMemberHandling = MissingMemberHandling.Error
|
MissingMemberHandling = MissingMemberHandling.Error
|
||||||
});
|
});
|
||||||
if (ruleset.format != 1) throw new FormatException("Invalid ruleset file version");
|
if (ruleset.format != Ruleset.CURRENT_FORMAT) throw new FormatException("Invalid ruleset file version");
|
||||||
ruleset.LoadPdt(dir);
|
ruleset.LoadPdt(dir);
|
||||||
}
|
}
|
||||||
FileInfo cfgfile = new FileInfo(
|
FileInfo cfgfile = new FileInfo(
|
||||||
|
@@ -63,6 +63,13 @@ namespace Cryville.Crtr.Event {
|
|||||||
get { return cs.Container; }
|
get { return cs.Container; }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public SkinContainer skinContainer;
|
||||||
|
public Judge judge;
|
||||||
|
public void AttachSystems(PdtSkin skin, Judge judge) {
|
||||||
|
skinContainer = new SkinContainer(skin);
|
||||||
|
this.judge = judge;
|
||||||
|
}
|
||||||
|
|
||||||
public ContainerHandler() { }
|
public ContainerHandler() { }
|
||||||
public abstract string TypeName {
|
public abstract string TypeName {
|
||||||
get;
|
get;
|
||||||
@@ -82,7 +89,7 @@ namespace Cryville.Crtr.Event {
|
|||||||
/// Called upon initialization of <see cref="cs" />.
|
/// Called upon initialization of <see cref="cs" />.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public virtual void Init() {
|
public virtual void Init() {
|
||||||
cs.skinContainer.MatchStatic(cs);
|
skinContainer.MatchStatic(cs);
|
||||||
foreach (var i in gogroup.GetComponentsInChildren<SkinComponent>())
|
foreach (var i in gogroup.GetComponentsInChildren<SkinComponent>())
|
||||||
i.Init();
|
i.Init();
|
||||||
}
|
}
|
||||||
@@ -115,7 +122,7 @@ namespace Cryville.Crtr.Event {
|
|||||||
public virtual void Update(ContainerState s, StampedEvent ev) {
|
public virtual void Update(ContainerState s, StampedEvent ev) {
|
||||||
bool flag = !Awoken && s.CloneType >= 2 && s.CloneType < 16;
|
bool flag = !Awoken && s.CloneType >= 2 && s.CloneType < 16;
|
||||||
if (flag) PreAwake(s);
|
if (flag) PreAwake(s);
|
||||||
if (Awoken && s.CloneType <= 2) if (gogroup) cs.skinContainer.MatchDynamic(s);
|
if (Awoken && s.CloneType <= 2) if (gogroup) skinContainer.MatchDynamic(s);
|
||||||
if (flag) Awake(s);
|
if (flag) Awake(s);
|
||||||
}
|
}
|
||||||
public virtual void ExUpdate(ContainerState s, StampedEvent ev) { }
|
public virtual void ExUpdate(ContainerState s, StampedEvent ev) { }
|
||||||
@@ -123,7 +130,7 @@ namespace Cryville.Crtr.Event {
|
|||||||
public virtual void EndUpdate(ContainerState s) {
|
public virtual void EndUpdate(ContainerState s) {
|
||||||
if (s.CloneType < 16) {
|
if (s.CloneType < 16) {
|
||||||
Awoken = false;
|
Awoken = false;
|
||||||
if (gogroup && s.CloneType <= 2) cs.skinContainer.MatchDynamic(s);
|
if (gogroup && s.CloneType <= 2) skinContainer.MatchDynamic(s);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
public virtual void Anchor() { }
|
public virtual void Anchor() { }
|
||||||
|
@@ -50,8 +50,6 @@ namespace Cryville.Crtr.Event {
|
|||||||
public byte CloneType;
|
public byte CloneType;
|
||||||
private ContainerState rootPrototype = null;
|
private ContainerState rootPrototype = null;
|
||||||
private ContainerState prototype = null;
|
private ContainerState prototype = null;
|
||||||
public SkinContainer skinContainer;
|
|
||||||
public Judge judge;
|
|
||||||
|
|
||||||
public ContainerHandler Handler {
|
public ContainerHandler Handler {
|
||||||
get;
|
get;
|
||||||
@@ -210,8 +208,7 @@ namespace Cryville.Crtr.Event {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public void AttachSystems(PdtSkin skin, Judge judge) {
|
public void AttachSystems(PdtSkin skin, Judge judge) {
|
||||||
skinContainer = new SkinContainer(skin);
|
Handler.AttachSystems(skin, judge);
|
||||||
this.judge = judge;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public Vector GetRawValue(Identifier key) {
|
public Vector GetRawValue(Identifier key) {
|
||||||
|
@@ -35,6 +35,7 @@ namespace Cryville.Crtr.Event {
|
|||||||
r.invalidatedStates = new HashSet<ContainerState>();
|
r.invalidatedStates = new HashSet<ContainerState>();
|
||||||
r.Time += offsetTime;
|
r.Time += offsetTime;
|
||||||
r.RootState = RootState.Clone(ct);
|
r.RootState = RootState.Clone(ct);
|
||||||
|
r.RootState.StartUpdate();
|
||||||
r.Expand();
|
r.Expand();
|
||||||
r.AttachBus();
|
r.AttachBus();
|
||||||
foreach (var s in r.states) r.invalidatedStates.Add(s.Value);
|
foreach (var s in r.states) r.invalidatedStates.Add(s.Value);
|
||||||
|
@@ -20,7 +20,7 @@ namespace Cryville.Crtr.Event {
|
|||||||
_buckets.Add(reg.Key, new Bucket(reg.Key, 4096));
|
_buckets.Add(reg.Key, new Bucket(reg.Key, 4096));
|
||||||
}
|
}
|
||||||
|
|
||||||
readonly Dictionary<RealtimeMotionValue, string> _rented = new Dictionary<RealtimeMotionValue, string>();
|
readonly Dictionary<RealtimeMotionValue, Identifier> _rented = new Dictionary<RealtimeMotionValue, Identifier>();
|
||||||
public RealtimeMotionValue Rent(Identifier name) {
|
public RealtimeMotionValue Rent(Identifier name) {
|
||||||
var n = name;
|
var n = name;
|
||||||
var obj = _buckets[n].Rent();
|
var obj = _buckets[n].Rent();
|
||||||
|
8
Assets/Cryville/Crtr/Extensions/Bestdori.meta
Normal file
8
Assets/Cryville/Crtr/Extensions/Bestdori.meta
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: b9bd9e24d7c553341a2a12391843542f
|
||||||
|
folderAsset: yes
|
||||||
|
DefaultImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
@@ -0,0 +1,183 @@
|
|||||||
|
using Cryville.Common;
|
||||||
|
using Cryville.Common.Math;
|
||||||
|
using Cryville.Crtr.Browsing;
|
||||||
|
using Newtonsoft.Json;
|
||||||
|
using Newtonsoft.Json.Converters;
|
||||||
|
using Newtonsoft.Json.Linq;
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.IO;
|
||||||
|
|
||||||
|
namespace Cryville.Crtr.Extensions.Bestdori {
|
||||||
|
public class BestdoriChartConverter : ResourceConverter {
|
||||||
|
static readonly string[] SUPPORTED_FORMATS = { ".json" };
|
||||||
|
public override string[] GetSupportedFormats() {
|
||||||
|
return SUPPORTED_FORMATS;
|
||||||
|
}
|
||||||
|
|
||||||
|
public override IEnumerable<Resource> ConvertFrom(FileInfo file) {
|
||||||
|
List<Resource> result = new List<Resource>();
|
||||||
|
List<BestdoriChartEvent> src;
|
||||||
|
using (var reader = new StreamReader(file.FullName)) {
|
||||||
|
src = JsonConvert.DeserializeObject<List<BestdoriChartEvent>>(reader.ReadToEnd());
|
||||||
|
}
|
||||||
|
var group = new Chart.Group() {
|
||||||
|
tracks = new List<Chart.Track>(),
|
||||||
|
notes = new List<Chart.Note>(),
|
||||||
|
motions = new List<Chart.Motion>(),
|
||||||
|
};
|
||||||
|
Chart chart = new Chart {
|
||||||
|
format = 2,
|
||||||
|
time = new BeatTime(0, 0, 1),
|
||||||
|
ruleset = "bang_dream_girls_band_party",
|
||||||
|
sigs = new List<Chart.Signature>(),
|
||||||
|
sounds = new List<Chart.Sound>(),
|
||||||
|
motions = new List<Chart.Motion>(),
|
||||||
|
groups = new List<Chart.Group> { group },
|
||||||
|
};
|
||||||
|
string bgm = null;
|
||||||
|
double? cbpm = null;
|
||||||
|
double pbeat = 0, ctime = 0;
|
||||||
|
double endbeat = 0;
|
||||||
|
foreach (var ev in src) {
|
||||||
|
double cbeat = ev.StartBeat;
|
||||||
|
ctime += cbpm == null ? 0 : (cbeat - pbeat) / cbpm.Value * 60;
|
||||||
|
pbeat = cbeat;
|
||||||
|
if (cbeat > endbeat) endbeat = cbeat;
|
||||||
|
if (ev is BestdoriChartEvent.System) {
|
||||||
|
if (bgm != null) continue;
|
||||||
|
var tev = (BestdoriChartEvent.System)ev;
|
||||||
|
bgm = StringUtils.TrimExt(tev.data);
|
||||||
|
var name = "bang_dream_girls_band_party__" + bgm;
|
||||||
|
result.Add(new SongResource(name, new FileInfo(Path.Combine(file.Directory.FullName, tev.data))));
|
||||||
|
chart.sounds.Add(new Chart.Sound { time = ToBeatTime(tev.beat), id = name });
|
||||||
|
}
|
||||||
|
else if (ev is BestdoriChartEvent.BPM) {
|
||||||
|
var tev = (BestdoriChartEvent.BPM)ev;
|
||||||
|
cbpm = tev.bpm;
|
||||||
|
chart.sigs.Add(new Chart.Signature { time = ToBeatTime(tev.beat), tempo = (float)tev.bpm });
|
||||||
|
}
|
||||||
|
else if (ev is BestdoriChartEvent.Single) {
|
||||||
|
var tev = (BestdoriChartEvent.Single)ev;
|
||||||
|
group.notes.Add(new Chart.Note {
|
||||||
|
time = ToBeatTime(tev.beat),
|
||||||
|
judges = new List<Chart.Judge> { new Chart.Judge { name = tev.flick ? "single_flick" : "single" } },
|
||||||
|
motions = new List<Chart.Motion> { new Chart.Motion { motion = "track:" + tev.lane.ToString() } },
|
||||||
|
});
|
||||||
|
}
|
||||||
|
else if (ev is BestdoriChartEvent.Long) {
|
||||||
|
var tev = (BestdoriChartEvent.Long)ev;
|
||||||
|
var c1 = tev.connections[tev.connections.Count - 1];
|
||||||
|
var note = new Chart.Note {
|
||||||
|
time = ToBeatTime(tev.connections[0].beat),
|
||||||
|
endtime = ToBeatTime(c1.beat),
|
||||||
|
judges = new List<Chart.Judge>(),
|
||||||
|
};
|
||||||
|
for (int i = 0; i < tev.connections.Count; i++) {
|
||||||
|
BestdoriChartEvent.Connection c = tev.connections[i];
|
||||||
|
note.motions.Add(new Chart.Motion { motion = "track:" + c.lane.ToString() });
|
||||||
|
if (i == 0)
|
||||||
|
note.judges.Add(new Chart.Judge { name = "single" });
|
||||||
|
else if (i == tev.connections.Count - 1)
|
||||||
|
note.judges.Add(new Chart.Judge { time = ToBeatTime(c.beat), name = c.flick ? "longend_flick" : "longend" });
|
||||||
|
else if (!c.hidden)
|
||||||
|
note.judges.Add(new Chart.Judge { time = ToBeatTime(c.beat), name = "longnode" });
|
||||||
|
}
|
||||||
|
if (c1.beat > endbeat) endbeat = c1.beat;
|
||||||
|
group.notes.Add(note);
|
||||||
|
}
|
||||||
|
else throw new NotImplementedException("Unsupported event: " + ev.type);
|
||||||
|
}
|
||||||
|
if (bgm == null) throw new FormatException("Chart contains no song");
|
||||||
|
chart.endtime = ToBeatTime(endbeat);
|
||||||
|
result.Add(new RawChartResource(string.Format("bang_dream_girls_band_party__{0}__{1}", bgm, StringUtils.TrimExt(file.Name)), chart, new ChartMeta {
|
||||||
|
name = string.Format("Bandori {0} {1}", bgm, StringUtils.TrimExt(file.Name)),
|
||||||
|
author = "©BanG Dream! Project ©Craft Egg Inc. ©bushiroad",
|
||||||
|
ruleset = "bang_dream_girls_band_party",
|
||||||
|
note_count = group.notes.Count,
|
||||||
|
length = (float)ctime,
|
||||||
|
song = new SongMetaInfo {
|
||||||
|
name = bgm,
|
||||||
|
author = "©BanG Dream! Project ©Craft Egg Inc. ©bushiroad",
|
||||||
|
}
|
||||||
|
}));
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
BeatTime ToBeatTime(double beat, double error = 1e-4) {
|
||||||
|
int i, n, d;
|
||||||
|
FractionUtils.ToFraction(beat, error, out n, out d);
|
||||||
|
i = n / d; n %= d;
|
||||||
|
return new BeatTime(i, n, d);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#pragma warning disable IDE1006
|
||||||
|
[JsonConverter(typeof(BestdoriChartEventCreator))]
|
||||||
|
abstract class BestdoriChartEvent {
|
||||||
|
public abstract string type { get; }
|
||||||
|
public abstract double StartBeat { get; }
|
||||||
|
public abstract class InstantEvent : BestdoriChartEvent {
|
||||||
|
public double beat;
|
||||||
|
public override double StartBeat { get { return beat; } }
|
||||||
|
}
|
||||||
|
public class BPM : InstantEvent {
|
||||||
|
public override string type { get { return "BPM"; } }
|
||||||
|
public double bpm;
|
||||||
|
}
|
||||||
|
public class System : InstantEvent {
|
||||||
|
public override string type { get { return "System"; } }
|
||||||
|
public string data;
|
||||||
|
}
|
||||||
|
public abstract class SingleBase : InstantEvent {
|
||||||
|
public double lane;
|
||||||
|
public bool skill;
|
||||||
|
public bool flick;
|
||||||
|
}
|
||||||
|
public class Single : SingleBase {
|
||||||
|
public override string type { get { return "Single"; } }
|
||||||
|
}
|
||||||
|
public class Directional : SingleBase {
|
||||||
|
public override string type { get { return "Directional"; } }
|
||||||
|
public string direction;
|
||||||
|
public int width;
|
||||||
|
}
|
||||||
|
public class Connection : SingleBase {
|
||||||
|
public override string type { get { return null; } }
|
||||||
|
public bool hidden;
|
||||||
|
}
|
||||||
|
public class Long : BestdoriChartEvent {
|
||||||
|
public override string type { get { return "Long"; } }
|
||||||
|
public List<Connection> connections;
|
||||||
|
public override double StartBeat { get { return connections[0].beat; } }
|
||||||
|
}
|
||||||
|
public class Slide : Long {
|
||||||
|
public override string type { get { return "Slide"; } }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#pragma warning restore IDE1006
|
||||||
|
class BestdoriChartEventCreator : CustomCreationConverter<BestdoriChartEvent> {
|
||||||
|
string _currentType;
|
||||||
|
|
||||||
|
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) {
|
||||||
|
var obj = JObject.ReadFrom(reader);
|
||||||
|
var type = obj["type"];
|
||||||
|
if (type == null) _currentType = null;
|
||||||
|
else _currentType = obj["type"].ToObject<string>();
|
||||||
|
return base.ReadJson(obj.CreateReader(), objectType, existingValue, serializer);
|
||||||
|
}
|
||||||
|
|
||||||
|
public override BestdoriChartEvent Create(Type objectType) {
|
||||||
|
switch (_currentType) {
|
||||||
|
case "BPM": return new BestdoriChartEvent.BPM();
|
||||||
|
case "System": return new BestdoriChartEvent.System();
|
||||||
|
case "Single": return new BestdoriChartEvent.Single();
|
||||||
|
case "Directional": return new BestdoriChartEvent.Directional();
|
||||||
|
case null: return new BestdoriChartEvent.Connection();
|
||||||
|
case "Long": return new BestdoriChartEvent.Long();
|
||||||
|
case "Slide": return new BestdoriChartEvent.Slide();
|
||||||
|
default: throw new ArgumentException("Unknown event type: " + _currentType);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@@ -0,0 +1,11 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: e3c5a8bf05d5e284ba498e91cb0dd35e
|
||||||
|
MonoImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
serializedVersion: 2
|
||||||
|
defaultReferences: []
|
||||||
|
executionOrder: 0
|
||||||
|
icon: {instanceID: 0}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
@@ -74,16 +74,17 @@ namespace Cryville.Crtr.Extensions.Malody {
|
|||||||
Dictionary<MalodyChart.IEvent, StartEventState> longEvents
|
Dictionary<MalodyChart.IEvent, StartEventState> longEvents
|
||||||
= new Dictionary<MalodyChart.IEvent, StartEventState>();
|
= new Dictionary<MalodyChart.IEvent, StartEventState>();
|
||||||
|
|
||||||
float? baseBpm = null;
|
float? baseBpm = null, cbpm = null;
|
||||||
float pbeat = 0f, ctime = 0f;
|
float pbeat = 0f, ctime = 0f;
|
||||||
int[] endbeat = new int[] { 0, 0, 1 };
|
int[] endbeat = new int[] { 0, 0, 1 };
|
||||||
foreach (var ev in events) {
|
foreach (var ev in events) {
|
||||||
float cbeat = ConvertBeat(ev.beat);
|
float cbeat = ConvertBeat(ev.beat);
|
||||||
ctime += baseBpm == null ? 0 : (cbeat - pbeat) / baseBpm.Value * 60f;
|
ctime += cbpm == null ? 0 : (cbeat - pbeat) / cbpm.Value * 60f;
|
||||||
pbeat = cbeat;
|
pbeat = cbeat;
|
||||||
if (ev is MalodyChart.Time) {
|
if (ev is MalodyChart.Time) {
|
||||||
var tev = (MalodyChart.Time)ev;
|
var tev = (MalodyChart.Time)ev;
|
||||||
if (baseBpm == null) baseBpm = tev.bpm;
|
if (baseBpm == null) baseBpm = tev.bpm;
|
||||||
|
cbpm = tev.bpm;
|
||||||
chart.sigs.Add(new Chart.Signature {
|
chart.sigs.Add(new Chart.Signature {
|
||||||
time = new BeatTime(ev.beat[0], ev.beat[1], ev.beat[2]),
|
time = new BeatTime(ev.beat[0], ev.beat[1], ev.beat[2]),
|
||||||
tempo = tev.bpm,
|
tempo = tev.bpm,
|
||||||
@@ -148,7 +149,6 @@ namespace Cryville.Crtr.Extensions.Malody {
|
|||||||
meta.note_count = group.notes.Count;
|
meta.note_count = group.notes.Count;
|
||||||
string chartName = string.Format("{0} - {1}", meta.song.name, meta.name);
|
string chartName = string.Format("{0} - {1}", meta.song.name, meta.name);
|
||||||
if (src.meta.background != null) {
|
if (src.meta.background != null) {
|
||||||
result.Add(new CoverResource(chartName, new FileInfo(file.DirectoryName + "/" + src.meta.background)));
|
|
||||||
meta.cover = src.meta.background;
|
meta.cover = src.meta.background;
|
||||||
}
|
}
|
||||||
result.Add(new RawChartResource(chartName, chart, meta));
|
result.Add(new RawChartResource(chartName, chart, meta));
|
||||||
@@ -166,7 +166,7 @@ namespace Cryville.Crtr.Extensions.Malody {
|
|||||||
}
|
}
|
||||||
|
|
||||||
#pragma warning disable IDE1006
|
#pragma warning disable IDE1006
|
||||||
public struct MalodyChart {
|
struct MalodyChart {
|
||||||
public interface IEvent {
|
public interface IEvent {
|
||||||
int[] beat { get; set; }
|
int[] beat { get; set; }
|
||||||
int[] endbeat { get; set; }
|
int[] endbeat { get; set; }
|
||||||
|
@@ -19,6 +19,7 @@ namespace Cryville.Crtr {
|
|||||||
public static void LoadDefault() {
|
public static void LoadDefault() {
|
||||||
if (loaded) return;
|
if (loaded) return;
|
||||||
Components.Add("image", typeof(SpritePlane));
|
Components.Add("image", typeof(SpritePlane));
|
||||||
|
Components.Add("mesh", typeof(MeshBase));
|
||||||
Components.Add("polysec", typeof(PolygonSGO));
|
Components.Add("polysec", typeof(PolygonSGO));
|
||||||
Components.Add("rect", typeof(SpriteRect));
|
Components.Add("rect", typeof(SpriteRect));
|
||||||
Components.Add("scale3", typeof(SpriteScale3));
|
Components.Add("scale3", typeof(SpriteScale3));
|
||||||
@@ -29,8 +30,7 @@ namespace Cryville.Crtr {
|
|||||||
Meshes.Add("quad_scale3h", Resources.Load<Mesh>("quad_scale3h"));
|
Meshes.Add("quad_scale3h", Resources.Load<Mesh>("quad_scale3h"));
|
||||||
Meshes.Add("quad_scale9", Resources.Load<Mesh>("quad_scale9"));
|
Meshes.Add("quad_scale9", Resources.Load<Mesh>("quad_scale9"));
|
||||||
|
|
||||||
Materials.Add("-CutoutMat", Resources.Load<Material>("CutoutMat"));
|
Materials.Add("-SpriteMat", Resources.Load<Material>("SpriteMat"));
|
||||||
Materials.Add("-TransparentMat", Resources.Load<Material>("TransparentMat"));
|
|
||||||
|
|
||||||
loaded = true;
|
loaded = true;
|
||||||
}
|
}
|
||||||
|
@@ -1,7 +1,10 @@
|
|||||||
using Cryville.Common;
|
using Cryville.Common;
|
||||||
|
using Cryville.Common.Buffers;
|
||||||
using Cryville.Common.Pdt;
|
using Cryville.Common.Pdt;
|
||||||
using Cryville.Crtr.Event;
|
using Cryville.Crtr.Event;
|
||||||
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
|
using System.Globalization;
|
||||||
|
|
||||||
namespace Cryville.Crtr {
|
namespace Cryville.Crtr {
|
||||||
public class Judge {
|
public class Judge {
|
||||||
@@ -30,14 +33,7 @@ namespace Cryville.Crtr {
|
|||||||
public Judge(PdtRuleset rs) {
|
public Judge(PdtRuleset rs) {
|
||||||
_etor = ChartPlayer.etor;
|
_etor = ChartPlayer.etor;
|
||||||
_rs = rs;
|
_rs = rs;
|
||||||
foreach (var s in rs.scores) {
|
InitScores();
|
||||||
var key = s.Key;
|
|
||||||
scoreSrcs.Add(key.Key, new PropSrc.Float(() => scores[key.Key]));
|
|
||||||
scoreOps.Add(key.Key, new PropOp.Float(v => scores[key.Key] = v));
|
|
||||||
scoreFmtKeys.Add(key.Key, IdentifierManager.SharedInstance.Request("_score_" + (string)key.Name));
|
|
||||||
scoreDefs.Add(key.Key, s.Value);
|
|
||||||
scores.Add(key.Key, s.Value.init);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
public void Prepare(float st, float et, Identifier input, JudgeDefinition def, ContainerState container) {
|
public void Prepare(float st, float et, Identifier input, JudgeDefinition def, ContainerState container) {
|
||||||
List<JudgeEvent> list;
|
List<JudgeEvent> list;
|
||||||
@@ -166,42 +162,95 @@ namespace Cryville.Crtr {
|
|||||||
var key = scoreop.Key;
|
var key = scoreop.Key;
|
||||||
_etor.ContextSelfValue = scoreSrcs[key.name.Key];
|
_etor.ContextSelfValue = scoreSrcs[key.name.Key];
|
||||||
_etor.Evaluate(scoreOps[key.name.Key], scoreop.Value);
|
_etor.Evaluate(scoreOps[key.name.Key], scoreop.Value);
|
||||||
scoreSrcs[key.name.Key].Invalidate();
|
InvalidateScore(key.name.Key);
|
||||||
foreach (var s in _rs.scores) {
|
foreach (var s in _rs.scores) {
|
||||||
if (s.Value.value != null) {
|
if (s.Value.value != null) {
|
||||||
_etor.ContextSelfValue = scoreSrcs[s.Key.Key];
|
_etor.ContextSelfValue = scoreSrcs[s.Key.Key];
|
||||||
_etor.Evaluate(scoreOps[s.Key.Key], s.Value.value);
|
_etor.Evaluate(scoreOps[s.Key.Key], s.Value.value);
|
||||||
scoreSrcs[s.Key.Key].Invalidate();
|
InvalidateScore(s.Key.Key);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
ScoreCache.Clear();
|
|
||||||
}
|
}
|
||||||
readonly Dictionary<int, int> scoreFmtKeys = new Dictionary<int, int>();
|
readonly Dictionary<int, int> scoreStringKeys = new Dictionary<int, int>();
|
||||||
|
readonly Dictionary<int, int> scoreStringKeysRev = new Dictionary<int, int>();
|
||||||
readonly Dictionary<int, PropSrc> scoreSrcs = new Dictionary<int, PropSrc>();
|
readonly Dictionary<int, PropSrc> scoreSrcs = new Dictionary<int, PropSrc>();
|
||||||
readonly Dictionary<int, PropOp> scoreOps = new Dictionary<int, PropOp>();
|
readonly Dictionary<int, PropOp> scoreOps = new Dictionary<int, PropOp>();
|
||||||
readonly Dictionary<int, ScoreDefinition> scoreDefs = new Dictionary<int, ScoreDefinition>();
|
readonly Dictionary<int, ScoreDefinition> scoreDefs = new Dictionary<int, ScoreDefinition>();
|
||||||
public readonly Dictionary<int, float> scores = new Dictionary<int, float>();
|
readonly Dictionary<int, float> scores = new Dictionary<int, float>();
|
||||||
readonly Dictionary<int, string> ScoreCache = new Dictionary<int, string>();
|
readonly Dictionary<int, string> scoreStringCache = new Dictionary<int, string>();
|
||||||
readonly object _lock = new object();
|
readonly Dictionary<int, PropSrc> scoreStringSrcs = new Dictionary<int, PropSrc>();
|
||||||
public Dictionary<int, string> GetFormattedScoreStrings() {
|
readonly ArrayPool<byte> scoreStringPool = new ArrayPool<byte>();
|
||||||
lock (_lock) {
|
void InitScores() {
|
||||||
if (ScoreCache.Count == 0) {
|
foreach (var s in _rs.scores) {
|
||||||
foreach (var s in scores)
|
var key = s.Key.Key;
|
||||||
ScoreCache.Add(scoreFmtKeys[s.Key], s.Value.ToString(scoreDefs[s.Key].format));
|
var strkey = IdentifierManager.SharedInstance.Request("_score_" + (string)s.Key.Name);
|
||||||
}
|
scoreStringKeys.Add(key, strkey);
|
||||||
return ScoreCache;
|
scoreStringKeysRev.Add(strkey, key);
|
||||||
|
scoreSrcs.Add(key, new PropSrc.Float(() => scores[key]));
|
||||||
|
scoreOps.Add(key, new PropOp.Float(v => scores[key] = v));
|
||||||
|
scoreDefs.Add(key, s.Value);
|
||||||
|
scores.Add(key, s.Value.init);
|
||||||
|
scoreStringCache.Add(scoreStringKeys[key], null);
|
||||||
|
scoreStringSrcs.Add(scoreStringKeys[key], new ScoreStringSrc(scoreStringPool, () => GetScoreString(strkey)));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
void InvalidateScore(int key) {
|
||||||
|
scoreSrcs[key].Invalidate();
|
||||||
|
scoreStringCache[scoreStringKeys[key]] = null;
|
||||||
|
scoreStringSrcs[scoreStringKeys[key]].Invalidate();
|
||||||
|
}
|
||||||
|
string GetScoreString(int key) {
|
||||||
|
var result = scoreStringCache[key];
|
||||||
|
if (result == null) {
|
||||||
|
var rkey = scoreStringKeysRev[key];
|
||||||
|
return scoreStringCache[key] = scores[rkey].ToString(scoreDefs[rkey].format, CultureInfo.InvariantCulture);
|
||||||
|
}
|
||||||
|
else return result;
|
||||||
|
}
|
||||||
|
public bool TryGetScoreSrc(int key, out PropSrc value) {
|
||||||
|
return scoreSrcs.TryGetValue(key, out value);
|
||||||
|
}
|
||||||
|
public bool TryGetScoreStringSrc(int key, out PropSrc value) {
|
||||||
|
return scoreStringSrcs.TryGetValue(key, out value);
|
||||||
|
}
|
||||||
public string GetFullFormattedScoreString() {
|
public string GetFullFormattedScoreString() {
|
||||||
bool flag = false;
|
bool flag = false;
|
||||||
string result = "";
|
string result = "";
|
||||||
foreach (var s in GetFormattedScoreStrings()) {
|
foreach (var s in scores.Keys) {
|
||||||
result += string.Format(flag ? "\n{0}: {1}" : "{0}: {1}", IdentifierManager.SharedInstance.Retrieve(s.Key), s.Value);
|
result += string.Format(flag ? "\n{0}: {1}" : "{0}: {1}", IdentifierManager.SharedInstance.Retrieve(s), GetScoreString(scoreStringKeys[s]));
|
||||||
flag = true;
|
flag = true;
|
||||||
}
|
}
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
class ScoreStringSrc : PropSrc {
|
||||||
|
readonly Func<string> _cb;
|
||||||
|
readonly ArrayPool<byte> _pool;
|
||||||
|
byte[] _buf;
|
||||||
|
public ScoreStringSrc(ArrayPool<byte> pool, Func<string> cb) {
|
||||||
|
_pool = pool;
|
||||||
|
_cb = cb;
|
||||||
|
}
|
||||||
|
public override void Invalidate() {
|
||||||
|
base.Invalidate();
|
||||||
|
if (_buf != null) {
|
||||||
|
_pool.Return(_buf);
|
||||||
|
_buf = null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
protected override unsafe void InternalGet(out int type, out byte[] value) {
|
||||||
|
var src = _cb();
|
||||||
|
int strlen = src.Length;
|
||||||
|
type = PdtInternalType.String;
|
||||||
|
value = _pool.Rent(sizeof(int) + strlen * sizeof(char));
|
||||||
|
fixed (byte* _ptr = value) {
|
||||||
|
char* ptr = (char*)(_ptr + sizeof(int));
|
||||||
|
*(int*)_ptr = strlen;
|
||||||
|
int i = 0;
|
||||||
|
foreach (var c in src) ptr[i++] = c;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
public class InputDefinition {
|
public class InputDefinition {
|
||||||
public int dim;
|
public int dim;
|
||||||
|
@@ -15,6 +15,7 @@ namespace Cryville.Crtr {
|
|||||||
SettingsPanel m_settingsPanel;
|
SettingsPanel m_settingsPanel;
|
||||||
#pragma warning restore IDE0044
|
#pragma warning restore IDE0044
|
||||||
|
|
||||||
|
int frameIndex = 2;
|
||||||
bool initialized = false;
|
bool initialized = false;
|
||||||
int totalTasks = 0;
|
int totalTasks = 0;
|
||||||
#pragma warning disable IDE0051
|
#pragma warning disable IDE0051
|
||||||
@@ -27,7 +28,11 @@ namespace Cryville.Crtr {
|
|||||||
if (!initialized) {
|
if (!initialized) {
|
||||||
int taskCount = Game.NetworkTaskWorker.TaskCount;
|
int taskCount = Game.NetworkTaskWorker.TaskCount;
|
||||||
if (totalTasks < taskCount) totalTasks = taskCount;
|
if (totalTasks < taskCount) totalTasks = taskCount;
|
||||||
m_progressBar.value = 1 - (float)taskCount / totalTasks;
|
if (frameIndex > 0) {
|
||||||
|
frameIndex--;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
m_progressBar.value = totalTasks == 0 ? 1 : (1 - (float)taskCount / totalTasks);
|
||||||
if (taskCount == 0) {
|
if (taskCount == 0) {
|
||||||
initialized = true;
|
initialized = true;
|
||||||
m_targetAnimator.SetTrigger("T_Main");
|
m_targetAnimator.SetTrigger("T_Main");
|
||||||
|
@@ -22,23 +22,16 @@ namespace Cryville.Crtr {
|
|||||||
get;
|
get;
|
||||||
private set;
|
private set;
|
||||||
}
|
}
|
||||||
public bool Transparent {
|
|
||||||
get;
|
|
||||||
private set;
|
|
||||||
}
|
|
||||||
public bool Initialized {
|
public bool Initialized {
|
||||||
get;
|
get;
|
||||||
private set;
|
private set;
|
||||||
}
|
}
|
||||||
public Material NewMaterial {
|
public Material NewMaterial {
|
||||||
get {
|
get {
|
||||||
return Material.Instantiate(GenericResources.Materials[
|
return Material.Instantiate(GenericResources.Materials["-SpriteMat"]);
|
||||||
Transparent ? "-TransparentMat" : "-CutoutMat"
|
|
||||||
]);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
public void Init(Transform parent, bool transparent = false) {
|
public void Init(Transform parent) {
|
||||||
Transparent = transparent;
|
|
||||||
MeshObject = new GameObject("__mesh__");
|
MeshObject = new GameObject("__mesh__");
|
||||||
MeshTransform = MeshObject.transform;
|
MeshTransform = MeshObject.transform;
|
||||||
MeshTransform.SetParent(parent, false);
|
MeshTransform.SetParent(parent, false);
|
||||||
@@ -48,9 +41,7 @@ namespace Cryville.Crtr {
|
|||||||
MeshObject.AddComponent<MeshRenderer>();
|
MeshObject.AddComponent<MeshRenderer>();
|
||||||
MeshFilter = MeshObject.GetComponent<MeshFilter>();
|
MeshFilter = MeshObject.GetComponent<MeshFilter>();
|
||||||
Renderer = MeshObject.GetComponent<Renderer>();
|
Renderer = MeshObject.GetComponent<Renderer>();
|
||||||
Renderer.material = GenericResources.Materials[
|
Renderer.material = GenericResources.Materials["-SpriteMat"];
|
||||||
transparent ? "-TransparentMat" : "-CutoutMat"
|
|
||||||
]; // TODO
|
|
||||||
Initialized = true;
|
Initialized = true;
|
||||||
}
|
}
|
||||||
public void Destroy() {
|
public void Destroy() {
|
||||||
|
@@ -11,7 +11,6 @@ namespace Cryville.Crtr {
|
|||||||
readonly GroupHandler gh;
|
readonly GroupHandler gh;
|
||||||
public readonly Chart.Note Event;
|
public readonly Chart.Note Event;
|
||||||
readonly PdtRuleset ruleset;
|
readonly PdtRuleset ruleset;
|
||||||
readonly Judge judge;
|
|
||||||
public NoteHandler(GroupHandler gh, Chart.Note ev, PdtRuleset rs, Judge j) : base() {
|
public NoteHandler(GroupHandler gh, Chart.Note ev, PdtRuleset rs, Judge j) : base() {
|
||||||
this.gh = gh;
|
this.gh = gh;
|
||||||
Event = ev;
|
Event = ev;
|
||||||
@@ -62,18 +61,6 @@ namespace Cryville.Crtr {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
readonly Dictionary<Chart.Motion, Vec1> phMotions = new Dictionary<Chart.Motion, Vec1>();
|
|
||||||
bool invalidated = false;
|
|
||||||
readonly List<StampedEvent.Judge> patchedJudgeEvents = new List<StampedEvent.Judge>();
|
|
||||||
|
|
||||||
public override void StartUpdate(ContainerState s) {
|
|
||||||
base.StartUpdate(s);
|
|
||||||
/*if (s.CloneType == 16 && Event.judge != null) {
|
|
||||||
// var etor = new Evaluator();
|
|
||||||
//CompiledRuleset.PatchJudge(Event, ChartPlayer.cruleset.primary_judges[Event.judge], s.Time, etor, patchedJudgeEvents, !Event.@long);
|
|
||||||
}*/
|
|
||||||
}
|
|
||||||
|
|
||||||
public override void Update(ContainerState s, StampedEvent ev) {
|
public override void Update(ContainerState s, StampedEvent ev) {
|
||||||
base.Update(s, ev);
|
base.Update(s, ev);
|
||||||
if (s.CloneType == 1) {
|
if (s.CloneType == 1) {
|
||||||
@@ -103,73 +90,6 @@ namespace Cryville.Crtr {
|
|||||||
ChartPlayer.etor.ContextState = null;
|
ChartPlayer.etor.ContextState = null;
|
||||||
ChartPlayer.etor.ContextEvent = null;
|
ChartPlayer.etor.ContextEvent = null;
|
||||||
}
|
}
|
||||||
else if (ev.Unstamped is Chart.Motion) {
|
|
||||||
/*var tev = (Chart.Motion)ev.Unstamped;
|
|
||||||
if (tev.Name != "judge") return;
|
|
||||||
phMotions.Add(tev, (Vec1)s.GetRawValue<Vec1>(tev.Name).Clone());*/
|
|
||||||
}
|
|
||||||
else if (ev.Unstamped is InstantEvent) {
|
|
||||||
/*var oev = ((InstantEvent)ev.Unstamped).Original;
|
|
||||||
if (oev is Chart.Motion) {
|
|
||||||
var tev = (Chart.Motion)oev;
|
|
||||||
if (tev.Name != "judge") return;
|
|
||||||
var v0 = phMotions[tev];
|
|
||||||
var v1 = s.GetRawValue<Vec1>(tev.Name);
|
|
||||||
// var etor = new Evaluator();
|
|
||||||
for (var vi = Mathf.Ceil(v0.Value); vi < v1.Value; vi++) {
|
|
||||||
var v = new Vec1(vi);
|
|
||||||
var t = MotionLerper.Delerp(v, ev.Time, v1, ev.Origin.Time, v0, tev.transition, tev.rate);
|
|
||||||
CompiledRuleset.PatchJudge(
|
|
||||||
Event, ChartPlayer.cruleset.primary_judges[tev.Name.SubName],
|
|
||||||
t, etor, patchedJudgeEvents
|
|
||||||
);
|
|
||||||
}
|
|
||||||
phMotions.Remove(tev);
|
|
||||||
}*/
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public override void ExUpdate(ContainerState s, StampedEvent ev) {
|
|
||||||
base.ExUpdate(s, ev);
|
|
||||||
if (ev is StampedEvent.Judge) {
|
|
||||||
var tev = (StampedEvent.Judge)ev;
|
|
||||||
if (tev.TargetJudge != null && s.CloneType == 0 && !invalidated) {
|
|
||||||
//judge.Issue(tev, this);
|
|
||||||
}
|
|
||||||
else if (tev.TargetJudge == null && s.CloneType == 17) {
|
|
||||||
//judge.RecordPos(tev.StartEvent, GetFramePoint(s.Parent, s.Track));
|
|
||||||
}
|
|
||||||
else
|
|
||||||
return;
|
|
||||||
patchedJudgeEvents.Remove(tev);
|
|
||||||
// Logger.Log("main", 0, "Judge", "ir {0}", patchedJudgeEvents.Count);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public override void MotionUpdate(byte ct, Chart.Motion ev) {
|
|
||||||
base.MotionUpdate(ct, ev);
|
|
||||||
if (ct == 0) {
|
|
||||||
/*if (ev.Name == "judge") {
|
|
||||||
if (invalidated) return;
|
|
||||||
if (ev.Name == null)
|
|
||||||
throw new InvalidOperationException();
|
|
||||||
judge.IssueImmediate(this, ev.Name.SubName, GetFramePoint(cs.Parent, cs.Track));
|
|
||||||
}*/
|
|
||||||
}
|
|
||||||
else if (ct == 16) {
|
|
||||||
/*var etor = new EvalImpl();
|
|
||||||
if (ev.MotionName == "judge") {
|
|
||||||
if (ev.MotionSubName == null)
|
|
||||||
throw new InvalidOperationException();
|
|
||||||
var l = new List<StampedEvent>();
|
|
||||||
float t = ps.Time;
|
|
||||||
CompiledRuleset.PatchJudge(
|
|
||||||
Event, ChartPlayer.cruleset.primary_judges[ev.MotionSubName],
|
|
||||||
t, etor, ref l
|
|
||||||
);
|
|
||||||
cs.Bus.IssueEventPatch(l);
|
|
||||||
}*/
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -183,13 +103,6 @@ namespace Cryville.Crtr {
|
|||||||
a_tail.rotation = Quaternion.Euler(ts.Direction);
|
a_tail.rotation = Quaternion.Euler(ts.Direction);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
else if (s.CloneType == 16) {
|
|
||||||
/*if (Event.endjudge != null) {
|
|
||||||
//var etor = new Evaluator();
|
|
||||||
//CompiledRuleset.PatchJudge(Event, ChartPlayer.cruleset.primary_judges[Event.endjudge], ps.Time, etor, patchedJudgeEvents, true);
|
|
||||||
}
|
|
||||||
cs.Bus.IssuePatch(patchedJudgeEvents.Cast<StampedEvent>());*/
|
|
||||||
}
|
|
||||||
OpenAnchor("tail");
|
OpenAnchor("tail");
|
||||||
base.EndUpdate(s);
|
base.EndUpdate(s);
|
||||||
CloseAnchor("tail");
|
CloseAnchor("tail");
|
||||||
@@ -248,10 +161,5 @@ namespace Cryville.Crtr {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public List<StampedEvent.Judge> Invalidate() {
|
|
||||||
invalidated = true;
|
|
||||||
return patchedJudgeEvents;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -23,8 +23,6 @@ namespace Cryville.Crtr {
|
|||||||
else {
|
else {
|
||||||
var id = new Identifier(name);
|
var id = new Identifier(name);
|
||||||
PropSrc prop;
|
PropSrc prop;
|
||||||
string str;
|
|
||||||
float num;
|
|
||||||
if (ContextEvent != null && ContextEvent.PropSrcs.TryGetValue(name, out prop)) {
|
if (ContextEvent != null && ContextEvent.PropSrcs.TryGetValue(name, out prop)) {
|
||||||
prop.Get(out type, out value);
|
prop.Get(out type, out value);
|
||||||
}
|
}
|
||||||
@@ -32,15 +30,12 @@ namespace Cryville.Crtr {
|
|||||||
var vec = ContextState.GetRawValue(id);
|
var vec = ContextState.GetRawValue(id);
|
||||||
new VectorSrc(() => vec).Get(out type, out value);
|
new VectorSrc(() => vec).Get(out type, out value);
|
||||||
}
|
}
|
||||||
else if (ContextJudge != null && ContextJudge.scores.TryGetValue(name, out num)) {
|
else if (ContextJudge != null && ContextJudge.TryGetScoreSrc(name, out prop)) {
|
||||||
type = PdtInternalType.Number;
|
prop.Get(out type, out value);
|
||||||
LoadNum(num);
|
|
||||||
value = _numbuf;
|
|
||||||
RevokePotentialConstant();
|
RevokePotentialConstant();
|
||||||
}
|
}
|
||||||
else if (ContextJudge != null && ContextJudge.GetFormattedScoreStrings().TryGetValue(name, out str)) {
|
else if (ContextJudge != null && ContextJudge.TryGetScoreStringSrc(name, out prop)) {
|
||||||
type = PdtInternalType.String;
|
prop.Get(out type, out value);
|
||||||
value = GetBytes(str);
|
|
||||||
RevokePotentialConstant();
|
RevokePotentialConstant();
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
|
@@ -6,7 +6,7 @@ namespace Cryville.Crtr {
|
|||||||
public abstract class PropSrc {
|
public abstract class PropSrc {
|
||||||
int _type;
|
int _type;
|
||||||
byte[] _buf = null;
|
byte[] _buf = null;
|
||||||
public void Invalidate() { _buf = null; }
|
public virtual void Invalidate() { _buf = null; }
|
||||||
public void Get(out int type, out byte[] value) {
|
public void Get(out int type, out byte[] value) {
|
||||||
if (_buf == null) InternalGet(out _type, out _buf);
|
if (_buf == null) InternalGet(out _type, out _buf);
|
||||||
type = _type;
|
type = _type;
|
||||||
|
@@ -12,12 +12,13 @@ using SIdentifier = Cryville.Common.Identifier;
|
|||||||
|
|
||||||
namespace Cryville.Crtr {
|
namespace Cryville.Crtr {
|
||||||
public class Ruleset : MetaInfo {
|
public class Ruleset : MetaInfo {
|
||||||
|
public const long CURRENT_FORMAT = 2;
|
||||||
|
|
||||||
[JsonRequired]
|
[JsonRequired]
|
||||||
public long format;
|
public long format;
|
||||||
|
|
||||||
[JsonRequired]
|
|
||||||
public string @base;
|
public string @base;
|
||||||
|
|
||||||
[JsonIgnore]
|
[JsonIgnore]
|
||||||
public PdtRuleset Root { get; private set; }
|
public PdtRuleset Root { get; private set; }
|
||||||
|
|
||||||
|
@@ -12,6 +12,8 @@ using System.Text;
|
|||||||
|
|
||||||
namespace Cryville.Crtr {
|
namespace Cryville.Crtr {
|
||||||
public class Skin : MetaInfo {
|
public class Skin : MetaInfo {
|
||||||
|
public const long CURRENT_FORMAT = 2;
|
||||||
|
|
||||||
[JsonRequired]
|
[JsonRequired]
|
||||||
public long format;
|
public long format;
|
||||||
|
|
||||||
|
@@ -17,24 +17,26 @@ namespace Cryville.Crtr {
|
|||||||
skin = _skin;
|
skin = _skin;
|
||||||
}
|
}
|
||||||
public void MatchStatic(ContainerState context) {
|
public void MatchStatic(ContainerState context) {
|
||||||
|
ChartPlayer.etor.ContextState = context;
|
||||||
|
ChartPlayer.etor.ContextEvent = context.Container;
|
||||||
matchedStatic.Clear();
|
matchedStatic.Clear();
|
||||||
MatchStatic(skin, context, context.Handler.gogroup);
|
MatchStatic(skin, context, context.Handler.gogroup);
|
||||||
|
|
||||||
foreach (var m in matchedStatic) {
|
foreach (var m in matchedStatic) {
|
||||||
var el = m.Key;
|
var el = m.Key;
|
||||||
var obj = m.Value;
|
var obj = m.Value;
|
||||||
|
ChartPlayer.etor.ContextTransform = obj;
|
||||||
foreach (var p in el.properties) {
|
foreach (var p in el.properties) {
|
||||||
if (p.Key.Name == null)
|
if (p.Key.Name == null)
|
||||||
obj.gameObject.AddComponent(p.Key.Component);
|
obj.gameObject.AddComponent(p.Key.Component);
|
||||||
else {
|
else {
|
||||||
ChartPlayer.etor.ContextTransform = obj;
|
|
||||||
ChartPlayer.etor.ContextEvent = context.Container;
|
|
||||||
ChartPlayer.etor.Evaluate(GetPropOp(obj, p.Key), p.Value);
|
ChartPlayer.etor.Evaluate(GetPropOp(obj, p.Key), p.Value);
|
||||||
ChartPlayer.etor.ContextEvent = null;
|
|
||||||
ChartPlayer.etor.ContextTransform = null;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
ChartPlayer.etor.ContextTransform = null;
|
||||||
}
|
}
|
||||||
|
ChartPlayer.etor.ContextEvent = null;
|
||||||
|
ChartPlayer.etor.ContextState = null;
|
||||||
}
|
}
|
||||||
void MatchStatic(SkinElement rel, ContainerState context, Transform anchor = null) {
|
void MatchStatic(SkinElement rel, ContainerState context, Transform anchor = null) {
|
||||||
matchedStatic.Add(rel, anchor);
|
matchedStatic.Add(rel, anchor);
|
||||||
@@ -47,22 +49,24 @@ namespace Cryville.Crtr {
|
|||||||
}
|
}
|
||||||
public void MatchDynamic(ContainerState context) {
|
public void MatchDynamic(ContainerState context) {
|
||||||
Profiler.BeginSample("SkinContainer.MatchDynamic");
|
Profiler.BeginSample("SkinContainer.MatchDynamic");
|
||||||
|
ChartPlayer.etor.ContextState = context;
|
||||||
|
ChartPlayer.etor.ContextEvent = context.Container;
|
||||||
matchedDynamic.Clear();
|
matchedDynamic.Clear();
|
||||||
MatchDynamic(skin, context, context.Handler.gogroup);
|
MatchDynamic(skin, context, context.Handler.gogroup);
|
||||||
|
|
||||||
foreach (var m in matchedDynamic) {
|
foreach (var m in matchedDynamic) {
|
||||||
var el = m.Key;
|
var el = m.Key;
|
||||||
var obj = m.Value;
|
var obj = m.Value;
|
||||||
|
ChartPlayer.etor.ContextTransform = obj;
|
||||||
foreach (var p in el.properties) {
|
foreach (var p in el.properties) {
|
||||||
if (p.Key.Name == null) continue;
|
if (p.Key.Name == null) continue;
|
||||||
if (p.Value.IsConstant) continue;
|
if (p.Value.IsConstant) continue;
|
||||||
ChartPlayer.etor.ContextTransform = obj;
|
|
||||||
ChartPlayer.etor.ContextEvent = context.Container;
|
|
||||||
ChartPlayer.etor.Evaluate(GetPropOp(obj, p.Key), p.Value);
|
ChartPlayer.etor.Evaluate(GetPropOp(obj, p.Key), p.Value);
|
||||||
ChartPlayer.etor.ContextEvent = null;
|
|
||||||
ChartPlayer.etor.ContextTransform = null;
|
|
||||||
}
|
}
|
||||||
|
ChartPlayer.etor.ContextTransform = null;
|
||||||
}
|
}
|
||||||
|
ChartPlayer.etor.ContextEvent = null;
|
||||||
|
ChartPlayer.etor.ContextState = null;
|
||||||
Profiler.EndSample();
|
Profiler.EndSample();
|
||||||
}
|
}
|
||||||
void MatchDynamic(SkinElement rel, ContainerState context, Transform anchor = null) {
|
void MatchDynamic(SkinElement rel, ContainerState context, Transform anchor = null) {
|
||||||
|
@@ -114,9 +114,7 @@ namespace Cryville.Crtr {
|
|||||||
}
|
}
|
||||||
public override Transform Match(ContainerState h, Transform a, Transform ot = null) {
|
public override Transform Match(ContainerState h, Transform a, Transform ot = null) {
|
||||||
ChartPlayer.etor.ContextTransform = a;
|
ChartPlayer.etor.ContextTransform = a;
|
||||||
ChartPlayer.etor.ContextEvent = h.Container;
|
|
||||||
ChartPlayer.etor.Evaluate(_op, _exp);
|
ChartPlayer.etor.Evaluate(_op, _exp);
|
||||||
ChartPlayer.etor.ContextEvent = null;
|
|
||||||
ChartPlayer.etor.ContextTransform = null;
|
ChartPlayer.etor.ContextTransform = null;
|
||||||
return _flag ? a : null;
|
return _flag ? a : null;
|
||||||
}
|
}
|
||||||
|
Binary file not shown.
Binary file not shown.
@@ -1,8 +0,0 @@
|
|||||||
fileFormatVersion: 2
|
|
||||||
guid: 6805a4a1bc3dde4418e39fe1e4ab68b0
|
|
||||||
timeCreated: 1614591336
|
|
||||||
licenseType: Free
|
|
||||||
NativeFormatImporter:
|
|
||||||
userData:
|
|
||||||
assetBundleName:
|
|
||||||
assetBundleVariant:
|
|
@@ -11,7 +11,7 @@
|
|||||||
"depth": 2,
|
"depth": 2,
|
||||||
"source": "registry",
|
"source": "registry",
|
||||||
"dependencies": {},
|
"dependencies": {},
|
||||||
"url": "https://packages.unity.cn"
|
"url": "https://packages.unity.com"
|
||||||
},
|
},
|
||||||
"com.unity.ide.visualstudio": {
|
"com.unity.ide.visualstudio": {
|
||||||
"version": "2.0.16",
|
"version": "2.0.16",
|
||||||
@@ -20,14 +20,14 @@
|
|||||||
"dependencies": {
|
"dependencies": {
|
||||||
"com.unity.test-framework": "1.1.9"
|
"com.unity.test-framework": "1.1.9"
|
||||||
},
|
},
|
||||||
"url": "https://packages.unity.cn"
|
"url": "https://packages.unity.com"
|
||||||
},
|
},
|
||||||
"com.unity.nuget.newtonsoft-json": {
|
"com.unity.nuget.newtonsoft-json": {
|
||||||
"version": "3.0.2",
|
"version": "3.0.2",
|
||||||
"depth": 0,
|
"depth": 0,
|
||||||
"source": "registry",
|
"source": "registry",
|
||||||
"dependencies": {},
|
"dependencies": {},
|
||||||
"url": "https://packages.unity.cn"
|
"url": "https://packages.unity.com"
|
||||||
},
|
},
|
||||||
"com.unity.test-framework": {
|
"com.unity.test-framework": {
|
||||||
"version": "1.1.31",
|
"version": "1.1.31",
|
||||||
@@ -38,7 +38,7 @@
|
|||||||
"com.unity.modules.imgui": "1.0.0",
|
"com.unity.modules.imgui": "1.0.0",
|
||||||
"com.unity.modules.jsonserialize": "1.0.0"
|
"com.unity.modules.jsonserialize": "1.0.0"
|
||||||
},
|
},
|
||||||
"url": "https://packages.unity.cn"
|
"url": "https://packages.unity.com"
|
||||||
},
|
},
|
||||||
"com.unity.ugui": {
|
"com.unity.ugui": {
|
||||||
"version": "1.0.0",
|
"version": "1.0.0",
|
||||||
|
@@ -21,15 +21,16 @@ MonoBehaviour:
|
|||||||
m_Registries:
|
m_Registries:
|
||||||
- m_Id: main
|
- m_Id: main
|
||||||
m_Name:
|
m_Name:
|
||||||
m_Url: https://packages.unity.cn
|
m_Url: https://packages.unity.com
|
||||||
m_Scopes: []
|
m_Scopes: []
|
||||||
m_IsDefault: 1
|
m_IsDefault: 1
|
||||||
m_Capabilities: 7
|
m_Capabilities: 7
|
||||||
|
m_ConfigSource: 0
|
||||||
m_UserSelectedRegistryName:
|
m_UserSelectedRegistryName:
|
||||||
m_UserAddingNewScopedRegistry: 0
|
m_UserAddingNewScopedRegistry: 0
|
||||||
m_RegistryInfoDraft:
|
m_RegistryInfoDraft:
|
||||||
m_Modified: 0
|
m_Modified: 0
|
||||||
m_ErrorMessage:
|
m_ErrorMessage:
|
||||||
m_UserModificationsInstanceId: -844
|
m_UserModificationsInstanceId: -830
|
||||||
m_OriginalInstanceId: -846
|
m_OriginalInstanceId: -832
|
||||||
m_LoadAssets: 0
|
m_LoadAssets: 0
|
||||||
|
@@ -1,2 +1,2 @@
|
|||||||
m_EditorVersion: 2021.3.10f1c1
|
m_EditorVersion: 2021.3.14f1
|
||||||
m_EditorVersionWithRevision: 2021.3.10f1c1 (fad0948fb939)
|
m_EditorVersionWithRevision: 2021.3.14f1 (eee1884e7226)
|
||||||
|
Reference in New Issue
Block a user