diff --git a/.gitea/workflows/ci.yml b/.gitea/workflows/ci.yml
index ac41f2e..403ed78 100644
--- a/.gitea/workflows/ci.yml
+++ b/.gitea/workflows/ci.yml
@@ -27,22 +27,22 @@ jobs:
- name: Setup Godot (Cached)
run: |
apt-get update -qq && apt-get install -y -qq unzip curl
- if [ ! -f /cache/godot_4.7 ]; then
- echo "Downloading Godot 4.7..."
- curl -sL -o /tmp/godot.zip "https://github.com/godotengine/godot-builds/releases/download/4.7-stable/Godot_v4.7-stable_linux.x86_64.zip"
+ if [ ! -f /cache/godot_4.6.3 ]; then
+ echo "Downloading Godot 4.6.3..."
+ curl -sL -o /tmp/godot.zip "https://github.com/godotengine/godot-builds/releases/download/4.6.3-stable/Godot_v4.6.3-stable_linux.x86_64.zip"
unzip -q -o /tmp/godot.zip -d /cache/
- mv /cache/Godot_v4.7-stable_linux.x86_64 /cache/godot_4.7
+ mv /cache/Godot_v4.6.3-stable_linux.x86_64 /cache/godot_4.6.3
fi
- cp /cache/godot_4.7 /usr/local/bin/godot
+ cp /cache/godot_4.6.3 /usr/local/bin/godot
chmod +x /usr/local/bin/godot
- mkdir -p ~/.local/share/godot/export_templates/4.7.stable
- if [ ! -f /cache/Godot_v4.7-stable_export_templates.tpz ]; then
+ mkdir -p ~/.local/share/godot/export_templates/4.6.3.stable
+ if [ ! -f /cache/Godot_v4.6.3-stable_export_templates.tpz ]; then
echo "Downloading templates..."
- curl -sL -o /cache/Godot_v4.7-stable_export_templates.tpz \
- "https://github.com/godotengine/godot-builds/releases/download/4.7-stable/Godot_v4.7-stable_export_templates.tpz"
+ curl -sL -o /cache/Godot_v4.6.3-stable_export_templates.tpz \
+ "https://github.com/godotengine/godot-builds/releases/download/4.6.3-stable/Godot_v4.6.3-stable_export_templates.tpz"
fi
- cd ~/.local/share/godot/export_templates/4.7.stable
- unzip -q -o /cache/Godot_v4.7-stable_export_templates.tpz
+ cd ~/.local/share/godot/export_templates/4.6.3.stable
+ unzip -q -o /cache/Godot_v4.6.3-stable_export_templates.tpz
mv templates/* .
rm -rf templates
cd $GITHUB_WORKSPACE
diff --git a/.gitea/workflows/deploy_patch.yml b/.gitea/workflows/deploy_patch.yml
index 0d43bda..6aadd0f 100644
--- a/.gitea/workflows/deploy_patch.yml
+++ b/.gitea/workflows/deploy_patch.yml
@@ -28,14 +28,14 @@ jobs:
- name: Setup Godot (Cached)
run: |
- if [ ! -f /cache/godot_4.7 ]; then
- echo "Downloading Godot 4.7..."
+ if [ ! -f /cache/godot_4.6.3 ]; then
+ echo "Downloading Godot 4.6.3..."
apt-get update -qq && apt-get install -y -qq unzip curl
- curl -sL -o /tmp/godot.zip "https://github.com/godotengine/godot-builds/releases/download/4.7-stable/Godot_v4.7-stable_linux.x86_64.zip"
+ curl -sL -o /tmp/godot.zip "https://github.com/godotengine/godot-builds/releases/download/4.6.3-stable/Godot_v4.6.3-stable_linux.x86_64.zip"
unzip -q -o /tmp/godot.zip -d /cache/
- mv /cache/Godot_v4.7-stable_linux.x86_64 /cache/godot_4.7
+ mv /cache/Godot_v4.6.3-stable_linux.x86_64 /cache/godot_4.6.3
fi
- cp /cache/godot_4.7 /usr/local/bin/godot
+ cp /cache/godot_4.6.3 /usr/local/bin/godot
chmod +x /usr/local/bin/godot
mkdir -p build
diff --git a/CHANGELOG_DRAFT.md b/CHANGELOG_DRAFT.md
index ac6ec8e..26134d2 100644
--- a/CHANGELOG_DRAFT.md
+++ b/CHANGELOG_DRAFT.md
@@ -3,7 +3,6 @@
- Fixed punch/smack SFX playing repeatedly when quickly attacking another player.
- Fixed currency split between Gacha and Shop — wallet balance now updates immediately after purchase without needing to reopen the panel.
- Fixed fatal crash in Multiplayer Gauntlet caused by missing `has_method` check on smack cooldown timers on remote peers.
-- Upgraded engine from Godot 4.6 to 4.7 stable for better performance and stability.
- Migrated patch delivery from GitHub Pages to Gitea native raw endpoint — no more external dependencies for game updates.
- CI: optimized build cache for Godot binary, eliminating repeated 140MB downloads on every workflow run.
- CI: shallow repository checkout (--depth 1) for faster clone times.
diff --git a/assets/graphics/gui/lobby/_scan_trigger.txt b/assets/graphics/gui/lobby/_scan_trigger.txt
new file mode 100644
index 0000000..b28fbc7
--- /dev/null
+++ b/assets/graphics/gui/lobby/_scan_trigger.txt
@@ -0,0 +1 @@
+trigger
\ No newline at end of file
diff --git a/assets/graphics/gui/lobby/badge_bar.svg b/assets/graphics/gui/lobby/badge_bar.svg
new file mode 100644
index 0000000..407437a
--- /dev/null
+++ b/assets/graphics/gui/lobby/badge_bar.svg
@@ -0,0 +1,3 @@
+
diff --git a/assets/graphics/gui/lobby/badge_bar.svg.import b/assets/graphics/gui/lobby/badge_bar.svg.import
new file mode 100644
index 0000000..d3c9f2c
--- /dev/null
+++ b/assets/graphics/gui/lobby/badge_bar.svg.import
@@ -0,0 +1,43 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://dqwm7rou1fttt"
+path="res://.godot/imported/badge_bar.svg-e4a524a9fe98564c44524e72480e967b.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://assets/graphics/gui/lobby/badge_bar.svg"
+dest_files=["res://.godot/imported/badge_bar.svg-e4a524a9fe98564c44524e72480e967b.ctex"]
+
+[params]
+
+compress/mode=0
+compress/high_quality=false
+compress/lossy_quality=0.7
+compress/uastc_level=0
+compress/rdo_quality_loss=0.0
+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/channel_remap/red=0
+process/channel_remap/green=1
+process/channel_remap/blue=2
+process/channel_remap/alpha=3
+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=4.0
+editor/scale_with_editor_scale=false
+editor/convert_colors_with_editor_theme=false
diff --git a/assets/graphics/gui/lobby/bag.svg b/assets/graphics/gui/lobby/bag.svg
new file mode 100644
index 0000000..c948ccc
--- /dev/null
+++ b/assets/graphics/gui/lobby/bag.svg
@@ -0,0 +1,4 @@
+
diff --git a/assets/graphics/gui/lobby/bag.svg.import b/assets/graphics/gui/lobby/bag.svg.import
new file mode 100644
index 0000000..d8a1407
--- /dev/null
+++ b/assets/graphics/gui/lobby/bag.svg.import
@@ -0,0 +1,43 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://b45naqdq1rfbf"
+path="res://.godot/imported/bag.svg-6aad2540ac3b2ae41bbaa0eab08dc35d.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://assets/graphics/gui/lobby/bag.svg"
+dest_files=["res://.godot/imported/bag.svg-6aad2540ac3b2ae41bbaa0eab08dc35d.ctex"]
+
+[params]
+
+compress/mode=0
+compress/high_quality=false
+compress/lossy_quality=0.7
+compress/uastc_level=0
+compress/rdo_quality_loss=0.0
+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/channel_remap/red=0
+process/channel_remap/green=1
+process/channel_remap/blue=2
+process/channel_remap/alpha=3
+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=4.0
+editor/scale_with_editor_scale=false
+editor/convert_colors_with_editor_theme=false
diff --git a/assets/graphics/gui/lobby/bar_active.svg b/assets/graphics/gui/lobby/bar_active.svg
new file mode 100644
index 0000000..174a579
--- /dev/null
+++ b/assets/graphics/gui/lobby/bar_active.svg
@@ -0,0 +1,3 @@
+
diff --git a/assets/graphics/gui/lobby/bar_active.svg.import b/assets/graphics/gui/lobby/bar_active.svg.import
new file mode 100644
index 0000000..978f75d
--- /dev/null
+++ b/assets/graphics/gui/lobby/bar_active.svg.import
@@ -0,0 +1,43 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://b5qt2u2k23b5w"
+path="res://.godot/imported/bar_active.svg-fa2bdc20c08dc5e5caf41404ea9fca52.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://assets/graphics/gui/lobby/bar_active.svg"
+dest_files=["res://.godot/imported/bar_active.svg-fa2bdc20c08dc5e5caf41404ea9fca52.ctex"]
+
+[params]
+
+compress/mode=0
+compress/high_quality=false
+compress/lossy_quality=0.7
+compress/uastc_level=0
+compress/rdo_quality_loss=0.0
+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/channel_remap/red=0
+process/channel_remap/green=1
+process/channel_remap/blue=2
+process/channel_remap/alpha=3
+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=4.0
+editor/scale_with_editor_scale=false
+editor/convert_colors_with_editor_theme=false
diff --git a/assets/graphics/gui/lobby/bar_default.svg b/assets/graphics/gui/lobby/bar_default.svg
new file mode 100644
index 0000000..a60c3aa
--- /dev/null
+++ b/assets/graphics/gui/lobby/bar_default.svg
@@ -0,0 +1,3 @@
+
diff --git a/assets/graphics/gui/lobby/bar_default.svg.import b/assets/graphics/gui/lobby/bar_default.svg.import
new file mode 100644
index 0000000..875b2c8
--- /dev/null
+++ b/assets/graphics/gui/lobby/bar_default.svg.import
@@ -0,0 +1,43 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://y0y2fqa6xml7"
+path="res://.godot/imported/bar_default.svg-b536747d2c9a6af5ffa8cdb61e16d577.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://assets/graphics/gui/lobby/bar_default.svg"
+dest_files=["res://.godot/imported/bar_default.svg-b536747d2c9a6af5ffa8cdb61e16d577.ctex"]
+
+[params]
+
+compress/mode=0
+compress/high_quality=false
+compress/lossy_quality=0.7
+compress/uastc_level=0
+compress/rdo_quality_loss=0.0
+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/channel_remap/red=0
+process/channel_remap/green=1
+process/channel_remap/blue=2
+process/channel_remap/alpha=3
+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/graphics/gui/lobby/battlepass_left.png b/assets/graphics/gui/lobby/battlepass_left.png
new file mode 100644
index 0000000..8aa403e
Binary files /dev/null and b/assets/graphics/gui/lobby/battlepass_left.png differ
diff --git a/assets/graphics/gui/lobby/battlepass_left.png.import b/assets/graphics/gui/lobby/battlepass_left.png.import
new file mode 100644
index 0000000..f43f5b7
--- /dev/null
+++ b/assets/graphics/gui/lobby/battlepass_left.png.import
@@ -0,0 +1,40 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://bwk0ftvkieg6a"
+path="res://.godot/imported/battlepass_left.png-faa67cece510943dcfea37649905d983.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://assets/graphics/gui/lobby/battlepass_left.png"
+dest_files=["res://.godot/imported/battlepass_left.png-faa67cece510943dcfea37649905d983.ctex"]
+
+[params]
+
+compress/mode=0
+compress/high_quality=false
+compress/lossy_quality=0.7
+compress/uastc_level=0
+compress/rdo_quality_loss=0.0
+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/channel_remap/red=0
+process/channel_remap/green=1
+process/channel_remap/blue=2
+process/channel_remap/alpha=3
+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/graphics/gui/lobby/battlepass_right.png b/assets/graphics/gui/lobby/battlepass_right.png
new file mode 100644
index 0000000..794012e
Binary files /dev/null and b/assets/graphics/gui/lobby/battlepass_right.png differ
diff --git a/assets/graphics/gui/lobby/battlepass_right.png.import b/assets/graphics/gui/lobby/battlepass_right.png.import
new file mode 100644
index 0000000..8abf7dd
--- /dev/null
+++ b/assets/graphics/gui/lobby/battlepass_right.png.import
@@ -0,0 +1,40 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://ccnwto2rc8h6u"
+path="res://.godot/imported/battlepass_right.png-bfe70d145001815fbebe7138176c3a0d.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://assets/graphics/gui/lobby/battlepass_right.png"
+dest_files=["res://.godot/imported/battlepass_right.png-bfe70d145001815fbebe7138176c3a0d.ctex"]
+
+[params]
+
+compress/mode=0
+compress/high_quality=false
+compress/lossy_quality=0.7
+compress/uastc_level=0
+compress/rdo_quality_loss=0.0
+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/channel_remap/red=0
+process/channel_remap/green=1
+process/channel_remap/blue=2
+process/channel_remap/alpha=3
+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/graphics/gui/lobby/blue_tile.png b/assets/graphics/gui/lobby/blue_tile.png
new file mode 100644
index 0000000..ca8a56e
Binary files /dev/null and b/assets/graphics/gui/lobby/blue_tile.png differ
diff --git a/assets/graphics/gui/lobby/blue_tile.png.import b/assets/graphics/gui/lobby/blue_tile.png.import
new file mode 100644
index 0000000..06cdfff
--- /dev/null
+++ b/assets/graphics/gui/lobby/blue_tile.png.import
@@ -0,0 +1,40 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://bjqxr7nt5n1i0"
+path="res://.godot/imported/blue_tile.png-b6228b7f24ff3e6dc562f9408bf54937.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://assets/graphics/gui/lobby/blue_tile.png"
+dest_files=["res://.godot/imported/blue_tile.png-b6228b7f24ff3e6dc562f9408bf54937.ctex"]
+
+[params]
+
+compress/mode=0
+compress/high_quality=false
+compress/lossy_quality=0.7
+compress/uastc_level=0
+compress/rdo_quality_loss=0.0
+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/channel_remap/red=0
+process/channel_remap/green=1
+process/channel_remap/blue=2
+process/channel_remap/alpha=3
+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/graphics/gui/lobby/card_xmple.png b/assets/graphics/gui/lobby/card_xmple.png
new file mode 100644
index 0000000..0622710
Binary files /dev/null and b/assets/graphics/gui/lobby/card_xmple.png differ
diff --git a/assets/graphics/gui/lobby/card_xmple.png.import b/assets/graphics/gui/lobby/card_xmple.png.import
new file mode 100644
index 0000000..595e5c9
--- /dev/null
+++ b/assets/graphics/gui/lobby/card_xmple.png.import
@@ -0,0 +1,40 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://bhv35y3q1jxr0"
+path="res://.godot/imported/card_xmple.png-8c32694d37dfa9b52f185eb68032d21f.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://assets/graphics/gui/lobby/card_xmple.png"
+dest_files=["res://.godot/imported/card_xmple.png-8c32694d37dfa9b52f185eb68032d21f.ctex"]
+
+[params]
+
+compress/mode=0
+compress/high_quality=false
+compress/lossy_quality=0.7
+compress/uastc_level=0
+compress/rdo_quality_loss=0.0
+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/channel_remap/red=0
+process/channel_remap/green=1
+process/channel_remap/blue=2
+process/channel_remap/alpha=3
+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/graphics/gui/lobby/chat.svg b/assets/graphics/gui/lobby/chat.svg
new file mode 100644
index 0000000..c8e0af5
--- /dev/null
+++ b/assets/graphics/gui/lobby/chat.svg
@@ -0,0 +1,3 @@
+
diff --git a/assets/graphics/gui/lobby/chat.svg.import b/assets/graphics/gui/lobby/chat.svg.import
new file mode 100644
index 0000000..a96d188
--- /dev/null
+++ b/assets/graphics/gui/lobby/chat.svg.import
@@ -0,0 +1,43 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://dj1dt2noi1bl3"
+path="res://.godot/imported/chat.svg-ace9e070f497fc9416dfc6184da3dbb8.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://assets/graphics/gui/lobby/chat.svg"
+dest_files=["res://.godot/imported/chat.svg-ace9e070f497fc9416dfc6184da3dbb8.ctex"]
+
+[params]
+
+compress/mode=0
+compress/high_quality=false
+compress/lossy_quality=0.7
+compress/uastc_level=0
+compress/rdo_quality_loss=0.0
+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/channel_remap/red=0
+process/channel_remap/green=1
+process/channel_remap/blue=2
+process/channel_remap/alpha=3
+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/graphics/gui/lobby/chev.svg b/assets/graphics/gui/lobby/chev.svg
new file mode 100644
index 0000000..4320dd0
--- /dev/null
+++ b/assets/graphics/gui/lobby/chev.svg
@@ -0,0 +1,3 @@
+
diff --git a/assets/graphics/gui/lobby/chev.svg.import b/assets/graphics/gui/lobby/chev.svg.import
new file mode 100644
index 0000000..9d4d26c
--- /dev/null
+++ b/assets/graphics/gui/lobby/chev.svg.import
@@ -0,0 +1,43 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://bblx8fmv77m7h"
+path="res://.godot/imported/chev.svg-fce4a145742f1ff9544de09b3a2b99e2.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://assets/graphics/gui/lobby/chev.svg"
+dest_files=["res://.godot/imported/chev.svg-fce4a145742f1ff9544de09b3a2b99e2.ctex"]
+
+[params]
+
+compress/mode=0
+compress/high_quality=false
+compress/lossy_quality=0.7
+compress/uastc_level=0
+compress/rdo_quality_loss=0.0
+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/channel_remap/red=0
+process/channel_remap/green=1
+process/channel_remap/blue=2
+process/channel_remap/alpha=3
+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/graphics/gui/lobby/community_bar.svg b/assets/graphics/gui/lobby/community_bar.svg
new file mode 100644
index 0000000..44fc448
--- /dev/null
+++ b/assets/graphics/gui/lobby/community_bar.svg
@@ -0,0 +1,8 @@
+
diff --git a/assets/graphics/gui/lobby/community_bar.svg.import b/assets/graphics/gui/lobby/community_bar.svg.import
new file mode 100644
index 0000000..cdb8452
--- /dev/null
+++ b/assets/graphics/gui/lobby/community_bar.svg.import
@@ -0,0 +1,43 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://bg7mca4i1fgup"
+path="res://.godot/imported/community_bar.svg-504b1077795422180a9f71afb6c956cc.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://assets/graphics/gui/lobby/community_bar.svg"
+dest_files=["res://.godot/imported/community_bar.svg-504b1077795422180a9f71afb6c956cc.ctex"]
+
+[params]
+
+compress/mode=0
+compress/high_quality=false
+compress/lossy_quality=0.7
+compress/uastc_level=0
+compress/rdo_quality_loss=0.0
+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/channel_remap/red=0
+process/channel_remap/green=1
+process/channel_remap/blue=2
+process/channel_remap/alpha=3
+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=4.0
+editor/scale_with_editor_scale=false
+editor/convert_colors_with_editor_theme=false
diff --git a/assets/graphics/gui/lobby/crown_profile.svg b/assets/graphics/gui/lobby/crown_profile.svg
new file mode 100644
index 0000000..53d67ff
--- /dev/null
+++ b/assets/graphics/gui/lobby/crown_profile.svg
@@ -0,0 +1,11 @@
+
diff --git a/assets/graphics/gui/lobby/crown_profile.svg.import b/assets/graphics/gui/lobby/crown_profile.svg.import
new file mode 100644
index 0000000..60ae522
--- /dev/null
+++ b/assets/graphics/gui/lobby/crown_profile.svg.import
@@ -0,0 +1,43 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://k1sghma1361w"
+path="res://.godot/imported/crown_profile.svg-1d229ff3606b6073a9f2b00a00db02fc.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://assets/graphics/gui/lobby/crown_profile.svg"
+dest_files=["res://.godot/imported/crown_profile.svg-1d229ff3606b6073a9f2b00a00db02fc.ctex"]
+
+[params]
+
+compress/mode=0
+compress/high_quality=false
+compress/lossy_quality=0.7
+compress/uastc_level=0
+compress/rdo_quality_loss=0.0
+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/channel_remap/red=0
+process/channel_remap/green=1
+process/channel_remap/blue=2
+process/channel_remap/alpha=3
+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=4.0
+editor/scale_with_editor_scale=false
+editor/convert_colors_with_editor_theme=false
diff --git a/assets/graphics/gui/lobby/crown_profile.tres b/assets/graphics/gui/lobby/crown_profile.tres
new file mode 100644
index 0000000..3f261b7
--- /dev/null
+++ b/assets/graphics/gui/lobby/crown_profile.tres
@@ -0,0 +1,4 @@
+[gd_resource type="CompressedTexture2D" format=3 uid="uid://dwb753gnca5wv"]
+
+[resource]
+load_path = "res://.godot/imported/crown_profile.svg-1d229ff3606b6073a9f2b00a00db02fc.ctex"
diff --git a/assets/graphics/gui/lobby/curr_gold.svg b/assets/graphics/gui/lobby/curr_gold.svg
new file mode 100644
index 0000000..56f0f11
--- /dev/null
+++ b/assets/graphics/gui/lobby/curr_gold.svg
@@ -0,0 +1,8 @@
+
diff --git a/assets/graphics/gui/lobby/curr_gold.svg.import b/assets/graphics/gui/lobby/curr_gold.svg.import
new file mode 100644
index 0000000..4ecb5d4
--- /dev/null
+++ b/assets/graphics/gui/lobby/curr_gold.svg.import
@@ -0,0 +1,43 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://rncdblgyqxms"
+path="res://.godot/imported/curr_gold.svg-e2aade40f51cb8afdee7896e5f918c90.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://assets/graphics/gui/lobby/curr_gold.svg"
+dest_files=["res://.godot/imported/curr_gold.svg-e2aade40f51cb8afdee7896e5f918c90.ctex"]
+
+[params]
+
+compress/mode=0
+compress/high_quality=false
+compress/lossy_quality=0.7
+compress/uastc_level=0
+compress/rdo_quality_loss=0.0
+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/channel_remap/red=0
+process/channel_remap/green=1
+process/channel_remap/blue=2
+process/channel_remap/alpha=3
+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=4.0
+editor/scale_with_editor_scale=false
+editor/convert_colors_with_editor_theme=false
diff --git a/assets/graphics/gui/lobby/curr_gold.tres b/assets/graphics/gui/lobby/curr_gold.tres
new file mode 100644
index 0000000..65c76b7
--- /dev/null
+++ b/assets/graphics/gui/lobby/curr_gold.tres
@@ -0,0 +1,4 @@
+[gd_resource type="CompressedTexture2D" format=3 uid="uid://dq3crtqml0k35"]
+
+[resource]
+load_path = "res://.godot/imported/curr_gold.svg-e2aade40f51cb8afdee7896e5f918c90.ctex"
diff --git a/assets/graphics/gui/lobby/curr_star.svg b/assets/graphics/gui/lobby/curr_star.svg
new file mode 100644
index 0000000..a4fd1fa
--- /dev/null
+++ b/assets/graphics/gui/lobby/curr_star.svg
@@ -0,0 +1,4 @@
+
diff --git a/assets/graphics/gui/lobby/curr_star.svg.import b/assets/graphics/gui/lobby/curr_star.svg.import
new file mode 100644
index 0000000..1af5f3a
--- /dev/null
+++ b/assets/graphics/gui/lobby/curr_star.svg.import
@@ -0,0 +1,43 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://bt70g810ef6jj"
+path="res://.godot/imported/curr_star.svg-6c7fe7037dccf76a4615f5430186d65a.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://assets/graphics/gui/lobby/curr_star.svg"
+dest_files=["res://.godot/imported/curr_star.svg-6c7fe7037dccf76a4615f5430186d65a.ctex"]
+
+[params]
+
+compress/mode=0
+compress/high_quality=false
+compress/lossy_quality=0.7
+compress/uastc_level=0
+compress/rdo_quality_loss=0.0
+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/channel_remap/red=0
+process/channel_remap/green=1
+process/channel_remap/blue=2
+process/channel_remap/alpha=3
+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=4.0
+editor/scale_with_editor_scale=false
+editor/convert_colors_with_editor_theme=false
diff --git a/assets/graphics/gui/lobby/curr_star.tres b/assets/graphics/gui/lobby/curr_star.tres
new file mode 100644
index 0000000..30adb0f
--- /dev/null
+++ b/assets/graphics/gui/lobby/curr_star.tres
@@ -0,0 +1,4 @@
+[gd_resource type="CompressedTexture2D" format=3 uid="uid://duxo4w34d3ree"]
+
+[resource]
+load_path = "res://.godot/imported/curr_star.svg-6c7fe7037dccf76a4615f5430186d65a.ctex"
diff --git a/assets/graphics/gui/lobby/edit_profile.svg b/assets/graphics/gui/lobby/edit_profile.svg
new file mode 100644
index 0000000..8a1548a
--- /dev/null
+++ b/assets/graphics/gui/lobby/edit_profile.svg
@@ -0,0 +1,5 @@
+
diff --git a/assets/graphics/gui/lobby/edit_profile.svg.import b/assets/graphics/gui/lobby/edit_profile.svg.import
new file mode 100644
index 0000000..fce96b2
--- /dev/null
+++ b/assets/graphics/gui/lobby/edit_profile.svg.import
@@ -0,0 +1,43 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://dp3s31pu8qlhh"
+path="res://.godot/imported/edit_profile.svg-2a0c92ccba4d176da6dc121f1c47b697.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://assets/graphics/gui/lobby/edit_profile.svg"
+dest_files=["res://.godot/imported/edit_profile.svg-2a0c92ccba4d176da6dc121f1c47b697.ctex"]
+
+[params]
+
+compress/mode=0
+compress/high_quality=false
+compress/lossy_quality=0.7
+compress/uastc_level=0
+compress/rdo_quality_loss=0.0
+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/channel_remap/red=0
+process/channel_remap/green=1
+process/channel_remap/blue=2
+process/channel_remap/alpha=3
+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=4.0
+editor/scale_with_editor_scale=false
+editor/convert_colors_with_editor_theme=false
diff --git a/assets/graphics/gui/lobby/edit_profile.tres b/assets/graphics/gui/lobby/edit_profile.tres
new file mode 100644
index 0000000..86be181
--- /dev/null
+++ b/assets/graphics/gui/lobby/edit_profile.tres
@@ -0,0 +1,4 @@
+[gd_resource type="CompressedTexture2D" format=3 uid="uid://b2lyv0usa762v"]
+
+[resource]
+load_path = "res://.godot/imported/edit_profile.svg-2a0c92ccba4d176da6dc121f1c47b697.ctex"
diff --git a/assets/graphics/gui/lobby/emoji.svg b/assets/graphics/gui/lobby/emoji.svg
new file mode 100644
index 0000000..892f5bd
--- /dev/null
+++ b/assets/graphics/gui/lobby/emoji.svg
@@ -0,0 +1,7 @@
+
diff --git a/assets/graphics/gui/lobby/emoji.svg.import b/assets/graphics/gui/lobby/emoji.svg.import
new file mode 100644
index 0000000..a198981
--- /dev/null
+++ b/assets/graphics/gui/lobby/emoji.svg.import
@@ -0,0 +1,43 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://b8bxf0eim4g4p"
+path="res://.godot/imported/emoji.svg-6f5d5aa30898e8bccd149f34e174da0c.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://assets/graphics/gui/lobby/emoji.svg"
+dest_files=["res://.godot/imported/emoji.svg-6f5d5aa30898e8bccd149f34e174da0c.ctex"]
+
+[params]
+
+compress/mode=0
+compress/high_quality=false
+compress/lossy_quality=0.7
+compress/uastc_level=0
+compress/rdo_quality_loss=0.0
+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/channel_remap/red=0
+process/channel_remap/green=1
+process/channel_remap/blue=2
+process/channel_remap/alpha=3
+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=2.0
+editor/scale_with_editor_scale=false
+editor/convert_colors_with_editor_theme=false
diff --git a/assets/graphics/gui/lobby/event_calendar.svg b/assets/graphics/gui/lobby/event_calendar.svg
new file mode 100644
index 0000000..82e44a6
--- /dev/null
+++ b/assets/graphics/gui/lobby/event_calendar.svg
@@ -0,0 +1,12 @@
+
diff --git a/assets/graphics/gui/lobby/event_calendar.svg.import b/assets/graphics/gui/lobby/event_calendar.svg.import
new file mode 100644
index 0000000..ce9a83b
--- /dev/null
+++ b/assets/graphics/gui/lobby/event_calendar.svg.import
@@ -0,0 +1,43 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://d04v2xn8xmom"
+path="res://.godot/imported/event_calendar.svg-bc64330a484d7c6bd4740c6db41ef248.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://assets/graphics/gui/lobby/event_calendar.svg"
+dest_files=["res://.godot/imported/event_calendar.svg-bc64330a484d7c6bd4740c6db41ef248.ctex"]
+
+[params]
+
+compress/mode=0
+compress/high_quality=false
+compress/lossy_quality=0.7
+compress/uastc_level=0
+compress/rdo_quality_loss=0.0
+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/channel_remap/red=0
+process/channel_remap/green=1
+process/channel_remap/blue=2
+process/channel_remap/alpha=3
+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=4.0
+editor/scale_with_editor_scale=false
+editor/convert_colors_with_editor_theme=false
diff --git a/assets/graphics/gui/lobby/green_tile.png b/assets/graphics/gui/lobby/green_tile.png
new file mode 100644
index 0000000..47bb80a
Binary files /dev/null and b/assets/graphics/gui/lobby/green_tile.png differ
diff --git a/assets/graphics/gui/lobby/green_tile.png.import b/assets/graphics/gui/lobby/green_tile.png.import
new file mode 100644
index 0000000..37b6068
--- /dev/null
+++ b/assets/graphics/gui/lobby/green_tile.png.import
@@ -0,0 +1,40 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://cep023y0s7f0f"
+path="res://.godot/imported/green_tile.png-ee3310f4f145f80c08614e3446669370.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://assets/graphics/gui/lobby/green_tile.png"
+dest_files=["res://.godot/imported/green_tile.png-ee3310f4f145f80c08614e3446669370.ctex"]
+
+[params]
+
+compress/mode=0
+compress/high_quality=false
+compress/lossy_quality=0.7
+compress/uastc_level=0
+compress/rdo_quality_loss=0.0
+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/channel_remap/red=0
+process/channel_remap/green=1
+process/channel_remap/blue=2
+process/channel_remap/alpha=3
+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/graphics/gui/lobby/info.svg b/assets/graphics/gui/lobby/info.svg
new file mode 100644
index 0000000..a59e086
--- /dev/null
+++ b/assets/graphics/gui/lobby/info.svg
@@ -0,0 +1,5 @@
+
diff --git a/assets/graphics/gui/lobby/info.svg.import b/assets/graphics/gui/lobby/info.svg.import
new file mode 100644
index 0000000..b61f5a9
--- /dev/null
+++ b/assets/graphics/gui/lobby/info.svg.import
@@ -0,0 +1,43 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://c2empktddd47l"
+path="res://.godot/imported/info.svg-ee9a6cfd88f87333aa473a30db1f68d5.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://assets/graphics/gui/lobby/info.svg"
+dest_files=["res://.godot/imported/info.svg-ee9a6cfd88f87333aa473a30db1f68d5.ctex"]
+
+[params]
+
+compress/mode=0
+compress/high_quality=false
+compress/lossy_quality=0.7
+compress/uastc_level=0
+compress/rdo_quality_loss=0.0
+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/channel_remap/red=0
+process/channel_remap/green=1
+process/channel_remap/blue=2
+process/channel_remap/alpha=3
+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=2.0
+editor/scale_with_editor_scale=false
+editor/convert_colors_with_editor_theme=false
diff --git a/assets/graphics/gui/lobby/message_bar.svg b/assets/graphics/gui/lobby/message_bar.svg
new file mode 100644
index 0000000..93ac77e
--- /dev/null
+++ b/assets/graphics/gui/lobby/message_bar.svg
@@ -0,0 +1,6 @@
+
diff --git a/assets/graphics/gui/lobby/message_bar.svg.import b/assets/graphics/gui/lobby/message_bar.svg.import
new file mode 100644
index 0000000..da96a25
--- /dev/null
+++ b/assets/graphics/gui/lobby/message_bar.svg.import
@@ -0,0 +1,43 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://kmleuwyxmn0c"
+path="res://.godot/imported/message_bar.svg-66acc7d397a41ea08336d5cecf805c29.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://assets/graphics/gui/lobby/message_bar.svg"
+dest_files=["res://.godot/imported/message_bar.svg-66acc7d397a41ea08336d5cecf805c29.ctex"]
+
+[params]
+
+compress/mode=0
+compress/high_quality=false
+compress/lossy_quality=0.7
+compress/uastc_level=0
+compress/rdo_quality_loss=0.0
+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/channel_remap/red=0
+process/channel_remap/green=1
+process/channel_remap/blue=2
+process/channel_remap/alpha=3
+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=4.0
+editor/scale_with_editor_scale=false
+editor/convert_colors_with_editor_theme=false
diff --git a/assets/graphics/gui/lobby/question_circle.svg b/assets/graphics/gui/lobby/question_circle.svg
new file mode 100644
index 0000000..ffe3ebb
--- /dev/null
+++ b/assets/graphics/gui/lobby/question_circle.svg
@@ -0,0 +1,5 @@
+
diff --git a/assets/graphics/gui/lobby/question_circle.svg.import b/assets/graphics/gui/lobby/question_circle.svg.import
new file mode 100644
index 0000000..17e88f8
--- /dev/null
+++ b/assets/graphics/gui/lobby/question_circle.svg.import
@@ -0,0 +1,43 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://b7dp73xokujdb"
+path="res://.godot/imported/question_circle.svg-2401c75e57a76566e387083459fe91d8.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://assets/graphics/gui/lobby/question_circle.svg"
+dest_files=["res://.godot/imported/question_circle.svg-2401c75e57a76566e387083459fe91d8.ctex"]
+
+[params]
+
+compress/mode=0
+compress/high_quality=false
+compress/lossy_quality=0.7
+compress/uastc_level=0
+compress/rdo_quality_loss=0.0
+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/channel_remap/red=0
+process/channel_remap/green=1
+process/channel_remap/blue=2
+process/channel_remap/alpha=3
+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=2.0
+editor/scale_with_editor_scale=false
+editor/convert_colors_with_editor_theme=false
diff --git a/assets/graphics/gui/lobby/rank_bar.svg b/assets/graphics/gui/lobby/rank_bar.svg
new file mode 100644
index 0000000..db6cec0
--- /dev/null
+++ b/assets/graphics/gui/lobby/rank_bar.svg
@@ -0,0 +1,3 @@
+
diff --git a/assets/graphics/gui/lobby/rank_bar.svg.import b/assets/graphics/gui/lobby/rank_bar.svg.import
new file mode 100644
index 0000000..6ce2d50
--- /dev/null
+++ b/assets/graphics/gui/lobby/rank_bar.svg.import
@@ -0,0 +1,43 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://btjm25hjxssbd"
+path="res://.godot/imported/rank_bar.svg-c6d5a0b7f812f9e43fcf123b38dac146.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://assets/graphics/gui/lobby/rank_bar.svg"
+dest_files=["res://.godot/imported/rank_bar.svg-c6d5a0b7f812f9e43fcf123b38dac146.ctex"]
+
+[params]
+
+compress/mode=0
+compress/high_quality=false
+compress/lossy_quality=0.7
+compress/uastc_level=0
+compress/rdo_quality_loss=0.0
+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/channel_remap/red=0
+process/channel_remap/green=1
+process/channel_remap/blue=2
+process/channel_remap/alpha=3
+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=4.0
+editor/scale_with_editor_scale=false
+editor/convert_colors_with_editor_theme=false
diff --git a/assets/graphics/gui/lobby/red_tile.png b/assets/graphics/gui/lobby/red_tile.png
new file mode 100644
index 0000000..6b93b75
Binary files /dev/null and b/assets/graphics/gui/lobby/red_tile.png differ
diff --git a/assets/graphics/gui/lobby/red_tile.png.import b/assets/graphics/gui/lobby/red_tile.png.import
new file mode 100644
index 0000000..f870695
--- /dev/null
+++ b/assets/graphics/gui/lobby/red_tile.png.import
@@ -0,0 +1,40 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://cic88doubsblr"
+path="res://.godot/imported/red_tile.png-9f219ec997f64576619073039811b504.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://assets/graphics/gui/lobby/red_tile.png"
+dest_files=["res://.godot/imported/red_tile.png-9f219ec997f64576619073039811b504.ctex"]
+
+[params]
+
+compress/mode=0
+compress/high_quality=false
+compress/lossy_quality=0.7
+compress/uastc_level=0
+compress/rdo_quality_loss=0.0
+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/channel_remap/red=0
+process/channel_remap/green=1
+process/channel_remap/blue=2
+process/channel_remap/alpha=3
+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/graphics/gui/lobby/setting_bar.svg b/assets/graphics/gui/lobby/setting_bar.svg
new file mode 100644
index 0000000..c4fd2ef
--- /dev/null
+++ b/assets/graphics/gui/lobby/setting_bar.svg
@@ -0,0 +1,3 @@
+
diff --git a/assets/graphics/gui/lobby/setting_bar.svg.import b/assets/graphics/gui/lobby/setting_bar.svg.import
new file mode 100644
index 0000000..e7c64be
--- /dev/null
+++ b/assets/graphics/gui/lobby/setting_bar.svg.import
@@ -0,0 +1,43 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://lks5ndwn3ppp"
+path="res://.godot/imported/setting_bar.svg-45496c706178804cc5c7146fcde7bf19.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://assets/graphics/gui/lobby/setting_bar.svg"
+dest_files=["res://.godot/imported/setting_bar.svg-45496c706178804cc5c7146fcde7bf19.ctex"]
+
+[params]
+
+compress/mode=0
+compress/high_quality=false
+compress/lossy_quality=0.7
+compress/uastc_level=0
+compress/rdo_quality_loss=0.0
+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/channel_remap/red=0
+process/channel_remap/green=1
+process/channel_remap/blue=2
+process/channel_remap/alpha=3
+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=4.0
+editor/scale_with_editor_scale=false
+editor/convert_colors_with_editor_theme=false
diff --git a/assets/graphics/gui/lobby/shop_bar.svg b/assets/graphics/gui/lobby/shop_bar.svg
new file mode 100644
index 0000000..bd57934
--- /dev/null
+++ b/assets/graphics/gui/lobby/shop_bar.svg
@@ -0,0 +1,3 @@
+
diff --git a/assets/graphics/gui/lobby/shop_bar.svg.import b/assets/graphics/gui/lobby/shop_bar.svg.import
new file mode 100644
index 0000000..2976850
--- /dev/null
+++ b/assets/graphics/gui/lobby/shop_bar.svg.import
@@ -0,0 +1,43 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://ci3nm26qx5vdo"
+path="res://.godot/imported/shop_bar.svg-8a6d623c86eeefaae8816eebe1a143fd.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://assets/graphics/gui/lobby/shop_bar.svg"
+dest_files=["res://.godot/imported/shop_bar.svg-8a6d623c86eeefaae8816eebe1a143fd.ctex"]
+
+[params]
+
+compress/mode=0
+compress/high_quality=false
+compress/lossy_quality=0.7
+compress/uastc_level=0
+compress/rdo_quality_loss=0.0
+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/channel_remap/red=0
+process/channel_remap/green=1
+process/channel_remap/blue=2
+process/channel_remap/alpha=3
+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=4.0
+editor/scale_with_editor_scale=false
+editor/convert_colors_with_editor_theme=false
diff --git a/assets/graphics/gui/lobby/yellow_tile.png b/assets/graphics/gui/lobby/yellow_tile.png
new file mode 100644
index 0000000..9836541
Binary files /dev/null and b/assets/graphics/gui/lobby/yellow_tile.png differ
diff --git a/assets/graphics/gui/lobby/yellow_tile.png.import b/assets/graphics/gui/lobby/yellow_tile.png.import
new file mode 100644
index 0000000..9c55238
--- /dev/null
+++ b/assets/graphics/gui/lobby/yellow_tile.png.import
@@ -0,0 +1,40 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://dc0o5lcx1cq64"
+path="res://.godot/imported/yellow_tile.png-764b81de5a4ed1002d1b5b0ffe150bbb.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://assets/graphics/gui/lobby/yellow_tile.png"
+dest_files=["res://.godot/imported/yellow_tile.png-764b81de5a4ed1002d1b5b0ffe150bbb.ctex"]
+
+[params]
+
+compress/mode=0
+compress/high_quality=false
+compress/lossy_quality=0.7
+compress/uastc_level=0
+compress/rdo_quality_loss=0.0
+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/channel_remap/red=0
+process/channel_remap/green=1
+process/channel_remap/blue=2
+process/channel_remap/alpha=3
+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/shaders/rounded_border.gdshader b/assets/shaders/rounded_border.gdshader
new file mode 100644
index 0000000..efa0d3b
--- /dev/null
+++ b/assets/shaders/rounded_border.gdshader
@@ -0,0 +1,13 @@
+shader_type canvas_item;
+
+#include "res://assets/shaders/rounded_border.gdshaderinc"
+
+uniform vec2 rect_size = vec2(270.0, 108.0);
+uniform vec4 corner_radius = vec4(20.0, 20.0, 20.0, 20.0); // top-right, bottom-right, top-left, bottom-left
+uniform float border_width : hint_range(0.0, 50.0) = 3.0;
+uniform vec4 border_color : source_color = vec4(0.06666667, 0.13333334, 0.1882353, 1.0);
+
+void fragment() {
+ vec4 tex_color = texture(TEXTURE, UV) * COLOR;
+ COLOR = apply_rounded_border(tex_color, UV, rect_size, corner_radius, border_width, border_color);
+}
diff --git a/assets/shaders/rounded_border.gdshader.uid b/assets/shaders/rounded_border.gdshader.uid
new file mode 100644
index 0000000..4d72cb1
--- /dev/null
+++ b/assets/shaders/rounded_border.gdshader.uid
@@ -0,0 +1 @@
+uid://cjpl2gt2fc1h2
diff --git a/assets/shaders/rounded_border.gdshaderinc b/assets/shaders/rounded_border.gdshaderinc
new file mode 100644
index 0000000..2cb666b
--- /dev/null
+++ b/assets/shaders/rounded_border.gdshaderinc
@@ -0,0 +1,21 @@
+float rounded_box_sdf(vec2 p, vec2 half_size, vec4 r) {
+ r.xy = (p.x > 0.0) ? r.xy : r.zw;
+ r.x = (p.y > 0.0) ? r.x : r.y;
+ vec2 q = abs(p) - half_size + r.x;
+ return min(max(q.x, q.y), 0.0) + length(max(q, 0.0)) - r.x;
+}
+
+vec4 apply_rounded_border(vec4 base_color, vec2 uv, vec2 rect_size, vec4 corner_radius, float border_width, vec4 border_color) {
+ vec2 px = uv * rect_size;
+ vec2 centered = px - rect_size * 0.5;
+ vec2 half_size = rect_size * 0.5;
+ float d = rounded_box_sdf(centered, half_size, corner_radius);
+
+ float aa = 1.0;
+ float shape_alpha = 1.0 - smoothstep(-aa, aa, d);
+ float border_mask = 1.0 - smoothstep(border_width - aa, border_width + aa, -d);
+
+ vec4 col = mix(base_color, border_color, border_mask);
+ col.a *= shape_alpha;
+ return col;
+}
diff --git a/assets/shaders/rounded_border.gdshaderinc.uid b/assets/shaders/rounded_border.gdshaderinc.uid
new file mode 100644
index 0000000..bf2f10d
--- /dev/null
+++ b/assets/shaders/rounded_border.gdshaderinc.uid
@@ -0,0 +1 @@
+uid://blepo5lsqvih7
diff --git a/assets/shaders/ticket_blur_dissolve.gdshader b/assets/shaders/ticket_blur_dissolve.gdshader
new file mode 100644
index 0000000..c7d6433
--- /dev/null
+++ b/assets/shaders/ticket_blur_dissolve.gdshader
@@ -0,0 +1,24 @@
+shader_type canvas_item;
+
+#include "res://assets/shaders/rounded_border.gdshaderinc"
+
+uniform float blur_amount : hint_range(0.0, 1.0) = 0.0;
+uniform float blur_radius_px : hint_range(0.0, 32.0) = 14.0;
+uniform vec2 rect_size = vec2(100.0, 108.0);
+uniform vec4 corner_radius = vec4(35.0, 35.0, 12.0, 12.0); // top-right, bottom-right, top-left, bottom-left
+uniform float border_width : hint_range(0.0, 50.0) = 3.0;
+uniform vec4 border_color : source_color = vec4(0.06666667, 0.13333334, 0.1882353, 1.0);
+
+void fragment() {
+ vec2 px = TEXTURE_PIXEL_SIZE * blur_radius_px * blur_amount;
+ vec4 sum = texture(TEXTURE, UV) * 2.0;
+ float total_weight = 2.0;
+ for (int i = 0; i < 8; i++) {
+ float angle = float(i) * 0.7853981634; // TAU / 8
+ vec2 offset = vec2(cos(angle), sin(angle)) * px;
+ sum += texture(TEXTURE, UV + offset);
+ total_weight += 1.0;
+ }
+ vec4 tex_color = (sum / total_weight) * COLOR;
+ COLOR = apply_rounded_border(tex_color, UV, rect_size, corner_radius, border_width, border_color);
+}
diff --git a/assets/shaders/ticket_blur_dissolve.gdshader.uid b/assets/shaders/ticket_blur_dissolve.gdshader.uid
new file mode 100644
index 0000000..60e4cd8
--- /dev/null
+++ b/assets/shaders/ticket_blur_dissolve.gdshader.uid
@@ -0,0 +1 @@
+uid://dmsw38nbm2val
diff --git a/docs/STEAMWORKS_SETUP.md b/docs/STEAMWORKS_SETUP.md
index 6d1cc85..c2c26fe 100644
--- a/docs/STEAMWORKS_SETUP.md
+++ b/docs/STEAMWORKS_SETUP.md
@@ -58,7 +58,7 @@ No separate Steam vs. Non-Steam presets. All presets produce the same Nakama-onl
On tag push (`v*`), the CI pipeline:
1. **Checkout** code at tag
-2. **Setup Godot 4.7** (cached)
+2. **Setup Godot 4.6.3** (cached)
3. **Export Windows** → `build/windows/tekton_armageddon_windows.exe` (copies `libgodotsteam*` DLLs if present, failure ignored with `|| true`)
4. **Export Linux** → `build/linux/tekton_armageddon_linux.x86_64`
5. **Export macOS** → `build/macos/tekton_armageddon_macos.zip`
diff --git a/project.godot b/project.godot
index d5e2610..19b44df 100644
--- a/project.godot
+++ b/project.godot
@@ -17,7 +17,7 @@ compatibility/default_parent_skeleton_in_mesh_instance_3d=true
config/name="Tekton Dash Armageddon"
config/version="2.4.3"
run/main_scene="res://scenes/ui/boot_screen.tscn"
-config/features=PackedStringArray("4.7", "Forward Plus")
+config/features=PackedStringArray("4.6", "Forward Plus")
boot_splash/bg_color=Color(0.16470589, 0.6745098, 0.9372549, 1)
boot_splash/stretch_mode=0
boot_splash/image="uid://b10e6kr508642"
diff --git a/scenes/battlepass_slider.gd b/scenes/battlepass_slider.gd
new file mode 100644
index 0000000..de07a6e
--- /dev/null
+++ b/scenes/battlepass_slider.gd
@@ -0,0 +1,148 @@
+extends ScrollContainer
+
+signal page_changed(index: int)
+
+const SNAP_DURATION := 0.25
+const TEX_DEFAULT := preload("res://assets/graphics/gui/lobby/bar_default.svg")
+const TEX_ACTIVE := preload("res://assets/graphics/gui/lobby/bar_active.svg")
+
+@export var auto_advance_enabled: bool = true
+@export var auto_advance_delay: float = 4.0
+
+@onready var _track: HBoxContainer = $CardMargin/HBoxContainer
+@onready var _page_dots: Array = get_node_or_null("../PageIndicator").get_children() if get_node_or_null("../PageIndicator") else []
+
+var _dragging := false
+var _drag_start_pos := 0.0
+var _drag_start_scroll := 0
+var _snap_tween: Tween
+var _auto_timer: Timer
+var _last_reported_page := -1
+
+
+func _ready() -> void:
+ _update_indicator()
+ _setup_auto_timer()
+
+
+func _setup_auto_timer() -> void:
+ _auto_timer = Timer.new()
+ _auto_timer.name = "AutoAdvanceTimer"
+ _auto_timer.one_shot = true
+ _auto_timer.timeout.connect(_on_auto_timer_timeout)
+ add_child(_auto_timer)
+ _restart_auto_timer()
+
+
+func _restart_auto_timer() -> void:
+ if not auto_advance_enabled or _dragging or _card_count() <= 1:
+ return
+ _auto_timer.stop()
+ _auto_timer.wait_time = auto_advance_delay
+ _auto_timer.start()
+
+
+func _on_auto_timer_timeout() -> void:
+ if _dragging:
+ return
+ var next_index := (_current_page() + 1) % _card_count()
+ _animate_to_page(next_index)
+
+
+func _exit_tree() -> void:
+ if _auto_timer:
+ _auto_timer.stop()
+ if _snap_tween:
+ _snap_tween.kill()
+
+
+func _gui_input(event: InputEvent) -> void:
+ if event is InputEventMouseButton and event.button_index == MOUSE_BUTTON_LEFT:
+ if event.pressed:
+ _start_drag(event.position.x)
+ elif _dragging:
+ _end_drag()
+ elif event is InputEventMouseMotion and _dragging:
+ _update_drag(event.position.x)
+ elif event is InputEventScreenTouch and event.index == 0:
+ if event.pressed:
+ _start_drag(event.position.x)
+ elif _dragging:
+ _end_drag()
+ elif event is InputEventScreenDrag and event.index == 0 and _dragging:
+ _update_drag(event.position.x)
+
+
+func _start_drag(x: float) -> void:
+ if _snap_tween:
+ _snap_tween.kill()
+ _auto_timer.stop()
+ _dragging = true
+ _drag_start_pos = x
+ _drag_start_scroll = scroll_horizontal
+
+
+func _update_drag(x: float) -> void:
+ var delta := _drag_start_pos - x
+ scroll_horizontal = clampi(_drag_start_scroll + int(delta), 0, _max_scroll())
+ _update_indicator()
+
+
+func _end_drag() -> void:
+ _dragging = false
+ _snap_to_nearest_card()
+
+
+func _max_scroll() -> int:
+ var bar := get_h_scroll_bar()
+ return maxi(0, int(bar.max_value - bar.page))
+
+
+func _card_count() -> int:
+ return maxi(1, _track.get_child_count())
+
+
+func _card_step() -> float:
+ var count := _card_count()
+ if count <= 1:
+ return 0.0
+ return float(_max_scroll()) / float(count - 1)
+
+
+func _current_page() -> int:
+ var step := _card_step()
+ if step <= 0.0:
+ return 0
+ return clampi(roundi(scroll_horizontal / step), 0, _card_count() - 1)
+
+
+func _snap_to_nearest_card() -> void:
+ _animate_to_page(_current_page())
+
+
+func _animate_to_page(target_index: int) -> void:
+ target_index = clampi(target_index, 0, _card_count() - 1)
+ var step := _card_step()
+ var target_scroll := int(round(target_index * step))
+ if _snap_tween:
+ _snap_tween.kill()
+ _snap_tween = create_tween().set_trans(Tween.TRANS_CUBIC).set_ease(Tween.EASE_OUT)
+ _snap_tween.tween_method(_set_scroll_and_indicator, float(scroll_horizontal), float(target_scroll), SNAP_DURATION)
+ _snap_tween.finished.connect(_restart_auto_timer)
+
+
+func _set_scroll_and_indicator(value: float) -> void:
+ scroll_horizontal = int(round(value))
+ _update_indicator()
+
+
+func _update_indicator() -> void:
+ if _page_dots.is_empty():
+ return
+ var active_index := _current_page()
+ for i in _page_dots.size():
+ var dot: TextureRect = _page_dots[i]
+ dot.texture = TEX_ACTIVE if i == active_index else TEX_DEFAULT
+ if active_index != _last_reported_page:
+ _last_reported_page = active_index
+ page_changed.emit(active_index)
diff --git a/scenes/battlepass_slider.gd.uid b/scenes/battlepass_slider.gd.uid
new file mode 100644
index 0000000..c05d898
--- /dev/null
+++ b/scenes/battlepass_slider.gd.uid
@@ -0,0 +1 @@
+uid://c54ct7t1td21g
diff --git a/scenes/battlepass_slider.tscn b/scenes/battlepass_slider.tscn
new file mode 100644
index 0000000..d106d46
--- /dev/null
+++ b/scenes/battlepass_slider.tscn
@@ -0,0 +1,187 @@
+[gd_scene format=3 uid="uid://bnnq5eunh8o6j"]
+
+[ext_resource type="Script" uid="uid://dc5dh15rrdc4" path="res://scenes/ui/battlepass_panel.gd" id="1_4dl3x"]
+[ext_resource type="Script" uid="uid://c54ct7t1td21g" path="res://scenes/battlepass_slider.gd" id="2_t440c"]
+[ext_resource type="Script" uid="uid://bwu41vcu5t8nd" path="res://scenes/ui/battlepass_ticket.gd" id="3_1jvp2"]
+[ext_resource type="Shader" uid="uid://cjpl2gt2fc1h2" path="res://assets/shaders/rounded_border.gdshader" id="3_tf0vp"]
+[ext_resource type="Texture2D" uid="uid://bwk0ftvkieg6a" path="res://assets/graphics/gui/lobby/battlepass_left.png" id="4_1jvp2"]
+[ext_resource type="Texture2D" uid="uid://y0y2fqa6xml7" path="res://assets/graphics/gui/lobby/bar_default.svg" id="4_ypw31"]
+[ext_resource type="Texture2D" uid="uid://b5qt2u2k23b5w" path="res://assets/graphics/gui/lobby/bar_active.svg" id="5_tf0vp"]
+[ext_resource type="Shader" uid="uid://dmsw38nbm2val" path="res://assets/shaders/ticket_blur_dissolve.gdshader" id="6_jwc2v"]
+[ext_resource type="Texture2D" uid="uid://ccnwto2rc8h6u" path="res://assets/graphics/gui/lobby/battlepass_right.png" id="9_qnxxy"]
+
+[sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_8vv3u"]
+
+[sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_qnxxy"]
+
+[sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_d13xu"]
+
+[sub_resource type="ShaderMaterial" id="ShaderMaterial_tf0vp"]
+shader = ExtResource("3_tf0vp")
+shader_parameter/rect_size = Vector2(270, 108)
+shader_parameter/corner_radius = Vector4(20, 20, 20, 20)
+shader_parameter/border_width = 3.0
+shader_parameter/border_color = Color(0.06666667, 0.13333334, 0.1882353, 1)
+
+[sub_resource type="ShaderMaterial" id="ShaderMaterial_1jvp2"]
+shader = ExtResource("3_tf0vp")
+shader_parameter/rect_size = Vector2(270, 108)
+shader_parameter/corner_radius = Vector4(20, 20, 20, 20)
+shader_parameter/border_width = 3.0
+shader_parameter/border_color = Color(0.06666667, 0.13333334, 0.1882353, 1)
+
+[sub_resource type="ShaderMaterial" id="ShaderMaterial_ypw31"]
+shader = ExtResource("3_tf0vp")
+shader_parameter/rect_size = Vector2(270, 108)
+shader_parameter/corner_radius = Vector4(20, 20, 20, 20)
+shader_parameter/border_width = 3.0
+shader_parameter/border_color = Color(0.06666667, 0.13333334, 0.1882353, 1)
+
+[sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_n0nj0"]
+
+[sub_resource type="ShaderMaterial" id="ShaderMaterial_8vv3u"]
+shader = ExtResource("6_jwc2v")
+shader_parameter/blur_amount = 0.0
+shader_parameter/blur_radius_px = 14.0
+shader_parameter/rect_size = Vector2(100, 108)
+shader_parameter/corner_radius = Vector4(35, 35, 12, 12)
+shader_parameter/border_width = 3.0
+shader_parameter/border_color = Color(0.06666667, 0.13333334, 0.1882353, 1)
+
+[sub_resource type="ShaderMaterial" id="ShaderMaterial_d13xu"]
+shader = ExtResource("6_jwc2v")
+shader_parameter/blur_amount = 0.0
+shader_parameter/blur_radius_px = 14.0
+shader_parameter/rect_size = Vector2(100, 108)
+shader_parameter/corner_radius = Vector4(35, 35, 12, 12)
+shader_parameter/border_width = 3.0
+shader_parameter/border_color = Color(0.06666667, 0.13333334, 0.1882353, 1)
+
+[sub_resource type="ShaderMaterial" id="ShaderMaterial_n0nj0"]
+shader = ExtResource("6_jwc2v")
+shader_parameter/blur_amount = 0.0
+shader_parameter/blur_radius_px = 14.0
+shader_parameter/rect_size = Vector2(100, 108)
+shader_parameter/corner_radius = Vector4(35, 35, 12, 12)
+shader_parameter/border_width = 3.0
+shader_parameter/border_color = Color(0.06666667, 0.13333334, 0.1882353, 1)
+
+[node name="BattlePassSlider" type="Panel" unique_id=1064439374]
+custom_minimum_size = Vector2(367, 112)
+theme_override_styles/panel = SubResource("StyleBoxEmpty_8vv3u")
+script = ExtResource("1_4dl3x")
+
+[node name="Content" type="Panel" parent="." unique_id=639821944]
+custom_minimum_size = Vector2(0, 112)
+layout_mode = 0
+offset_right = 270.0
+offset_bottom = 108.0
+theme_override_styles/panel = SubResource("StyleBoxEmpty_qnxxy")
+
+[node name="ScrollContainer" type="ScrollContainer" parent="Content" unique_id=1495632648]
+layout_mode = 1
+anchors_preset = 15
+anchor_right = 1.0
+anchor_bottom = 1.0
+grow_horizontal = 2
+grow_vertical = 2
+theme_override_styles/panel = SubResource("StyleBoxEmpty_d13xu")
+horizontal_scroll_mode = 3
+vertical_scroll_mode = 3
+script = ExtResource("2_t440c")
+
+[node name="CardMargin" type="MarginContainer" parent="Content/ScrollContainer" unique_id=1204390870]
+layout_mode = 2
+
+[node name="HBoxContainer" type="HBoxContainer" parent="Content/ScrollContainer/CardMargin" unique_id=1504751594]
+custom_minimum_size = Vector2(0, 112)
+layout_mode = 2
+
+[node name="CardBase1" type="TextureRect" parent="Content/ScrollContainer/CardMargin/HBoxContainer" unique_id=876602906]
+material = SubResource("ShaderMaterial_tf0vp")
+custom_minimum_size = Vector2(270, 108)
+layout_mode = 2
+texture = ExtResource("4_1jvp2")
+expand_mode = 1
+stretch_mode = 6
+
+[node name="CardBase2" type="TextureRect" parent="Content/ScrollContainer/CardMargin/HBoxContainer" unique_id=1729572925]
+material = SubResource("ShaderMaterial_1jvp2")
+custom_minimum_size = Vector2(270, 108)
+layout_mode = 2
+texture = ExtResource("4_1jvp2")
+expand_mode = 1
+stretch_mode = 6
+
+[node name="CardBase3" type="TextureRect" parent="Content/ScrollContainer/CardMargin/HBoxContainer" unique_id=1734371616]
+material = SubResource("ShaderMaterial_ypw31")
+custom_minimum_size = Vector2(270, 108)
+layout_mode = 2
+texture = ExtResource("4_1jvp2")
+expand_mode = 1
+stretch_mode = 6
+
+[node name="PageIndicator" type="HBoxContainer" parent="Content" unique_id=874321806]
+layout_mode = 0
+offset_left = 13.0
+offset_top = 90.0
+offset_right = 259.0
+offset_bottom = 99.0
+theme_override_constants/separation = 3
+
+[node name="Dot1" type="TextureRect" parent="Content/PageIndicator" unique_id=392540618]
+custom_minimum_size = Vector2(80, 6)
+layout_mode = 2
+texture = ExtResource("5_tf0vp")
+expand_mode = 1
+
+[node name="Dot2" type="TextureRect" parent="Content/PageIndicator" unique_id=437177486]
+custom_minimum_size = Vector2(80, 6)
+layout_mode = 2
+texture = ExtResource("4_ypw31")
+expand_mode = 1
+
+[node name="Dot3" type="TextureRect" parent="Content/PageIndicator" unique_id=314560320]
+custom_minimum_size = Vector2(80, 6)
+layout_mode = 2
+texture = ExtResource("4_ypw31")
+expand_mode = 1
+
+[node name="Ticket" type="Panel" parent="." unique_id=1195576560]
+clip_contents = true
+custom_minimum_size = Vector2(0, 112)
+layout_mode = 0
+offset_left = 267.0
+offset_right = 367.0
+offset_bottom = 108.0
+theme_override_styles/panel = SubResource("StyleBoxEmpty_n0nj0")
+script = ExtResource("3_1jvp2")
+
+[node name="Ticket1" type="TextureRect" parent="Ticket" unique_id=1639108074]
+material = SubResource("ShaderMaterial_8vv3u")
+layout_mode = 0
+anchor_right = 1.0
+anchor_bottom = 1.0
+texture = ExtResource("9_qnxxy")
+expand_mode = 1
+stretch_mode = 5
+
+[node name="Ticket2" type="TextureRect" parent="Ticket" unique_id=111676944]
+visible = false
+material = SubResource("ShaderMaterial_d13xu")
+layout_mode = 0
+anchor_right = 1.0
+anchor_bottom = 1.0
+texture = ExtResource("9_qnxxy")
+expand_mode = 1
+stretch_mode = 5
+
+[node name="Ticket3" type="TextureRect" parent="Ticket" unique_id=1822173598]
+visible = false
+material = SubResource("ShaderMaterial_n0nj0")
+layout_mode = 0
+anchor_right = 1.0
+anchor_bottom = 1.0
+texture = ExtResource("9_qnxxy")
+expand_mode = 1
+stretch_mode = 5
diff --git a/scenes/lobby.gd b/scenes/lobby.gd
index 5ec7f1d..300e9fc 100644
--- a/scenes/lobby.gd
+++ b/scenes/lobby.gd
@@ -12,6 +12,8 @@ extends Control
@onready var avatar_display = %AvatarDisplay
@onready var lobby_settings_btn = %SettingsBtn
@onready var quit_btn = %QuitBtn
+@onready var chat_toggle_btn = get_node_or_null("%BubbleBtn")
+@onready var chat_panel_container = $MainMenuPanel/MainMargin/MainHBox/LeftCol/ChatPanel
# Main Menu 3D Preview
@onready var character_root = %CharacterRoot
@@ -158,6 +160,29 @@ var _friend_suggest_list: ItemList
# var server_option: OptionButton
# var server_ip_input: LineEdit
+# =============================================================================
+# Menu Button Animation (ROOM / PLAY hover + press juice)
+# =============================================================================
+@export_group("Menu Button Animation")
+@export var menu_btn_hover_scale: float = 1.06
+@export var menu_btn_press_scale: float = 0.94
+@export var menu_btn_hover_duration: float = 0.15
+@export var menu_btn_press_duration: float = 0.08
+@export var menu_btn_release_duration: float = 0.2
+@export var menu_btn_hover_trans: Tween.TransitionType = Tween.TRANS_BACK
+@export var menu_btn_hover_ease: Tween.EaseType = Tween.EASE_OUT
+@export var menu_btn_hover_brighten: float = 1.08
+
+@export_group("Card Fan Idle Animation")
+@export var card_fan_idle_enabled: bool = true
+@export var card_fan_jump_height: float = 14.0
+@export var card_fan_jump_duration: float = 0.35
+@export var card_fan_jump_stagger: float = 0.15
+@export var card_fan_cycle_pause: float = 14.0
+
+var _button_tweens: Dictionary = {}
+var _card_fan_tweens: Dictionary = {}
+
func _ready():
chat = LobbyChat.new(self)
@@ -182,7 +207,10 @@ func _ready():
# Initial UI update
_sync_room_profile_card()
-
+
+ # ROOM / PLAY button hover, press, and card-fan idle animation
+ _setup_menu_button_animations()
+
# Connect Social / Friend UI
var global_chat_tab_btn = get_node_or_null("%GlobalChatTabBtn")
if global_chat_tab_btn:
@@ -401,6 +429,119 @@ func _connect_slot_signals(slot: Control, i: int):
if right_btn:
right_btn.pressed.connect(func(): LobbyManager.cycle_character(1))
+# =============================================================================
+# Menu Button Animation (ROOM / PLAY)
+# =============================================================================
+
+func _setup_menu_button_animations() -> void:
+ for btn in [browse_rooms_btn, create_room_btn]:
+ if not btn:
+ continue
+ btn.pivot_offset = btn.size / 2.0
+ btn.mouse_entered.connect(_on_menu_btn_mouse_entered.bind(btn))
+ btn.mouse_exited.connect(_on_menu_btn_mouse_exited.bind(btn))
+ btn.button_down.connect(_on_menu_btn_down.bind(btn))
+ btn.button_up.connect(_on_menu_btn_up.bind(btn))
+
+ _start_card_fan_idle(get_node_or_null("MainMenuPanel/MainMargin/MainHBox/RightCol/BottomRightPanel/RoomBtnRoot"))
+ _start_card_fan_idle(get_node_or_null("MainMenuPanel/MainMargin/MainHBox/RightCol/BottomRightPanel/PlayBtnRoot"))
+
+ if chat_toggle_btn:
+ chat_toggle_btn.pressed.connect(_on_chat_toggle_pressed)
+
+
+func _on_chat_toggle_pressed() -> void:
+ if chat_panel_container:
+ chat_panel_container.visible = not chat_panel_container.visible
+
+
+func _kill_button_tween(btn: Control) -> void:
+ if _button_tweens.has(btn) and is_instance_valid(_button_tweens[btn]):
+ _button_tweens[btn].kill()
+
+
+func _tween_button_scale(btn: Control, target_scale: float, duration: float, use_overshoot: bool = false) -> void:
+ _kill_button_tween(btn)
+ var tween := create_tween()
+ if use_overshoot:
+ tween.set_trans(menu_btn_hover_trans).set_ease(menu_btn_hover_ease)
+ else:
+ tween.set_trans(Tween.TRANS_SINE).set_ease(Tween.EASE_OUT)
+ tween.tween_property(btn, "scale", Vector2(target_scale, target_scale), duration)
+ _button_tweens[btn] = tween
+
+
+func _on_menu_btn_mouse_entered(btn: Control) -> void:
+ if btn.disabled:
+ return
+ _tween_button_scale(btn, menu_btn_hover_scale, menu_btn_hover_duration, true)
+ btn.self_modulate = Color(menu_btn_hover_brighten, menu_btn_hover_brighten, menu_btn_hover_brighten, 1.0)
+
+
+func _on_menu_btn_mouse_exited(btn: Control) -> void:
+ _tween_button_scale(btn, 1.0, menu_btn_release_duration)
+ btn.self_modulate = Color.WHITE
+
+
+func _on_menu_btn_down(btn: Control) -> void:
+ _tween_button_scale(btn, menu_btn_press_scale, menu_btn_press_duration)
+
+
+func _on_menu_btn_up(btn: Control) -> void:
+ var target := menu_btn_hover_scale if btn.get_global_rect().has_point(get_global_mouse_position()) else 1.0
+ _tween_button_scale(btn, target, menu_btn_release_duration, true)
+
+
+func _start_card_fan_idle(root: Control) -> void:
+ if not root or not card_fan_idle_enabled:
+ return
+
+ # find_child (recursive) instead of a direct get_node_or_null so this still
+ # finds the cards even if they end up nested under a layout wrapper (e.g. a
+ # PanelContainer) instead of being direct children of root.
+ var cards: Array[Control] = []
+ for card_name in ["CardLeft", "CardRight"]:
+ var card := root.find_child(card_name, true, false) as Control
+ if card:
+ cards.append(card)
+ if cards.is_empty():
+ return
+
+ if _card_fan_tweens.has(root):
+ for old_tween in _card_fan_tweens[root]:
+ if is_instance_valid(old_tween):
+ old_tween.kill()
+
+ # Sequential "leapfrog" jump: each card jumps in turn, staggered by
+ # card_fan_jump_stagger, then the whole row pauses before looping.
+ var cycle_total: float = cards.size() * card_fan_jump_stagger + card_fan_cycle_pause
+ var tweens: Array[Tween] = []
+ for i in cards.size():
+ var card := cards[i]
+ var start_y := card.position.y
+ var lead_in: float = i * card_fan_jump_stagger
+ var trailing: float = cycle_total - lead_in - card_fan_jump_duration
+ var tween := create_tween().set_loops()
+ if lead_in > 0.0:
+ tween.tween_interval(lead_in)
+ tween.tween_property(card, "position:y", start_y - card_fan_jump_height, card_fan_jump_duration * 0.5).set_trans(Tween.TRANS_QUAD).set_ease(Tween.EASE_OUT)
+ tween.tween_property(card, "position:y", start_y, card_fan_jump_duration * 0.5).set_trans(Tween.TRANS_BOUNCE).set_ease(Tween.EASE_OUT)
+ if trailing > 0.0:
+ tween.tween_interval(trailing)
+ tweens.append(tween)
+ _card_fan_tweens[root] = tweens
+
+
+func _exit_tree() -> void:
+ for tween in _button_tweens.values():
+ if is_instance_valid(tween):
+ tween.kill()
+ for tweens in _card_fan_tweens.values():
+ for tween in tweens:
+ if is_instance_valid(tween):
+ tween.kill()
+
+
# =============================================================================
# Panel Management
# =============================================================================
diff --git a/scenes/lobby.tscn b/scenes/lobby.tscn
index 8a637b6..ad49ff3 100644
--- a/scenes/lobby.tscn
+++ b/scenes/lobby.tscn
@@ -12,45 +12,64 @@
[ext_resource type="AnimationLibrary" path="res://assets/characters/animations/animation-pack.res" id="5_animlib"]
[ext_resource type="FontFile" uid="uid://xnjx058n4tsw" path="res://assets/fonts/Nougat-ExtraBlack.ttf" id="5_pc087"]
[ext_resource type="Texture2D" uid="uid://brhn1dhp1gm13" path="res://assets/graphics/character_selection/sc_characters/sc_copper.png" id="10_dyhay"]
-[ext_resource type="Texture2D" uid="uid://c8xwpkvvwa7a4" path="res://assets/graphics/gui/mainmenu/chat.png" id="12_dfnwm"]
+[ext_resource type="Texture2D" uid="uid://dwb753gnca5wv" path="res://assets/graphics/gui/lobby/crown_profile.tres" id="10_jkgfa"]
[ext_resource type="Texture2D" uid="uid://b5pp08fke7ptd" path="res://assets/graphics/gui/lobby/gold.png" id="12_gufxi"]
[ext_resource type="Texture2D" uid="uid://c05mo12h5umgi" path="res://assets/graphics/gui/mainmenu/chat_emoji.png" id="13_0jb4q"]
-[ext_resource type="Texture2D" uid="uid://d0ouvm3x8h42c" path="res://assets/graphics/gui/lobby/star.png" id="13_arjad"]
+[ext_resource type="Texture2D" uid="uid://b2lyv0usa762v" path="res://assets/graphics/gui/lobby/edit_profile.tres" id="13_ph747"]
+[ext_resource type="Texture2D" uid="uid://bt70g810ef6jj" path="res://assets/graphics/gui/lobby/curr_star.svg" id="13_twy5w"]
[ext_resource type="Theme" uid="uid://cxab3xxy00" path="res://assets/themes/GUI_Tekton.tres" id="14_2630d"]
[ext_resource type="FontFile" uid="uid://c2tryhyhlyb1u" path="res://assets/fonts/Supercell-Magic Regular.ttf" id="14_vwf6o"]
[ext_resource type="Texture2D" uid="uid://kflvrkha1jwy" path="res://assets/graphics/gui/mainmenu/chat_enter.png" id="15_iwi7x"]
+[ext_resource type="Texture2D" uid="uid://duxo4w34d3ree" path="res://assets/graphics/gui/lobby/curr_star.tres" id="16_ixomp"]
+[ext_resource type="Texture2D" uid="uid://dq3crtqml0k35" path="res://assets/graphics/gui/lobby/curr_gold.tres" id="17_8kv63"]
[ext_resource type="Texture2D" uid="uid://dq8ll26kexu3b" path="res://assets/graphics/gui/mainmenu/button_room.png" id="17_wjff0"]
[ext_resource type="Texture2D" uid="uid://bcgu0jku4ntcw" path="res://assets/graphics/gui/mainmenu/button_room_interact.png" id="18_0jb4q"]
+[ext_resource type="PackedScene" uid="uid://bnnq5eunh8o6j" path="res://scenes/battlepass_slider.tscn" id="18_5jb2g"]
[ext_resource type="Texture2D" uid="uid://dllwxub5n4361" path="res://assets/graphics/gui/mainmenu/button_play.png" id="18_h1rib"]
+[ext_resource type="Texture2D" uid="uid://d04v2xn8xmom" path="res://assets/graphics/gui/lobby/event_calendar.svg" id="18_olier"]
[ext_resource type="Texture2D" uid="uid://l03huy5c0vvy" path="res://assets/graphics/gui/lobby/profile.png" id="18_u7tfn"]
-[ext_resource type="Texture2D" uid="uid://jted80o4uarv" path="res://assets/graphics/gui/lobby/leaderboards.png" id="19_2630d"]
-[ext_resource type="Texture2D" uid="uid://bvugtpcgc2qkx" path="res://assets/graphics/gui/lobby/shop.png" id="20_835bk"]
+[ext_resource type="Texture2D" uid="uid://b45naqdq1rfbf" path="res://assets/graphics/gui/lobby/bag.svg" id="19_5jb2g"]
+[ext_resource type="Texture2D" uid="uid://dj1dt2noi1bl3" path="res://assets/graphics/gui/lobby/chat.svg" id="19_oysm8"]
+[ext_resource type="Texture2D" uid="uid://b8bxf0eim4g4p" path="res://assets/graphics/gui/lobby/emoji.svg" id="20_4pkyx"]
+[ext_resource type="Texture2D" uid="uid://bblx8fmv77m7h" path="res://assets/graphics/gui/lobby/chev.svg" id="20_rievh"]
[ext_resource type="Texture2D" uid="uid://cdupokfxuufpl" path="res://assets/graphics/gui/mainmenu/button_play_interact.png" id="20_vwf6o"]
[ext_resource type="Texture2D" uid="uid://6agwwbc1l4g3" path="res://assets/graphics/gui/play/selection_play0.png" id="21_h1rib"]
-[ext_resource type="Texture2D" uid="uid://bmmajc7h7o4dg" path="res://assets/graphics/gui/lobby/dailylogin.png" id="21_ucbax"]
-[ext_resource type="Texture2D" uid="uid://dv782w5t0xlcc" path="res://assets/graphics/gui/lobby/friends.png" id="22_1x1aw"]
[ext_resource type="Texture2D" uid="uid://cpy5lppf3ro02" path="res://assets/graphics/gui/play/selection_play1.png" id="22_kn4i6"]
[ext_resource type="Texture2D" uid="uid://b0ovmvcm8rt2n" path="res://assets/graphics/gui/play/selection_room0.png" id="23_3jc85"]
-[ext_resource type="Texture2D" uid="uid://cs5lke40qve7y" path="res://assets/graphics/gui/mailbox/mailbox_icon.png" id="23_835bk"]
-[ext_resource type="Texture2D" uid="uid://bqcxrfu2jlplr" path="res://assets/graphics/gui/lobby/settings.png" id="23_twy5w"]
+[ext_resource type="Shader" uid="uid://bx46eyi72i6ak" path="res://setting_bar_shader.gdshader" id="23_8kv63"]
[ext_resource type="Texture2D" uid="uid://3p0sabd1og31" path="res://assets/graphics/gui/play/selection_room1.png" id="24_jhtcy"]
+[ext_resource type="Texture2D" uid="uid://b7dp73xokujdb" path="res://assets/graphics/gui/lobby/question_circle.svg" id="24_ph747"]
[ext_resource type="Texture2D" uid="uid://bpco6lch7homj" path="res://assets/graphics/gui/play/bg.png" id="25_iwv4c"]
+[ext_resource type="Texture2D" uid="uid://ci3nm26qx5vdo" path="res://assets/graphics/gui/lobby/shop_bar.svg" id="25_ixomp"]
+[ext_resource type="Texture2D" uid="uid://dqwm7rou1fttt" path="res://assets/graphics/gui/lobby/badge_bar.svg" id="26_8kv63"]
[ext_resource type="Texture2D" uid="uid://chkt6c6tt7gdb" path="res://assets/graphics/gui/play/story.png" id="26_wpcbs"]
[ext_resource type="Texture2D" uid="uid://6oeuovfdxahu" path="res://assets/graphics/gui/play/story_dimmed.png" id="27_8tmsf"]
[ext_resource type="Texture2D" uid="uid://3kcp8qjd1vfm" path="res://assets/graphics/gui/play/stopngo.png" id="27_ierb3"]
+[ext_resource type="Texture2D" uid="uid://btjm25hjxssbd" path="res://assets/graphics/gui/lobby/rank_bar.svg" id="27_y8bta"]
[ext_resource type="Texture2D" uid="uid://4nejhkohp70d" path="res://assets/graphics/gui/play/freemode.png" id="28_78rk6"]
+[ext_resource type="Texture2D" uid="uid://bg7mca4i1fgup" path="res://assets/graphics/gui/lobby/community_bar.svg" id="28_st18m"]
[ext_resource type="Texture2D" uid="uid://b8dgaw0bk3x6f" path="res://assets/graphics/gui/play/Rank.png" id="29_6mek4"]
+[ext_resource type="Texture2D" uid="uid://kmleuwyxmn0c" path="res://assets/graphics/gui/lobby/message_bar.svg" id="29_6yc8v"]
[ext_resource type="Texture2D" uid="uid://23tvis1trvfr" path="res://assets/graphics/gui/play/x.png" id="29_417c5"]
[ext_resource type="Texture2D" uid="uid://3tsnxh8xbxr5" path="res://assets/graphics/gui/play/stopngo_dimmed.png" id="29_gxh4y"]
[ext_resource type="Texture2D" uid="uid://blh0vhxpbiqip" path="res://assets/graphics/gui/play/stopngo_vertical.png" id="30_8ht5e"]
+[ext_resource type="Texture2D" uid="uid://lks5ndwn3ppp" path="res://assets/graphics/gui/lobby/setting_bar.svg" id="30_yb58j"]
[ext_resource type="Texture2D" uid="uid://1lilep4qo3tc" path="res://assets/graphics/gui/play/freemode-dimmed.png" id="31_30fw8"]
[ext_resource type="Texture2D" uid="uid://6lopq2j3kmai" path="res://assets/graphics/gui/play/freemode_vertical.png" id="31_tuh25"]
+[ext_resource type="PackedScene" uid="uid://c3v78hufajngu" path="res://scenes/lobby_sliders.tscn" id="32_8kv63"]
[ext_resource type="Texture2D" uid="uid://dxngyrdx5riab" path="res://assets/graphics/gui/play/room_list.png" id="32_8tmsf"]
[ext_resource type="Texture2D" uid="uid://dimb6edbhvbrm" path="res://assets/graphics/gui/play/refresh.png" id="33_gxh4y"]
+[ext_resource type="Texture2D" uid="uid://cep023y0s7f0f" path="res://assets/graphics/gui/lobby/green_tile.png" id="33_yb58j"]
[ext_resource type="Texture2D" uid="uid://cniyw4aa1kc4n" path="res://assets/graphics/gui/play/stopngo_vertical_dimmed.png" id="34_7rn74"]
[ext_resource type="Texture2D" uid="uid://bupl61vxuub71" path="res://assets/graphics/gui/play/join.png" id="34_30fw8"]
+[ext_resource type="Texture2D" uid="uid://dc0o5lcx1cq64" path="res://assets/graphics/gui/lobby/yellow_tile.png" id="34_oysm8"]
[ext_resource type="Texture2D" uid="uid://bbuxwuypygk38" path="res://assets/graphics/gui/play/freemode_vertical_dimmed.png" id="36_30el1"]
+[ext_resource type="Texture2D" uid="uid://bjqxr7nt5n1i0" path="res://assets/graphics/gui/lobby/blue_tile.png" id="37_4pkyx"]
+[ext_resource type="FontFile" uid="uid://dsqg0x5lnosou" path="res://assets/fonts/TektonDash2.ttf" id="38_87ggl"]
+[ext_resource type="Texture2D" uid="uid://cic88doubsblr" path="res://assets/graphics/gui/lobby/red_tile.png" id="38_rievh"]
+[ext_resource type="Texture2D" uid="uid://c2empktddd47l" path="res://assets/graphics/gui/lobby/info.svg" id="39_agxrn"]
[ext_resource type="Texture2D" uid="uid://bwu5ms5nsyy43" path="res://assets/graphics/gui/play/referesh_dimmed.png" id="39_s3vw1"]
+[ext_resource type="Script" uid="uid://cas5sc40ampq1" path="res://scenes/ui/quest_list_tab.gd" id="40_agxrn"]
[ext_resource type="Texture2D" uid="uid://cb454spy2usoa" path="res://assets/graphics/gui/play/x_dimmed.png" id="41_7rn74"]
[ext_resource type="Texture2D" uid="uid://d4mt1q2fxkjy" path="res://assets/graphics/gui/play/join_dimmed.png" id="41_iwv5h"]
@@ -63,8 +82,13 @@ ambient_light_energy = 0.5
[sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_busoe"]
+[sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_jkgfa"]
+
+[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_ph747"]
+bg_color = Color(0.6, 0.6, 0.6, 0)
+
[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_8mpuv"]
-bg_color = Color(0.2784314, 0.8745098, 1, 1)
+bg_color = Color(0.2784314, 0.8745098, 1, 0)
border_width_left = 3
border_width_top = 3
border_width_right = 3
@@ -75,37 +99,216 @@ corner_radius_top_right = 15
corner_radius_bottom_right = 15
corner_radius_bottom_left = 15
+[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_835bk"]
+bg_color = Color(0.078431375, 0.6666667, 0.7921569, 1)
+corner_radius_top_left = 10
+corner_radius_top_right = 10
+corner_radius_bottom_right = 10
+corner_radius_bottom_left = 10
+
+[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_ucbax"]
+content_margin_top = 20.0
+content_margin_right = 20.0
+content_margin_bottom = 20.0
+bg_color = Color(0.54509807, 0.54509807, 0.54509807, 0)
+border_width_left = 3
+border_width_top = 3
+border_width_right = 3
+border_width_bottom = 3
+border_color = Color(1, 1, 1, 1)
+corner_radius_top_left = 15
+corner_radius_top_right = 15
+corner_radius_bottom_right = 15
+corner_radius_bottom_left = 15
+
+[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_1x1aw"]
+bg_color = Color(0.11764706, 0.11764706, 0.11764706, 0.42745098)
+corner_radius_top_left = 10
+corner_radius_top_right = 10
+corner_radius_bottom_right = 10
+corner_radius_bottom_left = 10
+
+[sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_ph747"]
+
+[sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_ixomp"]
+
+[sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_8kv63"]
+
+[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_twy5w"]
+bg_color = Color(1, 1, 1, 1)
+border_width_top = 2
+border_width_bottom = 2
+border_color = Color(1, 1, 1, 1)
+corner_radius_top_left = 2
+corner_radius_top_right = 2
+corner_radius_bottom_right = 2
+corner_radius_bottom_left = 2
+
+[sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_y8bta"]
+
[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_gd4oi"]
bg_color = Color(0, 0, 0, 0.48235294)
border_color = Color(0.92941177, 0.91764706, 0.8862745, 1)
-corner_radius_top_left = 3
-corner_radius_top_right = 3
-corner_radius_bottom_right = 3
-corner_radius_bottom_left = 3
+corner_radius_top_left = 20
+corner_radius_top_right = 20
+corner_radius_bottom_right = 20
+corner_radius_bottom_left = 20
-[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_kn4i6"]
-bg_color = Color(0, 0, 0, 0.48235294)
-border_width_left = 5
-border_width_top = 5
-border_width_right = 5
-border_width_bottom = 5
-border_color = Color(1, 1, 1, 1)
-corner_radius_top_left = 10
-corner_radius_top_right = 10
-corner_radius_bottom_right = 10
-corner_radius_bottom_left = 10
+[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_st18m"]
+bg_color = Color(0.11764706, 0.11764706, 0.11764706, 0.5568628)
+corner_radius_top_left = 20
+corner_radius_top_right = 20
+corner_radius_bottom_right = 20
+corner_radius_bottom_left = 20
-[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_3jc85"]
-bg_color = Color(0, 0, 0, 0.48235294)
-border_width_left = 5
-border_width_top = 5
-border_width_right = 5
-border_width_bottom = 5
-border_color = Color(1, 1, 1, 1)
-corner_radius_top_left = 10
-corner_radius_top_right = 10
-corner_radius_bottom_right = 10
-corner_radius_bottom_left = 10
+[sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_6yc8v"]
+
+[sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_yb58j"]
+
+[sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_yf42k"]
+
+[sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_v63ud"]
+
+[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_fwqx0"]
+bg_color = Color(0, 0, 0, 0.54901963)
+corner_radius_top_left = 20
+corner_radius_top_right = 20
+corner_radius_bottom_right = 20
+corner_radius_bottom_left = 20
+
+[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_mb33m"]
+bg_color = Color(0, 0, 0, 0.54901963)
+corner_radius_top_left = 20
+corner_radius_top_right = 20
+corner_radius_bottom_right = 20
+corner_radius_bottom_left = 20
+
+[sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_agxrn"]
+
+[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_4pkyx"]
+bg_color = Color(0, 0, 0, 0.4)
+corner_radius_top_left = 27
+corner_radius_top_right = 27
+corner_radius_bottom_right = 27
+corner_radius_bottom_left = 27
+
+[sub_resource type="ShaderMaterial" id="ShaderMaterial_4pkyx"]
+shader = ExtResource("23_8kv63")
+shader_parameter/panel_size = Vector2(520, 34)
+shader_parameter/corner_radius = 27.0
+
+[sub_resource type="Gradient" id="Gradient_rievh"]
+colors = PackedColorArray(0, 0, 0, 0.2, 0, 0, 0, 0)
+
+[sub_resource type="GradientTexture2D" id="GradientTexture2D_olier"]
+gradient = SubResource("Gradient_rievh")
+width = 8
+fill_to = Vector2(0, 1)
+
+[sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_vfec7"]
+
+[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_yf42k"]
+bg_color = Color(1, 1, 1, 1)
+corner_radius_top_left = 17
+corner_radius_top_right = 17
+corner_radius_bottom_right = 17
+corner_radius_bottom_left = 17
+
+[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_v63ud"]
+bg_color = Color(1, 1, 1, 0.12)
+corner_radius_top_left = 17
+corner_radius_top_right = 17
+corner_radius_bottom_right = 17
+corner_radius_bottom_left = 17
+
+[sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_sy4be"]
+
+[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_0nf8f"]
+bg_color = Color(1, 1, 1, 1)
+corner_radius_top_left = 17
+corner_radius_top_right = 17
+corner_radius_bottom_right = 17
+corner_radius_bottom_left = 17
+
+[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_rox41"]
+bg_color = Color(1, 1, 1, 0.12)
+corner_radius_top_left = 17
+corner_radius_top_right = 17
+corner_radius_bottom_right = 17
+corner_radius_bottom_left = 17
+
+[sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_f1hfh"]
+
+[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_6ax38"]
+bg_color = Color(1, 1, 1, 1)
+corner_radius_top_left = 17
+corner_radius_top_right = 17
+corner_radius_bottom_right = 17
+corner_radius_bottom_left = 17
+
+[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_pril5"]
+bg_color = Color(1, 1, 1, 0.12)
+corner_radius_top_left = 17
+corner_radius_top_right = 17
+corner_radius_bottom_right = 17
+corner_radius_bottom_left = 17
+
+[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_5jb2g"]
+bg_color = Color(0, 0, 0, 0.4)
+corner_radius_top_left = 26
+corner_radius_top_right = 26
+corner_radius_bottom_right = 26
+corner_radius_bottom_left = 26
+
+[sub_resource type="ShaderMaterial" id="ShaderMaterial_rievh"]
+shader = ExtResource("23_8kv63")
+shader_parameter/panel_size = Vector2(520, 149)
+shader_parameter/corner_radius = 26.0
+
+[sub_resource type="Gradient" id="Gradient_s0n6j"]
+colors = PackedColorArray(0, 0, 0, 0.2, 0, 0, 0, 0)
+
+[sub_resource type="GradientTexture2D" id="GradientTexture2D_87ggl"]
+gradient = SubResource("Gradient_s0n6j")
+width = 8
+fill_to = Vector2(0, 1)
+
+[sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_l7nca"]
+
+[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_s0n6j"]
+bg_color = Color(1, 1, 1, 1)
+corner_radius_top_left = 20
+corner_radius_top_right = 20
+corner_radius_bottom_right = 20
+corner_radius_bottom_left = 20
+
+[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_87ggl"]
+bg_color = Color(0.85, 0.9, 0.95, 1)
+corner_radius_top_left = 20
+corner_radius_top_right = 20
+corner_radius_bottom_right = 20
+corner_radius_bottom_left = 20
+
+[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_agxrn"]
+bg_color = Color(0.95, 0.97, 1, 1)
+corner_radius_top_left = 20
+corner_radius_top_right = 20
+corner_radius_bottom_right = 20
+corner_radius_bottom_left = 20
+
+[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_rievh"]
+bg_color = Color(0, 0, 0, 0.3764706)
+corner_radius_top_left = 20
+corner_radius_top_right = 20
+corner_radius_bottom_right = 20
+corner_radius_bottom_left = 20
+
+[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_olier"]
+bg_color = Color(0, 0, 0, 0.3764706)
+corner_radius_top_left = 20
+corner_radius_top_right = 20
+corner_radius_bottom_right = 20
+corner_radius_bottom_left = 20
[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_jhtcy"]
bg_color = Color(0.6, 0.6, 0.6, 0)
@@ -114,12 +317,151 @@ bg_color = Color(0.6, 0.6, 0.6, 0)
[sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_dfnwm"]
+[sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_87ggl"]
+
+[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_l7nca"]
+bg_color = Color(0, 0, 0, 0.4)
+corner_radius_top_left = 20
+corner_radius_top_right = 20
+corner_radius_bottom_right = 20
+corner_radius_bottom_left = 20
+
+[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_vfec7"]
+bg_color = Color(0, 0, 0, 0.4)
+corner_radius_top_left = 20
+corner_radius_top_right = 20
+corner_radius_bottom_right = 20
+corner_radius_bottom_left = 20
+
+[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_sy4be"]
+bg_color = Color(0, 0, 0, 0.6)
+corner_radius_top_left = 20
+corner_radius_top_right = 20
+corner_radius_bottom_right = 20
+corner_radius_bottom_left = 20
+
+[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_f1hfh"]
+bg_color = Color(0, 0, 0, 0.5)
+corner_radius_top_left = 20
+corner_radius_top_right = 20
+corner_radius_bottom_right = 20
+corner_radius_bottom_left = 20
+
+[sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_0nf8f"]
+
+[sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_rox41"]
+
+[sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_6ax38"]
+
+[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_jkoci"]
+bg_color = Color(0, 0, 0, 0.15)
+corner_radius_top_left = 18
+corner_radius_top_right = 18
+corner_radius_bottom_right = 18
+corner_radius_bottom_left = 18
+
+[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_3y5sy"]
+bg_color = Color(1, 1, 1, 0.15)
+corner_radius_top_left = 18
+corner_radius_top_right = 18
+corner_radius_bottom_right = 18
+corner_radius_bottom_left = 18
+
+[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_oysm8"]
+bg_color = Color(0.6, 0.6, 0.6, 0)
+corner_radius_top_left = 8
+corner_radius_top_right = 8
+corner_radius_bottom_right = 16
+corner_radius_bottom_left = 8
+
+[sub_resource type="ShaderMaterial" id="ShaderMaterial_ixomp"]
+shader = ExtResource("23_8kv63")
+shader_parameter/panel_size = Vector2(550, 64)
+shader_parameter/corner_radius = 16.0
+
+[sub_resource type="Gradient" id="Gradient_4pkyx"]
+colors = PackedColorArray(0.16862746, 0, 0.6, 0, 0.16862746, 0, 0.6, 1)
+
+[sub_resource type="GradientTexture2D" id="GradientTexture2D_rievh"]
+gradient = SubResource("Gradient_4pkyx")
+
[sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_835bk"]
[sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_ucbax"]
[sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_1x1aw"]
+[sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_pril5"]
+
+[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_wqxeh"]
+bg_color = Color(1, 1, 1, 1)
+border_width_left = 2
+border_width_top = 2
+border_width_right = 2
+border_width_bottom = 2
+border_color = Color(1, 1, 1, 1)
+corner_radius_top_left = 2
+corner_radius_top_right = 2
+corner_radius_bottom_right = 2
+corner_radius_bottom_left = 2
+
+[sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_do6di"]
+
+[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_do6di"]
+bg_color = Color(0, 0, 0, 0.4509804)
+corner_radius_top_left = 10
+corner_radius_top_right = 10
+corner_radius_bottom_right = 10
+corner_radius_bottom_left = 10
+
+[sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_jkoci"]
+
+[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_os6ns"]
+bg_color = Color(1, 1, 1, 1)
+corner_radius_top_left = 6
+corner_radius_top_right = 6
+corner_radius_bottom_right = 6
+corner_radius_bottom_left = 6
+
+[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_b6wif"]
+bg_color = Color(1, 1, 1, 0.12156863)
+corner_radius_top_left = 13
+corner_radius_top_right = 13
+corner_radius_bottom_right = 13
+corner_radius_bottom_left = 13
+
+[sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_uovpt"]
+
+[sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_3y5sy"]
+
+[sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_fwqx0"]
+
+[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_8onxx"]
+bg_color = Color(1, 1, 1, 1)
+corner_radius_top_left = 13
+corner_radius_top_right = 13
+corner_radius_bottom_right = 13
+corner_radius_bottom_left = 13
+
+[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_15eno"]
+bg_color = Color(1, 1, 1, 0.12156863)
+corner_radius_top_left = 13
+corner_radius_top_right = 13
+corner_radius_bottom_right = 13
+corner_radius_bottom_left = 13
+
+[sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_4pkyx"]
+
+[sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_rievh"]
+
+[sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_olier"]
+
+[sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_oysm8"]
+
+[sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_5jb2g"]
+
+[sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_s0n6j"]
+
[sub_resource type="StyleBoxTexture" id="StyleBoxTexture_50md7"]
texture = ExtResource("25_iwv4c")
@@ -194,6 +536,8 @@ grow_horizontal = 2
grow_vertical = 2
theme = ExtResource("2_theme")
script = ExtResource("1_lp6xi")
+metadata/_edit_horizontal_guides_ = [35.0, 733.0]
+metadata/_edit_vertical_guides_ = [35.0, 1331.0]
[node name="Background3" type="ColorRect" parent="." unique_id=245238082]
visible = false
@@ -303,48 +647,78 @@ anchor_right = 1.0
anchor_bottom = 1.0
grow_horizontal = 2
grow_vertical = 2
-theme_override_constants/margin_left = 30
-theme_override_constants/margin_top = 30
-theme_override_constants/margin_right = 30
-theme_override_constants/margin_bottom = 30
+theme_override_constants/margin_left = 35
+theme_override_constants/margin_top = 35
+theme_override_constants/margin_right = 35
+theme_override_constants/margin_bottom = 35
[node name="MainHBox" type="HBoxContainer" parent="MainMenuPanel/MainMargin" unique_id=892534882]
layout_mode = 2
theme_override_constants/separation = 16
[node name="LeftCol" type="VBoxContainer" parent="MainMenuPanel/MainMargin/MainHBox" unique_id=53823485]
-custom_minimum_size = Vector2(350, 0)
+custom_minimum_size = Vector2(207, 0)
layout_mode = 2
-theme_override_constants/separation = 8
[node name="HBoxContainer2" type="HBoxContainer" parent="MainMenuPanel/MainMargin/MainHBox/LeftCol" unique_id=473798164]
layout_mode = 2
[node name="ProfileCard" type="PanelContainer" parent="MainMenuPanel/MainMargin/MainHBox/LeftCol/HBoxContainer2" unique_id=5938459]
-clip_contents = true
-custom_minimum_size = Vector2(0, 130)
layout_mode = 2
size_flags_horizontal = 3
theme_override_styles/panel = SubResource("StyleBoxEmpty_busoe")
[node name="MarginContainer" type="MarginContainer" parent="MainMenuPanel/MainMargin/MainHBox/LeftCol/HBoxContainer2/ProfileCard" unique_id=1195708144]
layout_mode = 2
-theme_override_constants/margin_left = 20
-theme_override_constants/margin_right = 20
+size_flags_vertical = 4
[node name="HBox" type="HBoxContainer" parent="MainMenuPanel/MainMargin/MainHBox/LeftCol/HBoxContainer2/ProfileCard/MarginContainer" unique_id=58934509]
+custom_minimum_size = Vector2(448, 100)
layout_mode = 2
-theme_override_constants/separation = 12
+size_flags_vertical = 4
+theme_override_constants/separation = 8
-[node name="MainProfileBtn" type="Button" parent="MainMenuPanel/MainMargin/MainHBox/LeftCol/HBoxContainer2/ProfileCard/MarginContainer/HBox" unique_id=89234859]
-unique_name_in_owner = true
+[node name="Panel2" type="Panel" parent="MainMenuPanel/MainMargin/MainHBox/LeftCol/HBoxContainer2/ProfileCard/MarginContainer/HBox" unique_id=384190896]
custom_minimum_size = Vector2(100, 100)
layout_mode = 2
+theme_override_styles/panel = SubResource("StyleBoxEmpty_jkgfa")
+
+[node name="Crown" type="Panel" parent="MainMenuPanel/MainMargin/MainHBox/LeftCol/HBoxContainer2/ProfileCard/MarginContainer/HBox/Panel2" unique_id=1182974540]
+layout_mode = 1
+anchors_preset = 5
+anchor_left = 0.5
+anchor_right = 0.5
+offset_top = -28.0
+offset_bottom = 6.0
+grow_horizontal = 2
+theme_override_styles/panel = SubResource("StyleBoxFlat_ph747")
+
+[node name="TextureRect" type="TextureRect" parent="MainMenuPanel/MainMargin/MainHBox/LeftCol/HBoxContainer2/ProfileCard/MarginContainer/HBox/Panel2/Crown" unique_id=244556470]
+layout_mode = 1
+anchors_preset = 5
+anchor_left = 0.5
+anchor_right = 0.5
+offset_left = -20.5
+offset_right = 20.5
+offset_bottom = 31.0
+grow_horizontal = 2
+texture = ExtResource("10_jkgfa")
+expand_mode = 1
+
+[node name="MainProfileBtn" type="Button" parent="MainMenuPanel/MainMargin/MainHBox/LeftCol/HBoxContainer2/ProfileCard/MarginContainer/HBox/Panel2" unique_id=89234859]
+unique_name_in_owner = true
+custom_minimum_size = Vector2(100, 100)
+layout_mode = 1
+anchors_preset = 15
+anchor_right = 1.0
+anchor_bottom = 1.0
+grow_horizontal = 2
+grow_vertical = 2
size_flags_vertical = 4
flat = true
expand_icon = true
-[node name="Panel" type="Panel" parent="MainMenuPanel/MainMargin/MainHBox/LeftCol/HBoxContainer2/ProfileCard/MarginContainer/HBox/MainProfileBtn" unique_id=2112174468]
+[node name="Panel" type="Panel" parent="MainMenuPanel/MainMargin/MainHBox/LeftCol/HBoxContainer2/ProfileCard/MarginContainer/HBox/Panel2/MainProfileBtn" unique_id=2112174468]
layout_mode = 1
anchors_preset = 15
anchor_right = 1.0
@@ -353,7 +727,19 @@ grow_horizontal = 2
grow_vertical = 2
theme_override_styles/panel = SubResource("StyleBoxFlat_8mpuv")
-[node name="AvatarDisplay" type="TextureRect" parent="MainMenuPanel/MainMargin/MainHBox/LeftCol/HBoxContainer2/ProfileCard/MarginContainer/HBox/MainProfileBtn" unique_id=593485890]
+[node name="Panel" type="Panel" parent="MainMenuPanel/MainMargin/MainHBox/LeftCol/HBoxContainer2/ProfileCard/MarginContainer/HBox/Panel2/MainProfileBtn/Panel" unique_id=981680637]
+layout_mode = 1
+anchors_preset = 15
+anchor_right = 1.0
+anchor_bottom = 1.0
+grow_horizontal = 2
+grow_vertical = 2
+scale = Vector2(0.87, 0.87)
+pivot_offset = Vector2(50, 50)
+theme_override_styles/panel = SubResource("StyleBoxFlat_835bk")
+metadata/_edit_use_anchors_ = true
+
+[node name="AvatarDisplay" type="TextureRect" parent="MainMenuPanel/MainMargin/MainHBox/LeftCol/HBoxContainer2/ProfileCard/MarginContainer/HBox/Panel2/MainProfileBtn/Panel" unique_id=593485890]
unique_name_in_owner = true
layout_mode = 1
anchors_preset = 15
@@ -361,16 +747,55 @@ anchor_right = 1.0
anchor_bottom = 1.0
grow_horizontal = 2
grow_vertical = 2
+scale = Vector2(0.88, 0.88)
+pivot_offset = Vector2(50, 50)
texture = ExtResource("10_dyhay")
expand_mode = 1
stretch_mode = 5
-[node name="VBoxContainer" type="VBoxContainer" parent="MainMenuPanel/MainMargin/MainHBox/LeftCol/HBoxContainer2/ProfileCard/MarginContainer/HBox" unique_id=598345789]
+[node name="Panel" type="Panel" parent="MainMenuPanel/MainMargin/MainHBox/LeftCol/HBoxContainer2/ProfileCard/MarginContainer/HBox" unique_id=95033853]
layout_mode = 2
size_flags_horizontal = 3
-alignment = 1
+theme_override_styles/panel = SubResource("StyleBoxFlat_ucbax")
-[node name="Username" type="Label" parent="MainMenuPanel/MainMargin/MainHBox/LeftCol/HBoxContainer2/ProfileCard/MarginContainer/HBox/VBoxContainer" unique_id=50934858]
+[node name="Panel" type="Panel" parent="MainMenuPanel/MainMargin/MainHBox/LeftCol/HBoxContainer2/ProfileCard/MarginContainer/HBox/Panel" unique_id=887191722]
+layout_mode = 1
+anchors_preset = 15
+anchor_right = 1.0
+anchor_bottom = 1.0
+offset_left = 6.0
+offset_top = 6.0
+offset_right = -6.0
+offset_bottom = -6.0
+grow_horizontal = 2
+grow_vertical = 2
+pivot_offset = Vector2(50, 50)
+pivot_offset_ratio = Vector2(50, 50)
+theme_override_styles/panel = SubResource("StyleBoxFlat_1x1aw")
+metadata/_edit_use_anchors_ = true
+
+[node name="MarginContainer" type="MarginContainer" parent="MainMenuPanel/MainMargin/MainHBox/LeftCol/HBoxContainer2/ProfileCard/MarginContainer/HBox/Panel/Panel" unique_id=814833769]
+layout_mode = 1
+anchors_preset = 15
+anchor_right = 1.0
+anchor_bottom = 1.0
+grow_horizontal = 2
+grow_vertical = 2
+rotation = -0.00042401726
+theme_override_constants/margin_left = 8
+theme_override_constants/margin_top = 8
+theme_override_constants/margin_right = 8
+theme_override_constants/margin_bottom = 8
+
+[node name="ProfileCard" type="VBoxContainer" parent="MainMenuPanel/MainMargin/MainHBox/LeftCol/HBoxContainer2/ProfileCard/MarginContainer/HBox/Panel/Panel/MarginContainer" unique_id=1124531167]
+unique_name_in_owner = true
+layout_mode = 2
+size_flags_horizontal = 3
+
+[node name="HBoxContainer2" type="HBoxContainer" parent="MainMenuPanel/MainMargin/MainHBox/LeftCol/HBoxContainer2/ProfileCard/MarginContainer/HBox/Panel/Panel/MarginContainer/ProfileCard" unique_id=2125411101]
+layout_mode = 2
+
+[node name="Username" type="Label" parent="MainMenuPanel/MainMargin/MainHBox/LeftCol/HBoxContainer2/ProfileCard/MarginContainer/HBox/Panel/Panel/MarginContainer/ProfileCard/HBoxContainer2" unique_id=50934858]
unique_name_in_owner = true
layout_mode = 2
theme = ExtResource("2_theme")
@@ -378,230 +803,662 @@ theme_override_fonts/font = ExtResource("5_pc087")
theme_override_font_sizes/font_size = 24
text = "USERNAME"
-[node name="Subtitle" type="Label" parent="MainMenuPanel/MainMargin/MainHBox/LeftCol/HBoxContainer2/ProfileCard/MarginContainer/HBox/VBoxContainer" unique_id=5948395]
+[node name="VSeparator" type="VSeparator" parent="MainMenuPanel/MainMargin/MainHBox/LeftCol/HBoxContainer2/ProfileCard/MarginContainer/HBox/Panel/Panel/MarginContainer/ProfileCard/HBoxContainer2" unique_id=1291684476]
+layout_mode = 2
+size_flags_horizontal = 3
+theme_override_constants/separation = 0
+theme_override_styles/separator = SubResource("StyleBoxEmpty_ph747")
+
+[node name="Panel" type="Button" parent="MainMenuPanel/MainMargin/MainHBox/LeftCol/HBoxContainer2/ProfileCard/MarginContainer/HBox/Panel/Panel/MarginContainer/ProfileCard/HBoxContainer2" unique_id=1669254581]
+custom_minimum_size = Vector2(18, 18)
+layout_mode = 2
+size_flags_vertical = 4
+theme_override_styles/normal = SubResource("StyleBoxEmpty_ixomp")
+
+[node name="TextureButton" type="TextureRect" parent="MainMenuPanel/MainMargin/MainHBox/LeftCol/HBoxContainer2/ProfileCard/MarginContainer/HBox/Panel/Panel/MarginContainer/ProfileCard/HBoxContainer2/Panel" unique_id=1316337810]
+custom_minimum_size = Vector2(18, 18)
+layout_mode = 1
+anchors_preset = 15
+anchor_right = 1.0
+anchor_bottom = 1.0
+grow_horizontal = 2
+grow_vertical = 2
+size_flags_horizontal = 4
+texture = ExtResource("13_ph747")
+expand_mode = 1
+
+[node name="HSeparator3" type="HSeparator" parent="MainMenuPanel/MainMargin/MainHBox/LeftCol/HBoxContainer2/ProfileCard/MarginContainer/HBox/Panel/Panel/MarginContainer/ProfileCard" unique_id=631156959]
+layout_mode = 2
+size_flags_vertical = 0
+theme_override_constants/separation = 0
+theme_override_styles/separator = SubResource("StyleBoxEmpty_8kv63")
+
+[node name="HSeparator" type="HSeparator" parent="MainMenuPanel/MainMargin/MainHBox/LeftCol/HBoxContainer2/ProfileCard/MarginContainer/HBox/Panel/Panel/MarginContainer/ProfileCard" unique_id=1789932398]
+clip_contents = true
+layout_mode = 2
+size_flags_vertical = 4
+theme_override_constants/separation = 4
+theme_override_styles/separator = SubResource("StyleBoxFlat_twy5w")
+
+[node name="HSeparator2" type="HSeparator" parent="MainMenuPanel/MainMargin/MainHBox/LeftCol/HBoxContainer2/ProfileCard/MarginContainer/HBox/Panel/Panel/MarginContainer/ProfileCard" unique_id=817356678]
+layout_mode = 2
+size_flags_vertical = 0
+theme_override_constants/separation = 0
+theme_override_styles/separator = SubResource("StyleBoxEmpty_y8bta")
+
+[node name="HBoxContainer" type="HBoxContainer" parent="MainMenuPanel/MainMargin/MainHBox/LeftCol/HBoxContainer2/ProfileCard/MarginContainer/HBox/Panel/Panel/MarginContainer/ProfileCard" unique_id=331071595]
+layout_mode = 2
+size_flags_vertical = 3
+
+[node name="Panel2" type="Panel" parent="MainMenuPanel/MainMargin/MainHBox/LeftCol/HBoxContainer2/ProfileCard/MarginContainer/HBox/Panel/Panel/MarginContainer/ProfileCard/HBoxContainer" unique_id=1514999060]
+visible = false
+custom_minimum_size = Vector2(40, 20)
+layout_mode = 2
+theme_override_styles/panel = SubResource("StyleBoxFlat_gd4oi")
+
+[node name="MarginContainer" type="MarginContainer" parent="MainMenuPanel/MainMargin/MainHBox/LeftCol/HBoxContainer2/ProfileCard/MarginContainer/HBox/Panel/Panel/MarginContainer/ProfileCard/HBoxContainer/Panel2" unique_id=2040127486]
+layout_mode = 1
+anchors_preset = 15
+anchor_right = 1.0
+anchor_bottom = 1.0
+grow_horizontal = 2
+grow_vertical = 2
+
+[node name="HBoxContainer" type="HBoxContainer" parent="MainMenuPanel/MainMargin/MainHBox/LeftCol/HBoxContainer2/ProfileCard/MarginContainer/HBox/Panel/Panel/MarginContainer/ProfileCard/HBoxContainer/Panel2/MarginContainer" unique_id=108285540]
+layout_mode = 2
+size_flags_vertical = 4
+
+[node name="Panel" type="Control" parent="MainMenuPanel/MainMargin/MainHBox/LeftCol/HBoxContainer2/ProfileCard/MarginContainer/HBox/Panel/Panel/MarginContainer/ProfileCard/HBoxContainer/Panel2/MarginContainer/HBoxContainer" unique_id=1271756238]
+custom_minimum_size = Vector2(28, 28)
+layout_mode = 2
+
+[node name="TextureRect" type="TextureRect" parent="MainMenuPanel/MainMargin/MainHBox/LeftCol/HBoxContainer2/ProfileCard/MarginContainer/HBox/Panel/Panel/MarginContainer/ProfileCard/HBoxContainer/Panel2/MarginContainer/HBoxContainer/Panel" unique_id=1770079891]
+layout_mode = 1
+anchors_preset = 15
+anchor_right = 1.0
+anchor_bottom = 1.0
+grow_horizontal = 2
+grow_vertical = 2
+size_flags_horizontal = 4
+size_flags_vertical = 4
+texture = ExtResource("13_twy5w")
+expand_mode = 1
+
+[node name="Label" type="Label" parent="MainMenuPanel/MainMargin/MainHBox/LeftCol/HBoxContainer2/ProfileCard/MarginContainer/HBox/Panel/Panel/MarginContainer/ProfileCard/HBoxContainer/Panel2/MarginContainer/HBoxContainer" unique_id=1184388330]
+visible = false
+layout_mode = 2
+size_flags_horizontal = 3
+text = "0000000"
+horizontal_alignment = 2
+vertical_alignment = 1
+
+[node name="StarLabel" type="Label" parent="MainMenuPanel/MainMargin/MainHBox/LeftCol/HBoxContainer2/ProfileCard/MarginContainer/HBox/Panel/Panel/MarginContainer/ProfileCard/HBoxContainer/Panel2/MarginContainer/HBoxContainer" unique_id=948509]
unique_name_in_owner = true
layout_mode = 2
+size_flags_horizontal = 3
+theme_override_fonts/font = ExtResource("5_pc087")
+theme_override_font_sizes/font_size = 18
+text = "0"
+horizontal_alignment = 2
+
+[node name="Panel" type="Panel" parent="MainMenuPanel/MainMargin/MainHBox/LeftCol/HBoxContainer2/ProfileCard/MarginContainer/HBox/Panel/Panel/MarginContainer/ProfileCard/HBoxContainer" unique_id=113826609]
+visible = false
+custom_minimum_size = Vector2(80, 20)
+layout_mode = 2
+size_flags_horizontal = 8
+theme_override_styles/panel = SubResource("StyleBoxFlat_gd4oi")
+
+[node name="MarginContainer" type="MarginContainer" parent="MainMenuPanel/MainMargin/MainHBox/LeftCol/HBoxContainer2/ProfileCard/MarginContainer/HBox/Panel/Panel/MarginContainer/ProfileCard/HBoxContainer/Panel" unique_id=2062391446]
+layout_mode = 1
+anchors_preset = 15
+anchor_right = 1.0
+anchor_bottom = 1.0
+grow_horizontal = 2
+grow_vertical = 2
+theme_override_constants/margin_left = 3
+theme_override_constants/margin_top = 3
+theme_override_constants/margin_right = 6
+theme_override_constants/margin_bottom = 3
+
+[node name="HBoxContainer" type="HBoxContainer" parent="MainMenuPanel/MainMargin/MainHBox/LeftCol/HBoxContainer2/ProfileCard/MarginContainer/HBox/Panel/Panel/MarginContainer/ProfileCard/HBoxContainer/Panel/MarginContainer" unique_id=1826509078]
+layout_mode = 2
+
+[node name="TextureRect" type="TextureRect" parent="MainMenuPanel/MainMargin/MainHBox/LeftCol/HBoxContainer2/ProfileCard/MarginContainer/HBox/Panel/Panel/MarginContainer/ProfileCard/HBoxContainer/Panel/MarginContainer/HBoxContainer" unique_id=1462222702]
+layout_mode = 2
+size_flags_horizontal = 0
+size_flags_vertical = 4
+texture = ExtResource("12_gufxi")
+
+[node name="Label" type="Label" parent="MainMenuPanel/MainMargin/MainHBox/LeftCol/HBoxContainer2/ProfileCard/MarginContainer/HBox/Panel/Panel/MarginContainer/ProfileCard/HBoxContainer/Panel/MarginContainer/HBoxContainer" unique_id=312597909]
+visible = false
+layout_mode = 2
+size_flags_horizontal = 3
+text = "0000000"
+horizontal_alignment = 2
+vertical_alignment = 1
+
+[node name="GoldLabel" type="Label" parent="MainMenuPanel/MainMargin/MainHBox/LeftCol/HBoxContainer2/ProfileCard/MarginContainer/HBox/Panel/Panel/MarginContainer/ProfileCard/HBoxContainer/Panel/MarginContainer/HBoxContainer" unique_id=94850]
+unique_name_in_owner = true
+layout_mode = 2
+size_flags_horizontal = 3
+theme_override_fonts/font = ExtResource("5_pc087")
+theme_override_font_sizes/font_size = 18
+text = "0"
+horizontal_alignment = 2
+
+[node name="MarginContainer2" type="MarginContainer" parent="MainMenuPanel/MainMargin/MainHBox/LeftCol/HBoxContainer2/ProfileCard/MarginContainer/HBox/Panel/Panel/MarginContainer/ProfileCard/HBoxContainer" unique_id=289273153]
+layout_mode = 2
+size_flags_horizontal = 3
+theme_override_constants/margin_left = 13
+
+[node name="curr_star" type="Panel" parent="MainMenuPanel/MainMargin/MainHBox/LeftCol/HBoxContainer2/ProfileCard/MarginContainer/HBox/Panel/Panel/MarginContainer/ProfileCard/HBoxContainer/MarginContainer2" unique_id=442904116]
+layout_mode = 2
+size_flags_horizontal = 3
+theme_override_styles/panel = SubResource("StyleBoxFlat_st18m")
+
+[node name="MarginContainer2" type="MarginContainer" parent="MainMenuPanel/MainMargin/MainHBox/LeftCol/HBoxContainer2/ProfileCard/MarginContainer/HBox/Panel/Panel/MarginContainer/ProfileCard/HBoxContainer/MarginContainer2/curr_star" unique_id=812952188]
+layout_mode = 1
+anchors_preset = 15
+anchor_right = 1.0
+anchor_bottom = 1.0
+grow_horizontal = 2
+grow_vertical = 2
+theme_override_constants/margin_right = 5
+
+[node name="Panel" type="Panel" parent="MainMenuPanel/MainMargin/MainHBox/LeftCol/HBoxContainer2/ProfileCard/MarginContainer/HBox/Panel/Panel/MarginContainer/ProfileCard/HBoxContainer/MarginContainer2/curr_star/MarginContainer2" unique_id=863776061]
+layout_mode = 2
+theme_override_styles/panel = SubResource("StyleBoxEmpty_6yc8v")
+
+[node name="HBoxContainer" type="HBoxContainer" parent="MainMenuPanel/MainMargin/MainHBox/LeftCol/HBoxContainer2/ProfileCard/MarginContainer/HBox/Panel/Panel/MarginContainer/ProfileCard/HBoxContainer/MarginContainer2/curr_star/MarginContainer2/Panel" unique_id=476579988]
+layout_mode = 1
+anchors_preset = 15
+anchor_right = 1.0
+anchor_bottom = 1.0
+grow_horizontal = 2
+grow_vertical = 2
+
+[node name="icon" type="Control" parent="MainMenuPanel/MainMargin/MainHBox/LeftCol/HBoxContainer2/ProfileCard/MarginContainer/HBox/Panel/Panel/MarginContainer/ProfileCard/HBoxContainer/MarginContainer2/curr_star/MarginContainer2/Panel/HBoxContainer" unique_id=1857907027]
+layout_mode = 2
+
+[node name="TextureRect" type="TextureRect" parent="MainMenuPanel/MainMargin/MainHBox/LeftCol/HBoxContainer2/ProfileCard/MarginContainer/HBox/Panel/Panel/MarginContainer/ProfileCard/HBoxContainer/MarginContainer2/curr_star/MarginContainer2/Panel/HBoxContainer/icon" unique_id=1890970008]
+custom_minimum_size = Vector2(28, 28)
+layout_mode = 1
+anchors_preset = 15
+anchor_right = 1.0
+anchor_bottom = 1.0
+offset_left = 0.5
+offset_top = -1.1
+offset_right = 0.5
+offset_bottom = -1.1000004
+grow_horizontal = 2
+grow_vertical = 2
+scale = Vector2(1.1, 1.1)
+size_flags_horizontal = 4
+size_flags_vertical = 4
+texture = ExtResource("16_ixomp")
+expand_mode = 1
+
+[node name="StarLabel" type="Label" parent="MainMenuPanel/MainMargin/MainHBox/LeftCol/HBoxContainer2/ProfileCard/MarginContainer/HBox/Panel/Panel/MarginContainer/ProfileCard/HBoxContainer/MarginContainer2/curr_star/MarginContainer2/Panel/HBoxContainer" unique_id=1885199303]
+layout_mode = 2
+size_flags_horizontal = 10
+theme_override_fonts/font = ExtResource("5_pc087")
+theme_override_font_sizes/font_size = 18
+text = "0"
+horizontal_alignment = 2
+
+[node name="MarginContainer" type="MarginContainer" parent="MainMenuPanel/MainMargin/MainHBox/LeftCol/HBoxContainer2/ProfileCard/MarginContainer/HBox/Panel/Panel/MarginContainer/ProfileCard/HBoxContainer/MarginContainer2/curr_star/MarginContainer2/Panel" unique_id=1722932535]
+visible = false
+layout_mode = 1
+anchors_preset = 15
+anchor_right = 1.0
+anchor_bottom = 1.0
+offset_left = 4.0
+offset_top = -0.5
+offset_right = 25.0
+offset_bottom = 0.5
+grow_horizontal = 2
+grow_vertical = 2
+theme_override_constants/margin_left = 3
+theme_override_constants/margin_top = 3
+theme_override_constants/margin_right = 3
+theme_override_constants/margin_bottom = 3
+
+[node name="VSeparator" type="VSeparator" parent="MainMenuPanel/MainMargin/MainHBox/LeftCol/HBoxContainer2/ProfileCard/MarginContainer/HBox/Panel/Panel/MarginContainer/ProfileCard/HBoxContainer" unique_id=2040409119]
+layout_mode = 2
+theme_override_constants/separation = 20
+theme_override_styles/separator = SubResource("StyleBoxEmpty_yb58j")
+
+[node name="MarginContainer" type="MarginContainer" parent="MainMenuPanel/MainMargin/MainHBox/LeftCol/HBoxContainer2/ProfileCard/MarginContainer/HBox/Panel/Panel/MarginContainer/ProfileCard/HBoxContainer" unique_id=1921432898]
+layout_mode = 2
+size_flags_horizontal = 3
+theme_override_constants/margin_left = 13
+
+[node name="curr_star" type="Panel" parent="MainMenuPanel/MainMargin/MainHBox/LeftCol/HBoxContainer2/ProfileCard/MarginContainer/HBox/Panel/Panel/MarginContainer/ProfileCard/HBoxContainer/MarginContainer" unique_id=872102647]
+layout_mode = 2
+size_flags_horizontal = 3
+theme_override_styles/panel = SubResource("StyleBoxFlat_st18m")
+
+[node name="MarginContainer2" type="MarginContainer" parent="MainMenuPanel/MainMargin/MainHBox/LeftCol/HBoxContainer2/ProfileCard/MarginContainer/HBox/Panel/Panel/MarginContainer/ProfileCard/HBoxContainer/MarginContainer/curr_star" unique_id=720374599]
+layout_mode = 1
+anchors_preset = 15
+anchor_right = 1.0
+anchor_bottom = 1.0
+grow_horizontal = 2
+grow_vertical = 2
+theme_override_constants/margin_right = 5
+
+[node name="Panel" type="Panel" parent="MainMenuPanel/MainMargin/MainHBox/LeftCol/HBoxContainer2/ProfileCard/MarginContainer/HBox/Panel/Panel/MarginContainer/ProfileCard/HBoxContainer/MarginContainer/curr_star/MarginContainer2" unique_id=1403218261]
+layout_mode = 2
+theme_override_styles/panel = SubResource("StyleBoxEmpty_6yc8v")
+
+[node name="HBoxContainer" type="HBoxContainer" parent="MainMenuPanel/MainMargin/MainHBox/LeftCol/HBoxContainer2/ProfileCard/MarginContainer/HBox/Panel/Panel/MarginContainer/ProfileCard/HBoxContainer/MarginContainer/curr_star/MarginContainer2/Panel" unique_id=2059872823]
+layout_mode = 1
+anchors_preset = 15
+anchor_right = 1.0
+anchor_bottom = 1.0
+grow_horizontal = 2
+grow_vertical = 2
+
+[node name="icon" type="Control" parent="MainMenuPanel/MainMargin/MainHBox/LeftCol/HBoxContainer2/ProfileCard/MarginContainer/HBox/Panel/Panel/MarginContainer/ProfileCard/HBoxContainer/MarginContainer/curr_star/MarginContainer2/Panel/HBoxContainer" unique_id=933100210]
+layout_mode = 2
+
+[node name="TextureRect" type="TextureRect" parent="MainMenuPanel/MainMargin/MainHBox/LeftCol/HBoxContainer2/ProfileCard/MarginContainer/HBox/Panel/Panel/MarginContainer/ProfileCard/HBoxContainer/MarginContainer/curr_star/MarginContainer2/Panel/HBoxContainer/icon" unique_id=30722077]
+custom_minimum_size = Vector2(28, 28)
+layout_mode = 1
+anchors_preset = 15
+anchor_right = 1.0
+anchor_bottom = 1.0
+offset_left = 0.5
+offset_top = -1.1
+offset_right = 0.5
+offset_bottom = -1.1000004
+grow_horizontal = 2
+grow_vertical = 2
+scale = Vector2(1.1, 1.1)
+size_flags_horizontal = 4
+size_flags_vertical = 4
+texture = ExtResource("17_8kv63")
+expand_mode = 1
+
+[node name="StarLabel" type="Label" parent="MainMenuPanel/MainMargin/MainHBox/LeftCol/HBoxContainer2/ProfileCard/MarginContainer/HBox/Panel/Panel/MarginContainer/ProfileCard/HBoxContainer/MarginContainer/curr_star/MarginContainer2/Panel/HBoxContainer" unique_id=227792042]
+layout_mode = 2
+size_flags_horizontal = 10
+theme_override_fonts/font = ExtResource("5_pc087")
+theme_override_font_sizes/font_size = 18
+text = "0"
+horizontal_alignment = 2
+
+[node name="MarginContainer" type="MarginContainer" parent="MainMenuPanel/MainMargin/MainHBox/LeftCol/HBoxContainer2/ProfileCard/MarginContainer/HBox/Panel/Panel/MarginContainer/ProfileCard/HBoxContainer/MarginContainer/curr_star/MarginContainer2/Panel" unique_id=1503179775]
+visible = false
+layout_mode = 1
+anchors_preset = 15
+anchor_right = 1.0
+anchor_bottom = 1.0
+offset_left = 4.0
+offset_top = -0.5
+offset_right = 25.0
+offset_bottom = 0.5
+grow_horizontal = 2
+grow_vertical = 2
+theme_override_constants/margin_left = 3
+theme_override_constants/margin_top = 3
+theme_override_constants/margin_right = 3
+theme_override_constants/margin_bottom = 3
+
+[node name="Subtitle" type="Label" parent="MainMenuPanel/MainMargin/MainHBox/LeftCol/HBoxContainer2/ProfileCard/MarginContainer/HBox/Panel/Panel/MarginContainer/ProfileCard" unique_id=5948395]
+unique_name_in_owner = true
+visible = false
+layout_mode = 2
theme_override_colors/font_color = Color(0.53, 0.53, 0.53, 1)
theme_override_fonts/font = ExtResource("5_pc087")
theme_override_font_sizes/font_size = 14
text = "EU SERVER"
-[node name="HBoxContainer" type="HBoxContainer" parent="MainMenuPanel/MainMargin/MainHBox/LeftCol/HBoxContainer2/ProfileCard/MarginContainer/HBox/VBoxContainer" unique_id=331071595]
-layout_mode = 2
-theme_override_constants/separation = 6
-
-[node name="Panel" type="Panel" parent="MainMenuPanel/MainMargin/MainHBox/LeftCol/HBoxContainer2/ProfileCard/MarginContainer/HBox/VBoxContainer/HBoxContainer" unique_id=113826609]
-custom_minimum_size = Vector2(80, 30)
-layout_mode = 2
-size_flags_horizontal = 3
-theme_override_styles/panel = SubResource("StyleBoxFlat_gd4oi")
-
-[node name="MarginContainer" type="MarginContainer" parent="MainMenuPanel/MainMargin/MainHBox/LeftCol/HBoxContainer2/ProfileCard/MarginContainer/HBox/VBoxContainer/HBoxContainer/Panel" unique_id=2062391446]
-layout_mode = 1
-anchors_preset = 15
-anchor_right = 1.0
-anchor_bottom = 1.0
-grow_horizontal = 2
-grow_vertical = 2
-theme_override_constants/margin_left = 3
-theme_override_constants/margin_top = 3
-theme_override_constants/margin_right = 6
-theme_override_constants/margin_bottom = 3
-
-[node name="HBoxContainer" type="HBoxContainer" parent="MainMenuPanel/MainMargin/MainHBox/LeftCol/HBoxContainer2/ProfileCard/MarginContainer/HBox/VBoxContainer/HBoxContainer/Panel/MarginContainer" unique_id=1826509078]
-layout_mode = 2
-
-[node name="TextureRect" type="TextureRect" parent="MainMenuPanel/MainMargin/MainHBox/LeftCol/HBoxContainer2/ProfileCard/MarginContainer/HBox/VBoxContainer/HBoxContainer/Panel/MarginContainer/HBoxContainer" unique_id=1462222702]
-layout_mode = 2
-size_flags_horizontal = 0
-size_flags_vertical = 4
-texture = ExtResource("12_gufxi")
-
-[node name="Label" type="Label" parent="MainMenuPanel/MainMargin/MainHBox/LeftCol/HBoxContainer2/ProfileCard/MarginContainer/HBox/VBoxContainer/HBoxContainer/Panel/MarginContainer/HBoxContainer" unique_id=312597909]
-visible = false
-layout_mode = 2
-size_flags_horizontal = 3
-text = "0000000"
-horizontal_alignment = 2
-vertical_alignment = 1
-
-[node name="GoldLabel" type="Label" parent="MainMenuPanel/MainMargin/MainHBox/LeftCol/HBoxContainer2/ProfileCard/MarginContainer/HBox/VBoxContainer/HBoxContainer/Panel/MarginContainer/HBoxContainer" unique_id=94850]
-unique_name_in_owner = true
-layout_mode = 2
-size_flags_horizontal = 3
-theme_override_fonts/font = ExtResource("5_pc087")
-theme_override_font_sizes/font_size = 18
-text = "0"
-horizontal_alignment = 2
-
-[node name="Panel2" type="Panel" parent="MainMenuPanel/MainMargin/MainHBox/LeftCol/HBoxContainer2/ProfileCard/MarginContainer/HBox/VBoxContainer/HBoxContainer" unique_id=1514999060]
-custom_minimum_size = Vector2(80, 30)
-layout_mode = 2
-size_flags_horizontal = 3
-theme_override_styles/panel = SubResource("StyleBoxFlat_gd4oi")
-
-[node name="MarginContainer" type="MarginContainer" parent="MainMenuPanel/MainMargin/MainHBox/LeftCol/HBoxContainer2/ProfileCard/MarginContainer/HBox/VBoxContainer/HBoxContainer/Panel2" unique_id=2040127486]
-layout_mode = 1
-anchors_preset = 15
-anchor_right = 1.0
-anchor_bottom = 1.0
-grow_horizontal = 2
-grow_vertical = 2
-theme_override_constants/margin_left = 3
-theme_override_constants/margin_top = 3
-theme_override_constants/margin_right = 6
-theme_override_constants/margin_bottom = 3
-
-[node name="HBoxContainer" type="HBoxContainer" parent="MainMenuPanel/MainMargin/MainHBox/LeftCol/HBoxContainer2/ProfileCard/MarginContainer/HBox/VBoxContainer/HBoxContainer/Panel2/MarginContainer" unique_id=108285540]
-layout_mode = 2
-
-[node name="TextureRect" type="TextureRect" parent="MainMenuPanel/MainMargin/MainHBox/LeftCol/HBoxContainer2/ProfileCard/MarginContainer/HBox/VBoxContainer/HBoxContainer/Panel2/MarginContainer/HBoxContainer" unique_id=1770079891]
-layout_mode = 2
-size_flags_horizontal = 0
-size_flags_vertical = 4
-texture = ExtResource("13_arjad")
-
-[node name="Label" type="Label" parent="MainMenuPanel/MainMargin/MainHBox/LeftCol/HBoxContainer2/ProfileCard/MarginContainer/HBox/VBoxContainer/HBoxContainer/Panel2/MarginContainer/HBoxContainer" unique_id=1184388330]
-visible = false
-layout_mode = 2
-size_flags_horizontal = 3
-text = "0000000"
-horizontal_alignment = 2
-vertical_alignment = 1
-
-[node name="StarLabel" type="Label" parent="MainMenuPanel/MainMargin/MainHBox/LeftCol/HBoxContainer2/ProfileCard/MarginContainer/HBox/VBoxContainer/HBoxContainer/Panel2/MarginContainer/HBoxContainer" unique_id=948509]
-unique_name_in_owner = true
-layout_mode = 2
-size_flags_horizontal = 3
-theme_override_fonts/font = ExtResource("5_pc087")
-theme_override_font_sizes/font_size = 18
-text = "0"
-horizontal_alignment = 2
-
[node name="Control" type="Control" parent="MainMenuPanel/MainMargin/MainHBox/LeftCol/HBoxContainer2" unique_id=177944371]
+visible = false
custom_minimum_size = Vector2(50, 0)
layout_direction = 3
layout_mode = 2
-[node name="SpacerProfile" type="Control" parent="MainMenuPanel/MainMargin/MainHBox/LeftCol" unique_id=58943589]
-custom_minimum_size = Vector2(0, 8)
+[node name="HSeparator2" type="HSeparator" parent="MainMenuPanel/MainMargin/MainHBox/LeftCol" unique_id=2047650361]
layout_mode = 2
+theme_override_constants/separation = 10
+theme_override_styles/separator = SubResource("StyleBoxEmpty_yf42k")
-[node name="SpacerMiddle" type="Control" parent="MainMenuPanel/MainMargin/MainHBox/LeftCol" unique_id=984509]
+[node name="BattlePass" parent="MainMenuPanel/MainMargin/MainHBox/LeftCol" unique_id=1064439374 instance=ExtResource("18_5jb2g")]
layout_mode = 2
-size_flags_vertical = 3
+size_flags_horizontal = 0
+theme_override_styles/panel = SubResource("StyleBoxEmpty_v63ud")
-[node name="ChatPanel" type="PanelContainer" parent="MainMenuPanel/MainMargin/MainHBox/LeftCol" unique_id=948590]
-custom_minimum_size = Vector2(520, 260)
+[node name="HSeparator3" type="HSeparator" parent="MainMenuPanel/MainMargin/MainHBox/LeftCol" unique_id=1331729522]
+layout_mode = 2
+theme_override_constants/separation = 14
+theme_override_styles/separator = SubResource("StyleBoxEmpty_yf42k")
+
+[node name="VBoxContainer" type="VBoxContainer" parent="MainMenuPanel/MainMargin/MainHBox/LeftCol" unique_id=2050468161]
+custom_minimum_size = Vector2(80, 0)
+layout_mode = 2
+size_flags_horizontal = 0
+size_flags_vertical = 4
+
+[node name="Events" type="Panel" parent="MainMenuPanel/MainMargin/MainHBox/LeftCol/VBoxContainer" unique_id=1942930509]
+custom_minimum_size = Vector2(67, 67)
+layout_mode = 2
+size_flags_horizontal = 0
+size_flags_vertical = 4
+theme_override_styles/panel = SubResource("StyleBoxFlat_fwqx0")
+
+[node name="MarginContainer" type="MarginContainer" parent="MainMenuPanel/MainMargin/MainHBox/LeftCol/VBoxContainer/Events" unique_id=73447453]
+layout_mode = 1
+anchors_preset = 15
+anchor_right = 1.0
+anchor_bottom = 1.0
+grow_horizontal = 2
+grow_vertical = 2
+theme_override_constants/margin_left = 13
+theme_override_constants/margin_top = 13
+theme_override_constants/margin_right = 13
+theme_override_constants/margin_bottom = 13
+
+[node name="TextureRect" type="TextureRect" parent="MainMenuPanel/MainMargin/MainHBox/LeftCol/VBoxContainer/Events/MarginContainer" unique_id=1725027124]
+layout_mode = 2
+texture = ExtResource("18_olier")
+expand_mode = 1
+stretch_mode = 5
+
+[node name="HSeparator3" type="HSeparator" parent="MainMenuPanel/MainMargin/MainHBox/LeftCol/VBoxContainer" unique_id=188784548]
+layout_mode = 2
+theme_override_constants/separation = 6
+theme_override_styles/separator = SubResource("StyleBoxEmpty_yf42k")
+
+[node name="Inventory" type="Panel" parent="MainMenuPanel/MainMargin/MainHBox/LeftCol/VBoxContainer" unique_id=776230915]
+custom_minimum_size = Vector2(67, 67)
+layout_mode = 2
+size_flags_horizontal = 0
+size_flags_vertical = 4
+theme_override_styles/panel = SubResource("StyleBoxFlat_mb33m")
+
+[node name="MarginContainer" type="MarginContainer" parent="MainMenuPanel/MainMargin/MainHBox/LeftCol/VBoxContainer/Inventory" unique_id=103420172]
+layout_mode = 1
+anchors_preset = 15
+anchor_right = 1.0
+anchor_bottom = 1.0
+grow_horizontal = 2
+grow_vertical = 2
+theme_override_constants/margin_left = 13
+theme_override_constants/margin_top = 13
+theme_override_constants/margin_right = 13
+theme_override_constants/margin_bottom = 13
+
+[node name="TextureRect" type="TextureRect" parent="MainMenuPanel/MainMargin/MainHBox/LeftCol/VBoxContainer/Inventory/MarginContainer" unique_id=1908625726]
+layout_mode = 2
+texture = ExtResource("19_5jb2g")
+expand_mode = 1
+stretch_mode = 5
+
+[node name="HSeparator4" type="HSeparator" parent="MainMenuPanel/MainMargin/MainHBox/LeftCol" unique_id=524180060]
+layout_mode = 2
+theme_override_constants/separation = 14
+theme_override_styles/separator = SubResource("StyleBoxEmpty_yf42k")
+
+[node name="Control" type="Control" parent="MainMenuPanel/MainMargin/MainHBox/LeftCol" unique_id=1092740754]
layout_mode = 2
size_flags_vertical = 8
+
+[node name="ChatPanel" type="PanelContainer" parent="MainMenuPanel/MainMargin/MainHBox/LeftCol/Control" unique_id=948590]
+custom_minimum_size = Vector2(400, 197)
+layout_mode = 0
+offset_top = 4.0
+offset_right = 400.0
+offset_bottom = 201.0
+size_flags_horizontal = 0
+size_flags_vertical = 8
theme = ExtResource("14_2630d")
-theme_override_styles/panel = SubResource("StyleBoxFlat_kn4i6")
+theme_override_styles/panel = SubResource("StyleBoxEmpty_agxrn")
-[node name="VBoxContainer" type="VBoxContainer" parent="MainMenuPanel/MainMargin/MainHBox/LeftCol/ChatPanel" unique_id=459039]
+[node name="VBoxContainer" type="VBoxContainer" parent="MainMenuPanel/MainMargin/MainHBox/LeftCol/Control/ChatPanel" unique_id=459039]
+layout_mode = 2
+theme_override_constants/separation = 10
+
+[node name="TabsBackground" type="PanelContainer" parent="MainMenuPanel/MainMargin/MainHBox/LeftCol/Control/ChatPanel/VBoxContainer" unique_id=1292343209]
+layout_mode = 2
+theme_override_styles/panel = SubResource("StyleBoxFlat_4pkyx")
+
+[node name="GradientOverlay" type="TextureRect" parent="MainMenuPanel/MainMargin/MainHBox/LeftCol/Control/ChatPanel/VBoxContainer/TabsBackground" unique_id=484114092]
+material = SubResource("ShaderMaterial_4pkyx")
+layout_mode = 2
+mouse_filter = 2
+texture = SubResource("GradientTexture2D_olier")
+expand_mode = 1
+
+[node name="MarginContainer" type="MarginContainer" parent="MainMenuPanel/MainMargin/MainHBox/LeftCol/Control/ChatPanel/VBoxContainer/TabsBackground" unique_id=1189440913]
layout_mode = 2
-[node name="MarginContainer" type="MarginContainer" parent="MainMenuPanel/MainMargin/MainHBox/LeftCol/ChatPanel/VBoxContainer" unique_id=1189440913]
-layout_mode = 2
-theme_override_constants/margin_left = 7
-theme_override_constants/margin_top = 7
-theme_override_constants/margin_right = 7
-
-[node name="ChatTabsContainer" type="HBoxContainer" parent="MainMenuPanel/MainMargin/MainHBox/LeftCol/ChatPanel/VBoxContainer/MarginContainer" unique_id=459040]
+[node name="ChatTabsContainer" type="HBoxContainer" parent="MainMenuPanel/MainMargin/MainHBox/LeftCol/Control/ChatPanel/VBoxContainer/TabsBackground/MarginContainer" unique_id=459040]
unique_name_in_owner = true
layout_mode = 2
+theme_override_constants/separation = 4
-[node name="GlobalChatTabBtn" type="Button" parent="MainMenuPanel/MainMargin/MainHBox/LeftCol/ChatPanel/VBoxContainer/MarginContainer/ChatTabsContainer" unique_id=439566196]
+[node name="GlobalChatTabBtn" type="Button" parent="MainMenuPanel/MainMargin/MainHBox/LeftCol/Control/ChatPanel/VBoxContainer/TabsBackground/MarginContainer/ChatTabsContainer" unique_id=439566196]
unique_name_in_owner = true
+custom_minimum_size = Vector2(0, 34)
layout_mode = 2
size_flags_horizontal = 3
-text = "Global"
+theme_override_colors/font_color = Color(1, 1, 1, 0.85)
+theme_override_colors/font_pressed_color = Color(0.08, 0.14, 0.24, 1)
+theme_override_colors/font_hover_color = Color(1, 1, 1, 1)
+theme_override_fonts/font = ExtResource("5_pc087")
+theme_override_font_sizes/font_size = 16
+theme_override_styles/normal = SubResource("StyleBoxEmpty_vfec7")
+theme_override_styles/pressed = SubResource("StyleBoxFlat_yf42k")
+theme_override_styles/hover = SubResource("StyleBoxFlat_v63ud")
+toggle_mode = true
+button_pressed = true
+text = "WORLD"
-[node name="DMTabTemplate" type="HBoxContainer" parent="MainMenuPanel/MainMargin/MainHBox/LeftCol/ChatPanel/VBoxContainer/MarginContainer/ChatTabsContainer" unique_id=123456789]
+[node name="ServerChatTabBtn" type="Button" parent="MainMenuPanel/MainMargin/MainHBox/LeftCol/Control/ChatPanel/VBoxContainer/TabsBackground/MarginContainer/ChatTabsContainer" unique_id=1431581913]
+unique_name_in_owner = true
+custom_minimum_size = Vector2(0, 34)
+layout_mode = 2
+size_flags_horizontal = 3
+theme_override_colors/font_color = Color(1, 1, 1, 0.85)
+theme_override_colors/font_pressed_color = Color(0.08, 0.14, 0.24, 1)
+theme_override_colors/font_hover_color = Color(1, 1, 1, 1)
+theme_override_fonts/font = ExtResource("5_pc087")
+theme_override_font_sizes/font_size = 16
+theme_override_styles/normal = SubResource("StyleBoxEmpty_sy4be")
+theme_override_styles/pressed = SubResource("StyleBoxFlat_0nf8f")
+theme_override_styles/hover = SubResource("StyleBoxFlat_rox41")
+toggle_mode = true
+text = "SERVER"
+
+[node name="DMTabTemplate" type="HBoxContainer" parent="MainMenuPanel/MainMargin/MainHBox/LeftCol/Control/ChatPanel/VBoxContainer/TabsBackground/MarginContainer/ChatTabsContainer" unique_id=123456789]
unique_name_in_owner = true
visible = false
layout_mode = 2
size_flags_horizontal = 3
-[node name="DMTabBtn" type="Button" parent="MainMenuPanel/MainMargin/MainHBox/LeftCol/ChatPanel/VBoxContainer/MarginContainer/ChatTabsContainer/DMTabTemplate" unique_id=123456780]
+[node name="DMTabBtn" type="Button" parent="MainMenuPanel/MainMargin/MainHBox/LeftCol/Control/ChatPanel/VBoxContainer/TabsBackground/MarginContainer/ChatTabsContainer/DMTabTemplate" unique_id=123456780]
+custom_minimum_size = Vector2(0, 34)
layout_mode = 2
size_flags_horizontal = 3
+theme_override_colors/font_color = Color(1, 1, 1, 0.85)
+theme_override_colors/font_pressed_color = Color(0.08, 0.14, 0.24, 1)
+theme_override_colors/font_hover_color = Color(1, 1, 1, 1)
+theme_override_fonts/font = ExtResource("5_pc087")
+theme_override_font_sizes/font_size = 16
+theme_override_styles/normal = SubResource("StyleBoxEmpty_f1hfh")
+theme_override_styles/pressed = SubResource("StyleBoxFlat_6ax38")
+theme_override_styles/hover = SubResource("StyleBoxFlat_pril5")
+toggle_mode = true
text = "FriendName"
-[node name="DMTabCloseBtn" type="Button" parent="MainMenuPanel/MainMargin/MainHBox/LeftCol/ChatPanel/VBoxContainer/MarginContainer/ChatTabsContainer/DMTabTemplate" unique_id=123456781]
+[node name="DMTabCloseBtn" type="Button" parent="MainMenuPanel/MainMargin/MainHBox/LeftCol/Control/ChatPanel/VBoxContainer/TabsBackground/MarginContainer/ChatTabsContainer/DMTabTemplate" unique_id=123456781]
layout_mode = 2
theme_override_colors/font_color = Color(0.8, 0.2, 0.2, 1)
text = " X "
-[node name="GlobalChat" type="MarginContainer" parent="MainMenuPanel/MainMargin/MainHBox/LeftCol/ChatPanel/VBoxContainer" unique_id=945890]
+[node name="MessagePanel" type="PanelContainer" parent="MainMenuPanel/MainMargin/MainHBox/LeftCol/Control/ChatPanel/VBoxContainer" unique_id=495737699]
+layout_mode = 2
+size_flags_vertical = 3
+theme_override_styles/panel = SubResource("StyleBoxFlat_5jb2g")
+
+[node name="GradientOverlay" type="TextureRect" parent="MainMenuPanel/MainMargin/MainHBox/LeftCol/Control/ChatPanel/VBoxContainer/MessagePanel" unique_id=334451362]
+material = SubResource("ShaderMaterial_rievh")
+layout_mode = 2
+mouse_filter = 2
+texture = SubResource("GradientTexture2D_87ggl")
+expand_mode = 1
+
+[node name="GlobalChat" type="MarginContainer" parent="MainMenuPanel/MainMargin/MainHBox/LeftCol/Control/ChatPanel/VBoxContainer/MessagePanel" unique_id=945890]
unique_name_in_owner = true
layout_mode = 2
size_flags_vertical = 3
-theme_override_constants/margin_left = 8
-theme_override_constants/margin_top = 6
-theme_override_constants/margin_right = 8
-theme_override_constants/margin_bottom = 8
+theme_override_constants/margin_left = 18
+theme_override_constants/margin_top = 16
+theme_override_constants/margin_right = 18
+theme_override_constants/margin_bottom = 16
-[node name="RichTextLabel" type="RichTextLabel" parent="MainMenuPanel/MainMargin/MainHBox/LeftCol/ChatPanel/VBoxContainer/GlobalChat" unique_id=1730680016]
+[node name="RichTextLabel" type="RichTextLabel" parent="MainMenuPanel/MainMargin/MainHBox/LeftCol/Control/ChatPanel/VBoxContainer/MessagePanel/GlobalChat" unique_id=1730680016]
unique_name_in_owner = true
layout_mode = 2
theme_override_colors/default_color = Color(1, 1, 1, 1)
+theme_override_fonts/normal_font = ExtResource("14_vwf6o")
+theme_override_fonts/bold_font = ExtResource("14_vwf6o")
+theme_override_font_sizes/normal_font_size = 14
+theme_override_font_sizes/bold_font_size = 15
bbcode_enabled = true
scroll_following = true
-[node name="FriendSuggestPanel" type="PanelContainer" parent="MainMenuPanel/MainMargin/MainHBox/LeftCol/ChatPanel" unique_id=987654321]
+[node name="FriendSuggestPanel" type="PanelContainer" parent="MainMenuPanel/MainMargin/MainHBox/LeftCol/Control/ChatPanel" unique_id=987654321]
unique_name_in_owner = true
visible = false
layout_mode = 2
-[node name="FriendSuggestList" type="ItemList" parent="MainMenuPanel/MainMargin/MainHBox/LeftCol/ChatPanel/FriendSuggestPanel" unique_id=987654320]
+[node name="FriendSuggestList" type="ItemList" parent="MainMenuPanel/MainMargin/MainHBox/LeftCol/Control/ChatPanel/FriendSuggestPanel" unique_id=987654320]
unique_name_in_owner = true
layout_mode = 2
allow_reselect = true
auto_height = true
-[node name="HBoxContainer" type="HBoxContainer" parent="MainMenuPanel/MainMargin/MainHBox/LeftCol" unique_id=459038]
-clip_contents = true
+[node name="TailOverlay" type="Control" parent="MainMenuPanel/MainMargin/MainHBox/LeftCol/Control/ChatPanel" unique_id=1037808647]
layout_mode = 2
+mouse_filter = 2
+
+[node name="ChevIcon" type="TextureRect" parent="MainMenuPanel/MainMargin/MainHBox/LeftCol/Control/ChatPanel/TailOverlay" unique_id=1489474671]
+layout_mode = 1
+anchors_preset = 2
+anchor_top = 1.0
+anchor_bottom = 1.0
+offset_left = 18.0
+offset_top = 5.0
+offset_right = 40.0
+offset_bottom = 17.0
+grow_vertical = 0
+scale = Vector2(0.8, 0.8)
+mouse_filter = 2
+texture = ExtResource("20_rievh")
+expand_mode = 1
+stretch_mode = 5
+
+[node name="HSeparator" type="HSeparator" parent="MainMenuPanel/MainMargin/MainHBox/LeftCol/Control" unique_id=1035778803]
+layout_mode = 0
+offset_top = 205.0
+offset_right = 448.0
+offset_bottom = 217.0
+theme_override_constants/separation = 12
+theme_override_styles/separator = SubResource("StyleBoxEmpty_l7nca")
+
+[node name="HBoxContainer" type="HBoxContainer" parent="MainMenuPanel/MainMargin/MainHBox/LeftCol/Control" unique_id=459038]
+clip_contents = true
+custom_minimum_size = Vector2(400, 0)
+layout_mode = 0
+offset_top = 221.0
+offset_right = 400.0
+offset_bottom = 276.0
+size_flags_horizontal = 0
size_flags_vertical = 8
theme_override_constants/separation = 8
-[node name="QuitBtn2" type="TextureButton" parent="MainMenuPanel/MainMargin/MainHBox/LeftCol/HBoxContainer" unique_id=1520754242]
+[node name="BubbleBtn" type="Button" parent="MainMenuPanel/MainMargin/MainHBox/LeftCol/Control/HBoxContainer" unique_id=850962556]
unique_name_in_owner = true
-custom_minimum_size = Vector2(40, 40)
+custom_minimum_size = Vector2(55, 55)
layout_mode = 2
-theme = ExtResource("2_theme")
-texture_normal = ExtResource("12_dfnwm")
+size_flags_horizontal = 0
+size_flags_vertical = 4
+theme_override_styles/normal = SubResource("StyleBoxFlat_s0n6j")
+theme_override_styles/pressed = SubResource("StyleBoxFlat_87ggl")
+theme_override_styles/hover = SubResource("StyleBoxFlat_agxrn")
+text = ""
-[node name="Control" type="Panel" parent="MainMenuPanel/MainMargin/MainHBox/LeftCol/HBoxContainer" unique_id=59880168]
-custom_minimum_size = Vector2(0, 70)
+[node name="Icon" type="TextureRect" parent="MainMenuPanel/MainMargin/MainHBox/LeftCol/Control/HBoxContainer/BubbleBtn" unique_id=1890525601]
+modulate = Color(0.08, 0.16, 0.32, 1)
+layout_mode = 1
+anchors_preset = 8
+anchor_left = 0.5
+anchor_top = 0.5
+anchor_right = 0.5
+anchor_bottom = 0.5
+offset_left = -13.0
+offset_top = -13.0
+offset_right = 13.0
+offset_bottom = 13.0
+grow_horizontal = 2
+grow_vertical = 2
+mouse_filter = 2
+texture = ExtResource("19_oysm8")
+expand_mode = 1
+stretch_mode = 5
+
+[node name="Panel" type="Panel" parent="MainMenuPanel/MainMargin/MainHBox/LeftCol/Control/HBoxContainer" unique_id=2123634957]
+visible = false
layout_mode = 2
size_flags_horizontal = 3
-theme_override_styles/panel = SubResource("StyleBoxFlat_3jc85")
+theme_override_styles/panel = SubResource("StyleBoxFlat_rievh")
-[node name="HBoxContainer" type="HBoxContainer" parent="MainMenuPanel/MainMargin/MainHBox/LeftCol/HBoxContainer/Control" unique_id=1328089782]
+[node name="HBoxContainer" type="HBoxContainer" parent="MainMenuPanel/MainMargin/MainHBox/LeftCol/Control/HBoxContainer/Panel" unique_id=1015348738]
+layout_mode = 1
+anchors_preset = 15
+anchor_right = 1.0
+anchor_bottom = 1.0
+offset_top = -27.5
+offset_bottom = 27.5
+grow_horizontal = 2
+grow_vertical = 2
+
+[node name="Button" type="Button" parent="MainMenuPanel/MainMargin/MainHBox/LeftCol/Control/HBoxContainer/Panel/HBoxContainer" unique_id=840720163]
+custom_minimum_size = Vector2(55, 55)
+layout_mode = 2
+size_flags_vertical = 4
+theme_override_styles/normal = SubResource("StyleBoxFlat_olier")
+
+[node name="MarginContainer" type="MarginContainer" parent="MainMenuPanel/MainMargin/MainHBox/LeftCol/Control/HBoxContainer/Panel/HBoxContainer/Button" unique_id=1824281772]
layout_mode = 1
anchors_preset = 15
anchor_right = 1.0
anchor_bottom = 1.0
grow_horizontal = 2
grow_vertical = 2
-size_flags_horizontal = 3
+theme_override_constants/margin_left = 8
+theme_override_constants/margin_top = 8
+theme_override_constants/margin_right = 8
+theme_override_constants/margin_bottom = 8
-[node name="QuitBtn" type="TextureButton" parent="MainMenuPanel/MainMargin/MainHBox/LeftCol/HBoxContainer/Control/HBoxContainer" unique_id=738138485]
-unique_name_in_owner = true
+[node name="TextureRect" type="TextureRect" parent="MainMenuPanel/MainMargin/MainHBox/LeftCol/Control/HBoxContainer/Panel/HBoxContainer/Button/MarginContainer" unique_id=523485444]
layout_mode = 2
-texture_normal = ExtResource("13_0jb4q")
+texture = ExtResource("20_4pkyx")
+expand_mode = 1
-[node name="MarginContainer" type="MarginContainer" parent="MainMenuPanel/MainMargin/MainHBox/LeftCol/HBoxContainer/Control/HBoxContainer" unique_id=628941879]
+[node name="MarginContainer" type="MarginContainer" parent="MainMenuPanel/MainMargin/MainHBox/LeftCol/Control/HBoxContainer/Panel/HBoxContainer" unique_id=448545432]
layout_mode = 2
size_flags_horizontal = 3
-theme_override_constants/margin_left = 5
+size_flags_vertical = 4
+theme_override_constants/margin_left = 10
-[node name="ChatInput" type="LineEdit" parent="MainMenuPanel/MainMargin/MainHBox/LeftCol/HBoxContainer/Control/HBoxContainer/MarginContainer" unique_id=1346390421]
-unique_name_in_owner = true
+[node name="ChatInput" type="LineEdit" parent="MainMenuPanel/MainMargin/MainHBox/LeftCol/Control/HBoxContainer/Panel/HBoxContainer/MarginContainer" unique_id=1315081387]
layout_mode = 2
size_flags_horizontal = 3
+size_flags_vertical = 4
theme_override_fonts/font = ExtResource("14_vwf6o")
theme_override_font_sizes/font_size = 16
theme_override_styles/normal = SubResource("StyleBoxFlat_jhtcy")
@@ -609,12 +1466,110 @@ theme_override_styles/read_only = SubResource("StyleBoxEmpty_iulku")
theme_override_styles/focus = SubResource("StyleBoxEmpty_dfnwm")
placeholder_text = " type to chat"
-[node name="SendBtn" type="Button" parent="MainMenuPanel/MainMargin/MainHBox/LeftCol/HBoxContainer/Control/HBoxContainer" unique_id=1491048704]
-unique_name_in_owner = true
+[node name="Button2" type="Button" parent="MainMenuPanel/MainMargin/MainHBox/LeftCol/Control/HBoxContainer/Panel/HBoxContainer" unique_id=1728884896]
+custom_minimum_size = Vector2(64, 55)
layout_mode = 2
+theme_override_styles/normal = SubResource("StyleBoxEmpty_87ggl")
+
+[node name="MarginContainer" type="MarginContainer" parent="MainMenuPanel/MainMargin/MainHBox/LeftCol/Control/HBoxContainer/Panel/HBoxContainer/Button2" unique_id=1324567722]
+layout_mode = 1
+anchors_preset = 8
+anchor_left = 0.5
+anchor_top = 0.5
+anchor_right = 0.5
+anchor_bottom = 0.5
+offset_left = -29.0
+offset_top = -29.0
+offset_right = 29.0
+offset_bottom = 29.0
+grow_horizontal = 2
+grow_vertical = 2
+theme_override_constants/margin_left = 10
+theme_override_constants/margin_top = 10
+theme_override_constants/margin_right = 10
+theme_override_constants/margin_bottom = 10
+
+[node name="TextureRect" type="TextureRect" parent="MainMenuPanel/MainMargin/MainHBox/LeftCol/Control/HBoxContainer/Panel/HBoxContainer/Button2/MarginContainer" unique_id=569120138]
+layout_mode = 2
+texture = ExtResource("15_iwi7x")
+
+[node name="InputBar" type="Panel" parent="MainMenuPanel/MainMargin/MainHBox/LeftCol/Control/HBoxContainer" unique_id=59880168]
+custom_minimum_size = Vector2(0, 55)
+layout_mode = 2
+size_flags_horizontal = 3
+theme_override_styles/panel = SubResource("StyleBoxFlat_l7nca")
+
+[node name="HBoxContainer" type="HBoxContainer" parent="MainMenuPanel/MainMargin/MainHBox/LeftCol/Control/HBoxContainer/InputBar" unique_id=1328089782]
+layout_mode = 1
+anchors_preset = 15
+anchor_right = 1.0
+anchor_bottom = 1.0
+grow_horizontal = 2
+grow_vertical = 2
+size_flags_horizontal = 3
+theme_override_constants/separation = 8
+
+[node name="EmojiBtn" type="Button" parent="MainMenuPanel/MainMargin/MainHBox/LeftCol/Control/HBoxContainer/InputBar/HBoxContainer" unique_id=524485525]
+custom_minimum_size = Vector2(55, 55)
+layout_mode = 2
+theme_override_styles/normal = SubResource("StyleBoxFlat_vfec7")
+theme_override_styles/pressed = SubResource("StyleBoxFlat_sy4be")
+theme_override_styles/hover = SubResource("StyleBoxFlat_f1hfh")
+
+[node name="Icon" type="TextureRect" parent="MainMenuPanel/MainMargin/MainHBox/LeftCol/Control/HBoxContainer/InputBar/HBoxContainer/EmojiBtn" unique_id=363959800]
+layout_mode = 1
+anchors_preset = 8
+anchor_left = 0.5
+anchor_top = 0.5
+anchor_right = 0.5
+anchor_bottom = 0.5
+offset_left = -11.0
+offset_top = -11.0
+offset_right = 11.0
+offset_bottom = 11.0
+grow_horizontal = 2
+grow_vertical = 2
+mouse_filter = 2
+texture = ExtResource("20_4pkyx")
+expand_mode = 1
+stretch_mode = 5
+
+[node name="QuitBtn" type="TextureButton" parent="MainMenuPanel/MainMargin/MainHBox/LeftCol/Control/HBoxContainer/InputBar/HBoxContainer" unique_id=738138485]
+unique_name_in_owner = true
+visible = false
+layout_mode = 2
+texture_normal = ExtResource("13_0jb4q")
+
+[node name="MarginContainer" type="MarginContainer" parent="MainMenuPanel/MainMargin/MainHBox/LeftCol/Control/HBoxContainer/InputBar/HBoxContainer" unique_id=628941879]
+layout_mode = 2
+size_flags_horizontal = 3
+theme_override_constants/margin_left = 5
+
+[node name="ChatInput" type="LineEdit" parent="MainMenuPanel/MainMargin/MainHBox/LeftCol/Control/HBoxContainer/InputBar/HBoxContainer/MarginContainer" unique_id=1346390421]
+unique_name_in_owner = true
+custom_minimum_size = Vector2(0, 38)
+layout_mode = 2
+size_flags_horizontal = 3
+size_flags_vertical = 4
+theme_override_colors/font_color = Color(1, 1, 1, 1)
+theme_override_colors/font_placeholder_color = Color(1, 1, 1, 0.75)
+theme_override_fonts/font = ExtResource("14_vwf6o")
+theme_override_font_sizes/font_size = 14
+theme_override_styles/normal = SubResource("StyleBoxEmpty_0nf8f")
+theme_override_styles/read_only = SubResource("StyleBoxEmpty_iulku")
+theme_override_styles/focus = SubResource("StyleBoxEmpty_rox41")
+placeholder_text = "Send to World..."
+
+[node name="SendBtn" type="Button" parent="MainMenuPanel/MainMargin/MainHBox/LeftCol/Control/HBoxContainer/InputBar/HBoxContainer" unique_id=1491048704]
+unique_name_in_owner = true
+custom_minimum_size = Vector2(44, 44)
+layout_mode = 2
+size_flags_vertical = 4
theme = ExtResource("2_theme")
+theme_override_styles/normal = SubResource("StyleBoxEmpty_6ax38")
+theme_override_styles/pressed = SubResource("StyleBoxFlat_jkoci")
+theme_override_styles/hover = SubResource("StyleBoxFlat_3y5sy")
icon = ExtResource("15_iwi7x")
-flat = true
[node name="CenterCol" type="VBoxContainer" parent="MainMenuPanel/MainMargin/MainHBox" unique_id=7006870]
clip_contents = true
@@ -625,22 +1580,54 @@ size_flags_horizontal = 3
custom_minimum_size = Vector2(280, 0)
layout_mode = 2
-[node name="TopRightPanel" type="HBoxContainer" parent="MainMenuPanel/MainMargin/MainHBox/RightCol" unique_id=20449742]
+[node name="Panel" type="Panel" parent="MainMenuPanel/MainMargin/MainHBox/RightCol" unique_id=76839117]
+clip_contents = true
+custom_minimum_size = Vector2(532, 48)
+layout_mode = 2
+size_flags_horizontal = 3
+theme_override_styles/panel = SubResource("StyleBoxFlat_oysm8")
+
+[node name="GradientPanel" type="TextureRect" parent="MainMenuPanel/MainMargin/MainHBox/RightCol/Panel" unique_id=966402216]
+material = SubResource("ShaderMaterial_ixomp")
+custom_minimum_size = Vector2(0, 48)
+layout_mode = 1
+anchors_preset = 10
+anchor_right = 1.0
+offset_bottom = 64.0
+grow_horizontal = 2
+scale = Vector2(1, 0.75)
+texture = SubResource("GradientTexture2D_rievh")
+
+[node name="MarginContainer" type="MarginContainer" parent="MainMenuPanel/MainMargin/MainHBox/RightCol/Panel" unique_id=1907187664]
+custom_minimum_size = Vector2(532, 0)
+layout_mode = 1
+anchors_preset = 15
+anchor_right = 1.0
+anchor_bottom = 1.0
+grow_horizontal = 2
+grow_vertical = 2
+theme_override_constants/margin_left = 16
+theme_override_constants/margin_top = 8
+theme_override_constants/margin_right = 16
+theme_override_constants/margin_bottom = 8
+
+[node name="TopRightPanel" type="HBoxContainer" parent="MainMenuPanel/MainMargin/MainHBox/RightCol/Panel/MarginContainer" unique_id=20449742]
custom_minimum_size = Vector2(500, 0)
layout_mode = 2
theme = ExtResource("2_theme")
-theme_override_constants/separation = 12
+theme_override_constants/separation = 40
alignment = 2
-[node name="ProfileBtn" type="Button" parent="MainMenuPanel/MainMargin/MainHBox/RightCol/TopRightPanel" unique_id=752873406]
+[node name="ProfileBtn" type="Button" parent="MainMenuPanel/MainMargin/MainHBox/RightCol/Panel/MarginContainer/TopRightPanel" unique_id=752873406]
unique_name_in_owner = true
-custom_minimum_size = Vector2(61, 61)
+visible = false
+custom_minimum_size = Vector2(32, 32)
layout_mode = 2
theme_override_fonts/font = ExtResource("5_pc087")
flat = true
-[node name="TextureRect" type="TextureRect" parent="MainMenuPanel/MainMargin/MainHBox/RightCol/TopRightPanel/ProfileBtn" unique_id=1690437163]
-custom_minimum_size = Vector2(32, 32)
+[node name="TextureRect" type="TextureRect" parent="MainMenuPanel/MainMargin/MainHBox/RightCol/Panel/MarginContainer/TopRightPanel/ProfileBtn" unique_id=1690437163]
+custom_minimum_size = Vector2(16, 16)
layout_mode = 1
anchors_preset = 15
anchor_right = 1.0
@@ -650,81 +1637,124 @@ grow_vertical = 2
texture = ExtResource("18_u7tfn")
expand_mode = 2
-[node name="LeaderboardBtn" type="Button" parent="MainMenuPanel/MainMargin/MainHBox/RightCol/TopRightPanel" unique_id=312524216]
+[node name="HelpBtn" type="Button" parent="MainMenuPanel/MainMargin/MainHBox/RightCol/Panel/MarginContainer/TopRightPanel" unique_id=925822252]
+custom_minimum_size = Vector2(16, 16)
+layout_mode = 2
+size_flags_horizontal = 4
+theme_override_fonts/font = ExtResource("5_pc087")
+flat = true
+
+[node name="TextureRect" type="TextureRect" parent="MainMenuPanel/MainMargin/MainHBox/RightCol/Panel/MarginContainer/TopRightPanel/HelpBtn" unique_id=155484110]
+custom_minimum_size = Vector2(16, 16)
+layout_mode = 1
+anchors_preset = 1
+anchor_left = 1.0
+anchor_right = 1.0
+offset_left = -16.0
+offset_bottom = 16.0
+grow_horizontal = 0
+texture = ExtResource("24_ph747")
+expand_mode = 1
+
+[node name="CartBtn" type="Button" parent="MainMenuPanel/MainMargin/MainHBox/RightCol/Panel/MarginContainer/TopRightPanel" unique_id=456149005]
unique_name_in_owner = true
-custom_minimum_size = Vector2(61, 61)
+custom_minimum_size = Vector2(32, 32)
layout_mode = 2
theme_override_fonts/font = ExtResource("5_pc087")
flat = true
-[node name="TextureRect" type="TextureRect" parent="MainMenuPanel/MainMargin/MainHBox/RightCol/TopRightPanel/LeaderboardBtn" unique_id=1226601226]
-custom_minimum_size = Vector2(32, 32)
+[node name="TextureRect" type="TextureRect" parent="MainMenuPanel/MainMargin/MainHBox/RightCol/Panel/MarginContainer/TopRightPanel/CartBtn" unique_id=1719165221]
+custom_minimum_size = Vector2(16, 16)
layout_mode = 1
anchors_preset = 15
anchor_right = 1.0
anchor_bottom = 1.0
grow_horizontal = 2
grow_vertical = 2
-texture = ExtResource("19_2630d")
+texture = ExtResource("25_ixomp")
expand_mode = 2
-[node name="CartBtn" type="Button" parent="MainMenuPanel/MainMargin/MainHBox/RightCol/TopRightPanel" unique_id=456149005]
+[node name="TicketBtn" type="Button" parent="MainMenuPanel/MainMargin/MainHBox/RightCol/Panel/MarginContainer/TopRightPanel" unique_id=64042310]
unique_name_in_owner = true
-custom_minimum_size = Vector2(61, 61)
+custom_minimum_size = Vector2(28, 32)
layout_mode = 2
theme_override_fonts/font = ExtResource("5_pc087")
flat = true
-[node name="TextureRect" type="TextureRect" parent="MainMenuPanel/MainMargin/MainHBox/RightCol/TopRightPanel/CartBtn" unique_id=1719165221]
-custom_minimum_size = Vector2(32, 32)
+[node name="TextureRect" type="TextureRect" parent="MainMenuPanel/MainMargin/MainHBox/RightCol/Panel/MarginContainer/TopRightPanel/TicketBtn" unique_id=109558990]
+custom_minimum_size = Vector2(16, 16)
layout_mode = 1
anchors_preset = 15
anchor_right = 1.0
anchor_bottom = 1.0
grow_horizontal = 2
grow_vertical = 2
-texture = ExtResource("20_835bk")
-expand_mode = 2
+texture = ExtResource("26_8kv63")
+expand_mode = 1
-[node name="TicketBtn" type="Button" parent="MainMenuPanel/MainMargin/MainHBox/RightCol/TopRightPanel" unique_id=64042310]
+[node name="LeaderboardBtn" type="Button" parent="MainMenuPanel/MainMargin/MainHBox/RightCol/Panel/MarginContainer/TopRightPanel" unique_id=312524216]
unique_name_in_owner = true
-custom_minimum_size = Vector2(61, 61)
+custom_minimum_size = Vector2(40, 32)
layout_mode = 2
theme_override_fonts/font = ExtResource("5_pc087")
flat = true
-[node name="TextureRect" type="TextureRect" parent="MainMenuPanel/MainMargin/MainHBox/RightCol/TopRightPanel/TicketBtn" unique_id=109558990]
-custom_minimum_size = Vector2(32, 32)
+[node name="TextureRect" type="TextureRect" parent="MainMenuPanel/MainMargin/MainHBox/RightCol/Panel/MarginContainer/TopRightPanel/LeaderboardBtn" unique_id=1226601226]
+custom_minimum_size = Vector2(16, 16)
layout_mode = 1
anchors_preset = 15
anchor_right = 1.0
anchor_bottom = 1.0
grow_horizontal = 2
grow_vertical = 2
-texture = ExtResource("21_ucbax")
-expand_mode = 2
+texture = ExtResource("27_y8bta")
+expand_mode = 1
-[node name="MailboxBtn" type="Button" parent="MainMenuPanel/MainMargin/MainHBox/RightCol/TopRightPanel" unique_id=64042311]
+[node name="SocialBtn" type="Button" parent="MainMenuPanel/MainMargin/MainHBox/RightCol/Panel/MarginContainer/TopRightPanel" unique_id=82719328]
unique_name_in_owner = true
-custom_minimum_size = Vector2(61, 61)
+custom_minimum_size = Vector2(40, 32)
+layout_mode = 2
+theme_override_fonts/font = ExtResource("5_pc087")
+flat = true
+
+[node name="TextureRect" type="TextureRect" parent="MainMenuPanel/MainMargin/MainHBox/RightCol/Panel/MarginContainer/TopRightPanel/SocialBtn" unique_id=134959792]
+custom_minimum_size = Vector2(16, 16)
+layout_mode = 1
+anchors_preset = 15
+anchor_right = 1.0
+anchor_bottom = 1.0
+grow_horizontal = 2
+grow_vertical = 2
+texture = ExtResource("28_st18m")
+expand_mode = 1
+
+[node name="MailboxBtn" type="Button" parent="MainMenuPanel/MainMargin/MainHBox/RightCol/Panel/MarginContainer/TopRightPanel" unique_id=64042311]
+unique_name_in_owner = true
+custom_minimum_size = Vector2(32, 32)
layout_mode = 2
theme_override_fonts/font = ExtResource("5_pc087")
theme_override_styles/normal = SubResource("StyleBoxEmpty_835bk")
theme_override_styles/pressed = SubResource("StyleBoxEmpty_ucbax")
theme_override_styles/hover = SubResource("StyleBoxEmpty_1x1aw")
-[node name="TextureRect" type="TextureRect" parent="MainMenuPanel/MainMargin/MainHBox/RightCol/TopRightPanel/MailboxBtn" unique_id=109558991]
-custom_minimum_size = Vector2(32, 32)
+[node name="TextureRect" type="TextureRect" parent="MainMenuPanel/MainMargin/MainHBox/RightCol/Panel/MarginContainer/TopRightPanel/MailboxBtn" unique_id=109558991]
+custom_minimum_size = Vector2(16, 16)
layout_mode = 1
-anchors_preset = 15
-anchor_right = 1.0
-anchor_bottom = 1.0
+anchors_preset = 8
+anchor_left = 0.5
+anchor_top = 0.5
+anchor_right = 0.5
+anchor_bottom = 0.5
+offset_left = -19.5
+offset_top = -12.0
+offset_right = 20.5
+offset_bottom = 13.0
grow_horizontal = 2
grow_vertical = 2
-texture = ExtResource("23_835bk")
+texture = ExtResource("29_6yc8v")
expand_mode = 3
-[node name="MailBadge" type="Label" parent="MainMenuPanel/MainMargin/MainHBox/RightCol/TopRightPanel/MailboxBtn" unique_id=156491696]
+[node name="MailBadge" type="Label" parent="MainMenuPanel/MainMargin/MainHBox/RightCol/Panel/MarginContainer/TopRightPanel/MailboxBtn" unique_id=156491696]
unique_name_in_owner = true
visible = false
layout_mode = 1
@@ -741,47 +1771,31 @@ theme_override_font_sizes/font_size = 10
horizontal_alignment = 1
vertical_alignment = 1
-[node name="SocialBtn" type="Button" parent="MainMenuPanel/MainMargin/MainHBox/RightCol/TopRightPanel" unique_id=82719328]
+[node name="SettingsBtn" type="Button" parent="MainMenuPanel/MainMargin/MainHBox/RightCol/Panel/MarginContainer/TopRightPanel" unique_id=90]
unique_name_in_owner = true
-custom_minimum_size = Vector2(61, 61)
+custom_minimum_size = Vector2(32, 32)
layout_mode = 2
theme_override_fonts/font = ExtResource("5_pc087")
flat = true
-[node name="TextureRect" type="TextureRect" parent="MainMenuPanel/MainMargin/MainHBox/RightCol/TopRightPanel/SocialBtn" unique_id=134959792]
-custom_minimum_size = Vector2(32, 32)
+[node name="TextureRect" type="TextureRect" parent="MainMenuPanel/MainMargin/MainHBox/RightCol/Panel/MarginContainer/TopRightPanel/SettingsBtn" unique_id=629469797]
+custom_minimum_size = Vector2(16, 16)
layout_mode = 1
anchors_preset = 15
anchor_right = 1.0
anchor_bottom = 1.0
grow_horizontal = 2
grow_vertical = 2
-texture = ExtResource("22_1x1aw")
-expand_mode = 2
+texture = ExtResource("30_yb58j")
+expand_mode = 1
-[node name="SettingsBtn" type="Button" parent="MainMenuPanel/MainMargin/MainHBox/RightCol/TopRightPanel" unique_id=90]
-unique_name_in_owner = true
-custom_minimum_size = Vector2(61, 61)
+[node name="Events" parent="MainMenuPanel/MainMargin/MainHBox/RightCol" unique_id=43997484 instance=ExtResource("32_8kv63")]
+custom_minimum_size = Vector2(276, 141)
layout_mode = 2
-theme_override_fonts/font = ExtResource("5_pc087")
-flat = true
-
-[node name="TextureRect" type="TextureRect" parent="MainMenuPanel/MainMargin/MainHBox/RightCol/TopRightPanel/SettingsBtn" unique_id=629469797]
-custom_minimum_size = Vector2(32, 32)
-layout_mode = 1
-anchors_preset = 15
-anchor_right = 1.0
-anchor_bottom = 1.0
-grow_horizontal = 2
-grow_vertical = 2
-texture = ExtResource("23_twy5w")
-expand_mode = 2
-
-[node name="Spacer1" type="Control" parent="MainMenuPanel/MainMargin/MainHBox/RightCol" unique_id=9023]
-layout_mode = 2
-size_flags_vertical = 3
+size_flags_vertical = 1
[node name="Banners" type="VBoxContainer" parent="MainMenuPanel/MainMargin/MainHBox/RightCol" unique_id=1356766829]
+visible = false
layout_mode = 2
theme_override_constants/separation = 16
alignment = 2
@@ -828,30 +1842,123 @@ theme_override_font_sizes/font_size = 30
disabled = true
text = "Banner Slot"
-[node name="HBoxContainer3" type="HBoxContainer" parent="MainMenuPanel/MainMargin/MainHBox/RightCol/Banners" unique_id=1502007727]
+[node name="VBoxContainer" type="VBoxContainer" parent="MainMenuPanel/MainMargin/MainHBox/RightCol" unique_id=496474529]
+custom_minimum_size = Vector2(250, 0)
layout_mode = 2
-alignment = 2
+size_flags_horizontal = 8
+size_flags_vertical = 3
-[node name="Control" type="Control" parent="MainMenuPanel/MainMargin/MainHBox/RightCol/Banners/HBoxContainer3" unique_id=249145750]
-clip_contents = true
-custom_minimum_size = Vector2(350, 0)
-layout_direction = 3
+[node name="HBoxContainer" type="HBoxContainer" parent="MainMenuPanel/MainMargin/MainHBox/RightCol/VBoxContainer" unique_id=1789411264]
layout_mode = 2
-[node name="Banner3" type="Button" parent="MainMenuPanel/MainMargin/MainHBox/RightCol/Banners/HBoxContainer3" unique_id=945]
-unique_name_in_owner = true
-custom_minimum_size = Vector2(0, 120)
+[node name="Label" type="Label" parent="MainMenuPanel/MainMargin/MainHBox/RightCol/VBoxContainer/HBoxContainer" unique_id=1371230077]
+layout_mode = 2
+theme_override_fonts/font = ExtResource("38_87ggl")
+theme_override_font_sizes/font_size = 20
+text = "QUEST LIST"
+
+[node name="VSeparator" type="VSeparator" parent="MainMenuPanel/MainMargin/MainHBox/RightCol/VBoxContainer/HBoxContainer" unique_id=2072828325]
layout_mode = 2
size_flags_horizontal = 3
-theme = ExtResource("14_2630d")
-theme_override_fonts/font = ExtResource("5_pc087")
-theme_override_font_sizes/font_size = 30
-disabled = true
-text = "Banner Slot"
+theme_override_styles/separator = SubResource("StyleBoxEmpty_pril5")
+
+[node name="TextureRect" type="TextureRect" parent="MainMenuPanel/MainMargin/MainHBox/RightCol/VBoxContainer/HBoxContainer" unique_id=2106503240]
+custom_minimum_size = Vector2(16, 0)
+layout_mode = 2
+texture = ExtResource("39_agxrn")
+expand_mode = 1
+stretch_mode = 4
+
+[node name="HSeparator2" type="HSeparator" parent="MainMenuPanel/MainMargin/MainHBox/RightCol/VBoxContainer" unique_id=2069465384]
+layout_mode = 2
+theme_override_constants/separation = 4
+theme_override_styles/separator = SubResource("StyleBoxFlat_wqxeh")
+
+[node name="HSeparator" type="HSeparator" parent="MainMenuPanel/MainMargin/MainHBox/RightCol/VBoxContainer" unique_id=1831625398]
+layout_mode = 2
+theme_override_styles/separator = SubResource("StyleBoxEmpty_do6di")
+
+[node name="QuestListTab" type="Panel" parent="MainMenuPanel/MainMargin/MainHBox/RightCol/VBoxContainer" unique_id=731395093]
+custom_minimum_size = Vector2(0, 38)
+layout_mode = 2
+theme_override_styles/panel = SubResource("StyleBoxFlat_do6di")
+script = ExtResource("40_agxrn")
+
+[node name="MarginContainer" type="MarginContainer" parent="MainMenuPanel/MainMargin/MainHBox/RightCol/VBoxContainer/QuestListTab" unique_id=1241608073]
+layout_mode = 1
+anchors_preset = 15
+anchor_right = 1.0
+anchor_bottom = 1.0
+grow_horizontal = 2
+grow_vertical = 2
+theme_override_constants/margin_left = 6
+theme_override_constants/margin_top = 6
+theme_override_constants/margin_right = 6
+theme_override_constants/margin_bottom = 6
+
+[node name="HBoxContainer" type="HBoxContainer" parent="MainMenuPanel/MainMargin/MainHBox/RightCol/VBoxContainer/QuestListTab/MarginContainer" unique_id=1931628729]
+layout_mode = 2
+theme_override_constants/separation = 0
+
+[node name="DailyTabBtn" type="Button" parent="MainMenuPanel/MainMargin/MainHBox/RightCol/VBoxContainer/QuestListTab/MarginContainer/HBoxContainer" unique_id=1009068559]
+unique_name_in_owner = true
+custom_minimum_size = Vector2(68, 28)
+layout_mode = 2
+size_flags_horizontal = 3
+theme_override_colors/font_color = Color(1, 1, 1, 0.9)
+theme_override_colors/font_pressed_color = Color(0.06666667, 0.13333334, 0.1882353, 1)
+theme_override_colors/font_hover_color = Color(1, 1, 1, 1)
+theme_override_fonts/font = ExtResource("38_87ggl")
+theme_override_styles/normal = SubResource("StyleBoxEmpty_jkoci")
+theme_override_styles/pressed = SubResource("StyleBoxFlat_os6ns")
+theme_override_styles/hover = SubResource("StyleBoxFlat_b6wif")
+toggle_mode = true
+button_pressed = true
+text = "DAILY"
+
+[node name="VSeparator2" type="VSeparator" parent="MainMenuPanel/MainMargin/MainHBox/RightCol/VBoxContainer/QuestListTab/MarginContainer/HBoxContainer" unique_id=1786352918]
+layout_mode = 2
+size_flags_horizontal = 3
+theme_override_styles/separator = SubResource("StyleBoxEmpty_uovpt")
+
+[node name="WeeklyTabBtn" type="Button" parent="MainMenuPanel/MainMargin/MainHBox/RightCol/VBoxContainer/QuestListTab/MarginContainer/HBoxContainer" unique_id=1907844738]
+unique_name_in_owner = true
+custom_minimum_size = Vector2(0, 26)
+layout_mode = 2
+size_flags_horizontal = 3
+theme_override_colors/font_color = Color(1, 1, 1, 0.9)
+theme_override_colors/font_pressed_color = Color(0.06666667, 0.13333334, 0.1882353, 1)
+theme_override_colors/font_hover_color = Color(1, 1, 1, 1)
+theme_override_fonts/font = ExtResource("38_87ggl")
+theme_override_styles/normal = SubResource("StyleBoxEmpty_3y5sy")
+theme_override_styles/pressed = SubResource("StyleBoxFlat_os6ns")
+theme_override_styles/hover = SubResource("StyleBoxFlat_b6wif")
+toggle_mode = true
+text = "WEEKLY"
+
+[node name="VSeparator" type="VSeparator" parent="MainMenuPanel/MainMargin/MainHBox/RightCol/VBoxContainer/QuestListTab/MarginContainer/HBoxContainer" unique_id=1382495761]
+layout_mode = 2
+size_flags_horizontal = 3
+theme_override_styles/separator = SubResource("StyleBoxEmpty_uovpt")
+
+[node name="MonthlyTabBtn" type="Button" parent="MainMenuPanel/MainMargin/MainHBox/RightCol/VBoxContainer/QuestListTab/MarginContainer/HBoxContainer" unique_id=1294883329]
+unique_name_in_owner = true
+custom_minimum_size = Vector2(0, 26)
+layout_mode = 2
+size_flags_horizontal = 3
+theme_override_colors/font_color = Color(1, 1, 1, 0.9)
+theme_override_colors/font_pressed_color = Color(0.06666667, 0.13333334, 0.1882353, 1)
+theme_override_colors/font_hover_color = Color(1, 1, 1, 1)
+theme_override_fonts/font = ExtResource("38_87ggl")
+theme_override_styles/normal = SubResource("StyleBoxEmpty_fwqx0")
+theme_override_styles/pressed = SubResource("StyleBoxFlat_8onxx")
+theme_override_styles/hover = SubResource("StyleBoxFlat_15eno")
+toggle_mode = true
+text = "MONTHLY"
[node name="Spacer2" type="Control" parent="MainMenuPanel/MainMargin/MainHBox/RightCol" unique_id=324]
+custom_minimum_size = Vector2(0, 92)
layout_mode = 2
-size_flags_vertical = 3
[node name="BottomRightPanel" type="HBoxContainer" parent="MainMenuPanel/MainMargin/MainHBox/RightCol" unique_id=987]
layout_mode = 2
@@ -869,10 +1976,68 @@ theme_override_fonts/font = ExtResource("5_pc087")
theme_override_font_sizes/font_size = 18
text = "TUTORIAL"
-[node name="BrowseRoomsBtn" type="TextureButton" parent="MainMenuPanel/MainMargin/MainHBox/RightCol/BottomRightPanel" unique_id=1204550484]
+[node name="RoomBtnRoot" type="Control" parent="MainMenuPanel/MainMargin/MainHBox/RightCol/BottomRightPanel" unique_id=1998141679]
+custom_minimum_size = Vector2(195, 77)
+layout_mode = 2
+size_flags_horizontal = 10
+size_flags_vertical = 8
+
+[node name="PanelContainer" type="PanelContainer" parent="MainMenuPanel/MainMargin/MainHBox/RightCol/BottomRightPanel/RoomBtnRoot" unique_id=2047958981]
+layout_mode = 1
+anchors_preset = 1
+anchor_left = 1.0
+anchor_right = 1.0
+offset_left = -160.0
+offset_top = -65.0
+offset_bottom = 36.0
+grow_horizontal = 0
+theme_override_styles/panel = SubResource("StyleBoxEmpty_4pkyx")
+
+[node name="Panel2" type="Panel" parent="MainMenuPanel/MainMargin/MainHBox/RightCol/BottomRightPanel/RoomBtnRoot/PanelContainer" unique_id=1384210399]
+layout_mode = 2
+theme_override_styles/panel = SubResource("StyleBoxEmpty_rievh")
+
+[node name="CardLeft" type="TextureRect" parent="MainMenuPanel/MainMargin/MainHBox/RightCol/BottomRightPanel/RoomBtnRoot/PanelContainer/Panel2" unique_id=975861905]
+custom_minimum_size = Vector2(85, 85)
+layout_mode = 0
+offset_left = -2.0
+offset_top = 20.0
+offset_right = 83.0
+offset_bottom = 105.0
+rotation = -0.35081118
+pivot_offset = Vector2(28, 28)
+size_flags_horizontal = 0
+size_flags_vertical = 8
+mouse_filter = 2
+texture = ExtResource("33_yb58j")
+expand_mode = 1
+stretch_mode = 5
+
+[node name="Panel" type="Panel" parent="MainMenuPanel/MainMargin/MainHBox/RightCol/BottomRightPanel/RoomBtnRoot/PanelContainer" unique_id=155993237]
+layout_mode = 2
+theme_override_styles/panel = SubResource("StyleBoxEmpty_olier")
+
+[node name="CardRight" type="TextureRect" parent="MainMenuPanel/MainMargin/MainHBox/RightCol/BottomRightPanel/RoomBtnRoot/PanelContainer/Panel" unique_id=817735936]
+layout_mode = 0
+offset_left = 77.0
+offset_top = -1.0
+offset_right = 167.0
+offset_bottom = 89.0
+rotation = 0.34906584
+pivot_offset = Vector2(28, 28)
+size_flags_horizontal = 8
+size_flags_vertical = 8
+mouse_filter = 2
+texture = ExtResource("34_oysm8")
+expand_mode = 1
+stretch_mode = 5
+
+[node name="BrowseRoomsBtn" type="TextureButton" parent="MainMenuPanel/MainMargin/MainHBox/RightCol/BottomRightPanel/RoomBtnRoot" unique_id=1204550484]
unique_name_in_owner = true
custom_minimum_size = Vector2(0, 50)
-layout_mode = 2
+layout_mode = 0
+offset_right = 195.0
+offset_bottom = 77.0
size_flags_horizontal = 10
size_flags_vertical = 8
theme = ExtResource("2_theme")
@@ -880,10 +2045,66 @@ texture_normal = ExtResource("17_wjff0")
texture_pressed = ExtResource("18_0jb4q")
texture_hover = ExtResource("18_0jb4q")
-[node name="CreateRoomBtn" type="TextureButton" parent="MainMenuPanel/MainMargin/MainHBox/RightCol/BottomRightPanel" unique_id=1662316269]
+[node name="PlayBtnRoot" type="Control" parent="MainMenuPanel/MainMargin/MainHBox/RightCol/BottomRightPanel" unique_id=521048431]
+custom_minimum_size = Vector2(284, 107)
+layout_mode = 2
+size_flags_horizontal = 3
+
+[node name="PanelContainer" type="PanelContainer" parent="MainMenuPanel/MainMargin/MainHBox/RightCol/BottomRightPanel/PlayBtnRoot" unique_id=1177755408]
+layout_mode = 1
+anchors_preset = 1
+anchor_left = 1.0
+anchor_right = 1.0
+offset_left = -222.0
+offset_top = -110.0
+offset_bottom = 9.0
+grow_horizontal = 0
+theme_override_styles/panel = SubResource("StyleBoxEmpty_oysm8")
+
+[node name="Panel" type="Panel" parent="MainMenuPanel/MainMargin/MainHBox/RightCol/BottomRightPanel/PlayBtnRoot/PanelContainer" unique_id=1036605899]
+layout_mode = 2
+theme_override_styles/panel = SubResource("StyleBoxEmpty_5jb2g")
+
+[node name="CardRight" type="TextureRect" parent="MainMenuPanel/MainMargin/MainHBox/RightCol/BottomRightPanel/PlayBtnRoot/PanelContainer/Panel" unique_id=1142287670]
+layout_mode = 0
+offset_left = 115.0
+offset_top = 26.0
+offset_right = 215.0
+offset_bottom = 126.0
+rotation = 0.24958208
+pivot_offset = Vector2(28, 28)
+size_flags_horizontal = 8
+size_flags_vertical = 8
+mouse_filter = 2
+texture = ExtResource("38_rievh")
+expand_mode = 1
+stretch_mode = 5
+
+[node name="Panel2" type="Panel" parent="MainMenuPanel/MainMargin/MainHBox/RightCol/BottomRightPanel/PlayBtnRoot/PanelContainer" unique_id=379136491]
+layout_mode = 2
+theme_override_styles/panel = SubResource("StyleBoxEmpty_s0n6j")
+
+[node name="CardLeft" type="TextureRect" parent="MainMenuPanel/MainMargin/MainHBox/RightCol/BottomRightPanel/PlayBtnRoot/PanelContainer/Panel2" unique_id=614956734]
+layout_mode = 0
+offset_left = 17.0
+offset_top = 58.0
+offset_right = 112.0
+offset_bottom = 153.0
+rotation = -0.34382987
+pivot_offset = Vector2(28, 28)
+size_flags_horizontal = 0
+size_flags_vertical = 8
+mouse_filter = 2
+texture = ExtResource("37_4pkyx")
+expand_mode = 1
+stretch_mode = 5
+
+[node name="CreateRoomBtn" type="TextureButton" parent="MainMenuPanel/MainMargin/MainHBox/RightCol/BottomRightPanel/PlayBtnRoot" unique_id=1662316269]
unique_name_in_owner = true
custom_minimum_size = Vector2(0, 50)
-layout_mode = 2
+layout_mode = 0
+offset_right = 284.0
+offset_bottom = 107.0
size_flags_horizontal = 3
theme = ExtResource("2_theme")
texture_normal = ExtResource("18_h1rib")
diff --git a/scenes/lobby_sliders.gd b/scenes/lobby_sliders.gd
new file mode 100644
index 0000000..fb34b25
--- /dev/null
+++ b/scenes/lobby_sliders.gd
@@ -0,0 +1,142 @@
+extends ScrollContainer
+
+const SNAP_DURATION := 0.25
+const TEX_DEFAULT := preload("res://assets/graphics/gui/lobby/bar_default.svg")
+const TEX_ACTIVE := preload("res://assets/graphics/gui/lobby/bar_active.svg")
+
+@export var auto_advance_enabled: bool = true
+@export var auto_advance_delay: float = 4.0
+
+@onready var _track: HBoxContainer = $CardMargin/HBoxContainer
+@onready var _page_dots: Array = get_node_or_null("../PageIndicator").get_children() if get_node_or_null("../PageIndicator") else []
+
+var _dragging := false
+var _drag_start_pos := 0.0
+var _drag_start_scroll := 0
+var _snap_tween: Tween
+var _auto_timer: Timer
+
+
+func _ready() -> void:
+ _update_indicator()
+ _setup_auto_timer()
+
+
+func _setup_auto_timer() -> void:
+ _auto_timer = Timer.new()
+ _auto_timer.name = "AutoAdvanceTimer"
+ _auto_timer.one_shot = true
+ _auto_timer.timeout.connect(_on_auto_timer_timeout)
+ add_child(_auto_timer)
+ _restart_auto_timer()
+
+
+func _restart_auto_timer() -> void:
+ if not auto_advance_enabled or _dragging or _card_count() <= 1:
+ return
+ _auto_timer.stop()
+ _auto_timer.wait_time = auto_advance_delay
+ _auto_timer.start()
+
+
+func _on_auto_timer_timeout() -> void:
+ if _dragging:
+ return
+ var next_index := (_current_page() + 1) % _card_count()
+ _animate_to_page(next_index)
+
+
+func _exit_tree() -> void:
+ if _auto_timer:
+ _auto_timer.stop()
+ if _snap_tween:
+ _snap_tween.kill()
+
+
+func _gui_input(event: InputEvent) -> void:
+ if event is InputEventMouseButton and event.button_index == MOUSE_BUTTON_LEFT:
+ if event.pressed:
+ _start_drag(event.position.x)
+ elif _dragging:
+ _end_drag()
+ elif event is InputEventMouseMotion and _dragging:
+ _update_drag(event.position.x)
+ elif event is InputEventScreenTouch and event.index == 0:
+ if event.pressed:
+ _start_drag(event.position.x)
+ elif _dragging:
+ _end_drag()
+ elif event is InputEventScreenDrag and event.index == 0 and _dragging:
+ _update_drag(event.position.x)
+
+
+func _start_drag(x: float) -> void:
+ if _snap_tween:
+ _snap_tween.kill()
+ _auto_timer.stop()
+ _dragging = true
+ _drag_start_pos = x
+ _drag_start_scroll = scroll_horizontal
+
+
+func _update_drag(x: float) -> void:
+ var delta := _drag_start_pos - x
+ scroll_horizontal = clampi(_drag_start_scroll + int(delta), 0, _max_scroll())
+ _update_indicator()
+
+
+func _end_drag() -> void:
+ _dragging = false
+ _snap_to_nearest_card()
+
+
+func _max_scroll() -> int:
+ var bar := get_h_scroll_bar()
+ return maxi(0, int(bar.max_value - bar.page))
+
+
+func _card_count() -> int:
+ return maxi(1, _track.get_child_count())
+
+
+func _card_step() -> float:
+ var count := _card_count()
+ if count <= 1:
+ return 0.0
+ return float(_max_scroll()) / float(count - 1)
+
+
+func _current_page() -> int:
+ var step := _card_step()
+ if step <= 0.0:
+ return 0
+ return clampi(roundi(scroll_horizontal / step), 0, _card_count() - 1)
+
+
+func _snap_to_nearest_card() -> void:
+ _animate_to_page(_current_page())
+
+
+func _animate_to_page(target_index: int) -> void:
+ target_index = clampi(target_index, 0, _card_count() - 1)
+ var step := _card_step()
+ var target_scroll := int(round(target_index * step))
+ if _snap_tween:
+ _snap_tween.kill()
+ _snap_tween = create_tween().set_trans(Tween.TRANS_CUBIC).set_ease(Tween.EASE_OUT)
+ _snap_tween.tween_method(_set_scroll_and_indicator, float(scroll_horizontal), float(target_scroll), SNAP_DURATION)
+ _snap_tween.finished.connect(_restart_auto_timer)
+
+
+func _set_scroll_and_indicator(value: float) -> void:
+ scroll_horizontal = int(round(value))
+ _update_indicator()
+
+
+func _update_indicator() -> void:
+ if _page_dots.is_empty():
+ return
+ var active_index := _current_page()
+ for i in _page_dots.size():
+ var dot: TextureRect = _page_dots[i]
+ dot.texture = TEX_ACTIVE if i == active_index else TEX_DEFAULT
diff --git a/scenes/lobby_sliders.gd.uid b/scenes/lobby_sliders.gd.uid
new file mode 100644
index 0000000..e23880f
--- /dev/null
+++ b/scenes/lobby_sliders.gd.uid
@@ -0,0 +1 @@
+uid://bnxbmxuwjwqua
diff --git a/scenes/lobby_sliders.tscn b/scenes/lobby_sliders.tscn
new file mode 100644
index 0000000..6d9fdbc
--- /dev/null
+++ b/scenes/lobby_sliders.tscn
@@ -0,0 +1,198 @@
+[gd_scene format=3 uid="uid://c3v78hufajngu"]
+
+[ext_resource type="Texture2D" uid="uid://bhv35y3q1jxr0" path="res://assets/graphics/gui/lobby/card_xmple.png" id="1_3k5w5"]
+[ext_resource type="Script" uid="uid://bnxbmxuwjwqua" path="res://scenes/lobby_sliders.gd" id="1_l3iok"]
+[ext_resource type="FontFile" uid="uid://dsqg0x5lnosou" path="res://assets/fonts/TektonDash2.ttf" id="2_l3iok"]
+[ext_resource type="Texture2D" uid="uid://y0y2fqa6xml7" path="res://assets/graphics/gui/lobby/bar_default.svg" id="3_i4gg1"]
+[ext_resource type="Texture2D" uid="uid://b5qt2u2k23b5w" path="res://assets/graphics/gui/lobby/bar_active.svg" id="4_crv6i"]
+
+[sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_st18m"]
+
+[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_t5gla"]
+border_width_left = 3
+border_width_top = 3
+border_width_right = 3
+border_width_bottom = 3
+border_color = Color(0.06666667, 0.13333334, 0.1882353, 1)
+corner_radius_top_left = 23
+corner_radius_top_right = 23
+corner_radius_bottom_right = 23
+corner_radius_bottom_left = 23
+
+[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_a37jl"]
+bg_color = Color(1, 0.25882354, 0.25882354, 1)
+border_width_left = 3
+border_width_top = 3
+border_width_right = 3
+border_width_bottom = 3
+border_color = Color(0.06666667, 0.13333334, 0.1882353, 1)
+corner_radius_top_left = 8
+corner_radius_top_right = 8
+corner_radius_bottom_right = 8
+corner_radius_bottom_left = 8
+
+[node name="Sliders" type="Panel" unique_id=43997484]
+custom_minimum_size = Vector2(276, 0)
+offset_right = 276.0
+offset_bottom = 132.0
+size_flags_horizontal = 8
+size_flags_vertical = 3
+theme_override_styles/panel = SubResource("StyleBoxEmpty_st18m")
+
+[node name="ScrollContainer" type="ScrollContainer" parent="." unique_id=1629363718]
+layout_mode = 1
+anchors_preset = 15
+anchor_right = 1.0
+anchor_bottom = 1.0
+offset_bottom = 4.0
+grow_horizontal = 2
+grow_vertical = 2
+horizontal_scroll_mode = 3
+vertical_scroll_mode = 3
+script = ExtResource("1_l3iok")
+
+[node name="CardMargin" type="MarginContainer" parent="ScrollContainer" unique_id=481757735]
+layout_mode = 2
+theme_override_constants/margin_left = 0
+theme_override_constants/margin_top = 8
+theme_override_constants/margin_right = 0
+theme_override_constants/margin_bottom = 0
+
+[node name="HBoxContainer" type="HBoxContainer" parent="ScrollContainer/CardMargin" unique_id=1982136347]
+layout_mode = 2
+size_flags_horizontal = 0
+size_flags_vertical = 4
+
+[node name="PanelContainer1" type="PanelContainer" parent="ScrollContainer/CardMargin/HBoxContainer" unique_id=610661983]
+layout_mode = 2
+mouse_filter = 1
+theme_override_styles/panel = SubResource("StyleBoxFlat_t5gla")
+
+[node name="CardBase" type="TextureRect" parent="ScrollContainer/CardMargin/HBoxContainer/PanelContainer1" unique_id=313528397]
+custom_minimum_size = Vector2(270, 117)
+layout_mode = 2
+size_flags_horizontal = 8
+size_flags_vertical = 4
+texture = ExtResource("1_3k5w5")
+expand_mode = 1
+
+[node name="LimitedBadge" type="PanelContainer" parent="ScrollContainer/CardMargin/HBoxContainer/PanelContainer1/CardBase" unique_id=802083624]
+layout_mode = 0
+offset_left = 2.0
+offset_top = -5.0
+offset_right = 108.0
+offset_bottom = 29.0
+mouse_filter = 1
+theme_override_styles/panel = SubResource("StyleBoxFlat_a37jl")
+
+[node name="MarginContainer" type="MarginContainer" parent="ScrollContainer/CardMargin/HBoxContainer/PanelContainer1/CardBase/LimitedBadge" unique_id=51791062]
+layout_mode = 2
+size_flags_vertical = 4
+theme_override_constants/margin_left = 13
+theme_override_constants/margin_top = 4
+theme_override_constants/margin_right = 13
+theme_override_constants/margin_bottom = 3
+
+[node name="Label" type="Label" parent="ScrollContainer/CardMargin/HBoxContainer/PanelContainer1/CardBase/LimitedBadge/MarginContainer" unique_id=1817736469]
+layout_mode = 2
+theme_override_fonts/font = ExtResource("2_l3iok")
+theme_override_font_sizes/font_size = 20
+text = "Limited"
+
+[node name="PanelContainer2" type="PanelContainer" parent="ScrollContainer/CardMargin/HBoxContainer" unique_id=704308740]
+layout_mode = 2
+mouse_filter = 1
+theme_override_styles/panel = SubResource("StyleBoxFlat_t5gla")
+
+[node name="CardBase" type="TextureRect" parent="ScrollContainer/CardMargin/HBoxContainer/PanelContainer2" unique_id=870258525]
+custom_minimum_size = Vector2(270, 117)
+layout_mode = 2
+size_flags_horizontal = 8
+size_flags_vertical = 4
+texture = ExtResource("1_3k5w5")
+expand_mode = 1
+
+[node name="LimitedBadge" type="PanelContainer" parent="ScrollContainer/CardMargin/HBoxContainer/PanelContainer2/CardBase" unique_id=1744093227]
+layout_mode = 0
+offset_left = 2.0
+offset_top = -5.0
+offset_right = 102.0
+offset_bottom = 28.0
+mouse_filter = 1
+theme_override_styles/panel = SubResource("StyleBoxFlat_a37jl")
+
+[node name="MarginContainer" type="MarginContainer" parent="ScrollContainer/CardMargin/HBoxContainer/PanelContainer2/CardBase/LimitedBadge" unique_id=126611072]
+layout_mode = 2
+size_flags_vertical = 4
+theme_override_constants/margin_left = 13
+theme_override_constants/margin_top = 4
+theme_override_constants/margin_right = 13
+theme_override_constants/margin_bottom = 3
+
+[node name="Label" type="Label" parent="ScrollContainer/CardMargin/HBoxContainer/PanelContainer2/CardBase/LimitedBadge/MarginContainer" unique_id=1709358746]
+layout_mode = 2
+theme_override_fonts/font = ExtResource("2_l3iok")
+theme_override_font_sizes/font_size = 20
+text = "Limited"
+
+[node name="PanelContainer3" type="PanelContainer" parent="ScrollContainer/CardMargin/HBoxContainer" unique_id=1308324127]
+layout_mode = 2
+mouse_filter = 1
+theme_override_styles/panel = SubResource("StyleBoxFlat_t5gla")
+
+[node name="CardBase" type="TextureRect" parent="ScrollContainer/CardMargin/HBoxContainer/PanelContainer3" unique_id=1957855413]
+custom_minimum_size = Vector2(270, 117)
+layout_mode = 2
+size_flags_horizontal = 8
+size_flags_vertical = 4
+texture = ExtResource("1_3k5w5")
+expand_mode = 1
+
+[node name="LimitedBadge" type="PanelContainer" parent="ScrollContainer/CardMargin/HBoxContainer/PanelContainer3/CardBase" unique_id=1087414779]
+layout_mode = 0
+offset_left = 2.0
+offset_top = -5.0
+offset_right = 102.0
+offset_bottom = 28.0
+mouse_filter = 1
+theme_override_styles/panel = SubResource("StyleBoxFlat_a37jl")
+
+[node name="MarginContainer" type="MarginContainer" parent="ScrollContainer/CardMargin/HBoxContainer/PanelContainer3/CardBase/LimitedBadge" unique_id=516591042]
+layout_mode = 2
+size_flags_vertical = 4
+theme_override_constants/margin_left = 13
+theme_override_constants/margin_top = 4
+theme_override_constants/margin_right = 13
+theme_override_constants/margin_bottom = 3
+
+[node name="Label" type="Label" parent="ScrollContainer/CardMargin/HBoxContainer/PanelContainer3/CardBase/LimitedBadge/MarginContainer" unique_id=1269776987]
+layout_mode = 2
+theme_override_fonts/font = ExtResource("2_l3iok")
+theme_override_font_sizes/font_size = 20
+text = "Limited"
+
+[node name="PageIndicator" type="HBoxContainer" parent="." unique_id=844141711]
+layout_mode = 0
+offset_left = 13.0
+offset_top = 108.0
+offset_right = 263.0
+offset_bottom = 117.0
+theme_override_constants/separation = 5
+
+[node name="Dot1" type="TextureRect" parent="PageIndicator" unique_id=1939877728]
+custom_minimum_size = Vector2(80, 6)
+layout_mode = 2
+texture = ExtResource("4_crv6i")
+expand_mode = 1
+
+[node name="Dot2" type="TextureRect" parent="PageIndicator" unique_id=1471300482]
+custom_minimum_size = Vector2(80, 6)
+layout_mode = 2
+texture = ExtResource("3_i4gg1")
+expand_mode = 1
+
+[node name="Dot3" type="TextureRect" parent="PageIndicator" unique_id=1825186770]
+custom_minimum_size = Vector2(80, 6)
+layout_mode = 2
+texture = ExtResource("3_i4gg1")
+expand_mode = 1
diff --git a/scenes/player.gd b/scenes/player.gd
index 203fc38..82a5d1a 100644
--- a/scenes/player.gd
+++ b/scenes/player.gd
@@ -117,6 +117,7 @@ var can_finish: bool:
# Modifier for Turn based
var has_performed_action: bool = false
+@warning_ignore("unused_private_class_variable") # read/written by player_action_manager.gd
var _is_processing_action: bool = false
var selected_gridmap_position = Vector2i(-1, -1)
var selected_playerboard_slot = -1
@@ -157,6 +158,7 @@ var spawn_point_selected = false
# Action for hilighter
var highlighted_spawn_points = []
+@warning_ignore("unused_private_class_variable") # read/written by player_movement_manager.gd
var _is_highlighting: bool = false
# Character selection and animation
@@ -579,7 +581,7 @@ const COSMETIC_MAPPING = {
}
}
-func apply_loadout(character_node: Node3D) -> void:
+func apply_loadout(_character_node: Node3D) -> void:
"""Apply equipped cosmetics via SkinManager — the single source of truth.
Uses _player_loadout (synced from the owning client via sync_loadout RPC)
so all peers render the same skin regardless of their own loadout."""
@@ -928,14 +930,14 @@ func _refresh_player_visuals():
if active_character:
apply_loadout(active_character)
-func update_rank_visuals(rank: int, score: int = -1):
+func update_rank_visuals(rank: int, player_score: int = -1):
var pos_label = get_node_or_null("Position")
if not pos_label:
return
# Hide rank until the player has actually scored, so the match doesn't
# start with everyone showing a position (e.g. all "1st").
- if score == 0:
+ if player_score == 0:
pos_label.visible = false
return
@@ -1110,7 +1112,6 @@ func drop_all_tiles():
for i in range(playerboard.size()):
if playerboard[i] != -1:
- var item_id = playerboard[i]
playerboard[i] = -1
# Find a spot to drop? Or just destroy?
@@ -1603,7 +1604,7 @@ func _find_random_spawn_position() -> Vector2i:
# Special handling for Stop n Go mode (22x10 Grid)
if LobbyManager.game_mode == "Stop n Go":
- var available_positions = []
+ var stop_n_go_positions = []
# Scan the 22x10 grid
for x in range(22):
for z in range(10):
@@ -1616,12 +1617,12 @@ func _find_random_spawn_position() -> Vector2i:
# Assuming 4 is obstacle, and -1 is void. 0 is walkable, 2 is safe zone.
if item != -1 and item != 4:
if not is_position_occupied(pos):
- available_positions.append(pos)
-
- if available_positions.size() > 0:
+ stop_n_go_positions.append(pos)
+
+ if stop_n_go_positions.size() > 0:
var rng = RandomNumberGenerator.new()
rng.randomize()
- return available_positions[rng.randi() % available_positions.size()]
+ return stop_n_go_positions[rng.randi() % stop_n_go_positions.size()]
return Vector2i(10, 5) # Fallback center
@@ -1651,6 +1652,7 @@ func _find_random_spawn_position() -> Vector2i:
# Better fallback center instead of 0,0 which is often a wall/border
print("[Player] Warning: No available spawn positions found! Using fallback.")
+ @warning_ignore("integer_division") # grid center is intentionally an integer cell
return Vector2i(cols / 2, rs / 2)
func find_random_valid_position_in_range() -> Vector2i:
@@ -1690,8 +1692,8 @@ func raycast_to_grid(from: Vector3, to: Vector3) -> Vector2i:
return Vector2i(-1, -1)
-func is_within_movement_range(target_position: Vector2i) -> bool:
- return movement_manager.is_within_movement_range(target_position)
+func is_within_movement_range(check_position: Vector2i) -> bool:
+ return movement_manager.is_within_movement_range(check_position)
# -----------------------------------------------------------------
# Movement
@@ -1777,9 +1779,7 @@ func start_movement_along_path(path: Array, clear_visual: bool = true, force: bo
var current_finish_locs = race_manager.get_current_finish_locations() if race_manager else finish_locations
if current_position in current_finish_locs and can_finish:
finish_race()
-
- var main = get_tree().get_root().get_node_or_null("Main")
-
+
# Clear visuals for everyone including bots
if clear_visual:
if enhanced_gridmap:
diff --git a/scenes/ui/battlepass_panel.gd b/scenes/ui/battlepass_panel.gd
new file mode 100644
index 0000000..4886578
--- /dev/null
+++ b/scenes/ui/battlepass_panel.gd
@@ -0,0 +1,13 @@
+extends Panel
+
+@onready var _slider = $Content/ScrollContainer
+@onready var _ticket = $Ticket
+
+
+func _ready() -> void:
+ if _slider.has_signal("page_changed"):
+ _slider.page_changed.connect(_on_page_changed)
+
+
+func _on_page_changed(index: int) -> void:
+ _ticket.show_index(index)
diff --git a/scenes/ui/battlepass_panel.gd.uid b/scenes/ui/battlepass_panel.gd.uid
new file mode 100644
index 0000000..5e04334
--- /dev/null
+++ b/scenes/ui/battlepass_panel.gd.uid
@@ -0,0 +1 @@
+uid://dc5dh15rrdc4
diff --git a/scenes/ui/battlepass_ticket.gd b/scenes/ui/battlepass_ticket.gd
new file mode 100644
index 0000000..d772e44
--- /dev/null
+++ b/scenes/ui/battlepass_ticket.gd
@@ -0,0 +1,53 @@
+extends Panel
+
+const DIP_DURATION := 0.36
+
+@onready var _tickets: Array = get_children().filter(func(c): return c is TextureRect)
+
+var _current_index := 0
+var _tween: Tween
+
+
+func _ready() -> void:
+ for i in _tickets.size():
+ _tickets[i].visible = (i == 0)
+ _tickets[i].modulate.a = 1.0
+
+
+func show_index(index: int, animate: bool = true) -> void:
+ if index < 0 or index >= _tickets.size() or index == _current_index:
+ return
+
+ var from_ticket: TextureRect = _tickets[_current_index]
+ var to_ticket: TextureRect = _tickets[index]
+
+ if not animate:
+ from_ticket.visible = false
+ to_ticket.visible = true
+ to_ticket.modulate.a = 1.0
+ _current_index = index
+ return
+
+ if _tween:
+ _tween.kill()
+
+ var from_mat: ShaderMaterial = from_ticket.material
+ var to_mat: ShaderMaterial = to_ticket.material
+
+ _tween = create_tween()
+ _tween.set_trans(Tween.TRANS_SINE).set_ease(Tween.EASE_IN)
+ if from_mat:
+ _tween.tween_method(func(v): from_mat.set_shader_parameter("blur_amount", v), 0.0, 1.0, DIP_DURATION * 0.5)
+ _tween.parallel().tween_property(from_ticket, "modulate:a", 0.0, DIP_DURATION * 0.5)
+
+ _tween.tween_callback(func():
+ from_ticket.visible = false
+ to_ticket.modulate.a = 0.0
+ to_ticket.visible = true
+ _current_index = index
+ )
+
+ _tween.set_trans(Tween.TRANS_SINE).set_ease(Tween.EASE_OUT)
+ if to_mat:
+ _tween.tween_method(func(v): to_mat.set_shader_parameter("blur_amount", v), 1.0, 0.0, DIP_DURATION * 0.5)
+ _tween.parallel().tween_property(to_ticket, "modulate:a", 1.0, DIP_DURATION * 0.5)
diff --git a/scenes/ui/battlepass_ticket.gd.uid b/scenes/ui/battlepass_ticket.gd.uid
new file mode 100644
index 0000000..fc0ea14
--- /dev/null
+++ b/scenes/ui/battlepass_ticket.gd.uid
@@ -0,0 +1 @@
+uid://bwu41vcu5t8nd
diff --git a/scenes/ui/lobby_chat.gd b/scenes/ui/lobby_chat.gd
index 99af33f..9d58989 100644
--- a/scenes/ui/lobby_chat.gd
+++ b/scenes/ui/lobby_chat.gd
@@ -10,6 +10,8 @@ var _active_chat_context: String = "global"
var _dm_tabs: Dictionary = {}
var _dm_messages: Dictionary = {}
var _chat_config: Dictionary = {"prefix": "", "max_messages": 50, "max_age_days": 0}
+var _global_chat_loading: bool = false
+var _dm_loading: Dictionary = {}
func _init(p_lobby: Control):
lobby = p_lobby
@@ -19,26 +21,41 @@ func _init(p_lobby: Control):
if lobby.chat_input:
lobby.chat_input.text_submitted.connect(func(_t): _on_chat_send_pressed())
lobby.chat_input.text_changed.connect(_on_chat_input_changed)
-
+
+ var global_btn = lobby.get_node_or_null("%GlobalChatTabBtn")
+ if global_btn:
+ global_btn.pressed.connect(func(): switch_chat_tab("global"))
+
+ var server_btn = lobby.get_node_or_null("%ServerChatTabBtn")
+ if server_btn:
+ server_btn.pressed.connect(func(): switch_chat_tab("server"))
+
_setup_friend_suggest_ui()
func join_global_chat() -> void:
- if _chat_channel != null:
+ if _chat_channel != null or _global_chat_loading:
return
-
+
+ _global_chat_loading = true
+ _refresh_chat_display()
+
var socket = NakamaManager.socket
if not socket or not socket.is_connected_to_host():
push_warning("[Chat] Socket not connected, skipping chat join.")
+ _global_chat_loading = false
+ _refresh_chat_display()
return
-
+
var result = await socket.join_chat_async(GLOBAL_CHAT_ROOM,
NakamaSocket.ChannelType.Room,
true, false)
-
+
if result.is_exception():
push_warning("[Chat] Failed to join global chat: " + result.get_exception().message)
+ _global_chat_loading = false
+ _refresh_chat_display()
return
-
+
_chat_channel = result
print("[Chat] Joined global channel: ", _chat_channel.id)
@@ -51,26 +68,28 @@ func join_global_chat() -> void:
if cfg_res.has("config"):
_chat_config = cfg_res["config"]
- _chat_messages.clear()
var limit: int = _chat_config.get("max_messages", 50)
+ var history_entries: Array = []
var history_result = await NakamaManager.client.list_channel_messages_async(NakamaManager.session, _chat_channel.id, limit, false)
if not history_result.is_exception() and history_result.messages:
var msgs = history_result.messages.duplicate()
msgs.reverse()
for msg in msgs:
- _add_chat_message(msg, false)
+ history_entries.append(_parse_chat_message(msg))
# Inject admin system prefix if configured
var prefix: String = _chat_config.get("prefix", "")
if not prefix.is_empty():
- _chat_messages.insert(0, {
+ history_entries.insert(0, {
"sender": "SYSTEM",
"content": prefix,
"ts": _get_local_time(),
"date": Time.get_date_string_from_system()
})
-
+
+ _chat_messages = history_entries + _chat_messages
_trim_old_messages()
+ _global_chat_loading = false
_refresh_chat_display()
func _on_chat_message_received(message) -> void:
@@ -80,29 +99,32 @@ func _on_chat_message_received(message) -> void:
return
_add_chat_message(message, true)
-func _add_chat_message(message, refresh_display: bool) -> void:
+func _parse_chat_message(message) -> Dictionary:
var text: String = ""
var parsed = JSON.parse_string(message.content)
if typeof(parsed) == TYPE_DICTIONARY:
text = parsed.get("msg", message.content)
else:
text = message.content
-
+
var sender: String = message.username
if sender.is_empty() and message.sender_id:
sender = message.sender_id.substr(0, 8)
elif sender.is_empty():
sender = "Unknown"
-
+
var ts_str: String = _format_nakama_time(message.create_time)
-
- _chat_messages.append({
+
+ return {
"sender": sender,
"content": text,
"ts": ts_str,
"date": message.create_time.substr(0, 10) if message.create_time else Time.get_date_string_from_system()
- })
-
+ }
+
+func _add_chat_message(message, refresh_display: bool) -> void:
+ _chat_messages.append(_parse_chat_message(message))
+
if refresh_display:
_trim_old_messages()
_refresh_chat_display()
@@ -209,16 +231,21 @@ func _open_dm_tab(user_id: String, username: String) -> void:
if not _dm_tabs.has(user_id):
_create_dm_tab(user_id, username)
_dm_messages[user_id] = []
+ _dm_loading[user_id] = true
switch_chat_tab(user_id)
-
+
var history = await FriendManager.get_dm_history(user_id)
var my_id = NakamaManager.session.user_id if NakamaManager.session else ""
+ var history_entries: Array = []
for entry in history:
var is_self = entry.get("from") == my_id
var sender_name = "You" if is_self else username
var ts = _format_nakama_time(entry.get("create_time", ""))
- _dm_messages[user_id].append({"sender": sender_name, "content": entry.get("msg", ""), "ts": ts})
-
+ history_entries.append({"sender": sender_name, "content": entry.get("msg", ""), "ts": ts})
+
+ _dm_messages[user_id] = history_entries + _dm_messages[user_id]
+ _dm_loading[user_id] = false
+
if _active_chat_context == user_id:
_refresh_chat_display()
else:
@@ -256,16 +283,34 @@ func _close_dm_tab(user_id: String) -> void:
func switch_chat_tab(context_id: String) -> void:
_active_chat_context = context_id
_refresh_chat_display()
-
- var tabs_container = lobby.get_node_or_null("%ChatTabsContainer")
- if tabs_container:
- var global_btn = lobby.get_node_or_null("%GlobalChatTabBtn")
- if global_btn:
- global_btn.modulate = Color(1.0, 1.0, 1.0) if context_id == "global" else Color(0.6, 0.6, 0.6)
-
- for u_id in _dm_tabs:
- var tab_hbox = _dm_tabs[u_id]
- tab_hbox.modulate = Color(1.0, 1.0, 1.0) if context_id == u_id else Color(0.6, 0.6, 0.6)
+
+ var global_btn = lobby.get_node_or_null("%GlobalChatTabBtn")
+ if global_btn:
+ global_btn.button_pressed = (context_id == "global")
+
+ var server_btn = lobby.get_node_or_null("%ServerChatTabBtn")
+ if server_btn:
+ server_btn.button_pressed = (context_id == "server")
+
+ for u_id in _dm_tabs:
+ var tab_hbox = _dm_tabs[u_id]
+ var dm_btn = tab_hbox.get_node_or_null("DMTabBtn")
+ if dm_btn:
+ dm_btn.button_pressed = (context_id == u_id)
+
+ if lobby.chat_input:
+ lobby.chat_input.placeholder_text = "Send to %s..." % _get_context_display_name(context_id)
+
+func _get_context_display_name(context_id: String) -> String:
+ if context_id == "global":
+ return "World"
+ if context_id == "server":
+ return "Server"
+ if _dm_tabs.has(context_id):
+ var btn = _dm_tabs[context_id].get_node_or_null("DMTabBtn")
+ if btn:
+ return btn.text
+ return "Chat"
func _setup_friend_suggest_ui() -> void:
lobby._friend_suggest_panel = lobby.get_node_or_null("%FriendSuggestPanel")
@@ -331,12 +376,15 @@ func _refresh_chat_display() -> void:
messages_to_show = []
for msg in messages_to_show:
- var ts: String = msg.get("ts", "")
var sender: String = msg.get("sender", "?")
var text: String = msg.get("content", "")
-
- lobby.chat_display.append_text("[color=#888888][%s][/color] [b]%s:[/b] %s\n" % [ts, sender, text])
-
+
+ lobby.chat_display.append_text("[b]%s[/b]\n[color=#c7d3e0]%s[/color]\n\n" % [sender, text])
+
+ var is_loading: bool = _global_chat_loading if _active_chat_context == "global" else _dm_loading.get(_active_chat_context, false)
+ if is_loading:
+ lobby.chat_display.append_text("[i][color=#8a97a8]Loading messages...[/color][/i]\n")
+
if lobby.chat_display:
var scrollbar = lobby.chat_display.get_v_scroll_bar()
if scrollbar:
diff --git a/scenes/ui/lobby_room.gd b/scenes/ui/lobby_room.gd
index aee3aa0..93822b7 100644
--- a/scenes/ui/lobby_room.gd
+++ b/scenes/ui/lobby_room.gd
@@ -153,8 +153,7 @@ func _on_room_joined(room_data: Dictionary) -> void:
_on_enable_cycle_timer_changed(LobbyManager.enable_cycle_timer)
_on_scarcity_mode_changed(LobbyManager.scarcity_mode)
_on_sng_update()
- _on_doors_update()
-
+
if lobby.area_left_btn: lobby.area_left_btn.disabled = not is_host
if lobby.area_right_btn: lobby.area_right_btn.disabled = not is_host
if lobby.area_name_label: lobby.area_name_label.text = LobbyManager.get_selected_area()
diff --git a/scenes/ui/quest_list_tab.gd b/scenes/ui/quest_list_tab.gd
new file mode 100644
index 0000000..56d4fb3
--- /dev/null
+++ b/scenes/ui/quest_list_tab.gd
@@ -0,0 +1,25 @@
+extends Panel
+
+signal period_changed(period: String)
+
+@onready var _daily_btn: Button = %DailyTabBtn
+@onready var _weekly_btn: Button = %WeeklyTabBtn
+@onready var _monthly_btn: Button = %MonthlyTabBtn
+
+var _active := "daily"
+
+
+func _ready() -> void:
+ _daily_btn.pressed.connect(_select.bind("daily"))
+ _weekly_btn.pressed.connect(_select.bind("weekly"))
+ _monthly_btn.pressed.connect(_select.bind("monthly"))
+
+
+func _select(period: String) -> void:
+ if period == _active:
+ return
+ _active = period
+ _daily_btn.button_pressed = (period == "daily")
+ _weekly_btn.button_pressed = (period == "weekly")
+ _monthly_btn.button_pressed = (period == "monthly")
+ period_changed.emit(period)
diff --git a/scenes/ui/quest_list_tab.gd.uid b/scenes/ui/quest_list_tab.gd.uid
new file mode 100644
index 0000000..39e556f
--- /dev/null
+++ b/scenes/ui/quest_list_tab.gd.uid
@@ -0,0 +1 @@
+uid://cas5sc40ampq1
diff --git a/scripts/bot_controller.gd b/scripts/bot_controller.gd
index d1b8512..848b619 100644
--- a/scripts/bot_controller.gd
+++ b/scripts/bot_controller.gd
@@ -79,7 +79,6 @@ func _ready():
return
# Initialize strategic planner
- var BotStrategicPlanner = load("res://scripts/bot_strategic_planner.gd")
strategic_planner = BotStrategicPlanner.new(actor, enhanced_gridmap)
# Disable input processing for bots
@@ -211,7 +210,7 @@ func _run_ai_tick():
return
# Priority 0.5: Gauntlet (#075) — use Ghost powerup if boxed in
- if await _try_activate_ghost():
+ if _try_activate_ghost():
print("[BotController] Action Taken: Ghost (trapped)")
return
@@ -677,8 +676,6 @@ func _try_move() -> bool:
else:
print("[BotController] %s simple_move_to BLOCKED (others). Trying unstuck move." % actor.name)
return await _try_unstuck_move()
-
- return false
func _should_freeze_for_stop_n_go() -> bool:
"""Check if the bot should intentionally skip its turn during STOP phase outside of safe zones."""
@@ -909,12 +906,7 @@ func _handle_goal_completion():
if goals_cycle_manager:
var time_remaining = goals_cycle_manager.get_time_remaining()
goals_cycle_manager.on_goal_completed(actor, time_remaining)
-
- var powerup_manager = actor.get_node_or_null("PowerUpManager")
- # if powerup_manager:
- # powerup_manager.add_goal_completion_reward()
-
-
+
print("[BotController] %s COMPLETED GOAL!" % actor.name)
func _wait_with_variance(base_delay: float):
diff --git a/scripts/bot_strategic_planner.gd b/scripts/bot_strategic_planner.gd
index 8658f01..aa3252b 100644
--- a/scripts/bot_strategic_planner.gd
+++ b/scripts/bot_strategic_planner.gd
@@ -204,9 +204,7 @@ func get_unneeded_tile_slot() -> int:
"""Find a slot containing a tile that is not needed for the goal."""
if not actor or actor.playerboard.size() == 0:
return -1
-
- var needed_tiles = get_tiles_needed()
-
+
# Check center 3x3 for misplaced tiles
for i in range(3):
for j in range(3):
@@ -252,7 +250,6 @@ func get_unneeded_tile_slot() -> int:
var center_indices = [6, 7, 8, 11, 12, 13, 16, 17, 18]
for i in range(actor.playerboard.size()):
if not i in center_indices and actor.playerboard[i] != -1:
- var item = actor.playerboard[i]
# Only keep if we strictly need it and can't find it easily?
# Actually, generally dump outer ring tiles to keep board clean
# unless we are about to move it to a valid spot.
@@ -263,8 +260,6 @@ func get_unneeded_tile_slot() -> int:
return -1
- return -1
-
func get_unneeded_tile_slot_panic() -> int:
"""Aggressively find ANY tile that doesn't match a goal perfectly."""
if not actor or actor.playerboard.size() == 0:
@@ -439,33 +434,31 @@ func find_optimal_move_target() -> Vector2i:
var time_left = gc_manager.get_global_time_remaining() if gc_manager else 999.0
var is_match_running = gc_manager.is_match_running() if gc_manager else false
var is_late_game = is_sng and is_match_running and time_left > 0.0 and time_left <= 30.0
-
- # 1. STOP N GO: Reach the finish line if goals are complete
- if is_sng and main:
- var sng_manager = main.get_node_or_null("StopNGoManager")
- if sng_manager and sng_manager.is_mission_complete(actor.name.to_int()):
- # MISSION COMPLETE: We CAN finish, but should we?
-
- if not is_late_game:
- # CHAOS MODE: Allow falling through to target holo tiles, but we'll limit the target X later
- # print("[BotStrategicPlanner] %s mission complete (Chaos Phase %.1fs). Roaming field." % [actor.name, time_left])
- pass
- else:
- # Late game: go to finish
- var finish_target = Vector2i(21, actor.current_position.y)
-
- # Ensure finish_target is walkable
- if not _is_valid_move_target(finish_target):
- for dy in [1, -1, 2, -2]:
- var alt = Vector2i(21, actor.current_position.y + dy)
- if _is_valid_move_target(alt):
- finish_target = alt
- break
-
- print("[BotStrategicPlanner] %s mission complete (Late Game %.1fs)! Heading to finish: %s" % [actor.name, time_left, finish_target])
- return finish_target
-
var sng_manager = main.get_node_or_null("StopNGoManager") if main else null
+
+ # 1. STOP N GO: Reach the finish line if goals are complete
+ if is_sng and sng_manager and sng_manager.is_mission_complete(actor.name.to_int()):
+ # MISSION COMPLETE: We CAN finish, but should we?
+
+ if not is_late_game:
+ # CHAOS MODE: Allow falling through to target holo tiles, but we'll limit the target X later
+ # print("[BotStrategicPlanner] %s mission complete (Chaos Phase %.1fs). Roaming field." % [actor.name, time_left])
+ pass
+ else:
+ # Late game: go to finish
+ var finish_target = Vector2i(21, actor.current_position.y)
+
+ # Ensure finish_target is walkable
+ if not _is_valid_move_target(finish_target):
+ for dy in [1, -1, 2, -2]:
+ var alt = Vector2i(21, actor.current_position.y + dy)
+ if _is_valid_move_target(alt):
+ finish_target = alt
+ break
+
+ print("[BotStrategicPlanner] %s mission complete (Late Game %.1fs)! Heading to finish: %s" % [actor.name, time_left, finish_target])
+ return finish_target
+
var is_mission_complete = sng_manager.is_mission_complete(actor.name.to_int()) if sng_manager else false
var needed_tiles = get_tiles_needed()
diff --git a/scripts/generators/name_generator.gd b/scripts/generators/name_generator.gd
index c26095d..30c955b 100644
--- a/scripts/generators/name_generator.gd
+++ b/scripts/generators/name_generator.gd
@@ -69,9 +69,9 @@ func generate_guest_name() -> String:
_used_guest_names.append(fallback)
return fallback
-func release_guest_name(name: String) -> void:
+func release_guest_name(guest_name: String) -> void:
"""Call when a guest disconnects to free up their name for reuse."""
- _used_guest_names.erase(name)
+ _used_guest_names.erase(guest_name)
# -----------------------------------------------------------------------
# Bot name generation
@@ -98,9 +98,9 @@ func generate_bot_name() -> String:
_used_bot_names.append(candidate)
return candidate
-func release_bot_name(name: String) -> void:
+func release_bot_name(bot_name: String) -> void:
"""Call when a bot slot is removed to free up its name."""
- _used_bot_names.erase(name)
+ _used_bot_names.erase(bot_name)
func reset_all() -> void:
"""Reset both pools — useful on returning to main menu."""
diff --git a/scripts/managers/friend_manager.gd b/scripts/managers/friend_manager.gd
index 37f9e81..8a19770 100644
--- a/scripts/managers/friend_manager.gd
+++ b/scripts/managers/friend_manager.gd
@@ -173,15 +173,15 @@ func send_lobby_invite(to_user_id: String, match_id: String) -> void:
if result.get("success", false) == false:
push_warning("[FriendManager] send_lobby_invite failed: " + str(result.get("error", "")))
-func _on_notification_received(notification) -> void:
- print("[FriendManager] _on_notification_received: code=%d sender=%s" % [notification.code, notification.sender_id])
- match notification.code:
+func _on_notification_received(notif) -> void:
+ print("[FriendManager] _on_notification_received: code=%d sender=%s" % [notif.code, notif.sender_id])
+ match notif.code:
NOTIF_LOBBY_INVITE:
- var content = JSON.parse_string(notification.content)
+ var content = JSON.parse_string(notif.content)
if content:
var from_name: String = content.get("from_name", "Someone")
var match_id: String = content.get("match_id", "")
- emit_signal("lobby_invite_received", notification.sender_id, from_name, match_id)
+ emit_signal("lobby_invite_received", notif.sender_id, from_name, match_id)
NOTIF_FRIEND_REQUEST:
# Refresh friends list so the incoming request appears immediately
print("[FriendManager] friend request notification received, reloading friends...")
diff --git a/scripts/managers/gacha_manager.gd b/scripts/managers/gacha_manager.gd
index 5920b6c..e7eae5e 100644
--- a/scripts/managers/gacha_manager.gd
+++ b/scripts/managers/gacha_manager.gd
@@ -32,11 +32,6 @@ func pull(banner_id: String, count: int) -> Array:
push_error("[GachaManager] Not authenticated")
return []
- var payload = JSON.stringify({
- "banner_id": banner_id,
- "count": count
- })
-
var result = await BackendService.perform_gacha_pull(banner_id, count)
if result.get("success", false) == false:
diff --git a/scripts/managers/goals_cycle_manager.gd b/scripts/managers/goals_cycle_manager.gd
index 854c020..d60a837 100644
--- a/scripts/managers/goals_cycle_manager.gd
+++ b/scripts/managers/goals_cycle_manager.gd
@@ -44,7 +44,7 @@ func initialize(main: Node):
if LobbyManager:
LobbyManager.enable_cycle_timer_changed.connect(_on_enable_cycle_timer_changed)
-func _on_enable_cycle_timer_changed(enabled: bool):
+func _on_enable_cycle_timer_changed(_enabled: bool):
# If disabled mid-cycle, the timer will just freeze in _process
# If enabled mid-cycle, it will resume
pass
@@ -69,9 +69,7 @@ func _process(delta):
return
# Skip countdown if timer is disabled
- var lobby_manager = get_tree().get_root().get_node_or_null("Main/LobbyManager")
# Note: LobbyManager is an Autoload, so we can access it directly via 'LobbyManager'
-
if LobbyManager and not LobbyManager.get_enable_cycle_timer():
# If timer is disabled, we just don't decrement.
# But we still keep is_cycle_active = true so the phase is "active" (allowing actions)
diff --git a/scripts/managers/player_manager.gd b/scripts/managers/player_manager.gd
index 62d3c7a..305bc60 100644
--- a/scripts/managers/player_manager.gd
+++ b/scripts/managers/player_manager.gd
@@ -2,15 +2,12 @@ extends Node
# PlayerManager - Handles player and bot lifecycle management
-signal player_added(peer_id, player_node)
signal player_removed(peer_id)
-signal bot_created(bot_id, bot_node)
-signal bot_removed(bot_id)
var player_scene = preload("res://scenes/player.tscn")
var connected_peer_ids = []
-func add_player_character(peer_id: int, position: Vector2i = Vector2i.ZERO) -> Node:
+func add_player_character(peer_id: int, _position: Vector2i = Vector2i.ZERO) -> Node:
var player_character = player_scene.instantiate()
player_character.set_multiplayer_authority(peer_id)
player_character.name = str(peer_id)
diff --git a/scripts/nakama_manager.gd b/scripts/nakama_manager.gd
index 5a25f62..6a16dc3 100644
--- a/scripts/nakama_manager.gd
+++ b/scripts/nakama_manager.gd
@@ -282,11 +282,6 @@ func list_matches_async(mode_filter: String = "") -> Array:
# Batch-read room metadata from Nakama storage
var meta_map: Dictionary = {} # match_id -> {host_name, game_mode, ...}
if read_ids.size() > 0:
- var storage_reads: Array = []
- for mid in read_ids:
- # We don't know the owner_id, so list objects by collection+key
- # Use list_storage_objects per match or batch read
- pass
# Read all match metas from our own storage (other users' objects are public read)
for mid in read_ids:
var list_result = await client.list_storage_objects_async(session, "match_meta", "", 100)
diff --git a/scripts/services/backend_service.gd b/scripts/services/backend_service.gd
index 254c8f4..f9650aa 100644
--- a/scripts/services/backend_service.gd
+++ b/scripts/services/backend_service.gd
@@ -87,13 +87,13 @@ func get_steamworks_manager() -> Node:
return steamworks_manager
## Unified RPC with Retry and Error Mapping
-func api_rpc_async(rpc_id: String, payload: String = "{}") -> Dictionary:
+func api_rpc_async(p_rpc_id: String, payload: String = "{}") -> Dictionary:
if not nakama_backend or not nakama_backend.client or not nakama_backend.session:
return { "success": false, "error": ErrorCode.UNAUTHORIZED, "message": "Not authenticated" }
var retries := 0
while retries <= MAX_RETRIES:
- var result = await nakama_backend.client.rpc_async(nakama_backend.session, rpc_id, payload)
+ var result = await nakama_backend.client.rpc_async(nakama_backend.session, p_rpc_id, payload)
# NakamaAPI.ApiRpc has is_exception()
if result.is_exception():
diff --git a/scripts/ui/boot_screen.gd b/scripts/ui/boot_screen.gd
index b9cf74a..572dfec 100644
--- a/scripts/ui/boot_screen.gd
+++ b/scripts/ui/boot_screen.gd
@@ -95,7 +95,7 @@ func _on_update_pressed() -> void:
status_label.text = "Downloading update..."
update_manager.download_update()
-func _on_download_started(total_size: int) -> void:
+func _on_download_started(_total_size: int) -> void:
progress_bar.visible = true
progress_label.visible = true
progress_bar.value = 0
diff --git a/setting_bar_shader.gdshader b/setting_bar_shader.gdshader
new file mode 100644
index 0000000..e0c34c8
--- /dev/null
+++ b/setting_bar_shader.gdshader
@@ -0,0 +1,20 @@
+shader_type canvas_item;
+
+// Masukkan ukuran Size panel Anda di Inspector (X dan Y)
+uniform vec2 panel_size = vec2(550.0, 64.0);
+// Atur radius kelengkungan dalam satuan pixel (misal: 12.0 atau 16.0)
+uniform float corner_radius : hint_range(0.0, 100.0) = 8.0;
+
+void fragment() {
+ vec2 center = panel_size * 0.5;
+ vec2 half_size = panel_size * 0.5 - vec2(corner_radius);
+ vec2 p = UV * panel_size - center;
+ vec2 d = abs(p) - half_size;
+ float dist = length(max(d, 0.0)) + min(max(d.x, d.y), 0.0) - corner_radius;
+
+ // Mengambil warna asli dari GradientTexture2D Anda
+ vec4 tex_color = texture(TEXTURE, UV);
+ float alpha_mask = 1.0 - step(0.0, dist);
+
+ COLOR = vec4(tex_color.rgb, tex_color.a * alpha_mask);
+}
\ No newline at end of file
diff --git a/setting_bar_shader.gdshader.uid b/setting_bar_shader.gdshader.uid
new file mode 100644
index 0000000..9063b49
--- /dev/null
+++ b/setting_bar_shader.gdshader.uid
@@ -0,0 +1 @@
+uid://bx46eyi72i6ak
diff --git a/wiki/Architecture-Client.md b/wiki/Architecture-Client.md
index 6716623..669b408 100644
--- a/wiki/Architecture-Client.md
+++ b/wiki/Architecture-Client.md
@@ -4,7 +4,7 @@
[Back to Home](./Home)
-Complete per-function reference for the Godot 4.7 client codebase. Every script, signal, autoload dependency, and cross-file relationship documented.
+Complete per-function reference for the Godot 4.6.3 client codebase. Every script, signal, autoload dependency, and cross-file relationship documented.
[Back to top](#top)
@@ -93,7 +93,7 @@ Complete per-function reference for the Godot 4.7 client codebase. Every script,
```
/home/dev/tekton/
- project.godot -- Godot 4.7 project file
+ project.godot -- Godot 4.6.3 project file
scripts/
main.gd -- (NOT USED; logic lives in scenes/main.gd)
nakama_manager.gd -- Nakama network layer (autoload)
diff --git a/wiki/patch_release_workflow.md b/wiki/patch_release_workflow.md
index 88688a9..721e8a2 100644
--- a/wiki/patch_release_workflow.md
+++ b/wiki/patch_release_workflow.md
@@ -90,7 +90,7 @@ curl -X POST "http://52.74.133.55:3000/api/v1/repos/danchie/tekton/actions/workf
### What the CI does (deploy_patch.yml)
1. **Checkout** — `git clone --depth 1` from `experimental` branch (shallow = fast).
-2. **Setup Godot** — Uses cached `/cache/godot_4.7` binary. Downloads only if missing (140MB, cached forever).
+2. **Setup Godot** — Uses cached `/cache/godot_4.6.3` binary. Downloads only if missing (140MB, cached forever).
3. **Generate version.json** — Runs `tools/generate_version_json.py --skip-changelog`. Reads version from `project.godot`, bumps patch number, writes `assets/data/version.json` with the new release entry including `pck_url` pointing to Gitea raw endpoint.
4. **Export patch PCK** — `godot --headless --export-pack "Windows Desktop" build/patch.pck`. No export templates needed — `--export-pack` only packs resources, not binaries. Output ~10-15MB.
5. **Push to patches branch** — Force-pushes `patch.pck` + `version.json` to the `patches` branch of the repo.
@@ -249,7 +249,7 @@ Root cause: `ubuntu-latest` container doesn't have `zip` pre-installed. The inst
### Godot export fails silently (`|| true`)
The `|| true` on export commands means a failed Godot export still shows step as success. Check:
-- Is `godot_4.7` cached at `/cache/`?
+- Is `godot_4.6.3` cached at `/cache/`?
- Does the export preset name match exactly? E.g. `"Windows Desktop"` must match `export_presets.cfg`.
- Is `addons/godotsteam/libgodotsteam*` present? Missing DLLs cause Godot to exit 1.