using LitJson;
using UnityEngine;
using UnityEngine.EventSystems;
using System;
using System.Xml;
using System.Collections;
using System.Collections.Generic;
public class ManaData : MonoBehaviour
{
#region 变量
public static int Level
{
get { return _Level; }
set
{
_Level = value;
for (int i = 0; i < SkillList.Count; i++)
{
SkillList[i].OnLevelChange();
}
ManaLog.Log(string.Format("已升级 花园等级 : {0}", _Level));
}
}
public static float Person
{
get { return _Person; }
set
{
_Person = value;
ManaReso.SetText("F_PersonLab", _Person.ToString("0"));
}
}
public static float CoinPerson
{
get { return _CoinPerson; }
set
{
_CoinPerson = value;
ManaReso.SetText("F_CoinPersonLab", _CoinPerson.ToString("0"));
}
}
public static double Coin
{
get { return _Coin; }
set
{
_Coin = value;
ManaReso.SetText("F_CoinLab", _Coin.ToString("0"));
ManaReso.SetText("C_CoinLab", _Coin.ToString("0"));
}
}
public static double Diamond
{
get { return _Diamond; }
set
{
_Diamond = value;
ManaReso.SetText("F_DiamondLab", _Diamond.ToString("0"));
}
}
private static int _Level;
private static float _Person;
private static float _CoinPerson;
private static double _Coin;
private static double _Diamond;
public static float SkillPlus;
public static float SkillPerson;
public static float SkillPersonBuff;
public static float SkillCoinPerson;
public static int Main;
public static bool SkillBar;
public static bool Connect;
public static float OpTime;
public static float CircleTime;
public static float OpTimer;
public static float CircleTimer;
public static float NewPerson;
public static float NewCoinPerson;
public static List CoolList;
public static List SkillList;
public static List UsingList;
public static Dictionary SkillDic;
#endregion
private void Awake()
{
Initializer.RegistValue += RegistValue;
#region 读技能配置
SkillDic = new Dictionary();
SkillList = new List();
List attributesList = Data.GetSkillConfig();
for (int i = 0; i < attributesList.Count; i++)
{
SkillRoot skillRoot;
#region MyRegion
if (attributesList[i].Count == 17)
{
skillRoot = new Pack(attributesList[i]);
}
else if (attributesList[i].Count == 23)
{
skillRoot = new Ability(attributesList[i]);
}
else if (attributesList[i].Count == 33)
{
if (string.IsNullOrEmpty(attributesList[i][4].Value))
{
skillRoot = new Skill(attributesList[i]);
}
else
{
skillRoot = new BigSkill(attributesList[i]);
}
}
else
{
throw new Exception(attributesList[i].Count.ToString());
}
#endregion
SkillList.Add(skillRoot);
SkillDic.Add(skillRoot.Name, skillRoot);
}
SkillList.Sort(SkillRoot.SortByClassID);
#endregion
#region 创建技能条
for (int i = 0; i < SkillList.Count; i++)
{
if (SkillList[i].Tab != SkillTab.Null)
{
ManaReso.GetSkillItem(SkillList[i]);
}
}
#endregion
}
private void Update()
{
if (Math.Abs(Time.timeScale) < 0.0005f)
{
return;
}
if (Input.anyKeyDown)
{
OpTimer = 0;
if (Main > 0)
{
return;
}
GameObject go = ManaReso.Get("C_Main").gameObject;
if (go.activeSelf == false)
{
go.transform.TweenForCG();
}
}
else
{
OpTimer += Time.deltaTime;
if (OpTimer >= OpTime)
{
OpTimer = 0;
GameObject go = ManaReso.Get("C_Main").gameObject;
if (go.activeSelf)
{
go.transform.TweenBacCG();
}
}
}
}
private void FixedUpdate()
{
#region 使用技能
for (int i = 0; i < UsingList.Count; i++)
{
if (UsingList[i].DoUse())
{
i--;
}
}
#endregion
#region 冷却技能
for (int i = 0; i < CoolList.Count; i++)
{
if (CoolList[i].DoCool())
{
i--;
}
}
#endregion
#region 计算参观收入
CircleTimer -= Time.deltaTime;
if (CircleTimer < 0)
{
CircleTimer = CircleTime;
NewPerson = Person*(1 + SkillPersonBuff) + SkillPerson;
NewCoinPerson = CoinPerson + SkillCoinPerson;
Coin += (NewPerson*NewCoinPerson*CircleTime)*(1 + SkillPlus);
ManaLog.Log(string.Format("参观收益{0:0} = {1} * {2} * {3} * {4} (人次*金币*时间*加成)", (NewPerson * NewCoinPerson * CircleTime) * (1 + SkillPlus), NewPerson, NewCoinPerson, CircleTime, 1 + SkillPlus));
}
#endregion
}
private void RegistValue()
{
if (ManaReso.Get("A_Notice").gameObject.activeSelf)
{
Main = 1;
}
else
{
Main = 0;
}
OpTime = 5;
CircleTime = 10;
CircleTimer = 10;
CoolList = new List();
UsingList = new List();
#region 读技能存档
double elapse = DateTime.Now.Subtract(DateTime.Parse(Data.PlayerNode.SelectSingleNode("QuitTime").Attributes[0].Value)).TotalSeconds;
XmlNodeList xmlNodeList = Data.PlayerNode.SelectSingleNode("SkillList").ChildNodes;
List ffCoolList = new List();
List> ffList = new List>();
if (elapse > CircleTimer)
{
int ffCircle = 1 + Mathf.FloorToInt((float)((elapse - CircleTimer) / CircleTime));
for (int i = 0; i < ffCircle; i++)
{
ffList.Add(new List());
}
}
for (int i = 0; i < xmlNodeList.Count; i++)
{
if (xmlNodeList[i].Attributes[0].Value == SkillType.Skill.ToString())
{
Skill skill = (Skill)SkillDic[xmlNodeList[i].Name];
skill.RegistReference();
skill.Level = int.Parse(xmlNodeList[i].Attributes[2].Value);
skill.CoolTimer = float.Parse(xmlNodeList[i].Attributes[3].Value);
skill.UsingTimer = float.Parse(xmlNodeList[i].Attributes[4].Value);
skill._ItemStatus = (SkillStatus)Enum.Parse(typeof(SkillStatus), xmlNodeList[i].Attributes[1].Value);
skill.RegistValue(elapse, ffList);
}
else if (xmlNodeList[i].Attributes[0].Value == SkillType.BigSkill.ToString())
{
BigSkill bigSkill = (BigSkill)SkillDic[xmlNodeList[i].Name];
bigSkill.RegistReference();
bigSkill.Level = int.Parse(xmlNodeList[i].Attributes[3].Value);
bigSkill.CoolTimer = float.Parse(xmlNodeList[i].Attributes[4].Value);
bigSkill.UsingTimer = float.Parse(xmlNodeList[i].Attributes[5].Value);
bigSkill._ItemStatus = (SkillStatus)Enum.Parse(typeof(SkillStatus), xmlNodeList[i].Attributes[1].Value); //Sa0
bigSkill._BarStatus = (SkillStatus)Enum.Parse(typeof(SkillStatus), xmlNodeList[i].Attributes[2].Value); //Sa1
bigSkill.RegistValue(elapse, ffList);
}
else if (xmlNodeList[i].Attributes[0].Value == SkillType.Pack.ToString())
{
Pack pack = (Pack)SkillDic[xmlNodeList[i].Attributes[1].Value];
pack.RegistReference();
pack.Level = int.Parse(xmlNodeList[i].Attributes[3].Value);
pack._ItemStatus = (SkillStatus)Enum.Parse(typeof(SkillStatus), xmlNodeList[i].Attributes[2].Value);
pack.RegistValue(elapse, ffList);
}
else if (xmlNodeList[i].Attributes[0].Value == SkillType.Ability.ToString())
{
Ability ability = (Ability)SkillDic[xmlNodeList[i].Name];
ability.RegistReference();
ability.Level = int.Parse(xmlNodeList[i].Attributes[2].Value);
ability._ItemStatus = (SkillStatus)Enum.Parse(typeof(SkillStatus), xmlNodeList[i].Attributes[1].Value);
ability.RegistValue(elapse, ffList);
}
else
{
throw new Exception();
}
}
#endregion
#region 读花朵存档
XmlAttributeCollection attributes = Data.PlayerNode.SelectSingleNode("FlowerList").Attributes;
if (string.IsNullOrEmpty(attributes[0].Value) == false)
{
string[] strings = attributes[0].Value.Split(' ');
for (int i = 0; i < strings.Length; i++)
{
if (string.IsNullOrEmpty(strings[i]))
{
continue;
}
int id = int.Parse(strings[i]);
ManaGarden.FlowerDic[id].Unlock = true;
}
}
attributes = Data.PlayerNode.SelectSingleNode("PlantList").Attributes;
for (int i = 0; i < attributes.Count; i++)
{
int id = int.Parse(attributes[i].Value);
ManaGarden.PlaceFlower(id, ManaReso.Get(attributes[i].Name));
}
#endregion
#region 读数据存档
Level = int.Parse(Data.PlayerNode.SelectSingleNode("Level").Attributes[0].Value);
Coin = double.Parse(Data.PlayerNode.SelectSingleNode("Coin").Attributes[0].Value);
Diamond = double.Parse(Data.PlayerNode.SelectSingleNode("Diamond").Attributes[0].Value);
#endregion
#region 计算离线收入
double collectCoin = 0;
if (ffList.Count > 0)
{
for (int i = 0; i < ffList.Count; i++)
{
for (int j = 0; j < ffCoolList.Count; j++)
{
if (ffCoolList[j].SkillType == SkillType.Skill || ffCoolList[j].SkillType == SkillType.BigSkill)
{
if (i == 0)
{
((Skill) ffCoolList[j]).CoolTimer -= CircleTimer;
}
else
{
((Skill)ffCoolList[j]).CoolTimer -= CircleTime;
}
}
}
for (int j = 0; j < ffList[i].Count; j++)
{
ffList[i][j].Annul();
ffCoolList.Add(ffList[i][j]);
}
NewPerson = Person * (1 + SkillPersonBuff) + SkillPerson;
NewCoinPerson = CoinPerson + SkillCoinPerson;
collectCoin += (NewPerson * NewCoinPerson * CircleTime) * (1 + SkillPlus);
}
Coin += collectCoin;
ManaReso.SetText("A_IconLab", collectCoin.ToString("0"));
CircleTimer = (float)((elapse - CircleTimer) % CircleTime);
}
else
{
CircleTimer = (float)(CircleTimer - elapse);
ManaReso.SetText("A_IconLab", "0");
}
#endregion
}
public static bool Pay(double amt, Current current)
{
amt = (long) amt;
if (current == Current.Free)
{
return true;
}
else if (current == Current.AD)
{
return true;
}
else if (current == Current.Cash)
{
return true;
}
else if (current == Current.Coin)
{
if (Coin >= amt)
{
Coin -= amt;
return true;
}
else
{
ManaLog.Log("您没有足够的金币");
return false;
}
}
else if (current == Current.Diamond)
{
if (Diamond >= amt)
{
Diamond -= amt;
return true;
}
else
{
ManaLog.Log("您没有足够的钻石");
return false;
}
}
else
{
throw new Exception(current.ToString());
}
}
}