public EffectsMapObject(Map map, int x1, int y1, int x2, int y2)
            : base(map, x1, y1, x2, y2)
        {
            m_SpringDate = new DatePropsObject();
            m_SummerDate = new DatePropsObject();
            m_FallDate = new DatePropsObject();
            m_WinterDate = new DatePropsObject();

            m_SpringDate.Season = Season.Spring;
            m_SummerDate.Season = Season.Summer;
            m_FallDate.Season = Season.Fall;
            m_WinterDate.Season = Season.Winter;
        }
        public Season GetLateralSeason(Map map, int x, int y)
        {
            if (!Data.UseSeasons || !m_UseSeasons || !IsIn(map, x, y) || ContainsInvalidDate())
            {
                return Season.None;
            }

            DatePropsObject[] dpos = new DatePropsObject[]
            {
                m_SpringDate,
                m_SummerDate,
                m_FallDate,
                m_WinterDate
            };

            Season season = Season.None;

            DatePropsObject dateProps = new DatePropsObject();

            for (int i = 0; i < dpos.Length; i++)
            {
                DatePropsObject dpo = dpos[i];

                if ((dpo.Month == dateProps.Month && dpo.Day > dateProps.Day) || dpo.Month > dateProps.Month)
                {
                    dateProps.Month = dpo.Month;
                    dateProps.Day = dpo.Day;

                    season = dpo.Season;

                    if (UseLatitude)
                    {
                        int height = Y2 - Y1;

                        int middleLatitude = Y1 + (int)(height / 2);

                        if (y > middleLatitude)
                        {
                            season = dpo.OppositeSeason();
                        }
                    }
                }
            }

            int month = 0, day = 0;

            TimeEngine.GetTimeMonthDay(map, x, out month, out day);

            int setMonth = 0;

            for (int i = 0; i < dpos.Length; i++)
            {
                DatePropsObject dpo = dpos[i];

                int seasonMonth = dpo.Month;
                int seasonDay = dpo.Day;

                if ((month == seasonMonth && day >= seasonDay) || month > seasonMonth)
                {
                    if (setMonth <= seasonMonth)
                    {
                        setMonth = seasonMonth;

                        season = dpo.Season;

                        if (UseLatitude)
                        {
                            int height = Y2 - Y1;

                            int middleLatitude = Y1 + (int)(height / 2);

                            if (y > middleLatitude)
                            {
                                season = dpo.OppositeSeason();
                            }
                        }
                    }
                }
            }

            return season;
        }
        public bool ContainsInvalidDate()
        {
            DatePropsObject[] dpos = new DatePropsObject[]
            {
                m_SpringDate,
                m_SummerDate,
                m_FallDate,
                m_WinterDate
            };

            for (int i = 0; i < dpos.Length; i++)
            {
                DatePropsObject dpo = dpos[i];

                if (dpo != null)
                {
                    if (!IsValidDate(dpo.Month, dpo.Day))
                    {
                        return true;
                    }
                }
                else
                {
                    return true;
                }
            }

            return false;
        }