173 lines
5.6 KiB
C#
173 lines
5.6 KiB
C#
using CharacterSystem;
|
||
using System.Collections;
|
||
using System.Collections.Generic;
|
||
using TMPro;
|
||
using UnityEngine;
|
||
|
||
public class Avatar : MonoBehaviour
|
||
{
|
||
[SerializeField] Sprite chipImage;
|
||
[SerializeField] GameObject messageBoxPrefab;
|
||
[SerializeField] AudioClip botVoice;
|
||
[SerializeField] float culldownTime = 2;
|
||
[SerializeField] AnimationClip chipSpawnClip;
|
||
|
||
public Animator Animator => animator ?? GetComponent<Animator>();
|
||
public Sprite ChipImage => chipImage;
|
||
|
||
public float ChipSpawnTime => chipSpawnClip.length;
|
||
|
||
|
||
|
||
private AudioSource audioSource;
|
||
private Animator animator;
|
||
private GameObject currentMessageBox;
|
||
|
||
private bool nowTyping = false;
|
||
private Team team;
|
||
|
||
#region REPLICAS_LISTS
|
||
[Header("Появление")]
|
||
[Range(0, 1)] public float appearChance = 1;
|
||
[SerializeField] List<Replica> appearReplicas;
|
||
private List<Replica> appearReplicasTemp;
|
||
|
||
[Header("Мой ход начался")]
|
||
[Range(0, 1)] public float playerTurnChance = 1;
|
||
[SerializeField] List<Replica> MyTurnStartReplicas;
|
||
private List<Replica> MyTurnStartReplicasTemp;
|
||
|
||
[Header("Мой ход закончился")]
|
||
[Range(0, 1)] public float botTurnChance = 1;
|
||
[SerializeField] List<Replica> MyTurnEndsReplicas;
|
||
private List<Replica> MyTurnEndsReplicasTemp;
|
||
|
||
[Header("Я выиграл")]
|
||
[Range(0, 1)] public float playerWinChance = 1;
|
||
[SerializeField] List<Replica> WinReplicas;
|
||
private List<Replica> WinReplicasTemp;
|
||
|
||
[Header("Я проиграл")]
|
||
[Range(0, 1)] public float botWinChance = 1;
|
||
[SerializeField] List<Replica> LoseReplicas;
|
||
private List<Replica> LoseReplicasTemp;
|
||
|
||
|
||
[Header("Ничья (редко)")]
|
||
[Range(0, 1)] public float drawChance = 1;
|
||
[SerializeField] List<Replica> drawReplicas;
|
||
private List<Replica> drawReplicasTemp;
|
||
|
||
[Header("Новый раунд после победы")]
|
||
[Range(0, 1)] public float afterWinChance = 1;
|
||
[SerializeField] List<Replica> afterWinReplicas;
|
||
private List<Replica> afterWinReplicasTemp;
|
||
|
||
[Header("Новый раунд после поражения")]
|
||
[Range(0, 1)] public float afterLoseChance = 1;
|
||
[SerializeField] List<Replica> afterLoseReplicas;
|
||
private List<Replica> afterLoseReplicasTemp;
|
||
|
||
[Header("5 побед")]
|
||
[Range(0, 1)] public float totalWinChance = 1;
|
||
[SerializeField] List<Replica> totalWinReplicas;
|
||
private List<Replica> totalWinReplicasTemp;
|
||
|
||
[Header("полное поражение")]
|
||
[Range(0, 1)] public float totalLoseChance = 1;
|
||
[SerializeField] List<Replica> totalLoseReplicas;
|
||
private List<Replica> totalLoseReplicasTemp;
|
||
#endregion
|
||
|
||
|
||
|
||
public void Initialize(Team team)
|
||
{
|
||
this.team = team;
|
||
SettingsManager.OnSettingsChanged += pullSettings;
|
||
audioSource = GetComponent<AudioSource>();
|
||
pullSettings();
|
||
}
|
||
|
||
|
||
//биндинги пойдут корочу в контроллер
|
||
|
||
|
||
private void pullSettings()
|
||
{
|
||
audioSource.volume = SettingsManager.GetFloat(SettingKey.SOUNDS_VOLUME);
|
||
}
|
||
|
||
private bool Message(ref List<Replica> replicasTemp, List<Replica> replicas, bool priority, float chance)
|
||
{
|
||
//Поступило неприоритетное сообщение и бокс занят
|
||
if (nowTyping && !priority) return false;
|
||
//В источнике не заполнены реплики
|
||
if (replicas == null || replicas.Count == 0) return false;
|
||
if (replicasTemp == null || replicasTemp.Count == 0) replicasTemp = new List<Replica>(replicas);
|
||
|
||
//Проверяем вероятность
|
||
bool condition = Random.Range(0f, 1f) < chance;
|
||
if (!condition) return false;
|
||
|
||
//сообщение приоритетное и кто то ДО занял бокс
|
||
if (nowTyping)
|
||
{
|
||
StopAllCoroutines();
|
||
Destroy(currentMessageBox);
|
||
}
|
||
|
||
nowTyping = true;
|
||
//подготовка бокса
|
||
currentMessageBox = Instantiate(messageBoxPrefab, transform);
|
||
TextMeshProUGUI label = currentMessageBox.transform.GetComponentInChildren<TextMeshProUGUI>();
|
||
|
||
//Подготовка сообщения
|
||
int replicaIndex = Random.Range(0, replicasTemp.Count);
|
||
//Забираем реплику из списка
|
||
Replica replica = replicasTemp[replicaIndex];
|
||
replicasTemp.RemoveAt(replicaIndex);
|
||
|
||
if (replica.clip)
|
||
{
|
||
audioSource.clip = replica.clip;
|
||
audioSource.Play();
|
||
}
|
||
|
||
StartCoroutine(ShowText(replica, label));
|
||
return true;
|
||
}
|
||
|
||
private IEnumerator ShowText(Replica replica, TextMeshProUGUI label)
|
||
{
|
||
bool emptyReplicaText = string.IsNullOrEmpty(replica.text);
|
||
bool emptyRepliceClip = replica.clip == null;
|
||
|
||
// нет текста - дропаем
|
||
if (emptyReplicaText)
|
||
{
|
||
Destroy(label.transform.parent.gameObject);
|
||
yield break;
|
||
}
|
||
|
||
label.text = "";
|
||
|
||
int replicaTextLength = replica.text.Length;
|
||
float typingDelay = replica.clip.length / replica.text.Length;
|
||
|
||
string fullText = replica.text;
|
||
for (int symbolsAmount = 0; symbolsAmount <= fullText.Length; symbolsAmount++)
|
||
{
|
||
label.text = fullText.Substring(0, symbolsAmount);
|
||
yield return new WaitForSeconds(typingDelay);
|
||
}
|
||
|
||
yield return new WaitForSeconds(culldownTime);
|
||
|
||
nowTyping = false;
|
||
Destroy(label.transform.parent.gameObject);
|
||
}
|
||
|
||
|
||
}
|