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