slashvibe-mcp 0.3.21 → 0.3.23
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +280 -47
- package/auto-update.js +10 -15
- package/config.js +36 -31
- package/crypto.js +1 -6
- package/debug.js +12 -0
- package/discord.js +19 -19
- package/eslint.config.js +54 -0
- package/index.js +217 -207
- package/intelligence/index.js +2 -9
- package/intelligence/infer.js +10 -16
- package/intelligence/patterns.js +23 -18
- package/intelligence/proactive.js +16 -15
- package/intelligence/serendipity.js +57 -20
- package/memory.js +13 -8
- package/migrate-v2.js +72 -0
- package/notification-emitter.js +2 -2
- package/notify.js +39 -14
- package/package.json +28 -29
- package/post-install.js +141 -0
- package/presence.js +2 -2
- package/prompts.js +5 -9
- package/protocol/index.js +123 -87
- package/protocol/telegram-commands.js +36 -37
- package/store/api.js +358 -529
- package/store/local.js +9 -10
- package/store/profiles.js +48 -192
- package/store/reservations.js +2 -9
- package/store/skills.js +69 -71
- package/store/sqlite.js +355 -0
- package/test-skills-bootstrap.js +20 -0
- package/test-v2-integration.js +385 -0
- package/tools/_actions.js +48 -387
- package/tools/_connection-queue.js +45 -56
- package/tools/_discovery-enhanced.js +52 -57
- package/tools/_discovery.js +87 -185
- package/tools/{l2-status.js → _experimental/l2-status.js} +68 -70
- package/tools/{shipback.js → _experimental/shipback.js} +4 -3
- package/tools/_proactive-discovery.js +60 -73
- package/tools/_shared/index.js +41 -64
- package/tools/admin-inbox.js +10 -15
- package/tools/agents.js +1 -1
- package/tools/artifact-create.js +13 -23
- package/tools/artifact-view.js +4 -4
- package/tools/{_deprecated/back.js → back.js} +1 -1
- package/tools/bye.js +3 -5
- package/tools/consent.js +2 -2
- package/tools/context.js +9 -10
- package/tools/crossword.js +3 -2
- package/tools/discover.js +94 -356
- package/tools/dm.js +27 -86
- package/tools/doctor.js +12 -41
- package/tools/drawing.js +34 -20
- package/tools/echo.js +11 -11
- package/tools/feed.js +30 -58
- package/tools/follow.js +64 -187
- package/tools/{_deprecated/forget.js → forget.js} +4 -7
- package/tools/game.js +144 -48
- package/tools/handoff.js +6 -8
- package/tools/help.js +3 -3
- package/tools/idea.js +15 -27
- package/tools/inbox.js +121 -293
- package/tools/init.js +54 -151
- package/tools/invite.js +8 -21
- package/tools/migrate.js +27 -24
- package/tools/multiplayer-game.js +50 -40
- package/tools/{_deprecated/mute.js → mute.js} +4 -3
- package/tools/notifications.js +58 -48
- package/tools/observe.js +12 -15
- package/tools/onboarding.js +8 -11
- package/tools/open.js +13 -144
- package/tools/party-game.js +23 -12
- package/tools/patterns.js +2 -1
- package/tools/ping.js +5 -7
- package/tools/react.js +28 -30
- package/tools/{_deprecated/recall.js → recall.js} +5 -10
- package/tools/release.js +4 -2
- package/tools/{_deprecated/remember.js → remember.js} +4 -6
- package/tools/report.js +2 -2
- package/tools/request.js +6 -26
- package/tools/reserve.js +1 -1
- package/tools/session-fork.js +97 -0
- package/tools/session-save.js +109 -0
- package/tools/settings.js +30 -99
- package/tools/ship.js +74 -56
- package/tools/{_deprecated/skills-exchange.js → skills-exchange.js} +38 -39
- package/tools/social-inbox.js +22 -28
- package/tools/social-post.js +24 -27
- package/tools/solo-game.js +54 -46
- package/tools/start.js +14 -148
- package/tools/status.js +21 -68
- package/tools/submit.js +4 -2
- package/tools/suggest-tags.js +36 -33
- package/tools/summarize.js +19 -16
- package/tools/tag-suggestions.js +72 -73
- package/tools/test.js +1 -1
- package/tools/{_deprecated/tictactoe.js → tictactoe.js} +26 -26
- package/tools/token.js +4 -4
- package/tools/update.js +1 -2
- package/tools/watch.js +132 -112
- package/tools/who.js +20 -40
- package/tools/{_deprecated/wordassociation.js → wordassociation.js} +23 -20
- package/tools/workshop-buddy.js +52 -53
- package/tools/x-mentions.js +0 -1
- package/tools/x-reply.js +0 -1
- package/twitter.js +14 -20
- package/version.json +8 -10
- package/webhook-runner.js +132 -0
- package/auth-store.js +0 -148
- package/bridges/bridge-monitor.js +0 -388
- package/bridges/discord-bot.js +0 -431
- package/bridges/farcaster.js +0 -299
- package/bridges/telegram.js +0 -261
- package/bridges/webhook-health.js +0 -420
- package/bridges/webhook-server.js +0 -437
- package/bridges/whatsapp.js +0 -441
- package/bridges/x-webhook.js +0 -423
- package/games/arcade.js +0 -406
- package/games/chess.js +0 -451
- package/games/colorguess.js +0 -343
- package/games/crossword-words.js +0 -171
- package/games/crossword.js +0 -461
- package/games/drawing.js +0 -347
- package/games/gameroulette.js +0 -300
- package/games/gamerouter.js +0 -336
- package/games/gamestatus.js +0 -337
- package/games/guessnumber.js +0 -209
- package/games/hangman.js +0 -279
- package/games/memory.js +0 -338
- package/games/multiplayer-tictactoe.js +0 -389
- package/games/pixelart.js +0 -399
- package/games/quickduel.js +0 -354
- package/games/riddle.js +0 -371
- package/games/rockpaperscissors.js +0 -291
- package/games/snake.js +0 -406
- package/games/storybuilder.js +0 -343
- package/games/tictactoe.js +0 -345
- package/games/twentyquestions.js +0 -286
- package/games/twotruths.js +0 -207
- package/games/werewolf.js +0 -508
- package/games/wordassociation.js +0 -247
- package/games/wordchain.js +0 -135
- package/intelligence/interests.js +0 -369
- package/setup.js +0 -480
- package/smart-inbox.js +0 -276
- package/tools/_deprecated/auto-suggest-connections.js +0 -304
- package/tools/_deprecated/bootstrap-skills.js +0 -231
- package/tools/_deprecated/bridge-dashboard.js +0 -342
- package/tools/_deprecated/bridge-health.js +0 -400
- package/tools/_deprecated/bridge-live.js +0 -384
- package/tools/_deprecated/bridges.js +0 -383
- package/tools/_deprecated/colorguess.js +0 -281
- package/tools/_deprecated/discover-insights.js +0 -379
- package/tools/_deprecated/discover-momentum.js +0 -256
- package/tools/_deprecated/discovery-analytics.js +0 -345
- package/tools/_deprecated/discovery-auto-suggest.js +0 -275
- package/tools/_deprecated/discovery-bootstrap.js +0 -267
- package/tools/_deprecated/discovery-daily.js +0 -375
- package/tools/_deprecated/discovery-dashboard.js +0 -385
- package/tools/_deprecated/discovery-digest.js +0 -314
- package/tools/_deprecated/discovery-hub.js +0 -357
- package/tools/_deprecated/discovery-insights.js +0 -384
- package/tools/_deprecated/discovery-momentum.js +0 -281
- package/tools/_deprecated/discovery-monitor.js +0 -319
- package/tools/_deprecated/discovery-proactive.js +0 -300
- package/tools/_deprecated/draw.js +0 -317
- package/tools/_deprecated/farcaster.js +0 -307
- package/tools/_deprecated/games-catalog.js +0 -376
- package/tools/_deprecated/games.js +0 -313
- package/tools/_deprecated/guessnumber.js +0 -194
- package/tools/_deprecated/hangman.js +0 -129
- package/tools/_deprecated/multiplayer-tictactoe.js +0 -303
- package/tools/_deprecated/riddle.js +0 -240
- package/tools/_deprecated/run-bootstrap.js +0 -69
- package/tools/_deprecated/skills-analytics.js +0 -349
- package/tools/_deprecated/skills-bootstrap.js +0 -301
- package/tools/_deprecated/skills-dashboard.js +0 -268
- package/tools/_deprecated/skills.js +0 -380
- package/tools/_deprecated/smart-intro.js +0 -353
- package/tools/_deprecated/storybuilder.js +0 -331
- package/tools/_deprecated/telegram-bot.js +0 -183
- package/tools/_deprecated/telegram-setup.js +0 -214
- package/tools/_deprecated/twentyquestions.js +0 -143
- package/tools/_shared.js +0 -234
- package/tools/_work-context.js +0 -338
- package/tools/_work-context.manual-test.js +0 -199
- package/tools/_work-context.test.js +0 -260
- package/tools/activity.js +0 -220
- package/tools/agent-treasury.js +0 -288
- package/tools/analytics.js +0 -191
- package/tools/approve.js +0 -197
- package/tools/arcade.js +0 -173
- package/tools/artifacts-price.js +0 -107
- package/tools/ask-expert.js +0 -160
- package/tools/available.js +0 -120
- package/tools/become-expert.js +0 -150
- package/tools/broadcast.js +0 -325
- package/tools/chat.js +0 -202
- package/tools/collaborative-drawing.js +0 -286
- package/tools/connection-status.js +0 -178
- package/tools/earnings.js +0 -126
- package/tools/friends.js +0 -207
- package/tools/genesis.js +0 -233
- package/tools/gig-browse.js +0 -206
- package/tools/gig-complete.js +0 -144
- package/tools/health.js +0 -87
- package/tools/leaderboard.js +0 -117
- package/tools/lib/git-apply.js +0 -206
- package/tools/lib/git-bundle.js +0 -407
- package/tools/mint.js +0 -377
- package/tools/plan.js +0 -225
- package/tools/profile.js +0 -219
- package/tools/proof-of-work.js +0 -144
- package/tools/pulse.js +0 -218
- package/tools/reply.js +0 -166
- package/tools/reputation.js +0 -175
- package/tools/schedule.js +0 -367
- package/tools/search-messages.js +0 -123
- package/tools/session.js +0 -467
- package/tools/session_price.js +0 -128
- package/tools/smart-check.js +0 -201
- package/tools/social-processor.js +0 -445
- package/tools/streak.js +0 -147
- package/tools/stuck.js +0 -297
- package/tools/subscribe.js +0 -148
- package/tools/subscriptions.js +0 -134
- package/tools/tip.js +0 -193
- package/tools/wallet.js +0 -269
- package/tools/webhook-test.js +0 -388
- package/tools/withdraw.js +0 -145
- package/tools/work-summary.js +0 -96
- package/tools/workshop.js +0 -327
- /package/tools/{l2-bridge.js → _experimental/l2-bridge.js} +0 -0
- /package/tools/{l2.js → _experimental/l2.js} +0 -0
- /package/tools/{_deprecated/away.js → away.js} +0 -0
package/games/memory.js
DELETED
|
@@ -1,338 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Memory Pattern Game implementation for /vibe
|
|
3
|
-
* Challenge your memory with increasingly complex emoji sequences!
|
|
4
|
-
* Like Simon Says but with colorful emojis - perfect for quick brain training
|
|
5
|
-
*/
|
|
6
|
-
|
|
7
|
-
// Available pattern emojis - visually distinct and memorable
|
|
8
|
-
const PATTERN_EMOJIS = ['🔴', '🟡', '🟢', '🔵', '🟣', '🟠', '⚫', '⚪'];
|
|
9
|
-
|
|
10
|
-
// Difficulty levels affect sequence length and speed
|
|
11
|
-
const DIFFICULTY_LEVELS = {
|
|
12
|
-
easy: {
|
|
13
|
-
name: 'Easy',
|
|
14
|
-
emoji: '🟢',
|
|
15
|
-
startLength: 3,
|
|
16
|
-
maxLength: 6,
|
|
17
|
-
emojiCount: 4, // Use fewer emojis
|
|
18
|
-
description: 'Short sequences, 4 colors'
|
|
19
|
-
},
|
|
20
|
-
medium: {
|
|
21
|
-
name: 'Medium',
|
|
22
|
-
emoji: '🟡',
|
|
23
|
-
startLength: 4,
|
|
24
|
-
maxLength: 8,
|
|
25
|
-
emojiCount: 6,
|
|
26
|
-
description: 'Medium sequences, 6 colors'
|
|
27
|
-
},
|
|
28
|
-
hard: {
|
|
29
|
-
name: 'Hard',
|
|
30
|
-
emoji: '🔴',
|
|
31
|
-
startLength: 5,
|
|
32
|
-
maxLength: 10,
|
|
33
|
-
emojiCount: 8,
|
|
34
|
-
description: 'Long sequences, all 8 colors'
|
|
35
|
-
}
|
|
36
|
-
};
|
|
37
|
-
|
|
38
|
-
// Fun encouragement messages
|
|
39
|
-
const ENCOURAGEMENT = [
|
|
40
|
-
"Great memory! 🧠", "You're on fire! 🔥", "Excellent recall! ⭐",
|
|
41
|
-
"Perfect! 💫", "Amazing focus! 🎯", "Memory master! 👑",
|
|
42
|
-
"Brilliant! ✨", "Outstanding! 🌟", "Incredible! 🚀"
|
|
43
|
-
];
|
|
44
|
-
|
|
45
|
-
const WRONG_MESSAGES = [
|
|
46
|
-
"Close, but not quite! 🤔", "Almost had it! 💭", "Good try! 🎯",
|
|
47
|
-
"So close! 😅", "Keep practicing! 💪", "Nearly perfect! 🌟"
|
|
48
|
-
];
|
|
49
|
-
|
|
50
|
-
// Create initial memory game state
|
|
51
|
-
function createInitialMemoryState(difficulty = 'medium') {
|
|
52
|
-
const difficultyConfig = DIFFICULTY_LEVELS[difficulty] || DIFFICULTY_LEVELS.medium;
|
|
53
|
-
const availableEmojis = PATTERN_EMOJIS.slice(0, difficultyConfig.emojiCount);
|
|
54
|
-
|
|
55
|
-
// Generate first pattern
|
|
56
|
-
const pattern = generatePattern(availableEmojis, difficultyConfig.startLength);
|
|
57
|
-
|
|
58
|
-
return {
|
|
59
|
-
difficulty: difficulty,
|
|
60
|
-
difficultyConfig: difficultyConfig,
|
|
61
|
-
availableEmojis: availableEmojis,
|
|
62
|
-
currentPattern: pattern,
|
|
63
|
-
playerInput: [],
|
|
64
|
-
level: 1,
|
|
65
|
-
score: 0,
|
|
66
|
-
gameOver: false,
|
|
67
|
-
won: false,
|
|
68
|
-
showingPattern: true,
|
|
69
|
-
inputPhase: false,
|
|
70
|
-
consecutiveCorrect: 0,
|
|
71
|
-
totalCorrect: 0,
|
|
72
|
-
totalAttempts: 0,
|
|
73
|
-
startTime: Date.now(),
|
|
74
|
-
lastResult: null,
|
|
75
|
-
maxLevelReached: 1
|
|
76
|
-
};
|
|
77
|
-
}
|
|
78
|
-
|
|
79
|
-
// Generate a random pattern of emojis
|
|
80
|
-
function generatePattern(availableEmojis, length) {
|
|
81
|
-
const pattern = [];
|
|
82
|
-
for (let i = 0; i < length; i++) {
|
|
83
|
-
const randomEmoji = availableEmojis[Math.floor(Math.random() * availableEmojis.length)];
|
|
84
|
-
pattern.push(randomEmoji);
|
|
85
|
-
}
|
|
86
|
-
return pattern;
|
|
87
|
-
}
|
|
88
|
-
|
|
89
|
-
// Start the input phase (player can now enter their guess)
|
|
90
|
-
function startInput(gameState) {
|
|
91
|
-
if (gameState.gameOver) {
|
|
92
|
-
return { error: 'Game is over! Start a new game to play again.' };
|
|
93
|
-
}
|
|
94
|
-
|
|
95
|
-
if (!gameState.showingPattern) {
|
|
96
|
-
return { error: 'Already in input phase! Enter your pattern guess.' };
|
|
97
|
-
}
|
|
98
|
-
|
|
99
|
-
return {
|
|
100
|
-
success: true,
|
|
101
|
-
gameState: {
|
|
102
|
-
...gameState,
|
|
103
|
-
showingPattern: false,
|
|
104
|
-
inputPhase: true,
|
|
105
|
-
playerInput: []
|
|
106
|
-
}
|
|
107
|
-
};
|
|
108
|
-
}
|
|
109
|
-
|
|
110
|
-
// Submit the complete pattern guess
|
|
111
|
-
function submitPattern(gameState, patternInput) {
|
|
112
|
-
if (gameState.gameOver) {
|
|
113
|
-
return { error: 'Game is over! Start a new game to play again.' };
|
|
114
|
-
}
|
|
115
|
-
|
|
116
|
-
if (gameState.showingPattern) {
|
|
117
|
-
return { error: 'Wait for the input phase! Use `/game memory --input` first.' };
|
|
118
|
-
}
|
|
119
|
-
|
|
120
|
-
if (!patternInput || typeof patternInput !== 'string') {
|
|
121
|
-
return { error: 'Please enter your pattern guess!' };
|
|
122
|
-
}
|
|
123
|
-
|
|
124
|
-
// Parse input - could be space-separated, comma-separated, or just concatenated
|
|
125
|
-
let inputEmojis;
|
|
126
|
-
if (patternInput.includes(' ')) {
|
|
127
|
-
inputEmojis = patternInput.split(' ').filter(e => e.trim().length > 0);
|
|
128
|
-
} else if (patternInput.includes(',')) {
|
|
129
|
-
inputEmojis = patternInput.split(',').map(e => e.trim()).filter(e => e.length > 0);
|
|
130
|
-
} else {
|
|
131
|
-
// Try to split emoji string (this is tricky, but we'll try character by character)
|
|
132
|
-
inputEmojis = Array.from(patternInput).filter(char =>
|
|
133
|
-
PATTERN_EMOJIS.includes(char)
|
|
134
|
-
);
|
|
135
|
-
}
|
|
136
|
-
|
|
137
|
-
// Validate input emojis
|
|
138
|
-
const invalidEmojis = inputEmojis.filter(emoji => !gameState.availableEmojis.includes(emoji));
|
|
139
|
-
if (invalidEmojis.length > 0) {
|
|
140
|
-
const validEmojis = gameState.availableEmojis.join(' ');
|
|
141
|
-
return { error: `Invalid emojis: ${invalidEmojis.join(' ')}. Use only: ${validEmojis}` };
|
|
142
|
-
}
|
|
143
|
-
|
|
144
|
-
// Check if pattern matches
|
|
145
|
-
const correct = arraysEqual(inputEmojis, gameState.currentPattern);
|
|
146
|
-
const newTotalAttempts = gameState.totalAttempts + 1;
|
|
147
|
-
const newTotalCorrect = correct ? gameState.totalCorrect + 1 : gameState.totalCorrect;
|
|
148
|
-
const newConsecutiveCorrect = correct ? gameState.consecutiveCorrect + 1 : 0;
|
|
149
|
-
|
|
150
|
-
let newGameState = {
|
|
151
|
-
...gameState,
|
|
152
|
-
playerInput: inputEmojis,
|
|
153
|
-
totalAttempts: newTotalAttempts,
|
|
154
|
-
totalCorrect: newTotalCorrect,
|
|
155
|
-
consecutiveCorrect: newConsecutiveCorrect,
|
|
156
|
-
lastResult: correct ? 'correct' : 'wrong',
|
|
157
|
-
inputPhase: false
|
|
158
|
-
};
|
|
159
|
-
|
|
160
|
-
if (correct) {
|
|
161
|
-
// Correct! Advance to next level
|
|
162
|
-
const newLevel = gameState.level + 1;
|
|
163
|
-
const newScore = gameState.score + (gameState.level * 10); // More points for harder levels
|
|
164
|
-
const maxLevelReached = Math.max(gameState.maxLevelReached, newLevel);
|
|
165
|
-
|
|
166
|
-
// Check if we've reached the maximum length for this difficulty
|
|
167
|
-
const maxLength = gameState.difficultyConfig.maxLength;
|
|
168
|
-
if (gameState.currentPattern.length >= maxLength) {
|
|
169
|
-
// Won the game!
|
|
170
|
-
newGameState = {
|
|
171
|
-
...newGameState,
|
|
172
|
-
gameOver: true,
|
|
173
|
-
won: true,
|
|
174
|
-
score: newScore,
|
|
175
|
-
level: newLevel,
|
|
176
|
-
maxLevelReached: maxLevelReached,
|
|
177
|
-
endTime: Date.now()
|
|
178
|
-
};
|
|
179
|
-
} else {
|
|
180
|
-
// Generate next pattern (slightly longer)
|
|
181
|
-
const nextLength = Math.min(
|
|
182
|
-
gameState.currentPattern.length + 1,
|
|
183
|
-
maxLength
|
|
184
|
-
);
|
|
185
|
-
const nextPattern = generatePattern(gameState.availableEmojis, nextLength);
|
|
186
|
-
|
|
187
|
-
newGameState = {
|
|
188
|
-
...newGameState,
|
|
189
|
-
currentPattern: nextPattern,
|
|
190
|
-
level: newLevel,
|
|
191
|
-
score: newScore,
|
|
192
|
-
maxLevelReached: maxLevelReached,
|
|
193
|
-
showingPattern: true,
|
|
194
|
-
playerInput: []
|
|
195
|
-
};
|
|
196
|
-
}
|
|
197
|
-
} else {
|
|
198
|
-
// Wrong! Game over
|
|
199
|
-
newGameState = {
|
|
200
|
-
...newGameState,
|
|
201
|
-
gameOver: true,
|
|
202
|
-
won: false,
|
|
203
|
-
endTime: Date.now()
|
|
204
|
-
};
|
|
205
|
-
}
|
|
206
|
-
|
|
207
|
-
return { success: true, gameState: newGameState };
|
|
208
|
-
}
|
|
209
|
-
|
|
210
|
-
// Helper function to compare arrays
|
|
211
|
-
function arraysEqual(a, b) {
|
|
212
|
-
if (a.length !== b.length) return false;
|
|
213
|
-
for (let i = 0; i < a.length; i++) {
|
|
214
|
-
if (a[i] !== b[i]) return false;
|
|
215
|
-
}
|
|
216
|
-
return true;
|
|
217
|
-
}
|
|
218
|
-
|
|
219
|
-
// Get a random encouragement message
|
|
220
|
-
function getRandomEncouragement() {
|
|
221
|
-
return ENCOURAGEMENT[Math.floor(Math.random() * ENCOURAGEMENT.length)];
|
|
222
|
-
}
|
|
223
|
-
|
|
224
|
-
function getRandomWrongMessage() {
|
|
225
|
-
return WRONG_MESSAGES[Math.floor(Math.random() * WRONG_MESSAGES.length)];
|
|
226
|
-
}
|
|
227
|
-
|
|
228
|
-
// Format memory game for display
|
|
229
|
-
function formatMemoryDisplay(gameState) {
|
|
230
|
-
const {
|
|
231
|
-
difficulty, difficultyConfig, currentPattern, playerInput, level, score,
|
|
232
|
-
gameOver, won, showingPattern, inputPhase, lastResult, consecutiveCorrect,
|
|
233
|
-
totalCorrect, totalAttempts, maxLevelReached, endTime, startTime
|
|
234
|
-
} = gameState;
|
|
235
|
-
|
|
236
|
-
let display = `🧠 **Memory Pattern Challenge** ${difficultyConfig.emoji} ${difficultyConfig.name.toUpperCase()}\n\n`;
|
|
237
|
-
|
|
238
|
-
// Show level and score
|
|
239
|
-
display += `**Level ${level}** • Score: ${score} • Streak: ${consecutiveCorrect}\n\n`;
|
|
240
|
-
|
|
241
|
-
// Game result
|
|
242
|
-
if (gameOver) {
|
|
243
|
-
if (won) {
|
|
244
|
-
display += `🏆 **CONGRATULATIONS! YOU WON!** 🏆\n`;
|
|
245
|
-
display += `You completed all ${maxLevelReached - 1} levels! ${getRandomEncouragement()}\n\n`;
|
|
246
|
-
} else {
|
|
247
|
-
display += `💥 **Game Over!** ${getRandomWrongMessage()}\n`;
|
|
248
|
-
display += `You reached level ${maxLevelReached} • Max sequence: ${currentPattern.length}\n\n`;
|
|
249
|
-
}
|
|
250
|
-
|
|
251
|
-
// Show final stats
|
|
252
|
-
const accuracy = totalAttempts > 0 ? Math.round((totalCorrect / totalAttempts) * 100) : 0;
|
|
253
|
-
const timeSeconds = Math.round((endTime - startTime) / 1000);
|
|
254
|
-
display += `**Final Stats:**\n`;
|
|
255
|
-
display += `• Accuracy: ${accuracy}% (${totalCorrect}/${totalAttempts})\n`;
|
|
256
|
-
display += `• Time: ${timeSeconds} seconds\n`;
|
|
257
|
-
display += `• Max Level: ${maxLevelReached}\n\n`;
|
|
258
|
-
|
|
259
|
-
display += `Start a new game to try again!\n`;
|
|
260
|
-
return display;
|
|
261
|
-
}
|
|
262
|
-
|
|
263
|
-
// Show pattern or input phase
|
|
264
|
-
if (showingPattern) {
|
|
265
|
-
display += `**🔍 MEMORIZE THIS PATTERN:**\n`;
|
|
266
|
-
display += `${currentPattern.join(' ')}\n\n`;
|
|
267
|
-
display += `**Sequence length:** ${currentPattern.length}\n`;
|
|
268
|
-
display += `*Study it carefully, then use \`/game memory --input\` when ready!*\n`;
|
|
269
|
-
} else if (inputPhase) {
|
|
270
|
-
display += `**🎯 INPUT PHASE**\n`;
|
|
271
|
-
display += `Enter the pattern you just saw!\n\n`;
|
|
272
|
-
display += `**Available emojis:** ${gameState.availableEmojis.join(' ')}\n`;
|
|
273
|
-
display += `**Expected length:** ${currentPattern.length}\n\n`;
|
|
274
|
-
|
|
275
|
-
if (playerInput.length > 0) {
|
|
276
|
-
display += `**Your input so far:** ${playerInput.join(' ')}\n`;
|
|
277
|
-
}
|
|
278
|
-
|
|
279
|
-
display += `*Use: \`/game memory --pattern "🔴 🟡 🟢"\` (space-separated)*\n`;
|
|
280
|
-
} else {
|
|
281
|
-
// Show result of last attempt
|
|
282
|
-
if (lastResult === 'correct') {
|
|
283
|
-
display += `✅ **Correct!** ${getRandomEncouragement()}\n`;
|
|
284
|
-
display += `You got: ${playerInput.join(' ')}\n`;
|
|
285
|
-
display += `Next pattern coming up...\n\n`;
|
|
286
|
-
|
|
287
|
-
display += `**🔍 MEMORIZE THIS PATTERN:**\n`;
|
|
288
|
-
display += `${currentPattern.join(' ')}\n\n`;
|
|
289
|
-
display += `**Sequence length:** ${currentPattern.length}\n`;
|
|
290
|
-
display += `*Study it, then use \`/game memory --input\` when ready!*\n`;
|
|
291
|
-
} else if (lastResult === 'wrong') {
|
|
292
|
-
display += `❌ **Incorrect!** ${getRandomWrongMessage()}\n`;
|
|
293
|
-
display += `You entered: ${playerInput.join(' ')}\n`;
|
|
294
|
-
display += `Correct was: ${currentPattern.join(' ')}\n\n`;
|
|
295
|
-
}
|
|
296
|
-
}
|
|
297
|
-
|
|
298
|
-
// Show difficulty info
|
|
299
|
-
display += `\n**Difficulty:** ${difficultyConfig.description}\n`;
|
|
300
|
-
|
|
301
|
-
return display;
|
|
302
|
-
}
|
|
303
|
-
|
|
304
|
-
// Get available difficulties
|
|
305
|
-
function getDifficulties() {
|
|
306
|
-
return Object.entries(DIFFICULTY_LEVELS).map(([key, config]) => ({
|
|
307
|
-
key,
|
|
308
|
-
name: config.name,
|
|
309
|
-
emoji: config.emoji,
|
|
310
|
-
description: config.description
|
|
311
|
-
}));
|
|
312
|
-
}
|
|
313
|
-
|
|
314
|
-
// Get game statistics
|
|
315
|
-
function getMemoryStats(gameState) {
|
|
316
|
-
const { level, score, consecutiveCorrect, totalCorrect, totalAttempts, maxLevelReached } = gameState;
|
|
317
|
-
|
|
318
|
-
return {
|
|
319
|
-
level,
|
|
320
|
-
score,
|
|
321
|
-
consecutiveCorrect,
|
|
322
|
-
totalCorrect,
|
|
323
|
-
totalAttempts,
|
|
324
|
-
accuracy: totalAttempts > 0 ? Math.round((totalCorrect / totalAttempts) * 100) : 0,
|
|
325
|
-
maxLevelReached
|
|
326
|
-
};
|
|
327
|
-
}
|
|
328
|
-
|
|
329
|
-
module.exports = {
|
|
330
|
-
createInitialMemoryState,
|
|
331
|
-
startInput,
|
|
332
|
-
submitPattern,
|
|
333
|
-
formatMemoryDisplay,
|
|
334
|
-
getDifficulties,
|
|
335
|
-
getMemoryStats,
|
|
336
|
-
PATTERN_EMOJIS,
|
|
337
|
-
DIFFICULTY_LEVELS
|
|
338
|
-
};
|