before fog of war
This commit is contained in:
@@ -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'
|
||||
|
||||
@@ -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())
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
Reference in New Issue
Block a user