/// <summary> /// Converts a CharacterRecord to a prototypical CharacterDocument for character import. /// </summary> /// <returns>CharacterDocument derived from CharacterRecord data.</returns> public CharacterDocument ToCharacterDocument() { CharacterDocument doc = new CharacterDocument(); Dictionary<int, RaceTemplate> raceDict = RaceTemplate.GetRaceDictionary(); doc.raceTemplate = raceDict[(int)parsedData.race + 1]; doc.gender = parsedData.gender; doc.career = parsedData.career; doc.name = parsedData.characterName; doc.faceIndex = parsedData.faceIndex; doc.workingStats = parsedData.currentStats; doc.workingSkills = parsedData.skills; doc.reflexes = parsedData.reflexes; return doc; }
// Start new character to location specified in INI void StartNewCharacter() { DaggerfallUnity.ResetUID(); RaiseOnNewGameEvent(); DaggerfallUI.Instance.PopToHUD(); ResetWeaponManager(); // Must have a character document if (characterDocument == null) characterDocument = new CharacterDocument(); // Assign character sheet PlayerEntity playerEntity = FindPlayerEntity(); playerEntity.AssignCharacter(characterDocument); // Set game time DaggerfallUnity.Instance.WorldTime.Now.SetClassicGameStartTime(); // Get start parameters DFPosition mapPixel = new DFPosition(DaggerfallUnity.Settings.StartCellX, DaggerfallUnity.Settings.StartCellY); bool startInDungeon = DaggerfallUnity.Settings.StartInDungeon; // Read location if any DFLocation location = new DFLocation(); ContentReader.MapSummary mapSummary; bool hasLocation = DaggerfallUnity.Instance.ContentReader.HasLocation(mapPixel.X, mapPixel.Y, out mapSummary); if (hasLocation) { if (!DaggerfallUnity.Instance.ContentReader.GetLocation(mapSummary.RegionIndex, mapSummary.MapIndex, out location)) hasLocation = false; } if (NoWorld) { playerEnterExit.DisableAllParents(); } else { // Start at specified location StreamingWorld streamingWorld = FindStreamingWorld(); if (hasLocation && startInDungeon && location.HasDungeon) { if (streamingWorld) { streamingWorld.TeleportToCoordinates(mapPixel.X, mapPixel.Y); streamingWorld.suppressWorld = true; } playerEnterExit.EnableDungeonParent(); playerEnterExit.StartDungeonInterior(location); } else { playerEnterExit.EnableExteriorParent(); if (streamingWorld) { streamingWorld.SetAutoReposition(StreamingWorld.RepositionMethods.Origin, Vector3.zero); streamingWorld.suppressWorld = false; } } } // Assign starting gear to player entity DaggerfallUnity.Instance.ItemHelper.AssignStartingGear(playerEntity); // Start game GameManager.Instance.PauseGame(false); DaggerfallUI.Instance.FadeHUDFromBlack(); DaggerfallUI.PostMessage(PostStartMessage); if (OnStartGame != null) OnStartGame(this, null); }
void StartFromClassicSave() { DaggerfallUnity.ResetUID(); RaiseOnNewGameEvent(); ResetWeaponManager(); // Save index must be in range if (classicSaveIndex < 0 || classicSaveIndex >= 6) throw new IndexOutOfRangeException("classicSaveIndex out of range."); // Open saves in parent path of Arena2 folder string path = SaveLoadManager.Instance.DaggerfallSavePath; SaveGames saveGames = new SaveGames(path); if (!saveGames.IsPathOpen) throw new Exception(string.Format("Could not open Daggerfall saves path {0}", path)); // Open save index if (!saveGames.TryOpenSave(classicSaveIndex)) { string error = string.Format("Could not open classic save index {0}.", classicSaveIndex); DaggerfallUI.MessageBox(error); DaggerfallUnity.LogMessage(string.Format(error), true); return; } // Get required save data SaveTree saveTree = saveGames.SaveTree; SaveVars saveVars = saveGames.SaveVars; if (NoWorld) { playerEnterExit.DisableAllParents(); } else { // Set player to world position playerEnterExit.EnableExteriorParent(); StreamingWorld streamingWorld = FindStreamingWorld(); int worldX = saveTree.Header.CharacterPosition.Position.WorldX; int worldZ = saveTree.Header.CharacterPosition.Position.WorldZ; streamingWorld.TeleportToWorldCoordinates(worldX, worldZ); streamingWorld.suppressWorld = false; } // Set game time DaggerfallUnity.Instance.WorldTime.Now.FromClassicDaggerfallTime(saveVars.GameTime); // Get character record List<SaveTreeBaseRecord> records = saveTree.FindRecords(RecordTypes.Character); if (records.Count != 1) throw new Exception("SaveTree CharacterRecord not found."); // Get prototypical character document data CharacterRecord characterRecord = (CharacterRecord)records[0]; characterDocument = characterRecord.ToCharacterDocument(); // Assign data to player entity PlayerEntity playerEntity = FindPlayerEntity(); playerEntity.AssignCharacter(characterDocument, characterRecord.ParsedData.level, characterRecord.ParsedData.startingHealth); // Assign items to player entity playerEntity.AssignItems(saveTree); // Assign gold pieces playerEntity.GoldPieces = (int)characterRecord.ParsedData.physicalGold; // Start game DaggerfallUI.Instance.PopToHUD(); GameManager.Instance.PauseGame(false); DaggerfallUI.Instance.FadeHUDFromBlack(); DaggerfallUI.PostMessage(PostStartMessage); if (OnStartGame != null) OnStartGame(this, null); }
void SetCharacterSheet(CharacterDocument characterDocument) { this.characterDocument = characterDocument; this.textBox.Text = characterDocument.name; this.statsRollout.StartingStats = characterDocument.startingStats; this.statsRollout.WorkingStats = characterDocument.workingStats; this.statsRollout.BonusPool = 0; this.skillsRollout.SetClassSkills(characterDocument.career); this.skillsRollout.StartingSkills = characterDocument.startingSkills; this.skillsRollout.WorkingSkills = characterDocument.workingSkills; this.skillsRollout.PrimarySkillBonusPoints = 0; this.skillsRollout.MajorSkillBonusPoints = 0; this.skillsRollout.MinorSkillBonusPoints = 0; this.facePicker.FaceIndex = characterDocument.faceIndex; this.facePicker.SetFaceTextures(characterDocument.raceTemplate, characterDocument.gender); this.reflexPicker.PlayerReflexes = characterDocument.reflexes; }
/// <summary> /// Assigns player entity settings from a character document. /// </summary> public void AssignCharacter(CharacterDocument character, int level = 1, int maxHealth = 0) { if (character == null) { SetEntityDefaults(); return; } this.level = level; this.gender = character.gender; this.raceTemplate = character.raceTemplate; this.career = character.career; this.name = character.name; this.faceIndex = character.faceIndex; this.stats = character.workingStats; this.skills = character.workingSkills; this.reflexes = character.reflexes; if (maxHealth <= 0) this.maxHealth = FormulaHelper.RollMaxHealth(level, stats.Endurance, career.HitPointsPerLevelOrMonsterLevel); else this.maxHealth = maxHealth; FillVitalSigns(); DaggerfallUnity.LogMessage("Assigned character " + this.name, true); }