254 lines
8.9 KiB
C#
254 lines
8.9 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 turn = ButtonPinMapping.turn1;
|
|
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(turn);
|
|
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);
|
|
}
|
|
}
|
|
}
|