diff --git a/addons/godot-git-plugin/win64/~libgit_plugin.windows.editor.x86_64.dll b/addons/godot-git-plugin/win64/~libgit_plugin.windows.editor.x86_64.dll deleted file mode 100644 index 47bbb1d..0000000 Binary files a/addons/godot-git-plugin/win64/~libgit_plugin.windows.editor.x86_64.dll and /dev/null differ diff --git a/scripts/isometric_map_layer_holder.gd b/scripts/isometric_map_layer_holder.gd index f0f3064..a13e7b0 100644 --- a/scripts/isometric_map_layer_holder.gd +++ b/scripts/isometric_map_layer_holder.gd @@ -51,7 +51,8 @@ func _input(event: InputEvent) -> void: # Set a player reference func set_player(player): player_controller = IsometricPlayerController.new(player, map_data, map_renderer) - + player.set_map_renderer(map_renderer) + # Initialize player position func init_player(): return player_controller.init_player() diff --git a/scripts/isometric_map_renderer.gd b/scripts/isometric_map_renderer.gd index 220154e..251e9ab 100644 --- a/scripts/isometric_map_renderer.gd +++ b/scripts/isometric_map_renderer.gd @@ -8,6 +8,35 @@ var highlighted_tiles = {} # Dictionary to store all currently highlighted tile var TILE_SIZE_ISOMETRIC_X = 32 # in px var TILE_SIZE_ISOMETRIC_Y = 16 # in px +var unit_is_hovered = false + + +var darkening_active = false +var original_modulates = {} + +func darken_all_except_player(player_node): + darkening_active = true + + # Store original modulate values + for layer in isometric_map_layers: + original_modulates[layer] = layer.modulate + # Darken the layer + layer.modulate = Color(0.5, 0.5, 0.5, 1.0) + + # Keep player at normal brightness + player_node.modulate = Color(1.0, 1.0, 1.0, 1.0) + +func reset_darkening(): + darkening_active = false + + # Restore original modulate values + for layer in isometric_map_layers: + if layer in original_modulates: + layer.modulate = original_modulates[layer] + +func set_unit_hover_state(is_hovered): + unit_is_hovered = is_hovered + # Initialize with reference to a map data object and a tilemap to use as template func _init(map_data_ref, tilemap_template): map_data = map_data_ref @@ -57,6 +86,25 @@ func handle_hover(mouse_position): var hover_tile_position = isometric_map_layers[0].local_to_map(mouse_position) var new_highlighted_tiles = {} # Will store tiles to highlight this frame + if unit_is_hovered: + # De-highlight all tiles + for tile_key in highlighted_tiles: + var tile_data = highlighted_tiles[tile_key] + var tile = map_data.get_tile(tile_data.x, tile_data.y, tile_data.z) + + if tile != null and tile["visibility"] and not tile["unit"]: + if not tile["selected"]: + if tile["atlas_base_position"] != null: + isometric_map_layers[tile_data.z].set_cell( + Vector2i(tile["x"], tile["y"]), + IsometricMapSystem.MAIN_SOURCE_ID, + tile["atlas_base_position"] + ) + tile["highlighted"] = false + + highlighted_tiles = {} + return + # First find all tiles that should be highlighted for z in map_data.GRID_SIZE_HEIGHT: for x in map_data.GRID_SIZE_WIDTH: diff --git a/scripts/player.gd b/scripts/player.gd index b9fd6fa..ca92ade 100644 --- a/scripts/player.gd +++ b/scripts/player.gd @@ -4,9 +4,16 @@ extends CharacterBody2D @onready var animated_sprite: AnimatedSprite2D = $AnimatedSprite2D @onready var player: CharacterBody2D = $"." -var hovered_unit = null +var hovered = null +var selected = null var hover_indicator = preload("res://assets/sprites/ui/ui_icons_green_down4.png") +var selected_indicator = preload("res://assets/sprites/ui/ui_icons_blue_down4.png") + +var map_renderer = null + +func set_map_renderer(renderer): + map_renderer = renderer func _ready(): @@ -18,12 +25,30 @@ func _ready(): hover_sprite.z_index = 100 player.add_child(hover_sprite) +func toggle_selection(): + selected = !selected + if selected: + get_node("HoverIndicator").texture = selected_indicator + # Tell the map renderer to darken everything + if map_renderer: + map_renderer.darken_all_except_player(self) + else: + get_node("HoverIndicator").texture = hover_indicator + # Reset darkening + if map_renderer: + map_renderer.reset_darkening() + + # Keep indicator visible when selected + get_node("HoverIndicator").visible = selected or hovered == player + var player_data = { "stats": { "health": 100, + "mana": 100, "speed": 3, "attack": 10, - "defense": 5 + "defense": 5, + "actionpoints": 5, }, "inventory": [], "name": "Hero" @@ -32,13 +57,20 @@ func _input(event): if event is InputEventMouseMotion: check_hover() +func _unhandled_input(event): + if event is InputEventMouseButton and event.button_index == MOUSE_BUTTON_LEFT and event.pressed: + # If we're being hovered and clicked + if hovered == player: + toggle_selection() + func check_hover(): var mouse_pos = get_global_mouse_position() - print("Mouse pos: ", mouse_pos, " Player pos: ", player.position) + var was_hovered = hovered != null + # print("Mouse pos: ", mouse_pos, " Player pos: ", player.position) - if hovered_unit: - hovered_unit.get_node("HoverIndicator").visible = false - hovered_unit = null + if hovered: + hovered.get_node("HoverIndicator").visible = false + hovered = null if player.has_node("CollisionShape2D"): var collision = player.get_node("CollisionShape2D") @@ -50,21 +82,28 @@ func check_hover(): var extents = shape.extents if local_pos.x >= -extents.x and local_pos.x <= extents.x and \ local_pos.y >= -extents.y and local_pos.y <= extents.y: - hovered_unit = player + hovered = player player.get_node("HoverIndicator").visible = true + if (was_hovered != (hovered != null)) and map_renderer: + map_renderer.set_unit_hover_state(hovered != null) + func set_unit_position(x, y, z): var z_layer = z - #var x_position = x var x_position = x + 16 - var y_position = y - #var y_position = y + get_sprite_size().size.y/2 + var y_position = y + + # Update the main node position + global_position = Vector2(x_position, y_position) + # Update the visual z-index directly animated_sprite.z_index = z_layer - animated_sprite.position = Vector2i(x_position, y_position) - print("Palyer Global Pos: ", animated_sprite.position) - print("Palyer Z-Layer: ", z_layer) + # Keep sprite centered at node position + animated_sprite.position = Vector2.ZERO + + print("Player Z-Layer: ", z_layer) + print("Player position updated to: ", global_position) func get_sprite_size(): return collision_shape_2d.shape