From 770b82999cf9af3aee1b37a5d610045642a804ef Mon Sep 17 00:00:00 2001 From: Josh Ashton Date: Fri, 25 Nov 2022 00:30:06 -0700 Subject: [PATCH] Merging latest gui implementation to main. --- dndBuilder/.DS_Store | Bin 6148 -> 0 bytes dndBuilder/dndBuilder.iml | 11 - .../AbilityScores/CharacterStats.java | 81 ---- .../src/Character/AbilityScores/Charisma.java | 55 --- .../Character/AbilityScores/Constitution.java | 55 --- .../Character/AbilityScores/Dexterity.java | 55 --- .../Character/AbilityScores/Intelligence.java | 55 --- .../src/Character/AbilityScores/Stats.java | 56 --- .../src/Character/AbilityScores/Strength.java | 67 --- .../src/Character/AbilityScores/Wisdom.java | 55 --- dndBuilder/src/Character/Background.java | 154 ------- dndBuilder/src/Character/CharacterSheet.java | 121 ------ .../src/Character/Classes/ClassTemplate.java | 39 -- dndBuilder/src/Character/Classes/Cleric.java | 92 ---- dndBuilder/src/Character/Classes/Fighter.java | 92 ---- dndBuilder/src/Character/Classes/Wizard.java | 92 ---- .../src/Character/Races/Dragonborn.java | 72 ---- dndBuilder/src/Character/Races/Dwarf.java | 72 ---- dndBuilder/src/Character/Races/Elf.java | 72 ---- dndBuilder/src/Character/Races/Gnome.java | 72 ---- dndBuilder/src/Character/Races/HalfElf.java | 77 ---- dndBuilder/src/Character/Races/HalfOrc.java | 72 ---- dndBuilder/src/Character/Races/Halfling.java | 73 ---- dndBuilder/src/Character/Races/Human.java | 74 ---- dndBuilder/src/Character/Races/Race.java | 47 -- dndBuilder/src/Character/Races/Tiefling.java | 72 ---- dndBuilder/src/Character/Skills.java | 76 ---- dndBuilder/src/DndCharacterBuilder.java | 15 - dndBuilder/src/FileManagement/ExportPDF.java | 10 - .../src/FileManagement/FileManager.java | 119 ------ dndBuilder/src/GUI/.DS_Store | Bin 6148 -> 0 bytes dndBuilder/src/GUI/AppTheme.java | 30 -- dndBuilder/src/GUI/GUImanager.java | 404 ------------------ dndBuilder/src/GUI/Panels/BasicPanel.java | 127 ------ .../GUI/Panels/ChooseAbilityScoresPanel.java | 238 ----------- .../src/GUI/Panels/DescriptionPanel.java | 304 ------------- .../src/GUI/Panels/LoadCharacterPanel.java | 4 - dndBuilder/src/GUI/Panels/MainMenuPanel.java | 69 --- .../src/GUI/Panels/PreviewCharacterSheet.java | 4 - dndBuilder/src/GUI/Panels/step4.java | 281 ------------ .../Resources/CustomAssets/BasicNavPanel.java | 78 ---- .../Resources/CustomAssets/CustomTheme.java | 14 - .../Resources/CustomAssets/DefaultButton.java | 95 ---- .../CustomAssets/ImageInfoPanel.java | 142 ------ .../src/Resources/CustomAssets/InfoPanel.java | 95 ---- dndBuilder/src/Tests/dndTestClient.java | 26 -- {dndBuilder/src => src}/.DS_Store | Bin .../src => src}/DieRoller/DiceRoller.java | 0 .../deprecated}/RoundedBorder.java | 2 - src/target/App.class | Bin 0 -> 400 bytes src/target/AppTheme.class | Bin 0 -> 1235 bytes src/target/Background.class | Bin 0 -> 8346 bytes src/target/BasicNavPanel.class | Bin 0 -> 2138 bytes src/target/BasicPanel.class | Bin 0 -> 3473 bytes src/target/CharacterSheet.class | Bin 0 -> 2053 bytes src/target/CharacterStats.class | Bin 0 -> 1822 bytes src/target/Charisma.class | Bin 0 -> 1286 bytes src/target/ChooseAbilityScoresPanel.class | Bin 0 -> 5307 bytes src/target/ClassTemplate.class | Bin 0 -> 519 bytes src/target/Cleric.class | Bin 0 -> 1136 bytes src/target/Constitution.class | Bin 0 -> 1285 bytes src/target/CustomTheme.class | Bin 0 -> 346 bytes src/target/DefaultButton$1.class | Bin 0 -> 886 bytes src/target/DefaultButton.class | Bin 0 -> 1363 bytes src/target/DescriptionPanel.class | Bin 0 -> 6493 bytes src/target/Dexterity.class | Bin 0 -> 1250 bytes src/target/Dragonborn.class | Bin 0 -> 1200 bytes src/target/Dwarf.class | Bin 0 -> 1188 bytes src/target/Elf.class | Bin 0 -> 1182 bytes src/target/ExportPDF.class | Bin 0 -> 196 bytes src/target/Fighter.class | Bin 0 -> 1138 bytes src/target/FileManager.class | Bin 0 -> 2878 bytes src/target/GUImanager.class | Bin 0 -> 17175 bytes src/target/Gnome.class | Bin 0 -> 1187 bytes src/target/HalfElf.class | Bin 0 -> 1265 bytes src/target/HalfOrc.class | Bin 0 -> 1189 bytes src/target/Halfling.class | Bin 0 -> 1192 bytes src/target/Human.class | Bin 0 -> 1212 bytes src/target/ImageInfoPanel.class | Bin 0 -> 3296 bytes .../Img/Classes/artificer/artificer.jpg | Bin .../Img/Classes/barbarian/barbarian.png | Bin .../target}/Img/Classes/bard/bard.png | Bin .../target}/Img/Classes/cleric/cleric.png | Bin .../target}/Img/Classes/druid/druid.png | Bin .../target}/Img/Classes/fighter/fighter.png | Bin .../target}/Img/Classes/monk/monk.png | Bin .../target}/Img/Classes/paladin/paladin.png | Bin .../target}/Img/Classes/ranger/ranger.png | Bin .../target}/Img/Classes/rogue/rogue.png | Bin .../target}/Img/Classes/sorcerer/sorcerer.png | Bin .../target}/Img/Classes/warlock/warlock.png | Bin .../target}/Img/Classes/wizard/wizard.png | Bin .../Img/Races/dragonborn/dragonborn.jpg | Bin .../Img/Races/dragonborn/dragonborn2.jpg | Bin .../Img/Races/dragonborn/dragonborn3.jpg | Bin .../Img/Races/dragonborn/dragonborn4.jpg | Bin .../Img/Races/dragonborn/dragonborn5.jpg | Bin .../Img/Races/dragonborn/dragonborn6.jpg | Bin .../target}/Img/Races/dwarf/dwarf.jpg | Bin .../target}/Img/Races/elf/elf.jpg | Bin .../target}/Img/Races/gnome/gnome.jpg | Bin .../target}/Img/Races/halfelf/halfelf.jpg | Bin .../target}/Img/Races/halfling/halfling.jpg | Bin .../target}/Img/Races/halforc/halforc.jpg | Bin .../target}/Img/Races/human/human.jpg | Bin .../target}/Img/Races/tiefling/tiefling.jpg | Bin .../Resources => src/target}/Img/sheet.jpg | Bin src/target/InfoPanel.class | Bin 0 -> 2194 bytes src/target/Intelligence.class | Bin 0 -> 1256 bytes src/target/LoadCharacterPanel.class | Bin 0 -> 210 bytes src/target/MainMenuPanel.class | Bin 0 -> 1750 bytes src/target/PreviewCharacterSheet.class | Bin 0 -> 216 bytes src/target/Race.class | Bin 0 -> 310 bytes .../Fonts => src/target}/SanSalvi.ttf | Bin src/target/Skills.class | Bin 0 -> 1284 bytes src/target/Stats.class | Bin 0 -> 602 bytes src/target/Strength.class | Bin 0 -> 1448 bytes src/target/Tiefling.class | Bin 0 -> 1196 bytes src/target/Wisdom.class | Bin 0 -> 1244 bytes src/target/Wizard.class | Bin 0 -> 1136 bytes src/target/step4$1.class | Bin 0 -> 514 bytes src/target/step4$2.class | Bin 0 -> 514 bytes src/target/step4.class | Bin 0 -> 5183 bytes 123 files changed, 3916 deletions(-) delete mode 100644 dndBuilder/.DS_Store delete mode 100644 dndBuilder/dndBuilder.iml delete mode 100644 dndBuilder/src/Character/AbilityScores/CharacterStats.java delete mode 100644 dndBuilder/src/Character/AbilityScores/Charisma.java delete mode 100644 dndBuilder/src/Character/AbilityScores/Constitution.java delete mode 100644 dndBuilder/src/Character/AbilityScores/Dexterity.java delete mode 100644 dndBuilder/src/Character/AbilityScores/Intelligence.java delete mode 100644 dndBuilder/src/Character/AbilityScores/Stats.java delete mode 100644 dndBuilder/src/Character/AbilityScores/Strength.java delete mode 100644 dndBuilder/src/Character/AbilityScores/Wisdom.java delete mode 100644 dndBuilder/src/Character/Background.java delete mode 100644 dndBuilder/src/Character/CharacterSheet.java delete mode 100644 dndBuilder/src/Character/Classes/ClassTemplate.java delete mode 100644 dndBuilder/src/Character/Classes/Cleric.java delete mode 100644 dndBuilder/src/Character/Classes/Fighter.java delete mode 100644 dndBuilder/src/Character/Classes/Wizard.java delete mode 100644 dndBuilder/src/Character/Races/Dragonborn.java delete mode 100644 dndBuilder/src/Character/Races/Dwarf.java delete mode 100644 dndBuilder/src/Character/Races/Elf.java delete mode 100644 dndBuilder/src/Character/Races/Gnome.java delete mode 100644 dndBuilder/src/Character/Races/HalfElf.java delete mode 100644 dndBuilder/src/Character/Races/HalfOrc.java delete mode 100644 dndBuilder/src/Character/Races/Halfling.java delete mode 100644 dndBuilder/src/Character/Races/Human.java delete mode 100644 dndBuilder/src/Character/Races/Race.java delete mode 100644 dndBuilder/src/Character/Races/Tiefling.java delete mode 100644 dndBuilder/src/Character/Skills.java delete mode 100644 dndBuilder/src/DndCharacterBuilder.java delete mode 100644 dndBuilder/src/FileManagement/ExportPDF.java delete mode 100644 dndBuilder/src/FileManagement/FileManager.java delete mode 100644 dndBuilder/src/GUI/.DS_Store delete mode 100644 dndBuilder/src/GUI/AppTheme.java delete mode 100644 dndBuilder/src/GUI/GUImanager.java delete mode 100644 dndBuilder/src/GUI/Panels/BasicPanel.java delete mode 100644 dndBuilder/src/GUI/Panels/ChooseAbilityScoresPanel.java delete mode 100644 dndBuilder/src/GUI/Panels/DescriptionPanel.java delete mode 100644 dndBuilder/src/GUI/Panels/LoadCharacterPanel.java delete mode 100644 dndBuilder/src/GUI/Panels/MainMenuPanel.java delete mode 100644 dndBuilder/src/GUI/Panels/PreviewCharacterSheet.java delete mode 100644 dndBuilder/src/GUI/Panels/step4.java delete mode 100644 dndBuilder/src/Resources/CustomAssets/BasicNavPanel.java delete mode 100644 dndBuilder/src/Resources/CustomAssets/CustomTheme.java delete mode 100644 dndBuilder/src/Resources/CustomAssets/DefaultButton.java delete mode 100644 dndBuilder/src/Resources/CustomAssets/ImageInfoPanel.java delete mode 100644 dndBuilder/src/Resources/CustomAssets/InfoPanel.java delete mode 100644 dndBuilder/src/Tests/dndTestClient.java rename {dndBuilder/src => src}/.DS_Store (100%) rename {dndBuilder/src => src}/DieRoller/DiceRoller.java (100%) rename {dndBuilder/src/Resources/CustomAssets => src/deprecated}/RoundedBorder.java (94%) create mode 100644 src/target/App.class create mode 100644 src/target/AppTheme.class create mode 100644 src/target/Background.class create mode 100644 src/target/BasicNavPanel.class create mode 100644 src/target/BasicPanel.class create mode 100644 src/target/CharacterSheet.class create mode 100644 src/target/CharacterStats.class create mode 100644 src/target/Charisma.class create mode 100644 src/target/ChooseAbilityScoresPanel.class create mode 100644 src/target/ClassTemplate.class create mode 100644 src/target/Cleric.class create mode 100644 src/target/Constitution.class create mode 100644 src/target/CustomTheme.class create mode 100644 src/target/DefaultButton$1.class create mode 100644 src/target/DefaultButton.class create mode 100644 src/target/DescriptionPanel.class create mode 100644 src/target/Dexterity.class create mode 100644 src/target/Dragonborn.class create mode 100644 src/target/Dwarf.class create mode 100644 src/target/Elf.class create mode 100644 src/target/ExportPDF.class create mode 100644 src/target/Fighter.class create mode 100644 src/target/FileManager.class create mode 100644 src/target/GUImanager.class create mode 100644 src/target/Gnome.class create mode 100644 src/target/HalfElf.class create mode 100644 src/target/HalfOrc.class create mode 100644 src/target/Halfling.class create mode 100644 src/target/Human.class create mode 100644 src/target/ImageInfoPanel.class rename {dndBuilder/src/Resources => src/target}/Img/Classes/artificer/artificer.jpg (100%) rename {dndBuilder/src/Resources => src/target}/Img/Classes/barbarian/barbarian.png (100%) rename {dndBuilder/src/Resources => src/target}/Img/Classes/bard/bard.png (100%) rename {dndBuilder/src/Resources => src/target}/Img/Classes/cleric/cleric.png (100%) rename {dndBuilder/src/Resources => src/target}/Img/Classes/druid/druid.png (100%) rename {dndBuilder/src/Resources => src/target}/Img/Classes/fighter/fighter.png (100%) rename {dndBuilder/src/Resources => src/target}/Img/Classes/monk/monk.png (100%) rename {dndBuilder/src/Resources => src/target}/Img/Classes/paladin/paladin.png (100%) rename {dndBuilder/src/Resources => src/target}/Img/Classes/ranger/ranger.png (100%) rename {dndBuilder/src/Resources => src/target}/Img/Classes/rogue/rogue.png (100%) rename {dndBuilder/src/Resources => src/target}/Img/Classes/sorcerer/sorcerer.png (100%) rename {dndBuilder/src/Resources => src/target}/Img/Classes/warlock/warlock.png (100%) rename {dndBuilder/src/Resources => src/target}/Img/Classes/wizard/wizard.png (100%) rename {dndBuilder/src/Resources => src/target}/Img/Races/dragonborn/dragonborn.jpg (100%) rename {dndBuilder/src/Resources => src/target}/Img/Races/dragonborn/dragonborn2.jpg (100%) rename {dndBuilder/src/Resources => src/target}/Img/Races/dragonborn/dragonborn3.jpg (100%) rename {dndBuilder/src/Resources => src/target}/Img/Races/dragonborn/dragonborn4.jpg (100%) rename {dndBuilder/src/Resources => src/target}/Img/Races/dragonborn/dragonborn5.jpg (100%) rename {dndBuilder/src/Resources => src/target}/Img/Races/dragonborn/dragonborn6.jpg (100%) rename {dndBuilder/src/Resources => src/target}/Img/Races/dwarf/dwarf.jpg (100%) rename {dndBuilder/src/Resources => src/target}/Img/Races/elf/elf.jpg (100%) rename {dndBuilder/src/Resources => src/target}/Img/Races/gnome/gnome.jpg (100%) rename {dndBuilder/src/Resources => src/target}/Img/Races/halfelf/halfelf.jpg (100%) rename {dndBuilder/src/Resources => src/target}/Img/Races/halfling/halfling.jpg (100%) rename {dndBuilder/src/Resources => src/target}/Img/Races/halforc/halforc.jpg (100%) rename {dndBuilder/src/Resources => src/target}/Img/Races/human/human.jpg (100%) rename {dndBuilder/src/Resources => src/target}/Img/Races/tiefling/tiefling.jpg (100%) rename {dndBuilder/src/Resources => src/target}/Img/sheet.jpg (100%) create mode 100644 src/target/InfoPanel.class create mode 100644 src/target/Intelligence.class create mode 100644 src/target/LoadCharacterPanel.class create mode 100644 src/target/MainMenuPanel.class create mode 100644 src/target/PreviewCharacterSheet.class create mode 100644 src/target/Race.class rename {dndBuilder/src/Resources/Fonts => src/target}/SanSalvi.ttf (100%) create mode 100644 src/target/Skills.class create mode 100644 src/target/Stats.class create mode 100644 src/target/Strength.class create mode 100644 src/target/Tiefling.class create mode 100644 src/target/Wisdom.class create mode 100644 src/target/Wizard.class create mode 100644 src/target/step4$1.class create mode 100644 src/target/step4$2.class create mode 100644 src/target/step4.class diff --git a/dndBuilder/.DS_Store b/dndBuilder/.DS_Store deleted file mode 100644 index 0ef9ef04216b5b99efff727e6f60421c73562782..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6148 zcmeHK&2G~`5S~o}Y=R0oAhkzdxK&m9qW}ja<~c+@@v3L z@Ekk=j|1QAPAb~8R}`TgY4)3)omqRoUF{DMsc4dI6ZMHmLm69L6gLRBvo1+XJRP92 zeM~5)f-)M>cq!UDR*?aoy9b!D5*pFp^S6b$Jg4HYFsEr@QpE8hc>&$}Z3Pxln<~up z>9wdIH%Fz@>O%VZnO+omRSyQgRIA;&bN8OsJ>6UDy^qh#G_I3+Qbo!5h-lt<5iXTUSCQVhr@rSGrQU-_T$40r}sfdSqh0w`lB*f_LX2MYTH0P;1`3T(b6 za!w!^3N{YW0#Pm%=u(wDF_cS(KajXkuyN?pNy+0w$(NP9P?Y^T`VVY4snDS>Jp-PB zs|>VVwa@4O%iG`oSCf3rGvFEcuNY9BgZLoAkmPJ#8XTXs0rUjQ!f}nm%M=*)C`K$F d#T!s7@CR%FL&3%&JP>~our&C>Gw@Ft_ya-RXv6>j diff --git a/dndBuilder/dndBuilder.iml b/dndBuilder/dndBuilder.iml deleted file mode 100644 index c90834f..0000000 --- a/dndBuilder/dndBuilder.iml +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - \ No newline at end of file diff --git a/dndBuilder/src/Character/AbilityScores/CharacterStats.java b/dndBuilder/src/Character/AbilityScores/CharacterStats.java deleted file mode 100644 index 617ce1f..0000000 --- a/dndBuilder/src/Character/AbilityScores/CharacterStats.java +++ /dev/null @@ -1,81 +0,0 @@ -package Character.AbilityScores; - -public class CharacterStats { - - private Stats[] stats; - - public CharacterStats() { - - stats = new Stats[]{}; - - } - - // TODO: Need to implement constructor, validates all proposed ability scores and creates new objects containing corresponding values. - public CharacterStats(int str, int dex, int con, int intel, int wis, int cha) { - - this.stats = new Stats[]{ - - new Strength(str), - new Dexterity(dex), - new Constitution(con), - new Intelligence(intel), - new Wisdom(wis), - new Charisma(cha) - - }; - - } - - public CharacterStats(Strength str, Dexterity dex, Constitution con, Intelligence intel, Wisdom wis, Charisma cha) { - - this.stats = new Stats[]{str, dex, con, intel, wis, cha}; - - } - - // TODO: Need to implement ability score validation. - public boolean validateAbilityScore(int abilityScore) { - - return false; - - } - - public Stats[] getStats() { - - return stats; - - } - - /** - * Allows for access to a particular stat. - * - * @param index - * @return a specific stat - */ - public Stats getStats(int index) { - - return stats[index]; - - } - - public void increaseStat(int targetStat) { - - stats[targetStat].increaseScore(); - - } - - @Override - public String toString() { - - String statsString = ""; - - for (int i = 0; i < stats.length; i++) { - - statsString = statsString.concat(stats[i].getClass().getSimpleName() + ": " + stats[i].getScore() + " | "); - - } - - return statsString; - - } - -} diff --git a/dndBuilder/src/Character/AbilityScores/Charisma.java b/dndBuilder/src/Character/AbilityScores/Charisma.java deleted file mode 100644 index 2ce1136..0000000 --- a/dndBuilder/src/Character/AbilityScores/Charisma.java +++ /dev/null @@ -1,55 +0,0 @@ -package Character.AbilityScores; - -public class Charisma extends Stats { - - private int abilityScore; - private int abilityScoreModifier; - - public Charisma(int abilityScore) { - - this.abilityScore = abilityScore; - this.abilityScoreModifier = calcSavingThrow(abilityScore); - - } - - public int getScore() { - - return abilityScore; - - } - - public int getModifier() { - - return abilityScoreModifier; - - } - - public int getSavingThrow() { - - return getModifier(); - - } - - // TODO: Need description. - public String getDescription() { - - return "Confidence, eloquence, and leadership."; - - } - - @Override - public String toString() { - - return "Ability Score: " + abilityScore + " | Modifier: " + abilityScoreModifier + " | Description: " - + getDescription(); - - } - - @Override - public void increaseScore() { - - abilityScore++; - - } - -} diff --git a/dndBuilder/src/Character/AbilityScores/Constitution.java b/dndBuilder/src/Character/AbilityScores/Constitution.java deleted file mode 100644 index 8edb017..0000000 --- a/dndBuilder/src/Character/AbilityScores/Constitution.java +++ /dev/null @@ -1,55 +0,0 @@ -package Character.AbilityScores; - -public class Constitution extends Stats { - - private int abilityScore; - private int abilityScoreModifier; - - public Constitution(int abilityScore) { - - this.abilityScore = abilityScore; - this.abilityScoreModifier = calcSavingThrow(abilityScore); - - } - - public int getScore() { - - return abilityScore; - - } - - public int getModifier() { - - return abilityScoreModifier; - - } - - public int getSavingThrow() { - - return getModifier(); - - } - - // TODO: Need description. - public String getDescription() { - - return "Health, stamina, vital force."; - - } - - @Override - public String toString() { - - return "Ability Score: " + abilityScore + " | Modifier: " + abilityScoreModifier + " | Description: " - + getDescription(); - - } - - @Override - public void increaseScore() { - - abilityScore++; - - } - -} diff --git a/dndBuilder/src/Character/AbilityScores/Dexterity.java b/dndBuilder/src/Character/AbilityScores/Dexterity.java deleted file mode 100644 index 828cadf..0000000 --- a/dndBuilder/src/Character/AbilityScores/Dexterity.java +++ /dev/null @@ -1,55 +0,0 @@ -package Character.AbilityScores; - -public class Dexterity extends Stats { - - private int abilityScore; - private int abilityScoreModifier; - - public Dexterity(int abilityScore) { - - this.abilityScore = abilityScore; - this.abilityScoreModifier = calcSavingThrow(abilityScore); - - } - - public int getScore() { - - return abilityScore; - - } - - public int getModifier() { - - return abilityScoreModifier; - - } - - public int getSavingThrow() { - - return getModifier(); - - } - - // TODO: Need description. - public String getDescription() { - - return ""; - - } - - @Override - public String toString() { - - return "Ability Score: " + abilityScore + " | Modifier: " + abilityScoreModifier + " | Description: " - + getDescription(); - - } - - @Override - public void increaseScore() { - - abilityScore++; - - } - -} diff --git a/dndBuilder/src/Character/AbilityScores/Intelligence.java b/dndBuilder/src/Character/AbilityScores/Intelligence.java deleted file mode 100644 index f8c93cc..0000000 --- a/dndBuilder/src/Character/AbilityScores/Intelligence.java +++ /dev/null @@ -1,55 +0,0 @@ -package Character.AbilityScores; - -public class Intelligence extends Stats { - - private int abilityScore; - private int abilityScoreModifier; - - public Intelligence(int abilityScore) { - - this.abilityScore = abilityScore; - this.abilityScoreModifier = calcSavingThrow(abilityScore); - - } - - public int getScore() { - - return abilityScore; - - } - - public int getModifier() { - - return abilityScoreModifier; - - } - - public int getSavingThrow() { - - return getModifier(); - - } - - // TODO: Need description. - public String getDescription() { - - return ""; - - } - - @Override - public String toString() { - - return "Ability Score: " + abilityScore + " | Modifier: " + abilityScoreModifier + " | Description: " - + getDescription(); - - } - - @Override - public void increaseScore() { - - abilityScore++; - - } - -} diff --git a/dndBuilder/src/Character/AbilityScores/Stats.java b/dndBuilder/src/Character/AbilityScores/Stats.java deleted file mode 100644 index b4f21c7..0000000 --- a/dndBuilder/src/Character/AbilityScores/Stats.java +++ /dev/null @@ -1,56 +0,0 @@ -package Character.AbilityScores; - -public abstract class Stats { - - public int calcSavingThrow(int abilityScore) { - - switch (abilityScore) { - case 1: - return -5; - case 2: - case 3: - return -4; - case 4: - case 5: - return -3; - case 6: - case 7: - return -2; - case 8: - case 9: - return -1; - case 10: - case 11: - return 0; - case 12: - case 13: - return 1; - case 14: - case 15: - return 2; - case 16: - case 17: - return 3; - case 18: - case 19: - return 4; - case 20: - return 5; - default: - return -42; - - } - - } - - public abstract void increaseScore(); - - abstract int getScore(); - - abstract int getModifier(); - - abstract int getSavingThrow(); - - abstract String getDescription(); - -} diff --git a/dndBuilder/src/Character/AbilityScores/Strength.java b/dndBuilder/src/Character/AbilityScores/Strength.java deleted file mode 100644 index 3f860d4..0000000 --- a/dndBuilder/src/Character/AbilityScores/Strength.java +++ /dev/null @@ -1,67 +0,0 @@ -package Character.AbilityScores; - -public class Strength extends Stats { - - private int abilityScore; - private int abilityScoreModifier; - - public Strength(int abilityScore) { - - this.abilityScore = abilityScore; - this.abilityScoreModifier = calcSavingThrow(abilityScore); - - } - - public Strength(Strength str) { - - this.abilityScore = str.getScore(); - this.abilityScoreModifier = str.getModifier(); - - } - - public int getScore() { - - return abilityScore; - - } - - public int getModifier() { - - return abilityScoreModifier; - - } - - public int getSavingThrow() { - - return getModifier(); - - } - - public String getDescription() { - - return "Natural athleticism and bodily power."; - - } - - public int getMaxCarryWeight() { - - return abilityScore * 15; - - } - - @Override - public String toString() { - - return "Ability Score: " + abilityScore + " | Modifier: " + abilityScoreModifier + " | Description: " - + getDescription(); - - } - - @Override - public void increaseScore() { - - abilityScore++; - - } - -} diff --git a/dndBuilder/src/Character/AbilityScores/Wisdom.java b/dndBuilder/src/Character/AbilityScores/Wisdom.java deleted file mode 100644 index 37c00de..0000000 --- a/dndBuilder/src/Character/AbilityScores/Wisdom.java +++ /dev/null @@ -1,55 +0,0 @@ -package Character.AbilityScores; - -public class Wisdom extends Stats { - - private int abilityScore; - private int abilityScoreModifier; - - public Wisdom(int abilityScore) { - - this.abilityScore = abilityScore; - this.abilityScoreModifier = calcSavingThrow(abilityScore); - - } - - public int getScore() { - - return abilityScore; - - } - - public int getModifier() { - - return abilityScoreModifier; - - } - - public int getSavingThrow() { - - return getModifier(); - - } - - // TODO: Need description. - public String getDescription() { - - return ""; - - } - - @Override - public String toString() { - - return "Ability Score: " + abilityScore + " | Modifier: " + abilityScoreModifier + " | Description: " - + getDescription(); - - } - - @Override - public void increaseScore() { - - abilityScore++; - - } - -} diff --git a/dndBuilder/src/Character/Background.java b/dndBuilder/src/Character/Background.java deleted file mode 100644 index d7d2b0a..0000000 --- a/dndBuilder/src/Character/Background.java +++ /dev/null @@ -1,154 +0,0 @@ -package Character; - -public class Background { - - int backgroundIndex; - private String name; - private boolean[] proficientStatus; - private String[] skills; - private String feature; - private String skillProficiencies; - - /** - * @param name - * @param feature - */ - public Background(String name, boolean[] proficientStatus, String[] skills, String feature) { - this.name = name; - this.proficientStatus = proficientStatus; - this.skills = skills; - this.feature = feature; - skillProficiencies = null; - } - - public void setAcolyte() { - name = "Acolyte"; - proficientStatus[5] = true; - proficientStatus[14] = true; - skillProficiencies = skills[5] + ", " + skills[14]; - feature = "Shelter of the Faithful" + "\nAs an acolyte, you command the respect of those who share your faith, and you can perform the religious ceremonies of your deity. You and your adventuring companions can expect to receive free healing and care at a temple, shrine, or other established presence of your faith, though you must provide any material components needed for spells. Those who share your religion will support you (but only you) at a modest lifestyle." - + "\nYou might also have ties to a specific temple dedicated to your chosen deity or pantheon, and you have a residence there. This could be the temple where you used to serve, if you remain on good terms with it, or a temple where you have found a new home. While near your temple, you can call upon the priests for assistance, provided the assistance you ask for is not hazardous and you remain in good standing with your temple."; - } - - public void setCharlatan() { - name = "Charlatan"; - proficientStatus[4] = true; - proficientStatus[15] = true; - skillProficiencies = skills[4] + ", " + skills[15]; - feature = "False Identity" + "\nYou have created a second identity that includes documentation, established acquaintances, and disguises that allow you to assume that persona. Additionally, you can forge documents including official papers and personal letters, as long as you have seen an example of the kind of document or the handwriting you are trying to copy."; - } - - - public void setCriminal() { - name = "Criminal"; - proficientStatus[4] = true; - proficientStatus[16] = true; - skillProficiencies = skills[4] + ", " + skills[16]; - feature = "Feature: Criminal Contact" + "\nYou have a reliable and trustworthy contact who acts as your liaison to a network of other criminals. You know how to get messages to and from your contact, even over great distances; specifically, you know the local messengers, corrupt caravan masters, and seedy sailors who can deliver messages for you."; - } - - public void setSpy() { - name = "Spy"; - proficientStatus[4] = true; - proficientStatus[16] = true; - skillProficiencies = skills[4] + ", " + skills[16]; - feature = "Criminal Contact" + "\nYou have a reliable and trustworthy contact who acts as your liaison to a network of other criminals. You know how to get messages to and from your contact, even over great distances; specifically, you know the local messengers, corrupt caravan masters, and seedy sailors who can deliver messages for you."; - } - - public void setEntertainer() { - name = "Entertainer"; - proficientStatus[0] = true; - proficientStatus[12] = true; - skillProficiencies = skills[0] + ", " + skills[12]; - feature = "By Popular Demand" + "\nYou can always find a place to perform, usually in an inn or tavern but possibly with a circus, at a theater, or even in a noble's court. At such a place, you receive free lodging and food of a modest or comfortable standard (depending on the quality of the establishment), as long as you perform each night. In addition, your performance makes you something of a local figure. When strangers recognize you in a town where you have performed, they typically take a liking to you."; - } - - public void setFolkHero() { - name = "Folk Hero"; - proficientStatus[1] = true; - proficientStatus[17] = true; - skillProficiencies = skills[1] + ", " + skills[17]; - feature = "Rustic Hospitality" + "\nSince you come from the ranks of the common folk, you fit in among them with ease. You can find a place to hide, rest, or recuperate among other commoners, unless you have shown yourself to be a danger to them. They will shield you from the law or anyone else searching for you, though they will not risk their lives for you."; - } - - public void setGladiator() { - name = "Gladiator"; - proficientStatus[0] = true; - proficientStatus[12] = true; - skillProficiencies = skills[0] + ", " + skills[12]; - feature = "By Popular Demand" + "\nYou can always find a place to perform in any place that features combat for entertainment — perhaps a gladiatorial arena or secret pit fighting club. At such a place, you receive free lodging and food of a modest or comfortable standard (depending on the quality of the establishment), as long as you perform each night. In addition, your performance makes you something of a local figure. When strangers recognize you in a town where you have performed, they typically take a liking to you."; - } - - public void setGuildArtisan() { - name = "Guild Artisan"; - proficientStatus[6] = true; - proficientStatus[13] = true; - skillProficiencies = skills[6] + ", " + skills[13]; - feature = "Guild Membership" + "\nAs an established and respected member of a guild, you can rely on certain benefits that membership provides. Your fellow guild members will provide you with lodging and food if necessary, and pay for your funeral if needed. In some cities and towns, a guildhall offers a central place to meet other members of your profession, which can be a good place to meet potential patrons, allies, or hirelings." - + "\nGuilds often wield tremendous political power. If you are accused of a crime, your guild will support you if a good case can be made for your innocence or the crime is justifiable. You can also gain access to powerful political figures through the guild, if you are a member in good standing. Such connections might require the donation of money or magic items to the guild’s coffers." - + "\nYou must pay dues of 5 gp per month to the guild. If you miss payments, you must make up back dues to remain in the guild’s good graces."; - } - - public void setGuildMerchant() { - name = "Guild Merchant"; - proficientStatus[6] = true; - proficientStatus[13] = true; - skillProficiencies = skills[6] + ", " + skills[13]; - feature = "Guild Membership" + "\nAs an established and respected member of a guild, you can rely on certain benefits that membership provides. Your fellow guild members will provide you with lodging and food if necessary, and pay for your funeral if needed. In some cities and towns, a guildhall offers a central place to meet other members of your profession, which can be a good place to meet potential patrons, allies, or hirelings." - + "\nGuilds often wield tremendous political power. If you are accused of a crime, your guild will support you if a good case can be made for your innocence or the crime is justifiable. You can also gain access to powerful political figures through the guild, if you are a member in good standing. Such connections might require the donation of money or magic items to the guild’s coffers." - + "\nYou must pay dues of 5 gp per month to the guild. If you miss payments, you must make up back dues to remain in the guild’s good graces."; - } - - public void setGuildHermit() { - name = "Hermit"; - proficientStatus[9] = true; - proficientStatus[14] = true; - skillProficiencies = skills[9] + ", " + skills[14]; - feature = "Discovery" + "\nThe quiet seclusion of your extended hermitage gave you access to a unique and powerful discovery. The exact nature of this revelation depends on the nature of your seclusion. It might be a great truth about the cosmos, the deities, the powerful beings of the outer planes, or the forces of nature. It could be a site that no one else has ever seen. You might have uncovered a fact that has long been forgotten, or unearthed some relic of the past that could rewrite history. It might be information that would be damaging to the people who consigned you to exile, and hence the reason for your return to society." - + "\nWork with your DM to determine the details of your discovery and its impact on the campaign."; - } - - public void setKnight() { - name = "Knight"; - proficientStatus[5] = true; - proficientStatus[11] = true; - skillProficiencies = skills[5] + ", " + skills[11]; - feature = "Retainers" + "\nYou have the service of three retainers loyal to your family. These retainers can be attendants or messengers, and one might be a majordomo. Your retainers are commoners who can perform mundane tasks for you, but they do not fight for you, will not follow you into obviously dangerous areas (such as dungeons), and will leave if they are frequently endangered or abused."; - } - - /** - * @return the name - */ - public String getName() { - return name; - } - - /** - * @return the skillProficiencies - */ - public String getskillProficiences() { - return skillProficiencies; - } - - /** - * @return the feature - */ - public String getDescription() { - return feature; - } - - /** - * @return the proficientStatus - */ - public boolean[] getProficientStatus() { - return proficientStatus; - } - - @Override - public String toString() { - return "Background: " + name + "\nSkill Proficiencies: " + skillProficiencies + "\nFeature: " - + feature; - } - - -} diff --git a/dndBuilder/src/Character/CharacterSheet.java b/dndBuilder/src/Character/CharacterSheet.java deleted file mode 100644 index b6d248e..0000000 --- a/dndBuilder/src/Character/CharacterSheet.java +++ /dev/null @@ -1,121 +0,0 @@ -package Character; - -import Character.AbilityScores.CharacterStats; -import Character.Races.Race; - -import java.io.Serializable; - -public class CharacterSheet implements Serializable { - private String name; - private int age; - private int heightFeet; - private int heightInch; - private int weight; - private String eye; - private String hair; - private Race race; - - private CharacterStats stats; - - /** - * @param name - * @param age - * @param heightFeet - * @param heightInch - * @param weight - * @param eye - * @param hair - */ - public CharacterSheet(String name, int age, - int heightFeet, int heightInch, - int weight, String eye, String hair, - Race race, CharacterStats stats) { - this.name = name; - this.age = age; - this.heightFeet = heightFeet; - this.heightInch = heightInch; - this.weight = weight; - this.eye = eye; - this.hair = hair; - this.race = race; - this.stats = stats; - } - - /** - * Default constructor - */ - public CharacterSheet() { - this.name = "null"; - this.age = 0; - this.heightFeet = 0; - this.heightInch = 0; - this.weight = 0; - this.eye = "null"; - this.hair = "null"; - - } - - /** - * @return the name - */ - public String getName() { - return name; - } - - /** - * @return the age - */ - public int getAge() { - return age; - } - - /** - * @return the heightFeet - */ - public int getHeightFeet() { - return heightFeet; - } - - /** - * @return the heightInch - */ - public int getHeightInch() { - return heightInch; - } - - /** - * @return the weigth - */ - public int getWeight() { - return weight; - } - - /** - * @return the eye - */ - public String getEye() { - return eye; - } - - /** - * @return the hair - */ - public String getHair() { - return hair; - } - - public CharacterStats getStats() { - - return stats; - - } - - @Override - public String toString() { - return "name: " + name + " | age: " + age + " | height: " - + heightFeet + "\'" + heightInch + "\" | weight: " - + weight + " | eye: " + eye + " | hair: " + hair - + " | race: " + race.toString() + " | stats: " + stats.toString(); - } - -} diff --git a/dndBuilder/src/Character/Classes/ClassTemplate.java b/dndBuilder/src/Character/Classes/ClassTemplate.java deleted file mode 100644 index f05aebe..0000000 --- a/dndBuilder/src/Character/Classes/ClassTemplate.java +++ /dev/null @@ -1,39 +0,0 @@ -package Character.Classes; - -import Character.AbilityScores.Stats; - -public interface ClassTemplate { - - abstract String getDescription(); - - abstract String[] getProgression(); - - abstract String[] getClassFeatures(); - - abstract String getHitDie(); - - abstract int getHPatLv1(); - - abstract int getHPpastLv1(); - - abstract String[] getArmorProf(); - - abstract String[] getWeaponProf(); - - abstract String[] getToolProf(); - - abstract String[] getSavingThrows(); - -// TODO: Need to refresh on how saving throws work and how the character's class may impact a saving throw. - - abstract String[] availableSkills(); - - abstract String[] startingEquipChoices(); - - abstract boolean advantageCheck(Stats abilityScore); - - abstract boolean disadvantageCheck(Stats abilityScore); - -// TODO: Spells and shit. - -} diff --git a/dndBuilder/src/Character/Classes/Cleric.java b/dndBuilder/src/Character/Classes/Cleric.java deleted file mode 100644 index 63e0033..0000000 --- a/dndBuilder/src/Character/Classes/Cleric.java +++ /dev/null @@ -1,92 +0,0 @@ -package Character.Classes; - -import Character.AbilityScores.Stats; - -public class Cleric implements ClassTemplate { - - private int HP; - - private int level; - - // TODO: This should be the type of die. - private int hitDie; - - public Cleric(Stats[] stats, int level) { - - - } - -// TODO: Need to figure out how to contain class progression information. Potentially a double String array, each row equals a level, each column a different thing. Should class features be a separate class, ie. BarbFeatures, BardFeatures, etc? - - public String getDescription() { - // TODO Auto-generated method stub - return null; - } - - public String[] getProgression() { - // TODO Auto-generated method stub - return null; - } - - public String[] getClassFeatures() { - // TODO Auto-generated method stub - return null; - } - - public String getHitDie() { - // TODO Auto-generated method stub - return null; - } - - public int getHPatLv1() { - // TODO Auto-generated method stub - return 0; - } - - public int getHPpastLv1() { - // TODO Auto-generated method stub - return 0; - } - - public String[] getArmorProf() { - // TODO Auto-generated method stub - return null; - } - - public String[] getWeaponProf() { - // TODO Auto-generated method stub - return null; - } - - public String[] getToolProf() { - // TODO Auto-generated method stub - return null; - } - - public String[] availableSkills() { - // TODO Auto-generated method stub - return null; - } - - public String[] startingEquipChoices() { - // TODO Auto-generated method stub - return null; - } - - public boolean advantageCheck(Stats abilityScore) { - // TODO Auto-generated method stub - return false; - } - - public boolean disadvantageCheck(Stats abilityScore) { - // TODO Auto-generated method stub - return false; - } - - @Override - public String[] getSavingThrows() { - // TODO Auto-generated method stub - return null; - } - -} \ No newline at end of file diff --git a/dndBuilder/src/Character/Classes/Fighter.java b/dndBuilder/src/Character/Classes/Fighter.java deleted file mode 100644 index ff60281..0000000 --- a/dndBuilder/src/Character/Classes/Fighter.java +++ /dev/null @@ -1,92 +0,0 @@ -package Character.Classes; - -import Character.AbilityScores.Stats; - -public class Fighter implements ClassTemplate { - - private int HP; - - private int level; - - // TODO: This should be the type of die. - private int hitDie; - - public Fighter(Stats[] stats, int level) { - - - } - -// TODO: Need to figure out how to contain class progression information. Potentially a double String array, each row equals a level, each column a different thing. Should class features be a separate class, ie. BarbFeatures, BardFeatures, etc? - - public String getDescription() { - // TODO Auto-generated method stub - return null; - } - - public String[] getProgression() { - // TODO Auto-generated method stub - return null; - } - - public String[] getClassFeatures() { - // TODO Auto-generated method stub - return null; - } - - public String getHitDie() { - // TODO Auto-generated method stub - return null; - } - - public int getHPatLv1() { - // TODO Auto-generated method stub - return 0; - } - - public int getHPpastLv1() { - // TODO Auto-generated method stub - return 0; - } - - public String[] getArmorProf() { - // TODO Auto-generated method stub - return null; - } - - public String[] getWeaponProf() { - // TODO Auto-generated method stub - return null; - } - - public String[] getToolProf() { - // TODO Auto-generated method stub - return null; - } - - public String[] availableSkills() { - // TODO Auto-generated method stub - return null; - } - - public String[] startingEquipChoices() { - // TODO Auto-generated method stub - return null; - } - - public boolean advantageCheck(Stats abilityScore) { - // TODO Auto-generated method stub - return false; - } - - public boolean disadvantageCheck(Stats abilityScore) { - // TODO Auto-generated method stub - return false; - } - - @Override - public String[] getSavingThrows() { - // TODO Auto-generated method stub - return null; - } - -} \ No newline at end of file diff --git a/dndBuilder/src/Character/Classes/Wizard.java b/dndBuilder/src/Character/Classes/Wizard.java deleted file mode 100644 index 7ced69a..0000000 --- a/dndBuilder/src/Character/Classes/Wizard.java +++ /dev/null @@ -1,92 +0,0 @@ -package Character.Classes; - -import Character.AbilityScores.Stats; - -public class Wizard implements ClassTemplate { - - private int HP; - - private int level; - - // TODO: This should be the type of die. - private int hitDie; - - public Wizard(Stats[] stats, int level) { - - - } - -// TODO: Need to figure out how to contain class progression information. Potentially a double String array, each row equals a level, each column a different thing. Should class features be a separate class, ie. BarbFeatures, BardFeatures, etc? - - public String getDescription() { - // TODO Auto-generated method stub - return null; - } - - public String[] getProgression() { - // TODO Auto-generated method stub - return null; - } - - public String[] getClassFeatures() { - // TODO Auto-generated method stub - return null; - } - - public String getHitDie() { - // TODO Auto-generated method stub - return null; - } - - public int getHPatLv1() { - // TODO Auto-generated method stub - return 0; - } - - public int getHPpastLv1() { - // TODO Auto-generated method stub - return 0; - } - - public String[] getArmorProf() { - // TODO Auto-generated method stub - return null; - } - - public String[] getWeaponProf() { - // TODO Auto-generated method stub - return null; - } - - public String[] getToolProf() { - // TODO Auto-generated method stub - return null; - } - - public String[] availableSkills() { - // TODO Auto-generated method stub - return null; - } - - public String[] startingEquipChoices() { - // TODO Auto-generated method stub - return null; - } - - public boolean advantageCheck(Stats abilityScore) { - // TODO Auto-generated method stub - return false; - } - - public boolean disadvantageCheck(Stats abilityScore) { - // TODO Auto-generated method stub - return false; - } - - @Override - public String[] getSavingThrows() { - // TODO Auto-generated method stub - return null; - } - -} diff --git a/dndBuilder/src/Character/Races/Dragonborn.java b/dndBuilder/src/Character/Races/Dragonborn.java deleted file mode 100644 index f96026a..0000000 --- a/dndBuilder/src/Character/Races/Dragonborn.java +++ /dev/null @@ -1,72 +0,0 @@ -package Character.Races; - -public class Dragonborn implements Race { - private final int speed = 30; - private final int maxAge = 80; - private String[] traits; - private String[] skills; - private String[] languages; - private String[] proficiencies; - - public Dragonborn() { - - this.languages = new String[]{"Common", "Draconic"}; - this.skills = new String[]{}; - } - - @Override - public String getRace() { - // TODO Auto-generated method stub - return this.getClass().getSimpleName(); - } - - @Override - public int maxAge() { - // TODO Auto-generated method stub - return maxAge; - } - - @Override - public int getSpeed() { - // TODO Auto-generated method stub - return speed; - } - - @Override - public String[] getTraits() { - // TODO Auto-generated method stub - return traits; - - } - - @Override - public String[] getSkills() { - // TODO Auto-generated method stub - return skills; - } - - @Override - public String[] getLanguages() { - // TODO Auto-generated method stub - return languages; - } - - @Override - public String[] getProficiencies() { - // TODO Auto-generated method stub - return proficiencies; - } - - @Override - public int[] getASI() { - // TODO Auto-generated method stub - return new int[]{0, 0, 5}; - } - - @Override - public String toString() { - // TODO Auto-generated method stub - return this.getClass().getSimpleName(); - } - -} diff --git a/dndBuilder/src/Character/Races/Dwarf.java b/dndBuilder/src/Character/Races/Dwarf.java deleted file mode 100644 index 1c5e89e..0000000 --- a/dndBuilder/src/Character/Races/Dwarf.java +++ /dev/null @@ -1,72 +0,0 @@ -package Character.Races; - -public class Dwarf implements Race { - private final int speed = 25; - private final int maxAge = 350; - private String[] traits; - private String[] skills; - private String[] languages; - private String[] proficiencies; - - public Dwarf() { - - this.languages = new String[]{"Common", "Dwarvish"}; - this.skills = new String[]{}; - } - - @Override - public String getRace() { - // TODO Auto-generated method stub - return this.getClass().getSimpleName(); - } - - @Override - public int maxAge() { - // TODO Auto-generated method stub - return maxAge; - } - - @Override - public int getSpeed() { - // TODO Auto-generated method stub - return speed; - } - - @Override - public String[] getTraits() { - // TODO Auto-generated method stub - return traits; - - } - - @Override - public String[] getSkills() { - // TODO Auto-generated method stub - return skills; - } - - @Override - public String[] getLanguages() { - // TODO Auto-generated method stub - return languages; - } - - @Override - public String[] getProficiencies() { - // TODO Auto-generated method stub - return proficiencies; - } - - @Override - public int[] getASI() { - // TODO Auto-generated method stub - return new int[]{2, 2}; - } - - @Override - public String toString() { - // TODO Auto-generated method stub - return this.getClass().getSimpleName(); - } - -} diff --git a/dndBuilder/src/Character/Races/Elf.java b/dndBuilder/src/Character/Races/Elf.java deleted file mode 100644 index ba110ee..0000000 --- a/dndBuilder/src/Character/Races/Elf.java +++ /dev/null @@ -1,72 +0,0 @@ -package Character.Races; - -public class Elf implements Race { - private final int speed = 30; - private final int maxAge = 750; - private String[] traits; - private String[] skills; - private String[] languages; - private String[] proficiencies; - - public Elf() { - - this.languages = new String[]{"Common", "Elvish"}; - this.skills = new String[]{}; - } - - @Override - public String getRace() { - // TODO Auto-generated method stub - return this.getClass().getSimpleName(); - } - - @Override - public int maxAge() { - // TODO Auto-generated method stub - return maxAge; - } - - @Override - public int getSpeed() { - // TODO Auto-generated method stub - return speed; - } - - @Override - public String[] getTraits() { - // TODO Auto-generated method stub - return traits; - - } - - @Override - public String[] getSkills() { - // TODO Auto-generated method stub - return skills; - } - - @Override - public String[] getLanguages() { - // TODO Auto-generated method stub - return languages; - } - - @Override - public String[] getProficiencies() { - // TODO Auto-generated method stub - return proficiencies; - } - - @Override - public int[] getASI() { - // TODO Auto-generated method stub - return new int[]{1, 1}; - } - - @Override - public String toString() { - // TODO Auto-generated method stub - return this.getClass().getSimpleName(); - } - -} diff --git a/dndBuilder/src/Character/Races/Gnome.java b/dndBuilder/src/Character/Races/Gnome.java deleted file mode 100644 index 8998767..0000000 --- a/dndBuilder/src/Character/Races/Gnome.java +++ /dev/null @@ -1,72 +0,0 @@ -package Character.Races; - -public class Gnome implements Race { - private final int speed = 25; - private final int maxAge = 500; - private String[] traits; - private String[] skills; - private String[] languages; - private String[] proficiencies; - - public Gnome() { - - this.languages = new String[]{"Common", "Gnomish"}; - this.skills = new String[]{}; - } - - @Override - public String getRace() { - // TODO Auto-generated method stub - return this.getClass().getSimpleName(); - } - - @Override - public int maxAge() { - // TODO Auto-generated method stub - return maxAge; - } - - @Override - public int getSpeed() { - // TODO Auto-generated method stub - return speed; - } - - @Override - public String[] getTraits() { - // TODO Auto-generated method stub - return traits; - - } - - @Override - public String[] getSkills() { - // TODO Auto-generated method stub - return skills; - } - - @Override - public String[] getLanguages() { - // TODO Auto-generated method stub - return languages; - } - - @Override - public String[] getProficiencies() { - // TODO Auto-generated method stub - return proficiencies; - } - - @Override - public int[] getASI() { - // TODO Auto-generated method stub - return new int[]{3, 3}; - } - - @Override - public String toString() { - // TODO Auto-generated method stub - return this.getClass().getSimpleName(); - } - -} diff --git a/dndBuilder/src/Character/Races/HalfElf.java b/dndBuilder/src/Character/Races/HalfElf.java deleted file mode 100644 index 508c522..0000000 --- a/dndBuilder/src/Character/Races/HalfElf.java +++ /dev/null @@ -1,77 +0,0 @@ -package Character.Races; - -public class HalfElf implements Race { - private final int speed = 30; - private final int maxAge = 180; - private String[] traits; - private String[] skills; - private String[] languages; - private String[] proficiencies; - private int chosenASI; - - //TODO HalfElf get's to increase 1 ASI of their choice to increase. - public HalfElf(String chosenLanguage, int chosenASI) { - - this.languages = new String[]{"Common", "Elvish", chosenLanguage}; - this.skills = new String[]{}; - this.chosenASI = chosenASI; - - } - - @Override - public String getRace() { - // TODO Auto-generated method stub - return this.getClass().getSimpleName(); - } - - @Override - public int maxAge() { - // TODO Auto-generated method stub - return maxAge; - } - - @Override - public int getSpeed() { - // TODO Auto-generated method stub - return speed; - } - - @Override - public String[] getTraits() { - // TODO Auto-generated method stub - return traits; - - } - - @Override - public String[] getSkills() { - // TODO Auto-generated method stub - return skills; - } - - @Override - public String[] getLanguages() { - // TODO Auto-generated method stub - return languages; - } - - @Override - public String[] getProficiencies() { - // TODO Auto-generated method stub - return proficiencies; - } - - @Override - public int[] getASI() { - // TODO Auto-generated method stub - return new int[]{5, 5, chosenASI}; - } - - @Override - public String toString() { - // TODO Auto-generated method stub - return this.getClass().getSimpleName(); - } - -} - diff --git a/dndBuilder/src/Character/Races/HalfOrc.java b/dndBuilder/src/Character/Races/HalfOrc.java deleted file mode 100644 index 222245d..0000000 --- a/dndBuilder/src/Character/Races/HalfOrc.java +++ /dev/null @@ -1,72 +0,0 @@ -package Character.Races; - -public class HalfOrc implements Race { - private final int speed = 30; - private final int maxAge = 75; - private String[] traits; - private String[] skills; - private String[] languages; - private String[] proficiencies; - - public HalfOrc() { - - this.languages = new String[]{"Common", "Orc"}; - this.skills = new String[]{}; - } - - @Override - public String getRace() { - // TODO Auto-generated method stub - return this.getClass().getSimpleName(); - } - - @Override - public int maxAge() { - // TODO Auto-generated method stub - return maxAge; - } - - @Override - public int getSpeed() { - // TODO Auto-generated method stub - return speed; - } - - @Override - public String[] getTraits() { - // TODO Auto-generated method stub - return traits; - - } - - @Override - public String[] getSkills() { - // TODO Auto-generated method stub - return skills; - } - - @Override - public String[] getLanguages() { - // TODO Auto-generated method stub - return languages; - } - - @Override - public String[] getProficiencies() { - // TODO Auto-generated method stub - return proficiencies; - } - - @Override - public int[] getASI() { - // TODO Auto-generated method stub - return new int[]{0, 0, 2}; - } - - @Override - public String toString() { - // TODO Auto-generated method stub - return this.getClass().getSimpleName(); - } - -} diff --git a/dndBuilder/src/Character/Races/Halfling.java b/dndBuilder/src/Character/Races/Halfling.java deleted file mode 100644 index 31c6673..0000000 --- a/dndBuilder/src/Character/Races/Halfling.java +++ /dev/null @@ -1,73 +0,0 @@ -package Character.Races; - -public class Halfling implements Race { - private final int speed = 30; - private final int maxAge = 750; - private String[] traits; - private String[] skills; - private String[] languages; - private String[] proficiencies; - - public Halfling() { - - this.languages = new String[]{"Common", "Elvish"}; - this.skills = new String[]{}; - - } - - @Override - public String getRace() { - // TODO Auto-generated method stub - return this.getClass().getSimpleName(); - } - - @Override - public int maxAge() { - // TODO Auto-generated method stub - return maxAge; - } - - @Override - public int getSpeed() { - // TODO Auto-generated method stub - return speed; - } - - @Override - public String[] getTraits() { - // TODO Auto-generated method stub - return traits; - - } - - @Override - public String[] getSkills() { - // TODO Auto-generated method stub - return skills; - } - - @Override - public String[] getLanguages() { - // TODO Auto-generated method stub - return languages; - } - - @Override - public String[] getProficiencies() { - // TODO Auto-generated method stub - return proficiencies; - } - - @Override - public int[] getASI() { - // TODO Auto-generated method stub - return new int[]{1, 1}; - } - - @Override - public String toString() { - // TODO Auto-generated method stub - return this.getClass().getSimpleName(); - } - -} diff --git a/dndBuilder/src/Character/Races/Human.java b/dndBuilder/src/Character/Races/Human.java deleted file mode 100644 index 0c71bc6..0000000 --- a/dndBuilder/src/Character/Races/Human.java +++ /dev/null @@ -1,74 +0,0 @@ -package Character.Races; - -public class Human implements Race { - - private final int speed = 30; - private final int maxAge = 80; - private String[] traits; - private String[] skills; - private String[] languages; - private String[] proficiencies; - - public Human(String chosenLanguage) { - - this.languages = new String[]{"Common", chosenLanguage}; - this.skills = new String[]{}; - - } - - @Override - public String getRace() { - // TODO Auto-generated method stub - return this.getClass().getSimpleName(); - } - - @Override - public int maxAge() { - // TODO Auto-generated method stub - return maxAge; - } - - @Override - public int getSpeed() { - // TODO Auto-generated method stub - return speed; - } - - @Override - public String[] getTraits() { - // TODO Auto-generated method stub - return traits; - - } - - @Override - public String[] getSkills() { - // TODO Auto-generated method stub - return skills; - } - - @Override - public String[] getLanguages() { - // TODO Auto-generated method stub - return languages; - } - - @Override - public String[] getProficiencies() { - // TODO Auto-generated method stub - return proficiencies; - } - - @Override - public int[] getASI() { - // TODO Auto-generated method stub - return new int[]{0, 1, 2, 3, 4, 5}; - } - - @Override - public String toString() { - // TODO Auto-generated method stub - return this.getClass().getSimpleName(); - } - -} diff --git a/dndBuilder/src/Character/Races/Race.java b/dndBuilder/src/Character/Races/Race.java deleted file mode 100644 index 8ae38b9..0000000 --- a/dndBuilder/src/Character/Races/Race.java +++ /dev/null @@ -1,47 +0,0 @@ -package Character.Races; - -public interface Race { - - String getRace(); - - int maxAge(); - - int getSpeed(); - - String[] getTraits(); - - String[] getSkills(); - - String[] getLanguages(); - - String[] getProficiencies(); - - int[] getASI(); - -// private ArrayList traits; -// private ArrayList skills; -// private ArrayList laugnuage; -// //private Subrace subrase; -// private ArrayList proficiencies; -// /** -// * @param raceName -// * @param ageRange -// * @param speed -// * @param traits -// * @param skills -// * @param laugnuage -// * @param proficiencies -// */ -// public Race(String raceName, String ageRange, int speed, ArrayList traits, ArrayList skills, -// ArrayList laugnuage, ArrayList proficiencies) { -// this.raceName = raceName; -// this.ageRange = ageRange; -// this.speed = speed; -// this.traits = traits; -// this.skills = skills; -// this.laugnuage = laugnuage; -// this.proficiencies = proficiencies; -// } - - -} diff --git a/dndBuilder/src/Character/Races/Tiefling.java b/dndBuilder/src/Character/Races/Tiefling.java deleted file mode 100644 index ea015fa..0000000 --- a/dndBuilder/src/Character/Races/Tiefling.java +++ /dev/null @@ -1,72 +0,0 @@ -package Character.Races; - -public class Tiefling implements Race { - private final int speed = 30; - private final int maxAge = 85; - private String[] traits; - private String[] skills; - private String[] languages; - private String[] proficiencies; - - public Tiefling() { - - this.languages = new String[]{"Common", "Infernal"}; - this.skills = new String[]{}; - } - - @Override - public String getRace() { - // TODO Auto-generated method stub - return this.getClass().getSimpleName(); - } - - @Override - public int maxAge() { - // TODO Auto-generated method stub - return maxAge; - } - - @Override - public int getSpeed() { - // TODO Auto-generated method stub - return speed; - } - - @Override - public String[] getTraits() { - // TODO Auto-generated method stub - return traits; - - } - - @Override - public String[] getSkills() { - // TODO Auto-generated method stub - return skills; - } - - @Override - public String[] getLanguages() { - // TODO Auto-generated method stub - return languages; - } - - @Override - public String[] getProficiencies() { - // TODO Auto-generated method stub - return proficiencies; - } - - @Override - public int[] getASI() { - // TODO Auto-generated method stub - return new int[]{3, 5, 5}; - } - - @Override - public String toString() { - // TODO Auto-generated method stub - return this.getClass().getSimpleName(); - } - -} diff --git a/dndBuilder/src/Character/Skills.java b/dndBuilder/src/Character/Skills.java deleted file mode 100644 index 6fd192e..0000000 --- a/dndBuilder/src/Character/Skills.java +++ /dev/null @@ -1,76 +0,0 @@ -package Character; - -import Character.AbilityScores.Stats; - -/** - * Object stores information about a character's skills arrays. Firstly, the name of each skill, and secondly the value of each skill. When constructed, a private method is called - * which adds any proficiency bonus to each skill and then adds the ability score modifier to each skill. - */ -public class Skills { - - // TODO: Prof bonus comes from the class, changes upon certain level thresholds. - private final int profBonus = 5; - // TODO: Need to verify skills are in correct order. - private String[] allSkillsText = {"Acrobatics", "Animal Handling", "Arcana", "Athletics", "Deception", "History", "Insight", "Intimidation", "Investigation", "Medicine", "Nature", "Perception", "Performance", "Persuasion", "Religion", "Sleight of Hand", "Stealth", "Survival"}; - private Stats[] stats; - - private int[] skills; - - - /** - * Default constructor for the Skills class. Should be constructed AFTER the user has generated their stats and chosen the skills they are proficient in. - * - * @param skills - * @param stats - */ - public Skills(int[] skills, Stats[] stats) { - - this.skills = skills; - - this.stats = stats; - - setSkills(); - - } - - /** - * Adds proficiency bonus to each element of the skills array, and then adds the corresponding AS modifier to each skill. - */ - private void setSkills() { - -// TODO: Need to verify these are the correct ability scores for each skill. - int[] skillsAbilities = {1, 4, 3, 0, 5, 3, 4, 5, 3, 4, 3, 4, 5, 5, 3, 1, 4}; - - for (int i = 0; i < allSkillsText.length; i++) { - - if (skills[i] == 1) { - - skills[i] = profBonus; - - } - - skills[i] += stats[skillsAbilities[i]].getModifier(); - - } - - } - - /** - * Returns the value of each skill's score. - * - * @return int[] skills - */ - public int[] getSkills() { - - return skills; - - } - - // TODO: Need to implement overloaded method to return one specific skill. - public int getSkill(String skill) { - - return 0; - - } - -} \ No newline at end of file diff --git a/dndBuilder/src/DndCharacterBuilder.java b/dndBuilder/src/DndCharacterBuilder.java deleted file mode 100644 index 68e27ea..0000000 --- a/dndBuilder/src/DndCharacterBuilder.java +++ /dev/null @@ -1,15 +0,0 @@ -import FileManagement.FileManager; -import GUI.GUImanager; - -public class DndCharacterBuilder { - - public static void main(String[] args) { - - FileManager data = new FileManager(); - - GUImanager gui = new GUImanager(data.isReturninguser()); - gui.setVisible(true); - - } - -} \ No newline at end of file diff --git a/dndBuilder/src/FileManagement/ExportPDF.java b/dndBuilder/src/FileManagement/ExportPDF.java deleted file mode 100644 index 2dcad89..0000000 --- a/dndBuilder/src/FileManagement/ExportPDF.java +++ /dev/null @@ -1,10 +0,0 @@ -package FileManagement; - -public class ExportPDF { - - public ExportPDF() { - - - } - -} diff --git a/dndBuilder/src/FileManagement/FileManager.java b/dndBuilder/src/FileManagement/FileManager.java deleted file mode 100644 index 8a03b92..0000000 --- a/dndBuilder/src/FileManagement/FileManager.java +++ /dev/null @@ -1,119 +0,0 @@ -package FileManagement; - -import Character.CharacterSheet; - -import java.awt.*; -import java.io.*; - -public class FileManager { - - private File[] savedCharacters; - - public FileManager() { - - findSavedCharacters(); - - loadFonts(); - - } - - private void loadFonts() { - - try { - GraphicsEnvironment ge = - GraphicsEnvironment.getLocalGraphicsEnvironment(); - ge.registerFont(Font.createFont(Font.TRUETYPE_FONT, new File("dndBuilder/src/Resources/Fonts/SanSalvi.ttf"))); - } catch (IOException | FontFormatException e) { - //Handle exception - System.out.println("Error finding font."); - } - - } - - public boolean isReturninguser() { - - if (savedCharacters == null) { - - return false; - - } - - return savedCharacters.length > 0; - - } - - public CharacterSheet readCharacter(int index) { - - CharacterSheet sheet = null; - - try { - - FileInputStream fileIn = new FileInputStream("/dndBuilder/" + savedCharacters[index].getPath() + ".dnd"); - ObjectInputStream in = new ObjectInputStream(fileIn); - sheet = (CharacterSheet) in.readObject(); - in.close(); - fileIn.close(); - - } catch (IOException i) { - - i.printStackTrace(); - - } catch (ClassNotFoundException c) { - - System.out.println("Saved characters not found"); - c.printStackTrace(); - - } - - return sheet; - - } - - public void saveCharacter(CharacterSheet completedCharacter) { - - try { - - FileOutputStream fileOut = - new FileOutputStream("/dndBuilder/" + completedCharacter.getName().hashCode() + ".dnd"); - ObjectOutputStream out = new ObjectOutputStream(fileOut); - out.writeObject(completedCharacter); - out.close(); - fileOut.close(); - - } catch (IOException i) { - - i.printStackTrace(); - - } - - findSavedCharacters(); - - } - - public void deleteCharacter(int index) { - - File[] tmp = new File[savedCharacters.length - 1]; - - for (int i = 0; i < savedCharacters.length; i++) { - - if (i != index) { - - tmp[i] = savedCharacters[i]; - - } - - } - - savedCharacters = tmp; - - findSavedCharacters(); - - } - - private void findSavedCharacters() { - - savedCharacters = new File("/dndBuilder").listFiles(); - - } - -} diff --git a/dndBuilder/src/GUI/.DS_Store b/dndBuilder/src/GUI/.DS_Store deleted file mode 100644 index 881b2866df96dae5b72c573fa69b7522b1cb79d3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6148 zcmeHK%}(Pm5FVETZV{pfBsk{64WYuKvU@-Z1%!G-3O@&S1<5vopb(=brGiqF*MOJc zId}pd2WD&+RLbrV5So$3-*`M@$Dbqr0D!2sn~MMy0FbDJg%TF;2(^259Z3U<-Dk0cW^&uj{t}r&zxLzY(jyL97Cdq~Bx>b>T@1S^#6P zt@A>NA$=2j|G(Ivlb+jtAA<8ZO0#P9Q4~gsqhsSzmSuUe{Kq>{9WV2N3GW@$(gyu)yC1;kG`Ec6oqk*<+i z(56cw=uE#?MIItcst5O!o?UnoM4j{Q429E59- zOJ;x>7-V3?R4a7;Z~puJKbXWdW`G&^Rt$*ZhPP42DcQ4iXmWJcI;cmeBovn$d`Uq= iAH^6;NAWDG7W6x0Ai5TFgXlrwi-4wq3ufR$8F&V2a%?LA diff --git a/dndBuilder/src/GUI/AppTheme.java b/dndBuilder/src/GUI/AppTheme.java deleted file mode 100644 index 5b74fb6..0000000 --- a/dndBuilder/src/GUI/AppTheme.java +++ /dev/null @@ -1,30 +0,0 @@ -package GUI; - -import java.awt.*; - -public interface AppTheme { - - public Color lightAccent = Color.decode("#EAF0CE"); - public Color lightBrown = Color.decode("#EBBE9B"); - public Color medBrown = Color.decode("#E4A677"); - - public Color darkBrown = Color.decode("#502419"); - - public Color darkestBrown = Color.decode("#1F0E0A"); - - public Color black = Color.BLACK; - - public Color confirmationBlue = Color.decode("#296EB4"); - - public Color rejectionRed = Color.decode("#A23E48"); - - public Font headerFont = new Font("SanSalvi", Font.BOLD, 45); - public Font subHeaderFont = new Font("SanSalvi", Font.PLAIN, 35); - - public Font paragraphFont = new Font("SanSalvi", Font.PLAIN, 20); - public Font userTextFont = new Font("SanSalvi", Font.PLAIN, 15); - public Font buttonFont = new Font("SanSalvi", Font.PLAIN, 15); - - public String OS = System.getProperty("os.name"); - -} diff --git a/dndBuilder/src/GUI/GUImanager.java b/dndBuilder/src/GUI/GUImanager.java deleted file mode 100644 index a2eed43..0000000 --- a/dndBuilder/src/GUI/GUImanager.java +++ /dev/null @@ -1,404 +0,0 @@ -package GUI; - -import GUI.Panels.BasicPanel; -import GUI.Panels.ChooseAbilityScoresPanel; -import GUI.Panels.DescriptionPanel; -import GUI.Panels.MainMenuPanel; -import Resources.CustomAssets.BasicNavPanel; -import Resources.CustomAssets.DefaultButton; - -import javax.swing.*; -import java.awt.*; - -public class GUImanager extends JFrame { - - private static JPanel[] panels; - private int lastPanel; - private int currentPanel; - private int nextPanel; - - - private String[] raceOptions; - private String[] raceDescriptions; - private String[] classOptions; - private String[] classDescriptions; - private int raceChoice; - private int classChoice; - - private String[] statOptions; - private String[] statDescriptions; - private String[] characteristics; - private String[] alignmentOptions; - private String[] alignmentDescriptions; - private String[] backgroundOptions; - private String[] backgroundDescriptions; - private int[] selectedStats; - - - public GUImanager(boolean returningUser) { - super("D&D Character Builder"); - frameSetup(); - setupPanelInfo(); - this.panels = new JPanel[]{ - new MainMenuPanel(createNewCharacterButton(), createRandomCharacterButton(), createLoadButton()), - new BasicPanel(createNavPanel(), raceOptions, raceDescriptions, "Step 1: Choose Your Race"), // To choose Race. - new BasicPanel(createNavPanel(), classOptions, classDescriptions, "Step 2: Choose Your Class"), // To choose Class. - new ChooseAbilityScoresPanel(createNavPanel(1), statOptions, statDescriptions, selectedStats, "Step 3: Choose Your Ability Scores"), - new DescriptionPanel(createNavPanel(), characteristics, alignmentOptions, alignmentDescriptions, backgroundOptions, backgroundDescriptions, "Step 4: Describe your character") - }; -/* - this.currentPanel = 0; - this.lastPanel = currentPanel - 1; - this.nextPanel = currentPanel + 1;*/ - - if (returningUser) { - - this.currentPanel = 0; - - } else { - - this.currentPanel = 1; - - } - - add(panels[currentPanel]); - - } - - private void frameSetup() { - - setDefaultCloseOperation(EXIT_ON_CLOSE); - setLayout(new BorderLayout()); - setPreferredSize(new Dimension(750, 550)); - setSize(getPreferredSize()); -// setResizable(false); - setLocationRelativeTo(null); - - try { - UIManager.setLookAndFeel(UIManager.getCrossPlatformLookAndFeelClassName()); - } catch (Exception e) { - System.out.println("Error with cross platform look/feel in frameSetup()."); - } - - } - - private void setupPanelInfo() { - - raceOptions = new String[]{ - "Dragonborn", - "Dwarf", - "Elf", - "Gnome", - "HalfElf", - "Halfling", - "Halforc", - "Human", - "Tiefling" - }; - - raceDescriptions = new String[]{ - - "Born of dragons, as their name proclaims, the dragonborn walk proudly through a world that greets them with fearful incomprehension." + "Shaped by draconic gods or the dragons themselves, dragonborn originally hatched from dragon eggs as a unique race, combining the best attributes of dragons and humanoids." + "Some dragonborn are faithful servants to true dragons, others form the ranks of soldiers in great wars, and still others find themselves adrift, with no clear calling in life.", - "By the numbers, dwarves are one of the best races in the Player’s Handbook. " + "" + "Their ability score increases are good, and their other racial traits make them durable and flexible enough to succeed in several classes.", - "A staple of fantasy fiction and folklore, Elves are a simple yet effective base race with subraces which are numerous and diverse enough that elves are usable in a variety of builds and character concepts. " + "Unfortunately, because the subraces differentiate the Elf’s traits so much, it’s rare for more than one subrace to be viable in the same class unless you’re using the Customizing Your Origins optional rules presented in Tasha’s Cauldron of Everything.", - "Gnomes have changed a lot throughout the history of Dungeons and Dragons. " + "At times they’ve been monsters. " + "At times they’ve been fey. " + "In general, DnD has always had trouble pinning down gnomes thematically in a way that distinguishes them from halflings, but I think 5th edition may have done the best job of any edition to date. " + "Gnomes have subraces which are very distinct from one another, and their traits offer some unique an interesting options.", - "The Half-Elf is among the most powerful races in the core rules. " + "It’s a top-tier race option for several classes, and even for classes where the Half-Elf isn’t a perfect fit it’s at least workable. " + "Two flexible ability increases and two free skill proficiencies are useful on essentially any character, plus you get Darkvision and a +2 Charisma increase.", - "Half-orcs are an easily-overlooked race. " + "Their racial traits tend to pigeon-hole them into simple martial builds, and in most official settings and works of fiction outside of D&D orcs have historically been portrayed barbaric savages, so even characters’ backstories tend to be forced into an incredibly narrow set of options. " + "Half-orcs don’t get subraces, and unlike the half-elf we haven’t seen variants of any kind, so the race offers little flexibility.", - "Halflings are perhaps the most iconic small race in Dungeons and Dragons, dating back to its earliest editions. " + "Their mechanics have changed as much as any race, but they have consistently remained a staple option for players who enjoy playing thieves, rogues, or other stealthy characters.", - "Human come in two flavors: the standard human and the “variant” human. " + "The standard human receives +1 increases to each ability score, making it easy to fit into any build. " + "However, it lacks any other racial traits, which makes the standard human extremely bland. " + "It also lacks the numerical appeal of a +2 ability increase, so more focused races will frequently outpace the standard human in nearly every case.", - "Thanks to the variants presented in Sword Coast Adventurer’s Guide and the subraces presented in Mordenkainen’s Tome of Foes, the Tiefling has the longest list of subrace options of any published race, totaling an impressive 14 individual subraces and variants. " + "These options make tieflings diverse, flexible, and viable in an impressively large number of builds." - - }; - - classOptions = new String[]{ - - "Artificer", - "Barbarian", - "Bard", - "Cleric", - "Druid", - "Fighter", - "Monk", - "Paladin", - "Ranger", - "Rogue", - "Sorcerer", - "Warlock", - "Wizard" - - }; - - classDescriptions = new String[]{ - - "The Artificer is a class with a tool for every job and a solution to every problem. " + "They excel as a Support character, but make decent Defenders, Healers, and Strikers, too. " + "With the right infusions and spells, they can fill nearly any role in the party, making the Artificer’s versatility rival that of the Bard.", - "Barbarians are all about getting angry and dealing damage. " + "They have a ton of hit points, resistance to damage, and Rage gives a wonderful bonus to damage. " + "Barbarians don’t get much in the way of skills, so generally they’re stuck as combat monsters, but they function equally well as a Defender and a Striker, and certain character options can even expand them into a limited Support role.", - "The Bard is fantastically versatile. " + "With access to every skill, expertise, full casting, and a decent set of proficiencies, the Bard can fill essentially every role in the party. " + "Subclasses like College of Lore are more of the classic supportive Bard, with improved magical options and support abilities, while College of Swords and College of Valor can serve as front-line melee characters who can bring their spellcasting and support capabilities into the heat of battle.", - "Clerics are among the most diverse and interesting classes in 5e DnD. " + "Because your choice of Divine Domain so greatly affects your capabilities, Clerics can fit a variety of roles and play styles. " + "More generally, Clerics are the best healers in the game, and have among the best support, utility, and divination options in the game. " + "However, they are by no means limited to healing and support roles. " + "Clerics have abundant offensive options, and can even be effective with weapons.", - "Druids are a very versatile class. " + "Between their available archetypes, they’re able to serve mixes roles as scouts, strikers, blaster, support casters, and controllers. " + "Their spell list has a lot of unique options. " + "There is a strong emphasis on area control spells, and most of the Druid’s best spells require Concentration.", - "The Fighter is a fantastic addition to any party. " + "While their skill and tool proficiencies are extremely limited, Fighters excel in combat. " + "They are durable, have great armor, and provide plenty of damage output. " + "Fighters get more Ability Score Increases than any other class, allowing them to easily explore feats without sacrificing crucial ability scores. " + "They also notably get more attacks than any other class, which can be a lot of fun.", - "The Monk is the iconic martial-artist, popular among those who prefer to punch things rather than stabbing them or setting them on fire (though stabbing things and setting them on fire is still a possibility for the Monk). " + "Monks are excellent Defenders and Strikers, and typically fill a role in party as a Fighter-equivalent or Rogue-equivalent depending on your subclass and proficiencies.", - "Paladins are the most durable, survivable, and self-sufficient class in the game. " + "As such, they both make excellent solo characters and are excellent additions to nearly any party regardless of existing capabilities. " + "In a party, they serve as a Defender, Face, and Striker. " + "They do have some healing and utility options, but not enough to replace a full spellcaster in most parties.", - "The Ranger is an interesting mix of Druid-style spellcasting, Fighter-style combat capabilities, and Rogue-style skills. " + "Themed around nature and exploration, the Ranger is a welcome asset in parties exploring untamed lands above or below ground. " + "The Ranger can fill the role of either a Fighter-equivalent or a Rogue-equivalent (sometimes both), and works well as a Scout and Striker, but trades the Fighter’s durability for better skills and improved damage output.", - "Rogues are the quintessential Face, Scout and Striker. " + "Sneak Attack allows them to do a huge pile of damage in a single attack, and their pile of skills allows them to easily handle locks, traps, guards, and many other challenges. " + "While a party can function just fine without a Rogue, it’s hard to compete with the sheer number of important skill and tool proficiencies offered by the Rogue.", - "Sorcerers are a challenge, but at the same time they can be less complex than most spellcasting classes. " + "The Sorcerer’s spell list allows them to serve as a Blaster, Controller, Striker, and Utility Caster, and sorcerers make one of the easiest Faces in the game due to their skill list and their dependence on Charisma.", - "The Warlock is likely the easiest of any spellcaster to play. " + "You get only a handful of spell slots at a time, and never have to juggle multiple spell slot levels. " + "Warlocks learn spells permanently, so you don’t need to worry about changing your spells on a daily basis. " + "Warlocks also get the most powerful damage cantrip in the game, giving them a solid, reliable option for damage output in between your big spells.", - "The Wizard is the iconic arcane spellcaster, capable of doing all manner of fantastic tricks, and generally limited only by their spellbook and their spell slots. " + "A Wizard with a comprehensive spellbook can do essentially anything in the game, often as well as or better than a non-magical character who is built to do that thing. " + "A Wizard with Invisibility is as stealthy as a Rogue." - - }; - - statOptions = new String[]{ - - "Strength", - "Dexterity", - "Constitution", - "Intelligence", - "Wisdom", - "Charisma" - - }; - - statDescriptions = new String[]{ - - "Strength is a thing.", - "Dexterity is a thing", - "Constitution is a thing", - "Intelligence is a thing", - "Wisdom is a thing", - "Charisma is a thing" - - }; - - selectedStats = new int[]{8, 8, 8, 8, 8, 8}; - - characteristics = new String[]{ - - "Name", - "Age", - "Height", - "Weight", - "Eyes", - "Hair" - - }; - - alignmentOptions = new String[]{ - - "Lawful Good", - "Neutral Good", - "Chaotic Good", - "Lawful Neutral", - "True Neutral", - "Chaotic Neutral", - "Lawful Evil", - "Neutral Evil", - "Chaotic Evil" - - }; - - alignmentDescriptions = new String[]{ - - "LG - need description", - "NG - need description", - "cg - need description", - "ln - need description", - "tn - need description", - "cn - need description", - "le - need description", - "ne - need description", - "ce - need description" - - }; - - backgroundOptions = new String[]{ - - "Acolyte", - "Charlatan", - "Criminal", - "Entertainer", - "Folk Hero", - "Gladiator", - "Guild Artisan", - "Guild Merchant", - "Hermit", - "Knight", - "Noble", - "Outlander", - "Pirate", - "Sage", - "Sailor", - "Soldier", - "Spy", - "Urchin" - - }; - - backgroundDescriptions = new String[]{ - - "Acolyte - need description", - "Charlatan - need description", - "Criminal - need description", - "Entertainer - need description", - "Folk Hero - need description", - "Gladiator - need description", - "Guild Artisan - need description", - "Guild Merchant - need description", - "Hermit - need description", - "Knight - need description", - "Noble - need description", - "Outlander - need description", - "Pirate - need description", - "Sage - need description", - "Sailor - need description", - "Soldier - need description", - "Spy - need description", - "Urchin - need description" - - }; - - } - - private BasicNavPanel createNavPanel() { - - return new BasicNavPanel(createBackButton(), createContinueButton(), 0); - - } - - private BasicNavPanel createNavPanel(int continueRequirement) { - - return new BasicNavPanel(createBackButton(), createContinueButton(), continueRequirement); - - } - - private DefaultButton createBackButton() { - - DefaultButton button = new DefaultButton("Back"); - button.addActionListener( - - e -> { - - lastPanel--; - currentPanel--; - nextPanel--; - clearAndReset(); - - } - - ); - - return button; - - } - - private DefaultButton createContinueButton() { - - DefaultButton button = new DefaultButton("Continue"); - button.addActionListener( - - e -> { - - lastPanel++; - currentPanel++; - nextPanel++; - clearAndReset(); - - } - - ); - - return button; - - } - - private DefaultButton createNewCharacterButton() { - - DefaultButton button = createContinueButton(); - button.setText("Create New Character"); - - return button; - - } - - // TODO: Need to implement. - private DefaultButton createRandomCharacterButton() { - - DefaultButton button = new DefaultButton("Create Random Character"); - button.addActionListener( - - e -> { - - createRandomCharacter(); - - lastPanel = currentPanel; - currentPanel = 3; - nextPanel = currentPanel + 1; - clearAndReset(); - - } - - ); - - return button; - - } - - // TODO: Need to implement with exact indices and file manager logic. - private DefaultButton createSaveButton() { - - DefaultButton button = new DefaultButton("Save"); - button.addActionListener( - - e -> { - - lastPanel = currentPanel; - currentPanel = 6; - nextPanel = currentPanel + 1; - clearAndReset(); - - } - - ); - - return button; - - } - - private DefaultButton createLoadButton() { - - DefaultButton button = new DefaultButton("Load"); - button.addActionListener( - - e -> { - - lastPanel = currentPanel; - currentPanel = 3; - nextPanel = currentPanel + 1; - clearAndReset(); - - } - - ); - - return button; - - } - - // TODO: Need to implement random character creation. - private void createRandomCharacter() { - - System.out.println("Request to create random character. Need to implement."); - - } - - private void clearAndReset() { - - getContentPane().removeAll(); - - add(panels[currentPanel]); - - repaint(); - revalidate(); - pack(); - - } - -} \ No newline at end of file diff --git a/dndBuilder/src/GUI/Panels/BasicPanel.java b/dndBuilder/src/GUI/Panels/BasicPanel.java deleted file mode 100644 index c6eb7f1..0000000 --- a/dndBuilder/src/GUI/Panels/BasicPanel.java +++ /dev/null @@ -1,127 +0,0 @@ -package GUI.Panels; - -import GUI.AppTheme; -import Resources.CustomAssets.DefaultButton; -import Resources.CustomAssets.ImageInfoPanel; - -import javax.swing.*; -import java.awt.*; - -public class BasicPanel extends JPanel implements AppTheme { - - private DefaultButton[] optionButtons; - private String[] options; - private ImageInfoPanel infoPanel; - private int choiceIndex; - private String panelTitle; - - public BasicPanel(JPanel navPanel, String[] options, String[] descriptions, String panelTitle) { - - super(); - this.options = options; - this.panelTitle = panelTitle; - - Rectangle[] basicBounds = new Rectangle[]{ - - new Rectangle(5, 5, 600, 400), // ImageInfo panel - new Rectangle(275, 10, 300, 35), // ImageInfo subheader - new Rectangle(275, 45, 300, 355), // ImageInfo text - new Rectangle(10, 45, 250, 355) - - }; - - this.infoPanel = new ImageInfoPanel(options, descriptions, basicBounds, Integer.parseInt(Character.toString(panelTitle.charAt(5)))); - infoPanel.updateInfo(0); // Default start with 0th element. - - choiceIndex = 0; - - panelSetup(); - createMasterPanel(); - add(navPanel, BorderLayout.SOUTH); - - } - - private void panelSetup() { - - setBackground(lightBrown); - setLayout(new BorderLayout(0, 0)); - - } - - private void createMasterPanel() { - - JLabel title = new JLabel(panelTitle); - title.setHorizontalAlignment(SwingConstants.CENTER); - title.setFont(headerFont); - title.setForeground(darkestBrown); - add(title, BorderLayout.NORTH); - - JPanel panel = new JPanel(); - panel.setOpaque(false); - panel.setLayout(null); - panel.add(infoPanel); - panel.add(createButtonPanel()); - - add(panel); - - } - - private JPanel createButtonPanel() { - - JPanel buttonPanel = new JPanel(new GridLayout(options.length, 1, 0, 0)); - buttonPanel.setBackground(lightBrown); - - buttonPanel.setBounds(585, 45, 135, 355); - - optionButtons = new DefaultButton[options.length]; - - - for (int i = 0; i < optionButtons.length; i++) { - - optionButtons[i] = createButton(options[i], i); - - if (i == 0) { - - optionButtons[i].select(); - - } - - } - - - for (int i = 0; i < options.length; i++) { - - buttonPanel.add(optionButtons[i]); - - } - - return buttonPanel; - - } - - private DefaultButton createButton(String holderName, int index) { - - DefaultButton button = new DefaultButton(holderName); - button.addActionListener(e -> updateButtons(index)); - - return button; - - } - - private void updateButtons(int newIndex) { - - optionButtons[choiceIndex].deSelect(); - optionButtons[newIndex].select(); - - choiceIndex = newIndex; - infoPanel.updateInfo(choiceIndex); - - } - - public int getChoice() { - - return choiceIndex; - - } - -} \ No newline at end of file diff --git a/dndBuilder/src/GUI/Panels/ChooseAbilityScoresPanel.java b/dndBuilder/src/GUI/Panels/ChooseAbilityScoresPanel.java deleted file mode 100644 index ad34289..0000000 --- a/dndBuilder/src/GUI/Panels/ChooseAbilityScoresPanel.java +++ /dev/null @@ -1,238 +0,0 @@ -package GUI.Panels; - -import GUI.AppTheme; -import Resources.CustomAssets.BasicNavPanel; -import Resources.CustomAssets.DefaultButton; -import Resources.CustomAssets.InfoPanel; - -import javax.swing.*; -import javax.swing.border.LineBorder; -import java.awt.*; - -public class ChooseAbilityScoresPanel extends JPanel implements AppTheme { - - private DefaultButton[] statInfoButtons; - private JLabel[] statLabels; - private String[] statOptions; - private InfoPanel infoPanel; - private BasicNavPanel basicNavPanel; - private int[] selectedStats; - private int selectedStatIndex; - - public ChooseAbilityScoresPanel(BasicNavPanel basicNavPanel, String[] statOptions, String[] statDescriptions, int[] selectedStats, String panelTitle) { - - super(); - panelSetup(); - this.statOptions = statOptions; - this.selectedStats = selectedStats; - this.statInfoButtons = new DefaultButton[statOptions.length]; - statLabels = new JLabel[statOptions.length]; - this.basicNavPanel = basicNavPanel; - - Rectangle[] abilityScoreBounds = { - - new Rectangle(520, 5, 200, 400), // ImageInfo panel - new Rectangle(5, 10, 200, 35), // ImageInfo subheader - new Rectangle(5, 45, 200, 355) // ImageInfo text - - }; - - infoPanel = new InfoPanel(statOptions, statDescriptions, abilityScoreBounds, 3); - infoPanel.updateInfo(0); // Default start with 0th element. - - createMasterPanel(panelTitle); - add(basicNavPanel, BorderLayout.SOUTH); - - } - - private void panelSetup() { - - setBackground(lightBrown); - setLayout(new BorderLayout(0, 0)); - - } - - private void createMasterPanel(String panelTitle) { - - JLabel title = new JLabel(panelTitle); - title.setHorizontalAlignment(SwingConstants.CENTER); - title.setFont(headerFont); - title.setForeground(darkestBrown); - add(title, BorderLayout.NORTH); - - JPanel panel = new JPanel(); - panel.setOpaque(false); - panel.setLayout(null); - panel.add(createAbilityScorePanels()); - panel.add(infoPanel); - - add(panel); - - } - - private JPanel createAbilityScorePanels() { - - JPanel mainAbilityPanel = new JPanel(); - mainAbilityPanel.setBounds(5, 5, 505, 405); - mainAbilityPanel.setLayout(new GridLayout(2, 3, 10, 10)); - mainAbilityPanel.setBackground(lightBrown); - - for (int i = 0; i < statOptions.length; i++) { - - mainAbilityPanel.add(createAbilityPanel(statOptions[i], i)); - - } - - return mainAbilityPanel; - - } - - private JPanel createAbilityPanel(String ability, int statIndex) { - JPanel panel = new JPanel(); - panel.setFont(paragraphFont); - panel.setBackground(medBrown); - panel.setBorder(new LineBorder(darkestBrown, 4, true)); - panel.setLayout(new BorderLayout(0, 0)); - - DefaultButton tmpButton = new DefaultButton(ability); - tmpButton.setFont(paragraphFont); - tmpButton.setHorizontalAlignment(SwingConstants.CENTER); - tmpButton.addActionListener(e -> updateButtons(statIndex)); - - statInfoButtons[statIndex] = tmpButton; - - panel.add(statInfoButtons[statIndex], BorderLayout.NORTH); - - panel.add(createScorePanel(statIndex)); - - return panel; - - } - - private JPanel createScorePanel(int statIndex) { - - JPanel subPanel = new JPanel(); - - JLabel scoreLabel = new JLabel("" + selectedStats[statIndex]); - scoreLabel.setFont(paragraphFont); - scoreLabel.setHorizontalAlignment(SwingConstants.CENTER); - - statLabels[statIndex] = scoreLabel; - - - DefaultButton increaseButton = new DefaultButton("+"); - increaseButton.addActionListener(e -> increase(statIndex)); - - DefaultButton decreaseButton = new DefaultButton("-"); - decreaseButton.addActionListener(e -> decrease(statIndex)); - - subPanel.add(decreaseButton); - subPanel.add(scoreLabel); - subPanel.add(increaseButton); - - subPanel.setBackground(lightBrown); - - return subPanel; - - } - - private int statCostCalculator(int statIndex, boolean isDecreasing) { - - int cost = 0; - - int currentStatValue = selectedStats[statIndex]; - - if (isDecreasing) { - - if (currentStatValue <= 8) { - System.out.println("registered invalid decrease"); - - return -1; - - } - - if (currentStatValue < 14) { - - cost = 1; - - } else if (currentStatValue == 14 || currentStatValue == 15) { - - cost = 2; - - } - - } else { - - if (currentStatValue < 13) { - - cost = 1; - - } else if (currentStatValue == 13 || currentStatValue == 14) { - - cost = 2; - - } else { - System.out.println("registered invalid increase"); - return -1; - - } - - } - - return cost; - - } - - private void increase(int statIndex) { - - int value = statCostCalculator(statIndex, false); - - if (value == -1) { - - return; - - } - - if (basicNavPanel.getContinueRequirement() - value >= 0) { - - selectedStats[statIndex]++; - statLabels[statIndex].setText("" + selectedStats[statIndex]); - - basicNavPanel.decreaseContinueRequirement(value); - - } - - } - - private void decrease(int statIndex) { - - int value = statCostCalculator(statIndex, true); - - if (value == -1) { - - return; - - } - - if (basicNavPanel.getContinueRequirement() + value <= 27) { - - selectedStats[statIndex]--; - statLabels[statIndex].setText("" + selectedStats[statIndex]); - - basicNavPanel.increaseContinueRequirement(value); - - } - - } - - private void updateButtons(int newIndex) { - - statInfoButtons[selectedStatIndex].deSelect(); - statInfoButtons[newIndex].select(); - - selectedStatIndex = newIndex; - infoPanel.updateInfo(selectedStatIndex); - - } - -} \ No newline at end of file diff --git a/dndBuilder/src/GUI/Panels/DescriptionPanel.java b/dndBuilder/src/GUI/Panels/DescriptionPanel.java deleted file mode 100644 index 40b71e2..0000000 --- a/dndBuilder/src/GUI/Panels/DescriptionPanel.java +++ /dev/null @@ -1,304 +0,0 @@ -package GUI.Panels; - -import GUI.AppTheme; -import Resources.CustomAssets.BasicNavPanel; -import Resources.CustomAssets.DefaultButton; - -import javax.swing.*; -import javax.swing.border.EmptyBorder; -import javax.swing.border.LineBorder; -import java.awt.*; - -public class DescriptionPanel extends JPanel implements AppTheme { - - private BasicNavPanel nav; - private String[] characteristics; - private String[] characteristicsHolder; - private String[] alignmentOptions; - private String[] alignmentDescriptions; - private String[] backgroundOptions; - private String[] backgroundDescriptions; - private String userBackground; - private DefaultButton[] alignmentButtons; - private DefaultButton[] backgroundButtons; - private int alignmentChoice; - private int backgroundChoice; - - - public DescriptionPanel(BasicNavPanel nav, String[] characteristics, String[] alignmentOptions, String[] alignmentDescriptions, String[] backgroundOptions, String[] backgroundDescriptions, String panelTitle) { - - super(); - this.nav = nav; - this.characteristics = characteristics; - this.alignmentOptions = alignmentOptions; - this.alignmentDescriptions = alignmentDescriptions; - this.backgroundOptions = backgroundOptions; - this.backgroundDescriptions = backgroundDescriptions; - - panelSetup(); - - createPanel(panelTitle, nav); - - } - - public String[] getCharacteristics() { - - return characteristics; - - } - - public int getAlignmentChoice() { - - return alignmentChoice; - - } - - public int getBackgroundChoice() { - - return backgroundChoice; - - } - - private void panelSetup() { - - setBackground(lightBrown); - setLayout(new BorderLayout(0, 0)); - - alignmentChoice = 0; - backgroundChoice = 0; - - alignmentButtons = new DefaultButton[alignmentOptions.length]; - backgroundButtons = new DefaultButton[backgroundOptions.length]; - - characteristicsHolder = new String[]{ - - "Name: ", - "Age: ", - "Height: ", - "Weight: ", - "Eyes: ", - "Hair: " - - }; - - userBackground = ""; - - } - - - private void createPanel(String panelTitle, BasicNavPanel nav) { - - add(createPanelTitle(panelTitle), BorderLayout.NORTH); - - add(createBodyPanel(), BorderLayout.CENTER); - - add(nav, BorderLayout.SOUTH); - - } - - private JLabel createPanelTitle(String panelTitle) { - - JLabel title = new JLabel(panelTitle); - title.setHorizontalAlignment(SwingConstants.CENTER); - title.setFont(headerFont); - title.setForeground(darkestBrown); - title.setBorder(new EmptyBorder(25, 25, 25, 25)); - - return title; - - } - - private JPanel createBodyPanel() { - - GridBagConstraints c = new GridBagConstraints(); - - JPanel bodyPanel = new JPanel(new GridBagLayout()); - bodyPanel.setOpaque(false); - - bodyPanel.add(createNamePanel()); - bodyPanel.add(createFooterPanel()); - - return bodyPanel; - - } - - private JPanel createNamePanel() { - - JPanel panel = new JPanel(); - panel.setBackground(medBrown); - - for (int i = 0; i < characteristicsHolder.length; i++) { - - panel.add(createField(i)); - - } - - return panel; - - } - - private JPanel createField(int index) { - - JPanel panel = new JPanel(); - panel.setOpaque(false); - - JLabel label = new JLabel(characteristicsHolder[index]); - label.setFont(paragraphFont); - label.setOpaque(false); - label.setForeground(darkestBrown); - - JTextField field = new JTextField(10); - field.setFont(paragraphFont); - field.setBackground(lightBrown); - field.setBorder(null); - - panel.add(label); - panel.add(field); - - return panel; - - } - - private JPanel createFooterPanel() { - - JPanel panel = new JPanel(new GridLayout(1, 3)); - panel.setOpaque(false); - panel.add(createSubPanel("Alignment")); - panel.add(createSubPanel("Background")); - panel.add(createTextBoxPanel()); - - return panel; - - } - - private JPanel createSubPanel(String labelName) { - - JPanel panel = new JPanel(new BorderLayout(0, 0)); - panel.setBorder(new EmptyBorder(5, 5, 5, 5)); - panel.setOpaque(false); - - JLabel label = new JLabel(labelName); - label.setForeground(darkestBrown); - label.setFont(subHeaderFont); - label.setHorizontalAlignment(SwingConstants.CENTER); - - JPanel innerPanel; - - if(labelName.equals("Alignment")) { - - innerPanel = new JPanel(new GridLayout(9, 1)); - innerPanel.setOpaque(false); - - createButtons(alignmentOptions, alignmentButtons, labelName); - - for (int i = 0; i < alignmentButtons.length; i++) { - - innerPanel.add(alignmentButtons[i]); - - } - - } else { - - innerPanel = new JPanel(new GridLayout(9, 2)); - innerPanel.setOpaque(false); - - createButtons(backgroundOptions, backgroundButtons, labelName); - - for (int i = 0; i < backgroundButtons.length; i++) { - - innerPanel.add(backgroundButtons[i]); - - } - - } - - panel.add(label); - panel.add(innerPanel); - - return panel; - - } - - private JPanel createTextBoxPanel() { - - JPanel panel = new JPanel(new BorderLayout(0, 0)); - panel.setOpaque(false); - - JLabel label = new JLabel("Enter a Description"); - label.setFont(paragraphFont); - label.setOpaque(false); - label.setForeground(darkestBrown); - - JTextArea textArea = new JTextArea(); - textArea.setForeground(darkestBrown); - textArea.setFont(userTextFont); - textArea.setOpaque(false); - textArea.setBorder(new LineBorder(darkestBrown, 3)); - - panel.add(label); - panel.add(textArea); - - return panel; - - } - - private void updateAlignmentButtons(int newIndex) { - - alignmentButtons[alignmentChoice].deSelect(); - alignmentButtons[newIndex].select(); - - alignmentChoice = newIndex; - - System.out.println("Updating alignment to index " + newIndex + ", " + alignmentOptions[newIndex]); - - } - - private void updateBackgroundButtons(int newIndex) { - - backgroundButtons[backgroundChoice].deSelect(); - backgroundButtons[newIndex].select(); - - backgroundChoice = newIndex; - - System.out.println("Updating background to index " + newIndex + ", " + backgroundOptions[newIndex]); - - - } - - private void createButtons(String[] options, DefaultButton[] buttons, String type) { - - boolean tmp = type.equals("Alignment"); - - for (int i = 0; i < options.length; i++) { - - buttons[i] = createButton(options[i], tmp, i); - - if(i == 0) { - - buttons[i].select(); - - } - - } - - } - - private DefaultButton createButton(String name, boolean isAlignmentElseBackground, int index) { - - DefaultButton button = new DefaultButton(name); - - if (isAlignmentElseBackground) { - - button.addActionListener(e -> updateAlignmentButtons(index)); - - } else { - - button.addActionListener(e -> updateBackgroundButtons(index)); - - } - - return button; - - } - -} diff --git a/dndBuilder/src/GUI/Panels/LoadCharacterPanel.java b/dndBuilder/src/GUI/Panels/LoadCharacterPanel.java deleted file mode 100644 index ce9ab06..0000000 --- a/dndBuilder/src/GUI/Panels/LoadCharacterPanel.java +++ /dev/null @@ -1,4 +0,0 @@ -package GUI.Panels; - -public class LoadCharacterPanel { -} diff --git a/dndBuilder/src/GUI/Panels/MainMenuPanel.java b/dndBuilder/src/GUI/Panels/MainMenuPanel.java deleted file mode 100644 index 3090327..0000000 --- a/dndBuilder/src/GUI/Panels/MainMenuPanel.java +++ /dev/null @@ -1,69 +0,0 @@ -package GUI.Panels; - -import GUI.AppTheme; -import Resources.CustomAssets.DefaultButton; - -import javax.swing.*; -import javax.swing.border.BevelBorder; -import javax.swing.border.EmptyBorder; -import java.awt.*; -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; - -public class MainMenuPanel extends JPanel implements AppTheme { - - private DefaultButton newCharacter; - private DefaultButton randomCharacter; - private DefaultButton loadCharacter; - - public MainMenuPanel(DefaultButton newCharacter, DefaultButton randomCharacter, DefaultButton loadCharacter) { - - super(); - panelSetup(); - this.newCharacter = newCharacter; - this.randomCharacter = randomCharacter; - this.loadCharacter = loadCharacter; - - add(createLabel(), BorderLayout.NORTH); - - add(createControlPanel(), BorderLayout.CENTER); - } - - private void panelSetup() { - - setBackground(lightBrown); - setLayout(new BorderLayout(0, 0)); - - } - - private JLabel createLabel() { - - JLabel label = new JLabel("D&D Character Builder"); - label.setFont(headerFont); - label.setForeground(darkestBrown); - label.setOpaque(false); - label.setHorizontalAlignment(SwingConstants.CENTER); - label.setBorder(new EmptyBorder(5, 5, 5, 5)); - - return label; - - } - - private JPanel createControlPanel() { - JPanel panel = new JPanel(new GridLayout(1, 2, 50, 0)); - panel.setOpaque(false); - panel.setBorder(new EmptyBorder(25, 25, 25, 25)); - - JPanel subPanel = new JPanel(new GridLayout(2, 1, 0, 50)); - subPanel.setOpaque(false); - - subPanel.add(newCharacter); - subPanel.add(randomCharacter); - - panel.add(subPanel); - panel.add(loadCharacter); - - return panel; - } - -} diff --git a/dndBuilder/src/GUI/Panels/PreviewCharacterSheet.java b/dndBuilder/src/GUI/Panels/PreviewCharacterSheet.java deleted file mode 100644 index 18af967..0000000 --- a/dndBuilder/src/GUI/Panels/PreviewCharacterSheet.java +++ /dev/null @@ -1,4 +0,0 @@ -package GUI.Panels; - -public class PreviewCharacterSheet { -} diff --git a/dndBuilder/src/GUI/Panels/step4.java b/dndBuilder/src/GUI/Panels/step4.java deleted file mode 100644 index 06b5c9b..0000000 --- a/dndBuilder/src/GUI/Panels/step4.java +++ /dev/null @@ -1,281 +0,0 @@ -package GUI.Panels; - -import GUI.AppTheme; - -import javax.swing.*; -import javax.swing.border.BevelBorder; -import java.awt.*; -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; - -public class step4 extends JPanel implements AppTheme { - private JTextField nameTxtField; - private JTextField ageTextField; - private JTextField heightTxtField; - private JTextField weightTxtField; - private JTextField skinTxtField; - private JTextField eyesTxtField; - private JTextField hairTxtField; - - /** - * Create the panel. - */ - public step4() { - createEntirePanel(); - - - } - - private void createEntirePanel() { - setBackground(new Color(222, 184, 135)); - setBorder(new BevelBorder(BevelBorder.RAISED, new Color(160, 82, 45), new Color(165, 42, 42), new Color(0, 0, 0), null)); - setLayout(new BorderLayout(0, 0)); - - JLabel lblNewLabel = createLbl(); - add(lblNewLabel, BorderLayout.NORTH); - //Creates back and continue panel - JPanel backContPanel = createBackContinuePanel(); - add(backContPanel, BorderLayout.SOUTH); - - JPanel innerPanel = new JPanel(); - innerPanel.setToolTipText(""); - innerPanel.setOpaque(false); - add(innerPanel, BorderLayout.CENTER); - innerPanel.setLayout(null); - - JPanel nameAndAlignment = new JPanel(); - nameAndAlignment.setBorder(new BevelBorder(BevelBorder.LOWERED, null, null, null, null)); - nameAndAlignment.setBackground(new Color(210, 105, 30)); - nameAndAlignment.setBounds(6, 6, 306, 114); - innerPanel.add(nameAndAlignment); - nameAndAlignment.setLayout(null); - - JLabel nameLbl = new JLabel("Character Name: "); - nameLbl.setBounds(6, 6, 108, 16); - nameAndAlignment.add(nameLbl); - - nameTxtField = new JTextField(); - nameTxtField.setBounds(121, 1, 173, 26); - nameAndAlignment.add(nameTxtField); - nameTxtField.setColumns(10); - - JLabel ageLbl = new JLabel("Age: "); - ageLbl.setBounds(6, 34, 32, 16); - nameAndAlignment.add(ageLbl); - - ageTextField = new JTextField(); - ageTextField.setBounds(61, 34, 64, 21); - nameAndAlignment.add(ageTextField); - ageTextField.setColumns(10); - - JLabel heightLbl = new JLabel("Height: "); - heightLbl.setBounds(6, 62, 55, 16); - nameAndAlignment.add(heightLbl); - - heightTxtField = new JTextField(); - heightTxtField.setBounds(61, 57, 64, 26); - nameAndAlignment.add(heightTxtField); - heightTxtField.setColumns(10); - - JLabel weightLbl = new JLabel("Weight:"); - weightLbl.setBounds(6, 90, 61, 16); - nameAndAlignment.add(weightLbl); - - weightTxtField = new JTextField(); - weightTxtField.setBounds(61, 85, 64, 26); - nameAndAlignment.add(weightTxtField); - weightTxtField.setColumns(10); - - JLabel skinLbl = new JLabel("Skin: "); - skinLbl.setBounds(131, 34, 35, 16); - nameAndAlignment.add(skinLbl); - - skinTxtField = new JTextField(); - skinTxtField.setBounds(165, 29, 130, 26); - nameAndAlignment.add(skinTxtField); - skinTxtField.setColumns(10); - - JLabel eyesLbl = new JLabel("Eyes: "); - eyesLbl.setBounds(130, 62, 42, 16); - nameAndAlignment.add(eyesLbl); - - eyesTxtField = new JTextField(); - eyesTxtField.setBounds(164, 57, 130, 26); - nameAndAlignment.add(eyesTxtField); - eyesTxtField.setColumns(10); - - JLabel hairLbl = new JLabel("Hair: "); - hairLbl.setBounds(127, 90, 39, 16); - nameAndAlignment.add(hairLbl); - - hairTxtField = new JTextField(); - hairTxtField.setBounds(164, 85, 130, 26); - nameAndAlignment.add(hairTxtField); - hairTxtField.setColumns(10); - - JPanel alignmentPanel = new JPanel(); - alignmentPanel.setBorder(new BevelBorder(BevelBorder.LOWERED, null, null, null, null)); - alignmentPanel.setBackground(new Color(205, 133, 63)); - alignmentPanel.setBounds(324, 6, 396, 114); - innerPanel.add(alignmentPanel); - alignmentPanel.setLayout(new BorderLayout(0, 0)); - - JLabel alignmentLbl = new JLabel("Alignment"); - alignmentLbl.setFont(new Font("Lucida Grande", Font.PLAIN, 19)); - alignmentLbl.setHorizontalAlignment(SwingConstants.CENTER); - alignmentPanel.add(alignmentLbl, BorderLayout.NORTH); - - JPanel alignmentInnerPanel = new JPanel(); - alignmentInnerPanel.setOpaque(false); - alignmentPanel.add(alignmentInnerPanel, BorderLayout.CENTER); - alignmentInnerPanel.setLayout(new GridLayout(3, 3, 0, 0)); - - JButton btnLawfulGood = new JButton("Lawful Good"); - alignmentInnerPanel.add(btnLawfulGood); - - JButton btnNuetralGood = new JButton("Neutral Good"); - alignmentInnerPanel.add(btnNuetralGood); - - JButton btnChaoticGood = new JButton("Chaotic Good"); - alignmentInnerPanel.add(btnChaoticGood); - - JButton btnLawfulNeutral = new JButton("Lawful Neutral"); - alignmentInnerPanel.add(btnLawfulNeutral); - - JButton btnTrueNeutral = new JButton("True Neutral"); - alignmentInnerPanel.add(btnTrueNeutral); - - JButton btnChaoticNeutral = new JButton("Chaotic Neutral"); - alignmentInnerPanel.add(btnChaoticNeutral); - - JButton btnLawfulEvil = new JButton("Lawful Evil"); - alignmentInnerPanel.add(btnLawfulEvil); - - JButton btnNeutralEvil = new JButton("Neutral Evil"); - alignmentInnerPanel.add(btnNeutralEvil); - - JButton btnChaoticEvil = new JButton("Chaotic Evil"); - alignmentInnerPanel.add(btnChaoticEvil); - - JPanel backgroundPanel = new JPanel(); - backgroundPanel.setBorder(new BevelBorder(BevelBorder.LOWERED, null, null, null, null)); - backgroundPanel.setBackground(new Color(210, 105, 30)); - backgroundPanel.setBounds(6, 132, 306, 264); - innerPanel.add(backgroundPanel); - backgroundPanel.setLayout(new BorderLayout(0, 0)); - - JLabel backgroundLbl = new JLabel("Background"); - backgroundLbl.setFont(new Font("Dialog", Font.PLAIN, 20)); - backgroundLbl.setHorizontalAlignment(SwingConstants.CENTER); - backgroundPanel.add(backgroundLbl, BorderLayout.NORTH); - - JPanel backgroundInnerPanel = new JPanel(); - backgroundInnerPanel.setOpaque(false); - backgroundPanel.add(backgroundInnerPanel, BorderLayout.CENTER); - backgroundInnerPanel.setLayout(new GridLayout(9, 2, 0, 0)); - - JButton btnAcolyte = new JButton("Acolyte"); - backgroundInnerPanel.add(btnAcolyte); - - JButton btnCharlatan = new JButton("Charlatan"); - backgroundInnerPanel.add(btnCharlatan); - - JButton btnCriminal = new JButton("Criminal"); - backgroundInnerPanel.add(btnCriminal); - - JButton btnEntertainer = new JButton("Entertainer"); - backgroundInnerPanel.add(btnEntertainer); - - JButton btnFolkHero = new JButton("Folk Hero"); - backgroundInnerPanel.add(btnFolkHero); - - JButton btnGladiator = new JButton("Gladiator"); - backgroundInnerPanel.add(btnGladiator); - - JButton btnGuildArtisan = new JButton("Guild Artisan"); - backgroundInnerPanel.add(btnGuildArtisan); - - JButton btnGuildMerchant = new JButton("Guild Merchant"); - backgroundInnerPanel.add(btnGuildMerchant); - - JButton btnHermit = new JButton("Hermit"); - backgroundInnerPanel.add(btnHermit); - - JButton btnKnight = new JButton("Knight"); - backgroundInnerPanel.add(btnKnight); - - JButton btnNoble = new JButton("Noble"); - backgroundInnerPanel.add(btnNoble); - - JButton btnOutlander = new JButton("Outlander"); - backgroundInnerPanel.add(btnOutlander); - - JButton btnPirate = new JButton("Pirate"); - backgroundInnerPanel.add(btnPirate); - - JButton btnSage = new JButton("Sage"); - backgroundInnerPanel.add(btnSage); - - JButton btnSailor = new JButton("Sailor"); - backgroundInnerPanel.add(btnSailor); - - JButton btnSoldier = new JButton("Soldier"); - backgroundInnerPanel.add(btnSoldier); - - JButton btnSpy = new JButton("Spy"); - backgroundInnerPanel.add(btnSpy); - - JButton btnUrchin = new JButton("Urchin"); - backgroundInnerPanel.add(btnUrchin); - - JPanel panel = new JPanel(); - panel.setBackground(new Color(205, 133, 63)); - panel.setBorder(new BevelBorder(BevelBorder.LOWERED, null, null, null, null)); - panel.setBounds(324, 132, 396, 264); - panel.setLayout(new BorderLayout(0, 0)); - - JLabel lblDescription = new JLabel("Description"); - lblDescription.setFont(new Font("Lucida Grande", Font.PLAIN, 20)); - lblDescription.setHorizontalAlignment(SwingConstants.CENTER); - - JTextArea textArea = new JTextArea(); - textArea.setBackground(new Color(238, 232, 170)); - - panel.add(lblDescription, BorderLayout.NORTH); - panel.add(textArea, BorderLayout.CENTER); - - innerPanel.add(panel); - - } - - private JPanel createBackContinuePanel() { - JPanel backContPanel = new JPanel(); - backContPanel.setBackground(new Color(205, 133, 63)); - - - JButton backBtn = new JButton("<--- Back "); - backBtn.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent e) { - } - }); - backContPanel.add(backBtn); - - JButton continueBtn = new JButton("Continue --->"); - continueBtn.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent e) { - } - }); - backContPanel.add(continueBtn); - return backContPanel; - } - - /** - * @return - */ - private JLabel createLbl() { - JLabel titleLbl = new JLabel("Step 4: Description"); - titleLbl.setHorizontalAlignment(SwingConstants.CENTER); - titleLbl.setFont(new Font("Bodoni 72 Oldstyle", Font.PLAIN, 33)); - return titleLbl; - } -} diff --git a/dndBuilder/src/Resources/CustomAssets/BasicNavPanel.java b/dndBuilder/src/Resources/CustomAssets/BasicNavPanel.java deleted file mode 100644 index 0f8ead2..0000000 --- a/dndBuilder/src/Resources/CustomAssets/BasicNavPanel.java +++ /dev/null @@ -1,78 +0,0 @@ -package Resources.CustomAssets; - -import GUI.AppTheme; - -import javax.swing.*; -import javax.swing.border.EmptyBorder; -import javax.swing.border.LineBorder; -import java.awt.*; - -public class BasicNavPanel extends JPanel implements AppTheme { - - private DefaultButton backButton; - private DefaultButton continueButton; - private int continueRequirement; - - public BasicNavPanel(DefaultButton backButton, DefaultButton continueButton, int continueRequirement) { - - super(new GridLayout(1, 2, 30, 0)); - this.backButton = backButton; - this.continueButton = continueButton; - - this.continueRequirement = continueRequirement; - createNavPanel(); - - } - - public int getContinueRequirement() { - - return continueRequirement; - - } - - public void decreaseContinueRequirement(int value) { - - continueRequirement -= value; - updateContinueRequirement(); - - } - - public void increaseContinueRequirement(int value) { - - continueRequirement += value; - updateContinueRequirement(); - - } - - private void updateContinueRequirement() { - - removeAll(); - - createNavPanel(); - - } - - private void createNavPanel() { - - setBackground(darkestBrown); - setBorder(new EmptyBorder(15, 150, 15, 150)); - add(backButton); - - if (continueRequirement == 0) { - - add(continueButton); - - } else { - - DefaultButton requiredStepsNeeds = new DefaultButton(Integer.toString(continueRequirement) + " Points Left"); - requiredStepsNeeds.select(); - requiredStepsNeeds.setBorder(new LineBorder(lightAccent, 1)); - requiredStepsNeeds.setBorderPainted(true); - requiredStepsNeeds.setEnabled(false); - add(requiredStepsNeeds); - - } - - } - -} diff --git a/dndBuilder/src/Resources/CustomAssets/CustomTheme.java b/dndBuilder/src/Resources/CustomAssets/CustomTheme.java deleted file mode 100644 index 6e060d1..0000000 --- a/dndBuilder/src/Resources/CustomAssets/CustomTheme.java +++ /dev/null @@ -1,14 +0,0 @@ -package Resources.CustomAssets; - -import java.awt.*; - -public interface CustomTheme { - - public Color background = null; - public Color foreground = null; - - Color getBackground(); - - Color getForeground(); - -} diff --git a/dndBuilder/src/Resources/CustomAssets/DefaultButton.java b/dndBuilder/src/Resources/CustomAssets/DefaultButton.java deleted file mode 100644 index 56addc9..0000000 --- a/dndBuilder/src/Resources/CustomAssets/DefaultButton.java +++ /dev/null @@ -1,95 +0,0 @@ -package Resources.CustomAssets; - -import GUI.AppTheme; - -import javax.swing.*; -import javax.swing.border.EmptyBorder; -import java.awt.event.MouseEvent; -import java.awt.event.MouseListener; - -public class DefaultButton extends JButton implements AppTheme { - - private boolean selected; - - public DefaultButton(String buttonLabel) { - - super(buttonLabel); - applyDefaultButtonStyle(); - applyCommon(); - - } - - public void deSelect() { - - selected = false; - applyDefaultButtonStyle(); - - } - - public void select() { - - selected = true; - applyFocusedButtonStyle(); - - } - - private void applyDefaultButtonStyle() { - - setBackground(medBrown); - setForeground(darkestBrown); - - } - - private void applyFocusedButtonStyle() { - - setBackground(darkestBrown); - setForeground(lightAccent); - - } - - private void applyCommon() { - - addMouseListener( - new MouseListener() { - @Override - public void mouseClicked(MouseEvent e) { - } - - @Override - public void mousePressed(MouseEvent e) { - } - - @Override - public void mouseReleased(MouseEvent e) { - } - - @Override - public void mouseEntered(MouseEvent e) { - applyFocusedButtonStyle(); - } - - @Override - public void mouseExited(MouseEvent e) { - - if (!selected) { - - applyDefaultButtonStyle(); - - } - - } - } - - ); - - setFocusPainted(false); - setFont(buttonFont); - setBorder(new EmptyBorder(3, 3, 3, 3)); - - repaint(); - revalidate(); - - } - - -} diff --git a/dndBuilder/src/Resources/CustomAssets/ImageInfoPanel.java b/dndBuilder/src/Resources/CustomAssets/ImageInfoPanel.java deleted file mode 100644 index 5957180..0000000 --- a/dndBuilder/src/Resources/CustomAssets/ImageInfoPanel.java +++ /dev/null @@ -1,142 +0,0 @@ -package Resources.CustomAssets; - -import GUI.AppTheme; - -import javax.imageio.ImageIO; -import javax.swing.*; -import java.awt.*; -import java.awt.image.BufferedImage; -import java.io.File; -import java.util.Objects; -import java.util.Random; - -public class ImageInfoPanel extends InfoPanel implements AppTheme { - - private JLabel[][] portraits; - private int lastIndex; - - public ImageInfoPanel(String[] categoryHolder, String[] holderDescriptions, Rectangle[] bounds, int panelIndex) { - - super(categoryHolder, holderDescriptions, bounds, panelIndex); - - createPortraits(); - - } - - @Override - public void updateInfo(int holderIndex) { - - super.updateInfo(holderIndex, portraits[holderIndex][getNextPortrait(holderIndex)]); - - } - - private int getNextPortrait(int holderIndex) { - - Random ran = new Random(); - int bound = portraits[holderIndex].length; - int newIndex = ran.nextInt(bound); - -/* while(newIndex == lastIndex) { - - newIndex = ran.nextInt(bound); - - }*/ - - lastIndex = newIndex; - - return newIndex; - - } - - private void createPortraits() { - - String category = ""; - - if (panelIndex == 1) { - - category = "Races"; - - } else if (panelIndex == 2) { - - category = "Classes"; - - } - - portraits = new JLabel[categoryHolder.length][]; - - for (int i = 0; i < categoryHolder.length; i++) { - - File imagesDir; - - if (OS.startsWith("Windows")) { - - imagesDir = new File("dndBuilder\\src\\Resources\\Img\\" + category + "\\" + categoryHolder[i].toLowerCase() + "\\"); - - } else if (OS.startsWith("Mac")) { - - imagesDir = new File("dndBuilder/src/Resources/Img/" + category + "/" + categoryHolder[i].toLowerCase() + "/"); - - } else if (OS.startsWith("Linux")) { - - imagesDir = new File("dndBuilder/src/Resources/Img/" + category + "/" + categoryHolder[i].toLowerCase() + "/"); - - } else { - - System.out.println("Unable to detect operating system."); - return; - - } - - File[] dir = imagesDir.listFiles(); - portraits[i] = new JLabel[dir.length]; - int index = 0; - - for (File file : dir) { - portraits[i][index] = image(file); - portraits[i][index].setOpaque(true); - portraits[i][index].setBackground(lightBrown); - portraits[i][index].setBounds(bounds[3]); - - index++; - } - - - } - - - } - - private JLabel image(File file) { - - BufferedImage img; - Image finalImg; - JLabel picture; - - try { - - img = ImageIO.read(file); - finalImg = img.getScaledInstance(250, 375, Image.SCALE_SMOOTH); - - } catch (Exception e) { - - System.out.println("Error reading file."); - img = null; - finalImg = null; - - } - - if (Objects.isNull(finalImg)) { - - picture = new JLabel("ERROR: Image not found."); - - } else { - - picture = new JLabel(new ImageIcon(finalImg)); - - } - - return picture; - - } - -} diff --git a/dndBuilder/src/Resources/CustomAssets/InfoPanel.java b/dndBuilder/src/Resources/CustomAssets/InfoPanel.java deleted file mode 100644 index 0a8b7be..0000000 --- a/dndBuilder/src/Resources/CustomAssets/InfoPanel.java +++ /dev/null @@ -1,95 +0,0 @@ -package Resources.CustomAssets; - -import GUI.AppTheme; - -import javax.swing.*; -import javax.swing.border.EmptyBorder; -import java.awt.*; - -public class InfoPanel extends JPanel implements AppTheme { - - protected JTextArea[] descriptions; - protected Rectangle[] bounds; - protected String[] holderDescriptions; - protected String[] categoryHolder; - protected int panelIndex; - - public InfoPanel(String[] categoryHolder, String[] holderDescriptions, Rectangle[] bounds, int panelIndex) { - - super(); - this.categoryHolder = categoryHolder; - this.holderDescriptions = holderDescriptions; - this.bounds = bounds; - this.panelIndex = panelIndex; - - panelSetup(); - - createDescriptions(); - - } - - public void updateInfo(int holderIndex) { - removeAll(); - panelSetup(); - - add(descriptions[holderIndex]); - - repaint(); - revalidate(); - - } - - protected void updateInfo(int holderIndex, JLabel portrait) { - removeAll(); - panelSetup(); - - add(descriptions[holderIndex]); - add(portrait); - - repaint(); - revalidate(); - - } - - private void panelSetup() { - - setOpaque(false); - setBounds(bounds[0]); - setLayout(null); - - JLabel subHeader = new JLabel("Description"); - subHeader.setFont(subHeaderFont); - subHeader.setHorizontalAlignment(SwingConstants.LEFT); - subHeader.setBounds(bounds[1]); - subHeader.setForeground(darkestBrown); - - add(subHeader); - - } - - private void createDescriptions() { - - descriptions = new JTextArea[holderDescriptions.length]; - - for (int i = 0; i < holderDescriptions.length; i++) { - - JTextArea tmpDesc = new JTextArea(); - tmpDesc.setText(holderDescriptions[i]); - tmpDesc.setWrapStyleWord(true); - tmpDesc.setLineWrap(true); - tmpDesc.setOpaque(true); - tmpDesc.setEditable(false); - tmpDesc.setFocusable(false); - tmpDesc.setFont(paragraphFont); - tmpDesc.setBounds(bounds[2]); - tmpDesc.setBorder(new EmptyBorder(5, 5, 5, 5)); - tmpDesc.setBackground(medBrown); - tmpDesc.setForeground(darkestBrown); - - descriptions[i] = tmpDesc; - - } - - } - -} diff --git a/dndBuilder/src/Tests/dndTestClient.java b/dndBuilder/src/Tests/dndTestClient.java deleted file mode 100644 index ae35447..0000000 --- a/dndBuilder/src/Tests/dndTestClient.java +++ /dev/null @@ -1,26 +0,0 @@ -package Tests; - -public class dndTestClient { - - - // Antiquated test, need to refactor for new project setup. -/* public static void main(String[] args) { - // TODO Auto-generated method stub - - CharacterStats stats = new CharacterStats(10, 10, 10, 10, 10, 10); - - Dragonborn chosenRace = new Dragonborn(); - - for(int i = 0; i < chosenRace.getASI().length; i++) { - - stats.increaseStat(chosenRace.getASI()[i]); - - } - - Character characterInfo = new Character("Generic", 50, 4, 6, 150, "brown", "black", chosenRace, stats); - - System.out.println(characterInfo.toString()); - - }*/ - -} diff --git a/dndBuilder/src/.DS_Store b/src/.DS_Store similarity index 100% rename from dndBuilder/src/.DS_Store rename to src/.DS_Store diff --git a/dndBuilder/src/DieRoller/DiceRoller.java b/src/DieRoller/DiceRoller.java similarity index 100% rename from dndBuilder/src/DieRoller/DiceRoller.java rename to src/DieRoller/DiceRoller.java diff --git a/dndBuilder/src/Resources/CustomAssets/RoundedBorder.java b/src/deprecated/RoundedBorder.java similarity index 94% rename from dndBuilder/src/Resources/CustomAssets/RoundedBorder.java rename to src/deprecated/RoundedBorder.java index 10b49b2..9a09f8b 100644 --- a/dndBuilder/src/Resources/CustomAssets/RoundedBorder.java +++ b/src/deprecated/RoundedBorder.java @@ -1,5 +1,3 @@ -package Resources.CustomAssets; - import javax.swing.border.Border; import java.awt.*; diff --git a/src/target/App.class b/src/target/App.class new file mode 100644 index 0000000000000000000000000000000000000000..b1059fe79d8f39b5300379642f1140d6db5a4b3d GIT binary patch literal 400 zcmYLFT}whi5Iv(;udcT=GfT^$w`)cIfJ%s<2(%#Ug7&o9A}hMe{pf%7qL9!J=to7f zy|@cAvuDnnnc1J;uWta?I2K4D?ZWYpL6%UO$Pd|?N;7Uf4JT?86S7y@=(tTt`^~^b zj!?MMQ`MD5j#Vh&+WG=P+`m4|HsF?rZ4?Pb9X+c!35_=6BvRqO&Okt5$M!4}9DmRZ zEKu>VX8{qZIM9(EPL+#&F1T4Nn07mVSFG33Mm;98p$cClGdMAm+7PP#TW2$UFAllk zWiw#8-aH9M$_`D)vDSs9;RIFQ-JTT4ZqN3BUk&!eK6APPeR4pkv9)O%=TXNYdrNI2 u%@?Sz;r3U^ch(U7vn9M0O5Jm3iQP?o84fcu$nl3&*w%Pq!VzOBH2wew_C?JA literal 0 HcmV?d00001 diff --git a/src/target/AppTheme.class b/src/target/AppTheme.class new file mode 100644 index 0000000000000000000000000000000000000000..04a124ae7ccbb29c59e7c51ae5f02ed14d76b942 GIT binary patch literal 1235 zcmZux*;W%l5WT~eN$8L;Ad4%C3#dSV2qL&7F%bks38J{3Nz#UqWF}`aar*;b{S)Ou zj-KNO_z`}J$Esp+eVIGeb-TLj)}8tGW5KIFd zFYK50nEfgk%Xk&fH_%qnMX#g{oE%z`T*Y?FWBI^$-16-3&eA@8HjD_`Lr@A)bQmyG zwc6^2uG04Qic{VQQpKWn0|W8DH=2mcozm&-Oq#1$3SC?xBKy+5_sTVKKsd?N)buoS zdKLQQn5r)AG7d81LSiC0KEsT|3P+d`F4_L(F69_g#&d~mBE^*B3MZJNn4;@}u)?Iu zNrh9KXiYDrGK)+-qc9{Zg^FF=G;x+IP0UPX(@9RBR~X@Ryy&^l9lvS^j_0N;4Q*nK znW>4%Z1N&A#}y`+seJuH7n!!AOCcl;MECX2d2V20ibTxYZr-lEbRw9XnOu$Nd+xGAR=8bRQ>yli5L1n}yku3gm;+{SVUcNFeo zh1B}ZRd4Enu98>EI=JI|HSGs)44nQ?hr7o6-HUvuRfT(4Gtji0H(>qi*AO23ao}=+ z#}KubnEA6s%x z=x6)WTR(ePkbEjgZWJWT36h@#$vA>!3qhKjAdN+kh9F3i3zEWu)Gi@)fOR}1d_>WA zw9*rJZyDQY-a^=l33giDf<0Eh;34a%;J`-=ZsD{wEYUe@R50-clk3)nmiWjgOmAU! zCv1)nN_cfI?3OUS7se#a{u$0&i`%%hh5QG)m4V0fyd-_L(!JXdr(aJW!Wck1eP2K^aU=zJ~ORRS|NEMz?g(f`x2^?bl1ONa4 literal 0 HcmV?d00001 diff --git a/src/target/Background.class b/src/target/Background.class new file mode 100644 index 0000000000000000000000000000000000000000..bdf2fa72c12c754abcb80bc2fd515bc4f5912ff0 GIT binary patch literal 8346 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 A-2eap literal 0 HcmV?d00001 diff --git a/src/target/CharacterStats.class b/src/target/CharacterStats.class new file mode 100644 index 0000000000000000000000000000000000000000..ef67a831b2a14ae4c25ff399beda3168ea9664d9 GIT binary patch literal 1822 zcmaJ>TT|Oc6#mvX*{ZmdOQ-<{rzONTAvB~(+X%?T!HHWz+K7fKv=74UfPySB*20vT zKK4iSxi5X`Lp#&rnRuEX(D(kC&Lr(wNq|W_#lvd%=sVxJd}sC7>lZHpEa6)f2_zMy zG^CMX7<_IY+VigM?aV*kdd?eyA+zXsj#y?$mdZ~RWEs+?utkuAigy%f8v4-B&|lrP zTXsY6R``}sfkZK6H;vGuD;T7cDO%jy5xXh|FeIZ6Go(s&Nj=Jtd%(XV3P&8N7{QQ& z_ZYOQ?*+mU2g30^6=TvoLFT$Axa&GQ+-q0DbGW8p zUc-mD&M@%Cd*Ua5(`oLze9dlhhLLk5)CkAhAr=KUG<<}cQNS>lu-Ww?lIUX%pWsu5 zv8KJpsSyoZY&c>!Y>Dm3{$43{WfqgxyR$tFq+?ORl7?m6Ij3|4pw=})eukMIlsy

