cosimotaiuti commited on
Commit
2f6a09b
·
verified ·
1 Parent(s): 3944213

Upload 109 files

Browse files
This view is limited to 50 files because it contains too many changes.   See raw diff
Files changed (50) hide show
  1. .gitattributes +1 -0
  2. DOCKER +0 -0
  3. Dockerfile +24 -0
  4. LICENSE +21 -0
  5. README.md +20 -8
  6. __pycache__/app.cpython-313.pyc +0 -0
  7. __pycache__/app.cpython-38.pyc +0 -0
  8. app.py +58 -0
  9. requirements.txt +4 -0
  10. static/.DS_Store +0 -0
  11. static/assets/.DS_Store +0 -0
  12. static/assets/css/game-style.css +566 -0
  13. static/assets/css/how-to-play.css +431 -0
  14. static/assets/css/index-style.css +491 -0
  15. static/assets/css/popup.css +236 -0
  16. static/assets/css/stress-animations.css +235 -0
  17. static/assets/fonts/horrorbrush.ttf +0 -0
  18. static/assets/img/.DS_Store +0 -0
  19. static/assets/img/appartment/.DS_Store +0 -0
  20. static/assets/img/appartment/basemap.png +0 -0
  21. static/assets/img/appartment/bedroomdoorlocked.png +0 -0
  22. static/assets/img/appartment/bedroomdoorunlocked.png +0 -0
  23. static/assets/img/appartment/bookcasesearchable.png +0 -0
  24. static/assets/img/appartment/bookcaseunusuable.png +0 -0
  25. static/assets/img/appartment/bookcaseusable.png +0 -0
  26. static/assets/img/appartment/cabinetsearchable.png +0 -0
  27. static/assets/img/appartment/cabinetunsearchable.png +0 -0
  28. static/assets/img/appartment/coffeetableunusable.png +0 -0
  29. static/assets/img/appartment/coffeetableusable.png +0 -0
  30. static/assets/img/appartment/deadbodyunusable.png +0 -0
  31. static/assets/img/appartment/deadbodyusable.png +0 -0
  32. static/assets/img/appartment/desksearchable.png +0 -0
  33. static/assets/img/appartment/deskunsearchable.png +0 -0
  34. static/assets/img/appartment/dressersearchable.png +0 -0
  35. static/assets/img/appartment/dresserunsearchable.png +0 -0
  36. static/assets/img/appartment/finalmap.png +0 -0
  37. static/assets/img/appartment/fridgesearchable.png +0 -0
  38. static/assets/img/appartment/fridgeunsearchable.png +0 -0
  39. static/assets/img/appartment/generatoroff.png +0 -0
  40. static/assets/img/appartment/generatoron.png +0 -0
  41. static/assets/img/appartment/mainentranceopen.png +0 -0
  42. static/assets/img/appartment/storagelocked.png +0 -0
  43. static/assets/img/appartment/storageunlocked.png +0 -0
  44. static/assets/img/appartment/stovesearchable.png +0 -0
  45. static/assets/img/appartment/stoveunsearchable.png +0 -0
  46. static/assets/img/appartment/theexit.png +0 -0
  47. static/assets/img/appartment/tvunused.png +0 -0
  48. static/assets/img/appartment/tvused.png +0 -0
  49. static/assets/img/blood-2.png +0 -0
  50. static/assets/img/clown.png +0 -0
.gitattributes CHANGED
@@ -33,3 +33,4 @@ saved_model/**/* filter=lfs diff=lfs merge=lfs -text
33
  *.zip filter=lfs diff=lfs merge=lfs -text
34
  *.zst filter=lfs diff=lfs merge=lfs -text
35
  *tfevents* filter=lfs diff=lfs merge=lfs -text
 
 
33
  *.zip filter=lfs diff=lfs merge=lfs -text
34
  *.zst filter=lfs diff=lfs merge=lfs -text
35
  *tfevents* filter=lfs diff=lfs merge=lfs -text
36
+ static/assets/sounds/music.mp3 filter=lfs diff=lfs merge=lfs -text
DOCKER ADDED
File without changes
Dockerfile ADDED
@@ -0,0 +1,24 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Use official Python runtime as base image
2
+ FROM python:3.9-slim
3
+
4
+ # Set working directory
5
+ WORKDIR /app
6
+
7
+ # Copy requirements first to leverage Docker cache
8
+ COPY requirements.txt .
9
+
10
+ # Install dependencies
11
+ RUN pip install -r requirements.txt
12
+
13
+ # Copy the rest of the application
14
+ COPY . .
15
+
16
+ # Set environment variables
17
+ ENV PYTHONUNBUFFERED=1
18
+ ENV PORT=7860
19
+
20
+ # Expose the port the app runs on
21
+ EXPOSE 7860
22
+
23
+ # Command to run the application
24
+ CMD ["python", "app.py"]
LICENSE ADDED
@@ -0,0 +1,21 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ MIT License
2
+
3
+ Copyright (c) 2025 Johnny
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
README.md CHANGED
@@ -1,12 +1,24 @@
1
  ---
2
- title: TextToSurvive
3
- emoji: 🌍
4
- colorFrom: yellow
5
- colorTo: indigo
6
- sdk: docker
 
 
7
  pinned: false
8
- license: apache-2.0
9
- short_description: Text to Survie (Team 9)
10
  ---
11
 
12
- Check out the configuration reference at https://huggingface.co/docs/hub/spaces-config-reference
 
 
 
 
 
 
 
 
 
 
 
 
 
1
  ---
2
+ title: The Last Message
3
+ emoji: 📱
4
+ colorFrom: gray
5
+ colorTo: red
6
+ sdk: gradio
7
+ sdk_version: "3.50.2"
8
+ app_file: app.py
9
  pinned: false
 
 
10
  ---
11
 
12
+ # The Last Message - Horror Escape Game
13
+
14
+ An interactive horror escape game where your messages determine the fate of others.
15
+
16
+ ### Docker
17
+
18
+ # Build the image
19
+
20
+ docker build -t p5js-game .
21
+
22
+ # Run the container
23
+
24
+ docker run -p 8000:8000 p5js-game
__pycache__/app.cpython-313.pyc ADDED
Binary file (2.3 kB). View file
 
__pycache__/app.cpython-38.pyc ADDED
Binary file (1.72 kB). View file
 
app.py ADDED
@@ -0,0 +1,58 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ from flask import Flask, request, jsonify, render_template, send_from_directory
2
+ import requests
3
+ import os
4
+ from flask_cors import CORS
5
+ import logging
6
+
7
+ app = Flask(__name__)
8
+ CORS(app) # Enable CORS for development
9
+
10
+ # Set up logging
11
+ logging.basicConfig(level=logging.INFO)
12
+ logger = logging.getLogger(__name__)
13
+
14
+ @app.route('/mistral-proxy', methods=['POST'])
15
+ def proxy_to_mistral():
16
+ MISTRAL_API_KEY = os.getenv('MISTRAL_API_KEY')
17
+ MISTRAL_API_URL = "https://api.mistral.ai/v1/chat/completions"
18
+
19
+ if not MISTRAL_API_KEY:
20
+ logger.error("MISTRAL_API_KEY not configured")
21
+ return jsonify({"error": "MISTRAL_API_KEY not configured"}), 500
22
+
23
+ headers = {
24
+ 'Authorization': f'Bearer {MISTRAL_API_KEY}',
25
+ 'Content-Type': 'application/json'
26
+ }
27
+
28
+ try:
29
+ # Log incoming request (excluding sensitive data)
30
+ logger.info(f"Received request for Mistral API")
31
+
32
+ response = requests.post(MISTRAL_API_URL,
33
+ headers=headers,
34
+ json=request.json)
35
+
36
+ # Check if the response was successful
37
+ response.raise_for_status()
38
+
39
+ return jsonify(response.json())
40
+ except requests.exceptions.RequestException as e:
41
+ logger.error(f"Error calling Mistral API: {str(e)}")
42
+ return jsonify({"error": f"Error calling Mistral API: {str(e)}"}), 500
43
+ except Exception as e:
44
+ logger.error(f"Unexpected error: {str(e)}")
45
+ return jsonify({"error": str(e)}), 500
46
+
47
+ # Serve static files
48
+ @app.route('/')
49
+ def index():
50
+ return send_from_directory('static', 'index.html')
51
+
52
+ # Add this if you want to serve other static files
53
+ @app.route('/<path:path>')
54
+ def serve_static(path):
55
+ return send_from_directory('static', path)
56
+
57
+ if __name__ == '__main__':
58
+ app.run(host='0.0.0.0', port=7860)
requirements.txt ADDED
@@ -0,0 +1,4 @@
 
 
 
 
 
