extends Building const CITIZEN_SCENE = preload("uid://bwx0lqtkd2jd7") func can_citizen_enter(coord: Vector2i, direction: Board.Direction) -> bool: var up_adjustment := Board.get_next_direction(Board.Direction.UP, get_rotation_count()) var right_adjustment := Board.get_next_direction(Board.Direction.RIGHT, get_rotation_count()) var correct_heading := Board.get_next_direction(Board.Direction.DOWN, get_rotation_count()) var entrance_1 := ( starting_coord + Board.get_direction_vector(up_adjustment) + Board.get_direction_vector(up_adjustment) + Board.get_direction_vector(right_adjustment) ) var entrance_2 := entrance_1 + Board.get_direction_vector(right_adjustment) return (coord == entrance_1 or coord == entrance_2) and direction == correct_heading func get_tile_coords() -> Array[Vector2i]: var result: Array[Vector2i] = [] result.push_back(starting_coord) result.push_back( starting_coord + Vector2i(Vector2.RIGHT.rotated(deg_to_rad(90 * get_rotation_count()))) ) result.push_back( starting_coord + Vector2i(Vector2.RIGHT.rotated(deg_to_rad(90 * get_rotation_count()))) * 2 ) result.push_back( starting_coord + Vector2i(Vector2.RIGHT.rotated(deg_to_rad(90 * get_rotation_count()))) * 3 ) result.push_back( ( starting_coord + Vector2i(Vector2.RIGHT.rotated(deg_to_rad(90 * get_rotation_count()))) + Vector2i(Vector2.UP.rotated(deg_to_rad(90 * get_rotation_count()))) ) ) result.push_back( ( starting_coord + Vector2i(Vector2.RIGHT.rotated(deg_to_rad(90 * get_rotation_count()))) + Vector2i(Vector2.RIGHT.rotated(deg_to_rad(90 * get_rotation_count()))) + Vector2i(Vector2.UP.rotated(deg_to_rad(90 * get_rotation_count()))) ) ) return result func get_direction_queue(citizen: Citizen) -> Array[Board.Direction]: var tile_offset := citizen.current_tile_coords - starting_coord if tile_offset == Vector2i(1, -1): return [ Board.get_next_direction(Board.Direction.DOWN, get_rotation_count()), Board.get_next_direction(Board.Direction.LEFT, get_rotation_count()), Board.get_next_direction(Board.Direction.LEFT, get_rotation_count()) ] return [ Board.get_next_direction(Board.Direction.DOWN, get_rotation_count()), Board.get_next_direction(Board.Direction.RIGHT, get_rotation_count()), Board.get_next_direction(Board.Direction.RIGHT, get_rotation_count()) ] func activate(citizen: Citizen) -> void: var new_citizen: Citizen = load("uid://bwx0lqtkd2jd7").instantiate() citizen.call_deferred("add_sibling", new_citizen) await new_citizen.ready new_citizen.direction = citizen.direction new_citizen.money = citizen.money new_citizen.board = citizen.board new_citizen.current_tile_coords = citizen.current_tile_coords new_citizen.set_offset(Vector2(randf_range(-40, 40), randf_range(-40, 40))) var tile_offset := citizen.current_tile_coords - starting_coord if tile_offset == Vector2i(1, -1): new_citizen.current_tile_coords = starting_coord + Vector2i(2, -1) new_citizen.position = citizen.position + Vector2(110, 0) elif tile_offset == Vector2i(2, -1): new_citizen.current_tile_coords = starting_coord + Vector2i(1, -1) new_citizen.position = citizen.position - Vector2(110, 0) new_citizen.direction_queue = get_direction_queue(new_citizen) new_citizen.direction_queue.remove_at(0)