private static void EmitFileHeader(AscensionSourceFile file)
 {
     file.EmitLine("using System;");
     file.EmitLine("using System.Collections.Generic;");
     file.EmitLine("using Ascension.Networking;");
     file.EmitLine("using Ascension.Networking.Sockets;");
     file.EmitLine();
 }
 private static void EmitRegisterFactory <T>(AscensionSourceFile file, IEnumerable <T> decorators)
     where T : AssetDecorator
 {
     foreach (T d in decorators)
     {
         file.EmitLine("Ascension.Networking.Factory.Register({0}.Instance);", d.NameMeta);
     }
 }
Exemple #3
0
 private static void CompileAssemblyInfo(AscensionCompilerOperation op)
 {
     using (AscensionSourceFile file = new AscensionSourceFile(op.assemblyInfoFilePath))
     {
         file.EmitLine("using System.Reflection;");
         file.EmitLine("using System.Runtime.CompilerServices;");
         file.EmitLine("using System.Runtime.InteropServices;");
         file.EmitLine();
         file.EmitLine("[assembly: AssemblyTitle(\"Ascension.Data\")]");
         file.EmitLine("[assembly: Guid(\"bd29ff3d-20fc-49ac-8303-459b4d662c04\")]");
         file.EmitLine("[assembly: AssemblyVersion(\"0.5.0.0\")]");
         file.EmitLine("[assembly: AssemblyFileVersion(\"0.0.0.0\")]");
     }
 }
Exemple #4
0
    private static void CompilePrefabs(AscensionCompilerOperation op)
    {
        if (PrefabDatabase.Instance.DatabaseMode == PrefabDatabaseMode.AutomaticScan)
        {
            UpdatePrefabsDatabase();
        }

        for (int i = 1; i < PrefabDatabase.Instance.Prefabs.Length; ++i)
        {
            if (PrefabDatabase.Instance.Prefabs[i])
            {
                GameObject      go     = PrefabDatabase.Instance.Prefabs[i];
                AscensionEntity entity = go.GetComponent <AscensionEntity>();

                if (entity && entity.SceneGuid != UniqueId.None)
                {
                    entity.sceneGuid = "";

                    EditorUtility.SetDirty(go);
                    EditorUtility.SetDirty(entity);
                    AssetDatabase.SaveAssets();
                }
            }
        }

        using (AscensionSourceFile file = new AscensionSourceFile(op.prefabsFilePath))
        {
            file.EmitScope("public static class AscensionPrefabs", () =>
            {
                for (int i = 1; i < PrefabDatabase.Instance.Prefabs.Length; ++i)
                {
                    GameObject prefab = PrefabDatabase.Instance.Prefabs[i];

                    if (prefab)
                    {
                        file.EmitLine(
                            "public static readonly Ascension.Networking.PrefabId {0} = new Ascension.Networking.PrefabId({1});",
                            prefab.name.CSharpIdentifier(), prefab.GetComponent <AscensionEntity>().prefabId);
                    }
                }
            });
        }
    }
    private static void CompileNetwork(AscensionCompilerOperation op)
    {
        using (AscensionSourceFile file = new AscensionSourceFile(op.networkFilePath))
        {
            file.EmitScope("namespace Ascension.Networking.Data", () =>
            {
                file.EmitScope("public static class AscensionNetworkInternalUser", () =>
                {
                    file.EmitScope("public static void EnvironmentSetup()", () =>
                    {
                        EmitRegisterFactory(file, op.project.Structs.Select(x => new ObjectDecorator(x)));
                        EmitRegisterFactory(file, op.project.Commands.Select(x => new CommandDecorator(x)));
                        EmitRegisterFactory(file, op.project.Events.Select(x => new EventDecorator(x)));
                        EmitRegisterFactory(file, op.project.States.Select(x => new StateDecorator(x)));
                    });

                    file.EmitScope("public static void EnvironmentReset()", () => { });
                });
            });
        }
    }
    public static void CompileMaps(AscensionCompilerOperation op)
    {
        List <Scene> scenes = new List <Scene>();

        for (int i = 0; i < EditorBuildSettings.scenes.Length; ++i)
        {
            if (EditorBuildSettings.scenes[i].enabled)
            {
                string name = Path.GetFileNameWithoutExtension(EditorBuildSettings.scenes[i].path);

                scenes.Add(new Scene
                {
                    Name       = name,
                    Identifier = EditorUtils.CSharpIdentifier(name)
                });
            }
        }

        foreach (IGrouping <string, Scene> group in scenes.GroupBy(x => x.Identifier))
        {
            if (group.Count() > 1)
            {
                throw new AscensionException("You have several scenes named '{0}' in the build settings.", group.Key);
            }
        }

        using (AscensionSourceFile file = new AscensionSourceFile(op.scenesFilePath))
        {
            file.EmitLine("using System.Collections.Generic;");
            file.EmitScope("public static class AscensionScenes", () =>
            {
                file.EmitLine(
                    "static public readonly Dictionary<string, int> nameLookup = new Dictionary<string, int>();");
                file.EmitLine(
                    "static public readonly Dictionary<int, string> indexLookup = new Dictionary<int, string>();");

                file.EmitScope("public static void AddScene(short prefix, short id, string name)", () =>
                {
                    file.EmitLine("int index = (prefix << 16) | (int)id;");
                    file.EmitLine("nameLookup.Add(name, index);");
                    file.EmitLine("indexLookup.Add(index, name);");
                });

                file.EmitLine("static public IEnumerable<string> AllScenes { get { return nameLookup.Keys; } }");

                file.EmitScope("static AscensionScenes()", () =>
                {
                    for (int n = 0; n < scenes.Count; ++n)
                    {
                        file.EmitLine("AddScene(0, {1}, \"{0}\");", scenes[n].Name, n);
                    }
                });

                for (int n = 0; n < scenes.Count; ++n)
                {
                    file.EmitLine("public const string {0} = \"{1}\";", scenes[n].Identifier, scenes[n].Name);
                }
            });

            file.EmitScope("namespace Ascension.Networking.Data", () =>
            {
                file.EmitScope("public static class AscensionScenesInternal", () =>
                {
                    file.EmitLine(
                        "static public int GetSceneIndex(string name) { return AscensionScenes.nameLookup[name]; }");
                    file.EmitLine(
                        "static public string GetSceneName(int index) { return AscensionScenes.indexLookup[index]; }");
                });
            });
        }
    }