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(); }
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); }
public static void Write(this BinaryWriter writer, CampaignMap campaignMap, CampaignInfoFormatVersion formatVersion) => campaignMap.WriteTo(writer, formatVersion);
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()); }