public void Tick(SceneGame scene)
        {
            var tile = Curio.GetMainTile();

            if (MoveFrame.Done)
            {
                MoveFrame = new Slider(MoveFrame.Time - MoveFrame.EndTime, MoveFrame.EndTime);
                var camera = Curio.GetCamera();

                var offset   = Direction.ToTileOffset();
                var neighbor = tile.GetNeighborOrNull(offset.X, offset.Y);
                if (neighbor == null)
                {
                    //Out of bounds
                    Curio.Destroy();
                }
                else
                {
                    Curio.MoveTo(neighbor, MoveLerp, MoveFrame);
                    camera?.MoveTo(neighbor, LerpHelper.Linear, MoveFrame);
                }
            }

            if (LifeTime.Done)
            {
                //Fizzle
                Curio.Destroy();
            }

            LifeTime  += scene.TimeModCurrent;
            MoveFrame += scene.TimeModCurrent;
        }
Example #2
0
        private void GenerateMap()
        {
            var generator = new MapGenerator();

            generator.Generate();
            generator.Print(Map);

            RunStats.Level += 1;

            new Curio(Template.BellTower).MoveTo(Map.GetTile(0, 0));

            var   positions = Map.EnumerateTiles().Shuffle(Random);
            Point?start     = null;

            var weak   = new List <Template>();
            var strong = new List <Template>();

            bool hasOmicron = PlayerCurio.HasBehaviors <BehaviorOmicron>();

            //TODO: There was gonna be a tutorial with blood urns for smashing
            if (RunStats.Level >= 1)
            {
                weak.Add(Template.Grunt);
            }
            if (RunStats.Level >= 2)
            {
                weak.Add(Template.Twitch);
            }
            if (RunStats.Level >= 3)
            {
                weak.Add(Template.Bulwark);
            }
            if (RunStats.Level >= 4)
            {
                strong.Add(Template.Lich);
            }
            if (RunStats.Level >= 5)
            {
                weak.Remove(Template.Grunt);
            }
            if (RunStats.Level % 2 == 0)
            {
                weak.Add(Template.Rat);
            }

            weak.Add(Template.Executioner);
            weak.Add(Template.Lich);

            var toSpawn = new List <Template>();

            if (weak.Any())
            {
                for (int i = 0; i < 30; i++)
                {
                    toSpawn.Add(weak.Pick(Random));
                }
            }
            if (strong.Any())
            {
                for (int i = 0; i < 5; i++)
                {
                    toSpawn.Add(strong.Pick(Random));
                }
            }
            if (hasOmicron || (RunStats.Level >= 6 && RunStats.Level % 3 == 0))
            {
                toSpawn.Add(Template.Nemesis);
            }

            var spawned = new List <ICurio>();

            foreach (var tile in positions)
            {
                if (toSpawn.Any() && !tile.IsSolid() && !tile.IsChasm())
                {
                    var template = toSpawn[0];
                    toSpawn.RemoveAt(0);
                    var enemy = new Curio(template);
                    enemy.MoveTo(tile);
                    if (template != Template.Nemesis && template != Template.Rat)
                    {
                        spawned.Add(enemy);
                    }
                    if (template == Template.Nemesis && hasOmicron)
                    {
                        Behavior.Apply(new BehaviorKillTarget(enemy));
                    }
                }
                else if (tile.HasBehaviors <BehaviorLevelStart>())
                {
                    start = new Point(tile.X, tile.Y);
                }
                if (toSpawn.Empty() && start.HasValue)
                {
                    break;
                }
            }

            if (RunStats.Level % 3 == 0)
            {
                foreach (var enemy in spawned.Shuffle(Random).Take(3))
                {
                    Behavior.Apply(new BehaviorKillTarget(enemy));
                }
            }

            PlayerCurio.MoveTo(Map.GetTile(start.Value.X, start.Value.Y));
            CameraCurio.MoveTo(Map.GetTile(start.Value.X, start.Value.Y));
        }