コード例 #1
0
        public override void Execute(ModScriptDatabaseHelper database)
        {
            VltCollection collection = GetCollection(database, ClassName, CollectionName);
            VltClassField field      = GetField(collection.Class, FieldName);

            if (!field.IsArray)
            {
                throw new ModScriptCommandExecutionException($"Field {ClassName}[{FieldName}] is not an array!");
            }

            if (!collection.HasEntry(FieldName))
            {
                throw new ModScriptCommandExecutionException($"Collection {collection.ShortPath} does not have an entry for {FieldName}.");
            }

            VLTArrayType array = collection.GetRawValue <VLTArrayType>(FieldName);

            if (array.Items.Count == array.Capacity && field.IsInLayout)
            {
                throw new ModScriptCommandExecutionException("Cannot append to a full array when it is a layout field");
            }

            if (array.Items.Count + 1 > field.MaxCount)
            {
                throw new ModScriptCommandExecutionException("Appending to this array would cause it to exceed the maximum number of allowed elements.");
            }

            var itemToEdit = TypeRegistry.ConstructInstance(array.ItemType, collection.Class, field, collection);

            if (_hasValue)
            {
                switch (itemToEdit)
                {
                case PrimitiveTypeBase primitiveTypeBase:
                    ValueConversionUtils.DoPrimitiveConversion(primitiveTypeBase, Value);
                    break;

                case IStringValue stringValue:
                    stringValue.SetString(Value);
                    break;

                case BaseRefSpec refSpec:
                    // NOTE: This is a compatibility feature for certain types, such as GCollectionKey, which are technically a RefSpec.
                    refSpec.CollectionKey = Value;
                    break;

                default:
                    throw new ModScriptCommandExecutionException($"Object stored in {collection.Class.Name}[{field.Name}] is not a simple type and cannot be used in a value-append command");
                }
            }

            array.Items.Add(itemToEdit);

            if (!field.IsInLayout)
            {
                array.Capacity++;
            }
        }
コード例 #2
0
        public override void Execute(ModScriptDatabaseHelper database)
        {
            VltCollection collection = GetCollection(database, ClassName, CollectionName);

            if (GetCollection(database, ClassName, NewName, false) != null)
            {
                throw new InvalidDataException($"rename_node failed because there is already a collection called '{NewName}'");
            }

            database.RenameCollection(collection, NewName);
        }
コード例 #3
0
        public override void Execute(ModScriptDatabaseHelper database)
        {
            VltCollection srcCollection = GetCollection(database, ClassName, SourceCollectionName);
            VltCollection dstCollection = GetCollection(database, ClassName, DestinationCollectionName);
            Dictionary <VltClassField, VLTBaseType> values = new Dictionary <VltClassField, VLTBaseType>();

            if ((Options & CopyOptions.Base) != 0)
            {
                foreach (var baseField in srcCollection.Class.BaseFields)
                {
                    values.Add(baseField,
                               ValueCloningUtils.CloneValue(database.Database, srcCollection.GetRawValue(baseField.Name), srcCollection.Class,
                                                            baseField, dstCollection));
                }
            }

            if ((Options & CopyOptions.Optional) != 0)
            {
                foreach (var(key, value) in srcCollection.GetData())
                {
                    var field = srcCollection.Class[key];

                    if (!field.IsInLayout)
                    {
                        values.Add(field, ValueCloningUtils.CloneValue(database.Database, value, srcCollection.Class, field, dstCollection));
                    }
                }
            }

            // base will always overwrite
            // optional by itself will copy anything that doesn't exist
            // optional + overwrite will copy nonexistent fields and overwrite the other ones(optional only)
            if ((Options & CopyOptions.Base) != 0)
            {
                foreach (var(key, value) in values)
                {
                    if (key.IsInLayout)
                    {
                        dstCollection.SetRawValue(key.Name, value);
                    }
                }
            }

            if ((Options & CopyOptions.Optional) != 0)
            {
                foreach (var(field, value) in values)
                {
                    if (!field.IsInLayout && (!dstCollection.HasEntry(field.Name) || (Options & CopyOptions.OverwriteOptional) != 0))
                    {
                        dstCollection.SetRawValue(field.Name, value);
                    }
                }
            }
        }
