2022-03-07 03:17:46 +00:00
using System.Collections ;
using System.Collections.Generic ;
using UnityEngine ;
using System ;
2024-02-16 06:17:16 +00:00
2022-03-07 03:17:46 +00:00
2022-03-14 14:21:05 +00:00
using HeavenStudio.Util ;
2022-03-07 03:17:46 +00:00
2022-04-12 16:14:46 +00:00
namespace HeavenStudio.Games.Loaders
{
using static Minigames ;
public static class CtrDrummingLoader
{
public static Minigame AddGame ( EventCaller eventCaller ) {
2023-04-02 02:28:23 +00:00
return new Minigame ( "drummingPractice" , "Drumming Practice" , "36d23e" , false , false , new List < GameAction > ( )
2022-04-12 16:14:46 +00:00
{
2022-08-21 03:13:52 +00:00
new GameAction ( "bop" , "Bop" )
2022-04-12 16:14:46 +00:00
{
2023-03-07 17:22:32 +00:00
function = delegate { var e = eventCaller . currentEntity ; DrummingPractice . instance . SetBop ( e . beat , e . length , e [ "bop" ] , e [ "autoBop" ] ) ; } ,
resizable = true ,
parameters = new List < Param > ( )
{
2024-01-15 02:04:10 +00:00
new Param ( "bop" , true , "Bop" , "Toggle if the drummers should bop for the duration of this event." ) ,
new Param ( "autoBop" , false , "Bop (Auto)" , "Toggle if the drummers should automatically bop until another Bop event is reached." )
2023-03-07 17:22:32 +00:00
}
2022-08-21 03:13:52 +00:00
} ,
new GameAction ( "drum" , "Hit Drum" )
2022-04-12 16:14:46 +00:00
{
2022-08-21 23:46:45 +00:00
function = delegate { var e = eventCaller . currentEntity ; DrummingPractice . instance . Prepare ( e . beat , e [ "toggle" ] ) ; } ,
2022-08-21 03:13:52 +00:00
defaultLength = 2f ,
parameters = new List < Param > ( )
{
2024-01-15 02:04:10 +00:00
new Param ( "toggle" , true , "Applause" , "Toggle if applause should be played on a successful hit." )
2022-08-21 03:13:52 +00:00
}
} ,
new GameAction ( "set mii" , "Set Miis" )
2022-04-12 16:14:46 +00:00
{
2022-08-21 23:46:45 +00:00
function = delegate { var e = eventCaller . currentEntity ; DrummingPractice . instance . SetMiis ( e [ "type" ] , e [ "type2" ] , e [ "type3" ] , e [ "toggle" ] ) ; } ,
2022-08-21 03:13:52 +00:00
defaultLength = 0.5f ,
parameters = new List < Param > ( )
{
2024-01-15 02:04:10 +00:00
new Param ( "toggle" , false , "Set All To Player" , "Toggle if all Miis should be set to the player's (middle) Mii." , new List < Param . CollapseParam > ( )
2023-09-08 14:27:07 +00:00
{
2023-10-27 20:19:11 +00:00
new Param . CollapseParam ( ( x , _ ) = > ! ( bool ) x , new string [ ] { "type" , "type2" , "type3" } )
2023-09-08 14:27:07 +00:00
} ) ,
2024-01-15 02:04:10 +00:00
new Param ( "type" , DrummingPractice . MiiType . Random , "Player Mii" , "Set the Mii that the player will control." ) ,
new Param ( "type2" , DrummingPractice . MiiType . Random , "Left Mii" , "Set the Mii on the left." ) ,
new Param ( "type3" , DrummingPractice . MiiType . Random , "Right Mii" , "Set the Mii on the right." ) ,
2022-08-21 03:13:52 +00:00
}
} ,
2024-01-15 02:04:10 +00:00
new GameAction ( "move npc drummers" , "NPC Drummers" )
2023-02-14 16:31:51 +00:00
{
function = delegate { var e = eventCaller . currentEntity ; DrummingPractice . instance . NPCDrummersEnterOrExit ( e . beat , e . length , e [ "exit" ] , e [ "ease" ] ) ; } ,
defaultLength = 4f ,
resizable = true ,
parameters = new List < Param > ( )
{
2024-01-15 02:04:10 +00:00
new Param ( "exit" , false , "Exit" , "Toggle if the NPC drummers should enter or exit the scene." ) ,
new Param ( "ease" , EasingFunction . Ease . Linear , "Ease" , "Set the easing of the action." )
2023-02-14 16:31:51 +00:00
}
} ,
2024-01-15 02:04:10 +00:00
new GameAction ( "set background color" , "Background Appearance" )
2022-08-21 03:13:52 +00:00
{
2023-08-12 03:30:03 +00:00
function = delegate { var e = eventCaller . currentEntity ;
DrummingPractice . instance . BackgroundColor ( e . beat , e . length , e [ "colorAStart" ] , e [ "colorA" ] , e [ "colorBStart" ] , e [ "colorB" ] , e [ "colorC" ] , e [ "ease" ] ) ; } ,
defaultLength = 4f ,
resizable = true ,
2022-08-21 03:13:52 +00:00
parameters = new List < Param > ( )
{
2024-03-04 03:50:46 +00:00
new Param ( "colorAStart" , new Color ( 43 / 255f , 207 / 255f , 51 / 255f ) , "Top Color Start" , "Set the top-most color of the background gradient at the start of the event." ) ,
new Param ( "colorA" , new Color ( 43 / 255f , 207 / 255f , 51 / 255f ) , "Top Color End" , "Set the top-most color of the background gradient at the end of the event." ) ,
new Param ( "colorBStart" , new Color ( 1 , 1 , 1 ) , "Bottom Color Start" , "Set the bottom-most color of the background gradient at the start of the event." ) ,
new Param ( "colorB" , new Color ( 1 , 1 , 1 ) , "Bottom Color End" , "Set the bottom-most color of the background gradient at the end of the event." ) ,
2024-01-15 02:04:10 +00:00
new Param ( "colorC" , new Color ( 1 , 247 / 255f , 0 ) , "Streak Color" , "Set the color of the streaks that appear upon a successful hit." ) ,
new Param ( "ease" , Util . EasingFunction . Ease . Linear , "Ease" , "Set the easing of the action." )
2022-08-21 03:13:52 +00:00
}
}
2023-05-28 17:34:44 +00:00
} ,
new List < string > ( ) { "ctr" , "normal" } ,
"ctrintro" , "en" ,
2024-03-29 02:35:07 +00:00
new List < string > ( ) { } ,
chronologicalSortKey : 0
2023-05-28 17:34:44 +00:00
) ;
2022-04-12 16:14:46 +00:00
}
}
}
2022-03-14 14:21:05 +00:00
namespace HeavenStudio.Games
2022-03-07 03:17:46 +00:00
{
2022-03-12 04:10:13 +00:00
using Scripts_DrummingPractice ;
2022-03-07 03:17:46 +00:00
public class DrummingPractice : Minigame
{
2022-03-07 05:26:59 +00:00
public enum MiiType
{
2022-03-11 18:20:24 +00:00
Random = - 1 ,
2022-03-07 05:26:59 +00:00
GuestA ,
GuestB ,
GuestC ,
GuestD ,
GuestE ,
GuestF ,
Matt ,
Tsunku ,
2024-05-10 12:32:04 +00:00
Marshal ,
Error
2022-03-07 05:26:59 +00:00
}
2022-03-07 03:17:46 +00:00
[Header("References")]
2022-03-15 23:15:54 +00:00
public SpriteRenderer background ;
2022-03-07 03:17:46 +00:00
public SpriteRenderer backgroundGradient ;
2022-03-15 23:15:54 +00:00
public SpriteRenderer [ ] streaks ;
2022-03-07 03:17:46 +00:00
public Drummer player ;
public Drummer leftDrummer ;
public Drummer rightDrummer ;
2022-03-07 05:00:54 +00:00
public GameObject hitPrefab ;
2023-02-14 16:31:51 +00:00
[SerializeField] Animator NPCDrummers ;
[Header("Variables")]
float movingLength ;
2023-06-10 19:13:29 +00:00
double movingStartBeat ;
2023-02-14 16:31:51 +00:00
bool isMoving ;
string moveAnim ;
EasingFunction . Ease lastEase ;
2022-03-07 05:00:54 +00:00
public int count = 0 ;
2022-03-07 03:17:46 +00:00
public static DrummingPractice instance ;
private void Awake ( )
{
instance = this ;
2022-03-26 02:08:46 +00:00
SetMiis ( ) ;
2023-12-05 22:38:52 +00:00
SetupBopRegion ( "drummingPractice" , "bop" , "autoBop" ) ;
2022-03-07 03:17:46 +00:00
}
2022-03-26 02:08:46 +00:00
2023-06-10 19:13:29 +00:00
public override void OnGameSwitch ( double beat )
2022-03-07 05:00:54 +00:00
{
2023-06-10 19:13:29 +00:00
var changeMii = GameManager . instance . Beatmap . Entities . FindLast ( c = > c . datamodel = = "drummingPractice/set mii" & & c . beat < = beat ) ;
2022-03-27 18:13:13 +00:00
if ( changeMii ! = null )
{
EventCaller . instance . CallEvent ( changeMii , true ) ;
}
2023-08-12 03:30:03 +00:00
PersistColor ( beat ) ;
2022-03-07 05:00:54 +00:00
}
2023-11-23 16:19:39 +00:00
public override void OnBeatPulse ( double beat )
2022-03-07 03:17:46 +00:00
{
2023-12-05 22:38:52 +00:00
if ( BeatIsInBopRegion ( beat ) )
2022-03-07 05:00:54 +00:00
{
2023-11-23 16:19:39 +00:00
Bop ( ) ;
2022-03-07 05:00:54 +00:00
}
2023-11-23 16:19:39 +00:00
}
private void Update ( )
{
var cond = Conductor . instance ;
2022-03-15 23:15:54 +00:00
2023-02-14 16:31:51 +00:00
if ( isMoving & & cond . isPlaying & & ! cond . isPaused )
{
float normalizedBeat = cond . GetPositionFromBeat ( movingStartBeat , movingLength ) ;
2023-03-07 17:22:32 +00:00
if ( normalizedBeat > = 0 & & normalizedBeat < = 1f )
{
EasingFunction . Function func = EasingFunction . GetEasingFunction ( lastEase ) ;
float newPos = func ( 0f , 1f , normalizedBeat ) ;
NPCDrummers . DoNormalizedAnimation ( moveAnim , newPos ) ;
}
2023-02-14 16:31:51 +00:00
}
2022-03-15 23:15:54 +00:00
foreach ( SpriteRenderer streak in streaks )
{
Color col = streak . color ;
streak . color = new Color ( col . r , col . g , col . b , Mathf . Lerp ( col . a , 0 , 3.5f * Time . deltaTime ) ) ;
}
2023-08-12 03:30:03 +00:00
BackgroundColorUpdate ( ) ;
2022-03-07 05:00:54 +00:00
}
2023-06-10 19:13:29 +00:00
public void NPCDrummersEnterOrExit ( double beat , float length , bool exit , int ease )
2023-02-14 16:31:51 +00:00
{
movingStartBeat = beat ;
movingLength = length ;
moveAnim = exit ? "NPCDrummersExit" : "NPCDrummersEnter" ;
isMoving = true ;
lastEase = ( EasingFunction . Ease ) ease ;
2023-09-11 22:28:04 +00:00
BeatAction . New ( instance , new List < BeatAction . Action > ( )
2023-02-14 16:31:51 +00:00
{
new BeatAction . Action ( beat + length - 0.01f , delegate { isMoving = false ; } )
} ) ;
}
2023-06-10 19:13:29 +00:00
public void SetBop ( double beat , float length , bool shouldBop , bool autoBop )
2022-03-07 05:00:54 +00:00
{
2023-03-07 17:22:32 +00:00
if ( shouldBop )
{
for ( int i = 0 ; i < length ; i + + )
{
2023-09-11 22:28:04 +00:00
BeatAction . New ( instance , new List < BeatAction . Action > ( )
2023-03-07 17:22:32 +00:00
{
new BeatAction . Action ( beat + i , delegate { Bop ( ) ; } )
} ) ;
}
}
2022-03-07 05:00:54 +00:00
}
public void Bop ( )
{
player . Bop ( ) ;
leftDrummer . Bop ( ) ;
rightDrummer . Bop ( ) ;
}
2023-06-10 19:13:29 +00:00
public void Prepare ( double beat , bool applause )
2022-03-07 05:00:54 +00:00
{
int type = count % 2 ;
2023-03-07 17:22:32 +00:00
player . Prepare ( beat , type ) ;
leftDrummer . Prepare ( beat , type ) ;
rightDrummer . Prepare ( beat , type ) ;
2022-03-07 05:00:54 +00:00
count + + ;
SetFaces ( 0 ) ;
2023-06-10 19:13:29 +00:00
SoundByte . PlayOneShotGame ( "drummingPractice/prepare" ) ;
2022-03-07 05:00:54 +00:00
GameObject hit = Instantiate ( hitPrefab ) ;
hit . transform . parent = hitPrefab . transform . parent ;
hit . SetActive ( true ) ;
DrummerHit h = hit . GetComponent < DrummerHit > ( ) ;
h . startBeat = beat ;
2022-03-07 17:10:50 +00:00
h . applause = applause ;
2022-03-07 05:00:54 +00:00
}
public void SetFaces ( int type )
{
player . SetFace ( type ) ;
leftDrummer . SetFace ( type ) ;
rightDrummer . SetFace ( type ) ;
2022-03-07 03:17:46 +00:00
}
2022-03-11 18:24:24 +00:00
public void SetMiis ( int playerFace = ( int ) MiiType . Random , int leftFace = ( int ) MiiType . Random , int rightFace = ( int ) MiiType . Random , bool all = false )
2022-03-07 05:26:59 +00:00
{
2022-03-11 18:24:24 +00:00
if ( playerFace = = ( int ) MiiType . Random )
2022-03-11 18:20:24 +00:00
{
do
{
2024-05-10 12:32:04 +00:00
player . mii = UnityEngine . Random . Range ( 0 , player . miiFaces . Count - 1 ) ;
2022-03-11 18:20:24 +00:00
}
while ( player . mii = = leftFace | | player . mii = = rightFace ) ;
}
else
player . mii = playerFace ;
2022-03-07 05:26:59 +00:00
2022-03-11 18:20:24 +00:00
if ( all & & playerFace ! = - 1 )
2022-03-07 05:26:59 +00:00
{
leftDrummer . mii = playerFace ;
rightDrummer . mii = playerFace ;
}
else
{
2022-03-11 18:24:24 +00:00
if ( leftFace = = ( int ) MiiType . Random )
2022-03-07 05:26:59 +00:00
{
2022-03-11 18:20:24 +00:00
do
{
2024-05-10 12:32:04 +00:00
leftDrummer . mii = UnityEngine . Random . Range ( 0 , player . miiFaces . Count - 1 ) ;
2022-03-11 18:20:24 +00:00
}
while ( leftDrummer . mii = = player . mii ) ;
2022-03-07 05:26:59 +00:00
}
2022-03-11 18:20:24 +00:00
else
leftDrummer . mii = leftFace ;
2022-03-11 18:24:24 +00:00
if ( rightFace = = ( int ) MiiType . Random )
2022-03-07 05:26:59 +00:00
{
2022-03-11 18:20:24 +00:00
do
{
2024-05-10 12:32:04 +00:00
rightDrummer . mii = UnityEngine . Random . Range ( 0 , player . miiFaces . Count - 1 ) ;
2022-03-11 18:20:24 +00:00
}
while ( rightDrummer . mii = = leftDrummer . mii | | rightDrummer . mii = = player . mii ) ;
2022-03-07 05:26:59 +00:00
}
2022-03-11 18:20:24 +00:00
else
rightDrummer . mii = rightFace ;
2022-03-07 05:26:59 +00:00
}
SetFaces ( 0 ) ;
}
2024-03-04 03:50:46 +00:00
private ColorEase tColorEase = new ( new Color ( 43 / 255f , 207 / 255f , 51 / 255f ) ) ; // top gradient color
private ColorEase bColorEase = new ( Color . white ) ; // bottom gradient color
2023-08-12 03:30:03 +00:00
//call this in update
private void BackgroundColorUpdate ( )
{
2024-03-04 03:50:46 +00:00
backgroundGradient . color = tColorEase . GetColor ( ) ;
background . color = bColorEase . GetColor ( ) ;
2023-08-12 03:30:03 +00:00
}
2024-03-04 03:50:46 +00:00
public void BackgroundColor ( double beat , float length , Color colorStartSetT , Color colorEndSetT , Color colorStartSetB , Color colorEndSetB , Color setStreak , int ease )
2022-03-15 23:15:54 +00:00
{
2024-03-04 03:50:46 +00:00
tColorEase = new ColorEase ( beat , length , colorStartSetT , colorEndSetT , ease ) ;
bColorEase = new ColorEase ( beat , length , colorStartSetB , colorEndSetB , ease ) ;
2023-08-12 03:30:03 +00:00
2024-03-04 03:50:46 +00:00
foreach ( SpriteRenderer streak in streaks ) {
2023-08-12 03:30:03 +00:00
streak . color = new Color ( setStreak . r , setStreak . g , setStreak . b , streak . color . a ) ;
2022-03-15 23:15:54 +00:00
}
}
2023-08-12 03:30:03 +00:00
//call this in OnPlay(double beat) and OnGameSwitch(double beat)
private void PersistColor ( double beat )
{
var allEventsBeforeBeat = EventCaller . GetAllInGameManagerList ( "drummingPractice" , new string [ ] { "set background color" } ) . FindAll ( x = > x . beat < beat ) ;
if ( allEventsBeforeBeat . Count > 0 )
{
allEventsBeforeBeat . Sort ( ( x , y ) = > x . beat . CompareTo ( y . beat ) ) ; //just in case
var lastEvent = allEventsBeforeBeat [ ^ 1 ] ;
BackgroundColor ( lastEvent . beat , lastEvent . length , lastEvent [ "colorAStart" ] , lastEvent [ "colorA" ] , lastEvent [ "colorBStart" ] , lastEvent [ "colorB" ] , lastEvent [ "colorC" ] , lastEvent [ "ease" ] ) ;
}
}
public override void OnPlay ( double beat )
{
PersistColor ( beat ) ;
}
2022-03-15 23:15:54 +00:00
public void Streak ( )
{
foreach ( SpriteRenderer streak in streaks )
{
Color col = streak . color ;
streak . color = new Color ( col . r , col . g , col . b , 0.7f ) ;
}
}
2022-03-07 03:17:46 +00:00
}
}