diff --git a/app/src/main/java/com/majinnaibu/monstercards/models/Action.java b/app/src/main/java/com/majinnaibu/monstercards/models/Action.java new file mode 100644 index 0000000..efa2f65 --- /dev/null +++ b/app/src/main/java/com/majinnaibu/monstercards/models/Action.java @@ -0,0 +1,25 @@ +package com.majinnaibu.monstercards.models; + +public class Action { + + public Action(String name, String description) { + mName = name; + mDescription = description; + } + + private String mName; + public String getName() { + return mName; + } + public void setName(String name) { + mName = name; + } + + private String mDescription; + public String getDescription() { + return mDescription; + } + public void setDescription(String description) { + mDescription = description; + } +} 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 61aff23..9b6c48a 100644 --- a/app/src/main/java/com/majinnaibu/monstercards/models/Monster.java +++ b/app/src/main/java/com/majinnaibu/monstercards/models/Monster.java @@ -14,6 +14,7 @@ public class Monster { public Monster() { mAbilities = new ArrayList<>(); + mActions = new ArrayList<>(); mConditionImmunities = new HashSet<>(); mDamageTypes = new HashSet<>(); mLanguages = new HashSet<>(); @@ -979,4 +980,26 @@ public class Monster { return getProficiencyBonus() + getAbilityModifier(abilityScoreName); } + public List getActionDescriptions() { + ArrayList actions = new ArrayList<>(); + for (Action action : getActions()) { + actions.add(getPlaceholderReplacedText(String.format("__%s__ %s", action.getName(), action.getDescription()))); + } + return actions; + } + + private ArrayList mActions; + public List getActions() { + return mActions; + } + public void addAction(Action ability) { + mActions.add(ability); + } + public void removeAction(Action ability) { + mActions.remove(ability); + } + public void clearActions() { + mActions.clear(); + } + } 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 2b8b1ee..9a2174b 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 @@ -23,6 +23,7 @@ import com.majinnaibu.monstercards.R; import com.majinnaibu.monstercards.helpers.CommonMarkHelper; import com.majinnaibu.monstercards.helpers.StringHelper; import com.majinnaibu.monstercards.models.Ability; +import com.majinnaibu.monstercards.models.Action; import com.majinnaibu.monstercards.models.DamageType; import com.majinnaibu.monstercards.models.Language; import com.majinnaibu.monstercards.models.Monster; @@ -117,7 +118,10 @@ public class MonsterFragment extends Fragment { monster.addAbility(new Ability("Spellcasting", "The acolyte is a 1st-level spellcaster. Its spellcasting ability is Wisdom (spell save DC [WIS SAVE], [WIS ATK] to hit with spell attacks). The acolyte has following cleric spells prepared:\n\n\n> Cantrips (at will): _light, sacred flame, thaumaturgy_\n> 1st level (3 slots): _bless, cure wounds, sanctuary_")); monster.addAbility(new Ability("Amphibious", "The dragon can breathe air and water.")); monster.addAbility(new Ability("Legendary Resistance (3/Day)", "If the dragon fails a saving throw, it can choose to succeed instead.")); + // Actions + monster.addAction(new Action("Club", "_Melee Weapon Attack:_ [STR ATK] to hit, reach 5 ft., one target. _Hit:_ 2 (1d4) bludgeoning damage.")); // END remove block + monsterViewModel = new ViewModelProvider(this).get(MonsterViewModel.class); View root = inflater.inflate(R.layout.fragment_monster, container, false); monsterViewModel.setMonster(monster); @@ -351,6 +355,32 @@ public class MonsterFragment extends Fragment { } }); + final LinearLayout monsterActions = root.findViewById(R.id.actions); + monsterViewModel.getActions().observe(getViewLifecycleOwner(), new Observer>() { + @Override + public void onChanged(List actions) { + Context context = getContext(); + DisplayMetrics displayMetrics = null; + if (context != null) { + Resources resources = context.getResources(); + if (resources != null) { + displayMetrics = resources.getDisplayMetrics(); + } + } + monsterActions.removeAllViews(); + if (actions != null) { + for (String action : actions) { + TextView tvAction = new TextView(getContext()); + tvAction.setText(Html.fromHtml(CommonMarkHelper.toHtml(action))); + LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT); + layoutParams.topMargin = (int)TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 8, displayMetrics); + tvAction.setLayoutParams(layoutParams); + monsterActions.addView(tvAction); + } + } + } + }); + 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 2d28237..4449896 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 @@ -13,105 +13,79 @@ public class MonsterViewModel extends ViewModel { public MonsterViewModel() { mMonster = null; - mName = new MutableLiveData<>(); - mName.setValue(""); - mMeta = new MutableLiveData<>(); - mMeta.setValue(""); + mAbilities = new MutableLiveData<>(); + mAbilities.setValue(new ArrayList()); + mActions = new MutableLiveData<>(); + mActions.setValue(new ArrayList()); mArmorClass = new MutableLiveData<>(); mArmorClass.setValue(""); + mChallenge = new MutableLiveData<>(); + mChallenge.setValue(""); + mCharisma = new MutableLiveData<>(); + mCharisma.setValue(""); + mConditionImmunities = new MutableLiveData<>(); + mConditionImmunities.setValue(""); + mConstitution = new MutableLiveData<>(); + mConstitution.setValue(""); + mDamageImmunities = new MutableLiveData<>(); + mDamageImmunities.setValue(""); + mDamageResistances = new MutableLiveData<>(); + mDamageResistances.setValue(""); + mDamageVulnerabilities = new MutableLiveData<>(); + mDamageVulnerabilities.setValue(""); + mDexterity = new MutableLiveData<>(); + mDexterity.setValue(""); mHitPoints = new MutableLiveData<>(); mHitPoints.setValue(""); + mIntelligence = new MutableLiveData<>(); + mIntelligence.setValue(""); + mLanguages = new MutableLiveData<>(); + mLanguages.setValue(""); + mMeta = new MutableLiveData<>(); + mMeta.setValue(""); + mName = new MutableLiveData<>(); + mName.setValue(""); + mSavingThrows = new MutableLiveData<>(); + mSavingThrows.setValue(""); + mSenses = new MutableLiveData<>(); + mSenses.setValue(""); + mSkills = new MutableLiveData<>(); + mSkills.setValue(""); mSpeed = new MutableLiveData<>(); mSpeed.setValue(""); mStrength = new MutableLiveData<>(); mStrength.setValue(""); - mDexterity = new MutableLiveData<>(); - mDexterity.setValue(""); - mConstitution = new MutableLiveData<>(); - mConstitution.setValue(""); - mIntelligence = new MutableLiveData<>(); - mIntelligence.setValue(""); mWisdom = new MutableLiveData<>(); mWisdom.setValue(""); - mCharisma = new MutableLiveData<>(); - mCharisma.setValue(""); - mSavingThrows = new MutableLiveData<>(); - mSavingThrows.setValue(""); - mSkills = new MutableLiveData<>(); - mSkills.setValue(""); - mDamageVulnerabilities = new MutableLiveData<>(); - mDamageVulnerabilities.setValue(""); - mDamageResistances = new MutableLiveData<>(); - mDamageResistances.setValue(""); - mDamageImmunities = new MutableLiveData<>(); - mDamageImmunities.setValue(""); - mConditionImmunities = new MutableLiveData<>(); - mConditionImmunities.setValue(""); - mSenses = new MutableLiveData<>(); - mSenses.setValue(""); - mLanguages = new MutableLiveData<>(); - mLanguages.setValue(""); - mChallenge = new MutableLiveData<>(); - mChallenge.setValue(""); - mAbilities = new MutableLiveData<>(); - mAbilities.setValue(new ArrayList()); } - private MutableLiveData mName; - public LiveData getName() { - return mName; + private MutableLiveData> mAbilities; + public LiveData> getAbilities() { + return mAbilities; } - private MutableLiveData mMeta; - public LiveData getMeta() { - return mMeta; + private MutableLiveData> mActions; + public LiveData> getActions() { + return mActions; } private MutableLiveData mArmorClass; public LiveData getArmorClass() { return mArmorClass; } - private MutableLiveData mHitPoints; - public LiveData getHitPoints() { - return mHitPoints; - } - private MutableLiveData mSpeed; - public LiveData getSpeed() { - return mSpeed; - } - private MutableLiveData mStrength; - public LiveData getStrength() { - return mStrength; - } - private MutableLiveData mDexterity; - public LiveData getDexterity() { - return mDexterity; - } - private MutableLiveData mConstitution; - public LiveData getConstitution() { - return mConstitution; - } - private MutableLiveData mIntelligence; - public LiveData getIntelligence() { - return mIntelligence; - } - private MutableLiveData mWisdom; - public LiveData getWisdom() { - return mWisdom; + private MutableLiveData mChallenge; + public LiveData getChallenge() { + return mChallenge; } private MutableLiveData mCharisma; public LiveData getCharisma() { return mCharisma; } - private MutableLiveData mSavingThrows; - public LiveData getSavingThrows() { - return mSavingThrows; + private MutableLiveData mConditionImmunities; + public LiveData getConditionImmunities() { + return mConditionImmunities; } - private MutableLiveData mSkills; - public LiveData getSkills() { - return mSkills; - } - private MutableLiveData mDamageVulnerabilities; - public LiveData getDamageVulnerabilities() { - return mDamageVulnerabilities; + private MutableLiveData mConstitution; + public LiveData getConstitution() { + return mConstitution; } private MutableLiveData mDamageResistances; public LiveData getDamageResistances() { @@ -121,50 +95,84 @@ public class MonsterViewModel extends ViewModel { public LiveData getDamageImmunities() { return mDamageImmunities; } - private MutableLiveData mConditionImmunities; - public LiveData getConditionImmunities() { - return mConditionImmunities; + private MutableLiveData mDamageVulnerabilities; + public LiveData getDamageVulnerabilities() { + return mDamageVulnerabilities; } - private MutableLiveData mSenses; - public LiveData getSenses() { - return mSenses; + private MutableLiveData mDexterity; + public LiveData getDexterity() { + return mDexterity; + } + private MutableLiveData mHitPoints; + public LiveData getHitPoints() { + return mHitPoints; + } + private MutableLiveData mIntelligence; + public LiveData getIntelligence() { + return mIntelligence; } private MutableLiveData mLanguages; public LiveData getLanguages() { return mLanguages; } - private MutableLiveData mChallenge; - public LiveData getChallenge() { - return mChallenge; + private MutableLiveData mMeta; + public LiveData getMeta() { + return mMeta; } - private MutableLiveData> mAbilities; - public LiveData> getAbilities() { - return mAbilities; + private MutableLiveData mName; + public LiveData getName() { + return mName; + } + private MutableLiveData mSavingThrows; + public LiveData getSavingThrows() { + return mSavingThrows; + } + private MutableLiveData mSenses; + public LiveData getSenses() { + return mSenses; + } + private MutableLiveData mSkills; + public LiveData getSkills() { + return mSkills; + } + private MutableLiveData mSpeed; + public LiveData getSpeed() { + return mSpeed; + } + private MutableLiveData mStrength; + public LiveData getStrength() { + return mStrength; + } + private MutableLiveData mWisdom; + public LiveData getWisdom() { + return mWisdom; } private Monster mMonster; public void setMonster(Monster monster) { mMonster = monster; - mName.setValue(mMonster.getName()); - mMeta.setValue(mMonster.getMeta()); + + mAbilities.setValue(mMonster.getAbilityDescriptions()); + mActions.setValue(mMonster.getActionDescriptions()); mArmorClass.setValue(mMonster.getArmorClass()); + mChallenge.setValue(mMonster.getChallengeRatingDescription()); + mCharisma.setValue(monster.getCharismaDescription()); + mConditionImmunities.setValue(mMonster.getConditionImmunitiesDescription()); + mConstitution.setValue(monster.getConstitutionDescription()); + mDamageImmunities.setValue(mMonster.getDamageImmunitiesDescription()); + mDamageResistances.setValue(mMonster.getDamageResistancesDescription()); + mDamageVulnerabilities.setValue(mMonster.getDamageVulnerabilitiesDescription()); + mDexterity.setValue(monster.getDexterityDescription()); mHitPoints.setValue(mMonster.getHitPoints()); + mIntelligence.setValue(monster.getIntelligenceDescription()); + mLanguages.setValue(mMonster.getLanguagesDescription()); + mMeta.setValue(mMonster.getMeta()); + mName.setValue(mMonster.getName()); + mSavingThrows.setValue(monster.getSavingThrowsDescription()); + mSenses.setValue(monster.getSensesDescription()); + mSkills.setValue(monster.getSkillsDescription()); mSpeed.setValue(mMonster.getSpeedText()); mStrength.setValue(monster.getStrengthDescription()); - mDexterity.setValue(monster.getDexterityDescription()); - mConstitution.setValue(monster.getConstitutionDescription()); - mIntelligence.setValue(monster.getIntelligenceDescription()); mWisdom.setValue(monster.getWisdomDescription()); - mCharisma.setValue(monster.getCharismaDescription()); - mSavingThrows.setValue(monster.getSavingThrowsDescription()); - mSkills.setValue(monster.getSkillsDescription()); - mDamageVulnerabilities.setValue(mMonster.getDamageVulnerabilitiesDescription()); - mDamageResistances.setValue(mMonster.getDamageResistancesDescription()); - mDamageImmunities.setValue(mMonster.getDamageImmunitiesDescription()); - mConditionImmunities.setValue(mMonster.getConditionImmunitiesDescription()); - mSenses.setValue(monster.getSensesDescription()); - mLanguages.setValue(mMonster.getLanguagesDescription()); - mChallenge.setValue(mMonster.getChallengeRatingDescription()); - mAbilities.setValue(mMonster.getAbilityDescriptions()); } } \ 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 7aa2002..f639a4d 100644 --- a/app/src/main/res/layout/fragment_monster.xml +++ b/app/src/main/res/layout/fragment_monster.xml @@ -437,5 +437,48 @@ app:layout_constraintTop_toBottomOf="@+id/challenge" tools:text="Damage Vulnerabilities" /> + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 4ec10de..ba4a8cf 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -1,16 +1,17 @@ - MonsterCards - Dashboard - Search - Collections - Library Search + Actions + MonsterCards + CHA + CON + DEX + INT Query section divider STR - DEX - CON - INT + Collections + Dashboard + Library + Search WIS - CHA \ No newline at end of file