public int SaveChanges(Account user, string description = null)
        {
            var entries = ChangeTracker.Entries().Where(p => p.State == EntityState.Added || p.State == EntityState.Deleted || p.State == EntityState.Modified);
            var logger  = new FrameLogger(user, this);

            logger.Write(entries, description);
            return(base.SaveChanges());
        }
示例#2
0
            public static void CreateSingleton(Vector2Int windowSize, PixelColor color)
            {
                s_Instance = new Engine(windowSize, color);

                // create debug area
                RectInt bound = new RectInt(0, windowSize.Y, 120, 15);

                FrameLogger.CreateSingleton(bound);
            }
示例#3
0
        private void EnterSituation(string sitName)
        {
            // setup variable, setup one time var, always var
            var prevSitName = m_CurrSitName;

            try
            {
                m_CurrSitName = sitName;

                CurrentSituation = Tree.SituationTables[sitName];
            }
            catch (Exception exp)
            {
                FrameLogger.LogError(string.Format(exp.Message + ", SitName {0} not found", sitName));
            }

            ////
            OnEnterSituation.Invoke(prevSitName, sitName);

            // the first time
            if (!VisitedSituation.Contains(sitName))
            {
                VisitedSituation.Add(sitName);

                // execute one time event
                try
                {
                    foreach (var action in CurrentSituation.OneTimeSetValueAction)
                    {
                        action.Operate();
                    }
                }
                catch (Exception ep)
                {
                    FrameLogger.LogError(ep.Message + ": " + ep.StackTrace);
                }
            }

            try
            {
                // execute always event
                foreach (var action in CurrentSituation.AlwaysSetValueAction)
                {
                    action.Operate();
                }
            }
            catch (Exception ep)
            {
                FrameLogger.LogError(ep.Message + ": " + ep.StackTrace);
            }
        }
示例#4
0
 public override void PreRender()
 {
     foreach (var pos in Node.Bounds.AllPositionsWithin)
     {
         var dataPos = pos - Node.Bounds.Position;
         try
         {
             Node.ParentCanvas.SetPixel(Data[dataPos.Y][dataPos.X], pos);
         }
         catch
         {
             FrameLogger.LogError(Data[0].ToString());
             FrameLogger.LogError("Error - " + dataPos.ToString());
         }
     }
 }
示例#5
0
        public void Update(float timeStep)
        {
            if (!IsActive || IsDead)
            {
                Velocity = Vector2Int.Zero;
                return;
            }

            m_MoveTimer += timeStep;

            if (IsOnGround)
            {
                m_GravityTimer = 0;
                Velocity       = new Vector2Int(Velocity.X, 0);
            }
            else
            {
                m_GravityTimer += timeStep;
            }


            int speedY = Velocity.Y;

            if (speedY > c_MaxSpeedY)
            {
                speedY = c_MaxSpeedY;
            }
            Velocity = new Vector2Int(0, speedY);
            if (m_MoveTimer > c_MoveDuration)
            {
                Velocity   += new Vector2Int(Direction == CharacterDirection.Right ? 1 : -1, 0);
                m_MoveTimer = 0;
            }

            if (m_GravityTimer > c_GravityTimePerPixel)
            {
                Velocity      += new Vector2Int(0, 1);
                m_GravityTimer = 0;
            }

            FrameLogger.Log(string.Format("{0}- HP: [{1}], OnGnd: [{2}]", Id, Health, IsOnGround));
        }
