From 86556ec6044210ac2656536f536d0757be0b97f2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20Pons?= Date: Wed, 23 Jul 2025 18:09:13 +0200 Subject: [PATCH] Completed first people effects --- db.sqlite | Bin 761856 -> 761856 bytes db.sqlite-shm | Bin 32768 -> 32768 bytes db.sqlite-wal | Bin 41232 -> 0 bytes shared/character-config.json | 1566 +++++++++++++++++----------------- shared/character.util.ts | 10 +- types/character.d.ts | 2 +- 6 files changed, 779 insertions(+), 799 deletions(-) diff --git a/db.sqlite b/db.sqlite index ee2ea2e381af52e3cf50baea243a3894528f9581..a792716fea5b5c0f41bccd89941bab7676af26c8 100644 GIT binary patch delta 3227 zcma)+Yiv|S6vyYjXS#RhZ1-*{6rp_35Va3l&`LC-U=%`PFh~?oO1oXU3v?H{3$(m$ zF9;PuUPUVpO^7ChC<-=lW5fo~L{K9tABd6=G!bG#h<-4J7!zmi?LO|^{op3M|NMV@ z=A1Kk=AMCbO#|nePOA%|I=hYFJ@^sU!(6Cix7jEg9ch`;$A7dkwK` zpuu)n45y%(|1Rcv53`{&spbd%Pe$W@URxTP(thtqQ~GjP;RUu0>>Q9j8IUi66dk;@ zPtIN1r#$+7Yc0$}@H5}T*Kim9gx}#8I1it~88`{Y;V>M4UEn}Jtc4_W@IIb{dAt(~ zY<;3CNtj0UI$R?i^>MC(UgIj$qpnija@Eu$u7>n#SF7}}t3(G^ zvCdpIbjp=b-7vXIbns$Y&0S1ukDcZ_n1jZ8{{lXP5qKZog`+S8yZQ6m1Q}QbF<1%< zVLr@(Yj6d=;X9yU8*ZZLL{F_cPa_jNtsd`bxYkn`=P9f4ltw)@El)!cPphguC1Fo7 zcxo_Db?T`$c%fO(U1&CDO|ua~X18%@&7==^AOO_i;ayOS7Ert!6G(nQ-noNHz z5eM|P&ogw)=P5es^Cmjt^C5KD=c~|LK2OlF&tqi2=>rCO!{>E$$mcaQP#&4lsa|7YzDGVbG98(ZnASyT^KT*J`@)MakgcDvSKh(mGA#N>CoF7DbwWE6%xqviD&h1%@ zTNRr*n6JmB>opO~L4Lg&cGLh;!j2L^GB`3vqLchWa3oGd?mV#^B;H3-7=CtK%*6a# zT9}k#B+AxS5sM44A~a-eDTh_oW`9-@Nvuuf5L+Al%ia1$v|mvFjM8PR&mSwYYSxBw zs9NjGp<=BohjJv#A%8~sox1fS84mel%0p4e>J_W`DVB~%Yps{E6zbNR@<`1}mq)5r zstnpG#p)@eDLJy5LvfZReVX(>ohqW53EzeT>+wmV*w&VCnvo1!c2q?4tU>1u-toz_>k1SDLFXWj`^4HZ&hxz JJv94?{{Xw07;^vs delta 2239 zcmZvcOKcle6o&7-JTtBDy_4818d5ccARfxgPMSD$6WW4`1frq=DJaAl+v9jz$4+eL z)ub6ag$CL{sa(ZEVnKlo3#3K?yaJvR%iNF=S}{!TcAydenh{cGxQW~B3tIQ;c1y8*>^@qIuT;rGT+zZ32VJQ zYDYNK7w+f{tD%m8qv2pju(w~;yxtyf$frew-*>W2{&seKEqluU1@sjV73f7eOh2Jr zaEA-}zDu&}v99cwqiqiPasDNl$+r00Hag?G3TLdZEvGM~na|Vg9m)tRJ6GBK&Q z<;ZV#iO+NoI}7M#`8vWM;w)aqQ?!{%J3N2_9OwlR-t)x(XI`RL(6ucu_!~J!G60m1}QP6 z$qhwd4l@i6M%09!oKU%?D!^WVc8BHtj73vJy;ZT$ATUSF4$}!eZY1^8Ja^uXOv27X z*CS>VGsz@#CNR5LVAd@#k3btemeQh8eO!wLHF>5El&0%IF;#>{MZF_gCsjz)f&5e* z$W7LPY}^Hd!mHQ^jhPJIM$bJP6Au~_rMh4|mQ3lX>69Li@zFYvJ68v?XG>48m+Pe` z*jc2s%^__rr6pif#qm92Fu05y;p!wot0sJ?nsC8t!UjrTu-sWKeZevq17IGdWd7^8 zcv% z+mdIu9OXo}z?j;oooi$Bp z1FjjcTLtp&K0kPY-0={yo=q1 zjT6A6+|#2HHKN5DyIpwKxmw7%&elSbYs*YEJRfJOlRfMG~5SXg`G&%+VM%oAd;<-t#-1bWlGQ@%WZU4c6!T$k| CZBeQK diff --git a/db.sqlite-shm b/db.sqlite-shm index 6a16c43595786e06c3d4d394b2844be6c6b7ac9b..fe9ac2845eca6fe6da8a63cd096d9cf9e24ece10 100644 GIT binary patch delta 62 zcmZo@U}|V!VwQNMJ2}@+mD_?{g3WaDZB8g(1jc88g8x7;F-Kb!KGW*!Y); x5y)Q3&d9j2v6hLEZDM0RBNK?=1oN4JBr_w|#zsXRM%Imu>MV>b8yk;`0|49QMK=Hd diff --git a/db.sqlite-wal b/db.sqlite-wal index 40e1d6ff8e7751592764d7cf7e597d2a5f9ea5c6..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 100644 GIT binary patch literal 0 HcmV?d00001 literal 41232 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 [ div("w-full flex h-px", [div("border-t border-dashed border-light-50 dark:border-dark-50 w-full"), dom('span', { class: "relative left-4" }, [ text(level[0]) ])]), - div("flex flex-row gap-4 justify-center", level[1].map((option, j) => dom("div", { class: ["flex border border-light-50 dark:border-dark-50 px-4 py-2 w-[400px]", { 'hover:border-light-70 dark:hover:border-dark-70 cursor-pointer': (level[0] as any as Level) <= this._builder.character.level, '!border-accent-blue bg-accent-blue bg-opacity-20': this._builder.character.leveling[level[0] as any as Level] === j }], listeners: { click: e => { + div("flex flex-row gap-4 justify-center", level[1].map((option, j) => dom("div", { class: ["flex border border-light-50 dark:border-dark-50 px-4 py-2 w-[400px] relative", { 'hover:border-light-70 dark:hover:border-dark-70 cursor-pointer': (level[0] as any as Level) <= this._builder.character.level, '!border-accent-blue bg-accent-blue bg-opacity-20': this._builder.character.leveling[level[0] as any as Level] === j }], listeners: { click: e => { this._builder.toggleLevelOption(parseInt(level[0]) as Level, j); this.update(); - }}}, [ dom('span', { class: "text-wrap whitespace-pre", text: option.description }) ]))) + }}}, [ dom('span', { class: "text-wrap whitespace-pre", text: option.description }), option.effect.some(e => e.category === 'choice') ? div('absolute -bottom-px -right-px border border-light-50 dark:border-dark-50 bg-light-10 dark:bg-dark-10 hover:border-light-70 dark:hover:border-dark-70 flex p-1 justify-center items-center', [ icon('radix-icons:gear') ]) : undefined ]))) ]); this._content = [ div("flex flex-1 gap-12 px-2 py-4 justify-center items-center", [ @@ -1023,10 +1023,10 @@ class AspectPicker implements BuilderTab ]) ])); - const filterSwitch = dom("div", { class: `group mx-3 w-12 h-6 select-none transition-all border border-light-35 dark:border-dark-35 bg-light-20 dark:bg-dark-20 outline-none data-[state=checked]:bg-light-35 dark:data-[state=checked]:bg-dark-35 hover:border-light-50 dark:hover:border-dark-50 focus:shadow-raw focus:shadow-light-40 dark:focus:shadow-dark-40 data-[disabled]:bg-light-20 dark:data-[disabled]:bg-dark-20 data-[disabled]:border-light-20 dark:data-[disabled]:border-dark-20 relative py-[2px]`, attributes: { "data-state": this._filter ? "ckecked" : "unchecked" }, listeners: { + const filterSwitch = dom("div", { class: `group mx-3 w-12 h-6 select-none transition-all border border-light-35 dark:border-dark-35 bg-light-20 dark:bg-dark-20 outline-none data-[state=checked]:bg-light-35 dark:data-[state=checked]:bg-dark-35 hover:border-light-50 dark:hover:border-dark-50 focus:shadow-raw focus:shadow-light-40 dark:focus:shadow-dark-40 data-[disabled]:bg-light-20 dark:data-[disabled]:bg-dark-20 data-[disabled]:border-light-20 dark:data-[disabled]:border-dark-20 relative py-[2px]`, attributes: { "data-state": this._filter ? "checked" : "unchecked" }, listeners: { click: (e: Event) => { this._filter = !this._filter; - filterSwitch.setAttribute('data-state', this._filter ? "ckecked" : "unchecked"); + filterSwitch.setAttribute('data-state', this._filter ? "checked" : "unchecked"); this.update(); } }}, [ div('block w-[18px] h-[18px] translate-x-[2px] will-change-transform transition-transform bg-light-50 dark:bg-dark-50 group-data-[state=checked]:translate-x-[26px] group-data-[disabled]:bg-light-30 dark:group-data-[disabled]:bg-dark-30 group-data-[disabled]:border-light-30 dark:group-data-[disabled]:border-dark-30') ]); diff --git a/types/character.d.ts b/types/character.d.ts index c61c542..f9f9b5a 100644 --- a/types/character.d.ts +++ b/types/character.d.ts @@ -101,7 +101,7 @@ export type FeatureItem = FeatureEffect | { amount: number; exclusive: boolean; //Disallow to pick the same option twice }; - options: FeatureEffect[]; + options: Array; } export type Feature = { name?: string;