Skip to content

Commit 4d8fecc

Browse files
committed
feat: Add auto create next challenge logic into CodeXPService and change some structure
- Change MutableMap<Event, MutableList<CodeXPChallenge>> type to MutableMap<Event, CodeXPChallenge> => Only one challenge can attach to one event. - Replace complete challenge to next level challenge and move it to completed challenges. - Add some challenges in Event.
1 parent 6344283 commit 4d8fecc

File tree

1 file changed

+136
-32
lines changed
  • src/main/kotlin/com/github/ilovegamecoding/intellijcodexp/services

1 file changed

+136
-32
lines changed

src/main/kotlin/com/github/ilovegamecoding/intellijcodexp/services/CodeXPService.kt

Lines changed: 136 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@ import com.github.ilovegamecoding.intellijcodexp.listeners.CodeXPListener
44
import com.github.ilovegamecoding.intellijcodexp.model.CodeXPChallenge
55
import com.intellij.openapi.application.ApplicationManager
66
import com.intellij.openapi.components.*
7-
import com.intellij.openapi.diagnostic.thisLogger
87
import com.intellij.util.messages.MessageBus
98
import com.intellij.util.messages.MessageBusConnection
109

@@ -33,10 +32,6 @@ class CodeXPService : PersistentStateComponent<CodeXPService.CodeXPState>, CodeX
3332
BUILD(5),
3433
RUN(10),
3534
DEBUG(20),
36-
COMMIT(8),
37-
PUSH(20),
38-
MERGE(10),
39-
PULL(5),
4035
ACTION(5);
4136
}
4237

@@ -67,7 +62,7 @@ class CodeXPService : PersistentStateComponent<CodeXPService.CodeXPState>, CodeX
6762
/**
6863
* Challenges that not yet been completed.
6964
*/
70-
var challenges: MutableMap<Event, MutableList<CodeXPChallenge>> = mutableMapOf(),
65+
var challenges: MutableMap<Event, CodeXPChallenge> = mutableMapOf(),
7166

7267
/**
7368
* Challenges that have been completed.
@@ -116,10 +111,108 @@ class CodeXPService : PersistentStateComponent<CodeXPService.CodeXPState>, CodeX
116111
CodeXPChallenge(
117112
event = Event.TYPING,
118113
name = "Typing Challenge",
119-
description = "Just type. We will give you XP for it.",
114+
description = "Typing [goal] times.",
115+
progress = 0,
116+
goal = 100,
117+
goalIncrement = 100,
118+
rewardXP = 100,
119+
rewardXPIncrement = 200
120+
)
121+
)
122+
addChallenge(
123+
CodeXPChallenge(
124+
event = Event.PASTE,
125+
name = "Paste Challenge",
126+
description = "Paste [goal] times.",
127+
progress = 0,
128+
goal = 10,
129+
goalIncrement = 10,
130+
rewardXP = 100,
131+
rewardXPIncrement = 150
132+
)
133+
)
134+
addChallenge(
135+
CodeXPChallenge(
136+
event = Event.BACKSPACE,
137+
name = "Backspace Challenge",
138+
description = "Press the backspace key [goal] times.",
139+
progress = 0,
140+
goal = 50,
141+
goalIncrement = 50,
142+
rewardXP = 100,
143+
rewardXPIncrement = 150
144+
)
145+
)
146+
addChallenge(
147+
CodeXPChallenge(
148+
event = Event.TAB,
149+
name = "Tab Challenge",
150+
description = "Press the tab key [goal] times.",
151+
progress = 0,
152+
goal = 50,
153+
goalIncrement = 50,
154+
rewardXP = 100,
155+
rewardXPIncrement = 150
156+
)
157+
)
158+
addChallenge(
159+
CodeXPChallenge(
160+
event = Event.SAVE,
161+
name = "Save Challenge",
162+
description = "Save [goal] times.",
163+
progress = 0,
164+
goal = 10,
165+
goalIncrement = 10,
166+
rewardXP = 300,
167+
rewardXPIncrement = 400
168+
)
169+
)
170+
addChallenge(
171+
CodeXPChallenge(
172+
event = Event.BUILD,
173+
name = "Build Challenge",
174+
description = "Build [goal] times.",
120175
progress = 0,
121176
goal = 10,
177+
goalIncrement = 10,
178+
rewardXP = 150,
179+
rewardXPIncrement = 200
180+
)
181+
)
182+
addChallenge(
183+
CodeXPChallenge(
184+
event = Event.RUN,
185+
name = "Run Challenge",
186+
description = "Run [goal] times.",
187+
progress = 0,
188+
goal = 10,
189+
goalIncrement = 10,
190+
rewardXP = 200,
191+
rewardXPIncrement = 250
192+
)
193+
)
194+
addChallenge(
195+
CodeXPChallenge(
196+
event = Event.DEBUG,
197+
name = "Debug Challenge",
198+
description = "Debug [goal] times.",
199+
progress = 0,
200+
goal = 10,
201+
goalIncrement = 10,
202+
rewardXP = 300,
203+
rewardXPIncrement = 400
204+
)
205+
)
206+
addChallenge(
207+
CodeXPChallenge(
208+
event = Event.ACTION,
209+
name = "Action Challenge",
210+
description = "Perform [goal] actions.",
211+
progress = 0,
212+
goal = 20,
213+
goalIncrement = 20,
122214
rewardXP = 100,
215+
rewardXPIncrement = 120
123216
)
124217
)
125218
}
@@ -156,10 +249,7 @@ class CodeXPService : PersistentStateComponent<CodeXPService.CodeXPState>, CodeX
156249
* @param challenge The challenge to add.
157250
*/
158251
fun addChallenge(challenge: CodeXPChallenge) {
159-
if (codeXPState.challenges[challenge.event] == null) {
160-
codeXPState.challenges[challenge.event] = mutableListOf()
161-
}
162-
codeXPState.challenges[challenge.event]?.add(challenge)
252+
codeXPState.challenges[challenge.event] = challenge
163253
}
164254

