itemTemplates.js 9.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436
  1. import i18n from "../i18n";
  2. import { uid } from "../utils";
  3. import Rect from "./Rect";
  4. import Cube from "./Cube";
  5. import Round from "./Round";
  6. import Token from "./Token";
  7. import Image from "./Image";
  8. import Counter from "./Counter";
  9. import Dice from "./Dice";
  10. import DiceImage from "./DiceImage";
  11. import Note from "./Note";
  12. import Zone from "./Zone";
  13. import Screen from "./Screen";
  14. import Meeple from "./Meeple";
  15. import Jewel from "./Jewel";
  16. import Pawn from "./Pawn";
  17. import CheckerBoard from "./CheckerBoard";
  18. import Cylinder from "./Cylinder";
  19. import Generator from "./Generator";
  20. import Anchor from "./Anchor";
  21. import Bag from "./Bag";
  22. import ImageFormFields from "./forms/ImageFormFields";
  23. import CounterFormFields from "./forms/CounterFormFields";
  24. import RectFormFields from "./forms/RectFormFields";
  25. import CubeFormFields from "./forms/CubeFormFields";
  26. import RoundFormFields from "./forms/RoundFormFields";
  27. import DiceFormFields from "./forms/DiceFormFields";
  28. import DiceImageFormFields from "./forms/DiceImageFormFields";
  29. import NoteFormFields from "./forms/NoteFormFields";
  30. import ZoneFormFields from "./forms/ZoneFormFields";
  31. import ScreenFormFields from "./forms/ScreenFormFields";
  32. import TokenFormFields from "./forms/TokenFormFields";
  33. import MeepleFormFields from "./forms/MeepleFormFields";
  34. import JewelFormFields from "./forms/JewelFormFields";
  35. import PawnFormFields from "./forms/PawnFormFields";
  36. import CheckerBoardFormFields from "./forms/CheckerBoardFormFields";
  37. import CylinderFormFields from "./forms/CylinderFormFields";
  38. import GeneratorFormFields from "./forms/GeneratorFormFields";
  39. import AnchorFormFields from "./forms/AnchorFormFields";
  40. import BagFormFields from "./forms/BagFormFields";
  41. const defaultDiceImages = () => [
  42. {
  43. id: uid(),
  44. type: "external",
  45. content: "/game_assets/dice/one.svg",
  46. },
  47. {
  48. id: uid(),
  49. type: "external",
  50. content: "/game_assets/dice/two.svg",
  51. },
  52. {
  53. id: uid(),
  54. type: "external",
  55. content: "/game_assets/dice/three.svg",
  56. },
  57. {
  58. id: uid(),
  59. type: "external",
  60. content: "/game_assets/dice/four.svg",
  61. },
  62. {
  63. id: uid(),
  64. type: "external",
  65. content: "/game_assets/dice/five.svg",
  66. },
  67. {
  68. id: uid(),
  69. type: "external",
  70. content: "/game_assets/dice/six.svg",
  71. },
  72. ];
  73. const resize = (prop) => ({ width, actualWidth, prevState }) => {
  74. let { [prop]: currentSize } = prevState;
  75. currentSize = parseFloat(currentSize);
  76. if (!currentSize || Number.isNaN(Number(currentSize))) {
  77. currentSize = actualWidth;
  78. }
  79. return {
  80. ...prevState,
  81. [prop]: (currentSize + width).toFixed(2),
  82. };
  83. };
  84. const sizeResize = resize("size");
  85. const radiusResize = resize("radius");
  86. const itemTemplates = {
  87. rect: {
  88. component: Rect,
  89. defaultActions: ["lock", "remove"],
  90. availableActions: [
  91. "stack",
  92. "alignAsLine",
  93. "alignAsSquare",
  94. "shuffle",
  95. "clone",
  96. "lock",
  97. "remove",
  98. ],
  99. form: RectFormFields,
  100. name: i18n.t("Rectangle"),
  101. template: {},
  102. },
  103. cube: {
  104. component: Cube,
  105. defaultActions: ["clone", "lock", "remove"],
  106. availableActions: [
  107. "stack",
  108. "alignAsLine",
  109. "alignAsSquare",
  110. "shuffle",
  111. "clone",
  112. "lock",
  113. "remove",
  114. ],
  115. form: CubeFormFields,
  116. name: i18n.t("Cube"),
  117. template: {},
  118. resize: sizeResize,
  119. resizeDirections: { b: true },
  120. },
  121. cylinder: {
  122. component: Cylinder,
  123. defaultActions: ["clone", "lock", "remove"],
  124. availableActions: [
  125. "stack",
  126. "alignAsLine",
  127. "alignAsSquare",
  128. "shuffle",
  129. "clone",
  130. "lock",
  131. "remove",
  132. ],
  133. form: CylinderFormFields,
  134. name: i18n.t("Cylinder"),
  135. template: {},
  136. resize: sizeResize,
  137. resizeDirections: { b: true },
  138. },
  139. round: {
  140. component: Round,
  141. defaultActions: ["clone", "lock", "remove"],
  142. availableActions: [
  143. "stack",
  144. "alignAsLine",
  145. "alignAsSquare",
  146. "shuffle",
  147. "clone",
  148. "lock",
  149. "remove",
  150. ],
  151. form: RoundFormFields,
  152. name: i18n.t("Round"),
  153. template: {},
  154. resize: radiusResize,
  155. resizeDirections: { b: true },
  156. },
  157. token: {
  158. component: Token,
  159. defaultActions: ["clone", "lock", "remove"],
  160. availableActions: [
  161. "stack",
  162. "alignAsLine",
  163. "alignAsSquare",
  164. "shuffle",
  165. "clone",
  166. "lock",
  167. "remove",
  168. ],
  169. form: TokenFormFields,
  170. name: i18n.t("Token"),
  171. template: {},
  172. resize: sizeResize,
  173. resizeDirections: { b: true },
  174. },
  175. meeple: {
  176. component: Meeple,
  177. defaultActions: ["clone", "lock", "remove"],
  178. availableActions: [
  179. "stack",
  180. "alignAsLine",
  181. "alignAsSquare",
  182. "shuffle",
  183. "clone",
  184. "lock",
  185. "remove",
  186. ],
  187. form: MeepleFormFields,
  188. name: i18n.t("Meeple"),
  189. template: {},
  190. resize: sizeResize,
  191. resizeDirections: { b: true },
  192. },
  193. pawn: {
  194. component: Pawn,
  195. defaultActions: ["clone", "lock", "remove"],
  196. availableActions: [
  197. "stack",
  198. "alignAsLine",
  199. "alignAsSquare",
  200. "shuffle",
  201. "clone",
  202. "lock",
  203. "remove",
  204. ],
  205. form: PawnFormFields,
  206. name: i18n.t("Pawn"),
  207. template: {},
  208. resize: sizeResize,
  209. resizeDirections: { b: true },
  210. },
  211. jewel: {
  212. component: Jewel,
  213. defaultActions: ["clone", "lock", "remove"],
  214. availableActions: [
  215. "stack",
  216. "alignAsLine",
  217. "alignAsSquare",
  218. "shuffle",
  219. "clone",
  220. "lock",
  221. "remove",
  222. ],
  223. form: JewelFormFields,
  224. name: i18n.t("Jewel"),
  225. template: {},
  226. resize: sizeResize,
  227. resizeDirections: { b: true },
  228. },
  229. checkerboard: {
  230. component: CheckerBoard,
  231. defaultActions: ["clone", "lock", "remove"],
  232. availableActions: ["clone", "lock", "remove"],
  233. form: CheckerBoardFormFields,
  234. name: i18n.t("Checkerboard"),
  235. template: {
  236. layer: -1,
  237. },
  238. },
  239. image: {
  240. component: Image,
  241. defaultActions: (item) => {
  242. if (item.backContent) {
  243. return [
  244. "flip",
  245. "flipSelf",
  246. "tap",
  247. "stack",
  248. "shuffle",
  249. "clone",
  250. "lock",
  251. "remove",
  252. ];
  253. } else {
  254. return ["tap", "stack", "shuffle", "clone", "lock", "remove"];
  255. }
  256. },
  257. availableActions: (item) => {
  258. if (item.backContent) {
  259. return [
  260. "flip",
  261. "flipSelf",
  262. "tap",
  263. "rotate",
  264. "randomlyRotate",
  265. "stack",
  266. "alignAsLine",
  267. "alignAsSquare",
  268. "shuffle",
  269. "clone",
  270. "lock",
  271. "remove",
  272. ];
  273. } else {
  274. return [
  275. "tap",
  276. "rotate",
  277. "randomlyRotate",
  278. "stack",
  279. "alignAsLine",
  280. "alignAsSquare",
  281. "shuffle",
  282. "clone",
  283. "lock",
  284. "remove",
  285. ];
  286. }
  287. },
  288. form: ImageFormFields,
  289. name: i18n.t("Image"),
  290. template: {},
  291. },
  292. counter: {
  293. component: Counter,
  294. defaultActions: ["clone", "lock", "remove"],
  295. availableActions: ["clone", "lock", "remove"],
  296. form: CounterFormFields,
  297. name: i18n.t("Counter"),
  298. template: {},
  299. resizeDirections: {},
  300. },
  301. dice: {
  302. component: Dice,
  303. defaultActions: ["roll", "clone", "lock", "remove"],
  304. availableActions: [
  305. "roll",
  306. "clone",
  307. "lock",
  308. "remove",
  309. "alignAsLine",
  310. "alignAsSquare",
  311. ],
  312. form: DiceFormFields,
  313. name: i18n.t("Dice"),
  314. template: {},
  315. resizeDirections: {},
  316. },
  317. diceImage: {
  318. component: DiceImage,
  319. defaultActions: ["roll", "clone", "lock", "remove"],
  320. availableActions: [
  321. "roll",
  322. "clone",
  323. "lock",
  324. "remove",
  325. "alignAsLine",
  326. "alignAsSquare",
  327. ],
  328. form: DiceImageFormFields,
  329. name: i18n.t("Image dice"),
  330. template: () => ({
  331. images: defaultDiceImages(),
  332. side: 6,
  333. }),
  334. },
  335. note: {
  336. component: Note,
  337. defaultActions: ["shuffle", "clone", "lock", "remove"],
  338. availableActions: [
  339. "shuffle",
  340. "clone",
  341. "lock",
  342. "remove",
  343. "alignAsLine",
  344. "alignAsSquare",
  345. ],
  346. form: NoteFormFields,
  347. name: i18n.t("Note"),
  348. template: {},
  349. },
  350. anchor: {
  351. component: Anchor,
  352. defaultActions: ["clone", "lock", "remove"],
  353. availableActions: ["clone", "lock", "remove"],
  354. form: AnchorFormFields,
  355. name: i18n.t("Anchor"),
  356. template: {},
  357. resizeDirections: {},
  358. excludeFields: { rotation: true, family: true, grid: true },
  359. },
  360. zone: {
  361. component: Zone,
  362. defaultActions: ["clone", "lock", "remove"],
  363. availableActions: [
  364. "clone",
  365. "lock",
  366. "remove",
  367. "alignAsLine",
  368. "alignAsSquare",
  369. ],
  370. form: ZoneFormFields,
  371. name: i18n.t("Zone"),
  372. template: {
  373. layer: -1,
  374. },
  375. },
  376. screen: {
  377. component: Screen,
  378. defaultActions: ["clone", "lock", "remove"],
  379. availableActions: ["clone", "lock", "remove"],
  380. form: ScreenFormFields,
  381. name: i18n.t("Screen"),
  382. template: {
  383. layer: -2,
  384. },
  385. stateHook: (state, { currentUser }) => {
  386. const { ownedBy } = state;
  387. if (!Array.isArray(ownedBy) || !ownedBy.includes(currentUser.uid)) {
  388. return { ...state, layer: 3.6 };
  389. }
  390. return state;
  391. },
  392. },
  393. generator: {
  394. component: Generator,
  395. defaultActions: ["clone", "lock", "remove"],
  396. availableActions: ["clone", "lock", "remove"],
  397. form: GeneratorFormFields,
  398. excludeFields: { rotation: true },
  399. name: i18n.t("Generator"),
  400. template: { layer: 0 },
  401. resizeDirections: {},
  402. },
  403. bag: {
  404. component: Bag,
  405. defaultActions: ["shuffleBag", "emptyBag", "clone", "lock", "remove"],
  406. availableActions: [
  407. "shuffleBag",
  408. "emptyBag",
  409. "clone",
  410. "lock",
  411. "remove",
  412. ],
  413. form: BagFormFields,
  414. name: i18n.t("Bag"),
  415. template: {
  416. layer: -1,
  417. countervisible: false,
  418. },
  419. },
  420. };
  421. export const itemLibrary = Object.keys(itemTemplates).map((key) => ({
  422. type: key,
  423. ...itemTemplates[key],
  424. uid: uid(),
  425. }));
  426. export default itemTemplates;