@@ -95,7 +95,7 @@ size, creatureType, subtype, monsterAlignment(),
95
95
speed (Tools5eFields .speed .getFrom (rootNode )),
96
96
abilityScores ,
97
97
monsterSavesAndSkills (),
98
- joinAndReplace ( rootNode , "senses" ),
98
+ linkedSenses ( ),
99
99
intOrDefault (rootNode , "passive" , 10 ),
100
100
immuneResist (),
101
101
gear (),
@@ -528,6 +528,29 @@ TraitDescription traitDescription(JsonNode source, MonsterFields field, String t
528
528
}
529
529
}
530
530
531
+ String linkedSenses () {
532
+ JsonNode node = MonsterFields .senses .getFrom (rootNode );
533
+ if (node == null || node .isNull ()) {
534
+ return "" ;
535
+ }
536
+ if (node .isTextual ()) {
537
+ return linkifySense (node .asText ());
538
+ }
539
+ List <String > list = new ArrayList <>();
540
+ for (JsonNode senseNode : iterableElements (node )) {
541
+ list .add (linkifySense (senseNode .asText ()));
542
+ }
543
+ return String .join (", " , list );
544
+ }
545
+
546
+ String linkifySense (String sense ) {
547
+ int pos = sense .indexOf (" " ); // find first space
548
+ if (pos < 0 ) {
549
+ return linkify (Tools5eIndexType .sense , sense );
550
+ }
551
+ return replaceText ("{@sense %s}%s" .formatted (sense .substring (0 , pos ), sense .substring (pos )));
552
+ }
553
+
531
554
List <String > gear () {
532
555
final List <MonsterFields > gearFields = List .of (
533
556
MonsterFields .gear , MonsterFields .attachedItems );
0 commit comments