HeavenStudioPlus/Assets/Scripts/Games/CoinToss/CoinToss.cs

194 lines
6.4 KiB
C#
Raw Normal View History

2022-05-01 18:22:00 +00:00
using DG.Tweening;
using NaughtyBezierCurves;
using HeavenStudio.Util;
using System;
using System.Collections.Generic;
using UnityEngine;
namespace HeavenStudio.Games.Loaders
{
using static Minigames;
public static class NtrCoinLoader
{
public static Minigame AddGame(EventCaller eventCaller)
{
return new Minigame("coinToss", "Coin Toss \n [One coin at a time!]", "B4E6F6", false, false, new List<GameAction>()
2022-05-01 18:22:00 +00:00
{
new GameAction("toss", delegate { CoinToss.instance.TossCoin(eventCaller.currentEntity.beat, eventCaller.currentEntity.toggle); }, 7, false, parameters: new List<Param>()
{
new Param("toggle", false, "Audience Reaction", "Enable Audience Reaction"),
}),
2022-05-06 20:23:52 +00:00
new GameAction("set background color", delegate { var e = eventCaller.currentEntity; CoinToss.instance.ChangeBackgroundColor(e.colorA, 0f); }, 0.5f, false, new List<Param>()
{
new Param("colorA", CoinToss.defaultBgColor, "Background Color", "The background color to change to")
} ),
new GameAction("fade background color", delegate { var e = eventCaller.currentEntity; CoinToss.instance.FadeBackgroundColor(e.colorA, e.colorB, e.length); }, 1f, true, new List<Param>()
{
new Param("colorA", Color.white, "Start Color", "The starting color in the fade"),
new Param("colorB", CoinToss.defaultBgColor, "End Color", "The ending color in the fade")
} ),
new GameAction("set foreground color", delegate { var e = eventCaller.currentEntity; CoinToss.instance.ChangeBackgroundColor(e.colorA, 0f, true); }, 0.5f, false, new List<Param>()
{
new Param("colorA", CoinToss.defaultFgColor, "Background Color", "The background color to change to")
} ),
new GameAction("fade foreground color", delegate { var e = eventCaller.currentEntity; CoinToss.instance.FadeBackgroundColor(e.colorA, e.colorB, e.length, true); }, 1f, true, new List<Param>()
{
new Param("colorA", Color.white, "Start Color", "The starting color in the fade"),
new Param("colorB", CoinToss.defaultFgColor, "End Color", "The ending color in the fade")
} ),
},
new List<string>() {"ntr", "aim"},
"ntrcoin", "en",
new List<string>() {}
);
2022-05-01 18:22:00 +00:00
}
}
}
namespace HeavenStudio.Games
{
//using Scripts_CoinToss;
2022-05-01 18:22:00 +00:00
public class CoinToss : Minigame
{
2022-05-01 22:24:07 +00:00
//Right now, you can only throw one coin at a time.
//..Which makes sense, you only have one coin in the original game
//Though it would need a bit of code rewrite to make it work with multiple coins
2022-05-01 18:22:00 +00:00
public static CoinToss instance { get; set; }
2022-05-06 20:23:52 +00:00
private static Color _defaultBgColor;
public static Color defaultBgColor
{
get
{
ColorUtility.TryParseHtmlString("#F7F742", out _defaultBgColor);
return _defaultBgColor;
}
}
private static Color _defaultFgColor;
public static Color defaultFgColor
{
get
{
ColorUtility.TryParseHtmlString("#FFFF83", out _defaultFgColor);
return _defaultFgColor;
}
}
[Header("Backgrounds")]
public SpriteRenderer fg;
public SpriteRenderer bg;
Tween bgColorTween;
Tween fgColorTween;
2022-05-01 18:22:00 +00:00
[Header("Animators")]
public Animator handAnimator;
2022-05-06 20:23:52 +00:00
public Boolean isThrowing;
public bool audienceReacting;
public PlayerActionEvent coin;
2022-05-01 18:22:00 +00:00
private void Awake()
{
instance = this;
2022-05-01 22:24:07 +00:00
isThrowing = false;
coin = null;
2022-05-01 18:22:00 +00:00
}
private void Update()
{
//nothing
2022-05-01 18:22:00 +00:00
}
private void LateUpdate()
{
//nothing
2022-05-01 18:22:00 +00:00
}
public void TossCoin(float beat, bool audienceReacting)
2022-05-01 18:22:00 +00:00
{
if (coin != null) return;
2022-05-01 22:24:07 +00:00
//Play sound and animations
2022-05-01 18:22:00 +00:00
Jukebox.PlayOneShotGame("coinToss/throw");
handAnimator.Play("Throw", 0, 0);
2022-05-01 22:24:07 +00:00
//Game state says the hand is throwing the coin
2022-05-01 18:22:00 +00:00
isThrowing = true;
this.audienceReacting = audienceReacting;
coin = ScheduleInput(beat, 6f, InputType.STANDARD_DOWN, CatchSuccess, CatchMiss, CatchEmpty);
2022-05-06 20:05:19 +00:00
//coin.perfectOnly = true;
2022-05-01 18:22:00 +00:00
}
2022-05-06 20:05:19 +00:00
public void CatchSuccess(PlayerActionEvent caller, float state)
{
Jukebox.PlayOneShotGame("coinToss/catch");
if(this.audienceReacting) Jukebox.PlayOneShotGame("coinToss/applause");
handAnimator.Play("Catch_success", 0, 0);
isThrowing = false;
}
2022-05-06 20:05:19 +00:00
public void CatchMiss(PlayerActionEvent caller)
{
Jukebox.PlayOneShotGame("coinToss/miss");
if(this.audienceReacting) Jukebox.PlayOneShotGame("coinToss/disappointed");
handAnimator.Play("Pickup", 0, 0);
2022-05-01 22:24:07 +00:00
isThrowing = false;
}
2022-05-06 20:05:19 +00:00
public void CatchEmpty(PlayerActionEvent caller)
{
handAnimator.Play("Catch_empty", 0, 0);
isThrowing = false;
coin.CanHit(false);
}
2022-05-06 20:23:52 +00:00
public void ChangeBackgroundColor(Color color, float beats, bool isFg = false)
{
var seconds = Conductor.instance.secPerBeat * beats;
if(!isFg)
{
if (bgColorTween != null)
bgColorTween.Kill(true);
} else
{
if (fgColorTween != null)
fgColorTween.Kill(true);
}
if (seconds == 0)
{
if(!isFg) bg.color = color;
if (isFg) fg.color = color;
}
else
{
if(!isFg) bgColorTween = bg.DOColor(color, seconds);
if(isFg) fgColorTween = fg.DOColor(color, seconds);
}
}
public void FadeBackgroundColor(Color start, Color end, float beats, bool isFg = false)
{
ChangeBackgroundColor(start, 0f, isFg);
ChangeBackgroundColor(end, beats, isFg);
}
2022-05-01 18:22:00 +00:00
}
}