From df7b43fd737671ccbf739990642d0a6c18b51fc6 Mon Sep 17 00:00:00 2001 From: Thomas Andres Gomez Date: Thu, 7 Sep 2023 10:15:42 +0200 Subject: [PATCH] Add basic character sheet and roll feature. Add RollOverlay feature. Add character sheet Add a basic character sheet and a way to throw dice. Link the character sheet to the roll system. change app icon. Small fix. --- app/build.gradle.kts | 2 + app/src/debug/ic_launcher-playstore.png | Bin 0 -> 33347 bytes .../res/drawable/ic_launcher_foreground.xml | 15 + .../res/mipmap-anydpi-v26/ic_launcher.xml | 5 + .../mipmap-anydpi-v26/ic_launcher_round.xml | 5 + .../debug/res/mipmap-hdpi/ic_launcher.webp | Bin 0 -> 1608 bytes .../res/mipmap-hdpi/ic_launcher_round.webp | Bin 0 -> 2974 bytes .../debug/res/mipmap-mdpi/ic_launcher.webp | Bin 0 -> 1010 bytes .../res/mipmap-mdpi/ic_launcher_round.webp | Bin 0 -> 1904 bytes .../debug/res/mipmap-xhdpi/ic_launcher.webp | Bin 0 -> 2200 bytes .../res/mipmap-xhdpi/ic_launcher_round.webp | Bin 0 -> 4138 bytes .../debug/res/mipmap-xxhdpi/ic_launcher.webp | Bin 0 -> 3472 bytes .../res/mipmap-xxhdpi/ic_launcher_round.webp | Bin 0 -> 6828 bytes .../debug/res/mipmap-xxxhdpi/ic_launcher.webp | Bin 0 -> 4786 bytes .../res/mipmap-xxxhdpi/ic_launcher_round.webp | Bin 0 -> 9332 bytes .../res/values/ic_launcher_background.xml | 4 + app/src/main/ic_launcher-playstore.png | Bin 36498 -> 32035 bytes .../com/pixelized/rplexicon/MainActivity.kt | 39 +- ...ertCharacterSheetIntoDisplayableFactory.kt | 186 +++++ .../ConvertRollIntoDisplayableFactory.kt | 125 ++++ .../pixelized/rplexicon/facotry/RollParser.kt | 9 +- .../rplexicon/model/CharacterSheet.kt | 33 +- .../com/pixelized/rplexicon/model/Roll.kt | 108 +++ .../repository/CharacterSheetRepository.kt | 71 +- .../ui/composable/BlurredOverlayHost.kt | 97 +++ .../rplexicon/ui/navigation/HomeNavHost.kt | 12 + .../rplexicon/ui/navigation/ScreenNavHost.kt | 2 + .../screens/ComposableCharacterSheet.kt | 27 + .../screens/character/CharacterSheetScreen.kt | 706 ++++++++++++++++++ .../character/CharacterSheetViewModel.kt | 321 ++++++++ .../character/composable/MasteryCircle.kt | 50 ++ .../character/composable/Proficiency.kt | 120 +++ .../character/composable/SavingThrows.kt | 116 +++ .../ui/screens/character/composable/Stat.kt | 89 +++ .../rplexicon/ui/screens/rolls/RollOverlay.kt | 233 ++++++ .../ui/screens/rolls/RollOverlayViewModel.kt | 63 ++ .../ui/screens/rolls/composable/RollDice.kt | 220 ++++++ .../ui/screens/rolls/composable/ThrowsCard.kt | 346 +++++++++ .../ui/theme/colors/LexiconColors.kt | 71 +- .../ui/theme/typography/LexiconTypography.kt | 1 + .../extentions/AndroidViewModelEx.kt | 6 + .../rplexicon/utilitary/extentions/IntEx.kt | 30 + .../utilitary/extentions/ModifierEx.kt | 63 ++ .../extentions/MutableStateEx+Boolean.kt | 7 + app/src/main/res/drawable/ic_d10_24.xml | 10 + app/src/main/res/drawable/ic_d12_24.xml | 10 + app/src/main/res/drawable/ic_d20_24.xml | 10 + app/src/main/res/drawable/ic_d4_24.xml | 10 + app/src/main/res/drawable/ic_d6_24.xml | 10 + app/src/main/res/drawable/ic_d8_24.xml | 10 + .../res/drawable/ic_launcher_foreground.xml | 19 +- app/src/main/res/mipmap-hdpi/ic_launcher.webp | Bin 1868 -> 2162 bytes .../res/mipmap-hdpi/ic_launcher_round.webp | Bin 3278 -> 4012 bytes app/src/main/res/mipmap-mdpi/ic_launcher.webp | Bin 1030 -> 1414 bytes .../res/mipmap-mdpi/ic_launcher_round.webp | Bin 2078 -> 2616 bytes .../main/res/mipmap-xhdpi/ic_launcher.webp | Bin 2568 -> 2830 bytes .../res/mipmap-xhdpi/ic_launcher_round.webp | Bin 4594 -> 5458 bytes .../main/res/mipmap-xxhdpi/ic_launcher.webp | Bin 3936 -> 4342 bytes .../res/mipmap-xxhdpi/ic_launcher_round.webp | Bin 7498 -> 8962 bytes .../main/res/mipmap-xxxhdpi/ic_launcher.webp | Bin 5780 -> 5750 bytes .../res/mipmap-xxxhdpi/ic_launcher_round.webp | Bin 10036 -> 12136 bytes app/src/main/res/values-fr/strings.xml | 45 ++ .../res/values/ic_launcher_background.xml | 2 +- app/src/main/res/values/strings.xml | 45 ++ 64 files changed, 3264 insertions(+), 89 deletions(-) create mode 100644 app/src/debug/ic_launcher-playstore.png create mode 100644 app/src/debug/res/drawable/ic_launcher_foreground.xml create mode 100644 app/src/debug/res/mipmap-anydpi-v26/ic_launcher.xml create mode 100644 app/src/debug/res/mipmap-anydpi-v26/ic_launcher_round.xml create mode 100644 app/src/debug/res/mipmap-hdpi/ic_launcher.webp create mode 100644 app/src/debug/res/mipmap-hdpi/ic_launcher_round.webp create mode 100644 app/src/debug/res/mipmap-mdpi/ic_launcher.webp create mode 100644 app/src/debug/res/mipmap-mdpi/ic_launcher_round.webp create mode 100644 app/src/debug/res/mipmap-xhdpi/ic_launcher.webp create mode 100644 app/src/debug/res/mipmap-xhdpi/ic_launcher_round.webp create mode 100644 app/src/debug/res/mipmap-xxhdpi/ic_launcher.webp create mode 100644 app/src/debug/res/mipmap-xxhdpi/ic_launcher_round.webp create mode 100644 app/src/debug/res/mipmap-xxxhdpi/ic_launcher.webp create mode 100644 app/src/debug/res/mipmap-xxxhdpi/ic_launcher_round.webp create mode 100644 app/src/debug/res/values/ic_launcher_background.xml create mode 100644 app/src/main/java/com/pixelized/rplexicon/facotry/ConvertCharacterSheetIntoDisplayableFactory.kt create mode 100644 app/src/main/java/com/pixelized/rplexicon/facotry/ConvertRollIntoDisplayableFactory.kt create mode 100644 app/src/main/java/com/pixelized/rplexicon/model/Roll.kt create mode 100644 app/src/main/java/com/pixelized/rplexicon/ui/composable/BlurredOverlayHost.kt create mode 100644 app/src/main/java/com/pixelized/rplexicon/ui/navigation/screens/ComposableCharacterSheet.kt create mode 100644 app/src/main/java/com/pixelized/rplexicon/ui/screens/character/CharacterSheetScreen.kt create mode 100644 app/src/main/java/com/pixelized/rplexicon/ui/screens/character/CharacterSheetViewModel.kt create mode 100644 app/src/main/java/com/pixelized/rplexicon/ui/screens/character/composable/MasteryCircle.kt create mode 100644 app/src/main/java/com/pixelized/rplexicon/ui/screens/character/composable/Proficiency.kt create mode 100644 app/src/main/java/com/pixelized/rplexicon/ui/screens/character/composable/SavingThrows.kt create mode 100644 app/src/main/java/com/pixelized/rplexicon/ui/screens/character/composable/Stat.kt create mode 100644 app/src/main/java/com/pixelized/rplexicon/ui/screens/rolls/RollOverlay.kt create mode 100644 app/src/main/java/com/pixelized/rplexicon/ui/screens/rolls/RollOverlayViewModel.kt create mode 100644 app/src/main/java/com/pixelized/rplexicon/ui/screens/rolls/composable/RollDice.kt create mode 100644 app/src/main/java/com/pixelized/rplexicon/ui/screens/rolls/composable/ThrowsCard.kt create mode 100644 app/src/main/java/com/pixelized/rplexicon/utilitary/extentions/AndroidViewModelEx.kt create mode 100644 app/src/main/java/com/pixelized/rplexicon/utilitary/extentions/IntEx.kt create mode 100644 app/src/main/java/com/pixelized/rplexicon/utilitary/extentions/MutableStateEx+Boolean.kt create mode 100644 app/src/main/res/drawable/ic_d10_24.xml create mode 100644 app/src/main/res/drawable/ic_d12_24.xml create mode 100644 app/src/main/res/drawable/ic_d20_24.xml create mode 100644 app/src/main/res/drawable/ic_d4_24.xml create mode 100644 app/src/main/res/drawable/ic_d6_24.xml create mode 100644 app/src/main/res/drawable/ic_d8_24.xml diff --git a/app/build.gradle.kts b/app/build.gradle.kts index d16df8c..450fb38 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -107,6 +107,8 @@ dependencies { implementation("androidx.compose.material3:material3:1.1.1") debugImplementation("androidx.compose.ui:ui-tooling:1.5.0") + implementation("androidx.constraintlayout:constraintlayout-compose:1.0.1") + // Navigation implementation("androidx.navigation:navigation-compose:2.7.1") diff --git a/app/src/debug/ic_launcher-playstore.png b/app/src/debug/ic_launcher-playstore.png new file mode 100644 index 0000000000000000000000000000000000000000..e3ffc6b305996b2ed207f3357aecbe4b089a30e4 GIT binary patch literal 33347 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 literal 0 HcmV?d00001 diff --git a/app/src/debug/res/drawable/ic_launcher_foreground.xml b/app/src/debug/res/drawable/ic_launcher_foreground.xml new file mode 100644 index 0000000..c27306f --- /dev/null +++ b/app/src/debug/res/drawable/ic_launcher_foreground.xml @@ -0,0 +1,15 @@ + + + + + \ No newline at end of file diff --git a/app/src/debug/res/mipmap-anydpi-v26/ic_launcher.xml b/app/src/debug/res/mipmap-anydpi-v26/ic_launcher.xml new file mode 100644 index 0000000..7353dbd --- /dev/null +++ b/app/src/debug/res/mipmap-anydpi-v26/ic_launcher.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/debug/res/mipmap-anydpi-v26/ic_launcher_round.xml b/app/src/debug/res/mipmap-anydpi-v26/ic_launcher_round.xml new file mode 100644 index 0000000..7353dbd --- /dev/null +++ b/app/src/debug/res/mipmap-anydpi-v26/ic_launcher_round.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/debug/res/mipmap-hdpi/ic_launcher.webp b/app/src/debug/res/mipmap-hdpi/ic_launcher.webp new file mode 100644 index 0000000000000000000000000000000000000000..74016a2440c8d2c1c32225eb550fbaf396e5a6ac GIT binary patch literal 1608 zcmWIYbaQiHV_*n(bqWXzu<$WqV_?vCKOiXZwXJDeu0*^2TUjnaL&kHaUt1n>I4`{O z@Y=0;dn&!RYy6(P=l_B-rC&}@!)rsu5{~g+FmPJ+e+QSb`cf@M$4(~4+uL}5dcQYe zVsNP}FJC>shFP)5#b~bR3YF|Col5P?40YE zb9-AZ3>kl0ErLWd*y(xWX<6OV>xyQCmE`Pgj76X%K^q<`K_R8CHl>?vO zOuuzbJmsY<1LL7fr7R4b!G~v9R%uzS-hI9FTG_Rew=&*;*51>W6c}T@^IQ7MO5F|X zTw|=Yx0-urmCByl>Myu_QrM|Ux%s#M#hwb^Fju3fS-gST5zO?0R3Fc<_DY{8e zKKZnegOqx~r-jod@4s80rz;WNIzjE?o7xZWGpD5`muymZdZRz^JqN&bFEy?<(LslVh}Ijn;DKdFd;^wXEe_W4ECC>FVv5mKybX7r*A- z9zUne?K|`NvKMR2)}A?LbufMF{pVqcVsGqzxp)~>L}pKj*=?14{$u)^n#~(Oc38Jx zs$##-*(Jh!=3v;g(!B0RY$xjZ`v;l-kY;&1-AkycC?ujlRx3PCg&+^sTtmbYe8qe6pNlHtF!7t{9^J#2dX^!ZJu z&$f2)v-@{G`+0EcvaZBJyRuEeH+j#=@A>4L6=nL~^6r$+Vm5vIJayMv%>1~iH8Q6$ z-eOnHHuX6ciQChs)N(Gse4Q9f-pKpG&__X%rgzx_TroIi1I_dva z1-V`Je%!zPdS$h6(Dj8OTUxb4+oN8HPv38RDlWA(h1=M?HBGZ_P3xVrTi4ji6(w%F zG-Xw2=P?bhopb)E#?OAR@@ZNI*V0p$RMb9wRGIsxy+7)~rvx37nH?%i1H*26Dn%B* zR}q|OnHE`Jl2Lrc{r?G-`pFOXRM)d)bc()Pn0xO2U%6i^6-CZ07K zb8YWGcTLYIdBm1r{lFn}=Yc0HJx#>()9z;p6>qkYXSZ)#%XsI1HCtK!T(6t#-`DMb z?%0rfNcjHO#?+jizPtbPB4;xC*>5TOv^`)y`z-FvIe+YuzQ;S8K1|M&b$a!AuY9kX z;<3;h_cm|)R~oL%@Rd=aq4DNb-~U=||F*>XKUfpnz1~#eiib~i(C_+;Z+7c$eO(n; zq5Ftm-~dzM-K$Y~_ut9R{Q!Wkt0gffa4G;rHI gNPquK;zh&0X$ip!46GS9ch}E#`}f5_#d`${08qs#T>t<8 literal 0 HcmV?d00001 diff --git a/app/src/debug/res/mipmap-hdpi/ic_launcher_round.webp b/app/src/debug/res/mipmap-hdpi/ic_launcher_round.webp new file mode 100644 index 0000000000000000000000000000000000000000..48e185f53dec68500639c8429196311f22bd9b65 GIT binary patch literal 2974 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 GWB>qsGN)z$ literal 0 HcmV?d00001 diff --git a/app/src/debug/res/mipmap-mdpi/ic_launcher.webp b/app/src/debug/res/mipmap-mdpi/ic_launcher.webp new file mode 100644 index 0000000000000000000000000000000000000000..b29de0f5902314597577f1e364971970ad0f8d30 GIT binary patch literal 1010 zcmWIYbaQ*f%)k)t>J$(bVBvF@nSnuH{{XkZ)waehxk3Lo{jcok;B*MgwyN9Sr?T># zTUy%tfB)y(-I_e7Kc!30_^@kQn!EojhPK?>ZhadI=UH!OWSHQabK7j4$Mt>B`FmEc zx#)U(TdvENg{d0U=+JC_w(DN_ce}rvs2%NZ99A1VkQHV zXY`-k_x6XkVf5SP+itJ<=Nh;zcvPznr0M@& zWcI86;h)Z)l>fa6rm7D4Vm(T~ZcP0<cSg` z9(}3UE^25tqlas?k$8;b-IF#?>W$494#d1`K6N1L{i>adUP)L=uXD9v3yfu0rGGk; z;mrN>vjiL-HniQgdNMIOB^Ne=gmAF=2S?{vp zrrME|3dyf}cjMX(de*+i#4rZFxj&m&-i| z2bPOdB;VIxZ^%C!Ex4rFeD;F86}qdlf7{4$Pd%O#H$ArL8XM2&i5$Ttk}p>;ec{{R Zc-TLI#kU~q@KWamGaRlam2faH003(v?#TcE literal 0 HcmV?d00001 diff --git a/app/src/debug/res/mipmap-mdpi/ic_launcher_round.webp b/app/src/debug/res/mipmap-mdpi/ic_launcher_round.webp new file mode 100644 index 0000000000000000000000000000000000000000..60210e69c4d795de767a4352decb14615d3302ca GIT binary patch literal 1904 zcmWIYbaTsKXJ80-bqWXzu<(gyXJF9RKfo<;war1nvi_Z{QW8^?){YF#o42-Yo47AY z&AMypd+xK@CwQEnt;L*UvNg5$+{$ZCWr`YW zXv__pJZoy%jcvIK&o!RE`zO0CSNWvj(MxxfpKn{6ygui4ShDAO7G9TUB4}M{^qscYtJuS zm$TdU_B9p(k6Vx4R{xjWnfth7mSyhx{tI!g0;(PQ4JpC8rt3|O*9Nl~HnnV2=jXb6 zVeOy#W#Qe^+LS!*tgKeq7gjT0XC`yd?;!p~=0WrI>gu02o@w-{S^G*lCODV#az(C3 z-Q+_n*Vp-LO$gsB7IfOtM0kC`E53#+tEW5&V0rLg-&l8(RK}{Z6TYuxI+}lpA69&A zlJ|G{tu?AgS5NuXKjXE1)`ftcn25;Ud%;)ORRndei7%JhZl<_4yAq%7mN0KQl^CS#_u`oU4{Q+A++#f?@Ybmety~vYPx&kMO3= zx+!uiQFPsx=)<}0b0o7RjVupj6hwc?b=74)_P0-9^|eDE_gFue<(-(8T`8EW6Lzsq z>Hh7o>u*Bq1=Z%hxV>^$&XFS5OGeDjJpQo^p4F-=i&YFPl1wCCB$O9CFSmbOwdF=$ z27mc2*|qtWeJW`x9M_)8?oB=?EaoBT&S2F&_vGo`^9L96eq?8{`z#jlk@4mFT|r%T z1Gw_j2LczbHZWW9sOFRHLk8A4 z-2d1co^*UnJifax+Lonb=ZZV0e+d=Xu>&O8-4^3Nu=?y~av!FV(Nz#HKzrGNgJo}zkG5_?b9r7>Jb>F=&vR;_3u=HQ_#oy~9^{&QE z{eJ9atOc8(xLw!RsNl%M9li?RCYsC2EGb|$I#XEYe=0CD=IrY?e)(7CJ=n3~v!!5N zPK-MrLu-EC?h1k1C)8YT7d&=(t;x6G!TQUu*4b!q$j>?8dw&1&dGBl7Ud3zexBo76 zJ(%l@3Hz#5sr9wr;^xemeO<*(npcWhb8D`H&EtH|E$*5x_Rf5rzUUTT@ydR`WB21S z_D*^sQJSLcvHsGPEv&(PzgHI2Y8`gF+Prk~wA(Ek7=8O0(*?_v%#qi(X#!O_sQ$YUnAG203i{UqWpOnvN zD#y^Ywb!vM=EAua9)^AX*@F5Lf9_pA^FolShjD+d)LpwD{U6TmIsJg=l)b`t|I0u5 z7!uaTzRgP6caF2jYl6m~y@lOn+j$K4usI#u&;0hJ?UtLxlPB_-{dgf;r`~ZZyG%IHC)LOq1WTcOIEuEd1^J42?&NzJxdntligM zY}@|8E?yvfXJPUUo98O4U-~C9@jJYnUbv%oi~lPA2h0BK|Mz}JaqPQey~#URe*CVP ztNZ;zA}3eQ?rY^+`lCNKotrx27*pDZQlsifPWiV7moiR2c76S4YhG{cj2)weKB0 zLY~Wn-z$0Jxl33gd;7wd@`r!E({Q{Ve|=m3+>AZE85a7VLR$8J%{^fKU`gWdh~K5& z1{>DwQ1CdPs&ZYPN3ulB{`lmxU7IIg=wP{@HZ{d?qW0w59Fk1W=Uet<3#f#iRajB+ z;)JpuW7`h<4C5WV^-um;-1L1aW-{TA{649tsnm;_}>x_ujZ|Wu!mQ6X(dc4&xy?5VaA)mcFXC!l6^HDzf>6za$b4QSE8uhL=HZ{x6SE&kxhDM6 zTYE3jI+mL=sCM(jkcXvx8V`l$7%y7w+4AT5O^=tmU#{BRH}|f}3Zb0aYqoAGpU>PO z%QT^X+S=ZP?;p~7_bX>MFK{lHu{~?=>xR$8eC?kmdYjk%SUE9k?Wv$99mm-Twz7(< z*&lWUtSqj#W2xf%^mp#Htq0@l_xNs*l=gi6r`VIzEBWx>$q!6K>w@R~(f_ve@8RU> koRf~qt__Yfln*k$EZAh@Soq=g#4pd7JjC|OyD%~U0KuQA*Z=?k literal 0 HcmV?d00001 diff --git a/app/src/debug/res/mipmap-xhdpi/ic_launcher.webp b/app/src/debug/res/mipmap-xhdpi/ic_launcher.webp new file mode 100644 index 0000000000000000000000000000000000000000..0d633d38d6f5e00abe589463e31179a41ef948a9 GIT binary patch literal 2200 zcmWIYbaR`)!N3si>J$(bVByok!N8y&e?VN|YFpE`T$OhFx4-)xTzncPUtRHV!Thxc z4!mqgiLP#XHv18uXWfeT4S(0`XMXON_-nhP+N!v`+>-0|wp_!her>t8+s+DZzICoQ zH~P5n?QOZc&zxfExtOxlXTDXakyP~5+|S8R%qA^Lkq|rgl{stsR@wd~_DP#_Z*R-J zy)DZIL{H1z8u)C*y*(?>%{HB1xPJNFx#h9ByN&10%KW}0%2e1vA+vk?`@ii^%qA&! z8ot{Sy>0jAc?zasj64S`z zhQ~K`Rq0K?kmKvZh0n{`&zC)Up>WN+tASrvFbJzJt>*PRyl~3Gz^|`E^ke0Nx6*nmhN^ z@z%?`@^a@%Gx2Zlb-MR_Lk@J_gR&uC+DWW;M}{u zd|LVbbuT^ZB-gjgx`-q(e61@pUOe4jD*p2tDb9jLx30euej2dtY_fp>qdJ3wM#v7! z=bJq5Mbzy7%>1B5EZRlpxZWY|yU%D8~@nA@%2Tw3wPX@OkER589U zk+(JZmq8J}izmG4=W+M;gc`MEovSBc^1li%)BxYJ&z z{&O&?xlv)|f92ARx!2sMl)E=7s$W`}_AHvM{)>q*r~bk}--I}hcx)CBTw24PWWIG? zN1Lqmf%7g?QWon?I52Nobkl)LxpJWi*%Q)5W;=>EJ4_M#tM>O?;=aHfyY)LW6qt%< zmN{Lzxq#c1=fRmMVa+hJ-Q6!${HkQR6Q34_yUg7wP+|T-s6{Bg_FRg^8AjvUN6*;) z%&3hy`OM+X!gs>zY4#`V8Z9^8+7c&Fxpl`WiG*#bwrADXUE*f>C)PPzExF6h?am!r z>-L5s!_Pk7CjAXBYe+C#V>owu&heFVTWo`SRV4n+IwX1Q{N+Wn(wy6vH`ui1WY+JE zoS10;yMOyyUGYYZEe4M~Z?ZaH{atZ9q2X;l&kWI5dXCdJ-P1fE%6h#1W;&E;OFwDM<(Wb{kcoc5pGelj^6&fcq&COS;_ z{Og=_z4=vEF*mE*tY_S7pY#b`mR!I6>5)2>`plpgBGZDto7T^9eO#gKnV^>MzT;v1 zqIRC-is|?7Ze*M0?V@?V^F!h)&TKZp##PEnz4HDo3deugh9te|bO|XscwiCNszZkw z1jYSbQvT>~m{E1U`eKBWOw+~Ue`mwnt$qC*mc0+RnSLWuR$u7h3NyQ_%LBH`7bg9i z-I09aOH=3k1P-^Go_WmL#}cg1#$P(ie#85(dY+w(&b1Gl0#@lV{rFdrw{7e4o@2?L zcl%fuw|!i*;T`*z&AShs_#oGi`%_C|?tTV;uRAA=&T>awtk}o4R)Np>Klh_gQ=BEZ zdVd5Z9dFnu(z&~%f5C|k{qXn)KAXgy9vhl{>ac&zr_WWh=D&U76~X#f@A=r`Z=Q@> z{aGPr)%T#3TcSD-^Wz^G9hxiY7G%^Ouy4}dzXv!)Y9>vSV@o|M7&=cVwr7c_r9ZOFw^O60ZLatn?<(^wFyW?VkmmXD zZO_lozMT+#Dz{{X^*;gTgA5AO*39?*c(N_dhs8f)k$!B#ZDy8+=7N@L{r1M~j>jKz zX3Mdr{Eb=l_v@Liiw6RGHYjOt2nq^~(w}|w>fK9sx2)3cZ)`Mw$g!aIdtthHnX7sX zyS91g$)~s12A1_CJWu@{<2&We{$0#0o87K@ZZSPrurjow^Xl6mbLrA-PMs&=IcZmy zuURn1xV|=X-;vVA&vH%`T>K=$bk)>Y@AEsM`c0A(BJZ?$tj%s&eVT9K`=0+#X7mP6 z4-Mb5pmeG7D!<2%{q{VG@r%{Wh_yMd#JFvarD%BNHnustB0lV@%Wo8xs97d2E+&=P zD6nhY^qLL7AMqRbUz>lEHrHSg!?yF2gf;bv3Xu;?rQ zitV9$nirhgnWNVKyld;3RayoN0dJE_J5|~{diFo(Gv;deC9v!5tUvQ!ORf8-^Zs8w zo4?Bbj*gBx{uR3{0uLNoeezMMVt3!IKH*(&gKxZLxM9F|*+O|ziLhUjJ#V+Tq8#M(=YW;lw?y0U4zQ<+S`+(7`j|Iltac#RLY|o`kTYNxf5Kx4vKYMru!$NXXo(NbRE>a~Yq_xA?$t zp`o13NAOSKAy1)?TX&@IpQp_7?;P7+_U&gR6BwjD8ig_%&+Wc^^xpsN+28&YaDQmv fvuLpX@aFFCyWie6Tl_X)>4<*+k5_)lvLy@vC>1PO literal 0 HcmV?d00001 diff --git a/app/src/debug/res/mipmap-xhdpi/ic_launcher_round.webp b/app/src/debug/res/mipmap-xhdpi/ic_launcher_round.webp new file mode 100644 index 0000000000000000000000000000000000000000..cbb6ac33993cc248bec2b22968b63d2a9433f244 GIT binary patch literal 4138 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 Zo2D;9cWQ+?e_&}_a4K{S%cosli~u$>wWR<6 literal 0 HcmV?d00001 diff --git a/app/src/debug/res/mipmap-xxhdpi/ic_launcher_round.webp b/app/src/debug/res/mipmap-xxhdpi/ic_launcher_round.webp new file mode 100644 index 0000000000000000000000000000000000000000..6eab1d34776461971ac35d9e3b9517a71c605c65 GIT binary patch literal 6828 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 + + #1C1B1F + \ No newline at end of file diff --git a/app/src/main/ic_launcher-playstore.png b/app/src/main/ic_launcher-playstore.png index 1ec693782526c70b5577a0786cb73cb9658a52cc..689d52b28572810f00ff1ae17b251d92ae1b0ba4 100644 GIT binary patch literal 32035 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 D>AeTU literal 36498 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𝔈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 diff --git a/app/src/main/java/com/pixelized/rplexicon/MainActivity.kt b/app/src/main/java/com/pixelized/rplexicon/MainActivity.kt index d164a5d..58eb864 100644 --- a/app/src/main/java/com/pixelized/rplexicon/MainActivity.kt +++ b/app/src/main/java/com/pixelized/rplexicon/MainActivity.kt @@ -2,8 +2,8 @@ package com.pixelized.rplexicon import android.app.Activity import android.os.Bundle -import android.util.Log import androidx.activity.ComponentActivity +import androidx.activity.compose.BackHandler import androidx.activity.compose.setContent import androidx.compose.foundation.layout.WindowInsets import androidx.compose.foundation.layout.fillMaxSize @@ -15,13 +15,19 @@ import androidx.compose.material3.SnackbarHost import androidx.compose.material3.SnackbarHostState import androidx.compose.material3.Surface import androidx.compose.runtime.CompositionLocalProvider +import androidx.compose.runtime.compositionLocalOf import androidx.compose.runtime.remember import androidx.compose.runtime.staticCompositionLocalOf import androidx.compose.ui.Modifier import androidx.core.splashscreen.SplashScreen.Companion.installSplashScreen import androidx.core.view.WindowCompat -import com.pixelized.rplexicon.facotry.RollParser +import androidx.hilt.navigation.compose.hiltViewModel +import com.pixelized.rplexicon.ui.composable.BlurredOverlayHost import com.pixelized.rplexicon.ui.navigation.ScreenNavHost +import com.pixelized.rplexicon.ui.screens.rolls.BlurredRollOverlayHostState +import com.pixelized.rplexicon.ui.screens.rolls.RollOverlay +import com.pixelized.rplexicon.ui.screens.rolls.RollOverlayViewModel +import com.pixelized.rplexicon.ui.screens.rolls.rememberBlurredRollOverlayHostState import com.pixelized.rplexicon.ui.theme.LexiconTheme import dagger.hilt.android.AndroidEntryPoint @@ -31,6 +37,12 @@ val LocalActivity = staticCompositionLocalOf { val LocalSnack = staticCompositionLocalOf { error("SnackbarHostState not available") } +val RollSnack = staticCompositionLocalOf { + error("SnackbarHostState not available") +} +val LocalRollOverlay = compositionLocalOf { + error("LocalRollOverlay not yet ready") +} val NO_WINDOW_INSETS = WindowInsets(0, 0, 0, 0) @AndroidEntryPoint @@ -49,9 +61,15 @@ class MainActivity : ComponentActivity() { setContent { LexiconTheme { + val rollViewModel = hiltViewModel() + val overlay = rememberBlurredRollOverlayHostState( + viewModel = rollViewModel, + ) + CompositionLocalProvider( LocalActivity provides this, - LocalSnack provides remember { SnackbarHostState() } + LocalSnack provides remember { SnackbarHostState() }, + LocalRollOverlay provides overlay, ) { Scaffold( contentWindowInsets = NO_WINDOW_INSETS, @@ -62,7 +80,17 @@ class MainActivity : ComponentActivity() { .padding(paddingValues = padding), color = MaterialTheme.colorScheme.background ) { - ScreenNavHost() + BlurredOverlayHost( + rollOverlayState = overlay, + overlay = { + RollOverlay( + viewModel = rollViewModel, + ) + }, + content = { + ScreenNavHost() + }, + ) } }, snackbarHost = { @@ -72,6 +100,9 @@ class MainActivity : ComponentActivity() { ) } ) + BackHandler(enabled = overlay.isOverlayVisible) { + overlay.hideOverlay() + } } } } diff --git a/app/src/main/java/com/pixelized/rplexicon/facotry/ConvertCharacterSheetIntoDisplayableFactory.kt b/app/src/main/java/com/pixelized/rplexicon/facotry/ConvertCharacterSheetIntoDisplayableFactory.kt new file mode 100644 index 0000000..fe0a0c5 --- /dev/null +++ b/app/src/main/java/com/pixelized/rplexicon/facotry/ConvertCharacterSheetIntoDisplayableFactory.kt @@ -0,0 +1,186 @@ +package com.pixelized.rplexicon.facotry + +import com.pixelized.rplexicon.R +import com.pixelized.rplexicon.model.CharacterSheet +import com.pixelized.rplexicon.ui.screens.character.CharacterSheetUio +import com.pixelized.rplexicon.ui.screens.character.composable.ProficiencyUio +import com.pixelized.rplexicon.ui.screens.character.composable.SavingsThrowsUio +import com.pixelized.rplexicon.ui.screens.character.composable.StatUio +import com.pixelized.rplexicon.utilitary.extentions.modifier +import javax.inject.Inject + +class ConvertCharacterSheetIntoDisplayableFactory @Inject constructor() { + + fun toUio(sheet: CharacterSheet): CharacterSheetUio { + return CharacterSheetUio( + strength = StatUio( + label = R.string.character_sheet_stat_strength, + value = sheet.strength, + modifier = sheet.strength.modifier, + ), + dexterity = StatUio( + label = R.string.character_sheet_stat_dexterity, + value = sheet.dexterity, + modifier = sheet.dexterity.modifier, + ), + constitution = StatUio( + label = R.string.character_sheet_stat_constitution, + value = sheet.constitution, + modifier = sheet.constitution.modifier, + ), + intelligence = StatUio( + label = R.string.character_sheet_stat_intelligence, + value = sheet.intelligence, + modifier = sheet.intelligence.modifier, + ), + wisdom = StatUio( + label = R.string.character_sheet_stat_wisdom, + value = sheet.wisdom, + modifier = sheet.wisdom.modifier, + ), + charisma = StatUio( + label = R.string.character_sheet_stat_charisma, + value = sheet.charisma, + modifier = sheet.charisma.modifier, + ), + strengthSavingThrows = SavingsThrowsUio( + label = R.string.character_sheet_stat_strength, + multiplier = sheet.strengthSavingThrows, + modifier = sheet.strength.modifier + sheet.strengthSavingThrows * sheet.proficiency, + ), + dexteritySavingThrows = SavingsThrowsUio( + label = R.string.character_sheet_stat_dexterity, + multiplier = sheet.dexteritySavingThrows, + modifier = sheet.dexterity.modifier + sheet.dexteritySavingThrows * sheet.proficiency, + ), + constitutionSavingThrows = SavingsThrowsUio( + label = R.string.character_sheet_stat_constitution, + multiplier = sheet.constitutionSavingThrows, + modifier = sheet.constitution.modifier + sheet.constitutionSavingThrows * sheet.proficiency, + ), + intelligenceSavingThrows = SavingsThrowsUio( + label = R.string.character_sheet_stat_intelligence, + multiplier = sheet.intelligenceSavingThrows, + modifier = sheet.intelligence.modifier + sheet.intelligenceSavingThrows * sheet.proficiency, + ), + wisdomSavingThrows = SavingsThrowsUio( + label = R.string.character_sheet_stat_wisdom, + multiplier = sheet.wisdomSavingThrows, + modifier = sheet.wisdom.modifier + sheet.wisdomSavingThrows * sheet.proficiency, + ), + charismaSavingThrows = SavingsThrowsUio( + label = R.string.character_sheet_stat_charisma, + multiplier = sheet.charismaSavingThrows, + modifier = sheet.charisma.modifier + sheet.charismaSavingThrows * sheet.proficiency, + ), + acrobatics = ProficiencyUio( + label = R.string.character_sheet_proficiency_acrobatics, + related = R.string.character_sheet_stat_dexterity_short, + multiplier = sheet.acrobatics, + modifier = sheet.dexterity.modifier + sheet.acrobatics * sheet.proficiency, + ), + animalHandling = ProficiencyUio( + label = R.string.character_sheet_proficiency_animal_handling, + related = R.string.character_sheet_stat_wisdom_short, + multiplier = sheet.animalHandling, + modifier = sheet.wisdom.modifier + sheet.animalHandling * sheet.proficiency, + ), + arcana = ProficiencyUio( + label = R.string.character_sheet_proficiency_arcana, + related = R.string.character_sheet_stat_intelligence_short, + multiplier = sheet.arcana, + modifier = sheet.intelligence.modifier + sheet.arcana * sheet.proficiency, + ), + athletics = ProficiencyUio( + label = R.string.character_sheet_proficiency_athletics, + related = R.string.character_sheet_stat_strength_short, + multiplier = sheet.athletics, + modifier = sheet.strength.modifier + sheet.athletics * sheet.proficiency, + ), + deception = ProficiencyUio( + label = R.string.character_sheet_proficiency_deception, + related = R.string.character_sheet_stat_charisma_short, + multiplier = sheet.deception, + modifier = sheet.charisma.modifier + sheet.deception * sheet.proficiency, + ), + history = ProficiencyUio( + label = R.string.character_sheet_proficiency_history, + related = R.string.character_sheet_stat_intelligence_short, + multiplier = sheet.history, + modifier = sheet.intelligence.modifier + sheet.history * sheet.proficiency, + ), + insight = ProficiencyUio( + label = R.string.character_sheet_proficiency_insight, + related = R.string.character_sheet_stat_wisdom_short, + multiplier = sheet.insight, + modifier = sheet.wisdom.modifier + sheet.insight * sheet.proficiency, + ), + intimidation = ProficiencyUio( + label = R.string.character_sheet_proficiency_intimidation, + related = R.string.character_sheet_stat_charisma_short, + multiplier = sheet.intimidation, + modifier = sheet.charisma.modifier + sheet.intimidation * sheet.proficiency, + ), + investigation = ProficiencyUio( + label = R.string.character_sheet_proficiency_investigation, + related = R.string.character_sheet_stat_intelligence_short, + multiplier = sheet.investigation, + modifier = sheet.intelligence.modifier + sheet.investigation * sheet.proficiency, + ), + medicine = ProficiencyUio( + label = R.string.character_sheet_proficiency_medicine, + related = R.string.character_sheet_stat_wisdom_short, + multiplier = sheet.medicine, + modifier = sheet.wisdom.modifier + sheet.medicine * sheet.proficiency, + ), + nature = ProficiencyUio( + label = R.string.character_sheet_proficiency_nature, + related = R.string.character_sheet_stat_intelligence_short, + multiplier = sheet.nature, + modifier = sheet.intelligence.modifier + sheet.nature * sheet.proficiency, + ), + perception = ProficiencyUio( + label = R.string.character_sheet_proficiency_perception, + related = R.string.character_sheet_stat_wisdom_short, + multiplier = sheet.perception, + modifier = sheet.wisdom.modifier + sheet.perception * sheet.proficiency, + ), + performance = ProficiencyUio( + label = R.string.character_sheet_proficiency_performance, + related = R.string.character_sheet_stat_charisma_short, + multiplier = sheet.performance, + modifier = sheet.charisma.modifier + sheet.performance * sheet.proficiency, + ), + persuasion = ProficiencyUio( + label = R.string.character_sheet_proficiency_persuasion, + related = R.string.character_sheet_stat_charisma_short, + multiplier = sheet.persuasion, + modifier = sheet.charisma.modifier + sheet.persuasion * sheet.proficiency, + ), + religion = ProficiencyUio( + label = R.string.character_sheet_proficiency_religion, + related = R.string.character_sheet_stat_intelligence_short, + multiplier = sheet.religion, + modifier = sheet.intelligence.modifier + sheet.religion * sheet.proficiency, + ), + sleightOfHand = ProficiencyUio( + label = R.string.character_sheet_proficiency_sleight_of_hand, + related = R.string.character_sheet_stat_dexterity_short, + multiplier = sheet.sleightOfHand, + modifier = sheet.dexterity.modifier + sheet.sleightOfHand * sheet.proficiency, + ), + stealth = ProficiencyUio( + label = R.string.character_sheet_proficiency_stealth, + related = R.string.character_sheet_stat_dexterity_short, + multiplier = sheet.stealth, + modifier = sheet.dexterity.modifier + sheet.stealth * sheet.proficiency, + ), + survival = ProficiencyUio( + label = R.string.character_sheet_proficiency_survival, + related = R.string.character_sheet_stat_wisdom_short, + multiplier = sheet.survival, + modifier = sheet.wisdom.modifier + sheet.survival * sheet.proficiency, + ), + ) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/pixelized/rplexicon/facotry/ConvertRollIntoDisplayableFactory.kt b/app/src/main/java/com/pixelized/rplexicon/facotry/ConvertRollIntoDisplayableFactory.kt new file mode 100644 index 0000000..4b76b1a --- /dev/null +++ b/app/src/main/java/com/pixelized/rplexicon/facotry/ConvertRollIntoDisplayableFactory.kt @@ -0,0 +1,125 @@ +package com.pixelized.rplexicon.facotry + +import com.pixelized.rplexicon.model.Roll +import com.pixelized.rplexicon.ui.screens.rolls.composable.RollDiceUio +import com.pixelized.rplexicon.ui.screens.rolls.composable.ThrowsCardUio +import com.pixelized.rplexicon.utilitary.extentions.icon +import com.pixelized.rplexicon.utilitary.extentions.toLabel +import javax.inject.Inject +import kotlin.math.max +import kotlin.math.min + +class ConvertRollIntoDisplayableFactory @Inject constructor() { + + fun roll(roll: Roll): Pair { + + val mainDices = roll.dices.firstOrNull() + val bonusDicesList = roll.dices.subList(fromIndex = 1, toIndex = roll.dices.size) + val allRolledValues = mutableListOf() + + val (rollDice, rollDetail) = mainDices?.let { dice -> + val (label, sum) = dice.roll() + allRolledValues.add(sum) + + val diceIcon = dice.toRollCardUio(result = sum) + val cardDetail = dice.toThrowsCardUio(roll = label, result = sum) + + diceIcon to listOf(cardDetail) + } ?: (null to emptyList()) + + val isCriticalSuccess = rollDice?.isCriticalSuccess ?: false + val isCriticalFailure = rollDice?.isCriticalFailure ?: false + + val diceBonus = bonusDicesList.map { dice -> + val (label, sum) = dice.roll() + allRolledValues.add(sum) + + dice.toThrowsCardUio( + roll = label, + result = sum, + ) + } + + val flatBonus = roll.bonus.map { bonus -> + allRolledValues.add(bonus.value) + + ThrowsCardUio.Detail( + title = bonus.label, + result = "${bonus.value}", + ) + } + + return rollDice to ThrowsCardUio( + title = roll.title, + highlight = roll.highlight, + dice = mainDices?.faces?.icon, + roll = allRolledValues.toLabel(), + result = when { + isCriticalSuccess -> (mainDices?.faces ?: 20).toString() + isCriticalFailure -> "1" + else -> "${allRolledValues.sum()}" + }, + isCriticalSuccess = isCriticalSuccess, + isCriticalFailure = isCriticalFailure, + details = rollDetail + diceBonus + flatBonus, + ) + } +} + +private fun Roll.Dice.toRollCardUio(result: Int) = RollDiceUio( + icon = faces.icon, + isCriticalSuccess = count == 1 && result == faces, + isCriticalFailure = count == 1 && result == 1, + result = "$result", +) + +private fun Roll.Dice.toThrowsCardUio(roll: String, result: Int) = ThrowsCardUio.Detail( + title = title, + throws = ThrowsCardUio.Throw( + dice = faces.icon, + advantage = advantage, + disadvantage = disadvantage, + roll = label, + result = roll, + ), + result = "$result", +) + +private data class RollResult( + val label: String, + val sum: Int, +) + +private fun Roll.Dice.roll(): RollResult { + return when { + advantage -> { + val roll = List(count) { + (Math.random() * faces + 1).toInt() to (Math.random() * faces + 1).toInt() + } + RollResult( + label = roll.joinToString(" + ") { "${it.first}~${it.second}" }, + sum = roll.sumOf { max(it.first, it.second) }, + ) + } + + disadvantage -> { + val roll = List(count) { + (Math.random() * faces + 1).toInt() to (Math.random() * faces + 1).toInt() + } + RollResult( + label = roll.joinToString(" + ") { "${it.first}~${it.second}" }, + sum = roll.sumOf { min(it.first, it.second) }, + ) + } + + else -> { + val roll = List(count) { + (Math.random() * faces + 1).toInt() + } + RollResult( + label = roll.toLabel(), + sum = roll.sum(), + ) + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/pixelized/rplexicon/facotry/RollParser.kt b/app/src/main/java/com/pixelized/rplexicon/facotry/RollParser.kt index 152049d..82b4b3d 100644 --- a/app/src/main/java/com/pixelized/rplexicon/facotry/RollParser.kt +++ b/app/src/main/java/com/pixelized/rplexicon/facotry/RollParser.kt @@ -2,6 +2,7 @@ package com.pixelized.rplexicon.facotry import com.pixelized.rplexicon.model.CharacterSheet import com.pixelized.rplexicon.model.Roll +import com.pixelized.rplexicon.utilitary.extentions.modifier import javax.inject.Inject class RollParser @Inject constructor() { @@ -17,14 +18,15 @@ class RollParser @Inject constructor() { val bonus = bonusRegex.findAll(item).map { bonus -> Roll.Bonus( label = bonus.value, - bonus = bonus.value.parseBonus(characterSheet = characterSheet), + value = bonus.value.parseBonus(characterSheet = characterSheet), ) } dices.toList() to bonus.toList() } ?: (null to null) return Roll( - label = label.toString(), + title = label.toString(), + highlight = null, dices = dices ?: emptyList(), bonus = bonus ?: emptyList(), ) @@ -34,14 +36,13 @@ class RollParser @Inject constructor() { characterSheet: CharacterSheet, ): Int = when (this?.lowercase()) { "bonus" -> characterSheet.proficiency - "force" -> characterSheet.strengthBonus + "force" -> characterSheet.strength.modifier else -> 0 } private fun MatchResult.parseDice(): Roll.Dice { val (count, faces) = destructured return Roll.Dice( - label = value, count = count.toIntOrNull() ?: 0, faces = faces.toIntOrNull() ?: 0, ) diff --git a/app/src/main/java/com/pixelized/rplexicon/model/CharacterSheet.kt b/app/src/main/java/com/pixelized/rplexicon/model/CharacterSheet.kt index 0ed7116..10842c2 100644 --- a/app/src/main/java/com/pixelized/rplexicon/model/CharacterSheet.kt +++ b/app/src/main/java/com/pixelized/rplexicon/model/CharacterSheet.kt @@ -1,8 +1,5 @@ package com.pixelized.rplexicon.model -import androidx.compose.runtime.Stable - -@Stable data class CharacterSheet( val hitPoint: Int, // Point de vie val armorClass: Int, // Classe d'armure @@ -37,35 +34,7 @@ data class CharacterSheet( val sleightOfHand: Int, // DEX, Représentation val stealth: Int, // DEX, Survie val survival: Int, // WIS, Tromperie -) { - val proficiencyBonus: Int = kotlin.math.floor(proficiency / 2 - 5f).toInt() - val strengthBonus: Int = kotlin.math.floor(strength / 2 - 5f).toInt() - val dexterityBonus: Int = kotlin.math.floor(dexterity / 2 - 5f).toInt() - val constitutionBonus: Int = kotlin.math.floor(constitution / 2 - 5f).toInt() - val intelligenceBonus: Int = kotlin.math.floor(intelligence / 2 - 5f).toInt() -} - -@Stable -data class Roll( - val label: String, - val dices: List, - val bonus: List, -) { - @Stable - data class Dice( - val label: String, - val count: Int, - val faces: Int, - ) - - @Stable - data class Bonus( - val label: String, - val bonus: Int, - ) -} - - +) diff --git a/app/src/main/java/com/pixelized/rplexicon/model/Roll.kt b/app/src/main/java/com/pixelized/rplexicon/model/Roll.kt new file mode 100644 index 0000000..2bccd99 --- /dev/null +++ b/app/src/main/java/com/pixelized/rplexicon/model/Roll.kt @@ -0,0 +1,108 @@ +package com.pixelized.rplexicon.model + +import androidx.compose.runtime.Stable + +@Stable +data class Roll( + val title: String, + val highlight: String? = null, + val dices: List, + val bonus: List, +) { + @Stable + data class Dice( + val title: String? = null, + val advantage: Boolean = false, + val disadvantage: Boolean = false, + val count: Int, + val faces: Int, + ) { + val label: String = "${count}d${faces}" + + companion object { + fun d20( + title: String? = null, + advantage: Boolean = false, + disadvantage: Boolean = false, + amount: Int = 1, + ) = Dice( + title = title, + advantage = advantage, + disadvantage = disadvantage, + count = amount, + faces = 20, + ) + + fun d12( + title: String? = null, + advantage: Boolean = false, + disadvantage: Boolean = false, + amount: Int = 1, + ) = Dice( + title = title, + advantage = advantage, + disadvantage = disadvantage, + count = amount, + faces = 12, + ) + + fun d10( + title: String? = null, + advantage: Boolean = false, + disadvantage: Boolean = false, + amount: Int = 1, + ) = Dice( + title = title, + advantage = advantage, + disadvantage = disadvantage, + count = amount, + faces = 10, + ) + + fun d8( + title: String? = null, + advantage: Boolean = false, + disadvantage: Boolean = false, + amount: Int = 1, + ) = Dice( + title = title, + advantage = advantage, + disadvantage = disadvantage, + count = amount, + faces = 8, + ) + + fun d6( + title: String? = null, + advantage: Boolean = false, + disadvantage: Boolean = false, + amount: Int = 1, + ) = Dice( + title = title, + advantage = advantage, + disadvantage = disadvantage, + count = amount, + faces = 6, + ) + + fun d4( + title: String? = null, + advantage: Boolean = false, + disadvantage: Boolean = false, + amount: Int = 1, + ) = Dice( + title = title, + advantage = advantage, + disadvantage = disadvantage, + count = amount, + faces = 4, + ) + } + } + + @Stable + data class Bonus( + val label: String, + val value: Int, + ) +} diff --git a/app/src/main/java/com/pixelized/rplexicon/repository/CharacterSheetRepository.kt b/app/src/main/java/com/pixelized/rplexicon/repository/CharacterSheetRepository.kt index 6c7c48e..aa7ac07 100644 --- a/app/src/main/java/com/pixelized/rplexicon/repository/CharacterSheetRepository.kt +++ b/app/src/main/java/com/pixelized/rplexicon/repository/CharacterSheetRepository.kt @@ -1,12 +1,13 @@ package com.pixelized.rplexicon.repository -import android.util.Log import com.google.api.services.sheets.v4.model.ValueRange import com.pixelized.rplexicon.facotry.RollParser import com.pixelized.rplexicon.model.CharacterSheet import com.pixelized.rplexicon.utilitary.exceptions.IncompatibleSheetStructure import com.pixelized.rplexicon.utilitary.exceptions.ServiceNotReady import com.pixelized.rplexicon.utilitary.extentions.sheet +import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.StateFlow import javax.inject.Inject import javax.inject.Singleton @@ -15,6 +16,13 @@ class CharacterSheetRepository @Inject constructor( private val googleRepository: GoogleSheetServiceRepository, private val rollParser: RollParser, ) { + private val _data = MutableStateFlow>(emptyMap()) + val data: StateFlow> get() = _data + + fun find(name: String?): CharacterSheet? { + return name?.let { _data.value[name] } + } + @Throws(ServiceNotReady::class, IncompatibleSheetStructure::class, Exception::class) suspend fun fetchCharacterSheet() { googleRepository.fetch { sheet -> @@ -27,8 +35,8 @@ class CharacterSheetRepository @Inject constructor( @Throws(IncompatibleSheetStructure::class) private fun updateData(data: ValueRange?) { val sheet = data?.values?.sheet() - var id = 0 + var id = 0 val bru = sheet?.map { (it as? List<*>)?.get(1) } val characterSheet = CharacterSheet( @@ -41,12 +49,18 @@ class CharacterSheetRepository @Inject constructor( intelligence = (bru?.get(Sheet.INTELLIGENCE) as? String)?.toIntOrNull() ?: 0, wisdom = (bru?.get(Sheet.WISDOM) as? String)?.toIntOrNull() ?: 0, charisma = (bru?.get(Sheet.CHARISMA) as? String)?.toIntOrNull() ?: 0, - strengthSavingThrows = (bru?.get(Sheet.STRENGTH_SAVING_THROWS) as? String)?.toIntOrNull() ?: 0, - dexteritySavingThrows = (bru?.get(Sheet.DEXTERITY_SAVING_THROWS) as? String)?.toIntOrNull() ?: 0, - constitutionSavingThrows = (bru?.get(Sheet.CONSTITUTION_SAVING_THROWS) as? String)?.toIntOrNull() ?: 0, - intelligenceSavingThrows = (bru?.get(Sheet.INTELLIGENCE_SAVING_THROWS) as? String)?.toIntOrNull() ?: 0, - wisdomSavingThrows = (bru?.get(Sheet.WISDOM_SAVING_THROWS) as? String)?.toIntOrNull() ?: 0, - charismaSavingThrows = (bru?.get(Sheet.CHARISMA_SAVING_THROWS) as? String)?.toIntOrNull() ?: 0, + strengthSavingThrows = (bru?.get(Sheet.STRENGTH_SAVING_THROWS) as? String)?.toIntOrNull() + ?: 0, + dexteritySavingThrows = (bru?.get(Sheet.DEXTERITY_SAVING_THROWS) as? String)?.toIntOrNull() + ?: 0, + constitutionSavingThrows = (bru?.get(Sheet.CONSTITUTION_SAVING_THROWS) as? String)?.toIntOrNull() + ?: 0, + intelligenceSavingThrows = (bru?.get(Sheet.INTELLIGENCE_SAVING_THROWS) as? String)?.toIntOrNull() + ?: 0, + wisdomSavingThrows = (bru?.get(Sheet.WISDOM_SAVING_THROWS) as? String)?.toIntOrNull() + ?: 0, + charismaSavingThrows = (bru?.get(Sheet.CHARISMA_SAVING_THROWS) as? String)?.toIntOrNull() + ?: 0, acrobatics = (bru?.get(Sheet.ACROBATICS) as? String)?.toIntOrNull() ?: 0, animalHandling = (bru?.get(Sheet.ANIMAL_HANDLING) as? String)?.toIntOrNull() ?: 0, arcana = (bru?.get(Sheet.ARCANA) as? String)?.toIntOrNull() ?: 0, @@ -71,8 +85,9 @@ class CharacterSheetRepository @Inject constructor( rollParser.parseRoll(characterSheet = characterSheet, value = it?.toString()) } - Log.e(TAG, characterSheet.toString()) - Log.e(TAG, rolls.toString()) + _data.tryEmit( + hashMapOf("bru" to characterSheet) + ) } companion object { @@ -98,23 +113,23 @@ class CharacterSheetRepository @Inject constructor( const val INTELLIGENCE_SAVING_THROWS = 13 const val WISDOM_SAVING_THROWS = 14 const val CHARISMA_SAVING_THROWS = 15 - const val ACROBATICS = 16 - const val ANIMAL_HANDLING = 17 - const val ARCANA = 18 - const val ATHLETICS = 19 - const val DECEPTION = 20 - const val HISTORY = 21 - const val INSIGHT = 22 - const val INTIMIDATION = 23 - const val INVESTIGATION = 24 - const val MEDICINE = 25 - const val NATURE = 26 - const val PERCEPTION = 27 - const val PERFORMANCE = 28 - const val PERSUASION = 29 - const val RELIGION = 30 - const val SLEIGHT_OF_HAND = 31 - const val STEALTH = 32 - const val SURVIVAL = 33 + const val ACROBATICS = 16 // Acrobaties + const val ARCANA = 17 // Arcanes + const val ATHLETICS = 18 // Athlétisme + const val STEALTH = 19 // Discrétion + const val ANIMAL_HANDLING = 20 // Dressage + const val SLEIGHT_OF_HAND = 21 // Escamotage + const val HISTORY = 22 // Histoire + const val INTIMIDATION = 23 // Intimidation + const val INSIGHT = 24 // Intuition + const val INVESTIGATION = 25 // Investigation + const val MEDICINE = 26 // Médecine + const val NATURE = 27 // Nature + const val PERCEPTION = 28 // Perception + const val PERSUASION = 29 // Persuasion + const val RELIGION = 30 // Religion + const val PERFORMANCE = 31 // Représentation + const val SURVIVAL = 32 // Survie + const val DECEPTION = 33 // Tromperie } } \ No newline at end of file diff --git a/app/src/main/java/com/pixelized/rplexicon/ui/composable/BlurredOverlayHost.kt b/app/src/main/java/com/pixelized/rplexicon/ui/composable/BlurredOverlayHost.kt new file mode 100644 index 0000000..739d642 --- /dev/null +++ b/app/src/main/java/com/pixelized/rplexicon/ui/composable/BlurredOverlayHost.kt @@ -0,0 +1,97 @@ +package com.pixelized.rplexicon.ui.composable + +import androidx.compose.animation.AnimatedVisibility +import androidx.compose.animation.core.animateDpAsState +import androidx.compose.animation.fadeIn +import androidx.compose.animation.fadeOut +import androidx.compose.animation.slideInVertically +import androidx.compose.animation.slideOutVertically +import androidx.compose.foundation.background +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.systemBarsPadding +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Surface +import androidx.compose.runtime.Composable +import androidx.compose.runtime.MutableState +import androidx.compose.runtime.Stable +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.saveable.rememberSaveable +import androidx.compose.runtime.setValue +import androidx.compose.ui.Modifier +import androidx.compose.ui.draw.blur +import androidx.compose.ui.platform.LocalDensity +import androidx.compose.ui.unit.dp +import com.pixelized.rplexicon.utilitary.extentions.clickableInterceptor +import com.pixelized.rplexicon.utilitary.extentions.lexicon + +@Stable +interface BlurredOverlayHostState { + val isOverlayVisible: Boolean + fun showOverlay() + fun hideOverlay() +} + +@Stable +private class BlurredOverlayHostStateImpl( + rollOverlayVisibilityState: MutableState, +) : BlurredOverlayHostState { + override var isOverlayVisible by rollOverlayVisibilityState + + override fun showOverlay() { + isOverlayVisible = true + } + + override fun hideOverlay() { + isOverlayVisible = false + } +} + +@Composable +@Stable +fun rememberBlurredOverlayHostState(): BlurredOverlayHostState { + val rollOverlayVisibilityState = rememberSaveable { mutableStateOf(false) } + return remember { + BlurredOverlayHostStateImpl( + rollOverlayVisibilityState = rollOverlayVisibilityState + ) + } +} + +@Composable +fun BlurredOverlayHost( + rollOverlayState: BlurredOverlayHostState = rememberBlurredOverlayHostState(), + overlay: @Composable () -> Unit, + content: @Composable () -> Unit, +) { + val density = LocalDensity.current + + Surface { + val blurs = animateDpAsState( + targetValue = if (rollOverlayState.isOverlayVisible) 4.dp else 0.dp, + label = "RollOverlayHostBlurAnimation", + ) + Box( + modifier = Modifier.blur(radius = blurs.value), + content = { content() }, + ) + AnimatedVisibility( + visible = rollOverlayState.isOverlayVisible, + enter = fadeIn() + slideInVertically { with(density) { 64.dp.roundToPx() } }, + exit = fadeOut() + slideOutVertically { with(density) { 64.dp.roundToPx() } }, + content = { + Box( + modifier = Modifier + .clickableInterceptor() + .background(brush = MaterialTheme.lexicon.colorScheme.rollOverlayBrush) + .fillMaxSize() + .systemBarsPadding(), + ) { + overlay() + } + }, + ) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/pixelized/rplexicon/ui/navigation/HomeNavHost.kt b/app/src/main/java/com/pixelized/rplexicon/ui/navigation/HomeNavHost.kt index 39e381a..d584933 100644 --- a/app/src/main/java/com/pixelized/rplexicon/ui/navigation/HomeNavHost.kt +++ b/app/src/main/java/com/pixelized/rplexicon/ui/navigation/HomeNavHost.kt @@ -5,6 +5,7 @@ import androidx.compose.foundation.lazy.LazyListState import androidx.compose.material3.BottomAppBar import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.material3.Icon +import androidx.compose.material3.IconButton import androidx.compose.material3.MaterialTheme import androidx.compose.material3.NavigationBarItem import androidx.compose.material3.Scaffold @@ -27,6 +28,7 @@ import androidx.compose.ui.unit.dp import androidx.navigation.NavHostController import androidx.navigation.compose.NavHost import androidx.navigation.compose.rememberNavController +import com.pixelized.rplexicon.LocalRollOverlay import com.pixelized.rplexicon.LocalSnack import com.pixelized.rplexicon.R import com.pixelized.rplexicon.ui.navigation.pages.LEXICON_LIST_ROUTE @@ -38,6 +40,7 @@ import com.pixelized.rplexicon.ui.navigation.pages.composableQuests import com.pixelized.rplexicon.ui.navigation.pages.navigateToLexicon import com.pixelized.rplexicon.ui.navigation.pages.navigateToLocation import com.pixelized.rplexicon.ui.navigation.pages.navigateToQuestList +import com.pixelized.rplexicon.ui.navigation.screens.navigateToCharacterSheet val LocalPageNavHost = staticCompositionLocalOf { error("LocalScreenNavHost not ready") @@ -62,6 +65,15 @@ fun HomeNavHost( title = { Text(text = stringResource(id = R.string.app_name)) }, + actions = { + val screen = LocalScreenNavHost.current + IconButton(onClick = { screen.navigateToCharacterSheet() }) { + Icon( + painter = painterResource(id = R.drawable.ic_d20_24), + contentDescription = null + ) + } + } ) }, snackbarHost = { diff --git a/app/src/main/java/com/pixelized/rplexicon/ui/navigation/ScreenNavHost.kt b/app/src/main/java/com/pixelized/rplexicon/ui/navigation/ScreenNavHost.kt index 322f196..0fa4d2d 100644 --- a/app/src/main/java/com/pixelized/rplexicon/ui/navigation/ScreenNavHost.kt +++ b/app/src/main/java/com/pixelized/rplexicon/ui/navigation/ScreenNavHost.kt @@ -11,6 +11,7 @@ import androidx.navigation.compose.NavHost import androidx.navigation.compose.rememberNavController import com.pixelized.rplexicon.ui.navigation.screens.AUTHENTICATION_ROUTE import com.pixelized.rplexicon.ui.navigation.screens.composableAuthentication +import com.pixelized.rplexicon.ui.navigation.screens.composableCharacterSheet import com.pixelized.rplexicon.ui.navigation.screens.composableHome import com.pixelized.rplexicon.ui.navigation.screens.composableLexiconDetail import com.pixelized.rplexicon.ui.navigation.screens.composableLexiconSearch @@ -47,6 +48,7 @@ fun ScreenNavHost( composableLexiconSearch() composableQuestDetail() composableLocationDetail() + composableCharacterSheet() } } } diff --git a/app/src/main/java/com/pixelized/rplexicon/ui/navigation/screens/ComposableCharacterSheet.kt b/app/src/main/java/com/pixelized/rplexicon/ui/navigation/screens/ComposableCharacterSheet.kt new file mode 100644 index 0000000..5104bae --- /dev/null +++ b/app/src/main/java/com/pixelized/rplexicon/ui/navigation/screens/ComposableCharacterSheet.kt @@ -0,0 +1,27 @@ +package com.pixelized.rplexicon.ui.navigation.screens + +import androidx.navigation.NavGraphBuilder +import androidx.navigation.NavHostController +import androidx.navigation.NavOptionsBuilder +import com.pixelized.rplexicon.ui.navigation.NavigationAnimation +import com.pixelized.rplexicon.ui.navigation.animatedComposable +import com.pixelized.rplexicon.ui.screens.character.CharacterSheetScreen + +private const val ROUTE = "characterSheet" +const val CHARACTER_SHEET_ROUTE = ROUTE + +fun NavGraphBuilder.composableCharacterSheet() { + animatedComposable( + route = CHARACTER_SHEET_ROUTE, + animation = NavigationAnimation.Push, + ) { + CharacterSheetScreen() + } +} + +fun NavHostController.navigateToCharacterSheet( + option: NavOptionsBuilder.() -> Unit = {}, +) { + val route = ROUTE + navigate(route = route, builder = option) +} \ No newline at end of file diff --git a/app/src/main/java/com/pixelized/rplexicon/ui/screens/character/CharacterSheetScreen.kt b/app/src/main/java/com/pixelized/rplexicon/ui/screens/character/CharacterSheetScreen.kt new file mode 100644 index 0000000..4f255c7 --- /dev/null +++ b/app/src/main/java/com/pixelized/rplexicon/ui/screens/character/CharacterSheetScreen.kt @@ -0,0 +1,706 @@ +package com.pixelized.rplexicon.ui.screens.character + +import android.content.res.Configuration +import androidx.activity.compose.BackHandler +import androidx.compose.foundation.ScrollState +import androidx.compose.foundation.clickable +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.systemBarsPadding +import androidx.compose.foundation.rememberScrollState +import androidx.compose.foundation.verticalScroll +import androidx.compose.material3.ExperimentalMaterial3Api +import androidx.compose.material3.Icon +import androidx.compose.material3.IconButton +import androidx.compose.material3.Scaffold +import androidx.compose.material3.Surface +import androidx.compose.material3.Text +import androidx.compose.material3.TopAppBar +import androidx.compose.runtime.Composable +import androidx.compose.runtime.Stable +import androidx.compose.runtime.remember +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.res.painterResource +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.unit.dp +import androidx.hilt.navigation.compose.hiltViewModel +import com.pixelized.rplexicon.LocalRollOverlay +import com.pixelized.rplexicon.NO_WINDOW_INSETS +import com.pixelized.rplexicon.R +import com.pixelized.rplexicon.ui.navigation.LocalScreenNavHost +import com.pixelized.rplexicon.ui.screens.character.composable.Proficiency +import com.pixelized.rplexicon.ui.screens.character.composable.ProficiencyUio +import com.pixelized.rplexicon.ui.screens.character.composable.SavingsThrows +import com.pixelized.rplexicon.ui.screens.character.composable.SavingsThrowsUio +import com.pixelized.rplexicon.ui.screens.character.composable.Stat +import com.pixelized.rplexicon.ui.screens.character.composable.StatUio +import com.pixelized.rplexicon.ui.theme.LexiconTheme + +@Stable +data class CharacterSheetUio( + val strength: StatUio, + val dexterity: StatUio, + val constitution: StatUio, + val intelligence: StatUio, + val wisdom: StatUio, + val charisma: StatUio, + val strengthSavingThrows: SavingsThrowsUio, + val dexteritySavingThrows: SavingsThrowsUio, + val constitutionSavingThrows: SavingsThrowsUio, + val intelligenceSavingThrows: SavingsThrowsUio, + val wisdomSavingThrows: SavingsThrowsUio, + val charismaSavingThrows: SavingsThrowsUio, + val acrobatics: ProficiencyUio, + val animalHandling: ProficiencyUio, + val arcana: ProficiencyUio, + val athletics: ProficiencyUio, + val deception: ProficiencyUio, + val history: ProficiencyUio, + val insight: ProficiencyUio, + val intimidation: ProficiencyUio, + val investigation: ProficiencyUio, + val medicine: ProficiencyUio, + val nature: ProficiencyUio, + val perception: ProficiencyUio, + val performance: ProficiencyUio, + val persuasion: ProficiencyUio, + val religion: ProficiencyUio, + val sleightOfHand: ProficiencyUio, + val stealth: ProficiencyUio, + val survival: ProficiencyUio, +) + +@Composable +fun CharacterSheetScreen( + viewModel: CharacterSheetViewModel = hiltViewModel(), +) { + val screen = LocalScreenNavHost.current + val overlay = LocalRollOverlay.current + + Surface( + modifier = Modifier.fillMaxSize(), + ) { + viewModel.sheet.value?.let { + CharacterSheetContent( + modifier = Modifier + .fillMaxSize() + .systemBarsPadding(), + state = rememberScrollState(), + sheet = it, + onBack = { + screen.popBackStack() + }, + onStrength = { + val roll = viewModel.strengthRoll() + overlay.prepareRoll(roll = roll) + overlay.showOverlay() + }, + onDexterity = { + val roll = viewModel.dexterityRoll() + overlay.prepareRoll(roll = roll) + overlay.showOverlay() + }, + onConstitution = { + val roll = viewModel.constitutionRoll() + overlay.prepareRoll(roll = roll) + overlay.showOverlay() + }, + onIntelligence = { + val roll = viewModel.intelligenceRoll() + overlay.prepareRoll(roll = roll) + overlay.showOverlay() + }, + onWisdom = { + val roll = viewModel.wisdomRoll() + overlay.prepareRoll(roll = roll) + overlay.showOverlay() + }, + onCharisma = { + val roll = viewModel.charismaRoll() + overlay.prepareRoll(roll = roll) + overlay.showOverlay() + }, + onStrengthSavingThrows = { + val roll = viewModel.strengthSavingThrowsRoll() + overlay.prepareRoll(roll = roll) + overlay.showOverlay() + }, + onDexteritySavingThrows = { + val roll = viewModel.dexteritySavingThrowsRoll() + overlay.prepareRoll(roll = roll) + overlay.showOverlay() + }, + onConstitutionSavingThrows = { + val roll = viewModel.constitutionSavingThrowsRoll() + overlay.prepareRoll(roll = roll) + overlay.showOverlay() + }, + onIntelligenceSavingThrows = { + val roll = viewModel.intelligenceSavingThrowsRoll() + overlay.prepareRoll(roll = roll) + overlay.showOverlay() + }, + onWisdomSavingThrows = { + val roll = viewModel.wisdomSavingThrowsRoll() + overlay.prepareRoll(roll = roll) + overlay.showOverlay() + }, + onCharismaSavingThrows = { + val roll = viewModel.charismaSavingThrowsRoll() + overlay.prepareRoll(roll = roll) + overlay.showOverlay() + }, + onAcrobatics = { + val roll = viewModel.acrobaticsRoll() + overlay.prepareRoll(roll = roll) + overlay.showOverlay() + }, + onAnimalHandling = { + val roll = viewModel.animalHandlingRoll() + overlay.prepareRoll(roll = roll) + overlay.showOverlay() + }, + onArcana = { + val roll = viewModel.arcanaRoll() + overlay.prepareRoll(roll = roll) + overlay.showOverlay() + }, + onAthletics = { + val roll = viewModel.athleticsRoll() + overlay.prepareRoll(roll = roll) + overlay.showOverlay() + }, + onDeception = { + val roll = viewModel.deceptionRoll() + overlay.prepareRoll(roll = roll) + overlay.showOverlay() + }, + onHistory = { + val roll = viewModel.historyRoll() + overlay.prepareRoll(roll = roll) + overlay.showOverlay() + }, + onInsight = { + val roll = viewModel.insightRoll() + overlay.prepareRoll(roll = roll) + overlay.showOverlay() + }, + onIntimidation = { + val roll = viewModel.intimidationRoll() + overlay.prepareRoll(roll = roll) + overlay.showOverlay() + }, + onInvestigation = { + val roll = viewModel.investigationRoll() + overlay.prepareRoll(roll = roll) + overlay.showOverlay() + }, + onMedicine = { + val roll = viewModel.medicineRoll() + overlay.prepareRoll(roll = roll) + overlay.showOverlay() + }, + onNature = { + val roll = viewModel.natureRoll() + overlay.prepareRoll(roll = roll) + overlay.showOverlay() + }, + onPerception = { + val roll = viewModel.perceptionRoll() + overlay.prepareRoll(roll = roll) + overlay.showOverlay() + }, + onPerformance = { + val roll = viewModel.performanceRoll() + overlay.prepareRoll(roll = roll) + overlay.showOverlay() + }, + onPersuasion = { + val roll = viewModel.persuasionRoll() + overlay.prepareRoll(roll = roll) + overlay.showOverlay() + }, + onReligion = { + val roll = viewModel.religionRoll() + overlay.prepareRoll(roll = roll) + overlay.showOverlay() + }, + onSleightOfHand = { + val roll = viewModel.sleightOfHandRoll() + overlay.prepareRoll(roll = roll) + overlay.showOverlay() + }, + onStealth = { + val roll = viewModel.stealthRoll() + overlay.prepareRoll(roll = roll) + overlay.showOverlay() + }, + onSurvival = { + val roll = viewModel.survivalRoll() + overlay.prepareRoll(roll = roll) + overlay.showOverlay() + }, + ) + } + + BackHandler(enabled = overlay.isOverlayVisible) { + overlay.hideOverlay() + } + } +} + +@OptIn(ExperimentalMaterial3Api::class) +@Composable +private fun CharacterSheetContent( + modifier: Modifier = Modifier, + state: ScrollState, + sheet: CharacterSheetUio, + onBack: () -> Unit, + onStrength: () -> Unit, + onDexterity: () -> Unit, + onConstitution: () -> Unit, + onIntelligence: () -> Unit, + onWisdom: () -> Unit, + onCharisma: () -> Unit, + onStrengthSavingThrows: () -> Unit, + onDexteritySavingThrows: () -> Unit, + onConstitutionSavingThrows: () -> Unit, + onIntelligenceSavingThrows: () -> Unit, + onWisdomSavingThrows: () -> Unit, + onCharismaSavingThrows: () -> Unit, + onAcrobatics: () -> Unit, + onAnimalHandling: () -> Unit, + onArcana: () -> Unit, + onAthletics: () -> Unit, + onDeception: () -> Unit, + onHistory: () -> Unit, + onInsight: () -> Unit, + onIntimidation: () -> Unit, + onInvestigation: () -> Unit, + onMedicine: () -> Unit, + onNature: () -> Unit, + onPerception: () -> Unit, + onPerformance: () -> Unit, + onPersuasion: () -> Unit, + onReligion: () -> Unit, + onSleightOfHand: () -> Unit, + onStealth: () -> Unit, + onSurvival: () -> Unit, +) { + Scaffold( + modifier = modifier, + containerColor = Color.Transparent, + contentWindowInsets = NO_WINDOW_INSETS, + topBar = { + TopAppBar( + navigationIcon = { + IconButton(onClick = onBack) { + Icon( + painter = painterResource(id = R.drawable.ic_arrow_back_ios_new_24), + contentDescription = null + ) + } + }, + title = { + Text( + text = stringResource(id = R.string.character_sheet_title), + ) + }, + ) + }, + ) { paddingValues -> + Surface( + modifier = Modifier + .verticalScroll(state = state) + .padding(paddingValues = paddingValues), + ) { + Column( + verticalArrangement = Arrangement.spacedBy(16.dp), + ) { + Column( + verticalArrangement = Arrangement.spacedBy(16.dp), + ) { + Row( + modifier = Modifier.padding(horizontal = 16.dp), + horizontalArrangement = Arrangement.spacedBy(16.dp), + ) { + Stat( + modifier = Modifier.weight(1f), + stat = sheet.strength, + onClick = onStrength, + ) + Stat( + modifier = Modifier.weight(1f), + stat = sheet.dexterity, + onClick = onDexterity, + ) + Stat( + modifier = Modifier.weight(1f), + stat = sheet.constitution, + onClick = onConstitution, + ) + } + Row( + modifier = Modifier.padding(horizontal = 16.dp), + horizontalArrangement = Arrangement.spacedBy(16.dp), + ) { + Stat( + modifier = Modifier.weight(1f), + stat = sheet.intelligence, + onClick = onIntelligence, + ) + Stat( + modifier = Modifier.weight(1f), + stat = sheet.wisdom, + onClick = onWisdom, + ) + Stat( + modifier = Modifier.weight(1f), + stat = sheet.charisma, + onClick = onCharisma, + ) + } + } + + Row( + modifier = Modifier.padding(horizontal = 16.dp), + horizontalArrangement = Arrangement.spacedBy(8.dp), + ) { + Column( + modifier = Modifier.weight(1f), + verticalArrangement = Arrangement.spacedBy(8.dp), + ) { + SavingsThrows( + savingsThrows = sheet.strengthSavingThrows, + onClick = onStrengthSavingThrows, + ) + SavingsThrows( + savingsThrows = sheet.dexteritySavingThrows, + onClick = onDexteritySavingThrows, + ) + SavingsThrows( + savingsThrows = sheet.constitutionSavingThrows, + onClick = onConstitutionSavingThrows, + ) + } + Column( + modifier = Modifier.weight(1f), + verticalArrangement = Arrangement.spacedBy(8.dp), + ) { + SavingsThrows( + savingsThrows = sheet.intelligenceSavingThrows, + onClick = onIntelligenceSavingThrows, + ) + SavingsThrows( + savingsThrows = sheet.wisdomSavingThrows, + onClick = onWisdomSavingThrows, + ) + SavingsThrows( + savingsThrows = sheet.charismaSavingThrows, + onClick = onCharismaSavingThrows, + ) + } + } + + Column { + Proficiency( + modifier = Modifier.clickable(onClick = onAcrobatics), + proficiency = sheet.acrobatics, + ) + Proficiency( + modifier = Modifier.clickable(onClick = onAnimalHandling), + proficiency = sheet.animalHandling, + ) + Proficiency( + modifier = Modifier.clickable(onClick = onArcana), + proficiency = sheet.arcana, + ) + Proficiency( + modifier = Modifier.clickable(onClick = onAthletics), + proficiency = sheet.athletics, + ) + Proficiency( + modifier = Modifier.clickable(onClick = onDeception), + proficiency = sheet.deception, + ) + Proficiency( + modifier = Modifier.clickable(onClick = onHistory), + proficiency = sheet.history, + ) + Proficiency( + modifier = Modifier.clickable(onClick = onInsight), + proficiency = sheet.insight, + ) + Proficiency( + modifier = Modifier.clickable(onClick = onIntimidation), + proficiency = sheet.intimidation, + ) + Proficiency( + modifier = Modifier.clickable(onClick = onInvestigation), + proficiency = sheet.investigation, + ) + Proficiency( + modifier = Modifier.clickable(onClick = onMedicine), + proficiency = sheet.medicine, + ) + Proficiency( + modifier = Modifier.clickable(onClick = onNature), + proficiency = sheet.nature, + ) + Proficiency( + modifier = Modifier.clickable(onClick = onPerception), + proficiency = sheet.perception, + ) + Proficiency( + modifier = Modifier.clickable(onClick = onPerformance), + proficiency = sheet.performance, + ) + Proficiency( + modifier = Modifier.clickable(onClick = onPersuasion), + proficiency = sheet.persuasion, + ) + Proficiency( + modifier = Modifier.clickable(onClick = onReligion), + proficiency = sheet.religion, + ) + Proficiency( + modifier = Modifier.clickable(onClick = onSleightOfHand), + proficiency = sheet.sleightOfHand, + ) + Proficiency( + modifier = Modifier.clickable(onClick = onStealth), + proficiency = sheet.stealth, + ) + Proficiency( + modifier = Modifier.clickable(onClick = onSurvival), + proficiency = sheet.survival, + ) + } + } + } + } +} + +@Composable +@Preview(uiMode = Configuration.UI_MODE_NIGHT_NO) +@Preview(uiMode = Configuration.UI_MODE_NIGHT_YES) +private fun CharacterScreenPreview() { + LexiconTheme { + val bru = remember { + CharacterSheetUio( + strength = StatUio( + label = R.string.character_sheet_stat_strength, + value = 16, + modifier = 3, + ), + dexterity = StatUio( + label = R.string.character_sheet_stat_dexterity, + value = 10, + modifier = 0, + ), + constitution = StatUio( + label = R.string.character_sheet_stat_constitution, + value = 16, + modifier = 3, + ), + intelligence = StatUio( + label = R.string.character_sheet_stat_intelligence, + value = 8, + modifier = 1, + ), + wisdom = StatUio( + label = R.string.character_sheet_stat_wisdom, + value = 14, + modifier = 2, + ), + charisma = StatUio( + label = R.string.character_sheet_stat_charisma, + value = 10, + modifier = 0 + ), + strengthSavingThrows = SavingsThrowsUio( + label = R.string.character_sheet_stat_strength, + multiplier = 1, + modifier = 5, + ), + dexteritySavingThrows = SavingsThrowsUio( + label = R.string.character_sheet_stat_dexterity, + multiplier = 0, + modifier = 0, + ), + constitutionSavingThrows = SavingsThrowsUio( + label = R.string.character_sheet_stat_constitution, + multiplier = 1, + modifier = +5, + ), + intelligenceSavingThrows = SavingsThrowsUio( + label = R.string.character_sheet_stat_intelligence, + multiplier = 0, + modifier = -1, + ), + wisdomSavingThrows = SavingsThrowsUio( + label = R.string.character_sheet_stat_wisdom, + multiplier = 0, + modifier = +2, + ), + charismaSavingThrows = SavingsThrowsUio( + label = R.string.character_sheet_stat_charisma, + multiplier = 0, + modifier = +0, + ), + acrobatics = ProficiencyUio( + label = R.string.character_sheet_proficiency_acrobatics, + related = R.string.character_sheet_stat_dexterity_short, + multiplier = 0, + modifier = +0, + ), + animalHandling = ProficiencyUio( + label = R.string.character_sheet_proficiency_animal_handling, + related = R.string.character_sheet_stat_wisdom_short, + multiplier = 0, + modifier = 2, + ), + arcana = ProficiencyUio( + label = R.string.character_sheet_proficiency_arcana, + related = R.string.character_sheet_stat_intelligence_short, + multiplier = 0, + modifier = -1, + ), + athletics = ProficiencyUio( + label = R.string.character_sheet_proficiency_athletics, + related = R.string.character_sheet_stat_strength_short, + multiplier = 1, + modifier = 5, + ), + deception = ProficiencyUio( + label = R.string.character_sheet_proficiency_deception, + related = R.string.character_sheet_stat_charisma_short, + multiplier = 0, + modifier = 0, + ), + history = ProficiencyUio( + label = R.string.character_sheet_proficiency_history, + related = R.string.character_sheet_stat_intelligence_short, + multiplier = 0, + modifier = -1, + ), + insight = ProficiencyUio( + label = R.string.character_sheet_proficiency_insight, + related = R.string.character_sheet_stat_wisdom_short, + multiplier = 1, + modifier = 4, + ), + intimidation = ProficiencyUio( + label = R.string.character_sheet_proficiency_intimidation, + related = R.string.character_sheet_stat_charisma_short, + multiplier = 1, + modifier = 2, + ), + investigation = ProficiencyUio( + label = R.string.character_sheet_proficiency_investigation, + related = R.string.character_sheet_stat_intelligence_short, + multiplier = 0, + modifier = -1, + ), + medicine = ProficiencyUio( + label = R.string.character_sheet_proficiency_medicine, + related = R.string.character_sheet_stat_wisdom_short, + multiplier = 0, + modifier = 2, + ), + nature = ProficiencyUio( + label = R.string.character_sheet_proficiency_nature, + related = R.string.character_sheet_stat_intelligence_short, + multiplier = 0, + modifier = -1, + ), + perception = ProficiencyUio( + label = R.string.character_sheet_proficiency_perception, + related = R.string.character_sheet_stat_wisdom_short, + multiplier = 1, + modifier = 4, + ), + performance = ProficiencyUio( + label = R.string.character_sheet_proficiency_performance, + related = R.string.character_sheet_stat_charisma_short, + multiplier = 0, + modifier = 0, + ), + persuasion = ProficiencyUio( + label = R.string.character_sheet_proficiency_persuasion, + related = R.string.character_sheet_stat_charisma_short, + multiplier = 0, + modifier = 0, + ), + religion = ProficiencyUio( + label = R.string.character_sheet_proficiency_religion, + related = R.string.character_sheet_stat_intelligence_short, + multiplier = 0, + modifier = -1, + ), + sleightOfHand = ProficiencyUio( + label = R.string.character_sheet_proficiency_sleight_of_hand, + related = R.string.character_sheet_stat_dexterity_short, + multiplier = 0, + modifier = 0, + ), + stealth = ProficiencyUio( + label = R.string.character_sheet_proficiency_stealth, + related = R.string.character_sheet_stat_dexterity_short, + multiplier = 0, + modifier = 0, + ), + survival = ProficiencyUio( + label = R.string.character_sheet_proficiency_survival, + related = R.string.character_sheet_stat_wisdom_short, + multiplier = 1, + modifier = 4, + ), + ) + } + + Surface { + CharacterSheetContent( + modifier = Modifier.fillMaxSize(), + state = rememberScrollState(), + sheet = bru, + onBack = { }, + onStrength = { }, + onDexterity = { }, + onConstitution = { }, + onIntelligence = { }, + onWisdom = { }, + onCharisma = { }, + onStrengthSavingThrows = { }, + onDexteritySavingThrows = { }, + onConstitutionSavingThrows = { }, + onIntelligenceSavingThrows = { }, + onWisdomSavingThrows = { }, + onCharismaSavingThrows = { }, + onAcrobatics = { }, + onAnimalHandling = { }, + onArcana = { }, + onAthletics = { }, + onDeception = { }, + onHistory = { }, + onInsight = { }, + onIntimidation = { }, + onInvestigation = { }, + onMedicine = { }, + onNature = { }, + onPerception = { }, + onPerformance = { }, + onPersuasion = { }, + onReligion = { }, + onSleightOfHand = { }, + onStealth = { }, + onSurvival = { }, + ) + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/pixelized/rplexicon/ui/screens/character/CharacterSheetViewModel.kt b/app/src/main/java/com/pixelized/rplexicon/ui/screens/character/CharacterSheetViewModel.kt new file mode 100644 index 0000000..d84f47b --- /dev/null +++ b/app/src/main/java/com/pixelized/rplexicon/ui/screens/character/CharacterSheetViewModel.kt @@ -0,0 +1,321 @@ +package com.pixelized.rplexicon.ui.screens.character + +import android.app.Application +import androidx.annotation.StringRes +import androidx.compose.runtime.State +import androidx.compose.runtime.mutableStateOf +import androidx.lifecycle.AndroidViewModel +import androidx.lifecycle.viewModelScope +import com.pixelized.rplexicon.R +import com.pixelized.rplexicon.facotry.ConvertCharacterSheetIntoDisplayableFactory +import com.pixelized.rplexicon.model.CharacterSheet +import com.pixelized.rplexicon.model.Roll +import com.pixelized.rplexicon.repository.CharacterSheetRepository +import com.pixelized.rplexicon.utilitary.extentions.context +import com.pixelized.rplexicon.utilitary.extentions.modifier +import dagger.hilt.android.lifecycle.HiltViewModel +import kotlinx.coroutines.launch +import javax.inject.Inject + +@HiltViewModel +class CharacterSheetViewModel @Inject constructor( + application: Application, + repository: CharacterSheetRepository, + factory: ConvertCharacterSheetIntoDisplayableFactory, +) : AndroidViewModel(application = application) { + + private lateinit var model: CharacterSheet + private val _sheet = mutableStateOf(null) + val sheet: State get() = _sheet + + init { + viewModelScope.launch { + repository.fetchCharacterSheet() + _sheet.value = repository.find("bru")?.let { + model = it + factory.toUio(sheet = it) + } + } + } + + fun strengthRoll(): Roll = statRoll( + abilityRes = R.string.character_sheet_stat_strength, + abilityValue = model.strength, + ) + + fun dexterityRoll(): Roll = statRoll( + abilityRes = R.string.character_sheet_stat_dexterity, + abilityValue = model.dexterity, + ) + + fun constitutionRoll(): Roll = statRoll( + abilityRes = R.string.character_sheet_stat_constitution, + abilityValue = model.constitution, + ) + + fun intelligenceRoll(): Roll = statRoll( + abilityRes = R.string.character_sheet_stat_intelligence, + abilityValue = model.intelligence, + ) + + fun wisdomRoll(): Roll = statRoll( + abilityRes = R.string.character_sheet_stat_wisdom, + abilityValue = model.wisdom, + ) + + fun charismaRoll(): Roll = statRoll( + abilityRes = R.string.character_sheet_stat_charisma, + abilityValue = model.charisma, + ) + + fun strengthSavingThrowsRoll(): Roll = savingThrowRoll( + abilityRes = R.string.character_sheet_stat_strength, + abilityValue = model.strength, + masteryLevel = model.strengthSavingThrows, + ) + + fun dexteritySavingThrowsRoll(): Roll = savingThrowRoll( + abilityRes = R.string.character_sheet_stat_dexterity, + abilityValue = model.dexterity, + masteryLevel = model.dexteritySavingThrows, + ) + + fun constitutionSavingThrowsRoll(): Roll = savingThrowRoll( + abilityRes = R.string.character_sheet_stat_constitution, + abilityValue = model.constitution, + masteryLevel = model.constitutionSavingThrows, + ) + + fun intelligenceSavingThrowsRoll(): Roll = savingThrowRoll( + abilityRes = R.string.character_sheet_stat_intelligence, + abilityValue = model.intelligence, + masteryLevel = model.intelligenceSavingThrows, + ) + + fun wisdomSavingThrowsRoll(): Roll = savingThrowRoll( + abilityRes = R.string.character_sheet_stat_wisdom, + abilityValue = model.wisdom, + masteryLevel = model.wisdomSavingThrows, + ) + + fun charismaSavingThrowsRoll(): Roll = savingThrowRoll( + abilityRes = R.string.character_sheet_stat_charisma, + abilityValue = model.charisma, + masteryLevel = model.charismaSavingThrows, + ) + + fun acrobaticsRoll(): Roll = abilityRoll( + abilityRes = R.string.character_sheet_proficiency_acrobatics, + relatedRes = R.string.character_sheet_stat_dexterity, + abilityValue = model.dexterity, + masteryLevel = model.acrobatics, + ) + + fun animalHandlingRoll(): Roll = abilityRoll( + abilityRes = R.string.character_sheet_proficiency_animal_handling, + relatedRes = R.string.character_sheet_stat_wisdom, + abilityValue = model.wisdom, + masteryLevel = model.animalHandling, + ) + + fun arcanaRoll(): Roll = abilityRoll( + abilityRes = R.string.character_sheet_proficiency_arcana, + relatedRes = R.string.character_sheet_stat_intelligence, + abilityValue = model.intelligence, + masteryLevel = model.arcana, + ) + + fun athleticsRoll(): Roll = abilityRoll( + abilityRes = R.string.character_sheet_proficiency_athletics, + relatedRes = R.string.character_sheet_stat_strength, + abilityValue = model.strength, + masteryLevel = model.athletics, + ) + + fun deceptionRoll(): Roll = abilityRoll( + abilityRes = R.string.character_sheet_proficiency_deception, + relatedRes = R.string.character_sheet_stat_charisma, + abilityValue = model.charisma, + masteryLevel = model.deception, + ) + + fun historyRoll(): Roll = abilityRoll( + abilityRes = R.string.character_sheet_proficiency_history, + relatedRes = R.string.character_sheet_stat_intelligence, + abilityValue = model.intelligence, + masteryLevel = model.history, + ) + + fun insightRoll(): Roll = abilityRoll( + abilityRes = R.string.character_sheet_proficiency_insight, + relatedRes = R.string.character_sheet_stat_wisdom, + abilityValue = model.wisdom, + masteryLevel = model.insight, + ) + + fun intimidationRoll(): Roll = abilityRoll( + abilityRes = R.string.character_sheet_proficiency_intimidation, + relatedRes = R.string.character_sheet_stat_charisma, + abilityValue = model.charisma, + masteryLevel = model.intimidation, + ) + + fun investigationRoll(): Roll = abilityRoll( + abilityRes = R.string.character_sheet_proficiency_investigation, + relatedRes = R.string.character_sheet_stat_intelligence, + abilityValue = model.intelligence, + masteryLevel = model.investigation, + ) + + fun medicineRoll(): Roll = abilityRoll( + abilityRes = R.string.character_sheet_proficiency_medicine, + relatedRes = R.string.character_sheet_stat_wisdom, + abilityValue = model.wisdom, + masteryLevel = model.medicine, + ) + + fun natureRoll(): Roll = abilityRoll( + abilityRes = R.string.character_sheet_proficiency_nature, + relatedRes = R.string.character_sheet_stat_intelligence, + abilityValue = model.intelligence, + masteryLevel = model.nature, + ) + + fun perceptionRoll(): Roll = abilityRoll( + abilityRes = R.string.character_sheet_proficiency_perception, + relatedRes = R.string.character_sheet_stat_wisdom, + abilityValue = model.wisdom, + masteryLevel = model.perception, + ) + + fun performanceRoll(): Roll = abilityRoll( + abilityRes = R.string.character_sheet_proficiency_performance, + relatedRes = R.string.character_sheet_stat_charisma, + abilityValue = model.charisma, + masteryLevel = model.performance, + ) + + fun persuasionRoll(): Roll = abilityRoll( + abilityRes = R.string.character_sheet_proficiency_persuasion, + relatedRes = R.string.character_sheet_stat_charisma, + abilityValue = model.charisma, + masteryLevel = model.persuasion, + ) + + fun religionRoll(): Roll = abilityRoll( + abilityRes = R.string.character_sheet_proficiency_religion, + relatedRes = R.string.character_sheet_stat_intelligence, + abilityValue = model.intelligence, + masteryLevel = model.religion, + ) + + fun sleightOfHandRoll(): Roll = abilityRoll( + abilityRes = R.string.character_sheet_proficiency_sleight_of_hand, + relatedRes = R.string.character_sheet_stat_dexterity, + abilityValue = model.dexterity, + masteryLevel = model.sleightOfHand, + ) + + fun stealthRoll(): Roll = abilityRoll( + abilityRes = R.string.character_sheet_proficiency_stealth, + relatedRes = R.string.character_sheet_stat_dexterity, + abilityValue = model.dexterity, + masteryLevel = model.stealth, + ) + + fun survivalRoll(): Roll = abilityRoll( + abilityRes = R.string.character_sheet_proficiency_survival, + relatedRes = R.string.character_sheet_stat_wisdom, + abilityValue = model.wisdom, + masteryLevel = model.survival, + ) + +// ////////////////////////////////////// +// region: Helpers + + private fun statRoll( + abilityRes: Int, + abilityValue: Int, + ): Roll { + val ability = context.getString(abilityRes) + return Roll( + title = context.getString(R.string.dice_roll_check_title, ability.uppercase()), + highlight = ability, + dices = listOf( + Roll.Dice.d20( + title = context.getString(R.string.dice_roll_check_detail, ability) + ), + ), + bonus = listOf( + Roll.Bonus( + label = context.getString(R.string.dice_roll_bonus_detail, ability), + value = abilityValue.modifier + ) + ), + ) + } + + private fun savingThrowRoll( + @StringRes abilityRes: Int, + abilityValue: Int, + masteryLevel: Int, + masteryValue: Int = model.proficiency, + ): Roll { + val ability = context.getString(abilityRes) + return Roll( + title = context.getString(R.string.dice_roll_saving_throw_title, ability.uppercase()), + highlight = ability, + dices = listOf( + Roll.Dice.d20( + title = context.getString(R.string.dice_roll_saving_throw_detail, ability) + ), + ), + bonus = listOf( + Roll.Bonus( + label = context.getString( + if (masteryLevel == 2) R.string.dice_roll_mastery_expertise else R.string.dice_roll_mastery_proficiency, + context.getString(R.string.dice_roll_mastery_saving_throw) + ), + value = masteryValue * masteryLevel, + ), + Roll.Bonus( + label = context.getString(R.string.dice_roll_bonus_detail, ability), + value = abilityValue.modifier + ) + ), + ) + } + + private fun abilityRoll( + @StringRes abilityRes: Int, + @StringRes relatedRes: Int, + abilityValue: Int, + masteryLevel: Int, + masteryValue: Int = model.proficiency, + ): Roll { + val ability = context.getString(abilityRes) + val related = context.getString(relatedRes) + return Roll( + title = context.getString(R.string.dice_roll_check_title, ability.uppercase()), + highlight = ability, + dices = listOf( + Roll.Dice.d20( + title = context.getString(R.string.dice_roll_check_detail, ability) + ), + ), + bonus = listOf( + Roll.Bonus( + label = context.getString( + if (masteryLevel == 2) R.string.dice_roll_mastery_expertise else R.string.dice_roll_mastery_proficiency, + ability + ), + value = masteryValue * masteryLevel, + ), + Roll.Bonus( + label = context.getString(R.string.dice_roll_bonus_detail, related), + value = abilityValue.modifier + ) + ), + ) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/pixelized/rplexicon/ui/screens/character/composable/MasteryCircle.kt b/app/src/main/java/com/pixelized/rplexicon/ui/screens/character/composable/MasteryCircle.kt new file mode 100644 index 0000000..7cee3ae --- /dev/null +++ b/app/src/main/java/com/pixelized/rplexicon/ui/screens/character/composable/MasteryCircle.kt @@ -0,0 +1,50 @@ +package com.pixelized.rplexicon.ui.screens.character.composable + +import androidx.compose.foundation.background +import androidx.compose.foundation.border +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.size +import androidx.compose.foundation.shape.CircleShape +import androidx.compose.material3.MaterialTheme +import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +import androidx.compose.ui.unit.Dp +import androidx.compose.ui.unit.dp + +@Composable +fun MasteryCircle( + modifier: Modifier = Modifier, + multiplier: Int, + size: Dp = 12.dp, +) { + when (multiplier) { + 0 -> Box( + modifier = modifier + .size(size = size) + .border( + width = 1.dp, + color = MaterialTheme.colorScheme.onSurface, + shape = CircleShape + ) + ) + + 1 -> Box( + modifier = modifier + .size(size = size) + .background(color = MaterialTheme.colorScheme.onSurface, shape = CircleShape) + ) + + else -> Box( + modifier = modifier + .border( + width = 1.dp, + color = MaterialTheme.colorScheme.onSurface, + shape = CircleShape + ) + .padding(2.dp) + ) { + MasteryCircle(multiplier = multiplier - 1) + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/pixelized/rplexicon/ui/screens/character/composable/Proficiency.kt b/app/src/main/java/com/pixelized/rplexicon/ui/screens/character/composable/Proficiency.kt new file mode 100644 index 0000000..27b495e --- /dev/null +++ b/app/src/main/java/com/pixelized/rplexicon/ui/screens/character/composable/Proficiency.kt @@ -0,0 +1,120 @@ +package com.pixelized.rplexicon.ui.screens.character.composable + +import android.content.res.Configuration +import androidx.annotation.StringRes +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.PaddingValues +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.heightIn +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.size +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Surface +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.runtime.Stable +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.tooling.preview.PreviewParameter +import androidx.compose.ui.tooling.preview.PreviewParameterProvider +import androidx.compose.ui.unit.dp +import com.pixelized.rplexicon.R +import com.pixelized.rplexicon.ui.theme.LexiconTheme +import com.pixelized.rplexicon.utilitary.extentions.toLabel + +@Stable +data class ProficiencyUio( + @StringRes val label: Int, // the proficiency label + @StringRes val related: Int, // the related stat to the proficiency + val multiplier: Int, // the multiplier (use for the circle) 0 -> None 1 -> Mastery 2 -> Expertise + val modifier: Int, // the proficiency value. (stats + mastery) +) + +@Composable +fun Proficiency( + modifier: Modifier = Modifier, + padding: PaddingValues = PaddingValues(start = 16.dp, end = 27.dp), + proficiency: ProficiencyUio, +) { + Box( + modifier = modifier.heightIn(48.dp), + contentAlignment = Alignment.CenterStart, + ) { + Row( + modifier = Modifier.padding(paddingValues = padding), + verticalAlignment = Alignment.CenterVertically, + horizontalArrangement = Arrangement.spacedBy(16.dp), + ) { + Box( + modifier = Modifier.size(size = 32.dp), + contentAlignment = Alignment.Center, + ) { + MasteryCircle( + multiplier = proficiency.multiplier, + ) + } + + Row( + modifier = Modifier.weight(1f), + horizontalArrangement = Arrangement.spacedBy(4.dp), + ) { + Text( + modifier = Modifier.alignByBaseline(), + style = MaterialTheme.typography.bodyMedium, + text = stringResource(id = proficiency.label), + ) + Text( + modifier = Modifier.alignByBaseline(), + style = MaterialTheme.typography.labelSmall, + text = "(${stringResource(proficiency.related)})", + ) + } + + Text( + style = MaterialTheme.typography.titleMedium, + text = proficiency.modifier.toLabel(), + ) + } + } +} + +@Composable +@Preview(uiMode = Configuration.UI_MODE_NIGHT_NO) +@Preview(uiMode = Configuration.UI_MODE_NIGHT_YES) +private fun ProficiencyPreview( + @PreviewParameter(ProficiencyPreviewProvider::class) proficiency: ProficiencyUio, +) { + LexiconTheme { + Surface { + Proficiency( + proficiency = proficiency, + ) + } + } +} + +private class ProficiencyPreviewProvider : PreviewParameterProvider { + override val values: Sequence = sequenceOf( + ProficiencyUio( + label = R.string.character_sheet_proficiency_acrobatics, + related = R.string.character_sheet_stat_dexterity_short, + multiplier = 0, + modifier = -1 + ), + ProficiencyUio( + label = R.string.character_sheet_proficiency_athletics, + related = R.string.character_sheet_stat_strength_short, + multiplier = 1, + modifier = 5, + ), + ProficiencyUio( + label = R.string.character_sheet_proficiency_sleight_of_hand, + related = R.string.character_sheet_stat_dexterity_short, + multiplier = 2, + modifier = 8, + ), + ) +} \ No newline at end of file diff --git a/app/src/main/java/com/pixelized/rplexicon/ui/screens/character/composable/SavingThrows.kt b/app/src/main/java/com/pixelized/rplexicon/ui/screens/character/composable/SavingThrows.kt new file mode 100644 index 0000000..2722abb --- /dev/null +++ b/app/src/main/java/com/pixelized/rplexicon/ui/screens/character/composable/SavingThrows.kt @@ -0,0 +1,116 @@ +package com.pixelized.rplexicon.ui.screens.character.composable + +import android.content.res.Configuration +import androidx.annotation.StringRes +import androidx.compose.foundation.clickable +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.PaddingValues +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.shape.CutCornerShape +import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Surface +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.runtime.Stable +import androidx.compose.runtime.remember +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.text.style.TextOverflow +import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.tooling.preview.PreviewParameter +import androidx.compose.ui.tooling.preview.PreviewParameterProvider +import androidx.compose.ui.unit.dp +import com.pixelized.rplexicon.R +import com.pixelized.rplexicon.ui.theme.LexiconTheme +import com.pixelized.rplexicon.utilitary.extentions.ddBorder +import com.pixelized.rplexicon.utilitary.extentions.toLabel + +@Stable +data class SavingsThrowsUio( + @StringRes val label: Int, // the proficiency label + val multiplier: Int, // the multiplier (use for the circle) 0 -> None 1 -> Mastery 2 -> Expertise + val modifier: Int, // the proficiency value. (stats + mastery) +) + +@Composable +fun SavingsThrows( + modifier: Modifier = Modifier, + padding: PaddingValues = PaddingValues(start = 8.dp, top = 8.dp, bottom = 8.dp, end = 8.dp), + savingsThrows: SavingsThrowsUio, + onClick: () -> Unit, +) { + Row( + modifier = modifier + .ddBorder( + horizontalSpacing = 3.dp, + outline = remember { CutCornerShape(size = 24.dp) }, + inner = remember { RoundedCornerShape(size = 24.dp) }, + ) + .clickable(onClick = onClick) + .padding(paddingValues = padding), + horizontalArrangement = Arrangement.spacedBy(8.dp), + verticalAlignment = Alignment.CenterVertically, + ) { + MasteryCircle( + multiplier = savingsThrows.multiplier, + ) + + Text( + modifier = Modifier.weight(weight = 1f, fill = true), + style = MaterialTheme.typography.bodyMedium, + maxLines = 1, + overflow = TextOverflow.Ellipsis, + text = stringResource(id = savingsThrows.label), + ) + + Text( + style = MaterialTheme.typography.titleMedium, + text = savingsThrows.modifier.toLabel(), + ) + } +} + +@Composable +@Preview(uiMode = Configuration.UI_MODE_NIGHT_NO) +@Preview(uiMode = Configuration.UI_MODE_NIGHT_YES) +fun SavingsThrowsPreview( + @PreviewParameter(SavingsThrowsPreviewProvider::class) preview: SavingsThrowsUio, +) { + LexiconTheme { + Surface { + SavingsThrows( + modifier = Modifier.padding(all = 8.dp), + savingsThrows = preview, + onClick = { }, + ) + } + } +} + +private class SavingsThrowsPreviewProvider : PreviewParameterProvider { + override val values: Sequence = sequenceOf( + SavingsThrowsUio( + label = R.string.character_sheet_stat_strength, + multiplier = 0, + modifier = 0, + ), + SavingsThrowsUio( + label = R.string.character_sheet_stat_intelligence, + multiplier = 1, + modifier = 5, + ), + SavingsThrowsUio( + label = R.string.character_sheet_stat_dexterity, + multiplier = 2, + modifier = 8, + ), + SavingsThrowsUio( + label = R.string.character_sheet_stat_charisma, + multiplier = 0, + modifier = -1, + ), + ) +} \ No newline at end of file diff --git a/app/src/main/java/com/pixelized/rplexicon/ui/screens/character/composable/Stat.kt b/app/src/main/java/com/pixelized/rplexicon/ui/screens/character/composable/Stat.kt new file mode 100644 index 0000000..d8ed374 --- /dev/null +++ b/app/src/main/java/com/pixelized/rplexicon/ui/screens/character/composable/Stat.kt @@ -0,0 +1,89 @@ +package com.pixelized.rplexicon.ui.screens.character.composable + +import android.content.res.Configuration.UI_MODE_NIGHT_NO +import android.content.res.Configuration.UI_MODE_NIGHT_YES +import androidx.annotation.StringRes +import androidx.compose.foundation.clickable +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.width +import androidx.compose.foundation.shape.CutCornerShape +import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.material3.Divider +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Surface +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.runtime.Stable +import androidx.compose.runtime.remember +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.unit.dp +import com.pixelized.rplexicon.R +import com.pixelized.rplexicon.ui.theme.LexiconTheme +import com.pixelized.rplexicon.utilitary.extentions.ddBorder +import com.pixelized.rplexicon.utilitary.extentions.toLabel + +@Stable +data class StatUio( + @StringRes val label: Int, + val value: Int, + val modifier: Int, +) + +@Composable +fun Stat( + modifier: Modifier = Modifier, + stat: StatUio, + onClick: () -> Unit +) { + Column( + modifier = modifier + .ddBorder( + inner = remember { RoundedCornerShape(size = 8.dp) }, + outline = remember { CutCornerShape(size = 16.dp) }, + ) + .clickable(onClick = onClick) + .padding(all = 8.dp), + horizontalAlignment = Alignment.CenterHorizontally, + verticalArrangement = Arrangement.spacedBy(4.dp), + ) { + Text( + style = MaterialTheme.typography.labelSmall, + text = stringResource(id = stat.label), + ) + Text( + style = MaterialTheme.typography.displayMedium, + text = stat.modifier.toLabel(), + ) + Divider( + modifier = Modifier.width(width = 32.dp), + ) + Text( + style = MaterialTheme.typography.labelMedium, + text = "${stat.value}", + ) + } +} + +@Composable +@Preview(uiMode = UI_MODE_NIGHT_NO) +@Preview(uiMode = UI_MODE_NIGHT_YES) +private fun StatPreview() { + LexiconTheme { + Surface { + Stat( + modifier = Modifier.padding(all = 8.dp), + stat = StatUio( + label = R.string.character_sheet_stat_constitution, + value = 16, + modifier = 3, + ), + onClick = { }, + ) + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/pixelized/rplexicon/ui/screens/rolls/RollOverlay.kt b/app/src/main/java/com/pixelized/rplexicon/ui/screens/rolls/RollOverlay.kt new file mode 100644 index 0000000..0bf4933 --- /dev/null +++ b/app/src/main/java/com/pixelized/rplexicon/ui/screens/rolls/RollOverlay.kt @@ -0,0 +1,233 @@ +package com.pixelized.rplexicon.ui.screens.rolls + +import android.content.res.Configuration.UI_MODE_NIGHT_NO +import android.content.res.Configuration.UI_MODE_NIGHT_YES +import androidx.compose.animation.AnimatedContent +import androidx.compose.animation.SizeTransform +import androidx.compose.animation.fadeIn +import androidx.compose.animation.fadeOut +import androidx.compose.animation.slideInVertically +import androidx.compose.animation.slideOutVertically +import androidx.compose.animation.togetherWith +import androidx.compose.foundation.clickable +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.padding +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.outlined.Close +import androidx.compose.material3.Icon +import androidx.compose.material3.IconButton +import androidx.compose.material3.Surface +import androidx.compose.runtime.Composable +import androidx.compose.runtime.MutableState +import androidx.compose.runtime.Stable +import androidx.compose.runtime.State +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.saveable.rememberSaveable +import androidx.compose.runtime.setValue +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.platform.LocalDensity +import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.unit.dp +import androidx.hilt.navigation.compose.hiltViewModel +import com.pixelized.rplexicon.LocalRollOverlay +import com.pixelized.rplexicon.R +import com.pixelized.rplexicon.model.Roll +import com.pixelized.rplexicon.ui.composable.BlurredOverlayHostState +import com.pixelized.rplexicon.ui.screens.rolls.composable.RollDice +import com.pixelized.rplexicon.ui.screens.rolls.composable.RollDiceUio +import com.pixelized.rplexicon.ui.screens.rolls.composable.ThrowsCard +import com.pixelized.rplexicon.ui.screens.rolls.composable.ThrowsCardUio +import com.pixelized.rplexicon.ui.theme.LexiconTheme + +@Composable +fun RollOverlay( + viewModel: RollOverlayViewModel = hiltViewModel(), +) { + val overlay = LocalRollOverlay.current + + RollOverlayContent( + modifier = Modifier.fillMaxSize(), + dice = viewModel.dice, + card = viewModel.card, + showDetail = viewModel.showDetail, + onDice = { + viewModel.roll() + }, + onCard = { + viewModel.toggleDetail() + }, + onClose = { + overlay.hideOverlay() + } + ) +} + +@Composable +private fun RollOverlayContent( + modifier: Modifier = Modifier, + dice: State, + card: State, + showDetail: State, + onDice: () -> Unit, + onCard: () -> Unit, + onClose: () -> Unit, +) { + val density = LocalDensity.current + + Box( + modifier = modifier, + ) { + RollDice( + modifier = Modifier + .align(alignment = Alignment.Center) + .padding(horizontal = 16.dp), + dice = dice, + onDice = onDice, + ) + + AnimatedContent( + modifier = Modifier + .fillMaxWidth() + .align(Alignment.BottomCenter) + .padding(all = 16.dp), + targetState = card.value, + transitionSpec = { + val enter = fadeIn() + slideInVertically { with(density) { 64.dp.roundToPx() } } + val exit = fadeOut() + slideOutVertically { with(density) { -64.dp.roundToPx() } } + val transform = SizeTransform(clip = false) + enter togetherWith exit using transform + }, + label = "RollOverlayDisplay", + ) { + when (it) { + null -> Box( + modifier = Modifier.fillMaxWidth(), + ) + + else -> ThrowsCard( + modifier = Modifier + .fillMaxWidth() + .clickable(onClick = onCard), + throws = it, + showDetail = showDetail, + ) + } + } + + IconButton( + modifier = Modifier + .align(alignment = Alignment.TopEnd) + .padding( + top = 6.dp, + end = 4.dp + ), + onClick = onClose + ) { + Icon( + imageVector = Icons.Outlined.Close, + contentDescription = null, + ) + } + } +} + +@Composable +@Preview(uiMode = UI_MODE_NIGHT_NO) +@Preview(uiMode = UI_MODE_NIGHT_YES) +private fun RollOverlayPreview() { + LexiconTheme { + Surface { + RollOverlayContent( + modifier = Modifier.fillMaxSize(), + dice = remember { + mutableStateOf( + RollDiceUio( + icon = R.drawable.ic_d20_24, + isCriticalSuccess = true, + result = "20", + ) + ) + }, + card = remember { + mutableStateOf( + ThrowsCardUio( + title = "PERCEPTION CHECK", + highlight = "CHECK", + dice = R.drawable.ic_d20_24, + roll = "$20 + 2 + 2", + result = "20", + isCriticalSuccess = true, + details = listOf( + ThrowsCardUio.Detail( + throws = ThrowsCardUio.Throw( + dice = R.drawable.ic_d20_24, + roll = "1d20", + result = "20" + ), + result = "20" + ), + ThrowsCardUio.Detail( + title = "Wisdom bonus", + result = "2", + ), + ThrowsCardUio.Detail( + title = "Proficiency bonus", + result = "2", + ), + ), + ) + ) + }, + showDetail = remember { + mutableStateOf(true) + }, + onDice = { }, + onCard = { }, + onClose = { }, + ) + } + } +} + +interface BlurredRollOverlayHostState : BlurredOverlayHostState { + fun prepareRoll(roll: Roll) +} + +@Stable +private class BlurredRollOverlayHostStateImpl( + private val viewModel: RollOverlayViewModel, + rollOverlayVisibilityState: MutableState, +) : BlurredRollOverlayHostState { + override var isOverlayVisible by rollOverlayVisibilityState + + override fun prepareRoll(roll: Roll) { + viewModel.prepareRoll(roll) + } + + override fun showOverlay() { + isOverlayVisible = true + } + + override fun hideOverlay() { + isOverlayVisible = false + } +} + +@Composable +@Stable +fun rememberBlurredRollOverlayHostState( + viewModel: RollOverlayViewModel, +): BlurredRollOverlayHostState { + val rollOverlayVisibilityState = rememberSaveable { mutableStateOf(false) } + return remember { + BlurredRollOverlayHostStateImpl( + viewModel = viewModel, + rollOverlayVisibilityState = rollOverlayVisibilityState + ) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/pixelized/rplexicon/ui/screens/rolls/RollOverlayViewModel.kt b/app/src/main/java/com/pixelized/rplexicon/ui/screens/rolls/RollOverlayViewModel.kt new file mode 100644 index 0000000..8710a68 --- /dev/null +++ b/app/src/main/java/com/pixelized/rplexicon/ui/screens/rolls/RollOverlayViewModel.kt @@ -0,0 +1,63 @@ +package com.pixelized.rplexicon.ui.screens.rolls + +import androidx.compose.runtime.State +import androidx.compose.runtime.mutableStateOf +import androidx.lifecycle.ViewModel +import androidx.lifecycle.viewModelScope +import com.pixelized.rplexicon.facotry.ConvertRollIntoDisplayableFactory +import com.pixelized.rplexicon.model.Roll +import com.pixelized.rplexicon.ui.screens.rolls.composable.RollDiceUio +import com.pixelized.rplexicon.ui.screens.rolls.composable.ThrowsCardUio +import com.pixelized.rplexicon.utilitary.extentions.icon +import com.pixelized.rplexicon.utilitary.extentions.switch +import dagger.hilt.android.lifecycle.HiltViewModel +import kotlinx.coroutines.Job +import kotlinx.coroutines.delay +import kotlinx.coroutines.launch +import javax.inject.Inject + +@HiltViewModel +class RollOverlayViewModel @Inject constructor( + private val factory: ConvertRollIntoDisplayableFactory, +) : ViewModel() { + + private var rollJob: Job? = null + private lateinit var roll: Roll + + private val _dice = mutableStateOf(RollDiceUio()) + val dice: State get() = _dice + + private val _card = mutableStateOf(null) + val card: State get() = _card + + private val _showDetail = mutableStateOf(false) + val showDetail: State get() = _showDetail + + fun prepareRoll(roll: Roll) { + this.roll = roll + _dice.value = RollDiceUio(icon = roll.dices.maxOf { it.faces }.icon) + _card.value = null + } + + fun roll() { + rollJob?.cancel() + rollJob = viewModelScope.launch { + val (dice, card) = factory.roll(roll = roll) + // Start the roll animation. + _dice.value = _dice.value.copy( + animationSpec = RollDiceUio.TWEEN, + rotation = _dice.value.rotation + 5f, + ) + delay(RollDiceUio.ROLL_DURATION) + // Roll the d20 value. + dice?.let { _dice.value = it } + delay(250) + // Display the roll card. + _card.value = card + } + } + + fun toggleDetail() { + _showDetail.switch() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/pixelized/rplexicon/ui/screens/rolls/composable/RollDice.kt b/app/src/main/java/com/pixelized/rplexicon/ui/screens/rolls/composable/RollDice.kt new file mode 100644 index 0000000..c6f15de --- /dev/null +++ b/app/src/main/java/com/pixelized/rplexicon/ui/screens/rolls/composable/RollDice.kt @@ -0,0 +1,220 @@ +package com.pixelized.rplexicon.ui.screens.rolls.composable + +import androidx.annotation.DrawableRes +import androidx.compose.animation.AnimatedContent +import androidx.compose.animation.core.AnimationSpec +import androidx.compose.animation.core.LinearOutSlowInEasing +import androidx.compose.animation.core.SnapSpec +import androidx.compose.animation.core.animateFloatAsState +import androidx.compose.animation.core.tween +import androidx.compose.animation.expandIn +import androidx.compose.animation.fadeIn +import androidx.compose.animation.fadeOut +import androidx.compose.animation.shrinkOut +import androidx.compose.animation.togetherWith +import androidx.compose.foundation.background +import androidx.compose.foundation.clickable +import androidx.compose.foundation.interaction.MutableInteractionSource +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.size +import androidx.compose.material.ripple.rememberRipple +import androidx.compose.material3.Icon +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Surface +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.runtime.Stable +import androidx.compose.runtime.State +import androidx.compose.runtime.derivedStateOf +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.draw.rotate +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.res.painterResource +import androidx.compose.ui.text.style.TextAlign +import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.unit.Dp +import androidx.compose.ui.unit.IntSize +import androidx.compose.ui.unit.dp +import com.pixelized.rplexicon.R +import com.pixelized.rplexicon.ui.theme.LexiconTheme +import com.pixelized.rplexicon.utilitary.extentions.lexicon + +@Stable +data class RollDiceUio( + @DrawableRes val icon: Int = R.drawable.ic_d20_24, + val rotation: Float = 0f, + val isCriticalSuccess: Boolean = false, + val isCriticalFailure: Boolean = false, + val result: String? = null, + val animationSpec: AnimationSpec = SNAP, +) { + companion object { + const val ROLL_DURATION = 750L + + val SNAP = SnapSpec() + + val TWEEN = tween( + durationMillis = ROLL_DURATION.toInt(), + easing = LinearOutSlowInEasing, + ) + } +} + +@Composable +fun RollDice( + modifier: Modifier = Modifier, + diceSize: Dp = 64.dp * 2.5f, + dice: State, + onDice: () -> Unit, +) { + Column( + modifier = modifier, + horizontalAlignment = Alignment.CenterHorizontally, + verticalArrangement = Arrangement.spacedBy(space = 16.dp) + ) { + Box( + contentAlignment = Alignment.Center, + ) { + Dice( + modifier = Modifier + .size(size = diceSize) + .clickable( + interactionSource = remember { MutableInteractionSource() }, + indication = null, + onClick = onDice, + ), + dice = dice, + ) + Result( + modifier = Modifier + .fillMaxWidth() + .height(height = diceSize), + dice = dice, + ) + } + Critical( + modifier = Modifier.fillMaxWidth(), + dice = dice, + ) + } +} + +@Composable +private fun Dice( + modifier: Modifier = Modifier, + dice: State, +) { + val animatedRotation = animateFloatAsState( + targetValue = dice.value.rotation * 360, + animationSpec = dice.value.animationSpec, + label = "AnimatedRotation" + ) + Icon( + modifier = modifier.rotate(degrees = animatedRotation.value % 360), + tint = MaterialTheme.colorScheme.primary, + painter = painterResource(id = dice.value.icon), + contentDescription = null, + ) +} + +@Composable +private fun Result( + modifier: Modifier = Modifier, + dice: State, +) { + val colorScheme = MaterialTheme.colorScheme + + AnimatedContent( + modifier = modifier, + targetState = dice.value.result, + transitionSpec = { + val enter = fadeIn() + expandIn(expandFrom = Alignment.Center) { it } + val exit = fadeOut() + shrinkOut(shrinkTowards = Alignment.Center) { IntSize.Zero } + enter togetherWith exit + }, + label = "" + ) { + when (it) { + null -> Box(modifier = Modifier) + else -> Box( + modifier = Modifier.background(brush = MaterialTheme.lexicon.colorScheme.dice.valueBackground), + contentAlignment = Alignment.Center, + ) { + Text( + style = MaterialTheme.typography.displayMedium, + text = it, + ) + } + } + } +} + +@Composable +private fun Critical( + modifier: Modifier = Modifier, + dice: State, +) { + val state = remember { + derivedStateOf { + when { + dice.value.isCriticalSuccess -> 1 + dice.value.isCriticalFailure -> 2 + else -> 0 + } + } + } + AnimatedContent( + modifier = modifier, + targetState = state.value, + transitionSpec = { + val enter = fadeIn() + expandIn(expandFrom = Alignment.Center) { it } + val exit = fadeOut() + shrinkOut(shrinkTowards = Alignment.Center) { IntSize.Zero } + enter togetherWith exit + }, + label = "", + ) { + Text( + style = MaterialTheme.typography.headlineLarge, + textAlign = TextAlign.Center, + color = when (it) { + 1 -> MaterialTheme.colorScheme.primary + 2 -> Color.Red + else -> MaterialTheme.colorScheme.onSurface + }, + text = when (it) { + 1 -> "SUCCÈS CRITIQUE" + 2 -> "ÉCHEC CRITIQUE" + else -> "" + }, + ) + } +} + +@Composable +@Preview +private fun SkillRollPreview() { + LexiconTheme { + Surface { + RollDice( + dice = remember { + mutableStateOf( + RollDiceUio( + icon = R.drawable.ic_d20_24, + rotation = 0f, + isCriticalSuccess = true, + result = "20", + ) + ) + }, + onDice = { }, + ) + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/pixelized/rplexicon/ui/screens/rolls/composable/ThrowsCard.kt b/app/src/main/java/com/pixelized/rplexicon/ui/screens/rolls/composable/ThrowsCard.kt new file mode 100644 index 0000000..084f420 --- /dev/null +++ b/app/src/main/java/com/pixelized/rplexicon/ui/screens/rolls/composable/ThrowsCard.kt @@ -0,0 +1,346 @@ +package com.pixelized.rplexicon.ui.screens.rolls.composable + +import android.content.res.Configuration +import androidx.annotation.DrawableRes +import androidx.compose.animation.AnimatedVisibility +import androidx.compose.animation.animateContentSize +import androidx.compose.animation.expandVertically +import androidx.compose.animation.fadeIn +import androidx.compose.animation.fadeOut +import androidx.compose.animation.shrinkVertically +import androidx.compose.foundation.BorderStroke +import androidx.compose.foundation.isSystemInDarkTheme +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.size +import androidx.compose.foundation.layout.width +import androidx.compose.foundation.layout.widthIn +import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.material3.Icon +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Surface +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.runtime.Stable +import androidx.compose.runtime.State +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.platform.LocalDensity +import androidx.compose.ui.res.painterResource +import androidx.compose.ui.text.AnnotatedString +import androidx.compose.ui.text.SpanStyle +import androidx.compose.ui.text.rememberTextMeasurer +import androidx.compose.ui.text.style.TextAlign +import androidx.compose.ui.text.style.TextOverflow +import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.tooling.preview.PreviewParameter +import androidx.compose.ui.tooling.preview.PreviewParameterProvider +import androidx.compose.ui.unit.Dp +import androidx.compose.ui.unit.dp +import com.pixelized.rplexicon.R +import com.pixelized.rplexicon.ui.theme.LexiconTheme +import com.pixelized.rplexicon.utilitary.extentions.annotatedSpan +import com.pixelized.rplexicon.utilitary.extentions.highlightRegex +import java.util.UUID + +@Stable +data class ThrowsCardUio( + val id: String = UUID.randomUUID().toString(), + val title: String?, // the roll title + val highlight: String?, // the highlighted part of the title + @DrawableRes val dice: Int?, // the dice icon + val roll: String, // the roll + bonus string. + val result: String, // the final result + val isCriticalSuccess: Boolean = false, // highlight result + val isCriticalFailure: Boolean = false, // highlight result + val details: List, // the roll detail. +) { + @Stable + data class Detail( + val title: String? = null, // the detail title + val throws: Throw? = null, // the detail of the roll if any + val result: String, // the result + ) + + @Stable + data class Throw( + @DrawableRes val dice: Int, // the throw dice icon + val advantage: Boolean = false, // highlight if advantage + val disadvantage: Boolean = false, // highlight if disadvantage + val roll: String, // the roll (1d20, 2d20) + val result: String, // the result + ) +} + +@Composable +fun ThrowsCard( + modifier: Modifier = Modifier, + throws: ThrowsCardUio, + showDetail: State, +) { + val density = LocalDensity.current + val isDarkMode = isSystemInDarkTheme() + val colorScheme = MaterialTheme.colorScheme + val typography = MaterialTheme.typography + val highlight = remember { SpanStyle(color = colorScheme.primary) } + + val textMeasurer = rememberTextMeasurer() + val resultWidth = remember { + val measurer = textMeasurer.measure(text = "00", style = typography.displayMedium) + with(density) { measurer.size.width.toDp() } + } + + Surface( + modifier = modifier, + shape = RoundedCornerShape(size = 16.dp), + border = BorderStroke( + width = 1.dp, + color = MaterialTheme.colorScheme.onSurface.copy(0.25f) + ), + tonalElevation = if (isDarkMode) 4.dp else 0.dp, + ) { + Column( + modifier = Modifier + .padding(all = 16.dp) + .animateContentSize(), + ) { + throws.title?.let { + Text( + color = MaterialTheme.colorScheme.onSurface.copy(alpha = 0.65f), + style = MaterialTheme.typography.bodyLarge, + text = AnnotatedString( + text = it, + spanStyles = throws.highlight?.highlightRegex?.annotatedSpan( + input = it, + spanStyle = highlight, + ) ?: emptyList() + ), + ) + } + + Row( + verticalAlignment = Alignment.CenterVertically, + ) { + throws.dice?.let { + Icon( + modifier = Modifier.size(size = 32.dp), + tint = MaterialTheme.colorScheme.onSurface.copy(alpha = 0.65f), + painter = painterResource(id = it), + contentDescription = null + ) + } + Text( + modifier = Modifier + .weight(1f) + .padding(start = 8.dp), + maxLines = 1, + overflow = TextOverflow.Ellipsis, + style = MaterialTheme.typography.titleLarge, + text = throws.roll, + ) + Text( + modifier = Modifier.padding(horizontal = 8.dp), + style = MaterialTheme.typography.headlineLarge, + color = MaterialTheme.colorScheme.onSurface.copy(alpha = 0.65f), + text = "=", + ) + Text( + modifier = Modifier.widthIn(min = resultWidth), + style = MaterialTheme.typography.displayMedium, + textAlign = TextAlign.Center, + color = when { + throws.isCriticalSuccess -> MaterialTheme.colorScheme.primary + throws.isCriticalFailure -> Color.Red + else -> MaterialTheme.colorScheme.onSurface + }, + text = throws.result, + ) + } + if (throws.details.isNotEmpty()) { + AnimatedVisibility( + visible = showDetail.value, + enter = fadeIn() + expandVertically(expandFrom = Alignment.Top) { it }, + exit = fadeOut() + shrinkVertically(shrinkTowards = Alignment.Top) { 0 }, + ) { + Column( + modifier = Modifier + .padding(top = 4.dp) + .fillMaxWidth(), + horizontalAlignment = Alignment.End, + ) { + throws.details.forEach { + ThrowsRollDetail( + detail = it, + resultWidth = resultWidth, + ) + } + } + } + } + } + } +} + +@Composable +private fun ThrowsRollDetail( + modifier: Modifier = Modifier, + detail: ThrowsCardUio.Detail, + resultWidth: Dp, +) { + Row( + modifier = modifier, + horizontalArrangement = Arrangement.spacedBy(space = 4.dp), + ) { + detail.title?.let { + Text( + modifier = Modifier.alignByBaseline(), + color = MaterialTheme.colorScheme.onSurface, + style = MaterialTheme.typography.bodySmall, + text = it, + ) + } + detail.throws?.let { + Text( + modifier = Modifier.alignByBaseline(), + color = MaterialTheme.colorScheme.onSurface, + style = MaterialTheme.typography.bodySmall, + textAlign = TextAlign.Center, + text = "(${it.roll})", + ) + Icon( + modifier = Modifier + .size(16.dp) + .align(alignment = Alignment.Bottom) + .padding(bottom = 2.dp), + tint = when { + it.advantage -> MaterialTheme.colorScheme.primary + it.disadvantage -> Color.Red + else -> MaterialTheme.colorScheme.onSurface + }, + painter = painterResource(id = it.dice), + contentDescription = null, + ) + Text( + modifier = Modifier + .alignByBaseline() + .weight(1f, false), + color = MaterialTheme.colorScheme.onSurface, + style = MaterialTheme.typography.bodySmall, + maxLines = 1, + overflow = TextOverflow.Ellipsis, + text = it.result, + ) + } + Text( + modifier = Modifier.alignByBaseline(), + color = MaterialTheme.colorScheme.onSurface, + style = MaterialTheme.typography.bodySmall, + text = ":", + ) + Text( + modifier = Modifier + .alignByBaseline() + .width(width = resultWidth), + textAlign = TextAlign.Center, + color = MaterialTheme.colorScheme.onSurface, + style = MaterialTheme.typography.bodyLarge, + text = detail.result, + ) + } +} + +@Composable +@Preview(uiMode = Configuration.UI_MODE_NIGHT_NO) +@Preview(uiMode = Configuration.UI_MODE_NIGHT_YES) +fun RollToastPreview( + @PreviewParameter(RollToastPreviewProvider::class) preview: ThrowsCardUio, +) { + LexiconTheme { + val showDetail = remember { + mutableStateOf(true) + } + ThrowsCard( + modifier = Modifier.fillMaxWidth(), + throws = preview, + showDetail = showDetail, + ) + } +} + +private class RollToastPreviewProvider : PreviewParameterProvider { + override val values: Sequence = sequenceOf( + ThrowsCardUio( + title = "ATHLETICS CHECK", + highlight = "CHECK", + dice = R.drawable.ic_d20_24, + roll = "13 + 3 + 2", + result = "18", + details = emptyList(), + ), + ThrowsCardUio( + title = "INVESTIGATION CHECK", + highlight = "CHECK", + dice = R.drawable.ic_d20_24, + roll = "1 - 1", + result = "1", + isCriticalFailure = true, + details = listOf( + ThrowsCardUio.Detail( + throws = ThrowsCardUio.Throw( + dice = R.drawable.ic_d20_24, + roll = "1d20", + result = "1", + ), + result = "1", + ), + ThrowsCardUio.Detail( + title = "Intelligence bonus", + result = "-1", + ), + ), + ), + ThrowsCardUio( + title = "ATTACK HIT", + highlight = "HIT", + dice = R.drawable.ic_d20_24, + roll = "20 + 2 + 3 + 2", + result = "20", + isCriticalSuccess = true, + details = listOf( + ThrowsCardUio.Detail( + title = "Hit Check \"Advantage\"", + throws = ThrowsCardUio.Throw( + dice = R.drawable.ic_d20_24, + roll = "1d20", + advantage = true, + result = "20 ~ 5", + ), + result = "20", + ), + ThrowsCardUio.Detail( + title = "Benediction", + throws = ThrowsCardUio.Throw( + dice = R.drawable.ic_d4_24, + roll = "1d4", + result = "2", + ), + result = "2", + ), + ThrowsCardUio.Detail( + title = "Strength bonus", + result = "3", + ), + ThrowsCardUio.Detail( + title = "Mastery bonus", + result = "2", + ), + ), + ), + ) +} \ No newline at end of file diff --git a/app/src/main/java/com/pixelized/rplexicon/ui/theme/colors/LexiconColors.kt b/app/src/main/java/com/pixelized/rplexicon/ui/theme/colors/LexiconColors.kt index a71b3d4..8caa618 100644 --- a/app/src/main/java/com/pixelized/rplexicon/ui/theme/colors/LexiconColors.kt +++ b/app/src/main/java/com/pixelized/rplexicon/ui/theme/colors/LexiconColors.kt @@ -5,18 +5,35 @@ import androidx.compose.material3.darkColorScheme import androidx.compose.material3.lightColorScheme import androidx.compose.runtime.Immutable import androidx.compose.runtime.Stable +import androidx.compose.ui.graphics.Brush import androidx.compose.ui.graphics.Color @Stable @Immutable class LexiconColors( val base: ColorScheme, + val placeholder: Color, val shadow: Color, val status: Color, val navigation: Color, - val placeholder: Color, val handle: Color, -) + val rollOverlayBrush: Brush, + val dice: Dice, + val characterSheet: CharacterSheet, +) { + @Stable + data class Dice( + val tint: Color, + val value: Color, + val valueBackground: Brush, + ) + + @Stable + data class CharacterSheet( + val innerBorder: Color, + val outlineBorder: Color, + ) +} @Stable fun darkColorScheme( @@ -27,17 +44,15 @@ fun darkColorScheme( onPrimary = Color.White, surfaceTint = Base.Purple80, ), - shadow: Color = ShadowPalette.shadow, - status: Color = Color.Transparent, - navigation: Color = Color.Transparent, placeholder: Color = Color(red = 49, green = 48, blue = 51), -) = LexiconColors( + sheet: LexiconColors.CharacterSheet = LexiconColors.CharacterSheet( + innerBorder = base.onSurface.copy(alpha = 0.35f), + outlineBorder = base.onSurface.copy(alpha = 0.6f), + ), +) = colorScheme( base = base, - shadow = shadow, - status = status, - navigation = navigation, placeholder = placeholder, - handle = base.onSurface.copy(alpha = 0.5f), + sheet = sheet ) @Stable @@ -49,10 +64,41 @@ fun lightColorScheme( onPrimary = Color.White, surfaceTint = Base.Purple40, ), + placeholder: Color = Color(red = 230, green = 225, blue = 229), + sheet: LexiconColors.CharacterSheet = LexiconColors.CharacterSheet( + innerBorder = base.onSurface.copy(alpha = 0.35f), + outlineBorder = base.onSurface.copy(alpha = 0.6f), + ), +) = colorScheme( + base = base, + placeholder = placeholder, + sheet = sheet, +) + +@Stable +fun colorScheme( + base: ColorScheme, + placeholder: Color, shadow: Color = ShadowPalette.shadow, status: Color = Color.Transparent, navigation: Color = Color.Transparent, - placeholder: Color = Color(red = 230, green = 225, blue = 229), + rollOverlayBrush: Brush = Brush.radialGradient( + colors = listOf( + base.surface.copy(alpha = 0.75f), + base.surface.copy(alpha = 0.25f), + ), + ), + dice: LexiconColors.Dice = LexiconColors.Dice( + tint = base.primary, + value = base.onSurface, + valueBackground = Brush.radialGradient( + colors = listOf( + base.surface.copy(alpha = 0.5f), + Color.Transparent, + ), + ) + ), + sheet: LexiconColors.CharacterSheet, ) = LexiconColors( base = base, shadow = shadow, @@ -60,4 +106,7 @@ fun lightColorScheme( navigation = navigation, placeholder = placeholder, handle = base.onSurface.copy(alpha = 0.5f), + rollOverlayBrush = rollOverlayBrush, + dice = dice, + characterSheet = sheet, ) diff --git a/app/src/main/java/com/pixelized/rplexicon/ui/theme/typography/LexiconTypography.kt b/app/src/main/java/com/pixelized/rplexicon/ui/theme/typography/LexiconTypography.kt index c960b16..ca6f5ca 100644 --- a/app/src/main/java/com/pixelized/rplexicon/ui/theme/typography/LexiconTypography.kt +++ b/app/src/main/java/com/pixelized/rplexicon/ui/theme/typography/LexiconTypography.kt @@ -16,6 +16,7 @@ val regalFontFamily = FontFamily( Font(resId = R.font.regal, weight = FontWeight.Normal), ) +@Stable val stampFontFamily = FontFamily( Font(resId = R.font.rubber_stamp, weight = FontWeight.Normal), ) diff --git a/app/src/main/java/com/pixelized/rplexicon/utilitary/extentions/AndroidViewModelEx.kt b/app/src/main/java/com/pixelized/rplexicon/utilitary/extentions/AndroidViewModelEx.kt new file mode 100644 index 0000000..81c0719 --- /dev/null +++ b/app/src/main/java/com/pixelized/rplexicon/utilitary/extentions/AndroidViewModelEx.kt @@ -0,0 +1,6 @@ +package com.pixelized.rplexicon.utilitary.extentions + +import android.content.Context +import androidx.lifecycle.AndroidViewModel + +val AndroidViewModel.context: Context get() = getApplication() \ No newline at end of file diff --git a/app/src/main/java/com/pixelized/rplexicon/utilitary/extentions/IntEx.kt b/app/src/main/java/com/pixelized/rplexicon/utilitary/extentions/IntEx.kt new file mode 100644 index 0000000..56e8525 --- /dev/null +++ b/app/src/main/java/com/pixelized/rplexicon/utilitary/extentions/IntEx.kt @@ -0,0 +1,30 @@ +package com.pixelized.rplexicon.utilitary.extentions + +import com.pixelized.rplexicon.R +import kotlin.math.abs +import kotlin.math.floor + +val Int.icon + get() = when (this) { + 4 -> R.drawable.ic_d4_24 + 6 -> R.drawable.ic_d6_24 + 8 -> R.drawable.ic_d8_24 + 10 -> R.drawable.ic_d10_24 + 12 -> R.drawable.ic_d12_24 + else -> R.drawable.ic_d20_24 + } + +val Int.modifier: Int + get() = floor(this / 2 - 5f).toInt() + +fun Int.toLabel(): String = + "${this.signLabel}${abs(this)}" + +val Int.signLabel: String + get() = if (this < 0) "-" else "+" + +fun List.toLabel(): String = when (size) { + 0 -> "" + 1 -> "${abs(this[0])}" + else -> joinToString(" ") { "${it.signLabel} ${abs(it)}" }.substring(2) +} \ No newline at end of file diff --git a/app/src/main/java/com/pixelized/rplexicon/utilitary/extentions/ModifierEx.kt b/app/src/main/java/com/pixelized/rplexicon/utilitary/extentions/ModifierEx.kt index 6a06090..75dbadf 100644 --- a/app/src/main/java/com/pixelized/rplexicon/utilitary/extentions/ModifierEx.kt +++ b/app/src/main/java/com/pixelized/rplexicon/utilitary/extentions/ModifierEx.kt @@ -4,16 +4,24 @@ import androidx.compose.animation.core.FiniteAnimationSpec import androidx.compose.animation.core.Transition import androidx.compose.animation.core.spring import androidx.compose.foundation.ScrollState +import androidx.compose.foundation.background +import androidx.compose.foundation.border +import androidx.compose.foundation.clickable +import androidx.compose.foundation.interaction.MutableInteractionSource +import androidx.compose.foundation.isSystemInDarkTheme import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.heightIn import androidx.compose.foundation.layout.offset import androidx.compose.foundation.layout.padding import androidx.compose.foundation.shape.CircleShape import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.surfaceColorAtElevation import androidx.compose.runtime.Composable import androidx.compose.runtime.Stable +import androidx.compose.runtime.remember import androidx.compose.ui.Modifier import androidx.compose.ui.composed +import androidx.compose.ui.draw.clip import androidx.compose.ui.graphics.Color import androidx.compose.ui.graphics.Shape import androidx.compose.ui.platform.LocalDensity @@ -55,4 +63,59 @@ fun Modifier.scrollOffset( ): Modifier = composed { val density = LocalDensity.current this.offset(y = with(density) { block(scrollState.value.toDp()) }) +} + +fun Modifier.clickableInterceptor(): Modifier = composed { + this.clickable( + interactionSource = remember { MutableInteractionSource() }, + indication = null, + onClick = { }, + ) +} + +fun Modifier.ddBorder( + horizontalSpacing: Dp = 3.dp, + verticalSpacing: Dp = 3.dp, + outline: Shape, + outlineWidth: Dp = 1.dp, + inner: Shape, + innerWidth: Dp = 1.dp, +): Modifier = composed { + val isDarkTheme = isSystemInDarkTheme() + val colorScheme = MaterialTheme.lexicon.colorScheme + + return@composed this + .border( + width = outlineWidth, + color = colorScheme.characterSheet.outlineBorder, + shape = outline, + ) + .padding( + horizontal = horizontalSpacing, + vertical = verticalSpacing, + ) + .border( + width = innerWidth, + color = colorScheme.characterSheet.innerBorder, + shape = inner, + ) + .clip( + shape = inner, + ) + .thenIf( + predicate = { isDarkTheme }, + thenModifier = Modifier.background( + shape = inner, + color = colorScheme.base.surfaceColorAtElevation(2.dp) + ), + ) +} + +inline fun Modifier.thenIf( + crossinline predicate: () -> Boolean, + thenModifier: Modifier? = null, + elseModifier: Modifier? = null, +): Modifier = when (predicate()) { + true -> thenModifier?.let { this.then(it) } ?: this + else -> elseModifier?.let { this.then(it) } ?: this } \ No newline at end of file diff --git a/app/src/main/java/com/pixelized/rplexicon/utilitary/extentions/MutableStateEx+Boolean.kt b/app/src/main/java/com/pixelized/rplexicon/utilitary/extentions/MutableStateEx+Boolean.kt new file mode 100644 index 0000000..f46ad65 --- /dev/null +++ b/app/src/main/java/com/pixelized/rplexicon/utilitary/extentions/MutableStateEx+Boolean.kt @@ -0,0 +1,7 @@ +package com.pixelized.rplexicon.utilitary.extentions + +import androidx.compose.runtime.MutableState + +fun MutableState.switch() { + value = value.not() +} \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_d10_24.xml b/app/src/main/res/drawable/ic_d10_24.xml new file mode 100644 index 0000000..a62d4ca --- /dev/null +++ b/app/src/main/res/drawable/ic_d10_24.xml @@ -0,0 +1,10 @@ + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_d12_24.xml b/app/src/main/res/drawable/ic_d12_24.xml new file mode 100644 index 0000000..dfc2876 --- /dev/null +++ b/app/src/main/res/drawable/ic_d12_24.xml @@ -0,0 +1,10 @@ + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_d20_24.xml b/app/src/main/res/drawable/ic_d20_24.xml new file mode 100644 index 0000000..dee702d --- /dev/null +++ b/app/src/main/res/drawable/ic_d20_24.xml @@ -0,0 +1,10 @@ + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_d4_24.xml b/app/src/main/res/drawable/ic_d4_24.xml new file mode 100644 index 0000000..c180357 --- /dev/null +++ b/app/src/main/res/drawable/ic_d4_24.xml @@ -0,0 +1,10 @@ + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_d6_24.xml b/app/src/main/res/drawable/ic_d6_24.xml new file mode 100644 index 0000000..4086760 --- /dev/null +++ b/app/src/main/res/drawable/ic_d6_24.xml @@ -0,0 +1,10 @@ + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_d8_24.xml b/app/src/main/res/drawable/ic_d8_24.xml new file mode 100644 index 0000000..92b87d9 --- /dev/null +++ b/app/src/main/res/drawable/ic_d8_24.xml @@ -0,0 +1,10 @@ + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_launcher_foreground.xml b/app/src/main/res/drawable/ic_launcher_foreground.xml index 7dc617a..c27306f 100644 --- a/app/src/main/res/drawable/ic_launcher_foreground.xml +++ b/app/src/main/res/drawable/ic_launcher_foreground.xml @@ -1,14 +1,15 @@ - + android:viewportWidth="24" + android:viewportHeight="24" + android:tint="@android:color/white"> + + android:fillColor="@android:color/white" + android:pathData="M13.33,.369c-.821-.493-1.843-.494-2.665,0L1,6.141v11.719l9.664,5.771c.411,.247,.873,.37,1.333,.37s.921-.123,1.332-.369l9.671-5.772V6.141L13.33,.369ZM6.315,9.69l-4.315,6.327V7.277l4.315,2.412ZM12.056,1.636l4.094,7.364H7.863L12.056,1.636ZM7.86,10h8.279l-4.141,7.263-4.137-7.263Zm-.877,.481l4.033,7.08-8.336-.767,4.303-6.313Zm10.032,.002l4.411,6.311-8.441,.754,4.03-7.065Zm.664-.79l4.32-2.415V15.87l-4.32-6.178Zm3.82-3.282l-4.309,2.409L13.051,1.368l8.449,5.043ZM11.119,1.262l-4.304,7.561L2.5,6.411,11.119,1.262ZM2.879,17.816l8.618,.786,.002,4.309c-.11-.037-.22-.077-.322-.139L2.879,17.816Zm9.937,4.958c-.1,.06-.208,.099-.316,.135l-.002-4.321,8.607-.762-8.289,4.948Z" /> - + \ No newline at end of file diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher.webp b/app/src/main/res/mipmap-hdpi/ic_launcher.webp index 926ae4f976c136d9bb086048641adb2792441047..bcbc62de6f11c336ee319e6ac31e2ca3f80449b7 100644 GIT binary patch literal 2162 zcmWIYbaTt%U|?SxXyGe{m{t??{`@pvYjn+U35#$ z4(Dg@ij?lmjbfNp+Hsq6;~CRp^`hlQI&Uk~4%?Qr=X`o4(LTAfYj?|C$#?r0Iv5!Q zGRji7<=(!Qb9-Cv?Q`3LZ)}?=wdeoh=k~AmD{t?W>6}&L8~vNrlaSHvf9~mE~oDtA+3)0Q!ae2bh~Rk z=cA%f)bwDd$BR9dPj4&yHCdM?aZNuaSKuQD{2Vkr7XyMzt}3CyQ>&l50)A2p15XbO0=U-hu~HV?aRGdjjI?s?rJH7 zrTv<_%q3i1(_-(dJWqk2LiPM|_f#1}M57+ca|M3he4;sIsqf>^`mI^X+FN?85598h zo-xlWr_EP~XLiiGYsYyLvsr@9UD8ga#jZ@XDK3oV(5@Lv1TYqj%wHPB0r?vBkY-@%E zF765cHT%EXMfSg0^0$;F(!eG!StfpN{z>($qh`tuj16kfTg!^fY8V>qPbuyFAn)tR z$dGXI(~{)1=eC~m>Ax*=*z+Pw$$aY{Qs%!WI|{w{W8FWYWQkA!W9*F|kCfBIE_CKU z+b8rtBH?_Vy5s8w8|R2WJN?+UBqg(9qNZV2ZG_m{YcGf%en=_fqBUn(X1y`6DJWU=m7rwLll3Gb)rC*~_G zo3mQ=wrWGlre`-k{DHPgFxY-Ff4dN0{}W9vtw!(0_c1y8an ze=s*o-b@Z#)-jX+PJ7E-l?S^vJea;g>#o!BZH8tHb4uc`Xb2p1&D%+Di>p9!Y> zef=xHefnR|BVV*1{#m6np-gj8_e=SZnOR%Kc+`EE*4*el*?wN9;R?4a|MjPvhYda2r2*E{zI zGsBrv?L9f$mi~CLl#?Oh@OInNNq_m8N|FxiIv6jn^yKh9oN?4l&3oJQwkl77ekQB; zZM&V$X_rqhj+(!P`y%t=1^e#K*s!*gfuZ!H^h`OM8cvp(K#)^a@YLM`o;?de5# z!%_}hnfKdI-fD&2*|=Q!XZwn^4Xjt4=zYA$yF>4DpLEUbKE{Zh*7vzynlEC$z#F&F z{yKa5xz*xoi?puSMDx$DS{RdjWa<5LH{}x!TVB?4W%K0=@;JK2&t`Qu%fCIA=bzM7 zztb&R%o3t4^6#<5)&o;zX5Lqv)G(t?TW?vqW4WqTSVDGnkNjV;f9LdXgas^0dR1?( z*1G(ZgXlxeP{w0Bm!(~6m{+_i{`bt|asS?ihE06sZ(F)&^S}SUU%pz-_HF);wT6q7 zE*^_~xNzWu01?W*?ZzA}u)aeem4Yr>riCb1YX1DJa>6zB!zD za`~(c)=Afo8!)yW*ysG<`?<97NH7+W)PPsQlUx@$bvpql|Li{&IiXaV5*C?Ye2i=k+2nDs}a@>u*jxU%4=L>jA(2A=8;A z9>|+!uK(D(X-A~?%E|MnY0$l3tRV(b9Qa>^-V05XPRQLT)B-fYcnJaE_JN!A)zUEW9 zy;Q@*-7h}tx>ol_ADSazbLjRQgVtTU_Fn#0{L()EU+RR|KW~*8I+#v~`fPW*_@iRY z3pu}~&6DHrS+lO5%BOSVo?XOkW4;MhXB;E%|2e$2|Mub+*MnX9uAev`$|S%xfnfs6 r1fhG+O&bDk{MXs9wEc}}&M`6NuMLw+jtSq}`&v@<>newgMNSL=v}zkE literal 1868 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 OQ*v~TrL65z1_l6F=Etl6 literal 3278 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 IKF(zT040CrzW@LL diff --git a/app/src/main/res/mipmap-xhdpi/ic_launcher.webp b/app/src/main/res/mipmap-xhdpi/ic_launcher.webp index 0eb777f8c3888a2bf2330aa19c0f94e05ac4d8d3..139d18a7d86b58719fe61a2c89c07a802c4c651e 100644 GIT binary patch literal 2830 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 YANzj0PvY@PpQG=2>h~iFo-i&(0PqoVF#rGn literal 2568 zcmWIYbaP|iVqge&bqWXzu<-f9$-tl=e?VLyw7qFt?u-`uH}8x(IyfJMTQBE*Iy2Y6 z`Kh?yHs488yuLrOt6DZqn*GQ1>%OJMZmKN8Z<#%RI522B30y2IXpl9!bervbN`!)| ztkN-l!H>r{ZsxcqJcd|R%pf6nb~Z;iBt4csPAHL86Taxx<)blcf{rWG0g>%DWuiuT`s|NVFE z4(D(C=UK9=ozYP|5f#8LY5gZ=T0sBdV@ew*_MQ>`ntJENmmM3YZrqy4J@Ky7qXSPD ztvJ%x;~SGR&te;ckr3zOtn`#^4M+P{FFm2xIPrw0*3^|fu1!6z(^OR=odTPEWporb zw^@{^?zr{9$f#(-R*#&=r^KxKOb_t+ML0dZacdLHuGV8qqhG9uny_)=Ng*Lm@dXs&K!eCCavej}P2Lt{F7nZpvZvEH4 zT9ckU+cNOU4r#AA$vLMYUhkQ^q3?3ke?R#<)4tu%^o+Q(`tYknM(1sV$$uXHS;yQ%rbVXmAqNPkYUZXrQ4Hfx7p(_MTL*|x-IV5b!G13uBS1F_ogk5 zx$@Q~Z^omb10UWBw&q_~ILy>OXYJ}mI|T2Z*z{F9@@d@0igjI|Ha@T4;u4kdc;%ZZ zuIE0;?`~8pkj00!QvU(mzcB;G-d(ND|>~q~#N-;Wyf#Yu3I{AYqg68-O7rhnO zrSqKW1fTkk?>Q;2B$=++*msl!|B26enJ;GX^uWp^MRAk-m&|GGoh~@-#9Q$rss8&K zd171iE-!V+Og|AM5&quIJz;{9?S92$!GfK2Dy>SlT^8g|cl}wD z7VRi6zxwQVr|SLlW~xFv3s(lnJnfYeJ>OltOz+F3=TQqR^t?Z{s$|~fnv}ZQwY5As z$snwewQ$OAF^dGRJkgyT6{c3xj3gefh?u_VsEvIo^KmwX>rs|d7Cou|^mvX#>N36O zQ#12lc}&y0F!%NE21U=yHAdxY7$)S-zMYWH6!7VO=cQjI=e8;d-rmi~uuSD;MTk$- z9BzqSYXdjrajX7MHJRme>t*VqruPy32*(oON=HSG_qEAF5BU6yxw`Q~K1xsexzUxrs5KW1irfA;*?s?}lVUx>+H z@zM2QUu^s*l80|Q({Ax4#rM)aXDta|yvJ(o_4UGQUw^H?`agg3+48#D8xNTlENxZs zNC`VRqs+berB(ikO}h}=jS&f zUyXCC%gY{jMytL)ziZhjwgSIbU)Y!=0VhAH2-dSjsfs_Jl~?c&*O;hskE^Qm_4wpKu=7Wx0ms zz|GH(lUNqWe9P<+mEgSXH*IZeZQWe`4(&6Ozkd6)eU7+#rTzQ^q6#{uzMVPj3KO$^ zdqp#PmtWd?=XUlbKCyX+`MTq_Lrh_ zb<*1Zo#aj3=US@TTkP|8R;M|`m7)y`6!Ms7>BJfq21*3*EPd;Fr%iYEy?=`T_0DOk z`S66v-hFc5L|gI`dl&8I%!Ga0hsO96`-C|cocBD|&eZJ4_S_dbbDNjl-fgqFT^hZ6k0j{ZDMVG={dRQD ztH3+ zzWxnl_}{8C`TN_Nx|k=K`IjstOiZ|`@%nPoR%cXSN?@L3q@1F4Vb6;%L zJB5_1)}8zMcyX!K0mDj>HEE`N#_lFZ?=Tw0cuw<+Wntx-d7#>4ljU2#St5sj2mXn# zS1D%SA=Bw-v1{Us|6f$TerZ3iUhw(!gkJTT4k?k{M|CDKwI*|%x$Q9h@TV_PCyaPh zGI=}hNY8UfWeRWWJY$~DWH)2Ok-(pyZ9L<+FJ1Yw;KKd1tn1oM%l8@k7`46F(0FEV z($2y=OHLj(S+T3*H-8|j$dj$pzU}f`vN@_$<+8_eWyx?mccw*pUQrt*o-X2C-zA-6 zJ((ppzCTv4EON%fE1Ob-r{vyVHNQ#!ID?P^_vzai7kLu@F5b|XrtK3J$)~WSu*0mb zPwVK0x?AGf7mKrfgDV)68YX?#XRzNbmcKeP;DD5&$%R{KGq-;EzHs_umIQ__o`Y(l zx3g5aAATmQR`dXKNdt4ibCdhF^JlE83VRnDbk(kK-tp;7 E0H4~}iU0rr diff --git a/app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp b/app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp index c0843877fdd77090809215c76d68435fd64b5918..0a37012409cb8f583cba04b8233f14f0f21677fe 100644 GIT binary patch literal 5458 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 H@G=4bxzA%w literal 3936 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 diff --git a/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp b/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp index 1b802ebeae45c469e72df00e7dda7b007e293e09..aee1b6c966e30eed2e4d65331dcd359b58a5c0c3 100644 GIT binary patch literal 8962 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 diff --git a/app/src/main/res/mipmap-xxxhdpi/ic_launcher.webp b/app/src/main/res/mipmap-xxxhdpi/ic_launcher.webp index 3f5cde9d691ffc89ac78914ec24c18678cc5309f..7b65045b099ac20371204cd22b7acdf191b9a486 100644 GIT binary patch literal 5750 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 diff --git a/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp b/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp index 94ced82ad91fb6579ab12ba1484e5a803b290140..8b85bbe7025567035fdff1c65b628ba254143e09 100644 GIT binary patch literal 12136 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

3Icq{kFvi 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 SmeIH>@o>k1AB(4CY5@Siv*)G& literal 10036 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 Xt~cFauHFwZu6>ca4Cd?9axnk^QaW0R diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index 60b9483..789c09d 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -55,4 +55,49 @@ Carte Coordonnées + + Feuille de personnage + Force + FOR + Dextérité + DEX + Constitution + CON + Intelligence + INT + Sagesse + SAG + Charisme + CHA + Jet de sauvegarde + Talent + Acrobaties + Dressage + Arcanes + Athlétisme + Tromperie + Histoire + Intuition + Intimidation + Investigation + Médecine + Nature + Perception + Représentation + Persuasion + Religion + Escamotage + Discrétion + Survie + + Maîtrise \"%1$s\" + Expertise \"%1$s\" + Jet de sauvegarde + + TEST \"%1$s\" + Test \"%1$s\" + Bonus \"%1$s\" + + JET DE SAUVEGARDE : %1$s + Sauvegarde de \"%1$s\" \ No newline at end of file diff --git a/app/src/main/res/values/ic_launcher_background.xml b/app/src/main/res/values/ic_launcher_background.xml index 0530591..30ecd77 100644 --- a/app/src/main/res/values/ic_launcher_background.xml +++ b/app/src/main/res/values/ic_launcher_background.xml @@ -1,4 +1,4 @@ - #1C1B1F + #00ACC1 \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 2cc8da1..bf98b5d 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -55,4 +55,49 @@ Map Coordinates + + Character sheet + Strength + STR + Dexterity + DEX + Constitution + CON + Intelligence + INT + Wisdom + WIS + Charisma + CHA + Saving Throws + Proficiency + Acrobatics + Animal Handling + Arcana + Athletics + Deception + History + Insight + Intimidation + Investigation + Medicine + Nature + Perception + Performance + Persuasion + Religion + Sleight Of Hand + Stealth + Survival + + %1$s proficiency + %1$s expertise + Saving throw + + %1$s CHECK + %1$s check + %1$s bonus + + %1$s SAVING THROW + %1$s save \ No newline at end of file