@rpg-engine/long-bow 0.1.26 → 0.1.27

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,11 +1,13 @@
1
1
  import React from 'react';
2
+ interface IListMenuOption {
3
+ id: string;
4
+ text: string;
5
+ }
2
6
  export interface IListMenuProps {
3
7
  x: number;
4
8
  y: number;
5
- options: [{
6
- id: string;
7
- text: string;
8
- }];
9
+ options: IListMenuOption[];
9
10
  onSelected: (selectedOptionId: string) => void;
10
11
  }
11
12
  export declare const ListMenu: React.FC<IListMenuProps>;
13
+ export {};
@@ -1 +1 @@
1
- {"version":3,"file":"long-bow.cjs.development.js","sources":["../src/RPGUI/RPGUIRoot.tsx","../src/components/ListMenu.tsx","../src/hooks/useEventListener.ts","../src/RPGUI/RPGUIContainer.tsx","../src/NPCDialog/img/npcDialog/npcThumbnails/alice.png","../src/NPCDialog/img/space.gif","../src/libs/StringHelpers.ts","../src/typography/DynamicText.tsx","../src/NPCDialog/NPCDialogText.tsx","../src/NPCDialog/QuestionDialog/QuestionDialog.tsx","../src/NPCDialog/NPCDialog.tsx","../src/RPGUI/RPGUISlider.tsx"],"sourcesContent":["import React from 'react';\nimport 'rpgui/rpgui.min.css';\nimport 'rpgui/rpgui.min.js';\n\ninterface IProps {\n children: React.ReactNode;\n}\n\n//@ts-ignore\nexport const _RPGUI = RPGUI;\n\nexport const RPGUIRoot: React.FC<IProps> = ({ children }) => {\n return <div className=\"rpgui-content\">{children}</div>;\n};\n","import React from 'react';\nimport styled from 'styled-components';\nimport { RPGUIRoot } from '../RPGUI/RPGUIRoot';\n\nexport interface IListMenuProps {\n x: number;\n y: number;\n options: [\n {\n id: string;\n text: string;\n }\n ];\n onSelected: (selectedOptionId: string) => void;\n}\n\nexport const ListMenu: React.FC<IListMenuProps> = ({\n options,\n onSelected,\n x,\n y,\n}) => {\n return (\n <RPGUIRoot>\n <Container x={x} y={y}>\n <ul className=\"rpgui-list-imp\" style={{ overflow: 'hidden' }}>\n {options.map((params) => (\n <li\n key={params.text}\n onClick={() => {\n onSelected(params.id);\n }}\n >\n {params.text}\n </li>\n ))}\n </ul>\n </Container>\n </RPGUIRoot>\n );\n};\n\ninterface IContainerProps {\n x?: number;\n y?: number;\n}\n\nconst Container = styled.div<IContainerProps>`\n display: flex;\n flex-direction: column;\n width: 100%;\n justify-content: start;\n align-items: flex-start;\n position: absolute;\n top: ${(props) => props.y || 0}px;\n left: ${(props) => props.x || 0}px;\n`;\n","import React from 'react';\n\n//@ts-ignore\nexport const useEventListener = (type, handler, el = window) => {\n const savedHandler = React.useRef();\n\n React.useEffect(() => {\n savedHandler.current = handler;\n }, [handler]);\n\n React.useEffect(() => {\n //@ts-ignore\n const listener = (e) => savedHandler.current(e);\n\n el.addEventListener(type, listener);\n\n return () => {\n el.removeEventListener(type, listener);\n };\n }, [type, el]);\n};\n","import React from 'react';\nimport styled from 'styled-components';\n\ninterface IProps {\n type: 'framed' | 'framed-golden' | 'framed-golden-2' | 'framed-grey';\n children: React.ReactNode;\n width?: string;\n height?: string;\n}\n\nexport const RPGUIContainer: React.FC<IProps> = ({\n children,\n type,\n width = '50%',\n height,\n}) => {\n return (\n <Container\n width={width}\n height={height || 'auto'}\n className={`rpgui-container ${type}`}\n >\n {children}\n </Container>\n );\n};\n\ninterface IContainerProps {\n width: string;\n height: string;\n}\n\nconst Container = styled.div<IContainerProps>`\n height: ${(props) => props.height};\n width: ${({ width }) => width};\n display: flex;\n flex-wrap: wrap;\n`;\n","const img = require('./alice.png'); export default img;","const img = require('./space.gif'); export default img;","export const chunkString = (str: string, length: number) => {\n return str.match(new RegExp('.{1,' + length + '}', 'g'));\n};\n","import React, { useEffect, useState } from 'react';\nimport styled from 'styled-components';\n\ninterface IProps {\n text: string;\n onFinish?: () => void;\n onStart?: () => void;\n}\n\nexport const DynamicText: React.FC<IProps> = ({ text, onFinish, onStart }) => {\n const [textState, setTextState] = useState<string>('');\n\n useEffect(() => {\n let i = 0;\n const interval = setInterval(() => {\n // on every interval, show one more character\n\n if (i === 0) {\n if (onStart) {\n onStart();\n }\n }\n\n if (i < text.length) {\n setTextState(text.substring(0, i + 1));\n i++;\n } else {\n clearInterval(interval);\n if (onFinish) {\n onFinish();\n }\n }\n }, 50);\n\n return () => {\n clearInterval(interval);\n };\n }, [text]);\n\n return <TextContainer>{textState}</TextContainer>;\n};\n\nconst TextContainer = styled.p`\n font-size: 0.7rem !important;\n color: white;\n text-shadow: 1px 1px 0px #000000;\n letter-spacing: 1.2px;\n word-break: normal;\n`;\n","import React, { useEffect, useState } from 'react';\nimport styled from 'styled-components';\nimport { chunkString } from '../libs/StringHelpers';\nimport { DynamicText } from '../typography/DynamicText';\n\ninterface IProps {\n text: string;\n onClose: () => void;\n onEndStep: () => void;\n onStartStep: () => void;\n}\n\nexport const NPCDialogText: React.FC<IProps> = ({\n text,\n onClose,\n onEndStep,\n onStartStep,\n}) => {\n const textChunks = chunkString(text, 85);\n\n const [chunkIndex, setChunkIndex] = useState<number>(0);\n\n const onHandleSpacePress = (event: KeyboardEvent) => {\n if (event.code === 'Space') {\n const hasNextChunk = textChunks?.[chunkIndex + 1] || false;\n\n if (hasNextChunk) {\n setChunkIndex((prev) => prev + 1);\n } else {\n // if there's no more text chunks, close the dialog\n onClose();\n }\n }\n };\n\n useEffect(() => {\n document.addEventListener('keydown', onHandleSpacePress);\n\n return () => document.removeEventListener('keydown', onHandleSpacePress);\n }, [chunkIndex]);\n\n return (\n <Container>\n <DynamicText\n text={textChunks?.[chunkIndex] || ''}\n onFinish={onEndStep}\n onStart={onStartStep}\n />\n </Container>\n );\n};\n\nconst Container = styled.div``;\n","import React, { useEffect, useState } from 'react';\nimport styled from 'styled-components';\nimport { useEventListener } from '../../hooks/useEventListener';\nimport { DynamicText } from '../../typography/DynamicText';\n\nexport interface IQuestionDialogAnswer {\n id: number;\n text: string;\n nextQuestionId?: number;\n}\n\nexport interface IQuestionDialog {\n id: number;\n text: string;\n answerIds?: number[];\n}\n\nexport interface IProps {\n questions: IQuestionDialog[];\n answers: IQuestionDialogAnswer[];\n onClose: () => void;\n}\n\nexport const QuestionDialog: React.FC<IProps> = ({\n questions,\n answers,\n onClose,\n}) => {\n const [currentQuestion, setCurrentQuestion] = useState(questions[0]);\n\n const [canShowAnswers, setCanShowAnswers] = useState<boolean>(false);\n\n const onGetFirstAnswer = () => {\n if (!currentQuestion.answerIds || currentQuestion.answerIds.length === 0) {\n return null;\n }\n\n const firstAnswerId = currentQuestion.answerIds![0];\n\n return answers.find((answer) => answer.id === firstAnswerId);\n };\n\n const [currentAnswer, setCurrentAnswer] =\n useState<IQuestionDialogAnswer | null>(onGetFirstAnswer()!);\n\n useEffect(() => {\n setCurrentAnswer(onGetFirstAnswer()!);\n }, [currentQuestion]);\n\n const onGetAnswers = (answerIds: number[]) => {\n return answerIds.map((answerId: number) =>\n answers.find((answer) => answer.id === answerId)\n );\n };\n\n const onKeyPress = (e: KeyboardEvent) => {\n switch (e.key) {\n case 'ArrowDown':\n // select next answer, if any.\n // if no next answer, select first answer\n // const nextAnswer = onGetAnswers(currentQuestion.answerIds!).find(\n // (answer) => answer?.id === currentAnswer!.id + 1\n // );\n\n const nextAnswerIndex = onGetAnswers(\n currentQuestion.answerIds!\n ).findIndex((answer) => answer?.id === currentAnswer!.id + 1);\n\n const nextAnswerID = currentQuestion.answerIds![nextAnswerIndex];\n\n // console.log(nextAnswerIndex);\n\n const nextAnswer = onGetAnswers(currentQuestion.answerIds!).find(\n (answer) => answer?.id === nextAnswerID\n );\n\n setCurrentAnswer(nextAnswer || onGetFirstAnswer()!);\n\n break;\n case 'ArrowUp':\n // select previous answer, if any.\n // if no previous answer, select last answer\n\n const previousAnswerIndex = onGetAnswers(\n currentQuestion.answerIds!\n ).findIndex((answer) => answer?.id === currentAnswer!.id - 1);\n\n const previousAnswerID =\n currentQuestion.answerIds &&\n currentQuestion.answerIds[previousAnswerIndex];\n\n const previousAnswer = onGetAnswers(currentQuestion.answerIds!).find(\n (answer) => answer?.id === previousAnswerID\n );\n\n if (previousAnswer) {\n setCurrentAnswer(previousAnswer);\n } else {\n setCurrentAnswer(onGetAnswers(currentQuestion.answerIds!).pop()!);\n }\n\n break;\n case 'Enter':\n setCanShowAnswers(false);\n\n if (!currentAnswer?.nextQuestionId) {\n onClose();\n return;\n } else {\n setCurrentQuestion(\n questions.find(\n (question) => question.id === currentAnswer!.nextQuestionId\n )!\n );\n }\n\n break;\n }\n };\n useEventListener('keydown', onKeyPress);\n\n const onAnswerClick = (answer: IQuestionDialogAnswer) => {\n setCanShowAnswers(false);\n if (answer.nextQuestionId) {\n // if there is a next question, go to it\n setCurrentQuestion(\n questions.find((question) => question.id === answer.nextQuestionId)!\n );\n } else {\n // else, finish dialog!\n onClose();\n }\n };\n\n const onRenderCurrentAnswers = () => {\n const answerIds = currentQuestion.answerIds;\n if (!answerIds) {\n return null;\n }\n\n const answers = onGetAnswers(answerIds);\n\n if (!answers) {\n return null;\n }\n\n return answers.map((answer) => {\n const isSelected = currentAnswer?.id === answer?.id;\n const selectedColor = isSelected ? 'yellow' : 'white';\n\n if (answer) {\n return (\n <AnswerRow key={`answer_${answer.id}`}>\n <AnswerSelectedIcon color={selectedColor}>\n {isSelected ? 'X' : null}\n </AnswerSelectedIcon>\n\n <Answer\n key={answer.id}\n onClick={() => onAnswerClick(answer)}\n color={selectedColor}\n >\n {answer.text}\n </Answer>\n </AnswerRow>\n );\n }\n\n return null;\n });\n };\n\n return (\n <Container>\n <QuestionContainer>\n <DynamicText\n text={currentQuestion.text}\n onStart={() => setCanShowAnswers(false)}\n onFinish={() => setCanShowAnswers(true)}\n />\n </QuestionContainer>\n\n {canShowAnswers && (\n <AnswersContainer>{onRenderCurrentAnswers()}</AnswersContainer>\n )}\n </Container>\n );\n};\n\nconst Container = styled.div`\n display: flex;\n\n word-break: break-all;\n\n box-sizing: border-box;\n justify-content: flex-start;\n align-items: flex-start;\n flex-wrap: wrap;\n`;\n\nconst QuestionContainer = styled.div`\n flex: 100%;\n width: 100%;\n`;\n\nconst AnswersContainer = styled.div`\n flex: 100%;\n`;\n\ninterface IAnswerProps {\n color: string;\n}\n\nconst Answer = styled.p<IAnswerProps>`\n flex: auto;\n color: ${(props) => props.color} !important;\n font-size: 0.65rem !important;\n background: inherit;\n border: none;\n`;\n\nconst AnswerSelectedIcon = styled.span<IAnswerProps>`\n flex: 5% 0 0;\n color: ${(props) => props.color} !important;\n`;\n\nconst AnswerRow = styled.div`\n display: flex;\n flex-wrap: wrap;\n justify-content: center;\n align-items: center;\n margin-bottom: 0.5rem;\n height: 22px;\n\n p {\n line-height: unset;\n margin-top: 0;\n margin-bottom: 0rem;\n }\n`;\n","import React, { useState } from 'react';\nimport styled from 'styled-components';\nimport { IQuestionDialog, IQuestionDialogAnswer } from '..';\nimport { RPGUIContainer } from '../RPGUI/RPGUIContainer';\nimport { RPGUIRoot } from '../RPGUI/RPGUIRoot';\nimport aliceDefaultThumbnail from './img/npcDialog/npcThumbnails/alice.png';\nimport pressSpaceGif from './img/space.gif';\nimport { NPCDialogText } from './NPCDialogText';\nimport { QuestionDialog } from './QuestionDialog/QuestionDialog';\nexport enum NPCDialogType {\n TextOnly = 'TextOnly',\n TextAndThumbnail = 'TextAndThumbnail',\n}\n\nexport interface INPCDialogProps {\n text?: string;\n type: NPCDialogType;\n imagePath?: string;\n onClose?: () => void;\n isQuestionDialog: boolean;\n answers?: IQuestionDialogAnswer[];\n questions?: IQuestionDialog[];\n}\n\nexport const NPCDialog: React.FC<INPCDialogProps> = ({\n text,\n type,\n onClose,\n imagePath,\n isQuestionDialog = false,\n questions,\n answers,\n}) => {\n const [showGoNextIndicator, setShowGoNextIndicator] =\n useState<boolean>(false);\n\n return (\n <RPGUIRoot>\n <RPGUIContainer\n type=\"framed-golden\"\n width={isQuestionDialog ? '600px' : '50%'}\n height={'180px'}\n >\n {isQuestionDialog && questions && answers ? (\n <>\n <TextContainer\n flex={type === NPCDialogType.TextAndThumbnail ? '70%' : '100%'}\n >\n <QuestionDialog\n questions={questions}\n answers={answers}\n onClose={() => {\n if (onClose) {\n onClose();\n }\n }}\n />\n </TextContainer>\n {type === NPCDialogType.TextAndThumbnail && (\n <ThumbnailContainer>\n <NPCThumbnail src={imagePath || aliceDefaultThumbnail} />\n </ThumbnailContainer>\n )}\n </>\n ) : (\n <>\n <Container>\n <TextContainer\n flex={type === NPCDialogType.TextAndThumbnail ? '70%' : '100%'}\n >\n <NPCDialogText\n onStartStep={() => setShowGoNextIndicator(false)}\n onEndStep={() => setShowGoNextIndicator(true)}\n text={text || 'No text provided.'}\n onClose={() => {\n if (onClose) {\n onClose();\n }\n }}\n />\n </TextContainer>\n {type === NPCDialogType.TextAndThumbnail && (\n <ThumbnailContainer>\n <NPCThumbnail src={imagePath || aliceDefaultThumbnail} />\n </ThumbnailContainer>\n )}\n </Container>\n {showGoNextIndicator && (\n <PressSpaceIndicator\n right={type === NPCDialogType.TextOnly ? '1rem' : '10.5rem'}\n src={pressSpaceGif}\n />\n )}\n </>\n )}\n </RPGUIContainer>\n </RPGUIRoot>\n );\n};\n\nconst Container = styled.div`\n display: flex;\n width: 100%;\n height: 100%;\n\n box-sizing: border-box;\n justify-content: center;\n align-items: flex-start;\n position: relative;\n`;\n\ninterface ITextContainerProps {\n flex: string;\n}\n\nconst TextContainer = styled.div<ITextContainerProps>`\n flex: ${({ flex }) => flex} 0 0;\n width: 355px;\n`;\n\nconst ThumbnailContainer = styled.div`\n flex: 30% 0 0;\n display: flex;\n justify-content: flex-end;\n`;\n\nconst NPCThumbnail = styled.img`\n image-rendering: pixelated;\n height: 128px;\n width: 128px;\n`;\n\ninterface IPressSpaceIndicatorProps {\n right: string;\n}\n\nconst PressSpaceIndicator = styled.img<IPressSpaceIndicatorProps>`\n position: absolute;\n right: ${({ right }) => right};\n bottom: 1rem;\n height: 20.7px;\n image-rendering: -webkit-optimize-contrast;\n`;\n","import React, { useState } from 'react';\nimport styled from 'styled-components';\nimport { v4 as uuidv4 } from 'uuid';\nimport { useEventListener } from '../hooks/useEventListener';\nimport { RPGUIRoot, _RPGUI } from './RPGUIRoot';\n\nexport enum SliderType {\n Slider = 'rpgui-slider',\n GoldSlider = 'rpgui-slider golden',\n}\n\nexport interface ISliderProps {\n type: SliderType;\n valueMin: number;\n valueMax: number;\n width: string;\n\n onChange: (value: number) => void;\n}\n\nexport const RPGUISlider: React.FC<ISliderProps> = ({\n type,\n valueMin,\n valueMax,\n width,\n onChange,\n}) => {\n const sliderId = uuidv4();\n\n const [wasMouseDownFirst, setWasMouseDownFirst] = useState<boolean>(false);\n\n useEventListener('mouseup', () => {\n if (wasMouseDownFirst) {\n onHandleMouseUp();\n }\n setWasMouseDownFirst(false);\n });\n\n const onHandleMouseUp = () => {\n const rpguiSlider = document.getElementById(`rpgui-slider-${sliderId}`);\n const value = _RPGUI.get_value(rpguiSlider);\n\n onChange(Number(value));\n };\n\n return (\n <RPGUIRoot>\n <div\n onMouseUp={onHandleMouseUp}\n onMouseDown={() => setWasMouseDownFirst(true)}\n >\n <Input\n className={\n type === SliderType.Slider\n ? SliderType.Slider\n : SliderType.GoldSlider\n }\n type=\"range\"\n style={{ width: width }}\n min={valueMin}\n max={valueMax}\n id={`rpgui-slider-${sliderId}`}\n />\n </div>\n </RPGUIRoot>\n );\n};\n\nconst Input = styled.input`\n opacity: 0;\n`;\n"],"names":["_RPGUI","RPGUI","RPGUIRoot","children","React","className","ListMenu","options","onSelected","x","y","Container","style","overflow","map","params","key","text","onClick","id","styled","div","props","useEventListener","type","handler","el","window","savedHandler","useRef","useEffect","current","listener","e","addEventListener","removeEventListener","RPGUIContainer","width","height","img","chunkString","str","length","match","RegExp","DynamicText","onFinish","onStart","useState","textState","setTextState","i","interval","setInterval","substring","clearInterval","TextContainer","p","NPCDialogText","onClose","onEndStep","onStartStep","textChunks","chunkIndex","setChunkIndex","onHandleSpacePress","event","code","hasNextChunk","prev","document","QuestionDialog","questions","answers","currentQuestion","setCurrentQuestion","canShowAnswers","setCanShowAnswers","onGetFirstAnswer","answerIds","firstAnswerId","find","answer","currentAnswer","setCurrentAnswer","onGetAnswers","answerId","onKeyPress","nextAnswerIndex","findIndex","nextAnswerID","nextAnswer","previousAnswerIndex","previousAnswerID","previousAnswer","pop","nextQuestionId","question","onAnswerClick","onRenderCurrentAnswers","isSelected","selectedColor","AnswerRow","AnswerSelectedIcon","color","Answer","QuestionContainer","AnswersContainer","span","NPCDialogType","NPCDialog","imagePath","isQuestionDialog","showGoNextIndicator","setShowGoNextIndicator","flex","TextAndThumbnail","ThumbnailContainer","NPCThumbnail","src","aliceDefaultThumbnail","PressSpaceIndicator","right","TextOnly","pressSpaceGif","SliderType","RPGUISlider","valueMin","valueMax","onChange","sliderId","uuidv4","wasMouseDownFirst","setWasMouseDownFirst","onHandleMouseUp","rpguiSlider","getElementById","value","get_value","Number","onMouseUp","onMouseDown","Input","Slider","GoldSlider","min","max","input"],"mappings":"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"}
1
+ {"version":3,"file":"long-bow.cjs.development.js","sources":["../src/RPGUI/RPGUIRoot.tsx","../src/components/ListMenu.tsx","../src/hooks/useEventListener.ts","../src/RPGUI/RPGUIContainer.tsx","../src/NPCDialog/img/npcDialog/npcThumbnails/alice.png","../src/NPCDialog/img/space.gif","../src/libs/StringHelpers.ts","../src/typography/DynamicText.tsx","../src/NPCDialog/NPCDialogText.tsx","../src/NPCDialog/QuestionDialog/QuestionDialog.tsx","../src/NPCDialog/NPCDialog.tsx","../src/RPGUI/RPGUISlider.tsx"],"sourcesContent":["import React from 'react';\nimport 'rpgui/rpgui.min.css';\nimport 'rpgui/rpgui.min.js';\n\ninterface IProps {\n children: React.ReactNode;\n}\n\n//@ts-ignore\nexport const _RPGUI = RPGUI;\n\nexport const RPGUIRoot: React.FC<IProps> = ({ children }) => {\n return <div className=\"rpgui-content\">{children}</div>;\n};\n","import React from 'react';\nimport styled from 'styled-components';\nimport { RPGUIRoot } from '../RPGUI/RPGUIRoot';\n\ninterface IListMenuOption {\n id: string;\n text: string;\n}\n\nexport interface IListMenuProps {\n x: number;\n y: number;\n options: IListMenuOption[];\n onSelected: (selectedOptionId: string) => void;\n}\n\nexport const ListMenu: React.FC<IListMenuProps> = ({\n options,\n onSelected,\n x,\n y,\n}) => {\n return (\n <RPGUIRoot>\n <Container x={x} y={y}>\n <ul className=\"rpgui-list-imp\" style={{ overflow: 'hidden' }}>\n {options.map((params) => (\n <li\n key={params.text}\n onClick={() => {\n onSelected(params.id);\n }}\n >\n {params.text}\n </li>\n ))}\n </ul>\n </Container>\n </RPGUIRoot>\n );\n};\n\ninterface IContainerProps {\n x?: number;\n y?: number;\n}\n\nconst Container = styled.div<IContainerProps>`\n display: flex;\n flex-direction: column;\n width: 100%;\n justify-content: start;\n align-items: flex-start;\n position: absolute;\n top: ${(props) => props.y || 0}px;\n left: ${(props) => props.x || 0}px;\n`;\n","import React from 'react';\n\n//@ts-ignore\nexport const useEventListener = (type, handler, el = window) => {\n const savedHandler = React.useRef();\n\n React.useEffect(() => {\n savedHandler.current = handler;\n }, [handler]);\n\n React.useEffect(() => {\n //@ts-ignore\n const listener = (e) => savedHandler.current(e);\n\n el.addEventListener(type, listener);\n\n return () => {\n el.removeEventListener(type, listener);\n };\n }, [type, el]);\n};\n","import React from 'react';\nimport styled from 'styled-components';\n\ninterface IProps {\n type: 'framed' | 'framed-golden' | 'framed-golden-2' | 'framed-grey';\n children: React.ReactNode;\n width?: string;\n height?: string;\n}\n\nexport const RPGUIContainer: React.FC<IProps> = ({\n children,\n type,\n width = '50%',\n height,\n}) => {\n return (\n <Container\n width={width}\n height={height || 'auto'}\n className={`rpgui-container ${type}`}\n >\n {children}\n </Container>\n );\n};\n\ninterface IContainerProps {\n width: string;\n height: string;\n}\n\nconst Container = styled.div<IContainerProps>`\n height: ${(props) => props.height};\n width: ${({ width }) => width};\n display: flex;\n flex-wrap: wrap;\n`;\n","const img = require('./alice.png'); export default img;","const img = require('./space.gif'); export default img;","export const chunkString = (str: string, length: number) => {\n return str.match(new RegExp('.{1,' + length + '}', 'g'));\n};\n","import React, { useEffect, useState } from 'react';\nimport styled from 'styled-components';\n\ninterface IProps {\n text: string;\n onFinish?: () => void;\n onStart?: () => void;\n}\n\nexport const DynamicText: React.FC<IProps> = ({ text, onFinish, onStart }) => {\n const [textState, setTextState] = useState<string>('');\n\n useEffect(() => {\n let i = 0;\n const interval = setInterval(() => {\n // on every interval, show one more character\n\n if (i === 0) {\n if (onStart) {\n onStart();\n }\n }\n\n if (i < text.length) {\n setTextState(text.substring(0, i + 1));\n i++;\n } else {\n clearInterval(interval);\n if (onFinish) {\n onFinish();\n }\n }\n }, 50);\n\n return () => {\n clearInterval(interval);\n };\n }, [text]);\n\n return <TextContainer>{textState}</TextContainer>;\n};\n\nconst TextContainer = styled.p`\n font-size: 0.7rem !important;\n color: white;\n text-shadow: 1px 1px 0px #000000;\n letter-spacing: 1.2px;\n word-break: normal;\n`;\n","import React, { useEffect, useState } from 'react';\nimport styled from 'styled-components';\nimport { chunkString } from '../libs/StringHelpers';\nimport { DynamicText } from '../typography/DynamicText';\n\ninterface IProps {\n text: string;\n onClose: () => void;\n onEndStep: () => void;\n onStartStep: () => void;\n}\n\nexport const NPCDialogText: React.FC<IProps> = ({\n text,\n onClose,\n onEndStep,\n onStartStep,\n}) => {\n const textChunks = chunkString(text, 85);\n\n const [chunkIndex, setChunkIndex] = useState<number>(0);\n\n const onHandleSpacePress = (event: KeyboardEvent) => {\n if (event.code === 'Space') {\n const hasNextChunk = textChunks?.[chunkIndex + 1] || false;\n\n if (hasNextChunk) {\n setChunkIndex((prev) => prev + 1);\n } else {\n // if there's no more text chunks, close the dialog\n onClose();\n }\n }\n };\n\n useEffect(() => {\n document.addEventListener('keydown', onHandleSpacePress);\n\n return () => document.removeEventListener('keydown', onHandleSpacePress);\n }, [chunkIndex]);\n\n return (\n <Container>\n <DynamicText\n text={textChunks?.[chunkIndex] || ''}\n onFinish={onEndStep}\n onStart={onStartStep}\n />\n </Container>\n );\n};\n\nconst Container = styled.div``;\n","import React, { useEffect, useState } from 'react';\nimport styled from 'styled-components';\nimport { useEventListener } from '../../hooks/useEventListener';\nimport { DynamicText } from '../../typography/DynamicText';\n\nexport interface IQuestionDialogAnswer {\n id: number;\n text: string;\n nextQuestionId?: number;\n}\n\nexport interface IQuestionDialog {\n id: number;\n text: string;\n answerIds?: number[];\n}\n\nexport interface IProps {\n questions: IQuestionDialog[];\n answers: IQuestionDialogAnswer[];\n onClose: () => void;\n}\n\nexport const QuestionDialog: React.FC<IProps> = ({\n questions,\n answers,\n onClose,\n}) => {\n const [currentQuestion, setCurrentQuestion] = useState(questions[0]);\n\n const [canShowAnswers, setCanShowAnswers] = useState<boolean>(false);\n\n const onGetFirstAnswer = () => {\n if (!currentQuestion.answerIds || currentQuestion.answerIds.length === 0) {\n return null;\n }\n\n const firstAnswerId = currentQuestion.answerIds![0];\n\n return answers.find((answer) => answer.id === firstAnswerId);\n };\n\n const [currentAnswer, setCurrentAnswer] =\n useState<IQuestionDialogAnswer | null>(onGetFirstAnswer()!);\n\n useEffect(() => {\n setCurrentAnswer(onGetFirstAnswer()!);\n }, [currentQuestion]);\n\n const onGetAnswers = (answerIds: number[]) => {\n return answerIds.map((answerId: number) =>\n answers.find((answer) => answer.id === answerId)\n );\n };\n\n const onKeyPress = (e: KeyboardEvent) => {\n switch (e.key) {\n case 'ArrowDown':\n // select next answer, if any.\n // if no next answer, select first answer\n // const nextAnswer = onGetAnswers(currentQuestion.answerIds!).find(\n // (answer) => answer?.id === currentAnswer!.id + 1\n // );\n\n const nextAnswerIndex = onGetAnswers(\n currentQuestion.answerIds!\n ).findIndex((answer) => answer?.id === currentAnswer!.id + 1);\n\n const nextAnswerID = currentQuestion.answerIds![nextAnswerIndex];\n\n // console.log(nextAnswerIndex);\n\n const nextAnswer = onGetAnswers(currentQuestion.answerIds!).find(\n (answer) => answer?.id === nextAnswerID\n );\n\n setCurrentAnswer(nextAnswer || onGetFirstAnswer()!);\n\n break;\n case 'ArrowUp':\n // select previous answer, if any.\n // if no previous answer, select last answer\n\n const previousAnswerIndex = onGetAnswers(\n currentQuestion.answerIds!\n ).findIndex((answer) => answer?.id === currentAnswer!.id - 1);\n\n const previousAnswerID =\n currentQuestion.answerIds &&\n currentQuestion.answerIds[previousAnswerIndex];\n\n const previousAnswer = onGetAnswers(currentQuestion.answerIds!).find(\n (answer) => answer?.id === previousAnswerID\n );\n\n if (previousAnswer) {\n setCurrentAnswer(previousAnswer);\n } else {\n setCurrentAnswer(onGetAnswers(currentQuestion.answerIds!).pop()!);\n }\n\n break;\n case 'Enter':\n setCanShowAnswers(false);\n\n if (!currentAnswer?.nextQuestionId) {\n onClose();\n return;\n } else {\n setCurrentQuestion(\n questions.find(\n (question) => question.id === currentAnswer!.nextQuestionId\n )!\n );\n }\n\n break;\n }\n };\n useEventListener('keydown', onKeyPress);\n\n const onAnswerClick = (answer: IQuestionDialogAnswer) => {\n setCanShowAnswers(false);\n if (answer.nextQuestionId) {\n // if there is a next question, go to it\n setCurrentQuestion(\n questions.find((question) => question.id === answer.nextQuestionId)!\n );\n } else {\n // else, finish dialog!\n onClose();\n }\n };\n\n const onRenderCurrentAnswers = () => {\n const answerIds = currentQuestion.answerIds;\n if (!answerIds) {\n return null;\n }\n\n const answers = onGetAnswers(answerIds);\n\n if (!answers) {\n return null;\n }\n\n return answers.map((answer) => {\n const isSelected = currentAnswer?.id === answer?.id;\n const selectedColor = isSelected ? 'yellow' : 'white';\n\n if (answer) {\n return (\n <AnswerRow key={`answer_${answer.id}`}>\n <AnswerSelectedIcon color={selectedColor}>\n {isSelected ? 'X' : null}\n </AnswerSelectedIcon>\n\n <Answer\n key={answer.id}\n onClick={() => onAnswerClick(answer)}\n color={selectedColor}\n >\n {answer.text}\n </Answer>\n </AnswerRow>\n );\n }\n\n return null;\n });\n };\n\n return (\n <Container>\n <QuestionContainer>\n <DynamicText\n text={currentQuestion.text}\n onStart={() => setCanShowAnswers(false)}\n onFinish={() => setCanShowAnswers(true)}\n />\n </QuestionContainer>\n\n {canShowAnswers && (\n <AnswersContainer>{onRenderCurrentAnswers()}</AnswersContainer>\n )}\n </Container>\n );\n};\n\nconst Container = styled.div`\n display: flex;\n\n word-break: break-all;\n\n box-sizing: border-box;\n justify-content: flex-start;\n align-items: flex-start;\n flex-wrap: wrap;\n`;\n\nconst QuestionContainer = styled.div`\n flex: 100%;\n width: 100%;\n`;\n\nconst AnswersContainer = styled.div`\n flex: 100%;\n`;\n\ninterface IAnswerProps {\n color: string;\n}\n\nconst Answer = styled.p<IAnswerProps>`\n flex: auto;\n color: ${(props) => props.color} !important;\n font-size: 0.65rem !important;\n background: inherit;\n border: none;\n`;\n\nconst AnswerSelectedIcon = styled.span<IAnswerProps>`\n flex: 5% 0 0;\n color: ${(props) => props.color} !important;\n`;\n\nconst AnswerRow = styled.div`\n display: flex;\n flex-wrap: wrap;\n justify-content: center;\n align-items: center;\n margin-bottom: 0.5rem;\n height: 22px;\n\n p {\n line-height: unset;\n margin-top: 0;\n margin-bottom: 0rem;\n }\n`;\n","import React, { useState } from 'react';\nimport styled from 'styled-components';\nimport { IQuestionDialog, IQuestionDialogAnswer } from '..';\nimport { RPGUIContainer } from '../RPGUI/RPGUIContainer';\nimport { RPGUIRoot } from '../RPGUI/RPGUIRoot';\nimport aliceDefaultThumbnail from './img/npcDialog/npcThumbnails/alice.png';\nimport pressSpaceGif from './img/space.gif';\nimport { NPCDialogText } from './NPCDialogText';\nimport { QuestionDialog } from './QuestionDialog/QuestionDialog';\nexport enum NPCDialogType {\n TextOnly = 'TextOnly',\n TextAndThumbnail = 'TextAndThumbnail',\n}\n\nexport interface INPCDialogProps {\n text?: string;\n type: NPCDialogType;\n imagePath?: string;\n onClose?: () => void;\n isQuestionDialog: boolean;\n answers?: IQuestionDialogAnswer[];\n questions?: IQuestionDialog[];\n}\n\nexport const NPCDialog: React.FC<INPCDialogProps> = ({\n text,\n type,\n onClose,\n imagePath,\n isQuestionDialog = false,\n questions,\n answers,\n}) => {\n const [showGoNextIndicator, setShowGoNextIndicator] =\n useState<boolean>(false);\n\n return (\n <RPGUIRoot>\n <RPGUIContainer\n type=\"framed-golden\"\n width={isQuestionDialog ? '600px' : '50%'}\n height={'180px'}\n >\n {isQuestionDialog && questions && answers ? (\n <>\n <TextContainer\n flex={type === NPCDialogType.TextAndThumbnail ? '70%' : '100%'}\n >\n <QuestionDialog\n questions={questions}\n answers={answers}\n onClose={() => {\n if (onClose) {\n onClose();\n }\n }}\n />\n </TextContainer>\n {type === NPCDialogType.TextAndThumbnail && (\n <ThumbnailContainer>\n <NPCThumbnail src={imagePath || aliceDefaultThumbnail} />\n </ThumbnailContainer>\n )}\n </>\n ) : (\n <>\n <Container>\n <TextContainer\n flex={type === NPCDialogType.TextAndThumbnail ? '70%' : '100%'}\n >\n <NPCDialogText\n onStartStep={() => setShowGoNextIndicator(false)}\n onEndStep={() => setShowGoNextIndicator(true)}\n text={text || 'No text provided.'}\n onClose={() => {\n if (onClose) {\n onClose();\n }\n }}\n />\n </TextContainer>\n {type === NPCDialogType.TextAndThumbnail && (\n <ThumbnailContainer>\n <NPCThumbnail src={imagePath || aliceDefaultThumbnail} />\n </ThumbnailContainer>\n )}\n </Container>\n {showGoNextIndicator && (\n <PressSpaceIndicator\n right={type === NPCDialogType.TextOnly ? '1rem' : '10.5rem'}\n src={pressSpaceGif}\n />\n )}\n </>\n )}\n </RPGUIContainer>\n </RPGUIRoot>\n );\n};\n\nconst Container = styled.div`\n display: flex;\n width: 100%;\n height: 100%;\n\n box-sizing: border-box;\n justify-content: center;\n align-items: flex-start;\n position: relative;\n`;\n\ninterface ITextContainerProps {\n flex: string;\n}\n\nconst TextContainer = styled.div<ITextContainerProps>`\n flex: ${({ flex }) => flex} 0 0;\n width: 355px;\n`;\n\nconst ThumbnailContainer = styled.div`\n flex: 30% 0 0;\n display: flex;\n justify-content: flex-end;\n`;\n\nconst NPCThumbnail = styled.img`\n image-rendering: pixelated;\n height: 128px;\n width: 128px;\n`;\n\ninterface IPressSpaceIndicatorProps {\n right: string;\n}\n\nconst PressSpaceIndicator = styled.img<IPressSpaceIndicatorProps>`\n position: absolute;\n right: ${({ right }) => right};\n bottom: 1rem;\n height: 20.7px;\n image-rendering: -webkit-optimize-contrast;\n`;\n","import React, { useState } from 'react';\nimport styled from 'styled-components';\nimport { v4 as uuidv4 } from 'uuid';\nimport { useEventListener } from '../hooks/useEventListener';\nimport { RPGUIRoot, _RPGUI } from './RPGUIRoot';\n\nexport enum SliderType {\n Slider = 'rpgui-slider',\n GoldSlider = 'rpgui-slider golden',\n}\n\nexport interface ISliderProps {\n type: SliderType;\n valueMin: number;\n valueMax: number;\n width: string;\n\n onChange: (value: number) => void;\n}\n\nexport const RPGUISlider: React.FC<ISliderProps> = ({\n type,\n valueMin,\n valueMax,\n width,\n onChange,\n}) => {\n const sliderId = uuidv4();\n\n const [wasMouseDownFirst, setWasMouseDownFirst] = useState<boolean>(false);\n\n useEventListener('mouseup', () => {\n if (wasMouseDownFirst) {\n onHandleMouseUp();\n }\n setWasMouseDownFirst(false);\n });\n\n const onHandleMouseUp = () => {\n const rpguiSlider = document.getElementById(`rpgui-slider-${sliderId}`);\n const value = _RPGUI.get_value(rpguiSlider);\n\n onChange(Number(value));\n };\n\n return (\n <RPGUIRoot>\n <div\n onMouseUp={onHandleMouseUp}\n onMouseDown={() => setWasMouseDownFirst(true)}\n >\n <Input\n className={\n type === SliderType.Slider\n ? SliderType.Slider\n : SliderType.GoldSlider\n }\n type=\"range\"\n style={{ width: width }}\n min={valueMin}\n max={valueMax}\n id={`rpgui-slider-${sliderId}`}\n />\n </div>\n </RPGUIRoot>\n );\n};\n\nconst Input = styled.input`\n opacity: 0;\n`;\n"],"names":["_RPGUI","RPGUI","RPGUIRoot","children","React","className","ListMenu","options","onSelected","x","y","Container","style","overflow","map","params","key","text","onClick","id","styled","div","props","useEventListener","type","handler","el","window","savedHandler","useRef","useEffect","current","listener","e","addEventListener","removeEventListener","RPGUIContainer","width","height","img","chunkString","str","length","match","RegExp","DynamicText","onFinish","onStart","useState","textState","setTextState","i","interval","setInterval","substring","clearInterval","TextContainer","p","NPCDialogText","onClose","onEndStep","onStartStep","textChunks","chunkIndex","setChunkIndex","onHandleSpacePress","event","code","hasNextChunk","prev","document","QuestionDialog","questions","answers","currentQuestion","setCurrentQuestion","canShowAnswers","setCanShowAnswers","onGetFirstAnswer","answerIds","firstAnswerId","find","answer","currentAnswer","setCurrentAnswer","onGetAnswers","answerId","onKeyPress","nextAnswerIndex","findIndex","nextAnswerID","nextAnswer","previousAnswerIndex","previousAnswerID","previousAnswer","pop","nextQuestionId","question","onAnswerClick","onRenderCurrentAnswers","isSelected","selectedColor","AnswerRow","AnswerSelectedIcon","color","Answer","QuestionContainer","AnswersContainer","span","NPCDialogType","NPCDialog","imagePath","isQuestionDialog","showGoNextIndicator","setShowGoNextIndicator","flex","TextAndThumbnail","ThumbnailContainer","NPCThumbnail","src","aliceDefaultThumbnail","PressSpaceIndicator","right","TextOnly","pressSpaceGif","SliderType","RPGUISlider","valueMin","valueMax","onChange","sliderId","uuidv4","wasMouseDownFirst","setWasMouseDownFirst","onHandleMouseUp","rpguiSlider","getElementById","value","get_value","Number","onMouseUp","onMouseDown","Input","Slider","GoldSlider","min","max","input"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"long-bow.cjs.production.min.js","sources":["../src/RPGUI/RPGUIRoot.tsx","../src/components/ListMenu.tsx","../src/hooks/useEventListener.ts","../src/RPGUI/RPGUIContainer.tsx","../src/NPCDialog/img/npcDialog/npcThumbnails/alice.png","../src/NPCDialog/img/space.gif","../src/libs/StringHelpers.ts","../src/NPCDialog/NPCDialog.tsx","../src/typography/DynamicText.tsx","../src/NPCDialog/NPCDialogText.tsx","../src/NPCDialog/QuestionDialog/QuestionDialog.tsx","../src/RPGUI/RPGUISlider.tsx"],"sourcesContent":["import React from 'react';\nimport 'rpgui/rpgui.min.css';\nimport 'rpgui/rpgui.min.js';\n\ninterface IProps {\n children: React.ReactNode;\n}\n\n//@ts-ignore\nexport const _RPGUI = RPGUI;\n\nexport const RPGUIRoot: React.FC<IProps> = ({ children }) => {\n return <div className=\"rpgui-content\">{children}</div>;\n};\n","import React from 'react';\nimport styled from 'styled-components';\nimport { RPGUIRoot } from '../RPGUI/RPGUIRoot';\n\nexport interface IListMenuProps {\n x: number;\n y: number;\n options: [\n {\n id: string;\n text: string;\n }\n ];\n onSelected: (selectedOptionId: string) => void;\n}\n\nexport const ListMenu: React.FC<IListMenuProps> = ({\n options,\n onSelected,\n x,\n y,\n}) => {\n return (\n <RPGUIRoot>\n <Container x={x} y={y}>\n <ul className=\"rpgui-list-imp\" style={{ overflow: 'hidden' }}>\n {options.map((params) => (\n <li\n key={params.text}\n onClick={() => {\n onSelected(params.id);\n }}\n >\n {params.text}\n </li>\n ))}\n </ul>\n </Container>\n </RPGUIRoot>\n );\n};\n\ninterface IContainerProps {\n x?: number;\n y?: number;\n}\n\nconst Container = styled.div<IContainerProps>`\n display: flex;\n flex-direction: column;\n width: 100%;\n justify-content: start;\n align-items: flex-start;\n position: absolute;\n top: ${(props) => props.y || 0}px;\n left: ${(props) => props.x || 0}px;\n`;\n","import React from 'react';\n\n//@ts-ignore\nexport const useEventListener = (type, handler, el = window) => {\n const savedHandler = React.useRef();\n\n React.useEffect(() => {\n savedHandler.current = handler;\n }, [handler]);\n\n React.useEffect(() => {\n //@ts-ignore\n const listener = (e) => savedHandler.current(e);\n\n el.addEventListener(type, listener);\n\n return () => {\n el.removeEventListener(type, listener);\n };\n }, [type, el]);\n};\n","import React from 'react';\nimport styled from 'styled-components';\n\ninterface IProps {\n type: 'framed' | 'framed-golden' | 'framed-golden-2' | 'framed-grey';\n children: React.ReactNode;\n width?: string;\n height?: string;\n}\n\nexport const RPGUIContainer: React.FC<IProps> = ({\n children,\n type,\n width = '50%',\n height,\n}) => {\n return (\n <Container\n width={width}\n height={height || 'auto'}\n className={`rpgui-container ${type}`}\n >\n {children}\n </Container>\n );\n};\n\ninterface IContainerProps {\n width: string;\n height: string;\n}\n\nconst Container = styled.div<IContainerProps>`\n height: ${(props) => props.height};\n width: ${({ width }) => width};\n display: flex;\n flex-wrap: wrap;\n`;\n","const img = require('./alice.png'); export default img;","const img = require('./space.gif'); export default img;","export const chunkString = (str: string, length: number) => {\n return str.match(new RegExp('.{1,' + length + '}', 'g'));\n};\n","import React, { useState } from 'react';\nimport styled from 'styled-components';\nimport { IQuestionDialog, IQuestionDialogAnswer } from '..';\nimport { RPGUIContainer } from '../RPGUI/RPGUIContainer';\nimport { RPGUIRoot } from '../RPGUI/RPGUIRoot';\nimport aliceDefaultThumbnail from './img/npcDialog/npcThumbnails/alice.png';\nimport pressSpaceGif from './img/space.gif';\nimport { NPCDialogText } from './NPCDialogText';\nimport { QuestionDialog } from './QuestionDialog/QuestionDialog';\nexport enum NPCDialogType {\n TextOnly = 'TextOnly',\n TextAndThumbnail = 'TextAndThumbnail',\n}\n\nexport interface INPCDialogProps {\n text?: string;\n type: NPCDialogType;\n imagePath?: string;\n onClose?: () => void;\n isQuestionDialog: boolean;\n answers?: IQuestionDialogAnswer[];\n questions?: IQuestionDialog[];\n}\n\nexport const NPCDialog: React.FC<INPCDialogProps> = ({\n text,\n type,\n onClose,\n imagePath,\n isQuestionDialog = false,\n questions,\n answers,\n}) => {\n const [showGoNextIndicator, setShowGoNextIndicator] =\n useState<boolean>(false);\n\n return (\n <RPGUIRoot>\n <RPGUIContainer\n type=\"framed-golden\"\n width={isQuestionDialog ? '600px' : '50%'}\n height={'180px'}\n >\n {isQuestionDialog && questions && answers ? (\n <>\n <TextContainer\n flex={type === NPCDialogType.TextAndThumbnail ? '70%' : '100%'}\n >\n <QuestionDialog\n questions={questions}\n answers={answers}\n onClose={() => {\n if (onClose) {\n onClose();\n }\n }}\n />\n </TextContainer>\n {type === NPCDialogType.TextAndThumbnail && (\n <ThumbnailContainer>\n <NPCThumbnail src={imagePath || aliceDefaultThumbnail} />\n </ThumbnailContainer>\n )}\n </>\n ) : (\n <>\n <Container>\n <TextContainer\n flex={type === NPCDialogType.TextAndThumbnail ? '70%' : '100%'}\n >\n <NPCDialogText\n onStartStep={() => setShowGoNextIndicator(false)}\n onEndStep={() => setShowGoNextIndicator(true)}\n text={text || 'No text provided.'}\n onClose={() => {\n if (onClose) {\n onClose();\n }\n }}\n />\n </TextContainer>\n {type === NPCDialogType.TextAndThumbnail && (\n <ThumbnailContainer>\n <NPCThumbnail src={imagePath || aliceDefaultThumbnail} />\n </ThumbnailContainer>\n )}\n </Container>\n {showGoNextIndicator && (\n <PressSpaceIndicator\n right={type === NPCDialogType.TextOnly ? '1rem' : '10.5rem'}\n src={pressSpaceGif}\n />\n )}\n </>\n )}\n </RPGUIContainer>\n </RPGUIRoot>\n );\n};\n\nconst Container = styled.div`\n display: flex;\n width: 100%;\n height: 100%;\n\n box-sizing: border-box;\n justify-content: center;\n align-items: flex-start;\n position: relative;\n`;\n\ninterface ITextContainerProps {\n flex: string;\n}\n\nconst TextContainer = styled.div<ITextContainerProps>`\n flex: ${({ flex }) => flex} 0 0;\n width: 355px;\n`;\n\nconst ThumbnailContainer = styled.div`\n flex: 30% 0 0;\n display: flex;\n justify-content: flex-end;\n`;\n\nconst NPCThumbnail = styled.img`\n image-rendering: pixelated;\n height: 128px;\n width: 128px;\n`;\n\ninterface IPressSpaceIndicatorProps {\n right: string;\n}\n\nconst PressSpaceIndicator = styled.img<IPressSpaceIndicatorProps>`\n position: absolute;\n right: ${({ right }) => right};\n bottom: 1rem;\n height: 20.7px;\n image-rendering: -webkit-optimize-contrast;\n`;\n","import React, { useEffect, useState } from 'react';\nimport styled from 'styled-components';\n\ninterface IProps {\n text: string;\n onFinish?: () => void;\n onStart?: () => void;\n}\n\nexport const DynamicText: React.FC<IProps> = ({ text, onFinish, onStart }) => {\n const [textState, setTextState] = useState<string>('');\n\n useEffect(() => {\n let i = 0;\n const interval = setInterval(() => {\n // on every interval, show one more character\n\n if (i === 0) {\n if (onStart) {\n onStart();\n }\n }\n\n if (i < text.length) {\n setTextState(text.substring(0, i + 1));\n i++;\n } else {\n clearInterval(interval);\n if (onFinish) {\n onFinish();\n }\n }\n }, 50);\n\n return () => {\n clearInterval(interval);\n };\n }, [text]);\n\n return <TextContainer>{textState}</TextContainer>;\n};\n\nconst TextContainer = styled.p`\n font-size: 0.7rem !important;\n color: white;\n text-shadow: 1px 1px 0px #000000;\n letter-spacing: 1.2px;\n word-break: normal;\n`;\n","import React, { useEffect, useState } from 'react';\nimport styled from 'styled-components';\nimport { chunkString } from '../libs/StringHelpers';\nimport { DynamicText } from '../typography/DynamicText';\n\ninterface IProps {\n text: string;\n onClose: () => void;\n onEndStep: () => void;\n onStartStep: () => void;\n}\n\nexport const NPCDialogText: React.FC<IProps> = ({\n text,\n onClose,\n onEndStep,\n onStartStep,\n}) => {\n const textChunks = chunkString(text, 85);\n\n const [chunkIndex, setChunkIndex] = useState<number>(0);\n\n const onHandleSpacePress = (event: KeyboardEvent) => {\n if (event.code === 'Space') {\n const hasNextChunk = textChunks?.[chunkIndex + 1] || false;\n\n if (hasNextChunk) {\n setChunkIndex((prev) => prev + 1);\n } else {\n // if there's no more text chunks, close the dialog\n onClose();\n }\n }\n };\n\n useEffect(() => {\n document.addEventListener('keydown', onHandleSpacePress);\n\n return () => document.removeEventListener('keydown', onHandleSpacePress);\n }, [chunkIndex]);\n\n return (\n <Container>\n <DynamicText\n text={textChunks?.[chunkIndex] || ''}\n onFinish={onEndStep}\n onStart={onStartStep}\n />\n </Container>\n );\n};\n\nconst Container = styled.div``;\n","import React, { useEffect, useState } from 'react';\nimport styled from 'styled-components';\nimport { useEventListener } from '../../hooks/useEventListener';\nimport { DynamicText } from '../../typography/DynamicText';\n\nexport interface IQuestionDialogAnswer {\n id: number;\n text: string;\n nextQuestionId?: number;\n}\n\nexport interface IQuestionDialog {\n id: number;\n text: string;\n answerIds?: number[];\n}\n\nexport interface IProps {\n questions: IQuestionDialog[];\n answers: IQuestionDialogAnswer[];\n onClose: () => void;\n}\n\nexport const QuestionDialog: React.FC<IProps> = ({\n questions,\n answers,\n onClose,\n}) => {\n const [currentQuestion, setCurrentQuestion] = useState(questions[0]);\n\n const [canShowAnswers, setCanShowAnswers] = useState<boolean>(false);\n\n const onGetFirstAnswer = () => {\n if (!currentQuestion.answerIds || currentQuestion.answerIds.length === 0) {\n return null;\n }\n\n const firstAnswerId = currentQuestion.answerIds![0];\n\n return answers.find((answer) => answer.id === firstAnswerId);\n };\n\n const [currentAnswer, setCurrentAnswer] =\n useState<IQuestionDialogAnswer | null>(onGetFirstAnswer()!);\n\n useEffect(() => {\n setCurrentAnswer(onGetFirstAnswer()!);\n }, [currentQuestion]);\n\n const onGetAnswers = (answerIds: number[]) => {\n return answerIds.map((answerId: number) =>\n answers.find((answer) => answer.id === answerId)\n );\n };\n\n const onKeyPress = (e: KeyboardEvent) => {\n switch (e.key) {\n case 'ArrowDown':\n // select next answer, if any.\n // if no next answer, select first answer\n // const nextAnswer = onGetAnswers(currentQuestion.answerIds!).find(\n // (answer) => answer?.id === currentAnswer!.id + 1\n // );\n\n const nextAnswerIndex = onGetAnswers(\n currentQuestion.answerIds!\n ).findIndex((answer) => answer?.id === currentAnswer!.id + 1);\n\n const nextAnswerID = currentQuestion.answerIds![nextAnswerIndex];\n\n // console.log(nextAnswerIndex);\n\n const nextAnswer = onGetAnswers(currentQuestion.answerIds!).find(\n (answer) => answer?.id === nextAnswerID\n );\n\n setCurrentAnswer(nextAnswer || onGetFirstAnswer()!);\n\n break;\n case 'ArrowUp':\n // select previous answer, if any.\n // if no previous answer, select last answer\n\n const previousAnswerIndex = onGetAnswers(\n currentQuestion.answerIds!\n ).findIndex((answer) => answer?.id === currentAnswer!.id - 1);\n\n const previousAnswerID =\n currentQuestion.answerIds &&\n currentQuestion.answerIds[previousAnswerIndex];\n\n const previousAnswer = onGetAnswers(currentQuestion.answerIds!).find(\n (answer) => answer?.id === previousAnswerID\n );\n\n if (previousAnswer) {\n setCurrentAnswer(previousAnswer);\n } else {\n setCurrentAnswer(onGetAnswers(currentQuestion.answerIds!).pop()!);\n }\n\n break;\n case 'Enter':\n setCanShowAnswers(false);\n\n if (!currentAnswer?.nextQuestionId) {\n onClose();\n return;\n } else {\n setCurrentQuestion(\n questions.find(\n (question) => question.id === currentAnswer!.nextQuestionId\n )!\n );\n }\n\n break;\n }\n };\n useEventListener('keydown', onKeyPress);\n\n const onAnswerClick = (answer: IQuestionDialogAnswer) => {\n setCanShowAnswers(false);\n if (answer.nextQuestionId) {\n // if there is a next question, go to it\n setCurrentQuestion(\n questions.find((question) => question.id === answer.nextQuestionId)!\n );\n } else {\n // else, finish dialog!\n onClose();\n }\n };\n\n const onRenderCurrentAnswers = () => {\n const answerIds = currentQuestion.answerIds;\n if (!answerIds) {\n return null;\n }\n\n const answers = onGetAnswers(answerIds);\n\n if (!answers) {\n return null;\n }\n\n return answers.map((answer) => {\n const isSelected = currentAnswer?.id === answer?.id;\n const selectedColor = isSelected ? 'yellow' : 'white';\n\n if (answer) {\n return (\n <AnswerRow key={`answer_${answer.id}`}>\n <AnswerSelectedIcon color={selectedColor}>\n {isSelected ? 'X' : null}\n </AnswerSelectedIcon>\n\n <Answer\n key={answer.id}\n onClick={() => onAnswerClick(answer)}\n color={selectedColor}\n >\n {answer.text}\n </Answer>\n </AnswerRow>\n );\n }\n\n return null;\n });\n };\n\n return (\n <Container>\n <QuestionContainer>\n <DynamicText\n text={currentQuestion.text}\n onStart={() => setCanShowAnswers(false)}\n onFinish={() => setCanShowAnswers(true)}\n />\n </QuestionContainer>\n\n {canShowAnswers && (\n <AnswersContainer>{onRenderCurrentAnswers()}</AnswersContainer>\n )}\n </Container>\n );\n};\n\nconst Container = styled.div`\n display: flex;\n\n word-break: break-all;\n\n box-sizing: border-box;\n justify-content: flex-start;\n align-items: flex-start;\n flex-wrap: wrap;\n`;\n\nconst QuestionContainer = styled.div`\n flex: 100%;\n width: 100%;\n`;\n\nconst AnswersContainer = styled.div`\n flex: 100%;\n`;\n\ninterface IAnswerProps {\n color: string;\n}\n\nconst Answer = styled.p<IAnswerProps>`\n flex: auto;\n color: ${(props) => props.color} !important;\n font-size: 0.65rem !important;\n background: inherit;\n border: none;\n`;\n\nconst AnswerSelectedIcon = styled.span<IAnswerProps>`\n flex: 5% 0 0;\n color: ${(props) => props.color} !important;\n`;\n\nconst AnswerRow = styled.div`\n display: flex;\n flex-wrap: wrap;\n justify-content: center;\n align-items: center;\n margin-bottom: 0.5rem;\n height: 22px;\n\n p {\n line-height: unset;\n margin-top: 0;\n margin-bottom: 0rem;\n }\n`;\n","import React, { useState } from 'react';\nimport styled from 'styled-components';\nimport { v4 as uuidv4 } from 'uuid';\nimport { useEventListener } from '../hooks/useEventListener';\nimport { RPGUIRoot, _RPGUI } from './RPGUIRoot';\n\nexport enum SliderType {\n Slider = 'rpgui-slider',\n GoldSlider = 'rpgui-slider golden',\n}\n\nexport interface ISliderProps {\n type: SliderType;\n valueMin: number;\n valueMax: number;\n width: string;\n\n onChange: (value: number) => void;\n}\n\nexport const RPGUISlider: React.FC<ISliderProps> = ({\n type,\n valueMin,\n valueMax,\n width,\n onChange,\n}) => {\n const sliderId = uuidv4();\n\n const [wasMouseDownFirst, setWasMouseDownFirst] = useState<boolean>(false);\n\n useEventListener('mouseup', () => {\n if (wasMouseDownFirst) {\n onHandleMouseUp();\n }\n setWasMouseDownFirst(false);\n });\n\n const onHandleMouseUp = () => {\n const rpguiSlider = document.getElementById(`rpgui-slider-${sliderId}`);\n const value = _RPGUI.get_value(rpguiSlider);\n\n onChange(Number(value));\n };\n\n return (\n <RPGUIRoot>\n <div\n onMouseUp={onHandleMouseUp}\n onMouseDown={() => setWasMouseDownFirst(true)}\n >\n <Input\n className={\n type === SliderType.Slider\n ? SliderType.Slider\n : SliderType.GoldSlider\n }\n type=\"range\"\n style={{ width: width }}\n min={valueMin}\n max={valueMax}\n id={`rpgui-slider-${sliderId}`}\n />\n </div>\n </RPGUIRoot>\n );\n};\n\nconst Input = styled.input`\n opacity: 0;\n`;\n"],"names":["_RPGUI","RPGUI","RPGUIRoot","React","className","children","Container","styled","div","props","y","x","useEventListener","type","handler","el","window","savedHandler","useRef","useEffect","current","listener","e","addEventListener","removeEventListener","RPGUIContainer","width","height","img","require","NPCDialogType","DynamicText","text","onFinish","onStart","useState","textState","setTextState","i","interval","setInterval","length","substring","clearInterval","TextContainer","p","NPCDialogText","onClose","onEndStep","onStartStep","textChunks","match","RegExp","chunkIndex","setChunkIndex","onHandleSpacePress","event","code","prev","document","QuestionDialog","questions","answers","currentQuestion","setCurrentQuestion","canShowAnswers","setCanShowAnswers","onGetFirstAnswer","answerIds","firstAnswerId","find","answer","id","currentAnswer","setCurrentAnswer","onGetAnswers","map","answerId","key","nextAnswerIndex","findIndex","nextAnswerID","nextAnswer","previousAnswerIndex","previousAnswerID","previousAnswer","pop","nextQuestionId","question","QuestionContainer","AnswersContainer","isSelected","selectedColor","AnswerRow","AnswerSelectedIcon","color","Answer","onClick","onAnswerClick","onRenderCurrentAnswers","span","SliderType","flex","ThumbnailContainer","NPCThumbnail","PressSpaceIndicator","right","Input","input","onSelected","style","overflow","options","params","imagePath","isQuestionDialog","showGoNextIndicator","setShowGoNextIndicator","TextAndThumbnail","src","aliceDefaultThumbnail","TextOnly","pressSpaceGif","valueMin","valueMax","onChange","sliderId","uuidv4","wasMouseDownFirst","setWasMouseDownFirst","onHandleMouseUp","rpguiSlider","getElementById","value","get_value","Number","onMouseUp","onMouseDown","Slider","GoldSlider","min","max"],"mappings":"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"}
1
+ {"version":3,"file":"long-bow.cjs.production.min.js","sources":["../src/RPGUI/RPGUIRoot.tsx","../src/components/ListMenu.tsx","../src/hooks/useEventListener.ts","../src/RPGUI/RPGUIContainer.tsx","../src/NPCDialog/img/npcDialog/npcThumbnails/alice.png","../src/NPCDialog/img/space.gif","../src/libs/StringHelpers.ts","../src/NPCDialog/NPCDialog.tsx","../src/typography/DynamicText.tsx","../src/NPCDialog/NPCDialogText.tsx","../src/NPCDialog/QuestionDialog/QuestionDialog.tsx","../src/RPGUI/RPGUISlider.tsx"],"sourcesContent":["import React from 'react';\nimport 'rpgui/rpgui.min.css';\nimport 'rpgui/rpgui.min.js';\n\ninterface IProps {\n children: React.ReactNode;\n}\n\n//@ts-ignore\nexport const _RPGUI = RPGUI;\n\nexport const RPGUIRoot: React.FC<IProps> = ({ children }) => {\n return <div className=\"rpgui-content\">{children}</div>;\n};\n","import React from 'react';\nimport styled from 'styled-components';\nimport { RPGUIRoot } from '../RPGUI/RPGUIRoot';\n\ninterface IListMenuOption {\n id: string;\n text: string;\n}\n\nexport interface IListMenuProps {\n x: number;\n y: number;\n options: IListMenuOption[];\n onSelected: (selectedOptionId: string) => void;\n}\n\nexport const ListMenu: React.FC<IListMenuProps> = ({\n options,\n onSelected,\n x,\n y,\n}) => {\n return (\n <RPGUIRoot>\n <Container x={x} y={y}>\n <ul className=\"rpgui-list-imp\" style={{ overflow: 'hidden' }}>\n {options.map((params) => (\n <li\n key={params.text}\n onClick={() => {\n onSelected(params.id);\n }}\n >\n {params.text}\n </li>\n ))}\n </ul>\n </Container>\n </RPGUIRoot>\n );\n};\n\ninterface IContainerProps {\n x?: number;\n y?: number;\n}\n\nconst Container = styled.div<IContainerProps>`\n display: flex;\n flex-direction: column;\n width: 100%;\n justify-content: start;\n align-items: flex-start;\n position: absolute;\n top: ${(props) => props.y || 0}px;\n left: ${(props) => props.x || 0}px;\n`;\n","import React from 'react';\n\n//@ts-ignore\nexport const useEventListener = (type, handler, el = window) => {\n const savedHandler = React.useRef();\n\n React.useEffect(() => {\n savedHandler.current = handler;\n }, [handler]);\n\n React.useEffect(() => {\n //@ts-ignore\n const listener = (e) => savedHandler.current(e);\n\n el.addEventListener(type, listener);\n\n return () => {\n el.removeEventListener(type, listener);\n };\n }, [type, el]);\n};\n","import React from 'react';\nimport styled from 'styled-components';\n\ninterface IProps {\n type: 'framed' | 'framed-golden' | 'framed-golden-2' | 'framed-grey';\n children: React.ReactNode;\n width?: string;\n height?: string;\n}\n\nexport const RPGUIContainer: React.FC<IProps> = ({\n children,\n type,\n width = '50%',\n height,\n}) => {\n return (\n <Container\n width={width}\n height={height || 'auto'}\n className={`rpgui-container ${type}`}\n >\n {children}\n </Container>\n );\n};\n\ninterface IContainerProps {\n width: string;\n height: string;\n}\n\nconst Container = styled.div<IContainerProps>`\n height: ${(props) => props.height};\n width: ${({ width }) => width};\n display: flex;\n flex-wrap: wrap;\n`;\n","const img = require('./alice.png'); export default img;","const img = require('./space.gif'); export default img;","export const chunkString = (str: string, length: number) => {\n return str.match(new RegExp('.{1,' + length + '}', 'g'));\n};\n","import React, { useState } from 'react';\nimport styled from 'styled-components';\nimport { IQuestionDialog, IQuestionDialogAnswer } from '..';\nimport { RPGUIContainer } from '../RPGUI/RPGUIContainer';\nimport { RPGUIRoot } from '../RPGUI/RPGUIRoot';\nimport aliceDefaultThumbnail from './img/npcDialog/npcThumbnails/alice.png';\nimport pressSpaceGif from './img/space.gif';\nimport { NPCDialogText } from './NPCDialogText';\nimport { QuestionDialog } from './QuestionDialog/QuestionDialog';\nexport enum NPCDialogType {\n TextOnly = 'TextOnly',\n TextAndThumbnail = 'TextAndThumbnail',\n}\n\nexport interface INPCDialogProps {\n text?: string;\n type: NPCDialogType;\n imagePath?: string;\n onClose?: () => void;\n isQuestionDialog: boolean;\n answers?: IQuestionDialogAnswer[];\n questions?: IQuestionDialog[];\n}\n\nexport const NPCDialog: React.FC<INPCDialogProps> = ({\n text,\n type,\n onClose,\n imagePath,\n isQuestionDialog = false,\n questions,\n answers,\n}) => {\n const [showGoNextIndicator, setShowGoNextIndicator] =\n useState<boolean>(false);\n\n return (\n <RPGUIRoot>\n <RPGUIContainer\n type=\"framed-golden\"\n width={isQuestionDialog ? '600px' : '50%'}\n height={'180px'}\n >\n {isQuestionDialog && questions && answers ? (\n <>\n <TextContainer\n flex={type === NPCDialogType.TextAndThumbnail ? '70%' : '100%'}\n >\n <QuestionDialog\n questions={questions}\n answers={answers}\n onClose={() => {\n if (onClose) {\n onClose();\n }\n }}\n />\n </TextContainer>\n {type === NPCDialogType.TextAndThumbnail && (\n <ThumbnailContainer>\n <NPCThumbnail src={imagePath || aliceDefaultThumbnail} />\n </ThumbnailContainer>\n )}\n </>\n ) : (\n <>\n <Container>\n <TextContainer\n flex={type === NPCDialogType.TextAndThumbnail ? '70%' : '100%'}\n >\n <NPCDialogText\n onStartStep={() => setShowGoNextIndicator(false)}\n onEndStep={() => setShowGoNextIndicator(true)}\n text={text || 'No text provided.'}\n onClose={() => {\n if (onClose) {\n onClose();\n }\n }}\n />\n </TextContainer>\n {type === NPCDialogType.TextAndThumbnail && (\n <ThumbnailContainer>\n <NPCThumbnail src={imagePath || aliceDefaultThumbnail} />\n </ThumbnailContainer>\n )}\n </Container>\n {showGoNextIndicator && (\n <PressSpaceIndicator\n right={type === NPCDialogType.TextOnly ? '1rem' : '10.5rem'}\n src={pressSpaceGif}\n />\n )}\n </>\n )}\n </RPGUIContainer>\n </RPGUIRoot>\n );\n};\n\nconst Container = styled.div`\n display: flex;\n width: 100%;\n height: 100%;\n\n box-sizing: border-box;\n justify-content: center;\n align-items: flex-start;\n position: relative;\n`;\n\ninterface ITextContainerProps {\n flex: string;\n}\n\nconst TextContainer = styled.div<ITextContainerProps>`\n flex: ${({ flex }) => flex} 0 0;\n width: 355px;\n`;\n\nconst ThumbnailContainer = styled.div`\n flex: 30% 0 0;\n display: flex;\n justify-content: flex-end;\n`;\n\nconst NPCThumbnail = styled.img`\n image-rendering: pixelated;\n height: 128px;\n width: 128px;\n`;\n\ninterface IPressSpaceIndicatorProps {\n right: string;\n}\n\nconst PressSpaceIndicator = styled.img<IPressSpaceIndicatorProps>`\n position: absolute;\n right: ${({ right }) => right};\n bottom: 1rem;\n height: 20.7px;\n image-rendering: -webkit-optimize-contrast;\n`;\n","import React, { useEffect, useState } from 'react';\nimport styled from 'styled-components';\n\ninterface IProps {\n text: string;\n onFinish?: () => void;\n onStart?: () => void;\n}\n\nexport const DynamicText: React.FC<IProps> = ({ text, onFinish, onStart }) => {\n const [textState, setTextState] = useState<string>('');\n\n useEffect(() => {\n let i = 0;\n const interval = setInterval(() => {\n // on every interval, show one more character\n\n if (i === 0) {\n if (onStart) {\n onStart();\n }\n }\n\n if (i < text.length) {\n setTextState(text.substring(0, i + 1));\n i++;\n } else {\n clearInterval(interval);\n if (onFinish) {\n onFinish();\n }\n }\n }, 50);\n\n return () => {\n clearInterval(interval);\n };\n }, [text]);\n\n return <TextContainer>{textState}</TextContainer>;\n};\n\nconst TextContainer = styled.p`\n font-size: 0.7rem !important;\n color: white;\n text-shadow: 1px 1px 0px #000000;\n letter-spacing: 1.2px;\n word-break: normal;\n`;\n","import React, { useEffect, useState } from 'react';\nimport styled from 'styled-components';\nimport { chunkString } from '../libs/StringHelpers';\nimport { DynamicText } from '../typography/DynamicText';\n\ninterface IProps {\n text: string;\n onClose: () => void;\n onEndStep: () => void;\n onStartStep: () => void;\n}\n\nexport const NPCDialogText: React.FC<IProps> = ({\n text,\n onClose,\n onEndStep,\n onStartStep,\n}) => {\n const textChunks = chunkString(text, 85);\n\n const [chunkIndex, setChunkIndex] = useState<number>(0);\n\n const onHandleSpacePress = (event: KeyboardEvent) => {\n if (event.code === 'Space') {\n const hasNextChunk = textChunks?.[chunkIndex + 1] || false;\n\n if (hasNextChunk) {\n setChunkIndex((prev) => prev + 1);\n } else {\n // if there's no more text chunks, close the dialog\n onClose();\n }\n }\n };\n\n useEffect(() => {\n document.addEventListener('keydown', onHandleSpacePress);\n\n return () => document.removeEventListener('keydown', onHandleSpacePress);\n }, [chunkIndex]);\n\n return (\n <Container>\n <DynamicText\n text={textChunks?.[chunkIndex] || ''}\n onFinish={onEndStep}\n onStart={onStartStep}\n />\n </Container>\n );\n};\n\nconst Container = styled.div``;\n","import React, { useEffect, useState } from 'react';\nimport styled from 'styled-components';\nimport { useEventListener } from '../../hooks/useEventListener';\nimport { DynamicText } from '../../typography/DynamicText';\n\nexport interface IQuestionDialogAnswer {\n id: number;\n text: string;\n nextQuestionId?: number;\n}\n\nexport interface IQuestionDialog {\n id: number;\n text: string;\n answerIds?: number[];\n}\n\nexport interface IProps {\n questions: IQuestionDialog[];\n answers: IQuestionDialogAnswer[];\n onClose: () => void;\n}\n\nexport const QuestionDialog: React.FC<IProps> = ({\n questions,\n answers,\n onClose,\n}) => {\n const [currentQuestion, setCurrentQuestion] = useState(questions[0]);\n\n const [canShowAnswers, setCanShowAnswers] = useState<boolean>(false);\n\n const onGetFirstAnswer = () => {\n if (!currentQuestion.answerIds || currentQuestion.answerIds.length === 0) {\n return null;\n }\n\n const firstAnswerId = currentQuestion.answerIds![0];\n\n return answers.find((answer) => answer.id === firstAnswerId);\n };\n\n const [currentAnswer, setCurrentAnswer] =\n useState<IQuestionDialogAnswer | null>(onGetFirstAnswer()!);\n\n useEffect(() => {\n setCurrentAnswer(onGetFirstAnswer()!);\n }, [currentQuestion]);\n\n const onGetAnswers = (answerIds: number[]) => {\n return answerIds.map((answerId: number) =>\n answers.find((answer) => answer.id === answerId)\n );\n };\n\n const onKeyPress = (e: KeyboardEvent) => {\n switch (e.key) {\n case 'ArrowDown':\n // select next answer, if any.\n // if no next answer, select first answer\n // const nextAnswer = onGetAnswers(currentQuestion.answerIds!).find(\n // (answer) => answer?.id === currentAnswer!.id + 1\n // );\n\n const nextAnswerIndex = onGetAnswers(\n currentQuestion.answerIds!\n ).findIndex((answer) => answer?.id === currentAnswer!.id + 1);\n\n const nextAnswerID = currentQuestion.answerIds![nextAnswerIndex];\n\n // console.log(nextAnswerIndex);\n\n const nextAnswer = onGetAnswers(currentQuestion.answerIds!).find(\n (answer) => answer?.id === nextAnswerID\n );\n\n setCurrentAnswer(nextAnswer || onGetFirstAnswer()!);\n\n break;\n case 'ArrowUp':\n // select previous answer, if any.\n // if no previous answer, select last answer\n\n const previousAnswerIndex = onGetAnswers(\n currentQuestion.answerIds!\n ).findIndex((answer) => answer?.id === currentAnswer!.id - 1);\n\n const previousAnswerID =\n currentQuestion.answerIds &&\n currentQuestion.answerIds[previousAnswerIndex];\n\n const previousAnswer = onGetAnswers(currentQuestion.answerIds!).find(\n (answer) => answer?.id === previousAnswerID\n );\n\n if (previousAnswer) {\n setCurrentAnswer(previousAnswer);\n } else {\n setCurrentAnswer(onGetAnswers(currentQuestion.answerIds!).pop()!);\n }\n\n break;\n case 'Enter':\n setCanShowAnswers(false);\n\n if (!currentAnswer?.nextQuestionId) {\n onClose();\n return;\n } else {\n setCurrentQuestion(\n questions.find(\n (question) => question.id === currentAnswer!.nextQuestionId\n )!\n );\n }\n\n break;\n }\n };\n useEventListener('keydown', onKeyPress);\n\n const onAnswerClick = (answer: IQuestionDialogAnswer) => {\n setCanShowAnswers(false);\n if (answer.nextQuestionId) {\n // if there is a next question, go to it\n setCurrentQuestion(\n questions.find((question) => question.id === answer.nextQuestionId)!\n );\n } else {\n // else, finish dialog!\n onClose();\n }\n };\n\n const onRenderCurrentAnswers = () => {\n const answerIds = currentQuestion.answerIds;\n if (!answerIds) {\n return null;\n }\n\n const answers = onGetAnswers(answerIds);\n\n if (!answers) {\n return null;\n }\n\n return answers.map((answer) => {\n const isSelected = currentAnswer?.id === answer?.id;\n const selectedColor = isSelected ? 'yellow' : 'white';\n\n if (answer) {\n return (\n <AnswerRow key={`answer_${answer.id}`}>\n <AnswerSelectedIcon color={selectedColor}>\n {isSelected ? 'X' : null}\n </AnswerSelectedIcon>\n\n <Answer\n key={answer.id}\n onClick={() => onAnswerClick(answer)}\n color={selectedColor}\n >\n {answer.text}\n </Answer>\n </AnswerRow>\n );\n }\n\n return null;\n });\n };\n\n return (\n <Container>\n <QuestionContainer>\n <DynamicText\n text={currentQuestion.text}\n onStart={() => setCanShowAnswers(false)}\n onFinish={() => setCanShowAnswers(true)}\n />\n </QuestionContainer>\n\n {canShowAnswers && (\n <AnswersContainer>{onRenderCurrentAnswers()}</AnswersContainer>\n )}\n </Container>\n );\n};\n\nconst Container = styled.div`\n display: flex;\n\n word-break: break-all;\n\n box-sizing: border-box;\n justify-content: flex-start;\n align-items: flex-start;\n flex-wrap: wrap;\n`;\n\nconst QuestionContainer = styled.div`\n flex: 100%;\n width: 100%;\n`;\n\nconst AnswersContainer = styled.div`\n flex: 100%;\n`;\n\ninterface IAnswerProps {\n color: string;\n}\n\nconst Answer = styled.p<IAnswerProps>`\n flex: auto;\n color: ${(props) => props.color} !important;\n font-size: 0.65rem !important;\n background: inherit;\n border: none;\n`;\n\nconst AnswerSelectedIcon = styled.span<IAnswerProps>`\n flex: 5% 0 0;\n color: ${(props) => props.color} !important;\n`;\n\nconst AnswerRow = styled.div`\n display: flex;\n flex-wrap: wrap;\n justify-content: center;\n align-items: center;\n margin-bottom: 0.5rem;\n height: 22px;\n\n p {\n line-height: unset;\n margin-top: 0;\n margin-bottom: 0rem;\n }\n`;\n","import React, { useState } from 'react';\nimport styled from 'styled-components';\nimport { v4 as uuidv4 } from 'uuid';\nimport { useEventListener } from '../hooks/useEventListener';\nimport { RPGUIRoot, _RPGUI } from './RPGUIRoot';\n\nexport enum SliderType {\n Slider = 'rpgui-slider',\n GoldSlider = 'rpgui-slider golden',\n}\n\nexport interface ISliderProps {\n type: SliderType;\n valueMin: number;\n valueMax: number;\n width: string;\n\n onChange: (value: number) => void;\n}\n\nexport const RPGUISlider: React.FC<ISliderProps> = ({\n type,\n valueMin,\n valueMax,\n width,\n onChange,\n}) => {\n const sliderId = uuidv4();\n\n const [wasMouseDownFirst, setWasMouseDownFirst] = useState<boolean>(false);\n\n useEventListener('mouseup', () => {\n if (wasMouseDownFirst) {\n onHandleMouseUp();\n }\n setWasMouseDownFirst(false);\n });\n\n const onHandleMouseUp = () => {\n const rpguiSlider = document.getElementById(`rpgui-slider-${sliderId}`);\n const value = _RPGUI.get_value(rpguiSlider);\n\n onChange(Number(value));\n };\n\n return (\n <RPGUIRoot>\n <div\n onMouseUp={onHandleMouseUp}\n onMouseDown={() => setWasMouseDownFirst(true)}\n >\n <Input\n className={\n type === SliderType.Slider\n ? SliderType.Slider\n : SliderType.GoldSlider\n }\n type=\"range\"\n style={{ width: width }}\n min={valueMin}\n max={valueMax}\n id={`rpgui-slider-${sliderId}`}\n />\n </div>\n </RPGUIRoot>\n );\n};\n\nconst Input = styled.input`\n opacity: 0;\n`;\n"],"names":["_RPGUI","RPGUI","RPGUIRoot","React","className","children","Container","styled","div","props","y","x","useEventListener","type","handler","el","window","savedHandler","useRef","useEffect","current","listener","e","addEventListener","removeEventListener","RPGUIContainer","width","height","img","require","NPCDialogType","DynamicText","text","onFinish","onStart","useState","textState","setTextState","i","interval","setInterval","length","substring","clearInterval","TextContainer","p","NPCDialogText","onClose","onEndStep","onStartStep","textChunks","match","RegExp","chunkIndex","setChunkIndex","onHandleSpacePress","event","code","prev","document","QuestionDialog","questions","answers","currentQuestion","setCurrentQuestion","canShowAnswers","setCanShowAnswers","onGetFirstAnswer","answerIds","firstAnswerId","find","answer","id","currentAnswer","setCurrentAnswer","onGetAnswers","map","answerId","key","nextAnswerIndex","findIndex","nextAnswerID","nextAnswer","previousAnswerIndex","previousAnswerID","previousAnswer","pop","nextQuestionId","question","QuestionContainer","AnswersContainer","isSelected","selectedColor","AnswerRow","AnswerSelectedIcon","color","Answer","onClick","onAnswerClick","onRenderCurrentAnswers","span","SliderType","flex","ThumbnailContainer","NPCThumbnail","PressSpaceIndicator","right","Input","input","onSelected","style","overflow","options","params","imagePath","isQuestionDialog","showGoNextIndicator","setShowGoNextIndicator","TextAndThumbnail","src","aliceDefaultThumbnail","TextOnly","pressSpaceGif","valueMin","valueMax","onChange","sliderId","uuidv4","wasMouseDownFirst","setWasMouseDownFirst","onHandleMouseUp","rpguiSlider","getElementById","value","get_value","Number","onMouseUp","onMouseDown","Slider","GoldSlider","min","max"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"long-bow.esm.js","sources":["../src/RPGUI/RPGUIRoot.tsx","../src/components/ListMenu.tsx","../src/hooks/useEventListener.ts","../src/RPGUI/RPGUIContainer.tsx","../src/NPCDialog/img/npcDialog/npcThumbnails/alice.png","../src/NPCDialog/img/space.gif","../src/libs/StringHelpers.ts","../src/typography/DynamicText.tsx","../src/NPCDialog/NPCDialogText.tsx","../src/NPCDialog/QuestionDialog/QuestionDialog.tsx","../src/NPCDialog/NPCDialog.tsx","../src/RPGUI/RPGUISlider.tsx"],"sourcesContent":["import React from 'react';\nimport 'rpgui/rpgui.min.css';\nimport 'rpgui/rpgui.min.js';\n\ninterface IProps {\n children: React.ReactNode;\n}\n\n//@ts-ignore\nexport const _RPGUI = RPGUI;\n\nexport const RPGUIRoot: React.FC<IProps> = ({ children }) => {\n return <div className=\"rpgui-content\">{children}</div>;\n};\n","import React from 'react';\nimport styled from 'styled-components';\nimport { RPGUIRoot } from '../RPGUI/RPGUIRoot';\n\nexport interface IListMenuProps {\n x: number;\n y: number;\n options: [\n {\n id: string;\n text: string;\n }\n ];\n onSelected: (selectedOptionId: string) => void;\n}\n\nexport const ListMenu: React.FC<IListMenuProps> = ({\n options,\n onSelected,\n x,\n y,\n}) => {\n return (\n <RPGUIRoot>\n <Container x={x} y={y}>\n <ul className=\"rpgui-list-imp\" style={{ overflow: 'hidden' }}>\n {options.map((params) => (\n <li\n key={params.text}\n onClick={() => {\n onSelected(params.id);\n }}\n >\n {params.text}\n </li>\n ))}\n </ul>\n </Container>\n </RPGUIRoot>\n );\n};\n\ninterface IContainerProps {\n x?: number;\n y?: number;\n}\n\nconst Container = styled.div<IContainerProps>`\n display: flex;\n flex-direction: column;\n width: 100%;\n justify-content: start;\n align-items: flex-start;\n position: absolute;\n top: ${(props) => props.y || 0}px;\n left: ${(props) => props.x || 0}px;\n`;\n","import React from 'react';\n\n//@ts-ignore\nexport const useEventListener = (type, handler, el = window) => {\n const savedHandler = React.useRef();\n\n React.useEffect(() => {\n savedHandler.current = handler;\n }, [handler]);\n\n React.useEffect(() => {\n //@ts-ignore\n const listener = (e) => savedHandler.current(e);\n\n el.addEventListener(type, listener);\n\n return () => {\n el.removeEventListener(type, listener);\n };\n }, [type, el]);\n};\n","import React from 'react';\nimport styled from 'styled-components';\n\ninterface IProps {\n type: 'framed' | 'framed-golden' | 'framed-golden-2' | 'framed-grey';\n children: React.ReactNode;\n width?: string;\n height?: string;\n}\n\nexport const RPGUIContainer: React.FC<IProps> = ({\n children,\n type,\n width = '50%',\n height,\n}) => {\n return (\n <Container\n width={width}\n height={height || 'auto'}\n className={`rpgui-container ${type}`}\n >\n {children}\n </Container>\n );\n};\n\ninterface IContainerProps {\n width: string;\n height: string;\n}\n\nconst Container = styled.div<IContainerProps>`\n height: ${(props) => props.height};\n width: ${({ width }) => width};\n display: flex;\n flex-wrap: wrap;\n`;\n","const img = require('./alice.png'); export default img;","const img = require('./space.gif'); export default img;","export const chunkString = (str: string, length: number) => {\n return str.match(new RegExp('.{1,' + length + '}', 'g'));\n};\n","import React, { useEffect, useState } from 'react';\nimport styled from 'styled-components';\n\ninterface IProps {\n text: string;\n onFinish?: () => void;\n onStart?: () => void;\n}\n\nexport const DynamicText: React.FC<IProps> = ({ text, onFinish, onStart }) => {\n const [textState, setTextState] = useState<string>('');\n\n useEffect(() => {\n let i = 0;\n const interval = setInterval(() => {\n // on every interval, show one more character\n\n if (i === 0) {\n if (onStart) {\n onStart();\n }\n }\n\n if (i < text.length) {\n setTextState(text.substring(0, i + 1));\n i++;\n } else {\n clearInterval(interval);\n if (onFinish) {\n onFinish();\n }\n }\n }, 50);\n\n return () => {\n clearInterval(interval);\n };\n }, [text]);\n\n return <TextContainer>{textState}</TextContainer>;\n};\n\nconst TextContainer = styled.p`\n font-size: 0.7rem !important;\n color: white;\n text-shadow: 1px 1px 0px #000000;\n letter-spacing: 1.2px;\n word-break: normal;\n`;\n","import React, { useEffect, useState } from 'react';\nimport styled from 'styled-components';\nimport { chunkString } from '../libs/StringHelpers';\nimport { DynamicText } from '../typography/DynamicText';\n\ninterface IProps {\n text: string;\n onClose: () => void;\n onEndStep: () => void;\n onStartStep: () => void;\n}\n\nexport const NPCDialogText: React.FC<IProps> = ({\n text,\n onClose,\n onEndStep,\n onStartStep,\n}) => {\n const textChunks = chunkString(text, 85);\n\n const [chunkIndex, setChunkIndex] = useState<number>(0);\n\n const onHandleSpacePress = (event: KeyboardEvent) => {\n if (event.code === 'Space') {\n const hasNextChunk = textChunks?.[chunkIndex + 1] || false;\n\n if (hasNextChunk) {\n setChunkIndex((prev) => prev + 1);\n } else {\n // if there's no more text chunks, close the dialog\n onClose();\n }\n }\n };\n\n useEffect(() => {\n document.addEventListener('keydown', onHandleSpacePress);\n\n return () => document.removeEventListener('keydown', onHandleSpacePress);\n }, [chunkIndex]);\n\n return (\n <Container>\n <DynamicText\n text={textChunks?.[chunkIndex] || ''}\n onFinish={onEndStep}\n onStart={onStartStep}\n />\n </Container>\n );\n};\n\nconst Container = styled.div``;\n","import React, { useEffect, useState } from 'react';\nimport styled from 'styled-components';\nimport { useEventListener } from '../../hooks/useEventListener';\nimport { DynamicText } from '../../typography/DynamicText';\n\nexport interface IQuestionDialogAnswer {\n id: number;\n text: string;\n nextQuestionId?: number;\n}\n\nexport interface IQuestionDialog {\n id: number;\n text: string;\n answerIds?: number[];\n}\n\nexport interface IProps {\n questions: IQuestionDialog[];\n answers: IQuestionDialogAnswer[];\n onClose: () => void;\n}\n\nexport const QuestionDialog: React.FC<IProps> = ({\n questions,\n answers,\n onClose,\n}) => {\n const [currentQuestion, setCurrentQuestion] = useState(questions[0]);\n\n const [canShowAnswers, setCanShowAnswers] = useState<boolean>(false);\n\n const onGetFirstAnswer = () => {\n if (!currentQuestion.answerIds || currentQuestion.answerIds.length === 0) {\n return null;\n }\n\n const firstAnswerId = currentQuestion.answerIds![0];\n\n return answers.find((answer) => answer.id === firstAnswerId);\n };\n\n const [currentAnswer, setCurrentAnswer] =\n useState<IQuestionDialogAnswer | null>(onGetFirstAnswer()!);\n\n useEffect(() => {\n setCurrentAnswer(onGetFirstAnswer()!);\n }, [currentQuestion]);\n\n const onGetAnswers = (answerIds: number[]) => {\n return answerIds.map((answerId: number) =>\n answers.find((answer) => answer.id === answerId)\n );\n };\n\n const onKeyPress = (e: KeyboardEvent) => {\n switch (e.key) {\n case 'ArrowDown':\n // select next answer, if any.\n // if no next answer, select first answer\n // const nextAnswer = onGetAnswers(currentQuestion.answerIds!).find(\n // (answer) => answer?.id === currentAnswer!.id + 1\n // );\n\n const nextAnswerIndex = onGetAnswers(\n currentQuestion.answerIds!\n ).findIndex((answer) => answer?.id === currentAnswer!.id + 1);\n\n const nextAnswerID = currentQuestion.answerIds![nextAnswerIndex];\n\n // console.log(nextAnswerIndex);\n\n const nextAnswer = onGetAnswers(currentQuestion.answerIds!).find(\n (answer) => answer?.id === nextAnswerID\n );\n\n setCurrentAnswer(nextAnswer || onGetFirstAnswer()!);\n\n break;\n case 'ArrowUp':\n // select previous answer, if any.\n // if no previous answer, select last answer\n\n const previousAnswerIndex = onGetAnswers(\n currentQuestion.answerIds!\n ).findIndex((answer) => answer?.id === currentAnswer!.id - 1);\n\n const previousAnswerID =\n currentQuestion.answerIds &&\n currentQuestion.answerIds[previousAnswerIndex];\n\n const previousAnswer = onGetAnswers(currentQuestion.answerIds!).find(\n (answer) => answer?.id === previousAnswerID\n );\n\n if (previousAnswer) {\n setCurrentAnswer(previousAnswer);\n } else {\n setCurrentAnswer(onGetAnswers(currentQuestion.answerIds!).pop()!);\n }\n\n break;\n case 'Enter':\n setCanShowAnswers(false);\n\n if (!currentAnswer?.nextQuestionId) {\n onClose();\n return;\n } else {\n setCurrentQuestion(\n questions.find(\n (question) => question.id === currentAnswer!.nextQuestionId\n )!\n );\n }\n\n break;\n }\n };\n useEventListener('keydown', onKeyPress);\n\n const onAnswerClick = (answer: IQuestionDialogAnswer) => {\n setCanShowAnswers(false);\n if (answer.nextQuestionId) {\n // if there is a next question, go to it\n setCurrentQuestion(\n questions.find((question) => question.id === answer.nextQuestionId)!\n );\n } else {\n // else, finish dialog!\n onClose();\n }\n };\n\n const onRenderCurrentAnswers = () => {\n const answerIds = currentQuestion.answerIds;\n if (!answerIds) {\n return null;\n }\n\n const answers = onGetAnswers(answerIds);\n\n if (!answers) {\n return null;\n }\n\n return answers.map((answer) => {\n const isSelected = currentAnswer?.id === answer?.id;\n const selectedColor = isSelected ? 'yellow' : 'white';\n\n if (answer) {\n return (\n <AnswerRow key={`answer_${answer.id}`}>\n <AnswerSelectedIcon color={selectedColor}>\n {isSelected ? 'X' : null}\n </AnswerSelectedIcon>\n\n <Answer\n key={answer.id}\n onClick={() => onAnswerClick(answer)}\n color={selectedColor}\n >\n {answer.text}\n </Answer>\n </AnswerRow>\n );\n }\n\n return null;\n });\n };\n\n return (\n <Container>\n <QuestionContainer>\n <DynamicText\n text={currentQuestion.text}\n onStart={() => setCanShowAnswers(false)}\n onFinish={() => setCanShowAnswers(true)}\n />\n </QuestionContainer>\n\n {canShowAnswers && (\n <AnswersContainer>{onRenderCurrentAnswers()}</AnswersContainer>\n )}\n </Container>\n );\n};\n\nconst Container = styled.div`\n display: flex;\n\n word-break: break-all;\n\n box-sizing: border-box;\n justify-content: flex-start;\n align-items: flex-start;\n flex-wrap: wrap;\n`;\n\nconst QuestionContainer = styled.div`\n flex: 100%;\n width: 100%;\n`;\n\nconst AnswersContainer = styled.div`\n flex: 100%;\n`;\n\ninterface IAnswerProps {\n color: string;\n}\n\nconst Answer = styled.p<IAnswerProps>`\n flex: auto;\n color: ${(props) => props.color} !important;\n font-size: 0.65rem !important;\n background: inherit;\n border: none;\n`;\n\nconst AnswerSelectedIcon = styled.span<IAnswerProps>`\n flex: 5% 0 0;\n color: ${(props) => props.color} !important;\n`;\n\nconst AnswerRow = styled.div`\n display: flex;\n flex-wrap: wrap;\n justify-content: center;\n align-items: center;\n margin-bottom: 0.5rem;\n height: 22px;\n\n p {\n line-height: unset;\n margin-top: 0;\n margin-bottom: 0rem;\n }\n`;\n","import React, { useState } from 'react';\nimport styled from 'styled-components';\nimport { IQuestionDialog, IQuestionDialogAnswer } from '..';\nimport { RPGUIContainer } from '../RPGUI/RPGUIContainer';\nimport { RPGUIRoot } from '../RPGUI/RPGUIRoot';\nimport aliceDefaultThumbnail from './img/npcDialog/npcThumbnails/alice.png';\nimport pressSpaceGif from './img/space.gif';\nimport { NPCDialogText } from './NPCDialogText';\nimport { QuestionDialog } from './QuestionDialog/QuestionDialog';\nexport enum NPCDialogType {\n TextOnly = 'TextOnly',\n TextAndThumbnail = 'TextAndThumbnail',\n}\n\nexport interface INPCDialogProps {\n text?: string;\n type: NPCDialogType;\n imagePath?: string;\n onClose?: () => void;\n isQuestionDialog: boolean;\n answers?: IQuestionDialogAnswer[];\n questions?: IQuestionDialog[];\n}\n\nexport const NPCDialog: React.FC<INPCDialogProps> = ({\n text,\n type,\n onClose,\n imagePath,\n isQuestionDialog = false,\n questions,\n answers,\n}) => {\n const [showGoNextIndicator, setShowGoNextIndicator] =\n useState<boolean>(false);\n\n return (\n <RPGUIRoot>\n <RPGUIContainer\n type=\"framed-golden\"\n width={isQuestionDialog ? '600px' : '50%'}\n height={'180px'}\n >\n {isQuestionDialog && questions && answers ? (\n <>\n <TextContainer\n flex={type === NPCDialogType.TextAndThumbnail ? '70%' : '100%'}\n >\n <QuestionDialog\n questions={questions}\n answers={answers}\n onClose={() => {\n if (onClose) {\n onClose();\n }\n }}\n />\n </TextContainer>\n {type === NPCDialogType.TextAndThumbnail && (\n <ThumbnailContainer>\n <NPCThumbnail src={imagePath || aliceDefaultThumbnail} />\n </ThumbnailContainer>\n )}\n </>\n ) : (\n <>\n <Container>\n <TextContainer\n flex={type === NPCDialogType.TextAndThumbnail ? '70%' : '100%'}\n >\n <NPCDialogText\n onStartStep={() => setShowGoNextIndicator(false)}\n onEndStep={() => setShowGoNextIndicator(true)}\n text={text || 'No text provided.'}\n onClose={() => {\n if (onClose) {\n onClose();\n }\n }}\n />\n </TextContainer>\n {type === NPCDialogType.TextAndThumbnail && (\n <ThumbnailContainer>\n <NPCThumbnail src={imagePath || aliceDefaultThumbnail} />\n </ThumbnailContainer>\n )}\n </Container>\n {showGoNextIndicator && (\n <PressSpaceIndicator\n right={type === NPCDialogType.TextOnly ? '1rem' : '10.5rem'}\n src={pressSpaceGif}\n />\n )}\n </>\n )}\n </RPGUIContainer>\n </RPGUIRoot>\n );\n};\n\nconst Container = styled.div`\n display: flex;\n width: 100%;\n height: 100%;\n\n box-sizing: border-box;\n justify-content: center;\n align-items: flex-start;\n position: relative;\n`;\n\ninterface ITextContainerProps {\n flex: string;\n}\n\nconst TextContainer = styled.div<ITextContainerProps>`\n flex: ${({ flex }) => flex} 0 0;\n width: 355px;\n`;\n\nconst ThumbnailContainer = styled.div`\n flex: 30% 0 0;\n display: flex;\n justify-content: flex-end;\n`;\n\nconst NPCThumbnail = styled.img`\n image-rendering: pixelated;\n height: 128px;\n width: 128px;\n`;\n\ninterface IPressSpaceIndicatorProps {\n right: string;\n}\n\nconst PressSpaceIndicator = styled.img<IPressSpaceIndicatorProps>`\n position: absolute;\n right: ${({ right }) => right};\n bottom: 1rem;\n height: 20.7px;\n image-rendering: -webkit-optimize-contrast;\n`;\n","import React, { useState } from 'react';\nimport styled from 'styled-components';\nimport { v4 as uuidv4 } from 'uuid';\nimport { useEventListener } from '../hooks/useEventListener';\nimport { RPGUIRoot, _RPGUI } from './RPGUIRoot';\n\nexport enum SliderType {\n Slider = 'rpgui-slider',\n GoldSlider = 'rpgui-slider golden',\n}\n\nexport interface ISliderProps {\n type: SliderType;\n valueMin: number;\n valueMax: number;\n width: string;\n\n onChange: (value: number) => void;\n}\n\nexport const RPGUISlider: React.FC<ISliderProps> = ({\n type,\n valueMin,\n valueMax,\n width,\n onChange,\n}) => {\n const sliderId = uuidv4();\n\n const [wasMouseDownFirst, setWasMouseDownFirst] = useState<boolean>(false);\n\n useEventListener('mouseup', () => {\n if (wasMouseDownFirst) {\n onHandleMouseUp();\n }\n setWasMouseDownFirst(false);\n });\n\n const onHandleMouseUp = () => {\n const rpguiSlider = document.getElementById(`rpgui-slider-${sliderId}`);\n const value = _RPGUI.get_value(rpguiSlider);\n\n onChange(Number(value));\n };\n\n return (\n <RPGUIRoot>\n <div\n onMouseUp={onHandleMouseUp}\n onMouseDown={() => setWasMouseDownFirst(true)}\n >\n <Input\n className={\n type === SliderType.Slider\n ? SliderType.Slider\n : SliderType.GoldSlider\n }\n type=\"range\"\n style={{ width: width }}\n min={valueMin}\n max={valueMax}\n id={`rpgui-slider-${sliderId}`}\n />\n </div>\n </RPGUIRoot>\n );\n};\n\nconst Input = styled.input`\n opacity: 0;\n`;\n"],"names":["_RPGUI","RPGUI","RPGUIRoot","children","React","className","ListMenu","options","onSelected","x","y","Container","style","overflow","map","params","key","text","onClick","id","styled","div","props","useEventListener","type","handler","el","window","savedHandler","useRef","useEffect","current","listener","e","addEventListener","removeEventListener","RPGUIContainer","width","height","img","chunkString","str","length","match","RegExp","DynamicText","onFinish","onStart","useState","textState","setTextState","i","interval","setInterval","substring","clearInterval","TextContainer","p","NPCDialogText","onClose","onEndStep","onStartStep","textChunks","chunkIndex","setChunkIndex","onHandleSpacePress","event","code","hasNextChunk","prev","document","QuestionDialog","questions","answers","currentQuestion","setCurrentQuestion","canShowAnswers","setCanShowAnswers","onGetFirstAnswer","answerIds","firstAnswerId","find","answer","currentAnswer","setCurrentAnswer","onGetAnswers","answerId","onKeyPress","nextAnswerIndex","findIndex","nextAnswerID","nextAnswer","previousAnswerIndex","previousAnswerID","previousAnswer","pop","nextQuestionId","question","onAnswerClick","onRenderCurrentAnswers","isSelected","selectedColor","AnswerRow","AnswerSelectedIcon","color","Answer","QuestionContainer","AnswersContainer","span","NPCDialogType","NPCDialog","imagePath","isQuestionDialog","showGoNextIndicator","setShowGoNextIndicator","flex","TextAndThumbnail","ThumbnailContainer","NPCThumbnail","src","aliceDefaultThumbnail","PressSpaceIndicator","right","TextOnly","pressSpaceGif","SliderType","RPGUISlider","valueMin","valueMax","onChange","sliderId","uuidv4","wasMouseDownFirst","setWasMouseDownFirst","onHandleMouseUp","rpguiSlider","getElementById","value","get_value","Number","onMouseUp","onMouseDown","Input","Slider","GoldSlider","min","max","input"],"mappings":"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"}
1
+ {"version":3,"file":"long-bow.esm.js","sources":["../src/RPGUI/RPGUIRoot.tsx","../src/components/ListMenu.tsx","../src/hooks/useEventListener.ts","../src/RPGUI/RPGUIContainer.tsx","../src/NPCDialog/img/npcDialog/npcThumbnails/alice.png","../src/NPCDialog/img/space.gif","../src/libs/StringHelpers.ts","../src/typography/DynamicText.tsx","../src/NPCDialog/NPCDialogText.tsx","../src/NPCDialog/QuestionDialog/QuestionDialog.tsx","../src/NPCDialog/NPCDialog.tsx","../src/RPGUI/RPGUISlider.tsx"],"sourcesContent":["import React from 'react';\nimport 'rpgui/rpgui.min.css';\nimport 'rpgui/rpgui.min.js';\n\ninterface IProps {\n children: React.ReactNode;\n}\n\n//@ts-ignore\nexport const _RPGUI = RPGUI;\n\nexport const RPGUIRoot: React.FC<IProps> = ({ children }) => {\n return <div className=\"rpgui-content\">{children}</div>;\n};\n","import React from 'react';\nimport styled from 'styled-components';\nimport { RPGUIRoot } from '../RPGUI/RPGUIRoot';\n\ninterface IListMenuOption {\n id: string;\n text: string;\n}\n\nexport interface IListMenuProps {\n x: number;\n y: number;\n options: IListMenuOption[];\n onSelected: (selectedOptionId: string) => void;\n}\n\nexport const ListMenu: React.FC<IListMenuProps> = ({\n options,\n onSelected,\n x,\n y,\n}) => {\n return (\n <RPGUIRoot>\n <Container x={x} y={y}>\n <ul className=\"rpgui-list-imp\" style={{ overflow: 'hidden' }}>\n {options.map((params) => (\n <li\n key={params.text}\n onClick={() => {\n onSelected(params.id);\n }}\n >\n {params.text}\n </li>\n ))}\n </ul>\n </Container>\n </RPGUIRoot>\n );\n};\n\ninterface IContainerProps {\n x?: number;\n y?: number;\n}\n\nconst Container = styled.div<IContainerProps>`\n display: flex;\n flex-direction: column;\n width: 100%;\n justify-content: start;\n align-items: flex-start;\n position: absolute;\n top: ${(props) => props.y || 0}px;\n left: ${(props) => props.x || 0}px;\n`;\n","import React from 'react';\n\n//@ts-ignore\nexport const useEventListener = (type, handler, el = window) => {\n const savedHandler = React.useRef();\n\n React.useEffect(() => {\n savedHandler.current = handler;\n }, [handler]);\n\n React.useEffect(() => {\n //@ts-ignore\n const listener = (e) => savedHandler.current(e);\n\n el.addEventListener(type, listener);\n\n return () => {\n el.removeEventListener(type, listener);\n };\n }, [type, el]);\n};\n","import React from 'react';\nimport styled from 'styled-components';\n\ninterface IProps {\n type: 'framed' | 'framed-golden' | 'framed-golden-2' | 'framed-grey';\n children: React.ReactNode;\n width?: string;\n height?: string;\n}\n\nexport const RPGUIContainer: React.FC<IProps> = ({\n children,\n type,\n width = '50%',\n height,\n}) => {\n return (\n <Container\n width={width}\n height={height || 'auto'}\n className={`rpgui-container ${type}`}\n >\n {children}\n </Container>\n );\n};\n\ninterface IContainerProps {\n width: string;\n height: string;\n}\n\nconst Container = styled.div<IContainerProps>`\n height: ${(props) => props.height};\n width: ${({ width }) => width};\n display: flex;\n flex-wrap: wrap;\n`;\n","const img = require('./alice.png'); export default img;","const img = require('./space.gif'); export default img;","export const chunkString = (str: string, length: number) => {\n return str.match(new RegExp('.{1,' + length + '}', 'g'));\n};\n","import React, { useEffect, useState } from 'react';\nimport styled from 'styled-components';\n\ninterface IProps {\n text: string;\n onFinish?: () => void;\n onStart?: () => void;\n}\n\nexport const DynamicText: React.FC<IProps> = ({ text, onFinish, onStart }) => {\n const [textState, setTextState] = useState<string>('');\n\n useEffect(() => {\n let i = 0;\n const interval = setInterval(() => {\n // on every interval, show one more character\n\n if (i === 0) {\n if (onStart) {\n onStart();\n }\n }\n\n if (i < text.length) {\n setTextState(text.substring(0, i + 1));\n i++;\n } else {\n clearInterval(interval);\n if (onFinish) {\n onFinish();\n }\n }\n }, 50);\n\n return () => {\n clearInterval(interval);\n };\n }, [text]);\n\n return <TextContainer>{textState}</TextContainer>;\n};\n\nconst TextContainer = styled.p`\n font-size: 0.7rem !important;\n color: white;\n text-shadow: 1px 1px 0px #000000;\n letter-spacing: 1.2px;\n word-break: normal;\n`;\n","import React, { useEffect, useState } from 'react';\nimport styled from 'styled-components';\nimport { chunkString } from '../libs/StringHelpers';\nimport { DynamicText } from '../typography/DynamicText';\n\ninterface IProps {\n text: string;\n onClose: () => void;\n onEndStep: () => void;\n onStartStep: () => void;\n}\n\nexport const NPCDialogText: React.FC<IProps> = ({\n text,\n onClose,\n onEndStep,\n onStartStep,\n}) => {\n const textChunks = chunkString(text, 85);\n\n const [chunkIndex, setChunkIndex] = useState<number>(0);\n\n const onHandleSpacePress = (event: KeyboardEvent) => {\n if (event.code === 'Space') {\n const hasNextChunk = textChunks?.[chunkIndex + 1] || false;\n\n if (hasNextChunk) {\n setChunkIndex((prev) => prev + 1);\n } else {\n // if there's no more text chunks, close the dialog\n onClose();\n }\n }\n };\n\n useEffect(() => {\n document.addEventListener('keydown', onHandleSpacePress);\n\n return () => document.removeEventListener('keydown', onHandleSpacePress);\n }, [chunkIndex]);\n\n return (\n <Container>\n <DynamicText\n text={textChunks?.[chunkIndex] || ''}\n onFinish={onEndStep}\n onStart={onStartStep}\n />\n </Container>\n );\n};\n\nconst Container = styled.div``;\n","import React, { useEffect, useState } from 'react';\nimport styled from 'styled-components';\nimport { useEventListener } from '../../hooks/useEventListener';\nimport { DynamicText } from '../../typography/DynamicText';\n\nexport interface IQuestionDialogAnswer {\n id: number;\n text: string;\n nextQuestionId?: number;\n}\n\nexport interface IQuestionDialog {\n id: number;\n text: string;\n answerIds?: number[];\n}\n\nexport interface IProps {\n questions: IQuestionDialog[];\n answers: IQuestionDialogAnswer[];\n onClose: () => void;\n}\n\nexport const QuestionDialog: React.FC<IProps> = ({\n questions,\n answers,\n onClose,\n}) => {\n const [currentQuestion, setCurrentQuestion] = useState(questions[0]);\n\n const [canShowAnswers, setCanShowAnswers] = useState<boolean>(false);\n\n const onGetFirstAnswer = () => {\n if (!currentQuestion.answerIds || currentQuestion.answerIds.length === 0) {\n return null;\n }\n\n const firstAnswerId = currentQuestion.answerIds![0];\n\n return answers.find((answer) => answer.id === firstAnswerId);\n };\n\n const [currentAnswer, setCurrentAnswer] =\n useState<IQuestionDialogAnswer | null>(onGetFirstAnswer()!);\n\n useEffect(() => {\n setCurrentAnswer(onGetFirstAnswer()!);\n }, [currentQuestion]);\n\n const onGetAnswers = (answerIds: number[]) => {\n return answerIds.map((answerId: number) =>\n answers.find((answer) => answer.id === answerId)\n );\n };\n\n const onKeyPress = (e: KeyboardEvent) => {\n switch (e.key) {\n case 'ArrowDown':\n // select next answer, if any.\n // if no next answer, select first answer\n // const nextAnswer = onGetAnswers(currentQuestion.answerIds!).find(\n // (answer) => answer?.id === currentAnswer!.id + 1\n // );\n\n const nextAnswerIndex = onGetAnswers(\n currentQuestion.answerIds!\n ).findIndex((answer) => answer?.id === currentAnswer!.id + 1);\n\n const nextAnswerID = currentQuestion.answerIds![nextAnswerIndex];\n\n // console.log(nextAnswerIndex);\n\n const nextAnswer = onGetAnswers(currentQuestion.answerIds!).find(\n (answer) => answer?.id === nextAnswerID\n );\n\n setCurrentAnswer(nextAnswer || onGetFirstAnswer()!);\n\n break;\n case 'ArrowUp':\n // select previous answer, if any.\n // if no previous answer, select last answer\n\n const previousAnswerIndex = onGetAnswers(\n currentQuestion.answerIds!\n ).findIndex((answer) => answer?.id === currentAnswer!.id - 1);\n\n const previousAnswerID =\n currentQuestion.answerIds &&\n currentQuestion.answerIds[previousAnswerIndex];\n\n const previousAnswer = onGetAnswers(currentQuestion.answerIds!).find(\n (answer) => answer?.id === previousAnswerID\n );\n\n if (previousAnswer) {\n setCurrentAnswer(previousAnswer);\n } else {\n setCurrentAnswer(onGetAnswers(currentQuestion.answerIds!).pop()!);\n }\n\n break;\n case 'Enter':\n setCanShowAnswers(false);\n\n if (!currentAnswer?.nextQuestionId) {\n onClose();\n return;\n } else {\n setCurrentQuestion(\n questions.find(\n (question) => question.id === currentAnswer!.nextQuestionId\n )!\n );\n }\n\n break;\n }\n };\n useEventListener('keydown', onKeyPress);\n\n const onAnswerClick = (answer: IQuestionDialogAnswer) => {\n setCanShowAnswers(false);\n if (answer.nextQuestionId) {\n // if there is a next question, go to it\n setCurrentQuestion(\n questions.find((question) => question.id === answer.nextQuestionId)!\n );\n } else {\n // else, finish dialog!\n onClose();\n }\n };\n\n const onRenderCurrentAnswers = () => {\n const answerIds = currentQuestion.answerIds;\n if (!answerIds) {\n return null;\n }\n\n const answers = onGetAnswers(answerIds);\n\n if (!answers) {\n return null;\n }\n\n return answers.map((answer) => {\n const isSelected = currentAnswer?.id === answer?.id;\n const selectedColor = isSelected ? 'yellow' : 'white';\n\n if (answer) {\n return (\n <AnswerRow key={`answer_${answer.id}`}>\n <AnswerSelectedIcon color={selectedColor}>\n {isSelected ? 'X' : null}\n </AnswerSelectedIcon>\n\n <Answer\n key={answer.id}\n onClick={() => onAnswerClick(answer)}\n color={selectedColor}\n >\n {answer.text}\n </Answer>\n </AnswerRow>\n );\n }\n\n return null;\n });\n };\n\n return (\n <Container>\n <QuestionContainer>\n <DynamicText\n text={currentQuestion.text}\n onStart={() => setCanShowAnswers(false)}\n onFinish={() => setCanShowAnswers(true)}\n />\n </QuestionContainer>\n\n {canShowAnswers && (\n <AnswersContainer>{onRenderCurrentAnswers()}</AnswersContainer>\n )}\n </Container>\n );\n};\n\nconst Container = styled.div`\n display: flex;\n\n word-break: break-all;\n\n box-sizing: border-box;\n justify-content: flex-start;\n align-items: flex-start;\n flex-wrap: wrap;\n`;\n\nconst QuestionContainer = styled.div`\n flex: 100%;\n width: 100%;\n`;\n\nconst AnswersContainer = styled.div`\n flex: 100%;\n`;\n\ninterface IAnswerProps {\n color: string;\n}\n\nconst Answer = styled.p<IAnswerProps>`\n flex: auto;\n color: ${(props) => props.color} !important;\n font-size: 0.65rem !important;\n background: inherit;\n border: none;\n`;\n\nconst AnswerSelectedIcon = styled.span<IAnswerProps>`\n flex: 5% 0 0;\n color: ${(props) => props.color} !important;\n`;\n\nconst AnswerRow = styled.div`\n display: flex;\n flex-wrap: wrap;\n justify-content: center;\n align-items: center;\n margin-bottom: 0.5rem;\n height: 22px;\n\n p {\n line-height: unset;\n margin-top: 0;\n margin-bottom: 0rem;\n }\n`;\n","import React, { useState } from 'react';\nimport styled from 'styled-components';\nimport { IQuestionDialog, IQuestionDialogAnswer } from '..';\nimport { RPGUIContainer } from '../RPGUI/RPGUIContainer';\nimport { RPGUIRoot } from '../RPGUI/RPGUIRoot';\nimport aliceDefaultThumbnail from './img/npcDialog/npcThumbnails/alice.png';\nimport pressSpaceGif from './img/space.gif';\nimport { NPCDialogText } from './NPCDialogText';\nimport { QuestionDialog } from './QuestionDialog/QuestionDialog';\nexport enum NPCDialogType {\n TextOnly = 'TextOnly',\n TextAndThumbnail = 'TextAndThumbnail',\n}\n\nexport interface INPCDialogProps {\n text?: string;\n type: NPCDialogType;\n imagePath?: string;\n onClose?: () => void;\n isQuestionDialog: boolean;\n answers?: IQuestionDialogAnswer[];\n questions?: IQuestionDialog[];\n}\n\nexport const NPCDialog: React.FC<INPCDialogProps> = ({\n text,\n type,\n onClose,\n imagePath,\n isQuestionDialog = false,\n questions,\n answers,\n}) => {\n const [showGoNextIndicator, setShowGoNextIndicator] =\n useState<boolean>(false);\n\n return (\n <RPGUIRoot>\n <RPGUIContainer\n type=\"framed-golden\"\n width={isQuestionDialog ? '600px' : '50%'}\n height={'180px'}\n >\n {isQuestionDialog && questions && answers ? (\n <>\n <TextContainer\n flex={type === NPCDialogType.TextAndThumbnail ? '70%' : '100%'}\n >\n <QuestionDialog\n questions={questions}\n answers={answers}\n onClose={() => {\n if (onClose) {\n onClose();\n }\n }}\n />\n </TextContainer>\n {type === NPCDialogType.TextAndThumbnail && (\n <ThumbnailContainer>\n <NPCThumbnail src={imagePath || aliceDefaultThumbnail} />\n </ThumbnailContainer>\n )}\n </>\n ) : (\n <>\n <Container>\n <TextContainer\n flex={type === NPCDialogType.TextAndThumbnail ? '70%' : '100%'}\n >\n <NPCDialogText\n onStartStep={() => setShowGoNextIndicator(false)}\n onEndStep={() => setShowGoNextIndicator(true)}\n text={text || 'No text provided.'}\n onClose={() => {\n if (onClose) {\n onClose();\n }\n }}\n />\n </TextContainer>\n {type === NPCDialogType.TextAndThumbnail && (\n <ThumbnailContainer>\n <NPCThumbnail src={imagePath || aliceDefaultThumbnail} />\n </ThumbnailContainer>\n )}\n </Container>\n {showGoNextIndicator && (\n <PressSpaceIndicator\n right={type === NPCDialogType.TextOnly ? '1rem' : '10.5rem'}\n src={pressSpaceGif}\n />\n )}\n </>\n )}\n </RPGUIContainer>\n </RPGUIRoot>\n );\n};\n\nconst Container = styled.div`\n display: flex;\n width: 100%;\n height: 100%;\n\n box-sizing: border-box;\n justify-content: center;\n align-items: flex-start;\n position: relative;\n`;\n\ninterface ITextContainerProps {\n flex: string;\n}\n\nconst TextContainer = styled.div<ITextContainerProps>`\n flex: ${({ flex }) => flex} 0 0;\n width: 355px;\n`;\n\nconst ThumbnailContainer = styled.div`\n flex: 30% 0 0;\n display: flex;\n justify-content: flex-end;\n`;\n\nconst NPCThumbnail = styled.img`\n image-rendering: pixelated;\n height: 128px;\n width: 128px;\n`;\n\ninterface IPressSpaceIndicatorProps {\n right: string;\n}\n\nconst PressSpaceIndicator = styled.img<IPressSpaceIndicatorProps>`\n position: absolute;\n right: ${({ right }) => right};\n bottom: 1rem;\n height: 20.7px;\n image-rendering: -webkit-optimize-contrast;\n`;\n","import React, { useState } from 'react';\nimport styled from 'styled-components';\nimport { v4 as uuidv4 } from 'uuid';\nimport { useEventListener } from '../hooks/useEventListener';\nimport { RPGUIRoot, _RPGUI } from './RPGUIRoot';\n\nexport enum SliderType {\n Slider = 'rpgui-slider',\n GoldSlider = 'rpgui-slider golden',\n}\n\nexport interface ISliderProps {\n type: SliderType;\n valueMin: number;\n valueMax: number;\n width: string;\n\n onChange: (value: number) => void;\n}\n\nexport const RPGUISlider: React.FC<ISliderProps> = ({\n type,\n valueMin,\n valueMax,\n width,\n onChange,\n}) => {\n const sliderId = uuidv4();\n\n const [wasMouseDownFirst, setWasMouseDownFirst] = useState<boolean>(false);\n\n useEventListener('mouseup', () => {\n if (wasMouseDownFirst) {\n onHandleMouseUp();\n }\n setWasMouseDownFirst(false);\n });\n\n const onHandleMouseUp = () => {\n const rpguiSlider = document.getElementById(`rpgui-slider-${sliderId}`);\n const value = _RPGUI.get_value(rpguiSlider);\n\n onChange(Number(value));\n };\n\n return (\n <RPGUIRoot>\n <div\n onMouseUp={onHandleMouseUp}\n onMouseDown={() => setWasMouseDownFirst(true)}\n >\n <Input\n className={\n type === SliderType.Slider\n ? SliderType.Slider\n : SliderType.GoldSlider\n }\n type=\"range\"\n style={{ width: width }}\n min={valueMin}\n max={valueMax}\n id={`rpgui-slider-${sliderId}`}\n />\n </div>\n </RPGUIRoot>\n );\n};\n\nconst Input = styled.input`\n opacity: 0;\n`;\n"],"names":["_RPGUI","RPGUI","RPGUIRoot","children","React","className","ListMenu","options","onSelected","x","y","Container","style","overflow","map","params","key","text","onClick","id","styled","div","props","useEventListener","type","handler","el","window","savedHandler","useRef","useEffect","current","listener","e","addEventListener","removeEventListener","RPGUIContainer","width","height","img","chunkString","str","length","match","RegExp","DynamicText","onFinish","onStart","useState","textState","setTextState","i","interval","setInterval","substring","clearInterval","TextContainer","p","NPCDialogText","onClose","onEndStep","onStartStep","textChunks","chunkIndex","setChunkIndex","onHandleSpacePress","event","code","hasNextChunk","prev","document","QuestionDialog","questions","answers","currentQuestion","setCurrentQuestion","canShowAnswers","setCanShowAnswers","onGetFirstAnswer","answerIds","firstAnswerId","find","answer","currentAnswer","setCurrentAnswer","onGetAnswers","answerId","onKeyPress","nextAnswerIndex","findIndex","nextAnswerID","nextAnswer","previousAnswerIndex","previousAnswerID","previousAnswer","pop","nextQuestionId","question","onAnswerClick","onRenderCurrentAnswers","isSelected","selectedColor","AnswerRow","AnswerSelectedIcon","color","Answer","QuestionContainer","AnswersContainer","span","NPCDialogType","NPCDialog","imagePath","isQuestionDialog","showGoNextIndicator","setShowGoNextIndicator","flex","TextAndThumbnail","ThumbnailContainer","NPCThumbnail","src","aliceDefaultThumbnail","PressSpaceIndicator","right","TextOnly","pressSpaceGif","SliderType","RPGUISlider","valueMin","valueMax","onChange","sliderId","uuidv4","wasMouseDownFirst","setWasMouseDownFirst","onHandleMouseUp","rpguiSlider","getElementById","value","get_value","Number","onMouseUp","onMouseDown","Input","Slider","GoldSlider","min","max","input"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@rpg-engine/long-bow",
3
- "version": "0.1.26",
3
+ "version": "0.1.27",
4
4
  "license": "MIT",
5
5
  "main": "dist/index.js",
6
6
  "typings": "dist/index.d.ts",
@@ -2,15 +2,15 @@ import React from 'react';
2
2
  import styled from 'styled-components';
3
3
  import { RPGUIRoot } from '../RPGUI/RPGUIRoot';
4
4
 
5
+ interface IListMenuOption {
6
+ id: string;
7
+ text: string;
8
+ }
9
+
5
10
  export interface IListMenuProps {
6
11
  x: number;
7
12
  y: number;
8
- options: [
9
- {
10
- id: string;
11
- text: string;
12
- }
13
- ];
13
+ options: IListMenuOption[];
14
14
  onSelected: (selectedOptionId: string) => void;
15
15
  }
16
16