LukasBe commited on
Commit
d0feeee
·
verified ·
1 Parent(s): f37b5b9

Add 3 files

Browse files
Files changed (3) hide show
  1. README.md +7 -5
  2. index.html +594 -18
  3. prompts.txt +1 -0
README.md CHANGED
@@ -1,10 +1,12 @@
1
  ---
2
- title: Chaos Cannon Crt
3
- emoji: 🌍
4
- colorFrom: yellow
5
- colorTo: gray
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: chaos-cannon-crt
3
+ emoji: 🐳
4
+ colorFrom: green
5
+ colorTo: green
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,595 @@
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>
3
+ <head>
4
+ <title>Chaos Cannon - CRT Edition</title>
5
+ <script src="https://cdn.tailwindcss.com"></script>
6
+ <style>
7
+ body {
8
+ background: #000;
9
+ overflow: hidden;
10
+ font-family: 'Courier New', monospace;
11
+ }
12
+
13
+ #crt-screen {
14
+ position: relative;
15
+ width: 800px;
16
+ height: 600px;
17
+ margin: 20px auto;
18
+ background: #111;
19
+ border-radius: 10px;
20
+ box-shadow: 0 0 20px rgba(0, 255, 0, 0.3),
21
+ inset 0 0 50px rgba(0, 255, 0, 0.1);
22
+ overflow: hidden;
23
+ padding: 10px;
24
+ }
25
+
26
+ #crt-effect {
27
+ position: absolute;
28
+ top: 0;
29
+ left: 0;
30
+ width: 100%;
31
+ height: 100%;
32
+ background: linear-gradient(rgba(0, 255, 0, 0.1) 1px, transparent 1px);
33
+ background-size: 100% 2px;
34
+ pointer-events: none;
35
+ z-index: 10;
36
+ }
37
+
38
+ #crt-curve {
39
+ position: absolute;
40
+ top: 0;
41
+ left: 0;
42
+ width: 100%;
43
+ height: 100%;
44
+ border-radius: 50% 50% 50% 50% / 10% 10% 10% 10%;
45
+ box-shadow: inset 0 0 20px rgba(0, 255, 0, 0.2);
46
+ pointer-events: none;
47
+ z-index: 5;
48
+ }
49
+
50
+ #crt-glow {
51
+ position: absolute;
52
+ top: 0;
53
+ left: 0;
54
+ width: 100%;
55
+ height: 100%;
56
+ background: radial-gradient(circle at center, rgba(0, 255, 0, 0.05) 0%, transparent 70%);
57
+ pointer-events: none;
58
+ z-index: 1;
59
+ }
60
+
61
+ #crt-noise {
62
+ position: absolute;
63
+ top: 0;
64
+ left: 0;
65
+ width: 100%;
66
+ height: 100%;
67
+ background: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADIAAAAyCAYAAAAeP4ixAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAABOSURBVGhD7c4xAQAgDAAx9I9h6Q8O3kQk5+0BAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADgBx5hBQHXQ1JQAAAAAElFTkSuQmCC');
68
+ opacity: 0.03;
69
+ pointer-events: none;
70
+ z-index: 15;
71
+ }
72
+
73
+ #game {
74
+ display: block;
75
+ width: 100%;
76
+ height: 100%;
77
+ background: #000;
78
+ border-radius: 5px;
79
+ }
80
+
81
+ .crt-reflection {
82
+ position: absolute;
83
+ top: 50%;
84
+ left: 50%;
85
+ width: 100%;
86
+ height: 100%;
87
+ background: linear-gradient(135deg, rgba(0,255,0,0.1) 0%, transparent 50%);
88
+ transform: translate(-50%, -50%);
89
+ pointer-events: none;
90
+ z-index: 20;
91
+ }
92
+
93
+ .crt-label {
94
+ position: absolute;
95
+ bottom: 10px;
96
+ right: 20px;
97
+ color: #0f0;
98
+ font-size: 12px;
99
+ text-shadow: 0 0 5px #0f0;
100
+ z-index: 30;
101
+ }
102
+
103
+ .crt-power {
104
+ position: absolute;
105
+ bottom: 10px;
106
+ left: 20px;
107
+ color: #0f0;
108
+ font-size: 12px;
109
+ text-shadow: 0 0 5px #0f0;
110
+ z-index: 30;
111
+ }
112
+
113
+ .crt-power::before {
114
+ content: "";
115
+ display: inline-block;
116
+ width: 8px;
117
+ height: 8px;
118
+ background: #0f0;
119
+ border-radius: 50%;
120
+ margin-right: 5px;
121
+ box-shadow: 0 0 5px #0f0;
122
+ animation: power-pulse 1s infinite alternate;
123
+ }
124
+
125
+ @keyframes power-pulse {
126
+ 0% { opacity: 0.5; }
127
+ 100% { opacity: 1; }
128
+ }
129
+
130
+ @keyframes flicker {
131
+ 0% { opacity: 0.9; }
132
+ 5% { opacity: 0.8; }
133
+ 10% { opacity: 0.95; }
134
+ 15% { opacity: 0.85; }
135
+ 20% { opacity: 1; }
136
+ 25% { opacity: 0.9; }
137
+ 30% { opacity: 0.98; }
138
+ 35% { opacity: 0.87; }
139
+ 40% { opacity: 0.94; }
140
+ 45% { opacity: 0.91; }
141
+ 50% { opacity: 0.99; }
142
+ 100% { opacity: 1; }
143
+ }
144
+
145
+ .flicker {
146
+ animation: flicker 0.1s infinite;
147
+ }
148
+ </style>
149
+ </head>
150
+ <body class="bg-black flex items-center justify-center h-screen">
151
+ <div id="crt-screen" class="relative">
152
+ <div id="crt-glow"></div>
153
+ <div id="crt-curve"></div>
154
+ <canvas id="game" width="800" height="600"></canvas>
155
+ <div id="crt-effect"></div>
156
+ <div id="crt-noise"></div>
157
+ <div class="crt-reflection"></div>
158
+ <div class="crt-power">POWER</div>
159
+ <div class="crt-label">CHAOS CANNON v1.0</div>
160
+ </div>
161
+
162
+ <script>
163
+ const canvas = document.getElementById('game');
164
+ const ctx = canvas.getContext('2d');
165
+ const audioContext = new (window.AudioContext || window.webkitAudioContext)();
166
+
167
+ // Add vintage color palette
168
+ const colors = {
169
+ background: '#0a0a0a',
170
+ turretBase: '#00ff00',
171
+ turretBarrel: '#00cc00',
172
+ projectile: '#ff6600',
173
+ enemy: '#00ff00',
174
+ text: '#00ff00',
175
+ particle1: '#ff3300',
176
+ particle2: '#ff9900',
177
+ particle3: '#ffff00'
178
+ };
179
+
180
+ class Game {
181
+ constructor() {
182
+ this.state = 'title';
183
+ this.score = 0;
184
+ this.shake = 0;
185
+ this.turret = new Turret();
186
+ this.projectiles = [];
187
+ this.enemies = [];
188
+ this.particles = [];
189
+ this.explosions = [];
190
+ this.flickerTimer = 0;
191
+
192
+ canvas.addEventListener('click', (e) => {
193
+ if(this.state === 'title') {
194
+ this.start();
195
+ } else if(this.state === 'playing') {
196
+ this.turret.shoot(this);
197
+ }
198
+ });
199
+
200
+ canvas.addEventListener('mousemove', (e) => {
201
+ this.turret.angle = Math.atan2(
202
+ e.clientY - canvas.offsetTop - this.turret.y,
203
+ e.clientX - canvas.offsetLeft - this.turret.x
204
+ );
205
+ });
206
+ }
207
+
208
+ start() {
209
+ this.state = 'playing';
210
+ this.score = 0;
211
+ this.spawnEnemies();
212
+ }
213
+
214
+ spawnEnemies() {
215
+ setInterval(() => {
216
+ this.enemies.push(new Enemy(
217
+ Math.random() * canvas.width,
218
+ -50,
219
+ Math.random() * 2 + 1
220
+ ));
221
+ }, 1500);
222
+ }
223
+
224
+ update() {
225
+ if(this.state !== 'playing') return;
226
+
227
+ this.flickerTimer++;
228
+ if(this.flickerTimer > 10) {
229
+ this.flickerTimer = 0;
230
+ document.getElementById('crt-effect').classList.toggle('flicker');
231
+ }
232
+
233
+ // Update all entities
234
+ this.turret.update();
235
+ this.projectiles.forEach(p => p.update(this));
236
+ this.enemies.forEach(e => e.update(this));
237
+ this.particles.forEach(p => p.update());
238
+ this.explosions.forEach(e => e.update(this));
239
+
240
+ // Check collisions
241
+ this.projectiles.forEach(projectile => {
242
+ this.enemies.forEach((enemy, i) => {
243
+ if(Math.hypot(
244
+ projectile.x - enemy.x,
245
+ projectile.y - enemy.y
246
+ ) < 20) {
247
+ this.explosions.push(new Explosion(enemy.x, enemy.y));
248
+ this.enemies.splice(i, 1);
249
+ this.score += 100;
250
+ this.shake = 10;
251
+ this.playExplosionSound();
252
+ }
253
+ });
254
+ });
255
+
256
+ // Cleanup
257
+ this.projectiles = this.projectiles.filter(p => !p.dead);
258
+ this.particles = this.particles.filter(p => !p.dead);
259
+ this.explosions = this.explosions.filter(e => !e.dead);
260
+ }
261
+
262
+ draw() {
263
+ ctx.save();
264
+ if(this.shake > 0) {
265
+ ctx.translate(
266
+ Math.random() * this.shake - this.shake/2,
267
+ Math.random() * this.shake - this.shake/2
268
+ );
269
+ this.shake *= 0.9;
270
+ }
271
+
272
+ // Draw scanlines effect
273
+ ctx.fillStyle = 'rgba(0, 20, 0, 0.3)';
274
+ for(let y = 0; y < canvas.height; y += 2) {
275
+ ctx.fillRect(0, y, canvas.width, 1);
276
+ }
277
+
278
+ // Draw vignette
279
+ const gradient = ctx.createRadialGradient(
280
+ canvas.width/2, canvas.height/2, 0,
281
+ canvas.width/2, canvas.height/2, Math.max(canvas.width, canvas.height)/2
282
+ );
283
+ gradient.addColorStop(0, 'rgba(0, 0, 0, 0)');
284
+ gradient.addColorStop(0.7, 'rgba(0, 10, 0, 0.5)');
285
+ gradient.addColorStop(1, 'rgba(0, 20, 0, 0.8)');
286
+ ctx.fillStyle = gradient;
287
+ ctx.fillRect(0, 0, canvas.width, canvas.height);
288
+
289
+ // Draw all entities
290
+ this.turret.draw(ctx);
291
+ this.projectiles.forEach(p => p.draw(ctx));
292
+ this.enemies.forEach(e => e.draw(ctx));
293
+ this.particles.forEach(p => p.draw(ctx));
294
+ this.explosions.forEach(e => e.draw(ctx));
295
+
296
+ // UI
297
+ ctx.fillStyle = colors.text;
298
+ ctx.font = '20px "Courier New", monospace';
299
+ ctx.fillText(`SCORE: ${this.score}`, 20, 30);
300
+
301
+ if(this.state === 'title') {
302
+ ctx.fillStyle = 'rgba(0,0,0,0.8)';
303
+ ctx.fillRect(0, 0, canvas.width, canvas.height);
304
+
305
+ // Title text with glow effect
306
+ ctx.fillStyle = colors.text;
307
+ ctx.font = 'bold 48px "Courier New", monospace';
308
+ const title = 'CHAOS CANNON';
309
+ const titleWidth = ctx.measureText(title).width;
310
+ ctx.fillText(title, canvas.width/2 - titleWidth/2, canvas.height/2);
311
+
312
+ // Glow effect
313
+ for(let i = 0; i < 3; i++) {
314
+ ctx.strokeStyle = `rgba(0, 255, 0, ${0.3 - i*0.1})`;
315
+ ctx.lineWidth = 5 - i*2;
316
+ ctx.strokeText(title, canvas.width/2 - titleWidth/2, canvas.height/2);
317
+ }
318
+
319
+ ctx.font = '24px "Courier New", monospace';
320
+ ctx.fillText('CLICK TO START', canvas.width/2 - 100, canvas.height/2 + 50);
321
+ }
322
+
323
+ ctx.restore();
324
+ }
325
+
326
+ playExplosionSound() {
327
+ const oscillator = audioContext.createOscillator();
328
+ const gainNode = audioContext.createGain();
329
+
330
+ oscillator.connect(gainNode);
331
+ gainNode.connect(audioContext.destination);
332
+
333
+ oscillator.type = 'square';
334
+ oscillator.frequency.value = 100 + Math.random() * 100;
335
+ gainNode.gain.setValueAtTime(0.2, audioContext.currentTime);
336
+ gainNode.gain.exponentialRampToValueAtTime(0.01, audioContext.currentTime + 0.3);
337
+
338
+ oscillator.start();
339
+ oscillator.stop(audioContext.currentTime + 0.3);
340
+ }
341
+ }
342
+
343
+ class Turret {
344
+ constructor() {
345
+ this.x = canvas.width/2;
346
+ this.y = canvas.height - 50;
347
+ this.angle = 0;
348
+ this.cooldown = 0;
349
+ }
350
+
351
+ update() {
352
+ if(this.cooldown > 0) this.cooldown--;
353
+ }
354
+
355
+ shoot(game) {
356
+ if(this.cooldown <= 0) {
357
+ game.projectiles.push(new Projectile(
358
+ this.x + Math.cos(this.angle) * 40,
359
+ this.y + Math.sin(this.angle) * 40,
360
+ Math.cos(this.angle) * 15,
361
+ Math.sin(this.angle) * 15
362
+ ));
363
+ this.cooldown = 10;
364
+ }
365
+ }
366
+
367
+ draw(ctx) {
368
+ ctx.save();
369
+ ctx.translate(this.x, this.y);
370
+ ctx.rotate(this.angle);
371
+
372
+ // Barrel
373
+ ctx.fillStyle = colors.turretBarrel;
374
+ ctx.fillRect(0, -5, 40, 10);
375
+
376
+ // Add barrel glow
377
+ const barrelGradient = ctx.createLinearGradient(0, -5, 40, 10);
378
+ barrelGradient.addColorStop(0, 'rgba(0, 255, 0, 0.8)');
379
+ barrelGradient.addColorStop(1, 'rgba(0, 200, 0, 0.8)');
380
+ ctx.fillStyle = barrelGradient;
381
+ ctx.fillRect(0, -5, 40, 10);
382
+
383
+ // Base
384
+ ctx.beginPath();
385
+ ctx.arc(0, 0, 30, 0, Math.PI * 2);
386
+
387
+ // Add base glow
388
+ const baseGradient = ctx.createRadialGradient(0, 0, 10, 0, 0, 30);
389
+ baseGradient.addColorStop(0, 'rgba(0, 255, 0, 0.8)');
390
+ baseGradient.addColorStop(1, 'rgba(0, 100, 0, 0.8)');
391
+ ctx.fillStyle = baseGradient;
392
+ ctx.fill();
393
+
394
+ ctx.restore();
395
+ }
396
+ }
397
+
398
+ class Projectile {
399
+ constructor(x, y, vx, vy) {
400
+ this.x = x;
401
+ this.y = y;
402
+ this.vx = vx;
403
+ this.vy = vy;
404
+ this.dead = false;
405
+ }
406
+
407
+ update(game) {
408
+ this.x += this.vx;
409
+ this.y += this.vy;
410
+ this.vy += 0.2;
411
+
412
+ if(this.y > canvas.height + 50) this.dead = true;
413
+
414
+ // Trail particles
415
+ const color = Math.random() > 0.5 ? colors.particle1 :
416
+ Math.random() > 0.5 ? colors.particle2 : colors.particle3;
417
+ game.particles.push(new Particle(
418
+ this.x, this.y,
419
+ this.vx * -0.2 + Math.random() * 2 - 1,
420
+ this.vy * -0.2 + Math.random() * 2 - 1,
421
+ color, 20
422
+ ));
423
+ }
424
+
425
+ draw(ctx) {
426
+ // Add glow effect
427
+ const glowGradient = ctx.createRadialGradient(
428
+ this.x, this.y, 0,
429
+ this.x, this.y, 8
430
+ );
431
+ glowGradient.addColorStop(0, 'rgba(255, 100, 0, 0.8)');
432
+ glowGradient.addColorStop(1, 'rgba(255, 50, 0, 0)');
433
+ ctx.fillStyle = glowGradient;
434
+ ctx.beginPath();
435
+ ctx.arc(this.x, this.y, 8, 0, Math.PI * 2);
436
+ ctx.fill();
437
+
438
+ // Projectile core
439
+ ctx.fillStyle = colors.projectile;
440
+ ctx.beginPath();
441
+ ctx.arc(this.x, this.y, 3, 0, Math.PI * 2);
442
+ ctx.fill();
443
+ }
444
+ }
445
+
446
+ class Enemy {
447
+ constructor(x, y, speed) {
448
+ this.x = x;
449
+ this.y = y;
450
+ this.speed = speed;
451
+ this.flicker = 0;
452
+ }
453
+
454
+ update(game) {
455
+ this.y += this.speed;
456
+ this.flicker = (this.flicker + 1) % 10;
457
+
458
+ if(this.y > canvas.height - 50) {
459
+ game.state = 'gameover';
460
+ }
461
+ }
462
+
463
+ draw(ctx) {
464
+ ctx.save();
465
+ ctx.translate(this.x, this.y);
466
+
467
+ // Flicker effect
468
+ if(this.flicker < 2) {
469
+ ctx.fillStyle = 'rgba(0, 255, 0, 0.7)';
470
+ } else {
471
+ ctx.fillStyle = colors.enemy;
472
+ }
473
+
474
+ ctx.beginPath();
475
+ ctx.moveTo(-15, 0);
476
+ ctx.lineTo(15, 0);
477
+ ctx.lineTo(0, 30);
478
+ ctx.fill();
479
+
480
+ // Add glow
481
+ const glowGradient = ctx.createLinearGradient(-15, 0, 15, 30);
482
+ glowGradient.addColorStop(0, 'rgba(0, 255, 0, 0.3)');
483
+ glowGradient.addColorStop(1, 'rgba(0, 150, 0, 0.3)');
484
+ ctx.fillStyle = glowGradient;
485
+ ctx.beginPath();
486
+ ctx.moveTo(-15, 0);
487
+ ctx.lineTo(15, 0);
488
+ ctx.lineTo(0, 30);
489
+ ctx.fill();
490
+
491
+ ctx.restore();
492
+ }
493
+ }
494
+
495
+ class Explosion {
496
+ constructor(x, y) {
497
+ this.x = x;
498
+ this.y = y;
499
+ this.particles = [];
500
+ this.dead = false;
501
+
502
+ for(let i = 0; i < 50; i++) {
503
+ const hue = Math.random() * 30 + 20;
504
+ this.particles.push(new Particle(
505
+ x, y,
506
+ Math.random() * 10 - 5,
507
+ Math.random() * 10 - 5,
508
+ `hsl(${hue}, 100%, 50%)`,
509
+ 40
510
+ ));
511
+ }
512
+ }
513
+
514
+ update(game) {
515
+ this.particles.forEach(p => p.update());
516
+ this.dead = this.particles.every(p => p.dead);
517
+ }
518
+
519
+ draw(ctx) {
520
+ this.particles.forEach(p => p.draw(ctx));
521
+
522
+ // Add explosion glow
523
+ if(!this.dead) {
524
+ const glowGradient = ctx.createRadialGradient(
525
+ this.x, this.y, 0,
526
+ this.x, this.y, 50
527
+ );
528
+ glowGradient.addColorStop(0, 'rgba(255, 100, 0, 0.5)');
529
+ glowGradient.addColorStop(1, 'rgba(255, 50, 0, 0)');
530
+ ctx.fillStyle = glowGradient;
531
+ ctx.beginPath();
532
+ ctx.arc(this.x, this.y, 50, 0, Math.PI * 2);
533
+ ctx.fill();
534
+ }
535
+ }
536
+ }
537
+
538
+ class Particle {
539
+ constructor(x, y, vx, vy, color, life) {
540
+ this.x = x;
541
+ this.y = y;
542
+ this.vx = vx;
543
+ this.vy = vy;
544
+ this.color = color;
545
+ this.life = life;
546
+ this.dead = false;
547
+ this.size = Math.random() * 3 + 1;
548
+ }
549
+
550
+ update() {
551
+ this.x += this.vx;
552
+ this.y += this.vy;
553
+ this.vy += 0.1;
554
+ this.life -= 1;
555
+ this.dead = this.life <= 0;
556
+ }
557
+
558
+ draw(ctx) {
559
+ // Add glow
560
+ const glowGradient = ctx.createRadialGradient(
561
+ this.x, this.y, 0,
562
+ this.x, this.y, this.size * 2
563
+ );
564
+ glowGradient.addColorStop(0, this.color);
565
+ glowGradient.addColorStop(1, 'rgba(255, 255, 0, 0)');
566
+ ctx.fillStyle = glowGradient;
567
+ ctx.beginPath();
568
+ ctx.arc(this.x, this.y, this.size * 2, 0, Math.PI * 2);
569
+ ctx.fill();
570
+
571
+ // Particle core
572
+ ctx.fillStyle = this.color;
573
+ ctx.beginPath();
574
+ ctx.arc(this.x, this.y, this.size, 0, Math.PI * 2);
575
+ ctx.fill();
576
+ }
577
+ }
578
+
579
+ // Game loop
580
+ const game = new Game();
581
+ function frame() {
582
+ game.update();
583
+ game.draw();
584
+ requestAnimationFrame(frame);
585
+ }
586
+ frame();
587
+
588
+ // Add CRT power on effect
589
+ setTimeout(() => {
590
+ document.getElementById('crt-screen').style.boxShadow =
591
+ '0 0 20px rgba(0, 255, 0, 0.5), inset 0 0 50px rgba(0, 255, 0, 0.2)';
592
+ }, 500);
593
+ </script>
594
+ <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=LukasBe/chaos-cannon-crt" style="color: #fff;text-decoration: underline;" target="_blank" >Remix</a></p></body>
595
+ </html>
prompts.txt ADDED
@@ -0,0 +1 @@
 
 
1
+ Make it look like a retro CRT game, but keep all the current game features ...