factory-expansion/logic/mechanics/interaction/world_interaction.gd

55 lines
2.1 KiB
GDScript

extends Node2D
@export var world : World
@onready var object_shadow = $"Object Shadow"
var direction : Vector2i = Vector2i(1, 0)
func _input(event: InputEvent) -> void:
if event is InputEventMouseButton:
if event.button_index == MOUSE_BUTTON_LEFT and event.pressed:
var tile_position : Vector2i = world.global_position_to_tile(get_global_mouse_position())
var chunk_position : Vector2i = world.tile_pos_to_chunk_pos(tile_position)
var position_in_chunk : Vector2i = tile_position - chunk_position * TileGlobals.chunk_size
var chunk : Chunk = world.get_chunk_at(chunk_position)
var new_arrow : Arrow = Arrow.new(direction)
chunk.arrows[position_in_chunk] = new_arrow
chunk.recalculate()
world.updated.emit(chunk)
elif event.button_index == MOUSE_BUTTON_RIGHT and event.pressed:
var tile_position : Vector2i = world.global_position_to_tile(get_global_mouse_position())
var chunk_position : Vector2i = world.tile_pos_to_chunk_pos(tile_position)
var position_in_chunk : Vector2i = tile_position - chunk_position * TileGlobals.chunk_size
var chunk : Chunk = world.get_chunk_at(chunk_position)
chunk.arrows.erase(position_in_chunk)
chunk.recalculate()
world.updated.emit(chunk)
elif event.is_action_pressed("rotate_right"):
direction = rotate_vector2i(direction)
elif event.is_action_pressed("rotate_left"):
direction = rotate_vector2i(direction, true)
func rotate_vector2i(vector : Vector2i, counter_clockwise : bool = false) -> Vector2i:
if counter_clockwise:
return Vector2i(1,-1) * Vector2i(vector.y, vector.x)
return Vector2i(-1,1) * Vector2i(vector.y, vector.x)
func _ready():
object_shadow.z_index = 1
object_shadow.texture = ImageTexture.create_from_image(preload("res://resources/misc/arrows.png").get_layer_data(0))
func _process(delta: float) -> void:
var tile_size = Vector2(TileGlobals.tile_size, TileGlobals.tile_size)
var object_shadow_position = (get_global_mouse_position() - tile_size/2).snapped(tile_size) + tile_size/2
object_shadow.global_position = object_shadow_position
object_shadow.look_at(object_shadow.global_position + Vector2(direction))