import React, {useEffect, useMemo, useState} from 'react'; import './App.css'; import {Col, Container, Row, Stack} from "react-bootstrap"; import {CharacterStatus} from "./CharacterStatus"; import {GameState} from "../model/GameState"; import OverlayTrigger from "react-bootstrap/OverlayTrigger"; import Tooltip from "react-bootstrap/Tooltip"; import {TurnTimer} from "./TurnTimer"; import {CharacterSide} from "../model/Character"; import {evaluate} from "../grammar/interpreter"; function useJson(url: string): T | null { const [data, setData] = useState(null); useEffect(() => { let ignore = false; fetch(url) .then(response => response.json() as T) .then(json => { if (!ignore) { setData(json); } }); return () => { ignore = true; }; }, [url]); return data as T | null; } function App() { const origState = useJson("/api/current.json") const state = useMemo(() => { try { if (origState !== null) { return evaluate(origState, Date.now(), String.raw`Begin &echo @prandia: Lunch &: 69/420 MP &: -20 MP @ HP: 35/70 @ HP: -30... water @: ZP 5/6 @: ZP +1 &: 20 HP gale, calor,gravitas HP: 3 &: ZP 5 &: ZP /7 &: /99 IP & HP: /69 aelica IP: - athetyz: - MP linnet: HP - &: Lv - End`) } } catch (ex) { console.log(ex) } }, [origState]) const startTime = Date.now() const endTime = Date.now() + 2 * 60 * 1000 return

Session

Fabula Points spent {state?.session.usedSp.Fabula ?? 0}
The party earns 1 EXP for each (#-players) Fabula Points spent during the session.
} placement={"right"}>
{state?.session.usedSp.Fabula ?? 0}
Points Spent
Ultima Points spent {state?.session.usedSp.Ultima ?? 0}
The party earns 1 EXP for each Ultima Point spent during the session.
} placement={"left"}>
{state?.session.usedSp.Ultima ?? 0}

Allies

{state && state.characters.filter((character) => character.side === CharacterSide.Ally).map((character) => )}

Enemies

{state && state.characters.filter((character) => character.side === CharacterSide.Enemy).map((character) => )}
; } export default App;