示例#6
0
        public void Update(float timeStep)
        {
            m_TowerMoveTimer += timeStep;

            // move tower, recycle platforms, generate new platforms
            if (m_TowerMoveTimer > m_TowerMoveDuration)
            {
                TowerTopNode.Translate(new DYTA.Math.Vector2Int(0, -1));
                m_TowerMoveTimer = 0;

                // recycle
                for (int i = 0; i < m_AllPlatforms.Count; i++)
                {
                    var platform = m_AllPlatforms[i];
                    if (TowerTopNode.Bounds.Position.Y - 2 + platform.Collider.Position.Y < 0)
                    {
                        platform.IsActive = false;
                    }
                }

                m_SpawnPlatformCounter++;
                if (m_SpawnPlatformCounter >= c_PlatformOffsetY)
                {
                    m_SpawnPlatformCounter = 0;
                    if (m_PreviousPlatform == null)
                    {
                        m_PreviousPlatform =
                            CreateNormalPlatform(
                                new Vector2Int(m_TowerSize.X / 2 - c_PlatformWidth / 2 - 1, c_PlatformInitialHeight + c_PlatformOffsetY),
                                new Vector2Int(c_PlatformWidth, 1));
                    }
                    else
                    {
                        var pos = m_PreviousPlatform.Collider.Position;
                        pos.Y += c_PlatformOffsetY;
                        pos.X  = m_RandomGenerator.Next(1, m_TowerSize.X - c_PlatformWidth - 1);

                        int rndToken = m_RandomGenerator.Next(0, 10);

                        if (rndToken < m_SpikeSpawnThreshold)
                        {
                            rndToken = m_RandomGenerator.Next(0, 10);

                            m_SpikeSpawnThreshold -= 2;
                            // spawn normal platform
                            if (rndToken < 6)
                            {
                                m_PreviousPlatform = CreateNormalPlatform(pos, new Vector2Int(c_PlatformWidth, 1));
                            }
                            // spawn sliding platform
                            else
                            {
                                m_PreviousPlatform = CreateSlidingPlatform(pos, new Vector2Int(c_PlatformWidth, 1));
                            }
                        }
                        // spawn spike platform
                        else
                        {
                            m_PreviousPlatform     = CreateSpikePlatform(pos, new Vector2Int(c_PlatformWidth, 1));
                            m_SpikeSpawnThreshold += 3;
                            if (m_SpikeSpawnThreshold > c_SpikeSpawnInitialThreshold)
                            {
                                m_SpikeSpawnThreshold = c_SpikeSpawnInitialThreshold;
                            }
                        }
                    }

                    m_LevelCounter++;
                    TotalLevelCounter++;
                    if (m_LevelCounter >= 10)
                    {
                        m_LevelCounter = 0;
                        Difficulty++;
                        if (Difficulty < c_MaxDifficulty)
                        {
                            m_TowerMoveDuration -= c_AddUpPer10Level;
                        }
                    }
                }
            }

            FrameLogger.Log("Difficulty - " + Difficulty);
            FrameLogger.Log("TotalLevelCounter - " + TotalLevelCounter);
            FrameLogger.Log("SpikeThreshold - " + m_SpikeSpawnThreshold);

            // update character
            for (int i = 0; i < Characters.Count; i++)
            {
                var character = Characters[i];
                character.Update(timeStep);
            }

            // update platform
            for (int i = 0; i < m_AllPlatforms.Count; i++)
            {
                var platform = m_AllPlatforms[i];
                platform.Update(timeStep);
            }

            // update character movement, collision detection
            for (int i = 0; i < Characters.Count; i++)
            {
                var character = Characters[i];
                var velocity  = character.Velocity;

                // check velocity collision
                for (int j = 0; j < m_AllColliders.Count; j++)
                {
                    var collider = m_AllColliders[j];

                    if (!collider.IsActive)
                    {
                        continue;
                    }

                    if (collider != character)
                    {
                        // static object
                        if (collider is StaticWall || collider is DeathZone)
                        {
                            var bounds = new RectInt(collider.Collider.Position + new Vector2Int(0, -(TowerTopNode.Bounds.Position.Y - 1)), collider.Collider.Size);
                            var col    = ClampVelocity2D(character.Collider, bounds, velocity, out velocity);

                            if (col.IsTrue)
                            {
                                FrameLogger.Log("TYPE " + collider.GetType());
                                collider.OnCharacterCollision(character);
                            }
                        }
                        // dynamic object
                        else
                        {
                            var col = ClampVelocity2D(character.Collider, collider.Collider, velocity, out velocity);

                            if (col.IsTrue)
                            {
                                FrameLogger.Log("TYPE " + collider.GetType());
                                collider.OnCharacterCollision(character);
                            }
                        }
                    }
                }

                // move
                var newPos = character.Collider.Position + velocity;
                character.SetPosition(newPos);

                // ground checking after movement
                character.IsOnGround = false;
                var bottomBox = new RectInt(character.Collider.Min.X, character.Collider.Max.Y + 1, character.Collider.Width, 1);
                for (int j = 0; j < m_AllColliders.Count; j++)
                {
                    var collider = m_AllColliders[j];

                    if (!collider.IsActive)
                    {
                        continue;
                    }

                    // check bottom
                    bool standOnThis = collider.Collider.Overlap(bottomBox);

                    // invoke Enter / Exit event
                    if (standOnThis)
                    {
                        // not on this platform the previous frame
                        if (!collider.IsCharacterOnThisCollider(character))
                        {
                            collider.OnCharacterStepOn(character);
                        }
                    }
                    else
                    {
                        // on this platform the previous frame
                        if (collider.IsCharacterOnThisCollider(character))
                        {
                            collider.OnCharacterLiftOff(character);
                        }
                    }

                    character.IsOnGround |= standOnThis;
                }

                // falling out of the zone
                if (character.Collider.Position.Y + TowerTopNode.Bounds.Position.Y + 1 > m_TowerSize.Y)
                {
                    character.AddHealth(-999);
                    character.IsActive = false;
                }

                if (character.Collider.Position.Y + TowerTopNode.Bounds.Position.Y <= 0)
                {
                    character.IsActive = false;
                }

                //FrameLogger.Log(velocity + newPos.ToString());
            }
        }
        protected override void handleOnKeyPressed(ConsoleKeyInfo keyInfo)
        {
            if (keyInfo.Key == ConsoleKey.F9)
            {
                FrameLogger.Toggle();
            }
            else if (keyInfo.Key == ConsoleKey.F1)
            {
                m_OptimizedMode = !m_OptimizedMode;
            }

            if (State == GameState.Menu)
            {
                if (keyInfo.Key == ConsoleKey.Escape)
                {
                    IsRunning = false;
                }
                else if (keyInfo.Key == ConsoleKey.UpArrow)
                {
                    m_CurrentMenuSelection = (m_CurrentMenuSelection - 1 < 0) ? c_OptionTexts.Count - 1 : m_CurrentMenuSelection - 1;
                    selectOption(m_CurrentMenuSelection);
                }
                else if (keyInfo.Key == ConsoleKey.DownArrow)
                {
                    m_CurrentMenuSelection = (m_CurrentMenuSelection + 1 > c_OptionTexts.Count - 1) ? 0 : m_CurrentMenuSelection + 1;
                    selectOption(m_CurrentMenuSelection);
                }
                else if (keyInfo.Key == ConsoleKey.Enter)
                {
                    confirmOption(m_CurrentMenuSelection);
                }
            }
            else if (State == GameState.InGame)
            {
                for (int i = 0; i < World.Characters.Count; i++)
                {
                    var character = World.Characters[i];

                    if (keyInfo.Key == c_InputTable[i, 0])
                    {
                        character.TurnRight();
                    }
                    else if (keyInfo.Key == c_InputTable[i, 1])
                    {
                        character.TurnLeft();
                    }
                }

                if (keyInfo.Key == ConsoleKey.F1)
                {
                    World.BackgroundImageNode.IsActive = !m_OptimizedMode;
                }
                else if (keyInfo.Key == ConsoleKey.Escape)
                {
                    loadScene(enterMainMenu, delegate { });
                }

                if (IsFinished)
                {
                    if (keyInfo.Key == ConsoleKey.Enter)
                    {
                        if (m_InputName.Length <= 0)
                        {
                            m_InputName = new StringBuilder("SOMEONE");
                        }

                        switch (Mode)
                        {
                        case GameMode.SinglePlayer:
                            SaveProgress.AddRecord(GameMode.SinglePlayer, m_InputName.ToString(), World.TotalLevelCounter);
                            break;

                        case GameMode.TwoPlayers:
                            SaveProgress.AddRecord(GameMode.TwoPlayers, m_InputName.ToString(), World.TotalLevelCounter);
                            break;
                        }
                        loadScene(enterMainMenu, delegate { });
                    }
                    else if (keyInfo.Key == ConsoleKey.Backspace)
                    {
                        if (m_InputName.Length > 0)
                        {
                            m_InputName.Length--;
                            AudioManager.Instance.BeepMusic(80, 20);
                            m_InputText.text = m_InputName.ToString();
                        }
                    }
                    else if (keyInfo.Key != ConsoleKey.RightArrow && keyInfo.Key != ConsoleKey.LeftArrow)
                    {
                        if (m_InputName.Length < 12)
                        {
                            m_InputName.Append(keyInfo.KeyChar);
                            AudioManager.Instance.BeepMusic(150, 20);
                            m_InputText.text = m_InputName.ToString();
                        }
                    }
                }
                else
                {
                    if (keyInfo.Key == ConsoleKey.F2)
                    {
                        if (IsPaused)
                        {
                            Resume();
                        }
                        else
                        {
                            Pause();
                        }
                    }
                }
            }
            else if (State == GameState.Tutorial)
            {
                if (keyInfo.Key == ConsoleKey.Escape)
                {
                    loadScene(enterMainMenu, delegate { });
                }
            }
            else if (State == GameState.Leaderboard)
            {
                if (keyInfo.Key == ConsoleKey.Escape)
                {
                    loadScene(enterMainMenu, delegate { });
                }
            }
        }
        private void gameLoop()
        {
            long minimumStepPerFrame = 20;

            var stopwatch = new Stopwatch();

            stopwatch.Start();

            long timeStep = minimumStepPerFrame;

            while (true)
            {
                // debug
                //string frameInfo = string.Format("FRAME: {0, -5}- TIMESTEP: {1, -5}- NODE CT: {2, -5}", ++frameCounter, timeStep, UINode.Engine.Instance.NodeIdCounter);
                //FrameLogger.Log(frameInfo);

                // input
                Input.KeyboardListener.Instance.QueryInput();

                // logic update
                update(timeStep);

                // rendering
                UINode.Engine.Instance.PreRenderNodes();
                UINode.Engine.Instance.RenderNodesToBuffer();
                UINode.Engine.Instance.DrawToConsole();

                // late logic update, after render
                postRenderUpdate(timeStep);

                // logging
                FrameLogger.DrawFrameLog();

                // scene loading
                if (WillChangeScene)
                {
                    Console.SetCursorPosition(0, UINode.Engine.Instance.RootNode.Bounds.Min.Y + 0);
                    Console.WriteLine("LOADING......");

                    WillChangeScene = false;

                    Audio.AudioManager.Instance.End();
                    UINode.Engine.Instance.Destruction();

                    m_ExitSceneCall.Invoke();
                    m_NextSceneInitCall.Invoke();

                    Audio.AudioManager.Instance.Begin();
                }
                else
                {
                    // time calculation
                    timeStep = stopwatch.ElapsedMilliseconds;

                    if (timeStep < minimumStepPerFrame)
                    {
                        int sleep = (int)(minimumStepPerFrame - timeStep);
                        System.Threading.Thread.Sleep(sleep);
                        timeStep = minimumStepPerFrame;
                    }

                    stopwatch.Restart();
                }

                if (!IsRunning)
                {
                    break;
                }
            }

            stopwatch.Stop();
        }