Ejemplo n.º 1
0
    public override BaseData DeepCopy()
    {
        base.DeepCopy();
        StageMonsterData copy = new StageMonsterData();

        copy.position = this.position;
        copy.yRotate  = this.yRotate;

        return(copy);
    }
Ejemplo n.º 2
0
    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);
    }
Ejemplo n.º 3
0
    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;
        }
    }
Ejemplo n.º 4
0
 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);
 }
Ejemplo n.º 5
0
 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);
 }
Ejemplo n.º 6
0
    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);
    }
Ejemplo n.º 7
0
    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];
            }
        }
    }
}