diff --git a/app/src/main/java/com/majinnaibu/monstercards/helpers/StringHelper.java b/app/src/main/java/com/majinnaibu/monstercards/helpers/StringHelper.java index 270397e..41dc2f8 100644 --- a/app/src/main/java/com/majinnaibu/monstercards/helpers/StringHelper.java +++ b/app/src/main/java/com/majinnaibu/monstercards/helpers/StringHelper.java @@ -35,4 +35,27 @@ public final class StringHelper { return sb.toString(); } } + + public static String oxfordJoin(String delimiter, String lastDelimiter, String onlyDelimiter, Collection strings) { + int length = strings.size(); + if (length < 1) { + return ""; + } else if (length == 2) { + return join(onlyDelimiter, strings); + } else { + StringBuilder sb = new StringBuilder(); + int index = 0; + int lastIndex = length - 1; + for(String element : strings) { + if (index > 0 && index < lastIndex) { + sb.append(delimiter); + } else if (index > 0 && index >= lastIndex) { + sb.append(lastDelimiter); + } + sb.append(element); + index++; + } + return sb.toString(); + } + } } diff --git a/app/src/main/java/com/majinnaibu/monstercards/models/DamageType.java b/app/src/main/java/com/majinnaibu/monstercards/models/DamageType.java new file mode 100644 index 0000000..841893b --- /dev/null +++ b/app/src/main/java/com/majinnaibu/monstercards/models/DamageType.java @@ -0,0 +1,35 @@ +package com.majinnaibu.monstercards.models; + +public class DamageType { + + public DamageType(String name, String note, String type) { + mName = name; + mNote = note; + mType = type; + } + + private String mName; + public String getName() { + return mName; + } + public void setName(String value) { + mName = value; + } + + private String mNote; + public String getNote() { + return mNote; + } + public void setNote(String value) { + mNote = value; + } + + private String mType; + public String getType() { + return mType; + } + public void setType(String value) { + mType = value; + } + +} diff --git a/app/src/main/java/com/majinnaibu/monstercards/models/Monster.java b/app/src/main/java/com/majinnaibu/monstercards/models/Monster.java index 403fe85..bde0bcb 100644 --- a/app/src/main/java/com/majinnaibu/monstercards/models/Monster.java +++ b/app/src/main/java/com/majinnaibu/monstercards/models/Monster.java @@ -4,6 +4,7 @@ import com.majinnaibu.monstercards.helpers.StringHelper; import java.util.ArrayList; import java.util.Arrays; +import java.util.Collections; import java.util.HashSet; import java.util.List; import java.util.Locale; @@ -14,6 +15,7 @@ public class Monster { public Monster() { mSavingThrows = new HashSet<>(); mSkills = new HashSet<>(); + mDamageTypes = new HashSet<>(); } private String mName; @@ -619,4 +621,50 @@ public class Monster { return sb.toString(); } + private HashSet mDamageTypes; + public Set getDamageTypes() { + return mDamageTypes; + } + public void addDamageType(DamageType damageType) { + // TODO: make this remove the damage type with the same name if it exists first + mDamageTypes.add(damageType); + } + public void removeDamageType(DamageType damageType) { + mDamageTypes.remove(damageType); + } + public void clearDamageTypes() { + mDamageTypes.clear(); + } + + public String getDamageVulnerabilitiesDescription() { + ArrayList vulnerabilities = new ArrayList<>(); + for (DamageType damageType : mDamageTypes) { + if (damageType != null && "v".equals(damageType.getType()) && !StringHelper.isNullOrEmpty(damageType.getName())) { + vulnerabilities.add(damageType.getName()); + } + } + Collections.sort(vulnerabilities); + return StringHelper.oxfordJoin(", ", ", and ", " and ", vulnerabilities); + } + public String getDamageResistancesDescription() { + ArrayList vulnerabilities = new ArrayList<>(); + for (DamageType damageType : mDamageTypes) { + if (damageType != null && "r".equals(damageType.getType()) && !StringHelper.isNullOrEmpty(damageType.getName())) { + vulnerabilities.add(damageType.getName()); + } + } + Collections.sort(vulnerabilities); + return StringHelper.oxfordJoin(", ", ", and ", " and ", vulnerabilities); + } + public String getDamageImmunitiesDescription() { + ArrayList vulnerabilities = new ArrayList<>(); + for (DamageType damageType : mDamageTypes) { + if (damageType != null && "i".equals(damageType.getType()) && !StringHelper.isNullOrEmpty(damageType.getName())) { + vulnerabilities.add(damageType.getName()); + } + } + Collections.sort(vulnerabilities); + return StringHelper.oxfordJoin(", ", ", and ", " and ", vulnerabilities); + } + } diff --git a/app/src/main/java/com/majinnaibu/monstercards/ui/monster/MonsterFragment.java b/app/src/main/java/com/majinnaibu/monstercards/ui/monster/MonsterFragment.java index e25773a..90b9002 100644 --- a/app/src/main/java/com/majinnaibu/monstercards/ui/monster/MonsterFragment.java +++ b/app/src/main/java/com/majinnaibu/monstercards/ui/monster/MonsterFragment.java @@ -15,6 +15,7 @@ import androidx.lifecycle.ViewModelProvider; import com.majinnaibu.monstercards.R; import com.majinnaibu.monstercards.helpers.StringHelper; +import com.majinnaibu.monstercards.models.DamageType; import com.majinnaibu.monstercards.models.Monster; import com.majinnaibu.monstercards.models.SavingThrow; import com.majinnaibu.monstercards.models.Skill; @@ -70,6 +71,16 @@ public class MonsterFragment extends Fragment { //Skills monster.addSkill(new Skill("perception", "wis")); monster.addSkill(new Skill("stealth", "dexterity")); + // Damage Types + monster.addDamageType(new DamageType("acid", " (Vulnerable)", "v")); + monster.addDamageType(new DamageType("bludgeoning", " (Vulnerable)", "v")); + monster.addDamageType(new DamageType("cold", " (Resistant)", "r")); + monster.addDamageType(new DamageType("fire", " (Resistant)", "r")); + monster.addDamageType(new DamageType("force", " (Immune)", "i")); + monster.addDamageType(new DamageType("lightning", " (Immune)", "i")); + monster.addDamageType(new DamageType("necrotic", " (Vulnerable)", "v")); + monster.addDamageType(new DamageType("piercing", " (Resistant)", "r")); + monster.addDamageType(new DamageType("poison", " (Immune)", "i")); // Challenge Rating monster.setChallengeRating("*"); @@ -194,6 +205,45 @@ public class MonsterFragment extends Fragment { } }); + final TextView monsterDamageVulnerabilities = root.findViewById(R.id.damage_vulnerabilities); + monsterViewModel.getDamageVulnerabilities().observe(getViewLifecycleOwner(), new Observer() { + @Override + public void onChanged(String damageType) { + if (StringHelper.isNullOrEmpty(damageType)) { + monsterDamageVulnerabilities.setVisibility(View.GONE); + } else { + monsterDamageVulnerabilities.setVisibility(View.VISIBLE); + } + monsterDamageVulnerabilities.setText(Html.fromHtml("Damage Vulnerabilities " + damageType)); + } + }); + + final TextView monsterDamageResistances = root.findViewById(R.id.damage_resistances); + monsterViewModel.getDamageResistances().observe(getViewLifecycleOwner(), new Observer() { + @Override + public void onChanged(String damageType) { + if (StringHelper.isNullOrEmpty(damageType)) { + monsterDamageResistances.setVisibility(View.GONE); + } else { + monsterDamageResistances.setVisibility(View.VISIBLE); + } + monsterDamageResistances.setText(Html.fromHtml("Damage Resistances " + damageType)); + } + }); + + final TextView monsterDamageImmunities = root.findViewById(R.id.damage_immunities); + monsterViewModel.getDamageImmunities().observe(getViewLifecycleOwner(), new Observer() { + @Override + public void onChanged(String damageType) { + if (StringHelper.isNullOrEmpty(damageType)) { + monsterDamageImmunities.setVisibility(View.GONE); + } else { + monsterDamageImmunities.setVisibility(View.VISIBLE); + } + monsterDamageImmunities.setText(Html.fromHtml("Damage Immunities " + damageType)); + } + }); + return root; } } diff --git a/app/src/main/java/com/majinnaibu/monstercards/ui/monster/MonsterViewModel.java b/app/src/main/java/com/majinnaibu/monstercards/ui/monster/MonsterViewModel.java index 31bd2a5..5b659ec 100644 --- a/app/src/main/java/com/majinnaibu/monstercards/ui/monster/MonsterViewModel.java +++ b/app/src/main/java/com/majinnaibu/monstercards/ui/monster/MonsterViewModel.java @@ -36,6 +36,12 @@ public class MonsterViewModel extends ViewModel { mSavingThrows.setValue(""); mSkills = new MutableLiveData<>(); mSkills.setValue(""); + mDamageVulnerabilities = new MutableLiveData<>(); + mDamageVulnerabilities.setValue(""); + mDamageResistances = new MutableLiveData<>(); + mDamageResistances.setValue(""); + mDamageImmunities = new MutableLiveData<>(); + mDamageImmunities.setValue(""); } private MutableLiveData mName; @@ -90,6 +96,18 @@ public class MonsterViewModel extends ViewModel { public LiveData getSkills() { return mSkills; } + private MutableLiveData mDamageVulnerabilities; + public LiveData getDamageVulnerabilities() { + return mDamageVulnerabilities; + } + private MutableLiveData mDamageResistances; + public LiveData getDamageResistances() { + return mDamageResistances; + } + private MutableLiveData mDamageImmunities; + public LiveData getDamageImmunities() { + return mDamageImmunities; + } private Monster mMonster; public void setMonster(Monster monster) { @@ -107,5 +125,9 @@ public class MonsterViewModel extends ViewModel { mCharisma.setValue(monster.getCharismaDescription()); mSavingThrows.setValue(monster.getSavingThrowsDescription()); mSkills.setValue(monster.getSkillsDescription()); + mDamageVulnerabilities.setValue(mMonster.getDamageVulnerabilitiesDescription()); + mDamageResistances.setValue(mMonster.getDamageResistancesDescription()); + mDamageImmunities.setValue(mMonster.getDamageImmunitiesDescription()); + } } \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_monster.xml b/app/src/main/res/layout/fragment_monster.xml index 7ddd2b7..b2fbb4d 100644 --- a/app/src/main/res/layout/fragment_monster.xml +++ b/app/src/main/res/layout/fragment_monster.xml @@ -331,5 +331,44 @@ app:layout_constraintTop_toBottomOf="@+id/saving_throws" tools:text="Skills" /> + + + + + + \ No newline at end of file