private void AttackEntity(ConsoleEntity entity, Coord targetCoord)
        {
            var animationEntity = entity.Children.First(p => p is ConsoleEntity) as ConsoleEntity;

            animationEntity.Animation = animationEntity.Animations["damage"];
            animationEntity.Animation.Restart();
        }
Esempio n. 2
0
 // Create a player using SadConsole's Entity class
 private static void CreatePlayer()
 {
     player = new SadConsole.Entities.Entity(1, 1);
     player.Animation.CurrentFrame[0].Glyph      = '@';
     player.Animation.CurrentFrame[0].Foreground = Color.HotPink;
     player.Position = new Point(20, 10);
 }
        private void DiedEntity(ConsoleEntity entity)
        {
            var         animated = new Animated("default", 1, 1, _adventureFont);
            BasicNoDraw frame    = animated.CreateFrame();

            frame[0].Glyph      = 143;
            frame[0].Foreground = Color.Gainsboro;
            entity.Animation    = animated;
        }
Esempio n. 4
0
        /// <summary>
        /// Este método é chamado depois do Main(), é aqui que preparamos o que vamos precisar.
        /// </summary>
        static void Init()
        {
            // No início de cada partida, invertemos a ordem dos jogadores
            quemComecou = (Jogador)((int)quemComecou * -1);

            // E aqui definimos, com base no anterior, se é o jogador1 a jogar agora
            quemJoga = quemComecou;

            // Estamos a começar um jogo
            GameComplete = false;

            // Daqui para baixo vamos tratar de gráficos
            // Preparar umm tipo de letra mais giro (quadrangular) e GRANDE!
            var fontMaster = Global.LoadFont("font/simplemood.font");
            var fontVezes1 = fontMaster.GetFont(Font.FontSizes.One);
            var fontVezes4 = fontMaster.GetFont(Font.FontSizes.Four);

            // Criar uma consola "mãe", que vai ser o nosso ecrã
            var console = new Console(Width, Height);

            console.Font         = fontVezes1;
            Global.CurrentScreen = console;

            // Preparar a consola que contém o nosso tabuleiro
            gameConsole      = new Console(7, 7);
            gameConsole.Font = fontVezes4;
            console.Children.Add(gameConsole);

            // Preparar a consola onde vamos mostrar os resultados
            scoreBoard          = new Console(12, Height);
            scoreBoard.Position = new Point(28, 0);
            scoreBoard.Font     = fontVezes1;
            console.Children.Add(scoreBoard);

            // Vamos inicializar um novo tabuleiro
            board = new GameBoard();

            // Vamos chamar um Método que desenha a nosso tabuleiro.
            PrintGameConsole();

            // Agora que temos um tabuleiro, vamos criar um Cursor para sabermos onde estamos.
            cursor          = new SadConsole.Entities.Entity(1, 1);
            cursor.Position = new Point(1, 1);
            cursor.Font     = fontVezes4;
            cursor.Animation.CurrentFrame[0].Glyph = '_';
            console.Children.Add(cursor);
        }
