private void Update(kcsapi_questlist questlist)
{
this.IsUntaken = false;
// キャッシュしてるページの数が、取得したページ数 (api_page_count) より大きいとき
// 取得したページ数と同じ数になるようにキャッシュしてるページを減らす
if (this.questPages.Count > questlist.api_page_count)
{
while (this.questPages.Count > questlist.api_page_count) this.questPages.RemoveAt(this.questPages.Count - 1);
}
// 小さいときは、キャッシュしたページ数と同じ数になるようにページを増やす
else if (this.questPages.Count < questlist.api_page_count)
{
while (this.questPages.Count < questlist.api_page_count) this.questPages.Add(null);
}
if (questlist.api_list == null)
{
this.IsEmpty = true;
this.All = this.Current = new List<Quest>();
}
else
{
var page = questlist.api_disp_page - 1;
if (page >= this.questPages.Count) page = this.questPages.Count - 1;
this.questPages[page] = new ConcurrentDictionary<int, Quest>();
this.IsEmpty = false;
questlist.api_list.Select(x => new Quest(x))
.ForEach(x => this.questPages[page].AddOrUpdate(x.Id, x, (_, __) => x));
this.All = this.questPages.Where(x => x != null)
.SelectMany(x => x.Select(kvp => kvp.Value))
.Distinct(x => x.Id)
.OrderBy(x => x.Id)
.ToList();
var current = this.All.Where(x => x.State == QuestState.TakeOn || x.State == QuestState.Accomplished)
.OrderBy(x => x.Id)
.ToList();
// 遂行中の任務数に満たない場合、未取得分として null で埋める
while (current.Count < questlist.api_exec_count) current.Add(null);
this.Current = current;
}
}
}