コード例 #1
0
        public void AddWeaponToEntity(int eid)
        {
            Core.Entity         e = new Core.Entity(_entityID);
            Core.EntityReturner er;

            int weaponID = e.UID;

            Components.CreatureDetailsComp cdc = (Components.CreatureDetailsComp)GetSingleComponentByID(eid, Core.ComponentTypes.CreatureDetails);

            if (cdc.CreatureType != Types.CreatureTypes.Troll)
            {
                er = Core.EntityFactory.CreateSword();
            }
            else
            {
                er = Core.EntityFactory.CreateTrollClub();
            }


            Entities.Add(_entityID, er.ComponentList);
            EntityBitLookUp.Add(_entityID, er.LookUpBit);
            JustEntities.Add(_entityID, e);

            _entityID++;

            // add weapon to entity
            Core.InventoryAddEventArgs addEvent = new Core.InventoryAddEventArgs(Core.EventTypes.InventoryAdd, eid, weaponID);
            Core.EventBus.Publish(Core.EventTypes.InventoryAdd, addEvent);
        }
コード例 #2
0
        public bool ContainsFormEntityOffset(Core.Entity e)
        {
            Vector2 delta = e.Position - (this.Entity.Position - this.Offset * PhantomUtils.FromAngle(e.Orientation));
            float   a     = delta.Angle();

            return(Math.Abs(PhantomUtils.AngleDifference(a, this.Entity.Orientation)) <= this.halfarc);
        }
コード例 #3
0
        public bool ContainsFormPosition(Core.Entity e)
        {
            Vector2 delta = e.Position - this.Position;
            float   a     = delta.Angle();

            return(Math.Abs(PhantomUtils.AngleDifference(a, Orientation)) <= this.halfarc);
        }
コード例 #4
0
        private void HandlePointerUp(object sender, PointerRoutedEventArgs e)
        {
            _pointerDown = false;
            if (_prevPoint == null)
            {
                return;
            }

            switch (ToolMode)
            {
            case EditMode.Object:
            case EditMode.Move:
                _selected = null;
                _offset   = Vector3.Zero;
                break;

            case EditMode.Delete:
            {
                if (DeleteMode == ObjectType.Object)
                {
                    var pos = _screen.Camera.Owner.Transform.LocalTranslation;
                    pos.X += (float)_prevPoint.Position.X;
                    pos.Y += (float)_prevPoint.Position.Y + 100;         // +100 to offset camera position
                    var toDelete = ClickDetector.GetClicked(pos.X, pos.Y);
                    if (toDelete != null)
                    {
                        _screen.RemoveObject(toDelete);
                        _screen.Objectives.CompleteObjective("deletetree");
                    }
                }
            }
            break;
            }
            _prevPoint = null;
        }
コード例 #5
0
        public EditorPage()
        {
            InitializeComponent();
            _screen    = App.ChangeScreen <EditorScreen>();
            _prevPoint = null;

            Objectives = _screen.Objectives.Objectives;

            ObjectTypes = new List <string>();
            BuildObjTypeList();

            _gameGrid = new Graphics.Grid(Vector3.Zero, 32);
            _selected = null;
            _offset   = Vector3.Zero;

            DeleteModeCombo.Items.Add(ObjectType.Object);
            DeleteModeCombo.Items.Add(ObjectType.Road);
            DeleteModeCombo.Items.Add(ObjectType.Zone);
            DeleteModeCombo.SelectedIndex = 0;

            var roadMapEntity = _screen.CreateEntity("RoadMap", 0, 0, 1);

            _roadSprite = roadMapEntity.AddComponent <TileSprite>();
            _roadSprite.Load(_screen.Cache, "ms-appx:///Data/Road.map");
            _roadSprite.Origin = TileSprite.OriginLocation.TopLeft;

            AddObjectives();

            _pointerDown = false;

            DataContext = this;
        }