Esempio n. 5
0
        /// <summary>
        ///
        /// </summary>
        /// <param name="width"></param>
        /// <param name="height"></param>
        /// <param name="frames"></param>
        /// <param name="blankChance"></param>
        /// <returns></returns>
        public static SadConsole.Entities.Entity CreateStaticEntity(int width, int height, int frames, double blankChance)
        {
            SadConsole.Entities.Entity    entity    = new SadConsole.Entities.Entity();
            SadConsole.Entities.Animation animation = new SadConsole.Entities.Animation("default", width, height);


            for (int f = 0; f < frames; f++)
            {
                var frame = animation.CreateFrame();

                for (int x = 0; x < width; x++)
                {
                    for (int y = 0; y < height; y++)
                    {
                        int character = Engine.Random.Next(48, 168);

                        if (Engine.Random.NextDouble() <= blankChance)
                        {
                            character = 32;
                        }


                        frame.SetCharacter(x, y, character);
                        frame.SetForeground(x, y, Microsoft.Xna.Framework.Color.White * (float)(Engine.Random.NextDouble() * (1.0d - 0.5d) + 0.5d));
                    }
                }
            }

            animation.AnimationDuration = 1;
            animation.Repeat            = true;

            entity.AddAnimation(animation);
            entity.SetActiveAnimation(animation);
            entity.Start();

            return(entity);
        }
 private void MoveEntity(ConsoleEntity entity, Coord destination)
 {
     entity.Position      = new Point(destination.X, destination.Y);
     _mapConsole.ViewPort = new Microsoft.Xna.Framework.Rectangle(destination.X - _mapViewWidth / 2, destination.Y - _mapViewHeight / 2, _mapViewWidth, _mapViewHeight);
     _entityManager.Sync();
 }
        /// <summary>
        ///
        /// </summary>
        public void UpdateGame()
        {
            if (!_mapConsole.IsVisible || LastUpdate.Add(GameSpeed) >= DateTime.Now)
            {
                return;
            }

            LastUpdate = DateTime.Now;

            // next frame
            if (Adventure.AdventureLogs.Count == 0 && Adventure.HasNextFrame())
            {
                Adventure.NextFrame();
            }

            if (!Adventure.AdventureLogs.TryDequeue(out AdventureLog adventureLog))
            {
                GameSpeed = TimeSpan.Zero;
                return;
            }

            if (_mogwai.CombatState != CombatState.None)
            {
                // combat gamespeed
                GameSpeed = CombatActionDelay;
            }
            else
            {
                // gamespeed of unseen entities have no delay
                GameSpeed = _mogwai.CanSee(Adventure.Map.Entities.FirstOrDefault(p => p.AdventureEntityId == adventureLog.Source)) ? ActionDelay : TimeSpan.Zero;
            }

            // redraw map
            DrawExploMap();

            //DrawMap();
            adventureLog.SourceFovCoords?.ToList().ForEach(p => _mapConsole[p.X, p.Y].Background = Color.Lerp(Color.Yellow, Color.Black, 0.50f));

            // stats
            _statsConsole.Print(2, 0, Adventure.GetRound.ToString().PadLeft(4), Color.Gold);
            _statsConsole.Print(2, 1, Adventure.AdventureStats[AdventureStats.Explore].ToString("0%").PadLeft(4), Color.Gold);
            _statsConsole.Print(2, 2, Adventure.AdventureStats[AdventureStats.Monster].ToString("0%").PadLeft(4), Color.Gold);
            _statsConsole.Print(2, 3, Adventure.AdventureStats[AdventureStats.Boss].ToString("0%").PadLeft(4), Color.Gold);
            _statsConsole.Print(2, 4, Adventure.AdventureStats[AdventureStats.Treasure].ToString("0%").PadLeft(4), Color.Gold);
            _statsConsole.Print(2, 5, Adventure.AdventureStats[AdventureStats.Portal].ToString("0%").PadLeft(4), Color.Gold);

            switch (adventureLog.Type)
            {
            case LogType.Info:
                //Adventure.Enqueue(AdventureLog.Info(this, target, ActivityLog.Create(ActivityLog.ActivityType.Attack, ActivityLog.ActivityState.Success, new int[] { damage, criticalDamage, (int)DamageType.Weapon }, weaponAttack)));
                var source      = Adventure.Entities[adventureLog.Source];
                var target      = Adventure.Entities[adventureLog.Target];
                var message     = "";
                var activityLog = adventureLog.ActivityLog;
                switch (activityLog.Type)
                {
                case ActivityLog.ActivityType.Cast:
                    var spell = activityLog.ActivityObject as Spell;
                    message = $"{Coloring.Name(source.Name)} cast " +
                              $"{Coloring.Violet(spell.Name)} on {Coloring.Name(target.Name)} roll " +
                              $"{activityLog.Numbers[0].ToString()}:";
                    switch (activityLog.State)
                    {
                    case ActivityLog.ActivityState.Success:
                        message = $"{message} {Coloring.Green("success")}!";
                        break;

                    case ActivityLog.ActivityState.Fail:
                        message = $"{message} {Coloring.Red("failed")}!";
                        break;

                    case ActivityLog.ActivityState.Init:
                        message = $"{Coloring.Name(source.Name)} starting to cast {Coloring.Violet(spell.Name)}.";
                        break;
                    }
                    break;

                case ActivityLog.ActivityType.Attack:
                    var weaponAttack = activityLog.ActivityObject as WeaponAttack;
                    message = $"{Coloring.Name(source.Name)} [{Coloring.Orange(activityLog.Numbers[0].ToString())}] " +
                              $"{weaponAttack.GetType().Name.ToLower()}[{Coloring.Gainsboro(weaponAttack.ActionType.ToString().Substring(0, 1))}] " +
                              $"{Coloring.Name(target.Name)} with {Coloring.DarkName(weaponAttack.Weapon.Name)} roll " +
                              $"{Coloring.Attack(activityLog.Numbers[2] > 0 ? "critical" : activityLog.Numbers[1].ToString())}:";
                    switch (activityLog.State)
                    {
                    case ActivityLog.ActivityState.Success:
                        message = $"{message} {Coloring.Green("hit for")} {Coloring.DoDmg(activityLog.Numbers[3])}[{activityLog.Numbers[4]}] {Coloring.Green("damage!")}";
                        break;

                    case ActivityLog.ActivityState.Fail:
                        message = $"{message} {Coloring.Red("failed")}!";
                        break;

                    case ActivityLog.ActivityState.Init:
                        message = $"{Coloring.Name(source.Name)} [{Coloring.Orange(activityLog.Numbers[0].ToString())}]: Initiating Attack";
                        break;
                    }
                    break;

                case ActivityLog.ActivityType.Heal:
                    message = $"{Coloring.Name(source.Name)} restores {Coloring.GetHeal(activityLog.Numbers[0])} HP from {((HealType)activityLog.Numbers[1]).ToString()} healing.";
                    break;

                case ActivityLog.ActivityType.Damage:
                    message = $"{Coloring.Name(source.Name)} suffers {Coloring.GetDmg(activityLog.Numbers[0])} HP from {((DamageType)activityLog.Numbers[1]).ToString()} damage.";
                    break;

                case ActivityLog.ActivityType.HealthState:
                    var healthState = (HealthState)activityLog.Numbers[0];
                    switch (healthState)
                    {
                    case HealthState.Dead:
                        message = $"{Coloring.Name(source.Name)} has died, may its soul rest in peace. Its health state is {Coloring.Red(healthState.ToString())}.";
                        break;

                    case HealthState.Dying:
                        message = $"{Coloring.Name(source.Name)} got a deadly hit, health state is {Coloring.Red(healthState.ToString())}.";
                        break;

                    case HealthState.Disabled:
                        message = $"{Coloring.Name(source.Name)} got a deadly hit, health state is {Coloring.Red(healthState.ToString())}.";
                        break;
                    }
                    break;

                case ActivityLog.ActivityType.Loot:
                    message = $"{Coloring.Name(source.Name)} is looting {Coloring.DarkGrey(target.Name)}.";
                    break;

                case ActivityLog.ActivityType.Treasure:
                    if (activityLog.State == ActivityLog.ActivityState.Success)
                    {
                        message = $"{Coloring.DarkGrey(_mogwai.Name)} found a treasure!";
                    }
                    else
                    {
                        message = $"{Coloring.DarkGrey(_mogwai.Name)} found nothing!";
                    }
                    break;

                case ActivityLog.ActivityType.Gold:
                    message = $"{Coloring.DarkGrey(_mogwai.Name)} got {Coloring.Gold(activityLog.Numbers[0])} gold";
                    break;

                case ActivityLog.ActivityType.LevelClass:
                    message = Coloring.LevelUp($"You feel the power of the {((ClassType)activityLog.Numbers[0])}'s!");
                    break;

                case ActivityLog.ActivityType.Exp:
                    message = activityLog.ActivityObject == null
                                ? $"You just earned +{Coloring.Exp(activityLog.Numbers[0])} experience!"
                                : $"The {Coloring.Name((activityLog.ActivityObject as Monster).Name)} gave you +{Coloring.Exp(activityLog.Numbers[0])}!";
                    break;

                case ActivityLog.ActivityType.Level:
                    message = $"{Coloring.LevelUp("Congratulations he just made the")} {Coloring.Green(activityLog.Numbers[0].ToString())} {Coloring.LevelUp("th level!")}";
                    break;
                }
                ((PlayScreen)Parent).PushLog(LogType.Info, message);

                break;

            case LogType.Move:
                MoveEntity(_entities[adventureLog.Source], adventureLog.TargetCoord);
                break;

            case LogType.Attack:
                AttackEntity(_entities[adventureLog.Target], adventureLog.TargetCoord);
                break;

            case LogType.Died:
                DiedEntity(_entities[adventureLog.Source]);
                break;

            case LogType.Entity:
                break;

            default:
                throw new ArgumentOutOfRangeException();
            }

            foreach (AdventureEntity entity in Adventure.Map.Entities)
            {
                if (entity.IsStatic)
                {
                    continue;
                }

                ConsoleEntity consoleEntity = _entities[entity.AdventureEntityId];

                consoleEntity.IsVisible =
                    (_mogwai.CanSee(entity) || entity is Combatant combatant && combatant.IsDead) &&
                    _mapConsole.ViewPort.Contains(consoleEntity.Position);
            }
        }
        public void DrawEntity(AdventureEntity adventureEntity)
        {
            int   glyph;
            Color color;

            switch (adventureEntity)
            {
            case Mogwai _:
                glyph = 1;
                color = Color.DarkOrange;
                break;

            case Monster _:
                glyph = 135;     //64;
                color = Color.SandyBrown;
                break;

            case Chest _:
                glyph = 146;     //64;
                color = Color.Pink;
                break;

            default:
                throw new NotImplementedException();
            }

            // TODO: rotating symbols for multiple mogwais
            var         defaultAnim = new Animated("default", 1, 1, _adventureFont);
            BasicNoDraw frame       = defaultAnim.CreateFrame();

            frame[0].Glyph      = glyph;
            frame[0].Foreground = color;

            Coord pos    = adventureEntity.Coordinate;
            var   entity = new ConsoleEntity(defaultAnim)
            {
                Position = new Point(pos.X, pos.Y),
            };

            // damage animation
            var defAnimated = new Animated("default", 1, 1, _adventureFont);
            var animEntity  = new ConsoleEntity(defAnimated);
            var damageAnim  = new Animated("damage", 1, 1, _adventureFont)
            {
                AnimationDuration = 1
            };
            BasicNoDraw damageFrame = damageAnim.CreateFrame();

            damageAnim.CreateFrame();
            damageFrame[0].Glyph      = 15;
            damageFrame[0].Foreground = Color.Red;
            animEntity.Animations.Add("damage", damageAnim);

            // add animation entity
            entity.Children.Add(animEntity);

            // TODO change this ... to a more appropriate handling
            // do not revive ... dead shapes
            if (adventureEntity is Combatant combatant && combatant.IsDead)
            {
                DiedEntity(entity);
            }

            entity.IsVisible = false;

            _entities.Add(adventureEntity.AdventureEntityId, entity);
            _entityManager.Entities.Add(entity);
        }
