public void OnReturnToDivergencePointRequest() { algorithmRespect.ErrorCount += 1; Tile[] tiles = algorithmRespect.WrongColorTilesWhenDiverging.ToArray(); Vector2Int lpos = new Vector2Int( playerSteps[playerSteps.Count - 1].x, playerSteps[playerSteps.Count - 1].y); Vector3 position = Client.Instance.Labyrinth.Value.GetLabyrinthPositionInWorldPosition( lpos.x, lpos.y) + new Vector3(0, avatar.RootTransform.position.y, 0); controls.PositionRotationAndTiles.Value = new PositionRotationAndTile { Position = position, Rotation = rotationAtDivergence, Tiles = tiles }; algorithmRespect.Respect = RespectValueComputation( (new Vector2Int( playerSteps[playerSteps.Count - 1].x, playerSteps[playerSteps.Count - 1].y) - lpos).magnitude + algorithmRespect.WrongColorTilesWhenDiverging.Count); gameAction.SetAction( GameAction.ReturnToDivergencePoint, lpos, rotationAtDivergence, tiles, playerSteps.ToArray()); }
private void FixedUpdate() { controls.CameraRotation.Value = cameraRig.CameraRotation; if (controls.IsControlsEnabled.Value && controls.IsPlayerControlsEnabled.Value) { // MOVING if (isMoving) { controls.Animation.Value = Characters.AvatarAnimation.Jumping; float xi = ((moveSpeed * moveSpeed) / (-2 * Utils.MovementAcceleration)) + 1; if (isChainingMovement) { xi += 1; } moveSpeed = xi < lerpValue ? moveSpeed - (Time.deltaTime * Utils.MovementAcceleration) : moveSpeed + (Time.deltaTime * Utils.MovementAcceleration); lerpValue += Time.deltaTime * moveSpeed * Utils.MovementSpeed; if (lerpValue >= 1) { if (isChainingMovement) { MovementInDirectionAction(controls.ForwardDirection.Value); isChainingMovement = false; lerpValue = lerpValue - 1; RequestMoveForward(); Transform.position = Vector3.Lerp(fromPosition, targetPosition, lerpValue); } else { MovementInDirectionAction(controls.ForwardDirection.Value); Transform.position = targetPosition; moveSpeed = 0; lerpValue = 0; isMoving = false; } if (controls.PaintingColor.Value != TileColor.Red) { PaintCurrentPositionTile(true); } } else { Transform.position = Vector3.Lerp(fromPosition, targetPosition, lerpValue); } } // TURNING else if (isTurningLeft || isTurningRight) { controls.Animation.Value = Characters.AvatarAnimation.Jumping; float xi = ((turnSpeed * turnSpeed) / (-2 * Utils.TurningAcceleration)) + 1; if (isChainingMovement) { xi++; } turnSpeed = xi < lerpValue ? turnSpeed - (Time.deltaTime * Utils.TurningAcceleration) : turnSpeed + (Time.deltaTime * Utils.TurningAcceleration); lerpValue += Time.deltaTime * turnSpeed; if (lerpValue >= 1) { if (isChainingMovement) { isChainingMovement = false; lerpValue = lerpValue - 1; if (isTurningLeft) { Quaternion trajectory = new Quaternion(); trajectory.eulerAngles += new Vector3(0, -90, 0); fromRotation = targetRotation; targetRotation = targetRotation * trajectory; controls.ForwardDirection.Value = (controls.ForwardDirection.Value - 1) < 0 ? 3 : (controls.ForwardDirection.Value - 1); gameAction.SetAction(GameAction.TurnLeft); } else if (isTurningRight) { Quaternion trajectory = new Quaternion(); trajectory.eulerAngles += new Vector3(0, 90, 0); fromRotation = targetRotation; targetRotation = targetRotation * trajectory; controls.ForwardDirection.Value = (controls.ForwardDirection.Value + 1) % 4; gameAction.SetAction(GameAction.TurnRight); } DoTurn(); } else { // TODO Fix this crap if (isAvatarTurn) { character.RootTransform.rotation = targetRotation; DirectionArrowTransform.rotation = Quaternion.LookRotation(Utils.GetDirectionVector((Direction)controls.ForwardDirection.Value)); } else { DirectionArrowTransform.rotation = targetRotation; } turnSpeed = 0; lerpValue = 0; isTurningLeft = false; isTurningRight = false; } } else { DoTurn(); } } // IDLE else { controls.Animation.Value = Characters.AvatarAnimation.Idle; } Vector2Int labyrinthPosition = Client.Instance.Labyrinth.Value == null ? Vector2Int.zero : Client.Instance.Labyrinth.Value.GetWorldPositionInLabyrinthPosition( Transform.position.x, Transform.position.z); if (labyrinthPosition != this.labyrinthPosition) { if (controls.PaintingColor.Value == TileColor.Red) { PaintTile(this.labyrinthPosition, TileColor.Red, true); } this.lastLabyrinthPosition = this.labyrinthPosition; this.labyrinthPosition = labyrinthPosition; controls.OnLabyrinthPositionChangedHandler?.Invoke(); } if (character.RootTransform.position != lastPosition) { controls.PlayerPosition.Value = Transform.position; lastPosition = character.RootTransform.position; } if (directionTransform.rotation != lastRotation) { controls.BroadcastPlayerRotation.Value = directionTransform.rotation;//.CameraRotation; lastRotation = cameraRig.CameraRotation; } } }