sea-battle/Assets/Scripts/UI/FastCheckController.cs

255 lines
9.0 KiB
C#

using UnityEngine;
using System.Text;
using UnityEngine.UI;
using TMPro;
namespace UI
{
// Êîìïîíåíò ïîêàçûâàåò èíôîðìàöèîííóþ ïëàøêó ïðè îäíîâðåìåííîì íàæàòèè êîìáèíàöèè êíîïîê
// Êîìáèíàöèÿ ïî óìîë÷àíèþ: Fire = action1, Turn = turn1, Up = up1, Down = down1
// Ïîâåäåíèå: åñëè holdToShow == true — ïëàøêà âèäíà ïîêà êîìáèíàöèÿ óäåðæèâàåòñÿ;
// åñëè false — êîìáèíàöèÿ ïåðåêëþ÷àåò âèäèìîñòü (toggle).
public class FastCheckController : MonoBehaviour
{
[Header("Keys (can be overridden in inspector)")]
public ButtonPinMapping fire = ButtonPinMapping.action1;
public ButtonPinMapping turnLeft = ButtonPinMapping.turnLeft1;
public ButtonPinMapping turnRight = ButtonPinMapping.turnRight1;
public ButtonPinMapping up = ButtonPinMapping.up1;
public ButtonPinMapping down = ButtonPinMapping.down1;
[Header("UI")]
public GameObject panelRoot;
public TextMeshProUGUI infoTextTMP;
public Text infoText;
[Header("Behavior")]
public bool holdToShow = true;
[Tooltip("Minimal seconds between toggles to avoid bounce")] public float debounceSeconds = 0.05f;
// Êëþ÷è ñòàòèñòèêè èñïîëüçóþòñÿ èç PrizeSystem (PrizeSystem.key_starts è ò.ä.)
bool comboPrev; // default initialization removed to satisfy style warnings
float lastToggleTime = -10f;
// Êýø ôëàãà íàñòðîéêè "Áûñòðàÿ ïðîâåðêà" — îáíîâëÿåòñÿ ïî ñîáûòèþ íàñòðîåê
bool fastCheckEnabled;
// Êýø ôëàãà ïðîâåðêè íàëè÷èÿ ïðèçà
bool prizeAvailabilityEnabled;
private void Start()
{
// Ïîäîæäàòü, åñëè SettingsManager åù¸ íå èíèöèàëèçèðîâàí
if (SettingsManager.instance == null)
{
StartCoroutine(WaitForSettingsAndInit());
}
else
{
Init();
}
if (panelRoot != null)
panelRoot.SetActive(false);
}
System.Collections.IEnumerator WaitForSettingsAndInit()
{
while (SettingsManager.instance == null)
yield return null;
Init();
}
void Init()
{
// Ïîäïèñêà íà èçìåíåíèÿ íàñòðîåê
SettingsManager.instance.OnSettingsChanged.AddListener(RefreshContent);
// Ïîäïèñûâàåìñÿ òàêæå, ÷òîáû îáíîâëÿòü ëîêàëüíûé ôëàã ïðè èçìåíåíèè íàñòðîåê
SettingsManager.instance.OnSettingsChanged.AddListener(UpdateFastCheckFlag);
// Èíèöèàëèçèðóåì ôëàã è ñîäåðæèìîå
UpdateFastCheckFlag();
RefreshContent();
}
private void OnDestroy()
{
if (SettingsManager.instance != null)
{
SettingsManager.instance.OnSettingsChanged.RemoveListener(RefreshContent);
SettingsManager.instance.OnSettingsChanged.RemoveListener(UpdateFastCheckFlag);
}
}
void Update()
{
// Èñïîëüçóåì êýøèðîâàííûé ôëàã, îáíîâëÿåìûé ïî ñîáûòèþ íàñòðîåê
// Åñëè ðåæèì áûñòðîãî êîíòðîëÿ îòêëþ÷¸í — íè÷åãî íå äåëàåì è ñêðûâàåì ïëàøêó
if (!fastCheckEnabled)
{
if (panelRoot != null && panelRoot.activeSelf) panelRoot.SetActive(false);
comboPrev = false;
return;
}
// Èñïîëüçóåì In.GetButton ÷òîáû êîððåêòíî äåòåêòèðîâàòü îäíîâðåìåííûå íàæàòèÿ
bool aTurn = In.GetButton(turnLeft) || In.GetButton(turnRight);
bool aFire = In.GetButton(fire);
bool aUp = In.GetButton(up);
bool aDown = In.GetButton(down);
bool comboNow = aTurn && aFire && (aUp || aDown);
// rising edge
if (!comboPrev && comboNow)
{
// ïðåäîòâðàòèòü ÷àñòûå ïåðåêëþ÷åíèÿ
if (Time.unscaledTime - lastToggleTime > debounceSeconds)
{
if (holdToShow)
{
Show();
}
else
{
Toggle();
}
lastToggleTime = Time.unscaledTime;
}
}
// åñëè ðåæèì hold, ñêðûâàåì ïðè îòïóñêàíèè êîìáèíàöèè
if (holdToShow && comboPrev && !comboNow)
{
if (Time.unscaledTime - lastToggleTime > debounceSeconds)
{
Hide();
lastToggleTime = Time.unscaledTime;
}
}
comboPrev = comboNow;
}
void Toggle()
{
if (panelRoot == null) return;
bool newState = !panelRoot.activeSelf;
// Èñïîëüçóåì êýøèðîâàííûé ôëàã âìåñòî çàïðîñà íàñòðîåê êàæäûé ðàç
if (newState && !fastCheckEnabled) return;
panelRoot.SetActive(newState);
if (newState) RefreshContent();
}
void Show()
{
if (panelRoot == null) return;
// Ïîêàçûâàåì òîëüêî åñëè â íàñòðîéêàõ ðàçðåøåíî (êýø)
if (!fastCheckEnabled) return;
panelRoot.SetActive(true);
RefreshContent();
}
void Hide()
{
if (panelRoot == null) return;
panelRoot.SetActive(false);
}
public void RefreshContent()
{
if (panelRoot == null) return;
// Îáíîâëÿåì òîëüêî êîãäà ïëàøêà âèäíà
if (!panelRoot.activeSelf)
return;
// Äîïîëíèòåëüíàÿ ãàðàíòèÿ: åñëè â íàñòðîéêàõ îòêëþ÷åíî — ñêðûòü ïëàøêó è íå ïîêàçûâàòü äàííûå
if (!fastCheckEnabled)
{
if (panelRoot.activeSelf) panelRoot.SetActive(false);
return;
}
var sb = new StringBuilder();
// ×èòàåì (ïî óìîë÷àíèþ 0 åñëè êëþ÷à íåò) ÷åðåç PrizeSystem
int starts = PlayerPrefs.GetInt(PrizeSystem.key_starts, 0);
int startsNul = PlayerPrefs.GetInt(PrizeSystem.key_startsNul, 0);
int prizes = PlayerPrefs.GetInt(PrizeSystem.key_prizesgiven, 0);
int prizesNul = PlayerPrefs.GetInt(PrizeSystem.key_prizesgivenNul, 0);
sb.AppendLine("Èãðîâàÿ ñòàòèñòèêà:");
// Ïðè âêëþ÷¸ííîé ïðîâåðêå íàëè÷èÿ ïðèçà ïîêàçûâàåì äîñòóïíîå êîëè÷åñòâî ïðèçîâ
sb.AppendLine($"Ñ÷åò÷èê ïðèçîâ (ãëîáàëüíûé): {prizes}");
sb.AppendLine($"Ñ÷åò÷èê ïðèçîâ (îáíóëÿåìûé): {prizesNul}");
sb.AppendLine($"Âíåñåíî ìîíåò (ãëîáàëüíûé): {starts}");
sb.AppendLine($"Âíåñåíî ìîíåò (îáíóëÿåìûé): {startsNul}");
if (prizeAvailabilityEnabled)
{
int prizesCount = PlayerPrefs.GetInt(KeyVault.PRIZES_AVAILABLE, 0);
sb.AppendLine($"Äîñòóïíûõ ïðèçîâ: {prizesCount}");
}
ApplyText(sb.ToString());
}
// Îáðàáîò÷èê èçìåíåíèÿ íàñòðîåê: îáíîâëÿåò êýøèðîâàííûé ôëàã è ïðÿ÷åò/îáíîâëÿåò ïàíåëü ïðè íåîáõîäèìîñòè
void UpdateFastCheckFlag()
{
fastCheckEnabled = IsFastCheckEnabled();
// îáíîâëÿåì ôëàã ïðîâåðêè íàëè÷èÿ ïðèçà
prizeAvailabilityEnabled = GetSettingFlag("Áûñòðàÿ ïðîâåðêà íàëè÷èÿ ïðèçà");
if (!fastCheckEnabled && panelRoot != null && panelRoot.activeSelf)
{
panelRoot.SetActive(false);
}
else if (fastCheckEnabled && panelRoot != null && panelRoot.activeSelf)
{
// åñëè ôëàã âêëþ÷èëè è ïàíåëü óæå îòêðûòà — îáíîâèì êîíòåíò
RefreshContent();
}
}
// Ïðîâåðÿåò, âêëþ÷åíà ëè íàñòðîéêà "Áûñòðàÿ ïðîâåðêà" â SettingsManager
bool IsFastCheckEnabled()
{
return GetSettingFlag("Áûñòðàÿ ïðîâåðêà");
}
// Óíèâåðñàëüíàÿ ïðîâåðêà áóëåâûõ íàñòðîåê (÷èòàåò çíà÷åíèå è ñðàâíèâàåò ñî ñïèñêîì ðàçðåøàþùèõ çíà÷åíèé)
bool GetSettingFlag(string settingName)
{
if (SettingsManager.instance == null) return false;
string val;
try { val = SettingsManager.instance.GetSettingValue(settingName); }
catch (System.Exception ex)
{
Debug.LogWarning($"FastCheckController: îøèáêà ïðè ÷òåíèè íàñòðîéêè '{settingName}': {ex.Message}");
return false;
}
if (string.IsNullOrEmpty(val)) return false;
val = val.Trim().ToLowerInvariant();
// Ðàçðåøàþùèå çíà÷åíèÿ (ðóññêèå è àíãëèéñêèå âàðèàíòû)
string[] trueValues = new string[] { "âêë", "âêëþ÷åíî", "âêëþ÷àòü", "âêëþ÷èòü", "âêëþ÷åíà", "äà", "true", "on", "enabled", "âêë." };
foreach (var t in trueValues)
{
if (val.Contains(t)) return true;
}
return false;
}
void ApplyText(string text)
{
if (infoTextTMP != null)
infoTextTMP.text = text;
else if (infoText != null)
infoText.text = text;
else
Debug.Log(text);
}
}
}