feat: Implement Stop N Go game mode with a new manager script and associated gridmap assets within the MeshLibrary.
This commit is contained in:
@@ -10,6 +10,7 @@
|
|||||||
[ext_resource type="ArrayMesh" uid="uid://bqvqj3fhf5x51" path="res://assets/models/tiles/tile_ghost.tres" id="6_r32il"]
|
[ext_resource type="ArrayMesh" uid="uid://bqvqj3fhf5x51" path="res://assets/models/tiles/tile_ghost.tres" id="6_r32il"]
|
||||||
[ext_resource type="ArrayMesh" uid="uid://cv4bedhida00g" path="res://assets/models/tiles/tile_star.tres" id="7_p5epg"]
|
[ext_resource type="ArrayMesh" uid="uid://cv4bedhida00g" path="res://assets/models/tiles/tile_star.tres" id="7_p5epg"]
|
||||||
[ext_resource type="ArrayMesh" uid="uid://gpnl4cjrivor" path="res://assets/models/tiles/tile_speed.tres" id="7_sx8rm"]
|
[ext_resource type="ArrayMesh" uid="uid://gpnl4cjrivor" path="res://assets/models/tiles/tile_speed.tres" id="7_sx8rm"]
|
||||||
|
[ext_resource type="ArrayMesh" uid="uid://onkud44h3we1" path="res://assets/models/meshes/safe_zone.res" id="8_cg50n"]
|
||||||
[ext_resource type="ArrayMesh" uid="uid://dx41n2x8v30r1" path="res://assets/models/meshes/crack.res" id="10_r32il"]
|
[ext_resource type="ArrayMesh" uid="uid://dx41n2x8v30r1" path="res://assets/models/meshes/crack.res" id="10_r32il"]
|
||||||
[ext_resource type="Texture2D" uid="uid://dpkx1a780pvwv" path="res://assets/textures/tile_diamond.png" id="10_sx8rm"]
|
[ext_resource type="Texture2D" uid="uid://dpkx1a780pvwv" path="res://assets/textures/tile_diamond.png" id="10_sx8rm"]
|
||||||
|
|
||||||
@@ -95,7 +96,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_mesh_transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0)
|
||||||
item/1/navigation_layers = 1
|
item/1/navigation_layers = 1
|
||||||
item/2/name = "safe_zone"
|
item/2/name = "safe_zone"
|
||||||
item/2/mesh = ExtResource("3_8v5xv")
|
item/2/mesh = ExtResource("8_cg50n")
|
||||||
item/2/mesh_transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0)
|
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/mesh_cast_shadow = 1
|
||||||
item/2/shapes = []
|
item/2/shapes = []
|
||||||
|
|||||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
|
After Width: | Height: | Size: 3.4 MiB |
@@ -0,0 +1,41 @@
|
|||||||
|
[remap]
|
||||||
|
|
||||||
|
importer="texture"
|
||||||
|
type="CompressedTexture2D"
|
||||||
|
uid="uid://cw1nmpknfgbuu"
|
||||||
|
path.s3tc="res://.godot/imported/start_n_finish.jpg-f99b3789c83f30a48c1d54337a904fe9.s3tc.ctex"
|
||||||
|
metadata={
|
||||||
|
"imported_formats": ["s3tc_bptc"],
|
||||||
|
"vram_texture": true
|
||||||
|
}
|
||||||
|
|
||||||
|
[deps]
|
||||||
|
|
||||||
|
source_file="res://assets/textures/start_n_finish.jpg"
|
||||||
|
dest_files=["res://.godot/imported/start_n_finish.jpg-f99b3789c83f30a48c1d54337a904fe9.s3tc.ctex"]
|
||||||
|
|
||||||
|
[params]
|
||||||
|
|
||||||
|
compress/mode=2
|
||||||
|
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=true
|
||||||
|
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=0
|
||||||
@@ -22,7 +22,8 @@ var finish_line_x: int = 21 # Right side of the map for win condition
|
|||||||
|
|
||||||
# Tile IDs
|
# Tile IDs
|
||||||
const TILE_WALKABLE = 0
|
const TILE_WALKABLE = 0
|
||||||
const TILE_START = 2 # Start Line
|
const TILE_START = 3 # Start Line
|
||||||
|
const TILE_FINISH = 3 # Finish Line
|
||||||
const TILE_SAFE = 2 # Green Safe Zone
|
const TILE_SAFE = 2 # Green Safe Zone
|
||||||
const TILE_OBSTACLE = 4 # Wall
|
const TILE_OBSTACLE = 4 # Wall
|
||||||
|
|
||||||
@@ -143,7 +144,7 @@ func _update_stop_timer_visuals():
|
|||||||
var hbox = stop_timer_node.get_node_or_null("HBox")
|
var hbox = stop_timer_node.get_node_or_null("HBox")
|
||||||
if hbox:
|
if hbox:
|
||||||
stop_segments.clear()
|
stop_segments.clear()
|
||||||
for i in range(4):
|
for i in range(3):
|
||||||
var seg = hbox.get_node_or_null("Segment%d" % i)
|
var seg = hbox.get_node_or_null("Segment%d" % i)
|
||||||
if seg: stop_segments.append(seg)
|
if seg: stop_segments.append(seg)
|
||||||
|
|
||||||
@@ -173,9 +174,9 @@ func _update_stop_timer_visuals():
|
|||||||
stop_timer_node.visible = true
|
stop_timer_node.visible = true
|
||||||
|
|
||||||
if current_phase == Phase.GO:
|
if current_phase == Phase.GO:
|
||||||
# GO Phase: All dim unless in last 4 seconds
|
# GO Phase: All dim unless in last 3 seconds
|
||||||
for i in range(stop_segments.size()):
|
for i in range(stop_segments.size()):
|
||||||
var threshold = 4.0 - i
|
var threshold = 3.0 - i
|
||||||
if phase_timer <= threshold:
|
if phase_timer <= threshold:
|
||||||
stop_segments[i].add_theme_stylebox_override("panel", lit_style)
|
stop_segments[i].add_theme_stylebox_override("panel", lit_style)
|
||||||
else:
|
else:
|
||||||
@@ -277,6 +278,8 @@ func _apply_arena_setup():
|
|||||||
var tile_id = TILE_WALKABLE
|
var tile_id = TILE_WALKABLE
|
||||||
if x == 0:
|
if x == 0:
|
||||||
tile_id = TILE_START
|
tile_id = TILE_START
|
||||||
|
elif x == gridmap.columns - 1:
|
||||||
|
tile_id = TILE_FINISH
|
||||||
elif x in safe_columns:
|
elif x in safe_columns:
|
||||||
tile_id = TILE_SAFE
|
tile_id = TILE_SAFE
|
||||||
|
|
||||||
@@ -352,16 +355,14 @@ func _spawn_mission_tiles():
|
|||||||
if base_tile == TILE_OBSTACLE:
|
if base_tile == TILE_OBSTACLE:
|
||||||
continue
|
continue
|
||||||
|
|
||||||
# Randomly populate other floors with goal tiles
|
# Spawn tiles on all floors (100% density)
|
||||||
# 30% chance to have a tile to avoid overcrowding
|
var tile_type = goal_items[randi() % goal_items.size()]
|
||||||
if randf() < 0.3:
|
gridmap.set_cell_item(Vector3i(x, 1, z), tile_type)
|
||||||
var tile_type = goal_items[randi() % goal_items.size()]
|
|
||||||
gridmap.set_cell_item(Vector3i(x, 1, z), tile_type)
|
# Sync to clients
|
||||||
|
var main = get_node("/root/Main")
|
||||||
# Sync to clients
|
if main:
|
||||||
var main = get_node("/root/Main")
|
main.rpc("sync_grid_item", x, 1, z, tile_type)
|
||||||
if main:
|
|
||||||
main.rpc("sync_grid_item", x, 1, z, tile_type)
|
|
||||||
|
|
||||||
func _assign_missions():
|
func _assign_missions():
|
||||||
# NO-OP: Missions are now achievement-based (Complete 3 Goals)
|
# NO-OP: Missions are now achievement-based (Complete 3 Goals)
|
||||||
@@ -384,7 +385,7 @@ func check_movement_violation(player_id: int, from: Vector2i, to: Vector2i) -> b
|
|||||||
# Usually implies checking if you ARE in a safe zone.
|
# Usually implies checking if you ARE in a safe zone.
|
||||||
var tile_from = gridmap.get_cell_item(Vector3i(from.x, 0, from.y))
|
var tile_from = gridmap.get_cell_item(Vector3i(from.x, 0, from.y))
|
||||||
|
|
||||||
if tile_from != TILE_SAFE:
|
if tile_from != TILE_SAFE and tile_from != TILE_START and tile_from != TILE_FINISH:
|
||||||
_penalize_player(player_id)
|
_penalize_player(player_id)
|
||||||
return true
|
return true
|
||||||
return false
|
return false
|
||||||
|
|||||||
Reference in New Issue
Block a user