Compare commits

...

18 Commits

Author SHA1 Message Date
005452eaf0 Fix creation de perso 2024-09-08 18:09:10 +02:00
e801cfe06b Fix creation de perso 2024-09-08 18:08:12 +02:00
f7fec1fba2 Fix compendium issue 2024-09-06 22:40:54 +02:00
f6202d70e0 Limit v12 version 2024-09-06 13:15:57 +02:00
43312b86db Alignement sur WFRP v8 2024-09-05 21:39:33 +02:00
a01fec2367 Prepare FR module for v8 2024-09-05 17:26:05 +02:00
c0e42f7f59 New release with effects fixes 2024-06-11 07:57:54 +02:00
f0a0b055ea Merge pull request 'Fix WoM effects for robes and enchanted staff' (#102) from pallando/foundryvtt-wh4-lang-fr-fr:fixes into v10
Reviewed-on: #102
2024-06-11 07:52:17 +02:00
c51877f945 Fix table import 2024-06-09 17:08:53 +02:00
e7a56e15a2 Fix EOL for core tables 2024-06-08 01:51:43 +02:00
35ae4012f6 Fix end of lines 2024-06-08 01:45:05 +02:00
3cec04ae8c Put missing 'T' in table 2024-06-08 00:41:59 +02:00
b7bb897a46 Fix WoM effects for robes and enchanted staff 2024-06-08 00:27:35 +02:00
4ebaad012b Merg scripts properly 2024-06-07 07:09:07 +02:00
8a5c62fafd Fix v12 warnings 2024-06-06 22:46:40 +02:00
2c5ff15830 Sync to v7.2.0 2024-06-06 22:07:28 +02:00
e46d68b315 Sync to v7.2.0 2024-06-06 22:06:52 +02:00
da6fe66887 Sync to v7.2.0 2024-06-06 21:09:27 +02:00
416 changed files with 5326 additions and 274 deletions

View File

@ -9382,6 +9382,10 @@
}, },
"label": "Items (Livre de Base)", "label": "Items (Livre de Base)",
"mapping": { "mapping": {
"effects": {
"converter": "process_effects",
"path": "effects"
},
"careergroup": { "careergroup": {
"converter": "career_careergroup", "converter": "career_careergroup",
"path": "system.careergroup.value" "path": "system.careergroup.value"

View File

@ -4,7 +4,7 @@
"Career Tables": "Table des Carrières", "Career Tables": "Table des Carrières",
"Character Creation": "Création de Personnage", "Character Creation": "Création de Personnage",
"Core Rulebook": "Livre de Base", "Core Rulebook": "Livre de Base",
"Corruption & Mutation Tables": "ables de Corruption & Mutations", "Corruption & Mutation Tables": "Tables de Corruption & Mutations",
"Critical Hit Tables": "Tables de Critiques", "Critical Hit Tables": "Tables de Critiques",
"GM Booklet": "Livret du MJ", "GM Booklet": "Livret du MJ",
"Hit Location": "Table de Localisation", "Hit Location": "Table de Localisation",

166
fr.json
View File

@ -365,7 +365,11 @@
"ITEM.Maximum":"Maximum", "ITEM.Maximum":"Maximum",
"ITEM.RandomVortex":"Vortex aléatoire", "ITEM.RandomVortex":"Vortex aléatoire",
"ITEM.Ritual":"Rituel", "ITEM.Ritual":"Rituel",
"ITEM.Standard":"Standard",
"ITEM.TestSkill":"Test de compétence",
"ITEM.Roles":"Roles",
"ITEM.VitalRoles":"Roles vitaux",
"BleedCrit":"L'hémorrage de <b>{name}</b> coagule un peu : 1 Hémorragie peut-être retirée.", "BleedCrit":"L'hémorrage de <b>{name}</b> coagule un peu : 1 Hémorragie peut-être retirée.",
"BleedFail":"<b>{name}</b> meur de sa perte de sang !", "BleedFail":"<b>{name}</b> meur de sa perte de sang !",
"BleedRoll":"Jet d'Hémmoragie", "BleedRoll":"Jet d'Hémmoragie",
@ -599,6 +603,9 @@
"Law": "Loi", "Law": "Loi",
"SinReduced":"Péché réduit de 1", "SinReduced":"Péché réduit de 1",
"TargetingCancelled":"Ciblage échoué: Un Test opposé est déja en cours", "TargetingCancelled":"Ciblage échoué: Un Test opposé est déja en cours",
"Halved":"Divisé par 2",
"SkillsOr":"ou",
"TestPlaceholder":"e.g. Compétence d'arme, Projectiles (Poudre Noire), Résistance",
"Career Selector":"Selecteur de Carrière", "Career Selector":"Selecteur de Carrière",
"Completed":"Completé", "Completed":"Completé",
@ -839,7 +846,15 @@
"CHARGEN.Trappings.Remove":"Supprimer", "CHARGEN.Trappings.Remove":"Supprimer",
"CHARGEN.Career.LoadingCareers":"Chargement des carrières...", "CHARGEN.Career.LoadingCareers":"Chargement des carrières...",
"CHARGEN.Message.RerolledDuplicateTalent":"<p>Relance du Talent dupliqué: <b>{rolled}</b>!</p>", "CHARGEN.Message.RerolledDuplicateTalent":"<p>Relance du Talent dupliqué: <b>{rolled}</b>!</p>",
"CHARGEN.Message.ReplacedTalent":"<p>Remplacement de <b>{talent}</b> par <b>{replacement}</b>!</p>",
"CHARGEN.SkillsTalents.ReplaceTalentDialog.Content":"<p>Voulez vous remplacer {talent} avec {replacement}?</p>",
"CHARGEN.SkillsTalents.ReplaceTalentDialog.Title":"Remplacer un Talent",
"CHARGEN.Message.Income":"<p><b>Revenu:</b> {quantity} {name}</p>",
"CHARGEN.SkillsTalents.Traits":"Traits",
"CHARGEN.Species.ExtraSpeciesOptions":"Options spéciales des espèces",
"CHARGEN.Species.RandomTalents":"{num} Talents aléatoires",
"CHARGEN.Trappings.RollIncome":"Lancer pour le Revenu",
"CAREER.DifferentClass": "Entrée dans une nouvelle Classe", "CAREER.DifferentClass": "Entrée dans une nouvelle Classe",
"CAREER.LeaveIncomplete": "Départ d'une carrière incomplète", "CAREER.LeaveIncomplete": "Départ d'une carrière incomplète",
"CAREER.LeaveComplete": "Départ d'une carrière complétée", "CAREER.LeaveComplete": "Départ d'une carrière complétée",
@ -920,6 +935,8 @@
"DIALOG.MemorizeSpell":"Mémoriser un Sort", "DIALOG.MemorizeSpell":"Mémoriser un Sort",
"DIALOG.MemorizeSpellContent":"Mémoriser ce sort vous coutera {xp} XP.", "DIALOG.MemorizeSpellContent":"Mémoriser ce sort vous coutera {xp} XP.",
"DIALOG.ErrorMustSelectItem":"Au moins 1 item doit être selectionné", "DIALOG.ErrorMustSelectItem":"Au moins 1 item doit être selectionné",
"DIALOG.ChooseActor":"Choisissez l'Acteur pour réaliser le test",
"DIALOG.ItemDialog":"Fenêtre d'Item",
"CHAT.CareerChoose" : "Choisissez votre carrière", "CHAT.CareerChoose" : "Choisissez votre carrière",
"CHAT.DamageError" : "Erreur de calcul des dégâts:", "CHAT.DamageError" : "Erreur de calcul des dégâts:",
@ -1073,7 +1090,17 @@
"CHAT.ApplyHack":"Appliquer Hack", "CHAT.ApplyHack":"Appliquer Hack",
"CHAT.ModifiersBreakdown":"Liste des modificateurs", "CHAT.ModifiersBreakdown":"Liste des modificateurs",
"CHAT.Place":"Placer", "CHAT.Place":"Placer",
"CHAT.AttackerTooSmallDamage":"Attacker is too small to damage this vehicle",
"CHAT.CrewTest":"Test d'équipage",
"CHAT.CrewTestVital":"Test d'équipage (Vital)",
"CHAT.NoCrewWithRole":"Aucun role d'équipage!",
"CHAT.RoleNotFound":"Le role <strong>{role}</strong> n'a pas été trouvé!",
"CHAT.TotalSL":"DR Totaux",
"CHAT.VehicleTBTooltipMultiply":"{number} × BE",
"CHAT.VehicleTBTooltipSubtract":"BE - {number}",
"CHAT.Vital":"Vital",
"CHAT.DiseaseRollError":"Une erreur s'est produite lors du jet d'incubation ou de durée de la maladie.",
"Error.SpeciesSkills" : "Impossible d'ajouter des compétences pour les races", "Error.SpeciesSkills" : "Impossible d'ajouter des compétences pour les races",
"Error.SpeciesTalents" : "Impossible d'ajouter des talents pour les races", "Error.SpeciesTalents" : "Impossible d'ajouter des talents pour les races",
"Error.CriticalWound" : "Erreur lors de l'application des blessures", "Error.CriticalWound" : "Erreur lors de l'application des blessures",
@ -1112,6 +1139,10 @@
"ERROR.PrayerAoEOvercast":"La zone d'effet des Prières ne peut être augemntée", "ERROR.PrayerAoEOvercast":"La zone d'effet des Prières ne peut être augemntée",
"ERROR.AMMO_MODS":"La munition '{type}' ne peut pas être trouvée. Consultez la console (F12) pour les détails`", "ERROR.AMMO_MODS":"La munition '{type}' ne peut pas être trouvée. Consultez la console (F12) pour les détails`",
"ERROR.CannotUseArm":"Bras non utilisable!", "ERROR.CannotUseArm":"Bras non utilisable!",
"ERROR.NoAvailableActors":"Aucun acteur disponible pour le choix!",
"ERROR.NoOwnedCrew":"Vous ne contrôlez aucun membre d'équipage qui possède ce rôle",
"ERROR.StandardTraitsOnVehicle":"Impossible d'ajouter des Trais standards à un Véhicule",
"ERROR.VehicleTraitsOnStandard":"Impossible d'ajouter des Traits de Véhicule à un Acteur",
"WARNING.Target":"Sélectionnez une cible pour appliquer l'effet.", "WARNING.Target":"Sélectionnez une cible pour appliquer l'effet.",
"WARNING.ActorTest":"Les classes de jet d'acteur ne sont plus utilisées. Appelez désormais `roll()` sur l'objet lui-même.", "WARNING.ActorTest":"Les classes de jet d'acteur ne sont plus utilisées. Appelez désormais `roll()` sur l'objet lui-même.",
@ -1735,6 +1766,23 @@
"NAME.Trade":"Métier", "NAME.Trade":"Métier",
"NAME.Arcane":"Arcane", "NAME.Arcane":"Arcane",
"NAME.Lingering":"Persistant", "NAME.Lingering":"Persistant",
"NAME.FearExtendedTest":"Test étendu de Peur",
"NAME.ArcaneMagic":"Magie des Arcanes",
"NAME.ChaosMagic":"Magie du Chaos",
"NAME.Distract":"Distraire",
"NAME.Ethereal":"Ethéré",
"NAME.FastHands":"Mains agiles",
"NAME.Frenzy":"Frénésie",
"NAME.FuriousAssault":"Assaut féroce",
"NAME.MagicResistanceTalent":"Résistance à la Magie",
"NAME.MagicResistanceTrait":"Résistance à la Magie",
"NAME.MagicalSense":"Sens de la Magie",
"NAME.PettyMagic":"Magie Mineure",
"NAME.Schemer":"Intrigant",
"NAME.SeaLegsTalent":"Pied marin",
"NAME.SecondSight":"Seconde vue",
"NAME.WarWizard":"Mage de guerre",
"NAME.Witch":"Sorcier!",
"SPEC.Tiny" : "Minuscule", "SPEC.Tiny" : "Minuscule",
"SPEC.Little" : "Très petite", "SPEC.Little" : "Très petite",
@ -1744,6 +1792,19 @@
"SPEC.Enormous" : "Enorme", "SPEC.Enormous" : "Enorme",
"SPEC.Monstrous" : "Monstrueuse", "SPEC.Monstrous" : "Monstrueuse",
"SPEC.Vehicle": "Véhicule", "SPEC.Vehicle": "Véhicule",
"SPEC.Any":"Any",
"SPEC.Cathayan":"Cathayan",
"SPEC.Eltharin":"Elthárin",
"SPEC.Hearing":"Ouie",
"SPEC.Horse":"Cheval",
"SPEC.Lute":"Luth",
"SPEC.Rural":"Rural",
"SPEC.Sight":"Vue",
"SPEC.Sing":"Chant",
"SPEC.Singing":"Chanter",
"SPEC.Smell":"Odorat",
"SPEC.Underground":"Sous-terrain",
"SPEC.Urban":"Urbain",
"SPELL.Lore":"Domaine:", "SPELL.Lore":"Domaine:",
@ -1852,6 +1913,7 @@
"SHEET.Target":"Cible", "SHEET.Target":"Cible",
"SHEET.ToggleTraits":"Basculer le(s) Trait(s) de Creature", "SHEET.ToggleTraits":"Basculer le(s) Trait(s) de Creature",
"SHEET.SortItems":"Trier les items", "SHEET.SortItems":"Trier les items",
"SHEET.CannotDeleteCrewEffect":"Cet effet provient d'un véhicule dont cet acteur est membre d'équipage, et doit donc être effacé depuis le véhicule.",
"DISEASE.IncubationFinished" : "Incubation de la maladie {disease} terminée. ", "DISEASE.IncubationFinished" : "Incubation de la maladie {disease} terminée. ",
@ -2060,6 +2122,44 @@
"VEHICLE.NoActorOnBoard": "Le personnage qui vous est assigné n'est pas dans le véhicule", "VEHICLE.NoActorOnBoard": "Le personnage qui vous est assigné n'est pas dans le véhicule",
"VEHICLE.TestNotPermitted": "Vous n'avez pas la permission de réaliser ce test", "VEHICLE.TestNotPermitted": "Vous n'avez pas la permission de réaliser ce test",
"VEHICLE.ft":"ft", "VEHICLE.ft":"ft",
"VEHICLE.CollisionRating":"Mesure de Collision",
"VEHICLE.Crew":"Equipage",
"VEHICLE.CrewTests":"Tests d'équipage",
"VEHICLE.Custom":"Custom",
"VEHICLE.Enabled":"Activé",
"VEHICLE.Man":"Man.",
"VEHICLE.ManannsMood":"Manann's Mood",
"VEHICLE.Morale":"Moral",
"VEHICLE.MoraleEffects":"Effet du moral",
"VEHICLE.Oars":"Rames",
"VEHICLE.PrimaryMode":"Mode primaire",
"VEHICLE.Sail":"Voile",
"VEHICLE.SetValue":"Valeur",
"VEHICLE.SetValueToolTip":"Positionner une valeur particulière au lieu de lancer.",
"VEHICLE.Sources":"Moral",
"VEHICLE.Starting":"Démarre",
"VEHICLE.Type":"Type de véhicule",
"VEHICLE.WeekLabel":"Label de Semaine",
"VEHICLE.AssignedActors":"Acteur(s) assigné(s)",
"VEHICLE.Change":"Changer",
"VEHICLE.ChooseSkill":"Selectionnez la compétence à utiliser",
"VEHICLE.Delete":"Supprimer ?",
"VEHICLE.HandlingNoPenalty":"Encombrement en dessous du maximum : aucune pénalité.",
"VEHICLE.HandlingPenalty":"Les tests de Maneouvre on un malus de -{penalty} DR.",
"VEHICLE.LabelError":"Entrez un label pour le jet",
"VEHICLE.ManannsMoodRolls":"Jet d'Humeur de Manann",
"VEHICLE.MoraleRolls":"Jet de Moral",
"VEHICLE.Move":"Mouvement de Véhicule",
"VEHICLE.NewRole":"Nouveau role",
"VEHICLE.NoManannsMoodModifiers":"Aucun modificateur d'humeur",
"VEHICLE.NoMoraleModifiers":"Aucun modificateur de moral",
"VEHICLE.NoSkill":"Cet acteur n'a aucune compétence utilisable avec ce role",
"VEHICLE.O":"O",
"VEHICLE.Roles":"Roles ",
"VEHICLE.S":"S",
"VEHICLE.SellCargo":"Vendre la cargaison",
"VEHICLE.VehicleCrew":"Equipage du véhicule",
"VEHICLE.VehicleMorale":"Moral du véhicule",
"CONFIGURE.CalcTokenSize" : "Calculer automatiquement la taille des Tokens", "CONFIGURE.CalcTokenSize" : "Calculer automatiquement la taille des Tokens",
"CONFIGURE.CalcRun" : "Calculer automatiquement la vitesse de course", "CONFIGURE.CalcRun" : "Calculer automatiquement la vitesse de course",
@ -2132,7 +2232,8 @@
"EFFECT.AffectTheSourceOfFear":"Tests affectés par la source de la Peur", "EFFECT.AffectTheSourceOfFear":"Tests affectés par la source de la Peur",
"EFFECT.AffectTheSourceOfFearName":"Tests qui affectent {name}", "EFFECT.AffectTheSourceOfFearName":"Tests qui affectent {name}",
"EFFECT.DeletingEffectItems":"Suppression des items d'effets: {items}", "EFFECT.DeletingEffectItems":"Suppression des items d'effets: {items}",
"EFFECT.BlackpowderShock":"Contre-coup de Poudre Noire",
"GRIEVANCE.Warning1":"Attention", "GRIEVANCE.Warning1":"Attention",
"GRIEVANCE.Warning2":": Cette information est envoyé sur l'espace Github, qui est un espace publique, donc le Tag Discord est préférable. Sinon, contactez moi (MooMan) directement. Si vous avez l'impression que le bug concerne le module FR, contactez LeRatierBretonnier (Discord Foundry FR)", "GRIEVANCE.Warning2":": Cette information est envoyé sur l'espace Github, qui est un espace publique, donc le Tag Discord est préférable. Sinon, contactez moi (MooMan) directement. Si vous avez l'impression que le bug concerne le module FR, contactez LeRatierBretonnier (Discord Foundry FR)",
"GRIEVANCE.Warning3":"Avant de soumettre un rapport de bug", "GRIEVANCE.Warning3":"Avant de soumettre un rapport de bug",
@ -2195,6 +2296,11 @@
"TRADE.Excellent": "Excellente", "TRADE.Excellent": "Excellente",
"TRADE.Topshelf": "Suprême", "TRADE.Topshelf": "Suprême",
"TRADE.NoCargoFound":"Il n'y a pas de cargaison disponible à l'achat à <b>{town}</b>.", "TRADE.NoCargoFound":"Il n'y a pas de cargaison disponible à l'achat à <b>{town}</b>.",
"TRADE.Demand":"Demande",
"TRADE.Maritime":"Maritime",
"TRADE.MerchantTest":"<strong>Test de Marchand</strong>: {SL} DR (Résultat {roll})",
"TRADE.River":"Rivière",
"TRADE.Surplus":"Surplus",
"RANDOMIZER.C":"Ca", "RANDOMIZER.C":"Ca",
"RANDOMIZER.S":"C", "RANDOMIZER.S":"C",
@ -2267,6 +2373,9 @@
"ROLL.HitAnotherEngagedTarget":"<b>Oops! Vous avez touche la mauvaise cible, sélectionnez aléatoirement un personnage et appliquez lui les dommages </b>", "ROLL.HitAnotherEngagedTarget":"<b>Oops! Vous avez touche la mauvaise cible, sélectionnez aléatoirement un personnage et appliquez lui les dommages </b>",
"Rounds":"rounds", "Rounds":"rounds",
"SHEET.NoCareers":"Aucune carrière trouvée", "SHEET.NoCareers":"Aucune carrière trouvée",
"EFFECT.ShooterEngagedError":"Vous ne pouvez réaliser d'attaque à étant engagé, à moins que vous ne sooyez équipé d'une arme avec la qualité Pistolet",
"EffectApplication.RadiusHint":"Rayon du template (Note: si cet effet provient d'un sort, c'est son diamètre actuel)",
"EffectApplication.Type.Crew":"Equipage",
"CHARGEN.AdditionalRandomTalent":"Talent aléatoire additionnel", "CHARGEN.AdditionalRandomTalent":"Talent aléatoire additionnel",
"CHARGEN.Message.RerolledDuplicate":"<p>Relance de Talent dupliqué: <b>{rolled}</b>!</p>", "CHARGEN.Message.RerolledDuplicate":"<p>Relance de Talent dupliqué: <b>{rolled}</b>!</p>",
@ -2342,7 +2451,9 @@
"TYPES.Item.trapping":"Possession", "TYPES.Item.trapping":"Possession",
"TYPES.Item.vehicleMod":"Modification de Véhicule", "TYPES.Item.vehicleMod":"Modification de Véhicule",
"TYPES.Item.weapon":"Arme", "TYPES.Item.weapon":"Arme",
"TYPES.Item.vehicleRole":"Role de Véhicule",
"TYPES.Item.vehicleTest":"Test d'équipage de véhicule",
"Badger": "Blaireau", "Badger": "Blaireau",
"Badgers": "Blaireaux", "Badgers": "Blaireaux",
"Choose one": "A choisir", "Choose one": "A choisir",
@ -2425,5 +2536,48 @@
"Touch": "Toucher", "Touch": "Toucher",
"SOCKET.SendingSocketRequest":"Envoi d'une requête par Socket", "SOCKET.SendingSocketRequest":"Envoi d'une requête par Socket",
"UpdaterTitle":"Mise à jour du contenu {title}" "UpdaterTitle":"Mise à jour du contenu {title}",
"BREAKADOWN.UserEntry":"Saisie utilisateur",
"BEAKDOWN.UserEntry":"Saisie utilisateur",
"BREAKDOWN.AttackerBase":"Base Attaquant",
"BREAKDOWN.Base":"Base",
"BREAKDOWN.Dice":"Dé",
"BREAKDOWN.Ignored":"Ignoré",
"BREAKDOWN.Minimum1":"1 Blessure minimum",
"BREAKDOWN.Moo":"Règles maison de MooMan",
"BREAKDOWN.Multiplier":"Multiplieur",
"BREAKDOWN.OpposedSL":"DR Opposé",
"BREAKDOWN.Partial":"Partiel - Ignore {ignored} ({item})",
"BREAKDOWN.Penetrating":"Pénétrant - Ignore {ignored} ({item})",
"BREAKDOWN.PenetratingMoo":"Pénétrant - Ignore {ignored}",
"BREAKDOWN.ShieldMoo":"Défense échouée - Ignore Shield AP ({ignored})",
"BREAKDOWN.Undamaging":"<strong>Inoffensive</strong>: {originalAP} AP * 2 = {modifiedAP}",
"BREAKDOWN.Weakpoints":"Points faibles - Ignore {ignored} ({item})",
"BREAKDOWN.Zzap":"Zzap! - Ignore {ignored}",
"Heal Wounds": "Soigner les blessures",
"Heal": "Soigner" ,
"Staunch": "Bander",
"Staunch Bleeding Conditions": "Soigner des Hémoragies",
"Acrobatie Equestre": "Acrobatie Equestre",
"No penalty to dodging on horseback": "Pas de pénalité pour esquiver à cheval",
"Suave": "Affable",
"Animal Affinity": "Affinité avec les animaux",
"Ambidextrous": "Ambidextre",
"Pure Soul": "Âme pure",
"Gunner": "Artilleur",
"Artistic": "Artiste",
"Furious Assault": "Assaut furieux",
"Magical Attacks" : "Attaques magiques",
"Daemonic Ward": "Barrière démoniaque",
"Relies on two hands": "Nécessite les deux mains",
"Useless": "Inutile",
"WH":{
"TransferType":{
"Crew":"Equipage"
}
}
} }

View File

@ -8,7 +8,7 @@
} }
], ],
"url": "https://www.uberwald.me/gitea/public/foundryvtt-wh4-lang-fr-fr", "url": "https://www.uberwald.me/gitea/public/foundryvtt-wh4-lang-fr-fr",
"version": "7.1.6", "version": "8.0.3",
"esmodules": [ "esmodules": [
"modules/babele-register.js", "modules/babele-register.js",
"modules/addon-register.js", "modules/addon-register.js",
@ -117,10 +117,10 @@
} }
], ],
"manifest": "https://www.uberwald.me/gitea/public/foundryvtt-wh4-lang-fr-fr/raw/v10/module.json", "manifest": "https://www.uberwald.me/gitea/public/foundryvtt-wh4-lang-fr-fr/raw/v10/module.json",
"download": "https://www.uberwald.me/gitea/public/foundryvtt-wh4-lang-fr-fr/archive/foundryvtt-wh4-lang-fr-7.1.6.zip", "download": "https://www.uberwald.me/gitea/public/foundryvtt-wh4-lang-fr-fr/archive/foundryvtt-wh4-lang-fr-8.0.3.zip",
"id": "wh4-fr-translation", "id": "wh4-fr-translation",
"compatibility": { "compatibility": {
"minimum": "11", "minimum": "12",
"verified": "12" "verified": "12"
}, },
"relationships": { "relationships": {
@ -139,4 +139,4 @@
} }
] ]
} }
} }

