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); }
private void dragToPos(SubHUDSprite tentacle, IEnumerable <PlayerToken> tokens, Vector2 position, Vector2 tentacleOffset) { tentacle.Position = position - tentacleOffset; foreach (PlayerToken token in tokens) { token.Position = position; } }
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); } }
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; } }
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))); }
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(); }; }