HeavenStudio/Assets/Scripts/InputSystem/PlayerInput.cs
Rapandrasmus 98835c3936
Title Screen (#454)
* Barebones title screen prefab added

* logo and stuff

* cool

* Added sfx to title screen

* The logo now bops to the beat

* epic reveal

* Fixed something

* put some of the stuff into the main menu

* other logo bop

* Implemented logobop2 and starbop

* added scrolling bg, tweaked positioning and wip splash text for play button

* more menu

* ooops

* Expand implemented

* cool

* Made stars spawn in in the opening

* make UI elements look nicer on different aspect ratios

* add sound while hovering over logo

* add settings menu to title screen

make the title screen properly play after the opening

* swap out title screen hover sound

remove the old config path warning

* every button works, some play mode fixes

* fix issues with beataction/multisound and pausing

* fix dropdown menus not working in certain screens

* fix particles rotating when camera controls are used

* touch style pause menu items only trigger if cursor is over an item

* various changes

make playback (unpausing) more reliable
only apply changes to advanced audio settings on launch
fix title screen visuals
add opening music
continue past opening by pressing a key
update credits

* almost forgot this

* lol

* initial flow mems

* user-taggable fonts in textboxes

* alt materials for kurokane

* assets prep

* plan out judgement screen layout

change sound encodings

* start sequencing judgement

* judgement screen sequence

* full game loop

* fix major issue with pooled sound objects

rebalance ranking audio
fix issues with some effects in play mode

* new graphics

* particles

* make certain uses of the beat never go below 0

fix loop of superb music

* make markers non clamped

lockstep frees rendertextures when unloading

* lockstep creates its own rendertextures

swapped button order on title screen
added null checks to animation helpers
disabled controller auto-search for now

* enable particles on OK rank

* play mode info panel

* let play mode handle its own fade out

* fix that alignment bug in controller settings

* more safety here

* Update PauseMenu.cs

* settable (one-liner) rating screen text

* address minigame loading crashes

* don't do this twice

* wav converter for mp3

* Update Minigames.cs

* don't double-embed the converted audio

* studio dance bugfixing spree

* import redone sprites for studio dance

* update jukebox

prep epilogue screen

* epilogue screen

* studio dance inkling shuffle test

* new studio dance choreo system

* markers upgrade

* fix deleting volume changes and markers

prep category markers

* Update Editor.unity

* new rating / epilogue settings look

* update to use new tooltip system

mark certain editor components as blocking

* finish category system

* dedicated tempo / volume marker dialogs

* swing prep

* open properties dialog if mapper hasn't opened it prior for this chart

fix memory copy bug when making new chart

* fix ctrl + s

* return to title screen button

* make graphy work everywhere

studio dance selector
membillion mems

* make sure riq cache is clear when loading chart

* lol

* fix the stupid

* bring back tempo and volume change scrolling

* new look for panels

* adjust alignment

* round tooltip

* alignment of chart property prefab

* change scale factor of mem

* adjust open captions material

no dotted BG in results commentary (only epilogue)
bugfix for tempo / volume scroll

* format line 2 of judgement a bit better

update font

* oops

* adjust look of judgement score bar

* new rating bar

* judgement size adjustment

* fix timing window scaling with song pitch

* proper clamping in dialogs

better sync conductor to dsptime (experiment)

* disable timeline pitch change when song is paused

enable perfect challenge if no marker is set to do so

* new app icon

* timing window values are actually double now

* improve deferred timekeep even more

* re-generate font atlases

new app icon in credits

* default epilogue images

* more timing window adjustment

* fix timing display when pitched

* use proper terminology here

* new logo on titlescreen

* remove wip from play

update credits

* adjust spacing of play mode panel

* redo button spacing

* can pass title screen with any controller

fix issues with controller auto-search

* button scale fixes

* controller title screen nav

* remove song genre from properties editor

* disable circle cursor when not using touch style

* proper selection graphic

remove refs
re-add heart to the opening

* controller support in opening

---------

Co-authored-by: ev <85412919+evdial@users.noreply.github.com>
Co-authored-by: minenice55 <star.elementa@gmail.com>
Co-authored-by: ThatZeoMan <67521686+ThatZeoMan@users.noreply.github.com>
2023-12-26 05:22:51 +00:00

388 lines
13 KiB
C#

using System;
using System.Linq;
using System.Reflection;
using System.IO;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using HeavenStudio.InputSystem;
using static JSL;
using HeavenStudio.Games;
using System.Diagnostics.Contracts;
namespace HeavenStudio.InputSystem
{
public class LoadOrder : Attribute
{
public int Order { get; set; }
public LoadOrder(int order)
{
Order = order;
}
}
}
namespace HeavenStudio
{
public class PlayerInput
{
public class InputAction
{
public delegate bool ActionQuery(out double dt);
public string name;
public int[] inputLockCategory;
public ActionQuery padAction, touchAction, batonAction;
public InputAction(string name, int[] inputLockCategory, ActionQuery pad, ActionQuery touch, ActionQuery baton)
{
this.name = name;
this.inputLockCategory = inputLockCategory;
padAction = pad;
touchAction = touch;
batonAction = baton;
}
}
public static InputController.ControlStyles CurrentControlStyle = InputController.ControlStyles.Pad;
static List<InputController> inputDevices;
public delegate InputController[] InputControllerInitializer();
public delegate void InputControllerDispose();
public static event InputControllerDispose PlayerInputCleanUp;
public delegate InputController[] InputControllerRefresh();
public static List<InputControllerRefresh> PlayerInputRefresh;
static List<InputControllerInitializer> loadRunners;
static void BuildLoadRunnerList()
{
PlayerInputRefresh = new();
loadRunners = System.Reflection.Assembly.GetExecutingAssembly()
.GetTypes()
.Where(x => x.Namespace == "HeavenStudio.InputSystem.Loaders" && x.GetMethod("Initialize", BindingFlags.Public | BindingFlags.Static) != null)
.Select(t => (InputControllerInitializer)Delegate.CreateDelegate(
typeof(InputControllerInitializer),
null,
t.GetMethod("Initialize", BindingFlags.Public | BindingFlags.Static),
false
))
.ToList();
loadRunners.Sort((x, y) => x.Method.GetCustomAttribute<LoadOrder>().Order.CompareTo(y.Method.GetCustomAttribute<LoadOrder>().Order));
}
public static int InitInputControllers()
{
inputDevices = new List<InputController>();
BuildLoadRunnerList();
foreach (InputControllerInitializer runner in loadRunners)
{
InputController[] controllers = runner();
if (controllers != null)
{
inputDevices.AddRange(controllers);
}
}
return inputDevices.Count;
}
public static int RefreshInputControllers()
{
inputDevices = new List<InputController>();
if (PlayerInputRefresh != null)
{
foreach (InputControllerRefresh runner in PlayerInputRefresh)
{
InputController[] controllers = runner();
if (controllers != null)
{
inputDevices.AddRange(controllers);
}
}
}
return inputDevices.Count;
}
public static int GetNumControllersConnected()
{
return inputDevices.Count;
}
public static List<InputController> GetInputControllers()
{
return inputDevices;
}
public static InputController GetInputController(int player)
{
// Needed so Keyboard works on MacOS and Linux
#if UNITY_STANDALONE_OSX || UNITY_EDITOR_OSX || UNITY_EDITOR_LINUX || UNITY_STANDALONE_LINUX
inputDevices = new List<InputController>();
if(inputDevices.Count < 1)
{
InputKeyboard keyboard = new InputKeyboard();
keyboard.SetPlayer(1);
keyboard.InitializeController();
inputDevices.Add(keyboard);
}
#endif
//select input controller that has player field set to player
//this will return the first controller that has that player number in the case of controller pairs (eg. Joy-Cons)
//so such controllers should have a reference to the other controller in the pair
foreach (InputController i in inputDevices)
{
if (i.GetPlayer() == player)
{
return i;
}
}
return null;
}
public static int GetInputControllerId(int player)
{
//select input controller id that has player field set to player
//this will return the first controller that has that player number in the case of controller pairs (eg. Joy-Cons)
//so such controllers should have a reference to the other controller in the pair
//controller IDs are determined by connection order (the Keyboard is always first)
// Needed so Keyboard works on MacOS and Linux
#if UNITY_STANDALONE_OSX || UNITY_EDITOR_OSX || UNITY_EDITOR_LINUX || UNITY_STANDALONE_LINUX
inputDevices = new List<InputController>();
if(inputDevices.Count < 1)
{
InputKeyboard keyboard = new InputKeyboard();
keyboard.SetPlayer(1);
keyboard.InitializeController();
inputDevices.Add(keyboard);
}
#endif
for (int i = 0; i < inputDevices.Count; i++)
{
if (inputDevices[i].GetPlayer() == player)
{
return i;
}
}
return -1;
}
public static void UpdateInputControllers()
{
// Needed so Keyboard works on MacOS and Linux
#if UNITY_STANDALONE_OSX || UNITY_EDITOR_OSX || UNITY_EDITOR_LINUX || UNITY_STANDALONE_LINUX
inputDevices = new List<InputController>();
if(inputDevices.Count < 1)
{
InputKeyboard keyboard = new InputKeyboard();
keyboard.SetPlayer(1);
keyboard.InitializeController();
inputDevices.Add(keyboard);
}
#endif
foreach (InputController i in inputDevices)
{
i.UpdateState();
}
}
public static void CleanUp()
{
PlayerInputCleanUp?.Invoke();
}
// The autoplay isn't activated AND
// The song is actually playing AND
// The GameManager allows you to Input
public static bool PlayerHasControl()
{
if (GameManager.instance == null || Conductor.instance == null) return true;
return !GameManager.instance.autoplay && Conductor.instance.isPlaying && GameManager.instance.canInput;
}
/*--------------------*/
/* MAIN INPUT METHODS */
/*--------------------*/
public static bool GetIsAction(InputAction action, out double dt)
{
dt = 0;
switch (CurrentControlStyle)
{
case InputController.ControlStyles.Pad:
return action.padAction(out dt);
case InputController.ControlStyles.Touch:
return action.touchAction(out dt);
case InputController.ControlStyles.Baton:
return action.batonAction(out dt);
}
return false;
}
public static bool GetIsAction(InputAction action)
{
switch (CurrentControlStyle)
{
case InputController.ControlStyles.Pad:
return action.padAction(out _);
case InputController.ControlStyles.Touch:
return action.touchAction(out _);
case InputController.ControlStyles.Baton:
return action.batonAction(out _);
}
return false;
}
public static bool GetPadDown(InputController.ActionsPad ac, out double dt)
{
bool a = GetInputController(1).GetActionDown(InputController.ControlStyles.Pad, (int)ac, out dt);
return a && PlayerHasControl();
}
public static bool GetPadDown(InputController.ActionsPad ac)
{
bool a = GetInputController(1).GetActionDown(InputController.ControlStyles.Pad, (int)ac, out _);
return a && PlayerHasControl();
}
public static bool GetPadUp(InputController.ActionsPad ac, out double dt)
{
bool a = GetInputController(1).GetActionUp(InputController.ControlStyles.Pad, (int)ac, out dt);
return a && PlayerHasControl();
}
public static bool GetPadUp(InputController.ActionsPad ac)
{
bool a = GetInputController(1).GetActionUp(InputController.ControlStyles.Pad, (int)ac, out _);
return a && PlayerHasControl();
}
public static bool GetPad(InputController.ActionsPad ac)
{
bool a = GetInputController(1).GetAction(InputController.ControlStyles.Pad, (int)ac);
return a && PlayerHasControl();
}
public static bool GetBatonDown(InputController.ActionsBaton ac, out double dt)
{
bool a = GetInputController(1).GetActionDown(InputController.ControlStyles.Baton, (int)ac, out dt);
return a && PlayerHasControl();
}
public static bool GetBatonDown(InputController.ActionsBaton ac)
{
bool a = GetInputController(1).GetActionDown(InputController.ControlStyles.Baton, (int)ac, out _);
return a && PlayerHasControl();
}
public static bool GetBatonUp(InputController.ActionsBaton ac, out double dt)
{
bool a = GetInputController(1).GetActionUp(InputController.ControlStyles.Baton, (int)ac, out dt);
return a && PlayerHasControl();
}
public static bool GetBatonUp(InputController.ActionsBaton ac)
{
bool a = GetInputController(1).GetActionUp(InputController.ControlStyles.Baton, (int)ac, out _);
return a && PlayerHasControl();
}
public static bool GetBaton(InputController.ActionsBaton ac)
{
bool a = GetInputController(1).GetAction(InputController.ControlStyles.Baton, (int)ac);
return a && PlayerHasControl();
}
public static bool GetSqueeze()
{
bool a = GetInputController(1).GetSqueeze();
return a && PlayerHasControl();
}
public static bool GetSqueezeDown()
{
bool a = GetInputController(1).GetSqueezeDown(out _);
return a && PlayerHasControl();
}
public static bool GetSqueezeDown(out double dt)
{
bool a = GetInputController(1).GetSqueezeDown(out dt);
return a && PlayerHasControl();
}
public static bool GetSqueezeUp()
{
bool a = GetInputController(1).GetSqueezeUp(out _);
return a && PlayerHasControl();
}
public static bool GetSqueezeUp(out double dt)
{
bool a = GetInputController(1).GetSqueezeUp(out dt);
return a && PlayerHasControl();
}
public static bool GetTouchDown(InputController.ActionsTouch ac, out double dt)
{
bool a = GetInputController(1).GetActionDown(InputController.ControlStyles.Touch, (int)ac, out dt);
return a && PlayerHasControl();
}
public static bool GetTouchDown(InputController.ActionsTouch ac)
{
bool a = GetInputController(1).GetActionDown(InputController.ControlStyles.Touch, (int)ac, out _);
return a && PlayerHasControl();
}
public static bool GetTouchUp(InputController.ActionsTouch ac, out double dt)
{
bool a = GetInputController(1).GetActionUp(InputController.ControlStyles.Touch, (int)ac, out dt);
return a && PlayerHasControl();
}
public static bool GetTouchUp(InputController.ActionsTouch ac)
{
bool a = GetInputController(1).GetActionUp(InputController.ControlStyles.Touch, (int)ac, out _);
return a && PlayerHasControl();
}
public static bool GetTouch(InputController.ActionsTouch ac)
{
bool a = GetInputController(1).GetAction(InputController.ControlStyles.Touch, (int)ac);
return a && PlayerHasControl();
}
public static bool GetSlide()
{
bool a = GetInputController(1).GetSlide(out _);
return a && PlayerHasControl();
}
public static bool GetSlide(out double dt)
{
bool a = GetInputController(1).GetSlide(out dt);
return a && PlayerHasControl();
}
public static bool GetFlick()
{
bool a = GetInputController(1).GetFlick(out _);
return a && PlayerHasControl();
}
public static bool GetFlick(out double dt)
{
bool a = GetInputController(1).GetFlick(out dt);
return a && PlayerHasControl();
}
}
}