Sync to v7.2.0

This commit is contained in:
LeRatierBretonnien 2024-06-06 21:09:27 +02:00
parent 90214619d6
commit da6fe66887
218 changed files with 2680 additions and 131 deletions

71
fr.json
View File

@ -365,6 +365,8 @@
"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",
"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 !",
@ -839,6 +841,9 @@
"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",
"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",
@ -920,6 +925,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,6 +1080,15 @@
"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",
"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",
@ -1112,6 +1128,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 +1755,7 @@
"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",
"SPEC.Tiny" : "Minuscule", "SPEC.Tiny" : "Minuscule",
"SPEC.Little" : "Très petite", "SPEC.Little" : "Très petite",
@ -1852,6 +1873,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 +2082,24 @@
"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",
"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",
@ -2195,6 +2235,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 +2312,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,6 +2390,8 @@
"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",
@ -2425,5 +2475,24 @@
"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}"
} }

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")
@ -294,13 +294,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.instance.converters.tableResults(results)
} }
return results return results
}, },

View File

@ -1 +1 @@
MANIFEST-000746 MANIFEST-000756

View File

@ -1,7 +1,3 @@
2024/05/31-09:37:32.376772 7f19c7e006c0 Recovering log #744 2024/06/06-20:54:36.421316 7fcfb2a006c0 Recovering log #754
2024/05/31-09:37:32.432762 7f19c7e006c0 Delete type=3 #742 2024/06/06-20:54:36.431498 7fcfb2a006c0 Delete type=3 #752
2024/05/31-09:37:32.432815 7f19c7e006c0 Delete type=0 #744 2024/06/06-20:54:36.431579 7fcfb2a006c0 Delete type=0 #754
2024/05/31-10:40:01.792285 7f19c56006c0 Level-0 table #749: started
2024/05/31-10:40:01.792317 7f19c56006c0 Level-0 table #749: 0 bytes OK
2024/05/31-10:40:01.798878 7f19c56006c0 Delete type=0 #747
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)

View File

@ -1,7 +1,7 @@
2024/05/29-22:15:26.921445 7f5b0b8006c0 Recovering log #739 2024/06/01-20:41:11.767917 7f47516006c0 Recovering log #751
2024/05/29-22:15:26.945868 7f5b0b8006c0 Delete type=3 #737 2024/06/01-20:41:11.778523 7f47516006c0 Delete type=0 #751
2024/05/29-22:15:26.945925 7f5b0b8006c0 Delete type=0 #739 2024/06/01-20:41:11.778570 7f47516006c0 Delete type=3 #750
2024/05/29-22:42:08.086719 7f5b0a8006c0 Level-0 table #745: started 2024/06/01-20:41:56.329216 7f474f8006c0 Level-0 table #755: started
2024/05/29-22:42:08.086744 7f5b0a8006c0 Level-0 table #745: 0 bytes OK 2024/06/01-20:41:56.329241 7f474f8006c0 Level-0 table #755: 0 bytes OK
2024/05/29-22:42:08.093895 7f5b0a8006c0 Delete type=0 #743 2024/06/01-20:41:56.335388 7f474f8006c0 Delete type=0 #753
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/06/01-20:41:56.348176 7f474f8006c0 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-000758

View File

@ -1,7 +1,3 @@
2024/05/31-09:37:32.440532 7f19c60006c0 Recovering log #746 2024/06/06-20:54:36.435801 7fcfb34006c0 Recovering log #756
2024/05/31-09:37:32.493255 7f19c60006c0 Delete type=3 #744 2024/06/06-20:54:36.446523 7fcfb34006c0 Delete type=3 #754
2024/05/31-09:37:32.493359 7f19c60006c0 Delete type=0 #746 2024/06/06-20:54:36.446619 7fcfb34006c0 Delete type=0 #756
2024/05/31-10:40:01.811747 7f19c56006c0 Level-0 table #751: started
2024/05/31-10:40:01.811783 7f19c56006c0 Level-0 table #751: 0 bytes OK
2024/05/31-10:40:01.817818 7f19c56006c0 Delete type=0 #749
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)

View File

@ -1,7 +1,7 @@
2024/05/29-22:15:26.951019 7f5b0d6006c0 Recovering log #741 2024/06/01-20:41:11.781332 7f47520006c0 Recovering log #753
2024/05/29-22:15:26.961978 7f5b0d6006c0 Delete type=3 #739 2024/06/01-20:41:11.791330 7f47520006c0 Delete type=0 #753
2024/05/29-22:15:26.962039 7f5b0d6006c0 Delete type=0 #741 2024/06/01-20:41:11.791383 7f47520006c0 Delete type=3 #752
2024/05/29-22:42:08.094093 7f5b0a8006c0 Level-0 table #747: started 2024/06/01-20:41:56.335472 7f474f8006c0 Level-0 table #757: started
2024/05/29-22:42:08.094135 7f5b0a8006c0 Level-0 table #747: 0 bytes OK 2024/06/01-20:41:56.335492 7f474f8006c0 Level-0 table #757: 0 bytes OK
2024/05/29-22:42:08.100255 7f5b0a8006c0 Delete type=0 #745 2024/06/01-20:41:56.341778 7f474f8006c0 Delete type=0 #755
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/06/01-20:41:56.348186 7f474f8006c0 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-000756