v$JY*;TfDVyZ@Fa2mFnSN`6)xKL<10st{bQN>PEM$y3wtsZbTvyCe}`u zL?ef`>ulSC-`jFr8j-kFa(bS{&5K4(EtOA(jzOi@@dVP)oJvke@)7@!p*8A*Y!@(1YYh)+y-TM8J*72W`5n1mY10j@(5Z$; zv`Xj{5lTu$LMIm91m7Z99m6qrCI+h!_!u9Y=^?+Vz#=KJOz6*WJ@)ab5~Jw(&!P{rvCWvof7TDE9^GC{QJ;73%jxnvNCR rz~}S>$)9+Iv;v*|L-r($&}$WI^prF8nEt=Q2Ax#eeT`@M2KoO0ATXHy literal 0 HcmV?d00001 diff --git a/src/target/Charisma.class b/src/target/Charisma.class new file mode 100644 index 0000000000000000000000000000000000000000..ac85426b7db41b5ff6623768fe185dc592eb374e GIT binary patch literal 1286 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 literal 0 HcmV?d00001 diff --git a/src/target/Constitution.class b/src/target/Constitution.class new file mode 100644 index 0000000000000000000000000000000000000000..d460819fec5b578252454e55c84ad2a87a82b2de GIT binary patch literal 1285 zcmaJ>T~8B16g|_Hwv>g^0wPv)QIvK?D&Qwo6RjaM0evXJ7+;)j2Rg9qHoMar5`Tz4 z!Us(R6CV5l{wU+!?g9%mX0!9vbI;y$=HCAKd;A-~3#?=iLp+6qh5;lQ2I`6{k0JS7 z+ETq_h!;y+gGggAg^Y$FXbf7_u{|YKM@h$~EpJFms)M@exPpPzG6Wydki{rN*5sC1 z=Ur*J4a$UKU zUL{Y4+|;0BhGBA_?+KD=a`j%SR!=auePfEnTJ3UdAG$#47EM*BNxo#)r7hle_8Y?8 z4NLY8voul<(dd6K3e8=FP7vsBALtRrFG33hrN#f28ArHwj2pmN+z4TS66rLMqnR3xvy(BEQaT^8d$x hMP#r{uoA6fL~)PiG=5$L zp{kaiXPz`~H1qwl`vP!>%McD+A6|?ToDzCj_hwYHdXbGJM7bzlORc(gO-SY&@h(#F zVbV<1O5fPiAVz5KqGzS$Ug@L9;y-OI+A>|{8(A1azm(?Tz;85}9y{(uvwtf>a9h+> zTbX-;JDENayiBb**im+1Ms$ tbUi|hKEQZp5dj8BKo~N=Vze)$Er`eemT!m?0`AGKO*t*Aha*u)1Ds!1d7|MtIm^VW%_nU8qhr-uH-3nx&pEIOu^*t9Q zEI258STykBTr!3wKAD6kUF9dS7)`4W^hqf4M7!+a3a&EbVi8heF=AjJOui)#*G;l1 zc`l_Y6|FU;Xp_WNB#lMY2OtMI|rN1K?+}hJ{M`{t7aKVNhsC0wmVQso+t~O9*7yPED_IP;=*-d$ zY|^=k+cW$!c?_PNhdm*{+QqP^1iN!FY>Qy)XRs<+rf9Bl3ichvf3;ofe*p(C33K<1 z(V8(ThH;9@7ZPZ>*9|06EpZC%0s~*I9qU^@+;zOo{L6)U z6#1S&`>f+R(G!8eY)J>?U5oB=6fkNgM~)738pud=K?-y)sxMaEjSkR5R;}jlwHV9M zo~r~>*#z7p(W{YNab&@-R(-FNq^BkNF(A+pDpyq^WebQ;I@_ScSq(_2i+-gZDm%#+ zQ)}?B#5tTNxJp;x@3M}*jB8$LTfw#pqnKM0U6HtYKveVtl@Mvjb%`4q(&ajvThV-_qP)mJPN27?D_5s7 z$YMfY#Z7_!Y^lZDZ1io3JSJI-W!o!0>n=HAq&yV}j2}6%+F_1-OF)xgTH+4wGB@ju zJNL$NytudN?5Cu}`w|cEP$07r3!vzG5#tY=rwwuM9!tz%R=|k4bQDh=D@1oK4$G|@ zpmN5J3Twj;Y!&2}sL=G#b>(kd6H$9`6S9HNGxJWpi^H?97(Dq#eqtjWQn&~ z<8z4@S|3KBYPvdoJuf9*X_eCh7<{|G(<1Pi-+rX|)jjJ*Cwlnpqvs7R z3EqtPfsC2@i9U@##P%RX>=|MQi5(*1?FqPaf;)2@H$vPfabwKDiErl1H}mzHKQPq5 z2$zcuTs{uI3_>ASEcTX} zYG8^q_ZoOa``pKNKKppuzyjSxzRQP48zTepWPFR$c!yz>IkE3Cfpt#X2X^Zn{cW_a QaZNK@mR|NY-f;u`2PiiaT>t<8 literal 0 HcmV?d00001 diff --git a/src/target/DescriptionPanel.class b/src/target/DescriptionPanel.class new file mode 100644 index 0000000000000000000000000000000000000000..0102ff539b6bfeeed0ca541b8519cdb454286c00 GIT binary patch literal 6493 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 DYzKD) literal 0 HcmV?d00001 diff --git a/src/target/Dexterity.class b/src/target/Dexterity.class new file mode 100644 index 0000000000000000000000000000000000000000..a6adc9bbb7449b7b4dc2a8a4382756a14f22f37d GIT binary patch literal 1250 zcmaJ>ZBNrs7(I6z>lkHY14NwQP?W7I6Y!O(iH;DPfPNUk7{7SeU7=9grM;je{t$nJ zA2bn6_}~xlM;V{H7AUZoruS{S7n z?QX1X`rapoRK={Cims?*SaFTS<5#`5{m~Y_;uzI&31bWc8$uqRce61w7-xXOlyqFh z1VfH6OCqp*yCZGSCDuxHWsC3en#0|VT2uOzLA^+VujwdbieYSrZ;OWKT3o)hG@@v5$7$M9)H7IMsJ#d)tK79^vCPU}%EyHe?qXL?2ULru>k7Z&@E{O@hKCF{ zFBs8FpN7W_lmCZOM}%fziV815rIetD+M&CmQl?o0^$)Joc!PG2knG}yjbC6!=>VEx zlnya?fWi;@nQn>3B2qM_X`~LLr%05PHpU{737Vdrd#^1XAI#Z66AVZAo3$k(Wri zV|}W$Z53B8sMn*w@!A=Tk*NBej_+kKA&{Y9%lDj?l(?#63fBa((offF+o8bNyPcuM zfyjnrXLMYbY&!hlxNa!RD(bj_Icm1;sOnmwJY6cEJKkU1(6E4;Di(Fz!jeFKD1Uk= z$MbckbL`r?R>u|?zaVnXLrF)u?;#2-CkmylWgU0qQtmkL-#abG_V^1`tOz9ESS_mM zs=gOSmKPmZZr4_LD@8ff2vq$;0{I=svv<3lrXB2CO_wVw4Gj+SO11|D)(5@Ma%;bz zU0|YA9?>keQ`Xb(l7PwY(A*{>aGDnEP* zE3$={XZZ;T+(jA%`CRzD%E}VB$2s4|*?f&_Y+Qejm)MWI_J$^cm;nN))UgVq*k z#zc<9LoA&pnPZemGUf?pPcZ-GOhMWJOJL1-#8FzBVU(+iQTrSNr?~NW1XzrNMS|;i z!ci*DGD^ji`3<+@$rrixbR;?*N0*5{8;MTF(KVtQBT+Mst`ptl|Hr^xgt(ZHlu>4JYsuQ7AIcY+ zI82QC0sK(L|LqnYn!WJF?&&@Ech32rb8q(N?~mUAo?=}`0*VIJKoTi|+>w1^FV$_Y zwzR!}^KJkVnYH~4fM&=RKxzX zUUM|`UrKC+P1mcXF+ig1HyXZ|#*jc-<~nhM_cFyb10yI1WTcdqU2_6~fp?qd>N-hQ zB|BzdT(YU)gIli$vZF}@*D=MMH76|B?LbBsOBcc;=c+Nlp+mb({{r^%9=N@AYIwxrhn*GUB}}u(6A_=zOk#!mM!~U z5ZYe2Yu8(j!V4*I5qkv6{sDo$P1kd_T8(|Dxnu9w>Cq^t6U^J#=rm|`W}o5FPE=iB zs95STERIw56HQ6L;P>YFbaULkzNnM~rEA?{6_x2^vC!|dETCI{t66nkxl)uKy@EwK zJxsIn1O#p)g}i(u{9a;b3EbhH&*E&qOdn?!o$>x6%R7%O2S=-u<*Vd+m%F$87PJfI zcL+0AXhSpm#aBL==x7|BC;Fr(IvhuriLUlU%{aP3bdCQT9j&t*r)=Ly c{?sc2PYG|!~g&Q literal 0 HcmV?d00001 diff --git a/src/target/Elf.class b/src/target/Elf.class new file mode 100644 index 0000000000000000000000000000000000000000..db4ff4d037af465787b306c4c8c4631c54d2841a GIT binary patch literal 1182 zcma)+ZBNrs6vzK}?bfY!GRA|*!vsOx3WE5A3Zi7egoJ>xgt+*sj53Q|N7jz`p?sl< z!^Ef`zz@SmF#d11@X+jqFM1!&`Q3B==iHnA`TOHHfEQTTk$|E>HIPI~Aa`V+*o&U+ z*A{p7kDO{KkXm(pH(V1?ilw~_(#UAg4P1jk(}s5_kPMC;=RiPgO80dGebSez+n?5J zj)wj#VXd&~`n5C$NR%7(dc#j+i0cjS#0@^k05=Sb;HE%E%4pd&ClDBTzjdLk6JkZO zV+O`0n+iU3C#Z(QzBo8fFaK!K^^vMfmQaEYDkR z{n&H1?Ybi{cqPas4MhW`NJH4P-7t`{<_yeBQ}(#oICQJ7X%MCvW zZ9m+zy_Tc!G720LX9UWP0|I?puJ3HO>ibS}*WUMN(I}{Mm^ZQ6DbVV4K10`TlwDw` zSnAO%wo}#HurtrQk6~scD?Ew5k;HIYy4q^W>Zy>yk>Y5C;o% zE#oOi8FHcvCe3fS8_zyN=d+&ZXdIm*`n)GP97mUkuJlCBIJ!)9m4A$m))}@_mTx3~ b>J>%Zsi^8s{DfrJ{=2bE24;2!79Ivx1~x_pfvm)`ME#t^ymWp4q^#8B5=I6#o6Nk- z5<5l)W)00Sb_Nbc22R(Cg8ZVA02en#1{UZ1lvG9rexJ;|RKL>Pq|~C2#H1Xc2v=}^ zX;E^jTPBFZ2iKtovVcL6fgNZs2rvR6&}JaX3FIk)`3wxKTH6^IH-e?PfF#I~3=GT+ NEMSG)KsFNt4*-O_BJ}_O literal 0 HcmV?d00001 diff --git a/src/target/Fighter.class b/src/target/Fighter.class new file mode 100644 index 0000000000000000000000000000000000000000..5e865993fd4770fbce08327d377c32cea257a384 GIT binary patch literal 1138 zcma))O>Yx15QfM3TG*yZfD}rhK+9Kx5LGW+0tl2gYEeWZB@~ICoW$(9b=JY_gg?ar zPDmX10sJV$>&*gE0BJ8XJ2Q_xuV?oAkFVc|=qcUvDMxva3S}x%iBav8&-sqxQLu9~ zJQX9$sPsfe(mrF9Z#0iRI>*TC$RM=Bc;qu$Z7Uwf12LH@ZUv*jQE)>p( z((XxA%8iq5-*Owb4x7h}3T-_`w%V1Ecr}|0g&FXnLZ%W3yC>q2ky9&m#HikAcK_(= zTO*^OwcvV22S&tk!mTx$C;tL#xG+)K5!}vzGdhpdL8{Al-#u=-^WEf;&|XebQywpp zE_`7o+MwM#JQ?8|!KXS}#4CsgTB}7=#RR2tPwAgYrO>P%TW%~w@4uhPX*<+%+qzjrx3!n+BoLA8?1?*E2H`9q9&FPWST24U4wO z!*20Z%EPZv84J(RYU(SAucBTgXKSc#!RO(N555rlj1Q=Qb-#$S1srB{kuIh920TM0 z$3FdLOG(BNby|aU*Z!Yd2XQ$Aw+Ze_hQ8b2*6HeU-~7iVefL3ZWZ)ixyOu%UF1YI% zxX0i&GjJ_%H!^U~!QITj?Ss3OtoPSG+(vVM&E+My?F`%zxZ4@}z6N*4b)vgJ0omH5 AoB#j- literal 0 HcmV?d00001 diff --git a/src/target/FileManager.class b/src/target/FileManager.class new file mode 100644 index 0000000000000000000000000000000000000000..279a18efff852b75c454914d333975e4993fb363 GIT binary patch literal 2878 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

hnR0oP!<(( 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 SD)9_5XY5dEXk@5tp71|8*(Y59 literal 0 HcmV?d00001 diff --git a/src/target/Gnome.class b/src/target/Gnome.class new file mode 100644 index 0000000000000000000000000000000000000000..1976a8e66a26e678e366a45f086ccbbad8c526ce GIT binary patch literal 1187 zcma)+ZBNrs6vzK}-P)~oGRA|9CqWRmf*?Mjg6OhDLqfnfLR@@RMxDj3C2ME=P`=Q_ zVPez|;OF7B@qfF8hh{H)v3q*Y{hf3E=iHn9`TOHHfTt+yNI=n$G?0QSkUO$IS}U&Q zHCA>Hj_i6UplK)D9#nOHTX=F6$2Cl#mNWJv@rcE0h+xDS=*pk3i0|W9@ZCano z4O_$DrNq^+<#>%WhDcQWX4Ci57!lB9E+=>|Gh8z;hJrvwDrs8{I}jLpyL~RMn`2$F z69y(Fs|Ft&*9~Mt(*~|%Mj+j=!-{JKGP+p05FR<#b=<(5hIs=wu^=#Tp1v29Wqj3X z9=rCACEFanl;nbjqJdJRA#7Pr7)V)*29~5Nd))HhId#YO_zN^F3nX7#b!N*}d@l$s zFWk4>wyp3!3S7h~fr@`fU|`$v?45S=z;5kX2QEDt1$BdY8C%^3tKHFOc(fN)7Z@p) z`V5QXl>J0g5-|9^eLmeBx34ZLGmFl6f05;#N0x)5)yeWva=pvl8-5GgCG$Ik znJaXlnSrE z4Uf3Wlv6!0Wq!l0c=dT6KJJT-$I(TiPx_*xadegFdSBFxqiaMr__xv3I?r*+_Knm} ay{4$UwWPWmkC5!H~ZgP^_p;2pE@;G=5sjQWm$nq`M{lC_iXI zF)`{7@JAWXY#S&IAN(+PX6~GO?z#8QpT9qT16aX&5+Q^YL{vl(6UZDI$41FEoJMJD z_t32S0D7l?XCrnx5|suD7!A}!xzP2=-g z!&ESQfm-)lmeYu1goujUY`RVyV?3|h$Ch^>39hQRhU)?eDWz>ROiy6s-@$FSRGm}AOIb0Ux{^l9y-sTOw_S#kFmnclD*bFFoecxXK`%f1;O*y2K z$$YmfQXr|j?N;4u^#xq(eaFV-3N2uz{08+j^KSNIRkl{>z5ID=HGL~s2ZQ=!AXK*d#ih`DgU~XeFR?}|wa&ApviyOBpr0}V&!9W@E P>c6}EmgowJLwNlUmx9hX literal 0 HcmV?d00001 diff --git a/src/target/HalfOrc.class b/src/target/HalfOrc.class new file mode 100644 index 0000000000000000000000000000000000000000..326b0715fa7a0fb4b5bc371721436d5f64e2379b GIT binary patch literal 1189 zcma)+ZBNrs6vzK}-PWyku8s#0WC9{?ML~Q*1yQoZNFdBuf?0f3Mp=qoOV-Z#p?sl< z!^Ef`zz=2o-;VIm?1e9OPw%H1c@>(DOV9<>*S2?1?=%H6;gRF)3y2MgT-H&P=h?RX zX}#sBxN;%26?I&{mBSE;TF`C>ehwonz)Ujws*W*S6Ua*)UAyIk0z>b&&ZPC@S0p>3 z6k0%Vm>5E!Zbe+;V+qyW8G#Iy?5BM~_ND{a{|jM!!L;KlVJ2cH-&+BbDla zVR4+YpLj|FI={EhrfYEf=Dbo4l&*D)Rnkl+i$y`dWdY3!x}B!;%9Wz@lP9ns=Z9(b zo`S$#WKoiDgx`y7D}{U9^G%%Ym+0fv;xpc0Y+WNvV4?W?{oK#--34D{0?Cn z literal 0 HcmV?d00001 diff --git a/src/target/Halfling.class b/src/target/Halfling.class new file mode 100644 index 0000000000000000000000000000000000000000..29085777ffa2e9f61eca1d2c046f27882a88b066 GIT binary patch literal 1192 zcma)++fEZv6o&uZnI4_eQVzJB@R_X6fuG9p>b?1+lEtL z-rhSjYra5i&2lV%T|g-mcaumU8AnRP6=(v9SB8CHTTWdd>K&QpzJS<}OrM5~1Y!;2 zW2tV&(SIp+#c$FnfdLX_x6yE&1ctbNVIN!Gdl}%WhHDrRNJ=d&qi%Wv1MfD^<#j@= zN_I@cxMXAA2g|lSSyEoZB&H~^Zu({0@T7O4c)>j|uBLDuGjYsnn8Un4<~)4YDNX;1 z)i|=vEu&!y3|7Z(>9Xs1 zzTx=0hTSq1-bkK9bD*)z~weJI0<(OPqo_&b*F|PJxw9=aW3z39<_e z6^cEY#dgYif-VVYTyLItH_Pqoi%Qv0no1RBQ5jAq^W9F#0;!7IYSzq`mK2r#_Y9U~ z12N6wBM`WW7;^HVaJ|gpBDlpp-^JPfHf?NMaKW(?X+8QA*{YJuRjO)ku+qk`uF%rP=oj(=cQ}qR4v>V(tSKnyr?wfY zSwJ6&yO{50nc^(7B=i$ZoM8I%Sp=yA7~q(}J&sb-IA>{9Ddba#9O23RGjgm;D%pG( zoaE61Jme@tPISSj{uMXE+2?rps3$raMi+@b?uibE(G{YrJyAW3N|kH;cXYJQvYoPg eE&3x>Rn+aOs&0op)=8}YcYB|ce#(duJo^jsqQ4ga literal 0 HcmV?d00001 diff --git a/src/target/Human.class b/src/target/Human.class new file mode 100644 index 0000000000000000000000000000000000000000..bc09d131695ecda7845f9077dba31f069036b789 GIT binary patch literal 1212 zcma)4?@!ZE6g_X<+HH2O!cYX6pom)$P!SdRC0R6*5Vkn7r14W3bt!J`vUbKl$`6`2 zOpN*m_(vJf>j;cxANv>oSIKWb|AY8#ew#yxRJ&z<}}>VaToIf*$eu!rVRV5ZmZpN4(ygAkh?@O zpkYDB{YXRDvE49`vWhxPS<19K{(HCXIv&43!vlf%Tf0uSOv(3x(DuTb-RwFFuOKf& zMPQ;Zp!IA_vBt)df6T`0zUw&$-PV!QIkbnZ-72TVNhgPeeqW4 zU=b?DL=w-CWdyO*RLX>GJbDG!$9x^`Ss>c5qvuS>ZFpYc< znrT#e$e4*=Ff3(ktZKyrDRqk4`pizkdy(KNF}D@Nt>5O9hcYa@X9VW6D&6weqX;|#N8Oqkzr zZ+Q3ux1NuLP7Xtt2wfiu%?(3W34JjVS{R0|6S{#-MyYj;Zc42)hWayYDN5Oj$IDhC fQMOdIY-w8AN+!$06gzC$`fs~m5xvb3G3@*UKAXZ_ literal 0 HcmV?d00001 diff --git a/src/target/ImageInfoPanel.class b/src/target/ImageInfoPanel.class new file mode 100644 index 0000000000000000000000000000000000000000..6d1693a6531804f63676dddc81b27b28fe509774 GIT binary patch literal 3296 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 E0A7XkTmS$7 literal 0 HcmV?d00001 diff --git a/src/target/Intelligence.class b/src/target/Intelligence.class new file mode 100644 index 0000000000000000000000000000000000000000..fb6a7814eb4e113ca5812c6cc8e2090c6c3ae404 GIT binary patch literal 1256 zcmaJ>ZBNrs6n-un>llTx0U}OtD9Toq3HZv?L}!RgKtGINj9$ z{Gf?o!UunVKgxLSTA;vUnx1>l?Q@=<=k%QZ`Fr#mz%wjo(1(P9q=|l{82THEtAHW( zRJu|SS^=1q)hy0Litn%9z_r0_MzxQR=cU>Ix*b$s4UsGi0o12m>! z;wq*Xh6(dZ1hy|bN_sA_mddMJe2-Tg?zSrpXLJZZjWqKFxWi51k@ zYx{x+BEn`G-mY(p6{$IL@p8{=O$;M1Jx>M7=bbg7HoaDmP2p|^^QaiOrv)xB%$~}Z z?w+?TqAG-%SGcV_f1lxNDW)|7hNQ2#+j2xOyXtw{yPawb7L_x0awc$nzax6UKg95F zn_I$G)p$`OiW+yEhE$@O#u7v2Mc7=$Ze^B>toWsP+zX)>`|5Pi?M_$tHHQa*2n;-A zxOt%vz4RG)%rO0bD9uG!49rmP^-(wV(M3bi-BCBwYJjE)*U8=>?-3GR+^F>n%qkqf zu&lx%h7OSXL67Mxk3*YG7VxN_WmW#FZmV1E+Dr zgaOK=(?X6`8aUD(rau?O4_fbuAo-E%by_C{6;dkg>#C`HI Lw0l66e}c(>r@IZG literal 0 HcmV?d00001 diff --git a/src/target/LoadCharacterPanel.class b/src/target/LoadCharacterPanel.class new file mode 100644 index 0000000000000000000000000000000000000000..be1cabd6cf95114cbee3e77447169148edfba97d GIT binary patch literal 210 zcmX^0Z`VEs1_oOOUM>bE24;2!79Ivx1~x_pfvm)`ME#t^ymWp4q^#8B5=I6#o6Nk- z5<5l)W)00Sb_Nbc1|gsP#1!X@#G=IHlGLJr#JtoTMg|t={FGEi27aH+yi~u^+@#c^ zki?`Mpa@rRerZv1s#_+ABaW$64`d~SA_F_nB_O~Egh00dNlqY77R+a0VAa~rz_<}C R%>^Vu(h#NGK$?kx2LPN7Dl`B9 literal 0 HcmV?d00001 diff --git a/src/target/MainMenuPanel.class b/src/target/MainMenuPanel.class new file mode 100644 index 0000000000000000000000000000000000000000..250f5b31c6fa8e702a8d22b08389028c76e77b26 GIT binary patch literal 1750 zcmaJ?4O3G`6g`^+6XHW+5EQHwZN+?P07a}(TM|IA3ABYmV{LVlEaXA*Uix?`wZEr7 zpmik7l$rj3{-{pRz84_SnZnHOzTLa$o_p@yo4^10^Dh8T(TXB~U>G3-eYhYH-;qDd zU$T4qrnQ}Y`IWR(L*T*_(=y#>0>MObBZ>(6!-yKVs4onZq-m9u)$ZCxTl&tLa@(zb zS`HYvgh2trQu~FvbY#_4j=*4XL2b!)!_Bu{*S2!n^s<4tHXU@NRkNEX*81#aa~|oA7tgeo6Xx!O*uvR&ThLA z+z{wnu^qRrVLvu7ft!q2)@lODgoox`D%j1IZ7Ivm`FjmXrB*9Ds_N!^bv`lhDQ;6s zpHjiLT*q#7_4yAoZ$B5o9qL>lta5a~NdqaQ1)>deyYA*4d*2d>^|EN#PEIquYv3NT zlx9!4d0E}vcI>uA&O>K7YirGJ4AVN(GmJH{yzKLRU|<#x1^S8Liy?5m=eECBl9t?7 z8YPTJ=L^M?H-g7hcVTj2;v_>8`L@}h#!<}SiFW*y7F}phxHZ>dr4dvI{kefJFwdat zO7hYYh0~>Sk}ti%nCDP1uz*E@Fd6$+@gBaOnUDC~zzZ#-QIpQD+Vh3f2rmtMd92!! z?I>S0eNr;8f>mFQ)t3CJtpq}eS32yk1;%=-YE8cqrgzVkmb<4fuNhd!x2!)Bdtp1~ zuVgG6^Gu@EWNtMQMGs?BV7wQp;#FdHvDtFp`BfRk2FhBoR}7P>@{=`(*9LyTk3K!$ zl2Cr|$IrG4=AU}`ddqS+QSrHB*8G%4@djnx0IJ&2L%k~L;k6#N^$VyAqQk_5yg67jEw$2aR+O_YD-G^M*X*`aRZFJ+ zh@WXX_jG8u$pQ*Mz(kNUn-2S1Kz9^xX7}J6;&~r-IX3w9mX;yTnbaXfs)KMUeE=hs zIY2CR_W(mF?v2Dh>R?>2ZpA0L`h)fYO^&zd4~P-rGFNd7V2I-tT*U~vTtgb8^v@pI z^)^e-f;Wa!?~&-x=@G`t!QdgLI=Fuddx@lg8wg{ZU=xI3d+S0}xf|f={UgkkbE24;2!79Ivx1~x_pfvm)`ME#t^ymWp4q^#8B5=I6#o6Nk- z5<5l)W)00Sb_Nbc2GM|`)UwRfa_5Z1qQvBq)S}>w)Ks8K7U%qwR7M7VpUk{eztY^K z)S{5Yq#U3KS8#r5QF5wVCWs@2Rkt3^ABeIj{=@D?KEQb3Vq!u9VYqP`mvJ(%EM!@X-{!#&@S_YhWD_qO zW~!^Zx~u#5@B0V93mzhL1i@SvCPE-c*ZNbBN?qB}^nGoLMi5!k__|=2<&*!qYHC;6 zXF<5tUt`PqRhGXAV(Qi2n3W)5xTv*j4uZ!lUta3=8ntm{NllOOgx*JO4QWa`t9Ku+ zaHis8Dr9P`=n`-op{sVsx-hSoH@ng9 zIw}vmpb8}T6NndHc%Tw#B?SEeJiz}!;^W+P!smm}otb+)GiT=7KmGpwBLLU%o`D?l z8VV+gC<$1%-2-97Qh_8^Y7-P9i>I;6mKJM{P5V1CUFhe1YqjA`5Pzztm; zrr z+6fQ5B=tu}p{E4&b#Leo{Ls_!49jk~={Tl+o_*f*;=c;j1uFD+qIk~@2P8BngkCR1Ei{FhC+sbay0*3zoX(;P41MdDkiC$aus^NYb$Hn;N=@8 z+G@w;#7ied46I;P!o+5+w ze&@JCV@sg05)D0y?{cCWnYS5eb&&ALjou3 z{}_j1EmSu2z8x73JmjtX;Zs{pCqCIr^#<<^#NbpREXV ziD#h^Pf-|udN6Por|~i7@Cj=8l(#vx)guu<(^4Y7ux5TRoP43@6ttdGEcKjHzUOFq z&(UdHB?c|!S(#f_uAwd}$}-hORl$^sO*4ySX}xa#TCMpVE}jlvx@w0*wU~e zW`D&jRrPT5NZT2nf|R1F^(~Fbc$9SYPbTm#ZV}Zk=Xk2OkjsDbAKof&Y;}XpKLM!l B0m=XX literal 0 HcmV?d00001 diff --git a/src/target/Stats.class b/src/target/Stats.class new file mode 100644 index 0000000000000000000000000000000000000000..81bc44d0408f24822c0f2bcf4c0dd4e657e5951c GIT binary patch literal 602 zcmYjN!A=xG5PiKnv$HI_G6-Ub5TYSu*Mr=+pj78A~#2+$! z@kGMG5AXxL_$esy_0Wk{^6FJrzpAe4A9pw30ldQF7HX&`h}wwJ5J*quRBjGsKG=NU zKh>%fXuLGJDR%_w-QI@;O@TNoWjPjzUKdANU~bRk`rYKbukC^C4}C_-p~~dcVOiK5=rV+SjRmtz>=#Go*k~*8z+eC0)+gTR zv9e}Vnj#li?DqElt&o+LBWw$_vSMPDerx=6t!n%iUKTw?!VmD4fQz9)Kf}{1S&-xB z*AU+ru#Dbc`8_Lu}* zrnfHr?b1Iky>m5Jcae)-!zHfi(w~l^S~cPpI*el+awEmeG0z4mhFCz3C5*5Pixreu u!xYc(3G4WbjjAd|`xb{anz*-!f6k>50dwr(c|P#Nzzfx)0*|T*mi__?RcT~8ZF6g|U-ZOnqP!$(s{vQ0^2n*GkWoi#ByVmYN zYN<^RnK@ASO}_CJ9l>G+%xx{xp)8h_ru=+zQL0sMlhPkn1gZT z1jgG&nphzBSO?lX5g4u3UQM8Yi9Cu9CgBJa+9py#*YpG&+0ni>gSHn&NufrUePpqgReN%LBp9%r$UfmN(p zZM8o3y@D>0;T26Y+@olv9UZ8bM~591?aGeNm8t5^sl<&Mfi}zwI+ktf^5>?EqQPsW zyFEjtOqj$=e;s&{lCesaE4IU<$Wzbtko=T-)g~%1^KBTK*hI4bLYZE;7ngE)Sj0NM z%;PJY^@hOmxh6U|4i8i+O(Mi|>6tJZ2>e>j2#^93((icnHijlmZu6 z-K`){QPY=ktl~VjSz;dvaaDeKJQle5|4_DAA_hKVL5{G*M)~wIx=h#t3pUc3QtvYDDtA}TXxFK+MOQ4EZ@GSg z8y|Q@I6q~Y7+{0qZlX*paF2o~$=*%3OGcEG5>4OiQyL0EF+<^e*t)o^(+$5(ny*}K^L$N-4E`f?*@&< z>fWKOM*{k)7kJT{fL1E+W?&$bM%Kh7m;%POCl7otXb7ajBPsU<#D>CLHj!5Vz3F~j zZ^$&RT;O)1Hj4}l5m9M1o2|gW2%CX+@ znn%9ea+^|M_yWl}4J8xho`$IHdQqrk&6~KRQn{mc>%gmfGT<*vV?iMK#;ubrS7`-d zvyEaJ1MGVhk#0JpMds`=~T0*)gM_P>$E!Ux_sp+QMrE)VL=&) zX%3%&z+LDlsHej3Mb4GLJ?{B3PWMa9(YD?hudo++?Y&6v7_-FkZF0TO-CKSO#(Dc2 zgl!eONZZy<7dboi6IM+t6r5VJFzj?OYHQ4NG5&>cfd^d2Ndsh%WYa7(Sd=zHF*b5U zJjC2dlPN~k#ITPsd5r1LrwmF4I07#QkGLvH6O1aWSv#L%z%d>?9sn%HfkgtB@r0{l zoMcptDf=sK$D7ac=;=V{cpN%U=(B;)(KvL8(3OEuI}TkYbd~=deXS+BskB=9k8DlT atF@$2t)+}=yh`EM{@dXS(J#oFz{|g{2fo(; literal 0 HcmV?d00001 diff --git a/src/target/Wisdom.class b/src/target/Wisdom.class new file mode 100644 index 0000000000000000000000000000000000000000..92cb73d861b2b2fcfe4d45c3ba89f0d2578897a3 GIT binary patch literal 1244 zcmaJ>ZBNrs6n-un>(~lo14NwYP?W7I6Y!O(iOvw0fPNT(7{7SeUExCMUD^wV#2@01 z@Pj6T2_O6c{wU+=TA;vUnx1p-?Q@=<=k%QZ`Fr#mz;i5S(1(P9q=|l{82X!1Ooz0(Zp3u zG7J&sweW3EcC=J3v6d^#TYQgK9qw*ao7$rcY6Vhz-9!mf4C6a|Thx_nbGDr#) zzKF1yrrPyvu_ObIY*^^oKn=t2E2XrrJ>FRndQ-LiTnhIxm_^mV{Xp6r!}O_e>F%j* z5$O-rE^%8cZ=d07Ii@lKhNN$}+jfLMy{y#sZl@N5MTLx=oC#dr?}#4o4>A0^)|Rk! zEnd!uqRt(sDYdAjvA|G$8MalaTa(2SD}5;)cR{#|eQ!FTMr^pQ@ahitec>B;#Bl3E zA$sXE@Py&o|Dn|HVKFd8UDro_)JGQ$LU%=dOx^%Z4sMXWNxR2Lba5lrFEFck0K>A1 zhZsCS{s%p#uSB+hB-s>Mnk~8tL`i95JR+GSPo0i_>nDtFCt<1XVU8>f2-)C$acKTL zbc{f^dq58{dLCLND2-Ia8tj4u5{1j(&%HhnI&%V?C%FNz5M)Ys-a5pUBU}ScYx15QfK_FG$iPKnkT$pdY{nA*x=u1P~}~)uM<-+R#e$>+CLGCrJDz z4sb%^zz^U@Azp6+NC6~YW;`>`dS1`$_a9%s5z$k+S0s-z1#jDA{EhssT7*k6T`KE=)HFn8Mj7}>{|^L zKA7^*@S$jpME{&o(Vx$!@rKc*flL;GDjEfRikrG49lggL#UPsKzSx&`aHZK=9@$yZ zIu)>4yp%HVB`Rax9xcs%CG}O*b7XA|)phs`eD1*)VxMt<2w3}rSewPij4soaIlc?t~vDG0JlQd7yD*DF6g@tV%33r2=0c1z8!Ek z9k|Ef)*QGdxLXd~b8xpExIJ)p()Iq@hux_6*IZtL+i>8Hz->D8eGP8QcA~pK0p>8H A>Hq)$ literal 0 HcmV?d00001 diff --git a/src/target/step4$1.class b/src/target/step4$1.class new file mode 100644 index 0000000000000000000000000000000000000000..1988e1e9ce92013166256e87fbc4be1f130f025c GIT binary patch literal 514 zcmZut%T60X5Ud8{HOm5q5FEl&h=UDMHb~r@L<$yBg3Ln#`95BEV4U?V+8INBivvQ+ zAs>)`%A;q*31y_|p025?R`;(zKYjvukBwkm0|B6+8cb{`0n%~mhM9AQ0>)SXNDmW@k4W=3gfgH^SLsd z6PBB;(D-|5@5CTI4tSeTJ7w!W7gn~Ad@(XxCs)?8#g^>12Er_;UiUkewNJ>M!Mvb# zd2LJWk$89S0kr#w=w2$qg2bw1;J3s@ym;cT2;%wloc0$LEQQaPSe9Ht11neyNCWGV KW3lj3IsX8@_-q*f literal 0 HcmV?d00001 diff --git a/src/target/step4$2.class b/src/target/step4$2.class new file mode 100644 index 0000000000000000000000000000000000000000..ff3efc0c81ae976306cbfd6fac69dd4ec213c73a GIT binary patch literal 514 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 C_ceY1 literal 0 HcmV?d00001