//========= CONSTRUCTORS =========
        #region Constructors

        /**<summary>Constructs the default object header.</summary>*/
        public AttractionHeader()
        {
            Reserved0x00 = 0;

            Flags         = AttractionFlags.None;
            TrackTypeList = new TrackTypes[3];
            for (int i = 0; i < TrackTypeList.Length; i++)
            {
                TrackTypeList[i] = TrackTypes.None;
            }

            MinCarsPerTrain = 0;
            MaxCarsPerTrain = 0;
            CarsPerFlatRide = 0;

            ZeroCars    = 0;
            CarTabIndex = 0;

            DefaultCarType = CarTypes.CarType0;
            FrontCarType   = CarTypes.None;
            SecondCarType  = CarTypes.None;
            RearCarType    = CarTypes.None;
            ThirdCarType   = CarTypes.None;

            Padding0x19 = 0;

            CarTypeList = new CarHeader[4];
            for (int i = 0; i < CarTypeList.Length; i++)
            {
                CarTypeList[i] = new CarHeader();
            }

            Excitement = 0;
            Intensity  = 0;
            Nausea     = 0;
            MaxHeight  = 0;

            AvailableTrackSections = TrackSections.None;

            RideCategory          = RideCategories.None;
            RideCategoryAlternate = RideCategories.None;
            SoldItem1             = ItemTypes.None;
            SoldItem2             = ItemTypes.None;
        }
        //=========== DRAWING ============
        #region Drawing

        /**<summary>Constructs the default object.</summary>*/
        public override bool Draw(PaletteImage p, Point position, DrawSettings drawSettings)
        {
            try {
                if (Header.RideCategory == RideCategories.Stall)
                {
                    graphicsData.paletteImages[3 + drawSettings.Rotation].DrawWithOffset(p, position, drawSettings.Darkness, false,
                                                                                         drawSettings.Remap1, RemapColors.None, RemapColors.None
                                                                                         );
                    if ((drawSettings.Rotation == 0 || drawSettings.Rotation == 3) && (Header.TrackType == TrackTypes.Restroom || Header.TrackType == TrackTypes.FirstAid))
                    {
                        graphicsData.paletteImages[3 + 4 + drawSettings.Rotation / 3].DrawWithOffset(p, position, drawSettings.Darkness, false,
                                                                                                     drawSettings.Remap1,
                                                                                                     RemapColors.None,
                                                                                                     RemapColors.None
                                                                                                     );
                    }
                }
                else
                {
                    int nextCarOffset = 0;
                    for (int i = 0; i <= (int)drawSettings.CurrentCar; i++)
                    {
                        CarHeader car = Header.CarTypeList[i];
                        int       C   = 0;                         // Offset for this car
                        int       R   = car.LastRotationFrame + 1; // number of rotation frames
                        int       F   = 1;                         // Number of frames per rotation
                        int       P   = car.RiderSprites;          // number of rider sprites
                        int       A   = 1;                         // number of animation frames
                        if (car.IsAnimated)
                        {
                            A = 4;
                        }
                        if (car.Flags.HasFlag(CarFlags.Spinning))
                        {
                            if (car.Flags.HasFlag(CarFlags.SpinningIndependantWheels))
                            {
                                F *= (car.LastRotationFrame + 1);
                            }
                        }
                        if (car.Flags.HasFlag(CarFlags.Swinging))
                        {
                            int swingingFrames = 5;
                            if (car.Flags.HasFlag(CarFlags.SwingingMoreFrames))
                            {
                                swingingFrames += 2;
                            }
                            if (car.Flags.HasFlag(CarFlags.SwingingSlide))
                            {
                                swingingFrames += 2;
                            }
                            if (car.Flags.HasFlag(CarFlags.SwingingTilting))
                            {
                                swingingFrames -= 2;
                            }
                            F *= swingingFrames;
                        }
                        if (car.SpecialFrames != 0)
                        {
                            F *= car.SpecialFrames;
                        }

                        if (i == (int)drawSettings.CurrentCar)
                        {
                            graphicsData.paletteImages[3 + nextCarOffset + drawSettings.Rotation * F * A + drawSettings.Frame].DrawWithOffset(p,
                                                                                                                                              position, drawSettings.Darkness, false,
                                                                                                                                              drawSettings.Remap1,
                                                                                                                                              (car.Flags.HasFlag(CarFlags.Remap2) ? drawSettings.Remap2 : RemapColors.None),
                                                                                                                                              (!car.Flags.HasFlag(CarFlags.NoRemap3) ? drawSettings.Remap3 : RemapColors.None));
                        }
                        else
                        {
                            if (car.SpriteFlags.HasFlag(CarSpriteFlags.Flat))
                            {
                                C += (R * F);
                            }
                            if (car.SpriteFlags.HasFlag(CarSpriteFlags.GentleSlopes))
                            {
                                C += ((4 * F) * 2) + ((R * F) * 2);
                            }
                            if (car.SpriteFlags.HasFlag(CarSpriteFlags.SteepSlopes))
                            {
                                C += ((8 * F) * 2) + ((R * F) * 2);
                            }
                            if (car.SpriteFlags.HasFlag(CarSpriteFlags.VerticalSlopes))
                            {
                                C += ((4 * F) * 2) + ((R * F) * 2) + (((4 * F) * 2) * 5) + (4 * F);
                            }
                            if (car.SpriteFlags.HasFlag(CarSpriteFlags.DiagonalSlopes))
                            {
                                C += ((4 * F) * 2) + ((4 * F) * 2) + ((4 * F) * 2);
                            }
                            if (car.SpriteFlags.HasFlag(CarSpriteFlags.FlatBanked))
                            {
                                C += ((8 * F) * 2) + ((R * F) * 2);
                            }
                            if (car.SpriteFlags.HasFlag(CarSpriteFlags.InlineTwists))
                            {
                                C += ((4 * F) * 10);
                            }
                            if (car.SpriteFlags.HasFlag(CarSpriteFlags.FlatToGentleSlopeBankedTransitions))
                            {
                                C += ((R * F) * 4);
                            }
                            if (car.SpriteFlags.HasFlag(CarSpriteFlags.DiagonalGentleSlopeBankedTransitions))
                            {
                                C += ((4 * F) * 4);
                            }
                            if (car.SpriteFlags.HasFlag(CarSpriteFlags.GentleSlopeBankedTransitions))
                            {
                                C += ((4 * F) * 4);
                            }
                            if (car.SpriteFlags.HasFlag(CarSpriteFlags.GentleSlopeBankedTurns))
                            {
                                C += ((R * F) * 4);
                            }
                            if (car.SpriteFlags.HasFlag(CarSpriteFlags.FlatToGentleSlopeWhileBankedTransitions))
                            {
                                C += ((4 * F) * 4);
                            }
                            if (car.SpriteFlags.HasFlag(CarSpriteFlags.Corkscrews))
                            {
                                C += ((4 * F) * 20);
                            }
                            if (car.SpriteFlags.HasFlag(CarSpriteFlags.RestraintAnimation))
                            {
                                C += ((4 * F) * 3);
                            }

                            C             *= (P + 1 * A);
                            nextCarOffset += C;
                        }
                    }
                }
            }
            catch (IndexOutOfRangeException) { return(false); }
            catch (ArgumentOutOfRangeException) { return(false); }
            return(true);
        }