diff --git a/src/assets/icons/effects/eye-target.svg b/src/assets/icons/effects/eye-target.svg new file mode 100644 index 00000000..b9e22c54 --- /dev/null +++ b/src/assets/icons/effects/eye-target.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/effects/immune.svg b/src/assets/icons/effects/immune.svg new file mode 100644 index 00000000..65787fb5 --- /dev/null +++ b/src/assets/icons/effects/immune.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/ui/other-svg/dread.svg b/src/assets/ui/other-svg/dread.svg new file mode 100644 index 00000000..a33224a9 --- /dev/null +++ b/src/assets/ui/other-svg/dread.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/lang/de.json b/src/lang/de.json index 48a8ef80..2b8843c6 100644 --- a/src/lang/de.json +++ b/src/lang/de.json @@ -464,13 +464,9 @@ "DL.ModsDisableAfflictions": "Alle Zustände deaktiviern", "DL.ModsDamage": "Schadenseffekte", "DL.injured": "Verletzt", - "DL.injuredText": "Du zählst als verletzt, wenn der erlittene Schaden gleich oder höher der Hälfte deiner Lebenspunkte ist.", "DL.incapacitated": "Kampfunfähig", - "DL.incapacitatedText": "Ein Wesen wird kampfunfähig, wenn die Gesamtsumme des Schades den Lebenspunkten entspricht. Wenn man kampfunfähig wird, geht man zu Boden. Man bleibt so lange kampfunfähig wie der Schaden den Lebenspunkten entspricht. Wenn man zusätzlich Schaden erleidet stirbt man. Wesen die keine Spielercharaktere sind die kampfunfägig werden, sterben entweder oder werden für 1W3 Stunden bewusstlos, nach Entscheidung des Spielleiters. Spielercharaktere werden ausgeschaltet und machen Schicksalswürfe um zu sehen was mit ihnen geschieht.", "DL.disabled": "Augeschaltet", - "DL.disabledText": "Schicksalswurf: Am Ende jeder Runde in der man ausgeschaltet ist würfele einen 1W6. Bei einen 1 bist du sterbend. Bei einer 6 heilst du 1 Schaden und wirst für eine Minute beeinträchtigt. Nach 3 aufeinanderfolgenden Runden in denen du ausgeschaltet bist wirst du für 1W3 Stunden bewusstlos und machst keine Schicksalswürfe mehr. Am Ende dieser Zeit heilst du 1 Schaden und bist für 1 Minute beeinträchtigt.", "DL.dying": "Sterbend", - "DL.dyingText": "Schicksalswurf: Am Ende jeder Runde in der sterbend bist würfele 1W6. Bei einer 1 stirbst du. Bei einer 6 bist du wieder ausgeschaltet. Andere Ergebnisse haben keinen Effekt.", "DL.Actions": "Actions", "DL.asleep": "Schalfend", "DL.blinded": "Blind", @@ -508,13 +504,17 @@ "DL.AfflictionsDazed": "Ein benommenes Lebewesen kann keine Aktionen ausführen.", "DL.AfflictionsDeafened": "Ein betäubtes Wesen kann sich nicht bewegen und keine Aktionen nutzen. Alle versuchten Proben schlagen automatisch fehl. Andere Wesen erhalten bei Angriffen gegen betäubte Gegner 1 Vorteilswürfel.", "DL.AfflictionsDefenseless": "Ein wehrloses Wesen kann sich nicht verteidigen. Sein Wert in Verteidigung sinkt auf 5, es kann keine Aktionen nutzen und Attributs-Proben scheitern automatisch. Das Wesen kann jedoch weiterhin seine Umgebung wahrnehmen und Wahrnehmungs-Proben würfeln.", + "DL.AfflictionsDisabled": "Schicksalswurf: Am Ende jeder Runde in der man ausgeschaltet ist würfele einen 1W6. Bei einen 1 bist du sterbend. Bei einer 6 heilst du 1 Schaden und wirst für eine Minute beeinträchtigt. Nach 3 aufeinanderfolgenden Runden in denen du ausgeschaltet bist wirst du für 1W3 Stunden bewusstlos und machst keine Schicksalswürfe mehr. Am Ende dieser Zeit heilst du 1 Schaden und bist für 1 Minute beeinträchtigt.", "DL.AfflictionsDiseased": "Ein krankes Wesen erhält auf alle Angriffe und Proben 1 Nachteilswürfel.", + "DL.AfflictionsDying": "Schicksalswurf: Am Ende jeder Runde in der sterbend bist würfele 1W6. Bei einer 1 stirbst du. Bei einer 6 bist du wieder ausgeschaltet. Andere Ergebnisse haben keinen Effekt.", "DL.AfflictionsFatigued": "Ein erschöpftes Lebewesen erhält auf alle Angriffe und Proben 1 Nachteilswürfel.", "DL.AfflictionsFrightened": "Ein verängstigtes Wesen erhält auf alle Angriffe und Proben 1 Nachteilswürfel, wenn es die Quelle seiner Furcht sehen kann.", "DL.AfflictionsHorrified": "Ein verängstigtes Wesen erhält auf alle Angriffe und Proben 3 Nachteilswürfeln, wenn es die Quelle seiner Furcht sehen kann.", "DL.AfflictionsGrabbed": "Der Effekt dieses Zustands hängt von der Größe des Wesens ab. Ist die Größe des festgehaltenen Wesens kleiner oder gleich der Größe des Angreifers, kann es sich nicht wegbewegen, bis der Zustand endet. Ist das festgehaltene Wesen jedoch größer als der Angreifer, kann Letzterer sich dazu entscheiden, den Zustand entweder zu beenden oder sich mitzubewegen. Siehe Festhalten für weitere Informationen, wie du jemanden festhalten kannst, und Entkommen, wenn du wissen willst, wie du dich befreien kannst.", "DL.AfflictionsImmobilized": "Ein bewegungsunfähiges Wesen verfügt über Bewegungsrate 0 und kann keine entsprechenden Boni nutzen. Andere Wesen erhalten auf Angriffe 1 Vorteilswürfel.", "DL.AfflictionsImpaired": "Ein beeinträchtigtes Wesen erhält auf alle Angriffe und Proben 1 Nachteilswürfel.", + "DL.AfflictionsIncapacitated": "Ein Wesen wird kampfunfähig, wenn die Gesamtsumme des Schades den Lebenspunkten entspricht. Wenn man kampfunfähig wird, geht man zu Boden. Man bleibt so lange kampfunfähig wie der Schaden den Lebenspunkten entspricht. Wenn man zusätzlich Schaden erleidet stirbt man. Wesen die keine Spielercharaktere sind die kampfunfägig werden, sterben entweder oder werden für 1W3 Stunden bewusstlos, nach Entscheidung des Spielleiters. Spielercharaktere werden ausgeschaltet und machen Schicksalswürfe um zu sehen was mit ihnen geschieht.", + "DL.AfflictionsInjured": "Du zählst als verletzt, wenn der erlittene Schaden gleich oder höher der Hälfte deiner Lebenspunkte ist.", "DL.AfflictionsPoisoned": "Ein vergiftetes Wesen erhält auf alle Angriffe und Proben 1 Nachteilswürfel.", "DL.AfflictionsProne": "Das Wesen liegt am Boden. Andere Wesen können sich durch ihren Bereich bewegen. Solange du liegend bist, kann du dich nur kriechend fortbewegen oder deine Bewegung nutzen, um aufzustehen. Ein liegendes Wesen erhält auf alle Stärke- und Gewandtheits-Proben 1 Nachteilswürfel. Wesen in Nahkampfreichweite erhalten auf Angriffe 1 Vorteilswürfel, Wesen außerhalb ihrer Nahkampfreichweite erhalten 1 Nachteilswürfel.", "DL.AfflictionsSlowed": "Ein verlangsamtes Wesen kann nur einen Langsamen Zug ausführen (siehe Abschnitt Kampf), seine Bewegungsrate wird halbiert und es profitiert nicht von entsprechenden Boni auf Bewegung.", diff --git a/src/lang/en.json b/src/lang/en.json index 997a9529..54032ff3 100644 --- a/src/lang/en.json +++ b/src/lang/en.json @@ -77,7 +77,6 @@ "DL.ActorTypeNPC": "NPC", "DL.ActorTypePC": "PC", "DL.AddAttackOptions": "Add Attack Options", - "DL.AffectedRolls": "Affected Rolls", "DL.Afflictions": "Afflictions", "DL.AfflictionsAsleep": "A sleeping creature is prone and unconscious. Another creature that can reach it can use an action to wake it up. Unless otherwise noted, taking damage removes this affliction.", "DL.AfflictionsBlinded": "A blinded creature cannot see. It treats its surroundings as totally obscured (see Obscurement). Other creatures make attack rolls with 1 boon against a blinded creature’s Defense or Agility. Perception challenge rolls that rely on sight automatically result in failure. Finally, the blinded creature’s Speed becomes 2 unless its normal Speed is lower.", @@ -88,7 +87,9 @@ "DL.AfflictionsDeafened": "A deafened creature cannot hear. Perception challenge rolls made to listen automatically result in failure.", "DL.AfflictionsDefend": "When you defend, until the end of the round, all attack rolls are made against you with 1 bane and you make all challenge rolls to resist attacks with 1 boon. These benefits end if you are prevented from using actions, such as when you become dazed, stunned, or unconscious.", "DL.AfflictionsDefenseless": "A defenseless creature cannot defend itself. Its Defense is 5, it cannot use actions, and its challenge rolls using attributes result in failure. The creature can still perceive its surroundings, however, and can make Perception challenge rolls as normal.", + "DL.AfflictionsDisabled": "Disabled characters are defenseless. Fate Roll: At the end of each round you are disabled, roll a d6. On a 1, you start dying. On a 6, you heal 1 damage and become impaired for 1 minute. A roll of any other number has no effect. If after 3 consecutive rounds you are still disabled, you become unconscious for 1d3 hours and stop making the fate roll. At the end of this time, you heal 1 damage and become impaired for 1 minute.", "DL.AfflictionsDiseased": "A diseased creature makes all attack rolls and challenge rolls with 1 bane.", + "DL.AfflictionsDying": "Dying characters are unconscious. Fate Roll: At the end of each round you are dying, roll a d6. On a 1, you die. On a 6, you become disabled. A roll of any other number has no effect.", "DL.AfflictionsFatigued": "A fatigued creature makes all attack rolls and challenge rolls with 1 bane.", "DL.AfflictionsFrightened": "A frightened creature makes attack rolls and challenge rolls with 1 bane.", "DL.AfflictionsGrabbed": "The effects of the affliction depend on the creature’s Size. If the grabbed creature’s Size is equal to or smaller than that of the creature grabbing it, the grabbed creature cannot move away from the creature that grabbed it until it removes the affliction. If the grabbed creature’s Size is larger than that of the creature grabbing it, whenever the grabbed creature moves, the creature grabbing it can choose to move with it (by clinging to the grabbed creature’s body) or end the grab. (See Grab for more information on how to grab, and Escape for how to escape a grab.)", @@ -97,6 +98,8 @@ "DL.AfflictionsHorrified": "A horrified creature makes attack rolls and challenge rolls with 3 banes when it can see the source of the frightened affliction.", "DL.AfflictionsImmobilized": "An immobilized creature has Speed 0 and cannot benefit from bonuses to Speed. Other creatures make all attack rolls against the immobilized creature with 1 boon.", "DL.AfflictionsImpaired": "An impaired creature makes all attack rolls and challenge rolls with 1 bane.", + "DL.AfflictionsIncapacitated": "A creature becomes incapacitated when its damage total equals its Health score. Upon becoming incapacitated, the creature falls prone. A creature remains incapacitated until its damage total no longer equals its Health. If the creature takes any damage while incapacitated, it dies. Creatures other than player characters that become incapacitated either die or fall unconscious for 1d3 hours, as the GM decides. Player characters, however, become disabled and make fate rolls to determine what happens to them.", + "DL.AfflictionsInjured": "You are injured while your damage equals or exceeds one-half your Health. Being injured doesn’t normally change your capabilities, though some effects, talents, and traits can interact with this state.", "DL.AfflictionsPoisoned": "A poisoned creature makes all attack rolls and challenge rolls with 1 bane.", "DL.AfflictionsPrepare": "You prepare to undertake an activity when a specified event occurs. Choose one activity you would normally use an action to perform, such as attack or retreat. Then, describe what event has to occur for you to undertake it. This is the trigger. If the triggering event occurs before the end of the round, you can use a triggered action to perform the activity. You make any attack roll or challenge roll required by the activity with 1 boon. Otherwise, nothing happens.", "DL.AfflictionsProne": "A prone creature lies on the ground. Other creatures can move through its space. While prone, the creature can move by crawling or can use its move to stand up. The prone creature makes Strength and Agility rolls with 1 bane. Creatures that can reach the prone creature make all attack rolls against it with 1 boon, while creatures that cannot reach it make attack rolls against its Defense with 1 bane.", @@ -150,7 +153,6 @@ "DL.AttackDelete": "Delete attack", "DL.AttackEdit": "Edit attack", "DL.AttackRoll": "Attack Roll", - "DL.AttackRolls": "Attack Rolls", "DL.AttackRollAttackText": "ATTACK", "DL.AttackRollBonuses": "Attack Roll Bonus", "DL.AttackRollDamageText": "DAMAGE", @@ -179,12 +181,11 @@ "DL.BecomeFrightenedForRound": "You become frightened for {round} round.", "DL.BecomeFrightenedForRounds": "You become frightened for {round} rounds.", "DL.BecomeStunned": "You become stunned for {round} round.", - "DL.BothAttackAndChallengeRolls": "Both Attack and Challenge rolls", "DL.ButtonEdit": "Edit", "DL.ButtonView": "View", + "DL.CanSeeSoureOfAffliction" : "Can see the source of the affliction", "DL.ChallengeRequestRollText": "Request Challenge Roll", "DL.ChallengeRoll": "Challenge Roll", - "DL.ChallengeRolls": "Challenge Rolls", "DL.ChallengeRollBonus": "Challenge Roll Bonus", "DL.ChallengeRollText": "Challenge Roll:", "DL.ChallengeVS": "VS", @@ -314,6 +315,11 @@ "DL.DialogDeleteTraditionText": "The Tradition and all spells attached will be permanently deleted.", "DL.DialogDeleteTraitText": "The Trait will be permanently deleted.", "DL.DialogDeleteCreatureRoleText": "The Creature Role will be permanently deleted.", + "DL.DialogDoYouSeeThisCreatureFirstTime":"Do you you see this creature first time?", + "DL.DialogDoYouSeeTheseCreaturesFirstTime":"Do you you see these creatures first time?", + "DL.DialogDoYouStartYourTurnWithLOSCreature":"Do you start your turn with line of sight to the following creature?", + "DL.DialogDoYouStartYourTurnWithLOSCreatures":"Do you start your turn with line of sight to the following creatures?", + "DL.DialogInvalidRollFormula": "Invalid Roll Formula: {rollFormula}!", "DL.DialogFortuneAwarded": "Awarded a Fortune point.", "DL.DialogFortuneExpended": "Expended a Fortune point.", "DL.DialogHealedFor": "Healed ", @@ -363,12 +369,17 @@ "DL.DialogWarningActorsNotSelected": "Actor(s) not selected", "DL.DialogWarningActorsNotTargeted": "Actor(s) not targeted", "DL.DialogWarningAfflictionFromEffect": "Affliction is applied from effect. Remove the effect to remove the affliction.", + "DL.DialogWarningAlreadyMadeWILLImmune": "You've already made a Will challenge roll against {creature} and you are immune to its {trait} trait.", + "DL.DialogWarningAlreadyMadeWILLFrightened": "You've already made a Will challenge roll against {creature} and you are already frightened.", "DL.DialogWarningBlindedChallengeFailer": "You're blinded and perception challenge rolls result in failure.", "DL.DialogWarningCreatureArmor": "You can't add armor to a creature. Change the Defense value manually.", "DL.DialogWarningDazedFailer": "You're dazed and cannot use actions.", "DL.DialogWarningDefenselessFailer": "You're defenseless and cannot use actions, and challenge rolls using attributes result in failure.", + "DL.DialogWarningInvalidTarget": "No frightening or horrifying creature targeted or you've already performed a Will challenge roll.", "DL.DialogWarningStunnedFailer": "You're stunned and cannot use actions or move, and all your challenge rolls result in failure.", "DL.DialogWarningSurprisedFailer": "You're surprised and cannot use actions or move, and all your challenge rolls result in failure.", + "DL.DialogWarningTargetNotHorrifying": "{target} not horrifying.", + "DL.DialogWarningTargetNeitherFnorH":"{target} is neither frightening nor horrifying.", "DL.DialogWarningTargetNotSelected": "Target not selected", "DL.DialogWarningTargetNotTargeted": "Target not chosen", "DL.DialogWarningUnconsciousFailer": "You're unconscious and cannot use actions or move, and all your challenge rolls result in failure.", @@ -396,19 +407,27 @@ "DL.FeatureDelete": "Delete feature", "DL.FeatureEdit": "Edit feature", "DL.FeaturesTitle": "Features", - "DL.FourOrMoreCreatures": "Four or more creatures at once", + "DL.FourOrMoreCreatures": "You see four or more creatures at once, you make the roll with 1 bane.", "DL.FourOrMoreCreaturesInSight": "Sees four or more creatures at once", "DL.FrighteningHorrifyingEditor": "Frightening / Horrifying Trait Editor", - "DL.GainedInsanity": "You gain {insanity} Insanity.", - "DL.GainedInsanityAndGoMad": "You gain {insanity} Insanity and go mad.", + "DL.FrightenedYou": "{creature} frightened you.", + "DL.FrightenedBy": "Frightened by {creature}", + "DL.GainedInsanity" : "You gain {insanity} Insanity.", + "DL.GainedInsanityAndGoMad" : "You gain {insanity} Insanity and go mad.", "DL.GMTools": "GM Tools", "DL.GMnote": "GM Notes", "DL.GMnoteEdit": "Edit GM Note", "DL.GMnoteSave": "Save GM Note", "DL.HalfSpeed": "Half Speed", "DL.ImmuneAffliction": "Immune to Affliction", + "DL.ImmuneToTarget": "Immune to {creature}", + "DL.ImmuneToHorrifyingOneMinute": "You become immune to {creature}'s horrifying trait for 1 minute.", "DL.ImmuneAttribute": "Immune Attribute", "DL.ImmuneCharacteristic": "Immune Characteristic", + "DL.ImmunityLastsUntilTheEndOfTheRound": "Immunity to target horrifying trait lasts until the end of the round.", + "DL.ImmunityLastsUntilTheEndOfNextRound": "Immunity to target horrifying trait lasts until the end of the next round.", + "DL.ImmunityLastsRounds": "Immunity to target horrifying trait lasts {rounds} more rounds.", + "DL.ImmunityLastsSeconds": "Immunity to target horrifying trait lasts {seconds} seconds.", "DL.AfflictionImmunityEffectName": "{affliction} Immunity", "DL.IsDarkMagic": "Is Dark Magic", "DL.IsFrightening": "Is Frightening", @@ -578,6 +597,8 @@ "DL.SettingAttackReverseDamageHint": "Substract damage from Health insted of adding damage.", "DL.SettingOptionalRuleExceedsByFive": "20+ rule more than 5", "DL.SettingOptionalRuleExceedsByFiveHint": "Rules of effects of 20+ will require that you exceed the target by more than 5.", + "DL.SettingOptionalRuleBaneValue": "Horrified affliction imposes 2 banes instead of 3", + "DL.SettingOptionalRuleBaneValueHint": "Enable when you want to use Frightened & Horrified simultaneously.", "DL.SettingAttackShowEnemyAttribute": "Show Creature target number", "DL.SettingAttackShowEnemyAttributeAtt": "Show the Creatures attack number", "DL.SettingAttackShowEnemyAttributeAttHint": "Show the Creatures attack number you are rolling against in the chat.", @@ -617,8 +638,8 @@ "DL.SettingDSNLabel": "Dice So Nice! Settings", "DL.SettingEnableQuickDraw": "Enable one-click draw for rolltables.", "DL.SettingEnableQuickDrawHint": "Draw directly form sidebar, compendia or sheets (right-click).", - "DL.SettingFineseeAutoSelect": "Finesse weapon attack attribute auto select", - "DL.SettingFineseeAutoSelectHint": "Use greater attribute if not set: Strength or Agility. ", + "DL.SettingFinesseAutoSelect": "Finesse weapon attack attribute auto select", + "DL.SettingFinesseAutoSelectHint": "Use greater attribute if not set: Strength or Agility. ", "DL.SettingFortuneAwardPrevented": "Prevent Fortune award from non-GM users", "DL.SettingFortuneAwardPreventedHint": "When checked only GM can award Fortune.", "DL.SettingFortuneHide": "Hide Fortune on character sheets", @@ -632,7 +653,6 @@ "DL.SettingHideDamage": "Hide damage/effect buttons from chat messages when attack roll fails.", "DL.SettingHideDamageHint": "If target is not selected damage/effect buttons are always visible.", "DL.SettingHorrifyingBane": "Bane against horrifying creatures", - "DL.SettingHorrifyingBaneHint": "Apply a bane on all attack rolls targeting a horrifying creature, unless the attacker has the frightening or horrifying trait.", "DL.SettingIgnoreEncumbrance": "Ignore encumbrance", "DL.SettingIgnoreEncumbranceHint": "Ignore encumbrance rules when required attribute is not met.", "DL.SettingInitMessage": "Initiative Messages", @@ -641,17 +661,22 @@ "DL.SettingInitRandomizeHint": "Makes your initiative more random and adds a d6 to your initiative value.", "DL.SettingIntegrateTokenRuler": "Enable Foundry Token-Ruler integration", "DL.SettingIntegrateTokenRulerHint": "Disable other Token-Ruler modules. (Require refresh).", + "DL.SettingLaunchDialogReminder": "Enable Launch Dialog Reminder", + "DL.SettingLaunchDialogReminderHint": "Shows additional information in the Launch Dialog.", "DL.SettingLockAncestrHint": "Remove players access to change modifers, Speed, Insanity, Corruption and Health.", "DL.SettingLockAncestry": "Lock fields on Ancestry", + "DL.SettingOptionalRuleBaneMode": "Bane mode", "DL.SettingOptionalRuleBellCurveRolls": "Bell Curve Rolls (Attack/Challenge Roll: 3d6, BoB: d3, Challenge target nr.: 11)", "DL.SettingOptionalRuleBellStandardRolls": "SotDL Standard (Attack/Challenge Roll: d20, BoB: d6, Challenge target nr.: 10)", "DL.SettingOptionalRuleConsistentDamage": "Enable Consistent Damage", "DL.SettingOptionalRuleDieRollsMode": "Die Rolls Method", + "DL.SettingOptionalHide2025FHTraits": "Hide 2025 frigtening/horrifiyng traits in non-2025 mode", + "DL.SettingOptionalHide2025FHTraitsHint": "Hide traits on creature sheet - combat and reference tab.", "DL.SettingOptionalRuleInitiative": "Initiative Method", "DL.SettingOptionalRuleInitiativeGroup": "Group Rolls (d6) - PCs, NPCs, Creatures", "DL.SettingOptionalRuleInitiativeInduvidual": "Individual Rolls (d20)", "DL.SettingOptionalRuleInitiativeStd": "SotDL Standard (Slow turns & fast turns)", - "DL.SettingOptionalRuleLevelDependentBane": "Character level dependent horrifying bane", + "DL.SettingOptionalRuleLevelDependentBane": "Character level dependent frightening/horrifying bane", "DL.SettingOptionalRuleLevelDependentBaneHint": "Creatures lose their frightening or horrifying traits for characters of a certain level or higher, according to the creature’s difficulty.", "DL.SettingOptionalRuleRevealHorrifyingBane": "Reveal Horrifying Bane on attack chat-cards for players.", "DL.SettingOptionalRuleRevealHorrifyingBaneHint": "Otherwise it will be displayed as Other/Unknown.", @@ -669,6 +694,8 @@ "DL.SettingOptionalRuleSurroundingModeHint": "No LoS check, only take into consideration adjacent tokens.", "DL.SettingOptionalRuleSurroundingModeNPCCreature": "Enabled, valid targets: NPCs/Creatures", "DL.SettingOptionalRuleSurroundingRevealChatCard": "Reveal Surrounding boon on attack chat-cards for players.", + "DL.SettingOptionalTraitMode2025": "Enable 2025 frigtening/horrifying trait mode", + "DL.SettingOptionalTraitMode2025Hint": "Bane against frigtening/horrifying creatures, Insanity roll formula, Will Challenge Roll Bane.", "DL.SettingOptionalRules": "Optional Rules", "DL.SettingOptionalRulesHint": "Enable/Disable Optional Rules.", "DL.SettingOptionalRulesLabel": "Optional Rule Settings", @@ -833,6 +860,9 @@ "DL.TurnTurnOrder": "Turn order:", "DL.UnknownEffect": "Unknown Effect", "DL.UpdatePlayerTracker": "Update", + "DL.YouAreAttackingSoureceOfFrightenedAffliction": "You are attacking the source of your frightened affliction.", + "DL.YouCannotBeAffectedUntilYouCompleteARest": "You cannot be affected by the creature's trait until you complete a rest.", + "DL.YouHaventMadeWillChallengeRollAgainstTarget": "You haven't made Will challenge roll against the target.", "DL.VSRoll": "VS Roll", "DL.VehicleAttackOptions": "AttackOptions", "DL.VehicleCargo": "Cargo", @@ -883,6 +913,7 @@ "DL.WeaponMelee": "Melee", "DL.WeaponTitle": "Weapons", "DL.WeaponWear": "Equip weapon", + "DL.WillChallengeRollBane": "Will Challenge Roll Bane", "DL.With": "with", "DL.asleep": "Asleep", "DL.blinded": "Blinded", @@ -894,10 +925,8 @@ "DL.defend": "Defend", "DL.defenseless": "Defenseless", "DL.disabled": "Disabled", - "DL.disabledText": "Disabled characters are defenseless. Fate Roll: At the end of each round you are disabled, roll a d6. On a 1, you start dying. On a 6, you heal 1 damage and become impaired for 1 minute. A roll of any other number has no effect. If after 3 consecutive rounds you are still disabled, you become unconscious for 1d3 hours and stop making the fate roll. At the end of this time, you heal 1 damage and become impaired for 1 minute.", "DL.diseased": "Diseased", "DL.dying": "Dying", - "DL.dyingText": "Dying characters are unconscious. Fate Roll: At the end of each round you are dying, roll a d6. On a 1, you die. On a 6, you become disabled. A roll of any other number has no effect.", "DL.encumbered": "Encumbered", "DL.fatigued": "Fatigued", "DL.frightened": "Frightened", @@ -908,9 +937,7 @@ "DL.immobilized": "Immobilized", "DL.impaired": "Impaired", "DL.incapacitated": "Incapacitated", - "DL.incapacitatedText": "A creature becomes incapacitated when its damage total equals its Health score. Upon becoming incapacitated, the creature falls prone. A creature remains incapacitated until its damage total no longer equals its Health. If the creature takes any damage while incapacitated, it dies. Creatures other than player characters that become incapacitated either die or fall unconscious for 1d3 hours, as the GM decides. Player characters, however, become disabled and make fate rolls to determine what happens to them.", "DL.injured": "Injured", - "DL.injuredText": "You are injured while your damage equals or exceeds one-half your Health. Being injured doesn’t normally change your capabilities, though some effects, talents, and traits can interact with this state.", "DL.invisibleText": "An invisible creature or object cannot be seen by other creatures using normal senses. It is considered to be totally obscured and can thus hide away anywhere. An invisible creature makes attack rolls with 1 boon against the Defense or Agility of a target creature that cannot see it.", "DL.poisoned": "Poisoned", "DL.prepare": "Prepare", @@ -924,7 +951,7 @@ "DL.surprised": "Surprised", "DL.surrounded": "Surrounded", "DL.unconscious": "Unconscious", - "DL.InsanityFormula": "Insanity Formula", + "DL.InsanityFormula": "Insanity Roll Formula", "DL.CompendiumBrowser": "Compendium Browser", "DL.CompendiumBrowserFilters": { "IsTriggered": "Is Triggered", @@ -937,6 +964,7 @@ "UsesMagic": "Uses Magic" }, "DL.CompendiumBrowserSearch": { - "IncludeLocal": "Include Local Documents" + "IncludeLocal": "Include Local Documents", + "CaseSensitive": "Case Sensitive Search" } } diff --git a/src/lang/es.json b/src/lang/es.json index 92668051..95e1c508 100644 --- a/src/lang/es.json +++ b/src/lang/es.json @@ -77,7 +77,6 @@ "DL.ActorTypeNPC": "PNJ", "DL.ActorTypePC": "PJ", "DL.AddAttackOptions": "Añadir Opciones de Ataque", - "DL.AffectedRolls": "Tiradas Afectadas", "DL.Afflictions": "Aflicciones", "DL.AfflictionsAsleep": "Una criatura dormida se considera derribada e inconsciente. Cualquiera que pueda alcanzarla tendrá la opción de despertarla. A menos que se indique lo contrario, sufrir daño elimina la aflicción.", "DL.AfflictionsBlinded": "Una criatura cegada no puede ver. Considera lo que la rodea como si estuviese envuelto en una oscuridad total (consulta Oscuridad). Las demás criaturas atacan con 1 ventaja contra la Defensa o Agilidad del ser afectado. Las pruebas de Percepción que dependan de la vista fracasan automáticamente. Por último, la Velocidad del ser afectado se reduce a 2, salvo que su Velocidad normal sea menor.", @@ -88,7 +87,9 @@ "DL.AfflictionsDeafened": "Una criatura ensordecida no puede oír. Las pruebas de percepción en este sentido fracasan automáticamente.", "DL.AfflictionsDefend": "Cuando defiendes, todas las tiradas de ataque realizadas en tu contra sufren 1 desventaja y todas tus pruebas que hagas para resistir ataques se benefician de 1 ventaja hasta el final de la ronda. Estos beneficios finalizan si te ves impedido de usar cualquier acción, como cuando estás desorientado, aturdido o inconsciente.", "DL.AfflictionsDefenseless": "Una criatura indefensa no puede hacer nada para protegerse. Su Defensa es 5, no puede llevar a cabo acciones y las pruebas de atributos fracasan automáticamente. Aun así, la criatura puede percibir su entorno y realizar pruebas de Percepción con normalidad.", + "DL.AfflictionsDisabled": "Tirada de Destino: Al final de cada ronda que pases debilitado, tira 1d6. Un resultado de 1 indica que estás moribundo. Un resultado de 6 indica que estás mermado durante 1 minuto. Cualquier otro resultado carece de efecto. Si al cabo de tres rondas consecutivas sigues debilitado, quedas inconsciente durante 1d3 horas y dejas de hacer la tirada de destino. Al final de este periodo, te curas 1 punto de daño y quedas mermado durante 1 minuto.", "DL.AfflictionsDiseased": "Una criatura enferma realiza todas sus pruebas y tiradas de ataque con 1 desventaja.", + "DL.AfflictionsDying": "Tirada de Destino: Al final de cada ronda que pases moribundo, tira 1d6. Un resultado de 1 indica que mueres. Un resultado de 6 indica que quedas debilitado. Cualquier otro resultado carece de efecto.", "DL.AfflictionsFatigued": "Una criatura fatigada realiza todas sus pruebas y tiradas de ataque con 1 desventaja.", "DL.AfflictionsFrightened": "Una criatura atemorizada realiza todas sus pruebas y tiradas de ataque con 1 desventaja. Igualmente, no puede realizar turnos rápidos (ver Combate).", "DL.AfflictionsGrabbed": "Los efectos de esta aflicción dependen del Tamaño de la criatura. Si la víctima de la presa es igual o más pequeña que el atacante, no podrá liberarse hasta que este quite la aflicción. Si la víctima es más grande que quien realiza la presa, tan pronto como la primera se mueva, el atacante tendrá la opción de moverse con ella (ver Apresar para más información sobre cómo apresar y Liberarse para saber cómo escapar de la presa).", @@ -96,6 +97,8 @@ "DL.AfflictionsHorrified": "Una criatura horrorizada realiza todas sus pruebas y tiradas de ataque con 3 desventajas mientras pueda ver a la fuente de esta aflicción.", "DL.AfflictionsImmobilized": "Una criatura inmovilizada tiene una Velocidad 0 y no puede beneficiarse de ninguna bonificación a dicha característica. Los atacantes hacen sus tiradas de ataque con 1 ventaja.", "DL.AfflictionsImpaired": "Una criatura mermada realiza todas sus pruebas y tiradas de ataque con 1 desventaja.", + "DL.AfflictionsIncapacitated": "Una criatura adquiere la condición de incapacitada si el daño total iguala su Salud. Cuando esto ocurre, la criatura cae derribada. Permanecerá incapacitada hasta que el daño total deje de ser igual a su Salud. Si la criatura sufre daño mientras esté incapacitada, muere. Las criaturas que no sean los personajes jugadores que caigan incapacitadas, mueren o caen inconscientes durante 1d3 horas, según convenga el DJ. Sin embargo, los personajes jugadores quedan debilitados y hacen tiradas de destino para determinar lo que les ocurre.", + "DL.AfflictionsInjured": "Estás herido mientras tu daño es igual o excede la mitad de tu Salud.", "DL.AfflictionsPoisoned": "Una criatura envenenada realiza todas sus pruebas y tiradas de ataque con 1 desventaja.", "DL.AfflictionsPrepare": "Te preparas para llevar a cabo una actividad cuando tiene lugar un acontecimiento específico. Escoge una actividad que normalmente usaría una acción, como atacar o retirarse. A continuación, describe qué acontecimiento debe tener lugar antes de que actúes. A esto lo llamamos desencadenante. Si el acontecimiento desencadenante se produce antes de finalizar la ronda, puedes usar una reacción para llevar a cabo la actividad. Haces las tiradas de ataque o pruebas que requiera la actividad con 1 ventaja. De lo contrario, no ocurre nada.", "DL.AfflictionsProne": "Una criatura derribada permanece en el suelo. Otros seres pueden atravesar el espacio que ocupa. Mientras se encuentre en este estado, la criatura puede desplazarse arrastrándose o emplear su movimiento para incorporarse. Realiza todas sus pruebas de Fuerza y Agilidad con 1 desventaja. Todo el que sea capaz de alcanzarla y atacarla recibe 1 ventaja, si bien los que no consigan llegar hasta ella sufren 1 desventaja en la tirada de ataque.", @@ -149,7 +152,6 @@ "DL.AttackDelete": "Borrar ataque", "DL.AttackEdit": "Editar ataque", "DL.AttackRoll": "Tirada de Ataque", - "DL.AttackRolls": "Tiradas de Ataque", "DL.AttackRollAttackText": "ATAQUE", "DL.AttackRollBonuses": "Bonos a la Tirada de Ataque", "DL.AttackRollDamageText": "DAÑO", @@ -175,12 +177,10 @@ "DL.AvailabilityR": "Raro", "DL.AvailabilityU": "Poco Frecuente", "DL.BackgroundTitle": "Trasfondo", - "DL.BothAttackAndChallengeRolls": "Tiradas de Atacke y de Prueba", "DL.ButtonEdit": "Editar", "DL.ButtonView": "Ver", "DL.ChallengeRequestRollText": "Pedir Tirada de Prueba", "DL.ChallengeRoll": "Prueba", - "DL.ChallengeRolls": "Tirads de Prueba", "DL.ChallengeRollBonus": "Bonos Prueba", "DL.ChallengeRollText": "Tirada de Prueba:", "DL.ChallengeVS": "Enfrentada", @@ -856,10 +856,8 @@ "DL.defend": "Defendiendo", "DL.defenseless": "Indefenso", "DL.disabled": "Debilitado", - "DL.disabledText": "Tirada de Destino: Al final de cada ronda que pases debilitado, tira 1d6. Un resultado de 1 indica que estás moribundo. Un resultado de 6 indica que estás mermado durante 1 minuto. Cualquier otro resultado carece de efecto. Si al cabo de tres rondas consecutivas sigues debilitado, quedas inconsciente durante 1d3 horas y dejas de hacer la tirada de destino. Al final de este periodo, te curas 1 punto de daño y quedas mermado durante 1 minuto.", "DL.diseased": "Enfermo", "DL.dying": "Moribundo", - "DL.dyingText": "Tirada de Destino: Al final de cada ronda que pases moribundo, tira 1d6. Un resultado de 1 indica que mueres. Un resultado de 6 indica que quedas debilitado. Cualquier otro resultado carece de efecto.", "DL.encumbered": "Sobrecargado", "DL.fatigued": "Fatigado", "DL.frightened": "Atemorizado", @@ -869,9 +867,7 @@ "DL.immobilized": "Inmobilizado", "DL.impaired": "Mermado", "DL.incapacitated": "Incapacitado", - "DL.incapacitatedText": "Una criatura adquiere la condición de incapacitada si el daño total iguala su Salud. Cuando esto ocurre, la criatura cae derribada. Permanecerá incapacitada hasta que el daño total deje de ser igual a su Salud. Si la criatura sufre daño mientras esté incapacitada, muere. Las criaturas que no sean los personajes jugadores que caigan incapacitadas, mueren o caen inconscientes durante 1d3 horas, según convenga el DJ. Sin embargo, los personajes jugadores quedan debilitados y hacen tiradas de destino para determinar lo que les ocurre.", "DL.injured": "Herido", - "DL.injuredText": "Estás herido mientras tu daño es igual o excede la mitad de tu Salud.", "DL.invisibleText": "Una criatura u objeto invisible no puede ser visto por otras criaturas usando sentidos normales. Se considera totalmente oculta y por lo tanto puede esconderse en cualquier lugar. Una criatura invisible hace sus tiradas de ataque con una ventaja contra la Defensa o Agilidad una criatura objetivo que no pueda verla.", "DL.poisoned": "Envenenado", "DL.prepare": "Preparado", diff --git a/src/lang/fr.json b/src/lang/fr.json index 67bc41e4..3db99592 100644 --- a/src/lang/fr.json +++ b/src/lang/fr.json @@ -87,7 +87,9 @@ "DL.AfflictionsDeafened": "Une créature assourdie ne peut rien entendre. Les tests de Perception pour écouter échouent automatiquement.", "DL.AfflictionsDefend": "Quand vous vous défendez, jusqu’à la fin du round, tous les jets d’attaque sont effectués contre vous avec 1 désavantage et vous effectuez tous vos tests pour résister aux attaques avec 1 avantage. Vous perdez le bénéfice de ces atouts si quelque chose vous empêche d’utiliser des actions comme lorsque vous êtes étourdi, stupéfait ou inconscient.", "DL.AfflictionsDefenseless": "Une créature vulnérable ne peut se défendre. Sa Défense est de 5, elle ne peut utiliser d’action et ses tests d’attribut échouent automatiquement. Cependant, la créature peut encore percevoir son environnement et peut effectuer normalement des tests de Perception.", + "DL.AfflictionsDisabled": "Un personnage hors de combat est vulnérable. Jet de destinée : Quand vous êtes vulnérable, à la fin de chaque round, lancez 1d6. Sur un 1, vous agonisez. Sur un 6, vous soignez 1 dégât et vous êtes affaibli pendant 1 min. Tout autre résultat n’a aucun effet. Si après 3 rounds consécutifs vous êtes toujours hors de combat, vous êtes inconscient pendant 1d3 heures et vous cessez d’effectuer des jets de destinée. Puis vous soignez 1 dégât et vous êtes affaibli pendant 1 min.", "DL.AfflictionsDiseased": "Une créature malade effectue tous ses jets d’attaque et tous ses tests avec 1 désavantage.", + "DL.AfflictionsDying": "Les personnages qui agonisent sont inconscients. Jet de destinée : Quand vous agonisez, à la fin de chaque round, lancez 1d6. Sur un 1, vous mourez. Sur un 6, vous êtes hors de combat. Tout autre résultat n’a aucun effet.", "DL.AfflictionsFatigued": "Une créature fatiguée effectue tous ses jets d’attaque et tous ses tests avec 1 désavantage.", "DL.AfflictionsFrightened": "Une créature effrayée effectue tous ses jets d’attaque et tous ses tests avec 1 désavantage ou 3 désavantages quand elle peut voir la source de son affliction.", "DL.AfflictionsGrabbed": "Les effets de cette affliction dépendent du Gabarit de la créature. Si le Gabarit de la créature saisie est égal ou inférieur à celui de la créature qui l’a saisie, la victime ne peut s’éloigner de son agresseur tant qu’elle ne s’est pas débarrassée de cette affliction. Si le Gabarit de la créature saisie est supérieur à celui de la créature qui l’a saisie, à chaque fois que la victime se déplace, celle qui l’agrippe peut choisir de se déplacer avec elle (en s’accrochant à son corps) ou de la lâcher.", @@ -95,6 +97,8 @@ "DL.AfflictionsHorrified": "Une créature terrifiée effectue tous ses jets avec 3 désavantages tant qu'elle peut voir la source de sa terreur.", "DL.AfflictionsImmobilized": "Une créature immobilisée a une Vitesse de 0 et ne peut bénéficier de bonus à sa Vitesse. Les autres créatures effectuent leurs jets d’attaque contre une créature immobilisée avec 1 avantage.", "DL.AfflictionsImpaired": "Une créature affaiblie effectue tous ses jets d’attaque et tous ses tests avec 1 désavantage.", + "DL.AfflictionsIncapacitated": "Une créature est neutralisée quand son total de dégâts est égal à sa valeur de Santé. Quand elle est neutralisée, la créature tombe à terre. Elle reste neutralisée jusqu’à ce que son total de dégâts ne soit plus égal à sa Santé. Si elle subit d’autres dégâts alors qu’elle est neutralisée, elle meurt. Pour les créatures neutralisées autres que les personnages joueurs, le MJ décide si elles meurent ou si elles sont inconscientes pendant 1d3 heures. Les personnages joueurs, cependant, sont hors de combat et effectuent des jets de destinée pour déterminer ce qu’il advient d’eux.", + "DL.AfflictionsInjured": "Vous êtes blessé tant que les dégâts que vous avez subis sont supérieurs ou égaux à la moitié de votre Santé. Être blessé ne modifie généralement pas vos capacités mais certains effets, talents et traits peuvent interagir avec cet état.", "DL.AfflictionsPoisoned": "Une créature empoisonnée effectue tous ses jets d’attaque et tous ses tests avec 1 désavantage.", "DL.AfflictionsPrepare": "Vous vous préparez à effectuer une activité dès qu’un événement spécifié se produit. Choisissez une activité pour laquelle vous utiliseriez normalement une action comme attaquer ou battre en retraite. Puis, décrivez quel événement doit survenir pour que vous l’effectuiez. C’est le déclencheur. Si l’événement déclencheur se produit avant la fin du round, vous pouvez utiliser l’action déclenchée pour effectuer cette activité. Tout jet d’attaque ou test requis par cette activité bénéficie de 1 avantage. Sinon, rien ne se produit.", "DL.AfflictionsProne": "Une créature à terre est allongée sur le sol. Les autres créatures peuvent traverser son espace. Tant qu’elle est à terre, la créature peut se déplacer en rampant ou peut utiliser son déplacement pour se relever. La créature à terre effectue ses tests de Force et d’Agilité avec 1 désavantage. Les créatures qui peuvent atteindre la créature à terre peuvent effectuer des attaques contre elle avec 1 avantage tandis que les créatures qui sont hors de portée effectuent leurs jets d’attaque contre sa Défense avec 1 désavantage.", @@ -342,10 +346,8 @@ "DL.DiceResultFailure": "FAILURE", "DL.DiceResultSuccess": "SUCCESS", "DL.disabled": "Hors de combat", - "DL.disabledText": "Un personnage hors de combat est vulnérable. Jet de destinée : Quand vous êtes vulnérable, à la fin de chaque round, lancez 1d6. Sur un 1, vous agonisez. Sur un 6, vous soignez 1 dégât et vous êtes affaibli pendant 1 min. Tout autre résultat n’a aucun effet. Si après 3 rounds consécutifs vous êtes toujours hors de combat, vous êtes inconscient pendant 1d3 heures et vous cessez d’effectuer des jets de destinée. Puis vous soignez 1 dégât et vous êtes affaibli pendant 1 min.", "DL.diseased": "Malade", "DL.dying": "Agonisant", - "DL.dyingText": "Les personnages qui agonisent sont inconscients. Jet de destinée : Quand vous agonisez, à la fin de chaque round, lancez 1d6. Sur un 1, vous mourez. Sur un 6, vous êtes hors de combat. Tout autre résultat n’a aucun effet.", "DL.EffectAdd": "Ajouter un effet", "DL.EffectCreate": "Créer un effet", "DL.EffectDelete": "Supprimer l'effet", @@ -376,9 +378,7 @@ "DL.ImmuneCharacteristic": "Caractéristique d'immunité", "DL.impaired": "Affaibli", "DL.incapacitated": "Neutralisé", - "DL.incapacitatedText": "Une créature est neutralisée quand son total de dégâts est égal à sa valeur de Santé. Quand elle est neutralisée, la créature tombe à terre. Elle reste neutralisée jusqu’à ce que son total de dégâts ne soit plus égal à sa Santé. Si elle subit d’autres dégâts alors qu’elle est neutralisée, elle meurt. Pour les créatures neutralisées autres que les personnages joueurs, le MJ décide si elles meurent ou si elles sont inconscientes pendant 1d3 heures. Les personnages joueurs, cependant, sont hors de combat et effectuent des jets de destinée pour déterminer ce qu’il advient d’eux.", "DL.injured": "Blessé", - "DL.injuredText": "Vous êtes blessé tant que les dégâts que vous avez subis sont supérieurs ou égaux à la moitié de votre Santé. Être blessé ne modifie généralement pas vos capacités mais certains effets, talents et traits peuvent interagir avec cet état.", "DL.invisibleText": "Une créature (ou un objet) invisible ne peut être vue par d’autres créatures utilisant leurs sens normaux. Elle est considérée comment étant totalement obscurcie et peut donc se cacher où elle veut. Une créature invisible effectue ses jets d’attaque avec 1 avantage contre la Défense ou l’Agilité d’une cible qui ne peut la voir. Une créature invisible fait tout de même du bruit, laisse des empreintes de pas et déplace des liquides. Les nuages de poussière et de fumée peuvent également la révéler. Dans de telles conditions, la créature invisible est considérée comme étant dans une zone fortement obscurcie.", "DL.ItemAddItem": "Ajouter un objet", "DL.ItemAddLanguage": "Ajouter une langue", diff --git a/src/lang/it.json b/src/lang/it.json index 1804c378..e0826a1c 100644 --- a/src/lang/it.json +++ b/src/lang/it.json @@ -15,12 +15,16 @@ "DL.AfflictionsDazed": "Una creatura frastornata non può intraprendere azioni.", "DL.AfflictionsDeafened": "Una creatura assordata non può sentire. I tiri di sfida in Percezione legati all’udito falliscono automaticamente.", "DL.AfflictionsDefenseless": "Una creatura indifesa non può difendersi. La sua Difesa è 5, non può intraprendere azioni e i suoi tiri di sfida che usano attributi falliscono automaticamente. La creatura può comunque percepire ciò che la circonda ed effettuare tiri di sfida in Percezione come di norma.", + "DL.AfflictionsDisabled": "Tiro di Fato: Alla fine di ogni round in cui siete inabili, tirate un d6. Con un risultato di 1, diventate morenti. Con un risultato di 6, vi curate 1 danno e diventate indeboliti per 1 minuto. Qualsiasi altro risultato non produce alcun effetto. Se dopo 3 round consecutivi siete ancora inabili, diventate svenuti per 1d3 ore e smettete di effettuare tiri di fato. Alla fine di questo periodo, vi curate 1 danno e diventate indeboliti per 1 minuto.", "DL.AfflictionsDiseased": "Una creatura inferma effettua tutti i tiri di attacco e i tiri di sfida con 1 svantaggio.", + "DL.AfflictionsDying": "Alla fine di ogni round in cui siete morenti, tirate un d6. Con un risultato di 1, morite. Con un risultato di 6, diventate inabili. Qualsiasi altro risultato non produce effetti.", "DL.AfflictionsFatigued": "Una creatura affaticata effettua tutti i tiri di attacco e i tiri di sfida con 1 svantaggio.", "DL.AfflictionsFrightened": "Una creatura spaventata effettua tutti i tiri di attacco e i tiri di sfida con 1 svantaggio. Inoltre, le creature spaventate non possono effettuare turni rapidi (si veda Combattimento).", "DL.AfflictionsGrabbed": "Gli effetti dell’afflizione dipendono dalla Taglia della creatura. Se la Taglia della creatura afferrata è pari o inferiore a quella della creatura afferrante, la creatura afferrata non può allontanarsi da essa senza rimuovere l’afflizione. Se la Taglia della creatura afferrata è più grande della creatura afferrante, ogni volta che la creatura afferrata si muove, la creatura afferrante può scegliere di muoversi con essa (appendendosi al suo corpo) o lasciarla andare. (Si veda Afferrare per maggiori informazioni su come afferrare, e Sfuggire su come sfuggire a un afferramento.)", "DL.AfflictionsImmobilized": "Una creatura immobilizzata ha Velocità 0 e non può beneficiare di bonus alla Velocità. Le altre creature effettuano tutti i tiri di attacco contro la creatura immobilizzata con 1 vantaggio.", "DL.AfflictionsImpaired": "Una creatura indebolita effettua tutti i tiri di attacco e i tiri di sfida con 1 svantaggio.", + "DL.AfflictionsInjured": "You are injured while your damage equals or exceeds one-half your Health.", + "DL.AfflictionsIncapacitated": "Una creatura diventa incapacitata quando il suo danno totale è pari al suo punteggio di Salute. Quando diventa incapacitata, una creatura cade prona. Una creatura resta incapacitata finché il suo danno totale è pari alla sua Salute. Se la creatura subisce un qualsiasi ammontare di danni mentre è incapacitata, muore. Le creature diverse dai personaggi giocanti che diventano incapacitate muoiono o cadono prive di sensi per 1d3 ore, a discrezione del GM. I personaggi giocanti, tuttavia, diventano inabili ed effettuano tiri di fato per determinare cosa accade loro.", "DL.AfflictionsPoisoned": "Una creatura avvelenata effettua tutti i tiri di attacco e i tiri di sfida con 1 svantaggio.", "DL.AfflictionsProne": "Una creatura giace a terra. Le altre creature possono muoversi attraverso il suo spazio. Mentre è prona, una creatura può muoversi strisciando o usare il suo movimento per alzarsi. La creatura prona effettua tiri di Forza e Agilità con 1 svantaggio. Le creature che ce l’hanno entro portata effettuano tutti i tiri di attacco contro la creatura prona con 1 vantaggio, mentre le altre effettuano i tiri di attacco contro la sua Difesa con 1 svantaggio.", "DL.AfflictionsSlowed": "Una creatura rallentata può effettuare solo un turno lento (si veda Combattimento), la sua Velocità è dimezzata e non può beneficiare di incrementi alla Velocità.", @@ -603,10 +607,8 @@ "DL.deafened": "Assordato", "DL.defenseless": "Indifeso", "DL.diseased": "Infermo", - "DL.disabledText": "Tiro di Fato: Alla fine di ogni round in cui siete inabili, tirate un d6. Con un risultato di 1, diventate morenti. Con un risultato di 6, vi curate 1 danno e diventate indeboliti per 1 minuto. Qualsiasi altro risultato non produce alcun effetto. Se dopo 3 round consecutivi siete ancora inabili, diventate svenuti per 1d3 ore e smettete di effettuare tiri di fato. Alla fine di questo periodo, vi curate 1 danno e diventate indeboliti per 1 minuto.", "DL.disabled": "Inabile", "DL.dying": "Morente", - "DL.dyingText": "Alla fine di ogni round in cui siete morenti, tirate un d6. Con un risultato di 1, morite. Con un risultato di 6, diventate inabili. Qualsiasi altro risultato non produce effetti.", "DL.encumbered": "Ingombro", "DL.fatigued": "Affaticato", "DL.frightened": "Spaventato", @@ -616,9 +618,7 @@ "DL.immobilized": "Immobilizzato", "DL.impaired": "Indebolito", "DL.injured": "Ferito", - "DL.injuredText": "You are injured while your damage equals or exceeds one-half your Health.", "DL.incapacitated": "Incapacitato", - "DL.incapacitatedText": "Una creatura diventa incapacitata quando il suo danno totale è pari al suo punteggio di Salute. Quando diventa incapacitata, una creatura cade prona. Una creatura resta incapacitata finché il suo danno totale è pari alla sua Salute. Se la creatura subisce un qualsiasi ammontare di danni mentre è incapacitata, muore. Le creature diverse dai personaggi giocanti che diventano incapacitate muoiono o cadono prive di sensi per 1d3 ore, a discrezione del GM. I personaggi giocanti, tuttavia, diventano inabili ed effettuano tiri di fato per determinare cosa accade loro.", "DL.poisoned": "Avvelenato", "DL.prepare": "Prepararsi", "DL.prone": "Prono", diff --git a/src/lang/pl.json b/src/lang/pl.json index f90c189e..cc9e065c 100644 --- a/src/lang/pl.json +++ b/src/lang/pl.json @@ -530,13 +530,9 @@ "DL.ModsDisableAfflictions": "Wyłączenie wszystkich stanów", "DL.ModsDamage": "Efekty obrażeń", "DL.injured": "Ranny", - "DL.injuredText": "Jesteś ranny gdy ilość otrzymanych punktów obrażeń wynosi co najmniej połowę Twoich całkowitych Punktów Życia.", "DL.incapacitated": "Obezwładnienie", - "DL.incapacitatedText": "Stworzenie zostaje obezwładniony, gdy suma otrzymanych przez nie obrażeń jest równa jego zdrowiu. Obezwładniona istota liczy się także jako powalona. Pozostaje obezwładniona dopóty, dopóki suma otrzymanych przez nią obrażeń jest równa jej zdrowiu. Jeśli obezwładnione stworzenie otrzyma jakiekolwiek kolejne obrażenia, umiera. Stworzenie inne niż postaci graczy, które zostaną obezwładnione, umierają od razu lub tracą przytomność na 1K3 godzin – decyzja należy do MG. Postaci graczy jednakże stają się wyeliminowane i wykonują próby przeznaczenia, by ustalić co dalej.", "DL.disabled": "Eliminacja", - "DL.disabledText": "Postaci wyeliminowane są bezbronne. PRÓBY PRZEZNACZENIA: Rzuć k6 na koniec każdej rundy, w której jesteś wyeliminowany. Jeśli wyrzucisz 1, stajesz się umierający. Jeśli wyrzucisz 6, leczysz 1 punkt obrażeń i przez jedną minutę jesteś osłabiony. Pozostałe wyniki nie dają żadnych skutków jeśli po trzech turach z rzędu nadal jesteś wyeliminowany, stajesz się nieprzytomny na 1K3 godzin i nie wykonujesz więcej prób przeznaczenia. po tym czasie leczysz jeden punkt obrażeń i przez 1 minutę jesteś osłabiony.", "DL.dying": "Umieranie", - "DL.dyingText": "Postaci umierające są nieprzytomne. PRÓBY PRZEZNACZENIA: Rzuć k6 na koniec każdej rundy, w której jesteś umierający. Jeśli wyrzucisz jeden umierasz. jeśli wyrzucisz 6, stajesz się wyeliminowany. Pozostałe wyniki nie dają żadnych skutków.", "DL.Actions": "Akcje", "DL.asleep": "Uśpienie", "DL.blinded": "Oślepienie", @@ -575,13 +571,17 @@ "DL.AfflictionsDazed": "Oszołomiona istota nie może się poruszać ani wykonywać akcji. Wszelkie wykonywane przez nią testy automatycznie kończą się porażką. Ataki przeciwko oszołomionemu stworzeniu zyskują 1 ułatwienie.", "DL.AfflictionsDeafened": "Ogłuszone stworzenie traci słuch. Wykonywane przez nie testy Percepcji oparte na słuchu automatycznie kończą się porażką.", "DL.AfflictionsDefenseless": "Bezbronna istota nie może się bronić. Jej Obrona wynosi 5. Samo stworzenie nie jest w stanie podejmować żadnych akcji, a wszystkie wykonywane przez nie testy oparte na atrybutach automatycznie kończą się porażką. Zachowuje jednak świadomość swojego otoczenia, więc testy Percepcji wykonuje tak, jak zwykle.", + "DL.AfflictionsDisabled": "Postaci wyeliminowane są bezbronne. PRÓBY PRZEZNACZENIA: Rzuć k6 na koniec każdej rundy, w której jesteś wyeliminowany. Jeśli wyrzucisz 1, stajesz się umierający. Jeśli wyrzucisz 6, leczysz 1 punkt obrażeń i przez jedną minutę jesteś osłabiony. Pozostałe wyniki nie dają żadnych skutków jeśli po trzech turach z rzędu nadal jesteś wyeliminowany, stajesz się nieprzytomny na 1K3 godzin i nie wykonujesz więcej prób przeznaczenia. po tym czasie leczysz jeden punkt obrażeń i przez 1 minutę jesteś osłabiony.", "DL.AfflictionsDiseased": "Chore stworzenie wykonuje wszystkie testy i rzuty na atak z 1 utrudnieniem.", + "DL.AfflictionsDying": "Postaci umierające są nieprzytomne. PRÓBY PRZEZNACZENIA: Rzuć k6 na koniec każdej rundy, w której jesteś umierający. Jeśli wyrzucisz jeden umierasz. jeśli wyrzucisz 6, stajesz się wyeliminowany. Pozostałe wyniki nie dają żadnych skutków.", "DL.AfflictionsFatigued": "Wyczerpana istota wykonuje wszystkie testy i rzuty na atak z 1 utrudnieniem.", "DL.AfflictionsFrightened": "Przestraszone stworzenie wykonuje wszystkie testy i rzuty na atak z 1 utrudnieniem – lub 3 utrudnieniami, jeśli widzi źródło swojego strachu.", "DL.AfflictionsHorrified": "Przerażone stworzenie wykonuje wszystkie testy i rzuty na atak z 3 utrudnieniami, jeśli widzi źródło swojego strachu.", "DL.AfflictionsGrabbed": "Efekty tego stanu zależą od Rozmiaru pochwyconej istoty. Jeśli jest on równy lub mniejszy od Rozmiaru przytrzymującego ją stworzenia, nie może się ona od niego oddalić, dopóki nie pozbędzie się tego stanu. Jeśli Rozmiar pochwyconej istoty jest większy od Rozmiaru przytrzymującego ją stworzenia, to w momencie, gdy wykonuje ona ruch, przytrzymujące ją stworzenie może albo przemieścić się wraz nią, albo ją puścić.", "DL.AfflictionsImmobilized": "Unieruchomiona istota ma Prędkość równą 0 i nie może korzystać z premii do tego atrybutu. Ataki wykonywane przeciwko unieruchomionemu stworzeniu zyskują 1 ułatwienie.", "DL.AfflictionsImpaired": "Osłabione stworzenie wykonuje wszystkie testy i rzuty na atak z 1 utrudnieniem.", + "DL.AfflictionsInjured": "Jesteś ranny gdy ilość otrzymanych punktów obrażeń wynosi co najmniej połowę Twoich całkowitych Punktów Życia.", + "DL.AfflictionsIncapacitated": "Stworzenie zostaje obezwładniony, gdy suma otrzymanych przez nie obrażeń jest równa jego zdrowiu. Obezwładniona istota liczy się także jako powalona. Pozostaje obezwładniona dopóty, dopóki suma otrzymanych przez nią obrażeń jest równa jej zdrowiu. Jeśli obezwładnione stworzenie otrzyma jakiekolwiek kolejne obrażenia, umiera. Stworzenie inne niż postaci graczy, które zostaną obezwładnione, umierają od razu lub tracą przytomność na 1K3 godzin – decyzja należy do MG. Postaci graczy jednakże stają się wyeliminowane i wykonują próby przeznaczenia, by ustalić co dalej.", "DL.AfflictionsPoisoned": "Zatrute stworzenie wykonuje wszystkie testy i rzuty na atak z 1 utrudnieniem.", "DL.AfflictionsProne": "Powalona istota pada na podłoże. Inne stworzenia mogą swobodnie przemieszczać się przez przestrzeń, którą zajmuje. Ona sama jest w stanie poruszać się, czołgając, lub wstać – zużywa w ten sposób swój ruch w danej turze. Wszystkie testy i rzuty na atak oparte na Sile lub Zręczności wykonuje z 1 utrudnieniem. Ataki wręcz przeciwko powalonej istocie zyskują 1 ułatwienie, natomiast ataki dystansowe przeciwko jej Obronie wykonuje się z 1 utrudnieniem.", "DL.AfflictionsSlowed": "Spowolniona istota może podejmować jedynie tury długie (patrz Walka). Jej Prędkość spada o połowę; stworzenie to nie może też korzystać z premii do Prędkości.", diff --git a/src/lang/pt-BR.json b/src/lang/pt-BR.json index 1920c14d..6df74b27 100644 --- a/src/lang/pt-BR.json +++ b/src/lang/pt-BR.json @@ -464,13 +464,9 @@ "DL.ModsDisableAfflictions": "Desabilitar todas as aflições", "DL.ModsDamage": "Efeitos de Dano", "DL.injured": "Ferido", - "DL.injuredText": "Você está ferido quando o dano sofrido é igual ou excede a metade de sua Saúde.", "DL.incapacitated": "Incapacitado", - "DL.incapacitatedText": "Uma criatura se torna incapacitada quando o valor de dano (ou seja, o quanto ele já acumulou de dano até então) é igual ao seu valor de Saúde. No momento em que fica incapacitada, a criatura fica prostrada. Uma criatura se mantém incapacitada até que o valor de dano não seja mais igual à sua Saúde. Caso a criatura sofra qualquer dano enquanto estiver incapacitada, ela morre. Caso a criatura incapacitada não seja um dos personagens dos jogadores, ela morre ou fica inconsciente por 1d3 horas, como o Mestre decidir. Personagens dos jogadores, no entanto, ficam inválidos e fazem uma jogada de destino para determinar o que acontecerá com eles.", "DL.disabled": "Inválido", - "DL.disabledText": "Personagens inválidos estão indefesos. Jogada de Destino: Ao fim de cada rodada em que o personagem está inválido, jogue um d6. Com um resultado de 1, o personagem está morrendo. Com um 6, ele cura 1 de dano e fica debilitado por 1 minuto. Qualquer outro resultado do dado não tem efeito. Se depois de 3 rodadas consecutivas ainda estiver inválido, você fica inconsciente por 1d3 horas e para de fazer jogadas de destino. Ao fim deste tempo, você cura 1 de dano e fica debilitado por 1 minuto.", "DL.dying": "Morrendo", - "DL.dyingText": "Personagens que estão morrendo ficam inconscientes. Jogada de Destino: Ao fim de cada rodada em que o personagem estiver morrendo, jogue um d6. Com um resultado de 1, o personagem morre. Com um 6, o personagem fica inválido. Qualquer outro resultado do dado não tem efeito.", "DL.Actions": "Ações", "DL.asleep": "Adormecido", "DL.blinded": "Cego", @@ -509,13 +505,17 @@ "DL.AfflictionsDazed": "Uma criatura pasma não pode utilizar ações.", "DL.AfflictionsDeafened": "Uma criatura surda não consegue ouvir. Jogadas de desafio de Percepção feitas para ouvir resultam automaticamente em fracasso.", "DL.AfflictionsDefenseless": "Uma criatura indefesa não pode se defender. Sua Defesa é 5 e ele não pode utilizar ações, suas jogadas de desafio que usam atributos resultam em fracasso. No entanto, a criatura ainda pode perceber seus arredores, podendo fazer jogadas de desafio de Percepção normalmente.", + "DL.AfflictionsDisabled": "Personagens inválidos estão indefesos. Jogada de Destino: Ao fim de cada rodada em que o personagem está inválido, jogue um d6. Com um resultado de 1, o personagem está morrendo. Com um 6, ele cura 1 de dano e fica debilitado por 1 minuto. Qualquer outro resultado do dado não tem efeito. Se depois de 3 rodadas consecutivas ainda estiver inválido, você fica inconsciente por 1d3 horas e para de fazer jogadas de destino. Ao fim deste tempo, você cura 1 de dano e fica debilitado por 1 minuto.", "DL.AfflictionsDiseased": "Uma criatura doente executa todas as suas jogadas de ataque e de desafio com 1 perdição.", + "DL.AfflictionsDying": "Personagens que estão morrendo ficam inconscientes. Jogada de Destino: Ao fim de cada rodada em que o personagem estiver morrendo, jogue um d6. Com um resultado de 1, o personagem morre. Com um 6, o personagem fica inválido. Qualquer outro resultado do dado não tem efeito.", "DL.AfflictionsFatigued": "Uma criatura fatigada executa todas as suas jogadas de ataque e de desafio com 1 perdição.", "DL.AfflictionsFrightened": "Uma criatura assustada executa todas as suas jogadas de ataque e de desafio com 1 perdição. Além disso, criaturas assustadas não podem fazer turnos rápidos (consulte Combate).", "DL.AfflictionsHorrified": "Uma criatura assustada executa todas as suas jogadas de ataque e de desafio com 3 perdições. Além disso, criaturas horrorizadas não podem fazer turnos rápidos (consulte Combate).", "DL.AfflictionsGrabbed": "O efeito desta aflição depende do Tamanho da criatura. Caso o Tamanho da criatura agarrada seja igual ou menor ao da criatura que a está agarrando, a criatura agarrada não pode se mover para longe da criatura que a agarrou até que remova a aflição. Caso o Tamanho da criatura agarrada seja maior do que o da criatura que a agarra, toda vez que a criatura agarrada se move, a criatura que a agarra pode escolher se mover junto (se segurando ao corpo da criatura agarrada) ou finalizar o agarramento. (Consulte Agarrar para obter mais informações sobre como agarrar, e Escapar, para saber como escapar de um agarramento.)", "DL.AfflictionsImmobilized": "Uma criatura imobilizada tem Deslocamento 0 e não pode utilizar os benefícios de bônus de Deslocamento. Outras criaturas fazem jogadas de ataque contra a criatura imobilizada com 1 dádiva.", "DL.AfflictionsImpaired": "Uma criatura debilitada faz todas as jogadas de ataque e de desafio com 1 perdição.", + "DL.AfflictionsInjured": "Você está ferido quando o dano sofrido é igual ou excede a metade de sua Saúde.", + "DL.AfflictionsIncapacitated": "Uma criatura se torna incapacitada quando o valor de dano (ou seja, o quanto ele já acumulou de dano até então) é igual ao seu valor de Saúde. No momento em que fica incapacitada, a criatura fica prostrada. Uma criatura se mantém incapacitada até que o valor de dano não seja mais igual à sua Saúde. Caso a criatura sofra qualquer dano enquanto estiver incapacitada, ela morre. Caso a criatura incapacitada não seja um dos personagens dos jogadores, ela morre ou fica inconsciente por 1d3 horas, como o Mestre decidir. Personagens dos jogadores, no entanto, ficam inválidos e fazem uma jogada de destino para determinar o que acontecerá com eles.", "DL.AfflictionsPoisoned": "Uma criatura envenenada faz todas as jogadas de ataque e de desafio com 1 perdição.", "DL.AfflictionsProne": "Uma criatura prostrada fica junto ao chão. Outras criaturas podem passar por seu espaço. Enquanto estiver prostrada, a criatura pode se mover apenas rastejando ou utilizar seu movimento para se levantar. A criatura prostrada faz suas jogadas de Força e Agilidade com 1 perdição. Criaturas que possam alcançar a criatura prostrada fazem todas as jogadas de ataque contra aquela criatura com 1 dádiva, enquanto criaturas que não podem alcançá-la fazem jogadas de ataque contra sua Defesa com 1 perdição.", "DL.AfflictionsSlowed": "Uma criatura lenta apenas pode fazer um turno lento (consulte Combate), seu Deslocamento é reduzido pela metade e ela não pode se beneficiar de incrementos a seu Deslocamento.", diff --git a/src/lang/zh-cn.json b/src/lang/zh-cn.json index 091b25cd..1427e17e 100644 --- a/src/lang/zh-cn.json +++ b/src/lang/zh-cn.json @@ -88,7 +88,9 @@ "DL.AfflictionsDeafened": "一个耳聋的生物无法听到。用于倾听的感知挑战掷骰自动失败。", "DL.AfflictionsDefend": "当你防御时,直到回合结束,所有对你的攻击掷骰都有1个劣势,你进行所有抵抗攻击的挑战掷骰都有1个优势。如果你无法使用动作,比如当你眩晕、震慑或无意识时,这些好处就会结束。", "DL.AfflictionsDefenseless": "一个失去防御能力的生物无法保护自己。其防御为5,不能使用动作,使用属性进行的挑战掷骰会失败。然而,该生物仍然可以感知其周围环境,并且可以正常进行感知挑战掷骰。", + "DL.AfflictionsDisabled": "命运掷骰:在你瘫痪的每轮结束时,掷一个d6。掷出1时,你开始濒死。掷出6时,你恢复1点伤害并变为脆弱1分钟。其他结果无效果。如果连续3轮你仍然瘫痪,你会昏迷1d3小时并停止进行命运掷骰。这段时间结束时,你恢复1点伤害并变为脆弱1分钟。", "DL.AfflictionsDiseased": "一个患病的生物进行所有攻击掷骰和挑战掷骰时有1个劣势。", + "DL.AfflictionsDying": "命运掷骰:在你濒死的每轮结束时,掷一个d6。掷出1时,你死亡。掷出6时,你变为瘫痪。其他结果无效果。", "DL.AfflictionsFatigued": "一个疲劳的生物进行所有攻击掷骰和挑战掷骰时有1个劣势。", "DL.AfflictionsFrightened": "一个恐惧的生物进行攻击掷骰和挑战掷骰时有1个劣势。", "DL.AfflictionsGrabbed": "该状态的效果取决于生物的体型。如果被擒抱生物的体型等于或小于擒抱它的生物,被擒抱的生物在移除该状态之前无法远离擒抱它的生物。如果被擒抱生物的体型大于擒抱它的生物,每当被擒抱的生物移动时,擒抱它的生物可以选择跟随移动(通过紧贴被擒抱生物的身体)或结束擒抱。(参见擒抱规则了解如何擒抱,以及逃脱规则了解如何摆脱擒抱。)", @@ -96,6 +98,8 @@ "DL.AfflictionsHorrified": "一个惊骇的生物在可以看到引起该状态的来源时,进行攻击掷骰和挑战掷骰时有3个劣势。", "DL.AfflictionsImmobilized": "一个被定身的生物速度为0且不能从速度加成中受益。其他生物对被定身的生物进行所有攻击掷骰时获得1个优势。", "DL.AfflictionsImpaired": "一个受损的生物进行所有攻击掷骰和挑战掷骰时有1个劣势。", + "DL.AfflictionsIncapacitated": "当生物的伤害总值等于其生命值时,它会失能。失能时,生物倒地。生物会一直失能,直到其伤害总值不再等于其生命值。如果生物在失能时受到任何伤害,它就会死亡。玩家角色以外的失能生物要么死亡,要么昏迷1d3小时,由GM决定。然而,玩家角色会变为瘫痪并进行命运掷骰以决定发生什么。", + "DL.AfflictionsInjured": "当你的伤害等于或超过生命值的一半时,你处于受伤状态。", "DL.AfflictionsPoisoned": "一个中毒的生物进行所有攻击掷骰和挑战掷骰时有1个劣势。", "DL.AfflictionsPrepare": "你准备在特定事件发生时采取行动。选择一个通常需要使用一个动作来执行的活动,如攻击或撤退。然后,描述必须发生什么事件才能触发它。这就是触发条件。如果触发事件在回合结束前发生,你可以使用一个触发动作来执行该活动。你进行该活动所需的任何攻击掷骰或挑战掷骰时获得1个优势。否则,什么也不会发生。", "DL.AfflictionsProne": "一个倒地的生物躺在地上。其他生物可以穿过其空间移动。在倒地时,该生物可以通过爬行移动或使用其移动站起来。倒地的生物进行力量和敏捷掷骰时有1个劣势。能够接触到倒地生物的生物对其进行所有攻击掷骰时获得1个优势,而无法接触到它的生物对其防御进行攻击掷骰时有1个劣势。", @@ -368,10 +372,8 @@ "DL.DiceResultFailure": "失败", "DL.DiceResultSuccess": "成功", "DL.disabled": "瘫痪", - "DL.disabledText": "命运掷骰:在你瘫痪的每轮结束时,掷一个d6。掷出1时,你开始濒死。掷出6时,你恢复1点伤害并变为脆弱1分钟。其他结果无效果。如果连续3轮你仍然瘫痪,你会昏迷1d3小时并停止进行命运掷骰。这段时间结束时,你恢复1点伤害并变为脆弱1分钟。", "DL.diseased": "患病", "DL.dying": "濒死", - "DL.dyingText": "命运掷骰:在你濒死的每轮结束时,掷一个d6。掷出1时,你死亡。掷出6时,你变为瘫痪。其他结果无效果。", "DL.EffectAdd": "添加效果", "DL.EffectCreate": "添加效果", "DL.EffectDelete": "删除", @@ -403,9 +405,7 @@ "DL.ImmuneAffliction": "免疫状态", "DL.impaired": "受损", "DL.incapacitated": "失能", - "DL.incapacitatedText": "当生物的伤害总值等于其生命值时,它会失能。失能时,生物倒地。生物会一直失能,直到其伤害总值不再等于其生命值。如果生物在失能时受到任何伤害,它就会死亡。玩家角色以外的失能生物要么死亡,要么昏迷1d3小时,由GM决定。然而,玩家角色会变为瘫痪并进行命运掷骰以决定发生什么。", "DL.injured": "受伤", - "DL.injuredText": "当你的伤害等于或超过生命值的一半时,你处于受伤状态。", "DL.invisibleText": "一个隐形的生物或物体无法被其他生物用普通感官察觉。它被视为完全遮蔽,因此可以在任何地方隐藏。隐形生物对无法看到它的目标生物进行攻击掷骰时获得1个优势。", "DL.ItemAddItem": "添加物品", "DL.ItemAddLanguage": "添加语言", diff --git a/src/lang/zh-tw.json b/src/lang/zh-tw.json index 6147f1d9..a0733ab2 100644 --- a/src/lang/zh-tw.json +++ b/src/lang/zh-tw.json @@ -488,13 +488,17 @@ "DL.AfflictionsDazed": "一個眩暈的生物不能使用動作。", "DL.AfflictionsDeafened": "一個耳聾的生物沒有聽覺。進行需要聽力的感知檢定自動失敗。", "DL.AfflictionsDefenseless": "一個失防的生物無法保護自己。他的防禦視為5,無法使用動作,使用屬性進行的檢定擲骰自動失敗。該生物仍然可以感知周圍的環境,並且可以照常進行感知檢定。", + "DL.AfflictionsDisabled": "命運擲骰:如果你處於癱瘓狀態,每輪結束時投擲d6.如果是1,你會開始瀕死。如果是6,你治愈1點傷害並陷入1分鐘的脆弱狀態。其他結果則無效應。當三次連續的命運擲骰後,若你仍處於殘疾狀態,你會開始陷入1d3小時的昏迷狀態,並停止進行命運擲骰。在你結束昏迷狀態後,你治愈1點傷害並陷入1分鐘的脆弱狀態。", "DL.AfflictionsDiseased": "染疾的生物進行的攻擊擲骰和檢定擲骰都有1點劣勢。", + "DL.AfflictionsDying": "命運擲骰:如果你處於瀕死狀態,每輪結束時投擲d6.如果是1,你死了。如果是6,你會陷入癱瘓狀態。其他結果則沒有任何影響。 ", "DL.AfflictionsFatigued": "力竭的生物進行的攻擊擲骰和檢定擲骰都有1點劣勢。", "DL.AfflictionsFrightened": "恐慌的生物進行的攻擊擲骰和檢定擲骰都有1點劣勢,具體看何種東西引起他的恐慌。", "DL.AfflictionsHorrified": "驚懼的生物進行的攻擊擲骰和檢定擲骰都有3點劣勢,具體看何種東西引起他的驚懼。", "DL.AfflictionsGrabbed": "該狀態取決於生物的體型。被擒拿的生物體型小於或等於擒抱他的生物,則被擒拿的生物在掙脫擒拿前無法離開該生物。如果被擒拿生物體型大於擒抱他的生物。當被擒拿生物移動時,擒拿他的生物可以選擇和其一同移動(抓在對方身體上)或結束擒拿。(可以查看擒抱來了解關於擒拿的更多細節,和逃脫來了解如何逃離擒抱。)", "DL.AfflictionsImmobilized": "被束縛的生物速度歸0,並不能獲得基於速度的加值。所有對被束縛生物進行的攻擊擲骰獲得1點優勢。", "DL.AfflictionsImpaired": "脆弱的生物進行的所有攻擊擲骰和檢定擲骰都有1點劣勢。", + "DL.AfflictionsInjured": "当你的伤害积累等于或超过你的生命值的一半时你就陷入重伤了。", + "DL.AfflictionsIncapacitated": "當一個生物受到的傷害等同於其生命值時,他會陷入失能狀態。一旦陷入失能狀態,其將會倒地。生物會一直處於失能,直至其受到的傷害總值不再等於其生命值時才會解除。如果其在失能狀態中受到任何傷害,都會死亡。玩家角色以外的生物在陷入失能狀態後要么死,要么會昏迷1d3小時,具體由GM決定玩家角色還會因此而陷入癱瘓disabled,需要進行一次命運擲骰來決定會發生什麼。", "DL.AfflictionsPoisoned": "中毒的生物進行的所有攻擊擲骰和檢定擲骰都有1點劣勢。", "DL.AfflictionsProne": "倒地的生物會躺在地上。其他生物可以跨過他來移動。當倒地時,該生物可以使用他的移動來站起來或直接匍匐前進。倒地狀態的生物進行的力量和敏捷檢定有1點劣勢。如果倒地生物在其觸及範圍內,對其進行的攻擊擲骰有1點優勢,若在觸及範圍外,則所有對抗其防禦的攻擊檢定有1點劣勢。", "DL.AfflictionsSlowed": "被減速的生物只能進行一個慢速回合 slow turn,其速度減半,並且不能從速度提升中獲得收益。", @@ -664,10 +668,7 @@ "DL.SettingGMEffectsControls": "GM效果控制", "DL.SettingGMEffectsControlsHint": "不論效果類型,總是向Game Master展示可激活效果的控制(開關,編輯及刪除)。", "DL.injured": "負傷", - "DL.injuredText": "当你的伤害积累等于或超过你的生命值的一半时你就陷入重伤了。", "DL.incapacitated": "失能", - "DL.incapacitatedText": "當一個生物受到的傷害等同於其生命值時,他會陷入失能狀態。一旦陷入失能狀態,其將會倒地。生物會一直處於失能,直至其受到的傷害總值不再等於其生命值時才會解除。如果其在失能狀態中受到任何傷害,都會死亡。玩家角色以外的生物在陷入失能狀態後要么死,要么會昏迷1d3小時,具體由GM決定玩家角色還會因此而陷入癱瘓disabled,需要進行一次命運擲骰來決定會發生什麼。", - "DL.disabledText": "命運擲骰:如果你處於癱瘓狀態,每輪結束時投擲d6.如果是1,你會開始瀕死。如果是6,你治愈1點傷害並陷入1分鐘的脆弱狀態。其他結果則無效應。當三次連續的命運擲骰後,若你仍處於殘疾狀態,你會開始陷入1d3小時的昏迷狀態,並停止進行命運擲骰。在你結束昏迷狀態後,你治愈1點傷害並陷入1分鐘的脆弱狀態。", "DL.disabled": "癱瘓", "DL.DialogWarningTargetNotTargeted": "沒有選擇目標", "DL.TabsGeneral": "概況", @@ -677,7 +678,6 @@ "DL.SettingReplaceIcons": "替換默認圖標", "DL.SettingReplaceIconsHint": "創建物品時替代默認圖標", "DL.dying": "瀕死", - "DL.dyingText": "命運擲骰:如果你處於瀕死狀態,每輪結束時投擲d6.如果是1,你死了。如果是6,你會陷入癱瘓狀態。其他結果則沒有任何影響。 ", "DL.encumbered": "重載", "DL.AutoFailActions": "動作自動失敗", "DL.AutoFailChallenges": "檢定自動失敗", diff --git a/src/module/active-effects/afflictions.js b/src/module/active-effects/afflictions.js index 35ef7a31..bd2fdfab 100644 --- a/src/module/active-effects/afflictions.js +++ b/src/module/active-effects/afflictions.js @@ -177,10 +177,11 @@ export class DLAfflictions { effectsDataList.push(_buildBaseAffliction('grabbed', 'systems/demonlord/assets/icons/effects/grabbed.svg')) // Horrified + const baneValue = game.settings.get('demonlord', 'optionalRuleBaneValue') ? -2 : -3 effectsDataList.push( _buildBaseAffliction('horrified', 'systems/demonlord/assets/icons/effects/horrified.svg', [ - addEffect('system.bonuses.challenge.boons.all', -3, effectPriority), - addEffect('system.bonuses.attack.boons.all', -3, effectPriority), + addEffect('system.bonuses.challenge.boons.all', baneValue, effectPriority), + addEffect('system.bonuses.attack.boons.all', baneValue, effectPriority), ]), ) diff --git a/src/module/actor/actor.js b/src/module/actor/actor.js index 8eb4c3e3..9aff0412 100644 --- a/src/module/actor/actor.js +++ b/src/module/actor/actor.js @@ -6,7 +6,6 @@ import {DLActiveEffects} from '../active-effects/item-effects' import {DLAfflictions} from '../active-effects/afflictions' import {capitalize, plusify} from '../utils/utils' import launchRollDialog from '../dialog/roll-dialog' -import launchFrightenedDialog from '../dialog/frightened-dialog' import { postAttackToChat, postAttributeToChat, @@ -423,6 +422,58 @@ export class DemonlordActor extends Actor { return rollFormula } + parseRollFormula(target) { + let result = null + let rollFormula = target.system.horrifyingInsanityFormula + + if (Roll.validate(rollFormula)) result = rollFormula + if (!result && rollFormula) console.warn(game.i18n.format("DL.DialogInvalidRollFormula", {rollFormula : rollFormula})) + + return result + } + + isImmuneToTarget(target) { + let actor = this + const immuneArray = actor.appliedEffects.filter(x => x.name === game.i18n.format('DL.ImmuneToTarget', { + creature: target.name + })) + let result = false + for (const e of immuneArray) { + if (foundry.utils.getProperty(e, 'flags.demonlord.immuneToActoruuid') === target.uuid) result = true + } + return result + } + + isFrightenedFrom(target) { + let actor = this + const immuneArray = actor.appliedEffects.filter(x => x.name === game.i18n.format('DL.FrightenedBy', { + creature: target?.name + })) + let result = false + for (const e of immuneArray) { + if (foundry.utils.getProperty(e, 'flags.demonlord.FrightenedFromActoruuid') === target.uuid) result = true + } + return result + } + +getTargetAttackBane(target) { + const attacker = this + if (!target) return 0 + if (!game.settings.get('demonlord', 'horrifyingBane') || attacker.isImmuneToAffliction('frightened')) return 0 + const optionalRuleBaneValue = game.settings.get('demonlord', 'optionalRuleBaneValue') ? 1 : 2 + const ignoreLevelDependentBane = + game.settings.get('demonlord', 'optionalRuleLevelDependentBane') && + ((attacker.system?.level >= 3 && attacker.system?.level <= 6 && target?.system?.difficulty <= 25) || + (attacker.system?.level >= 7 && target?.system?.difficulty <= 50)) ? false : true + let baneValue = game.settings.get('demonlord', 'optionalRuleTraitMode2025') + ? (ignoreLevelDependentBane && !attacker.system.horrifying && !attacker.system.frightening && (target?.system.frightening || target?.system.horrifying) && !attacker.isImmuneToTarget(target) && 1) || 0 + : (ignoreLevelDependentBane && !attacker.system.horrifying && !attacker.system.frightening && target?.system.horrifying && !attacker.isImmuneToTarget(target) && 1) || 0 + + // Adjust bane if source of affliction can be seen, actor already has 1 (frightened), we need to add the difference + if (attacker.isFrightenedFrom(target)) baneValue += optionalRuleBaneValue + return baneValue +} + /** * Rolls an attack using an Item * @param item Weapon / Spell / Talent used for attacking @@ -439,7 +490,7 @@ export class DemonlordActor extends Actor { let attackAttribute = item.system.action?.attack?.toLowerCase() const defenseAttribute = item.system.action?.against?.toLowerCase() - if (game.settings.get('demonlord', 'fineseeAutoSelect') && attackAttribute === '' && item.system.properties?.toLowerCase().includes('finesse')) { + if (game.settings.get('demonlord', 'finesseAutoSelect') && attackAttribute === '' && item.system.properties?.toLowerCase().includes('finesse')) { if (this.system.attributes.strength.value > this.system.attributes.agility.value) attackAttribute = 'strength' else attackAttribute = 'agility' } @@ -469,13 +520,10 @@ export class DemonlordActor extends Actor { (parseInt(attacker.system.bonuses.attack.boons.all) || 0) + (parseInt(attacker.system.bonuses.attack.boons.weapon) || 0) - const horrifyingBane = game.settings.get('demonlord', 'horrifyingBane') - const ignoreLevelDependentBane = (game.settings.get('demonlord', 'optionalRuleLevelDependentBane') && ((attacker.system?.level >=3 && attacker.system?.level <=6 && defender?.system?.difficulty <= 25) || (attacker.system?.level >=7 && defender?.system?.difficulty <= 50))) ? false : true boons -= (parseInt(defender?.system.bonuses.defense.boons[defenseAttribute]) || 0) + (parseInt(defender?.system.bonuses.defense.boons.all) || 0) + - (parseInt(defender?.system.bonuses.defense.boons.weapon) || 0) + - (horrifyingBane && ignoreLevelDependentBane && !attacker.system.horrifying && !attacker.system.frightening && defender?.system.horrifying && 1 || 0) + (parseInt(defender?.system.bonuses.defense.boons.weapon) || 0) + this.getTargetAttackBane(defender) // Check if requirements met if (item.system.wear && parseInt(item.system.requirement?.minvalue) > attacker.getAttribute(item.system.requirement?.attribute)?.value) @@ -548,7 +596,7 @@ export class DemonlordActor extends Actor { // Check if actor is blocked by an affliction if (!DLAfflictions.isActorBlocked(this, 'action', attribute)) - launchRollDialog(game.i18n.localize('DL.DialogAttackRoll') + game.i18n.localize(item.name), async (event, html) => { + launchRollDialog(this, game.i18n.localize('DL.DialogAttackRoll') + game.i18n.localize(item.name), async (event, html) => { for (const target of targets) { await this.rollItemAttack(item, html.form.elements.boonsbanes.value, html.form.elements.modifier.value, target) } @@ -563,7 +611,7 @@ export class DemonlordActor extends Actor { } /* -------------------------------------------- */ - async rollAttributeChallenge(attribute, inputBoons, inputModifier, mode) { + async rollAttributeChallenge(attribute, inputBoons, inputModifier, options) { const modifiers = [parseInt(inputModifier), this.getAttribute(attribute.key)?.modifier || 0] const boons = (parseInt(inputBoons) || 0) + (parseInt(this.system.bonuses.challenge.boons[attribute.key]) || 0) + (parseInt(this.system.bonuses.challenge.boons.all) || 0) const boonsReroll = parseInt(this.system.bonuses.rerollBoon1Dice) @@ -571,8 +619,8 @@ export class DemonlordActor extends Actor { const challengeRoll = new Roll(this.rollFormula(modifiers, boons, boonsReroll), this.system) await challengeRoll.evaluate() - if (mode) postCustomTextToChat(this, challengeRoll, mode, attribute.key) - else + if (options) postCustomTextToChat(this, challengeRoll, options, attribute.key) + else postAttributeToChat(this, attribute.key, challengeRoll, parseInt(inputBoons) || 0, parseInt(inputModifier) || 0) for (let effect of this.appliedEffects) { @@ -587,7 +635,7 @@ export class DemonlordActor extends Actor { if (typeof attribute === 'string' || attribute instanceof String) attribute = this.getAttribute(attribute) if (!DLAfflictions.isActorBlocked(this, 'challenge', attribute.key)) - launchRollDialog(this.name + ' - ' + game.i18n.localize('DL.DialogChallengeRoll') + attribute.label, async (event, html) => + launchRollDialog(this, this.name + ' - ' + game.i18n.localize('DL.DialogChallengeRoll') + attribute.label, async (event, html) => await this.rollAttributeChallenge(attribute, html.form.elements.boonsbanes.value, html.form.elements.modifier.value), ) } @@ -599,9 +647,6 @@ export class DemonlordActor extends Actor { const attacker = this const defendersTokens = tokenManager.targets const defender = defendersTokens[0]?.actor - const horrifyingBane = game.settings.get('demonlord', 'horrifyingBane') - const ignoreLevelDependentBane = (game.settings.get('demonlord', 'optionalRuleLevelDependentBane') && ((attacker.system?.level >=3 && attacker.system?.level <=6 && defender?.system?.difficulty <= 25) || (attacker.system?.level >=7 && defender?.system?.difficulty <= 50))) ? false : true - const modifiers = [ parseInt(inputModifier), parseInt(attacker.system?.attributes[attribute.key]?.modifier) || 0, @@ -615,7 +660,7 @@ export class DemonlordActor extends Actor { (parseInt(attacker.system.bonuses.attack.boons?.all) || 0) if (defendersTokens.length === 1) boons -= (defender?.system.bonuses.defense.boons[defense] || 0) + (defender?.system.bonuses.defense.boons.all || 0) + - (horrifyingBane && ignoreLevelDependentBane && !attacker.system.horrifying && !attacker.system.frightening && defender?.system.horrifying && 1 || 0) + this.getTargetAttackBane(defender) const boonsReroll = parseInt(this.system.bonuses.rerollBoon1Dice) @@ -645,7 +690,7 @@ export class DemonlordActor extends Actor { if (typeof attribute === 'string' || attribute instanceof String) attribute = this.getAttribute(attribute) if (!DLAfflictions.isActorBlocked(this, 'attack', attribute.key)) - launchRollDialog(this.name + ' - ' + game.i18n.localize('DL.DialogAttackRoll') + attribute.label, async (event, html) => + launchRollDialog(this, this.name + ' - ' + game.i18n.localize('DL.DialogAttackRoll') + attribute.label, async (event, html) => await this.rollAttributeAttack(attribute, html.form.elements.defense.value, html.form.elements.boonsbanes.value, html.form.elements.modifier.value), true ) @@ -668,7 +713,7 @@ export class DemonlordActor extends Actor { } if (item.system?.action?.attack) { - launchRollDialog(game.i18n.localize('DL.TalentVSRoll') + game.i18n.localize(item.name), async (event, html) => + launchRollDialog(this, game.i18n.localize('DL.TalentVSRoll') + game.i18n.localize(item.name), async (event, html) => await this.useTalent(item, html.form.elements.boonsbanes.value, html.form.elements.modifier.value), ) } else { @@ -705,14 +750,12 @@ export class DemonlordActor extends Actor { (parseInt(this.system.bonuses.attack.boons.all) || 0) + parseInt(talentData.action?.boonsbanes || 0) - const horrifyingBane = game.settings.get('demonlord', 'horrifyingBane') - const ignoreLevelDependentBane = (game.settings.get('demonlord', 'optionalRuleLevelDependentBane') && ((this.system?.level >=3 && this.system?.level <=6 && target?.actor?.system?.difficulty <= 25) || (this.system?.level >=7 && target?.actor?.system?.difficulty <= 50))) ? false : true - if (targets.length === 1) boons -= ( (target?.actor?.system.bonuses.defense.boons[defenseAttribute] || 0) + - (target?.actor?.system.bonuses.defense.boons.all || 0) + - (horrifyingBane && ignoreLevelDependentBane && !this.system.horrifying && !this.system.frightening && target?.actor?.system.horrifying && 1 || 0)) + (target?.actor?.system.bonuses.defense.boons.all || 0) + + this.getTargetAttackBane(target.actor)) + const boonsReroll = parseInt(this.system.bonuses.rerollBoon1Dice) attackRoll = new Roll(this.rollFormula(modifiers, boons, boonsReroll), this.system) @@ -760,7 +803,7 @@ export class DemonlordActor extends Actor { } else await item.update({'system.castings.value': uses + 1}, {parent: this}) if (isAttack && attackAttribute) { - launchRollDialog(game.i18n.localize('DL.DialogSpellRoll') + game.i18n.localize(item.name), async (event, html) => { + launchRollDialog(this, game.i18n.localize('DL.DialogSpellRoll') + game.i18n.localize(item.name), async (event, html) => { for (const target of targets) { await this.useSpell(item, html.form.elements.boonsbanes.value, html.form.elements.modifier.value, [target]) } @@ -796,15 +839,12 @@ export class DemonlordActor extends Actor { (parseInt(this.system.bonuses.attack.boons.all) || 0) + (parseInt(this.system.bonuses.attack.boons.spell) || 0) - const horrifyingBane = game.settings.get('demonlord', 'horrifyingBane') - const ignoreLevelDependentBane = (game.settings.get('demonlord', 'optionalRuleLevelDependentBane') && ((this.system?.level >=3 && this.system?.level <=6 && target?.actor?.system?.difficulty <= 25) || (this.system?.level >=7 && target?.actor?.system?.difficulty <= 50))) ? false : true - if (target) boons -= (parseInt(target?.actor?.system.bonuses.defense.boons[defenseAttribute]) || 0) + (parseInt(target?.actor?.system.bonuses.defense.boons.all) || 0) + (parseInt(target?.actor?.system.bonuses.defense.boons.spell) || 0) + - (horrifyingBane && ignoreLevelDependentBane && !this.system.horrifying && !this.system.frightening && target?.actor?.system.horrifying && 1 || 0) + this.getTargetAttackBane(target[0]?.actor) const boonsReroll = parseInt(this.system.bonuses.rerollBoon1Dice) @@ -819,7 +859,7 @@ export class DemonlordActor extends Actor { attackRoll: attackRoll }) - postSpellToChat(this, spell, attackRoll, target?.actor, parseInt(inputBoons) || 0, parseInt(inputModifier) || 0) + postSpellToChat(this, spell, attackRoll, target[0]?.actor, parseInt(inputBoons) || 0, parseInt(inputModifier) || 0) for (let effect of this.appliedEffects) { const specialDuration = foundry.utils.getProperty(effect, `flags.${game.system.id}.specialDuration`) @@ -884,7 +924,7 @@ export class DemonlordActor extends Actor { await this.deleteEmbeddedDocuments('Item', [tempSpell[0].id]) } else { if (item.system?.action?.attack) { - launchRollDialog(game.i18n.localize('DL.ItemVSRoll') + game.i18n.localize(item.name), async (event, html) => + launchRollDialog(this, game.i18n.localize('DL.ItemVSRoll') + game.i18n.localize(item.name), async (event, html) => await this.useItem(item, html.form.elements.boonsbanes.value, html.form.elements.modifier.value), ) } else { await this.useItem(item, 0, 0) @@ -922,14 +962,12 @@ export class DemonlordActor extends Actor { (parseInt(this.system.bonuses.attack.boons.all) || 0) + parseInt(itemData.action?.boonsbanes || 0) - const horrifyingBane = game.settings.get('demonlord', 'horrifyingBane') - const ignoreLevelDependentBane = (game.settings.get('demonlord', 'optionalRuleLevelDependentBane') && ((this.system?.level >=3 && this.system?.level <=6 && target?.actor?.system?.difficulty <= 25) || (this.system?.level >=7 && target?.actor?.system?.difficulty <= 50))) ? false : true - if (targets.length === 1) boons -= ( (parseInt(target?.actor?.system.bonuses.defense.boons[defenseAttribute]) || 0) + (parseInt(target?.actor?.system.bonuses.defense.boons.all || 0)) + - (horrifyingBane && ignoreLevelDependentBane && !this.system.horrifying && !this.system.frightening && target?.actor?.system.horrifying && 1 || 0)) + this.getTargetAttackBane(target.actor)) + const boonsReroll = parseInt(this.system.bonuses.rerollBoon1Dice) attackRoll = new Roll(this.rollFormula(modifiers, boons, boonsReroll), this.system) @@ -949,7 +987,7 @@ export class DemonlordActor extends Actor { async rollCorruption() { const corruptionRoll = new Roll('1d20') await corruptionRoll.evaluate() - postCustomTextToChat(this, corruptionRoll,'corruptionRoll') + postCustomTextToChat(this, corruptionRoll, { mode: 'corruptionRoll' }) } /* -------------------------------------------- */ @@ -969,14 +1007,14 @@ export class DemonlordActor extends Actor { async setInsanityValue(increment) { let actor = this - // Embedded function + // Nested function async function stunnedChallengeRoll() { if (!actor.isImmuneToAffliction('stunned')) { const attribute = actor.getAttribute('will') - let roll = await actor.rollAttributeChallenge(attribute, 0, 0, 'stunnedRoll') + let roll = await actor.rollAttributeChallenge(attribute, 0, 0, {mode: 'stunnedRoll'}) const targetNumber = game.settings.get('demonlord', 'optionalRuleDieRollsMode') === 'b' ? 11 : 10 if (roll.total < targetNumber) { - const stunnedEffect = CONFIG.statusEffects.find(e => e.id === 'stunned') + const stunnedEffect = foundry.utils.deepClone(CONFIG.statusEffects.find(e => e.id === 'stunned')) stunnedEffect['statuses'] = stunnedEffect.id stunnedEffect.duration.rounds = 1 await ActiveEffect.create(stunnedEffect, { @@ -994,7 +1032,7 @@ export class DemonlordActor extends Actor { const isStunned = actor.effects.find(e => e.statuses?.has('stunned')) === undefined ? false : true await actor.update({ 'system.characteristics.insanity.value': newValue }) if (!isFrightened) { - const frightenedEffect = CONFIG.statusEffects.find(e => e.id === 'frightened') + const frightenedEffect = foundry.utils.deepClone(CONFIG.statusEffects.find(e => e.id === 'frightened')) frightenedEffect['statuses'] = frightenedEffect.id frightenedEffect.duration.rounds = newValue @@ -1011,139 +1049,502 @@ export class DemonlordActor extends Actor { if (actor.system.characteristics.insanity.value === actor.system.characteristics.insanity.max) await this.goingMad() } - async rollFrightened() { - let actor = this - const attribute = actor.getAttribute('will') - const isImmuneToFrightened = actor.isImmuneToAffliction('frightened') ? true : false - const isStunned = actor.effects.find(e => e.statuses?.has('stunned')) === undefined ? false : true - - // Embedded function - async function setFrightenedAffliction(durationRoll) { - const frightenedEffect = CONFIG.statusEffects.find(e => e.id === 'frightened') - frightenedEffect['statuses'] = frightenedEffect.id - frightenedEffect.duration.rounds = durationRoll.total - await ActiveEffect.create(frightenedEffect, { - parent: actor, + async rollFrightened() { + let actor = this + const attribute = actor.getAttribute('will') + const isImmuneToFrightened = actor.isImmuneToAffliction('frightened') ? true : false + const isStunned = actor.effects.find(e => e.statuses?.has('stunned')) === undefined ? false : true + const targetNumber = game.settings.get('demonlord', 'optionalRuleDieRollsMode') === 'b' ? 11 : 10 + const fourAndMoreEffect = new ActiveEffect({ + name: game.i18n.localize('DL.FourOrMoreCreaturesInSight'), + icon: 'icons/svg/terror.svg', + changes: [{ + key: 'system.bonuses.challenge.boons.will', + value: -1, + mode: CONST.ACTIVE_EFFECT_MODES.ADD, + }, ], + flags: { + demonlord: { + specialDuration: 'NextChallengeRoll', + }, + }, }) - await postCustomTextToChat(actor, durationRoll, 'plainTextFrightened', attribute.key) - } - // Embedded function - async function setBoonsForDarkMagicSpells() { - // Demon Lord page 111 - let darkMagicSpellsKnown = actor.spells.filter(a => a.system.isDarkMagic) - if (darkMagicSpellsKnown.length) { - let fourAndMoreEffect = new ActiveEffect({ - name: game.i18n.localize('DL.DarkMagicSpellsKnown'), - icon: 'icons/svg/terror.svg', - changes: [ - { - key: 'system.bonuses.challenge.boons.will', - value: darkMagicSpellsKnown.length, - mode: CONST.ACTIVE_EFFECT_MODES.ADD, - }, - ], - flags: { - demonlord: { - specialDuration: 'NextChallengeRoll', - }, - }, - }) + // Nested function + function ignoreTarget(target) { + return (game.settings.get('demonlord', 'optionalRuleLevelDependentBane') && ((actor.system?.level >= 3 && actor.system?.level <= 6 && target?.system?.difficulty <= 25) || (actor.system?.level >= 7 && target?.system?.difficulty <= 50))) + } - await ActiveEffect.create(fourAndMoreEffect, { + // Nested function + async function setFrightenedAffliction(durationRoll) { + const frightenedEffect = foundry.utils.deepClone(CONFIG.statusEffects.find(e => e.id === 'frightened')) + frightenedEffect['statuses'] = frightenedEffect.id + frightenedEffect.duration.rounds = durationRoll.total + await ActiveEffect.create(frightenedEffect, { parent: actor, }) + await postCustomTextToChat(actor, durationRoll, { + mode: 'plainTextFrightened' + }, attribute.key) } - } - launchFrightenedDialog(async (dHtml, creatureTrait) => { - let fourOrMore = dHtml.currentTarget.querySelector("input[id='fourOrMore']").checked ? -1 : 0 - if (fourOrMore) { - let fourAndMoreEffect = new ActiveEffect({ - name: game.i18n.localize('DL.FourOrMoreCreaturesInSight'), - icon: 'icons/svg/terror.svg', - changes: [ - { + // Nested function + async function setBanesForWillChalleneRoll(target) { + if (target.system.willChallengeRollBanes > 0) { + let willChallengeRollBanesEffect = new ActiveEffect({ + name: game.i18n.localize(`${game.i18n.localize('DL.WillChallengeRollBane')} [${game.i18n.localize('DL.ActionTarget')}]`), + icon: 'icons/svg/terror.svg', + changes: [{ key: 'system.bonuses.challenge.boons.will', - value: -1, + value: (target.system.willChallengeRollBanes)*-1, mode: CONST.ACTIVE_EFFECT_MODES.ADD, + }, ], + flags: { + demonlord: { + specialDuration: 'NextChallengeRoll', + }, }, - ], - flags: { - demonlord: { - specialDuration: 'NextChallengeRoll', + }) + + await ActiveEffect.create(willChallengeRollBanesEffect, { + parent: actor, + }) + } + } + + // Nested function + async function setBoonsForDarkMagicSpells() { + // Demon Lord page 111 + let darkMagicSpellsKnown = actor.spells.filter(a => a.system.isDarkMagic) + if (darkMagicSpellsKnown.length) { + let darkMagicSpellsKnownEffect = new ActiveEffect({ + name: game.i18n.localize('DL.DarkMagicSpellsKnown'), + icon: 'icons/svg/terror.svg', + changes: [{ + key: 'system.bonuses.challenge.boons.will', + value: darkMagicSpellsKnown.length, + mode: CONST.ACTIVE_EFFECT_MODES.ADD, + }, ], + flags: { + demonlord: { + specialDuration: 'NextChallengeRoll', + }, }, + }) + + await ActiveEffect.create(darkMagicSpellsKnownEffect, { + parent: actor, + }) + } + } + + const targets = tokenManager.targets + if (targets.length === 0) return ui.notifications.warn(game.i18n.localize('DL.DialogWarningTargetNotSelected')) + if (actor.isImmuneToAffliction('frightened')) + return ui.notifications.warn(game.i18n.localize('DL.DialogWarningActorImmuneFrightened')) + + if (!game.settings.get('demonlord', 'optionalRuleTraitMode2025')) { + let isFailed = false + if (targets.length === 1) { + if ((!targets[0].actor.system.horrifying && !targets[0].actor.system.frightening) || ignoreTarget(targets[0].actor)) + return ui.notifications.warn( + game.i18n.format('DL.DialogWarningTargetNeitherFnorH', { + target: targets[0].actor.name + }), + ) + if (this.isFrightenedFrom(targets[0].actor)) + return ui.notifications.warn( + game.i18n.format('DL.DialogWarningAlreadyMadeWILLFrightened', { + creature: targets[0].actor.name + }), + ) + + const traitType = + targets[0].actor.system.frightening && targets[0].actor.system.horrifying ? + game.i18n.localize('DL.CreatureHorrifying').toLowerCase() : + targets[0].actor.system.frightening ? + game.i18n.localize('DL.CreatureFrightening').toLowerCase() : + game.i18n.localize('DL.CreatureHorrifying').toLowerCase() + + if (this.isImmuneToTarget(targets[0].actor)) + return ui.notifications.warn( + game.i18n.format('DL.DialogWarningAlreadyMadeWILLImmune', { + creature: targets[0].actor.name, + trait: traitType + }), + ) + } + + const validTargetArray = targets.filter( + target => + (target.actor.system.horrifying || target.actor.system.frightening) && + !actor.isImmuneToTarget(target.actor) && + !ignoreTarget(target.actor), + ) + + let content = '

' + + if (validTargetArray.length === 0) return ui.notifications.warn(game.i18n.localize('DL.DialogWarningInvalidTarget')) + let isHorrifying = false + let isFrightening = false + + for (const target of validTargetArray) { + content += `• ${target.actor.name}
` + if (target.actor.system.horrifying && !actor.isImmuneToTarget(target.actor) && !ignoreTarget(target.actor)) + isHorrifying = true + if (target.actor.system.frightening && !actor.isImmuneToTarget(target.actor) && !ignoreTarget(target.actor)) + isFrightening = true + } + + if (isHorrifying) isFrightening = false + content += '

' + + if (validTargetArray.length >= 4) + content += `
${game.i18n.localize( + 'DL.FourOrMoreCreatures', + )}
` + + const question = validTargetArray.length === 1 ? game.i18n.localize('DL.DialogDoYouSeeThisCreatureFirstTime') : game.i18n.localize('DL.DialogDoYouSeeTheseCreaturesFirstTime') + const isLineOfSight = await foundry.applications.api.DialogV2.confirm({ + window: { + title: game.i18n.localize('DL.LookOutCreatures'), + }, + content: question + content, + position: { + width: 350, }, }) - if (!isStunned) + if (!isLineOfSight) return + + if (validTargetArray.length >= 4 && !isStunned) await ActiveEffect.create(fourAndMoreEffect, { parent: actor, }) - } - const isHorrifying = creatureTrait === 'h' || creatureTrait === 'fh' ? true : false - const isFrightening = creatureTrait === 'f' ? true : false - const isFrightened = actor.effects.find(e => e.statuses?.has('frightened')) === undefined ? false : true - const targetNumber = game.settings.get('demonlord', 'optionalRuleDieRollsMode') === 'b' ? 11 : 10 - const durationRoll = actor.system.characteristics.insanity.value - ? new Roll(`1d3+${actor.system.characteristics.insanity.value}`) - : new Roll(`1d3`) - await durationRoll.evaluate() - - if (isFrightening) { - if (isImmuneToFrightened) return ui.notifications.warn(game.i18n.localize('DL.DialogWarningActorImmuneFrightened')) - if (!isFrightened) { - if (!isStunned) { - let roll = await actor.rollAttributeChallenge(attribute, 0, 0, 'frightenedForRounds') - if (roll.total < targetNumber) await setFrightenedAffliction(durationRoll) - } else { - ui.notifications.warn(game.i18n.localize('DL.AfflictionsStunned')) - await setFrightenedAffliction(durationRoll) + const isFrightened = actor.effects.find(e => e.statuses?.has('frightened')) === undefined ? false : true + const durationRoll = actor.system.characteristics.insanity.value ? + new Roll(`1d3+${actor.system.characteristics.insanity.value}`) : + new Roll(`1d3`) + await durationRoll.evaluate() + + if (isFrightening) { + if (isImmuneToFrightened) + return ui.notifications.warn(game.i18n.localize('DL.DialogWarningActorImmuneFrightened')) + if (!isFrightened) { + if (!isStunned) { + let roll = await actor.rollAttributeChallenge(attribute, 0, 0, { + mode: 'frightenedForRounds' + }) + if (roll.total < targetNumber) { + await setFrightenedAffliction(durationRoll) + isFailed = true + } + } else { + ui.notifications.error(game.i18n.localize('DL.AfflictionsStunned')) + isFailed = true + await setFrightenedAffliction(durationRoll) + } + } + // Frightened + else { + if (!isStunned) { + await setBoonsForDarkMagicSpells() + let roll = await actor.rollAttributeChallenge(attribute, 0, 0, { + mode: 'gained1Insanity', + legacyMode: true, + }) + if (roll.total < targetNumber) { + await this.setInsanityValue(1) + isFailed = true + } + } else { + ui.notifications.error(game.i18n.localize('DL.AfflictionsStunned')) + let insanityIncreaseRoll = new Roll('1') + await insanityIncreaseRoll.evaluate() + postCustomTextToChat(actor, insanityIncreaseRoll, { + mode: 'gainedInsanity' + }, attribute.key) + await this.setInsanityValue(1) + isFailed = true + } } } - // Frightened - else { - if (!isStunned) { - await setBoonsForDarkMagicSpells() - let roll = await actor.rollAttributeChallenge(attribute, 0, 0, 'gained1Insanity') - if (roll.total < targetNumber) await this.setInsanityValue(1) - } else { - ui.notifications.warn(game.i18n.localize('DL.AfflictionsStunned')) - await postCustomTextToChat(actor, null, 'gained1InsanityWORoll') - await this.setInsanityValue(1) + + if (isHorrifying) { + if (!isStunned) await setBoonsForDarkMagicSpells(actor) + if (!isFrightened) { + if (!isStunned) { + let roll = await actor.rollAttributeChallenge(attribute, 0, 0, { + mode: 'gained1Insanity', + legacyMode: true, + }) + if (roll.total < targetNumber) { + await this.setInsanityValue(1) + isFailed = true + } + } else { + let insanityIncreaseRoll = new Roll('1') + await insanityIncreaseRoll.evaluate() + postCustomTextToChat(actor, insanityIncreaseRoll, { + mode: 'gainedInsanity' + }, attribute.key) + await this.setInsanityValue(1) + ui.notifications.error(game.i18n.localize('DL.AfflictionsStunned')) + isFailed = true + } + } + // Frightened + else { + if (!isStunned) { + let roll = await actor.rollAttributeChallenge(attribute, 0, 0, { + mode: 'horrifying2025', + rollFormula: '1d3', + legacyMode: true, + }) + let insanityIncreaseRoll = new Roll('1d3') + await insanityIncreaseRoll.evaluate() + if (roll.total < targetNumber) { + postCustomTextToChat(actor, insanityIncreaseRoll, { + mode: 'gainedInsanity' + }, attribute.key) + await this.setInsanityValue(insanityIncreaseRoll.total) + isFailed = true + } + } else { + ui.notifications.error(game.i18n.localize('DL.AfflictionsStunned')) + let insanityIncreaseRoll = new Roll('1d3') + await insanityIncreaseRoll.evaluate() + postCustomTextToChat(actor, insanityIncreaseRoll, { + mode: 'gainedInsanity' + }, attribute.key) + await this.setInsanityValue(insanityIncreaseRoll.total) + isFailed = true + } + } + } + + for (const target of validTargetArray) { + if (isFailed) { + + let effect = actor.effects.find(e => e.statuses?.has('frightened')) + const seesFrighteningSource = new ActiveEffect({ + name: game.i18n.format('DL.FrightenedBy', { + creature: target.actor.name + }), + icon: 'systems/demonlord/assets/icons/effects/eye-target.svg', + flags: { + demonlord: { + FrightenedFromActoruuid: target.actor.uuid, + sourceType: "character", + }, + }, + duration: { + rounds: effect.duration.rounds + }, + description: game.i18n.format('DL.FrightenedYou', { + creature: target.actor.name + }), + origin: target.actor.uuid + }) + + await ActiveEffect.create(seesFrighteningSource, { + parent: actor, + }) } + + const imuneToFrightenedEffect = new ActiveEffect({ + name: game.i18n.format('DL.ImmuneToTarget', { + creature: target.actor.name + }), + icon: 'systems/demonlord/assets/icons/effects/immune.svg', + duration: { + rounds: 1, + }, + flags: { + demonlord: { + immuneToActoruuid: target.actor.uuid, + specialDuration: 'RestComplete', + }, + }, + description: game.i18n.format('DL.ImmuneToHorrifyingOneMinute', { + creature: target.actor.name + }), + origin: target.actor.uuid + }) + + await ActiveEffect.create(imuneToFrightenedEffect, { + parent: actor, + }) } } + // Horrifying2025 + else { + let roll + if (targets.length === 1) { + if (!targets[0].actor.system.horrifying || ignoreTarget(targets[0].actor)) + return ui.notifications.warn( + game.i18n.format('DL.DialogWarningTargetNotHorrifying', { + target: targets[0].actor.name + }), + ) + if (this.isImmuneToTarget(targets[0].actor)) + return ui.notifications.warn( + game.i18n.format('DL.DialogWarningAlreadyMadeWILLImmune', { + creature: targets[0].actor.name, + trait: game.i18n.localize('DL.CreatureHorrifying').toLowerCase() + }), + ) + if (this.isFrightenedFrom(targets[0].actor)) + return ui.notifications.warn( + game.i18n.format('DL.DialogWarningAlreadyMadeWILLFrightened', { + creature: targets[0].actor.name + }), + ) + } + let content = '

' + + const validTargetArray = targets.filter( + target => + !( + !target.actor.system.horrifying || + ignoreTarget(target.actor) || + actor.isFrightenedFrom(target.actor) || + actor.isImmuneToTarget(target.actor) + ), + ) + if (validTargetArray.length === 0) return ui.notifications.warn(game.i18n.localize('DL.DialogWarningInvalidTarget')) + for (const target of validTargetArray) { + content += `• ${target.actor.name}
` + } - if (isHorrifying) { - if (!isStunned) await setBoonsForDarkMagicSpells(actor) - if (!isFrightened) { - if (!isStunned) { - let roll = await actor.rollAttributeChallenge(attribute, 0, 0, 'gained1Insanity') - if (roll.total < targetNumber) await this.setInsanityValue(1) + content += '

' + + const question = validTargetArray.length === 1 ? game.i18n.localize('DL.DialogDoYouStartYourTurnWithLOSCreature') : game.i18n.localize('DL.DialogDoYouStartYourTurnWithLOSCreatures') + const isLineOfSight = await foundry.applications.api.DialogV2.confirm({ + window: { + title: game.i18n.localize('DL.LookOutCreatures'), + }, + content: question + content, + position: { + width: 500, + }, + }) + + if (!isLineOfSight) return + + for (const target of validTargetArray) { + await setBoonsForDarkMagicSpells(actor) + await setBanesForWillChalleneRoll(target.actor) + const rollFormula = this.parseRollFormula(target.actor) + + if (!rollFormula || parseInt(rollFormula) == 0) { + roll = await actor.rollAttributeChallenge(attribute, 0, 0, { + mode: 'horrifying2025', + target: target, + rollFormula: null, + }) + if (roll.total < targetNumber) { + const frightenedEffect = foundry.utils.deepClone(CONFIG.statusEffects.find(e => e.id === 'frightened')) + frightenedEffect['statuses'] = frightenedEffect.id + await ActiveEffect.create(frightenedEffect, { + parent: actor, + }) + } } else { - await this.setInsanityValue(1) - ui.notifications.warn(game.i18n.localize('DL.AfflictionsStunned')) + if (!isStunned) { + roll = await actor.rollAttributeChallenge(attribute, 0, 0, { + mode: 'horrifying2025', + target: target, + rollFormula: rollFormula, + }) + if (roll.total < targetNumber) { + let insanityIncreaseRoll = new Roll(rollFormula) + await insanityIncreaseRoll.evaluate() + + const numberRegex = /^\d+$/ + if (!numberRegex.test(rollFormula)) + postCustomTextToChat( + actor, + insanityIncreaseRoll, + { + mode: 'gainedInsanity', + }, + attribute.key, + ) + await this.setInsanityValue(insanityIncreaseRoll.total) + } + } else { + ui.notifications.error(game.i18n.localize('DL.AfflictionsStunned')) + let insanityIncreaseRoll = new Roll(rollFormula) + await insanityIncreaseRoll.evaluate() + postCustomTextToChat( + actor, + insanityIncreaseRoll, + { + mode: 'gainedInsanity', + }, + attribute.key, + ) + await this.setInsanityValue(insanityIncreaseRoll.total) + // Actor is stunned does not have a FAILED challenge roll, let's simulate one + roll = new Roll('1') + await roll.evaluate() + } } - } - // Frightened - else { - let insanityIncreaseRoll = new Roll('1d3') - await insanityIncreaseRoll.evaluate() - if (!isStunned) { - let roll = await actor.rollAttributeChallenge(attribute, 0, 0, 'gained1d3Insanity') - postCustomTextToChat(actor, insanityIncreaseRoll, 'gainedInsanity', attribute.key) - if (roll.total < targetNumber) await this.setInsanityValue(insanityIncreaseRoll.total) + + if (roll.total >= targetNumber) { + const imuneToFrightenedEffect = new ActiveEffect({ + name: game.i18n.format('DL.ImmuneToTarget', { + creature: target.actor.name + }), + icon: 'systems/demonlord/assets/icons/effects/immune.svg', + duration: { + rounds: 6, + }, + flags: { + demonlord: { + immuneToActoruuid: target.actor.uuid, + sourceType: "character", + }, + }, + description: game.i18n.format('DL.ImmuneToHorrifyingOneMinute', { + creature: target.actor.name + }), + origin: target.actor.uuid + }) + + await ActiveEffect.create(imuneToFrightenedEffect, { + parent: actor, + }) } else { - ui.notifications.warn(game.i18n.localize('DL.AfflictionsStunned')) - postCustomTextToChat(actor, insanityIncreaseRoll, 'gainedInsanity', attribute.key) - await this.setInsanityValue(insanityIncreaseRoll.total) + const seesFrighteningSource = new ActiveEffect({ + name: game.i18n.format('DL.FrightenedBy', { + creature: target.actor.name + }), + icon: 'systems/demonlord/assets/icons/effects/eye-target.svg', + flags: { + demonlord: { + FrightenedFromActoruuid: target.actor.uuid, + specialDuration: 'RestComplete', + }, + }, + duration: { + rounds: 1, + }, + description: game.i18n.format('DL.FrightenedYou', { + creature: target.actor.name + }), + origin: target.actor.uuid + }) + + await ActiveEffect.create(seesFrighteningSource, { + parent: actor, + }) } - } + } } - }) - } + } async createItemCreate(event) { event.preventDefault() @@ -1262,8 +1663,8 @@ export class DemonlordActor extends Actor { async expendFortune(awarded = false) { const actor = this - if (awarded) postCustomTextToChat(actor, null, 'fortuneAwarded', null) - else postCustomTextToChat(actor, null, 'fortuneExpended', null) + if (awarded) postCustomTextToChat(actor, null, { mode: 'fortuneAwarded' }, null) + else postCustomTextToChat(actor, null, { mode: 'fortuneExpended' }, null) } async restActor(restTime, magicRecovery, talentRecovery, healing) { diff --git a/src/module/actor/sheets/base-actor-sheet.js b/src/module/actor/sheets/base-actor-sheet.js index 299c934f..b3b2f1b9 100644 --- a/src/module/actor/sheets/base-actor-sheet.js +++ b/src/module/actor/sheets/base-actor-sheet.js @@ -133,6 +133,7 @@ export default class DLBaseActorSheet extends HandlebarsApplicationMixin(ActorSh context.addCreatureInventoryTab = game.settings.get('demonlord', 'addCreatureInventoryTab') context.hideTurnMode = game.settings.get('demonlord', 'optionalRuleInitiativeMode') === 's' ? false : true context.hideFortune = game.settings.get('demonlord', 'fortuneHide') ? true : false + context.isTraitMode2025 = game.settings.get('demonlord', 'optionalRuleTraitMode2025') //context.tabs = this._getTabs(options.parts) context.tabs = this._prepareTabs('primary') @@ -205,6 +206,22 @@ export default class DLBaseActorSheet extends HandlebarsApplicationMixin(ActorSh actorData.spells = noSpells ? [] : (m.get('spell') || []) actorData.talents = m.get('talent') || [] actorData.features = m.get('feature') || [] + + // Sorting traits in alphabetical order with an exception: Immune, Frightening and Horrifying have to be at the top. + actorData.features.sort(function(a, b) { + if ((a.name.toLowerCase().includes('immune')) != (b.name.toLowerCase().includes('immune'))) { + return a.name.toLowerCase().includes('immune') ? -1 : 1; + } + if ((a.name.toLowerCase().includes('frightening')) != (b.name.toLowerCase().includes('frightening'))) { + return a.name.toLowerCase().includes('frightening') ? -1 : 1; + } + if ((a.name.toLowerCase().includes('horrifying')) != (b.name.toLowerCase().includes('horrifying'))) { + return a.name.toLowerCase().includes('horrifying') ? -1 : 1; + } + return a.name > b.name ? 1 : + a.name < b.name ? -1 : 0; + }) + // Sort spells in the spellbooks by their rank actorData.spells.sort((a, b) => a.system.rank - b.system.rank) // Prepare the book (spells divided by tradition) @@ -512,7 +529,7 @@ export default class DLBaseActorSheet extends HandlebarsApplicationMixin(ActorSh case 'help': { const attribute = this.actor.system.attributes.intellect if (!DLAfflictions.isActorBlocked(this.actor, 'challenge', attribute.key) && targets.length === 1) - launchRollDialog(this.actor.name + ' - ' + game.i18n.localize('DL.DialogChallengeRoll') + attribute.label, async (event, html) => { + launchRollDialog(this.actor, this.actor.name + ' - ' + game.i18n.localize('DL.DialogChallengeRoll') + attribute.label, async (event, html) => { let result = await this.actor.rollAttributeChallenge(attribute, html.form.elements.boonsbanes.value, html.form.elements.modifier.value) if (result._total >= 10 || game.settings.get('demonlord', 'optionalRuleDieRollsMode') === 'b' && result._total >= 11) { affliction['statuses'] = [affliction.id] @@ -537,7 +554,7 @@ export default class DLBaseActorSheet extends HandlebarsApplicationMixin(ActorSh const attribute = this.actor.system.attributes.intellect const isIncapacitated = targets.length === 1 ? targets[0].actor.appliedEffects.find(ef => ef?.statuses?.has('incapacitated')) : false if (!DLAfflictions.isActorBlocked(this.actor, 'challenge', attribute.key) && isIncapacitated) - launchRollDialog(this.actor.name + ' - ' + game.i18n.localize('DL.DialogChallengeRoll') + attribute.label, async (event, html) => { + launchRollDialog(this.actor, this.actor.name + ' - ' + game.i18n.localize('DL.DialogChallengeRoll') + attribute.label, async (event, html) => { let result = await this.actor.rollAttributeChallenge(attribute, html.form.elements.boonsbanes.value, html.form.elements.modifier.value) if (result._total >= 10 || game.settings.get('demonlord', 'optionalRuleDieRollsMode') === 'b' && result._total >= 11) { if (game.user.isGM) { diff --git a/src/module/actor/sheets/creature-sheet.js b/src/module/actor/sheets/creature-sheet.js index 69ce6128..d1505cd1 100644 --- a/src/module/actor/sheets/creature-sheet.js +++ b/src/module/actor/sheets/creature-sheet.js @@ -1,4 +1,5 @@ import DLBaseActorSheet from './base-actor-sheet' +import DLFrighteningHorrifyingEditor from '../../dialog/frightening-horrifying-editor' export default class DLCreatureSheet extends DLBaseActorSheet { static DEFAULT_OPTIONS = { @@ -8,6 +9,7 @@ export default class DLCreatureSheet extends DLBaseActorSheet { submitOnChange: true }, actions: { + openFrighteningHorrifyingEditor: this.onOpenFrighteningHorrifyingEditor } } @@ -140,6 +142,15 @@ export default class DLCreatureSheet extends DLBaseActorSheet { else if (ev.button == 2) await relic.delete({ parent: this.actor }) } + static async onOpenFrighteningHorrifyingEditor(event) { + event.preventDefault() + event.stopPropagation() + new DLFrighteningHorrifyingEditor({ actor: this.actor, }, { + top: 50, + right: 700, + }).render(true) + } + /* -------------------------------------------- */ /* -------------------------------------------- */ diff --git a/src/module/chat/effect-messages.js b/src/module/chat/effect-messages.js index 6fdda1d3..3739e666 100644 --- a/src/module/chat/effect-messages.js +++ b/src/module/chat/effect-messages.js @@ -94,9 +94,7 @@ export function buildAttackEffectsMessage(attacker, defender, item, attackAttrib let d = _remapEffects(defenderEffects) let defenderBoonsArray = [`system.bonuses.defense.boons.${defenseAttribute}`,"system.bonuses.defense.boons.all"] - const horrifyingBane = game.settings.get('demonlord', 'horrifyingBane') - const ignoreLevelDependentBane = (game.settings.get('demonlord', 'optionalRuleLevelDependentBane') && ((attacker.system?.level >=3 && attacker.system?.level <=6 && defender?.system?.difficulty <= 25) || (attacker.system?.level >=7 && defender?.system?.difficulty <= 50))) ? false : true - let applyHorrifyingBane = (horrifyingBane && ignoreLevelDependentBane && !attacker.system.horrifying && !attacker.system.frightening && defender?.system.horrifying && 1 || 0) + const applyHorrifyingBane = attacker.getTargetAttackBane(defender) let otherBoons = '' let modifiers = '' let inputBoonsMsg = inputBoons ? _toMsg(game.i18n.localize('DL.DialogInput'), plusify(inputBoons)) : '' @@ -155,22 +153,38 @@ export function buildAttackEffectsMessage(attacker, defender, item, attackAttrib let attributeModMsg = attributeMod ? _toMsg(`${game.i18n.localize(attributeText)}`, plusify(attributeMod)) : '' let revealHorrifyingBane = game.settings.get('demonlord', 'optionalRuleRevealHorrifyingBane') - let horrifyingTextPlayer = revealHorrifyingBane ? '
' + _toMsg(`${game.i18n.localize('DL.CreatureHorrifying')} [${game.i18n.localize('DL.ActionTarget')}]`, -1) + '
' : - '
' + _toMsg(`${game.i18n.localize('DL.OtherUnknown')} [${game.i18n.localize('DL.ActionTarget')}]`, -1) + '
' + let creatureType - let horrifyingTextGM = '
' + _toMsg(`${game.i18n.localize('DL.CreatureHorrifying')} [${game.i18n.localize('DL.ActionTarget')}]`, -1) + '
' + if (!game.settings.get('demonlord', 'optionalRuleTraitMode2025')) + creatureType = game.i18n.localize('DL.CreatureHorrifying') + else + creatureType = + defender?.system.frightening && defender?.system.horrifying + ? game.i18n.localize('DL.CreatureHorrifying') + : defender?.system.frightening + ? game.i18n.localize('DL.CreatureFrightening') + : defender?.system.horrifying + ? game.i18n.localize('DL.CreatureHorrifying') + : '' + + const horrifyingText = applyHorrifyingBane > 1 ? game.i18n.localize('DL.CanSeeSoureOfAffliction') : `${game.i18n.localize(creatureType)} [${game.i18n.localize('DL.ActionTarget')}]` + let horrifyingHTMLPlayer = revealHorrifyingBane + ? '
' + _toMsg(horrifyingText, applyHorrifyingBane*-1) + '
' + : '
' + _toMsg(`${game.i18n.localize('DL.OtherUnknown')} [${game.i18n.localize('DL.ActionTarget')}]`, applyHorrifyingBane*-1) + '
' + + let horrifyingHTMLGM = '
' + _toMsg(horrifyingText, applyHorrifyingBane*-1) + '
' let gmOnlyResult = changeListToMsgDefender(d, defenderBoonsArray, '', false) let playerOnlyResult = changeListToMsgDefender(d, defenderBoonsArray, '', true) let gmOnlyMsg = gmOnlyResult ? '
' + gmOnlyResult + '
' : '' let playerOnlyMsg = playerOnlyResult ? '
' + playerOnlyResult + '
' : '' let boonsMsg = + (itemBoons ? _toMsg(item.name, plusify(itemBoons)) : '') + (itemAttributePenalty ? _toMsg(itemAttributeRequirement, plusify(itemAttributePenalty)) : '') + changeListToMsg(m, [`system.bonuses.attack.boons.${attackAttribute}`, "system.bonuses.attack.boons.all"], '') + - (itemBoons ? _toMsg(item.name, plusify(itemBoons)) : '') + otherBoons + - (applyHorrifyingBane ? horrifyingTextPlayer : '') + - (applyHorrifyingBane ? horrifyingTextGM : '') + + (applyHorrifyingBane ? horrifyingHTMLPlayer : '') + + (applyHorrifyingBane ? horrifyingHTMLGM : '') + (playerOnlyMsg ? playerOnlyMsg : '') + (gmOnlyMsg ? gmOnlyMsg : '') boonsMsg = boonsMsg+inputBoonsMsg ? `  ${game.i18n.localize('DL.TalentAttackBoonsBanes')}
` + boonsMsg+inputBoonsMsg : '' diff --git a/src/module/chat/roll-messages.js b/src/module/chat/roll-messages.js index c6b2e441..029fa6ed 100644 --- a/src/module/chat/roll-messages.js +++ b/src/module/chat/roll-messages.js @@ -460,7 +460,7 @@ export async function postSpellToChat(actor, spell, attackRoll, target, inputBoo /* -------------------------------------------- */ -export async function postCustomTextToChat(actor, roll, mode, attribute = {}) { +export async function postCustomTextToChat(actor, roll, options, attribute = {}) { const templateData = { actor: actor, data: {}, @@ -469,7 +469,7 @@ export async function postCustomTextToChat(actor, roll, mode, attribute = {}) { const data = templateData.data const targetNumber = game.settings.get('demonlord', 'optionalRuleDieRollsMode') === 'b' ? 11 : 10 - switch (mode) { + switch (options.mode) { case 'corruptionRoll': data['header'] = game.i18n.localize('DL.CharRolCorruption') data['tagetValueText'] = game.i18n.localize('DL.CharCorruption').toUpperCase() @@ -510,7 +510,7 @@ export async function postCustomTextToChat(actor, roll, mode, attribute = {}) { data['targetValue'] = targetNumber data['failureText'] = roll.total >= targetNumber - ? '' + ? game.i18n.localize('DL.YouCannotBeEffectedUntilYouCompleteARest') : game.i18n.format('DL.BecomeFrightenedForRounds', { round: `${durationRollFormulaText}` }) data['actionEffects'] = buildAttributeEffectsMessage(actor, attribute, 0, 0) data['resultText'] = @@ -521,30 +521,29 @@ export async function postCustomTextToChat(actor, roll, mode, attribute = {}) { break case 'gained1Insanity': { - const isMad = actor.system.characteristics.insanity.value+1 === actor.system.characteristics.insanity.max ? true : false + const isMad = + actor.system.characteristics.insanity.value + 1 === actor.system.characteristics.insanity.max ? true : false data['header'] = game.i18n.localize('DL.ChallengeRollText') data['tagetValueText'] = game.i18n.localize('DL.TalentRollTarget') data['source'] = game.i18n.localize(CONFIG.DL.attributes[attribute]?.toUpperCase()) data['targetValue'] = targetNumber - data['failureText'] = roll.total >= targetNumber ? '' : isMad ? game.i18n.format('DL.GainedInsanityAndGoMad', { insanity: 1 }) : game.i18n.format('DL.GainedInsanity', { insanity: 1 }) - data['actionEffects'] = buildAttributeEffectsMessage(actor, attribute, 0, 0) - data['resultText'] = - roll.total >= targetNumber - ? game.i18n.localize('DL.DiceResultSuccess') - : game.i18n.localize('DL.DiceResultFailure') - } - break - case 'gained1d3Insanity': - { - let insanityRollFormulaText = await foundry.applications.ux.TextEditor.implementation.enrichHTML(`[[/r 1d3]]`) - data['header'] = game.i18n.localize('DL.ChallengeRollText') - data['tagetValueText'] = game.i18n.localize('DL.TalentRollTarget') - data['source'] = game.i18n.localize(CONFIG.DL.attributes[attribute]?.toUpperCase()) - data['targetValue'] = targetNumber - data['failureText'] = - roll.total >= targetNumber - ? '' - : game.i18n.format('DL.GainedInsanity', { insanity: `${insanityRollFormulaText}` }) + if (options.legacyMode) { + data['failureText'] = + roll.total >= targetNumber + ? game.i18n.localize('DL.YouCannotBeEffectedUntilYouCompleteARest') + : isMad + ? game.i18n.format('DL.GainedInsanityAndGoMad', { insanity: 1 }) + : game.i18n.format('DL.GainedInsanity', { insanity: 1 }) + } + else + { + data['failureText'] = + roll.total >= targetNumber + ? game.i18n.format('DL.ImmuneToHorrifyingOneMinute', { creature: options.target.actor.name }) + : isMad + ? game.i18n.format('DL.GainedInsanityAndGoMad', { insanity: 1 }) + : game.i18n.format('DL.GainedInsanity', { insanity: 1 }) + } data['actionEffects'] = buildAttributeEffectsMessage(actor, attribute, 0, 0) data['resultText'] = roll.total >= targetNumber @@ -559,14 +558,13 @@ export async function postCustomTextToChat(actor, roll, mode, attribute = {}) { break case 'gainedInsanity': { - const isMad = roll.total+actor.system.characteristics.insanity.value >= actor.system.characteristics.insanity.max ? true : false - data['text'] = isMad ? game.i18n.format('DL.GainedInsanityAndGoMad', { insanity: roll.total }) : game.i18n.format('DL.GainedInsanity', { insanity: roll.total }) - } - break - case 'gained1InsanityWORoll': - { - const isMad = actor.system.characteristics.insanity.value+1 >= actor.system.characteristics.insanity.max ? true : false - data['text'] = isMad ? game.i18n.format('DL.GainedInsanityAndGoMad', { insanity: 1 }) : game.i18n.format('DL.GainedInsanity', { insanity: 1 }) + const isMad = + roll.total + actor.system.characteristics.insanity.value >= actor.system.characteristics.insanity.max + ? true + : false + data['text'] = isMad + ? game.i18n.format('DL.GainedInsanityAndGoMad', { insanity: roll.total }) + : game.i18n.format('DL.GainedInsanity', { insanity: roll.total }) } break case 'fortuneAwarded': @@ -575,6 +573,41 @@ export async function postCustomTextToChat(actor, roll, mode, attribute = {}) { case 'fortuneExpended': data['text'] = game.i18n.localize('DL.DialogFortuneExpended') break + case 'horrifying2025': + { + data['header'] = game.i18n.localize('DL.ChallengeRollText') + data['tagetValueText'] = game.i18n.localize('DL.TalentRollTarget') + data['source'] = game.i18n.localize(CONFIG.DL.attributes[attribute]?.toUpperCase()) + data['targetValue'] = targetNumber + + if (!options.rollFormula) { + data['failureText'] = + roll.total >= targetNumber + ? game.i18n.format('DL.ImmuneToHorrifyingOneMinute', { creature: options.target.actor.name }) + : game.i18n.format('DL.FrightenedYou', { creature: options.target.actor.name }) + } else { + let insanityRollFormulaText = await foundry.applications.ux.TextEditor.implementation.enrichHTML( + `[[/r ${options.rollFormula}]]`, + ) + if (options.legacyMode) { + data['failureText'] = + roll.total >= targetNumber + ? game.i18n.format('DL.YouCannotBeEffectedUntilYouCompleteARest') + : game.i18n.format('DL.GainedInsanity', { insanity: `${insanityRollFormulaText}` }) + } else { + data['failureText'] = + roll.total >= targetNumber + ? game.i18n.format('DL.ImmuneToHorrifyingOneMinute', { creature: options.target.actor.name }) + : game.i18n.format('DL.GainedInsanity', { insanity: `${insanityRollFormulaText}` }) + } + } + data['actionEffects'] = buildAttributeEffectsMessage(actor, attribute, 0, 0) + data['resultText'] = + roll.total >= targetNumber + ? game.i18n.localize('DL.DiceResultSuccess') + : game.i18n.localize('DL.DiceResultFailure') + } + break } data['actorInfo'] = buildActorInfo(actor) @@ -589,7 +622,7 @@ export async function postCustomTextToChat(actor, roll, mode, attribute = {}) { chatData.content = await foundry.applications.handlebars.renderTemplate(template, templateData) await ChatMessage.create(chatData) - if (roll?.total < actor.system.characteristics.corruption.value && mode === 'corruptionRoll') { + if (roll?.total < actor.system.characteristics.corruption.value && options.mode === 'corruptionRoll') { const compendiumRollTables = await game.packs.get('demonlord.sotdl-roll-tables').getDocuments() const tableMarkOfDarkess = compendiumRollTables.find(i => i.name === 'Mark of Darkness') const result = await tableMarkOfDarkess.draw() diff --git a/src/module/compendium-browser/compendium-browser.js b/src/module/compendium-browser/compendium-browser.js index c33c13d1..5fd2f874 100644 --- a/src/module/compendium-browser/compendium-browser.js +++ b/src/module/compendium-browser/compendium-browser.js @@ -60,7 +60,7 @@ export default class DLCompendiumBrowser extends HandlebarsApplicationMixin(Appl }, position: { width: 1300, - height: 750, + height: 800, }, scrollY: [], //editable: true, @@ -809,7 +809,7 @@ export default class DLCompendiumBrowser extends HandlebarsApplicationMixin(Appl if (justTypeSearch) return results // ...searched text - if (search.text) { + if (search.text || filters[search.type].description) { if (search.caseSensitive) { results = results.filter(e => e.name.indexOf(search.text) >= 0) results = results.filter(e => e.system.description.indexOf(filters[search.type].description) >= 0) @@ -835,7 +835,7 @@ export default class DLCompendiumBrowser extends HandlebarsApplicationMixin(Appl results = results.filter(e => { if (filters?.creature?.difficulty.length && !filters.creature.difficulty.includes(e.system.difficulty.toString())) return false if (filters?.creature?.descriptor.length && !e.system.descriptor.includes(filters.creature.descriptor)) return false - if (filters?.creature?.perceptionSenses.length && !filters.creature.perceptionSensesincludes(e.system.perceptionsenses)) return false + if (filters?.creature?.perceptionSenses.length && !filters.creature.perceptionSenses.includes(e.system.perceptionsenses)) return false if (!!filters?.creature?.usesMagic && (e.system.isMagic > 0 ? filters.creature.usesMagic !== 'yes' : filters.creature.usesMagic !== 'no')) return false if (filters?.creature.frighteningType === 'none' && (e.system.frightening || e.system.horrifying)) return false diff --git a/src/module/data/actor/CreatureDataModel.js b/src/module/data/actor/CreatureDataModel.js index 56a50d55..c9c3567b 100644 --- a/src/module/data/actor/CreatureDataModel.js +++ b/src/module/data/actor/CreatureDataModel.js @@ -30,10 +30,8 @@ export default class CreatureDataModel extends foundry.abstract.DataModel { difficultyBase: makeIntField(), frightening: makeBoolField(), horrifying: makeBoolField(), - frighteningHorrifyingRollBanes: makeIntField(), - frighteningHorrifyingAffectedRolls: makeStringField(), - horrifyingInsanityFormula: makeStringField(), - descriptor: makeStringField(), + willChallengeRollBanes: makeIntField(), + horrifyingInsanityFormula: makeStringField(), perceptionsenses: makeStringField(), speedtraits: makeStringField(), armor: makeStringField(), diff --git a/src/module/dialog/frightened-dialog.js b/src/module/dialog/frightened-dialog.js deleted file mode 100644 index c740c946..00000000 --- a/src/module/dialog/frightened-dialog.js +++ /dev/null @@ -1,40 +0,0 @@ -const { DialogV2 } = foundry.applications.api - -export default function launchFrightenedDialog(callback) { - const d = new DialogV2({ - window: { - title: game.i18n.localize('DL.LookOutCreatures'), - }, - options : { closeOnSubmit: true}, - position: { - width: 500, - }, - content: ` -
-
- - -
-
- `, - buttons: [ - { - action: 'f', - label: game.i18n.localize('DL.CreatureFrightening'), - callback: html => callback(html, 'f'), - }, - { - action: 'h', - label: game.i18n.localize('DL.CreatureHorrifying'), - callback: html => callback(html, 'h'), - }, - { - action: 'fh', - label: `${game.i18n.localize('DL.CreatureFrightening')}/${game.i18n.localize('DL.CreatureHorrifying')}`, - callback: html => callback(html, 'fh'), - }, - ], - close: () => {}, - }) - d.render(true) -} \ No newline at end of file diff --git a/src/module/dialog/frightening-horrifying-editor.js b/src/module/dialog/frightening-horrifying-editor.js index 76e20d2f..6cf6dad4 100644 --- a/src/module/dialog/frightening-horrifying-editor.js +++ b/src/module/dialog/frightening-horrifying-editor.js @@ -1,6 +1,6 @@ const { ApplicationV2, HandlebarsApplicationMixin } = foundry.applications.api -export class DLFrighteningHorrifyingEditor extends HandlebarsApplicationMixin(ApplicationV2) { +export default class DLFrighteningHorrifyingEditor extends HandlebarsApplicationMixin(ApplicationV2) { static DEFAULT_OPTIONS = { tag: 'form', form: { @@ -12,8 +12,8 @@ export class DLFrighteningHorrifyingEditor extends HandlebarsApplicationMixin(Ap actions: { }, position: { - width: 400, - height: 350, + width: 550, + height: 290, } } @@ -39,7 +39,7 @@ export class DLFrighteningHorrifyingEditor extends HandlebarsApplicationMixin(Ap context.frightening = this.actor.system.frightening context.horrifying = this.actor.system.horrifying - context.rollBanes = this.actor.system.frighteningHorrifyingRollBanes || 1 + context.willChallengeRollBanes = this.actor.system.willChallengeRollBanes || 0 context.affectedRolls = this.actor.system.frighteningHorrifyingAffectedRolls || '' context.insanityFormula = this.actor.system.horrifyingInsanityFormula || '1' @@ -56,17 +56,19 @@ export class DLFrighteningHorrifyingEditor extends HandlebarsApplicationMixin(Ap */ static async onSubmit(_event, _form, formData) { // Update with data above (like in _prepareContext) - await this.actor.update({ - system: { - frighteningHorrifyingTrait: { + if (!Roll.validate(formData.object.insanityFormula)) { + ui.notifications.warn(`${game.i18n.format("DL.DialogInvalidRollFormula", {rollFormula : formData.object.insanityFormula})}`) + } else { + await this.actor.update({ + system: { frightening: formData.object.frightening, horrifying: formData.object.horrifying, frighteningHorrifyingRollBanes: formData.object.rollBanes, - frighteningHorrifyingAffectedRolls: formData.object.affectedRolls, + willChallengeRollBanes: formData.object.willChallengeRollBanes, horrifyingInsanityFormula: formData.object.insanityFormula } - } - }) + }) + } this.actor.sheet.render(true) } diff --git a/src/module/dialog/roll-dialog.js b/src/module/dialog/roll-dialog.js index 7fd2979a..36f72675 100644 --- a/src/module/dialog/roll-dialog.js +++ b/src/module/dialog/roll-dialog.js @@ -1,9 +1,9 @@ -export default async function launchDialog(dialogTitle, callback, withAttributeSelect = false) { - await foundry.applications.api.DialogV2.wait({ - window: { title: dialogTitle }, - position: { width: 420 }, - content: ` - ${withAttributeSelect ? ` +import {TokenManager} from '../pixi/token-manager' +import {calcEffectRemainingRounds, calcEffectRemainingSeconds} from '../combat/combat.js' +export default async function launchDialog(actor, dialogTitle, callback, withAttributeSelect = false) { +const tokenManager = new TokenManager() +const targets = tokenManager.targets +let content = withAttributeSelect ? `
+ + ${game.i18n.localize('DL.DialogAddBonesAndBanes')} +
+
+ + + + ${game.i18n.localize('DL.ModsAdd')} +
` + +function prepareReminderHTML(text) +{ + return `
${text}
` +} + +if (game.settings.get('demonlord', 'launchDialogReminder')) { + if (targets.length === 1 && (targets[0]?.actor.system.horrifying || targets[0]?.actor.system.frightening)) { + if (actor.isFrightenedFrom(targets[0]?.actor)) content += `
${game.i18n.localize('DL.YouAreAttackingSoureceOfFrightenedAffliction')}
` + else if (actor.isImmuneToTarget(targets[0]?.actor)) { + if (!game.settings.get('demonlord', 'optionalRuleTraitMode2025')) content += prepareReminderHTML(game.i18n.localize('DL.YouCannotBeAffectedUntilYouCompleteARest')) + else { + const immuneArray = actor.appliedEffects.filter(x => x.name === game.i18n.format('DL.ImmuneToTarget', { + creature: targets[0].actor.name + })) + let effect + for (const e of immuneArray) { + if (foundry.utils.getProperty(e, 'flags.demonlord.immuneToActoruuid') === targets[0].actor.uuid) effect = e + } + if (game.combat) { + const remainingRounds = calcEffectRemainingRounds(effect, game.combat.round) + const immuneText = (remainingRounds === 1) ? game.i18n.localize('DL.ImmunityLastsUntilTheEndOfNextRound') : (remainingRounds === 0) ? game.i18n.localize('DL.ImmunityLastsUntilTheEndOfTheRound') : game.i18n.format('DL.ImmunityLastsRounds', { + rounds: remainingRounds + }) + content += prepareReminderHTML(immuneText) + } else { + content += prepareReminderHTML(game.i18n.format('DL.ImmunityLastsSeconds', { + seconds: calcEffectRemainingSeconds(effect, game.time.worldTime) + })) + } } -
- - - - ${game.i18n.localize('DL.DialogAddBonesAndBanes')} -
-
- - - - ${game.i18n.localize('DL.ModsAdd')} -
`, + } + + const ignoreLevelDependentBane = (game.settings.get('demonlord', 'optionalRuleLevelDependentBane') && ((actor.system?.level >= 3 && actor.system?.level <= 6 && targets[0]?.actor.system?.difficulty <= 25) || (actor.system?.level >= 7 && targets[0]?.actor.system?.difficulty <= 50))) ? false : true + if (!actor.isFrightenedFrom(targets[0]?.actor) && !actor.isImmuneToTarget(targets[0]?.actor) && !actor.isImmuneToAffliction('frightened') && ignoreLevelDependentBane) { + if (game.settings.get('demonlord', 'optionalRuleTraitMode2025') && targets[0]?.actor.system.horrifying) + content += prepareReminderHTML(game.i18n.localize('DL.YouHaventMadeWillChallengeRollAgainstTarget')) + else if ( + (!game.settings.get('demonlord', 'optionalRuleTraitMode2025') && targets[0]?.actor.system.horrifying) || + (!game.settings.get('demonlord', 'optionalRuleTraitMode2025') && targets[0]?.actor.system.frightening) + ) + content += prepareReminderHTML(game.i18n.localize('DL.YouHaventMadeWillChallengeRollAgainstTarget')) + } + } +} + + await foundry.applications.api.DialogV2.wait({ + window: { title: dialogTitle }, + position: { width: 420 }, + content: content, buttons: [ { action: 'roll', diff --git a/src/module/settings.js b/src/module/settings.js index 5619fdef..41811f05 100644 --- a/src/module/settings.js +++ b/src/module/settings.js @@ -109,7 +109,7 @@ export class OptionalRulesSettings extends HandlebarsApplicationMixin(Applicatio submitOnChange: false, }, position: { - width: 800, + width: 900, height: 'auto', }, tag: 'form', @@ -174,6 +174,9 @@ export class OptionalRulesSettings extends HandlebarsApplicationMixin(Applicatio optionalRuleLevelDependentBane: game.settings.get('demonlord', 'optionalRuleLevelDependentBane'), optionalRuleRevealHorrifyingBane: game.settings.get('demonlord', 'optionalRuleRevealHorrifyingBane'), ignoreEncumbrance: game.settings.get('demonlord', 'ignoreEncumbrance'), + optionalRuleBaneValue : game.settings.get('demonlord', 'optionalRuleBaneValue'), + optionalRuleTraitMode2025: game.settings.get('demonlord', 'optionalRuleTraitMode2025'), + optionalRuleHide2025FHTraits: game.settings.get('demonlord','optionalRuleHide2025FHTraits'), buttons: [ { type: 'submit', @@ -201,8 +204,11 @@ export class OptionalRulesSettings extends HandlebarsApplicationMixin(Applicatio 'optionalRuleDieRollsMode', 'optionalRuleInitiativeMode', 'optionalRuleRollInitEachRound', + 'optionalRuleBaneValue', 'optionalRuleExceedsByFive', 'horrifyingBane', + 'optionalRuleTraitMode2025', + 'optionalRuleHide2025FHTraits', 'optionalRuleLevelDependentBane', 'optionalRuleRevealHorrifyingBane', 'optionalRuleSurroundingMode', @@ -227,8 +233,11 @@ export class OptionalRulesSettings extends HandlebarsApplicationMixin(Applicatio 'optionalRuleDieRollsMode', 'optionalRuleInitiativeMode', 'optionalRuleRollInitEachRound', + 'optionalRuleBaneValue', 'optionalRuleExceedsByFive', 'horrifyingBane', + 'optionalRuleTraitMode2025', + 'optionalRuleHide2025FHTraits', 'optionalRuleLevelDependentBane', 'optionalRuleRevealHorrifyingBane', 'optionalRuleSurroundingMode', @@ -390,7 +399,8 @@ export class CombatSettings extends HandlebarsApplicationMixin(ApplicationV2) { templateAutoRemove: game.settings.get('demonlord', 'templateAutoRemove'), autoDeleteEffects: game.settings.get('demonlord', 'autoDeleteEffects'), concentrationEffect: game.settings.get('demonlord', 'concentrationEffect'), - fineseeAutoSelect: game.settings.get('demonlord', 'fineseeAutoSelect'), + finesseAutoSelect: game.settings.get('demonlord', 'finesseAutoSelect'), + launchDialogReminder : game.settings.get('demonlord', 'launchDialogReminder'), buttons: [ { type: 'submit', @@ -413,7 +423,7 @@ export class CombatSettings extends HandlebarsApplicationMixin(ApplicationV2) { const html = $(this.element) html.find('button').on('click', async event => { if (event.currentTarget?.dataset?.action === 'reset') { - const keys = ['initMessage','initRandomize','autoSetDefeated','showEncounterDifficulty','targetingOnSelect','templateAutoTargeting','templateAutoRemove','autoDeleteEffects','concentrationEffect', 'fineseeAutoSelect'] + const keys = ['initMessage','initRandomize','autoSetDefeated','showEncounterDifficulty','targetingOnSelect','templateAutoTargeting','templateAutoRemove','autoDeleteEffects','concentrationEffect', 'finesseAutoSelect', 'launchDialogReminder'] await Promise.all( keys.map(async key => { await resetToDefault(key) @@ -425,7 +435,7 @@ export class CombatSettings extends HandlebarsApplicationMixin(ApplicationV2) { } static async handler(event, form, formData) { - const keys = ['initMessage','initRandomize','autoSetDefeated','showEncounterDifficulty','targetingOnSelect','templateAutoTargeting','templateAutoRemove','autoDeleteEffects','concentrationEffect','fineseeAutoSelect'] + const keys = ['initMessage','initRandomize','autoSetDefeated','showEncounterDifficulty','targetingOnSelect','templateAutoTargeting','templateAutoRemove','autoDeleteEffects','concentrationEffect','finesseAutoSelect', 'launchDialogReminder'] if (event.submitter.dataset.action === 'reset') { await Promise.all( keys.map(async key => { @@ -512,6 +522,34 @@ export const registerSettings = function () { config: false, }) + game.settings.register('demonlord', 'optionalRuleBaneValue', { + name: game.i18n.localize('DL.SettingOptionalRuleBaneValue'), + hint: game.i18n.localize('DL.SettingOptionalRuleBaneValueHint'), + default: false, + scope: 'world', + type: Boolean, + config: false, + }) + + game.settings.register('demonlord', 'optionalRuleTraitMode2025', { + name: game.i18n.localize('DL.SettingOptionalTraitMode2025'), + hint: game.i18n.localize('DL.SettingOptionalTraitMode2025Hint'), + default: false, + scope: 'world', + type: Boolean, + config: false, + }) + + game.settings.register('demonlord', 'optionalRuleHide2025FHTraits', { + name: game.i18n.localize('DL.SettingOptionalHide2025FHTraits'), + hint: game.i18n.localize('DL.SettingOptionalHide2025FHTraitsHide'), + default: false, + scope: 'world', + type: Boolean, + config: false, + }) + + game.settings.register('demonlord', 'horrifyingBane', { name: game.i18n.localize('DL.SettingHorrifyingBane'), hint: game.i18n.localize('DL.SettingHorrifyingBaneHint'), @@ -774,9 +812,18 @@ export const registerSettings = function () { type: Boolean, config: false, }) - game.settings.register('demonlord', 'fineseeAutoSelect', { - name: game.i18n.localize('DL.SettingFineseeAutoSelect'), - hint: game.i18n.localize('DL.SettingFineseeAutoSelectHint'), + game.settings.register('demonlord', 'finesseAutoSelect', { + name: game.i18n.localize('DL.SettingFinesseAutoSelect'), + hint: game.i18n.localize('DL.SettingFinesseAutoSelectHint'), + default: false, + scope: 'world', + type: Boolean, + config: false, + }) + + game.settings.register('demonlord', 'launchDialogReminder', { + name: game.i18n.localize('DL.SettingLaunchDialogReminder'), + hint: game.i18n.localize('DL.SettingLaunchDialogReminderHint'), default: false, scope: 'world', type: Boolean, diff --git a/src/module/utils/handlebars-helpers.js b/src/module/utils/handlebars-helpers.js index 2f165bde..6b931967 100644 --- a/src/module/utils/handlebars-helpers.js +++ b/src/module/utils/handlebars-helpers.js @@ -108,6 +108,10 @@ export function registerHandlebarsHelpers() { else return `(${i18n('DL.WeaponMelee').toLowerCase()}; ${i18n('DL.ActionRangeReach').toLowerCase()} +${reach[1]})` }) + Handlebars.registerHelper('dlHideItem2025Trait', function (a) { + return ( game.settings.get('demonlord', 'optionalRuleHide2025FHTraits') && !game.settings.get('demonlord', 'optionalRuleTraitMode2025') && [game.i18n.localize('DL.CreatureHorrifying').toLowerCase(), game.i18n.localize('DL.CreatureFrightening').toLowerCase()].find(x => x === a.toLowerCase()!== undefined)) + }) + Handlebars.registerHelper('enrichHTMLUnrolled', async (x) => await TextEditor.enrichHTML(x, { unrolled: true })) Handlebars.registerHelper('lookupAttributeModifier', (attributeName, actorData) => actorData?.system?.attributes[attributeName.toLowerCase()]?.modifier diff --git a/src/styles/components/extras/_compendium-browser.scss b/src/styles/components/extras/_compendium-browser.scss index 144ed235..a8884c4b 100644 --- a/src/styles/components/extras/_compendium-browser.scss +++ b/src/styles/components/extras/_compendium-browser.scss @@ -1,9 +1,9 @@ .demonlord-compendium-browser-search { //height: 200px; - height: 30%; + height: 40%; display: flex; flex-direction: column; - align-items: flex-end; + align-items: flex-start; justify-content: space-around; } diff --git a/src/templates/actor/parts/character-sheet-sidemenu.hbs b/src/templates/actor/parts/character-sheet-sidemenu.hbs index b81cf283..cab9e270 100644 --- a/src/templates/actor/parts/character-sheet-sidemenu.hbs +++ b/src/templates/actor/parts/character-sheet-sidemenu.hbs @@ -91,7 +91,7 @@
{{ifThen (gte ownership 2) system.characteristics.insanity.max '?'}}
{{ifThen (gte ownership 2) system.characteristics.insanity.value '?'}}
{{#if (gte ownership 2)}} - + {{/if}} {{else}}
@@ -107,7 +107,7 @@
{{ifThen (gte ownership 2) 20 '?'}}
{{ifThen (gte ownership 2) system.characteristics.corruption.value '?'}}
{{#if (gte ownership 2)}} - {{/if}} {{else}} diff --git a/src/templates/actor/parts/creature-sheet-sidemenu.hbs b/src/templates/actor/parts/creature-sheet-sidemenu.hbs index 28173811..fcf62bad 100644 --- a/src/templates/actor/parts/creature-sheet-sidemenu.hbs +++ b/src/templates/actor/parts/creature-sheet-sidemenu.hbs @@ -13,14 +13,22 @@ - + {{#if isTraitMode2025}} + {{localize "DL.CreatureFrightening"}} + {{else}} + + {{/if}}
diff --git a/src/templates/actor/tabs/afflictions.hbs b/src/templates/actor/tabs/afflictions.hbs index b1abd4b6..d550ca2b 100644 --- a/src/templates/actor/tabs/afflictions.hbs +++ b/src/templates/actor/tabs/afflictions.hbs @@ -56,10 +56,10 @@
{{localize "DL.ModsDamage"}}
- {{> dlAffliction name="injured" value=flags.demonlord.injured label="DL.injured" tooltip="DL.injuredText"}} - {{> dlAffliction name="incapacitated" value=flags.demonlord.incapacitated label="DL.incapacitated" tooltip="DL.incapacitatedText"}} - {{> dlAffliction name="disabled" value=flags.demonlord.disabled label="DL.disabled" tooltip="DL.disabledText" }} - {{> dlAffliction name="dying" value=flags.demonlord.dying label="DL.dying" tooltip="DL.dyingText" }} + {{> dlAffliction name="injured" value=flags.demonlord.injured label="DL.injured" tooltip="DL.AfflictionsInjured"}} + {{> dlAffliction name="incapacitated" value=flags.demonlord.incapacitated label="DL.incapacitated" tooltip="DL.AfflictionsIncapacitated"}} + {{> dlAffliction name="disabled" value=flags.demonlord.disabled label="DL.disabled" tooltip="DL.AfflictionsDisabled" }} + {{> dlAffliction name="dying" value=flags.demonlord.dying label="DL.dying" tooltip="DL.AfflictionsDying" }}
diff --git a/src/templates/actor/tabs/creature-combat.hbs b/src/templates/actor/tabs/creature-combat.hbs index 9d0f90a0..ade03470 100644 --- a/src/templates/actor/tabs/creature-combat.hbs +++ b/src/templates/actor/tabs/creature-combat.hbs @@ -12,38 +12,40 @@
{{#each actor.features as |item id|}} -
-
-
- - -
-
- - - - {{#if (dlIsNestedItem item)}} - - - - {{else}} - - - + {{#unless (dlHideItem2025Trait item.name)}} +
+
+
+ + +
+
+ + + + {{#if (dlIsNestedItem item)}} + + + + {{else}} + + + + {{/if}} +
+
+ {{#if item.system.description}} + {{/if}}
-
- {{#if item.system.description}} - - {{/if}} -
+ {{/unless}} {{/each}} diff --git a/src/templates/actor/tabs/creature-reference.hbs b/src/templates/actor/tabs/creature-reference.hbs index 06c3a32a..515e3f45 100644 --- a/src/templates/actor/tabs/creature-reference.hbs +++ b/src/templates/actor/tabs/creature-reference.hbs @@ -67,10 +67,12 @@ {{localize "DL.CharSpeed"}} {{system.characteristics.speed}} {{system.speedtraits}}
-{{#each actor.features as |item id|}} -
- {{item.name}} {{{item.system.enrichedDescription}}} -
+ {{#each actor.features as |item id|}} + {{#unless (dlHideItem2025Trait item.name)}} +
+ {{item.name}} {{{item.system.enrichedDescription}}} +
+ {{/unless}} {{/each}} diff --git a/src/templates/compendium-browser/search.hbs b/src/templates/compendium-browser/search.hbs index 43f89c3b..17c04c66 100644 --- a/src/templates/compendium-browser/search.hbs +++ b/src/templates/compendium-browser/search.hbs @@ -8,7 +8,7 @@ - {{selectOptions typeOptions selected=search.type localize=true}} @@ -22,6 +22,12 @@ {{localize 'DL.CompendiumBrowserSearch.IncludeLocal'}} +
+ + + {{localize 'DL.CompendiumBrowserSearch.CaseSensitive'}} +
+ diff --git a/src/templates/dialogs/frightening-horrifying-editor.hbs b/src/templates/dialogs/frightening-horrifying-editor.hbs index 85d20745..74175f88 100644 --- a/src/templates/dialogs/frightening-horrifying-editor.hbs +++ b/src/templates/dialogs/frightening-horrifying-editor.hbs @@ -8,16 +8,8 @@
- - -
-
- - + +
diff --git a/src/templates/setting/combatsettings.hbs b/src/templates/setting/combatsettings.hbs index a9831a43..2437aef5 100644 --- a/src/templates/setting/combatsettings.hbs +++ b/src/templates/setting/combatsettings.hbs @@ -45,8 +45,13 @@

{{localize "DL.SettingConcentrationEffectHint"}}

- - -

{{localize "DL.SettingFineseeAutoSelectHint"}}

+ + +

{{localize "DL.SettingFinesseAutoSelectHint"}}

+
+
+ + +

{{localize "DL.SettingLaunchDialogReminderHint"}}

\ No newline at end of file diff --git a/src/templates/setting/optionalrules.hbs b/src/templates/setting/optionalrules.hbs index c49e8f16..38bbc1fc 100644 --- a/src/templates/setting/optionalrules.hbs +++ b/src/templates/setting/optionalrules.hbs @@ -42,16 +42,23 @@

{{localize "DL.SettingOptionalRuleRevealHorrifyingBaneHint"}}

-
- - -

{{localize "DL.SettingOptionalRuleExceedsByFiveHint"}}

-
-

{{localize "DL.SettingHorrifyingBaneHint"}}

-
+ + +
+ + +

{{localize "DL.SettingOptionalTraitMode2025Hint"}}

+
+ +
+ + +

{{localize "DL.SettingOptionalHide2025FHTraitsHint"}}

+
+
@@ -63,6 +70,16 @@

{{localize "DL.SettingOptionalRuleRevealHorrifyingBaneHint"}}

+
+ + +

{{localize "DL.SettingOptionalRuleBaneValueHint"}}

+
+
+ + +

{{localize "DL.SettingOptionalRuleExceedsByFiveHint"}}

+
diff --git a/src/templates/tabs/afflictions.hbs b/src/templates/tabs/afflictions.hbs index 62cc620f..4f866aab 100644 --- a/src/templates/tabs/afflictions.hbs +++ b/src/templates/tabs/afflictions.hbs @@ -55,10 +55,10 @@
{{localize "DL.ModsDamage"}}
- {{> dlAffliction name="injured" value=flags.demonlord.injured label="DL.injured" tooltip="DL.injuredText"}} - {{> dlAffliction name="incapacitated" value=flags.demonlord.incapacitated label="DL.incapacitated" tooltip="DL.incapacitatedText"}} - {{> dlAffliction name="disabled" value=flags.demonlord.disabled label="DL.disabled" tooltip="DL.disabledText" }} - {{> dlAffliction name="dying" value=flags.demonlord.dying label="DL.dying" tooltip="DL.dyingText" }} + {{> dlAffliction name="injured" value=flags.demonlord.injured label="DL.injured" tooltip="DL.AfflictionsInjured"}} + {{> dlAffliction name="incapacitated" value=flags.demonlord.incapacitated label="DL.incapacitated" tooltip="DL.AfflictionsIncapacitated"}} + {{> dlAffliction name="disabled" value=flags.demonlord.disabled label="DL.disabled" tooltip="DL.AfflictionsDisabled" }} + {{> dlAffliction name="dying" value=flags.demonlord.dying label="DL.dying" tooltip="DL.AfflictionsDying" }}