protected void AnimationDepthLerp(DungeonDoorController self, tk2dSprite targetSprite, float targetDepth, tk2dSpriteAnimationClip clip, DungeonDoorController.DoorModule m = null, bool isSpecialHorizontalTopCase = false) { float duration = 1f; if (clip != null) { duration = clip.frames.Length / clip.fps; } GameManager.Instance.StartCoroutine(DepthLerp(self, targetSprite, targetDepth, duration, m, isSpecialHorizontalTopCase)); }
private IEnumerator DepthLerp(DungeonDoorController self, tk2dSprite targetSprite, float targetDepth, float duration, DungeonDoorController.DoorModule m = null, bool isSpecialHorizontalTopCase = false) { bool m_open = ReflectionHelpers.ReflectGetField <bool>(typeof(DungeonDoorController), "m_open", self); if (m != null) { if (!m_open) { targetSprite.IsPerpendicular = true; } m.isLerping = true; } float elapsed = 0f; float startingDepth = targetSprite.HeightOffGround; while (elapsed < duration) { elapsed += BraveTime.DeltaTime; float t = elapsed / duration; targetSprite.HeightOffGround = Mathf.Lerp(startingDepth, targetDepth, t); if (ReflectionHelpers.ReflectGetField <bool>(typeof(DungeonDoorController), "m_open", self) && isSpecialHorizontalTopCase) { targetSprite.depthUsesTrimmedBounds = false; targetSprite.HeightOffGround = -5.25f; } targetSprite.UpdateZDepth(); yield return(null); } targetSprite.HeightOffGround = (targetSprite.depthUsesTrimmedBounds ? targetDepth : -5.25f); targetSprite.UpdateZDepth(); if (m != null) { if (ReflectionHelpers.ReflectGetField <bool>(typeof(DungeonDoorController), "m_open", self)) { targetSprite.IsPerpendicular = m.openPerpendicular; } m.isLerping = false; } yield break; }
private void SetState(DungeonDoorController self, bool openState, bool flipped = false) { FieldInfo hasEverBeenOpen_Field = typeof(DungeonDoorController).GetField("hasEverBeenOpen", BindingFlags.Instance | BindingFlags.NonPublic); FieldInfo m_open_Field = typeof(DungeonDoorController).GetField("m_open", BindingFlags.Instance | BindingFlags.NonPublic); FieldInfo m_openIsFlipped_Field = typeof(DungeonDoorController).GetField("m_openIsFlipped", BindingFlags.Instance | BindingFlags.NonPublic); if (openState) { hasEverBeenOpen_Field.SetValue(self, true); } self.TriggerPersistentVFXClear(); m_open_Field.SetValue(self, openState); if (!self.northSouth) { for (int i = 0; i < self.doorModules.Length; i++) { if (self.doorModules[i].horizontalFlips) { self.doorModules[i].sprite.FlipX = ((!openState) ? ReflectionHelpers.ReflectGetField <bool>(typeof(DungeonDoorController), "m_openIsFlipped", self) : flipped); } } } if (openState) { for (int j = 0; j < self.doorModules.Length; j++) { m_openIsFlipped_Field.SetValue(self, flipped); DungeonDoorController.DoorModule doorModule = self.doorModules[j]; string text = doorModule.openAnimationName; tk2dSpriteAnimationClip tk2dSpriteAnimationClip = null; if (!string.IsNullOrEmpty(text)) { if (flipped && self.northSouth) { text = text.Replace("_north", "_south"); } tk2dSpriteAnimationClip = doorModule.animator.GetClipByName(text); } if (tk2dSpriteAnimationClip != null) { doorModule.animator.Play(tk2dSpriteAnimationClip); } for (int k = 0; k < doorModule.AOAnimatorsToDisable.Count; k++) { doorModule.AOAnimatorsToDisable[k].PlayAndDisableObject(string.Empty, null); } doorModule.rigidbody.enabled = false; AnimationDepthLerp(self, doorModule.sprite, doorModule.openDepth, tk2dSpriteAnimationClip, doorModule, !self.northSouth && j == 0); } } else { bool m_openIsFlipped = ReflectionHelpers.ReflectGetField <bool>(typeof(DungeonDoorController), "m_openIsFlipped", self); for (int l = 0; l < self.doorModules.Length; l++) { DungeonDoorController.DoorModule doorModule2 = self.doorModules[l]; string text2 = doorModule2.closeAnimationName; tk2dSpriteAnimationClip tk2dSpriteAnimationClip2 = null; if (!string.IsNullOrEmpty(text2)) { if (m_openIsFlipped && self.northSouth) { text2 = text2.Replace("_north", "_south"); } tk2dSpriteAnimationClip2 = doorModule2.animator.GetClipByName(text2); } if (tk2dSpriteAnimationClip2 != null) { doorModule2.animator.Play(tk2dSpriteAnimationClip2); tk2dSpriteAnimator animator = doorModule2.animator; animator.AnimationCompleted = (Action <tk2dSpriteAnimator, tk2dSpriteAnimationClip>)Delegate.Combine(animator.AnimationCompleted, new Action <tk2dSpriteAnimator, tk2dSpriteAnimationClip>(self.OnCloseAnimationCompleted)); } else { doorModule2.animator.StopAndResetFrame(); } for (int m = 0; m < doorModule2.AOAnimatorsToDisable.Count; m++) { doorModule2.AOAnimatorsToDisable[m].gameObject.SetActive(true); doorModule2.AOAnimatorsToDisable[m].StopAndResetFrame(); } doorModule2.rigidbody.enabled = true; AnimationDepthLerp(self, doorModule2.sprite, doorModule2.closedDepth, tk2dSpriteAnimationClip2, doorModule2, false); } } IntVector2 startingPosition = self.gameObject.transform.position.IntXY(VectorConversions.Floor); if (self.upstreamRoom != null && self.upstreamRoom.visibility != RoomHandler.VisibilityStatus.OBSCURED) { Pixelator.Instance.ProcessRoomAdditionalExits(startingPosition, self.upstreamRoom, false); } if (self.downstreamRoom != null && self.downstreamRoom.visibility != RoomHandler.VisibilityStatus.OBSCURED) { Pixelator.Instance.ProcessRoomAdditionalExits(startingPosition, self.downstreamRoom, false); } }