//reads map from file to Track object public static TrackSavable ReadMap(string path) { TrackSavable Track = new TrackSavable(); List <byte> data = new List <byte>(File.ReadAllBytes(path)); ByteFileParser io = new ByteFileParser(data); //ignore "CDTRK" string in the start of the file io.SetReadingOffest(5); //unused current time thing Track.CurrentTime = io.ReadInt(); //author Track.Author = io.ReadString(); //comment Track.Comment = io.ReadString(); //skip unneeded block for (int n = 0; n < 20; n++) { io.ReadInt(); io.ReadString(); } //track style (race, derby, htf) Track.Style = io.ReadByte(); //ambience Track.Ambience = io.ReadString(); //amount of fileds used on map Track.FieldFilesNumber = io.ReadUShort(); //name of fields Track.FieldFiles = new List <string>(Track.FieldFilesNumber); for (int n = 0; n < Track.FieldFilesNumber; n++) { Track.FieldFiles.Add(io.ReadString()); } //width and height in tiles Track.Width = io.ReadUShort(); Track.Height = io.ReadUShort(); Track.TrackTiles = new List <List <TrackTileSavable> >(Track.Height); for (int y = 0; y < Track.Height; y++) { Track.TrackTiles.Add(new List <TrackTileSavable>(Track.Width)); for (int x = 0; x < Track.Width; x++) { TrackTileSavable newTile = new TrackTileSavable(); newTile.FieldId = io.ReadUShort(); newTile.Rotation = io.ReadByte(); newTile.IsMirrored = io.ReadByte(); newTile.Height = io.ReadByte(); Track.TrackTiles[y].Add(newTile); } } Track.DynamicObjectFilesNumber = io.ReadUShort(); Track.DynamicObjectFiles = new List <string>(Track.DynamicObjectFilesNumber); for (int i = 0; i < Track.DynamicObjectFilesNumber; i++) { Track.DynamicObjectFiles.Add(io.ReadString()); } Track.DynamicObjectsNumber = io.ReadUShort(); Track.DynamicObjects = new List <DynamicObjectSavable>(Track.DynamicObjectsNumber); for (int i = 0; i < Track.DynamicObjectsNumber; i++) { DynamicObjectSavable newDynamicObject = new DynamicObjectSavable(); newDynamicObject.ObjectId = io.ReadUShort(); newDynamicObject.Position = io.ReadVector3(); newDynamicObject.Rotation = io.ReadFloat(); Track.DynamicObjects.Add(newDynamicObject); } Track.CheckpointsNumber = io.ReadUShort(); Track.Checkpoints = new List <ushort>(Track.CheckpointsNumber); for (int i = 0; i < Track.CheckpointsNumber; i++) { Track.Checkpoints.Add(io.ReadUShort()); } Track.Permission = io.ReadByte(); Track.GroundBumpyness = io.ReadFloat(); Track.Scenery = io.ReadByte(); Track.Heightmap = new List <List <float> >(); for (int y = 0; y < Track.Height * 4 + 1; y++) { Track.Heightmap.Add(new List <float>()); for (int x = 0; x < Track.Width * 4 + 1; x++) { Track.Heightmap[y].Add(io.ReadFloat()); } } return(Track); }
/// <summary> /// creates new resized track using tiles of old track as feed. Checkpoints are not loaded. /// </summary> /// <param name="old"></param> /// <param name="newwidth"></param> /// <param name="newheight"></param> // info about checkpoints is ignored and is completely rebuilt depending on gameobjects in world, not on trk file public TrackSavable(TrackSavable old, int plusR, int plusL, int plusUp, int plusDown) { CheckpointsNumber = 0; Checkpoints = new List <ushort>(); Author = old.Author; Comment = old.Comment; Style = old.Style; Ambience = old.Ambience; Height = (ushort)(old.Height + plusUp + plusDown); Width = (ushort)(old.Width + plusR + plusL); FieldFilesNumber = 1; FieldFiles = new List <string>() { "field.cfl" }; TrackTiles = new List <List <TrackTileSavable> >(Height); for (int y = 0; y < Height; y++) { TrackTiles.Add(new List <TrackTileSavable>(Width)); for (int x = 0; x < Width; x++) { // place trackpiece to translated location. If exceeding old dims, place grass if (y - plusUp >= 0 && y - plusUp < old.Height && x - plusL >= 0 && x - plusL < old.Width) { TrackTiles[y].Add(new TrackTileSavable(old.TrackTiles[y - plusUp][x - plusL])); // update fieldID (ignore quarters) if (TrackTiles[y][x].FieldId < 65400) { string tilename = old.FieldFiles[TrackTiles[y][x].FieldId]; bool found = false; for (ushort i = 0; i < FieldFiles.Count; i++) { if (tilename == FieldFiles[i]) { TrackTiles[y][x].FieldId = i; found = true; break; } } if (!found) { FieldFiles.Add(tilename); TrackTiles[y][x].FieldId = FieldFilesNumber; FieldFilesNumber++; } } } else { TrackTiles[y].Add(new TrackTileSavable(0, 0, 0, 0)); } } } DynamicObjectsNumber = 0; DynamicObjectFilesNumber = 0; DynamicObjects = new List <DynamicObjectSavable>(); DynamicObjectFiles = new List <string>(); foreach (DynamicObjectSavable olddos in old.DynamicObjects) { if (olddos.Position.x >= -plusL * 20 && olddos.Position.z <= plusUp * 20 && olddos.Position.x <= 20 * (Width - plusL) && olddos.Position.z >= 20 * (plusUp - Height)) { DynamicObjectSavable dos = new DynamicObjectSavable(olddos); DynamicObjects.Add(dos); dos.Position = new Vector3(olddos.Position.x + plusL * 20, olddos.Position.y, olddos.Position.z - plusUp * 20); DynamicObjectsNumber++; Debug.Log(olddos.Position == dos.Position); string dof = old.DynamicObjectFiles[olddos.ObjectId]; if (!DynamicObjectFiles.Contains(dof)) { DynamicObjectFiles.Add(dof); dos.ObjectId = DynamicObjectFilesNumber; DynamicObjectFilesNumber++; } else { dos.ObjectId = (ushort)DynamicObjectFiles.IndexOf(dof); } } } Permission = old.Permission; GroundBumpyness = old.GroundBumpyness; Scenery = old.Scenery; Heightmap = new List <List <float> >(Height * 4 + 1); for (int y = 0; y <= Height * 4; y++) { Heightmap.Add(new List <float>(Width * 4 + 1)); for (int x = 0; x <= Width * 4; x++) { if (x == 0 || x == 4 * Width || y == 0 || y == 4 * Height) { Heightmap[y].Add(old.Heightmap[0][0]); } else if (y - 4 * plusUp >= 0 && y - 4 * plusUp <= old.Height * 4 && x - 4 * plusL >= 0 && x - 4 * plusL <= old.Width * 4) { Heightmap[y].Add(old.Heightmap[y - 4 * plusUp][x - 4 * plusL]); } else { Heightmap[y].Add(0); } } } }
public DynamicObjectSavable(DynamicObjectSavable old) { ObjectId = old.ObjectId; Position = old.Position; Rotation = old.Rotation; }