Files
ft/Client/Assets/Scripts/UI/PartnerStatue/EventPartnerStatueBuild.cs
2026-06-29 21:18:33 +08:00

98 lines
4.2 KiB
C#

using System.Collections.Generic;
using System.Linq;
using asap.core;
using UnityEngine;
using UnityEngine.Rendering;
public class EventPartnerStatueBuild : MonoBehaviour
{
[SerializeField] private List<EventPartnerStatueBuildToolView> toolAnimationList;
[SerializeField] private List<EventPartnerStatueDiceGroup> diceGroups;
[SerializeField] private List<EventPartnerStatueToolAnimationAnchor> toolAnimationAnchors;
[SerializeField] private List<EventPartnerStatueView> statueViews;
[SerializeField] private GameObject goDesk;
[SerializeField] private GameObject[] fxIceBreak;
private Dictionary<EEventPartnerStatueDiceFace, EventPartnerStatueBuildToolView> _toolAnimationDic;
private int _idx;
private void Start()
{
_toolAnimationDic = new Dictionary<EEventPartnerStatueDiceFace, EventPartnerStatueBuildToolView>();
_toolAnimationDic[EEventPartnerStatueDiceFace.More] = toolAnimationList[0];
_toolAnimationDic[EEventPartnerStatueDiceFace.Free] = toolAnimationList[1];
_toolAnimationDic[EEventPartnerStatueDiceFace.Hammer] = toolAnimationList[2];
_toolAnimationDic[EEventPartnerStatueDiceFace.HandSaw] = toolAnimationList[3];
_toolAnimationDic[EEventPartnerStatueDiceFace.CircularSaw] = toolAnimationList[4];
_toolAnimationDic[EEventPartnerStatueDiceFace.PowerDrill] = toolAnimationList[5];
}
public void Init(EventPartnerStatueBuildSceneData data)
{
_idx = data.SlotIdx;
for (int i = 0; i < statueViews.Count; i++)
statueViews[i].gameObject.SetActive(i == _idx);
statueViews[_idx].Init(data.Stage, data.MaxStage);
for (int i = 0; i < diceGroups.Count; i++)
diceGroups[i].Init((EEventPartnerStatueDiceFace)(i + 1), i);
goDesk.SetActive(true);
foreach (var fx in fxIceBreak)
fx.SetActive(false);
}
public void PlayDice((int c1, int c2, int c3) combination)
{
if (3 != diceGroups.Count)
{
Debug.LogError($"[EventPartnerStatueBuild] combination count {3} does not match diceGroups count {diceGroups.Count}");
return;
}
// no repeat dice pattern
var idxList = Enumerable.Range(0, diceGroups[0].DiceCount).OrderBy(_ => Random.value).ToList();
diceGroups[0].Play((EEventPartnerStatueDiceFace)combination.c1, idxList[0]);
diceGroups[1].Play((EEventPartnerStatueDiceFace)combination.c2, idxList[1]);
diceGroups[2].Play((EEventPartnerStatueDiceFace)combination.c3, idxList[2]);
}
public async void PlayToolAnimation((int c1, int c2, int c3) combination, int currentStage, int maxStage)
{
var arc = GContext.container.Resolve<EventPartnerStatueArc>();
var idx = StageToIndex(currentStage, maxStage);
// Debug.Log($"[EventPartnerStatue] idx {idx} from stage {currentStage}");
var combinationList = new List<EEventPartnerStatueDiceFace>() { (EEventPartnerStatueDiceFace)combination.c1, (EEventPartnerStatueDiceFace)combination.c2, (EEventPartnerStatueDiceFace)combination.c3 };
await toolAnimationAnchors[idx].PlayAsync(combinationList.Select(idx => _toolAnimationDic[(EEventPartnerStatueDiceFace)idx]).ToArray(),
new int[]{combination.c1, combination.c2, combination.c3}.Select(idx => arc.TableContext.GetToolAnimationDuration(idx)).ToArray(),
new int[]{combination.c1, combination.c2, combination.c3}.Select(idx => arc.TableContext.GetToolAnimationFxDelay(idx)).ToArray()
);
}
public void SetStatue(int stage)
{
var fxIdx = statueViews[_idx].SetWithFx(stage);
if (fxIdx >= 0)
{
fxIceBreak[fxIdx].SetActive(false);
fxIceBreak[fxIdx].SetActive(true);
}
}
private int StageToIndex(int stage, int maxStage)
{
stage = Mathf.Clamp(stage, 0, maxStage);
return maxStage - 1 - stage;
}
public void SetFinished()
{
foreach (var diceGroup in diceGroups)
diceGroup.Hide();
goDesk.SetActive(false);
}
}
public class EventPartnerStatueBuildSceneData
{
public int SlotIdx { get; set; }
public int Stage { get; set; }
public int MaxStage { get; set; }
}