98 lines
4.2 KiB
C#
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; }
|
|
}
|