From fbe815013f4e676364a6d54fb68d5d1b699d3142 Mon Sep 17 00:00:00 2001 From: Colin Halseth Date: Wed, 28 Apr 2021 12:58:49 -0700 Subject: [PATCH] Added equipment management system; Changes to how items work --- TrekSharp.AdventureTools/Data/App.cs | 5 +- .../Pages/CreateCustomData.razor | 16 +++ .../Pages/CreateItem.razor | 110 ++++++++++++++++++ .../Pages/CreateNpcType.razor | 2 +- .../Pages/CreateSpecies.razor | 2 +- .../Pages/ManageCustom.razor | 30 +++++ .../Pages/ManageEncounter.razor | 12 +- .../Pages/ManageShips.razor | 2 +- .../Pages/ViewCharacterNpcSheet.razor | 2 +- .../Pages/ViewCharacterSheet.razor | 2 +- .../Pages/ViewCharacterSupportSheet.razor | 2 +- .../Shared/CrewSupportDrawer.razor | 2 +- .../Shared/EquipmentDrawer.razor | 53 +++++++-- .../Shared/FocusDrawer.razor | 2 +- .../Shared/InjuryDrawer.razor | 2 +- TrekSharp.AdventureTools/Shared/NavMenu.razor | 7 +- .../Shared/PowerDrawer.razor | 2 +- .../Shared/ShieldsDrawer.razor | 2 +- .../Shared/ShipWeaponsDrawer.razor | 2 +- .../Shared/ValueDrawer.razor | 2 +- TrekSharp.AdventureTools/wwwroot/css/pdf.css | 4 + TrekSharp.AdventureTools/wwwroot/index.html | 3 + TrekSharp/src/Items.cs | 14 ++- TrekSharp/src/Rulebooks/Core.cs | 50 +++++++- TrekSharp/src/Rulebooks/OperationsDivision.cs | 11 ++ 25 files changed, 302 insertions(+), 39 deletions(-) create mode 100644 TrekSharp.AdventureTools/Pages/CreateCustomData.razor create mode 100644 TrekSharp.AdventureTools/Pages/CreateItem.razor diff --git a/TrekSharp.AdventureTools/Data/App.cs b/TrekSharp.AdventureTools/Data/App.cs index 50170f8..54d9b16 100644 --- a/TrekSharp.AdventureTools/Data/App.cs +++ b/TrekSharp.AdventureTools/Data/App.cs @@ -19,10 +19,13 @@ public UserCustomSpecies() { public class UserCustomData { public UserCustomSpecies Species {get; set;} - public List NpcCharacterTypes {get; set;} = new List(); + public List NpcCharacterTypes {get; set;} + public List Items {get; set;} public UserCustomData() { Species = new UserCustomSpecies(); + NpcCharacterTypes = new List(); + Items = new List(); } } diff --git a/TrekSharp.AdventureTools/Pages/CreateCustomData.razor b/TrekSharp.AdventureTools/Pages/CreateCustomData.razor new file mode 100644 index 0000000..76cbc1d --- /dev/null +++ b/TrekSharp.AdventureTools/Pages/CreateCustomData.razor @@ -0,0 +1,16 @@ +@page "/new/custom" + + +
+ Create custom resources for use within your own campaigns where the species, items, or npc types provided in the official rulebooks do not provide what you require. +
+ + Custom Species + + + Custom NPC Type + + + Custom Item + +
\ No newline at end of file diff --git a/TrekSharp.AdventureTools/Pages/CreateItem.razor b/TrekSharp.AdventureTools/Pages/CreateItem.razor new file mode 100644 index 0000000..a071963 --- /dev/null +++ b/TrekSharp.AdventureTools/Pages/CreateItem.razor @@ -0,0 +1,110 @@ +@page "/new/custom/item" +@inherits AppComponentBase + + +
+ This tool will allow you to create custom items which players can collect and use throughout a campaign. +
+
+
+ + DETAILS + +
+
+
+
+ + + +
+
+ Name + + + +
+ @if (!IsClothing) { +
+ Size + + + +
+ } + @if (IsWeapon) { +
+ Damage Rating + + + +
+ } +
+
+
+ + QUALITIES + +
+
+
+ +
+
+ +
+
+ +
+
+
+
+ +
+
+ +@code { + private Item item = new Item{}; + + private string size { + get => item.Size.ToString(); + set { + item.Size = Enum.Parse(value); + } + } + private bool IsClothing => item.Size == ItemSize.Worn && !IsWeapon; + private bool IsTool => item.Size != ItemSize.Worn && !IsWeapon; + private bool IsWeapon => item.DamageDice.HasValue; + + + private void makeClothing() { + item.DamageDice = null; + item.Size = ItemSize.Worn; + } + + private void makeTool() { + item.DamageDice = null; + item.Size = ItemSize.OneHanded; + } + + private void makeWeapon() { + item.DamageDice = 0; + item.Size = ItemSize.OneHanded; + } + + private void save() { + if (Data.Custom == null) + Data.Custom = new UserCustomData(); + if (Data.Custom.Items == null) + Data.Custom.Items = new List(); + + Data.Custom.Items.Add(item); + item = new Item(); + this.NavigationManager.NavigateTo("manage/custom"); + } +} \ No newline at end of file diff --git a/TrekSharp.AdventureTools/Pages/CreateNpcType.razor b/TrekSharp.AdventureTools/Pages/CreateNpcType.razor index d5cb4e4..f3eb1e9 100644 --- a/TrekSharp.AdventureTools/Pages/CreateNpcType.razor +++ b/TrekSharp.AdventureTools/Pages/CreateNpcType.razor @@ -1,4 +1,4 @@ -@page "/new/npc" +@page "/new/custom/npc" @using Data @inherits AppComponentBase diff --git a/TrekSharp.AdventureTools/Pages/CreateSpecies.razor b/TrekSharp.AdventureTools/Pages/CreateSpecies.razor index efd3a11..db5200f 100644 --- a/TrekSharp.AdventureTools/Pages/CreateSpecies.razor +++ b/TrekSharp.AdventureTools/Pages/CreateSpecies.razor @@ -1,4 +1,4 @@ -@page "/new/species" +@page "/new/custom/species" @inherits AppComponentBase diff --git a/TrekSharp.AdventureTools/Pages/ManageCustom.razor b/TrekSharp.AdventureTools/Pages/ManageCustom.razor index ed607e2..6c29672 100644 --- a/TrekSharp.AdventureTools/Pages/ManageCustom.razor +++ b/TrekSharp.AdventureTools/Pages/ManageCustom.razor @@ -48,6 +48,25 @@ } + + @if (Data.Custom != null && Data.Custom.Items != null) { + + + + } + + @@ -80,5 +99,16 @@ StateHasChanged(); } + private void confirmDeleteItem(Item character) { + confirm.Open($"Are you sure you want to delete the item '{character.Name}'?", () => deleteItem(character)); + } + + private void deleteItem(Item character) { + if (Data.Custom != null && Data.Custom.Items != null) { + Data.Custom.Items.Remove(character); + } + StateHasChanged(); + } + } \ No newline at end of file diff --git a/TrekSharp.AdventureTools/Pages/ManageEncounter.razor b/TrekSharp.AdventureTools/Pages/ManageEncounter.razor index 6494d97..54bf374 100644 --- a/TrekSharp.AdventureTools/Pages/ManageEncounter.razor +++ b/TrekSharp.AdventureTools/Pages/ManageEncounter.razor @@ -119,7 +119,7 @@
-
+
@@ -143,7 +143,7 @@
-
+
@@ -170,7 +170,7 @@
-
+
@@ -210,7 +210,7 @@
Stress / @capture.TotalStress
-
+
@@ -237,7 +237,7 @@
Stress / @capture.TotalStress
-
+
@@ -267,7 +267,7 @@
Stress / @capture.TotalStress
-
+
diff --git a/TrekSharp.AdventureTools/Pages/ManageShips.razor b/TrekSharp.AdventureTools/Pages/ManageShips.razor index 6c35379..59a2b02 100644 --- a/TrekSharp.AdventureTools/Pages/ManageShips.razor +++ b/TrekSharp.AdventureTools/Pages/ManageShips.razor @@ -70,7 +70,7 @@ OnLoad="onShipLoaded" /> - + StateHasChanged())> @code { private RawShipCreator raw; diff --git a/TrekSharp.AdventureTools/Pages/ViewCharacterNpcSheet.razor b/TrekSharp.AdventureTools/Pages/ViewCharacterNpcSheet.razor index f66e03e..5f13f5c 100644 --- a/TrekSharp.AdventureTools/Pages/ViewCharacterNpcSheet.razor +++ b/TrekSharp.AdventureTools/Pages/ViewCharacterNpcSheet.razor @@ -45,7 +45,7 @@ - + diff --git a/TrekSharp.AdventureTools/Pages/ViewCharacterSheet.razor b/TrekSharp.AdventureTools/Pages/ViewCharacterSheet.razor index 1669ffa..39d0fc8 100644 --- a/TrekSharp.AdventureTools/Pages/ViewCharacterSheet.razor +++ b/TrekSharp.AdventureTools/Pages/ViewCharacterSheet.razor @@ -69,7 +69,7 @@ - + diff --git a/TrekSharp.AdventureTools/Pages/ViewCharacterSupportSheet.razor b/TrekSharp.AdventureTools/Pages/ViewCharacterSupportSheet.razor index b3a3104..88a0410 100644 --- a/TrekSharp.AdventureTools/Pages/ViewCharacterSupportSheet.razor +++ b/TrekSharp.AdventureTools/Pages/ViewCharacterSupportSheet.razor @@ -51,7 +51,7 @@ - + diff --git a/TrekSharp.AdventureTools/Shared/CrewSupportDrawer.razor b/TrekSharp.AdventureTools/Shared/CrewSupportDrawer.razor index ffa745f..80e7237 100644 --- a/TrekSharp.AdventureTools/Shared/CrewSupportDrawer.razor +++ b/TrekSharp.AdventureTools/Shared/CrewSupportDrawer.razor @@ -1,4 +1,4 @@ -
+
diff --git a/TrekSharp.AdventureTools/Shared/EquipmentDrawer.razor b/TrekSharp.AdventureTools/Shared/EquipmentDrawer.razor index 3c96691..a1f3dac 100644 --- a/TrekSharp.AdventureTools/Shared/EquipmentDrawer.razor +++ b/TrekSharp.AdventureTools/Shared/EquipmentDrawer.razor @@ -1,4 +1,7 @@ -
+@using Data +@inherits AppComponentBase + +
@@ -10,27 +13,63 @@
    @if (Player != null && Player.Equipment != null) { foreach (var item in Player.Equipment) { + var capture = item;
  • - @item.Name - @if(item.Qualities != null) { + removeItem(capture))>× + @capture.Name + @if(capture.Qualities != null && capture.Qualities.Count > 0) { (@string.Join(',', item.Qualities)) } - @if (item.UsageDice.HasValue) { + @if (item.DamageDice.HasValue && item.DamageDice.Value != 0) { - @(item.UsageDice.Value + Player.BonusDamageDice) + @(item.DamageDice.Value + Player.BonusDamageDice) } + @if(AllowEdit) { + + }
  • } }
+ @if(AllowEdit) { +
+ +
+ }
+ + + @code { - [Parameter] - public Character Player {get; set;} + private AssetAddList itemList; + private List items; + + [Parameter] public Character Player {get; set;} + [Parameter] public bool AllowEdit {get; set;} = false; + + protected override void OnInitialized() { + RulebookContainer books = new RulebookContainer(); + books.AddRulebook("User Created", new UserCreatedSpeciesRulebook(Data)); + items = books.AllRulebooks.SelectMany(book => book.Value.Items).OrderBy((item) => item.Name).ToList(); + } + + private void removeItem(Item item) { + Player.Equipment.Remove(item); + StateHasChanged(); + } + private void onAddItem(Item item) { + Player.Equipment.Add(item); + StateHasChanged(); + } } \ No newline at end of file diff --git a/TrekSharp.AdventureTools/Shared/FocusDrawer.razor b/TrekSharp.AdventureTools/Shared/FocusDrawer.razor index 58da21a..447b4bd 100644 --- a/TrekSharp.AdventureTools/Shared/FocusDrawer.razor +++ b/TrekSharp.AdventureTools/Shared/FocusDrawer.razor @@ -1,4 +1,4 @@ -
+
diff --git a/TrekSharp.AdventureTools/Shared/InjuryDrawer.razor b/TrekSharp.AdventureTools/Shared/InjuryDrawer.razor index 5d5d19c..4fe1e5e 100644 --- a/TrekSharp.AdventureTools/Shared/InjuryDrawer.razor +++ b/TrekSharp.AdventureTools/Shared/InjuryDrawer.razor @@ -1,4 +1,4 @@ -
+
diff --git a/TrekSharp.AdventureTools/Shared/NavMenu.razor b/TrekSharp.AdventureTools/Shared/NavMenu.razor index 1b9e1ea..1a515e6 100644 --- a/TrekSharp.AdventureTools/Shared/NavMenu.razor +++ b/TrekSharp.AdventureTools/Shared/NavMenu.razor @@ -61,11 +61,8 @@ Ship - - Custom Species - - - Custom NPC Type + + Custom Data Battle Grid diff --git a/TrekSharp.AdventureTools/Shared/PowerDrawer.razor b/TrekSharp.AdventureTools/Shared/PowerDrawer.razor index b870b73..427314f 100644 --- a/TrekSharp.AdventureTools/Shared/PowerDrawer.razor +++ b/TrekSharp.AdventureTools/Shared/PowerDrawer.razor @@ -1,4 +1,4 @@ -
+
diff --git a/TrekSharp.AdventureTools/Shared/ShieldsDrawer.razor b/TrekSharp.AdventureTools/Shared/ShieldsDrawer.razor index 19239d1..1983a1d 100644 --- a/TrekSharp.AdventureTools/Shared/ShieldsDrawer.razor +++ b/TrekSharp.AdventureTools/Shared/ShieldsDrawer.razor @@ -1,4 +1,4 @@ -
+
diff --git a/TrekSharp.AdventureTools/Shared/ShipWeaponsDrawer.razor b/TrekSharp.AdventureTools/Shared/ShipWeaponsDrawer.razor index 19ddb2f..63d68a1 100644 --- a/TrekSharp.AdventureTools/Shared/ShipWeaponsDrawer.razor +++ b/TrekSharp.AdventureTools/Shared/ShipWeaponsDrawer.razor @@ -1,4 +1,4 @@ -
+
diff --git a/TrekSharp.AdventureTools/Shared/ValueDrawer.razor b/TrekSharp.AdventureTools/Shared/ValueDrawer.razor index 2c66f16..b8a73bc 100644 --- a/TrekSharp.AdventureTools/Shared/ValueDrawer.razor +++ b/TrekSharp.AdventureTools/Shared/ValueDrawer.razor @@ -1,4 +1,4 @@ -
+
diff --git a/TrekSharp.AdventureTools/wwwroot/css/pdf.css b/TrekSharp.AdventureTools/wwwroot/css/pdf.css index 936419e..eef9231 100644 --- a/TrekSharp.AdventureTools/wwwroot/css/pdf.css +++ b/TrekSharp.AdventureTools/wwwroot/css/pdf.css @@ -2,6 +2,10 @@ display: none; } +.no-split { + page-break-inside: avoid; +} + .pagebreak { width: 0px; height: 0px; diff --git a/TrekSharp.AdventureTools/wwwroot/index.html b/TrekSharp.AdventureTools/wwwroot/index.html index e1eb740..2a465a6 100644 --- a/TrekSharp.AdventureTools/wwwroot/index.html +++ b/TrekSharp.AdventureTools/wwwroot/index.html @@ -36,6 +36,9 @@ document.body.scrollTop = 0; document.documentElement.scrollTop = 0; } + window.onbeforeunload = function() { + return "Unsaved app data will be lost if you leave the page, are you sure?"; + }; diff --git a/TrekSharp/src/Items.cs b/TrekSharp/src/Items.cs index cbc8df8..b755d2f 100644 --- a/TrekSharp/src/Items.cs +++ b/TrekSharp/src/Items.cs @@ -2,10 +2,20 @@ namespace TrekSharp{ +public enum ItemSize { + OneHanded, TwoHanded, Worn +} + public class Item { public string Name {get; set;} - public int? UsageDice {get; set;} = null; - public List Qualities {get; set;} = null; + public ItemSize Size {get; set;} + public int? DamageDice {get; set;} = null; + public List Qualities {get; set;} = new List(); + + public override string ToString() { + return Name; + } + } } \ No newline at end of file diff --git a/TrekSharp/src/Rulebooks/Core.cs b/TrekSharp/src/Rulebooks/Core.cs index fe9e03f..4d4341b 100644 --- a/TrekSharp/src/Rulebooks/Core.cs +++ b/TrekSharp/src/Rulebooks/Core.cs @@ -1798,6 +1798,7 @@ List items "Reclamation: Drone may attempt a Reason + Medicine task with difficulty 0 on an injured drone within reach. If successful, the injured drone dies and its parts are reclaimed." } } + }, new List { new MissionProfile( @@ -2083,11 +2084,50 @@ List items ) {PowerModifier = 5} }, new List { - new Item { Name = "Uniform" }, - new Item { Name = "Communicator" }, - new Item { Name = "Tricorder" }, - new Item { Name = "Phaser Type 1", UsageDice = 2, Qualities = new List{ "Charge", "Hidden 1" } }, - new Item { Name = "Unarmed Strike", UsageDice = 1, Qualities = new List{ "Knockdown", "Non-lethal" } }, + new Item { Name = "Uniform", Size = ItemSize.Worn }, + new Item { Name = "Communicator", Size = ItemSize.Worn }, + new Item { Name = "Tricorder", Size = ItemSize.OneHanded }, + new Item { Name = "Phaser Type 1", Size = ItemSize.OneHanded, DamageDice = 2, Qualities = new List{ "Charge", "Hidden 1" } }, + new Item { Name = "Unarmed Strike",Size = ItemSize.OneHanded, DamageDice = 1, Qualities = new List{ "Knockdown", "Non-lethal" } }, + new Item { Name = "Knife", Size = ItemSize.OneHanded, DamageDice = 1, Qualities = new List{ "Vicious 1", "Deadly", "Hidden 1" } }, + new Item { Name = "Dagger", Size = ItemSize.OneHanded, DamageDice = 1, Qualities = new List{ "Vicious 1", "Deadly", "Hidden 1" } }, + new Item { Name = "Sword", Size = ItemSize.OneHanded, DamageDice = 2, Qualities = new List{ "Vicious 1" } }, + new Item { Name = "Mek'leth", Size = ItemSize.OneHanded, DamageDice = 2, Qualities = new List{ "Vicious 1" } }, + new Item { Name = "Heavy Sword", Size = ItemSize.TwoHanded, DamageDice = 3, Qualities = new List{ "Vicious 1" } }, + new Item { Name = "Bat'leth", Size = ItemSize.TwoHanded, DamageDice = 3, Qualities = new List{ "Vicious 1" } }, + new Item { Name = "Kzar'takin", Size = ItemSize.TwoHanded, DamageDice = 3, Qualities = new List{ "Vicious 1" } }, + new Item { Name = "Lirpa", Size = ItemSize.TwoHanded, DamageDice = 3, Qualities = new List{ "Vicious 1" } }, + new Item { Name = "Phaser Type 2", Size = ItemSize.OneHanded, DamageDice = 3, Qualities = new List{ "Charge" } }, + new Item { Name = "Phaser Type 3", Size = ItemSize.TwoHanded, DamageDice = 4, Qualities = new List{ "Accurate", "Charge" } }, + new Item { Name = "Pulse Grenade", Size = ItemSize.OneHanded, DamageDice = 4, Qualities = new List{ "Area", "Charge", "Grenade" } }, + new Item { Name = "Andorian Plasma Rifle", Size = ItemSize.TwoHanded, DamageDice = 4, Qualities = new List{ "Accurate", "Deadly" } }, + new Item { Name = "Phase Pistol", Size = ItemSize.OneHanded, DamageDice = 3, Qualities = new List{ } }, + new Item { Name = "Particle Rifle", Size = ItemSize.TwoHanded, DamageDice = 4, Qualities = new List{ "Accurate" } }, + new Item { Name = "Disruptor Pistol", Size = ItemSize.OneHanded, DamageDice = 3, Qualities = new List{ "Vicious 1" } }, + new Item { Name = "Disruptor Rifle", Size = ItemSize.TwoHanded, DamageDice = 4, Qualities = new List{ "Vicious 1", "Accurate" } }, + new Item { Name = "Jem'Hadar Plasma Pistol", Size = ItemSize.OneHanded, DamageDice = 3, Qualities = new List{ "Vicious 1", "Debilitating" } }, + new Item { Name = "Jem'Hadar Plasma Rifle", Size = ItemSize.TwoHanded, DamageDice = 4, Qualities = new List{ "Vicious 1", "Accurate", "Debilitating" } }, + new Item { Name = "Body Armor", Size = ItemSize.Worn }, + new Item { Name = "Environmental Suit", Size = ItemSize.Worn }, + new Item { Name = "Personal Force Field", Size = ItemSize.Worn }, + new Item { Name = "Chronometer", Size = ItemSize.OneHanded }, + new Item { Name = "Engineering Toolkit", Size = ItemSize.OneHanded }, + new Item { Name = "Plasma Torch", Size = ItemSize.OneHanded }, + new Item { Name = "Portable Electron Microscope", Size = ItemSize.OneHanded }, + new Item { Name = "Portable Mass Spectrometer", Size = ItemSize.TwoHanded }, + new Item { Name = "Heartbeat Reader", Size = ItemSize.OneHanded }, + new Item { Name = "Tri-laser Connector", Size = ItemSize.OneHanded }, + new Item { Name = "Anabolic Protoplaser", Size = ItemSize.OneHanded }, + new Item { Name = "Dermal Regenerator", Size = ItemSize.OneHanded }, + new Item { Name = "Emergency Surgical Kit", Size = ItemSize.OneHanded }, + new Item { Name = "Laser Scalpel", Size = ItemSize.OneHanded }, + new Item { Name = "Hypospray", Size = ItemSize.OneHanded }, + new Item { Name = "Detronal Scanner", Size = ItemSize.OneHanded }, + new Item { Name = "Neurocortical Monitor", Size = ItemSize.OneHanded }, + new Item { Name = "Anti-grav Unit", Size = ItemSize.TwoHanded }, + new Item { Name = "Holographic Imager", Size = ItemSize.TwoHanded }, + new Item { Name = "PADD", Size = ItemSize.OneHanded }, + new Item { Name = "Pattern Enhancer", Size = ItemSize.TwoHanded }, } ); } diff --git a/TrekSharp/src/Rulebooks/OperationsDivision.cs b/TrekSharp/src/Rulebooks/OperationsDivision.cs index 67480d5..988af27 100644 --- a/TrekSharp/src/Rulebooks/OperationsDivision.cs +++ b/TrekSharp/src/Rulebooks/OperationsDivision.cs @@ -181,6 +181,17 @@ private OperationsDivision() {} "Rocks Into Replicators", "Starfleet engineers are famed for being able to build or create nearly anything needed from the most basic of available components. Once per session, you may destroy any single piece of equipment to create any other piece of equipment of an equal or lower Opportunity Cost. This new piece of equipment has a Complication range increase of 2, with the Complication being a malfunction that renders it useless. You should provide a reasonable explanation as to how a repurposed or cannibalized device could function and the Gamemaster has final say if there is any question about the “reasonableness” of the new device." ) + }, + Items = new List { + new Item { Name = "Micro-Optic Drill", Size = ItemSize.OneHanded }, + new Item { Name = "Phaser Drill", Size = ItemSize.TwoHanded }, + new Item { Name = "Engineering Tricorder", Size = ItemSize.OneHanded }, + new Item { Name = "Field Destabilizer", Size = ItemSize.OneHanded }, + new Item { Name = "Hyperspanner", Size = ItemSize.OneHanded }, + new Item { Name = "Magnetic Probe", Size = ItemSize.OneHanded }, + new Item { Name = "Sonic Driver", Size = ItemSize.OneHanded }, + new Item { Name = "Transport Inhibitor", Size = ItemSize.OneHanded }, + new Item { Name = "Chronometer", Size = ItemSize.OneHanded }, } };