1
+ flask==3.0.0
2
+ requests==2.31.0
3
+ flask-cors==4.0.0
4
+ python-dotenv==1.0.0
static/.DS_Store ADDED
Binary file (6.15 kB). View file
 
static/assets/.DS_Store ADDED
Binary file (8.2 kB). View file
 
static/assets/css/game-style.css ADDED
@@ -0,0 +1,566 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /* Layout */
2
+ body {
3
+ margin: 0;
4
+ font-family: Arial, sans-serif;
5
+ display: flex;
6
+ background-color: #220a0a;
7
+ height: 100vh;
8
+ position: relative;
9
+ overflow: hidden;
10
+ }
11
+ * {
12
+ opacity: 0.98;
13
+ }
14
+ #gameContainer {
15
+ display: flex;
16
+ width: 100%;
17
+ height: 100vh;
18
+ overflow: auto;
19
+ position: relative;
20
+ z-index: 1;
21
+ align-items: center;
22
+ }
23
+
24
+ #mapSection {
25
+ flex: 1;
26
+ min-width: 600px;
27
+ width: fit-content;
28
+ position: relative;
29
+ display: flex;
30
+ flex-direction: column;
31
+ justify-content: center;
32
+ align-items: center;
33
+ overflow: auto;
34
+ z-index: 2;
35
+ padding: 20px;
36
+ }
37
+
38
+ /* We'll place the P5 canvas in here */
39
+ .map-wrapper {
40
+ margin: 20px;
41
+ transform-origin: center center;
42
+ min-width: min-content;
43
+ }
44
+
45
+ #chatSection {
46
+ width: 100%;
47
+ height: 100%;
48
+ display: flex;
49
+ flex-direction: column;
50
+ background: #000000;
51
+ border-radius: 38px;
52
+ overflow: hidden;
53
+ }
54
+
55
+ #chatHistory {
56
+ flex: 1;
57
+ overflow-y: auto;
58
+ padding: 16px;
59
+ background: #f8f8fa;
60
+ }
61
+
62
+ /* Style moderne pour la barre de scroll */
63
+ #chatHistory::-webkit-scrollbar {
64
+ width: 6px;
65
+ }
66
+
67
+ #chatHistory::-webkit-scrollbar-track {
68
+ background: transparent;
69
+ }
70
+
71
+ #chatHistory::-webkit-scrollbar-thumb {
72
+ background: #d1d1d6;
73
+ border-radius: 3px;
74
+ }
75
+
76
+ #chatControls {
77
+ padding: 16px;
78
+ background: #ffffff;
79
+ display: flex;
80
+ gap: 12px;
81
+ border-top: 1px solid #f1f1f5;
82
+ }
83
+
84
+ .chat-message {
85
+ padding: 12px 16px;
86
+ margin: 6px 0;
87
+ border-radius: 20px;
88
+ max-width: 75%;
89
+ font-size: 0.95em;
90
+ line-height: 1.4;
91
+ box-shadow: 0 1px 2px rgba(0, 0, 0, 0.1);
92
+ }
93
+
94
+ .user-message {
95
+ background: #007aff;
96
+ color: white;
97
+ margin-left: auto;
98
+ border-radius: 20px 20px 4px 20px;
99
+ }
100
+
101
+ .assistant-message {
102
+ background: #f1f1f5;
103
+ color: #000000;
104
+ margin-right: auto;
105
+ border-radius: 20px 20px 20px 4px;
106
+ }
107
+
108
+ input {
109
+ flex: 1;
110
+ padding: 12px 16px;
111
+ border: none;
112
+ border-radius: 20px;
113
+ font-family: inherit;
114
+ font-size: 0.95em;
115
+ background: #f1f1f5;
116
+ transition: background 0.2s;
117
+ }
118
+
119
+ input:focus {
120
+ outline: none;
121
+ background: #e5e5ea;
122
+ }
123
+
124
+ input::placeholder {
125
+ color: #8e8e93;
126
+ }
127
+
128
+ button {
129
+ padding: 8px;
130
+ width: 40px;
131
+ height: 40px;
132
+ background: #007aff;
133
+ color: white;
134
+ border: none;
135
+ border-radius: 20px;
136
+ cursor: pointer;
137
+ display: flex;
138
+ align-items: center;
139
+ justify-content: center;
140
+ transition: transform 0.2s, background 0.2s;
141
+ }
142
+
143
+ button:hover {
144
+ background: #0056b3;
145
+ transform: scale(1.05);
146
+ }
147
+
148
+ /* Style moderne pour l'indicateur de chargement */
149
+ .loading-dots {
150
+ display: inline-flex;
151
+ gap: 4px;
152
+ padding: 8px 12px;
153
+ background: #f1f1f5;
154
+ border-radius: 16px;
155
+ }
156
+
157
+ .dot {
158
+ width: 6px;
159
+ height: 6px;
160
+ background: #8e8e93;
161
+ border-radius: 50%;
162
+ animation: bounce 1.4s infinite ease-in-out;
163
+ }
164
+
165
+ .dot:nth-child(1) {
166
+ animation-delay: -0.32s;
167
+ }
168
+
169
+ .dot:nth-child(2) {
170
+ animation-delay: -0.16s;
171
+ }
172
+
173
+ @keyframes bounce {
174
+
175
+ 0%,
176
+ 80%,
177
+ 100% {
178
+ transform: scale(0);
179
+ }
180
+
181
+ 40% {
182
+ transform: scale(1);
183
+ }
184
+ }
185
+
186
+ /* Modal for API key (if needed) */
187
+ #apiKeyModal {
188
+ display: none;
189
+ position: fixed;
190
+ top: 0;
191
+ left: 0;
192
+ width: 100%;
193
+ height: 100%;
194
+ background: rgba(0, 0, 0, 0.5);
195
+ justify-content: center;
196
+ align-items: center;
197
+ }
198
+
199
+ .modal-content {
200
+ background: white;
201
+ padding: 20px;
202
+ border-radius: 8px;
203
+ width: 300px;
204
+ }
205
+
206
+ #apiKey {
207
+ width: 100%;
208
+ margin: 10px 0;
209
+ padding: 8px;
210
+ }
211
+
212
+ /* Modifier les styles du chat et du mockup */
213
+ .phone-mockup {
214
+ position: relative;
215
+ width: 400px;
216
+ height: 800px;
217
+ background: url("/static/assets/img/phone.png") no-repeat center;
218
+ background-size: contain;
219
+ display: flex;
220
+ justify-content: center;
221
+ align-items: center;
222
+ margin: auto;
223
+ padding: 35px 0;
224
+ flex-shrink: 0;
225
+ z-index: 2;
226
+ }
227
+
228
+ .phone-screen {
229
+ width: 90%;
230
+ height: 96.5%;
231
+ position: relative;
232
+ overflow: hidden;
233
+ margin: 0;
234
+ border-radius: 40px;
235
+ display: flex;
236
+ flex-direction: column;
237
+ }
238
+
239
+ /* Update media queries for better responsiveness */
240
+ @media (max-height: 900px) {
241
+ .phone-mockup {
242
+ width: 350px;
243
+ height: 700px;
244
+ }
245
+ }
246
+
247
+ @media (max-height: 700px) {
248
+ .phone-mockup {
249
+ width: 300px;
250
+ height: 600px;
251
+ }
252
+ }
253
+
254
+ @media (max-width: 1200px) {
255
+ #mapSection {
256
+ flex: none;
257
+ width: fit-content;
258
+ }
259
+ }
260
+
261
+ @media (max-width: 900px) {
262
+ #mapSection {
263
+ flex: none;
264
+ width: fit-content;
265
+ }
266
+ .phone-mockup {
267
+ min-width: 280px;
268
+ }
269
+ }
270
+
271
+ /* Ajouter les nouveaux styles pour l'en-tête du chat */
272
+ #chatHeader {
273
+ padding: 16px;
274
+ justify-content: center;
275
+ background: #ffffff;
276
+ border-bottom: 1px solid #f1f1f5;
277
+ display: flex;
278
+ align-items: center;
279
+ gap: 12px;
280
+ }
281
+
282
+ .profile-picture {
283
+ width: 40px;
284
+ height: 40px;
285
+ border-radius: 50%;
286
+ background: #f1f1f5;
287
+ display: flex;
288
+ align-items: center;
289
+ justify-content: center;
290
+ }
291
+
292
+ .chat-name {
293
+ font-size: 1.1em;
294
+ font-weight: 600;
295
+ color: #000000;
296
+ }
297
+
298
+ /* LED Bar */
299
+ .led-bar {
300
+ position: fixed;
301
+ top: 0;
302
+ left: 0;
303
+ width: 100%;
304
+ height: 2px;
305
+ background: linear-gradient(90deg,
306
+ transparent 0%,
307
+ rgba(255, 0, 0, 0.4) 20%,
308
+ rgba(255, 0, 0, 0.8) 35%,
309
+ rgba(255, 50, 50, 1) 50%,
310
+ rgba(255, 0, 0, 0.8) 65%,
311
+ rgba(255, 0, 0, 0.4) 80%,
312
+ transparent 100%);
313
+ z-index: 100;
314
+ animation: ledFlicker 4s infinite, ledPulse 10s infinite;
315
+ box-shadow: 0 0 20px rgba(255, 0, 0, 0.7),
316
+ 0 0 35px rgba(255, 0, 0, 0.5),
317
+ 0 0 50px rgba(255, 0, 0, 0.4),
318
+ 0 0 70px rgba(155, 0, 0, 0.3);
319
+ filter: blur(0.6px);
320
+ }
321
+
322
+ .light-beam {
323
+ position: absolute;
324
+ top: 0;
325
+ left: 0;
326
+ width: 100%;
327
+ height: 250px;
328
+ background: linear-gradient(180deg,
329
+ rgba(255, 0, 0, 0.3) 0%,
330
+ rgba(255, 0, 0, 0.2) 20%,
331
+ rgba(255, 0, 0, 0.15) 30%,
332
+ rgba(155, 0, 0, 0.08) 60%,
333
+ transparent 100%);
334
+ animation: beamFlicker 4s infinite;
335
+ pointer-events: none;
336
+ filter: blur(2px);
337
+ }
338
+
339
+ @keyframes ledFlicker {
340
+ 0% {
341
+ opacity: 1;
342
+ }
343
+
344
+ 95% {
345
+ opacity: 1;
346
+ }
347
+
348
+ 96% {
349
+ opacity: 0.3;
350
+ }
351
+
352
+ 97% {
353
+ opacity: 1;
354
+ }
355
+
356
+ 98% {
357
+ opacity: 0.2;
358
+ }
359
+
360
+ 99% {
361
+ opacity: 0.9;
362
+ }
363
+
364
+ 100% {
365
+ opacity: 1;
366
+ }
367
+ }
368
+
369
+ @keyframes ledPulse {
370
+ 0% {
371
+ filter: brightness(1) blur(0.6px);
372
+ }
373
+
374
+ 50% {
375
+ filter: brightness(1.3) blur(0.4px);
376
+ }
377
+
378
+ 100% {
379
+ filter: brightness(1) blur(0.6px);
380
+ }
381
+ }
382
+
383
+ @keyframes beamFlicker {
384
+ 0% {
385
+ opacity: 0.7;
386
+ }
387
+
388
+ 95% {
389
+ opacity: 0.7;
390
+ }
391
+
392
+ 96% {
393
+ opacity: 0.2;
394
+ }
395
+
396
+ 97% {
397
+ opacity: 0.7;
398
+ }
399
+
400
+ 98% {
401
+ opacity: 0.1;
402
+ }
403
+
404
+ 99% {
405
+ opacity: 0.6;
406
+ }
407
+
408
+ 100% {
409
+ opacity: 0.7;
410
+ }
411
+ }
412
+
413
+ /* Background Elements */
414
+ .background-elements {
415
+ position: fixed;
416
+ top: 0;
417
+ left: 0;
418
+ width: 100%;
419
+ height: 100%;
420
+ pointer-events: none;
421
+ z-index: 1;
422
+ }
423
+
424
+ .blood {
425
+ position: absolute;
426
+ top: 94%;
427
+ opacity: 0.6;
428
+ transform: rotate(20deg);
429
+ right: 10%;
430
+ }
431
+
432
+ .blood-top-left {
433
+ top: 0;
434
+ left: 0;
435
+ width: 300px;
436
+ }
437
+
438
+ .blood-top-right {
439
+ top: 0;
440
+ right: 0;
441
+ width: 200px;
442
+ transform: rotate(20deg);
443
+ }
444
+
445
+ .splatter {
446
+ bottom: 20%;
447
+ left: 10%;
448
+ width: 200px;
449
+ }
450
+
451
+ .blood-bottom-right {
452
+ bottom: 0;
453
+ right: 0;
454
+ position: absolute;
455
+ top: 90%;
456
+ left: 90%;
457
+ width: 200px;
458
+ }
459
+
460
+ /* Sound button styles */
461
+ .sound-button {
462
+ position: fixed;
463
+ bottom: 20px;
464
+ left: 20px;
465
+ width: 100px;
466
+ height: 100px;
467
+ cursor: pointer;
468
+ z-index: 1000;
469
+ transition: transform 0.2s ease;
470
+ }
471
+
472
+ .sound-button:hover {
473
+ transform: scale(1.1);
474
+ }
475
+
476
+ .sound-button img {
477
+ width: 100%;
478
+ height: 100%;
479
+ object-fit: contain;
480
+ }
481
+
482
+ /* Update button styles */
483
+ button {
484
+ padding: 8px;
485
+ width: 40px;
486
+ height: 40px;
487
+ background: #007aff;
488
+ color: white;
489
+ border: none;
490
+ border-radius: 10px;
491
+ cursor: pointer;
492
+ display: flex;
493
+ align-items: center;
494
+ justify-content: center;
495
+ transition: transform 0.2s, background 0.2s;
496
+ }
497
+
498
+ button img {
499
+ width: 15px;
500
+ height: 15px;
501
+ color: #ffffff;
502
+ }
503
+
504
+ .numpad-overlay {
505
+ position: fixed;
506
+ top: 50%;
507
+ right: 52%;
508
+ transform: translateY(-50%);
509
+ background: rgba(0, 0, 0, 0.9);
510
+ padding: 20px;
511
+ border-radius: 10px;
512
+ z-index: 1000;
513
+ }
514
+
515
+ .hidden {
516
+ display: none;
517
+ }
518
+
519
+ .toggle-numpad {
520
+ position: fixed;
521
+ top: 20px;
522
+ right: 20px;
523
+ padding: 10px 15px;
524
+ font-size: 20px;
525
+ background: #333;
526
+ color: white;
527
+ border: none;
528
+ border-radius: 5px;
529
+ cursor: pointer;
530
+ z-index: 1001;
531
+ }
532
+
533
+ .numpad-grid {
534
+ display: grid;
535
+ grid-template-columns: repeat(3, 1fr);
536
+ gap: 8px;
537
+ max-width: 300px;
538
+ margin: 10px auto;
539
+ }
540
+
541
+ .numpad-key {
542
+ padding: 25px;
543
+ font-size: 27px;
544
+ border: 1px solid #444;
545
+ background: #333;
546
+ color: white;
547
+ cursor: pointer;
548
+ border-radius: 5px;
549
+ }
550
+
551
+ .numpad-key:hover {
552
+ background: #444;
553
+ }
554
+
555
+ .numpad-display {
556
+ text-align: center;
557
+ font-size: 24px;
558
+ margin: 10px;
559
+ letter-spacing: 5px;
560
+ color: white;
561
+ }
562
+
563
+ /* Update input styles */
564
+ input {
565
+ border-radius: 10px;
566
+ }
static/assets/css/how-to-play.css ADDED
@@ -0,0 +1,431 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /* Styles généraux pour toutes les pages How to Play */
2
+ .content {
3
+ color: #fff;
4
+ text-align: center;
5
+ max-width: 1200px;
6
+ margin: 0 auto;
7
+ padding: 20px;
8
+ display: flex;
9
+ flex-direction: column;
10
+ align-items: center;
11
+ margin-top: 20px;
12
+ }
13
+ * {
14
+ opacity: 0.98;
15
+ }
16
+ .content h1 {
17
+ font-family: "HorrorBrush", cursive;
18
+ font-size: 64px;
19
+ color: #9b0000;
20
+ position: relative;
21
+ margin-bottom: 30px;
22
+ letter-spacing: 4px;
23
+ }
24
+
25
+ /* Styles pour la première page */
26
+ .game-description p {
27
+ font-size: 2.5rem;
28
+ margin-bottom: 2rem;
29
+ color: #fff;
30
+ }
31
+
32
+ .gf-image {
33
+ width: 400px;
34
+ height: auto;
35
+ margin-top: 50px;
36
+ }
37
+
38
+ /* Styles pour la deuxième page */
39
+ .objects-container {
40
+ display: flex;
41
+ justify-content: center;
42
+ gap: 50px;
43
+ margin: 50px 0 30px 0;
44
+ width: 100%;
45
+ }
46
+
47
+ .object-type {
48
+ display: flex;
49
+ flex-direction: column;
50
+ align-items: center;
51
+ width: 300px;
52
+ }
53
+
54
+ .object-title {
55
+ font-family: "HorrorBrush", cursive;
56
+ font-size: 2.5rem;
57
+ color: #fff;
58
+ margin-bottom: 10px;
59
+ }
60
+
61
+ .sub-text {
62
+ font-size: 2rem;
63
+ color: #ffffff;
64
+ margin-bottom: 20px;
65
+ }
66
+
67
+ .image-container {
68
+ width: 100%;
69
+ display: flex;
70
+ justify-content: center;
71
+ }
72
+
73
+ /* Styles pour les images tutorielles */
74
+ .tutorial-image {
75
+ width: 250px;
76
+ height: 250px;
77
+ object-fit: contain;
78
+ }
79
+
80
+ /* Styles de navigation */
81
+ .navigation-buttons {
82
+ display: flex;
83
+ justify-content: center;
84
+ align-items: center;
85
+ gap: 50px;
86
+ margin-top: 30px;
87
+ width: 100%;
88
+ height: auto;
89
+ }
90
+
91
+ .navigation-buttons .back-button,
92
+ .navigation-buttons .next-button {
93
+ display: inline-block;
94
+ font-family: "HorrorBrush", cursive;
95
+ font-size: 36px;
96
+ color: #fff;
97
+ text-decoration: none;
98
+ transition: all 0.3s ease;
99
+ letter-spacing: 4px;
100
+ text-transform: uppercase;
101
+ background-color: rgba(155, 0, 0, 0.3);
102
+ padding: 10px 30px;
103
+ border: 2px solid #9b0000;
104
+ border-radius: 5px;
105
+ line-height: 1;
106
+ margin: 0;
107
+ }
108
+
109
+ .navigation-buttons .back-button {
110
+ position: static;
111
+ transform: none;
112
+ bottom: auto;
113
+ left: auto;
114
+ }
115
+
116
+ .navigation-buttons .next-button:hover,
117
+ .navigation-buttons .back-button:hover {
118
+ color: #9b0000;
119
+ background-color: rgba(155, 0, 0, 0.1);
120
+ box-shadow: 0 0 15px rgba(155, 0, 0, 0.5);
121
+ }
122
+
123
+ /* Style spécifique pour le bouton Back to Menu */
124
+ .back-to-menu {
125
+ position: absolute;
126
+ bottom: 40px;
127
+ left: 50%;
128
+ transform: translateX(-50%);
129
+ }
130
+
131
+ /* Styles pour la deuxième page */
132
+ .object-type.green .object-title {
133
+ color: #20bb43;
134
+ }
135
+
136
+ .object-type.red .object-title {
137
+ color: #d25658;
138
+ }
139
+
140
+ .object-type.white .object-title {
141
+ color: white;
142
+ }
143
+
144
+ /* Media Queries pour la responsivité */
145
+ @media screen and (max-width: 1200px) {
146
+ .content {
147
+ max-width: 95%;
148
+ padding: 15px;
149
+ }
150
+ }
151
+
152
+ @media screen and (max-width: 900px) {
153
+ .objects-container {
154
+ flex-direction: column;
155
+ align-items: center;
156
+ gap: 40px;
157
+ margin: 50px 0 30px 0;
158
+ }
159
+
160
+ .object-type {
161
+ width: 100%;
162
+ max-width: 400px;
163
+ }
164
+
165
+ .tutorial-image {
166
+ width: 200px;
167
+ height: 200px;
168
+ }
169
+
170
+ .content h1 {
171
+ font-size: 48px;
172
+ }
173
+
174
+ .object-title {
175
+ font-size: 2rem;
176
+ }
177
+
178
+ .sub-text {
179
+ font-size: 1.5rem;
180
+ }
181
+ }
182
+
183
+ @media screen and (max-width: 600px) {
184
+ .gf-image {
185
+ width: 90%;
186
+ max-width: 300px;
187
+ }
188
+
189
+ .content h1 {
190
+ font-size: 36px;
191
+ }
192
+
193
+ .game-description p {
194
+ font-size: 1.8rem;
195
+ }
196
+
197
+ .navigation-buttons {
198
+ flex-direction: column;
199
+ gap: 20px;
200
+ }
201
+
202
+ .navigation-buttons .back-button,
203
+ .navigation-buttons .next-button {
204
+ font-size: 28px;
205
+ padding: 8px 20px;
206
+ }
207
+
208
+ .object-title {
209
+ font-size: 1.8rem;
210
+ }
211
+
212
+ .sub-text {
213
+ font-size: 1.2rem;
214
+ }
215
+
216
+ .tutorial-image {
217
+ width: 180px;
218
+ height: 180px;
219
+ }
220
+ }
221
+
222
+ @media screen and (max-width: 400px) {
223
+ .content h1 {
224
+ font-size: 32px;
225
+ }
226
+
227
+ .game-description p {
228
+ font-size: 1.5rem;
229
+ }
230
+
231
+ .navigation-buttons .back-button,
232
+ .navigation-buttons .next-button {
233
+ font-size: 24px;
234
+ padding: 6px 16px;
235
+ }
236
+ }
237
+
238
+ @media screen and (max-height: 800px) {
239
+ .content {
240
+ margin-top: 10px;
241
+ }
242
+
243
+ .content h1 {
244
+ font-size: 48px;
245
+ margin-bottom: 20px;
246
+ }
247
+
248
+ .game-description p {
249
+ font-size: 2rem;
250
+ margin-bottom: 1.5rem;
251
+ }
252
+
253
+ .gf-image {
254
+ width: 300px;
255
+ margin-top: 30px;
256
+ }
257
+
258
+ .objects-container {
259
+ margin: 50px 0 20px 0;
260
+ }
261
+
262
+ .object-type {
263
+ width: 250px;
264
+ }
265
+
266
+ .tutorial-image {
267
+ width: 200px;
268
+ height: 200px;
269
+ }
270
+ }
271
+
272
+ @media screen and (max-height: 600px) {
273
+ .content {
274
+ margin-top: 5px;
275
+ }
276
+
277
+ .content h1 {
278
+ font-size: 36px;
279
+ margin-bottom: 15px;
280
+ }
281
+
282
+ .game-description p {
283
+ font-size: 1.8rem;
284
+ margin-bottom: 1rem;
285
+ }
286
+
287
+ .gf-image {
288
+ width: 250px;
289
+ margin-top: 20px;
290
+ }
291
+
292
+ .objects-container {
293
+ margin: 30px 0 15px 0;
294
+ }
295
+
296
+ .object-type {
297
+ width: 200px;
298
+ }
299
+
300
+ .tutorial-image {
301
+ width: 180px;
302
+ height: 180px;
303
+ }
304
+
305
+ .navigation-buttons {
306
+ margin-top: 30px;
307
+ }
308
+
309
+ .navigation-buttons .back-button,
310
+ .navigation-buttons .next-button {
311
+ font-size: 28px;
312
+ padding: 8px 20px;
313
+ }
314
+ }
315
+
316
+ @media screen and (max-height: 500px) {
317
+ .content h1 {
318
+ font-size: 32px;
319
+ margin-bottom: 10px;
320
+ }
321
+
322
+ .game-description p {
323
+ font-size: 1.5rem;
324
+ }
325
+
326
+ .gf-image {
327
+ width: 200px;
328
+ margin-top: 15px;
329
+ }
330
+
331
+ .objects-container {
332
+ margin: 20px 0 10px 0;
333
+ }
334
+
335
+ .object-type {
336
+ width: 180px;
337
+ }
338
+
339
+ .tutorial-image {
340
+ width: 130px;
341
+ height: 130px;
342
+ }
343
+
344
+ .navigation-buttons {
345
+ margin-top: 20px;
346
+ }
347
+
348
+ .navigation-buttons .back-button,
349
+ .navigation-buttons .next-button {
350
+ font-size: 24px;
351
+ padding: 6px 16px;
352
+ }
353
+ }
354
+
355
+ /* Styles pour la page 3 */
356
+ .main-description {
357
+ font-size: 2.5rem;
358
+ color: #fff;
359
+ font-family: "HorrorBrush", cursive;
360
+ }
361
+
362
+ .object-type.yellow .object-title {
363
+ color: #ffd700;
364
+ }
365
+
366
+ /* Ajustement pour deux objets au lieu de trois */
367
+ .objects-container.two-items {
368
+ justify-content: center;
369
+ gap: 100px; /* Plus d'espace entre deux éléments */
370
+ }
371
+
372
+ /* Media queries pour la page 3 */
373
+ @media screen and (max-width: 900px) {
374
+ .main-description {
375
+ font-size: 2rem;
376
+ margin: 20px 0;
377
+ }
378
+ }
379
+
380
+ @media screen and (max-width: 600px) {
381
+ .main-description {
382
+ font-size: 1.8rem;
383
+ margin: 15px 0;
384
+ }
385
+ }
386
+
387
+ @media screen and (max-height: 600px) {
388
+ .main-description {
389
+ font-size: 1.8rem;
390
+ margin: 10px 0;
391
+ }
392
+ }
393
+
394
+ /* Styles pour la page 4 */
395
+ .video-container {
396
+ margin-top: 20px;
397
+ width: 100%;
398
+ display: flex;
399
+ justify-content: center;
400
+ }
401
+
402
+ .tutorial-video {
403
+ max-width: 200px;
404
+ width: 100%;
405
+ border-radius: 30px;
406
+ }
407
+
408
+ /* Media queries pour la page 4 */
409
+ @media screen and (max-width: 900px) {
410
+ .tutorial-video {
411
+ max-width: 350px;
412
+ }
413
+ }
414
+
415
+ @media screen and (max-width: 600px) {
416
+ .tutorial-video {
417
+ max-width: 300px;
418
+ }
419
+ }
420
+
421
+ @media screen and (max-height: 800px) {
422
+ .video-container {
423
+ margin: 30px 0;
424
+ }
425
+ }
426
+
427
+ @media screen and (max-height: 600px) {
428
+ .video-container {
429
+ margin: 20px 0;
430
+ }
431
+ }
static/assets/css/index-style.css ADDED
@@ -0,0 +1,491 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ @font-face {
2
+ font-family: "HorrorBrush";
3
+ src: url("/static/assets/fonts/horrorbrush.ttf") format("truetype");
4
+ }
5
+
6
+ * {
7
+ margin: 0;
8
+ padding: 0;
9
+ box-sizing: border-box;
10
+ opacity: 0.98;
11
+ }
12
+ body {
13
+ background-color: #000000;
14
+ min-height: 100vh;
15
+ display: flex;
16
+ flex-direction: column;
17
+ align-items: center;
18
+ position: relative;
19
+ overflow: hidden;
20
+ }
21
+
22
+ .background-elements {
23
+ position: absolute;
24
+ width: 100%;
25
+ height: 100%;
26
+ pointer-events: none;
27
+ }
28
+
29
+ .blood {
30
+ position: absolute;
31
+ }
32
+
33
+ .blood-top-left {
34
+ top: 0;
35
+ left: 0;
36
+ width: 350px;
37
+ opacity: 50%;
38
+ }
39
+
40
+ .blood-bottom-right {
41
+ bottom: 0;
42
+ right: 0;
43
+ width: 250px;
44
+ position: absolute;
45
+ bottom: -120px;
46
+ right: -50px;
47
+ opacity: 40%;
48
+ }
49
+
50
+ .blood-top-right {
51
+ position: absolute;
52
+ top: 0;
53
+ right: 0;
54
+ width: 250px;
55
+ margin: 20px 20px 0px 0px;
56
+ transform: rotate(30deg);
57
+ }
58
+
59
+ .splatter {
60
+ position: absolute;
61
+ opacity: 60%;
62
+ bottom: 240px;
63
+ left: 30%;
64
+ transform: translateX(-50%);
65
+ transform: rotate(20deg);
66
+ width: 400px;
67
+ }
68
+
69
+ main {
70
+ display: flex;
71
+ flex-direction: column;
72
+ align-items: center;
73
+ gap: 100px;
74
+ z-index: 1;
75
+ }
76
+
77
+ .logo {
78
+ position: absolute;
79
+ top: 40px;
80
+ left: 50%;
81
+ transform: translateX(-50%);
82
+ animation: flicker 4s linear infinite;
83
+ }
84
+
85
+ .logo img {
86
+ width: 400px;
87
+ height: auto;
88
+ }
89
+
90
+ .subtitle {
91
+ font-family: "HorrorBrush", cursive;
92
+ color: #fff;
93
+ font-size: 24px;
94
+ text-align: center;
95
+ margin-top: 10px;
96
+ letter-spacing: 2px;
97
+ }
98
+
99
+ .menu {
100
+ display: flex;
101
+ margin-top: 250px;
102
+ flex-direction: column;
103
+ gap: 30px;
104
+ align-items: center;
105
+ position: relative;
106
+ }
107
+
108
+ .menu::after {
109
+ content: "";
110
+ position: absolute;
111
+ width: 800px;
112
+ height: 800px;
113
+ background: radial-gradient(
114
+ circle,
115
+ rgba(155, 0, 0, 0.35) 0%,
116
+ rgba(0, 0, 0, 0) 70%
117
+ );
118
+ z-index: -1;
119
+ top: 50%;
120
+ left: 50%;
121
+ transform: translate(-50%, -50%);
122
+ }
123
+
124
+ .menu-item {
125
+ font-family: "HorrorBrush", cursive;
126
+ font-size: 48px;
127
+ color: #fff;
128
+ text-decoration: none;
129
+ transition: color 0.3s ease;
130
+ letter-spacing: 4px;
131
+ text-transform: uppercase;
132
+ }
133
+
134
+ .new-game {
135
+ color: #9b0000;
136
+ }
137
+
138
+ .menu-item:hover {
139
+ color: #9b0000;
140
+ }
141
+
142
+ .how-to-play:hover {
143
+ color: #9b0000;
144
+ }
145
+
146
+ .level-maker:hover {
147
+ color: #9b0000;
148
+ }
149
+
150
+ @keyframes flicker {
151
+ 0% {
152
+ opacity: 1;
153
+ }
154
+ 5% {
155
+ opacity: 0.9;
156
+ }
157
+ 10% {
158
+ opacity: 1;
159
+ }
160
+ 15% {
161
+ opacity: 0.4;
162
+ }
163
+ 16% {
164
+ opacity: 1;
165
+ }
166
+ 17% {
167
+ opacity: 0.4;
168
+ }
169
+ 18% {
170
+ opacity: 1;
171
+ }
172
+ 35% {
173
+ opacity: 1;
174
+ }
175
+ 36% {
176
+ opacity: 0.3;
177
+ }
178
+ 37% {
179
+ opacity: 1;
180
+ }
181
+ 38% {
182
+ opacity: 0.5;
183
+ }
184
+ 39% {
185
+ opacity: 1;
186
+ }
187
+ 50% {
188
+ opacity: 1;
189
+ }
190
+ 51% {
191
+ opacity: 0.7;
192
+ }
193
+ 52% {
194
+ opacity: 1;
195
+ }
196
+ 53% {
197
+ opacity: 0.4;
198
+ }
199
+ 54% {
200
+ opacity: 1;
201
+ }
202
+ 85% {
203
+ opacity: 1;
204
+ }
205
+ 86% {
206
+ opacity: 0.6;
207
+ }
208
+ 87% {
209
+ opacity: 1;
210
+ }
211
+ 88% {
212
+ opacity: 0.4;
213
+ }
214
+ 89% {
215
+ opacity: 1;
216
+ }
217
+ 100% {
218
+ opacity: 1;
219
+ }
220
+ }
221
+
222
+ .led-bar {
223
+ position: fixed;
224
+ top: 0;
225
+ left: 0;
226
+ width: 100%;
227
+ height: 2px;
228
+ background: linear-gradient(
229
+ 90deg,
230
+ transparent 0%,
231
+ rgba(255, 0, 0, 0.4) 20%,
232
+ rgba(255, 0, 0, 0.8) 35%,
233
+ rgba(255, 50, 50, 1) 50%,
234
+ rgba(255, 0, 0, 0.8) 65%,
235
+ rgba(255, 0, 0, 0.4) 80%,
236
+ transparent 100%
237
+ );
238
+ z-index: 100;
239
+ animation: ledFlicker 4s infinite, ledPulse 10s infinite;
240
+ box-shadow: 0 0 20px rgba(255, 0, 0, 0.7), 0 0 35px rgba(255, 0, 0, 0.5),
241
+ 0 0 50px rgba(255, 0, 0, 0.4), 0 0 70px rgba(155, 0, 0, 0.3);
242
+ filter: blur(0.6px);
243
+ }
244
+
245
+ .light-beam {
246
+ position: absolute;
247
+ top: 0;
248
+ left: 0;
249
+ width: 100%;
250
+ height: 250px;
251
+ background: linear-gradient(
252
+ 180deg,
253
+ rgba(255, 0, 0, 0.3) 0%,
254
+ rgba(255, 0, 0, 0.2) 20%,
255
+ rgba(255, 0, 0, 0.15) 30%,
256
+ rgba(155, 0, 0, 0.08) 60%,
257
+ transparent 100%
258
+ );
259
+ animation: beamFlicker 4s infinite;
260
+ pointer-events: none;
261
+ filter: blur(2px);
262
+ }
263
+
264
+ @keyframes ledFlicker {
265
+ 0% {
266
+ opacity: 1;
267
+ }
268
+ 95% {
269
+ opacity: 1;
270
+ }
271
+ 96% {
272
+ opacity: 0.3;
273
+ }
274
+ 97% {
275
+ opacity: 1;
276
+ }
277
+ 98% {
278
+ opacity: 0.2;
279
+ }
280
+ 99% {
281
+ opacity: 0.9;
282
+ }
283
+ 100% {
284
+ opacity: 1;
285
+ }
286
+ }
287
+
288
+ @keyframes ledPulse {
289
+ 0% {
290
+ filter: brightness(1) blur(0.6px);
291
+ }
292
+ 50% {
293
+ filter: brightness(1.3) blur(0.4px);
294
+ }
295
+ 100% {
296
+ filter: brightness(1) blur(0.6px);
297
+ }
298
+ }
299
+
300
+ @keyframes beamFlicker {
301
+ 0% {
302
+ opacity: 0.7;
303
+ }
304
+ 95% {
305
+ opacity: 0.7;
306
+ }
307
+ 96% {
308
+ opacity: 0.2;
309
+ }
310
+ 97% {
311
+ opacity: 0.7;
312
+ }
313
+ 98% {
314
+ opacity: 0.1;
315
+ }
316
+ 99% {
317
+ opacity: 0.6;
318
+ }
319
+ 100% {
320
+ opacity: 0.7;
321
+ }
322
+ }
323
+
324
+ /* How to Play Page Styles */
325
+ .content {
326
+ color: #fff;
327
+ text-align: center;
328
+ max-width: 800px;
329
+ margin: 0 auto;
330
+ padding: 20px;
331
+ display: flex;
332
+ flex-direction: column;
333
+ align-items: center;
334
+ margin-top: 0px;
335
+ }
336
+
337
+ .content h1 {
338
+ font-family: "HorrorBrush", cursive;
339
+ font-size: 64px;
340
+ color: #9b0000;
341
+ position: relative;
342
+ margin-bottom: 30px;
343
+ letter-spacing: 4px;
344
+ }
345
+
346
+ .game-description p {
347
+ font-size: 2.5rem;
348
+ margin-bottom: 2rem;
349
+ color: #fff;
350
+ }
351
+
352
+ .back-button {
353
+ font-family: "HorrorBrush", cursive;
354
+ font-size: 36px;
355
+ color: #fff;
356
+ text-decoration: none;
357
+ transition: color 0.3s ease;
358
+ letter-spacing: 4px;
359
+ text-transform: uppercase;
360
+ position: absolute;
361
+ bottom: 40px;
362
+ left: 50%;
363
+ transform: translateX(-50%);
364
+ }
365
+
366
+ .back-button:hover {
367
+ color: #9b0000;
368
+ }
369
+
370
+ .character {
371
+ position: absolute;
372
+ bottom: -30px;
373
+ left: 50%;
374
+ transform: translateX(-50%);
375
+ z-index: 2;
376
+ animation: characterFlicker 6s infinite;
377
+ }
378
+
379
+ .character img {
380
+ width: 550px;
381
+ height: auto;
382
+ }
383
+
384
+ @keyframes characterFlicker {
385
+ 0% {
386
+ opacity: 1;
387
+ filter: brightness(1);
388
+ }
389
+ 42% {
390
+ opacity: 1;
391
+ filter: brightness(1);
392
+ }
393
+ 43% {
394
+ opacity: 0.8;
395
+ filter: brightness(1.2);
396
+ }
397
+ 44% {
398
+ opacity: 1;
399
+ filter: brightness(1);
400
+ }
401
+ 45% {
402
+ opacity: 0.6;
403
+ filter: brightness(1.3);
404
+ }
405
+ 46% {
406
+ opacity: 1;
407
+ filter: brightness(1);
408
+ }
409
+ 47% {
410
+ opacity: 0.2;
411
+ filter: brightness(1.5);
412
+ }
413
+ 48% {
414
+ opacity: 1;
415
+ filter: brightness(1);
416
+ }
417
+ 49% {
418
+ opacity: 0.4;
419
+ filter: brightness(1.2);
420
+ }
421
+ 50% {
422
+ opacity: 1;
423
+ filter: brightness(1);
424
+ }
425
+ 80% {
426
+ opacity: 1;
427
+ filter: brightness(1);
428
+ }
429
+ 81% {
430
+ opacity: 0.5;
431
+ filter: brightness(1.3);
432
+ }
433
+ 82% {
434
+ opacity: 1;
435
+ filter: brightness(1);
436
+ }
437
+ 100% {
438
+ opacity: 1;
439
+ filter: brightness(1);
440
+ }
441
+ }
442
+
443
+ /* Modifier les styles pour le bouton son */
444
+ .sound-button {
445
+ position: fixed;
446
+ bottom: 20px;
447
+ left: 20px;
448
+ width: 100px;
449
+ height: 100px;
450
+ cursor: pointer;
451
+ z-index: 1000;
452
+ transition: transform 0.2s ease;
453
+ }
454
+
455
+ .sound-button:hover {
456
+ transform: scale(1.1);
457
+ }
458
+
459
+ .sound-button img {
460
+ width: 100%;
461
+ height: 100%;
462
+ object-fit: contain;
463
+ }
464
+
465
+ .gf-image {
466
+ width: 400px;
467
+ height: auto;
468
+ margin-top: 50px;
469
+ }
470
+
471
+ .next-button {
472
+ font-family: "HorrorBrush", cursive;
473
+ font-size: 36px;
474
+ color: #fff;
475
+ text-decoration: none;
476
+ transition: all 0.3s ease;
477
+ letter-spacing: 4px;
478
+ text-transform: uppercase;
479
+ display: block;
480
+ margin-top: 50px;
481
+ background-color: rgba(155, 0, 0, 0.3);
482
+ padding: 10px 30px;
483
+ border: 2px solid #9b0000;
484
+ border-radius: 5px;
485
+ }
486
+
487
+ .next-button:hover {
488
+ color: #9b0000;
489
+ background-color: rgba(155, 0, 0, 0.1);
490
+ box-shadow: 0 0 15px rgba(155, 0, 0, 0.5);
491
+ }
static/assets/css/popup.css ADDED
@@ -0,0 +1,236 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ @font-face {
2
+ font-family: "HorrorBrush";
3
+ src: url("/static/assets/fonts/horrorbrush.ttf") format("truetype");
4
+ }
5
+
6
+ .popup-overlay {
7
+ position: fixed;
8
+ top: 0;
9
+ left: 0;
10
+ width: 100%;
11
+ height: 100%;
12
+ background-color: rgba(0, 0, 0, 0.202);
13
+ backdrop-filter: blur(8px);
14
+ z-index: 1000;
15
+ display: block;
16
+ }
17
+
18
+ .popup-loser {
19
+ position: fixed;
20
+ top: 50%;
21
+ left: 50%;
22
+ transform: translate(-50%, -50%);
23
+ width: 800px;
24
+ height: 500px;
25
+ background-color: #141313;
26
+ border-radius: 20px;
27
+ box-shadow: 0 0 30px rgba(0, 0, 0, 0.5);
28
+ z-index: 1001;
29
+ display: none;
30
+ overflow: hidden;
31
+ }
32
+
33
+ .popup-loser .clown {
34
+ position: absolute;
35
+ bottom: -5px;
36
+ right: -5px;
37
+ width: 300px;
38
+ height: auto;
39
+ z-index: 1002;
40
+ }
41
+
42
+ .popup-loser .blood-top {
43
+ position: absolute;
44
+ top: -100px;
45
+ left: -100px;
46
+ width: 300px;
47
+ height: auto;
48
+ z-index: 1002;
49
+ }
50
+
51
+ .popup-loser .blood-bottom {
52
+ position: absolute;
53
+ bottom: -100px;
54
+ right: -100px;
55
+ width: 300px;
56
+ height: auto;
57
+ transform: rotate(180deg);
58
+ z-index: 1001;
59
+ }
60
+
61
+ .popup-loser .title {
62
+ position: absolute;
63
+ left: 40%;
64
+ transform: translateX(-50%);
65
+ font-size: 120px;
66
+ font-weight: bold;
67
+ color: #9b0000;
68
+ text-shadow: 10px 10px 4px #4d0000;
69
+ font-family: "HorrorBrush", cursive;
70
+ z-index: 1003;
71
+ }
72
+
73
+ .popup-loser .title-glow {
74
+ position: absolute;
75
+ top: 50%;
76
+ left: 40%;
77
+ transform: translate(-50%, -50%);
78
+ width: 600px;
79
+ height: 600px;
80
+ background: radial-gradient(
81
+ circle,
82
+ rgba(155, 0, 0, 0.2) 0%,
83
+ rgba(0, 0, 0, 0) 90%
84
+ );
85
+ z-index: 1002;
86
+ pointer-events: none;
87
+ }
88
+
89
+ .popup-loser .play-again {
90
+ position: absolute;
91
+ bottom: 130px;
92
+ left: 40%;
93
+ transform: translateX(-50%);
94
+ padding: 15px 40px;
95
+ min-width: 230px;
96
+ font-size: 42px;
97
+ font-family: "HorrorBrush", cursive;
98
+ color: #ffffff;
99
+ background-color: #9b0000;
100
+ border-radius: 15px;
101
+ cursor: pointer;
102
+ transition: all 0.3s ease;
103
+ box-shadow: 0 5px 15px rgba(155, 0, 0, 0.4);
104
+ z-index: 1003;
105
+ letter-spacing: 2px;
106
+ line-height: 1;
107
+ white-space: nowrap;
108
+ height: auto;
109
+ display: flex;
110
+ align-items: center;
111
+ justify-content: center;
112
+ }
113
+
114
+ .popup-loser .play-again:hover {
115
+ background-color: #cc0000;
116
+ transform: translateX(-50%) scale(1.05);
117
+ box-shadow: 0 8px 20px rgba(155, 0, 0, 0.6);
118
+ }
119
+
120
+ /* Popup Winner */
121
+ .popup-winner {
122
+ position: fixed;
123
+ top: 50%;
124
+ left: 50%;
125
+ transform: translate(-50%, -50%);
126
+ width: 800px;
127
+ height: 500px;
128
+ border-radius: 20px;
129
+ box-shadow: 0 0 30px rgba(0, 0, 0, 0.5);
130
+ z-index: 1001;
131
+ display: block;
132
+ overflow: hidden;
133
+ background-image: url("/static/assets/img/popup/background.jpg");
134
+ background-size: cover;
135
+ background-position: center;
136
+ }
137
+
138
+ .popup-winner .win-text {
139
+ position: absolute;
140
+ top: 35%;
141
+ left: 35%;
142
+ transform: translate(-50%, -50%);
143
+ width: 60%;
144
+ height: auto;
145
+ z-index: 1003;
146
+ }
147
+
148
+ .popup-winner .fuck {
149
+ position: absolute;
150
+ bottom: -10px;
151
+ right: -10px;
152
+ width: 350px;
153
+ height: auto;
154
+ z-index: 1004;
155
+ }
156
+
157
+ .popup-winner .stars1 {
158
+ position: absolute;
159
+ right: 40px;
160
+ left: 80%;
161
+ top: 0%;
162
+ width: 200px;
163
+ height: auto;
164
+ z-index: 1002;
165
+ }
166
+
167
+ .popup-winner .stars2 {
168
+ position: absolute;
169
+ bottom: -10px;
170
+ right: 40px;
171
+ width: 500px;
172
+ height: auto;
173
+ z-index: 1002;
174
+ }
175
+
176
+ .popup-winner .play-again {
177
+ position: absolute;
178
+ bottom: 40px;
179
+ left: 27%;
180
+ top: auto;
181
+ transform: translateX(-50%);
182
+ padding: 20px 60px;
183
+ min-width: 350px;
184
+ height: 80px;
185
+ font-size: 30px;
186
+ font-family: "Comic Sans MS", cursive;
187
+ color: #ffffff;
188
+ background: linear-gradient(45deg, #ff69b4, #ff1493);
189
+ border: 3px solid #fff;
190
+ border-radius: 40px;
191
+ cursor: pointer;
192
+ transition: all 0.3s ease;
193
+ box-shadow: 0 5px 20px rgba(255, 105, 180, 0.6),
194
+ inset 0 0 20px rgba(255, 255, 255, 0.4);
195
+ z-index: 1003;
196
+ letter-spacing: 1px;
197
+ text-transform: uppercase;
198
+ animation: sparkle 2s infinite;
199
+ white-space: nowrap;
200
+ display: flex;
201
+ align-items: center;
202
+ justify-content: center;
203
+ line-height: 1;
204
+ }
205
+
206
+ .popup-winner .play-again:hover {
207
+ transform: translateX(-50%) scale(1.05);
208
+ background: linear-gradient(45deg, #ff1493, #ff69b4);
209
+ box-shadow: 0 8px 25px rgba(255, 105, 180, 0.8),
210
+ inset 0 0 30px rgba(255, 255, 255, 0.6);
211
+ letter-spacing: 3px;
212
+ }
213
+
214
+ .popup-winner .play-again::before {
215
+ content: "✨";
216
+ position: absolute;
217
+ left: 25px;
218
+ }
219
+
220
+ .popup-winner .play-again::after {
221
+ content: "✨";
222
+ position: absolute;
223
+ right: 25px;
224
+ }
225
+
226
+ @keyframes sparkle {
227
+ 0% {
228
+ text-shadow: 0 0 10px #fff, 0 0 20px #fff, 0 0 30px #ff69b4;
229
+ }
230
+ 50% {
231
+ text-shadow: 0 0 20px #fff, 0 0 30px #fff, 0 0 40px #ff1493;
232
+ }
233
+ 100% {
234
+ text-shadow: 0 0 10px #fff, 0 0 20px #fff, 0 0 30px #ff69b4;
235
+ }
236
+ }
static/assets/css/stress-animations.css ADDED
@@ -0,0 +1,235 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /* Classes de base pour la photo de profil */
2
+ #chatSection .profile-picture {
3
+ width: 40px;
4
+ height: 40px;
5
+ border-radius: 50%;
6
+ overflow: hidden;
7
+ margin-right: 10px;
8
+ }
9
+
10
+ #chatSection .profile-picture img {
11
+ width: 100%;
12
+ height: 100%;
13
+ object-fit: cover;
14
+ }
15
+
16
+ /* État: No Stress */
17
+ #chatSection.no-stress .profile-picture {
18
+ border: 2px solid #607ab1;
19
+ }
20
+
21
+ #chatSection.no-stress .chat-name {
22
+ color: #333;
23
+ }
24
+
25
+ /* État: Low Stress - Animation de pulsation modérée */
26
+ #chatSection.low-stress .profile-picture {
27
+ border: 2px solid #ffa500;
28
+ animation: lowStressPulse 1.5s infinite;
29
+ box-shadow: 0 0 5px rgba(255, 165, 0, 0.3);
30
+ }
31
+
32
+ #chatSection.low-stress .chat-name {
33
+ animation: lowStressTextPulse 1.5s infinite;
34
+ }
35
+
36
+ #chatSection.low-stress #chatHistory .ai-message {
37
+ background-color: #ffa500;
38
+ color: #ffffff;
39
+ animation: lowStressMessagePulse 2s infinite,
40
+ lowStressMessageScale 1.5s infinite;
41
+ border: 1px solid #ffa500;
42
+ }
43
+
44
+ @keyframes lowStressPulse {
45
+ 0% {
46
+ box-shadow: 0 0 0 0 rgba(255, 165, 0, 0.3);
47
+ transform: scale(1);
48
+ }
49
+ 50% {
50
+ box-shadow: 0 0 10px 3px rgba(255, 165, 0, 0.5);
51
+ transform: scale(1.03);
52
+ }
53
+ 100% {
54
+ box-shadow: 0 0 0 0 rgba(255, 165, 0, 0);
55
+ transform: scale(1);
56
+ }
57
+ }
58
+
59
+ @keyframes lowStressTextPulse {
60
+ 0% {
61
+ transform: scale(1);
62
+ }
63
+ 50% {
64
+ transform: scale(1.05);
65
+ }
66
+ 100% {
67
+ transform: scale(1);
68
+ }
69
+ }
70
+
71
+ @keyframes lowStressMessagePulse {
72
+ 0% {
73
+ background-color: #ffa500;
74
+ box-shadow: 0 0 0 0 rgba(255, 165, 0, 0.3);
75
+ }
76
+ 50% {
77
+ background-color: #ffb733;
78
+ box-shadow: 0 0 8px 0 rgba(255, 165, 0, 0.4);
79
+ }
80
+ 100% {
81
+ background-color: #ffa500;
82
+ box-shadow: 0 0 0 0 rgba(255, 165, 0, 0.3);
83
+ }
84
+ }
85
+
86
+ @keyframes lowStressMessageScale {
87
+ 0% {
88
+ transform: scale(1);
89
+ }
90
+ 50% {
91
+ transform: scale(1.02);
92
+ }
93
+ 100% {
94
+ transform: scale(1);
95
+ }
96
+ }
97
+
98
+ /* État: Very Stress - Animation de pulsation intense */
99
+ #chatSection.very-stress {
100
+ background-color: #1a1a1a;
101
+ transition: background-color 0.3s ease;
102
+ }
103
+
104
+ #chatSection.very-stress #chatHeader {
105
+ background-color: #1a1a1a;
106
+ transition: background-color 0.3s ease;
107
+ }
108
+
109
+ #chatSection.very-stress .profile-picture {
110
+ border: 3px solid #ff0000;
111
+ animation: veryStressPulse 0.8s infinite;
112
+ box-shadow: 0 0 10px rgba(255, 0, 0, 0.5);
113
+ }
114
+
115
+ #chatSection.very-stress .chat-name {
116
+ color: #ff0000;
117
+ animation: veryStressTextPulse 0.8s infinite;
118
+ font-weight: bold;
119
+ text-shadow: 0 0 10px rgba(255, 0, 0, 0.8);
120
+ }
121
+
122
+ #chatSection.very-stress #chatHistory {
123
+ background-color: #1a1a1a;
124
+ color: #ffffff;
125
+ }
126
+
127
+ #chatSection.very-stress #chatHistory .ai-message {
128
+ background-color: #e92626;
129
+ color: #ffffff;
130
+ animation: messageShake 0.8s infinite ease-in-out, messageRedPulse 1.5s infinite;
131
+ border: 2px solid #ff0000;
132
+ box-shadow: 0 0 15px rgba(255, 0, 0, 0.4);
133
+ transform-origin: center;
134
+ }
135
+
136
+ #chatSection.very-stress #chatHistory .assistant-message {
137
+ background-color: #2d2d2d;
138
+ color: #ff9999;
139
+ border: 1px solid #ff0000;
140
+ animation: assistantMessageShake 1.5s infinite ease-in-out;
141
+ transform-origin: center;
142
+ }
143
+
144
+ #chatSection.very-stress #chatControls {
145
+ background-color: #1a1a1a;
146
+ }
147
+
148
+ #chatSection.very-stress #prompt {
149
+ background-color: #2d2d2d;
150
+ color: #ffffff;
151
+ border: 1px solid #ffffff;
152
+ }
153
+
154
+ #chatSection.very-stress .chat-name::after {
155
+ content: "💀💀";
156
+ }
157
+
158
+ #chatSection.very-stress .chat-name span {
159
+ display: none;
160
+ }
161
+
162
+ @keyframes veryStressPulse {
163
+ 0% {
164
+ box-shadow: 0 0 0 0 rgba(255, 0, 0, 0.5);
165
+ transform: scale(1);
166
+ }
167
+ 50% {
168
+ box-shadow: 0 0 15px 5px rgba(255, 0, 0, 0.7);
169
+ transform: scale(1.05);
170
+ }
171
+ 100% {
172
+ box-shadow: 0 0 0 0 rgba(255, 0, 0, 0);
173
+ transform: scale(1);
174
+ }
175
+ }
176
+
177
+ @keyframes veryStressTextPulse {
178
+ 0% {
179
+ text-shadow: 0 0 0 rgba(255, 0, 0, 0);
180
+ transform: scale(1);
181
+ }
182
+ 50% {
183
+ text-shadow: 0 0 10px rgba(255, 0, 0, 0.8);
184
+ transform: scale(1.08);
185
+ }
186
+ 100% {
187
+ text-shadow: 0 0 0 rgba(255, 0, 0, 0);
188
+ transform: scale(1);
189
+ }
190
+ }
191
+
192
+ @keyframes messageShake {
193
+ 0%, 100% {
194
+ transform: translate(0, 0) rotate(0deg);
195
+ }
196
+ 25% {
197
+ transform: translate(-2px, 1px) rotate(-0.5deg);
198
+ }
199
+ 50% {
200
+ transform: translate(0, -1px) rotate(0.5deg);
201
+ }
202
+ 75% {
203
+ transform: translate(2px, 1px) rotate(-0.25deg);
204
+ }
205
+ }
206
+
207
+ @keyframes messageRedPulse {
208
+ 0% {
209
+ background-color: #e92626;
210
+ box-shadow: 0 0 0 0 rgba(233, 38, 38, 0.4);
211
+ }
212
+ 50% {
213
+ background-color: #ff3333;
214
+ box-shadow: 0 0 10px 0 rgba(233, 38, 38, 0.6);
215
+ }
216
+ 100% {
217
+ background-color: #e92626;
218
+ box-shadow: 0 0 0 0 rgba(233, 38, 38, 0.4);
219
+ }
220
+ }
221
+
222
+ @keyframes assistantMessageShake {
223
+ 0%, 100% {
224
+ transform: translate(0, 0) rotate(0deg);
225
+ }
226
+ 25% {
227
+ transform: translate(-1px, 0.5px) rotate(-0.25deg);
228
+ }
229
+ 50% {
230
+ transform: translate(0, -0.5px) rotate(0.25deg);
231
+ }
232
+ 75% {
233
+ transform: translate(1px, 0.5px) rotate(-0.125deg);
234
+ }
235
+ }
static/assets/fonts/horrorbrush.ttf ADDED
Binary file (286 kB). View file
 
