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); }
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); }