Exemplo n.º 1
0
    public virtual void GenerateCode(LDtkWorld ldtkJson, LdtkGeneratorContext ctx, ICodeOutput output)
    {
        List <CompilationUnitFragment> fragments = new List <CompilationUnitFragment>();

        foreach (EnumDefinition ed in ldtkJson.Defs.Enums)
        {
            fragments.Add(GenerateEnum(ed, ctx));
        }

        foreach (EntityDefinition ed in ldtkJson.Defs.Entities)
        {
            ClassCompilationUnit entity = GenerateEntity(ed, ctx);
            fragments.Add(entity);

            if (ctx.CodeCustomizer != null)
            {
                ctx.CodeCustomizer.CustomizeEntity(entity, ed, ctx);
            }
        }

        ClassCompilationUnit level = GenerateLevel(ldtkJson, ctx);

        fragments.Add(level);

        if (ctx.CodeCustomizer != null)
        {
            ctx.CodeCustomizer.CustomizeLevel(level, ldtkJson, ctx);
        }

        output.OutputCode(fragments, ctx);
    }
Exemplo n.º 2
0
    public void OutputCode(List <CompilationUnitFragment> fragments, LdtkGeneratorContext ctx)
    {
        Directory.CreateDirectory(OutputDir);

        foreach (CompilationUnitFragment fragment in fragments)
        {
            CompilationUnit cuFile = new CompilationUnit()
            {
                ClassNamespace = ctx.CodeSettings.Namespace,
                Name           = fragment.Name
            };

            cuFile.Fragments.Add(fragment);

            CompilationUnitSource source = new(ctx.CodeSettings);
            cuFile.Render(source);

            if (PrintFragments)
            {
                Console.WriteLine("Generating -> " + fragment.Name + ".cs");
            }

            string filePath = OutputDir + "/" + fragment.Name + ".cs";
            File.WriteAllText(filePath, source.GetSourceCode());
        }
    }
Exemplo n.º 3
0
    private static void Run(Options options)
    {
        string outputDirectory = Path.GetDirectoryName(Path.GetFullPath(options.Output));

        Directory.CreateDirectory(outputDirectory);

        string[] files = Directory.GetFiles(outputDirectory);

        for (int i = 0; i < files.Length; i++)
        {
            File.Delete(files[i]);
        }

        LdtkTypeConverter typeConverter = new LdtkTypeConverter()
        {
            PointAsVector2 = options.PointAsVector2
        };

        LdtkGeneratorContext ctx = new LdtkGeneratorContext()
        {
            LevelClassName = options.LevelClassName,
            TypeConverter  = typeConverter
        };

        ctx.CodeSettings.Namespace = options.Namespace;

        ICodeOutput output;

        if (options.SingleFile)
        {
            SingleFileOutput singleFileOutput = new SingleFileOutput()
            {
                OutputDir = outputDirectory,
                Filename  = Path.GetFileNameWithoutExtension(options.Input)
            };
            output = singleFileOutput;
        }
        else
        {
            MultiFileOutput multiFileOutput = new MultiFileOutput()
            {
                PrintFragments = true,
                OutputDir      = outputDirectory,
            };
            output = multiFileOutput;
        }

        LDtkWorld ldtkWorld = JsonSerializer.Deserialize <LDtkWorld>(File.ReadAllText(options.Input), LDtkWorld.SerializeOptions);

        LdtkCodeGenerator cg = new LdtkCodeGenerator();

        cg.GenerateCode(ldtkWorld, ctx, output);
    }
Exemplo n.º 4
0
    public virtual ClassCompilationUnit GenerateLevel(LDtkWorld ldtkJson, LdtkGeneratorContext ctx)
    {
        ClassCompilationUnit levelClass = new ClassCompilationUnit()
        {
            Name = ctx.LevelClassName
        };

        foreach (FieldDefinition fd in ldtkJson.Defs.LevelFields)
        {
            levelClass.Fields.Add(ctx.TypeConverter.ToCompilationUnitField(fd, ctx));
        }

        return(levelClass);
    }
Exemplo n.º 5
0
    public virtual ClassCompilationUnit GenerateEntity(EntityDefinition ed, LdtkGeneratorContext ctx)
    {
        ClassCompilationUnit classFragment = new ClassCompilationUnit()
        {
            Name = ed.Identifier
        };

        foreach (FieldDefinition fd in ed.FieldDefs)
        {
            classFragment.Fields.Add(ctx.TypeConverter.ToCompilationUnitField(fd, ctx));
        }

        return(classFragment);
    }
Exemplo n.º 6
0
    public virtual EnumCompilationUnit GenerateEnum(EnumDefinition enumDefinition, LdtkGeneratorContext ctx)
    {
        EnumCompilationUnit enumFragment = new EnumCompilationUnit()
        {
            Name = enumDefinition.Identifier
        };

        foreach (EnumValueDefinition evd in enumDefinition.Values)
        {
            enumFragment.Literals.Add(evd.Id);
        }

        return(enumFragment);
    }