static/assets/img/.DS_Store ADDED
Binary file (10.2 kB). View file
 
static/assets/img/appartment/.DS_Store ADDED
Binary file (6.15 kB). View file
 
static/assets/img/appartment/basemap.png ADDED
static/assets/img/appartment/bedroomdoorlocked.png ADDED
static/assets/img/appartment/bedroomdoorunlocked.png ADDED
static/assets/img/appartment/bookcasesearchable.png ADDED
static/assets/img/appartment/bookcaseunusuable.png ADDED
static/assets/img/appartment/bookcaseusable.png ADDED
static/assets/img/appartment/cabinetsearchable.png ADDED
static/assets/img/appartment/cabinetunsearchable.png ADDED
static/assets/img/appartment/coffeetableunusable.png ADDED
static/assets/img/appartment/coffeetableusable.png ADDED
static/assets/img/appartment/deadbodyunusable.png ADDED
static/assets/img/appartment/deadbodyusable.png ADDED
static/assets/img/appartment/desksearchable.png ADDED
static/assets/img/appartment/deskunsearchable.png ADDED
static/assets/img/appartment/dressersearchable.png ADDED
static/assets/img/appartment/dresserunsearchable.png ADDED
static/assets/img/appartment/finalmap.png ADDED
static/assets/img/appartment/fridgesearchable.png ADDED
static/assets/img/appartment/fridgeunsearchable.png ADDED
static/assets/img/appartment/generatoroff.png ADDED
static/assets/img/appartment/generatoron.png ADDED
static/assets/img/appartment/mainentranceopen.png ADDED
static/assets/img/appartment/storagelocked.png ADDED
static/assets/img/appartment/storageunlocked.png ADDED
static/assets/img/appartment/stovesearchable.png ADDED
static/assets/img/appartment/stoveunsearchable.png ADDED
static/assets/img/appartment/theexit.png ADDED
static/assets/img/appartment/tvunused.png ADDED
static/assets/img/appartment/tvused.png ADDED
static/assets/img/blood-2.png ADDED
static/assets/img/clown.png ADDED