Beispiel #1
0
        protected override void HandleInteractionWithEntity(Entity entity, Level level, UpdateResult updateResult, IntVector2 newPosition, int updateTicks)
        {
            base.HandleInteractionWithEntity(entity, level, updateResult, newPosition, updateTicks);

            switch (entity?.EntityType)
            {
            case EntityTypes.Wall:
            case EntityTypes.Player:
                Collide(updateResult, _motion);
                return;

            case EntityTypes.RedirectTile:
                SetPosition(newPosition);
                var redirectTile = (RedirectTile)entity;
                var redirectDir  = RotationHelper.GetDirectionFromRotationIndex(redirectTile.RedirectDir);

                if (!CanMoveInDirection(level, redirectDir))
                {
                    Collide(updateResult, redirectDir);
                    return;
                }

                SetMotion(redirectDir);
                updateResult.Result = UpdateResult.ResultTypes.Redirected;
                return;

            case EntityTypes.HaltTile:
                SetPosition(newPosition);
                Collide(updateResult, IntVector2.Zero);
                return;

            case EntityTypes.Portal:
                SetPosition(newPosition);
                var portalEntity = (PortalEntity)entity;
                updateResult.Result       = UpdateResult.ResultTypes.DelayAction;
                updateResult.CollisionDir = IntVector2.Zero;
                _delayedAction            = ur =>
                {
                    SetPosition(portalEntity.PortalTarget);
                    updateResult.Result = UpdateResult.ResultTypes.Teleported;
                    return(true);
                };
                return;

            case EntityTypes.FinishFlag:
                SetPosition(newPosition);
                SetMotion(0, 0);
                updateResult.Result = UpdateResult.ResultTypes.ReachedFinish;
                return;

            case EntityTypes.SlidingCrate:
                var slidingCrate = (SlidingCrate)entity;
                // We only need to check for a blocked crate if this is the first update
                if (updateTicks <= 1 && !slidingCrate.CanMoveInDirection(level, _motion))
                {
                    // By pushing the crate this turn we don't add extra delayed ticks
                    slidingCrate.Push(this, _motion);
                    Collide(updateResult, _motion);
                    return;
                }

                // Push the sliding crate
                updateResult.Result       = UpdateResult.ResultTypes.DelayAction;
                updateResult.CollisionDir = _motion;
                _delayedAction            = ur =>
                {
                    slidingCrate.Push(this, _motion);
                    Collide(ur, _motion);
                    return(true);
                };
                return;

            case EntityTypes.Pit:
                SetPosition(newPosition);
                SetMotion(0, 0);
                updateResult.Result = UpdateResult.ResultTypes.FatalResult;
                return;

            case EntityTypes.JumpTile:
                updateResult.Result = UpdateResult.ResultTypes.DelayAction;
                SetPosition(newPosition);
                _delayedAction = ur =>
                {
                    var newPos = _position + 2 * _motion;
                    if (CanMoveToPosition(level, newPos))
                    {
                        ur.Result = UpdateResult.ResultTypes.JumpTo;
                        SetPosition(newPos);
                        return(true);
                    }

                    return(false);
                };
                return;

            case EntityTypes.WireButton:
                updateResult.Result = UpdateResult.ResultTypes.Moved;
                SetPosition(newPosition);

                var wireButtonEntity = (WireButtonEntity)entity;
                wireButtonEntity.Interact();
                return;

            case EntityTypes.WireDoor:
                var wireDoorEntity = (WireDoorEntity)entity;
                if (wireDoorEntity.IsOpen)
                {
                    updateResult.Result = UpdateResult.ResultTypes.Moved;
                    SetPosition(newPosition);
                }
                else
                {
                    Collide(updateResult, _motion);
                }
                return;

            case EntityTypes.Sushi:
                var sushiEntity = (SushiEntity)entity;
                sushiEntity.Collect();
                goto case EntityTypes.None;

            case EntityTypes.None:
            case null:
                SetPosition(newPosition);
                updateResult.Result = UpdateResult.ResultTypes.Moved;
                return;

            default:
                throw new NotSupportedException($"Unsupported interaction between Player and [{entity?.EntityType}]. Please implement interaction!");
            }
        }
        protected override void HandleInteractionWithEntity(Entity entity, Level level, UpdateResult updateResult, IntVector2 newPosition, int updateTicks)
        {
            base.HandleInteractionWithEntity(entity, level, updateResult, newPosition, updateTicks);

            switch (entity?.EntityType)
            {
            case EntityTypes.Wall:
            case EntityTypes.Player:
            case EntityTypes.FinishFlag:
            case EntityTypes.SlidingCrate:
                Collide(updateResult, _motion);
                return;

            case EntityTypes.RedirectTile:
                SetPosition(newPosition);
                var redirectTile = (RedirectTile)entity;
                var redirectDir  = RotationHelper.GetDirectionFromRotationIndex(redirectTile.RedirectDir);

                if (!CanMoveInDirection(level, redirectDir))
                {
                    Collide(updateResult, redirectDir);
                    return;
                }

                SetMotion(redirectDir);
                updateResult.Result = UpdateResult.ResultTypes.Redirected;
                return;

            case EntityTypes.HaltTile:
                SetPosition(newPosition);
                Collide(updateResult, IntVector2.Zero);
                return;

            case EntityTypes.Portal:
                SetPosition(newPosition);
                var portalEntity = (PortalEntity)entity;
                updateResult.Result = UpdateResult.ResultTypes.DelayAction;
                _delayedAction      = ur =>
                {
                    SetPosition(portalEntity.PortalTarget);
                    updateResult.Result = UpdateResult.ResultTypes.Teleported;
                    return(true);
                };
                return;

            case EntityTypes.WireButton:
                updateResult.Result = UpdateResult.ResultTypes.Moved;
                SetPosition(newPosition);

                var wireButtonEntity = (WireButtonEntity)entity;
                wireButtonEntity.Interact();
                return;

            case EntityTypes.WireDoor:
                var wireDoorEntity = (WireDoorEntity)entity;
                if (wireDoorEntity.IsOpen)
                {
                    updateResult.Result = UpdateResult.ResultTypes.Moved;
                    SetPosition(newPosition);
                }
                else
                {
                    Collide(updateResult, _motion);
                }
                return;

            case EntityTypes.Sushi:
            case EntityTypes.None:
            case null:
                SetPosition(newPosition);
                updateResult.Result = UpdateResult.ResultTypes.Moved;
                return;

            default:
                throw new NotSupportedException($"Unsupported interaction between [{EntityType}] and [{entity?.EntityType}]. Please implement interaction!");
            }
        }