Skip to content

Commit

Permalink
BPL support place random offset
Browse files Browse the repository at this point in the history
  • Loading branch information
MikiraSora committed Mar 7, 2024
1 parent 58f6e83 commit 82ae7a6
Show file tree
Hide file tree
Showing 7 changed files with 50 additions and 14 deletions.
12 changes: 9 additions & 3 deletions OngekiFumenEditor/Base/OngekiObjects/Bell.cs
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,8 @@ public BulletPallete ReferenceBulletPallete
NotifyOfPropertyChange(() => TypeValue);
NotifyOfPropertyChange(() => TargetValue);
NotifyOfPropertyChange(() => ShooterValue);
NotifyOfPropertyChange(() => SizeValue);
NotifyOfPropertyChange(() => RandomOffsetRange);
NotifyOfPropertyChange(() => SizeValue);
}
}

Expand All @@ -49,7 +50,8 @@ private void ReferenceBulletPallete_PropertyChanged(object sender, System.Compon
case nameof(BulletPallete.ShooterValue):
case nameof(BulletPallete.SizeValue):
case nameof(BulletPallete.Speed):
NotifyOfPropertyChange(e.PropertyName);
case nameof(BulletPallete.RandomOffsetRange):
NotifyOfPropertyChange(e.PropertyName);
break;
}
}
Expand All @@ -59,7 +61,11 @@ private void ReferenceBulletPallete_PropertyChanged(object sender, System.Compon
[ObjectPropertyBrowserShow]
public float Speed => ReferenceBulletPallete?.Speed ?? default;

[ObjectPropertyBrowserAlias("BPL." + nameof(StrID))]
[ObjectPropertyBrowserAlias("BPL." + nameof(RandomOffsetRange))]
[ObjectPropertyBrowserShow]
public float RandomOffsetRange => ReferenceBulletPallete?.RandomOffsetRange ?? default;

[ObjectPropertyBrowserAlias("BPL." + nameof(StrID))]
[ObjectPropertyBrowserShow]
public string StrID => ReferenceBulletPallete?.StrID;

Expand Down
28 changes: 26 additions & 2 deletions OngekiFumenEditor/Base/OngekiObjects/BulletPallete.cs
Original file line number Diff line number Diff line change
@@ -1,13 +1,16 @@
using OngekiFumenEditor.Base.EditorObjects;
using OngekiFumenEditor.Base.OngekiObjects.BulletPalleteEnums;
using OngekiFumenEditor.Base.OngekiObjects.Lane;
using System;
using System.Linq;
using System.Windows.Media;

namespace OngekiFumenEditor.Base.OngekiObjects
{
public class BulletPallete : OngekiObjectBase
{
public static int RandomSeed { get; set; } = DateTime.Now.ToString().GetHashCode();

public double CalculateToXGridTotalUnit(IBulletPalleteReferencable refObject, OngekiFumen fumen)
{
double xGridTotalUnit;
Expand All @@ -28,7 +31,16 @@ public double CalculateToXGridTotalUnit(IBulletPalleteReferencable refObject, On
break;
}

return xGridTotalUnit;
var randomOffset = 0;
if (RandomOffsetRange > 0)
{
//不想用Random类,直接异或计算吧
var seed = (60045 * Id + 123) % 2147483648 * Id ^ Id;
var r = RandomOffsetRange;
randomOffset = (-r) + (int)(seed % (r - (-r) + 1));
}

return xGridTotalUnit + randomOffset;
}

public double CalculateFromXGridTotalUnit(IBulletPalleteReferencable refObject, OngekiFumen fumen)
Expand Down Expand Up @@ -111,6 +123,17 @@ public int PlaceOffset
}
}

private int randomOffsetRange = default;
public int RandomOffsetRange
{
get { return randomOffsetRange; }
set
{
randomOffsetRange = value;
NotifyOfPropertyChange(() => RandomOffsetRange);
}
}

private Target targetValue = Target.FixField;
public Target TargetValue
{
Expand Down Expand Up @@ -149,7 +172,7 @@ public float Speed

public bool IsEnableSoflan => TargetValue != Target.Player;

public override string ToString() => $"{base.ToString()} StrID[{StrID}] Speed[{Speed:F3}] ShooterValue[{ShooterValue}] TargetValue[{TargetValue}] SizeValue[{SizeValue}] TypeValue[{TypeValue}] EditorName[{EditorName}] PlaceOffset[{PlaceOffset}]";
public override string ToString() => $"{base.ToString()} StrID[{StrID}] Speed[{Speed:F3}] ShooterValue[{ShooterValue}] TargetValue[{TargetValue}] SizeValue[{SizeValue}] TypeValue[{TypeValue}] EditorName[{EditorName}] PlaceOffset[{PlaceOffset}] RandomOffsetRange[{RandomOffsetRange}]";

public static string CommandName => "BPL";
public override string IDShortName => CommandName;
Expand All @@ -168,6 +191,7 @@ public override void Copy(OngekiObjectBase fromObj)
ShooterValue = fromBpl.ShooterValue;
Speed = fromBpl.Speed;
TargetValue = fromBpl.TargetValue;
RandomOffsetRange = fromBpl.RandomOffsetRange;
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -164,7 +164,8 @@ void _Draw(T obj)
return;

var fromX = convertToX(bulletPallateRefObj.ReferenceBulletPallete?.CalculateFromXGridTotalUnit(bulletPallateRefObj, target.Editor.Fumen) ?? obj.XGrid.TotalUnit);
var toX = convertToX(bulletPallateRefObj.ReferenceBulletPallete?.CalculateToXGridTotalUnit(bulletPallateRefObj, target.Editor.Fumen) ?? obj.XGrid.TotalUnit);
var toXUnit = bulletPallateRefObj.ReferenceBulletPallete?.CalculateToXGridTotalUnit(bulletPallateRefObj, target.Editor.Fumen) ?? obj.XGrid.TotalUnit;
var toX = convertToX(toXUnit);
var timeX = MathUtils.CalculateXFromTwoPointFormFormula(currentTime, fromX, fromTime, toX, toTime);

if (!(target.Rect.MinX <= timeX && timeX <= target.Rect.MaxX))
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,8 @@ public void ParseAndApply(OngekiFumen fumen, string[] seg)
bpl.SizeValue = Enum.Parse<BulletSize>(map["Size"]);
bpl.TypeValue = Enum.Parse<BulletType>(map["Type"]);
bpl.Speed = float.Parse(map["Speed"]);
bpl.PlaceOffset = int.Parse(map["PlaceOffset"]);
bpl.RandomOffsetRange = int.Parse(map["RandomOffsetRange"]);
bpl.PlaceOffset = int.Parse(map["PlaceOffset"]);

fumen.AddObject(bpl);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -214,7 +214,9 @@ public void ProcessB_PALETTE(OngekiFumen fumen, StreamWriter sb)
sb.Write(", ");
sb.Write($"Speed[{bpl.Speed}]");
sb.Write(", ");
sb.Write($"PlaceOffset[{bpl.PlaceOffset}]");
sb.Write($"RandomOffsetRange[{bpl.RandomOffsetRange}]");
sb.Write(", ");
sb.Write($"PlaceOffset[{bpl.PlaceOffset}]");
sb.Write(", ");
sb.Write($"Shooter[{bpl.ShooterValue}]");
sb.WriteLine();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,8 +15,9 @@ public class BulletPalleteCommandParser : CommandParserBase

public override OngekiObjectBase Parse(CommandArgs args, OngekiFumen fumen)
{
var dataIntArr = args.GetDataArray<float>();
var dataStrArr = args.GetDataArray<string>();
var dataIntArr = args.GetDataArray<int>();
var dataFloatArr = args.GetDataArray<float>();
var dataStrArr = args.GetDataArray<string>();
var bpl = new BulletPallete();

bpl.StrID = dataStrArr.ElementAtOrDefault(1);
Expand All @@ -27,14 +28,14 @@ public override OngekiObjectBase Parse(CommandArgs args, OngekiFumen fumen)
"CEN" => Shooter.Center,
_ => throw new NotImplementedException(),
};
bpl.PlaceOffset = (int)dataIntArr.ElementAtOrDefault(3);
bpl.PlaceOffset = dataIntArr.ElementAtOrDefault(3);
bpl.TargetValue = dataStrArr.ElementAtOrDefault(4)?.ToUpper() switch
{
"PLR" => Target.Player,
"FIX" => Target.FixField,
_ => throw new NotImplementedException(),
};
bpl.Speed = dataIntArr.ElementAtOrDefault(5);
bpl.Speed = dataFloatArr.ElementAtOrDefault(5);
bpl.SizeValue = dataStrArr.ElementAtOrDefault(6)?.ToUpper() switch
{
"L" => BulletSize.Large,
Expand All @@ -46,8 +47,9 @@ public override OngekiObjectBase Parse(CommandArgs args, OngekiFumen fumen)
"NDL" => BulletType.Needle,
"CIR" or _ => BulletType.Circle,
};
bpl.RandomOffsetRange = dataIntArr.ElementAtOrDefault(8);

return bpl;
return bpl;
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -209,7 +209,7 @@ public void ProcessB_PALETTE(OngekiFumen fumen, StringBuilder sb)
_ => default
};

sb.AppendLine($"{bpl.IDShortName}\t{bpl.StrID}\t{shoot}\t{bpl.PlaceOffset}\t{target}\t{bpl.Speed}\t{size}\t{type}");
sb.AppendLine($"{bpl.IDShortName}\t{bpl.StrID}\t{shoot}\t{bpl.PlaceOffset}\t{target}\t{bpl.Speed}\t{size}\t{type}\t{bpl.RandomOffsetRange}");
}
}

Expand Down

0 comments on commit 82ae7a6

Please sign in to comment.