diff --git a/src/components/game/StrategyAnimation.tsx b/src/components/game/StrategyAnimation.tsx index 5580b76..b746d6f 100644 --- a/src/components/game/StrategyAnimation.tsx +++ b/src/components/game/StrategyAnimation.tsx @@ -1,5 +1,10 @@ -import React, { useEffect, useRef } from 'react'; -import { motion } from 'framer-motion'; +import React from 'react'; +import { NetworkAnimation } from './animations/NetworkAnimation'; +import { MemeAnimation } from './animations/MemeAnimation'; +import { NewsAnimation } from './animations/NewsAnimation'; +import { CommunityAnimation } from './animations/CommunityAnimation'; +import { ExpertAnimation } from './animations/ExpertAnimation'; +import { PodcastAnimation } from './animations/PodcastAnimation'; import { StrategyAnimation as StrategyAnimationType } from './types'; interface StrategyAnimationProps { @@ -7,325 +12,29 @@ interface StrategyAnimationProps { className?: string; } -interface Node { - id: number; - baseX: number; - baseY: number; - x: number; - y: number; -} - -interface MemeSymbol { - id: number; - symbol: string; - x: number; - y: number; - rotation: number; - scale: number; -} - export const StrategyAnimation: React.FC = ({ animation, className = '' }) => { - const containerRef = useRef(null); + const { type } = animation; - useEffect(() => { - if (!containerRef.current) return; - - const container = containerRef.current; - const { type, config = {} } = animation; - const { - particleCount = 20, - speed = 2, - spread = 100, - color = '#FFD700' - } = config; - - // Clear any existing particles - container.innerHTML = ''; - - switch (type) { - case 'network': - // We'll handle network differently now - moved to JSX - break; - - case 'meme': - // Meme case handled separately - break; - - case 'news': - // Create scrolling headlines - for (let i = 0; i < 5; i++) { - const headline = document.createElement('div'); - headline.className = 'absolute left-0 whitespace-nowrap animate-scroll'; - headline.textContent = 'BREAKING NEWS • MATHEMATICAL TRUTH QUESTIONED •'; - headline.style.top = `${i * 20}%`; - headline.style.animationDelay = `${i * 0.5}s`; - container.appendChild(headline); - } - break; - - case 'community': - // Create gathering dots that form groups - for (let i = 0; i < particleCount; i++) { - const person = document.createElement('div'); - person.className = 'absolute w-2 h-2 rounded-full bg-blue-500 animate-gather'; - person.style.left = `${Math.random() * 100}%`; - person.style.top = `${Math.random() * 100}%`; - person.style.animationDelay = `${Math.random() * 2}s`; - container.appendChild(person); - } - break; - - case 'expert': - // Create floating mathematical symbols - const symbols = ['∑', '∫', 'π', '∞', '≠', '±']; - for (let i = 0; i < particleCount; i++) { - const symbol = document.createElement('div'); - symbol.className = 'absolute text-xl font-bold text-yellow-500 animate-float'; - symbol.textContent = symbols[Math.floor(Math.random() * symbols.length)]; - symbol.style.left = `${Math.random() * 100}%`; - symbol.style.animationDelay = `${Math.random() * 2}s`; - container.appendChild(symbol); - } - break; - - case 'research': - // Create scrolling paper effect - for (let i = 0; i < 3; i++) { - const paper = document.createElement('div'); - paper.className = 'absolute w-16 h-20 bg-white/20 rounded animate-float'; - paper.style.left = `${20 + i * 30}%`; - paper.style.animationDelay = `${i * 0.5}s`; - container.appendChild(paper); - } - break; - - case 'podcast': - // Create audio wave effect - for (let i = 0; i < 10; i++) { - const wave = document.createElement('div'); - wave.className = 'absolute bottom-1/2 w-1 bg-green-500 animate-wave'; - wave.style.left = `${10 + i * 10}%`; - wave.style.animationDelay = `${i * 0.1}s`; - wave.style.height = '20%'; - container.appendChild(wave); - } - break; - - case 'event': - // Create gathering effect with people icons - for (let i = 0; i < particleCount; i++) { - const person = document.createElement('div'); - person.className = 'absolute text-sm animate-gather'; - person.textContent = '👤'; - person.style.left = `${Math.random() * 100}%`; - person.style.top = `${Math.random() * 100}%`; - person.style.animationDelay = `${Math.random() * 2}s`; - container.appendChild(person); - } - break; - - case 'platform': - // Create platform interface elements - const elements = ['📱', '💻', '🖥️', '📲']; - for (let i = 0; i < elements.length; i++) { - const element = document.createElement('div'); - element.className = 'absolute text-2xl animate-float'; - element.textContent = elements[i]; - element.style.left = `${25 * i}%`; - element.style.animationDelay = `${i * 0.5}s`; - container.appendChild(element); - } - break; - - case 'freedom': - // Create rising particles effect - for (let i = 0; i < particleCount; i++) { - const particle = document.createElement('div'); - particle.className = 'absolute w-1 h-1 rounded-full bg-yellow-500 animate-rise'; - particle.style.left = `${Math.random() * 100}%`; - particle.style.animationDelay = `${Math.random() * 2}s`; - container.appendChild(particle); - } - break; - } - }, [animation]); - - if (animation.type === 'network') { - const nodes: Node[] = Array.from({ length: 6 }, (_, i) => { - const row = Math.floor(i / 2); - const col = i % 2; - const baseX = 30 + col * 40; - const baseY = 25 + row * 25; - return { - id: i, - baseX, - baseY, - x: baseX, - y: baseY, - }; - }); - - return ( -
- - {nodes.map((node1) => - nodes - .filter((node2) => node2.id !== node1.id) - .map((node2) => ( - 0.5 ? 10 : -10)}%`], - y1: [`${node1.baseY}%`, `${node1.baseY + (Math.random() > 0.5 ? 10 : -10)}%`], - x2: [`${node2.baseX}%`, `${node2.baseX + (Math.random() > 0.5 ? 10 : -10)}%`], - y2: [`${node2.baseY}%`, `${node2.baseY + (Math.random() > 0.5 ? 10 : -10)}%`], - }} - transition={{ - duration: 4, - repeat: Infinity, - repeatType: "mirror", - ease: "easeInOut" - }} - /> - )) - )} - - - {nodes.map((node) => ( - 0.5 ? 10 : -10)}%`, - `${node.baseX}%`, - ], - y: [ - `${node.baseY}%`, - `${node.baseY + (Math.random() > 0.5 ? 10 : -10)}%`, - `${node.baseY}%`, - ], - }} - transition={{ - duration: 6, - repeat: Infinity, - repeatType: "reverse", - ease: "easeInOut", - delay: node.id * 0.2, - }} - > - - - - - ))} -
- ); + switch (type) { + case 'network': + return ; + case 'meme': + return ; + case 'news': + return ; + case 'community': + return ; + case 'expert': + return ; + case 'podcast': + return ; + default: + return ( +
+
+ Strategy Visualization +
+
+ ); } - - if (animation.type === 'meme') { - const createWave = (waveIndex: number) => { - return Array.from({ length: 6 }, (_, i) => { - const symbols = ['😂', '🤔', '💭', '🎯', '🔥', '💯', '👀', '🙌', '✨', '💪']; - const x = 5 + (i * (90 / 5)); - return { - id: waveIndex * 6 + i, - symbol: symbols[Math.floor(Math.random() * symbols.length)], - x, - y: 120 + (waveIndex * 60), - rotation: -10 + Math.random() * 20, // Increased rotation range - scale: 0.8 + Math.random() * 0.4, // More variation in scale - }; - }); - }; - - const memeSymbols: MemeSymbol[] = [ - ...createWave(0), - ...createWave(1), - ...createWave(2), - ...createWave(3), - ]; - - return ( -
- {memeSymbols.map((meme) => ( - - {meme.symbol} - - ))} -
- ); - } - - return ( -
- ); -}; \ No newline at end of file +}; \ No newline at end of file diff --git a/src/components/game/animations/CommunityAnimation.tsx b/src/components/game/animations/CommunityAnimation.tsx new file mode 100644 index 0000000..bb06ff9 --- /dev/null +++ b/src/components/game/animations/CommunityAnimation.tsx @@ -0,0 +1,55 @@ +import React from 'react'; +import { motion } from 'framer-motion'; + +export const CommunityAnimation = ({ className = '' }: { className?: string }) => { + const groups = Array.from({ length: 3 }, (_, i) => ({ + x: 25 + i * 25, + y: 50, + members: Array.from({ length: 8 }, (_, j) => ({ + id: i * 8 + j, + initialX: Math.random() * 100, + initialY: Math.random() * 100, + })) + })); + + return ( +
+ {groups.map((group, groupIndex) => ( + + {group.members.map((member) => ( + + ))} + + + ))} +
+ ); +}; \ No newline at end of file diff --git a/src/components/game/animations/ExpertAnimation.tsx b/src/components/game/animations/ExpertAnimation.tsx new file mode 100644 index 0000000..914aafe --- /dev/null +++ b/src/components/game/animations/ExpertAnimation.tsx @@ -0,0 +1,49 @@ +import React from 'react'; +import { motion } from 'framer-motion'; + +export const ExpertAnimation = ({ className = '' }: { className?: string }) => { + const symbols = ['∑', '∫', 'π', '∞', '≠', '±', '∂', '∇', '∆']; + + return ( +
+ {symbols.map((symbol, index) => ( + + {symbol} + + ))} + +
PhD
+
+
+ ); +}; \ No newline at end of file diff --git a/src/components/game/animations/MemeAnimation.tsx b/src/components/game/animations/MemeAnimation.tsx new file mode 100644 index 0000000..ee14126 --- /dev/null +++ b/src/components/game/animations/MemeAnimation.tsx @@ -0,0 +1,74 @@ +import React from 'react'; +import { motion } from 'framer-motion'; + +interface MemeSymbol { + id: number; + symbol: string; + x: number; + y: number; + rotation: number; + scale: number; +} + +export const MemeAnimation = ({ className = '' }: { className?: string }) => { + const createWave = (waveIndex: number) => { + return Array.from({ length: 6 }, (_, i) => { + const symbols = ['😂', '🤔', '💭', '🎯', '🔥', '💯', '👀', '🙌', '✨', '💪']; + const x = 5 + (i * (90 / 5)); + return { + id: waveIndex * 6 + i, + symbol: symbols[Math.floor(Math.random() * symbols.length)], + x, + y: 120 + (waveIndex * 60), + rotation: -10 + Math.random() * 20, + scale: 0.8 + Math.random() * 0.4, + }; + }); + }; + + const memeSymbols: MemeSymbol[] = [ + ...createWave(0), + ...createWave(1), + ...createWave(2), + ...createWave(3), + ]; + + return ( +
+ {memeSymbols.map((meme) => ( + + {meme.symbol} + + ))} +
+ ); +}; \ No newline at end of file diff --git a/src/components/game/animations/NetworkAnimation.tsx b/src/components/game/animations/NetworkAnimation.tsx new file mode 100644 index 0000000..1fe77b0 --- /dev/null +++ b/src/components/game/animations/NetworkAnimation.tsx @@ -0,0 +1,113 @@ +import React from 'react'; +import { motion } from 'framer-motion'; + +interface Node { + id: number; + baseX: number; + baseY: number; +} + +export const NetworkAnimation = ({ className = '' }: { className?: string }) => { + const nodes: Node[] = Array.from({ length: 6 }, (_, i) => { + const row = Math.floor(i / 2); + const col = i % 2; + return { + id: i, + baseX: 30 + col * 40, + baseY: 25 + row * 25, + }; + }); + + return ( +
+ + {nodes.map((node1) => + nodes + .filter((node2) => node2.id !== node1.id) + .map((node2) => ( + 0.5 ? 10 : -10)}%`], + y1: [`${node1.baseY}%`, `${node1.baseY + (Math.random() > 0.5 ? 10 : -10)}%`], + x2: [`${node2.baseX}%`, `${node2.baseX + (Math.random() > 0.5 ? 10 : -10)}%`], + y2: [`${node2.baseY}%`, `${node2.baseY + (Math.random() > 0.5 ? 10 : -10)}%`], + }} + transition={{ + duration: 4, + repeat: Infinity, + repeatType: "mirror", + ease: "easeInOut" + }} + /> + )) + )} + + + {nodes.map((node) => ( + 0.5 ? 10 : -10)}%`, + `${node.baseX}%`, + ], + y: [ + `${node.baseY}%`, + `${node.baseY + (Math.random() > 0.5 ? 10 : -10)}%`, + `${node.baseY}%`, + ], + }} + transition={{ + duration: 6, + repeat: Infinity, + repeatType: "reverse", + ease: "easeInOut", + delay: node.id * 0.2, + }} + > + + + + + ))} +
+ ); +}; \ No newline at end of file diff --git a/src/components/game/animations/NewsAnimation.tsx b/src/components/game/animations/NewsAnimation.tsx new file mode 100644 index 0000000..2f28ec3 --- /dev/null +++ b/src/components/game/animations/NewsAnimation.tsx @@ -0,0 +1,36 @@ +import React from 'react'; +import { motion } from 'framer-motion'; + +export const NewsAnimation = ({ className = '' }: { className?: string }) => { + const headlines = [ + "BREAKING NEWS • MATHEMATICAL TRUTH QUESTIONED •", + "EXPERTS DIVIDED ON BASIC ARITHMETIC •", + "NEW STUDY CHALLENGES CONVENTIONAL MATH •", + "MATHEMATICAL REVOLUTION BREWING •", + "EDUCATION SYSTEM IN CRISIS •" + ]; + + return ( +
+ {headlines.map((headline, index) => ( + + {headline} + + ))} +
+ ); +}; \ No newline at end of file diff --git a/src/components/game/animations/PodcastAnimation.tsx b/src/components/game/animations/PodcastAnimation.tsx new file mode 100644 index 0000000..2c6e616 --- /dev/null +++ b/src/components/game/animations/PodcastAnimation.tsx @@ -0,0 +1,44 @@ +import React from 'react'; +import { motion } from 'framer-motion'; + +export const PodcastAnimation = ({ className = '' }: { className?: string }) => { + const waves = Array.from({ length: 10 }, (_, i) => ({ + id: i, + height: 20 + Math.random() * 60, + })); + + return ( +
+
+ {waves.map((wave) => ( + + ))} +
+ + 🎙️ + +
+ ); +}; \ No newline at end of file