コード例 #6
0
        public void AddMonster(int x, int y, Core.DungeonMap m)
        {
            Core.Entity         e = new Core.Entity(_entityID);
            Core.EntityReturner er;

            //int ind = r.Next(CreatNames.Count);
            int    ind          = Game.Random.Next(CreatNames.Count - 1);
            string creatureName = CreatNames[ind];

            int entType = RogueSharp.DiceNotation.Dice.Roll("1d20");

            if (entType <= 2)
            {
                er = Core.EntityFactory.CreateTroll(x, y, creatureName, m);
            }
            else if (entType > 2 && entType < 6)
            {
                er = Core.EntityFactory.CreateOrc(x, y, creatureName, m);
            }
            else if (entType >= 6 && entType < 12)
            {
                er = Core.EntityFactory.CreateKobold(x, y, creatureName, m);
            }
            else if (entType >= 12 && entType < 15)
            {
                er = Core.EntityFactory.CreateZombie(x, y, creatureName, m);
            }
            else
            {
                er = Core.EntityFactory.CreateRat(x, y, creatureName, m);
            }

            //add entity to entity dict
            Entities.Add(_entityID, er.ComponentList);
            EntityBitLookUp.Add(_entityID, er.LookUpBit);
            JustEntities.Add(_entityID, e);

            //add to PositionLookUp
            AddEntToPosition(x, y, e.UID);

            //try adding to schedule
            Components.Component ts = GetSingleComponentByID(_entityID, Core.ComponentTypes.Schedulable);
            if (ts != null)
            {
                Components.SchedulableComp sc = (Components.SchedulableComp)ts;
                int entTime = sc.Time;
                Game.ShedSystem.Add(e, entTime);
            }

            // inc entityID
            _entityID++;

            //add weapon to entity
            AddWeaponToEntity(e.UID);
            if (RogueSharp.DiceNotation.Dice.Roll("1d10") > 8)
            {
                AddPotionToEntity(e.UID);
            }
        }
コード例 #7
0
ファイル: SchedulingSystem.cs プロジェクト: Grufferz/ECS-Test
        public void Add(Core.Entity schedulable, int speed)
        {
            int key = _time + speed;

            if (!_scheduleables.ContainsKey(key))
            {
                _scheduleables.Add(key, new List <Core.Entity>());
            }
            _scheduleables[key].Add(schedulable);
        }
コード例 #8
0
ファイル: AndFilter.cs プロジェクト: parhelia512/phantom
 public bool Contains(Core.Entity e)
 {
     for (int i = 0; i < filters.Length; i++)
     {
         if (!this.filters[i].Contains(e))
         {
             return(false);
         }
     }
     return(true);
 }
コード例 #9
0
ファイル: Entity.cs プロジェクト: youarebritish/FoxKit
        /// <summary>
        /// Initializes the Entity with data loaded from a DataSet file.
        /// </summary>
        /// <param name="entityData">
        /// The data loaded from a DataSet file.
        /// </param>
        /// <param name="initFunctions">
        /// Helper functions to aid in initialization.
        /// </param>
        public void Initialize(Core.Entity entityData, EntityFactory.EntityInitializeFunctions initFunctions)
        {
            this.Address = entityData.Address;
            this.ReadStaticProperties(entityData.StaticProperties, initFunctions);

            foreach (var unused in entityData.DynamicProperties)
            {
                Debug.LogError($"Attempted to read dynamic property in an entity of type {entityData.ClassName} but dynamic properties are not yet supported. Report this.");
            }

            this.OnPropertiesLoaded();
        }
