/// <summary> /// Reinitilize child objet /// </summary> public void Blank() { TileCountPerSegment = 6; SegmentCountPerMap = 64; TileLenght = 42; MapProperties = new MapProperties(); DwTerrainSegment = new KSegment[64, 64]; for (int segmentY = 0; segmentY < SegmentCountPerMap; segmentY++) { for (int segmentX = 0; segmentX < SegmentCountPerMap; segmentX++) { DwTerrainSegment[segmentX, segmentY] = new KSegment(); for (int titleY = 0; titleY < TileCountPerSegment; titleY++) { for (int titleX = 0; titleX < TileCountPerSegment; titleX++) { DwTerrainSegment[segmentX, segmentY].HsVector[titleX, titleY] = new KVertex(); } } } } DwProps.Clear(); DwGrass.Clear(); DwVectorAttr.Clear(); DwWater.Clear(); DwGrassColony.Clear(); DwEventArea.Clear(); }
/// <summary> /// Load existing map /// </summary> /// <param name="buffer"></param> public void Load(byte[] buffer) { try { using (BinaryReader b = new BinaryReader(new MemoryStream(buffer))) { Sign = Encoding.Default.GetString(b.ReadBytes(16)); Version = b.ReadInt32(); #if DEBUG == false if (!SupportedVersion.Contains(Version)) { XLog.WriteLine(Levels.Error, $"Failed"); XLog.WriteLine(Levels.Error, "Incompatible version {0} is not supported or not implemented.", Version); return; } #endif var dwMapPropertiesOffset = b.ReadInt32(); var dwTerrainSegmentOffset = b.ReadInt32(); var dwPropOffset = b.ReadInt32(); var dwVectorAttrOffset = b.ReadInt32(); var dwWaterOffset = b.ReadInt32(); var dwGrassColonyOffset = (Version >= 17) ? b.ReadInt32() : 0; var dwEventAreaOffset = (Version >= 22) ? b.ReadInt32() : 0; TileCountPerSegment = b.ReadInt32(); SegmentCountPerMap = b.ReadInt32(); TileLenght = b.ReadSingle(); #region Properties MapProperties.Primary.Diffuse = new KColor(b.ReadByte(), b.ReadByte(), b.ReadByte(), 255); MapProperties.Primary.Specular = new KColor(b.ReadByte(), b.ReadByte(), b.ReadByte(), 255); MapProperties.Primary.Attenuation0 = b.ReadSingle(); MapProperties.Primary.Attenuation1 = b.ReadSingle(); MapProperties.Primary.Attenuation2 = b.ReadSingle(); MapProperties.Secondary.Diffuse = new KColor(b.ReadByte(), b.ReadByte(), b.ReadByte(), 255); MapProperties.Secondary.Specular = new KColor(b.ReadByte(), b.ReadByte(), b.ReadByte(), 255); MapProperties.Secondary.Attenuation0 = b.ReadSingle(); MapProperties.Secondary.Attenuation1 = b.ReadSingle(); MapProperties.Secondary.Attenuation2 = b.ReadSingle(); MapProperties.Sky = new KColor(b.ReadByte(), b.ReadByte(), b.ReadByte(), 255); MapProperties.Fog = new KColor(b.ReadByte(), b.ReadByte(), b.ReadByte(), 255); MapProperties.FogNear = b.ReadSingle(); MapProperties.FogFar = b.ReadSingle(); MapProperties.SkyType = b.ReadUInt32(); MapProperties.ShowTerrainInGame = b.ReadBoolean(); #endregion #region Terrain segment for (int segmentY = 0; segmentY < SegmentCountPerMap; segmentY++) { for (int segmentX = 0; segmentX < SegmentCountPerMap; segmentX++) { DwTerrainSegment[segmentX, segmentY] = new KSegment(); DwTerrainSegment[segmentX, segmentY].Version = (Version >= 16) ? b.ReadUInt32() : 0; for (int tile = 0; tile < 3; tile++) { DwTerrainSegment[segmentX, segmentY].Tile[tile] = (Version >= 16) ? b.ReadUInt16() : (ushort)0; } DwTerrainSegment[segmentX, segmentY].HsVector = new KVertex[TileCountPerSegment, TileCountPerSegment]; for (int tileY = 0; tileY < TileCountPerSegment; tileY++) { for (int tileX = 0; tileX < TileCountPerSegment; tileX++) { DwTerrainSegment[segmentX, segmentY].HsVector[tileX, tileY] = new KVertex(); DwTerrainSegment[segmentX, segmentY].HsVector[tileX, tileY].Height = b.ReadSingle(); for (int f = 0; f < 2; f++) { if (Version >= 16) { DwTerrainSegment[segmentX, segmentY].HsVector[tileX, tileY].FillBits[f] = b.ReadUInt32(); } if (Version == 15 && f == 0) { DwTerrainSegment[segmentX, segmentY].HsVector[tileX, tileY].FillBits[f] = b.ReadUInt32(); } } DwTerrainSegment[segmentX, segmentY].HsVector[tileX, tileY].Attribute = (Version >= 16) ? b.ReadInt64() : 0; DwTerrainSegment[segmentX, segmentY].HsVector[tileX, tileY].Color = new KTripleColor(b.ReadByte(), b.ReadByte(), b.ReadByte()); } } } } #endregion #region Prop //Escape offset prop table for (int i = 0; i < SegmentCountPerMap * SegmentCountPerMap; i++) { b.ReadInt32(); } // PROP var segment = 0; for (int segmentY = 0; segmentY < SegmentCountPerMap; segmentY++) { for (int segmentX = 0; segmentX < SegmentCountPerMap; segmentX++) { var propcount = b.ReadInt32(); for (int p = 0; p < propcount; p++) { var prop = new KProp(); /* index */ b.ReadInt32(); prop.SegmentId = segment; prop.X = b.ReadSingle(); prop.Y = b.ReadSingle(); prop.Z = b.ReadSingle(); prop.RotateX = b.ReadSingle(); prop.RotateY = b.ReadSingle(); prop.RotateZ = b.ReadSingle(); prop.ScaleX = b.ReadSingle(); prop.ScaleY = (Version >= 21) ? b.ReadSingle() : prop.ScaleX; prop.ScaleZ = (Version >= 21) ? b.ReadSingle() : prop.ScaleX; prop.PropNum = b.ReadUInt16(); prop.HeightLocked = (Version >= 21) ? b.ReadBoolean() : false; prop.LockHeight = (Version >= 21) ? b.ReadSingle() : 0.0f; prop.TextureGroup = (Version >= 21) ? b.ReadInt16() : (short)-1; DwProps.Add(prop); } if (Version >= 19) { var grassCount = b.ReadInt32(); for (int n = 0; n < grassCount; n++) { var grass = new KGrass(); grass.SegmentId = segment; grass.GrassId = b.ReadInt32(); var propCount = b.ReadInt32(); for (int i = 0; i < propCount; i++) { var prop = new KGrassProp(); prop.X = b.ReadSingle(); prop.Y = b.ReadSingle(); prop.RotateX = b.ReadSingle(); prop.RotateY = b.ReadSingle(); prop.RotateZ = b.ReadSingle(); grass.Props.Add(prop); } DwGrass.Add(grass); } } segment++; } } #endregion #region Vector attribute var polygonCount = b.ReadInt32(); for (int i = 0; i < polygonCount; i++) { var polygon = new Polygon2(); var pointNum = b.ReadInt32(); for (int p = 0; p < pointNum; p++) { var point = new K2DPosition(); point.X = b.ReadInt32(); point.Y = b.ReadInt32(); polygon.Points.Add(point); } DwVectorAttr.Add(polygon); } #endregion #region Water var waterCount = b.ReadInt32(); for (int i = 0; i < waterCount; i++) { var water = new Water(); water.PointA.X = b.ReadSingle(); water.PointA.Y = b.ReadSingle(); water.PointA.Z = b.ReadSingle(); water.PointB.X = b.ReadSingle(); water.PointB.Y = b.ReadSingle(); water.PointB.Z = b.ReadSingle(); water.Center.X = b.ReadSingle(); water.Center.Y = b.ReadSingle(); water.Center.Z = b.ReadSingle(); water.UseReflect = b.ReadInt32(); water.WaterId = b.ReadInt32(); DwWater.Add(water); } #endregion if (Version >= 17) { #region Speed grass var speedGrassCount = b.ReadInt32(); for (int i = 0; i < speedGrassCount; i++) { var speedGrass = new SpeedGrassColony(); speedGrass.GrassId = b.ReadInt32(); speedGrass.Density = b.ReadSingle(); speedGrass.Distribution = b.ReadSingle(); speedGrass.Size = b.ReadSingle(); speedGrass.HeightP = b.ReadSingle(); speedGrass.HeightM = b.ReadSingle(); speedGrass.Color = new KColor(b.ReadByte(), b.ReadByte(), b.ReadByte(), b.ReadByte()); speedGrass.ColorRatio = b.ReadSingle(); speedGrass.ColorTone = b.ReadSingle(); speedGrass.Chroma = b.ReadSingle(); speedGrass.Brightness = b.ReadSingle(); speedGrass.CombinationRatio = b.ReadSingle(); speedGrass.WindReaction = b.ReadSingle(); speedGrass.Filename = Encoding.Default.GetString(b.ReadBytes(b.ReadInt32())); var polyshCount = b.ReadInt32(); for (int p = 0; p < polyshCount; p++) { var polygon = new Polygon2(); var pointCount = b.ReadInt32(); for (int n = 0; n < pointCount; n++) { var point = new K2DPosition(); point.X = b.ReadInt32(); point.Y = b.ReadInt32(); polygon.Points.Add(point); } speedGrass.Polygons.Add(polygon); } DwGrassColony.Add(speedGrass); } #endregion } if (Version >= 22) { #region Event area var eventAreaCount = b.ReadInt32(); for (int i = 0; i < eventAreaCount; i++) { var area = new EventAreaScript(); area.AreaId = b.ReadInt32(); var count = b.ReadInt32(); for (int p = 0; p < count; p++) { var polygon = new Polygon2(); var pointNum = b.ReadInt32(); for (int n = 0; n < pointNum; n++) { var point = new K2DPosition(); point.X = b.ReadInt32(); point.Y = b.ReadInt32(); polygon.Points.Add(point); } area.Polygons.Add(polygon); } DwEventArea.Add(area); } #endregion } } XLog.WriteLine(Levels.Good, "Ok"); } catch (Exception exception) { Blank(); XLog.WriteLine(Levels.Error, "Failed"); XLog.WriteLine(Levels.Fatal, "NfmManager::Load<Exception> -> {0}", exception); } }