/** * GrokCharacterSystem.js * ====================== * KRVAVA ŽETEV - Grok Character (The Developer / Pink Alpha) * * CHARACTER DESIGN: * - Skin: Light green (unique color - not human!) * - Hair: PINK dreadlocks (iconic!) * - Outfit: Oversized hoodie (2 sizes too big) + baggy pants * - Shoes: Hot pink Converse * - Piercings: Septum, eyebrows, lips, 15+ earrings, 25mm tunnels * * PERSONALITY: * - ADHD genius developer * - Always vaping (Rainbow RGB mod) * - Zen master with massive gong * - Quick movements when hyperfocused * - Oversized comfort style * * COMPANION: * - Susi: Hot dog hunting dog (always by his side) * * Features: * - Massive gong (1m diameter!) * - Rainbow RGB vape mod * - Morning meditation rituals * - Combat buffs * - Smoke screen abilities * - ADHD focus modes * - Susi interactions * * @author NovaFarma Team * @date 2025-12-25 */ export default class GrokCharacterSystem { constructor(scene, grokSprite) { this.scene = scene; this.grok = grokSprite; // Grok state this.isVaping = true; // Always vaping! this.lastGongTime = 0; this.gongCooldown = 300000; // 5 minutes this.meditationTime = 6; // 6 AM daily // ADHD mechanics this.isFocused = false; // "Oversized Focus" mode this.focusTimer = 0; this.hyperfocusSpeed = 2.0; // Speed multiplier when focused this.currentTopic = 'coding'; // What Grok is focused on // Visual elements this.gong = null; this.vapeDevice = null; this.smokeParticles = []; this.hoodie = null; // Oversized hoodie sprite this.dreadlocks = null; // Pink dreadlocks this.piercings = []; // Visual piercing elements // Susi companion this.susi = null; // Susi the hot dog hunter this.susiState = 'following'; // following, hunting, eating // Buffs this.activeBuffs = new Map(); // Character colors this.skinColor = 0x90EE90; // Light green this.dreadlockColor = 0xFF69B4; // Hot pink this.hoodieColor = 0x2F4F4F; // Dark slate gray (wide hoodie) console.log('🧘 GrokCharacterSystem initialized'); console.log('👕 Oversized hoodie: ON'); console.log('💚 Skin: Light green'); console.log('💕 Dreadlocks: HOT PINK'); console.log('🐕 Susi companion: Ready!'); // Setup visuals this.setupGrokVisuals(); this.createSusi(); this.startVapingAnimation(); } /** * 13.1 - Setup Grok's visual elements */ setupGrokVisuals() { if (!this.grok) return; // Create massive gong (1m diameter = 100 pixels!) this.gong = this.scene.add.circle( this.grok.x - 50, this.grok.y, 50, // Radius 50px = 100px diameter 0xDAA520 // Golden color ); this.gong.setStrokeStyle(5, 0x8B4513); // Brown stroke this.gong.setDepth(this.grok.depth - 1); // Add gong details (concentric circles) for (let i = 1; i <= 3; i++) { const ring = this.scene.add.circle( this.grok.x - 50, this.grok.y, 50 - (i * 10), null ); ring.setStrokeStyle(2, 0x8B4513); ring.setDepth(this.grok.depth - 1); } // Create RGB vape mod this.vapeDevice = this.scene.add.rectangle( this.grok.x + 20, this.grok.y + 10, 15, // Width 30, // Height 0xFF1493 // Deep pink ); this.vapeDevice.setDepth(this.grok.depth + 1); // Add RGB LED effect this.scene.tweens.add({ targets: this.vapeDevice, fillColor: { from: 0xFF1493, to: 0x00CED1 }, // Pink → Cyan duration: 2000, yoyo: true, repeat: -1 }); console.log('✅ Grok visuals setup complete'); } /** * 13.2 - Morning Meditation Gong */ triggerMorningMeditation() { console.log('🧘 *BOOONG!* Morning meditation begins...'); // Play gong animation this.playGongAnimation(); // Buff all nearby allies this.applyMeditationBuff(); // Show message this.showNotification({ title: 'Morning Meditation', text: '🥁 BOOONG! Grok\'s gong brings peace to all.', icon: '🧘' }); } /** * 13.2 - Gong strike (combat buff) */ strikeGong() { const now = Date.now(); if (now - this.lastGongTime < this.gongCooldown) { const remaining = Math.ceil((this.gongCooldown - (now - this.lastGongTime)) / 1000); console.log(`⏰ Gong on cooldown for ${remaining}s`); return false; } console.log('🥁 *BOOOOONG!!!*'); this.lastGongTime = now; // Visual effect this.playGongAnimation(); // Sound wave radius this.createSoundWaveEffect(); // Combat buffs this.applyGongCombatBuff(); // Stun enemies this.stunNearbyEnemies(); return true; } /** * 13.2 - Gong animation */ playGongAnimation() { if (!this.gong) return; // Vibrate gong this.scene.tweens.add({ targets: this.gong, scaleX: 1.2, scaleY: 1.2, alpha: 0.5, duration: 100, yoyo: true, repeat: 5 }); // Screen shake this.scene.cameras.main.shake(500, 0.01); // Flash this.scene.cameras.main.flash(200, 255, 215, 0); // Gold flash } /** * 13.2 - Sound wave effect */ createSoundWaveEffect() { if (!this.gong) return; // Create expanding circles (sound waves) for (let i = 0; i < 3; i++) { setTimeout(() => { const wave = this.scene.add.circle( this.gong.x, this.gong.y, 10, 0xFFD700, 0.5 ); this.scene.tweens.add({ targets: wave, radius: 480, // 10 blocks alpha: 0, duration: 1000, onComplete: () => wave.destroy() }); }, i * 200); } } /** * 13.2 - Apply gong combat buff */ applyGongCombatBuff() { const buffDuration = 30000; // 30 seconds const buffData = { name: 'Gong Resonance', damage: 1.2, // +20% damage defense: 1.1, // +10% defense expiresAt: Date.now() + buffDuration }; // Apply to player if (this.scene.player) { this.activeBuffs.set('player', buffData); console.log('⚔️ Player buffed: +20% damage, +10% defense (30s)'); } // Apply to nearby allies this.buffNearbyAllies(buffData); this.showNotification({ title: 'Gong Resonance!', text: '🥁 +20% Damage, +10% Defense for 30s!', icon: '⚔️' }); } /** * 13.2 - Buff nearby allies */ buffNearbyAllies(buffData) { // TODO: Get all allies within 10 blocks // For now, just log console.log('🤝 Allies buffed!'); } /** * 13.2 - Apply meditation buff */ applyMeditationBuff() { const buffData = { name: 'Morning Meditation', healthRegen: 5, // +5 HP/sec staminaRegen: 10, // +10 stamina/sec duration: 60000 // 1 minute }; // TODO: Apply to all players/allies in area console.log('🧘 Meditation buff active: +5 HP/sec, +10 stamina/sec'); } /** * 13.2 - Stun nearby enemies */ stunNearbyEnemies() { const stunRadius = 480; // 10 blocks (48px per tile) // TODO: Get all enemies within radius and stun them console.log(`💫 Enemies within ${stunRadius}px stunned for 3 seconds!`); } /** * 13.3 - Vaping animation (always active!) */ startVapingAnimation() { // Constant vaping setInterval(() => { this.exhaleVapeSmoke(); }, 3000); // Every 3 seconds } /** * 13.3 - Exhale vape smoke */ exhaleVapeSmoke() { if (!this.vapeDevice) return; // Create pink smoke particles const smokeCount = 10; for (let i = 0; i < smokeCount; i++) { setTimeout(() => { this.createSmokeParticle(); }, i * 50); } // Random smoke trick if (Math.random() < 0.2) { // 20% chance this.performSmokeTrick(); } } /** * 13.3 - Create smoke particle */ createSmokeParticle() { if (!this.grok) return; const smoke = this.scene.add.circle( this.grok.x + 20, this.grok.y - 10, 5 + Math.random() * 5, 0xFF1493, // Deep pink 0.7 ); // Smoke rises and fades this.scene.tweens.add({ targets: smoke, y: smoke.y - 50 - Math.random() * 50, x: smoke.x + (Math.random() - 0.5) * 30, alpha: 0, radius: 20, duration: 2000 + Math.random() * 1000, onComplete: () => smoke.destroy() }); this.smokeParticles.push(smoke); } /** * 13.3 - Smoke tricks */ performSmokeTrick() { const tricks = ['rings', 'dragon', 'tornado']; const trick = Phaser.Utils.Array.GetRandom(tricks); switch (trick) { case 'rings': this.createSmokeRings(); break; case 'dragon': this.createSmokeDragon(); break; case 'tornado': this.createSmokeTornado(); break; } console.log(`💨 Grok did a ${trick} smoke trick!`); } /** * 13.3 - Create smoke rings */ createSmokeRings() { if (!this.grok) return; for (let i = 0; i < 3; i++) { setTimeout(() => { const ring = this.scene.add.circle( this.grok.x + 30, this.grok.y - 20, 10, null ); ring.setStrokeStyle(3, 0xFF1493, 0.8); this.scene.tweens.add({ targets: ring, x: ring.x + 100, radius: 20, alpha: 0, duration: 1500, onComplete: () => ring.destroy() }); }, i * 300); } } /** * 13.3 - Create smoke dragon */ createSmokeDragon() { if (!this.grok) return; // Create flowing smoke path (dragon shape!) const points = []; for (let i = 0; i < 20; i++) { points.push({ x: this.grok.x + 30 + i * 10, y: this.grok.y - 20 + Math.sin(i * 0.5) * 20 }); } points.forEach((point, index) => { setTimeout(() => { const smoke = this.scene.add.circle( point.x, point.y, 8, 0xFF1493, 0.6 ); this.scene.tweens.add({ targets: smoke, alpha: 0, duration: 1000, onComplete: () => smoke.destroy() }); }, index * 50); }); } /** * 13.3 - Create smoke tornado */ createSmokeTornado() { if (!this.grok) return; // Spiral smoke upward for (let i = 0; i < 30; i++) { setTimeout(() => { const angle = (i * 20) * Math.PI / 180; const radius = 20 + i; const smoke = this.scene.add.circle( this.grok.x + 30 + Math.cos(angle) * radius, this.grok.y - 20 - i * 3, 5, 0xFF1493, 0.7 ); this.scene.tweens.add({ targets: smoke, alpha: 0, duration: 2000, onComplete: () => smoke.destroy() }); }, i * 30); } } /** * 13.3 - Combat smoke screen */ deploySmokeScreen() { console.log('💨 Deploying combat smoke screen!'); // Create large pink smoke cloud const smokescreenRadius = 240; // 5 blocks for (let i = 0; i < 50; i++) { setTimeout(() => { const angle = Math.random() * Math.PI * 2; const distance = Math.random() * smokescreenRadius; const smoke = this.scene.add.circle( this.grok.x + Math.cos(angle) * distance, this.grok.y + Math.sin(angle) * distance, 10 + Math.random() * 10, 0xFF1493, 0.8 ); this.scene.tweens.add({ targets: smoke, alpha: 0, radius: 30, duration: 5000, onComplete: () => smoke.destroy() }); }, i * 50); } // Confuse enemies this.confuseNearbyEnemies(); this.showNotification({ title: 'Smoke Screen!', text: '💨 Enemies confused! Grok vanishes into pink smoke!', icon: '😵' }); } /** * 13.3 - Confuse enemies */ confuseNearbyEnemies() { // TODO: Apply confusion effect to enemies console.log('😵 Enemies confused!'); } /** * 13.4 - Get Grok dialogue */ getRandomGrokDialogue() { const dialogues = [ "The gong speaks to those who listen... *BOOONG!*", "Life is like vape smoke... fleeting and pink. *exhales*", "Why fight when you can meditate? *hits vape*", "The universe is just a massive gong, friend. *BOOONG!*", "*BOOOONG!* Inner peace achieved.", "This vape? It's pink because life is beautiful. *exhales rainbow smoke*", "My gong has defeated more enemies than any sword. *taps gong*", "Violence is temporary. Zen is eternal. *vapes peacefully*", "Watch this smoke trick! *creates dragon*", "The gong's vibration aligns the chakras. Science!", "*BOOONG!* That's me saying hello.", "Pink smoke = happy thoughts. Simple. *exhales*" ]; return Phaser.Utils.Array.GetRandom(dialogues); } /** * Update system */ update(time, delta) { // Check for morning meditation time const currentHour = this.scene.timeSystem?.getCurrentHour() || 0; if (currentHour === this.meditationTime) { const lastMeditation = localStorage.getItem('grok_last_meditation'); const today = new Date().toDateString(); if (lastMeditation !== today) { this.triggerMorningMeditation(); localStorage.setItem('grok_last_meditation', today); } } // Update buff timers this.updateBuffs(); // Clean up old smoke particles this.cleanupSmokeParticles(); } /** * Update active buffs */ updateBuffs() { const now = Date.now(); this.activeBuffs.forEach((buff, target) => { if (buff.expiresAt && buff.expiresAt < now) { this.activeBuffs.delete(target); console.log(`✨ Buff "${buff.name}" expired for ${target}`); } }); } /** * Cleanup old smoke particles */ cleanupSmokeParticles() { this.smokeParticles = this.smokeParticles.filter(smoke => { if (!smoke || smoke.alpha <= 0) { if (smoke) smoke.destroy(); return false; } return true; }); } /** * Helper: Show notification */ showNotification(notification) { console.log(`📢 ${notification.icon} ${notification.title}: ${notification.text}`); const ui = this.scene.scene.get('UIScene'); if (ui && ui.showNotification) { ui.showNotification(notification); } } /** * Create Susi companion (Hot Dog Hunter) */ createSusi() { if (!this.grok) return; // Create Susi (dachshund-style hot dog hunter!) this.susi = this.scene.add.ellipse( this.grok.x + 30, this.grok.y + 20, 40, // Width (long dog!) 20, // Height 0x8B4513 // Brown color ); this.susi.setDepth(this.grok.depth); // Add spots const spot1 = this.scene.add.circle( this.susi.x - 10, this.susi.y, 4, 0x654321 // Darker spot ); spot1.setDepth(this.grok.depth + 1); // Susi's nose (always sniffing for hot dogs!) const nose = this.scene.add.circle( this.susi.x + 20, this.susi.y, 3, 0x000000 // Black nose ); nose.setDepth(this.grok.depth + 2); // Tail (wagging animation!) const tail = this.scene.add.line( this.susi.x - 20, this.susi.y - 5, 0, 0, -10, -5, 0x8B4513, 1 ); tail.setLineWidth(3); tail.setDepth(this.grok.depth); // Tail wag animation this.scene.tweens.add({ targets: tail, angle: { from: -15, to: 15 }, duration: 300, yoyo: true, repeat: -1 }); console.log('🐕 Susi created! Hot dog hunter ready!'); // Susi behavior this.startSusiBehavior(); } /** * Susi's AI behavior */ startSusiBehavior() { // Susi follows Grok setInterval(() => { if (!this.susi || !this.grok) return; // Follow Grok at distance const targetX = this.grok.x + 30; const targetY = this.grok.y + 20; // Smooth follow this.susi.x += (targetX - this.susi.x) * 0.1; this.susi.y += (targetY - this.susi.y) * 0.1; // Random hot dog hunting if (Math.random() < 0.01) { // 1% chance per frame this.susiHuntHotDog(); } }, 100); } /** * Susi hunts for hot dogs! */ susiHuntHotDog() { if (!this.susi) return; console.log('🌭 Susi spotted a potential hot dog!'); this.susiState = 'hunting'; // Susi runs to random location const randomX = this.susi.x + (Math.random() - 0.5) * 100; const randomY = this.susi.y + (Math.random() - 0.5) * 100; this.scene.tweens.add({ targets: this.susi, x: randomX, y: randomY, duration: 1000, ease: 'Quad.InOut', onComplete: () => { // Found hot dog! this.susiState = 'eating'; console.log('🌭 Susi found a hot dog! *nom nom*'); // Eating animation (wiggle) this.scene.tweens.add({ targets: this.susi, angle: { from: -5, to: 5 }, duration: 200, yoyo: true, repeat: 5, onComplete: () => { this.susiState = 'following'; this.susi.setAngle(0); } }); } }); } /** * ADHD Focus Mode - Grok hides in hoodie to focus */ enterFocusMode(topic = 'coding') { if (this.isFocused) { console.log('⚠️ Already in focus mode!'); return false; } console.log(`🧠 Grok enters ADHD FOCUS MODE! Topic: ${topic}`); console.log('👕 *Hides in oversized hoodie*'); this.isFocused = true; this.currentTopic = topic; this.focusTimer = 0; // Visual: Grok shrinks into hoodie if (this.grok) { this.scene.tweens.add({ targets: this.grok, scale: 0.7, // Gets smaller (hiding in hoodie) alpha: 0.8, duration: 500 }); } // Can't be interrupted unless you have vape juice! this.showNotification({ title: 'Focus Mode Active!', text: `🧠 Grok is focusing on ${topic}. Don't interrupt! (Unless you have vape juice)`, icon: '👕' }); return true; } /** * Exit ADHD focus mode */ exitFocusMode() { if (!this.isFocused) return; console.log('🧠 Focus mode complete!'); this.isFocused = false; // Visual: Grok emerges from hoodie if (this.grok) { this.scene.tweens.add({ targets: this.grok, scale: 1.0, alpha: 1.0, duration: 500 }); } this.showNotification({ title: 'Focus Complete!', text: `✅ ${this.currentTopic} finished! Grok emerges victorious!`, icon: '🎉' }); } /** * ADHD Hyperfocus Movement */ moveWithHyperfocus(direction) { if (!this.isFocused) { console.log('⚠️ Not in focus mode!'); return; } // When hyperfocused, Grok moves SUPER fast! const baseSpeed = 5; const speed = baseSpeed * this.hyperfocusSpeed; // 2x speed! console.log(`⚡ HYPERFOCUS SPEED! Moving ${direction} at ${speed} px/frame!`); // Move Grok super fast // (Integration with movement system would go here) } /** * Get Grok's quest dialogues */ getGrokQuests() { return [ { id: 'hoodie_rescue', title: 'Hoodie v nevarnosti', dialogue: "Dude, moj najljubši hoodie se je zataknil za eno tistih piranha rastlin v coni 4. Brez njega se ne morem fokusirati, preveč me zebe v roke! Greš ponj?", objective: 'Premagaj gigantsko mesojedko in reši Gronkov široki pulover', rewards: { gold: 500, xp: 1000, item: 'grok_friendship +10' } }, { id: 'vape_mixology', title: 'Zamenjava tekočine (Vape Mixology)', dialogue: "Bro, poskušam zmešati nov okus 'Baggy Cloud', ampak Susi mi je prevrnila epruveto, ker je mislila, da so notri hrenovke. Rabim tri mutirane jagode iz Dino Valleyja!", objective: 'Najdi 3 mutirane jagode v Dino Valley biome', rewards: { gold: 300, xp: 750, item: 'baggy_cloud_vape_juice' } }, { id: 'adhd_code', title: 'ADHD koda na hlačah', dialogue: "Ej, si vedel, da sem si na nogo (na hlače) napisal pomembno kodo za tvoj novi rudnik, pa sem jo zdaj ponesreči umazal z blatom? Susi, pomagaj mi polizati to blato... ah, ne, Kai, ti boš moral najti čistilo!", objective: 'Najdi čistilo v opuščenem laboratoriju', rewards: { gold: 400, xp: 850, unlock: 'advanced_mine_code' } } ]; } /** * Helper: Show notification */ showNotification(notification) { console.log(`📢 ${notification.icon} ${notification.title}: ${notification.text}`); const ui = this.scene.scene.get('UIScene'); if (ui && ui.showNotification) { ui.showNotification(notification); } } /** * Get active buff for target */ getActiveBuff(target) { return this.activeBuffs.get(target); } }