public ActionResult Edit([Bind(Include = "TrainingID,Name,TrainingDate,Location,TrainingEnd,NumberOfMeetings,Duration,ExpireDate,ExpirationDate,QualificationID")] Training training, int[] subsectors)
        {
            if (ModelState.IsValid)
            {
                db.Entry(training).State = EntityState.Modified;
                // training.TrainingSubSectors.Clear();

                var SubSectorToTrainingList = db.TrainingSubSectors.Where(t => t.TrainingID == training.TrainingID).ToList();

                foreach (var train in SubSectorToTrainingList)
                {
                    db.TrainingSubSectors.Remove(train);
                }

                foreach (var id in subsectors)
                {
                    SubSector sub = db.SubSectors.Find(id);
                    training.AddSubSector(sub);
                }
                db.SaveChanges();
                return(RedirectToAction("Index"));
            }
            var sectorlist = (from s in training.TrainingSubSectors
                              select s.SubSector.SectorID).ToArray();

            var subsectorlist = (from s in training.TrainingSubSectors
                                 select s.SubSectorID).ToArray();

            ViewBag.Sectors         = new MultiSelectList(db.Sectors, "SectorID", "SectorType", sectorlist);
            ViewBag.subSectors      = new MultiSelectList(db.SubSectors, "SubSectorID", "SubSectortype", subsectorlist);
            ViewBag.QualificationID = new MultiSelectList(db.Qualification, "QualificationID", "Name");

            return(View(training));
        }
        public IEnumerable <SubSector> GetSubSector(SubSector subSector)
        {
            using (DemsifyEntities dataContext = new DemsifyEntities())
            {
                ObjectParameter totalPageCount = new ObjectParameter("TotalPageCount", typeof(int));
                ObjectParameter totalRecord    = new ObjectParameter("TotalRecord", typeof(int));

                var subSectors = dataContext.SubSectorGet(subSector.SubSectorId, subSector.SectorId, Utility.TrimString(subSector.SearchText), subSector.IsActive, subSector.PageNumber, subSector.PageSize, subSector.IsPagingRequired, Utility.TrimString(subSector.OrderBy), Utility.TrimString(subSector.OrderByDirection), totalPageCount, totalRecord).ToList();

                var subSectorList = new List <SubSector>();
                foreach (var subSectorDetail in subSectors)
                {
                    subSectorList.Add(new SubSector()
                    {
                        SubSectorId    = subSectorDetail.SubSectorId,
                        SectorId       = subSectorDetail.SectorId,
                        Name           = subSectorDetail.Name,
                        IsActive       = subSectorDetail.IsActive,
                        TotalPageCount = Convert.ToInt32(totalPageCount.Value),
                        TotalRecord    = Convert.ToInt32(totalRecord.Value)
                    });
                }
                return(subSectorList);
            }
        }
        public ActionResult GetSelectedSectorCodeField(int SubSectorID)
        {
            FM_Sector model     = new FM_Sector();
            SubSector tblSector = (from e in TOSSDB.SubSectors where e.SubSectorID == SubSectorID select e).FirstOrDefault();

            model.SubsectorCodeID = tblSector.SubSectorCode;
            return(PartialView("SubSector/_DynamicLSectorCode", model));
        }
        //Delete SubSector
        public ActionResult DeleteSubSectors(FM_Sector model, int SubSectorID)
        {
            SubSector tblSubSector = (from e in TOSSDB.SubSectors where e.SubSectorID == SubSectorID select e).FirstOrDefault();

            TOSSDB.SubSectors.Remove(tblSubSector);
            TOSSDB.SaveChanges();
            return(RedirectToAction("Index"));
        }
예제 #5
0
        public ActionResult DeleteConfirmed(Guid id)
        {
            SubSector subSector = db.SubSectors.Find(id);

            db.SubSectors.Remove(subSector);
            db.SaveChanges();
            return(RedirectToAction("Index"));
        }
예제 #6
0
        public IHttpActionResult UpdateSubSector(UpdateSubSectorRequest updateSubSectorRequest)
        {
            var responses = new Responses();

            try
            {
                if (!ModelState.IsValid)
                {
                    return(BadRequest(ModelState));
                }

                if (Utility.UserId < 0)
                {
                    return(BadRequest(Utility.INVALID_USER));
                }

                var subSector = new SubSector()
                {
                    SubSectorId = updateSubSectorRequest.SubSectorId,
                    SectorId    = updateSubSectorRequest.SectorId,
                    Name        = updateSubSectorRequest.Name,
                    ModifiedBy  = Utility.UserId
                };
                int result = iSubSector.UpdateSubSector(subSector);

                switch (result)
                {
                case 1:
                    responses.Status      = Utility.SUCCESS_STATUS_RESPONSE;
                    responses.Description = "SubSector updated successfully.";
                    break;

                case -2:
                    responses.Status      = Utility.ERROR_STATUS_RESPONSE;
                    responses.Description = "SubSector already exists.";
                    break;

                case -3:
                    responses.Status      = Utility.ERROR_STATUS_RESPONSE;
                    responses.Description = "SubSector doesn't exist.";
                    break;

                default:
                    responses.Status      = Utility.ERROR_STATUS_RESPONSE;
                    responses.Description = "Error while updating SubSector.";
                    break;
                }
            }
            catch (Exception ex)
            {
                responses.Status      = Utility.ERROR_STATUS_RESPONSE;
                responses.Description = "Error while updating SubSector.";

                Utility.WriteLog("UpdateSubSector", updateSubSectorRequest, "Error while updating SubSector. (SubSectorAdminController)", ex.ToString());
            }
            return(Ok(responses));
        }
        //Get Update SubSector
        public ActionResult Get_UpdateSubSector(FM_Sector model, int SubSectorID)
        {
            SubSector tblSubSector = (from e in TOSSDB.SubSectors where e.SubSectorID == SubSectorID select e).FirstOrDefault();

            model.getSubSectorcolumns.SubSectorID   = tblSubSector.SubSectorID;
            model.SubSectorNameTempID               = tblSubSector.SectorID;
            model.getSubSectorcolumns.SubSectorName = tblSubSector.SubSectorName;
            model.getSubSectorcolumns.SubSectorCode = tblSubSector.SubSectorCode;
            return(PartialView("SubSector/_UpdateSubSectors", model));
        }
 public ActionResult Edit(SubSector subSector)
 {
     if (ModelState.IsValid)
     {
         db.Entry(subSector).State = EntityState.Modified;
         db.SaveChanges();
         return(RedirectToAction("Index"));
     }
     return(View(subSector));
 }
