Esempio n. 1
0
        public void Initiate()
        {
            // Get the current date time
            int currentUnixTime = Utility.Utils.GetUnixTime();

            // Load:
            // Notices
            List <SMNotices> smn        = new List <SMNotices>();
            string           getNotices = Utility.Utils.GetFileJSON("Pulse", "Notices");

            if (getNotices != null)
            {
                smn = JsonConvert.DeserializeObject <List <SMNotices> >(getNotices);
            }
            HttpContext.Current.Application["SMNotices"] = smn;

            // DayInformation
            SMDay  smd = new SMDay();
            string getDayNightDetails = Utility.Utils.GetFileJSON("Pulse", "Day");

            if (getDayNightDetails != null)
            {
                smd = JsonConvert.DeserializeObject <SMDay>(getDayNightDetails);
            }
            HttpContext.Current.Application["SMDay"] = smd;

            HttpContext.Current.Application["CurrentDay"] = 1;
            this.LastUpdate = currentUnixTime;
            this.TimeOfDay  = 150;
            HttpContext.Current.Application["DayOrNight"] = "D";

            // TODO Load More Data
            // Seasons
            // Weather
            // MonthInformation
            // Load the last world data

            // Begin the Pulses
            Pulse();
        }
Esempio n. 2
0
        /// <summary>
        /// Pulse the world
        /// </summary>
        public void Pulse()
        {
            // Work out the start time
            int currentUnixTime = Utility.Utils.GetUnixTime();

            // Get ingame date time info
            SMDay smd = new SMDay();

            smd = (SMDay)HttpContext.Current.Application["SMDay"];
            int totalDayNightHours          = 24 / (smd.LengthOfDay + smd.LengthOfNight);
            int numberOfMinutesPerGameDay   = totalDayNightHours * 60;
            int numberOfMinutesPerDayTime   = (numberOfMinutesPerGameDay / (smd.LengthOfDay + smd.LengthOfNight)) * smd.LengthOfDay;
            int numberOfMinutesPerNightTime = (numberOfMinutesPerGameDay / (smd.LengthOfDay + smd.LengthOfNight)) * smd.LengthOfNight;

            List <SMNotices> smn = (List <SMNotices>)HttpContext.Current.Application["SMNotices"];

            // Update in game time
            int    newTime    = this.TimeOfDay + (Utility.Utils.GetDifferenceBetweenUnixTimestampsInMinutes(this.LastUpdate, currentUnixTime) * totalDayNightHours);
            string dayOrNight = HttpContext.Current.Application["DayOrNight"].ToString();

            if (newTime > numberOfMinutesPerGameDay)
            {
                string noticeS = smn.FirstOrDefault(notice => notice.NoticeType == "DayStart").Notice ?? "A new day begins...";
                newTime = newTime - numberOfMinutesPerGameDay;
                new SlackMud().BroadcastMessage(ResponseFormatterFactory.Get().Italic(noticeS));
                HttpContext.Current.Application["DayOrNight"] = "D";
            }
            else if ((newTime > numberOfMinutesPerDayTime) && (HttpContext.Current.Application["DayOrNight"].ToString() != "N"))
            {
                string noticeS = smn.FirstOrDefault(notice => notice.NoticeType == "NightStart").Notice ?? "Night falls";
                new SlackMud().BroadcastMessage(ResponseFormatterFactory.Get().Italic(noticeS));
                HttpContext.Current.Application["DayOrNight"] = "N";
            }

            // Update the variables
            this.LastUpdate = currentUnixTime;
            this.TimeOfDay  = newTime;

            // NPC Cycles in the game world
            List <SMNPC> smnpcl = new List <SMNPC>();

            smnpcl = (List <SMNPC>)HttpContext.Current.Application["SMNPCs"];

            if (smnpcl != null)
            {
                smnpcl = smnpcl.FindAll(npc => npc.NPCResponses.Count(response => response.ResponseType == "Pulse") > 0);
                if (smnpcl != null)
                {
                    foreach (SMNPC npc in smnpcl)
                    {
                        npc.RespondToAction("Pulse", null);
                    }
                }
            }

            // Spawns
            // Find all rooms that are in memory that could have a spawn
            List <SMRoom> smrl = new List <SMRoom>();

            smrl = (List <SMRoom>)HttpContext.Current.Application["SMRooms"];

            // If there are any rooms in memory...
            if (smrl != null)
            {
                // ... find the rooms that have any possible NPC spawns.
                List <SMRoom> roomsWithNPCSpawns = smrl.FindAll(room => room.NPCSpawns != null);
                if (roomsWithNPCSpawns != null)
                {
                    // loop around the rooms
                    foreach (SMRoom smr in roomsWithNPCSpawns)
                    {
                        // Check whether there are any spawns.
                        smr.Spawn();
                    }
                }

                // ... find the rooms that have any possible Item spawns.
                List <SMRoom> roomsWithItemSpawns = smrl.FindAll(room => room.ItemSpawns != null);
                if (roomsWithItemSpawns != null)
                {
                    // loop around the rooms
                    foreach (SMRoom smr in roomsWithItemSpawns)
                    {
                        // Check whether there are any spawns.
                        smr.ItemSpawn();
                    }
                }
            }

            // TODO Randonly decide whether the weather effect will change.


            // Find all players
            List <SMCharacter> lsmc = (List <SMCharacter>)HttpContext.Current.Application["SMCharacters"];

            foreach (SMCharacter c in lsmc.ToList())
            {
                // Remove any attribute effects that have expired
                if (c.Attributes.Effects != null)
                {
                    int currentTime = Utility.Utils.GetUnixTime();
                    c.Attributes.Effects.RemoveAll(e => e.EffectLength <= currentTime);
                }

                // Hurt.
                if (c.Attributes.HitPoints < c.Attributes.MaxHitPoints)
                {
                    Random rNumber = new Random();
                    double rDouble = (rNumber.NextDouble() * 100);

                    if (rDouble <= 5)
                    {
                        c.Attributes.HitPoints++;
                        if (c.Attributes.Effects != null)
                        {
                            List <SMEffect> smel = c.Attributes.Effects.FindAll(e => e.EffectType.ToLower() == "Healing Rate".ToLower());

                            if (smel != null)
                            {
                                int increasedHealingRate = 0;

                                foreach (SMEffect sme in smel)
                                {
                                    increasedHealingRate += int.Parse(sme.AdditionalData);
                                }

                                c.Attributes.HitPoints = c.Attributes.HitPoints + increasedHealingRate;
                            }
                        }
                        c.SaveToApplication();
                        c.SaveToFile();
                    }
                }

                // ... remove any daily quests that have expired.
                if (c.QuestLog != null)
                {
                    c.QuestLog.RemoveAll(qs => ((qs.Completed == true) && (qs.Daily == true) && (Utility.Utils.GetDifferenceBetweenUnixTimestamps(qs.LastDateUpdated, Utility.Utils.GetUnixTime()) > 86400)));
                    c.SaveToApplication();
                    c.SaveToFile();
                }
            }

            // Work out the end time
            // If less than two minutes
            // Let the thread sleep for the remainder of the time
            int timeToWait = Utility.Utils.GetDifferenceBetweenUnixTimestamps(currentUnixTime, Utility.Utils.GetUnixTime());

            // If the time between the pulses is less than two minutes...
            if (timeToWait < (120 * 1000))
            {
                // ... send the thread to sleep
                Thread.Sleep((120 * 1000) - timeToWait);
            }

            // Recall the pulse.
            Pulse();
        }
