using vnxbqy.UI;
using System;
using System.Collections;
using System.Collections.Generic;
using LitJson;
///
/// 合服-转盘
///
public class MergeServerTurntableModel : ILModel
{
public ILOpenServerActivityProxy activity;
public Operation operationType = Operation.default9;
public const int activityID = 2;
public const int activityType = (int)OpenServerActivityCenter.ActivityType.AT_HFHD;
public event Action PlayerTurntableEvent;
public int[] jpPosition; //展示极品位置
public int[] zjPosition;
public int turntableCount;
public int ctgTotal;
public int useMoneyTotal;
public int turnItemState; //转盘物品已抽中记录,按转盘物品编号二进制位代表是否已抽中
public int getItemNum; //本次抽中的物品编号,非转盘结果时为0,大于0时为通知本次转到的物品编号
public const int itemCount = 12;
public int runIndex = 0; //转圈的位置,已经获得的物品不再转 itemSort的索引
public int runState = 0; //0未开始 1起步转(加速) 2结束转(减速)
//客户端排序对应下发的物品索引turnItemList //物品库类型;1-常规,2-极品,3-终极
//-1 为未分配 -2为空
public List itemSort = new List();
public bool IsOpen()
{
return OperationTimeHepler.Instance.SatisfyOpenCondition(operationType);
}
public bool IsAdvance()
{
return false;
}
public bool priorityOpen()
{
//红点
return redpoint.state == RedPointState.Simple;
}
public event Action onStateUpdate;
public event Action OnOperationTimeUpdateEvent; //为了保证执行顺序
protected override void Init()
{
OperationTimeHepler.Instance.operationStartEvent += OperationStartEvent;
OperationTimeHepler.Instance.operationEndEvent += OperationEndEvent;
OperationTimeHepler.Instance.dayResetEvent += DayResetEvent;
GameEvent.beforePlayerDataInitializeEvent += OnBeforePlayerDataInitialize;
GameEvent.playerLoginOkEvent += OnPlayerLoginOk;
ILOperationTimeHepler.Instance.operationTimeUpdateEvent += operationTimeUpdateEvent;
activity = new ILOpenServerActivityProxy(IsOpen, IsAdvance, priorityOpen);
OpenServerActivityCenter.Instance.Register(activityID, activity, activityType);
ParseConfig();
}
void ParseConfig()
{
var config = FuncConfigConfig.Get("HFTurntable");
jpPosition = JsonMapper.ToObject(config.Numerical1);
zjPosition = JsonMapper.ToObject(config.Numerical2);
}
public void OnBeforePlayerDataInitialize()
{
turntableCount = 0;
ctgTotal = 0;
useMoneyTotal = 0;
turnItemState = 0;
getItemNum = 0;
itemSort.Clear();
}
public void OnPlayerLoginOk()
{
UpdateRedpoint();
}
protected override void UnInit()
{
OperationTimeHepler.Instance.operationStartEvent -= OperationStartEvent;
OperationTimeHepler.Instance.operationEndEvent -= OperationEndEvent;
OperationTimeHepler.Instance.dayResetEvent -= DayResetEvent;
GameEvent.beforePlayerDataInitializeEvent -= OnBeforePlayerDataInitialize;
GameEvent.playerLoginOkEvent -= OnPlayerLoginOk;
ILOperationTimeHepler.Instance.operationTimeUpdateEvent -= operationTimeUpdateEvent;
}
private void operationTimeUpdateEvent(Operation type)
{
if (type == operationType)
{
OperationBase operationBase;
if (!OperationTimeHepler.Instance.TryGetOperationTime(operationType, out operationBase))
{
return;
}
OperationTurntable operation = operationBase as OperationTurntable;
//-1 为未分配 -2为空
itemSort.Clear();
for (int i = 0; i < itemCount; i++)
{
itemSort.Add(-1);
}
//物品库类型;1-常规,2-极品,3-终极
for (int i = 0; i < jpPosition.Length; i++)
{
if (operation.itemTypeIndexs.ContainsKey(2))
{
if (i < operation.itemTypeIndexs[2].Count)
{
itemSort[jpPosition[i]] = operation.itemTypeIndexs[2][i];
}
else
{
itemSort[jpPosition[i]] = -2;
}
}
else
{
itemSort[jpPosition[i]] = -2;
}
}
for (int i = 0; i < zjPosition.Length; i++)
{
if (operation.itemTypeIndexs.ContainsKey(3))
{
if (i < operation.itemTypeIndexs[3].Count)
{
itemSort[zjPosition[i]] = operation.itemTypeIndexs[3][i];
}
else
{
itemSort[zjPosition[i]] = -2;
}
}
else
{
itemSort[zjPosition[i]] = -2;
}
}
int normalIndex = 0;
for (int i = 0; i < itemSort.Count; i++)
{
if (itemSort[i] == -1)
{
itemSort[i] = operation.itemTypeIndexs[1][normalIndex];
normalIndex++;
}
}
OnOperationTimeUpdateEvent?.Invoke();
}
}
private void DayResetEvent(int resetType)
{
OperationBase operationBase;
if (OperationTimeHepler.Instance.TryGetOperationTime(operationType, out operationBase))
{
if (resetType == operationBase.resetType)
{
UpdateRedpoint();
}
}
}
private void OperationEndEvent(Operation operation, int state)
{
if (operation == operationType && state == 0)
{
UpdateRedpoint();
if (onStateUpdate != null)
{
onStateUpdate(activityID);
}
}
}
private void OperationStartEvent(Operation operation, int state)
{
if (operation == operationType && state == 0)
{
UpdateRedpoint();
if (onStateUpdate != null)
{
onStateUpdate(activityID);
}
}
}
#region 服务端数据
public void UpdatePlayerTurntable(IL_HAA53_tagMCActTurntablePlayerInfo package)
{
OperationBase operationBase;
if (OperationTimeHepler.Instance.TryGetOperationTime(operationType, out operationBase))
{
OperationTurntable operation = operationBase as OperationTurntable;
if (operation.ActNum != package.ActNum)
{
return;
}
turntableCount = package.CanUseCount;
ctgTotal = (int)package.CTGTotal;
useMoneyTotal = (int)package.UseMoneyTotal;
turnItemState = (int)package.TurnItemState;
getItemNum = (int)package.GetItemNum;
UpdateRedpoint();
if (PlayerTurntableEvent != null)
{
PlayerTurntableEvent();
}
}
}
//是否已抽中
public bool IsHitItemState(int index)
{
return ((int)Math.Pow(2, index) & turnItemState) != 0;
}
public int GetRunStartIndex()
{
OperationBase operationBase;
if (!OperationTimeHepler.Instance.TryGetOperationTime(operationType, out operationBase))
{
return -1;
}
OperationTurntable operation = operationBase as OperationTurntable;
if (itemSort.Contains(-2))
{
return -1;
}
for (int i = 0; i < itemCount; i++)
{
if (!IsHitItemState(operation.turnItemList[itemSort[i]].ItemNum))
{
return i;
}
}
return -1;
}
//将ItemNum转化为显示的索引
public int GetHitIndex()
{
OperationBase operationBase;
if (!OperationTimeHepler.Instance.TryGetOperationTime(operationType, out operationBase))
{
return -1;
}
OperationTurntable operation = operationBase as OperationTurntable;
for (int i = 0; i < itemCount; i++)
{
if (getItemNum == operation.turnItemList[itemSort[i]].ItemNum)
{
return i;
}
}
return -1;
}
#endregion
#region 红点
public Redpoint redpoint = new Redpoint(MainRedPoint.hfhdRedPoint, MainRedPoint.hfhdRedPoint * 100 + activityID);
public void UpdateRedpoint()
{
redpoint.state = RedPointState.None;
if (!IsOpen())
{
return;
}
OperationBase operationBase;
if (OperationTimeHepler.Instance.TryGetOperationTime(operationType, out operationBase))
{
OperationTurntable operation = operationBase as OperationTurntable;
if (turntableCount > 0)
{
redpoint.state = RedPointState.Simple;
}
}
}
#endregion
}