コード例 #10
0
ファイル: UseSystem.cs プロジェクト: Grufferz/ECS-Test
        public void OnMessage(Core.MessageEventArgs e)
        {
            switch (e.MessageType)
            {
            case Core.EventTypes.Use:
                Core.UseEventArgs args = (Core.UseEventArgs)e;
                // position based?
                if (args.PositionBased)
                {
                    Core.Entity             entityUsing = args.EntityUsing;
                    Components.PositionComp posComp
                        = (Components.PositionComp)_entManager.GetSingleComponentByID(entityUsing.UID, Core.ComponentTypes.Position);
                    int xPos = posComp.X;
                    int yPos = posComp.Y;

                    string posLU = xPos.ToString() + "-" + yPos.ToString();
                    if (_entManager.EntityPostionLookUp.TryGetValue(posLU, out List <Core.Entity> entry))
                    {
                        foreach (Core.Entity li in entry)
                        {
                            int useableLU = (int)Core.ComponentTypes.Useable;
                            int stairsLU  = (int)Core.ComponentTypes.Stairs;
                            int entBit    = _entManager.EntityBitLookUp[li.UID];
                            if ((useableLU & entBit) > 0)
                            {
                                // is it a stair?
                                if ((entBit & stairsLU) > 0)
                                {
                                    // yay!  it's a stair....
                                    Components.StairComp stairComp
                                        = (Components.StairComp)_entManager.GetSingleComponentByID(li.UID, Core.ComponentTypes.Stairs);
                                    if (stairComp.isUp)
                                    {
                                        // go up
                                    }
                                    else
                                    {
                                        //go down
                                    }
                                }
                            }
                        }
                    }
                }
                else
                {
                    // non position based, use inventory
                }
                break;
            }
        }
コード例 #11
0
        /// <summary>
        /// The create.
        /// </summary>
        /// <param name="data">
        /// The data.
        /// </param>
        /// <param name="createFunctions">
        /// The create functions.
        /// </param>
        /// <returns>
        /// The <see cref="Entity"/>.
        /// </returns>
        public static Entity Create(Core.Entity data, string filename, EntityCreateFunctions createFunctions)
        {
            var type = createFunctions.GetEntityType(data.ClassName);

            if (type == null)
            {
                // TODO: Only once for each type
                //ClassGenerator.GenerateClassFromEntity(data, filename);
                return(null);
            }

            var instance = Activator.CreateInstance(type) as Entity;//ScriptableObject.CreateInstance(type) as Entity;

            return(instance);
        }
コード例 #12
0
        private static Core.Entity ConvertEntity(Entity entity, ulong address, uint id, Func <Entity, ulong> getEntityAddress)
        {
            entity.OnPreparingToExport();

            var convertedEntity = new Core.Entity(
                entity.GetType().Name,
                (uint)address,
                id,
                entity.ClassId,
                entity.Version,
                entity.MakeWritableStaticProperties(getEntityAddress, DataSetUtils.MakeEntityLink).ToArray(),
                entity.MakeWritableDynamicProperties(getEntityAddress).ToArray());

            entity.OnFinishedExporting();

            return(convertedEntity);
        }
コード例 #13
0
        public void AddDoor(int x, int y, bool isOpen)
        {
            var e = new Core.Entity(_entityID);

            Core.EntityReturner er = Core.EntityFactory.CreateDoor(x, y, isOpen);

            //add entity to entity dict
            Entities.Add(_entityID, er.ComponentList);
            EntityBitLookUp.Add(_entityID, er.LookUpBit);
            JustEntities.Add(_entityID, e);

            //add to PositionLookUp
            AddEntToPosition(x, y, e.UID);

            // inc entityID
            _entityID++;
        }
コード例 #14
0
        public void AddTreasure(int x, int y)
        {
            var e = new Core.Entity(_entityID);

            // List<Components.Component> compList = new List<Components.Component>();

            Core.EntityReturner er = Core.EntityFactory.CreateGold(x, y, r.Next());

            //add entity to entity dic
            Entities.Add(_entityID, er.ComponentList);
            EntityBitLookUp.Add(_entityID, er.LookUpBit);
            JustEntities.Add(_entityID, e);

            AddEntToPosition(x, y, e.UID);

            // inc entityID
            _entityID++;
        }
コード例 #15
0
        public void AddStairs(int x, int y, bool isUp)
        {
            var e = new Core.Entity(_entityID);

            // List<Components.Component> compList = new List<Components.Component>();

            Core.EntityReturner er = Core.EntityFactory.CreateStairs(x, y, isUp);

            //add entity to entity dict
            Entities.Add(_entityID, er.ComponentList);
            EntityBitLookUp.Add(_entityID, er.LookUpBit);
            JustEntities.Add(_entityID, e);

            //add to PositionLookUp
            AddEntToPosition(x, y, e.UID);

            // inc entityID
            _entityID++;
        }
