public override BaseData DeepCopy() { base.DeepCopy(); StageMonsterData copy = new StageMonsterData(); copy.position = this.position; copy.yRotate = this.yRotate; return(copy); }
public Monster addMonsterToStage(TranscendData td, int[] transcendLevel, bool isPlayerMon, StageMonsterData stageMonData, string monId, Vector3 position, UnitData ud = null, bool addList = true) { // Log.log("addMonsterToStage : " + monId, " pos: " + position); Monster mon; bool isUnitMonster = (stageMonData == null || stageMonData.type == StageMonsterData.Type.UNIT); if (isUnitMonster) { _tempMonResource = GameManager.info.unitData[monId].resource; _tempMonType = Monster.TYPE.UNIT; } else if (stageMonData.type == StageMonsterData.Type.HERO) { _tempMonResource = GameManager.info.heroMonsterData[monId].resource; _tempMonType = Monster.TYPE.HERO; } else if (stageMonData.type == StageMonsterData.Type.NPC) { _tempMonResource = GameManager.info.npcData[monId].resource; _tempMonType = Monster.TYPE.NPC; } #if UNITY_EDITOR //Debug.Log(_tempMonCategory); #endif if (_tempMonType == Monster.TYPE.UNIT) { mon = GameManager.me.characterManager.getMonster(false, isPlayerMon, _tempMonResource, addList); CharacterUtil.setRare(GameManager.info.unitData[monId].rare, mon); } else if (_tempMonType == Monster.TYPE.HERO) { if (GameManager.info.heroMonsterData[monId].isPlayerResourceType) { HeroMonsterData hd = GameManager.info.heroMonsterData[monId]; mon = (Monster)GameManager.me.characterManager.getPlayerCharacter(hd.resource, hd.head, hd.body, hd.weapon, hd.vehicle, hd.faceTexture, false, addList); if (mon.action != null) { GameManager.me.characterManager.setCharacterAction(mon.action, mon.category); } mon.action = null; mon.category = MonsterCategory.Category.HEROMONSTER; } else { mon = GameManager.me.characterManager.getMonster(false, isPlayerMon, _tempMonResource, addList); mon.removeRareLine(); } } else { mon = GameManager.me.characterManager.getMonster(false, isPlayerMon, _tempMonResource, addList); if (mon.monsterData.hasFaceAni == false) { //CharacterUtil.setRare(RareType.NORMAL, mon); mon.removeRareLine(); } } //position.x += (float)(GameManager.inGameRandom.Range(0,101))*0.01f;//(float)GameManager.getRandomNum()*0.01f; //mon.setPositionCtransform( position ); mon.init(td, transcendLevel, monId, isPlayerMon, _tempMonType, stageMonData); mon.setPositionCtransform(position); // Log.log("addMonsterToStage" + mon , mon.resourceId); mon.isCutSceneOnlyCharacter = false; _tempMonCategory = GameManager.info.monsterData[_tempMonResource].category; if (addList) { switch (_tempMonCategory) { case MonsterCategory.Category.HEROMONSTER: ++bossNum; //Debug.LogError("bossNum : " + bossNum); break; case MonsterCategory.Category.UNIT: if (isPlayerMon == false) { monUnitNum.Set(monUnitNum + 1); } //Debug.LogError("monUnitNum : " + monUnitNum); break; } } // 인트로 컷씬 게임용. if (GameManager.me.stageManager.isIntro) { mon.hp = 100000000; } mon.action.setFirstPosition(mon.cTransformPosition); mon.setVisible(true); mon.isEnabled = true; return(mon); }
public void init(TranscendData transcendData, int[] transcendLevel, bool isPlayerUnitData, string id, bool isPlayerMon = false, TYPE type = Monster.TYPE.UNIT, StageMonsterData sMonData = null, bool isPetMonster = false) { #if UNITY_EDITOR cTransform.gameObject.name = ((isPlayerMon)?"pm":"em") + randomNum++; tf.gameObject.name = cTransform.gameObject.name; #endif resetDefaultVals(); if (particleEffect != null) { GameManager.me.effectManager.setParticleEffect(particleEffect); } isPet = isPetMonster; isPlayerSide = isPlayerMon; fowardDirectionValue = (isPlayerSide?1000.0f:-1000.0f); isDeleteObject = false; _v = tf.localScale; _v.x = 1.0f; _v.y = 1.0f; _v.z = 1.0f; tf.localScale = _v; _q = tf.rotation; _v = _q.eulerAngles; _v.x = 0.0f; if (isPlayerSide) { _v.y = 90.0f; } else { _v.y = 270.0f; } _v.z = 0.0f; _q.eulerAngles = _v; tf.rotation = _q; isMonster = true; npcData = null; unitData = null; heroMonsterData = null; stageMonsterData = sMonData; stat.monsterType = type; bool needToSetRareEffect = false; if (type == TYPE.UNIT) { isHero = false; unitData = GameManager.info.unitData[id]; unitData.setDataToCharacter(this, transcendData, transcendLevel); if (isPlayerMon) { // GameManager.me.player.unitHpUp 소환생명력증가 // GameManager.me.player.unitDefUp float tempF = maxHp; tempF += tempF * GameManager.me.player.unitHpUp(unitData); // stat.unitHpUp; maxHp = tempF; hp = tempF; tempF = stat.defMagic; tempF += tempF * GameManager.me.player.unitDefUp(unitData); //.stat.unitDefUp; stat.defMagic = tempF; tempF = stat.defPhysic; tempF += tempF * GameManager.me.player.unitDefUp(unitData); //.stat.unitDefUp; stat.defPhysic = tempF; if (unitData.rare > 0) { needToSetRareEffect = true; } } else if (isPlayerUnitData) // 적인데 주인공 소환수 데이터를 갖고 있으면 걔는 무조건 PVP! { float tempF = maxHp; tempF += tempF * GameManager.me.pvpPlayer.unitHpUp(unitData); //.stat.unitHpUp; maxHp = tempF; hp = tempF; tempF = stat.defMagic; tempF += tempF * GameManager.me.pvpPlayer.unitDefUp(unitData); //..stat.unitDefUp; stat.defMagic = tempF; tempF = stat.defPhysic; tempF += tempF * GameManager.me.pvpPlayer.unitDefUp(unitData); //..stat.unitDefUp; stat.defPhysic = tempF; if (unitData.rare > 0) { needToSetRareEffect = true; } } #if UNITY_EDITOR cTransform.gameObject.name += "_" + unitData.rare; tf.gameObject.name = cTransform.gameObject.name; #endif setAniData(Monster.ATK_IDS[unitData.attackType.type]); setDefaultHitRange(_tempAniData, false); //(unitData.attackType.type == 1 || unitData.attackType.type == 2)); if (unitData.skill != null && unitData.skill.Length > 0) { skillSlots = new UnitSkillSlot[unitData.skill.Length]; _skillSlotsNum = skillSlots.Length; for (i = 0; i < _skillSlotsNum; ++i) { skillSlots[i] = new UnitSkillSlot(); skillSlots[i].setData(this, GameManager.info.unitSkillData[unitData.skill[i]]); } } else { skillSlots = null; } } else if (type == TYPE.HERO) // 히어로.... { isHero = true; heroMonsterData = GameManager.info.heroMonsterData[id]; heroMonsterData.setDataToCharacter(this); setAniData(Monster.ATK_IDS[heroMonsterData.attackType.type]); setDefaultHitRange(_tempAniData, false); //(heroMonsterData.attackType.type == 1 || heroMonsterData.attackType.type == 2)); setUpdateWhenOffscreen(true); int len = 0; if (stageMonsterData != null) { if (stageMonsterData.units != null) { _unitSlotsNum = stageMonsterData.units.Length; unitSlots = new UnitSlot[_unitSlotsNum]; len = unitSlots.Length; for (i = 0; i < len; ++i) { unitSlots[i] = new UnitSlot(); unitSlots[i].setData(this, GameManager.info.unitData[stageMonsterData.units[i]]); } } _skillSlotsNum = stageMonsterData.skills.Length; skillSlots = new HeroSkillSlot[_skillSlotsNum]; len = _skillSlotsNum; for (i = 0; i < len; ++i) { skillSlots[i] = new HeroSkillSlot(); GameIDData skillInfo = new GameIDData(); skillInfo.parse(stageMonsterData.skills[i], GameIDData.Type.Skill); skillSlots[i].setData(this, skillInfo); } _aiSlotsNum = stageMonsterData.ai.Length; aiSlots = new AISlot[_aiSlotsNum]; len = _aiSlotsNum; for (i = 0; i < len; ++i) { aiSlots[i] = new AISlot(); #if UNITY_EDITOR try { #endif aiSlots[i].setData(this, GameManager.info.heroMonsterAI[stageMonsterData.ai[i]]); #if UNITY_EDITOR } catch { Debug.LogError("==== ERRORRRRRR : " + stageMonsterData.ai[i]); } #endif } } } else if (type == TYPE.NPC) { isHero = false; npcData = GameManager.info.npcData[id]; GameManager.info.npcData[id].setDataToCharacter(this); } else if (type == TYPE.EFFECT) { isHero = false; } baseInit(); damageRange = monsterData.damageRange; isBlockMonster = monsterData.isBlockMonster; initShadowAndEffectSize(); _showFirst = false; _recoveryDelay.Set(0.0f); _recoveryDelayMp.Set(0.0f); _recoveryDelaySp.Set(0.0f); _hpRecoveryDelay.Set(0.0f); //_monsterShowTime = 0.0f; invincible = false; //Log.log("monsterData.category : " + monsterData.category); action = GameManager.me.characterManager.getCharacterAction(category); action.init(this); hasAni = !(category == MonsterCategory.Category.OBJECT && ani.GetClip(DEAD) == null); _v = tf.localPosition; _v.y = 1.0f; tf.localPosition = _v; _damageMotionDuration = 1000.0f; if (monsterData.deleteMotionType == ChracterDeleteMotionType.EFFECT) { deleteMotionEffect = GameManager.info.effectData[monsterData.deleteMotionValue].clone(); if (deleteMotionEffect.type == EffectData.ResourceType.CHARACTER) { #if UNITY_EDITOR Debug.Log("deleteMotionEffect.effectChracter : " + (deleteMotionEffect.effectChracter == null)); #endif if (deleteMotionEffect.effectChracter == null) { deleteMotionEffect.effectChracter = GameManager.me.characterManager.getMonster(false, isPlayerMon, deleteMotionEffect.resource, false); if (unitData != null) { CharacterUtil.setRare(unitData.rare, deleteMotionEffect.effectChracter); } else if (isHero) { deleteMotionEffect.effectChracter.removeRareLine(); } deleteMotionEffect.effectChracter.init(null, null, monsterData.deleteMotionValue, isPlayerMon, Monster.TYPE.EFFECT); deleteMotionEffect.effectChracter.isEnabled = false; deleteMotionEffect.effectChracter.cTransform.localScale = cTransform.localScale; } } } else { deleteMotionEffect = null; } if (ani[Monster.NORMAL] != null) { state = Monster.NORMAL; } initHpBar(); initMiniMap(); saveCharacterOriginalValue(); // if(needToSetRareEffect) // { //GameManager.info.effectData[UnitData.rareEffectId[unitData.rare-1]].getEffect(cTransform.position,null,cTransform); //getParticleEffectByCharacterSize(this,null,cTransform); //particleEffect = GameManager.info.effectData[UnitData.rareEffectId[unitData.rare-1]].getParticleEffectByCharacterSize(this,null,cTransform,10000,0,0,0,0.5f); // } if (GameManager.me.stageManager.isIntro) { maxHp = 10000000; _hp = 10000000; } stat.maxHp = MathUtil.RoundToInt(maxHp); if (GameManager.info.modelData.ContainsKey(resourceId)) { useRimShader = GameManager.info.modelData[resourceId].useRimShader; } }
public void init(TranscendData td, int[] transcendLevel, string id, bool isPlayerMon = false, TYPE type = Monster.TYPE.UNIT, StageMonsterData sMonData = null, bool isPetMonster = false) { init(td, transcendLevel, isPlayerMon, id, isPlayerMon, type, sMonData, isPetMonster); }
public void init(GameIDData inputIdData, bool isPlayerMon = false, TYPE type = Monster.TYPE.UNIT, StageMonsterData sMonData = null, bool isPetMonster = false) { init(inputIdData.transcendData, inputIdData.transcendLevel, isPlayerMon, inputIdData.unitData.id, isPlayerMon, type, sMonData, isPetMonster); }
IEnumerator createHeroMonster(StageMonsterData smd) { Vector3 _v; MonsterData md; if (GameManager.me.stageManager.heroMonster != null) { foreach (Monster mon in GameManager.me.stageManager.heroMonster) { mon.damageDead(); } } try { md = GameManager.info.monsterData[GameManager.info.heroMonsterData[smd.id].resource]; } catch { Debug.Log(GameManager.info.heroMonsterData[smd.id].resource); Debug.Log(GameManager.info.monsterData[GameManager.info.heroMonsterData[smd.id].resource]); } md = GameManager.info.monsterData[GameManager.info.heroMonsterData[smd.id].resource]; GameManager.gameDataManager.addLoadModelData(md); if (smd.units != null) { foreach (string unitId in smd.units) { try { md = GameManager.info.monsterData[GameManager.info.unitData[unitId].resource]; GameManager.gameDataManager.addLoadModelData(md.resource, md, md); } catch { Debug.LogError(unitId); } } } GameManager.me.effectManager.loadEffectFromHeroMonsterData(GameManager.info.heroMonsterData[smd.id]); if (smd.skills != null) { for (int i = smd.skills.Length - 1; i >= 0; --i) { GameManager.me.effectManager.loadEffectFromHeroSkillData(smd.skills[i]); } } if (smd.units != null) { for (int i = smd.units.Length - 1; i >= 0; --i) { GameManager.me.effectManager.loadEffectFromUnitData(smd.units[i]); } } GameManager.me.effectManager.startLoadEffects(true); GameDataManager.instance.startModelLoad(true); yield return(null); while (GameManager.me.effectManager.isCompleteLoadEffect == false) { yield return(null); } while (GameDataManager.instance.isCompleteLoadModel == false) { yield return(null); } _v.x = monsterPosX; _v.y = 0; _v.z = 0; GameManager.me.stageManager.heroMonster = new Monster[1]; GameManager.me.stageManager.heroMonster[0] = GameManager.me.mapManager.addMonsterToStage(null, null, false, smd, smd.id, _v); }
sealed public override void setData(List <object> l, Dictionary <string, int> k) { id = (string)l[k["ID"]]; mode = (string)l[k["MODE"]]; string[] tarr; settingTime = -1; string tt = l[k["TIME"]].ToString(); if (string.IsNullOrEmpty(tt) == false && tt.Contains("/")) { string[] t2 = tt.Split('/'); if (t2.Length > 0) { if (t2[0].Length > 0) { int st = 0; int.TryParse(t2[0], out st); settingTime = st; } } if (t2.Length == 2) { settingAttr2 = t2[1]; } } else { Util.parseObject(l[k["TIME"]], out settingTime, true, -1); } settingAttr = (l[k["MODE_ATTR"]]).ToString(); targetPos = 0; switch (mode) { case MODE.SURVIVAL: if (settingAttr2 != null) { challengeData = new StageMonsterData(); challengeData.type = StageMonsterData.Type.UNIT; challengeData.id = "UN5"; // 어차피 화면에는 안보이게 할 거다. 더미나 마찬가지임. } break; case MODE.PROTECT: tarr = settingAttr.Split('/'); protectObject = new StageMonsterData[tarr.Length]; for (int i = 0; i < tarr.Length; ++i) { protectObject[i] = new StageMonsterData(); protectObject[i].type = StageMonsterData.Type.NPC; string[] tmp = tarr[i].Split(','); protectObject[i].id = tmp[0]; Util.tryFloatParseToXfloat(tmp[1], out protectObject[i].posX, protectObject[i].posX); Util.tryFloatParseToXfloat(tmp[2], out protectObject[i].posY, protectObject[i].posY); Util.tryFloatParseToXfloat(tmp[3], out protectObject[i].posZ, protectObject[i].posZ); if (tmp.Length >= 5) { Util.tryFloatParseToXfloat(tmp[4], out protectObject[i].angle, protectObject[i].angle); } else { protectObject[i].angle = -1000; } if (tmp.Length == 6) { protectObject[i].attr = tmp[5]; } else { protectObject[i].attr = null; } } if (settingAttr2 != null) { challengeData = new StageMonsterData(); challengeData.type = StageMonsterData.Type.UNIT; challengeData.id = "UN5"; // 어차피 화면에는 안보이게 할 거다. 더미나 마찬가지임. } break; case MODE.SNIPING: string str = (l[k["MODE_ATTR"]]).ToString(); if (str.Contains(",")) { int[] st1 = Util.stringToIntArray(str, ','); targetIndex = st1[0]; targetHpPer = st1[1]; } else { Util.parseObject(l[k["MODE_ATTR"]], out targetIndex, true, 0); targetHpPer = -1000; } break; case MODE.KILLCOUNT: tarr = settingAttr.Split('/'); killMonsterCount = tarr.Length; killMonsterIds = new string[killMonsterCount]; killMonsterNum = new Xint[killMonsterCount]; for (int i = 0; i < killMonsterCount; ++i) { string[] t = tarr[i].Split(','); killMonsterIds[i] = t[0]; Util.tryIntParseToXInt(t[1], out killMonsterNum[i], killMonsterNum[i]); } if (killMonsterIds.Length == 1 && killMonsterIds[0].Equals("TOTAL")) { mode = MODE.KILLCOUNT2; } break; case MODE.ARRIVE: //* 목표지점 좌표, 호위NPC ID(옵션), //* 추격몬스터 ID(옵션), 이동속도(옵션) //[목표지점/호위NPCID/추격몬스터ID,이동속도N] //* 목표지점 좌표, 호위NPC ID(옵션), //* 추격몬스터 ID(옵션), 이동속도(옵션) //[목표지점/호위NPCID/추격몬스터ID,이동속도N] tarr = settingAttr.Split('/'); Util.tryIntParseToXInt(tarr[0], out targetPos, targetPos); if (tarr.Length >= 2) { if (string.IsNullOrEmpty(tarr[1]) == false) { protectObject = new StageMonsterData[1]; protectObject[0] = new StageMonsterData(); protectObject[0].type = StageMonsterData.Type.NPC; string[] tmp = tarr[1].Split(','); protectObject[0].id = tmp[0]; if (tmp.Length >= 2) { Util.tryFloatParseToXfloat(tmp[1], out protectObject[0].posX, protectObject[0].posX); Util.tryFloatParseToXfloat(tmp[2], out protectObject[0].posY, protectObject[0].posY); Util.tryFloatParseToXfloat(tmp[3], out protectObject[0].posZ, protectObject[0].posZ); } if (tmp.Length >= 5) { Util.tryFloatParseToXfloat(tmp[4], out protectObject[0].angle, protectObject[0].angle); } else { protectObject[0].angle = -1000; } if (tmp.Length == 6) { Util.tryFloatParseToXfloat(tmp[5], out protectObject[0].checkLine, protectObject[0].checkLine); } else { protectObject[0].checkLine = 300; } } if (tarr.Length == 3) { string[] c = tarr[2].Split(','); chaser = new StageMonsterData(); chaser.type = StageMonsterData.Type.NPC; chaser.id = c[0]; Util.tryFloatParseToXfloat(c[1], out chaser.posX, chaser.posX); Util.tryFloatParseToXfloat(c[2], out chaser.posZ, chaser.posZ); Util.tryFloatParseToXfloat(c[3], out chaser.speed, chaser.speed); } } break; case MODE.DESTROY: //* 목표 오브젝트 지정 (최소 1개 이상) //* 추격몬스터 ID(옵션), 이동속도(옵션) //[ID1,ID2,ID3/추격몬스터ID,이동속도N] // id,px,py/id,px,py|npcid,px,py,speed tarr = settingAttr.Split('|'); if (tarr.Length == 2) { string[] c = tarr[1].Split(','); chaser = new StageMonsterData(); chaser.type = StageMonsterData.Type.NPC; chaser.id = c[0]; Util.tryFloatParseToXfloat(c[1], out chaser.posX, chaser.posX); Util.tryFloatParseToXfloat(c[2], out chaser.posZ, chaser.posZ); Util.tryFloatParseToXfloat(c[3], out chaser.speed, chaser.speed); } tarr = tarr[0].Split('/'); int len = tarr.Length; destroyObject = new StageMonsterData[tarr.Length]; for (int i = 0; i < len; ++i) { destroyObject[i] = new StageMonsterData(); destroyObject[i].type = StageMonsterData.Type.NPC; string[] tmp = tarr[i].Split(','); destroyObject[i].id = tmp[0]; Util.tryFloatParseToXfloat(tmp[1], out destroyObject[i].posX, destroyObject[i].posX); Util.tryFloatParseToXfloat(tmp[2], out destroyObject[i].posY, destroyObject[i].posY); Util.tryFloatParseToXfloat(tmp[3], out destroyObject[i].posZ, destroyObject[i].posZ); if (tmp.Length == 5) { Util.tryFloatParseToXfloat(tmp[4], out destroyObject[i].angle, destroyObject[i].angle); } else { destroyObject[i].angle = -1000; } } break; case MODE.GETITEM: getItemData = new GetItemData(); tarr = settingAttr.Split('/'); foreach (string ta in tarr) { string[] tl = ta.Split(','); getItemData.needCount[tl[0]] = 0; int needCount = 0; int.TryParse(tl[1], out needCount); getItemData.needCount[tl[0]] = needCount; getItemData.createChance[tl[0]] = new Dictionary <string, Xint>(StringComparer.Ordinal); int monLen = (tl.Length - 2) / 2; for (int i = 0; i < monLen; ++i) { string unitId = tl[2 + (i * 2)]; getItemData.createChance[tl[0]][unitId] = 0; needCount = 0; int.TryParse(tl[2 + (i * 2) + 1], out needCount); getItemData.createChance[tl[0]][unitId] = needCount; } } getItemData.itemIds = new string[getItemData.needCount.Keys.Count]; getItemData.needCount.Keys.CopyTo(getItemData.itemIds, 0); getItemData.itemCount = getItemData.itemIds.Length; if (settingAttr2 != null) { challengeData = new StageMonsterData(); challengeData.type = StageMonsterData.Type.UNIT; challengeData.id = "UN5"; // 어차피 화면에는 안보이게 할 거다. 더미나 마찬가지임. } //GameManager.me.uiManager.uiPlay.lbRoundInfo.text = getItemData.itemIds.ToString() + "획득"; break; case MODE.C_RUN: tarr = settingAttr.Split(','); challengeData = new StageMonsterData(); challengeData.type = StageMonsterData.Type.NPC; challengeData.id = tarr[0]; units = ((string)l[k["MON_HERO_UNIT"]]).Split(','); break; case MODE.C_SURVIVAL: challengeData = new StageMonsterData(); challengeData.type = StageMonsterData.Type.UNIT; challengeData.id = "UN5"; // 어차피 화면에는 안보이게 할 거다. 더미나 마찬가지임. units = ((string)l[k["MON_HERO_UNIT"]]).Split(','); break; case MODE.C_HUNT: challengeData = new StageMonsterData(); challengeData.type = StageMonsterData.Type.UNIT; challengeData.id = "UN5"; // 어차피 화면에는 안보이게 할 거다. 더미나 마찬가지임. units = ((string)l[k["MON_HERO_UNIT"]]).Split(','); break; case MODE.B_TEST: challengeData = new StageMonsterData(); challengeData.type = StageMonsterData.Type.UNIT; challengeData.id = "UN5"; // 어차피 화면에는 안보이게 할 거다. 더미나 마찬가지임. List <string> testUnits = new List <string>(); string[] f**k = settingAttr.Split('/'); for (int i = 0; i < f**k.Length; ++i) { string[] shit = f**k[i].Split(','); for (int j = 2; j < shit.Length; ++j) { if (testUnits.Contains(shit[j]) == false) { testUnits.Add(shit[j]); } } } units = testUnits.ToArray(); break; } string tr = ((string)l[k["REWARD"]]).Trim(); if (string.IsNullOrEmpty(tr)) { rewards = null; } else { rewards = tr.Split('/'); } description = (string)l[k["DESCRIPTION"]]; description = description.Replace("\\n", "\n"); cutSceneId = (string)l[k["SCENE_ID"]]; mapBg = (string)l[k["MAP_BG"]]; mapId = Util.stringToIntArray(l[k["MAP_ID"]].ToString(), '/'); if (mapId == null) { mapId = new int[1] { 1 } } ; mapStartEndPosX = Util.stringToXIntArray((string)l[k["MAP_SIZE"]], ','); Util.parseObject(l[k["PLAYER_START_POINT"]], out playerStartPosX, true, 0); parseMonsterData((string)l[k["MON_HERO"]], (string)l[k["DEFAULT_MON_UNIT"]], (string)l[k["MON_HERO_UNIT"]], (string)l[k["MON_HERO_SKILL"]], (string)l[k["MON_HERO_AI"]], (string)l[k["DECO"]], (string)l[k["OBJECT"]]); // Debug.LogError(id + " " + cutSceneId); } //parseMonsterData((string)l[k["MON_HERO"]],(string)l[k["DEFAULT_MON_UNIT"]],(string)l[k["MON_HERO_UNIT"]],(string)l[k["MON_HERO_SKILL"]],(string)l[k["MON_HERO_AI"]] ); void parseMonsterData(string heroStr, string defaultMonUnit, string unitStr, string skillStr, string aiStr, string decoStr, string blockObjectStr) { //* 해당 라운드에 등장하는 언데드히어로 지정 및 초기 위치 설정 //* (언데드히어로ID, 위치,보유SP%,보유MP%) 형식으로 지정 - HP는 무조건 100%, SP/MP는 초반 난이도 조절을 위해 필요 //* (언데드A/언데드B/… ) 형식으로 복수개 지정 가능 //예> 22,30,100,100/23,80,50,50 int i; string[] heroes; if (string.IsNullOrEmpty(heroStr)) { heroes = new string[0]; } else { heroes = heroStr.Split('/'); } string[] heroUnit = null; if (unitStr.Trim().Length > 0) { heroUnit = unitStr.Split('/'); } string[] heroSkill = skillStr.Split('/'); string[] heroAi = aiStr.Split('/'); heroMonsters = new StageMonsterData[heroes.Length]; for (i = 0; i < heroes.Length; ++i) { heroMonsters[i] = new StageMonsterData(); heroMonsters[i].type = StageMonsterData.Type.HERO; string[] tmp = heroes[i].Split(','); heroMonsters[i].id = tmp[0]; Util.tryFloatParseToXfloat(tmp[1], out heroMonsters[i].posX, heroMonsters[i].posX); heroMonsters[i].hpPercent = 1.0f; Util.tryFloatParseToXfloat(tmp[2], out heroMonsters[i].spPercent, heroMonsters[i].spPercent); heroMonsters[i].spPercent *= 0.01f; Util.tryFloatParseToXfloat(tmp[3], out heroMonsters[i].mpPercent, heroMonsters[i].mpPercent); heroMonsters[i].mpPercent *= 0.01f; if (tmp.Length >= 5) { heroMonsters[i].attr = "H"; } else { heroMonsters[i].attr = null; } if (heroUnit == null || i >= heroUnit.Length || string.IsNullOrEmpty(heroUnit[i])) { heroMonsters[i].units = new string[0]; } else { heroMonsters[i].units = heroUnit[i].Split(','); //heroUnit[i].Split(','); } if (heroSkill == null || i >= heroSkill.Length || string.IsNullOrEmpty(heroSkill[i])) { heroMonsters[i].skills = new string[0]; } else { heroMonsters[i].skills = heroSkill[i].Split(','); } if (heroAi == null || i >= heroAi.Length || string.IsNullOrEmpty(heroAi[i])) { heroMonsters[i].ai = new string[0]; } else { heroMonsters[i].ai = heroAi[i].Split(','); } } if (defaultMonUnit.Equals(String.Empty) == false) { string[] units = defaultMonUnit.Split('/'); unitMonsters = new StageMonsterData[units.Length]; for (i = 0; i < units.Length; ++i) { unitMonsters[i] = new StageMonsterData(); unitMonsters[i].type = StageMonsterData.Type.UNIT; string[] tmp = units[i].Split(','); unitMonsters[i].id = tmp[0]; Util.tryFloatParseToXfloat(tmp[1], out unitMonsters[i].posX, unitMonsters[i].posX); Util.tryFloatParseToXfloat(tmp[2], out unitMonsters[i].posZ, unitMonsters[i].posZ); unitMonsters[i].checkLine = -1000.0f; unitMonsters[i].attr = null; unitMonsters[i].angle = -1; switch (tmp.Length) { case 4: Util.tryFloatParseToXfloat(tmp[3], out unitMonsters[i].checkLine, unitMonsters[i].checkLine); break; case 5: Util.tryFloatParseToXfloat(tmp[3], out unitMonsters[i].checkLine, unitMonsters[i].checkLine); Util.tryFloatParseToXfloat(tmp[4], out unitMonsters[i].angle, unitMonsters[i].angle); break; case 6: Util.tryFloatParseToXfloat(tmp[3], out unitMonsters[i].checkLine, unitMonsters[i].checkLine); Util.tryFloatParseToXfloat(tmp[4], out unitMonsters[i].angle, unitMonsters[i].angle); unitMonsters[i].attr = ((string)tmp[5]).ToUpper(); break; } } } if (decoStr.Equals(String.Empty) == false) { string[] decos = decoStr.Split('/'); decoObject = new StageMonsterData[decos.Length]; for (i = 0; i < decos.Length; ++i) { decoObject[i] = new StageMonsterData(); decoObject[i].type = StageMonsterData.Type.NPC; string[] tmp = decos[i].Split(','); decoObject[i].id = tmp[0]; Util.tryFloatParseToXfloat(tmp[1], out decoObject[i].posX, decoObject[i].posX); Util.tryFloatParseToXfloat(tmp[2], out decoObject[i].posY, decoObject[i].posY); Util.tryFloatParseToXfloat(tmp[3], out decoObject[i].posZ, decoObject[i].posZ); if (tmp.Length >= 5) { Util.tryFloatParseToXfloat(tmp[4], out decoObject[i].angle, decoObject[i].angle); } else { decoObject[i].angle = -1000.0f; } if (tmp.Length == 6) { decoObject[i].attr = tmp[5]; } else { decoObject[i].attr = null; } } } if (blockObjectStr.Equals(String.Empty) == false) { // 사용 형식은 ‘NPCID1,X좌표,Z좌표,N/NPCID2,X좌표,Z좌표,N….’ // <N> // - 0 : 몬스터 편 오브젝트 / 적은 오브젝트를 무시하고 통과 // - 1 : 몬스터 편 오브젝트 / 적은 오브젝트를 지나치지 못함 // (이동 중 오브젝트 앞에서 멈추며, 오브젝트 파괴 시 이동) // - 2 : 유저 편 오브젝트 / 유저는 오브젝트를 무시하고 통과 // - 3 : 유저 편 오브젝트 / 유저는 오브젝트를 지나치지 못함 // (이동 중 오브젝트 앞에서 멈추며, 오브젝트 파괴 시 이동) string[] blocks = blockObjectStr.Split('/'); blockObject = new StageMonsterData[blocks.Length]; for (i = 0; i < blockObject.Length; ++i) { blockObject[i] = new StageMonsterData(); blockObject[i].type = StageMonsterData.Type.NPC; string[] tmp = blocks[i].Split(','); blockObject[i].id = tmp[0]; Util.tryFloatParseToXfloat(tmp[1], out blockObject[i].posX, blockObject[i].posX); Util.tryFloatParseToXfloat(tmp[2], out blockObject[i].posY, blockObject[i].posY); Util.tryFloatParseToXfloat(tmp[3], out blockObject[i].posZ, blockObject[i].posZ); if (tmp.Length >= 5) { float t4 = 0; float.TryParse(tmp[4], out t4); blockObject[i].angle = t4; } else { blockObject[i].angle = -1000.0f; } // Debug.Log(id); blockObject[i].attr = tmp[5]; } } } }