Custom Bounce

This commit is contained in:
fu-majime 2024-03-23 18:12:17 +09:00
parent 2d15319535
commit 9310cc9a83
4 changed files with 426 additions and 120 deletions

View file

@ -848,7 +848,10 @@ MonoBehaviour:
m_Name:
m_EditorClassIdentifier:
anim:
beat: 0
startBeat: 0
targetBeat: 0
lengthBeat: 1
endTime: 0
CorrectionPos: {x: 0, y: 0, z: 0}
--- !u!1 &3874033564999961301
GameObject:
@ -1015,7 +1018,10 @@ MonoBehaviour:
m_Name:
m_EditorClassIdentifier:
anim: left
beat: 0
startBeat: 0
targetBeat: 0
lengthBeat: 1
endTime: 0
CorrectionPos: {x: -1.05, y: -0.35, z: 0}
--- !u!1 &4297759502551424643
GameObject:
@ -1896,7 +1902,10 @@ MonoBehaviour:
m_Name:
m_EditorClassIdentifier:
anim: right
beat: 0
startBeat: 0
targetBeat: 0
lengthBeat: 1
endTime: 0
CorrectionPos: {x: 1.05, y: 0.35, z: 0}
--- !u!1 &6653269419284669817
GameObject:
@ -2376,7 +2385,24 @@ MonoBehaviour:
- {fileID: 7974195531122437616}
- {fileID: 1415654153951215528}
- {fileID: 8876360381322288673}
- {fileID: 7732616979370467335}
- {fileID: 4733386687323095054}
- {fileID: 7142933854593701553}
- {fileID: 7110902958981490997}
- {fileID: 1007345949211835958}
- {fileID: 4720133106070728448}
- {fileID: 6518252185505850527}
- {fileID: 6608112072489973098}
- {fileID: 8318125649010820945}
- {fileID: 5373921079827997255}
- {fileID: 6115912429990493611}
- {fileID: 9069944594757536811}
- {fileID: 663361784237137429}
- {fileID: 5864016952948325823}
isShoot: 0
Squares: []
time: 0
shootTime: 2147483647
--- !u!95 &863865117502866643
Animator:
serializedVersion: 5
@ -2479,7 +2505,7 @@ PrefabInstance:
m_Modifications:
- target: {fileID: 2807044864243222978, guid: cadf711cd33934d419a06e0a8767025e, type: 3}
propertyPath: m_Name
value: 01curve
value: 01curveIn
objectReference: {fileID: 0}
- target: {fileID: 8266772254636404776, guid: cadf711cd33934d419a06e0a8767025e, type: 3}
propertyPath: m_RootOrder
@ -2689,6 +2715,17 @@ PrefabInstance:
objectReference: {fileID: 0}
m_RemovedComponents: []
m_SourcePrefab: {fileID: 100100000, guid: cadf711cd33934d419a06e0a8767025e, type: 3}
--- !u!114 &4720133106070728448 stripped
MonoBehaviour:
m_CorrespondingSourceObject: {fileID: 5239190577309937025, guid: cadf711cd33934d419a06e0a8767025e, type: 3}
m_PrefabInstance: {fileID: 663172772084171393}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 0}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 066a41e004f415b4eb74d5e61a2aadbe, type: 3}
m_Name:
m_EditorClassIdentifier:
--- !u!4 &8902888103906226857 stripped
Transform:
m_CorrespondingSourceObject: {fileID: 8266772254636404776, guid: cadf711cd33934d419a06e0a8767025e, type: 3}
@ -2703,7 +2740,7 @@ PrefabInstance:
m_Modifications:
- target: {fileID: 2163235865272922153, guid: 1dfe615f81f29cc4ebc353061ed98c3a, type: 3}
propertyPath: m_Name
value: 04curve
value: 04curveIn
objectReference: {fileID: 0}
- target: {fileID: 5352671577355782595, guid: 1dfe615f81f29cc4ebc353061ed98c3a, type: 3}
propertyPath: m_RootOrder
@ -2756,6 +2793,17 @@ Transform:
m_CorrespondingSourceObject: {fileID: 5352671577355782595, guid: 1dfe615f81f29cc4ebc353061ed98c3a, type: 3}
m_PrefabInstance: {fileID: 980176682254719041}
m_PrefabAsset: {fileID: 0}
--- !u!114 &9069944594757536811 stripped
MonoBehaviour:
m_CorrespondingSourceObject: {fileID: 8089771091315561578, guid: 1dfe615f81f29cc4ebc353061ed98c3a, type: 3}
m_PrefabInstance: {fileID: 980176682254719041}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 0}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 066a41e004f415b4eb74d5e61a2aadbe, type: 3}
m_Name:
m_EditorClassIdentifier:
--- !u!1001 &1058256478984044433
PrefabInstance:
m_ObjectHideFlags: 0
@ -2765,7 +2813,7 @@ PrefabInstance:
m_Modifications:
- target: {fileID: 4276990550886444728, guid: c5e47b6edcad17b4482b3f68bce5f9eb, type: 3}
propertyPath: m_Name
value: 35curve
value: 35curveIn
objectReference: {fileID: 0}
- target: {fileID: 8004925964111632210, guid: c5e47b6edcad17b4482b3f68bce5f9eb, type: 3}
propertyPath: m_RootOrder
@ -2813,6 +2861,17 @@ PrefabInstance:
objectReference: {fileID: 0}
m_RemovedComponents: []
m_SourcePrefab: {fileID: 100100000, guid: c5e47b6edcad17b4482b3f68bce5f9eb, type: 3}
--- !u!114 &6608112072489973098 stripped
MonoBehaviour:
m_CorrespondingSourceObject: {fileID: 6132517591490841339, guid: c5e47b6edcad17b4482b3f68bce5f9eb, type: 3}
m_PrefabInstance: {fileID: 1058256478984044433}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 0}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 066a41e004f415b4eb74d5e61a2aadbe, type: 3}
m_Name:
m_EditorClassIdentifier:
--- !u!4 &7041548894936082627 stripped
Transform:
m_CorrespondingSourceObject: {fileID: 8004925964111632210, guid: c5e47b6edcad17b4482b3f68bce5f9eb, type: 3}
@ -2894,7 +2953,7 @@ PrefabInstance:
m_Modifications:
- target: {fileID: 942254975755547679, guid: ce784ec9dee7b5b418f3ec1d1afd2cf7, type: 3}
propertyPath: m_Name
value: 03curve
value: 03curveIn
objectReference: {fileID: 0}
- target: {fileID: 6439679169686523381, guid: ce784ec9dee7b5b418f3ec1d1afd2cf7, type: 3}
propertyPath: m_RootOrder
@ -2947,6 +3006,17 @@ Transform:
m_CorrespondingSourceObject: {fileID: 6439679169686523381, guid: ce784ec9dee7b5b418f3ec1d1afd2cf7, type: 3}
m_PrefabInstance: {fileID: 1170263691098543885}
m_PrefabAsset: {fileID: 0}
--- !u!114 &8318125649010820945 stripped
MonoBehaviour:
m_CorrespondingSourceObject: {fileID: 7156914238255812700, guid: ce784ec9dee7b5b418f3ec1d1afd2cf7, type: 3}
m_PrefabInstance: {fileID: 1170263691098543885}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 0}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 066a41e004f415b4eb74d5e61a2aadbe, type: 3}
m_Name:
m_EditorClassIdentifier:
--- !u!1001 &1351119202435238174
PrefabInstance:
m_ObjectHideFlags: 0
@ -3020,6 +3090,17 @@ PrefabInstance:
objectReference: {fileID: 0}
m_RemovedComponents: []
m_SourcePrefab: {fileID: 100100000, guid: cadf711cd33934d419a06e0a8767025e, type: 3}
--- !u!114 &6518252185505850527 stripped
MonoBehaviour:
m_CorrespondingSourceObject: {fileID: 5239190577309937025, guid: cadf711cd33934d419a06e0a8767025e, type: 3}
m_PrefabInstance: {fileID: 1351119202435238174}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 0}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 066a41e004f415b4eb74d5e61a2aadbe, type: 3}
m_Name:
m_EditorClassIdentifier:
--- !u!4 &6951686805690579254 stripped
Transform:
m_CorrespondingSourceObject: {fileID: 8266772254636404776, guid: cadf711cd33934d419a06e0a8767025e, type: 3}
@ -3082,6 +3163,17 @@ PrefabInstance:
objectReference: {fileID: 0}
m_RemovedComponents: []
m_SourcePrefab: {fileID: 100100000, guid: c5e47b6edcad17b4482b3f68bce5f9eb, type: 3}
--- !u!114 &5373921079827997255 stripped
MonoBehaviour:
m_CorrespondingSourceObject: {fileID: 6132517591490841339, guid: c5e47b6edcad17b4482b3f68bce5f9eb, type: 3}
m_PrefabInstance: {fileID: 2274059417958017212}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 0}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 066a41e004f415b4eb74d5e61a2aadbe, type: 3}
m_Name:
m_EditorClassIdentifier:
--- !u!4 &8113271276155977710 stripped
Transform:
m_CorrespondingSourceObject: {fileID: 8004925964111632210, guid: c5e47b6edcad17b4482b3f68bce5f9eb, type: 3}
@ -3096,7 +3188,7 @@ PrefabInstance:
m_Modifications:
- target: {fileID: 2807044864243222978, guid: cadf711cd33934d419a06e0a8767025e, type: 3}
propertyPath: m_Name
value: 45curve
value: 45curveIn
objectReference: {fileID: 0}
- target: {fileID: 8266772254636404776, guid: cadf711cd33934d419a06e0a8767025e, type: 3}
propertyPath: m_RootOrder
@ -3169,7 +3261,7 @@ PrefabInstance:
m_Modifications:
- target: {fileID: 942254975755547679, guid: ce784ec9dee7b5b418f3ec1d1afd2cf7, type: 3}
propertyPath: m_Name
value: 25curve
value: 25curveIn
objectReference: {fileID: 0}
- target: {fileID: 6439679169686523381, guid: ce784ec9dee7b5b418f3ec1d1afd2cf7, type: 3}
propertyPath: m_RootOrder
@ -3217,6 +3309,17 @@ PrefabInstance:
objectReference: {fileID: 0}
m_RemovedComponents: []
m_SourcePrefab: {fileID: 100100000, guid: ce784ec9dee7b5b418f3ec1d1afd2cf7, type: 3}
--- !u!114 &6115912429990493611 stripped
MonoBehaviour:
m_CorrespondingSourceObject: {fileID: 7156914238255812700, guid: ce784ec9dee7b5b418f3ec1d1afd2cf7, type: 3}
m_PrefabInstance: {fileID: 4013378413297855991}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 0}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 066a41e004f415b4eb74d5e61a2aadbe, type: 3}
m_Name:
m_EditorClassIdentifier:
--- !u!4 &7992821099441364994 stripped
Transform:
m_CorrespondingSourceObject: {fileID: 6439679169686523381, guid: ce784ec9dee7b5b418f3ec1d1afd2cf7, type: 3}
@ -3426,6 +3529,17 @@ Transform:
m_CorrespondingSourceObject: {fileID: 8771097448283656725, guid: 46042d87f1d1f8545a3a73b09e6592af, type: 3}
m_PrefabInstance: {fileID: 5814753693728328001}
m_PrefabAsset: {fileID: 0}
--- !u!114 &4733386687323095054 stripped
MonoBehaviour:
m_CorrespondingSourceObject: {fileID: 1225675845979703631, guid: 46042d87f1d1f8545a3a73b09e6592af, type: 3}
m_PrefabInstance: {fileID: 5814753693728328001}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 0}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 066a41e004f415b4eb74d5e61a2aadbe, type: 3}
m_Name:
m_EditorClassIdentifier:
--- !u!1001 &6404641555396064461
PrefabInstance:
m_ObjectHideFlags: 0
@ -3435,7 +3549,7 @@ PrefabInstance:
m_Modifications:
- target: {fileID: 4276990550886444728, guid: c5e47b6edcad17b4482b3f68bce5f9eb, type: 3}
propertyPath: m_Name
value: 02curve
value: 02curveIn
objectReference: {fileID: 0}
- target: {fileID: 8004925964111632210, guid: c5e47b6edcad17b4482b3f68bce5f9eb, type: 3}
propertyPath: m_RootOrder
@ -3483,6 +3597,17 @@ PrefabInstance:
objectReference: {fileID: 0}
m_RemovedComponents: []
m_SourcePrefab: {fileID: 100100000, guid: c5e47b6edcad17b4482b3f68bce5f9eb, type: 3}
--- !u!114 &1007345949211835958 stripped
MonoBehaviour:
m_CorrespondingSourceObject: {fileID: 6132517591490841339, guid: c5e47b6edcad17b4482b3f68bce5f9eb, type: 3}
m_PrefabInstance: {fileID: 6404641555396064461}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 0}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 066a41e004f415b4eb74d5e61a2aadbe, type: 3}
m_Name:
m_EditorClassIdentifier:
--- !u!4 &4032672539816403871 stripped
Transform:
m_CorrespondingSourceObject: {fileID: 8004925964111632210, guid: c5e47b6edcad17b4482b3f68bce5f9eb, type: 3}
@ -3617,6 +3742,17 @@ Transform:
m_CorrespondingSourceObject: {fileID: 8771097448283656725, guid: 46042d87f1d1f8545a3a73b09e6592af, type: 3}
m_PrefabInstance: {fileID: 8224335769394667518}
m_PrefabAsset: {fileID: 0}
--- !u!114 &7142933854593701553 stripped
MonoBehaviour:
m_CorrespondingSourceObject: {fileID: 1225675845979703631, guid: 46042d87f1d1f8545a3a73b09e6592af, type: 3}
m_PrefabInstance: {fileID: 8224335769394667518}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 0}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 066a41e004f415b4eb74d5e61a2aadbe, type: 3}
m_Name:
m_EditorClassIdentifier:
--- !u!1001 &8272041747263409850
PrefabInstance:
m_ObjectHideFlags: 0
@ -3752,6 +3888,17 @@ Transform:
m_CorrespondingSourceObject: {fileID: 8771097448283656725, guid: 46042d87f1d1f8545a3a73b09e6592af, type: 3}
m_PrefabInstance: {fileID: 8335451667020914810}
m_PrefabAsset: {fileID: 0}
--- !u!114 &7110902958981490997 stripped
MonoBehaviour:
m_CorrespondingSourceObject: {fileID: 1225675845979703631, guid: 46042d87f1d1f8545a3a73b09e6592af, type: 3}
m_PrefabInstance: {fileID: 8335451667020914810}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 0}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 066a41e004f415b4eb74d5e61a2aadbe, type: 3}
m_Name:
m_EditorClassIdentifier:
--- !u!1001 &8365237312297721842
PrefabInstance:
m_ObjectHideFlags: 0
@ -3838,7 +3985,7 @@ PrefabInstance:
m_Modifications:
- target: {fileID: 2163235865272922153, guid: 1dfe615f81f29cc4ebc353061ed98c3a, type: 3}
propertyPath: m_Name
value: 15curve
value: 15curveIn
objectReference: {fileID: 0}
- target: {fileID: 5352671577355782595, guid: 1dfe615f81f29cc4ebc353061ed98c3a, type: 3}
propertyPath: m_RootOrder
@ -3886,6 +4033,17 @@ PrefabInstance:
objectReference: {fileID: 0}
m_RemovedComponents: []
m_SourcePrefab: {fileID: 100100000, guid: 1dfe615f81f29cc4ebc353061ed98c3a, type: 3}
--- !u!114 &663361784237137429 stripped
MonoBehaviour:
m_CorrespondingSourceObject: {fileID: 8089771091315561578, guid: 1dfe615f81f29cc4ebc353061ed98c3a, type: 3}
m_PrefabInstance: {fileID: 8750529213226846847}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 0}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 066a41e004f415b4eb74d5e61a2aadbe, type: 3}
m_Name:
m_EditorClassIdentifier:
--- !u!4 &3690873091745874876 stripped
Transform:
m_CorrespondingSourceObject: {fileID: 5352671577355782595, guid: 1dfe615f81f29cc4ebc353061ed98c3a, type: 3}
@ -3953,3 +4111,14 @@ Transform:
m_CorrespondingSourceObject: {fileID: 8771097448283656725, guid: 46042d87f1d1f8545a3a73b09e6592af, type: 3}
m_PrefabInstance: {fileID: 8812910723893193032}
m_PrefabAsset: {fileID: 0}
--- !u!114 &7732616979370467335 stripped
MonoBehaviour:
m_CorrespondingSourceObject: {fileID: 1225675845979703631, guid: 46042d87f1d1f8545a3a73b09e6592af, type: 3}
m_PrefabInstance: {fileID: 8812910723893193032}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 0}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 066a41e004f415b4eb74d5e61a2aadbe, type: 3}
m_Name:
m_EditorClassIdentifier:

