diff --git a/Lib9c/Battle/StageSimulator.cs b/Lib9c/Battle/StageSimulator.cs index 6a895fa4bb..0997089d7d 100644 --- a/Lib9c/Battle/StageSimulator.cs +++ b/Lib9c/Battle/StageSimulator.cs @@ -257,9 +257,9 @@ private void SetWave(StageSheet.Row stageRow, StageWaveSheet.Row stageWaveRow) { var enemyStatModifiers = stageRow.EnemyInitialStatModifiers; var waves = stageWaveRow.Waves; - foreach (var wave in waves - .Select(e => SpawnWave(e, enemyStatModifiers))) + foreach (var waveData in waves) { + var wave = SpawnWave(waveData, enemyStatModifiers); _waves.Add(wave); } } diff --git a/Lib9c/Battle/WeightedSelector.cs b/Lib9c/Battle/WeightedSelector.cs index 1f05675bcb..3549a233c4 100644 --- a/Lib9c/Battle/WeightedSelector.cs +++ b/Lib9c/Battle/WeightedSelector.cs @@ -49,13 +49,17 @@ public IEnumerable Select(int count) var result = new List(); var weight = 0m; var rnd = _random.Next(1, 100001) * 0.00001m; - var sum = _items.Sum(i => i.Weight); + decimal sum = 0; + foreach (var item in _items) + { + sum += item.Weight; + } var ratio = 1.0m / sum; while (result.Count < count) { - foreach (var item in _items.OrderBy(i => i.Weight).ToList()) + foreach (var item in _items.OrderBy(i => i.Weight)) { - weight += (item.Weight * ratio); + weight += item.Weight * ratio; if (rnd <= weight) { diff --git a/Lib9c/Model/Quest/QuestList.cs b/Lib9c/Model/Quest/QuestList.cs index 1205b0716a..db2e6bf5f1 100644 --- a/Lib9c/Model/Quest/QuestList.cs +++ b/Lib9c/Model/Quest/QuestList.cs @@ -235,28 +235,34 @@ public void UpdateTradeQuest(TradeType type, FungibleAssetValue price) public void UpdateStageQuest(CollectionMap stageMap) { - var stageQuests = _quests.OfType(); - foreach (var quest in stageQuests) + foreach (var quest in _quests) { - quest.Update(stageMap); + if (quest is WorldQuest worldQuest) + { + worldQuest.Update(stageMap); + } } } public void UpdateMonsterQuest(CollectionMap monsterMap) { - var monsterQuests = _quests.OfType(); - foreach (var quest in monsterQuests) + foreach (var quest in _quests) { - quest.Update(monsterMap); + if (quest is MonsterQuest monsterQuest) + { + monsterQuest.Update(monsterMap); + } } } public void UpdateCollectQuest(CollectionMap itemMap) { - var collectQuests = _quests.OfType(); - foreach (var quest in collectQuests) + foreach (var quest in _quests) { - quest.Update(itemMap); + if (quest is CollectQuest collectQuest) + { + collectQuest.Update(itemMap); + } } } @@ -326,10 +332,8 @@ public IValue Serialize() return Dictionary.Empty .SetItem(ListVersionKey, _listVersion.Serialize()) .SetItem(QuestsKey, (IValue) new List(_quests - .OrderBy(i => i.Id) .Select(q => q.Serialize()))) .SetItem(CompletedQuestIdsKey, (IValue) new List(completedQuestIds - .OrderBy(i => i) .Select(i => i.Serialize()))); } diff --git a/Lib9c/Model/State/AvatarState.cs b/Lib9c/Model/State/AvatarState.cs index a9ff513a8a..48267cce17 100644 --- a/Lib9c/Model/State/AvatarState.cs +++ b/Lib9c/Model/State/AvatarState.cs @@ -523,18 +523,16 @@ public void UpdateFromQuestReward2(Quest.Quest quest, MaterialItemSheet material public void UpdateQuestRewards(MaterialItemSheet materialItemSheet) { - var completedQuests = questList - .Where(quest => quest.Complete && !quest.IsPaidInAction) - .ToList(); - // 완료되었지만 보상을 받지 않은 퀘스트를 return 문에서 Select 하지 않고 미리 저장하는 이유는 - // 지연된 실행에 의해, return 시점에서 이미 모든 퀘스트의 보상 처리가 완료된 상태에서 - // completed를 호출 시 where문의 predicate가 평가되어 컬렉션이 텅 비기 때문이다. - var completedQuestIds = completedQuests.Select(quest => quest.Id).ToList(); - foreach (var quest in completedQuests) + var completedQuestIds = new List(); + foreach (var quest in questList) { + if (!quest.Complete || quest.IsPaidInAction) + { + continue; + } + completedQuestIds.Add(quest.Id); UpdateFromQuestReward(quest, materialItemSheet); } - questList.completedQuestIds = completedQuestIds; }