feat: implement the new "Stop N Go" game mode, including phase management, dynamic safe zones, player missions, and dedicated UI with visual effects.

This commit is contained in:
Yogi Wiguna
2026-03-24 15:16:30 +08:00
parent da9ba9361d
commit 4946f1daa6
30 changed files with 759 additions and 48 deletions
@@ -600,6 +600,10 @@ func clear_path_visualization(unused_floor_idx: int = 0):
for x in range(columns):
for z in range(rows):
var cell_item = get_cell_item(Vector3i(x, 2, z))
# Protect Safe Zone (ID 2) from being cleared by path visualization
if cell_item == 2:
continue
if cell_item == hover_item or cell_item == start_item or cell_item == end_item:
set_cell_item(Vector3i(x, 2, z), -1)
@@ -12,6 +12,7 @@
[ext_resource type="BoxMesh" uid="uid://dy5p77cjb3geo" path="res://addons/enhanced_gridmap/meshlibrary/tile_start.tres" id="9_pgnbl"]
[ext_resource type="ArrayMesh" uid="uid://dtr46jmckif0p" path="res://assets/models/meshes/block.res" id="9_uwjsj"]
[ext_resource type="Texture2D" uid="uid://dpkx1a780pvwv" path="res://assets/textures/tile_diamond.png" id="10_sx8rm"]
[ext_resource type="BoxMesh" uid="uid://fy4bhoeii40c" path="res://addons/enhanced_gridmap/meshlibrary/tile_safe_zone.tres" id="10_uwjsj"]
[ext_resource type="BoxMesh" uid="uid://b5cc3prem52r6" path="res://addons/enhanced_gridmap/meshlibrary/tile_freeze.tres" id="11_pgnbl"]
[ext_resource type="BoxMesh" uid="uid://dcjdwbffgtutt" path="res://addons/enhanced_gridmap/meshlibrary/tile_non_walkable.tres" id="11_uwjsj"]
@@ -80,6 +81,7 @@ item/1/shapes = []
item/1/navigation_mesh_transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0)
item/1/navigation_layers = 1
item/2/name = "safe_zone"
item/2/mesh = ExtResource("10_uwjsj")
item/2/mesh_transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0)
item/2/mesh_cast_shadow = 1
item/2/shapes = []
@@ -1,6 +1,7 @@
[gd_resource type="BoxMesh" format=3 uid="uid://fy4bhoeii40c"]
[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_ou2ex"]
transparency = 1
albedo_color = Color(0.38039216, 1, 0.33333334, 1)
[resource]
@@ -4,6 +4,7 @@
[ext_resource type="Texture2D" uid="uid://d2t23a885h1i0" path="res://assets/graphics/vfx/effects/freeze.png" id="2_gsxsy"]
[ext_resource type="Texture2D" uid="uid://lykg7d54qrof" path="res://assets/graphics/vfx/effects/ghost.png" id="3_hg3tj"]
[ext_resource type="Texture2D" uid="uid://45twcoribm0b" path="res://assets/graphics/vfx/effects/speed.png" id="4_8bjou"]
[ext_resource type="Texture2D" uid="uid://c718e7y7qm03x" path="res://assets/graphics/vfx/effects/bullrun_ui.png" id="5_gsxsy"]
[ext_resource type="Texture2D" uid="uid://dun5j8mrxpumo" path="res://assets/graphics/vfx/effects/stunned.png" id="5_jmlpd"]
[ext_resource type="Texture2D" uid="uid://mnsqay5hs0jh" path="res://assets/graphics/vfx/effects/wall.png" id="6_q227o"]
@@ -1967,6 +1968,198 @@ region = Rect2(1000, 1750, 125, 125)
atlas = ExtResource("4_8bjou")
region = Rect2(1125, 1750, 125, 125)
[sub_resource type="AtlasTexture" id="AtlasTexture_hg3tj"]
atlas = ExtResource("5_gsxsy")
region = Rect2(0, 0, 682, 512)
[sub_resource type="AtlasTexture" id="AtlasTexture_8bjou"]
atlas = ExtResource("5_gsxsy")
region = Rect2(682, 0, 682, 512)
[sub_resource type="AtlasTexture" id="AtlasTexture_jmlpd"]
atlas = ExtResource("5_gsxsy")
region = Rect2(1364, 0, 682, 512)
[sub_resource type="AtlasTexture" id="AtlasTexture_q227o"]
atlas = ExtResource("5_gsxsy")
region = Rect2(2046, 0, 682, 512)
[sub_resource type="AtlasTexture" id="AtlasTexture_oaoac"]
atlas = ExtResource("5_gsxsy")
region = Rect2(2728, 0, 682, 512)
[sub_resource type="AtlasTexture" id="AtlasTexture_xpe87"]
atlas = ExtResource("5_gsxsy")
region = Rect2(3410, 0, 682, 512)
[sub_resource type="AtlasTexture" id="AtlasTexture_adqj4"]
atlas = ExtResource("5_gsxsy")
region = Rect2(0, 512, 682, 512)
[sub_resource type="AtlasTexture" id="AtlasTexture_5m36t"]
atlas = ExtResource("5_gsxsy")
region = Rect2(682, 512, 682, 512)
[sub_resource type="AtlasTexture" id="AtlasTexture_ng11y"]
atlas = ExtResource("5_gsxsy")
region = Rect2(1364, 512, 682, 512)
[sub_resource type="AtlasTexture" id="AtlasTexture_d36hw"]
atlas = ExtResource("5_gsxsy")
region = Rect2(2046, 512, 682, 512)
[sub_resource type="AtlasTexture" id="AtlasTexture_u4va7"]
atlas = ExtResource("5_gsxsy")
region = Rect2(2728, 512, 682, 512)
[sub_resource type="AtlasTexture" id="AtlasTexture_tvg0i"]
atlas = ExtResource("5_gsxsy")
region = Rect2(3410, 512, 682, 512)
[sub_resource type="AtlasTexture" id="AtlasTexture_xu137"]
atlas = ExtResource("5_gsxsy")
region = Rect2(0, 1024, 682, 512)
[sub_resource type="AtlasTexture" id="AtlasTexture_0sktw"]
atlas = ExtResource("5_gsxsy")
region = Rect2(682, 1024, 682, 512)
[sub_resource type="AtlasTexture" id="AtlasTexture_0k7wr"]
atlas = ExtResource("5_gsxsy")
region = Rect2(1364, 1024, 682, 512)
[sub_resource type="AtlasTexture" id="AtlasTexture_2g3nj"]
atlas = ExtResource("5_gsxsy")
region = Rect2(2046, 1024, 682, 512)
[sub_resource type="AtlasTexture" id="AtlasTexture_e00q3"]
atlas = ExtResource("5_gsxsy")
region = Rect2(2728, 1024, 682, 512)
[sub_resource type="AtlasTexture" id="AtlasTexture_xefxw"]
atlas = ExtResource("5_gsxsy")
region = Rect2(3410, 1024, 682, 512)
[sub_resource type="AtlasTexture" id="AtlasTexture_7f71x"]
atlas = ExtResource("5_gsxsy")
region = Rect2(0, 1536, 682, 512)
[sub_resource type="AtlasTexture" id="AtlasTexture_lcyov"]
atlas = ExtResource("5_gsxsy")
region = Rect2(682, 1536, 682, 512)
[sub_resource type="AtlasTexture" id="AtlasTexture_iy2fp"]
atlas = ExtResource("5_gsxsy")
region = Rect2(1364, 1536, 682, 512)
[sub_resource type="AtlasTexture" id="AtlasTexture_2ahmr"]
atlas = ExtResource("5_gsxsy")
region = Rect2(2046, 1536, 682, 512)
[sub_resource type="AtlasTexture" id="AtlasTexture_1fdg2"]
atlas = ExtResource("5_gsxsy")
region = Rect2(2728, 1536, 682, 512)
[sub_resource type="AtlasTexture" id="AtlasTexture_8m0vd"]
atlas = ExtResource("5_gsxsy")
region = Rect2(3410, 1536, 682, 512)
[sub_resource type="AtlasTexture" id="AtlasTexture_y1kkk"]
atlas = ExtResource("5_gsxsy")
region = Rect2(0, 2048, 682, 512)
[sub_resource type="AtlasTexture" id="AtlasTexture_k4uv6"]
atlas = ExtResource("5_gsxsy")
region = Rect2(682, 2048, 682, 512)
[sub_resource type="AtlasTexture" id="AtlasTexture_juism"]
atlas = ExtResource("5_gsxsy")
region = Rect2(1364, 2048, 682, 512)
[sub_resource type="AtlasTexture" id="AtlasTexture_1fe7s"]
atlas = ExtResource("5_gsxsy")
region = Rect2(2046, 2048, 682, 512)
[sub_resource type="AtlasTexture" id="AtlasTexture_qh3vq"]
atlas = ExtResource("5_gsxsy")
region = Rect2(2728, 2048, 682, 512)
[sub_resource type="AtlasTexture" id="AtlasTexture_edbcw"]
atlas = ExtResource("5_gsxsy")
region = Rect2(3410, 2048, 682, 512)
[sub_resource type="AtlasTexture" id="AtlasTexture_tsdhc"]
atlas = ExtResource("5_gsxsy")
region = Rect2(0, 2560, 682, 512)
[sub_resource type="AtlasTexture" id="AtlasTexture_pmelt"]
atlas = ExtResource("5_gsxsy")
region = Rect2(682, 2560, 682, 512)
[sub_resource type="AtlasTexture" id="AtlasTexture_s51m1"]
atlas = ExtResource("5_gsxsy")
region = Rect2(1364, 2560, 682, 512)
[sub_resource type="AtlasTexture" id="AtlasTexture_gxmnc"]
atlas = ExtResource("5_gsxsy")
region = Rect2(2046, 2560, 682, 512)
[sub_resource type="AtlasTexture" id="AtlasTexture_fp82g"]
atlas = ExtResource("5_gsxsy")
region = Rect2(2728, 2560, 682, 512)
[sub_resource type="AtlasTexture" id="AtlasTexture_nrflg"]
atlas = ExtResource("5_gsxsy")
region = Rect2(3410, 2560, 682, 512)
[sub_resource type="AtlasTexture" id="AtlasTexture_ed58s"]
atlas = ExtResource("5_gsxsy")
region = Rect2(0, 3072, 682, 512)
[sub_resource type="AtlasTexture" id="AtlasTexture_vmbou"]
atlas = ExtResource("5_gsxsy")
region = Rect2(682, 3072, 682, 512)
[sub_resource type="AtlasTexture" id="AtlasTexture_3tqxh"]
atlas = ExtResource("5_gsxsy")
region = Rect2(1364, 3072, 682, 512)
[sub_resource type="AtlasTexture" id="AtlasTexture_jgcx2"]
atlas = ExtResource("5_gsxsy")
region = Rect2(2046, 3072, 682, 512)
[sub_resource type="AtlasTexture" id="AtlasTexture_ydiin"]
atlas = ExtResource("5_gsxsy")
region = Rect2(2728, 3072, 682, 512)
[sub_resource type="AtlasTexture" id="AtlasTexture_3vg2t"]
atlas = ExtResource("5_gsxsy")
region = Rect2(3410, 3072, 682, 512)
[sub_resource type="AtlasTexture" id="AtlasTexture_u84fk"]
atlas = ExtResource("5_gsxsy")
region = Rect2(0, 3584, 682, 512)
[sub_resource type="AtlasTexture" id="AtlasTexture_3qpd2"]
atlas = ExtResource("5_gsxsy")
region = Rect2(682, 3584, 682, 512)
[sub_resource type="AtlasTexture" id="AtlasTexture_ultdv"]
atlas = ExtResource("5_gsxsy")
region = Rect2(1364, 3584, 682, 512)
[sub_resource type="AtlasTexture" id="AtlasTexture_4nprg"]
atlas = ExtResource("5_gsxsy")
region = Rect2(2046, 3584, 682, 512)
[sub_resource type="AtlasTexture" id="AtlasTexture_piqxh"]
atlas = ExtResource("5_gsxsy")
region = Rect2(2728, 3584, 682, 512)
[sub_resource type="AtlasTexture" id="AtlasTexture_qk02p"]
atlas = ExtResource("5_gsxsy")
region = Rect2(3410, 3584, 682, 512)
[sub_resource type="AtlasTexture" id="AtlasTexture_yi8v5"]
atlas = ExtResource("5_jmlpd")
region = Rect2(0, 0, 284, 284)
@@ -4306,6 +4499,155 @@ animations = [{
}, {
"frames": [{
"duration": 1.0,
"texture": SubResource("AtlasTexture_hg3tj")
}, {
"duration": 1.0,
"texture": SubResource("AtlasTexture_8bjou")
}, {
"duration": 1.0,
"texture": SubResource("AtlasTexture_jmlpd")
}, {
"duration": 1.0,
"texture": SubResource("AtlasTexture_q227o")
}, {
"duration": 1.0,
"texture": SubResource("AtlasTexture_oaoac")
}, {
"duration": 1.0,
"texture": SubResource("AtlasTexture_xpe87")
}, {
"duration": 1.0,
"texture": SubResource("AtlasTexture_adqj4")
}, {
"duration": 1.0,
"texture": SubResource("AtlasTexture_5m36t")
}, {
"duration": 1.0,
"texture": SubResource("AtlasTexture_ng11y")
}, {
"duration": 1.0,
"texture": SubResource("AtlasTexture_d36hw")
}, {
"duration": 1.0,
"texture": SubResource("AtlasTexture_u4va7")
}, {
"duration": 1.0,
"texture": SubResource("AtlasTexture_tvg0i")
}, {
"duration": 1.0,
"texture": SubResource("AtlasTexture_xu137")
}, {
"duration": 1.0,
"texture": SubResource("AtlasTexture_0sktw")
}, {
"duration": 1.0,
"texture": SubResource("AtlasTexture_0k7wr")
}, {
"duration": 1.0,
"texture": SubResource("AtlasTexture_2g3nj")
}, {
"duration": 1.0,
"texture": SubResource("AtlasTexture_e00q3")
}, {
"duration": 1.0,
"texture": SubResource("AtlasTexture_xefxw")
}, {
"duration": 1.0,
"texture": SubResource("AtlasTexture_7f71x")
}, {
"duration": 1.0,
"texture": SubResource("AtlasTexture_lcyov")
}, {
"duration": 1.0,
"texture": SubResource("AtlasTexture_iy2fp")
}, {
"duration": 1.0,
"texture": SubResource("AtlasTexture_2ahmr")
}, {
"duration": 1.0,
"texture": SubResource("AtlasTexture_1fdg2")
}, {
"duration": 1.0,
"texture": SubResource("AtlasTexture_8m0vd")
}, {
"duration": 1.0,
"texture": SubResource("AtlasTexture_y1kkk")
}, {
"duration": 1.0,
"texture": SubResource("AtlasTexture_k4uv6")
}, {
"duration": 1.0,
"texture": SubResource("AtlasTexture_juism")
}, {
"duration": 1.0,
"texture": SubResource("AtlasTexture_1fe7s")
}, {
"duration": 1.0,
"texture": SubResource("AtlasTexture_qh3vq")
}, {
"duration": 1.0,
"texture": SubResource("AtlasTexture_edbcw")
}, {
"duration": 1.0,
"texture": SubResource("AtlasTexture_tsdhc")
}, {
"duration": 1.0,
"texture": SubResource("AtlasTexture_pmelt")
}, {
"duration": 1.0,
"texture": SubResource("AtlasTexture_s51m1")
}, {
"duration": 1.0,
"texture": SubResource("AtlasTexture_gxmnc")
}, {
"duration": 1.0,
"texture": SubResource("AtlasTexture_fp82g")
}, {
"duration": 1.0,
"texture": SubResource("AtlasTexture_nrflg")
}, {
"duration": 1.0,
"texture": SubResource("AtlasTexture_ed58s")
}, {
"duration": 1.0,
"texture": SubResource("AtlasTexture_vmbou")
}, {
"duration": 1.0,
"texture": SubResource("AtlasTexture_3tqxh")
}, {
"duration": 1.0,
"texture": SubResource("AtlasTexture_jgcx2")
}, {
"duration": 1.0,
"texture": SubResource("AtlasTexture_ydiin")
}, {
"duration": 1.0,
"texture": SubResource("AtlasTexture_3vg2t")
}, {
"duration": 1.0,
"texture": SubResource("AtlasTexture_u84fk")
}, {
"duration": 1.0,
"texture": SubResource("AtlasTexture_3qpd2")
}, {
"duration": 1.0,
"texture": SubResource("AtlasTexture_ultdv")
}, {
"duration": 1.0,
"texture": SubResource("AtlasTexture_4nprg")
}, {
"duration": 1.0,
"texture": SubResource("AtlasTexture_piqxh")
}, {
"duration": 1.0,
"texture": SubResource("AtlasTexture_qk02p")
}],
"loop": true,
"name": &"stop-phase",
"speed": 30.0
}, {
"frames": [{
"duration": 1.0,
"texture": SubResource("AtlasTexture_yi8v5")
}, {
"duration": 1.0,
@@ -24,7 +24,7 @@ compress/rdo_quality_loss=0.0
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=false
mipmaps/generate=true
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
@@ -38,4 +38,4 @@ 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
detect_3d/compress_to=0
Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

@@ -0,0 +1,40 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://sthm2v27rgyt"
path="res://.godot/imported/1.png-de2857755dd5de354edd5522932d810d.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://assets/graphics/vfx/stop_n_go/1.png"
dest_files=["res://.godot/imported/1.png-de2857755dd5de354edd5522932d810d.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
Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

@@ -0,0 +1,40 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://rptj4ywi1tms"
path="res://.godot/imported/2.png-9d3a83015cd201ee197011ceb6d42fb1.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://assets/graphics/vfx/stop_n_go/2.png"
dest_files=["res://.godot/imported/2.png-9d3a83015cd201ee197011ceb6d42fb1.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
Binary file not shown.

After

Width:  |  Height:  |  Size: 22 KiB

@@ -0,0 +1,40 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://dxsy87v04oytl"
path="res://.godot/imported/3.png-011462d22e36460421c5ea9540562f82.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://assets/graphics/vfx/stop_n_go/3.png"
dest_files=["res://.godot/imported/3.png-011462d22e36460421c5ea9540562f82.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
Binary file not shown.

After

Width:  |  Height:  |  Size: 76 KiB

@@ -0,0 +1,40 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://c63euesgl1gi5"
path="res://.godot/imported/bull_warning.png-94b94c984b16c0cd5fbc02d0e2cc731d.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://assets/graphics/vfx/stop_n_go/bull_warning.png"
dest_files=["res://.godot/imported/bull_warning.png-94b94c984b16c0cd5fbc02d0e2cc731d.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
Binary file not shown.

After

Width:  |  Height:  |  Size: 86 KiB

@@ -0,0 +1,40 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://ciisxcnnh4b3b"
path="res://.godot/imported/go.png-135d17710334216e8e3a1701b67c3dfd.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://assets/graphics/vfx/stop_n_go/go.png"
dest_files=["res://.godot/imported/go.png-135d17710334216e8e3a1701b67c3dfd.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
Binary file not shown.

After

Width:  |  Height:  |  Size: 430 KiB

@@ -0,0 +1,40 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://c6kisheilvgfp"
path="res://.godot/imported/safezone_appear.png-b4d9c3bf6ea84a571d25c2f77c377a7e.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://assets/graphics/vfx/stop_n_go/safezone_appear.png"
dest_files=["res://.godot/imported/safezone_appear.png-b4d9c3bf6ea84a571d25c2f77c377a7e.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
Binary file not shown.

After

Width:  |  Height:  |  Size: 251 KiB

@@ -0,0 +1,40 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://cat0vd2afn465"
path="res://.godot/imported/times_up_muter.png-2c113d01226305762c7f0419f4b82889.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://assets/graphics/vfx/stop_n_go/times_up_muter.png"
dest_files=["res://.godot/imported/times_up_muter.png-2c113d01226305762c7f0419f4b82889.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
Binary file not shown.

After

Width:  |  Height:  |  Size: 52 KiB

@@ -0,0 +1,40 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://d2pgt0grjgfx3"
path="res://.godot/imported/timesup.png-7ec99c53c29ab2cd560a4c4c1015dd87.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://assets/graphics/vfx/stop_n_go/timesup.png"
dest_files=["res://.godot/imported/timesup.png-7ec99c53c29ab2cd560a4c4c1015dd87.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
Binary file not shown.

After

Width:  |  Height:  |  Size: 10 KiB

@@ -0,0 +1,40 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://kvhu1exp34m1"
path="res://.godot/imported/timesup_bg.png-4a3fd9745629cd2ade5fa992b587e9b4.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://assets/graphics/vfx/stop_n_go/timesup_bg.png"
dest_files=["res://.godot/imported/timesup_bg.png-4a3fd9745629cd2ade5fa992b587e9b4.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
+3 -3
View File
@@ -92,6 +92,9 @@ current = true
fov = 21.0
size = 15.0
[node name="WorldEnvironment" type="WorldEnvironment" parent="." unique_id=12971344]
environment = ExtResource("4_ky38j")
[node name="PlayerboardPanel" type="PanelContainer" parent="." unique_id=1098203639]
material = SubResource("ShaderMaterial_j8jky")
anchors_preset = 4
@@ -1140,9 +1143,6 @@ theme_override_styles/focus = SubResource("StyleBoxFlat_1cewu")
placeholder_text = "Chat"
alignment = 1
[node name="WorldEnvironment" type="WorldEnvironment" parent="." unique_id=12971344]
environment = ExtResource("4_ky38j")
[node name="MessageBar" type="PanelContainer" parent="." unique_id=142729129]
visible = false
anchors_preset = 2
+7 -4
View File
@@ -621,10 +621,13 @@ func receive_spawn_positions_update(occupied_positions: Array):
highlighted_spawn_points.erase(pos)
if enhanced_gridmap:
# Clear the highlight from Layer 2 (Overlay) instead of overwriting Floor 0
enhanced_gridmap.set_cell_item(
Vector3i(pos.x, 2, pos.y),
-1
)
# PROTECTION: Never clear if it's a Safe Zone (ID 2)
var current_l2 = enhanced_gridmap.get_cell_item(Vector3i(pos.x, 2, pos.y))
if current_l2 != 2:
enhanced_gridmap.set_cell_item(
Vector3i(pos.x, 2, pos.y),
-1
)
# Now highlight available positions
highlight_available_spawn_points()
+2 -13
View File
@@ -31,17 +31,8 @@ spacing_glyph = 5
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 2.5, 0)
collision_layer = 2
script = ExtResource("1_qecr4")
is_bot = null
enhanced_gridmap_path = null
current_position = null
cell_size = Vector3(1, 1, 1)
cell_offset = null
goals = null
playerboard = null
movement_range = null
use_diagonal_movement = true
is_my_turn = null
has_moved_this_turn = null
[node name="Masbro" parent="." unique_id=1585899496 instance=ExtResource("2_mjsl8")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, -0.485, 0)
@@ -151,9 +142,7 @@ transform = Transform3D(1, 0, 0, 0, -4.371139e-08, -1, 0, 1, -4.371139e-08, 0, 1
visible = false
billboard = 1
sprite_frames = ExtResource("10_y4r1p")
animation = &"wall-initiator"
frame = 149
frame_progress = 1.0
animation = &"stop-phase"
[node name="receiver_skill_stunned" type="AnimatedSprite3D" parent="." unique_id=56953581]
transform = Transform3D(0.5, 0, 0, 0, -2.1855694e-08, -0.5, 0, 0.5, -2.1855694e-08, 0, 1.5653763, 0)
@@ -168,7 +157,7 @@ frame_progress = 1.0
transform = Transform3D(0.5, 0, 0, 0, -2.1855694e-08, -0.5, 0, 0.5, -2.1855694e-08, 0, 1.5653763, 0)
visible = false
sprite_frames = ExtResource("10_y4r1p")
animation = &"freeze-initiator"
animation = &"attack-mode-receiver-top"
[node name="attack_mode_bot" type="AnimatedSprite3D" parent="." unique_id=1320274503]
transform = Transform3D(1, 0, 0, 0, -4.371139e-08, -1, 0, 1, -4.371139e-08, 0, -0.6701627, 0)
+11
View File
@@ -0,0 +1,11 @@
[gd_scene format=3 uid="uid://dbqj67js76fa5"]
[node name="StopNGoAnimation" type="Control" unique_id=257399947]
layout_mode = 3
anchors_preset = 15
anchor_right = 1.0
anchor_bottom = 1.0
grow_horizontal = 2
grow_vertical = 2
[node name="AnimationPlayer" type="AnimationPlayer" parent="." unique_id=1614214519]
+2 -4
View File
@@ -181,10 +181,8 @@ func clear_highlights():
# Check Layer 2 (Overlay Highlight)
var l2_pos = Vector3i(cell.x, 2, cell.y)
var l2_item = enhanced_gridmap.get_cell_item(l2_pos)
# Only clear if it looks like a highlight (e.g. ID 1)
# or generally just clear layer 2 if we assume we own it for highlights?
# Safest is to check against hover_id or typical highlight IDs.
if l2_item != -1:
# Only clear if it is a highlight and NOT a Safe Zone (ID 2)
if l2_item != -1 and l2_item != 2:
enhanced_gridmap.set_cell_item(l2_pos, -1)
highlighted_cells.clear()
+22 -21
View File
@@ -99,18 +99,18 @@ func _process(delta):
if multiplayer.is_server():
if current_phase == Phase.GO:
var int_timer = int(ceil(phase_timer))
if int_timer == 3 and spawned_safe_zones == 0 and phase_timer <= 3.0:
_spawn_dynamic_safe_zone()
elif int_timer == 2 and spawned_safe_zones == 1 and phase_timer <= 2.0:
_spawn_dynamic_safe_zone()
elif int_timer == 1 and spawned_safe_zones == 2 and phase_timer <= 1.0:
_spawn_dynamic_safe_zone()
# Spawn all 3 safe zones at once, 3 seconds before STOP
if phase_timer <= 3.0 and spawned_safe_zones == 0:
print("[StopNGo] GO phase ending soon. Spawning 3 safe zones...")
for i in range(3):
_spawn_dynamic_safe_zone()
if phase_timer <= 0:
if current_phase == Phase.GO:
print("[StopNGo] GO Timer reached 0. Starting STOP Phase.")
_start_phase(Phase.STOP)
else:
print("[StopNGo] STOP Timer reached 0. Starting GO Phase.")
_start_phase(Phase.GO)
# Update HUD locally
@@ -499,8 +499,9 @@ func _is_in_safe_zone(pos: Vector2i) -> bool:
gridmap = get_node_or_null("/root/Main/EnhancedGridMap")
if not gridmap: return false
var floor_tile = gridmap.get_cell_item(Vector3i(pos.x, 0, pos.y))
return floor_tile == TILE_SAFE
# Check Layer 2 (Overlay layer) for Safe Zone tile
var overlay_tile = gridmap.get_cell_item(Vector3i(pos.x, 2, pos.y))
return overlay_tile == TILE_SAFE
func _spawn_dynamic_safe_zone():
if not multiplayer.is_server(): return
@@ -523,15 +524,17 @@ func _spawn_dynamic_safe_zone():
var rect = possible_rects.pick_random()
active_safe_zone_rects.append(rect)
spawned_safe_zones += 1
print("[StopNGo] Spawning Safe Zone %d at %s" % [spawned_safe_zones, rect])
# Paint floor to TILE_SAFE
# Paint Floor 2 (Overlay layer) to TILE_SAFE
# This allows seeing items below on Floor 1
for rx in range(rect.size.x):
for rz in range(rect.size.y):
var px = rect.position.x + rx
var pz = rect.position.y + rz
gridmap.set_cell_item(Vector3i(px, 0, pz), TILE_SAFE)
gridmap.set_cell_item(Vector3i(px, 2, pz), TILE_SAFE)
if can_rpc() and main:
main.rpc("sync_grid_item", px, 0, pz, TILE_SAFE)
main.rpc("sync_grid_item", px, 2, pz, TILE_SAFE)
func _is_valid_safe_zone_area(gridmap: Node, start_x: int, start_z: int, width: int, height: int) -> bool:
# Avoid bounds or start/finish cols
@@ -546,16 +549,12 @@ func _is_valid_safe_zone_area(gridmap: Node, start_x: int, start_z: int, width:
for x in range(start_x, start_x + width):
for z in range(start_z, start_z + height):
var floor_0 = gridmap.get_cell_item(Vector3i(x, 0, z))
var floor_1 = gridmap.get_cell_item(Vector3i(x, 1, z))
# Floor must be purely TILE_WALKABLE (0)
# We no longer check Floor 1 (items) so safe zones can spawn ON TOP of tiles
if floor_0 != TILE_WALKABLE:
return false
# Floor 1 must be empty (-1) - no items or obstacles
if floor_1 != -1:
return false
return true
func _clear_dynamic_safe_zones():
@@ -564,17 +563,19 @@ func _clear_dynamic_safe_zones():
if not gridmap: return
var main = get_node_or_null("/root/Main")
print("[StopNGo] Clearing %d active safe zones." % active_safe_zone_rects.size())
for rect in active_safe_zone_rects:
for rx in range(rect.size.x):
for rz in range(rect.size.y):
var px = rect.position.x + rx
var pz = rect.position.y + rz
# Only clear if it is actually still a safe zone
if gridmap.get_cell_item(Vector3i(px, 0, pz)) == TILE_SAFE:
gridmap.set_cell_item(Vector3i(px, 0, pz), TILE_WALKABLE)
# Only clear layer 2
if gridmap.get_cell_item(Vector3i(px, 2, pz)) == TILE_SAFE:
gridmap.set_cell_item(Vector3i(px, 2, pz), -1)
if can_rpc() and main:
main.rpc("sync_grid_item", px, 0, pz, TILE_WALKABLE)
main.rpc("sync_grid_item", px, 2, pz, -1)
active_safe_zone_rects.clear()
spawned_safe_zones = 0
+1 -1
View File
@@ -497,7 +497,7 @@ func _apply_settings():
"""Apply current settings to UI elements."""
# Apply joystick visibility
if virtual_joystick:
virtual_joystick.visible = joystick_enabled
virtual_joystick.visible = joystick_enabled and _is_touch_device()
# Apply touch buttons visibility - FORCED ON per request to "just show them"
# Apply touch buttons visibility