2024-03-10 00:36:43 +00:00
|
|
|
using System;
|
|
|
|
using System.Linq;
|
|
|
|
using System.Collections;
|
|
|
|
using System.Collections.Generic;
|
|
|
|
using UnityEngine;
|
|
|
|
|
|
|
|
using HeavenStudio.Util;
|
|
|
|
|
|
|
|
namespace HeavenStudio.Games.Scripts_SickBeats
|
|
|
|
{
|
|
|
|
public class Virus : MonoBehaviour
|
|
|
|
{
|
|
|
|
[Header("References")]
|
|
|
|
[SerializeField] SpriteRenderer[] renderers;
|
|
|
|
[SerializeField] Animator virusAnim;
|
|
|
|
|
|
|
|
[Header("Variables")]
|
|
|
|
public double startBeat;
|
|
|
|
public int position;
|
|
|
|
public int life = 1;
|
|
|
|
|
2024-03-13 16:47:40 +00:00
|
|
|
bool isJust = false; // not fundamental solution
|
|
|
|
|
2024-03-10 00:36:43 +00:00
|
|
|
private SickBeats game;
|
|
|
|
|
|
|
|
public void Init()
|
|
|
|
{
|
|
|
|
game = SickBeats.instance;
|
|
|
|
ChangeColor();
|
|
|
|
}
|
|
|
|
|
|
|
|
public void Appear()
|
|
|
|
{
|
2024-03-13 16:47:40 +00:00
|
|
|
if (startBeat >= game.gameEndBeat) return;
|
2024-03-10 00:36:43 +00:00
|
|
|
MultiSound.Play(new MultiSound.Sound[]
|
|
|
|
{
|
2024-03-13 16:47:40 +00:00
|
|
|
new MultiSound.Sound("sickBeats/appear"+UnityEngine.Random.Range(0, 2).ToString(), startBeat),
|
2024-03-10 00:36:43 +00:00
|
|
|
});
|
|
|
|
|
|
|
|
BeatAction.New(game, new() {new BeatAction.Action(startBeat, delegate {
|
|
|
|
VirusAnim("appear");
|
|
|
|
})});
|
|
|
|
|
2024-03-13 16:47:40 +00:00
|
|
|
isJust = false;
|
|
|
|
|
|
|
|
PlayerInput.InputAction InputAction;
|
|
|
|
if (PlayerInput.PlayerHasControl() && PlayerInput.CurrentControlStyle is InputSystem.InputController.ControlStyles.Touch)
|
|
|
|
{
|
|
|
|
InputAction = SickBeats.InputAction_FlickPress;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
InputAction = position switch {
|
|
|
|
0 => SickBeats.InputAction_Right,
|
|
|
|
1 => SickBeats.InputAction_Up,
|
|
|
|
2 => SickBeats.InputAction_Left,
|
|
|
|
3 => SickBeats.InputAction_Down,
|
|
|
|
};
|
|
|
|
}
|
|
|
|
|
|
|
|
// if (GameManager.instance.autoplay)
|
|
|
|
// {
|
|
|
|
// game.ScheduleAutoplayInput(startBeat, 1, InputAction, Just, Miss, Empty);
|
|
|
|
// }
|
|
|
|
// else
|
|
|
|
// {
|
|
|
|
// game.ScheduleUserInput(startBeat, 1, InputAction, Just, Miss, Empty, CanJust);
|
|
|
|
// }
|
|
|
|
game.ScheduleMissableInput(startBeat, 1, InputAction, Just, Miss, Empty, CanJust);
|
|
|
|
|
|
|
|
var dir = position;
|
|
|
|
BeatAction.New(game, new() {
|
|
|
|
new BeatAction.Action(startBeat, delegate { game.isPrepare[dir] = true;}),
|
|
|
|
new BeatAction.Action((startBeat+1.5f), delegate { game.isPrepare[dir] = false;}),
|
|
|
|
});
|
2024-03-10 00:36:43 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
public void Dash()
|
|
|
|
{
|
2024-03-13 16:47:40 +00:00
|
|
|
SoundByte.PlayOneShotGame("sickBeats/dash");
|
2024-03-10 00:36:43 +00:00
|
|
|
VirusAnim("dash");
|
|
|
|
}
|
2024-03-13 16:47:40 +00:00
|
|
|
public void Summon()
|
2024-03-10 00:36:43 +00:00
|
|
|
{
|
2024-03-13 16:47:40 +00:00
|
|
|
VirusAnim("summon");
|
2024-03-10 00:36:43 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
public void Move()
|
|
|
|
{
|
|
|
|
position++;
|
|
|
|
if (position <= 3)
|
|
|
|
{
|
|
|
|
startBeat+=2;
|
|
|
|
Appear();
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
Kill();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
public void Kill()
|
|
|
|
{
|
|
|
|
game.ScoreMiss();
|
2024-03-13 16:47:40 +00:00
|
|
|
|
|
|
|
MultiSound.Play(new MultiSound.Sound[]
|
|
|
|
{
|
|
|
|
new MultiSound.Sound("sickBeats/virusIn", startBeat + 2),
|
|
|
|
new MultiSound.Sound("sickBeats/miss", startBeat + 4),
|
|
|
|
new MultiSound.Sound("sickBeats/fadeout", startBeat + 5),
|
|
|
|
});
|
|
|
|
|
2024-03-10 00:36:43 +00:00
|
|
|
BeatAction.New(game, new() {
|
2024-03-13 16:47:40 +00:00
|
|
|
new BeatAction.Action(startBeat + 2, delegate {
|
2024-03-10 00:36:43 +00:00
|
|
|
virusAnim.DoScaledAnimationAsync("laugh", 0.5f);
|
|
|
|
virusAnim.DoScaledAnimationAsync("enter", 0.5f);
|
|
|
|
}),
|
2024-03-13 16:47:40 +00:00
|
|
|
new BeatAction.Action(startBeat + 4, delegate {
|
2024-03-10 00:36:43 +00:00
|
|
|
virusAnim.DoScaledAnimationAsync("hide", 0.5f);
|
|
|
|
game.orgAnim.DoScaledAnimationAsync("damage", 0.5f);
|
|
|
|
game.orgAlive = false;
|
|
|
|
}),
|
2024-03-13 16:47:40 +00:00
|
|
|
new BeatAction.Action(startBeat + 5, delegate {
|
2024-03-10 00:36:43 +00:00
|
|
|
game.orgAnim.DoScaledAnimationAsync("vanish", 0.5f);
|
|
|
|
}),
|
2024-03-13 16:47:40 +00:00
|
|
|
new BeatAction.Action(startBeat + 6, delegate {
|
2024-03-10 00:36:43 +00:00
|
|
|
virusAnim.DoScaledAnimationAsync("laugh", 0.5f);
|
|
|
|
}),
|
2024-03-13 16:47:40 +00:00
|
|
|
new BeatAction.Action(startBeat + 7, delegate {
|
2024-03-10 00:36:43 +00:00
|
|
|
game.orgAnim.DoScaledAnimationAsync("idleAdd", 0.5f);
|
|
|
|
game.orgAnim.DoScaledAnimationAsync("appear", 0.5f);
|
|
|
|
game.orgAlive = true;
|
|
|
|
Destroy(gameObject);
|
|
|
|
}),
|
|
|
|
});
|
2024-03-13 16:47:40 +00:00
|
|
|
|
|
|
|
Debug.Log(startBeat);
|
|
|
|
Debug.Log(game.docShockBeat);
|
|
|
|
if (startBeat + 6 >= game.docShockBeat + 3)
|
|
|
|
{
|
|
|
|
game.docShockBeat = startBeat + 6;
|
|
|
|
BeatAction.New(game, new() {
|
|
|
|
new BeatAction.Action(startBeat + 6, delegate {
|
|
|
|
game.docShock = true;
|
|
|
|
game.doctorAnim.DoScaledAnimationAsync("shock0", 0.5f);
|
|
|
|
}),
|
|
|
|
new BeatAction.Action(startBeat + 7, delegate {
|
|
|
|
game.doctorAnim.DoScaledAnimationAsync("shock1", 0.5f);
|
|
|
|
}),
|
|
|
|
new BeatAction.Action(startBeat + 9, delegate {
|
|
|
|
game.docShock = false;
|
|
|
|
game.doctorAnim.DoScaledAnimationAsync("idle", 0.5f);
|
|
|
|
}),
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
2024-03-10 00:36:43 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
private void Just(PlayerActionEvent caller, float state)
|
|
|
|
{
|
|
|
|
life--;
|
|
|
|
|
|
|
|
var dir = position;
|
|
|
|
BeatAction.New(game, new() {new BeatAction.Action((startBeat+1) + game.RefillBeat, delegate { game.RepopFork(dir);})});
|
|
|
|
game.isForkPop[dir] = false;
|
2024-03-13 16:47:40 +00:00
|
|
|
isJust = true;
|
2024-03-10 00:36:43 +00:00
|
|
|
|
|
|
|
if (life < 0)
|
|
|
|
{
|
|
|
|
if (state >= 1f)
|
|
|
|
{
|
2024-03-13 16:47:40 +00:00
|
|
|
SoundByte.PlayOneShotGame("sickBeats/bad");
|
2024-03-10 00:36:43 +00:00
|
|
|
VirusAnim("stabLate");
|
|
|
|
KeyAnim("stabLate");
|
|
|
|
}
|
|
|
|
else if (state <= -1f)
|
|
|
|
{
|
2024-03-13 16:47:40 +00:00
|
|
|
SoundByte.PlayOneShotGame("sickBeats/bad");
|
2024-03-10 00:36:43 +00:00
|
|
|
VirusAnim("stabFast");
|
|
|
|
KeyAnim("stabFast");
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2024-03-13 16:47:40 +00:00
|
|
|
SoundByte.PlayOneShotGame("sickBeats/hit");
|
2024-03-10 00:36:43 +00:00
|
|
|
VirusAnim("stab");
|
|
|
|
KeyAnim("stab");
|
|
|
|
|
|
|
|
BeatAction.New(game, new() {new BeatAction.Action((startBeat+2), delegate {
|
|
|
|
game.doctorAnim.DoScaledAnimationAsync("Vsign", 0.5f);
|
|
|
|
})});
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
SoundByte.PlayOneShotGame("sickBeats/resist");
|
|
|
|
VirusAnim("resist");
|
|
|
|
KeyAnim("resist");
|
|
|
|
ChangeColor();
|
|
|
|
Move();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
private void Miss(PlayerActionEvent caller)
|
|
|
|
{
|
2024-03-13 16:47:40 +00:00
|
|
|
var dir = position;
|
|
|
|
if (dir >= 0 && dir <= 3)
|
|
|
|
{
|
|
|
|
game.isMiss[dir] = true;
|
|
|
|
BeatAction.New(game, new() {new BeatAction.Action((startBeat+1.5f), delegate { game.isMiss[dir] = false;})});
|
|
|
|
}
|
2024-03-10 00:36:43 +00:00
|
|
|
Dash();
|
|
|
|
Move();
|
|
|
|
}
|
|
|
|
|
|
|
|
private void Empty(PlayerActionEvent caller) { }
|
|
|
|
|
|
|
|
private bool CanJust() {
|
|
|
|
if (position < 0 || position > 3) return false;
|
2024-03-13 16:47:40 +00:00
|
|
|
return game.isForkPop[position] || isJust;
|
2024-03-10 00:36:43 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
void VirusAnim(string animation)
|
|
|
|
{
|
|
|
|
virusAnim.DoScaledAnimationAsync(animation, 0.5f);
|
|
|
|
virusAnim.DoScaledAnimationAsync(animation+position.ToString(), 0.5f);
|
|
|
|
}
|
|
|
|
void KeyAnim(string animation)
|
|
|
|
{
|
|
|
|
game.keyAnim.Play("push");
|
|
|
|
game.forkAnims[position].DoScaledAnimationAsync(animation+position.ToString(), 0.5f);
|
|
|
|
}
|
|
|
|
|
|
|
|
void Update()
|
|
|
|
{
|
|
|
|
var cond = Conductor.instance;
|
|
|
|
|
|
|
|
if (cond.isPlaying && !cond.isPaused)
|
|
|
|
{
|
|
|
|
double beat = cond.songPositionInBeats;
|
|
|
|
if (life < 0 && beat >= startBeat + 3) Destroy(gameObject);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void ChangeColor()
|
|
|
|
{
|
2024-03-13 16:47:40 +00:00
|
|
|
foreach (var renderer in renderers)
|
|
|
|
{
|
|
|
|
renderer.material = game.RecolorMats[life];
|
|
|
|
}
|
2024-03-10 00:36:43 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|