using HeavenStudio.Util; using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.Rendering; using DG.Tweening; using NaughtyBezierCurves; namespace HeavenStudio.Games.Loaders { using static Minigames; public static class NtrSamuraiLoader { public static Minigame AddGame(EventCaller eventCaller) { return new Minigame("samuraiSliceNtr", "Samurai Slice (DS)", "b6b5b6", false, false, new List() { new GameAction("bop", "Bop") { function = delegate {var e = eventCaller.currentEntity; SamuraiSliceNtr.instance.Bop(e.beat, e.length, e["whoBops"], e["whoBopsAuto"]); }, resizable = true, parameters = new List() { new Param("whoBops", SamuraiSliceNtr.WhoBops.Both, "Who Bops?", "Who will bop?"), new Param("whoBopsAuto", SamuraiSliceNtr.WhoBops.None, "Who Bops? (Auto)", "Who will automatically begin bopping?") } }, new GameAction("melon", "Melon") { function = delegate { SamuraiSliceNtr.instance.ObjectIn(eventCaller.currentEntity.beat, (int)SamuraiSliceNtr.ObjectType.Melon, (int) eventCaller.currentEntity["valA"], eventCaller.currentEntity["2b2t"]); }, defaultLength = 5, parameters = new List() { new Param("2b2t", false, "Melon2B2T", "Should the melon be reskinned as the 2B2T melon?"), new Param("valA", new EntityTypes.Integer(0, 30, 1), "Money", "The amount of coins the melon spills out when sliced"), } }, new GameAction("fish", "Fish") { function = delegate { SamuraiSliceNtr.instance.ObjectIn(eventCaller.currentEntity.beat, (int)SamuraiSliceNtr.ObjectType.Fish, (int) eventCaller.currentEntity["valA"]); }, defaultLength = 7, parameters = new List() { new Param("valA", new EntityTypes.Integer(0, 30, 1), "Money", "The amount of coins the fish spills out when sliced"), } }, new GameAction("demon", "Demon") { function = delegate { SamuraiSliceNtr.instance.ObjectIn(eventCaller.currentEntity.beat, (int)SamuraiSliceNtr.ObjectType.Demon, (int) eventCaller.currentEntity["valA"]); }, defaultLength = 7, parameters = new List() { new Param("valA", new EntityTypes.Integer(0, 30, 1), "Money", "The amount of coins the demon spills out when sliced"), } }, //backwards compatibility new GameAction("spawn object", "Toss Object") { function = delegate { SamuraiSliceNtr.instance.ObjectIn(eventCaller.currentEntity.beat, eventCaller.currentEntity["type"], (int) eventCaller.currentEntity["valA"]); }, defaultLength = 8, parameters = new List() { new Param("type", SamuraiSliceNtr.ObjectType.Melon, "Object", "The object to spawn"), new Param("valA", new EntityTypes.Integer(0, 30, 1), "Money", "The amount of coins the melon spills out when sliced"), }, hidden = true }, }, new List() {"ntr", "normal"}, "ntrsamurai", "en", new List() {"en"} ); } } } namespace HeavenStudio.Games { using Scripts_NtrSamurai; public class SamuraiSliceNtr : Minigame { public enum ObjectType { Melon, Fish, Demon, Melon2B2T, } public enum WhoBops { Samurai = 0, Children = 1, Both = 2, None = 3 } private bool goBopSamurai = true; private bool goBopChild = true; [Header("References")] public NtrSamurai player; public GameObject launcher; public GameObject objectPrefab; public GameObject childParent; public Transform objectHolder; public BezierCurve3D InCurve; public BezierCurve3D LaunchCurve; public BezierCurve3D LaunchHighCurve; public BezierCurve3D NgLaunchCurve; public BezierCurve3D DebrisLeftCurve; public BezierCurve3D DebrisRightCurve; public BezierCurve3D NgDebrisCurve; //game scene public static SamuraiSliceNtr instance; public GameEvent bop = new GameEvent(); private void Awake() { instance = this; } // Update is called once per frame void Update() { var cond = Conductor.instance; if (cond.ReportBeat(ref bop.lastReportedBeat, bop.startBeat % 1)) { if (goBopSamurai) player.Bop(); if (goBopChild) childParent.GetComponent().Bop(); } if (PlayerInput.AltPressed()) DoStep(); if (PlayerInput.AltPressedUp() && player.isStepping()) DoUnStep(); if (PlayerInput.Pressed()) DoSlice(); } public void Bop(double beat, float length, int whoBops, int whoBopsAuto) { goBopSamurai = whoBopsAuto == (int)WhoBops.Samurai || whoBopsAuto == (int)WhoBops.Both; goBopChild = whoBopsAuto == (int)WhoBops.Children || whoBopsAuto == (int)WhoBops.Both; for (int i = 0; i < length; i++) { BeatAction.New(instance.gameObject, new List() { new BeatAction.Action(beat + i, delegate { BopSingle(whoBops); }) }); } } void BopSingle(int whoBops) { switch (whoBops) { case (int)WhoBops.Samurai: player.Bop(); break; case (int)WhoBops.Children: childParent.GetComponent().Bop(); break; case (int)WhoBops.Both: player.Bop(); childParent.GetComponent().Bop(); break; default: break; } } public void DoStep() { SoundByte.PlayOneShotGame("samuraiSliceNtr/ntrSamurai_launchThrough"); player.Step(false); launcher.GetComponent().Play("Launch", -1, 0); } public void DoUnStep() { player.Step(true); launcher.GetComponent().Play("UnStep", -1, 0); } public void DoSlice() { if (player.isStepping()) { launcher.GetComponent().Play("UnStep", -1, 0); } SoundByte.PlayOneShotGame("samuraiSliceNtr/ntrSamurai_through"); player.Slash(); } public void Bop(double beat, float length) { bop.length = length; bop.startBeat = beat; } public void ObjectIn(double beat, int type = (int) ObjectType.Melon, int value = 1, bool funnyMinecraft = false) { var mobj = GameObject.Instantiate(objectPrefab, objectHolder); var mobjDat = mobj.GetComponent(); mobjDat.startBeat = beat; mobjDat.type = funnyMinecraft ? (int)ObjectType.Melon2B2T : type; mobjDat.holdingCash = value; mobj.SetActive(true); SoundByte.PlayOneShotGame("samuraiSliceNtr/ntrSamurai_in00"); } public NtrSamuraiChild CreateChild(double beat) { var mobj = GameObject.Instantiate(childParent, objectHolder); var mobjDat = mobj.GetComponent(); mobjDat.startBeat = beat; mobjDat.isMain = false; mobjDat.Bop(); mobj.SetActive(true); mobj.GetComponent().sortingOrder = 7; return mobjDat; } } }