Fraser commited on
Commit
52f4c89
·
1 Parent(s): 5529e9d
src/lib/components/Battle/BattleEffects.svelte CHANGED
@@ -17,24 +17,28 @@
17
  let flickerInterval: number;
18
 
19
  // Particle system configuration
20
- const PARTICLES_PER_EFFECT = 5; // Number of emoji particles per effect
21
- const SPAWN_RADIUS = 60; // Radius around piclet where particles spawn
22
 
23
  // Generate multiple particles for each effect
24
  $: particleList = effects.flatMap((effect, effectIndex) => {
25
  const particles = [];
26
  for (let i = 0; i < PARTICLES_PER_EFFECT; i++) {
27
- // Random spawn position around the piclet
28
- const angle = (Math.PI * 2 * i) / PARTICLES_PER_EFFECT + (Math.random() - 0.5) * 0.5;
29
- const distance = SPAWN_RADIUS * (0.7 + Math.random() * 0.6); // Vary distance
30
  const x = Math.cos(angle) * distance;
31
  const y = Math.sin(angle) * distance;
32
 
33
- // Random animation properties
34
- const scale = 0.8 + Math.random() * 0.4; // 0.8x to 1.2x size
35
- const rotation = Math.random() * 360; // Random initial rotation
36
- const duration = effect.duration + (Math.random() - 0.5) * 200; // Vary duration slightly
37
- const delay = Math.random() * 100; // Stagger animation starts
 
 
 
 
38
 
39
  particles.push({
40
  id: `${effectIndex}-${i}`,
@@ -45,7 +49,9 @@
45
  scale,
46
  rotation,
47
  duration,
48
- delay
 
 
49
  });
50
  }
51
  return particles;
@@ -108,6 +114,8 @@
108
  animation-delay: {particle.delay}ms;
109
  --initial-scale: {particle.scale};
110
  --initial-rotation: {particle.rotation}deg;
 
 
111
  "
112
  >
113
  <span class="effect-emoji">{particle.emoji}</span>
@@ -130,15 +138,15 @@
130
  .effect-particle {
131
  position: absolute;
132
  pointer-events: none;
133
- z-index: 5;
134
  animation-fill-mode: forwards;
135
  transform-origin: center center;
136
  }
137
 
138
  .effect-emoji {
139
- font-size: 20px;
140
  display: block;
141
- filter: drop-shadow(0 0 4px rgba(0, 0, 0, 0.4));
142
  transform: scale(var(--initial-scale, 1)) rotate(var(--initial-rotation, 0deg));
143
  }
144
 
@@ -197,23 +205,27 @@
197
  /* Complex multi-property animations */
198
  @keyframes statusBurn {
199
  0% {
200
- transform: translate(-50%, -50%) scale(var(--initial-scale)) rotate(var(--initial-rotation)) scale(0.3);
201
  opacity: 0;
202
  }
203
- 15% {
204
- transform: translate(-50%, -50%) scale(var(--initial-scale)) rotate(calc(var(--initial-rotation) + 45deg)) scale(1.2);
205
  opacity: 1;
206
  }
 
 
 
 
207
  50% {
208
- transform: translate(-50%, -50%) scale(var(--initial-scale)) rotate(calc(var(--initial-rotation) + 180deg)) scale(1.0);
209
- opacity: 0.9;
210
  }
211
- 85% {
212
- transform: translate(-50%, -50%) scale(var(--initial-scale)) rotate(calc(var(--initial-rotation) + 315deg)) scale(0.8);
213
- opacity: 0.4;
214
  }
215
  100% {
216
- transform: translate(-50%, -50%) scale(var(--initial-scale)) rotate(calc(var(--initial-rotation) + 360deg)) scale(0.5);
217
  opacity: 0;
218
  }
219
  }
@@ -324,23 +336,27 @@
324
 
325
  @keyframes statIncrease {
326
  0% {
327
- transform: translate(-50%, -50%) scale(var(--initial-scale)) rotate(var(--initial-rotation)) scale(0.4);
328
  opacity: 0;
329
  }
330
- 25% {
331
- transform: translate(-50%, -70%) scale(var(--initial-scale)) rotate(calc(var(--initial-rotation) + 90deg)) scale(1.3);
332
  opacity: 1;
333
  }
334
- 50% {
335
- transform: translate(-50%, -90%) scale(var(--initial-scale)) rotate(calc(var(--initial-rotation) + 180deg)) scale(1.1);
336
- opacity: 0.9;
337
  }
338
- 75% {
339
- transform: translate(-50%, -110%) scale(var(--initial-scale)) rotate(calc(var(--initial-rotation) + 270deg)) scale(0.9);
340
- opacity: 0.6;
 
 
 
 
341
  }
342
  100% {
343
- transform: translate(-50%, -130%) scale(var(--initial-scale)) rotate(calc(var(--initial-rotation) + 360deg)) scale(0.5);
344
  opacity: 0;
345
  }
346
  }
@@ -370,27 +386,27 @@
370
 
371
  @keyframes criticalBurst {
372
  0% {
373
- transform: translate(-50%, -50%) scale(var(--initial-scale)) rotate(var(--initial-rotation)) scale(0.2);
374
  opacity: 0;
375
  }
376
- 15% {
377
- transform: translate(-50%, -50%) scale(var(--initial-scale)) rotate(calc(var(--initial-rotation) + 45deg)) scale(1.8);
378
  opacity: 1;
379
  }
380
- 30% {
381
- transform: translate(-50%, -50%) scale(var(--initial-scale)) rotate(calc(var(--initial-rotation) - 30deg)) scale(1.4);
382
- opacity: 0.9;
383
  }
384
- 50% {
385
- transform: translate(-50%, -50%) scale(var(--initial-scale)) rotate(calc(var(--initial-rotation) + 60deg)) scale(1.6);
386
  opacity: 0.8;
387
  }
388
  70% {
389
- transform: translate(-50%, -50%) scale(var(--initial-scale)) rotate(calc(var(--initial-rotation) - 45deg)) scale(1.2);
390
- opacity: 0.5;
391
  }
392
  100% {
393
- transform: translate(-50%, -50%) scale(var(--initial-scale)) rotate(calc(var(--initial-rotation) + 720deg)) scale(0.3);
394
  opacity: 0;
395
  }
396
  }
@@ -420,27 +436,27 @@
420
 
421
  @keyframes healRise {
422
  0% {
423
- transform: translate(-50%, -30%) scale(var(--initial-scale)) rotate(var(--initial-rotation)) scale(0.5);
424
  opacity: 0;
425
  }
426
- 20% {
427
- transform: translate(-50%, -50%) scale(var(--initial-scale)) rotate(calc(var(--initial-rotation) + 30deg)) scale(1.3);
428
  opacity: 1;
429
  }
430
- 40% {
431
- transform: translate(-50%, -70%) scale(var(--initial-scale)) rotate(calc(var(--initial-rotation) - 20deg)) scale(1.1);
432
- opacity: 0.9;
433
  }
434
- 60% {
435
- transform: translate(-50%, -90%) scale(var(--initial-scale)) rotate(calc(var(--initial-rotation) + 15deg)) scale(1.0);
436
- opacity: 0.7;
437
  }
438
- 80% {
439
- transform: translate(-50%, -110%) scale(var(--initial-scale)) rotate(calc(var(--initial-rotation) - 10deg)) scale(0.8);
440
- opacity: 0.4;
441
  }
442
  100% {
443
- transform: translate(-50%, -130%) scale(var(--initial-scale)) rotate(var(--initial-rotation)) scale(0.5);
444
  opacity: 0;
445
  }
446
  }
 
17
  let flickerInterval: number;
18
 
19
  // Particle system configuration
20
+ const PARTICLES_PER_EFFECT = 6; // Number of emoji particles per effect
21
+ const SPAWN_RADIUS = 80; // Increased radius around piclet where particles spawn
22
 
23
  // Generate multiple particles for each effect
24
  $: particleList = effects.flatMap((effect, effectIndex) => {
25
  const particles = [];
26
  for (let i = 0; i < PARTICLES_PER_EFFECT; i++) {
27
+ // More varied spawn positions for better coverage
28
+ const angle = (Math.PI * 2 * i) / PARTICLES_PER_EFFECT + (Math.random() - 0.5) * 1.2;
29
+ const distance = SPAWN_RADIUS * (0.5 + Math.random() * 0.8); // Wider distance variation
30
  const x = Math.cos(angle) * distance;
31
  const y = Math.sin(angle) * distance;
32
 
33
+ // Enhanced animation properties for more dynamic effects
34
+ const scale = 0.6 + Math.random() * 0.6; // 0.6x to 1.2x initial size
35
+ const rotation = Math.random() * 180; // Reduced initial rotation range
36
+ const duration = Math.max(effect.duration * 1.8, 1800) + (Math.random() - 0.5) * 400; // Longer base duration
37
+ const delay = Math.random() * 200; // More staggered animation starts
38
+
39
+ // Additional movement properties for more dynamic motion
40
+ const moveDistance = 40 + Math.random() * 60; // How far the particle travels
41
+ const moveAngle = angle + (Math.random() - 0.5) * Math.PI * 0.8; // Movement direction
42
 
43
  particles.push({
44
  id: `${effectIndex}-${i}`,
 
49
  scale,
50
  rotation,
51
  duration,
52
+ delay,
53
+ moveDistance,
54
+ moveAngle
55
  });
56
  }
57
  return particles;
 
114
  animation-delay: {particle.delay}ms;
115
  --initial-scale: {particle.scale};
116
  --initial-rotation: {particle.rotation}deg;
117
+ --move-x: {Math.cos(particle.moveAngle) * particle.moveDistance}px;
118
+ --move-y: {Math.sin(particle.moveAngle) * particle.moveDistance}px;
119
  "
120
  >
121
  <span class="effect-emoji">{particle.emoji}</span>
 
138
  .effect-particle {
139
  position: absolute;
140
  pointer-events: none;
141
+ z-index: 10;
142
  animation-fill-mode: forwards;
143
  transform-origin: center center;
144
  }
145
 
146
  .effect-emoji {
147
+ font-size: 24px;
148
  display: block;
149
+ filter: drop-shadow(0 0 6px rgba(0, 0, 0, 0.5));
150
  transform: scale(var(--initial-scale, 1)) rotate(var(--initial-rotation, 0deg));
151
  }
152
 
 
205
  /* Complex multi-property animations */
206
  @keyframes statusBurn {
207
  0% {
208
+ transform: translate(-50%, -50%) scale(0.2);
209
  opacity: 0;
210
  }
211
+ 10% {
212
+ transform: translate(-50%, -50%) scale(1.8);
213
  opacity: 1;
214
  }
215
+ 25% {
216
+ transform: translate(calc(-50% + var(--move-x) * 0.3), calc(-50% + var(--move-y) * 0.3)) scale(var(--initial-scale)) rotate(calc(var(--initial-rotation) + 20deg));
217
+ opacity: 0.95;
218
+ }
219
  50% {
220
+ transform: translate(calc(-50% + var(--move-x) * 0.6), calc(-50% + var(--move-y) * 0.6)) scale(calc(var(--initial-scale) * 1.3)) rotate(calc(var(--initial-rotation) + 45deg));
221
+ opacity: 0.8;
222
  }
223
+ 75% {
224
+ transform: translate(calc(-50% + var(--move-x) * 0.9), calc(-50% + var(--move-y) * 0.9)) scale(calc(var(--initial-scale) * 0.7)) rotate(calc(var(--initial-rotation) + 60deg));
225
+ opacity: 0.5;
226
  }
227
  100% {
228
+ transform: translate(calc(-50% + var(--move-x)), calc(-50% + var(--move-y))) scale(0.3) rotate(calc(var(--initial-rotation) + 80deg));
229
  opacity: 0;
230
  }
231
  }
 
336
 
337
  @keyframes statIncrease {
338
  0% {
339
+ transform: translate(-50%, -50%) scale(0.3);
340
  opacity: 0;
341
  }
342
+ 15% {
343
+ transform: translate(-50%, -50%) scale(1.6);
344
  opacity: 1;
345
  }
346
+ 30% {
347
+ transform: translate(calc(-50% + var(--move-x) * 0.2), calc(-50% + var(--move-y) * 0.2 - 20px)) scale(calc(var(--initial-scale) * 1.2)) rotate(calc(var(--initial-rotation) + 15deg));
348
+ opacity: 0.95;
349
  }
350
+ 60% {
351
+ transform: translate(calc(-50% + var(--move-x) * 0.7), calc(-50% + var(--move-y) * 0.7 - 60px)) scale(calc(var(--initial-scale) * 1.0)) rotate(calc(var(--initial-rotation) + 25deg));
352
+ opacity: 0.7;
353
+ }
354
+ 85% {
355
+ transform: translate(calc(-50% + var(--move-x)), calc(-50% + var(--move-y) - 90px)) scale(calc(var(--initial-scale) * 0.6)) rotate(calc(var(--initial-rotation) + 35deg));
356
+ opacity: 0.3;
357
  }
358
  100% {
359
+ transform: translate(calc(-50% + var(--move-x)), calc(-50% + var(--move-y) - 120px)) scale(0.2) rotate(calc(var(--initial-rotation) + 45deg));
360
  opacity: 0;
361
  }
362
  }
 
386
 
387
  @keyframes criticalBurst {
388
  0% {
389
+ transform: translate(-50%, -50%) scale(0.1);
390
  opacity: 0;
391
  }
392
+ 8% {
393
+ transform: translate(-50%, -50%) scale(2.2);
394
  opacity: 1;
395
  }
396
+ 20% {
397
+ transform: translate(calc(-50% + var(--move-x) * 0.1), calc(-50% + var(--move-y) * 0.1)) scale(calc(var(--initial-scale) * 1.8)) rotate(calc(var(--initial-rotation) + 30deg));
398
+ opacity: 0.95;
399
  }
400
+ 40% {
401
+ transform: translate(calc(-50% + var(--move-x) * 0.4), calc(-50% + var(--move-y) * 0.4)) scale(calc(var(--initial-scale) * 1.5)) rotate(calc(var(--initial-rotation) + 60deg));
402
  opacity: 0.8;
403
  }
404
  70% {
405
+ transform: translate(calc(-50% + var(--move-x) * 0.8), calc(-50% + var(--move-y) * 0.8)) scale(calc(var(--initial-scale) * 1.1)) rotate(calc(var(--initial-rotation) + 90deg));
406
+ opacity: 0.4;
407
  }
408
  100% {
409
+ transform: translate(calc(-50% + var(--move-x)), calc(-50% + var(--move-y))) scale(0.2) rotate(calc(var(--initial-rotation) + 120deg));
410
  opacity: 0;
411
  }
412
  }
 
436
 
437
  @keyframes healRise {
438
  0% {
439
+ transform: translate(-50%, -30%) scale(0.4);
440
  opacity: 0;
441
  }
442
+ 12% {
443
+ transform: translate(-50%, -35%) scale(1.5);
444
  opacity: 1;
445
  }
446
+ 25% {
447
+ transform: translate(calc(-50% + var(--move-x) * 0.2), calc(-50% + var(--move-y) * 0.2 - 40px)) scale(calc(var(--initial-scale) * 1.3)) rotate(calc(var(--initial-rotation) + 20deg));
448
+ opacity: 0.95;
449
  }
450
+ 50% {
451
+ transform: translate(calc(-50% + var(--move-x) * 0.5), calc(-50% + var(--move-y) * 0.5 - 70px)) scale(calc(var(--initial-scale) * 1.1)) rotate(calc(var(--initial-rotation) + 30deg));
452
+ opacity: 0.8;
453
  }
454
+ 75% {
455
+ transform: translate(calc(-50% + var(--move-x) * 0.8), calc(-50% + var(--move-y) * 0.8 - 100px)) scale(calc(var(--initial-scale) * 0.8)) rotate(calc(var(--initial-rotation) + 40deg));
456
+ opacity: 0.5;
457
  }
458
  100% {
459
+ transform: translate(calc(-50% + var(--move-x)), calc(-50% + var(--move-y) - 130px)) scale(0.3) rotate(calc(var(--initial-rotation) + 50deg));
460
  opacity: 0;
461
  }
462
  }