public override void Construct(MultiformTransmissionData args)
        {
            RegisterForm(MouseTrailFormName, new MouseTrailForm());
            RegisterForm(MouseCursorFormName, new MouseCursorForm());

            // Nothing special happens in either of these so we just use defaults.
            SetUpdater(() => { UpdateForms(); });
            SetRenderer(() => { RenderForms(); });
        }
        /// <summary>
        /// Return to the level multiform. The "increment" argument indicates whether
        /// we stay on the same level, go to the previous level, or go to the next level.
        /// </summary>
        /// <param name="increment"></param>
        public void ReturnToLevel(int increment)
        {
            var data = new MultiformTransmissionData(MultiformName);

            if (increment == NEXT_LEVEL)
                LevelNameInfo.IncrementLevel();
            else if (increment == PREV_LEVEL)
                LevelNameInfo.DecrementLevel();

            data.SetAttr<LevelNameInfo>("LevelNameInfo", LevelNameInfo);
            FadeOutAndClose(20, Color.White, LevelLoadMultiform.MultiformName,
                data, false, () => { UpdateForms(); }, () => { RenderForms(); });
        }
        public override void Construct(MultiformTransmissionData args)
        {
            if (args.SenderName == LevelMultiform.MultiformName)
            {
                LevelNameInfo = args.GetAttr<LevelNameInfo>("LevelNameInfo");
            }
            else
            {
                throw new MultiformException(
                    String.Format("Unknown multiform layout: '{0}' -> '{1}'.", args.SenderName, MultiformName)
                    );
            }

            Construct_Text();
            Construct_Buttons();

            RegisterForm(new ClickParticleSpawnerForm());

            FadeIn(20, Color.White, Update_Main, Render_Main);
        }
        public void Update_Main()
        {
            base.UpdateTime();

            if (KeyboardInput.IsReleased(Keys.Escape))
            {
                Paused ^= true;
            }

            if (!Paused)
            {
                UpdateForms();

                var form = GetForm<BoardForm>(BoardFormName);
                if (form.LevelComplete)
                {
                    if (LevelNameInfo.Sequential)
                    {
                        if (LevelNameInfo.LevelNumber.Value == LoadedLevelManager.HighestUnlockedLevel)
                            LoadedLevelManager.HighestUnlockedLevel++;
                    }
                    var data = new MultiformTransmissionData(MultiformName);
                    data.SetAttr<LevelNameInfo>("LevelNameInfo", LevelNameInfo);
                    data.SetAttr<LevelInfo>("LevelInfo", LevelInfo);

                    FadeOutAndClose(
                        20, Color.White, LevelCompleteMultiform.MultiformName,
                        data, true, () => { UpdateForms(); }, Render_Main);

                }
                else if (GetForm<GUIButton>(BackButtonFormName).IsReleased(MouseButtons.Left))
                {
                    FadeOutAndClose(
                        20, Color.White, LevelSelectMultiform.MultiformName,
                        null, true, () => { UpdateForms(); }, Render_Main);
                }
            }
        }
        public override void Construct(MultiformTransmissionData args)
        {
            LevelNameInfo = args == null ? new LevelNameInfo(0) : args.GetAttr<LevelNameInfo>("LevelNameInfo");
            LevelInfo = args.GetAttr<LevelInfo>("LevelInfo");

            RegisterForm(BoardFormName, new BoardForm(LevelInfo));
            RegisterForm(InventoryFormName, new InventoryForm(LevelInfo));
            RegisterForm(BackButtonFormName, new GUIButton(
                BackButtonInfo, BackButtonBottomLeft, PositionType.BottomLeft));

            HasTutorialForm = LevelInfo.TutorialNumber.HasValue;
            if (HasTutorialForm)
            {
                var num = LevelInfo.TutorialNumber.Value;
                RegisterForm(TutorialFormName, TutorialManager.GetTutorial(num));
            }

            FadeIn(20, Color.White, Update_Main, Render_Main);
        }
        public override void Construct(MultiformTransmissionData args)
        {
            // We have to set this value to false so that it doesn't automatically start out as
            // true when we reconstruct this multiform, which would cause the player to automatically
            // go back into the last level they selected.
            buttonPressed = false;

            HasScrollBar = false;

            int BUTTON_WIDTH  = Assets.LevelSelect.Images.ClearedLevelButton.Width;
            int BUTTON_HEIGHT = Assets.LevelSelect.Images.ClearedLevelButton.Height;

            int xOffset = INITIAL_LEVEL_SELECT_X_OFFSET;
            int yOffset = INITIAL_LEVEL_SELECT_Y_OFFSET;

            int rowNum          = LoadedLevelManager.SequentialLevels.Length / BUTTONS_PER_ROW,
                totalWidth      = (BUTTON_WIDTH + LEVEL_SELECT_BUTTON_GAP_X - 2) * BUTTONS_PER_ROW,
                totalHeight     = rowNum * BUTTON_HEIGHT + (rowNum - 1) * LEVEL_SELECT_BUTTON_GAP_Y + 200,
                scrollBarHeight = DisplayManager.WindowResolution.Height - 2 * INITIAL_LEVEL_SELECT_Y_OFFSET;

            LevelSelectScrollBar scrollBar = null;

            // We only add a scrollbar if there is not enough room onscreen to fit everything. This occurs
            // when the total vertical space taken up by the level select buttons is greater than that which
            // would've been taken up by the scrollbar.
            if (totalHeight > scrollBarHeight)
            {
                var topLeft = new Vector2(xOffset + totalWidth + 20, yOffset - 10);
                scrollBar = new LevelSelectScrollBar(topLeft, scrollBarHeight, totalHeight, 12, true);
                RegisterForm(ScrollBarFormName, scrollBar);
                HasScrollBar = true;
            }

            // Construct all the buttons.
            int xIndex, yIndex;
            LevelSelectButton button;
            for (int i = 0; i < LoadedLevelManager.SequentialLevels.Length; i++)
            {
                xIndex = i % BUTTONS_PER_ROW;
                yIndex = i / BUTTONS_PER_ROW;
                button = new LevelSelectButton(
                    new RectCollider(
                        xOffset + xIndex * (BUTTON_WIDTH + LEVEL_SELECT_BUTTON_GAP_X),
                        yOffset + yIndex * (BUTTON_HEIGHT + LEVEL_SELECT_BUTTON_GAP_Y),
                        BUTTON_WIDTH,
                        BUTTON_HEIGHT),
                    scrollBar,
                    i);
                RegisterForm(button);
            }

            RegisterForm(BackButtonFormName,
                new GUIButton(BackButtonInfo, BackButtonBottomLeft, PositionType.BottomLeft));

            RegisterForm(new ClickParticleSpawnerForm());

            FadeIn(20, Color.White, Update_Main, Render_Main);
        }
        public void Update_Main()
        {
            if (HasScrollBar)
            {
                UpdateForm(ScrollBarFormName);
            }

            UpdateFormsExcept(ScrollBarFormName);

            if (buttonPressed)
            {
                var data = new MultiformTransmissionData(MultiformName);
                var LevelNameInfo = new LevelNameInfo(selectedLevelNumber);
                data.SetAttr<LevelNameInfo>("LevelNameInfo", LevelNameInfo);

                FadeOutAndClose(
                    20, Color.White, LevelLoadMultiform.MultiformName,
                    data, true, () => { UpdateForms(); }, Render_Main);
            }

            else if (GetForm<GUIButton>(BackButtonFormName).IsReleased(MouseButtons.Left))
            {
                FadeOutAndClose(
                    20, Color.White, MainMenu.MainMenuMultiform.MultiformName,
                    new MultiformTransmissionData(MultiformName), true,
                    () => { UpdateForms(); }, Render_Main);
            }
        }
        protected void FadeOutAndClose(
            int duration, Color colour, string multiformName, 
            MultiformTransmissionData data = null, bool clearForms = true,
            Action backgroundUpdater = null, Action backgroundRenderer = null,
            bool hideMouseTrail = true)
        {
            FadeAlpha    = 0f;
            FadeDuration = duration;
            FadeColour   = colour;

            multiformToConstruct = multiformName;
            transmissionData     = data;
            this.clearForms      = clearForms;

            updater  = backgroundUpdater;
            renderer = backgroundRenderer;

            SetUpdater(Update_FadeOut);
            SetRenderer(Render_Fade);

            if (hideMouseTrail)
            {
                // Hide the mouse cursor trail. The way the trail is rendered makes it
                // look strange on top of backgrounds of certain colours.
                Manager.GetActiveMultiform<ForegroundContentMultiform>(ForegroundContentMultiform.MultiformName)
                       .GetForm<MouseTrailForm>(ForegroundContentMultiform.MouseTrailFormName).Hide();
            }
        }
        public override void Construct(MultiformTransmissionData args)
        {
            // Reinitialize variables that may have been carried over from the last
            // time the multiform was loaded.
            TimeOfMessagesCopied = -1;
            ResetTime();
            WarningMessages.Clear();
            RegisteredTextForms.Clear();

            LevelNameInfo = args.GetAttr<LevelNameInfo>("LevelNameInfo");
            LevelInfo = new LevelInfo(LevelNameInfo.LevelName);

            FatalError = LevelInfo.Exception != null;
            if (FatalError)
            {
                ErrorMessage = LevelInfo.Exception.Message;
            }

            if (LevelInfo != null && LevelInfo.WarningMessages.Count > 0)
            {
                WarningMessages.AddRange(LevelInfo.WarningMessages);
            }

            TransmissionData = new MultiformTransmissionData(MultiformName);
            TransmissionData.SetAttr<LevelNameInfo>("LevelNameInfo", LevelNameInfo);
            TransmissionData.SetAttr<LevelInfo>("LevelInfo", LevelInfo);

            ConstructMessageForms();

            SetUpdater(Update_Main);
            SetRenderer(Render_Main);
        }
        public override void Construct(MultiformTransmissionData args)
        {
            LevelNameInfo = args == null ? new LevelNameInfo(0) : args.GetAttr<LevelNameInfo>("LevelNameInfo");
            LevelInfo = args.GetAttr<LevelInfo>("LevelInfo");

            RegisterForm(BoardFormName, new BoardForm(LevelInfo));
            RegisterForm(InventoryFormName, new InventoryForm(LevelInfo));
            RegisterForm(BackButtonFormName, new GUIButton(
                BackButtonInfo, BackButtonBottomLeft, PositionType.BottomLeft));

            FadeIn(20, Color.White, Update_Main, Render_Main);
        }
 public override void Construct(MultiformTransmissionData args)
 {
     SetUpdater(Update_Main);
     SetRenderer(Render_Main);
     BackgroundTexture = Assets.Shared.Images.Background;
 }
        public override void Construct(MultiformTransmissionData args)
        {
            RegisterForm(PlayButtonFormName, new GUIButton(PlayButtonInfo, PlayButtonCenter));
            RegisterForm(OptionsButtonFormName, new GUIButton(OptionsButtonInfo, OptionsButtonCenter));
            RegisterForm(CreditsButtonFormName, new GUIButton(CreditsButtonInfo, CreditsButtonCenter));

            var navigLeft  = new[] { Keys.Up, Keys.Left };
            var navigRight = new[] { Keys.Down, Keys.Right };
            var buttons    = new[] { PlayButtonFormName, OptionsButtonFormName, CreditsButtonFormName };
            RegisterForm(
                KeyboardButtonNavigatorFormName,
                new KeyboardButtonNavigatorForm(buttons, navigLeft, navigRight, new List<Keys>() { Keys.Escape }));

            RegisterForm(new ClickParticleSpawnerForm());

            if (args != null && args.SenderName == LevelSelectMultiform.MultiformName)
            {
                FadeIn(20, Color.White, Update_Main, Render_Main);
            }
            else
            {
                SetUpdater(Update_Main);
                SetRenderer(Render_Main);
            }
        }