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; public const int CBgmBase = 1; #endregion Cos Code #region Pass Code public const int PassTypeRepeat = 0; public const int PassTypeOne = 1; public const int PassTypeEvent = 2; //public const int PMonster = 1; //public const int PLevel = 2; //public const int PStage = 3; #endregion Pass Code #region Box Code public const int CBoxGeneralStart = 1; public const int CBoxPetStart = 100; public const int CBoxDiary = 200; //public const int CBoxIris = 300; //public const int CBoxColorStart = 301; 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 : ISerializationCallbackReceiver { #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 Dungeon & Monster #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 public static dConst LocalData() { return new dConst(); } // Object->Json 변환시 자동 호출. public void OnBeforeSerialize() { } // Json->Object 변환시 자동 호출. public void OnAfterDeserialize() { } } [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; //### 이하 수정/추가 필요. //public dBgm[] sysBgm; } #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); } else { gold = 0L; } _gold = null; if (!string.IsNullOrEmpty(_goldUsed)) { goldUsed = BigInteger.Parse(_goldUsed); } else { goldUsed = 0L; } _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 { int monsterKill; int playTime; public RequestRecrod(int imonkill, int itime) { monsterKill = imonkill; playTime = itime; } } [Serializable] public class RecordReturn { cDailyRecord playRecordDaily; cTotalRecord playRecordTotal; } [Serializable] public class cTotalRecord { public const string PrefsKey = "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; public static cTotalRecord LocalData() { cTotalRecord data = new cTotalRecord(); data.attendCnt = 0; data.monsterKill = 0; data.gachaWeaponCnt = 0; data.gachaArmorCnt = 0; data.gachaAccCnt = 0; data.gachaTreasureCnt = 0; data.composeWeaponCnt = 0; data.composeArmorCnt = 0; data.composeAccCnt = 0; data.enhanceGoldAtk = 0; data.enhanceGoldHp = 0; data.clearDailyQuest = 0; data.playTime = 0; data.missionLv = 0; data.missionProgress = 0; data.composeIris = 0; return data; } public void Save() { //OnBeforeSerialize(); ES3.Save(PrefsKey, this, Global.ES3_PlayRecord); } public static cTotalRecord Load(cTotalRecord prevData) { if (!ES3.KeyExists(PrefsKey, Global.ES3_PlayRecord)) if (prevData != null) { ES3.Save(PrefsKey, prevData, Global.ES3_PlayRecord); } else { ES3.Save(PrefsKey, new cTotalRecord(), Global.ES3_PlayRecord); } cTotalRecord data = ES3.Load(PrefsKey, Global.ES3_PlayRecord); //data.OnAfterDeserialize(); return data; } } [Serializable] public class cDailyRecord { public const string PrefsKey = "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; public static cDailyRecord LocalData() { cDailyRecord data = new cDailyRecord(); data.attendCnt = 0; data.monsterKill = 0; data.gachaWeaponCnt = 0; data.gachaArmorCnt = 0; data.gachaAccCnt = 0; data.gachaTreasureCnt = 0; data.composeWeaponCnt = 0; data.composeArmorCnt = 0; data.composeAccCnt = 0; data.enhanceGoldAtk = 0; data.enhanceGoldHp = 0; data.clearDailyQuest = 0; data.playTime = 0; return data; } public void Save() { //OnBeforeSerialize(); ES3.Save(PrefsKey, this, Global.ES3_PlayRecord); } public static cDailyRecord Load(cDailyRecord prevData) { if (!ES3.KeyExists(PrefsKey, Global.ES3_PlayRecord)) if (prevData != null) { ES3.Save(PrefsKey, prevData, Global.ES3_PlayRecord); } else { ES3.Save(PrefsKey, new cDailyRecord(), Global.ES3_PlayRecord); } cDailyRecord data = ES3.Load(PrefsKey, Global.ES3_PlayRecord); //data.OnAfterDeserialize(); return data; } } #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; public BigInteger hp; [SerializeField] protected string _hp; //public int hpInc = 1; public BigInteger atk; [SerializeField] protected string _atk; //public int atkInc = 1; public int normalBox; public int normalBoxCnt; public int gearBox; public int gearBoxCnt; public int accBox; public int accBoxCnt; public int petBox; public int petBoxCnt; public BigInteger gold; [SerializeField] protected string _gold; //public BigInteger goldInc; //[SerializeField] protected string _goldInc; public BigInteger exp; [SerializeField] protected string _exp; //public BigInteger expInc; //[SerializeField] protected string _expInc; public int wave; //public dAreaReward[] rewards; public static dArea[] LocalDatas() { dArea[] datas = new dArea[30]; for (int i = 0; i < datas.Length; i++) { datas[i] = new dArea(); datas[i].id = i + 1; datas[i].wave = UnityEngine.Random.Range(3, 6); datas[i].atk = i * 50; //datas[i].atkInc = 1; datas[i].hp = datas[i].atk; //datas[i].hpInc = 1; datas[i].gold = datas[i].id * 5; //datas[i].goldInc = 0; datas[i].exp = i * 10; //datas[i].expInc = 0; //datas[i].rewards = new dAreaReward[5]; //datas[i].rewards[0] = new dAreaReward(1, cGoods.TBox, 1, 1, 500000); //datas[i].rewards[1] = new dAreaReward(2, cGoods.TBox, 100, 1, 500000); //datas[i].rewards[2] = new dAreaReward(3, cGoods.TBox, 200, 1, 500000); //datas[i].rewards[3] = new dAreaReward(4, cGoods.TBox, 300, 1, 500000); //datas[i].rewards[4] = new dAreaReward(5, cGoods.TBox, 301, 1, 500000); int itype = i % 5; int bgRepeat = i % 2; datas[i].bgId = bgRepeat + 1; if (itype == 0) { datas[i].monsterNormal = new int[2] { 1, 3 }; datas[i].monsterEpic = new int[2] { 5, 7 }; } else if (itype == 1) { datas[i].monsterNormal = new int[2] { 2, 4 }; datas[i].monsterEpic = new int[2] { 6, 8 }; } else if (itype == 2) { datas[i].monsterNormal = new int[2] { 2, 3 }; datas[i].monsterEpic = new int[2] { 5, 8 }; } else if (itype == 3) { datas[i].monsterNormal = new int[2] { 1, 4 }; datas[i].monsterEpic = new int[2] { 6, 7 }; } else { datas[i].monsterNormal = new int[2] { 1, 2 }; datas[i].monsterEpic = new int[2] { 7, 8 }; } datas[i].monsterBoss = new int[1] { 9 }; } return datas; } // 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 dAreaReward { public int id; public int rewardType; public int rewardId; public int rewardCnt; public int rewardProp; public dAreaReward(int iid, int rewtype, int rewid, int rewcnt, int rewprop) { id = iid; rewardType = rewtype; rewardId = rewid; rewardCnt = rewcnt; rewardProp = rewprop; } } [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; public static dMonster[] LocalDatas() { dMonster[] datas = new dMonster[9]; for (int i = 0; i < datas.Length; i++) { datas[i] = new dMonster(); datas[i].id = i + 1; //datas[i].name = FormatString.StringFormat("mon{0:000000}", datas[i].id); } datas[0].path = "starfish"; datas[0].speed = 2; datas[1].path = "starfish2"; datas[1].speed = 2; datas[2].path = "hermitcrab"; datas[2].speed = 4; datas[3].path = "hermitcrab2"; datas[3].speed = 4; datas[4].path = "sunfish"; datas[4].speed = 6; datas[5].path = "sunfish2"; datas[5].speed = 6; datas[6].path = "coralking"; datas[6].speed = 3; datas[7].path = "coralking2"; datas[7].speed = 3; datas[8].path = "shark"; datas[0].speed = 7; return datas; } } [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 static dBg[] LocalBg() { dBg[] datas = new dBg[2]; for (int i = 0; i < datas.Length; i++) { datas[i] = new dBg(); datas[i].id = i + 1; } datas[0].path = "bg_1area"; datas[0].globalLight = new int[4] { 107, 141, 173, 255 }; datas[0].charLight = new int[4] { 116, 156, 159, 255 }; datas[0].bgEffect = eBgEffect.BubbleWhite; datas[1].path = "bg_2area"; datas[1].globalLight = new int[4] { 106, 99, 144, 255 }; datas[1].charLight = new int[4] { 118, 203, 214, 255 }; datas[1].bgEffect = eBgEffect.BubbleBlue; /* datas[2].path = "bg_3area"; datas[2].globalLight = new int[3] { 255, 255, 255 }; datas[2].charLight = new int[3] { 0, 0, 0 }; datas[2].bgEffect = eBgEffect.LeafGreen; datas[3].path = "bg_4area"; datas[3].globalLight = new int[3] { 106, 140, 164 }; datas[3].charLight = new int[3] { 159, 153, 88 }; datas[3].bgEffect = eBgEffect.LightYellow; datas[4].path = "bg_3area"; datas[4].globalLight = new int[3] { 222, 239, 227 }; datas[4].charLight = new int[3] { 47, 51, 46 }; datas[4].bgEffect = eBgEffect.RainWhite; //datas[4].path = "bg_2area"; //datas[4].globalLight = new int[3] { 144, 66, 89 }; //datas[4].charLight = new int[3] { 173, 158, 168 }; //datas[4].bgEffect = eBgEffect.RainWhite; */ return datas; } } public enum BGM { intro=1, stage, goldDg, enhanceDg, petDg, awakenStoneDg, awakenDg, guardian, pvp = 9 } [Serializable] public class dBgm { public int id; public string path; public static dBgm[] LocalBgm() { dBgm[] datas = new dBgm[9]; for (int i = 0; i < datas.Length; i++) { datas[i] = new dBgm(); datas[i].id = i + 1; } datas[0].path = "intro";// 인트로 datas[1].path = "stage";// 스테이지 datas[2].path = "gold";// 골드던전 datas[3].path = "reinstone";// 강화석 던전 datas[4].path = "pet";// 펫 던전 datas[5].path = "awakenstone";//각성석 던전 datas[6].path = "awaken"; // 각성 던전 datas[7].path = "guardian"; // 로봇 던전 datas[8].path = "pvp"; // pvp return datas; } } #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; public Color realColor; [SerializeField] protected int[] color; // 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 static dCharStat[] LocalLvPoints() { dCharStat[] datas = new dCharStat[8]; for (int i = 0; i < datas.Length; i++) { datas[i] = new dCharStat(); datas[i].id = i + 1; datas[i].sid = i + 1; } datas[0].abilityType = eEffectType.AtkBase; datas[0].maxLv = 100; datas[0].abilityValue = 0; datas[0].abilityValueInc = 10; datas[0].buyingCount = 1; datas[0].buyingCntInc = 0; datas[1].abilityType = eEffectType.HpBase; datas[1].maxLv = 100; datas[1].abilityValue = 0; datas[1].abilityValueInc = 50; datas[1].buyingCount = 1; datas[1].buyingCntInc = 0; datas[2].abilityType = eEffectType.Mov; datas[2].maxLv = 100; datas[2].abilityValue = 990000; datas[2].abilityValueInc = 10000; datas[2].buyingCount = 1; datas[2].buyingCntInc = 0; datas[4].abilityType = eEffectType.Spd; datas[4].maxLv = 100; datas[4].abilityValue = 990000; datas[4].abilityValueInc = 10000; datas[4].buyingCount = 1; datas[4].buyingCntInc = 0; datas[5].abilityType = eEffectType.GoldDropRate; datas[5].maxLv = 100; datas[5].abilityValue = 990000; datas[5].abilityValueInc = 10000; datas[5].buyingCount = 1; datas[5].buyingCntInc = 0; datas[6].abilityType = eEffectType.ExpDropRate; datas[6].maxLv = 100; datas[6].abilityValue = 990000; datas[6].abilityValueInc = 10000; datas[6].buyingCount = 1; datas[6].buyingCntInc = 0; datas[7].abilityType = eEffectType.ChestDropRate; datas[7].maxLv = 100; datas[7].abilityValue = 990000; datas[7].abilityValueInc = 10000; datas[7].buyingCount = 1; datas[7].buyingCntInc = 0; return datas; } 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; public static dSysGuardian[] LocalDatas() { dSysGuardian[] data = new dSysGuardian[1]; return data; } } [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; public int buyingCount; [SerializeField] protected string buyingCnt; public int buyingCountInc; [SerializeField] protected string buyingCntInc; 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; public static dPet[] LocalDatas() { dPet[] datas = new dPet[46]; for (int i = 0; i < datas.Length; i++) { datas[i] = new dPet(); datas[i].id = i + 1; datas[i].rarity = i / 8 + 1; if (datas[i].rarity > cGoods.RMyth) datas[i].rarity = cGoods.RMyth; datas[i].maxAwaken = 4; int irarity = datas[i].rarity; datas[i].buyingCount = 20 * irarity; datas[i].buyingCountInc = 10 * irarity; datas[i].abilityTypeOption = eEffectType.AtkBuff; datas[i].abilityValueOption = 10000 * irarity; datas[i].abilityType1 = (eEffectType)UnityEngine.Random.Range((int)eEffectType.AtkBase, (int)eEffectType.HpBase + 1); datas[i].abilityValue1 = 1 * irarity; datas[i].abilityValueInc1 = 1 * irarity; if (datas[i].rarity >= cGoods.RUnique) { datas[i].abilityType2 = (eEffectType)UnityEngine.Random.Range((int)eEffectType.Mov, (int)eEffectType.CrtRate + 1); datas[i].abilityValue2 = 5000 * irarity; datas[i].abilityValueInc2 = 5000 * irarity; } else { datas[i].abilityType2 = eEffectType.None; } if (datas[i].rarity >= cGoods.RLegend) { datas[i].abilityType3 = (eEffectType)UnityEngine.Random.Range((int)eEffectType.AtkBuff, (int)eEffectType.HpBuff + 1); datas[i].abilityValue3 = 3000 * irarity; datas[i].abilityValueInc3 = 3000 * irarity; } else { datas[i].abilityType3 = eEffectType.None; } } return datas; } // 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 lv; // 현재 레벨 달성에 필요한 횟수. public int cnt; // 현재 레벨 희귀도별 확률. 0:일반, 1:레어, 2:에픽, 3:유니크, 4:전설, 5:영웅. public int[] props; // 현재 레벨 달성 보상. public int rewardType; public int rewardId; public BigInteger rewardCount; [SerializeField] protected string rewardCnt; public static dGachaLevel[] LocalDatas() { dGachaLevel[] datas = new dGachaLevel[10]; for (int i = 0; i < datas.Length; i++) { datas[i] = new dGachaLevel(); //datas[i].level = i + 1; datas[i].cnt = i * 200; if (i < 2) datas[i].props = new int[6] { 500000, 300000, 299900, 100, 0, 0 }; else if (i < 4) datas[i].props = new int[6] { 400000, 300000, 200000, 99900, 100, 0 }; else if (i < 6) datas[i].props = new int[6] { 300000, 350000, 250000, 99000, 1000, 0 }; else if (i < 8) datas[i].props = new int[6] { 300000, 300000, 300000, 90000, 9900, 100 }; else datas[i].props = new int[6] { 200000, 300000, 400000, 90000, 9000, 1000 }; if (i == 0) { datas[i].rewardType = cGoods.TNone; continue; } datas[i].rewardType = cGoods.TCurrency; datas[i].rewardId = cGoods.CDia; datas[i].rewardCount = i * 1000; } return datas; } // 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 { int sid; } [Serializable] public class dTitle { public const string PrefsKey = "PlayTitle"; public int id; public bool have; public eContent category; // 획득 컨텐츠 public eDifficulty grade; // 획득 난이도 public eCondition condType; // 획득 방법 public int condValue; // 회득 목표치 public eEffectType abilityType; // 해금 효과 타입 public int abilityValue; // 해금 스탯값 public static dTitle[] localDatas() { dTitle[] datas = new dTitle[70]; for (int i = 0; i < datas.Length; i++) { datas[i] = new dTitle(); datas[i].id = i + 1; datas[i].grade = eDifficulty.Normal; datas[i].category = eContent.Battle; datas[i].abilityType = eEffectType.AtkBase; datas[i].condType = eCondition.MonsterCnt; datas[i].condValue = 200000000; datas[i].abilityValue = 100; datas[i].have = false; } return datas; } public static void Save(dTitle[] data) { ES3.Save(PrefsKey, data, Global.ES3_PlayTitle); } public static dTitle[] Load(dTitle[] prevData) { if (!ES3.KeyExists(PrefsKey, Global.ES3_PlayTitle)) if (prevData != null) { ES3.Save(PrefsKey, prevData, Global.ES3_PlayTitle); } else { ES3.Save(PrefsKey, new dTitle[70], Global.ES3_PlayTitle); } dTitle []data = ES3.Load(PrefsKey, Global.ES3_PlayTitle); return data; } } [Serializable] public class dIcon { public const string PrefsKey = "PlayIcon"; public int id; public bool have; public eCondition condType; // 획득 방법 public int condValue; public static dIcon[] localDatas() { dIcon[] datas = new dIcon[13]; for(int i = 0; i(PrefsKey, Global.ES3_PlayIcon); return data; } } #endregion #region DungeonPreset public class cDungeonPreset { public const string PrefsKey = "cDungeonPreset"; public int[] dgSkillPreset; public int[] dgAwakenPreset; public int[] dgPetPreset; public static cDungeonPreset LocalData() { cDungeonPreset data = new cDungeonPreset(); data.dgSkillPreset = new int[6] { 0, 0, 0, 0, 0, 0 }; data.dgAwakenPreset = new int[6] { 0, 0, 0, 0, 0, 0 }; data.dgPetPreset = new int[6] { 0, 0, 0, 0, 0, 0 }; return data; } public void Save() { //OnBeforeSerialize(); ES3.Save(PrefsKey, this, Global.ES3_DgPreset); } public static void NewSettingSave() { //int[] dgSkillPresetSub = new int[6] { 0, 0, 0, 0, 0, 0 }; //int[] dgAwakenPresetSub = new int[6] { 0, 0, 0, 0, 0, 0 }; //int[] dgPetPresetSub = new int[6] { 0, 0, 0, 0, 0, 0 }; // //ES3.Save(PrefsKey, this, Global.ES3_DgPreset); } public static cDungeonPreset Load(cDungeonPreset prevData) { if (!ES3.KeyExists(PrefsKey, Global.ES3_DgPreset)) if (prevData != null) { ES3.Save(PrefsKey, prevData, Global.ES3_DgPreset); } else { ES3.Save(PrefsKey, new cDungeonPreset(), Global.ES3_DgPreset); } cDungeonPreset data = ES3.Load(PrefsKey, Global.ES3_DgPreset); //data.OnAfterDeserialize(); return data; } } #endregion #region AdBuff [Serializable] public class dAdBuff { public int lv; public int exp; public int atkValue; public int goldValue; public int expValue; public static dAdBuff[] LocalData() { dAdBuff[] data = new dAdBuff[10]; for(int i = 0; i < data.Length; i++) { data[i] = new dAdBuff(); data[i].lv = i + 1; data[i].exp = 250 * i + ((i * i) * 10); data[i].atkValue = i * 1000000 + 1000000; data[i].goldValue = i * 1000000 + 1000000; data[i].expValue = i * 500000 + 500000; } return data; } } [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 static cAdBuffLevel LocalData() { cAdBuffLevel data = new cAdBuffLevel(); data.atkLv = 1; data.atkExp = 0; data.goldLv = 1; data.goldExp = 0; data.expLv = 1; data.expExp = 0; data.adTimer[0] = -1; data.adTimer[1] = -1; data.adTimer[2] = -1; return data; } 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; public string path; public int[] bgColor; public eEventMoveType moveType; public int scale1; public int scale2; public int scale3; public DateTime startAt; [SerializeField] protected string _startAt; public DateTime endAt; [SerializeField] protected string _endAt; public TimeSpan startTime; [SerializeField] protected string _startTime; public TimeSpan endTime; [SerializeField] protected string _endTime; public int[] eventType; public static dEvent[] LocalDatas() { dEvent[] data = new dEvent[1]; for(int i = 0; i < data.Length; i++) { data[i].id = i + 1; data[i].title = i.ToString(); data[i].path = i.ToString(); data[i].moveType = eEventMoveType.Attend10; data[i].scale1 = 2; data[i].scale2 = 2; data[i].scale3 = 2; data[i].eventType = new int[1]; data[i].eventType[0] = 1; } return data; } // Object->Json 변환시 자동 호출. public void OnBeforeSerialize() { _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; } public static TimeSpan TimeParsing(string time) { TimeSpan span; string[] splitText; splitText = time.Split(":"); 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; public string item; public int price; public nRewardLimit[] rewards; public nRewardLimit[] props; public DateTime startAt; [SerializeField] protected string _startAt; public DateTime endAt; [SerializeField] protected string _endAt; public DateTime closeAt; [SerializeField] protected string _closeAt; public static dEventInfo LocalDatas() { dEventInfo data = new dEventInfo(); data = null; return data; } // 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; public static cEventItem LocalDatas() { cEventItem data = new cEventItem(); data = null; return data; } public void Save(int tradeRaiseRoulette012) { switch (tradeRaiseRoulette012) { case 0: ES3.Save("TradeEvent", this, Global.ES3_EventTrade); break; case 1: ES3.Save("RaiseEvent", this, Global.ES3_EventRaise); break; case 2: ES3.Save("RouletteEvent", this, Global.ES3_EventRoulette); break; } } public static cEventItem Load(cEventItem prevData, int tradeRaiseRoulette012) { cEventItem data = null; switch (tradeRaiseRoulette012) { case 0: if(!ES3.KeyExists("TradeEvent", Global.ES3_EventTrade)) { if (prevData != null) { ES3.Save("TradeEvent", prevData, Global.ES3_EventTrade); } else { ES3.Save("TradeEvent", new cEventItem(), Global.ES3_EventTrade); } } data = ES3.Load("TradeEvent", Global.ES3_EventTrade); break; case 1: if (!ES3.KeyExists("RaiseEvent", Global.ES3_EventRaise)) { if (prevData != null) { ES3.Save("RaiseEvent", prevData, Global.ES3_EventRaise); } else { ES3.Save("RaiseEvent", new cEventItem(), Global.ES3_EventRaise); } } data = ES3.Load("RaiseEvent", Global.ES3_EventRaise); break; case 2: if (!ES3.KeyExists("RouletteEvent", Global.ES3_EventRoulette)) { if (prevData != null) { ES3.Save("RouletteEvent", prevData, Global.ES3_EventRoulette); } else { ES3.Save("RouletteEvent", new cEventItem(), Global.ES3_EventRoulette); } } data = ES3.Load("RouletteEvent", Global.ES3_EventRoulette); break; } return data; } } [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; public DateTime startAt; [SerializeField] protected string _startAt; public DateTime endAt; [SerializeField] protected string _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; public DateTime startAt; [SerializeField] protected string _startAt; public DateTime endAt; [SerializeField] protected string _endAt; // 플레이 데이터. public int buyCnt; public int totalCnt; public DateTime refreshAt; public static dShop[] LocalDatas() { dShop[] datas = new dShop[40]; for (int i = 0; i < 8; i++) { eShopType shoptype = (eShopType)i; for (int k = 0; k < 5; k++) { int index = i * 5 + k; datas[index] = new dShop(); datas[index].id = i + 1; datas[index].sortOrder = i + 1; datas[index].path = datas[index].id.ToString(); datas[index].productId = datas[index].id.ToString(); datas[index].refreshType = eRefreshType.Account; datas[index].refreshValue = 1; datas[index].limitCnt = 10; datas[index].startAt = DateTime.MinValue; datas[index].endAt = DateTime.MaxValue; datas[index].shopType = shoptype; datas[index].rewards = new nReward[1] { new nReward(cGoods.TCurrency, cGoods.CDiaP, (k + 1) * 100) }; switch (shoptype) { case eShopType.Event: case eShopType.SpecialPack: case eShopType.CostumePack: datas[index].buyingType = cGoods.TCash; datas[index].buyingCnt = 9999; datas[index].mileage = 99; break; case eShopType.Dia: if (k == 0) { datas[index].buyingType = cGoods.TAds; } else { datas[index].buyingType = cGoods.TCash; datas[index].buyingCnt = 9999; datas[index].mileage = 99; } break; case eShopType.Mileage: datas[index].buyingType = cGoods.TCurrency; datas[index].buyingId = cGoods.CMileage; datas[index].buyingCnt = 9999; break; default: datas[index].buyingType = cGoods.TCurrency; datas[index].buyingId = cGoods.CDia; datas[index].buyingCnt = 33333; break; } } } return datas; } 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 static sShopPlay[] LocalDatas() { sShopPlay[] datas = new sShopPlay[40]; for (int i = 0; i < datas.Length; i++) { datas[i] = new sShopPlay(); datas[i].sid = i + 1; datas[i].refreshAt = DateTime.MaxValue; } return datas; } 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 eRefreshType refreshType; //public int refreshValue; //public int limitCnt; // 대표 이미지. public string path; public int[] bgTop; public int[] bgBottom; // 패스 종류. 0: 반복, 1: 일회성, 2: 이벤트(일회성). public int passType; // 세부분류 단계 수. public int passUnit; public eCondition condType; public dPassLevel[] levels; public DateTime startAt; [SerializeField] protected string _startAt; public DateTime endAt; [SerializeField] protected string _endAt; public DateTime refreshAt; // 플레이 데이터. public int progress; public bool[] isPaid; public int[] haveLvFrees; public int[] haveLvPaids; // 클라 계산 데이터. public int availLevel; public int[] shopIds; public static dPass[] LocalDatas() { dPass[] datas = new dPass[5]; for (int i = 0; i < datas.Length; i++) { datas[i] = new dPass(); datas[i].id = i + 1; datas[i].path = "img/pass_stage"; datas[i].bgTop = new int[3] { 44, 115, 231 }; datas[i].bgBottom = new int[3] { 13, 37, 137 }; datas[i].passUnit = 20; datas[i].startAt = DateTime.MinValue; datas[i].endAt = DateTime.MaxValue; } datas[0].condType = eCondition.MonsterCnt; datas[0].passType = cGoods.PassTypeOne; datas[0].passUnit = 10; datas[0].levels = dPassLevel.LocalDatas(50, 5, cGoods.TNone, 0, cGoods.TNone, 0); datas[1].condType = eCondition.PlayerLv; datas[1].passType = cGoods.PassTypeOne; datas[1].levels = dPassLevel.LocalDatas(20, 1, cGoods.TCosWeapon, 20, cGoods.TCosCloth, 20); datas[2].condType = eCondition.StageClear; datas[2].passType = cGoods.PassTypeOne; datas[2].levels = dPassLevel.LocalDatas(25, 10, cGoods.TCosWeapon, 19, cGoods.TCosCloth, 19); datas[3].id = 100; datas[3].passUnit = 100; datas[3].startAt = DateTime.MinValue; datas[3].endAt = TimeUtils.NextMonthUtc(); datas[3].condType = eCondition.MonsterCnt; datas[3].passType = cGoods.PassTypeEvent; datas[3].levels = dPassLevel.LocalDatas(20, 30, cGoods.TNone, 0, cGoods.TNone, 0); datas[4].id = 101; datas[4].passUnit = 100; datas[4].startAt = TimeUtils.NextMonthUtc(); datas[4].endAt = TimeUtils.NextMonthUtc().AddMonths(1); datas[4].condType = eCondition.StageClear; datas[4].passType = cGoods.PassTypeEvent; datas[4].levels = dPassLevel.LocalDatas(20, 10, cGoods.TNone, 0, cGoods.TNone, 0); return datas; } 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; public BigInteger freeReward; [SerializeField] protected string freeRewardCnt; // 유료 보상. public int paidRewardType; public int paidRewardId; public BigInteger paidReward; [SerializeField] protected string paidRewardCnt; public static dPassLevel[] LocalDatas(int icnt, int istep, int ilasttypef, int ilastsubf, int ilasttypep, int ilastsubp) { dPassLevel[] datas = new dPassLevel[icnt]; for (int i = 0; i < datas.Length; i++) { datas[i] = new dPassLevel(); datas[i].condLv = i + 1; datas[i].condValue = (i + 1) * istep; if (i == datas.Length - 1 && ilasttypef != cGoods.TNone) { datas[i].freeRewardType = ilasttypef; datas[i].freeRewardId = ilastsubf; datas[i].freeReward = 1L; } else { datas[i].freeRewardType = cGoods.TCurrency; datas[i].freeRewardId = cGoods.CDia; datas[i].freeReward = (i + 1) * 10; } if (i == datas.Length - 1 && ilasttypep != cGoods.TNone) { datas[i].paidRewardType = ilasttypep; datas[i].paidRewardId = ilastsubp; datas[i].paidReward = 1L; } else { datas[i].paidRewardType = cGoods.TCurrency; datas[i].paidRewardId = cGoods.CDia; datas[i].paidReward = (i + 1) * 30; } } return datas; } // Object->Json 변환시 자동 호출. public void OnBeforeSerialize() { } // Json->Object 변환시 자동 호출. public void OnAfterDeserialize() { if (!string.IsNullOrEmpty(freeRewardCnt)) freeReward = BigInteger.Parse(freeRewardCnt); else freeReward = 0L; freeRewardCnt = null; if (!string.IsNullOrEmpty(paidRewardCnt)) paidReward = BigInteger.Parse(paidRewardCnt); else paidReward = 0L; paidRewardCnt = null; } } [Serializable] public class sPassPlay : ISerializationCallbackReceiver { public int sid; //public int limitCnt; //public int totalCnt; public int progress; public bool[] isPaid; public int[] haveLvFrees; public int[] haveLvPaids; public DateTime refreshAt; [SerializeField] protected string _refreshAt; public static sPassPlay[] LocalDatas() { sPassPlay[] datas = new sPassPlay[3]; for (int i = 0; i < datas.Length; i++) { datas[i] = new sPassPlay(); datas[i].sid = i + 1; datas[i].progress = ES3.Load(datas[i].sid.ToString(), Global.ES3_Pass, 0); datas[i].isPaid = null; datas[i].haveLvFrees = null; datas[i].haveLvPaids = null; } return datas; } 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; public DateTime endAt; [SerializeField] protected string _endAt; public DateTime readAt; [SerializeField] protected string _readAt; public static dMail[] LocalDatas() { return new dMail[0]; } // 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; //public nReward[] reward; public DateTime endAt; [SerializeField] protected string _endAt; public static dAttend LocalData(int itype) { dAttend data = new dAttend(); data = new dAttend(); data.attendType = itype; data.isRepeat = itype == 1; data.endAt = new DateTime(2099, 12, 31, 10, 0, 0); AttendReward[] reward = new AttendReward[1]; reward[0].day = 1; reward[0].rewards = new nReward[1]; reward[0].rewards[0].rewardId = cGoods.CGold; reward[0].rewards[0].rewardCount = 10000L; data.rewards = reward; return data; } public static dAttend[] LocalDatas() { dAttend[] data = new dAttend[2]; for(int i = 0; i < 2; i++) { data[i] = new dAttend(); data[i].attendType = i + 1; data[i].isRepeat = i == 1; data[i].endAt = new DateTime(2099, 12, 31, 10, 0, 0); AttendReward[] reward = new AttendReward[1]; reward[0] = new AttendReward(); reward[0].day = 1; reward[0].rewards = new nReward[1]; reward[0].rewards[0] = new nReward(); reward[0].rewards[0].rewardId = cGoods.CGold; reward[0].rewards[0].rewardCount = 10000L; data[i].rewards = reward; } return data; } // 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] protected 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 static cAttend[] Localdatas() { cAttend[] datas = new cAttend[2]; for(int i = 0; i < 2; i++) { datas[i] = new cAttend(); datas[i].attendType = i + 1; datas[i].attendAt = new DateTime(2099, 12, 31, 10, 0, 0); datas[i].clearCnt = 0; datas[i].day = 0; datas[i].attend = false; } return datas; } } 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; public DateTime attendAt; [SerializeField] protected string _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; } public static cQuestAttend Localdatas() { cQuestAttend datas = new cQuestAttend(); datas.attendAt = new DateTime(2099, 12, 31, 10, 0, 0); datas.day = 0; return datas; } } [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 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; public DateTime refreshAt; [SerializeField] protected string _refreshAt; public int availWeeklyIndex; // 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 dPvp { public bool isOpen; public int bgId; public int timeout; public int pointClear; public int pointFail; public dPvpRew[] missions; public dPvpTier[] tier; public static dPvp LocalData() { dPvp data = new dPvp(); data.missions = new dPvpRew[7]; for (int i = 0; i < 7; i++) { data.missions[i] = new dPvpRew(); data.missions[i].condValue = i * 100000; } data.tier = new dPvpTier[1]; data.tier[0] = new dPvpTier(); data.tier[0].id = 1; return data; } } [Serializable] // 결투장 주간 보상 구조. public class dPvpRew : ISerializationCallbackReceiver { public int id; public int condValue; // 보상. public int rewardType; public int rewardId; public BigInteger rewardCount; [SerializeField] protected string rewardCnt; // 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; public BigInteger rewardCount; [SerializeField] protected string rewardCnt; 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 dPvpSpec : ISerializationCallbackReceiver { 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; public BigInteger charAtk; [SerializeField] protected string attack; public BigInteger charHp; [SerializeField] protected string hp; public int usePreset; public int usePetPreset; public int useExtraPreset; public int petMain; public int[] skillPreset; public int[] skillLv; public int[] skillAwaken; // 클라이언트 계산. public float[] skillCool; public void CalcSkillCool() { skillCool = new float[4]; 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); else charAtk = 0L; attack = null; if (!string.IsNullOrEmpty(hp)) charHp = BigInteger.Parse(hp); else charHp = 0L; 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; // 내가 상대에게 준 총 데미지. public BigInteger battleDmg; [SerializeField] protected string battleDamage; // 상대가 나에게 준 총 데미지. public BigInteger vsBattleDmg; [SerializeField] protected string vsBattleDamage; // 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; public DateTime startAt; [SerializeField] protected string _startAt; public DateTime endAt; [SerializeField] protected string _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; } } public static dNotice[] LocalDatas() { return null; //if (UnityEngine.Random.Range(0, 3) > 0) // return null; //dNotice[] datas = new dNotice[UnityEngine.Random.Range(1, 4)]; //for (int i = 0; i < datas.Length; i++) //{ // datas[i] = new dNotice(); // datas[i].id = i + 1; // datas[i].titleEN = FormatString.StringFormat("Notice {0}", i + 1); // datas[i].titleKR = FormatString.StringFormat("공지사항 {0}", i + 1); // datas[i].titleJP = FormatString.StringFormat("お知らせ {0}", i + 1); // datas[i].contentEN = FormatString.StringFormat("Notice Description {0}\ntext avail rich text code something...\n1234567890", i + 1); // datas[i].contentKR = FormatString.StringFormat("공지사항 Description {0}\ntext avail rich text code something...\n1234567890", i + 1); // datas[i].contentJP = FormatString.StringFormat("お知らせ Description {0}\ntext avail rich text code something...\n1234567890", i + 1); //} //return datas; } } [Serializable] public class dNoticeDatas { public dNotice[] sysNotice; public static dNoticeDatas LocalDatas() { dNoticeDatas data = new dNoticeDatas(); data.sysNotice = dNotice.LocalDatas(); return data; } } [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; } } public static dChatNotice[] LocalDatas() { dChatNotice[] datas = new dChatNotice[2]; datas[0] = new dChatNotice(); datas[0].contentEN = "Unhealthy writing can be subject to sanctions."; datas[0].contentKR = "비방/욕설/음란/광고 등 불건전 행위는 제재 대상이 될 수 있습니다."; datas[0].contentJP = "誹謗/悪口/わいせつ/広告などの不健全行為は制裁対象になることがあります。"; datas[1] = new dChatNotice(); datas[1].contentEN = "Please do not disclose payment information/personal information to others."; datas[1].contentKR = "결제정보/개인정보는 절대 타인에게 공개하지 마시기 바랍니다."; datas[1].contentJP = "決済情報/個人情報は絶対に他人に公開しないでください。"; return datas; } } [Serializable] public class dChatNoticeDatas { public dChatNotice[] sysNoticeChat; public static dChatNoticeDatas LocalDatas() { dChatNoticeDatas data = new dChatNoticeDatas(); data.sysNoticeChat = dChatNotice.LocalDatas(); return data; } } #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(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; } } // 재화/아이템. [Serializable] public class nReward : ISerializationCallbackReceiver { //보상 대분류. cGoods.T_* public int rewardType; //보상 소분류. cGoods.C_* or Id. public int rewardId; public BigInteger rewardCount; [SerializeField] protected string rewardCnt; 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; } } [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; public static dAwaken[] LocalDatas() { dAwaken[] datas = new dAwaken[4]; for (int i = 0; i < datas.Length; i++) { datas[i] = new dAwaken(); datas[i].maxLv = (i * 50) + 150; datas[i].buyingCnt1 = i * 1; datas[i].buyingCnt2 = i * 2; datas[i].buyingCnt3 = i * 1; datas[i].AwakenStoneCnt = i * 1000; datas[i].coolTimeDec = i * 100000; } return datas; } } // 범용 레벨 총합별 값. [Serializable] public class dTotalLvValue { public int totalLv; public int value; public static dTotalLvValue[] LocalDatas() { dTotalLvValue[] datas = new dTotalLvValue[6]; for (int i = 0; i < datas.Length; i++) { datas[i] = new dTotalLvValue(); datas[i].totalLv = i * 200; datas[i].value = i * 10000; } return datas; } } #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 static class tLocalDatas { public static int[] LocalDatas(int icount) { int[] datas = new int[icount]; for (int i = 0; i < icount; i++) datas[i] = i + 1; return datas; } public static int[] LocalGachaGrades() { return new int[4] { 100000, 200000, 300000, 400000 }; } } // 어드레서블 관리. 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 }