using System.
Linq;
using [Link];
using [Link];
using UnityEngine;
using NaughtyAttributes;
using System;
using [Link];
namespace BookSort
{
public class ArrangeController : MonoBehaviour
{
[SerializeField] private Transform _holder;
[SerializeField] private Transform _pointsHolder;
[SerializeField, ReadOnly] private PlacePoint[] _placePoints;
private OnePieceComponent _onePieceComponent;
private Transform _componentHolder;
private int _currentIndex;
private int _spawnPerTurn;
private int _piecesInPlaced;
private OnePiece _currentObject;
private Plane _plane;
public static event Action OnCompleted;
private void OnEnable()
{
[Link] += OnePieceComponent_OnDragging;
[Link] += OnePieceComponent_OnDragEnd;
}
private void Start()
{
_plane = new Plane([Link], [Link]);
}
public void Init(OnePieceComponent onePieceComponent, Transform holder)
{
_onePieceComponent = onePieceComponent;
_componentHolder = holder;
_currentIndex = 0;
_spawnPerTurn = 3;
_placePoints = _holder.GetComponentsInChildren<PlacePoint>();
[Link] random = new [Link]();
[Link](_placePoints);
SpawnComponents(_currentIndex, _spawnPerTurn);
}
private void OnePiece_OnDrop(OnePiece onePiece, OnePieceComponent
component)
{
var point = _placePoints.FirstOrDefault(point => [Link] &&
[Link]().Equals([Link]()));
var diff = 0f;
if (point == null && [Link] != null)
{
point = [Link];
[Link](null);
}
if (point != null)
diff = [Link]([Link],
[Link]);
[Link]("diff " + diff);
if (point == null || diff > 0.5f)
{
if (point != null)
[Link](null);
[Link](false);
Destroy([Link]);
return;
}
_piecesInPlaced++;
[Link](true);
[Link]([Link],
[Link]);
[Link]();
[Link](onePiece);
[Link](point);
Destroy([Link]);
return;
}
private void OnePieceComponent_OnDragEnd(OnePieceComponent component)
{
if (_currentObject == null)
return;
OnePiece_OnDrop(_currentObject, component);
_currentObject = null;
[Link]("CanSpawnMore " + CanSpawnMore());
[Link]("IsTurnCompleted " + IsTurnCompleted());
if (CanSpawnMore())
{
SpawnNextTurn();
return;
}
Invoke(nameof(Complete), .5f);
}
public void Complete()
{
[Link]("complete");
OnCompleted?.Invoke();
}
private void OnePieceComponent_OnDragging(OnePieceComponent component)
{
if ([Link] == false)
return;
var ray = [Link]([Link]);
bool hit = [Link](ray, out var hitinfo, 1000);
if (hit == false)
return;
Vector3 point = [Link];
if (_currentObject == null)
{
[Link]("index " + [Link]);
_currentObject = Spawn([Link], point);
_currentObject.[Link](true);
[Link]([Link]);
}
_currentObject.[Link] = point;
}
private bool CheckPuzzle()
{
return _placePoints.Any(point => [Link]) == false;
}
private void SpawnNextTurn()
{
if (CanSpawnMore() == false || IsTurnCompleted() == false)
return;
_piecesInPlaced = 0;
_currentIndex += _spawnPerTurn;
SpawnComponents(_currentIndex, _spawnPerTurn);
}
private void SpawnComponents(int index, int count)
{
if (index < 0 || index >= _placePoints.Length)
return;
count += index;
count = [Link](count, 0, _placePoints.Length);
_componentHolder.ClearChildren(1);
for (int i = index; i < count; i++)
{
//Sequence sequence = [Link]();
var component = Instantiate(_onePieceComponent, _componentHolder);
var piece =
_placePoints[i].GetMeshObject().GetComponent<OnePiece>();
[Link]([Link], i);
var duration = .3f;
var delay = i == 0 ? 0 : duration / 1.5f;
[Link](duration, delay);
}
}
private bool IsTurnCompleted()
{
return _piecesInPlaced == _spawnPerTurn;
}
private bool CanSpawnMore()
{
var rem = _placePoints.Length - (_currentIndex + _piecesInPlaced);
[Link]("rem " + rem);
return rem > 0;
//return [Link](_currentIndex + _spawnPerTurn, 0,
_placePoints.Length - 1) < _placePoints.Length;
}
private OnePiece Spawn(int i)
{
var meshOb = _placePoints[i].GetMeshObject();
var onePiece = Spawn(i, _pointsHolder.GetChild(i).position,
[Link]);
return onePiece;
}
private OnePiece Spawn(int i, Vector3 position)
{
var meshOb = _placePoints[i].GetMeshObject();
var onePiece = Spawn(i, position, [Link]);
return onePiece;
}
private OnePiece Spawn(int index, Vector3 position, Quaternion rotation)
{
var meshOb = _placePoints[index].GetMeshObject();
var onePiece = Instantiate(meshOb, position,
rotation).GetComponent<OnePiece>();
[Link] = [Link];
return onePiece;
private void OnDisable()
{
[Link] -= OnePieceComponent_OnDragging;
[Link] -= OnePieceComponent_OnDragEnd;
}
}
}