Ejemplo n.º 1
0
    //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);
    }
Ejemplo n.º 2
0
    /// <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;
 }