using JetBrains.Annotations; using System; using System.Collections.Generic; using System.Linq; using System.Numerics; using Unity.VisualScripting; using UnityEngine; using UnityEngine.ResourceManagement.AsyncOperations; // 데이터 구조 모음. namespace IVDataFormat { #region Reference // 재화/아이템. public static class cGoods { #region Type public const int TNone = 0; public const int TCash = 1; public const int TAds = 2; public const int TAdsRemove = 3; public const int TCurrency = 100; public const int TExp = 101; public const int TBag = 200; public const int TBagWeapon = 201; public const int TBagArmor = 210; public const int TBagArmorCape = 211; public const int TBagArmorHat = 212; public const int TBagArmorShoes = 213; public const int TBagAcce = 220; public const int TBagAcceEar = 221; public const int TBagAcceNeck = 222; public const int TBagAcceRing = 223; public const int TBagTreasure = 231; public const int TPet = 241; public const int TPetSpirit = 242; public const int TSkillActive = 251; public const int TSkillPassive = 252; public const int TDgTicketGold = 301; public const int TDgTicketPet = 302; public const int TDgTicketEnhance = 303; public const int TDgTicketAwaken = 304; public const int TDgTicketRelic = 305; public const int TPvpTicket = 350; public const int TCosCloth = 421; public const int TCosWeapon = 422; public const int TCosClrEye = 411; public const int TCosClrHair = 412; public const int TCosClrTop = 413; public const int TPass = 500; public const int TBox = 600; public const int TEventTrade = 700; public const int TEventRaise = 701; public const int TEventRoulette = 702; public const int TProfileIcon = 800; public const int TProfileTitle = 801; public const int TGuardian = 900; #endregion Typet #region Currency Code public const int CDia = 1; public const int CDiaP = 2; public const int CDiaF = 3; public const int CGold = 11; public const int CLvPoint = 12; public const int CEnhanceStoneGear = 13; public const int CAwakenStoneGear = 14; public const int CChangeStone = 15; public const int CPudding = 16; public const int CEnhanceStoneSkill = 17; public const int CAwakenStoneSkill = 18; public const int CCondMight = 19; public const int CGachaTokenWeapon = 20; public const int CGachaTokenArmor = 21; public const int CGachaTokenAcce = 22; public const int CGachaTokenTreasure = 23; public const int CMileage = 99; #endregion Currency Code #region Cos Code public const int CCosClothSetBase = 1; public const int CCosClothBase = 1; public const int CCosWeaponSetBase = 1; public const int CCosWeaponBase = 1; public const int CClrHairBase = 1; public const int CClrTopBase = 2; public const int CClrEyeBase = 3; #endregion Cos Code #region Pass Code public const int PassTypeRepeat = 0; public const int PassTypeOne = 1; public const int PassTypeEvent = 2; #endregion Pass Code #region Box Code public const int CBoxGeneralStart = 1; public const int CBoxPetStart = 100; public const int CBoxDiary = 200; public const int CBoxEventStart = 400; #endregion Box Code #region Rarity & Grade public const int RNone = 0; public const int RNormal = 1; public const int RRare = 2; public const int REpic = 3; public const int RUnique = 4; public const int RHero = 5; public const int RLegend = 6; public const int RMyth = 7; public const int GMax = 4; #endregion Rarity & Grade } // 재화 획득 종류. public enum eGoodsGetUse { Test = -1, None = 0, Stage = 1, Boss = 2, Offline = 3, Dungeon = 90 } public enum eRarity { None = 0, Normal = 1, Rare = 2, Epic = 3, Unique = 4, Hero = 5, Legend = 6, Mystic = 7 } // 갱신 타입. public enum eRefreshType { None = 0, Account = 1, Period = 2, Daily = 3, Weekly = 4, Monthly = 5 //Days30 = 30 } // 효과 종류. public enum eEffectType { All = -99, Test = -1, None = 0, Damage = 1, PetBoxDropRate = 2, GoldDropRate = 3, ExpDropRate = 4, ChestDropRate = 5, SkillDamage = 6, SkillCool = 7, HealPerSec = 8, PetBuff = 9, GearBuff = 10, // 스탯 값 증가. AtkBase = 11, HpBase = 13, // 기량, 의지. AtkAble = 14, HpAble = 15, AtkWill = 16, HpWill = 17, // 스탯 % 증가. AtkBuff = 21, HpBuff = 23, // 기타 스탯 값 증가. Mov = 24,//이속 Spd = 25,//공속 Pierce = 26, CrtDam = 27, // 적 스탯 감소. EnemyAtk = 41, EnemyHp = 43, // 보너스 스탯 DgGoldBonus = 51, DgReinStoneBonus = 52, DgPetBonus = 53, DgAwakneStoneBonus = 54, CrtRate = 100, } // 조건 종류. public enum eCondition { Test = -1, None = 0, // 스테이지 클리어. StageClear = 1, // 플레이어 레벨 달성. PlayerLv = 2, // 플레이어 각성 단계 완료. PlayerAwaken = 3, // 플레이 시간. PlayTimeM = 4, PlayTimeH = 5, // 출석 횟수. PlayAtttend = 6, // 몬스터 처치 횟수. MonsterCnt = 10, EliteCnt = 11, BossCnt = 12, // 소환 횟수. GachaAll = 20, GachaWeapon = 21, GachaArmor = 22, GachaAcc = 23, GachaTreasure = 24, // 소환 레벨 GachaWeaponLv = 25, GachaArmorLv = 26, GachaAccLv = 27, // 장비 강화 레벨. EquipLvAll = 30, EquipLvWeapon = 31, EquipLvArmor = 32, EquipLvAcc = 33, EquipLvTreasure = 34, // 스킬 SkillEquip = 40, SkillLvAll = 41, SkillLvActive = 42, SkillLvPassive = 43, // 특정 코스튬 획득. CosHave = 50, // 코스튬 보유 수. CosCnt = 51, // 특정 코스튬 세트 획득. CosSetHave = 52, // 코스튬 세트 보유 수 CosSetCnt = 53, // 골드 강화 EnhanceGoldAll = 60, EnhanceGoldAtk = 61, EnhanceGoldHp = 62, EnhanceGoldCrtRate = 64, EnhanceGoldAtkCount = 68, EnhanceGoldHpCount = 69, // 포인트 강화 EnhancePointAll = 70, EnhancePointAtk = 71, EnhancePointHp = 72, EnhancePointMov = 74, EnhancePointSpd = 75, EnhancePointGoldDropRate = 76, EnhancePointExpDropRate = 77, EnhancePointChestDropRate = 78, // 잠재 능력 ChangeAbility = 80, // 모든 장비 획득. EquipHaveAll = 100, EquipHaveD = 101, EquipHaveC = 102, EquipHaveB = 103, EquipHaveA = 104, EquipHaveS = 105, EquipHaveSS = 106, EquipHaveSR = 107, // 모든 무기 획득. EquipHaveWeaponAll = 110, EquipHaveWeaponD = 111, EquipHaveWeaponC = 112, EquipHaveWeaponB = 113, EquipHaveWeaponA = 114, EquipHaveWeaponS = 115, EquipHaveWeaponSS = 116, EquipHaveWeaponSR = 117, // 모든 방어구 획득. EquipHaveArmorAll = 120, EquipHaveArmorD = 121, EquipHaveArmorC = 122, EquipHaveArmorB = 123, EquipHaveArmorA = 124, EquipHaveArmorS = 125, EquipHaveArmorSS = 126, EquipHaveArmorSR = 127, // 모든 장신구 획득. EquipHaveAccAll = 130, EquipHaveAccD = 131, EquipHaveAccC = 132, EquipHaveAccB = 133, EquipHaveAccA = 134, EquipHaveAccS = 135, EquipHaveAccSS = 136, EquipHaveAccSR = 137, // 특정 등급의 무기 획득 EquipHaveWeaponNOne = 151, EquipHaveWeaponROne = 152, EquipHaveWeaponEOne = 153, EquipHaveWeaponUOne = 154, EquipHaveWeaponHOne = 155, EquipHaveWeaponLOne = 156, EquipHaveWeaponMOne = 157, //특정 등급의 귀걸이 획득 EquipHaveEarNOne = 161, EquipHaveEarROne = 162, EquipHaveEarEOne = 163, EquipHaveEarUOne = 164, EquipHaveEarHOne = 165, EquipHaveEarLOne = 166, EquipHaveEarMOne = 167, // 던전 도전 횟수. DgTryAll = 200, DgTryGold = 201, DgTryEnhance = 202, DgTryAwaken = 203, DgTryPet = 204, // 던전 클리어 횟수. DgClearAll = 210, DgClearGold = 211, DgClearEnhance = 212, DgClearAwaken = 213, DgClearPet = 214, // 던전 스테이지 클리어. DgStageGold = 221, DgStageEnhance = 222, DgStageAwaken = 223, DgStagePet = 224, // 장비 합성 EquipComposeAll = 310, EquipComposeWeapon = 311, EquipComposeArmor = 312, EquipComposeAcc = 313, EquipComposeTreasure = 314, // 장비 장착 EquipWeapon = 321, EquipArmorCape = 322, EquipArmorHat = 323, EquipArmorShoes = 324, EquipAccEar = 325, EquipAccNeck = 326, EquipAccRing = 327, // 장비 강화 EnhanceGear = 330, EnhanceWeapon = 331, EnhanceArmor = 332, EnhanceArmorCape = 333, EnhanceArmorHat = 334, EnhanceArmorShoes = 335, EnhanceAcc = 336, EnhanceAccEar = 337, EnhanceAccNeck = 338, EnhanceAccRing = 339, EnhanceTreasure = 340, // 펫 ~400번대 PetHave = 401, PetEnhance = 411, PetspiritCompose = 430, // 퀘스트 달성횟수 DailyQuestClear = 500, DailyQuestClearTotal = 501, // 이벤트 퀘스트 일차별 달성 EventQuestDayClear = 502, MissionClearLv = 503, // 아이콘, 칭호 ~600번대 // 특정 아이콘, 칭호 장착 EquipIcon = 601, EquipTitle = 602, // 결투장. PvpTry = 990, PvpClear = 991, // 보석 사용. UseDia = 1001, // 색상석 합성. //ComposeIris = 1002, // 자동 전투 활성화 AutoBattle = 1003, // 닉네임 변경 RenameCnt = 1004, // 광고 버프 활성화 ActivateADbuff = 1010, ActivateADbuffAtk = 1011, ActivateADbuffExp = 1012, ActivateADbuffGold = 1013, ADbuffAtkLv = 1021, ADbuffExpLv = 1022, ADbuffGoldLv = 1023, // 기타 Etc = 2000 } // 컨텐츠 종류 public enum eContent { Battle = 1, Equipment = 2, Summon = 3, Dungeon = 4, Etc = 5 } public enum eContentType { None = 0, DailyQuest = 1, RepeatQuest = 2, EventQuest = 3, Icon = 10, Title = 11, QuestMission = 20 } public enum eMonsterType { None = 0, SmalllMonster = 1, MediumMonster = 2, BigMonster = 3, SmallObject = 11, MediumObject = 12, BigObject = 13 } [System.Flags] // 내부 사용 희귀도 플래그. public enum fRangeRarity { None = 0, Normal = 1, Rare = 2, Epic = 4, Unique = 8, Hero = 16, Legend = 32, Myth = 64, All = Normal | Rare | Epic | Unique | Hero | Legend | Myth } [System.Flags] // 오픈 요일. public enum fDays { None = 0x0, // 0 Sunday = 0x1, // 1 Monday = 0x2, // 2 Tuesday = 0x4, // 4 Wednesday = 0x8, // 8 Thursday = 0x10, // 16 Friday = 0x20, // 32 Saturday = 0x40, // 64 All = Sunday | Monday | Tuesday | Wednesday | Thursday | Friday | Saturday } #endregion Reference #region Base [Serializable] // 게임 버전/점검 데이터. public class dGame { public int aosMin; public int aosMax; public int iosMin; public int iosMax; public int oneMin; public int oneMax; public bool iosCouponEnable; public int aosCouponMax; public int iosCouponMax; public int oneCouponMax; public bool isUpdate; [SerializeField] string _updateStartAt; public DateTime updateStartAt { get { if(_updateStartAt is null) return DateTime.MinValue; return DateTime.ParseExact(_updateStartAt, FormatString.DateTimeParse, System.Globalization.CultureInfo.InvariantCulture); } } [SerializeField] string _updateEndAt; public DateTime updateEndAt { get { if(_updateEndAt is null) return DateTime.MaxValue; return DateTime.ParseExact(_updateEndAt, FormatString.DateTimeParse, System.Globalization.CultureInfo.InvariantCulture); } } public string updateMsg; [SerializeField] string _serverTime; public DateTime serverTime { get { if(_serverTime is null) return DateTime.MinValue; return DateTime.ParseExact(_serverTime, FormatString.DateTimeParse, System.Globalization.CultureInfo.InvariantCulture); } } public bool isNotice; public int logLevel; } [Serializable] // 상수. public class dConst { #region Const Base public static readonly BigInteger RateMaxBi = new BigInteger(1000000L); public const int RateMax = 1000000; public const int RateRound0 = RateMax / 200; public const int RateRound1 = RateMax / 20; public const float RateMaxFloat = 1000000f; // 0~1f public const int RateDivideInt = 10000; // 1~100 public const int RateDivideInt1 = 1000; // 0.1~100 public const int RateDivideInt2 = 100; // 0.01~100 public const int RateDivideInt3 = 10; // 0.001~100 public const int RateDivideLong = 100000; public const int RangeDivide = 10000; #endregion Const Base #region Base public int stageMax = 50; public int stageTimeout = 50; public int gradeMax = 4; public int rarityMax = 7; public int offlineTimeMax = 86400; public int offlineTimeStage = 30; public int offlineReward = 500000; #endregion Base #region Player Lv & Exp public int playerMaxLv = 500; public int playerLvExp = 25; public int playerLvExpInc = 1005000; #endregion #region Const Stage & Monster public int monEliteAtk = 1200000; public int monEliteHp = 1200000; public int monBossAtk = 1400000; public int monBossHp = 1400000; public int normalBoxRate = 10000; public int gearBoxRate = 50000; public int petBoxRate = 50000; public int irisRte = 50000; public int eventItemRate = 50000; #endregion Const Stage & Monster #region Enhance public int awakenChangeStonePrice = 10; public int awakenChangeStoneInc = 10; public int lvPointResetPrice = 1000; #endregion Enhance #region Bag public int gearAccOpenStage = 1525; public int gearTreasureOpenStage = 1025; public int gearConsumeOpenStage = 0;//DB 에 없음 public int petOpenStage = 9950;//DB 에 없음 public int gearComposePrice = 5; public int gearExtraChangeStonePrice = 500; public int gearTreasureSellPrice = 1; public int irisUsePrice = 5; #endregion Bag #region Const Pet public int petSpiritComposePrice = 5; public int petExtraChangeStonePrice = 2; #endregion Const Pet #region Gacha public int firstButtonEquip = 1; public int secondButtonEquip = 30; public int thirdButtonEquip = 100; public int fourthButtonEquip = 300; public int firstButtonTreasure = 1; public int secondButtonTreasure = 10; public int thirdButtonTreasure = 30; public int gachaWeaponPrice = 10; public int gachaArmorPrice = 10; public int gachaAccPrice = 10; public int gachaTreasurePrice = 30; #endregion Gacha #region Dungeon public int dungeonGoldOpenStage = 125; public int dungeonEnhanceStoneOpenStage = 225; public int dungeonPetOpenStage = 325; public int dungeonAwakenStoneOpenStage = 525; public int dungeonAwakenOpenStage = 250; public int dungeonPetStageMax = 10; #endregion #region Costume public int colorComposeCount = 10; public int colorSlotMax = 6; public int colorSlotPrice = 100; #endregion Costume #region Etc. public int pvpOpenStage = 2050; public int chatOpenStage = 110; public int nameChangePrice = 5000; public int nameChangeFree = 1; public int nameMin = 2; public int nameMax = 10; #endregion Etc. #region Guardion public int guardianExtraChangeStonePrice = 1; public int firstGradeEquipExp = 1; public int secondGradeEquipExp = 5; public int thirdGradeEquipExp = 25; public int fourthGradeEquipExp = 125; public int firstGradeAccExp = 1; public int secondGradeAccExp = 5; public int thirdGradeAccExp = 25; public int fourthGradeAccExp = 125; #endregion #region Diary public int tripPeiceCnt = 5; public int TripChapterMaxsize = 3; public int TripMaxsize = 6; public int TripPieceMaxsize = 5; public int LifeChapterMaxsize = 2; public int LifeMaxsize = 9; public int LifePieceMaxsize = 12; #endregion } [Serializable] public class dBox { public int id; public int rarity; public int grade; public string path; } [Serializable] public class nSystemData { // 상수. public dConst constData; // 상자. public dBox[] sysBox; // 스테이지. public dArea[] sysArea; // 몬스터, 배경. public dMonster[] sysMonster; public dBg[] sysBackground; // 추가효과. public dExtraRarity[] sysExtraRarity; public dExtraAbility[] sysExtra; // 강화. public dCharStat[] sysCharEnhanceGold; public dCharStat[] sysCharEnhancePoint; // 장비. 무기, 투구, 갑옷, 신발, 목걸이, 반지, 귀걸이. public dGear[] sysGearWeapon; public dGear[] sysGearHat; public dGear[] sysGearCape; public dGear[] sysGearShoes; public dGear[] sysGearNecklace; public dGear[] sysGearRing; public dGear[] sysGearEarring; public dAwaken[] sysGearAwaken; public dTotalLvValue[] sysGearEnhance; // 보물. public dTreasure[] sysGearTreasure; public nProps sysGearTreasureEnhance; // 스킬. public dSkillPassive[] sysCharSkillPassive; public dSkillActive[] sysCharSkillActive; public dAwaken[] sysCharSkillAwaken; public dTotalLvValue[] sysCharSkillEnhance; public dDungeonInfo sysDgGold; public dDungeonInfo sysDgReinStone; public dDungeonInfo sysDgPet; public dDungeonInfo sysDgAwakenStone; public dDungeonInfo sysDgAwaken; public dDungeonInfo sysDgRelic; public dAwakenReward[] sysAwaken; public dDungeonInfo[] sysDgGuardian; public dSysGuardian[] sysGuardian; public dSysRelic[] sysRelic; public dSysRelicEnhanceProp sysRelicEnhance; // 펫. public dPet[] sysPet; public dAwaken[] sysPetAwaken; public dTotalLvValue[] sysPetEnhance; // 코스튬. public dColor[] sysColor; public dCostume[] sysCostumeOutfit; public dCostume[] sysCostumeWeapon; public dCostumeSet[] sysCostumeOutfitSet; public dCostumeSet[] sysCostumeWeaponSet; // 가챠. public dGachaLevel[] sysGachaWeaponCount; public int[] sysGachaWeaponGrade; public dGachaLevel[] sysGachaArmorCount; public int[] sysGachaArmorGrade; public dGachaLevel[] sysGachaAccCount; public int[] sysGachaAccGrade; // 상점. public dShop[] sysShop; // 패스. public dPass[] sysPass; // 버프. public dAdBuff[] sysBuff; // 출석. public dAttend[] sysAttend; // 결투장. public dPvp sysPvp; // 아이콘,칭호 public dTitle[] sysProfileTitle; public dIcon[] sysProfileIcon; // 퀘스트 public dQuest[] sysQuestDaily; public dQuest[] sysQuestRepeat; public dQuest[] sysQuestEvent; public dMission[] sysQuestMission; // 긴급공지, 채팅공지. public dNotice[] sysNotice; public dChatNotice[] sysNoticeChat; // 이벤트. public dEvent[] sysEvent; public dEventInfo sysEventTrade; public dEventInfo sysEventRaise; public dEventInfo sysEventRoulette; public dRewardEvent sysEventReward; //### 이하 수정/추가 필요. } #endregion Base #region Play Base [Serializable] // 재화 플레이 데이터. public class cGoodsData : ISerializationCallbackReceiver { public const string PrefsKey = "PlayGoods"; public int diaPaid; public int diaFree; public int Dia => diaPaid + diaFree; [SerializeField] private string _gold; public BigInteger gold; [SerializeField] private string _goldUsed; public BigInteger goldUsed; public int point; public int gearReinStone; public int skillReinStone; public int gearAwakenStone; public int skillAwakenStone; public int changeStone; public int pudding; public int condMight; // 가챠 티켓. public int gachaWeapon; public int gachaArmor; public int gachaAcc; public int gachaTreasure; public int mileage; [SerializeField] private string _lastTime; public DateTime lastTime; // ES3 저장. public void Save(int iserver) { lastTime = TimeUtils.Now(); OnBeforeSerialize(); string prefskey = FormatString.CombineAllString(PrefsKey, iserver.ToString()); ES3.Save(prefskey, this, Global.ES3_PlayGoods); } // ES3 로드. public static cGoodsData Load(int iserver) { string prefskey = FormatString.CombineAllString(PrefsKey, iserver.ToString()); if (!ES3.KeyExists(prefskey, Global.ES3_PlayGoods)) ES3.Save(prefskey, new cGoodsData(), Global.ES3_PlayGoods); cGoodsData data = ES3.Load(prefskey, Global.ES3_PlayGoods); data.OnAfterDeserialize(); return data; } // ES3 Save 직전 호출, Object->Json 변환시 자동 호출. public void OnBeforeSerialize() { if (gold != null) _gold = gold.ToString(); if (goldUsed != null) _goldUsed = goldUsed.ToString(); _lastTime = lastTime.ToString(FormatString.DateTimeParse); } // ES3 Load 직후 호출, Json->Object 변환시 자동 호출. public void OnAfterDeserialize() { if (!string.IsNullOrEmpty(_gold)) { gold = BigInteger.Parse(_gold); } _gold = null; if (!string.IsNullOrEmpty(_goldUsed)) { goldUsed = BigInteger.Parse(_goldUsed); } _goldUsed = null; if (!string.IsNullOrEmpty(_lastTime)) { lastTime = DateTime.ParseExact(_lastTime, FormatString.DateTimeParse, System.Globalization.CultureInfo.InvariantCulture); } _lastTime = null; } } [Serializable] // 마스터 계정 데이터. public class cMasterData { public string masterCode; } [Serializable] // 플레이 데이터. public class cPlayData : ISerializationCallbackReceiver { public const string PrefsKey = "PlayDatas"; public int server; public string userCode; public string playerName; public int playerIcon; public int playerTitle; public int playerLv; public BigInteger playerExp; [SerializeField] protected string _playerExp; public int clearStage; public int curStage; // 스킬 프리셋. public int usePreset; // 2차원 배열은 Serialize가 불가능하므로 1차원 배열로 나눠서 처리. public int[][] skillPresets; [SerializeField] protected int[] skillPreset1; [SerializeField] protected int[] skillPreset2; [SerializeField] protected int[] skillPreset3; [SerializeField] protected int[] skillPreset4; [SerializeField] protected int[] skillPreset5; [SerializeField] protected int[] skillPreset6; // 펫 프리셋. public int usePetPreset; public int[][] petPresets; [SerializeField] protected int[] petPreset1; [SerializeField] protected int[] petPreset2; [SerializeField] protected int[] petPreset3; [SerializeField] protected int[] petPreset4; [SerializeField] protected int[] petPreset5; [SerializeField] protected int[] petPreset6; public int weapon; public int cape; public int hat; public int shoes; public int earring; public int necklace; public int ring; public int gachaWeaponLv; public int gachaWeaponExp; public int gachaWeaponReward; public int gachaArmorLv; public int gachaArmorExp; public int gachaArmorReward; public int gachaAccLv; public int gachaAccExp; public int gachaAccReward; public bool adRemove; public bool forceOverwrite; public DateTime lastTime; [SerializeField] protected string _lastTime; public bool stageRepeat; public cPlayData() { this.userCode = FormatString.TextHex(UnityEngine.Random.Range(0, 10000000)); this.playerName = "Jelly" + FormatString.TextHex(UnityEngine.Random.Range(0, 65536)); this.playerIcon = 1; this.playerTitle = 57; this.playerLv = 1; this.skillPresets = new int[6][] { new int[4] { -1 , -1 , -1 , -1 }, new int[4] { -1 , -1 , -1 , -1 }, new int[4] { -1 , -1 , -1 , -1 }, new int[4] { -1 , -1 , -1 , -1 }, new int[4] { -1 , -1 , -1 , -1 }, new int[4] { -1 , -1 , -1 , -1 } }; this.petPresets = new int[6][] { new int[4] { -1 , -1 , -1 , -1 }, new int[4] { -1 , -1 , -1 , -1 }, new int[4] { -1 , -1 , -1 , -1 }, new int[4] { -1 , -1 , -1 , -1 }, new int[4] { -1 , -1 , -1 , -1 }, new int[4] { -1 , -1 , -1 , -1 } }; this.weapon = -1; this.cape = -1; this.hat = -1; this.shoes = -1; this.earring = -1; this.necklace = -1; this.ring = -1; this.gachaWeaponLv = 1; this.gachaArmorLv = 1; this.gachaAccLv = 1; this.stageRepeat = false; } // ES3 저장. public void Save() { this.lastTime = TimeUtils.Now(); this.lastTime.AddSeconds(2f); OnBeforeSerialize(); ES3.Save(FormatString.CombineAllString(PrefsKey, this.server.ToString()), this, Global.ES3_PlayDatas); } // ES3 저장. public void SaveDate(DateTime savetime) { this.lastTime = savetime; OnBeforeSerialize(); ES3.Save(FormatString.CombineAllString(PrefsKey, this.server.ToString()), this, Global.ES3_PlayDatas); } // ES3 로드. public static cPlayData Load(int iserver) { string prefskey = FormatString.CombineAllString(PrefsKey, iserver.ToString()); if (!ES3.KeyExists(prefskey, Global.ES3_PlayDatas)) ES3.Save(prefskey, new cPlayData(), Global.ES3_PlayDatas); cPlayData data = ES3.Load(prefskey, Global.ES3_PlayDatas); data.OnAfterDeserialize(); return data; } // ES3 Save 직전 호출, Object->Json 변환시 자동 호출. public void OnBeforeSerialize() { if (playerExp != null) _playerExp = playerExp.ToString(); if (skillPresets != null) { skillPreset1 = skillPresets[0]; skillPreset2 = skillPresets[1]; skillPreset3 = skillPresets[2]; skillPreset4 = skillPresets[3]; skillPreset5 = skillPresets[4]; skillPreset6 = skillPresets[5]; } if (petPresets != null) { petPreset1 = petPresets[0]; petPreset2 = petPresets[1]; petPreset3 = petPresets[2]; petPreset4 = petPresets[3]; petPreset5 = petPresets[4]; petPreset6 = petPresets[5]; } _lastTime = lastTime.ToString(FormatString.DateTimeParse); } // ES3 Load 직후 호출, Json->Object 변환시 자동 호출. public void OnAfterDeserialize() { if (!string.IsNullOrEmpty(_playerExp)) playerExp = BigInteger.Parse(_playerExp); else playerExp = 0L; _playerExp = null; if (skillPreset1 != null) { skillPresets = new int[6][]; skillPresets[0] = skillPreset1; skillPresets[1] = skillPreset2; skillPresets[2] = skillPreset3; skillPresets[3] = skillPreset4; skillPresets[4] = skillPreset5; skillPresets[5] = skillPreset6; skillPreset1 = null; skillPreset2 = null; skillPreset3 = null; skillPreset4 = null; skillPreset5 = null; skillPreset6 = null; } if (petPreset1 != null) { petPresets = new int[6][]; petPresets[0] = petPreset1; petPresets[1] = petPreset2; petPresets[2] = petPreset3; petPresets[3] = petPreset4; petPresets[4] = petPreset5; petPresets[5] = petPreset6; petPreset1 = null; petPreset2 = null; petPreset3 = null; petPreset4 = null; petPreset5 = null; petPreset6 = null; } if (!string.IsNullOrEmpty(_lastTime)) lastTime = DateTime.ParseExact(_lastTime, FormatString.DateTimeParse, System.Globalization.CultureInfo.InvariantCulture); _lastTime = null; if (curStage <= 0) curStage = 101; } } [Serializable] // 플레이 데이터. public class cPlayCostume : ISerializationCallbackReceiver { // 적용중인 코스튬. public int outfitId; public int weaponId; public int hairColor; public int topColor; public int eyeColor; public int[][] paletteSlots; public int[] paletteOpens; [SerializeField] private int[] hairPalette; [SerializeField] private int hairSlot; [SerializeField] private int[] topPalette; [SerializeField] private int topSlot; [SerializeField] private int[] eyePalette; [SerializeField] private int eyeSlot; public cPlayCostume() { this.outfitId = cGoods.CCosClothBase; this.weaponId = cGoods.CCosWeaponBase; this.hairColor = cGoods.CClrHairBase; this.topColor = cGoods.CClrTopBase; this.eyeColor = cGoods.CClrEyeBase; this.paletteSlots = new int[3][] { new int[6] { 1, 0, 0, 0, 0, 0 }, new int[6] { 2, 0, 0, 0, 0, 0 }, new int[6] { 3, 0, 0, 0, 0, 0 } }; this.paletteOpens = new int[3] { 3, 3, 3 }; } // ES3 Save 직전 호출, Object->Json 변환시 자동 호출. public void OnBeforeSerialize() { hairPalette = paletteSlots[0]; topPalette = paletteSlots[1]; eyePalette = paletteSlots[2]; hairSlot = paletteOpens[0]; topSlot = paletteOpens[1]; eyeSlot = paletteOpens[2]; } // ES3 Load 직후 호출, Json->Object 변환시 자동 호출. public void OnAfterDeserialize() { if (hairPalette != null) { paletteSlots = new int[3][]; paletteSlots[0] = hairPalette; paletteSlots[1] = topPalette; paletteSlots[2] = eyePalette; hairPalette = null; topPalette = null; eyePalette = null; paletteOpens = new int[3]; paletteOpens[0] = hairSlot; paletteOpens[1] = topSlot; paletteOpens[2] = eyeSlot; } } } [Serializable] // 상자 플레이 데이터. public class cBoxData : ISerializationCallbackReceiver { public const string PrefsKey = "PlayBox"; [SerializeField] private nIdCnt[] boxCounts; public Dictionary dicBoxCount = new Dictionary(64); public cBoxData() { } public cBoxData(nIdCnt[] datas) { boxCounts = datas; OnAfterDeserialize(); } public nIdCnt[] GetPlayData() { var datas = new List(); foreach (var item in dicBoxCount) { datas.OrderInsert(new nIdCnt(item.Key, item.Value), (a, b) => a.sid.CompareTo(b.sid)); } return datas.ToArray(); } // ES3 저장. public void Save(int iserver) { boxCounts = GetPlayData(); string prefskey = FormatString.CombineAllString(PrefsKey, iserver.ToString()); ES3.Save(prefskey, this, Global.ES3_PlayBox); boxCounts = null; } // ES3 로드. public static cBoxData Load(int iserver) { string prefskey = FormatString.CombineAllString(PrefsKey, iserver.ToString()); if (!ES3.KeyExists(prefskey, Global.ES3_PlayBox)) ES3.Save(prefskey, new cBoxData(), Global.ES3_PlayBox); cBoxData data = ES3.Load(prefskey, Global.ES3_PlayBox); data.OnAfterDeserialize(); return data; } // ES3 Save 직전 호출, Object->Json 변환시 자동 호출. public void OnBeforeSerialize() { } // ES3 Load 직후 호출, Json->Object 변환시 자동 호출. public void OnAfterDeserialize() { if (boxCounts is null) return; for (int i = 0; i < boxCounts.Length; i++) { int key = boxCounts[i].sid; if (dicBoxCount.ContainsKey(key)) dicBoxCount[key] = boxCounts[i].cnt; else dicBoxCount.Add(key, boxCounts[i].cnt); } boxCounts = null; } } [Serializable] public class nUserInfo : ISerializationCallbackReceiver { public float battlePower; [SerializeField] protected string atk; public BigInteger charAtk; [SerializeField] protected string hp; public BigInteger charHp; //public float pierce; public int critRate; public float atkSpeed; public float movSpeed; public float goldRate; public float expRate; public float boxRate; public float skillDmg; public float skillReuseDec; public float healPerSec; public static nUserInfo GetMyInfo() { nUserInfo data = new nUserInfo(); data.charAtk = BuffMgr.Instance.GetCharAtkExcAd(); data.charHp = BuffMgr.Instance.GetCharHp(); //data.pierce = BuffMgr.Instance.GetCharPierce(); data.critRate = BuffMgr.Instance.GetCharCrtRate(); data.atkSpeed = BuffMgr.Instance.GetCharSpd(); data.movSpeed = BuffMgr.Instance.GetCharMov(); data.skillDmg = BuffMgr.Instance.GetSkillDamage(); data.skillReuseDec = BuffMgr.Instance.GetSkillCooldownReduce(); data.healPerSec = BuffMgr.Instance.GetHpHealPerSec(); data.goldRate = BuffMgr.Instance.GetGoldDropRate(); data.expRate = BuffMgr.Instance.GetExpDropRate(); data.boxRate = BuffMgr.Instance.GetChestDropRate(); return data; } public void OnAfterDeserialize() { if (atk != null) atk = charAtk.ToString(); if (hp != null) hp = charHp.ToString(); } public void OnBeforeSerialize() { if (!string.IsNullOrEmpty(atk)) charAtk = BigInteger.Parse(atk); else charAtk = 0L; atk = null; if (!string.IsNullOrEmpty(hp)) charHp = BigInteger.Parse(hp); else charHp = 0L; } } [Serializable] public class nMasterData { public cMasterData master; public cPlayData[] user; } [Serializable] public class nPlayData { // 기본 플레이 데이터. public cPlayData playUser; public cGoodsData playCurrency; public cPlayCostume playCostumeInfo; public cAwakenData playAwaken; public nIdCnt[] playBox; public int mailCount; public int[] playProfileIcon; public int[] playProfileTitle; // 장비. 무기, 투구, 갑옷, 신발, 목걸이, 반지, 귀걸이. public nIdLvInfo[] playGearWeapon; public nIdLvInfo[] playGearCape; public nIdLvInfo[] playGearHat; public nIdLvInfo[] playGearShoes; public nIdLvInfo[] playGearNecklace; public nIdLvInfo[] playGearRing; public nIdLvInfo[] playGearEarring; // 보물. public nIdLvInfo[] playGearTreasure; // 스킬. public nIdLvInfo[] playCharSkillPassive; public nIdLvInfo[] playCharSkillActive; // 펫. public nIdLvInfo[] playPet; // 코스튬. public int[] playCostumeOutfit; public int[] playCostumeWeapon; public nIdCnt[] playColorHair; public nIdCnt[] playColorTop; public nIdCnt[] playColorEye; //골드 강화, 포인트 강화 public nIdLv[] playCharEnhanceGold; public nIdLv[] playCharEnhancePoint; public cPlayerDungeonInfo playDgGold; public cPlayerDungeonInfo playDgReinStone; public cPlayerDungeonInfo playDgPet; public cPlayerDungeonInfo playDgAwakenStone; public cPlayerDungeonInfo playDgAwaken; public cPlayerDungeonInfo[] playDgGuardian; public cPlayerDungeonInfo playDgRelic; public cPlayGuardian[] playGuardian; public cPlayRelic[] playRelic; // 상점. public sShopPlay[] playShop; // 패스. public sPassPlay[] playPass; // 버프. public cAdBuffLevel playBuff; // 출석. public cAttend[] playAttend; // 결투장. public cPvpPlay playPvp; public dPvpRank rankPvp; // 기록 public cTotalRecord playRecordTotal; public cDailyRecord playRecordDaily; public cQuestDaily[] playQuestDaily; public cQuestRepeat[] playQuestRepeat; public cQuestEvent[] playQuestEvent; public cQuestAttend playQuestEventAttend; public cDungeonPreset dgPreset; public cEventItem playEventTrade; public cEventItem playEventRaise; public cEventItem playEventRoulette; public cRewardEvent playEventReward; } [Serializable] public class nSaveData { public cPlayData playUser; public cGoodsData playCurrency; public nIdCnt[] playBox; public nUserInfo playUserInfo; public cTotalRecord playRecordTotal; public cDailyRecord playRecordDaily; public cEventItem playEventRoulette; public cEventItem playEventRaise; public cEventItem playEventTrade; } [Serializable] public class nSaveReturn { public int mailCount; } #endregion Play Base #region Record public class RequestRecrod { public int monsterKill; public int playTime; public RequestRecrod(int imonkill, int itime) { monsterKill = imonkill; playTime = itime; } } [Serializable] public class RecordReturn { public cDailyRecord playRecordDaily; public cTotalRecord playRecordTotal; } [Serializable] public class cTotalRecord { public int attendCnt; public int monsterKill; public int gachaWeaponCnt; public int gachaArmorCnt; public int gachaAccCnt; public int gachaTreasureCnt; public int composeWeaponCnt; public int composeArmorCnt; public int composeAccCnt; public int enhanceGoldAtk; public int enhanceGoldHp; public int clearDailyQuest; public int playTime; public int missionLv; public int missionProgress; public int composeIris; public int composePetSpirit; public int renameCnt; } [Serializable] public class cDailyRecord { public int attendCnt; public int monsterKill; public int gachaWeaponCnt; public int gachaArmorCnt; public int gachaAccCnt; public int gachaTreasureCnt; public int composeWeaponCnt; public int composeArmorCnt; public int composeAccCnt; public int enhanceGoldAtk; public int enhanceGoldHp; public int clearDailyQuest; public int playTime; } #endregion #region Stage & Monster & Bg & Bgm [Serializable] public class dArea : ISerializationCallbackReceiver { public int id; public int bgId; public int[] monsterNormal; public int[] monsterEpic; public int[] monsterBoss; [SerializeField] private string _hp; public BigInteger hp; [SerializeField] private string _atk; public BigInteger atk; public int normalBox; public int normalBoxCnt; public int gearBox; public int gearBoxCnt; public int accBox; public int accBoxCnt; public int petBox; public int petBoxCnt; [SerializeField] private string _gold; public BigInteger gold; [SerializeField] private string _exp; public BigInteger exp; public int wave; // Object->Json 변환시 자동 호출. public void OnBeforeSerialize() { if (atk != null) _atk = atk.ToString(); if (hp != null) _hp = hp.ToString(); if (gold != null) _gold = gold.ToString(); if (exp != null) _exp = exp.ToString(); } // Json->Object 변환시 자동 호출. public void OnAfterDeserialize() { if (!string.IsNullOrEmpty(_gold)) gold = BigInteger.Parse(_gold); else gold = 0L; _gold = null; if (!string.IsNullOrEmpty(_atk)) atk = BigInteger.Parse(_atk); else atk = 0L; _atk = null; if (!string.IsNullOrEmpty(_hp)) hp = BigInteger.Parse(_hp); else hp = 0L; _hp = null; if (!string.IsNullOrEmpty(_exp)) exp = BigInteger.Parse(_exp); else exp = 0L; _exp = null; } } [Serializable] public class nStageRequest { public int curStage; public int clearStage; public bool isClear; } [Serializable] public class dMonster { public int id; public string path; public int speed; public int group; } [Serializable] public enum eBgEffect { None = -1, BubbleWhite = 1, BubbleBlue = 4, LeafGreen = 13, LeafPink = 16, LightYellow = 25, RainWhite = 31, WaveWhite = 41 } [Serializable] public class dBg { public int id; public string path; public int[] globalLight; public int[] charLight; public eBgEffect bgEffect; } public enum BGM { none, intro, stage, goldDg, enhanceDg, petDg, awakenStoneDg, awakenDg, guardian, pvp } [Serializable] public class dBgm { public BGM id; public string path; public dBgm(BGM id, string path) { this.id = id; this.path = path; } } #endregion Stage & Monster #region Dungeon //@ 클래스 이름, 구조 변경 필요. [Serializable] public class dDungeonInfo { public int id; public int bgId; public int wave; public int openStage; public int timeOut;//던전 정보 public int[] monsterNormal; public int[] monsterEpic; public int[] monsterBoss; public nDiffs[] diffs;//던전 난이도별 차등 } [Serializable] public class cPlayerDungeonInfo { public int sid; public int lv; public int ticket; public int ticketUsed; public int dailyTry; public int totalTry; public int dailyClear; public int totalClear; public int dailyFail; public int totalFail; } public class nDungeonTryInfo { public int lv; public bool clear; public bool isSkip; public int skipCnt; public int preset; public int petPreset; public int extraPreset; public float bonus; public int sid; public nDungeonTryInfo(int lv, bool clear, bool isskip, int skipcnt, int skill, int pet, int extra, float ibonus) { this.lv = lv; this.clear = clear; isSkip = isskip; skipCnt = skipcnt; preset = skill; petPreset = pet; extraPreset = extra; bonus = ibonus; } public nDungeonTryInfo(int lv, bool clear, int skill, int pet, int extra) { this.lv = lv; this.clear = clear; preset = skill; petPreset = pet; extraPreset = extra; } public nDungeonTryInfo(int lv,int sid, bool clear, int skill, int pet, int extra) { this.lv = lv; this.sid = sid; this.clear = clear; preset = skill; petPreset = pet; extraPreset = extra; } } public class nDungeonResultReturn { public cGoodsData playCurrency; public cPlayerDungeonInfo playDgGold; public cPlayerDungeonInfo playDgReinStone; public cPlayerDungeonInfo playDgPet; public cPlayerDungeonInfo playDgAwakenStone; public cPlayerDungeonInfo playDgAwaken; public cPlayerDungeonInfo playDgRelic; public cAwakenData playAwaken; public cPlayerDungeonInfo playDgGuardian; public cPlayGuardian playGuardian; } #endregion Dungeon #region Color & Costume [Serializable] public class dColor : ISerializationCallbackReceiver { public int id; [SerializeField] private int[] color; public Color realColor; // Object->Json 변환시 자동 호출. public void OnBeforeSerialize() { } // Json->Object 변환시 자동 호출. public void OnAfterDeserialize() { if (color != null) { realColor = new Color(color[0] / 255f, color[1] / 255f, color[2] / 255f, 1f); color = null; } } } [Serializable] public class dCostumeSet { public int id; public eEffectType abilityType; public int abilityValue; public int[] set; } [Serializable] public class dCostume { public int id; public string path; public eEffectType abilityType1; public int abilityValue1; public eEffectType abilityType2; public int abilityValue2; public bool have; } [Serializable] public class nColorSet { public int hairColor; public int topColor; public int eyeColor; } [Serializable] public class nCostumeReturn { public cGoodsData playCurrency; public cPlayCostume playCostumeInfo; } [Serializable] public class nColorComposeReturn { public int result; public nIdCnt[] playColorHair; public nIdCnt[] playColorTop; public nIdCnt[] playColorEye; } #endregion Color & Costume #region Character [Serializable] public class dPlayerLv { public int lv; public static dPlayerLv[] LocalDatas() { dPlayerLv[] datas = new dPlayerLv[40000]; BigInteger ibefexp = 0L; for (int i = 0; i < datas.Length; i++) { datas[i] = new dPlayerLv(); datas[i].lv = i + 1; } return datas; } } [Serializable] public class dIntervals { public int interval; public int abilityValue; public int abilityValueInc; public int buyingCnt; public int buyingCntInc; public dIntervals(bool isGold) { if (isGold) { interval = 0; abilityValue = 0; abilityValueInc = 1; buyingCnt = 100; buyingCntInc = 5; } else { interval = 0; abilityValue = 0; abilityValueInc = 1; buyingCnt = 1; buyingCntInc = 0; } } } public class nCharEnhanceGoldReturn { public cGoodsData playCurrency; public nIdLv playCharEnhanceGold; } public class nCharEnhancePointReturn { public cGoodsData playCurrency; public nIdLv playCharEnhancePoint; } public class nCharAwakenReturn { public cGoodsData playCurrency; public cAwakenData playAwaken; } public class nStageReturn { public cPlayData playUser; } [Serializable] public class dCharStat : ISerializationCallbackReceiver { public int id; public int sid; public eEffectType abilityType;//올라가는 어빌리티 종류 public int maxLv;//만렙 public int abilityValue;//강화 1레벨 스텟 public int abilityValueInc;//강화 레벨이 올라가면 늘어나는 스텟 [SerializeField] private string buyingCnt; public BigInteger buyingCount;//강화 1레벨 비용 public int buyingCntInc;//강화 레벨당 늘어나는 비용 public int condType; //해금에 필요한 ID. public int condValue;//해금에 필요한 어빌리티 레벨 public int level;//현재 강화 레벨 public void OnBeforeSerialize() { if (buyingCnt != null) buyingCnt = buyingCount.ToString(); } public void OnAfterDeserialize() { if(!string.IsNullOrEmpty(buyingCnt)) buyingCount = BigInteger.Parse(buyingCnt); else buyingCount = 0L; buyingCnt = null; } } #endregion Character #region Awaken [Serializable] public class cAwakenData : ISerializationCallbackReceiver { public int awaken; public int usePreset; public int[][] extras; [SerializeField] protected int[] extras1; [SerializeField] protected int[] extras2; [SerializeField] protected int[] extras3; public bool[][] awakenUnlock; public cAwakenData() { awaken = 6; extras = new int[3][] { new int[6]{ -1,-1,-1,-1,-1,-1}, new int[6]{ -1,-1,-1,-1,-1,-1}, new int[6]{ -1,-1,-1,-1,-1,-1} }; awakenUnlock = new bool[3][] { new bool[6]{ true,true,true,true,true,true}, new bool[6]{ true,true,true,true,true,true}, new bool[6]{ true, true, true, true, true, true } }; } public static cAwakenData LocalData() { cAwakenData datas = new cAwakenData(); datas.awaken = 6; datas.extras = new int[3][] { new int[6]{ -1,-1,-1,-1,-1,-1}, new int[6]{ -1,-1,-1,-1,-1,-1}, new int[6]{ -1,-1,-1,-1,-1,-1} }; datas.awakenUnlock = new bool[3][] { new bool[6]{ true,true,true,true,true,true}, new bool[6]{ true,true,true,true,true,true}, new bool[6]{ true, true, true, true, true, true } }; return datas; } // ES3 Save 직전 호출, Object->Json 변환시 자동 호출. public void OnBeforeSerialize() { if (extras != null) { extras1 = extras[0]; extras2 = extras[1]; extras3 = extras[2]; } } // ES3 Load 직후 호출, Json->Object 변환시 자동 호출. public void OnAfterDeserialize() { if (extras1 != null) { extras = new int[3][]; extras[0] = extras1; extras[1] = extras2; extras[2] = extras3; extras1 = null; extras2 = null; extras3 = null; } } public void Save() { OnBeforeSerialize(); ES3.Save("PlayAwaken", this, Global.ES3_CharAwaken); } public static cAwakenData Load(cAwakenData prevData) { if (!ES3.KeyExists("PlayAwaken", Global.ES3_CharAwaken)) { if(prevData != null) { ES3.Save("PlayAwaken", prevData, Global.ES3_CharAwaken); } else { ES3.Save("PlayAwaken", new cAwakenData(), Global.ES3_CharAwaken); } } cAwakenData data = ES3.Load("PlayAwaken", Global.ES3_CharAwaken); data.OnAfterDeserialize(); return data; } } [Serializable] public class dSysGuardian { public int guardianType; public dSysGuardianLevel[] levels; } [Serializable] public class dSysGuardianLevel { public int lv; public int maxExp; public int abilityType1; public int abilityMinValue1; public int abilityMaxValue1; public int abilityType2; public int abilityMinValue2; public int abilityMaxValue2; public int abilityType3; public int abilityMinValue3; public int abilityMaxValue3; } [Serializable] public class cPlayGuardian { public int guardianType; public int lv; public int exp; public int[] extras; } public class nAwakenPresetSlot { public int preset; public int slot; public nAwakenPresetSlot(int ipreset, int islot) { preset = ipreset; slot = islot; } } [Serializable] public class dAwakenReward : ISerializationCallbackReceiver { public int awakenInc; [SerializeField] private string rewardCnt; public BigInteger rewardCount; public void OnAfterDeserialize() { if (rewardCount != 0) rewardCnt = rewardCount.ToString(); } public void OnBeforeSerialize() { if (!string.IsNullOrEmpty(rewardCnt)) rewardCount = BigInteger.Parse(rewardCnt); else rewardCount = 0L; rewardCnt = null; } } #endregion #region Gear & Treasure [Serializable] public class dGear : ISerializationCallbackReceiver { public int id; public int rarity; public int grade; public int maxAwaken; [SerializeField] private string buyingCnt; public int buyingCount; [SerializeField] private string buyingCntInc; public int buyingCountInc; public eEffectType abilityType1; public long abilityValue1; public long abilityValueInc1; public eEffectType abilityType2; public long abilityValue2; public long abilityValueInc2; public eEffectType abilityType3; public long abilityValue3; public long abilityValueInc3; public bool have; public int count; public int awaken; public int level; public int[] extraEffects; // Object->Json 변환시 자동 호출. public void OnBeforeSerialize() { buyingCnt = buyingCount.ToString(); buyingCntInc = buyingCountInc.ToString(); } // Json->Object 변환시 자동 호출. public void OnAfterDeserialize() { if (!string.IsNullOrEmpty(buyingCnt)) buyingCount = int.Parse(buyingCnt); else buyingCount = 0; buyingCnt = null; if (!string.IsNullOrEmpty(buyingCntInc)) buyingCountInc = int.Parse(buyingCntInc); else buyingCountInc = 0; buyingCntInc = null; } } [Serializable] public class nGearEnhanceReturn { public cGoodsData playCurrency; public nIdLvInfo playGearWeapon; public nIdLvInfo playGearCape; public nIdLvInfo playGearHat; public nIdLvInfo playGearShoes; public nIdLvInfo playGearEarring; public nIdLvInfo playGearNecklace; public nIdLvInfo playGearRing; } [Serializable] public class nGearComposeReturn { public nGoods[] result; public nIdLvInfo[] playGearWeapon; public nIdLvInfo[] playGearCape; public nIdLvInfo[] playGearHat; public nIdLvInfo[] playGearShoes; public nIdLvInfo[] playGearEarring; public nIdLvInfo[] playGearNecklace; public nIdLvInfo[] playGearRing; public int composeCnt; } [Serializable] public class nGearAwakenReturn { public cGoodsData playCurrency; public nIdLvInfo[] playGearWeapon; public nIdLvInfo[] playGearCape; public nIdLvInfo[] playGearHat; public nIdLvInfo[] playGearShoes; public nIdLvInfo[] playGearEarring; public nIdLvInfo[] playGearNecklace; public nIdLvInfo[] playGearRing; } [Serializable] public class nGearEfcAddReturn { public cGoodsData playCurrency; public nIdLvInfo playGearWeapon; public nIdLvInfo playGearCape; public nIdLvInfo playGearHat; public nIdLvInfo playGearShoes; public nIdLvInfo playGearEarring; public nIdLvInfo playGearNecklace; public nIdLvInfo playGearRing; } [Serializable] public class dTreasure { public int id; public int rarity; public int maxLv; public eEffectType abilityType; public long abilityValue; public long abilityValueInc; public bool have; public int count; public int level; } [Serializable] public class nTreasureEnhanceReturn { public nIdLvInfo playGearTreasure; } [Serializable] public class nTreasureSellReturn { public cGoodsData playCurrency; public nIdLvInfo playGearTreasure; } #endregion Gear & Treasure #region Skill // 스킬 타입. public enum eSkillType { None = 0, //Damage = 1000 //Effect = 2000 // 범위에 데미지. //Range = 000 // 타겟에 데미지. //One = 100 // 수치 데미지. //Value = 00 // Hp 비례 데미지. //Rate = 10 // 시전자 위치에서. //AtUse = 0 // 타겟 위치에서. //AtTarget = 1 // 시전자를 따라다님. //TraceUse = 2 // 타겟을 따라다님. //TraceTarget = 3 RangeValueAtUse = 1000, RangeValueAtTarget = 1001, RangeValueTraceUse = 1002, RangeValueTraceTarget = 1003, //RangeRateAtUse = 1010, //RangeRateAtTarget = 1011, //RangeRateTraceUse = 1012, //RangeRateTraceTarget = 1013, OneValueAtUse = 1100, OneValueAtTarget = 1101, OneValueTraceUse = 1102, OneValueTraceTarget = 1103, //OneRateAtUse = 1110, //OneRateAtTarget = 1111, //OneRateTraceUse = 1112, //OneRateTraceTarget = 1113, //EffectRangeValueAtUse = 2000, //EffectRangeValueAtTarget = 2001, //EffectRangeValueTraceUse = 2002, //EffectRangeValueTraceTarget = 2003, //EffectRangeRateAtUse = 2010, //EffectRangeRateAtTarget = 2011, //EffectRangeRateTraceUse = 2012, //EffectRangeRateTraceTarget = 2013, //EffectOneValueAtUse = 2100, //EffectOneValueAtTarget = 2101, //EffectOneValueTraceUse = 2102, //EffectOneValueTraceTarget = 2103, //EffectOneRateAtUse = 2110, //EffectOneRateAtTarget = 2111, //EffectOneRateTraceUse = 2112, //EffectOneRateTraceTarget = 2113 End = 9999 } // 상태이상. public enum eSkillDebuff { None = 0, DecMove = 1, DamageSec = 2, Stun = 3, Push = 4, Pull = 5 } [Serializable] public class dSkillPassive { public int id; public int rarity; public int openLv; public int maxLv; public int buyingCnt; public int buyingCntInc; public eEffectType abilityType; public long abilityValue; public long abilityValueInc; public int level; } [Serializable] public class dSkillActive { public int id; public int rarity; public int openLv; public int maxAwaken; public int buyingCnt; public int buyingCntInc; // 0. 쿨타임. public int coolTime; // 1. 피해량. public long atkValue; public long atkValueInc; public eSkillDebuff debuffType; // 2. 상태이상 수치. public int debuffValue; public int debuffValueInc; // 3. 상태이상 지속 시간. public float debuffTime; public int level; public int awaken; } [Serializable] // 스킬 강화/각성 후 리턴. public class nSkillReturn { public cGoodsData playCurrency; public nIdLvInfo playCharSkillPassive; public nIdLvInfo playCharSkillActive; } #endregion Skill #region Pet [Serializable] public class dPet : ISerializationCallbackReceiver { public int id; public int rarity; public int maxAwaken; public int condValue; [SerializeField] private string buyingCnt; public int buyingCount; [SerializeField] private string buyingCntInc; public int buyingCountInc; public eEffectType abilityType1; public long abilityValue1; public long abilityValueInc1; public eEffectType abilityType2; public long abilityValue2; public long abilityValueInc2; public eEffectType abilityType3; public long abilityValue3; public long abilityValueInc3; public eEffectType abilityTypeOption; public long abilityValueOption; public bool have; public int awaken; public int level; public int[] extraEffects; public int count; // Object->Json 변환시 자동 호출. public void OnBeforeSerialize() { buyingCnt = buyingCount.ToString(); buyingCntInc = buyingCountInc.ToString(); } // Json->Object 변환시 자동 호출. public void OnAfterDeserialize() { if (!string.IsNullOrEmpty(buyingCnt)) buyingCount = int.Parse(buyingCnt); else buyingCount = 0; buyingCnt = null; if (!string.IsNullOrEmpty(buyingCntInc)) buyingCountInc = int.Parse(buyingCntInc); else buyingCountInc = 0; buyingCntInc = null; } } [Serializable] public class nPetReturn { public cGoodsData playCurrency; public nIdLvInfo playPet; } [Serializable] public class nPetsReturn { public nGoods[] result; public nIdLvInfo[] playPet; } #endregion Pet #region Gacha // 소환 레벨별 필요 횟수, 확률, 보상. [Serializable] public class dGachaLevel : ISerializationCallbackReceiver { // 현재 레벨 달성에 필요한 횟수. public int cnt; // 현재 레벨 희귀도별 확률. 0:일반, 1:레어, 2:에픽, 3:유니크, 4:전설, 5:영웅. public int[] props; // 현재 레벨 달성 보상. public int rewardType; public int rewardId; [SerializeField] private string rewardCnt; public BigInteger rewardCount; // Object->Json 변환시 자동 호출. public void OnBeforeSerialize() { if (rewardCount != null) rewardCnt = rewardCount.ToString(); } // Json->Object 변환시 자동 호출. public void OnAfterDeserialize() { if (!string.IsNullOrEmpty(rewardCnt)) rewardCount = BigInteger.Parse(rewardCnt); else rewardCount = 0L; rewardCnt = null; } } // 가챠 타입. 0:보석, 1:티켓. [Serializable] public class nGachaType { public int gachaType; public nGachaType(int itype) { this.gachaType = itype; } } #endregion Gacha #region Title & Icon [SerializeField] public class nIconGetReutn : nGoodsGet { int sid; } public enum eDifficulty { Easy = 1, Normal = 2, Hard = 3, VeryHard = 4, Special = 5 } [SerializeField] public class nTitleGetReutn : nGoodsGet { public int sid; } [Serializable] public class dTitle { public int id; public bool have; public eContent category; // 획득 컨텐츠 public eDifficulty grade; // 획득 난이도 public eCondition condType; // 획득 방법 public int condValue; // 회득 목표치 public eEffectType abilityType; // 해금 효과 타입 public int abilityValue; // 해금 스탯값 } [Serializable] public class dIcon { public int id; public bool have; public eCondition condType; // 획득 방법 public int condValue; } #endregion #region DungeonPreset public class cDungeonPreset { static readonly string _prefsKey = "cDungeonPreset"; public int[] dgSkillPreset = new int[6]; public int[] dgAwakenPreset = new int[6]; public int[] dgPetPreset = new int[6]; public void Save() { ES3.Save(_prefsKey, this, Global.ES3_DgPreset); } public static cDungeonPreset Load() { if (!ES3.KeyExists(_prefsKey, Global.ES3_DgPreset)) ES3.Save(_prefsKey, new cDungeonPreset(), Global.ES3_DgPreset); return ES3.Load(_prefsKey, Global.ES3_DgPreset); } } #endregion #region AdBuff [Serializable] public class dAdBuff { public int lv; public int exp; public int atkValue; public int goldValue; public int expValue; } [Serializable] public class cAdBuffLevel { public const string PrefsKey = "cAdBuffLevel"; public int atkLv; public int atkExp; public int goldLv; public int goldExp; public int expLv; public int expExp; public int[] adTimer = new int[3]; public void Save(int iserver) { string prefsKey = FormatString.CombineAllString(PrefsKey, iserver.ToString()); adTimer[0] = AdBuffMgr.GetAdTImer()[0]; adTimer[1] = AdBuffMgr.GetAdTImer()[1]; adTimer[2] = AdBuffMgr.GetAdTImer()[2]; ES3.Save(prefsKey, this, Global.ES3_AdBuff); } public static cAdBuffLevel Load(cAdBuffLevel prevData, int iserver) { string prefsKey = FormatString.CombineAllString(PrefsKey, iserver.ToString()); if (!ES3.KeyExists(prefsKey, Global.ES3_AdBuff)) { if (prevData != null) { ES3.Save(prefsKey, prevData, Global.ES3_AdBuff); } else { ES3.Save(prefsKey, new cAdBuffLevel(), Global.ES3_AdBuff); } } return ES3.Load(prefsKey, Global.ES3_AdBuff); } } public class nAdBuffReturn { public cAdBuffLevel playBuff; } #endregion #region Event public enum eEventMoveType { None = 0, Attend10 = 1, Attend7 = 2, // 마리모 출석. Mission = 3, // 성장 지원 미션. Exchange = 4, // 마리모 교환. Hottime = 5, Roulette = 6, Raise = 7, // 마리모 키우기. Pass = 500, Shop = 900, // Enhance EnhnaceGold = 101, EnhancePoint = 102, EnhanceAwakne = 103, // Summon SummonWeapon = 201, SummonArmor = 202, SummonAcc = 203, SummonTreasure = 204, // Bag BagWeapon = 301, BagArmorCape = 302, BagArmorHat = 303, BagArmorShoes = 304, BagAccEar = 305, BagAccNeck = 306, BagAccRing = 307, BagTreasure = 308, BagTreasureR = 309, BagConsume = 350, // skill skillActive = 401, skillPassive = 402, // pet pet = 501, petSprit = 502, // dungeon DgGold = 601, DgStone = 602, DgAwaken = 603, DgPet = 604, DgRelic = 607, // Profile ProfileIcon = 701, ProfileTitleBattle = 702, ProfileTitleEquip = 703, ProfileTitleSummon = 704, ProfileTitleDungeon = 705, ProfileTitleEtc = 706, // Etc Content AdBuff = 2001, Attend = 2002, SettingSys = 2003, SettingId = 2004, } [Serializable] public class dEvent : ISerializationCallbackReceiver { public int id; public string title; // deprecated public string path; public int[] bgColor; public eEventMoveType moveType; public int scale1; public int scale2; public int scale3; [SerializeField] private string _startAt; public DateTime startAt; [SerializeField] private string _endAt; public DateTime endAt; [SerializeField] private string _startTime; public TimeSpan startTime; [SerializeField] private string _endTime; public TimeSpan endTime; public int[] eventType; // deprecated // Object->Json 변환시 자동 호출. public void OnBeforeSerialize() { if(!Application.isPlaying) return; _startAt = startAt.ToString(FormatString.DateTimeParse); _startTime = startTime.ToString(FormatString.DateTimeParse); _endAt = endAt.ToString(FormatString.DateTimeParse); _endTime = endTime.ToString(FormatString.DateTimeParse); } // Json->Object 변환시 자동 호출. public void OnAfterDeserialize() { if (!string.IsNullOrEmpty(_startAt)) startAt = DateTime.ParseExact(_startAt, FormatString.DateTimeParse, System.Globalization.CultureInfo.InvariantCulture); _startAt = null; if (!string.IsNullOrEmpty(_startTime)) startTime = TimeParsing(_startTime); _startTime = null; if (!string.IsNullOrEmpty(_endAt)) endAt = DateTime.ParseExact(_endAt, FormatString.DateTimeParse, System.Globalization.CultureInfo.InvariantCulture); _endAt = null; if (!string.IsNullOrEmpty(_endTime)) endTime = TimeParsing(_endTime); _endTime = null; } private static TimeSpan TimeParsing(string time) { string[] splitText = time.Split(":"); TimeSpan span = new TimeSpan(int.Parse(splitText[0]), int.Parse(splitText[1]), int.Parse(splitText[2])); return span; } } [Serializable] public class dEventInfo : ISerializationCallbackReceiver { public int id; public string title; // deprecated public string item; // deprecated public int price; public nRewardLimit[] rewards; public nRewardLimit[] props; [SerializeField] private string _startAt; public DateTime startAt; [SerializeField] private string _endAt; public DateTime endAt; [SerializeField] private string _closeAt; public DateTime closeAt; // Object->Json 변환시 자동 호출. public void OnBeforeSerialize() { _startAt = startAt.ToString(FormatString.DateTimeParse); _endAt = endAt.ToString(FormatString.DateTimeParse); _closeAt = closeAt.ToString(FormatString.DateTimeParse); } // Json->Object 변환시 자동 호출. public void OnAfterDeserialize() { if (!string.IsNullOrEmpty(_startAt)) startAt = DateTime.ParseExact(_startAt, FormatString.DateTimeParse, System.Globalization.CultureInfo.InvariantCulture); _startAt = null; if (!string.IsNullOrEmpty(_endAt)) endAt = DateTime.ParseExact(_endAt, FormatString.DateTimeParse, System.Globalization.CultureInfo.InvariantCulture); _endAt = null; if (!string.IsNullOrEmpty(_closeAt)) closeAt = DateTime.ParseExact(_closeAt, FormatString.DateTimeParse, System.Globalization.CultureInfo.InvariantCulture); _closeAt = null; } } [Serializable] public class cEventItem { public int id; public int sid; public int item; public int itemUsed; public nIdBuyCnt[] rewards; } [Serializable] public class EventServerReturn { public nGoods[] result; public cEventItem playEventTrade; public cEventItem playEventRaise; public cEventItem playEventRoulette; public cGoodsData playCurrency; } [Serializable] public class cRewardEvent { public int sid; } [Serializable] public class dRewardEvent : ISerializationCallbackReceiver { public int id; public string path; public nReward[] rewards; [SerializeField] private string _startAt; public DateTime startAt; [SerializeField] private string _endAt; public DateTime endAt; public void OnBeforeSerialize() { _startAt = startAt.ToString(FormatString.DateTimeParse); _endAt = endAt.ToString(FormatString.DateTimeParse); } public void OnAfterDeserialize() { if (!string.IsNullOrEmpty(_startAt)) startAt = DateTime.ParseExact(_startAt, FormatString.DateTimeParse, System.Globalization.CultureInfo.InvariantCulture); _startAt = null; if (!string.IsNullOrEmpty(_endAt)) endAt = DateTime.ParseExact(_endAt, FormatString.DateTimeParse, System.Globalization.CultureInfo.InvariantCulture); _endAt = null; } } [Serializable] public class EventRewardReturn { public cRewardEvent playEventReward; } #endregion #region Shop public enum eShopType { None = -1, Event = 0, SpecialPack = 1, CostumePack = 2, Dia = 3, CostumeCloth = 4, CostumeWeapon = 5, General = 6, Mileage = 7, Pass = 500 } [Serializable] public class dShop : ISerializationCallbackReceiver { public int id; public int sortOrder; public int openStage; public string path; public string productId; // 구매 제한. public eRefreshType refreshType; public int refreshValue; public int limitCnt; // 상점 분류. public eShopType shopType; // 구매 재화 종류. public int buyingType; public int buyingId; public int buyingCnt; public int mileage; // 상품 내용. public nReward[] rewards; [SerializeField] private string _startAt; public DateTime startAt; [SerializeField] private string _endAt; public DateTime endAt; // 플레이 데이터. public int buyCnt; public int totalCnt; public DateTime refreshAt; public void OnBeforeSerialize() { _startAt = startAt.ToString(FormatString.DateTimeParse); _endAt = endAt.ToString(FormatString.DateTimeParse); } public void OnAfterDeserialize() { if (!string.IsNullOrEmpty(_startAt)) startAt = DateTime.ParseExact(_startAt, FormatString.DateTimeParse, System.Globalization.CultureInfo.InvariantCulture); _startAt = null; if (!string.IsNullOrEmpty(_endAt)) endAt = DateTime.ParseExact(_endAt, FormatString.DateTimeParse, System.Globalization.CultureInfo.InvariantCulture); _endAt = null; } } [Serializable] public class sShopPlay : ISerializationCallbackReceiver { public int sid; public int buyCnt; public int totalCnt; public DateTime refreshAt; [SerializeField] protected string _refreshAt; public void OnBeforeSerialize() { _refreshAt = refreshAt.ToString(FormatString.DateTimeParse); } public void OnAfterDeserialize() { if (!string.IsNullOrEmpty(_refreshAt)) refreshAt = DateTime.ParseExact(_refreshAt, FormatString.DateTimeParse, System.Globalization.CultureInfo.InvariantCulture); _refreshAt = null; } } [Serializable] public class nShopBuyReturn { public cGoodsData playCurrency; public sShopPlay playShop; //public nGoods[] result; } #endregion Shop #region Pass [Serializable] public class dPass : ISerializationCallbackReceiver { public int id; // 대표 이미지. public string path; public int[] bgTop; public int[] bgBottom; // 패스 종류. 0: 반복, 1: 일회성, 2: 이벤트(일회성). public int passType; // 세부분류 단계 수. public int passUnit; public eCondition condType; public dPassLevel[] levels; [SerializeField] private string _startAt; public DateTime startAt; [SerializeField] private string _endAt; public DateTime endAt; public DateTime refreshAt; // 플레이 데이터. public int progress; public bool[] isPaid; public int[] haveLvFrees; public int[] haveLvPaids; // 클라 계산 데이터. public int availLevel; public int[] shopIds; public void OnBeforeSerialize() { _startAt = startAt.ToString(FormatString.DateTimeParse); _endAt = endAt.ToString(FormatString.DateTimeParse); } public void OnAfterDeserialize() { if (!string.IsNullOrEmpty(_startAt)) startAt = DateTime.ParseExact(_startAt, FormatString.DateTimeParse, System.Globalization.CultureInfo.InvariantCulture); _startAt = null; if (!string.IsNullOrEmpty(_endAt)) endAt = DateTime.ParseExact(_endAt, FormatString.DateTimeParse, System.Globalization.CultureInfo.InvariantCulture); _endAt = null; } } [Serializable] public class dPassLevel : ISerializationCallbackReceiver { public int condLv; public int condValue; // 무료 보상. public int freeRewardType; public int freeRewardId; [SerializeField] private string freeRewardCnt; public BigInteger freeReward; // 유료 보상. public int paidRewardType; public int paidRewardId; [SerializeField] private string paidRewardCnt; public BigInteger paidReward; // Object->Json 변환시 자동 호출. public void OnBeforeSerialize() { } // Json->Object 변환시 자동 호출. public void OnAfterDeserialize() { if (!string.IsNullOrEmpty(freeRewardCnt)) freeReward = BigInteger.Parse(freeRewardCnt); freeRewardCnt = null; if (!string.IsNullOrEmpty(paidRewardCnt)) paidReward = BigInteger.Parse(paidRewardCnt); paidRewardCnt = null; } } [Serializable] public class sPassPlay : ISerializationCallbackReceiver { public int sid; public int progress; public bool[] isPaid; public int[] haveLvFrees; public int[] haveLvPaids; [SerializeField] private string _refreshAt; public DateTime refreshAt; public void OnBeforeSerialize() { _refreshAt = refreshAt.ToString(FormatString.DateTimeParse); } public void OnAfterDeserialize() { if (!string.IsNullOrEmpty(_refreshAt)) refreshAt = DateTime.ParseExact(_refreshAt, FormatString.DateTimeParse, System.Globalization.CultureInfo.InvariantCulture); _refreshAt = null; } } [Serializable] public class nPassRewardReturn { public cGoodsData playCurrency; public sPassPlay playPass; public nGoods[] result; } #endregion Pass #region Mail // 우편. [Serializable] public class dMail : ISerializationCallbackReceiver { public string id; public string header; public string title; public nReward[] rewards; [SerializeField] private string _endAt; public DateTime endAt; [SerializeField] private string _readAt; public DateTime readAt; // Object->Json 변환시 자동 호출. public void OnBeforeSerialize() { _endAt = endAt.ToString(FormatString.DateTimeParse); _readAt = readAt.ToString(FormatString.DateTimeParse); } // Json->Object 변환시 자동 호출. public void OnAfterDeserialize() { if (!string.IsNullOrEmpty(_endAt)) endAt = DateTime.ParseExact(_endAt, FormatString.DateTimeParse, System.Globalization.CultureInfo.InvariantCulture); _endAt = null; if (!string.IsNullOrEmpty(_readAt)) readAt = DateTime.ParseExact(_readAt, FormatString.DateTimeParse, System.Globalization.CultureInfo.InvariantCulture); _readAt = null; } } // 우편 목록 갱신/읽기 완료(삭제) 리턴 데이터. [Serializable] public class nMailRefreshReturn { public dMail[] playMail; } // 우편 아이템 획득 리턴 데이터. [Serializable] public class nMailGetReturn : nGoodsGet { public dMail[] playMail; } #endregion Mail #region Attend [Serializable] public class AttendReward { public int day; public nReward[] rewards; } // 출석. [Serializable] public class dAttend : ISerializationCallbackReceiver { public int attendType; public bool isRepeat; public AttendReward[] rewards; [SerializeField] private string _endAt; public DateTime endAt; // Object->Json 변환시 자동 호출. public void OnBeforeSerialize() { _endAt = endAt.ToString(FormatString.DateTimeParse); } // Json->Object 변환시 자동 호출. public void OnAfterDeserialize() { if (!string.IsNullOrEmpty(_endAt)) endAt = DateTime.ParseExact(_endAt, FormatString.DateTimeParse, System.Globalization.CultureInfo.InvariantCulture); _endAt = null; } } [Serializable] public class cAttend : ISerializationCallbackReceiver { public int attendType; public int day; public int clearCnt; public DateTime attendAt; [SerializeField] private string _attendAt; public bool attend; // Object->Json 변환시 자동 호출. public void OnBeforeSerialize() { _attendAt = attendAt.ToString(FormatString.DateTimeParse); } // Json->Object 변환시 자동 호출. public void OnAfterDeserialize() { if (!string.IsNullOrEmpty(_attendAt)) attendAt = DateTime.ParseExact(_attendAt, FormatString.DateTimeParse, System.Globalization.CultureInfo.InvariantCulture); _attendAt = null; } } public class AttendTypeRequest { public int attendType; } public class AttendInfoReturn { public bool attend; public cAttend playAttend; public cGoodsData playCurrency; } #endregion #region Quest [Serializable] public class dQuest { public int id; public eCondition condType; public int condValue; public int day; public nReward[] rewards; } [Serializable] public class cQuestDaily { public int sid; public int cond; public int limitCnt; public int totalCnt; } [Serializable] public class cQuestEvent { public int sid; public int cond; public static cQuestEvent[] LocalDatas() { cQuestEvent[] datas = new cQuestEvent[6]; for (int i = 0; i < datas.Length; i++) { datas[i] = new cQuestEvent(); datas[i].sid = i + 1; datas[i].cond = 0; } return datas; } } [Serializable] public class cQuestAttend { public int day; [SerializeField] private string _attendAt; public DateTime attendAt; // Object->Json 변환시 자동 호출. public void OnBeforeSerialize() { _attendAt = attendAt.ToString(FormatString.DateTimeParse); } // Json->Object 변환시 자동 호출. public void OnAfterDeserialize() { if (!string.IsNullOrEmpty(_attendAt)) attendAt = DateTime.ParseExact(_attendAt, FormatString.DateTimeParse, System.Globalization.CultureInfo.InvariantCulture); _attendAt = null; } } [Serializable] public class cQuestRepeat { public int sid; public int totalCnt; } public class QuestDailyReturn { public cQuestDaily playQuestDaily; public cGoodsData playCurrency; } public class QuestRepeatReturn { public cQuestRepeat playQuestRepeat; public cGoodsData playCurrency; } public class QuestDailyAllReturn { public cQuestDaily[] playQuestDaily; public cGoodsData playCurrency; } public class QuestRepeatAllReturn { public cQuestRepeat[] playQuestRepeat; public cGoodsData playCurrency; } public class QuestEventReturn { public cQuestEvent playQuestEvent; public cGoodsData playCurrency; } public class QuestEventAllReturn { public cQuestEvent[] playQuestEvents; public cGoodsData playCurrency; } #endregion #region Mission public class cQuestMissionReturn { public cTotalRecord playRecordTotal; public cGoodsData playCurrency; } [Serializable] public class dMission { public int id; public eCondition condType; public int condValue; public nReward[] rewards; public eEventMoveType moveType; } #endregion #region Guardian [Serializable] public class nGuardianExtraReturn { public cGoodsData playCurrency; public cPlayGuardian playGuardian; } [Serializable] public class nGuardianGrowPost { public int guardianType; public int[] propertyTypes; public int[] propertyIds; public int[] propertyCnts; public void SetNewInt(int count) { propertyTypes = new int[count]; propertyIds = new int[count]; propertyCnts = new int[count]; } } [Serializable] public class nGuardianGrowReturn { public cPlayGuardian playGuardian; } #endregion #region Mask(Relic) [Serializable] public class dSysRelic { public int id; public int relicType; public int maxLv; public int abilityType; public int abilityValue; public int abilityValueInc; public int buyingCnt; public int buyingCntInc; } [Serializable] public class dSysRelicEnhanceProp { public int[] lv; public int[] props; } [Serializable] public class cPlayRelic { public int relicType; public int nextRelic; public int assistSid1; public int assistLv1; public int assistSid2; public int assistLv2; public int assistSid3; public int assistLv3; public int assistSid4; public int assistLv4; public int ancientSid; public int ancientLv; public bool have; } [Serializable] public class nMaskEnhancePost { public int relicType; public bool isUpgrade; } [Serializable] public class nMaskEnhanceReturn { public cPlayRelic playRelic; public cGoodsData playCurrency; } #endregion #region Pvp [Serializable] // 결투장 시스템 데이터. public class dPvp { public bool isOpen; public int bgId; public int timeout; public int pointClear; public int pointFail; public dPvpRew[] missions; public dPvpTier[] tier; } [Serializable] // 결투장 주간 보상 구조. public class dPvpRew : ISerializationCallbackReceiver { public int id; public int condValue; // 보상. public int rewardType; public int rewardId; [SerializeField] private string rewardCnt; public BigInteger rewardCount; // Object->Json 변환시 자동 호출. public void OnBeforeSerialize() { } // Json->Object 변환시 자동 호출. public void OnAfterDeserialize() { if (!string.IsNullOrEmpty(rewardCnt)) rewardCount = BigInteger.Parse(rewardCnt); else rewardCount = 0L; rewardCnt = null; } } [Serializable] // 결투장 티어 구조. public class dPvpTier : ISerializationCallbackReceiver { public int id; public int condValue; // 보상. public int rewardType; public int rewardId; [SerializeField] private string rewardCnt; public BigInteger rewardCount; public eEffectType abilityType1; public long abilityValue1; public eEffectType abilityType2; public long abilityValue2; public eEffectType abilityType3; public long abilityValue3; public eEffectType abilityType4; public long abilityValue4; // Object->Json 변환시 자동 호출. public void OnBeforeSerialize() { } // Json->Object 변환시 자동 호출. public void OnAfterDeserialize() { if (!string.IsNullOrEmpty(rewardCnt)) rewardCount = BigInteger.Parse(rewardCnt); else rewardCount = 0L; rewardCnt = null; } } [Serializable] // 결투장 랭킹 구조. public class dPvpRank { public int rank; public string userCode; public string playerName; public int playerIcon; public int playerLv; public int tier; public int point; // 적용중인 코스튬. public int costumeView; public int weaponView; public int colorHair; public int colorTop; public int colorEye; } [Serializable] // 결투장 플레이 데이터. public class cPvpPlay : ISerializationCallbackReceiver { public int point; public int rewardTier; public int rewardWeekly; public int ticket; public int weeklyTry; public int totalTry; public int weeklyClear; public int totalClear; public int weeklyFail; public int totalFail; public int usePreset; public int usePetPreset; public int useExtraPreset; [SerializeField] private string _refreshAt; public DateTime refreshAt; public int availWeeklyIndex; // calculate in client. // Object->Json 변환시 자동 호출. public void OnBeforeSerialize() { _refreshAt = refreshAt.ToString(FormatString.DateTimeParse); } // Json->Object 변환시 자동 호출. public void OnAfterDeserialize() { if (!string.IsNullOrEmpty(_refreshAt)) refreshAt = DateTime.ParseExact(_refreshAt, FormatString.DateTimeParse, System.Globalization.CultureInfo.InvariantCulture); _refreshAt = null; } } [Serializable] // 결투장 스펙 구조. public class dPvpSpec : ISerializationCallbackReceiver { static readonly int _maxAvailableSkillCount = 4; public int playerIcon; public int playerLv; public int weaponView; public int costumeView; public int colorHair; public int colorTop; public int colorEye; public float speed; public float move; public float criticalPower; public int criticalRate; public float skillDamage; [SerializeField] private string attack; public BigInteger charAtk; [SerializeField] private string hp; public BigInteger charHp; public int usePreset; public int usePetPreset; public int useExtraPreset; public int petMain; public int[] skillPreset = new int[_maxAvailableSkillCount]; public int[] skillLv = new int[_maxAvailableSkillCount]; public int[] skillAwaken = new int[_maxAvailableSkillCount]; // 클라이언트 계산. public float[] skillCool = new float[_maxAvailableSkillCount]; public void CalcSkillCool() { if (skillPreset is null) return; for (int i = 0; i < skillCool.Length; ++i) { if (skillPreset[i] < 0) continue; skillCool[i] = DataHandler.GetSkillCool(skillPreset[i], skillAwaken[i]); } } public static dPvpSpec GetMyBestSpec(int iskillpreset, int ipetpreset, int iextrapreset) { dPvpSpec data = new dPvpSpec(); data.playerIcon = DataHandler.PlayData.playerIcon; data.playerLv = DataHandler.PlayData.playerLv; data.weaponView = DataHandler.PlayEquipCostume.weaponId; data.costumeView = DataHandler.PlayEquipCostume.outfitId; data.colorHair = DataHandler.PlayEquipCostume.hairColor; data.colorTop = DataHandler.PlayEquipCostume.topColor; data.colorEye = DataHandler.PlayEquipCostume.eyeColor; BuffMgr buffbest = BuffMgr.CopyBuffMgr(BuffMgr.Instance); #region Gear int[] geartypes = new int[7] { cGoods.TBagWeapon, cGoods.TBagArmorCape, cGoods.TBagArmorHat, cGoods.TBagArmorShoes, cGoods.TBagAcceEar, cGoods.TBagAcceNeck, cGoods.TBagAcceRing }; for (int k = 0; k < geartypes.Length; k++) { int itype = geartypes[k]; // 보유한 최고 장비. int key = DataHandler.GetGearLastHaveId(itype); if (key < 0) continue; dGear gear = DataHandler.GetGearEquip(itype, key); // 장비 효과. if (gear.abilityType3 != eEffectType.None) { long ivalue = gear.abilityValue3 + ((gear.abilityValue3 * gear.abilityValueInc3 / dConst.RateDivideLong) * (gear.level - 1)); buffbest.SetGearEquip(itype, gear.abilityType3, ivalue, false); } if (gear.abilityType2 != eEffectType.None) { long ivalue = gear.abilityValue2 + ((gear.abilityValue2 * gear.abilityValueInc2 / dConst.RateDivideLong) * (gear.level - 1)); buffbest.SetGearEquip(itype, gear.abilityType2, ivalue, false); } if (gear.abilityType1 != eEffectType.None) { long ivalue = gear.abilityValue1 + ((gear.abilityValue1 * gear.abilityValueInc1 / dConst.RateDivideLong) * (gear.level - 1)); buffbest.SetGearEquip(itype, gear.abilityType1, ivalue, true); } // 장비 추가 효과 없음. if (gear.awaken <= 1 || gear.extraEffects == null) { buffbest.SetGearExtra(itype, 2, eEffectType.None, 0L, false); buffbest.SetGearExtra(itype, 1, eEffectType.None, 0L, false); buffbest.SetGearExtra(itype, 0, eEffectType.None, 0L, false); continue; } // 장비 추가 효과 적용. int[] extras = gear.extraEffects; for (int i = extras.Length - 1; i >= 0; i--) { if (extras[i] < 0) { buffbest.SetGearExtra(itype, i, eEffectType.None, 0L, false); } else { dExtraAbility ability = DataHandler.GetExtraAbility(extras[i]); buffbest.SetGearExtra(itype, i, ability.abilityType, ability.abilityValue, false); } } } #endregion Gear #region Extra data.useExtraPreset = iextrapreset; buffbest.AwakenReset(); for (int i = 0; i < 6; i++) { if (DataHandler.PlayAwaken.extras[iextrapreset][i] >= 0) { buffbest.ChangeAwakenStat( DataHandler.GetExtraAbility(DataHandler.PlayAwaken.extras[iextrapreset][i]).abilityType, DataHandler.GetExtraAbility(DataHandler.PlayAwaken.extras[iextrapreset][i]).abilityValue, false); } } #endregion Extra #region Pet data.usePetPreset = ipetpreset; data.petMain = DataHandler.PlayData.petPresets[ipetpreset][0]; for (int slotindex = 0; slotindex < 3; slotindex++) { int key = DataHandler.PlayData.petPresets[ipetpreset][slotindex]; if (key < 0) { buffbest.SetPetEquip(slotindex, eEffectType.None, 0L, eEffectType.None, 0L, eEffectType.None, 0L, slotindex == 2); buffbest.SetPetExtra(slotindex, 2, eEffectType.None, 0L, false); buffbest.SetPetExtra(slotindex, 1, eEffectType.None, 0L, false); buffbest.SetPetExtra(slotindex, 0, eEffectType.None, 0L, false); buffbest.SetPetExtra(slotindex, 3, eEffectType.None, 0L, false); continue; } dPet pet = DataHandler.GetPet(key); // 펫 장착 효과. int ilevel = pet.level - 1; buffbest.SetPetEquip(slotindex, pet.abilityType1, ilevel * pet.abilityValueInc1 + pet.abilityValue1, pet.abilityType2, ilevel * pet.abilityValueInc2 + pet.abilityValue2, pet.abilityType3, ilevel * pet.abilityValueInc3 + pet.abilityValue3, slotindex == 2); // 펫 추가 효과 없음. if (pet.awaken <= 1 || pet.extraEffects == null) { buffbest.SetPetExtra(slotindex, 2, eEffectType.None, 0L, false); buffbest.SetPetExtra(slotindex, 1, eEffectType.None, 0L, false); buffbest.SetPetExtra(slotindex, 0, eEffectType.None, 0L, false); buffbest.SetPetExtra(slotindex, 3, eEffectType.None, 0L, false); continue; } // 펫 추가 효과 있음. bool bopenoption = true; int[] extras = pet.extraEffects; for (int i = extras.Length - 1; i >= 0; i--) { if (extras[i] < 0) { buffbest.SetPetExtra(slotindex, i, eEffectType.None, 0L, false); bopenoption = false; } else { dExtraAbility ability = DataHandler.GetExtraAbility(extras[i]); buffbest.SetPetExtra(slotindex, i, ability.abilityType, ability.abilityValue, false); if (ability.rarity < cGoods.RLegend) bopenoption = false; } } // 옵션 보유 효과. if (bopenoption) buffbest.SetPetExtra(slotindex, extras.Length, pet.abilityTypeOption, pet.abilityValueOption, false); else buffbest.SetPetExtra(slotindex, extras.Length, eEffectType.None, 0L, false); } #endregion Pet #region Skill data.usePreset = iskillpreset; data.skillPreset = new int[4]; data.skillLv = new int[4]; data.skillAwaken = new int[4]; for (int i = 0; i < 4; i++) { data.skillPreset[i] = DataHandler.PlayData.skillPresets[iskillpreset][i]; dSkillActive skill = DataHandler.GetSkillActive(data.skillPreset[i]); if (skill == null) continue; data.skillLv[i] = skill.level; data.skillAwaken[i] = skill.awaken; } #endregion Skill buffbest.CalcAllStat(); buffbest.CalcBattlePower(); data.speed = buffbest.GetCharSpd(); data.move = buffbest.GetCharMov(); data.criticalPower = buffbest.GetCharCrtDam(); data.criticalRate = buffbest.GetCharCrtRate(); data.skillDamage = buffbest.GetSkillDamage(); data.charAtk = buffbest.GetCharAtkExcAd(); data.charHp = buffbest.GetCharHp(); data.CalcSkillCool(); return data; } // Object->Json 변환시 자동 호출. public void OnBeforeSerialize() { attack = charAtk.ToString(); hp = charHp.ToString(); } // Json->Object 변환시 자동 호출. public void OnAfterDeserialize() { if (!string.IsNullOrEmpty(attack)) { charAtk = BigInteger.Parse(attack); attack = null; } if (!string.IsNullOrEmpty(hp)) { charHp = BigInteger.Parse(hp); hp = null; } } } [Serializable] // 결투장 랭킹. public class nPvpRank { public dPvpRank myRank; public dPvpRank[] topRank; } [Serializable] // 결투장 입장. public class nPvpJoinReturn { public cPvpPlay playPvp; public int vsUserId; public dPvpSpec battleInfo; public dPvpSpec vsBattleInfo; public dPvpRank vsRank; } [Serializable] // 결투장 결과 전송. public class nPvpBattleRequest : ISerializationCallbackReceiver { // 상대 유저 ID. public int vsUserId; // 전투 결과. 1: 승리, 2: 패배. public int battleResult; // 내가 상대에게 준 데미지 비율. public int damageRatio; // 상대가 나에게 준 데미지 비율. public int vsDamageRatio; // 내가 상대에게 준 총 데미지. [SerializeField] private string battleDamage; public BigInteger battleDmg; // 상대가 나에게 준 총 데미지. [SerializeField] private string vsBattleDamage; public BigInteger vsBattleDmg; // Object->Json 변환시 자동 호출. public void OnBeforeSerialize() { battleDamage = battleDmg.ToString(); vsBattleDamage = vsBattleDmg.ToString(); } // Json->Object 변환시 자동 호출. public void OnAfterDeserialize() { if (!string.IsNullOrEmpty(battleDamage)) battleDmg = BigInteger.Parse(battleDamage); else battleDmg = 0L; battleDamage = null; if (!string.IsNullOrEmpty(vsBattleDamage)) vsBattleDmg = BigInteger.Parse(vsBattleDamage); else vsBattleDmg = 0L; vsBattleDamage = null; } } [Serializable] // 결투장 결과. public class nPvpBattleReturn { public cPvpPlay playPvp; public dPvpRank rankPvp; } [Serializable] // 결투장 보상 수령. public class nPvpRewReturn { public cPvpPlay playPvp; public cGoodsData playCurrency; public nGoods[] result; } #endregion Pvp #region Notice [Serializable] public class dNotice : ISerializationCallbackReceiver { public int id; public int noticeType; public string titleEN; public string titleKR; public string titleJP; //public string titleES; //public string titlePT; //public string titleDE; //public string titleFR; //public string titleIT; //public string titleRU; //public string titleIN; //public string titleCN; //public string titleTW; public string contentEN; public string contentKR; public string contentJP; //public string contentES; //public string contentPT; //public string contentDE; //public string contentFR; //public string contentIT; //public string contentRU; //public string contentIN; //public string contentCN; //public string contentTW; [SerializeField] private string _startAt; public DateTime startAt; [SerializeField] private string _endAt; public DateTime endAt; public void OnBeforeSerialize() { _startAt = startAt.ToString(FormatString.DateTimeParse); _endAt = endAt.ToString(FormatString.DateTimeParse); } public void OnAfterDeserialize() { if (!string.IsNullOrEmpty(_startAt)) startAt = DateTime.ParseExact(_startAt, FormatString.DateTimeParse, System.Globalization.CultureInfo.InvariantCulture); _startAt = null; if (!string.IsNullOrEmpty(_endAt)) endAt = DateTime.ParseExact(_endAt, FormatString.DateTimeParse, System.Globalization.CultureInfo.InvariantCulture); _endAt = null; } public string GetTitle() { SystemLanguage lang = SingleMgr.GetSavedLanguage(); switch (lang) { case SystemLanguage.Korean: return titleKR; case SystemLanguage.Japanese: return titleJP; //case SystemLanguage.Spanish: //case SystemLanguage.German: //case SystemLanguage.French: //case SystemLanguage.Russian: //case SystemLanguage.Chinese: //case SystemLanguage.ChineseSimplified: //case SystemLanguage.ChineseTraditional: default: return titleEN; } } public string GetMsg() { SystemLanguage lang = SingleMgr.GetSavedLanguage(); switch (lang) { case SystemLanguage.Korean: return contentKR; case SystemLanguage.Japanese: return contentJP; //case SystemLanguage.Spanish: //case SystemLanguage.German: //case SystemLanguage.French: //case SystemLanguage.Russian: //case SystemLanguage.Chinese: //case SystemLanguage.ChineseSimplified: //case SystemLanguage.ChineseTraditional: default: return contentEN; } } } [Serializable] public class dNoticeDatas { public dNotice[] sysNotice; } [Serializable] public class dChatNotice { public string contentEN; public string contentKR; public string contentJP; //public string contentES; //public string contentPT; //public string contentDE; //public string contentFR; //public string contentIT; //public string contentRU; //public string contentIN; //public string contentCN; //public string contentTW; public string GetMsg() { SystemLanguage lang = SingleMgr.GetSavedLanguage(); switch (lang) { case SystemLanguage.Korean: return contentKR; case SystemLanguage.Japanese: return contentJP; //case SystemLanguage.Spanish: //case SystemLanguage.German: //case SystemLanguage.French: //case SystemLanguage.Russian: //case SystemLanguage.Chinese: //case SystemLanguage.ChineseSimplified: //case SystemLanguage.ChineseTraditional: default: return contentEN; } } } [Serializable] public class dChatNoticeDatas { public dChatNotice[] sysNoticeChat; } #endregion Notice // 범용 통신. #region Common // 범용 문자열 ID. [Serializable] public class nIdStr { public string id; public nIdStr() { } public nIdStr(string strid) { this.id = strid; } } [Serializable] public class nIdCnts { public int[] sid; public int[] cnt; public nIdCnts() { } public nIdCnts(int[] _iid) { sid = _iid; } public nIdCnts(int[] _iid, int[] _cnt) { sid = _iid; cnt = _cnt; } } // 범용 ID, 레벨. [Serializable] public class nIdLv { public int sid; public int lv; public nIdLv() { } public nIdLv(int iid) { sid = iid; } public nIdLv(int iid, int ilv) { sid = iid; lv = ilv; } public static nIdLv[] LocalDatas(int ilen) { nIdLv[] datas = new nIdLv[ilen]; for (int i = 0; i < datas.Length; i++) { datas[i] = new nIdLv(i + 1, UnityEngine.Random.Range(0, 55)); } return datas; } public static nIdLv[] LocalCharLvPoints() { nIdLv[] datas = new nIdLv[8]; for (int i = 0; i < datas.Length; i++) { datas[i] = new nIdLv(i + 1, ES3.Load((i + 1).ToString(), 1)); } return datas; } } // 범용 long ID, 레벨. [Serializable] public class nIdlLv { public long sid; public int lv; public nIdlLv() { } public nIdlLv(long iid) { this.sid = iid; } public nIdlLv(long iid, int ilv) { this.sid = iid; this.lv = ilv; } } // 범용 ID, 소지, 레벨, 수량, 각성. [Serializable] public class nIdLvInfo { public int sid; public bool have; public int cnt; public int lv; public int awaken; public int[] extras; public nIdLvInfo() { } public nIdLvInfo(int iid) { this.sid = iid; this.lv = 1; } public nIdLvInfo(int iid, int icnt) { this.sid = iid; this.have = icnt > 0; this.lv = 1; this.cnt = icnt; } public nIdLvInfo(int iid, bool bhave, int icnt) { this.sid = iid; this.have = bhave; this.awaken = 1; if (bhave) { this.lv = 1; this.cnt = icnt; } else { this.lv = 0; this.cnt = 0; } this.extras = new int[3] { -1, -1, -1 }; } public static nIdLvInfo[] LocalDatas(int ilen) { nIdLvInfo[] datas = new nIdLvInfo[ilen]; for (int i = 0; i < datas.Length; i++) { datas[i] = new nIdLvInfo(i + 1, UnityEngine.Random.Range(0, 2) == 1, UnityEngine.Random.Range(1, 20)); } return datas; } } // 범용 ID, 수량. [Serializable] public class nIdCnt { public int sid; public int cnt; public nIdCnt() { } public nIdCnt(int iid) { this.sid = iid; } public nIdCnt(int iid, int icnt) { this.sid = iid; this.cnt = icnt; } } // 범용 구매, 교환, 이벤트. [Serializable] public class nIdBuyCnt { public int sid; public int buyCnt; //trade public int cnt; //raise public int cond; //roulette public nIdBuyCnt() { } public nIdBuyCnt(int iid, int ibuycnt) { this.sid = iid; this.buyCnt = ibuycnt; } } [Serializable] public class nIdSlot { public int sid; public int slot; public int type; public nIdSlot() { } public nIdSlot(int iid, int islot) { this.sid = iid; this.slot = islot; } } // 범용 ID, 보유. [Serializable] public class nIdHave { public int sid; public bool have; public nIdHave() { } public nIdHave(int iid) { this.sid = iid; } public nIdHave(int iid, bool bhave) { this.sid = iid; this.have = bhave; } public static nIdHave[] LocalDatas(int ilen) { nIdHave[] datas = new nIdHave[ilen]; for (int i = 0; i < datas.Length; i++) { datas[i] = new nIdHave(i + 1, i < 5 || UnityEngine.Random.Range(0, 2) == 1); } return datas; } } // 범용 레벨별 확률. [Serializable] public class nProps { public int[] lv; public int[] props; } public class nAchivement { // eContentType 획득 컨텐츠 분류 // eCondition 획득 방법 public eContentType contentType; public eCondition condition; public int id; public int condValue; public nAchivement() { } public nAchivement(eContentType type, eCondition cond, int ivalue, int iid) { contentType = type; condition = cond; condValue = ivalue; id = iid; } public nAchivement(dQuest quest, eContentType content) { contentType = content; condition = quest.condType; condValue = quest.condValue; id = quest.id; } public nAchivement(dTitle title) { contentType = eContentType.Title; condition = title.condType; condValue = title.condValue; id = title.id; } public nAchivement(dIcon icon) { contentType = eContentType.Icon; condition = icon.condType; condValue = icon.condValue; id = icon.id; } public nAchivement(dMission mission) { contentType = eContentType.QuestMission; condition = mission.condType; condValue = mission.condValue; id = mission.id; } } [Serializable] public class nIdGuaardianSlot { public int guardianType; public int slot; public nIdGuaardianSlot(int iid, int islot) { this.guardianType = iid; this.slot = islot; } } // 재화/아이템. [Serializable] public class nGoods : ISerializationCallbackReceiver { public int propertyType; public int propertyId; [SerializeField] protected string propertyCnt; public BigInteger propertyCount; public nGoods() { } public nGoods(GoodsProperty property, BigInteger count) { propertyType = (int)property.type; propertyId = (int)property.id; propertyCount = count; } public nGoods(int itype, int icode, BigInteger icnt) { propertyType = itype; propertyId = icode; propertyCount = icnt; } public nGoods(nReward reward) { propertyType = reward.rewardType; propertyId = reward.rewardId; propertyCount = reward.rewardCount; } // Object->Json 변환시 자동 호출. public void OnBeforeSerialize() { if (propertyCount != null) propertyCnt = propertyCount.ToString(); } // Json->Object 변환시 자동 호출. public void OnAfterDeserialize() { if (!string.IsNullOrEmpty(propertyCnt)) propertyCount = BigInteger.Parse(propertyCnt); else propertyCount = 0L; propertyCnt = null; } public GoodsProperty GetProperty() { return new GoodsProperty { type = (GoodsType)propertyType, id = (GoodsID)propertyId }; } } [Serializable] public struct GoodsProperty { public GoodsType type; public GoodsID id; } public class GoodsPropertyComparer : IEqualityComparer { public bool Equals(GoodsProperty x, GoodsProperty y) { return x.type == y.type && x.id == y.id; } public int GetHashCode(GoodsProperty obj) { return obj.type.GetHashCode() + obj.id.GetHashCode(); } } // 재화/아이템. [Serializable] public class nReward : ISerializationCallbackReceiver { public int rewardType; public int rewardId; [SerializeField] private string rewardCnt; public BigInteger rewardCount { get; set; } public nReward() { } public nReward(int itype, int icode, BigInteger icnt) { this.rewardType = itype; this.rewardId = icode; this.rewardCount = icnt; } // Object->Json 변환시 자동 호출. public void OnBeforeSerialize() { if (rewardCount != null) rewardCnt = rewardCount.ToString(); } // Json->Object 변환시 자동 호출. public void OnAfterDeserialize() { if (!string.IsNullOrEmpty(rewardCnt)) rewardCount = BigInteger.Parse(rewardCnt); else rewardCount = 0L; rewardCnt = null; } public override string ToString() => FormatString.GetRewardType(rewardType, rewardId); } [Serializable] public class nRewardLimit : nReward { public int id; public int limitCnt; public int cnt; public int price; public int prop; public nRewardLimit() { } public nRewardLimit(int itype, int icode, BigInteger icnt) { this.rewardType = itype; this.rewardId = icode; this.rewardCount = icnt; } } // 재화/아이템 목록. [Serializable] public class nGoodsGet { public cPlayData playUser; public cGoodsData playCurrency; public nGoods[] result; } // 강화 결과. [Serializable] public class nLvUp { public cPlayData playUser; public cGoodsData playCurrency; public nIdLvInfo result; } // 범용 희귀도. [Serializable] public class nRarity { public int rarity; public nRarity() { } public nRarity(int irarity) { this.rarity = irarity; } public nRarity(fRangeRarity irarity) { this.rarity = (int)irarity; } } //범용 난이도 [Serializable] public class nDiffs : ISerializationCallbackReceiver { public int id; public string hp; public BigInteger monHp; public int hpInc; public string atk; public BigInteger monAtk; public nReward[] rewards; public void OnAfterDeserialize() { if (!string.IsNullOrEmpty(hp)) monHp = BigInteger.Parse(hp); else monHp = 0L; hp = null; if (!string.IsNullOrEmpty(atk)) monAtk = BigInteger.Parse(atk); else monAtk = 0L; atk = null; } public void OnBeforeSerialize() { if(monHp != null) hp = monHp.ToString(); if(monAtk != null) atk = monAtk.ToString(); } } #endregion Common // 범용 통신 - 서버 요청 및 응답. #region Common Request & Return // 범용 레벨업. [Serializable] public class nIdEnhance { public int sid; public int befLv; public int aftLv; public int befCnt; public int aftCnt; public int tryCount; public int useGoods; public nIdEnhance(int iid, int ibeflv) { this.sid = iid; this.befLv = ibeflv; this.aftLv = ibeflv; } public nIdEnhance(int iid, int ibeflv, int ibefcnt) { this.sid = iid; this.befLv = ibeflv; this.aftLv = ibeflv; this.befCnt = ibefcnt; this.aftCnt = ibefcnt; } } // 범용 희귀도별 확률. [Serializable] public class dExtraRarity { public int id; public int rarity; public int prop; public static dExtraRarity[] LocalDatas() { dExtraRarity[] datas = new dExtraRarity[7]; for (int i = 0; i < datas.Length; i++) { datas[i] = new dExtraRarity(); datas[i].id = i + 1; datas[i].rarity = i + 1; } datas[0].prop = 600000; datas[1].prop = 300000; datas[2].prop = 72000; datas[3].prop = 20000; datas[4].prop = 5000; datas[5].prop = 3000; datas[6].prop = 1000; return datas; } } // 범용 효과. [Serializable] public class dExtraAbility { public int id; public int rarity; public eEffectType abilityType; public int abilityValue; public int abilityInc; public static dExtraAbility[] LocalDatas() { dExtraAbility[] datas = new dExtraAbility[35]; for (int i = 0; i < datas.Length / 5; i++) { for (int j = 0; j < 5; j++) { datas[(i * 5) + j] = new dExtraAbility(); datas[(i * 5) + j].id = i * 5 + j + 1; datas[(i * 5) + j].rarity = i + 1; datas[(i * 5) + j].abilityType = (eEffectType)(j + 3); datas[(i * 5) + j].abilityValue = (i + 1) * 10000; datas[(i * 5) + j].abilityInc = 0; } } return datas; } } // 범용 각성 정보. [Serializable] public class dAwaken { public int maxLv; // 각성에 필요한 장비. // 장비 각성은 해당 장비, 이전 장비1, 이전 장비2. // 스킬 각성은 스킬과 같은 등급의 모자, 망토, 신발. 각성 단계에 따라 2성, 3성, 4성이 필요. public int buyingCnt1; public int buyingCnt2; public int buyingCnt3; public int AwakenStoneCnt; // 스킬 각성 단계에 따른 쿨 감소. public int coolTimeDec; } // 범용 레벨 총합별 값. [Serializable] public class dTotalLvValue { public int totalLv; public int value; } #endregion Common Request & Return // 기타. #region Etc. // 범용 ID, 레벨. [Serializable] public class nToken { public string accessToken; public int server; public nToken(string strtoken) { this.accessToken = strtoken; } public nToken(string strtoken, int iserver) { this.accessToken = strtoken; this.server = iserver; } } // 쿠폰. [Serializable] public class nCoupon { public string code; public nCoupon(string strcode) { this.code = strcode; } } // 어드레서블 관리. public class jAddrCnt { public bool isLoading = true; public int loadCnt = 0; public AsyncOperationHandle handle; } [Serializable] public class nNameChangeReturn { public cPlayData playUser; public cGoodsData playCurrency; public cTotalRecord playRecordTotal; //public nGoods[] result; } #endregion Etc. #region Chat [Serializable] public class BlockUser { public string UserId; public string PlayerName; public BlockUser() { } public BlockUser(string uid, string strname) { UserId = uid; PlayerName = strname; } } [Serializable] public class BlockUsers { public BlockUser[] items; public BlockUsers() { } public BlockUsers(BlockUser[] values) { items = values; } } #endregion Chat #region Trip & Life public class dTrip { public int id; public int idx; public int tripPieceCount; public bool[] islock = null; public string txt; public static dTrip[][] LocalDatas() { dTrip[][] datas = new dTrip[DataHandler.Const.TripChapterMaxsize][]; for (int i = 0; i < datas.Length; i++) { datas[i] = new dTrip[DataHandler.Const.TripMaxsize]; for (int j = 0; j< datas[i].Length; j++) { datas[i][j] = new dTrip(); datas[i][j].id = i; datas[i][j].idx = j; datas[i][j].tripPieceCount = 0; datas[i][j].islock = new bool[DataHandler.Const.TripPieceMaxsize]; datas[i][j].txt = LocalizationText.GetText("diary_trip" + (i+1) + "_" + (j+1)); for (int k = 0; k < DataHandler.Const.TripPieceMaxsize; k++) { datas[i][j].islock[k] = false; } } } return datas; } } public class dLife { public int id; public int idx; public int lifePieceCount; public bool[] islock = null; public string txt; public static dLife[][] LocalDatas() { dLife[][] datas = new dLife[DataHandler.Const.LifeChapterMaxsize][]; for (int i = 0; i < datas.Length; i++) { datas[i] = new dLife[DataHandler.Const.LifeMaxsize]; for (int j = 0; j < datas[i].Length; j++) { datas[i][j] = new dLife(); datas[i][j].id = i; datas[i][j].idx = j; datas[i][j].lifePieceCount = 0; datas[i][j].islock = new bool[DataHandler.Const.LifePieceMaxsize]; datas[i][j].txt = LocalizationText.GetText("diary_life" + (i + 1) + "_" + (j + 1)); for (int k = 0; k < DataHandler.Const.LifePieceMaxsize; k++) { datas[i][j].islock[k] = false; } } } return datas; } } #endregion #region Json Utility [Serializable] // List public class Serialization { [SerializeField] List items; public List ToList() { return items; } public Serialization(List items) { this.items = items; } public Serialization(T[] items) { this.items = new List(items); } } [Serializable] // Dictionary public class Serialization : ISerializationCallbackReceiver { [SerializeField] TKey[] keys; [SerializeField] TValue[] values; Dictionary items; public Dictionary ToDictionary() { return items; } public Serialization(Dictionary items) { this.items = items; } public void OnBeforeSerialize() { keys = new List(items.Keys).ToArray(); values = new List(items.Values).ToArray(); } public void OnAfterDeserialize() { int count = Math.Min(keys.Length, values.Length); items = new Dictionary(count); for (int i = 0; i < count; ++i) { if (!items.ContainsKey(keys[i])) items.Add(keys[i], values[i]); } } } #endregion Json Utility }