View File

@ -1,7 +1,3 @@
2024/05/31-09:37:32.579979 7f19c60006c0 Recovering log #744 2024/06/06-20:54:36.466388 7fcfb34006c0 Recovering log #754
2024/05/31-09:37:32.634808 7f19c60006c0 Delete type=3 #742 2024/06/06-20:54:36.476745 7fcfb34006c0 Delete type=3 #752
2024/05/31-09:37:32.634871 7f19c60006c0 Delete type=0 #744 2024/06/06-20:54:36.476826 7fcfb34006c0 Delete type=0 #754
2024/05/31-10:40:01.798996 7f19c56006c0 Level-0 table #749: started
2024/05/31-10:40:01.799024 7f19c56006c0 Level-0 table #749: 0 bytes OK
2024/05/31-10:40:01.805113 7f19c56006c0 Delete type=0 #747
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)

View File

@ -1,7 +1,7 @@
2024/05/29-22:15:26.981610 7f5b0c2006c0 Recovering log #739 2024/06/01-20:41:11.810548 7f47502006c0 Recovering log #751
2024/05/29-22:15:26.991864 7f5b0c2006c0 Delete type=3 #737 2024/06/01-20:41:11.865308 7f47502006c0 Delete type=0 #751
2024/05/29-22:15:26.991966 7f5b0c2006c0 Delete type=0 #739 2024/06/01-20:41:11.865356 7f47502006c0 Delete type=3 #750
2024/05/29-22:42:08.100370 7f5b0a8006c0 Level-0 table #745: started 2024/06/01-20:41:56.348302 7f474f8006c0 Level-0 table #755: started
2024/05/29-22:42:08.100395 7f5b0a8006c0 Level-0 table #745: 0 bytes OK 2024/06/01-20:41:56.348325 7f474f8006c0 Level-0 table #755: 0 bytes OK
2024/05/29-22:42:08.107039 7f5b0a8006c0 Delete type=0 #743 2024/06/01-20:41:56.354398 7f474f8006c0 Delete type=0 #753
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/06/01-20:41:56.385741 7f474f8006c0 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-000756

View File

@ -1,7 +1,3 @@
2024/05/31-09:37:32.306200 7f19c60006c0 Recovering log #744 2024/06/06-20:54:36.406301 7fcfb34006c0 Recovering log #754
2024/05/31-09:37:32.365977 7f19c60006c0 Delete type=3 #742 2024/06/06-20:54:36.416875 7fcfb34006c0 Delete type=3 #752
2024/05/31-09:37:32.366032 7f19c60006c0 Delete type=0 #744 2024/06/06-20:54:36.416980 7fcfb34006c0 Delete type=0 #754
2024/05/31-10:40:01.779134 7f19c56006c0 Level-0 table #749: started
2024/05/31-10:40:01.779173 7f19c56006c0 Level-0 table #749: 0 bytes OK
2024/05/31-10:40:01.785789 7f19c56006c0 Delete type=0 #747
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)

View File

@ -1,7 +1,7 @@
2024/05/29-22:15:26.903601 7f5b0c2006c0 Recovering log #739 2024/06/01-20:41:11.755391 7f47502006c0 Recovering log #751
2024/05/29-22:15:26.917559 7f5b0c2006c0 Delete type=3 #737 2024/06/01-20:41:11.764693 7f47502006c0 Delete type=0 #751
2024/05/29-22:15:26.917932 7f5b0c2006c0 Delete type=0 #739 2024/06/01-20:41:11.764768 7f47502006c0 Delete type=3 #750
2024/05/29-22:42:08.040267 7f5b0a8006c0 Level-0 table #745: started 2024/06/01-20:41:56.312298 7f474f8006c0 Level-0 table #755: started
2024/05/29-22:42:08.040295 7f5b0a8006c0 Level-0 table #745: 0 bytes OK 2024/06/01-20:41:56.312320 7f474f8006c0 Level-0 table #755: 0 bytes OK
2024/05/29-22:42:08.068788 7f5b0a8006c0 Delete type=0 #743 2024/06/01-20:41:56.318409 7f474f8006c0 Delete type=0 #753
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/06/01-20:41:56.318543 7f474f8006c0 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-000756

View File

@ -1,7 +1,3 @@
2024/05/31-09:37:32.229735 7f19c7e006c0 Recovering log #744 2024/06/06-20:54:36.390344 7fcfb2a006c0 Recovering log #754
2024/05/31-09:37:32.290900 7f19c7e006c0 Delete type=3 #742 2024/06/06-20:54:36.401236 7fcfb2a006c0 Delete type=3 #752
2024/05/31-09:37:32.290955 7f19c7e006c0 Delete type=0 #744 2024/06/06-20:54:36.401373 7fcfb2a006c0 Delete type=0 #754
2024/05/31-10:40:01.745865 7f19c56006c0 Level-0 table #749: started
2024/05/31-10:40:01.745898 7f19c56006c0 Level-0 table #749: 0 bytes OK
2024/05/31-10:40:01.752538 7f19c56006c0 Delete type=0 #747
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)