예제 #9
0
 public ActionResult Edit([Bind(Include = "SubSectorId,SubSectorName,DateEntered,DateModified,CreatedByUserId,ModifiedByUserId")] SubSector subSector)
 {
     if (ModelState.IsValid)
     {
         db.Entry(subSector).State = EntityState.Modified;
         db.SaveChanges();
         return(RedirectToAction("Index"));
     }
     return(View(subSector));
 }
        //Update SubSector
        public ActionResult UpdateSubSector(FM_Sector model)
        {
            SubSector tblSubSector = (from e in TOSSDB.SubSectors where e.SubSectorID == model.getSubSectorcolumns.SubSectorID select e).FirstOrDefault();

            tblSubSector.SectorID      = model.SubSectorNameID;
            tblSubSector.SubSectorName = model.getSubSectorcolumns.SubSectorName;
            tblSubSector.SubSectorCode = model.getSubSectorcolumns.SubSectorCode;
            TOSSDB.Entry(tblSubSector);
            TOSSDB.SaveChanges();
            return(PartialView("SubSector/_UpdateSubSectors", model));
        }
        //Add SubSector
        public JsonResult AddSubSector(FM_Sector model)
        {
            SubSector tblSubSector = new SubSector();

            tblSubSector.SectorID      = model.SubSectorNameID;
            tblSubSector.SubSectorName = model.getSubSectorcolumns.SubSectorName;
            tblSubSector.SubSectorCode = model.getSubSectorcolumns.SubSectorCode;
            TOSSDB.SubSectors.Add(tblSubSector);
            TOSSDB.SaveChanges();
            return(Json(tblSubSector));
        }
        public ActionResult Create(SubSector subSector)
        {
            if (ModelState.IsValid)
            {
                db.SubSectors.Add(subSector);
                db.SaveChanges();
                return(RedirectToAction("Index"));
            }

            return(View(subSector));
        }
예제 #13
0
        public FM_Sector()
        {
            getSector        = new List <Sector>();
            getSectorcolumns = new Sector();
            getSectorList    = new List <SectorList>();


            getSubSector        = new List <SubSector>();
            getSubSectorcolumns = new SubSector();
            getSubSectorList    = new List <SubSectorList>();
        }
        public int DeleteSubSector(SubSector subSector)
        {
            using (DemsifyEntities dataContext = new DemsifyEntities())
            {
                ObjectParameter result = new ObjectParameter("Result", typeof(int));

                dataContext.SubSectorDelete(subSector.SubSectorId, subSector.ModifiedBy, result);

                return(Convert.ToInt32(result.Value));
            }
        }
        public int AddSubSector(SubSector subSector)
        {
            using (DemsifyEntities dataContext = new DemsifyEntities())
            {
                ObjectParameter result = new ObjectParameter("Result", typeof(int));

                dataContext.SubSectorAdd(subSector.SectorId, Utility.TrimString(subSector.Name), subSector.CreatedBy, result);

                return(Convert.ToInt32(result.Value));
            }
        }
예제 #16
0
        public ActionResult Create([Bind(Include = "SubSectorId,SubSectorName,DateEntered,DateModified,CreatedByUserId,ModifiedByUserId")] SubSector subSector)
        {
            if (ModelState.IsValid)
            {
                subSector.SubSectorId = Guid.NewGuid();
                db.SubSectors.Add(subSector);
                db.SaveChanges();
                return(RedirectToAction("Index"));
            }

            return(View(subSector));
        }
예제 #17
0
        // GET: SubSectors/Delete/5
        public ActionResult Delete(Guid?id)
        {
            if (id == null)
            {
                return(new HttpStatusCodeResult(HttpStatusCode.BadRequest));
            }
            SubSector subSector = db.SubSectors.Find(id);

            if (subSector == null)
            {
                return(HttpNotFound());
            }
            return(View(subSector));
        }
        // GET: subSector/Delete/5
        public ActionResult Delete(int?id)
        {
            if (id == null)
            {
                return(new HttpStatusCodeResult(HttpStatusCode.BadRequest));
            }
            SubSector subSector = db.SubSectors.Find(id);

            if (subSector == null)
            {
                return(HttpNotFound());
            }
            ViewBag.SectorID = new MultiSelectList(db.Sectors, "SectorID", "SectorType");
            return(View(subSector));
        }
예제 #19
0
        public static SubSector Generate(SubsectorDensity density = SubsectorDensity.Standard)
        {
            SubSector output = new SubSector();

            for (int i = 0; i < 8; i++)
            {
                for (int j = 0; j < 10; j++)
                {
                    if (IsSystemPresent(density))
                    {
                        var stellarSystem = StellarSystemGenerator.Generate(i, j);
                    }
                }
            }

            return(output);
        }
예제 #20
0
        public async Task <SubSector> SaveSubSector([FromBody] SubSector PostedSubSector)
        {
            if (!ModelState.IsValid)
            {
                throw new ApiException("Model binding failed.", 500);
            }
            if (!_SubSectorRepo.Validate(PostedSubSector))
            {
                //throw new ApiException(_SubSectorRepo.ErrorMessage, 500, _SubSectorRepo.ValidationErrors);

                if (!await _SubSectorRepo.SaveAsync(PostedSubSector))
                {
                    throw new ApiException(_SubSectorRepo.ErrorMessage);
                }
            }
            return(PostedSubSector);
        }
