diff options
-rw-r--r-- | client/map/map.gd | 6 | ||||
-rw-r--r-- | client/player/controllable_player.gd | 35 |
2 files changed, 34 insertions, 7 deletions
diff --git a/client/map/map.gd b/client/map/map.gd index 2b8dd651..fe8ddd66 100644 --- a/client/map/map.gd +++ b/client/map/map.gd @@ -18,13 +18,13 @@ class_name Map extends Node3D -var tile_by_pos: Dictionary = {} +var tile_by_pos: Dictionary = {} # Dictionary[String, [Vector2i, String, Tile, Array]] var autobake = false var currently_baked = false var floor_mesher := FloorMesher.new() var floor_node := MeshInstance3D.new() -func get_tile_name(pos: Vector2i): +func get_tile_name(pos: Vector2i): # -> String? var e = tile_by_pos.get(str(pos)) if e != null: return e[1] else: return null @@ -35,7 +35,7 @@ func get_tile_instance(pos: Vector2i) -> Tile: func set_tile(pos: Vector2i, name_: String, neighbors: Array = [null,null,null,null]) -> Tile: clear_tile(pos) - var tile = TileFactory.produce(name_, pos, neighbors, floor_mesher) + var tile := TileFactory.produce(name_, pos, neighbors, floor_mesher) add_child(tile) tile.position = Vector3(pos.x, 0, pos.y) tile_by_pos[str(pos)] = [pos, name_, tile, neighbors] diff --git a/client/player/controllable_player.gd b/client/player/controllable_player.gd index 99625762..1ac84504 100644 --- a/client/player/controllable_player.gd +++ b/client/player/controllable_player.gd @@ -86,10 +86,11 @@ func _process_movement(delta): if Input.is_action_pressed("interact_left") or Input.is_action_just_released("interact_left") or Input.is_action_pressed("interact_right") or Input.is_action_just_released("interact_right"): input *= 0 else: - target = Vector2i( - int(floor(movement_base.position.x + sin(movement_base.rotation.y))), - int(floor(movement_base.position.z + cos(movement_base.rotation.y))) - ) + target = get_interact_target() + # target = Vector2i( + # int(floor(movement_base.position.x + sin(movement_base.rotation.y))), + # int(floor(movement_base.position.z + cos(movement_base.rotation.y))) + # ) if Global.get_setting("gameplay.accessible_movement"): if input.length() < 0.5: moving_duration -= delta * 2 @@ -227,3 +228,29 @@ func interact(): marker.set_interacting(false) else: marker.visible = false + +func get_interact_target(): + var rx := movement_base.position.x + sin(movement_base.rotation.y) * 0.7 + var ry := movement_base.position.z + cos(movement_base.rotation.y) * 0.7 + var bx = floor(rx) + var by = floor(ry) + var best := Vector2i(bx, by) + var best_d = 100 + for ox in range(-1,1): + for oy in range (-1, 1): + var tile_name = game.map.get_tile_name(Vector2i(bx + ox, by + oy)) + if tile_name == null: continue + var tile_id: int = game.tile_index_by_name[tile_name] + if game.tile_interact[tile_id]: + var cx = (bx + ox + 0.5) + var cy = (by + oy + 0.5) + var dx = rx - cx + var dy = ry - cy + var pdx = movement_base.position.x - cx + var pdy = movement_base.position.z - cy + var d = sqrt(dx * dx + dy * dy) + var pd = sqrt(pdx * pdx + pdy * pdy) + if pd < 2 && d < best_d: + best_d = d + best = Vector2i(bx + ox, by + oy) + return best |