ThiagoGM commited on
Commit
021fb1b
·
verified ·
1 Parent(s): 68eacb8

Add 2 files

Browse files
Files changed (2) hide show
  1. README.md +7 -5
  2. index.html +1529 -19
README.md CHANGED
@@ -1,10 +1,12 @@
1
  ---
2
- title: Learn2
3
- emoji: 🏢
4
- colorFrom: pink
5
- colorTo: green
6
  sdk: static
7
  pinned: false
 
 
8
  ---
9
 
10
- Check out the configuration reference at https://huggingface.co/docs/hub/spaces-config-reference
 
1
  ---
2
+ title: learn2
3
+ emoji: 🐳
4
+ colorFrom: green
5
+ colorTo: blue
6
  sdk: static
7
  pinned: false
8
+ tags:
9
+ - deepsite
10
  ---
11
 
12
+ Check out the configuration reference at https://huggingface.co/docs/hub/spaces-config-reference
index.html CHANGED
@@ -1,19 +1,1529 @@
1
- <!doctype html>
2
- <html>
3
- <head>
4
- <meta charset="utf-8" />
5
- <meta name="viewport" content="width=device-width" />
6
- <title>My static Space</title>
7
- <link rel="stylesheet" href="style.css" />
8
- </head>
9
- <body>
10
- <div class="card">
11
- <h1>Welcome to your static Space!</h1>
12
- <p>You can modify this app directly by editing <i>index.html</i> in the Files and versions tab.</p>
13
- <p>
14
- Also don't forget to check the
15
- <a href="https://huggingface.co/docs/hub/spaces" target="_blank">Spaces documentation</a>.
16
- </p>
17
- </div>
18
- </body>
19
- </html>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <!DOCTYPE html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="UTF-8">
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
+ <title>WordQuest - English Learning RPG</title>
7
+ <script src="https://cdn.tailwindcss.com"></script>
8
+ <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css">
9
+ <style>
10
+ @import url('https://fonts.googleapis.com/css2?family=Poppins:wght@400;600;700;800&display=swap');
11
+
12
+ body {
13
+ font-family: 'Poppins', sans-serif;
14
+ -webkit-tap-highlight-color: transparent;
15
+ background-color: #1a1a2e;
16
+ color: #ffffff;
17
+ overflow-x: hidden;
18
+ touch-action: manipulation;
19
+ }
20
+
21
+ .game-container {
22
+ max-width: 100%;
23
+ height: 100vh;
24
+ overflow: hidden;
25
+ position: relative;
26
+ }
27
+
28
+ .world-map {
29
+ background-image: url('https://i.imgur.com/JjQZQ9W.png');
30
+ background-size: cover;
31
+ background-position: center;
32
+ width: 200%;
33
+ height: 200%;
34
+ position: absolute;
35
+ transition: transform 0.5s cubic-bezier(0.22, 1, 0.36, 1);
36
+ }
37
+
38
+ .hud {
39
+ position: fixed;
40
+ top: 0;
41
+ left: 0;
42
+ right: 0;
43
+ padding: 12px;
44
+ display: flex;
45
+ justify-content: space-between;
46
+ z-index: 100;
47
+ background: linear-gradient(to bottom, rgba(0,0,0,0.7) 0%, rgba(0,0,0,0) 100%);
48
+ }
49
+
50
+ .hud-item {
51
+ background-color: rgba(0,0,0,0.5);
52
+ border-radius: 20px;
53
+ padding: 8px 12px;
54
+ display: flex;
55
+ align-items: center;
56
+ backdrop-filter: blur(5px);
57
+ border: 1px solid rgba(255,255,255,0.1);
58
+ box-shadow: 0 4px 6px rgba(0,0,0,0.1);
59
+ transition: all 0.3s ease;
60
+ }
61
+
62
+ .hud-item:active {
63
+ transform: scale(0.95);
64
+ }
65
+
66
+ .xp-bar {
67
+ height: 6px;
68
+ border-radius: 3px;
69
+ background-color: rgba(255,255,255,0.2);
70
+ overflow: hidden;
71
+ margin-top: 4px;
72
+ }
73
+
74
+ .xp-progress {
75
+ height: 100%;
76
+ background: linear-gradient(90deg, #4f46e5, #a855f7);
77
+ border-radius: 3px;
78
+ transition: width 0.5s ease;
79
+ animation: pulse 2s infinite;
80
+ }
81
+
82
+ .streak-fire {
83
+ color: #f59e0b;
84
+ animation: flame 1s infinite alternate;
85
+ }
86
+
87
+ .coin {
88
+ color: #fbbf24;
89
+ animation: shine 2s infinite;
90
+ }
91
+
92
+ .avatar {
93
+ position: fixed;
94
+ bottom: 80px;
95
+ left: 50%;
96
+ transform: translateX(-50%);
97
+ width: 120px;
98
+ height: 120px;
99
+ background-color: #3b82f6;
100
+ border-radius: 50%;
101
+ border: 3px solid #ffffff;
102
+ box-shadow: 0 0 20px rgba(59, 130, 246, 0.5);
103
+ display: flex;
104
+ align-items: center;
105
+ justify-content: center;
106
+ font-size: 40px;
107
+ z-index: 50;
108
+ transition: all 0.3s cubic-bezier(0.68, -0.6, 0.32, 1.6);
109
+ }
110
+
111
+ .avatar:active {
112
+ transform: translateX(-50%) scale(0.9);
113
+ }
114
+
115
+ .nav-button {
116
+ position: fixed;
117
+ bottom: 20px;
118
+ width: 60px;
119
+ height: 60px;
120
+ border-radius: 50%;
121
+ background-color: #4f46e5;
122
+ display: flex;
123
+ align-items: center;
124
+ justify-content: center;
125
+ font-size: 24px;
126
+ color: white;
127
+ box-shadow: 0 4px 10px rgba(0,0,0,0.3);
128
+ z-index: 50;
129
+ transition: all 0.2s cubic-bezier(0.68, -0.6, 0.32, 1.6);
130
+ }
131
+
132
+ .nav-button:active {
133
+ transform: scale(0.85);
134
+ }
135
+
136
+ .menu-button {
137
+ left: 20px;
138
+ background-color: #10b981;
139
+ }
140
+
141
+ .action-button {
142
+ right: 20px;
143
+ background-color: #ef4444;
144
+ animation: pulse 1.5s infinite;
145
+ }
146
+
147
+ .mission-marker {
148
+ position: absolute;
149
+ width: 40px;
150
+ height: 40px;
151
+ border-radius: 50%;
152
+ background-color: #f59e0b;
153
+ border: 2px solid white;
154
+ display: flex;
155
+ align-items: center;
156
+ justify-content: center;
157
+ color: white;
158
+ font-size: 16px;
159
+ transform: translate(-50%, -50%);
160
+ z-index: 10;
161
+ cursor: pointer;
162
+ transition: all 0.3s cubic-bezier(0.68, -0.6, 0.32, 1.6);
163
+ box-shadow: 0 4px 8px rgba(0,0,0,0.2);
164
+ }
165
+
166
+ .mission-marker:active {
167
+ transform: translate(-50%, -50%) scale(1.1);
168
+ }
169
+
170
+ .mission-marker.active {
171
+ animation: bounce 0.8s infinite alternate;
172
+ box-shadow: 0 0 20px #f59e0b;
173
+ }
174
+
175
+ .mission-marker.completed {
176
+ background-color: #10b981;
177
+ box-shadow: 0 0 20px #10b981;
178
+ }
179
+
180
+ .dialog-bubble {
181
+ position: absolute;
182
+ background-color: white;
183
+ color: #1f2937;
184
+ padding: 12px;
185
+ border-radius: 16px;
186
+ max-width: 200px;
187
+ font-size: 14px;
188
+ box-shadow: 0 4px 6px rgba(0,0,0,0.1);
189
+ z-index: 20;
190
+ transform-origin: bottom center;
191
+ animation: popIn 0.4s cubic-bezier(0.68, -0.6, 0.32, 1.6) forwards;
192
+ opacity: 0;
193
+ }
194
+
195
+ .dialog-bubble:after {
196
+ content: '';
197
+ position: absolute;
198
+ bottom: -10px;
199
+ left: 50%;
200
+ transform: translateX(-50%);
201
+ border-width: 10px 10px 0;
202
+ border-style: solid;
203
+ border-color: white transparent transparent;
204
+ }
205
+
206
+ .word-highlight {
207
+ background-color: rgba(234, 179, 8, 0.3);
208
+ border-radius: 2px;
209
+ transition: all 0.2s ease;
210
+ padding: 0 2px;
211
+ cursor: pointer;
212
+ }
213
+
214
+ .word-highlight:active {
215
+ transform: scale(1.1);
216
+ }
217
+
218
+ .word-highlight.active {
219
+ background-color: rgba(234, 179, 8, 0.7);
220
+ animation: wordGlow 0.5s ease-out;
221
+ }
222
+
223
+ .word-highlight.learned {
224
+ background-color: rgba(16, 185, 129, 0.3);
225
+ }
226
+
227
+ .word-highlight.learned.active {
228
+ background-color: rgba(16, 185, 129, 0.7);
229
+ }
230
+
231
+ .battle-ui {
232
+ position: fixed;
233
+ bottom: 0;
234
+ left: 0;
235
+ right: 0;
236
+ background-color: rgba(0,0,0,0.9);
237
+ border-top-left-radius: 20px;
238
+ border-top-right-radius: 20px;
239
+ padding: 20px;
240
+ transform: translateY(100%);
241
+ transition: transform 0.4s cubic-bezier(0.22, 1, 0.36, 1);
242
+ z-index: 200;
243
+ backdrop-filter: blur(10px);
244
+ box-shadow: 0 -5px 15px rgba(0,0,0,0.3);
245
+ }
246
+
247
+ .battle-ui.active {
248
+ transform: translateY(0);
249
+ }
250
+
251
+ .npc-avatar {
252
+ width: 80px;
253
+ height: 80px;
254
+ border-radius: 50%;
255
+ background-color: #6b7280;
256
+ display: flex;
257
+ align-items: center;
258
+ justify-content: center;
259
+ font-size: 30px;
260
+ margin: 0 auto 10px;
261
+ border: 3px solid white;
262
+ box-shadow: 0 4px 8px rgba(0,0,0,0.2);
263
+ transition: all 0.3s ease;
264
+ }
265
+
266
+ .health-bar {
267
+ height: 10px;
268
+ border-radius: 5px;
269
+ background-color: rgba(255,255,255,0.2);
270
+ overflow: hidden;
271
+ margin-bottom: 15px;
272
+ }
273
+
274
+ .health-progress {
275
+ height: 100%;
276
+ background: linear-gradient(90deg, #ef4444, #f59e0b);
277
+ border-radius: 5px;
278
+ transition: width 0.3s ease;
279
+ }
280
+
281
+ .dialogue-option {
282
+ background-color: rgba(255,255,255,0.1);
283
+ border-radius: 10px;
284
+ padding: 12px;
285
+ margin-bottom: 10px;
286
+ border: 1px solid rgba(255,255,255,0.2);
287
+ transition: all 0.2s cubic-bezier(0.68, -0.6, 0.32, 1.6);
288
+ }
289
+
290
+ .dialogue-option:active {
291
+ background-color: rgba(255,255,255,0.3);
292
+ transform: scale(0.98);
293
+ }
294
+
295
+ .mic-button {
296
+ width: 60px;
297
+ height: 60px;
298
+ border-radius: 50%;
299
+ background-color: #ef4444;
300
+ display: flex;
301
+ align-items: center;
302
+ justify-content: center;
303
+ margin: 0 auto;
304
+ font-size: 24px;
305
+ color: white;
306
+ box-shadow: 0 4px 10px rgba(0,0,0,0.3);
307
+ transition: all 0.2s cubic-bezier(0.68, -0.6, 0.32, 1.6);
308
+ }
309
+
310
+ .mic-button.active {
311
+ animation: pulse 0.5s infinite;
312
+ background-color: #10b981;
313
+ }
314
+
315
+ .power-bar {
316
+ height: 6px;
317
+ border-radius: 3px;
318
+ background-color: rgba(255,255,255,0.2);
319
+ overflow: hidden;
320
+ margin-top: 10px;
321
+ }
322
+
323
+ .power-progress {
324
+ height: 100%;
325
+ background: linear-gradient(90deg, #3b82f6, #a855f7);
326
+ border-radius: 3px;
327
+ transition: width 0.1s ease;
328
+ }
329
+
330
+ .reward-popup {
331
+ position: fixed;
332
+ top: 50%;
333
+ left: 50%;
334
+ transform: translate(-50%, -50%) scale(0);
335
+ background-color: rgba(0,0,0,0.9);
336
+ border-radius: 20px;
337
+ padding: 20px;
338
+ width: 80%;
339
+ max-width: 300px;
340
+ text-align: center;
341
+ z-index: 300;
342
+ backdrop-filter: blur(10px);
343
+ border: 1px solid rgba(255,255,255,0.1);
344
+ box-shadow: 0 10px 25px rgba(0,0,0,0.3);
345
+ animation: popIn 0.4s cubic-bezier(0.68, -0.6, 0.32, 1.6) forwards;
346
+ }
347
+
348
+ .reward-icon {
349
+ font-size: 40px;
350
+ margin-bottom: 10px;
351
+ animation: bounce 0.8s infinite alternate;
352
+ }
353
+
354
+ .confetti {
355
+ position: absolute;
356
+ width: 10px;
357
+ height: 10px;
358
+ background-color: #f00;
359
+ border-radius: 50%;
360
+ animation: confetti-fall 2s ease-in-out forwards;
361
+ z-index: 350;
362
+ }
363
+
364
+ /* Mission UI */
365
+ .mission-ui {
366
+ position: fixed;
367
+ top: 0;
368
+ left: 0;
369
+ right: 0;
370
+ bottom: 0;
371
+ background-color: rgba(0,0,0,0.9);
372
+ z-index: 400;
373
+ display: flex;
374
+ flex-direction: column;
375
+ transform: translateY(100%);
376
+ transition: transform 0.4s cubic-bezier(0.22, 1, 0.36, 1);
377
+ backdrop-filter: blur(10px);
378
+ }
379
+
380
+ .mission-ui.active {
381
+ transform: translateY(0);
382
+ }
383
+
384
+ .mission-header {
385
+ background-color: #4f46e5;
386
+ padding: 20px;
387
+ border-top-left-radius: 20px;
388
+ border-top-right-radius: 20px;
389
+ text-align: center;
390
+ box-shadow: 0 4px 8px rgba(0,0,0,0.2);
391
+ }
392
+
393
+ .mission-content {
394
+ flex: 1;
395
+ padding: 20px;
396
+ overflow-y: auto;
397
+ }
398
+
399
+ .mission-text {
400
+ background-color: rgba(255,255,255,0.1);
401
+ border-radius: 10px;
402
+ padding: 15px;
403
+ margin-bottom: 20px;
404
+ line-height: 1.6;
405
+ }
406
+
407
+ .mission-actions {
408
+ display: flex;
409
+ gap: 10px;
410
+ padding: 20px;
411
+ }
412
+
413
+ .mission-button {
414
+ flex: 1;
415
+ padding: 15px;
416
+ border-radius: 10px;
417
+ text-align: center;
418
+ font-weight: bold;
419
+ transition: all 0.2s cubic-bezier(0.68, -0.6, 0.32, 1.6);
420
+ }
421
+
422
+ .mission-button:active {
423
+ transform: scale(0.95);
424
+ }
425
+
426
+ .mission-button.primary {
427
+ background-color: #4f46e5;
428
+ color: white;
429
+ }
430
+
431
+ .mission-button.secondary {
432
+ background-color: rgba(255,255,255,0.1);
433
+ border: 1px solid rgba(255,255,255,0.2);
434
+ }
435
+
436
+ /* Menu UI */
437
+ .menu-ui {
438
+ position: fixed;
439
+ top: 0;
440
+ left: 0;
441
+ right: 0;
442
+ bottom: 0;
443
+ background-color: rgba(0,0,0,0.9);
444
+ z-index: 500;
445
+ display: flex;
446
+ flex-direction: column;
447
+ transform: translateX(-100%);
448
+ transition: transform 0.4s cubic-bezier(0.22, 1, 0.36, 1);
449
+ backdrop-filter: blur(10px);
450
+ }
451
+
452
+ .menu-ui.active {
453
+ transform: translateX(0);
454
+ }
455
+
456
+ .menu-header {
457
+ background-color: #10b981;
458
+ padding: 20px;
459
+ text-align: center;
460
+ box-shadow: 0 4px 8px rgba(0,0,0,0.2);
461
+ }
462
+
463
+ .menu-content {
464
+ flex: 1;
465
+ padding: 20px;
466
+ overflow-y: auto;
467
+ }
468
+
469
+ .menu-section {
470
+ background-color: rgba(255,255,255,0.1);
471
+ border-radius: 10px;
472
+ padding: 15px;
473
+ margin-bottom: 15px;
474
+ }
475
+
476
+ .menu-item {
477
+ padding: 12px;
478
+ border-radius: 8px;
479
+ margin-bottom: 8px;
480
+ display: flex;
481
+ align-items: center;
482
+ transition: all 0.2s ease;
483
+ }
484
+
485
+ .menu-item:active {
486
+ background-color: rgba(255,255,255,0.2);
487
+ }
488
+
489
+ .menu-item i {
490
+ width: 30px;
491
+ font-size: 18px;
492
+ text-align: center;
493
+ margin-right: 10px;
494
+ }
495
+
496
+ .menu-close {
497
+ position: absolute;
498
+ top: 15px;
499
+ right: 15px;
500
+ width: 40px;
501
+ height: 40px;
502
+ border-radius: 50%;
503
+ background-color: rgba(255,255,255,0.1);
504
+ display: flex;
505
+ align-items: center;
506
+ justify-content: center;
507
+ font-size: 20px;
508
+ transition: all 0.2s ease;
509
+ }
510
+
511
+ .menu-close:active {
512
+ transform: scale(0.9);
513
+ }
514
+
515
+ /* Tutorial UI */
516
+ .tutorial-ui {
517
+ position: fixed;
518
+ top: 0;
519
+ left: 0;
520
+ right: 0;
521
+ bottom: 0;
522
+ background-color: rgba(0,0,0,0.9);
523
+ z-index: 600;
524
+ display: flex;
525
+ flex-direction: column;
526
+ transform: translateY(100%);
527
+ transition: transform 0.4s cubic-bezier(0.22, 1, 0.36, 1);
528
+ backdrop-filter: blur(10px);
529
+ }
530
+
531
+ .tutorial-ui.active {
532
+ transform: translateY(0);
533
+ }
534
+
535
+ .tutorial-header {
536
+ background-color: #f59e0b;
537
+ padding: 20px;
538
+ text-align: center;
539
+ box-shadow: 0 4px 8px rgba(0,0,0,0.2);
540
+ }
541
+
542
+ .tutorial-content {
543
+ flex: 1;
544
+ padding: 20px;
545
+ overflow-y: auto;
546
+ }
547
+
548
+ .tutorial-step {
549
+ background-color: rgba(255,255,255,0.1);
550
+ border-radius: 10px;
551
+ padding: 15px;
552
+ margin-bottom: 15px;
553
+ }
554
+
555
+ .tutorial-actions {
556
+ display: flex;
557
+ gap: 10px;
558
+ padding: 20px;
559
+ }
560
+
561
+ .tutorial-button {
562
+ flex: 1;
563
+ padding: 15px;
564
+ border-radius: 10px;
565
+ text-align: center;
566
+ font-weight: bold;
567
+ transition: all 0.2s ease;
568
+ }
569
+
570
+ .tutorial-button:active {
571
+ transform: scale(0.95);
572
+ }
573
+
574
+ .tutorial-button.primary {
575
+ background-color: #f59e0b;
576
+ color: white;
577
+ }
578
+
579
+ /* Feedback UI */
580
+ .feedback-correct {
581
+ position: fixed;
582
+ top: 50%;
583
+ left: 50%;
584
+ transform: translate(-50%, -50%) scale(0);
585
+ background-color: rgba(16, 185, 129, 0.9);
586
+ color: white;
587
+ padding: 15px 25px;
588
+ border-radius: 50px;
589
+ font-weight: bold;
590
+ z-index: 700;
591
+ animation: popIn 0.3s ease-out forwards, fadeOut 0.5s ease-out 1s forwards;
592
+ box-shadow: 0 5px 15px rgba(16, 185, 129, 0.5);
593
+ }
594
+
595
+ .feedback-incorrect {
596
+ position: fixed;
597
+ top: 50%;
598
+ left: 50%;
599
+ transform: translate(-50%, -50%) scale(0);
600
+ background-color: rgba(239, 68, 68, 0.9);
601
+ color: white;
602
+ padding: 15px 25px;
603
+ border-radius: 50px;
604
+ font-weight: bold;
605
+ z-index: 700;
606
+ animation: popIn 0.3s ease-out forwards, fadeOut 0.5s ease-out 1s forwards;
607
+ box-shadow: 0 5px 15px rgba(239, 68, 68, 0.5);
608
+ }
609
+
610
+ /* Custom scrollbar */
611
+ ::-webkit-scrollbar {
612
+ width: 5px;
613
+ }
614
+
615
+ ::-webkit-scrollbar-track {
616
+ background: rgba(255,255,255,0.1);
617
+ border-radius: 10px;
618
+ }
619
+
620
+ ::-webkit-scrollbar-thumb {
621
+ background: rgba(255,255,255,0.3);
622
+ border-radius: 10px;
623
+ }
624
+
625
+ ::-webkit-scrollbar-thumb:hover {
626
+ background: rgba(255,255,255,0.5);
627
+ }
628
+
629
+ /* Animations */
630
+ @keyframes pulse {
631
+ 0% { transform: scale(1); opacity: 1; }
632
+ 50% { transform: scale(1.05); opacity: 0.8; }
633
+ 100% { transform: scale(1); opacity: 1; }
634
+ }
635
+
636
+ @keyframes flame {
637
+ 0% { text-shadow: 0 0 5px #f59e0b; }
638
+ 100% { text-shadow: 0 0 15px #f59e0b, 0 0 5px #ef4444; }
639
+ }
640
+
641
+ @keyframes shine {
642
+ 0% { text-shadow: 0 0 5px rgba(251, 191, 36, 0.5); }
643
+ 50% { text-shadow: 0 0 15px rgba(251, 191, 36, 0.8); }
644
+ 100% { text-shadow: 0 0 5px rgba(251, 191, 36, 0.5); }
645
+ }
646
+
647
+ @keyframes bounce {
648
+ 0% { transform: translateY(0); }
649
+ 100% { transform: translateY(-10px); }
650
+ }
651
+
652
+ @keyframes popIn {
653
+ 0% { transform: scale(0); opacity: 0; }
654
+ 80% { transform: scale(1.1); opacity: 1; }
655
+ 100% { transform: scale(1); opacity: 1; }
656
+ }
657
+
658
+ @keyframes fadeOut {
659
+ 0% { opacity: 1; }
660
+ 100% { opacity: 0; }
661
+ }
662
+
663
+ @keyframes wordGlow {
664
+ 0% { background-color: rgba(234, 179, 8, 0.3); }
665
+ 50% { background-color: rgba(234, 179, 8, 0.7); box-shadow: 0 0 10px rgba(234, 179, 8, 0.5); }
666
+ 100% { background-color: rgba(234, 179, 8, 0.3); }
667
+ }
668
+
669
+ @keyframes confetti-fall {
670
+ 0% { transform: translateY(-100px) rotate(0deg); opacity: 1; }
671
+ 100% { transform: translateY(100vh) rotate(360deg); opacity: 0; }
672
+ }
673
+
674
+ @keyframes slideInRight {
675
+ 0% { transform: translateX(100%); opacity: 0; }
676
+ 100% { transform: translateX(0); opacity: 1; }
677
+ }
678
+
679
+ @keyframes slideOutRight {
680
+ 0% { transform: translateX(0); opacity: 1; }
681
+ 100% { transform: translateX(100%); opacity: 0; }
682
+ }
683
+ </style>
684
+ </head>
685
+ <body>
686
+ <div class="game-container">
687
+ <!-- World Map -->
688
+ <div class="world-map" id="worldMap"></div>
689
+
690
+ <!-- HUD -->
691
+ <div class="hud">
692
+ <div class="hud-item" onclick="showPlayerStats()">
693
+ <div class="mr-2">
694
+ <div class="text-xs text-gray-300">Level</div>
695
+ <div class="font-bold">12</div>
696
+ </div>
697
+ <div>
698
+ <div class="text-xs text-right text-gray-300">XP</div>
699
+ <div class="xp-bar">
700
+ <div class="xp-progress" style="width: 65%"></div>
701
+ </div>
702
+ </div>
703
+ </div>
704
+
705
+ <div class="hud-item" onclick="showShop()">
706
+ <div class="mr-2">
707
+ <div class="text-xs text-gray-300">Coins</div>
708
+ <div class="font-bold flex items-center">
709
+ <i class="fas fa-coins coin mr-1"></i> 1,245
710
+ </div>
711
+ </div>
712
+ </div>
713
+
714
+ <div class="hud-item" onclick="showStreakInfo()">
715
+ <div class="mr-2">
716
+ <div class="text-xs text-gray-300">Streak</div>
717
+ <div class="font-bold flex items-center">
718
+ <i class="fas fa-fire streak-fire mr-1"></i> 5
719
+ </div>
720
+ </div>
721
+ </div>
722
+ </div>
723
+
724
+ <!-- Mission Markers -->
725
+ <div class="mission-marker" style="top: 30%; left: 25%;" onclick="startMission(1)">
726
+ <i class="fas fa-book"></i>
727
+ </div>
728
+
729
+ <div class="mission-marker active" style="top: 45%; left: 60%;" onclick="startMission(2)">
730
+ <i class="fas fa-comments"></i>
731
+ </div>
732
+
733
+ <div class="mission-marker completed" style="top: 70%; left: 40%;" onclick="startMission(3)">
734
+ <i class="fas fa-scroll"></i>
735
+ </div>
736
+
737
+ <!-- Dialog Bubble -->
738
+ <div class="dialog-bubble" style="top: 15%; left: 25%;" id="npcDialog">
739
+ Welcome to WordQuest! Tap on markers to start missions.
740
+ </div>
741
+
742
+ <!-- Player Avatar -->
743
+ <div class="avatar" onclick="showPlayerStats()">
744
+ <i class="fas fa-user"></i>
745
+ </div>
746
+
747
+ <!-- Navigation Buttons -->
748
+ <div class="nav-button menu-button" onclick="toggleMenu()">
749
+ <i class="fas fa-bars"></i>
750
+ </div>
751
+
752
+ <div class="nav-button action-button" onclick="startBattle()">
753
+ <i class="fas fa-microphone"></i>
754
+ </div>
755
+
756
+ <!-- Battle UI -->
757
+ <div class="battle-ui" id="battleUI">
758
+ <div class="npc-avatar">
759
+ <i class="fas fa-dragon"></i>
760
+ </div>
761
+ <div class="text-center mb-3">
762
+ <div class="font-bold">Grammar Dragon</div>
763
+ <div class="text-sm text-gray-300">Speak correctly to defeat me!</div>
764
+ </div>
765
+
766
+ <div class="health-bar">
767
+ <div class="health-progress" style="width: 70%"></div>
768
+ </div>
769
+
770
+ <div class="mb-4">
771
+ <div class="text-center text-sm mb-2">Choose your response:</div>
772
+ <div class="dialogue-option" onclick="selectDialogue(1)">
773
+ "Hello! How are you today?"
774
+ </div>
775
+ <div class="dialogue-option" onclick="selectDialogue(2)">
776
+ "I'm here to challenge you!"
777
+ </div>
778
+ <div class="dialogue-option" onclick="selectDialogue(3)">
779
+ "What's your favorite color?"
780
+ </div>
781
+ </div>
782
+
783
+ <div class="text-center mb-3">
784
+ <div class="mic-button" id="micButton" onclick="toggleRecording()">
785
+ <i class="fas fa-microphone"></i>
786
+ </div>
787
+ <div class="power-bar mt-2">
788
+ <div class="power-progress" id="powerBar" style="width: 0%"></div>
789
+ </div>
790
+ <div class="text-xs mt-1">Hold to record your response</div>
791
+ </div>
792
+ </div>
793
+
794
+ <!-- Reward Popup -->
795
+ <div class="reward-popup" id="rewardPopup">
796
+ <div class="reward-icon">
797
+ <i class="fas fa-trophy text-yellow-400"></i>
798
+ </div>
799
+ <h3 class="font-bold text-xl mb-2">Mission Complete!</h3>
800
+ <p class="text-gray-300 mb-4">You earned 50 XP and 10 coins</p>
801
+ <div class="flex justify-center gap-4 mb-4">
802
+ <div class="text-center">
803
+ <div class="text-sm text-gray-300">New Words</div>
804
+ <div class="font-bold">3</div>
805
+ </div>
806
+ <div class="text-center">
807
+ <div class="text-sm text-gray-300">Accuracy</div>
808
+ <div class="font-bold">85%</div>
809
+ </div>
810
+ </div>
811
+ <button class="w-full py-3 bg-purple-600 rounded-lg font-bold" onclick="hideReward()">
812
+ Continue Adventure
813
+ </button>
814
+ </div>
815
+
816
+ <!-- Mission UI -->
817
+ <div class="mission-ui" id="missionUI">
818
+ <div class="mission-header">
819
+ <h2 class="font-bold text-xl">The Lost Translation</h2>
820
+ <div class="text-sm">Reading Mission • Level 2</div>
821
+ </div>
822
+
823
+ <div class="mission-content">
824
+ <div class="mission-text" id="missionText">
825
+ In the ancient <span class="word-highlight" onclick="highlightWord('library')">library</span> of Wordoria, there lies a <span class="word-highlight" onclick="highlightWord('mysterious')">mysterious</span> <span class="word-highlight" onclick="highlightWord('scroll')">scroll</span> that has been <span class="word-highlight" onclick="highlightWord('untouched')">untouched</span> for centuries. The <span class="word-highlight" onclick="highlightWord('librarian')">librarian</span> told me that it contains the <span class="word-highlight" onclick="highlightWord('secrets')">secrets</span> of the <span class="word-highlight" onclick="highlightWord('language')">language</span> gods. To <span class="word-highlight" onclick="highlightWord('unlock')">unlock</span> its <span class="word-highlight" onclick="highlightWord('power')">power</span>, you must first <span class="word-highlight" onclick="highlightWord('understand')">understand</span> its contents.
826
+
827
+ <div class="mt-4 p-3 bg-gray-800 rounded-lg">
828
+ <h4 class="font-bold mb-2">Comprehension Questions:</h4>
829
+ <div class="mb-3">
830
+ <p class="mb-1">1. Where is the mysterious scroll located?</p>
831
+ <div class="flex gap-2 mt-1">
832
+ <button class="px-3 py-1 bg-gray-700 rounded-full text-sm" onclick="checkAnswer(this, false)">In the mountains</button>
833
+ <button class="px-3 py-1 bg-gray-700 rounded-full text-sm" onclick="checkAnswer(this, true)">In the library</button>
834
+ <button class="px-3 py-1 bg-gray-700 rounded-full text-sm" onclick="checkAnswer(this, false)">Under the sea</button>
835
+ </div>
836
+ </div>
837
+ <div>
838
+ <p class="mb-1">2. What does the scroll contain?</p>
839
+ <div class="flex gap-2 mt-1">
840
+ <button class="px-3 py-1 bg-gray-700 rounded-full text-sm" onclick="checkAnswer(this, false)">Treasure maps</button>
841
+ <button class="px-3 py-1 bg-gray-700 rounded-full text-sm" onclick="checkAnswer(this, true)">Language secrets</button>
842
+ <button class="px-3 py-1 bg-gray-700 rounded-full text-sm" onclick="checkAnswer(this, false)">Ancient recipes</button>
843
+ </div>
844
+ </div>
845
+ </div>
846
+ </div>
847
+ </div>
848
+
849
+ <div class="mission-actions">
850
+ <button class="mission-button secondary" onclick="hideMission()">
851
+ <i class="fas fa-times mr-1"></i> Cancel
852
+ </button>
853
+ <button class="mission-button primary" onclick="completeMission()">
854
+ <i class="fas fa-check mr-1"></i> Complete
855
+ </button>
856
+ </div>
857
+ </div>
858
+
859
+ <!-- Menu UI -->
860
+ <div class="menu-ui" id="menuUI">
861
+ <div class="menu-header">
862
+ <h2 class="font-bold text-xl">WordQuest Menu</h2>
863
+ </div>
864
+ <div class="menu-close" onclick="toggleMenu()">
865
+ <i class="fas fa-times"></i>
866
+ </div>
867
+
868
+ <div class="menu-content">
869
+ <div class="menu-section">
870
+ <h3 class="font-bold mb-3">Player</h3>
871
+ <div class="menu-item" onclick="showPlayerStats()">
872
+ <i class="fas fa-user"></i>
873
+ <span>My Stats</span>
874
+ </div>
875
+ <div class="menu-item" onclick="showInventory()">
876
+ <i class="fas fa-backpack"></i>
877
+ <span>Inventory</span>
878
+ </div>
879
+ <div class="menu-item" onclick="showAchievements()">
880
+ <i class="fas fa-trophy"></i>
881
+ <span>Achievements</span>
882
+ </div>
883
+ </div>
884
+
885
+ <div class="menu-section">
886
+ <h3 class="font-bold mb-3">Game</h3>
887
+ <div class="menu-item" onclick="showQuests()">
888
+ <i class="fas fa-scroll"></i>
889
+ <span>Quests</span>
890
+ </div>
891
+ <div class="menu-item" onclick="showShop()">
892
+ <i class="fas fa-shopping-bag"></i>
893
+ <span>Shop</span>
894
+ </div>
895
+ <div class="menu-item" onclick="showMap()">
896
+ <i class="fas fa-map"></i>
897
+ <span>World Map</span>
898
+ </div>
899
+ </div>
900
+
901
+ <div class="menu-section">
902
+ <h3 class="font-bold mb-3">Settings</h3>
903
+ <div class="menu-item" onclick="showSettings()">
904
+ <i class="fas fa-cog"></i>
905
+ <span>Settings</span>
906
+ </div>
907
+ <div class="menu-item" onclick="showTutorial()">
908
+ <i class="fas fa-question-circle"></i>
909
+ <span>Tutorial</span>
910
+ </div>
911
+ <div class="menu-item" onclick="showHelp()">
912
+ <i class="fas fa-info-circle"></i>
913
+ <span>Help</span>
914
+ </div>
915
+ </div>
916
+ </div>
917
+ </div>
918
+
919
+ <!-- Tutorial UI -->
920
+ <div class="tutorial-ui" id="tutorialUI">
921
+ <div class="tutorial-header">
922
+ <h2 class="font-bold text-xl">Game Tutorial</h2>
923
+ </div>
924
+
925
+ <div class="tutorial-content">
926
+ <div class="tutorial-step">
927
+ <h3 class="font-bold mb-2">Welcome to WordQuest!</h3>
928
+ <p class="text-gray-300 mb-3">This is an adventure game where you learn English by completing quests, battling NPCs, and exploring the world.</p>
929
+ </div>
930
+
931
+ <div class="tutorial-step">
932
+ <h3 class="font-bold mb-2">Mission Markers</h3>
933
+ <p class="text-gray-300 mb-3">Tap on the glowing markers on the map to start missions. Each marker represents a different type of challenge:</p>
934
+ <div class="flex items-center mb-2">
935
+ <div class="w-8 h-8 bg-yellow-500 rounded-full flex items-center justify-center text-white mr-3">
936
+ <i class="fas fa-book"></i>
937
+ </div>
938
+ <span>Reading Mission</span>
939
+ </div>
940
+ <div class="flex items-center mb-2">
941
+ <div class="w-8 h-8 bg-yellow-500 rounded-full flex items-center justify-center text-white mr-3">
942
+ <i class="fas fa-comments"></i>
943
+ </div>
944
+ <span>Speaking Mission</span>
945
+ </div>
946
+ <div class="flex items-center">
947
+ <div class="w-8 h-8 bg-green-500 rounded-full flex items-center justify-center text-white mr-3">
948
+ <i class="fas fa-scroll"></i>
949
+ </div>
950
+ <span>Completed Mission</span>
951
+ </div>
952
+ </div>
953
+
954
+ <div class="tutorial-step">
955
+ <h3 class="font-bold mb-2">Reading Missions</h3>
956
+ <p class="text-gray-300 mb-3">In reading missions, you'll encounter texts with highlighted words. Tap on these words to learn their meanings.</p>
957
+ <p class="text-gray-300">Answer comprehension questions correctly to complete the mission and earn rewards.</p>
958
+ </div>
959
+
960
+ <div class="tutorial-step">
961
+ <h3 class="font-bold mb-2">Speaking Missions</h3>
962
+ <p class="text-gray-300 mb-3">In speaking missions, you'll engage in conversations with NPCs. Choose what to say, then record your response using the microphone button.</p>
963
+ <p class="text-gray-300">The better your pronunciation and grammar, the more damage you'll do to your opponent!</p>
964
+ </div>
965
+
966
+ <div class="tutorial-step">
967
+ <h3 class="font-bold mb-2">Earning Rewards</h3>
968
+ <p class="text-gray-300">Complete missions to earn XP, coins, and new words. Use coins to customize your avatar or buy power-ups in the shop.</p>
969
+ </div>
970
+ </div>
971
+
972
+ <div class="tutorial-actions">
973
+ <button class="tutorial-button primary" onclick="hideTutorial()">
974
+ <i class="fas fa-check mr-1"></i> Got it!
975
+ </button>
976
+ </div>
977
+ </div>
978
+
979
+ <!-- Feedback Elements -->
980
+ <div class="feedback-correct" id="feedbackCorrect">
981
+ <i class="fas fa-check-circle mr-2"></i> Correct!
982
+ </div>
983
+
984
+ <div class="feedback-incorrect" id="feedbackIncorrect">
985
+ <i class="fas fa-times-circle mr-2"></i> Try again!
986
+ </div>
987
+ </div>
988
+
989
+ <script>
990
+ // Game state
991
+ const gameState = {
992
+ level: 12,
993
+ xp: 65,
994
+ coins: 1245,
995
+ streak: 5,
996
+ currentMission: null,
997
+ inBattle: false,
998
+ recording: false,
999
+ powerLevel: 0,
1000
+ powerInterval: null,
1001
+ learnedWords: ['library', 'scroll', 'understand'],
1002
+ dailyQuests: [
1003
+ { id: 1, title: "Complete 3 missions", progress: 2, target: 3, reward: 50 },
1004
+ { id: 2, title: "Learn 5 new words", progress: 3, target: 5, reward: 30 },
1005
+ { id: 3, title: "Maintain 3-day streak", progress: 1, target: 3, reward: 100 }
1006
+ ],
1007
+ inventory: [
1008
+ { id: 1, name: "Basic Sword", type: "weapon", equipped: true },
1009
+ { id: 2, name: "Leather Armor", type: "armor", equipped: true },
1010
+ { id: 3, name: "XP Boost", type: "consumable", quantity: 3 }
1011
+ ],
1012
+ achievements: [
1013
+ { id: 1, title: "First Mission", description: "Complete your first mission", earned: true },
1014
+ { id: 2, title: "Word Collector", description: "Learn 10 words", earned: true },
1015
+ { id: 3, title: "Daily Player", description: "Play for 7 consecutive days", earned: false }
1016
+ ]
1017
+ };
1018
+
1019
+ // Initialize game
1020
+ function initGame() {
1021
+ // Show initial dialog
1022
+ setTimeout(() => {
1023
+ const dialog = document.getElementById('npcDialog');
1024
+ dialog.style.display = 'block';
1025
+ setTimeout(() => {
1026
+ dialog.style.opacity = '1';
1027
+ }, 10);
1028
+
1029
+ setTimeout(() => {
1030
+ dialog.style.opacity = '0';
1031
+ setTimeout(() => {
1032
+ dialog.style.display = 'none';
1033
+ }, 300);
1034
+ }, 3000);
1035
+ }, 1000);
1036
+
1037
+ // Set up world map dragging
1038
+ const worldMap = document.getElementById('worldMap');
1039
+ let isDragging = false;
1040
+ let startX, startY, startTranslateX = 0, startTranslateY = 0;
1041
+
1042
+ worldMap.addEventListener('touchstart', (e) => {
1043
+ if (gameState.currentMission || gameState.inBattle) return;
1044
+
1045
+ isDragging = true;
1046
+ startX = e.touches[0].clientX;
1047
+ startY = e.touches[0].clientY;
1048
+ const transform = worldMap.style.transform.match(/translate\(([^)]+)\)/);
1049
+ if (transform) {
1050
+ const [x, y] = transform[1].split(',').map(parseFloat);
1051
+ startTranslateX = x || 0;
1052
+ startTranslateY = y || 0;
1053
+ }
1054
+ e.preventDefault();
1055
+ });
1056
+
1057
+ worldMap.addEventListener('touchmove', (e) => {
1058
+ if (!isDragging) return;
1059
+
1060
+ const x = e.touches[0].clientX;
1061
+ const y = e.touches[0].clientY;
1062
+ const dx = x - startX;
1063
+ const dy = y - startY;
1064
+
1065
+ worldMap.style.transform = `translate(${startTranslateX + dx}px, ${startTranslateY + dy}px)`;
1066
+ e.preventDefault();
1067
+ });
1068
+
1069
+ worldMap.addEventListener('touchend', () => {
1070
+ isDragging = false;
1071
+ });
1072
+
1073
+ // Check if it's the first time playing
1074
+ if (!localStorage.getItem('wordQuestPlayed')) {
1075
+ setTimeout(() => {
1076
+ showTutorial();
1077
+ }, 1500);
1078
+ localStorage.setItem('wordQuestPlayed', 'true');
1079
+ }
1080
+
1081
+ // Mark learned words
1082
+ setTimeout(() => {
1083
+ document.querySelectorAll('.word-highlight').forEach(el => {
1084
+ if (gameState.learnedWords.includes(el.textContent.toLowerCase())) {
1085
+ el.classList.add('learned');
1086
+ }
1087
+ });
1088
+ }, 500);
1089
+ }
1090
+
1091
+ // Start a mission
1092
+ function startMission(missionId) {
1093
+ if (gameState.currentMission || gameState.inBattle) return;
1094
+
1095
+ gameState.currentMission = missionId;
1096
+
1097
+ // Different mission types
1098
+ if (missionId === 1) {
1099
+ // Reading mission
1100
+ document.getElementById('missionText').innerHTML = `
1101
+ In the ancient <span class="word-highlight" onclick="highlightWord('library')">library</span> of Wordoria, there lies a <span class="word-highlight" onclick="highlightWord('mysterious')">mysterious</span> <span class="word-highlight" onclick="highlightWord('scroll')">scroll</span> that has been <span class="word-highlight" onclick="highlightWord('untouched')">untouched</span> for centuries. The <span class="word-highlight" onclick="highlightWord('librarian')">librarian</span> told me that it contains the <span class="word-highlight" onclick="highlightWord('secrets')">secrets</span> of the <span class="word-highlight" onclick="highlightWord('language')">language</span> gods. To <span class="word-highlight" onclick="highlightWord('unlock')">unlock</span> its <span class="word-highlight" onclick="highlightWord('power')">power</span>, you must first <span class="word-highlight" onclick="highlightWord('understand')">understand</span> its contents.
1102
+
1103
+ <div class="mt-4 p-3 bg-gray-800 rounded-lg">
1104
+ <h4 class="font-bold mb-2">Comprehension Questions:</h4>
1105
+ <div class="mb-3">
1106
+ <p class="mb-1">1. Where is the mysterious scroll located?</p>
1107
+ <div class="flex gap-2 mt-1">
1108
+ <button class="px-3 py-1 bg-gray-700 rounded-full text-sm" onclick="checkAnswer(this, false)">In the mountains</button>
1109
+ <button class="px-3 py-1 bg-gray-700 rounded-full text-sm" onclick="checkAnswer(this, true)">In the library</button>
1110
+ <button class="px-3 py-1 bg-gray-700 rounded-full text-sm" onclick="checkAnswer(this, false)">Under the sea</button>
1111
+ </div>
1112
+ </div>
1113
+ <div>
1114
+ <p class="mb-1">2. What does the scroll contain?</p>
1115
+ <div class="flex gap-2 mt-1">
1116
+ <button class="px-3 py-1 bg-gray-700 rounded-full text-sm" onclick="checkAnswer(this, false)">Treasure maps</button>
1117
+ <button class="px-3 py-1 bg-gray-700 rounded-full text-sm" onclick="checkAnswer(this, true)">Language secrets</button>
1118
+ <button class="px-3 py-1 bg-gray-700 rounded-full text-sm" onclick="checkAnswer(this, false)">Ancient recipes</button>
1119
+ </div>
1120
+ </div>
1121
+ </div>
1122
+ `;
1123
+ } else if (missionId === 2) {
1124
+ // Conversation mission
1125
+ document.getElementById('missionText').innerHTML = `
1126
+ <div class="flex mb-4">
1127
+ <div class="w-10 h-10 bg-blue-500 rounded-full flex items-center justify-center text-white mr-3">
1128
+ <i class="fas fa-robot"></i>
1129
+ </div>
1130
+ <div class="bg-gray-700 rounded-lg p-3 flex-1">
1131
+ <p>Hello traveler! I'm the Guardian of Wordoria. To pass through these gates, you must answer my questions correctly.</p>
1132
+ </div>
1133
+ </div>
1134
+
1135
+ <div class="flex justify-end mb-4">
1136
+ <div class="bg-blue-500 rounded-lg p-3 max-w-[80%]">
1137
+ <p>I'm ready for your questions!</p>
1138
+ </div>
1139
+ </div>
1140
+
1141
+ <div class="flex mb-4">
1142
+ <div class="w-10 h-10 bg-blue-500 rounded-full flex items-center justify-center text-white mr-3">
1143
+ <i class="fas fa-robot"></i>
1144
+ </div>
1145
+ <div class="bg-gray-700 rounded-lg p-3 flex-1">
1146
+ <p class="mb-2">First question: What do you say when you meet someone for the first time?</p>
1147
+ <div class="flex gap-2">
1148
+ <button class="px-3 py-1 bg-gray-600 rounded-full text-sm" onclick="checkAnswer(this, false)">Goodbye</button>
1149
+ <button class="px-3 py-1 bg-gray-600 rounded-full text-sm" onclick="checkAnswer(this, true)">Hello</button>
1150
+ <button class="px-3 py-1 bg-gray-600 rounded-full text-sm" onclick="checkAnswer(this, false)">Thank you</button>
1151
+ </div>
1152
+ </div>
1153
+ </div>
1154
+
1155
+ <div class="text-center mt-6">
1156
+ <button class="px-4 py-2 bg-blue-500 rounded-lg font-bold" onclick="startBattle()">
1157
+ <i class="fas fa-microphone mr-2"></i> Practice Speaking
1158
+ </button>
1159
+ </div>
1160
+ `;
1161
+ } else {
1162
+ // Grammar mission
1163
+ document.getElementById('missionText').innerHTML = `
1164
+ <div class="bg-gray-800 rounded-lg p-4 mb-4">
1165
+ <h4 class="font-bold mb-2">Grammar Challenge</h4>
1166
+ <p class="mb-3">Complete the sentences with the correct words:</p>
1167
+
1168
+ <div class="mb-3">
1169
+ <p class="mb-1">1. I ___ to the store yesterday.</p>
1170
+ <div class="flex gap-2 mt-1">
1171
+ <button class="px-3 py-1 bg-gray-700 rounded-full text-sm" onclick="checkAnswer(this, true)">went</button>
1172
+ <button class="px-3 py-1 bg-gray-700 rounded-full text-sm" onclick="checkAnswer(this, false)">go</button>
1173
+ <button class="px-3 py-1 bg-gray-700 rounded-full text-sm" onclick="checkAnswer(this, false)">going</button>
1174
+ </div>
1175
+ </div>
1176
+
1177
+ <div class="mb-3">
1178
+ <p class="mb-1">2. She ___ a book right now.</p>
1179
+ <div class="flex gap-2 mt-1">
1180
+ <button class="px-3 py-1 bg-gray-700 rounded-full text-sm" onclick="checkAnswer(this, false)">read</button>
1181
+ <button class="px-3 py-1 bg-gray-700 rounded-full text-sm" onclick="checkAnswer(this, true)">is reading</button>
1182
+ <button class="px-3 py-1 bg-gray-700 rounded-full text-sm" onclick="checkAnswer(this, false)">reads</button>
1183
+ </div>
1184
+ </div>
1185
+
1186
+ <div>
1187
+ <p class="mb-1">3. They ___ happy to see you.</p>
1188
+ <div class="flex gap-2 mt-1">
1189
+ <button class="px-3 py-1 bg-gray-700 rounded-full text-sm" onclick="checkAnswer(this, true)">are</button>
1190
+ <button class="px-3 py-1 bg-gray-700 rounded-full text-sm" onclick="checkAnswer(this, false)">is</button>
1191
+ <button class="px-3 py-1 bg-gray-700 rounded-full text-sm" onclick="checkAnswer(this, false)">am</button>
1192
+ </div>
1193
+ </div>
1194
+ </div>
1195
+
1196
+ <div class="text-center">
1197
+ <p class="text-sm text-gray-300">Complete 3 more challenges to unlock the next area!</p>
1198
+ </div>
1199
+ `;
1200
+ }
1201
+
1202
+ // Mark learned words
1203
+ setTimeout(() => {
1204
+ document.querySelectorAll('.word-highlight').forEach(el => {
1205
+ if (gameState.learnedWords.includes(el.textContent.toLowerCase())) {
1206
+ el.classList.add('learned');
1207
+ }
1208
+ });
1209
+ }, 10);
1210
+
1211
+ document.getElementById('missionUI').classList.add('active');
1212
+ }
1213
+
1214
+ // Hide mission UI
1215
+ function hideMission() {
1216
+ document.getElementById('missionUI').classList.remove('active');
1217
+ gameState.currentMission = null;
1218
+ }
1219
+
1220
+ // Complete mission
1221
+ function completeMission() {
1222
+ hideMission();
1223
+ showReward();
1224
+
1225
+ // Update mission marker if completed
1226
+ if (gameState.currentMission === 2) {
1227
+ document.querySelector('.mission-marker.active').classList.remove('active');
1228
+ document.querySelector('.mission-marker.active').classList.add('completed');
1229
+ }
1230
+
1231
+ // Update daily quest progress
1232
+ gameState.dailyQuests[0].progress += 1;
1233
+ }
1234
+
1235
+ // Highlight a word
1236
+ function highlightWord(word) {
1237
+ const element = event.target;
1238
+ element.classList.add('active');
1239
+
1240
+ // Show tooltip with translation
1241
+ const tooltip = document.createElement('div');
1242
+ tooltip.className = 'absolute bg-black text-white text-xs px-2 py-1 rounded whitespace-nowrap';
1243
+ tooltip.textContent = `Translated: ${word}`;
1244
+ tooltip.style.top = `${element.getBoundingClientRect().top - 30}px`;
1245
+ tooltip.style.left = `${element.getBoundingClientRect().left}px`;
1246
+ tooltip.style.zIndex = '1000';
1247
+ document.body.appendChild(tooltip);
1248
+
1249
+ // Add word to learned words if not already there
1250
+ if (!gameState.learnedWords.includes(word.toLowerCase())) {
1251
+ gameState.learnedWords.push(word.toLowerCase());
1252
+ element.classList.add('learned');
1253
+
1254
+ // Update daily quest progress
1255
+ gameState.dailyQuests[1].progress += 1;
1256
+ }
1257
+
1258
+ setTimeout(() => {
1259
+ element.classList.remove('active');
1260
+ tooltip.remove();
1261
+ }, 2000);
1262
+ }
1263
+
1264
+ // Check answer
1265
+ function checkAnswer(button, isCorrect) {
1266
+ const allButtons = button.parentElement.querySelectorAll('button');
1267
+ allButtons.forEach(btn => {
1268
+ btn.disabled = true;
1269
+ btn.classList.remove('bg-green-500', 'bg-red-500', 'text-white');
1270
+ });
1271
+
1272
+ if (isCorrect) {
1273
+ button.classList.add('bg-green-500', 'text-white');
1274
+
1275
+ // Add checkmark
1276
+ const check = document.createElement('i');
1277
+ check.className = 'fas fa-check ml-1';
1278
+ button.appendChild(check);
1279
+
1280
+ // Show feedback
1281
+ showFeedback(true);
1282
+ } else {
1283
+ button.classList.add('bg-red-500', 'text-white');
1284
+
1285
+ // Add X mark
1286
+ const x = document.createElement('i');
1287
+ x.className = 'fas fa-times ml-1';
1288
+ button.appendChild(x);
1289
+
1290
+ // Show correct answer
1291
+ allButtons.forEach(btn => {
1292
+ if (btn.getAttribute('onclick').includes('true')) {
1293
+ btn.classList.add('bg-green-500', 'text-white');
1294
+ }
1295
+ });
1296
+
1297
+ // Show feedback
1298
+ showFeedback(false);
1299
+ }
1300
+ }
1301
+
1302
+ // Show feedback
1303
+ function showFeedback(isCorrect) {
1304
+ const feedback = document.getElementById(isCorrect ? 'feedbackCorrect' : 'feedbackIncorrect');
1305
+ feedback.style.display = 'block';
1306
+ setTimeout(() => {
1307
+ feedback.style.transform = 'translate(-50%, -50%) scale(1)';
1308
+ feedback.style.opacity = '1';
1309
+ }, 10);
1310
+
1311
+ setTimeout(() => {
1312
+ feedback.style.opacity = '0';
1313
+ setTimeout(() => {
1314
+ feedback.style.display = 'none';
1315
+ feedback.style.transform = 'translate(-50%, -50%) scale(0)';
1316
+ }, 500);
1317
+ }, 1000);
1318
+ }
1319
+
1320
+ // Start a battle
1321
+ function startBattle() {
1322
+ gameState.inBattle = true;
1323
+ document.getElementById('battleUI').classList.add('active');
1324
+ }
1325
+
1326
+ // End battle
1327
+ function endBattle() {
1328
+ gameState.inBattle = false;
1329
+ document.getElementById('battleUI').classList.remove('active');
1330
+ showReward();
1331
+ }
1332
+
1333
+ // Select dialogue option
1334
+ function selectDialogue(option) {
1335
+ const options = document.querySelectorAll('.dialogue-option');
1336
+ options.forEach(opt => {
1337
+ opt.classList.remove('bg-blue-500', 'text-white');
1338
+ });
1339
+
1340
+ event.target.classList.add('bg-blue-500', 'text-white');
1341
+
1342
+ // Update NPC response based on selection
1343
+ const npcAvatar = document.querySelector('.npc-avatar');
1344
+ npcAvatar.innerHTML = '<i class="fas fa-comment-dots"></i>';
1345
+
1346
+ setTimeout(() => {
1347
+ npcAvatar.innerHTML = '<i class="fas fa-dragon"></i>';
1348
+ }, 1000);
1349
+ }
1350
+
1351
+ // Toggle recording
1352
+ function toggleRecording() {
1353
+ const micButton = document.getElementById('micButton');
1354
+
1355
+ if (gameState.recording) {
1356
+ // Stop recording
1357
+ gameState.recording = false;
1358
+ micButton.classList.remove('active');
1359
+ clearInterval(gameState.powerInterval);
1360
+
1361
+ // Analyze speech (simulated)
1362
+ setTimeout(() => {
1363
+ const powerBar = document.getElementById('powerBar');
1364
+ const score = Math.min(100, Math.floor(gameState.powerLevel * 1.5));
1365
+ powerBar.style.width = `${score}%`;
1366
+
1367
+ // Show result
1368
+ let result = '';
1369
+ const npcAvatar = document.querySelector('.npc-avatar');
1370
+ if (score > 80) {
1371
+ result = 'Perfect! Critical hit!';
1372
+ npcAvatar.innerHTML = '<i class="fas fa-heart-broken"></i>';
1373
+ showFeedback(true);
1374
+ } else if (score > 50) {
1375
+ result = 'Good! The enemy is weakened.';
1376
+ npcAvatar.innerHTML = '<i class="fas fa-frown"></i>';
1377
+ showFeedback(true);
1378
+ } else {
1379
+ result = 'Needs improvement. Try again!';
1380
+ npcAvatar.innerHTML = '<i class="fas fa-grin"></i>';
1381
+ showFeedback(false);
1382
+ }
1383
+
1384
+ // Show result for 2 seconds then reset
1385
+ setTimeout(() => {
1386
+ npcAvatar.innerHTML = '<i class="fas fa-dragon"></i>';
1387
+ powerBar.style.width = '0%';
1388
+ gameState.powerLevel = 0;
1389
+
1390
+ // End battle after 3 successful attempts
1391
+ if (score > 50) {
1392
+ setTimeout(endBattle, 1000);
1393
+ }
1394
+ }, 2000);
1395
+ }, 500);
1396
+ } else {
1397
+ // Start recording
1398
+ gameState.recording = true;
1399
+ micButton.classList.add('active');
1400
+ gameState.powerLevel = 0;
1401
+
1402
+ // Simulate power level increasing
1403
+ gameState.powerInterval = setInterval(() => {
1404
+ gameState.powerLevel += Math.random() * 5;
1405
+ const powerBar = document.getElementById('powerBar');
1406
+ powerBar.style.width = `${Math.min(100, gameState.powerLevel)}%`;
1407
+ }, 100);
1408
+ }
1409
+ }
1410
+
1411
+ // Show reward popup
1412
+ function showReward() {
1413
+ // Create confetti
1414
+ for (let i = 0; i < 50; i++) {
1415
+ const confetti = document.createElement('div');
1416
+ confetti.className = 'confetti';
1417
+ confetti.style.left = `${Math.random() * 100}%`;
1418
+ confetti.style.backgroundColor = `hsl(${Math.random() * 360}, 100%, 50%)`;
1419
+ confetti.style.animationDuration = `${2 + Math.random() * 3}s`;
1420
+ document.body.appendChild(confetti);
1421
+
1422
+ setTimeout(() => {
1423
+ confetti.remove();
1424
+ }, 5000);
1425
+ }
1426
+
1427
+ document.getElementById('rewardPopup').style.display = 'block';
1428
+ setTimeout(() => {
1429
+ document.getElementById('rewardPopup').style.transform = 'translate(-50%, -50%) scale(1)';
1430
+ document.getElementById('rewardPopup').style.opacity = '1';
1431
+ }, 10);
1432
+ }
1433
+
1434
+ // Hide reward popup
1435
+ function hideReward() {
1436
+ document.getElementById('rewardPopup').style.opacity = '0';
1437
+ setTimeout(() => {
1438
+ document.getElementById('rewardPopup').style.display = 'none';
1439
+ document.getElementById('rewardPopup').style.transform = 'translate(-50%, -50%) scale(0)';
1440
+ }, 300);
1441
+ }
1442
+
1443
+ // Toggle menu
1444
+ function toggleMenu() {
1445
+ const menu = document.getElementById('menuUI');
1446
+ if (menu.classList.contains('active')) {
1447
+ menu.classList.remove('active');
1448
+ } else {
1449
+ menu.classList.add('active');
1450
+ }
1451
+ }
1452
+
1453
+ // Show tutorial
1454
+ function showTutorial() {
1455
+ document.getElementById('tutorialUI').classList.add('active');
1456
+ }
1457
+
1458
+ // Hide tutorial
1459
+ function hideTutorial() {
1460
+ document.getElementById('tutorialUI').classList.remove('active');
1461
+ }
1462
+
1463
+ // Show player stats
1464
+ function showPlayerStats() {
1465
+ alert(`Player Stats:\nLevel: ${gameState.level}\nXP: ${gameState.xp}%\nCoins: ${gameState.coins}\nStreak: ${gameState.streak} days\nWords Learned: ${gameState.learnedWords.length}`);
1466
+ }
1467
+
1468
+ // Show shop
1469
+ function showShop() {
1470
+ alert("Shop UI would open here with items to purchase using coins");
1471
+ }
1472
+
1473
+ // Show streak info
1474
+ function showStreakInfo() {
1475
+ alert(`Daily Login Streak: ${gameState.streak} days\n\nMaintain your streak to earn bonus rewards!`);
1476
+ }
1477
+
1478
+ // Show inventory
1479
+ function showInventory() {
1480
+ let inventoryText = "Your Inventory:\n";
1481
+ gameState.inventory.forEach(item => {
1482
+ inventoryText += `- ${item.name} (${item.type})`;
1483
+ if (item.quantity) inventoryText += ` x${item.quantity}`;
1484
+ if (item.equipped) inventoryText += " [EQUIPPED]";
1485
+ inventoryText += "\n";
1486
+ });
1487
+ alert(inventoryText);
1488
+ toggleMenu();
1489
+ }
1490
+
1491
+ // Show achievements
1492
+ function showAchievements() {
1493
+ let achievementsText = "Your Achievements:\n";
1494
+ gameState.achievements.forEach(ach => {
1495
+ achievementsText += `- ${ach.title}: ${ach.description} `;
1496
+ achievementsText += ach.earned ? "✓\n" : "🔒\n";
1497
+ });
1498
+ alert(achievementsText);
1499
+ toggleMenu();
1500
+ }
1501
+
1502
+ // Show quests
1503
+ function showQuests() {
1504
+ let questsText = "Daily Quests:\n";
1505
+ gameState.dailyQuests.forEach(quest => {
1506
+ questsText += `- ${quest.title}: ${quest.progress}/${quest.target} `;
1507
+ questsText += `(Reward: ${quest.reward} coins)\n`;
1508
+ });
1509
+ alert(questsText);
1510
+ toggleMenu();
1511
+ }
1512
+
1513
+ // Show settings
1514
+ function showSettings() {
1515
+ alert("Settings UI would open here with audio, language, and account options");
1516
+ toggleMenu();
1517
+ }
1518
+
1519
+ // Show help
1520
+ function showHelp() {
1521
+ alert("Help UI would open here with FAQs and support contact");
1522
+ toggleMenu();
1523
+ }
1524
+
1525
+ // Initialize game when loaded
1526
+ window.addEventListener('DOMContentLoaded', initGame);
1527
+ </script>
1528
+ <p style="border-radius: 8px; text-align: center; font-size: 12px; color: #fff; margin-top: 16px;position: fixed; left: 8px; bottom: 8px; z-index: 10; background: rgba(0, 0, 0, 0.8); padding: 4px 8px;">Made with <img src="https://enzostvs-deepsite.hf.space/logo.svg" alt="DeepSite Logo" style="width: 16px; height: 16px; vertical-align: middle;display:inline-block;margin-right:3px;filter:brightness(0) invert(1);"><a href="https://enzostvs-deepsite.hf.space" style="color: #fff;text-decoration: underline;" target="_blank" >DeepSite</a> - 🧬 <a href="https://enzostvs-deepsite.hf.space?remix=ThiagoGM/learn2" style="color: #fff;text-decoration: underline;" target="_blank" >Remix</a></p></body>
1529
+ </html>