예제 #21
0
        public JsonResult Create(UISubSector uISubSector)
        {
            try
            {
                using (var repository = new Repository <SubSector>())
                {
                    if (uISubSector.Id != 0)
                    {
                        var subSector = repository.Filter(q => q.Id == uISubSector.Id).FirstOrDefault();
                        if (subSector != null && !string.IsNullOrEmpty(subSector.SubSectorName))
                        {
                            subSector.SubSectorName = uISubSector.SubSectorName;
                            subSector.SectorId      = uISubSector.SectorId;
                            subSector.UpdateDate    = DateTime.Now;
                            repository.Update(subSector);
                        }
                    }
                    else
                    {
                        var count     = repository.All().Max(q => q.Id);
                        var subSector = new SubSector()
                        {
                            Id            = ++count,
                            SubSectorName = uISubSector.SubSectorName,
                            SectorId      = uISubSector.SectorId,
                            CreateDate    = DateTime.Now,
                            Sectors       = repository.AssessmentContext.sectors.FirstOrDefault(q => q.Id == uISubSector.SectorId)
                        };
                        repository.Create(subSector);
                    }
                    repository.SaveChanges();
                }

                // TODO: Add insert logic here

                // return RedirectToAction("Index");
            }
            catch (Exception ex)
            {
                UserException.LogException(ex);
                return(Json(Utilities.Failiure, JsonRequestBehavior.AllowGet));
            }
            return(Json(Utilities.Success, JsonRequestBehavior.AllowGet));
        }
예제 #22
0
        public IHttpActionResult AddSubSector(AddSubSectorRequest addSubSectorRequest)
        {
            var responses = new Responses();

            try
            {
                if (!ModelState.IsValid)
                {
                    return(BadRequest(ModelState));
                }

                var subSector = new SubSector()
                {
                    SectorId  = addSubSectorRequest.SectorId,
                    Name      = addSubSectorRequest.Name,
                    CreatedBy = Utility.UserId
                };
                int result = iSubSector.AddSubSector(subSector);
                if (result > 0)
                {
                    responses.Status      = Utility.SUCCESS_STATUS_RESPONSE;
                    responses.Description = "SubSector added successfully.";
                }
                else if (result == -2)
                {
                    responses.Status      = Utility.ERROR_STATUS_RESPONSE;
                    responses.Description = "SubSector alread exists.";
                }
                else
                {
                    responses.Status      = Utility.ERROR_STATUS_RESPONSE;
                    responses.Description = "Error while adding SubSector.";
                }
            }
            catch (Exception ex)
            {
                responses.Status      = Utility.ERROR_STATUS_RESPONSE;
                responses.Description = "Error while adding SubSector.";

                Utility.WriteLog("AddSubSector", addSubSectorRequest, "Error while adding SubSector. (SubSectorAdminController)", ex.ToString());
            }
            return(Ok(responses));
        }
