174 lines
5.7 KiB
C#
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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 useVoice = true;
private bool nowTyping = false;
private CellState 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(CellState team)
{
this.team = team;
SettingsManager.OnSettingsChanged.AddListener(pullSettings);
audioSource = GetComponent<AudioSource>();
pullSettings();
}
//биндинги пойдут корочу в контроллер
private void pullSettings()
{
useVoice = SettingsManager.GetBool("EnableVoices", true);
audioSource.volume = SettingsManager.GetFloat("SoundsVolume", 0.5f);
}
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 && useVoice)
{
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);
}
}