Пример #1
0
        public override void RunGreenSpace(BoardController board, BoardController.BoardSpace space, Action after)
        {
            Sprite       tentacleSprite = GFX.SpriteBank.Create("madelinePartyTentacle");
            SubHUDSprite tentacle       = new SubHUDSprite(tentacleSprite);
            Vector2      targetPosition = space.screenPosition - new Vector2(tentacleSprite.Width * scaleFactor / 2, 27 * scaleFactor);

            tentacle.Depth = -40000;
            board.Scene.Add(tentacle);
            tentacle.Position = targetPosition;
            List <Sprite> tentacleExtensions = new List <Sprite>();

            float posOffset = tentacleSprite.Height;

            tentacleSprite.Scale = new Vector2(scaleFactor);
            while (tentacle.Position.Y + posOffset < Engine.ViewHeight)
            {
                Sprite extension = GFX.SpriteBank.Create("madelinePartyTentacle");
                extension.Play("long");
                tentacle.Add(extension);
                extension.Position = new Vector2(0, posOffset * scaleFactor);
                extension.Scale    = new Vector2(scaleFactor);
                posOffset         += extension.Height;
                tentacleExtensions.Add(extension);
            }
            tentacle.Position.Y = Engine.ViewHeight;

            Tween riseTween = Tween.Create(Tween.TweenMode.Oneshot, Ease.CubeIn, 0.25f, true);

            riseTween.OnUpdate   = t => tentacle.Position.Y = Calc.LerpClamp(Engine.ViewHeight, targetPosition.Y, t.Eased);
            riseTween.OnComplete = t => {
                tentacleSprite.Play("tentacle_grab");
                board.Add(new Coroutine(PullDown(board, after, tentacle, space)));
            };
            board.Add(riseTween);
        }
Пример #2
0
 private void dragToPos(SubHUDSprite tentacle, IEnumerable <PlayerToken> tokens, Vector2 position, Vector2 tentacleOffset)
 {
     tentacle.Position = position - tentacleOffset;
     foreach (PlayerToken token in tokens)
     {
         token.Position = position;
     }
 }
Пример #3
0
        private void CheckSeekerCollision(BoardController board, SubHUDSprite seeker)
        {
            PlayerToken token;

            if ((token = seeker.CollideFirst <PlayerToken>()) != null)
            {
                token.Add(new Coroutine(token.Respawn()));
                token.OnRespawn = (t) => board.ChangeStrawberries(t.id, -5);
            }
        }
Пример #4
0
        private IEnumerator PullDown(BoardController board, Action after, SubHUDSprite tentacle, BoardController.BoardSpace startSpace)
        {
            yield return(1.5f);

            // The highest space with the exact same x
            // Or if there is no space with the same x
            // Then the closest space to the point at the bottom of the screen but with the same x
            BoardController.BoardSpace endSpace = BoardController.boardSpaces
                                                  .FindAll(s => s.x == startSpace.x && !s.screenPosition.Equals(startSpace.screenPosition))
                                                  .OrderBy(a => a.y)
                                                  .DefaultIfEmpty(BoardController.boardSpaces
                                                                  .OrderBy(a => (a.screenPosition - new Vector2(startSpace.screenPosition.X, Engine.ViewHeight)).LengthSquared())
                                                                  .First(s => !s.screenPosition.Equals(startSpace.screenPosition)))
                                                  .First();

            var grabbed = board.playerTokens.Where(t => t != null && t.currentSpace.screenPosition.Equals(startSpace.screenPosition));

            tentacle.sprite.Play("tentacle_pull");
            Vector2 offset = new Vector2(tentacle.sprite.Width * scaleFactor / 2, 27 * scaleFactor);
            Vector2 speed  = (endSpace.screenPosition - startSpace.screenPosition).SafeNormalize() * 150 * Engine.DeltaTime;
            Vector2 pos    = startSpace.screenPosition;

            while (tentacle.Position != endSpace.screenPosition - offset)
            {
                pos    = Vector2.Clamp(pos + speed, Vector2.Min(startSpace.screenPosition, endSpace.screenPosition), Vector2.Max(startSpace.screenPosition, endSpace.screenPosition));
                speed += speed.SafeNormalize() * 150 * Engine.DeltaTime;
                dragToPos(tentacle, grabbed, pos, offset);
                yield return(null);
            }
            yield return(0.5f);

            float tentacleStartY = tentacle.Position.Y;

            tentacle.sprite.Rate = 0.5f;
            tentacle.sprite.Play("tentacle_ungrab");

            tentacle.sprite.OnLastFrame = s => {
                tentacle.sprite.OnLastFrame = null;
                Tween fallTween = Tween.Create(Tween.TweenMode.Oneshot, Ease.CubeInOut, 0.25f, true);
                fallTween.OnUpdate   = t => tentacle.Position.Y = Calc.LerpClamp(tentacleStartY, Engine.ViewHeight + tentacle.sprite.Height * scaleFactor, t.Percent);
                fallTween.OnComplete = t => {
                    tentacle.RemoveSelf();
                    after();
                };
                board.Add(fallTween);
            };

            foreach (PlayerToken token in grabbed)
            {
                token.currentSpace = endSpace;
            }
        }
Пример #5
0
        public override void RunGreenSpace(BoardController board, BoardController.BoardSpace space, Action after)
        {
            Sprite       seekerSprite = GFX.SpriteBank.Create("seeker");
            SubHUDSprite seeker       = new SubHUDSprite(seekerSprite);

            seeker.Collider = new Hitbox(50, 50, -25, -25);
            seeker.Depth    = -40000;
            board.Scene.Add(seeker);
            seeker.Position    = space.screenPosition + startOffset;
            seekerSprite.FlipX = true;
            seekerSprite.Play("recover");
            seekerSprite.OnFinish += s => seekerSprite.Play("windUp");
            seekerSprite.Scale     = new Vector2(2, 2);
            board.Add(new Coroutine(SeekerCharge(board, after, seeker, seeker.Position, space.screenPosition - startOffset / 2)));
        }
Пример #6
0
        private IEnumerator SeekerCharge(BoardController board, Action after, SubHUDSprite seeker, Vector2 start, Vector2 end)
        {
            yield return(0.6f);

            float speed = -6;

            while ((start - end).Sign().Equals((seeker.Position - end).Sign()))
            {
                CheckSeekerCollision(board, seeker);
                speed            = Calc.Approach(speed, 26f, 30f * Engine.DeltaTime);
                seeker.Position += speed * (end - start).SafeNormalize();
                yield return(null);
            }
            while (speed > 0.5)
            {
                CheckSeekerCollision(board, seeker);
                speed            = Calc.Approach(speed, 0, 40f * Engine.DeltaTime);
                seeker.Position += speed * (end - start).SafeNormalize();
                yield return(null);
            }
            seeker.sprite.Play("takeHit");
            seeker.sprite.OnLoop = s => { seeker.RemoveSelf(); after(); };
        }