start flow bar

This commit is contained in:
minenice55
2022-08-12 21:06:41 -04:00
parent 74c17a7a14
commit cedce55922
27 changed files with 10757 additions and 106 deletions

View File

@ -40,6 +40,11 @@ namespace HeavenStudio.Games.Loaders
new Param("toggle", true, "Return Camera", "Camera zooms back in?"),
}),
new GameAction("prepare", delegate { var e = eventCaller.currentEntity; KarateMan.instance.Prepare(e.beat, e.length);}, 1f, true),
new GameAction("set gameplay modifiers", delegate { var e = eventCaller.currentEntity; KarateMan.instance.SetGameplayMods(e.type, e.toggle); }, 0.5f, false, new List<Param>()
{
new Param("type", KarateMan.NoriMode.None, "Flow Bar type", "The type of Flow bar to use"),
new Param("toggle", true, "Enable Combos", "Allow the player to combo? (Contextual combos will still be allowed even when off)"),
}),
new GameAction("set background effects", delegate { var e = eventCaller.currentEntity; KarateMan.instance.SetBgAndShadowCol(e.beat, e.length, e.type, e.type2, e.colorA, e.colorB, e.type3); }, 0.5f, true, new List<Param>()
{
new Param("type", KarateMan.BackgroundType.Yellow, "Background Type", "The preset background type"),
@ -206,6 +211,16 @@ namespace HeavenStudio.Games
Blush
}
public enum NoriMode
{
None,
Tengoku,
Mania,
}
public bool IsComboEnable = true; //only stops Out combo inputs, this basically makes combo contextual
public bool IsNoriActive { get { return Nori.MaxNori > 0; } }
public float NoriPerformance { get { if (IsNoriActive) return Nori.Nori / Nori.MaxNori; else return 1f; } }
public Color[] LightBulbColors;
public Color[] BackgroundColors;
public Color[] ShadowColors;
@ -224,6 +239,8 @@ namespace HeavenStudio.Games
public Transform ItemHolder;
public GameObject Item;
public KarateManJoe Joe;
public GameObject NoriGO;
public KarateManNoriController Nori;
[Header("Colour Map")]
public Material MappingMaterial;
@ -381,7 +398,7 @@ namespace HeavenStudio.Games
startCamSpecial = beat;
cameraAngle = CameraAngle.Special;
}
wantsReturn = returns ? beat + length : Single.MaxValue;
wantsReturn = returns ? beat + length - 0.001f : Single.MaxValue;
cameraReturnLength = Mathf.Min(2f, length*0.5f);
}
@ -665,6 +682,13 @@ namespace HeavenStudio.Games
UpdateFilterColour(bgColour, filterColour);
}
public void SetGameplayMods(int mode, bool combo)
{
NoriGO.SetActive(true);
Nori.SetNoriMode(mode);
IsComboEnable = combo;
}
void UpdateFilterColour(Color bgColor, Color filterColor)
{
Color col;

View File

@ -32,10 +32,13 @@ namespace HeavenStudio.Games.Scripts_KarateMan
public bool inKick = false;
float lastChargeTime = Single.MinValue;
float unPrepareTime = Single.MinValue;
float noNuriJabTime = Single.MinValue;
bool canEmote = false;
public int wantFace = 0;
bool inSpecial { get { return inCombo || lockedInCombo || Conductor.instance.GetPositionFromBeat(lastChargeTime, 2.75f) <= 0.25f; } }
public bool inSpecial { get { return inCombo || lockedInCombo ||
Conductor.instance.GetPositionFromBeat(lastChargeTime, 2.75f) <= 0.25f || inNuriLock; } }
public bool inNuriLock { get { return (Conductor.instance.songPositionInBeats >= noNuriJabTime && Conductor.instance.songPositionInBeats < noNuriJabTime + 1f); } }
private void Awake()
{
@ -45,6 +48,25 @@ namespace HeavenStudio.Games.Scripts_KarateMan
{
var cond = Conductor.instance;
UpdateShadowColour();
if (canEmote && wantFace >= 0)
{
SetFaceExpressionForced(wantFace);
if (wantFace == (int) KarateMan.KarateManFaces.Surprise) wantFace = -1;
}
if (cond.songPositionInBeats >= noNuriJabTime && cond.songPositionInBeats < noNuriJabTime + 1f)
{
anim.DoScaledAnimation("JabNoNuri", noNuriJabTime, 1f);
bop.startBeat = noNuriJabTime + 1f;
}
else if (cond.songPositionInBeats >= noNuriJabTime + 1f && noNuriJabTime != Single.MinValue)
{
bop.startBeat = noNuriJabTime + 1f;
noNuriJabTime = Single.MinValue;
}
if (unPrepareTime != Single.MinValue && cond.songPositionInBeats >= unPrepareTime)
{
unPrepareTime = Single.MinValue;
@ -103,7 +125,7 @@ namespace HeavenStudio.Games.Scripts_KarateMan
Jukebox.PlayOneShotGame("karateman/swingNoHit", forcePlay: true);
}
}
else if (PlayerInput.AltPressed() && !inSpecial)
else if (PlayerInput.AltPressed() && KarateMan.instance.IsComboEnable && !inSpecial)
{
if (!KarateMan.instance.IsExpectingInputNow())
{
@ -136,13 +158,6 @@ namespace HeavenStudio.Games.Scripts_KarateMan
}
}
UpdateShadowColour();
if (canEmote && wantFace >= 0)
{
SetFaceExpressionForced(wantFace);
if (wantFace == (int) KarateMan.KarateManFaces.Surprise) wantFace = -1;
}
}
public bool Punch(int forceHand = 0)
@ -178,6 +193,11 @@ namespace HeavenStudio.Games.Scripts_KarateMan
anim.DoScaledAnimationAsync("Straight", 0.5f);
straight = true;
break;
case 3:
lastPunchTime = Single.MinValue;
anim.DoNormalizedAnimation("JabNoNuri");
noNuriJabTime = cond.songPositionInBeats;
break;
}
bop.startBeat = cond.songPositionInBeats + 0.5f;
return straight; //returns what hand was used to punch the object

