public static void TakePart(Entity entity, TractorBeam tractor) { if (entity as Yard) { // Waits to see if it will get more parts Yard.lastPartTakenTime = Time.time; Yard.partsTakenCombo++; } else { PassiveDialogueSystem.Instance.PushPassiveDialogue(entity.ID, "<color=lime>Your part has been added into your inventory.</color>", 4); } var shellPart = tractor.GetTractorTarget().GetComponent <ShellPart>(); var info = shellPart.info; info = ShipBuilder.CullSpatialValues(info); ShipBuilder.AddOriginToDictionary(shellPart); PlayerCore.Instance.cursave.partInventory.Add(info); PartIndexScript.AttemptAddToPartsObtained(info); PartIndexScript.AttemptAddToPartsSeen(info); if (NodeEditorFramework.Standard.YardCollectCondition.OnYardCollect != null) { NodeEditorFramework.Standard.YardCollectCondition.OnYardCollect.Invoke(info.partID, info.abilityID, shellPart.droppedSectorName); } Destroy(shellPart.gameObject); }
public override void StartQuest() { // If the quest has been started, continue nodeCanvas.missionName = findRoot().missionName; if (nodeCanvas.missionName == null) { Debug.LogError("A mission wasn't given a name. Every mission must have a name."); return; } // add objective list TaskManager.objectiveLocations.Add(nodeCanvas.missionName, new List <TaskManager.ObjectiveLocation>()); if (lastCheckpointName == (nodeCanvas.missionName + "_complete")) { // Retroactively add all parts from the completed quest as parts obtained by the player. if (PlayerCore.Instance) { foreach (var node in nodeCanvas.nodes) { if (node is StartTaskNode) { var startTask = node as StartTaskNode; if (startTask.partReward) { EntityBlueprint.PartInfo part = new EntityBlueprint.PartInfo(); part.partID = startTask.partID; part.abilityID = startTask.partAbilityID; part.tier = startTask.partTier; part.secondaryData = startTask.partSecondaryData; part = PartIndexScript.CullToPartIndexValues(part); if (!PlayerCore.Instance.cursave.partsObtained.Contains(part)) { PlayerCore.Instance.cursave.partsObtained.Add(part); } if (!PlayerCore.Instance.cursave.partsSeen.Contains(part)) { PlayerCore.Instance.cursave.partsSeen.Add(part); } } } } } return; } base.StartQuest(); SectorManager.OnSectorLoad += ((val) => { if (traverserLimiterDelegate != null) { traverserLimiterDelegate.Invoke(val); } }); if (currentNode == null) { TaskManager.Instance.RemoveTraverser(this); } }
public void UpdateInfo(GameObject obj, GameObject targetInfo, int index = 0) { string description; var targetName = targetInfo.transform.Find("Target Name").GetComponent <Text>(); var targetDesc = targetInfo.transform.Find("Name").GetComponent <Text>(); Text targetNumber = null; if (targetInfo.transform.Find("Number")) { targetNumber = targetInfo.transform.Find("Number").GetComponent <Text>(); } if (obj == null) { targetName.text = targetDesc.text = ""; targetInfo.SetActive(false); return; } var entity = obj.GetComponent <Entity>(); if (entity) { targetInfo.SetActive(true); description = (entity.Terrain + " "); description += (entity.category + ""); targetName.text = entity.entityName; targetDesc.text = description; targetName.color = targetDesc.color = FactionManager.GetFactionColor(entity.faction); if (targetNumber) { targetNumber.color = targetName.color; targetNumber.text = ReticleScript.instance.GetTargetIndex(entity) + 1 + ""; // targetShape.rectTransform.sizeDelta = targetShape.rectTransform.sizeDelta / 1.25F; } } else if (obj.GetComponent <ShellPart>()) { var info = obj.GetComponent <ShellPart>().info; targetInfo.SetActive(true); if (PartIndexScript.CheckPartObtained(info)) { targetName.text = info.partID; targetDesc.text = AbilityUtilities.GetAbilityNameByID(info.abilityID, null) + " " + info.tier; } else { targetName.text = "Unobtained Part"; targetDesc.text = "Bring to Yard"; targetName.color = targetDesc.color = FactionManager.GetFactionColor(obj.GetComponent <ShellPart>().GetFaction()); } } else { targetName.text = targetDesc.text = ""; targetInfo.SetActive(false); } }
protected override void Update() { if (!isDead) { foreach (WeaponAbility weapon in GetComponentsInChildren <WeaponAbility>()) { weapon.Tick(); } } base.Update(); TargetManager.Enqueue(targeter); if (FactionManager.IsAllied(faction, 0)) { if ((transform.position - PlayerCore.Instance.transform.position).sqrMagnitude <= 75) { var player = PlayerCore.Instance; if (player.GetTractorTarget() && (player.GetTractorTarget().GetComponent <ShellPart>() || player.GetTractorTarget().GetComponent <Shard>()) && !tractor.GetTractorTarget()) { tractor.SetTractorTarget(player.GetTractorTarget()); player.SetTractorTarget(null); } } if (tractor.GetTractorTarget() && (transform.position - tractor.GetTractorTarget().transform.position).sqrMagnitude <= 10) { if (tractor.GetTractorTarget().GetComponent <ShellPart>()) { PassiveDialogueSystem.Instance.PushPassiveDialogue(ID, "<color=lime>Your part has been added into your inventory.</color>"); var shellPart = tractor.GetTractorTarget().GetComponent <ShellPart>(); var info = shellPart.info; info = ShipBuilder.CullSpatialValues(info); ShipBuilder.AddOriginToDictionary(shellPart); PlayerCore.Instance.cursave.partInventory.Add(info); PartIndexScript.AttemptAddToPartsObtained(info); PartIndexScript.AttemptAddToPartsSeen(info); if (NodeEditorFramework.Standard.YardCollectCondition.OnYardCollect != null) { NodeEditorFramework.Standard.YardCollectCondition.OnYardCollect.Invoke(info.partID, info.abilityID, shellPart.droppedSectorName); } Destroy(shellPart.gameObject); } else if (tractor.GetTractorTarget().GetComponent <Shard>()) { PassiveDialogueSystem.Instance.PushPassiveDialogue(ID, "<color=lime>Your shard has been added into your stash.</color>"); var shard = tractor.GetTractorTarget().GetComponent <Shard>(); var tiers = new int[] { 1, 5, 20 }; PlayerCore.Instance.shards += tiers[shard.tier]; ShardCountScript.DisplayCount(PlayerCore.Instance.shards); Destroy(shard.gameObject); } } } }
public void CloseUI(bool val) { // try adding parts in the player's inventory and on their ship into the part index obtained list. if (val && builderPartDict != null) { var spawnParts = player.cursave.partInventory.FindAll(p => p.abilityID == 10); player.cursave.partInventory = spawnParts; foreach (EntityBlueprint.PartInfo info in builderPartDict.Keys) { if (builderPartDict[info].GetCount() > 0) { for (int i = 0; i < builderPartDict[info].GetCount(); i++) { player.cursave.partInventory.Add(info); PartIndexScript.AttemptAddToPartsObtained(info); } } } } if (builderPartDict != null) { foreach (ShipBuilderInventoryScript inv in builderPartDict.Values) { Destroy(inv.gameObject); } builderPartDict = null; } foreach (ShipBuilderPart part in cursorScript.parts) { Destroy(part.gameObject); } cursorScript.parts.Clear(); if (partDict != null) { foreach (DWInventoryButton but in partDict.Keys) { Destroy(but.gameObject); } partDict = null; } player.SetIsInteracting(false); base.CloseUI(); player.Rebuild(); }
IEnumerator WriteWorldCo(string path) { Debug.Log("Writing world..."); // Folder paths var canvasPlaceholderPath = System.IO.Path.Combine(Application.streamingAssetsPath, "CanvasPlaceholder"); var entityPlaceholderPath = System.IO.Path.Combine(Application.streamingAssetsPath, "EntityPlaceholder"); var wavePlaceholderPath = System.IO.Path.Combine(Application.streamingAssetsPath, "WavePlaceholder"); var factionPlaceholderPath = System.IO.Path.Combine(Application.streamingAssetsPath, "FactionPlaceholder"); var resourcePlaceholderPath = System.IO.Path.Combine(Application.streamingAssetsPath, "ResourcePlaceholder"); // Reinitialize node editor NodeEditor.ReInit(false); saveState = 1; yield return(null); sectors = new List <Sector>(); var items = cursor.placedItems; var wrappers = cursor.sectors; foreach (var wrapper in wrappers) { sectors.Add(wrapper.sector); } int minX = int.MaxValue; int maxY = int.MinValue; // Get the world bounds foreach (var sector in sectors) { if (sector.bounds.x < minX) { minX = sector.bounds.x; } if (sector.bounds.y > maxY) { maxY = sector.bounds.y; } } // ensure spawn point in some sector if (sectors.TrueForAll(sector => !sector.bounds.contains(cursor.spawnPoint.position))) { Debug.LogError("Spawn point not in sector bounds. Abort."); yield break; } // set up items and platforms int ID = 0; Dictionary <Sector, List <Sector.LevelEntity> > sectEnts = new Dictionary <Sector, List <Sector.LevelEntity> >(); Dictionary <Sector, List <string> > sectTargetIDS = new Dictionary <Sector, List <string> >(); foreach (var sector in sectors) { sectEnts.Add(sector, new List <Sector.LevelEntity>()); sectTargetIDS.Add(sector, new List <string>()); sector.tiles = new List <GroundPlatform.Tile>(); } // Add background spawns to part index partData.Clear(); foreach (var sector in sectors) { if (sector.backgroundSpawns != null) { foreach (var spawn in sector.backgroundSpawns) { AttemptAddShellCoreParts(spawn.entity, sector.sectorName, path); } } } Dictionary <string, string> itemSectorsByID = new Dictionary <string, string>(); foreach (var item in items) { Sector container = GetSurroundingSector(item.pos, item.dimension); if (container == null) { savingLevelScreen.SetActive(false); saveState = 3; Debug.LogError("No container for item. Abort."); yield break; } switch (item.type) { case ItemType.Platform: var index = GetPlatformIndices(container, item.pos); container.tiles.Add(new GroundPlatform.Tile() { pos = new Vector2Int(index.Item2, index.Item1), type = (byte)item.placeablesIndex, rotation = (byte)(((int)item.obj.transform.rotation.eulerAngles.z / 90) % 4) }); break; case ItemType.Other: case ItemType.Decoration: case ItemType.DecorationWithMetadata: case ItemType.Flag: Sector.LevelEntity ent = new Sector.LevelEntity(); if (cursor.characters.TrueForAll((WorldData.CharacterData x) => { return(x.ID != item.ID); })) { // Debug.Log(item.ID + " is not a character. " + ID); if (item.type == ItemType.DecorationWithMetadata) { int parsedId; if (item.assetID == "shard_rock" && int.TryParse(item.ID, out parsedId)) { Debug.LogError($"Shard in sector {container.sectorName} has a numeric ID. Abort."); yield break; } ent.blueprintJSON = item.shellcoreJSON; } int test; if (string.IsNullOrEmpty(item.ID) || int.TryParse(item.ID, out test)) { ent.ID = (ID++).ToString(); } else { ent.ID = item.ID; if (itemSectorsByID.ContainsKey(ent.ID)) { savingLevelScreen.SetActive(false); saveState = 4; Debug.LogError($"Two items in sectors {container.sectorName} and {itemSectorsByID[ent.ID]} were issued the same custom ID ({ent.ID}). Abort."); yield break; } else { itemSectorsByID.Add(ent.ID, container.sectorName); } } // Debug.Log(container.sectorName + " " + ent.ID); } else { // TODO: adjust faction Debug.Log("Character found. Adjusting ID and name"); ent.ID = item.ID; } // you can choose to give any object a custom name if (!string.IsNullOrEmpty(item.name)) { ent.name = item.name; } else { ent.name = item.obj.name; } ent.faction = item.faction; ent.position = item.pos; ent.assetID = item.assetID; ent.vendingID = item.vendingID; ent.patrolPath = item.patrolPath; if ((item.isTarget && container.type != Sector.SectorType.SiegeZone) || (container.type == Sector.SectorType.SiegeZone && item.assetID == "outpost_blueprint" && item.faction == 0) || (container.type == Sector.SectorType.SiegeZone && item.assetID == "bunker_blueprint" && item.faction == 0)) { sectTargetIDS[container].Add(ent.ID); } var charExists = cursor.characters.Exists(ch => ch.ID == ent.ID); if (ent.assetID == "shellcore_blueprint" || charExists) { if (container.type != Sector.SectorType.SiegeZone && !sectTargetIDS[container].Contains(ent.ID)) { sectTargetIDS[container].Add(ent.ID); } ent.blueprintJSON = item.shellcoreJSON; if (!charExists) { AttemptAddShellCoreParts(ent, container.sectorName, path); } } else if (ent.assetID == "trader_blueprint") { ent.blueprintJSON = item.shellcoreJSON; // Attempt to add trader parts into index. if (string.IsNullOrEmpty(ent.blueprintJSON)) { var dialogueDataPath = System.IO.Path.Combine(canvasPlaceholderPath, ent.ID, ".dialoguedata"); if (System.IO.File.Exists(dialogueDataPath)) { var XMLImport = new XMLImportExport(); var canvas = XMLImport.Import(dialogueDataPath) as DialogueCanvas; foreach (var node in canvas.nodes) { if (node is EndDialogue endDialogue && endDialogue.openTrader) { ShipBuilder.TraderInventory traderInventory = JsonUtility.FromJson <ShipBuilder.TraderInventory>(endDialogue.traderJSON); AttemptAddPartArray(traderInventory.parts, container.sectorName); } } } else { ent.blueprintJSON = JsonUtility.ToJson(new ShipBuilder.TraderInventory()); // Maybe make this error message more descriptive. Debug.LogWarning($"Trader has neither default trader JSON nor an associated dialogue file named '{ent.ID}.dialoguedata'. Replacing with empty trader inventory."); } } else { ShipBuilder.TraderInventory traderInventory = JsonUtility.FromJson <ShipBuilder.TraderInventory>(ent.blueprintJSON); AttemptAddPartArray(traderInventory.parts, container.sectorName); } } else if (ent.assetID == "groundcarrier_blueprint" || ent.assetID == "carrier_blueprint" || ent.assetID == "outpost_blueprint" || ent.assetID == "bunker_blueprint" || ent.assetID == "missile_station" || ent.assetID == "air_weapon_station") { ent.blueprintJSON = item.shellcoreJSON; } sectEnts[container].Add(ent); break; default: break; } } if (!System.IO.Directory.Exists(canvasPlaceholderPath)) { System.IO.Directory.CreateDirectory(canvasPlaceholderPath); } // create world data WorldData wdata = ScriptableObject.CreateInstance <WorldData>(); wdata.sectorMappings = new List <WorldData.OffloadMappings>(); wdata.dialogueMappings = new List <WorldData.OffloadMappings>(); // Add reward parts from tasks. if (System.IO.Directory.Exists(canvasPlaceholderPath)) { foreach (var canvasPath in System.IO.Directory.GetFiles(canvasPlaceholderPath)) { var pathWithoutExtension = System.IO.Path.GetFileNameWithoutExtension(canvasPath); var XMLImport = new XMLImportExport(); switch (System.IO.Path.GetExtension(canvasPath)) { case ".taskdata": var questCanvas = XMLImport.Import(canvasPath) as QuestCanvas; string missionName = null; foreach (var node in questCanvas.nodes) { if (node is StartMissionNode startMission) { missionName = startMission.missionName; } } foreach (var node in questCanvas.nodes) { if (node is StartTaskNode startTask && startTask.partReward) { EntityBlueprint.PartInfo part = new EntityBlueprint.PartInfo(); part.partID = startTask.partID; part.abilityID = startTask.partAbilityID; part.tier = startTask.partTier; part.secondaryData = startTask.partSecondaryData; part = PartIndexScript.CullToPartIndexValues(part); AddPart(part, missionName); } } if (missionName != null) { File.Move(canvasPath, System.IO.Path.Combine(System.IO.Path.GetDirectoryName(canvasPath), missionName + ".taskdata")); } break; case ".sectordata": var sectorCanvas = XMLImport.Import(canvasPath) as SectorCanvas; var sectorName = new SectorTraverser(sectorCanvas).findRoot().sectorName; wdata.sectorMappings.Add(new WorldData.OffloadMappings(sectorName, pathWithoutExtension)); //var newPath = System.IO.Path.Combine(System.IO.Path.GetDirectoryName(canvasPath), sectorName + ".sectordata"); //if (!File.Exists(newPath)) // File.Move(canvasPath, newPath); break; case ".dialoguedata": var dialogueCanvas = XMLImport.Import(canvasPath) as DialogueCanvas; var entityID = new DialogueTraverser(dialogueCanvas).findRoot().EntityID; wdata.dialogueMappings.Add(new WorldData.OffloadMappings(entityID, pathWithoutExtension)); //File.Move(canvasPath, System.IO.Path.Combine(System.IO.Path.GetDirectoryName(canvasPath), entityID + ".dialoguedata")); break; } } } // try to write out resources. Factions are obtained from the FactionManager if (!System.IO.Directory.Exists(factionPlaceholderPath)) { System.IO.Directory.CreateDirectory(factionPlaceholderPath); } var resourceTxtPath = System.IO.Path.Combine(Application.streamingAssetsPath, "ResourceDataPlaceholder.txt"); if (System.IO.File.Exists(resourceTxtPath)) { // first, extract all the lines without the factions. List <string> lines = new List <string>(); using (StreamReader sr = File.OpenText(resourceTxtPath)) { string s; bool onFactions = false; while ((s = sr.ReadLine()) != null) { if (ResourceManager.resourceHeaders.Any(header => s.ToLower().StartsWith(header))) { if (s.ToLower().StartsWith("factions:")) { onFactions = true; } else { onFactions = false; } } if (!onFactions) { lines.Add(s); } } } // we then reconstruct the factions tab with FM data lines.Add("factions:"); foreach (var faction in factionManager.factions) { // avoid default factions if (FactionManager.defaultFactions.Contains(faction)) { continue; } lines.Add($"{faction.factionName}:Factions/{faction.factionName}.json"); } File.WriteAllLines(resourceTxtPath, lines); } // calculate land platform pathfinding directions foreach (var sector in sectors) { if (sector.tiles != null && sector.tiles.Count > 0) { sector.platforms = LandPlatformGenerator.DivideToPlatforms(sector.tiles); List <string> data = new List <string>(); foreach (var plat in sector.platforms) { data.Add(plat.Encode()); } sector.platformData = data.ToArray(); } else { sector.platforms = new GroundPlatform[0]; sector.platformData = new string[0]; } } // write all sectors into a file if (!System.IO.Directory.Exists(path)) { System.IO.Directory.CreateDirectory(path); } // Delete all unnecessary files if (System.IO.Directory.Exists(path)) { string[] resPaths = ResourceManager.Instance.GetFileNames(path); for (int i = 0; i < resPaths.Length; i++) { resPaths[i] = resPaths[i].Replace('\\', '/'); Debug.Log("Res path: " + resPaths[i]); } string[] directories = System.IO.Directory.GetDirectories(path); foreach (var dir in directories) { bool del = true; foreach (var f in System.IO.Directory.GetFiles(dir)) { Debug.Log("File in dir: " + System.IO.Path.Combine(dir, f)); if (!resPaths.Contains(System.IO.Path.Combine(dir, f).Replace('\\', '/'))) { System.IO.File.Delete(f); } del = false; } if (del) { System.IO.Directory.Delete(dir); } } string[] files = System.IO.Directory.GetFiles(path); foreach (var file in files) { string f = file.Replace('\\', '/'); if ((!resPaths.Contains(f) && f != System.IO.Path.Combine(path, "ResourceData.txt").Replace('\\', '/')) || legacyFactionFilesToDelete.Contains(file)) { System.IO.File.Delete(file); } } } wdata.initialSpawn = cursor.spawnPoint.position; wdata.defaultCharacters = cursor.characters.ToArray(); wdata.defaultBlueprintJSON = blueprintField.text; wdata.author = authorField.text; wdata.description = descriptionField.text; wdata.partIndexDataArray = partData.ToArray(); string wdjson = JsonUtility.ToJson(wdata); System.IO.File.WriteAllText(System.IO.Path.Combine(path, "world.worlddata"), wdjson); if (File.Exists(System.IO.Path.Combine(path, "ResourceData.txt"))) { File.Delete(System.IO.Path.Combine(path, "ResourceData.txt")); } if (File.Exists(resourceTxtPath)) { File.Copy(resourceTxtPath, System.IO.Path.Combine(path, "ResourceData.txt")); } TryCopy(canvasPlaceholderPath, System.IO.Path.Combine(path, "Canvases")); TryCopy(entityPlaceholderPath, System.IO.Path.Combine(path, "Entities")); TryCopy(wavePlaceholderPath, System.IO.Path.Combine(path, "Waves")); TryCopy(factionPlaceholderPath, System.IO.Path.Combine(path, "Factions")); TryCopy(resourcePlaceholderPath, System.IO.Path.Combine(path, "Resources")); foreach (var sector in sectors) { if (string.IsNullOrEmpty(sector.sectorName)) { sector.sectorName = GetDefaultName(sector, minX, maxY); } if (sector.hasMusic && string.IsNullOrEmpty(sector.musicID)) { sector.musicID = GetDefaultMusic(sector.type); } sector.entities = sectEnts[sector].ToArray(); sector.targets = sectTargetIDS[sector].ToArray(); // sector.backgroundColor = SectorColors.colors[(int)sector.type]; SectorData data = new SectorData(); data.sectorjson = JsonUtility.ToJson(sector); data.platformjson = ""; // For backwards compatibility... string output = JsonUtility.ToJson(data); string sectorPath = System.IO.Path.Combine(path, sector.sectorName + ".json"); System.IO.File.WriteAllText(sectorPath, output); } Debug.Log("JSON written to location: " + path); Debug.Log($"Index size: {partData.Count}"); savingLevelScreen.SetActive(false); saveState = 2; if (OnSectorSaved != null) { OnSectorSaved.Invoke(); } }
protected override void Update() { if (!isDead) { foreach (WeaponAbility weapon in GetComponentsInChildren <WeaponAbility>()) { weapon.Tick(); } } base.Update(); TargetManager.Enqueue(targeter); if (PlayerCore.Instance && FactionManager.IsAllied(faction, PlayerCore.Instance.faction)) { if ((transform.position - PlayerCore.Instance.transform.position).sqrMagnitude <= YardProximitySquared) { var player = PlayerCore.Instance; foreach (var partyMember in PartyManager.instance.partyMembers) { if ((transform.position - partyMember.transform.position).sqrMagnitude > YardProximitySquared && !partyMember.HasRepaired && !partyMember.IsFullyRepaired()) { partyMember.Warp(transform.position + new Vector3(Random.Range(-2, 2), Random.Range(-2, 2))); } } if (!player.HasRepaired) { if (!player.IsFullyRepaired() && !player.GetIsDead()) { player.repairFinalized = false; StartCoroutine(player.StartYardRepair()); } } else if (player.repairFinalized) { player.HealToMax(); } player.HasRepaired = true; if (player.GetTractorTarget() && (player.GetTractorTarget().GetComponent <ShellPart>() || player.GetTractorTarget().GetComponent <Shard>()) && !tractor.GetTractorTarget()) { tractor.SetTractorTarget(player.GetTractorTarget()); player.SetTractorTarget(null); } } foreach (var partyMember in PartyManager.instance.partyMembers) { if (partyMember && partyMember.GetAI().getMode() == AirCraftAI.AIMode.Follow && (transform.position - partyMember.transform.position).sqrMagnitude <= YardProximitySquared) { if (!partyMember.HasRepaired) { if (!partyMember.IsFullyRepaired() && !partyMember.GetIsDead()) { partyMember.repairFinalized = false; StartCoroutine(partyMember.StartYardRepair()); } } else if (partyMember.repairFinalized) { partyMember.HealToMax(); } partyMember.HasRepaired = true; } } if (tractor.GetTractorTarget() && (transform.position - tractor.GetTractorTarget().transform.position).sqrMagnitude <= 10) { if (tractor.GetTractorTarget().GetComponent <ShellPart>()) { PassiveDialogueSystem.Instance.PushPassiveDialogue(ID, "<color=lime>Your part has been added into your inventory.</color>", 4); var shellPart = tractor.GetTractorTarget().GetComponent <ShellPart>(); var info = shellPart.info; info = ShipBuilder.CullSpatialValues(info); ShipBuilder.AddOriginToDictionary(shellPart); PlayerCore.Instance.cursave.partInventory.Add(info); PartIndexScript.AttemptAddToPartsObtained(info); PartIndexScript.AttemptAddToPartsSeen(info); if (NodeEditorFramework.Standard.YardCollectCondition.OnYardCollect != null) { NodeEditorFramework.Standard.YardCollectCondition.OnYardCollect.Invoke(info.partID, info.abilityID, shellPart.droppedSectorName); } Destroy(shellPart.gameObject); } else if (tractor.GetTractorTarget().GetComponent <Shard>()) { PassiveDialogueSystem.Instance.PushPassiveDialogue(ID, "<color=lime>Your shard has been added into your stash.</color>", 4); var shard = tractor.GetTractorTarget().GetComponent <Shard>(); var tiers = new int[] { 1, 5, 20 }; PlayerCore.Instance.shards += tiers[shard.tier]; ShardCountScript.DisplayCount(PlayerCore.Instance.shards); Destroy(shard.gameObject); } } } }
public override int Traverse() { if (variableType == 0) { if (variableName == "" && checkpointName != "") { variableName = checkpointName; } if (TaskManager.TraversersContainCheckpoint(checkpointName)) { return(0); } else { return(1); } } else if (variableType == 5) { for (int i = 0; i < PlayerCore.Instance.cursave.missions.Count; i++) { if (PlayerCore.Instance.cursave.missions[i].name == variableName) { var status = PlayerCore.Instance.cursave.missions[i].status; switch (comparisonMode) { case 0: return((status == Mission.MissionStatus.Inactive) ? 0 : 1); case 1: return((status == Mission.MissionStatus.Ongoing) ? 0 : 1); case 2: return((status == Mission.MissionStatus.Complete) ? 0 : 1); default: return(0); } } } return(0); } else { int variableToCompare = 0; switch (variableType) { case 1: if (TaskManager.Instance.taskVariables.ContainsKey(variableName)) { variableToCompare = TaskManager.Instance.taskVariables[variableName]; } else { Debug.LogWarning("Unknown task variable: " + variableName); return(1); } break; case 2: variableToCompare = PlayerCore.Instance.reputation; break; case 3: variableToCompare = PartIndexScript.GetNumberOfPartsSeen(); break; case 4: variableToCompare = PartIndexScript.GetNumberOfPartsObtained(); #if UNITY_EDITOR if (Input.GetKey(KeyCode.J)) { variableToCompare = 1000; } #endif break; case 5: return(PlayerCore.Instance.cursave.missions.Exists(m => m.name == variableName) && PlayerCore.Instance.cursave.missions.Find(m => m.name == variableName).status == Mission.MissionStatus.Complete ? 0 : 1); } switch (comparisonMode) { case 0: return((variableToCompare == value) ? 0 : 1); case 1: return((variableToCompare > value) ? 0 : 1); case 2: return((variableToCompare < value) ? 0 : 1); default: return(0); } } }
/// <summary> /// Helper method for death animation and state changing /// </summary> protected virtual void OnDeath() { entityBody.velocity = Vector2.zero; // set death, interactibility and immobility IsInvisible = false; Collider2D[] colliders = GetComponentsInChildren <Collider2D>(true); for (int i = 0; i < colliders.Length; i++) { colliders[i].enabled = true; } foreach (var ability in abilities) { if (ability) { ability.SetDestroyed(true); } } interactible = false; isDead = true; SetIntoCombat(); deathTimer = 0; // reset death timer transform.Find("Minimap Image").GetComponent <SpriteRenderer>().enabled = false; // remove from minimap AudioManager.PlayClipByID("clip_explosion1", transform.position); // Roll on each part if (!FactionManager.IsAllied(0, faction) && !(this as PlayerCore) && this is ShellCore shellCore && shellCore.GetCarrier() == null) { // extract non-shell parts var selectedParts = parts.FindAll(p => p != shell); if (selectedParts.Count > 0) { foreach (var part in selectedParts) { if (Random.value < partDropRate) { part.SetCollectible(true); if (sectorMngr) { AIData.strayParts.Add(part); } } } } } DetachAllParts(); var BZM = SectorManager.instance?.GetComponent <BattleZoneManager>(); if (lastDamagedBy is PlayerCore player) { player.AddCredits(Random.Range(1, 5)); if (this as ShellCore && !FactionManager.IsAllied(0, faction)) { foreach (var part in blueprint.parts) { player.cursave.partsSeen.Add(PartIndexScript.CullToPartIndexValues(part)); } } } if (OnEntityDeath != null) { OnEntityDeath.Invoke(this, lastDamagedBy); } if (BZM != null) { BZM.UpdateCounters(); } GameObject deathExplosion = Instantiate(deathExplosionPrefab, transform.position, Quaternion.identity); }
IEnumerator WriteWorldCo(string path) { Debug.Log("Writing world..."); // Folder paths var canvasPlaceholderPath = Application.streamingAssetsPath + "\\CanvasPlaceholder"; var entityPlaceholderPath = Application.streamingAssetsPath + "\\EntityPlaceholder"; var wavePlaceholderPath = Application.streamingAssetsPath + "\\WavePlaceholder"; // Reinitialize node editor NodeEditor.ReInit(false); saveState = 1; yield return(null); sectors = new List <Sector>(); var items = cursor.placedItems; var wrappers = cursor.sectors; foreach (var wrapper in wrappers) { sectors.Add(wrapper.sector); } int minX = int.MaxValue; int maxY = int.MinValue; // Get the world bounds foreach (var sector in sectors) { if (sector.bounds.x < minX) { minX = sector.bounds.x; } if (sector.bounds.y > maxY) { maxY = sector.bounds.y; } } // ensure spawn point in some sector if (sectors.TrueForAll(sector => !sector.bounds.contains(cursor.spawnPoint.position))) { Debug.LogError("Spawn point not in sector bounds. Abort."); yield break; } // set up items and platforms int ID = 0; Dictionary <Sector, List <Sector.LevelEntity> > sectEnts = new Dictionary <Sector, List <Sector.LevelEntity> >(); Dictionary <Sector, List <string> > sectTargetIDS = new Dictionary <Sector, List <string> >(); foreach (var sector in sectors) { sectEnts.Add(sector, new List <Sector.LevelEntity>()); sectTargetIDS.Add(sector, new List <string>()); sector.tiles = new List <GroundPlatform.Tile>(); } // Add background spawns to part index partData.Clear(); foreach (var sector in sectors) { if (sector.backgroundSpawns != null) { foreach (var spawn in sector.backgroundSpawns) { AttemptAddShellCoreParts(spawn.entity, sector.sectorName, path); } } } Dictionary <string, string> itemSectorsByID = new Dictionary <string, string>(); foreach (var item in items) { Sector container = GetSurroundingSector(item.pos); if (container == null) { savingLevelScreen.SetActive(false); saveState = 3; Debug.LogError("No container for item. Abort."); yield break; } switch (item.type) { case ItemType.Platform: var index = GetPlatformIndices(container, item.pos); container.tiles.Add(new GroundPlatform.Tile() { pos = new Vector2Int(index.Item2, index.Item1), type = (byte)item.placeablesIndex, rotation = (byte)(((int)item.obj.transform.rotation.eulerAngles.z / 90) % 4), directions = new Dictionary <Vector2Int, byte>() }); break; case ItemType.Other: case ItemType.Decoration: case ItemType.Flag: Sector.LevelEntity ent = new Sector.LevelEntity(); if (cursor.characters.TrueForAll((WorldData.CharacterData x) => { return(x.ID != item.ID); })) { // Debug.Log(item.ID + " is not a character. " + ID); int test; if (item.ID == null || item.ID == "" || int.TryParse(item.ID, out test)) { ent.ID = ID++ + ""; } else { ent.ID = item.ID; if (itemSectorsByID.ContainsKey(ent.ID)) { savingLevelScreen.SetActive(false); saveState = 4; Debug.LogError("Two items in sectors " + container.sectorName + " and " + itemSectorsByID[ent.ID] + " were issued the same custom ID. Abort."); yield break; } else { itemSectorsByID.Add(ent.ID, container.sectorName); } } // Debug.Log(container.sectorName + " " + ent.ID); } else { // TODO: adjust faction Debug.Log("Character found. Adjusting ID and name"); ent.ID = item.ID; } // you can choose to give any object a custom name if (item.name != null && item.name != "") { ent.name = item.name; } else { ent.name = item.obj.name; } ent.faction = item.faction; ent.position = item.pos; ent.assetID = item.assetID; ent.vendingID = item.vendingID; ent.patrolPath = item.patrolPath; if ((item.isTarget && container.type != Sector.SectorType.SiegeZone) || (container.type == Sector.SectorType.SiegeZone && item.assetID == "outpost_blueprint" && item.faction == 0) || (container.type == Sector.SectorType.SiegeZone && item.assetID == "bunker_blueprint" && item.faction == 0)) { sectTargetIDS[container].Add(ent.ID); } var charExists = cursor.characters.Exists(ch => ch.ID == ent.ID); if (ent.assetID == "shellcore_blueprint" || charExists) { if (container.type != Sector.SectorType.SiegeZone && !sectTargetIDS[container].Contains(ent.ID)) { sectTargetIDS[container].Add(ent.ID); } ent.blueprintJSON = item.shellcoreJSON; if (!charExists) { AttemptAddShellCoreParts(ent, container.sectorName, path); } } else if (ent.assetID == "trader_blueprint") { ent.blueprintJSON = item.shellcoreJSON; // Attempt to add trader parts into index. if (ent.blueprintJSON == null || ent.blueprintJSON == "") { var dialogueDataPath = $"{canvasPlaceholderPath}\\{ent.ID}.dialoguedata"; if (System.IO.File.Exists(dialogueDataPath)) { var XMLImport = new XMLImportExport(); var canvas = XMLImport.Import(dialogueDataPath) as DialogueCanvas; foreach (var node in canvas.nodes) { if (node is EndDialogue) { var endDialogue = node as EndDialogue; if (endDialogue.openTrader) { ShipBuilder.TraderInventory traderInventory = JsonUtility.FromJson <ShipBuilder.TraderInventory>(endDialogue.traderJSON); Debug.LogError(container.sectorName + "end dialog"); AttemptAddPartArray(traderInventory.parts, container.sectorName); } } } } else { ent.blueprintJSON = JsonUtility.ToJson(new ShipBuilder.TraderInventory()); // Maybe make this error message more descriptive. Debug.LogWarning($"Trader has neither default trader JSON nor an associated dialogue file named '{ent.ID}.dialoguedata'. Replacing with empty trader inventory."); } } else { ShipBuilder.TraderInventory traderInventory = JsonUtility.FromJson <ShipBuilder.TraderInventory>(ent.blueprintJSON); AttemptAddPartArray(traderInventory.parts, container.sectorName); } } else if (ent.assetID == "groundcarrier_blueprint" || ent.assetID == "carrier_blueprint" || ent.assetID == "outpost_blueprint" || ent.assetID == "bunker_blueprint") { ent.blueprintJSON = item.shellcoreJSON; } sectEnts[container].Add(ent); break; default: break; } } if (!System.IO.Directory.Exists(canvasPlaceholderPath)) { System.IO.Directory.CreateDirectory(canvasPlaceholderPath); } // Add reward parts from tasks. if (System.IO.Directory.Exists(canvasPlaceholderPath)) { foreach (var canvasPath in System.IO.Directory.GetFiles(canvasPlaceholderPath)) { if (System.IO.Path.GetExtension(canvasPath) == ".taskdata") { var XMLImport = new XMLImportExport(); var canvas = XMLImport.Import(canvasPath) as QuestCanvas; string missionName = null; foreach (var node in canvas.nodes) { if (node is StartMissionNode) { var startMission = node as StartMissionNode; missionName = startMission.missionName; } } foreach (var node in canvas.nodes) { if (node is StartTaskNode) { var startTask = node as StartTaskNode; if (startTask.partReward) { EntityBlueprint.PartInfo part = new EntityBlueprint.PartInfo(); part.partID = startTask.partID; part.abilityID = startTask.partAbilityID; part.tier = startTask.partTier; part.secondaryData = startTask.partSecondaryData; part = PartIndexScript.CullToPartIndexValues(part); AddPart(part, missionName); } } } } } } // calculate land platform pathfinding directions foreach (var sector in sectors) { if (sector.tiles != null && sector.tiles.Count > 0) { sector.platforms = LandPlatformGenerator.DivideToPlatforms(sector.tiles); List <string> data = new List <string>(); foreach (var plat in sector.platforms) { plat.GenerateDirections(); data.Add(plat.Encode()); } sector.platformData = data.ToArray(); } else { sector.platforms = new GroundPlatform[0]; sector.platformData = new string[0]; } } // write all sectors into a file if (!System.IO.Directory.Exists(path)) { System.IO.Directory.CreateDirectory(path); } // Delete all unnecessary files if (System.IO.Directory.Exists(path)) { string[] resPaths = ResourceManager.Instance.GetFileNames(path); for (int i = 0; i < resPaths.Length; i++) { resPaths[i] = resPaths[i].Replace('\\', '/'); Debug.Log("Res path: " + resPaths[i]); } string[] directories = System.IO.Directory.GetDirectories(path); foreach (var dir in directories) { bool del = true; foreach (var f in System.IO.Directory.GetFiles(dir)) { Debug.Log("File in dir: " + System.IO.Path.Combine(dir, f)); if (!resPaths.Contains(System.IO.Path.Combine(dir, f).Replace('\\', '/'))) { System.IO.File.Delete(f); del = false; } } if (del) { System.IO.Directory.Delete(dir); } } string[] files = System.IO.Directory.GetFiles(path); foreach (var file in files) { string f = file.Replace('\\', '/'); if (!resPaths.Contains(f) && f != System.IO.Path.Combine(path, "ResourceData.txt").Replace('\\', '/')) { System.IO.File.Delete(file); } } } // create world data WorldData wdata = ScriptableObject.CreateInstance <WorldData>(); wdata.initialSpawn = cursor.spawnPoint.position; wdata.defaultCharacters = cursor.characters.ToArray(); wdata.defaultBlueprintJSON = blueprintField.text; wdata.author = authorField.text; wdata.description = descriptionField.text; wdata.partIndexDataArray = partData.ToArray(); string wdjson = JsonUtility.ToJson(wdata); System.IO.File.WriteAllText(path + "\\world.worlddata", wdjson); TryCopy(canvasPlaceholderPath, path + "\\Canvases\\"); TryCopy(entityPlaceholderPath, path + "\\Entities\\"); TryCopy(wavePlaceholderPath, path + "\\Waves\\"); foreach (var sector in sectors) { if (sector.sectorName == null || sector.sectorName == "") { sector.sectorName = GetDefaultName(sector, minX, maxY); } if (sector.hasMusic && (sector.musicID == null || sector.musicID == "")) { sector.musicID = GetDefaultMusic(sector.type); } sector.entities = sectEnts[sector].ToArray(); sector.targets = sectTargetIDS[sector].ToArray(); // sector.backgroundColor = SectorColors.colors[(int)sector.type]; SectorData data = new SectorData(); data.sectorjson = JsonUtility.ToJson(sector); data.platformjson = ""; // For backwards compatibility... string output = JsonUtility.ToJson(data); string sectorPath = path + "\\." + sector.sectorName + ".json"; System.IO.File.WriteAllText(sectorPath, output); } Debug.Log("JSON written to location: " + path); Debug.Log($"Index size: {partData.Count}"); savingLevelScreen.SetActive(false); saveState = 2; if (OnSectorSaved != null) { OnSectorSaved.Invoke(); } }