コード例 #16
0
        public void AddPotionToEntity(int eid)
        {
            Core.Entity         e = new Core.Entity(_entityID);
            Core.EntityReturner er;

            int potionID = e.UID;

            er = Core.EntityFactory.CreateHealthPotion();

            Entities.Add(_entityID, er.ComponentList);
            EntityBitLookUp.Add(_entityID, er.LookUpBit);
            JustEntities.Add(_entityID, e);

            _entityID++;

            // add potion to entity
            Core.InventoryAddEventArgs addEvent = new Core.InventoryAddEventArgs(Core.EventTypes.InventoryAdd, eid, potionID);
            Core.EventBus.Publish(Core.EventTypes.InventoryAdd, addEvent);
        }
コード例 #17
0
ファイル: SchedulingSystem.cs プロジェクト: Grufferz/ECS-Test
        public void Remove(Core.Entity scheduleable)
        {
            KeyValuePair <int, List <Core.Entity> > schedulabelListFound
                = new KeyValuePair <int, List <Core.Entity> >(-1, null);

            foreach (var schedulableList in _scheduleables)
            {
                if (schedulableList.Value.Contains(scheduleable))
                {
                    schedulabelListFound = schedulableList;
                    break;
                }
            }
            if (schedulabelListFound.Value != null)
            {
                schedulabelListFound.Value.Remove(scheduleable);
                if (schedulabelListFound.Value.Count <= 0)
                {
                    _scheduleables.Remove(schedulabelListFound.Key);
                }
            }
        }
コード例 #18
0
ファイル: EntityView.cs プロジェクト: CyberSys/Mugen3D
 public void Init(Core.Entity e)
 {
 }
コード例 #19
0
        public Dictionary <int, List <Components.Component> > LoadEntities()
        {
            Dictionary <int, List <Components.Component> > returnDict
                = new Dictionary <int, List <Components.Component> >();

            string inputJson = System.IO.File.ReadAllText("ents.json");

            Dictionary <int, Dictionary <Core.ComponentTypes, List <Dictionary <string, string> > > > output
                = Newtonsoft.Json.JsonConvert.DeserializeObject <Dictionary <int, Dictionary <Core.ComponentTypes, List <Dictionary <string, string> > > > >(inputJson);

            foreach (KeyValuePair <int, Dictionary <Core.ComponentTypes, List <Dictionary <string, string> > > > entry in output)
            {
                int         eid = entry.Key;
                Core.Entity ent = new Core.Entity(eid);

                List <Components.Component> componentList = new List <Components.Component>();

                Dictionary <Core.ComponentTypes, List <Dictionary <string, string> > > compDict
                    = entry.Value;

                foreach (KeyValuePair <Core.ComponentTypes, List <Dictionary <string, string> > > inner in compDict)
                {
                    if (inner.Key == Core.ComponentTypes.Position)
                    {
                        List <Dictionary <string, string> > comps = inner.Value;
                        foreach (Dictionary <string, string> cDict in comps)
                        {
                            int x = Int32.Parse(cDict["X"]);
                            int y = Int32.Parse(cDict["Y"]);

                            Components.PositionComp pc = new Components.PositionComp(x, y);
                            componentList.Add(pc);
                        }
                    }
                    else if (inner.Key == Core.ComponentTypes.Render)
                    {
                        List <Dictionary <string, string> > comps = inner.Value;
                        foreach (Dictionary <string, string> cDict in comps)
                        {
                            char          glyph = cDict["Glyph"][0];
                            float         r     = float.Parse(cDict["ColorR"]);
                            float         g     = float.Parse(cDict["ColorG"]);
                            float         b     = float.Parse(cDict["ColorB"]);
                            RLNET.RLColor c     = new RLNET.RLColor(r, g, b);

                            Components.RenderComp rc = new Components.RenderComp(glyph, c);
                            componentList.Add(rc);
                        }
                    }
                    //else if (inner.Key == Core.ComponentTypes.Health)
                    //{
                    //    List<Dictionary<string, string>> comps = inner.Value;
                    //    foreach (Dictionary<string, string> cDict in comps)
                    //    {
                    //        int h = Int32.Parse(cDict["Health"]);
                    //        int mh = Int32.Parse(cDict["MaxHealth"]);

                    //        Components.HealthComp msc = new Components.HealthComp();
                    //        msc.Health = h;
                    //        msc.MaxHealth = mh;

                    //        componentList.Add(msc);
                    //    }
                    //}
                    //else if (inner.Key == Core.ComponentTypes.Attributes)
                    //{
                    //    List<Dictionary<string, string>> comps = inner.Value;
                    //    foreach (Dictionary<string, string> cDict in comps)
                    //    {
                    //        int aw = Int32.Parse(cDict["Awareness"]);

                    //        Components.AttributesComp msc = new Components.AttributesComp(aw);

                    //        componentList.Add(msc);
                    //    }
                    //}
                    //else if (inner.Key == Core.ComponentTypes.AI)
                    //{
                    //    List<Dictionary<string, string>> comps = inner.Value;
                    //    foreach (Dictionary<string, string> cDict in comps)
                    //    {
                    //        bool aw = bool.Parse(cDict["HasAI"]);

                    //        Components.AIComp msc = new Components.AIComp();
                    //        msc.HasAI = aw;
                    //        componentList.Add(msc);
                    //    }
                    //}
                }
                returnDict.Add(eid, componentList);
            }
            return(returnDict);
        }