View file

@ -25,13 +25,12 @@ namespace HeavenStudio.Games.Loaders
resizable = true,
parameters = new List<Param>()
{
new Param("direction", BuiltToScaleRvl.Direction.Left, "Direction", "Set the direction in which the stick will come out."),
new Param("direction", BuiltToScaleRvl.Direction.Left, "Direction", "Set the direction in which the rod will come out."),
new Param("id", new EntityTypes.Integer(0, 4, 0), "Rod ID", "Set the ID of the rod to spawn. Rods with the same ID cannot spawn at the same time."),
},
},
new GameAction("shoot rod", "Shoot Rod")
{
// function = delegate { var e = eventCaller.currentEntity; BuiltToScaleRvl.instance.ShootRod(e.beat, e["id"]); },
defaultLength = 1f,
parameters = new List<Param>()
{
@ -47,6 +46,15 @@ namespace HeavenStudio.Games.Loaders
new Param("id", new EntityTypes.Integer(0, 4, 0), "Rod ID", "Set the ID of the rod to out."),
},
},
new GameAction("custom bounce", "Custom Bounce")
{
defaultLength = 1f,
parameters = new List<Param>()
{
new Param("target", BuiltToScaleRvl.Target.First, "Target", "Set the target in which the rod will bounce."),
new Param("id", new EntityTypes.Integer(0, 4, 0), "Rod ID", "Set the ID of the rod to bounce."),
},
},
}, new List<string>() { "rvl", "normal" }, "rvlbuilt", "en", new List<string>() { });
}
}
@ -64,10 +72,20 @@ namespace HeavenStudio.Games
[SerializeField] GameObject baseAssembled;
public Transform widgetHolder;
const double WIDGET_SEEK_TIME = 16.0;
public enum Direction {
Left,
Right,
}
public enum Target {
OuterLeft,
First,
Second,
Third,
Fourth,
OuterRight,
}
public static BuiltToScaleRvl instance;
@ -86,15 +104,14 @@ namespace HeavenStudio.Games
new("NtrBuiltAltFlickAltPress", new int[] { IAAltDownCat, IAFlickCat, IAAltDownCat },
IA_PadAltPress, IA_TouchFlick, IA_BatonAltPress);
// 1.05(3,1)
private void Awake()
{
instance = this;
}
private double gameStartBeat = double.MinValue;
private double gameEndBeat = double.MaxValue;
private double gameStartBeat = double.MinValue, gameEndBeat = double.MaxValue;
public static List<QueuedRod> queuedRods = new List<QueuedRod>();
List<ScheduledWidget> scheduledWidgets = new List<ScheduledWidget>();
public List<Rod> spawnedRods = new List<Rod>();
public struct QueuedRod
@ -106,18 +123,38 @@ namespace HeavenStudio.Games
public int id;
}
struct ScheduledWidget
{
public double beat;
public double length;
public int currentPos;
public int nextPos;
public int id;
public CustomBounceItem[] bounceItems;
public int endTime;
public bool isShoot;
}
struct ScheduledSquare
{
public double targetBeat;
public double lengthBeat;
}
public class CustomBounceItem
{
public int time = -1;
public int pos;
}
public override void OnPlay(double beat)
{
queuedRods.Clear();
gameStartBeat = beat;
var firstEnd = EventCaller.GetAllInGameManagerList("gameManager", new string[] { "switchGame", "end" }).Find(x => x.beat > gameStartBeat);
gameEndBeat = firstEnd?.beat ?? gameEndBeat;
OnBeginning(beat);
}
public override void OnGameSwitch(double beat)
{
gameStartBeat = beat;
var firstEnd = EventCaller.GetAllInGameManagerList("gameManager", new string[] { "switchGame", "end" }).Find(x => x.beat > gameStartBeat);
gameEndBeat = firstEnd?.beat ?? gameEndBeat;
OnBeginning(beat);
}
private void OnDestroy() {
queuedRods.Clear();
@ -126,6 +163,26 @@ namespace HeavenStudio.Games
evt.Disable();
}
}
private void OnBeginning(double beat)
{
gameStartBeat = beat;
var firstEnd = EventCaller.GetAllInGameManagerList("gameManager", new string[] { "switchGame", "end" }).Find(x => x.beat > gameStartBeat);
gameEndBeat = firstEnd?.beat ?? gameEndBeat;
scheduledWidgets.Clear();
// foreach (var evt in events)
// {
// if (evt.length == 0) continue;
// int patternDivisions = (int)Math.Ceiling(evt.length / WIDGET_SEEK_TIME);
// var pattern = new ScheduledPattern
// {
// beat = evt.beat + (PATTERN_SEEK_TIME * i),
// length = Math.Min(evt.length - (PATTERN_SEEK_TIME * i), PATTERN_SEEK_TIME),
// type = patternType
// };
// scheduledSquares.Add(pattern);
// }
}
void Update()
{
@ -191,27 +248,33 @@ namespace HeavenStudio.Games
newRod.nextPos = nextPos;
newRod.ID = id;
List<CustomBounceItem> bounceItems = CalcRodBounce(beat, length, id);
AddBounceOutSides(beat, length, currentPos, nextPos, id, ref bounceItems);
bool isShoot;
double rodEndBeat = CalcRodEndBeat(beat, length, currentPos, nextPos, id, out isShoot);
newRod.endBeat = rodEndBeat;
int rodEndTime = CalcRodEndTime(beat, length, currentPos, nextPos, id, ref bounceItems, out isShoot);
newRod.customBounce = bounceItems.ToArray();
newRod.shootTime = rodEndTime;
newRod.isShoot = isShoot;
if (rodEndBeat != double.MaxValue)
if (isShoot)
{
newRod.Squares = SpawnSquare(beat, rodEndBeat, id);
double rodEndBeat = beat + length * rodEndTime;
SoundByte.PlayOneShotGame("builtToScaleRvl/prepare", rodEndBeat - 2*length);
newRod.Squares = SpawnSquare(rodEndBeat, id);
}
newRod.Init();
newRod.gameObject.SetActive(true);
}
private Square[] SpawnSquare(double startBeat, double endBeat, int id)
private Square[] SpawnSquare(double targetBeat, int id)
{
var newLeftSquare = Instantiate(baseLeftSquare, widgetHolder).GetComponent<Square>();
var newRightSquare = Instantiate(baseRightSquare, widgetHolder).GetComponent<Square>();
newLeftSquare.startBeat = startBeat;
newRightSquare.startBeat = startBeat;
newLeftSquare.endBeat = endBeat;
newRightSquare.endBeat = endBeat;
newLeftSquare.startBeat = this.gameStartBeat;
newRightSquare.startBeat = this.gameStartBeat;
newLeftSquare.targetBeat = targetBeat;
newRightSquare.targetBeat = targetBeat;
newLeftSquare.gameObject.SetActive(true);
newRightSquare.gameObject.SetActive(true);
newLeftSquare.Init();
@ -226,66 +289,104 @@ namespace HeavenStudio.Games
newAssembled.SetActive(true);
}
private double CalcRodEndBeat(double beat, double length, int currentPos, int nextPos, int id, out bool isShoot)
private List<CustomBounceItem> CalcRodBounce(double beat, double length, int id)
{
var bounceItems = new List<CustomBounceItem>();
var events = EventCaller.GetAllInGameManagerList("builtToScaleRvl", new string[] { "custom bounce" }).FindAll(x => x.beat > beat && x["id"] == id);
foreach(var evt in events)
{
var bounceEventTime = (int)Math.Ceiling((evt.beat-beat)/length);
bounceItems.Add(new CustomBounceItem{
time = bounceEventTime,
pos = evt["target"] switch {
(int)Target.OuterLeft => -1,
(int)Target.First => 0,
(int)Target.Second => 1,
(int)Target.Third => 2,
(int)Target.Fourth => 3,
(int)Target.OuterRight => 4,
_ => throw new System.NotImplementedException()
},
});
}
return bounceItems;
}
private void AddBounceOutSides(double beat, double length, int currentPos, int nextPos, int id, ref List<CustomBounceItem> bounceItems)
{
var firstOut = EventCaller.GetAllInGameManagerList("builtToScaleRvl", new string[] { "out sides" }).Find(x => x.beat > beat && x["id"] == id);
if (firstOut is not null)
{
int earliestOutTime = (int)Math.Ceiling((firstOut.beat - beat)/length);
int current = currentPos, next = nextPos;
int outTime;
var bounceItemsArray = bounceItems.ToArray();
for (int time = 0; ; time++) {
if (current is 0 or 3 && time >= earliestOutTime) {
bounceItems.Add(new CustomBounceItem{
time = time,
pos = current switch {
0 => -1,
3 => 4,
_ => throw new System.NotImplementedException()
},
});
break;
}
int following = getFollowingPos(current, next, time+1, bounceItemsArray);
current = next;
next = following;
}
}
}
private int CalcRodEndTime(double beat, double length, int currentPos, int nextPos, int id, ref List<CustomBounceItem> bounceItems, out bool isShoot)
{
isShoot = false;
int earliestEndTime = int.MaxValue;
var firstShoot = EventCaller.GetAllInGameManagerList("builtToScaleRvl", new string[] { "shoot rod" }).Find(x => x.beat > beat && x["id"] == id);
if (firstShoot is null)
return double.MaxValue;
double shootEventBeat = firstShoot.beat;
if (EventCaller.GetAllInGameManagerList("builtToScaleRvl", new string[] { "out sides" }).Any(x => x.beat > beat && x.beat < shootEventBeat && x["id"] == id))
return double.MaxValue;
if (firstShoot is not null)
{
earliestEndTime = (int)Math.Ceiling((firstShoot.beat - beat)/length);
isShoot = true;
}
var n = (int)Math.Ceiling((shootEventBeat-beat)/length);
bounceItems = bounceItems.FindAll(x => x.time < earliestEndTime);
bounceItems.Sort((x, y) => x.time.CompareTo(y.time));
var bounceOutSide = bounceItems.Find(x => x.pos is -1 or 4);
if (bounceOutSide is not null)
{
earliestEndTime = bounceOutSide.time;
isShoot = false;
}
if (!isShoot) return earliestEndTime;
int current = currentPos, next = nextPos;
int shootTiming;
for (int i = 0; ; i++) {
if (current == 2 && i >= n) {
shootTiming = i;
int shootTime;
var bounceItemsArray = bounceItems.ToArray();
for (int time = 0; ; time++) {
if (current == 2 && time >= earliestEndTime) {
shootTime = time;
break;
}
int following = getFollowingPos(current, next);
int following = getFollowingPos(current, next, time+1, bounceItemsArray);
current = next;
next = following;
}
isShoot = true;
return beat + length * shootTiming;
return shootTime;
}
int getFollowingPos(int currentPos, int nextPos)
public static int getFollowingPos(int currentPos, int nextPos, int nextTime, CustomBounceItem[] bounceItems)
{
var bounce = Array.Find(bounceItems, x => x.time == nextTime);
if (bounce is not null) return bounce.pos;
if (nextPos == 0) return 1;
else if (nextPos == 3) return 2;
else if (currentPos < nextPos) return nextPos + 1;
else if (currentPos <= nextPos) return nextPos + 1;
else if (currentPos > nextPos) return nextPos - 1;
return nextPos;
}
public void ShootRod(double beat, int id)
{
// var newLeftSquare = Instantiate(baseLeftSquare, widgetHolder).GetComponent<Square>();
// var newRightSquare = Instantiate(baseRightSquare, widgetHolder).GetComponent<Square>();
// newLeftSquare.beat = beat;
// newRightSquare.beat = beat;
// newLeftSquare.Init();
// newRightSquare.Init();
// newLeftSquare.gameObject.SetActive(true);
// newRightSquare.gameObject.SetActive(true);
var rod = spawnedRods.Find(x => x.ID == id);
if (rod is not null)
{
rod.PreShoot(beat);
}
}
public void OutRod(double beat, int id)
{
var rod = spawnedRods.Find(x => x.ID == id);
if (rod is not null)
{
rod.PreOut(beat);
}
}
}
}

