using Photon.Pun; using System; using System.Collections.Generic; using System.Collections; using UnityEngine; using System.Linq; public class UserSelectionManager : MonoBehaviourPunCallbacks { bool _endSelect = false; int _selectedIntValue = 0; bool _isLocal = false; bool _selectedBoolValue => getBoolFromInt(_selectedIntValue); public int SelectedIntValue => _selectedIntValue; public bool SelectedBoolValue => _selectedBoolValue; Player _selectPlayer; [PunRPC] public void SetIntForPlayer(int playerID, int value) { Player selectionPlayer = GManager.instance.GetPlayerFromID(playerID); if (selectionPlayer == null) { return; } selectionPlayer.QueuePlayerSelection(new ValueSelection(value)); } public void SetInt(int value) { _selectedIntValue = value; _endSelect = true; } protected void SetInt_RPC(int playerID, int value) { photonView.RPC("SetIntForPlayer", RpcTarget.All, playerID, value); } [PunRPC] public void SetBoolForPlayer(int playerID, bool value) { Player selectionPlayer = GManager.instance.GetPlayerFromID(playerID); if (selectionPlayer == null) { return; } selectionPlayer.QueuePlayerSelection(new ValueSelection(value)); } public void SetBool(bool value) { _selectedIntValue = getIntFromBool(value); _endSelect = true; } protected void SetBool_RPC(int playerID, bool value) { photonView.RPC("SetBoolForPlayer", RpcTarget.All, playerID, value); } internal int getIntFromBool(bool value) { return value ? 1 : 0; } internal bool getBoolFromInt(int value) { return value != 0; } public IEnumerator WaitForEndSelect() { if (_selectPlayer != null) { yield return new WaitUntil(() => _selectPlayer.HasPlayerSelection()); ValueSelection valueSeletion = _selectPlayer.DequeuePlayerSelection(); if (valueSeletion != null) { _selectedIntValue = valueSeletion.ValueAsInt(); } } else { yield return new WaitWhile(() => !_endSelect); } _endSelect = false; _selectPlayer = null; GManager.instance.commandText.CloseCommandText(); yield return new WaitWhile(() => GManager.instance.commandText.gameObject.activeSelf); } public void SetIntSelection(List> selectionElements, Player selectPlayer, string selectPlayerMessage, string notSelectPlayerMessage, bool IsLocal = false) { _endSelect = false; _selectedIntValue = 0; _selectPlayer = selectPlayer; _isLocal = IsLocal; if (selectPlayer.isYou) { GManager.instance.commandText.OpenCommandText(selectPlayerMessage); List command_SelectCommands = new List(); foreach (SelectionElement selectionElement in selectionElements) { command_SelectCommands.Add(new Command_SelectCommand(selectionElement.Message, () => SendSelection(selectionElement.Value), selectionElement.SpriteIndex)); } GManager.instance.selectCommandPanel.SetUpCommandButton(command_SelectCommands); } else { GManager.instance.commandText.OpenCommandText(notSelectPlayerMessage); #region AIモード if (GManager.instance.IsAI) { List canSelectValue = new List(); foreach (SelectionElement selectionElement in selectionElements) { canSelectValue.Add(selectionElement.Value); } int value = canSelectValue.Count >= 1 ? canSelectValue[UnityEngine.Random.Range(0, canSelectValue.Count)] : 0; SendSelection(value); } #endregion } void SendSelection(int value) { if (_isLocal) { SetIntForPlayer(selectPlayer.PlayerID, value); } else { SetInt_RPC(selectPlayer.PlayerID, value); } } } public void SetBoolSelection(List> selectionElements, Player selectPlayer, string selectPlayerMessage, string notSelectPlayerMessage, bool IsLocal = false) { _endSelect = false; _selectedIntValue = 0; _selectPlayer = selectPlayer; _isLocal = IsLocal; if (selectPlayer.isYou) { GManager.instance.commandText.OpenCommandText(selectPlayerMessage); List command_SelectCommands = new List(); foreach (SelectionElement selectionElement in selectionElements) { command_SelectCommands.Add(new Command_SelectCommand(selectionElement.Message, () => SendSelection(selectionElement.Value), selectionElement.SpriteIndex)); } GManager.instance.selectCommandPanel.SetUpCommandButton(command_SelectCommands); } else { GManager.instance.commandText.OpenCommandText(notSelectPlayerMessage); #region AIモード if (GManager.instance.IsAI) { List canSelectValue = new List(); foreach (SelectionElement selectionElement in selectionElements) { canSelectValue.Add(selectionElement.Value); } bool value = canSelectValue.Count >= 1 ? canSelectValue[UnityEngine.Random.Range(0, canSelectValue.Count)] : false; SendSelection(value); } #endregion } void SendSelection(bool value) { if (_isLocal) { SetBoolForPlayer(selectPlayer.PlayerID, value); } else { SetBool_RPC(selectPlayer.PlayerID, value); } } } } public class SelectionElement { public SelectionElement(string message, T value, int spriteIndex) { this.Message = message; this.Value = value; this.SpriteIndex = spriteIndex; } public string Message { get; private set; } public T Value { get; private set; } public int SpriteIndex { get; private set; } }