diff --git a/scripts/enemies/anchor.gd b/scripts/enemies/anchor.gd index ec1843c..bf12dc1 100644 --- a/scripts/enemies/anchor.gd +++ b/scripts/enemies/anchor.gd @@ -99,13 +99,14 @@ func _do_anchored(delta: float) -> void: _shot_timer = SHOT_COOLDOWN func _fire_at_player() -> void: + # Fire at player's current position (not homing - player can dodge) var dir := (_player.global_position - global_position).normalized() var proj = ENEMY_PROJECTILE.instantiate() proj.position = (get_parent() as Node2D).to_local(global_position) proj.direction = dir - proj.speed = 120.0 + proj.speed = 180.0 # faster since not homing proj.damage = 1.0 proj.max_range = 720.0 - proj.homing = true - proj.homing_target = _player + proj.homing = false + AudioManager.play("enemy_shoot") get_parent().call_deferred("add_child", proj) \ No newline at end of file diff --git a/scripts/rooms/room.gd b/scripts/rooms/room.gd index 4758467..a6dad88 100644 --- a/scripts/rooms/room.gd +++ b/scripts/rooms/room.gd @@ -107,7 +107,6 @@ func activate() -> void: _spawn_shop() data.cleared = true RoomData.RoomType.START: - _spawn_entry_door() data.cleared = true _: data.cleared = true @@ -377,15 +376,6 @@ func _on_floor_exit_entered(body: Node) -> void: get_tree().call_deferred("change_scene_to_file", "res://scenes/run/floor.tscn") -func _spawn_entry_door() -> void: - # Decorative open door behind spawn point - shows "you entered from here" - # Positioned at bottom of room (player spawns in center, door behind them) - var entry_door := StationDoor.new() - entry_door.position = Vector2(0, ROOM_H / 2.0 - 80) # near bottom wall - entry_door.setup_entry_door() - contents.add_child(entry_door) - - func _spawn_body_part_drop() -> void: # 50% drop chance so body parts feel more valuable if randf() > 0.5: @@ -407,7 +397,14 @@ func _spawn_body_part_drop() -> void: contents.add_child(pickup) func _spawn_run_item() -> void: - var chosen: String = ALL_ITEM_PATHS[randi() % ALL_ITEM_PATHS.size()] + # Exclude Patch Kit from item rooms (shop-only item) + const PATCH_KIT_PATH := "res://data/run_items/patch_kit.tres" + var item_pool: Array[String] = [] + for p in ALL_ITEM_PATHS: + if p != PATCH_KIT_PATH: + item_pool.append(p) + + var chosen: String = item_pool[randi() % item_pool.size()] var pickup = RUN_ITEM_PICKUP.instantiate() pickup.item = load(chosen) pickup.position = Vector2.ZERO diff --git a/scripts/ui/mini_map.gd b/scripts/ui/mini_map.gd index cfbeaea..f850bdc 100644 --- a/scripts/ui/mini_map.gd +++ b/scripts/ui/mini_map.gd @@ -39,6 +39,7 @@ var _grid_min: Vector2i = Vector2i.ZERO var _grid_max: Vector2i = Vector2i.ZERO var _parallax_offset: Vector2 = Vector2.ZERO var _player: Node2D = null +var _revealed_positions: Array[Vector2i] = [] # rooms revealed by Fragmented Map # --------------------------------------------------------------------------- # Setup @@ -59,6 +60,7 @@ func _ready() -> void: EventBus.floor_map_ready.connect(_on_floor_map_ready) EventBus.room_entered_at.connect(_on_room_entered) EventBus.run_ended.connect(_on_run_ended) + EventBus.room_revealed.connect(_on_room_revealed) # --------------------------------------------------------------------------- # Signal handlers @@ -76,10 +78,22 @@ func _on_room_entered(grid_pos: Vector2i) -> void: func _on_run_ended(_reached_hub: bool) -> void: _rooms_data.clear() + _revealed_positions.clear() _player = null queue_redraw() +func _on_room_revealed() -> void: + # Fragmented Map effect: reveal types of adjacent unvisited rooms + if not _rooms_data.has(_current_pos): + return + var current_room: RoomData = _rooms_data[_current_pos] + for conn_pos in current_room.connections.values(): + if conn_pos not in _revealed_positions: + _revealed_positions.append(conn_pos) + queue_redraw() + + func _process(_delta: float) -> void: if _rooms_data.is_empty(): return @@ -195,9 +209,13 @@ func _draw() -> void: var rect := Rect2(map_pos, ROOM_SIZE) # Fog of war: unvisited rooms show as generic grey (hide type info) + # Exception: revealed rooms (Fragmented Map) show their type dimmed var color: Color if is_visited: color = ROOM_COLORS.get(room.type, ROOM_COLORS[RoomData.RoomType.COMBAT]) + elif pos in _revealed_positions: + color = ROOM_COLORS.get(room.type, ROOM_COLORS[RoomData.RoomType.COMBAT]) + color.a = UNVISITED_ALPHA else: color = UNVISITED_COLOR color.a = UNVISITED_ALPHA