コード例 #1
0
ファイル: comm.cs プロジェクト: 12-South-Studios/smaug-cs
        public static string act_string(string format, CharacterInstance to, CharacterInstance ch, object arg1, object arg2, int flags)
        {
            var dontUpper = !format.StartsWith("$");

            int varPosition;
            var startIndex = 0;
            var sb         = new StringBuilder(format);
            var buffer     = string.Empty;

            do
            {
                const string chars = "$";
                var          anyOf = chars.ToCharArray();

                varPosition = sb.IndexOfAny(anyOf, startIndex);
                if (varPosition == -1)
                {
                    continue;
                }

                //// Is it a valid variable?
                var var = sb.Substring(varPosition, 2);
                if (!string.IsNullOrEmpty(var))
                {
                    CharacterInstance vch;
                    ObjectInstance    obj;

                    switch (var)
                    {
                    case "$t":
                        buffer = arg1.ToString();
                        break;

                    case "$T":
                        buffer = arg2.ToString();
                        break;

                    case "$n":
                        if (ch.CurrentMorph == null)
                        {
                            buffer = to != null?Macros.PERS(ch, to) : Macros.NAME(ch);
                        }
                        else if (!flags.IsSet(Program.STRING_IMM))
                        {
                            buffer = to != null?Macros.MORPHERS(ch, to) : MORPHNAME(ch);
                        }
                        else
                        {
                            buffer = $"(MORPH) {(to != null ? Macros.PERS(ch, to) : Macros.NAME(ch))}";
                        }
                        break;

                    case "$N":
                        vch = arg2.CastAs <CharacterInstance>();
                        if (vch.CurrentMorph == null)
                        {
                            buffer = to != null?Macros.PERS(vch, to) : Macros.NAME(vch);
                        }
                        else if (!flags.IsSet(Program.STRING_IMM))
                        {
                            buffer = to != null?Macros.MORPHERS(vch, to) : MORPHNAME(vch);
                        }
                        else
                        {
                            buffer = $"(MORPH) {(to != null ? Macros.PERS(vch, to) : Macros.NAME(vch))}";
                        }
                        break;

                    case "$e":
                        buffer = ch.Gender.SubjectPronoun();
                        break;

                    case "$E":
                        vch    = arg2.CastAs <CharacterInstance>();
                        buffer = vch.Gender.SubjectPronoun();
                        break;

                    case "$m":
                        buffer = ch.Gender.ObjectPronoun();
                        break;

                    case "$M":
                        vch    = arg2.CastAs <CharacterInstance>();
                        buffer = vch.Gender.ObjectPronoun();
                        break;

                    case "$s":
                        buffer = ch.Gender.PossessivePronoun();
                        break;

                    case "$S":
                        vch    = arg2.CastAs <CharacterInstance>();
                        buffer = vch.Gender.PossessivePronoun();
                        break;

                    case "$q":
                        buffer = to == ch ? "" : "s";
                        break;

                    case "$Q":
                        buffer = to == ch ? "your" : ch.Gender.PossessivePronoun();
                        break;

                    case "$p":
                        obj    = arg1.CastAs <ObjectInstance>();
                        buffer = to == null || to.CanSee(obj)
                                         ? obj_short(obj)
                                         : "something";
                        break;

                    case "$P":
                        obj    = arg2.CastAs <ObjectInstance>();
                        buffer = to == null || to.CanSee(obj)
                                         ? obj_short(obj)
                                         : "something";
                        break;

                    case "$d":
                        if (string.IsNullOrEmpty(arg2?.ToString()))
                        {
                            buffer = "door";
                        }
                        else
                        {
                            var tuple = arg2.ToString().FirstArgument();
                            buffer = tuple.Item1;
                        }
                        break;
                    }
                    sb.ReplaceFirst(var, buffer);
                }

                startIndex = varPosition + 1;
            }while (varPosition != -1);

            if (!dontUpper)
            {
                sb.CapitalizeFirst();
            }
            return(sb.ToString());
        }
