public void ShowCampaignMap()
    {
        HideCampaignMap();
        Vector3 offset = Camera.main.ViewportToWorldPoint(new Vector3(0.5f, 0.5f, Camera.main.transform.position.y)) + (Vector3.left * selectedCampaign.width * 0.5f) + (Vector3.forward * selectedCampaign.height * 0.5f);

        campaignMap = new CampaignMap(selectedCampaign.width, selectedCampaign.height, selectedCampaign.columns, selectedCampaign.rows, offset);

        for (int i = 0; campaignMap.tileMap.count > i; i++)
        {
            int  index   = i;
            bool mission = selectedCampaign.Has(index);
            RenameableDeletableButton button = new RenameableDeletableButton(mission ? GetMission(index).name : index.ToString(), mission ? campaignMap.tileMap.tileWidth - 1 : 1, mission ? campaignMap.tileMap.tileHeight * 0.5f : 1, container,
                                                                             fontSize: 20,
                                                                             DeleteStay: (Button b) =>
            {
                if (mission && Input.GetMouseButtonUp(0))
                {
                    selectedCampaign.RemoveMissionDefinitionAt(index);
                    CullConnections();
                    ShowCampaignMap();
                }
            },
                                                                             EndInput: (Field field) =>
            {
                GetMission(index).name = field.label.text;
                ShowCampaignMap();
            },
                                                                             Enter: (Button b) => b.SetColor(b.selected || missionSets != null ? b.color : Color.green),
                                                                             Stay: (Button b) =>
            {
                if (missionSets == null)
                {
                    if (Input.GetMouseButtonDown(0))
                    {
                        if (selectedCampaign.Has(index))
                        {
                            SetSelectedMission(selectedCampaign.GetMissionDefinition(index));

                            if (selectedMission.stageDefinition != null)
                            {
                                _editor.stageEditor.SetSelectedStageDefinition(selectedMission.stageDefinition);
                                _editor.ShowStage(selectedMission.stageDefinition);
                                _editor.testButton.Enable();
                                _editor.testButton.Show();
                            }

                            _editor.stageEditor.Show();
                            _editor.missionEditor.ShowMissionEditor();
                            _editor.timelineEditor.ShowMissionTimeline();

                            _editor.campaignEditor.Hide();
                            _editor.timelineEditor.Hide();
                            _editor.missionEditor.Hide();
                            HideCampaignMap();
                        }
                        else
                        {
                            _editor.missionEditor.ShowMissionSets(index, b.position + new Vector3(b.width * 0.5f, 0, b.height * 0.5f));
                            b.SetColor(Color.yellow);
                            b.Select();
                        }
                    }

                    if (Input.GetMouseButtonDown(1) && selectedCampaign.Has(index))
                    {
                        //ok, so the problem is that it's the same damn instance!
                        //that's ... uh, gonna be a bit of a bitch to work around
                        //some kind of double bookkeeping required that I'm too tired to handle now
                        //but at least hey, that's it -- when looking up the index and removing the instance, it finds the other identical instance, because it's the same in both
                        //duh

                        for (int j = 0; selectedCampaign.connections.Count > j; j++)
                        {
                            Connection connection = selectedCampaign.connections[j];

                            if (connection.fromIndex == index || connection.toIndex == index)
                            {
                                selectedCampaign.Remove(connection);
                            }
                        }

                        selectedCampaign.Remove(selectedCampaign.GetMissionDefinition(index));
                        ShowCampaignMap();
                    }
                }
            },
                                                                             Exit: (Button b) => b.SetColor(b.selected ? b.color : Color.white),
                                                                             Close: (Button b) =>
            {
                if (b.selected && (Input.GetMouseButtonDown(0) || Input.GetMouseButtonDown(1)) && (missionSets == null || !missionSets.containsMouse) && (missions == null || !missions.containsMouse))
                {
                    b.Deselect();
                    b.SetColor(Color.white);
                    _editor.missionEditor.HideMissions();
                    _editor.missionEditor.HideMissionSets();
                }
            });

            if (!mission)
            {
                button.DisableField();
                button.HideDeleteButton();
            }

            button.SetPosition(campaignMap.tileMap.PositionOf(index));
            _campaignMapButtons.Add(button);
            Add(button);

            if (selectedCampaign.Has(index))
            {
                ShowConnectorAndTerminal(index, button);
                ShowFirstMissionButton(index, button);
                ShowFinalMissionButton(index, button);
            }
        }

        ShowConnections();
    }
