예제 #1
0
        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
        }
예제 #2
0
        public static ObjectInstance RawKill(this CharacterInstance ch, CharacterInstance victim)
        {
            var victimPc = (PlayerInstance)victim;

            if (victim.IsNotAuthorized())
            {
                LogManager.Instance.Bug("Killing unauthorized");
                return(null);
            }

            victim.StopFighting(true);

            if (victim.CurrentMorph != null)
            {
                UnmorphChar.do_unmorph_char(victim, string.Empty);
                return(ch.RawKill(victim));
            }

            MudProgHandler.ExecuteMobileProg(MudProgTypes.Death, ch, victim);
            if (victim.CharDied())
            {
                return(null);
            }

            MudProgHandler.ExecuteRoomProg(MudProgTypes.Death, victim);
            if (victim.CharDied())
            {
                return(null);
            }

            var corpse = ObjectFactory.CreateCorpse(victim, ch);

            switch (victim.CurrentRoom.SectorType)
            {
            case SectorTypes.OceanFloor:
            case SectorTypes.Underwater:
            case SectorTypes.ShallowWater:
            case SectorTypes.DeepWater:
                comm.act(ATTypes.AT_BLOOD, "$n's blood slowly clouds the surrounding water.", victim, null, null, ToTypes.Room);
                break;

            case SectorTypes.Air:
                comm.act(ATTypes.AT_BLOOD, "$n's blood sprays wildly through the air.", victim, null, null, ToTypes.Room);
                break;

            default:
                ObjectFactory.CreateBlood(victim);
                break;
            }

            if (victim.IsNpc())
            {
                ((MobileInstance)victim).MobIndex.TimesKilled++;
                victim.Extract(true);
                victim = null;
                return(corpse);
            }

            victim.SetColor(ATTypes.AT_DIEMSG);
            Help.do_help(victim,
                         ((PlayerInstance)victim).PlayerData.PvEDeaths + ((PlayerInstance)victim).PlayerData.PvPDeaths < 3 ? "new_death" : "_DIEMSG_");

            victim.Extract(false);

            while (victim.Affects.Count > 0)
            {
                victim.RemoveAffect(victim.Affects.First());
            }

            var victimRace = RepositoryManager.Instance.GetRace(victim.CurrentRace);

            victim.AffectedBy       = victimRace.AffectedBy;
            victim.Resistance       = 0;
            victim.Susceptibility   = 0;
            victim.Immunity         = 0;
            victim.CarryWeight      = 0;
            victim.ArmorClass       = 100 + victimRace.ArmorClassBonus;
            victim.Attacks          = victimRace.Attacks;
            victim.Defenses         = victimRace.Defenses;
            victim.ModStrength      = 0;
            victim.ModDexterity     = 0;
            victim.ModWisdom        = 0;
            victim.ModIntelligence  = 0;
            victim.ModConstitution  = 0;
            victim.ModCharisma      = 0;
            victim.ModLuck          = 0;
            victim.DamageRoll       = new DiceData();
            victim.HitRoll          = new DiceData();
            victim.MentalState      = -10;
            victim.CurrentAlignment = Macros.URANGE(-1000, victim.CurrentAlignment, 1000);
            victim.SavingThrows     = victimRace.SavingThrows;
            victim.CurrentPosition  = PositionTypes.Resting;
            victim.CurrentHealth    = Macros.UMAX(1, victim.CurrentHealth);
            victim.CurrentMana      = victim.Level < GetLevelAvatar() ? Macros.UMAX(1, victim.CurrentMana) : 1;
            victim.CurrentMovement  = Macros.UMAX(1, victim.CurrentMovement);

            if (victim.Act.IsSet((int)PlayerFlags.Killer))
            {
                victim.Act.RemoveBit((int)PlayerFlags.Killer);
                victim.SendTo("The gods have pardoned you for your murderous acts.");
            }

            if (victim.Act.IsSet((int)PlayerFlags.Thief))
            {
                victim.Act.RemoveBit((int)PlayerFlags.Thief);
                victim.SendTo("The gods have pardoned you for your thievery.");
            }

            victimPc.PlayerData.SetConditionValue(ConditionTypes.Full, 12);
            victimPc.PlayerData.SetConditionValue(ConditionTypes.Thirsty, 12);

            if (victimPc.IsVampire())
            {
                victimPc.PlayerData.SetConditionValue(ConditionTypes.Bloodthirsty, victim.Level / 2);
            }

            // TODO if (IS_SET(sysdata.save_flags, SV_DEATH))
            //      save_char_obj(victim);

            return(corpse);
        }