コード例 #2
0
        public static void ShowToCharacter(this CharacterInstance victim, PlayerInstance ch)
        {
            var buffer = string.Empty;

            ch.SetColor(ATTypes.AT_PERSON);
            if (!victim.IsNpc())
            {
                if (victim.Switched == null)
                {
                    ch.SendTo("&P[(Link Dead)]");
                }
                else if (!victim.IsAffected(AffectedByTypes.Possess))
                {
                    buffer += "(Switched) ";
                }
            }

            if (victim.IsNpc() &&
                victim.IsAffected(AffectedByTypes.Possess) &&
                ch.IsImmortal() && ch.Switched != null)
            {
                buffer += "(" + victim.Switched.Name + ")";
            }

            if (!victim.IsNpc() && victim.Act.IsSet((int)PlayerFlags.AwayFromKeyboard))
            {
                buffer += PlayerFlags.AwayFromKeyboard.GetAttribute <DescriptorAttribute>().Messages.ToList()[0];
            }

            if ((!victim.IsNpc() && victim.Act.IsSet((int)PlayerFlags.WizardInvisibility)) ||
                (victim.IsNpc() && victim.Act.IsSet((int)ActFlags.MobInvisibility)))
            {
                if (!victim.IsNpc())
                {
                    buffer += $"(Invis {((PlayerInstance)victim).PlayerData.WizardInvisible}) ";
                }
                else
                {
                    buffer += $"(MobInvis {victim.MobInvisible}) ";
                }
            }

            if (!victim.IsNpc())
            {
                var vict = (PlayerInstance)victim;
                if (vict.IsImmortal() && vict.Level > LevelConstants.GetLevel(ImmortalTypes.Avatar))
                {
                    ch.SendTo("&P(&WImmortal&P) ");
                }
                if (vict.PlayerData.Clan != null &&
                    vict.PlayerData.Flags.IsSet(PCFlags.Deadly) &&
                    !string.IsNullOrEmpty(vict.PlayerData.Clan.Badge) &&
                    (vict.PlayerData.Clan.ClanType != ClanTypes.Order ||
                     vict.PlayerData.Clan.ClanType != ClanTypes.Guild))
                {
                    ch.PrintfColor("%s ", vict.PlayerData.Clan.Badge);
                }
                else if (vict.CanPKill() && vict.Level < LevelConstants.ImmortalLevel)
                {
                    ch.SendTo("&P(&wUnclanned&P) ");
                }
            }

            ch.SetColor(ATTypes.AT_PERSON);

            buffer += GenerateBufferForAffectedBy(victim, ch);

            ch.SetColor(ATTypes.AT_PERSON);
            if ((victim.CurrentPosition == victim.CurrentDefensivePosition && !string.IsNullOrEmpty(victim.LongDescription)) ||
                (victim.CurrentMorph?.Morph != null && victim.CurrentMorph.Morph.Position == (int)victim.CurrentPosition))
            {
                if (victim.CurrentMorph != null)
                {
                    if (!ch.IsImmortal())
                    {
                        if (victim.CurrentMorph.Morph != null)
                        {
                            buffer += victim.CurrentMorph.Morph.LongDescription;
                        }
                        else
                        {
                            buffer += victim.LongDescription;
                        }
                    }
                    else
                    {
                        buffer += Macros.PERS(victim, ch);
                        if (!victim.IsNpc() && !ch.Act.IsSet((int)PlayerFlags.Brief))
                        {
                            buffer += ((PlayerInstance)victim).PlayerData.Title;
                        }
                        buffer += ".\r\n";
                    }
                }
                else
                {
                    buffer += victim.LongDescription;
                }
                ch.SendTo(buffer);
                ch.ShowVisibleAffectsOn(victim);
                return;
            }

            if (victim.CurrentMorph?.Morph != null && !ch.IsImmortal())
            {
                buffer += Macros.MORPHERS(victim, ch);
            }
            else
            {
                buffer += Macros.PERS(victim, ch);
            }

            if (!victim.IsNpc() && !ch.Act.IsSet((int)PlayerFlags.Brief))
            {
                buffer += ((PlayerInstance)victim).PlayerData.Title;
            }

            var timer = ch.GetTimer(TimerTypes.DoFunction);

            if (timer != null)
            {
                var attributes = timer.Action.Value.Method.GetCustomAttributes(typeof(DescriptorAttribute), false);
                var attrib     =
                    (DescriptorAttribute)attributes.FirstOrDefault(x => x is DescriptorAttribute);
                buffer += attrib == null ? " is looking rather lost." : attrib.Messages.First();
            }
            else
            {
                buffer += GenerateBufferDescriptorFromVictimPosition(victim, ch);
            }

            buffer += "\r\n";
            buffer  = buffer.CapitalizeFirst();
            ch.SendTo(buffer);
            ch.ShowVisibleAffectsOn(victim);
        }