From 0a39a7772acd57197dbab6d00779a930eae54715 Mon Sep 17 00:00:00 2001 From: ChaoticByte Date: Wed, 6 Aug 2025 10:22:38 +0200 Subject: [PATCH] Initial commit with existing project files --- .editorconfig | 4 + .gitattributes | 2 + .gitignore | 3 + assets/fonts/monogram/credits.txt | 15 ++ assets/fonts/monogram/monogram-extended.ttf | Bin 0 -> 59008 bytes .../monogram/monogram-extended.ttf.import | 40 +++ assets/icons/CloseIcon.png | Bin 0 -> 200 bytes assets/icons/CloseIcon.png.import | 34 +++ assets/icons/CloseIcon.pxo | Bin 0 -> 1193 bytes assets/icons/PhrasesIcon.png | Bin 0 -> 185 bytes assets/icons/PhrasesIcon.png.import | 34 +++ assets/icons/PhrasesIcon.pxo | Bin 0 -> 1154 bytes assets/icons/RemoveIcon.png | Bin 0 -> 159 bytes assets/icons/RemoveIcon.png.import | 34 +++ assets/icons/RemoveIcon.pxo | Bin 0 -> 817 bytes assets/icons/SettingsIcon.png | Bin 0 -> 313 bytes assets/icons/SettingsIcon.png.import | 34 +++ assets/icons/SettingsIcon.pxo | Bin 0 -> 1680 bytes assets/icons/icon.png | Bin 0 -> 1563 bytes assets/icons/icon.png.import | 34 +++ assets/icons/icon.pxo | Bin 0 -> 826 bytes assets/icons/icon.svg.import | 37 +++ assets/icons/icon_bg.png | Bin 0 -> 327424 bytes assets/icons/icon_bg.png.import | 34 +++ export_presets.cfg | 216 ++++++++++++++++ project.godot | 42 ++++ resources/button_box.tres | 13 + resources/level_label_settings.tres | 4 + resources/line_edit_box.tres | 9 + resources/main_theme_overrides.tres | 49 ++++ scenes/main.tscn | 235 ++++++++++++++++++ scenes/phrases_menu.tscn | 92 +++++++ scenes/phrases_menu_single_phrase.tscn | 35 +++ scenes/settings_menu.tscn | 82 ++++++ src/global/CoreGameplayManager.gd | 72 ++++++ src/global/CoreGameplayManager.gd.uid | 1 + src/global/NotificationQueue.gd | 12 + src/global/NotificationQueue.gd.uid | 1 + src/global/PhrasesManager.gd | 34 +++ src/global/PhrasesManager.gd.uid | 1 + src/global/SaveManager.gd | 33 +++ src/global/SaveManager.gd.uid | 1 + src/global/XpLevelManager.gd | 32 +++ src/global/XpLevelManager.gd.uid | 1 + src/shaders/panel.gdshader | 8 + src/shaders/panel.gdshader.uid | 1 + src/ui/level_counter.gd | 9 + src/ui/level_counter.gd.uid | 1 + src/ui/main.gd | 40 +++ src/ui/main.gd.uid | 1 + src/ui/notification_container.gd | 26 ++ src/ui/notification_container.gd.uid | 1 + src/ui/phrases_menu.gd | 13 + src/ui/phrases_menu.gd.uid | 1 + src/ui/phrases_menu_phrase.gd | 10 + src/ui/phrases_menu_phrase.gd.uid | 1 + src/ui/points_counter.gd | 9 + src/ui/points_counter.gd.uid | 1 + src/ui/required_points_counter.gd | 9 + src/ui/required_points_counter.gd.uid | 1 + src/ui/settings_menu.gd | 12 + src/ui/settings_menu.gd.uid | 1 + 62 files changed, 1415 insertions(+) create mode 100644 .editorconfig create mode 100644 .gitattributes create mode 100644 .gitignore create mode 100644 assets/fonts/monogram/credits.txt create mode 100644 assets/fonts/monogram/monogram-extended.ttf create mode 100644 assets/fonts/monogram/monogram-extended.ttf.import create mode 100644 assets/icons/CloseIcon.png create mode 100644 assets/icons/CloseIcon.png.import create mode 100644 assets/icons/CloseIcon.pxo create mode 100644 assets/icons/PhrasesIcon.png create mode 100644 assets/icons/PhrasesIcon.png.import create mode 100644 assets/icons/PhrasesIcon.pxo create mode 100644 assets/icons/RemoveIcon.png create mode 100644 assets/icons/RemoveIcon.png.import create mode 100644 assets/icons/RemoveIcon.pxo create mode 100644 assets/icons/SettingsIcon.png create mode 100644 assets/icons/SettingsIcon.png.import create mode 100644 assets/icons/SettingsIcon.pxo create mode 100644 assets/icons/icon.png create mode 100644 assets/icons/icon.png.import create mode 100644 assets/icons/icon.pxo create mode 100644 assets/icons/icon.svg.import create mode 100644 assets/icons/icon_bg.png create mode 100644 assets/icons/icon_bg.png.import create mode 100644 export_presets.cfg create mode 100644 project.godot create mode 100644 resources/button_box.tres create mode 100644 resources/level_label_settings.tres create mode 100644 resources/line_edit_box.tres create mode 100644 resources/main_theme_overrides.tres create mode 100644 scenes/main.tscn create mode 100644 scenes/phrases_menu.tscn create mode 100644 scenes/phrases_menu_single_phrase.tscn create mode 100644 scenes/settings_menu.tscn create mode 100644 src/global/CoreGameplayManager.gd create mode 100644 src/global/CoreGameplayManager.gd.uid create mode 100644 src/global/NotificationQueue.gd create mode 100644 src/global/NotificationQueue.gd.uid create mode 100644 src/global/PhrasesManager.gd create mode 100644 src/global/PhrasesManager.gd.uid create mode 100644 src/global/SaveManager.gd create mode 100644 src/global/SaveManager.gd.uid create mode 100644 src/global/XpLevelManager.gd create mode 100644 src/global/XpLevelManager.gd.uid create mode 100644 src/shaders/panel.gdshader create mode 100644 src/shaders/panel.gdshader.uid create mode 100644 src/ui/level_counter.gd create mode 100644 src/ui/level_counter.gd.uid create mode 100644 src/ui/main.gd create mode 100644 src/ui/main.gd.uid create mode 100644 src/ui/notification_container.gd create mode 100644 src/ui/notification_container.gd.uid create mode 100644 src/ui/phrases_menu.gd create mode 100644 src/ui/phrases_menu.gd.uid create mode 100644 src/ui/phrases_menu_phrase.gd create mode 100644 src/ui/phrases_menu_phrase.gd.uid create mode 100644 src/ui/points_counter.gd create mode 100644 src/ui/points_counter.gd.uid create mode 100644 src/ui/required_points_counter.gd create mode 100644 src/ui/required_points_counter.gd.uid create mode 100644 src/ui/settings_menu.gd create mode 100644 src/ui/settings_menu.gd.uid diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..f28239b --- /dev/null +++ b/.editorconfig @@ -0,0 +1,4 @@ +root = true + +[*] +charset = utf-8 diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..8ad74f7 --- /dev/null +++ b/.gitattributes @@ -0,0 +1,2 @@ +# Normalize EOL for all files that Git considers text files. +* text=auto eol=lf diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..0af181c --- /dev/null +++ b/.gitignore @@ -0,0 +1,3 @@ +# Godot 4+ specific ignores +.godot/ +/android/ diff --git a/assets/fonts/monogram/credits.txt b/assets/fonts/monogram/credits.txt new file mode 100644 index 0000000..1c053aa --- /dev/null +++ b/assets/fonts/monogram/credits.txt @@ -0,0 +1,15 @@ +# CREDITS + +Monogram is a free and Creative Commons Zero pixel font, +made by Vinícius Menézio (@vmenezio). + +https://datagoblin.itch.io/monogram + + +# SPECIAL THANKS + +thanks to Ateş Göral (@atesgoral) for creating the bitmap font converter: +https://codepen.io/atesgoral/details/RwGOvPZ + +thanks to Éric Araujo (@merwok_) for the inital port of monogram to PICO-8: +https://itch.io/post/2625522 \ No newline at end of file diff --git a/assets/fonts/monogram/monogram-extended.ttf b/assets/fonts/monogram/monogram-extended.ttf new file mode 100644 index 0000000000000000000000000000000000000000..e1debf0fd34aa5f788d33dbf6b37c273c8cc8443 GIT binary patch literal 59008 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 Gr~f~BJ%ow? literal 0 HcmV?d00001 diff --git a/assets/fonts/monogram/monogram-extended.ttf.import b/assets/fonts/monogram/monogram-extended.ttf.import new file mode 100644 index 0000000..fb36945 --- /dev/null +++ b/assets/fonts/monogram/monogram-extended.ttf.import @@ -0,0 +1,40 @@ +[remap] + +importer="font_data_dynamic" +type="FontFile" +uid="uid://cfghoopnpsdsf" +path="res://.godot/imported/monogram-extended.ttf-56ae86f9f5736fb4eef35cc80a7635a8.fontdata" + +[deps] + +source_file="res://assets/fonts/monogram/monogram-extended.ttf" +dest_files=["res://.godot/imported/monogram-extended.ttf-56ae86f9f5736fb4eef35cc80a7635a8.fontdata"] + +[params] + +Rendering=null +antialiasing=1 +generate_mipmaps=false +disable_embedded_bitmaps=true +multichannel_signed_distance_field=false +msdf_pixel_range=8 +msdf_size=48 +allow_system_fallback=true +force_autohinter=false +hinting=1 +subpixel_positioning=4 +keep_rounding_remainders=true +oversampling=10.0 +Fallbacks=null +fallbacks=[] +Compress=null +compress=true +preload=[{ +"chars": [], +"glyphs": [], +"name": "New Configuration", +"size": Vector2i(16, 0) +}] +language_support={} +script_support={} +opentype_features={} diff --git a/assets/icons/CloseIcon.png b/assets/icons/CloseIcon.png new file mode 100644 index 0000000000000000000000000000000000000000..9371d87f1dd68aed27db38f0787019c30f04a174 GIT binary patch literal 200 zcmeAS@N?(olHy`uVBq!ia0vp^{2>&aNrq-zG}1GB_A{s+ql7s5*0TSi|;jGQAxQ zs}?a&@CkKwIm27-U#_2TpvHIBWC62IZ+wGpGV6}{cXNFj?jO@Ta_L9iW3dI?>6{Tu xZ!wi!4`e*I+rcFv%{|p@v$IRqtNHPzj7C+aFPgq~Jp#Ih!PC{xWt~$(697g~Ngn_J literal 0 HcmV?d00001 diff --git a/assets/icons/CloseIcon.png.import b/assets/icons/CloseIcon.png.import new file mode 100644 index 0000000..d2d66cb --- /dev/null +++ b/assets/icons/CloseIcon.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://cbv7fmq2x6ucf" +path="res://.godot/imported/CloseIcon.png-b75d96efeff44030f114fd8cab0b66cc.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/icons/CloseIcon.png" +dest_files=["res://.godot/imported/CloseIcon.png-b75d96efeff44030f114fd8cab0b66cc.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/icons/CloseIcon.pxo b/assets/icons/CloseIcon.pxo new file mode 100644 index 0000000000000000000000000000000000000000..ff3f670638c468a8f49de732567a48f21dbad19b GIT binary patch literal 1193 zcmWIWW@Zs#VBp|jXx_pcov30qp_-9_fs+M@85kH+5=#>GvWoNb_68sHJ8Z!7SM-Un zM{1N{!HcQFLiG*HPGsLroTwH!sjn^bf8XY9J&Z!)4}x5`-9KG@{w&|Mef<6+3#wv7 z1EO>HzRGb9xGUn&yxDHmG}D#We(@=XoW8v2pkLZUzuOMqx0(hxyl#10rr5l8dfu{o zj=ohkB_bOSb_Bfr#v0LXdYmP6=JV<>c2=i~eNztIJo(&dN4)6lHnxcy_3I{juQA_y z{6tbhOZ}2_Z+*|7oipi}OI^w4Ybmod4IHn|nwz{iP_`|7Mbwo>mG#?}TAfRXwh#V% z&w8uD(w`IbEwo)1FBG4;IC$1s_Zut2+voMXdA3PMLCrktr)7gKyBKqT>;2$!pY`v? z{9Ql$YPw+`yO2%UifxZKVDw{ zW`9bvTK;m5)y~W6PjzNHJ3ZaXaYo+J^^VVv8S;L9k-S;GjfZ`{ZJo&Xtp95XOHH)D z`yz+WlYTkG^?Ew+aq+e<-*dfu?&`nN0Vpw~xZ!A}H85scm>C$PfplhWVtQ&kD4z7w ziV|~Ei}ella}q04i{cHF6A}_C{{8t`FOa6dq_DbmW9P;Gbz;(LVe)o`PQNrvrw9EP zSS&x^F6pm(ZngVk{{3|+hBdz~d~LqLfNE#&d!|c3>llCugFzXGotb$lnaQce@i4m? z(9DSBc_|YJ)JxdiMrS8`axp0IFn^x^?|-cqe``S2_Q{Nbh0Elc7!;J;#ibI%%Dtaf zUprSd{ilB4&lBnAKhKP>oO%DFTCw`SYnOd~bw4Zlo&5gzzZ-AAJ->hN&th&$ePfgi z@(m*s0|V}y0`wXNAO8F--o!I;%9NA@5Lk3V)1x7aZQ}y& zBgc;mFD-m{sPzZ0Q@BI0c;e=qgqW7|lNx!IbHw=ObQeUL%(Csh^R7L5PKcfs=uOAtkXSQ7@}FKW}gF$-LVJ0)M9_ z_-QWSm^SCi%6|*C-{WqU@K&xC=v47IH8tnQed{Yi$9)@OZpE=AO*_6lApOS9bMhyg zKNin+$dq~vGCn`(pBXuoPbq588s zLTTSC88$J-%fF&u+_+aBqibhsF=6(VH&U0b=FH5Q${T&UYJJof{eUYsDuj-|nssV} z&g@UEtFGT$+j8^#+#Q-MrhkJjnqS>ex4T&T$|7ami#92oEeHKv?856)&L5KNdSKO+ z_D@>#vG9-mQQPW+Hr|>1Cb|2S#=&02!-n3QP3k`|K3>N2_1Ued*Wa&DQw*N;NbI}! zmwEn6o}5fM|2cBT^K480wRc{!rSiVMI6r6dvzuvub)(nIUGJa$T;=@bsR}H2&POQz zbG(>;RoipUU#36%413&SULP)fc=*>DEi)V4!qRzjX2mpSNM(I%pYcKa`P--F0VuIH z@7(Mcy1>|~U}IpA2GW_iiRr2Fpt#ddD@x2wE!H>G&q=IIEs8fxPFNsU@$Jpcdan;2 zM#rySovL9o&gd9J|vE+Ri5w@$WsHZZXrDmw^G*mfrVFmzaU31Cs}XG7eiZ z^HMUCQ;XwawxOG0Fn{Ma6`)?iE;TYXF!+)0pz5RPVAkH~V~}-jh2`RBJ+q9n_{xek z7_Y2ScaWgifkw$72Qo4-FyPJtK-Yr345E=T1iCi#IDjYzk=uX)h9^eQ4MGoQgh4Vu zcVaULEzr>oL=SU>feAPagv6c^xB3 literal 0 HcmV?d00001 diff --git a/assets/icons/RemoveIcon.png b/assets/icons/RemoveIcon.png new file mode 100644 index 0000000000000000000000000000000000000000..47c8a8f86b874fd5745f33439e45d0722c896e06 GIT binary patch literal 159 zcmeAS@N?(olHy`uVBq!ia0vp@Ak4uAB#T}@sR2@q#X;^)4C~IxyaaM0JzX3_G$ziS zbddLe0uQtPoBhi-v;Gxnxuv4}gZ)Q}Fst9y{J&pK7|Q4KOK$kJOy#Ra;T_Me*)|9L z6_|_gAar5-$MN3}Agh_WsJ4dW;OJJMw;GLVyOQwtB2TmQgi<$_ugu&C*&t;uc GLK6Uf@j1`{ literal 0 HcmV?d00001 diff --git a/assets/icons/RemoveIcon.png.import b/assets/icons/RemoveIcon.png.import new file mode 100644 index 0000000..1e25865 --- /dev/null +++ b/assets/icons/RemoveIcon.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://cdf7kvjxmp6a" +path="res://.godot/imported/RemoveIcon.png-8df13dc96db1300c7fc18053deaf60fe.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/icons/RemoveIcon.png" +dest_files=["res://.godot/imported/RemoveIcon.png-8df13dc96db1300c7fc18053deaf60fe.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/icons/RemoveIcon.pxo b/assets/icons/RemoveIcon.pxo new file mode 100644 index 0000000000000000000000000000000000000000..42bb8ae0516770a4139d3c7adc71444d814874d7 GIT binary patch literal 817 zcmWIWW@Zs#VBp|jc)N)?IzIpNq+CV@h7U{(44e!M3@M2viF#SZ`FX8Dr~M8a2>cP< zqCUatYQuvG_70DZh=yJ>ySYXCQG3qvBO!mwulYJjHy$~R$LU>c(5Zt)}J+^-Sjw1=*;KUVd;dlB+mo0QGnd6dwxw=Qk z+x>@WY2N#)ytHgtwNHzia^08BjNw}K?uMnA^-{wchpS2A9zNT2uNJc1{?$Bd{=G|w zL=I-h6$E#=InUR+9V$CJ`^Kf!&i-ypd-b_HPWDFq<9~3V@hC&c#qU#m^^RJ|d3;zA zD0}3+rL@JA)kR+mj1fsiA2Tl#<2KbdlM!8QqtGb#I}U*`M^@)tia|7(dNmx+Cl{E5|uoF^O? zKHPBr{jbHv#lP4BP~znMXRAU>U|cK##)&kL&dg0rPmKq~jDA{CVs2`&zM+0jVr6Pk zykT;J0{@?Orl2b}_5c3Z+tnIaPOwTTjQLft^7zvJ2~|12Is*IO$vHiAT4%fDSNoL$ zW%arfp6oz_QElvf&vc0yXcI6YFeu}&F*7eEGdZ<59%eHG&Px#^GQTOR7i=vRlyMhAqd1wim(AF!{Vk& zb6E9T3ap`tJUm8$X3n+NDfwGMouNJ~`=ykr&ApKhpo7?b&t?gpvs=_!A?G|ShiB7h zx{iov&e?UCA;t(q)F`Qw)DFQYFo07Qi z$Yu$;_uL*NqD}>#ZHjNd=S@SIIS|n)>y?Cde5N=0Ue%{@XgL$_Nc>Ydp zS}s=5ta7yMgZ!60j|Dh-e63wlJtsW5;x(aOU-Y);X3-a!&KH|`8=q9y)hsD(S^NHQ zAJdfm=By!M(d(_Eg{RnaEjSn{A9{FJNOEnv;Hjs%Hxkshe&|k0x!m^rl$6GTLZ=_a zid%c9H=U_#>H1RfLL;eHaG}jSt_^(JeVnI4*S(LN>&o%`ZxB=E6@0U>%udC+dg(7o3a((Hg!MW+xjhp?Z5?`TC$TcMDBkewBuhR91rC!3QW_dU}kW}u^hX^KG^ zhvPEyQZkcMi{qh=OlDv}HRJZaS4&HPdI@{b=xS&**8u~L*QtB{3+`U;sG02(^mj(U zihdXEkmC(b_$)&EPvA5DnP(ojb~H*Q<96)Lwb{c_SB0<|5aPHtHa_|)a{$Gm5Yrd*Ijyl z?7x1!z|EzqLB)r z0B=-n=qVqf97JvbrZ+tK0No&TUmy$$1iBNOL1<|f-9Ypti!g914g(>H-w53x+%9us tCdOqL2BN1egv;7+7zlBhG4U=lWFf|7Km%FXK(@03AuBLcN`cxK7ywuER9OH3 literal 0 HcmV?d00001 diff --git a/assets/icons/icon.png b/assets/icons/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..2bb9a0455e740e0d59baa20e5ca575a6c396b45a GIT binary patch literal 1563 zcmeAS@N?(olHy`uVBq!ia0y~yVB7)19Be=l^HZNT11ZMhAa^H*b?0PWGBB`S^>lFz zshIQj`oXogtwdZe{y4mJg71#{6`ZTY(|_H6qUbT@!o9fF43B)4^!|R#4%9tFz@BNh z-!ayh9;ci#NqIRnvI6bTQ-MkNLfz~Yk-@wh+pwh^!;Q4^TL&$<*5(}B!UGL=%glDh4EBqii z=I`FKmio2*_K%w=Hy7llce~j?#L4v^f5*9J;$w?4{|C)GDReE=r%QgnW85&fBMZG@t zJnr6{&zHWR`}~EUr}!Y5`2;CoKv@o$Z5~YRHJlf|Z~L`fpLU);Ygz99;~LNtk$;TD zDa?{kt4eO$GORNJW&023fNu9!I82?;86w3V$eI5S_!stD%7pptuLE&CUHx3vIVCg! E022m`qyPW_ literal 0 HcmV?d00001 diff --git a/assets/icons/icon.png.import b/assets/icons/icon.png.import new file mode 100644 index 0000000..e949a47 --- /dev/null +++ b/assets/icons/icon.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://020ibqgo0y3m" +path="res://.godot/imported/icon.png-816117353ba57afc3af521f78eedcc3c.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/icons/icon.png" +dest_files=["res://.godot/imported/icon.png-816117353ba57afc3af521f78eedcc3c.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/icons/icon.pxo b/assets/icons/icon.pxo new file mode 100644 index 0000000000000000000000000000000000000000..2889f755178f7a6ebbd7c55d949c5385a50e1f06 GIT binary patch literal 826 zcmWIWW@Zs#VBp|jkY2+Q9T3}kIg^or;T;nL11AFmLrP*vqFz>UeqL+P#k^(%o!?#j5zzK9847j94EKXdP$8 z6_M^J*>Lx@i6scrSQA%q}a;}TzQMOypv^{wp96#dTEw? z)w=XxUALmeO|{;;=KbMZm31@f8vE6S_Kr6bUVFYV*DQO3}*iK;EpT0 zxZh4vke}%Vw$+|dknnrjfo8qm&)BhRg+}teDV6wwy(AelQ!4s zZ@XE+Ve}yJ5y#8-9-gZm-(K82pR?Zlk!?e|tsP_iwa1fBT>cZVSAF?06NT2+S$_@p zzIA^6?i+6aN_>cfY!z_>#=``51_o&$otc}Mo*EB|75%iL#N5t!aC+D~)oW*&-^K-*mhAQ~x&p=(3;J488%oB(tWo{&H{2;CP5gZP2&#AXnhp8~vD*+80@f$$=b K4hCvtU;qGPa469L literal 0 HcmV?d00001 diff --git a/assets/icons/icon.svg.import b/assets/icons/icon.svg.import new file mode 100644 index 0000000..61c8eaa --- /dev/null +++ b/assets/icons/icon.svg.import @@ -0,0 +1,37 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://j7n2kpuwt04v" +path="res://.godot/imported/icon.svg-7c8e6dfe2213e2029f33175ecfc9166b.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/icons/icon.svg" +dest_files=["res://.godot/imported/icon.svg-7c8e6dfe2213e2029f33175ecfc9166b.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 +svg/scale=1.0 +editor/scale_with_editor_scale=false +editor/convert_colors_with_editor_theme=false diff --git a/assets/icons/icon_bg.png b/assets/icons/icon_bg.png new file mode 100644 index 0000000000000000000000000000000000000000..136235c133ff8229e7ff2fa05fc93e39b75cbc8f GIT binary patch literal 327424 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 H^O64p+QTP9 literal 0 HcmV?d00001 diff --git a/assets/icons/icon_bg.png.import b/assets/icons/icon_bg.png.import new file mode 100644 index 0000000..f3aadad --- /dev/null +++ b/assets/icons/icon_bg.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://cma2jcuhcs0g" +path="res://.godot/imported/icon_bg.png-966040e9004d7b7ef96822c2010a941b.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/icons/icon_bg.png" +dest_files=["res://.godot/imported/icon_bg.png-966040e9004d7b7ef96822c2010a941b.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/export_presets.cfg b/export_presets.cfg new file mode 100644 index 0000000..a0a2f90 --- /dev/null +++ b/export_presets.cfg @@ -0,0 +1,216 @@ +[preset.0] + +name="Android" +platform="Android" +runnable=true +advanced_options=false +dedicated_server=false +custom_features="" +export_filter="all_resources" +include_filter="" +exclude_filter="" +export_path="./Repeat After Me.apk" +patches=PackedStringArray() +encryption_include_filters="" +encryption_exclude_filters="" +seed=0 +encrypt_pck=false +encrypt_directory=false +script_export_mode=2 + +[preset.0.options] + +custom_template/debug="" +custom_template/release="" +gradle_build/use_gradle_build=false +gradle_build/gradle_build_directory="" +gradle_build/android_source_template="" +gradle_build/compress_native_libraries=false +gradle_build/export_format=0 +gradle_build/min_sdk="" +gradle_build/target_sdk="" +architectures/armeabi-v7a=false +architectures/arm64-v8a=true +architectures/x86=false +architectures/x86_64=false +version/code=1 +version/name="" +package/unique_name="net.chaoticbyte.repeatafterme" +package/name="" +package/signed=true +package/app_category=2 +package/retain_data_on_uninstall=false +package/exclude_from_recents=false +package/show_in_android_tv=false +package/show_in_app_library=true +package/show_as_launcher_app=false +launcher_icons/main_192x192="uid://020ibqgo0y3m" +launcher_icons/adaptive_foreground_432x432="uid://020ibqgo0y3m" +launcher_icons/adaptive_background_432x432="uid://cma2jcuhcs0g" +launcher_icons/adaptive_monochrome_432x432="uid://020ibqgo0y3m" +graphics/opengl_debug=false +xr_features/xr_mode=0 +gesture/swipe_to_dismiss=false +screen/immersive_mode=true +screen/support_small=true +screen/support_normal=true +screen/support_large=true +screen/support_xlarge=true +user_data_backup/allow=false +command_line/extra_args="" +apk_expansion/enable=false +apk_expansion/SALT="" +apk_expansion/public_key="" +permissions/custom_permissions=PackedStringArray() +permissions/access_checkin_properties=false +permissions/access_coarse_location=false +permissions/access_fine_location=false +permissions/access_location_extra_commands=false +permissions/access_media_location=false +permissions/access_mock_location=false +permissions/access_network_state=false +permissions/access_surface_flinger=false +permissions/access_wifi_state=false +permissions/account_manager=false +permissions/add_voicemail=false +permissions/authenticate_accounts=false +permissions/battery_stats=false +permissions/bind_accessibility_service=false +permissions/bind_appwidget=false +permissions/bind_device_admin=false +permissions/bind_input_method=false +permissions/bind_nfc_service=false +permissions/bind_notification_listener_service=false +permissions/bind_print_service=false +permissions/bind_remoteviews=false +permissions/bind_text_service=false +permissions/bind_vpn_service=false +permissions/bind_wallpaper=false +permissions/bluetooth=false +permissions/bluetooth_admin=false +permissions/bluetooth_privileged=false +permissions/brick=false +permissions/broadcast_package_removed=false +permissions/broadcast_sms=false +permissions/broadcast_sticky=false +permissions/broadcast_wap_push=false +permissions/call_phone=false +permissions/call_privileged=false +permissions/camera=false +permissions/capture_audio_output=false +permissions/capture_secure_video_output=false +permissions/capture_video_output=false +permissions/change_component_enabled_state=false +permissions/change_configuration=false +permissions/change_network_state=false +permissions/change_wifi_multicast_state=false +permissions/change_wifi_state=false +permissions/clear_app_cache=false +permissions/clear_app_user_data=false +permissions/control_location_updates=false +permissions/delete_cache_files=false +permissions/delete_packages=false +permissions/device_power=false +permissions/diagnostic=false +permissions/disable_keyguard=false +permissions/dump=false +permissions/expand_status_bar=false +permissions/factory_test=false +permissions/flashlight=false +permissions/force_back=false +permissions/get_accounts=false +permissions/get_package_size=false +permissions/get_tasks=false +permissions/get_top_activity_info=false +permissions/global_search=false +permissions/hardware_test=false +permissions/inject_events=false +permissions/install_location_provider=false +permissions/install_packages=false +permissions/install_shortcut=false +permissions/internal_system_window=false +permissions/internet=false +permissions/kill_background_processes=false +permissions/location_hardware=false +permissions/manage_accounts=false +permissions/manage_app_tokens=false +permissions/manage_documents=false +permissions/manage_external_storage=false +permissions/master_clear=false +permissions/media_content_control=false +permissions/modify_audio_settings=false +permissions/modify_phone_state=false +permissions/mount_format_filesystems=false +permissions/mount_unmount_filesystems=false +permissions/nfc=false +permissions/persistent_activity=false +permissions/post_notifications=false +permissions/process_outgoing_calls=false +permissions/read_calendar=false +permissions/read_call_log=false +permissions/read_contacts=false +permissions/read_external_storage=false +permissions/read_frame_buffer=false +permissions/read_history_bookmarks=false +permissions/read_input_state=false +permissions/read_logs=false +permissions/read_media_audio=false +permissions/read_media_images=false +permissions/read_media_video=false +permissions/read_media_visual_user_selected=false +permissions/read_phone_state=false +permissions/read_profile=false +permissions/read_sms=false +permissions/read_social_stream=false +permissions/read_sync_settings=false +permissions/read_sync_stats=false +permissions/read_user_dictionary=false +permissions/reboot=false +permissions/receive_boot_completed=false +permissions/receive_mms=false +permissions/receive_sms=false +permissions/receive_wap_push=false +permissions/record_audio=false +permissions/reorder_tasks=false +permissions/restart_packages=false +permissions/send_respond_via_message=false +permissions/send_sms=false +permissions/set_activity_watcher=false +permissions/set_alarm=false +permissions/set_always_finish=false +permissions/set_animation_scale=false +permissions/set_debug_app=false +permissions/set_orientation=false +permissions/set_pointer_speed=false +permissions/set_preferred_applications=false +permissions/set_process_limit=false +permissions/set_time=false +permissions/set_time_zone=false +permissions/set_wallpaper=false +permissions/set_wallpaper_hints=false +permissions/signal_persistent_processes=false +permissions/status_bar=false +permissions/subscribed_feeds_read=false +permissions/subscribed_feeds_write=false +permissions/system_alert_window=false +permissions/transmit_ir=false +permissions/uninstall_shortcut=false +permissions/update_device_stats=false +permissions/use_credentials=false +permissions/use_sip=false +permissions/vibrate=false +permissions/wake_lock=false +permissions/write_apn_settings=false +permissions/write_calendar=false +permissions/write_call_log=false +permissions/write_contacts=false +permissions/write_external_storage=false +permissions/write_gservices=false +permissions/write_history_bookmarks=false +permissions/write_profile=false +permissions/write_secure_settings=false +permissions/write_settings=false +permissions/write_sms=false +permissions/write_social_stream=false +permissions/write_sync_settings=false +permissions/write_user_dictionary=false diff --git a/project.godot b/project.godot new file mode 100644 index 0000000..3378ee4 --- /dev/null +++ b/project.godot @@ -0,0 +1,42 @@ +; Engine configuration file. +; It's best edited using the editor UI and not directly, +; since the parameters that go here are not all obvious. +; +; Format: +; [section] ; section goes between [] +; param=value ; assign values to parameters + +config_version=5 + +[application] + +config/name="Repeat After Me" +config/version="0.1.0" +run/main_scene="uid://cv38ubwerjlpx" +config/features=PackedStringArray("4.4", "Mobile") +boot_splash/bg_color=Color(0.0562916, 0.0562916, 0.0562916, 1) +boot_splash/image="uid://020ibqgo0y3m" +config/icon="uid://020ibqgo0y3m" + +[autoload] + +NotificationQueue="*res://src/global/NotificationQueue.gd" +XpLevelManager="*res://src/global/XpLevelManager.gd" +PhrasesManager="*res://src/global/PhrasesManager.gd" +CoreGameplayManager="*res://src/global/CoreGameplayManager.gd" +SaveManager="*res://src/global/SaveManager.gd" + +[display] + +window/size/viewport_width=256 +window/size/viewport_height=480 +window/stretch/mode="canvas_items" +window/stretch/aspect="expand" +window/handheld/orientation=1 + +[rendering] + +textures/canvas_textures/default_texture_filter=0 +renderer/rendering_method="mobile" +textures/vram_compression/import_etc2_astc=true +anti_aliasing/quality/msaa_2d=1 diff --git a/resources/button_box.tres b/resources/button_box.tres new file mode 100644 index 0000000..c790435 --- /dev/null +++ b/resources/button_box.tres @@ -0,0 +1,13 @@ +[gd_resource type="StyleBoxFlat" format=3 uid="uid://bv8sh5kxswy5"] + +[resource] +content_margin_left = 8.0 +content_margin_top = 1.0 +content_margin_right = 8.0 +content_margin_bottom = 2.0 +bg_color = Color(1, 1, 1, 0) +border_width_left = 2 +border_width_top = 2 +border_width_right = 2 +border_width_bottom = 2 +border_color = Color(1, 1, 1, 1) diff --git a/resources/level_label_settings.tres b/resources/level_label_settings.tres new file mode 100644 index 0000000..230935d --- /dev/null +++ b/resources/level_label_settings.tres @@ -0,0 +1,4 @@ +[gd_resource type="LabelSettings" format=3 uid="uid://cuynmxlj6maig"] + +[resource] +font_size = 42 diff --git a/resources/line_edit_box.tres b/resources/line_edit_box.tres new file mode 100644 index 0000000..7385e4b --- /dev/null +++ b/resources/line_edit_box.tres @@ -0,0 +1,9 @@ +[gd_resource type="StyleBoxFlat" format=3 uid="uid://3j2rdpeh0hbi"] + +[resource] +content_margin_left = 2.0 +content_margin_right = 2.0 +content_margin_bottom = 0.0 +bg_color = Color(1, 1, 1, 0) +border_width_bottom = 1 +border_color = Color(1, 1, 1, 0.698039) diff --git a/resources/main_theme_overrides.tres b/resources/main_theme_overrides.tres new file mode 100644 index 0000000..58ffd75 --- /dev/null +++ b/resources/main_theme_overrides.tres @@ -0,0 +1,49 @@ +[gd_resource type="Theme" load_steps=10 format=3 uid="uid://06umghrsjedx"] + +[ext_resource type="StyleBox" uid="uid://bv8sh5kxswy5" path="res://resources/button_box.tres" id="1_wpqen"] +[ext_resource type="StyleBox" uid="uid://3j2rdpeh0hbi" path="res://resources/line_edit_box.tres" id="2_u8fmd"] +[ext_resource type="FontFile" uid="uid://cfghoopnpsdsf" path="res://assets/fonts/monogram/monogram-extended.ttf" id="3_u8fmd"] + +[sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_8p56c"] + +[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_b1161"] +bg_color = Color(1, 1, 1, 0.552941) + +[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_wpqen"] +bg_color = Color(1, 1, 1, 0.552941) + +[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_u8fmd"] +bg_color = Color(1, 1, 1, 0.552941) + +[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_8p56c"] +border_width_left = 1 +border_width_right = 1 +border_color = Color(1, 1, 1, 0.113725) + +[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_8kqed"] +border_width_left = 2 +border_width_right = 2 +border_color = Color(1, 1, 1, 0.113725) + +[resource] +default_font = ExtResource("3_u8fmd") +default_font_size = 20 +Button/colors/font_color = Color(1, 1, 1, 1) +Button/colors/font_focus_color = Color(1, 1, 1, 1) +Button/colors/font_hover_color = Color(1, 1, 1, 1) +Button/colors/font_hover_pressed_color = Color(1, 1, 1, 1) +Button/colors/font_pressed_color = Color(1, 1, 1, 1) +Button/styles/disabled = ExtResource("1_wpqen") +Button/styles/focus = ExtResource("1_wpqen") +Button/styles/hover = ExtResource("1_wpqen") +Button/styles/hover_pressed = ExtResource("1_wpqen") +Button/styles/normal = ExtResource("1_wpqen") +Button/styles/pressed = ExtResource("1_wpqen") +LineEdit/styles/focus = ExtResource("2_u8fmd") +LineEdit/styles/normal = ExtResource("2_u8fmd") +LineEdit/styles/read_only = SubResource("StyleBoxEmpty_8p56c") +VScrollBar/styles/grabber = SubResource("StyleBoxFlat_b1161") +VScrollBar/styles/grabber_highlight = SubResource("StyleBoxFlat_wpqen") +VScrollBar/styles/grabber_pressed = SubResource("StyleBoxFlat_u8fmd") +VScrollBar/styles/scroll = SubResource("StyleBoxFlat_8p56c") +VScrollBar/styles/scroll_focus = SubResource("StyleBoxFlat_8kqed") diff --git a/scenes/main.tscn b/scenes/main.tscn new file mode 100644 index 0000000..955c1e5 --- /dev/null +++ b/scenes/main.tscn @@ -0,0 +1,235 @@ +[gd_scene load_steps=18 format=3 uid="uid://cv38ubwerjlpx"] + +[ext_resource type="Script" uid="uid://bga75qw3b2be3" path="res://src/ui/main.gd" id="1_tipki"] +[ext_resource type="Theme" uid="uid://06umghrsjedx" path="res://resources/main_theme_overrides.tres" id="1_ya4ey"] +[ext_resource type="Script" uid="uid://dyh2ejk0r2xeq" path="res://src/ui/points_counter.gd" id="3_choun"] +[ext_resource type="Script" uid="uid://b2n6p0wilywoj" path="res://src/ui/required_points_counter.gd" id="6_85g3d"] +[ext_resource type="LabelSettings" uid="uid://cuynmxlj6maig" path="res://resources/level_label_settings.tres" id="7_a8y0u"] +[ext_resource type="PackedScene" uid="uid://dq3jysvuu7ix" path="res://scenes/settings_menu.tscn" id="8_85g3d"] +[ext_resource type="Texture2D" uid="uid://doin43i42hl82" path="res://assets/icons/PhrasesIcon.png" id="8_choun"] +[ext_resource type="Script" uid="uid://cql88rfja2khm" path="res://src/ui/level_counter.gd" id="8_jkv2x"] +[ext_resource type="Texture2D" uid="uid://vl26lhjwxmmf" path="res://assets/icons/SettingsIcon.png" id="9_choun"] +[ext_resource type="PackedScene" uid="uid://bqgcsf0855xq" path="res://scenes/phrases_menu.tscn" id="9_ya4ey"] +[ext_resource type="Script" uid="uid://bue5attfnwbd" path="res://src/ui/notification_container.gd" id="11_ya4ey"] + +[sub_resource type="Gradient" id="Gradient_ig7tw"] +interpolation_mode = 2 +interpolation_color_space = 2 +offsets = PackedFloat32Array(0, 0.598881, 0.880597, 0.979478) +colors = PackedColorArray(0.0181584, 0.00862847, 0.0428164, 1, 0.261449, 0.130655, 0.405365, 1, 0.707783, 0.30943, 0.382465, 1, 0.893104, 0.621238, 0.575639, 1) + +[sub_resource type="GradientTexture2D" id="GradientTexture2D_0xm2m"] +gradient = SubResource("Gradient_ig7tw") +width = 640 +height = 640 +fill = 1 +fill_from = Vector2(0.491453, 1) +fill_to = Vector2(0, 0.00854701) + +[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_eb6dy"] + +[sub_resource type="LabelSettings" id="LabelSettings_ya4ey"] +font_color = Color(1, 1, 1, 0.792157) + +[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_ya4ey"] +content_margin_left = 10.0 +content_margin_top = 4.0 +content_margin_right = 10.0 +content_margin_bottom = 4.0 +bg_color = Color(1, 1, 1, 0.32549) + +[sub_resource type="LabelSettings" id="LabelSettings_eb6dy"] +font_size = 18 + +[node name="Main" type="Control"] +layout_mode = 3 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +theme = ExtResource("1_ya4ey") +script = ExtResource("1_tipki") + +[node name="BackgroundTexture" type="TextureRect" parent="."] +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +offset_left = -96.0 +offset_top = -24.0 +offset_right = 288.0 +offset_bottom = 48.0 +grow_horizontal = 2 +grow_vertical = 2 +texture = SubResource("GradientTexture2D_0xm2m") +expand_mode = 1 + +[node name="ShowSettingsButton" type="TextureButton" parent="."] +texture_filter = 1 +layout_mode = 1 +anchors_preset = 1 +anchor_left = 1.0 +anchor_right = 1.0 +offset_left = -36.0 +offset_top = 12.0 +offset_right = -8.0 +offset_bottom = 40.0 +grow_horizontal = 0 +texture_normal = ExtResource("9_choun") +stretch_mode = 0 + +[node name="ShowPhrasesButton" type="TextureButton" parent="."] +texture_filter = 1 +layout_mode = 1 +anchors_preset = 1 +anchor_left = 1.0 +anchor_right = 1.0 +offset_left = -68.0 +offset_top = 12.0 +offset_right = -47.0 +offset_bottom = 40.0 +grow_horizontal = 0 +texture_normal = ExtResource("8_choun") +stretch_mode = 5 + +[node name="XpLevelsVBoxContainer" type="VBoxContainer" parent="."] +layout_mode = 2 +anchor_right = 1.0 +offset_left = 16.0 +offset_top = 64.0 +offset_right = -16.0 +offset_bottom = 152.0 +theme_override_constants/separation = 8 +alignment = 1 + +[node name="LevelHBoxContainer" type="HBoxContainer" parent="XpLevelsVBoxContainer"] +layout_mode = 2 +theme_override_constants/separation = 12 +alignment = 1 + +[node name="LevelLabel" type="Label" parent="XpLevelsVBoxContainer/LevelHBoxContainer"] +layout_mode = 2 +size_flags_horizontal = 0 +text = "Level" +label_settings = ExtResource("7_a8y0u") + +[node name="LevelCounter" type="Label" parent="XpLevelsVBoxContainer/LevelHBoxContainer"] +layout_mode = 2 +size_flags_horizontal = 8 +text = "0" +label_settings = ExtResource("7_a8y0u") +script = ExtResource("8_jkv2x") + +[node name="XpHBoxContainer" type="HBoxContainer" parent="XpLevelsVBoxContainer"] +layout_mode = 2 +theme_override_constants/separation = 5 +alignment = 1 + +[node name="PointsCounter" type="Label" parent="XpLevelsVBoxContainer/XpHBoxContainer"] +layout_mode = 2 +size_flags_horizontal = 8 +text = "0" +script = ExtResource("3_choun") + +[node name="Label" type="Label" parent="XpLevelsVBoxContainer/XpHBoxContainer"] +layout_mode = 2 +text = "/" + +[node name="RequiredPointsCounter" type="Label" parent="XpLevelsVBoxContainer/XpHBoxContainer"] +layout_mode = 2 +size_flags_horizontal = 8 +text = "0" +script = ExtResource("6_85g3d") + +[node name="PointsLabel" type="Label" parent="XpLevelsVBoxContainer/XpHBoxContainer"] +layout_mode = 2 +size_flags_horizontal = 0 +text = "XP" + +[node name="PhrasesDisplayVBoxContainer" type="VBoxContainer" parent="."] +layout_mode = 1 +anchors_preset = -1 +anchor_right = 1.0 +offset_left = 16.0 +offset_top = 168.0 +offset_right = -16.0 +offset_bottom = 280.0 +grow_horizontal = 2 +theme_override_constants/separation = 12 + +[node name="CurrentPhrase" type="RichTextLabel" parent="PhrasesDisplayVBoxContainer"] +unique_name_in_owner = true +custom_minimum_size = Vector2(0, 56) +layout_mode = 2 +theme_override_font_sizes/normal_font_size = 22 +theme_override_styles/background = SubResource("StyleBoxFlat_eb6dy") +horizontal_alignment = 1 +vertical_alignment = 2 + +[node name="CurrentStatus" type="Label" parent="PhrasesDisplayVBoxContainer"] +unique_name_in_owner = true +layout_mode = 2 +label_settings = SubResource("LabelSettings_ya4ey") +horizontal_alignment = 1 + +[node name="AnswerInput" type="LineEdit" parent="."] +unique_name_in_owner = true +layout_mode = 2 +anchor_right = 1.0 +offset_left = 40.0 +offset_top = 296.0 +offset_right = -40.0 +offset_bottom = 320.0 +alignment = 1 +keep_editing_on_text_submit = true + +[node name="SubmitButton" type="Button" parent="."] +unique_name_in_owner = true +layout_mode = 2 +anchor_left = 0.5 +anchor_right = 0.5 +offset_left = -40.0 +offset_top = 344.0 +offset_right = 40.0 +offset_bottom = 376.0 +text = "Submit" + +[node name="SettingsMenu" parent="." instance=ExtResource("8_85g3d")] +unique_name_in_owner = true +visible = false +layout_mode = 1 + +[node name="PhrasesMenu" parent="." instance=ExtResource("9_ya4ey")] +unique_name_in_owner = true +visible = false +layout_mode = 1 + +[node name="NotificationContainer" type="PanelContainer" parent="."] +layout_mode = 1 +anchors_preset = 7 +anchor_left = 0.5 +anchor_top = 1.0 +anchor_right = 0.5 +anchor_bottom = 1.0 +offset_left = -32.0 +offset_top = -56.0 +offset_right = 32.0 +offset_bottom = -33.7 +grow_horizontal = 2 +grow_vertical = 0 +theme_override_styles/panel = SubResource("StyleBoxFlat_ya4ey") +script = ExtResource("11_ya4ey") + +[node name="Label" type="Label" parent="NotificationContainer"] +layout_mode = 2 +size_flags_horizontal = 4 +text = "......" +label_settings = SubResource("LabelSettings_eb6dy") +horizontal_alignment = 1 +vertical_alignment = 1 + +[connection signal="pressed" from="ShowSettingsButton" to="." method="_on_settings_button_pressed"] +[connection signal="pressed" from="ShowPhrasesButton" to="." method="_on_show_phrases_button_pressed"] +[connection signal="text_changed" from="AnswerInput" to="." method="_on_answer_input_text_changed"] +[connection signal="pressed" from="SubmitButton" to="." method="_on_submit_button_pressed"] diff --git a/scenes/phrases_menu.tscn b/scenes/phrases_menu.tscn new file mode 100644 index 0000000..17ed404 --- /dev/null +++ b/scenes/phrases_menu.tscn @@ -0,0 +1,92 @@ +[gd_scene load_steps=9 format=3 uid="uid://bqgcsf0855xq"] + +[ext_resource type="Shader" uid="uid://da36ryj6twm16" path="res://src/shaders/panel.gdshader" id="1_wplh1"] +[ext_resource type="Script" uid="uid://fbgxxich2qgd" path="res://src/ui/phrases_menu.gd" id="2_2b2sm"] +[ext_resource type="Theme" uid="uid://06umghrsjedx" path="res://resources/main_theme_overrides.tres" id="2_3hct6"] +[ext_resource type="Texture2D" uid="uid://cbv7fmq2x6ucf" path="res://assets/icons/CloseIcon.png" id="3_3hct6"] + +[sub_resource type="ShaderMaterial" id="ShaderMaterial_choun"] +shader = ExtResource("1_wplh1") + +[sub_resource type="PlaceholderTexture2D" id="PlaceholderTexture2D_85g3d"] + +[sub_resource type="StyleBoxTexture" id="StyleBoxTexture_choun"] +texture = SubResource("PlaceholderTexture2D_85g3d") + +[sub_resource type="LabelSettings" id="LabelSettings_ya4ey"] +font_size = 24 + +[node name="PhrasesMenu" type="Panel"] +material = SubResource("ShaderMaterial_choun") +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +theme = ExtResource("2_3hct6") +theme_override_styles/panel = SubResource("StyleBoxTexture_choun") +script = ExtResource("2_2b2sm") + +[node name="ClosePhrasesButton" type="TextureButton" parent="."] +layout_mode = 1 +anchors_preset = 1 +anchor_left = 1.0 +anchor_right = 1.0 +offset_left = -32.0 +offset_top = 16.0 +offset_right = -12.0 +offset_bottom = 36.0 +grow_horizontal = 0 +texture_normal = ExtResource("3_3hct6") +stretch_mode = 0 + +[node name="Label" type="Label" parent="."] +layout_mode = 0 +offset_left = 16.0 +offset_top = 16.0 +offset_right = 79.0 +offset_bottom = 40.0 +text = "Phrases" +label_settings = SubResource("LabelSettings_ya4ey") + +[node name="LineEdit" type="LineEdit" parent="."] +layout_mode = 1 +anchors_preset = -1 +offset_left = 16.0 +offset_top = 56.0 +offset_right = 184.0 +offset_bottom = 75.0 +keep_editing_on_text_submit = true + +[node name="AddPhraseButton" type="Button" parent="."] +layout_mode = 1 +anchors_preset = 1 +anchor_left = 1.0 +anchor_right = 1.0 +offset_left = -56.0 +offset_top = 56.0 +offset_right = -17.0 +offset_bottom = 75.0 +grow_horizontal = 0 +text = "Add" + +[node name="ScrollContainer" type="ScrollContainer" parent="."] +layout_mode = 1 +anchors_preset = -1 +anchor_top = 0.183 +anchor_right = 1.0 +anchor_bottom = 1.0 +offset_left = 16.0 +offset_top = 8.16 +offset_right = -8.0 +offset_bottom = -22.0 +grow_horizontal = 2 +grow_vertical = 2 + +[node name="PhrasesList" type="VBoxContainer" parent="ScrollContainer"] +unique_name_in_owner = true +layout_mode = 2 +theme_override_constants/separation = 12 + +[connection signal="pressed" from="ClosePhrasesButton" to="." method="_on_close_phrases_button_pressed"] +[connection signal="pressed" from="AddPhraseButton" to="." method="_on_add_phrase_button_pressed"] diff --git a/scenes/phrases_menu_single_phrase.tscn b/scenes/phrases_menu_single_phrase.tscn new file mode 100644 index 0000000..4acdf84 --- /dev/null +++ b/scenes/phrases_menu_single_phrase.tscn @@ -0,0 +1,35 @@ +[gd_scene load_steps=4 format=3 uid="uid://b6hmd8gv7m2tv"] + +[ext_resource type="Script" uid="uid://bgb4gukelil6o" path="res://src/ui/phrases_menu_phrase.gd" id="1_6l37r"] +[ext_resource type="Theme" uid="uid://06umghrsjedx" path="res://resources/main_theme_overrides.tres" id="1_vmoog"] +[ext_resource type="Texture2D" uid="uid://cdf7kvjxmp6a" path="res://assets/icons/RemoveIcon.png" id="2_cv30m"] + +[node name="Phrase" type="Control"] +custom_minimum_size = Vector2(208, 16) +layout_mode = 3 +anchors_preset = 0 +offset_right = 224.0 +offset_bottom = 16.0 +theme = ExtResource("1_vmoog") +script = ExtResource("1_6l37r") + +[node name="Label" type="Label" parent="."] +layout_mode = 1 +anchors_preset = -1 +anchor_right = 1.143 +offset_right = -48.032 +offset_bottom = 16.0 +clip_text = true +text_overrun_behavior = 3 + +[node name="RemoveButton" type="TextureButton" parent="."] +layout_mode = 2 +anchor_left = 1.036 +anchor_right = 1.036 +offset_left = -16.064 +offset_right = -0.0639954 +offset_bottom = 16.0 +texture_normal = ExtResource("2_cv30m") +stretch_mode = 0 + +[connection signal="pressed" from="RemoveButton" to="." method="_on_remove_button_pressed"] diff --git a/scenes/settings_menu.tscn b/scenes/settings_menu.tscn new file mode 100644 index 0000000..e59260e --- /dev/null +++ b/scenes/settings_menu.tscn @@ -0,0 +1,82 @@ +[gd_scene load_steps=10 format=3 uid="uid://dq3jysvuu7ix"] + +[ext_resource type="Shader" uid="uid://da36ryj6twm16" path="res://src/shaders/panel.gdshader" id="1_cr101"] +[ext_resource type="Script" uid="uid://dj4i6sfufsa0t" path="res://src/ui/settings_menu.gd" id="2_labj1"] +[ext_resource type="Theme" uid="uid://06umghrsjedx" path="res://resources/main_theme_overrides.tres" id="2_lwwgp"] +[ext_resource type="Texture2D" uid="uid://cbv7fmq2x6ucf" path="res://assets/icons/CloseIcon.png" id="2_wswnh"] + +[sub_resource type="ShaderMaterial" id="ShaderMaterial_choun"] +shader = ExtResource("1_cr101") + +[sub_resource type="PlaceholderTexture2D" id="PlaceholderTexture2D_85g3d"] + +[sub_resource type="StyleBoxTexture" id="StyleBoxTexture_choun"] +texture = SubResource("PlaceholderTexture2D_85g3d") + +[sub_resource type="LabelSettings" id="LabelSettings_labj1"] +font_size = 24 + +[sub_resource type="LabelSettings" id="LabelSettings_lwwgp"] +font_color = Color(1, 1, 1, 0.768627) + +[node name="SettingsMenu" type="Panel"] +material = SubResource("ShaderMaterial_choun") +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +theme = ExtResource("2_lwwgp") +theme_override_styles/panel = SubResource("StyleBoxTexture_choun") +script = ExtResource("2_labj1") + +[node name="CloseSettingsButton" type="TextureButton" parent="."] +layout_mode = 1 +anchors_preset = 1 +anchor_left = 1.0 +anchor_right = 1.0 +offset_left = -32.0 +offset_top = 16.0 +offset_right = -12.0 +offset_bottom = 36.0 +grow_horizontal = 0 +texture_normal = ExtResource("2_wswnh") +stretch_mode = 0 + +[node name="Label" type="Label" parent="."] +layout_mode = 0 +offset_left = 16.0 +offset_top = 16.0 +offset_right = 104.0 +offset_bottom = 39.0 +text = "Settings" +label_settings = SubResource("LabelSettings_labj1") + +[node name="ResetXPButton" type="Button" parent="."] +layout_mode = 0 +offset_left = 16.0 +offset_top = 72.0 +offset_right = 92.0 +offset_bottom = 96.0 +text = "Reset XP" + +[node name="by" type="Label" parent="."] +layout_mode = 1 +anchors_preset = 3 +anchor_left = 1.0 +anchor_top = 1.0 +anchor_right = 1.0 +anchor_bottom = 1.0 +offset_left = -168.0 +offset_top = -24.0 +offset_right = -10.0 +offset_bottom = -8.10001 +grow_horizontal = 0 +grow_vertical = 0 +text = "a game by ChaoticByte" +label_settings = SubResource("LabelSettings_lwwgp") +horizontal_alignment = 2 +vertical_alignment = 2 + +[connection signal="pressed" from="CloseSettingsButton" to="." method="_on_close_settings_button_pressed"] +[connection signal="pressed" from="ResetXPButton" to="." method="_on_reset_xp_button_pressed"] diff --git a/src/global/CoreGameplayManager.gd b/src/global/CoreGameplayManager.gd new file mode 100644 index 0000000..2a14529 --- /dev/null +++ b/src/global/CoreGameplayManager.gd @@ -0,0 +1,72 @@ +extends Node + +const XP_PER_ANSWER = 2 + +# interval for automatically cleaning +# the last_played_phrases dictionary +const AUTOCLEAN_INTERVAL = 2000 # in ms + +const STATUS_PLEASE_REPEAT = "please repeat the above phrase" +const STATUS_NONE_AVAILABLE = "no phrase available" + +var _last_autocleanup: int = 0 # ms since engine start + +var current_phrase: String = "" +var current_status: String = "" + +var last_played_phrases: Dictionary = {} # p: [timestamp1, timestamp2, ...] + + +func register_current_phrase_played(): + var t = Time.get_unix_time_from_system() + if current_phrase in last_played_phrases: + last_played_phrases[current_phrase].append(t) + else: + last_played_phrases[current_phrase] = [t] + SaveManager.save_game() + +func answer(p_in: String) -> bool: + if p_in.to_lower() == current_phrase.to_lower(): + XpLevelManager.add_xp(XP_PER_ANSWER) + register_current_phrase_played() + next_phrase() + return true + return false + +func next_phrase() -> void: + if len(PhrasesManager.phrases) < 1: + current_phrase = "" + current_status = STATUS_NONE_AVAILABLE + return + # search for a non played phrase + for p in PhrasesManager.phrases: + if not p in last_played_phrases: + current_phrase = p + current_status = STATUS_PLEASE_REPEAT + return + # find the phrase that was played the longest ago + var phrases_last_ts: Dictionary = {} # timestamp: phrase + var phrases_last_ts_keys: Array[float] = [] + for p in last_played_phrases: + if p in PhrasesManager.phrases: + var t_max = last_played_phrases[p].max() + phrases_last_ts[t_max] = p + phrases_last_ts_keys.append(t_max) + # return the phrase with the smallest timestamp (-> longest ago) + current_phrase = phrases_last_ts[phrases_last_ts_keys.min()] + current_status = STATUS_PLEASE_REPEAT + +func cleanup_last_played_phrases(): + var changed = false + # remove phrases that don't exist anymore + for p in last_played_phrases: + if not p in PhrasesManager.phrases: + last_played_phrases.erase(p) + changed = true + if changed: + SaveManager.save_game() + +func _process(_delta: float) -> void: + if Time.get_ticks_msec() - _last_autocleanup > AUTOCLEAN_INTERVAL: + cleanup_last_played_phrases() + _last_autocleanup = Time.get_ticks_msec() diff --git a/src/global/CoreGameplayManager.gd.uid b/src/global/CoreGameplayManager.gd.uid new file mode 100644 index 0000000..13e030f --- /dev/null +++ b/src/global/CoreGameplayManager.gd.uid @@ -0,0 +1 @@ +uid://rge5rigffdn1 diff --git a/src/global/NotificationQueue.gd b/src/global/NotificationQueue.gd new file mode 100644 index 0000000..9bc663e --- /dev/null +++ b/src/global/NotificationQueue.gd @@ -0,0 +1,12 @@ +extends Node + +var _queue: Array = [] # [] + +func add(n: String, timeout_ms: int = 3000): + # clamp timeout to 0.5s-30s + timeout_ms = clamp(timeout_ms, 500, 30_000) + if len(n) > 0: + _queue.append([n, timeout_ms]) + +func get_next(): # returns either String or Nil + return _queue.pop_front() diff --git a/src/global/NotificationQueue.gd.uid b/src/global/NotificationQueue.gd.uid new file mode 100644 index 0000000..a2fa7fa --- /dev/null +++ b/src/global/NotificationQueue.gd.uid @@ -0,0 +1 @@ +uid://b55k3utldjthk diff --git a/src/global/PhrasesManager.gd b/src/global/PhrasesManager.gd new file mode 100644 index 0000000..dc0f534 --- /dev/null +++ b/src/global/PhrasesManager.gd @@ -0,0 +1,34 @@ +extends Node + +var phrase_scene = preload("uid://b6hmd8gv7m2tv") + +var phrases: Array[String] = [] +var phrases_list_node: Control = null + +func add_phrase(p: String) -> bool: + if len(p) > 0: + if not p in phrases: + phrases.append(p) + update_phrases_list_node() + SaveManager.save_game() + if len(phrases) == 1: + # show new phrase if there was none before + CoreGameplayManager.next_phrase() + return true + return false + +func remove_phrase(p: String): + phrases.erase(p) + update_phrases_list_node() + SaveManager.save_game() + if CoreGameplayManager.current_phrase == p: + CoreGameplayManager.next_phrase() + +func update_phrases_list_node(): + if phrases_list_node != null: + for c in phrases_list_node.get_children(): + c.queue_free() + for p in phrases: + var p_node = phrase_scene.instantiate() + p_node.text = p + phrases_list_node.add_child(p_node) diff --git a/src/global/PhrasesManager.gd.uid b/src/global/PhrasesManager.gd.uid new file mode 100644 index 0000000..ceb3489 --- /dev/null +++ b/src/global/PhrasesManager.gd.uid @@ -0,0 +1 @@ +uid://dkhmrcp1txn0j diff --git a/src/global/SaveManager.gd b/src/global/SaveManager.gd new file mode 100644 index 0000000..e8b979c --- /dev/null +++ b/src/global/SaveManager.gd @@ -0,0 +1,33 @@ +extends Node + +const SAVEFILE = "user://save.dat" + +func _ready() -> void: + load_game() + +func save_game(): + var data: Dictionary = { + "player_xp": XpLevelManager.player_xp, + "phrases": PhrasesManager.phrases, + "last_played_phrases": CoreGameplayManager.last_played_phrases + } + var data_json = JSON.stringify(data) + var f = FileAccess.open(SAVEFILE, FileAccess.WRITE) + f.store_string(data_json) + f.close() + +func load_game(): + if FileAccess.file_exists(SAVEFILE): + var data_json = FileAccess.get_file_as_string(SAVEFILE) + var data = JSON.parse_string(data_json) + # set variables + if "player_xp" in data: + XpLevelManager.loading = true + XpLevelManager.player_xp = data["player_xp"] + XpLevelManager.loading = false + if "phrases" in data and data["phrases"] is Array: + PhrasesManager.phrases = [] + for p in data["phrases"]: + PhrasesManager.phrases.append(p) + if "last_played_phrases" in data and data["last_played_phrases"] is Dictionary: + CoreGameplayManager.last_played_phrases = data["last_played_phrases"] diff --git a/src/global/SaveManager.gd.uid b/src/global/SaveManager.gd.uid new file mode 100644 index 0000000..fa6c408 --- /dev/null +++ b/src/global/SaveManager.gd.uid @@ -0,0 +1 @@ +uid://be87g4fh8faxa diff --git a/src/global/XpLevelManager.gd b/src/global/XpLevelManager.gd new file mode 100644 index 0000000..4bcfbd9 --- /dev/null +++ b/src/global/XpLevelManager.gd @@ -0,0 +1,32 @@ +extends Node + +var player_level: int = 0: + set(v): + player_level = max(0, v) + +var loading: bool = false + +func update_level(): + var level = 0 + while true: # brute-forcing it bc. of precision problems when calculating it + if player_xp < get_required_xp(level + 1): + var old_player_level = player_level + player_level = level + if player_level > old_player_level and not loading: + NotificationQueue.add("Level Up!") + break + level += 1 + +var player_xp: int = 0: + set(v): + player_xp = max(0, v) + update_level() + +func add_xp(additional_xp: int): + player_xp += additional_xp + SaveManager.save_game() # TODO this might be a bit much... + +func get_required_xp(level: int) -> int: + if level == 0: return 0 + var xp = 3 * pow(level, 1.5) + return max(0, int(xp)) diff --git a/src/global/XpLevelManager.gd.uid b/src/global/XpLevelManager.gd.uid new file mode 100644 index 0000000..9ffa882 --- /dev/null +++ b/src/global/XpLevelManager.gd.uid @@ -0,0 +1 @@ +uid://pa34g1ghwwkc diff --git a/src/shaders/panel.gdshader b/src/shaders/panel.gdshader new file mode 100644 index 0000000..cf00b78 --- /dev/null +++ b/src/shaders/panel.gdshader @@ -0,0 +1,8 @@ +shader_type canvas_item; +render_mode unshaded; + +uniform sampler2D screen_texture: hint_screen_texture, filter_linear_mipmap; + +void fragment() { + COLOR = textureLod(screen_texture, SCREEN_UV, 6.0); +} diff --git a/src/shaders/panel.gdshader.uid b/src/shaders/panel.gdshader.uid new file mode 100644 index 0000000..02d24f0 --- /dev/null +++ b/src/shaders/panel.gdshader.uid @@ -0,0 +1 @@ +uid://da36ryj6twm16 diff --git a/src/ui/level_counter.gd b/src/ui/level_counter.gd new file mode 100644 index 0000000..543a303 --- /dev/null +++ b/src/ui/level_counter.gd @@ -0,0 +1,9 @@ +extends Label + +var last_level: int = -1 + +func _process(_delta: float) -> void: + var l = XpLevelManager.player_level + if last_level != l: + self.text = str(l) + last_level = l diff --git a/src/ui/level_counter.gd.uid b/src/ui/level_counter.gd.uid new file mode 100644 index 0000000..95435e7 --- /dev/null +++ b/src/ui/level_counter.gd.uid @@ -0,0 +1 @@ +uid://cql88rfja2khm diff --git a/src/ui/main.gd b/src/ui/main.gd new file mode 100644 index 0000000..04a4f7a --- /dev/null +++ b/src/ui/main.gd @@ -0,0 +1,40 @@ +extends Control + +func _ready() -> void: + CoreGameplayManager.next_phrase() + %SubmitButton.hide() + %AnswerInput.hide() + +func _on_settings_button_pressed() -> void: + %SettingsMenu.show() + +func _on_show_phrases_button_pressed() -> void: + PhrasesManager.update_phrases_list_node() + %PhrasesMenu.show() + +var last_known_phrase: String = "" +var last_known_status: String = "" + +func _process(_delta: float) -> void: + if last_known_phrase != CoreGameplayManager.current_phrase: + last_known_phrase = CoreGameplayManager.current_phrase + if len(last_known_phrase) > 0: + %CurrentPhrase.text = '"' + last_known_phrase + '"' + %AnswerInput.show() + else: + %CurrentPhrase.text = "" + %AnswerInput.hide() + %SubmitButton.hide() + if last_known_status != CoreGameplayManager.current_status: + last_known_status = CoreGameplayManager.current_status + %CurrentStatus.text = last_known_status + +func _on_submit_button_pressed() -> void: + if CoreGameplayManager.answer(%AnswerInput.text): + %AnswerInput.clear() + +func _on_answer_input_text_changed(new_text: String) -> void: + if new_text.to_lower() == CoreGameplayManager.current_phrase.to_lower(): + %SubmitButton.show() + else: + %SubmitButton.hide() diff --git a/src/ui/main.gd.uid b/src/ui/main.gd.uid new file mode 100644 index 0000000..0b74aff --- /dev/null +++ b/src/ui/main.gd.uid @@ -0,0 +1 @@ +uid://bga75qw3b2be3 diff --git a/src/ui/notification_container.gd b/src/ui/notification_container.gd new file mode 100644 index 0000000..ca3c14a --- /dev/null +++ b/src/ui/notification_container.gd @@ -0,0 +1,26 @@ +extends PanelContainer + +var showing_notification: bool = false +var notification_started: int = 0 # in ms +var current_notification_timeout: int = 0 # in ms + +func _ready() -> void: + hide() + +func _process(_delta: float) -> void: + var t = Time.get_ticks_msec() + if showing_notification: + if t - notification_started > current_notification_timeout: + showing_notification = false + else: + var n = NotificationQueue.get_next() # [text, timeout] or null + if n != null: + showing_notification = true + notification_started = t + $Label.text = n[0] + current_notification_timeout = n[1] + # + if not showing_notification and visible: + hide() + elif showing_notification and not visible: + show() diff --git a/src/ui/notification_container.gd.uid b/src/ui/notification_container.gd.uid new file mode 100644 index 0000000..8f3360e --- /dev/null +++ b/src/ui/notification_container.gd.uid @@ -0,0 +1 @@ +uid://bue5attfnwbd diff --git a/src/ui/phrases_menu.gd b/src/ui/phrases_menu.gd new file mode 100644 index 0000000..533883c --- /dev/null +++ b/src/ui/phrases_menu.gd @@ -0,0 +1,13 @@ +extends Control + +func _ready() -> void: + PhrasesManager.phrases_list_node = %PhrasesList + hide() + +func _on_add_phrase_button_pressed() -> void: + var phrase = $LineEdit.text + if PhrasesManager.add_phrase(phrase): + $LineEdit.clear() + +func _on_close_phrases_button_pressed() -> void: + hide() diff --git a/src/ui/phrases_menu.gd.uid b/src/ui/phrases_menu.gd.uid new file mode 100644 index 0000000..5d40426 --- /dev/null +++ b/src/ui/phrases_menu.gd.uid @@ -0,0 +1 @@ +uid://fbgxxich2qgd diff --git a/src/ui/phrases_menu_phrase.gd b/src/ui/phrases_menu_phrase.gd new file mode 100644 index 0000000..01b32e4 --- /dev/null +++ b/src/ui/phrases_menu_phrase.gd @@ -0,0 +1,10 @@ +extends Control + +var text: String: + set(v): + $Label.text = v + get(): + return $Label.text + +func _on_remove_button_pressed() -> void: + PhrasesManager.remove_phrase(text) diff --git a/src/ui/phrases_menu_phrase.gd.uid b/src/ui/phrases_menu_phrase.gd.uid new file mode 100644 index 0000000..e04656f --- /dev/null +++ b/src/ui/phrases_menu_phrase.gd.uid @@ -0,0 +1 @@ +uid://bgb4gukelil6o diff --git a/src/ui/points_counter.gd b/src/ui/points_counter.gd new file mode 100644 index 0000000..ac37f56 --- /dev/null +++ b/src/ui/points_counter.gd @@ -0,0 +1,9 @@ +extends Label + +var last_xp: int = -1 + +func _process(_delta: float) -> void: + var xp = XpLevelManager.player_xp + if last_xp != xp: + self.text = str(xp) + last_xp = xp diff --git a/src/ui/points_counter.gd.uid b/src/ui/points_counter.gd.uid new file mode 100644 index 0000000..eb4281f --- /dev/null +++ b/src/ui/points_counter.gd.uid @@ -0,0 +1 @@ +uid://dyh2ejk0r2xeq diff --git a/src/ui/required_points_counter.gd b/src/ui/required_points_counter.gd new file mode 100644 index 0000000..499e569 --- /dev/null +++ b/src/ui/required_points_counter.gd @@ -0,0 +1,9 @@ +extends Label + +var last_level: int = -1 + +func _process(_delta: float) -> void: + var l = XpLevelManager.player_level + if last_level != l: + self.text = str(XpLevelManager.get_required_xp(l+1)) + last_level = l diff --git a/src/ui/required_points_counter.gd.uid b/src/ui/required_points_counter.gd.uid new file mode 100644 index 0000000..4b8d693 --- /dev/null +++ b/src/ui/required_points_counter.gd.uid @@ -0,0 +1 @@ +uid://b2n6p0wilywoj diff --git a/src/ui/settings_menu.gd b/src/ui/settings_menu.gd new file mode 100644 index 0000000..aa45e01 --- /dev/null +++ b/src/ui/settings_menu.gd @@ -0,0 +1,12 @@ +extends Panel + +func _ready() -> void: + hide() + +func _on_close_settings_button_pressed() -> void: + hide() + +func _on_reset_xp_button_pressed() -> void: + XpLevelManager.player_xp = 0 + SaveManager.save_game() + NotificationQueue.add("Reset XP.") diff --git a/src/ui/settings_menu.gd.uid b/src/ui/settings_menu.gd.uid new file mode 100644 index 0000000..e2adc52 --- /dev/null +++ b/src/ui/settings_menu.gd.uid @@ -0,0 +1 @@ +uid://dj4i6sfufsa0t