before fog of war

This commit is contained in:
2026-01-17 11:12:32 +01:00
parent 189dc2042c
commit 454c065cf3
9 changed files with 130 additions and 36 deletions

View File

@@ -3,6 +3,7 @@ extends Sprite2D
# Creates a simple shadow circle sprite at runtime
func _ready():
'
var size = 48 # Shadow size
var image = Image.create(size, size, false, Image.FORMAT_RGBA8)
@@ -20,5 +21,4 @@ func _ready():
# Create texture from image
texture = ImageTexture.create_from_image(image)
centered = true
centered = true'

View File

@@ -7,6 +7,8 @@ extends Node2D
@onready var network_manager = $"/root/NetworkManager"
var local_players = []
const BASE_CAMERA_ZOOM: float = 4.0
const REFERENCE_ASPECT: float = 16.0 / 9.0
# Dungeon generation
var dungeon_data: Dictionary = {}
@@ -97,6 +99,11 @@ func _send_gameworld_ready():
if not is_inside_tree():
return
if multiplayer.has_multiplayer_peer() and not multiplayer.is_server():
# Ensure host peer (1) is known before sending RPC to avoid errors on web
if 1 not in multiplayer.get_peers():
# Retry shortly; host peer may not be registered yet
get_tree().create_timer(0.2).timeout.connect(func(): _send_gameworld_ready())
return
var peer_id = multiplayer.get_unique_id()
_notify_gameworld_ready.rpc_id(1, peer_id)
@@ -917,6 +924,16 @@ func _update_camera():
# Smooth camera movement
camera.position = camera.position.lerp(center, 0.1)
# Base zoom with aspect ratio adjustment (show more on wider screens)
var viewport_size = get_viewport().get_visible_rect().size
var aspect = viewport_size.x / max(1.0, viewport_size.y)
var aspect_factor = 1.0
if aspect > REFERENCE_ASPECT:
# Wider than 16:9 -> zoom out to show more
aspect_factor = REFERENCE_ASPECT / aspect
var target_zoom = BASE_CAMERA_ZOOM * aspect_factor
# Adjust zoom based on player spread (for split-screen effect)
if local_players.size() > 1:
var max_distance = 0.0
@@ -925,8 +942,10 @@ func _update_camera():
max_distance = max(max_distance, distance)
# Adjust zoom to fit all players
var target_zoom = clamp(800.0 / (max_distance + 400.0), 0.5, 1.5)
camera.zoom = camera.zoom.lerp(Vector2.ONE * target_zoom, 0.05)
var spread_zoom = clamp(800.0 / (max_distance + 400.0), 0.5, 1.5)
target_zoom *= spread_zoom
camera.zoom = camera.zoom.lerp(Vector2.ONE * target_zoom, 0.05)
func _generate_dungeon():
print("GameWorld: _generate_dungeon() called - is_server: ", multiplayer.is_server(), ", has_peer: ", multiplayer.has_multiplayer_peer())

View File

@@ -24,6 +24,7 @@ var level_start_time: float = 0.0
var player_search_attempts: int = 0
var max_player_search_attempts: int = 100 # Limit retries to prevent infinite recursion
var timer_running: bool = true # Flag to stop/start timer
const HUD_BASE_SIZE: Vector2 = Vector2(1280, 720)
func _ready():
print("IngameHUD: _ready() called")
@@ -80,6 +81,10 @@ func _ready():
# Start level timer
level_start_time = Time.get_ticks_msec() / 1000.0
# Keep HUD text crisp with integer scaling
_update_hud_scale()
get_viewport().size_changed.connect(_update_hud_scale)
# Find local player (with retry limit)
player_search_attempts = 0
_find_local_player()
@@ -184,6 +189,14 @@ func _process(_delta):
# Update boss health (if boss exists)
_update_boss_health()
func _update_hud_scale():
# Scale HUD to an integer factor to keep pixel text crisp
var viewport_size = get_viewport().get_visible_rect().size
var scale_factor = int(floor(min(viewport_size.x / HUD_BASE_SIZE.x, viewport_size.y / HUD_BASE_SIZE.y)))
if scale_factor < 1:
scale_factor = 1
scale = Vector2.ONE * scale_factor
func _update_player_health():
if not local_player or not texture_progress_bar_hp:
return

View File

@@ -162,6 +162,19 @@ func _handle_air_collision():
var collision = get_slide_collision(i)
var collider = collision.get_collider()
# Pot special case: break on wall collision
if object_type == "Pot" and _is_wall_collider(collider):
# Only process on server to prevent duplicates
if not multiplayer.is_server():
continue
if is_destroyable:
if multiplayer.has_multiplayer_peer():
var game_world = get_tree().get_first_node_in_group("game_world")
if game_world and game_world.has_method("_rpc_to_ready_peers"):
game_world._rpc_to_ready_peers("_sync_object_break", [name])
_break_into_pieces()
return
# Hit an enemy! Damage them
if collider.is_in_group("enemy"):
# Only process collision on server to prevent duplicates
@@ -325,6 +338,17 @@ func _break_into_pieces(silent: bool = false):
# Remove self
queue_free()
func _is_wall_collider(collider) -> bool:
if not collider:
return false
# TileMapLayer collisions
if collider is TileMapLayer:
return true
# Any CollisionObject2D with wall layer (7) enabled
if collider is CollisionObject2D and collider.get_collision_layer_value(7):
return true
return false
func can_be_grabbed() -> bool:
return is_grabbable and not is_being_held