diff --git a/app/package-lock.json b/app/package-lock.json index 00693c4..8be06d6 100644 --- a/app/package-lock.json +++ b/app/package-lock.json @@ -11,6 +11,8 @@ "@next/eslint-plugin-next": "^14.2.15", "@rainbow-me/rainbowkit": "^2.2.0", "@tanstack/react-query": "^5.55.3", + "howler": "^2.2.4", + "jsfxr": "^1.2.2", "next": "^14.2.10", "react": "^18.3.1", "react-dom": "^18.3.1", @@ -8974,6 +8976,11 @@ "minimalistic-crypto-utils": "^1.0.1" } }, + "node_modules/howler": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/howler/-/howler-2.2.4.tgz", + "integrity": "sha512-iARIBPgcQrwtEr+tALF+rapJ8qSc+Set2GJQl7xT1MQzWaVkFebdJhR3alVlSiUf5U7nAANKuj3aWpwerocD5w==" + }, "node_modules/http-errors": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", @@ -10117,6 +10124,14 @@ "node": ">=6" } }, + "node_modules/jsfxr": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/jsfxr/-/jsfxr-1.2.2.tgz", + "integrity": "sha512-aBtNHZ/eJVZ3Q12HLj6F0eF20bRJTar6fjHf14zZ/Co5GzcVsEBujJO7IKwAhZS3Pe0xIvUOD3O1BoZ6ij0xhA==", + "bin": { + "sfxr-to-wav": "sfxr-to-wav" + } + }, "node_modules/json-buffer": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", diff --git a/app/package.json b/app/package.json index 3310ec1..68e4f87 100644 --- a/app/package.json +++ b/app/package.json @@ -12,6 +12,8 @@ "@next/eslint-plugin-next": "^14.2.15", "@rainbow-me/rainbowkit": "^2.2.0", "@tanstack/react-query": "^5.55.3", + "howler": "^2.2.4", + "jsfxr": "^1.2.2", "next": "^14.2.10", "react": "^18.3.1", "react-dom": "^18.3.1", diff --git a/app/public/sounds/arcade_win.wav b/app/public/sounds/arcade_win.wav new file mode 100644 index 0000000..74c74ba Binary files /dev/null and b/app/public/sounds/arcade_win.wav differ diff --git a/app/public/sounds/lost.wav b/app/public/sounds/lost.wav new file mode 100644 index 0000000..f324b3f Binary files /dev/null and b/app/public/sounds/lost.wav differ diff --git a/app/src/components/BossOutcomeModal.tsx b/app/src/components/BossOutcomeModal.tsx index 793b082..57e0e4b 100644 --- a/app/src/components/BossOutcomeModal.tsx +++ b/app/src/components/BossOutcomeModal.tsx @@ -4,38 +4,76 @@ import styles from "../styles/Modal.module.css"; import bgStyles from "../styles/Background.module.css"; import { bossToName, bossToReward } from "./BossInfo"; import { bossLevelToClass } from "./Boss"; - +import { lostSound, wonSound } from "../utils/soundsEffect"; +import { useEffect } from "react"; interface BossOutcomeModalProps { - setIsOpen: (val: boolean) => void, + setIsOpen: (val: boolean) => void; } const BossOutcomeModal = ({ setIsOpen }: BossOutcomeModalProps) => { const { lastBossResult } = usePlayer(); + const outcome = lastBossResult?.reward != BigInt(0); + const ascended = lastBossResult?.prestigeGained; + useEffect(() => { + if (lastBossResult != null) { + if (outcome) { + wonSound(); + } else { + lostSound(); + } + } + }, [outcome, lastBossResult]) + if (lastBossResult == null) return null; - const outcome = lastBossResult.reward != BigInt(0); - const ascended = lastBossResult.prestigeGained; - - const text = outcome ? and you won! 🤩 : and you lost 😔; - const rewardAmount = parseFloat(parseFloat(formatUnits(bossToReward[lastBossResult.level], 18).toString()).toFixed(4)); - const rewardText = - ascended ?

You won {rewardAmount} RGCVII and ASCENDED!!!. This means you beat the bosses and gained a Prestige level. Your GELD is now forfeit, but your legend lives on.

- : outcome ?

You won {rewardAmount} RGCVII

- :

Your GELD is now forfeit.
Try again 💪 we know you can do it!

+ const text = outcome ? ( + + and you won! 🤩 + + ) : ( + + and you lost 😔 + + ); + const rewardAmount = parseFloat( + parseFloat( + formatUnits(bossToReward[lastBossResult.level], 18).toString() + ).toFixed(4) + ); + const rewardText = ascended ? ( +

+ You won {rewardAmount} RGCVII and{" "} + ASCENDED!!!. This means you beat the bosses and gained a{" "} + Prestige level. Your GELD is now forfeit, but your legend + lives on. +

+ ) : outcome ? ( +

+ You won {rewardAmount} RGCVII +

+ ) : ( +

+ Your GELD is now forfeit. +
+ Try again 💪 we know you can do it! +

+ ); const bossName = bossToName[lastBossResult.variant]; const bossClass = bossLevelToClass[lastBossResult.variant]; - return
-

You battled {bossName} Moloch!

-
-

{text}

- {rewardText} -
- + return ( +
+

You battled {bossName} Moloch!

+
+

{text}

+ {rewardText} +
+ +
-
-} + ); +}; -export default BossOutcomeModal +export default BossOutcomeModal; diff --git a/app/src/pages/_app.tsx b/app/src/pages/_app.tsx index 23c9c58..b8b7681 100644 --- a/app/src/pages/_app.tsx +++ b/app/src/pages/_app.tsx @@ -8,8 +8,10 @@ import { RainbowKitProvider, midnightTheme } from "@rainbow-me/rainbowkit"; import { config } from "../wagmi"; import { Press_Start_2P, Texturina } from "next/font/google"; import PlayerProvider from "../providers/PlayerProvider"; -import ModalProvider from '../providers/ModalProvider'; - +import ModalProvider from "../providers/ModalProvider"; +import Script from "next/script"; +import { useEffect } from "react"; +import { clickSound } from "../utils/soundsEffect"; const client = new QueryClient(); const font = Texturina({ weight: ["400"], subsets: ["latin"] }); @@ -18,6 +20,18 @@ const font = Texturina({ weight: ["400"], subsets: ["latin"] }); const fontPixel = Press_Start_2P({ weight: ["400"], subsets: ["latin"] }); function MyApp({ Component, pageProps }: AppProps) { + useEffect(() => { + window.addEventListener("click", () => { + clickSound(); + }); + + return () => { + window.removeEventListener("click", () => { + clickSound(); + }); + }; + }, []); + return ( @@ -41,11 +55,19 @@ function MyApp({ Component, pageProps }: AppProps) { font-family: ${font.style.fontFamily}; } .pixelFont { - font-family: ${fontPixel.style.fontFamily}; + font-family: ${fontPixel.style.fontFamily}; } `} +