コード例 #20
0
ファイル: MovementSystem.cs プロジェクト: Grufferz/ECS-Test
        public void OnMessage(Core.MessageEventArgs e)
        {
            switch (e.MessageType)
            {
            case Core.EventTypes.ActionReqMove:
                // request movement
                Core.MovementReqEventArgs moveReq = (Core.MovementReqEventArgs)e;
                Core.Entity     entoToMove        = moveReq.EntRequestingMove;
                int             eid       = entoToMove.UID;
                Core.Directions dirToMove = moveReq.Direction;

                Components.PositionComp posComp
                    = (Components.PositionComp)_entityManager.GetSingleComponentByID(eid, Core.ComponentTypes.Position);
                int newX = posComp.X;
                int newY = posComp.Y;
                switch (dirToMove)
                {
                case Core.Directions.None:

                    break;

                case Core.Directions.DownLeft:
                    newX = posComp.X - 1;
                    newY = posComp.Y + 1;
                    break;

                case Core.Directions.Down:
                    newX = posComp.X;
                    newY = posComp.Y + 1;
                    break;

                case Core.Directions.DownRight:
                    newX = posComp.X + 1;
                    newY = posComp.Y + 1;
                    break;

                case Core.Directions.Left:
                    newX = posComp.X - 1;
                    newY = posComp.Y;
                    break;

                case Core.Directions.Centre:

                    break;

                case Core.Directions.Right:
                    newX = posComp.X + 1;
                    newY = posComp.Y;
                    break;

                case Core.Directions.UpLeft:
                    newX = posComp.X - 1;
                    newY = posComp.Y - 1;
                    break;

                case Core.Directions.Up:
                    newX = posComp.X;
                    newY = posComp.Y - 1;
                    break;

                case Core.Directions.UpRight:
                    newX = posComp.X + 1;
                    newY = posComp.Y - 1;
                    break;
                }

                //check for collision

                Core.CollisionEventArgs msg = new Core.CollisionEventArgs(Core.EventTypes.CollisionCheck, entoToMove, newX, newY);
                Core.EventBus.Publish(Core.EventTypes.CollisionCheck, msg);

                break;

            case Core.EventTypes.MoveOK:

                Core.MoveOkayEventArgs m = (Core.MoveOkayEventArgs)e;
                if (_dungeonMap.GetCell(m.newX, m.newY).IsWalkable)
                {
                    // get current pos

                    Core.Entity             ent = m.EntRequestingMove;
                    Components.PositionComp pos
                        = (Components.PositionComp)_entityManager.GetSingleComponentByID(ent.UID, Core.ComponentTypes.Position);
                    Components.AIComp aiComp
                        = (Components.AIComp)_entityManager.GetSingleComponentByID(ent.UID, Core.ComponentTypes.AI);

                    aiComp.TurnsSinceMove = 0;
                    _dungeonMap.SetIsWalkable(pos.X, pos.Y, true);
                    _entityManager.RemoveEntFromPosition(pos.X, pos.Y, ent.UID);
                    pos.X = m.newX;
                    pos.Y = m.newY;
                    _dungeonMap.SetIsWalkable(m.newX, m.newY, false);
                    _entityManager.AddEntToPosition(m.newX, m.newY, ent.UID);
                }
                break;

            case Core.EventTypes.DirectMove:

                Core.DirectMoveEventArgs dm = (Core.DirectMoveEventArgs)e;

                //check for collision

                Core.CollisionEventArgs checkMsg
                    = new Core.CollisionEventArgs(Core.EventTypes.CollisionCheck,
                                                  dm.EntRequestingMove, dm.PointToMoveTo.X, dm.PointToMoveTo.Y);
                Core.EventBus.Publish(Core.EventTypes.CollisionCheck, checkMsg);

                break;

            case Core.EventTypes.NoMove:

                Core.NoMoveEventArgs nmEvent = (Core.NoMoveEventArgs)e;

                Components.AIComp aiC =
                    (Components.AIComp)_entityManager.GetSingleComponentByID(nmEvent.EntNotMoving.UID, Core.ComponentTypes.AI);
                if (aiC != null)
                {
                    aiC.TurnsSinceMove++;
                }

                //Game.MessageLog.Add($"Turns Since = {aiC.TurnsSinceMove.ToString()}");
                break;
            }
        }
