feat: helping reveal

This commit is contained in:
TrèsAbhi committed 2025-12-27 19:51:50 -06:00
1 parent 80dfc59017
commit eddc8168ba
4 files changed
+63 -4

No files matched your search

+7 -1
View File
@@ -917,7 +917,13 @@
"next": "Next", "next": "Next",
"no_results": "No results" "no_results": "No results"
}, },
"stats": "{correct} / {total} correct, {streak} streak" "stats": "{correct} / {total} correct, {streak} streak",
"help": {
"title": "Partially reveal tank?",
"description": "Reveals the tank without showing the name. This round will be considered incorrect and break your streak!",
"cancel": "Cancel",
"reveal": "Reveal"
}
}, },
"tankopedia": { "tankopedia": {
@@ -9,12 +9,15 @@ const CONTRAST = 2 ** 2;
export function GuessRenderer() { export function GuessRenderer() {
const guessState = Guess.use((state) => state.guessState); const guessState = Guess.use((state) => state.guessState);
const isRevealed = guessState !== GuessState.NotGuessed; const helpingReveal = Guess.use((state) => state.helpingReveal);
const isRevealed = helpingReveal || guessState !== GuessState.NotGuessed;
return ( return (
<SmartCanvas <SmartCanvas
style={{ style={{
filter: `grayscale(${isRevealed ? 0 : 1}) contrast(${isRevealed ? 1 : CONTRAST}) brightness(${isRevealed ? 1 : BRIGHTNESS})`, filter: `grayscale(${isRevealed ? 0 : 1}) contrast(${
isRevealed ? 1 : CONTRAST
}) brightness(${isRevealed ? 1 : BRIGHTNESS})`,
transitionDuration: isRevealed ? "2s" : undefined, transitionDuration: isRevealed ? "2s" : undefined,
transitionProperty: "filter", transitionProperty: "filter",
}} }}
+49 -1
View File
@@ -7,14 +7,17 @@ import {
import { literals } from "@blitzkit/i18n"; import { literals } from "@blitzkit/i18n";
import { import {
ArrowRightIcon, ArrowRightIcon,
EyeOpenIcon,
MagnifyingGlassIcon, MagnifyingGlassIcon,
PaperPlaneIcon, PaperPlaneIcon,
} from "@radix-ui/react-icons"; } from "@radix-ui/react-icons";
import { import {
AlertDialog,
Box, Box,
Button, Button,
Card, Card,
Flex, Flex,
IconButton,
Spinner, Spinner,
Text, Text,
TextField, TextField,
@@ -43,6 +46,7 @@ export function Guesser() {
const guessState = Guess.use((state) => state.guessState); const guessState = Guess.use((state) => state.guessState);
const correctGuesses = Guess.use((state) => state.correctGuesses); const correctGuesses = Guess.use((state) => state.correctGuesses);
const totalGuesses = Guess.use((state) => state.totalGuesses); const totalGuesses = Guess.use((state) => state.totalGuesses);
const helpingReveal = Guess.use((state) => state.helpingReveal);
const streak = Guess.use((state) => state.streak); const streak = Guess.use((state) => state.streak);
const { strings, unwrap } = useLocale(); const { strings, unwrap } = useLocale();
const input = useRef<HTMLInputElement>(null); const input = useRef<HTMLInputElement>(null);
@@ -171,6 +175,48 @@ export function Guesser() {
</TextField.Slot> </TextField.Slot>
</TextField.Root> </TextField.Root>
<AlertDialog.Root>
<AlertDialog.Trigger>
<IconButton
size="3"
disabled={guessState !== GuessState.NotGuessed}
>
<EyeOpenIcon />
</IconButton>
</AlertDialog.Trigger>
<AlertDialog.Content>
<AlertDialog.Title>
{strings.website.tools.guess.help.title}
</AlertDialog.Title>
<AlertDialog.Description>
{strings.website.tools.guess.help.description}
</AlertDialog.Description>
<Flex justify="end" gap="2">
<AlertDialog.Cancel>
<Button variant="outline">
{strings.website.tools.guess.help.cancel}
</Button>
</AlertDialog.Cancel>
<AlertDialog.Action>
<Button
color="tomato"
onClick={() => {
Guess.mutate((draft) => {
draft.helpingReveal = true;
draft.streak = 0;
});
}}
>
{strings.website.tools.guess.help.reveal}
</Button>
</AlertDialog.Action>
</Flex>
</AlertDialog.Content>
</AlertDialog.Root>
<Button <Button
size="3" size="3"
color={ color={
@@ -180,7 +226,8 @@ export function Guesser() {
} }
onClick={() => { onClick={() => {
if (guessState === GuessState.NotGuessed) { if (guessState === GuessState.NotGuessed) {
const correct = selected !== null && selected.id === tank.id; const correct =
selected !== null && selected.id === tank.id && !helpingReveal;
Guess.mutate((draft) => { Guess.mutate((draft) => {
draft.guessState = correct draft.guessState = correct
@@ -199,6 +246,7 @@ export function Guesser() {
draft.tank = tank; draft.tank = tank;
draft.guessState = GuessState.NotGuessed; draft.guessState = GuessState.NotGuessed;
draft.helpingReveal = false;
input.current.value = ""; input.current.value = "";
}); });
+2
View File
@@ -13,6 +13,7 @@ export interface Guess {
totalGuesses: number; totalGuesses: number;
correctGuesses: number; correctGuesses: number;
streak: number; streak: number;
helpingReveal: boolean;
} }
export const Guess = new Varuna<Guess, TankDefinition>((tank) => ({ export const Guess = new Varuna<Guess, TankDefinition>((tank) => ({
@@ -21,4 +22,5 @@ export const Guess = new Varuna<Guess, TankDefinition>((tank) => ({
totalGuesses: 0, totalGuesses: 0,
correctGuesses: 0, correctGuesses: 0,
streak: 0, streak: 0,
helpingReveal: false,
})); }));