2022-04-10 21:37:37 +00:00
using NaughtyBezierCurves ;
2022-06-22 22:42:22 +00:00
using System ;
2022-04-04 14:48:37 +00:00
using System.Collections ;
using System.Collections.Generic ;
using UnityEngine ;
2022-04-10 21:37:37 +00:00
using HeavenStudio.Util ;
2022-04-13 14:14:13 +00:00
namespace HeavenStudio.Games.Loaders
{
using static Minigames ;
public static class MobTrickLoader
{
2024-01-13 02:40:35 +00:00
public static Minigame AddGame ( EventCaller eventCaller )
{
2023-03-12 22:20:28 +00:00
return new Minigame ( "trickClass" , "Trick on the Class" , "ecede4" , false , false , new List < GameAction > ( )
2022-04-13 14:14:13 +00:00
{
2024-01-15 02:04:10 +00:00
new GameAction ( "bop" , "Bop" )
{
function = delegate { var e = eventCaller . currentEntity ; TrickClass . instance . Bop ( e . beat , e . length , e [ "bop" ] , e [ "autoBop" ] ) ; } ,
resizable = true ,
parameters = new List < Param > ( )
{
new Param ( "bop" , true , "Bop" , "Toggle if the girl and boy should bop for the duration of this event." ) ,
new Param ( "autoBop" , false , "Bop (Auto)" , "Toggle if the girl and boy should automatically bop until another Bop event is reached." )
}
} ,
2024-01-13 02:40:35 +00:00
new GameAction ( "toss" , "Toss Object" )
2022-04-13 14:14:13 +00:00
{
2023-02-14 16:31:51 +00:00
preFunction = delegate
2022-08-20 23:03:51 +00:00
{
2024-01-25 17:29:05 +00:00
EventCaller ec = eventCaller ;
var e = ec . currentEntity ;
TrickClass . PreTossObject ( ec . gameManager , e . beat , ( int ) e [ "obj" ] , e [ "nx" ] ) ;
2024-01-13 02:40:35 +00:00
} ,
2023-02-14 16:31:51 +00:00
defaultLength = 2 ,
2024-01-13 02:40:35 +00:00
parameters = new List < Param > ( )
{
2024-01-15 02:04:10 +00:00
new Param ( "obj" , TrickClass . TrickObjTypeEditor . PaperBall , "Object" , "Choose the object that the girl should throw." , new List < Param . CollapseParam > ( )
2024-01-13 02:40:35 +00:00
{
new Param . CollapseParam ( ( x , _ ) = > ( int ) x = = ( int ) TrickClass . TrickObjTypeEditor . Phone , new string [ ] { "nx" } ) ,
} ) ,
2024-01-15 02:04:10 +00:00
new Param ( "nx" , false , "Switch" , "Toggle if the phone should be replaced with a Nintendo Switch." ) ,
2024-01-13 02:40:35 +00:00
}
2023-02-14 16:31:51 +00:00
} ,
new GameAction ( "plane" , "Plane" )
{
preFunction = delegate
2022-08-20 23:03:51 +00:00
{
2024-01-25 17:29:05 +00:00
EventCaller ec = eventCaller ;
var e = ec . currentEntity ;
TrickClass . PreTossObject ( ec . gameManager , e . beat , ( int ) TrickClass . TrickObjType . Plane ) ;
2023-02-14 16:31:51 +00:00
} ,
defaultLength = 3 ,
2022-08-20 23:03:51 +00:00
} ,
2024-01-13 02:40:35 +00:00
new GameAction ( "blast" , "Optic Blast" )
{
preFunction = delegate
{
TrickClass . PreBlast ( eventCaller . currentEntity . beat ) ;
} ,
defaultLength = 4 ,
} ,
new GameAction ( "chair" , "Chair" )
{
preFunction = delegate
{
2024-01-25 17:29:05 +00:00
EventCaller ec = eventCaller ;
var e = ec . currentEntity ;
TrickClass . PreTossObject ( ec . gameManager , e . beat , ( int ) TrickClass . TrickObjType . Chair ) ;
2024-01-13 02:40:35 +00:00
} ,
defaultLength = 2 ,
hidden = true ,
} ,
new GameAction ( "phone" , "Phone" )
{
preFunction = delegate
{
2024-01-25 17:29:05 +00:00
EventCaller ec = eventCaller ;
var e = ec . currentEntity ;
TrickClass . PreTossObject ( ec . gameManager , e . beat , ( int ) TrickClass . TrickObjType . Phone , eventCaller . currentEntity [ "nx" ] ) ;
2024-01-13 02:40:35 +00:00
} ,
defaultLength = 2 ,
hidden = true ,
parameters = new List < Param > ( )
{
new Param ( "nx" , false , "Switch" , "Replace the phone with a Switch" ) ,
}
} ,
new GameAction ( "shock" , "Lightning Bolt" )
{
preFunction = delegate
{
2024-01-25 17:29:05 +00:00
EventCaller ec = eventCaller ;
var e = ec . currentEntity ;
TrickClass . PreTossObject ( ec . gameManager , e . beat , ( int ) TrickClass . TrickObjType . Shock ) ;
2024-01-13 02:40:35 +00:00
} ,
defaultLength = 2 ,
hidden = true ,
} ,
2023-05-28 17:34:44 +00:00
} ,
2024-01-13 02:40:35 +00:00
new List < string > ( ) { "mob" , "normal" } ,
2023-05-28 17:34:44 +00:00
"mobtrick" , "en" ,
2024-03-29 02:35:07 +00:00
new List < string > ( ) { } ,
chronologicalSortKey : 20170124 // source: this sketchy site https://rhythm-heaven-fever.appstor.io/ it was the only mention of it online that had a date attached
2023-05-28 17:34:44 +00:00
) ;
2022-04-13 14:14:13 +00:00
}
}
}
2022-04-04 14:48:37 +00:00
namespace HeavenStudio.Games
{
/ * *
mob_Trick
* * /
2022-04-10 21:37:37 +00:00
using Scripts_TrickClass ;
2022-06-20 02:29:21 +00:00
public class TrickClass : Minigame
2022-04-04 14:48:37 +00:00
{
2024-01-13 02:40:35 +00:00
public enum TrickObjTypeEditor : int
{
PaperBall ,
Chair ,
Lightning ,
Phone ,
}
public enum TrickObjType : int
{
2022-04-10 21:37:37 +00:00
Ball ,
2024-01-13 02:40:35 +00:00
Chair ,
Shock ,
Phone ,
2022-06-22 22:42:22 +00:00
Plane ,
2024-01-13 02:40:35 +00:00
Blast
2022-04-10 21:37:37 +00:00
}
2023-02-14 16:31:51 +00:00
public struct QueuedObject
{
2023-06-10 19:13:29 +00:00
public double beat ;
2023-02-14 16:31:51 +00:00
public int type ;
2024-01-13 02:40:35 +00:00
public bool variant ;
2023-02-14 16:31:51 +00:00
}
2024-01-13 02:40:35 +00:00
2023-02-14 16:31:51 +00:00
public static List < QueuedObject > queuedInputs = new List < QueuedObject > ( ) ;
2022-04-10 21:37:37 +00:00
2022-06-22 22:42:22 +00:00
[Header("Objects")]
public Animator playerAnim ;
public Animator girlAnim ;
2022-06-24 01:28:17 +00:00
public Animator warnAnim ;
2022-06-22 22:42:22 +00:00
2022-04-10 21:37:37 +00:00
[Header("References")]
2024-01-13 02:40:35 +00:00
public GameObject [ ] objPrefab ;
public GameObject [ ] objPrefabVariant ;
public string [ ] objWarnAnim ;
public string [ ] objWarnAnimVariant ;
public string [ ] objThrowAnim ;
2022-04-10 21:37:37 +00:00
public Transform objHolder ;
[Header("Curves")]
public BezierCurve3D ballTossCurve ;
public BezierCurve3D ballMissCurve ;
public BezierCurve3D planeTossCurve ;
public BezierCurve3D planeMissCurve ;
public BezierCurve3D shockTossCurve ;
2022-04-04 14:48:37 +00:00
public static TrickClass instance ;
2022-04-11 13:56:37 +00:00
public GameEvent bop = new GameEvent ( ) ;
2023-03-07 17:22:32 +00:00
bool goBop = true ;
2022-04-04 14:48:37 +00:00
2023-06-10 19:13:29 +00:00
public double playerCanDodge = double . MinValue ;
double playerBopStart = double . MinValue ;
double girlBopStart = double . MinValue ;
2023-03-07 17:19:41 +00:00
bool showBubble = true ;
2024-01-13 02:40:35 +00:00
bool playerReady , girlBopEnable ;
2022-06-22 22:42:22 +00:00
2023-10-29 19:44:47 +00:00
public static PlayerInput . InputAction InputAction_TouchPressing =
new ( "PcoTrickTouching" , new int [ ] { IAEmptyCat , IAPressingCat , IAEmptyCat } ,
IA_Empty , IA_TouchBasicPressing , IA_Empty ) ;
2023-02-14 16:31:51 +00:00
void OnDestroy ( )
{
2024-01-13 18:31:05 +00:00
queuedInputs . Clear ( ) ;
2023-06-03 23:30:17 +00:00
foreach ( var evt in scheduledInputs )
{
evt . Disable ( ) ;
}
2023-02-14 16:31:51 +00:00
}
2022-04-04 14:48:37 +00:00
private void Awake ( )
{
instance = this ;
2023-12-05 22:38:52 +00:00
SetupBopRegion ( "trickClass" , "bop" , "autoBop" ) ;
2024-01-13 02:40:35 +00:00
girlBopEnable = true ;
2022-04-04 14:48:37 +00:00
}
2022-04-10 21:37:37 +00:00
2023-11-23 16:19:39 +00:00
public override void OnBeatPulse ( double beat )
2022-04-11 01:05:33 +00:00
{
2022-04-11 13:56:37 +00:00
var cond = Conductor . instance ;
2023-12-05 22:38:52 +00:00
if ( ! BeatIsInBopRegion ( beat ) ) return ;
2023-11-23 16:19:39 +00:00
if ( ( ! playerReady ) & & cond . songPositionInBeatsAsDouble > playerBopStart )
playerAnim . DoScaledAnimationAsync ( "Bop" ) ;
2022-06-22 22:42:22 +00:00
2024-01-13 02:40:35 +00:00
if ( cond . songPositionInBeatsAsDouble > girlBopStart & & girlBopEnable )
2023-11-23 16:19:39 +00:00
girlAnim . DoScaledAnimationAsync ( "Bop" ) ;
}
2022-04-11 13:56:37 +00:00
2024-01-13 18:31:05 +00:00
public override void OnPlay ( double beat )
2023-11-23 16:19:39 +00:00
{
2024-01-13 18:31:05 +00:00
queuedInputs . Clear ( ) ;
}
public override void OnGameSwitch ( double beat )
{
if ( ! Conductor . instance . isPlaying ) return ;
if ( queuedInputs . Count > 0 )
2022-04-11 01:05:33 +00:00
{
2024-01-13 18:31:05 +00:00
foreach ( var input in queuedInputs )
2022-06-24 01:28:17 +00:00
{
2024-01-13 18:31:05 +00:00
if ( input . type is ( int ) TrickObjType . Blast )
{
BeatAction . New ( instance , new List < BeatAction . Action > ( )
{
new BeatAction . Action ( input . beat , delegate
{
instance . DoBlast ( input . beat ) ;
} )
} ) ;
}
else
2022-06-24 01:28:17 +00:00
{
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 ( input . beat - 1f , delegate
{
2024-01-13 02:40:35 +00:00
warnAnim . Play ( input . variant ? objWarnAnimVariant [ input . type ] : objWarnAnim [ input . type ] , 0 , 0 ) ;
2023-02-14 16:31:51 +00:00
} ) ,
2024-01-13 02:40:35 +00:00
new BeatAction . Action ( input . beat , delegate
2023-02-14 16:31:51 +00:00
{
warnAnim . Play ( "NoPose" , 0 , 0 ) ;
2024-01-13 02:40:35 +00:00
TossObject ( input . beat , input . type , input . variant ) ;
2023-02-14 16:31:51 +00:00
} )
} ) ;
2022-06-24 01:28:17 +00:00
}
}
}
2024-01-13 18:31:05 +00:00
queuedInputs . Clear ( ) ;
}
2023-02-14 16:31:51 +00:00
2024-01-13 18:31:05 +00:00
private void Update ( )
{
2023-10-29 19:44:47 +00:00
if ( PlayerInput . GetIsAction ( InputAction_TouchPressing ) & & ( ! playerReady ) & & ( playerCanDodge < = Conductor . instance . songPositionInBeatsAsDouble ) )
{
playerAnim . DoScaledAnimationAsync ( "Prepare" ) ;
playerReady = true ;
}
if ( ( ! PlayerInput . GetIsAction ( InputAction_TouchPressing ) ) & & playerReady & & ( playerCanDodge < = Conductor . instance . songPositionInBeatsAsDouble ) )
{
playerAnim . DoScaledAnimationAsync ( "UnPrepare" ) ;
playerReady = false ;
}
if ( PlayerInput . GetIsAction ( InputAction_FlickPress ) & & ! IsExpectingInputNow ( InputAction_FlickPress ) & & ( playerCanDodge < = Conductor . instance . songPositionInBeatsAsDouble ) )
2023-02-14 16:31:51 +00:00
{
PlayerDodge ( true ) ;
2023-06-10 19:13:29 +00:00
playerCanDodge = Conductor . instance . songPositionInBeatsAsDouble + 0.6f ;
2023-02-14 16:31:51 +00:00
}
2022-04-11 01:05:33 +00:00
}
2023-06-10 19:13:29 +00:00
public void Bop ( double beat , float length , bool shouldBop , bool autoBop )
2022-04-11 13:56:37 +00:00
{
2023-03-07 17:22:32 +00:00
var cond = Conductor . instance ;
goBop = autoBop ;
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
{
2023-10-29 19:44:47 +00:00
if ( ( ! playerReady ) & & cond . songPositionInBeatsAsDouble > playerBopStart )
2023-03-07 17:22:32 +00:00
playerAnim . DoScaledAnimationAsync ( "Bop" ) ;
2023-06-10 19:13:29 +00:00
if ( cond . songPositionInBeatsAsDouble > girlBopStart )
2023-03-07 17:22:32 +00:00
girlAnim . DoScaledAnimationAsync ( "Bop" ) ;
} )
} ) ;
}
}
2022-04-11 13:56:37 +00:00
}
2023-03-07 17:19:41 +00:00
public void BubbleToggle ( )
{
instance . showBubble = ! instance . showBubble ;
}
2024-01-13 02:40:35 +00:00
2024-01-25 17:29:05 +00:00
public static void PreTossObject ( GameManager gm , double beat , int type , bool variant = false )
2023-02-14 16:31:51 +00:00
{
2024-01-25 17:29:05 +00:00
if ( gm . currentGame = = "trickClass" & & gm . minigameObj . TryGetComponent ( out TrickClass tc ) )
2023-02-14 16:31:51 +00:00
{
2024-01-25 17:29:05 +00:00
BeatAction . New ( tc , new List < BeatAction . Action > ( )
2023-02-14 16:31:51 +00:00
{
2024-01-13 02:40:35 +00:00
new BeatAction . Action ( beat - 1 , delegate
2023-03-07 17:19:41 +00:00
{
2024-01-25 17:29:05 +00:00
if ( tc . showBubble = = true )
2023-02-14 16:31:51 +00:00
{
2024-01-25 17:29:05 +00:00
tc . warnAnim . Play ( variant ? tc . objWarnAnimVariant [ type ] : tc . objWarnAnim [ type ] , 0 , 0 ) ;
2023-03-07 17:19:41 +00:00
}
} ) ,
2024-01-13 02:40:35 +00:00
new BeatAction . Action ( beat , delegate
2023-02-14 16:31:51 +00:00
{
2024-01-25 17:29:05 +00:00
tc . warnAnim . Play ( "NoPose" , 0 , 0 ) ;
tc . TossObject ( beat , type , variant ) ;
2023-02-14 16:31:51 +00:00
} )
} ) ;
}
else
{
queuedInputs . Add ( new QueuedObject
{
beat = beat ,
type = type ,
2024-01-13 02:40:35 +00:00
variant = variant
2023-02-14 16:31:51 +00:00
} ) ;
}
2022-04-10 21:37:37 +00:00
switch ( type )
{
2024-01-13 02:40:35 +00:00
case ( int ) TrickObjType . Plane :
PlaySoundSequence ( "trickClass" , "planeThrow" , beat ) ;
break ;
case ( int ) TrickObjType . Chair :
PlaySoundSequence ( "trickClass" , "chairThrow" , beat ) ;
break ;
case ( int ) TrickObjType . Shock :
PlaySoundSequence ( "trickClass" , "shockThrow" , beat ) ;
break ;
case ( int ) TrickObjType . Phone :
PlaySoundSequence ( "trickClass" , "phoneThrow" , beat ) ;
2022-04-10 21:37:37 +00:00
break ;
default :
2024-01-13 02:40:35 +00:00
PlaySoundSequence ( "trickClass" , "ballThrow" , beat ) ;
2022-04-10 21:37:37 +00:00
break ;
}
2024-01-13 02:40:35 +00:00
}
2022-06-22 22:42:22 +00:00
2024-01-13 02:40:35 +00:00
public void TossObject ( double beat , int type , bool variant = false )
{
SpawnObject ( beat , type , variant ) ;
girlAnim . DoScaledAnimationAsync ( objThrowAnim [ type ] ) ;
2023-06-10 19:13:29 +00:00
girlBopStart = Conductor . instance . songPositionInBeatsAsDouble + 0.75f ;
2022-04-10 21:37:37 +00:00
}
2024-01-13 02:40:35 +00:00
public void SpawnObject ( double beat , int type , bool variant = false )
2022-04-10 21:37:37 +00:00
{
GameObject objectToSpawn ;
BezierCurve3D curve ;
switch ( type )
{
2024-01-13 02:40:35 +00:00
case ( int ) TrickObjType . Plane :
2022-04-10 21:37:37 +00:00
curve = planeTossCurve ;
2024-01-13 02:40:35 +00:00
break ;
case ( int ) TrickObjType . Shock :
curve = shockTossCurve ;
2022-04-10 21:37:37 +00:00
break ;
default :
curve = ballTossCurve ;
break ;
}
2024-01-13 02:40:35 +00:00
objectToSpawn = variant ? objPrefabVariant [ type ] : objPrefab [ type ] ;
var mobj = Instantiate ( objectToSpawn , objHolder ) ;
2022-04-10 21:37:37 +00:00
var thinker = mobj . GetComponent < MobTrickObj > ( ) ;
thinker . startBeat = beat ;
thinker . curve = curve ;
2024-01-13 02:40:35 +00:00
// thinker.type = type;
2022-04-10 22:29:31 +00:00
mobj . SetActive ( true ) ;
2022-04-10 21:37:37 +00:00
}
2022-04-11 01:05:33 +00:00
2024-01-13 02:40:35 +00:00
public static void PreBlast ( double beat )
{
PlaySoundSequence ( "trickClass" , "girlCharge" , beat ) ;
if ( GameManager . instance . currentGame = = "trickClass" )
{
BeatAction . New ( instance , new List < BeatAction . Action > ( )
{
new BeatAction . Action ( beat , delegate
{
instance . DoBlast ( beat ) ;
} )
} ) ;
}
else
{
queuedInputs . Add ( new QueuedObject
{
beat = beat ,
type = ( int ) TrickObjType . Blast ,
variant = false
} ) ;
}
}
public void DoBlast ( double beat )
{
ScheduleInput ( beat , 2 , InputAction_FlickPress , BlastJustOrNg , BlastMiss , Through , CanDodge ) ;
BeatAction . New ( instance , new List < BeatAction . Action > ( )
{
new BeatAction . Action ( beat , delegate
{
girlBopEnable = false ;
girlAnim . DoScaledAnimationAsync ( "Charge0" ) ;
} ) ,
new BeatAction . Action ( beat + 0.75 , delegate
{
girlAnim . DoScaledAnimationAsync ( "Charge1" ) ;
} ) ,
new BeatAction . Action ( beat + 1.5 , delegate
{
girlAnim . DoScaledAnimationAsync ( "Charge1" ) ;
} ) ,
new BeatAction . Action ( beat + 4 , delegate
{
girlBopEnable = true ;
} ) ,
} ) ;
}
public bool CanDodge ( )
{
return playerCanDodge < = Conductor . instance . songPositionInBeatsAsDouble ;
}
public void BlastJustOrNg ( PlayerActionEvent caller , float state )
{
if ( state < = - 1f | | state > = 1f )
{
SoundByte . PlayOneShotGame ( "trickClass/shock_impact" ) ;
girlAnim . DoScaledAnimationAsync ( "BlastNg" , 0.5f ) ;
PlayerDodgeNg ( true ) ;
return ;
}
girlAnim . DoScaledAnimationAsync ( "BlastDodged" , 0.5f ) ;
if ( playerCanDodge > Conductor . instance . songPositionInBeatsAsDouble ) return ;
SoundByte . PlayOneShotGame ( "trickClass/blast_dodge" ) ;
playerAnim . DoScaledAnimationAsync ( "DodgeBlast0" , 1f ) ;
playerBopStart = Conductor . instance . songPositionInBeatsAsDouble + 1.25 ;
playerCanDodge = Conductor . instance . songPositionInBeatsAsDouble + 1 ;
playerReady = false ;
SoundByte . PlayOneShotGame ( "trickClass/blast_dodge_return" , caller . startBeat + caller . timer + 1f ) ;
BeatAction . New ( instance , new List < BeatAction . Action > ( )
{
new BeatAction . Action ( caller . startBeat + caller . timer + 1 , delegate
{
playerAnim . DoScaledAnimationAsync ( "DodgeBlast1" , 1f ) ;
} ) ,
} ) ;
}
public void BlastMiss ( PlayerActionEvent caller )
{
girlAnim . DoScaledAnimationAsync ( "BlastNg" , 0.5f ) ;
SoundByte . PlayOneShotGame ( "trickClass/blast_miss" ) ;
playerAnim . DoScaledAnimationAsync ( "ThroughBlast" ) ;
playerReady = false ;
playerBopStart = Conductor . instance . songPositionInBeatsAsDouble + 1.5f ;
playerCanDodge = Conductor . instance . songPositionInBeatsAsDouble + 0.5f ;
}
public void Through ( PlayerActionEvent caller ) { }
public void PlayerDodge ( bool slow = false , bool type = false )
2022-04-11 01:05:33 +00:00
{
2023-06-10 19:13:29 +00:00
if ( playerCanDodge > Conductor . instance . songPositionInBeatsAsDouble ) return ;
2022-06-22 22:42:22 +00:00
2022-04-11 01:05:33 +00:00
//anim
2023-06-10 19:13:29 +00:00
SoundByte . PlayOneShotGame ( "trickClass/player_dodge" ) ;
2024-01-13 02:40:35 +00:00
playerAnim . DoScaledAnimationAsync ( type ? "DodgeAlt" : "Dodge" , slow ? 0.6f : 1f ) ;
2023-06-10 19:13:29 +00:00
playerBopStart = Conductor . instance . songPositionInBeatsAsDouble + 0.75f ;
2023-10-29 19:44:47 +00:00
playerReady = false ;
2022-06-22 22:42:22 +00:00
}
2024-01-13 02:40:35 +00:00
public void PlayerDodgeNg ( bool shock = false )
2022-06-22 22:42:22 +00:00
{
2024-01-13 02:40:35 +00:00
playerAnim . DoScaledAnimationAsync ( shock ? "DodgeNgShock" : "DodgeNg" ) ;
2023-10-29 19:44:47 +00:00
playerReady = false ;
2023-06-10 19:13:29 +00:00
playerBopStart = Conductor . instance . songPositionInBeatsAsDouble + 0.75f ;
playerCanDodge = Conductor . instance . songPositionInBeatsAsDouble + 0.15f ;
2022-06-22 22:42:22 +00:00
}
2024-01-13 02:40:35 +00:00
public void PlayerThrough ( bool shock = false )
2022-06-22 22:42:22 +00:00
{
2024-01-13 02:40:35 +00:00
playerAnim . DoScaledAnimationAsync ( shock ? "ThroughShock" : "Through" ) ;
2023-10-29 19:44:47 +00:00
playerReady = false ;
2023-06-10 19:13:29 +00:00
playerBopStart = Conductor . instance . songPositionInBeatsAsDouble + 0.75f ;
playerCanDodge = Conductor . instance . songPositionInBeatsAsDouble + 0.15f ;
2022-04-11 01:05:33 +00:00
}
2022-04-04 14:48:37 +00:00
}
}