コード例 #4
0
        public override void Execute(ModScriptDatabaseHelper database)
        {
            VltCollection collection = GetCollection(database, ClassName, CollectionName);
            Vault         vault;

            try
            {
                vault = database.Database.FindVault(VaultName);
            }
            catch (InvalidOperationException e)
            {
                throw new ModScriptCommandExecutionException($"Cannot find vault '{VaultName}'", e);
            }

            collection.SetVault(vault);
        }
コード例 #5
0
        public override void Execute(ModScriptDatabaseHelper database)
        {
            VltCollection collection = GetCollection(database, ClassName, CollectionName);
            VltClassField field      = GetField(collection.Class, FieldName);

            if (!field.IsArray)
            {
                throw new ModScriptCommandExecutionException($"Field {ClassName}[{FieldName}] is not an array!");
            }

            if (field.MaxCount < NewCapacity)
            {
                throw new ModScriptCommandExecutionException(
                          $"Cannot resize field {ClassName}[{FieldName}] beyond maximum count (requested {NewCapacity} but limit is {field.MaxCount})");
            }

            if (!collection.HasEntry(FieldName))
            {
                throw new ModScriptCommandExecutionException($"Collection {collection.ShortPath} does not have an entry for {FieldName}.");
            }

            VLTArrayType array = collection.GetRawValue <VLTArrayType>(FieldName);

            if (NewCapacity < array.Items.Count)
            {
                while (NewCapacity < array.Items.Count)
                {
                    array.Items.RemoveAt(array.Items.Count - 1);
                }
            }
            else if (NewCapacity > array.Items.Count)
            {
                while (NewCapacity > array.Items.Count)
                {
                    array.Items.Add(TypeRegistry.ConstructInstance(array.ItemType, collection.Class, field, collection));
                }
            }

            if (!field.IsInLayout)
            {
                array.Capacity = NewCapacity;
            }
        }
コード例 #6
0
        public override void Execute(ModScriptDatabaseHelper database)
        {
            VltCollection collection = GetCollection(database, ClassName, CollectionName);

            if (collection.HasEntry(FieldName))
            {
                collection.RemoveValue(FieldName);
            }
            else
            {
                string hashed = $"0x{VLT32Hasher.Hash(FieldName):X8}";

                if (collection.HasEntry(hashed))
                {
                    collection.RemoveValue(hashed);
                }
                else
                {
                    throw new ModScriptCommandExecutionException($"Could not delete field: {ClassName}/{CollectionName}[{FieldName}]");
                }
            }
        }
コード例 #7
0
        public override void Execute(ModScriptDatabaseHelper database)
        {
            VltCollection collection = GetCollection(database, ClassName, CollectionName);
            VltClassField field      = collection.Class[FieldName];

            if (field.IsInLayout)
            {
                throw new InvalidDataException($"add_field failed because field '{field.Name}' is a base field");
            }

            if (collection.HasEntry(field.Name))
            {
                throw new InvalidDataException($"add_field failed because collection '{collection.ShortPath}' already has field '{field.Name}'");
            }

            var vltBaseType = TypeRegistry.CreateInstance(database.Database.Options.GameId, collection.Class, field, collection);

            if (vltBaseType is VLTArrayType array)
            {
                if (ArrayCapacity > field.MaxCount)
                {
                    throw new ModScriptCommandExecutionException(
                              $"Cannot add field {ClassName}[{FieldName}] with capacity beyond maximum (requested {ArrayCapacity} but limit is {field.MaxCount})");
                }

                array.Capacity      = ArrayCapacity;
                array.ItemAlignment = field.Alignment;
                array.FieldSize     = field.Size;
                array.Items         = new List <VLTBaseType>();

                for (var i = 0; i < ArrayCapacity; i++)
                {
                    array.Items.Add(TypeRegistry.ConstructInstance(array.ItemType, collection.Class, field, collection));
                }
            }

            collection.SetRawValue(field.Name, vltBaseType);
        }
