From 433f3a07324564c12d4c869c244cc563e70afb95 Mon Sep 17 00:00:00 2001 From: Jonathan Allen Date: Thu, 23 Nov 2017 00:03:19 -0800 Subject: [PATCH] Web version --- .../SavageTools.Shared/CharacterGenerator.cs | 42 +- .../Characters/Character.cs | 256 +- .../SavageTools.Shared/Characters/Feature.cs | 3 +- .../Characters/FeatureCollection.cs | 3 +- .../Characters/Personality.cs | 10 + .../Characters/PersonalityCollection.cs | 14 + SavageTools/SavageTools.Shared/NameService.cs | 5 +- .../SavageTools.Shared.csproj | 13 + .../Settings/Arcana.savage-setting | 3 + .../Settings/Fantasy Companion.savage-setting | 1 + .../Settings/Magic.savage-setting | 1 + .../Settings/Miracles.savage-setting | 1 + .../Settings/Modern.savage-setting | 3 + .../Settings/Psionics.savage-setting | 2 + .../Rifts Tomorrow Legion.savage-setting | 6 +- .../Settings/Rippers.savage-setting | 11 +- ...avage Foes of North America.savage-setting | 2 + .../SavageTools.Shared/Settings/Setting.cs | 15 + .../Settings/Super Powers.savage-setting | 1 + .../Settings/Weird Science.savage-setting | 3 +- .../Settings/female-first.txt | 1332 ++ .../SavageTools.Shared/Settings/last.txt | 745 ++ .../Settings/male-first.txt | 1337 ++ SavageTools/SavageTools/CharacterControl.xaml | 23 +- SavageTools/SavageTools/CharacterVM.cs | 1 + SavageTools/SavageTools/MainVM.cs | 8 +- .../SavageToolsWeb/App_Start/RouteConfig.cs | 8 +- .../SavageToolsWeb/App_Start/WebApiConfig.cs | 11 +- .../SavageToolsWeb/ApplicationInsights.config | 29 +- .../HelpPage/ApiDescriptionExtensions.cs | 39 + .../HelpPage/App_Start/HelpPageConfig.cs | 113 + .../HelpPage/Controllers/HelpController.cs | 63 + .../Areas/HelpPage/HelpPage.css | 134 + .../HelpPage/HelpPageAreaRegistration.cs | 26 + .../HelpPageConfigurationExtensions.cs | 467 + .../CollectionModelDescription.cs | 7 + .../ComplexTypeModelDescription.cs | 14 + .../DictionaryModelDescription.cs | 6 + .../EnumTypeModelDescription.cs | 15 + .../ModelDescriptions/EnumValueDescription.cs | 11 + .../IModelDocumentationProvider.cs | 12 + .../KeyValuePairModelDescription.cs | 9 + .../ModelDescriptions/ModelDescription.cs | 16 + .../ModelDescriptionGenerator.cs | 451 + .../ModelDescriptions/ModelNameAttribute.cs | 18 + .../ModelDescriptions/ModelNameHelper.cs | 36 + .../ModelDescriptions/ParameterAnnotation.cs | 11 + .../ModelDescriptions/ParameterDescription.cs | 21 + .../SimpleTypeModelDescription.cs | 6 + .../Areas/HelpPage/Models/HelpPageApiModel.cs | 108 + .../HelpPageSampleGenerator.cs | 444 + .../SampleGeneration/HelpPageSampleKey.cs | 172 + .../HelpPage/SampleGeneration/ImageSample.cs | 41 + .../SampleGeneration/InvalidSample.cs | 37 + .../SampleGeneration/ObjectGenerator.cs | 456 + .../SampleGeneration/SampleDirection.cs | 11 + .../HelpPage/SampleGeneration/TextSample.cs | 37 + .../Areas/HelpPage/Views/Help/Api.cshtml | 22 + .../Help/DisplayTemplates/ApiGroup.cshtml | 41 + .../CollectionModelDescription.cshtml | 6 + .../ComplexTypeModelDescription.cshtml | 3 + .../DictionaryModelDescription.cshtml | 4 + .../EnumTypeModelDescription.cshtml | 24 + .../DisplayTemplates/HelpPageApiModel.cshtml | 67 + .../Help/DisplayTemplates/ImageSample.cshtml | 4 + .../DisplayTemplates/InvalidSample.cshtml | 13 + .../KeyValuePairModelDescription.cshtml | 4 + .../ModelDescriptionLink.cshtml | 26 + .../Help/DisplayTemplates/Parameters.cshtml | 48 + .../Help/DisplayTemplates/Samples.cshtml | 30 + .../SimpleTypeModelDescription.cshtml | 3 + .../Help/DisplayTemplates/TextSample.cshtml | 6 + .../Areas/HelpPage/Views/Help/Index.cshtml | 38 + .../HelpPage/Views/Help/ResourceModel.cshtml | 19 + .../HelpPage/Views/Shared/_Layout.cshtml | 12 + .../Areas/HelpPage/Views/Web.config | 41 + .../Areas/HelpPage/Views/_ViewStart.cshtml | 4 + .../HelpPage/XmlDocumentationProvider.cs | 161 + .../Content/bootstrap-theme.css | 587 + .../Content/bootstrap-theme.css.map | 1 + .../Content/bootstrap-theme.min.css | 6 + .../Content/bootstrap-theme.min.css.map | 1 + .../SavageToolsWeb/Content/bootstrap.css | 8547 +++++++------ .../SavageToolsWeb/Content/bootstrap.css.map | 1 + .../SavageToolsWeb/Content/bootstrap.min.css | 24 +- .../Content/bootstrap.min.css.map | 1 + .../Controllers/HomeController.cs | 34 +- .../Controllers/SettingApiController.cs | 37 + SavageTools/SavageToolsWeb/Global.asax | 2 +- SavageTools/SavageToolsWeb/Global.asax.cs | 42 +- .../Models/HomeIndexViewModel.cs | 38 +- .../SavageToolsWeb/Models/NamedItem.cs | 12 + .../SavageToolsWeb/SavageToolsWeb.csproj | 185 +- .../SavageToolsWeb/Scripts/Home/Index.js | 48 + .../SavageToolsWeb/Scripts/Home/Index.js.map | 1 + .../SavageToolsWeb/Scripts/Home/Index.ts | 85 + .../SavageToolsWeb/Scripts/bootstrap.js | 1681 ++- .../SavageToolsWeb/Scripts/bootstrap.min.js | 28 +- .../SavageToolsWeb/Scripts/jquery-1.10.2.js | 9803 --------------- .../Scripts/jquery-1.10.2.min.js | 23 - .../Scripts/jquery-1.10.2.min.map | 1 - ...isense.js => jquery-3.2.1.intellisense.js} | 149 +- .../SavageToolsWeb/Scripts/jquery-3.2.1.js | 10253 ++++++++++++++++ .../Scripts/jquery-3.2.1.min.js | 4 + .../Scripts/jquery-3.2.1.min.map | 1 + .../Scripts/jquery-3.2.1.slim.js | 8160 ++++++++++++ .../Scripts/jquery-3.2.1.slim.min.js | 4 + .../Scripts/jquery-3.2.1.slim.min.map | 1 + .../Scripts/jquery.validate-vsdoc.js | 20 +- .../SavageToolsWeb/Scripts/jquery.validate.js | 1511 ++- .../Scripts/jquery.validate.min.js | 20 +- ...{modernizr-2.6.2.js => modernizr-2.8.3.js} | 474 +- SavageTools/SavageToolsWeb/Scripts/respond.js | 558 +- .../Scripts/respond.matchmedia.addListener.js | 273 + .../respond.matchmedia.addListener.min.js | 5 + .../SavageToolsWeb/Scripts/respond.min.js | 23 +- .../Scripts/typings/jquery/jquery.d.ts | 3249 +++++ .../SavageToolsWeb/Views/Home/Index.cshtml | 53 +- .../SavageToolsWeb/Views/Home/Squad.cshtml | 169 + SavageTools/SavageToolsWeb/Web.config | 20 +- .../fonts/glyphicons-halflings-regular.eot | Bin 14079 -> 20127 bytes .../fonts/glyphicons-halflings-regular.svg | 480 +- .../fonts/glyphicons-halflings-regular.ttf | Bin 29512 -> 45404 bytes .../fonts/glyphicons-halflings-regular.woff | Bin 16448 -> 23424 bytes .../fonts/glyphicons-halflings-regular.woff2 | Bin 0 -> 18028 bytes SavageTools/SavageToolsWeb/packages.config | 40 +- 126 files changed, 37249 insertions(+), 16652 deletions(-) create mode 100644 SavageTools/SavageTools.Shared/Characters/Personality.cs create mode 100644 SavageTools/SavageTools.Shared/Characters/PersonalityCollection.cs create mode 100644 SavageTools/SavageTools.Shared/Settings/female-first.txt create mode 100644 SavageTools/SavageTools.Shared/Settings/last.txt create mode 100644 SavageTools/SavageTools.Shared/Settings/male-first.txt create mode 100644 SavageTools/SavageToolsWeb/Areas/HelpPage/ApiDescriptionExtensions.cs create mode 100644 SavageTools/SavageToolsWeb/Areas/HelpPage/App_Start/HelpPageConfig.cs create mode 100644 SavageTools/SavageToolsWeb/Areas/HelpPage/Controllers/HelpController.cs create mode 100644 SavageTools/SavageToolsWeb/Areas/HelpPage/HelpPage.css create mode 100644 SavageTools/SavageToolsWeb/Areas/HelpPage/HelpPageAreaRegistration.cs create mode 100644 SavageTools/SavageToolsWeb/Areas/HelpPage/HelpPageConfigurationExtensions.cs create mode 100644 SavageTools/SavageToolsWeb/Areas/HelpPage/ModelDescriptions/CollectionModelDescription.cs create mode 100644 SavageTools/SavageToolsWeb/Areas/HelpPage/ModelDescriptions/ComplexTypeModelDescription.cs create mode 100644 SavageTools/SavageToolsWeb/Areas/HelpPage/ModelDescriptions/DictionaryModelDescription.cs create mode 100644 SavageTools/SavageToolsWeb/Areas/HelpPage/ModelDescriptions/EnumTypeModelDescription.cs create mode 100644 SavageTools/SavageToolsWeb/Areas/HelpPage/ModelDescriptions/EnumValueDescription.cs create mode 100644 SavageTools/SavageToolsWeb/Areas/HelpPage/ModelDescriptions/IModelDocumentationProvider.cs create mode 100644 SavageTools/SavageToolsWeb/Areas/HelpPage/ModelDescriptions/KeyValuePairModelDescription.cs create mode 100644 SavageTools/SavageToolsWeb/Areas/HelpPage/ModelDescriptions/ModelDescription.cs create mode 100644 SavageTools/SavageToolsWeb/Areas/HelpPage/ModelDescriptions/ModelDescriptionGenerator.cs create mode 100644 SavageTools/SavageToolsWeb/Areas/HelpPage/ModelDescriptions/ModelNameAttribute.cs create mode 100644 SavageTools/SavageToolsWeb/Areas/HelpPage/ModelDescriptions/ModelNameHelper.cs create mode 100644 SavageTools/SavageToolsWeb/Areas/HelpPage/ModelDescriptions/ParameterAnnotation.cs create mode 100644 SavageTools/SavageToolsWeb/Areas/HelpPage/ModelDescriptions/ParameterDescription.cs create mode 100644 SavageTools/SavageToolsWeb/Areas/HelpPage/ModelDescriptions/SimpleTypeModelDescription.cs create mode 100644 SavageTools/SavageToolsWeb/Areas/HelpPage/Models/HelpPageApiModel.cs create mode 100644 SavageTools/SavageToolsWeb/Areas/HelpPage/SampleGeneration/HelpPageSampleGenerator.cs create mode 100644 SavageTools/SavageToolsWeb/Areas/HelpPage/SampleGeneration/HelpPageSampleKey.cs create mode 100644 SavageTools/SavageToolsWeb/Areas/HelpPage/SampleGeneration/ImageSample.cs create mode 100644 SavageTools/SavageToolsWeb/Areas/HelpPage/SampleGeneration/InvalidSample.cs create mode 100644 SavageTools/SavageToolsWeb/Areas/HelpPage/SampleGeneration/ObjectGenerator.cs create mode 100644 SavageTools/SavageToolsWeb/Areas/HelpPage/SampleGeneration/SampleDirection.cs create mode 100644 SavageTools/SavageToolsWeb/Areas/HelpPage/SampleGeneration/TextSample.cs create mode 100644 SavageTools/SavageToolsWeb/Areas/HelpPage/Views/Help/Api.cshtml create mode 100644 SavageTools/SavageToolsWeb/Areas/HelpPage/Views/Help/DisplayTemplates/ApiGroup.cshtml create mode 100644 SavageTools/SavageToolsWeb/Areas/HelpPage/Views/Help/DisplayTemplates/CollectionModelDescription.cshtml create mode 100644 SavageTools/SavageToolsWeb/Areas/HelpPage/Views/Help/DisplayTemplates/ComplexTypeModelDescription.cshtml create mode 100644 SavageTools/SavageToolsWeb/Areas/HelpPage/Views/Help/DisplayTemplates/DictionaryModelDescription.cshtml create mode 100644 SavageTools/SavageToolsWeb/Areas/HelpPage/Views/Help/DisplayTemplates/EnumTypeModelDescription.cshtml create mode 100644 SavageTools/SavageToolsWeb/Areas/HelpPage/Views/Help/DisplayTemplates/HelpPageApiModel.cshtml create mode 100644 SavageTools/SavageToolsWeb/Areas/HelpPage/Views/Help/DisplayTemplates/ImageSample.cshtml create mode 100644 SavageTools/SavageToolsWeb/Areas/HelpPage/Views/Help/DisplayTemplates/InvalidSample.cshtml create mode 100644 SavageTools/SavageToolsWeb/Areas/HelpPage/Views/Help/DisplayTemplates/KeyValuePairModelDescription.cshtml create mode 100644 SavageTools/SavageToolsWeb/Areas/HelpPage/Views/Help/DisplayTemplates/ModelDescriptionLink.cshtml create mode 100644 SavageTools/SavageToolsWeb/Areas/HelpPage/Views/Help/DisplayTemplates/Parameters.cshtml create mode 100644 SavageTools/SavageToolsWeb/Areas/HelpPage/Views/Help/DisplayTemplates/Samples.cshtml create mode 100644 SavageTools/SavageToolsWeb/Areas/HelpPage/Views/Help/DisplayTemplates/SimpleTypeModelDescription.cshtml create mode 100644 SavageTools/SavageToolsWeb/Areas/HelpPage/Views/Help/DisplayTemplates/TextSample.cshtml create mode 100644 SavageTools/SavageToolsWeb/Areas/HelpPage/Views/Help/Index.cshtml create mode 100644 SavageTools/SavageToolsWeb/Areas/HelpPage/Views/Help/ResourceModel.cshtml create mode 100644 SavageTools/SavageToolsWeb/Areas/HelpPage/Views/Shared/_Layout.cshtml create mode 100644 SavageTools/SavageToolsWeb/Areas/HelpPage/Views/Web.config create mode 100644 SavageTools/SavageToolsWeb/Areas/HelpPage/Views/_ViewStart.cshtml create mode 100644 SavageTools/SavageToolsWeb/Areas/HelpPage/XmlDocumentationProvider.cs create mode 100644 SavageTools/SavageToolsWeb/Content/bootstrap-theme.css create mode 100644 SavageTools/SavageToolsWeb/Content/bootstrap-theme.css.map create mode 100644 SavageTools/SavageToolsWeb/Content/bootstrap-theme.min.css create mode 100644 SavageTools/SavageToolsWeb/Content/bootstrap-theme.min.css.map create mode 100644 SavageTools/SavageToolsWeb/Content/bootstrap.css.map create mode 100644 SavageTools/SavageToolsWeb/Content/bootstrap.min.css.map create mode 100644 SavageTools/SavageToolsWeb/Controllers/SettingApiController.cs create mode 100644 SavageTools/SavageToolsWeb/Models/NamedItem.cs create mode 100644 SavageTools/SavageToolsWeb/Scripts/Home/Index.js create mode 100644 SavageTools/SavageToolsWeb/Scripts/Home/Index.js.map create mode 100644 SavageTools/SavageToolsWeb/Scripts/Home/Index.ts delete mode 100644 SavageTools/SavageToolsWeb/Scripts/jquery-1.10.2.js delete mode 100644 SavageTools/SavageToolsWeb/Scripts/jquery-1.10.2.min.js delete mode 100644 SavageTools/SavageToolsWeb/Scripts/jquery-1.10.2.min.map rename SavageTools/SavageToolsWeb/Scripts/{jquery-1.10.2.intellisense.js => jquery-3.2.1.intellisense.js} (95%) create mode 100644 SavageTools/SavageToolsWeb/Scripts/jquery-3.2.1.js create mode 100644 SavageTools/SavageToolsWeb/Scripts/jquery-3.2.1.min.js create mode 100644 SavageTools/SavageToolsWeb/Scripts/jquery-3.2.1.min.map create mode 100644 SavageTools/SavageToolsWeb/Scripts/jquery-3.2.1.slim.js create mode 100644 SavageTools/SavageToolsWeb/Scripts/jquery-3.2.1.slim.min.js create mode 100644 SavageTools/SavageToolsWeb/Scripts/jquery-3.2.1.slim.min.map rename SavageTools/SavageToolsWeb/Scripts/{modernizr-2.6.2.js => modernizr-2.8.3.js} (81%) create mode 100644 SavageTools/SavageToolsWeb/Scripts/respond.matchmedia.addListener.js create mode 100644 SavageTools/SavageToolsWeb/Scripts/respond.matchmedia.addListener.min.js create mode 100644 SavageTools/SavageToolsWeb/Scripts/typings/jquery/jquery.d.ts create mode 100644 SavageTools/SavageToolsWeb/Views/Home/Squad.cshtml create mode 100644 SavageTools/SavageToolsWeb/fonts/glyphicons-halflings-regular.woff2 diff --git a/SavageTools/SavageTools.Shared/CharacterGenerator.cs b/SavageTools/SavageTools.Shared/CharacterGenerator.cs index b4b18be..83b5c0e 100644 --- a/SavageTools/SavageTools.Shared/CharacterGenerator.cs +++ b/SavageTools/SavageTools.Shared/CharacterGenerator.cs @@ -16,9 +16,21 @@ namespace SavageTools public class CharacterGenerator : ModelBase { + public CharacterGenerator(FileInfo setting) + { + LoadSetting(setting); + + NameService = new LocalNameService(setting.DirectoryName, NamePrefix); + PersonalityService = new PersonalityService(setting.DirectoryName); + } - public LocalNameService NameService = new LocalNameService("Settings"); - public PersonalityService PersonalityService = new PersonalityService("Settings"); + public bool UseStrain { get => Get(); set => Set(value); } + public bool UseReason { get => Get(); set => Set(value); } + public bool UseStatus { get => Get(); set => Set(value); } + public string NamePrefix { get => Get(); set => Set(value); } + + public LocalNameService NameService; + public PersonalityService PersonalityService; public ObservableCollectionExtended Settings { get; } = new ObservableCollectionExtended(); @@ -93,9 +105,9 @@ public SettingArchetype SelectedArchetype public bool WildCard { get { return GetDefault(false); } set { Set(value); } } - public Character GenerateCharacter() + public Character GenerateCharacter(Dice dice = null) { - var dice = new Dice(); + dice = dice ?? new Dice(); if (RandomArchetype) { @@ -117,7 +129,7 @@ public Character GenerateCharacter() } - var result = new Character() { Rank = SelectedRank.Name, IsWildCard = WildCard }; + var result = new Character() { Rank = SelectedRank.Name, IsWildCard = WildCard, UseReason = UseReason, UseStatus = UseStatus, UseStrain = UseStrain }; var name = NameService.CreateRandomPerson(dice); result.Name = name.FullName; @@ -235,7 +247,7 @@ public Character GenerateCharacter() //Add personality int personalityTraits = dice.D(3); for (var i = 0; i < personalityTraits; i++) - result.Features.Add(PersonalityService.CreateRandomPersonality(dice)); + result.Personality.Add(PersonalityService.CreateRandomPersonality(dice)); return result; } @@ -299,8 +311,14 @@ void ApplyArchetype(Character result, Dice dice) if (SelectedArchetype.Gear != null) foreach (var item in SelectedArchetype.Gear) + { result.Gear.Add(item.Name, item.Description); + if (item.Traits != null) + foreach (var trait in item.Traits) + result.Increment(trait.Name, trait.Bonus, dice); + } + } void ApplyRace(Character result, Dice dice) { @@ -409,6 +427,7 @@ static void ApplyEdge(Character result, SettingEdge edge, Dice dice) static readonly XmlSerializer SettingXmlSerializer = new XmlSerializer(typeof(Setting)); + public void LoadSetting(FileInfo file) { var currentArchetype = SelectedArchetype?.Name; @@ -427,6 +446,15 @@ public void LoadSetting(FileInfo file) if (book.BornAHero) BornAHero = true; + if (book.UseReason) + UseReason = true; + + if (book.UseStatus) + UseStatus = true; + + if (book.UseStrain) + UseStrain = true; + if (book.References != null) foreach (var item in book.References.Where(r => !Settings.Any(s => s == r.Name))) { @@ -501,6 +529,8 @@ public void LoadSetting(FileInfo file) if (currentRank != null && SelectedRank == null) //selected rank was replaced so we need to reselect it SelectedRank = Ranks.Single(a => a.Name == currentRank); + + NamePrefix = book.NamePrefix; } void PickHindrance(Character result, Dice dice) { diff --git a/SavageTools/SavageTools.Shared/Characters/Character.cs b/SavageTools/SavageTools.Shared/Characters/Character.cs index ac51a38..c0c9421 100644 --- a/SavageTools/SavageTools.Shared/Characters/Character.cs +++ b/SavageTools/SavageTools.Shared/Characters/Character.cs @@ -7,156 +7,77 @@ namespace SavageTools.Characters { public class Character : ChangeTrackingModelBase { - public string Name { get { return Get(); } set { Set(value); } } - public string Gender { get { return Get(); } set { Set(value); } } - public Trait Agility { get { return Get(); } set { Set(value); } } - public Trait Smarts { get { return Get(); } set { Set(value); } } - public Trait Strength { get { return Get(); } set { Set(value); } } - public Trait Spirit { get { return Get(); } set { Set(value); } } - public Trait Vigor { get { return Get(); } set { Set(value); } } - - - - public Trait MaxAgility { get { return GetDefault(12); } set { Set(value); } } - public Trait MaxSmarts { get { return GetDefault(12); } set { Set(value); } } - public Trait MaxStrength { get { return GetDefault(12); } set { Set(value); } } - public Trait MaxSpirit { get { return GetDefault(12); } set { Set(value); } } - public Trait MaxVigor { get { return GetDefault(12); } set { Set(value); } } - - public SkillCollection Skills { get { return GetNew(); } } - public HindranceCollection Hindrances { get { return GetNew(); } } - public EdgeCollection Edges { get { return GetNew(); } } - public FeatureCollection Features { get { return GetNew(); } } - public GearCollection Gear { get { return GetNew(); } } - - public int Experience { get { return Get(); } set { Set(value); } } - - public int UnusedAttributes { get { return Get(); } set { Set(value); } } - public int UnusedSkills { get { return Get(); } set { Set(value); } } - public int UnusedSmartSkills { get { return Get(); } set { Set(value); } } - public int UnusedEdges { get { return Get(); } set { Set(value); } } - public int UnusedRacialEdges { get { return Get(); } set { Set(value); } } - public int UnusedIconicEdges { get { return Get(); } set { Set(value); } } - public int UnusedHindrances { get { return Get(); } set { Set(value); } } - public int UnusedAdvances { get { return Get(); } set { Set(value); } } - - - - public bool IsWildCard { get { return Get(); } set { Set(value); } } - + public Trait Agility { get => Get(); set => Set(value); } public string Archetype { get { return Get(); } set { Set(value); } } - public string Race { get { return Get(); } set { Set(value); } } - public string Rank { get { return Get(); } set { Set(value); } } - - public int Pace { get { return GetDefault(6); } set { Set(value); } } - public Trait Running { get { return GetDefault(6); } set { Set(value); } } - public int Charisma { get { return Get(); } set { Set(value); } } - public int Parry { get { return Get(); } set { Set(value); } } - public int Toughness { get { return Get(); } set { Set(value); } } - public int Strain { get { return Get(); } set { Set(value); } } + public EdgeCollection Edges => GetNew(); + public int Experience { get => Get(); set => Set(value); } + public FeatureCollection Features => GetNew(); + public PersonalityCollection Personality => GetNew(); + public GearCollection Gear => GetNew(); + public string Gender { get => Get(); set => Set(value); } + public HindranceCollection Hindrances => GetNew(); + public bool IsWildCard { get { return Get(); } set { Set(value); } } + public Trait MaxAgility { get => GetDefault(12); set => Set(value); } public int MaximumStrain { get { return Get(); } set { Set(value); } } - - public int Status { get { return GetDefault(2); } set { Set(value); } } - public int Reason { get { return Get(); } set { Set(value); } } - public int Size { get { return Get(); } set { Set(value); } } - - [CalculatedField("Reason,Spirit")] - public int ReasonTotal + [CalculatedField("MaximumStrain,Spirit,Vigor")] + public int MaximumStrainTotal { - get { return 2 + Spirit.HalfScore + Reason; } + get { return MaximumStrain + Math.Min(Spirit.Score, Vigor.Score); } } - + public Trait MaxSmarts { get => GetDefault(12); set => Set(value); } + public Trait MaxSpirit { get => GetDefault(12); set => Set(value); } + public Trait MaxStrength { get => GetDefault(12); set => Set(value); } + public Trait MaxVigor { get => GetDefault(12); set => Set(value); } + public string Name { get => Get(); set => Set(value); } + public int Pace { get { return GetDefault(6); } set { Set(value); } } + public int Parry { get { return Get(); } set { Set(value); } } public int ParryTotal { get { return 2 + (Skills.SingleOrDefault(s => s.Name == "Fighting")?.Trait.HalfScore ?? 0); } } - [CalculatedField("Vigor")] - public int ToughnessTotal - { - get { return 2 + Vigor.HalfScore + Toughness; } - } - - [CalculatedField("MaximumStrain,Spirit,Vigor")] - public int MaximumStrainTotal + public PowerGroupCollection PowerGroups => GetNew(); + public string Race { get { return Get(); } set { Set(value); } } + public string Rank { get { return Get(); } set { Set(value); } } + public int Reason { get { return Get(); } set { Set(value); } } + [CalculatedField("Reason,Spirit")] + public int ReasonTotal { - get { return MaximumStrain + Math.Min(Spirit.Score, Vigor.Score); } + get { return 2 + Spirit.HalfScore + Reason; } } - public void Increment(string trait, Dice dice) - { - Increment(trait, 1, dice); - } + public Trait Running { get { return GetDefault(6); } set { Set(value); } } + public int Size { get { return Get(); } set { Set(value); } } + public SkillCollection Skills => GetNew(); + public Trait Smarts { get => Get(); set => Set(value); } + public Trait Spirit { get => Get(); set => Set(value); } + public int Status { get { return GetDefault(2); } set { Set(value); } } + public int Strain { get { return Get(); } set { Set(value); } } + public Trait Strength { get => Get(); set => Set(value); } + public int Toughness { get { return Get(); } set { Set(value); } } - public void Increment(string trait, int bonus, Dice dice) + [CalculatedField("Vigor,Armor,Toughness")] + public int ToughnessTotal { - switch (trait) - { - case "Vigor": Vigor += bonus; return; - case "Smarts": Smarts += bonus; return; - case "Agility": Agility += bonus; return; - case "Strength": Strength += bonus; return; - case "Spirit": Spirit += bonus; return; - - case "MaxVigor": MaxVigor += bonus; return; - case "MaxSmarts": MaxSmarts += bonus; return; - case "MaxAgility": MaxAgility += bonus; return; - case "MaxStrength": MaxStrength += bonus; return; - case "MaxSpirit": MaxSpirit += bonus; return; - - case "Pace": Pace += bonus; return; - case "Running": Running += bonus; return; - case "Charisma": Charisma += bonus; return; - case "Parry": Parry += bonus; return; - case "Toughness": Toughness += bonus; return; - case "Strain": Strain += bonus; return; - case "MaximumStrain": MaximumStrain += bonus; return; - case "Reason": Reason += bonus; return; - case "Status": Status += bonus; return; - case "Size": Size += bonus; return; - - - case "UnusedAttributes": UnusedAttributes += bonus; return; - case "UnusedSkills": UnusedSkills += bonus; return; - case "UnusedSmartSkills": UnusedSmartSkills += bonus; return; - case "UnusedEdges": UnusedEdges += bonus; return; - case "UnusedRacialEdges": UnusedRacialEdges += bonus; return; - case "UnusedHindrances": UnusedHindrances += bonus; return; - case "UnusedAdvances": UnusedAdvances += bonus; return; - case "PowerPoints": dice.Choose(PowerGroups).PowerPoints += bonus; return; - case "UnusedPowers": dice.Choose(PowerGroups).UnusedPowers += bonus; return; - } - - if (trait.StartsWith("PowerPoints:")) - { - PowerGroups[trait.Substring("PowerPoints:".Length)].PowerPoints += bonus; - return; - } - - if (trait.StartsWith("UnusedPowers:")) - { - PowerGroups[trait.Substring("UnusedPowers:".Length)].UnusedPowers += bonus; - return; - } - - throw new ArgumentException("Unknown trait " + trait); + get { return 2 + Vigor.HalfScore + Toughness + Armor; } } - internal Trait GetAttribute(string attribute) - { - switch (attribute) - { - case "Vigor": return Vigor; - case "Smarts": return Smarts; - case "Agility": return Agility; - case "Strength": return Strength; - case "Spirit": return Spirit; - } - throw new ArgumentException("Unknown attribute " + attribute); - } + public int Armor { get { return Get(); } set { Set(value); } } + public int UnusedAdvances { get { return Get(); } set { Set(value); } } + public int UnusedAttributes { get { return Get(); } set { Set(value); } } + public int UnusedEdges { get { return Get(); } set { Set(value); } } + public int UnusedHindrances { get { return Get(); } set { Set(value); } } + public int UnusedIconicEdges { get { return Get(); } set { Set(value); } } + public int UnusedRacialEdges { get { return Get(); } set { Set(value); } } + public int UnusedSkills { get { return Get(); } set { Set(value); } } + public int UnusedSmartSkills { get { return Get(); } set { Set(value); } } + public bool UseReason { get => Get(); set => Set(value); } + public bool UseStatus { get => Get(); set => Set(value); } + public bool UseStrain { get => Get(); set => Set(value); } + public Trait Vigor { get => Get(); set => Set(value); } /// /// Determines whether the specified feature has feature. /// @@ -254,7 +175,78 @@ public bool HasFeature(string feature, bool ignoreRank) return false; } - public PowerGroupCollection PowerGroups => GetNew(); + public void Increment(string trait, Dice dice) + { + Increment(trait, 1, dice); + } + + public void Increment(string trait, int bonus, Dice dice) + { + switch (trait) + { + case "Vigor": Vigor += bonus; return; + case "Smarts": Smarts += bonus; return; + case "Agility": Agility += bonus; return; + case "Strength": Strength += bonus; return; + case "Spirit": Spirit += bonus; return; + + case "MaxVigor": MaxVigor += bonus; return; + case "MaxSmarts": MaxSmarts += bonus; return; + case "MaxAgility": MaxAgility += bonus; return; + case "MaxStrength": MaxStrength += bonus; return; + case "MaxSpirit": MaxSpirit += bonus; return; + + case "Pace": Pace += bonus; return; + case "Running": Running += bonus; return; + case "Charisma": Charisma += bonus; return; + case "Parry": Parry += bonus; return; + case "Toughness": Toughness += bonus; return; + case "Strain": Strain += bonus; return; + case "MaximumStrain": MaximumStrain += bonus; return; + case "Reason": Reason += bonus; return; + case "Status": Status += bonus; return; + case "Size": Size += bonus; return; + case "Armor": Armor += bonus; return; + + + case "UnusedAttributes": UnusedAttributes += bonus; return; + case "UnusedSkills": UnusedSkills += bonus; return; + case "UnusedSmartSkills": UnusedSmartSkills += bonus; return; + case "UnusedEdges": UnusedEdges += bonus; return; + case "UnusedRacialEdges": UnusedRacialEdges += bonus; return; + case "UnusedHindrances": UnusedHindrances += bonus; return; + case "UnusedAdvances": UnusedAdvances += bonus; return; + case "PowerPoints": dice.Choose(PowerGroups).PowerPoints += bonus; return; + case "UnusedPowers": dice.Choose(PowerGroups).UnusedPowers += bonus; return; + } + + if (trait.StartsWith("PowerPoints:")) + { + PowerGroups[trait.Substring("PowerPoints:".Length)].PowerPoints += bonus; + return; + } + + if (trait.StartsWith("UnusedPowers:")) + { + PowerGroups[trait.Substring("UnusedPowers:".Length)].UnusedPowers += bonus; + return; + } + + throw new ArgumentException("Unknown trait " + trait); + } + + internal Trait GetAttribute(string attribute) + { + switch (attribute) + { + case "Vigor": return Vigor; + case "Smarts": return Smarts; + case "Agility": return Agility; + case "Strength": return Strength; + case "Spirit": return Spirit; + } + throw new ArgumentException("Unknown attribute " + attribute); + } } } diff --git a/SavageTools/SavageTools.Shared/Characters/Feature.cs b/SavageTools/SavageTools.Shared/Characters/Feature.cs index fe7d112..405d874 100644 --- a/SavageTools/SavageTools.Shared/Characters/Feature.cs +++ b/SavageTools/SavageTools.Shared/Characters/Feature.cs @@ -6,5 +6,4 @@ public class Feature : ChangeTrackingModelBase { public string Name { get => Get(); set => Set(value); } - } -} \ No newline at end of file + } } \ No newline at end of file diff --git a/SavageTools/SavageTools.Shared/Characters/FeatureCollection.cs b/SavageTools/SavageTools.Shared/Characters/FeatureCollection.cs index c000911..e05cb7c 100644 --- a/SavageTools/SavageTools.Shared/Characters/FeatureCollection.cs +++ b/SavageTools/SavageTools.Shared/Characters/FeatureCollection.cs @@ -10,5 +10,4 @@ internal void Add(string name) if (!this.Any(f => f.Name == name)) Add(new Feature() { Name = name }); } - } -} \ No newline at end of file + } } \ No newline at end of file diff --git a/SavageTools/SavageTools.Shared/Characters/Personality.cs b/SavageTools/SavageTools.Shared/Characters/Personality.cs new file mode 100644 index 0000000..ae5a312 --- /dev/null +++ b/SavageTools/SavageTools.Shared/Characters/Personality.cs @@ -0,0 +1,10 @@ +using Tortuga.Anchor.Modeling; + +namespace SavageTools.Characters +{ + public class Personality : ChangeTrackingModelBase + { + public string Name { get => Get(); set => Set(value); } + + } +} \ No newline at end of file diff --git a/SavageTools/SavageTools.Shared/Characters/PersonalityCollection.cs b/SavageTools/SavageTools.Shared/Characters/PersonalityCollection.cs new file mode 100644 index 0000000..1a8a485 --- /dev/null +++ b/SavageTools/SavageTools.Shared/Characters/PersonalityCollection.cs @@ -0,0 +1,14 @@ +using System.Linq; +using Tortuga.Anchor.Modeling; + +namespace SavageTools.Characters +{ + public class PersonalityCollection : ChangeTrackingModelCollection + { + internal void Add(string name) + { + if (!this.Any(f => f.Name == name)) + Add(new Personality() { Name = name }); + } + } +} \ No newline at end of file diff --git a/SavageTools/SavageTools.Shared/NameService.cs b/SavageTools/SavageTools.Shared/NameService.cs index 0fa5f29..66f812c 100644 --- a/SavageTools/SavageTools.Shared/NameService.cs +++ b/SavageTools/SavageTools.Shared/NameService.cs @@ -10,8 +10,11 @@ public class LocalNameService readonly ImmutableList m_FemaleNames; readonly ImmutableList m_MaleNames; - public LocalNameService(string dataPath, string prefix = "victorian-") + public LocalNameService(string dataPath, string prefix) { + if (!string.IsNullOrWhiteSpace(prefix) && !prefix.EndsWith("-")) + prefix += "-"; + var femaleFile = new FileInfo(Path.Combine(dataPath, prefix + "female-first.txt")); var lastFile = new FileInfo(Path.Combine(dataPath, prefix + "last.txt")); var maleFile = new FileInfo(Path.Combine(dataPath, prefix + "male-first.txt")); diff --git a/SavageTools/SavageTools.Shared/SavageTools.Shared.csproj b/SavageTools/SavageTools.Shared/SavageTools.Shared.csproj index dacf492..aa8f264 100644 --- a/SavageTools/SavageTools.Shared/SavageTools.Shared.csproj +++ b/SavageTools/SavageTools.Shared/SavageTools.Shared.csproj @@ -63,6 +63,8 @@ + + @@ -137,6 +139,17 @@ PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + core.windows.net + core.chinacloudapi.cn + core.cloudapi.de + core.usgovcloudapi.net + localhost + 127.0.0.1 + + +