Esempio n. 3
0
        /// <summary>
        /// Pulse the world
        /// </summary>
        public void Pulse()
        {
            // Work out the start time
            int currentUnixTime = Utility.Utils.GetUnixTime();

            // Get ingame date time info
            SMDay smd = new SMDay();

            smd = (SMDay)HttpContext.Current.Application["SMDay"];
            int totalDayNightHours          = 24 / (smd.LengthOfDay + smd.LengthOfNight);
            int numberOfMinutesPerGameDay   = totalDayNightHours * 60;
            int numberOfMinutesPerDayTime   = (numberOfMinutesPerGameDay / (smd.LengthOfDay + smd.LengthOfNight)) * smd.LengthOfDay;
            int numberOfMinutesPerNightTime = (numberOfMinutesPerGameDay / (smd.LengthOfDay + smd.LengthOfNight)) * smd.LengthOfNight;

            List <SMNotices> smn = (List <SMNotices>)HttpContext.Current.Application["SMNotices"];

            // Update in game time
            int    newTime    = this.TimeOfDay + (Utility.Utils.GetDifferenceBetweenUnixTimestampsInMinutes(this.LastUpdate, currentUnixTime) * totalDayNightHours);
            string dayOrNight = HttpContext.Current.Application["DayOrNight"].ToString();

            if (newTime > numberOfMinutesPerGameDay)
            {
                string noticeS = smn.FirstOrDefault(notice => notice.NoticeType == "DayStart").Notice ?? "A new day begins...";
                newTime = newTime - numberOfMinutesPerGameDay;
                new SlackMud().BroadcastMessage(OutputFormatterFactory.Get().Italic(noticeS));
                HttpContext.Current.Application["DayOrNight"] = "D";
            }
            else if ((newTime > numberOfMinutesPerDayTime) && (HttpContext.Current.Application["DayOrNight"].ToString() != "N"))
            {
                string noticeS = smn.FirstOrDefault(notice => notice.NoticeType == "NightStart").Notice ?? "Night falls";
                new SlackMud().BroadcastMessage(OutputFormatterFactory.Get().Italic(noticeS));
                HttpContext.Current.Application["DayOrNight"] = "N";
            }

            // Update the variables
            this.LastUpdate = currentUnixTime;
            this.TimeOfDay  = newTime;

            // NPC Cycles in the game world
            List <SMNPC> smnpcl = new List <SMNPC>();

            smnpcl = (List <SMNPC>)HttpContext.Current.Application["SMNPCs"];

            if (smnpcl != null)
            {
                smnpcl = smnpcl.FindAll(npc => npc.NPCResponses.Count(response => response.ResponseType == "Pulse") > 0);
                if (smnpcl != null)
                {
                    foreach (SMNPC npc in smnpcl)
                    {
                        npc.RespondToAction("Pulse", null);
                    }
                }
            }

            // Spawns
            // Find all rooms that are in memory that could have a spawn
            List <SMRoom> smrl = new List <SMRoom>();

            smrl = (List <SMRoom>)HttpContext.Current.Application["SMRooms"];

            // If there are any rooms in memory...
            if (smrl != null)
            {
                // ... find the rooms that have any possible spawns.
                smrl = smrl.FindAll(room => room.NPCSpawns != null);
                if (smrl != null)
                {
                    // loop around the rooms
                    foreach (SMRoom smr in smrl)
                    {
                        // Check whether there are any spawns.
                        smr.Spawn();
                    }
                }
            }

            // TODO Randonly decide whether the weather effect will change.


            // Work out the end time
            // If less than two minutes
            // Let the thread sleep for the remainder of the time
            int timeToWait = Utility.Utils.GetDifferenceBetweenUnixTimestamps(currentUnixTime, Utility.Utils.GetUnixTime());

            // If the time between the pulses is less than two minutes...
            if (timeToWait < (120 * 1000))
            {
                // ... send the thread to sleep
                Thread.Sleep((120 * 1000) - timeToWait);
            }

            // Recall the pulse.
            Pulse();
        }