示例#1
0
        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));
        }
示例#2
0
        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;
        }
示例#3
0
        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);
            }
        }