Example #2
0
    public IEnumerator SessionHandler(Session session, CampaignDefinition selectedCampaign, int selectedCampaignIndex)
    {
        if (!Definitions.initialized)
        {
            Definitions.Initialize(Assets.Get(Assets.ObjectDataSets.Default));
        }

        session.Hide();

        while (!session.player.progress.HasCampaignProgress(selectedCampaignIndex))
        {
            session.player.progress.AddCampaignProgress();
        }

        MissionDefinition missionDefinition = session.player.progress.IsNewGame(selectedCampaignIndex) ? selectedCampaign.GetMissionDefinition(selectedCampaign.firstMissionIndex) : null;
        int missionIndex = selectedCampaign.firstMissionIndex;

        if (missionDefinition == null)
        {
            Vector3     offset         = Camera.main.ViewportToWorldPoint(new Vector3(0.5f, 0.5f, Camera.main.transform.position.y)) + (Vector3.left * selectedCampaign.width * 0.5f) + (Vector3.forward * selectedCampaign.height * 0.5f);
            CampaignMap campaignMap    = new CampaignMap(selectedCampaign.width, selectedCampaign.height, selectedCampaign.columns, selectedCampaign.rows, offset);
            Layout      campaignLayout = new Layout("Campaign", gameObject);

            for (int i = 0; campaignMap.tileMap.count > i; i++)
            {
                int iIndex = i;

                if (selectedCampaign.Has(i) && session.player.progress.HasCompleted(selectedCampaignIndex, i))
                {
                    Button button = new Button(selectedCampaign.GetMissionDefinition(i).name, campaignMap.tileMap.tileWidth - 1, campaignMap.tileMap.tileHeight * 0.5f, gameObject, "CampaignMap" + i,
                                               fontSize: 20,
                                               Enter: (Button b) => b.SetColor(Color.green),
                                               Stay: (Button b) =>
                    {
                        if (Input.GetMouseButtonDown(0))
                        {
                            missionIndex      = iIndex;
                            missionDefinition = selectedCampaign.GetMissionDefinition(iIndex);
                        }
                    },
                                               Exit: (Button b) => b.SetColor(Color.cyan));

                    campaignLayout.Add(button);
                    button.SetColor(Color.cyan);
                    button.SetPosition(campaignMap.tileMap.PositionOf(i));

                    for (int j = 0; selectedCampaign.connections.Count > j; j++)
                    {
                        int jIndex = j;
                        if (selectedCampaign.connections[j].fromIndex == i)
                        {
                            if (!session.player.progress.HasCompleted(selectedCampaignIndex, selectedCampaign.connections[j].toIndex))
                            {
                                Button butt = new Button(selectedCampaign.GetMissionDefinition(selectedCampaign.connections[j].toIndex).name, campaignMap.tileMap.tileWidth - 1, campaignMap.tileMap.tileHeight * 0.5f, gameObject, "CampaignMap" + selectedCampaign.connections[j].toIndex,
                                                         fontSize: 20,
                                                         Enter: (Button b) => b.SetColor(Color.green),
                                                         Stay: (Button b) =>
                                {
                                    if (Input.GetMouseButtonDown(0))
                                    {
                                        missionIndex      = selectedCampaign.connections[jIndex].toIndex;
                                        missionDefinition = selectedCampaign.GetMissionDefinition(selectedCampaign.connections[jIndex].toIndex);
                                    }
                                },
                                                         Exit: (Button b) => b.SetColor(Color.white));

                                campaignLayout.Add(butt);
                                butt.SetPosition(campaignMap.tileMap.PositionOf(selectedCampaign.connections[jIndex].toIndex));
                            }
                        }
                    }
                }
            }

            while (missionDefinition == null)
            {
                campaignLayout.Update();
                yield return(null);
            }

            campaignLayout.Hide();
            campaignLayout.Destroy();
        }

        GameObject quad = GameObject.CreatePrimitive(PrimitiveType.Quad);

        quad.transform.rotation   = Quaternion.Euler(90, 0, 0);
        quad.transform.position   = Camera.main.ViewportToWorldPoint(new Vector3(0.5f, 0.5f, Camera.main.transform.position.y));
        quad.transform.localScale = new Vector3(12, 4, 1);

        TextMesh textMesh = new GameObject("StartText").AddComponent <TextMesh>();

        textMesh.transform.localRotation = quad.transform.rotation;
        textMesh.transform.SetPositionAndRotation(quad.transform.position + Vector3.up, quad.transform.rotation);
        textMesh.fontSize      = 200;
        textMesh.color         = Color.black;
        textMesh.characterSize = 0.15f;
        textMesh.anchor        = TextAnchor.MiddleCenter;
        textMesh.alignment     = TextAlignment.Center;
        textMesh.text          = "START";

        float wait = Time.time + 3;

        while (wait > Time.time)
        {
            yield return(null);
        }

        quad.SetActive(false);
        textMesh.gameObject.SetActive(false);

        StageDefinition stageDefinition = missionDefinition.stageDefinition;

        session.SetConveyor(new Conveyor(
                                speed: 7,
                                width: 4,
                                height: 15 + (1 * (stageDefinition.laneCount - 1)),
                                itemInterval: 1,
                                itemLimit: 8,
                                itemWidthPadding: 1,
                                itemSpacing: 0.1f));

        session.SetStage(new Stage(stageDefinition, session.player, session.conveyor));

        Level level = new Level(missionDefinition.duration);

        for (int i = 0; missionDefinition.waveDefinitions.Count > i; i++)
        {
            Wave wave = new Wave(missionDefinition.waveTimes[i] * missionDefinition.duration, session.stage);
            level.Add(wave);

            for (int j = 0; missionDefinition.waveDefinitions[i].waveEvents.Count > j; j++)
            {
                switch ((WaveEvent.Type)missionDefinition.waveDefinitions[i].waveEvents[j].type)
                {
                case WaveEvent.Type.SpawnEnemy:
                    wave.Add(new SpawnEnemyEvent(Definitions.Enemy(Definitions.Enemies.Mini), missionDefinition.waveDefinitions[i].waveEvents[j]));
                    break;
                }
            }
        }

        session.SetLevel(level);
        session.Show();

        int heroCount = session.player.inventory.heroes.Count;
        int start     = heroCount == 1
            ? 2
            : heroCount == 2
                ? 1
                : 0;

        int stride = start == 2
            ? 0
            : 2;

        for (int i = 0; session.player.inventory.heroes.Count > i; i++)
        {
            session.stage.AddHero(session.stage.LaneBy(start + (stride * i)), Definitions.Hero(Definitions.Heroes.Default));
        }

        while (1 > session.level.progress || session.stage.enemies > 0 || session.stage.items > 0)
        {
            session.Update(1 > session.level.progress || session.stage.enemies > 0);
            yield return(null);
        }

        quad.SetActive(true);
        textMesh.gameObject.SetActive(true);
        session.stage.DestroyLanes();
        session.level.HideProgress();
        session.coinCounter.Hide();

        if (session.heldItem != null)
        {
            session.heldItem.conveyorItem.Destroy();
            session.heldItem.Destroy();
        }

        session.Destroy();

        textMesh.text = "STOP";
        wait          = Time.time + 3;

        while (wait > Time.time)
        {
            yield return(null);
        }

        quad.SetActive(false);
        textMesh.gameObject.SetActive(false);
        Destroy(textMesh.gameObject);
        Destroy(quad);

        //boss warning?
        //boss battle?

        //end of level fanfare

        if (!session.player.progress.HasCompleted(selectedCampaignIndex, missionIndex))
        {
            session.player.progress.AddCompleted(selectedCampaignIndex, missionIndex);
        }

        Shop shop = new Shop();

        shop.Show(session.player);

        while (!Input.GetMouseButtonDown(1))
        {
            shop.Update();
            yield return(null);
        }

        shop.Hide();

        PlayerPrefs.SetString(session.player.name, JsonUtility.ToJson(session.player));
        PlayerPrefs.Save();

        StartSession(session.player, selectedCampaign, selectedCampaignIndex);
    }