예제 #23
0
        public ActionResult Create([Bind(Include = "TrainingID,Name,TrainingDate,Location,TrainingEnd,NumberOfMeetings,Duration,ExpireDate,ExpirationDate,QualificationID")] Training training, int[] subsectors)
        {
            if (ModelState.IsValid)
            {
                foreach (var id in subsectors)
                {
                    SubSector subsector = db.SubSectors.Find(id);
                    training.AddSubSector(subsector);
                }

                db.Trainings.Add(training);
                db.SaveChanges();
                return(RedirectToAction("Index"));
            }


            ViewBag.Sectors         = new MultiSelectList(db.Sectors, "SectorID", "SectorType");
            ViewBag.subSectors      = new MultiSelectList(db.SubSectors, "SubSectorID", "SubSectortype");
            ViewBag.QualificationID = new SelectList(db.Qualification, "QualificationID", "Name");
            return(View(training));
        }
        public IHttpActionResult GetSubSector([FromUri] GetSubSectorRequest getSubSectorRequest)
        {
            var responses = new Responses();

            try
            {
                if (Utility.UserId < 0)
                {
                    return(BadRequest(Utility.INVALID_USER));
                }

                if (getSubSectorRequest == null)
                {
                    getSubSectorRequest = new GetSubSectorRequest();
                }

                if (getSubSectorRequest.PageSize == null)
                {
                    getSubSectorRequest.PageSize = Convert.ToInt32(ConfigurationManager.AppSettings["PageSize"]);
                }

                var subSector = new SubSector()
                {
                    SubSectorId      = getSubSectorRequest.SubSectorId,
                    SectorId         = getSubSectorRequest.SectorId,
                    SearchText       = getSubSectorRequest.SearchText,
                    IsActive         = getSubSectorRequest.IsActive,
                    PageNumber       = getSubSectorRequest.PageNumber,
                    PageSize         = Convert.ToInt32(getSubSectorRequest.PageSize),
                    IsPagingRequired = (getSubSectorRequest.PageNumber != null) ? true : false,
                    OrderBy          = getSubSectorRequest.OrderBy,
                    OrderByDirection = getSubSectorRequest.OrderByDirection
                };
                var subSectors = iSubSector.GetSubSector(subSector);

                var subSectorList = new List <GetSubSectorResponse>();
                foreach (var subSectorDetail in subSectors)
                {
                    subSectorList.Add(new GetSubSectorResponse()
                    {
                        SubSectorId    = Convert.ToInt32(subSectorDetail.SubSectorId),
                        SectorId       = subSectorDetail.SectorId,
                        Name           = subSectorDetail.Name,
                        IsActive       = Convert.ToBoolean(subSectorDetail.IsActive),
                        CreatedBy      = subSectorDetail.CreatedBy,
                        TotalPageCount = subSectorDetail.TotalPageCount,
                        TotalRecord    = subSectorDetail.TotalRecord
                    });
                }

                responses.Status      = Utility.SUCCESS_STATUS_RESPONSE;
                responses.Description = "SubSector retrieved successfully";
                responses.Response    = subSectorList.OrderBy(x => x.Name).ToList();
            }
            catch (Exception ex)
            {
                responses.Status      = Utility.ERROR_STATUS_RESPONSE;
                responses.Description = "Error while retrieving SubSector.";

                Utility.WriteLog("GetSubSector", getSubSectorRequest, "Error while retrieving SubSector. (SectorUserController)", ex.ToString());
            }
            return(Ok(responses));
        }
    private void LoadWAD(string WADPath, string LevelName)
    {
        byte[] buffer;
        int    i;

        GD.Print($"Opening {WADPath}...");

        File file = new File();

        file.Open(WADPath, File.ModeFlags.Read);
        if (file.Open(WADPath, File.ModeFlags.Read) != Godot.Error.Ok)
        {
            GD.Print($"Failed to open WAD file {WADPath}");
            return;
        }

        if (printDebugInfo)
        {
            GD.Print("READING HEADER...");
        }

        Header header = new Header();

        header.Type      = Decode32AsString(file);
        header.LumpNum   = file.Get32();
        header.DirOffset = file.Get32();

        GD.Print($"{this.WADPath} is {header.Type}");

        if (printDebugInfo)
        {
            GD.Print("READING LUMPS");
        }

        Lump lumpMapname    = new Lump();
        Lump lumpThings     = new Lump();
        Lump lumpLinedefs   = new Lump();
        Lump lumpSidedefs   = new Lump();
        Lump lumpVertexes   = new Lump();
        Lump lumpSegs       = new Lump();
        Lump lumpSubsectors = new Lump();
        Lump lumpNodes      = new Lump();
        Lump lumpSectors    = new Lump();
        Lump lumpReject     = new Lump();
        Lump lumpBlockmap   = new Lump();

        bool first      = true;
        bool breakAfter = false;

        file.Seek(header.DirOffset);
        for (int j = 0; j < header.LumpNum; j++)
        {
            Lump lump = ReadLump(file);
            if (first)
            {
                lumpMapname = lump;
                first       = false;
            }

            switch (lump.Name)
            {
            case "THINGS":
                lumpThings = lump;
                break;

            case "LINEDEFS":
                lumpLinedefs = lump;
                break;

            case "SIDEDEFS":
                lumpSidedefs = lump;
                break;

            case "VERTEXES":
                lumpVertexes = lump;
                break;

            case "SEGS":
                lumpSegs = lump;
                break;

            case "SSECTORS":
                lumpSubsectors = lump;
                break;

            case "NODES":
                lumpNodes = lump;
                break;

            case "SECTORS":
                lumpSectors = lump;
                break;

            case "REJECT":
                lumpReject = lump;
                break;

            case "BLOCKMAP":
                lumpBlockmap = lump;
                if (breakAfter)
                {
                    break;
                }

                break;

            default:
                if (lump.Name == levelName)
                {
                    breakAfter = true;
                }

                break;
            }
        }

        if (printDebugInfo)
        {
            GD.Print($"Internal map name: {lumpMapname.Name}");
        }

        if (printDebugInfo)
        {
            GD.Print($"READING THINGS...");
        }

        file.Seek(lumpThings.Offset);

        buffer = file.GetBuffer((int)lumpThings.Size);
        Thing[] things = new Thing[lumpThings.Size];
        i = 0;
        while (i < buffer.Length)
        {
            Thing thing = new Thing();
            thing.X       = ToShort(buffer[i], buffer[i + 1]);
            thing.Y       = ToShort(buffer[i + 2], buffer[i + 3]);
            thing.Angle   = ToShort(buffer[i + 4], buffer[i + 5]);
            thing.Type    = ToShort(buffer[i + 6], buffer[i + 7]);
            thing.Options = ToShort(buffer[i + 8], buffer[i + 9]);
            things.Append(thing);
            i += 10;
        }

        if (printDebugInfo)
        {
            GD.Print("READING LINEDEFS...");
        }

        file.Seek(lumpLinedefs.Offset);
        buffer = file.GetBuffer((int)lumpLinedefs.Size);
        Linedef[] linedefs = new Linedef[lumpLinedefs.Size];
        i = 0;
        int k = 0;

        while (i < buffer.Length)
        {
            Linedef linedef = new Linedef();
            linedef.StartVertex  = ToShort(buffer[i], buffer[i + 1]);
            linedef.EndVertex    = ToShort(buffer[i + 2], buffer[i + 3]);
            linedef.Flags        = ToShort(buffer[i + 4], buffer[i + 5]);
            linedef.Type         = ToShort(buffer[i + 6], buffer[i + 7]);
            linedef.Trigger      = ToShort(buffer[i + 8], buffer[i + 9]);
            linedef.RightSidedef = ToShort(buffer[i + 10], buffer[i + 11]);
            linedef.LeftSidedef  = ToShort(buffer[i + 12], buffer[i + 13]);
            //linedefs.Append(linedef);
            linedefs[k++] = linedef;
            i            += 14;
        }

        if (printDebugInfo)
        {
            GD.Print("READING SIDEDEFS...");
        }

        file.Seek(lumpSidedefs.Offset);
        buffer = file.GetBuffer((int)lumpSidedefs.Size);
        Sidedef[] sieddefs = new Sidedef[lumpSidedefs.Size];
        i = 0;
        while (i < buffer.Length)
        {
            Sidedef sidedef = new Sidedef();
            sidedef.XOffset      = ToShort(buffer[i], buffer[i + 1]);
            sidedef.YOffset      = ToShort(buffer[i + 2], buffer[i + 3]);
            sidedef.UpperTexture = Combine8BytesToString(buffer[i + 4], buffer[i + 5], buffer[i + 6], buffer[i + 7],
                                                         buffer[i + 8], buffer[i + 9], buffer[i + 10], buffer[i + 11]);
            sidedef.LowerTexture = Combine8BytesToString(buffer[i + 12], buffer[i + 13], buffer[i + 14], buffer[i + 15],
                                                         buffer[i + 16], buffer[i + 17], buffer[i + 18], buffer[i + 19]);
            sidedef.MiddleTexture = Combine8BytesToString(buffer[i + 20], buffer[i + 21], buffer[i + 22],
                                                          buffer[i + 23], buffer[i + 24], buffer[i + 25], buffer[i + 26], buffer[i + 27]);
            sidedef.Sector = ToShort(buffer[i + 28], buffer[i + 29]);
            sieddefs.Append(sidedef);
            i += 30;
        }

        if (printDebugInfo)
        {
            GD.Print("READING VERTEXES...");
        }

        file.Seek(lumpVertexes.Offset);
        buffer = buffer = file.GetBuffer((int)lumpVertexes.Size);
        Vertex[] vertexes = new Vertex[lumpVertexes.Size];
        i = 0;
        k = 0;
        while (i < buffer.Length)
        {
            float  x      = ToShort(buffer[i], buffer[i + 1]) * scale;
            float  y      = ToShort(buffer[i + 2], buffer[i + 3]) * scale;
            Vertex vertex = new Vertex();
            vertex.X    = x;
            vertex.Y    = y;
            vertexes[k] = vertex;
            k          += 1;
            i          += 4;
        }

        if (printDebugInfo)
        {
            GD.Print("READING SUB-SECTORS...");
        }

        file.Seek(lumpSubsectors.Offset);
        buffer = buffer = file.GetBuffer((int)lumpSubsectors.Size);
        SubSector[] subSectors = new SubSector[lumpSubsectors.Size];
        i = 0;
        while (i < buffer.Length)
        {
            SubSector subSector = new SubSector();
            subSector.SegCount = ToShort(buffer[i], buffer[i + 1]);
            subSector.SegNum   = ToShort(buffer[i + 2], buffer[i + 3]);
            subSectors.Append(subSector);
            i += 4;
        }

        if (printDebugInfo)
        {
            GD.Print("READING NODES...");
        }

        file.Seek(lumpNodes.Offset);
        buffer = buffer = file.GetBuffer((int)lumpNodes.Size);
        Node[] nodes = new Node[lumpNodes.Size];
        i = 0;
        while (i < buffer.Length)
        {
            Node node = new Node();
            node.X           = ToShort(buffer[i], buffer[i + 1]);
            node.Y           = ToShort(buffer[i + 2], buffer[i + 3]);
            node.DX          = ToShort(buffer[i + 4], buffer[i + 5]);
            node.DY          = ToShort(buffer[i + 6], buffer[i + 7]);
            node.YUpperRight = ToShort(buffer[i + 8], buffer[i + 9]);
            node.YLowerRight = ToShort(buffer[i + 10], buffer[i + 11]);
            node.XLowerRight = ToShort(buffer[i + 12], buffer[i + 13]);
            node.XUpperRight = ToShort(buffer[i + 14], buffer[i + 15]);
            node.YUpperLeft  = ToShort(buffer[i + 16], buffer[i + 17]);
            node.YLowerLeft  = ToShort(buffer[i + 18], buffer[i + 19]);
            node.XLowerLeft  = ToShort(buffer[i + 20], buffer[i + 20]);
            node.XUpperLeft  = ToShort(buffer[i + 22], buffer[i + 23]);
            node.NodeRight   = ToShort(buffer[i + 24], buffer[i + 25]);
            node.NodeLeft    = ToShort(buffer[i + 26], buffer[i + 27]);
            i += 28;
        }

        if (printDebugInfo)
        {
            GD.Print("READING SECTORS...");
        }

        file.Seek(lumpSectors.Offset);
        buffer = buffer = file.GetBuffer((int)lumpSectors.Size);
        Sector[] sectors = new Sector[lumpSectors.Size];
        i = 0;
        while (i < buffer.Length)
        {
            Sector sector = new Sector();
            sector.FloorHeight  = ToShort(buffer[i], buffer[i + 1]);
            sector.FloorHeight  = ToShort(buffer[i + 1], buffer[i + 3]);
            sector.FloorTexture = Combine8BytesToString(buffer[i + 4], buffer[i + 5], buffer[i + 6], buffer[i + 7],
                                                        buffer[i + 8], buffer[i + 9], buffer[i + 10], buffer[i + 11]);
            sector.CeilTexture = Combine8BytesToString(buffer[i + 12], buffer[i + 13], buffer[i + 14], buffer[i + 15],
                                                       buffer[i + 16], buffer[i + 17], buffer[i + 18], buffer[i + 19]);
            sector.LightLevel = ToShort(buffer[i + 20], buffer[i + 21]);
            sector.Special    = ToShort(buffer[i + 22], buffer[i + 23]);
            sector.Tag        = ToShort(buffer[i + 24], buffer[i + 25]);
            sectors.Append(sector);
            i += 26;
        }

        file.Close();

        if (printDebugInfo)
        {
            GD.Print("BUILDING GEOMETRY");
        }

        foreach (var ld in linedefs)
        {
            if (ld == null)
            {
                continue;
            }

            Vertex            vertex1  = vertexes[ld.StartVertex];
            Vertex            vertex2  = vertexes[ld.EndVertex];
            ImmediateGeometry geometry = new ImmediateGeometry();
            geometry.MaterialOverride = _surfaceMaterial;
            geometry.Begin(Mesh.PrimitiveType.Lines);
            if (ld.Type != 0)
            {
                geometry.SetColor(new Color(1, 1, 0));
            }
            else
            {
                geometry.SetColor(new Color(1, 0, 0));
            }

            geometry.AddVertex(new Vector3(vertex1.X, 0, vertex1.Y));
            geometry.AddVertex(new Vector3(vertex2.X, 0, vertex2.Y));
            geometry.End();
            AddChild(geometry);
        }
    }
