public static void char_update() { //lc = trworld_create(TR_CHAR_WORLD_BACK) foreach (var ch in RepositoryManager.Instance.CHARACTERS.Values) { handler.CurrentCharacter = ch; if (!ch.IsNpc()) { MudProgHandler.ExecuteRoomProg(MudProgTypes.Random, ch); } if (ch.CharDied()) { continue; } if (ch.IsNpc()) { MudProgHandler.ExecuteMobileProg(MudProgTypes.Time, ch); } if (ch.CharDied()) { continue; } MudProgHandler.ExecuteRoomProg(MudProgTypes.Time, ch); if (ch.CharDied()) { continue; } CharacterInstance ch_save = null; if (!ch.IsNpc() && (((PlayerInstance)ch).Descriptor == null || ((PlayerInstance)ch).Descriptor.ConnectionStatus == ConnectionTypes.Playing) && ch.Level >= 2 && CheckSaveFrequency(ch)) { ch_save = ch; } if ((int)ch.CurrentPosition >= (int)PositionTypes.Stunned) { if (ch.CurrentHealth < ch.MaximumHealth) { ch.CurrentHealth += ch.HealthGain(); } if (ch.CurrentMana < ch.MaximumMana) { ch.CurrentMana += ch.ManaGain(); } if (ch.CurrentMovement < ch.MaximumMovement) { ch.CurrentMovement += ch.MovementGain(); } } if (ch.CurrentPosition == PositionTypes.Stunned) { ch.UpdatePositionByCurrentHealth(); } // TODO Variables if (ch.CurrentMorph?.timer > 0) { --ch.CurrentMorph.timer; if (ch.CurrentMorph.timer == 0) { UnmorphChar.do_unmorph_char(ch, string.Empty); } } // TODO Nuisance if (!ch.IsNpc() && ch.Level < LevelConstants.ImmortalLevel) { var obj = ch.GetEquippedItem(WearLocations.Light); if (obj != null && obj.ItemType == ItemTypes.Light && obj.Value.ToList()[2] > 0) { ProcessLightObject(ch, obj); } if (++ch.Timer >= 12) { ProcessIdle(ch); } if (((PlayerInstance)ch).PlayerData.GetConditionValue(ConditionTypes.Drunk) > 8) { ((PlayerInstance)ch).WorsenMentalState(((PlayerInstance)ch).PlayerData.GetConditionValue(ConditionTypes.Drunk) / 8); } if (((PlayerInstance)ch).PlayerData.GetConditionValue(ConditionTypes.Full) > 1) { // todo fix this //IEnumerable<MentalStateAttribute> attribs = // ch.CurrentPosition.GetAttributes<MentalStateAttribute>(); //if (attribs.Any()) //{ // MentalStateAttribute attrib = // attribs.FirstOrDefault(x => x.Condition.HasFlag(ConditionTypes.Full)); // ch.ImproveMentalState(attrib == null ? 1 : attrib.ModValue); //} } if (((PlayerInstance)ch).PlayerData.GetConditionValue(ConditionTypes.Thirsty) > 1) { // todo fix this //IEnumerable<MentalStateAttribute> attribs = // ch.CurrentPosition.GetAttributes<MentalStateAttribute>(); //if (attribs.Any()) //{ // MentalStateAttribute attrib = // attribs.FirstOrDefault(x => x.Condition.HasFlag(ConditionTypes.Thirsty)); // ch.ImproveMentalState(attrib == null ? 1 : attrib.ModValue); //} } ch.CheckAlignment(); ((PlayerInstance)ch).GainCondition(ConditionTypes.Drunk, -1); var race = RepositoryManager.Instance.GetRace(ch.CurrentRace); ((PlayerInstance)ch).GainCondition(ConditionTypes.Full, -1 + race.HungerMod); if (ch.IsVampire() && ch.Level >= 10) { if (GameManager.Instance.GameTime.Hour < 21 && GameManager.Instance.GameTime.Hour >= 10) { ((PlayerInstance)ch).GainCondition(ConditionTypes.Bloodthirsty, -1); } } if (ch.CanPKill() && ((PlayerInstance)ch).PlayerData.GetConditionValue(ConditionTypes.Thirsty) - 9 > 10) { ((PlayerInstance)ch).GainCondition(ConditionTypes.Thirsty, -9); } // TODO Nuisance } if (!ch.IsNpc() && !ch.IsImmortal() && ((PlayerInstance)ch).PlayerData.release_date > DateTime.MinValue && ((PlayerInstance)ch).PlayerData.release_date <= DateTime.Now) { var location = RepositoryManager.Instance.ROOMS.Get(((PlayerInstance)ch).PlayerData.Clan?.RecallRoom ?? VnumConstants.ROOM_VNUM_TEMPLE) ?? ch.CurrentRoom; ch.CurrentRoom.RemoveFrom(ch); location.AddTo(ch); ch.SendTo("The gods have released you from hell as your sentence is up!"); Look.do_look(ch, "auto"); ((PlayerInstance)ch).PlayerData.helled_by = string.Empty; ((PlayerInstance)ch).PlayerData.release_date = DateTime.MinValue; save.save_char_obj(ch); } if (!ch.CharDied()) { if (ch.IsAffected(AffectedByTypes.Poison)) { comm.act(ATTypes.AT_POISON, "$n shivers and suffers.", ch, null, null, ToTypes.Room); comm.act(ATTypes.AT_POISON, "You shiver and suffer.", ch, null, null, ToTypes.Character); var minMentalState = CalculateMinMentalStateWhilePoisoned(ch); ch.MentalState = 20.GetNumberThatIsBetween(minMentalState, 100); ch.CauseDamageTo(ch, 6, RepositoryManager.Instance.LookupSkill("poison")); } else { switch (ch.CurrentPosition) { case PositionTypes.Incapacitated: ch.CauseDamageTo(ch, 1, Program.TYPE_UNDEFINED); break; case PositionTypes.Mortal: ch.CauseDamageTo(ch, 4, Program.TYPE_UNDEFINED); break; } } if (ch.CharDied()) { continue; } if (ch.IsAffected(AffectedByTypes.RecurringSpell)) { var died = false; var found = false; foreach (var paf in ch.Affects.Where(x => x.Location == ApplyTypes.RecurringSpell)) { found = true; if (Macros.IS_VALID_SN(paf.Modifier)) { var skill = RepositoryManager.Instance.SKILLS.Get(paf.Modifier); if (skill == null || skill.Type != SkillTypes.Spell) { continue; } var retCode = skill.SpellFunction.Value.Invoke(paf.Modifier, ch.Level, ch, ch); if (retCode == ReturnTypes.CharacterDied || ch.CharDied()) { died = true; break; } } } if (died) { continue; } if (!found) { ch.AffectedBy.RemoveBit((int)AffectedByTypes.RecurringSpell); } } if (ch.MentalState >= 30) { var val = (ch.MentalState + 5) / 10; if (HighMentalStateTable.ContainsKey(val)) { ch.SendTo(HighMentalStateTable[val].Key); comm.act(ATTypes.AT_ACTION, HighMentalStateTable[val].Value, ch, null, null, ToTypes.Room); } } if (ch.MentalState <= -30) { var val = (Math.Abs(ch.MentalState) + 5) / 10; if (LowMentalStateTable.ContainsKey(val)) { if (val > 7) { if ((int)ch.CurrentPosition > (int)PositionTypes.Sleeping) { if ((ch.CurrentPosition == PositionTypes.Standing || (int)ch.CurrentPosition < (int)PositionTypes.Fighting) && (SmaugRandom.D100() + (100 - val * 10) + 10 < Math.Abs(ch.MentalState))) { Sleep.do_sleep(ch, string.Empty); } else { ch.SendTo(LowMentalStateTable[val]); } } } else { if ((int)ch.CurrentPosition > (int)PositionTypes.Resting) { ch.SendTo(LowMentalStateTable[val]); } } } } if (ch.Timer > 24) { Quit.do_quit(ch, string.Empty); } else if (ch == ch_save && GameManager.Instance.SystemData.SaveFlags.IsSet(AutoSaveFlags.Auto)) { save.save_char_obj(ch); } } } //trowlrd_dispose }