public static Character ImportCharacterNew(string fileName, Game game) { XmlDocument doc = new XmlDocument(); try { doc.Load(fileName); } catch (XmlException ex) { throw new AGS.Types.InvalidDataException("This does not appear to be a valid AGS Character file." + Environment.NewLine + Environment.NewLine + ex.Message, ex); } if (doc.DocumentElement.Name != CHARACTER_XML_ROOT_NODE) { throw new AGS.Types.InvalidDataException("Not a valid AGS Character file."); } if (SerializeUtils.GetAttributeString(doc.DocumentElement, CHARACTER_XML_VERSION_ATTRIBUTE) != CHARACTER_XML_CURRENT_VERSION) { throw new AGS.Types.InvalidDataException("This file requires a newer version of AGS to import it."); } Character newChar = new Character(doc.DocumentElement.FirstChild); PaletteEntry[] palette = game.ReadPaletteFromXML(doc.DocumentElement); // Clear any existing event handler function names for (int i = 0; i < newChar.Interactions.ScriptFunctionNames.Length; i++) { newChar.Interactions.ScriptFunctionNames[i] = string.Empty; } SpriteFolder newFolder = new SpriteFolder(newChar.ScriptName + "Import"); game.RootSpriteFolder.SubFolders.Add(newFolder); Dictionary<int, int> spriteMapping = new Dictionary<int, int>(); XmlNode viewsNode = doc.DocumentElement.SelectSingleNode("Views"); newChar.NormalView = ReadAndAddNewStyleView(viewsNode.SelectSingleNode("NormalView"), game, spriteMapping, palette, newFolder); if (newChar.SpeechView > 0) { newChar.SpeechView = ReadAndAddNewStyleView(viewsNode.SelectSingleNode("SpeechView"), game, spriteMapping, palette, newFolder); } if (newChar.IdleView > 0) { newChar.IdleView = ReadAndAddNewStyleView(viewsNode.SelectSingleNode("IdleView"), game, spriteMapping, palette, newFolder); } if (newChar.ThinkingView > 0) { newChar.ThinkingView = ReadAndAddNewStyleView(viewsNode.SelectSingleNode("ThinkingView"), game, spriteMapping, palette, newFolder); } if (newChar.BlinkingView > 0) { newChar.BlinkingView = ReadAndAddNewStyleView(viewsNode.SelectSingleNode("BlinkingView"), game, spriteMapping, palette, newFolder); } EnsureCharacterScriptNameIsUnique(newChar, game); game.RootSpriteFolder.NotifyClientsOfUpdate(); game.NotifyClientsViewsUpdated(); return newChar; }
/// <summary> /// Import a 2.72-compatible CHA file. This code is horrid, but it's /// backwards compatible!! /// </summary> public static Character ImportCharacter272(string fileName, Game game) { BinaryReader reader = new BinaryReader(new FileStream(fileName, FileMode.Open, FileAccess.Read)); string fileSig = Encoding.ASCII.GetString(reader.ReadBytes(12)); if (fileSig != CHARACTER_FILE_SIGNATURE) { reader.Close(); throw new AGS.Types.InvalidDataException("This is not a valid AGS character file."); } int fileVersion = reader.ReadInt32(); if ((fileVersion < 5) || (fileVersion > 6)) { reader.Close(); throw new AGS.Types.InvalidDataException("This character file is not supported by this version of AGS."); } Color []palette = new Color[256]; for (int i = 0; i < 256; i++) { int r = reader.ReadByte(); int g = reader.ReadByte(); int b = reader.ReadByte(); reader.ReadByte(); palette[i] = Color.FromArgb(r * 4, g * 4, b * 4); } Character character = new Character(); reader.ReadInt32(); character.SpeechView = reader.ReadInt32(); reader.ReadInt32(); character.StartingRoom = reader.ReadInt32(); reader.ReadInt32(); character.StartX = reader.ReadInt32(); character.StartY = reader.ReadInt32(); reader.ReadInt32(); reader.ReadInt32(); reader.ReadInt32(); character.IdleView = reader.ReadInt32(); reader.ReadInt32(); reader.ReadInt32(); reader.ReadInt32(); character.SpeechColor = reader.ReadInt32(); character.ThinkingView = reader.ReadInt32(); character.BlinkingView = reader.ReadInt16(); reader.ReadInt16(); reader.ReadBytes(40); character.MovementSpeed = reader.ReadInt16(); character.AnimationDelay = reader.ReadInt16(); reader.ReadBytes(606); character.RealName = ReadNullTerminatedString(reader, 40); character.ScriptName = ReadNullTerminatedString(reader, 20); if (character.ScriptName.Length > 0) { character.ScriptName = "c" + Char.ToUpper(character.ScriptName[0]) + character.ScriptName.Substring(1).ToLower(); EnsureCharacterScriptNameIsUnique(character, game); } reader.ReadInt16(); string viewNamePrefix = character.ScriptName; if (viewNamePrefix.StartsWith("c")) viewNamePrefix = viewNamePrefix.Substring(1); SpriteFolder folder = new SpriteFolder(character.ScriptName + "Sprites"); character.NormalView = ReadAndAddView(viewNamePrefix + "Walk", reader, game, folder, palette); if (character.SpeechView > 0) { character.SpeechView = ReadAndAddView(viewNamePrefix + "Talk", reader, game, folder, palette); } else { character.SpeechView = 0; } if (character.IdleView > 0) { character.IdleView = ReadAndAddView(viewNamePrefix + "Idle", reader, game, folder, palette); } else { character.IdleView = 0; } if ((character.ThinkingView > 0) && (fileVersion >= 6)) { character.ThinkingView = ReadAndAddView(viewNamePrefix + "Think", reader, game, folder, palette); } else { character.ThinkingView = 0; } if ((character.BlinkingView > 0) && (fileVersion >= 6)) { character.BlinkingView = ReadAndAddView(viewNamePrefix + "Blink", reader, game, folder, palette); } else { character.BlinkingView = 0; } reader.Close(); game.RootSpriteFolder.SubFolders.Add(folder); game.RootSpriteFolder.NotifyClientsOfUpdate(); game.NotifyClientsViewsUpdated(); return character; }