View File

@ -1,7 +1,7 @@
2024/05/29-22:15:26.888481 7f5b0cc006c0 Recovering log #739 2024/06/01-20:41:11.741198 7f4750c006c0 Recovering log #751
2024/05/29-22:15:26.899481 7f5b0cc006c0 Delete type=3 #737 2024/06/01-20:41:11.752851 7f4750c006c0 Delete type=0 #751
2024/05/29-22:15:26.899538 7f5b0cc006c0 Delete type=0 #739 2024/06/01-20:41:11.752903 7f4750c006c0 Delete type=3 #750
2024/05/29-22:42:08.080368 7f5b0a8006c0 Level-0 table #745: started 2024/06/01-20:41:56.304431 7f474f8006c0 Level-0 table #755: started
2024/05/29-22:42:08.080405 7f5b0a8006c0 Level-0 table #745: 0 bytes OK 2024/06/01-20:41:56.304456 7f474f8006c0 Level-0 table #755: 0 bytes OK
2024/05/29-22:42:08.086437 7f5b0a8006c0 Delete type=0 #743 2024/06/01-20:41:56.312191 7f474f8006c0 Delete type=0 #753
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/06/01-20:41:56.318536 7f474f8006c0 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-000399

View File

@ -1,8 +1,3 @@
2024/05/31-09:37:32.503566 7f19c7e006c0 Recovering log #387 2024/06/06-20:54:36.451532 7fcfb2a006c0 Recovering log #397
2024/05/31-09:37:32.572091 7f19c7e006c0 Delete type=3 #385 2024/06/06-20:54:36.462207 7fcfb2a006c0 Delete type=3 #395
2024/05/31-09:37:32.572143 7f19c7e006c0 Delete type=0 #387 2024/06/06-20:54:36.462346 7fcfb2a006c0 Delete type=0 #397
2024/05/31-10:40:01.805216 7f19c56006c0 Level-0 table #392: started
2024/05/31-10:40:01.805249 7f19c56006c0 Level-0 table #392: 0 bytes OK
2024/05/31-10:40:01.811475 7f19c56006c0 Delete type=0 #390
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/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)

View File

@ -1,8 +1,8 @@
2024/05/29-22:15:26.967160 7f5b0cc006c0 Recovering log #382 2024/06/01-20:41:11.796336 7f4750c006c0 Recovering log #394
2024/05/29-22:15:26.977447 7f5b0cc006c0 Delete type=3 #380 2024/06/01-20:41:11.805903 7f4750c006c0 Delete type=0 #394
2024/05/29-22:15:26.977504 7f5b0cc006c0 Delete type=0 #382 2024/06/01-20:41:11.805963 7f4750c006c0 Delete type=3 #393
2024/05/29-22:42:08.107240 7f5b0a8006c0 Level-0 table #388: started 2024/06/01-20:41:56.341877 7f474f8006c0 Level-0 table #398: started
2024/05/29-22:42:08.107291 7f5b0a8006c0 Level-0 table #388: 0 bytes OK 2024/06/01-20:41:56.341900 7f474f8006c0 Level-0 table #398: 0 bytes OK
2024/05/29-22:42:08.113903 7f5b0a8006c0 Delete type=0 #386 2024/06/01-20:41:56.348074 7f474f8006c0 Delete type=0 #396
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/06/01-20:41:56.348194 7f474f8006c0 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/06/01-20:41:56.348213 7f474f8006c0 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});

View File

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

View File

@ -0,0 +1,3 @@
let test = args.test
if (test.result.minormis || test.result.majormis || test.result.catastrophicmis)
test.result.other.push("Can make a <b>Difficult (-10) Willpower</b> Test to prevent the Miscast")

View File

@ -0,0 +1,18 @@
fromUuid(this.effect.origin).then(caster => {
if (caster) {
if (actor.items.find(it => it.name == game.i18n.localize("Bestial"))) {
let healed = caster.characteristics.wp.bonus
let wounds = duplicate(args.actor.status.wounds)
wounds.value += healed
if (wounds.value > wounds.max)
wounds.value = wounds.max
args.actor.update({ "system.status.wounds": wounds })
ChatMessage.create({ content: `${this.actor.prototypeToken.name} regains ${healed} Wounds`, speaker: { alias: this.effect.name } })
} else {
ui.notifications.warn("Target actor has no Bestial trait")
}
}
})

View File

@ -0,0 +1,53 @@
const repaired_message = `<p>Finished repairing <em>${this.item.name}</em>.</p>`;
const test = 'Trade (Carpenter)';
const difficulty = 'hard';
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,53 @@
const repaired_message = `<p>Finished repairing <em>${this.item.name}</em>.</p>`;
const test = 'Maintenance Crew Test';
const difficulty = 'hard';
const target = 80;
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 = 'Strength';
const difficulty = 'average';
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});

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