コード例 #21
0
ファイル: AllFlagsFilter.cs プロジェクト: parhelia512/phantom
 public bool Contains(Core.Entity e)
 {
     return((e.Flags & this.Mask) == this.Mask);
 }
コード例 #22
0
 public CompoundShape()
 {
     this.shapes  = new List <Container>();
     this.results = new List <CollisionData>();
     this.stub    = new Entity(Vector2.Zero);
 }
コード例 #23
0
ファイル: DelegateFilter.cs プロジェクト: parhelia512/phantom
 public bool Contains(Core.Entity e)
 {
     return(this.Function(e));
 }
コード例 #24
0
ファイル: DistanceFilter.cs プロジェクト: parhelia512/phantom
 public bool Contains(Core.Entity e)
 {
     return(this.func(e));
 }
コード例 #25
0
        private void HandlePointerDown(object sender, PointerRoutedEventArgs e)
        {
            _prevPoint   = e.GetCurrentPoint((UIElement)sender);
            _pointerDown = true;

            switch (ToolMode)
            {
            case EditMode.Object:
                var selected = ObjTypeList.SelectedItem;
                if (selected is string)
                {
                    var pos = _screen.Camera.Owner.Transform.LocalTranslation;
                    pos.Z     = 0;
                    pos.X    += (float)_prevPoint.Position.X;
                    pos.Y    += (float)_prevPoint.Position.Y + 100;  // +100 to offset camera position
                    pos       = _gameGrid.Snap(pos);
                    _selected = _screen.AddObject(selected as string, null, pos.X, pos.Y, 0, null);
                    if (((string)selected).ToLower() == "tree")
                    {
                        _screen.Objectives.CompleteObjective("placetree");
                    }
                }
                break;

            case EditMode.Move:
            {
                var pos = _screen.Camera.Owner.Transform.LocalTranslation;
                pos.X    += (float)_prevPoint.Position.X;
                pos.Y    += (float)_prevPoint.Position.Y + 100;      // +100 to offset camera position
                _selected = ClickDetector.GetClicked(pos.X, pos.Y);
                if (_selected != null)
                {
                    _offset   = _selected.Transform.Translation - pos;
                    _offset.Z = 0;
                }
            }
            break;

            case EditMode.Road:
                StampTile((float)_prevPoint.Position.X, (float)_prevPoint.Position.Y, (int)BrushSizeSlider.Value, 1);
                _screen.Objectives.CompleteObjective("placeroad");
                break;

            case EditMode.Zone:
                StampTile((float)_prevPoint.Position.X, (float)_prevPoint.Position.Y, (int)ZoneBrushSizeSlider.Value, 2, 0);
                _screen.Objectives.CompleteObjective("placezone");
                break;

            case EditMode.Delete:
                if (DeleteMode == ObjectType.Road)
                {
                    if (StampTile((float)_prevPoint.Position.X, (float)_prevPoint.Position.Y, (int)DelBrushSizeSlider.Value, 0, 1) > 0)
                    {
                        _screen.Objectives.CompleteObjective("deleteroads");
                    }
                }
                else if (DeleteMode == ObjectType.Zone)
                {
                    StampTile((float)_prevPoint.Position.X, (float)_prevPoint.Position.Y, (int)DelBrushSizeSlider.Value, 0, 2);
                }
                break;
            }
        }
