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()); }
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); }