import React, { useState, useEffect, useRef, useCallback } from 'react'; // Main App component const App = () => { // Game State const [stardust, setStardust] = useState(0); // Current stardust const [stardustPerClick, setStardustPerClick] = useState(1); // Stardust gained per click const [stardustPerSecond, setStardustPerSecond] = useState(0); // Stardust gained passively per second const [upgrades, setUpgrades] = useState({ // Initial upgrade definitions 'miningLaser': { name: 'Mining Laser', cost: 10, production: 1, type: 'perSecond', level: 0, description: 'Harvests 1 Stardust per second.' }, 'automatedDrill': { name: 'Automated Drill', cost: 100, production: 10, type: 'perSecond', level: 0, description: 'Automates harvesting, 10 Stardust per second.' }, 'planetaryExtractor': { name: 'Planetary Extractor', cost: 1000, production: 100, type: 'perSecond', level: 0, description: 'Extracts Stardust from entire planets, 100 Stardust per second.' }, 'cosmicHarvester': { name: 'Cosmic Harvester', cost: 5000, production: 500, type: 'perSecond', level: 0, description: 'Gathers Stardust across solar systems, 500 Stardust per second.' }, 'clickEnhancer': { name: 'Click Enhancer', cost: 50, production: 1, type: 'perClick', level: 0, description: 'Increases Stardust per click by 1.' }, 'warpDrive': { name: 'Warp Drive', cost: 2000, production: 0, type: 'prestigeMultiplier', level: 0, description: 'Increases Stardust production from all sources by 2x.', multiplier: 2}, }); const [prestigeLevel, setPrestigeLevel] = useState(0); // Prestige level const [prestigeMultiplier, setPrestigeMultiplier] = useState(1); // Global multiplier from prestige const [message, setMessage] = useState(''); // Game messages (e.g., insufficient funds) const [showPrestigeModal, setShowPrestigeModal] = useState(false); // State for prestige confirmation modal // Ref for click animation const clickAnimationRef = useRef(null); // Calculate total stardust per second const calculateStardustPerSecond = useCallback(() => { let totalSPS = 0; for (const key in upgrades) { if (upgrades[key].type === 'perSecond') { totalSPS += upgrades[key].production * upgrades[key].level; } } return totalSPS * prestigeMultiplier; // Apply prestige multiplier }, [upgrades, prestigeMultiplier]); // Game loop for passive stardust generation useEffect(() => { const interval = setInterval(() => { setStardust(prevStardust => { const currentSPS = calculateStardustPerSecond(); return prevStardust + currentSPS; }); }, 1000); // Every second return () => clearInterval(interval); }, [calculateStardustPerSecond]); // Update stardust per second display when upgrades change useEffect(() => { setStardustPerSecond(calculateStardustPerSecond()); }, [upgrades, calculateStardustPerSecond]); // Handle a click event const handleHarvestClick = () => { setStardust(prevStardust => prevStardust + stardustPerClick * prestigeMultiplier); // Apply prestige multiplier to clicks // Show click animation if (clickAnimationRef.current) { clickAnimationRef.current.classList.remove('animate-ping-once'); // Reset animation void clickAnimationRef.current.offsetWidth; // Trigger reflow clickAnimationRef.current.classList.add('animate-ping-once'); // Re-add animation } }; // Handle buying an upgrade const handleBuyUpgrade = (upgradeId) => { const upgrade = upgrades[upgradeId]; if (stardust >= upgrade.cost) { setStardust(prevStardust => prevStardust - upgrade.cost); setUpgrades(prevUpgrades => { const newUpgrades = { ...prevUpgrades }; const newUpgradeLevel = newUpgrades[upgradeId].level + 1; newUpgrades[upgradeId].level = newUpgradeLevel; // Increase cost for next level (e.g., 1.15x) newUpgrades[upgradeId].cost = Math.floor(upgrade.cost * 1.15); // Apply special effects for certain upgrade types if (newUpgrades[upgradeId].type === 'perClick') { setStardustPerClick(prevSPC => prevSPC + newUpgrades[upgradeId].production); } if (newUpgrades[upgradeId].type === 'prestigeMultiplier') { setPrestigeMultiplier(prevMultiplier => prevMultiplier * newUpgrades[upgradeId].multiplier); } return newUpgrades; }); setMessage(`${upgrade.name} purchased!`); } else { setMessage('Not enough Stardust!'); } }; // Handle prestige (galaxy reset) const handlePrestige = () => { setShowPrestigeModal(true); }; const confirmPrestige = () => { setPrestigeLevel(prevLevel => prevLevel + 1); setPrestigeMultiplier(prevMultiplier => prevMultiplier * 1.5); // Increase global multiplier by 1.5x for next prestige setStardust(0); // Reset stardust setStardustPerClick(1); // Reset click production // Reset all upgrades (except the prestige multiplier itself if desired, or reset everything) setUpgrades({ 'miningLaser': { name: 'Mining Laser', cost: 10, production: 1, type: 'perSecond', level: 0, description: 'Harvests 1 Stardust per second.' }, 'automatedDrill': { name: 'Automated Drill', cost: 100, production: 10, type: 'perSecond', level: 0, description: 'Automates harvesting, 10 Stardust per second.' }, 'planetaryExtractor': { name: 'Planetary Extractor', cost: 1000, production: 100, type: 'perSecond', level: 0, description: 'Extracts Stardust from entire planets, 100 Stardust per second.' }, 'cosmicHarvester': { name: 'Cosmic Harvester', cost: 5000, production: 500, type: 'perSecond', level: 0, description: 'Gathers Stardust across solar systems, 500 Stardust per second.' }, 'clickEnhancer': { name: 'Click Enhancer', cost: 50, production: 1, type: 'perClick', level: 0, description: 'Increases Stardust per click by 1.' }, 'warpDrive': { name: 'Warp Drive', cost: 2000, production: 0, type: 'prestigeMultiplier', level: 0, description: 'Increases Stardust production from all sources by 2x.', multiplier: 2}, }); setMessage('Galaxy Reset initiated! New cosmic journey begins with increased power!'); setShowPrestigeModal(false); }; const cancelPrestige = () => { setShowPrestigeModal(false); }; // Helper to format numbers (e.g., 1000 -> 1K, 1000000 -> 1M) const formatNumber = (num) => { if (num >= 1000000000) return (num / 1000000000).toFixed(2) + 'B'; if (num >= 1000000) return (num / 1000000).toFixed(2) + 'M'; if (num >= 1000) return (num / 1000).toFixed(2) + 'K'; return num.toFixed(0); }; return (
{/* Header */}

Cosmic Harvest

{/* Main Game Area */}
{/* Background "Stardust" animation */}
{[...Array(50)].map((_, i) => (
))}
{/* Left Panel: Stats and Click Button */}

Stardust Collected:

{formatNumber(stardust)}

({formatNumber(stardustPerClick * prestigeMultiplier)}/click, {formatNumber(stardustPerSecond)}/sec)

Prestige Multiplier: {prestigeMultiplier.toFixed(2)}x (Level {prestigeLevel})

{message && (

{message}

)}
{/* Right Panel: Upgrades */}

Upgrades

{Object.keys(upgrades).map((id) => (

{upgrades[id].name} (Level {upgrades[id].level})

{upgrades[id].description}

Cost: {formatNumber(upgrades[id].cost)} Stardust

))}
{/* Prestige Button - conditionally shown */} {stardust >= 10000 && ( // Example condition: allow prestige after 10,000 stardust )}
{/* Prestige Confirmation Modal */} {showPrestigeModal && (

Confirm Galaxy Reset?

This will reset all your progress but give you a permanent boost for future journeys!

)} {/* Tailwind CSS Customization - DO NOT REMOVE */}
); }; export default App;