View File

@ -0,0 +1,135 @@
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using HeavenStudio.Util;
namespace HeavenStudio.Games.Scripts_KarateMan
{
public class KarateManNoriController : MonoBehaviour
{
public GameObject NoriController;
public GameObject NoriHeart;
public Transform NoriHolder;
public Material NoriMaterial;
public float Nori;
public int MaxNori;
Animator[] NoriHeartAnimators;
Material[] NoriHeartMaterials;
static Vector2 HeartScale = new Vector2(60, 52);
static float ScaleFactorTengoku = 1/46f;
static float ScaleFactorMania = 1/72f;
static float CameraOffset = 10;
static float PeriodLow = 24/60f;
static float PeriodHigh = 15/60f;
int noriMode = (int) KarateMan.NoriMode.None;
void Start()
{
}
public void SetNoriMode(int mode, int startingNori = 0)
{
float scaleFactor = 0f;
//clear all children of the holder
foreach (Transform child in NoriHolder)
{
Destroy(child.gameObject);
}
switch (mode)
{
case (int) KarateMan.NoriMode.Tengoku:
MaxNori = 5;
Nori = Mathf.Clamp(startingNori, 0, MaxNori);
scaleFactor = ScaleFactorTengoku;
break;
case (int) KarateMan.NoriMode.Mania:
MaxNori = 10;
Nori = Mathf.Clamp(startingNori, 0, MaxNori);
scaleFactor = ScaleFactorMania;
break;
default:
MaxNori = 0;
Nori = 0;
return;
}
NoriHeartAnimators = new Animator[MaxNori];
NoriHeartMaterials = new Material[MaxNori];
noriMode = mode;
if (mode == (int) KarateMan.NoriMode.None) return;
//add the label?
for (int i = 0; i < MaxNori; i++)
{
GameObject h = GameObject.Instantiate(NoriHeart, NoriHolder);
h.SetActive(true);
Material m_Material = Instantiate(NoriMaterial);
NoriHeartMaterials[i] = m_Material;
h.GetComponent<Image>().material = m_Material;
RectTransform hrect = h.GetComponent<RectTransform>();
hrect.SetSizeWithCurrentAnchors(RectTransform.Axis.Horizontal, HeartScale.x * scaleFactor);
hrect.SetSizeWithCurrentAnchors(RectTransform.Axis.Vertical, HeartScale.y * scaleFactor);
NoriHeartAnimators[i] = h.GetComponent<Animator>();
NoriHeartAnimators[i].Play(i <= (int) (startingNori - 1) ? "NoriFull" : "NoriNone", -1, (Time.time * PeriodLow) % 1f);
}
}
public void DoHit()
{
if (noriMode == (int) KarateMan.NoriMode.None) return;
if (noriMode == (int) KarateMan.NoriMode.Tengoku)
{
if (Nori >= MaxNori) return;
Nori += 1;
NoriHeartAnimators[(int) Nori - 1].Play("NoriFull", -1, (Time.time * PeriodHigh) % 1f);
}
}
public void DoNG()
{
if (noriMode == (int) KarateMan.NoriMode.None) return;
if (noriMode == (int) KarateMan.NoriMode.Tengoku)
{
if (Nori <= 0) return;
Nori -= 1;
NoriHeartAnimators[(int) Nori].Play("NoriNone", -1, (Time.time * PeriodLow) % 1f);
}
}
public void DoThrough()
{
if (noriMode == (int) KarateMan.NoriMode.None) return;
if (noriMode == (int) KarateMan.NoriMode.Tengoku)
{
Nori = 0;
foreach (Animator anim in NoriHeartAnimators)
{
anim.Play("NoriNone", -1, (Time.time * PeriodLow) % 1f);
}
}
}
void Update()
{
Transform target = GameCamera.instance.transform;
Vector3 displacement = target.forward * CameraOffset;
transform.position = target.position + displacement;
transform.rotation = target.rotation;
}
}
}

