2023-05-29 20:09:34 +00:00
using System.Collections ;
using System.Collections.Generic ;
using UnityEngine ;
using HeavenStudio.Util ;
2023-10-29 19:44:47 +00:00
using HeavenStudio.InputSystem ;
2023-05-29 20:09:34 +00:00
2023-06-10 19:13:29 +00:00
using Jukebox ;
2023-05-29 20:09:34 +00:00
namespace HeavenStudio.Games.Loaders
{
using static Minigames ;
public static class NtrRockersLoader
{
public static Minigame AddGame ( EventCaller eventCaller )
{
return new Minigame ( "rockers" , "Rockers" , "EB4C94" , false , false , new List < GameAction > ( )
{
new GameAction ( "intervalStart" , "Start Interval" )
{
defaultLength = 8f ,
resizable = true ,
2023-06-28 04:51:53 +00:00
preFunction = delegate { var e = eventCaller . currentEntity ; Rockers . PreInterval ( e . beat , e . length , e [ "auto" ] , e [ "moveCamera" ] , e [ "movePass" ] ) ; } ,
2023-05-29 20:09:34 +00:00
parameters = new List < Param > ( )
{
2024-01-15 02:04:10 +00:00
new Param ( "moveCamera" , true , "Move Camera" , "Toggle if the camera should move to JJ Rocker." ) ,
new Param ( "movePass" , true , "Move Camera (Pass Turn)" , "Toggle if the camera should move to Soshi if Auto Pass Turn is enabled." ) ,
new Param ( "auto" , true , "Auto Pass Turn" , "Toggle if the turn should be passed automatically at the end of the start interval." )
2023-05-29 20:09:34 +00:00
} ,
} ,
new GameAction ( "riff" , "Riff" )
{
defaultLength = 1f ,
resizable = true ,
parameters = new List < Param > ( )
{
2024-01-15 02:04:10 +00:00
new Param ( "respond" , true , "Respond" , "Toggle if this guitar riff will have to be responded to by Soshi (the player)." ) ,
new Param ( "1JJ" , new EntityTypes . Integer ( - 1 , 24 , 0 ) , "E2 String (JJ)" , "Set how many semitones up the current string will be pitched. If this is left at -1, this string will not play." ) ,
new Param ( "2JJ" , new EntityTypes . Integer ( - 1 , 24 , 0 ) , "A2 String (JJ)" , "Set how many semitones up the current string will be pitched. If this is left at -1, this string will not play." ) ,
new Param ( "3JJ" , new EntityTypes . Integer ( - 1 , 24 , 0 ) , "D3 String (JJ)" , "Set how many semitones up the current string will be pitched. If this is left at -1, this string will not play." ) ,
new Param ( "4JJ" , new EntityTypes . Integer ( - 1 , 24 , 0 ) , "G3 String (JJ)" , "Set how many semitones up the current string will be pitched. If this is left at -1, this string will not play." ) ,
new Param ( "5JJ" , new EntityTypes . Integer ( - 1 , 24 , 0 ) , "B3 String (JJ)" , "Set how many semitones up the current string will be pitched. If this is left at -1, this string will not play." ) ,
new Param ( "6JJ" , new EntityTypes . Integer ( - 1 , 24 , 0 ) , "E4 String (JJ)" , "Set how many semitones up the current string will be pitched. If this is left at -1, this string will not play." ) ,
new Param ( "sampleJJ" , Rockers . PremadeSamples . None , "Premade Sample (JJ)" , "Set if this riff should use a premade sample." ) ,
2024-03-22 01:37:41 +00:00
new Param ( "pitchSampleJJ" , new EntityTypes . Integer ( - EntityTypes . Note . maxSemitones , EntityTypes . Note . maxSemitones , 0 ) , "Sample Semitones (JJ)" , "Set how many semitones the premade sample should be pitched up." ) ,
2024-01-15 02:04:10 +00:00
new Param ( "gcJJ" , false , "Glee Club Guitar (JJ)" , "Toggle if JJ should use the same guitar as in the Glee Club guitar lessons in DS." ) ,
new Param ( "1S" , new EntityTypes . Integer ( - 1 , 24 , 0 ) , "E2 String (Soshi)" , "Set how many semitones up the current string will be pitched. If this is left at -1, this string will not play." ) ,
new Param ( "2S" , new EntityTypes . Integer ( - 1 , 24 , 0 ) , "A2 String (Soshi)" , "Set how many semitones up the current string will be pitched. If this is left at -1, this string will not play." ) ,
new Param ( "3S" , new EntityTypes . Integer ( - 1 , 24 , 0 ) , "D3 String (Soshi)" , "Set how many semitones up the current string will be pitched. If this is left at -1, this string will not play." ) ,
new Param ( "4S" , new EntityTypes . Integer ( - 1 , 24 , 0 ) , "G3 String (Soshi)" , "Set how many semitones up the current string will be pitched. If this is left at -1, this string will not play." ) ,
new Param ( "5S" , new EntityTypes . Integer ( - 1 , 24 , 0 ) , "B3 String (Soshi)" , "Set how many semitones up the current string will be pitched. If this is left at -1, this string will not play." ) ,
new Param ( "6S" , new EntityTypes . Integer ( - 1 , 24 , 0 ) , "E4 String (Soshi)" , "Set how many semitones up the current string will be pitched. If this is left at -1, this string will not play." ) ,
new Param ( "sampleS" , Rockers . PremadeSamples . None , "Premade Sample (Soshi)" , "Set if this riff should use a premade sample." ) ,
2024-03-22 01:37:41 +00:00
new Param ( "pitchSampleS" , new EntityTypes . Integer ( - EntityTypes . Note . maxSemitones , EntityTypes . Note . maxSemitones , 0 ) , "Sample Semitones (Soshi)" , "Set how many semitones the premade sample should be pitched up." ) ,
2024-01-15 02:04:10 +00:00
new Param ( "gcS" , false , "Glee Club Guitar (Soshi)" , "Toggle if Soshi should use the same guitar as in the Glee Club guitar lessons in DS." )
2023-05-29 20:09:34 +00:00
} ,
} ,
new GameAction ( "bend" , "Bend" )
{
defaultLength = 1f ,
resizable = true ,
parameters = new List < Param > ( )
{
2024-01-15 02:04:10 +00:00
new Param ( "respond" , true , "Respond" , "Toggle if this guitar bend will have to be responded to by Soshi (the player)." ) ,
2024-03-22 01:37:41 +00:00
new Param ( "1JJ" , new EntityTypes . Integer ( - EntityTypes . Note . maxSemitones , EntityTypes . Note . maxSemitones , 1 ) , "Pitch Bend (JJ)" , "Set how many semitones up the current riff will be pitchbent." ) ,
new Param ( "1S" , new EntityTypes . Integer ( - EntityTypes . Note . maxSemitones , EntityTypes . Note . maxSemitones , 1 ) , "Pitch Bend (Soshi)" , "Set how many semitones up the current riff will be pitchbent." ) ,
2023-05-29 20:09:34 +00:00
} ,
} ,
new GameAction ( "prepare" , "Prepare" )
{
function = delegate { Rockers . instance . Mute ( eventCaller . currentEntity [ "who" ] ) ; } ,
defaultLength = 0.5f ,
parameters = new List < Param > ( )
{
2024-01-15 02:04:10 +00:00
new Param ( "who" , Rockers . WhoMutes . JJ , "Target" , "Set who will prepare. Soshi is only affected by this event in auto-play." )
2023-05-29 20:09:34 +00:00
}
} ,
2023-06-03 14:51:30 +00:00
new GameAction ( "unPrepare" , "Unprepare" )
{
function = delegate { Rockers . instance . UnMute ( eventCaller . currentEntity [ "who" ] ) ; } ,
defaultLength = 0.5f ,
parameters = new List < Param > ( )
{
2024-01-15 02:04:10 +00:00
new Param ( "who" , Rockers . WhoMutes . JJ , "Target" , "Set who will unprepare. Soshi is only affected by this event in auto-play." )
2023-06-03 14:51:30 +00:00
}
} ,
2023-05-29 20:09:34 +00:00
new GameAction ( "passTurn" , "Pass Turn" )
{
2023-06-13 14:13:08 +00:00
preFunction = delegate { var e = eventCaller . currentEntity ; Rockers . PrePassTurn ( e . beat , e [ "moveCamera" ] ) ; } ,
2023-05-29 20:09:34 +00:00
parameters = new List < Param >
{
2024-01-15 02:04:10 +00:00
new Param ( "moveCamera" , true , "Move Camera" , "Toggle if the camera should move to Soshi." )
2023-06-13 14:13:08 +00:00
} ,
preFunctionLength = 1
2023-05-29 20:09:34 +00:00
} ,
new GameAction ( "cmon" , "C'mon!" )
{
function = delegate { var e = eventCaller . currentEntity ; Rockers . instance . DefaultCmon ( e . beat , new int [ 4 ]
{
e [ "JJ1" ] ,
e [ "JJ2" ] ,
e [ "JJ3" ] ,
e [ "JJ4" ] ,
} , new int [ 4 ]
{
e [ "pJJ1" ] ,
e [ "pJJ2" ] ,
e [ "pJJ3" ] ,
e [ "pJJ4" ] ,
} , new int [ 4 ]
{
e [ "S1" ] ,
e [ "S2" ] ,
e [ "S3" ] ,
e [ "S4" ] ,
} , new int [ 4 ]
{
e [ "pS1" ] ,
e [ "pS2" ] ,
e [ "pS3" ] ,
2023-10-29 19:44:47 +00:00
e [ "pS4" ] ,
2023-05-29 20:09:34 +00:00
} , e [ "moveCamera" ]
) ; } ,
defaultLength = 11 ,
parameters = new List < Param > ( )
{
2024-01-15 02:04:10 +00:00
new Param ( "moveCamera" , true , "Move Camera" , "Toggle if the camera should move to the middle." ) ,
new Param ( "JJ1" , Rockers . PremadeSamples . ChordG5 , "Premade Sample 1 (JJ)" , "Set the sample to use for the 1st riff." ) ,
2024-03-22 01:37:41 +00:00
new Param ( "pJJ1" , new EntityTypes . Integer ( - EntityTypes . Note . maxSemitones , EntityTypes . Note . maxSemitones , 0 ) , "Sample Semitones 1 (JJ)" , "Set how many semitones the premade sample should be pitched up." ) ,
2024-01-15 02:04:10 +00:00
new Param ( "JJ2" , Rockers . PremadeSamples . ChordG5 , "Premade Sample 2 (JJ)" , "Set the sample to use for the 2nd riff." ) ,
2024-03-22 01:37:41 +00:00
new Param ( "pJJ2" , new EntityTypes . Integer ( - EntityTypes . Note . maxSemitones , EntityTypes . Note . maxSemitones , 0 ) , "Sample Semitones 2 (JJ)" , "Set how many semitones the premade sample should be pitched up." ) ,
2024-01-15 02:04:10 +00:00
new Param ( "JJ3" , Rockers . PremadeSamples . ChordG5 , "Premade Sample 3 (JJ)" , "Set the sample to use for the 3rd riff." ) ,
2024-03-22 01:37:41 +00:00
new Param ( "pJJ3" , new EntityTypes . Integer ( - EntityTypes . Note . maxSemitones , EntityTypes . Note . maxSemitones , 0 ) , "Sample Semitones 3 (JJ)" , "Set how many semitones the premade sample should be pitched up." ) ,
2024-01-15 02:04:10 +00:00
new Param ( "JJ4" , Rockers . PremadeSamples . ChordA , "Premade Sample 4 (JJ)" , "Set the sample to use for the final riff." ) ,
2024-03-22 01:37:41 +00:00
new Param ( "pJJ4" , new EntityTypes . Integer ( - EntityTypes . Note . maxSemitones , EntityTypes . Note . maxSemitones , 0 ) , "Sample Semitones 4 (JJ)" , "Set how many semitones the premade sample should be pitched up." ) ,
2024-01-15 02:04:10 +00:00
new Param ( "S1" , Rockers . PremadeSamples . ChordG , "Premade Sample 1 (Soshi)" , "Set the sample to use for the 1st riff." ) ,
2024-03-22 01:37:41 +00:00
new Param ( "pS1" , new EntityTypes . Integer ( - EntityTypes . Note . maxSemitones , EntityTypes . Note . maxSemitones , 0 ) , "Sample Semitones 1 (Soshi)" , "Set how many semitones the premade sample should be pitched up." ) ,
2024-01-15 02:04:10 +00:00
new Param ( "S2" , Rockers . PremadeSamples . ChordG , "Premade Sample 2 (Soshi)" , "Set the sample to use for the 2nd riff." ) ,
2024-03-22 01:37:41 +00:00
new Param ( "pS2" , new EntityTypes . Integer ( - EntityTypes . Note . maxSemitones , EntityTypes . Note . maxSemitones , 0 ) , "Sample Semitones 2 (Soshi)" , "Set how many semitones the premade sample should be pitched up." ) ,
2024-01-15 02:04:10 +00:00
new Param ( "S3" , Rockers . PremadeSamples . ChordG , "Premade Sample 3 (Soshi)" , "Set the sample to use for the 3rd riff." ) ,
2024-03-22 01:37:41 +00:00
new Param ( "pS3" , new EntityTypes . Integer ( - EntityTypes . Note . maxSemitones , EntityTypes . Note . maxSemitones , 0 ) , "Sample Semitones 3 (Soshi)" , "Set how many semitones the premade sample should be pitched up." ) ,
2024-01-15 02:04:10 +00:00
new Param ( "S4" , Rockers . PremadeSamples . ChordA , "Premade Sample 4 (Soshi)" , "Set the sample to use for the final riff." ) ,
2024-03-22 01:37:41 +00:00
new Param ( "pS4" , new EntityTypes . Integer ( - EntityTypes . Note . maxSemitones , EntityTypes . Note . maxSemitones , 0 ) , "Sample Semitones 4 (Soshi)" , "Set how many semitones the premade sample should be pitched up." ) ,
2023-05-29 20:09:34 +00:00
}
} ,
new GameAction ( "lastOne" , "Last One!" )
{
function = delegate { var e = eventCaller . currentEntity ; Rockers . instance . DefaultLastOne ( e . beat , new int [ 3 ]
{
e [ "JJ1" ] ,
e [ "JJ2" ] ,
e [ "JJ3" ] ,
} , new int [ 3 ]
{
e [ "pJJ1" ] ,
e [ "pJJ2" ] ,
e [ "pJJ3" ] ,
} , new int [ 3 ]
{
e [ "S1" ] ,
e [ "S2" ] ,
e [ "S3" ] ,
} , new int [ 3 ]
{
e [ "pS1" ] ,
e [ "pS2" ] ,
e [ "pS3" ] ,
} , e [ "moveCamera" ]
) ; } ,
defaultLength = 7 ,
parameters = new List < Param > ( )
{
2024-01-15 02:04:10 +00:00
new Param ( "moveCamera" , true , "Move Camera" , "Toggle if the camera should move to the middle." ) ,
new Param ( "JJ1" , Rockers . PremadeSamples . ChordAsus4 , "Premade Sample 1 (JJ)" , "Set the sample to use for the 1st riff." ) ,
2024-03-22 01:37:41 +00:00
new Param ( "pJJ1" , new EntityTypes . Integer ( - EntityTypes . Note . maxSemitones , EntityTypes . Note . maxSemitones , 0 ) , "Sample Semitones 1 (JJ)" , "Set how many semitones the premade sample should be pitched up." ) ,
2024-01-15 02:04:10 +00:00
new Param ( "JJ2" , Rockers . PremadeSamples . ChordAsus4 , "Premade Sample 2 (JJ)" , "Set the sample to use for the 2nd riff." ) ,
2024-03-22 01:37:41 +00:00
new Param ( "pJJ2" , new EntityTypes . Integer ( - EntityTypes . Note . maxSemitones , EntityTypes . Note . maxSemitones , 0 ) , "Sample Semitones 2 (JJ)" , "Set how many semitones the premade sample should be pitched up." ) ,
2024-01-15 02:04:10 +00:00
new Param ( "JJ3" , Rockers . PremadeSamples . ChordAsus4 , "Premade Sample 3 (JJ)" , "Set the sample to use for the final riff." ) ,
2024-03-22 01:37:41 +00:00
new Param ( "pJJ3" , new EntityTypes . Integer ( - EntityTypes . Note . maxSemitones , EntityTypes . Note . maxSemitones , 0 ) , "Sample Semitones 3 (JJ)" , "Set how many semitones the premade sample should be pitched up." ) ,
2024-01-15 02:04:10 +00:00
new Param ( "S1" , Rockers . PremadeSamples . ChordDmaj9 , "Premade Sample 1 (Soshi)" , "Set the sample to use for the 1st riff." ) ,
2024-03-22 01:37:41 +00:00
new Param ( "pS1" , new EntityTypes . Integer ( - EntityTypes . Note . maxSemitones , EntityTypes . Note . maxSemitones , 0 ) , "Sample Semitones 1 (Soshi)" , "Set how many semitones the premade sample should be pitched up." ) ,
2024-01-15 02:04:10 +00:00
new Param ( "S2" , Rockers . PremadeSamples . ChordDmaj9 , "Premade Sample 2 (Soshi)" , "Set the sample to use for the 2nd riff." ) ,
2024-03-22 01:37:41 +00:00
new Param ( "pS2" , new EntityTypes . Integer ( - EntityTypes . Note . maxSemitones , EntityTypes . Note . maxSemitones , 0 ) , "Sample Semitones 2 (Soshi)" , "Set how many semitones the premade sample should be pitched up." ) ,
2024-01-15 02:04:10 +00:00
new Param ( "S3" , Rockers . PremadeSamples . ChordDmaj9 , "Premade Sample 3 (Soshi)" , "Set the sample to use for the final riff." ) ,
2024-03-22 01:37:41 +00:00
new Param ( "pS3" , new EntityTypes . Integer ( - EntityTypes . Note . maxSemitones , EntityTypes . Note . maxSemitones , 0 ) , "Sample Semitones 3 (Soshi)" , "Set how many semitones the premade sample should be pitched up." ) ,
2023-05-29 20:09:34 +00:00
}
} ,
2024-01-15 02:04:10 +00:00
new GameAction ( "count" , "Count" )
2023-05-29 20:09:34 +00:00
{
parameters = new List < Param > ( )
{
2024-01-15 02:04:10 +00:00
new Param ( "count" , Rockers . CountIn . One , "Type" , "Set the number to be said." )
2023-05-29 20:09:34 +00:00
} ,
2023-10-29 19:44:47 +00:00
preFunction = delegate
{
2023-05-29 20:09:34 +00:00
var e = eventCaller . currentEntity ;
float offSet = 0 ;
switch ( e [ "count" ] )
{
case 1 :
offSet = 0.028f ;
break ;
case 2 :
case 3 :
offSet = 0.033f ;
break ;
case 4 :
offSet = 0.034f ;
break ;
}
2024-02-11 05:24:52 +00:00
SoundByte . PlayOneShot ( $"games/rockers/count/count{e[" count "]}" , e . beat , 1 , 1 , false , null , offSet ) ;
2023-05-29 20:09:34 +00:00
}
} ,
new GameAction ( "voiceLine" , "Together Voice Line" )
{
parameters = new List < Param > ( )
{
2024-01-15 02:04:10 +00:00
new Param ( "cmon" , true , "C'mon!" , "Toggle if the \"C'mon!\" voiceline should be used. If unchecked, it uses the \"Last One!\" voiceline." ) ,
2023-05-29 20:09:34 +00:00
} ,
preFunction = delegate
{
2023-06-10 19:13:29 +00:00
SoundByte . PlayOneShot ( eventCaller . currentEntity [ "cmon" ] ? "games/rockers/Cmon" : "games/rockers/LastOne" , eventCaller . currentEntity . beat ) ;
2023-05-29 20:09:34 +00:00
}
} ,
new GameAction ( "prepareTogether" , "Custom Together Prepare" )
{
2023-10-29 19:44:47 +00:00
function = delegate { var e = eventCaller . currentEntity ; Rockers . instance . TogetherPrepare ( e . beat , e [ "cmon" ] = = ( int ) Rockers . VoiceLineSelection . Cmon , e [ "cmon" ] = = ( int ) Rockers . VoiceLineSelection . None ,
2023-05-29 20:09:34 +00:00
e [ "muteBeat" ] , e [ "middleBeat" ] , e [ "moveCamera" ] ) ; } ,
defaultLength = 3f ,
parameters = new List < Param > ( )
{
2024-01-15 02:04:10 +00:00
new Param ( "cmon" , Rockers . VoiceLineSelection . Cmon , "Voiceline" , "Set the voiceline to be used." ) ,
new Param ( "muteBeat" , new EntityTypes . Integer ( 0 , 30 , 2 ) , "Mute Beat" , "Set how many beats from the start of this event the rockers will prepare prepare." ) ,
new Param ( "middleBeat" , new EntityTypes . Integer ( 0 , 30 , 2 ) , "Go-to-middle Beat" , "Set how many beats from the start of this event the rockers will go to the middle." ) ,
new Param ( "moveCamera" , true , "Move Camera" , "Toggle if the camera should move to the middle." )
2023-05-29 20:09:34 +00:00
}
} ,
new GameAction ( "riffTogether" , "Custom Together Riff" )
{
resizable = true ,
parameters = new List < Param > ( )
{
2024-01-15 02:04:10 +00:00
new Param ( "1JJ" , new EntityTypes . Integer ( - 1 , 24 , 0 ) , "E2 String (JJ)" , "Set how many semitones up the current string will be pitched. If this is left at -1, this string will not play." ) ,
new Param ( "2JJ" , new EntityTypes . Integer ( - 1 , 24 , 0 ) , "A2 String (JJ)" , "Set how many semitones up the current string will be pitched. If this is left at -1, this string will not play." ) ,
new Param ( "3JJ" , new EntityTypes . Integer ( - 1 , 24 , 0 ) , "D3 String (JJ)" , "Set how many semitones up the current string will be pitched. If this is left at -1, this string will not play." ) ,
new Param ( "4JJ" , new EntityTypes . Integer ( - 1 , 24 , 0 ) , "G3 String (JJ)" , "Set how many semitones up the current string will be pitched. If this is left at -1, this string will not play." ) ,
new Param ( "5JJ" , new EntityTypes . Integer ( - 1 , 24 , 0 ) , "B3 String (JJ)" , "Set how many semitones up the current string will be pitched. If this is left at -1, this string will not play." ) ,
new Param ( "6JJ" , new EntityTypes . Integer ( - 1 , 24 , 0 ) , "E4 String (JJ)" , "Set how many semitones up the current string will be pitched. If this is left at -1, this string will not play." ) ,
new Param ( "sampleJJ" , Rockers . PremadeSamples . None , "Premade Sample (JJ)" , "Set if this riff should use a premade sample." ) ,
2024-03-22 01:37:41 +00:00
new Param ( "pitchSampleJJ" , new EntityTypes . Integer ( - EntityTypes . Note . maxSemitones , EntityTypes . Note . maxSemitones , 0 ) , "Sample Semitones (JJ)" , "Set how many semitones the premade sample should be pitched up." ) ,
2024-01-15 02:04:10 +00:00
new Param ( "gcJJ" , false , "Glee Club Guitar (JJ)" , "Toggle if JJ should use the same guitar as in the Glee Club guitar lessons in DS." ) ,
new Param ( "1S" , new EntityTypes . Integer ( - 1 , 24 , 0 ) , "E2 String (Soshi)" , "Set how many semitones up the current string will be pitched. If this is left at -1, this string will not play." ) ,
new Param ( "2S" , new EntityTypes . Integer ( - 1 , 24 , 0 ) , "A2 String (Soshi)" , "Set how many semitones up the current string will be pitched. If this is left at -1, this string will not play." ) ,
new Param ( "3S" , new EntityTypes . Integer ( - 1 , 24 , 0 ) , "D3 String (Soshi)" , "Set how many semitones up the current string will be pitched. If this is left at -1, this string will not play." ) ,
new Param ( "4S" , new EntityTypes . Integer ( - 1 , 24 , 0 ) , "G3 String (Soshi)" , "Set how many semitones up the current string will be pitched. If this is left at -1, this string will not play." ) ,
new Param ( "5S" , new EntityTypes . Integer ( - 1 , 24 , 0 ) , "B3 String (Soshi)" , "Set how many semitones up the current string will be pitched. If this is left at -1, this string will not play." ) ,
new Param ( "6S" , new EntityTypes . Integer ( - 1 , 24 , 0 ) , "E4 String (Soshi)" , "Set how many semitones up the current string will be pitched. If this is left at -1, this string will not play." ) ,
new Param ( "sampleS" , Rockers . PremadeSamples . None , "Premade Sample (Soshi)" , "Set if this riff should use a premade sample." ) ,
2024-03-22 01:37:41 +00:00
new Param ( "pitchSampleS" , new EntityTypes . Integer ( - EntityTypes . Note . maxSemitones , EntityTypes . Note . maxSemitones , 0 ) , "Sample Semitones (Soshi)" , "Set how many semitones the premade sample should be pitched up." ) ,
2024-01-15 02:04:10 +00:00
new Param ( "gcS" , false , "Glee Club Guitar (Soshi)" , "Toggle if Soshi should use the same guitar as in the Glee Club guitar lessons in DS." )
2023-05-29 20:09:34 +00:00
}
} ,
new GameAction ( "riffTogetherEnd" , "Custom Together End Riff" )
{
resizable = true ,
parameters = new List < Param > ( )
{
2024-01-15 02:04:10 +00:00
new Param ( "1JJ" , new EntityTypes . Integer ( - 1 , 24 , 0 ) , "E2 String (JJ)" , "Set how many semitones up the current string will be pitched. If this is left at -1, this string will not play." ) ,
new Param ( "2JJ" , new EntityTypes . Integer ( - 1 , 24 , 0 ) , "A2 String (JJ)" , "Set how many semitones up the current string will be pitched. If this is left at -1, this string will not play." ) ,
new Param ( "3JJ" , new EntityTypes . Integer ( - 1 , 24 , 0 ) , "D3 String (JJ)" , "Set how many semitones up the current string will be pitched. If this is left at -1, this string will not play." ) ,
new Param ( "4JJ" , new EntityTypes . Integer ( - 1 , 24 , 0 ) , "G3 String (JJ)" , "Set how many semitones up the current string will be pitched. If this is left at -1, this string will not play." ) ,
new Param ( "5JJ" , new EntityTypes . Integer ( - 1 , 24 , 0 ) , "B3 String (JJ)" , "Set how many semitones up the current string will be pitched. If this is left at -1, this string will not play." ) ,
new Param ( "6JJ" , new EntityTypes . Integer ( - 1 , 24 , 0 ) , "E4 String (JJ)" , "Set how many semitones up the current string will be pitched. If this is left at -1, this string will not play." ) ,
new Param ( "sampleJJ" , Rockers . PremadeSamples . None , "Premade Sample (JJ)" , "Set if this riff should use a premade sample." ) ,
2024-03-22 01:37:41 +00:00
new Param ( "pitchSampleJJ" , new EntityTypes . Integer ( - EntityTypes . Note . maxSemitones , EntityTypes . Note . maxSemitones , 0 ) , "Sample Semitones (JJ)" , "Set how many semitones the premade sample should be pitched up." ) ,
2024-01-15 02:04:10 +00:00
new Param ( "gcJJ" , false , "Glee Club Guitar (JJ)" , "Toggle if JJ should use the same guitar as in the Glee Club guitar lessons in DS." ) ,
new Param ( "1S" , new EntityTypes . Integer ( - 1 , 24 , 0 ) , "E2 String (Soshi)" , "Set how many semitones up the current string will be pitched. If this is left at -1, this string will not play." ) ,
new Param ( "2S" , new EntityTypes . Integer ( - 1 , 24 , 0 ) , "A2 String (Soshi)" , "Set how many semitones up the current string will be pitched. If this is left at -1, this string will not play." ) ,
new Param ( "3S" , new EntityTypes . Integer ( - 1 , 24 , 0 ) , "D3 String (Soshi)" , "Set how many semitones up the current string will be pitched. If this is left at -1, this string will not play." ) ,
new Param ( "4S" , new EntityTypes . Integer ( - 1 , 24 , 0 ) , "G3 String (Soshi)" , "Set how many semitones up the current string will be pitched. If this is left at -1, this string will not play." ) ,
new Param ( "5S" , new EntityTypes . Integer ( - 1 , 24 , 0 ) , "B3 String (Soshi)" , "Set how many semitones up the current string will be pitched. If this is left at -1, this string will not play." ) ,
new Param ( "6S" , new EntityTypes . Integer ( - 1 , 24 , 0 ) , "E4 String (Soshi)" , "Set how many semitones up the current string will be pitched. If this is left at -1, this string will not play." ) ,
new Param ( "sampleS" , Rockers . PremadeSamples . None , "Premade Sample (Soshi)" , "Set if this riff should use a premade sample." ) ,
2024-03-22 01:37:41 +00:00
new Param ( "pitchSampleS" , new EntityTypes . Integer ( - EntityTypes . Note . maxSemitones , EntityTypes . Note . maxSemitones , 0 ) , "Sample Semitones (Soshi)" , "Set how many semitones the premade sample should be pitched up." ) ,
2024-01-15 02:04:10 +00:00
new Param ( "gcS" , false , "Glee Club Guitar (Soshi)" , "Toggle if Soshi should use the same guitar as in the Glee Club guitar lessons in DS." )
2023-05-29 20:09:34 +00:00
}
} ,
2024-01-14 07:18:46 +00:00
} ,
new List < string > ( ) { "ntr" , "repeat" } ,
"ntrrockers" , "en" ,
2024-03-29 02:35:07 +00:00
new List < string > ( ) { "en" } ,
chronologicalSortKey : 28
2024-01-14 07:18:46 +00:00
) ;
2023-05-29 20:09:34 +00:00
}
}
}
namespace HeavenStudio.Games
{
using Scripts_Rockers ;
public class Rockers : Minigame
{
public enum PremadeSamples
{
None ,
BendG5 ,
BendC6 ,
ChordA ,
ChordAsus4 ,
ChordBm ,
ChordCSharpm7 ,
ChordDmaj7 ,
ChordDmaj9 ,
ChordFSharp5 ,
ChordG ,
ChordG5 ,
ChordGdim7 ,
ChordGm ,
NoteASharp4 ,
NoteA5 ,
PracticeChordD ,
Remix6ChordA ,
Remix10ChordD ,
Remix10ChordFSharpm ,
DoremiChordA7 ,
DoremiChordAm7 ,
DoremiChordC ,
DoremiChordC7 ,
DoremiChordCadd9 ,
DoremiChordDm ,
DoremiChordDm7 ,
DoremiChordEm ,
DoremiChordF ,
DoremiChordFadd9 ,
DoremiChordFm ,
DoremiChordG ,
DoremiChordG7 ,
DoremiChordGm ,
DoremiChordGsus4 ,
DoremiNoteA2 ,
DoremiNoteE2
}
public enum WhoMutes
{
JJ ,
Soshi ,
Both
}
public enum CountIn
{
One = 1 ,
Two = 2 ,
Three = 3 ,
Four = 4
}
public enum VoiceLineSelection
{
Cmon ,
LastOne ,
None
}
public static Rockers instance ;
[Header("Rockers")]
public RockersRocker JJ ;
public RockersRocker Soshi ;
[Header("Input")]
[SerializeField] RockersInput rockerInputRef ;
[SerializeField] RockerBendInput rockerBendInputRef ;
private float lastTargetCameraX = 0 ;
private float targetCameraX = 0 ;
2023-06-10 19:13:29 +00:00
private double cameraMoveBeat = - 1 ;
private double endBeat = double . MaxValue ;
private static List < double > queuedCameraEvents = new ( ) ;
2023-05-29 20:09:34 +00:00
2023-06-10 19:13:29 +00:00
private List < RiqEntity > riffEvents = new List < RiqEntity > ( ) ;
2023-05-29 20:09:34 +00:00
2023-06-10 19:13:29 +00:00
private List < RiqEntity > bendEvents = new List < RiqEntity > ( ) ;
2023-05-29 20:09:34 +00:00
2023-06-10 19:13:29 +00:00
private List < double > prepareBeatsJJ = new ( ) ;
2023-05-29 20:09:34 +00:00
2023-06-28 04:51:53 +00:00
private struct QueuedInterval
{
public double beat ;
public float length ;
public bool moveCamera ;
public bool moveCameraPass ;
public bool autoPassTurn ;
}
private static List < QueuedInterval > queuedIntervals = new ( ) ;
2023-10-29 19:44:47 +00:00
const int IATriggerDown = IAMAXCAT ;
const int IATriggerUp = IAMAXCAT + 1 ;
static bool IA_PadTriggerDown ( out double dt )
{
return PlayerInput . GetPadDown ( InputController . ActionsPad . Up , out dt )
| | PlayerInput . GetPadDown ( InputController . ActionsPad . Down , out dt )
| | PlayerInput . GetPadDown ( InputController . ActionsPad . Left , out dt )
| | PlayerInput . GetPadDown ( InputController . ActionsPad . Right , out dt )
| | PlayerInput . GetPadDown ( InputController . ActionsPad . ButtonR , out dt )
| | PlayerInput . GetPadDown ( InputController . ActionsPad . ButtonL , out dt ) ;
}
static bool IA_BatonTriggerDown ( out double dt )
{
return PlayerInput . GetBatonDown ( InputController . ActionsBaton . Trigger , out dt ) ;
}
static bool IA_TouchTriggerDown ( out double dt )
{
return PlayerInput . GetTouchDown ( InputController . ActionsTouch . ButtonR , out dt )
| | PlayerInput . GetTouchDown ( InputController . ActionsTouch . ButtonL , out dt ) ;
}
static bool IA_PadTriggerUp ( out double dt )
{
return PlayerInput . GetPadUp ( InputController . ActionsPad . Up , out dt )
| | PlayerInput . GetPadUp ( InputController . ActionsPad . Down , out dt )
| | PlayerInput . GetPadUp ( InputController . ActionsPad . Left , out dt )
| | PlayerInput . GetPadUp ( InputController . ActionsPad . Right , out dt )
| | PlayerInput . GetPadUp ( InputController . ActionsPad . ButtonR , out dt )
| | PlayerInput . GetPadUp ( InputController . ActionsPad . ButtonL , out dt ) ;
}
static bool IA_BatonTriggerUp ( out double dt )
{
return PlayerInput . GetBatonUp ( InputController . ActionsBaton . Trigger , out dt ) ;
}
static bool IA_TouchTriggerUp ( out double dt )
{
return PlayerInput . GetTouchUp ( InputController . ActionsTouch . ButtonR , out dt )
| | PlayerInput . GetTouchUp ( InputController . ActionsTouch . ButtonL , out dt ) ;
}
public static PlayerInput . InputAction InputAction_TriggerDown =
new ( "NtrRockersBend" , new int [ ] { IATriggerDown , IATriggerDown , IATriggerDown } ,
IA_PadTriggerDown , IA_TouchTriggerDown , IA_BatonTriggerDown ) ;
public static PlayerInput . InputAction InputAction_TriggerUp =
new ( "NtrRockersUnbend" , new int [ ] { IATriggerUp , IATriggerUp , IATriggerUp } ,
IA_PadTriggerUp , IA_TouchTriggerUp , IA_PadTriggerUp ) ;
2023-05-29 20:09:34 +00:00
private void Awake ( )
{
instance = this ;
var tempEvents = EventCaller . GetAllInGameManagerList ( "rockers" , new string [ ] { "prepare" } ) ;
foreach ( var tempEvent in tempEvents )
{
if ( tempEvent [ "who" ] ! = ( int ) WhoMutes . Soshi ) prepareBeatsJJ . Add ( tempEvent . beat ) ;
}
riffEvents = GrabAllRiffEvents ( ) ;
bendEvents = GrabAllBendEvents ( ) ;
}
2023-06-10 19:13:29 +00:00
private static List < RiqEntity > GrabAllRiffEvents ( )
2023-05-29 20:09:34 +00:00
{
var tempEvents = EventCaller . GetAllInGameManagerList ( "rockers" , new string [ ] { "riff" } ) ;
if ( tempEvents . Count > 1 )
{
tempEvents . Sort ( ( s1 , s2 ) = > s1 . beat . CompareTo ( s2 . beat ) ) ;
2023-06-10 19:13:29 +00:00
double forbiddenLength = tempEvents [ 0 ] . beat + tempEvents [ 0 ] . length ;
List < RiqEntity > tempEvents2 = new List < RiqEntity > ( ) ;
2023-05-29 20:09:34 +00:00
for ( int i = 1 ; i < tempEvents . Count ; i + + )
{
if ( tempEvents [ i ] . beat > forbiddenLength )
{
tempEvents2 . Add ( tempEvents [ i ] ) ;
forbiddenLength = tempEvents [ i ] . beat + tempEvents [ i ] . length ;
}
}
tempEvents2 . Add ( tempEvents [ 0 ] ) ;
return tempEvents2 ;
}
else
{
return tempEvents ;
}
}
2023-06-10 19:13:29 +00:00
private static List < RiqEntity > GrabAllBendEvents ( )
2023-05-29 20:09:34 +00:00
{
var tempEvents = EventCaller . GetAllInGameManagerList ( "rockers" , new string [ ] { "bend" } ) ;
if ( tempEvents . Count > 1 )
{
tempEvents . Sort ( ( s1 , s2 ) = > s1 . beat . CompareTo ( s2 . beat ) ) ;
2023-06-10 19:13:29 +00:00
double forbiddenLength = tempEvents [ 0 ] . beat + tempEvents [ 0 ] . length ;
List < RiqEntity > tempEvents2 = new List < RiqEntity > ( ) ;
2023-05-29 20:09:34 +00:00
for ( int i = 1 ; i < tempEvents . Count ; i + + )
{
if ( tempEvents [ i ] . beat > forbiddenLength )
{
tempEvents2 . Add ( tempEvents [ i ] ) ;
forbiddenLength = tempEvents [ i ] . beat + tempEvents [ i ] . length ;
}
}
tempEvents2 . Add ( tempEvents [ 0 ] ) ;
return tempEvents2 ;
}
else
{
return tempEvents ;
}
}
2023-06-28 04:51:53 +00:00
private static List < RiqEntity > GrabAllInputsBetween ( double beat , double endBeat )
{
List < RiqEntity > hairEvents = EventCaller . GetAllInGameManagerList ( "rockers" , new string [ ] { "riff" , "bend" } ) ;
List < RiqEntity > tempEvents = new ( ) ;
foreach ( var entity in hairEvents )
{
if ( entity . beat > = beat & & entity . beat < endBeat )
{
tempEvents . Add ( entity ) ;
}
}
return tempEvents ;
}
2023-07-12 16:49:32 +00:00
private RiqEntity GetLastIntervalBeforeBeat ( double beat )
{
List < RiqEntity > intervalEvents = EventCaller . GetAllInGameManagerList ( "rockers" , new string [ ] { "intervalStart" } ) ;
if ( intervalEvents . Count = = 0 ) return null ;
var tempEvents = intervalEvents . FindAll ( x = > x . beat < = beat ) ;
tempEvents . Sort ( ( x , y ) = > x . beat . CompareTo ( y . beat ) ) ;
return tempEvents [ ^ 1 ] ;
}
2023-06-10 19:13:29 +00:00
private List < RiqEntity > GrabAllTogetherEvents ( double beat )
2023-05-29 20:09:34 +00:00
{
var tempEvents = EventCaller . GetAllInGameManagerList ( "rockers" , new string [ ] { "riffTogether" , "riffTogetherEnd" } ) ;
var allEnds = EventCaller . GetAllInGameManagerList ( "gameManager" , new string [ ] { "switchGame" } ) ;
allEnds . Sort ( ( x , y ) = > x . beat . CompareTo ( y . beat ) ) ;
//get the beat of the closest end event
foreach ( var end in allEnds )
{
if ( end . datamodel . Split ( 2 ) = = "rockers" ) continue ;
if ( end . beat > beat )
{
endBeat = end . beat ;
break ;
}
}
if ( tempEvents . Count > 0 )
{
tempEvents . Sort ( ( s1 , s2 ) = > s1 . beat . CompareTo ( s2 . beat ) ) ;
2023-06-10 19:13:29 +00:00
List < RiqEntity > tempEvents2 = new List < RiqEntity > ( ) ;
2023-05-29 20:09:34 +00:00
for ( int i = 0 ; i < tempEvents . Count ; i + + )
{
if ( tempEvents [ i ] . beat > beat )
{
tempEvents2 . Add ( tempEvents [ i ] ) ;
}
}
2023-06-10 19:13:29 +00:00
List < RiqEntity > tempEvents3 = new List < RiqEntity > ( ) ;
double forbiddenLength = tempEvents2 [ 0 ] . beat + tempEvents2 [ 0 ] . length ;
2023-05-29 20:09:34 +00:00
tempEvents3 . Add ( tempEvents2 [ 0 ] ) ;
for ( int i = 1 ; i < tempEvents2 . Count ; i + + )
{
if ( tempEvents2 [ i ] . beat > forbiddenLength )
{
tempEvents3 . Add ( tempEvents2 [ i ] ) ;
}
}
2023-06-10 19:13:29 +00:00
List < RiqEntity > tempEvents4 = new List < RiqEntity > ( ) ;
2023-05-29 20:09:34 +00:00
for ( int i = 0 ; i < tempEvents3 . Count ; i + + )
{
if ( tempEvents3 [ i ] . beat < endBeat )
{
tempEvents4 . Add ( tempEvents3 [ i ] ) ;
}
}
return tempEvents4 ;
}
return tempEvents ;
}
2023-06-13 14:13:08 +00:00
struct QueuedPassTurn
{
public double beat ;
public bool moveCamera ;
}
private static List < QueuedPassTurn > passedTurns = new List < QueuedPassTurn > ( ) ;
2023-05-29 20:09:34 +00:00
private void Start ( )
{
2023-10-29 19:44:47 +00:00
if ( PlayerInput . GetIsAction ( InputAction_BasicPressing ) )
2023-05-29 20:09:34 +00:00
{
Soshi . Mute ( ) ;
}
}
private void OnDestroy ( )
{
if ( queuedCameraEvents . Count > 0 ) queuedCameraEvents . Clear ( ) ;
2023-06-03 23:30:17 +00:00
foreach ( var evt in scheduledInputs )
{
evt . Disable ( ) ;
}
2023-05-29 20:09:34 +00:00
}
2023-06-28 04:51:53 +00:00
public override void OnGameSwitch ( double beat )
{
if ( queuedIntervals . Count > 0 )
{
foreach ( var interval in queuedIntervals )
{
StartInterval ( interval . beat , interval . length , beat , interval . autoPassTurn , interval . moveCameraPass ) ;
}
queuedIntervals . Clear ( ) ;
}
}
2023-05-29 20:09:34 +00:00
private void Update ( )
{
var cond = Conductor . instance ;
2023-10-29 19:44:47 +00:00
if ( cond . isPlaying & & ! cond . isPaused )
{
if ( PlayerInput . GetIsAction ( InputAction_BasicPress ) )
2023-05-29 20:09:34 +00:00
{
Soshi . Mute ( ) ;
}
2023-10-29 19:44:47 +00:00
if ( PlayerInput . CurrentControlStyle = = InputController . ControlStyles . Touch
& & PlayerInput . GetIsAction ( InputAction_FlickRelease ) & & ! IsExpectingInputNow ( InputAction_FlickRelease ) )
2023-05-29 20:09:34 +00:00
{
2023-10-29 19:44:47 +00:00
// todo: strum
2024-01-09 16:55:00 +00:00
Soshi . StrumStringsLast ( false , false , true ) ;
2023-05-29 20:09:34 +00:00
}
2023-10-29 19:44:47 +00:00
if ( PlayerInput . GetIsAction ( InputAction_BasicRelease ) )
{
if ( PlayerInput . CurrentControlStyle = = InputController . ControlStyles . Touch )
{
Soshi . UnHold ( ) ;
}
else if ( ! IsExpectingInputNow ( InputAction_FlickRelease ) )
{
Soshi . UnHold ( ) ;
}
}
if ( PlayerInput . GetIsAction ( InputAction_TriggerDown ) & & ! IsExpectingInputNow ( InputAction_TriggerDown ) )
2023-05-29 20:09:34 +00:00
{
Soshi . BendUp ( Soshi . lastBendPitch ) ;
}
2023-10-29 19:44:47 +00:00
if ( PlayerInput . GetIsAction ( InputAction_TriggerUp ) & & ! IsExpectingInputNow ( InputAction_TriggerUp ) )
2023-05-29 20:09:34 +00:00
{
Soshi . BendDown ( ) ;
}
if ( queuedCameraEvents . Count > 0 )
{
foreach ( var cameraEvent in queuedCameraEvents )
{
MoveCamera ( cameraEvent ) ;
}
queuedCameraEvents . Clear ( ) ;
}
2023-06-13 14:13:08 +00:00
if ( passedTurns . Count > 0 )
{
foreach ( var turn in passedTurns )
{
2023-06-28 04:51:53 +00:00
StandalonePassTurn ( turn . beat , turn . moveCamera ) ;
2023-06-13 14:13:08 +00:00
}
passedTurns . Clear ( ) ;
}
2023-05-29 20:09:34 +00:00
float normalizedBeat = cond . GetPositionFromBeat ( cameraMoveBeat , 1f ) ;
if ( normalizedBeat > = 0f & & normalizedBeat < = 1f )
{
2023-06-10 19:13:29 +00:00
Util . EasingFunction . Function func = Util . EasingFunction . GetEasingFunction ( Util . EasingFunction . Ease . EaseInOutQuad ) ;
2023-05-29 20:09:34 +00:00
float newX = func ( lastTargetCameraX , targetCameraX , normalizedBeat ) ;
2023-11-21 16:57:03 +00:00
GameCamera . AdditionalPosition = new Vector3 ( newX , 0 , 0 ) ;
2023-05-29 20:09:34 +00:00
}
}
}
2023-06-10 19:13:29 +00:00
public void DefaultLastOne ( double beat , int [ ] JJSamples , int [ ] JJPitches , int [ ] SoshiSamples , int [ ] SoshiPitches , bool moveCamera )
2023-05-29 20:09:34 +00:00
{
2023-06-10 19:13:29 +00:00
SoundByte . PlayOneShotGame ( "rockers/lastOne" ) ;
2023-05-29 20:09:34 +00:00
if ( moveCamera )
{
2023-11-21 16:57:03 +00:00
lastTargetCameraX = GameCamera . AdditionalPosition . x ;
2023-05-29 20:09:34 +00:00
targetCameraX = 0 ;
cameraMoveBeat = beat + 2 ;
}
2023-09-11 22:28:04 +00:00
BeatAction . New ( instance , new List < BeatAction . Action > ( )
2023-05-29 20:09:34 +00:00
{
new BeatAction . Action ( beat + 2 , delegate
{
if ( JJ . together | | Soshi . together ) return ;
JJ . PrepareTogether ( true ) ;
Soshi . PrepareTogether ( GameManager . instance . autoplay ) ;
} ) ,
new BeatAction . Action ( beat + 3 , delegate
{
JJ . StrumStrings ( false , new int [ 6 ] , ( PremadeSamples ) JJSamples [ 0 ] , JJPitches [ 0 ] ) ;
} ) ,
new BeatAction . Action ( beat + 3.5f , delegate
{
JJ . Mute ( ) ;
} ) ,
new BeatAction . Action ( beat + 4.5f , delegate
{
JJ . StrumStrings ( false , new int [ 6 ] , ( PremadeSamples ) JJSamples [ 1 ] , JJPitches [ 1 ] ) ;
} ) ,
new BeatAction . Action ( beat + 5f , delegate
{
JJ . Mute ( ) ;
} ) ,
new BeatAction . Action ( beat + 6 , delegate
{
JJ . StrumStrings ( false , new int [ 6 ] , ( PremadeSamples ) JJSamples [ 2 ] , JJPitches [ 2 ] ) ;
} ) ,
new BeatAction . Action ( beat + 6.5f , delegate
{
JJ . Mute ( ) ;
} ) ,
} ) ;
RockersInput riffComp = Instantiate ( rockerInputRef , transform ) ;
riffComp . Init ( false , new int [ 6 ] , beat , 3 , ( PremadeSamples ) SoshiSamples [ 0 ] , SoshiPitches [ 0 ] ) ;
2023-10-29 19:44:47 +00:00
ScheduleInput ( beat , 3.5f , InputAction_TriggerDown , JustMute , MuteMiss , Empty ) ;
2023-05-29 20:09:34 +00:00
RockersInput riffComp2 = Instantiate ( rockerInputRef , transform ) ;
riffComp2 . Init ( false , new int [ 6 ] , beat , 4.5f , ( PremadeSamples ) SoshiSamples [ 1 ] , SoshiPitches [ 1 ] ) ;
2023-10-29 19:44:47 +00:00
ScheduleInput ( beat , 5f , InputAction_TriggerDown , JustMute , MuteMiss , Empty ) ;
2023-05-29 20:09:34 +00:00
RockersInput riffComp3 = Instantiate ( rockerInputRef , transform ) ;
riffComp3 . Init ( false , new int [ 6 ] , beat , 6 , ( PremadeSamples ) SoshiSamples [ 2 ] , SoshiPitches [ 2 ] ) ;
2023-10-29 19:44:47 +00:00
ScheduleInput ( beat , 6.5f , InputAction_TriggerDown , JustMute , MuteMiss , Empty ) ;
2023-05-29 20:09:34 +00:00
}
2023-06-10 19:13:29 +00:00
public void DefaultCmon ( double beat , int [ ] JJSamples , int [ ] JJPitches , int [ ] SoshiSamples , int [ ] SoshiPitches , bool moveCamera )
2023-05-29 20:09:34 +00:00
{
2023-06-10 19:13:29 +00:00
SoundByte . PlayOneShotGame ( "rockers/cmon" ) ;
2023-05-29 20:09:34 +00:00
if ( moveCamera )
{
2023-11-21 16:57:03 +00:00
lastTargetCameraX = GameCamera . AdditionalPosition . x ;
2023-05-29 20:09:34 +00:00
targetCameraX = 0 ;
cameraMoveBeat = beat + 2 ;
}
2023-09-11 22:28:04 +00:00
BeatAction . New ( instance , new List < BeatAction . Action > ( )
2023-05-29 20:09:34 +00:00
{
new BeatAction . Action ( beat + 2 , delegate
{
if ( JJ . together | | Soshi . together ) return ;
JJ . PrepareTogether ( true ) ;
Soshi . PrepareTogether ( GameManager . instance . autoplay ) ;
} ) ,
new BeatAction . Action ( beat + 3 , delegate
{
JJ . StrumStrings ( false , new int [ 6 ] , ( PremadeSamples ) JJSamples [ 0 ] , JJPitches [ 0 ] ) ;
} ) ,
new BeatAction . Action ( beat + 4 , delegate
{
JJ . Mute ( ) ;
} ) ,
new BeatAction . Action ( beat + 4.5f , delegate
{
JJ . StrumStrings ( false , new int [ 6 ] , ( PremadeSamples ) JJSamples [ 1 ] , JJPitches [ 1 ] ) ;
} ) ,
new BeatAction . Action ( beat + 5.5f , delegate
{
JJ . Mute ( ) ;
} ) ,
new BeatAction . Action ( beat + 6 , delegate
{
JJ . StrumStrings ( false , new int [ 6 ] , ( PremadeSamples ) JJSamples [ 2 ] , JJPitches [ 2 ] ) ;
} ) ,
new BeatAction . Action ( beat + 6.5 , delegate
{
JJ . Mute ( ) ;
} ) ,
new BeatAction . Action ( beat + 7 , delegate
{
JJ . StrumStrings ( false , new int [ 6 ] , ( PremadeSamples ) JJSamples [ 3 ] , JJPitches [ 3 ] , false , true ) ;
} ) ,
new BeatAction . Action ( beat + 10 , delegate
{
JJ . Mute ( ) ;
} ) ,
} ) ;
RockersInput riffComp = Instantiate ( rockerInputRef , transform ) ;
riffComp . Init ( false , new int [ 6 ] , beat , 3 , ( PremadeSamples ) SoshiSamples [ 0 ] , SoshiPitches [ 0 ] ) ;
2024-01-09 16:55:00 +00:00
ScheduleAutoplayInput ( beat , 4 , InputAction_BasicPress , JustMute , MuteMiss , Empty ) ;
2023-05-29 20:09:34 +00:00
RockersInput riffComp2 = Instantiate ( rockerInputRef , transform ) ;
riffComp2 . Init ( false , new int [ 6 ] , beat , 4.5f , ( PremadeSamples ) SoshiSamples [ 1 ] , SoshiPitches [ 1 ] ) ;
2024-01-09 16:55:00 +00:00
ScheduleAutoplayInput ( beat , 5.5f , InputAction_BasicPress , JustMute , MuteMiss , Empty ) ;
2023-05-29 20:09:34 +00:00
RockersInput riffComp3 = Instantiate ( rockerInputRef , transform ) ;
riffComp3 . Init ( false , new int [ 6 ] , beat , 6 , ( PremadeSamples ) SoshiSamples [ 2 ] , SoshiPitches [ 2 ] ) ;
2023-10-29 19:44:47 +00:00
ScheduleInput ( beat , 6.5f , InputAction_BasicPress , JustMute , MuteMiss , Empty ) ;
2023-05-29 20:09:34 +00:00
RockersInput riffComp4 = Instantiate ( rockerInputRef , transform ) ;
riffComp4 . Init ( false , new int [ 6 ] , beat , 7 , ( PremadeSamples ) SoshiSamples [ 3 ] , SoshiPitches [ 3 ] , true ) ;
2024-01-09 16:55:00 +00:00
ScheduleAutoplayInput ( beat , 10 , InputAction_BasicPress , JustMute , MuteMiss , Empty ) ;
2023-05-29 20:09:34 +00:00
}
2023-06-10 19:13:29 +00:00
public void TogetherPrepare ( double beat , bool cmon , bool muteSound , float muteBeat , float goToMiddleBeat , bool moveCamera )
2023-05-29 20:09:34 +00:00
{
2023-06-10 19:13:29 +00:00
List < RiqEntity > togetherEvents = GrabAllTogetherEvents ( beat ) ;
2023-07-12 16:49:32 +00:00
if ( togetherEvents . Count = = 0 ) return ;
2023-06-10 19:13:29 +00:00
if ( ! muteSound ) SoundByte . PlayOneShotGame ( cmon ? "rockers/Cmon" : "rockers/LastOne" ) ;
2023-05-29 20:09:34 +00:00
List < BeatAction . Action > actions = new List < BeatAction . Action > ( ) ;
if ( moveCamera )
{
2023-11-21 16:57:03 +00:00
lastTargetCameraX = GameCamera . AdditionalPosition . x ;
2023-05-29 20:09:34 +00:00
targetCameraX = 0 ;
cameraMoveBeat = beat + goToMiddleBeat ;
}
2023-09-11 22:28:04 +00:00
BeatAction . New ( instance , new List < BeatAction . Action > ( )
2023-05-29 20:09:34 +00:00
{
new BeatAction . Action ( beat + goToMiddleBeat , delegate
{
if ( JJ . together | | Soshi . together ) return ;
JJ . PrepareTogether ( goToMiddleBeat = = muteBeat ) ;
Soshi . PrepareTogether ( goToMiddleBeat = = muteBeat & & GameManager . instance . autoplay ) ;
} ) ,
new BeatAction . Action ( beat + muteBeat , delegate
{
if ( goToMiddleBeat = = muteBeat ) return ;
if ( JJ . together | | Soshi . together ) return ;
Mute ( ( int ) WhoMutes . Both ) ;
} ) ,
} ) ;
for ( int i = 0 ; i < togetherEvents . Count ; i + + )
{
var e = togetherEvents [ i ] ;
if ( togetherEvents [ i ] . datamodel = = "rockers/riffTogether" )
{
2023-10-29 19:44:47 +00:00
actions . Add ( new BeatAction . Action ( e . beat , delegate
2023-05-29 20:09:34 +00:00
{
JJ . StrumStrings ( e [ "gcJJ" ] , new int [ 6 ]
{
e [ "1JJ" ] ,
e [ "2JJ" ] ,
e [ "3JJ" ] ,
e [ "4JJ" ] ,
e [ "5JJ" ] ,
e [ "6JJ" ] ,
2023-10-29 19:44:47 +00:00
} , ( PremadeSamples ) e [ "sampleJJ" ] , e [ "pitchSampleJJ" ] ) ;
2023-05-29 20:09:34 +00:00
} ) ) ;
actions . Add ( new BeatAction . Action ( e . beat + e . length , delegate { JJ . Mute ( ) ; } ) ) ;
RockersInput riffComp = Instantiate ( rockerInputRef , transform ) ;
riffComp . Init ( e [ "gcS" ] , new int [ 6 ] { e [ "1S" ] , e [ "2S" ] , e [ "3S" ] , e [ "4S" ] , e [ "5S" ] , e [ "6S" ] } , beat , e . beat - beat ,
( PremadeSamples ) e [ "sampleS" ] , e [ "pitchSampleS" ] ) ;
2024-01-09 16:55:00 +00:00
if ( e . length < = 0.5f ) ScheduleInput ( beat , e . beat - beat + e . length , InputAction_BasicPress , JustMute , MuteMiss , Empty ) ;
else ScheduleAutoplayInput ( beat , e . beat - beat + e . length , InputAction_BasicPress , JustMute , MuteMiss , Empty ) ;
2023-05-29 20:09:34 +00:00
}
else
{
actions . Add ( new BeatAction . Action ( e . beat , delegate
{
JJ . StrumStrings ( e [ "gcJJ" ] , new int [ 6 ]
{
e [ "1JJ" ] ,
e [ "2JJ" ] ,
e [ "3JJ" ] ,
e [ "4JJ" ] ,
e [ "5JJ" ] ,
e [ "6JJ" ] ,
} , ( PremadeSamples ) e [ "sampleJJ" ] , e [ "pitchSampleJJ" ] , false , true ) ;
} ) ) ;
actions . Add ( new BeatAction . Action ( e . beat + e . length , delegate { JJ . Mute ( ) ; } ) ) ;
RockersInput riffComp = Instantiate ( rockerInputRef , transform ) ;
riffComp . Init ( e [ "gcS" ] , new int [ 6 ] { e [ "1S" ] , e [ "2S" ] , e [ "3S" ] , e [ "4S" ] , e [ "5S" ] , e [ "6S" ] } , beat , e . beat - beat ,
( PremadeSamples ) e [ "sampleS" ] , e [ "pitchSampleS" ] , true ) ;
2024-01-09 16:55:00 +00:00
if ( e . length < = 0.5f ) ScheduleInput ( beat , e . beat - beat + e . length , InputAction_BasicPress , JustMute , MuteMiss , Empty ) ;
else ScheduleAutoplayInput ( beat , e . beat - beat + e . length , InputAction_BasicPress , JustMute , MuteMiss , Empty ) ;
2023-05-29 20:09:34 +00:00
break ;
}
}
2023-09-11 22:28:04 +00:00
BeatAction . New ( instance , actions ) ;
2023-05-29 20:09:34 +00:00
}
2023-06-28 04:51:53 +00:00
public static void PreInterval ( double beat , float length , bool autoPassTurn , bool moveCamera , bool movePass )
2023-05-29 20:09:34 +00:00
{
if ( GameManager . instance . currentGame = = "rockers" )
{
if ( moveCamera ) instance . MoveCamera ( beat - 1 ) ;
2023-06-28 04:51:53 +00:00
instance . StartInterval ( beat , length , beat , autoPassTurn , movePass ) ;
2023-05-29 20:09:34 +00:00
}
2023-08-12 03:32:22 +00:00
else
2023-06-28 04:51:53 +00:00
{
2023-08-12 03:32:22 +00:00
queuedIntervals . Add ( new QueuedInterval ( )
{
beat = beat ,
length = length ,
autoPassTurn = autoPassTurn ,
moveCamera = moveCamera ,
moveCameraPass = movePass
} ) ;
}
if ( moveCamera ) queuedCameraEvents . Add ( beat - 1 ) ;
2023-05-29 20:09:34 +00:00
}
2023-06-10 19:13:29 +00:00
private void MoveCamera ( double beat )
2023-05-29 20:09:34 +00:00
{
2023-11-21 16:57:03 +00:00
lastTargetCameraX = GameCamera . AdditionalPosition . x ;
2023-05-29 20:09:34 +00:00
targetCameraX = JJ . transform . localPosition . x ;
cameraMoveBeat = beat ;
}
2023-06-28 04:51:53 +00:00
public void StartInterval ( double beat , float length , double gameSwitchBeat , bool autoPassTurn , bool moveCamera )
2023-05-29 20:09:34 +00:00
{
2023-06-28 04:51:53 +00:00
List < RiqEntity > relevantInputs = GrabAllInputsBetween ( beat , beat + length ) ;
List < double > riffUsedBeats = new List < double > ( ) ;
List < double > bendUsedBeats = new ( ) ;
2023-10-29 19:44:47 +00:00
foreach ( var input in relevantInputs )
{
2023-06-28 04:51:53 +00:00
if ( input . datamodel = = "rockers/riff" )
{
RiqEntity foundEvent = riffEvents . Find ( x = > x . beat = = input . beat ) ;
if ( ( foundEvent = = null | | ( riffUsedBeats . Count > 0 & & riffUsedBeats . Contains ( ( float ) foundEvent . beat ) ) ) & & riffEvents . Count > 1 ) continue ;
riffUsedBeats . Add ( input . beat ) ;
if ( input . beat > = gameSwitchBeat )
{
2023-09-11 22:28:04 +00:00
BeatAction . New ( instance , new List < BeatAction . Action > ( )
2023-06-28 04:51:53 +00:00
{
new BeatAction . Action ( input . beat , delegate { Riff ( input . beat , input . length , new int [ ]
{
input [ "1JJ" ] ,
input [ "2JJ" ] ,
input [ "3JJ" ] ,
input [ "4JJ" ] ,
input [ "5JJ" ] ,
input [ "6JJ" ] ,
} , input [ "gcJJ" ] , input [ "sampleJJ" ] , input [ "pitchSampleJJ" ] , ! input [ "respond" ] ) ;
} )
} ) ;
}
}
else
{
if ( riffEvents . Count = = 0 ) continue ;
2023-07-12 16:49:32 +00:00
RiqEntity foundEvent = bendEvents . Find ( x = > x . beat = = input . beat ) ;
2023-06-28 04:51:53 +00:00
if ( ( foundEvent = = null | | ( bendUsedBeats . Count > 0 & & bendUsedBeats . Contains ( ( float ) foundEvent . beat ) ) ) & & bendEvents . Count > 1 ) continue ;
2023-07-12 16:49:32 +00:00
RiqEntity riffEventToCheck = riffEvents . Find ( x = > input . beat > = x . beat & & input . beat < x . beat + x . length ) ;
2023-06-28 04:51:53 +00:00
if ( riffEventToCheck = = null ) continue ;
bendUsedBeats . Add ( beat ) ;
if ( input . beat > = gameSwitchBeat )
{
2023-09-11 22:28:04 +00:00
BeatAction . New ( instance , new List < BeatAction . Action > ( )
2023-06-28 04:51:53 +00:00
{
new BeatAction . Action ( input . beat , delegate
{
Bend ( input . beat , input . length , input [ "1JJ" ] ) ;
} )
} ) ;
}
}
}
2023-09-11 22:28:04 +00:00
BeatAction . New ( instance , new List < BeatAction . Action > ( )
2023-05-29 20:09:34 +00:00
{
new BeatAction . Action ( beat , delegate
{
2023-06-28 04:51:53 +00:00
if ( GameManager . instance . autoplay ) Soshi . UnHold ( ) ;
2023-05-29 20:09:34 +00:00
if ( JJ . together | | Soshi . together )
{
JJ . ReturnBack ( ) ;
if ( prepareBeatsJJ . Count > 0 & & prepareBeatsJJ . Contains ( beat ) ) JJ . Mute ( false ) ;
Soshi . ReturnBack ( ) ;
}
2023-06-28 04:51:53 +00:00
} ) ,
2023-05-29 20:09:34 +00:00
} ) ;
2023-08-12 03:32:22 +00:00
if ( autoPassTurn & & beat + ( length * 2 ) > gameSwitchBeat ) PassTurn ( beat + length , moveCamera , beat , length ) ;
2023-05-29 20:09:34 +00:00
}
2023-06-28 04:51:53 +00:00
public void Riff ( double beat , float length , int [ ] pitches , bool gleeClubJJ , int sampleJJ , int sampleTonesJJ , bool noRespond )
2023-05-29 20:09:34 +00:00
{
JJ . StrumStrings ( gleeClubJJ , pitches , ( PremadeSamples ) sampleJJ , sampleTonesJJ , noRespond ) ;
2023-09-11 22:28:04 +00:00
BeatAction . New ( instance , new List < BeatAction . Action > ( )
2023-05-29 20:09:34 +00:00
{
new BeatAction . Action ( beat + length , delegate { JJ . Mute ( ) ; } )
} ) ;
2023-06-28 04:51:53 +00:00
/ *
2023-05-29 20:09:34 +00:00
if ( noRespond ) return ;
crHandlerInstance . AddEvent ( beat , length , "riff" , new List < CallAndResponseHandler . CallAndResponseEventParam > ( )
{
new CallAndResponseHandler . CallAndResponseEventParam ( "gleeClub" , gleeClubPlayer ) ,
new CallAndResponseHandler . CallAndResponseEventParam ( "1" , pitchesPlayer [ 0 ] ) ,
new CallAndResponseHandler . CallAndResponseEventParam ( "2" , pitchesPlayer [ 1 ] ) ,
new CallAndResponseHandler . CallAndResponseEventParam ( "3" , pitchesPlayer [ 2 ] ) ,
new CallAndResponseHandler . CallAndResponseEventParam ( "4" , pitchesPlayer [ 3 ] ) ,
new CallAndResponseHandler . CallAndResponseEventParam ( "5" , pitchesPlayer [ 4 ] ) ,
new CallAndResponseHandler . CallAndResponseEventParam ( "6" , pitchesPlayer [ 5 ] ) ,
new CallAndResponseHandler . CallAndResponseEventParam ( "sample" , sampleSoshi ) ,
new CallAndResponseHandler . CallAndResponseEventParam ( "sampleTones" , sampleTonesSoshi )
} ) ;
2023-06-28 04:51:53 +00:00
* /
2023-05-29 20:09:34 +00:00
}
2023-06-28 04:51:53 +00:00
public void Bend ( double beat , float length , int pitchJJ )
2023-05-29 20:09:34 +00:00
{
JJ . BendUp ( pitchJJ ) ;
2023-09-11 22:28:04 +00:00
BeatAction . New ( instance , new List < BeatAction . Action > ( )
2023-05-29 20:09:34 +00:00
{
new BeatAction . Action ( beat + length , delegate { JJ . BendDown ( ) ; } )
} ) ;
}
public void Mute ( int whoMutes )
{
if ( whoMutes is ( int ) WhoMutes . JJ or ( int ) WhoMutes . Both )
{
JJ . Mute ( ) ;
}
if ( whoMutes is ( int ) WhoMutes . Soshi or ( int ) WhoMutes . Both )
{
if ( GameManager . instance . autoplay ) Soshi . Mute ( ) ;
}
}
2023-06-03 14:51:30 +00:00
public void UnMute ( int whoMutes )
{
if ( whoMutes is ( int ) WhoMutes . JJ or ( int ) WhoMutes . Both )
{
JJ . UnHold ( true ) ;
}
if ( whoMutes is ( int ) WhoMutes . Soshi or ( int ) WhoMutes . Both )
{
if ( GameManager . instance . autoplay ) Soshi . UnHold ( true ) ;
}
}
2023-06-13 14:13:08 +00:00
public static void PrePassTurn ( double beat , bool moveCamera )
2023-05-29 20:09:34 +00:00
{
2023-06-13 14:13:08 +00:00
if ( GameManager . instance . currentGame = = "rockers" )
2023-05-29 20:09:34 +00:00
{
2023-06-28 04:51:53 +00:00
instance . StandalonePassTurn ( beat , moveCamera ) ;
2023-06-13 14:13:08 +00:00
}
else
{
passedTurns . Add ( new QueuedPassTurn
2023-05-29 20:09:34 +00:00
{
2023-06-13 14:13:08 +00:00
beat = beat ,
moveCamera = moveCamera
} ) ;
}
}
2023-06-28 04:51:53 +00:00
private void StandalonePassTurn ( double beat , bool moveCamera )
{
2023-07-12 16:49:32 +00:00
RiqEntity lastInterval = GetLastIntervalBeforeBeat ( beat ) ;
if ( lastInterval = = null ) return ;
PassTurn ( beat , moveCamera , lastInterval . beat , lastInterval . length ) ;
2023-06-28 04:51:53 +00:00
}
2023-07-12 16:49:32 +00:00
private void PassTurn ( double beat , bool moveCamera , double intervalStartBeat , float intervalLength )
2023-06-13 14:13:08 +00:00
{
2023-07-12 16:49:32 +00:00
var relevantInputs = GrabAllInputsBetween ( intervalStartBeat , intervalStartBeat + intervalLength ) ;
if ( relevantInputs . Count > 0 )
2023-06-13 14:13:08 +00:00
{
2023-09-11 22:28:04 +00:00
BeatAction . New ( instance , new List < BeatAction . Action > ( )
2023-06-12 10:03:21 +00:00
{
2023-06-28 04:51:53 +00:00
new BeatAction . Action ( beat - 1 , delegate
{
if ( moveCamera )
{
2023-11-21 16:57:03 +00:00
lastTargetCameraX = GameCamera . AdditionalPosition . x ;
2023-06-28 04:51:53 +00:00
targetCameraX = Soshi . transform . localPosition . x ;
cameraMoveBeat = beat - 1 ;
}
} ) ,
new BeatAction . Action ( beat - 0.25 , delegate
2023-06-13 14:13:08 +00:00
{
2023-07-12 16:49:32 +00:00
List < double > riffUsedBeats = new List < double > ( ) ;
List < double > bendUsedBeats = new ( ) ;
foreach ( var crEvent in relevantInputs )
2023-06-13 14:13:08 +00:00
{
2023-07-12 16:49:32 +00:00
if ( ! crEvent [ "respond" ] ) continue ;
double relativeBeat = crEvent . beat - intervalStartBeat ;
if ( crEvent . datamodel = = "rockers/riff" )
2023-06-13 14:13:08 +00:00
{
2023-07-12 16:49:32 +00:00
RiqEntity foundEvent = riffEvents . Find ( x = > x . beat = = crEvent . beat ) ;
if ( ( foundEvent = = null | | ( riffUsedBeats . Count > 0 & & riffUsedBeats . Contains ( ( float ) foundEvent . beat ) ) ) & & riffEvents . Count > 1 ) continue ;
riffUsedBeats . Add ( crEvent . beat ) ;
2023-06-13 14:13:08 +00:00
RockersInput riffComp = Instantiate ( rockerInputRef , transform ) ;
2023-07-12 16:49:32 +00:00
riffComp . Init ( crEvent [ "gcS" ] , new int [ 6 ] { crEvent [ "1S" ] , crEvent [ "2S" ] , crEvent [ "3S" ] , crEvent [ "4S" ] , crEvent [ "5S" ] , crEvent [ "6S" ] } , beat , relativeBeat ,
( PremadeSamples ) crEvent [ "sampleS" ] , crEvent [ "pitchSampleS" ] ) ;
2023-10-29 19:44:47 +00:00
if ( crEvent . length > 0.5f ) ScheduleAutoplayInput ( beat , relativeBeat + crEvent . length , InputAction_BasicPress , JustMute , MuteMiss , Empty ) ;
else ScheduleInput ( beat , relativeBeat + crEvent . length , InputAction_BasicPress , JustMute , MuteMiss , Empty ) ;
2023-06-13 14:13:08 +00:00
}
2023-07-12 16:49:32 +00:00
else
2023-06-13 14:13:08 +00:00
{
2023-07-12 16:49:32 +00:00
if ( riffEvents . Count = = 0 ) continue ;
RiqEntity foundEvent = bendEvents . Find ( x = > x . beat = = crEvent . beat ) ;
if ( ( foundEvent = = null | | ( bendUsedBeats . Count > 0 & & bendUsedBeats . Contains ( ( float ) foundEvent . beat ) ) ) & & bendEvents . Count > 1 ) continue ;
RiqEntity riffEventToCheck = riffEvents . Find ( x = > crEvent . beat > = x . beat & & crEvent . beat < x . beat + x . length ) ;
if ( riffEventToCheck = = null ) continue ;
bendUsedBeats . Add ( beat ) ;
2023-06-13 14:13:08 +00:00
RockerBendInput bendComp = Instantiate ( rockerBendInputRef , transform ) ;
2023-07-12 16:49:32 +00:00
bendComp . Init ( crEvent [ "1S" ] , beat , relativeBeat ) ;
2023-10-29 19:44:47 +00:00
ScheduleAutoplayInput ( beat , relativeBeat + crEvent . length , InputAction_TriggerUp , JustUnBend , UnBendMiss , Empty ) ;
2023-06-13 14:13:08 +00:00
}
}
} ) ,
2023-10-29 19:44:47 +00:00
new BeatAction . Action ( beat , delegate
{
2023-06-12 10:03:21 +00:00
JJ . UnHold ( ) ;
} )
2023-05-29 20:09:34 +00:00
} ) ;
}
}
private void JustMute ( PlayerActionEvent caller , float state )
{
Soshi . Mute ( ) ;
2023-10-29 19:44:47 +00:00
}
2023-05-29 20:09:34 +00:00
private void MuteMiss ( PlayerActionEvent caller )
{
JJ . Miss ( ) ;
}
private void JustUnBend ( PlayerActionEvent caller , float state )
{
Soshi . BendDown ( ) ;
}
private void UnBendMiss ( PlayerActionEvent caller )
{
JJ . Miss ( ) ;
}
private void Empty ( PlayerActionEvent caller )
{
}
}
}