import clsx from "clsx"; import { FC, HTMLAttributes, useState } from "react"; import { useDispatch } from "react-redux"; import { Select } from "@dndbeyond/character-components/es"; import { Accordion } from "~/components/Accordion"; import { Button } from "~/components/Button"; import { Toggle } from "~/components/Toggle"; import { useCharacterEngine } from "~/hooks/useCharacterEngine"; import { builderActions } from "~/tools/js/CharacterBuilder/actions"; import ClassDisplaySimple from "~/tools/js/CharacterBuilder/components/ClassDisplaySimple"; import SpeciesDisplaySimple from "~/tools/js/CharacterBuilder/components/SpeciesDisplaySimple"; import { ClassDefinitionContract, RaceDefinitionContract } from "~/types"; import { PortraitName } from "../../components/PortraitName"; import { ClassChoose } from "../ClassChoose"; import { SpeciesChoose } from "../SpeciesChoose"; import styles from "./styles.module.css"; export interface RandomBuildProps extends HTMLAttributes {} export const RandomBuild: FC = ({ className, ...props }) => { const dispatch = useDispatch(); const { raceUtils, ruleData, helperUtils } = useCharacterEngine(); const [species, setSpecies] = useState(null); const [charClass, setCharClass] = useState( null ); const [name, setName] = useState(""); const [level, setLevel] = useState(null); const [allowMulticlass, setAllowMulticlass] = useState(false); const [allowFeats, setAllowFeats] = useState(false); const [isClassesOpen, setIsClassesOpen] = useState(false); const [isSpeciesOpen, setIsSpeciesOpen] = useState(false); const handleSubmit = (): void => { dispatch( builderActions.randomBuildRequest( level, species ? raceUtils.getEntityRaceId(species) : null, species ? raceUtils.getEntityRaceTypeId(species) : null, charClass ? charClass.id : null, allowMulticlass, allowFeats, name ) ); }; const handleSelectSpecies = (species: RaceDefinitionContract): void => { setSpecies(species); }; const handleRemoveSpecies = (): void => { setSpecies(null); setIsSpeciesOpen(true); }; const handleSelectClass = (charClass: ClassDefinitionContract): void => { setCharClass(charClass); }; const handleRemoveClass = (): void => { setCharClass(null); setIsClassesOpen(true); }; const handleLevelChange = (level: string): void => { setLevel(helperUtils.parseInputInt(level)); }; const handleToggleAllowMulticlass = (): void => { setAllowMulticlass(!allowMulticlass); }; const handleToggleAllowFeats = (): void => { setAllowFeats(!allowFeats); }; const levels = Array.from( new Array(ruleData.maxCharacterLevel), (val, index) => index + 1 ); return ( Random Build Create a randomized character. Make it completely random, or make choices in some categories and randomize the rest. Once you've made your selections, click Create Character to generate a character sheet and start playing! Choose Level ({ value: level, label: level, }))} onChange={handleLevelChange} aria-labelledby="choose-level" value={level} /> {charClass ? ( ) : ( Choose Class} variant="text" resetOpen={isClassesOpen} > )} {species ? ( ) : ( Choose Species} variant="text" resetOpen={isSpeciesOpen} > )} Allow Multiclass Allow Feats Create Character ); };
Create a randomized character. Make it completely random, or make choices in some categories and randomize the rest. Once you've made your selections, click Create Character to generate a character sheet and start playing!