Exemplo n.º 7
0
    static void Main(string[] args)
    {
        string   text     = File.ReadAllText("Entities.ldtk");
        LdtkJson ldtkJson = LdtkJson.FromJson(text);

        LdtkGeneratorContext ctx = new LdtkGeneratorContext();

        ctx.TypeConverter          = new LdtkTypeConverter();
        ctx.CodeSettings.Namespace = "MyNamespace.Test";

        SingleFileOutput fOut = new SingleFileOutput();

        fOut.OutputDir = "src-gen";
        fOut.Filename  = "MyFileCode.cs";

        LdtkCodeGenerator cg = new LdtkCodeGenerator();

        cg.GenerateCode(ldtkJson, ctx, fOut);
    }
Exemplo n.º 8
0
    public void OutputCode(List <CompilationUnitFragment> fragments, LdtkGeneratorContext ctx)
    {
        Directory.CreateDirectory(OutputDir);

        CompilationUnit cu = new CompilationUnit()
        {
            Name           = Filename,
            ClassNamespace = ctx.CodeSettings.Namespace,
            Fragments      = fragments
        };

        CompilationUnitSource source = new(ctx.CodeSettings);

        cu.Render(source);

        string filePath = OutputDir + "/" + Filename;

        File.WriteAllText(filePath, source.GetSourceCode());
    }
        public CompilationUnitField ToCompilationUnitField(ldtk.FieldDefinition fieldDefinition, LdtkGeneratorContext ctx)
        {
            CompilationUnitField field = new CompilationUnitField();

            field.Name       = fieldDefinition.Identifier;
            field.Type       = GetDeclaringTypeFor(fieldDefinition, ctx);
            field.Visibility = CompilationUnitField.FieldVisibility.Public;

            if (fieldDefinition.IsArray)
            {
                field.RequiredImport = GetArrayImport();
            }

            return(field);
        }
Exemplo n.º 10
0
        public virtual string GetDeclaringTypeFor(ldtk.FieldDefinition fieldDefinition, LdtkGeneratorContext ctx)
        {
            string baseType = fieldDefinition.Type;

            if (fieldDefinition.IsArray)
            {
                baseType = baseType.Substring(6, baseType.Length - 7);
            }

            string declType = GetCSharpTypeFor(baseType);

            if (fieldDefinition.IsArray)
            {
                declType += "[]";
            }

            return(declType);
        }
Exemplo n.º 11
0
    public virtual void CustomizeEntity(ClassCompilationUnit entity, EntityDefinition ed, LdtkGeneratorContext ctx)
    {
        entity.BaseClass = "ILDtkEntity";

        entity.Fields.Add(new CompilationUnitField("Uid", "long"));
        entity.Fields.Add(new CompilationUnitField("Identifier", "string"));
        entity.Fields.Add(new CompilationUnitField("Size", "Vector2"));
        entity.Fields.Add(new CompilationUnitField("Position", "Vector2"));
        entity.Fields.Add(new CompilationUnitField("Pivot", "Vector2"));
        entity.Fields.Add(new CompilationUnitField("Tile", "Rectangle"));
        entity.Fields.Add(new CompilationUnitField("EditorVisualColor", "Color"));
    }
Exemplo n.º 12
0
 public virtual void CustomizeLevel(ClassCompilationUnit level, LDtkWorld ldtkJson, LdtkGeneratorContext ctx)
 {
 }
Exemplo n.º 13
0
 public virtual void CustomizeEntity(CompilationUnitClass entity, ldtk.EntityDefinition ed, LdtkGeneratorContext ctx)
 {
     entity.Fields.Add(new CompilationUnitField("Uid", "long"));
     entity.Fields.Add(new CompilationUnitField("Identifier", "string"));
     entity.Fields.Add(new CompilationUnitField("Width", "float"));
     entity.Fields.Add(new CompilationUnitField("Height", "float"));
     entity.Fields.Add(new CompilationUnitField("Position", "float[]"));
     entity.Fields.Add(new CompilationUnitField("Pivot", "float[]"));
 }
Exemplo n.º 14
0
 public virtual void CustomizeLevel(CompilationUnitClass level, ldtk.LdtkJson ldtkJson, LdtkGeneratorContext ctx)
 {
     level.Fields.Add(new CompilationUnitField("Uid", "long"));
     level.Fields.Add(new CompilationUnitField("Identifier", "string"));
     level.Fields.Add(new CompilationUnitField("WorldCoords", "float[]"));
     level.Fields.Add(new CompilationUnitField("Width", "float"));
     level.Fields.Add(new CompilationUnitField("Height", "float"));
     level.Fields.Add(new CompilationUnitField("Entities", "object[]"));
 }