示例#1
0
        private static void Tick(float deltaTime)
        {
            if (deltaTime > 1f)
            {
                return;
            }
            lock (staticMutationLock) {
                if (currentMenuState == MenuState.InGame)
                {
                    return;
                }
                if (cameraLight != null)
                {
                    cameraLight.Position = AssetLocator.MainCamera.Position;
                }
                if (isTransitioning)
                {
                    transitionTimeElapsed += deltaTime;
                    if (transitionTimeElapsed >= transitionTime)
                    {
                        EndTransition(deltaTime - (transitionTimeElapsed - transitionTime));
                    }
                    if (currentMenuState == MenuState.InGame)
                    {
                        return;
                    }
                }
                else
                {
                    if (downKeyState.IsDown)
                    {
                        float timeSinceDepression = EntityModule.ElapsedTime - downKeyState.LastDepress;
                        if (timeSinceDepression >= Config.InitialRepeatTimeDelay)
                        {
                            float timeSinceLastTrigger = EntityModule.ElapsedTime - downKeyState.LastTrigger;
                            if (timeSinceLastTrigger >= Config.SuccessiveRepeatTimeDelay)
                            {
                                downKeyState.LastTrigger = EntityModule.ElapsedTime;
                                var triggerDownLocal = triggerDown;
                                if (triggerDownLocal != null)
                                {
                                    triggerDownLocal();
                                }
                            }
                        }
                    }
                    if (upKeyState.IsDown)
                    {
                        float timeSinceDepression = EntityModule.ElapsedTime - upKeyState.LastDepress;
                        if (timeSinceDepression >= Config.InitialRepeatTimeDelay)
                        {
                            float timeSinceLastTrigger = EntityModule.ElapsedTime - upKeyState.LastTrigger;
                            if (timeSinceLastTrigger >= Config.SuccessiveRepeatTimeDelay)
                            {
                                upKeyState.LastTrigger = EntityModule.ElapsedTime;
                                var triggerUpLocal = triggerUp;
                                if (triggerUpLocal != null)
                                {
                                    triggerUpLocal();
                                }
                            }
                        }
                    }
                    if (leftKeyState.IsDown)
                    {
                        float timeSinceDepression = EntityModule.ElapsedTime - leftKeyState.LastDepress;
                        if (timeSinceDepression >= Config.InitialRepeatTimeDelay)
                        {
                            float timeSinceLastTrigger = EntityModule.ElapsedTime - leftKeyState.LastTrigger;
                            if (timeSinceLastTrigger >= Config.SuccessiveRepeatTimeDelay)
                            {
                                leftKeyState.LastTrigger = EntityModule.ElapsedTime;
                                var triggerLeftLocal = triggerLeft;
                                if (triggerLeftLocal != null)
                                {
                                    triggerLeftLocal();
                                }
                            }
                        }
                    }
                    if (rightKeyState.IsDown)
                    {
                        float timeSinceDepression = EntityModule.ElapsedTime - rightKeyState.LastDepress;
                        if (timeSinceDepression >= Config.InitialRepeatTimeDelay)
                        {
                            float timeSinceLastTrigger = EntityModule.ElapsedTime - rightKeyState.LastTrigger;
                            if (timeSinceLastTrigger >= Config.SuccessiveRepeatTimeDelay)
                            {
                                rightKeyState.LastTrigger = EntityModule.ElapsedTime;
                                var triggerRightLocal = triggerRight;
                                if (triggerRightLocal != null)
                                {
                                    triggerRightLocal();
                                }
                            }
                        }
                    }
                    if (downLSState.IsDown)
                    {
                        float timeSinceDepression = EntityModule.ElapsedTime - downLSState.LastDepress;
                        if (timeSinceDepression >= Config.InitialRepeatTimeDelay)
                        {
                            float timeSinceLastTrigger = EntityModule.ElapsedTime - downLSState.LastTrigger;
                            if (timeSinceLastTrigger >= Config.SuccessiveRepeatTimeDelay)
                            {
                                downLSState.LastTrigger = EntityModule.ElapsedTime;
                                var triggerDownLocal = triggerDown;
                                if (triggerDownLocal != null)
                                {
                                    triggerDownLocal();
                                }
                            }
                        }
                    }
                    if (upLSState.IsDown)
                    {
                        float timeSinceDepression = EntityModule.ElapsedTime - upLSState.LastDepress;
                        if (timeSinceDepression >= Config.InitialRepeatTimeDelay)
                        {
                            float timeSinceLastTrigger = EntityModule.ElapsedTime - upLSState.LastTrigger;
                            if (timeSinceLastTrigger >= Config.SuccessiveRepeatTimeDelay)
                            {
                                upLSState.LastTrigger = EntityModule.ElapsedTime;
                                var triggerUpLocal = triggerUp;
                                if (triggerUpLocal != null)
                                {
                                    triggerUpLocal();
                                }
                            }
                        }
                    }
                    if (leftLSState.IsDown)
                    {
                        float timeSinceDepression = EntityModule.ElapsedTime - leftLSState.LastDepress;
                        if (timeSinceDepression >= Config.InitialRepeatTimeDelay)
                        {
                            float timeSinceLastTrigger = EntityModule.ElapsedTime - leftLSState.LastTrigger;
                            if (timeSinceLastTrigger >= Config.SuccessiveRepeatTimeDelay)
                            {
                                leftLSState.LastTrigger = EntityModule.ElapsedTime;
                                var triggerLeftLocal = triggerLeft;
                                if (triggerLeftLocal != null)
                                {
                                    triggerLeftLocal();
                                }
                            }
                        }
                    }
                    if (rightLSState.IsDown)
                    {
                        float timeSinceDepression = EntityModule.ElapsedTime - rightLSState.LastDepress;
                        if (timeSinceDepression >= Config.InitialRepeatTimeDelay)
                        {
                            float timeSinceLastTrigger = EntityModule.ElapsedTime - rightLSState.LastTrigger;
                            if (timeSinceLastTrigger >= Config.SuccessiveRepeatTimeDelay)
                            {
                                rightLSState.LastTrigger = EntityModule.ElapsedTime;
                                var triggerRightLocal = triggerRight;
                                if (triggerRightLocal != null)
                                {
                                    triggerRightLocal();
                                }
                            }
                        }
                    }
                }

                if (!inDeferenceMode)
                {
                    AssetLocator.MainCamera.Rotate(BACKDROP_ROT_QUAT.Subrotation(deltaTime));

                    var deadBits = activeSillyBits.RemoveWhere(sb => sb.Transform.Translation.Y < AssetLocator.MainCamera.Position.Y - SILLY_BIT_DROP_HEIGHT);
                    foreach (var deadBit in deadBits)
                    {
                        deadBit.Dispose();
                    }

                    float timeSinceLastBitDrop = EntityModule.ElapsedTime - lastSillyBitDrop;
                    if (timeSinceLastBitDrop >= SILLY_BIT_DROP_INTERVAL / Config.PhysicsLevel + sillyBitSpawnRandomExtra)
                    {
                        int            sillyBitIndex = RandomProvider.Next(0f, 1f) <= SILLY_BIT_IS_EGG_CHANCE ? -1 : RandomProvider.Next(0, AssetLocator.SillyBitsHandles.Length);
                        SillyBitEntity newBit        = new SillyBitEntity(sillyBitIndex);
                        newBit.SetGravity(GameplayConstants.GRAVITY_ACCELERATION * RandomProvider.Next(0.025f, 0.175f) * Vector3.DOWN);
                        newBit.AngularVelocity = new Vector3(
                            RandomProvider.Next(-MathUtils.PI, MathUtils.PI),
                            RandomProvider.Next(-MathUtils.PI, MathUtils.PI),
                            RandomProvider.Next(-MathUtils.PI, MathUtils.PI)
                            );
                        Vector3 lateralOffset =
                            AssetLocator.MainCamera.Orientation
                            * SILLY_BIT_DROP_FORWARD_OFFSET
                            * Quaternion.FromAxialRotation(
                                Vector3.DOWN,
                                RandomProvider.Next(
                                    -SILLY_BIT_DROP_CONE * (1f - SILLY_BIT_CAM_ROT_CONE_BIAS),
                                    SILLY_BIT_DROP_CONE * SILLY_BIT_CAM_ROT_CONE_BIAS
                                    )
                                );
                        newBit.SetTranslation(AssetLocator.MainCamera.Position + Vector3.UP * SILLY_BIT_DROP_HEIGHT + lateralOffset);

                        activeSillyBits.Add(newBit);

                        HUDSound.PostPassEggPop.Play(0.2f, RandomProvider.Next(0.5f, 1.5f));
                        lastSillyBitDrop         = EntityModule.ElapsedTime;
                        sillyBitSpawnRandomExtra = RandomProvider.Next(0f, MAX_RANDOM_SPAWN_EXTRA_TIME);
                    }

                    float timeSinceLastBitExplosion = EntityModule.ElapsedTime - lastSillyBitExplosion;
                    if (timeSinceLastBitExplosion >= SILLY_BIT_EXPLOSION_INTERVAL / Config.PhysicsLevel + sillyBitExplosionRandomExtra && activeSillyBits.Any())
                    {
                        var nonEggBits = activeSillyBits.Except(bit => bit.BitIndex == -1);
                        if (nonEggBits.Any())
                        {
                            var targetBit = nonEggBits.ElementAt(RandomProvider.Next(0, nonEggBits.Count()));
                            for (int i = 0; i < SILLY_BIT_EXPLOSION_SIZE; ++i)
                            {
                                Vector3 targetDir = new Vector3(
                                    RandomProvider.Next(-1f, 1f),
                                    RandomProvider.Next(-1f, 1f),
                                    RandomProvider.Next(-1f, 1f)
                                    );
                                if (targetDir == Vector3.ZERO)
                                {
                                    targetDir = AssetLocator.MainCamera.Orientation;
                                }

                                SillyBitEntity newBit = new SillyBitEntity(targetBit.BitIndex);
                                newBit.AngularVelocity = new Vector3(
                                    RandomProvider.Next(-MathUtils.PI, MathUtils.PI),
                                    RandomProvider.Next(-MathUtils.PI, MathUtils.PI),
                                    RandomProvider.Next(-MathUtils.PI, MathUtils.PI)
                                    );
                                newBit.SetTranslation(targetBit.Transform.Translation + targetDir.WithLength(PhysicsManager.ONE_METRE_SCALED * 0.1f));
                                newBit.Velocity = targetDir.WithLength(PhysicsManager.ONE_METRE_SCALED * 0.5f);
                                newBit.SetGravity(GameplayConstants.GRAVITY_ACCELERATION * RandomProvider.Next(0.025f, 0.175f) * Vector3.DOWN);

                                activeSillyBits.Add(newBit);
                            }
                            HUDSound.PostPassShowMenu.Play(RandomProvider.Next(0f, 0.5f), RandomProvider.Next(1.5f, 0.5f));
                        }


                        lastSillyBitExplosion        = EntityModule.ElapsedTime;
                        sillyBitExplosionRandomExtra = RandomProvider.Next(0f, MAX_RANDOM_EXPLOSION_EXTRA_TIME);
                    }

                    if (menuIdentTex.Color.W == 0f && worldIconTex.Color.W < WORLD_ICON_TARGET_ALPHA)
                    {
                        worldIconTex.AdjustAlpha(WORLD_ICON_ALPHA_PER_SEC * deltaTime);
                        if (worldIconTex.Color.W > WORLD_ICON_TARGET_ALPHA)
                        {
                            worldIconTex.SetAlpha(WORLD_ICON_TARGET_ALPHA);
                        }
                    }
                }

                if (versionString.Color.W < WORLD_ICON_TARGET_ALPHA)
                {
                    versionString.AdjustAlpha(WORLD_ICON_ALPHA_PER_SEC * deltaTime);
                    if (versionString.Color.W > WORLD_ICON_TARGET_ALPHA)
                    {
                        versionString.SetAlpha(WORLD_ICON_TARGET_ALPHA);
                    }
                }

                var transitionTickLocal = transitionTick;
                if (transitionTickLocal != null)
                {
                    transitionTickLocal(deltaTime, transitionTimeElapsed / transitionTime);
                }
                var tickLocal = tick;
                if (tickLocal != null)
                {
                    tickLocal(deltaTime);
                }
            }
        }