165255
/**
@@ -168,30 +258,44 @@ class CodeXPService : PersistentStateComponent<CodeXPService.CodeXPState>, CodeX
168258
* @param event The event to check for challenges
169259
*/
170260
fun checkChallenge(event: Event) {
171-
codeXPState.challenges[event]?.let { challenges -> // If there are challenges for the event
172-
// Create a list of completed challenges
173-
val completedChallenges = mutableListOf<CodeXPChallenge>()
174-
175-
for (challenge in challenges) {
176-
// Increment the challenge progress
177-
challenge.progress += 1
178-
179-
if (challenge.progress >= challenge.goal) { // If the challenge is completed
180-
thisLogger().warn("Challenge completed: ${challenge.name}")
261+
codeXPState.challenges[event]?.let { challenge ->
262+
challenge.progress += 1
181263

182-
// Add the challenge to the completedChallenges list
183-
completedChallenges.add(challenge)
184-
185-
// Add the reward XP to the user's XP
186-
codeXPState.xp += challenge.rewardXP
187-
}
264+
if (challenge.progress >= challenge.goal) {
265+
codeXPState.xp += challenge.rewardXP
266+
replaceChallengeWithNew(challenge, event)
188267
}
268+
}
269+
}
189270

190-
// Remove completed challenges
191-
challenges.removeAll(completedChallenges)
271+
/**
272+
* Replace a completed challenge with a new challenge with an increased goal.
273+
*
274+
* @param completedChallenge The completed challenge.
275+
* @param event The type of the completed challenge.
276+
*/
277+
private fun replaceChallengeWithNew(completedChallenge: CodeXPChallenge, event: Event) {
278+
codeXPState.completedChallenges.add(completedChallenge)
279+
codeXPState.challenges[event] = createNextChallenge(
280+
completedChallenge
281+
)
282+
}
192283

193-
// Add the completed challenges to the completedChallenges list
194-
codeXPState.completedChallenges.addAll(completedChallenges)
195-
}
284+
/**
285+
* Create a new challenge with an increased goal.
286+
*
287+
* @param completedChallenge The completed challenge.
288+
*/
289+
private fun createNextChallenge(completedChallenge: CodeXPChallenge): CodeXPChallenge {
290+
return CodeXPChallenge(
291+
event = completedChallenge.event,
292+
name = completedChallenge.name,
293+
description = completedChallenge.description,
294+
rewardXP = completedChallenge.rewardXP + completedChallenge.rewardXPIncrement,
295+
rewardXPIncrement = completedChallenge.rewardXPIncrement,
296+
progress = 0,
297+
goal = completedChallenge.goal + completedChallenge.goalIncrement,
298+
goalIncrement = completedChallenge.goalIncrement
299+
)
196300
}
197301
}

0 commit comments

Comments
 (0)