Example #3
0
 public static void Write(this BinaryWriter writer, CampaignMap campaignMap, CampaignInfoFormatVersion formatVersion) => campaignMap.WriteTo(writer, formatVersion);
Example #4
0
            public override void Enter()
            {
                if (ProgramStates.MainMenuState.MainMenuMusic != null)
                {
                    float fadeOut = 0.3f;
                    ProgramStates.MainMenuState.MainMenuMusic.Stop(fadeOut);
                    ProgramStates.MainMenuState.MainMenuMusic = null;
                    DateTime lastUpdate = DateTime.Now;
                    float    dtime      = 0;
                    do
                    {
                        Program.Instance.SoundManager.Update(dtime);
                        float sleep = 100 / 6f - 1000f * dtime;
                        if (sleep > 0)
                        {
                            System.Threading.Thread.Sleep((int)sleep);
                        }

                        DateTime now = DateTime.Now;
                        dtime      = (float)(now - lastUpdate).TotalSeconds;
                        lastUpdate = now;
                        fadeOut   -= dtime;
                    } while (fadeOut > 0);
                }
                base.Enter();
                Application.Log("Entering loading state...");
                Application.Log(Program.Settings.DumpVideoSettings());


                Random = new Random();
                Instance.SpawnRandomizer = new Random();
                Instance.SceneControl.InnerSceneController =
                    Instance.SceneController = new SceneManager {
                    Scene = Instance.Scene, Activated = false
                };
                if (Program.Settings.ReplayState == ReplayState.Replaying)
                {
                    Instance.Replay = Replay.Load(Program.Settings.ReplayFile);
                    Instance.Replay.StartReplaying(Game.Instance);
                }
                else
                {
                    Instance.Input = new HardwareInput(Instance.SceneController);
                    if (Program.Settings.ReplayState == ReplayState.Recording)
                    {
                        Instance.Replay = Replay.New(Program.Settings.ReplayFile);
                        Instance.Replay.StartRecording(Instance);
                    }
                }
                Instance.SceneControl.Focus();

                LogLoading("Scene controller initialized");

                Instance.Statistics = new Statistics();

#if DEBUG
                RedGate.Profiler.UserEvents.ProfilerEvent.SignalEvent("StartLoadMap start");
#endif
                LogLoading("StartLoadMap()");

                Tier t = null;
                if (Instance.LoadMapFilename != null)
                {
                    CampaignMap map = Campaign.Campaign1().GetMapByFilename(Instance.LoadMapFilename);
                    if (map != null)
                    {
                        t = map.Tier;
                    }
                }
                if (t != null)
                {
                    Instance.LoadingScreen = new Interface.LoadingScreen(t.LoadingScreenPicture, t.LoadingScreenPictureSize);
                }
                else
                {
                    Instance.LoadingScreen = new Interface.LoadingScreen();
                }

                Program.Instance.Interface.AddChild(Game.Instance.LoadingScreen);
                LogLoading("LoadingScreen added");
                UpdateProgress(0f);

                float mapLoadInc = 0.54f;
                if (Instance.mapLoader != null)
                {
                    Instance.Map = Instance.mapLoader();
                    UpdateProgress(mapLoadInc);
                }
                else if (!string.IsNullOrEmpty(Instance.LoadMapFilename))
                {
                    Map.Map map;

                    var   steps   = Client.Game.Map.MapPersistence.Instance.GetLoadSteps(Instance.LoadMapFilename, Instance.Scene.Device, out map);
                    float incStep = mapLoadInc / steps.Count;
                    foreach (var v in steps)
                    {
                        v.Second.Invoke();
                        UpdateProgress(incStep);
                    }
                    Instance.Map = map;
                }
                else
                {
                    Instance.Map = Instance.preLoadedMap;
                    UpdateProgress(mapLoadInc);
                }

                LogLoading("Map loaded");

                Instance.sceneQuadtree = new Common.Quadtree <Entity>(10);
                //sceneQuadtree = new Common.BruteForceBoundingVolumeHierarchy<Entity>();

                Instance.sceneQuadtreeAutoSyncer = new SceneBVHAutoSyncer(Instance.Scene, Instance.sceneQuadtree)
                {
                    MinMovedDistanceForUpdate = -1
                };
                //sceneQuadtree = new Common.BruteForceBoundingVolumeHierarchy<Entity>();

                LogLoading("QuadTree initialized");

                ((LookatSphericalCamera)Instance.Scene.Camera).Lookat = Instance.Map.MainCharacter.Translation;

                Instance.Mechanics = new Mechanics.Manager(Instance.Map);

                LogLoading("Mechanics loaded");
                UpdateProgress(0.004f);


                //Game.Instance.Map.Settings.cut
                //if (!Game.Instance.Map.Settings.Cinematic)
                //{
                //    var sm = Program.Instance.SoundManager;
                //    Game.Instance.musicChannel1 = sm.GetSoundResourceGroup(sm.GetStream(Client.Sound.Stream.InGameMusic2)).PlayLoopedWithIntervals(0.5f, 1.5f, 0.5f);
                //    Game.Instance.musicChannel2 = sm.GetStream(Client.Sound.Stream.BirdsAmbient1).Play();
                //    Game.Instance.musicChannel2.Looping = true;

                //}
                //else
                //{
                //    //run some ambience for the cut scenes
                //}

                //LogLoading("Music playing");

#if DEBUG
                RedGate.Profiler.UserEvents.ProfilerEvent.SignalEvent("StartLoadMap return to app start");
#endif

                for (int i = 0; i < Instance.Map.Ground.Pieces.GetLength(0); i++)
                {
                    for (int j = 0; j < Instance.Map.Ground.Pieces.GetLength(1); j++)
                    {
                        Instance.Map.Ground.Pieces[i, j].EnsureConstructed();
                    }
                }

                Instance.Scene.Root.AddChild(Instance.Map.Ground);
                UpdateProgress(0.106f);
                LogLoading("Ground added");
                Instance.Scene.Root.AddChild(Instance.Map.DynamicsRoot);
                LogLoading("DynamicsRoot added");
                UpdateProgress(0.145f);
                Instance.Scene.Root.AddChild(Instance.Map.StaticsRoot);
                LogLoading("StaticsRoot added");
                UpdateProgress(0.145f);
                Instance.Scene.Root.AddChild(new Water(Instance.Map));
                LogLoading("Water added");
                UpdateProgress(0.008f);

                PreLoading.Initialize();

                foreach (MetaModel m in PreLoading.MetaModels)
                {
                    if (m.SkinnedMesh != null)
                    {
                        Program.Instance.Content.Acquire <SkinnedMesh>(m.SkinnedMesh);
                    }
                    if (m.XMesh != null)
                    {
                        Program.Instance.Content.Acquire <SlimDX.Direct3D9.Mesh>(m.XMesh);
                    }
                    if (m.Texture != null)
                    {
                        Program.Instance.Content.Acquire <Texture>(m.Texture);
                    }
                    for (int i = 0; i < 2; i++)
                    {
                        if (m.SplatTexutre != null)
                        {
                            if (m.SplatTexutre[i] != null)
                            {
                                Program.Instance.Content.Acquire <Texture>(m.SplatTexutre[i]);
                            }
                        }
                    }
                    for (int i = 0; i < 8; i++)
                    {
                        if (m.MaterialTexture != null)
                        {
                            if (m.MaterialTexture[i] != null)
                            {
                                Program.Instance.Content.Acquire <Texture>(m.MaterialTexture[i]);
                            }
                        }
                    }
                }

                foreach (Graphics.Renderer.Renderer.MetaEntityAnimation m in PreLoading.MetaEntityAnimations)
                {
                    Program.Instance.Content.Acquire <Graphics.Renderer.Renderer.EntityAnimation>(m);
                }

                foreach (Graphics.Content.Font font in PreLoading.MetaFonts)
                {
                    Program.Instance.Content.Acquire <FontImplementation>(font);
                }

                Instance.Renderer.Settings.CullMode = Instance.Map.Settings.MapType == Client.Game.Map.MapType.Cinematic ? Cull.None : Cull.Counterclockwise;

                LogLoading("Loading screen removed");

                Instance.GroundProbe = new WorldViewProbe
                {
                    Camera     = Instance.Scene.Camera,
                    View       = Program.Instance,
                    WorldProbe = new GroundProbe(Instance.Map)
                };
                Instance.MainCharPlaneProbe = new WorldViewProbe
                {
                    Camera     = Instance.Scene.Camera,
                    View       = Program.Instance,
                    WorldProbe = new MainCharPlaneProbe(Instance.Map.MainCharacter)
                };

                LogLoading("Probes initialized");
                UpdateProgress(0.052f);

                ((SceneManager)Instance.SceneController).Activated = true;

                LogLoading("Changing to StartRunningState");
#if DEBUG
                RedGate.Profiler.UserEvents.ProfilerEvent.SignalEvent("StartLoadMap done");
#endif

#if DEBUG_LOADING
                OutputLog();

                if (System.Math.Abs(loadingScreen.Percentage - 1f) > 0.001f)
                {
                    throw new Exception(String.Format("Progress did not equal 100%, got {0:0.000}%", loadingScreen.Percentage * 100f));
                }
#endif

                Program.Instance.Interface.AddChild(Instance.stagesControl);
                Instance.Interface.Visible = true;

                Instance.ChangeState(new StartGameState());
            }