コード例 #8
0
        public override void Execute(ModScriptDatabaseHelper database)
        {
            VltCollection collection = GetCollection(database, ClassName, CollectionName);

            database.RemoveCollection(collection);
        }
コード例 #9
0
 public override void Execute(ModScriptDatabaseHelper database)
 {
     //
 }
コード例 #10
0
        private static int RunApplyModScript(ApplyScriptOptions opts)
        {
            if (!Directory.Exists(opts.InputDirectory))
            {
                throw new Exception($"Non-existent input directory: {opts.InputDirectory}");
            }

            if (!Directory.Exists(opts.OutputDirectory))
            {
                Directory.CreateDirectory(opts.OutputDirectory);
            }

            if (string.IsNullOrEmpty(opts.ModScriptPath))
            {
                throw new Exception("Missing modscript path!");
            }

            var profile = ResolveProfile(opts.ProfileName);

            if (profile == null)
            {
                Console.WriteLine("ERROR: Unknown profile {0}", opts.ProfileName);
                Console.WriteLine("AVAILABLE PROFILES:");
                foreach (var baseProfile in Profiles)
                {
                    Console.WriteLine("\tNAME: {0}", baseProfile.GetName());
                }

                return(1);
            }

            var database     = new Database(new DatabaseOptions(profile.GetGame(), profile.GetDatabaseType()));
            var deserializer = new DatabaseDeserializer(database, opts.InputDirectory);

            var stopwatch      = Stopwatch.StartNew();
            var loadedDatabase = deserializer.Deserialize();

            stopwatch.Stop();

            Console.WriteLine("Loaded database from {2} in {0}ms ({1:f2}s)", stopwatch.ElapsedMilliseconds,
                              stopwatch.ElapsedMilliseconds / 1000f, opts.InputDirectory);

            stopwatch.Restart();

            var modScriptParser   = new ModScriptParser(opts.ModScriptPath);
            var cmdStopwatch      = Stopwatch.StartNew();
            var modScriptDatabase = new ModScriptDatabaseHelper(database);
            var commandCount      = 0;

            foreach (var command in modScriptParser.Parse())
            {
#if !DEBUG
                try
                {
#endif
                cmdStopwatch.Restart();
                command.Execute(modScriptDatabase);
                commandCount++;
                //Console.WriteLine("Executed command in {1}ms: {0}", command.Line, cmdStopwatch.ElapsedMilliseconds);
#if !DEBUG
            }
            catch (Exception e)
            {
                throw new ModScriptCommandExecutionException($"Failed to execute command: {command.Line}", e);
            }
#endif
            }

            stopwatch.Stop();
            var commandsPerSecond = commandCount / (stopwatch.ElapsedMilliseconds / 1000.0f);
            Console.WriteLine("Applied script from {2} in {0}ms ({1:f2}s) ({4} commands @ ~{3:f2} commands/sec)",
                              stopwatch.ElapsedMilliseconds,
                              stopwatch.ElapsedMilliseconds / 1000f, opts.ModScriptPath, commandsPerSecond, commandCount);
            if (opts.MakeBackup)
            {
                stopwatch.Restart();
                Console.WriteLine("Making backup");
                Directory.Move(opts.InputDirectory,
                               $"{opts.InputDirectory.TrimEnd('/', '\\')}_{DateTimeOffset.Now.ToUnixTimeSeconds()}");
                Directory.CreateDirectory(opts.InputDirectory);
                stopwatch.Stop();
                Console.WriteLine("Made backup in {0}ms ({1:f2}s)", stopwatch.ElapsedMilliseconds,
                                  stopwatch.ElapsedMilliseconds / 1000f);
            }

            stopwatch.Restart();
            new DatabaseSerializer(database, opts.InputDirectory).Serialize(loadedDatabase.Files);

            //deserializer.GenerateFiles(profile, args.OutputDirectory);
            stopwatch.Stop();

            Console.WriteLine("Exported YML files to {2} in {0}ms ({1:f2}s)", stopwatch.ElapsedMilliseconds,
                              stopwatch.ElapsedMilliseconds / 1000f, opts.InputDirectory);

            if (opts.GenerateBins)
            {
                stopwatch.Restart();
                deserializer.GenerateFiles(profile, opts.OutputDirectory);
                stopwatch.Stop();

                Console.WriteLine("Exported VLT files to {2} in {0}ms ({1:f2}s)", stopwatch.ElapsedMilliseconds,
                                  stopwatch.ElapsedMilliseconds / 1000f, opts.OutputDirectory);
            }

            return(0);
        }
