// ***********************************************************************
// Assembly : Game
// Author : Kimch
// Created : 2020-09-14
// Description :
// Last Modified By :
// Last Modified On :
// ***********************************************************************
//
//
// ***********************************************************************
using System.Collections.Generic;
using CodeStage.AntiCheat.ObscuredTypes;
using PureMVC.Interfaces;
using UnityEngine;
namespace G
{
///
/// 产业
///
public class BusinessProxy : F.GameProxy
{
public class BusinessInfo
{
public readonly ItemBusiness item;
public int id => item.id;
public ObscuredInt _timestamp;
public int timestamp
{
get { return _timestamp; }
set { _timestamp = value; }
}
///
/// 2 运行 1 解锁 0 未解锁
///
public int status
{
get
{
if (timestamp > 1)
return 2;
else
return timestamp;
}
}
public int accumS => Mathf.Clamp(Launch.Timestamp - timestamp, 1, totalS);
public int totalS => item.rewardTotalSeconds;
public int intervalS => item.rewardIntervalSeconds;
///
///
///
public bool isFullReward => accumS >= totalS;
///
///
///
public int beautyId => item.beauty;
///
///
///
public BeautyProxy.BeautyInfo beauty => BeautyProxy.Instance.GetBeauty(beautyId);
public BusinessInfo(ItemBusiness affairItem)
{
this.item = affairItem;
this.timestamp = 0;
}
public void Reset()
{
this.timestamp = 0;
}
public int GetRewards(List rewards)
{
var oriRewards = item.rewardInfos;
float factor = 1f;
if (beauty != null)
{
factor += beauty.businessFactor * 0.01f;
}
int accum = accumS;
int interval = intervalS;
int time = accum / interval;
for (int i = 0; i < oriRewards.Length; i++)
{
var reward = oriRewards[i];
reward.count = (int)(reward.count * time * factor);
rewards.Add(reward);
}
if (accum < interval)
return -1;
else
return accum % interval == 0 ? 1 : 0;
}
}
#region Field
private readonly Dictionary _businessInfos = new Dictionary();
#endregion
#region Property
#endregion
#region Method
public IReadOnlyCollection GetBusinessInfos()
{
SetBusiness();
return _businessInfos.Values;
}
///
///
///
///
///
public void GetBusinessRewards(BusinessInfo businessInfo, Callback2 callback)
{
var results = F.ListPool.Get();
int state = businessInfo.GetRewards(results);
if (state >= 0)
{
//int timestamp = Launch.Timestamp;
UI.AdRewardBox.ShowRewards(results, (error, message) =>
{
if (error == 0)
{
businessInfo.timestamp = Launch.Timestamp;
SaveBusiness();
MissionProxy.Instance.OnEvent(MissionProxy.处理江湖事件次数);
}
callback(error, message);
});
}
F.ListPool.Release(results);
}
public bool UnlockBusiness(BusinessInfo business)
{
if (business.status == 1)
{
business.timestamp = 2;
SaveBusiness();
return true;
}
return false;
}
private void SetBusiness()
{
foreach (var businessInfo in _businessInfos.Values)
{
if (businessInfo.status == 0)
{
if (businessInfo.beautyId == 0)
{
businessInfo.timestamp = 2;
}
else if (BeautyProxy.Instance.GetBeauty(businessInfo.beautyId).isUnlock)
{
businessInfo.timestamp = 1;
}
}
}
}
public int GetRedPoint()
{
if (_businessInfos.Count > 0)
{
int redFlag = 0;
foreach (var businessInfo in _businessInfos.Values)
{
if (businessInfo.status == 1)
{
redFlag = 1;
return redFlag;
}
if (businessInfo.status == 2 && businessInfo.isFullReward)
{
redFlag = 1;
return redFlag;
}
}
}
return 0;
}
private const string ARCHIVE_KEY_V1 = "affairs";
private void LoadBusiness()
{
var dataList = ArchiveProxy.Instance.GetIntList(ARCHIVE_KEY_V1);
if (dataList != null && dataList.Count > 0)
{
int index = 0;
while (index < dataList.Count)
{
int bId = dataList.SafeGet(index++);
int status = dataList.SafeGet(index++);
if (_businessInfos.TryGetValue(bId, out var businessInfo))
{
businessInfo.timestamp = status;
}
}
}
}
private void SaveBusiness()
{
var dataList = ArchiveProxy.Instance.GetIntList(ARCHIVE_KEY_V1);
if (dataList != null)
{
dataList.Clear();
foreach (var businessInfo in _businessInfos.Values)
{
if (businessInfo.status > 0)
{
dataList.Add(businessInfo.id);
dataList.Add(businessInfo.timestamp);
}
}
ArchiveProxy.Instance.SetIntList(ARCHIVE_KEY_V1, dataList);
}
}
///
/// 处理过存档
///
private void InitBusiness()
{
if (_businessInfos.Count == 0)
{
var businessItems = ItemProxy.Instance.GetStaticItems();
if (businessItems != null)
for (int i = 0; i < businessItems.Count; i++)
{
var businessItem = businessItems[i];
_businessInfos.Add(businessItem.id, new BusinessInfo(businessItem));
}
}
else
{
foreach (var businessInfo in _businessInfos.Values)
{
businessInfo.Reset();
}
}
}
public override void ReadArchive()
{
InitBusiness();
LoadBusiness();
}
#endregion
#region Unity & Proxy
///
///
///
public static BusinessProxy Instance
{
get { return GetInstance(); }
}
static readonly int[] _ListNotificationInterests = new int[] {
GlobalDefine.EVENT_LEVEL_COMPLETED,
};
public override IList ListNotificationInterests()
{
return _ListNotificationInterests;
}
public override void HandleNotification(INotification notification)
{
if (notification.Name == GlobalDefine.EVENT_MISSION_COMPLETED)
SetBusiness();
}
#endregion
}
}