feat: some guessing mechanics

This commit is contained in:
tresabhi committed 2025-05-04 21:02:50 -05:00
1 parent 46441d74d8
commit 232f24181f
10 files changed
+265 -76

No files matched your search

@@ -6,7 +6,6 @@ import {
import { literals } from '@blitzkit/i18n/src/literals';
import { CaretLeftIcon, Link2Icon, PersonIcon } from '@radix-ui/react-icons';
import {
Badge,
Button,
Dialog,
Flex,
@@ -22,6 +21,7 @@ import type { embedConfigurations } from '../../constants/embeds';
import { useLocale } from '../../hooks/useLocale';
import { EmbedState, type EmbedStateStore } from '../../stores/embedState';
import { CopyButton } from '../CopyButton';
import { SearchResults } from '../SearchResults';
interface GenerateURLProps {
embed: keyof typeof embedConfigurations;
@@ -118,25 +118,19 @@ export function GenerateURL({ embed }: GenerateURLProps) {
)}
{!searching && results.length > 0 && (
<Flex direction="column" gap="2" width="100%">
<SearchResults.Root>
{results.map((result) => (
<Button
variant="ghost"
<SearchResults.Item
text={result.nickname}
discriminator={strings.common.regions.short[result.region]}
onClick={() => {
setCopyUser(result);
setCopyDialogOpen(true);
setSearchDialogOpen(false);
}}
>
<Flex justify="between" width="100%" gap="2">
{result.nickname}
<Badge>
{strings.common.regions.short[result.region]}
</Badge>
</Flex>
</Button>
/>
))}
</Flex>
</SearchResults.Root>
)}
</Flex>
@@ -0,0 +1,34 @@
import {
Badge,
Button,
Flex,
type ButtonProps,
type FlexProps,
} from '@radix-ui/themes';
import type { ReactNode } from 'react';
function Root(props: FlexProps) {
return <Flex direction="column" gap="2" width="100%" {...props} />;
}
interface ItemProps extends ButtonProps {
text: string;
discriminator?: ReactNode;
}
function Item({ text, discriminator, ...props }: ItemProps) {
return (
<Button variant="ghost" {...props} highContrast>
<Flex
justify={discriminator === undefined ? 'center' : 'between'}
width="100%"
gap="2"
>
{text}
{discriminator !== undefined && <Badge>{discriminator}</Badge>}
</Flex>
</Button>
);
}
export const SearchResults = { Root, Item };
@@ -36,6 +36,7 @@ interface ControlsProps {
autoRotate?: boolean;
zoomable?: boolean;
enableRotate?: boolean;
distanceScale?: number;
}
export function Controls({
@@ -43,6 +44,7 @@ export function Controls({
autoRotate = true,
zoomable = true,
enableRotate = true,
distanceScale = 1,
}: ControlsProps) {
const mutateTankopediaEphemeral = TankopediaEphemeral.useMutation();
const display = TankopediaEphemeral.use((state) => state.display);
@@ -94,11 +96,11 @@ export function Controls({
protagonistHullOrigin.y +
protagonistTurretOrigin.y +
protagonistGunOrigin.y;
const inspectModeInitialPosition = [
const inspectModeInitialPosition = new Vector3(
-8,
gunHeight + (naked ? 10 : 2),
-13,
] as const;
).multiplyScalar(distanceScale);
const protagonistGunOriginOnlyY = new Vector3(
0,
protagonistTurretModelDefinition.gun_origin.y,
@@ -203,7 +205,7 @@ export function Controls({
}
case Pose.Default: {
camera.position.set(...inspectModeInitialPosition);
camera.position.copy(inspectModeInitialPosition);
orbitControls.current?.target.set(0, 1.25, 0);
break;
}
@@ -312,7 +314,7 @@ export function Controls({
.add(shellOrigin);
}
} else {
camera.position.set(...inspectModeInitialPosition);
camera.position.copy(inspectModeInitialPosition);
orbitControls.current.target.set(0, gunHeight / (naked ? 4 : 2), 0);
orbitControls.current.enablePan = true;
orbitControls.current.enableZoom = true;