public static void appraise_all(CharacterInstance ch, MobileInstance keeper, string fixstr)
        {
            int    total = 0, cost = 0;
            string buffer;

            foreach (var obj in ch.Carrying.Where(obj => obj.WearLocation == WearLocations.None &&
                                                  ch.CanSee(obj) &&
                                                  (obj.ItemType.GetAttribute <ValuedAttribute>() != null)))
            {
                if (!ch.CanDrop(obj))
                {
                    ch.Printf("You can't let go of %s.", obj.Name);
                    continue;
                }

                if ((cost = Appraise.GetAdjustedRepairCost(keeper, obj)) > 0)
                {
                    comm.act(ATTypes.AT_TELL,
                             cost != -2
                            ? "$n tells you, 'Sorry, I can't do anything with $p.'"
                            : "$n tells you, '$p looks fine to me!'", keeper, obj, ch, ToTypes.Victim);
                    continue;
                }

                buffer =
                    $"$N tells you, 'It will cost {cost} piece{(cost == 1 ? "" : "s")} of gold to {fixstr} {obj.Name}.'";
                comm.act(ATTypes.AT_TELL, buffer, ch, null, keeper, ToTypes.Character);
                total += cost;
            }

            if (total <= 0)
            {
                return;
            }

            ch.SendTo("\r\n");

            buffer = $"$N tells you, 'It will cost {total} piece{(cost == 1 ? "" : "s")} of gold in total.'";
            comm.act(ATTypes.AT_TELL, buffer, ch, null, keeper, ToTypes.Character);
            comm.act(ATTypes.AT_TELL, "$N tells you, 'Remember there is a 10% surcharge for repairing all your items.", ch, null, keeper, ToTypes.Character);
        }
        public static void repair_one_obj(CharacterInstance ch, MobileInstance keeper, ObjectInstance obj,
                                          string arg, int maxgold, string fixstr, string fixstr2)
        {
            int    cost;
            string buffer;

            if (!ch.CanDrop(obj))
            {
                ch.Printf("You can't let go of %s.\r\n", obj.Name);
            }
            else if ((cost = Appraise.GetAdjustedRepairCost(keeper, obj)) < 0)
            {
                if (cost < 0)
                {
                    comm.act(ATTypes.AT_TELL,
                             cost != -2
                                 ? "$n tells you, 'Sorry, I can't do anything with $p.'"
                                 : "$n tells you, '$p looks fine to me!'", keeper, obj, ch, ToTypes.Victim);
                }
            }

            // repair all gets a 10% surcharge
            else if ((cost = arg.Equals("all") ? cost : 11 * (cost / 10)) > ch.CurrentCoin)
            {
                buffer =
                    $"$N tells you, 'It will cost {cost} piece{(cost == 1 ? "" : "s")} of gold to {fixstr} {obj.Name}...'";
                comm.act(ATTypes.AT_TELL, buffer, ch, null, keeper, ToTypes.Character);
                comm.act(ATTypes.AT_TELL, "$n tells you, 'Which I see you can't afford.'", ch, null, keeper, ToTypes.Character);
            }
            else
            {
                buffer = $"$n gives $p to $N, who quickly {fixstr2} it.";
                comm.act(ATTypes.AT_ACTION, buffer, ch, obj, keeper, ToTypes.Room);

                buffer = $"$n charges you {cost} gold piece{(cost == 1 ? "" : "s")} to {fixstr} $p.";
                comm.act(ATTypes.AT_ACTION, buffer, ch, obj, keeper, ToTypes.Character);

                ch.CurrentCoin     -= cost;
                keeper.CurrentCoin += cost;

                if (keeper.CurrentCoin < 0)
                {
                    keeper.CurrentCoin = 0;
                }
                else if (keeper.CurrentCoin > maxgold)
                {
                    keeper.CurrentRoom.Area.BoostEconomy(keeper.CurrentCoin - maxgold / 2);
                    keeper.CurrentCoin = maxgold / 2;
                    comm.act(ATTypes.AT_ACTION, "$n puts some gold into a large safe.", keeper, null, null, ToTypes.Room);
                }

                switch (obj.ItemType)
                {
                default:
                    ch.SendTo("For some reason, you think you got ripped off...");
                    break;

                case ItemTypes.Armor:
                    obj.Values.CurrentAC = obj.Values.OriginalAC;
                    break;

                case ItemTypes.Weapon:
                    obj.Values.Condition = GameConstants.GetConstant <int>("InitWeaponCondition");
                    break;

                case ItemTypes.Wand:
                case ItemTypes.Staff:
                    obj.Values.Charges = obj.Values.MaxCharges;
                    break;
                }

                MudProgHandler.ExecuteObjectProg(MudProgTypes.Repair, ch, obj);
            }
        }