コード例 #26
0
 public bool Contains(Core.Entity e)
 {
     return(!this.filter.Contains(e));
 }
コード例 #27
0
ファイル: Program.cs プロジェクト: tortuga-foundation/tortuga
        static async Task Main(string[] args)
        {
            //setup sdl input system
            Engine.Instance.AddModule <Input.InputModule>();
            //setup vulkan instance
            Engine.Instance.AddModule <Graphics.GraphicsModule>();
            //setup open al
            //Engine.Instance.AddModule<Audio.AudioModule>();

            //create new scene
            var scene = new Core.Scene();

            Input.InputModule.OnApplicationClose += () => Engine.Instance.IsRunning = false;

            //create a window
            var window = new Graphics.Window(
                "Tortuga",
                0, 0,
                1920, 1080
                );

            //camera
            Graphics.Camera mainCamera;
            {
                var entity = new Core.Entity();
                mainCamera = await entity.AddComponent <Graphics.Camera>();

                //set camera's render target to be the window
                mainCamera.RenderTarget = window;
                scene.AddEntity(entity);
            }

            //mesh
            var mesh = await AssetLoader.LoadObj("Assets/Models/Sphere.obj");

            var material = await AssetLoader.LoadMaterial("Assets/Materials/Bricks.instanced.jsonc");

            for (int i = -3; i < 4; i++)
            {
                for (int j = -3; j < 4; j++)
                {
                    var entity = new Core.Entity();

                    //attach transform
                    var transform = entity.GetComponent <Core.Transform>();
                    transform.Position = new Vector3(i * 5, j * 5, -40);

                    //attach mesh renderer
                    var renderer = await entity.AddComponent <Graphics.MeshRenderer>();

                    //setup mesh
                    renderer.Mesh = mesh;

                    //setup material
                    renderer.Material = material;
                    scene.AddEntity(entity);
                }
            }

            //light
            {
                var entity = new Core.Entity();

                //attach light
                var light = await entity.AddComponent <Graphics.Light>();

                scene.AddEntity(entity);
            }

            // //user interface
            // {
            //     var win = new UI.UiWindow();
            //     win.Position = new Vector2(100, 100);
            //     win.Scale = new Vector2(500, 500);
            //     scene.AddUserInterface(win);
            //     var windowContent = new UI.UiRenderable();
            //     windowContent.RenderFromCamera = mainCamera;
            //     windowContent.PositionXConstraint = new UI.PercentConstraint(0.0f);
            //     windowContent.PositionYConstraint = new UI.PercentConstraint(0.0f);
            //     windowContent.ScaleXConstraint = new UI.PercentConstraint(1.0f);
            //     windowContent.ScaleYConstraint = new UI.PercentConstraint(1.0f);
            //     win.Content.Add(windowContent);
            // }

            //scene.AddSystem<Audio.AudioSystem>();
            scene.AddSystem <Graphics.RenderingSystem>();
            scene.AddSystem <CameraMovement>();

            Engine.Instance.LoadScene(scene);
            await Engine.Instance.Run();
        }