import { ResourceDisplay } from './components/ResourceDisplay' import { BuildingButton } from './components/BuildingButton' import { NextBuildingPreview } from './components/NextBuildingPreview' import { ResetButton } from './components/ResetButton' import { useGameStore } from './store/gameStore' import { playClickSound, initAudio } from './utils/soundUtils' import { ChakraProvider, Box, Container, Heading, Text, VStack, SimpleGrid, Button, Flex, Image, Center, Modal, ModalOverlay, ModalContent, ModalHeader, ModalBody, ModalFooter, Checkbox, useDisclosure } from '@chakra-ui/react' import theme from './theme' import { useEffect, useState } from 'react' import logoImg from './assets/logo.png' type BuildingId = 'mouseFarms' | 'keyboardFactories' | 'monitorDisplays' | 'officeSpace' | 'serverRooms' | 'dataCenters' | 'dataCities' | 'dataCountries' | 'dataContinents' | 'dataWorlds' | 'dataMoons' | 'dataSolarSystems' | 'dataGalaxies' | 'dataUniverses' | 'dataGods' type BuildingLevelKey = `${BuildingId}Level` function App() { const { points, playerLevel, getAvailableBuildings, tick, clickPower, click, getClickPowerUpgradeCost } = useGameStore() const [agreedToTerms, setAgreedToTerms] = useState(false) const [hasStarted, setHasStarted] = useState(false) const { isOpen, onClose } = useDisclosure({ defaultIsOpen: true }) const availableBuildings = getAvailableBuildings() const clickPowerUpgradeCost = getClickPowerUpgradeCost() // Set up game tick interval useEffect(() => { const interval = setInterval(tick, 100) // 100ms = 10 ticks per second return () => clearInterval(interval) }, [tick]) // Handle keyboard events useEffect(() => { // Remove the local event listener since we're now handling events globally // This listener is no longer needed return () => {} }, [click, hasStarted]) // This is now handled globally, but we'll keep a simpler version // for UI feedback only (cursor change, etc) const handleClick = (e: React.MouseEvent) => { // Don't call click() here as it's now handled globally // Just for visual feedback if (hasStarted) { console.log('App container clicked - handled by global handler'); } } // Handle starting the game const handleStartGame = () => { if (agreedToTerms) { // Initialize audio on first user interaction initAudio(); setHasStarted(true) onClose() } } return ( {/* Buildings Grid */} {availableBuildings.map((building) => ( useGameStore.getState().buyBuilding(building.id as BuildingId)} description={building.description} production={building.production} buildingType={building.id!} levelRequirement={building.levelRequirement} /> ))} {/* Upgrades Section */} Upgrades Click Power Level {clickPower} Each click generates {clickPower} points {/* Terms and Conditions Modal */} {}} closeOnOverlayClick={false} isCentered size="2xl" > Welcome to ClickerCorp™ Employment Agreement Welcome aboard! You have been selected by ClickerCorp™ to spearhead our mission-critical clicking initiatives. As our new Synergy Enhancement Specialist, you will leverage cutting-edge click-through paradigms to maximize stakeholder value in the rapidly evolving digital interaction space. Your KPIs include optimizing click-to-value ratios while maintaining best-in-class finger ergonomics. Together, we'll disrupt the clicking industry! Controls & Operations Click anywhere or press any key to generate points and advance your career in the digital clicking space. (Please note: This position is unpaid and offers exposure as compensation) setAgreedToTerms(e.target.checked)} > I have read and agree to the terms of employment at ClickerCorp™ ) } export default App