using System.Collections.Generic; using System.Linq; using asap.core; using UnityEngine; using UnityEngine.Rendering; public class EventPartnerStatueBuild : MonoBehaviour { [SerializeField] private List toolAnimationList; [SerializeField] private List diceGroups; [SerializeField] private List toolAnimationAnchors; [SerializeField] private List statueViews; [SerializeField] private GameObject goDesk; [SerializeField] private GameObject[] fxIceBreak; private Dictionary _toolAnimationDic; private int _idx; private void Start() { _toolAnimationDic = new Dictionary(); _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(); var idx = StageToIndex(currentStage, maxStage); // Debug.Log($"[EventPartnerStatue] idx {idx} from stage {currentStage}"); var combinationList = new List() { (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; } }