2022-01-17 19:23:18 +00:00
using System.Collections ;
using System.Collections.Generic ;
using UnityEngine ;
2022-02-28 19:31:28 +00:00
using DG.Tweening ;
2022-01-17 19:23:18 +00:00
2022-03-14 14:21:05 +00:00
using HeavenStudio.Util ;
2022-01-17 19:23:18 +00:00
2022-03-14 14:21:05 +00:00
using HeavenStudio.Games ;
2022-01-17 19:23:18 +00:00
2022-04-12 16:14:46 +00:00
using System ;
using System.Linq ;
using System.Reflection ;
2022-03-14 14:21:05 +00:00
namespace HeavenStudio
2022-01-17 19:23:18 +00:00
{
2022-04-11 08:59:36 +00:00
2022-01-17 19:23:18 +00:00
public class Minigames
{
public class Minigame
{
public string name ;
public string displayName ;
public string color ;
public GameObject holder ;
2022-02-03 02:09:50 +00:00
public bool threeD ;
2022-02-03 03:58:08 +00:00
public bool fxOnly ;
2022-01-17 19:23:18 +00:00
public List < GameAction > actions = new List < GameAction > ( ) ;
2022-02-03 03:58:08 +00:00
public Minigame ( string name , string displayName , string color , bool threeD , bool fxOnly , List < GameAction > actions )
2022-01-17 19:23:18 +00:00
{
this . name = name ;
this . displayName = displayName ;
this . color = color ;
this . actions = actions ;
2022-02-03 03:58:08 +00:00
this . threeD = threeD ;
this . fxOnly = fxOnly ;
2022-01-17 19:23:18 +00:00
}
}
public class GameAction
{
public string actionName ;
public EventCallback function ;
public float defaultLength ;
public bool resizable ;
2022-02-03 22:20:26 +00:00
public List < Param > parameters ;
2022-03-01 08:17:06 +00:00
public bool hidden ;
2022-03-02 21:59:35 +00:00
public EventCallback inactiveFunction ;
2022-01-17 19:23:18 +00:00
2022-03-02 21:59:35 +00:00
/// <summary>
/// <para>Creates a block that can be used in the editor. The block's function and attributes are defined in the parentheses.</para>
/// <para>Note: Every parameter after the second one is an optional parameter. You can change optional parameters by adding (name): (value) after the second parameter.</para>
/// </summary>
/// <param name="actionName">Name of the block</param>
/// <param name="function"><para>What the block does when read during playback</para>
/// <para>Only does this if the game that it is associated with is loaded.</para></param>
/// <param name="defaultLength">How long the block appears in the editor</param>
/// <param name="resizable">Allows the user to resize the block</param>
/// <param name="parameters">Extra parameters for this block that change how it functions.</param>
/// <param name="hidden">Prevents the block from being shown in the game list. Block will still function normally if it is in the timeline.</param>
/// <param name="inactiveFunction">What the block does when read while the game it's associated with isn't loaded.</param>
public GameAction ( string actionName , EventCallback function , float defaultLength = 1 , bool resizable = false , List < Param > parameters = null , bool hidden = false , EventCallback inactiveFunction = null )
2022-01-17 19:23:18 +00:00
{
this . actionName = actionName ;
this . function = function ;
this . defaultLength = defaultLength ;
this . resizable = resizable ;
2022-02-03 22:20:26 +00:00
this . parameters = parameters ;
2022-03-01 08:17:06 +00:00
this . hidden = hidden ;
2022-03-02 21:59:35 +00:00
if ( inactiveFunction = = null ) inactiveFunction = delegate { } ;
this . inactiveFunction = inactiveFunction ;
2022-02-03 22:20:26 +00:00
}
}
[System.Serializable]
public class Param
{
public string propertyName ;
public object parameter ;
public string propertyCaption ;
2022-03-01 21:11:19 +00:00
public string tooltip ;
2022-02-03 22:20:26 +00:00
2022-03-02 21:59:35 +00:00
/// <summary>
/// A parameter that changes the function of a GameAction.
/// </summary>
/// <param name="propertyName">The name of the variable that's being changed. Must be one of the variables in <see cref="Beatmap.Entity"/></param>
/// <param name="parameter">The value of the parameter</param>
/// <param name="propertyCaption">The name shown in the editor. Can be anything you want.</param>
2022-03-01 21:11:19 +00:00
public Param ( string propertyName , object parameter , string propertyCaption , string tooltip = "" )
2022-02-03 22:20:26 +00:00
{
this . propertyName = propertyName ;
this . parameter = parameter ;
this . propertyCaption = propertyCaption ;
2022-03-01 21:11:19 +00:00
this . tooltip = tooltip ;
2022-01-17 19:23:18 +00:00
}
}
public delegate void EventCallback ( ) ;
2022-04-12 16:14:46 +00:00
// overengineered af but it's a modified version of
// https://stackoverflow.com/a/19877141
static List < Func < EventCaller , Minigame > > loadRunners ;
static void BuildLoadRunnerList ( ) {
loadRunners = System . Reflection . Assembly . GetExecutingAssembly ( )
. GetTypes ( )
. Where ( x = > x . Namespace = = "HeavenStudio.Games.Loaders" & & x . GetMethod ( "AddGame" , BindingFlags . Public | BindingFlags . Static ) ! = null )
. Select ( t = > ( Func < EventCaller , Minigame > ) Delegate . CreateDelegate (
typeof ( Func < EventCaller , Minigame > ) ,
null ,
t . GetMethod ( "AddGame" , BindingFlags . Public | BindingFlags . Static ) ,
false
) )
. ToList ( ) ;
2022-04-12 17:30:22 +00:00
2022-04-12 16:14:46 +00:00
}
2022-01-17 19:23:18 +00:00
public static void Init ( EventCaller eventCaller )
{
eventCaller . minigames = new List < Minigame > ( )
{
2022-02-03 03:58:08 +00:00
new Minigame ( "gameManager" , "Game Manager" , "" , false , true , new List < GameAction > ( )
2022-01-17 19:23:18 +00:00
{
2022-03-08 04:46:49 +00:00
new GameAction ( "switchGame" , delegate { GameManager . instance . SwitchGame ( eventCaller . currentSwitchGame , eventCaller . currentEntity . beat ) ; } , 0.5f , inactiveFunction : delegate { GameManager . instance . SwitchGame ( eventCaller . currentSwitchGame , eventCaller . currentEntity . beat ) ; } ) ,
2022-02-10 08:13:54 +00:00
new GameAction ( "end" , delegate { Debug . Log ( "end" ) ; } ) ,
new GameAction ( "skill star" , delegate { } , 1f , true ) ,
new GameAction ( "flash" , delegate
2022-02-08 01:07:03 +00:00
{
/ * Color colA = eventCaller . currentEntity . colorA ;
Color colB = eventCaller . currentEntity . colorB ;
Color startCol = new Color ( colA . r , colA . g , colA . b , eventCaller . currentEntity . valA ) ;
Color endCol = new Color ( colB . r , colB . g , colB . b , eventCaller . currentEntity . valB ) ;
GameManager . instance . fade . SetFade ( eventCaller . currentEntity . beat , eventCaller . currentEntity . length , startCol , endCol , eventCaller . currentEntity . ease ) ; * /
} , 1f , true , new List < Param > ( )
{
new Param ( "colorA" , Color . white , "Start Color" ) ,
new Param ( "colorB" , Color . white , "End Color" ) ,
new Param ( "valA" , new EntityTypes . Float ( 0 , 1 , 1 ) , "Start Opacity" ) ,
new Param ( "valB" , new EntityTypes . Float ( 0 , 1 , 0 ) , "End Opacity" ) ,
new Param ( "ease" , EasingFunction . Ease . Linear , "Ease" )
} ) ,
2022-03-01 07:27:49 +00:00
new GameAction ( "toggle inputs" , delegate
{
GameManager . instance . ToggleInputs ( eventCaller . currentEntity . toggle ) ;
} , 0.5f , true , new List < Param > ( )
{
new Param ( "toggle" , true , "Enable Inputs" )
} ) ,
2022-05-16 05:29:39 +00:00
new GameAction ( "move camera" , delegate
{
//TODO: move cam
} , 1f , true , new List < Param > ( )
{
new Param ( "valA" , new EntityTypes . Float ( - 50 , 50 , 0 ) , "Right / Left" ) ,
new Param ( "valB" , new EntityTypes . Float ( - 50 , 50 , 0 ) , "Up / Down" ) ,
new Param ( "valC" , new EntityTypes . Float ( - 0 , 250 , 10 ) , "In / Out" ) ,
new Param ( "ease" , EasingFunction . Ease . Linear , "Ease Type" )
} ) ,
new GameAction ( "rotate camera" , delegate
{
//TODO: rot cam
} , 1f , true , new List < Param > ( )
{
new Param ( "valA" , new EntityTypes . Integer ( - 360 , 360 , 0 ) , "Pitch" ) ,
new Param ( "valB" , new EntityTypes . Integer ( - 360 , 360 , 0 ) , "Yaw" ) ,
new Param ( "valC" , new EntityTypes . Integer ( - 360 , 360 , 0 ) , "Roll" ) ,
new Param ( "ease" , EasingFunction . Ease . Linear , "Ease Type" )
} ) ,
2022-01-17 19:23:18 +00:00
} ) ,
2022-02-03 03:58:08 +00:00
new Minigame ( "countIn" , "Count-Ins" , "" , false , true , new List < GameAction > ( )
{
2022-03-01 19:21:23 +00:00
new GameAction ( "4 beat count-in" , delegate { var e = eventCaller . currentEntity ; SoundEffects . FourBeatCountIn ( e . beat , e . length / 4f , e . type ) ; } , 4f , true , new List < Param > ( )
2022-02-25 06:59:18 +00:00
{
2022-03-01 21:37:17 +00:00
new Param ( "type" , SoundEffects . CountInType . Normal , "Type" , "The sounds to play for the count-in" )
2022-03-01 19:21:23 +00:00
} ) ,
new GameAction ( "8 beat count-in" , delegate { var e = eventCaller . currentEntity ; SoundEffects . EightBeatCountIn ( e . beat , e . length / 8f , e . type ) ; } , 8f , true , new List < Param > ( )
2022-02-25 06:59:18 +00:00
{
2022-03-01 21:37:17 +00:00
new Param ( "type" , SoundEffects . CountInType . Normal , "Type" , "The sounds to play for the count-in" )
2022-03-01 19:21:23 +00:00
} ) ,
new GameAction ( "count" , delegate { var e = eventCaller . currentEntity ; SoundEffects . Count ( e . type , e . toggle ) ; } , 1f , false , new List < Param > ( )
2022-02-25 06:59:18 +00:00
{
2022-03-01 21:37:17 +00:00
new Param ( "type" , SoundEffects . CountNumbers . One , "Number" , "The sound to play" ) ,
new Param ( "toggle" , false , "Alt" , "Whether or not the alternate version should be played" )
2022-03-01 19:21:23 +00:00
} ) ,
new GameAction ( "cowbell" , delegate { SoundEffects . Cowbell ( ) ; } , 1f ) ,
new GameAction ( "ready!" , delegate { var e = eventCaller . currentEntity ; SoundEffects . Ready ( e . beat , e . length / 2f ) ; } , 2f , true ) ,
new GameAction ( "and" , delegate { SoundEffects . And ( ) ; } , 0.5f ) ,
new GameAction ( "go!" , delegate { SoundEffects . Go ( eventCaller . currentEntity . toggle ) ; } , 1f , false , new List < Param > ( )
2022-02-08 01:07:03 +00:00
{
2022-03-01 21:37:17 +00:00
new Param ( "toggle" , false , "Alt" , "Whether or not the alternate version should be played" )
2022-03-01 19:21:23 +00:00
} ) ,
// These are still here for backwards-compatibility but are hidden in the editor
new GameAction ( "4 beat count-in (alt)" , delegate { var e = eventCaller . currentEntity ; SoundEffects . FourBeatCountIn ( e . beat , e . length , 1 ) ; } , 4f , hidden : true ) ,
new GameAction ( "4 beat count-in (cowbell)" , delegate { var e = eventCaller . currentEntity ; SoundEffects . FourBeatCountIn ( e . beat , e . length , 2 ) ; } , 4f , hidden : true ) ,
new GameAction ( "8 beat count-in (alt)" , delegate { var e = eventCaller . currentEntity ; SoundEffects . EightBeatCountIn ( e . beat , e . length , 1 ) ; } , 4f , hidden : true ) ,
new GameAction ( "8 beat count-in (cowbell)" , delegate { var e = eventCaller . currentEntity ; SoundEffects . EightBeatCountIn ( e . beat , e . length , 2 ) ; } , 4f , hidden : true ) ,
new GameAction ( "one" , delegate { SoundEffects . Count ( 0 , false ) ; } , 1f , hidden : true ) ,
new GameAction ( "one (alt)" , delegate { SoundEffects . Count ( 0 , true ) ; } , 1f , hidden : true ) ,
new GameAction ( "two" , delegate { SoundEffects . Count ( 1 , false ) ; } , 1f , hidden : true ) ,
new GameAction ( "two (alt)" , delegate { SoundEffects . Count ( 1 , true ) ; } , 1f , hidden : true ) ,
new GameAction ( "three" , delegate { SoundEffects . Count ( 2 , false ) ; } , 1f , hidden : true ) ,
new GameAction ( "three (alt)" , delegate { SoundEffects . Count ( 2 , true ) ; } , 1f , hidden : true ) ,
new GameAction ( "four" , delegate { SoundEffects . Count ( 3 , false ) ; } , 1f , hidden : true ) ,
new GameAction ( "four (alt)" , delegate { SoundEffects . Count ( 3 , true ) ; } , 1f , hidden : true ) ,
new GameAction ( "go! (alt)" , delegate { SoundEffects . Go ( true ) ; } , 1f , hidden : true ) ,
2022-02-03 03:58:08 +00:00
} ) ,
2022-01-17 19:23:18 +00:00
} ;
2022-04-12 16:14:46 +00:00
BuildLoadRunnerList ( ) ;
foreach ( var load in loadRunners )
2022-04-12 17:30:22 +00:00
{
Debug . Log ( "Running game loader " + RuntimeReflectionExtensions . GetMethodInfo ( load ) . DeclaringType . Name ) ;
2022-04-12 16:14:46 +00:00
eventCaller . minigames . Add ( load ( eventCaller ) ) ;
2022-04-12 17:30:22 +00:00
}
2022-01-17 19:23:18 +00:00
}
}
}