From e5c4e365f288ffac422ad64439fe5d24c9f2e9c2 Mon Sep 17 00:00:00 2001 From: Tom Hicks Date: Tue, 1 Sep 2020 23:13:17 -0700 Subject: [PATCH] Adds languages to monster cards. --- .../monstercards/models/Language.java | 37 +++++++ .../monstercards/models/Monster.java | 102 +++++++++++++++--- .../ui/monster/MonsterFragment.java | 34 ++++-- .../ui/monster/MonsterViewModel.java | 7 ++ app/src/main/res/layout/fragment_monster.xml | 13 +++ 5 files changed, 170 insertions(+), 23 deletions(-) create mode 100644 app/src/main/java/com/majinnaibu/monstercards/models/Language.java diff --git a/app/src/main/java/com/majinnaibu/monstercards/models/Language.java b/app/src/main/java/com/majinnaibu/monstercards/models/Language.java new file mode 100644 index 0000000..b7e31da --- /dev/null +++ b/app/src/main/java/com/majinnaibu/monstercards/models/Language.java @@ -0,0 +1,37 @@ +package com.majinnaibu.monstercards.models; + +import java.util.Comparator; + +public class Language implements Comparator, Comparable { + + public Language(String name, boolean speaks) { + mName = name; + mSpeaks = speaks; + } + + private String mName; + public String getName() { + return mName; + } + public void setName(String value) { + mName = value; + } + + private boolean mSpeaks; + public boolean getSpeaks() { + return mSpeaks; + } + public void setSpeaks(boolean value) { + mSpeaks = value; + } + + @Override + public int compareTo(Language o) { + return this.getName().compareToIgnoreCase(o.getName()); + } + + @Override + public int compare(Language o1, Language o2) { + return o1.getName().compareToIgnoreCase(o2.getName()); + } +} 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 568321f..4968b97 100644 --- a/app/src/main/java/com/majinnaibu/monstercards/models/Monster.java +++ b/app/src/main/java/com/majinnaibu/monstercards/models/Monster.java @@ -17,6 +17,7 @@ public class Monster { mSkills = new HashSet<>(); mDamageTypes = new HashSet<>(); mConditionImmunities = new HashSet<>(); + mLanguages = new HashSet<>(); } private String mName; @@ -730,22 +731,6 @@ public class Monster { mTruesight = value; } - private int mTelepathy; - public int getTelepathy() { - return mTelepathy; - } - public void setTelepathy(int value) { - mTelepathy = value; - } - - private String mUnderstandsBut; - public String getUnderstandsBut() { - return mUnderstandsBut; - } - public void setUnderstandsBut(String value) { - mUnderstandsBut = value; - } - public String getSensesDescription() { ArrayList parts = new ArrayList<>(); @@ -770,4 +755,89 @@ public class Monster { return StringHelper.join(", ", parts); } + private HashSet mLanguages; + public Set getLanguages() { + return mLanguages; + } + public void addLanguage(Language value) { + mLanguages.add(value); + } + public void removeLanguage(Language value) { + mLanguages.remove(value); + } + public void clearLanguages() { + mLanguages.clear(); + } + + private int mTelepathy; + public int getTelepathy() { + return mTelepathy; + } + public void setTelepathy(int value) { + mTelepathy = value; + } + + private String mUnderstandsBut; + public String getUnderstandsBut() { + return mUnderstandsBut; + } + public void setUnderstandsBut(String value) { + mUnderstandsBut = value; + } + + public String getLanguagesDescription() { + ArrayList spokenLanguages = new ArrayList<>(); + ArrayList understoodLanguages = new ArrayList<>(); + for (Language language : mLanguages) { + if (language != null) { + if (language.getSpeaks()) { + spokenLanguages.add(language.getName()); + } else { + understoodLanguages.add(language.getName()); + } + } + } + Collections.sort(spokenLanguages); + Collections.sort(understoodLanguages); + + String spokenLanguagesString = StringHelper.oxfordJoin(", ", ", and ", " and ", spokenLanguages); + String understoodLanguagesString = StringHelper.oxfordJoin(", ", ", and ", " and ", understoodLanguages); + + String understandsBut = getUnderstandsBut(); + boolean hasUnderstandsBut = understandsBut.length() > 0; + int telepathy = getTelepathy(); + boolean hasTelepathy = telepathy > 0; + String telepathyString = String.format(Locale.US, ", telepathy %d ft.", telepathy); + + if (spokenLanguages.size() > 0) { + if (understoodLanguages.size() > 0) { + return String.format( + "%s, understands %s%s%s", + spokenLanguagesString, + understoodLanguagesString, + hasUnderstandsBut ? " but " + understandsBut : "", + hasTelepathy ? telepathyString : ""); + } else { + return String.format( + "%s%s%s", + spokenLanguagesString, + hasUnderstandsBut ? " but " + understandsBut : "", + hasTelepathy ? telepathyString : ""); + } + } else { + if (understoodLanguages.size() > 0) { + return String.format( + "understands %s%s%s", + understoodLanguagesString, + hasUnderstandsBut ? " but " + understandsBut : "", + hasTelepathy ? telepathyString : ""); + } else { + return String.format( + "%S%s", + hasUnderstandsBut ? "none but " + understandsBut : "", + hasTelepathy ? telepathyString : ""); + } + } + } + } 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 a97e513..1a02cae 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 @@ -16,6 +16,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.Language; import com.majinnaibu.monstercards.models.Monster; import com.majinnaibu.monstercards.models.SavingThrow; import com.majinnaibu.monstercards.models.Skill; @@ -91,6 +92,13 @@ public class MonsterFragment extends Fragment { monster.setTruesight("40"); monster.setTelepathy(20); monster.setUnderstandsBut("doesn't care"); + // Languages + monster.addLanguage(new Language("English", true)); + monster.addLanguage(new Language("Steve", false)); + monster.addLanguage(new Language("Spanish", true)); + monster.addLanguage(new Language("French", true)); + monster.addLanguage(new Language("Mermataur", false)); + monster.addLanguage(new Language("Goldfish", false)); // Challenge Rating monster.setChallengeRating("*"); @@ -271,15 +279,27 @@ public class MonsterFragment extends Fragment { monsterViewModel.getSenses().observe(getViewLifecycleOwner(), new Observer() { @Override public void onChanged(String senses) { - if (StringHelper.isNullOrEmpty(senses)) { - monsterSenses.setVisibility(View.GONE); - } else { - monsterSenses.setVisibility(View.VISIBLE); + if (StringHelper.isNullOrEmpty(senses)) { + monsterSenses.setVisibility(View.GONE); + } else { + monsterSenses.setVisibility(View.VISIBLE); + } + monsterSenses.setText(Html.fromHtml("Senses " + senses)); } - monsterSenses.setText(Html.fromHtml("Senses " + senses)); - } - }); + }); + final TextView monsterLanguages = root.findViewById(R.id.languages); + monsterViewModel.getLanguages().observe(getViewLifecycleOwner(), new Observer() { + @Override + public void onChanged(String languages) { + if (StringHelper.isNullOrEmpty(languages)) { + monsterLanguages.setVisibility(View.GONE); + } else { + monsterLanguages.setVisibility(View.VISIBLE); + } + monsterLanguages.setText(Html.fromHtml("Languages " + languages)); + } + }); 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 09c5371..8fd208e 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 @@ -46,6 +46,8 @@ public class MonsterViewModel extends ViewModel { mConditionImmunities.setValue(""); mSenses = new MutableLiveData<>(); mSenses.setValue(""); + mLanguages = new MutableLiveData<>(); + mLanguages.setValue(""); } private MutableLiveData mName; @@ -120,6 +122,10 @@ public class MonsterViewModel extends ViewModel { public LiveData getSenses() { return mSenses; } + private MutableLiveData mLanguages; + public LiveData getLanguages() { + return mLanguages; + } private Monster mMonster; public void setMonster(Monster monster) { @@ -142,5 +148,6 @@ public class MonsterViewModel extends ViewModel { mDamageImmunities.setValue(mMonster.getDamageImmunitiesDescription()); mConditionImmunities.setValue(mMonster.getConditionImmunitiesDescription()); mSenses.setValue(monster.getSensesDescription()); + mLanguages.setValue(mMonster.getLanguagesDescription()); } } \ 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 de8bbf6..db68877 100644 --- a/app/src/main/res/layout/fragment_monster.xml +++ b/app/src/main/res/layout/fragment_monster.xml @@ -396,5 +396,18 @@ app:layout_constraintTop_toBottomOf="@+id/condition_immunities" tools:text="Senses" /> + + \ No newline at end of file