View file

@ -1,3 +1,4 @@
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
@ -8,17 +9,37 @@ namespace HeavenStudio.Games.Scripts_BuiltToScaleRvl
using HeavenStudio.Util;
public class Rod : MonoBehaviour
{
public double startBeat, lengthBeat, currentBeat, endBeat;
public double startBeat, lengthBeat, currentBeat;
public int currentPos, nextPos;
public int ID;
public BezierCurve3D[] curve;
static readonly Dictionary<(int, int), int> curveMap = new Dictionary<(int, int), int> {
{(-1, 0), 0}, {(0, -1), 0}, // 01
{(0, 1), 1}, {(1, 0), 1}, // 12
{(1, 2), 2}, {(2, 1), 2}, // 23
{(2, 3), 3}, {(3, 2), 3}, // 34
{(3, 4), 4}, {(4, 3), 4}, // 45
{(0, 0), 5}, // 11
{(1, 1), 6}, // 22
{(2, 2), 7}, // 33
{(3, 3), 8}, // 44
{(-1, 1), 9}, {(1, -1), 9}, // 02
{(0, 2), 10}, {(2, 0), 10}, // 13
{(1, 3), 11}, {(3, 1), 11}, // 24
{(2, 4), 12}, {(4, 2), 12}, // 35
{(-1, 2), 13}, {(2, -1), 13}, // 03
{(0, 3), 10}, {(3, 0), 14}, // 14
{(1, 4), 11}, {(4, 1), 15}, // 25
{(-1, 3), 16}, {(3, -1), 16}, // 04
{(0, 4), 17}, {(4, 0), 17}, // 15
};
private BezierCurve3D currentCurve;
private Animator rodAnim;
public bool isShoot = false;
public Square[] Squares;
private bool isPreShoot = false;
private bool isPreOut = false;
private bool isMiss = false;
private bool isMiss = false;
public int time, shootTime = int.MaxValue;
public BuiltToScaleRvl.CustomBounceItem[] customBounce;
private BuiltToScaleRvl game;
@ -27,6 +48,7 @@ namespace HeavenStudio.Games.Scripts_BuiltToScaleRvl
game = BuiltToScaleRvl.instance;
rodAnim = GetComponent<Animator>();
currentBeat = startBeat;
time = 0;
BounceRecursion(startBeat, lengthBeat, currentPos, nextPos);
setParameters(currentPos, nextPos);
}
@ -48,15 +70,16 @@ namespace HeavenStudio.Games.Scripts_BuiltToScaleRvl
private void BounceRecursion(double beat, double length, int currentPos, int nextPos)
{
int futurePos = getFuturePos(currentPos, nextPos);
if (currentPos < 0 || currentPos > 3) {
BeatAction.New(this, new List<BeatAction.Action>()
{
new BeatAction.Action(beat, delegate
{
this.currentBeat = beat;
this.time++;
setParameters(currentPos, nextPos);
BounceRecursion(beat + length, length, nextPos, futurePos);
int followingPos = BuiltToScaleRvl.getFollowingPos(currentPos, nextPos, time, customBounce);
BounceRecursion(beat + length, length, nextPos, followingPos);
})
});
} else if (nextPos < 0 || nextPos > 3) {
@ -74,6 +97,7 @@ namespace HeavenStudio.Games.Scripts_BuiltToScaleRvl
game.blockAnims[currentPos].Play("bounce", 0, 0);
this.currentBeat = beat;
this.time++;
setParameters(currentPos, nextPos);
}),
new BeatAction.Action(beat + length, delegate
@ -98,6 +122,7 @@ namespace HeavenStudio.Games.Scripts_BuiltToScaleRvl
game.blockAnims[currentPos].Play("bounce", 0, 0);
this.currentBeat = beat;
this.time++;
setParameters(currentPos, nextPos);
}),
new BeatAction.Action(beat + length, delegate
@ -105,8 +130,7 @@ namespace HeavenStudio.Games.Scripts_BuiltToScaleRvl
game.blockAnims[currentPos].Play("idle", 0, 0);
})
});
if (isShoot && beat + length == endBeat) {
SoundByte.PlayOneShotGame("builtToScaleRvl/prepare");
if (isShoot && time + 1 == shootTime) {
SoundByte.PlayOneShotGame("builtToScaleRvl/playerRetract", beat);
BeatAction.New(this, new List<BeatAction.Action>()
{
@ -133,8 +157,10 @@ namespace HeavenStudio.Games.Scripts_BuiltToScaleRvl
game.blockAnims[currentPos].Play("bounce", 0, 0);
this.currentBeat = beat;
this.time++;
setParameters(currentPos, nextPos);
BounceRecursion(beat + length, length, nextPos, futurePos);
int followingPos = BuiltToScaleRvl.getFollowingPos(currentPos, nextPos, time, customBounce);
BounceRecursion(beat + length, length, nextPos, followingPos);
}),
new BeatAction.Action(beat + length, delegate
{
@ -143,14 +169,7 @@ namespace HeavenStudio.Games.Scripts_BuiltToScaleRvl
});
}
}
int getFuturePos(int currentPos, int nextPos)
{
if (nextPos == 0) return isPreOut ? -1 : 1;
else if (nextPos == 3) return isPreOut ? 4 : 2;
else if (currentPos < nextPos) return nextPos + 1;
else if (currentPos > nextPos) return nextPos - 1;
return nextPos;
}
void setParameters(int currentPos, int nextPos)
{
this.currentPos = currentPos;
@ -162,27 +181,58 @@ namespace HeavenStudio.Games.Scripts_BuiltToScaleRvl
rodAnim.SetFloat("speed", -1f);
}
currentCurve = curve[curveMap[(currentPos, nextPos)]];
if ((currentPos==-1 && nextPos==0) || (currentPos==0 && nextPos==-1)) {
currentCurve = curve[0];
currentCurve = curve[0]; // 01
} else if ((currentPos==0 && nextPos==1) || (currentPos==1 && nextPos==0)) {
currentCurve = curve[1];
currentCurve = curve[1]; // 12
} else if ((currentPos==1 && nextPos==2) || (currentPos==2 && nextPos==1)) {
currentCurve = curve[2];
currentCurve = curve[2]; // 23
} else if ((currentPos==2 && nextPos==3) || (currentPos==3 && nextPos==2)) {
currentCurve = curve[3];
currentCurve = curve[3]; // 34
} else if ((currentPos==3 && nextPos==4) || (currentPos==4 && nextPos==3)) {
currentCurve = curve[4];
currentCurve = curve[4]; // 45
}
else if ((currentPos==0 && nextPos==0)) {
currentCurve = curve[5]; // 11
} else if ((currentPos==1 && nextPos==1)) {
currentCurve = curve[6]; // 22
} else if ((currentPos==2 && nextPos==2)) {
currentCurve = curve[7]; // 33
} else if ((currentPos==3 && nextPos==3)) {
currentCurve = curve[8]; // 44
}
else if ((currentPos==-1 && nextPos==1) || (currentPos==1 && nextPos==-1)) {
currentCurve = curve[9]; // 02
} else if ((currentPos==0 && nextPos==2) || (currentPos==2 && nextPos==0)) {
currentCurve = curve[10]; // 13
} else if ((currentPos==1 && nextPos==3) || (currentPos==3 && nextPos==1)) {
currentCurve = curve[11]; // 24
} else if ((currentPos==2 && nextPos==4) || (currentPos==4 && nextPos==2)) {
currentCurve = curve[12]; // 35
}
else if ((currentPos==-1 && nextPos==2) || (currentPos==2 && nextPos==-1)) {
currentCurve = curve[13]; // 03
} else if ((currentPos==0 && nextPos==3) || (currentPos==3 && nextPos==0)) {
currentCurve = curve[14]; // 14
} else if ((currentPos==1 && nextPos==4) || (currentPos==4 && nextPos==1)) {
currentCurve = curve[15]; // 25
}
else if ((currentPos==-1 && nextPos==3) || (currentPos==3 && nextPos==-1)) {
currentCurve = curve[16]; // 04
} else if ((currentPos==0 && nextPos==4) || (currentPos==4 && nextPos==0)) {
currentCurve = curve[17]; // 15
}
}
public void BounceOnHit(PlayerActionEvent caller, float state)
{
int futurePos = getFuturePos(this.currentPos, this.nextPos);
BounceRecursion(currentBeat + lengthBeat, lengthBeat, nextPos, futurePos);
int followingPos = BuiltToScaleRvl.getFollowingPos(this.currentPos, this.nextPos, this.time, this.customBounce);
BounceRecursion(currentBeat + lengthBeat, lengthBeat, nextPos, followingPos);
}
public void BounceOnMiss(PlayerActionEvent caller)
{
currentCurve = curve[5];
currentCurve = curve[^1]; // miss
currentBeat = Conductor.instance.songPositionInBeats;
rodAnim.SetFloat("speed", -1f);
isMiss = true;
@ -194,21 +244,7 @@ namespace HeavenStudio.Games.Scripts_BuiltToScaleRvl
})
});
}
public void PreShoot(double beat)
{
isPreShoot = true;
}
public void PreOut(double beat)
{
isPreOut = true;
}
public void ShootRod(double beat)
{
SoundByte.PlayOneShotGame("builtToScaleRvl/prepare", beat);
}
public void ShootOnHit(PlayerActionEvent caller, float state)
{
SoundByte.PlayOneShotGame("builtToScaleRvl/shoot");

View file

@ -11,7 +11,8 @@ namespace HeavenStudio.Games.Scripts_BuiltToScaleRvl
public class Square : MonoBehaviour
{
public string anim;
public double startBeat, endBeat, lengthBeat = 1;
public double startBeat, targetBeat, lengthBeat = 1;
public int endTime;
public Vector3 CorrectionPos;
private Animator squareAnim;
@ -21,11 +22,10 @@ namespace HeavenStudio.Games.Scripts_BuiltToScaleRvl
{
game = BuiltToScaleRvl.instance;
squareAnim = GetComponent<Animator>();
var n = (int)Math.Floor((endBeat - startBeat)/lengthBeat);
transform.position = transform.position - n*CorrectionPos;
double beat = endBeat - lengthBeat * n;
Debug.Log(beat);
squareAnim.Play(anim, 0, 0);
var endTime = (int)Math.Ceiling((targetBeat - startBeat)/lengthBeat);
transform.position = transform.position - endTime * CorrectionPos;
double beat = targetBeat - lengthBeat * endTime;
squareAnim.Play(anim, 0, (beat==0 ? 0 : 1));
Recursion(beat, lengthBeat);
}