31 lines
1.6 KiB
TypeScript
31 lines
1.6 KiB
TypeScript
import { useEffect } from "react";
|
|
import { RigidBody } from "@react-three/rapier";
|
|
import type { DungeonDefinition } from "../game/dungeonTypes";
|
|
import { DUNGEON_PHYSICAL_COLLISION_GROUPS, DUNGEON_WALL_COLLISION_GROUPS } from "./dungeonLineOfSight";
|
|
|
|
export function BossTestingRoom({ definition, onReady }: { readonly definition: DungeonDefinition; readonly onReady?: () => void }) {
|
|
const { min, max } = definition.bounds;
|
|
const x = (min[0] + max[0]) / 2;
|
|
const z = (min[2] + max[2]) / 2;
|
|
const y = definition.bosses[0].position[1];
|
|
const width = max[0] - min[0];
|
|
const depth = max[2] - min[2];
|
|
useEffect(() => {
|
|
onReady?.();
|
|
}, [onReady]);
|
|
return <group name="boss-testing-room">
|
|
<RigidBody type="fixed" colliders="cuboid" collisionGroups={DUNGEON_PHYSICAL_COLLISION_GROUPS} position={[x, y - 0.5, z]}>
|
|
<mesh receiveShadow><boxGeometry args={[width, 1, depth]} /><meshStandardMaterial color="#535c68" roughness={0.9} /></mesh>
|
|
</RigidBody>
|
|
{([
|
|
[min[0] - 0.5, y + 4, z, 1, 8, depth + 2], [max[0] + 0.5, y + 4, z, 1, 8, depth + 2],
|
|
[x, y + 4, min[2] - 0.5, width, 8, 1], [x, y + 4, max[2] + 0.5, width, 8, 1],
|
|
] as const).map(([px, py, pz, w, h, d], index) =>
|
|
<RigidBody key={index} type="fixed" colliders="cuboid" collisionGroups={DUNGEON_WALL_COLLISION_GROUPS} position={[px, py, pz]}>
|
|
<mesh receiveShadow><boxGeometry args={[w, h, d]} /><meshStandardMaterial color="#293441" roughness={0.95} /></mesh>
|
|
</RigidBody>
|
|
)}
|
|
<gridHelper args={[Math.max(width, depth), Math.ceil(Math.max(width, depth) / 5), "#8794a5", "#626d7b"]} position={[x, y + 0.015, z]} />
|
|
</group>;
|
|
}
|