You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

165 lines
4.6 KiB

using System;
using UnityEngine;
using UnityEngine.UI;
public partial class DispatchView : View
{
[SerializeField] GameObject mapPanel;
[SerializeField] ExtendText levelFormatText;
[SerializeField] DispatchSettingView settingView;
[SerializeField] AreaUI[] areaUIs;
public override void Show()
{
GameUIMgr.SSetMainUiOn(false);
ResetPosition();
mapPanel?.SetActive(true);
viewState = ViewState.Shown;
RefreshMap();
LocalizationText.OnLanguageChange += HandleLangChange;
}
private void HandleLangChange()
{
levelFormatText?.SetText(FormatString.StringFormat("[dispatch] Lv. {0}", DispatchDataGroup.Instance.DispatchData.DispatchLevel));
}
public override void Hide()
{
LocalizationText.OnLanguageChange -= HandleLangChange;
viewState = ViewState.Hidden;
mapPanel?.SetActive(false);
GameUIMgr.SSetMainUiOn(true);
}
private void LateUpdate()
{
if (viewState != ViewState.Shown) return;
for (int i = 0; i < areaUIs.Length; ++i)
{
areaUIs[i].Update();
}
}
private void RefreshMap()
{
for(int i = 0; i < areaUIs.Length; ++i)
{
var targetUI = areaUIs[i];
if(DispatchDataGroup.Instance.DispatchData.TryGetArea(targetUI.areaType, out var area))
targetUI.SetArea(area, OnClickMissionButton);
}
}
private void OnClickMissionButton(AreaUI clickedArea)
{
if (settingView is null) return;
var now = TimeUtils.Now();
if(clickedArea.area.Mission.IsAvailableGetReward(now))
{
clickedArea.area.Mission.GetReward();
clickedArea.area.StartRefreshTime(now);
}
else if(!clickedArea.area.IsInRefreshTime(now))
{
settingView.SetArea(clickedArea.area);
settingView.Show();
}
else
{
GameUIMgr.SOpenToast(LocalizationText.GetText("try_and_failed_1"));
}
}
}
public partial class DispatchView : View
{
[Serializable]
class AreaUI
{
public AreaType areaType;
public Button missionBtn;
public ExtendImage missionIconImage;
public DispatchersController dispatcherCtrl;
public RectTransform[] missionPositions;
public DispatchData.Area area { get; private set; }
bool prevCanGetRewardState;
bool prevDispatchingState;
public void SetArea(DispatchData.Area area, Action<AreaUI> onClickMissionBtn)
{
this.area = area;
missionBtn.onClick.RemoveAllListeners();
missionBtn.onClick.AddListener(() => onClickMissionBtn?.Invoke(this));
if(area.MissionPositionIndex >= 0 && area.MissionPositionIndex < missionPositions.Length)
{
missionBtn.transform.position = missionPositions[area.MissionPositionIndex].position;
missionBtn.gameObject.SetActive(true);
}
else
{
missionBtn.transform.position = missionPositions[missionPositions.Length - 1].position;
missionBtn.gameObject.SetActive(true);
}
prevCanGetRewardState = area.Mission.IsAvailableGetReward(TimeUtils.Now());
SetMissionIconImage(prevCanGetRewardState);
prevDispatchingState = area.Mission.InProgress(TimeUtils.Now());
SetDispatchersController(prevDispatchingState);
}
public void Update()
{
if(area is null) return;
var now = TimeUtils.Now();
bool canGetReward = area.Mission.IsAvailableGetReward(now);
if (prevCanGetRewardState != canGetReward)
{
SetMissionIconImage(canGetReward);
prevCanGetRewardState = canGetReward;
}
bool dispatching = area.Mission.InProgress(now);
if (prevDispatchingState != dispatching)
{
SetDispatchersController(dispatching);
prevDispatchingState = dispatching;
}
}
private void SetMissionIconImage(bool isCompleted)
{
if (isCompleted)
missionIconImage?.SetImageInAtlasAsync("atlasMateSD", "0");
else
missionIconImage?.SetImageInAtlasAsync("atlasMateSD", "1");
}
private void SetDispatchersController(bool activate)
{
dispatcherCtrl?.gameObject.SetActive(activate);
if (activate)
dispatcherCtrl?.StartDispatch(missionBtn.transform as RectTransform, area);
}
}
}