예제 #1
0
 public HallOfameState(Serpents serpents)
 {
     _serpents = serpents;
     _hofPainter = new HofPainter(serpents.LContent);
     _entry = new HallOfFame.Entry("", _serpents.Score);
     _entryIndex = _serpents.LContent.HallOfFame.Insert(_entry);
 }
예제 #2
0
 public PlayingState(Serpents serpents, SerpentCamera serpentCamera)
 {
     SerpentCamera = serpentCamera;
     _serpents = serpents;
     _serpents.PlayerSerpent.DirectionTaker = this;
     _serpents.ParallelToDos.AddOneShot(0.9f, () => _serpents.PlayerCave.OpenDoor = false);
     _serpents.EnemyCave.OpenDoor = false;
 }
예제 #3
0
 public static HomingDevice Attach(Serpents serpents, bool player = true, bool enemies = true)
 {
     var hd = new HomingDevice(serpents);
     if (player)
         serpents.PlayerSerpent.DirectionTaker = hd;
     if (enemies)
         serpents.Enemies.ForEach(_ => _.DirectionTaker = hd);
     return hd;
 }
예제 #4
0
        public AttractState(Serpents serpents)
        {
            _serpents = serpents;
            _attractBigTexts = new AttractBigTexts(serpents.LContent);

            _serpents.PlayerSerpent.DirectionTaker = this;
            _serpents.Enemies.ForEach(_ => _.DirectionTaker = null);

            _cameraMovements.AddDurable(GetOverviewMoveCamera(_serpents.Camera));
            _cameraMovements.AddWait(10);
        }
예제 #5
0
        public Frog(
            LarvContent lcontent,
            IVEffect effect,
            Serpents serpents)
            : base(effect)
        {
            _model = lcontent.Load<Model>(@"Models/frog");
            _modelRotation = Matrix.RotationY(MathUtil.Pi)*Matrix.Scaling(0.1f);

            _texture = lcontent.Load<Texture2D>(@"models/frogskin");
            _serpents = serpents;
            _ground = lcontent.Ground;
            Restart();
        }
예제 #6
0
        public DieState(Serpents serpents)
        {
            _serpents = serpents;

            HomingDevice.Attach(_serpents, false);
            _serpents.PlayerCave.OpenDoor = true;
            _serpents.EnemyCave.OpenDoor = true;

            // zoom out while ghost goes up and enemies goes home
            var forward = _serpents.PlayerSerpent.LookAtPosition - _serpents.Camera.Position;
            forward.Normalize();
            _todo.AddDurable(new MoveCamera(
                _serpents.Camera,
                4f.Time(), // time to look at death scene
                _serpents.Camera.Position - forward*8,
                () => _serpents.PlayerSerpent.LookAtPosition));
        }
예제 #7
0
        public GotoBoardState(Serpents serpents, int scene)
        {
            _serpents = serpents;
            _scene = scene;
            _signEffect = _serpents.LContent.LoadEffect("effects/signtexteffect");

            HomingDevice.Attach(serpents).CanTurnAround = true;
            _serpents.PlayerCave.OpenDoor = true;

            _signPosition = _serpents.LContent.Ground.SignPosition + Vector3.Up*1.5f;
            var direction = Vector3.Left;
            var toCameraPosition = _signPosition + direction*2.4f;

            #if !DEBUG
            const float time1 = 10f;
            const float time2 = 0.25f;
            #else
            var time1 = 2.5f;
            var time2 = 2f;
            #endif
            // move to the board in an arc
            _actions.AddDurable(() => new MoveCameraArc(_serpents.Camera, time1.UnitsPerSecond(), toCameraPosition, Vector3.Right, 5));

            // look at the board for two seconds, while resetting the playing field
            _actions.AddOneShot(time2, () =>
            {
                _serpents.Restart(_scene);
                HomingDevice.Attach(_serpents);
            });

            Vector3 toPosition, toLookAt;
            _serpents.PlayingField.GetCameraPositionForLookingAtPlayerCave(out toPosition, out toLookAt);

            // turn around the camera to look at the cave
            _actions.AddDurable(
                () => new MoveCameraYaw(_serpents.Camera, 2f.Time(), toPosition, StartSerpentState.GetPlayerInitialLookAt(_serpents.PlayingField)));
        }
예제 #8
0
        public StartSerpentState(Serpents serpents)
        {
            _serpents = serpents;
            HomingDevice.Attach(_serpents).CanTurnAround = true;

            Vector3 toPosition, toLookAt;
            _serpents.PlayingField.GetCameraPositionForLookingAtPlayerCave(out toPosition, out toLookAt);

            _actions.AddDurable(new MoveCameraYaw(
                serpents.Camera,
                5f.UnitsPerSecond(),
                toPosition,
                GetPlayerInitialLookAt(_serpents.PlayingField)));
            _actions.AddOneShot(() => _serpents.PlayerSerpent.Restart(_serpents.PlayingField, 1));
            _actions.AddWhile(time => _serpents.PlayingField.FieldValue(_serpents.PlayerSerpent.Whereabouts).Restricted != Direction.None);
            _actions.AddOneShot(() =>
            {
                _serpentCamera = new SerpentCamera(_serpents.Camera, _serpents.PlayerSerpent, 0, 1, 8);
                while (_serpents.Enemies.Count > 3 + _serpents.Scene) // remove spawned serpents
                    _serpents.Enemies.RemoveAt(0);
                foreach (var enemy in _serpents.Enemies)
                    enemy.DirectionTaker = null;
            });
        }