コード例 #11
0
        private static void RunApplyModScript(ProgramArgs args, BaseProfile profile)
        {
            if (string.IsNullOrEmpty(args.ModScriptPath))
            {
                throw new Exception("Missing modscript path!");
            }

            var database     = new Database(new DatabaseOptions(profile.GetGame(), profile.GetDatabaseType()));
            var deserializer = new DatabaseDeserializer(database, args.InputDirectory);

            Stopwatch stopwatch      = Stopwatch.StartNew();
            var       loadedDatabase = deserializer.Deserialize();

            stopwatch.Stop();

            Console.WriteLine("Loaded database from {2} in {0}ms ({1:f2}s)", stopwatch.ElapsedMilliseconds,
                              stopwatch.ElapsedMilliseconds / 1000f, args.InputDirectory);

            stopwatch.Restart();

            var modScriptParser   = new ModScriptParser(args.ModScriptPath);
            var cmdStopwatch      = Stopwatch.StartNew();
            var modScriptDatabase = new ModScriptDatabaseHelper(database);
            int commandCount      = 0;

            foreach (var command in modScriptParser.Parse())
            {
#if !DEBUG
                try
                {
#endif
                cmdStopwatch.Restart();
                command.Execute(modScriptDatabase);
                commandCount++;
                //Console.WriteLine("Executed command in {1}ms: {0}", command.Line, cmdStopwatch.ElapsedMilliseconds);
#if !DEBUG
            }
            catch (Exception e)
            {
                throw new ModScriptCommandExecutionException($"Failed to execute command: {command.Line}", e);
            }
#endif
            }
            stopwatch.Stop();
            float commandsPerSecond = commandCount / (stopwatch.ElapsedMilliseconds / 1000.0f);
            Console.WriteLine("Applied script from {2} in {0}ms ({1:f2}s) ({4} commands @ ~{3:f2} commands/sec)", stopwatch.ElapsedMilliseconds,
                              stopwatch.ElapsedMilliseconds / 1000f, args.ModScriptPath, commandsPerSecond, commandCount);
            stopwatch.Restart();
            Console.WriteLine("Making backup");
            Directory.Move(args.InputDirectory, $"{args.InputDirectory.TrimEnd('/', '\\')}_{DateTimeOffset.Now.ToUnixTimeSeconds()}");
            Directory.CreateDirectory(args.InputDirectory);
            stopwatch.Stop();
            Console.WriteLine("Made backup in {0}ms ({1:f2}s)", stopwatch.ElapsedMilliseconds,
                              stopwatch.ElapsedMilliseconds / 1000f);

            stopwatch.Restart();
            new DatabaseSerializer(database, args.InputDirectory).Serialize(loadedDatabase.Files);

            //deserializer.GenerateFiles(profile, args.OutputDirectory);
            stopwatch.Stop();

            Console.WriteLine("Exported YML files to {2} in {0}ms ({1:f2}s)", stopwatch.ElapsedMilliseconds,
                              stopwatch.ElapsedMilliseconds / 1000f, args.InputDirectory);
            stopwatch.Restart();
            deserializer.GenerateFiles(profile, args.OutputDirectory);
            stopwatch.Stop();

            Console.WriteLine("Exported VLT files to {2} in {0}ms ({1:f2}s)", stopwatch.ElapsedMilliseconds,
                              stopwatch.ElapsedMilliseconds / 1000f, args.OutputDirectory);
        }