Esempio n. 9
0
        /// <summary>
        ///
        /// </summary>
        public void UpdateGame()
        {
            if (!_mapConsole.IsVisible || LastUpdate.Add(GameSpeed) >= DateTime.Now)
            {
                return;
            }

            LastUpdate = DateTime.Now;

            // next frame
            if (Adventure.AdventureLogs.Count == 0 && Adventure.HasNextFrame())
            {
                Adventure.NextFrame();
            }

            if (!Adventure.AdventureLogs.TryDequeue(out var adventureLog))
            {
                GameSpeed = TimeSpan.Zero;
                return;
            }

            if (_mogwai.CombatState != CombatState.None)
            {
                // combat gamespeed
                GameSpeed = CombatActionDelay;
            }
            else
            {
                // gamespeed of unseen entities have no delay
                GameSpeed = _mogwai.CanSee(Adventure.Map.Entities.FirstOrDefault(p => p.AdventureEntityId == adventureLog.Source)) ? ActionDelay : TimeSpan.Zero;
            }

            while (Adventure.LogEntries.TryDequeue(out var logEntry))
            {
                if (logEntry.LogType != LogType.AdventureLog)
                {
                    ((PlayScreen)Parent).PushLog(logEntry);
                }
            }

            // redraw map
            DrawExploMap();

            //DrawMap();
            adventureLog.SourceFovCoords?.ToList().ForEach(p => _mapConsole[p.X, p.Y].Background = Color.Lerp(Color.Yellow, Color.Black, 0.50f));

            // stats
            _statsConsole.Print(2, 0, Adventure.GetRound.ToString().PadLeft(4), Color.Gold);
            _statsConsole.Print(2, 1, Adventure.AdventureStats[AdventureStats.Explore].ToString("0%").PadLeft(4), Color.Gold);
            _statsConsole.Print(2, 2, Adventure.AdventureStats[AdventureStats.Monster].ToString("0%").PadLeft(4), Color.Gold);
            _statsConsole.Print(2, 3, Adventure.AdventureStats[AdventureStats.Boss].ToString("0%").PadLeft(4), Color.Gold);
            _statsConsole.Print(2, 4, Adventure.AdventureStats[AdventureStats.Treasure].ToString("0%").PadLeft(4), Color.Gold);
            _statsConsole.Print(2, 5, Adventure.AdventureStats[AdventureStats.Portal].ToString("0%").PadLeft(4), Color.Gold);

            switch (adventureLog.Type)
            {
            case AdventureLog.LogType.Info:
                break;

            case AdventureLog.LogType.Move:
                MoveEntity(_entities[adventureLog.Source], adventureLog.TargetCoord);
                break;

            case AdventureLog.LogType.Attack:
                AttackEntity(_entities[adventureLog.Target], adventureLog.TargetCoord);
                break;

            case AdventureLog.LogType.Died:
                DiedEntity(_entities[adventureLog.Source]);
                break;

            case AdventureLog.LogType.Entity:
                break;

            default:
                throw new ArgumentOutOfRangeException();
            }

            foreach (var entity in Adventure.Map.Entities)
            {
                if (entity.IsStatic)
                {
                    continue;
                }

                ConsoleEntity consoleEntity = _entities[entity.AdventureEntityId];

                consoleEntity.IsVisible =
                    (_mogwai.CanSee(entity) || entity is Combatant combatant && combatant.IsDead) &&
                    _mapConsole.ViewPort.Contains(consoleEntity.Position);
            }
        }