// ***********************************************************************
// Assembly : Game
// Author : Kimch
// Created : 2020-12-08
// Description :
// Last Modified By :
// Last Modified On :
// ***********************************************************************
//
//
// ***********************************************************************
using F;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
namespace G
{
///
/// 商城宝箱
///
public class ShopProxy : F.GameProxy
{
public class TimeBox
{
public int id;
public int time;
public int recoverSecond;
public string name;
public bool canOpen
{
get { return (time - Launch.Timestamp) <= 0; }
}
public int remainSecond
{
get { return Mathf.Max(0, (time - Launch.Timestamp)); }
}
public int unixTimestamp
{
get { return time; }
set { time = value; }
}
}
public class CoinBox
{
public int id;
public int itemId;
}
public class KeyBox
{
public int id;
public int itemId;
public int time;
public int recoverSecond;
public Vector2Int freeCount
{
get
{
var timeInfo = TimeProxy.Instance.GetTimeInfo2(id + TimeProxy.红颜宝箱);
return new Vector2Int(timeInfo.remain, timeInfo.max);
}
}
public bool CostFreeCount()
{
return TimeProxy.Instance.CostTimes(id + TimeProxy.红颜宝箱);
}
public bool CheckFreeCount()
{
return TimeProxy.Instance.CheckTimes(id + TimeProxy.红颜宝箱);
}
public bool canOpen
{
get { return (time - Launch.Timestamp) <= 0; }
}
public int remainSecond
{
get { return Mathf.Max(0, (time - Launch.Timestamp)); }
}
public int unixTimestamp
{
get { return time; }
set { time = value; }
}
}
#region Field
public readonly TimeBox[] giftBoxes = new TimeBox[3];
public readonly CoinBox[] slotBoxes = new CoinBox[3];
public readonly KeyBox[] keyBoxes = new KeyBox[3];
public readonly CoinBox[] petBoxes = new CoinBox[3];
private int _boxShowIndex = 1;
public int boxShowIndex
{
get { return _boxShowIndex; }
}
///
///
///
public bool giftUseFree
{
get { return TimeProxy.Instance.GetTimeKey(TimeProxy.每日免费加速); }
set { TimeProxy.Instance.TryTimeKey(TimeProxy.每日免费加速); }
}
///
/// 免费获取次数
///
public int freeGetTimes
{
get { return TimeProxy.Instance.GetTimes(TimeProxy.装备宝箱广告次数); }
set { TimeProxy.Instance.SetTimes(TimeProxy.装备宝箱广告次数, value); }
}
///
///
///
public int freeGetMaxTimes
{
get { return TimeProxy.Instance.GetMaxTimes(TimeProxy.装备宝箱广告次数); }
}
///
/// 免费获取次数
///
public int freeGetPetBoxTimes
{
get { return TimeProxy.Instance.GetTimes(TimeProxy.宠物重铸丹); }
set { TimeProxy.Instance.SetTimes(TimeProxy.宠物重铸丹, value); }
}
#endregion
#region Method
public override void ReadArchive()
{
InitShop();
LoadShop();
}
private void InitShop()
{
for (int i = 0; i < giftBoxes.Length; i++)
{
giftBoxes[i] = new TimeBox
{
id = i,
time = 0,
recoverSecond = i < 2 ? (i < 1 ? 12 * 60 * 60 : 24 * 60 * 60) : 48 * 60 * 60,
};
}
for (int i = 0; i < slotBoxes.Length; i++)
{
slotBoxes[i] = new CoinBox
{
id = i,
};
}
for (int i = 0; i < keyBoxes.Length; i++)
{
keyBoxes[i] = new KeyBox
{
id = i,
itemId = 2800 + i,
recoverSecond = i == 0 ? 4 * 60 * 60 : 0,
};
}
for (int i = 0; i < petBoxes.Length; i++)
{
petBoxes[i] = new CoinBox
{
id = i,
};
}
}
const string ARCHIVE_KEY_V1 = "shop_v1";
private void LoadShop()
{
var dataList = ArchiveProxy.Instance.GetIntList(ARCHIVE_KEY_V1);
if (dataList != null && dataList.Count > 0)
{
int index = 0;
int count = dataList[index++];
for (int i = 0; i < giftBoxes.Length; i++)
{
giftBoxes[i].unixTimestamp = dataList[index++];
}
bool resetSlot = false;
count = dataList[index++];
for (int i = 0; i < slotBoxes.Length; i++)
{
slotBoxes[i].itemId = dataList[index++];
if (ItemProxy.Instance.GetStaticItem(slotBoxes[i].itemId) == null)
{
resetSlot = true;
break;
}
}
count = dataList[index++];
for (int i = 0; i < keyBoxes.Length; i++)
{
keyBoxes[i].unixTimestamp = dataList[index++];
}
bool resetPet = false;
count = dataList[index++];
for (int i = 0; i < petBoxes.Length; i++)
{
petBoxes[i].itemId = dataList[index++];
if (ItemProxy.Instance.GetStaticItem(petBoxes[i].itemId) == null)
{
resetPet = true;
break;
}
}
if (resetSlot)
{
ResetSlot();
}
if (resetPet)
{
ResetPet();
}
return;
}
ResetSlot();
ResetPet();
}
private void SaveShop()
{
var shopList = ArchiveProxy.Instance.GetIntList(ARCHIVE_KEY_V1);
if (shopList != null)
{
shopList.Clear();
shopList.Add(giftBoxes.Length);
for (int i = 0; i < giftBoxes.Length; i++)
{
shopList.Add(giftBoxes[i].unixTimestamp);
}
shopList.Add(slotBoxes.Length);
for (int i = 0; i < slotBoxes.Length; i++)
{
shopList.Add(slotBoxes[i].itemId);
}
shopList.Add(keyBoxes.Length);
for (int i = 0; i < keyBoxes.Length; i++)
{
shopList.Add(keyBoxes[i].unixTimestamp);
}
shopList.Add(petBoxes.Length);
for (int i = 0; i < petBoxes.Length; i++)
{
shopList.Add(petBoxes[i].itemId);
}
ArchiveProxy.Instance.SetIntList(ARCHIVE_KEY_V1, shopList);
}
}
const int GIFT_BOX_INDEX_MAX = 3;
///
///
///
///
///
public bool OpenGiftBox(int index)
{
var giftbox = giftBoxes[index];
var remain = giftbox.time - Launch.Timestamp;
if (remain <= 0)
{
var lastLevel = LevelProxy.Instance.currentUnlockedLevel;
var levelItem = ItemProxy.Instance.GetStaticItem(lastLevel);
if (levelItem != null && levelItem.shopBox != null && levelItem.shopBox.Length >= GIFT_BOX_INDEX_MAX)
{
var dropBox = BoxProxy.Instance.GetBoxInfo(levelItem.shopBox[index]);
if (dropBox != null)
{
var rnd = dropBox.GetRndItem();
if (index == 2)
{
var q5 = RandomProxy.Instance.GetRandom(2);
if (q5)
{
int rc = 0;
while (rnd.propItem.quality < 5 && rc++ < 10000)
{
rnd = dropBox.GetRndItem();
}
}
}
RewardProxy.Instance.GetReward(rnd);
UI.RewardWindow.ShowBox(rnd,
(error, message) =>
{
PostNotification(GlobalDefine.EVENT_MONEY_CHANGED);
});
}
}
giftbox.time = Launch.Timestamp + (giftbox.recoverSecond);
SaveShop();
//开启传奇宝箱次数
MissionProxy.Instance.OnEvent(MissionProxy.开启宝箱次数, 1, 1);
return true;
}
else
{
return false;
}
}
///
///
///
///
///
public int OpenShopSlot(int index)
{
var coinBox = slotBoxes[index];
if (coinBox.itemId > 0)
{
var boxItem = BoxProxy.Instance.GetBoxInfo(coinBox.itemId);
if (boxItem == null)
{
ResetSlot();
return 3;
}
if (MoneyProxy.Instance.CheckAndCostMoney(boxItem.item.priceInfo))
{
var rndItem = boxItem.GetRndItem();
RewardProxy.Instance.GetReward(rndItem);
UI.RewardWindow.ShowBox(rndItem,
(error, message) =>
{
PostNotification(GlobalDefine.EVENT_MONEY_CHANGED);
});
//开启精金宝箱次数
MissionProxy.Instance.OnEvent(MissionProxy.开启宝箱次数, 1, 2);
ResetSlot();
SaveShop();
return 0;
}
else
{
return 2;
}
}
else
{
ResetSlot();
SaveShop();
return 4;
}
}
///
///
///
///
///
///
public int OpenKeyBox(int index, bool free)
{
var keyBox = keyBoxes[index];
if (keyBox.itemId > 0)
{
var boxItem = BoxProxy.Instance.GetBoxInfo(keyBox.itemId);
if (boxItem == null)
{
return 3;
}
if (keyBox.recoverSecond > 0)
{
var remain = keyBox.time - Launch.Timestamp;
if (remain <= 0)
{
var rnd = boxItem.GetRndItem();
RewardProxy.Instance.GetReward(rnd);
UI.RewardWindow.ShowBox(rnd,
(error, message) =>
{
//PostNotification(GlobalDefine.EVENT_MONEY_CHANGED);
});
keyBox.time = Launch.Timestamp + (keyBox.recoverSecond);
SaveShop();
//开启钥匙宝箱次数
MissionProxy.Instance.OnEvent(MissionProxy.开启宝箱次数, 1, 3);
return 0;
}
else
{
return 2;
}
}
else if (free || MoneyProxy.Instance.CheckAndCostMoney(boxItem.item.priceInfo))
{
var rnd = boxItem.GetRndItem();
RewardProxy.Instance.GetReward(rnd);
UI.RewardWindow.ShowBox(rnd,
(error, message) =>
{
//PostNotification(GlobalDefine.EVENT_MONEY_CHANGED);
});
SaveShop();
//开启钥匙宝箱次数
MissionProxy.Instance.OnEvent(MissionProxy.开启宝箱次数, 1, 3);
return 0;
}
else
{
return 1;
}
}
else
{
SaveShop();
return 4;
}
}
///
///
///
///
///
public int OpenPetBox(int index)
{
int getTimes = this.freeGetPetBoxTimes;
if (getTimes <= 0)
return 1;
this.freeGetPetBoxTimes = getTimes - 1;
var petBox = petBoxes[index];
if (petBox.itemId > 0)
{
var boxItem = BoxProxy.Instance.GetBoxInfo(petBox.itemId);
if (boxItem == null)
{
ResetPet();
return 3;
}
if (MoneyProxy.Instance.CheckAndCostMoney(boxItem.item.priceInfo))
{
var rndItems = boxItem.GetRndAndExtraItems();
RewardProxy.Instance.GetRewards(rndItems);
UI.RewardWindow.ShowBoxs(rndItems,
(error, message) =>
{
PostNotification(GlobalDefine.EVENT_MONEY_CHANGED);
});
//开启精金宝箱次数
MissionProxy.Instance.OnEvent(MissionProxy.开启宝箱次数, 1, 4);
ResetPet();
SaveShop();
return 0;
}
else
{
return 2;
}
}
else
{
ResetPet();
SaveShop();
return 4;
}
}
///
/// 宝箱加速
///
public void GiftBoxSpeedUp()
{
for (int i = 0; i < giftBoxes.Length; i++)
{
giftBoxes[i].time -= 12 * 60 * 60;
}
SaveShop();
MissionProxy.Instance.OnEvent(MissionProxy.饰品宝箱加速次数);
}
///
/// 全部领取
///
public void SlotFreeGetAll()
{
int getTimes = this.freeGetTimes;
if (getTimes <= 0)
return;
this.freeGetTimes = getTimes - 1;
var tmpList = ListPool.Get();
foreach (var shopSlot in slotBoxes)
{
var dropBox = BoxProxy.Instance.GetBoxInfo(shopSlot.itemId);
if (dropBox != null)
{
var rndItem = dropBox.GetRndItem();
tmpList.Add(rndItem);
}
}
RewardProxy.Instance.GetRewards(tmpList);
UI.RewardWindow.ShowBoxs(tmpList,
(error, message) =>
{
//PostNotification(GlobalDefine.EVENT_MONEY_CHANGED);
});
ListPool.Release(tmpList);
ResetSlot();
SaveShop();
//开启装备宝箱次数
MissionProxy.Instance.OnEvent(MissionProxy.开启宝箱次数, 3, 2);
MissionProxy.Instance.OnEvent(MissionProxy.装备宝箱加速次数);
//_shopRefreshTime = System.DateTime.UtcNow.AddSeconds(_shopRecoverTime);
//SaveShop();
}
///
///
///
public void SlotPetGetAll()
{
int getTimes = this.freeGetPetBoxTimes;
if (getTimes <= 0)
return;
this.freeGetPetBoxTimes = getTimes - 1;
var tmpList = ListPool.Get();
foreach (var petBox in petBoxes)
{
var dropBox = BoxProxy.Instance.GetBoxInfo(petBox.itemId);
if (dropBox != null)
{
var rndItems = dropBox.GetRndAndExtraItems();
tmpList.AddRange(rndItems);
}
}
RewardProxy.Instance.GetRewards(tmpList);
UI.RewardWindow.ShowBoxs(tmpList,
(error, message) =>
{
PostNotification(GlobalDefine.EVENT_MONEY_CHANGED);
});
ListPool.Release(tmpList);
ResetPet();
SaveShop();
//开启装备宝箱次数
MissionProxy.Instance.OnEvent(MissionProxy.开启宝箱次数, 3, 4);
MissionProxy.Instance.OnEvent(MissionProxy.装备宝箱加速次数);
//_shopRefreshTime = System.DateTime.UtcNow.AddSeconds(_shopRecoverTime);
//SaveShop();
}
const int SLOT_BOX_INDEX = 3;
///
///
///
private void ResetSlot()
{
var lastLevel = LevelProxy.Instance.currentUnlockedLevel;
var levelItem = ItemProxy.Instance.GetStaticItem(lastLevel);
if (levelItem != null && levelItem.shopBox != null && levelItem.shopBox.Length > SLOT_BOX_INDEX)
{
var dropBox = BoxProxy.Instance.GetBoxInfo(levelItem.shopBox[3]);
if (dropBox != null)
{
for (int i = 0; i < slotBoxes.Length; i++)
{
var rnd = dropBox.GetRndItem();
if (rnd.id > 0)
{
slotBoxes[i].itemId = rnd.id;
//shopSlots[i].itemCount = rnd.count;
//shopSlots[i].status = 0;
}
}
PostNotification(GlobalDefine.EVENT_SHOP_SLOT_CHANGED);
}
}
}
///
///
///
private void ResetPet()
{
var dropBox = BoxProxy.Instance.GetBoxInfo(50003);
if (dropBox != null)
{
for (int i = 0; i < petBoxes.Length; i++)
{
var rnd = dropBox.GetRndItem();
if (rnd.id > 0)
{
petBoxes[i].itemId = rnd.id;
}
}
PostNotification(GlobalDefine.EVENT_SHOP_PET_BOX_CHANGED);
}
}
///
///
///
///
public int GetRedPoint1()
{
for (int i = 0; i < giftBoxes.Length; i++)
{
var giftBox = giftBoxes[i];
if (giftBox != null && giftBox.canOpen)
return 1;
}
return 0;
}
public int GetRedPoint2()
{
if (freeGetTimes >= freeGetMaxTimes)
return 1;
return 0;
}
public int GetRedPoint3()
{
if (giftUseFree)
return 1;
return 0;
}
public int GetRedPoint4()
{
if (FunctionProxy.Instance.GetFunctionUnlock(FunctionProxy.FunctionId.Beauty))
{
if (keyBoxes[0].canOpen)
{
return 1;
}
}
return 0;
}
#endregion
#region Unity & PROXY
public override int priority => 19;
public static ShopProxy Instance;
// Use this for initialization
private void Awake()
{
Instance = this;
}
#endregion
}
}