Skip to content

Commit 4bff3e8

Browse files
TinyDragonEggclaude
andcommitted
v1.1.8: Fix skill proficiency path and add language removal
- Changed skill proficiency from .proficient to .value (correct property) - Added removeLanguageFromActor method to properly remove languages - Languages are now removed when cultural origin is changed - Fixed skill not being applied despite logs showing it was set Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
1 parent 20af92c commit 4bff3e8

2 files changed

Lines changed: 51 additions & 5 deletions

File tree

module.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
"id": "aspects-dual-backgrounds",
33
"title": "Aspects of Verun: Dual Backgrounds",
44
"description": "Enables dual background system for Aspects of Verun setting - choose one Profession background and one Cultural Origin background",
5-
"version": "1.1.7",
5+
"version": "1.1.8",
66
"compatibility": {
77
"minimum": "11",
88
"verified": "13"
@@ -48,7 +48,7 @@
4848
],
4949
"url": "https://github.com/TinyDragonEgg/testmodule",
5050
"manifest": "https://raw.githubusercontent.com/TinyDragonEgg/testmodule/main/module.json",
51-
"download": "https://github.com/TinyDragonEgg/testmodule/releases/download/1.1.7/module.zip",
51+
"download": "https://github.com/TinyDragonEgg/testmodule/releases/download/1.1.8/module.zip",
5252
"license": "MIT",
5353
"readme": "https://raw.githubusercontent.com/TinyDragonEgg/testmodule/main/README.md"
5454
}

scripts/dual-backgrounds.js

Lines changed: 49 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -322,14 +322,14 @@ class DualBackgroundsManager {
322322

323323
// Remove old skill proficiency
324324
if (oldCulturalOrigin && allOrigins[oldCulturalOrigin]?.skill) {
325-
const oldSkillPath = `system.skills.${allOrigins[oldCulturalOrigin].skill}.proficient`;
325+
const oldSkillPath = `system.skills.${allOrigins[oldCulturalOrigin].skill}.value`;
326326
foundry.utils.setProperty(changes, oldSkillPath, 0);
327327
this.log(`Removing old skill: ${allOrigins[oldCulturalOrigin].skill}`);
328328
}
329329

330330
// Add new skill proficiency
331331
if (newCulturalOrigin && allOrigins[newCulturalOrigin]?.skill) {
332-
const skillPath = `system.skills.${allOrigins[newCulturalOrigin].skill}.proficient`;
332+
const skillPath = `system.skills.${allOrigins[newCulturalOrigin].skill}.value`;
333333
foundry.utils.setProperty(changes, skillPath, 1);
334334
this.log(`Adding skill proficiency in update: ${allOrigins[newCulturalOrigin].skill} at path ${skillPath}`);
335335
this.log(`Changes object after skill set:`, changes);
@@ -348,7 +348,7 @@ class DualBackgroundsManager {
348348
static async applyCulturalOriginFeatures(actor, newOrigin, oldOrigin) {
349349
this.log(`Applying cultural origin features: ${newOrigin} (was: ${oldOrigin})`);
350350

351-
// Remove old cultural origin features and equipment
351+
// Remove old cultural origin features, equipment, and language
352352
if (oldOrigin) {
353353
const oldItems = actor.items.filter(item =>
354354
item.flags?.[this.ID]?.isCulturalOrigin
@@ -358,6 +358,12 @@ class DualBackgroundsManager {
358358
await actor.deleteEmbeddedDocuments('Item', oldItems.map(i => i.id));
359359
this.log(`Removed ${oldItems.length} old cultural origin items`);
360360
}
361+
362+
// Remove old language
363+
const allOrigins = this.getAllCulturalOrigins();
364+
if (oldOrigin && allOrigins[oldOrigin]?.languages) {
365+
await this.removeLanguageFromActor(actor, allOrigins[oldOrigin].languages);
366+
}
361367
}
362368

363369
// Add new cultural origin
@@ -613,6 +619,46 @@ class DualBackgroundsManager {
613619
}
614620
}
615621

622+
/**
623+
* Remove a language from an actor
624+
*/
625+
static async removeLanguageFromActor(actor, languagesToRemove) {
626+
if (!languagesToRemove || languagesToRemove.length === 0) return;
627+
628+
try {
629+
// Get fresh actor data
630+
const currentActor = game.actors.get(actor.id);
631+
const currentLanguages = currentActor.system.traits?.languages?.value;
632+
633+
if (!currentLanguages) return;
634+
635+
let updatedLanguages = [];
636+
637+
// Convert language names to keys
638+
const languageKeysToRemove = languagesToRemove.map(lang => lang.toLowerCase());
639+
640+
if (currentLanguages instanceof Set) {
641+
// v5.2.4+ uses Set
642+
updatedLanguages = Array.from(currentLanguages).filter(lang =>
643+
!languageKeysToRemove.includes(lang) && !languageKeysToRemove.includes(lang.toLowerCase())
644+
);
645+
this.log(`Removed languages from Set:`, languageKeysToRemove);
646+
} else if (Array.isArray(currentLanguages)) {
647+
// Older versions use Array
648+
updatedLanguages = currentLanguages.filter(lang =>
649+
!languageKeysToRemove.includes(lang) && !languageKeysToRemove.includes(lang.toLowerCase())
650+
);
651+
this.log(`Removed languages from Array:`, languageKeysToRemove);
652+
}
653+
654+
await currentActor.update({ 'system.traits.languages.value': updatedLanguages });
655+
this.log(`Successfully removed languages:`, languagesToRemove);
656+
} catch (err) {
657+
this.log('Error removing languages:', err);
658+
console.error(err);
659+
}
660+
}
661+
616662
/**
617663
* Show language selection dialog
618664
*/

0 commit comments

Comments
 (0)