a
This commit is contained in:
parent
034f90e635
commit
c940b424a3
11
package-lock.json
generated
11
package-lock.json
generated
@ -8,6 +8,7 @@
|
|||||||
"name": "viber",
|
"name": "viber",
|
||||||
"version": "0.0.0",
|
"version": "0.0.0",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
|
"@chakra-ui/icons": "^2.2.4",
|
||||||
"@chakra-ui/react": "^2.8.2",
|
"@chakra-ui/react": "^2.8.2",
|
||||||
"@emotion/react": "^11.11.3",
|
"@emotion/react": "^11.11.3",
|
||||||
"@emotion/styled": "^11.11.0",
|
"@emotion/styled": "^11.11.0",
|
||||||
@ -651,6 +652,16 @@
|
|||||||
"react": ">=18"
|
"react": ">=18"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/@chakra-ui/icons": {
|
||||||
|
"version": "2.2.4",
|
||||||
|
"resolved": "https://registry.npmjs.org/@chakra-ui/icons/-/icons-2.2.4.tgz",
|
||||||
|
"integrity": "sha512-l5QdBgwrAg3Sc2BRqtNkJpfuLw/pWRDwwT58J6c4PqQT6wzXxyNa8Q0PForu1ltB5qEiFb1kxr/F/HO1EwNa6g==",
|
||||||
|
"license": "MIT",
|
||||||
|
"peerDependencies": {
|
||||||
|
"@chakra-ui/react": ">=2.0.0",
|
||||||
|
"react": ">=18"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/@chakra-ui/image": {
|
"node_modules/@chakra-ui/image": {
|
||||||
"version": "2.1.0",
|
"version": "2.1.0",
|
||||||
"resolved": "https://registry.npmjs.org/@chakra-ui/image/-/image-2.1.0.tgz",
|
"resolved": "https://registry.npmjs.org/@chakra-ui/image/-/image-2.1.0.tgz",
|
||||||
|
|||||||
@ -10,6 +10,7 @@
|
|||||||
"preview": "vite preview"
|
"preview": "vite preview"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
|
"@chakra-ui/icons": "^2.2.4",
|
||||||
"@chakra-ui/react": "^2.8.2",
|
"@chakra-ui/react": "^2.8.2",
|
||||||
"@emotion/react": "^11.11.3",
|
"@emotion/react": "^11.11.3",
|
||||||
"@emotion/styled": "^11.11.0",
|
"@emotion/styled": "^11.11.0",
|
||||||
|
|||||||
31
src/App.tsx
31
src/App.tsx
@ -41,16 +41,13 @@ function App() {
|
|||||||
playerLevel,
|
playerLevel,
|
||||||
getAvailableBuildings,
|
getAvailableBuildings,
|
||||||
tick,
|
tick,
|
||||||
clickPower,
|
|
||||||
click,
|
click,
|
||||||
getClickPowerUpgradeCost
|
|
||||||
} = useGameStore()
|
} = useGameStore()
|
||||||
|
|
||||||
const [agreedToTerms, setAgreedToTerms] = useState(false)
|
const [agreedToTerms, setAgreedToTerms] = useState(false)
|
||||||
const [hasStarted, setHasStarted] = useState(false)
|
const [hasStarted, setHasStarted] = useState(false)
|
||||||
const { isOpen, onClose } = useDisclosure({ defaultIsOpen: true })
|
const { isOpen, onClose } = useDisclosure({ defaultIsOpen: true })
|
||||||
const availableBuildings = getAvailableBuildings()
|
const availableBuildings = getAvailableBuildings()
|
||||||
const clickPowerUpgradeCost = getClickPowerUpgradeCost()
|
|
||||||
|
|
||||||
// Set up game tick interval
|
// Set up game tick interval
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
@ -125,32 +122,8 @@ function App() {
|
|||||||
<Box bg="gray.800" p={6} borderRadius="lg" w="full">
|
<Box bg="gray.800" p={6} borderRadius="lg" w="full">
|
||||||
<Heading as="h2" size="xl" mb={6} color="green.400">Upgrades</Heading>
|
<Heading as="h2" size="xl" mb={6} color="green.400">Upgrades</Heading>
|
||||||
<SimpleGrid columns={{ base: 1, md: 2, lg: 3 }} gap={4}>
|
<SimpleGrid columns={{ base: 1, md: 2, lg: 3 }} gap={4}>
|
||||||
<Box
|
{/* Click Power button has been moved to ResourceDisplay header */}
|
||||||
bg="gray.700"
|
{/* Add other upgrades here in the future */}
|
||||||
p={4}
|
|
||||||
borderRadius="lg"
|
|
||||||
border="1px"
|
|
||||||
borderColor="gray.600"
|
|
||||||
>
|
|
||||||
<VStack align="stretch" spacing={2}>
|
|
||||||
<Box display="flex" justifyContent="space-between" alignItems="center">
|
|
||||||
<Text fontWeight="bold">Click Power</Text>
|
|
||||||
<Text>Level {clickPower}</Text>
|
|
||||||
</Box>
|
|
||||||
<Text fontSize="sm" color="gray.400">
|
|
||||||
Each click generates {clickPower} points
|
|
||||||
</Text>
|
|
||||||
<Button
|
|
||||||
onClick={() => useGameStore.getState().buyUpgrade('clickPower')}
|
|
||||||
opacity={points < clickPowerUpgradeCost ? 0.4 : 1}
|
|
||||||
_hover={{ bg: 'gray.500', opacity: points < clickPowerUpgradeCost ? 0.4 : 1 }}
|
|
||||||
bg="gray.600"
|
|
||||||
cursor={points < clickPowerUpgradeCost ? 'not-allowed' : 'pointer'}
|
|
||||||
>
|
|
||||||
Upgrade ({clickPowerUpgradeCost} points)
|
|
||||||
</Button>
|
|
||||||
</VStack>
|
|
||||||
</Box>
|
|
||||||
</SimpleGrid>
|
</SimpleGrid>
|
||||||
</Box>
|
</Box>
|
||||||
</VStack>
|
</VStack>
|
||||||
|
|||||||
@ -1,11 +1,12 @@
|
|||||||
import { Box, HStack, Text, Progress, Flex, Divider, Tooltip, Image } from '@chakra-ui/react'
|
import { Box, HStack, Text, Progress, Flex, Divider, Tooltip, Image, Button, Icon } from '@chakra-ui/react'
|
||||||
import { useGameStore } from '../store/gameStore'
|
import { useGameStore } from '../store/gameStore'
|
||||||
import logoImg from '../assets/logo.png'
|
import logoImg from '../assets/logo.png'
|
||||||
import { ResetButton } from './ResetButton'
|
import { ResetButton } from './ResetButton'
|
||||||
import { SoundToggleButton } from './SoundToggleButton'
|
import { SoundToggleButton } from './SoundToggleButton'
|
||||||
|
import { AddIcon } from '@chakra-ui/icons'
|
||||||
|
|
||||||
export function ResourceDisplay() {
|
export function ResourceDisplay() {
|
||||||
const { points, pointsPerSecond, clickPower, playerLevel } = useGameStore()
|
const { points, pointsPerSecond, clickPower, playerLevel, getClickPowerUpgradeCost, buyUpgrade } = useGameStore()
|
||||||
|
|
||||||
// Calculate progress to next level
|
// Calculate progress to next level
|
||||||
const currentLevelPPS = Math.pow(10, playerLevel - 1)
|
const currentLevelPPS = Math.pow(10, playerLevel - 1)
|
||||||
@ -21,6 +22,9 @@ export function ResourceDisplay() {
|
|||||||
progress = Math.min(Math.max(((pointsPerSecond - currentLevelPPS) / (nextLevelPPS - currentLevelPPS)) * 100, 0), 100);
|
progress = Math.min(Math.max(((pointsPerSecond - currentLevelPPS) / (nextLevelPPS - currentLevelPPS)) * 100, 0), 100);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const clickPowerUpgradeCost = getClickPowerUpgradeCost();
|
||||||
|
const canAffordUpgrade = points >= clickPowerUpgradeCost;
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<Box
|
<Box
|
||||||
position="fixed"
|
position="fixed"
|
||||||
@ -89,10 +93,28 @@ export function ResourceDisplay() {
|
|||||||
|
|
||||||
<Divider orientation="vertical" h="40px" />
|
<Divider orientation="vertical" h="40px" />
|
||||||
|
|
||||||
{/* Click Power */}
|
{/* Click Power with Upgrade Button */}
|
||||||
<Box textAlign="center" minW="120px">
|
<Box textAlign="center" minW="120px">
|
||||||
<Text fontSize="sm" fontWeight="bold">Click Power</Text>
|
<Text fontSize="sm" fontWeight="bold">Click Power</Text>
|
||||||
<Text fontSize="md">{clickPower}</Text>
|
<Flex justify="center" align="center" gap={1}>
|
||||||
|
<Text fontSize="md">{clickPower}</Text>
|
||||||
|
<Tooltip label={`Upgrade to level ${clickPower + 1} (${clickPowerUpgradeCost} points)`}>
|
||||||
|
<Button
|
||||||
|
size="xs"
|
||||||
|
colorScheme="green"
|
||||||
|
variant="outline"
|
||||||
|
p={1}
|
||||||
|
height="20px"
|
||||||
|
minW="20px"
|
||||||
|
onClick={() => buyUpgrade('clickPower')}
|
||||||
|
opacity={canAffordUpgrade ? 1 : 0.4}
|
||||||
|
cursor={canAffordUpgrade ? 'pointer' : 'not-allowed'}
|
||||||
|
_hover={{ bg: 'green.800', opacity: canAffordUpgrade ? 1 : 0.4 }}
|
||||||
|
>
|
||||||
|
<AddIcon boxSize={2} />
|
||||||
|
</Button>
|
||||||
|
</Tooltip>
|
||||||
|
</Flex>
|
||||||
</Box>
|
</Box>
|
||||||
|
|
||||||
<Divider orientation="vertical" h="40px" />
|
<Divider orientation="vertical" h="40px" />
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user