View File

@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 3f1678e3fe1b7c94f9a1558cfd247853
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@ -335,6 +335,19 @@ namespace HeavenStudio.Games.Scripts_KarateMan
}
break;
case FlyStatus.HitWeak:
prog = cond.GetPositionFromBeat(startBeat, 1f);
if (cond.songPositionInBeats >= startBeat + 3f)
{
GameObject.Destroy(ShadowInstance.gameObject);
GameObject.Destroy(gameObject);
return;
}
Vector3 pos = new Vector3(HitPosition[1].position.x + 0.25f, HitPosition[0].position.y, HitPosition[1].position.z);
if (prog <= 1f)
{
pos.y = EasingFunction.EaseInCubic(HitPosition[1].position.y, HitPosition[0].position.y, prog);
}
transform.position = pos;
break;
}
ShadowInstance.transform.position = new Vector3(transform.position.x, floorHeight - 0.5f, transform.position.z);
@ -561,9 +574,9 @@ namespace HeavenStudio.Games.Scripts_KarateMan
{
if (GameManager.instance.currentGame != "karateman") return;
var joe = KarateMan.instance.Joe;
if (status == FlyStatus.Fly && !joe.inCombo) {
bool straight = joe.Punch(ItemPunchHand());
if (status == FlyStatus.Fly && !(joe.inCombo || joe.inNuriLock)) {
if (state <= -1f || state >= 1f) {
bool straight = joe.Punch(ItemPunchHand());
startBeat = Conductor.instance.songPositionInBeats;
CurrentCurve = ItemCurves[6];
curveTargetBeat = 1f;
@ -577,10 +590,29 @@ namespace HeavenStudio.Games.Scripts_KarateMan
joe.SetFaceExpression((int) KarateMan.KarateManFaces.Normal);
}),
});
KarateMan.instance.Nori.DoNG();
}
else {
if (KarateMan.instance.IsNoriActive)
{
if ((type == ItemType.Rock || type == ItemType.Cooking || type == ItemType.Alien || type == ItemType.TacoBell)
&& KarateMan.instance.NoriPerformance < 0.6f)
{
CreateHitMark(false);
startBeat = Conductor.instance.songPositionInBeats;
status = FlyStatus.HitWeak;
Jukebox.PlayOneShotGame("karateman/hitNoNori", forcePlay: true);
joe.Punch(3);
transform.rotation = Quaternion.Euler(0, 0, transform.rotation.eulerAngles.z - 30f);
KarateMan.instance.Nori.DoNG();
return;
}
}
bool straight = joe.Punch(ItemPunchHand());
ItemHitEffect(straight);
status = FlyStatus.Hit;
KarateMan.instance.Nori.DoHit();
}
}
}
@ -588,10 +620,11 @@ namespace HeavenStudio.Games.Scripts_KarateMan
public void ItemWrongAction(PlayerActionEvent caller, float state)
{
if (GameManager.instance.currentGame != "karateman") return;
if (!KarateMan.instance.IsComboEnable) return;
//hitting a normal object with the alt input
//WHEN SCORING THIS IS A MISS
var joe = KarateMan.instance.Joe;
if (status == FlyStatus.Fly && !joe.inCombo) {
if (status == FlyStatus.Fly && !(joe.inCombo || joe.inNuriLock)) {
joe.ForceFailCombo(Conductor.instance.songPositionInBeats);
if (state <= -1f || state >= 1f) {
startBeat = Conductor.instance.songPositionInBeats;
@ -613,6 +646,7 @@ namespace HeavenStudio.Games.Scripts_KarateMan
joe.SetFaceExpression((int) KarateMan.KarateManFaces.Normal);
}),
});
KarateMan.instance.Nori.DoThrough();
}
}
@ -626,22 +660,22 @@ namespace HeavenStudio.Games.Scripts_KarateMan
BeatAction.New(joe.gameObject, new List<BeatAction.Action>()
{
new BeatAction.Action(startBeat + 2f, delegate {
//TODO: play miss sound
//deduct flow if applicable
joe.SetFaceExpression((int) KarateMan.KarateManFaces.Surprise);
Jukebox.PlayOneShotGame("karateman/karate_through", forcePlay: true);
}),
new BeatAction.Action(startBeat + 6f, delegate {
if (joe.wantFace == -1)
joe.SetFaceExpression((int) KarateMan.KarateManFaces.Normal);
}),
});
KarateMan.instance.Nori.DoThrough();
}
public void ComboStartJustOrNg(PlayerActionEvent caller, float state)
{
if (GameManager.instance.currentGame != "karateman") return;
var joe = KarateMan.instance.Joe;
if (status == FlyStatus.Fly && !(joe.inKick || joe.wantKick || joe.inCombo)) {
if (status == FlyStatus.Fly && !(joe.inKick || joe.wantKick || joe.inCombo || joe.inNuriLock)) {
joe.inCombo = true;
joe.Punch(1);
joe.SetComboId(comboId);
@ -652,9 +686,12 @@ namespace HeavenStudio.Games.Scripts_KarateMan
curveTargetBeat = 1f;
Jukebox.PlayOneShot("miss");
status = FlyStatus.NG;
KarateMan.instance.Nori.DoNG();
}
else {
ItemHitEffect();
KarateMan.instance.Nori.DoHit();
}
}
}
@ -667,16 +704,16 @@ namespace HeavenStudio.Games.Scripts_KarateMan
if (status != FlyStatus.Fly || gameObject == null) return;
BeatAction.New(joe.gameObject, new List<BeatAction.Action>()
{
new BeatAction.Action(startBeat + 2f, delegate {
//TODO: play miss sound
//deduct flow if applicable
new BeatAction.Action(startBeat + 2f, delegate {
joe.SetFaceExpression((int) KarateMan.KarateManFaces.Surprise);
Jukebox.PlayOneShotGame("karateman/karate_through", forcePlay: true);
}),
new BeatAction.Action(startBeat + 6f, delegate {
if (joe.wantFace == -1)
joe.SetFaceExpression((int) KarateMan.KarateManFaces.Normal);
}),
});
KarateMan.instance.Nori.DoThrough();
}
public void ComboStartWrongAction(PlayerActionEvent caller, float state)
@ -685,7 +722,7 @@ namespace HeavenStudio.Games.Scripts_KarateMan
//hitting a combo start with the normal input
//WHEN SCORING THIS IS A MISS
var joe = KarateMan.instance.Joe;
if (status == FlyStatus.Fly && !joe.inCombo) {
if (status == FlyStatus.Fly && !(joe.inCombo || joe.inNuriLock)) {
bool straight = joe.Punch(ItemPunchHand());
if (state <= -1f || state >= 1f) {
startBeat = Conductor.instance.songPositionInBeats;
@ -697,6 +734,7 @@ namespace HeavenStudio.Games.Scripts_KarateMan
else {
ItemHitEffect(straight);
}
KarateMan.instance.Nori.DoThrough();
}
}
@ -725,6 +763,8 @@ namespace HeavenStudio.Games.Scripts_KarateMan
joe.SetFaceExpression((int) KarateMan.KarateManFaces.Normal);
}),
});
KarateMan.instance.Nori.DoNG();
}
else {
ItemHitEffect();
@ -737,6 +777,7 @@ namespace HeavenStudio.Games.Scripts_KarateMan
joe.SetFaceExpression((int) KarateMan.KarateManFaces.Normal);
})
});
KarateMan.instance.Nori.DoHit();
}
}
}
@ -764,8 +805,6 @@ namespace HeavenStudio.Games.Scripts_KarateMan
BeatAction.New(joe.gameObject, new List<BeatAction.Action>()
{
new BeatAction.Action(startBeat + 2f, delegate {
//TODO: play miss sound
//deduct flow if applicable
joe.SetFaceExpression((int) KarateMan.KarateManFaces.Surprise);
}),
new BeatAction.Action(startBeat + 6f, delegate {
@ -793,25 +832,28 @@ namespace HeavenStudio.Games.Scripts_KarateMan
})
});
}
KarateMan.instance.Nori.DoThrough();
}
public void ComboEndWrongAction(PlayerActionEvent caller, float state)
{
if (GameManager.instance.currentGame != "karateman") return;
KarateMan.instance.Joe.Punch(1);
if (!(KarateMan.instance.Joe.inCombo || KarateMan.instance.Joe.inNuriLock))
KarateMan.instance.Joe.Punch(1);
}
public void ComboEndWrongActionAlt(PlayerActionEvent caller, float state)
{
if (GameManager.instance.currentGame != "karateman") return;
KarateMan.instance.Joe.ForceFailCombo(Conductor.instance.songPositionInBeats);
if (KarateMan.instance.IsComboEnable && !(KarateMan.instance.Joe.inCombo || KarateMan.instance.Joe.inNuriLock))
KarateMan.instance.Joe.ForceFailCombo(Conductor.instance.songPositionInBeats);
}
public void KickChargeJustOrNg(PlayerActionEvent caller, float state)
{
if (GameManager.instance.currentGame != "karateman") return;
var joe = KarateMan.instance.Joe;
if (status == FlyStatus.Fly && !(joe.inKick || joe.wantKick || joe.inCombo)) {
if (status == FlyStatus.Fly && !(joe.inKick || joe.wantKick || joe.inCombo || joe.inNuriLock)) {
joe.Punch(ItemPunchHand());
if (state <= -1f || state >= 1f) {
startBeat = Conductor.instance.songPositionInBeats;
@ -827,11 +869,13 @@ namespace HeavenStudio.Games.Scripts_KarateMan
joe.SetFaceExpression((int) KarateMan.KarateManFaces.Normal);
}),
});
KarateMan.instance.Nori.DoNG();
}
else {
joe.StartKickCharge(startBeat + 1.25f);
ItemHitEffect();
status = FlyStatus.Hit;
KarateMan.instance.Nori.DoHit();
}
}
}
@ -845,16 +889,16 @@ namespace HeavenStudio.Games.Scripts_KarateMan
if (status != FlyStatus.Fly || gameObject == null) return;
BeatAction.New(joe.gameObject, new List<BeatAction.Action>()
{
new BeatAction.Action(startBeat + 2f, delegate {
//TODO: play miss sound
//deduct flow if applicable
new BeatAction.Action(startBeat + 2f, delegate {
joe.SetFaceExpression((int) KarateMan.KarateManFaces.Surprise);
Jukebox.PlayOneShotGame("karateman/karate_through", forcePlay: true);
}),
new BeatAction.Action(startBeat + 6f, delegate {
if (joe.wantFace == -1)
joe.SetFaceExpression((int) KarateMan.KarateManFaces.Normal);
}),
});
KarateMan.instance.Nori.DoThrough();
}
public void KickJustOrNg(PlayerActionEvent caller, float state)
@ -879,6 +923,8 @@ namespace HeavenStudio.Games.Scripts_KarateMan
joe.SetFaceExpression((int) KarateMan.KarateManFaces.Normal);
}),
});
KarateMan.instance.Nori.DoNG();
}
else {
ItemHitEffect();
@ -897,6 +943,8 @@ namespace HeavenStudio.Games.Scripts_KarateMan
joe.SetFaceExpression((int) KarateMan.KarateManFaces.Normal);
})
});
KarateMan.instance.Nori.DoHit();
}
}
}
@ -915,6 +963,7 @@ namespace HeavenStudio.Games.Scripts_KarateMan
KarateMan.instance.Joe.SetFaceExpression((int) KarateMan.KarateManFaces.VerySad);
})
});
KarateMan.instance.Nori.DoThrough();
}
}
}