2023-05-19 22:21:02 +00:00
using System.Collections ;
using System.Collections.Generic ;
using UnityEngine ;
using HeavenStudio.Util ;
2023-06-10 19:13:29 +00:00
using Jukebox ;
2023-05-19 22:21:02 +00:00
namespace HeavenStudio.Games.Loaders
{
using static Minigames ;
public static class AgbTossBoysLoader
{
public static Minigame AddGame ( EventCaller eventCaller )
{
return new Minigame ( "tossBoys" , "Toss Boys" , "9cfff7" , false , false , new List < GameAction > ( )
{
new GameAction ( "dispense" , "Dispense" )
{
function = delegate { var e = eventCaller . currentEntity ; TossBoys . instance . Dispense ( e . beat , e . length , e [ "who" ] , e [ "call" ] ) ; } ,
defaultLength = 2f ,
resizable = true ,
parameters = new List < Param > ( )
{
new Param ( "who" , TossBoys . KidChoice . Akachan , "Receiver" , "Who will receive the ball?" ) ,
new Param ( "call" , false , "Name Call" , "Should the other kids than the receiver call their name?" )
}
} ,
new GameAction ( "pass" , "Normal Toss" )
{
defaultLength = 2f ,
2023-05-20 14:04:37 +00:00
resizable = true ,
2023-05-19 22:21:02 +00:00
parameters = new List < Param > ( )
{
new Param ( "who" , TossBoys . KidChoice . Aokun , "Receiver" , "Who will receive the ball?" )
}
} ,
new GameAction ( "dual" , "Dual Toss" )
{
defaultLength = 1f ,
2023-05-20 14:04:37 +00:00
resizable = true ,
2023-05-19 22:21:02 +00:00
parameters = new List < Param > ( )
{
new Param ( "who" , TossBoys . KidChoice . Akachan , "Receiver" , "Who will receive the ball?" )
}
} ,
new GameAction ( "high" , "High Toss" )
{
defaultLength = 3f ,
2023-05-20 14:04:37 +00:00
resizable = true ,
2023-05-19 22:21:02 +00:00
parameters = new List < Param > ( )
{
new Param ( "who" , TossBoys . KidChoice . Kiiyan , "Receiver" , "Who will receive the ball?" )
}
} ,
new GameAction ( "lightning" , "Lightning Toss" )
{
defaultLength = 2f ,
2023-05-20 14:04:37 +00:00
resizable = true ,
2023-05-19 22:21:02 +00:00
parameters = new List < Param > ( )
{
new Param ( "who" , TossBoys . KidChoice . Aokun , "Receiver" , "Who will receive the ball?" )
}
} ,
new GameAction ( "blur" , "Blur Toss" )
{
defaultLength = 2f
} ,
new GameAction ( "pop" , "Pop Ball" )
{
2023-05-20 14:04:37 +00:00
defaultLength = 1f ,
2023-05-19 22:21:02 +00:00
} ,
new GameAction ( "bop" , "Bop" )
{
function = delegate { var e = eventCaller . currentEntity ; TossBoys . instance . Bop ( e . beat , e . length , e [ "auto" ] , e [ "bop" ] ) ; } ,
resizable = true ,
parameters = new List < Param > ( )
{
new Param ( "bop" , true , "Bop" , "Should the toss boys bop to the beat?" ) ,
new Param ( "auto" , false , "Bop (Auto)" , "Should the toss boys auto bop to the beat?" )
}
} ,
new GameAction ( "changeBG" , "Change Background Color" )
{
2023-08-12 03:30:03 +00:00
function = delegate { var e = eventCaller . currentEntity ; TossBoys . instance . BackgroundColor ( e . beat , e . length , e [ "start" ] , e [ "end" ] , e [ "ease" ] ) ; } ,
2023-05-19 22:21:02 +00:00
defaultLength = 1f ,
resizable = true ,
parameters = new List < Param > ( )
{
new Param ( "start" , TossBoys . defaultBGColor , "Start Color" , "The start color for the fade or the color that will be switched to if -instant- is ticked on." ) ,
new Param ( "end" , TossBoys . defaultBGColor , "End Color" , "The end color for the fade." ) ,
2023-08-12 03:30:03 +00:00
new Param ( "ease" , Util . EasingFunction . Ease . Linear , "Ease" )
2023-05-19 22:21:02 +00:00
}
} ,
2023-05-28 17:34:44 +00:00
} ,
new List < string > ( ) { "agb" , "normal" } ,
"agbtoss" , "en" ,
new List < string > ( ) { }
) ;
2023-05-19 22:21:02 +00:00
}
}
}
namespace HeavenStudio.Games
{
using Scripts_TossBoys ;
public class TossBoys : Minigame
{
private static Color _defaultBGColor ;
public static Color defaultBGColor
{
get
{
ColorUtility . TryParseHtmlString ( "#62FDBB" , out _defaultBGColor ) ;
return _defaultBGColor ;
}
}
public enum KidChoice
{
Akachan = 0 ,
Aokun = 1 ,
Kiiyan = 2
}
public enum WhichTossKid
{
None = - 1 ,
Akachan = 0 ,
Aokun = 1 ,
Kiiyan = 2
}
[Header("Components")]
[SerializeField] TossKid akachan ;
[SerializeField] TossKid aokun ;
[SerializeField] TossKid kiiyan ;
[SerializeField] Animator hatchAnim ;
[SerializeField] TossBoysBall ballPrefab ;
[SerializeField] GameObject specialAka ;
[SerializeField] GameObject specialAo ;
[SerializeField] GameObject specialKii ;
[SerializeField] TossKid currentSpecialKid ;
[SerializeField] SpriteRenderer bg ;
[Header("Properties")]
[SerializeField] SuperCurveObject . Path [ ] ballPaths ;
WhichTossKid lastReceiver = WhichTossKid . None ;
WhichTossKid currentReceiver = WhichTossKid . None ;
public TossBoysBall currentBall = null ;
2023-06-10 19:13:29 +00:00
Dictionary < double , RiqEntity > passBallDict = new ( ) ;
2023-05-19 22:21:02 +00:00
string currentPassType ;
public static TossBoys instance ;
bool shouldBop = true ;
public GameEvent bop = new GameEvent ( ) ;
2023-05-20 14:04:37 +00:00
float currentEventLength ;
2023-05-19 22:21:02 +00:00
private void Awake ( )
{
instance = this ;
2023-08-12 03:30:03 +00:00
colorStart = defaultBGColor ;
colorEnd = defaultBGColor ;
2023-05-19 22:21:02 +00:00
}
new void OnDrawGizmos ( )
{
base . OnDrawGizmos ( ) ;
foreach ( SuperCurveObject . Path path in ballPaths )
{
if ( path . preview )
{
ballPrefab . DrawEditorGizmo ( path ) ;
}
}
}
public SuperCurveObject . Path GetPath ( string name )
{
foreach ( SuperCurveObject . Path path in ballPaths )
{
if ( path . name = = name )
{
return path ;
}
}
return default ( SuperCurveObject . Path ) ;
}
private void Update ( )
{
var cond = Conductor . instance ;
2023-08-12 03:30:03 +00:00
BackgroundColorUpdate ( ) ;
2023-05-19 22:21:02 +00:00
if ( cond . isPlaying & & ! cond . isPaused )
{
if ( cond . ReportBeat ( ref bop . lastReportedBeat , bop . startBeat % 1 ) )
{
if ( shouldBop )
{
SingleBop ( ) ;
}
}
if ( PlayerInput . Pressed ( ) & & ! IsExpectingInputNow ( InputType . STANDARD_DOWN ) )
{
akachan . HitBall ( false ) ;
}
if ( PlayerInput . AltPressed ( ) & & ! IsExpectingInputNow ( InputType . STANDARD_ALT_DOWN ) )
{
aokun . HitBall ( false ) ;
}
if ( PlayerInput . GetAnyDirectionDown ( ) & & ! IsExpectingInputNow ( InputType . DIRECTION_DOWN ) )
{
kiiyan . HitBall ( false ) ;
}
}
}
2023-08-12 03:30:03 +00:00
private double colorStartBeat = - 1 ;
private float colorLength = 0f ;
private Color colorStart = Color . white ; //obviously put to the default color of the game
private Color colorEnd = Color . white ;
private Util . EasingFunction . Ease colorEase ; //putting Util in case this game is using jukebox
//call this in update
private void BackgroundColorUpdate ( )
2023-05-19 22:21:02 +00:00
{
2023-08-12 03:30:03 +00:00
float normalizedBeat = Mathf . Clamp01 ( Conductor . instance . GetPositionFromBeat ( colorStartBeat , colorLength ) ) ;
2023-05-19 22:21:02 +00:00
2023-08-12 03:30:03 +00:00
var func = Util . EasingFunction . GetEasingFunction ( colorEase ) ;
2023-05-19 22:21:02 +00:00
2023-08-12 03:30:03 +00:00
float newR = func ( colorStart . r , colorEnd . r , normalizedBeat ) ;
float newG = func ( colorStart . g , colorEnd . g , normalizedBeat ) ;
float newB = func ( colorStart . b , colorEnd . b , normalizedBeat ) ;
bg . color = new Color ( newR , newG , newB ) ;
}
public void BackgroundColor ( double beat , float length , Color colorStartSet , Color colorEndSet , int ease )
{
colorStartBeat = beat ;
colorLength = length ;
colorStart = colorStartSet ;
colorEnd = colorEndSet ;
colorEase = ( Util . EasingFunction . Ease ) ease ;
}
//call this in OnPlay(double beat) and OnGameSwitch(double beat)
private void PersistColor ( double beat )
{
var allEventsBeforeBeat = EventCaller . GetAllInGameManagerList ( "tossBoys" , new string [ ] { "changeBG" } ) . FindAll ( x = > x . beat < beat ) ;
if ( allEventsBeforeBeat . Count > 0 )
2023-05-19 22:21:02 +00:00
{
2023-08-12 03:30:03 +00:00
allEventsBeforeBeat . Sort ( ( x , y ) = > x . beat . CompareTo ( y . beat ) ) ; //just in case
var lastEvent = allEventsBeforeBeat [ ^ 1 ] ;
BackgroundColor ( lastEvent . beat , lastEvent . length , lastEvent [ "start" ] , lastEvent [ "end" ] , lastEvent [ "ease" ] ) ;
2023-05-19 22:21:02 +00:00
}
}
2023-08-12 03:30:03 +00:00
public override void OnPlay ( double beat )
{
PersistColor ( beat ) ;
}
public override void OnGameSwitch ( double beat )
2023-05-19 22:21:02 +00:00
{
2023-08-12 03:30:03 +00:00
PersistColor ( beat ) ;
2023-05-19 22:21:02 +00:00
}
#region Bop
void SingleBop ( )
{
akachan . Bop ( ) ;
aokun . Bop ( ) ;
kiiyan . Bop ( ) ;
}
2023-06-10 19:13:29 +00:00
public void Bop ( double beat , float length , bool auto , bool goBop )
2023-05-19 22:21:02 +00:00
{
shouldBop = auto ;
if ( goBop )
{
List < BeatAction . Action > bops = new List < BeatAction . Action > ( ) ;
for ( int i = 0 ; i < length ; i + + )
{
bops . Add ( new BeatAction . Action ( beat + i , delegate { SingleBop ( ) ; } ) ) ;
}
2023-09-11 22:28:04 +00:00
BeatAction . New ( instance , bops ) ;
2023-05-19 22:21:02 +00:00
}
}
#endregion
2023-06-10 19:13:29 +00:00
public void Dispense ( double beat , float length , int who , bool call )
2023-05-19 22:21:02 +00:00
{
if ( currentBall ! = null ) return ;
SetPassBallEvents ( ) ;
SetReceiver ( who ) ;
GetCurrentReceiver ( ) . ShowArrow ( beat , length - 1 ) ;
2023-06-10 19:13:29 +00:00
SoundByte . PlayOneShotGame ( "tossBoys/ballStart" + GetColorBasedOnTossKid ( currentReceiver , true ) ) ;
2023-05-19 22:21:02 +00:00
hatchAnim . Play ( "HatchOpen" , 0 , 0 ) ;
currentBall = Instantiate ( ballPrefab , transform ) ;
currentBall . gameObject . SetActive ( true ) ;
switch ( who )
{
case ( int ) WhichTossKid . Akachan :
currentBall . SetState ( TossBoysBall . State . RedDispense , beat , length ) ;
break ;
case ( int ) WhichTossKid . Aokun :
currentBall . SetState ( TossBoysBall . State . BlueDispense , beat , length ) ;
break ;
case ( int ) WhichTossKid . Kiiyan :
currentBall . SetState ( TossBoysBall . State . YellowDispense , beat , length ) ;
break ;
default :
break ;
}
if ( call )
{
2023-06-10 19:13:29 +00:00
double callBeat = beat ;
2023-05-19 22:21:02 +00:00
switch ( who )
{
case ( int ) WhichTossKid . Akachan :
MultiSound . Play ( new MultiSound . Sound [ ]
{
new MultiSound . Sound ( "tossBoys/blueRedHigh1" , callBeat ) ,
new MultiSound . Sound ( "tossBoys/yellowRedHigh1" , callBeat ) ,
new MultiSound . Sound ( "tossBoys/blueRedHigh2" , callBeat + 0.25f ) ,
new MultiSound . Sound ( "tossBoys/yellowRedHigh2" , callBeat + 0.25f ) ,
new MultiSound . Sound ( "tossBoys/blueRedHigh3" , callBeat + 0.5f ) ,
new MultiSound . Sound ( "tossBoys/yellowRedHigh3" , callBeat + 0.5f ) ,
} ) ;
break ;
case ( int ) WhichTossKid . Aokun :
MultiSound . Play ( new MultiSound . Sound [ ]
{
new MultiSound . Sound ( "tossBoys/redBlueHigh1" , callBeat ) ,
new MultiSound . Sound ( "tossBoys/yellowBlueHigh1" , callBeat ) ,
new MultiSound . Sound ( "tossBoys/redBlueHigh2" , callBeat + 0.5f ) ,
new MultiSound . Sound ( "tossBoys/yellowBlueHigh2" , callBeat + 0.5f ) ,
} ) ;
break ;
case ( int ) WhichTossKid . Kiiyan :
MultiSound . Play ( new MultiSound . Sound [ ]
{
new MultiSound . Sound ( "tossBoys/redYellowHigh1" , callBeat ) ,
new MultiSound . Sound ( "tossBoys/blueYellowHigh1" , callBeat ) ,
new MultiSound . Sound ( "tossBoys/redYellowHigh2" , callBeat + 0.5f ) ,
new MultiSound . Sound ( "tossBoys/blueYellowHigh2" , callBeat + 0.5f ) ,
} ) ;
break ;
default :
break ;
}
}
if ( passBallDict . ContainsKey ( beat + length ) )
{
ScheduleInput ( beat , length , GetInputTypeBasedOnCurrentReceiver ( ) , JustHitBall , Miss , Empty ) ;
if ( passBallDict [ beat + length ] . datamodel = = "tossBoys/dual" | | passBallDict [ beat + length ] . datamodel = = "tossBoys/lightning" | | passBallDict [ beat + length ] . datamodel = = "tossBoys/blur" )
{
2023-09-11 22:28:04 +00:00
BeatAction . New ( instance , new List < BeatAction . Action > ( )
2023-05-19 22:21:02 +00:00
{
new BeatAction . Action ( beat + length - 1 , delegate { DoSpecialBasedOnReceiver ( beat + length - 1 ) ; } )
} ) ;
}
else if ( passBallDict [ beat + length ] . datamodel = = "tossBoys/pop" )
{
2023-09-11 22:28:04 +00:00
BeatAction . New ( instance , new List < BeatAction . Action > ( )
2023-05-19 22:21:02 +00:00
{
new BeatAction . Action ( beat + length - 1 , delegate { GetCurrentReceiver ( ) . PopBallPrepare ( ) ; } )
} ) ;
}
}
else
{
2023-09-11 22:28:04 +00:00
BeatAction . New ( instance , new List < BeatAction . Action > ( )
2023-05-19 22:21:02 +00:00
{
new BeatAction . Action ( beat + length , delegate { Miss ( null ) ; } )
} ) ;
}
}
void SetPassBallEvents ( )
{
passBallDict . Clear ( ) ;
var passBallEvents = EventCaller . GetAllInGameManagerList ( "tossBoys" , new string [ ] { "pass" , "dual" , "pop" , "high" , "lightning" , "blur" } ) ;
for ( int i = 0 ; i < passBallEvents . Count ; i + + )
{
2023-06-10 19:13:29 +00:00
if ( passBallEvents [ i ] . beat > = Conductor . instance . songPositionInBeatsAsDouble )
2023-05-19 22:21:02 +00:00
{
if ( passBallDict . ContainsKey ( passBallEvents [ i ] . beat ) ) continue ;
passBallDict . Add ( passBallEvents [ i ] . beat , passBallEvents [ i ] ) ;
}
}
}
2023-06-10 19:13:29 +00:00
void DeterminePass ( double beat , bool barely )
2023-05-19 22:21:02 +00:00
{
var tempLastReceiver = lastReceiver ;
lastReceiver = currentReceiver ;
if ( passBallDict . TryGetValue ( beat , out var receiver ) )
{
currentReceiver = ( WhichTossKid ) receiver [ "who" ] ;
currentPassType = receiver . datamodel ;
2023-05-20 14:04:37 +00:00
currentEventLength = receiver . length ;
2023-05-19 22:21:02 +00:00
}
else
{
/ *
2023-06-10 19:13:29 +00:00
RiqEntity spawnedEntity = new RiqEntity ( ) ;
2023-05-19 22:21:02 +00:00
spawnedEntity . DynamicData . Add ( "who" , ( int ) tempLastReceiver ) ;
spawnedEntity . datamodel = currentPassType ;
passBallDict . Add ( beat , spawnedEntity ) ;
* /
currentReceiver = tempLastReceiver ;
}
switch ( currentPassType )
{
case "tossBoys/pass" :
2023-05-20 14:04:37 +00:00
PassBall ( beat , currentEventLength ) ;
2023-05-19 22:21:02 +00:00
break ;
case "tossBoys/dual" :
2023-05-20 14:04:37 +00:00
DualToss ( beat , currentEventLength ) ;
2023-05-19 22:21:02 +00:00
break ;
case "tossBoys/high" :
2023-05-20 14:04:37 +00:00
HighToss ( beat , currentEventLength ) ;
2023-05-19 22:21:02 +00:00
break ;
case "tossBoys/lightning" :
2023-05-20 14:04:37 +00:00
LightningToss ( beat , currentEventLength ) ;
2023-05-19 22:21:02 +00:00
break ;
default :
break ;
}
if ( barely )
{
currentBall . anim . DoScaledAnimationAsync ( "WiggleBall" , 0.5f ) ;
}
else
{
currentBall . anim . DoScaledAnimationAsync ( "Hit" , 0.5f ) ;
}
2023-05-20 14:04:37 +00:00
if ( passBallDict . ContainsKey ( beat + currentEventLength ) & & passBallDict [ beat + currentEventLength ] . datamodel = = "tossBoys/pop" )
2023-05-19 22:21:02 +00:00
{
2023-09-11 22:28:04 +00:00
BeatAction . New ( instance , new List < BeatAction . Action > ( )
2023-05-19 22:21:02 +00:00
{
2023-05-20 14:04:37 +00:00
new BeatAction . Action ( beat + currentEventLength - 1 , delegate { GetCurrentReceiver ( ) . PopBallPrepare ( ) ; } )
2023-05-19 22:21:02 +00:00
} ) ;
}
}
2023-06-10 19:13:29 +00:00
void PassBall ( double beat , float length )
2023-05-19 22:21:02 +00:00
{
string last = GetColorBasedOnTossKid ( lastReceiver , false ) ;
string current = GetColorBasedOnTossKid ( currentReceiver , true ) ;
float secondBeat = 1f ;
float secondOffset = 0 ;
float thirdOffset = 0 ;
if ( currentBall ! = null )
{
switch ( last + current )
{
case "redBlue" :
2023-05-20 14:04:37 +00:00
currentBall . SetState ( TossBoysBall . State . RedBlue , beat , length ) ;
2023-05-19 22:21:02 +00:00
break ;
case "blueRed" :
secondBeat = 0.5f ;
2023-05-20 14:04:37 +00:00
currentBall . SetState ( TossBoysBall . State . BlueRed , beat , length ) ;
2023-05-19 22:21:02 +00:00
break ;
case "blueYellow" :
2023-05-20 14:04:37 +00:00
currentBall . SetState ( TossBoysBall . State . BlueYellow , beat , length ) ;
2023-05-19 22:21:02 +00:00
break ;
case "yellowRed" :
secondBeat = 0.5f ;
2023-05-20 14:04:37 +00:00
currentBall . SetState ( TossBoysBall . State . YellowRed , beat , length ) ;
2023-05-19 22:21:02 +00:00
break ;
case "redYellow" :
secondBeat = 0.5f ;
thirdOffset = 0.060f ;
2023-05-20 14:04:37 +00:00
currentBall . SetState ( TossBoysBall . State . RedYellow , beat , length ) ;
2023-05-19 22:21:02 +00:00
break ;
case "yellowBlue" :
2023-05-20 14:04:37 +00:00
currentBall . SetState ( TossBoysBall . State . YellowBlue , beat , length ) ;
2023-05-19 22:21:02 +00:00
break ;
default :
break ;
}
}
List < MultiSound . Sound > soundsToPlay = new List < MultiSound . Sound > ( )
{
new MultiSound . Sound ( "tossBoys/" + last + current + 1 , beat ) ,
new MultiSound . Sound ( "tossBoys/" + last + current + 2 , beat + secondBeat , 1 , 1 , false , secondOffset ) ,
} ;
2023-05-20 14:04:37 +00:00
if ( passBallDict . ContainsKey ( beat + length ) & & ( passBallDict [ beat + length ] . datamodel is "tossBoys/dual" or "tossBoys/lightning" or "tossBoys/blur" ) )
2023-05-19 22:21:02 +00:00
{
2023-09-11 22:28:04 +00:00
BeatAction . New ( instance , new List < BeatAction . Action > ( )
2023-05-19 22:21:02 +00:00
{
2023-05-20 14:04:37 +00:00
new BeatAction . Action ( beat + length - 1 , delegate { DoSpecialBasedOnReceiver ( beat + length - 1 ) ; } )
2023-05-19 22:21:02 +00:00
} ) ;
}
if ( secondBeat = = 0.5f ) soundsToPlay . Add ( new MultiSound . Sound ( "tossBoys/" + last + current + 3 , beat + 1 , 1 , 1 , false , thirdOffset ) ) ;
MultiSound . Play ( soundsToPlay . ToArray ( ) ) ;
2023-05-20 14:04:37 +00:00
ScheduleInput ( beat , length , GetInputTypeBasedOnCurrentReceiver ( ) , JustHitBall , Miss , Empty ) ;
2023-05-19 22:21:02 +00:00
}
2023-06-10 19:13:29 +00:00
void DualToss ( double beat , float length )
2023-05-19 22:21:02 +00:00
{
string last = GetColorBasedOnTossKid ( lastReceiver , false ) ;
string current = GetColorBasedOnTossKid ( currentReceiver , true ) ;
float secondBeat = 0.5f ;
float secondOffset = 0 ;
float thirdOffset = 0 ;
if ( currentBall ! = null )
{
switch ( last + current )
{
case "redBlue" :
2023-05-20 14:04:37 +00:00
currentBall . SetState ( TossBoysBall . State . RedBlueDual , beat , length ) ;
2023-05-19 22:21:02 +00:00
break ;
case "blueYellow" :
2023-05-20 14:04:37 +00:00
currentBall . SetState ( TossBoysBall . State . BlueYellowDual , beat , length ) ;
2023-05-19 22:21:02 +00:00
break ;
case "yellowBlue" :
2023-05-20 14:04:37 +00:00
currentBall . SetState ( TossBoysBall . State . YellowBlueDual , beat , length ) ;
2023-05-19 22:21:02 +00:00
break ;
case "blueRed" :
secondBeat = 0.25f ;
thirdOffset = 0.020f ;
2023-05-20 14:04:37 +00:00
currentBall . SetState ( TossBoysBall . State . BlueRedDual , beat , length ) ;
2023-05-19 22:21:02 +00:00
break ;
case "yellowRed" :
secondBeat = 0.25f ;
2023-05-20 14:04:37 +00:00
currentBall . SetState ( TossBoysBall . State . YellowRedDual , beat , length ) ;
2023-05-19 22:21:02 +00:00
break ;
case "redYellow" :
secondOffset = 0.060f ;
2023-05-20 14:04:37 +00:00
currentBall . SetState ( TossBoysBall . State . RedYellowDual , beat , length ) ;
2023-05-19 22:21:02 +00:00
break ;
default :
break ;
}
}
List < MultiSound . Sound > soundsToPlay = new List < MultiSound . Sound > ( )
{
new MultiSound . Sound ( "tossBoys/" + last + current + "Low" + 1 , beat ) ,
new MultiSound . Sound ( "tossBoys/" + last + current + "Low" + 2 , beat + secondBeat , 1 , 1 , false , secondOffset ) ,
} ;
2023-05-20 14:04:37 +00:00
if ( passBallDict . ContainsKey ( beat + length ) & & ( passBallDict [ beat + length ] . datamodel is "tossBoys/lightning" or "tossBoys/blur" ) )
2023-05-19 22:21:02 +00:00
{
2023-09-11 22:28:04 +00:00
BeatAction . New ( instance , new List < BeatAction . Action > ( )
2023-05-19 22:21:02 +00:00
{
2023-05-20 14:04:37 +00:00
new BeatAction . Action ( beat + length - 1 , delegate { DoSpecialBasedOnReceiver ( beat + length - 1 ) ; } )
2023-05-19 22:21:02 +00:00
} ) ;
}
if ( secondBeat = = 0.25f ) soundsToPlay . Add ( new MultiSound . Sound ( "tossBoys/" + last + current + "Low" + 3 , beat + 0.5f , 1 , 1 , false , thirdOffset ) ) ;
MultiSound . Play ( soundsToPlay . ToArray ( ) ) ;
2023-05-20 14:04:37 +00:00
bool stopSpecial = passBallDict . ContainsKey ( beat + length ) & & passBallDict [ beat + length ] . datamodel is "tossBoys/pass" or "tossBoys/high" or "tossBoys/pop" ;
ScheduleInput ( beat , length , GetInputTypeBasedOnCurrentReceiver ( ) , stopSpecial ? JustHitBallUnSpecial : JustHitBall , Miss , Empty ) ;
2023-05-19 22:21:02 +00:00
}
2023-06-10 19:13:29 +00:00
void HighToss ( double beat , float length )
2023-05-19 22:21:02 +00:00
{
string last = GetColorBasedOnTossKid ( lastReceiver , false ) ;
string current = GetColorBasedOnTossKid ( currentReceiver , true ) ;
float secondBeat = 0.5f ;
float secondOffset = 0 ;
float thirdOffset = 0 ;
if ( currentBall ! = null )
{
switch ( last + current )
{
case "redBlue" :
2023-05-20 14:04:37 +00:00
currentBall . SetState ( TossBoysBall . State . RedBlueHigh , beat , length ) ;
2023-05-19 22:21:02 +00:00
break ;
case "redYellow" :
2023-05-20 14:04:37 +00:00
currentBall . SetState ( TossBoysBall . State . RedYellowHigh , beat , length ) ;
2023-05-19 22:21:02 +00:00
break ;
case "blueYellow" :
2023-05-20 14:04:37 +00:00
currentBall . SetState ( TossBoysBall . State . BlueYellowHigh , beat , length ) ;
2023-05-19 22:21:02 +00:00
break ;
case "yellowBlue" :
2023-05-20 14:04:37 +00:00
currentBall . SetState ( TossBoysBall . State . YellowBlueHigh , beat , length ) ;
2023-05-19 22:21:02 +00:00
break ;
case "yellowRed" :
secondBeat = 0.25f ;
2023-05-20 14:04:37 +00:00
currentBall . SetState ( TossBoysBall . State . YellowRedHigh , beat , length ) ;
2023-05-19 22:21:02 +00:00
break ;
case "blueRed" :
secondBeat = 0.25f ;
2023-05-20 14:04:37 +00:00
currentBall . SetState ( TossBoysBall . State . BlueRedHigh , beat , length ) ;
2023-05-19 22:21:02 +00:00
break ;
default :
break ;
}
}
List < MultiSound . Sound > soundsToPlay = new List < MultiSound . Sound > ( )
{
new MultiSound . Sound ( "tossBoys/" + last + current + "High" + 1 , beat ) ,
new MultiSound . Sound ( "tossBoys/" + last + current + "High" + 2 , beat + secondBeat , 1 , 1 , false , secondOffset ) ,
} ;
2023-05-20 14:04:37 +00:00
if ( passBallDict . ContainsKey ( beat + length ) & & ( passBallDict [ beat + length ] . datamodel is "tossBoys/dual" or "tossBoys/lightning" or "tossBoys/blur" ) )
2023-05-19 22:21:02 +00:00
{
2023-09-11 22:28:04 +00:00
BeatAction . New ( instance , new List < BeatAction . Action > ( )
2023-05-19 22:21:02 +00:00
{
2023-05-20 14:04:37 +00:00
new BeatAction . Action ( beat + length - 1 , delegate { DoSpecialBasedOnReceiver ( beat + length - 1 ) ; } )
2023-05-19 22:21:02 +00:00
} ) ;
}
if ( secondBeat = = 0.25f ) soundsToPlay . Add ( new MultiSound . Sound ( "tossBoys/" + last + current + "High" + 3 , beat + 0.5f , 1 , 1 , false , thirdOffset ) ) ;
MultiSound . Play ( soundsToPlay . ToArray ( ) ) ;
2023-05-20 14:04:37 +00:00
ScheduleInput ( beat , length , GetInputTypeBasedOnCurrentReceiver ( ) , JustHitBall , Miss , Empty ) ;
2023-05-19 22:21:02 +00:00
}
2023-06-10 19:13:29 +00:00
void LightningToss ( double beat , float length )
2023-05-19 22:21:02 +00:00
{
string last = GetColorBasedOnTossKid ( lastReceiver , false ) ;
string current = GetColorBasedOnTossKid ( currentReceiver , true ) ;
float secondBeat = 0.5f ;
float secondOffset = 0 ;
float thirdOffset = 0 ;
switch ( last + current )
{
case "blueRed" :
secondBeat = 0.25f ;
thirdOffset = 0.020f ;
break ;
case "yellowRed" :
secondBeat = 0.25f ;
break ;
case "redYellow" :
secondOffset = 0.060f ;
break ;
default :
secondBeat = 0.5f ;
break ;
}
if ( currentBall ! = null )
{
switch ( last )
{
case "blue" :
2023-05-20 14:04:37 +00:00
currentBall . SetState ( TossBoysBall . State . BlueKeep , beat , length / 2 ) ;
2023-05-19 22:21:02 +00:00
break ;
case "red" :
2023-05-20 14:04:37 +00:00
currentBall . SetState ( TossBoysBall . State . RedKeep , beat , length / 2 ) ;
2023-05-19 22:21:02 +00:00
break ;
case "yellow" :
2023-05-20 14:04:37 +00:00
currentBall . SetState ( TossBoysBall . State . YellowKeep , beat , length / 2 ) ;
2023-05-19 22:21:02 +00:00
break ;
}
}
List < MultiSound . Sound > soundsToPlay = new List < MultiSound . Sound > ( )
{
new MultiSound . Sound ( "tossBoys/" + last + current + "Low" + 1 , beat ) ,
new MultiSound . Sound ( "tossBoys/" + last + current + "Low" + 2 , beat + secondBeat , 1 , 1 , false , secondOffset ) ,
} ;
if ( secondBeat = = 0.25f ) soundsToPlay . Add ( new MultiSound . Sound ( "tossBoys/" + last + current + "Low" + 3 , beat + 0.5f , 1 , 1 , false , thirdOffset ) ) ;
2023-05-20 14:04:37 +00:00
if ( passBallDict . ContainsKey ( beat + length ) & & ( passBallDict [ beat + length ] . datamodel is "tossBoys/dual" or "tossBoys/blur" ) )
2023-05-19 22:21:02 +00:00
{
2023-09-11 22:28:04 +00:00
BeatAction . New ( instance , new List < BeatAction . Action > ( )
2023-05-19 22:21:02 +00:00
{
2023-05-20 14:04:37 +00:00
new BeatAction . Action ( beat + length - 1 , delegate { DoSpecialBasedOnReceiver ( beat + length - 1 ) ; } )
2023-05-19 22:21:02 +00:00
} ) ;
}
MultiSound . Play ( soundsToPlay . ToArray ( ) ) ;
2023-05-20 14:04:37 +00:00
bool stopSpecial = passBallDict . ContainsKey ( beat + length ) & & passBallDict [ beat + length ] . datamodel is "tossBoys/pass" or "tossBoys/high" or "tossBoys/pop" ;
ScheduleInput ( beat , length / 2 , GetInputBasedOnTossKid ( lastReceiver ) , stopSpecial ? JustKeepUnSpecial : JustKeep , Miss , Empty ) ;
ScheduleInput ( beat , length , GetInputTypeBasedOnCurrentReceiver ( ) , JustHitBall , Miss , Empty ) ;
2023-05-19 22:21:02 +00:00
}
2023-06-10 19:13:29 +00:00
void BlurToss ( double beat )
2023-05-19 22:21:02 +00:00
{
string current = GetColorBasedOnTossKid ( currentReceiver , false ) ;
if ( currentBall ! = null )
{
switch ( current )
{
case "blue" :
currentBall . SetState ( TossBoysBall . State . BlueBlur , beat ) ;
break ;
case "red" :
currentBall . SetState ( TossBoysBall . State . RedBlur , beat ) ;
break ;
case "yellow" :
currentBall . SetState ( TossBoysBall . State . YellowBlur , beat ) ;
break ;
}
}
ScheduleInput ( beat , 2f , GetInputTypeBasedOnCurrentReceiver ( ) , JustKeepContinue , Miss , Empty ) ;
}
#region Inputs
void JustHitBall ( PlayerActionEvent caller , float state )
{
if ( currentBall = = null ) return ;
if ( passBallDict . ContainsKey ( caller . startBeat + caller . timer ) )
{
if ( passBallDict [ caller . startBeat + caller . timer ] . datamodel = = "tossBoys/pop" )
{
GetCurrentReceiver ( ) . PopBall ( ) ;
Destroy ( currentBall . gameObject ) ;
currentBall = null ;
switch ( currentReceiver )
{
case WhichTossKid . Akachan :
2023-06-10 19:13:29 +00:00
SoundByte . PlayOneShotGame ( "tossBoys/redPop" ) ;
2023-05-19 22:21:02 +00:00
break ;
case WhichTossKid . Aokun :
2023-06-10 19:13:29 +00:00
SoundByte . PlayOneShotGame ( "tossBoys/bluePop" ) ;
2023-05-19 22:21:02 +00:00
break ;
case WhichTossKid . Kiiyan :
2023-06-10 19:13:29 +00:00
SoundByte . PlayOneShotGame ( "tossBoys/yellowPop" ) ;
2023-05-19 22:21:02 +00:00
break ;
default :
break ;
}
return ;
}
if ( passBallDict [ caller . startBeat + caller . timer ] . datamodel = = "tossBoys/blur" )
{
JustKeepCurrent ( caller , state ) ;
BlurToss ( caller . startBeat + caller . timer ) ;
return ;
}
if ( ( WhichTossKid ) passBallDict [ caller . startBeat + caller . timer ] [ "who" ] = = currentReceiver )
{
Miss ( null ) ;
return ;
}
}
if ( state > = 1f | | state < = - 1f )
{
GetCurrentReceiver ( ) . Barely ( ) ;
DeterminePass ( caller . timer + caller . startBeat , true ) ;
return ;
}
GetCurrentReceiver ( ) . HitBall ( ) ;
DeterminePass ( caller . timer + caller . startBeat , false ) ;
}
void JustHitBallUnSpecial ( PlayerActionEvent caller , float state )
{
if ( currentBall = = null ) return ;
specialAo . SetActive ( false ) ;
specialAka . SetActive ( false ) ;
specialKii . SetActive ( false ) ;
currentSpecialKid . crouch = false ;
if ( passBallDict . ContainsKey ( caller . startBeat + caller . timer ) )
{
if ( passBallDict [ caller . startBeat + caller . timer ] . datamodel = = "tossBoys/pop" )
{
GetCurrentReceiver ( ) . PopBall ( ) ;
Destroy ( currentBall . gameObject ) ;
currentBall = null ;
switch ( currentReceiver )
{
case WhichTossKid . Akachan :
2023-06-10 19:13:29 +00:00
SoundByte . PlayOneShotGame ( "tossBoys/redPop" ) ;
2023-05-19 22:21:02 +00:00
break ;
case WhichTossKid . Aokun :
2023-06-10 19:13:29 +00:00
SoundByte . PlayOneShotGame ( "tossBoys/bluePop" ) ;
2023-05-19 22:21:02 +00:00
break ;
case WhichTossKid . Kiiyan :
2023-06-10 19:13:29 +00:00
SoundByte . PlayOneShotGame ( "tossBoys/yellowPop" ) ;
2023-05-19 22:21:02 +00:00
break ;
default :
break ;
}
return ;
}
if ( passBallDict [ caller . startBeat + caller . timer ] . datamodel = = "tossBoys/blur" )
{
JustKeepCurrentUnSpecial ( caller , state ) ;
BlurToss ( caller . startBeat + caller . timer ) ;
return ;
}
if ( ( WhichTossKid ) passBallDict [ caller . startBeat + caller . timer ] [ "who" ] = = currentReceiver )
{
Miss ( null ) ;
return ;
}
}
if ( state > = 1f | | state < = - 1f )
{
GetCurrentReceiver ( ) . Barely ( ) ;
DeterminePass ( caller . timer + caller . startBeat , true ) ;
return ;
}
GetCurrentReceiver ( ) . HitBall ( ) ;
DeterminePass ( caller . timer + caller . startBeat , false ) ;
}
void JustKeepContinue ( PlayerActionEvent caller , float state )
{
if ( currentBall = = null ) return ;
if ( passBallDict . ContainsKey ( caller . timer + caller . startBeat ) )
{
if ( passBallDict [ caller . timer + caller . startBeat ] . datamodel is "tossBoys/pass" or "tossBoys/high" or "tossBoys/pop" )
{
JustHitBallUnSpecial ( caller , state ) ;
}
else
{
JustHitBall ( caller , state ) ;
}
}
else
{
JustKeepCurrent ( caller , state ) ;
ScheduleInput ( caller . timer + caller . startBeat , 1f , GetInputTypeBasedOnCurrentReceiver ( ) , JustKeepContinue , Miss , Empty ) ;
}
}
void JustKeepCurrent ( PlayerActionEvent caller , float state )
{
if ( currentBall = = null ) return ;
2023-06-10 19:13:29 +00:00
SoundByte . PlayOneShotGame ( "tossBoys/" + GetColorBasedOnTossKid ( currentReceiver , false ) + "Keep" ) ;
2023-05-19 22:21:02 +00:00
string current = GetColorBasedOnTossKid ( currentReceiver , false ) ;
2023-06-10 19:13:29 +00:00
double beat = caller . timer + caller . startBeat ;
2023-05-19 22:21:02 +00:00
if ( currentBall ! = null )
{
switch ( current )
{
case "blue" :
currentBall . SetState ( TossBoysBall . State . BlueKeep , beat ) ;
break ;
case "red" :
currentBall . SetState ( TossBoysBall . State . RedKeep , beat ) ;
break ;
case "yellow" :
currentBall . SetState ( TossBoysBall . State . YellowKeep , beat ) ;
break ;
}
}
if ( state > = 1f | | state < = - 1f )
{
currentBall . anim . DoScaledAnimationAsync ( "WiggleBall" , 0.5f ) ;
GetCurrentReceiver ( ) . Barely ( ) ;
return ;
}
GetCurrentReceiver ( ) . HitBall ( ) ;
currentBall . anim . DoScaledAnimationAsync ( "Hit" , 0.5f ) ;
}
void JustKeepCurrentUnSpecial ( PlayerActionEvent caller , float state )
{
if ( currentBall = = null ) return ;
specialAo . SetActive ( false ) ;
specialAka . SetActive ( false ) ;
specialKii . SetActive ( false ) ;
currentSpecialKid . crouch = false ;
2023-06-10 19:13:29 +00:00
SoundByte . PlayOneShotGame ( "tossBoys/" + GetColorBasedOnTossKid ( currentReceiver , false ) + "Keep" ) ;
2023-05-19 22:21:02 +00:00
if ( state > = 1f | | state < = - 1f )
{
currentBall . anim . DoScaledAnimationAsync ( "WiggleBall" , 0.5f ) ;
GetCurrentReceiver ( ) . Barely ( ) ;
return ;
}
GetCurrentReceiver ( ) . HitBall ( ) ;
currentBall . anim . DoScaledAnimationAsync ( "Hit" , 0.5f ) ;
}
void JustKeep ( PlayerActionEvent caller , float state )
{
if ( currentBall = = null ) return ;
2023-06-10 19:13:29 +00:00
SoundByte . PlayOneShotGame ( "tossBoys/" + GetColorBasedOnTossKid ( lastReceiver , false ) + "Keep" ) ;
2023-05-19 22:21:02 +00:00
string last = GetColorBasedOnTossKid ( lastReceiver , false ) ;
string current = GetColorBasedOnTossKid ( currentReceiver , true ) ;
2023-06-10 19:13:29 +00:00
double beat = caller . timer + caller . startBeat ;
2023-05-19 22:21:02 +00:00
if ( currentBall ! = null )
{
switch ( last + current )
{
case "redBlue" :
2023-05-28 18:48:41 +00:00
currentBall . SetState ( TossBoysBall . State . RedBlueDual , beat , currentEventLength / 2 ) ;
2023-05-19 22:21:02 +00:00
break ;
case "blueYellow" :
2023-05-28 18:48:41 +00:00
currentBall . SetState ( TossBoysBall . State . BlueYellowDual , beat , currentEventLength / 2 ) ;
2023-05-19 22:21:02 +00:00
break ;
case "yellowBlue" :
2023-05-28 18:48:41 +00:00
currentBall . SetState ( TossBoysBall . State . YellowBlueDual , beat , currentEventLength / 2 ) ;
2023-05-19 22:21:02 +00:00
break ;
case "blueRed" :
2023-05-28 18:48:41 +00:00
currentBall . SetState ( TossBoysBall . State . BlueRedDual , beat , currentEventLength / 2 ) ;
2023-05-19 22:21:02 +00:00
break ;
case "yellowRed" :
2023-05-28 18:48:41 +00:00
currentBall . SetState ( TossBoysBall . State . YellowRedDual , beat , currentEventLength / 2 ) ;
2023-05-19 22:21:02 +00:00
break ;
case "redYellow" :
2023-05-28 18:48:41 +00:00
currentBall . SetState ( TossBoysBall . State . RedYellowDual , beat , currentEventLength / 2 ) ;
2023-05-19 22:21:02 +00:00
break ;
default :
break ;
}
}
if ( state > = 1f | | state < = - 1f )
{
currentBall . anim . DoScaledAnimationAsync ( "WiggleBall" , 0.5f ) ;
GetReceiver ( lastReceiver ) . Barely ( ) ;
return ;
}
GetReceiver ( lastReceiver ) . HitBall ( ) ;
currentBall . anim . DoScaledAnimationAsync ( "Hit" , 0.5f ) ;
}
void JustKeepUnSpecial ( PlayerActionEvent caller , float state )
{
if ( currentBall = = null ) return ;
specialAo . SetActive ( false ) ;
specialAka . SetActive ( false ) ;
specialKii . SetActive ( false ) ;
currentSpecialKid . crouch = false ;
2023-06-10 19:13:29 +00:00
SoundByte . PlayOneShotGame ( "tossBoys/" + GetColorBasedOnTossKid ( lastReceiver , false ) + "Keep" ) ;
2023-05-19 22:21:02 +00:00
string last = GetColorBasedOnTossKid ( lastReceiver , false ) ;
string current = GetColorBasedOnTossKid ( currentReceiver , true ) ;
2023-06-10 19:13:29 +00:00
double beat = caller . timer + caller . startBeat ;
2023-05-19 22:21:02 +00:00
if ( currentBall ! = null )
{
switch ( last + current )
{
case "redBlue" :
currentBall . SetState ( TossBoysBall . State . RedBlueDual , beat ) ;
break ;
case "blueYellow" :
currentBall . SetState ( TossBoysBall . State . BlueYellowDual , beat ) ;
break ;
case "yellowBlue" :
currentBall . SetState ( TossBoysBall . State . YellowBlueDual , beat ) ;
break ;
case "blueRed" :
currentBall . SetState ( TossBoysBall . State . BlueRedDual , beat ) ;
break ;
case "yellowRed" :
currentBall . SetState ( TossBoysBall . State . YellowRedDual , beat ) ;
break ;
case "redYellow" :
currentBall . SetState ( TossBoysBall . State . RedYellowDual , beat ) ;
break ;
default :
break ;
}
}
if ( state > = 1f | | state < = - 1f )
{
currentBall . anim . DoScaledAnimationAsync ( "WiggleBall" , 0.5f ) ;
GetReceiver ( lastReceiver ) . Barely ( ) ;
return ;
}
GetReceiver ( lastReceiver ) . HitBall ( ) ;
currentBall . anim . DoScaledAnimationAsync ( "Hit" , 0.5f ) ;
}
void Miss ( PlayerActionEvent caller )
{
if ( currentBall = = null ) return ;
GetCurrentReceiver ( ) . Miss ( ) ;
aokun . crouch = false ;
akachan . crouch = false ;
kiiyan . crouch = false ;
specialAo . SetActive ( false ) ;
specialAka . SetActive ( false ) ;
specialKii . SetActive ( false ) ;
Destroy ( currentBall . gameObject ) ;
currentBall = null ;
2023-06-10 19:13:29 +00:00
SoundByte . PlayOneShotGame ( "tossBoys/misshit" ) ;
2023-05-19 22:21:02 +00:00
}
void Empty ( PlayerActionEvent caller ) { }
#endregion
#region HelperFunctions
2023-06-10 19:13:29 +00:00
void DoSpecialBasedOnReceiver ( double beat )
2023-05-19 22:21:02 +00:00
{
specialAo . SetActive ( false ) ;
specialAka . SetActive ( false ) ;
specialKii . SetActive ( false ) ;
if ( currentSpecialKid ! = null ) currentSpecialKid . crouch = false ;
currentSpecialKid = GetCurrentReceiver ( ) ;
GetCurrentReceiver ( ) . Crouch ( ) ;
GetSpecialBasedOnReceiver ( ) . SetActive ( true ) ;
switch ( currentReceiver )
{
case WhichTossKid . Akachan :
MultiSound . Play ( new MultiSound . Sound [ ]
{
new MultiSound . Sound ( "tossBoys/redSpecial1" , beat ) ,
new MultiSound . Sound ( "tossBoys/redSpecial2" , beat + 0.25f ) ,
new MultiSound . Sound ( "tossBoys/redSpecialCharge" , beat + 0.25f , 1 , 1 , false , 0.085f ) ,
} ) ;
break ;
case WhichTossKid . Aokun :
MultiSound . Play ( new MultiSound . Sound [ ]
{
new MultiSound . Sound ( "tossBoys/blueSpecial1" , beat ) ,
new MultiSound . Sound ( "tossBoys/blueSpecial2" , beat + 0.25f ) ,
} ) ;
break ;
case WhichTossKid . Kiiyan :
2023-06-10 19:13:29 +00:00
SoundByte . PlayOneShotGame ( "tossBoys/yellowSpecial" , beat ) ;
2023-05-19 22:21:02 +00:00
break ;
default :
break ;
}
}
public TossKid GetCurrentReceiver ( )
{
return GetReceiver ( currentReceiver ) ;
}
public TossKid GetReceiver ( WhichTossKid receiver )
{
switch ( receiver )
{
case WhichTossKid . Akachan :
return akachan ;
case WhichTossKid . Aokun :
return aokun ;
case WhichTossKid . Kiiyan :
return kiiyan ;
default :
return null ;
}
}
string GetColorBasedOnTossKid ( WhichTossKid tossKid , bool capital )
{
switch ( tossKid )
{
case WhichTossKid . Akachan :
return capital ? "Red" : "red" ;
case WhichTossKid . Aokun :
return capital ? "Blue" : "blue" ;
case WhichTossKid . Kiiyan :
return capital ? "Yellow" : "yellow" ;
default :
return "" ;
}
}
public void SetReceiver ( int who )
{
currentReceiver = ( WhichTossKid ) who ;
}
InputType GetInputTypeBasedOnCurrentReceiver ( )
{
return GetInputBasedOnTossKid ( currentReceiver ) ;
}
InputType GetInputBasedOnTossKid ( WhichTossKid tossKid )
{
switch ( tossKid )
{
case WhichTossKid . Akachan :
return InputType . STANDARD_DOWN ;
case WhichTossKid . Aokun :
return InputType . STANDARD_ALT_DOWN ;
case WhichTossKid . Kiiyan :
return InputType . DIRECTION_DOWN ;
default :
return InputType . ANY ;
}
}
GameObject GetSpecialBasedOnReceiver ( )
{
switch ( currentReceiver )
{
case WhichTossKid . Akachan :
return specialAka ;
case WhichTossKid . Aokun :
return specialAo ;
case WhichTossKid . Kiiyan :
return specialKii ;
default :
return null ;
}
}
#endregion
}
}