View File

@ -1,10 +1,11 @@
/************************************************************************************/ /************************************************************************************/
//import WFRP_Tables from "/systems/wfrp4e/modules/system/tables-wfrp4e.js"; //import WFRP_Tables from "/systems/wfrp4e/modules/system/tables-wfrp4e.js";
import { WH4FRPatchConfig } from "./config-patch.js"; import { WH4FRPatchConfig } from "./config-patch.js";
import {TranslatedCompendium} from "../../babele/script/translated-compendium.js";
/************************************************************************************/ /************************************************************************************/
const _patch_eis = () => { const _patch_eis = () => {
if (game.wfrp4e.config && game.wfrp4e.config.symptoms && game.wfrp4e.config.symptoms["delirium"] ) { if (game.wfrp4e?.config?.symptoms && game.wfrp4e.config.symptoms["delirium"] ) {
game.wfrp4e.config.symptoms["delirium"] = "Délire"; game.wfrp4e.config.symptoms["delirium"] = "Délire";
game.wfrp4e.config.symptomDescriptions["delirium"] = "Votre sensibilité va et vient, avec des moments de clarté remplaçés subitement Your sensibility comes and goes, with moments of clarity replaced suddenly par des accès de délire, des hallucinations et de la terreur. Faites un <b>Test de Force Mentale Intermédiaire (+0)</b> chaque heure, et consultez la table <b><a class='table-click' data-table='delirium'>Délires</a></b> table."; game.wfrp4e.config.symptomDescriptions["delirium"] = "Votre sensibilité va et vient, avec des moments de clarté remplaçés subitement Your sensibility comes and goes, with moments of clarity replaced suddenly par des accès de délire, des hallucinations et de la terreur. Faites un <b>Test de Force Mentale Intermédiaire (+0)</b> chaque heure, et consultez la table <b><a class='table-click' data-table='delirium'>Délires</a></b> table.";
@ -369,7 +370,7 @@ Hooks.on("chatMessage", (html, content, msg) => {
/************************************************************************************/ /************************************************************************************/
/* Additionnal hooks ready */ /* Additionnal hooks ready */
Hooks.once('ready', () => { Hooks.on('ready', () => {
if (game.user.isGM) { if (game.user.isGM) {
let chatData = { let chatData = {
@ -408,8 +409,7 @@ Hooks.once('ready', () => {
"doom": "Maudit (-40)" "doom": "Maudit (-40)"
} }
console.log("WFRP4E-TRANSLATION | Loading timeout");
//setTimeout( __check_fix_wrong_modules, 2000, true, false); //setTimeout( __check_fix_wrong_modules, 2000, true, false);
setTimeout(__check_fix_wrong_modules, 20000, true, true); setTimeout(__check_fix_wrong_modules, 20000, true, true);
setTimeout(__add_actors_translation, 21000, false, true); setTimeout(__add_actors_translation, 21000, false, true);

View File

@ -218,15 +218,15 @@ Hooks.once('init', () => {
/*---------------------------------------------------------------------*/ /*---------------------------------------------------------------------*/
// Converters area // Converters area
if (typeof Babele !== 'undefined') { if (game.babele !== 'undefined') {
Babele.get().register({ game.babele.register({
module: 'wh4-fr-translation', module: 'wh4-fr-translation',
lang: 'fr', lang: 'fr',
dir: 'compendium' dir: 'compendium'
}) })
Babele.get().registerConverters({ game.babele.registerConverters({
"career_skills": (skills_list) => { "career_skills": (skills_list) => {
let validCompendiums = game.wfrp4e.tags.getPacksWithTag("skill") let validCompendiums = game.wfrp4e.tags.getPacksWithTag("skill")
@ -268,9 +268,32 @@ Hooks.once('init', () => {
} }
} }
} }
return skills_list; return skills_list
},
"process_effects": (effectsData, translations, data, tc, tc_translations) => {
//console.log("Effects :", effectsData, translations, data, tc, tc_translations)
for (let e of effectsData) {
let origName = e.name
e.name = tc_translations.name || game.i18n.localize(e.name)
if ( e.flags?.wfrp4e?.scriptData) {
for (let script of e.flags.wfrp4e.scriptData) {
if (script?.label) {
// Quand le label du script est strictement identique au nom de l'item concerné
if ( script.label.toLowerCase() == origName.toLowerCase() ) {
script.label = e.name
} else if (script.label.toLowerCase().includes("tests to affect")) {
script.label = script.label.replace("Tests to affect", "Tests relatifs à ")
} else if (script.label.toLowerCase().includes("using torn muscle")) {
script.label = script.label.replace("Using Torn Muscle", "Utilisation du muscle déchiré ")
} else {
script.label = game.i18n.localize(script.label)
}
}
}
}
}
return effectsData
}, },
"resultConverter": (results, translated) => { "resultConverter": (results, translated) => {
//console.log("STUF PARSING", results, translated) //console.log("STUF PARSING", results, translated)
if (translated) { if (translated) {
@ -294,13 +317,13 @@ Hooks.once('init', () => {
let career = data.text.match(/{(.*)}/) let career = data.text.match(/{(.*)}/)
//console.log(">>>>>", career) //console.log(">>>>>", career)
if (career && career[1]) { if (career && career[1]) {
let careerFR = Babele.instance.converters.career_careergroup(career[1]) let careerFR = game.babele.converters.career_careergroup(career[1])
data.text = data.text.replace(career[1], careerFR) data.text = data.text.replace(career[1], careerFR)
} }
} }
} }
if (results[0].documentCollection) { if (results[0].documentCollection) {
return Babele.instance.converters.tableResults(results) return game.babele.converters.tableResults(results)
} }
return results return results
}, },

View File

@ -4,10 +4,7 @@ export class WH4FRPatchConfig {
/************************************************************************************/ /************************************************************************************/
static translateSkillList( skillList) { static translateSkillList( skillList) {
let compendiumName = 'wfrp4e-core.skills' // Per default let compendiumName = 'wfrp4e-core.items'
if (game.system.version.match("7.")) {
compendiumName = 'wfrp4e-core.items'
}
let newList = []; let newList = [];
for( let compName of skillList) { for( let compName of skillList) {
@ -32,10 +29,7 @@ export class WH4FRPatchConfig {
/************************************************************************************/ /************************************************************************************/
static translateTalentList( talentList) { static translateTalentList( talentList) {
let compendiumName = 'wfrp4e-core.talents' // Per default let compendiumName = 'wfrp4e-core.items'
if (game.system.version.match("7.")) {
compendiumName = 'wfrp4e-core.items'
}
let newList = []; let newList = [];
for( let talentLine of talentList) { for( let talentLine of talentList) {
@ -86,8 +80,10 @@ export class WH4FRPatchConfig {
/************************************************************************************/ /************************************************************************************/
static patch_species_skills( ) { static patch_species_skills( ) {
console.log("Patching species skills....");
for (let speciesName in game.wfrp4e.config.speciesSkills) { for (let speciesName in game.wfrp4e.config.speciesSkills) {
let speciesComp = game.wfrp4e.config.speciesSkills[speciesName]; let speciesComp = game.wfrp4e.config.speciesSkills[speciesName];
console.log("SpeciesName", speciesName, speciesComp);
game.wfrp4e.config.speciesSkills[speciesName] = this.translateSkillList( speciesComp ) game.wfrp4e.config.speciesSkills[speciesName] = this.translateSkillList( speciesComp )
} }
} }
@ -102,10 +98,7 @@ export class WH4FRPatchConfig {
/************************************************************************************/ /************************************************************************************/
static patch_career() { static patch_career() {
let compendiumName = 'wfrp4e-core.careers' // Per default let compendiumName = 'wfrp4e-core.items'
if (game.system.version.match("7.")) {
compendiumName = 'wfrp4e-core.items'
}
if ( game.wfrp4e.tables.career) { if ( game.wfrp4e.tables.career) {
for( let row of game.wfrp4e.tables.career.rows) { for( let row of game.wfrp4e.tables.career.rows) {
@ -128,7 +121,7 @@ export class WH4FRPatchConfig {
/************************************************************************************/ /************************************************************************************/
static perform_patch() { static perform_patch() {
if (game.user.isGM) { if (game.user.isGM) {
let coreC7 = game.modules.find(mod => mod.id == "wfrp4e-core") let coreC7 = game.modules.find(mod => mod.id == "wfrp4e-core")
if (!coreC7 || !coreC7.active) { if (!coreC7 || !coreC7.active) {
@ -138,8 +131,7 @@ export class WH4FRPatchConfig {
} }
// Detect and patch as necessary // Detect and patch as necessary
if (game.wfrp4e.config?.talentBonuses && game.wfrp4e.config.talentBonuses["vivacité"] == undefined) { if (game.wfrp4e.config?.talentBonuses ) {
console.log("Patching WFRP4E now ....");
game.wfrp4e.config.qualityDescriptions["distract"] = game.i18n.localize("WFRP4E.Properties.Distract"); // Patch missing quality game.wfrp4e.config.qualityDescriptions["distract"] = game.i18n.localize("WFRP4E.Properties.Distract"); // Patch missing quality
game.wfrp4e.config.talentBonuses = { game.wfrp4e.config.talentBonuses = {

File diff suppressed because one or more lines are too long

View File

@ -1 +1 @@
MANIFEST-000746 MANIFEST-000776

View File

@ -1,7 +1,7 @@
2024/05/31-09:37:32.376772 7f19c7e006c0 Recovering log #744 2024/09/07-17:35:53.339910 7f80f2a006c0 Recovering log #774
2024/05/31-09:37:32.432762 7f19c7e006c0 Delete type=3 #742 2024/09/07-17:35:53.351094 7f80f2a006c0 Delete type=3 #772
2024/05/31-09:37:32.432815 7f19c7e006c0 Delete type=0 #744 2024/09/07-17:35:53.351249 7f80f2a006c0 Delete type=0 #774
2024/05/31-10:40:01.792285 7f19c56006c0 Level-0 table #749: started 2024/09/07-17:41:21.597568 7f80f10006c0 Level-0 table #779: started
2024/05/31-10:40:01.792317 7f19c56006c0 Level-0 table #749: 0 bytes OK 2024/09/07-17:41:21.597606 7f80f10006c0 Level-0 table #779: 0 bytes OK
2024/05/31-10:40:01.798878 7f19c56006c0 Delete type=0 #747 2024/09/07-17:41:21.603972 7f80f10006c0 Delete type=0 #777
2024/05/31-10:40:01.811597 7f19c56006c0 Manual compaction at level-0 from '!journal!3IgmiprzLB6Lwenc' @ 72057594037927935 : 1 .. '!journal.pages!suuYN87Al1ZZWtQQ.jhgNnhWhrkOpKs1B' @ 0 : 0; will stop at (end) 2024/09/07-17:41:21.611875 7f80f10006c0 Manual compaction at level-0 from '!journal!3IgmiprzLB6Lwenc' @ 72057594037927935 : 1 .. '!journal.pages!suuYN87Al1ZZWtQQ.jhgNnhWhrkOpKs1B' @ 0 : 0; will stop at (end)

View File

@ -1,7 +1,7 @@
2024/05/29-22:15:26.921445 7f5b0b8006c0 Recovering log #739 2024/07/13-10:41:36.913478 7fc8820006c0 Recovering log #770
2024/05/29-22:15:26.945868 7f5b0b8006c0 Delete type=3 #737 2024/07/13-10:41:36.924385 7fc8820006c0 Delete type=3 #768
2024/05/29-22:15:26.945925 7f5b0b8006c0 Delete type=0 #739 2024/07/13-10:41:36.924475 7fc8820006c0 Delete type=0 #770
2024/05/29-22:42:08.086719 7f5b0a8006c0 Level-0 table #745: started 2024/07/13-10:42:24.874947 7fc87de006c0 Level-0 table #775: started
2024/05/29-22:42:08.086744 7f5b0a8006c0 Level-0 table #745: 0 bytes OK 2024/07/13-10:42:24.874996 7fc87de006c0 Level-0 table #775: 0 bytes OK
2024/05/29-22:42:08.093895 7f5b0a8006c0 Delete type=0 #743 2024/07/13-10:42:24.881904 7fc87de006c0 Delete type=0 #773
2024/05/29-22:42:08.114027 7f5b0a8006c0 Manual compaction at level-0 from '!journal!3IgmiprzLB6Lwenc' @ 72057594037927935 : 1 .. '!journal.pages!suuYN87Al1ZZWtQQ.jhgNnhWhrkOpKs1B' @ 0 : 0; will stop at (end) 2024/07/13-10:42:24.882157 7fc87de006c0 Manual compaction at level-0 from '!journal!3IgmiprzLB6Lwenc' @ 72057594037927935 : 1 .. '!journal.pages!suuYN87Al1ZZWtQQ.jhgNnhWhrkOpKs1B' @ 0 : 0; will stop at (end)

View File

@ -1 +1 @@
MANIFEST-000748 MANIFEST-000778

View File

@ -1,7 +1,7 @@
2024/05/31-09:37:32.440532 7f19c60006c0 Recovering log #746 2024/09/07-17:35:53.356731 7f80f20006c0 Recovering log #776
2024/05/31-09:37:32.493255 7f19c60006c0 Delete type=3 #744 2024/09/07-17:35:53.368124 7f80f20006c0 Delete type=3 #774
2024/05/31-09:37:32.493359 7f19c60006c0 Delete type=0 #746 2024/09/07-17:35:53.368326 7f80f20006c0 Delete type=0 #776
2024/05/31-10:40:01.811747 7f19c56006c0 Level-0 table #751: started 2024/09/07-17:41:21.604148 7f80f10006c0 Level-0 table #781: started
2024/05/31-10:40:01.811783 7f19c56006c0 Level-0 table #751: 0 bytes OK 2024/09/07-17:41:21.604186 7f80f10006c0 Level-0 table #781: 0 bytes OK
2024/05/31-10:40:01.817818 7f19c56006c0 Delete type=0 #749 2024/09/07-17:41:21.611569 7f80f10006c0 Delete type=0 #779
2024/05/31-10:40:01.818008 7f19c56006c0 Manual compaction at level-0 from '!folders!3uquYH73ttCdoH0I' @ 72057594037927935 : 1 .. '!items!ylFhk7mGZOnAJTUT' @ 0 : 0; will stop at (end) 2024/09/07-17:41:21.611892 7f80f10006c0 Manual compaction at level-0 from '!folders!3uquYH73ttCdoH0I' @ 72057594037927935 : 1 .. '!items!ylFhk7mGZOnAJTUT' @ 0 : 0; will stop at (end)

View File

@ -1,7 +1,7 @@
2024/05/29-22:15:26.951019 7f5b0d6006c0 Recovering log #741 2024/07/13-10:41:36.930430 7fc8816006c0 Recovering log #772
2024/05/29-22:15:26.961978 7f5b0d6006c0 Delete type=3 #739 2024/07/13-10:41:36.940714 7fc8816006c0 Delete type=3 #770
2024/05/29-22:15:26.962039 7f5b0d6006c0 Delete type=0 #741 2024/07/13-10:41:36.940805 7fc8816006c0 Delete type=0 #772
2024/05/29-22:42:08.094093 7f5b0a8006c0 Level-0 table #747: started 2024/07/13-10:42:24.889098 7fc87de006c0 Level-0 table #777: started
2024/05/29-22:42:08.094135 7f5b0a8006c0 Level-0 table #747: 0 bytes OK 2024/07/13-10:42:24.889141 7fc87de006c0 Level-0 table #777: 0 bytes OK
2024/05/29-22:42:08.100255 7f5b0a8006c0 Delete type=0 #745 2024/07/13-10:42:24.897469 7fc87de006c0 Delete type=0 #775
2024/05/29-22:42:08.114040 7f5b0a8006c0 Manual compaction at level-0 from '!folders!3uquYH73ttCdoH0I' @ 72057594037927935 : 1 .. '!items!ylFhk7mGZOnAJTUT' @ 0 : 0; will stop at (end) 2024/07/13-10:42:24.905414 7fc87de006c0 Manual compaction at level-0 from '!folders!3uquYH73ttCdoH0I' @ 72057594037927935 : 1 .. '!items!ylFhk7mGZOnAJTUT' @ 0 : 0; will stop at (end)

View File

@ -1 +1 @@
MANIFEST-000746 MANIFEST-000776

View File

@ -1,7 +1,7 @@
2024/05/31-09:37:32.579979 7f19c60006c0 Recovering log #744 2024/09/07-17:35:53.389079 7f80f20006c0 Recovering log #774
2024/05/31-09:37:32.634808 7f19c60006c0 Delete type=3 #742 2024/09/07-17:35:53.400221 7f80f20006c0 Delete type=3 #772
2024/05/31-09:37:32.634871 7f19c60006c0 Delete type=0 #744 2024/09/07-17:35:53.400312 7f80f20006c0 Delete type=0 #774
2024/05/31-10:40:01.798996 7f19c56006c0 Level-0 table #749: started 2024/09/07-17:41:21.612001 7f80f10006c0 Level-0 table #779: started
2024/05/31-10:40:01.799024 7f19c56006c0 Level-0 table #749: 0 bytes OK 2024/09/07-17:41:21.612049 7f80f10006c0 Level-0 table #779: 0 bytes OK
2024/05/31-10:40:01.805113 7f19c56006c0 Delete type=0 #747 2024/09/07-17:41:21.618574 7f80f10006c0 Delete type=0 #777
2024/05/31-10:40:01.811607 7f19c56006c0 Manual compaction at level-0 from '!journal!cZtNgayIw2QFhC9u' @ 72057594037927935 : 1 .. '!journal.pages!cZtNgayIw2QFhC9u.ts265H1XkisLgdow' @ 0 : 0; will stop at (end) 2024/09/07-17:41:21.639322 7f80f10006c0 Manual compaction at level-0 from '!journal!cZtNgayIw2QFhC9u' @ 72057594037927935 : 1 .. '!journal.pages!cZtNgayIw2QFhC9u.ts265H1XkisLgdow' @ 0 : 0; will stop at (end)

View File

@ -1,7 +1,7 @@
2024/05/29-22:15:26.981610 7f5b0c2006c0 Recovering log #739 2024/07/13-10:41:36.961368 7fc8816006c0 Recovering log #770
2024/05/29-22:15:26.991864 7f5b0c2006c0 Delete type=3 #737 2024/07/13-10:41:36.972209 7fc8816006c0 Delete type=3 #768
2024/05/29-22:15:26.991966 7f5b0c2006c0 Delete type=0 #739 2024/07/13-10:41:36.972302 7fc8816006c0 Delete type=0 #770
2024/05/29-22:42:08.100370 7f5b0a8006c0 Level-0 table #745: started 2024/07/13-10:42:24.897709 7fc87de006c0 Level-0 table #775: started
2024/05/29-22:42:08.100395 7f5b0a8006c0 Level-0 table #745: 0 bytes OK 2024/07/13-10:42:24.897763 7fc87de006c0 Level-0 table #775: 0 bytes OK
2024/05/29-22:42:08.107039 7f5b0a8006c0 Delete type=0 #743 2024/07/13-10:42:24.905156 7fc87de006c0 Delete type=0 #773
2024/05/29-22:42:08.114048 7f5b0a8006c0 Manual compaction at level-0 from '!journal!cZtNgayIw2QFhC9u' @ 72057594037927935 : 1 .. '!journal.pages!cZtNgayIw2QFhC9u.ts265H1XkisLgdow' @ 0 : 0; will stop at (end) 2024/07/13-10:42:24.905434 7fc87de006c0 Manual compaction at level-0 from '!journal!cZtNgayIw2QFhC9u' @ 72057594037927935 : 1 .. '!journal.pages!cZtNgayIw2QFhC9u.ts265H1XkisLgdow' @ 0 : 0; will stop at (end)

View File

@ -1 +1 @@
MANIFEST-000746 MANIFEST-000776

View File

@ -1,7 +1,7 @@
2024/05/31-09:37:32.306200 7f19c60006c0 Recovering log #744 2024/09/07-17:35:53.322364 7f80f20006c0 Recovering log #774
2024/05/31-09:37:32.365977 7f19c60006c0 Delete type=3 #742 2024/09/07-17:35:53.332882 7f80f20006c0 Delete type=3 #772
2024/05/31-09:37:32.366032 7f19c60006c0 Delete type=0 #744 2024/09/07-17:35:53.333094 7f80f20006c0 Delete type=0 #774
2024/05/31-10:40:01.779134 7f19c56006c0 Level-0 table #749: started 2024/09/07-17:41:21.584022 7f80f10006c0 Level-0 table #779: started
2024/05/31-10:40:01.779173 7f19c56006c0 Level-0 table #749: 0 bytes OK 2024/09/07-17:41:21.584076 7f80f10006c0 Level-0 table #779: 0 bytes OK
2024/05/31-10:40:01.785789 7f19c56006c0 Delete type=0 #747 2024/09/07-17:41:21.590929 7f80f10006c0 Delete type=0 #777
2024/05/31-10:40:01.785917 7f19c56006c0 Manual compaction at level-0 from '!journal!50u8VAjdmovyr0hx' @ 72057594037927935 : 1 .. '!journal.pages!yzw9I0r3hCK7PJnz.sPNCYj2nR3Cp3jHd' @ 0 : 0; will stop at (end) 2024/09/07-17:41:21.611830 7f80f10006c0 Manual compaction at level-0 from '!journal!50u8VAjdmovyr0hx' @ 72057594037927935 : 1 .. '!journal.pages!yzw9I0r3hCK7PJnz.sPNCYj2nR3Cp3jHd' @ 0 : 0; will stop at (end)

View File

@ -1,7 +1,7 @@
2024/05/29-22:15:26.903601 7f5b0c2006c0 Recovering log #739 2024/07/13-10:41:36.897525 7fc8816006c0 Recovering log #770
2024/05/29-22:15:26.917559 7f5b0c2006c0 Delete type=3 #737 2024/07/13-10:41:36.908614 7fc8816006c0 Delete type=3 #768
2024/05/29-22:15:26.917932 7f5b0c2006c0 Delete type=0 #739 2024/07/13-10:41:36.908748 7fc8816006c0 Delete type=0 #770
2024/05/29-22:42:08.040267 7f5b0a8006c0 Level-0 table #745: started 2024/07/13-10:42:24.867229 7fc87de006c0 Level-0 table #775: started
2024/05/29-22:42:08.040295 7f5b0a8006c0 Level-0 table #745: 0 bytes OK 2024/07/13-10:42:24.867279 7fc87de006c0 Level-0 table #775: 0 bytes OK
2024/05/29-22:42:08.068788 7f5b0a8006c0 Delete type=0 #743 2024/07/13-10:42:24.874776 7fc87de006c0 Delete type=0 #773
2024/05/29-22:42:08.086595 7f5b0a8006c0 Manual compaction at level-0 from '!journal!50u8VAjdmovyr0hx' @ 72057594037927935 : 1 .. '!journal.pages!yzw9I0r3hCK7PJnz.sPNCYj2nR3Cp3jHd' @ 0 : 0; will stop at (end) 2024/07/13-10:42:24.882142 7fc87de006c0 Manual compaction at level-0 from '!journal!50u8VAjdmovyr0hx' @ 72057594037927935 : 1 .. '!journal.pages!yzw9I0r3hCK7PJnz.sPNCYj2nR3Cp3jHd' @ 0 : 0; will stop at (end)

View File

@ -1 +1 @@
MANIFEST-000746 MANIFEST-000776

View File

@ -1,7 +1,7 @@
2024/05/31-09:37:32.229735 7f19c7e006c0 Recovering log #744 2024/09/07-17:35:53.304376 7f80f2a006c0 Recovering log #774
2024/05/31-09:37:32.290900 7f19c7e006c0 Delete type=3 #742 2024/09/07-17:35:53.314832 7f80f2a006c0 Delete type=3 #772
2024/05/31-09:37:32.290955 7f19c7e006c0 Delete type=0 #744 2024/09/07-17:35:53.314961 7f80f2a006c0 Delete type=0 #774
2024/05/31-10:40:01.745865 7f19c56006c0 Level-0 table #749: started 2024/09/07-17:41:21.591102 7f80f10006c0 Level-0 table #779: started
2024/05/31-10:40:01.745898 7f19c56006c0 Level-0 table #749: 0 bytes OK 2024/09/07-17:41:21.591140 7f80f10006c0 Level-0 table #779: 0 bytes OK
2024/05/31-10:40:01.752538 7f19c56006c0 Delete type=0 #747 2024/09/07-17:41:21.597409 7f80f10006c0 Delete type=0 #777
2024/05/31-10:40:01.759248 7f19c56006c0 Manual compaction at level-0 from '!tables!4l60Lxv8cpsyy2Cg' @ 72057594037927935 : 1 .. '!tables.results!tfaYKDZqu7kgZvRG.yvbwKursaixh2dby' @ 0 : 0; will stop at (end) 2024/09/07-17:41:21.611856 7f80f10006c0 Manual compaction at level-0 from '!tables!4l60Lxv8cpsyy2Cg' @ 72057594037927935 : 1 .. '!tables.results!tfaYKDZqu7kgZvRG.yvbwKursaixh2dby' @ 0 : 0; will stop at (end)

View File

@ -1,7 +1,7 @@
2024/05/29-22:15:26.888481 7f5b0cc006c0 Recovering log #739 2024/07/13-10:41:36.878320 7fc8820006c0 Recovering log #770
2024/05/29-22:15:26.899481 7f5b0cc006c0 Delete type=3 #737 2024/07/13-10:41:36.889382 7fc8820006c0 Delete type=3 #768
2024/05/29-22:15:26.899538 7f5b0cc006c0 Delete type=0 #739 2024/07/13-10:41:36.889475 7fc8820006c0 Delete type=0 #770
2024/05/29-22:42:08.080368 7f5b0a8006c0 Level-0 table #745: started 2024/07/13-10:42:24.860432 7fc87de006c0 Level-0 table #775: started
2024/05/29-22:42:08.080405 7f5b0a8006c0 Level-0 table #745: 0 bytes OK 2024/07/13-10:42:24.860477 7fc87de006c0 Level-0 table #775: 0 bytes OK
2024/05/29-22:42:08.086437 7f5b0a8006c0 Delete type=0 #743 2024/07/13-10:42:24.866988 7fc87de006c0 Delete type=0 #773
2024/05/29-22:42:08.086618 7f5b0a8006c0 Manual compaction at level-0 from '!tables!4l60Lxv8cpsyy2Cg' @ 72057594037927935 : 1 .. '!tables.results!tfaYKDZqu7kgZvRG.yvbwKursaixh2dby' @ 0 : 0; will stop at (end) 2024/07/13-10:42:24.882123 7fc87de006c0 Manual compaction at level-0 from '!tables!4l60Lxv8cpsyy2Cg' @ 72057594037927935 : 1 .. '!tables.results!tfaYKDZqu7kgZvRG.yvbwKursaixh2dby' @ 0 : 0; will stop at (end)

View File

@ -1 +1 @@
MANIFEST-000389 MANIFEST-000419

View File

@ -1,8 +1,8 @@
2024/05/31-09:37:32.503566 7f19c7e006c0 Recovering log #387 2024/09/07-17:35:53.374420 7f80f2a006c0 Recovering log #417
2024/05/31-09:37:32.572091 7f19c7e006c0 Delete type=3 #385 2024/09/07-17:35:53.384865 7f80f2a006c0 Delete type=3 #415
2024/05/31-09:37:32.572143 7f19c7e006c0 Delete type=0 #387 2024/09/07-17:35:53.384993 7f80f2a006c0 Delete type=0 #417
2024/05/31-10:40:01.805216 7f19c56006c0 Level-0 table #392: started 2024/09/07-17:41:21.618745 7f80f10006c0 Level-0 table #422: started
2024/05/31-10:40:01.805249 7f19c56006c0 Level-0 table #392: 0 bytes OK 2024/09/07-17:41:21.618787 7f80f10006c0 Level-0 table #422: 0 bytes OK
2024/05/31-10:40:01.811475 7f19c56006c0 Delete type=0 #390 2024/09/07-17:41:21.625664 7f80f10006c0 Delete type=0 #420
2024/05/31-10:40:01.811622 7f19c56006c0 Manual compaction at level-0 from '!journal!056ILNNrLiPq3Gi3' @ 72057594037927935 : 1 .. '!journal.pages!yfZxl4I7XAuUF6r3.apXmOlZRmGT4GreB' @ 0 : 0; will stop at (end) 2024/09/07-17:41:21.639346 7f80f10006c0 Manual compaction at level-0 from '!journal!056ILNNrLiPq3Gi3' @ 72057594037927935 : 1 .. '!journal.pages!yfZxl4I7XAuUF6r3.apXmOlZRmGT4GreB' @ 0 : 0; will stop at (end)
2024/05/31-10:40:01.811643 7f19c56006c0 Manual compaction at level-1 from '!journal!056ILNNrLiPq3Gi3' @ 72057594037927935 : 1 .. '!journal.pages!yfZxl4I7XAuUF6r3.apXmOlZRmGT4GreB' @ 0 : 0; will stop at (end) 2024/09/07-17:41:21.639401 7f80f10006c0 Manual compaction at level-1 from '!journal!056ILNNrLiPq3Gi3' @ 72057594037927935 : 1 .. '!journal.pages!yfZxl4I7XAuUF6r3.apXmOlZRmGT4GreB' @ 0 : 0; will stop at (end)

View File

@ -1,8 +1,8 @@
2024/05/29-22:15:26.967160 7f5b0cc006c0 Recovering log #382 2024/07/13-10:41:36.946044 7fc8820006c0 Recovering log #413
2024/05/29-22:15:26.977447 7f5b0cc006c0 Delete type=3 #380 2024/07/13-10:41:36.956775 7fc8820006c0 Delete type=3 #411
2024/05/29-22:15:26.977504 7f5b0cc006c0 Delete type=0 #382 2024/07/13-10:41:36.956919 7fc8820006c0 Delete type=0 #413
2024/05/29-22:42:08.107240 7f5b0a8006c0 Level-0 table #388: started 2024/07/13-10:42:24.882375 7fc87de006c0 Level-0 table #418: started
2024/05/29-22:42:08.107291 7f5b0a8006c0 Level-0 table #388: 0 bytes OK 2024/07/13-10:42:24.882443 7fc87de006c0 Level-0 table #418: 0 bytes OK
2024/05/29-22:42:08.113903 7f5b0a8006c0 Delete type=0 #386 2024/07/13-10:42:24.888900 7fc87de006c0 Delete type=0 #416
2024/05/29-22:42:08.114056 7f5b0a8006c0 Manual compaction at level-0 from '!journal!056ILNNrLiPq3Gi3' @ 72057594037927935 : 1 .. '!journal.pages!yfZxl4I7XAuUF6r3.apXmOlZRmGT4GreB' @ 0 : 0; will stop at (end) 2024/07/13-10:42:24.905386 7fc87de006c0 Manual compaction at level-0 from '!journal!056ILNNrLiPq3Gi3' @ 72057594037927935 : 1 .. '!journal.pages!yfZxl4I7XAuUF6r3.apXmOlZRmGT4GreB' @ 0 : 0; will stop at (end)
2024/05/29-22:42:08.114092 7f5b0a8006c0 Manual compaction at level-1 from '!journal!056ILNNrLiPq3Gi3' @ 72057594037927935 : 1 .. '!journal.pages!yfZxl4I7XAuUF6r3.apXmOlZRmGT4GreB' @ 0 : 0; will stop at (end) 2024/07/13-10:42:24.905451 7fc87de006c0 Manual compaction at level-1 from '!journal!056ILNNrLiPq3Gi3' @ 72057594037927935 : 1 .. '!journal.pages!yfZxl4I7XAuUF6r3.apXmOlZRmGT4GreB' @ 0 : 0; will stop at (end)

View File

@ -0,0 +1,7 @@
let state = !this.effect.disabled;
this.effect.update({"disabled": state});
if (state)
return ui.notifications.info("EFFECT.CreatureBackInWater", {localize: true})
return ui.notifications.info("EFFECT.CreatureOutOfWater", {localize: true});

View File

@ -0,0 +1 @@
return args.skill?.name.includes(game.i18n.localize("NAME.Channelling")) || args.skill?.name == `${game.i18n.localize("NAME.Language")} (${game.i18n.localize("SPEC.Magick")})`

View File

@ -0,0 +1,20 @@
let damage = this.effect.sourceActor.hasCondition("fatigued") ? 6 : 10;
let loc = "body"
let APatLoc = this.actor.system.status.armour[loc];
let metalAP = APatLoc.layers.reduce((metal, layer) => metal += ((layer.metal && !layer.magical) ? layer.value : 0), 0)
let APused = Math.max(0, APatLoc.value - metalAP); // remove metal AP at location;
damage -= (APused + this.actor.system.characteristics.t.bonus)
let msg = await this.actor.applyBasicDamage(damage, {suppressMsg : true, damageType : game.wfrp4e.config.DAMAGE_TYPE.IGNORE_ALL});
msg += ` (ignored ${metalAP} metal AP on ${game.wfrp4e.config.locations[loc]})`
this.script.scriptMessage(msg)
let test = await this.actor.setupSkill("Endurance", {fields : {difficulty : "difficult"}, appendTitle : ` - ${this.effect.name}`});
await test.roll();
if (test.failed)
this.actor.addCondition("stunned");

View File

@ -0,0 +1,8 @@
if (isNaN(parseInt(this.item.system.specification.value)))
{
let value = await ValueDialog.create("Enter Armour value", this.effect.name);
if (value)
{
this.item.updateSource({"system.specification.value" : value});
}
}

View File

@ -6,13 +6,14 @@ if (!currentCareer) return
let inCurrentCareer = currentCareer.system.skills.includes(skill); let inCurrentCareer = currentCareer.system.skills.includes(skill);
if (existingSkill && inCurrentCareer) let craftsmanAdded = this.actor.getFlag("wfrp4e", "craftsmanAdded") || {};
if (existingSkill && inCurrentCareer && !craftsmanAdded[existingSkill.name])
{ {
existingSkill.system.advances.costModifier = -5; existingSkill.system.advances.costModifier = -5;
} }
else else
{ {
craftsmanAdded[skill] = true;
currentCareer.system.skills.push(skill); currentCareer.system.skills.push(skill);
} setProperty(this.actor, "flags.wfrp4e.craftsmanAdded", craftsmanAdded)
}

View File

@ -0,0 +1,3 @@
args.actor.system.details.move.value += 2;
args.actor.system.status.carries.max = Math.floor(args.actor.system.status.carries.max * 0.5);
args.actor.system.details.price.gc *= 1.1;

View File

@ -0,0 +1 @@
this.actor.addCondition("blinded", 3);

View File

@ -0,0 +1,4 @@
let item = args.actor.items.find(i => i.name.includes("Smoothing"));
let smoothing = item?.effects.find(e => e.name === "Smoothing");
if (smoothing)
smoothing.disabled = true;

View File

@ -0,0 +1 @@
args.actor.system.details.price.gc += Math.floor(args.actor.system.details.price.gc * 0.1);

View File

@ -0,0 +1 @@
args.actor.system.details.man -= 3;

View File

@ -0,0 +1,2 @@
if (args.totalWoundLoss > 0)
this.effect.delete();

View File

@ -0,0 +1,53 @@
const repaired_message = `<p>Finished repairing <em>${this.item.name}</em>.</p>`;
const test = 'Trade (Carpenter)';
const difficulty = 'challenging';
const target = 40;
const extendedTestData = {
name: this.item.name,
type: "extendedTest",
img: this.item.img,
system: {
SL: {
current: 0,
target: target
},
test: {
value: test
},
completion: {
value: "remove"
},
difficulty: {
value: difficulty
}
},
effects: [
{
name: `Repair the ${this.item.name}`,
icon: this.item.img,
flags: {
wfrp4e: {
applicationData: {
type: "document",
documentType: "Item"
},
scriptData: [
{
label: this.item.name,
script: `
let id = this.item.flags.wfrp4e.fromEffect;
let effect = this.actor.appliedEffects.find(e => e.id === id);
this.script.scriptMessage("${repaired_message}");
await effect.item.delete();
`,
trigger: "deleteEffect"
}
]
}
}
}
]
};
await this.actor.createEmbeddedDocuments("Item", [extendedTestData], {fromEffect: this.effect.id});

View File

@ -0,0 +1,19 @@
const rating = parseInt(this.effect.name.match(/\d+/)?.[0]) || 1;
let crewList = foundry.utils.duplicate(this.actor.system.passengers.list);
let selectedCrew = [];
while (selectedCrew.length < rating && crewList.length) {
selectedCrew.push(crewList.splice(crewList.length * Math.random() | 0, 1)[0]);
}
for (let member of selectedCrew) {
let actor = game.actors.get(member.id);
actor.applyBasicDamage(9, {
damageType: game.wfrp4e.config.DAMAGE_TYPE.NORMAL,
minimumOne: true,
loc: "roll",
suppressMsg: false,
hideDSN: false
});
}

View File

@ -0,0 +1,8 @@
if (isNaN(parseInt(this.item.system.specification.value)))
{
let value = await ValueDialog.create("Enter Spellcasting Lore", this.effect.name, "", Object.values(game.wfrp4e.config.magicLores));
if (value)
{
this.item.updateSource({"system.specification.value" : value});
}
}

View File

@ -0,0 +1,5 @@
const disease = await fromUuid("Compendium.wfrp4e-soc.items.Item.8Q9JYtR1y3B5J6UH");
const data = disease.toObject();
data.system.incubation.value = 0;
data.system.duration.active = true;
this.actor.createEmbeddedDocuments("Item", [data], {fromEffect: this.effect.id});

View File

@ -0,0 +1 @@
return args.options.crewTest?.system.handling !== true;

View File

@ -0,0 +1,2 @@
if (args.actorsystem.details.move.sail.value > 0)
args.actor.system.details.move.sail.value = 0;

View File

@ -0,0 +1,31 @@
const actor = args.actor;
if (actor.itemTypes.skill.find(s => s.name === "Lore (Oceans)")) {
const loreTest = await actor.setupSkill('Lore (Oceans)', {
appendTitle: ` ${this.effect.name}`,
skipTargets: true,
fields: {difficulty: 'hard'},
characteristic: 'int',
});
await loreTest.roll();
if (loreTest.succeeded) {
loreTest.result.other.push(`<b>${actor.name}</b> recognizes lure of the Leviathan.`);
loreTest.renderRollCard();
return;
}
}
let test = await actor.setupSkill('Cool', {
appendTitle: ` ${this.effect.name}`,
skipTargets: true,
fields: {difficulty: 'easy'},
characteristic: 'wp',
});
await test.roll();
if (!test.succeeded) {
test.result.other.push(`<b>${actor.name}</b> became @Condition[Stunned] by the sight.`);
test.renderRollCard();
actor.addCondition("stunned");
}

View File

@ -0,0 +1 @@
args.actor.system.details.move.value += 1;

View File

@ -0,0 +1,32 @@
const sin = this.effect.sourceActor.system.status.sin.value;
const result = await WFRP_Tables.rollTable("manann-mood-made-meaningless", sin);
let match = result.text.match(/b>([^<]+)/i);
let key = match[1];
let roll = new Roll("5d10");
let value = undefined;
await this.script.scriptMessage(result.text, {flavor: result.title});
switch (key) {
case 'Stromfels Triumphant!':
value = 0;
break;
case 'Stromfels Ascends!':
await roll.evaluate();
if (this.actor.system.status.mood.value > 0)
value = -roll.total;
else if (this.actor.system.status.mood.value < 0)
value = roll.total;
break;
case 'No effect.':
break;
case 'Manann Provoked!':
await roll.evaluate();
value = -roll.total;
break;
}
if (roll._evaluated)
await roll.toMessage();
await this.effect.setFlag("wfrp4e-soc", "m4result", {result: key, value});

View File

@ -0,0 +1,6 @@
let test = await this.actor.setupSkill(game.i18n.localize("NAME.Endurance"), {fields : {difficulty : "hard"}, appendTitle : ` - ${this.effect.name}`, skipTargets: true});
await test.roll();
if (test.failed)
{
this.actor.addCondition("poisoned");
}

View File

@ -0,0 +1,53 @@
const repaired_message = `<p>Finished raisint <em>the anchor</em>.</p>`;
const test = 'Strength';
const difficulty = 'vhard';
const target = 20;
const extendedTestData = {
name: this.item.name,
type: "extendedTest",
img: this.item.img,
system: {
SL: {
current: 0,
target: target
},
test: {
value: test
},
completion: {
value: "remove"
},
difficulty: {
value: difficulty
}
},
effects: [
{
name: `Repair the ${this.item.name}`,
icon: this.item.img,
flags: {
wfrp4e: {
applicationData: {
type: "document",
documentType: "Item"
},
scriptData: [
{
label: this.item.name,
script: `
let id = this.item.flags.wfrp4e.fromEffect;
let effect = this.actor.appliedEffects.find(e => e.id === id);
this.script.scriptMessage("${repaired_message}");
await effect.item.delete();
`,
trigger: "deleteEffect"
}
]
}
}
}
]
};
await this.actor.createEmbeddedDocuments("Item", [extendedTestData], {fromEffect: this.effect.id});

View File

@ -0,0 +1,3 @@
args.actor.system.details.move.value += 3;
args.actor.system.status.carries.max = Math.floor(args.actor.system.status.carries.max * 0.25);
args.actor.system.details.price.gc *= 1.1;

View File

@ -0,0 +1,2 @@
if (args.actorsystem.details.move.sail.value > 0)
args.actor.system.details.move.sail.value = Math.floor(args.actor.system.details.move.sail.value * .5);

View File

@ -0,0 +1 @@
args.actor.details.move.value = 1;

View File

@ -0,0 +1,28 @@
let actor = game.user.character ?? canvas.tokens.controlled[0]?.actor;
if (!actor || !(actor.system instanceof StandardActorModel))
return ui.notifications.warn("You must control an Actor capable of performing a Strength Test");
let test = await actor.setupCharacteristic("s", {
skipTargets: true,
appendTitle: " - Bailing Out",
fields: {
difficulty: "challenging"
},
context: {
success: "Reduced the Holed rating!"
}
});
await test.roll();
if (test.succeeded) {
let SL = parseInt(test.result.SL);
let name = this.effect.name.replace(/\d+/, rating => parseInt(rating) - SL);
await this.effect.update({name});
}
let rating = parseInt(this.effect.name.match(/\d+/)?.[0]);
if (rating <= 1) {
const scriptData = this.effect.flags.wfrp4e.scriptData;
scriptData[2].trigger = '';
await this.effect.update({disabled: true, "flags.wfrp4e.scriptData": scriptData});
}

View File

@ -0,0 +1,11 @@
// If the creature currently has a Surprised, Unconscious, or Entangled Condition, it does not gain this Advantage.
const surprised = this.actor.hasCondition("surprised")
const unconscious = this.actor.hasCondition("unconscious")
const entangled = this.actor.hasCondition("entangled")
if (entangled || unconscious || surprised) return
// If, at the beginning of its turn, this creature does not have at least Rating Advantage points, its Advantage pool immediately increases to Rating.
const grimRating = parseInt(this.item.specification.value) || 1
if (grimRating > this.actor.status.advantage.value) {
this.actor.setAdvantage(grimRating)
}

View File

@ -0,0 +1,3 @@
let easier = ['challenging', 'average', 'easy', 'veasy'];
if (easier.includes(args.fields.difficulty))
args.fields.difficulty = "difficult";

View File

@ -0,0 +1,2 @@
if (!this.actor.hasCondition("entangled"))
this.actor.addCondition("entangled");

View File

@ -0,0 +1,10 @@
if (args.test.failed)
{
let SL = Number(args.test.result.SL)
if (SL <= -2 && SL > -4)
this.actor.addCondition("stunned")
else if (SL <= -4 && SL > -6)
this.script.scriptMessage(this.actor.prototypeToken.name + " must make a <b>Willpower</b> Test or fall @Condition[Prone].")
else if (SL <= -6)
this.actor.addCondition("unconscious")
}

View File

@ -0,0 +1,3 @@
if (args.actor.system instanceof StandardActorModel) {
args.actor.addCondition("unconscious");
}

View File

@ -0,0 +1,6 @@
let fatigued = this.actor.hasCondition("fatigued")
if (fatigued)
{
fatigued.delete();
this.script.scriptNotification("Removed Fatigued")
}

View File

@ -0,0 +1 @@
return !args.options.crewTest;

View File

@ -0,0 +1,31 @@
const actor = args.actor;
if (actor.itemTypes.skill.find(s => s.name === "Lore (Riverways)")) {
const loreTest = await actor.setupSkill('Lore (Riverways)', {
appendTitle: ` ${this.effect.name}`,
skipTargets: true,
fields: {difficulty: 'hard'},
characteristic: 'int',
});
await loreTest.roll();
if (loreTest.succeeded) {
loreTest.result.other.push(`<b>${actor.name}</b> recognizes lures of Lurkerfish.`);
loreTest.renderRollCard();
return;
}
}
let test = await actor.setupSkill('Cool', {
appendTitle: ` ${this.effect.name}`,
skipTargets: true,
fields: {difficulty: 'easy'},
characteristic: 'wp',
});
await test.roll();
if (!test.succeeded) {
test.result.other.push(`<b>${actor.name}</b> became beguiled by the sight and unable to perform any action except moving towards the light.`);
test.renderRollCard();
actor.addCondition("unconscious");
}

View File

@ -0,0 +1 @@
return args.skill?.name !== game.i18n.localize("NAME.Navigation");

View File

@ -0,0 +1,8 @@
if (isNaN(parseInt(this.item.system.specification.value)))
{
let value = await ValueDialog.create("Enter Terror value", this.effect.name);
if (value)
{
this.item.updateSource({"system.specification.value" : value});
}
}

View File

@ -0,0 +1,18 @@
if (args.attackerTest.data.preData.rollClass !== "CharacteristicTest") return;
if (args.attackerTest.data.preData.characteristic !== "s") return;
const SL = args.opposedTest.data.opposeResult.differenceSL;
const targetId = this.effect.getFlag("wfrp4e", "target");
const target = canvas.scene.tokens.get(targetId);
if (SL > 4) {
args.opposedTest.data.opposeResult.other.push(`<b>${args.defenderTest.actor.name}</b> was forced to let go of <b>${target.name}</b>.`);
return await this.effect.delete();
}
if (SL > 0) {
args.opposedTest.data.opposeResult.other.push(`<b>${args.defenderTest.actor.name}</b> was prevented from squeezing <b>${target.name}</b> for one turn.`);
let turns = this.effect.getFlag("wfrp4e", "turns");
this.effect.setFlag("wfrp4e", "turns", turns + 1);
}

View File

@ -0,0 +1,53 @@
const repaired_message = `<p>Finished repairing <em>${this.item.name}</em>.</p>`;
const test = 'Trade (Carpenter)';
const difficulty = 'difficult';
const target = 20;
const extendedTestData = {
name: this.item.name,
type: "extendedTest",
img: this.item.img,
system: {
SL: {
current: 0,
target: target
},
test: {
value: test
},
completion: {
value: "remove"
},
difficulty: {
value: difficulty
}
},
effects: [
{
name: `Repair the ${this.item.name}`,
icon: this.item.img,
flags: {
wfrp4e: {
applicationData: {
type: "document",
documentType: "Item"
},
scriptData: [
{
label: this.item.name,
script: `
let id = this.item.flags.wfrp4e.fromEffect;
let effect = this.actor.appliedEffects.find(e => e.id === id);
this.script.scriptMessage("${repaired_message}");
await effect.item.delete();
`,
trigger: "deleteEffect"
}
]
}
}
}
]
};
await this.actor.createEmbeddedDocuments("Item", [extendedTestData], {fromEffect: this.effect.id});

View File

@ -0,0 +1 @@
return args.skill?.name === "Entertain (Singing)";

View File

@ -0,0 +1,53 @@
const repaired_message = `<p>Finished repairing <em>${this.item.name}</em>.</p>`;
const test = 'Trade (Carpentry)';
const difficulty = 'easy';
const target = 20;
const extendedTestData = {
name: this.item.name,
type: "extendedTest",
img: this.item.img,
system: {
SL: {
current: 0,
target: target
},
test: {
value: test
},
completion: {
value: "remove"
},
difficulty: {
value: difficulty
}
},
effects: [
{
name: `Repair the ${this.item.name}`,
icon: this.item.img,
flags: {
wfrp4e: {
applicationData: {
type: "document",
documentType: "Item"
},
scriptData: [
{
label: this.item.name,
script: `
let id = this.item.flags.wfrp4e.fromEffect;
let effect = this.actor.appliedEffects.find(e => e.id === id);
this.script.scriptMessage("${repaired_message}");
await effect.item.delete();
`,
trigger: "deleteEffect"
}
]
}
}
}
]
};
await this.actor.createEmbeddedDocuments("Item", [extendedTestData], {fromEffect: this.effect.id});

View File

@ -0,0 +1,53 @@
const repaired_message = `<p>Finished repairing <em>${this.item.name}</em>.</p>`;
const test = 'Sail';
const difficulty = 'easy';
const target = 10;
const extendedTestData = {
name: this.item.name,
type: "extendedTest",
img: this.item.img,
system: {
SL: {
current: 0,
target: target
},
test: {
value: test
},
completion: {
value: "remove"
},
difficulty: {
value: difficulty
}
},
effects: [
{
name: `Repair the ${this.item.name}`,
icon: this.item.img,
flags: {
wfrp4e: {
applicationData: {
type: "document",
documentType: "Item"
},
scriptData: [
{
label: this.item.name,
script: `
let id = this.item.flags.wfrp4e.fromEffect;
let effect = this.actor.appliedEffects.find(e => e.id === id);
this.script.scriptMessage("${repaired_message}");
await effect.item.delete();
`,
trigger: "deleteEffect"
}
]
}
}
}
]
};
await this.actor.createEmbeddedDocuments("Item", [extendedTestData], {fromEffect: this.effect.id});

View File

@ -0,0 +1,11 @@
let test = await this.actor.setupSkill(game.i18n.localize("NAME.Endurance"), {fields: {difficulty : "average"}, appendTitle : " - Wounded"})
await test.roll();
if (test.failed)
{
fromUuid("Compendium.wfrp4e-core.items.kKccDTGzWzSXCBOb").then(disease => {
this.actor.createEmbeddedDocuments("Item", [disease.toObject()])
this.script.scriptNotification("Gained " + disease.name)
})
}

View File

@ -0,0 +1,8 @@
let modifier = 0
if (this.effect.name.includes("Moderate"))
modifier = -20
else
modifier = -10
args.fields.modifier += modifier

View File

@ -6,13 +6,16 @@ if (!currentCareer) return
let inCurrentCareer = currentCareer.system.skills.includes(skill); let inCurrentCareer = currentCareer.system.skills.includes(skill);
if (existingSkill && inCurrentCareer) let perfectPitchAdded = this.actor.getFlag("wfrp4e", "perfectPitchAdded") || {};
if (existingSkill && inCurrentCareer && !perfectPitchAdded[existingSkill.name])
{ {
existingSkill.system.advances.costModifier = -5; existingSkill.system.advances.costModifier = -5;
} }
else else
{ {
perfectPitchAdded[skill] = true;
currentCareer.system.skills.push(skill); currentCareer.system.skills.push(skill);
setProperty(this.actor, "flags.wfrp4e.perfectPitchAdded", perfectPitchAdded)
} }

View File

@ -0,0 +1,2 @@
if (args.actorsystem.details.move.oars.value > 0)
args.actor.system.details.move.oars.value -= 2;

View File

@ -0,0 +1,7 @@
if (this.actor.flags.holed.half !== true) return;
if (this.actor.flags.holed.reminded === true) return;
const speaker = ChatMessage.getSpeaker({actor: this.actor});
this.script.scriptMessage(`<p><b>${speaker.alias}</b> sits heavily in the water. Unless the cargo is waterproof, it loses [[d10]]% of its value.</p>`);
this.actor.flags.holed.reminded = true;

View File

@ -0,0 +1,19 @@
let skill = `Language (Magick)`
let currentCareer = this.actor.system.currentCareer;
let existingSkill = this.actor.itemTypes.skill.find(i => i.name == skill);
if (!currentCareer) return
let inCurrentCareer = currentCareer.system.skills.includes(skill);
let witchAdded = actor.getFlag("wfrp4e", "witchAdded") || {};
if (existingSkill && inCurrentCareer && !witchAdded[existingSkill.name])
{
existingSkill.system.advances.costModifier = -5;
}
else
{
witchAdded[skill] = true;
currentCareer.system.skills.push(skill);
setProperty(this.actor, "flags.wfrp4e.witchAdded", witchAdded)
}

View File

@ -0,0 +1 @@
return args.skill?.name === game.i18n.localize("NAME.Navigation");

View File

@ -0,0 +1,18 @@
if (args.totalWoundLoss <= 7) return;
let options = {
appendTitle : " " + this.effect.name,
skipTargets: true,
fields: {difficulty: 'average'},
characteristic: 'wp',
}
let test = await args.actor.setupSkill('Cool', options);
await test.roll();
if (!test.succeeded) {
const targetId = this.effect.getFlag("wfrp4e", "target");
const target = canvas.scene.tokens.get(targetId);
await this.effect.delete();
args.extraMessages.push(`<b>${args.actor.name}</b> lost ${args.totalWoundLoss} Wounds to an attack, which caused it to let go of <b>${target.name}</b>.`);
}

View File

@ -0,0 +1,53 @@
const repaired_message = `<p>Finished repairing <em>${this.item.name}</em>.</p>`;
const test = 'Trade (Carpentry)';
const difficulty = 'hard';
const target = 30;
const extendedTestData = {
name: this.item.name,
type: "extendedTest",
img: this.item.img,
system: {
SL: {
current: 0,
target: target
},
test: {
value: test
},
completion: {
value: "remove"
},
difficulty: {
value: difficulty
}
},
effects: [
{
name: `Repair the ${this.item.name}`,
icon: this.item.img,
flags: {
wfrp4e: {
applicationData: {
type: "document",
documentType: "Item"
},
scriptData: [
{
label: this.item.name,
script: `
let id = this.item.flags.wfrp4e.fromEffect;
let effect = this.actor.appliedEffects.find(e => e.id === id);
this.script.scriptMessage("${repaired_message}");
await effect.item.delete();
`,
trigger: "deleteEffect"
}
]
}
}
}
]
};
await this.actor.createEmbeddedDocuments("Item", [extendedTestData], {fromEffect: this.effect.id});

View File

@ -0,0 +1,9 @@
let animalCare = this.actor.itemTypes.skill.find(s => s.name === game.i18n.localize("NAME.AnimalCare"));
let animalTrainings = this.actor.itemTypes.skill.filter(s => s.name.includes(game.i18n.localize("NAME.AnimalTraining")));
if (animalCare)
animalCare.system.modifier.value += 20;
for (let training of animalTrainings) {
training.system.modifier.value += 30;
}

View File

@ -0,0 +1,4 @@
let specification = Number(this.item.specification.value) || 1;
args.actor.system.status.wounds.max += Math.floor(args.actor.system.status.wounds.max * 0.3 * specification);
args.actor.system.status.carries.max -= Math.floor(args.actor.system.status.carries.max * 0.1 * specification);
args.actor.system.details.price.gc += Math.floor(args.actor.system.details.price.gc * 0.2 * specification);

View File

@ -0,0 +1,52 @@
let actor = this.actor;
let effect = this.effect;
let bleedingAmt;
let bleedingRoll;
let msg = ""
let damage = effect.conditionValue;
let scriptArgs = {msg, damage};
await Promise.all(actor.runScripts("preApplyCondition", {effect, data : scriptArgs}))
msg = scriptArgs.msg;
damage = scriptArgs.damage;
msg += await actor.applyBasicDamage(damage, {damageType : game.wfrp4e.config.DAMAGE_TYPE.IGNORE_ALL, minimumOne : false, suppressMsg : true})
if (actor.status.wounds.value == 0 && !actor.hasCondition("unconscious"))
{
await actor.addCondition("unconscious")
msg += "<br>" + game.i18n.format("BleedUnc", {name: actor.prototypeToken.name })
}
if (actor.hasCondition("unconscious"))
{
bleedingAmt = effect.conditionValue;
bleedingRoll = (await new Roll("1d100").roll()).total;
if (bleedingRoll <= bleedingAmt * 10)
{
msg += "<br>" + game.i18n.format("BleedFail", {name: actor.prototypeToken.name}) + " (" + game.i18n.localize("Rolled") + " " + bleedingRoll + ")";
await actor.addCondition("dead")
}
else if (bleedingRoll % 11 == 0)
{
msg += "<br>" + game.i18n.format("BleedCrit", { name: actor.prototypeToken.name } ) + " (" + game.i18n.localize("Rolled") + bleedingRoll + ")"
await actor.removeCondition("bleeding")
}
else
{
msg += "<br>" + game.i18n.localize("BleedRoll") + ": " + bleedingRoll;
}
}
await Promise.all(actor.runScripts("applyCondition", {effect, data : {bleedingRoll}}))
if (args.suppressMessage)
{
let messageData = game.wfrp4e.utility.chatDataSetup(msg);
messageData.speaker = {alias: this.effect.name}
messageData.flavor = this.effect.name;
return messageData
}
else
{
return this.script.scriptMessage(msg)
}

View File

@ -0,0 +1 @@
return args.skill?.name !== game.i18n.localize("NAME.Row") && args.skill?.name !== game.i18n.localize("NAME.Swim") && !args.skill?.name.includes(game.i18n.localize("NAME.Sail"));

View File

@ -0,0 +1,5 @@
let loc = (await game.wfrp4e.tables.rollTable("hitloc")).result;
let critTable = `crit${this.generalizeTable(loc)`;
let crit = (await game.wfrp4e.tables.rollTable(critTable)).result;
this.script.scriptMessage(`{this.actor.name} suffers a ${crit} (location : ${loc}). Do not apply bleeding or any additonnal wounds.`);

View File

@ -0,0 +1,8 @@
if (isNaN(parseInt(this.item.system.specification.value)))
{
let value = await ValueDialog.create("Enter Fear value", this.item.name);
if (value)
{
this.item.updateSource({"system.specification.value" : value});
}
}

View File

@ -0,0 +1,13 @@
let items = [];
let etiquette = (await fromUuid("Compendium.wfrp4e-core.items.Item.sYbgpSnRqSZWgwFP")).toObject();
etiquette.name += " (Followers of Khorne)";
items.push(etiquette);
let animosity = (await fromUuid("Compendium.wfrp4e-core.items.Item.Q2MCUrG2HppMcvN0")).toObject();
animosity.name = animosity.name.replace("(Target)", "(Followers of Slaanesh)");
items.push(animosity);
await this.actor.createEmbeddedDocuments("Item", items, {fromEffect : this.effect.id});

View File

@ -0,0 +1,53 @@
const repaired_message = `<p>Finished repairing <em>${this.item.name}</em>.</p>`;
const test = 'Sail';
const difficulty = 'average';
const target = 30;
const extendedTestData = {
name: this.item.name,
type: "extendedTest",
img: this.item.img,
system: {
SL: {
current: 0,
target: target
},
test: {
value: test
},
completion: {
value: "remove"
},
difficulty: {
value: difficulty
}
},
effects: [
{
name: `Repair the ${this.item.name}`,
icon: this.item.img,
flags: {
wfrp4e: {
applicationData: {
type: "document",
documentType: "Item"
},
scriptData: [
{
label: this.item.name,
script: `
let id = this.item.flags.wfrp4e.fromEffect;
let effect = this.actor.appliedEffects.find(e => e.id === id);
this.script.scriptMessage("${repaired_message}");
await effect.item.delete();
`,
trigger: "deleteEffect"
}
]
}
}
}
]
};
await this.actor.createEmbeddedDocuments("Item", [extendedTestData], {fromEffect: this.effect.id});

View File

@ -0,0 +1,53 @@
const repaired_message = `<p>Finished repairing <em>${this.item.name}</em>.</p>`;
const test = 'Trade (Engineer)';
const difficulty = 'easy';
const target = 10;
const extendedTestData = {
name: this.item.name,
type: "extendedTest",
img: this.item.img,
system: {
SL: {
current: 0,
target: target
},
test: {
value: test
},
completion: {
value: "remove"
},
difficulty: {
value: difficulty
}
},
effects: [
{
name: `Repair the ${this.item.name}`,
icon: this.item.img,
flags: {
wfrp4e: {
applicationData: {
type: "document",
documentType: "Item"
},
scriptData: [
{
label: this.item.name,
script: `
let id = this.item.flags.wfrp4e.fromEffect;
let effect = this.actor.appliedEffects.find(e => e.id === id);
this.script.scriptMessage("${repaired_message}");
await effect.item.delete();
`,
trigger: "deleteEffect"
}
]
}
}
}
]
};
await this.actor.createEmbeddedDocuments("Item", [extendedTestData], {fromEffect: this.effect.id});

View File

@ -0,0 +1,10 @@
let morale = await new Roll("-1d10").roll();
let mood = await new Roll("-2d10").roll();
morale.toMessage(this.script.getChatData({flavor : "Morale"}));
mood.toMessage(this.script.getChatData({flavor : "Manann's Mood"}));
await this.actor.system.status.morale.addEntry("Albatross Died", morale.total)
await this.actor.system.status.mood.addEntry("Albatross Died", mood.total);
this.effect.delete();

View File

@ -0,0 +1 @@
return !args.skill?.name.includes(game.i18n.localize("NAME.Channelling")) && args.skill?.name != `${game.i18n.localize("NAME.Language")} (${game.i18n.localize("SPEC.Magick")})`

View File

@ -0,0 +1,53 @@
const repaired_message = `<p>Finished repairing <em>${this.item.name}</em>.</p>`;
const test = 'Trade (Carpenter)';
const difficulty = 'difficult';
const target = 40;
const extendedTestData = {
name: this.item.name,
type: "extendedTest",
img: this.item.img,
system: {
SL: {
current: 0,
target: target
},
test: {
value: test
},
completion: {
value: "remove"
},
difficulty: {
value: difficulty
}
},
effects: [
{
name: `Repair the ${this.item.name}`,
icon: this.item.img,
flags: {
wfrp4e: {
applicationData: {
type: "document",
documentType: "Item"
},
scriptData: [
{
label: this.item.name,
script: `
let id = this.item.flags.wfrp4e.fromEffect;
let effect = this.actor.appliedEffects.find(e => e.id === id);
this.script.scriptMessage("${repaired_message}");
await effect.item.delete();
`,
trigger: "deleteEffect"
}
]
}
}
}
]
};
await this.actor.createEmbeddedDocuments("Item", [extendedTestData], {fromEffect: this.effect.id});

Some files were not shown because too many files have changed in this diff Show More