예제 #9
0
        public LevelCompleteState(Serpents serpents)
        {
            _serpents = serpents;

            _homingDevice = new HomingDevice(_serpents);
            _serpents.PlayerSerpent.DirectionTaker = this;

            Vector3 toPosition, toLookAt;
            _serpents.PlayingField.GetCameraPositionForLookingAtPlayerCave(out toPosition, out toLookAt);

            _moveCamera = new MoveCamera(
                _serpents.Camera,
                4.5f.UnitsPerSecond(),
                toPosition,
                () => _serpents.PlayerSerpent.LookAtPosition);

            _serpents.PlayerCave.OpenDoor = true;

            // wait until serpent is in cave, then give length bonus
            _todo.AddOneShot(() => _homeIsNearCaveEntrance = true);
            _todo.AddWhile(time => !_serpentIsHome);
            _todo.AddOneShot(() =>
            {
                _serpents.PlayerSerpent.IsPregnant = false;
                _haltSerpents = true;
            });
            for (var i = 0; i < _serpents.PlayerSerpent.Length; i++)
                _todo.AddOneShot(1, () =>
                {
                    var tailSegement = _serpents.PlayerSerpent.RemoveTailWhenLevelComplete();
                    if (tailSegement != null)
                        _serpents.AddAndShowScore(500, tailSegement.Position);
                });

            // wait until all bonus texts gone
            _todo.AddWhile(time => _serpents.FloatingTexts.Items.Any());
            _todo.AddOneShot(() =>
            {
                _serpentIsHome = false;
                _haltSerpents = false;
                _homeIsNearCaveEntrance = false;
            });
            //_todo.AddWhile(time => !_serpentIsHome);

            _todo.AddOneShot(() =>
            {
                if (_serpents.PlayerEgg == null)
                {
                    _haltSerpents = false;
                    return;
                }
                _bonusLives = 1;
                _serpents.PlayerSerpent.DirectionTaker = null;
                var playerEggPosition = _serpents.PlayerEgg.Position;
                _moveCamera = new MoveCamera(_serpents.Camera, 2f.Time(), toPosition, () => playerEggPosition);
                // wait two sec (for camera) and then drive the baby home
                _todo.InsertNext(
                    time => time < 2,
                    time =>
                    {
                        _serpents.PlayerSerpent.Restart(_serpents.PlayingField, 0, _serpents.PlayerEgg.Whereabouts);
                        _serpents.PlayerEgg = null;
                        _serpents.PlayerSerpent.DirectionTaker = this;
                        _haltSerpents = false;
                        _serpentIsHome = false;
                        return false;
                    });
            });

            // make sure the camera aims at a serpent (the original or the new born baby)
            _todo.AddOneShot(() =>
            {
                _moveCamera = new MoveCamera(_serpents.Camera, 1f.Time(), toPosition, () => _serpents.PlayerSerpent.LookAtPosition);
            });

            _todo.AddWhile(time => (!_serpentIsHome || _serpents.FloatingTexts.Items.Any()) && time < 10);
        }
예제 #10
0
 public GameOverState(Serpents serpents)
 {
     _serpents = serpents;
     _todo.AddDurable(AttractState.GetOverviewMoveCamera(_serpents.Camera));
     _todo.AddWait(2);
 }
예제 #11
0
        protected override void LoadContent()
        {
            _lcontent = new LarvContent(GraphicsDevice, Content, loadSceneDescriptions());

            var shadowCameraPos = new Vector3(12, 4, 12) - VisionContent.SunlightDirection*32;
            var shadowCameraLookAt = shadowCameraPos + VisionContent.SunlightDirection;
            _lcontent.ShadowMap.Camera.Update(shadowCameraPos, shadowCameraLookAt);

            var camera = new Camera(
                _lcontent.ClientSize,
                new KeyboardManager(this),
                new MouseManager(this),
                new PointerManager(this),
                AttractState.CameraPosition,
                AttractState.CameraLookAt) {MovingSpeed = 8};
            _serpents = new Serpents(_lcontent, camera, 0);
            _lcontent.ShadowMap.ShadowCastingObjects.Add(_serpents);
            _gameState = new AttractState(_serpents);

            base.LoadContent();
        }
예제 #12
0
 public HomingDevice(Serpents serpents)
 {
     PlayerPathFinder = new PathFinder(serpents.PlayingField, serpents.PlayingField.PlayerWhereaboutsStart);
     EnemyPathFinder = new PathFinder(serpents.PlayingField, serpents.PlayingField.EnemyWhereaboutsStart);
 }