コード例 #1
0
ファイル: TD6Parser.cs プロジェクト: PhantomBadger/RCT2-GA
        /// <summary>
        /// Decode an array of Run-Length Unencoded Bytes into the data structure
        /// </summary>
        /// <param name="rawBytes">The RLE decoded byte array</param>
        /// <returns>The created TD6 Data Structure represented as RCT2RideData</returns>
        public RCT2RideData Decode(byte[] rawBytes)
        {
            RCT2RideData td6Data = new RCT2RideData();


            return(td6Data);
        }
コード例 #2
0
        public RCT2RideData GenerateWoodenRollerCoaster()
        {
            RideData.RCT2RideData coaster = new RideData.RCT2RideData();

            //Track Type
            coaster.TrackType          = new RideData.RCT2RideCode();
            coaster.TrackType.RideType = RideData.RCT2RideCode.RCT2TrackName.WoodenRollerCoaster6Seater;

            do
            {
                //Track Data
                coaster.TrackData = GenerateWoodenRollerCoasterTrack();
            } while (coaster.TrackData == null);

            //Ride Features
            coaster.RideFeatures = new RideData.RCT2RideFeatures();
            coaster.RideFeatures.Populate(coaster.TrackData);

            //Operating Mode
            coaster.OperatingMode = RideData.RCT2RideData.RCT2OperatingModes.ContinuousCircuit;

            //Colour Scheme
            coaster.ColourScheme            = new RideData.RCT2VehicleColourScheme();
            coaster.ColourScheme.ColourMode = RideData.RCT2VehicleColourScheme.RCT2VehicleColourMode.AllSameColour;
            List <RideData.RCT2VehicleColourScheme.RCT2Colour> bodyColours       = new List <RideData.RCT2VehicleColourScheme.RCT2Colour>();
            List <RideData.RCT2VehicleColourScheme.RCT2Colour> trimColours       = new List <RideData.RCT2VehicleColourScheme.RCT2Colour>();
            List <RideData.RCT2VehicleColourScheme.RCT2Colour> additionalColours = new List <RideData.RCT2VehicleColourScheme.RCT2Colour>();
            Random random       = new Random();
            Array  colourValues = Enum.GetValues(typeof(RideData.RCT2VehicleColourScheme.RCT2Colour));

            for (int i = 0; i < 32; i++)
            {
                bodyColours.Add((RideData.RCT2VehicleColourScheme.RCT2Colour)colourValues.GetValue(random.Next(colourValues.Length)));
                trimColours.Add((RideData.RCT2VehicleColourScheme.RCT2Colour)colourValues.GetValue(random.Next(colourValues.Length)));
                additionalColours.Add((RideData.RCT2VehicleColourScheme.RCT2Colour)colourValues.GetValue(random.Next(colourValues.Length)));
            }

            coaster.ColourScheme.BodyColours       = bodyColours.ToArray();
            coaster.ColourScheme.TrimColours       = trimColours.ToArray();
            coaster.ColourScheme.AdditionalColours = additionalColours.ToArray();

            //Entrance Style
            coaster.EntranceStyle = RideData.RCT2RideData.RCT2EntranceStyle.Plain;

            //Air Time In Seconds
            coaster.TrackData.PopulateRideStatistics();
            coaster.AirTimeInSeconds = coaster.TrackData.AirTimeInSeconds;

            //Departure Flags
            coaster.DepartureFlags = new RideData.RCT2DepartureControlFlags();
            coaster.DepartureFlags.UseMinimumTime  = true;
            coaster.DepartureFlags.WaitForFullLoad = true;

            //Number of Trains
            coaster.NumberOfTrains = 1;

            //Number of Cars per Train
            coaster.NumberOfCarsPerTrain = 2;

            //Min Wait Time in Seconds
            coaster.MinWaitTimeInSeconds = 10;

            //Max Wait Time in Seconds
            coaster.MaxWaitTimeInSeconds = 60;

            //Speed of Powered Launch/Number of Go Kart Laps/Max number of people in Maze
            coaster.SpeedOfPoweredLaunch  = 0;
            coaster.NumberOfGoKartLaps    = 0;
            coaster.MaxNumberOfPeopleMaze = 0;

            //Max Speed of Ride
            coaster.MaxSpeedOfRide = coaster.TrackData.MaxSpeed;

            //Average Speed of Ride
            coaster.AverageSpeedOfRide = coaster.TrackData.AverageSpeed;

            //Ride length in metres
            coaster.RideLengthInMetres = coaster.TrackData.CalculateRideLengthInMeters();

            //Pos G Force
            coaster.PosGForce = coaster.TrackData.MaxPositiveG;

            //Neg G Force
            coaster.NegGForce = coaster.TrackData.MaxNegativeG;

            //Lat G Force
            coaster.LatGForce = coaster.TrackData.MaxLateralG;

            //Number of Inversions
            coaster.NumberOfInversions = coaster.TrackData.NumOfInversions;

            //Number of Drops
            coaster.NumberOfDrops = coaster.TrackData.NumOfDrops;

            //Highest Drop
            coaster.HighestDrop = coaster.TrackData.HighestDrop;

            //Excitement Times Ten
            coaster.ExcitementTimesTen = coaster.TrackData.Excitement * 10;

            //Intensity Times Ten
            coaster.IntensityTimesTen = coaster.TrackData.Intensity * 10;

            //Nausea Times Ten
            coaster.NauseaTimesTen = coaster.TrackData.Nausea * 10;

            //Main Track Colour
            coaster.TrackMainColour     = (RideData.RCT2VehicleColourScheme.RCT2Colour)colourValues.GetValue(random.Next(colourValues.Length));
            coaster.TrackMainColourAlt1 = (RideData.RCT2VehicleColourScheme.RCT2Colour)colourValues.GetValue(random.Next(colourValues.Length));
            coaster.TrackMainColourAlt2 = (RideData.RCT2VehicleColourScheme.RCT2Colour)colourValues.GetValue(random.Next(colourValues.Length));
            coaster.TrackMainColourAlt3 = (RideData.RCT2VehicleColourScheme.RCT2Colour)colourValues.GetValue(random.Next(colourValues.Length));

            //Additional Track Colour
            coaster.TrackAdditionalColour     = (RideData.RCT2VehicleColourScheme.RCT2Colour)colourValues.GetValue(random.Next(colourValues.Length));
            coaster.TrackAdditionalColourAlt1 = (RideData.RCT2VehicleColourScheme.RCT2Colour)colourValues.GetValue(random.Next(colourValues.Length));
            coaster.TrackAdditionalColourAlt2 = (RideData.RCT2VehicleColourScheme.RCT2Colour)colourValues.GetValue(random.Next(colourValues.Length));
            coaster.TrackAdditionalColourAlt3 = (RideData.RCT2VehicleColourScheme.RCT2Colour)colourValues.GetValue(random.Next(colourValues.Length));

            //Support Track Colour
            coaster.TrackSupportColour     = (RideData.RCT2VehicleColourScheme.RCT2Colour)colourValues.GetValue(random.Next(colourValues.Length));
            coaster.TrackSupportColourAlt1 = (RideData.RCT2VehicleColourScheme.RCT2Colour)colourValues.GetValue(random.Next(colourValues.Length));
            coaster.TrackSupportColourAlt2 = (RideData.RCT2VehicleColourScheme.RCT2Colour)colourValues.GetValue(random.Next(colourValues.Length));
            coaster.TrackSupportColourAlt3 = (RideData.RCT2VehicleColourScheme.RCT2Colour)colourValues.GetValue(random.Next(colourValues.Length));

            //Is Six Flag Design
            coaster.IsSixFlagsDesign = false;

            //DAT File Header
            //We scum this in the TD6 Parser so it's not needed to be filled yet
            //TODO
            coaster.DatFile = new RideData.DATFileHeader();

            //DAT File Checksum
            coaster.DatChecksum = coaster.DatFile.CalculateChecksum(RideData.RCT2RideCode.RideNameVehicleMap[coaster.TrackType.RideType]);

            //Required Map Space
            coaster.RequiredMapSpace = coaster.TrackData.CalculateRequiredMapSpace();

            //Lift Chain Speed
            coaster.LiftChainSpeed = 5;

            //Number of Circuits
            coaster.NumberOfCircuits = 1;

            //Check Validity
            RCT2TrackData.InvalidityCode invalidityResult = coaster.TrackData.CheckValidity();
            if (invalidityResult != RCT2TrackData.InvalidityCode.Valid)
            {
                Console.WriteLine("Failed Validity Check: " + invalidityResult.ToString());
                return(null);
            }

            return(coaster);
        }
