diff --git a/Android/app/src/main/java/com/majinnaibu/monstercards/models/Language.java b/Android/app/src/main/java/com/majinnaibu/monstercards/models/Language.java index a670740..b7e31da 100644 --- a/Android/app/src/main/java/com/majinnaibu/monstercards/models/Language.java +++ b/Android/app/src/main/java/com/majinnaibu/monstercards/models/Language.java @@ -1,74 +1,37 @@ package com.majinnaibu.monstercards.models; -import androidx.annotation.NonNull; -import androidx.annotation.Nullable; - import java.util.Comparator; -import java.util.Objects; public class Language implements Comparator, Comparable { - private String mName; - private boolean mSpeaks; - 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) { - if (this.mSpeaks && !o.mSpeaks) { - return -1; - } - if (!this.mSpeaks && o.mSpeaks) { - return 1; - } - return this.mName.compareToIgnoreCase(o.mName); + return this.getName().compareToIgnoreCase(o.getName()); } @Override - public int compare(@NonNull Language o1, Language o2) { - if (o1.mSpeaks && !o2.mSpeaks) { - return -1; - } - if (!o1.mSpeaks && o2.mSpeaks) { - return 1; - } - return o1.mName.compareToIgnoreCase(o2.mName); - } - - @Override - public boolean equals(@Nullable Object obj) { - if (obj == null) { - return false; - } - if (!(obj instanceof Language)) { - return false; - } - Language otherLanguage = (Language) obj; - if (!Objects.equals(this.mName, otherLanguage.mName)) { - return false; - } - if (this.mSpeaks != otherLanguage.mSpeaks) { - return false; - } - return true; + public int compare(Language o1, Language o2) { + return o1.getName().compareToIgnoreCase(o2.getName()); } } diff --git a/Android/app/src/main/java/com/majinnaibu/monstercards/models/Monster.java b/Android/app/src/main/java/com/majinnaibu/monstercards/models/Monster.java index 568321f..4968b97 100644 --- a/Android/app/src/main/java/com/majinnaibu/monstercards/models/Monster.java +++ b/Android/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/Android/app/src/main/java/com/majinnaibu/monstercards/ui/monster/MonsterFragment.java b/Android/app/src/main/java/com/majinnaibu/monstercards/ui/monster/MonsterFragment.java index a97e513..1a02cae 100644 --- a/Android/app/src/main/java/com/majinnaibu/monstercards/ui/monster/MonsterFragment.java +++ b/Android/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/Android/app/src/main/java/com/majinnaibu/monstercards/ui/monster/MonsterViewModel.java b/Android/app/src/main/java/com/majinnaibu/monstercards/ui/monster/MonsterViewModel.java index 09c5371..8fd208e 100644 --- a/Android/app/src/main/java/com/majinnaibu/monstercards/ui/monster/MonsterViewModel.java +++ b/Android/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/Android/app/src/main/res/layout/fragment_monster.xml b/Android/app/src/main/res/layout/fragment_monster.xml index de8bbf6..db68877 100644 --- a/Android/app/src/main/res/layout/fragment_monster.xml +++ b/Android/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