Exemplo n.º 1
0
    List <QuestPerMob> HuntBigOrder(List <QuestPerMob> orderedQuestList, float capTillTonight)
    {
        if (huntedList == null)
        {
            Debug.LogError("사냥하던 리스트가 없음.");
        }

        float usedCap = 0;

        for (int i = 0; i < huntedList.Count; i++)
        {
            usedCap += huntedList[i].GetWeight();
        }

        float tonightHuntingCap = capTillTonight - usedCap; //실제 오늘 사용할 수 있는 능력치.

        if (tonightHuntingCap <= 0)
        {
            return(null);
        }


        List <QuestPerMob> tonightHunt = new List <QuestPerMob>();    //오늘 잡을 애들 리스트

        var bo = from qpm in orderedQuestList
                 orderby qpm.GetMobEviTypeWeight() descending
                 select qpm;

        List <QuestPerMob> bigOrderedList = bo.ToList <QuestPerMob>();//가중치가 큰 애들 순서로 리스트를 맹긂

        Debug.Log("빅오더 정렬 리스트 = " + bigOrderedList.DebugString());

        bool matchedByHuntedAlready = false;

        for (int i = 0; i < bigOrderedList.Count; i++)
        {
            matchedByHuntedAlready = false;

            QuestPerMob bigOne   = bigOrderedList[i];
            E_Monster   mob      = bigOne.mob;
            E_Evidence  evidence = bigOne.evidence;

            float bigOneWeightForOne = bigOne.GetMobEviTypeWeight(); //지금 선택된 놈을 한 번 잡는데 소요되는 능력치.

            if (tonightHuntingCap < bigOneWeightForOne)              //제일 큰 놈을 하나 잡을 여유도 없으면.
            {
                return(tonightHunt);
            }

            for (int j = 0; j < huntedList.Count; j++)         //잡고 있던 녀석인지 체크
            {
                if (huntedList[j].IsIt(mob, evidence))         //이미 잡고 있는 혹은 잡은 종류라면.
                {
                    if (huntedList[j].number >= bigOne.number) //다 잡은 종류라면.
                    {
                        matchedByHuntedAlready = true;
                        break;
                    }
                    else //잡다가 말은 경우라면.
                    {
                        int remainNum = bigOne.number - huntedList[j].number;
                        while (remainNum > 0)
                        {
                            tonightHunt.AddMobEviOnce(mob, evidence);
                            remainNum--;
                            tonightHuntingCap -= bigOneWeightForOne;
                            if (tonightHuntingCap < bigOneWeightForOne && remainNum > 0)//더 못잡는데 아직 남아있으면 쫑
                            {
                                return(tonightHunt);
                            }
                        }
                        matchedByHuntedAlready = true;  //다 잡았다.
                    }
                }
            }

            if (matchedByHuntedAlready)
            {
                continue;                           //다 잡았던 놈이라면
            }
            //잡고 있던 애가 아니라면

            int remainNumOfNewOne = bigOne.number;
            while (remainNumOfNewOne > 0)
            {
                tonightHunt.AddMobEviOnce(mob, evidence);
                remainNumOfNewOne--;
                tonightHuntingCap -= bigOneWeightForOne;
                if (tonightHuntingCap < bigOneWeightForOne && remainNumOfNewOne > 0)//더 못잡는데 아직 남아있으면 쫑
                {
                    return(tonightHunt);
                }
            }

            //새로운 애도 다 잡아버린 경우.
        }
        return(tonightHunt);
    }
Exemplo n.º 2
0
    List <QuestPerMob> HuntCompactOrder(List <QuestPerMob> orderedQuestList, float capTillTonight)
    {
        if (huntedList == null)
        {
            Debug.LogError("사냥하던 리스트가 없음.");
        }

        //큰거 부터 잡되 안 되면 다음 놈으로 넘어가서 또 잡는 거.

        float usedCap = 0;

        for (int i = 0; i < huntedList.Count; i++)
        {
            usedCap += huntedList[i].GetWeight();
        }

        float tonightHuntingCap = capTillTonight - usedCap; //실제 오늘 사용할 수 있는 능력치.

        if (tonightHuntingCap <= 0)
        {
            return(null);
        }


        List <QuestPerMob> tonightHunt = new List <QuestPerMob>();    //오늘 잡을 애들 리스트

        var bo = from qpm in orderedQuestList
                 orderby qpm.GetMobEviTypeWeight() descending
                 select qpm;

        List <QuestPerMob> bigOrderedList = bo.ToList <QuestPerMob>();//가중치가 큰 애들 순서로 리스트를 맹긂

        bool matchedByHuntedAlready = false;

        for (int i = 0; i < bigOrderedList.Count; i++)
        {
            matchedByHuntedAlready = false;

            QuestPerMob bigOne   = bigOrderedList[i];
            E_Monster   mob      = bigOne.mob;
            E_Evidence  evidence = bigOne.evidence;

            float bigOneWeightForOne = bigOne.GetMobEviTypeWeight(); //지금 선택된 놈을 한 번 잡는데 소요되는 능력치.

            if (tonightHuntingCap < bigOneWeightForOne)              //제일 큰 놈을 하나 잡을 여유도 없으면.
            {
                continue;                                            //다음놈을 잡을 기회
            }


            for (int j = 0; j < huntedList.Count; j++)         //잡고 있던 녀석인지 체크 컴팩트 오더 경우 어떻게든 다음 빅 원으로 넘어가는 것.
            {
                if (huntedList[j].IsIt(mob, evidence))         //이미 잡고 있는 혹은 잡은 종류라면.
                {
                    if (huntedList[j].number >= bigOne.number) //다 잡은 종류라면.
                    {
                        matchedByHuntedAlready = true;
                        break;
                    }
                    else //잡다가 말은 경우라면.
                    {
                        int remainNum = bigOne.number - huntedList[j].number;
                        while (remainNum > 0)
                        {
                            tonightHunt.AddMobEviOnce(mob, evidence);
                            remainNum--;
                            tonightHuntingCap -= bigOneWeightForOne;
                            if (tonightHuntingCap < bigOneWeightForOne && remainNum > 0)//더 못잡는데 아직 남아있음.
                            {
                                matchedByHuntedAlready = true;
                                break;
                            }
                        }
                        matchedByHuntedAlready = true;  //뭐가 됐든 할 수 있는 한은 다 한것.
                    }
                }
            }

            if (matchedByHuntedAlready)
            {
                continue;                           //이미 잡던 놈이라, 처리가 끝남.
            }
            //잡고 있던 애가 아니라면

            int remainNumOfNewOne = bigOne.number;
            while (remainNumOfNewOne > 0)
            {
                tonightHunt.AddMobEviOnce(mob, evidence);
                remainNumOfNewOne--;
                tonightHuntingCap -= bigOneWeightForOne;
                if (tonightHuntingCap < bigOneWeightForOne && remainNumOfNewOne > 0) //더 못잡는데 아직 남아있음.
                {
                    break;                                                           //다음 빅 원으로 넘어감.
                }
            }
        }
        return(tonightHunt);
    }