コード例 #3
0
ファイル: TD6Parser.cs プロジェクト: PhantomBadger/RCT2-GA
        /// <summary>
        /// Encode the RCT2RideData Structure into a Run-Length Unencoded Byte Array
        /// </summary>
        /// <param name="td6Data">The RCT2RideData Structure</param>
        /// <returns>A Byte array containing a full TD6 file</returns>
        public byte[] Encode(RCT2RideData td6Data)
        {
            List <byte> td6Bytes = new List <byte>();

            // Go through the data structure described here and add the bytes in
            // http://freerct.github.io/RCTTechDepot-Archive/TD6.html
            byte dummyByte = 0;

            //00 Track Type
            td6Bytes.Add((byte)RCT2RideCode.RideNameCodeMap[td6Data.TrackType.RideType]);

            //01 ?
            td6Bytes.Add(dummyByte);

            td6Data.RideFeatures.Populate(td6Data.TrackData);

            //02 - Ride Features Byte 0
            byte rideFeaturesByte0 = 0;

            //Straight Flat
            rideFeaturesByte0 |= (byte)((td6Data.RideFeatures.StraightFlat) ? 0x2 : 0x0);
            //Station Platform
            rideFeaturesByte0 |= (byte)((td6Data.RideFeatures.StationPlatform) ? 0x4 : 0x0);
            //Lift Chain
            rideFeaturesByte0 |= (byte)((td6Data.RideFeatures.LiftChain) ? 0x8 : 0x0);
            //Steep Lift Chain
            rideFeaturesByte0 |= (byte)((td6Data.RideFeatures.SteepLiftChain) ? 0x10 : 0x0);
            //Curve Lift Chain
            rideFeaturesByte0 |= (byte)((td6Data.RideFeatures.CurveLiftChain) ? 0x20 : 0x0);
            //Banking
            rideFeaturesByte0 |= (byte)((td6Data.RideFeatures.Banking) ? 0x40 : 0x0);
            //Vertical Loop
            rideFeaturesByte0 |= (byte)((td6Data.RideFeatures.VerticalLoop) ? 0x80 : 0x0);
            td6Bytes.Add(rideFeaturesByte0);

            //03 - Ride Features Byte 1
            byte rideFeaturesByte1 = 0;

            //Normal Slope
            rideFeaturesByte1 |= (byte)((td6Data.RideFeatures.NormalSlope) ? 0x1 : 0x0);
            //Steep Slope
            rideFeaturesByte1 |= (byte)((td6Data.RideFeatures.SteepSlope) ? 0x2 : 0x0);
            //Flat-To-Steep
            rideFeaturesByte1 |= (byte)((td6Data.RideFeatures.FlatToSteep) ? 0x4 : 0x0);
            //Sloped Curves
            rideFeaturesByte1 |= (byte)((td6Data.RideFeatures.SlopedCurves) ? 0x8 : 0x0);
            //Steep Twist
            rideFeaturesByte1 |= (byte)((td6Data.RideFeatures.SteepTwist) ? 0x10 : 0x0);
            //S-Bends
            rideFeaturesByte1 |= (byte)((td6Data.RideFeatures.SBends) ? 0x20 : 0x0);
            //Small radius curves
            rideFeaturesByte1 |= (byte)((td6Data.RideFeatures.SmallRadiusCurves) ? 0x40 : 0x0);
            //Small radius banked
            rideFeaturesByte1 |= (byte)((td6Data.RideFeatures.SmallRadiusBanked) ? 0x80 : 0x0);
            td6Bytes.Add(rideFeaturesByte1);

            //04 - Ride Features Byte 2
            byte rideFeaturesByte2 = 0;

            //Medium Radius Curves
            rideFeaturesByte2 |= (byte)((td6Data.RideFeatures.MediumRadiusCurves) ? 0x1 : 0x0);
            //Inline Twist
            rideFeaturesByte2 |= (byte)((td6Data.RideFeatures.InlineTwist) ? 0x2 : 0x0);
            //Half Loop
            rideFeaturesByte2 |= (byte)((td6Data.RideFeatures.HalfLoop) ? 0x4 : 0x0);
            //Half Corkscrew
            rideFeaturesByte2 |= (byte)((td6Data.RideFeatures.HalfCorkscrew) ? 0x8 : 0x0);
            //Tower Base/Vertical
            rideFeaturesByte2 |= (byte)((td6Data.RideFeatures.TowerBaseVertical) ? 0x10 : 0x0);
            //Helix Banked
            rideFeaturesByte2 |= (byte)((td6Data.RideFeatures.HelixBanked) ? 0x20 : 0x0);
            //Helix Banked
            rideFeaturesByte2 |= (byte)((td6Data.RideFeatures.HelixBanked) ? 0x40 : 0x0);
            //Helix Unbanked
            rideFeaturesByte2 |= (byte)((td6Data.RideFeatures.HelixUnbanked) ? 0x80 : 0x0);
            td6Bytes.Add(rideFeaturesByte2);

            //05 - Ride Features Byte 3
            byte rideFeaturesByte3 = 0;

            //Brakes
            rideFeaturesByte3 |= (byte)((td6Data.RideFeatures.Brakes) ? 0x1 : 0x0);
            //Booster
            rideFeaturesByte3 |= (byte)((td6Data.RideFeatures.Booster) ? 0x2 : 0x0);
            //On-Ride-Photo
            rideFeaturesByte3 |= (byte)((td6Data.RideFeatures.OnRidePhoto) ? 0x4 : 0x0);
            //Water Splash
            rideFeaturesByte3 |= (byte)((td6Data.RideFeatures.WaterSplash) ? 0x8 : 0x0);
            //Vertical Track
            rideFeaturesByte3 |= (byte)((td6Data.RideFeatures.VerticalTrack) ? 0x10 : 0x0);
            //Barrel Roll
            rideFeaturesByte3 |= (byte)((td6Data.RideFeatures.BarrelRoll) ? 0x20 : 0x0);
            //Launched Lift Hill
            rideFeaturesByte3 |= (byte)((td6Data.RideFeatures.LaunchedLiftHill) ? 0x40 : 0x0);
            //Large Half Loop
            rideFeaturesByte3 |= (byte)((td6Data.RideFeatures.LargeHalfLoop) ? 0x80 : 0x0);
            td6Bytes.Add(rideFeaturesByte3);

            //06 Operating Mode
            td6Bytes.Add((byte)td6Data.OperatingMode);

            //07 Vehicle Colour Scheme
            //Third bit is set to 1 for RCT2
            td6Bytes.Add((byte)(0x8 + td6Data.ColourScheme.ColourMode));

            //08-47 32 sets of two byte colour specifiers for vehicles.
            //first byte = body colour, second byte = trim colour
            for (int i = 0; i < 32; i++)
            {
                if (i < td6Data.ColourScheme.BodyColours.Length)
                {
                    td6Bytes.Add((byte)td6Data.ColourScheme.BodyColours[i]);
                }
                else
                {
                    td6Bytes.Add((byte)RCT2VehicleColourScheme.RCT2Colour.Black);
                }

                if (i < td6Data.ColourScheme.TrimColours.Length)
                {
                    td6Bytes.Add((byte)td6Data.ColourScheme.TrimColours[i]);
                }
                else
                {
                    td6Bytes.Add((byte)RCT2VehicleColourScheme.RCT2Colour.Black);
                }
            }

            //48 ?
            td6Bytes.Add(dummyByte);

            //49 Entrance Style
            td6Bytes.Add((byte)td6Data.EntranceStyle);

            //4A Air Time (in seconds / 4)
            td6Bytes.Add((byte)(td6Data.AirTimeInSeconds / 4));

            //4B Departure Control Flags
            //http://freerct.github.io/RCTTechDepot-Archive/controlFlags.html
            byte departureControlFlagsByte = 0;

            //Load Info
            if (td6Data.DepartureFlags.WaitForQuarterLoad)
            {
                departureControlFlagsByte = 0;
            }
            else if (td6Data.DepartureFlags.WaitForHalfLoad)
            {
                departureControlFlagsByte = 0x1;
            }
            else if (td6Data.DepartureFlags.WaitForThreeQuarterLoad)
            {
                departureControlFlagsByte = 0x2;
            }
            else if (td6Data.DepartureFlags.WaitForFullLoad)
            {
                departureControlFlagsByte = 0x3;
            }
            else if (td6Data.DepartureFlags.WaitForAnyLoad)
            {
                departureControlFlagsByte = 0x4;
            }

            //Departure Info
            if (td6Data.DepartureFlags.UseMaximumTime)
            {
                departureControlFlagsByte |= 0x80;
            }
            else if (td6Data.DepartureFlags.UseMinimumTime)
            {
                departureControlFlagsByte |= 0x40;
            }
            else if (td6Data.DepartureFlags.SyncWithAdjacentStation)
            {
                departureControlFlagsByte |= 0x20;
            }
            else if (td6Data.DepartureFlags.LeaveIfAnotherArrives)
            {
                departureControlFlagsByte |= 0x10;
            }
            else if (td6Data.DepartureFlags.WaitForLoad)
            {
                departureControlFlagsByte |= 0x8;
            }

            td6Bytes.Add(departureControlFlagsByte);

            //4C Number of Trains
            td6Bytes.Add((byte)td6Data.NumberOfTrains);

            //4D Number Of Cars per Train
            td6Bytes.Add((byte)td6Data.NumberOfCarsPerTrain);

            //4E Minimum Wait Time in Seconds
            td6Bytes.Add((byte)td6Data.MinWaitTimeInSeconds);

            //4F Maximum Wait Time in Seconds
            td6Bytes.Add((byte)td6Data.MaxWaitTimeInSeconds);

            //50 Speed (Powered Launch/Chairlift/Whoa Belly, or num of laps for go kart, or num of people in a maze)
            //1 bit = 3.616 km/hr 2.25 mph
            if (td6Data.SpeedOfPoweredLaunch != default(float))
            {
                //Speed of powered launch
                td6Bytes.Add((byte)(Math.Round(td6Data.SpeedOfPoweredLaunch / MPHToBit)));
            }
            else if (td6Data.NumberOfGoKartLaps != default(int))
            {
                //Max number of go kart laps
                td6Bytes.Add((byte)td6Data.NumberOfGoKartLaps);
            }
            else
            {
                //Max Number of people in maze
                td6Bytes.Add((byte)td6Data.MaxNumberOfPeopleMaze);
            }

            //51 Max Speed of Ride
            //1 bit = 3.616 km/hr 2.25 mph
            td6Bytes.Add((byte)(Math.Round(td6Data.MaxSpeedOfRide / MPHToBit)));

            //52 Average Speed of Ride
            //1 bit = 3.616 km/hr 2.25 mph
            td6Bytes.Add((byte)(Math.Round((td6Data.AverageSpeedOfRide / MPHToBit))));

            //53-54 Ride Length in Meters
            td6Bytes.Add((byte)td6Data.RideLengthInMetres);
            td6Bytes.Add((byte)(td6Data.RideLengthInMetres >> 8));

            //55 Positive G-Force
            //1 bit = 0.32g
            td6Bytes.Add((byte)(Math.Round((td6Data.PosGForce / GForceToBit))));

            //56 Negative G-Force
            //1 bit = 0.32g
            td6Bytes.Add((byte)(Math.Round((td6Data.NegGForce / GForceToBit))));

            //57 Lateral G-Force
            //1 bit = 0.32g
            td6Bytes.Add((byte)(Math.Round((td6Data.LatGForce / GForceToBit))));

            //58 Number of Inversions
            //Max 31
            td6Bytes.Add((byte)Math.Min(31, td6Data.NumberOfInversions));

            //59 Number of drops
            //Max 63
            td6Bytes.Add((byte)Math.Min(63, td6Data.NumberOfDrops));

            //5A Highest Drop
            //1 bit = 3/4 meter
            td6Bytes.Add((byte)(Math.Round((td6Data.HighestDrop / DropMeterToBit))));

            //5B Excitement
            td6Bytes.Add((byte)td6Data.ExcitementTimesTen);

            //5C Intensity
            td6Bytes.Add((byte)td6Data.IntensityTimesTen);

            //5D Nausea
            td6Bytes.Add((byte)td6Data.NauseaTimesTen);

            //5E ?
            td6Bytes.Add(dummyByte);

            //5F ?
            td6Bytes.Add(dummyByte);

            //60 Track Main Spine Color (Main)
            td6Bytes.Add((byte)td6Data.TrackMainColour);

            //61 Track Main Spine Color (Alt 1)
            td6Bytes.Add((byte)td6Data.TrackMainColourAlt1);

            //62 Track Main Spine Color (Alt 2)
            td6Bytes.Add((byte)td6Data.TrackMainColourAlt2);

            //63 Track Main Spine Color (Alt 3)
            td6Bytes.Add((byte)td6Data.TrackMainColourAlt3);

            //64 Track Additional Rail Color (Main)
            td6Bytes.Add((byte)td6Data.TrackAdditionalColour);

            //65 Track Additional Rail Color (Alt 1)
            td6Bytes.Add((byte)td6Data.TrackAdditionalColourAlt1);

            //66 Track Additional Rail Color (Alt 2)
            td6Bytes.Add((byte)td6Data.TrackAdditionalColourAlt2);

            //67 Track Additional Rail Color (Alt 3)
            td6Bytes.Add((byte)td6Data.TrackAdditionalColourAlt3);

            //68 Track Support Color (Main)
            td6Bytes.Add((byte)td6Data.TrackSupportColour);

            //69 Track Support Color (Alt 1)
            td6Bytes.Add((byte)td6Data.TrackSupportColourAlt1);

            //6A Track Support Color (Alt 2)
            td6Bytes.Add((byte)td6Data.TrackSupportColourAlt2);

            //6B Track Support Color (Alt 3)
            td6Bytes.Add((byte)td6Data.TrackSupportColourAlt3);

            //6C ?
            td6Bytes.Add(dummyByte);

            //6D ?
            td6Bytes.Add(dummyByte);

            //6E ?
            td6Bytes.Add(dummyByte);

            //6F - Six Flags Design if MSB is 1
            td6Bytes.Add(td6Data.IsSixFlagsDesign ? (byte)0x80 : dummyByte);

            //70-73 DAT file flags
            //TODO
            //For now we'll cheat and always use ones for a PTCT1 Track
            td6Bytes.Add(0x80);
            td6Bytes.Add(0xB1);
            td6Bytes.Add(0x58);
            td6Bytes.Add(0x0C);

            //74-7B Vehicle (Alphanumeric - 8 characters with trailing spaces)
            //We're using Wooden Roller Coaster - 4 Seater (PTCT1) for our example
            //And so this will only work properly with PTCT1, as the DAT file flags / checksum will be different
            string vehicle = RCT2RideCode.RideNameVehicleMap[td6Data.TrackType.RideType];

            for (int i = 0; i < 8; i++)
            {
                if (i < vehicle.Length)
                {
                    td6Bytes.Add((byte)vehicle[i]);
                }
                else
                {
                    td6Bytes.Add((byte)' ');
                }
            }


            //7C-7F DAT file checksum
            //TODO
            //For now we'll cheat and always use ones for a PTCT1 Track
            td6Bytes.Add(0xB2);
            td6Bytes.Add(0x81);
            td6Bytes.Add(0x15);
            td6Bytes.Add(0xFF);

            //80-81 Map Space Required (X and Y)
            td6Bytes.Add((byte)td6Data.RequiredMapSpace.X);
            td6Bytes.Add((byte)td6Data.RequiredMapSpace.Y);

            //82-A1 One-byte colour specifiers for vehicles additional colour
            for (int i = 0; i < 32; i++)
            {
                if (i < td6Data.ColourScheme.AdditionalColours.Length)
                {
                    td6Bytes.Add((byte)td6Data.ColourScheme.AdditionalColours[i]);
                }
                else
                {
                    td6Bytes.Add((byte)RCT2VehicleColourScheme.RCT2Colour.Black);
                }
            }

            //A2 - Low 5 bites = lift chain speed (1.6 km/hr per bit)
            //     Upper 3 bits = number of circuits
            byte a2Byte = (byte)(td6Data.NumberOfCircuits & 0x7);

            a2Byte <<= 5;
            a2Byte  |= (byte)((byte)td6Data.LiftChainSpeed & 0x1F);
            td6Bytes.Add(a2Byte);

            //A3 Beginning of track data
            //Each track element is the track segment, then the qualifier, ends with an FF for track segment
            for (int i = 0; i < td6Data.TrackData.TrackData.Count(); i++)
            {
                if (td6Data.TrackData.TrackData[i].TrackElement == RCT2TrackElements.RCT2TrackElement.EndOfTrack)
                {
                    break;
                }

                RCT2TrackElements.RCT2TrackElement currentTrackPiece = td6Data.TrackData.TrackData[i].TrackElement;
                byte currentTrackByte = (byte)currentTrackPiece;

                byte qualifierByte = 0;
                //7 Bit - Chain lift
                if (td6Data.TrackData.TrackData[i].Qualifier.IsChainLift)
                {
                    qualifierByte |= 0x80;
                }

                //6 Bit - Inverted
                if (RCT2TrackElements.TrackElementPropertyMap[currentTrackPiece].InputTrackBank == RCT2TrackElementProperty.RCT2TrackBank.Flipped ||
                    RCT2TrackElements.TrackElementPropertyMap[currentTrackPiece].OutputTrackBank == RCT2TrackElementProperty.RCT2TrackBank.Flipped)
                {
                    qualifierByte |= 0x40;
                }

                //5 & 4 - Colour Scheme
                qualifierByte |= (byte)((td6Data.TrackData.TrackData[i].Qualifier.TrackColourSchemeNumber) << 4);

                //3, 2, 1 - Stations:
                if (td6Data.TrackData.TrackData[i].Qualifier.AtTerminalStation)
                {
                    qualifierByte |= 0x8;
                    qualifierByte |= (byte)td6Data.TrackData.TrackData[i].Qualifier.StationNumber;
                }
                else
                {
                    //Rotation value
                    qualifierByte |= (byte)td6Data.TrackData.TrackData[i].Qualifier.TrackRotation;
                }

                //Add to file
                Console.WriteLine("Adding Track Piece: " + currentTrackPiece.ToString() + ", with byte: " + currentTrackByte.ToString());
                Console.WriteLine("Adding Qualifier: " + qualifierByte.ToString());

                td6Bytes.Add(currentTrackByte);
                td6Bytes.Add(qualifierByte);
            }

            //End of track byte
            td6Bytes.Add(0xFF);

            //Add in the Entracne/Exit data
            //This is just entrance/exit data taken from an existing RCT2 TD6 file
            //With them next to each other on a two-station long area
            td6Bytes.Add(0x00);
            td6Bytes.Add(0x03);
            td6Bytes.Add(0x00);
            td6Bytes.Add(0x00);
            td6Bytes.Add(0x20);
            td6Bytes.Add(0x00);
            td6Bytes.Add(0x00);
            td6Bytes.Add(0x83);
            td6Bytes.Add(0xE0);
            td6Bytes.Add(0xFF);
            td6Bytes.Add(0x20);
            td6Bytes.Add(0x00);
            td6Bytes.Add(0xFF);
            td6Bytes.Add(0xFF);

            //Pad out to 24,735 which is the fixed length
            for (int i = td6Bytes.Count; i < TD6FileSize; i++)
            {
                td6Bytes.Add(dummyByte);
            }

            return(td6Bytes.ToArray());
        }
