using System; using System.Collections.Generic; using System.Linq; using CodeStage.AntiCheat.ObscuredTypes; using UnityEngine; #region 게임 최초 실행 시 서버 정보 [Serializable] public class SC_ServerStatus { public int ContentsLock; public string URL_ChatServer, URL_LogServer, URL_CouponServer, HotTime; public DateTime HotTimeStart, HotTimeEnd; } [Serializable] public class SC_Version { public string Version, VersionStatus; } #endregion #region 우편 public class SC_Mail { public List Mail; } [Serializable] public class ServerMailData { public string Msg, Reward, RemainTime; public double RewardAmount; public int ID, IsShopItem; public eItem Item; public DateTime RemnantTime; } #endregion public class SC_MyError { public int error; } public class SC_MyResult { public int result; } public partial class ServerData { public DateTime LastTime; public Dictionary> MapData; // <맵ID, <난이도, 데이터>> public SD_Buff Buff; public SD_Equip Equip; /// /// { ID, 0 갯수, 1 제련 레벨, 2 제련 시도 횟수(성공 시 초기화) } /// public Dictionary> Equipment = new Dictionary>(); public List Slot; /// /// { ID, 0 갯수, 1 총 획득량, 2 총 사용량 } /// public Dictionary> Item = new Dictionary>(); /// /// { ID, 0 갯수, 1 레벨, 2 총 획득량, 3 총 사용량 } /// public Dictionary> Enchant = new Dictionary>(); /// /// { ID, 0 레벨, 1 각성 } /// public Dictionary> Skill = new Dictionary>(); public Dictionary Ability = new Dictionary(); public SD_PC PC; public Dictionary Awaken; public Dictionary> LimitSlot; /// /// { ID, 0 갯수, 1 레벨 } /// public Dictionary> Pet = new Dictionary>(); /// /// { ID, 0 갯수, 1 레벨, 2 별 } /// public Dictionary> Relic = new Dictionary>(); public Dictionary Collection = new Dictionary(); // collectionlist n_TargetValue, lv public Dictionary MobKill = new Dictionary(); // 몬스터 id, 처치 수 public SD_Farm Farm; public List Book; public List ChapterQuest; public Dictionary>> Mission; public List Common; public List Memory; public Dictionary> QuickMemory; public List> Title, Pass; public Dictionary Inven = new Dictionary(); // ID, 개수 public Dictionary> Shop, Potion; public Dictionary Event; //public Dictionary>> TotalAdd = new Dictionary>> (); // 아이템, 0 ID, 1 획득개수 //public Dictionary>> TotalUse = new Dictionary>> (); // 아이템, 0 ID, 1 획득개수 // 서버에 저장되지 않는 값 public ObscuredBool IsEnemy; public ServerData() { // 신규 유저 데이터 LastTime = ServerInfo.ServerTime; MapData = new Dictionary>(); var mapdatas = table_battlemapdifficulty.Ins.Get_DataList(); for (int i = 0; i < mapdatas.Count; i++) { var key1 = Get_Key(mapdatas[i].n_MapID); var key2 = Get_Key(MyEnumToInt.Ins.Get_Int(mapdatas[i].e_Difficult)); if (!MapData.ContainsKey(key1)) MapData.Add(key1, new Dictionary()); if (!MapData[key1].ContainsKey(key2)) MapData[key1].Add(key2, new SD_MapData { Stat = new List { 0, 0, 0 } }); } Buff = new SD_Buff { Time = new List { 0, 0, 0 } }; var enchantlst = table_enchanlist.Ins.Get_DataList(); for (int i = 0; i < enchantlst.Count; i++) Enchant.Add(Get_Key(enchantlst[i].n_EnchantID), new List { 0, 1, 0, 0 }); Equip = new SD_Equip(); Equip.Init_NewUser(equipskills => { for (int i = 0; i < equipskills.Count; i++) if (equipskills[i] > 0) Add_SkillLv(equipskills[i]); }); PC = new SD_PC(); Awaken = new Dictionary { { "STR", new SD_PCAwakenData() }, { "DEX", new SD_PCAwakenData() }, { "INT", new SD_PCAwakenData() }, { "LUK", new SD_PCAwakenData() } }; LimitSlot = new Dictionary> { { "1", new List() }, { "2", new List() }, { "3", new List() } }; foreach (var item in LimitSlot) for (int i = 0; i < 6; i++) item.Value.Add(new SD_PCLimitSlotData { ID = 0, Lock = 0 }); Farm = new SD_Farm(); Add_Item(table_GlobalValue.Ins.Get_Int("n_FirstClassID"), 1); Add_Item(table_GlobalValue.Ins.Get_Int("n_FirstEquipPet"), 1); // TODO 정인호 : 테스트 지급 Equip.Set_Equip(eItem.Skill, 703304, 0); Equip.Set_Equip(eItem.Skill, 702005, 1); Equip.Set_Equip(eItem.Skill, 702010, 2); Equip.Set_Equip(eItem.Skill, 702012, 3); Equip.Set_Equip(eItem.Skill, 702008, 4); Equip.Set_Equip(eItem.Skill, 703502, 5); Add_Item(1, 10000); Add_Item(101, 10000); Add_Item(10001, 1000); Add_Item(201, 10000); Add_Item(202, 10000); Add_Item(333, 10000); Add_Item(445, 2); Add_Item(450, 2000); Add_Item(451, 100); Add_Item(452, 100); Add_Item(453, 100); Add_Item(454, 100); Add_Item(461, 10000); Add_Item(50001, 5); Add_Item(50002, 5); Add_Item(441, 50000); Add_Item(2000001, 11); Add_Item(2000002, 12); Add_Item(2000003, 13); Add_Item(2000004, 14); Add_Item(2000005, 15); Add_Item(2000006, 16); Add_Item(456, 16); //Add_SkillAwakenLv(700003); //Add_SkillAwakenLv(700003); //Add_SkillAwakenLv(700003); /////////////////////////// Slot = new List(); foreach (var item in MyValue.dic_EquipmentKey) Slot.Add(new SD_Slot { Parts = item.Key, Lv = 0, Use = 0, Enchant = new List { new SD_Slot_Enchant(), new SD_Slot_Enchant(), new SD_Slot_Enchant(), new SD_Slot_Enchant(), } }); Add_SkillLv(1); // 최초 스킬 하나 지급 Common = new List(); for (eCommon i = 0; i < eCommon.Max; i++) Common.Add(0); Set_Common(eCommon.Title, 1); Memory = new List() { 0, 0, 0, 1000, 0 }; // 0 숲 단계, 1 숲 최종데미지, 2 마녀 등급, 3 투견장 점수, 4 투견장 상대 변경 횟수 // 14개 - Gold, Gem, WeaponStone, RingStone, NeckStone, BootsStone, FairyStone, Exp, 상자1, 상자2, 상자3, 과일, 씨앗, 드랍아이템 QuickMemory = new Dictionary>(); QuickMemory.Add("101", new List { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }); QuickMemory.Add("102", new List { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }); QuickMemory.Add("103", new List { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }); QuickMemory.Add("104", new List { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }); Book = new List(); var booktabledata = table_book.Ins.Get_DataList(); for (int i = 0; i < booktabledata.Count; i++) { var booksdata = new ServerData_Book(); booksdata.Init(booktabledata[i].ID); Book.Add(booksdata); } ChapterQuest = new List(); var chapterdatas = table_chaptertext.Ins.Get_DataList(); for (int i = 0; i < chapterdatas.Count; i++) { var cqdata = new ServerData_ChapterQuest(); cqdata.Init(chapterdatas[i].ID); ChapterQuest.Add(cqdata); } Mission = new Dictionary>> { { MyValue.arr_Mission[0], new List>() }, { MyValue.arr_Mission[1], new List>() }, { MyValue.arr_Mission[2], new List>() } }; var d_missions = table_dailymission.Ins.Get_DataList(); for (int i = 0; i < d_missions.Count; i++) Mission[MyValue.arr_Mission[0]].Add(new List { d_missions[i].n_MissionIndex, 0, 0 }); // ID, 개수, 획득 여부 or 레벨 var r_missions = table_repeatmission.Ins.Get_DataList(); for (int i = 0; i < r_missions.Count; i++) Mission[MyValue.arr_Mission[1]].Add(new List { r_missions[i].n_MissionIndex, 0, 0 }); // ID, 개수, 획득 여부 or 레벨 var a_missions = table_achievementsmission.Ins.Get_DataList(-1); for (int i = 0; i < a_missions.Count; i++) Mission[MyValue.arr_Mission[2]].Add(new List { a_missions[i].n_MissionIndex, 0, 0 }); // ID, 개수, 획득 여부 or 레벨 var titledata = table_title.Ins.Get_DataList(); Title = new List>(); for (int i = 0; i < titledata.Count; i++) // 최초 새싹 칭호 지급, 최초 애기 집사 칭호 지급 Title.Add(new List { titledata[i].ID, titledata[i].ID == 1 || titledata[i].ID == 94 ? 1 : 0, 0, 0 }); // 0 ID, 1 획득 여부, 2 카운트, 3 젬 획득 여부 var passdata = table_pass.Ins.Get_PassTypes(); Pass = new List>(); foreach (var item in passdata) Pass.Add(new List { item.Key, 0, 0, 0, 0 }); // 0 PassType, 1 패스 구매 상태, 2 획득 무료 스텝, 3 획득 패스 스텝, 4 출석 DoY Shop = new Dictionary>(); var shopdata = table_shop.Ins.Get_DataList(); for (int i = 0; i < shopdata.Count; i++) Shop.Add(shopdata[i].ID.ToString(), new List() { 0, 0, 0, 0, 0 }); // 0 광고 쿨타임, 1 총 구매횟수, 2 일일 구매, 3 주간 구매, 4 월간 구매 Potion = new Dictionary>(); var potionTdata = table_kettle.Ins.Get_DataList(eItem.Potion); for (int i = 0; i < potionTdata.Count; i++) Potion.Add(potionTdata[i].ID.ToString(), new List() { 0, 0 }); // 0 개수, 1 효과 남은 시간 } public ServerData_Read Get_ServerRead() { // 서버로 보내는 저장 데이터 ServerData_Read temp = new ServerData_Read(); temp.LastTime = LastTime.ToString("yyyyMMddHHmmss"); temp.MapData = new Dictionary>(); foreach (var item in MapData) { temp.MapData.Add(item.Key, new Dictionary()); foreach (var item2 in item.Value) temp.MapData[item.Key].Add(item2.Key, item2.Value.Get()); } temp.Buff = Buff.Get(); temp.Skill = DSUtil.Get_T_Dic(Skill); temp.Equip = Equip.Get(); temp.Equipment = DSUtil.Get_T_Dic(Equipment); temp.Slot = new List(); for (int i = 0; i < Slot.Count; i++) temp.Slot.Add(Slot[i].Get()); temp.Item = DSUtil.Get_T_Dic(Item); temp.Enchant = DSUtil.Get_T_Dic(Enchant); temp.Ability = DSUtil.Get_T_Dic(Ability); temp.PC = PC.Get(); temp.Awaken = new Dictionary(); foreach (var item in Awaken) temp.Awaken.Add(item.Key, item.Value.Get()); temp.LimitSlot = new Dictionary>(); foreach (var item in LimitSlot) { temp.LimitSlot.Add(item.Key, new List()); for (int i = 0; i < item.Value.Count; i++) temp.LimitSlot[item.Key].Add(item.Value[i].Get()); } temp.Pet = DSUtil.Get_T_Dic(Pet); temp.Relic = DSUtil.Get_T_Dic(Relic); temp.Collection = DSUtil.Get_T_Dic(Collection); temp.MobKill = DSUtil.Get_T_Dic(MobKill); temp.Farm = Farm.Get(); temp.Common = DSUtil.Get_T_List(Common); temp.Memory = DSUtil.Get_T_List(Memory); temp.Mission = DSUtil.Get_T_Dic(Mission); temp.QuickMemory = DSUtil.Get_T_Dic(QuickMemory); temp.Book = new List(); for (int i = 0; i < Book.Count; i++) temp.Book.Add(Book[i].Get()); temp.ChapterQuest = new List(); for (int i = 0; i < ChapterQuest.Count; i++) temp.ChapterQuest.Add(ChapterQuest[i].Get()); temp.Title = DSUtil.Get_T_List(Title); temp.Pass = DSUtil.Get_T_List(Pass); foreach (var item in Inven) temp.Inven.Add(item.Key, item.Value); temp.Shop = DSUtil.Get_T_Dic(Shop); temp.Potion = DSUtil.Get_T_Dic(Potion); if (Event != null) temp.Event = DSUtil.Get_T_Dic(Event); //temp.TotalAdd = TotalAdd; //temp.TotalUse = TotalUse; return temp; } } [Serializable] public class ServerData_Read { public string LastTime; public Dictionary> MapData; // <맵ID, <난이도, 데이터>> public SD_Buff_Read Buff; public SD_Equip_Read Equip; public Dictionary> Equipment, Item, Enchant; public List Slot; public Dictionary> Skill; public Dictionary Ability; public SD_PC_Read PC; public Dictionary Awaken; public Dictionary> LimitSlot; public Dictionary> Pet, Relic; public Dictionary Collection; public Dictionary MobKill; public SD_Farm_Read Farm; public List Book; public List ChapterQuest; public Dictionary>> Mission; public List Common; public List Money, Memory; public Dictionary> Gamble, QuickMemory; public List> Title, Pass; public Dictionary Inven = new Dictionary(); public Dictionary> Shop, Potion; public Dictionary Event; public Dictionary>> TotalAdd = new Dictionary>>(); // 아이템, 0 ID, 1 획득개수 public Dictionary>> TotalUse = new Dictionary>>(); // 아이템, 0 ID, 1 획득개수 public ServerData Get_ServerData(bool _isEnemy) { // 서버 데이터 로드 ServerData temp = new ServerData(); temp.IsEnemy = _isEnemy; temp.LastTime = DateTime.ParseExact(LastTime, "yyyyMMddHHmmss", new System.Globalization.CultureInfo("en-US")); temp.MapData = new Dictionary>(); foreach (var item in MapData) { temp.MapData.Add(item.Key, new Dictionary()); foreach (var item2 in item.Value) temp.MapData[item.Key].Add(item2.Key, item2.Value.Get()); } temp.Buff = Buff.Get(); temp.Skill = DSUtil.Get_T_Dic(Skill); temp.Equip = Equip.Get(); temp.Equipment = DSUtil.Get_T_Dic(Equipment); temp.Slot = new List(); for (int i = 0; i < Slot.Count; i++) temp.Slot.Add(Slot[i].Get()); temp.Item = DSUtil.Get_T_Dic(Item); temp.Enchant = DSUtil.Get_T_Dic(Enchant); temp.Ability = DSUtil.Get_T_Dic(Ability); temp.PC = PC.Get(); temp.Awaken = new Dictionary(); foreach (var item in Awaken) temp.Awaken.Add(item.Key, item.Value.Get()); temp.LimitSlot = new Dictionary>(); foreach (var item in LimitSlot) { temp.LimitSlot.Add(item.Key, new List()); for (int i = 0; i < item.Value.Count; i++) temp.LimitSlot[item.Key].Add(item.Value[i].Get()); } temp.Pet = DSUtil.Get_T_Dic(Pet); temp.Relic = DSUtil.Get_T_Dic(Relic); temp.Collection = DSUtil.Get_T_Dic(Collection); temp.MobKill = DSUtil.Get_T_Dic(MobKill); temp.Farm = Farm.Get(); temp.Common = DSUtil.Get_T_List(Common); temp.Memory = DSUtil.Get_T_List(Memory); temp.Mission = DSUtil.Get_T_Dic(Mission); if (QuickMemory != null) temp.QuickMemory = DSUtil.Get_T_Dic(QuickMemory); temp.Book = new List(); for (int i = 0; i < Book.Count; i++) temp.Book.Add(Book[i].Get()); temp.ChapterQuest = new List(); for (int i = 0; i < ChapterQuest.Count; i++) temp.ChapterQuest.Add(ChapterQuest[i].Get()); temp.Title = DSUtil.Get_T_List(Title); temp.Pass = DSUtil.Get_T_List(Pass); foreach (var item in Inven) temp.Inven.Add(item.Key, item.Value); temp.Shop = DSUtil.Get_T_Dic(Shop); temp.Potion = DSUtil.Get_T_Dic(Potion); if (Event != null) temp.Event = DSUtil.Get_T_Dic(Event); //temp.TotalAdd = TotalAdd; //temp.TotalUse = TotalUse; #region 추가 데이터 체크 var mapdatas = table_battlemapdifficulty.Ins.Get_DataList(); for (int i = 0; i < mapdatas.Count; i++) { var key1 = mapdatas[i].n_MapID.ToString(); var key2 = MyEnumToInt.Ins.Get_Int(mapdatas[i].e_Difficult).ToString(); if (!temp.MapData.ContainsKey(key1)) temp.MapData.Add(key1, new Dictionary()); if (!temp.MapData[key1].ContainsKey(key2)) temp.MapData[key1].Add(key2, new SD_MapData { Stat = new List { 0, 0, 0 } }); } DataCheck(Common, temp.Common, (int)eCommon.Max); #endregion return temp; } public void DataCheck(List read, List sdata, int max) { if (read.Count < max) { int diff = max - read.Count; for (int i = 0; i < diff; i++) sdata.Add(0); } } } public partial class ServerData { Dictionary dic_Key = new Dictionary(); string Get_Key(int itemid) { if (!dic_Key.ContainsKey(itemid)) dic_Key.Add(itemid, itemid.ToString()); return dic_Key[itemid]; } #region MapData public ObscuredInt MapData_Get_StatLv(int mapid, int diff, eMainStatType stat) { var key1 = Get_Key(mapid); var key2 = Get_Key(diff); if (MapData.ContainsKey(key1) && MapData[key1].ContainsKey(key2)) return MapData[key1][key2].Get_Stat(stat); return 0; } public List MapData_Get_StatLvs(int mapid, int diff) { var key1 = Get_Key(mapid); var key2 = Get_Key(diff); if (MapData.ContainsKey(key1) && MapData[key1].ContainsKey(key2)) return MapData[key1][key2].Get_Stats(); return new List { 0, 0, 0 }; } public void MapData_Add_StatLv(int mapid, int diff, eMainStatType stat, int addlv = 1) { var key1 = Get_Key(mapid); var key2 = Get_Key(diff); if (MapData.ContainsKey(key1) && MapData[key1].ContainsKey(key2)) MapData[key1][key2].Add_Stat(stat, addlv); } #endregion #region 스킬 public int Get_EquipSkillID(int _slot) { return Equip.Skill[Equip.Preset][_slot]; } public bool IsEquipSkill(int skillid, int preset = 0) { if (preset == 0) preset = Equip.Preset; var lst = Equip.Skill[preset]; for (int i = 0; i < lst.Count; i++) if (lst[i] > 0 && lst[i] == skillid) return true; return false; } public int Get_SkillLv(eRole role, int id) { return role == eRole.PC || role == eRole.EnemyPC ? Get_SkillLv(id) : Get_PetLv(id); } int Get_SkillLv(int _skillid) { var key = Get_Key(_skillid); return Skill.ContainsKey(key) ? Skill[key][0] : 0; } public int Get_SkillAwakenLv(int _skillid) { var key = Get_Key(_skillid); return Skill.ContainsKey(key) ? Skill[key][1] : 0; } public int Get_PetSkillAwakenLv(int petid) { var petlv = Get_PetLv(petid); if (petlv >= table_GlobalValue.Ins.Get_Int("n_PetSkillAwaken_Lv3")) return 3; else if (petlv >= table_GlobalValue.Ins.Get_Int("n_PetSkillAwaken_Lv2")) return 2; else if (petlv >= table_GlobalValue.Ins.Get_Int("n_PetSkillAwaken_Lv1")) return 1; return 0; } public void Add_SkillLv(int _skillid, int _lv = 1) { var key = Get_Key(_skillid); if (!Skill.ContainsKey(key)) Skill.Add(key, new List { 0, 0 }); Skill[key][0] += _lv; Skill[key][0].RandomizeCryptoKey(); } public void Add_SkillAwakenLv(int _skillid) { var key = Get_Key(_skillid); if (!Skill.ContainsKey(key)) Skill.Add(key, new List { 0, 0 }); ++Skill[key][1]; Skill[key][1].RandomizeCryptoKey(); } #endregion #region 장비 (무기, 갑옷, 장갑, 신발, 목걸이, 반지) public int Get_EqiupmentEquip(eItem _item) { return Equip.Equip[_item]; } public int Get_SmeltingLv(int id) { var key = Get_Key(id); if (Equipment.ContainsKey(key)) return (int)Equipment[key][1]; return 0; } public void Try_SmeltingLvUp(EquipmentSmeltingTableData Tdata, int id, Action refresh) { var lv = Get_SmeltingLv(id); var limitdata = table_breakinglimit.Ins.Get_Data_orNull(Get_LimitLv()); if (lv < limitdata.n_Equip_Upgrade_Limit) { if (Check_ItemAmount(id, Tdata.n_UpgradePrice)) { var key = Get_Key(id); Use_Item(id, Tdata.n_UpgradePrice); if (DSUtil.RandomTrue(Tdata.f_NextStepRate * 0.01)) { ++Equipment[key][1]; Equipment[key][1].RandomizeCryptoKey(); Equipment[key][2] = 0; refresh(true); MyValue.Get_ActorStatInfoorNull(eRole.PC); } else { Equipment[key][2]++; Equipment[key][2].RandomizeCryptoKey(); refresh(false); } } } else ToastUI.Ins.Set(266); } public int Get_EquipmentTLv(eItem _type, int _id) { var key = MyValue.dic_EquipmentKey[_type]; //return Equipment[_type.ToString()].Find(f => f[0] == _id)[2]; return 0; } public void Add_EquipmentTLv(eItem item, int id, int lv = 1) { var key = MyValue.dic_EquipmentKey[item]; //var data = Equipment[item.ToString()].Find(f => f[0] == id); //data[2] += lv; //data[2].RandomizeCryptoKey(); } public bool IsEquip(eItem _type, int _id) { return Get_EqiupmentEquip(_type) == _id; } public SD_Slot Get_SlotData(eItem parts) { return Slot.Find(f => f.Parts == parts); } public void Add_SlotLv(eItem parts, double useAmount, int addlv = 1) { var slot = Get_SlotData(parts); if (!DSUtil.CheckNull(slot)) { slot.Use += useAmount; slot.Use.RandomizeCryptoKey(); slot.Lv += addlv; slot.Lv.RandomizeCryptoKey(); } } public void Init_SlotLv(eItem parts, int itemid) { // TODO 정인호 : slot.Use 값만큼 재료 돌려주기 var slot = Get_SlotData(parts); if (!DSUtil.CheckNull(slot)) { Add_Item(itemid, slot.Use); ToastUI.Ins.Set(174, $"초기화하여 {itemid} 아이템 {slot.Use}개를 획득"); slot.Use = 0; slot.Use.RandomizeCryptoKey(); slot.Lv = 0; slot.Lv.RandomizeCryptoKey(); } } public void Set_SlotEnchant(eItem parts, int index, int optionid, int lv) { var slot = Get_SlotData(parts); if (!DSUtil.CheckNull(slot)) { slot.Enchant[index].ID = optionid; slot.Enchant[index].ID.RandomizeCryptoKey(); slot.Enchant[index].Lv = lv; slot.Enchant[index].Lv.RandomizeCryptoKey(); // TODO 정인호 : RND_SKILL 의 경우 스킬 ID를 지정해야한다. } } #endregion #region 인챈트 public double Get_EnchantAmount(int id) { var key = Get_Key(id); return Enchant.ContainsKey(key) ? Enchant[key][0] : 0; } public int Get_EnchantLv(int id) { var key = Get_Key(id); return Enchant.ContainsKey(key) ? (int)Enchant[Get_Key(id)][1] : 0; } public void Add_EnchantLv(int id, int addlv = 1) { var key = Get_Key(id); if (Enchant.ContainsKey(key)) { ++Enchant[Get_Key(id)][1]; Enchant[Get_Key(id)][1].RandomizeCryptoKey(); } } #endregion #region 특성 public void Init_Ability(eBattleType battleType) { var lst = table_abilityconfig.Ins.Get_DataList(battleType); var moneyid = table_GlobalValue.Ins.Get_Int("n_AbilityMaterialID"); for (int i = 0; i < lst.Count; i++) { var key = Get_Key(lst[i].n_AbilityID); if (Ability.ContainsKey(key)) { Add_Item(moneyid, Ability[key]); Ability[key] = 0; Ability[key].RandomizeCryptoKey(); } } } public int Get_AbilityLv(int id) { var key = Get_Key(id); if (Ability.ContainsKey(key)) return Ability[key]; return 0; } public void Add_AbilityLv(int id, int lv = 1) { var key = Get_Key(id); if (!Ability.ContainsKey(key)) Ability.Add(key, 0); ++Ability[key]; Ability[key].RandomizeCryptoKey(); } public int Get_ObtainAbility(List lst) { int count = 0; for (int i = 0; i < lst.Count; i++) { if (Get_AbilityLv(lst[i].n_AbilityID) > 0) ++count; } return count; } #endregion #region 각성 public int Get_AwakenLv(eStat stat) { return Awaken[stat.ToString()].Lv; } public void Add_AwakenLv(eStat stat) { var key = stat.ToString(); ++Awaken[key].Lv; Awaken[key].Lv.RandomizeCryptoKey(); Awaken[key].Exp = 0; Awaken[key].Exp.RandomizeCryptoKey(); } public int Get_AwakenExp(eStat stat) { return Awaken[stat.ToString()].Exp; } public void Add_AwakenExp(eStat stat) { var key = stat.ToString(); ++Awaken[key].Exp; Awaken[key].Exp.RandomizeCryptoKey(); } public int Get_AwakenNow(eStat stat) { return Get_AwakenExp(stat) % 4; } int Get_AwakenCurStepSlotLv(eStat stat, int updradeOrder, int exp) { var slotlv = (exp / 4) + 1 - (4 - updradeOrder); if (exp < updradeOrder) slotlv = 0; // 요구 조건을 만족하지 못하면 lv 0 else slotlv = (exp - updradeOrder) / 4 + 1; return slotlv; } public int Get_AwakenSlotLv(eStat stat, int updradeOrder) { int slotlv = 0; var lv = Get_AwakenLv(stat); for (int i = 0; i < lv; i++) { var upgradedata = table_awakenupgrade.Ins.Get_Data_orNull(i + 1); var templv = lv - 1 == i ? Get_AwakenCurStepSlotLv(stat, updradeOrder, Get_AwakenExp(stat)) : Get_AwakenCurStepSlotLv(stat, updradeOrder, upgradedata.n_MaxUpgradeLevel); slotlv += templv; } return slotlv; } #endregion #region 초월(한계돌파) public int Get_LimitLv() { return PC.LLv; } public void Add_LimitLv() { ++PC.LLv; PC.LLv.RandomizeCryptoKey(); } public List Get_LimitSlot(string preset) { return LimitSlot[preset]; } public void Set_LimitSlotID(string preset, int slot, int id, int lv) { var lst = Get_LimitSlot(preset); var index = slot - 1; if (lst[index].Lock == 0) { lst[index].ID = id; lst[index].ID.RandomizeCryptoKey(); lst[index].Lv = lv; lst[index].Lv.RandomizeCryptoKey(); } } public void Set_LimitSlotLock(string preset, int slot) { var lst = Get_LimitSlot(preset); var index = slot - 1; lst[index].Lock = lst[index].Lock == 0 ? 1 : 0; lst[index].Lock.RandomizeCryptoKey(); } #endregion #region 펫 public int Get_PetLv(int _petid) { var key = Get_Key(_petid); return Pet.ContainsKey(key) ? Pet[key][1] : 0; } public void Add_PetLv(int _petid, int _addlv = 1) { var key = Get_Key(_petid); if (Pet.ContainsKey(key)) { Pet[key][1] += _addlv; Pet[key][1].RandomizeCryptoKey(); } } #endregion #region 유물 public int Get_RelicLv(int id) { var key = Get_Key(id); if (Relic.ContainsKey(key)) return Relic[key][1]; return 0; } public void Add_RelicLv(int id) { var key = Get_Key(id); if (!Relic.ContainsKey(key)) Relic.Add(key, new List { 0, 0, 0 }); ++Relic[key][1]; Relic[key][1].RandomizeCryptoKey(); } public int Get_RelicStar(int id) { var key = Get_Key(id); if (Relic.ContainsKey(key)) return Relic[key][2]; return 0; } public void Add_RelicStar(int id) { var key = Get_Key(id); if (!Relic.ContainsKey(key)) Relic.Add(key, new List { 0, 0, 0 }); ++Relic[key][2]; Relic[key][2].RandomizeCryptoKey(); } #endregion #region 장비, 몬스터 도감 public int Get_CollectionLv(int id) { var key = Get_Key(id); if (Collection.ContainsKey(key)) return Collection[key]; return 0; } public void Add_CollectionLv(int id) { var key = Get_Key(id); if (!Collection.ContainsKey(key)) Collection.Add(key, 0); ++Collection[key]; Collection[key].RandomizeCryptoKey(); } public double Get_CollectionMobKill(int id) { var key = Get_Key(id); if (MobKill.ContainsKey(key)) return MobKill[key]; return 0; } public void Add_CollectionMobKill(int id) { var key = Get_Key(id); if (!MobKill.ContainsKey(key)) MobKill.Add(key, 0); ++MobKill[key]; MobKill[key].RandomizeCryptoKey(); } public void Use_CollectionMobKill(int id, int amount) { var key = Get_Key(id); if (MobKill.ContainsKey(key)) { MobKill[key] -= amount; MobKill[key].RandomizeCryptoKey(); } } public bool Noti_CollectionEquipment(eTargetCondition targetCondition, int menucategory) { var lst = table_collectionlist.Ins.Get_DataList(targetCondition, menucategory); for (int i = 0; i < lst.Count; i++) { while (true) { var amount = Get_ItemAmount(lst[i].n_TargetValue); var conditon = lst[i].Get_ConditionCount(Get_CollectionLv(lst[i].n_TargetValue)); if (amount >= conditon) return true; else break; } } return false; } public bool Noti_CollectionMob(eTargetCondition targetCondition, int menucategory) { var lst = table_collectionlist.Ins.Get_DataList(targetCondition, menucategory); for (int i = 0; i < lst.Count; i++) { while (true) { var amount = Get_CollectionMobKill(lst[i].n_TargetValue); var conditon = lst[i].Get_ConditionCount(Get_CollectionLv(lst[i].n_TargetValue)); if (amount >= conditon) return true; else break; } } return false; } #endregion #region 농장 public void Add_FarmMaxSlot() { ++Farm.MaxSlot; if (Farm.Slot.Count - 1 < Farm.MaxSlot) Farm.MaxSlot = Farm.Slot.Count - 1; Farm.MaxSlot.RandomizeCryptoKey(); } public int Get_FarmMaxSlot() { return Farm.MaxSlot; } public void Set_FarmSlot(int slot, int grade, double time, int enchantid) { var sSlot = Farm.Slot.Find(f => f.Slot == slot); sSlot.Grade = grade; sSlot.Grade.RandomizeCryptoKey(); sSlot.Time = Math.Round(time, 3); // 소수점 셋째 자리에서 반올림 sSlot.Time.RandomizeCryptoKey(); sSlot.EnchantID = enchantid; sSlot.EnchantID.RandomizeCryptoKey(); } public void Sub_AllFarmSlotTime(int sec = 1) { for (int i = 0; i < Farm.Slot.Count; i++) { if (Farm.Slot[i].Time > 0) { Farm.Slot[i].Time -= sec; if (Farm.Slot[i].Time < 0) Farm.Slot[i].Time = 0; Farm.Slot[i].Time.RandomizeCryptoKey(); } } } public int Get_EatFruitCount(int fruitid) { var key = Get_Key(fruitid); if (Farm.Eat.ContainsKey(key)) return Farm.Eat[key]; return 0; } public void Add_EatFruitCount(int fruitid, int amount) { var key = Get_Key(fruitid); if (!Farm.Eat.ContainsKey(key)) Farm.Eat.Add(key, amount); else Farm.Eat[key] += amount; Farm.Eat[key].RandomizeCryptoKey(); } public void Buy_FarmShopItem(int shopid, int time) { var data = Get_FarmShopData(shopid); ++data[1]; data[1].RandomizeCryptoKey(); // 구매 횟수 증가 data[2] = time; data[2].RandomizeCryptoKey(); // 구매 딜레이 시간 } public List Get_FarmShopData(int shopid) { return Farm.Shop.Find(f => f[0] == shopid); } public void Sub_AllFarmShopTime(int sec = 1) { for (int i = 0; i < Farm.Shop.Count; i++) { if (Farm.Shop[i][2] > 0) { Farm.Shop[i][2] -= sec; if (Farm.Shop[i][2] < 0) Farm.Shop[i][2] = 0; Farm.Shop[i][2].RandomizeCryptoKey(); } } } #endregion #region Common public void Init_Daily() { Set_Common(eCommon.DOY_Day, ServerInfo.ServerTime.DayOfYear); Farm.Shop = table_farmshoplist.Ins.Get_ShopInit(); if (!DSUtil.CheckNull(FarmShopUI.Ins) && FarmShopUI.Ins.isActiveAndEnabled) FarmShopUI.Ins.Set(); Set_Common(eCommon.Roullette_Count, 0); Set_Common(eCommon.Roullette_LuckyCount, 0); Set_Common(eCommon.Roullette_ADCount, 0); Init_DailyQuest(); Init_Pass(); Init_Shop(); //var amount = 1 - Get_ItemAmount(eItem.MemoryField); //if (amount > 0) Add_Item(new ItemData(eItem.MemoryField, 0, amount)); //amount = 2 - Get_ItemAmount(eItem.MemoryForest); //if (amount > 0) Add_Item(new ItemData(eItem.MemoryForest, 0, amount)); //amount = 1 - Get_ItemAmount(eItem.MemoryDungeon); //if (amount > 0) Add_Item(new ItemData(eItem.MemoryDungeon, 0, amount)); //amount = 1 - Get_ItemAmount(eItem.MemoryWitchGrade); //if (amount > 0) Add_Item(new ItemData(eItem.MemoryWitchGrade, 0, amount)); //amount = 5 - Get_ItemAmount(eItem.MemoryPetBattle); //if (amount > 0) Add_Item(new ItemData(eItem.MemoryPetBattle, 0, amount)); //Memory[4] = 0; Memory[4].RandomizeCryptoKey(); if (GameUI.Ins != null) GameUI.Ins.LobbyUI.Set_Noti(); } public void Init_Week(int numweek) { Set_Common(eCommon.DOY_Week, numweek); LastTime = ServerInfo.ServerTime; Init_ShopWeek(); } public void Init_Month() { Set_Common(eCommon.Month, ServerInfo.ServerTime.DayOfYear); Init_ShopMonth(); } public int Get_Common(eCommon common, bool _realvalue = false) { return Common[MyEnumToInt.Ins.Get_Int(common)]; } public void Add_Common(eCommon _common, int _value = 1) { var index = MyEnumToInt.Ins.Get_Int(_common); Common[index] += _value; Common[index].RandomizeCryptoKey(); } public void Set_Common(eCommon _common, int _value) { var index = MyEnumToInt.Ins.Get_Int(_common); Common[index] = _value; Common[index].RandomizeCryptoKey(); } public void Sub_Common(eCommon _common, int _value = 1) { var index = MyEnumToInt.Ins.Get_Int(_common); Common[index] -= _value; if (Common[index] < 0) Common[index] = 0; // 23.01.31 정인호. 현 시점까진 0 미만 값 없음 Common[index].RandomizeCryptoKey(); } #endregion #region 책 public int Get_BookSumPage(int _id) { return Book.Find(f => f.ID == _id).Page.Sum(s => s); } public int Get_BookPage(int _id, int _page) { return Book.Find(f => f.ID == _id).Page[_page - 1]; } public bool IsComplete_Book(int _id) { return Book.Find(f => f.ID == _id).Complete > 0; } public void Set_BookComplete(int _id) { Book.Find(f => f.ID == _id).Set_Complete(); } public bool ExistCanCompleteBook() { var tdata = table_book.Ins.Get_DataList(); for (int i = 0; i < tdata.Count; i++) { var temp = tdata[i] as BookTableData; if (!IsComplete_Book(temp.ID) && Get_BookSumPage(tdata[i].ID) == temp.TotalPage) return true; } return false; } #endregion #region 미션 public void Init_DailyQuest() { var daily = Mission[MyValue.arr_Mission[0]]; for (int i = 0; i < daily.Count; i++) { daily[i][1] = daily[i][2] = 0; daily[i][1].RandomizeCryptoKey(); daily[i][2].RandomizeCryptoKey(); } } public void Set_MissionCount(string _key, int _id, int _v) { var ms = Mission[_key].Find(f => f[0] == _id); if (ms != null) { ms[1] = _v; ms[1].RandomizeCryptoKey(); } } public void Add_MissionCount(string _key, int _id, int _v = 1) { if (_v < 1) return; var ms = Mission[_key].Find(f => f[0] == _id); if (ms != null) { ms[1] += _v; ms[1].RandomizeCryptoKey(); } } public int Get_MissionCount(string _key, int _id) { return Mission[_key].Find(f => f[0] == _id)[1]; } public bool CanGet_MissionDaily() { var dm = Mission[MyValue.arr_Mission[0]]; var tdata = table_dailymission.Ins.Get_DataList(); for (int i = 0; i < dm.Count; i++) { if (dm[i][2] == 0) { var purposecount = tdata.Find(f => f.n_MissionIndex == dm[i][0]).n_PurposeCount; if (dm[i][1] >= purposecount) return true; } } return false; } public bool CanGet_MissionRepeat() { var dm = Mission[MyValue.arr_Mission[1]]; var tdata = table_repeatmission.Ins.Get_DataList(); for (int i = 0; i < dm.Count; i++) { var purposecount = tdata.Find(f => f.n_MissionIndex == dm[i][0]).n_PurposeCount; var curCount = dm[i][1] - dm[i][2] * purposecount; if (curCount >= purposecount) return true; } return false; } public int Get_AchiCount(int _missionid) { ObscuredInt count = 0; if (_missionid >= 501 && _missionid <= 504) { // 고서 완성 개수 var bookcount = table_book.Ins.Get_DataList().Count; for (int i = 0; i < bookcount; i++) count += IsComplete_Book(i + 1) ? 1 : 0; } else if (_missionid == 505) // 전설 지팡이 개수 count = Get_EquipmentObtainCount(0, 21, 24); else if (_missionid == 506) // 신화 지팡이 개수 count = Get_EquipmentObtainCount(0, 25, 28); else if (_missionid == 507) // 전설 반지 개수 count = Get_EquipmentObtainCount(2, 21, 24); else if (_missionid == 508) // 신화 반지 개수 count = Get_EquipmentObtainCount(2, 25, 28); else if (_missionid == 509) // 전설 목걸이 개수 count = Get_EquipmentObtainCount(3, 21, 24); else if (_missionid == 510) // 신화 목걸이 개수 count = Get_EquipmentObtainCount(3, 25, 28); else if (_missionid == 511) // 전설 신발 개수 count = Get_EquipmentObtainCount(4, 21, 24); else if (_missionid == 512) // 신화 신발 개수 count = Get_EquipmentObtainCount(4, 25, 28); else if (_missionid == 513) // 전설 요정 개수 count = Get_EquipmentObtainCount(5, 21, 24); else if (_missionid == 514) // 신화 요정 개수 count = Get_EquipmentObtainCount(5, 25, 28); else if (_missionid == 515) // 전설 마법 개수 count = Get_MagicObtainCount(21, 24); else if (_missionid == 516) // 신화 마법 개수 count = Get_MagicObtainCount(25, 28); else if (_missionid >= 517 && _missionid <= 523) { // 마법 모두 개화 개수 foreach (var item in Skill) { if (item.Value[2] >= 3) ++count; } } else if (_missionid > 600) count = Mission[MyValue.arr_Mission[2]].Find(f => f[0] == _missionid)[1]; count.RandomizeCryptoKey(); return count; } public bool CanGet_MissionAchi(int chapter) { var dm = Mission[MyValue.arr_Mission[2]]; var t_achi = table_achievementsmission.Ins.Get_DataList(chapter); for (int i = 0; i < t_achi.Count; i++) { var mdata = dm.Find(f => f[0] == t_achi[i].n_MissionIndex); if (mdata[2] < 1) { var tabledata = t_achi[i]; if (Get_AchiCount(t_achi[i].n_MissionIndex) >= tabledata.n_PurposeCount) return true; } } return false; } int Get_EquipmentObtainCount(int type, int minid, int maxid) { int count = 0; //var items = Equipment[MyValue.str_EquipMent[type]].FindAll(f => f[0] >= minid && f[0] <= maxid); //for (int i = 0; i < items.Count; i++) // count += items[i][1] > 0 ? 1 : 0; return count; } int Get_MagicObtainCount(int minid, int maxid) { int count = 0; // 조건에 맞는 항목 필터링 var items = Skill.Values.Where(list => list[0] >= minid && list[0] <= maxid); // 필터링된 항목에 대해 처리 foreach (var item in items) { if (item[2] > 0) count++; } return count; } #endregion #region 칭호 public void Add_TitleCondition(params int[] ids) { for (int i = 0; i < ids.Length; i++) { var title = Title.Find(f => f[0] == ids[i]); if (title[2] + 100 < int.MaxValue) { ++title[2]; title[2].RandomizeCryptoKey(); var tdata = table_title.Ins.Get_Data(ids[i]); if (title[2] >= tdata.ConditionValue) Add_Item(new ItemData(eItem.Title, ids[i], 1)); } } } public int Get_TitleCondition(int id) { return Title.Find(f => f[0] == id)[2]; } public void Check_TitleCondition(double _v, params int[] ids) { for (int i = 0; i < ids.Length; i++) { if (ids[i] > 0) { var title = Title.Find(f => f[0] == ids[i]); if (title[1] == 0) { var tdata = table_title.Ins.Get_Data(ids[i]); if (tdata.BiggerThan) { if (_v >= tdata.ConditionValue) Add_Item(new ItemData(eItem.Title, ids[i], 1)); } else { if (_v <= tdata.ConditionValue) Add_Item(new ItemData(eItem.Title, ids[i], 1)); } } } } } public float Get_TitleValue(eStat _stat) { var lst = table_title.Ins.Get_DataList(_stat); ObscuredFloat rtn = 0f; for (int i = 0; i < lst.Count; i++) { for (int j = 0; j < Title.Count; j++) { if (Title[j][1] > 0 && Title[j][0] == lst[i].ID) { rtn += (lst[i] as TitleTableData).StatValue; break; } } } rtn.RandomizeCryptoKey(); return rtn; } #endregion #region 아공간 가방 (인벤) #endregion #region 패스 void Init_Pass() { var pass = Pass.Find(f => f[0] == 0); if (pass[2] > 28) { pass[1] = pass[2] = 0; pass[1].RandomizeCryptoKey(); pass[2].RandomizeCryptoKey(); } } public void Add_PassStep(int _type, bool _free, int _v = 1) { var pass = Pass.Find(f => f[0] == _type); pass[_free ? 2 : 3] += _v; pass[_free ? 2 : 3].RandomizeCryptoKey(); if (_type == 0 && _free) { pass[4] = ServerInfo.ServerTime.DayOfYear; pass[4].RandomizeCryptoKey(); } } public int Get_PassStep(int _type, bool _free) { return Pass.Find(f => f[0] == _type)[_free ? 2 : 3]; } public void Set_PassBuyStep(int _type, int _step) { var pass = Pass.Find(f => f[0] == _type); pass[1] = _step; pass[1].RandomizeCryptoKey(); if (_step == 0) { // 초기화임 pass[2] = pass[3] = 0; pass[2].RandomizeCryptoKey(); pass[3].RandomizeCryptoKey(); } } public int Get_PassBuy(int _type) { return Pass.Find(f => f[0] == _type)[1]; } public bool ExistCanGetPass(int _type = -1) { List passtabledata; if (_type == -1) passtabledata = table_pass.Ins.Get_DataList(); else passtabledata = table_pass.Ins.Get_DataList(_type); for (int i = 0; i < passtabledata.Count; i++) { var check = CanGetPass(passtabledata[i] as PassTableData); if (check[0] || check[1]) return true; } return false; } public List CanGetPass(PassTableData passdata) { // 0 PassType, 1 패스 구매 상태, 2 획득 무료 스텝, 3 획득 패스 스텝, 4 출석 DoY List rtn = new List { false, false }; var pass = Pass.Find(f => f[0] == passdata.PassType); var checkstep_free = pass[2] + 1 == passdata.ID; var checkstep_pay = pass[1] >= 2 && pass[3] + 1 == passdata.ID; switch (passdata.PassType) { case 0: // 출석 if (checkstep_free && pass[4] != ServerInfo.ServerTime.DayOfYear) rtn[0] = true; if (checkstep_pay && pass[2] > pass[3]) rtn[1] = true; break; case 1: case 2: // 레벨업 if (passdata.ConditionValue <= PC.Lv) { rtn[0] = checkstep_free; rtn[1] = checkstep_pay; } break; case 3: case 4: // 스테이지 클리어 //if (checkstep_free) //{ // if (Get_Common(eCommon.MaxMapID) > passdata.Chapter) // rtn[0] = true; // else if (Get_Common(eCommon.MaxMapID) == passdata.Chapter && Get_Common(eCommon.MaxStage) >= passdata.ConditionValue) // rtn[0] = true; //} //if (checkstep_pay) //{ // if (Get_Common(eCommon.MaxMapID) > passdata.Chapter) // rtn[1] = true; // else if (Get_Common(eCommon.MaxMapID) == passdata.Chapter && Get_Common(eCommon.MaxStage) >= passdata.ConditionValue) // rtn[1] = true; //} break; default: // 몬스터 처치 if (Get_MissionCount(MyValue.arr_Mission[1], 1) >= passdata.ConditionValue) { rtn[0] = checkstep_free; rtn[1] = checkstep_pay; } break; } return rtn; } public List AleadyGetPass(PassTableData passdata) { var pass = Pass.Find(f => f[0] == passdata.PassType); return new List { pass[2] >= passdata.ID, pass[3] >= passdata.ID }; } public bool IsNohavePass() { for (int i = 0; i < Pass.Count; i++) if (Pass[i][1] > 0) return false; return true; } #endregion #region 챕터 퀘스트 (쪽지) public bool IsCanGetChapterClearReward(int _chapter) { var cqdata = ChapterQuest.Find(f => f.Chapter == _chapter); if (cqdata.GetReward < 1) { for (int i = 0; i < cqdata.list_QuestClear.Count; i++) { if (cqdata.list_QuestClear[i] == 0) return false; } return true; } return false; } public bool IsCanGetChapterClearReward() { var chaptercount = table_chaptertext.Ins.Get_DataList(); for (int i = 0; i < chaptercount.Count; i++) { bool canget = IsCanGetChapterClearReward(i + 1); if (canget) return true; } return false; } public bool IsAlreadyGetChapterClearReward(int _chapter) { var cqdata = ChapterQuest.Find(f => f.Chapter == _chapter); return cqdata.GetReward == 1; } public int Get_ChapterQuestClearCount(int _chapter, int _id) { return ChapterQuest.Find(f => f.Chapter == _chapter).list_QuestClear[_id - 1]; } public int Get_ChapterQuestID(int _chapter) { return ChapterQuest.Find(f => f.Chapter == _chapter).ID; } public void Set_ChapterQuestID(int _chapter, int _id) { var data = ChapterQuest.Find(f => f.Chapter == _chapter); data.ID = _id; data.ID.RandomizeCryptoKey(); } #endregion #region 상점 // 0 광고 쿨타임, 1 총 구매횟수, 2 일일 구매, 3 주간 구매, 4 월간 구매 void Init_Shop() { foreach (var item in Shop) { Shop[item.Key][0] = Shop[item.Key][2] = 0; Shop[item.Key][0].RandomizeCryptoKey(); Shop[item.Key][2].RandomizeCryptoKey(); } } void Init_ShopWeek() { foreach (var item in Shop) { Shop[item.Key][3] = 0; Shop[item.Key][3].RandomizeCryptoKey(); } } void Init_ShopMonth() { foreach (var item in Shop) { Shop[item.Key][4] = 0; Shop[item.Key][4].RandomizeCryptoKey(); } } public bool CanShow_ShopAD(int _id) { var data = table_shop.Ins.Get_Data(_id); if (data.PriceType == ePriceType.AD) { var shopdata = Shop[_id.ToString()]; return shopdata[2] < data.BuyLimit_Day && shopdata[0] <= 0; } return false; } public bool CanShow_ShopAD(eShopTab _tab) { var lst = table_shop.Ins.Get_DataList(_tab); for (int i = 0; i < lst.Count; i++) { var canshow = CanShow_ShopAD(lst[i].ID); if (canshow) return canshow; } return false; } public bool CanShow_ShopAD() { var lst = table_shop.Ins.Get_AD_DataList(); for (int i = 0; i < lst.Count; i++) { var canshow = CanShow_ShopAD(lst[i].ID); if (canshow) return canshow; } return false; } public int Get_ShopADTime(int _id) { return Shop[_id.ToString()][0]; } public void Add_ShopADTime(int _id, int _sec = 1) { var shopdata = Shop[_id.ToString()]; shopdata[0] += _sec; shopdata[0].RandomizeCryptoKey(); } public void Sub_ShopADTime(int _id, int _sec = 1) { int index = 0; if (_id == -1) { foreach (var item in Shop) { Shop[item.Key][index] -= _sec; if (Shop[item.Key][index] < 0) Shop[item.Key][index] = 0; Shop[item.Key][index].RandomizeCryptoKey(); } } else { var shopdata = Shop[_id.ToString()]; shopdata[index] -= _sec; if (shopdata[index] < 0) shopdata[index] = 0; shopdata[index].RandomizeCryptoKey(); } } public void Add_ShopBuyCount(int _id, params int[] index) { var shopdata = Shop[_id.ToString()]; for (int i = 0; i < index.Length; i++) { ++shopdata[index[i]]; shopdata[index[i]].RandomizeCryptoKey(); } } public int Get_ShopBuyCount(int _id, byte _limitType) { return Shop[_id.ToString()][_limitType]; } public string Can_BuyShopItem(ShopTableData _std) { if (!string.IsNullOrEmpty(_std.BuyCondition)) { if (ServerInfo.Ins.m_SC_ServerStatus.ContentsLock == 1) { switch (_std.BuyCondition) { case "Chapter14Clear": //if (Get_Common(eCommon.MaxMapID) < 15) // return "14챕터 클리어\n필요"; break; } } } if (!ServerInfo.Ins.m_ServerData.Check_ItemAmount(_std.ObtainCheckItem, 1, _std.ObtainCheckItemID, false)) { if (_std.BuyLimit > 0) return Get_ShopBuyCount(_std.ID, 1) < _std.BuyLimit ? "" : "구매 완료"; else if (_std.BuyLimit_Day > 0) return Get_ShopBuyCount(_std.ID, 2) < _std.BuyLimit_Day ? "" : "구매 완료"; else if (_std.BuyLimit_Week > 0) return Get_ShopBuyCount(_std.ID, 3) < _std.BuyLimit_Week ? "" : "구매 완료"; else if (_std.BuyLimit_Month > 0) return Get_ShopBuyCount(_std.ID, 4) < _std.BuyLimit_Month ? "" : "구매 완료"; return null; } return "구매 완료"; } #endregion #region 마녀의 기억 public int Get_Memory_Step(eMemory _memory) { if (_memory == eMemory.a2_Forest) return (int)Memory[0]; else if (_memory == eMemory.a4_WitchGrade) return (int)Memory[2]; return 0; } public void Add_MemoryStep(eMemory _memory) { if (_memory == eMemory.a2_Forest) { ++Memory[0]; Memory[0].RandomizeCryptoKey(); } else if (_memory == eMemory.a5_PetBattle) { ++Memory[3]; Memory[3].RandomizeCryptoKey(); } } public double Get_Memory_Forest_TotalDamage() { return Memory[1]; } public void Set_Memory_Forest_TotalDamage(double _dmg) { if (Memory[1] < _dmg) { Memory[1] = _dmg; Memory[1].RandomizeCryptoKey(); } } public void Set_Memory_WitchGrade(int _id) { if (Memory[2] < _id) { Memory[2] = _id; Memory[2].RandomizeCryptoKey(); } } public int Get_Memeory_PetBattle_Point() { return (int)Memory[3]; } public void Set_Memory_PetBattle_Point(int _point) { Memory[3] = _point; Memory[3].RandomizeCryptoKey(); } public int Get_Memory_PetBattle_Change() { return (int)Memory[4]; } public void Add_Memory_PetBattle_Change() { ++Memory[4]; Memory[4].RandomizeCryptoKey(); } #endregion #region 마녀의 솥 public int Get_PotionRemainTime(int _id) { return Potion[_id.ToString()][1]; } public bool Is_UsePotion() { foreach (var item in Potion) { if (item.Value[1] > 0) return true; } return false; } public void Add_PotionTime(int _id) { Use_Item(eItem.Potion, 1, _id); var key = _id.ToString(); Potion[key][1] += MyValue.PotionAddMin * 60; Potion[key][1].RandomizeCryptoKey(); } public void Sub_AllPotionTime() { foreach (var item in Potion) { if (item.Value[1] > 0) { var before = item.Value[1]; --item.Value[1]; if (item.Value[1] == 0) { item.Value[1] = 0; //if (before > 0) // ActorInfo.Ins.ReSet_AllActorStat(); } item.Value[1].RandomizeCryptoKey(); } } } #endregion #region 아이템 관련 void Add_Item_Log(eItem item, int id, double amount) { //var strItem = item.ToString(); //if (!TotalAdd.ContainsKey(strItem)) // TotalAdd.Add(strItem, new List>()); //for (int i = 0; i < TotalAdd[strItem].Count; i++) //{ // if (TotalAdd[strItem][i][0] == id) // { // TotalAdd[strItem][i][1] += amount; // return; // } //} //TotalAdd[strItem].Add(new List { id, amount }); } void Use_Item_Log(eItem item, int id, double amount) { //var strItem = item.ToString(); //if (!TotalUse.ContainsKey(strItem)) // TotalUse.Add(strItem, new List>()); //for (int i = 0; i < TotalUse[strItem].Count; i++) //{ // if (TotalUse[strItem][i][0] == id) // { // TotalUse[strItem][i][1] += amount; // return; // } //} //TotalUse[strItem].Add(new List { id, amount }); } public List Add_Item(ItemData _itemdata) { Add_Item_Log(_itemdata.ItemType, _itemdata.Get_ID(), _itemdata.Amount); // 중간에 리턴있어서 앞에서 해줌 switch (_itemdata.ItemType) { case eItem.Gold: case eItem.Gem: case eItem.WeaponStone: case eItem.RingStone: case eItem.NeckStone: case eItem.BootsStone: case eItem.FairyStone: case eItem.SelectSkillShuffle: case eItem.ChapterQuestShuffle: case eItem.mClover: case eItem.MemoryField: case eItem.MemoryForest: case eItem.MemoryDungeon: case eItem.MemoryWitchGrade: case eItem.MemoryPetBattle: { var key = Get_Key(_itemdata.Get_ID()); var amount = Math.Truncate(_itemdata.Amount); if (!Item.ContainsKey(key)) Item.Add(key, new List { amount, amount, 0 }); else { Item[key][0] += amount; Item[key][0].RandomizeCryptoKey(); Item[key][1] += amount; Item[key][1].RandomizeCryptoKey(); } if (!DSUtil.CheckNull(TopMoney.Ins)) TopMoney.Ins.Set(); } break; case eItem.Exp: PC.Exp += (uint)_itemdata.Amount; PC.Exp.RandomizeCryptoKey(); break; case eItem.PC: break; case eItem.Pet: break; case eItem.Weapon: case eItem.Armor: case eItem.Helmet: case eItem.Extra: case eItem.Necklace: case eItem.Ring: { var key = Get_Key(_itemdata.Get_ID()); if (!Equipment.ContainsKey(key)) Equipment.Add(key, new List { _itemdata.Amount, 0, 0 }); else Equipment[key][1] += _itemdata.Amount; Equipment[key][1].RandomizeCryptoKey(); } break; case eItem.Fairy: //var equipment = Equipment[_itemdata.ItemType.ToString()].Find(f => f[0] == _itemdata.Get_ID()); //if (equipment != null) Check_EquipmentGet(equipment, _itemdata.Amount); //if (MessageInfo.Ins != null && _itemdata.Grade >= eItemGrade.Legend) // MessageInfo.Ins.Add_NotiToChatServer(DSUtil.Format("{0} {1}{2}[-] 획득", ServerInfo.Ins.UserName, MyValue.Get_GradeColor(_itemdata.Grade), _itemdata.Name)); //if (GameUI.Ins != null) GameUI.Ins.Add_newItem(_itemdata.ItemType, _itemdata.Get_ID()); break; case eItem.Skill: // ID, 갯수, 레벨, 특성1, 특성2 //var magicamount = (int)_itemdata.Amount; //var magic = Skill.Find(f => f[0] == _itemdata.Get_ID()); //if (magic[2] == 0) { magic[2] = 1; magic[2].RandomizeCryptoKey(); --magicamount; } //magic[1] += magicamount; //magic[1].RandomizeCryptoKey(); //if (MessageInfo.Ins != null && _itemdata.Grade >= eItemGrade.Legend) // MessageInfo.Ins.Add_NotiToChatServer(DSUtil.Format("{0} {1}{2}[-] 획득", ServerInfo.Ins.UserName, MyValue.Get_GradeColor(_itemdata.Grade), _itemdata.Name)); //if (GameUI.Ins != null) GameUI.Ins.Add_newItem(_itemdata.ItemType, _itemdata.Get_ID()); break; case eItem.AllGambleTicket: case eItem.WeaponTicket: case eItem.RingTicket: case eItem.NeckTicket: case eItem.BootsTicket: case eItem.FairyTicket: case eItem.MagicTicket: case eItem.PetTicket: break; case eItem.WeaponCostume: break; case eItem.Farmer: break; case eItem.Book: break; // 책은 없음 case eItem.Page: var pagedata = table_bookpage.Ins.Get_Data(_itemdata.Get_ID()); var booksdata = Book.Find(f => f.ID == pagedata.Book); if (booksdata.Page[pagedata.Page - 1] < 1) { // 새로운 페이지 획득 체크 if (Menu_Book.dic_newBookPage.ContainsKey(pagedata.Book)) { if (Menu_Book.dic_newBookPage[pagedata.Book].Find(f => f == pagedata.Page) == 0) Menu_Book.dic_newBookPage[pagedata.Book].Add(pagedata.Page); } else Menu_Book.dic_newBookPage.Add(pagedata.Book, new List { pagedata.Page }); } booksdata.Page[pagedata.Page - 1] = 1; booksdata.Page[pagedata.Page - 1].RandomizeCryptoKey(); break; case eItem.Food: case eItem.Seed: break; case eItem.Title: var title = Title.Find(f => f[0] == _itemdata.Get_ID()); if (title[1] == 0) { TitleGetUI.Ins.Set(_itemdata.Get_ID()); // 타이틀 획득 팝업 title[1] = 1; title[1].RandomizeCryptoKey(); } break; case eItem.Pass: if (_itemdata.Get_ID() < 100) { var pass = Pass.Find(f => f[0] == _itemdata.Get_ID()); ++pass[1]; pass[1].RandomizeCryptoKey(); } else if (_itemdata.Get_ID() == 101) { for (int i = 0; i < Pass.Count; i++) { Pass[i][1]++; Pass[i][1].RandomizeCryptoKey(); } } break; case eItem.ShopPackage: var pdata = table_shoppackage.Ins.Get_Data(_itemdata.Get_ID()); List itemlst = new List(); for (int i = 0; i < pdata.itemdata.Count; i++) { //if (pdata.itemdata[i].item != eItem.None) // itemlst.AddRange(Add_Item(new ItemData(pdata.itemdata[i].item, pdata.itemdata[i].itemid, pdata.itemdata[i].amount, _itemdata.Name, eUICardType.GetItem))); } return itemlst; case eItem.ADRemove: Set_Common(eCommon.ADRemove, 1); break; case eItem.Potion: var potionkey = _itemdata.Get_ID().ToString(); Potion[potionkey][0] += (int)_itemdata.Amount; Potion[potionkey][0].RandomizeCryptoKey(); break; case eItem.Relic: break; case eItem.DailyInit: Set_Common(eCommon.DOY_Day, 0); break; case eItem.RoulletteTicket: Add_Common(eCommon.Roullette_Ticket, (int)_itemdata.Amount); break; } return new List { _itemdata }; } public void Add_Item(int id, double amount) { var itemdata = table_itemlist.Ins.Get_Data(id); var key = Get_Key(id); #if UNITY_EDITOR if (itemdata == null) { string errorMessage = $"Item ID {id} not found!"; string callStack = Environment.StackTrace; // 로그 추가 var logEntry = new LogEntry(id.ToString(), errorMessage, callStack); // 텍스트 파일에 저장 DSUtil.SaveLogToFile(logEntry); return; } #endif switch (itemdata.e_ItemType) { default: if (!Item.ContainsKey(key)) Item.Add(key, new List { amount, amount, 0 }); else { Item[key][0] += amount; Item[key][0].RandomizeCryptoKey(); Item[key][1] += amount; Item[key][1].RandomizeCryptoKey(); } if (!DSUtil.CheckNull(TopMoney.Ins)) TopMoney.Ins.Set(); break; case eItem.Weapon: case eItem.Armor: case eItem.Helmet: case eItem.Extra: case eItem.Necklace: case eItem.Ring: if (!Equipment.ContainsKey(key)) Equipment.Add(key, new List { amount, 0, 0 }); else Equipment[key][0] += amount; Equipment[key][1].RandomizeCryptoKey(); break; case eItem.PC: PC.Add_PC(id); break; case eItem.Pet: if (!Pet.ContainsKey(key)) Pet.Add(key, new List { (int)amount - 1, 1 }); else Pet[key][0] += (int)amount; Pet[key][0].RandomizeCryptoKey(); break; case eItem.Enchant: if (!Enchant.ContainsKey(key)) Enchant.Add(key, new List { amount, 0, amount, 0 }); else Enchant[key][0] += amount; Enchant[key][0].RandomizeCryptoKey(); break; case eItem.Relic: if (!Relic.ContainsKey(key)) Relic.Add(key, new List { 0, 0, 0 }); Relic[key][0] += (int)amount; Relic[key][0].RandomizeCryptoKey(); break; } } public void Use_Item(int id, double amount) { var itemdata = table_itemlist.Ins.Get_Data(id); var key = Get_Key(id); switch (itemdata.e_ItemType) { default: if (Item.ContainsKey(key)) { var amonut = Math.Truncate(amount); Item[key][0] -= amonut; Item[key][0].RandomizeCryptoKey(); Item[key][2] += amonut; Item[key][2].RandomizeCryptoKey(); if (!DSUtil.CheckNull(TopMoney.Ins)) TopMoney.Ins.Set(); } if (!DSUtil.CheckNull(TopMoney.Ins)) TopMoney.Ins.Set(); break; case eItem.Weapon: case eItem.Armor: case eItem.Helmet: case eItem.Extra: case eItem.Necklace: case eItem.Ring: if (Equipment.ContainsKey(key)) { Equipment[key][0] -= amount; Equipment[key][0] = Math.Truncate(Equipment[key][0]); Equipment[key][0].RandomizeCryptoKey(); } break; case eItem.PC: break; case eItem.Pet: if (Pet.ContainsKey(key)) { Pet[key][0] -= (int)amount; Pet[key][0].RandomizeCryptoKey(); } break; case eItem.Enchant: if (Enchant.ContainsKey(key)) { Enchant[key][0] -= amount; Enchant[key][0].RandomizeCryptoKey(); Enchant[key][3] -= amount; Enchant[key][3].RandomizeCryptoKey(); } break; case eItem.Relic: if (Relic.ContainsKey(key)) { Relic[key][0] -= (int)amount; Relic[key][0].RandomizeCryptoKey(); } break; } } public bool Check_ItemAmount(int id, double amount, bool _showtoast = true) { bool result = Get_ItemAmount(id) >= amount; if (_showtoast && !result) ToastUI.Ins.Set(160, table_itemlist.Ins.Get_ItemName(id)); return result; } public double Get_ItemAmount(int id) { var itemdata = table_itemlist.Ins.Get_Data(id); var key = Get_Key(id); if (Item.ContainsKey(key)) return Item[key][0]; else if (Equipment.ContainsKey(key)) return Equipment[key][0]; else if (Enchant.ContainsKey(key)) return Enchant[key][0]; else if (Pet.ContainsKey(key)) return Pet[key][0]; else if (Relic.ContainsKey(key)) return Relic[key][0]; return 0; } public bool IsObtainItem(int id) { var itemdata = table_itemlist.Ins.Get_Data(id); var key = Get_Key(id); if (Item.ContainsKey(key)) return true; else if (Equipment.ContainsKey(key)) return true; else if (Enchant.ContainsKey(key)) return true; else if (Pet.ContainsKey(key)) return true; else if (Relic.ContainsKey(key)) return true; else if (itemdata.e_ItemType == eItem.PC) return PC.IsObtainPC(id); return false; } public bool IsEquipItem(int id, int preset = 0) { var itemData = table_itemlist.Ins.Get_Data(id); if (!DSUtil.CheckNull(itemData)) { if (itemData.IsEquipItem()) return Equip.Equip[itemData.e_ItemType] == id; else if (itemData.e_ItemType == eItem.Skill) { if (preset == 0) preset = Equip.Preset; return Equip.Skill[preset].Find(f => f == id) > 0; } } return false; } int NoteNotiID; public void Use_Item(eItem item, double _amount = 1d, int _id = 0, string _cause = "") { switch (item) { default: var key = Get_Key(_id); if (Item.ContainsKey(key)) { var amonut = Math.Truncate(_amount); Item[key][0] -= amonut; Item[key][0].RandomizeCryptoKey(); Item[key][2] += amonut; Item[key][2].RandomizeCryptoKey(); if (!DSUtil.CheckNull(TopMoney.Ins)) TopMoney.Ins.Set(); } else if (Equipment.ContainsKey(key)) { Equipment[key][0] -= _amount; Equipment[key][0] = Math.Truncate(Equipment[key][0]); Equipment[key][0].RandomizeCryptoKey(); } break; case eItem.PC: break; case eItem.Pet: break; case eItem.Fairy: //var equipment = Equipment[item.ToString()].Find(f => f[0] == _id); //if (equipment[3] >= _amount) //{ // equipment[3] -= (int)_amount; // equipment[3].RandomizeCryptoKey(); // Use_Item_Log(item, _id, _amount); // ServerInfo.Ins.Add_Log(0, DSUtil.Format("use,{0},{1},{2},{3}", item, _amount, equipment[3], _cause)); //} break; case eItem.Skill: //var magic = Skill.Find(f => f[0] == _id); //if (magic[1] >= _amount) //{ // magic[1] -= (int)_amount; // magic[1].RandomizeCryptoKey(); // Use_Item_Log(item, _id, _amount); // ServerInfo.Ins.Add_Log(0, DSUtil.Format("use,{0},{1},{2},{3}", item, _amount, magic[1], _cause)); //} break; case eItem.AllGambleTicket: case eItem.WeaponTicket: case eItem.RingTicket: case eItem.NeckTicket: case eItem.BootsTicket: case eItem.FairyTicket: case eItem.MagicTicket: case eItem.PetTicket: break; case eItem.Seed: case eItem.Food: break; case eItem.Exp: break; case eItem.WeaponCostume: break; case eItem.Farmer: break; case eItem.Book: break; case eItem.Heart: case eItem.MobDropItem: case eItem.Max: break; case eItem.Potion: var potionkey = _id.ToString(); if (Potion[potionkey][0] >= 1) { --Potion[potionkey][0]; Potion[potionkey][0].RandomizeCryptoKey(); Use_Item_Log(item, _id, _amount); ServerInfo.Ins.Add_Log(0, DSUtil.Format("use,{0},{1},{2},{3}", item, _amount, Potion[potionkey][0], _cause)); } break; } } public double Get_ItemAmount(eItem item, int id = 0) { switch (item) { default: var key = Get_Key(id); if (Item.ContainsKey(key)) return Item[key][0]; else if (Equipment.ContainsKey(key)) return Equipment[key][0]; break; case eItem.AllGambleTicket: case eItem.WeaponTicket: case eItem.RingTicket: case eItem.NeckTicket: case eItem.BootsTicket: case eItem.FairyTicket: case eItem.MagicTicket: case eItem.PetTicket: break; case eItem.Exp: return PC.Exp; case eItem.PC: return 0d; case eItem.WeaponCostume: break; case eItem.Fairy: return 0d; //if (id == 0) return 0d; //var equipment = Equipment[item.ToString()].Find(f => f[0] == id); //return equipment[3]; case eItem.Skill: if (id == 0) return 0d; //return Skill.Find(f => f[0] == id)[1]; break; case eItem.Pet: case eItem.Farmer: break; case eItem.Book: break; case eItem.Food: return 0d; case eItem.Seed: return 0d; case eItem.Potion: return Potion[id.ToString()][0]; } return 0d; } public bool Check_ItemAmount(eItem item, double _amount, int _id = 0, bool _showtoast = true) { bool result = Get_ItemAmount(item, _id) >= _amount; //if (_showtoast && !result) // ToastUI.Ins.Set(160, MyText.Get_ItemName(_id)); return result; } #endregion } #region 데이터 클래스 public class ServerData_Book { public ObscuredInt ID, Complete; public List Page; public void Init(int _id) { ID = _id; ID.RandomizeCryptoKey(); Complete = 0; Complete.RandomizeCryptoKey(); var totalpage = table_book.Ins.Get_Data(ID).TotalPage; Page = new List(); for (int i = 0; i < totalpage; i++) Page.Add(0); Page.ForEach(f => f.RandomizeCryptoKey()); } public void Set_Complete() { Complete = 1; Complete.RandomizeCryptoKey(); } public ServerData_Book_Read Get() { var rtn = new ServerData_Book_Read(); rtn.ID = ID; rtn.Complete = Complete; rtn.Page = new List(); for (int i = 0; i < Page.Count; i++) rtn.Page.Add(Page[i]); return rtn; } } public class ServerData_Book_Read { public int ID, Complete; public List Page; public ServerData_Book Get() { var rtn = new ServerData_Book(); rtn.ID = ID; rtn.ID.RandomizeCryptoKey(); rtn.Complete = Complete; rtn.Complete.RandomizeCryptoKey(); rtn.Page = new List(); for (int i = 0; i < Page.Count; i++) rtn.Page.Add(Page[i]); rtn.Page.ForEach(f => f.RandomizeCryptoKey()); return rtn; } } public class ServerData_ChapterQuest { public ObscuredInt Chapter, GetReward, ID; // 현재 선택된 퀘스트 아이디 public List list_QuestClear = new List(); public void Init(int _chapter) { Chapter = _chapter; Chapter.RandomizeCryptoKey(); GetReward = 0; GetReward.RandomizeCryptoKey(); ID = 0; ID.RandomizeCryptoKey(); var datas = table_chapterquest.Ins.Get_DataList(_chapter); for (int i = 0; i < datas.Count; i++) list_QuestClear.Add(0); list_QuestClear.ForEach(f => f.RandomizeCryptoKey()); } public ServerData_ChapterQuest_Read Get() { var rtn = new ServerData_ChapterQuest_Read { Chapter = Chapter, GetReward = GetReward, ID = ID }; for (int i = 0; i < list_QuestClear.Count; i++) rtn.list_QuestClear.Add(list_QuestClear[i]); return rtn; } } public class ServerData_ChapterQuest_Read { public int Chapter, GetReward, ID; public List list_QuestClear = new List(); public ServerData_ChapterQuest Get() { var rtn = new ServerData_ChapterQuest { Chapter = Chapter, GetReward = GetReward, ID = ID }; for (int i = 0; i < list_QuestClear.Count; i++) rtn.list_QuestClear.Add(list_QuestClear[i]); return rtn; } } #endregion #region New 데이터 클래스 public class SD_Equip { public Dictionary Equip; public ObscuredInt PC, Preset, LimitPreset; public Dictionary> Skill; public void Set_Equip(eItem item, int equipid, int slot = 0, int unequipid = 0) { switch (item) { default: Equip[item] = equipid; Equip[item].RandomizeCryptoKey(); break; case eItem.Skill: List lst = Skill[Preset]; for (int i = 0; i < lst.Count; i++) { if (lst[i] == equipid || (unequipid > 0 && lst[i] == unequipid)) { lst[i] = 0; lst[i].RandomizeCryptoKey(); } } lst[slot] = equipid; lst[slot].RandomizeCryptoKey(); break; } } public void Init_NewUser(Action> act) { Equip = new Dictionary { [eItem.PC] = table_GlobalValue.Ins.Get_Int("n_FirstClassID"), [eItem.Weapon] = 0, [eItem.WeaponCostume] = 0, [eItem.Armor] = 0, [eItem.Helmet] = 0, [eItem.Extra] = 0, [eItem.Necklace] = 0, [eItem.Ring] = 0, [eItem.Pet] = table_GlobalValue.Ins.Get_Int("n_FirstEquipPet"), [eItem.Fairy] = 0, [eItem.Farmer] = 0, }; foreach (var item in Equip) item.Value.RandomizeCryptoKey(); Preset = LimitPreset = 1; Preset.RandomizeCryptoKey(); LimitPreset.RandomizeCryptoKey(); var classdata = table_classconfig.Ins.Get_Data_orNull(Equip[eItem.PC]); var equipSkillValues = new List() { classdata.n_AcquiredSkill1, classdata.n_AcquiredSkill2, classdata.n_AcquiredSkill3, 0, 0, 0 }; act(equipSkillValues); Skill = new Dictionary> { { 1, new List() }, { 2, new List() }, { 3, new List() } }; foreach (var item in Skill) { item.Value.Clear(); // 기존 값을 지운 후 새로 추가 item.Value.AddRange(equipSkillValues); item.Value.ForEach(f => f.RandomizeCryptoKey()); // 암호화 키 랜덤화 } } public SD_Equip_Read Get() { var temp = new SD_Equip_Read(); temp.Preset = Preset; temp.LimitPreset = LimitPreset; temp.Equip = Get_T_Dic(Equip); temp.Skill = Get_T_Dic(Skill); return temp; } public Dictionary Get_T_Dic(Dictionary dic) { var temp = new Dictionary(); if (dic != null) { foreach (var item in dic) temp.Add(item.Key.ToString(), item.Value); } return temp; } public Dictionary> Get_T_Dic(Dictionary> dic) { var temp = new Dictionary>(); if (dic != null) { foreach (var item in dic) temp.Add(item.Key.ToString(), Get_T_List(item.Value)); } return temp; } private List Get_T_List(List lst) { var temp = new List(); for (int i = 0; i < lst.Count; i++) temp.Add(lst[i]); return temp; } } public class SD_Equip_Read { public Dictionary Equip; public int Preset, LimitPreset; public Dictionary> Skill; public SD_Equip Get() { var temp = new SD_Equip(); temp.Preset = Preset; temp.LimitPreset = LimitPreset; temp.Equip = Get_T_Dic(Equip); temp.Skill = Get_T_Dic(Skill); return temp; } public Dictionary Get_T_Dic(Dictionary dic) { var temp = new Dictionary(); if (dic != null) { foreach (var item in dic) temp.Add(DSUtil.StringToEnum(item.Key), item.Value); } return temp; } public Dictionary> Get_T_Dic(Dictionary> dic) { var temp = new Dictionary>(); if (dic != null) { foreach (var item in dic) temp.Add(int.Parse(item.Key), Get_T_List(item.Value)); } return temp; } private List Get_T_List(List lst) { var temp = new List(); for (ObscuredInt i = 0; i < lst.Count; i++) temp.Add(lst[i]); return temp; } } public class SD_Slot { public eItem Parts; public ObscuredInt Lv; public ObscuredDouble Use; public List Enchant; public SD_Slot_Read Get() { var rtn = new SD_Slot_Read(); rtn.Parts = Parts; rtn.Lv = Lv; rtn.Use = Use; if (Enchant != null) { rtn.Enchant = new List(); for (int i = 0; i < Enchant.Count; i++) rtn.Enchant.Add(Enchant[i].Get()); } return rtn; } } public class SD_Slot_Enchant { public ObscuredInt ID, EXTRA, Lv; public float Get_Value() { return table_optionconfig.Ins.Get_Data(ID).Get_Value(Lv); } public SD_Slot_Enchant_Read Get() { return new SD_Slot_Enchant_Read { ID = ID, EXTRA = EXTRA, Lv = Lv }; } } public class SD_Slot_Read { public eItem Parts; public int Lv; public double Use; public List Enchant; public SD_Slot Get() { var rtn = new SD_Slot(); rtn.Parts = Parts; rtn.Lv = Lv; rtn.Use = Use; if (Enchant != null) { rtn.Enchant = new List(); for (int i = 0; i < Enchant.Count; i++) rtn.Enchant.Add(Enchant[i].Get()); } return rtn; } } public class SD_Slot_Enchant_Read { public int ID, EXTRA, Lv; public SD_Slot_Enchant Get() { return new SD_Slot_Enchant { ID = ID, EXTRA = EXTRA, Lv = Lv }; } } public class SD_Equipment { public ObscuredInt ID, Lv; public ObscuredDouble Amount; public SD_Equipment_Read Get() { var rtn = new SD_Equipment_Read(); rtn.ID = ID; rtn.Lv = Lv; rtn.Amount = Amount; return rtn; } } public class SD_Equipment_Read { public int ID, Lv; public double Amount; public SD_Equipment Get() { var rtn = new SD_Equipment(); rtn.ID = ID; rtn.ID.RandomizeCryptoKey(); rtn.Lv = Lv; rtn.Lv.RandomizeCryptoKey(); rtn.Amount = Amount; rtn.Amount.RandomizeCryptoKey(); return rtn; } } public class SD_MapData { public ObscuredInt Clear; // 클리어 여부 public List Stat; // 0 힘, 1 민, 2 지 public SD_MapData_Read Get() { var rtn = new SD_MapData_Read(); rtn.Stat = new List(); for (int i = 0; i < Stat.Count; i++) rtn.Stat.Add(Stat[i]); return rtn; } int Get_Index_byStat(eMainStatType stat) { int index = -1; switch (stat) { case eMainStatType.STR: index = 0; break; case eMainStatType.DEX: index = 1; break; case eMainStatType.INT: index = 2; break; } return index; } public ObscuredInt Get_Stat(eMainStatType stat) { var index = Get_Index_byStat(stat); if (index > -1) return Stat[index]; return 0; } public List Get_Stats() { return Stat; } public void Add_Stat(eMainStatType stat, int addlv) { var index = Get_Index_byStat(stat); if (index > -1) { Stat[index] += addlv; Stat[index].RandomizeCryptoKey(); } } } public class SD_MapData_Read { public List Stat; // 0 힘, 1 민, 2 지 public SD_MapData Get() { var rtn = new SD_MapData(); rtn.Stat = new List(); for (int i = 0; i < Stat.Count; i++) rtn.Stat.Add(Stat[i]); return rtn; } } public class SD_Buff { public ObscuredInt Infinity; // 1 이상이면 무한 버프 public List Time; // 버프 남은 시간들 public SD_Buff_Read Get() { var rtn = new SD_Buff_Read(); rtn.Infinity = Infinity; rtn.Time = new List(); for (int i = 0; i < Time.Count; i++) rtn.Time.Add(Time[i]); return rtn; } public bool isInfinity() { return Infinity > 0; } public int Get_RemainTime(int index) { return Time[index]; } public void Set_Time(int index, int time) { Time[index] = time; Time[index].RandomizeCryptoKey(); } public void Sub_Time(int index = -1, int sec = 1) { if (index == -1) { for (int i = 0; i < Time.Count; i++) { if (Time[i] > 0) { Time[i] -= sec; Time[i].RandomizeCryptoKey(); } } } else if (index > -1) { if (Time[index] > 0) { Time[index] -= sec; Time[index].RandomizeCryptoKey(); } } } } public class SD_Buff_Read { public int Infinity; public List Time; public SD_Buff Get() { var rtn = new SD_Buff(); rtn.Infinity = Infinity; rtn.Infinity.RandomizeCryptoKey(); rtn.Time = new List(); for (int i = 0; i < Time.Count; i++) rtn.Time.Add(Time[i]); rtn.Time.ForEach(f => f.RandomizeCryptoKey()); return rtn; } } public class SD_PC { public ObscuredInt Lv, ALv, AExp, LLv; public ObscuredUInt Exp; public List Stat, Obtain; // 서버 저장 x Dictionary dic_StatIndex = new Dictionary { { eStat.STR, 0 }, { eStat.DEX, 1 }, { eStat.INT, 2 }, { eStat.LUK, 3 } }; public SD_PC() { Lv = 1; Lv.RandomizeCryptoKey(); LLv = 1; LLv.RandomizeCryptoKey(); ALv = 1; ALv.RandomizeCryptoKey(); Exp = 0; Exp.RandomizeCryptoKey(); AExp = 0; AExp.RandomizeCryptoKey(); Stat = new List { 0, 0, 0, 0 }; Stat.ForEach(f => f.RandomizeCryptoKey()); Obtain = new List(); } uint Get_Exp(int lv) { float result = Mathf.Pow((lv * 10) + 21 + (lv * 50), 1.05f + Mathf.Sqrt(lv * 0.0000000001f)); return (uint)Mathf.Max(result, 0); } public void Add_Exp(uint exp) { Exp += exp; Exp.RandomizeCryptoKey(); while (Exp >= Get_Exp(Lv + 1)) { ++Lv; Lv.RandomizeCryptoKey(); // TODO 정인호 : 유저 레벨업 함 } } public float Get_ExpSliderValue() { return DSUtil.Get_SliderValue((float)(Exp / Get_Exp(Lv + 1))); } public void Reset_Stat() { for (int i = 0; i < Stat.Count; i++) { Stat[i] = 0; Stat[i].RandomizeCryptoKey(); } } public int Get_Stat(eStat stat) { return Stat[dic_StatIndex[stat]]; } public int Get_UsePoint() { return Stat.Select(stat => (int)stat).Sum(); } public int Get_Point() { return (Lv - 1) * 5 - Get_UsePoint(); } public void Set_Point(eStat stat, int add) { Stat[dic_StatIndex[stat]] += add; Stat[dic_StatIndex[stat]].RandomizeCryptoKey(); } public bool IsObtainPC(int id) { return Obtain.Find(f => f == id) > 0; } public void Add_PC(int id) { if (!IsObtainPC(id)) { Obtain.Add(id); Obtain.ForEach(f => f.RandomizeCryptoKey()); } } public SD_PC_Read Get() { var temp = new SD_PC_Read(); temp.Lv = Lv; temp.Exp = Exp; temp.ALv = ALv; temp.AExp = AExp; temp.LLv = LLv; temp.Stat = new List(); for (int i = 0; i < Stat.Count; i++) temp.Stat.Add(Stat[i]); temp.Obtain = new List(); for (int i = 0; i < Obtain.Count; i++) temp.Obtain.Add(Obtain[i]); return temp; } } public class SD_PC_Read { public int Lv, ALv, AExp, LLv; public uint Exp; public List Stat, Obtain; public SD_PC Get() { var temp = new SD_PC(); temp.Lv = Lv; temp.Lv.RandomizeCryptoKey(); temp.Exp = Exp; temp.Exp.RandomizeCryptoKey(); temp.ALv = ALv; temp.ALv.RandomizeCryptoKey(); temp.AExp = AExp; temp.AExp.RandomizeCryptoKey(); temp.LLv = LLv; temp.LLv.RandomizeCryptoKey(); temp.Stat = new List(); for (int i = 0; i < Stat.Count; i++) temp.Stat.Add(Stat[i]); temp.Stat.ForEach(f => f.RandomizeCryptoKey()); temp.Obtain = new List(); for (int i = 0; i < Obtain.Count; i++) temp.Obtain.Add(Obtain[i]); temp.Obtain.ForEach(f => f.RandomizeCryptoKey()); return temp; } } public class SD_PCAwakenData { public ObscuredInt Lv, Exp; public SD_PCAwakenData() { Lv = 1; Lv.RandomizeCryptoKey(); } public SD_PCAwakenData_Read Get() { var rtn = new SD_PCAwakenData_Read(); rtn.Lv = Lv; rtn.Exp = Exp; return rtn; } } public class SD_PCAwakenData_Read { public int Lv, Exp; public SD_PCAwakenData Get() { var rtn = new SD_PCAwakenData(); rtn.Lv = Lv; rtn.Lv.RandomizeCryptoKey(); rtn.Exp = Exp; rtn.Exp.RandomizeCryptoKey(); return rtn; } } public class SD_PCLimitSlotData { public ObscuredInt ID, Lv, Lock; public SD_PCLimitSlotData_Read Get() { var rtn = new SD_PCLimitSlotData_Read(); rtn.ID = ID; rtn.Lv = Lv; rtn.Lock = Lock; return rtn; } } public class SD_PCLimitSlotData_Read { public int ID, Lv, Lock; public SD_PCLimitSlotData Get() { var rtn = new SD_PCLimitSlotData(); rtn.ID = ID; rtn.ID.RandomizeCryptoKey(); rtn.Lv = Lv; rtn.Lv.RandomizeCryptoKey(); rtn.Lock = Lock; rtn.Lock.RandomizeCryptoKey(); return rtn; } } public class SD_Farm { public ObscuredInt MaxSlot; public List Slot; public Dictionary Eat = new Dictionary(); // 먹은 갯수 public List> Shop; // 0 FarmShop ID, 1 구매 횟수, 2 남은 시간 public SD_Farm() { MaxSlot = 0; MaxSlot.RandomizeCryptoKey(); Slot = new List(); for (int i = 0; i < 8; i++) Slot.Add(new SD_FarmSlot(i)); Shop = table_farmshoplist.Ins.Get_ShopInit(); } public SD_Farm_Read Get() { var temp = new SD_Farm_Read { MaxSlot = MaxSlot, }; temp.Slot = new List(); for (int i = 0; i < Slot.Count; i++) temp.Slot.Add(Slot[i].Get()); foreach (var item in Eat) temp.Eat.Add(item.Key, item.Value); temp.Shop = DSUtil.Get_T_List(Shop); return temp; } } public class SD_Farm_Read { public int MaxSlot; public List Slot; public Dictionary Eat = new Dictionary(); // 먹은 갯수 public List> Shop; // 0 FarmShop ID, 1 구매 횟수, 2 남은 시간 public SD_Farm Get() { var temp = new SD_Farm { MaxSlot = MaxSlot }; temp.MaxSlot.RandomizeCryptoKey(); temp.Slot = new List(); for (int i = 0; i < Slot.Count; i++) temp.Slot.Add(Slot[i].Get()); foreach (var item in Eat) temp.Eat.Add(item.Key, item.Value); temp.Shop = DSUtil.Get_T_List(Shop); return temp; } } public class SD_FarmSlot { public ObscuredInt Slot, Grade, EnchantID; public ObscuredDouble Time; public SD_FarmSlot() { } public SD_FarmSlot(int slot) { Slot = slot; Slot.RandomizeCryptoKey(); Grade = 0; Grade.RandomizeCryptoKey(); EnchantID = 0; EnchantID.RandomizeCryptoKey(); Time = 0; Time.RandomizeCryptoKey(); } public SD_FarmSlot_Read Get() { return new SD_FarmSlot_Read { Slot = Slot, Grade = Grade, EnchantID = EnchantID, Time = Time }; } } public class SD_FarmSlot_Read { public int Slot, Grade, EnchantID; public double Time; public SD_FarmSlot Get() { return new SD_FarmSlot { Slot = Slot, Grade = Grade, EnchantID = EnchantID, Time = Time }; } } #endregion