feat: take_powerup VFX, rank fix, admin chat management

- Wire take_powerup AnimatedSprite3D on powerup pickup via add_powerup_from_item()
- Make take_powerup animation one-shot (loop: false)
- Fix rank Position label hidden at game start (visible = false, only shows when score > 0)
- Competition ranking for tied scores in main.gd
- Lobby Chat admin tab: system prefix, max messages, wipe, purge old, save config
- Chat Storage admin tab: list/browse/delete individual channel messages
- Backend RPCs: admin_get_chat_config, admin_set_chat_config, admin_purge_old_messages,
  admin_list_channel_messages, admin_delete_channel_message
- Chat config applied on lobby join (max_messages, prefix injection)
This commit is contained in:
2026-06-19 17:13:24 +08:00
parent cd584f5599
commit 15043b5655
12 changed files with 818 additions and 7 deletions
+221
View File
@@ -0,0 +1,221 @@
[gd_resource type="SpriteFrames" format=3 uid="uid://bq8ifua64lag2"]
[ext_resource type="Texture2D" uid="uid://cwmqu5wsing63" path="res://assets/graphics/vfx/take_powerup.png" id="1_j5q3j"]
[sub_resource type="AtlasTexture" id="AtlasTexture_fs20j"]
atlas = ExtResource("1_j5q3j")
region = Rect2(0, 0, 386, 386)
[sub_resource type="AtlasTexture" id="AtlasTexture_mgj3q"]
atlas = ExtResource("1_j5q3j")
region = Rect2(386, 0, 386, 386)
[sub_resource type="AtlasTexture" id="AtlasTexture_0cqc8"]
atlas = ExtResource("1_j5q3j")
region = Rect2(772, 0, 386, 386)
[sub_resource type="AtlasTexture" id="AtlasTexture_6lpcc"]
atlas = ExtResource("1_j5q3j")
region = Rect2(1158, 0, 386, 386)
[sub_resource type="AtlasTexture" id="AtlasTexture_sufku"]
atlas = ExtResource("1_j5q3j")
region = Rect2(1544, 0, 386, 386)
[sub_resource type="AtlasTexture" id="AtlasTexture_m7myb"]
atlas = ExtResource("1_j5q3j")
region = Rect2(1930, 0, 386, 386)
[sub_resource type="AtlasTexture" id="AtlasTexture_85pl8"]
atlas = ExtResource("1_j5q3j")
region = Rect2(0, 386, 386, 386)
[sub_resource type="AtlasTexture" id="AtlasTexture_tum65"]
atlas = ExtResource("1_j5q3j")
region = Rect2(386, 386, 386, 386)
[sub_resource type="AtlasTexture" id="AtlasTexture_v7us7"]
atlas = ExtResource("1_j5q3j")
region = Rect2(772, 386, 386, 386)
[sub_resource type="AtlasTexture" id="AtlasTexture_y04gx"]
atlas = ExtResource("1_j5q3j")
region = Rect2(1158, 386, 386, 386)
[sub_resource type="AtlasTexture" id="AtlasTexture_uwml5"]
atlas = ExtResource("1_j5q3j")
region = Rect2(1544, 386, 386, 386)
[sub_resource type="AtlasTexture" id="AtlasTexture_ltsqf"]
atlas = ExtResource("1_j5q3j")
region = Rect2(1930, 386, 386, 386)
[sub_resource type="AtlasTexture" id="AtlasTexture_4st5b"]
atlas = ExtResource("1_j5q3j")
region = Rect2(0, 772, 386, 386)
[sub_resource type="AtlasTexture" id="AtlasTexture_vnofb"]
atlas = ExtResource("1_j5q3j")
region = Rect2(386, 772, 386, 386)
[sub_resource type="AtlasTexture" id="AtlasTexture_fculp"]
atlas = ExtResource("1_j5q3j")
region = Rect2(772, 772, 386, 386)
[sub_resource type="AtlasTexture" id="AtlasTexture_n4swe"]
atlas = ExtResource("1_j5q3j")
region = Rect2(1158, 772, 386, 386)
[sub_resource type="AtlasTexture" id="AtlasTexture_7kcav"]
atlas = ExtResource("1_j5q3j")
region = Rect2(1544, 772, 386, 386)
[sub_resource type="AtlasTexture" id="AtlasTexture_6b6x4"]
atlas = ExtResource("1_j5q3j")
region = Rect2(1930, 772, 386, 386)
[sub_resource type="AtlasTexture" id="AtlasTexture_sx3tb"]
atlas = ExtResource("1_j5q3j")
region = Rect2(0, 1158, 386, 386)
[sub_resource type="AtlasTexture" id="AtlasTexture_vcvbu"]
atlas = ExtResource("1_j5q3j")
region = Rect2(386, 1158, 386, 386)
[sub_resource type="AtlasTexture" id="AtlasTexture_h7b8t"]
atlas = ExtResource("1_j5q3j")
region = Rect2(772, 1158, 386, 386)
[sub_resource type="AtlasTexture" id="AtlasTexture_g0810"]
atlas = ExtResource("1_j5q3j")
region = Rect2(1158, 1158, 386, 386)
[sub_resource type="AtlasTexture" id="AtlasTexture_3t50e"]
atlas = ExtResource("1_j5q3j")
region = Rect2(1544, 1158, 386, 386)
[sub_resource type="AtlasTexture" id="AtlasTexture_yk8ef"]
atlas = ExtResource("1_j5q3j")
region = Rect2(1930, 1158, 386, 386)
[sub_resource type="AtlasTexture" id="AtlasTexture_5m1o2"]
atlas = ExtResource("1_j5q3j")
region = Rect2(0, 1544, 386, 386)
[sub_resource type="AtlasTexture" id="AtlasTexture_xp42j"]
atlas = ExtResource("1_j5q3j")
region = Rect2(386, 1544, 386, 386)
[sub_resource type="AtlasTexture" id="AtlasTexture_3ai78"]
atlas = ExtResource("1_j5q3j")
region = Rect2(772, 1544, 386, 386)
[sub_resource type="AtlasTexture" id="AtlasTexture_xsn24"]
atlas = ExtResource("1_j5q3j")
region = Rect2(1158, 1544, 386, 386)
[sub_resource type="AtlasTexture" id="AtlasTexture_eprgv"]
atlas = ExtResource("1_j5q3j")
region = Rect2(1544, 1544, 386, 386)
[sub_resource type="AtlasTexture" id="AtlasTexture_uc241"]
atlas = ExtResource("1_j5q3j")
region = Rect2(1930, 1544, 386, 386)
[resource]
animations = [{
"frames": [{
"duration": 1.0,
"texture": SubResource("AtlasTexture_fs20j")
}, {
"duration": 1.0,
"texture": SubResource("AtlasTexture_mgj3q")
}, {
"duration": 1.0,
"texture": SubResource("AtlasTexture_0cqc8")
}, {
"duration": 1.0,
"texture": SubResource("AtlasTexture_6lpcc")
}, {
"duration": 1.0,
"texture": SubResource("AtlasTexture_sufku")
}, {
"duration": 1.0,
"texture": SubResource("AtlasTexture_m7myb")
}, {
"duration": 1.0,
"texture": SubResource("AtlasTexture_85pl8")
}, {
"duration": 1.0,
"texture": SubResource("AtlasTexture_tum65")
}, {
"duration": 1.0,
"texture": SubResource("AtlasTexture_v7us7")
}, {
"duration": 1.0,
"texture": SubResource("AtlasTexture_y04gx")
}, {
"duration": 1.0,
"texture": SubResource("AtlasTexture_uwml5")
}, {
"duration": 1.0,
"texture": SubResource("AtlasTexture_ltsqf")
}, {
"duration": 1.0,
"texture": SubResource("AtlasTexture_4st5b")
}, {
"duration": 1.0,
"texture": SubResource("AtlasTexture_vnofb")
}, {
"duration": 1.0,
"texture": SubResource("AtlasTexture_fculp")
}, {
"duration": 1.0,
"texture": SubResource("AtlasTexture_n4swe")
}, {
"duration": 1.0,
"texture": SubResource("AtlasTexture_7kcav")
}, {
"duration": 1.0,
"texture": SubResource("AtlasTexture_6b6x4")
}, {
"duration": 1.0,
"texture": SubResource("AtlasTexture_sx3tb")
}, {
"duration": 1.0,
"texture": SubResource("AtlasTexture_vcvbu")
}, {
"duration": 1.0,
"texture": SubResource("AtlasTexture_h7b8t")
}, {
"duration": 1.0,
"texture": SubResource("AtlasTexture_g0810")
}, {
"duration": 1.0,
"texture": SubResource("AtlasTexture_3t50e")
}, {
"duration": 1.0,
"texture": SubResource("AtlasTexture_yk8ef")
}, {
"duration": 1.0,
"texture": SubResource("AtlasTexture_5m1o2")
}, {
"duration": 1.0,
"texture": SubResource("AtlasTexture_xp42j")
}, {
"duration": 1.0,
"texture": SubResource("AtlasTexture_3ai78")
}, {
"duration": 1.0,
"texture": SubResource("AtlasTexture_xsn24")
}, {
"duration": 1.0,
"texture": SubResource("AtlasTexture_eprgv")
}, {
"duration": 1.0,
"texture": SubResource("AtlasTexture_uc241")
}],
"loop": false,
"name": &"take_powerup",
"speed": 15.0
}]