diff --git a/AideDeJeu/AideDeJeu/AideDeJeu.csproj b/AideDeJeu/AideDeJeu/AideDeJeu.csproj index 1aeecfb7..cc51b1a9 100644 --- a/AideDeJeu/AideDeJeu/AideDeJeu.csproj +++ b/AideDeJeu/AideDeJeu/AideDeJeu.csproj @@ -327,6 +327,10 @@ + + + + MSBuild:UpdateDesignTimeXaml diff --git a/AideDeJeu/AideDeJeu/Markdig/MarkdownExtensions.cs b/AideDeJeu/AideDeJeu/Markdig/MarkdownExtensions.cs index 5d14c993..e137507f 100644 --- a/AideDeJeu/AideDeJeu/Markdig/MarkdownExtensions.cs +++ b/AideDeJeu/AideDeJeu/Markdig/MarkdownExtensions.cs @@ -10,11 +10,219 @@ using Markdig.Parsers; using System.IO; using Markdig.Renderers.Normalize; using Markdig.Renderers.Normalize.Inlines; +using System.Reflection; namespace AideDeJeu.Tools { public static class MarkdownExtensions { + public static Item ToItem(string md) + { + var pipeline = new MarkdownPipelineBuilder().UsePipeTables().Build(); + var document = MarkdownParser.Parse(md, pipeline); + + var enumerator = document.GetEnumerator(); + try + { + enumerator.MoveNext(); + while (enumerator.Current != null) + { + var block = enumerator.Current; + + if (block is HtmlBlock) + { + if (block.IsNewItem()) + { + var item = ParseItem(ref enumerator); + return item; + } + } + enumerator.MoveNext(); + } + + } + finally + { + enumerator.Dispose(); + } + return null; + } + + public static Item ParseItem(ref ContainerBlock.Enumerator enumerator) + { + var currentItem = enumerator.Current.GetNewItem(); + //item.Parse(ref enumerator); + + enumerator.MoveNext(); + while (enumerator.Current != null) + { + var block = enumerator.Current; + + if (block is HtmlBlock) + { + if (block.IsClosingItem()) + { + return currentItem; + } + else if (block.IsNewItem()) + { + var subItem = ParseItem(ref enumerator); + + var propertyName = subItem.GetType().Name; + + if (currentItem.GetType().GetProperty(propertyName) != null) + { + PropertyInfo prop = currentItem.GetType().GetProperty(propertyName, BindingFlags.Public | BindingFlags.Instance); + if (null != prop && prop.CanWrite) + { + prop.SetValue(currentItem, subItem, null); + } + } + else if (currentItem is Items) + { + var items = currentItem as Items; + items.Add(subItem); + } + } + } + + else // if (block is ContainerBlock) + { + ParseItemProperties(currentItem, block); + //var listBlock = block as ContainerBlock; + //foreach (var inblock in listBlock) + //{ + // if (inblock is ListItemBlock) + // { + // var listItemBlock = inblock as ListItemBlock; + // foreach (var ininblock in listItemBlock) + // { + // if (ininblock is ParagraphBlock) + // { + // var parBlock = ininblock as ParagraphBlock; + // ParseItemProperties(currentItem, parBlock.Inline); + // } + // } + // } + //} + } + + currentItem.Markdown += enumerator.Current.ToMarkdownString(); + + enumerator.MoveNext(); + } + + // bad ! + return currentItem; + } + + public static void ParseItemProperties(Item item, Block block) + { + switch(block) + { + case ContainerBlock blocks: + ParseItemProperties(item, blocks); + break; + case LeafBlock leaf: + ParseItemProperties(item, leaf.Inline); + break; + } + } + + public static void ParseItemProperties(Item item, ContainerBlock blocks) + { + foreach(var block in blocks) + { + ParseItemProperties(item, block); + } + } + + public static void ParseItemProperties(Item item, ContainerInline inlines) + { + PropertyInfo prop = null; + foreach (var inline in inlines) + { + if(inline is HtmlInline) + { + var tag = (inline as HtmlInline).Tag; + if (tag.StartsWith(">("AltName: ", (m, s) => { - this.Text += "- " + s; m.AltName = s; + this.Markdown += "- " + s; m.AltName = s; }), new Tuple>("", (m, s) => { - this.Text += "- " + str; + this.Markdown += "- " + str; }), }; @@ -78,16 +78,16 @@ namespace AideDeJeuLib } } } - this.Text += "\n"; + this.Markdown += "\n"; } else { - this.Text += block.ToMarkdownString(); + this.Markdown += block.ToMarkdownString(); } } else { - this.Text += block.ToMarkdownString(); + this.Markdown += block.ToMarkdownString(); } } public override void Parse(ref ContainerBlock.Enumerator enumerator) diff --git a/AideDeJeu/AideDeJeu/Models/Equipment.cs b/AideDeJeu/AideDeJeu/Models/Equipment.cs index f3c53c7a..d4695e4c 100644 --- a/AideDeJeu/AideDeJeu/Models/Equipment.cs +++ b/AideDeJeu/AideDeJeu/Models/Equipment.cs @@ -9,7 +9,7 @@ namespace AideDeJeuLib { public class Equipment : Item { - public string Text { get; set; } + //public string Text { get; set; } public string Type { get; set; } public string Price { get; set; } public string ArmorClass { get; set; } @@ -24,16 +24,16 @@ namespace AideDeJeuLib public string WeightCapacity { get; set; } public string Speed { get; set; } - public override string Markdown - { - get - { - return - //$"# {Name}\n\n" + - //$"{AltName}\n\n" + - Text; - } - } + //public override string Markdown + //{ + // get + // { + // return + // //$"# {Name}\n\n" + + // //$"{AltName}\n\n" + + // Text; + // } + //} public void ParseBlock(Block block) { @@ -44,7 +44,7 @@ namespace AideDeJeuLib { this.Name = headingBlock.Inline.ToMarkdownString(); } - this.Text += block.ToMarkdownString(); + this.Markdown += block.ToMarkdownString(); } else if (block is ListBlock) { @@ -67,63 +67,63 @@ namespace AideDeJeuLib { new Tuple>("AltName: ", (m, s) => { - this.Text += "- " + s; m.AltName = s; + this.Markdown += "- " + s; m.AltName = s; }), new Tuple>("**Type** ", (m, s) => { - this.Text += "- " + str; m.Type = s; + this.Markdown += "- " + str; m.Type = s; }), new Tuple>("**Prix** ", (m, s) => { - this.Text += "- " + str; m.Price = s; + this.Markdown += "- " + str; m.Price = s; }), new Tuple>("**Classe d'armure** ", (m, s) => { - this.Text += "- " + str; m.ArmorClass = s; + this.Markdown += "- " + str; m.ArmorClass = s; }), new Tuple>("**Discrétion** ", (m, s) => { - this.Text += "- " + str; m.Discretion = s; + this.Markdown += "- " + str; m.Discretion = s; }), new Tuple>("**Poids** ", (m, s) => { - this.Text += "- " + str; m.Weight = s; + this.Markdown += "- " + str; m.Weight = s; }), new Tuple>("**Force** ", (m, s) => { - this.Text += "- " + str; m.Force = s; + this.Markdown += "- " + str; m.Force = s; }), new Tuple>("**Rareté** ", (m, s) => { - this.Text += "- " + str; m.Rarity = s; + this.Markdown += "- " + str; m.Rarity = s; }), new Tuple>("**Dégâts** ", (m, s) => { - this.Text += "- " + str; m.Damages = s; + this.Markdown += "- " + str; m.Damages = s; }), new Tuple>("**Propriétés** ", (m, s) => { - this.Text += "- " + str; m.Properties = s; + this.Markdown += "- " + str; m.Properties = s; }), new Tuple>("**Unité** ", (m, s) => { - this.Text += "- " + str; m.Unity = s; //m.Name += $" ({s})"; + this.Markdown += "- " + str; m.Unity = s; //m.Name += $" ({s})"; }), new Tuple>("**Capacité** ", (m, s) => { - this.Text += "- " + str; m.Capacity = s; + this.Markdown += "- " + str; m.Capacity = s; }), new Tuple>("**Capacité de charge** ", (m, s) => { - this.Text += "- " + str; m.WeightCapacity = s; + this.Markdown += "- " + str; m.WeightCapacity = s; }), new Tuple>("**Vitesse** ", (m, s) => { - this.Text += "- " + str; m.Speed = s; + this.Markdown += "- " + str; m.Speed = s; }), new Tuple>("", (m, s) => { - this.Text += str; + this.Markdown += str; }), }; @@ -139,16 +139,16 @@ namespace AideDeJeuLib } } } - this.Text += "\n"; + this.Markdown += "\n"; } else { - this.Text += block.ToMarkdownString(); + this.Markdown += block.ToMarkdownString(); } } else { - this.Text += block.ToMarkdownString(); + this.Markdown += block.ToMarkdownString(); } } diff --git a/AideDeJeu/AideDeJeu/Models/HomeItem.cs b/AideDeJeu/AideDeJeu/Models/HomeItem.cs index 746b4885..d47d0344 100644 --- a/AideDeJeu/AideDeJeu/Models/HomeItem.cs +++ b/AideDeJeu/AideDeJeu/Models/HomeItem.cs @@ -7,7 +7,7 @@ namespace AideDeJeuLib { public class HomeItem : Item { - public override string Markdown + public new string Markdown { get { diff --git a/AideDeJeu/AideDeJeu/Models/Item.cs b/AideDeJeu/AideDeJeu/Models/Item.cs index d0a60db8..bcfc5386 100644 --- a/AideDeJeu/AideDeJeu/Models/Item.cs +++ b/AideDeJeu/AideDeJeu/Models/Item.cs @@ -4,7 +4,7 @@ using System.Xml; namespace AideDeJeuLib { - public abstract class Item + public class Item { public string Name { get; set; } public int NameLevel { get; set; } @@ -32,7 +32,7 @@ namespace AideDeJeuLib } } - public abstract string Markdown { get; } - public abstract void Parse(ref Markdig.Syntax.ContainerBlock.Enumerator enumerator); + public string Markdown { get; set; } + public virtual void Parse(ref Markdig.Syntax.ContainerBlock.Enumerator enumerator) { } } } diff --git a/AideDeJeu/AideDeJeu/Models/Items.cs b/AideDeJeu/AideDeJeu/Models/Items.cs index 7de42459..c7a83037 100644 --- a/AideDeJeu/AideDeJeu/Models/Items.cs +++ b/AideDeJeu/AideDeJeu/Models/Items.cs @@ -10,11 +10,11 @@ using Markdig.Syntax.Inlines; namespace AideDeJeuLib { - public class Items : Item, IEnumerable + public class Items : Item, IList { - private IEnumerable _Items; + private List _Items; - public Items(IEnumerable items) + public Items(List items) { _Items = items; } @@ -24,17 +24,22 @@ namespace AideDeJeuLib _Items = new List(); } - private string _Markdown = ""; - public override string Markdown - { - get - { - return _Markdown; - } - } + //private string _Markdown = ""; + //public override string Markdown + //{ + // get + // { + // return _Markdown; + // } + //} public string Header { get; set; } + public int Count => _Items.Count(); + + public bool IsReadOnly => false; + + public Item this[int index] { get => _Items[index]; set => _Items[index] = value; } public IEnumerator GetEnumerator() { @@ -92,5 +97,45 @@ namespace AideDeJeuLib { return null; } + + public int IndexOf(Item item) + { + return _Items.IndexOf(item); + } + + public void Insert(int index, Item item) + { + _Items.Insert(index, item); + } + + public void RemoveAt(int index) + { + _Items.RemoveAt(index); + } + + public void Add(Item item) + { + _Items.Add(item); + } + + public void Clear() + { + _Items.Clear(); + } + + public bool Contains(Item item) + { + return _Items.Contains(item); + } + + public void CopyTo(Item[] array, int arrayIndex) + { + _Items.CopyTo(array, arrayIndex); + } + + public bool Remove(Item item) + { + throw new NotImplementedException(); + } } } diff --git a/AideDeJeu/AideDeJeu/Models/LinkItem.cs b/AideDeJeu/AideDeJeu/Models/LinkItem.cs index 27821990..a9774f3c 100644 --- a/AideDeJeu/AideDeJeu/Models/LinkItem.cs +++ b/AideDeJeu/AideDeJeu/Models/LinkItem.cs @@ -26,15 +26,16 @@ namespace AideDeJeuLib var match = regex.Match(value); Name = match.Groups["name"].Value; Link = match.Groups["link"].Value; + Markdown = $"# {NameLink}\n\n"; } } - public override string Markdown - { - get - { - return $"# {NameLink}\n\n"; - } - } + //public override string Markdown + //{ + // get + // { + // return $"# {NameLink}\n\n"; + // } + //} public override void Parse(ref ContainerBlock.Enumerator enumerator) { diff --git a/AideDeJeu/AideDeJeu/Models/Monsters/MonsterHD.cs b/AideDeJeu/AideDeJeu/Models/Monsters/MonsterHD.cs index f09a1fdb..c843b58d 100644 --- a/AideDeJeu/AideDeJeu/Models/Monsters/MonsterHD.cs +++ b/AideDeJeu/AideDeJeu/Models/Monsters/MonsterHD.cs @@ -8,34 +8,34 @@ namespace AideDeJeuLib { public class MonsterHD : Monster { - public override string Markdown - { - get - { - return - $"# {Name}\n" + - $"{AltName}\n" + - $"{Type} de taille {Size}, {Alignment}\n" + - $"**Classe d'armure** {ArmorClass}\n" + - $"**Points de vie** {HitPoints}\n" + - $"**Vitesse** {Speed}\n\n" + - $"|FOR|DEX|CON|INT|SAG|CHA|\n" + - $"|---|---|---|---|---|---|\n" + - $"|{Strength}|{Dexterity}|{Constitution}|{Intelligence}|{Wisdom}|{Charisma}|\n\n" + - (Skills != null ? $"**Compétences** {Skills}\n" : "") + - (SavingThrows != null ? $"**Jets de sauvegarde** {SavingThrows}\n" : "") + - (DamageVulnerabilities != null ? $"**Vulnérabilité aux dégâts** {DamageVulnerabilities}\n" : "") + - (DamageImmunities != null ? $"**Immunité contre les dégâts** {DamageImmunities}\n" : "") + - (ConditionImmunities != null ? $"**Immunité contre les états** {ConditionImmunities}\n" : "") + - (DamageResistances != null ? $"**Résistance aux dégâts** {DamageResistances}\n" : "") + - $"**Sens** {Senses}\n" + - $"**Langues** {Languages}\n" + - $"**Dangerosité** {Challenge}\n\n" + - (SpecialFeatures != null ? $"## Capacités\n\n" + SpecialFeatures.Aggregate((s1, s2) => s1 + "\n\n" + s2) : "") + - (Actions != null ? $"## Actions\n\n" + Actions.Aggregate((s1, s2) => s1 + "\n\n" + s2) : "") + - (Reactions != null ? $"## Réactions\n\n" + Reactions.Aggregate((s1, s2) => s1 + "\n\n" + s2) : "") + - (LegendaryActions != null ? $"## Actions Légendaires\n\n" + LegendaryActions.Aggregate((s1, s2) => s1 + "\n\n" + s2) : ""); - } - } + //public override string Markdown + //{ + // get + // { + // return + // $"# {Name}\n" + + // $"{AltName}\n" + + // $"{Type} de taille {Size}, {Alignment}\n" + + // $"**Classe d'armure** {ArmorClass}\n" + + // $"**Points de vie** {HitPoints}\n" + + // $"**Vitesse** {Speed}\n\n" + + // $"|FOR|DEX|CON|INT|SAG|CHA|\n" + + // $"|---|---|---|---|---|---|\n" + + // $"|{Strength}|{Dexterity}|{Constitution}|{Intelligence}|{Wisdom}|{Charisma}|\n\n" + + // (Skills != null ? $"**Compétences** {Skills}\n" : "") + + // (SavingThrows != null ? $"**Jets de sauvegarde** {SavingThrows}\n" : "") + + // (DamageVulnerabilities != null ? $"**Vulnérabilité aux dégâts** {DamageVulnerabilities}\n" : "") + + // (DamageImmunities != null ? $"**Immunité contre les dégâts** {DamageImmunities}\n" : "") + + // (ConditionImmunities != null ? $"**Immunité contre les états** {ConditionImmunities}\n" : "") + + // (DamageResistances != null ? $"**Résistance aux dégâts** {DamageResistances}\n" : "") + + // $"**Sens** {Senses}\n" + + // $"**Langues** {Languages}\n" + + // $"**Dangerosité** {Challenge}\n\n" + + // (SpecialFeatures != null ? $"## Capacités\n\n" + SpecialFeatures.Aggregate((s1, s2) => s1 + "\n\n" + s2) : "") + + // (Actions != null ? $"## Actions\n\n" + Actions.Aggregate((s1, s2) => s1 + "\n\n" + s2) : "") + + // (Reactions != null ? $"## Réactions\n\n" + Reactions.Aggregate((s1, s2) => s1 + "\n\n" + s2) : "") + + // (LegendaryActions != null ? $"## Actions Légendaires\n\n" + LegendaryActions.Aggregate((s1, s2) => s1 + "\n\n" + s2) : ""); + // } + //} } } \ No newline at end of file diff --git a/AideDeJeu/AideDeJeu/Models/Monsters/MonsterVO.cs b/AideDeJeu/AideDeJeu/Models/Monsters/MonsterVO.cs index fd2144b3..149e6ed1 100644 --- a/AideDeJeu/AideDeJeu/Models/Monsters/MonsterVO.cs +++ b/AideDeJeu/AideDeJeu/Models/Monsters/MonsterVO.cs @@ -8,34 +8,34 @@ namespace AideDeJeuLib { public class MonsterVO : Monster { - public override string Markdown - { - get - { - return - $"# {Name}\n" + - $"{AltName}\n" + - $"{Size} {Type}, {Alignment}\n" + - $"**Armor Class** {ArmorClass}\n" + - $"**Hit Points** {HitPoints}\n" + - $"**Speed** {Speed}\n\n" + - $"|STR|DEX|CON|INT|WIS|CHA|\n" + - $"|---|---|---|---|---|---|\n" + - $"|{Strength}|{Dexterity}|{Constitution}|{Intelligence}|{Wisdom}|{Charisma}|\n\n" + - (Skills != null ? $"**Skills** {Skills}\n" : "") + - (SavingThrows != null ? $"**Saving Throws** {SavingThrows}\n" : "") + - (DamageVulnerabilities != null ? $"**Damage Vulnerabilities** {DamageVulnerabilities}\n" : "") + - (DamageImmunities != null ? $"**Damage Immunities** {DamageImmunities}\n" : "") + - (ConditionImmunities != null ? $"**Condition Immunities** {ConditionImmunities}\n" : "") + - (DamageResistances != null ? $"**Damage Resistances** {DamageResistances}\n" : "") + - $"**Senses** {Senses}\n" + - $"**Languages** {Languages}\n" + - $"**Challenge** {Challenge}\n\n" + - (SpecialFeatures != null ? $"## Special Features\n\n" + SpecialFeatures.Aggregate((s1, s2) => s1 + "\n\n" + s2) : "") + - (Actions != null ? $"## Actions\n\n" + Actions.Aggregate((s1, s2) => s1 + "\n\n" + s2) : "") + - (Reactions != null ? $"## Reactions\n\n" + Reactions.Aggregate((s1, s2) => s1 + "\n\n" + s2) : "") + - (LegendaryActions != null ? $"## Legendary Actions\n\n" + LegendaryActions.Aggregate((s1, s2) => s1 + "\n\n" + s2) : ""); - } - } + //public override string Markdown + //{ + // get + // { + // return + // $"# {Name}\n" + + // $"{AltName}\n" + + // $"{Size} {Type}, {Alignment}\n" + + // $"**Armor Class** {ArmorClass}\n" + + // $"**Hit Points** {HitPoints}\n" + + // $"**Speed** {Speed}\n\n" + + // $"|STR|DEX|CON|INT|WIS|CHA|\n" + + // $"|---|---|---|---|---|---|\n" + + // $"|{Strength}|{Dexterity}|{Constitution}|{Intelligence}|{Wisdom}|{Charisma}|\n\n" + + // (Skills != null ? $"**Skills** {Skills}\n" : "") + + // (SavingThrows != null ? $"**Saving Throws** {SavingThrows}\n" : "") + + // (DamageVulnerabilities != null ? $"**Damage Vulnerabilities** {DamageVulnerabilities}\n" : "") + + // (DamageImmunities != null ? $"**Damage Immunities** {DamageImmunities}\n" : "") + + // (ConditionImmunities != null ? $"**Condition Immunities** {ConditionImmunities}\n" : "") + + // (DamageResistances != null ? $"**Damage Resistances** {DamageResistances}\n" : "") + + // $"**Senses** {Senses}\n" + + // $"**Languages** {Languages}\n" + + // $"**Challenge** {Challenge}\n\n" + + // (SpecialFeatures != null ? $"## Special Features\n\n" + SpecialFeatures.Aggregate((s1, s2) => s1 + "\n\n" + s2) : "") + + // (Actions != null ? $"## Actions\n\n" + Actions.Aggregate((s1, s2) => s1 + "\n\n" + s2) : "") + + // (Reactions != null ? $"## Reactions\n\n" + Reactions.Aggregate((s1, s2) => s1 + "\n\n" + s2) : "") + + // (LegendaryActions != null ? $"## Legendary Actions\n\n" + LegendaryActions.Aggregate((s1, s2) => s1 + "\n\n" + s2) : ""); + // } + //} } } diff --git a/AideDeJeu/AideDeJeu/Models/Spells/Description.cs b/AideDeJeu/AideDeJeu/Models/Spells/Description.cs new file mode 100644 index 00000000..981a48ab --- /dev/null +++ b/AideDeJeu/AideDeJeu/Models/Spells/Description.cs @@ -0,0 +1,17 @@ +using System; +using System.Collections.Generic; +using System.Text; +using Markdig.Syntax; + +namespace AideDeJeuLib +{ + public class Description : Item + { + //public override string Markdown => string.Empty; + + public override void Parse(ref ContainerBlock.Enumerator enumerator) + { + + } + } +} diff --git a/AideDeJeu/AideDeJeu/Models/Spells/Spell.cs b/AideDeJeu/AideDeJeu/Models/Spells/Spell.cs index 94039088..fed36b95 100644 --- a/AideDeJeu/AideDeJeu/Models/Spells/Spell.cs +++ b/AideDeJeu/AideDeJeu/Models/Spells/Spell.cs @@ -10,7 +10,7 @@ using System.Xml.Serialization; namespace AideDeJeuLib { - public abstract class Spell : Item + public class Spell : Item { public string Level { get; set; } public string Type { get; set; } @@ -23,7 +23,15 @@ namespace AideDeJeuLib public string DescriptionHtml { get; set; } public string Source { get; set; } public string Classes { get; set; } + public Description Description { get; set; } - public abstract string LevelType { get; set; } + public virtual string LevelType { get; set; } + + //public override string Markdown => throw new NotImplementedException(); + + public override void Parse(ref ContainerBlock.Enumerator enumerator) + { + throw new NotImplementedException(); + } } } diff --git a/AideDeJeu/AideDeJeu/Models/Spells/SpellHD.cs b/AideDeJeu/AideDeJeu/Models/Spells/SpellHD.cs index 5e4605f9..6e69b63d 100644 --- a/AideDeJeu/AideDeJeu/Models/Spells/SpellHD.cs +++ b/AideDeJeu/AideDeJeu/Models/Spells/SpellHD.cs @@ -51,24 +51,24 @@ namespace AideDeJeuLib } } } - public override string Markdown - { - get - { - return - $"# {Name}\n" + - $"{AltName}\n\n" + - $"_{LevelType}_\n" + - $"**Temps d'incantation :** {CastingTime}\n" + - $"**Portée :** {Range}\n" + - $"**Composantes :** {Components}\n" + - $"**Durée :** {Duration}\n" + - $"**Classes :** {Classes}\n" + - $"**Source :** {Source}\n" + - $"\n" + - $"{DescriptionHtml}"; - } - } + //public override string Markdown + //{ + // get + // { + // return + // $"# {Name}\n" + + // $"{AltName}\n\n" + + // $"_{LevelType}_\n" + + // $"**Temps d'incantation :** {CastingTime}\n" + + // $"**Portée :** {Range}\n" + + // $"**Composantes :** {Components}\n" + + // $"**Durée :** {Duration}\n" + + // $"**Classes :** {Classes}\n" + + // $"**Source :** {Source}\n" + + // $"\n" + + // $"{DescriptionHtml}"; + // } + //} public override void Parse(ref ContainerBlock.Enumerator enumerator) { diff --git a/AideDeJeu/AideDeJeu/Models/Spells/SpellVO.cs b/AideDeJeu/AideDeJeu/Models/Spells/SpellVO.cs index 53d1bfc4..1f533705 100644 --- a/AideDeJeu/AideDeJeu/Models/Spells/SpellVO.cs +++ b/AideDeJeu/AideDeJeu/Models/Spells/SpellVO.cs @@ -32,24 +32,24 @@ namespace AideDeJeuLib } } - public override string Markdown - { - get - { - return - $"# {Name}\n" + - $"{AltName}\n\n" + - $"_{LevelType}_\n" + - $"**Casting Time :** {CastingTime}\n" + - $"**Range :** {Range}\n" + - $"**Components :** {Components}\n" + - $"**Duration :** {Duration}\n" + - $"**Classes :** {Classes}\n" + - $"**Source :** {Source}\n" + - $"\n" + - $"{DescriptionHtml}"; - } - } + //public override string Markdown + //{ + // get + // { + // return + // $"# {Name}\n" + + // $"{AltName}\n\n" + + // $"_{LevelType}_\n" + + // $"**Casting Time :** {CastingTime}\n" + + // $"**Range :** {Range}\n" + + // $"**Components :** {Components}\n" + + // $"**Duration :** {Duration}\n" + + // $"**Classes :** {Classes}\n" + + // $"**Source :** {Source}\n" + + // $"\n" + + // $"{DescriptionHtml}"; + // } + //} public override void Parse(ref ContainerBlock.Enumerator enumerator) { diff --git a/AideDeJeu/AideDeJeu/ViewModels/FilterViewModel.cs b/AideDeJeu/AideDeJeu/ViewModels/FilterViewModel.cs index f717dd24..d245b476 100644 --- a/AideDeJeu/AideDeJeu/ViewModels/FilterViewModel.cs +++ b/AideDeJeu/AideDeJeu/ViewModels/FilterViewModel.cs @@ -194,7 +194,7 @@ namespace AideDeJeu.ViewModels spell.Type.ToLower().Contains(ecole.ToLower()) && spell.Source.Contains(source) && spell.Classes.Contains(classe) && - spell.Rituel.Contains(rituel) && + (spell.Rituel == null || spell.Rituel.Contains(rituel)) && ( (Helpers.RemoveDiacritics(spell.Name).ToLower().Contains(Helpers.RemoveDiacritics(SearchText ?? string.Empty).ToLower())) || (Helpers.RemoveDiacritics(spell.AltNameText ?? string.Empty).ToLower().Contains(Helpers.RemoveDiacritics(SearchText ?? string.Empty).ToLower())) diff --git a/AideDeJeu/AideDeJeu/ViewModels/MainViewModel.cs b/AideDeJeu/AideDeJeu/ViewModels/MainViewModel.cs index 1787cd60..e5e762c5 100644 --- a/AideDeJeu/AideDeJeu/ViewModels/MainViewModel.cs +++ b/AideDeJeu/AideDeJeu/ViewModels/MainViewModel.cs @@ -28,7 +28,15 @@ namespace AideDeJeu.ViewModels //return Tools.MarkdownExtensions.ToItem(md); if (md != null) { - _AllItems[source] = Tools.MarkdownExtensions.ToItem(md); + var item = Tools.MarkdownExtensions.ToItem(md); + if (item != null) + { + _AllItems[source] = item; + } + else + { + return null; + } } else { diff --git a/Data/index.md b/Data/index.md index 4dadd53f..3cc69457 100644 --- a/Data/index.md +++ b/Data/index.md @@ -70,3 +70,7 @@ ## [Spells](spells_vo.md) ## [Monsters, Animals and NPC](monsters_vo.md) + +
+ +# [Sandbox](sandbox.md) diff --git a/Data/sandbox.md b/Data/sandbox.md index 904c06bf..1bba3d94 100644 --- a/Data/sandbox.md +++ b/Data/sandbox.md @@ -1,4 +1,4 @@ - + @@ -16,7 +16,31 @@ ### Description - +Vous agrandissez ou rétrécissez une créature ou un objet situé à portée et dans votre champ de vision pendant toute la durée du sort. Choisissez soit une créature, soit un objet qui n'est ni porté ni transporté. Si la cible n'est pas consentante, elle a droit à un [jet de sauvegarde] de [Constitution]. Si elle le réussit, le sort est sans effet. + +Si la cible est une créature, tout ce qu'elle porte et tout ce qu'elle transporte change de taille avec elle. En revanche, si elle lâche un objet, il reprend sa taille normale sur-le-champ. + +**_Agrandir._** La cible double dans toutes les dimensions, et son poids est multiplié par huit. Cette croissance augmente sa catégorie de taille d'un cran, de M à G par exemple. Si la cible n'a pas assez de place pour doubler de volume, elle atteint la taille maximale possible dans l'espace dont elle dispose. Elle bénéficie d'un avantage lors des tests de [Force] et des [jets de sauvegarde] de [Force] jusqu'à la fin du sort. Les armes de la cible grandissent pour s'adapter à sa nouvelle taille. Tant qu'elles sont ainsi agrandies, elles infligent 1d4 dégâts de plus. + +**_Rétrécir._** La cible réduit de moitié dans toutes les dimensions et son poids est divisé par huit. Ce rétrécissement réduit sa catégorie de taille d'un cran, de M à P par exemple. La cible subit un désavantage lors des tests de [Force] et des [jets de sauvegarde] de [Force] jusqu'à la fin du sort. Les armes de la cible rétrécissent pour s'adapter à sa nouvelle taille. Tant qu'elles sont ainsi réduites, elles infligent 1d4 dégâts de moins (avec un minimum de 1 dégât). + + + + + +# Agrandir/rétrécir + +- [Enlarge/Reduce](spells_vo.md#enlargereduce) + +- Transmutation de niveau 2 +- **Temps d'incantation :** 1 action +- **Portée :** 9 mètres +- **Composantes :** V, S, M (une pincée de limaille de fer) +- **Durée :** concentration, jusqu'à 1 minute +- Classes: [Ensorceleur], [Magicien] +- Source: (HD)(SRD) + +### Description Vous agrandissez ou rétrécissez une créature ou un objet situé à portée et dans votre champ de vision pendant toute la durée du sort. Choisissez soit une créature, soit un objet qui n'est ni porté ni transporté. Si la cible n'est pas consentante, elle a droit à un [jet de sauvegarde] de [Constitution]. Si elle le réussit, le sort est sans effet. @@ -26,8 +50,32 @@ Si la cible est une créature, tout ce qu'elle porte et tout ce qu'elle transpor **_Rétrécir._** La cible réduit de moitié dans toutes les dimensions et son poids est divisé par huit. Ce rétrécissement réduit sa catégorie de taille d'un cran, de M à P par exemple. La cible subit un désavantage lors des tests de [Force] et des [jets de sauvegarde] de [Force] jusqu'à la fin du sort. Les armes de la cible rétrécissent pour s'adapter à sa nouvelle taille. Tant qu'elles sont ainsi réduites, elles infligent 1d4 dégâts de moins (avec un minimum de 1 dégât). - + + + + +# Agrandir/rétrécir + +- [Enlarge/Reduce](spells_vo.md#enlargereduce) + +- Transmutation de niveau 2 +- **Temps d'incantation :** 1 action +- **Portée :** 9 mètres +- **Composantes :** V, S, M (une pincée de limaille de fer) +- **Durée :** concentration, jusqu'à 1 minute +- Classes: [Ensorceleur], [Magicien] +- Source: (HD)(SRD) + +### Description + +Vous agrandissez ou rétrécissez une créature ou un objet situé à portée et dans votre champ de vision pendant toute la durée du sort. Choisissez soit une créature, soit un objet qui n'est ni porté ni transporté. Si la cible n'est pas consentante, elle a droit à un [jet de sauvegarde] de [Constitution]. Si elle le réussit, le sort est sans effet. + +Si la cible est une créature, tout ce qu'elle porte et tout ce qu'elle transporte change de taille avec elle. En revanche, si elle lâche un objet, il reprend sa taille normale sur-le-champ. + +**_Agrandir._** La cible double dans toutes les dimensions, et son poids est multiplié par huit. Cette croissance augmente sa catégorie de taille d'un cran, de M à G par exemple. Si la cible n'a pas assez de place pour doubler de volume, elle atteint la taille maximale possible dans l'espace dont elle dispose. Elle bénéficie d'un avantage lors des tests de [Force] et des [jets de sauvegarde] de [Force] jusqu'à la fin du sort. Les armes de la cible grandissent pour s'adapter à sa nouvelle taille. Tant qu'elles sont ainsi agrandies, elles infligent 1d4 dégâts de plus. + +**_Rétrécir._** La cible réduit de moitié dans toutes les dimensions et son poids est divisé par huit. Ce rétrécissement réduit sa catégorie de taille d'un cran, de M à P par exemple. La cible subit un désavantage lors des tests de [Force] et des [jets de sauvegarde] de [Force] jusqu'à la fin du sort. Les armes de la cible rétrécissent pour s'adapter à sa nouvelle taille. Tant qu'elles sont ainsi réduites, elles infligent 1d4 dégâts de moins (avec un minimum de 1 dégât). - +