Skip to content

Commit

Permalink
🐛 Fix vulnerabilities/resistances; Related to #232
Browse files Browse the repository at this point in the history
- Linkify conditions to resolve custom variants like "dazed|FleeMortals"
  • Loading branch information
ebullient committed Oct 10, 2023
1 parent 0acf9e1 commit 4c26284
Show file tree
Hide file tree
Showing 7 changed files with 63 additions and 27 deletions.
6 changes: 5 additions & 1 deletion docs/dnd5e/ImmuneResist.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ This data object provides a default mechanism for creating a marked up string ba

## Attributes

[conditionImmune](#conditionimmune), [immune](#immune), [resist](#resist), [vulnerable](#vulnerable)
[conditionImmune](#conditionimmune), [immune](#immune), [present](#present), [resist](#resist), [vulnerable](#vulnerable)


### conditionImmune
Expand All @@ -17,6 +17,10 @@ Comma-separated string of creature condition immunities (if present).

Comma-separated string of creature damage immunities (if present).

### present

True if immunities or resistances are present (otherwise false)

### resist

Comma-separated string of creature damage resistances (if present).
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -79,7 +79,7 @@ default boolean booleanOrDefault(JsonNode source, boolean value) {
}

default boolean existsIn(JsonNode source) {
if (source == null || !source.isObject()) {
if (source == null || source.isNull()) {
return false;
}
return source.has(this.nodeName());
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -223,10 +223,10 @@ String listPrerequisites() {

ImmuneResist immuneResist() {
return new ImmuneResist(
collectImmunities("vulnerable"),
collectImmunities("resist"),
collectImmunities("immune"),
collectImmunities("conditionImmune"));
collectImmunities(rootNode, VulnerabilityFields.vulnerable),
collectImmunities(rootNode, VulnerabilityFields.resist),
collectImmunities(rootNode, VulnerabilityFields.immune),
collectImmunities(rootNode, VulnerabilityFields.conditionImmune));
}

AbilityScores abilityScores() {
Expand Down Expand Up @@ -401,27 +401,33 @@ ImageRef getToken() {
return null;
}

String collectImmunities(String field) {
if (rootNode.has(field) && rootNode.get(field).isArray()) {
String collectImmunities(JsonNode fromNode, VulnerabilityFields field) {
if (field.existsIn(fromNode)) { // filter out null elements
List<String> immunities = new ArrayList<>();
StringBuilder separator = new StringBuilder();
rootNode.withArray(field).forEach(immunity -> {
if (immunity.isTextual()) {
immunities.add(immunity.asText());
} else {
StringBuilder str = new StringBuilder();
str.append(joinAndReplace(immunity, field));
if (immunity.has("note")) {
str.append(" ")
.append(immunity.get("note").asText());
}

if (separator.length() == 0) {
for (JsonNode value : field.iterateArrayFrom(fromNode)) {
if (value.isTextual()) { // damage or condition type
immunities.add(textValue(field, value.asText()));
} else if (VulnerabilityFields.special.existsIn(value)) { // "special"
immunities.add(VulnerabilityFields.special.replaceTextFrom(value, this)
.replace("see (below|above)", "see details"));
} else { // conditional
List<String> allText = new ArrayList<>();
if (VulnerabilityFields.preNote.existsIn(value)) {
allText.add(VulnerabilityFields.preNote.replaceTextFrom(value, this));
}
allText.add(collectImmunities(value, field));
if (VulnerabilityFields.note.existsIn(value)) {
allText.add(VulnerabilityFields.note.replaceTextFrom(value, this));
}
if (separator.length() == 0 && !allText.isEmpty()) {
separator.append("; ");
immunities.add(String.join(" ", allText));
}
immunities.add(str.toString());
}
});
}

if (separator.length() == 0) {
separator.append(", ");
}
Expand All @@ -430,6 +436,13 @@ String collectImmunities(String field) {
return null;
}

private String textValue(VulnerabilityFields field, String text) {
if (field == VulnerabilityFields.conditionImmune) {
return linkify(Tools5eIndexType.condition, text);
}
return text;
}

Collection<NamedText> collectSortedTraits(JsonNode array) {
// gather traits into a sorted array
ArrayNode sorted = Tui.MAPPER.createArrayNode();
Expand Down Expand Up @@ -574,21 +587,32 @@ protected Tools5eQuteNote buildQuteNote() {
return null;
}

enum VulnerabilityFields implements JsonNodeReader {
cond,
conditionImmune,
immune,
note,
preNote,
resist,
special,
vulnerable,
}

enum PrereqFields implements JsonNodeReader {
ability,
background,
feat,
feature,
item,
level,
other,
pact,
patron,
prerequisite,
psionics,
proficiency,
psionics,
race,
spell,
spellcasting,
item,
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,14 @@ public ImmuneResist(String vulnerable, String resist, String immune, String cond
this.conditionImmune = conditionImmune;
}

/** True if immunities or resistances are present (otherwise false) */
public boolean isPresent() {
return isPresent(vulnerable)
&& isPresent(resist)
&& isPresent(immune)
&& isPresent(conditionImmune);
}

@Override
public String toString() {
List<String> parts = new ArrayList<>();
Expand Down
2 changes: 1 addition & 1 deletion src/main/resources/templates/tools5e/monster2md.txt
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@ title: {resource.name}{#if resource.token}
- **Saving Throws** {#if resource.savingThrows }{resource.savingThrows}{#else}⏤{/if}
- **Skills** {#if resource.skills }{resource.skills}{#else}⏤{/if}
- **Senses** {#if resource.senses }{resource.senses}, {/if}passive Perception {resource.passive}
{#if resource.immuneResist }
{#if resource.immuneResist && resource.immuneResist.present }
{resource.immuneResist}
{/if}
- **Languages** {#if resource.languages }{resource.languages}{#else}—{/if}
Expand Down
2 changes: 1 addition & 1 deletion src/main/resources/templates/tools5e/object2md.txt
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ title: {resource.name}{#if resource.token}

{#if resource.senses }
- **Senses** {resource.senses}
{/if}{#if resource.immuneResist }
{/if}{#if resource.immuneResist && resource.immuneResist.present }
{resource.immuneResist}
{/if}{#if resource.action}

Expand Down
4 changes: 2 additions & 2 deletions src/main/resources/templates/tools5e/vehicle2md.txt
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ title: {resource.name}{#if resource.token}
|:---:|:---:|:---:|:---:|:---:|:---:|
|{resource.scores}|

{/if}{#if resource.immuneResist }
{/if}{#if resource.immuneResist && resource.immuneResist.present }
{resource.immuneResist}
{/if}{#if resource.text }

Expand Down Expand Up @@ -81,7 +81,7 @@ title: {resource.name}{#if resource.token}
|:---:|:---:|:---:|:---:|:---:|:---:|
|{resource.scores}|

{/if}{#if resource.immuneResist }
{/if}{#if resource.immuneResist && resource.immuneResist.present }
{resource.immuneResist}
{/if}{#if resource.action}

Expand Down

0 comments on commit 4c26284

Please sign in to comment.