public override string Print(bool link = true, DwarfObject pov = null)
        {
            string eventString = GetYearTime();

            eventString += Improver != null?Improver.ToLink(link, pov) : "UNKNOWN HISTORICAL FIGURE";

            switch (ImprovementType)
            {
            case "art image":
                eventString += " added a masterful image";
                break;

            case "covered":
                eventString += " added a masterful covering";
                break;

            default:
                eventString += " added masterful ";
                if (!string.IsNullOrWhiteSpace(ImprovementSubType) && ImprovementSubType != "-1")
                {
                    eventString += ImprovementSubType;
                }
                else
                {
                    eventString += !string.IsNullOrWhiteSpace(ImprovementType) ? ImprovementType : "UNKNOWN ITEM";
                }
                break;
            }
            eventString += " in ";
            eventString += !string.IsNullOrWhiteSpace(ImprovementMaterial) ? ImprovementMaterial + " " : "";
            eventString += " to a ";
            eventString += !string.IsNullOrWhiteSpace(Material) ? Material + " " : "";
            if (!string.IsNullOrWhiteSpace(ItemSubType) && ItemSubType != "-1")
            {
                eventString += ItemSubType;
            }
            else
            {
                eventString += !string.IsNullOrWhiteSpace(ItemType) ? ItemType : "UNKNOWN ITEM";
            }
            eventString += " for ";
            eventString += ImproverEntity != null?ImproverEntity.ToLink(link, pov) : "UNKNOWN ENTITY";

            eventString += " at ";
            eventString += Site != null?Site.ToLink(link, pov) : "UNKNOWN SITE";

            eventString += PrintParentCollection(link, pov);
            eventString += ".";
            return(eventString);
        }
        public MasterpieceItemImprovement(List <Property> properties, World world)
            : base(properties, world)
        {
            foreach (Property property in properties)
            {
                switch (property.Name)
                {
                case "skill_at_time": SkillAtTime = Convert.ToInt32(property.Value); break;

                case "hfid": Improver = world.GetHistoricalFigure(Convert.ToInt32(property.Value)); break;

                case "entity_id": ImproverEntity = world.GetEntity(Convert.ToInt32(property.Value)); break;

                case "site_id": Site = world.GetSite(Convert.ToInt32(property.Value)); break;

                case "maker": if (Improver == null)
                    {
                        Improver = world.GetHistoricalFigure(Convert.ToInt32(property.Value));
                    }
                    else
                    {
                        property.Known = true;
                    } break;

                case "maker_entity": if (ImproverEntity == null)
                    {
                        ImproverEntity = world.GetEntity(Convert.ToInt32(property.Value));
                    }
                    else
                    {
                        property.Known = true;
                    } break;

                case "site": if (Site == null)
                    {
                        Site = world.GetSite(Convert.ToInt32(property.Value));
                    }
                    else
                    {
                        property.Known = true;
                    } break;

                case "skill_used": SkillAtTime = Convert.ToInt32(property.Value); break;

                case "item_type": ItemType = property.Value.Replace("_", " "); break;

                case "item_subtype": ItemSubType = property.Value.Replace("_", " "); break;

                case "mat": Material = property.Value.Replace("_", " "); break;

                case "mat_type": MaterialType = Convert.ToInt32(property.Value); break;

                case "mat_index": MaterialIndex = Convert.ToInt32(property.Value); break;

                case "improvement_type": ImprovementType = property.Value.Replace("_", " "); break;

                case "improvement_subtype": ImprovementSubType = property.Value.Replace("_", " "); break;

                case "imp_mat": ImprovementMaterial = property.Value.Replace("_", " "); break;

                case "imp_mat_type": ImprovementMaterialType = Convert.ToInt32(property.Value); break;

                case "imp_mat_index": ImprovementMaterialIndex = Convert.ToInt32(property.Value); break;

                case "art_id": ArtId = Convert.ToInt32(property.Value); break;

                case "art_subid": ArtSubId = Convert.ToInt32(property.Value); break;
                }
            }
            Improver.AddEvent(this);
            ImproverEntity.AddEvent(this);
            Site.AddEvent(this);
        }