예제 #26
0
        async Task Game()
        {
            Lump[] lumps;

            try
            {
                using (var iwad = File.Open(@"E:\Steam\steamapps\common\DOOM 3 BFG Edition\base\wads\DOOM2.WAD", FileMode.Open, FileAccess.Read, FileShare.Read))
                {
                    byte[] rec = new byte[16];
                    await iwad.ReadAsync(rec, 0, 12);

                    int num = BitConverter.ToInt32(rec, 4);
                    int ofs = BitConverter.ToInt32(rec, 8);
                    iwad.Seek((long)ofs, SeekOrigin.Begin);

                    // Read the lump table:
                    byte[] dir = new byte[16 * num];
                    await iwad.ReadAsync(dir, 0, 16 *num);

                    lumps = new Lump[num];
                    for (int i = 0; i < num; ++i)
                    {
                        // Read the lump data from the table:
                        int    position = BitConverter.ToInt32(dir, i * 16 + 0);
                        int    size     = BitConverter.ToInt32(dir, i * 16 + 4);
                        string name     = Encoding.ASCII.GetString(dir, i * 16 + 8, 8).TrimEnd(new char[] { '\0' });

                        byte[] data;
                        if (size > 0)
                        {
                            data = new byte[size];

                            iwad.Seek((long)position, SeekOrigin.Begin);
                            await iwad.ReadAsync(data, 0, size);
                        }
                        else
                        {
                            data = null;
                        }

                        // Record the lump and its data:
                        lumps[i] = new Lump(name, position, size, data);
                    }
                }

                int ml = FindLump(lumps, mapLumpName);

                // Find center of map:
                var minPos = new Vertex(Int16.MaxValue, Int16.MaxValue);
                var maxPos = new Vertex(Int16.MinValue, Int16.MinValue);

                // Read vertexes:
                var vertexesLump = lumps[ml + (int)MapLump.VERTEXES];
                int numVertexes  = vertexesLump.Size / (2 + 2);
                vertexes = new Vertex[numVertexes];
                for (int i = 0; i < numVertexes; ++i)
                {
                    short x = BitConverter.ToInt16(vertexesLump.Data, i * 2 * sizeof(Int16));
                    short y = BitConverter.ToInt16(vertexesLump.Data, i * 2 * sizeof(Int16) + sizeof(Int16));

                    if (x < minPos.X)
                    {
                        minPos = new Vertex(x, minPos.Y);
                    }
                    if (y < minPos.Y)
                    {
                        minPos = new Vertex(minPos.X, y);
                    }
                    if (x > maxPos.X)
                    {
                        maxPos = new Vertex(x, maxPos.Y);
                    }
                    if (y > maxPos.Y)
                    {
                        maxPos = new Vertex(maxPos.X, y);
                    }

                    vertexes[i] = new Vertex(x, y);
                }

                // Calculate center:
                int mapw   = (maxPos.X - minPos.X);
                int maph   = (maxPos.Y - minPos.Y);
                var center = new Vertex(mapw / 2 + minPos.X, maph / 2 + minPos.Y);
                MapCoordToVector3(new Vertex3(center, 64), out centerPos);

                cameraDistance = Math.Max(mapw, maph) / scale;
                cameraHeight   = cameraDistance * 0.8f;

                // Read sectors:
                var sectorsLump = lumps[ml + (int)MapLump.SECTORS];

                const int sectorSize = (sizeof(short) * 5) + (8 * 2);
                int       numSectors = sectorsLump.Size / sectorSize;

                sectors = new Sector[numSectors];
                for (int i = 0; i < numSectors; ++i)
                {
                    short  floorheight   = BitConverter.ToInt16(sectorsLump.Data, (i * sectorSize) + (sizeof(short) * 0));
                    short  ceilingheight = BitConverter.ToInt16(sectorsLump.Data, (i * sectorSize) + (sizeof(short) * 1));
                    string floorpic      = Encoding.ASCII.GetString(sectorsLump.Data, (i * sectorSize) + 0 + (sizeof(short) * 2), 8).ASCIIZ();
                    string ceilingpic    = Encoding.ASCII.GetString(sectorsLump.Data, (i * sectorSize) + 8 + (sizeof(short) * 2), 8).ASCIIZ();
                    short  lightlevel    = BitConverter.ToInt16(sectorsLump.Data, (i * sectorSize) + 16 + (sizeof(short) * 2));
                    short  special       = BitConverter.ToInt16(sectorsLump.Data, (i * sectorSize) + 16 + (sizeof(short) * 3));
                    short  tag           = BitConverter.ToInt16(sectorsLump.Data, (i * sectorSize) + 16 + (sizeof(short) * 4));

                    sectors[i] = new Sector(floorheight, ceilingheight, floorpic, ceilingpic, lightlevel, special, tag);
                }

                // Read sidedefs:
                var sidedefsLump = lumps[ml + (int)MapLump.SIDEDEFS];

                const int sidedefSize = (sizeof(short) * 3) + (8 * 3);
                int       numSidedefs = sidedefsLump.Size / sidedefSize;

                sidedefs = new SideDef[numSidedefs];
                for (int i = 0; i < numSidedefs; ++i)
                {
                    short  textureoffset = BitConverter.ToInt16(sidedefsLump.Data, (i * sidedefSize) + (sizeof(short) * 0));
                    short  rowoffset     = BitConverter.ToInt16(sidedefsLump.Data, (i * sidedefSize) + (sizeof(short) * 1));
                    string toptexture    = Encoding.ASCII.GetString(sidedefsLump.Data, (i * sidedefSize) + 0 + (sizeof(short) * 2), 8).ASCIIZ();
                    string bottomtexture = Encoding.ASCII.GetString(sidedefsLump.Data, (i * sidedefSize) + 8 + (sizeof(short) * 2), 8).ASCIIZ();
                    string midtexture    = Encoding.ASCII.GetString(sidedefsLump.Data, (i * sidedefSize) + 16 + (sizeof(short) * 2), 8).ASCIIZ();
                    // Front sector, towards viewer.
                    short sector = BitConverter.ToInt16(sidedefsLump.Data, (i * sidedefSize) + 24 + (sizeof(short) * 2));

                    sidedefs[i] = new SideDef(textureoffset, rowoffset, toptexture, bottomtexture, midtexture, sectors[sector]);
                }

                // Read linedefs:
                var linedefsLump = lumps[ml + (int)MapLump.LINEDEFS];

                const int linedefSize = sizeof(short) * 7;
                int       numLineDefs = linedefsLump.Size / linedefSize;

                linedefs = new LineDef[numLineDefs];

                var verts = new ListSet <Vertex3>(numVertexes * 4);
                var quads = new List <Quad>(numLineDefs * 3);
                for (int i = 0; i < numLineDefs; ++i)
                {
                    short v1       = BitConverter.ToInt16(linedefsLump.Data, (i * linedefSize) + (sizeof(short) * 0));
                    short v2       = BitConverter.ToInt16(linedefsLump.Data, (i * linedefSize) + (sizeof(short) * 1));
                    short flags    = BitConverter.ToInt16(linedefsLump.Data, (i * linedefSize) + (sizeof(short) * 2));
                    short special  = BitConverter.ToInt16(linedefsLump.Data, (i * linedefSize) + (sizeof(short) * 3));
                    short tag      = BitConverter.ToInt16(linedefsLump.Data, (i * linedefSize) + (sizeof(short) * 4));
                    short sidenum0 = BitConverter.ToInt16(linedefsLump.Data, (i * linedefSize) + (sizeof(short) * 5));
                    short sidenum1 = BitConverter.ToInt16(linedefsLump.Data, (i * linedefSize) + (sizeof(short) * 6));

                    // Look up SideDefs:
                    SideDef side0, side1;
                    if (sidenum0 >= 0)
                    {
                        side0 = sidedefs[sidenum0];

                        if (sidenum1 < 0)
                        {
                            // One-sided:
                            side1 = null;

                            quads.Add(new Quad(
                                          verts.AddReturnIndex(new Vertex3(vertexes[v1], side0.Sector.Floorheight)),
                                          verts.AddReturnIndex(new Vertex3(vertexes[v1], side0.Sector.Ceilingheight)),
                                          verts.AddReturnIndex(new Vertex3(vertexes[v2], side0.Sector.Ceilingheight)),
                                          verts.AddReturnIndex(new Vertex3(vertexes[v2], side0.Sector.Floorheight))
                                          ));
                        }
                        else
                        {
                            // Two-sided:
                            side1 = sidedefs[sidenum1];

                            if (side1.Sector.Floorheight < side0.Sector.Floorheight)
                            {
                                quads.Add(new Quad(
                                              verts.AddReturnIndex(new Vertex3(vertexes[v1], side0.Sector.Floorheight)),
                                              verts.AddReturnIndex(new Vertex3(vertexes[v1], side1.Sector.Floorheight)),
                                              verts.AddReturnIndex(new Vertex3(vertexes[v2], side1.Sector.Floorheight)),
                                              verts.AddReturnIndex(new Vertex3(vertexes[v2], side0.Sector.Floorheight))
                                              ));
                            }
                            else if (side1.Sector.Floorheight >= side0.Sector.Floorheight)
                            {
                                quads.Add(new Quad(
                                              verts.AddReturnIndex(new Vertex3(vertexes[v1], side0.Sector.Floorheight)),
                                              verts.AddReturnIndex(new Vertex3(vertexes[v1], side1.Sector.Floorheight)),
                                              verts.AddReturnIndex(new Vertex3(vertexes[v2], side1.Sector.Floorheight)),
                                              verts.AddReturnIndex(new Vertex3(vertexes[v2], side0.Sector.Floorheight))
                                              ));
                            }

                            if (side1.Sector.Ceilingheight < side0.Sector.Ceilingheight)
                            {
                                quads.Add(new Quad(
                                              verts.AddReturnIndex(new Vertex3(vertexes[v1], side1.Sector.Ceilingheight)),
                                              verts.AddReturnIndex(new Vertex3(vertexes[v1], side0.Sector.Ceilingheight)),
                                              verts.AddReturnIndex(new Vertex3(vertexes[v2], side0.Sector.Ceilingheight)),
                                              verts.AddReturnIndex(new Vertex3(vertexes[v2], side1.Sector.Ceilingheight))
                                              ));
                            }
                            else if (side1.Sector.Ceilingheight >= side0.Sector.Ceilingheight)
                            {
                                quads.Add(new Quad(
                                              verts.AddReturnIndex(new Vertex3(vertexes[v1], side0.Sector.Ceilingheight)),
                                              verts.AddReturnIndex(new Vertex3(vertexes[v1], side1.Sector.Ceilingheight)),
                                              verts.AddReturnIndex(new Vertex3(vertexes[v2], side1.Sector.Ceilingheight)),
                                              verts.AddReturnIndex(new Vertex3(vertexes[v2], side0.Sector.Ceilingheight))
                                              ));
                            }
                        }
                    }
                    else
                    {
                        throw new Exception("FAIL");
                    }

                    linedefs[i] = new LineDef(v1, v2, flags, special, tag, side0, side1);
                }

                quadIndices = quads.ToArray();


                // Read segs:
                const int segSize = sizeof(short) * 6;

                var segsLump = lumps[ml + (int)MapLump.SEGS];
                int numSegs  = segsLump.Size / segSize;

                segs = new LineSeg[numSegs];
                for (int i = 0; i < numSegs; ++i)
                {
                    short v1      = BitConverter.ToInt16(segsLump.Data, (i * segSize) + (sizeof(short) * 0));
                    short v2      = BitConverter.ToInt16(segsLump.Data, (i * segSize) + (sizeof(short) * 1));
                    short angle   = BitConverter.ToInt16(segsLump.Data, (i * segSize) + (sizeof(short) * 2));
                    short linedef = BitConverter.ToInt16(segsLump.Data, (i * segSize) + (sizeof(short) * 3));
                    short side    = BitConverter.ToInt16(segsLump.Data, (i * segSize) + (sizeof(short) * 4));
                    short offset  = BitConverter.ToInt16(segsLump.Data, (i * segSize) + (sizeof(short) * 5));

                    var ldef = linedefs[linedef];
                    var sdef = ldef.Side0;
                    if (side != 0)
                    {
                        sdef = ldef.Side1;
                    }

                    segs[i] = new LineSeg(v1, v2, angle, ldef, sdef, offset);
                }

                // Read subsectors:
                const int subsectorSize = sizeof(short) * 2;

                var subsectorsLump = lumps[ml + (int)MapLump.SSECTORS];
                var numSubsectors  = subsectorsLump.Size / subsectorSize;

                subsectors = new SubSector[numSubsectors];
                for (int i = 0; i < numSubsectors; ++i)
                {
                    short numsegs  = BitConverter.ToInt16(subsectorsLump.Data, (i * subsectorSize) + (sizeof(short) * 0));
                    short firstseg = BitConverter.ToInt16(subsectorsLump.Data, (i * subsectorSize) + (sizeof(short) * 1));

                    // Pull out all the LineSegs for this subsector:
                    var mysegs = new LineSeg[numsegs];
                    Array.Copy(segs, firstseg, mysegs, 0, numsegs);
                    subsectors[i] = new SubSector(mysegs);

                    // Assert that all line segs in this subsector are in the same sector:
                    var sector = subsectors[i].Segs[0].Side.Sector;
                    Debug.Assert(subsectors[i].Segs.All(s => s.Side.Sector == sector));
                }


                // Build floor + ceil polygons from subsectors:
                var fPolys = new List <Polygon>(numSubsectors);
                var cPolys = new List <Polygon>(numSubsectors);

                int fIndices = 0, cIndices = 0;
                for (int i = 0; i < numSubsectors; ++i)
                {
                    var sg = subsectors[i].Segs;

                    List <int> flind = new List <int>(sg.Length * 2);
                    List <int> ceind = new List <int>(sg.Length * 2);

                    for (int j = 0; j < sg.Length; ++j)
                    {
                        var seg = sg[j];
                        if (seg.Side == seg.Line.Side0)
                        {
                            flind.Add(verts.AddReturnIndex(new Vertex3(vertexes[seg.V1], seg.Side.Sector.Floorheight)));
                            flind.Add(verts.AddReturnIndex(new Vertex3(vertexes[seg.V2], seg.Side.Sector.Floorheight)));
                            ceind.Add(verts.AddReturnIndex(new Vertex3(vertexes[seg.V1], seg.Side.Sector.Ceilingheight)));
                            ceind.Add(verts.AddReturnIndex(new Vertex3(vertexes[seg.V2], seg.Side.Sector.Ceilingheight)));
                        }
                        else
                        {
                            flind.Add(verts.AddReturnIndex(new Vertex3(vertexes[seg.V2], seg.Side.Sector.Floorheight)));
                            flind.Add(verts.AddReturnIndex(new Vertex3(vertexes[seg.V1], seg.Side.Sector.Floorheight)));
                            ceind.Add(verts.AddReturnIndex(new Vertex3(vertexes[seg.V2], seg.Side.Sector.Ceilingheight)));
                            ceind.Add(verts.AddReturnIndex(new Vertex3(vertexes[seg.V1], seg.Side.Sector.Ceilingheight)));
                        }
                    }

                    fPolys.Add(new Polygon(flind.ToArray(), fIndices));
                    fIndices += flind.Count;

                    cPolys.Add(new Polygon(ceind.ToArray(), cIndices));
                    cIndices += ceind.Count;
                }

                // Generate vectors and quad indices for OpenGL:
                quadVerts = new Vector3[verts.Count];
                for (int i = 0; i < verts.Count; ++i)
                {
                    MapCoordToVector3(verts[i], out quadVerts[i]);
                }

                floorPolys = fPolys.ToArray();
                ceilPolys  = cPolys.ToArray();

                // Read things:
                var       thingsLump = lumps[ml + (int)MapLump.THINGS];
                const int thingSize  = sizeof(short) * 5;

                int numThings = thingsLump.Size / thingSize;
                for (int i = 0; i < numThings; ++i)
                {
                    short x       = BitConverter.ToInt16(thingsLump.Data, (i * thingSize) + (sizeof(short) * 0));
                    short y       = BitConverter.ToInt16(thingsLump.Data, (i * thingSize) + (sizeof(short) * 1));
                    short angle   = BitConverter.ToInt16(thingsLump.Data, (i * thingSize) + (sizeof(short) * 2));
                    short type    = BitConverter.ToInt16(thingsLump.Data, (i * thingSize) + (sizeof(short) * 3));
                    short options = BitConverter.ToInt16(thingsLump.Data, (i * thingSize) + (sizeof(short) * 4));

#if false
                    // Player #1 start:
                    if (type == 1)
                    {
                        MapCoordToVector3(x, y, 0, out centerPos);
                    }
#endif
                }

                // Game loop:
                while (true)
                {
                    // Create a new Frame to update:
                    next = new Frame();

                    // Set up the frame state to render:
                    //next.bg = new Color4((float)rnd.NextDouble(), (float)rnd.NextDouble(), (float)rnd.NextDouble(), 1.0f);

                    // Set this as the next frame ready to be rendered:
                    Interlocked.Exchange(ref ready, next);
                    // Wait for the frame to be rendered:
                    rendered.WaitOne(16);
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.ToString());
                Exit();
                return;
            }
        }