import React from 'react'; import { assertNever } from '../../utils'; import './Charsheet.css'; import { DriveGuage } from './DriveGuage/DriveGuage'; import { Charsheet, Nerve, Cunning, Intuition } from './types'; interface CharsheetProps { sheet: Charsheet, } interface ActionElementProps { name: string, gilded: boolean, value: number, } const ActionElement = ({ name, gilded, value }: ActionElementProps) => { let dots = []; for (let i = 0; i < value; i++) { dots.push("\u25ef"); } let diamond = gilded ? "\u25c6" : "\u25c7"; return (<div> <h2 className="action-group__action"> {diamond} {name} </h2> <div className="action-group__dots"> {dots} </div> </div>); } interface ActionGroupElementProps { group: Nerve | Cunning | Intuition; } const ActionGroupElement = ({ group }: ActionGroupElementProps) => { var title; var elements = []; switch (group.type_) { case "nerve": { title = <div className="action-group__header"> Nerve <DriveGuage current={group.drives.current} max={group.drives.max} /> </div> elements.push(<ActionElement name="Move" gilded={group.move.gilded} value={group.move.score} />); elements.push(<ActionElement name="Strike" gilded={group.strike.gilded} value={group.strike.score} />); elements.push(<ActionElement name="Control" gilded={group.control.gilded} value={group.control.score} />); break } case "cunning": { title = <div className="action-group__header"> Cunning <DriveGuage current={group.drives.current} max={group.drives.max} /> </div> elements.push(<ActionElement name="Sway" gilded={group.sway.gilded} value={group.sway.score} />); elements.push(<ActionElement name="Read" gilded={group.read.gilded} value={group.read.score} />); elements.push(<ActionElement name="Hide" gilded={group.hide.gilded} value={group.hide.score} />); break } case "intuition": { title = <div className="action-group__header"> Intuition <DriveGuage current={group.drives.current} max={group.drives.max} /> </div> elements.push(<ActionElement name="Survey" gilded={group.survey.gilded} value={group.survey.score} />); elements.push(<ActionElement name="Focus" gilded={group.focus.gilded} value={group.focus.score} />); elements.push(<ActionElement name="Sense" gilded={group.sense.gilded} value={group.sense.score} />); break } default: { assertNever(group); } } return (<div className="action-group"> {title} {elements} </div>) } interface AbilitiesElementProps { role: string role_abilities: string[] specialty: string specialty_abilities: string[] } const AbilitiesElement = ({ role, role_abilities, specialty, specialty_abilities }: AbilitiesElementProps) => { return (<div> <h1> ROLE: {role} </h1> <ul> {role_abilities.map((ability) => <li>{ability}</li>)} </ul> <h1> SPECIALTY: {role} </h1> <ul> {specialty_abilities.map((ability) => <li>{ability}</li>)} </ul> </div> ); } export const CharsheetElement = ({ sheet }: CharsheetProps) => { return (<div> <div className="charsheet__header"> <div> Candela Obscura </div> <div> <p> {sheet.name} </p> <p> {sheet.pronouns} </p> <p> {sheet.circle} </p> </div> <div> <p> {sheet.style} </p> <p> {sheet.catalyst} </p> <p> {sheet.question} </p> </div> </div > <div className="charsheet__body"> <div> <ActionGroupElement group={sheet.nerve} /> <ActionGroupElement group={sheet.cunning} /> <ActionGroupElement group={sheet.intuition} /> </div> <div> <AbilitiesElement {...sheet} /> </div> <div> Marks, Scars, Relationships </div> </div> </div>); } /* export const CharsheetElement = () => { const sheet = { type_: 'Candela', name: "Soren Jensen", pronouns: 'he/him', circle: 'Circle of the Bluest Sky', style: 'dapper gentleman', catalyst: 'a cursed book', question: 'What were the contents of that book?', nerve: { type_: "nerve", drives: { current: 1, max: 2 }, resistances: { current: 0, max: 3 }, move: { gilded: false, score: 2 }, strike: { gilded: false, score: 1 }, control: { gilded: true, score: 0 }, } as Nerve, cunning: { type_: "cunning", drives: { current: 1, max: 1 }, resistances: { current: 0, max: 3 }, sway: { gilded: false, score: 0 }, read: { gilded: false, score: 0 }, hide: { gilded: false, score: 0 }, } as Cunning, intuition: { type_: "intuition", drives: { current: 0, max: 0 }, resistances: { current: 0, max: 3 }, survey: { gilded: false, score: 0 }, focus: { gilded: false, score: 0 }, sense: { gilded: false, score: 0 }, } as Intuition, role: 'Slink', role_abilities: [ 'Scout: If you have time to observe a location, you can spend 1 Intuition to ask a question: What do I notice here that others do not see? What in this place might be of use to us? What path should we follow?', ], specialty: 'Detective', specialty_abilities: [ "Mind Palace: When you want to figure out how two clues might relate or what path they should point you towards, burn 1 Intution resistance. The GM will give you the information you've deduced.", ], }; return <CharsheetElement_ sheet={sheet} /> } */