Adds actions to monster cards.

This commit is contained in:
2020-09-01 23:59:12 -07:00
parent db670f3340
commit cbc4fd0389
6 changed files with 242 additions and 112 deletions

View File

@@ -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;
}
}

View File

@@ -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<String> getActionDescriptions() {
ArrayList<String> actions = new ArrayList<>();
for (Action action : getActions()) {
actions.add(getPlaceholderReplacedText(String.format("__%s__ %s", action.getName(), action.getDescription())));
}
return actions;
}
private ArrayList<Action> mActions;
public List<Action> getActions() {
return mActions;
}
public void addAction(Action ability) {
mActions.add(ability);
}
public void removeAction(Action ability) {
mActions.remove(ability);
}
public void clearActions() {
mActions.clear();
}
}

View File

@@ -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<List<String>>() {
@Override
public void onChanged(List<String> 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;
}
}

View File

@@ -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<String>());
mActions = new MutableLiveData<>();
mActions.setValue(new ArrayList<String>());
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<String>());
}
private MutableLiveData<String> mName;
public LiveData<String> getName() {
return mName;
private MutableLiveData<List<String>> mAbilities;
public LiveData<List<String>> getAbilities() {
return mAbilities;
}
private MutableLiveData<String> mMeta;
public LiveData<String> getMeta() {
return mMeta;
private MutableLiveData<List<String>> mActions;
public LiveData<List<String>> getActions() {
return mActions;
}
private MutableLiveData<String> mArmorClass;
public LiveData<String> getArmorClass() {
return mArmorClass;
}
private MutableLiveData<String> mHitPoints;
public LiveData<String> getHitPoints() {
return mHitPoints;
}
private MutableLiveData<String> mSpeed;
public LiveData<String> getSpeed() {
return mSpeed;
}
private MutableLiveData<String> mStrength;
public LiveData<String> getStrength() {
return mStrength;
}
private MutableLiveData<String> mDexterity;
public LiveData<String> getDexterity() {
return mDexterity;
}
private MutableLiveData<String> mConstitution;
public LiveData<String> getConstitution() {
return mConstitution;
}
private MutableLiveData<String> mIntelligence;
public LiveData<String> getIntelligence() {
return mIntelligence;
}
private MutableLiveData<String> mWisdom;
public LiveData<String> getWisdom() {
return mWisdom;
private MutableLiveData<String> mChallenge;
public LiveData<String> getChallenge() {
return mChallenge;
}
private MutableLiveData<String> mCharisma;
public LiveData<String> getCharisma() {
return mCharisma;
}
private MutableLiveData<String> mSavingThrows;
public LiveData<String> getSavingThrows() {
return mSavingThrows;
private MutableLiveData<String> mConditionImmunities;
public LiveData<String> getConditionImmunities() {
return mConditionImmunities;
}
private MutableLiveData<String> mSkills;
public LiveData<String> getSkills() {
return mSkills;
}
private MutableLiveData<String> mDamageVulnerabilities;
public LiveData<String> getDamageVulnerabilities() {
return mDamageVulnerabilities;
private MutableLiveData<String> mConstitution;
public LiveData<String> getConstitution() {
return mConstitution;
}
private MutableLiveData<String> mDamageResistances;
public LiveData<String> getDamageResistances() {
@@ -121,50 +95,84 @@ public class MonsterViewModel extends ViewModel {
public LiveData<String> getDamageImmunities() {
return mDamageImmunities;
}
private MutableLiveData<String> mConditionImmunities;
public LiveData<String> getConditionImmunities() {
return mConditionImmunities;
private MutableLiveData<String> mDamageVulnerabilities;
public LiveData<String> getDamageVulnerabilities() {
return mDamageVulnerabilities;
}
private MutableLiveData<String> mSenses;
public LiveData<String> getSenses() {
return mSenses;
private MutableLiveData<String> mDexterity;
public LiveData<String> getDexterity() {
return mDexterity;
}
private MutableLiveData<String> mHitPoints;
public LiveData<String> getHitPoints() {
return mHitPoints;
}
private MutableLiveData<String> mIntelligence;
public LiveData<String> getIntelligence() {
return mIntelligence;
}
private MutableLiveData<String> mLanguages;
public LiveData<String> getLanguages() {
return mLanguages;
}
private MutableLiveData<String> mChallenge;
public LiveData<String> getChallenge() {
return mChallenge;
private MutableLiveData<String> mMeta;
public LiveData<String> getMeta() {
return mMeta;
}
private MutableLiveData<List<String>> mAbilities;
public LiveData<List<String>> getAbilities() {
return mAbilities;
private MutableLiveData<String> mName;
public LiveData<String> getName() {
return mName;
}
private MutableLiveData<String> mSavingThrows;
public LiveData<String> getSavingThrows() {
return mSavingThrows;
}
private MutableLiveData<String> mSenses;
public LiveData<String> getSenses() {
return mSenses;
}
private MutableLiveData<String> mSkills;
public LiveData<String> getSkills() {
return mSkills;
}
private MutableLiveData<String> mSpeed;
public LiveData<String> getSpeed() {
return mSpeed;
}
private MutableLiveData<String> mStrength;
public LiveData<String> getStrength() {
return mStrength;
}
private MutableLiveData<String> mWisdom;
public LiveData<String> 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());
}
}

View File

@@ -437,5 +437,48 @@
app:layout_constraintTop_toBottomOf="@+id/challenge"
tools:text="Damage Vulnerabilities" />
<TextView
android:id="@+id/label_actions"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginStart="8dp"
android:layout_marginTop="8dp"
android:layout_marginEnd="8dp"
android:layout_marginBottom="8dp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/abilities"
android:text="@string/actions_label" />
<ImageView
android:id="@+id/divider4"
android:layout_width="0dp"
android:layout_height="8dp"
android:layout_marginStart="8dp"
android:layout_marginTop="8dp"
android:layout_marginEnd="8dp"
android:layout_marginBottom="8dp"
android:contentDescription="@string/section_divider"
android:scaleType="fitXY"
android:src="@drawable/ic_section_divider"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/label_actions" />
<!-- Actions -->
<LinearLayout
android:id="@+id/actions"
android:orientation="vertical"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginStart="8dp"
android:layout_marginTop="0dp"
android:layout_marginEnd="8dp"
android:layout_marginBottom="0dp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/divider4"
tools:text="Damage Vulnerabilities" />
</androidx.constraintlayout.widget.ConstraintLayout>
</ScrollView>

View File

@@ -1,16 +1,17 @@
<resources>
<string name="app_name">MonsterCards</string>
<string name="title_dashboard">Dashboard</string>
<string name="title_search">Search</string>
<string name="title_collections">Collections</string>
<string name="title_library">Library</string>
<string name="action_search">Search</string>
<string name="actions_label">Actions</string>
<string name="app_name">MonsterCards</string>
<string name="charisma_abbreviation">CHA</string>
<string name="constitution_abbreviation">CON</string>
<string name="dexterity_abbreviation">DEX</string>
<string name="intelligence_abbreviation">INT</string>
<string name="label_search_query">Query</string>
<string name="section_divider">section divider</string>
<string name="strength_abbreviation">STR</string>
<string name="dexterity_abbreviation">DEX</string>
<string name="constitution_abbreviation">CON</string>
<string name="intelligence_abbreviation">INT</string>
<string name="title_collections">Collections</string>
<string name="title_dashboard">Dashboard</string>
<string name="title_library">Library</string>
<string name="title_search">Search</string>
<string name="wisdom_abbreviation">WIS</string>
<string name="charisma_abbreviation">CHA</string>
</resources>