コード例 #4
0
        public RCT2RideData(RCT2RideData copy)
        {
            if (copy.TrackType != null)
            {
                TrackType = new RCT2RideCode(copy.TrackType);
            }
            else
            {
                TrackType = new RCT2RideCode();
            }

            if (copy.TrackData != null)
            {
                TrackData = new RCT2TrackData(copy.TrackData);
            }
            else
            {
                TrackData = new RCT2TrackData();
            }

            if (copy.RideFeatures != null)
            {
                RideFeatures = new RCT2RideFeatures(copy.RideFeatures);
            }
            else
            {
                RideFeatures = new RCT2RideFeatures();
            }
            OperatingMode = copy.OperatingMode;
            if (copy.ColourScheme != null)
            {
                ColourScheme = new RCT2VehicleColourScheme(copy.ColourScheme);
            }
            else
            {
                ColourScheme = new RCT2VehicleColourScheme();
            }
            EntranceStyle    = copy.EntranceStyle;
            AirTimeInSeconds = copy.AirTimeInSeconds;
            if (copy.DepartureFlags != null)
            {
                DepartureFlags = new RCT2DepartureControlFlags(copy.DepartureFlags);
            }
            else
            {
                DepartureFlags = new RCT2DepartureControlFlags();
            }
            NumberOfTrains            = copy.NumberOfTrains;
            NumberOfCarsPerTrain      = copy.NumberOfCarsPerTrain;
            MinWaitTimeInSeconds      = copy.MinWaitTimeInSeconds;
            MaxWaitTimeInSeconds      = copy.MaxWaitTimeInSeconds;
            SpeedOfPoweredLaunch      = copy.SpeedOfPoweredLaunch;
            NumberOfGoKartLaps        = copy.NumberOfGoKartLaps;
            MaxNumberOfPeopleMaze     = copy.MaxNumberOfPeopleMaze;
            MaxSpeedOfRide            = copy.MaxSpeedOfRide;
            AverageSpeedOfRide        = copy.AverageSpeedOfRide;
            RideLengthInMetres        = copy.RideLengthInMetres;
            PosGForce                 = copy.PosGForce;
            NegGForce                 = copy.NegGForce;
            LatGForce                 = copy.LatGForce;
            NumberOfInversions        = copy.NumberOfInversions;
            NumberOfDrops             = copy.NumberOfDrops;
            HighestDrop               = copy.HighestDrop;
            ExcitementTimesTen        = copy.ExcitementTimesTen;
            IntensityTimesTen         = copy.IntensityTimesTen;
            NauseaTimesTen            = copy.NauseaTimesTen;
            TrackMainColour           = copy.TrackMainColour;
            TrackMainColourAlt1       = copy.TrackMainColourAlt1;
            TrackMainColourAlt2       = copy.TrackMainColourAlt2;
            TrackMainColourAlt3       = copy.TrackMainColourAlt3;
            TrackAdditionalColour     = copy.TrackAdditionalColour;
            TrackAdditionalColourAlt1 = copy.TrackAdditionalColourAlt1;
            TrackAdditionalColourAlt2 = copy.TrackAdditionalColourAlt2;
            TrackAdditionalColourAlt3 = copy.TrackAdditionalColourAlt3;
            TrackSupportColour        = copy.TrackSupportColour;
            TrackSupportColourAlt1    = copy.TrackSupportColourAlt1;
            TrackSupportColourAlt2    = copy.TrackSupportColourAlt2;
            TrackSupportColourAlt3    = copy.TrackSupportColourAlt3;
            IsSixFlagsDesign          = copy.IsSixFlagsDesign;
            if (copy.DatFile != null)
            {
                DatFile = new DATFileHeader(copy.DatFile);
            }
            else
            {
                DatFile = new DATFileHeader();
            }
            if (copy.RequiredMapSpace != null)
            {
                RequiredMapSpace = new Vector2(copy.RequiredMapSpace);
            }
            else
            {
                RequiredMapSpace = new Vector2(0, 0);
            }
            LiftChainSpeed   = copy.LiftChainSpeed;
            NumberOfCircuits = copy.NumberOfCircuits;
        }