void validatePreviousBlockDirection(Machine previousMachine, Machine nextMachine) { // change previous block direction if necessary if (previousMachine.position.z == nextMachine.position.z) // horizontal relation -- { Vector3 newRotation = Vector3.zero; Machine.Direction newDirection = (previousMachine.position.x > nextMachine.position.x) ? Machine.Direction.Left : Machine.Direction.Right; newRotation.y = (float)newDirection; GameGrid.Instance.getMachineAt(previousMachine.position).gameObject.transform.rotation = Quaternion.Euler(newRotation); GameGrid.Instance.getMachineAt(previousMachine.position).direction = newDirection; } else if (previousMachine.position.x == nextMachine.position.x && previousMachine.direction != nextMachine.direction) // vertical relation : { GameGrid.Instance.getMachineAt(previousMachine.position).gameObject.transform.rotation = nextMachine.gameObject.transform.rotation; GameGrid.Instance.getMachineAt(previousMachine.position).direction = nextMachine.direction; } }
public Toad(Machine.Direction dir) : this() { switch (dir) { case Machine.Direction.North: Rotate(); FlipVertically(); break; case Machine.Direction.East: break; case Machine.Direction.South: Rotate(); break; case Machine.Direction.West: FlipHorizontally(); break; default: break; } }
public Glider(Machine.Direction dir) : this() { switch (dir) { case Machine.Direction.NorthEast: FlipVertically(); break; case Machine.Direction.SouthEast: break; case Machine.Direction.SouthWest: FlipHorizontally(); break; case Machine.Direction.NorthWest: FlipHorizontally(); FlipVertically(); break; default: break; } }
private void placeBelt(Vector3 clickPoint) { Vector3 finalPosition = GameGrid.Instance.GetNearestPointOnGrid(clickPoint); // avoid overlapping if (finalPosition.y > 0.5f || !GameGrid.Instance.isAvailable(finalPosition)) { // seems like he's trying to link existing belts if (previousMousePosition != finalPosition && !GameGrid.Instance.isAvailable(previousMousePosition) && GameGrid.Instance.getMachineAt(finalPosition) != GameGrid.Instance.getMachineAt(previousMousePosition) //GameGrid.Instance.getMachineAt(previousMousePosition).type == Machine.Type.Belt && //GameGrid.Instance.getMachineAt(finalPosition).type == Machine.Type.Belt ) { GameGrid.Instance.getMachineAt(finalPosition).addConnection(previousMousePosition, Machine.ConnectionType.Input); GameGrid.Instance.getMachineAt(previousMousePosition).addConnection(finalPosition, Machine.ConnectionType.Output); } previousMousePosition = finalPosition; return; } Vector3 mouseDirection = finalPosition - previousMousePosition; Vector3 itemDirection = Vector3.zero; Machine.Direction direction = Machine.Direction.Right; if (mouseDirection.x < 0) { itemDirection.y = (float)Machine.Direction.Left; direction = Machine.Direction.Left; } else if (mouseDirection.z > 0) { itemDirection.y = (float)Machine.Direction.Up; direction = Machine.Direction.Up; } else if (mouseDirection.z < 0) { itemDirection.y = (float)Machine.Direction.Down; direction = Machine.Direction.Down; } GameObject obj = Instantiate(selectedMachine.prefab, finalPosition, Quaternion.Euler(itemDirection)); obj.name = finalPosition.ToString(); Belt machine = new Belt(obj); machine.direction = direction; // if player started dragging from an existing conveyor belt, link it to the new one if (previousMousePosition != Vector3.zero && !currentBelt.Contains(previousMousePosition) && !GameGrid.Instance.isAvailable(previousMousePosition) && GameGrid.Instance.getMachineAt(previousMousePosition).type == Machine.Type.Belt) { if (currentBelt.Count > 0) { validatePreviousBlockDirection(GameGrid.Instance.getMachineAt(currentBelt.Last()), GameGrid.Instance.getMachineAt(previousMousePosition)); GameGrid.Instance.getMachineAt(currentBelt.Last()).addConnection(previousMousePosition, Machine.ConnectionType.Output); GameGrid.Instance.getMachineAt(previousMousePosition).addConnection(currentBelt.Last(), Machine.ConnectionType.Input); } currentBelt.Add(previousMousePosition); } GameGrid.Instance.place(machine); Belt lastMachine = null; if (currentBelt.Count > 0) { lastMachine = (Belt)GameGrid.Instance.machines[currentBelt.Last()]; // new item and latest one are not neighbors if (!GameGrid.Instance.getNeighbors(finalPosition).Contains(lastMachine.position)) { var lastItemNeighbors = GameGrid.Instance.getNeighbors(lastMachine.position); // find a common available neighbor to create the union foreach (Vector3 pos in GameGrid.Instance.getNeighbors(finalPosition)) { if (lastItemNeighbors.Contains(pos) && GameGrid.Instance.isAvailable(pos)) { placeBelt(pos); // refresh last item lastMachine = (Belt)GameGrid.Instance.machines[currentBelt.Last()]; break; } } } } currentBelt.Add(finalPosition); if (lastMachine != null) { validatePreviousBlockDirection(lastMachine, machine); // connect them GameGrid.Instance.getMachineAt(lastMachine.position).addConnection(finalPosition, Machine.ConnectionType.Output); GameGrid.Instance.getMachineAt(finalPosition).addConnection(lastMachine.position, Machine.ConnectionType.Input); } previousMousePosition = finalPosition; }