-
Notifications
You must be signed in to change notification settings - Fork 7
/
Copy pathredux.es
118 lines (108 loc) · 3.04 KB
/
redux.es
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
import { forEach, range, get, mapValues } from 'lodash'
import { copyIfSame } from 'views/utils/tools'
import { QuestHelper, questDataMap } from 'kcwiki-quest-data'
const initState = {
quests: {},
questStatus: {},
}
/* questStatus
*/
const [COMPLETED, AVAILABLE, UNAVAILABLE] = range(1, 4)
const typeFreqs = [0, 1, 6, 4, 5, 5, 3, 2]
// Will modify `status`
function updateQuestStatus(quests, qid, status) {
const quest = quests[qid]
if (!quest) {
return
}
quest.postquest.forEach(pid => {
const postq = quests[pid]
if (!postq) {
return
}
if (
typeFreqs[quest.type] <= typeFreqs[postq.type] &&
status[postq.game_id] !== UNAVAILABLE
) {
status[postq.game_id] = UNAVAILABLE // eslint-disable-line no-param-reassign
updateQuestStatus(quests, postq.game_id, status)
}
})
}
export function reducer(state = initState, action) {
const { type, body, postBody } = action
switch (type) {
case '@@poi-plugin-quest-info@init': {
const { quests, questStatus } = action
return {
...state,
quests,
questStatus,
}
}
case '@@Response/kcsapi/api_get_member/questlist': {
let { questStatus } = state
const { quests } = state
const statusBackup = questStatus
forEach(body.api_list, quest => {
// `quest` may be -1
if (!quest || typeof quest !== 'object') {
return
}
if (state.questStatus[quest.api_no] !== AVAILABLE) {
questStatus = copyIfSame(questStatus, statusBackup)
questStatus[quest.api_no] = AVAILABLE
updateQuestStatus(quests, quest.api_no, questStatus)
}
})
if (questStatus !== statusBackup) {
return {
...state,
questStatus,
}
}
break
}
case '@@Response/kcsapi/api_req_quest/clearitemget': {
const qid = parseInt(postBody.api_quest_id, 10)
const { quests } = state
const questStatus = { ...state.questStatus }
questStatus[qid] = 1
get(quests, [qid, 'postquest'], []).forEach(postq => {
if (questStatus[postq] !== UNAVAILABLE) {
return
}
const clearflag = get(quests, [postq, 'prerequisite'], []).every(
prereq => questStatus[prereq] === COMPLETED,
)
if (clearflag) {
questStatus[postq] = AVAILABLE
}
})
return {
...state,
questStatus,
}
}
default:
}
return state
}
export const readQuestInfo = () => {
const quests = questDataMap
forEach(quests, quest => {
// Initialize `quests`
const questHelper = QuestHelper.of(quest)
// eslint-disable-next-line no-param-reassign
quest.condition = questHelper.translate(window.language)
// eslint-disable-next-line no-param-reassign
quest.postquest = questHelper.getPostQuest().map(q => q.unwrap().game_id)
})
// Initialize `questStatus`
const questStatus = mapValues(quests, () => COMPLETED)
return {
type: '@@poi-plugin-quest-info@init',
quests,
questStatus,
}
}