diff --git a/.editorconfig b/.editorconfig index 0f178672..8f031a24 100644 --- a/.editorconfig +++ b/.editorconfig @@ -7,3 +7,6 @@ indent_size = 2 indent_style = space insert_final_newline = true trim_trailing_whitespace = true + +[*.{hbs,html,svg}] +insert_final_newline = false diff --git a/.github/ABANDONED.md b/.github/ABANDONED.md new file mode 100644 index 00000000..f1b18d53 --- /dev/null +++ b/.github/ABANDONED.md @@ -0,0 +1,1134 @@ +# Abandoned Translations. + +Thank you for being interested in making Call of Cthulhu 7th Edition for Foundry VTT better! Below is a list of translations keys on existing files that still need translated, based on `en.json`. + +[cn.json](#cnjson) + +[cs.json](#csjson) + +[de.json](#dejson) + +[es.json](#esjson) + + +## cn.json +``` +"CoC7.ActorIsTokenHint": "Actor is a token", +"CoC7.ActorDataLinked": "Actor data are linked", +"CoC7.ActorDataNotLinked": "Actor data are NOT linked", +"CoC7.ActorIsSyntheticActor": "Actor is a synthetic actor (instance of an actor)", +"CoC7.MovementAction": "Movement action", +"CoC7.AdjustedMovement": "Adjusted movement", +"CoC7.DefinitelyInsane": "Good for the asylum", +"CoC7.FINISH": "--F-I-N-I-S-H--", +"CoC7.days": "days(s)", +"CoC7.months": "months(s)", +"CoC7.Restart": "Restart", +"CoC7.Reset": "Reset", +"CoC7.Initiative": "Initiative", +"CoC7.PenaltyDice": "Penalty Dice", +"CoC7.LuckNotEnough": "{name} didn't have enough luck to pass the check", +"CoC7.UpgradeSuccessWithLuck": "Upgrade to {{difficultyName}} success for {{luckToSpend}} luck.", +"CoC7.ErrorMissingKeeperUser": "Your keeper needs to be connected to perform this action", +"CoC7.BonusDieAssailantReason": "Add 1 bonus die (assailant is prone, restrained...)", +"CoC7.PenaltyDieSelfReason": "Add 1 penalty die (for being prone, restrained...)", +"CoC7.RollDifficultyRegularTitle": "Regular difficulty", +"CoC7.RollDifficultyHardTitle": "Hard difficulty", +"CoC7.RollDifficultyExtremeTitle": "Extreme difficulty", +"CoC7.RollDifficultyCriticalTitle": "Critical difficulty", +"CoC7.CardType": "Roll type", +"CoC7.GroupRollCard": "Group roll card", +"CoC7.RegularRollCard": "Regular roll card", +"CoC7.AttackManeuver": "Attack Maneuver", +"CoC7.ArmorIgnored": "Armor Ignored", +"CoC7.combatCard.automaticSuccess": "Automatic Success", +"CoC7.Damage": "Damage", +"CoC7.CheckFailed": "Check failed", +"CoC7.CheckPassed": "Check passed", +"CoC7.CheckMemoryRepressed": "Memory repressed", +"CoC7.rangeCombatCard.SurprisedTargetTitle": "1 bonus die for surprised target", +"CoC7.SkillXpGainDisabled": "XP Gain disabled.", +"CoC7.ErrorInvalidCardType": "Card Type", +"CoC7.ErrorInvalidRollType": "Roll Type", +"CoC7.UnarmedWeaponName": "Unarmed", +"CoC7.CleanSkillList": "Clean skill list", +"CoC7.CleanSkillListHint": "
This will Clean your skill list by removing specialization from skill name.
This will avoid to display skill as : 'specialization(specialization(skill))'
", +"CoC7.ReduceSanityLimits": "Reduced all sanity limits by one", +"CoC7.WeaponSkillMain": "Main skill", +"CoC7.BackgroundEncounters": "Losses from Strange Entities", +"CoC7.BackgroundFlags": "Flags", +"CoC7.BackgroundFlagsMythosExperienced": "5% Insanity Mythos Awarded", +"CoC7.BackgroundFlagsMythosHardened": "Mythos Hardened", +"CoC7.SanityLossEncounters": "Sanity Loss Encounters", +"CoC7.SanityLossImmunities": "Sanity Loss Immunities", +"CoC7.AddSanityLossEncounter": "Add Sanity Loss Encounter", +"CoC7.AddSanityLossImmunity": "Add Sanity Loss Immunity", +"CoC7.DeleteSanityLossEncounter": "Delete Sanity Loss Encounter", +"CoC7.DeleteSanityLossImmunity": "Delete Sanity Loss Immunity", +"CoC7.SanityLossTypeDialogTitle": "New sanity loss or immunity", +"CoC7.SanityLossTypeDialogBody": "Add a new Mythos Encounter, Sanity Loss, or Sanity Immunity to the character.", +"CoC7.SanityLossTypeReason": "Reason", +"CoC7.SanityLossTypeValue": "Sanity points lost", +"CoC7.SanityLossEncounter": "Sanity loss encounter", +"CoC7.SanityLossImmunity": "Sanity loss immunity", +"CoC7.AlreadyEncountered": "Already encountered", +"CoC7.AlreadyEncounteredInformation": "Already encountered: {reason} lost {lost}/{max}", +"CoC7.MaxPossibleSanLoss": "Max Possible loss", +"CoC7.InsertLocation": "Insert location", +"CoC7.RemoveLocation": "Remove location", +"CoC7.LocationNotEmpty": "You can't remove a location with an actor", +"CoC7.LocationInit": "You can't remove a starting location", +"CoC7.SomethingInTheWay": "There is something in the way", +"CoC7.FacingObstacle": "You are facing {type}.", +"CoC7.ABarrier": "a barrier", +"CoC7.Barrier": "Barrier", +"CoC7.AHazard": "a hazard", +"CoC7.Hazard": "Hazard", +"CoC7.Obstacle": "Something in the way", +"CoC7.ConsumeBonusDice": "Consume Bonus Dice", +"CoC7.Breakable": "Breakable", +"CoC7.NoValidCheck": "No valid check", +"CoC7.NoValidSkill": "Fake skill", +"CoC7.AskIntentions": "What are your intentions ?", +"CoC7.WaitForPlayerInput": "Wait for player's input", +"CoC7.AskRoll": "Roll {name} ({value}%)", +"CoC7.ActionCost": "Action cost", +"CoC7.Negotiate": "Negotiate", +"CoC7.BreakDown": "Break Down", +"CoC7.BeingCautious": "You elect to take a cautious approach.", +"CoC7.BeingVeryCautious": "You are being very cautious.", +"CoC7.ReflectObstacleChanges": "Reflect changes to obstacle", +"CoC7.PlayerMovesToLocation": "PLayer is moving to the next location", +"CoC7.ObstaclePassed": "You succeesfully found a way.", +"CoC7.GotLucky": "You got lucky, this time...", +"CoC7.ObstacleFail": "You fail.", +"CoC7.ObstacleFumble": "You fail misarably !", +"CoC7.YouLostTime": "You lost time in your attempt.", +"CoC7.MoveToLocation": "You're moving to the next location.", +"CoC7.DontMoveToLocation": "You're staying there !", +"CoC7.ObstacleDamage": "Obstacle damage", +"CoC7.RemoveObstacle": "Destroy Obstacle", +"CoC7.YouTakeNoDamage": "You did not suffer any injury.", +"CoC7.YouTakeSomeDamage": "You take {amount} points of damage.", +"CoC7.TryToNegotiateHazard": "You try to negotiate that hazard.", +"CoC7.TryToGetPastBarriers": "You try to get past that barrier.", +"CoC7.TryToBreak": "You try to break down that barrier.", +"CoC7.DragOnCanvas": "Drag this on canvas to set the position of this location.", +"CoC7.LocationCoordinate": "Location set to : {x}, {y}.\nRight click to clear.\nDrag this on canvas to change the position.", +"CoC7.ConfirmRestartChase": "Do you want to restart the chase ?", +"CoC7.ConfirmRestartChaseHint": "This will restart your chase.\nAll position will be reseted.\nActors that did not rool a speedcheck will have to roll.", +"CoC7.ConfirmResetChase": "Do you want to restet the chase ?", +"CoC7.ConfirmResetChaseHint": "This will reset your chase.All positions and obstacles will be removed.", +"CoC7.IncludeEscapees": "Let fastest fleeing actors participate.", +"CoC7.TooSlow": "Too slow", +"CoC7.TooFast": "Too fast", +"CoC7.DoesNotMeetMinimumReqToBeAdded": "Can not add participant, need at least valid movement action", +"CoC7.IncludeLatecomers": "Let slow pursuer participate.", +"CoC7.VehicleChase": "Chase can include vehicle (NOT IMPLEMENTED)", +"CoC7.StartingRange": "Starting locations advance", +"CoC7.StartingIndex": "Starting index of fleeing actors", +"CoC7.CutToTheChase": "Cut to the chase", +"CoC7.ChaseSetup": "Chase setup", +"CoC7.ParticipantsList": "Participants list", +"CoC7.NotAllHaveSpeedRoll": "Some participants don't have a speed roll!", +"CoC7.NeedMin2Participants": "You need to have a chaser and a prey to start a chase!", +"CoC7.ConfirmCut2Chase": "Are you ready to cut to the chase ?", +"CoC7.ConfirmCut2ChaseHint": "This will start the chase and the first chase round.", +"CoC7.NextRound": "Next round", +"CoC7.ConfirmNextChaseRound": "Proceed to next round ?", +"CoC7.ConfirmNextChaseRoundHint": "You still have action available on some actors. Are you sure you want to proceed ?", +"CoC7.CheckName": "Check", +"CoC7.ObstacleHasHitPoint": "Toggle location's hit points.", +"CoC7.ActionCostOnFail": "Toggle action penalty on fail.", +"CoC7.DamageOnFail": "Toggle damage on fail.", +"CoC7.OpenObstacleResolutionCard": "Start obstacle resolution flow card.", +"CoC7.AddBonusDie": "Add bonus die", +"CoC7.RemoveBonusDie": "Remove bonus die", +"CoC7.DecreaseMovementAction": "Decrease movement action", +"CoC7.IncreaseMovementAction": "Increase movement action", +"CoC7.CautiousApproach": "Take cautious approach", +"CoC7.Cautious": "Cautious", +"CoC7.Assist": "Assist ally", +"CoC7.MoveForward": "Move forward", +"CoC7.MoveBackward": "Go back", +"CoC7.AddActorToChase": "Add an actor to the chase", +"CoC7.ParticipantDropHint": "You can drop and actor on this window or directly on a chase location.", +"CoC7.OverrideCalc": "Override calculation", +"CoC7.NeedRecalculate": "Recalculation needed", +"CoC7.NeedToRecalculate": "All participant will have their movement action recalculated", +"CoC7.SpeedCheck": "Speed check", +"CoC7.Initialize": "Initialize", +"CoC7.Locations": "Chase locations", +"CoC7.NoDamageDealt": "No damage dealt", +"CoC7.DamageDealt": "You deal {value} damage.", +"CoC7.NothingToRoll": "Nothing to roll!", +"CoC7.ParticipantDataMissing": "Participant data missing", +"CoC7.ParticipantNotFound": "Cannot find participant", +"CoC7.ParticipantUuidNotFound": "Cannot find participant {participantUuid}", +"CoC7.ParticipantNotEnoughMovement": "Particpant {assistantUuid} only has {actions} movement actions", +"CoC7.ParticipantAlreadyProcessed": "Participant was already processed.", +"CoC7.ErrorEmptyLocationsList": "Empty locations list", +"CoC7.ErrorBeneficiaryAtMaxBonus": "Beneficiary {name} already has max bonus dice", +"CoC7.ErrorParticipantAtMaxBonus": "{participantUuid} already has max bonus dice", +"CoC7.ErrorTokenNotOnScene": "Token does not belongs to this location's scene", +"CoC7.AddParticipant": "Add Participant", +"CoC7.Remove": "Remove", +"CoC7.Delete": "Delete", +"CoC7.Edit": "Edit", +"CoC7.Create": "Create", +"CoC7.MakeActive": "Make Active", +"CoC7.SelectNewSkill": "Select skill", +"CoC7.AskDamageRoll": "Ask damage roll", +"CoC7.AttemptNegotiateObstacle": "Attempt to negotiate that obstacle", +"CoC7.AttemptBreakDown": "Attempt to break down !!", +"CoC7.ObstacleName": "Obstacle name:", +"CoC7.Actions": "actions:", +"CoC7.Chase.InitiativeShort": "INIT: {value}", +"CoC7.Chase.AdjustedMovementShort": "ADJ. MOV: {value}", +"CoC7.Chase.CheckName": "check name", +"CoC7.Chase.PreysMin": "Preys Min: {value}", +"CoC7.Chase.PreysMax": "Preys Max: {value}", +"CoC7.Chase.ChasersMin": "Chasers Min: {value}", +"CoC7.Chase.ChasersMax": "Chasers Max: {value}", +"CoC7.Sane": "Sane", +"CoC7.ErrorUnableToParseFormula": "{value} is not a valid formula", +"CoC7.ErrorUnableToParseArmorFormula": "Unable to process armor value: {value}. Ignoring armor.", +"CoC7.ErrorUnableToParseSkillFormula": "Unable to parse formula: {value} for skill {name}", +"CoC7.ErrorActorHasNoWeaponNamed": "Actor {actorName} has no weapon named {weaponName}", +"CoC7.ErrorActorHasTooManyWeaponsNamed": "`Actor {actorName} has more than one weapon named {weaponName}. The first found will be used`", +"CoC7.ErrorUnexpectedWeaponText": "Unexpected weapons text, please raise a bug report with the text you are attempting to import", +"CoC7.ErrorUnexpectedSkillsText": "Unexpected skills text, please raise a bug report with the text you are attempting to import", +"CoC7.ErrorNoTokensSelected": "No tokens selected", +"CoC7.ErrorEvaluatingDamage": "Error evaluating damage", +"CoC7.MessageRollingCharacteristic": "Rolling characteristic {label}: {formula}", +"CoC7.DamageDealTo": "Damage {name} {damage}HP", +"CoC7.Add": "Add", +"CoC7.Update": "Update", +"CoC7.Enable": "Enable", +"CoC7.Disable": "Disable", +"CoC7.Duration": "Duration", +"CoC7.TextFieldInvalidJSON": "Unable to parse the JSON, please try again", +"CoC7.ActorImporterUploadError": "Import stopped, unable to write image", +"CoC7.FileUploadError": "Unable to write image, file upload error", +"CoC7.PickDirectory": "Pick Directory", +"CoC7.ActorImported": "New {actorType} imported: {actorName}", +"CoC7.DholeHouseActorImporter": "The Dhole's House Actor Importer JSON", +"CoC7.DholeHouseActorImporterSummary": "Export your DholeHouse's character as JSON and upload it here.", +"CoC7.DholeHouseImportingName": "About to import: ", +"CoC7.DholeHousePickYourJSONFile": "Pick the JSON file exported from The Dhole's House", +"CoC7.DholeHouseActorImporterSource": "Imported from The Dhole's House Actor", +"CoC7.DholeHouseInvalidActor": "The selected JSON doesn't seem to be a valid Dhole's House exported character", +"CoC7.Migrate.UpdateCurrentScene": "Migrating your current scene", +"CoC7.Migrate.Complete": "Finished migrating your data", +"CoC7.Migrate.ErrorDocumentPack": "Failed CoC7 system migration for document {name} in pack {collection}: {message}", +"CoC7.Migrate.ErrorScene": "Failed CoC7 system migration for Scene {name}: {message}", +"CoC7.Migrate.ErrorMacro": "Failed CoC7 system migration for Macro {name}: {message}", +"CoC7.Migrate.ErrorTable": "Failed CoC7 system migration for Table {name}: {message}", +"CoC7.Migrate.ErrorItem": "Failed CoC7 system migration for Item {name}: {message}", +"CoC7.Migrate.ErrorActor": "Failed CoC7 system migration for Actor {name}: {message}", +"CoC7.Settings.DholeUpload.Directory.Name": "The Dhole's House image upload directory", +"CoC7.Settings.DholeUpload.Directory.Hint": "Upload path for The Dhole's House avatars, relative to the Foundry/Data directory.", +"CoC7.ClearAllConditions": "Clear All Conditions", +"CoC7.UnableToUploadDholeImage": "You do not have permission to upload images, if you import the default avatar will be used.", +"CoC7.ToolTipSanity": "This will Clean your skill list by removing specialization from skill name.
This will avoid to display skill as : 'specialization(specialization(skill))'
", +"CoC7.SanGained": "Gained 2d6 ({results} = {sanGained}) Sanity after mastering {skill} with a {skillValue}%", +"CoC7.ReduceSanityLimits": "Reduced all sanity limits by one", +"CoC7.DevelopAttribWarn": "You can not access some attributes in development/creation.", +"CoC7.TradeItem": "Trade / Store Item", +"CoC7.SortBySkillName": "Sort by skill name", +"CoC7.SortBySkillValue": "Sort by skill percent", +"CoC7.UncommonSkillsShow": "Show uncommon skills", +"CoC7.UncommonSkillsHide": "Hide uncommon skills", +"CoC7.NewBookName": "new book", +"CoC7.AddBook": "Add book", +"CoC7.NewSpellName": "new spell", +"CoC7.AddSpell": "Add spell", +"CoC7.WeaponSkillMain": "Main skill", +"CoC7.InventoryIsCurrentlyEmpty": "Inventory is currently empty.", +"CoC7.BackgroundEncounters": "Losses from Strange Entities", +"CoC7.BackgroundFlags": "Flags", +"CoC7.BackgroundFlagsMythosExperienced": "5% Insanity Mythos Awarded", +"CoC7.BackgroundFlagsMythosHardened": "Mythos Hardened", +"CoC7.SanityLossEncounters": "Sanity Loss Encounters", +"CoC7.SanityLossImmunities": "Sanity Loss Immunities", +"CoC7.AddSanityLossEncounter": "Add Sanity Loss Encounter", +"CoC7.AddSanityLossImmunity": "Add Sanity Loss Immunity", +"CoC7.DeleteSanityLossEncounter": "Delete Sanity Loss Encounter", +"CoC7.DeleteSanityLossImmunity": "Delete Sanity Loss Immunity", +"CoC7.SanityLossTypeDialogTitle": "New sanity loss or immunity", +"CoC7.SanityLossTypeDialogBody": "Add a new Mythos Encounter, Sanity Loss, or Sanity Immunity to the character.", +"CoC7.SanityLossTypeReason": "Reason", +"CoC7.SanityLossTypeValue": "Sanity points lost", +"CoC7.SanityLossEncounter": "Sanity loss encounter", +"CoC7.SanityLossImmunity": "Sanity loss immunity", +"CoC7.AlreadyEncountered": "Already encountered", +"CoC7.AlreadyEncounteredInformation": "Already encountered: {reason} lost {lost}/{max}", +"CoC7.MaxPossibleSanLoss": "Max Possible loss", +"CoC7.InsertLocation": "Insert location", +"CoC7.RemoveLocation": "Remove location", +"CoC7.LocationNotEmpty": "You can't remove a location with an actor", +"CoC7.LocationInit": "You can't remove a starting location", +"CoC7.SomethingInTheWay": "There is something in the way", +"CoC7.FacingObstacle": "You are facing {type}.", +"CoC7.ABarrier": "a barrier", +"CoC7.Barrier": "Barrier", +"CoC7.AHazard": "a hazard", +"CoC7.Hazard": "Hazard", +"CoC7.Obstacle": "Something in the way", +"CoC7.ConsumeBonusDice": "Consume Bonus Dice", +"CoC7.Breakable": "Breakable", +"CoC7.NoValidCheck": "No valid check", +"CoC7.NoValidSkill": "Fake skill", +"CoC7.AskIntentions": "What are your intentions ?", +"CoC7.WaitForPlayerInput": "Wait for player's input", +"CoC7.AskRoll": "Roll {name} ({value}%)", +"CoC7.ActionCost": "Action cost", +"CoC7.Negotiate": "Negotiate", +"CoC7.BreakDown": "Break Down", +"CoC7.BeingCautious": "You elect to take a cautious approach.", +"CoC7.BeingVeryCautious": "You are being very cautious.", +"CoC7.ReflectObstacleChanges": "Reflect changes to obstacle", +"CoC7.PlayerMovesToLocation": "PLayer is moving to the next location", +"CoC7.ObstaclePassed": "You succeesfully found a way.", +"CoC7.GotLucky": "You got lucky, this time...", +"CoC7.ObstacleFail": "You fail.", +"CoC7.ObstacleFumble": "You fail misarably !", +"CoC7.YouLostTime": "You lost time in your attempt.", +"CoC7.MoveToLocation": "You're moving to the next location.", +"CoC7.DontMoveToLocation": "You're staying there !", +"CoC7.ObstacleDamage": "Obstacle damage", +"CoC7.RemoveObstacle": "Destroy Obstacle", +"CoC7.YouTakeNoDamage": "You did not suffer any injury.", +"CoC7.YouTakeSomeDamage": "You take {amount} points of damage.", +"CoC7.TryToNegotiateHazard": "You try to negotiate that hazard.", +"CoC7.TryToGetPastBarriers": "You try to get past that barrier.", +"CoC7.TryToBreak": "You try to break down that barrier.", +"CoC7.DragOnCanvas": "Drag this on canvas to set the position of this location.", +"CoC7.LocationCoordinate": "Location set to : {x}, {y}.\nRight click to clear.\nDrag this on canvas to change the position.", +"CoC7.ConfirmRestartChase": "Do you want to restart the chase ?", +"CoC7.ConfirmRestartChaseHint": "This will restart your chase.\nAll position will be reseted.\nActors that did not rool a speedcheck will have to roll.", +"CoC7.ConfirmResetChase": "Do you want to restet the chase ?", +"CoC7.ConfirmResetChaseHint": "This will reset your chase.All positions and obstacles will be removed.", +"CoC7.IncludeEscapees": "Let fastest fleeing actors participate.", +"CoC7.TooSlow": "Too slow", +"CoC7.TooFast": "Too fast", +"CoC7.DoesNotMeetMinimumReqToBeAdded": "Can not add participant, need at least valid movement action", +"CoC7.IncludeLatecomers": "Let slow pursuer participate.", +"CoC7.VehicleChase": "Chase can include vehicle (NOT IMPLEMENTED)", +"CoC7.StartingRange": "Starting locations advance", +"CoC7.StartingIndex": "Starting index of fleeing actors", +"CoC7.CutToTheChase": "Cut to the chase", +"CoC7.ChaseSetup": "Chase setup", +"CoC7.ParticipantsList": "Participants list", +"CoC7.NotAllHaveSpeedRoll": "Some participants don't have a speed roll!", +"CoC7.NeedMin2Participants": "You need to have a chaser and a prey to start a chase!", +"CoC7.ConfirmCut2Chase": "Are you ready to cut to the chase ?", +"CoC7.ConfirmCut2ChaseHint": "This will start the chase and the first chase round.", +"CoC7.NextRound": "Next round", +"CoC7.ConfirmNextChaseRound": "Proceed to next round ?", +"CoC7.ConfirmNextChaseRoundHint": "You still have action available on some actors. Are you sure you want to proceed ?", +"CoC7.CheckName": "Check", +"CoC7.ObstacleHasHitPoint": "Toggle location's hit points.", +"CoC7.ActionCostOnFail": "Toggle action penalty on fail.", +"CoC7.DamageOnFail": "Toggle damage on fail.", +"CoC7.OpenObstacleResolutionCard": "Start obstacle resolution flow card.", +"CoC7.AddBonusDie": "Add bonus die", +"CoC7.RemoveBonusDie": "Remove bonus die", +"CoC7.DecreaseMovementAction": "Decrease movement action", +"CoC7.IncreaseMovementAction": "Increase movement action", +"CoC7.CautiousApproach": "Take cautious approach", +"CoC7.Cautious": "Cautious", +"CoC7.Assist": "Assist ally", +"CoC7.MoveForward": "Move forward", +"CoC7.MoveBackward": "Go back", +"CoC7.AddActorToChase": "Add an actor to the chase", +"CoC7.ParticipantDropHint": "You can drop and actor on this window or directly on a chase location.", +"CoC7.OverrideCalc": "Override calculation", +"CoC7.NeedRecalculate": "Recalculation needed", +"CoC7.NeedToRecalculate": "All participant will have their movement action recalculated", +"CoC7.SpeedCheck": "Speed check", +"CoC7.Initialize": "Initialize", +"CoC7.Locations": "Chase locations", +"CoC7.NoDamageDealt": "No damage dealt", +"CoC7.DamageDealt": "You deal {value} damage.", +"CoC7.NothingToRoll": "Nothing to roll!", +"CoC7.ParticipantDataMissing": "Participant data missing", +"CoC7.ParticipantNotFound": "Cannot find participant", +"CoC7.ParticipantUuidNotFound": "Cannot find participant {participantUuid}", +"CoC7.ParticipantNotEnoughMovement": "Particpant {assistantUuid} only has {actions} movement actions", +"CoC7.ParticipantAlreadyProcessed": "Participant was already processed.", +"CoC7.ErrorEmptyLocationsList": "Empty locations list", +"CoC7.ErrorBeneficiaryAtMaxBonus": "Beneficiary {name} already has max bonus dice", +"CoC7.ErrorParticipantAtMaxBonus": "{participantUuid} already has max bonus dice", +"CoC7.ErrorTokenNotOnScene": "Token does not belongs to this location's scene", +"CoC7.AddParticipant": "Add Participant", +"CoC7.Remove": "Remove", +"CoC7.Delete": "Delete", +"CoC7.Edit": "Edit", +"CoC7.Create": "Create", +"CoC7.MakeActive": "Make Active", +"CoC7.SelectNewSkill": "Select skill", +"CoC7.AskDamageRoll": "Ask damage roll", +"CoC7.AttemptNegotiateObstacle": "Attempt to negotiate that obstacle", +"CoC7.AttemptBreakDown": "Attempt to break down !!", +"CoC7.ObstacleName": "Obstacle name:", +"CoC7.Actions": "actions:", +"CoC7.Chase.InitiativeShort": "INIT: {value}", +"CoC7.Chase.AdjustedMovementShort": "ADJ. MOV: {value}", +"CoC7.Chase.CheckName": "check name", +"CoC7.Chase.PreysMin": "Preys Min: {value}", +"CoC7.Chase.PreysMax": "Preys Max: {value}", +"CoC7.Chase.ChasersMin": "Chasers Min: {value}", +"CoC7.Chase.ChasersMax": "Chasers Max: {value}", +"CoC7.SpellSuccessfullyLearned": "Spell '{spell}' was learned successfully!", +"CoC7.SpellAlreadyLearned": "Spell named ('{spell}') was already learned.", +"CoC7.BookHasNothingMoreToTeach": "{book} has nothing more to teach. Cthulhu Mythos skill of {actor} is greater than this Mythos Rating.", +"CoC7.Content": "Content", +"CoC7.Development": "Development", +"CoC7.DifficultyLevel": "Difficulty Level", +"CoC7.DragSpell": "Drag spells here to insert them into the book...", +"CoC7.FullStudies": "Full Studies", +"CoC7.Gains": "Gains", +"CoC7.GainsForReading": "Skill gains for reading {book}.", +"CoC7.InitialReading": "Initial Reading", +"CoC7.InitialReadingNeeded": "{actor} needs to perform an Initial Reading on {book} to be able to advance through Full Study progress.", +"CoC7.LearnSpellAttempt": "Attempt to learn spell {spell}, from {book}.", +"CoC7.MarkedForDevelopment": "Marked for development", +"CoC7.Mythos": "Mythos", +"CoC7.NotOwned": "This Item needs to be owned by an Actor to perform this action.", +"CoC7.Points": "point(s)", +"CoC7.Progress": "Progress", +"CoC7.RedoFullStudy": "Redo Full Study", +"CoC7.ReadAttempt": "Attempt to read {book} ({language}), {difficulty} difficulty.", +"CoC7.ReadingMythosTome": "Reading {book}.", +"CoC7.Specific": "Specific", +"CoC7.SpellsLearned": "Spells Learned", +"CoC7.UnknownLanguage": "{actor} do not know the language in which this book is written.", +"CoC7.Unreadable": "Unreadable", +"CoC7.Sane": "Sane", +"CoC7.EmptyCharacterSkillList": "Add a setup, occupation, or skill by dropping it here.", +"CoC7.WarnNoTargetsSanCheck": "You have no targets selected. Either select targets or create a link.", +"CoC7.allActors": "All Actors", +"CoC7.restTargets": "Rest Targets", +"CoC7.ErrorUnableToParseFormula": "{value} is not a valid formula", +"CoC7.ErrorUnableToParseArmorFormula": "Unable to process armor value: {value}. Ignoring armor.", +"CoC7.ErrorUnableToParseSkillFormula": "Unable to parse formula: {value} for skill {name}", +"CoC7.ErrorActorHasNoWeaponNamed": "Actor {actorName} has no weapon named {weaponName}", +"CoC7.ErrorActorHasTooManyWeaponsNamed": "`Actor {actorName} has more than one weapon named {weaponName}. The first found will be used`", +"CoC7.ErrorUnexpectedWeaponText": "Unexpected weapons text, please raise a bug report with the text you are attempting to import", +"CoC7.ErrorUnexpectedSkillsText": "Unexpected skills text, please raise a bug report with the text you are attempting to import", +"CoC7.ErrorNoTokensSelected": "No tokens selected", +"CoC7.ErrorEvaluatingDamage": "Error evaluating damage", +"CoC7.MessageTitleSelectSingleUserForTarget": "Which user can respond to this attack", +"CoC7.MessageSelectSingleUserForTarget": "This token is controlled by multiple users, please select which user can respond to this attack.", +"CoC7.MessageBoutOfMadnessTableNotFound": "The result from the madness table was not found, please check all your roll tables are created", +"CoC7.MessageBoutOfMadnessItemNotFound": "The result from the madness table was not found, please check all your statuses are created", +"CoC7.MessageRollingCharacteristic": "Rolling characteristic {label}: {formula}", +"CoC7.DealDamage": "Deal {damage} damage points to {target}?", +"CoC7.DamageDealTo": "Damage {name} {damage}HP", +"CoC7.NoTargetSelected": "You have not selected a target for your {weapon} check. Do you want to proceed anyway?", +"CoC7.Import": "Import", +"CoC7.Proceed": "Proceed", +"CoC7.Cancel": "Cancel", +"CoC7.Add": "Add", +"CoC7.Update": "Update", +"CoC7.Enable": "Enable", +"CoC7.Disable": "Disable", +"CoC7.Duration": "Duration", +"CoC7.TextFieldInvalidCharacters": "There are invalid characters in the text, please fix them or they will be removed", +"CoC7.TextFieldInvalidJSON": "Unable to parse the JSON, please try again", +"CoC7.ActorImporterUploadError": "Import stopped, unable to write image", +"CoC7.FileUploadError": "Unable to write image, file upload error", +"CoC7.German": "German", +"CoC7.Polish": "Polish", +"CoC7.TraditionalChinese": "Traditional Chinese", +"CoC7.ImportedUnnamedCharacter": "Imported unnamed character", +"CoC7.CreatedImportedCharactersFolder": "Created 'Imported Characters' folder", +"CoC7.ImportedCharactersFolder": "Imported characters", +"CoC7.PickDirectory": "Pick Directory", +"CoC7.ImportSkillItemLocations": "Look for skills/spells/weapons in", +"CoC7.ImportActorItemsNone": "None", +"CoC7.ImportActorItemsItem": "Items", +"CoC7.ImportActorItemsItemWorldModuleSystem": "Items / World / Modules / System", +"CoC7.ImportActorItemsWorldModuleItemSystem": "World / Modules / Items / System", +"CoC7.ActorImported": "New {actorType} imported: {actorName}", +"CoC7.DholeHouseActorImporter": "The Dhole's House Actor Importer JSON", +"CoC7.DholeHouseActorImporterSummary": "Export your DholeHouse's character as JSON and upload it here.", +"CoC7.DholeHouseImportingName": "About to import: ", +"CoC7.DholeHousePickYourJSONFile": "Pick the JSON file exported from The Dhole's House", +"CoC7.DholeHouseActorImporterSource": "Imported from The Dhole's House Actor", +"CoC7.DholeHouseInvalidActor": "The selected JSON doesn't seem to be a valid Dhole's House exported character", +"CoC7.HowToTranslateTitle": "How to translate?", +"CoC7.HowToTranslateWarning": "Do not install any modules you do not trust.", +"CoC7.HowToTranslateInstallBabele": "Install/Update Babele module from Foundry's module manager.", +"CoC7.HowToTranslateInstallTranslation": "Install/Update Translation from Foundry's module manager.", +"CoC7.HowToTranslateEnableTranslation": "Inside the Game World, under Configuration/Manage Modules activate both Babele and the translations.", +"CoC7.HowToTranslateNoTranslation": "Instructions for creating new language translations are available on existing translation modules.", +"CoC7.Migrate.Title": "Update required", +"CoC7.Migrate.Message": "Your world requires an update to run version {version}.
Please backup your world folder before starting the upgrade.
If you do not update your world the system will not work correctly.
The world may be restarted when completed.
", +"CoC7.Migrate.WithModulesMessage": "Your world or modules may require an update to run version {version}.
Please backup your world and module folders listed below before starting the upgrade.
If you do not update your world the system will not work correctly.
The following modules contain actors or items so will also be checked.
{modules}The world may be restarted when completed.
", +"CoC7.Migrate.GMRequired": "Your world requires an update to run version {version}.
Please wait for your GM to update the system then refresh (F5) this page.
", +"CoC7.Migrate.RestartRequired": "Your world will now restart to enable these changes
", +"CoC7.Migrate.ButtonUpdate": "Update", +"CoC7.Migrate.ButtonSkip": "Skip", +"CoC7.Migrate.ButtonOkay": "Okay", +"CoC7.Migrate.TriggerButton": "Trigger Data Migration", +"CoC7.Migrate.TriggerTitle": "Trigger Data Migration", +"CoC7.Migrate.TriggerContents": "Turn on data migration and restart
", +"CoC7.Migrate.TriggerRestart": "Save and restart", +"CoC7.Migrate.UpdateCurrentScene": "Migrating your current scene", +"CoC7.Migrate.Complete": "Finished migrating your data", +"CoC7.Migrate.ErrorDocumentPack": "Failed CoC7 system migration for document {name} in pack {collection}: {message}", +"CoC7.Migrate.ErrorScene": "Failed CoC7 system migration for Scene {name}: {message}", +"CoC7.Migrate.ErrorMacro": "Failed CoC7 system migration for Macro {name}: {message}", +"CoC7.Migrate.ErrorTable": "Failed CoC7 system migration for Table {name}: {message}", +"CoC7.Migrate.ErrorItem": "Failed CoC7 system migration for Item {name}: {message}", +"CoC7.Migrate.ErrorActor": "Failed CoC7 system migration for Actor {name}: {message}", +"CoC7.Settings.CoreRules.Title": "Core Rule Book Optional Rules", +"CoC7.Settings.Rules.Name": "Variant/Optional Rules", +"CoC7.Settings.Rules.Label": "Configure Variant/Optional Rules", +"CoC7.Settings.Rules.Hint": "Configure variant/optional rules like Pulp Cthulhu.", +"CoC7.Settings.HouseRules.Title": "Common House Rules", +"CoC7.Settings.PulpRules.DoubleMaxHealth.Name": "Double maximum health", +"CoC7.Settings.PulpRules.DoubleMaxHealth.Hint": "Maximum health is (CON + SIZ) / 5", +"CoC7.Settings.PulpRules.DevelopmentRollLuck.Name": "Increase Development Rolls For Luck", +"CoC7.Settings.PulpRules.DevelopmentRollLuck.Hint": "Increase luck for failed and successful luck development roll", +"CoC7.Settings.PulpRules.Archetype.Name": "Pulp Archetypes", +"CoC7.Settings.PulpRules.Archetype.Hint": "", +"CoC7.Settings.PulpRules.Organization.Name": "Hero Organization", +"CoC7.Settings.PulpRules.Organization.Hint": "", +"CoC7.Settings.PulpRules.Talents.Name": "Pulp Talents", +"CoC7.Settings.PulpRules.Talents.Hint": "", +"CoC7.Settings.PulpRules.FasterRecovery.Name": "Faster Recovery", +"CoC7.Settings.PulpRules.FasterRecovery.Hint": "Natural healing is increased to two hit points per day", +"CoC7.Settings.PulpRules.IgnoreMajorWounds.Name": "Ignore Major Wounds", +"CoC7.Settings.PulpRules.IgnoreMajorWounds.Hint": "", +"CoC7.Settings.DholeUpload.Directory.Name": "The Dhole's House image upload directory", +"CoC7.Settings.DholeUpload.Directory.Hint": "Upload path for The Dhole's House avatars, relative to the Foundry/Data directory.", +"CoC7.Maximize": "Maximize", +"CoC7.Summarize": "Summarize", +"CoC7.ClearAllConditions": "Clear All Conditions", +"CoC7.UnableToInteractWithChatCard": "You are not able to interact with this message, if you need to make a change please ask your Keeper to select the options for you", +"CoC7.UnableToCopyToClipboard": "Unable to copy to clipboard, this is likely due to your browser security settings.", +"CoC7.UnableToUploadDholeImage": "You do not have permission to upload images, if you import the default avatar will be used.", +"CoC7.MessageTitleSelectUserToGiveTo": "Give item to another character", +"CoC7.MessageSelectUserToGiveTo": "Which character would you like to give this item to?", +"CoC7.MessageDistanceCalculationFailure": "Unable to calculate distance between tokens, please use the token character sheet.", +"CoC7.ToolTipSkill": "This will Clean your skill list by removing specialization from skill name.
This will avoid to display skill as : 'specialization(specialization(skill))'
", +"CoC7.ReduceSanityLimits": "Reduced all sanity limits by one", +"CoC7.WeaponSkillMain": "Main skill", +"CoC7.BackgroundEncounters": "Losses from Strange Entities", +"CoC7.BackgroundFlags": "Flags", +"CoC7.BackgroundFlagsMythosExperienced": "5% Insanity Mythos Awarded", +"CoC7.BackgroundFlagsMythosHardened": "Mythos Hardened", +"CoC7.SanityLossEncounters": "Sanity Loss Encounters", +"CoC7.SanityLossImmunities": "Sanity Loss Immunities", +"CoC7.AddSanityLossEncounter": "Add Sanity Loss Encounter", +"CoC7.AddSanityLossImmunity": "Add Sanity Loss Immunity", +"CoC7.DeleteSanityLossEncounter": "Delete Sanity Loss Encounter", +"CoC7.DeleteSanityLossImmunity": "Delete Sanity Loss Immunity", +"CoC7.SanityLossTypeDialogTitle": "New sanity loss or immunity", +"CoC7.SanityLossTypeDialogBody": "Add a new Mythos Encounter, Sanity Loss, or Sanity Immunity to the character.", +"CoC7.SanityLossTypeReason": "Reason", +"CoC7.SanityLossTypeValue": "Sanity points lost", +"CoC7.SanityLossEncounter": "Sanity loss encounter", +"CoC7.SanityLossImmunity": "Sanity loss immunity", +"CoC7.AlreadyEncountered": "Already encountered", +"CoC7.AlreadyEncounteredInformation": "Already encountered: {reason} lost {lost}/{max}", +"CoC7.MaxPossibleSanLoss": "Max Possible loss", +"CoC7.InsertLocation": "Insert location", +"CoC7.RemoveLocation": "Remove location", +"CoC7.LocationNotEmpty": "You can't remove a location with an actor", +"CoC7.LocationInit": "You can't remove a starting location", +"CoC7.SomethingInTheWay": "There is something in the way", +"CoC7.FacingObstacle": "You are facing {type}.", +"CoC7.ABarrier": "a barrier", +"CoC7.Barrier": "Barrier", +"CoC7.AHazard": "a hazard", +"CoC7.Hazard": "Hazard", +"CoC7.Obstacle": "Something in the way", +"CoC7.ConsumeBonusDice": "Consume Bonus Dice", +"CoC7.Breakable": "Breakable", +"CoC7.NoValidCheck": "No valid check", +"CoC7.NoValidSkill": "Fake skill", +"CoC7.AskIntentions": "What are your intentions ?", +"CoC7.WaitForPlayerInput": "Wait for player's input", +"CoC7.AskRoll": "Roll {name} ({value}%)", +"CoC7.ActionCost": "Action cost", +"CoC7.Negotiate": "Negotiate", +"CoC7.BreakDown": "Break Down", +"CoC7.BeingCautious": "You elect to take a cautious approach.", +"CoC7.BeingVeryCautious": "You are being very cautious.", +"CoC7.ReflectObstacleChanges": "Reflect changes to obstacle", +"CoC7.PlayerMovesToLocation": "PLayer is moving to the next location", +"CoC7.ObstaclePassed": "You succeesfully found a way.", +"CoC7.GotLucky": "You got lucky, this time...", +"CoC7.ObstacleFail": "You fail.", +"CoC7.ObstacleFumble": "You fail misarably !", +"CoC7.YouLostTime": "You lost time in your attempt.", +"CoC7.MoveToLocation": "You're moving to the next location.", +"CoC7.DontMoveToLocation": "You're staying there !", +"CoC7.ObstacleDamage": "Obstacle damage", +"CoC7.RemoveObstacle": "Destroy Obstacle", +"CoC7.YouTakeNoDamage": "You did not suffer any injury.", +"CoC7.YouTakeSomeDamage": "You take {amount} points of damage.", +"CoC7.TryToNegotiateHazard": "You try to negotiate that hazard.", +"CoC7.TryToGetPastBarriers": "You try to get past that barrier.", +"CoC7.TryToBreak": "You try to break down that barrier.", +"CoC7.DragOnCanvas": "Drag this on canvas to set the position of this location.", +"CoC7.LocationCoordinate": "Location set to : {x}, {y}.\nRight click to clear.\nDrag this on canvas to change the position.", +"CoC7.ConfirmRestartChase": "Do you want to restart the chase ?", +"CoC7.ConfirmRestartChaseHint": "This will restart your chase.\nAll position will be reseted.\nActors that did not rool a speedcheck will have to roll.", +"CoC7.ConfirmResetChase": "Do you want to restet the chase ?", +"CoC7.ConfirmResetChaseHint": "This will reset your chase.All positions and obstacles will be removed.", +"CoC7.IncludeEscapees": "Let fastest fleeing actors participate.", +"CoC7.TooSlow": "Too slow", +"CoC7.TooFast": "Too fast", +"CoC7.DoesNotMeetMinimumReqToBeAdded": "Can not add participant, need at least valid movement action", +"CoC7.IncludeLatecomers": "Let slow pursuer participate.", +"CoC7.VehicleChase": "Chase can include vehicle (NOT IMPLEMENTED)", +"CoC7.StartingRange": "Starting locations advance", +"CoC7.StartingIndex": "Starting index of fleeing actors", +"CoC7.CutToTheChase": "Cut to the chase", +"CoC7.ChaseSetup": "Chase setup", +"CoC7.ParticipantsList": "Participants list", +"CoC7.NotAllHaveSpeedRoll": "Some participants don't have a speed roll!", +"CoC7.NeedMin2Participants": "You need to have a chaser and a prey to start a chase!", +"CoC7.ConfirmCut2Chase": "Are you ready to cut to the chase ?", +"CoC7.ConfirmCut2ChaseHint": "This will start the chase and the first chase round.", +"CoC7.NextRound": "Next round", +"CoC7.ConfirmNextChaseRound": "Proceed to next round ?", +"CoC7.ConfirmNextChaseRoundHint": "You still have action available on some actors. Are you sure you want to proceed ?", +"CoC7.CheckName": "Check", +"CoC7.ObstacleHasHitPoint": "Toggle location's hit points.", +"CoC7.ActionCostOnFail": "Toggle action penalty on fail.", +"CoC7.DamageOnFail": "Toggle damage on fail.", +"CoC7.OpenObstacleResolutionCard": "Start obstacle resolution flow card.", +"CoC7.AddBonusDie": "Add bonus die", +"CoC7.RemoveBonusDie": "Remove bonus die", +"CoC7.DecreaseMovementAction": "Decrease movement action", +"CoC7.IncreaseMovementAction": "Increase movement action", +"CoC7.CautiousApproach": "Take cautious approach", +"CoC7.Cautious": "Cautious", +"CoC7.Assist": "Assist ally", +"CoC7.MoveForward": "Move forward", +"CoC7.MoveBackward": "Go back", +"CoC7.AddActorToChase": "Add an actor to the chase", +"CoC7.ParticipantDropHint": "You can drop and actor on this window or directly on a chase location.", +"CoC7.OverrideCalc": "Override calculation", +"CoC7.NeedRecalculate": "Recalculation needed", +"CoC7.NeedToRecalculate": "All participant will have their movement action recalculated", +"CoC7.SpeedCheck": "Speed check", +"CoC7.Initialize": "Initialize", +"CoC7.Locations": "Chase locations", +"CoC7.NoDamageDealt": "No damage dealt", +"CoC7.DamageDealt": "You deal {value} damage.", +"CoC7.NothingToRoll": "Nothing to roll!", +"CoC7.ParticipantDataMissing": "Participant data missing", +"CoC7.ParticipantNotFound": "Cannot find participant", +"CoC7.ParticipantUuidNotFound": "Cannot find participant {participantUuid}", +"CoC7.ParticipantNotEnoughMovement": "Particpant {assistantUuid} only has {actions} movement actions", +"CoC7.ParticipantAlreadyProcessed": "Participant was already processed.", +"CoC7.ErrorEmptyLocationsList": "Empty locations list", +"CoC7.ErrorBeneficiaryAtMaxBonus": "Beneficiary {name} already has max bonus dice", +"CoC7.ErrorParticipantAtMaxBonus": "{participantUuid} already has max bonus dice", +"CoC7.ErrorTokenNotOnScene": "Token does not belongs to this location's scene", +"CoC7.AddParticipant": "Add Participant", +"CoC7.Remove": "Remove", +"CoC7.Delete": "Delete", +"CoC7.Edit": "Edit", +"CoC7.Create": "Create", +"CoC7.MakeActive": "Make Active", +"CoC7.SelectNewSkill": "Select skill", +"CoC7.AskDamageRoll": "Ask damage roll", +"CoC7.AttemptNegotiateObstacle": "Attempt to negotiate that obstacle", +"CoC7.AttemptBreakDown": "Attempt to break down !!", +"CoC7.ObstacleName": "Obstacle name:", +"CoC7.Actions": "actions:", +"CoC7.Chase.InitiativeShort": "INIT: {value}", +"CoC7.Chase.AdjustedMovementShort": "ADJ. MOV: {value}", +"CoC7.Chase.CheckName": "check name", +"CoC7.Chase.PreysMin": "Preys Min: {value}", +"CoC7.Chase.PreysMax": "Preys Max: {value}", +"CoC7.Chase.ChasersMin": "Chasers Min: {value}", +"CoC7.Chase.ChasersMax": "Chasers Max: {value}", +"CoC7.Sane": "Sane", +"CoC7.WarnNoTargetsSanCheck": "You have no targets selected. Either select targets or create a link.", +"CoC7.allActors": "All Actors", +"CoC7.restTargets": "Rest Targets", +"CoC7.ErrorUnableToParseFormula": "{value} is not a valid formula", +"CoC7.ErrorUnableToParseArmorFormula": "Unable to process armor value: {value}. Ignoring armor.", +"CoC7.ErrorUnableToParseSkillFormula": "Unable to parse formula: {value} for skill {name}", +"CoC7.ErrorActorHasNoWeaponNamed": "Actor {actorName} has no weapon named {weaponName}", +"CoC7.ErrorActorHasTooManyWeaponsNamed": "`Actor {actorName} has more than one weapon named {weaponName}. The first found will be used`", +"CoC7.ErrorUnexpectedWeaponText": "Unexpected weapons text, please raise a bug report with the text you are attempting to import", +"CoC7.ErrorUnexpectedSkillsText": "Unexpected skills text, please raise a bug report with the text you are attempting to import", +"CoC7.ErrorNoTokensSelected": "No tokens selected", +"CoC7.ErrorEvaluatingDamage": "Error evaluating damage", +"CoC7.MessageRollingCharacteristic": "Rolling characteristic {label}: {formula}", +"CoC7.DamageDealTo": "Damage {name} {damage}HP", +"CoC7.Add": "Add", +"CoC7.Update": "Update", +"CoC7.Enable": "Enable", +"CoC7.Disable": "Disable", +"CoC7.Duration": "Duration", +"CoC7.TextFieldInvalidJSON": "Unable to parse the JSON, please try again", +"CoC7.ActorImporterUploadError": "Import stopped, unable to write image", +"CoC7.FileUploadError": "Unable to write image, file upload error", +"CoC7.Polish": "Polish", +"CoC7.PickDirectory": "Pick Directory", +"CoC7.ActorImported": "New {actorType} imported: {actorName}", +"CoC7.DholeHouseActorImporter": "The Dhole's House Actor Importer JSON", +"CoC7.DholeHouseActorImporterSummary": "Export your DholeHouse's character as JSON and upload it here.", +"CoC7.DholeHouseImportingName": "About to import: ", +"CoC7.DholeHousePickYourJSONFile": "Pick the JSON file exported from The Dhole's House", +"CoC7.DholeHouseActorImporterSource": "Imported from The Dhole's House Actor", +"CoC7.DholeHouseInvalidActor": "The selected JSON doesn't seem to be a valid Dhole's House exported character", +"CoC7.Migrate.TriggerButton": "Trigger Data Migration", +"CoC7.Migrate.TriggerTitle": "Trigger Data Migration", +"CoC7.Migrate.TriggerContents": "Turn on data migration and restart
", +"CoC7.Migrate.TriggerRestart": "Save and restart", +"CoC7.Migrate.UpdateCurrentScene": "Migrating your current scene", +"CoC7.Migrate.Complete": "Finished migrating your data", +"CoC7.Migrate.ErrorDocumentPack": "Failed CoC7 system migration for document {name} in pack {collection}: {message}", +"CoC7.Migrate.ErrorScene": "Failed CoC7 system migration for Scene {name}: {message}", +"CoC7.Migrate.ErrorMacro": "Failed CoC7 system migration for Macro {name}: {message}", +"CoC7.Migrate.ErrorTable": "Failed CoC7 system migration for Table {name}: {message}", +"CoC7.Migrate.ErrorItem": "Failed CoC7 system migration for Item {name}: {message}", +"CoC7.Migrate.ErrorActor": "Failed CoC7 system migration for Actor {name}: {message}", +"CoC7.Settings.CoreRules.Title": "Core Rule Book Optional Rules", +"CoC7.Settings.Rules.Name": "Variant/Optional Rules", +"CoC7.Settings.Rules.Label": "Configure Variant/Optional Rules", +"CoC7.Settings.Rules.Hint": "Configure variant/optional rules like Pulp Cthulhu.", +"CoC7.Settings.HouseRules.Title": "Common House Rules", +"CoC7.Settings.PulpRules.DoubleMaxHealth.Name": "Double maximum health", +"CoC7.Settings.PulpRules.DoubleMaxHealth.Hint": "Maximum health is (CON + SIZ) / 5", +"CoC7.Settings.PulpRules.DevelopmentRollLuck.Name": "Increase Development Rolls For Luck", +"CoC7.Settings.PulpRules.DevelopmentRollLuck.Hint": "Increase luck for failed and successful luck development roll", +"CoC7.Settings.PulpRules.Archetype.Name": "Pulp Archetypes", +"CoC7.Settings.PulpRules.Archetype.Hint": "", +"CoC7.Settings.PulpRules.Organization.Name": "Hero Organization", +"CoC7.Settings.PulpRules.Organization.Hint": "", +"CoC7.Settings.PulpRules.Talents.Name": "Pulp Talents", +"CoC7.Settings.PulpRules.Talents.Hint": "", +"CoC7.Settings.PulpRules.FasterRecovery.Name": "Faster Recovery", +"CoC7.Settings.PulpRules.FasterRecovery.Hint": "Natural healing is increased to two hit points per day", +"CoC7.Settings.PulpRules.IgnoreMajorWounds.Name": "Ignore Major Wounds", +"CoC7.Settings.PulpRules.IgnoreMajorWounds.Hint": "", +"CoC7.Settings.DholeUpload.Directory.Name": "The Dhole's House image upload directory", +"CoC7.Settings.DholeUpload.Directory.Hint": "Upload path for The Dhole's House avatars, relative to the Foundry/Data directory.", +"CoC7.ClearAllConditions": "Clear All Conditions", +"CoC7.UnableToUploadDholeImage": "You do not have permission to upload images, if you import the default avatar will be used.", +"CoC7.ToolTipSanity": "This will Clean your skill list by removing specialization from skill name.
This will avoid to display skill as : 'specialization(specialization(skill))'
", +"CoC7.WeaponSkillMain": "Main skill", +"CoC7.AlreadyEncountered": "Already encountered", +"CoC7.AlreadyEncounteredInformation": "Already encountered: {reason} lost {lost}/{max}", +"CoC7.MaxPossibleSanLoss": "Max Possible loss", +"CoC7.InsertLocation": "Insert location", +"CoC7.RemoveLocation": "Remove location", +"CoC7.LocationNotEmpty": "You can't remove a location with an actor", +"CoC7.LocationInit": "You can't remove a starting location", +"CoC7.SomethingInTheWay": "There is something in the way", +"CoC7.FacingObstacle": "You are facing {type}.", +"CoC7.ABarrier": "a barrier", +"CoC7.Barrier": "Barrier", +"CoC7.AHazard": "a hazard", +"CoC7.Hazard": "Hazard", +"CoC7.Obstacle": "Something in the way", +"CoC7.ConsumeBonusDice": "Consume Bonus Dice", +"CoC7.Breakable": "Breakable", +"CoC7.NoValidCheck": "No valid check", +"CoC7.NoValidSkill": "Fake skill", +"CoC7.AskIntentions": "What are your intentions ?", +"CoC7.WaitForPlayerInput": "Wait for player's input", +"CoC7.AskRoll": "Roll {name} ({value}%)", +"CoC7.ActionCost": "Action cost", +"CoC7.Negotiate": "Negotiate", +"CoC7.BreakDown": "Break Down", +"CoC7.BeingCautious": "You elect to take a cautious approach.", +"CoC7.BeingVeryCautious": "You are being very cautious.", +"CoC7.ReflectObstacleChanges": "Reflect changes to obstacle", +"CoC7.PlayerMovesToLocation": "PLayer is moving to the next location", +"CoC7.ObstaclePassed": "You succeesfully found a way.", +"CoC7.GotLucky": "You got lucky, this time...", +"CoC7.ObstacleFail": "You fail.", +"CoC7.ObstacleFumble": "You fail misarably !", +"CoC7.YouLostTime": "You lost time in your attempt.", +"CoC7.MoveToLocation": "You're moving to the next location.", +"CoC7.DontMoveToLocation": "You're staying there !", +"CoC7.ObstacleDamage": "Obstacle damage", +"CoC7.RemoveObstacle": "Destroy Obstacle", +"CoC7.YouTakeNoDamage": "You did not suffer any injury.", +"CoC7.YouTakeSomeDamage": "You take {amount} points of damage.", +"CoC7.TryToNegotiateHazard": "You try to negotiate that hazard.", +"CoC7.TryToGetPastBarriers": "You try to get past that barrier.", +"CoC7.TryToBreak": "You try to break down that barrier.", +"CoC7.DragOnCanvas": "Drag this on canvas to set the position of this location.", +"CoC7.LocationCoordinate": "Location set to : {x}, {y}.\nRight click to clear.\nDrag this on canvas to change the position.", +"CoC7.ConfirmRestartChase": "Do you want to restart the chase ?", +"CoC7.ConfirmRestartChaseHint": "This will restart your chase.\nAll position will be reseted.\nActors that did not rool a speedcheck will have to roll.", +"CoC7.ConfirmResetChase": "Do you want to restet the chase ?", +"CoC7.ConfirmResetChaseHint": "This will reset your chase.All positions and obstacles will be removed.", +"CoC7.IncludeEscapees": "Let fastest fleeing actors participate.", +"CoC7.TooSlow": "Too slow", +"CoC7.TooFast": "Too fast", +"CoC7.DoesNotMeetMinimumReqToBeAdded": "Can not add participant, need at least valid movement action", +"CoC7.IncludeLatecomers": "Let slow pursuer participate.", +"CoC7.VehicleChase": "Chase can include vehicle (NOT IMPLEMENTED)", +"CoC7.StartingRange": "Starting locations advance", +"CoC7.StartingIndex": "Starting index of fleeing actors", +"CoC7.CutToTheChase": "Cut to the chase", +"CoC7.ChaseSetup": "Chase setup", +"CoC7.ParticipantsList": "Participants list", +"CoC7.NotAllHaveSpeedRoll": "Some participants don't have a speed roll!", +"CoC7.NeedMin2Participants": "You need to have a chaser and a prey to start a chase!", +"CoC7.ConfirmCut2Chase": "Are you ready to cut to the chase ?", +"CoC7.ConfirmCut2ChaseHint": "This will start the chase and the first chase round.", +"CoC7.NextRound": "Next round", +"CoC7.ConfirmNextChaseRound": "Proceed to next round ?", +"CoC7.ConfirmNextChaseRoundHint": "You still have action available on some actors. Are you sure you want to proceed ?", +"CoC7.CheckName": "Check", +"CoC7.ObstacleHasHitPoint": "Toggle location's hit points.", +"CoC7.ActionCostOnFail": "Toggle action penalty on fail.", +"CoC7.DamageOnFail": "Toggle damage on fail.", +"CoC7.OpenObstacleResolutionCard": "Start obstacle resolution flow card.", +"CoC7.AddBonusDie": "Add bonus die", +"CoC7.RemoveBonusDie": "Remove bonus die", +"CoC7.DecreaseMovementAction": "Decrease movement action", +"CoC7.IncreaseMovementAction": "Increase movement action", +"CoC7.CautiousApproach": "Take cautious approach", +"CoC7.Cautious": "Cautious", +"CoC7.Assist": "Assist ally", +"CoC7.MoveForward": "Move forward", +"CoC7.MoveBackward": "Go back", +"CoC7.AddActorToChase": "Add an actor to the chase", +"CoC7.ParticipantDropHint": "You can drop and actor on this window or directly on a chase location.", +"CoC7.OverrideCalc": "Override calculation", +"CoC7.NeedRecalculate": "Recalculation needed", +"CoC7.NeedToRecalculate": "All participant will have their movement action recalculated", +"CoC7.SpeedCheck": "Speed check", +"CoC7.Initialize": "Initialize", +"CoC7.Locations": "Chase locations", +"CoC7.NoDamageDealt": "No damage dealt", +"CoC7.DamageDealt": "You deal {value} damage.", +"CoC7.NothingToRoll": "Nothing to roll!", +"CoC7.ParticipantDataMissing": "Participant data missing", +"CoC7.ParticipantNotFound": "Cannot find participant", +"CoC7.ParticipantUuidNotFound": "Cannot find participant {participantUuid}", +"CoC7.ParticipantNotEnoughMovement": "Particpant {assistantUuid} only has {actions} movement actions", +"CoC7.ParticipantAlreadyProcessed": "Participant was already processed.", +"CoC7.ErrorEmptyLocationsList": "Empty locations list", +"CoC7.ErrorBeneficiaryAtMaxBonus": "Beneficiary {name} already has max bonus dice", +"CoC7.ErrorParticipantAtMaxBonus": "{participantUuid} already has max bonus dice", +"CoC7.ErrorTokenNotOnScene": "Token does not belongs to this location's scene", +"CoC7.AddParticipant": "Add Participant", +"CoC7.Remove": "Remove", +"CoC7.Delete": "Delete", +"CoC7.Edit": "Edit", +"CoC7.Create": "Create", +"CoC7.MakeActive": "Make Active", +"CoC7.SelectNewSkill": "Select skill", +"CoC7.AskDamageRoll": "Ask damage roll", +"CoC7.AttemptNegotiateObstacle": "Attempt to negotiate that obstacle", +"CoC7.AttemptBreakDown": "Attempt to break down !!", +"CoC7.ObstacleName": "Obstacle name:", +"CoC7.Actions": "actions:", +"CoC7.Chase.InitiativeShort": "INIT: {value}", +"CoC7.Chase.AdjustedMovementShort": "ADJ. MOV: {value}", +"CoC7.Chase.CheckName": "check name", +"CoC7.Chase.PreysMin": "Preys Min: {value}", +"CoC7.Chase.PreysMax": "Preys Max: {value}", +"CoC7.Chase.ChasersMin": "Chasers Min: {value}", +"CoC7.Chase.ChasersMax": "Chasers Max: {value}", +"CoC7.Sane": "Sane", +"CoC7.ErrorUnableToParseFormula": "{value} is not a valid formula", +"CoC7.ErrorUnableToParseArmorFormula": "Unable to process armor value: {value}. Ignoring armor.", +"CoC7.ErrorUnableToParseSkillFormula": "Unable to parse formula: {value} for skill {name}", +"CoC7.ErrorActorHasNoWeaponNamed": "Actor {actorName} has no weapon named {weaponName}", +"CoC7.ErrorActorHasTooManyWeaponsNamed": "`Actor {actorName} has more than one weapon named {weaponName}. The first found will be used`", +"CoC7.ErrorUnexpectedWeaponText": "Unexpected weapons text, please raise a bug report with the text you are attempting to import", +"CoC7.ErrorUnexpectedSkillsText": "Unexpected skills text, please raise a bug report with the text you are attempting to import", +"CoC7.ErrorNoTokensSelected": "No tokens selected", +"CoC7.ErrorEvaluatingDamage": "Error evaluating damage", +"CoC7.MessageRollingCharacteristic": "Rolling characteristic {label}: {formula}", +"CoC7.DamageDealTo": "Damage {name} {damage}HP", +"CoC7.Add": "Add", +"CoC7.Update": "Update", +"CoC7.Enable": "Enable", +"CoC7.Disable": "Disable", +"CoC7.Duration": "Duration", +"CoC7.TextFieldInvalidJSON": "Unable to parse the JSON, please try again", +"CoC7.ActorImporterUploadError": "Import stopped, unable to write image", +"CoC7.FileUploadError": "Unable to write image, file upload error", +"CoC7.PickDirectory": "Pick Directory", +"CoC7.ActorImported": "New {actorType} imported: {actorName}", +"CoC7.DholeHouseActorImporter": "The Dhole's House Actor Importer JSON", +"CoC7.DholeHouseActorImporterSummary": "Export your DholeHouse's character as JSON and upload it here.", +"CoC7.DholeHouseImportingName": "About to import: ", +"CoC7.DholeHousePickYourJSONFile": "Pick the JSON file exported from The Dhole's House", +"CoC7.DholeHouseActorImporterSource": "Imported from The Dhole's House Actor", +"CoC7.DholeHouseInvalidActor": "The selected JSON doesn't seem to be a valid Dhole's House exported character", +"CoC7.Migrate.UpdateCurrentScene": "Migrating your current scene", +"CoC7.Migrate.ErrorDocumentPack": "Failed CoC7 system migration for document {name} in pack {collection}: {message}", +"CoC7.Migrate.ErrorScene": "Failed CoC7 system migration for Scene {name}: {message}", +"CoC7.Migrate.ErrorMacro": "Failed CoC7 system migration for Macro {name}: {message}", +"CoC7.Migrate.ErrorTable": "Failed CoC7 system migration for Table {name}: {message}", +"CoC7.Migrate.ErrorItem": "Failed CoC7 system migration for Item {name}: {message}", +"CoC7.Migrate.ErrorActor": "Failed CoC7 system migration for Actor {name}: {message}", +"CoC7.Settings.DholeUpload.Directory.Name": "The Dhole's House image upload directory", +"CoC7.Settings.DholeUpload.Directory.Hint": "Upload path for The Dhole's House avatars, relative to the Foundry/Data directory.", +"CoC7.ClearAllConditions": "Clear All Conditions", +"CoC7.UnableToUploadDholeImage": "You do not have permission to upload images, if you import the default avatar will be used.", +"CoC7.ToolTipSanity": "Your world requires an update to run version {version}.
Please wait for your GM to update the system then refresh (F5) this page.
",` - -##### CoC7.Migrate.Message - -`"CoC7.Migrate.Message": "Your world requires an update to run version {version}.
Please backup your world folder before starting the upgrade.
If you do not update your world the system will not work correctly.
The world may be restarted when completed.
",` - -##### CoC7.Migrate.RestartRequired - -`"CoC7.Migrate.RestartRequired": "Your world will now restart to enable these changes
",` - -##### CoC7.Migrate.Title - -`"CoC7.Migrate.Title": "Update required",` - -##### CoC7.MinSanloss - -`"CoC7.MinSanloss": "Min loss",` - -##### CoC7.Modifiers - -`"CoC7.Modifiers": "Modifiers",` - -##### CoC7.Mythos - -`"CoC7.Mythos": "Mythos",` - -##### CoC7.MythosAlreadyEncountered - -`"CoC7.MythosAlreadyEncountered": "Award Mythos Experience (+1%)",` - -##### CoC7.MythosFirstEncounter - -`"CoC7.MythosFirstEncounter": "Award Mythos Experience (+5% First time)",` - -##### CoC7.MythosGain - -`"CoC7.MythosGain": "Mythos gain",` - -##### CoC7.NoConvert - -`"CoC7.NoConvert": "No Convert",` - -##### CoC7.NoTargetSelected - -`"CoC7.NoTargetSelected": "You have not selected a target for your {weapon} check. Do you want to proceed anyway?",` - -##### CoC7.NoTargetToDamage - -`"CoC7.NoTargetToDamage": "There is no target to apply the damage to",` - -##### CoC7.NonPlayingCharacter - -`"CoC7.NonPlayingCharacter": "Non Playing Character (NPC)",` - -##### CoC7.NotInsane - -`"CoC7.NotInsane": "None",` - -##### CoC7.NotOwned - -`"CoC7.NotOwned": "This Book needs to be owned by an Actor to perform this action.",` - -##### CoC7.OpposedRollCard - -`"CoC7.OpposedRollCard": "Opposed roll card",` - -##### CoC7.Origin - -`"CoC7.Origin": "Origin",` - -##### CoC7.OutOfAmmo - -`"CoC7.OutOfAmmo": "Out of Ammo",` - -##### CoC7.OutOfShots - -`"CoC7.OutOfShots": "Out of shots",` - -##### CoC7.PasteTheDataBelow - -`"CoC7.PasteTheDataBelow": "Paste the raw text data below",` - -##### CoC7.Phobia - -`"CoC7.Phobia": "Phobia",` - -##### CoC7.PhobiaGained - -`"CoC7.PhobiaGained": "You gain a phobia",` - -##### CoC7.PilotSpecializationName - -`"CoC7.PilotSpecializationName": "Pilot",` - -##### CoC7.PlayerName - -`"CoC7.PlayerName": "Player",` - -##### CoC7.PlayerPermanentlyInsane - -`"CoC7.PlayerPermanentlyInsane": "Player Permanently Insane",` - -##### CoC7.Points - -`"CoC7.Points": "point(s)",` - -##### CoC7.Proceed - -`"CoC7.Proceed": "Proceed",` - -##### CoC7.Progress - -`"CoC7.Progress": "Progress",` - -##### CoC7.Properties - -`"CoC7.Properties": "Properties",` - -##### CoC7.PushingSkill - -`"CoC7.PushingSkill": ": pushing skill!",` - -##### CoC7.ReadAttempt - -`"CoC7.ReadAttempt": "Attempt to read {book} ({language}), {difficulty} difficulty.",` - -##### CoC7.ReadingMythosTome - -`"CoC7.ReadingMythosTome": "Reading {book}.",` - -##### CoC7.RecoverLuckPoints - -`"CoC7.RecoverLuckPoints": "Recover Luck Points",` - -##### CoC7.RedoFullStudy - -`"CoC7.RedoFullStudy": "Redo Full Study",` - -##### CoC7.Reload - -`"CoC7.Reload": "Left/Right click : add/remove 1 bullet\nShift + Left/Right click : Reload/Empty",` - -##### CoC7.RememberEverything - -`"CoC7.RememberEverything": "You remember EVERYTHING.",` - -##### CoC7.ResetCreatureSan - -`"CoC7.ResetCreatureSan": "Reset creature's history",` - -##### CoC7.ResetSpecieSan - -`"CoC7.ResetSpecieSan": "Reset specie's history",` - -##### CoC7.RevealSanLoss - -`"CoC7.RevealSanLoss": "Reveal SAN loss",` - -##### CoC7.RollLuck4Dev - -`"CoC7.RollLuck4Dev": "Rolling Luck for development",` - -##### CoC7.RollSecretDice - -`"CoC7.RollSecretDice": "Keeper privately rolled some dice",` - -##### CoC7.RollThreshold - -`"CoC7.RollThreshold": "Roll threshold",` - -##### CoC7.SanDataSelectionWindow - -`"CoC7.SanDataSelectionWindow": "Select SAN losses",` - -##### CoC7.SanGained - -`"CoC7.SanGained": "Gained 2d6 ({results} = {sanGained}) Sanity after mastering {skill} with a {skillValue}%",` - -##### CoC7.SanityCheckPerformed - -`"CoC7.SanityCheckPerformed": "You were exposed to a traumatic event.",` - -##### CoC7.SanityLost - -`"CoC7.SanityLost": "Sanity points lost",` - -##### CoC7.SelectActorType - -`"CoC7.SelectActorType": "Select actor type",` - -##### CoC7.SelectSourceLanguage - -`"CoC7.SelectSourceLanguage": "Select the source text language",` - -##### CoC7.SendToChat - -`"CoC7.SendToChat": "Send to chat",` - -##### CoC7.ShotBullets - -`"CoC7.ShotBullets": "Shot {bullets} bullets at target {actor}.",` - -##### CoC7.ShotIsImpossible - -`"CoC7.ShotIsImpossible": "Shot is impossible",` - -##### CoC7.ShotVoley - -`"CoC7.ShotVoley": "Shooting a voley of {bullets} bullets at target {actor}.",` - -##### CoC7.Spanish - -`"CoC7.Spanish": "Spanish",` - -##### CoC7.Specific - -`"CoC7.Specific": "Specific",` - -##### CoC7.SpecificLocations - -`"CoC7.SpecificLocations": "Specific locations",` - -##### CoC7.SpellsLearned - -`"CoC7.SpellsLearned": "Spells Learned",` - -##### CoC7.Status - -`"CoC7.Status": "Status",` - -##### CoC7.Success - -`"CoC7.Success": "Success",` - -##### CoC7.Target - -`"CoC7.Target": "Target",` - -##### CoC7.TargetOutOfRange - -`"CoC7.TargetOutOfRange": "Target out of range",` - -##### CoC7.TemporaryInsane - -`"CoC7.TemporaryInsane": "You become temporary insane.",` - -##### CoC7.Tie - -`"CoC7.Tie": "Tie",` - -##### CoC7.TotalDamage - -`"CoC7.TotalDamage": "Total damage",` - -##### CoC7.UnderlyingInsanity - -`"CoC7.UnderlyingInsanity": "Underlying insanity",` - -##### CoC7.UnknownLanguage - -`"CoC7.UnknownLanguage": "{actor} do not know the language in which this book is written.",` - -##### CoC7.Unreadable - -`"CoC7.Unreadable": "Unreadable",` - -##### CoC7.Vehicle - -`"CoC7.Vehicle": "Vehicle",` - -##### CoC7.WeaponUsesPerRoundHint - -`"CoC7.WeaponUsesPerRoundHint": "Attacks per round (1/3 : 1 attack every 3 rounds)",` - -##### CoC7.WhisperTo - -`"CoC7.WhisperTo": "Whisper to",` - -##### CoC7.WhisperToSelection - -`"CoC7.WhisperToSelection": "Whisper to selected tokens",` - -##### CoC7.XPGainDisabled - -`"CoC7.XPGainDisabled": "Character cannot gain XP",` - -##### CoC7.XPGainEnabled - -`"CoC7.XPGainEnabled": "Character can gain XP",` - -##### CoC7.YouGainedCthulhuMythos - -`"CoC7.YouGainedCthulhuMythos": "Your mind quail before the unearthly manifestation (+{value}% Cthulhu Mythos)",` - -##### CoC7.combatCard.surprised - -`"CoC7.combatCard.surprised": "Surprised",` - -##### CoC7.dailySanLossRestarted - -`"CoC7.dailySanLossRestarted": "Daily Sanity loss counter restarted",` - -##### CoC7.dreaming - -`"CoC7.dreaming": "The Investigators wait dreaming",` - -##### CoC7.hasCriticalWounds - -`"CoC7.hasCriticalWounds": "Unable to recover Hit Points due to Critical Wounds",` - -##### CoC7.healthRecovered - -`"CoC7.healthRecovered": "Recovered one Hit Point",` - -##### CoC7.hours - -`"CoC7.hours": "hour(s)",` - -##### CoC7.magicPointsRecovered - -`"CoC7.magicPointsRecovered": "Magic Points recovered",` - -##### CoC7.meleeCombatDamageDeals - -`"CoC7.meleeCombatDamageDeals": "deals",` - -##### CoC7.meleeCombatDamageFrom - -`"CoC7.meleeCombatDamageFrom": "from",` - -##### CoC7.meleeCombatDamageTakes - -`"CoC7.meleeCombatDamageTakes": "takes",` - -##### CoC7.meleeCombatDamageWith - -`"CoC7.meleeCombatDamageWith": "with",` - -##### CoC7.pulpHealthRecovered - -`"CoC7.pulpHealthRecovered": "Recovered {number} Hit Points",` - -##### CoC7.quickHealer - -`"CoC7.quickHealer": "Quick Healer",` - -##### CoC7.rangeCombatCard.AimingTitle - -`"CoC7.rangeCombatCard.AimingTitle": "Add 1 bonus die for the first shot",` - -##### CoC7.rangeCombatCard.BigTargetTitle - -`"CoC7.rangeCombatCard.BigTargetTitle": "1 bonus die for big target (Build > 4)",` - -##### CoC7.rangeCombatCard.CoverTitle - -`"CoC7.rangeCombatCard.CoverTitle": "1 penalty die. The target is under cover or successfully dived for cover",` - -##### CoC7.rangeCombatCard.FastMovingTargetTitle - -`"CoC7.rangeCombatCard.FastMovingTargetTitle": "1 penalty die. Target is fast (MOV 8+) and moving at full speed",` - -##### CoC7.rangeCombatCard.InMeleeTitle - -`"CoC7.rangeCombatCard.InMeleeTitle": "1 penalty die. Target is engaged in melee combat",` - -##### CoC7.rangeCombatCard.NormalTarget - -`"CoC7.rangeCombatCard.NormalTarget": "Normal Target",` - -##### CoC7.rangeCombatCard.NormalTargetTitle - -`"CoC7.rangeCombatCard.NormalTargetTitle": "Target has a normal size, no bonus/penalty",` - -##### CoC7.rangeCombatCard.PointBlankRangeTitle - -`"CoC7.rangeCombatCard.PointBlankRangeTitle": "1 bonus die. Target at point blank range",` - -##### CoC7.rangeCombatCard.SmallTargetTitle - -`"CoC7.rangeCombatCard.SmallTargetTitle": "1 penalty die for a small target",` - -##### CoC7.rangeCombatDamageArmor - -`"CoC7.rangeCombatDamageArmor": "{name} takes {total} damage. ({armor} mitigated)",` - -##### CoC7.remove - -`"CoC7.remove": "Remove",` - -##### CoC7.rounds - -`"CoC7.rounds": "round(s)",` - -##### CoC7.startRest - -`"CoC7.startRest": "Start Rest",` - -##### CoC7.toggleXP - -`"CoC7.toggleXP": "XP gain",` - -##### CoC7.weeks - -`"CoC7.weeks": "week(s)",` - -##### SETTINGS.AdviseAllPlayer - -`"SETTINGS.AdviseAllPlayer": "Notify all players",` - -##### SETTINGS.AdviseOwnersOnly - -`"SETTINGS.AdviseOwnersOnly": "Notify actor's owner",` - -##### SETTINGS.AllowFlatDiceModifier - -`"SETTINGS.AllowFlatDiceModifier": "Flat dice modifier",` - -##### SETTINGS.AllowFlatDiceModifierHint - -`"SETTINGS.AllowFlatDiceModifierHint": "Allows dice roll results to be modified by a flat value.",` - -##### SETTINGS.AllowFlatThresholdModifier - -`"SETTINGS.AllowFlatThresholdModifier": "Flat value modifier",` - -##### SETTINGS.AllowFlatThresholdModifierHint - -`"SETTINGS.AllowFlatThresholdModifierHint": "Allows checks success value to be modified by a flat value.",` - -##### SETTINGS.AlwaysEditable - -`"SETTINGS.AlwaysEditable": "always",` - -##### SETTINGS.ArtWorkOtherSheetBackground - -`"SETTINGS.ArtWorkOtherSheetBackground": "Other sheet background",` - -##### SETTINGS.ArtWorkOtherSheetBackgroundHint - -`"SETTINGS.ArtWorkOtherSheetBackgroundHint": "type 'null' to remove background. Only for items and vehicle for now",` - -##### SETTINGS.ArtWorkSheetBackground - -`"SETTINGS.ArtWorkSheetBackground": "Character sheet background",` - -##### SETTINGS.ArtWorkSheetBackgroundHint - -`"SETTINGS.ArtWorkSheetBackgroundHint": "type 'null' to remove background",` - -##### SETTINGS.ArtWorkSheetBackgroundType - -`"SETTINGS.ArtWorkSheetBackgroundType": "Background type",` - -##### SETTINGS.ArtworkBackgroundColor - -`"SETTINGS.ArtworkBackgroundColor": "Secondary color",` - -##### SETTINGS.ArtworkBackgroundColorHint - -`"SETTINGS.ArtworkBackgroundColorHint": "Used for background and inputs",` - -##### SETTINGS.ArtworkFixedSkillLength - -`"SETTINGS.ArtworkFixedSkillLength": "Limit skill name length",` - -##### SETTINGS.ArtworkFixedSkillLengthHint - -`"SETTINGS.ArtworkFixedSkillLengthHint": "The skill length in the skill tab will be limited for a more compact sheet",` - -##### SETTINGS.ArtworkFrontColor - -`"SETTINGS.ArtworkFrontColor": "Main color",` - -##### SETTINGS.ArtworkFrontColorHint - -`"SETTINGS.ArtworkFrontColorHint": "Used for all elements",` - -##### SETTINGS.ArtworkInteractiveColor - -`"SETTINGS.ArtworkInteractiveColor": "Interactive elements color",` - -##### SETTINGS.ArtworkInteractiveColorHint - -`"SETTINGS.ArtworkInteractiveColorHint": "Used for interactives/rollables elements",` - -##### SETTINGS.ArtworkMainFont - -`"SETTINGS.ArtworkMainFont": "Main font",` - -##### SETTINGS.ArtworkMainFontBold - -`"SETTINGS.ArtworkMainFontBold": "Main font (bold)",` - -##### SETTINGS.ArtworkMainFontSize - -`"SETTINGS.ArtworkMainFontSize": "Default font size (px)",` - -##### SETTINGS.ArtworkSheetImage - -`"SETTINGS.ArtworkSheetImage": "Character sheet image",` - -##### SETTINGS.ArtworkSheetImageHint - -`"SETTINGS.ArtworkSheetImageHint": "type 'null' to remove image",` - -##### SETTINGS.BackgroundAuto - -`"SETTINGS.BackgroundAuto": "Scales the image maintening proportions (css:auto)",` - -##### SETTINGS.BackgroundContain - -`"SETTINGS.BackgroundContain": "Scales to fill without croping/stretching (css:contain)",` - -##### SETTINGS.BackgroundCover - -`"SETTINGS.BackgroundCover": "Scales to fill with croping/stretching (css:cover)",` - -##### SETTINGS.BackgroundSlice - -`"SETTINGS.BackgroundSlice": "Background image will be sliced (css:border-image)",` - -##### SETTINGS.BoutOfMadnessRealTimeTable - -`"SETTINGS.BoutOfMadnessRealTimeTable": "Bout of madness (Real Time) table",` - -##### SETTINGS.BoutOfMadnessSummaryTable - -`"SETTINGS.BoutOfMadnessSummaryTable": "Bout of madness (Summary) table",` - -##### SETTINGS.CreationModeOnly - -`"SETTINGS.CreationModeOnly": "in creation mode only",` - -##### SETTINGS.DebugMode - -`"SETTINGS.DebugMode": "System Debug Mode",` - -##### SETTINGS.DebugModeHint - -`"SETTINGS.DebugModeHint": "!!RESTART REQUIRED!!",` - -##### SETTINGS.DisplayCheckSuccessLevel - -`"SETTINGS.DisplayCheckSuccessLevel": "Display check level of success (stars)",` - -##### SETTINGS.DisplayResultType - -`"SETTINGS.DisplayResultType": "Display dice result type (text)",` - -##### SETTINGS.DoNotAdvise - -`"SETTINGS.DoNotAdvise": "Keep it for yourself.",` - -##### SETTINGS.EnableStatusIcons - -`"SETTINGS.EnableStatusIcons": "Enable status icons",` - -##### SETTINGS.EnableStatusIconsHint - -`"SETTINGS.EnableStatusIconsHint": "Set if combat and sanity effects icons are shown in tokens.",` - -##### SETTINGS.LetKeeperDecide - -`"SETTINGS.LetKeeperDecide": "Let keeper decide",` - -##### SETTINGS.NeverEditable - -`"SETTINGS.NeverEditable": "never (Keeper only)",` - -##### SETTINGS.OneBlockBackStory - -`"SETTINGS.OneBlockBackStory": "One block backstory",` - -##### SETTINGS.OneBlockBackStoryHint - -`"SETTINGS.OneBlockBackStoryHint": "Turn backstory to one editor block, but you can format/add links.",` - -##### SETTINGS.OpposedRollTieBreaker - -`"SETTINGS.OpposedRollTieBreaker": "Opposed rolls Viriato139ac tie breaker",` - -##### SETTINGS.OpposedRollTieBreakerHint - -`"SETTINGS.OpposedRollTieBreakerHint": "In case of a tie during opposed roll, winner is determined by highest rolled value, not higher skill.",` - -##### SETTINGS.OverrideSheetArtwork - -`"SETTINGS.OverrideSheetArtwork": "Override Sheet Artwork",` - -##### SETTINGS.OverrideSheetArtworkHint - -`"SETTINGS.OverrideSheetArtworkHint": "!!RESTART REQUIRED!! gives access to advance sheet config, leave blank for default",` - -##### SETTINGS.PlayerUnlockSheetMode - -`"SETTINGS.PlayerUnlockSheetMode": "Player can unlock sheet",` - -##### SETTINGS.SelfRollWhisperTarget - -`"SETTINGS.SelfRollWhisperTarget": "Self roll notification:",` - -##### SETTINGS.SelfRollWhisperTargetHint - -`"SETTINGS.SelfRollWhisperTargetHint": "As a GM, when doing self check roll, who do you want to send a notification to.",` - -##### SETTINGS.StanbyGMRolls - -`"SETTINGS.StanbyGMRolls": "Standby Keeper rolls",` - -##### SETTINGS.StanbyGMRollsHint - -`"SETTINGS.StanbyGMRollsHint": "When the Keeper is making a roll from an assigned character sheet, display a roll button instead of rolling",` - -##### SETTINGS.TitleChatCards - -`"SETTINGS.TitleChatCards": "Chat Cards Settings",` - -##### SETTINGS.TitleDeveloperDebug - -`"SETTINGS.TitleDeveloperDebug": "Developer And Debug Settings",` - -##### SETTINGS.TitleDiceSoNice - -`"SETTINGS.TitleDiceSoNice": "Dice So Nice Settings",` - -##### SETTINGS.TitleInitiative - -`"SETTINGS.TitleInitiative": "Initiative Settings",` - -##### SETTINGS.TitleRoll - -`"SETTINGS.TitleRoll": "Roll Settings",` - -##### SETTINGS.TitleRollTable - -`"SETTINGS.TitleRollTable": "Roll Table Settings",` - -##### SETTINGS.TitleRules - -`"SETTINGS.TitleRules": "Rules",` - -##### SETTINGS.TitleScene - -`"SETTINGS.TitleScene": "Scene Settings",` - -##### SETTINGS.TitleSheet - -`"SETTINGS.TitleSheet": "Sheet Settings",` - -##### SETTINGS.TitleWeapon - -`"SETTINGS.TitleWeapon": "Weapon Settings",` - -##### SETTINGS.developmentRollForLuck - -`"SETTINGS.developmentRollForLuck": "Recoverable Luck points",` - -##### SETTINGS.developmentRollForLuckHint - -`"SETTINGS.developmentRollForLuckHint": "Each player can make an improvement check for their Luck on Development Phase",` - -##### SETTINGS.displayPlayerNameOnSheet - -`"SETTINGS.displayPlayerNameOnSheet": "Display player's name on sheet",` +The following translations have been abandoned **cn**, **cs**, **de**, **es**, [are you able to help?](./ABANDONED.md) + +|Key|fr|it|ja|ko|pl|pt-BR|sv|zh-TW| +|:---|:---:|:---:|:---:|:---:|:---:|:---:|:---:|:---:| +|**Remaining**:|**196**|**4**|**198**|**197**|**198**|**196**|**196**|**196**| +|[CoC7.ABarrier](#coc7abarrier)|❌|✅|❌|❌|❌|❌|❌|❌| +|[CoC7.AHazard](#coc7ahazard)|❌|✅|❌|❌|❌|❌|❌|❌| +|[CoC7.ActionCost](#coc7actioncost)|❌|✅|❌|❌|❌|❌|❌|❌| +|[CoC7.ActionCostOnFail](#coc7actioncostonfail)|❌|✅|❌|❌|❌|❌|❌|❌| +|[CoC7.Actions](#coc7actions)|❌|✅|❌|❌|❌|❌|❌|❌| +|[CoC7.ActorDataLinked](#coc7actordatalinked)|❌|✅|❌|❌|❌|❌|❌|❌| +|[CoC7.ActorDataNotLinked](#coc7actordatanotlinked)|❌|✅|❌|❌|❌|❌|❌|❌| +|[CoC7.ActorImported](#coc7actorimported)|❌|✅|❌|❌|❌|❌|❌|❌| +|[CoC7.ActorImporterUploadError](#coc7actorimporteruploaderror)|❌|✅|❌|❌|❌|❌|❌|❌| +|[CoC7.ActorIsSyntheticActor](#coc7actorissyntheticactor)|❌|✅|❌|❌|❌|❌|❌|❌| +|[CoC7.ActorIsTokenHint](#coc7actoristokenhint)|❌|✅|❌|❌|❌|❌|❌|❌| +|[CoC7.Add](#coc7add)|❌|✅|❌|❌|❌|❌|❌|❌| +|[CoC7.AddActorToChase](#coc7addactortochase)|❌|✅|❌|❌|❌|❌|❌|❌| +|[CoC7.AddBonusDie](#coc7addbonusdie)|❌|✅|❌|❌|❌|❌|❌|❌| +|[CoC7.AddParticipant](#coc7addparticipant)|❌|✅|❌|❌|❌|❌|❌|❌| +|[CoC7.AdjustedMovement](#coc7adjustedmovement)|❌|✅|❌|❌|❌|❌|❌|❌| +|[CoC7.AlreadyEncountered](#coc7alreadyencountered)|✅|✅|❌|✅|✅|✅|✅|✅| +|[CoC7.AlreadyEncounteredInformation](#coc7alreadyencounteredinformation)|❌|✅|❌|❌|❌|❌|❌|❌| +|[CoC7.ArmorIgnored](#coc7armorignored)|❌|✅|❌|❌|❌|❌|❌|❌| +|[CoC7.AskDamageRoll](#coc7askdamageroll)|❌|✅|❌|❌|❌|❌|❌|❌| +|[CoC7.AskIntentions](#coc7askintentions)|❌|✅|❌|❌|❌|❌|❌|❌| +|[CoC7.AskRoll](#coc7askroll)|❌|✅|❌|❌|❌|❌|❌|❌| +|[CoC7.Assist](#coc7assist)|❌|✅|❌|❌|❌|❌|❌|❌| +|[CoC7.AttemptBreakDown](#coc7attemptbreakdown)|❌|✅|❌|❌|❌|❌|❌|❌| +|[CoC7.AttemptNegotiateObstacle](#coc7attemptnegotiateobstacle)|❌|✅|❌|❌|❌|❌|❌|❌| +|[CoC7.Barrier](#coc7barrier)|❌|✅|❌|❌|❌|❌|❌|❌| +|[CoC7.BeingCautious](#coc7beingcautious)|❌|✅|❌|❌|❌|❌|❌|❌| +|[CoC7.BeingVeryCautious](#coc7beingverycautious)|❌|✅|❌|❌|❌|❌|❌|❌| +|[CoC7.BonusDieAssailantReason](#coc7bonusdieassailantreason)|❌|✅|❌|❌|❌|❌|❌|❌| +|[CoC7.BreakDown](#coc7breakdown)|❌|✅|❌|❌|❌|❌|❌|❌| +|[CoC7.Breakable](#coc7breakable)|❌|✅|❌|❌|❌|❌|❌|❌| +|[CoC7.Cautious](#coc7cautious)|❌|✅|❌|❌|❌|❌|❌|❌| +|[CoC7.CautiousApproach](#coc7cautiousapproach)|❌|✅|❌|❌|❌|❌|❌|❌| +|[CoC7.Chase.AdjustedMovementShort](#coc7chaseadjustedmovementshort)|❌|✅|❌|❌|❌|❌|❌|❌| +|[CoC7.Chase.ChasersMax](#coc7chasechasersmax)|❌|✅|❌|❌|❌|❌|❌|❌| +|[CoC7.Chase.ChasersMin](#coc7chasechasersmin)|❌|✅|❌|❌|❌|❌|❌|❌| +|[CoC7.Chase.CheckName](#coc7chasecheckname)|❌|✅|❌|❌|❌|❌|❌|❌| +|[CoC7.Chase.InitiativeShort](#coc7chaseinitiativeshort)|❌|✅|❌|❌|❌|❌|❌|❌| +|[CoC7.Chase.PreysMax](#coc7chasepreysmax)|❌|✅|❌|❌|❌|❌|❌|❌| +|[CoC7.Chase.PreysMin](#coc7chasepreysmin)|❌|✅|❌|❌|❌|❌|❌|❌| +|[CoC7.ChaseSetup](#coc7chasesetup)|❌|✅|❌|❌|❌|❌|❌|❌| +|[CoC7.CheckFailed](#coc7checkfailed)|❌|✅|❌|❌|❌|❌|❌|❌| +|[CoC7.CheckMemoryRepressed](#coc7checkmemoryrepressed)|❌|✅|❌|❌|❌|❌|❌|❌| +|[CoC7.CheckName](#coc7checkname)|❌|✅|❌|❌|❌|❌|❌|❌| +|[CoC7.CheckPassed](#coc7checkpassed)|❌|✅|❌|❌|❌|❌|❌|❌| +|[CoC7.CleanSkillList](#coc7cleanskilllist)|❌|✅|❌|❌|❌|❌|❌|❌| +|[CoC7.CleanSkillListHint](#coc7cleanskilllisthint)|❌|✅|❌|❌|❌|❌|❌|❌| +|[CoC7.ClearAllConditions](#coc7clearallconditions)|❌|✅|❌|❌|❌|❌|❌|❌| +|[CoC7.ConfirmCut2Chase](#coc7confirmcut2chase)|❌|✅|❌|❌|❌|❌|❌|❌| +|[CoC7.ConfirmCut2ChaseHint](#coc7confirmcut2chasehint)|❌|✅|❌|❌|❌|❌|❌|❌| +|[CoC7.ConfirmNextChaseRound](#coc7confirmnextchaseround)|❌|✅|❌|❌|❌|❌|❌|❌| +|[CoC7.ConfirmNextChaseRoundHint](#coc7confirmnextchaseroundhint)|❌|✅|❌|❌|❌|❌|❌|❌| +|[CoC7.ConfirmResetChase](#coc7confirmresetchase)|❌|✅|❌|❌|❌|❌|❌|❌| +|[CoC7.ConfirmResetChaseHint](#coc7confirmresetchasehint)|❌|✅|❌|❌|❌|❌|❌|❌| +|[CoC7.ConfirmRestartChase](#coc7confirmrestartchase)|❌|✅|❌|❌|❌|❌|❌|❌| +|[CoC7.ConfirmRestartChaseHint](#coc7confirmrestartchasehint)|❌|✅|❌|❌|❌|❌|❌|❌| +|[CoC7.ConsumeBonusDice](#coc7consumebonusdice)|❌|✅|❌|❌|❌|❌|❌|❌| +|[CoC7.Create](#coc7create)|❌|✅|❌|❌|❌|❌|❌|❌| +|[CoC7.CutToTheChase](#coc7cuttothechase)|❌|✅|❌|❌|❌|❌|❌|❌| +|[CoC7.Damage](#coc7damage)|❌|✅|❌|❌|❌|❌|❌|❌| +|[CoC7.DamageDealTo](#coc7damagedealto)|❌|✅|❌|❌|❌|❌|❌|❌| +|[CoC7.DamageDealt](#coc7damagedealt)|❌|✅|❌|❌|❌|❌|❌|❌| +|[CoC7.DamageOnFail](#coc7damageonfail)|❌|✅|❌|❌|❌|❌|❌|❌| +|[CoC7.DecreaseMovementAction](#coc7decreasemovementaction)|❌|✅|❌|❌|❌|❌|❌|❌| +|[CoC7.DefinitelyInsane](#coc7definitelyinsane)|❌|✅|❌|❌|❌|❌|❌|❌| +|[CoC7.Delete](#coc7delete)|❌|✅|❌|❌|❌|❌|❌|❌| +|[CoC7.DholeHouseActorImporter](#coc7dholehouseactorimporter)|❌|✅|❌|❌|❌|❌|❌|❌| +|[CoC7.DholeHouseActorImporterSource](#coc7dholehouseactorimportersource)|❌|✅|❌|❌|❌|❌|❌|❌| +|[CoC7.DholeHouseActorImporterSummary](#coc7dholehouseactorimportersummary)|❌|✅|❌|❌|❌|❌|❌|❌| +|[CoC7.DholeHouseImportingName](#coc7dholehouseimportingname)|❌|✅|❌|❌|❌|❌|❌|❌| +|[CoC7.DholeHouseInvalidActor](#coc7dholehouseinvalidactor)|❌|✅|❌|❌|❌|❌|❌|❌| +|[CoC7.DholeHousePickYourJSONFile](#coc7dholehousepickyourjsonfile)|❌|✅|❌|❌|❌|❌|❌|❌| +|[CoC7.Disable](#coc7disable)|❌|✅|❌|❌|❌|❌|❌|❌| +|[CoC7.DoesNotMeetMinimumReqToBeAdded](#coc7doesnotmeetminimumreqtobeadded)|❌|✅|❌|❌|❌|❌|❌|❌| +|[CoC7.DontMoveToLocation](#coc7dontmovetolocation)|❌|✅|❌|❌|❌|❌|❌|❌| +|[CoC7.DragOnCanvas](#coc7dragoncanvas)|❌|✅|❌|❌|❌|❌|❌|❌| +|[CoC7.Duration](#coc7duration)|❌|✅|❌|❌|❌|❌|❌|❌| +|[CoC7.Edit](#coc7edit)|❌|✅|❌|❌|❌|❌|❌|❌| +|[CoC7.EffectAppliedCantOverride](#coc7effectappliedcantoverride)|❌|✅|❌|❌|❌|❌|❌|❌| +|[CoC7.EffectNew](#coc7effectnew)|❌|✅|❌|❌|❌|❌|❌|❌| +|[CoC7.Enable](#coc7enable)|❌|✅|❌|❌|❌|❌|❌|❌| +|[CoC7.ErrorActorHasNoWeaponNamed](#coc7erroractorhasnoweaponnamed)|❌|✅|❌|❌|❌|❌|❌|❌| +|[CoC7.ErrorActorHasTooManyWeaponsNamed](#coc7erroractorhastoomanyweaponsnamed)|❌|✅|❌|❌|❌|❌|❌|❌| +|[CoC7.ErrorBeneficiaryAtMaxBonus](#coc7errorbeneficiaryatmaxbonus)|❌|✅|❌|❌|❌|❌|❌|❌| +|[CoC7.ErrorEmptyLocationsList](#coc7erroremptylocationslist)|❌|✅|❌|❌|❌|❌|❌|❌| +|[CoC7.ErrorEvaluatingDamage](#coc7errorevaluatingdamage)|❌|✅|❌|❌|❌|❌|❌|❌| +|[CoC7.ErrorNoTokensSelected](#coc7errornotokensselected)|❌|✅|❌|❌|❌|❌|❌|❌| +|[CoC7.ErrorParticipantAtMaxBonus](#coc7errorparticipantatmaxbonus)|❌|✅|❌|❌|❌|❌|❌|❌| +|[CoC7.ErrorTokenNotOnScene](#coc7errortokennotonscene)|❌|✅|❌|❌|❌|❌|❌|❌| +|[CoC7.ErrorUnableToParseArmorFormula](#coc7errorunabletoparsearmorformula)|❌|✅|❌|❌|❌|❌|❌|❌| +|[CoC7.ErrorUnableToParseFormula](#coc7errorunabletoparseformula)|❌|✅|❌|❌|❌|❌|❌|❌| +|[CoC7.ErrorUnableToParseSkillFormula](#coc7errorunabletoparseskillformula)|❌|✅|❌|❌|❌|❌|❌|❌| +|[CoC7.ErrorUnexpectedSkillsText](#coc7errorunexpectedskillstext)|❌|✅|❌|❌|❌|❌|❌|❌| +|[CoC7.ErrorUnexpectedWeaponText](#coc7errorunexpectedweapontext)|❌|✅|❌|❌|❌|❌|❌|❌| +|[CoC7.FINISH](#coc7finish)|❌|✅|❌|❌|❌|❌|❌|❌| +|[CoC7.FacingObstacle](#coc7facingobstacle)|❌|✅|❌|❌|❌|❌|❌|❌| +|[CoC7.FileUploadError](#coc7fileuploaderror)|❌|✅|❌|❌|❌|❌|❌|❌| +|[CoC7.German](#coc7german)|✅|✅|✅|✅|❌|✅|✅|✅| +|[CoC7.GotLucky](#coc7gotlucky)|❌|✅|❌|❌|❌|❌|❌|❌| +|[CoC7.Hazard](#coc7hazard)|❌|✅|❌|❌|❌|❌|❌|❌| +|[CoC7.IncludeEscapees](#coc7includeescapees)|❌|✅|❌|❌|❌|❌|❌|❌| +|[CoC7.IncludeLatecomers](#coc7includelatecomers)|❌|✅|❌|❌|❌|❌|❌|❌| +|[CoC7.IncreaseMovementAction](#coc7increasemovementaction)|❌|✅|❌|❌|❌|❌|❌|❌| +|[CoC7.Initialize](#coc7initialize)|❌|✅|❌|❌|❌|❌|❌|❌| +|[CoC7.Initiative](#coc7initiative)|❌|✅|❌|❌|❌|❌|❌|❌| +|[CoC7.InsertLocation](#coc7insertlocation)|❌|✅|❌|❌|❌|❌|❌|❌| +|[CoC7.LocationCoordinate](#coc7locationcoordinate)|❌|✅|❌|❌|❌|❌|❌|❌| +|[CoC7.LocationInit](#coc7locationinit)|❌|✅|❌|❌|❌|❌|❌|❌| +|[CoC7.LocationNotEmpty](#coc7locationnotempty)|❌|✅|❌|❌|❌|❌|❌|❌| +|[CoC7.Locations](#coc7locations)|❌|✅|❌|❌|❌|❌|❌|❌| +|[CoC7.LuckNotEnough](#coc7lucknotenough)|❌|✅|❌|❌|❌|❌|❌|❌| +|[CoC7.MakeActive](#coc7makeactive)|❌|✅|❌|❌|❌|❌|❌|❌| +|[CoC7.MaxPossibleSanLoss](#coc7maxpossiblesanloss)|✅|✅|❌|✅|✅|✅|✅|✅| +|[CoC7.MessageRollingCharacteristic](#coc7messagerollingcharacteristic)|❌|✅|❌|❌|❌|❌|❌|❌| +|[CoC7.Migrate.ErrorActor](#coc7migrateerroractor)|❌|✅|❌|❌|❌|❌|❌|❌| +|[CoC7.Migrate.ErrorDocumentPack](#coc7migrateerrordocumentpack)|❌|✅|❌|❌|❌|❌|❌|❌| +|[CoC7.Migrate.ErrorItem](#coc7migrateerroritem)|❌|✅|❌|❌|❌|❌|❌|❌| +|[CoC7.Migrate.ErrorMacro](#coc7migrateerrormacro)|❌|✅|❌|❌|❌|❌|❌|❌| +|[CoC7.Migrate.ErrorScene](#coc7migrateerrorscene)|❌|✅|❌|❌|❌|❌|❌|❌| +|[CoC7.Migrate.ErrorTable](#coc7migrateerrortable)|❌|✅|❌|❌|❌|❌|❌|❌| +|[CoC7.MoveBackward](#coc7movebackward)|❌|✅|❌|❌|❌|❌|❌|❌| +|[CoC7.MoveForward](#coc7moveforward)|❌|✅|❌|❌|❌|❌|❌|❌| +|[CoC7.MoveToLocation](#coc7movetolocation)|❌|✅|❌|❌|❌|❌|❌|❌| +|[CoC7.MovementAction](#coc7movementaction)|❌|✅|❌|❌|❌|❌|❌|❌| +|[CoC7.NeedMin2Participants](#coc7needmin2participants)|❌|✅|❌|❌|❌|❌|❌|❌| +|[CoC7.NeedRecalculate](#coc7needrecalculate)|❌|✅|❌|❌|❌|❌|❌|❌| +|[CoC7.NeedToRecalculate](#coc7needtorecalculate)|❌|✅|❌|❌|❌|❌|❌|❌| +|[CoC7.Negotiate](#coc7negotiate)|❌|✅|❌|❌|❌|❌|❌|❌| +|[CoC7.NextRound](#coc7nextround)|❌|✅|❌|❌|❌|❌|❌|❌| +|[CoC7.NoDamageDealt](#coc7nodamagedealt)|❌|✅|❌|❌|❌|❌|❌|❌| +|[CoC7.NoValidCheck](#coc7novalidcheck)|❌|✅|❌|❌|❌|❌|❌|❌| +|[CoC7.NoValidSkill](#coc7novalidskill)|❌|✅|❌|❌|❌|❌|❌|❌| +|[CoC7.NotAllHaveSpeedRoll](#coc7notallhavespeedroll)|❌|✅|❌|❌|❌|❌|❌|❌| +|[CoC7.NothingToRoll](#coc7nothingtoroll)|❌|✅|❌|❌|❌|❌|❌|❌| +|[CoC7.Obstacle](#coc7obstacle)|❌|✅|❌|❌|❌|❌|❌|❌| +|[CoC7.ObstacleDamage](#coc7obstacledamage)|❌|✅|❌|❌|❌|❌|❌|❌| +|[CoC7.ObstacleFail](#coc7obstaclefail)|❌|✅|❌|❌|❌|❌|❌|❌| +|[CoC7.ObstacleFumble](#coc7obstaclefumble)|❌|✅|❌|❌|❌|❌|❌|❌| +|[CoC7.ObstacleHasHitPoint](#coc7obstaclehashitpoint)|❌|✅|❌|❌|❌|❌|❌|❌| +|[CoC7.ObstacleName](#coc7obstaclename)|❌|✅|❌|❌|❌|❌|❌|❌| +|[CoC7.ObstaclePassed](#coc7obstaclepassed)|❌|✅|❌|❌|❌|❌|❌|❌| +|[CoC7.OpenObstacleResolutionCard](#coc7openobstacleresolutioncard)|❌|✅|❌|❌|❌|❌|❌|❌| +|[CoC7.OverrideCalc](#coc7overridecalc)|❌|✅|❌|❌|❌|❌|❌|❌| +|[CoC7.ParticipantAlreadyProcessed](#coc7participantalreadyprocessed)|❌|✅|❌|❌|❌|❌|❌|❌| +|[CoC7.ParticipantDataMissing](#coc7participantdatamissing)|❌|✅|❌|❌|❌|❌|❌|❌| +|[CoC7.ParticipantDropHint](#coc7participantdrophint)|❌|✅|❌|❌|❌|❌|❌|❌| +|[CoC7.ParticipantNotEnoughMovement](#coc7participantnotenoughmovement)|❌|✅|❌|❌|❌|❌|❌|❌| +|[CoC7.ParticipantNotFound](#coc7participantnotfound)|❌|✅|❌|❌|❌|❌|❌|❌| +|[CoC7.ParticipantUuidNotFound](#coc7participantuuidnotfound)|❌|✅|❌|❌|❌|❌|❌|❌| +|[CoC7.ParticipantsList](#coc7participantslist)|❌|✅|❌|❌|❌|❌|❌|❌| +|[CoC7.PenaltyDice](#coc7penaltydice)|❌|✅|❌|❌|❌|❌|❌|❌| +|[CoC7.PenaltyDieSelfReason](#coc7penaltydieselfreason)|❌|✅|❌|❌|❌|❌|❌|❌| +|[CoC7.PickDirectory](#coc7pickdirectory)|❌|✅|❌|❌|❌|❌|❌|❌| +|[CoC7.PlayerMovesToLocation](#coc7playermovestolocation)|❌|✅|❌|❌|❌|❌|❌|❌| +|[CoC7.Polish](#coc7polish)|✅|✅|✅|✅|❌|✅|✅|✅| +|[CoC7.ReflectObstacleChanges](#coc7reflectobstaclechanges)|❌|✅|❌|❌|❌|❌|❌|❌| +|[CoC7.Remove](#coc7remove)|❌|✅|❌|❌|❌|❌|❌|❌| +|[CoC7.RemoveBonusDie](#coc7removebonusdie)|❌|✅|❌|❌|❌|❌|❌|❌| +|[CoC7.RemoveLocation](#coc7removelocation)|❌|✅|❌|❌|❌|❌|❌|❌| +|[CoC7.RemoveObstacle](#coc7removeobstacle)|❌|✅|❌|❌|❌|❌|❌|❌| +|[CoC7.Reset](#coc7reset)|❌|✅|❌|❌|❌|❌|❌|❌| +|[CoC7.Restart](#coc7restart)|❌|✅|❌|❌|❌|❌|❌|❌| +|[CoC7.RollDifficultyCriticalTitle](#coc7rolldifficultycriticaltitle)|❌|✅|❌|❌|❌|❌|❌|❌| +|[CoC7.RollDifficultyExtremeTitle](#coc7rolldifficultyextremetitle)|❌|✅|❌|❌|❌|❌|❌|❌| +|[CoC7.RollDifficultyHardTitle](#coc7rolldifficultyhardtitle)|❌|✅|❌|❌|❌|❌|❌|❌| +|[CoC7.RollDifficultyRegularTitle](#coc7rolldifficultyregulartitle)|❌|✅|❌|❌|❌|❌|❌|❌| +|[CoC7.Sane](#coc7sane)|❌|✅|❌|❌|❌|❌|❌|❌| +|[CoC7.SelectNewSkill](#coc7selectnewskill)|❌|✅|❌|❌|❌|❌|❌|❌| +|[CoC7.Settings.DholeUpload.Directory.Hint](#coc7settingsdholeuploaddirectoryhint)|❌|✅|❌|❌|❌|❌|❌|❌| +|[CoC7.Settings.DholeUpload.Directory.Name](#coc7settingsdholeuploaddirectoryname)|❌|✅|❌|❌|❌|❌|❌|❌| +|[CoC7.SkillXpGainDisabled](#coc7skillxpgaindisabled)|❌|✅|❌|❌|❌|❌|❌|❌| +|[CoC7.SomethingInTheWay](#coc7somethingintheway)|❌|✅|❌|❌|❌|❌|❌|❌| +|[CoC7.SpeedCheck](#coc7speedcheck)|❌|✅|❌|❌|❌|❌|❌|❌| +|[CoC7.StartingIndex](#coc7startingindex)|❌|✅|❌|❌|❌|❌|❌|❌| +|[CoC7.StartingRange](#coc7startingrange)|❌|✅|❌|❌|❌|❌|❌|❌| +|[CoC7.TextFieldInvalidJSON](#coc7textfieldinvalidjson)|❌|✅|❌|❌|❌|❌|❌|❌| +|[CoC7.TooFast](#coc7toofast)|❌|✅|❌|❌|❌|❌|❌|❌| +|[CoC7.TooSlow](#coc7tooslow)|❌|✅|❌|❌|❌|❌|❌|❌| +|[CoC7.TryToBreak](#coc7trytobreak)|❌|✅|❌|❌|❌|❌|❌|❌| +|[CoC7.TryToGetPastBarriers](#coc7trytogetpastbarriers)|❌|✅|❌|❌|❌|❌|❌|❌| +|[CoC7.TryToNegotiateHazard](#coc7trytonegotiatehazard)|❌|✅|❌|❌|❌|❌|❌|❌| +|[CoC7.UnableToUploadDholeImage](#coc7unabletouploaddholeimage)|❌|✅|❌|❌|❌|❌|❌|❌| +|[CoC7.UnarmedWeaponName](#coc7unarmedweaponname)|❌|✅|❌|❌|❌|❌|❌|❌| +|[CoC7.Update](#coc7update)|❌|✅|❌|❌|❌|❌|❌|❌| +|[CoC7.UpgradeSuccessWithLuck](#coc7upgradesuccesswithluck)|❌|✅|❌|❌|❌|❌|❌|❌| +|[CoC7.VehicleChase](#coc7vehiclechase)|❌|✅|❌|❌|❌|❌|❌|❌| +|[CoC7.WaitForPlayerInput](#coc7waitforplayerinput)|❌|✅|❌|❌|❌|❌|❌|❌| +|[CoC7.WeaponSkillMain](#coc7weaponskillmain)|❌|✅|❌|❌|❌|❌|❌|❌| +|[CoC7.YouLostTime](#coc7youlosttime)|❌|✅|❌|❌|❌|❌|❌|❌| +|[CoC7.YouTakeNoDamage](#coc7youtakenodamage)|❌|✅|❌|❌|❌|❌|❌|❌| +|[CoC7.YouTakeSomeDamage](#coc7youtakesomedamage)|❌|✅|❌|❌|❌|❌|❌|❌| +|[CoC7.combatCard.automaticSuccess](#coc7combatcardautomaticsuccess)|❌|✅|❌|❌|❌|❌|❌|❌| +|[CoC7.rangeCombatCard.SurprisedTargetTitle](#coc7rangecombatcardsurprisedtargettitle)|❌|✅|❌|❌|❌|❌|❌|❌| +|[SETTINGS.ChaseShowTokenMovement](#settingschaseshowtokenmovement)|❌|✅|❌|❌|❌|❌|❌|❌| +|[SETTINGS.ChaseShowTokenMovementHint](#settingschaseshowtokenmovementhint)|❌|✅|❌|❌|❌|❌|❌|❌| +|[SETTINGS.DefaultDifficulty](#settingsdefaultdifficulty)|✅|✅|✅|❌|✅|✅|✅|✅| +|[SETTINGS.TitleChaseSettings](#settingstitlechasesettings)|❌|✅|❌|❌|❌|❌|❌|❌| +|[SETTINGS.TrustedCanModfyChatCard](#settingstrustedcanmodfychatcard)|❌|❌|❌|❌|❌|❌|❌|❌| +|[SETTINGS.TrustedCanModfyChatCardHint](#settingstrustedcanmodfychatcardhint)|❌|❌|❌|❌|❌|❌|❌|❌| +|[SETTINGS.TrustedCanSeeChatCard](#settingstrustedcanseechatcard)|❌|❌|❌|❌|❌|❌|❌|❌| +|[SETTINGS.TrustedCanSeeChatCardHint](#settingstrustedcanseechatcardhint)|❌|❌|❌|❌|❌|❌|❌|❌| +##### CoC7.ABarrier +``` "CoC7.ABarrier": "a barrier",``` +##### CoC7.AHazard +``` "CoC7.AHazard": "a hazard",``` +##### CoC7.ActionCost +``` "CoC7.ActionCost": "Action cost",``` +##### CoC7.ActionCostOnFail +``` "CoC7.ActionCostOnFail": "Toggle action penalty on fail.",``` +##### CoC7.Actions +``` "CoC7.Actions": "actions:",``` +##### CoC7.ActorDataLinked +``` "CoC7.ActorDataLinked": "Actor data are linked",``` +##### CoC7.ActorDataNotLinked +``` "CoC7.ActorDataNotLinked": "Actor data are NOT linked",``` +##### CoC7.ActorImported +``` "CoC7.ActorImported": "New {actorType} imported: {actorName}",``` +##### CoC7.ActorImporterUploadError +``` "CoC7.ActorImporterUploadError": "Import stopped, unable to write image",``` +##### CoC7.ActorIsSyntheticActor +``` "CoC7.ActorIsSyntheticActor": "Actor is a synthetic actor (instance of an actor)",``` +##### CoC7.ActorIsTokenHint +``` "CoC7.ActorIsTokenHint": "Actor is a token",``` +##### CoC7.Add +``` "CoC7.Add": "Add",``` +##### CoC7.AddActorToChase +``` "CoC7.AddActorToChase": "Add an actor to the chase",``` +##### CoC7.AddBonusDie +``` "CoC7.AddBonusDie": "Add bonus die",``` +##### CoC7.AddParticipant +``` "CoC7.AddParticipant": "Add Participant",``` +##### CoC7.AdjustedMovement +``` "CoC7.AdjustedMovement": "Adjusted movement",``` +##### CoC7.AlreadyEncountered +``` "CoC7.AlreadyEncountered": "Already encountered",``` +##### CoC7.AlreadyEncounteredInformation +``` "CoC7.AlreadyEncounteredInformation": "Already encountered: {reason} lost {lost}/{max}",``` +##### CoC7.ArmorIgnored +``` "CoC7.ArmorIgnored": "Armor Ignored",``` +##### CoC7.AskDamageRoll +``` "CoC7.AskDamageRoll": "Ask damage roll",``` +##### CoC7.AskIntentions +``` "CoC7.AskIntentions": "What are your intentions ?",``` +##### CoC7.AskRoll +``` "CoC7.AskRoll": "Roll {name} ({value}%)",``` +##### CoC7.Assist +``` "CoC7.Assist": "Assist ally",``` +##### CoC7.AttemptBreakDown +``` "CoC7.AttemptBreakDown": "Attempt to break down !!",``` +##### CoC7.AttemptNegotiateObstacle +``` "CoC7.AttemptNegotiateObstacle": "Attempt to negotiate that obstacle",``` +##### CoC7.Barrier +``` "CoC7.Barrier": "Barrier",``` +##### CoC7.BeingCautious +``` "CoC7.BeingCautious": "You elect to take a cautious approach.",``` +##### CoC7.BeingVeryCautious +``` "CoC7.BeingVeryCautious": "You are being very cautious.",``` +##### CoC7.BonusDieAssailantReason +``` "CoC7.BonusDieAssailantReason": "Add 1 bonus die (assailant is prone, restrained...)",``` +##### CoC7.BreakDown +``` "CoC7.BreakDown": "Break Down",``` +##### CoC7.Breakable +``` "CoC7.Breakable": "Breakable",``` +##### CoC7.Cautious +``` "CoC7.Cautious": "Cautious",``` +##### CoC7.CautiousApproach +``` "CoC7.CautiousApproach": "Take cautious approach",``` +##### CoC7.Chase.AdjustedMovementShort +``` "CoC7.Chase.AdjustedMovementShort": "ADJ. MOV: {value}",``` +##### CoC7.Chase.ChasersMax +``` "CoC7.Chase.ChasersMax": "Chasers Max: {value}",``` +##### CoC7.Chase.ChasersMin +``` "CoC7.Chase.ChasersMin": "Chasers Min: {value}",``` +##### CoC7.Chase.CheckName +``` "CoC7.Chase.CheckName": "check name",``` +##### CoC7.Chase.InitiativeShort +``` "CoC7.Chase.InitiativeShort": "INIT: {value}",``` +##### CoC7.Chase.PreysMax +``` "CoC7.Chase.PreysMax": "Preys Max: {value}",``` +##### CoC7.Chase.PreysMin +``` "CoC7.Chase.PreysMin": "Preys Min: {value}",``` +##### CoC7.ChaseSetup +``` "CoC7.ChaseSetup": "Chase setup",``` +##### CoC7.CheckFailed +``` "CoC7.CheckFailed": "Check failed",``` +##### CoC7.CheckMemoryRepressed +``` "CoC7.CheckMemoryRepressed": "Memory repressed",``` +##### CoC7.CheckName +``` "CoC7.CheckName": "Check",``` +##### CoC7.CheckPassed +``` "CoC7.CheckPassed": "Check passed",``` +##### CoC7.CleanSkillList +``` "CoC7.CleanSkillList": "Clean skill list",``` +##### CoC7.CleanSkillListHint +``` "CoC7.CleanSkillListHint": "This will Clean your skill list by removing specialization from skill name.
This will avoid to display skill as : 'specialization(specialization(skill))'
",``` +##### CoC7.ClearAllConditions +``` "CoC7.ClearAllConditions": "Clear All Conditions",``` +##### CoC7.ConfirmCut2Chase +``` "CoC7.ConfirmCut2Chase": "Are you ready to cut to the chase ?",``` +##### CoC7.ConfirmCut2ChaseHint +``` "CoC7.ConfirmCut2ChaseHint": "This will start the chase and the first chase round.",``` +##### CoC7.ConfirmNextChaseRound +``` "CoC7.ConfirmNextChaseRound": "Proceed to next round ?",``` +##### CoC7.ConfirmNextChaseRoundHint +``` "CoC7.ConfirmNextChaseRoundHint": "You still have action available on some actors. Are you sure you want to proceed ?",``` +##### CoC7.ConfirmResetChase +``` "CoC7.ConfirmResetChase": "Do you want to restet the chase ?",``` +##### CoC7.ConfirmResetChaseHint +``` "CoC7.ConfirmResetChaseHint": "This will reset your chase.All positions and obstacles will be removed.",``` +##### CoC7.ConfirmRestartChase +``` "CoC7.ConfirmRestartChase": "Do you want to restart the chase ?",``` +##### CoC7.ConfirmRestartChaseHint +``` "CoC7.ConfirmRestartChaseHint": "This will restart your chase.\nAll position will be reseted.\nActors that did not rool a speedcheck will have to roll.",``` +##### CoC7.ConsumeBonusDice +``` "CoC7.ConsumeBonusDice": "Consume Bonus Dice",``` +##### CoC7.Create +``` "CoC7.Create": "Create",``` +##### CoC7.CutToTheChase +``` "CoC7.CutToTheChase": "Cut to the chase",``` +##### CoC7.Damage +``` "CoC7.Damage": "Damage",``` +##### CoC7.DamageDealTo +``` "CoC7.DamageDealTo": "Damage {name} {damage}HP",``` +##### CoC7.DamageDealt +``` "CoC7.DamageDealt": "You deal {value} damage.",``` +##### CoC7.DamageOnFail +``` "CoC7.DamageOnFail": "Toggle damage on fail.",``` +##### CoC7.DecreaseMovementAction +``` "CoC7.DecreaseMovementAction": "Decrease movement action",``` +##### CoC7.DefinitelyInsane +``` "CoC7.DefinitelyInsane": "Good for the asylum",``` +##### CoC7.Delete +``` "CoC7.Delete": "Delete",``` +##### CoC7.DholeHouseActorImporter +``` "CoC7.DholeHouseActorImporter": "The Dhole's House Actor Importer JSON",``` +##### CoC7.DholeHouseActorImporterSource +``` "CoC7.DholeHouseActorImporterSource": "Imported from The Dhole's House Actor",``` +##### CoC7.DholeHouseActorImporterSummary +``` "CoC7.DholeHouseActorImporterSummary": "Export your DholeHouse's character as JSON and upload it here.",``` +##### CoC7.DholeHouseImportingName +``` "CoC7.DholeHouseImportingName": "About to import: ",``` +##### CoC7.DholeHouseInvalidActor +``` "CoC7.DholeHouseInvalidActor": "The selected JSON doesn't seem to be a valid Dhole's House exported character",``` +##### CoC7.DholeHousePickYourJSONFile +``` "CoC7.DholeHousePickYourJSONFile": "Pick the JSON file exported from The Dhole's House",``` +##### CoC7.Disable +``` "CoC7.Disable": "Disable",``` +##### CoC7.DoesNotMeetMinimumReqToBeAdded +``` "CoC7.DoesNotMeetMinimumReqToBeAdded": "Can not add participant, need at least valid movement action",``` +##### CoC7.DontMoveToLocation +``` "CoC7.DontMoveToLocation": "You're staying there !",``` +##### CoC7.DragOnCanvas +``` "CoC7.DragOnCanvas": "Drag this on canvas to set the position of this location.",``` +##### CoC7.Duration +``` "CoC7.Duration": "Duration",``` +##### CoC7.Edit +``` "CoC7.Edit": "Edit",``` +##### CoC7.EffectAppliedCantOverride +``` "CoC7.EffectAppliedCantOverride": "An active effect is applies. You can't modify [{name}]. Deactivate the corresponding effect to modify this value.",``` +##### CoC7.EffectNew +``` "CoC7.EffectNew": "New effect",``` +##### CoC7.Enable +``` "CoC7.Enable": "Enable",``` +##### CoC7.ErrorActorHasNoWeaponNamed +``` "CoC7.ErrorActorHasNoWeaponNamed": "Actor {actorName} has no weapon named {weaponName}",``` +##### CoC7.ErrorActorHasTooManyWeaponsNamed +``` "CoC7.ErrorActorHasTooManyWeaponsNamed": "`Actor {actorName} has more than one weapon named {weaponName}. The first found will be used`",``` +##### CoC7.ErrorBeneficiaryAtMaxBonus +``` "CoC7.ErrorBeneficiaryAtMaxBonus": "Beneficiary {name} already has max bonus dice",``` +##### CoC7.ErrorEmptyLocationsList +``` "CoC7.ErrorEmptyLocationsList": "Empty locations list",``` +##### CoC7.ErrorEvaluatingDamage +``` "CoC7.ErrorEvaluatingDamage": "Error evaluating damage",``` +##### CoC7.ErrorNoTokensSelected +``` "CoC7.ErrorNoTokensSelected": "No tokens selected",``` +##### CoC7.ErrorParticipantAtMaxBonus +``` "CoC7.ErrorParticipantAtMaxBonus": "{participantUuid} already has max bonus dice",``` +##### CoC7.ErrorTokenNotOnScene +``` "CoC7.ErrorTokenNotOnScene": "Token does not belongs to this location's scene",``` +##### CoC7.ErrorUnableToParseArmorFormula +``` "CoC7.ErrorUnableToParseArmorFormula": "Unable to process armor value: {value}. Ignoring armor.",``` +##### CoC7.ErrorUnableToParseFormula +``` "CoC7.ErrorUnableToParseFormula": "{value} is not a valid formula",``` +##### CoC7.ErrorUnableToParseSkillFormula +``` "CoC7.ErrorUnableToParseSkillFormula": "Unable to parse formula: {value} for skill {name}",``` +##### CoC7.ErrorUnexpectedSkillsText +``` "CoC7.ErrorUnexpectedSkillsText": "Unexpected skills text, please raise a bug report with the text you are attempting to import",``` +##### CoC7.ErrorUnexpectedWeaponText +``` "CoC7.ErrorUnexpectedWeaponText": "Unexpected weapons text, please raise a bug report with the text you are attempting to import",``` +##### CoC7.FINISH +``` "CoC7.FINISH": "--F-I-N-I-S-H--",``` +##### CoC7.FacingObstacle +``` "CoC7.FacingObstacle": "You are facing {type}.",``` +##### CoC7.FileUploadError +``` "CoC7.FileUploadError": "Unable to write image, file upload error",``` +##### CoC7.German +``` "CoC7.German": "German",``` +##### CoC7.GotLucky +``` "CoC7.GotLucky": "You got lucky, this time...",``` +##### CoC7.Hazard +``` "CoC7.Hazard": "Hazard",``` +##### CoC7.IncludeEscapees +``` "CoC7.IncludeEscapees": "Let fastest fleeing actors participate.",``` +##### CoC7.IncludeLatecomers +``` "CoC7.IncludeLatecomers": "Let slow pursuer participate.",``` +##### CoC7.IncreaseMovementAction +``` "CoC7.IncreaseMovementAction": "Increase movement action",``` +##### CoC7.Initialize +``` "CoC7.Initialize": "Initialize",``` +##### CoC7.Initiative +``` "CoC7.Initiative": "Initiative",``` +##### CoC7.InsertLocation +``` "CoC7.InsertLocation": "Insert location",``` +##### CoC7.LocationCoordinate +``` "CoC7.LocationCoordinate": "Location set to : {x}, {y}.\nRight click to clear.\nDrag this on canvas to change the position.",``` +##### CoC7.LocationInit +``` "CoC7.LocationInit": "You can't remove a starting location",``` +##### CoC7.LocationNotEmpty +``` "CoC7.LocationNotEmpty": "You can't remove a location with an actor",``` +##### CoC7.Locations +``` "CoC7.Locations": "Chase locations",``` +##### CoC7.LuckNotEnough +``` "CoC7.LuckNotEnough": "{name} didn't have enough luck to pass the check",``` +##### CoC7.MakeActive +``` "CoC7.MakeActive": "Make Active",``` +##### CoC7.MaxPossibleSanLoss +``` "CoC7.MaxPossibleSanLoss": "Max Possible loss",``` +##### CoC7.MessageRollingCharacteristic +``` "CoC7.MessageRollingCharacteristic": "Rolling characteristic {label}: {formula}",``` +##### CoC7.Migrate.ErrorActor +``` "CoC7.Migrate.ErrorActor": "Failed CoC7 system migration for Actor {name}: {message}",``` +##### CoC7.Migrate.ErrorDocumentPack +``` "CoC7.Migrate.ErrorDocumentPack": "Failed CoC7 system migration for document {name} in pack {collection}: {message}",``` +##### CoC7.Migrate.ErrorItem +``` "CoC7.Migrate.ErrorItem": "Failed CoC7 system migration for Item {name}: {message}",``` +##### CoC7.Migrate.ErrorMacro +``` "CoC7.Migrate.ErrorMacro": "Failed CoC7 system migration for Macro {name}: {message}",``` +##### CoC7.Migrate.ErrorScene +``` "CoC7.Migrate.ErrorScene": "Failed CoC7 system migration for Scene {name}: {message}",``` +##### CoC7.Migrate.ErrorTable +``` "CoC7.Migrate.ErrorTable": "Failed CoC7 system migration for Table {name}: {message}",``` +##### CoC7.MoveBackward +``` "CoC7.MoveBackward": "Go back",``` +##### CoC7.MoveForward +``` "CoC7.MoveForward": "Move forward",``` +##### CoC7.MoveToLocation +``` "CoC7.MoveToLocation": "You're moving to the next location.",``` +##### CoC7.MovementAction +``` "CoC7.MovementAction": "Movement action",``` +##### CoC7.NeedMin2Participants +``` "CoC7.NeedMin2Participants": "You need to have a chaser and a prey to start a chase!",``` +##### CoC7.NeedRecalculate +``` "CoC7.NeedRecalculate": "Recalculation needed",``` +##### CoC7.NeedToRecalculate +``` "CoC7.NeedToRecalculate": "All participant will have their movement action recalculated",``` +##### CoC7.Negotiate +``` "CoC7.Negotiate": "Negotiate",``` +##### CoC7.NextRound +``` "CoC7.NextRound": "Next round",``` +##### CoC7.NoDamageDealt +``` "CoC7.NoDamageDealt": "No damage dealt",``` +##### CoC7.NoValidCheck +``` "CoC7.NoValidCheck": "No valid check",``` +##### CoC7.NoValidSkill +``` "CoC7.NoValidSkill": "Fake skill",``` +##### CoC7.NotAllHaveSpeedRoll +``` "CoC7.NotAllHaveSpeedRoll": "Some participants don't have a speed roll!",``` +##### CoC7.NothingToRoll +``` "CoC7.NothingToRoll": "Nothing to roll!",``` +##### CoC7.Obstacle +``` "CoC7.Obstacle": "Something in the way",``` +##### CoC7.ObstacleDamage +``` "CoC7.ObstacleDamage": "Obstacle damage",``` +##### CoC7.ObstacleFail +``` "CoC7.ObstacleFail": "You fail.",``` +##### CoC7.ObstacleFumble +``` "CoC7.ObstacleFumble": "You fail misarably !",``` +##### CoC7.ObstacleHasHitPoint +``` "CoC7.ObstacleHasHitPoint": "Toggle location's hit points.",``` +##### CoC7.ObstacleName +``` "CoC7.ObstacleName": "Obstacle name:",``` +##### CoC7.ObstaclePassed +``` "CoC7.ObstaclePassed": "You succeesfully found a way.",``` +##### CoC7.OpenObstacleResolutionCard +``` "CoC7.OpenObstacleResolutionCard": "Start obstacle resolution flow card.",``` +##### CoC7.OverrideCalc +``` "CoC7.OverrideCalc": "Override calculation",``` +##### CoC7.ParticipantAlreadyProcessed +``` "CoC7.ParticipantAlreadyProcessed": "Participant was already processed.",``` +##### CoC7.ParticipantDataMissing +``` "CoC7.ParticipantDataMissing": "Participant data missing",``` +##### CoC7.ParticipantDropHint +``` "CoC7.ParticipantDropHint": "You can drop and actor on this window or directly on a chase location.",``` +##### CoC7.ParticipantNotEnoughMovement +``` "CoC7.ParticipantNotEnoughMovement": "Particpant {assistantUuid} only has {actions} movement actions",``` +##### CoC7.ParticipantNotFound +``` "CoC7.ParticipantNotFound": "Cannot find participant",``` +##### CoC7.ParticipantUuidNotFound +``` "CoC7.ParticipantUuidNotFound": "Cannot find participant {participantUuid}",``` +##### CoC7.ParticipantsList +``` "CoC7.ParticipantsList": "Participants list",``` +##### CoC7.PenaltyDice +``` "CoC7.PenaltyDice": "Penalty Dice",``` +##### CoC7.PenaltyDieSelfReason +``` "CoC7.PenaltyDieSelfReason": "Add 1 penalty die (for being prone, restrained...)",``` +##### CoC7.PickDirectory +``` "CoC7.PickDirectory": "Pick Directory",``` +##### CoC7.PlayerMovesToLocation +``` "CoC7.PlayerMovesToLocation": "PLayer is moving to the next location",``` +##### CoC7.Polish +``` "CoC7.Polish": "Polish",``` +##### CoC7.ReflectObstacleChanges +``` "CoC7.ReflectObstacleChanges": "Reflect changes to obstacle",``` +##### CoC7.Remove +``` "CoC7.Remove": "Remove",``` +##### CoC7.RemoveBonusDie +``` "CoC7.RemoveBonusDie": "Remove bonus die",``` +##### CoC7.RemoveLocation +``` "CoC7.RemoveLocation": "Remove location",``` +##### CoC7.RemoveObstacle +``` "CoC7.RemoveObstacle": "Destroy Obstacle",``` +##### CoC7.Reset +``` "CoC7.Reset": "Reset",``` +##### CoC7.Restart +``` "CoC7.Restart": "Restart",``` +##### CoC7.RollDifficultyCriticalTitle +``` "CoC7.RollDifficultyCriticalTitle": "Critical difficulty",``` +##### CoC7.RollDifficultyExtremeTitle +``` "CoC7.RollDifficultyExtremeTitle": "Extreme difficulty",``` +##### CoC7.RollDifficultyHardTitle +``` "CoC7.RollDifficultyHardTitle": "Hard difficulty",``` +##### CoC7.RollDifficultyRegularTitle +``` "CoC7.RollDifficultyRegularTitle": "Regular difficulty",``` +##### CoC7.Sane +``` "CoC7.Sane": "Sane",``` +##### CoC7.SelectNewSkill +``` "CoC7.SelectNewSkill": "Select skill",``` +##### CoC7.Settings.DholeUpload.Directory.Hint +``` "CoC7.Settings.DholeUpload.Directory.Hint": "Upload path for The Dhole's House avatars, relative to the Foundry/Data directory.",``` +##### CoC7.Settings.DholeUpload.Directory.Name +``` "CoC7.Settings.DholeUpload.Directory.Name": "The Dhole's House image upload directory",``` +##### CoC7.SkillXpGainDisabled +``` "CoC7.SkillXpGainDisabled": "XP Gain disabled.",``` +##### CoC7.SomethingInTheWay +``` "CoC7.SomethingInTheWay": "There is something in the way",``` +##### CoC7.SpeedCheck +``` "CoC7.SpeedCheck": "Speed check",``` +##### CoC7.StartingIndex +``` "CoC7.StartingIndex": "Starting index of fleeing actors",``` +##### CoC7.StartingRange +``` "CoC7.StartingRange": "Starting locations advance",``` +##### CoC7.TextFieldInvalidJSON +``` "CoC7.TextFieldInvalidJSON": "Unable to parse the JSON, please try again",``` +##### CoC7.TooFast +``` "CoC7.TooFast": "Too fast",``` +##### CoC7.TooSlow +``` "CoC7.TooSlow": "Too slow",``` +##### CoC7.TryToBreak +``` "CoC7.TryToBreak": "You try to break down that barrier.",``` +##### CoC7.TryToGetPastBarriers +``` "CoC7.TryToGetPastBarriers": "You try to get past that barrier.",``` +##### CoC7.TryToNegotiateHazard +``` "CoC7.TryToNegotiateHazard": "You try to negotiate that hazard.",``` +##### CoC7.UnableToUploadDholeImage +``` "CoC7.UnableToUploadDholeImage": "You do not have permission to upload images, if you import the default avatar will be used.",``` +##### CoC7.UnarmedWeaponName +``` "CoC7.UnarmedWeaponName": "Unarmed",``` +##### CoC7.Update +``` "CoC7.Update": "Update",``` +##### CoC7.UpgradeSuccessWithLuck +``` "CoC7.UpgradeSuccessWithLuck": "Upgrade to {{difficultyName}} success for {{luckToSpend}} luck.",``` +##### CoC7.VehicleChase +``` "CoC7.VehicleChase": "Chase can include vehicle (NOT IMPLEMENTED)",``` +##### CoC7.WaitForPlayerInput +``` "CoC7.WaitForPlayerInput": "Wait for player's input",``` +##### CoC7.WeaponSkillMain +``` "CoC7.WeaponSkillMain": "Main skill",``` +##### CoC7.YouLostTime +``` "CoC7.YouLostTime": "You lost time in your attempt.",``` +##### CoC7.YouTakeNoDamage +``` "CoC7.YouTakeNoDamage": "You did not suffer any injury.",``` +##### CoC7.YouTakeSomeDamage +``` "CoC7.YouTakeSomeDamage": "You take {amount} points of damage.",``` +##### CoC7.combatCard.automaticSuccess +``` "CoC7.combatCard.automaticSuccess": "Automatic Success",``` +##### CoC7.rangeCombatCard.SurprisedTargetTitle +``` "CoC7.rangeCombatCard.SurprisedTargetTitle": "1 bonus die for surprised target",``` +##### SETTINGS.ChaseShowTokenMovement +``` "SETTINGS.ChaseShowTokenMovement": "Show token movement.",``` +##### SETTINGS.ChaseShowTokenMovementHint +``` "SETTINGS.ChaseShowTokenMovementHint": "Show movement on the grid when a token is moved to the next location.",``` +##### SETTINGS.DefaultDifficulty +``` "SETTINGS.DefaultDifficulty": "Default check difficulty",``` +##### SETTINGS.TitleChaseSettings +``` "SETTINGS.TitleChaseSettings": "Chase Settings",``` +##### SETTINGS.TrustedCanModfyChatCard +``` "SETTINGS.TrustedCanModfyChatCard": "Allow trusted user to modify chat card",``` +##### SETTINGS.TrustedCanModfyChatCardHint +``` "SETTINGS.TrustedCanModfyChatCardHint": "Enabling this setting will give permission to trusted users to select options on chat card. The GM only section will still not be visible to them",``` +##### SETTINGS.TrustedCanSeeChatCard +``` "SETTINGS.TrustedCanSeeChatCard": "Allow trusted user to see GM only sections",``` +##### SETTINGS.TrustedCanSeeChatCardHint +``` "SETTINGS.TrustedCanSeeChatCardHint": "Enabling this setting will give permission to trusted users to see GM only section on chat card. Use this with caution!",``` diff --git a/.github/workflows/update-translations-page.yml b/.github/workflows/update-translations-page.yml index 63297ac0..5212b050 100644 --- a/.github/workflows/update-translations-page.yml +++ b/.github/workflows/update-translations-page.yml @@ -7,10 +7,11 @@ on: - 'lang/*.json' jobs: translations: + if: github.repository_owner == 'Miskatonic-Investigative-Society' runs-on: ubuntu-latest strategy: matrix: - node-version: [14.x] + node-version: [16.x] steps: - uses: actions/checkout@v2 - name: Use Node.js ${{ matrix.node-version }} diff --git a/.github/workflows/validate-json.yml b/.github/workflows/validate-json.yml new file mode 100644 index 00000000..3282caf0 --- /dev/null +++ b/.github/workflows/validate-json.yml @@ -0,0 +1,17 @@ +name: Validate JSONs +on: + pull_request: + branches: + - develop + paths: + - 'lang/*.json' +jobs: + verify-json-validation: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v1 + - name: Validate JSON + uses: docker://orrosenblatt/validate-json-action:latest + env: + INPUT_SCHEMA: ./lang/en.json + INPUT_JSONS: ./lang/cn.json,./lang/cs.json,./lang/de.json,./lang/es.json,./lang/fr.json,./lang/it.json,./lang/ja.json,./lang/ko.json,./lang/pl.json,./lang/pt-BR.json,./lang/sv.json,./lang/zh-TW.json diff --git a/.prettierignore b/.prettierignore index e91f64f4..2e59003e 100644 --- a/.prettierignore +++ b/.prettierignore @@ -1,3 +1,4 @@ *.css *.hbs *.html +lib/ diff --git a/README.md b/README.md index ad7eb6ca..4b9cd7f3 100644 --- a/README.md +++ b/README.md @@ -9,6 +9,7 @@ +Usage | @@ -60,4 +61,6 @@ Foundry VTT support is covered by [Limited License Agreement for Module Developm This project uses some assets from Game Icons, thanks to its [authors](https://game-icons.net/about.html#authors). +This project uses [socketlib](https://github.com/manuelVo/foundryvtt-socketlib) by Manuel Vögele which is licensed under [MIT](lib/socketlib/LICENSE). + This system uses trademarks and/or copyrights owned by Chaosium Inc/Moon Design Publications LLC, which are used under [Chaosium Inc's Fan Material Policy](https://www.chaosium.com/fan-material-policy/). We are expressly prohibited from charging you to use or access this content. This system is not published, endorsed, or specifically approved by Chaosium Inc. For more information about Chaosium Inc's products, please visit www.chaosium.com. diff --git a/assets/icons/arm-sling.svg b/assets/icons/arm-sling.svg index a8a9caf6..79fde95e 100644 --- a/assets/icons/arm-sling.svg +++ b/assets/icons/arm-sling.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/assets/icons/barrier.svg b/assets/icons/barrier.svg new file mode 100644 index 00000000..90bc7ede --- /dev/null +++ b/assets/icons/barrier.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/cultist.svg b/assets/icons/cultist.svg new file mode 100644 index 00000000..edc5f321 --- /dev/null +++ b/assets/icons/cultist.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/floating-tentacles.svg b/assets/icons/floating-tentacles.svg new file mode 100644 index 00000000..132ca6a4 --- /dev/null +++ b/assets/icons/floating-tentacles.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/hazard-sign.svg b/assets/icons/hazard-sign.svg new file mode 100644 index 00000000..928c8df2 --- /dev/null +++ b/assets/icons/hazard-sign.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/heart-beats.svg b/assets/icons/heart-beats.svg index 7d2d7713..daf7d609 100644 --- a/assets/icons/heart-beats.svg +++ b/assets/icons/heart-beats.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/assets/icons/knocked-out-stars.svg b/assets/icons/knocked-out-stars.svg index feb47e43..2fa8b64f 100644 --- a/assets/icons/knocked-out-stars.svg +++ b/assets/icons/knocked-out-stars.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/assets/icons/red-pin.svg b/assets/icons/red-pin.svg new file mode 100644 index 00000000..d3000191 --- /dev/null +++ b/assets/icons/red-pin.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/skills/accounting.svg b/assets/icons/skills/accounting.svg new file mode 100644 index 00000000..9ae48b2d --- /dev/null +++ b/assets/icons/skills/accounting.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/skills/animal_handling.svg b/assets/icons/skills/animal_handling.svg new file mode 100644 index 00000000..5feb51a9 --- /dev/null +++ b/assets/icons/skills/animal_handling.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/skills/anthropology.svg b/assets/icons/skills/anthropology.svg new file mode 100644 index 00000000..bc467b0d --- /dev/null +++ b/assets/icons/skills/anthropology.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/skills/appraise.svg b/assets/icons/skills/appraise.svg new file mode 100644 index 00000000..8297a4d6 --- /dev/null +++ b/assets/icons/skills/appraise.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/skills/archaeology.svg b/assets/icons/skills/archaeology.svg new file mode 100644 index 00000000..b4d92a76 --- /dev/null +++ b/assets/icons/skills/archaeology.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/skills/art_craft_acting.svg b/assets/icons/skills/art_craft_acting.svg new file mode 100644 index 00000000..050b01e9 --- /dev/null +++ b/assets/icons/skills/art_craft_acting.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/skills/art_craft_any.svg b/assets/icons/skills/art_craft_any.svg new file mode 100644 index 00000000..8623fdee --- /dev/null +++ b/assets/icons/skills/art_craft_any.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/skills/art_craft_fine_art.svg b/assets/icons/skills/art_craft_fine_art.svg new file mode 100644 index 00000000..47c515fc --- /dev/null +++ b/assets/icons/skills/art_craft_fine_art.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/skills/art_craft_forgery.svg b/assets/icons/skills/art_craft_forgery.svg new file mode 100644 index 00000000..b5594c3c --- /dev/null +++ b/assets/icons/skills/art_craft_forgery.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/skills/art_craft_photography.svg b/assets/icons/skills/art_craft_photography.svg new file mode 100644 index 00000000..75e5c377 --- /dev/null +++ b/assets/icons/skills/art_craft_photography.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/skills/cartwheel.svg b/assets/icons/skills/cartwheel.svg new file mode 100644 index 00000000..2fc8af6f --- /dev/null +++ b/assets/icons/skills/cartwheel.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/skills/charm.svg b/assets/icons/skills/charm.svg new file mode 100644 index 00000000..163ea3d8 --- /dev/null +++ b/assets/icons/skills/charm.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/skills/classical_knowledge.svg b/assets/icons/skills/classical_knowledge.svg new file mode 100644 index 00000000..eebedb63 --- /dev/null +++ b/assets/icons/skills/classical_knowledge.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/skills/climb.svg b/assets/icons/skills/climb.svg new file mode 100644 index 00000000..998cc229 --- /dev/null +++ b/assets/icons/skills/climb.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/skills/computer_use.svg b/assets/icons/skills/computer_use.svg new file mode 100644 index 00000000..d2d62934 --- /dev/null +++ b/assets/icons/skills/computer_use.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/skills/credit_rating.svg b/assets/icons/skills/credit_rating.svg new file mode 100644 index 00000000..fe687a67 --- /dev/null +++ b/assets/icons/skills/credit_rating.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/skills/cthulhu_mythos.svg b/assets/icons/skills/cthulhu_mythos.svg new file mode 100644 index 00000000..5f46ddc8 --- /dev/null +++ b/assets/icons/skills/cthulhu_mythos.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/skills/demolitions.svg b/assets/icons/skills/demolitions.svg new file mode 100644 index 00000000..64ad98ef --- /dev/null +++ b/assets/icons/skills/demolitions.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/skills/disguise.svg b/assets/icons/skills/disguise.svg new file mode 100644 index 00000000..aa1f22b4 --- /dev/null +++ b/assets/icons/skills/disguise.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/skills/diving.svg b/assets/icons/skills/diving.svg new file mode 100644 index 00000000..7a4595f9 --- /dev/null +++ b/assets/icons/skills/diving.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/skills/diving_helmet.svg b/assets/icons/skills/diving_helmet.svg new file mode 100644 index 00000000..2a64aca0 --- /dev/null +++ b/assets/icons/skills/diving_helmet.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/skills/dodge.svg b/assets/icons/skills/dodge.svg new file mode 100644 index 00000000..b63e1bda --- /dev/null +++ b/assets/icons/skills/dodge.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/skills/drive_auto.svg b/assets/icons/skills/drive_auto.svg new file mode 100644 index 00000000..5fee4ff4 --- /dev/null +++ b/assets/icons/skills/drive_auto.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/skills/electrical_repair.svg b/assets/icons/skills/electrical_repair.svg new file mode 100644 index 00000000..7c4b7df7 --- /dev/null +++ b/assets/icons/skills/electrical_repair.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/skills/electronics.svg b/assets/icons/skills/electronics.svg new file mode 100644 index 00000000..e9759079 --- /dev/null +++ b/assets/icons/skills/electronics.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/skills/fast_talk.svg b/assets/icons/skills/fast_talk.svg new file mode 100644 index 00000000..1d2311b1 --- /dev/null +++ b/assets/icons/skills/fast_talk.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/skills/fighting_axe.svg b/assets/icons/skills/fighting_axe.svg new file mode 100644 index 00000000..f18ac107 --- /dev/null +++ b/assets/icons/skills/fighting_axe.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/skills/fighting_brawl.svg b/assets/icons/skills/fighting_brawl.svg new file mode 100644 index 00000000..d01caf16 --- /dev/null +++ b/assets/icons/skills/fighting_brawl.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/skills/fighting_chainsaw.svg b/assets/icons/skills/fighting_chainsaw.svg new file mode 100644 index 00000000..0d2010bb --- /dev/null +++ b/assets/icons/skills/fighting_chainsaw.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/skills/fighting_flail.svg b/assets/icons/skills/fighting_flail.svg new file mode 100644 index 00000000..cbc1bc2d --- /dev/null +++ b/assets/icons/skills/fighting_flail.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/skills/fighting_garrote.svg b/assets/icons/skills/fighting_garrote.svg new file mode 100644 index 00000000..bd7714d3 --- /dev/null +++ b/assets/icons/skills/fighting_garrote.svg @@ -0,0 +1 @@ + diff --git a/assets/icons/skills/fighting_spear.svg b/assets/icons/skills/fighting_spear.svg new file mode 100644 index 00000000..34bb74f4 --- /dev/null +++ b/assets/icons/skills/fighting_spear.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/skills/fighting_sword.svg b/assets/icons/skills/fighting_sword.svg new file mode 100644 index 00000000..c435486e --- /dev/null +++ b/assets/icons/skills/fighting_sword.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/skills/fighting_throw.svg b/assets/icons/skills/fighting_throw.svg new file mode 100644 index 00000000..1de4870e --- /dev/null +++ b/assets/icons/skills/fighting_throw.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/skills/fighting_whip.svg b/assets/icons/skills/fighting_whip.svg new file mode 100644 index 00000000..abdc626a --- /dev/null +++ b/assets/icons/skills/fighting_whip.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/skills/firearms_artillery.svg b/assets/icons/skills/firearms_artillery.svg new file mode 100644 index 00000000..e7734542 --- /dev/null +++ b/assets/icons/skills/firearms_artillery.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/skills/firearms_bow.svg b/assets/icons/skills/firearms_bow.svg new file mode 100644 index 00000000..1ddd83f0 --- /dev/null +++ b/assets/icons/skills/firearms_bow.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/skills/firearms_flamethrower.svg b/assets/icons/skills/firearms_flamethrower.svg new file mode 100644 index 00000000..03a9d191 --- /dev/null +++ b/assets/icons/skills/firearms_flamethrower.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/skills/firearms_handgun.svg b/assets/icons/skills/firearms_handgun.svg new file mode 100644 index 00000000..70542d8b --- /dev/null +++ b/assets/icons/skills/firearms_handgun.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/skills/firearms_heavy_weapons.svg b/assets/icons/skills/firearms_heavy_weapons.svg new file mode 100644 index 00000000..4bfb7e3b --- /dev/null +++ b/assets/icons/skills/firearms_heavy_weapons.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/skills/firearms_machine_gun.svg b/assets/icons/skills/firearms_machine_gun.svg new file mode 100644 index 00000000..e5c5dce7 --- /dev/null +++ b/assets/icons/skills/firearms_machine_gun.svg @@ -0,0 +1 @@ + diff --git a/assets/icons/skills/firearms_rifle_shotgun.svg b/assets/icons/skills/firearms_rifle_shotgun.svg new file mode 100644 index 00000000..9184c7fb --- /dev/null +++ b/assets/icons/skills/firearms_rifle_shotgun.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/skills/firearms_submachine_gun.svg b/assets/icons/skills/firearms_submachine_gun.svg new file mode 100644 index 00000000..99900884 --- /dev/null +++ b/assets/icons/skills/firearms_submachine_gun.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/skills/first_aid.svg b/assets/icons/skills/first_aid.svg new file mode 100644 index 00000000..e9224538 --- /dev/null +++ b/assets/icons/skills/first_aid.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/skills/history.svg b/assets/icons/skills/history.svg new file mode 100644 index 00000000..930caf18 --- /dev/null +++ b/assets/icons/skills/history.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/skills/hypnosis.svg b/assets/icons/skills/hypnosis.svg new file mode 100644 index 00000000..b7b4b4c9 --- /dev/null +++ b/assets/icons/skills/hypnosis.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/skills/intimidate.svg b/assets/icons/skills/intimidate.svg new file mode 100644 index 00000000..6af0ba15 --- /dev/null +++ b/assets/icons/skills/intimidate.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/skills/jump.svg b/assets/icons/skills/jump.svg new file mode 100644 index 00000000..1edd0599 --- /dev/null +++ b/assets/icons/skills/jump.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/skills/language.svg b/assets/icons/skills/language.svg new file mode 100644 index 00000000..26de1f2c --- /dev/null +++ b/assets/icons/skills/language.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/skills/lasso.svg b/assets/icons/skills/lasso.svg new file mode 100644 index 00000000..f0dbe251 --- /dev/null +++ b/assets/icons/skills/lasso.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/skills/laurel_crown.svg b/assets/icons/skills/laurel_crown.svg new file mode 100644 index 00000000..2e987a33 --- /dev/null +++ b/assets/icons/skills/laurel_crown.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/skills/law.svg b/assets/icons/skills/law.svg new file mode 100644 index 00000000..a07f809c --- /dev/null +++ b/assets/icons/skills/law.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/skills/library_use.svg b/assets/icons/skills/library_use.svg new file mode 100644 index 00000000..b4a27b6c --- /dev/null +++ b/assets/icons/skills/library_use.svg @@ -0,0 +1 @@ + diff --git a/assets/icons/skills/listen.svg b/assets/icons/skills/listen.svg new file mode 100644 index 00000000..d81ebded --- /dev/null +++ b/assets/icons/skills/listen.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/skills/locksmith.svg b/assets/icons/skills/locksmith.svg new file mode 100644 index 00000000..a0cb4618 --- /dev/null +++ b/assets/icons/skills/locksmith.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/skills/mechanical_repair.svg b/assets/icons/skills/mechanical_repair.svg new file mode 100644 index 00000000..6cf906ff --- /dev/null +++ b/assets/icons/skills/mechanical_repair.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/skills/medicine.svg b/assets/icons/skills/medicine.svg new file mode 100644 index 00000000..ef407994 --- /dev/null +++ b/assets/icons/skills/medicine.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/skills/natural_world.svg b/assets/icons/skills/natural_world.svg new file mode 100644 index 00000000..ce67827b --- /dev/null +++ b/assets/icons/skills/natural_world.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/skills/navigate.svg b/assets/icons/skills/navigate.svg new file mode 100644 index 00000000..401a5987 --- /dev/null +++ b/assets/icons/skills/navigate.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/skills/occult.svg b/assets/icons/skills/occult.svg new file mode 100644 index 00000000..ffd075f3 --- /dev/null +++ b/assets/icons/skills/occult.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/skills/operate_heavy_machinery.svg b/assets/icons/skills/operate_heavy_machinery.svg new file mode 100644 index 00000000..65fe2bf1 --- /dev/null +++ b/assets/icons/skills/operate_heavy_machinery.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/skills/persuade.svg b/assets/icons/skills/persuade.svg new file mode 100644 index 00000000..ad75ba7d --- /dev/null +++ b/assets/icons/skills/persuade.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/skills/pilot_any.svg b/assets/icons/skills/pilot_any.svg new file mode 100644 index 00000000..7eba3ab9 --- /dev/null +++ b/assets/icons/skills/pilot_any.svg @@ -0,0 +1 @@ + diff --git a/assets/icons/skills/poker-hand.svg b/assets/icons/skills/poker-hand.svg new file mode 100644 index 00000000..92a3740b --- /dev/null +++ b/assets/icons/skills/poker-hand.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/skills/psychoanalysis.svg b/assets/icons/skills/psychoanalysis.svg new file mode 100644 index 00000000..c32f3612 --- /dev/null +++ b/assets/icons/skills/psychoanalysis.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/skills/psychology.svg b/assets/icons/skills/psychology.svg new file mode 100644 index 00000000..a9b40d8b --- /dev/null +++ b/assets/icons/skills/psychology.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/skills/read_lips.svg b/assets/icons/skills/read_lips.svg new file mode 100644 index 00000000..2aef9d33 --- /dev/null +++ b/assets/icons/skills/read_lips.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/skills/ride.svg b/assets/icons/skills/ride.svg new file mode 100644 index 00000000..371a4ad2 --- /dev/null +++ b/assets/icons/skills/ride.svg @@ -0,0 +1 @@ + diff --git a/assets/icons/skills/science_any.svg b/assets/icons/skills/science_any.svg new file mode 100644 index 00000000..640362c3 --- /dev/null +++ b/assets/icons/skills/science_any.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/skills/science_astronomy.svg b/assets/icons/skills/science_astronomy.svg new file mode 100644 index 00000000..9f6bf447 --- /dev/null +++ b/assets/icons/skills/science_astronomy.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/skills/science_biology.svg b/assets/icons/skills/science_biology.svg new file mode 100644 index 00000000..1842ed4d --- /dev/null +++ b/assets/icons/skills/science_biology.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/skills/science_botany.svg b/assets/icons/skills/science_botany.svg new file mode 100644 index 00000000..ed949236 --- /dev/null +++ b/assets/icons/skills/science_botany.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/skills/science_chemistry.svg b/assets/icons/skills/science_chemistry.svg new file mode 100644 index 00000000..18e19bea --- /dev/null +++ b/assets/icons/skills/science_chemistry.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/skills/science_cryptography.svg b/assets/icons/skills/science_cryptography.svg new file mode 100644 index 00000000..afb25a47 --- /dev/null +++ b/assets/icons/skills/science_cryptography.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/skills/science_forensics.svg b/assets/icons/skills/science_forensics.svg new file mode 100644 index 00000000..e1085a2e --- /dev/null +++ b/assets/icons/skills/science_forensics.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/skills/science_geology.svg b/assets/icons/skills/science_geology.svg new file mode 100644 index 00000000..e10e7a54 --- /dev/null +++ b/assets/icons/skills/science_geology.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/skills/science_mathematics.svg b/assets/icons/skills/science_mathematics.svg new file mode 100644 index 00000000..07532b6b --- /dev/null +++ b/assets/icons/skills/science_mathematics.svg @@ -0,0 +1 @@ + diff --git a/assets/icons/skills/science_meteorology.svg b/assets/icons/skills/science_meteorology.svg new file mode 100644 index 00000000..b68bf443 --- /dev/null +++ b/assets/icons/skills/science_meteorology.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/skills/science_pharmacy.svg b/assets/icons/skills/science_pharmacy.svg new file mode 100644 index 00000000..0ca15112 --- /dev/null +++ b/assets/icons/skills/science_pharmacy.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/skills/science_physics.svg b/assets/icons/skills/science_physics.svg new file mode 100644 index 00000000..b51f53e2 --- /dev/null +++ b/assets/icons/skills/science_physics.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/skills/science_zoology.svg b/assets/icons/skills/science_zoology.svg new file mode 100644 index 00000000..17c41213 --- /dev/null +++ b/assets/icons/skills/science_zoology.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/skills/shaking-hands.svg b/assets/icons/skills/shaking-hands.svg new file mode 100644 index 00000000..811d35e3 --- /dev/null +++ b/assets/icons/skills/shaking-hands.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/skills/sleight_of_hand.svg b/assets/icons/skills/sleight_of_hand.svg new file mode 100644 index 00000000..fdd02218 --- /dev/null +++ b/assets/icons/skills/sleight_of_hand.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/skills/spanner.svg b/assets/icons/skills/spanner.svg new file mode 100644 index 00000000..eedf1afc --- /dev/null +++ b/assets/icons/skills/spanner.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/skills/spot_hidden.svg b/assets/icons/skills/spot_hidden.svg new file mode 100644 index 00000000..d0d73815 --- /dev/null +++ b/assets/icons/skills/spot_hidden.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/skills/stealth.svg b/assets/icons/skills/stealth.svg new file mode 100644 index 00000000..dcab84a6 --- /dev/null +++ b/assets/icons/skills/stealth.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/skills/survival_any.svg b/assets/icons/skills/survival_any.svg new file mode 100644 index 00000000..e8aca530 --- /dev/null +++ b/assets/icons/skills/survival_any.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/skills/swim.svg b/assets/icons/skills/swim.svg new file mode 100644 index 00000000..68aa64b7 --- /dev/null +++ b/assets/icons/skills/swim.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/skills/track.svg b/assets/icons/skills/track.svg new file mode 100644 index 00000000..7d78266e --- /dev/null +++ b/assets/icons/skills/track.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/skills/wolf-trap.svg b/assets/icons/skills/wolf-trap.svg new file mode 100644 index 00000000..c8c04432 --- /dev/null +++ b/assets/icons/skills/wolf-trap.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/time-trap.svg b/assets/icons/time-trap.svg new file mode 100644 index 00000000..11b772a7 --- /dev/null +++ b/assets/icons/time-trap.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/tombstone.svg b/assets/icons/tombstone.svg index c53064fc..ba952ebe 100644 --- a/assets/icons/tombstone.svg +++ b/assets/icons/tombstone.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/assets/icons/whiplash.svg b/assets/icons/whiplash.svg new file mode 100644 index 00000000..0402f875 --- /dev/null +++ b/assets/icons/whiplash.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/images/chase_connector.png b/assets/images/chase_connector.png new file mode 100644 index 00000000..873b26e8 Binary files /dev/null and b/assets/images/chase_connector.png differ diff --git a/assets/images/chase_end.png b/assets/images/chase_end.png new file mode 100644 index 00000000..1ac434fb Binary files /dev/null and b/assets/images/chase_end.png differ diff --git a/assets/images/chase_mid.png b/assets/images/chase_mid.png new file mode 100644 index 00000000..ff3e3b33 Binary files /dev/null and b/assets/images/chase_mid.png differ diff --git a/assets/images/chase_start.png b/assets/images/chase_start.png new file mode 100644 index 00000000..d6d2eee0 Binary files /dev/null and b/assets/images/chase_start.png differ diff --git a/assets/manual/chases/chase_init.webp b/assets/manual/chases/chase_init.webp new file mode 100644 index 00000000..c57b54c4 Binary files /dev/null and b/assets/manual/chases/chase_init.webp differ diff --git a/assets/manual/chases/chase_initialized.webp b/assets/manual/chases/chase_initialized.webp new file mode 100644 index 00000000..e4a9d633 Binary files /dev/null and b/assets/manual/chases/chase_initialized.webp differ diff --git a/assets/manual/chases/cut_to_the_chase_1.webp b/assets/manual/chases/cut_to_the_chase_1.webp new file mode 100644 index 00000000..34cdf64d Binary files /dev/null and b/assets/manual/chases/cut_to_the_chase_1.webp differ diff --git a/assets/manual/chases/cut_to_the_chase_2.webp b/assets/manual/chases/cut_to_the_chase_2.webp new file mode 100644 index 00000000..29511932 Binary files /dev/null and b/assets/manual/chases/cut_to_the_chase_2.webp differ diff --git a/assets/manual/chases/cut_to_the_chase_3.webp b/assets/manual/chases/cut_to_the_chase_3.webp new file mode 100644 index 00000000..ee838af8 Binary files /dev/null and b/assets/manual/chases/cut_to_the_chase_3.webp differ diff --git a/assets/manual/chases/new_chase.webp b/assets/manual/chases/new_chase.webp new file mode 100644 index 00000000..4b18ad53 Binary files /dev/null and b/assets/manual/chases/new_chase.webp differ diff --git a/assets/manual/chases/new_controls.webp b/assets/manual/chases/new_controls.webp new file mode 100644 index 00000000..730fe789 Binary files /dev/null and b/assets/manual/chases/new_controls.webp differ diff --git a/assets/manual/chases/new_participant.webp b/assets/manual/chases/new_participant.webp new file mode 100644 index 00000000..2d3a4c17 Binary files /dev/null and b/assets/manual/chases/new_participant.webp differ diff --git a/assets/manual/chases/obstalce_flow_1.webp b/assets/manual/chases/obstalce_flow_1.webp new file mode 100644 index 00000000..10edac4d Binary files /dev/null and b/assets/manual/chases/obstalce_flow_1.webp differ diff --git a/assets/manual/chases/obstalce_flow_2.webp b/assets/manual/chases/obstalce_flow_2.webp new file mode 100644 index 00000000..974de586 Binary files /dev/null and b/assets/manual/chases/obstalce_flow_2.webp differ diff --git a/assets/manual/chases/obstalce_flow_3.webp b/assets/manual/chases/obstalce_flow_3.webp new file mode 100644 index 00000000..2c31ef77 Binary files /dev/null and b/assets/manual/chases/obstalce_flow_3.webp differ diff --git a/assets/manual/chases/obstalce_flow_4.webp b/assets/manual/chases/obstalce_flow_4.webp new file mode 100644 index 00000000..f65ed0ab Binary files /dev/null and b/assets/manual/chases/obstalce_flow_4.webp differ diff --git a/assets/manual/chases/participant_controls.webp b/assets/manual/chases/participant_controls.webp new file mode 100644 index 00000000..59d495d6 Binary files /dev/null and b/assets/manual/chases/participant_controls.webp differ diff --git a/assets/manual/chases/participant_list.webp b/assets/manual/chases/participant_list.webp new file mode 100644 index 00000000..2bde05dd Binary files /dev/null and b/assets/manual/chases/participant_list.webp differ diff --git a/assets/manual/chases/participant_list_2.webp b/assets/manual/chases/participant_list_2.webp new file mode 100644 index 00000000..dcb78333 Binary files /dev/null and b/assets/manual/chases/participant_list_2.webp differ diff --git a/assets/manual/chases/roll_card.webp b/assets/manual/chases/roll_card.webp new file mode 100644 index 00000000..c996f9af Binary files /dev/null and b/assets/manual/chases/roll_card.webp differ diff --git a/assets/manual/chases/setting_locations_1.webp b/assets/manual/chases/setting_locations_1.webp new file mode 100644 index 00000000..b814beb3 Binary files /dev/null and b/assets/manual/chases/setting_locations_1.webp differ diff --git a/assets/manual/chases/setting_locations_2.webp b/assets/manual/chases/setting_locations_2.webp new file mode 100644 index 00000000..db63231a Binary files /dev/null and b/assets/manual/chases/setting_locations_2.webp differ diff --git a/assets/manual/effects/changes-tab.webp b/assets/manual/effects/changes-tab.webp new file mode 100644 index 00000000..04dcbe04 Binary files /dev/null and b/assets/manual/effects/changes-tab.webp differ diff --git a/assets/manual/effects/details-tab.webp b/assets/manual/effects/details-tab.webp new file mode 100644 index 00000000..abe2d1ee Binary files /dev/null and b/assets/manual/effects/details-tab.webp differ diff --git a/assets/manual/effects/duration-tab.webp b/assets/manual/effects/duration-tab.webp new file mode 100644 index 00000000..7c05bb07 Binary files /dev/null and b/assets/manual/effects/duration-tab.webp differ diff --git a/assets/manual/effects/effects-tab.webp b/assets/manual/effects/effects-tab.webp new file mode 100644 index 00000000..3c9e8c31 Binary files /dev/null and b/assets/manual/effects/effects-tab.webp differ diff --git a/assets/manual/importer/actor.webp b/assets/manual/importer/actor.webp new file mode 100644 index 00000000..2f84b100 Binary files /dev/null and b/assets/manual/importer/actor.webp differ diff --git a/assets/manual/importer/importer.webp b/assets/manual/importer/importer.webp new file mode 100644 index 00000000..ec4f8f80 Binary files /dev/null and b/assets/manual/importer/importer.webp differ diff --git a/assets/manual/links/default-label.webp b/assets/manual/links/default-label.webp new file mode 100644 index 00000000..352acf0a Binary files /dev/null and b/assets/manual/links/default-label.webp differ diff --git a/assets/manual/links/effect-drop.webp b/assets/manual/links/effect-drop.webp new file mode 100644 index 00000000..30e52cb2 Binary files /dev/null and b/assets/manual/links/effect-drop.webp differ diff --git a/assets/manual/links/effect-link-creation.webp b/assets/manual/links/effect-link-creation.webp new file mode 100644 index 00000000..6b0c09d8 Binary files /dev/null and b/assets/manual/links/effect-link-creation.webp differ diff --git a/assets/manual/links/link-effect-chat.webp b/assets/manual/links/link-effect-chat.webp new file mode 100644 index 00000000..fde4d1df Binary files /dev/null and b/assets/manual/links/link-effect-chat.webp differ diff --git a/assets/manual/links/links-creation-tool.webp b/assets/manual/links/links-creation-tool.webp new file mode 100644 index 00000000..38d17547 Binary files /dev/null and b/assets/manual/links/links-creation-tool.webp differ diff --git a/assets/manual/links/main-window.webp b/assets/manual/links/main-window.webp new file mode 100644 index 00000000..b8cc00a4 Binary files /dev/null and b/assets/manual/links/main-window.webp differ diff --git a/docs/README.md b/docs/README.md index e008734b..f5baac77 100644 --- a/docs/README.md +++ b/docs/README.md @@ -4,4 +4,4 @@ - [English Documentation](./en) (Work in progress) - [Spanish Documentation](./es) :es: (Work in progress) -- [Documentation Française](./fr/fr.md) :fr: (En cours) +- [Documentation Française](./fr/README.md) :fr: (En cours) diff --git a/docs/en/README.md b/docs/en/README.md index c31d384a..f3fd4a8f 100644 --- a/docs/en/README.md +++ b/docs/en/README.md @@ -1,14 +1,131 @@ -## System Documentation +# System documentation for version 0.8.0 -The system automates most of the regular tasks and rules. This is a _work in progress_ to document the usage of the system. +This document is a work in progress overview of the CoC7 system it is not a tutorial for how to use FoundryVTT. -## Sections +You will need one of the following to play the game -- [Users guide](./users-guide.md) -- [Character creation](./character_creation.md) -- [Sanity](./sanity.md) -- [Links](./links.md) -- [Commands cheat sheet](./commands_cheat_sheet.md) -- [Combat](./combat.md) (TODO) -- [Items](./items.md) (TODO) -- Character development (TODO) +- Chaosium's Call of Cthulhu 7th Edition - Keeper's Rulebook +- Chaosium's Call of Cthulhu 7th Edition - Call of Cthulhu Starter Set +- Chaosium's Call of Cthulhu 7th Edition - Quick-Start Rules + +The system automates most of the regular tasks and rules involved with running a game. + +Several parts of the actor sheets have pop up tooltips that trigger after two seconds, this delay can be changed in the settings + +This documentation can be reopened under Compendiums -> JournalEntry -> System manual -> Call of Cthulhu 7th Edition (Unofficial) [en] + +# Recent changes + +For a full list of changes checkout the [changelog](https://github.com/Miskatonic-Investigative-Society/CoC7-FoundryVTT/blob/develop/.github/CHANGELOG.md) on GitHub + +- [Chases](chases.md) +- [Actor importer](actor_importer.md) - added The Dhole's House JSON support +- [Active effects](effects.md) - implementation of active effects +- Active effects added to [links](links.md) and [Link creation tool](link_creation_window.md) + +# Overview sections below + +If this is your first time it is recommends you also read the following sections on this page. + +Foundry VTT is based in actors and items. This module includes a number of system specific actors and items, and some examples of them can be found in the included system compendiums. + +- Actor overview +- Items overview +- Settings overview +- Scene menu overview +- Keyboard and mouse shortcuts +- [Creating your first investigator](first_investigator.md) +- [Character creation](character_creation.md) + +# How to use the system + +- [Active effects](effects.md) - An active effect will modify an actor characteristic(s), attribute(s), skill(s). +- [Actor importer](actor_importer.md) +- Actor Type: Character (TODO) +- Actor Type: Container (TODO) +- Actor Type: Creature (TODO) +- Actor Type: NPC (TODO) +- Chat link creator (TODO) +- Character creation mode (TODO) +- [Combat](combat.md) (TODO) +- Development phase (TODO) +- [Item Types](items.md) (TODO) +- [Item Type: Archetype](item_archetype.md) (TODO) +- [Item Type: Book](item_book.md) (TODO) +- [Item Type: Chases](chases.md) +- Item Type: Item (TODO) +- [Item Type: Occupation](item_occupation.md) +- [Item Type: Setup](item_setup.md) +- [Item Type: Skill](item_skill.md) (TODO) +- Item Type: Spell (TODO) +- Item Type: Status (TODO) +- Item Type: Talent (TODO) +- Item Type: Weapon (TODO) +- [Link Creation Tool](link_creation_window.md) +- [Links](links.md) (TODO) +- Macros (TODO) +- Rolls (TODO) +- [Sanity](sanity.md) (TODO) +- Start Rest (TODO) +- XP Gain (TODO) + +# Actor overview + +- _Character_ - A complete character, usually an investigator. [_Example Character_] +- _Container_ - An inventory container. [_Example Container_] +- _Creature_ - A more simple character, suitable for creatures. [_Example Creature_] +- _NPC_ - A more simple character, suitable for NPCs. [_Example NPC_] + +# Items overview + +- _Archetype_ - A set of skills and other stats that implement a Pulp Cthulhu archetype. These do not trigger automation in the system. [_Example Archetype_] +- _Book_ - An arcane tome that can hold spells and character improvements. +- _Item_ - A piece of equipment. +- _Occupation_ - A set of skills and other stats that implement a CoC occupation. [_Example Occupation_] +- _Setup_ - A set of default configurations for character, creature, or NPC creation. [_Example Setup_] +- _Skill_ - A skill with a base percentage and some tags. [_Example Skill_] +- _Spell_ - A magic spell. +- _Status_ - An phobia or mania condition. [_Example Mania_] +- _Talent_ -A special power for Pulp Cthulhu. These do not trigger automation in the system. [_Example Talent_] +- _Weapon_ - An item with weapon statistics (this includes unarmed attacks). [_Example Weapon_] + +# Settings overview + +Click on the Game Settings tab then under the Game Settings heading click on Configure Settings. + +Click on System Settings + +- _Variant/Optional Rules_ - Here you can turn on individual Pulp Cthulhu rules and other optional rules +- _Initiative Settings_ - Additional settings for optional initiative rule +- _Roll Settings_ - Default options for rolls +- _Chat Cards Settings_ - Configure chat messages +- _Scene Settings_ - Scene Settings +- _Game Artwork Settings_ - This allows you to set a custom pause icon and message +- _Sheet Settings_ - This allows you to change character sheet settings and optional CSS +- _Weapon Settings_ - Weapon Settings +- _Developer And Debug Settings_ - These settings can break your world when new updates are released so only use them on test worlds +- _Roll Table Settings_ - When sanity rolls are made the system can automatically roll for a bout of madness. You can see example roll tables in the Sanity Roll Table compendiums + +# Call of Cthulhu Scene Menu + +To access this menu you will need to have an active scene which can be created in the Scenes Directory. These options are only available to the Keeper. + +- _Keeper's tools_ + - _Development phase_: When enabled, players can make improvement rolls for their marked skills. + - _Character creation mode_: When enabled, players can distribute points among their skills. + - _XP gain_: When enabled, a skill will be marked for improvement after a successful check. + - _Send a decoy roll to players_: When clicked, players will see a fake GM private roll. + - _Start Rest_: When click, pick characters to perform a rest and roll for XP gains. +- _Roll !_: Used to roll 1d100 with a threshold, difficulty and bonus or penalty dice. +- _Create link_: Create a roll link for players to click + +# Keyboard and mouse shortcuts + +There are many elements in the sheets that trigger a dice roll when clicked. Usually a dialog is shown to prompt the user for a difficulty and a possible bonus or penalty. This behavior is modified with the following controls: + +- Right click on any rollable element to include it in an opposed roll. As long as the card is open, all rolls made + with a right click will be added to the opposed roll. +- Alt + Right click on any rollable element to include it in a combined roll. +- Shift + Left click on a rollable element will make a roll without asking for difficulty or bonus/penalty. +- Ctrl + Left click on a rollable element will create a roll request. Only available for the GM. +- Alt + Left click on sanity will prompt the player for minimum and maximum sanity loss. diff --git a/docs/en/actor_importer.md b/docs/en/actor_importer.md new file mode 100644 index 00000000..c413baa1 --- /dev/null +++ b/docs/en/actor_importer.md @@ -0,0 +1,52 @@ +# Actor Importer + +You can use the actor importer to import several NPC/Creatures blocks from adventures and using the JSON exporter from [The Dholes House](https://www.dholeshouse.org/) + +To open the actor importer either open the Actor Directory and click Actor Importer at the bottom of the side bar or on an active scene then click Actor Importer + +# Overview + +If this is your first time it is recommends you also read the following sections. + +- Non Playing Character (NPC) / Creature +- The Dhole's House Actor Importer JSON + +# Non Playing Character (NPC) / Creature + +![](../../assets/manual/importer/importer.webp) + +1. Select NPC or Creature +2. Should the system convert the character block from an earlier edition to 7th +3. Select the languages of the character block +4. When adding skills, items, spells, and weapons the system can attempt to find items in your world with the same name, you can select the order the seconds are searched + + _Items_: From your item directory + + _World_: From your world compendiums + + _Modules_: From your module compendiums + + _System_: From the system compendiums provided with this system + +5. An example layout is given here you can copy this to your clipboard if you want to edit it or paste in the text from an adventure + +Click import will create an actor under the Actor directory will be created in the Imported characters folder any text that was not understood will be stored in Keeper notes + +# The Dhole's House Actor Importer JSON + +![](../../assets/manual/importer/actor.webp) + +1. The Dhole's House Actor Importer JSON +2. When adding skills, items, spells, and weapons the system can attempt to find items in your world with the same name, you can select the order the seconds are searched + + _Items_: From your item directory + + _World_: From your world compendiums + + _Modules_: From your module compendiums + + _System_: From the system compendiums provided with this system + +Browse for your JSON file, once selected the name and image will be be shown, click import to create the actor under the Actor directory will be created in the Imported characters folder + +By default the image will be stored in a folder called dhole-image in your world, this can be changed by clicking on the Game Settings tab then under the Game Settings heading clicking on Configure Settings, click on System Settings. diff --git a/docs/en/character_creation.md b/docs/en/character_creation.md index 82f785f7..62c5538a 100644 --- a/docs/en/character_creation.md +++ b/docs/en/character_creation.md @@ -1,70 +1,109 @@ -# _Character Setup_ creation +# Character Creation -Setups are predefined sets of skills and a way to generate the characteristics (this can be by rolling dices or assigning certain amount of points for example). Once a setup has been created can be used during teh [Character creation](./Character_Creation.md). +The system comes with some compendiums ready for you to customise. These are reset every time you update or install the system so it is recommended you copy them into your own compendium and edit them as required. -The process to create a character setup is the following: +# Skills + +In this section you will create or edit [skills](item_skill.md) + +1. Go to compendium packs +2. Click on Create Compendium + + - Give your compendium a name (e.g. `My Skills`) + - Select _Item_ as _Document Type_ + +## Use existing skills + +1. Open up the compendium Skills +2. Drag any skills you want to customise into your new compendium + +## Create new skills + +1. Go to Items Directory +2. Cick on Create Item + + - Give the skill a name + - Set _Type_ to _Skill_ + +# Setup + +[Setups](item_setup.md) are predefined sets of skills and a way to generate the characteristics (this can be by rolling dices or assigning certain amount of points for example). Once a setup has been created it can be used in the creation of multiple characters. + +1. Go to Items Directory +2. Click on Create Item + + - Give the skill a name + - Set _Type_ to _Setup_ -1. Go to the items directory -2. Click on _Create Item_ - 2.1 Give it a name - 2.2 Select _setup_ as _Type_ - 2.3 Select the destination folder. 3. Define the setup to set the basic configuration for a type of characters. - - You can add a textual description on the _Description_ tab - - If you click on the _icon_ you can select a new one - - On the _Details_ tab you can: - - Select the _Cthulhu Flavors_ where this setup is valid - - Define the biography sections and their names (click on the `+` to add extra Biography sections) - - Drag default items - - Show / Hide the _Characteristics_ tab with the _Enable characteristics_ checkbox - - The _Characteristics_ tab allows you to define the formula to roll the dices for each characteristic - - The _Skills_ tab allows you to define the default set of skills by dragging items of type _skill_ to the _common skills_ area. + - You can add a textual description on the _Description_ tab + - If you click on the _icon_ you can select a new one + - On the _Details_ tab you can: + - Select the _Cthulhu Flavors_ where this setup is valid + - Define the biography sections and their names (click on the `+` to add extra Biography sections) + - Drag default items like [_Punch_] + - Show / Hide the _Characteristics_ tab with the _Enable characteristics_ checkbox + - The _Characteristics_ tab allows you to define the formula to roll the dices for each characteristic + - The _Skills_ tab allows you to define the default set of skills by dragging items of type _skill_ to the _common skills_ area. -# _Occupation_ creation +# Occupations -An _occupation_ helps to define the character background, think about it as the definition of the set of _occupational skills_ (the ones where the character can spend their occupation points) plus the definition of how to calculate the amount of available occupation points. Finally the _occupation_ also allows to define the minimum and the maximum _credit_ for a character with this _occupation_. +An [occupation](item_occupation.md) helps to define the character background, think about it as the definition of the set of _occupational skills_ (the ones where the character can spend their occupation points) plus the definition of how to calculate the amount of available occupation points. Finally the _occupation_ also allows to define the minimum and the maximum _credit_ for a character with this _occupation_. Keep in mind that the set of _occupational skills_ doesn't need to be fixed, the system allows to configure the _occupation_ so when it's dragged to a Character sheet will give the option of selecting one or more skills from a closed list, or even add a pre defined number of skills to select from all the available ones. -The _ocupation_ creation process is the following one: +The _occupation_ creation process is the following one: + +1. Go to Items Directory +2. Cick on Create Item + + - Give the skill a name + - Set _Type_ to _Occupation_ -1. Go to the items directory -2. Click on _Create Item_ - 2.1 Give it a name - 2.2 Select _occupation_ as _Type_ - 2.3 Selet the destination folder. 3. Define the _occupation_ to select the relevant characteristics and the occupation skills - - You can add a textual description on the _Description_ tab and define the _Source_ - - If you click on the _icon_ you can select a new one - - On the _Details_ tab you can: - - Select the _Occupation Type_ - - Define the characteristics used to calculate the _occupation points_, you can check the characteristics you want and define the multiplier, for the ones with _Optional_ marked, the player will have to choose one at creation time. - For instance if an occupation uses _EDU * 2 + (STR or DEX) * 2_ You have to select _Education_ and put _2_ on the _Multiplier_ without marking _Optional_ and then for _Strength_ and _Dexterity_ you have to check both, check _Optional_ on both, and put _2_ on the Multiplier on both. - - Finally you will have to define the _Minimum_ and _Maximum_ value for the _Credit Rating_ skill for this occupation. - - The _Skills_ tab allows you to select the _occupation skills_ by dragging items of the Type _skill_ to the different sections. A typical occupation has 8 skills plus the _Credit Rating_ skill. - - The _Common Skills_ includes the default occupation skills that can't be changed - - The _Optional skills groups_ section allows to add groups (you can create several of them) of skills for the player to choose from. Once you click on the `+` sign a group is created and you can define the _Number to chose from_ (number of skills to select) and create a pool of skills available for the selection by dragging them on the group. - - Finally the _Additional Skills_ allows you to enter a number of skills the player can choose from the rest of the available skills. + - You can add a textual description on the _Description_ tab and define the _Source_ + - If you click on the _icon_ you can select a new one + - On the _Details_ tab you can: + - Select the _Occupation Type_ + - Define the characteristics used to calculate the _occupation points_, you can check the characteristics you want and define the multiplier, for the ones with _Optional_ marked, the player will have to choose one at creation time. + + For instance if an occupation uses _EDU * 2 + (STR or DEX) * 2_ you have to select _Education_ and put _2_ on the _Multiplier_ without marking _Optional_ and then for _Strength_ and _Dexterity_ you have to check both, check _Optional_ on both, and put _2_ on the Multiplier on both. + + - Finally you will have to define the _Minimum_ and _Maximum_ value for the _Credit Rating_ skill for this occupation. + - The _Skills_ tab allows you to select the _occupation skills_ by dragging items of the Type _skill_ to the different sections. A typical occupation has 8 skills plus the _Credit Rating_ skill. + - The _Common Skills_ includes the default occupation skills that can't be changed + - The _Optional skills groups_ section allows to add groups (you can create several of them) of skills for the player to choose from. Once you click on the `+` sign a group is created and you can define the _Number to chose from_ (number of skills to select) and create a pool of skills available for the selection by dragging them on the group. + - Finally the _Additional Skills_ allows you to enter a number of skills the player can choose from the rest of the available skills. # _Player Character_ creation -You can create a _Player Character_ by creating the _actor_ and filling the corresponding blank _Character Sheet_, but it's much easier if you have previously created a _setup_ and an _occupation_ (see above), if you have created both the process to create the _Player Character_ it's the following one: - -1. Create blank character sheet: - 1. Go to the actor's tab - 2. Click on _Create Actor_ - - Give te actor a _Name_ - - Select _character_ as the _Type_ - - If desired, select the folder for the actor to be created. - - When you click on _Create New Actor_ the actor you will see the black character sheet for the actor. -2. Drag and drop a item of Type _setup_ (for instance 1920s, 1890s, Pulp, Modern,...) on the sheet to do the basic setup using the configuration defined on the item, this usually includes rolling the characteristics or setting their values with the points system, and set a default set of skills corresponding to the given setup. -3. Set the development/ character creation mode. A new tab called _Development_ should appear on the character sheet. +You can create a _Player Character_ by creating the _actor_ and filling the corresponding blank _Character Sheet_, but it's much easier if you have previously created a _setup_ and an _occupation_ (see above), if you have created both the process to create the _Player Character_ is as follows: + +1. Go to Actors Directory +2. Cick on Create Actor + + - Give the actor a name + - Set _Type_ to _Character_ + +3. Drag and drop a item of Type _setup_ (for instance 1920s, 1890s, Pulp, Modern,...) on the sheet to do the basic setup using the configuration defined on the item, this usually includes rolling the characteristics or setting their values with the points system, and set a default set of skills corresponding to the given setup. + 4. Drag and drop an _occupation_ Type item on the sheet, this will probably involve selecting some skills from a given reduced set or from the remaining ones. This will calculate the available _Personal points_ and _Occupation points_ and assign the part of the Occupation points to reach the minimum value for _Credit Rating_ of the selected occupation. -5. Distribute occupation/personal points in development tab taking on account that each skill has 5 columns: - 1. First one is the basic percentage of the skill - 2. The second one is the one to put the _Personal interest points_ during the creation of the character - 3. The third one is only available on for the _occupation_ skills (marked with a dark circle before the skill name) and it's used to assign the _Occupation points_. - 4. The forth column should be initially blank and its where the experience points will show up (you can also assign points here if you are playing an experienced character) - 5. The final column is a read only one with the final calculated value for the skill (the sum of the other 4) + +5. On the keeper's menu on the left click Keeper's tools, if this menu is not available need to have an active scene which can be created in the Scenes Directory + +6. On the new submenu click Character creation mode. A new tab called _Development_ should appear on the character sheets. + +7. Click on the characters Development tab + +8. The first dot column is for your occupational skills these can be toggled by clicking them + - If you have enabled the Pulp rule Archetypes you will have a second dot to toggle that + +9. Distribute occupation/personal points in development tab taking on account that each skill has 5 columns: + 1. First one is the basic percentage of the skill + 2. The second one is the one to put the _Personal interest points_ during the creation of the character + 3. The third one is only available on for the _occupation_ skills (marked with a dark circle before the skill name) and it's used to assign the _Occupation points_. + - If you have enabled the Pulp rule Archetypes you will have a forth column you enter your archetype points here + 4. The forth/fifth column should be initially blank and its where the experience points will show up (you can also assign points here if you are playing an experienced character) + 5. The final column is a read only one with the final calculated value for the skill (the sum of the other 4) - [Video showing the Character creation process](https://www.youtube.com/watch?v=VsQZHVXFwlk) diff --git a/docs/en/chases.md b/docs/en/chases.md new file mode 100644 index 00000000..b350f9cc --- /dev/null +++ b/docs/en/chases.md @@ -0,0 +1,148 @@ +# Creating a new chase + +To create a chase create a new item of type chase. + +Only the keeper should have access to that item. + +A chase is composed of a succession of locations. Each location can be separated by an obstacle (barrier or hazard). + +A hazard will always be crossed but failing the check will slow you down. + +A barrier will stop you until you successfully pass or destroy it. + +![](../../assets/manual/chases/new_chase.webp) + +The chase sheet is divided in 3 parts. + +- A header where you will see information about current location once a chase is started. +- A chase setup tab. This will allows you to create and follow the chase. +- A participant list where you can setup your participant. This tab will not work after the chase started. + +# Adding a participant. + +To add a participant click on the plus sign on the participant list or drag an actor or a token. + +Note that it is not mandatory to have a actor associated with a participant. This will allows for fast setup or to add someone on the fly to the chase. + +To be able to add a token to the chase a few control have been added to character and NPC sheets: + +![](../../assets/manual/chases/new_controls.webp) + +Those icons will give additional information. + +1. Indicate that this actor is a synthetic actor (instance of an actor) +2. Indicate that actor's data are not linked. Each instance of that actor has his own properties. +3. Indicate that this actor has an associated token. **You can drag and drop this onto a chase location or on the participant list**. +4. Indicate that actor's data are linked to an actor in the actors directory. + +Dragging a token to the participant list or to a location will activate the importer window. + +![](../../assets/manual/chases/new_participant.webp) + +Here you can setup your participant. All fields can be changed. Note that you can select a different initiative and speed check. This is non standard in the CoC, but allows to setup unusual chases (futuristic matrix chase, dreamlands chase...) + +1. Clicking this will change the participant side from prey to chaser. +2. Clicking this will trigger a speed check. Note that there will be no player entries necessary nor any roll card displayed. + +# Participant list + +![](../../assets/manual/chases/participant_list.webp) + +Here you can have the list of participant to the chase. + +1. Will trigger a chase roll. This will create a roll card if the participant has an associated actor (it's not a dummy). Holding shift will fast forward and solve the card. +2. This will clear the speed roll if any, or delete the participant. + +![](../../assets/manual/chases/participant_list_2.webp) + +1. Roll card waiting to get resolved in the chat. +2. Speed check rolled. You can click this to get the details. +3. To reset the speed check. + +![](../../assets/manual/chases/roll_card.webp) + +# Chase setup + +![](../../assets/manual/chases/chase_init.webp) + +To setup a chase enter the initial numbers of locations and click initialize. + +![](../../assets/manual/chases/chase_initialized.webp) + +The chase is initialized, you can adjust some options. Locations in white are initial locations and can not be modified. + +1. This is the chase track, the location in white are initials locations. The location in grey are actual chase locations. +2. Selecting this will include in the chase participants who would have otherwise been able to escape. +3. Selecting this will include in the chase participants who would have been excluded for being too slow. +4. This is the number of locations between the slowest prey and the fastest chaser. +5. This is the starting location of the fastest prey. Setting this to 0 will place him just before the start. 1 will place him at the start. -1 will place him 1 location before the start. +6. This will animate token when they move to a new location. + +# Setting up locations + +During setup or during chase you can select a location to modify it. + +Starting (white) locations can not be modified during setup. + +To modify a location select it by clicking on it. This will display the location details on the header part of the sheet. + +![](../../assets/manual/chases/setting_locations_1.webp) + +1. This will add a participant. If the chase is started the participant will be on that location. If the chase isn't started the participant will be added on the init track. +2. This will remove the location. A location has to be empty to be removed. +3. You can drag this and drop it on a scene. This will set the coordinates for that location. A red pin indicate that coordinates has been set. Right clicking a red pin will reset it's coordinate. If coordinates are set, and a participant with an associated token enter that location his token will be moved to that location. +4. Add a new location. +5. Active location. + +# Setting up obstacles. + +You can add obstacle after and before a location. You can pre-fill an obstacle with a name, an associated check and some penalties. + +![](../../assets/manual/chases/setting_locations_2.webp) + +1. Toggle this to add damage to a barrier. +2. Barrier's hit points. +3. Movement action cost in case of failure. +4. Check used to pass the location. When it's red the active actor does not have the associated check. + +# Cut to the chase. + +When you are ready you can cut to the chase. If not all participant have a speed check this will trigger a warning and will not let you start. + +![](../../assets/manual/chases/cut_to_the_chase_1.webp) + +1. Initiative track. The active participant is circled in orange. +2. Chase track. Active location and participant. You can drag drop participant from the chase track to move them freely. You can drag a new actor or token directly on the chase track. This will pop the import window and add that participant to the chase. In some cases (eg. new prey slower than the slowest participant) all movement action will be recalculated. +3. A barrier. +4. A hazard. + +# Obstacle resolution flow + +![](../../assets/manual/chases/cut_to_the_chase_2.webp) + +1. When the active participant is facing an obstacle you can trigger the obstacle resolution flow by clicking this. This will open a chat card where keeper and player can interact to pass that obstacle. All changes made to the card can be reflected to the obstacle in the chase at the end of the flow. + +Here is a shorten flow example: + +![](../../assets/manual/chases/obstalce_flow_1.webp) +![](../../assets/manual/chases/obstalce_flow_2.webp) +![](../../assets/manual/chases/obstalce_flow_3.webp) +![](../../assets/manual/chases/obstalce_flow_4.webp) + +Once the flow is complete all changes are send to the chase. + +![](../../assets/manual/chases/cut_to_the_chase_3.webp) + +This round is finished. All actor have spent their movement action. You can click Next round to proceed. + +# Participant controls. + +![](../../assets/manual/chases/participant_controls.webp) + +You can modify or move a participant by using the controls button on his card. + +1. Those 3 icons will allow to delete, modify and activate a participant. +2. Movement action. A yellow is available, grey is consumed, red is a deficit. +3. This will control your participant bonus. He can draw a gun or be awarded bonus dices. +4. Movement action controls. Here you can increase or decrease movement actions. +5. Movement controls. You can move backward or forward. You can assist an ally (consume an action and give a bonus die) or take a cautious approach. diff --git a/docs/en/combat.md b/docs/en/combat.md index 5782bb15..720b2b89 100644 --- a/docs/en/combat.md +++ b/docs/en/combat.md @@ -1,4 +1,4 @@ -## Combat +# Combat ## Starting the combat diff --git a/docs/en/commands_cheat_sheet.md b/docs/en/commands_cheat_sheet.md index cc8c5332..e0aa02e5 100644 --- a/docs/en/commands_cheat_sheet.md +++ b/docs/en/commands_cheat_sheet.md @@ -1,11 +1,11 @@ -## Commands Cheat Sheet +# Commands Cheat Sheet ## General rules Most sheet component can be clicked on the trigger a check/roll. As a general rule you can modify those requests: -- `Shift` will fast forward the request [Partial implem. (characteristics/attributes/skills only)]. +- `Shift` will fast forward the request. - `Ctrl` [GM only] will create a link in the chat with that request a roll to the players. ## Sanity diff --git a/docs/en/effects.md b/docs/en/effects.md new file mode 100644 index 00000000..1d4d8b64 --- /dev/null +++ b/docs/en/effects.md @@ -0,0 +1,59 @@ +# Effects + +The system allows for the creation of Active Effects. +An active effect will modify an actor characteristic(s), attribute(s), skill(s). +Effects can be created as a [link](links.md) using the [Link creation tool](link_creation_window.md) or directly in the character sheet by clicking the button. + +## Effects tab + +Effects will be display in the effect tabs on the character sheet. + +![effects tab](../../assets/manual/effects/effects-tab.webp) + +Effect are broken down in 4 categories for PC : + +- Status: those are effects used and created by the system (Wounds status, prone, insane ...). Those effects do not include any changes. +- Temporary: those are effects with duration. +- Passive: those are permanent effects. +- Inactive: those are disabled effects. + +For NPC/Creatures you will only see 2 sections: active and inactive effects. +When an effect is not inactive, the corresponding changes will be applied to the actor. + +## Creating effects + +You can create effect by clicking the Add button. +This will bring the effect creation window. +This windows has 3 tabs + +### Details tab + +![Details tab](../../assets/manual/effects/details-tab.webp) + +### Duration tab + +![Duration tab](../../assets/manual/effects/duration-tab.webp) + +### Changes tab + +![Changes tab](../../assets/manual/effects/changes-tab.webp) + +This last tab will includes all changes made to the character sheet. + +## Changes + +An effect includes a list of changes. Each change needs to be addressed with the corresponding data path. +The available changes are : + +- Characteristics: data.characteristics.\[characteristic\].value + - available \[characteristic\] are: str, con, siz, dex, app, int, pow, edu +- attributes: + - mov: data.attribs.mov.value + - build: data.attribs.build.value + - bonus damage: data.attribs.db.value + - armor: data.attribs.armor.value +- derived attributes. Only the maximum value of those attributes should be modified. Those changes are applied after all other changes have been made. If that attibute is in auto mode, it will be recalculated with the previous characteristics changes before having it's value affected. + - max hit points: data.attribs.hp.max + - max sanity: data.attribs.san.max +- skills. Skills are identified by their name without specialization. Skill names are case sensitive ! + - data.skills.Handgun.value diff --git a/docs/en/first_investigator.md b/docs/en/first_investigator.md new file mode 100644 index 00000000..0b30b047 --- /dev/null +++ b/docs/en/first_investigator.md @@ -0,0 +1,67 @@ +# Initial item setup + +The system comes with some compendiums ready for you to customise. These are reset every time you update or install the system so it is recommended you copy them into your own compendium and edit them as required. + +This page creates an investigator using the provided compendiums, if you are ready to full customise your character people read [Character creation](character_creation.md) instead. + +# Skill + +Click on the Compendium Packs tab then under the Item heading open up the Skills Item (CoC7). Here you will find the skills shown on the characters sheets available from Chaosium's website. + +- _No adjustment_ - Can not be assigned personal skill points. +- _No XP gain_ - You do not mark this skill for improvement on a success. +- _Specialization_ - This skill is part of a group like Pilot or Flighting. +- _Uncommon_ - This skill is uncommon and can be automatically hidden on the character sheet. +- _Pushed_ - This skill can be pushed. +- _Fighting_ - Automatically set Specialization, Combat, and the specialization name to Fighting. +- _Firearms_ - Automatically set Specialization, Combat, and the specialization name to Firearms. + +You can create a new Item Compendium and copy the skills you require into it allowing you to edit them. You can also create new skills by creating new Skill Items (Click on the Items Directory tab then Create Item give this a name e.g. Gardening and set the Type to Skill). + +## Setup + +Once you have set up your skills next create up a Setup, here is an example from the Items Examples compendium [_1920's Setup Example_] + +Setups allow to you standardise what skills, items, biography sections, and characteristics the investigators start with. + +Click on the Items Directory tab then Create Item give this a name e.g. New Investigator Setup and set the Type to Setup + +On the Description tab to set the description click the button to get an editor. + +On the Details tab click the on the Biography Sections to add any sections you require from the Create a Backstory step of investigator creation. Click on the Compendium Packs tab then under the Item heading open up the Items Examples Item (CoC7) and drag the [_Punch_] onto the setup. + +On the Characteristics tab you can customise how investigator characteristics are rolled / bought + +On the Skills tab you can drag the skills the investigator will have. + +All actor and item sheets have a tab which can be used by the Keepers to store notes, only users that are set to GM can see this tab + +## Occupation + +Occupations allow you set how many the occupation points, credit rating range, and skills the investigator starts with. Here is an example from the Items Examples compendium [_Occupation Example_] + +Click on the Items Directory tab then Create Item give this a name e.g. Driver and set the Type to Occupation + +On the Description tab to set the description click the button to get an editor. + +On the Details tab you can set the Occupation Points calculation and Minimum/Maximum Credit Rating + +On the Skills tab you can drag skills from the Compendiums or Item Directory to Common skills, you can also set up multiple Optional skill groups deciding how many the investigator must select. + +# Creating your first investigator + +## Character + +To complete your character you need to have an active scene which can be created in the Scenes Directory. + +Click on the Actors Directory tab then Create Item give this a name e.g. New Investigator and set the Type to Character. + +You can drag your setup created above on to the character for the initial setup or drag this example instead [_1920's Setup Example_] + +Next drag your occupation created above on to the character or drag this example instead [_Occupation Example_] + +On the left hand menu bar select Keeper's tools then select Character creation mode. + +On the character sheet select the Development tab. The first dot indicates this is an occupation skill, the first column of numbers is the base value, next if where you assign personal points, third is for occupation points, the fourth is for experience gained during the investigator improvement phase, the final column is the total skill percent. + +You can see how many personal and occupation points you have spent so far, once you have spent all your points you need to toggle off Character creation mode to allow characters to see their HP, MP, Sanity, and luck diff --git a/docs/en/item_archetype.md b/docs/en/item_archetype.md new file mode 100644 index 00000000..ee9da5d4 --- /dev/null +++ b/docs/en/item_archetype.md @@ -0,0 +1,15 @@ +# Item Type: Pulp Archetype + +Archetypes are used on Pulp games. They provide skill and characteristic bonuses. + +Once the _Archetype_ item has been created, the _Archetype Sheet_ is shown. +There you can define the details of the _Archetype_: + +- On the _Details_ tab you can: + - Assign the number of _Additional points_ + - Assign the number of _Pulp Talents_ + - Define the _Basic Characteristics_ and if you want to _Use a dice roll_ to generate them. + - Define the _Suggested Occupations_ + - Define the _Suggested Traits_ +- On the _Skills_ tab you can: + - Drag the _skills_ corresponding to this _Archetype_ diff --git a/docs/en/item_book.md b/docs/en/item_book.md new file mode 100644 index 00000000..6723c748 --- /dev/null +++ b/docs/en/item_book.md @@ -0,0 +1,3 @@ +# Item Type: Book + +The system has a special type of item for the books to be able to define the _Sanity Loss_, if it's a Mythos Tome or an Occult book, what _Spells_ or _Skills_ it provides and of curse a description and the book image. diff --git a/docs/en/item_occupation.md b/docs/en/item_occupation.md new file mode 100644 index 00000000..278eca59 --- /dev/null +++ b/docs/en/item_occupation.md @@ -0,0 +1,29 @@ +# Item Type: Occupation + +An _occupation_ helps to define the character background, think about it as the definition of the set of _occupational skills_ (the ones where the character can spend their occupation points) plus the definition of how to calculate the amount of available occupation points. Finally the _occupation_ also allows to define the minimum and the maximum _credit_ for a character with this _occupation_. + +Keep in mind that the set of _occupational skills_ doesn't need to be fixed, the system allows to configure the _occupation_ so when it's dragged to a Character sheet will give the option of selecting one or more skills from a closed list, or even add a pre defined number of skills to select from all the available ones. + +1. Go to the Items Directory tab +2. Click on Create Item + + 1. Give the set up a name e.g. _Librarian_ + 2. Set _Type_ to _Occupation_ + +3. On the _Description_ tab you can change the name, icon, name of the source book, and description +4. On the _Details_ tab you can control + + 1. Select the _Occupation Type_ + 2. Define the characteristics used to calculate the _occupation points_, you can check the characteristics you want and define the multiplier, for the ones with _Optional_ marked, the player will have to choose one at creation time. + + 1. For instance if an occupation uses _EDU * 2 + (STR or DEX) * 2_ You have to select _Education_ and put _2_ on the _Multiplier_ without marking _Optional_ and then for _Strength_ and _Dexterity_ you have to check both, check _Optional_ on both, and put _2_ on the Multiplier on both. + 2. Finally you will have to define the _Minimum_ and _Maximum_ value for the _Credit Rating_ skill for this occupation. + + 3. Names of biography sections (click on the `+` to add extra Biography sections), this can be replaced with a single block biography in settings + 4. Under items you can drag and drop default items and weapons + +5. On the _Skills_ you can drag and drop skills in to multiple sections, A typical occupation has 8 skills plus the _Credit Rating_ skill. + + 1. The _Common Skills_ includes the default occupation skills that can't be changed + 2. The _Optional skills groups_ section allows to add groups (you can create several of them) of skills for the player to choose from. Once you click on the `+` sign a group is created and you can define the _Number to chose from_ (number of skills to select) and create a pool of skills available for the selection by dragging them on the group. + 3. Finally the _Additional Skills_ allows you to enter a number of skills the player can choose from the rest of the available skills. diff --git a/docs/en/item_setup.md b/docs/en/item_setup.md new file mode 100644 index 00000000..8f531ba7 --- /dev/null +++ b/docs/en/item_setup.md @@ -0,0 +1,20 @@ +# Item Type: Setup + +Setups are predefined sets of skills and a way to generate the characteristics (this can be by rolling dices or assigning certain amount of points for example). + +1. Go to the Items Directory tab +2. Click on Create Item + + 1. Give the set up a name e.g. _1920's Setup_ + 2. Set _Type_ to _Setup_ + +3. On the _Description_ tab you can change the name, icon, name of the source book, and description +4. On the _Details_ tab you can control + + 1. Show / Hide the Characteristics tab with the Enable characteristics checkbox + 2. Which version of Call of Cthulhu this is for, this can be filtered in compendiums + 3. Names of biography sections (click on the `+` to add extra Biography sections), this can be replaced with a single block biography in settings + 4. Under items you can drag and drop default items and weapons + +5. On the _Characteristics_ tab you can set a points buy or roll characteristics and the formula +6. On the _Skills_ tab under common skill you can drag and drop default skills diff --git a/docs/en/item_skill.md b/docs/en/item_skill.md new file mode 100644 index 00000000..45e4658b --- /dev/null +++ b/docs/en/item_skill.md @@ -0,0 +1,19 @@ +# Item Type: Skill + +A _skill_ will be rolled during tests. + +1. Go to the Items Directory tab +2. Click on Create Item + + 1. Give the skill a name e.g. _Art/Craft (Dancing)_ + 2. Set _Type_ to _Skill_ + +3. On the _Description_ tab you can change the name, icon, Cthulhu Flavors (which editions this appears in), and description + + 1. _No adjustment_ - Can not be assigned personal skill points. + 2. _No XP gain_ - You do not mark this skill for improvement on a success. + 3. _Specialization_ - This skill is part of a group like Pilot or Flighting. + 4. _Uncommon_ - This skill is uncommon and can be automatically hidden on the character sheet. + 5. _Pushed_ - This skill can be pushed. + 6. _Fighting_ - Automatically set Specialization, Combat, and the specialization name to Fighting. + 7. _Firearms_ - Automatically set Specialization, Combat, and the specialization name to Firearms. diff --git a/docs/en/items.md b/docs/en/items.md index 426357bc..e03554ba 100644 --- a/docs/en/items.md +++ b/docs/en/items.md @@ -1,52 +1,29 @@ -## Items +# Items -The system support many different types of items, from basic items or wepons to skills or the complete setup of a type of character. You can see examples on the compendium that comes with the system. +The system support many different types of items, from basic items or weapons to skills or the complete setup of a type of character. You can see examples on the compendium that comes with the system. To create any of the types of items you always start the same way 1. Go to the items directory 2. Click on _Create Item_ - 2.1 Give it a name - 2.2 Select the item _Type_ (see below for details on each one) - 2.3 Select the destination folder. + - Give it a name + - Select the item _Type_ (see below for details on each one) + - Select the destination folder. And have some common structure so on all of them: - You can add a textual description on the _Description_ tab or just on the main window if it doesn't have tabs. - If you click on the _icon_ you can pick or upload a new one -## Pulp Archetype - -Archetypes are used on Pulp games. They provide skill and characteristic bonuses. - -Once the _Archetype_ item has been created, the _Archetype Sheet_ is shown. -There you can define the details of the _Archetype_: - -- On the _Details_ tab you can: - - Assign the number of _Additional points_ - - Assign the number of _Pulp Talents_ - - Define the _Basic Characteristics_ and if you want to _Use a dice roll_ to generate them. - - Define the _Suggested Occupations_ - - Define the _Suggested Traits_ -- On the _Skills_ tab you can: - - Drag the _skills_ corresponding to this _Archetype_ - -## Book - -The system has a special type of item for the books to be able to define the _Sanity Loss_, if it's a Mythos Tome or an Occult book, what _Spells_ or _Skills_ it provides and of curse a description and the book image. - -## Item - -## Occupation - -## Setup - -## Skill - -## Spell - -## Status - -## Talent - -## Weapon +# Available types +- [Item Type: Archetype](item_archetype.md) +- [Item Type: Book](item_book.md) +- [Item Type: Chases](chases.md) +- Item Type: Item +- [Item Type: Occupation](item_occupation.md) +- [Item Type: Setup](item_setup.md) +- [Item Type: Skill](item_skill.md) +- Item Type: Spell +- Item Type: Status +- Item Type: Talent +- Item Type: Weapon diff --git a/docs/en/link_creation_window.md b/docs/en/link_creation_window.md new file mode 100644 index 00000000..3d620024 --- /dev/null +++ b/docs/en/link_creation_window.md @@ -0,0 +1,51 @@ +# Link creation tool + +The system includes a tool to help you create links easily. +It's located on the left side bar. Click on the icon. +This tools is available to GM only. + +![Creation tool](../../assets/manual/links/links-creation-tool.webp) + +using this you can create [link](links.md) for skill check, san check, effects ... +alternatively you can open the tool by holding CTRL while clicking no an item or a skill. + +## Main window + +Clicking on the tool icon will open a window : + +![Main window](../../assets/manual/links/main-window.webp) + +You can there select options for you link. + +- "Compendium packs" and "Items directory" allows you to reference an object from corresponding folder. +- "Modifiers" will allows you to add modifiers to your check. +- "blind" will force the roll mode to be blind. +- "Label" will allows you to change the display label. +- "Icon" will allows you to choose an icon for your link. Icons can be : + - A font awesome or a game-icons reference : "fas fa-ankh" or "game-icon game-icon-tentacle-strike". + - A link to an image in the system data or system core: "icons/magic/symbols/arrowhead-green.webp". + +If you do not supply a label and/or an icon, a default label and icon will be added. + +![default label](../../assets/manual/links/default-label.webp) + +## Effects window + +Selecting effects will open an advance window where you can create links for [active effects](effects.md). +Select the options the same way you will be doing for a regular effect. + +## Using links + +- Once your link is created and valid it will appear in a white box in the middle of the window. + +![link created](../../assets/manual/links/effect-link-creation.webp) + +- You are now ready to whisper it to your players, copy it in your clipboard so you can add it to your items or journal entries or send it to the chat. + +![link in the chat](../../assets/manual/links/link-effect-chat.webp) + +- When a player clicks a link the corresponding action will be performed by his character. +- When a GM clicks a link the corresponding action will be performed by his selected tokens. +- A link drag/dropped in journal entries, on a token etc... + +![link drop](../../assets/manual/links/effect-drop.webp) diff --git a/docs/en/links.md b/docs/en/links.md index ea42c90e..f35af9e3 100644 --- a/docs/en/links.md +++ b/docs/en/links.md @@ -1,13 +1,14 @@ -## Links +# Links - Links are a way for a GM to request for a roll (Characteristic, Attribute, Skill, SAN loss, Weapon). +- Links can contain an active effect. - Links are created in the chat log. When you click a link it will trigger a check for your(s) controlled/impersonated character(s). - Links can be included in any editor, mainly journal entries. - Link can be created in 5 ways: - By manually typing it (read details below). - By CTRL+click on any sheet element (Characteristic, Attribute, skill, SAN loss). - By dragging a sheet element (Characteristic, Attribute, skill (+CTRL)) on an editor (Journal entry) - - By CTRL + dragging an item (skill or weapon) from a compendium or an item directory on an editor. When a link is created that way and the used as a GM, if your controlled character doen't hold the weapon/skill you'll be prompted to create the corresponding item. + - By CTRL + dragging an item (skill or weapon) from a compendium or an item directory on an editor. When a link is created that way and the used as a GM, if your controlled character doesn't hold the weapon/skill you'll be prompted to create the corresponding item. - By using the included compendium written by Lozalojo. - Links can be dragged from chat log on an editor. - When a link is created the difficulty/penalty selection windows will open. Hold SHIFT to bypass that comportment. @@ -17,6 +18,8 @@ ## Writing links +- Links should be written using the [Link creation tool](link_creation_window.md). The link creation window is a tool for GM. It's located in the left side bar. + Links for chat messages and sheet editors (NPC, Journal entries...). Format of link is `@coc7.TYPE_OF_REQUEST[OPTIONS]{TEXT_TO_DISPLAY}` @@ -52,6 +55,7 @@ Format of link is `@coc7.TYPE_OF_REQUEST[OPTIONS]{TEXT_TO_DISPLAY}` ### Using links - You can drag/drop links from chat to sheets and between sheets. +- You can drag/drop a link directly on a token. - You can drag/drop items and skills on a journal entry while holding CTRL, this will create the corresponding check with regular difficulty and 0 modifier. - You can create link in the chat by clicking and holding CTRL from any sheet (PC/NPC/Creature) corresponding characteristic/luck/SAN/Competence/weapon/San loss. - This will open the select penalty/difficulty dialogue. Clicking on the generated link will then trigger the check with all parameters. diff --git a/docs/en/sanity.md b/docs/en/sanity.md index 32b70ac7..9fcc10df 100644 --- a/docs/en/sanity.md +++ b/docs/en/sanity.md @@ -4,8 +4,8 @@ The system has integrated the sanity check workflow and can handle sanity rolls, ## Requesting Sanity rolls -- The Guardian can click with `Ctrl+Shift` on the _Sanity_ of character to request a Sanity Check for the character +- The Keeper can click with `Ctrl+Shift` on the _Sanity_ of character to request a Sanity Check for the character - - If the Guardian also press `Alt` (so holding at the same time `Ctrl+Shift+Alt`) while clicking on the _Sanity_ of a character, a dialog will pop-up to introduce the sanity loss if the sanity check is passed and the value for when the sanity check is failed. + - If the Keeper also press `Alt` (so holding at the same time `Ctrl+Shift+Alt`) while clicking on the _Sanity_ of a character, a dialog will pop-up to introduce the sanity loss if the sanity check is passed and the value for when the sanity check is failed. - [Video showing the Sanity check workflow](https://www.youtube.com/watch?v=yAMqHiv7eMw) diff --git a/docs/en/users-guide.md b/docs/en/users-guide.md deleted file mode 100644 index a9d7de9e..00000000 --- a/docs/en/users-guide.md +++ /dev/null @@ -1,74 +0,0 @@ -# Actors and Items - -Foundry VTT is based in actors and items. This module includes a number of system specific actors and items, -and some examples of them can be found in the included system compendiums. - -## Actors - -This system includes four types of actors: - -- character: A complete character, usually an investigator. -- npc: A more simple character, suitable for NPCs. -- creature: A non-human NPC. -- vehicle: Not yet implemented - -## Items - -As for items, these are the types available: - -- item: A piece of equipment. -- weapon: An item with weapon statistics (this includes unarmed attacks). -- skill: A skill with a base percentage and some tags. -- setup: A set of default configurations for character creation. -- occupation: A set of skills and other stats that implement a CoC occupation. -- archetype: A set of skills and other stats that implement a CoC archetype. -- book: An arcane tome. -- spell: A magic spell. -- talent: A special power for Pulp Cthulhu. -- status: An insanity condition. - -# Creating a character - -Before creating a character you should probably create some items (some of them can be taken from the compendiums): - -- A setup. You can choose some default details for all your characters, a list of default skills and a method to - generate characteristics (distributing points or rolling dice). -- A bunch of occupations. You can take their skills from the compendiums. -- You might want to create some items, weapons, talents or archetypes. - -The GM must enable 'Character creation mode' from the toolbar. - -Once you have these items, create a new actor of 'character' type, and drag your setup from the sidebar and drop it -on the character sheet. A dialog will appear to distribute points or roll dice for the characteristics. After clicking -on 'Validate', the scores will be copied to the sheet, and it will be filled with the default list of skills and their -base percentages. - -Then, drag and drop an occupation on the character sheet. If 'Character creation mode' is enabled, there will be -a 'Development' tab in the character sheet. There, each skill has a field for personal interest points, and occupation -skills have a field for occupation points. You need to distribute your points until all are spent, which you can see -in the left column of the 'Development' tab. - -You can then drag and drop any items, talents, etc. When you are finished, lock the sheet using the padlock button. - -# Tools - -There are some system specific buttons in the toolbar, available only to the GM: - -- Keeper's tools - - Development phase: when enabled, players can make improvement rolls for their marked skills. - - Character creation mode: when enabled, players can distribute points among their skills. - - XP gain: when enabled, a skill will be marked for improvement after a successful check. - - Send a decoy roll to players: when clicked, players will see a fake GM private roll. -- Roll dice: used to roll 1d100 with a threshold, difficulty and bonus or penalty dice. - -# Keyboard and mouse shortcuts - -There are many elements in the sheets that trigger a dice roll when clicked. Usually a dialog is shown to prompt the -user for a difficulty and a possible bonus or penalty. This behavior is modified with the following controls: - -- Right click on any rollable element to include it in an opposed roll. As long as the card is open, all rolls made - with a right click will be added to the opposed roll. -- Alt + Right click on any rollable element to include it in a combined roll. -- Shift + Left click on a rollable element will make a roll without asking for difficulty or bonus/penalty. -- Ctrl + Left click on a rollable element will create a roll request. Only available for the GM. -- Alt + Left click on sanity will prompt the player for minimum and maximum sanity loss. diff --git a/docs/fr/README.md b/docs/fr/README.md index a9eb6988..fba1dd81 100644 --- a/docs/fr/README.md +++ b/docs/fr/README.md @@ -277,6 +277,8 @@ Par exemple: - `@coc7.check[type:skill,icon:fas fa-arrow-alt-circle-right,name:anthropology,difficulty:+,modifier:-1]{Hard Anthropology check(-1)}` - `@coc7.check[type:skill,icon:fas fa-arrow-alt-circle-right,name:anthropology,modifier:+1]` +Jet simple: [[/roll 1d10]]{Dégâts} + \ \ \ diff --git a/generate-manuals.js b/generate-manuals.js new file mode 100644 index 00000000..2b670b7f --- /dev/null +++ b/generate-manuals.js @@ -0,0 +1,152 @@ +import { Remarkable } from 'remarkable' +import * as fs from 'fs' +import write from './node_modules/write/index.js' + +const sources = { + rmtiwtbixojhyf5v: { + name: 'Active effects', + lang: 'en', + file: 'effects.md' + }, + xV4Hxxmu6zjIMw9h: { + name: 'Actor Importer', + lang: 'en', + file: 'actor_importer.md' + }, + wZtTHpGV3atKV2oD: { + name: 'Call of Cthulhu 7th Edition (Unofficial)', + lang: 'en', + file: 'README.md' + }, + uug1mm5nokly4o2v: { + name: 'Character Creation', + lang: 'en', + file: 'character_creation.md' + }, + VdOeGcxsu3jsVm3F: { + name: 'Chases', + lang: 'en', + file: 'chases.md' + }, + nk68b2ew15iw0bb8: { + name: 'Combat', + lang: 'en', + file: 'combat.md' + }, + wilj4rvkreemh70n: { + name: 'Commands Cheat Sheet', + lang: 'en', + file: 'commands_cheat_sheet.md' + }, + nVYLlqVzmUV5dXAW: { + name: 'Creating your first investigator', + lang: 'en', + file: 'first_investigator.md' + }, + di6mcnaxfyi0y2l4: { + name: 'Items', + lang: 'en', + file: 'items.md' + }, + kv2tbz6x29cq6ewq: { + name: 'Item Type: Archetype', + lang: 'en', + file: 'item_archetype.md' + }, + oruecvy7jne4u4gt: { + name: 'Item Type: Book', + lang: 'en', + file: 'item_book.md' + }, + qa934whpkpauiyc9: { + name: 'Item Type: Occupation', + lang: 'en', + file: 'item_occupation.md' + }, + JU1GCWwc8at7gzJ4: { + name: 'Item Type: Setup', + lang: 'en', + file: 'item_setup.md' + }, + mz0ulbkecfvv8nw7: { + name: 'Item Type: Skill', + lang: 'en', + file: 'item_skill.md' + }, + fk040vqb4per5ju1: { + name: 'Links', + lang: 'en', + file: 'links.md' + }, + emuu3wo0uul91029: { + name: 'Link creation tool', + lang: 'en', + file: 'link_creation_window.md' + }, + ce7s8psgyctzx5r1: { + name: 'Sanity', + lang: 'en', + file: 'sanity.md' + } +} + +const dbFile = [] + +for (const id in sources) { + try { + const md = new Remarkable() + const input = fs.readFileSync( + './module/manual/' + sources[id].lang + '/' + sources[id].file, + 'utf8' + ) + + const source = md.render(input) + + const html = source + .replace(/
\.<\/p>/g, '
') + .replace( + /\[(fas fa-[^\]]+|game-icon game-icon-[^\]]+)\]/g, + ' ' + ) + .replace(/src="..\/..\/assets\//g, 'src="systems/CoC7/assets/') + .replace(/\n\s*/g, '\n') + .replace(/@@coc7./g, '@coc7.') + + const dbEntry = { + _id: id, + name: sources[id].name + ' [' + sources[id].lang + ']', + content: '
{actor} 没有一个 {weapon}.
你想创建一个吗 ?
{actor} 没有 {weapon}.
你想创建一个吗 ?
你的世界 需要更新才能运行版本 {version}。
请在开始升级前备份 你的世界 的文件夹。
如果你不更新你的世界,系统将无法正常工作。
更新完成后,世界 可能会重新启动。
", + "CoC7.Migrate.WithModulesMessage": "你的世界或模组可能需要更新以运行版本{version}。
在开始升级之前,请备份你的世界和下面列出的模组文件夹。
如果你不更新你的世界,系统将无法正常工作。
下面的模组包含角色或物品,所以也将被检查。
{modules}世界完成后可能被重新启动。
", + "CoC7.Migrate.GMRequired": "你的世界 需要更新才能运行版本 {version}。
请等待你的 GM 更新系统,然后刷新 (F5) 此页面。
", + "CoC7.Migrate.RestartRequired": "现在你的世界将重新启动,以启用这些变更
", + "CoC7.Migrate.ButtonUpdate": "更新", + "CoC7.Migrate.ButtonSkip": "跳过", + "CoC7.Migrate.ButtonOkay": "好的", + + "CoC7.Migrate.TriggerButton": "触发数据迁移", + "CoC7.Migrate.TriggerTitle": "触发数据迁移", + "CoC7.Migrate.TriggerContents": "开启数据迁移并重启
", + "CoC7.Migrate.TriggerRestart": "保存并重启", + + "CoC7.Settings.CoreRules.Title": "核心规则手册可选规则", + "CoC7.Settings.Rules.Name": "变体/可选规则", + "CoC7.Settings.Rules.Label": "配置变体/可选规则", + "CoC7.Settings.Rules.Hint": "配置变体/可选规则,如 通俗克苏鲁(Pulp Cthulhu)。", + "CoC7.Settings.HouseRules.Title": "公共房规则", + "CoC7.Settings.PulpRules.DoubleMaxHealth.Name": "双倍最大生命值", + "CoC7.Settings.PulpRules.DoubleMaxHealth.Hint": "最大生命值是 (CON + SIZ) / 5", + "CoC7.Settings.PulpRules.DevelopmentRollLuck.Name": "增加运气的发展卷", + "CoC7.Settings.PulpRules.DevelopmentRollLuck.Hint": "增加运气开发失败和成功的运气", + "CoC7.Settings.PulpRules.Archetype.Name": "通俗原型", + "CoC7.Settings.PulpRules.Archetype.Hint": "", + "CoC7.Settings.PulpRules.Organization.Name": "英雄组织", + "CoC7.Settings.PulpRules.Organization.Hint": "", + "CoC7.Settings.PulpRules.Talents.Name": "英雄天赋", + "CoC7.Settings.PulpRules.Talents.Hint": "", + "CoC7.Settings.PulpRules.FasterRecovery.Name": "更快的恢复", + "CoC7.Settings.PulpRules.FasterRecovery.Hint": "自然治疗增加到每天两点生命值", + "CoC7.Settings.PulpRules.IgnoreMajorWounds.Name": "忽略重伤", + "CoC7.Settings.PulpRules.IgnoreMajorWounds.Hint": "", + + "CoC7.Maximize": "最大化", + "CoC7.Summarize": "概述", + + "CoC7.UnableToInteractWithChatCard": "你无法与这条信息互动,如果你需要进行此行动,请让你的KP去帮你进行选择。", + "CoC7.UnableToCopyToClipboard": "无法复制到剪贴板,这可能是由于你的浏览器安全设定造成的。", + + "CoC7.MessageTitleSelectUserToGiveTo": "将物品交给另一个角色。", + "CoC7.MessageSelectUserToGiveTo": "你想把这个物品给哪个角色?。", + "CoC7.MessageDistanceCalculationFailure": "无法计算token之间的距离,请使用token角色表。", + + "CoC7.ToolTipSkill": "Deine Welt benötigt ein Update, um die Version {version} auszuführen.
Bitte sichere Deinen Welten Ordner bevor Du das Update startest.
Wenn Du Deine Welt nicht erneuerst, könnte sie nicht mehr korrekt funktionieren.
Die Welt sollte nach dem Update neu gestartet werden.
", + "CoC7.Migrate.WithModulesMessage": "Your world or modules may require an update to run version {version}.
Please backup your world and module folders listed below before starting the upgrade.
If you do not update your world the system will not work correctly.
The following modules contain actors or items so will also be checked.
{modules}The world may be restarted when completed.
", + "CoC7.Migrate.GMRequired": "Your world requires an update to run version {version}.
Please wait for your GM to update the system then refresh (F5) this page.
", + "CoC7.Migrate.RestartRequired": "Die Welt wird nun neu gestartet, um diese Änderungen zu übernehmen
", + "CoC7.Migrate.ButtonUpdate": "Update", + "CoC7.Migrate.ButtonSkip": "Überspringen", + "CoC7.Migrate.ButtonOkay": "Okay", + "CoC7.Maximize": "Maximieren", + "CoC7.Summarize": "Zusammenfassen", + "CoC7.UnableToInteractWithChatCard": "You are not able to interact with this message, if you need to make a change please ask your Keeper to select the options for you", + "CoC7.UnableToCopyToClipboard": "Unable to copy to clipboard, this is likely due to your browser security settings.", + "CoC7.MessageTitleSelectUserToGiveTo": "Gegenstand einem anderen Charakter geben", + "CoC7.MessageSelectUserToGiveTo": "Welchem Charakter soll der Gegenstand gegeben werden?", + "CoC7.MessageDistanceCalculationFailure": "Distanzberechnung zwischen Tokens nicht möglich, bitte nutze das Token Chrakterblatt.", + "CoC7.ToolTipSkill": "This will Clean your skill list by removing specialization from skill name.
This will avoid to display skill as : 'specialization(specialization(skill))'
", "CoC7.DevelopemmentPhase": "Development Phase", "CoC7.RecoverLuckPoints": "Recover Luck Points", "CoC7.SkillCantGainXp": "Skill can't gain XP automatically", @@ -386,6 +442,7 @@ "CoC7.DevSuccessDetails": "{item} upgraded by {augment}%", "CoC7.SanGained": "Gained 2d6 ({results} = {sanGained}) Sanity after mastering {skill} with a {skillValue}%", "CoC7.DevFailureDetails": "{item} NOT upgraded", + "CoC7.ReduceSanityLimits": "Reduced all sanity limits by one", "CoC7.DevSuccess": "{item} upgraded ({die}/{score}%) by {augment}%", "CoC7.DevFailure": "{item} NOT upgraded ({die}/{score}%)", "CoC7.LuckIncreased": "Luck recovered ({die}/{score}) by {augment} points", @@ -400,7 +457,18 @@ "CoC7.AddItem": "Add item", "CoC7.EditItem": "Edit item", "CoC7.DeleteItem": "Delete Item", - "CoC7.AddWeapon": "Add Weapon", + "CoC7.TradeItem": "Trade / Store Item", + "CoC7.SortBySkillName": "Sort by skill name", + "CoC7.SortBySkillValue": "Sort by skill percent", + "CoC7.UncommonSkillsShow": "Show uncommon skills", + "CoC7.UncommonSkillsHide": "Hide uncommon skills", + + "CoC7.NewBookName": "new book", + "CoC7.AddBook": "Add book", + "CoC7.NewSpellName": "new spell", + "CoC7.AddSpell": "Add spell", + + "CoC7.AddWeapon": "Add weapon", "CoC7.NewWeaponName": "new weapon", "CoC7.EditWeapon": "Edit Weapon", "CoC7.DeleteWeapon": "Delete Weapon", @@ -408,8 +476,10 @@ "CoC7.RangeWeapons": "Range weapons", "CoC7.WeaponName": "Name", "CoC7.WeaponSkill": "Skill", + "CoC7.WeaponSkillMain": "Main skill", "CoC7.WeaponSkillAlt": "Alt-skill", "CoC7.Inventory": "Inventory", + "CoC7.InventoryIsCurrentlyEmpty": "Inventory is currently empty.", "CoC7.CharacterDevelopment": "Development", "CoC7.OccupationSkill": "Occupation Skill", "CoC7.ArchetypeSkill": "Archetype Skill", @@ -451,6 +521,24 @@ "CoC7.BackgroundDeleteSection": "Delete section", "CoC7.BackgroundSectionMoveUp": "Move Up", "CoC7.BackgroundSectionMoveDown": "Move Down", + "CoC7.BackgroundEncounters": "Losses from Strange Entities", + "CoC7.BackgroundFlags": "Flags", + "CoC7.BackgroundFlagsMythosExperienced": "5% Insanity Mythos Awarded", + "CoC7.BackgroundFlagsMythosHardened": "Mythos Hardened", + + "CoC7.SanityLossEncounters": "Sanity Loss Encounters", + "CoC7.SanityLossImmunities": "Sanity Loss Immunities", + "CoC7.AddSanityLossEncounter": "Add Sanity Loss Encounter", + "CoC7.AddSanityLossImmunity": "Add Sanity Loss Immunity", + "CoC7.DeleteSanityLossEncounter": "Delete Sanity Loss Encounter", + "CoC7.DeleteSanityLossImmunity": "Delete Sanity Loss Immunity", + + "CoC7.SanityLossTypeDialogTitle": "New sanity loss or immunity", + "CoC7.SanityLossTypeDialogBody": "Add a new Mythos Encounter, Sanity Loss, or Sanity Immunity to the character.", + "CoC7.SanityLossTypeReason": "Reason", + "CoC7.SanityLossTypeValue": "Sanity points lost", + "CoC7.SanityLossEncounter": "Sanity loss encounter", + "CoC7.SanityLossImmunity": "Sanity loss immunity", "CoC7.creatureFightingSkill": "Fighting", @@ -487,8 +575,11 @@ "CoC7.MaxSanloss": "Max loss", "CoC7.MinSanloss": "Min loss", "CoC7.AlreadyLost": "Already lost", + "CoC7.AlreadyEncountered": "Already encountered", + "CoC7.AlreadyEncounteredInformation": "Already encountered: {reason} lost {lost}/{max}", "CoC7.CreatureMaxLoss": "Creature max loss", "CoC7.MaxLossToCreature": "Max loss to this creature", + "CoC7.MaxPossibleSanLoss": "Max Possible loss", "CoC7.ResetCreatureSan": "Reset creature's history", "CoC7.ResetSpecieSan": "Reset specie's history", "CoC7.KeepData": "Keep creature's data", @@ -502,6 +593,123 @@ "CoC7.YouGainedCthulhuMythos": "Your mind quail before the unearthly manifestation (+{value}% Cthulhu Mythos)", "CoC7.CardResolved": "Card resolved", + "CoC7.InsertLocation": "Insert location", + "CoC7.RemoveLocation": "Remove location", + "CoC7.LocationNotEmpty": "You can't remove a location with an actor", + "CoC7.LocationInit": "You can't remove a starting location", + "CoC7.SomethingInTheWay": "There is something in the way", + "CoC7.FacingObstacle": "You are facing {type}.", + "CoC7.ABarrier": "a barrier", + "CoC7.Barrier": "Barrier", + "CoC7.AHazard": "a hazard", + "CoC7.Hazard": "Hazard", + "CoC7.Obstacle": "Something in the way", + "CoC7.ConsumeBonusDice": "Consume Bonus Dice", + "CoC7.Breakable": "Breakable", + "CoC7.NoValidCheck": "No valid check", + "CoC7.NoValidSkill": "Fake skill", + "CoC7.AskIntentions": "What are your intentions ?", + "CoC7.WaitForPlayerInput": "Wait for player's input", + "CoC7.AskRoll": "Roll {name} ({value}%)", + "CoC7.ActionCost": "Action cost", + "CoC7.Negotiate": "Negotiate", + "CoC7.BreakDown": "Break Down", + "CoC7.BeingCautious": "You elect to take a cautious approach.", + "CoC7.BeingVeryCautious": "You are being very cautious.", + "CoC7.ReflectObstacleChanges": "Reflect changes to obstacle", + "CoC7.PlayerMovesToLocation": "PLayer is moving to the next location", + "CoC7.ObstaclePassed": "You succeesfully found a way.", + "CoC7.GotLucky": "You got lucky, this time...", + "CoC7.ObstacleFail": "You fail.", + "CoC7.ObstacleFumble": "You fail misarably !", + "CoC7.YouLostTime": "You lost time in your attempt.", + "CoC7.MoveToLocation": "You're moving to the next location.", + "CoC7.DontMoveToLocation": "You're staying there !", + "CoC7.ObstacleDamage": "Obstacle damage", + "CoC7.RemoveObstacle": "Destroy Obstacle", + "CoC7.YouTakeNoDamage": "You did not suffer any injury.", + "CoC7.YouTakeSomeDamage": "You take {amount} points of damage.", + "CoC7.TryToNegotiateHazard": "You try to negotiate that hazard.", + "CoC7.TryToGetPastBarriers": "You try to get past that barrier.", + "CoC7.TryToBreak": "You try to break down that barrier.", + "CoC7.DragOnCanvas": "Drag this on canvas to set the position of this location.", + "CoC7.LocationCoordinate": "Location set to : {x}, {y}.\nRight click to clear.\nDrag this on canvas to change the position.", + "CoC7.ConfirmRestartChase": "Do you want to restart the chase ?", + "CoC7.ConfirmRestartChaseHint": "This will restart your chase.\nAll position will be reseted.\nActors that did not rool a speedcheck will have to roll.", + "CoC7.ConfirmResetChase": "Do you want to restet the chase ?", + "CoC7.ConfirmResetChaseHint": "This will reset your chase.\bAll positions and obstacles will be removed.", + "CoC7.IncludeEscapees": "Let fastest fleeing actors participate.", + "CoC7.TooSlow": "Too slow", + "CoC7.TooFast": "Too fast", + "CoC7.DoesNotMeetMinimumReqToBeAdded": "Can not add participant, need at least valid movement action", + "CoC7.IncludeLatecomers": "Let slow pursuer participate.", + "CoC7.VehicleChase": "Chase can include vehicle (NOT IMPLEMENTED)", + "CoC7.StartingRange": "Starting locations advance", + "CoC7.StartingIndex": "Starting index of fleeing actors", + "CoC7.CutToTheChase": "Cut to the chase", + "CoC7.ChaseSetup": "Chase setup", + "CoC7.ParticipantsList": "Participants list", + "CoC7.NotAllHaveSpeedRoll": "Some participants don't have a speed roll!", + "CoC7.NeedMin2Participants": "You need to have a chaser and a prey to start a chase!", + "CoC7.ConfirmCut2Chase": "Are you ready to cut to the chase ?", + "CoC7.ConfirmCut2ChaseHint": "This will start the chase and the first chase round.", + "CoC7.NextRound": "Next round", + "CoC7.ConfirmNextChaseRound": "Proceed to next round ?", + "CoC7.ConfirmNextChaseRoundHint": "You still have action available on some actors. Are you sure you want to proceed ?", + "CoC7.CheckName": "Check", + "CoC7.ObstacleHasHitPoint": "Toggle location's hit points.", + "CoC7.ActionCostOnFail": "Toggle action penalty on fail.", + "CoC7.DamageOnFail": "Toggle damage on fail.", + "CoC7.OpenObstacleResolutionCard": "Start obstacle resolution flow card.", + "CoC7.AddBonusDie": "Add bonus die", + "CoC7.RemoveBonusDie": "Remove bonus die", + "CoC7.DecreaseMovementAction": "Decrease movement action", + "CoC7.IncreaseMovementAction": "Increase movement action", + "CoC7.CautiousApproach": "Take cautious approach", + "CoC7.Cautious": "Cautious", + "CoC7.Assist": "Assist ally", + "CoC7.MoveForward": "Move forward", + "CoC7.MoveBackward": "Go back", + "CoC7.AddActorToChase": "Add an actor to the chase", + "CoC7.ParticipantDropHint": "You can drop and actor on this window or directly on a chase location.", + "CoC7.OverrideCalc": "Override calculation", + "CoC7.NeedRecalculate": "Recalculation needed", + "CoC7.NeedToRecalculate": "All participant will have their movement action recalculated", + "CoC7.SpeedCheck": "Speed check", + "CoC7.Initialize": "Initialize", + "CoC7.Locations": "Chase locations", + "CoC7.NoDamageDealt": "No damage dealt", + "CoC7.DamageDealt": "You deal {value} damage.", + "CoC7.NothingToRoll": "Nothing to roll!", + "CoC7.ParticipantDataMissing": "Participant data missing", + "CoC7.ParticipantNotFound": "Cannot find participant", + "CoC7.ParticipantUuidNotFound": "Cannot find participant {participantUuid}", + "CoC7.ParticipantNotEnoughMovement": "Particpant {assistantUuid} only has {actions} movement actions", + "CoC7.ParticipantAlreadyProcessed": "Participant was already processed.", + "CoC7.ErrorEmptyLocationsList": "Empty locations list", + "CoC7.ErrorBeneficiaryAtMaxBonus": "Beneficiary {name} already has max bonus dice", + "CoC7.ErrorParticipantAtMaxBonus": "{participantUuid} already has max bonus dice", + "CoC7.ErrorTokenNotOnScene": "Token does not belongs to this location's scene", + "CoC7.AddParticipant": "Add Participant", + "CoC7.Remove": "Remove", + "CoC7.Delete": "Delete", + "CoC7.Edit": "Edit", + "CoC7.Create": "Create", + "CoC7.MakeActive": "Make Active", + "CoC7.SelectNewSkill": "Select skill", + "CoC7.AskDamageRoll": "Ask damage roll", + "CoC7.AttemptNegotiateObstacle": "Attempt to negotiate that obstacle", + "CoC7.AttemptBreakDown": "Attempt to break down !!", + "CoC7.ObstacleName": "Obstacle name:", + "CoC7.Actions": "actions:", + "CoC7.Chase.InitiativeShort": "INIT: {value}", + "CoC7.Chase.AdjustedMovementShort": "ADJ. MOV: {value}", + "CoC7.Chase.CheckName": "check name", + "CoC7.Chase.PreysMin": "Preys Min: {value}", + "CoC7.Chase.PreysMax": "Preys Max: {value}", + "CoC7.Chase.ChasersMin": "Chasers Min: {value}", + "CoC7.Chase.ChasersMax": "Chasers Max: {value}", + "CoC7.SpellCastingTime": "Casting Time", "CoC7.SpellCastingCost": "Casting Cost", "CoC7.CallSpell": "Call", @@ -513,6 +721,8 @@ "CoC7.GateSpell": "Gate", "CoC7.CombatSpell": "Combat", "CoC7.SpellType": "Spell Type", + "CoC7.SpellSuccessfullyLearned": "Spell '{spell}' was learned successfully!", + "CoC7.SpellAlreadyLearned": "Spell named ('{spell}') was already learned.", "CoC7.BookHasNothingMoreToTeach": "{book} has nothing more to teach. Cthulhu Mythos skill of {actor} is greater than this Mythos Rating.", "CoC7.BookType": "Book Type", @@ -531,7 +741,7 @@ "CoC7.MarkedForDevelopment": "Marked for development", "CoC7.Mythos": "Mythos", "CoC7.MythosRating": "Mythos Rating", - "CoC7.NotOwned": "This Book needs to be owned by an Actor to perform this action.", + "CoC7.NotOwned": "This Item needs to be owned by an Actor to perform this action.", "CoC7.Occult": "Occult", "CoC7.Points": "point(s)", "CoC7.Progress": "Progress", @@ -556,6 +766,7 @@ "CoC7.MiscellaneousTalent": "Miscellaneous", "CoC7.BasicTalent": "Basic", "CoC7.InsaneTalent": "Insane", + "CoC7.Sane": "Sane", "CoC7.OtherTalent": "Other", "CoC7.Items": "Items", @@ -583,6 +794,7 @@ "CoC7.Chosen": "Chosen", "CoC7.EmptySkillList": "Add a skill by dropping it here.", "CoC7.EmptyItemList": "Add an item by dropping it here.", + "CoC7.EmptyCharacterSkillList": "Add a setup, occupation, or skill by dropping it here.", "CoC7.PersonalSpeciality": "Number of personal or era specialty", "CoC7.AdditionalSkills": "Additional Skills", "CoC7.SkillSelectionWindow": "Select optional skills", @@ -616,7 +828,7 @@ "CoC7.DrawGun": "Draw your gun", "CoC7.GmTools": "Keeper's tools", - "CoC7.GmNotes": "GM's notes", + "CoC7.GmNotes": "Keeper's notes", "CoC7.DevPhase": "Development phase", "CoC7.DevPhaseEnabled": "Development phase enabled", "CoC7.DevPhaseDisabled": "Development phase disabled", @@ -633,7 +845,10 @@ "CoC7.WarnNoControlledActor": "You don't have any controlled actor", "CoC7.WarnFastTargetWithWrongMOV": "Fast selected on a target with less than 8 MOV. (MOV: {mov})", "CoC7.WarnTooManyTarget": "Too many target selected. Keeping only last selected target", + "CoC7.WarnNoTargetsSanCheck": "You have no targets selected. Either select targets or create a link.", + "CoC7.allActors": "All Actors", + "CoC7.restTargets": "Rest Targets", "CoC7.startRest": "Start Rest", "CoC7.dreaming": "The Investigators wait dreaming", "CoC7.healthRecovered": "Recovered one Hit Point", @@ -648,28 +863,47 @@ "CoC7.ErrorManeuverNotPossible": "Your opponent is too strong for you to perform a maneuver", "CoC7.ErrorNotFound": "{missing} not found!", "CoC7.ErrorNotFoundForActor": "{missing} not found for actor {actor}!", + "CoC7.ErrorUnableToParseFormula": "{value} is not a valid formula", + "CoC7.ErrorUnableToParseArmorFormula": "Unable to process armor value: {value}. Ignoring armor.", + "CoC7.ErrorUnableToParseSkillFormula": "Unable to parse formula: {value} for skill {name}", + "CoC7.ErrorActorHasNoWeaponNamed": "Actor {actorName} has no weapon named {weaponName}", + "CoC7.ErrorActorHasTooManyWeaponsNamed": "`Actor {actorName} has more than one weapon named {weaponName}. The first found will be used`", + "CoC7.ErrorUnexpectedWeaponText": "Unexpected weapons text, please raise a bug report with the text you are attempting to import", + "CoC7.ErrorUnexpectedSkillsText": "Unexpected skills text, please raise a bug report with the text you are attempting to import", + "CoC7.ErrorNoTokensSelected": "No tokens selected", + "CoC7.ErrorEvaluatingDamage": "Error evaluating damage", "CoC7.InfoLessSkillThanOptions": "There's only {skillCount} and {optionsCount} options, adding all of them", "CoC7.InfoAllSkillsAlreadySelected": "All skills are already selected.", - "CoC7.MessageCheckRequestedWait": "Your keeper is requesting a {check}.Your world requires an update to run version {version}.
Please backup your world folder before starting the upgrade.
If you do not update your world the system will not work correctly.
The world may be restarted when completed.
", + "CoC7.Migrate.WithModulesMessage": "Your world or modules may require an update to run version {version}.
Please backup your world and module folders listed below before starting the upgrade.
If you do not update your world the system will not work correctly.
The following modules contain actors or items so will also be checked.
{modules}The world may be restarted when completed.
", "CoC7.Migrate.GMRequired": "Your world requires an update to run version {version}.
Please wait for your GM to update the system then refresh (F5) this page.
", "CoC7.Migrate.RestartRequired": "Your world will now restart to enable these changes
", "CoC7.Migrate.ButtonUpdate": "Update", "CoC7.Migrate.ButtonSkip": "Skip", "CoC7.Migrate.ButtonOkay": "Okay", + "CoC7.Migrate.TriggerButton": "Trigger Data Migration", + "CoC7.Migrate.TriggerTitle": "Trigger Data Migration", + "CoC7.Migrate.TriggerContents": "Turn on data migration and restart
", + "CoC7.Migrate.TriggerRestart": "Save and restart", + + "CoC7.Migrate.UpdateCurrentScene": "Migrating your current scene", + "CoC7.Migrate.Complete": "Finished migrating your data", + "CoC7.Migrate.ErrorDocumentPack": "Failed CoC7 system migration for document {name} in pack {collection}: {message}", + "CoC7.Migrate.ErrorScene": "Failed CoC7 system migration for Scene {name}: {message}", + "CoC7.Migrate.ErrorMacro": "Failed CoC7 system migration for Macro {name}: {message}", + "CoC7.Migrate.ErrorTable": "Failed CoC7 system migration for Table {name}: {message}", + "CoC7.Migrate.ErrorItem": "Failed CoC7 system migration for Item {name}: {message}", + "CoC7.Migrate.ErrorActor": "Failed CoC7 system migration for Actor {name}: {message}", + + "CoC7.Settings.CoreRules.Title": "Core Rule Book Optional Rules", + "CoC7.Settings.Rules.Name": "Variant/Optional Rules", + "CoC7.Settings.Rules.Label": "Configure Variant/Optional Rules", + "CoC7.Settings.Rules.Hint": "Configure variant/optional rules like Pulp Cthulhu.", + "CoC7.Settings.HouseRules.Title": "Common House Rules", + "CoC7.Settings.PulpRules.DoubleMaxHealth.Name": "Double maximum health", + "CoC7.Settings.PulpRules.DoubleMaxHealth.Hint": "Maximum health is (CON + SIZ) / 5", + "CoC7.Settings.PulpRules.DevelopmentRollLuck.Name": "Increase Development Rolls For Luck", + "CoC7.Settings.PulpRules.DevelopmentRollLuck.Hint": "Increase luck for failed and successful luck development roll", + "CoC7.Settings.PulpRules.Archetype.Name": "Pulp Archetypes", + "CoC7.Settings.PulpRules.Archetype.Hint": "", + "CoC7.Settings.PulpRules.Organization.Name": "Hero Organization", + "CoC7.Settings.PulpRules.Organization.Hint": "", + "CoC7.Settings.PulpRules.Talents.Name": "Pulp Talents", + "CoC7.Settings.PulpRules.Talents.Hint": "", + "CoC7.Settings.PulpRules.FasterRecovery.Name": "Faster Recovery", + "CoC7.Settings.PulpRules.FasterRecovery.Hint": "Natural healing is increased to two hit points per day", + "CoC7.Settings.PulpRules.IgnoreMajorWounds.Name": "Ignore Major Wounds", + "CoC7.Settings.PulpRules.IgnoreMajorWounds.Hint": "", + "CoC7.Settings.DholeUpload.Directory.Name": "The Dhole's House image upload directory", + "CoC7.Settings.DholeUpload.Directory.Hint": "Upload path for The Dhole's House avatars, relative to the Foundry/Data directory.", + + "CoC7.Maximize": "Maximize", + "CoC7.Summarize": "Summarize", + "CoC7.ClearAllConditions": "Clear All Conditions", + + "CoC7.UnableToInteractWithChatCard": "You are not able to interact with this message, if you need to make a change please ask your Keeper to select the options for you", + "CoC7.UnableToCopyToClipboard": "Unable to copy to clipboard, this is likely due to your browser security settings.", + "CoC7.UnableToUploadDholeImage": "You do not have permission to upload images, if you import the default avatar will be used.", + + "CoC7.MessageTitleSelectUserToGiveTo": "Give item to another character", + "CoC7.MessageSelectUserToGiveTo": "Which character would you like to give this item to?", + "CoC7.MessageDistanceCalculationFailure": "Unable to calculate distance between tokens, please use the token character sheet.", + + "CoC7.ToolTipSkill": "Su mundo necesita ser actualizado para funcionar con la versión {version}.
Por favor, haga una copia de seguridad de la carpeta del mundo antes de actualizar.
Si no actualiza el mundo el sistema no funcionará correctamente.
Se puede reiniciar el mundo una vez que se complete el proceso
", + "CoC7.Migrate.WithModulesMessage": "Es posible que tanto su mundo como sus módulos necesiten una actualización para ejecutar la versión {version}.
Por favor, haga copia de seguridad de su mundo y los módulos listados más abajo antes de comenzar la actualización.
Si no actualiza el mundo el sistema no funcionará correctamente.
Los módulos siguientes contienen actores u objetos, de modo que también se comprobarán.
{modules}El mundo se reiniciará cuando se complete el proceso.
", "CoC7.Migrate.GMRequired": "Su mundo necesita ser actualizado para funcionar con la versión {version}.
Por favor, espere a que su GM realice la actualización del sistema y entonces refresque (F5) la página
", "CoC7.Migrate.RestartRequired": "Su mundo se reiniciará para activar los cambios
", "CoC7.Migrate.ButtonUpdate": "Actualizar", "CoC7.Migrate.ButtonSkip": "Saltar", "CoC7.Migrate.ButtonOkay": "Ok", + "CoC7.Migrate.TriggerButton": "Forzar migración de datos", + "CoC7.Migrate.TriggerTitle": "Forzar migración de datos", + "CoC7.Migrate.TriggerContents": "Activar migración de datos y reiniciar
", + "CoC7.Migrate.TriggerRestart": "Guardar y reiniciar", + + "CoC7.Migrate.Complete": "Completada migración de datos", + + "CoC7.Settings.CoreRules.Title": "Reglas opcionales del Manual del Guardián", + "CoC7.Settings.Rules.Name": "Variantes/reglas opcionales", + "CoC7.Settings.Rules.Label": "Configurar variantes/reglas opcionales", + "CoC7.Settings.Rules.Hint": "Configurar variantes/reglas opcionales como Pulp Cthulhu", + "CoC7.Settings.HouseRules.Title": "Reglas caseras comunes", + "CoC7.Settings.PulpRules.DoubleMaxHealth.Name": "Duplicar puntos de vida", + "CoC7.Settings.PulpRules.DoubleMaxHealth.Hint": "La vida máxima será (CON + TAM) / 5", + "CoC7.Settings.PulpRules.DevelopmentRollLuck.Name": "Aumentar las tiradas de desarrollo de suerte", + "CoC7.Settings.PulpRules.DevelopmentRollLuck.Hint": "Incrementa la suerte al fallar y tenér éxito en las tiradas de desarrollo de la suerte", + "CoC7.Settings.PulpRules.Archetype.Name": "Arquetipos Pulp", + "CoC7.Settings.PulpRules.Archetype.Hint": "Arquetipos Pulp", + "CoC7.Settings.PulpRules.Organization.Name": "Organización del héroe", + "CoC7.Settings.PulpRules.Organization.Hint": "Organización del héroe", + "CoC7.Settings.PulpRules.Talents.Name": "Talentos Pulp", + "CoC7.Settings.PulpRules.Talents.Hint": "Talentos Pulp", + "CoC7.Settings.PulpRules.FasterRecovery.Name": "Recuperación más rápida", + "CoC7.Settings.PulpRules.FasterRecovery.Hint": "La curación natural se aumenta a 2PV por día", + "CoC7.Settings.PulpRules.IgnoreMajorWounds.Name": "Ignorar heridas críticas", + "CoC7.Settings.PulpRules.IgnoreMajorWounds.Hint": "Ignorar heridas críticas", + + "CoC7.Maximize": "Maximizar", + "CoC7.Summarize": "Resumen", + + "CoC7.UnableToInteractWithChatCard": "No es posible interactuar con este mensaje, si necesita hacer algún cambio pídaselo al Guardián", + "CoC7.UnableToCopyToClipboard": "No es posible copiar al portapapeles, probablemente debido al nivel de seguridad de su navegador", + + "CoC7.MessageTitleSelectUserToGiveTo": "Dar objeto a otro personaje", + "CoC7.MessageSelectUserToGiveTo": "¿A qué personaje quiere darle el objeto?", + "CoC7.MessageDistanceCalculationFailure": "No es posible calcular la distancia entre los iconos, por favor, use la hoja de personaje del icono", + + "CoC7.ToolTipSkill": "{actor} n'a pas d'{weapon}.
Veux-tu en créer une ?
{actor} n'a pas de {weapon}.
Veux-tu en créer une ?
Votre monde a besoin d'une mise à jour pour tourner sous la version {version}.
Faîtes une sauvegarde avant de lancer la mise à jour.
Sans mise à jour, le système risque de dysfonctionner.
Le monde risque de redémarrer à la fin du processus.
", - "CoC7.Migrate.GMRequired": "Votre monde a besoin d'une mise à jour pour tourner sous la version {version}.
Attendez que votre Gardien fasse la mise à jour puis raffraichissez (F5) cette page.
", + "CoC7.Migrate.WithModulesMessage": "Votre monde ou vos modules doivent requérir une mise à jour pour fonctionner en version {version}.
Sauvegardez votre monde et le répertoire de vos modules listés ci-dessous avant de mettre à jour.
Si vous ne mettez pas à jour votre monde, le système ne fonctionnera pas correctement.
Les modules suivants contiennent des personnages ou des objets, ils seront donc sélectionnés.
{modules}Le monde risque de redémarrer une fois terminé.
", + "CoC7.Migrate.GMRequired": "Votre monde a besoin d'une mise à jour pour tourner sous la version {version}.
Attendez que votre Gardien fasse la mise à jour puis rafraichissez (F5) cette page.
", "CoC7.Migrate.RestartRequired": "Votre monde va redémarrer à présent pour activer ces changements
", "CoC7.Migrate.ButtonUpdate": "Mise à jour", "CoC7.Migrate.ButtonSkip": "Passer", "CoC7.Migrate.ButtonOkay": "OK", + "CoC7.Migrate.TriggerButton": "Déclencher la Migration de Données", + "CoC7.Migrate.TriggerTitle": "Déclencher la Migration de Données", + "CoC7.Migrate.TriggerContents": "Lance la migration de données puis redémarre
", + "CoC7.Migrate.TriggerRestart": "Sauvegarde et redémarrage", + + "CoC7.Migrate.UpdateCurrentScene": "Migration de la scène courante your current scene", + "CoC7.Migrate.Complete": "Migration des données terminée", + + "CoC7.Settings.CoreRules.Title": "Règles Optionnelles du Livre de Base", + "CoC7.Settings.Rules.Name": "Variantes/Règles optionnelles", + "CoC7.Settings.Rules.Label": "Configurer les variantes/règles optionnelles", + "CoC7.Settings.Rules.Hint": "Configurer les variantes/règles optionnelles comme Cthulhu Pulp.", + "CoC7.Settings.HouseRules.Title": "Règles maison ordinaires", + "CoC7.Settings.PulpRules.DoubleMaxHealth.Name": "Doubler le maximum de PV", + "CoC7.Settings.PulpRules.DoubleMaxHealth.Hint": "Le maximum de PV est de (CON + SIZ) / 5", + "CoC7.Settings.PulpRules.DevelopmentRollLuck.Name": "Augmenter les jets de développement pour la Chance", + "CoC7.Settings.PulpRules.DevelopmentRollLuck.Hint": "Augmenter la chance pour les jets de développement de Chance ratés ou réussis", + "CoC7.Settings.PulpRules.Archetype.Name": "Archétypes Pulp", + "CoC7.Settings.PulpRules.Archetype.Hint": "", + "CoC7.Settings.PulpRules.Organization.Name": "Organisation", + "CoC7.Settings.PulpRules.Organization.Hint": "", + "CoC7.Settings.PulpRules.Talents.Name": "Talents Pulp", + "CoC7.Settings.PulpRules.Talents.Hint": "", + "CoC7.Settings.PulpRules.FasterRecovery.Name": "Récupération accélérée", + "CoC7.Settings.PulpRules.FasterRecovery.Hint": "La récupération naturelle est augmentée de 2 PV par jour", + "CoC7.Settings.PulpRules.IgnoreMajorWounds.Name": "Ignorer les blessures graves", + "CoC7.Settings.PulpRules.IgnoreMajorWounds.Hint": "", + + "CoC7.Maximize": "Développer", + "CoC7.Summarize": "Compacter", + + "CoC7.UnableToInteractWithChatCard": "Vous ne pouvez interagir avec ce message, si vous devez faire une modification, demandez à votre Gardien de sélectionner les options pour vous", + "CoC7.UnableToCopyToClipboard": "Impossible de copier le presse-papier, il y a des chances que cela proviennent de paramètres de sécurité de votre navigateur.", + + "CoC7.MessageTitleSelectUserToGiveTo": "Donner un objet à un autre personnage", + "CoC7.MessageSelectUserToGiveTo": "A qui voulez-vous donner cet objet ?", + "CoC7.MessageDistanceCalculationFailure": "Impossible de calculer la distance séparant les tokens, utiliser la fiche du token du personnage SVP.", + + "CoC7.ToolTipSkill": "Questo svuoterà la tua lista delle abilità eliminando la specializzazione dal nome dell'abilità.
Questo farà sì che l'abilità non appaia come: 'specializzazione(specializzazione(abilità))'
", + "CoC7.DevelopemmentPhase": "Fase di sviluppo", + "CoC7.RecoverLuckPoints": "Recupero dei Punti Fortuna", + "CoC7.SkillCantGainXp": "L'abilità non può guadagnare Esperienza automaticamente", + "CoC7.SkillUnflagForDevelopement": "Deseleziona per lo sviluppo", + "CoC7.SkillFlagForDevelopement": "Seleziona per lo sviluppo", + "CoC7.RollAll4Dev": "Vengono tirate tutte le abilità per lo sviluppo", + "CoC7.RollLuck4Dev": "Viene tirata la Fortuna per lo sviluppo", + "CoC7.DevRollTitle": "Viene tirato {item} per lo sviluppo: {die}/{score}%", + "CoC7.DevSuccessDetails": "{item} migliorato di {augment}%", + "CoC7.SanGained": "Guadagnati 2d6 ({results} = {sanGained}) Sanità dopo aver padroneggiato {skill} con un {skillValue}%", + "CoC7.DevFailureDetails": "{item} NON migliorato", + "CoC7.ReduceSanityLimits": "Tutti i limiti della Sanità sono ridotti di uno", + "CoC7.DevSuccess": "{item} migliorato ({die}/{score}%) di {augment}%", + "CoC7.DevFailure": "{item} NON migliorato ({die}/{score}%)", + "CoC7.LuckIncreased": "Fortuna recuperata ({die}/{score}): {augment} punti", + "CoC7.LuckNotIncreased": "Fortuna NON recuperata ({die}/{score})", + "CoC7.DevelopAttribWarn": "Non è possibile accedere ad alcuni attributi in fase di sviluppo/creazione.", + "CoC7.SkillDetail": "Dettagli", + "CoC7.EditSkill": "Modifica abilità", + "CoC7.DeleteSkill": "Cancella abilità", + "CoC7.RangeSkills": "Abilità a distanza", + "CoC7.MeleeSkills": "Abilità corpo a corpo", + "CoC7.NewItemName": "nuovo oggetto", + "CoC7.AddItem": "Aggiungi oggetto", + "CoC7.EditItem": "Modifica oggetto", + "CoC7.DeleteItem": "Cancella oggetto", + "CoC7.TradeItem": "Scambia / Immagazzina Oggetto", + "CoC7.SortBySkillName": "Ordina per nome abilità", + "CoC7.SortBySkillValue": "Ordina per percentuale dell'abilità ", + "CoC7.UncommonSkillsShow": "Mostra abilità non comuni", + "CoC7.UncommonSkillsHide": "Nascondi abilità non comuni", + + "CoC7.NewBookName": "nuovo libro", + "CoC7.AddBook": "Aggiungi libro", + "CoC7.NewSpellName": "nuovo incantesimo", + "CoC7.AddSpell": "Aggiungi incantesimo", + + "CoC7.AddWeapon": "Aggiungi arma", + "CoC7.NewWeaponName": "nuova arma", + "CoC7.EditWeapon": "Modifica arma", + "CoC7.DeleteWeapon": "Cancella arma", + "CoC7.MeleeWeapons": "Armi da corpo a corpo", + "CoC7.RangeWeapons": "Armi a distanza", + "CoC7.WeaponName": "Nome", + "CoC7.WeaponSkill": "Abilità", + "CoC7.WeaponSkillMain": "Abilità principale", + "CoC7.WeaponSkillAlt": "Abilità alternativa", + "CoC7.Inventory": "Inventario", + "CoC7.InventoryIsCurrentlyEmpty": "L'inventario è attualmente vuoto.", + "CoC7.CharacterDevelopment": "Sviluppo", + "CoC7.OccupationSkill": "Abilità da Professione", + "CoC7.ArchetypeSkill": "Abilità da Archetipo", + "CoC7.UseFormula": "Usa tiro dei dadi", + "CoC7.EnterFormula": "Immetti formula", + "CoC7.SanRollHint": "Tiro Sanità per i bersagli", + "CoC7.SANCheckTitle": "Perdita SAN : {name} ({sanMin}/{sanMax})", + "CoC7.NoSkill": "Nessuna abilità", + "CoC7.AddWeapontHint": "{actor} non ha {weapon}.
Vuoi crearne una?
Il tuo mondo richiede un aggiornamento per eseguire la versione {version}.
Si prega di eseguire il backup della cartella del mondo prima di avviare l'aggiornamento.
Se non aggiorni il tuo mondo il sistema non funzionerà correttamente.
Il mondo potrebbe essere riavviato una volta completata l'operazione.
", + "CoC7.Migrate.WithModulesMessage": "Il tuo mondo o i tuoi moduli potrebbero richiedere un aggiornamento per eseguire la versione {version}.
Esegui il backup delle cartelle del mondo e dei moduli elencate di seguito prima di avviare l'aggiornamento.
Se non aggiorni il tuo mondo il sistema non funzionerà correttamente.
I seguenti moduli contengono personaggi o oggetti, quindi verranno controllati.
{modules}Il mondo potrebbe essere riavviato una volta completata l'operazione.
", + "CoC7.Migrate.GMRequired": "Il tuo mondo richiede un aggiornamento per eseguire la versione {version}.
Attendi che il tuo GM aggiorni il sistema, quindi aggiorna (F5) questa pagina.
", + "CoC7.Migrate.RestartRequired": "Il tuo mondo ora si riavvierà per abilitare queste modifiche
", + "CoC7.Migrate.ButtonUpdate": "Aggiorna", + "CoC7.Migrate.ButtonSkip": "Ignora", + "CoC7.Migrate.ButtonOkay": "Okay", + + "CoC7.Migrate.TriggerButton": "Attivare lo spostamento dei dati", + "CoC7.Migrate.TriggerTitle": "Attivare lo spostamento dei dati", + "CoC7.Migrate.TriggerContents": "Attiva lo spostamento dei dati e riavvia
", + "CoC7.Migrate.TriggerRestart": "Salva e riavvia", + + "CoC7.Migrate.UpdateCurrentScene": "Migrazione della tua scena attuale", + "CoC7.Migrate.Complete": "Terminata la migrazione dei tuoi dati", + "CoC7.Migrate.ErrorDocumentPack": "E' fallita la migrazione del sistema CoC7 per il documento {name} nel pacchetto {collection}: {message}", + "CoC7.Migrate.ErrorScene": "E' fallita la migrazione del sistema CoC7 per la Scena {name}: {message}", + "CoC7.Migrate.ErrorMacro": "E' fallita la migrazione del sistema CoC7 per la Macro {name}: {message}", + "CoC7.Migrate.ErrorTable": "E' fallita la migrazione del sistema CoC7 per la Tabella {name}: {message}", + "CoC7.Migrate.ErrorItem": "E' fallita la migrazione del sistema CoC7 per l'Oggetto {name}: {message}", + "CoC7.Migrate.ErrorActor": "E' fallita la migrazione del sistema CoC7 per il Personaggio {name}: {message}", + + "CoC7.Settings.CoreRules.Title": "Regole opzionali del regolamento base", + "CoC7.Settings.Rules.Name": "Regole opzionali/variazioni", + "CoC7.Settings.Rules.Label": "Configurazione delle regole opzionali/variazioni", + "CoC7.Settings.Rules.Hint": "Configura le regole opzionali/variazioni secondo Pulp Cthulhu.", + "CoC7.Settings.HouseRules.Title": "Regole della casa comuni", + "CoC7.Settings.PulpRules.DoubleMaxHealth.Name": "Doppia salute massima", + "CoC7.Settings.PulpRules.DoubleMaxHealth.Hint": "La salute massima è (COS + TAG) / 5", + "CoC7.Settings.PulpRules.DevelopmentRollLuck.Name": "Aumentare i Tiri di Sviluppo per la Fortuna", + "CoC7.Settings.PulpRules.DevelopmentRollLuck.Hint": "Aumenta la fortuna per il successo o il fallimento dei tiri di sviluppo", + "CoC7.Settings.PulpRules.Archetype.Name": "Archetipi Pulp", + "CoC7.Settings.PulpRules.Archetype.Hint": "", + "CoC7.Settings.PulpRules.Organization.Name": "Organizzazione dell'Eroe", + "CoC7.Settings.PulpRules.Organization.Hint": "", + "CoC7.Settings.PulpRules.Talents.Name": "Talenti Pulp", + "CoC7.Settings.PulpRules.Talents.Hint": "", + "CoC7.Settings.PulpRules.FasterRecovery.Name": "Recupero Più Veloce", + "CoC7.Settings.PulpRules.FasterRecovery.Hint": "La guarigione naturale è aumentata di due punti ferita al giorno", + "CoC7.Settings.PulpRules.IgnoreMajorWounds.Name": "Ignorare Ferite Gravi", + "CoC7.Settings.PulpRules.IgnoreMajorWounds.Hint": "", + "CoC7.Settings.DholeUpload.Directory.Name": "Cartella di upload dell'immagine dalla The Dhole's House", + "CoC7.Settings.DholeUpload.Directory.Hint": "Percorso di upload per gli avatar dalla The Dhole's House, relativo alla cartella Foundry/Data.", + + "CoC7.Maximize": "Massimizza", + "CoC7.Summarize": "Riassumi", + "CoC7.ClearAllConditions": "Elimina tutti i disturbi", + + "CoC7.UnableToInteractWithChatCard": "Non sei in grado di interagire con questo messaggio, se devi apportare una modifica chiedi al tuo Custode di selezionare le opzioni per te", + "CoC7.UnableToCopyToClipboard": "Impossibile copiare negli appunti, ciò è probabilmente dovuto alle impostazioni di sicurezza del tuo browser.", + "CoC7.UnableToUploadDholeImage": "Non hai il permesso per effettuare l'upload di immagini, se importi verrà utilizzato l'avatar predefinito.", + + "CoC7.MessageTitleSelectUserToGiveTo": "Dai l'oggetto a un altro personaggio", + "CoC7.MessageSelectUserToGiveTo": "A quale personaggio vorresti dare questo oggetto?", + "CoC7.MessageDistanceCalculationFailure": "Impossibile calcolare la distanza tra le pedine, utilizza la scheda del personaggio della pedina.", + + "CoC7.ToolTipSkill": "このワールドでは、バージョン {version} を実行するためのアップデートが必要です。
アップデートを始める前に、ワールド・フォルダのバックアップを取ってください。
アップデートしなければ、システムが正しく動作しないことに注意が必要です。
アップデートが完了したら、ワールドを再起動してください。
", + "CoC7.Migrate.WithModulesMessage": "使用中のワールドやモジュールは、バージョン {version} を実行するためのアップデートが必要となる場合があります。
そのため、アップデートを始める前に、ワールドやモジュールのフォルダをバックアップしておくことをお勧めします。
ワールドをアップデートしない限り、システムが正しく動作しないことに注意。
以下のモジュールにはアクターやアイテムが含まれているため、これらもチェックされます。
{modules}アップデートが完了したら、ワールドの再起動をしてください。
", + "CoC7.Migrate.GMRequired": "このワールドは、バージョン {version} を実行するためのアップデートが必要です。
GMによるシステム・アップデートの完了を待ってから、このページを更新(F5)してください。
", + "CoC7.Migrate.RestartRequired": "この変更を有効にするため、ワールドを再起動を実行。
", + "CoC7.Migrate.ButtonUpdate": "アップデート", + "CoC7.Migrate.ButtonSkip": "無視", + "CoC7.Migrate.ButtonOkay": "OK", + + "CoC7.Migrate.TriggerButton": "データ移行のトリガー", + "CoC7.Migrate.TriggerTitle": "データ移行のトリガー", + "CoC7.Migrate.TriggerContents": "データ移行をオンにして再起動
", + "CoC7.Migrate.TriggerRestart": "保存して再起動", + + "CoC7.Migrate.UpdateCurrentScene": "現在のシーンの移行", + "CoC7.Migrate.Complete": "データ移行完了", + + "CoC7.Settings.CoreRules.Title": "コア・ルールブックの選択ルール", + "CoC7.Settings.Rules.Name": "選択ルール", + "CoC7.Settings.Rules.Label": "選択ルールの設定", + "CoC7.Settings.Rules.Hint": "パルプ・クトゥルフのような、選択ルールを設定します。", + "CoC7.Settings.HouseRules.Title": "共通ハウスルール", + "CoC7.Settings.PulpRules.DoubleMaxHealth.Name": "最大耐久力が2倍になる", + "CoC7.Settings.PulpRules.DoubleMaxHealth.Hint": "最大耐久力を(CON+SIZ)÷5にします。", + "CoC7.Settings.PulpRules.DevelopmentRollLuck.Name": "幸運の上達チェックによって回復", + "CoC7.Settings.PulpRules.DevelopmentRollLuck.Hint": "幸運の上達チェックで幸運が回復する。", + "CoC7.Settings.PulpRules.Archetype.Name": "パルプ・アーキタイプ", + "CoC7.Settings.PulpRules.Archetype.Hint": "", + "CoC7.Settings.PulpRules.Organization.Name": "ヒーロー・オーガナイザー", + "CoC7.Settings.PulpRules.Organization.Hint": "", + "CoC7.Settings.PulpRules.Talents.Name": "パルプの才能", + "CoC7.Settings.PulpRules.Talents.Hint": "", + "CoC7.Settings.PulpRules.FasterRecovery.Name": "回復速度上昇", + "CoC7.Settings.PulpRules.FasterRecovery.Hint": "自然治癒力が1日当たり2ポイントに増加する", + "CoC7.Settings.PulpRules.IgnoreMajorWounds.Name": "重傷は無視する", + "CoC7.Settings.PulpRules.IgnoreMajorWounds.Hint": "", + + "CoC7.Maximize": "最大化", + "CoC7.Summarize": "サマリー化", + + "CoC7.UnableToInteractWithChatCard": "変更が必要なとき、キーパーにオプション選択を要望すること。", + "CoC7.UnableToCopyToClipboard": "クリップボードにコピーできない。この問題はブラウザのセキュリティ設定が原因と思われる。", + + "CoC7.MessageTitleSelectUserToGiveTo": "他のキャラクターにアイテムを渡す", + "CoC7.MessageSelectUserToGiveTo": "このアイテムをどのキャラクターに渡したいですか?", + "CoC7.MessageDistanceCalculationFailure": "トークン間の距離を計算することができないため、トークン側のキャラクターシートを利用してください。", + + "CoC7.ToolTipSkill": "{actor}에게 {weapon}.
이(가)없습니다 입력하시겠습니까?
현재 사용 중인 월드는 {version} 버전을 실행하려면 업데이트가 필요합니다.
업데이트를 진행하기전에 월드 폴더를 백업하세요.
월드를 업데이트 하지않으면 시스템이 올바르게 작동하지않습니다.
업데이트가 완료되면 월드가 재시작됩니다.
", + "CoC7.Migrate.WithModulesMessage": "사용 중인 월드 또는 모듈에서 {version} 버전을 실행하려면 업데이트가 필요할 수 있습니다.
업데이트를 시작하기 전에 아래에 나열된 월드 밎 모듈 폴더를 백업하세요.
월드를 업데이트하지 않으면 시스템이 올바르게 작동하지 않습니다.
다음 모듈에는 캐릭터와 아이템 항목이 포함되어 있으므로 이에 대한 점검도 이루어집니다.
{modules}완료되면 월드가 재시작될 수 있습니다.
", + "CoC7.Migrate.GMRequired": "사용 중인 월드에서 {version} 버전을 실행하려면 업데이트가 필요합니다.
GM이 시스템을 업데이트할 때까지 기다렸다가 이 페이지를 새로고침 해주세요(F5).
", + "CoC7.Migrate.RestartRequired": "새 설정을 적용하기위해 월드가 다시 시작됩니다
", + "CoC7.Migrate.ButtonUpdate": "업데이트", + "CoC7.Migrate.ButtonSkip": "건너뛰기", + "CoC7.Migrate.ButtonOkay": "확인", + + "CoC7.Migrate.TriggerButton": "데이터 마이그레이션", + "CoC7.Migrate.TriggerTitle": "데이터 마이그레이션", + "CoC7.Migrate.TriggerContents": "데이터 마이그레이션 버튼을 키고 재시작
", + "CoC7.Migrate.TriggerRestart": "저장하고 재시작", + + "CoC7.Migrate.UpdateCurrentScene": "현재 장면 마이그레이션", + "CoC7.Migrate.Complete": "데이터 마이그레이션 완료", + + "CoC7.Settings.CoreRules.Title": "코어 룰북 옵션 룰", + "CoC7.Settings.Rules.Name": "변형/옵션 룰", + "CoC7.Settings.Rules.Label": "변형/옵션 룰 구성", + "CoC7.Settings.Rules.Hint": "펄프 크툴루와 같은 변형/옵션 룰 구성.", + "CoC7.Settings.HouseRules.Title": "공통 하우스 룰", + "CoC7.Settings.PulpRules.DoubleMaxHealth.Name": "최대 건강 2배", + "CoC7.Settings.PulpRules.DoubleMaxHealth.Hint": "최대 건강은(는) (CON + SIZ) / 5", + "CoC7.Settings.PulpRules.DevelopmentRollLuck.Name": "행운을 위한 개발 롤 증가", + "CoC7.Settings.PulpRules.DevelopmentRollLuck.Hint": "실패한 행운 개발 롤에 대한 행운 증가", + "CoC7.Settings.PulpRules.Archetype.Name": "펄프 원형", + "CoC7.Settings.PulpRules.Archetype.Hint": "", + "CoC7.Settings.PulpRules.Organization.Name": "영웅 조직", + "CoC7.Settings.PulpRules.Organization.Hint": "", + "CoC7.Settings.PulpRules.Talents.Name": "펄프 재능", + "CoC7.Settings.PulpRules.Talents.Hint": "", + "CoC7.Settings.PulpRules.FasterRecovery.Name": "빠른 회복", + "CoC7.Settings.PulpRules.FasterRecovery.Hint": "자연 치유력이 하루 2회까지 늘어납니다", + "CoC7.Settings.PulpRules.IgnoreMajorWounds.Name": "큰 상처 무시", + "CoC7.Settings.PulpRules.IgnoreMajorWounds.Hint": "", + + "CoC7.Maximize": "최대화", + "CoC7.Summarize": "요약", + + "CoC7.UnableToInteractWithChatCard": "이 메시지와 상호 작용할 수 없습니다. 변경이 필요한 경우 수호자에게 요청해 옵션을 선택하세요.", + "CoC7.UnableToCopyToClipboard": "브라우저 보안 설정으로 인해 클립보드에 복사할 수 없습니다.", + + "CoC7.MessageTitleSelectUserToGiveTo": "다른 캐릭터에게 아이템 제공", + "CoC7.MessageSelectUserToGiveTo": "이 아이템을 어떤 캐릭터와 교환하시겠습니까?", + "CoC7.MessageDistanceCalculationFailure": "토큰 간 거리를 계산할 수 없습니다. 토큰 캐릭터 시트를 사용하십시오.", + + "CoC7.ToolTipSkill": "{actor} nie mam {weapon}.
Chcesz ją stworzyć ?
{actor} nie ma {weapon}.
Chcesz ją stworzyć ?
Twój świat wymaga aktualizacji do wersji {version}.
Utwórz kopię zapasową przed aktualizacją.
Jeśli nie dokonasz aktualizacji, system nie będzie działał prawidłowo.
Świat może zostać zrestartowany po zakończeniu.
", + "CoC7.Migrate.WithModulesMessage": "Twój świat lub moduły mogą wymagać aktualizacji, aby używać wersji {version}.
Utwórz kopię zapasową świata i folderów z modułami wymienionymi poniżej przed rozpoczęciem aktualizacji.
Jeśli nie zaktualizujesz świata, system nie będzie działał prawidłowo.
Następujące moduły posiadają aktorów i przedmioty, więc również zostaną sprawdzone.
{modules}Świat może zostać ponownie uruchomiony po aktualizacji.
", "CoC7.Migrate.GMRequired": "Twój świat wymaga aktualizacji do wersji {version}.
Poczekaj aż Strażnik dokona aktualizacji, a następnie wciśnij (F5), by odświeżyć grę.
", "CoC7.Migrate.RestartRequired": "Twój świat zostanie teraz zrestartowany, by wdrożyć zmiany
", "CoC7.Migrate.ButtonUpdate": "Aktualizuj", "CoC7.Migrate.ButtonSkip": "Pomiń", "CoC7.Migrate.ButtonOkay": "Ok", + "CoC7.Migrate.TriggerButton": "Rozpocznij migrację danych", + "CoC7.Migrate.TriggerTitle": "Rozpocznij migrację danych", + "CoC7.Migrate.TriggerContents": "Włącz migrację danych i uruchom ponownie
", + "CoC7.Migrate.TriggerRestart": "Zapisz i uruchom ponownie", + + "CoC7.Migrate.UpdateCurrentScene": "Migracja aktywnej sceny", + "CoC7.Migrate.Complete": "Ukończono migrację danych", + + "CoC7.Settings.CoreRules.Title": "Opcjonalne zasady z Podręcznika Pdstawowego", + "CoC7.Settings.Rules.Name": "Alternatywne/opcjonalne Zasady", + "CoC7.Settings.Rules.Label": "Skonfiguruj alternatywne/opcjonalne Zasady", + "CoC7.Settings.Rules.Hint": "Konfiguruj alternatywne/opcjonalne zasady, takie jak Pulp Cthulhu.", + "CoC7.Settings.HouseRules.Title": "Ogólne zasady własne", + "CoC7.Settings.PulpRules.DoubleMaxHealth.Name": "Podwój maksymalne PW", + "CoC7.Settings.PulpRules.DoubleMaxHealth.Hint": "Maksymalne PW wynosi (KON + Krzepa) / 5", + "CoC7.Settings.PulpRules.DevelopmentRollLuck.Name": "Zwiększ odzyskiwane szczęście", + "CoC7.Settings.PulpRules.DevelopmentRollLuck.Hint": "Zwiększ odzyskiwane szczęście w fazie rozwoju", + "CoC7.Settings.PulpRules.Archetype.Name": "Pulpowe Archetypy", + "CoC7.Settings.PulpRules.Archetype.Hint": "Archetypy dostępne dla Bohaterów Pulpwych", + "CoC7.Settings.PulpRules.Organization.Name": "Organizacje Bohaterów", + "CoC7.Settings.PulpRules.Organization.Hint": "Pulpowe Organizacje, do których mogą należeć Bohaterowie", + "CoC7.Settings.PulpRules.Talents.Name": "Pulpowe Talenty", + "CoC7.Settings.PulpRules.Talents.Hint": "Specjalne umiejętności Bohaterów Pulpowych", + "CoC7.Settings.PulpRules.FasterRecovery.Name": "Szybsze odnawianie PW", + "CoC7.Settings.PulpRules.FasterRecovery.Hint": "Naturalna regeneracja zostanie zwiększona do dwóch PW dziennie", + "CoC7.Settings.PulpRules.IgnoreMajorWounds.Name": "Ignoruj Poważne Rany", + "CoC7.Settings.PulpRules.IgnoreMajorWounds.Hint": "Bohaterowie nie mogą dostać Poważnej Rany", + + "CoC7.Maximize": "Maksymalizuj", + "CoC7.Summarize": "Podsumuj", + + "CoC7.UnableToInteractWithChatCard": "Nie możesz zmienić tego elementu. Jeśli chcesz wprowadzić zmiany, poproś Strażnika, żeby ustawił za Ciebie opcje", + "CoC7.UnableToCopyToClipboard": "Nie udało się skopiować do schowka. Najprawdopodobniej jest to wina ustawień bezpieczeństwa przeglądarki.", + + "CoC7.MessageTitleSelectUserToGiveTo": "Przekaż przedmiot innej postaci", + "CoC7.MessageSelectUserToGiveTo": "Komu chciałbyś przekazać przedmiot?", + "CoC7.MessageDistanceCalculationFailure": "Nie udało się ustalić odległości między tokenami. Użyj karty postaci dostępnej z dwukrotnego kliknięcia na tokenie.", + + "CoC7.ToolTipSkill": "{actor} não possui {weapon}.
Gostaria de criar ?
Seu Mundo precisa ser atualizado para a rodar a versão {version}.
Por favor, faça um backup da pasta de seu Mundo antes de prosseguir.
Se você não atualizar seu Mundo, o sistema não funcionará devidamente.
Reinicie o Mundo quando o processo for concluído.
", + "CoC7.Migrate.WithModulesMessage": "Seu Mundo ou módulos podem requerer uma atualização para rodar a versão {version}.
Por favor, faça um backup da pasta de seu Mundo e das pastas dos módulos abaixo antes de prosseguir.
Se você não atualizar seu Mundo, o sistema não funcionará devidamente.
Os seguintes módulos contém Atores ou Items.
{modules}O mundo precisará ser reiniciado quando a atualização terminar.
", "CoC7.Migrate.GMRequired": "Seu Mundo precisa ser atualizado para rodar a versão {version}.
Por favor aguarde que o Guardião faça as atualizações necessárias e então atualize a página com F5.
", "CoC7.Migrate.RestartRequired": "Seu Mundo será reiniciado para que as atualizações sejam aplicadas
", "CoC7.Migrate.ButtonUpdate": "Atualizar", "CoC7.Migrate.ButtonSkip": "Mais Tarde", "CoC7.Migrate.ButtonOkay": "Proceder", - + "CoC7.Migrate.TriggerButton": "Acionar Migração", + "CoC7.Migrate.TriggerContents": "Iniciar migração e reiniciar
", + "CoC7.Migrate.TriggerRestart": "Salvar e reiniciar", + "CoC7.Migrate.TriggerTitle": "Acionar Migração", + "CoC7.Maximize": "Maximizar", + "CoC7.Summarize": "Resumir", + "CoC7.UnableToInteractWithChatCard": "Não é possível interagir com essa mensagem, por favor peça ao Guardião para alterá-la para você.", + "CoC7.UnableToCopyToClipboard": "Impossível copiar para a área de transferência, provavelmente por causa das configurações de segurança de seu navegador.", "CoC7.ImportedUnnamedCharacter": "Personagem sem nome importado", "CoC7.CreatedImportedCharactersFolder": "Pasta de 'Personagens Importados' criada", "CoC7.HowToTranslateTitle": "Como traduzir?", @@ -705,12 +714,24 @@ "CoC7.HowToTranslateInstallTranslation": "Instale/Atualize a Tradução no gerenciador de módulos do Foundry.", "CoC7.HowToTranslateEnableTranslation": "Dentro do Mundo de Jogo, em Configuração/Gerenciar Módulos ative tanto o Babele quanto as traduções.", "CoC7.HowToTranslateNoTranslation": "instruções para criar traduções em novas línguas estão disponíveis nos módulos de tradução existentes.", - + "CoC7.MessageTitleSelectUserToGiveTo": "Entregar este item para outro personagem", + "CoC7.MessageSelectUserToGiveTo": "Qual personagem gostaria de repassar este item?", + "CoC7.MessageDistanceCalculationFailure": "Não é possível calcular distância entre tokens, por favor, use a ficha de personagem.", + "CoC7.ToolTipSkill": "Din värld kräver en uppdatering för att köra version {version}.
Vänligen gör en backup av din världsmapp innan du påbörjar uppgraderingen.
Om du inte uppdaterar din värld kommer inte systemet att fungera korrekt.
Världen kan komma att startas om när uppgraderingen är färdig.
", + "CoC7.Migrate.WithModulesMessage": "Din spelvärld eller modul kan behöva en uppdatering för att köra version {version}.
Vänligen gör en backup av din spelvärld och de modulmappar som listas nedan innan du startar uppgraderingen.
Om du inte uppdaterar din spelvärld kommer systemet inte att fungera korrekt.
Följande moduler, som innehåller karaktärer eller föremål, kommer också att kontrolleras
{modules}TVärlden kan komma att startas om när uppgraderingen är färdig.
", "CoC7.Migrate.GMRequired": "Din värld kräver en uppdatering för att köra version {version}.
Vänligen vänta till din Väktare har uppdaterat systemet, sedan tryck (F5) för att ladda om sidan.
", "CoC7.Migrate.RestartRequired": "Din värld kommer nu att startas om för att ändringarna ska träda i kraft.
", "CoC7.Migrate.ButtonUpdate": "Uppdatera", "CoC7.Migrate.ButtonSkip": "Hoppa över", "CoC7.Migrate.ButtonOkay": "Ok", + "CoC7.Migrate.TriggerButton": "Starta datamigrering", + "CoC7.Migrate.TriggerTitle": "Starta datamigrering", + "CoC7.Migrate.TriggerContents": "Slå igång datamigrering och starta om
", + "CoC7.Migrate.TriggerRestart": "Spara och starta om", + + "CoC7.Migrate.UpdateCurrentScene": "Migrerar din nuvarande scen", + "CoC7.Migrate.Complete": "Migreringen av din data är klar", + + "CoC7.Settings.CoreRules.Title": "Valfria regler från grundregelboken", + "CoC7.Settings.Rules.Name": "Alternativa/frivilliga regler", + "CoC7.Settings.Rules.Label": "Konfigurera Alternativa/frivilliga regler", + "CoC7.Settings.Rules.Hint": "Konfigurera Alternativa/frivilliga regler som för Pulp Cthulhu.", + "CoC7.Settings.HouseRules.Title": "Vanligt förekommande husregler", + "CoC7.Settings.PulpRules.DoubleMaxHealth.Name": "Dubblad Kroppspoäng", + "CoC7.Settings.PulpRules.DoubleMaxHealth.Hint": "Maximala Kroppspoängen är (FYS + STO) / 5", + "CoC7.Settings.PulpRules.DevelopmentRollLuck.Name": "Öka återhämtning av Tur-poäng", + "CoC7.Settings.PulpRules.DevelopmentRollLuck.Hint": "Öka Tur-poäng för både lyckade- och misslyckade slag under utvecklingsfasen", + "CoC7.Settings.PulpRules.Archetype.Name": "Pulp-arketyper", + "CoC7.Settings.PulpRules.Archetype.Hint": "", + "CoC7.Settings.PulpRules.Organization.Name": "Hjälteorganisationer", + "CoC7.Settings.PulpRules.Organization.Hint": "", + "CoC7.Settings.PulpRules.Talents.Name": "Pulp-talanger", + "CoC7.Settings.PulpRules.Talents.Hint": "", + "CoC7.Settings.PulpRules.FasterRecovery.Name": "Snabbare återhämtning", + "CoC7.Settings.PulpRules.FasterRecovery.Hint": "Naturlig läkning ökar till två Kroppspoäng per dag", + "CoC7.Settings.PulpRules.IgnoreMajorWounds.Name": "Ignnorera allvarliga skador", + "CoC7.Settings.PulpRules.IgnoreMajorWounds.Hint": "", + + "CoC7.Maximize": "Maximera", + "CoC7.Summarize": "Begränsad vy", + + "CoC7.UnableToInteractWithChatCard": "Du kan inte interagera med det här medelandet. Om du behöver ändra något, vänligen be din Väktare välja det alternativet åt dig", + "CoC7.UnableToCopyToClipboard": "Kan inte kopiera till Urklippshanteraren, förmodligen på grund av säkerhetsinställningarna i din webbläsare.", + + "CoC7.MessageTitleSelectUserToGiveTo": "Ge föremål till en annan karaktär", + "CoC7.MessageSelectUserToGiveTo": "Vilken karaktär vill du ge det här föremålet till?", + "CoC7.MessageDistanceCalculationFailure": "Kan inte beräkna avståndet mellan markörerna. Vänligen använd markörens rollformulär.", + + "CoC7.ToolTipSkill": "你的世界或模組可能需要更新以運行版本{version}。
在開始升級之前,請備份你的世界和下面列出的模組文件夾。
如果你不更新你的世界,系統將無法正常工作。
下面的模組包含角色或物品,所以也將被檢查。
{modules}世界完成後可能被重新啟動。
", + "CoC7.MessageDistanceCalculationFailure": "無法計算Token之間的距離,請使用角色卡。", + "CoC7.ToolTipSkill": "開啟數據遷移並重啟
", + "CoC7.Migrate.TriggerRestart": "保存並重啟", + "CoC7.Settings.CoreRules.Title": "核心規則手冊的可選規則", + "CoC7.Settings.Rules.Name": "變體/可選規則", + "CoC7.Settings.Rules.Label": "設定變體/可選規則", + "CoC7.Settings.Rules.Hint": "設定變體/可選規則,如 Pulp Cthulhu。", + "CoC7.Settings.HouseRules.Title": "房規", + "CoC7.Settings.PulpRules.DoubleMaxHealth.Name": "雙倍最大生命值", + "CoC7.Settings.PulpRules.DoubleMaxHealth.Hint": "最大生命值是 (CON + SIZ) / 5", + "CoC7.Settings.PulpRules.DevelopmentRollLuck.Name": "增加運氣的技能成長標記", + "CoC7.Settings.PulpRules.DevelopmentRollLuck.Hint": "增加 運氣 的技能成長 有成功和失敗", + "CoC7.Settings.PulpRules.Archetype.Name": "通俗Pulp 英雄類型", + "CoC7.Settings.PulpRules.Archetype.Hint": "", + "CoC7.Settings.PulpRules.Organization.Name": "英雄組織", + "CoC7.Settings.PulpRules.Organization.Hint": "", + "CoC7.Settings.PulpRules.Talents.Name": "通俗Pulp 天賦", + "CoC7.Settings.PulpRules.Talents.Hint": "", + "CoC7.Settings.PulpRules.FasterRecovery.Name": "更快的恢復", + "CoC7.Settings.PulpRules.FasterRecovery.Hint": "自然恢復增加到每天兩點生命值", + "CoC7.Settings.PulpRules.IgnoreMajorWounds.Name": "忽略重傷", + "CoC7.Settings.PulpRules.IgnoreMajorWounds.Hint": "", + "CoC7.days": "日", + "CoC7.months": "月", + "CoC7.ErrorMissingKeeperUser": "您的 keeper 需要在線才能執行此操作", + "CoC7.CardType": "擲骰類型", + "CoC7.GroupRollCard": "團體檢定", + "CoC7.RegularRollCard": "一般檢定", + "CoC7.AttackManeuver": "攻擊戰技", + "CoC7.ErrorInvalidCardType": "檢定類型", + "CoC7.ErrorInvalidRollType": "擲骰類型", + "CoC7.ReduceSanityLimits": "將所有SAN損失降低一點", + "CoC7.BackgroundEncounters": "來自神秘怪物的SAN損失", + "CoC7.BackgroundFlags": "標記", + "CoC7.BackgroundFlagsMythosExperienced": "因瘋狂而獲得 5% 的克蘇魯神話", + "CoC7.BackgroundFlagsMythosHardened": "精神固化", + "CoC7.SanityLossEncounters": "曾遭遇的SAN損失", + "CoC7.SanityLossImmunities": "免疫的SAN損失", + "CoC7.AddSanityLossEncounter": "新增 曾遭遇的SAN損失", + "CoC7.AddSanityLossImmunity": "新增 免疫的SAN損失", + "CoC7.DeleteSanityLossEncounter": "删除 曾遭遇的SAN損失", + "CoC7.DeleteSanityLossImmunity": "删除 免疫的SAN損失", + "CoC7.SanityLossTypeDialogTitle": "新的 SAN損失或免疫", + "CoC7.SanityLossTypeDialogBody": "為角色新增一個新的神話遭遇、SAN損失或免疫SAN損失。", + "CoC7.SanityLossTypeReason": "原因", + "CoC7.SanityLossTypeValue": "失去SAN值", + "CoC7.SanityLossEncounter": "遭遇到的SAN損失", + "CoC7.SanityLossImmunity": "免疫的SAN損失", + "CoC7.Migrate.UpdateCurrentScene": "更新/遷移當前場景", + "CoC7.Migrate.Complete": "完成數據遷移", + "CoC7.ToolTipSanity": "${game.i18n.localize('CoC7.CleanSkillListHint')}
`, + // yes: () => clean(this) + // }) + // async function clean (actor) { + // const update = [] + // actor.skills.forEach(s => { + // if (s.data.data.properties.special) { + // const clean = CoC7Item.getNameWithoutSpec(s)?.trim() + // if (clean.toLowerCase() != s.name.toLowerCase() || clean.toLowerCase() != s.data.name.toLowerCase()) { + // update.push({ + // _id: s.id, + // name: clean + // }) + // } + // } + // }) + // if (update.length != 0){ + // await actor.updateEmbeddedDocuments('Item', update) + // ui.notifications.info( `Skills : ${Array.from( update, e => e.name).join(', ')} updated.`) + // } else { + // ui.notifications.info( 'Skill list was clean already !') + // } + // } + // } + + /** @override */ + async createSkill (skillName, value, showSheet = false) { + const data = CoCActor.emptySkill(skillName, value) const created = await this.createEmbeddedDocuments('Item', [data], { renderSheet: showSheet - }) // MODIF: 0.8.x 'OwnedItmem' => 'Item + }) return created } @@ -485,15 +570,18 @@ export class CoCActor extends Actor { name ) const value = Number(skillData.get('base-value')) + const parts = CoC7Item.getNamePartsSpec( + name, + game.i18n.localize( + firearms + ? 'CoC7.FirearmSpecializationName' + : 'CoC7.FightingSpecializationName' + ) + ) const data = { - name: name, + name: parts.name, type: 'skill', data: { - specialization: game.i18n.localize( - firearms - ? 'CoC7.FirearmSpecializationName' - : 'CoC7.FightingSpecializationName' - ), base: isNaN(value) ? 0 : value, adjustments: { personal: null, @@ -501,6 +589,8 @@ export class CoCActor extends Actor { archetype: null, experience: null }, + skillName: parts.skillName, + specialization: parts.specialization, properties: { special: true, fighting: !firearms, @@ -511,8 +601,7 @@ export class CoCActor extends Actor { } await this.createEmbeddedDocuments('Item', [data], { renderSheet: !base - }) // MODIF: 0.8.x 'OwnedItmem' => 'Item - // const created = await this.createEmbeddedDocuments('OwnedItem', data, { renderSheet: !base}); + }) const skill = this.getSkillsByName(name) return skill[0] } @@ -531,32 +620,32 @@ export class CoCActor extends Actor { if (skills.length === 0) { // Creating natural attack skill try { - const skill = await this.createEmbeddedDocuments( - 'Item', // MODIF: 0.8.x 'OwnedItmem' => 'Item - [ - { - name: game.i18n.localize(COC7.creatureFightingSkill), - type: 'skill', - data: { - base: 0, - value: null, - specialization: game.i18n.localize( - COC7.fightingSpecializationName - ), - properties: { - combat: true, - fighting: true, - special: true - }, - flags: {} - } - } - ], - { renderSheet: false } + const parts = CoC7Item.getNamePartsSpec( + game.i18n.localize(COC7.creatureFightingSkill), + game.i18n.localize(COC7.fightingSpecializationName) ) + const data = { + type: 'skill', + name: parts.name, + data: { + base: 0, + value: null, + skillName: parts.skillName, + specialization: parts.specialization, + properties: { + combat: true, + fighting: true, + special: true + }, + flags: {} + } + } + const skill = await this.createEmbeddedDocuments('Item', [data], { + renderSheet: false + }) const attack = await this.createEmbeddedDocuments( - 'Item', // MODIF: 0.8.x 'OwnedItmem' => 'Item + 'Item', [ { name: 'Innate attack', @@ -576,12 +665,13 @@ export class CoCActor extends Actor { ], { renderSheet: false } ) - - const createdAttack = this.items.get(attack._id) - await createdAttack.update({ - 'data.skill.main.id': skill._id, - 'data.skill.main.name': skill.name - }) + if (skill.length > 0 && attack.length > 0) { + const createdAttack = this.items.get(attack[0].id) + await createdAttack.update({ + 'data.skill.main.id': skill[0].id, + 'data.skill.main.name': skill[0].name + }) + } } catch (err) { console.error('Creature init: ' + err.message) } @@ -596,12 +686,69 @@ export class CoCActor extends Actor { name: itemName, type: 'item', data: { - quantity: quantity + quantity } } const created = await this.createEmbeddedDocuments('Item', [data], { renderSheet: showSheet - }) // MODIF: 0.8.x 'OwnedItmem' => 'Item + }) + return created + } + + async createEmptyBook (event = null) { + const showSheet = event ? !event.shiftKey : true + if (!this.getItemIdByName(game.i18n.localize(COC7.newBookName))) { + return this.createBook(game.i18n.localize(COC7.newBookName), showSheet) + } + let index = 0 + let itemName = game.i18n.localize(COC7.newBookName) + ' ' + index + while (this.getItemIdByName(itemName)) { + index++ + itemName = game.i18n.localize(COC7.newBookName) + ' ' + index + } + return this.createBook(itemName, showSheet) + } + + async createBook (itemName, showSheet = false) { + const data = { + name: itemName, + type: 'book', + data: {} + } + const created = await this.createEmbeddedDocuments('Item', [data], { + renderSheet: showSheet + }) + return created + } + + async createEmptySpell (event = null) { + const showSheet = event ? !event.shiftKey : true + if (!this.getItemIdByName(game.i18n.localize(COC7.newSpellName))) { + return this.createSpell(game.i18n.localize(COC7.newSpellName), showSheet) + } + let index = 0 + let itemName = game.i18n.localize(COC7.newSpellName) + ' ' + index + while (this.getItemIdByName(itemName)) { + index++ + itemName = game.i18n.localize(COC7.newSpellName) + ' ' + index + } + return this.createSpell(itemName, showSheet) + } + + static emptySpell (itemName) { + const data = { + name: itemName, + type: 'spell', + data: {} + } + return data + } + + async createSpell (itemName, showSheet = false) { + const data = CoCActor.emptySpell(itemName) + const created = await this.createEmbeddedDocuments('Item', [data], { + renderSheet: showSheet + }) return created } @@ -635,11 +782,10 @@ export class CoCActor extends Actor { index++ itemName = game.i18n.localize(COC7.newItemName) + ' ' + index } - return this.createItem(itemName, 1, showSheet) } - async createEmptyWeapon (event = null) { + async createEmptyWeapon (event = null, properties = {}) { const showSheet = event ? !event.shiftKey : true let weaponName = game.i18n.localize(COC7.newWeaponName) if (this.getItemIdByName(game.i18n.localize(COC7.newWeaponName))) { @@ -660,11 +806,13 @@ export class CoCActor extends Actor { } for (const [key] of Object.entries(COC7.weaponProperties)) { - data.data.properties[key] = false + data.data.properties[key] = + Object.prototype.hasOwnProperty.call(properties, key) ?? false } + await this.createEmbeddedDocuments('Item', [data], { renderSheet: showSheet - }) // MODIF: 0.8.x 'OwnedItmem' => 'Item + }) } async createBioSection (title = null) { @@ -672,7 +820,7 @@ export class CoCActor extends Actor { ? duplicate(this.data.data.biography) : [] bio.push({ - title: title, + title, value: null }) await this.update({ 'data.biography': bio }) @@ -727,17 +875,23 @@ export class CoCActor extends Actor { * @param {*} options */ async createEmbeddedDocuments (embeddedName, dataArray, options) { - const output = [] + const processedDataArray = [] + let baseValue = 0 + let baseCalculated = 0 + let archetype = false + let occupation = false for (const data of dataArray) { switch (data.type) { case 'skill': + baseValue = data.data.base + baseCalculated = await CoC7Item.calculateBase(this, data) if (this.data.type !== 'character') { // If not a PC set skill value to base if (this.getItemIdByName(data.name)) return // If skill with this name exist return - if (data.data.base) { - if (String(data.data.base) !== String(data.data.value)) { - data.data.value = data.data.base + if (baseValue) { + if (String(baseValue) !== String(data.data.value)) { + data.data.value = baseCalculated } } @@ -758,109 +912,97 @@ export class CoCActor extends Actor { } else data.data.value = null if (CoC7Item.isAnySpec(data)) { - const specialization = data.data.specialization?.toLowerCase() - if (specialization) { - let skillList = [] - if (data.data?.flags?.occupation || data.data?.flags?.archetype) { - skillList = this.skills.filter(el => { - if (!el.data.data.specialization) return false - if ( - data.data?.flags?.occupation && - el.data.data.flags?.occupation - ) { - return false - } - if ( - data.data?.flags?.archetype && - el.data.data.flags?.archetype - ) { - return false - } - return ( - specialization.toLowerCase() === - el.data.data.specialization?.toLowerCase() - ) - }) - } - // if( 1 <= skillList.length) { - const skillData = await SkillSpecSelectDialog.create( - skillList, - data.data.specialization, - data.data.base - ) - if (skillData) { - if (skillData.get('existing-skill')) { - const existingItem = this.items.get( - skillData.get('existing-skill') - ) - for (const [key, value] of Object.entries(data.data.flags)) { - if (value) await existingItem.setItemFlag(key) - } - data.name = CoC7Item.getNameWithoutSpec(existingItem) - return - } else { - if (skillData.get('new-skill-name')) { - data.name = skillData.get('new-skill-name') - } else data.name = CoC7Item.getNameWithoutSpec(data) - - if (skillData.get('base-value')) { - const value = Number(skillData.get('base-value')) - if (!isNaN(value)) data.data.base = value - } + let skillList = [] + if (data.data?.flags?.occupation || data.data?.flags?.archetype) { + skillList = this.skills.filter(el => { + if (!el.data.data.specialization) return false + if ( + data.data?.flags?.occupation && + el.data.data.flags?.occupation + ) { + return false } - } + if ( + data.data?.flags?.archetype && + el.data.data.flags?.archetype + ) { + return false + } + return ( + data.data.specialization.toLocaleLowerCase() === + el.data.data.specialization.toLocaleLowerCase() + ) + }) } - // } - } else { - const specialization = data.data.specialization - if (specialization) { - data.name = CoC7Item.getNameWithoutSpec(data) + const skillData = await SkillSpecSelectDialog.create( + skillList, + data.data.specialization, + baseCalculated + ) + if (skillData) { + baseCalculated = skillData.get('base-value') + data.data.value = baseCalculated + if (skillData.get('existing-skill')) { + const existingItem = this.items.get( + skillData.get('existing-skill') + ) + for (const [key, value] of Object.entries(data.data.flags)) { + if (value) await existingItem.setItemFlag(key) + } + data.name = CoC7Item.getNameWithoutSpec(existingItem) + return + } else { + const parts = CoC7Item.getNamePartsSpec( + skillData.get('new-skill-name'), + data.data.specialization + ) + data.data.skillName = parts.skillName + data.name = parts.name + } } } - output.push(await super.createEmbeddedDocuments( - embeddedName, - [data], - options - )) + if (String(baseValue) !== String(baseCalculated)) { + data.data.base = baseCalculated + } + + processedDataArray.push(duplicate(data)) break case 'weapon': { - const mainSkill = data.data?.skill?.main?.name - if (mainSkill) { - let skill = this.getSkillsByName(mainSkill)[0] - if (!skill) { - const name = mainSkill.match(/\(([^)]+)\)/) - ? mainSkill.match(/\(([^)]+)\)/)[1] - : mainSkill - skill = await this.createWeaponSkill( - name, - !!data.data.properties?.rngd - ) - } - if (skill) data.data.skill.main.id = skill.id - } // TODO : Else : selectionner le skill dans la liste ou en créer un nouveau. - - const secondSkill = data.data?.skill?.alternativ?.name - if (secondSkill) { - let skill = this.getSkillsByName(secondSkill)[0] - if (!skill) { - const name = mainSkill.match(/\(([^)]+)\)/) - ? mainSkill.match(/\(([^)]+)\)/)[1] - : mainSkill - skill = await this.createWeaponSkill( - name, - !!data.data.properties?.rngd - ) - } - if (skill) data.data.skill.alternativ.id = skill.id - } // TODO : Else : selectionner le skill dans la liste ou en créer un nouveau. - - output.push(await super.createEmbeddedDocuments( - embeddedName, - [duplicate(data)], - options - )) + if (this.data.type !== 'container') { + const mainSkill = data.data?.skill?.main?.name + if (mainSkill) { + let skill = this.getSkillsByName(mainSkill)[0] + if (!skill) { + const name = mainSkill.match(/\(([^)]+)\)/) + ? mainSkill.match(/\(([^)]+)\)/)[1] + : mainSkill + skill = await this.createWeaponSkill( + name, + !!data.data.properties?.rngd + ) + } + if (skill) data.data.skill.main.id = skill.id + } // TODO : Else : selectionner le skill dans la liste ou en créer un nouveau. + + const secondSkill = data.data?.skill?.alternativ?.name + if (secondSkill) { + let skill = this.getSkillsByName(secondSkill)[0] + if (!skill) { + const name = mainSkill.match(/\(([^)]+)\)/) + ? mainSkill.match(/\(([^)]+)\)/)[1] + : mainSkill + skill = await this.createWeaponSkill( + name, + !!data.data.properties?.rngd + ) + } + if (skill) data.data.skill.alternativ.id = skill.id + } // TODO : Else : selectionner le skill dans la liste ou en créer un nouveau. + } + + processedDataArray.push(duplicate(data)) break } @@ -913,20 +1055,36 @@ export class CoCActor extends Actor { } else { data.data.title = game.i18n.localize('CoC7.RollCharac') } - data.data.pointsWarning = !(data.data.characteristics.values.str !== null && data.data.characteristics.values.con !== null && data.data.characteristics.values.siz !== null && data.data.characteristics.values.dex !== null && data.data.characteristics.values.app !== null && data.data.characteristics.values.int !== null && data.data.characteristics.values.pow !== null && data.data.characteristics.values.edu !== null) + data.data.pointsWarning = !( + data.data.characteristics.values.str !== null && + data.data.characteristics.values.con !== null && + data.data.characteristics.values.siz !== null && + data.data.characteristics.values.dex !== null && + data.data.characteristics.values.app !== null && + data.data.characteristics.values.int !== null && + data.data.characteristics.values.pow !== null && + data.data.characteristics.values.edu !== null + ) const rolled = await CharacRollDialog.create(data.data) if (rolled) { const updateData = {} - ;['str', 'con', 'siz', 'dex', 'app', 'int', 'pow', 'edu'].forEach( - key => { - if (data.data.characteristics.values[key]) { - updateData[`data.characteristics.${key}.value`] = - data.data.characteristics.values[key] - updateData[`data.characteristics.${key}.formula`] = - data.data.characteristics.rolls[key] - } + for (const key of [ + 'str', + 'con', + 'siz', + 'dex', + 'app', + 'int', + 'pow', + 'edu' + ]) { + if (data.data.characteristics.values[key]) { + updateData[`data.characteristics.${key}.value`] = + data.data.characteristics.values[key] + updateData[`data.characteristics.${key}.formula`] = + data.data.characteristics.rolls[key] } - ) + } if (data.data.characteristics.values.luck) { updateData['data.attribs.lck.value'] = data.data.characteristics.values.luck @@ -934,18 +1092,17 @@ export class CoCActor extends Actor { if (data.data.characteristics.values.pow) { updateData['data.attribs.san.value'] = data.data.characteristics.values.pow - updateData['data.attribs.san.oneFifthSanity'] = - ' / ' + Math.floor(data.data.characteristics.values.pow / 5) - updateData['data.indefiniteInsanityLevel.max'] = updateData[ - 'data.attribs.mp.value' - ] = updateData['data.attribs.mp.max'] = Math.floor( + updateData['data.attribs.san.dailyLimit'] = Math.floor( + data.data.characteristics.values.pow / 5 + ) + updateData['data.attribs.mp.max'] = Math.floor( data.data.characteristics.values.pow / 5 ) } await this.update(updateData) await this.update({ - 'data.attribs.hp.value': this.hpMax, - 'data.attribs.hp.max': this.hpMax + 'data.attribs.hp.value': this.rawHpMax, + 'data.attribs.hp.max': this.rawHpMax }) } else return } @@ -958,7 +1115,7 @@ export class CoCActor extends Actor { } else { for (const sectionName of data.data.bioSections) { if ( - !this.data.data.biography.find( + !this.data.data.biography?.find( el => sectionName === el.title ) && sectionName @@ -967,6 +1124,7 @@ export class CoCActor extends Actor { } } } + Hooks.call('setupFinishedCoC7') break } case 'archetype': @@ -989,7 +1147,7 @@ export class CoCActor extends Actor { } const coreCharac = [] - Object.entries(data.data.coreCharacteristics).forEach(entry => { + for (const entry of Object.entries(data.data.coreCharacteristics)) { const [key, value] = entry data.data.coreCharacteristics[key] = false if (value) { @@ -997,7 +1155,7 @@ export class CoCActor extends Actor { char.key = key coreCharac.push(char) } - }) + } let charac @@ -1021,7 +1179,13 @@ export class CoCActor extends Actor { ) await roll.roll({ async: true }) roll.toMessage({ - flavor: `Rolling characterisitic ${char.label}: ${data.data.coreCharacteristicsFormula.value}` + flavor: game.i18n.format( + 'CoC7.MessageRollingCharacteristic', + { + label: char.label, + formula: data.data.coreCharacteristicsFormula.value + } + ) }) value = char.value < roll.total ? roll.total : char.value } @@ -1033,17 +1197,8 @@ export class CoCActor extends Actor { // Add all skills await this.addUniqueItems(data.data.skills, 'archetype') - const newArchetype = await super.createEmbeddedDocuments( - embeddedName, - [data], - options - ) - // setting points - await this.update({ - 'data.development.archetype': this.archetypePoints - }) - - output.push(newArchetype) + processedDataArray.push(duplicate(data)) + archetype = true } break @@ -1071,7 +1226,9 @@ export class CoCActor extends Actor { pointsDialogData.characteristics = data.data.occupationSkillPoints let total = 0 let optionalChar = false - Object.entries(data.data.occupationSkillPoints).forEach(entry => { + for (const entry of Object.entries( + data.data.occupationSkillPoints + )) { const [key, value] = entry const char = this.getCharacteristic(key) pointsDialogData.characteristics[key].name = char.label @@ -1086,7 +1243,7 @@ export class CoCActor extends Actor { optionalChar = true } } - }) + } pointsDialogData.total = total if (optionalChar) { // Is there any optional char to choose for points calc ? @@ -1104,7 +1261,7 @@ export class CoCActor extends Actor { dialogData.title = game.i18n.localize('CoC7.SkillSelectionWindow') // Select only skills that are not present or are not flagged as occupation. - data.data.groups[index].skills.forEach(value => { + for (const value of data.data.groups[index].skills) { if (CoC7Item.isAnySpec(value)) dialogData.skills.push(value) // If it's a generic spec we always add it else { @@ -1119,19 +1276,10 @@ export class CoCActor extends Actor { if (!alreadySelectedSkill) dialogData.skills.push(value) } } - }) + } // if there's none, do nothing. if (dialogData.skills.length !== 0) { - dialogData.skills.forEach(skill => { - if ( - skill.data.specialization && - !skill.name.includes(skill.data.specialization) - ) { - skill.displayName = `${skill.data.specialization} (${skill.name})` - } else skill.displayName = skill.name - }) - if (dialogData.skills.length <= dialogData.optionsCount) { // If there's is less skill than options, add them all. ui.notifications.info( @@ -1175,7 +1323,7 @@ export class CoCActor extends Actor { }) // Select only skills that are not present or are not flagged as occupation. - this.skills.forEach(s => { + for (const s of this.skills) { // Select all skills that are not already flagged as occupation, can have adjustments and XP. if ( !s.data.data.flags.occupation && @@ -1188,18 +1336,10 @@ export class CoCActor extends Actor { }) if (!alreadySelectedSkill) dialogData.skills.push(s.data) } - }) + } // if there's none, do nothing. if (dialogData.skills.length !== 0) { - dialogData.skills.forEach(skill => { - if ( - skill.data.specialization && - !skill.name.includes(skill.data.specialization) - ) { - skill.displayName = `${skill.data.specialization} (${skill.name})` - } else skill.displayName = skill.name - }) if (dialogData.skills.length <= dialogData.optionsCount) { // If there's is less skill than options, add them all. ui.notifications.info( @@ -1240,37 +1380,48 @@ export class CoCActor extends Actor { 'data.adjustments.occupation': Number(data.data.creditRating.min) }) - const newOccupation = await super.createEmbeddedDocuments( - embeddedName, - [data], - options - ) - // setting points - await this.update({ - 'data.development.occupation': this.occupationPoints, - 'data.development.personal': this.personalPoints - }) - - output.push(newOccupation) + processedDataArray.push(duplicate(data)) + occupation = true } break default: - output.push(await super.createEmbeddedDocuments( - embeddedName, - [data], - options - )) + processedDataArray.push(duplicate(data)) } } - return output + if (processedDataArray.length === 0) { + return [] + } + const processed = await super.createEmbeddedDocuments( + embeddedName, + processedDataArray, + options + ) + + if (archetype) { + // setting points + await this.update({ + 'data.development.archetype': this.archetypePoints + }) + Hooks.call('archetypeFinishedCoC7') + } + if (occupation) { + // setting points + await this.update({ + 'data.development.occupation': this.occupationPoints, + 'data.development.personal': this.personalPoints + }) + Hooks.call('occupationFinishedCoC7') + } + + return processed } // getSkillIdByName( skillName){ // let id = null; - // this.items.forEach( (value, key, map) => { + // for (const [map, key, value] of this.items) { // if( value.name == skillName) id = value.id; - // }); + // }; // return id; // } @@ -1280,22 +1431,22 @@ export class CoCActor extends Actor { const name = itemName.match(/\(([^)]+)\)/) ? itemName.match(/\(([^)]+)\)/)[1] : itemName - this.items.forEach(value => { + for (const value of this.items) { if ( CoC7Item.getNameWithoutSpec(value).toLowerCase() === name.toLowerCase() ) { id = value.id } - }) + } return id } getItemsByName (itemName) { const itemList = [] - this.items.forEach(value => { + for (const value of this.items) { if (value.name === itemName) itemList.push(value) - }) + } return itemList } @@ -1311,7 +1462,7 @@ export class CoCActor extends Actor { ? skillName.match(/\(([^)]+)\)/)[1] : skillName - this.items.forEach(value => { + for (const value of this.items) { if ( CoC7Item.getNameWithoutSpec(value).toLowerCase() === name.toLowerCase() && @@ -1319,7 +1470,7 @@ export class CoCActor extends Actor { ) { skillList.push(value) } - }) + } return skillList } @@ -1347,7 +1498,7 @@ export class CoCActor extends Actor { game.system.template.Actor.templates.characteristics.characteristics )) { characteristics.push({ - key: key, + key, shortName: game.i18n.localize(value.short), label: game.i18n.localize(value.label) }) @@ -1368,7 +1519,7 @@ export class CoCActor extends Actor { key === charName.toLowerCase() ) { return { - key: key, + key, shortName: game.i18n.localize(value.short), label: game.i18n.localize(value.label), value: value.value @@ -1409,6 +1560,18 @@ export class CoCActor extends Actor { return null } + async runRoll (options = {}) { + if (typeof options.cardType === 'undefined') { + options.cardType = CoC7ChatMessage.CARD_TYPE_NORMAL + } + if (typeof options.preventStandby === 'undefined') { + options.preventStandby = true + } + options.actor = this + const results = await CoC7ChatMessage.trigger(options) + return results + } + get occupation () { const occupation = this.items.filter(item => item.type === 'occupation') return occupation[0] @@ -1446,7 +1609,7 @@ export class CoCActor extends Actor { } get luck () { - return parseInt(this.data.data.attribs.lck.value) + return parseInt(this.data.data.attribs?.lck?.value) } async setLuck (value) { @@ -1460,42 +1623,23 @@ export class CoCActor extends Actor { } get hp () { - if (['vehicle'].includes(this.data.type)) { - if ( - this.data.data.attribs.build.current === null || - undefined === this.data.data.attribs.build.current || - this.data.data.attribs.build.current === '' - ) { - return this.build - } - if ( - this.data.data.attribs.build.current > - this.data.data.attribs.build.value - ) { - return this.build - } - const hp = parseInt(this.data.data.attribs.build.current) - return isNaN(hp) ? null : hp - } return parseInt(this.data.data.attribs.hp.value) } - get hpMax () { - if (['vehicle'].includes(this.data.type)) return this.build + get rawHpMax () { if (this.data.data.attribs.hp.auto) { if ( this.data.data.characteristics.siz.value != null && this.data.data.characteristics.con.value != null ) { - const maxHP = Math.floor( + return Math.floor( (this.data.data.characteristics.siz.value + this.data.data.characteristics.con.value) / - 10 + (game.settings.get('CoC7', 'pulpRuleDoubleMaxHealth') && + this.data.type === 'character' + ? 5 + : 10) ) - return game.settings.get('CoC7', 'pulpRules') && - this.data.type === 'character' - ? maxHP * 2 - : maxHP } if (this.data.data.attribs.hp.max) { return parseInt(this.data.data.attribs.hp.max) @@ -1505,27 +1649,25 @@ export class CoCActor extends Actor { return parseInt(this.data.data.attribs.hp.max) } - async setHp (value) { + get hpMax () { + return parseInt(this.data.data.attribs.hp.max) + } + + async _setHp (value) { if (value < 0) value = 0 - if (['vehicle'].includes(this.data.type)) { - if (value > this.build) value = parseInt(this.build) - return await this.update({ 'data.attribs.build.current': value }) + if (value > this.data.data.attribs.hp.max) { + value = parseInt(this.data.data.attribs.hp.max) } - if (value > this.hpMax) value = parseInt(this.hpMax) return await this.update({ 'data.attribs.hp.value': value }) } async addUniqueItems (skillList, flag = null) { + const processed = [] for (const skill of skillList) { if (CoC7Item.isAnySpec(skill)) { if (!skill.data.flags) skill.data.flags = {} if (flag) skill.data.flags[flag] = true - /** MODIF 0.8.x **/ - // await this.createOwnedItem( skill, {renderSheet:false}); - await this.createEmbeddedDocuments('Item', [skill], { - renderSheet: false - }) - /*****************/ + processed.push(duplicate(skill)) } else { const itemId = this.getItemIdByName(skill.name) if (!itemId) { @@ -1533,33 +1675,36 @@ export class CoCActor extends Actor { if (!skill.data.flags) skill.data.flags = {} skill.data.flags[flag] = true } - /** MODIF 0.8.x **/ - // await this.createOwnedItem( skill, {renderSheet:false}); - await this.createEmbeddedDocuments('Item', [skill], { - renderSheet: false - }) - /*****************/ + processed.push(duplicate(skill)) } else if (flag) { const item = this.items.get(itemId) await item.setItemFlag(flag) } } } + if (processed.length === 0) { + return + } + await this.createEmbeddedDocuments('Item', processed, { + renderSheet: false + }) } async addItems (itemList, flag = null) { + const processed = [] for (const item of itemList) { if (flag) { if (!item.data.flags) item.data.flags = {} item.data.flags[flag] = true } - /** MODIF 0.8.x **/ - // await this.createOwnedItem( item, {renderSheet:false}); - await this.createEmbeddedDocuments('Item', [item], { - renderSheet: false - }) - /*****************/ + processed.push(duplicate(item)) + } + if (processed.length === 0) { + return } + return await this.createEmbeddedDocuments('Item', processed, { + renderSheet: false + }) } async addUniqueItem (skill, flag = null) { @@ -1569,366 +1714,98 @@ export class CoCActor extends Actor { if (!skill.data.flags) skill.data.flags = {} skill.data.flags[flag] = true } - /** MODIF 0.8.x **/ - // await this.createOwnedItem( skill, {renderSheet:false}); await this.createEmbeddedDocuments('Item', [skill], { renderSheet: false }) - /*****************/ } else if (flag) { const item = this.items.get(itemId) await item.setItemFlag(flag) } } - get mpMax () { + get rawMpMax () { if (this.data.data.attribs.mp.auto) { if (this.data.data.characteristics.pow.value != null) { return Math.floor(this.data.data.characteristics.pow.value / 5) - } else return null + } else return 0 } return parseInt(this.data.data.attribs.mp.max) } - encounteredCreaturesSanData (creature) { - const i = this.encounteredCreaturesSanDataIndex(creature) - if (i !== -1) return this.data.data.encounteredCreatures[i] - return null - } - - encounteredCreaturesSanDataIndex (creature) { - const sanData = CoC7Utilities.getCreatureSanData(creature) - return this.data.data.encounteredCreatures.findIndex(cd => { + getReasonSanLoss (sanReason) { + if (typeof sanReason === 'string') { return ( - cd.id === sanData?.id || - cd.name.toLowerCase() === sanData.name?.toLocaleLowerCase() + this.data.data.sanityLossEvents.filter( + r => r.type.toLocaleLowerCase() === sanReason.toLocaleLowerCase() + )[0] ?? { type: '', totalLoss: 0, immunity: false } ) - }) - } - - sanLostToCreature (creature) { - const sanData = this.encounteredCreaturesSanData(creature) - if (sanData) { - // check for if specie already encountered return max of both; - if (sanData.specie) { - return Math.max(sanData.specie.totalLoss || 0, sanData.totalLoss) - } - - return sanData.totalLoss || 0 - } else { - // That creature was never encountered. What about his specie. - const creatureSanData = CoC7Utilities.getCreatureSanData(creature) - if (creatureSanData.specie) { - const specieEncountered = this.encounteredCreaturesSanData( - creatureSanData.specie - ) - if (specieEncountered) return specieEncountered.totalLoss - } - return 0 // Never encountered that specie or this creature. - } - } - - maxPossibleSanLossToCreature (creature) { - // Do we know you ? - const sanData = this.encounteredCreaturesSanData(creature) - const creatureSanData = CoC7Utilities.getCreatureSanData(creature) - - if (sanData) { - // Was there any update to that creature ? - let changes = false - if (creatureSanData.sanLossMax !== sanData.sanLossMax) { - sanData.sanLossMax = creatureSanData.sanLossMax - changes = true - } - if (creatureSanData.specie && !sanData.specie) { - sanData.specie = creatureSanData.specie - changes = true - } - if ( - creatureSanData.specie && - creatureSanData.specie.sanLossMax !== sanData.specie.sanLossMax - ) { - sanData.specie.sanLossMax = creatureSanData.specie.sanLossMax - changes = true - } - if (sanData.totalLoss > sanData.sanLossMax) { - sanData.totalLoss = sanData.sanLossMax - changes = true - } - if ( - sanData.specie && - sanData.specie.totalLoss > sanData.specie.sanLossMax - ) { - sanData.specie.totalLoss = sanData.specie.sanLossMax - changes = true - } - - if (changes) { - const encounteredCreaturesList = this.data.data.encounteredCreatures - ? duplicate(this.data.data.encounteredCreatures) - : [] - const sanDataIndex = this.encounteredCreaturesSanDataIndex(creature) - encounteredCreaturesList[sanDataIndex] = sanData - if (sanData.specie) { - this._updateAllOfSameSpecie(encounteredCreaturesList, sanData.specie) - } - - this.update({ - 'data.encounteredCreatures': encounteredCreaturesList - }) - } - - return sanData.sanLossMax - sanData.totalLoss - } - // We don't know you. - if (creatureSanData) { - const sanLostToCreature = this.sanLostToCreature(creature) - return Math.max(0, creatureSanData.sanLossMax - sanLostToCreature) - } - return 99 - } - - creatureEncountered (creature) { - return !!~this.encounteredCreaturesSanDataIndex(creature) - } - - creatureSpecieEncountered (creature) { - const creatureSanData = CoC7Utilities.getCreatureSanData(creature) - if (creatureSanData.specie) { - return !!~this.encounteredCreaturesSanDataIndex(creatureSanData.specie) - } - return this.creatureEncountered(creature) - } - - _updateAllOfSameSpecie (encounteredCreaturesList, specieSanData) { - for (let index = 0; index < encounteredCreaturesList.length; index++) { - if ( - encounteredCreaturesList[index].specie?.id === specieSanData.id || - encounteredCreaturesList[index].specie?.name.toLowerCase() === - specieSanData.name?.toLowerCase() - ) { - // New encounter with that specie. - if ( - encounteredCreaturesList[index].specie.totalLoss !== - specieSanData.totalLoss - ) { - const delta = - specieSanData.totalLoss - - encounteredCreaturesList[index].specie.totalLoss - if (delta > 0) { - encounteredCreaturesList[index].specie = specieSanData - encounteredCreaturesList[index].totalLoss += delta - encounteredCreaturesList[index].totalLoss = Math.min( - encounteredCreaturesList[index].totalLoss, - encounteredCreaturesList[index].sanLossMax - ) - } - } - } } + return { type: '', totalLoss: 0, immunity: false } } - _removeSpecie (encounteredCreaturesList, specieSanData) { - for (let index = 0; index < encounteredCreaturesList.length; index++) { - if ( - encounteredCreaturesList[index].specie?.id === specieSanData.id || - encounteredCreaturesList[index].specie?.name.toLowerCase() === - specieSanData.name?.toLowerCase() - ) { - const previousSpecieLost = - encounteredCreaturesList[index].specie.totalLoss - delete encounteredCreaturesList[index].specie - - encounteredCreaturesList[index].totalLoss = - encounteredCreaturesList[index].totalLoss - previousSpecieLost - if (encounteredCreaturesList[index].totalLoss < 0) { - encounteredCreaturesList[index].totalLoss = 0 - } - } - } - } - - async resetCreature (creature) { - const indexSanData = this.encounteredCreaturesSanDataIndex(creature) - if (~indexSanData) { - const creatureSanData = CoC7Utilities.getCreatureSanData(creature) - const encounteredCreaturesList = this.data.data.encounteredCreatures - ? duplicate(this.data.data.encounteredCreatures) - : [] - encounteredCreaturesList.splice(indexSanData, 1) - creatureSanData.totalLoss = 0 - if (creatureSanData.specie) delete creatureSanData.specie - this._updateAllOfSameSpecie(encounteredCreaturesList, creatureSanData) - await this.update({ - 'data.encounteredCreatures': encounteredCreaturesList - }) + sanLostToReason (sanReason) { + if (sanReason) { + const sanityLossEvent = this.getReasonSanLoss(sanReason) + return sanityLossEvent.totalLoss } + return 0 } - async resetSpecie (creature) { - const encounteredCreaturesList = this.data.data.encounteredCreatures - ? duplicate(this.data.data.encounteredCreatures) - : [] - const creatureSanData = CoC7Utilities.getCreatureSanData(creature) - if (!creatureSanData.specie) return - const indexSanData = this.encounteredCreaturesSanDataIndex( - creatureSanData.specie - ) - if (~indexSanData) { - encounteredCreaturesList.splice(indexSanData, 1) + sanLossReasonEncountered (sanReason) { + if (sanReason) { + const sanityLossEvent = this.getReasonSanLoss(sanReason) + return sanityLossEvent.type !== '' } - this._removeSpecie(encounteredCreaturesList, creatureSanData.specie) - await this.update({ - 'data.encounteredCreatures': encounteredCreaturesList - }) - return false } - async looseSanToCreature (sanLoss, creature) { - let exactSanLoss = sanLoss - // Get that creature SAN data. - const creatureSanData = CoC7Utilities.getCreatureSanData(creature) - - // Get actor SAN data for that creature. - const indexSanData = this.encounteredCreaturesSanDataIndex(creature) - - // Check if that creature belongs to a specie and have we already encoutered it. - let indexSpeciesSanData = -1 - if (creatureSanData.specie?.id) { - indexSpeciesSanData = this.encounteredCreaturesSanDataIndex( - creatureSanData.specie.id - ) - } - if (indexSpeciesSanData === -1 && creatureSanData.specie?.name) { - indexSpeciesSanData = this.encounteredCreaturesSanDataIndex( - creatureSanData.specie.name + setReasonSanLoss (sanReason, sanLoss) { + if (typeof sanReason === 'string' && sanReason !== '') { + const sanityLossEvents = duplicate(this.data.data.sanityLossEvents) + const index = sanityLossEvents.findIndex( + r => r.type.toLocaleLowerCase() === sanReason.toLocaleLowerCase() ) - } - - // Copy the array for updating. - const encounteredCreaturesList = this.data.data.encounteredCreatures - ? duplicate(this.data.data.encounteredCreatures) - : [] - - // Creature already encountered. - if (~indexSanData) { - const oldSanData = encounteredCreaturesList[indexSanData] - let newSanData - // Update sanData with new SAN data (might have been updated ?) - if (creatureSanData) { - newSanData = creatureSanData - newSanData.totalLoss = oldSanData.totalLoss || 0 - if (newSanData.specie) { - newSanData.specie.totalLoss = oldSanData.specie?.totalLoss - ? oldSanData.specie.totalLoss - : 0 - } else { - if (oldSanData.specie) newSanData.specie = oldSanData.specie // Should never happen - } - } - - newSanData.totalLoss = newSanData.totalLoss - ? newSanData.totalLoss + sanLoss - : sanLoss - if (newSanData.totalLoss > newSanData.sanLossMax) { - exactSanLoss = - exactSanLoss - (newSanData.totalLoss - newSanData.sanLossMax) - newSanData.totalLoss = newSanData.sanLossMax - } - - // Credit the loss to that creature specie as well if it exists. - if (newSanData.specie) { - newSanData.specie.totalLoss = newSanData.specie.totalLoss - ? newSanData.specie.totalLoss + exactSanLoss - : exactSanLoss - if (newSanData.specie.totalLoss > newSanData.specie.sanLossMax) { - newSanData.specie.totalLoss = newSanData.specie.sanLossMax - } - - // Update all creture from the same specie. - this._updateAllOfSameSpecie(encounteredCreaturesList, newSanData.specie) - } - - encounteredCreaturesList[indexSanData] = newSanData - // Update the specie also : - if (~indexSpeciesSanData && newSanData.specie) { - encounteredCreaturesList[indexSpeciesSanData] = newSanData.specie - } else { - // We already encoutered that specie - // Should never happen (encountered that creature but never his specie). - if (newSanData.specie) encounteredCreaturesList.push(newSanData.specie) - } - } else { - // Creature never encountered. - const newSanData = creatureSanData - newSanData.totalLoss = 0 - - if (newSanData.specie) { - // Specie already encountered. - if (~indexSpeciesSanData) { - newSanData.specie.totalLoss = - encounteredCreaturesList[indexSpeciesSanData].totalLoss - - // We already loss SAN to this specie of creature. The base los for this creature is the specie base loss. - newSanData.totalLoss = newSanData.specie.totalLoss - if (newSanData.totalLoss > newSanData.sanLossMax) { - newSanData.totalLoss = newSanData.sanLossMax - } - } else { - // We never encountered specie or creature. - newSanData.specie.totalLoss = 0 - newSanData.totalLoss = 0 - } - } - - // Apply the san loss to that creature. - newSanData.totalLoss = newSanData.totalLoss + sanLoss - - // If loss is more thant creature Max. - if (newSanData.totalLoss > newSanData.sanLossMax) { - // Get the exact san loss = loss - (overflow - max) - exactSanLoss = - exactSanLoss - (newSanData.totalLoss - newSanData.sanLossMax) - newSanData.totalLoss = newSanData.sanLossMax - } - - // Deduct the exact loss to that specie. - if (newSanData.specie) { - // Wait for exact san LOSS before deduciting it from specie. - newSanData.specie.totalLoss = newSanData.specie.totalLoss + exactSanLoss - if (newSanData.specie.totalLoss > newSanData.specie.sanLossMax) { - newSanData.specie.totalLoss = newSanData.specie.sanLossMax - } - - // If we now that specie update it. If we don't add it. - if (~indexSpeciesSanData) { - encounteredCreaturesList[indexSpeciesSanData] = newSanData.specie + if (sanLoss > 0) { + if (index === -1) { + sanityLossEvents.push({ + type: sanReason, + totalLoss: sanLoss, + immunity: false + }) } else { - encounteredCreaturesList.push(newSanData.specie) + sanityLossEvents[index].totalLoss += sanLoss } - - // Update all creature from the same specie. - this._updateAllOfSameSpecie(encounteredCreaturesList, newSanData.specie) + } else if (index > -1) { + sanityLossEvents.splice(index, 1) + sanityLossEvents.sort(function (left, right) { + return left.type.localeCompare(right.type) + }) } - - encounteredCreaturesList.push(newSanData) + return this.update({ + 'data.sanityLossEvents': sanityLossEvents + }) } - - await this.setSan(this.san - exactSanLoss) - await this.update({ - 'data.encounteredCreatures': encounteredCreaturesList - }) - return exactSanLoss } - async looseSan (sanLoss, creature = null) { - if (creature) await this.looseSanToCreature(sanLoss, creature) - else await this.setSan(this.san - sanLoss) + maxLossToSanReason (sanReason, sanMaxFormula) { + const sanMax = new Roll(sanMaxFormula.toString()).evaluate({ + maximize: true + }).total + const sanityLossEvent = this.getReasonSanLoss(sanReason) + if (sanityLossEvent.immunity) { + return 0 + } + return Math.max(0, sanMax - sanityLossEvent.totalLoss) } - get sanData () { - return CoC7Utilities.getCreatureSanData(this) + async looseSan (sanReason, sanLoss) { + const sanityLossEvent = this.getReasonSanLoss(sanReason) + if (!sanityLossEvent.immunity) { + await this.setSan(this.san - sanLoss) + this.setReasonSanLoss(sanReason, sanLoss) + return sanLoss + } + return 0 } sanLoss (checkPassed) { @@ -1972,22 +1849,37 @@ export class CoCActor extends Actor { return this.data.data.attribs.san?.dailyLoss || 0 } - get sanMax () { + get rawSanMax () { if (!this.data.data.attribs) return undefined if (this.data.data.attribs?.san?.auto) { if (this.cthulhuMythos) return Math.max(99 - this.cthulhuMythos, 0) return 99 } - return parseInt(this.data.data.attribs.san.max) - } - - get mp () { - return parseInt(this.data.data.attribs.mp.value) + return parseInt(this.data.data.attribs.san.max) + } + + get sanMax () { + return parseInt(this.data.data.attribs.san.max) + } + + get mp () { + return parseInt(this.data.data.attribs.mp.value) + } + + get mpMax () { + if (this.data.data.attribs.mp.auto) { + // TODO if any is null set max back to null. + if (this.data.data.characteristics.pow.value != null) { + return Math.floor(this.data.data.characteristics.pow.value / 5) + } + return 0 + } + return parseInt(this.data.data.attribs.mp.max) } async setMp (value) { if (value < 0) value = 0 - if (value > parseInt(this.mpMax)) value = parseInt(this.mpMax) + if (value > parseInt(this.data.data.attribs.mp.max)) { value = parseInt(this.data.data.attribs.mp.max) } return await this.update({ 'data.attribs.mp.value': value }) } @@ -2012,15 +1904,15 @@ export class CoCActor extends Actor { get occupationPoints () { if (!this.occupation) return 0 let points = 0 - Object.entries(this.occupation.data.data.occupationSkillPoints).forEach( - entry => { - const [key, value] = entry - const char = this.getCharacteristic(key) - if (value.selected) { - points += char.value * Number(value.multiplier) - } + for (const entry of Object.entries( + this.occupation.data.data.occupationSkillPoints + )) { + const [key, value] = entry + const char = this.getCharacteristic(key) + if (value.selected) { + points += char.value * Number(value.multiplier) } - ) + } return points } @@ -2081,55 +1973,39 @@ export class CoCActor extends Actor { return 2 * Number(this.data.data.characteristics.int.value) } - get hasSkillFlaggedForExp () { + get hasDevelopmentPhase () { for (const skill of this.skills) { if (skill.data.data.flags?.developement) return true } + if (this.onlyRunOncePerSession) { + return false + } + for (const sanityLossEvent of this.data.data.sanityLossEvents) { + if (!sanityLossEvent.immunity) return true + } return false } async setSan (value) { if (value < 0) value = 0 - if (value > this.sanMax) value = this.sanMax + if (value > this.data.data.attribs.san.max) { value = this.data.data.attribs.san.max } const loss = parseInt(this.data.data.attribs.san.value) - value - // if( creatureData){ - // const creatureIndex = this.data.data.encounteredCreatures.findIndex( c => { - // if( c.id && c.id == creatureData.id) return true; - // if( c.name && c.name.toLowerCase() == creatureData.name?.toLowerCase()) return true; - // return false;}); - // let encounteredCreaturesList; - // if( -1 < creatureIndex){ - // encounteredCreaturesList = this.data.data.encounteredCreatures ? duplicate( this.data.data.encounteredCreatures) : []; - // const maxLossRemaining = encounteredCreaturesList[creatureIndex].maxLoss - encounteredCreaturesList[creatureIndex].totalLoss; - // if( loss > maxLossRemaining) loss = maxLossRemaining; - // encounteredCreaturesList[creatureIndex].totalLoss += loss; - // } else { - // if( loss > createData.maxLoss) loss = createData.maxLoss; - // encounteredCreaturesList = [{ - // id: creatureData.id, - // name: creatureData.name, - // maxLoss: createData.maxLoss, - // totalLoss: loss - // }]; - // } - - // await this.item.update( { ['data.encounteredCreatures'] : encounteredCreaturesList}); - // } if (loss > 0) { let totalLoss = parseInt(this.data.data.attribs.san.dailyLoss) ? parseInt(this.data.data.attribs.san.dailyLoss) : 0 totalLoss = totalLoss + loss - if (loss >= 5) this.setStatus(COC7.status.tempoInsane) - if (totalLoss >= Math.floor(this.san / 5)) { - this.setStatus(COC7.status.indefInsane) + if (loss >= 5) this.setCondition(COC7.status.tempoInsane) + if (totalLoss >= this.data.data.attribs.san.dailyLimit) { + this.setCondition(COC7.status.indefInsane) } - return await this.update({ + await this.update({ 'data.attribs.san.value': value, 'data.attribs.san.dailyLoss': totalLoss }) - } else return await this.update({ 'data.attribs.san.value': value }) + } else await this.update({ 'data.attribs.san.value': value }) + return value } async setAttribAuto (value, attrib) { @@ -2141,11 +2017,7 @@ export class CoCActor extends Actor { this.setAttribAuto(!this.data.data.attribs[attrib].auto, attrib) } - get build () { - if (['vehicle'].includes(this.data.type)) { - const build = parseInt(this.data.data.attribs.build.value) - return isNaN(build) ? null : build - } + get rawBuild () { if (!this.data.data.attribs) return null if (!this.data.data.attribs.build) return null if (this.data.data.attribs.build.value === 'auto') { @@ -2165,8 +2037,11 @@ export class CoCActor extends Actor { return this.data.data.attribs.build.value } - get db () { - if (['vehicle'].includes(this.data.type)) return 0 + get build () { + return this.data.data.attribs.build.value + } + + get rawDb () { if (!this.data.data.attribs) return null if (!this.data.data.attribs.db) return null if (this.data.data.attribs.db.value === 'auto') { @@ -2185,10 +2060,11 @@ export class CoCActor extends Actor { return this.data.data.attribs.db.value } - get mov () { - if (['vehicle'].includes(this.data.type)) { - return this.data.data.attribs.mov.value - } + get db () { + return this.data.data.attribs.db.value + } + + get rawMov () { if (!this.data.data.attribs) return null if (!this.data.data.attribs.mov) return null if (this.data.data.attribs.mov.value === 'auto') { @@ -2197,12 +2073,12 @@ export class CoCActor extends Actor { if (this.data.data.attribs.mov.auto) { let MOV if ( - this.data.data.characteristics.dex.value < + this.data.data.characteristics.dex.value > this.data.data.characteristics.siz.value && - this.data.data.characteristics.str.value < + this.data.data.characteristics.str.value > this.data.data.characteristics.siz.value ) { - MOV = 7 + MOV = 9 // Bug correction by AdmiralNyar. } else if ( this.data.data.characteristics.dex.value >= this.data.data.characteristics.siz.value || @@ -2210,13 +2086,8 @@ export class CoCActor extends Actor { this.data.data.characteristics.siz.value ) { MOV = 8 - } else if ( - this.data.data.characteristics.dex.value > - this.data.data.characteristics.siz.value && - this.data.data.characteristics.str.value > - this.data.data.characteristics.siz.value - ) { - MOV = 9 // Bug correction by AdmiralNyar. + } else { + MOV = 7 } if (this.data.data.type !== 'creature') { if (!isNaN(parseInt(this.data.data.infos.age))) { @@ -2231,6 +2102,10 @@ export class CoCActor extends Actor { return this.data.data.attribs.mov.value } + get mov () { + return this.data.data.attribs.mov.value + } + get tokenId () { // TODO clarifier ca et tokenkey return this.token ? `${this.token.scene._id}.${this.token.id}` : null // REFACTORING (2) @@ -2367,7 +2242,7 @@ export class CoCActor extends Actor { if (skillData.pack) { const pack = game.packs.get(skillData.pack) if (pack.metadata.entity !== 'Item') return - item = await pack.getEntity(skillData.id) + item = await pack.getDocument(skillData.id) } else if (skillData.id) { item = game.items.get(skillData.id) } @@ -2404,10 +2279,7 @@ export class CoCActor extends Actor { }) if (create === true) { - /** MODIF 0.8.x **/ - // await this.createOwnedItem( duplicate(item.data)); - await this.createEmbeddedDocuments('Item', [duplicate(item.data)]) - /*****************/ + await this.createEmbeddedDocuments('Item', [duplicate(item)]) } else return skill = this.getSkillsByName(item.name) @@ -2467,7 +2339,7 @@ export class CoCActor extends Actor { const pack = weaponData.pack ? game.packs.get(weaponData.pack) : null if (pack) { if (pack.metadata.entity !== 'Item') return - item = await pack.getEntity(weaponData.id) + item = await pack.getDocument(weaponData.id) } else if (weaponData.id) { item = game.items.get(weaponData.id) } @@ -2489,52 +2361,30 @@ export class CoCActor extends Actor { create = true } }) + const actor = + typeof this.parent?.actor !== 'undefined' ? this.parent.actor : this if (create === true) { - const mainSkill = item.data?.data?.skill?.main?.name - if (mainSkill) { - let skill = this.getSkillsByName(mainSkill)[0] - if (!skill) { - const name = mainSkill.match(/\(([^)]+)\)/) - ? mainSkill.match(/\(([^)]+)\)/)[1] - : mainSkill - skill = await this.createWeaponSkill( - name, - !!item.data.data.properties?.rngd - ) - } - if (skill) item.data.data.skill.main.id = skill._id - } // TODO : Else : selectionner le skill dans la liste ou en créer un nouveau. - - const secondSkill = item.data?.data?.skill?.alternativ?.name - if (secondSkill) { - let skill = this.getSkillsByName(secondSkill)[0] - if (!skill) { - const name = mainSkill.match(/\(([^)]+)\)/) - ? mainSkill.match(/\(([^)]+)\)/)[1] - : mainSkill - skill = await this.createWeaponSkill( - name, - !!item.data.data.properties?.rngd - ) - } - if (skill) item.data.data.skill.alternativ.id = skill._id - } // TODO : Else : selectionner le skill dans la liste ou en créer un nouveau. - - await this.createEmbeddedDocuments('Item', [duplicate(item.data)]) // MODIF: 0.8.x 'OwnedItmem' => 'Item + await actor.createEmbeddedDocuments('Item', [item.toJSON()]) } else return - weapons = this.getItemsFromName(item.name) - if (!weapons) return + weapons = actor.getItemsFromName(item.name) + if (!weapons.length) return await weapons[0].reload() } else { ui.notifications.warn( - `Actor ${this.name} has no weapon named ${weaponData.name}` + game.i18n.format('CoC7.ErrorActorHasNoWeaponNamed', { + actorName: this.name, + weaponName: weaponData.name + }) ) return } } else if (weapons.length > 1) { ui.notifications.warn( - `Actor ${this.name} has more than one weapon named ${weaponData.name}. The first found will be used` + game.i18n.format('CoC7.ErrorActorHasTooManyWeaponsNamed', { + actorName: this.name, + weaponName: weaponData.name + }) ) } weapon = weapons[0] @@ -2614,6 +2464,7 @@ export class CoCActor extends Actor { /** Try to find a characteristic, attribute or skill that matches the name */ find (name) { + if (!name) return undefined // Try ID const item = this.items.get(name) if (item) { @@ -2633,9 +2484,9 @@ export class CoCActor extends Actor { !!s.name && (s.name.toLocaleLowerCase().replace(/\s/g, '') === name.toLocaleLowerCase().replace(/\s/g, '') || - s.sName.toLocaleLowerCase().replace(/\s/g, '') === + s.name.toLocaleLowerCase().replace(/\s/g, '') === name.toLocaleLowerCase().replace(/\s/g, '') || - s.sName.toLocaleLowerCase().replace(/\s/g, '') === + s.name.toLocaleLowerCase().replace(/\s/g, '') === shortName?.toLocaleLowerCase().replace(/\s/g, '')) ) }) @@ -2646,13 +2497,23 @@ export class CoCActor extends Actor { for (let i = 0; i < charKey.length; i++) { const char = this.getCharacteristic(charKey[i]) if (char) { - if (char.key?.toLocaleLowerCase() === name.toLowerCase()) { + char.name = char.label + if ( + char.key?.toLocaleLowerCase() === name.toLowerCase() || + char.key?.toLocaleLowerCase() === shortName?.toLowerCase() + ) { return { type: 'characteristic', value: char } } - if (char.shortName?.toLocaleLowerCase() === name.toLowerCase()) { + if ( + char.shortName?.toLocaleLowerCase() === name.toLowerCase() || + char.shortName?.toLocaleLowerCase() === shortName?.toLowerCase() + ) { return { type: 'characteristic', value: char } } - if (char.label?.toLocaleLowerCase() === name.toLowerCase()) { + if ( + char.label?.toLocaleLowerCase() === name.toLowerCase() || + char.label?.toLocaleLowerCase() === shortName?.toLowerCase() + ) { return { type: 'characteristic', value: char } } } @@ -2663,13 +2524,23 @@ export class CoCActor extends Actor { for (let i = 0; i < attribKey.length; i++) { const attr = this.getAttribute(attribKey[i]) if (attr) { - if (attr.key?.toLocaleLowerCase() === name.toLowerCase()) { + attr.name = attr.label + if ( + attr.key?.toLocaleLowerCase() === name.toLowerCase() || + attr.key?.toLocaleLowerCase() === shortName?.toLowerCase() + ) { return { type: 'attribute', value: attr } } - if (attr.shortName?.toLocaleLowerCase() === name.toLowerCase()) { + if ( + attr.shortName?.toLocaleLowerCase() === name.toLowerCase() || + attr.shortName?.toLocaleLowerCase() === shortName?.toLowerCase() + ) { return { type: 'attribute', value: attr } } - if (attr.label?.toLocaleLowerCase() === name.toLowerCase()) { + if ( + attr.label?.toLocaleLowerCase() === name.toLowerCase() || + attr.label?.toLocaleLowerCase() === shortName?.toLowerCase() + ) { return { type: 'attribute', value: attr } } } @@ -2682,8 +2553,7 @@ export class CoCActor extends Actor { get pilotSkills () { return this.skills.filter(s => { return ( - !!s.data.data.specialization && - s.data.data.specialization.length && + s.data.data.properties?.special && s.data.data.specialization?.toLocaleLowerCase() === game.i18n .localize('CoC7.PilotSpecializationName') @@ -2695,8 +2565,7 @@ export class CoCActor extends Actor { get driveSkills () { return this.skills.filter(s => { return ( - !!s.data.data.specialization && - s.data.data.specialization.length && + s.data.data.properties?.special && s.data.data.specialization?.toLocaleLowerCase() === game.i18n .localize('CoC7.DriveSpecializationName') @@ -2705,6 +2574,13 @@ export class CoCActor extends Actor { }) } + get tokenUuid () { + if (this.sheet.token) { + return this.sheet.token.uuid + } + return null + } + get tokenKey () { // Clarifier ca et tokenid /** * MODIF 0.8.x */ @@ -2843,10 +2719,12 @@ export class CoCActor extends Actor { const alwaysSuccessThreshold = 95 const title = game.i18n.localize('CoC7.RollAll4Dev') + let skillsRolled = 0 let message = ''
for (const item of this.items) {
if (item.type === 'skill') {
if (item.developementFlag) {
+ skillsRolled++
const die = await new Die({ faces: 100 }).evaluate({ async: true })
const skillValue = item.value
let augment = null
@@ -2872,7 +2750,7 @@ export class CoCActor extends Actor {
'CoC7.SanGained',
{
results: `${augmentSANDie.values[0]} + ${augmentSANDie.values[1]}`,
- sanGained: sanGained,
+ sanGained,
skill: item.data.name,
skillValue: skillValue + augmentDie.total
}
@@ -2909,69 +2787,83 @@ export class CoCActor extends Actor {
}
}
}
+ const sanityLossEvents = []
+ let changed = false
+ for (const sanityLossEvent of this.data.data.sanityLossEvents) {
+ if (sanityLossEvent.immunity) {
+ sanityLossEvents.push(sanityLossEvent)
+ } else if (sanityLossEvent.totalLoss > 1) {
+ sanityLossEvent.totalLoss--
+ sanityLossEvents.push(sanityLossEvent)
+ changed = true
+ } else {
+ changed = true
+ }
+ }
+ if (changed) {
+ if (skillsRolled) {
+ message += '
'
+ }
+ message += `${game.i18n.format('CoC7.ReduceSanityLimits')}`
+ await this.update({
+ 'data.sanityLossEvents': sanityLossEvents
+ })
+ }
if (!fastForward) {
message += '
' - await upgradeRoll.roll({ async: true }) - if (!fastForward) await CoC7Dice.showRollDice3d(upgradeRoll) - if (upgradeRoll.total > luck.value) { - const augmentRoll = new Roll('1D10') - await augmentRoll.roll({ async: true }) - if (!fastForward) await CoC7Dice.showRollDice3d(augmentRoll) - if (luck.value + augmentRoll.total <= 99) { - await this.update({ - 'data.attribs.lck.value': - this.data.data.attribs.lck.value + augmentRoll.total - }) - message += `${game.i18n.format( - 'CoC7.LuckIncreased', - { - die: upgradeRoll.total, - score: luck.value, - augment: augmentRoll.total - } - )}` - } else { - let correctedValue - for (let i = 1; i <= 10; i++) { - if (luck.value + augmentRoll.total - i <= 99) { - correctedValue = augmentRoll.total - i - break - } + if (pulpRuleDevelopmentRollLuck || higherThanCurrentLuck) { + const augmentValue = (await new Roll(augmentRoll).roll({ async: true })) + .total + await this.update({ + 'data.attribs.lck.value': + this.data.data.attribs.lck.value + augmentValue + }) + message += `${game.i18n.format( + 'CoC7.LuckIncreased', + { + die: upgradeRoll, + score: currentLuck, + augment: augmentValue } - await this.update({ - 'data.attribs.lck.value': - this.data.data.attribs.lck.value + correctedValue - }) - message += `${game.i18n.format( - 'CoC7.LuckIncreased', - { - die: upgradeRoll.total, - score: luck.value, - augment: correctedValue - } - )}` - } + )}` } else { message += `${game.i18n.format( 'CoC7.LuckNotIncreased', - { die: upgradeRoll.total, score: luck.value } + { die: upgradeRoll, score: currentLuck } )}` } if (!fastForward) { message += '
' - const speaker = { actor: this.actor } - await chatHelper.createMessage(title, message, { speaker: speaker }) + const speaker = { actor: this } + await chatHelper.createMessage(title, message, { speaker }) } } @@ -3008,174 +2900,241 @@ export class CoCActor extends Actor { }) } const speaker = { actor: this._id } - await chatHelper.createMessage(title, message, { speaker: speaker }) + await chatHelper.createMessage(title, message, { speaker }) await skill.unflagForDevelopement() } - async toggleStatus (statusName) { - let statusValue = this.data.data.status[statusName]?.value - if (!(typeof statusValue === 'boolean')) { - statusValue = statusValue === 'false' // Necessary, incorrect template initialization + hasConditionStatus (conditionName) { + const conditionValue = this.data.data.conditions?.[conditionName]?.value + if (typeof conditionValue !== 'boolean') { + return false // Necessary, incorrect template initialization } - if (COC7.status.criticalWounds === statusName) { - if (statusValue) await this.cureMajorWound() - else await this.inflictMajorWound() - return + return conditionValue + } + + hasConditionValue (conditionName, field) { + if (!this.hasConditionStatus(conditionName)) { + return undefined + } + if (conditionName === COC7.status.tempoInsane && field === 'durationText') { + const realTime = this.hasConditionValue(conditionName, 'realTime') + const duration = this.hasConditionValue(conditionName, 'duration') + if (typeof duration !== 'undefined') { + if (realTime === true) { + return duration + ' ' + game.i18n.localize('CoC7.rounds') + } else if (realTime === false) { + return duration + ' ' + game.i18n.localize('CoC7.hours') + } + } + return '' + } + return this.data.data.conditions?.[conditionName]?.[field] + } + + async toggleCondition (conditionName) { + const conditionValue = this.hasConditionStatus(conditionName) + if (!conditionValue) { + await this.setCondition(conditionName) + } else { + await this.unsetCondition(conditionName) } - // await this.update({ [`data.status.${statusName}.value`]: !statusValue }) - let effectEffect - switch (statusName) { - case 'dead': - if (statusValue) { - await this.unsetStatus('dead') - effectEffect = await this.hasActiveEffect('dead') - if (effectEffect.length > 0) { - effectEffect.forEach(effect => effect.delete()) + } + + async setCondition ( + conditionName, + { + forceValue = false, + justThis = false, + realTime = null, + duration = null + } = {} + ) { + if (!forceValue && game.settings.get('CoC7', 'enableStatusIcons')) { + const effects = this.effects + .filter(effect => effect.data.flags.core?.statusId === conditionName) + .map(effect => effect.id) + const custom = {} + switch (conditionName) { + case COC7.status.dead: + custom.flags = { + core: { + overlay: true + } } - } else this.fallDead() - break - case 'dying': - if (statusValue) { - await this.unsetStatus('dying') - effectEffect = await this.hasActiveEffect('dying') - if (effectEffect.length > 0) { - effectEffect.forEach(effect => effect.delete()) + break + case COC7.status.tempoInsane: + custom.flags = { + CoC7: { + realTime: undefined + } } - } else this.fallDying() - break - case 'prone': - if (statusValue) { - await this.unsetStatus('prone') - effectEffect = await this.hasActiveEffect('prone') - if (effectEffect.length > 0) { - effectEffect.forEach(effect => effect.delete()) + custom.duration = { + rounds: undefined, + seconds: undefined } - } else this.fallProne() - break - case 'unconscious': - if (statusValue) { - await this.unsetStatus('unconscious') - effectEffect = await this.hasActiveEffect('unconscious') - if (effectEffect.length > 0) { - effectEffect.forEach(effect => effect.delete()) + if (realTime === true || realTime === false) { + custom.flags.CoC7.realTime = realTime + custom.flags = { + CoC7: { + realTime + } + } + if (duration !== null && typeof duration !== 'undefined') { + if (realTime) { + custom.duration.rounds = duration + } else { + custom.duration.seconds = duration * 3600 + } + } } - } else this.fallUnconscious() - break - } - } - - async hasActiveEffect (effectLabel) { - const effectList = this.effects - .map(effect => { - return effect - }) - .filter(effect => effect.data.label === effectLabel) - return effectList - } - - async toggleEffect (effectName) { - switch (effectName) { - case 'boutOfMadness': - if (this.boutOfMadness) { - await this.boutOfMadness.delete() - // if( boutOfMadness){ - // await boutOfMadness.update({ disabled: !boutOfMadness.data.disabled, duration: {seconds: undefined, rounds: undefined, turns: 1}}); - // } - } else { - await super.createEmbeddedDocuments('ActiveEffect', [ + break + } + if (effects.length === 0) { + const effect = CONFIG.statusEffects.filter( + effect => effect.id === conditionName + ) + if (effect.length === 1) { + const effectData = mergeObject( { - label: game.i18n.localize('CoC7.BoutOfMadnessName'), - icon: game.settings.get('CoC7', 'enableStatusIcons') - ? 'systems/CoC7/assets/icons/hanging-spider.svg' - : null, - origin: this.uuid, - duration: { - seconds: undefined, - rounds: undefined, - turns: 1 - }, + label: game.i18n.localize(effect[0].label), + icon: effect[0].icon, flags: { - CoC7: { - madness: true, - realTime: true + core: { + statusId: effect[0].id } }, disabled: false - } - ]) - } - - break - case 'insanity': - if (this.insanity) { - this.insanity.delete() - // if( insanity){ - // await insanity.update({ disabled: !insanity.data.disabled, duration: {seconds: undefined, rounds: undefined, turns: 1}}); - // } + }, + custom + ) + await super.createEmbeddedDocuments('ActiveEffect', [effectData]) } else { - await super.createEmbeddedDocuments('ActiveEffect', [ - { - label: game.i18n.localize('CoC7.InsanityName'), - icon: game.settings.get('CoC7', 'enableStatusIcons') - ? 'systems/CoC7/assets/icons/tentacles-skull.svg' - : null, - origin: this.uuid, - duration: { - seconds: undefined, - rounds: undefined, - turns: 1 - }, - flags: { - CoC7: { - madness: true, - indefinite: true - } - }, - // tint: '#ff0000', - disabled: false + // This doesn't exist in FoundryVTT ActiveEffects? + forceValue = true + } + } else { + custom._id = effects[0] + await super.updateEmbeddedDocuments('ActiveEffect', [custom]) + forceValue = true + } + } + if (forceValue || !game.settings.get('CoC7', 'enableStatusIcons')) { + switch (conditionName) { + case COC7.status.indefInsane: + case COC7.status.unconscious: + case COC7.status.criticalWounds: + case COC7.status.dying: + case COC7.status.prone: + case COC7.status.dead: + await this.update({ + [`data.conditions.${conditionName}.value`]: true + }) + break + case COC7.status.tempoInsane: + { + const fields = {} + fields[`data.conditions.${conditionName}.value`] = true + if (realTime === true || realTime === false) { + fields[`data.conditions.${conditionName}.realTime`] = realTime + if (duration !== null && typeof duration !== 'undefined') { + fields[`data.conditions.${conditionName}.duration`] = duration + } + } + if ( + !Object.prototype.hasOwnProperty.call( + fields, + `data.conditions.${conditionName}.realTime` + ) + ) { + fields[`data.conditions.${conditionName}.-=realTime`] = null + } + if ( + !Object.prototype.hasOwnProperty.call( + fields, + `data.conditions.${conditionName}.duration` + ) + ) { + fields[`data.conditions.${conditionName}.-=duration`] = null + } + await this.update(fields) + } + break + } + if (!justThis) { + // Does setting the condition also trigger other actions? + // - If ActiveEffects are added hasConditionStatus for recently added conditions may return incorrectly + switch (conditionName) { + case COC7.status.criticalWounds: + await this.setCondition(COC7.status.prone) + if ( + !this.hasConditionStatus(COC7.status.unconscious) && + !this.hasConditionStatus(COC7.status.dead) + ) { + const conCheck = new CoC7ConCheck( + this.isToken ? this.tokenKey : this.id + ) + conCheck.toMessage() } - ]) + break + case COC7.status.dead: + await this.unsetCondition(COC7.status.criticalWounds) + await this.unsetCondition(COC7.status.dying) + await this.unsetCondition(COC7.status.unconscious) + break } - break - - default: - break + } } } - getStatus (statusName) { - if (!this.data.data.status) return false - let statusValue = this.data.data.status[statusName]?.value - if (undefined === statusValue) return false - if (!(typeof statusValue === 'boolean')) { - statusValue = statusValue === 'false' // Necessary, incorrect template initialization + async unsetCondition (conditionName, { forceValue = false } = {}) { + if (!forceValue && game.settings.get('CoC7', 'enableStatusIcons')) { + const effects = this.effects + .filter(effect => effect.data.flags.core?.statusId === conditionName) + .map(effect => effect.id) + if (effects.length > 0) { + await super.deleteEmbeddedDocuments('ActiveEffect', effects) + } else { + forceValue = true + } + } + if (forceValue || !game.settings.get('CoC7', 'enableStatusIcons')) { + switch (conditionName) { + case COC7.status.tempoInsane: + case COC7.status.indefInsane: + case COC7.status.unconscious: + case COC7.status.criticalWounds: + case COC7.status.dying: + case COC7.status.prone: + case COC7.status.dead: + await this.update({ + [`data.conditions.${conditionName}.value`]: false + }) + break + } } - return statusValue - } - - async setStatus (statusName) { - await this.update({ [`data.status.${statusName}.value`]: true }) - } - - async unsetStatus (statusName) { - await this.update({ [`data.status.${statusName}.value`]: false }) } + // TODO : check if ever used async resetCounter (counter) { await this.update({ [counter]: 0 }) } - async setOneFifthSanity (oneFifthSanity) { - await this.update({ 'data.attribs.san.oneFifthSanity': oneFifthSanity }) + async resetDailySanity () { + await this.update({ + 'data.attribs.san.dailyLimit': Math.floor( + this.data.data.attribs.san.value / 5 + ), + 'data.attribs.san.dailyLoss': 0 + }) } get fightingSkills () { const skillList = [] - this.items.forEach(value => { + for (const value of this.items) { if (value.type === 'skill' && value.data.data.properties.fighting) { skillList.push(value) } - }) + } skillList.sort((a, b) => { return a.name.localeCompare(b.name) @@ -3186,13 +3145,13 @@ export class CoCActor extends Actor { get closeCombatWeapons () { const weaponList = [] - this.items.forEach(value => { + for (const value of this.items) { if (value.type === 'weapon' && !value.data.data.properties.rngd) { const skill = this.items.get(value.data.data.skill.main.id) value.data.data.skill.main.value = skill ? skill.value : 0 weaponList.push(value) } - }) + } weaponList.sort((a, b) => { return a.name.localeCompare(b.name) @@ -3203,11 +3162,11 @@ export class CoCActor extends Actor { get firearmSkills () { const skillList = [] - this.items.forEach(value => { + for (const value of this.items) { if (value.type === 'skill' && value.data.data.properties.firearm) { skillList.push(value) } - }) + } skillList.sort((a, b) => { return a.name.localeCompare(b.name) @@ -3260,6 +3219,14 @@ export class CoCActor extends Actor { return 0 } + get mythosHardened () { + return this.getFlag('CoC7', 'mythosHardened') || false + } + + async setMythosHardened () { + await this.setFlag('CoC7', 'mythosHardened', true) + } + get mythosInsanityExperienced () { return this.getFlag('CoC7', 'mythosInsanityExperienced') || false } @@ -3310,9 +3277,9 @@ export class CoCActor extends Actor { get skills () { const skillList = [] - this.items.forEach(value => { + for (const value of this.items) { if (value.type === 'skill') skillList.push(value) - }) + } skillList.sort((a, b) => { return a.name.localeCompare(b.name) @@ -3337,211 +3304,100 @@ export class CoCActor extends Actor { ) } - async setHealthStatusManually (event) { - event.preventDefault() - if (event.originalEvent) { - const healthBefore = parseInt( - event.originalEvent.currentTarget.defaultValue - ) - const healthAfter = parseInt(event.originalEvent.currentTarget.value) - let damageTaken - // is healing - if (healthAfter > healthBefore) return await this.setHp(healthAfter) - else if (healthAfter < 0) damageTaken = Math.abs(healthAfter) - else damageTaken = healthBefore - healthAfter - this.render(true) // needed, or negative values will not work - return await this.dealDamage(damageTaken, { ignoreArmor: true }) + async setHp (value) { + if (value < 0) value = 0 + if (value > this.data.data.attribs.san.max) { value = this.data.data.attribs.san.max } + const healthBefore = this.hp + let damageTaken + // is healing + if (value >= healthBefore) await this._setHp(value) + else { + damageTaken = healthBefore - value + await this.dealDamage(damageTaken, { ignoreArmor: true }) } + return value } async dealDamage (amount, options = {}) { - let total = parseInt(amount) - // let initialHp = this.hp; - if (this.data.data.attribs.armor.value && !options.ignoreArmor) { - let armorValue - if (CoC7Utilities.isFormula(this.data.data.attribs.armor.value)) { - const armorRoll = await new Roll( - this.data.data.attribs.armor.value - ).roll({ async: true }) - armorValue = armorRoll.total - } else if (!isNaN(Number(this.data.data.attribs.armor.value))) { - armorValue = Number(this.data.data.attribs.armor.value) + // TODO: Change options to list of values + const armorData = options.armor + ? options.armor + : this.data.data.attribs.armor // if there armor value passed we use it + const grossDamage = parseInt(amount) + let armorValue = 0 + if (!options.ignoreArmor) { + if (armorData === null) { + // nop + } else if (CoC7Utilities.isFormula(armorData)) { + armorValue = (await new Roll(armorData).roll({ async: true })).total + } else if (!isNaN(Number(armorData))) { + armorValue = Number(armorData) + } else if (!isNaN(Number(armorData?.value))) { + armorValue = Number(armorData.value) } else { ui.notifications.warn( - `Unable to process armor value :${this.data.data.attribs.armor.value}. Ignoring armor` + game.i18n.format('CoC7.ErrorUnableToParseArmorFormula', { + value: armorData + }) ) - armorValue = 0 } - total = total - armorValue } - if (total <= 0) return 0 - await this.setHp(this.hp - total) - if (total >= this.hpMax) { - await this.fallDead() - // return this.hpMax; + const netDamage = grossDamage - armorValue + if (netDamage <= 0) return 0 + await this._setHp(this.hp - netDamage) + if (netDamage >= this.data.data.attribs.hp.max) { + await this.setCondition(COC7.status.dead) } else { - if (total >= Math.floor(this.hpMax / 2)) await this.inflictMajorWound() - if (this.hp === 0) { - if (!this.getStatus(COC7.status.unconscious)) { - await this.fallUnconscious() - } - if (this.majorWound) this.fallDying() - } - } - // if( total>initialHp) return initialHp; - return total - } - - async inflictMajorWound () { - if (!this.majorWound) { - await this.setStatus(COC7.status.criticalWounds) - const criticalWoundsEffect = await this.hasActiveEffect('criticalWounds') - if (criticalWoundsEffect.length === 0) { - await super.createEmbeddedDocuments('ActiveEffect', [ - { - label: 'criticalWounds', - icon: game.settings.get('CoC7', 'enableStatusIcons') - ? 'systems/CoC7/assets/icons/arm-sling.svg' - : null, - origin: this.uuid, - duration: { - seconds: undefined, - rounds: undefined, - turns: 1 - }, - disabled: false + if (game.settings.get('CoC7', 'pulpRuleIgnoreMajorWounds')) { + if (this.hp === 0) { + if (netDamage >= Math.ceil(this.data.data.attribs.hp.max / 2)) { + this.setCondition(COC7.status.dying) + } else { + this.setCondition(COC7.status.unconscious) } - ]) - } - } - await this.fallProne() - if (!this.getStatus(COC7.status.unconscious)) { - const conCheck = new CoC7ConCheck(this.isToken ? this.tokenKey : this.id) - conCheck.toMessage() - } - } - - async cureMajorWound () { - await this.unsetStatus(COC7.status.criticalWounds) - const criticalWoundsEffect = await this.hasActiveEffect('criticalWounds') - if (criticalWoundsEffect.length > 0) { - criticalWoundsEffect.forEach(effect => effect.delete()) - } - } - - async fallProne () { - await this.setStatus(COC7.status.prone) - const proneEffect = await this.hasActiveEffect('prone') - if (proneEffect.length === 0) { - await super.createEmbeddedDocuments('ActiveEffect', [ - { - label: 'prone', - icon: game.settings.get('CoC7', 'enableStatusIcons') - ? 'systems/CoC7/assets/icons/falling.svg' - : null, - origin: this.uuid, - duration: { - seconds: undefined, - rounds: undefined, - turns: 1 - }, - disabled: false - } - ]) - } - } - - async fallUnconscious () { - await this.setStatus(COC7.status.unconscious) - const unconsciousEffect = await this.hasActiveEffect('unconscious') - if (unconsciousEffect.length === 0) { - await super.createEmbeddedDocuments('ActiveEffect', [ - { - label: 'unconscious', - icon: game.settings.get('CoC7', 'enableStatusIcons') - ? 'systems/CoC7/assets/icons/knocked-out-stars.svg' - : null, - origin: this.uuid, - duration: { - seconds: undefined, - rounds: undefined, - turns: 1 - }, - disabled: false + } else if (netDamage >= Math.ceil(this.data.data.attribs.hp.max / 2)) { + const conCheck = new CoC7ConCheck( + this.isToken ? this.tokenKey : this.id + ) + conCheck.toMessage() } - ]) - } - } - - async fallDying () { - await this.setStatus(COC7.status.dying) - const dyingEffect = await this.hasActiveEffect('dying') - if (dyingEffect.length === 0) { - await super.createEmbeddedDocuments('ActiveEffect', [ - { - label: 'dying', - icon: game.settings.get('CoC7', 'enableStatusIcons') - ? 'systems/CoC7/assets/icons/heart-beats.svg' - : null, - origin: this.uuid, - duration: { - seconds: undefined, - rounds: undefined, - turns: 1 - }, - disabled: false + } else { + let hasMajorWound = false + if (netDamage >= Math.ceil(this.data.data.attribs.hp.max / 2)) { + await this.setCondition(COC7.status.criticalWounds) + hasMajorWound = true + } else { + hasMajorWound = this.hasConditionStatus(COC7.status.criticalWounds) } - ]) - } - } - - async fallDead () { - await this.inflictMajorWound() - await this.unsetStatus(COC7.status.dying) - await this.fallUnconscious() - await this.setStatus(COC7.status.dead) - const deadEffect = await this.hasActiveEffect('dead') - if (deadEffect.length === 0) { - await super.createEmbeddedDocuments('ActiveEffect', [ - { - label: 'dead', - icon: game.settings.get('CoC7', 'enableStatusIcons') - ? 'systems/CoC7/assets/icons/tombstone.svg' - : null, - origin: this.uuid, - duration: { - seconds: undefined, - rounds: undefined, - turns: 1 - }, - disabled: false + if (this.hp === 0) { + await this.setCondition(COC7.status.unconscious) + if (hasMajorWound) { + this.setCondition(COC7.status.dying) + } } - ]) - } - const dyingEffect = await this.hasActiveEffect('dying') - if (!this.dying && dyingEffect.length > 0) { - dyingEffect.forEach(effect => effect.delete()) + } } + return netDamage } get majorWound () { - return this.getStatus(COC7.status.criticalWounds) + return this.hasConditionStatus(COC7.status.criticalWounds) } get dying () { - return this.getStatus(COC7.status.dying) + return this.hasConditionStatus(COC7.status.dying) } get unconscious () { - return this.getStatus(COC7.status.unconscious) + return this.hasConditionStatus(COC7.status.unconscious) } get dead () { - return this.getStatus(COC7.status.dead) + return this.hasConditionStatus(COC7.status.dead) } get prone () { - return this.getStatus(COC7.status.prone) + return this.hasConditionStatus(COC7.status.prone) } // static updateActor( actor, dataUpdate){ diff --git a/module/actors/sheets/actor-sheet.js b/module/actors/sheets/actor-sheet.js deleted file mode 100644 index 489a53f6..00000000 --- a/module/actors/sheets/actor-sheet.js +++ /dev/null @@ -1,152 +0,0 @@ -/* global game, mergeObject */ - -import { CoC7ActorSheet } from './base.js' - -/** - * Extend the basic ActorSheet with some very simple modifications - */ -export class CoC7CharacterSheet extends CoC7ActorSheet { - /** - * Prepare data for rendering the Actor sheet - * The prepared data object contains both the actor data as well as additional sheet options - */ - async getData () { - const data = await super.getData() - - if (this.actor.occupation) { - data.data.infos.occupation = this.actor.occupation.name - data.data.infos.occupationSet = true - } else data.data.infos.occupationSet = false - - if (this.actor.archetype) { - data.data.infos.archetype = this.actor.archetype.name - data.data.infos.archetypeSet = true - } else data.data.infos.archetypeSet = false - - data.totalExperience = this.actor.experiencePoints - data.totalOccupation = this.actor.occupationPointsSpent - data.invalidOccupationPoints = - Number(this.actor.occupationPointsSpent) !== - Number(this.actor.data.data.development?.occupation) - data.totalArchetype = this.actor.archetypePointsSpent - data.invalidArchetypePoints = - Number(this.actor.archetypePointsSpent) !== - Number(this.actor.data.data.development?.archetype) - data.totalPersonal = this.actor.personalPointsSpent - data.invalidPersonalPoints = - Number(this.actor.personalPointsSpent) !== - Number(this.actor.data.data.development?.personal) - data.creditRatingMax = Number( - this.actor.occupation?.data.data.creditRating.max - ) - data.creditRatingMin = Number( - this.actor.occupation?.data.data.creditRating.min - ) - data.invalidCreditRating = - this.actor.creditRatingSkill?.data.data.adjustments?.occupation > - data.creditRatingMax || - this.actor.creditRatingSkill?.data.data.adjustments?.occupation < - data.creditRatingMin - data.pulpTalentCount = data.itemsByType.talent?.length - ? data.itemsByType.talent?.length - : 0 - data.minPulpTalents = this.actor.archetype?.data.data.talents - ? this.actor.archetype?.data.data.talents - : 0 - data.invalidPulpTalents = data.pulpTalentCount < data.minPulpTalents - - data.hasSkillFlaggedForExp = this.actor.hasSkillFlaggedForExp - - data.allowDevelopment = game.settings.get('CoC7', 'developmentEnabled') - data.allowCharCreation = game.settings.get('CoC7', 'charCreationEnabled') - data.developmentRollForLuck = game.settings.get( - 'CoC7', - 'developmentRollForLuck' - ) - data.showDevPannel = data.allowDevelopment || data.allowCharCreation - - data.manualCredit = this.actor.getActorFlag('manualCredit') - if (!data.manualCredit) { - data.credit = {} - let factor - let moneySymbol - if (!data.data.credit) { - factor = 1 - moneySymbol = '$' - } else { - factor = parseInt(data.data.credit.multiplier) - ? parseInt(data.data.credit.multiplier) - : 1 - moneySymbol = data.data.credit.monetarySymbol - ? data.data.credit.monetarySymbol - : '$' - } - - data.credit.spendingLevel = `${this.actor.spendingLevel * - factor}${moneySymbol}` - data.credit.assets = `${this.actor.assets * factor}${moneySymbol}` - data.credit.cash = `${this.actor.cash * factor}${moneySymbol}` - } - - data.oneBlockBackStory = game.settings.get('CoC7', 'oneBlockBackstory') - - return data - } - - /* -------------------------------------------- */ - - activateListeners (html) { - super.activateListeners(html) - - if (this.actor.isOwner) { - // MODIF: 0.8.x owner deprecated => isOwner - html - .find('.skill-name.rollable.flagged4dev') - .click(async event => this._onSkillDev(event)) - html - .find('.reset-occupation') - .click(async () => await this.actor.resetOccupation()) - html - .find('.reset-archetype') - .click(async () => await this.actor.resetArchetype()) - html.find('.open-item').click(event => this._onItemDetails(event)) - html - .find('[name="data.attribs.hp.value"]') - .change(event => this.actor.setHealthStatusManually(event)) - } - } - - async _onSkillDev (event) { - event.preventDefault() - const skillId = event.currentTarget.closest('.item').dataset.itemId - await this.actor.developSkill(skillId, event.shiftKey) - } - - _onItemDetails (event) { - event.preventDefault() - const type = event.currentTarget.dataset.type - const item = this.actor[type] - if (item) item.sheet.render(true) - } - - /** - * Extend and override the default options used by the 5e Actor Sheet - * @returns {Object} - */ - static get defaultOptions () { - return mergeObject(super.defaultOptions, { - classes: ['coc7', 'sheet', 'actor', 'character'], - template: 'systems/CoC7/templates/actors/character-sheet.html', - width: 600, - height: 650, - dragDrop: [{ dragSelector: '.item', dropSelector: null }], - tabs: [ - { - navSelector: '.sheet-tabs', - contentSelector: '.sheet-body', - initial: 'skills' - } - ] - }) - } -} diff --git a/module/actors/sheets/base.js b/module/actors/sheets/base.js index f1ea94da..284a5947 100644 --- a/module/actors/sheets/base.js +++ b/module/actors/sheets/base.js @@ -1,20 +1,20 @@ -/* global $, ActorSheet, ChatMessage, CONST, Dialog, game, getProperty, mergeObject, Roll, TextEditor, ui */ +/* global $, ActorSheet, ChatMessage, CONST, Dialog, FormData, foundry, game, getProperty, Hooks, Item, mergeObject, Roll, TextEditor, ui */ import { RollDialog } from '../../apps/roll-dialog.js' +import { CoC7ChatMessage } from '../../apps/coc7-chat-message.js' import { CoC7Check } from '../../check.js' import { COC7 } from '../../config.js' +import { CoC7Item } from '../../items/item.js' import { CoC7MeleeInitiator } from '../../chat/combat/melee-initiator.js' import { CoC7RangeInitiator } from '../../chat/rangecombat.js' // import { CoC7DamageRoll } from '../../chat/damagecards.js'; import { CoC7ConCheck } from '../../chat/concheck.js' import { isCtrlKey } from '../../chat/helper.js' import { CoC7Parser } from '../../apps/parser.js' -import { SanDataDialog } from '../../apps/sandata-dialog.js' -import { SanCheckCard } from '../../chat/cards/san-check.js' -import { OpposedCheckCard } from '../../chat/cards/opposed-roll.js' -import { CombinedCheckCard } from '../../chat/cards/combined-roll.js' import { DamageCard } from '../../chat/cards/damage.js' import { CoC7LinkCreationDialog } from '../../apps/link-creation-dialog.js' +import CoC7ActiveEffect from '../../active-effect.js' +import { CoC7Link } from '../../apps/link.js' /** * Extend the basic ActorSheet with some very simple modifications @@ -29,6 +29,11 @@ export class CoC7ActorSheet extends ActorSheet { data.editable = this.isEditable // MODIF 0.8.x : editable removed /******************/ + data.showHiddenDevMenu = game.settings.get('CoC7', 'hiddendevmenu') + + data.hasToken = !!this.token + data.canDragToken = data.hasToken && game.user.isGM + data.linkedActor = this.actor.data?.token?.actorLink data.isToken = this.actor.isToken data.itemsByType = {} data.skills = {} @@ -38,12 +43,17 @@ export class CoC7ActorSheet extends ActorSheet { data.meleeWpn = [] data.actorFlags = {} + data.effects = + this.actor.type === 'character' + ? CoC7ActiveEffect.prepareActiveEffectCategories(this.actor.effects) + : CoC7ActiveEffect.prepareNPCActiveEffectCategories(this.actor.effects) + data.permissionLimited = - (this.actor.data.permission[game.user.id] === - CONST.ENTITY_PERMISSIONS.LIMITED || - this.actor.data.permission.default === - CONST.ENTITY_PERMISSIONS.LIMITED) && - !game.user.isGM + !game.user.isGM && + (this.actor.data.permission[game.user.id] ?? + this.actor.data.permission.default) === + (CONST.DOCUMENT_OWNERSHIP_LEVELS || CONST.ENTITY_PERMISSIONS).LIMITED + data.isGM = game.user.isGM data.alowUnlock = game.settings.get('CoC7', 'playerUnlockSheetMode') === 'always' || @@ -157,18 +167,6 @@ export class CoC7ActorSheet extends ActorSheet { } } - if (!data.data.status) { - data.data.status = { - criticalWounds: { type: 'Boolean', value: false }, - unconscious: { type: 'Boolean', value: false }, - dying: { type: 'Boolean', value: false }, - dead: { type: 'Boolean', value: false }, - prone: { type: 'Boolean', value: false }, - tempoInsane: { type: 'boolean', value: false }, - indefInsane: { type: 'boolean', value: false } - } - } - if (!data.data.biography) { data.data.biography = { personalDescription: { type: 'string', value: '' } @@ -210,13 +208,12 @@ export class CoC7ActorSheet extends ActorSheet { } if (!data.data.biography) data.data.biography = [] - if (!data.data.encounteredCreatures) data.data.encounteredCreatures = [] - data.isInABoutOfMadness = this.actor.isInABoutOfMadness - data.isInsane = this.actor.isInsane - data.boutOfMadness = this.actor.boutOfMadness - data.sanity = this.actor.sanity - data.pulpCharacter = game.settings.get('CoC7', 'pulpRules') + data.pulpRuleArchetype = game.settings.get('CoC7', 'pulpRuleArchetype') + data.pulpRuleOrganization = game.settings.get( + 'CoC7', + 'pulpRuleOrganization' + ) } data.isDead = this.actor.dead @@ -229,36 +226,14 @@ export class CoC7ActorSheet extends ActorSheet { if (item.type === 'skill') { if (item.data.properties.special) { if (item.data.properties.fighting) { - if ( - item.data.specialization !== - game.i18n.localize('CoC7.FightingSpecializationName') - ) { - const itemToUpdate = this.actor.items.get(item._id) - await itemToUpdate.update({ - 'data.specialization': game.i18n.localize( - 'CoC7.FightingSpecializationName' - ) - }) - item.data.specialization = game.i18n.localize( - 'CoC7.FightingSpecializationName' - ) // TODO : Client with different language = recursive call when opening the same sheet. - } + item.data.specialization = game.i18n.localize( + 'CoC7.FightingSpecializationName' + ) } if (item.data.properties.firearm) { - if ( - item.data.specialization !== - game.i18n.localize('CoC7.FirearmSpecializationName') - ) { - const itemToUpdate = this.actor.items.get(item._id) - await itemToUpdate.update({ - 'data.specialization': game.i18n.localize( - 'CoC7.FirearmSpecializationName' - ) - }) - item.data.specialization = game.i18n.localize( - 'CoC7.FirearmSpecializationName' - ) - } + item.data.specialization = game.i18n.localize( + 'CoC7.FirearmSpecializationName' + ) } } @@ -284,7 +259,10 @@ export class CoC7ActorSheet extends ActorSheet { ).total } catch (err) { console.warn( - `unable to parse formula :${item.data.value} for skill ${item.name}` + game.i18n.format('CoC7.ErrorUnableToParseSkillFormula', { + value: item.data.value, + name: item.name + }) ) value = null } @@ -292,31 +270,47 @@ export class CoC7ActorSheet extends ActorSheet { if (value) { item.data.value = value const itemToUpdate = this.actor.items.get(item._id) + console.info( + `[COC7] (Actor:${this.name}) Evaluating skill ${item.name}:${item.data.value} to ${value}` + ) await itemToUpdate.update({ 'data.value': value }) } } + const skill = this.actor.items.get(item._id) + item.data.rawValue = skill.rawValue + item.data.value = skill.value } else { const skill = this.actor.items.get(item._id) item.data.base = await skill.asyncBase() if (item.data.value) { - const value = item.data.value + // This should be part of migration or done at init ! + // Was done when skill value was changed to base + adjustement const exp = item.data.adjustments?.experience ? parseInt(item.data.adjustments.experience) : 0 let updatedExp = exp + parseInt(item.data.value) - skill.value if (updatedExp <= 0) updatedExp = null - await this.actor.updateEmbeddedEntity('OwnedItem', { - _id: item._id, - 'data.adjustments.experience': updatedExp, - 'data.value': null - }) + console.info( + `[COC7] Updating skill ${skill.name} experience. Experience missing: ${updatedExp}` + ) + await this.actor.updateEmbeddedDocuments('Item', [ + { + _id: item._id, + 'data.adjustments.experience': updatedExp, + 'data.value': null + } + ]) if (!item.data.adjustments) item.data.adjustments = {} item.data.adjustments.experience = updatedExp - item.data.value = value - } else item.data.value = skill.value + item.data.rawValue = skill.rawValue + item.data.value = skill.value // ACTIVE_EFFECT necessary to apply effects + } else { + item.data.value = skill.value // ACTIVE_EFFECT necessary to apply effects + item.data.rawValue = skill.rawValue + } } } @@ -330,52 +324,16 @@ export class CoC7ActorSheet extends ActorSheet { for (const itemType in data.itemsByType) { data.itemsByType[itemType].sort((a, b) => { - let lca - let lcb - if (a.data.properties && b.data.properties) { - lca = - a.data.properties.special && - typeof a.data.specialization !== 'undefined' - ? a.data.specialization - .normalize('NFD') - .replace(/[\u0300-\u036f]/g, '') - .toLowerCase() + - a.name - .normalize('NFD') - .replace(/[\u0300-\u036f]/g, '') - .toLowerCase() - : a.name - .normalize('NFD') - .replace(/[\u0300-\u036f]/g, '') - .toLowerCase() - lcb = - b.data.properties.special && - typeof b.data.specialization !== 'undefined' - ? b.data.specialization - .normalize('NFD') - .replace(/[\u0300-\u036f]/g, '') - .toLowerCase() + - b.name - .normalize('NFD') - .replace(/[\u0300-\u036f]/g, '') - .toLowerCase() - : b.name - .normalize('NFD') - .replace(/[\u0300-\u036f]/g, '') - .toLowerCase() - } else { - lca = a.name - .normalize('NFD') - .replace(/[\u0300-\u036f]/g, '') - .toLowerCase() - lcb = b.name - .normalize('NFD') - .replace(/[\u0300-\u036f]/g, '') - .toLowerCase() - } - if (lca < lcb) return -1 - if (lca > lcb) return 1 - return 0 + return a.name + .normalize('NFD') + .replace(/[\u0300-\u036f]/g, '') + .toLocaleLowerCase() + .localeCompare( + b.name + .normalize('NFD') + .replace(/[\u0300-\u036f]/g, '') + .toLocaleLowerCase() + ) }) } @@ -383,48 +341,16 @@ export class CoC7ActorSheet extends ActorSheet { data.skills = data.items .filter(item => item.type === 'skill') .sort((a, b) => { - let lca - let lcb - if (a.data.properties && b.data.properties) { - lca = a.data.properties.special - ? a.data.specialization - .normalize('NFD') - .replace(/[\u0300-\u036f]/g, '') - .toLowerCase() + - a.name - .normalize('NFD') - .replace(/[\u0300-\u036f]/g, '') - .toLowerCase() - : a.name - .normalize('NFD') - .replace(/[\u0300-\u036f]/g, '') - .toLowerCase() - lcb = b.data.properties.special - ? b.data.specialization - .normalize('NFD') - .replace(/[\u0300-\u036f]/g, '') - .toLowerCase() + - b.name - .normalize('NFD') - .replace(/[\u0300-\u036f]/g, '') - .toLowerCase() - : b.name - .normalize('NFD') - .replace(/[\u0300-\u036f]/g, '') - .toLowerCase() - } else { - lca = a.name - .normalize('NFD') - .replace(/[\u0300-\u036f]/g, '') - .toLowerCase() - lcb = b.name - .normalize('NFD') - .replace(/[\u0300-\u036f]/g, '') - .toLowerCase() - } - if (lca < lcb) return -1 - if (lca > lcb) return 1 - return 0 + return a.name + .normalize('NFD') + .replace(/[\u0300-\u036f]/g, '') + .toLocaleLowerCase() + .localeCompare( + b.name + .normalize('NFD') + .replace(/[\u0300-\u036f]/g, '') + .toLocaleLowerCase() + ) }) data.meleeSkills = data.skills.filter( @@ -469,8 +395,7 @@ export class CoC7ActorSheet extends ActorSheet { // si il n'existe plus il faut le retrouver ou passer skillset a false. if (data.combatSkills[weapon.data.skill.main.id]) { const skill = this.actor.items.get(weapon.data.skill.main.id) - weapon.data.skill.main.name = - data.combatSkills[weapon.data.skill.main.id].name + weapon.data.skill.main.name = skill.data.data.skillName weapon.data.skill.main.value = skill.value } else { weapon.skillSet = false @@ -481,8 +406,7 @@ export class CoC7ActorSheet extends ActorSheet { const skill = this.actor.items.get( weapon.data.skill.alternativ.id ) - weapon.data.skill.alternativ.name = - data.combatSkills[weapon.data.skill.alternativ.id].name + weapon.data.skill.alternativ.name = skill.data.data.skillName weapon.data.skill.alternativ.value = skill.value } } @@ -535,7 +459,7 @@ export class CoC7ActorSheet extends ActorSheet { } // For compat with previous characters test if auto is definied, if not we define it - if (!['vehicle'].includes(this.actor.data.type)) { + if (!['vehicle', 'container'].includes(this.actor.data.type)) { const auto = this.actor.checkUndefinedAuto() data.data = mergeObject(data.data, auto) } else { @@ -547,115 +471,120 @@ export class CoC7ActorSheet extends ActorSheet { data.data.attribs.build.auto = false } - data.data.attribs.mov.value = this.actor.mov // return computed values or fixed values if not auto. - data.data.attribs.db.value = this.actor.db - data.data.attribs.build.value = this.actor.build - - if (typeof this.actor.compendium === 'undefined') { - this.actor.update( - { 'data.attribs.mov.value': this.actor.mov }, - { render: false } - ) - this.actor.update( - { 'data.attribs.mov.max': this.actor.mov }, - { render: false } - ) - this.actor.update( - { 'data.attribs.db.value': this.actor.db }, - { render: false } - ) - this.actor.update( - { 'data.attribs.build.current': this.actor.build }, - { render: false } - ) - this.actor.update( - { 'data.attribs.build.value': this.actor.build }, - { render: false } - ) - } + // data.data.attribs.mov.value = this.actor.mov // return computed values or fixed values if not auto. + // data.data.attribs.db.value = this.actor.db + // data.data.attribs.build.value = this.actor.build + + // if (typeof this.actor.compendium === 'undefined' && this.actor.isOwner) { + // ui.notifications.info('changr spec name 4') + // // ACTIVE_EFFECT should be applied here + // // This whole part needs to be re-evaluated + // // Seeting this shouldn't be necessary + // this.actor.update( + // { 'data.attribs.mov.value': this.actor.mov }, + // { render: false } + // ) + // // mov.max never used + // // this.actor.update( + // // { 'data.attribs.mov.max': this.actor.mov }, + // // { render: false } + // // ) + // this.actor.update( + // { 'data.attribs.db.value': this.actor.db }, + // { render: false } + // ) + // this.actor.update( + // { 'data.attribs.build.current': this.actor.build }, + // { render: false } + // ) + // this.actor.update( + // { 'data.attribs.build.value': this.actor.build }, + // { render: false } + // ) + // } // if( data.data.attribs.hp.value < 0) data.data.attribs.hp.value = null; if (data.data.attribs.mp.value < 0) data.data.attribs.mp.value = null if (data.data.attribs.san.value < 0) data.data.attribs.san.value = null // data.data.attribs.san.fiftyOfCurrent = data.data.attribs.san.value >= 0 ? ' / '+Math.floor(data.data.attribs.san.value/5):''; - if (data.data.attribs.hp.auto) { - // TODO if any is null set max back to null. - if ( - data.data.characteristics.siz.value != null && - data.data.characteristics.con.value != null - ) { - data.data.attribs.hp.max = this.actor.hpMax - } - } - - if (data.data.attribs.mp.auto) { - // TODO if any is null set max back to null. - if (data.data.characteristics.pow.value != null) { - data.data.attribs.mp.max = Math.floor( - data.data.characteristics.pow.value / 5 - ) - } - } - - if (data.data.attribs.san.auto) { - data.data.attribs.san.max = this.actor.sanMax - } - - if ( - data.data.attribs.mp.value > data.data.attribs.mp.max || - data.data.attribs.mp.max == null - ) { - data.data.attribs.mp.value = data.data.attribs.mp.max - } - if ( - data.data.attribs.hp.value > data.data.attribs.hp.max || - data.data.attribs.hp.max == null - ) { - data.data.attribs.hp.value = data.data.attribs.hp.max - } - - if ( - data.data.attribs.hp.value == null && - data.data.attribs.hp.max != null - ) { - data.data.attribs.hp.value = data.data.attribs.hp.max - } - if ( - data.data.attribs.mp.value == null && - data.data.attribs.mp.max != null - ) { - data.data.attribs.mp.value = data.data.attribs.mp.max - } + // if (data.data.attribs.hp.auto) { + // // TODO if any is null set max back to null. + // if ( + // data.data.characteristics.siz.value != null && + // data.data.characteristics.con.value != null + // ) { + // data.data.attribs.hp.max = this.actor.hpMax + // } + // } + + // if (data.data.attribs.mp.auto) { + // // TODO if any is null set max back to null. + // if (data.data.characteristics.pow.value != null) { + // data.data.attribs.mp.max = Math.floor( + // data.data.characteristics.pow.value / 5 + // ) + // } + // } + + // if (data.data.attribs.san.auto) { + // data.data.attribs.san.max = this.actor.sanMax + // } + + // if ( + // data.data.attribs.mp.value > data.data.attribs.mp.max || + // data.data.attribs.mp.max == null + // ) { + // data.data.attribs.mp.value = data.data.attribs.mp.max + // } + // if ( + // data.data.attribs.hp.value > data.data.attribs.hp.max || + // data.data.attribs.hp.max == null + // ) { + // data.data.attribs.hp.value = data.data.attribs.hp.max + // } + + // if ( + // data.data.attribs.hp.value == null && + // data.data.attribs.hp.max != null + // ) { + // data.data.attribs.hp.value = data.data.attribs.hp.max + // } + // if ( + // data.data.attribs.mp.value == null && + // data.data.attribs.mp.max != null + // ) { + // data.data.attribs.mp.value = data.data.attribs.mp.max + // } if (!['vehicle'].includes(this.actor.data.type)) { - if ( - data.data.attribs.san.value == null && - data.data.characteristics.pow.value != null - ) { - data.data.attribs.san.value = data.data.characteristics.pow.value - } - if (data.data.attribs.san.value > data.data.attribs.san.max) { - data.data.attribs.san.value = data.data.attribs.san.max - } + // if ( + // data.data.attribs.san.value == null && + // data.data.characteristics.pow.value != null + // ) { + // data.data.attribs.san.value = data.data.characteristics.pow.value + // } + // if (data.data.attribs.san.value > data.data.attribs.san.max) { + // data.data.attribs.san.value = data.data.attribs.san.max + // } if (data.data.biography instanceof Array && data.data.biography.length) { data.data.biography[0].isFirst = true data.data.biography[data.data.biography.length - 1].isLast = true } - - data.data.indefiniteInsanityLevel = {} - data.data.indefiniteInsanityLevel.value = data.data.attribs.san.dailyLoss - ? data.data.attribs.san.dailyLoss - : 0 - data.data.indefiniteInsanityLevel.max = Math.floor( - data.data.attribs.san.value / 5 - ) } - data.hasInventory = - Object.prototype.hasOwnProperty.call(data.itemsByType, 'item') || - Object.prototype.hasOwnProperty.call(data.itemsByType, 'book') || - Object.prototype.hasOwnProperty.call(data.itemsByType, 'spell') || - Object.prototype.hasOwnProperty.call(data.itemsByType, 'talent') + data.showInventoryItems = false + data.showInventoryBooks = false + data.showInventorySpells = false + data.showInventoryTalents = false + data.showInventoryStatuses = false + data.showInventoryWeapons = false + + data.hasConditions = + this.actor.effects.size > 0 || + (typeof this.actor.data.data.conditions !== 'undefined' && + Object.keys(this.actor.data.data.conditions).filter( + condition => this.actor.data.data.conditions[condition].value + ).length > 0) // const first = data.data.biography[0]; // first.isFirst = true; // data.data.biography[0] = first; @@ -694,6 +623,10 @@ export class CoC7ActorSheet extends ActorSheet { activateListeners (html) { super.activateListeners(html) + html + .find('.token-drag-handle') + .on('dragstart', this._onDragTokenStart.bind(this)) + // Owner Only Listeners if (this.actor.isOwner && typeof this.actor.compendium === 'undefined') { html @@ -722,9 +655,7 @@ export class CoC7ActorSheet extends ActorSheet { html .find('.characteristic-label') .click(this._onRollCharacteriticTest.bind(this)) - html - .find('.skill-name.rollable') - .click(this._onRollSkillTest.bind(this)) + html.find('.skill-name.rollable').click(this._onRollSkillTest.bind(this)) html.find('.skill-image').click(this._onRollSkillTest.bind(this)) html .find('.attribute-label.rollable') @@ -744,7 +675,9 @@ export class CoC7ActorSheet extends ActorSheet { // Status monitor if (game.user.isGM || game.settings.get('CoC7', 'statusPlayerEditable')) { html.find('.reset-counter').click(this._onResetCounter.bind(this)) - html.find('.status-monitor').click(this._onStatusToggle.bind(this)) + html + .find('.condition-monitor') + .click(this._onConditionToggle.bind(this)) html.find('.is-dying').click(this.heal.bind(this)) html.find('.is-dead').click(this.revive.bind(this)) } @@ -767,6 +700,7 @@ export class CoC7ActorSheet extends ActorSheet { html.on('click', '.weapon-damage', this._onWeaponDamage.bind(this)) html.find('.inventory-header').click(this._onInventoryHeader.bind(this)) + html.find('.items-header').click(this._onItemHeader.bind(this)) html.find('.section-header').click(this._onSectionHeader.bind(this)) const wheelInputs = html.find('.attribute-value') @@ -784,11 +718,8 @@ export class CoC7ActorSheet extends ActorSheet { html.find('.item-popup').click(this._onItemPopup.bind(this)) // Update Inventory Item - html.find('.item-edit').click(ev => { - const li = $(ev.currentTarget).parents('.item') - const item = this.actor.items.get(li.data('itemId')) - item.sheet.render(true) - }) + html.find('.show-detail').dblclick(event => this._onRenderItemSheet(event)) + html.find('.item-edit').click(event => this._onRenderItemSheet(event)) // Delete Inventory Item html.find('.item-delete').click(async ev => { @@ -802,18 +733,38 @@ export class CoC7ActorSheet extends ActorSheet { html.find('.add-item').click(ev => { switch (ev.currentTarget.dataset.type) { - case 'skill': - this.actor.createEmptySkill(ev) + case 'book': + this.actor.createEmptyBook(ev) break case 'item': this.actor.createEmptyItem(ev) break + case 'skill': + this.actor.createEmptySkill(ev) + break + case 'spell': + this.actor.createEmptySpell(ev) + break case 'weapon': - this.actor.createEmptyWeapon(ev) + { + const properties = {} + if (ev.currentTarget.dataset.melee) { + properties.melee = true + } else if (ev.currentTarget.dataset.rngd) { + properties.rngd = true + } + this.actor.createEmptyWeapon(ev, properties) + } break } }) + // html.find('.clean-skill-list').click(() => { + // this.actor.cleanSkills() + // }) + + html.find('.item-trade').click(this._onTradeItem.bind(this)) + html.find('.add-new-section').click(() => { this.actor.createBioSection() }) @@ -870,55 +821,366 @@ export class CoC7ActorSheet extends ActorSheet { } }) - html - .find('a.coc7-link') - .on('click', async event => await CoC7Parser._onCheck(event)) + html.find('.clear_conditions').click(event => { + if (typeof this.actor.data.data.conditions !== 'undefined') { + const disable = {} + for (const condition in this.actor.data.data.conditions) { + if ( + typeof this.actor.data.data.conditions[condition].value !== + 'undefined' && + this.actor.data.data.conditions[condition].value === true + ) { + disable[`data.conditions.${condition}.value`] = false + } + } + if (Object.keys(disable).length > 0) { + this.actor.update(disable) + } + } + const effects = this.actor.effects.map(effect => effect.id) + if (effects.length > 0) { + this.actor.deleteEmbeddedDocuments('ActiveEffect', effects) + } + }) + + html.find('a.coc7-link').on('click', event => CoC7Parser._onCheck(event)) html .find('a.coc7-link') .on('dragstart', event => CoC7Parser._onDragCoC7Link(event)) + /** + * This is used for dev purposes only ! + */ html.find('.test-trigger').click(async event => { - await OpposedCheckCard.dispatch({ - type: OpposedCheckCard.defaultConfig.type, - combat: false, - action: 'new', - roll: { - characteristic: 'str', - actor: this.actor.actorKey - } + if (!game.settings.get('CoC7', 'hiddendevmenu')) return null + await Item.create({ + name: '__CoC7InternalItem__', + type: 'item' }) + // const effects = await item.createEmbeddedDocuments('ActiveEffect', [ + // { + // label: game.i18n.localize('CoC7.EffectNew'), + // icon: 'icons/svg/aura.svg', + // origin: null, + // 'duration.rounds': undefined, + // disabled: true + // } + // ]) + // const effect = effects[0] + // await effect.sheet.render(true) + // ui.notifications.info( 'effect created !') + ui.notifications.info('effect created !') + }) + + html + .find('.skill-name.rollable') + .mouseenter(this.toolTipSkillEnter.bind(this)) + .mouseleave(game.CoC7Tooltips.toolTipLeave.bind(this)) + html + .find('.characteristic-label') + .mouseenter(this.toolTipCharacteristicEnter.bind(this)) + .mouseleave(game.CoC7Tooltips.toolTipLeave.bind(this)) + html + .find('.attribute-label.rollable') + .mouseenter(this.toolTipAttributeEnter.bind(this)) + .mouseleave(game.CoC7Tooltips.toolTipLeave.bind(this)) + html + .find('.auto-toggle') + .mouseenter(this.toolTipAutoEnter.bind(this)) + .mouseleave(game.CoC7Tooltips.toolTipLeave.bind(this)) + html + .find('.item-control.development-flag') + .mouseenter(this.toolTipFlagForDevelopment.bind(this)) + .mouseleave(game.CoC7Tooltips.toolTipLeave.bind(this)) + + // Active Effects + html + .find('.effect-control') + .click(ev => CoC7ActiveEffect.onManageActiveEffect(ev, this.actor)) + } - await OpposedCheckCard.dispatch({ - type: OpposedCheckCard.defaultConfig.type, - combat: false, - action: 'new', - roll: { - characteristic: 'con' - // actor: this.actor.actorKey + toolTipSkillEnter (event) { + const delay = parseInt(game.settings.get('CoC7', 'toolTipDelay')) + if (delay > 0) { + const sheet = this + game.CoC7Tooltips.ToolTipHover = event.currentTarget + game.CoC7Tooltips.toolTipTimer = setTimeout(function () { + if ( + typeof game.CoC7Tooltips.ToolTipHover !== 'undefined' && + game.CoC7Tooltips.ToolTipHover !== null + ) { + const isCombat = game.CoC7Tooltips.ToolTipHover.classList?.contains( + 'combat' + ) + const item = game.CoC7Tooltips.ToolTipHover.closest('.item') + if (typeof item !== 'undefined') { + const skillId = item.dataset.skillId + const skill = sheet.actor.items.get(skillId) + let toolTip = game.i18n.format( + isCombat ? 'CoC7.ToolTipCombat' : 'CoC7.ToolTipSkill', + { + skill: skill.name, + regular: skill.value, + hard: Math.floor(skill.value / 2), + extreme: Math.floor(skill.value / 5) + } + ) + if (game.user.isGM) { + toolTip = + toolTip + + game.i18n.format('CoC7.ToolTipKeeperSkill', { + other: + game.settings.get('CoC7', 'stanbyGMRolls') && + sheet.actor.hasPlayerOwner + ? game.i18n.format('CoC7.ToolTipKeeperStandbySkill', { + name: sheet.actor.name + }) + : '' + }) + } + game.CoC7Tooltips.displayToolTip(toolTip) + } } - }) - // const val = getProperty( this.actor, 'data.data.attribs.san.value'); + }, delay) + } + } - // this.actor.enterBoutOfMadness( true, 10); + toolTipCharacteristicEnter (event) { + const delay = parseInt(game.settings.get('CoC7', 'toolTipDelay')) + if (delay > 0) { + const sheet = this + game.CoC7Tooltips.ToolTipHover = event.currentTarget + game.CoC7Tooltips.toolTipTimer = setTimeout(function () { + if ( + typeof game.CoC7Tooltips.ToolTipHover !== 'undefined' && + game.CoC7Tooltips.ToolTipHover !== null + ) { + const char = game.CoC7Tooltips.ToolTipHover.closest('.char-box') + if (typeof char !== 'undefined' && !!char) { + const charId = char.dataset.characteristic + const characteristic = sheet.actor.characteristics[charId] + let toolTip = game.i18n.format('CoC7.ToolTipSkill', { + skill: characteristic.label, + regular: characteristic.value ?? 0, + hard: characteristic.hard ?? 0, + extreme: characteristic.extreme ?? 0 + }) + if (game.user.isGM) { + toolTip = + toolTip + + game.i18n.format('CoC7.ToolTipKeeperSkill', { + other: + game.settings.get('CoC7', 'stanbyGMRolls') && + sheet.actor.hasPlayerOwner + ? game.i18n.format('CoC7.ToolTipKeeperStandbySkill', { + name: sheet.actor.name + }) + : '' + }) + } + game.CoC7Tooltips.displayToolTip(toolTip) + } + } + }, delay) + } + } - // const roll = new CoC7Check(); - // roll.actor = this.actorKey; - // roll.attribute = 'san'; - // roll.difficulty = this.options.sanDifficulty || CoC7Check.difficultyLevel.regular; - // roll.diceModifier = this.options.sanModifier || 0; - // await roll._perform(); + toolTipAttributeEnter (event) { + const delay = parseInt(game.settings.get('CoC7', 'toolTipDelay')) + if (delay > 0) { + const sheet = this + game.CoC7Tooltips.ToolTipHover = event.currentTarget + game.CoC7Tooltips.toolTipTimer = setTimeout(function () { + if ( + typeof game.CoC7Tooltips.ToolTipHover !== 'undefined' && + game.CoC7Tooltips.ToolTipHover !== null + ) { + const attrib = game.CoC7Tooltips.ToolTipHover.closest('.attribute') + if (typeof attrib !== 'undefined') { + const attributeId = attrib.dataset.attrib + let toolTip = '' + const attributes = sheet.actor.data.data.attribs[attributeId] + switch (attributeId) { + case 'lck': + toolTip = game.i18n.format('CoC7.ToolTipSkill', { + skill: attributes.label, + regular: attributes.value ?? 0, + hard: Math.floor((attributes.value ?? 0) / 2), + extreme: Math.floor((attributes.value ?? 0) / 5) + }) + if (game.user.isGM) { + toolTip = + toolTip + + game.i18n.format('CoC7.ToolTipKeeperSkill', { + other: + game.settings.get('CoC7', 'stanbyGMRolls') && + sheet.actor.hasPlayerOwner + ? game.i18n.format('CoC7.ToolTipKeeperStandbySkill', { + name: sheet.actor.name + }) + : '' + }) + } + game.CoC7Tooltips.displayToolTip(toolTip) + break + case 'db': + toolTip = game.i18n.localize('CoC7.ToolTipDB') + game.CoC7Tooltips.displayToolTip(toolTip) + break + case 'san': + toolTip = game.i18n.format('CoC7.ToolTipSanity', { + skill: 'Sanity', + regular: attributes.value ?? 0, + hard: Math.floor((attributes.value ?? 0) / 2), + extreme: Math.floor((attributes.value ?? 0) / 5) + }) + if (game.user.isGM) { + toolTip = + toolTip + + game.i18n.format('CoC7.ToolTipKeeperSkill', { + other: + game.i18n.localize('CoC7.ToolTipKeeperSanity') + + (game.settings.get('CoC7', 'stanbyGMRolls') && + sheet.actor.hasPlayerOwner + ? game.i18n.format('CoC7.ToolTipKeeperStandbySkill', { + name: sheet.actor.name + }) + : '') + }) + } + game.CoC7Tooltips.displayToolTip(toolTip) + break + } + } + } + }, delay) + } + } - // for (const effect of this.actor.effects) { - // await effect.sheet.render(true); - // // effect.delete(); - // } - // this.actor.effects.forEach( e => e.delete()); - // await setProperty( this.actor, 'data.data.encounteredCreatures', []); + toolTipAutoEnter (event) { + const delay = parseInt(game.settings.get('CoC7', 'toolTipDelay')) + if (delay > 0) { + game.CoC7Tooltips.ToolTipHover = event.currentTarget + game.CoC7Tooltips.toolTipTimer = setTimeout(function () { + if ( + typeof game.CoC7Tooltips.ToolTipHover !== 'undefined' && + game.CoC7Tooltips.ToolTipHover !== null + ) { + const toolTip = game.i18n.localize('CoC7.ToolTipAutoToggle') + game.CoC7Tooltips.displayToolTip(toolTip) + } + }, delay) + } + } - // await this.actor.update( {['data.encounteredCreatures'] : []}); - if (event.shiftKey) ui.notifications.info('Shift cliecked') - // SanCheckCard.create( this.actor.actorKey, {min:'1D10',max:'1D12'}, {fastForward:event.shiftKey}); + toolTipFlagForDevelopment (event) { + const delay = parseInt(game.settings.get('CoC7', 'toolTipDelay')) + if (delay > 0) { + const sheet = this + game.CoC7Tooltips.ToolTipHover = event.currentTarget + game.CoC7Tooltips.toolTipTimer = setTimeout(function () { + if ( + typeof game.CoC7Tooltips.ToolTipHover !== 'undefined' && + game.CoC7Tooltips.ToolTipHover !== null + ) { + const item = game.CoC7Tooltips.ToolTipHover.closest('.item') + if (typeof item !== 'undefined') { + const skillId = item.dataset.skillId + const skill = sheet.actor.items.get(skillId) + const toolTip = game.i18n.format('CoC7.ToolTipSkillFlagToggle', { + status: game.i18n.localize( + skill.data.data.flags.developement + ? 'CoC7.ToolTipSkillFlagged' + : 'CoC7.ToolTipSkillUnflagged' + ) + }) + game.CoC7Tooltips.displayToolTip(toolTip) + } + } + }, delay) + } + } + + _onRenderItemSheet (event) { + const li = $(event.currentTarget).parents('.item') + const item = this.actor.items.get(li.data('itemId')) + item.sheet.render(true) + } + + async _onTradeItem (event) { + const li = $(event.currentTarget).parents('.item') + const item = this.actor.items.get(li.data('itemId')) + let content = '' + game.i18n.localize('CoC7.MessageSelectUserToGiveTo') + const message = { + actorFrom: this.actor.id, + scene: null, + actorTo: this.actor.id, + item: item.id + } + if (this.token?.actor) { + message.actorFrom = this.token.id + message.scene = this.token.parent.id + } + const actors = game.actors.filter(e => { + if (!['character', 'npc', 'creature', 'container'].includes(e.type)) { + return false + } + if (this.actor.id === e.id) { + return false + } + let visible = false + for (const [k, v] of Object.entries(e.data.permission)) { + if (k === 'default' || k === game.user.id) { + visible = + visible || + v !== + (CONST.DOCUMENT_OWNERSHIP_LEVELS || CONST.ENTITY_PERMISSIONS).NONE + } + } + return visible + }) + content = content + '
' + game.i18n.localize('CoC7.MessageSelectUserToGiveTo') + const message = { + actorFrom: this.actor.id, + scene: null, + actorTo: this.actor.id, + item: item.id + } + if (this.token?.actor) { + message.actorFrom = this.token.id + message.scene = this.token.parent.id + } + const actors = game.actors.filter(e => { + if (!['character', 'npc', 'creature', 'container'].includes(e.type)) { + return false + } + if (this.actor.id === e.id) { + return false + } + let visible = false + for (const [k, v] of Object.entries(e.data.permission)) { + if (k === 'default' || k === game.user.id) { + visible = + visible || + v !== + (CONST.DOCUMENT_OWNERSHIP_LEVELS || CONST.ENTITY_PERMISSIONS).NONE + } + } + return visible + }) + content = content + '
' + await Dialog.prompt({ + title: game.i18n.localize('CoC7.MessageTitleSelectUserToGiveTo'), + content, + callback: html => { + const formData = new FormData(html[0].querySelector('#selectform')) + for (const [name, value] of formData) { + if (name === 'user') { + message.actorTo = value + } + } + } + }) + await game.CoC7socket.executeAsGM('gmtradeitemto', message) + } + + _onItemSummary (event) { + event.preventDefault() + const li = $(event.currentTarget).parents('.item') + const item = this.actor.items.get(li.data('item-id')) + const chatData = item.getChatData({ secrets: this.actor.isOwner }) + + // Toggle summary + if (li.hasClass('expanded')) { + const summary = li.children('.item-summary') + summary.slideUp(200, () => summary.remove()) + } else { + const div = $('') + + const labels = $('') + for (const p of chatData.labels) { + labels.append( + `') + if (s.length === 0) { + return '' + } + return '
' + s + '
' } /** - * processName extracts the Character name from the first line of the `text` - * @param {string} text raw character name text - * @returns the character name or 'Imported unnamed character' if the name was not found + * check expects a key from this.regEx will attempt to match the text + * @param {String} regExKey key in this.regEx + * @param {JSON} + * - removeFromText remove from this.text + * - saveKeys add group keys to this.parsed + * - type If adding with saveKeys set type (CoC7ActorImporter.asString / CoC7ActorImporter.asNumber) + * - text If set use this instead of this.text + * - requiredGroup If not false require specified key in RegExp groups + * @returns {False}/{JSON groups '' is matched string} */ - processName (text) { - const nameFound = this.RE.nameRegExp.exec(text) - if (nameFound !== null) { - return nameFound.groups.name + check ( + regExKey, + { + removeFromText = true, + saveKeys = true, + type = CoC7ActorImporter.asString, + text = false, + requiredGroup = false + } = {} + ) { + let output = false + let regExp = false + if (typeof this.regEx[regExKey] !== 'undefined') { + regExp = this.getRegEx(this.regEx[regExKey]) + } else if (typeof this.keys[regExKey] !== 'undefined') { + regExp = this.getRegEx(this.keys[regExKey]) + } + if (regExp !== false) { + if (text === false) { + text = this.text + } + const check = regExp.exec(text) + let value = null + if ( + check !== null && + (requiredGroup === false || + typeof (check.groups || {})[requiredGroup] !== 'undefined') + ) { + output = check.groups || {} + if (removeFromText) { + this.text = this.text.replace(check[0].trim(), '\n').trim() + } + if (saveKeys) { + for (const key of Object.keys(check.groups)) { + switch (type) { + case CoC7ActorImporter.asString: + this.parsed[key] = String(check.groups[key]).replace('\n', ' ') + break + case CoC7ActorImporter.asNumber: + value = Number(check.groups[key]) + if (!isNaN(value)) { + this.parsed[key] = Number(check.groups[key]) + } + break + } + } + } + output['-source'] = check[0] + output['-index'] = check.index + } } - return game.i18n.localize('COC7.ImportedUnnamedCharacter') + return output } /** - * processAttacks extract the information related to the attacks and returns an array of weapons basic data - * @param {String} attacks raw text for the Attacks data - * @returns array of weapon data. + * processCombat extracts combat / dodge information from a subsection of text + * @param {String} text the raw text of the combat section + * @returns void */ - processAttacks (attacks) { - const results = [] - if (attacks != null) { - let weapon = this.RE.weaponRegExp.exec(attacks) - while (weapon !== null) { - // Attempt to guess some of the weapon properties - const cleanWeapon = this.cleanString(weapon.groups.weapon) - const doesDamageBonus = this.RE.dbRegExp.test(weapon.groups.damage) - const isRanged = - this.RE.handgunRegExp.test(cleanWeapon) || - this.RE.rifleRegExp.test(cleanWeapon) || - this.RE.smbRegExp.test(cleanWeapon) || - this.RE.machineGunRegExp.test(cleanWeapon) - // Basic weapon data + processCombat (text) { + if (text.trim().length === 0) { + return + } + if (CONFIG.debug.CoC7Importer) { + console.log('combat text', text) + } + let weapon + let dodge + let newline + let lastPercent = false + let maxLoops = 40 + do { + maxLoops-- + text = text.trim() + if ( + (dodge = this.check('weaponDodge', { saveKeys: false, text })) + ) { + text = text.replace(dodge['-source'], '\n') + if (typeof this.parsed.skills === 'undefined') { + this.parsed.skills = [] + } + this.parsed.skills.push({ + name: this.cleanString(dodge.name), + value: Number(dodge.percentage), + push: false + }) + } else if ( + (weapon = this.check('weapon', { + saveKeys: false, + text, + requiredGroup: lastPercent === false ? 'percentage' : false + })) + ) { + text = text.replace(weapon['-source'], '\n') + const name = this.cleanString(weapon.name || '') + let damage = this.translateRoll(this.cleanString(weapon.damage || '')) + const isRanged = !!( + this.check('handgun', { + text: name, + removeFromText: false, + saveKeys: false + }) || + this.check('rifle', { + text: name, + removeFromText: false, + saveKeys: false + }) || + this.check('smb', { + text: name, + removeFromText: false, + saveKeys: false + }) || + this.check('machineGun', { + text: name, + removeFromText: false, + saveKeys: false + }) || + this.check('launched', { + text: name, + removeFromText: false, + saveKeys: false + }) + ) + if ( + weapon.percentage !== null && + typeof weapon.percentage !== 'undefined' + ) { + lastPercent = Number(weapon.percentage) + } else { + lastPercent = true + } + let found + let ahdb = false + let addb = false + do { + found = this.getRegEx( + '\\s*[+-]?\\s*(' + + this.keys.halfdb + + ')\\s*(' + + this.keys.fulldb + + ')?[-+]?\\s*(' + + this.parsed.db.replace(/^[-+]/, '') + + ')?' + ).exec(damage) + if (found) { + ahdb = true + damage = damage.replace(found[0], '') + } else { + found = this.getRegEx( + '\\s*[+-]?\\s*(' + + this.keys.fulldb + + ')\\s*[-+]?\\s*(' + + this.parsed.db.replace(/^[-+]/, '') + + ')?' + ).exec(damage) + if (found) { + addb = true + damage = damage.replace(found[0], '') + } + } + } while (found) + const damages = damage.split('/') + const isShotgun = damages.length === 3 const data = { - name: cleanWeapon, + name, type: 'weapon', data: { + skill: { + id: lastPercent + }, properties: {}, range: { normal: { - value: Number(weapon.groups.percentage), - damage: weapon.groups.damage + value: isShotgun ? 10 : 0, + damage: damages[0] + }, + long: { + value: isShotgun ? 20 : 0, + damage: isShotgun ? damages[1] : '' + }, + extreme: { + value: isShotgun ? 50 : 0, + damage: isShotgun ? damages[2] : '' } } } } - for (const [key] of Object.entries(COC7.weaponProperties)) { - data.data.properties[key] = false - } // Set some of the properties - data.data.properties.rngd = isRanged - data.data.properties.melee = doesDamageBonus // if a weapon doesDamageBonus usually means it's a melee weapon - data.data.properties.addb = doesDamageBonus - results.push(data) - weapon = this.RE.weaponRegExp.exec(attacks) + data.data.properties.shotgun = isShotgun + data.data.properties.rngd = isRanged || isShotgun + data.data.properties.melee = !data.data.properties.rngd + data.data.properties.ahdb = ahdb + data.data.properties.addb = addb + if (typeof this.parsed.attacks === 'undefined') { + this.parsed.attacks = [] + } + this.parsed.attacks.push(data) + } else if ((newline = text.match(/^(.+)\n/))) { + text = text.replace(newline[0], '\n') + } else if ((newline = text.match(/^[^\n]+$/))) { + text = '' } + } while (maxLoops > 0 && (!!weapon || !!dodge || !!text)) + if (maxLoops === 0) { + ui.notifications.warn( + game.i18n.localize('CoC7.ErrorUnexpectedWeaponText') + ) + console.debug('Unexpected weapons:', text) } - console.debug('attacks', results) - return results } /** - * processSpells converts the raw text with the spells to an `Array` of `String` with the spells - * @param {String} spells raw text of the spells - * @returns {Array[String]} of spells + * processSkills extracts skills / language information from a subsection of text + * @param {String} text the raw text of the skills / language section + * @returns void */ - processSpells (spells) { - const results = [] - if (spells !== null) { - const spellsArr = spells.replace(/(\n|\r)/g, ' ').split(',') - spellsArr.forEach(s => { - results.push(this.cleanString(s)) - }) + processSkills (text, key = 'skills') { + if (text.trim().length === 0) { + return + } + const breaks = text.split(/\.\r?\n/) + if (breaks.length > 1) { + text = breaks[0] + } + let skill + let maxLoops = 40 + do { + maxLoops-- + text = text.trim() + skill = this.check('skill', { saveKeys: false, text }) + if (skill) { + text = text.replace(skill['-source'], '\n') + if (typeof this.parsed[key] === 'undefined') { + this.parsed[key] = [] + } + this.parsed[key].push({ + name: this.cleanString(skill.name), + value: Number(skill.percentage) + }) + } + } while (maxLoops > 0 && skill) + if (maxLoops === 0) { + ui.notifications.warn( + game.i18n.localize('CoC7.ErrorUnexpectedSkillsText') + ) + console.debug('Unexpected skills:', text) } - console.debug('spells', results) - return results } /** - * basicWeaponData creates a basic object with the default basic data for a weapon skill - * @param {boolean} firearms true if the weapon uses firearms, false if it's a melee one. - * @returns object with default values for the weapon + * processSpells extracts spell information from a subsection of text + * @param {String} text the raw text of the spell section + * @returns void */ - basicWeaponSkillData (firearms) { - return { - specialization: game.i18n.localize( - firearms - ? 'CoC7.FirearmSpecializationName' - : 'CoC7.FightingSpecializationName' - ), - adjustments: defaultWeaponSkillAdjustments, - properties: { - special: true, - fighting: !firearms, - firearm: firearms, - combat: true + processSpells (text) { + if (text.trim().length === 0) { + return + } + const breaks = text.split(/\.\r?\n/) + if (breaks.length > 1) { + text = breaks[0] + } + const spellsArr = text.replace(/([\n\r]+)/g, ' ').split(/(? { - const parsedSkill = this.RE.skillRegExp.exec(skill) - console.debug('parsedSkill', parsedSkill) - if (parsedSkill !== null) { - const skillName = this.cleanString(parsedSkill.groups.skill) - results.push({ - name: skillName, - value: Number(parsedSkill.groups.percentage) - }) + async parseCharacter (text) { + // Replace "En Dash" and "Em Dash" dashes with - and "Right Single Quotation Mark" with ' + this.text = String(text) + .trim() + .replace(/\u2013|\u2014|\u2212/g, '-') + .replace(/\u2019/g, "'") + .replace(/[\udbc0-\udbfe][\udc00-\udfff]/g, '') + // Earliest character that has been used, to work out the header + let min = this.text.length + // STR, if berfore than previous min update it + let check = this.check('str', { type: CoC7ActorImporter.asNumber })[ + '-index' + ] + if (!isNaN(check)) { + min = Math.min(min, check) + } + // CON, if berfore than previous min update it + check = this.check('con', { type: CoC7ActorImporter.asNumber })['-index'] + if (!isNaN(check)) { + min = Math.min(min, check) + } + // SIZ, if berfore than previous min update it + check = this.check('siz', { type: CoC7ActorImporter.asNumber })['-index'] + if (!isNaN(check)) { + min = Math.min(min, check) + } + // INT, if berfore than previous min update it + check = this.check('int', { type: CoC7ActorImporter.asNumber })['-index'] + if (!isNaN(check)) { + min = Math.min(min, check) + } + // POW, if berfore than previous min update it + check = this.check('pow', { type: CoC7ActorImporter.asNumber })['-index'] + if (!isNaN(check)) { + min = Math.min(min, check) + } + // DEX, if berfore than previous min update it + check = this.check('dex', { type: CoC7ActorImporter.asNumber })['-index'] + if (!isNaN(check)) { + min = Math.min(min, check) + } + // APP, if berfore than previous min update it + check = this.check('app', { type: CoC7ActorImporter.asNumber })['-index'] + if (!isNaN(check)) { + min = Math.min(min, check) + } + // EDU, if berfore than previous min update it + check = this.check('edu', { type: CoC7ActorImporter.asNumber })['-index'] + if (!isNaN(check)) { + min = Math.min(min, check) + } + // SAN, if berfore than previous min update it + check = this.check('san', { type: CoC7ActorImporter.asNumber })['-index'] + if (!isNaN(check)) { + min = Math.min(min, check) + } + // HP, if berfore than previous min update it + check = this.check('hp', { type: CoC7ActorImporter.asNumber })['-index'] + if (!isNaN(check)) { + min = Math.min(min, check) + } + // MP, if berfore than previous min update it + check = this.check('mp', { type: CoC7ActorImporter.asNumber })['-index'] + if (!isNaN(check)) { + min = Math.min(min, check) + } + // Work out the header based on previous minimum matched character + let header + if (min > 0) { + header = this.text.substr(0, min) + // Get name from header + check = this.check('name', { text: header }) + if (check === false) { + // If not found use default NPC name + this.parsed.name = game.i18n.localize('CoC7.ImportedUnnamedCharacter') + } else { + // Remove name from header + header = header.replace(check['-source'], '\n') + } + // Get age from header + check = this.check('age', { text: header }) + if (check !== false) { + // If found remove age from header + header = header.replace(check['-source'], '\n') + } + // Get occupation from header + if (!this.check('occupation', { text: header }) && header.trim() !== '') { + // If occupation is not found but there is a header set the occupation to the remaining header + let occupation = header + if (header.indexOf('.') > -1) { + // If there is a full stop just use the first part of the header as the occupation + occupation = header.substr(0, header.indexOf('.') + 1) } + this.parsed.occupation = occupation + .replace(/([\n\r]+)/g, ' ') + .trim() + .replace(/,$/, '') + this.text = this.text.replace(occupation.trim(), '\n') + } + } else { + // There is no header set default NPC name + this.parsed.name = game.i18n.localize('CoC7.ImportedUnnamedCharacter') + } + // If there is an occupation but no age check if the occupation starts number split age and occupation + if ( + typeof this.parsed.occupation !== 'undefined' && + typeof this.parsed.age === 'undefined' + ) { + const occupationAge = this.parsed.occupation.match( + /^(?' + game.i18n.localize('CoC7.MessageSelectSingleUserForTarget') content = content + '
' await Dialog.prompt({ title: game.i18n.localize( 'CoC7.MessageTitleSelectSingleUserForTarget' ), - content: content, + content, callback: html => { const formData = new FormData( html[0].querySelector('#selectform') ) - formData.forEach(function (value, name) { + for (const [name, value] of formData) { if (name === 'user') { user = game.users.get(value) } - }) + } } }) } @@ -222,8 +232,14 @@ export class CoC7MeleeTarget extends ChatCardActor { } async updateChatCard () { - const html = await renderTemplate(this.template, this) const message = game.messages.get(this.messageId) + if (!game.user.isGM && message.user.id !== game.user.id) { + ui.notifications.info( + game.i18n.localize('CoC7.UnableToInteractWithChatCard') + ) + return + } + const html = await renderTemplate(this.template, this) const msg = await message.update({ content: html }) await ui.chat.updateMessage(msg, false) @@ -242,14 +258,25 @@ export class CoC7MeleeTarget extends ChatCardActor { switch (event.currentTarget.dataset.action) { case 'dodge': target.dodging = true + target.notResponding = false target.fightingBack = false target.maneuvering = false target.skillId = event.currentTarget.dataset.skillId target.itemId = null break + case 'noResponse': + target.dodging = false + target.notResponding = true + target.fightingBack = false + target.maneuvering = false + target.skillId = null + target.itemId = null + break + case 'fightBack': target.dodging = false + target.notResponding = false target.fightingBack = true target.maneuvering = false target.skillId = event.currentTarget.dataset.skillId @@ -258,6 +285,7 @@ export class CoC7MeleeTarget extends ChatCardActor { case 'maneuver': target.dodging = false + target.notResponding = false target.fightingBack = false target.maneuvering = true target.skillId = event.currentTarget.dataset.skillId @@ -300,6 +328,21 @@ export class CoC7MeleeTarget extends ChatCardActor { return check } + async publishNoReponseResult () { + this.rolled = true + this.resolved = true + this.notResponding = true + const resolutionCard = new CoC7MeleeResoltion( + this.parentMessageId, + this.messageId + ) + + const resolutionMessage = await resolutionCard.preCreateMessage() + + this.resolutionCard = resolutionMessage.id + await this.updateChatCard() + } + async publishCheckResult (check = null) { if (!check && !this.check) return null @@ -390,7 +433,7 @@ export class CoC7MeleeTarget extends ChatCardActor { resulDetails.innerText = game.i18n.format( 'CoC7.RollResult.LuckSpendText', { - luckAmount: luckAmount, + luckAmount, successLevel: game.i18n.localize('CoC7.RegularDifficulty') } ) @@ -401,7 +444,7 @@ export class CoC7MeleeTarget extends ChatCardActor { resulDetails.innerText = game.i18n.format( 'CoC7.RollResult.LuckSpendText', { - luckAmount: luckAmount, + luckAmount, successLevel: game.i18n.localize('CoC7.HardDifficulty') } ) @@ -412,7 +455,7 @@ export class CoC7MeleeTarget extends ChatCardActor { resulDetails.innerText = game.i18n.format( 'CoC7.RollResult.LuckSpendText', { - luckAmount: luckAmount, + luckAmount, successLevel: game.i18n.localize('CoC7.ExtremeDifficulty') } ) @@ -423,7 +466,7 @@ export class CoC7MeleeTarget extends ChatCardActor { resulDetails.innerText = game.i18n.format( 'CoC7.RollResult.LuckSpendText', { - luckAmount: luckAmount, + luckAmount, successLevel: game.i18n.localize('CoC7.CriticalDifficulty') } ) diff --git a/module/chat/concheck.js b/module/chat/concheck.js index 3cf4e7f7..a026cb49 100644 --- a/module/chat/concheck.js +++ b/module/chat/concheck.js @@ -1,5 +1,6 @@ /* global $, ChatMessage, game, renderTemplate, ui */ +import { COC7 } from '../config.js' import { CoC7Check } from '../check.js' import { chatHelper, CoC7Roll } from './helper.js' @@ -112,7 +113,7 @@ export class CoC7ConCheck { const chatData = { user: user.id, - speaker: speaker, + speaker, flavor: this.flavor, content: htmlElement.outerHTML } @@ -132,9 +133,12 @@ export class CoC7ConCheck { async rollCon () { this.check.hideDiceResult = true await this.check._perform() - if (!this.isSuccess && !this.isBlind) { - if (this.stayAlive) await this.actor.fallDead() - else await this.actor.fallUnconscious() + if (!this.isBlind && !this.isRolled && !this.isSuccess) { + if (this.stayAlive) { + await this.actor.setCondition(COC7.status.dead) + } else { + await this.actor.setCondition(COC7.status.unconscious) + } } this.applied = true } @@ -149,8 +153,11 @@ export class CoC7ConCheck { check.replaceWith(await this.getCheckElement()) if (!this.isBlind && this.isRolled && !this.isSuccess) { - if (this.stayAlive) await this.actor.fallDead() - else await this.actor.fallUnconscious() + if (this.stayAlive) { + await this.actor.setCondition(COC7.status.dead) + } else { + await this.actor.setCondition(COC7.status.unconscious) + } } if (!this.messageId) return diff --git a/module/chat/helper.js b/module/chat/helper.js index 8af4f342..564bb3dd 100644 --- a/module/chat/helper.js +++ b/module/chat/helper.js @@ -1,6 +1,7 @@ -/* global canvas, ChatMessage, CONST, duplicate, game, Ray, Token */ +/* global canvas, ChatMessage, CONST, duplicate, fromUuid, game, Ray, Token, ui */ import { CoC7Check } from '../check.js' +import { CoC7Utilities } from '../utilities.js' /** * Return element of a roll instance. foundry.js ref:TextEditor._createInlineRoll @@ -67,6 +68,9 @@ export function exclude__ (key, value) { * @returns */ export function isCtrlKey (event) { + if (event === false) { + return false + } return ( event.metaKey || event.ctrlKey || @@ -111,6 +115,12 @@ export class chatHelper { static getActorFromKey (key) { if (!key) return null + // Case 0 - a document Uuid + if (CoC7Utilities.isDocumentUuid(key)) { + if (CoC7Utilities.isDocumentUuidPack(key)) return fromUuid(key) // TODO Check we can do that + return CoC7Utilities.SfromUuid(key) + } + // Case 1 - a synthetic actor from a Token if (key.includes('.')) { // REFACTORING (2) @@ -143,7 +153,7 @@ export class chatHelper { } static attachObjectToElement (object, element, objectName = '') { - Object.keys(object).forEach(prop => { + for (const prop of Object.keys(object)) { if (!prop.startsWith('_')) { if (typeof object[prop] === 'object') { chatHelper.attachObjectToElement( @@ -155,7 +165,7 @@ export class chatHelper { element.dataset[`${objectName}${prop}`] = object[prop] } } - }) + } } static getObjectFromElement (object, element) { @@ -175,10 +185,10 @@ export class chatHelper { } if (!element || !object) return - Object.keys(element.dataset).forEach(prop => { + for (const prop of Object.keys(element.dataset)) { if (prop === 'template') return deserialize(object, prop, element.dataset[prop]) - }) + } } static getTokenFromKey (key) { @@ -240,12 +250,38 @@ export class chatHelper { if (game.settings.get('CoC7', 'useToken')) { // Try to find a token. const token = chatHelper.getTokenFromKey(actorKey) - if (token) return token.data.img + if (token) { + // Foundry VTT v9 + if (token.data.img) { + if (token.data.img.indexOf('*') === -1) { + return token.data.img + } + } + // Foundry VTT v10 + if (token.data.texture.src) { + if (token.data.texture.src.indexOf('*') === -1) { + return token.data.texture.src + } + } + } } const actor = chatHelper.getActorFromKey(actorKey) // REFACTORING (2) if (game.settings.get('CoC7', 'useToken')) { // if no token found for that actor return the prototype token image. - if (actor.data.token) return actor.data.token.img + if (actor.data.token) { + // Foundry VTT v9 + if (actor.data.token.img) { + if (actor.data.token.img.indexOf('*') === -1) { + return actor.data.token.img + } + } + // Foundry VTT v10 + if (actor.data.token.texture.src) { + if (actor.data.token.texture.src?.indexOf('*') === -1) { + return actor.data.token.texture.src + } + } + } } return actor.data.img } @@ -253,6 +289,22 @@ export class chatHelper { static getDistance (startToken, endToken) { // startToken.updateSource(); // canvas.sight.initializeTokens(); + if ( + typeof endToken.center === 'undefined' && + typeof endToken.data.document?.id !== 'undefined' + ) { + if (startToken.scene?.id || false) { + const scene = game.scenes.get(startToken.scene.id) + if (typeof scene?.tokens !== 'undefined') { + const tokens = scene?.tokens + .filter(token => token.actor.id === endToken.data.document.id) + .map(token => token.object) + if (tokens.length === 1) { + endToken = tokens[0] + } + } + } + } let distance = { gridUnit: 0, value: 0, @@ -274,6 +326,18 @@ export class chatHelper { })[0], unit: canvas.scene.data.gridUnits } + if (game.settings.get('CoC7', 'distanceElevation')) { + const elevation = Math.abs( + (startToken.data.elevation || 0) - (endToken.data.elevation || 0) + ) + distance.value = Math.sqrt( + distance.value * distance.value + elevation * elevation + ) + } + } else { + ui.notifications.warn( + game.i18n.localize('CoC7.MessageDistanceCalculationFailure') + ) } return distance } @@ -345,9 +409,9 @@ export class CoC7Roll { showDiceRoll () { if (game.modules.get('dice-so-nice')?.active) { const diceResults = [] - this.dices.tens.forEach(dieResult => { + for (const dieResult of this.dices.tens) { diceResults.push(dieResult.value === 100 ? 0 : dieResult.value / 10) - }) + } diceResults.push(this.dices.unit.value) const diceData = { @@ -380,7 +444,7 @@ export class CoC7Roll { : game.i18n.format('CoC7.DiceModifierBonus') const tenDice = element.querySelector('.ten-dice') if (tenDice) { - tenDice.querySelectorAll('li').forEach(d => { + for (const d of tenDice.querySelectorAll('li')) { const die = { selected: false, isMax: false, @@ -389,7 +453,7 @@ export class CoC7Roll { } chatHelper.getObjectFromElement(die, d) roll.dices.tens.push(die) - }) + } } const unitDie = element.querySelector('.unit-die') ? element.querySelector('.unit-die').querySelector('li') @@ -399,11 +463,11 @@ export class CoC7Roll { roll.increaseSuccess = [] const increaseSuccess = element.querySelector('.increase-success') if (increaseSuccess && increaseSuccess.querySelectorAll('button')) { - increaseSuccess.querySelectorAll('button').forEach(isl => { + for (const isl of increaseSuccess.querySelectorAll('button')) { const newSuccesLevel = {} chatHelper.getObjectFromElement(newSuccesLevel, isl) roll.increaseSuccess.push(newSuccesLevel) - }) + } } if (roll.luckNeeded) { @@ -475,11 +539,11 @@ export class CoC7Damage { chatHelper.getObjectFromElement(damage, element) const rolls = element.querySelector('.dice-rolls').querySelectorAll('li') damage.rolls = [] - rolls.forEach(r => { + for (const r of rolls) { const roll = {} chatHelper.getObjectFromElement(roll, r) damage.rolls.push(roll) - }) + } if (!object) return damage } diff --git a/module/chat/interactive-chat-card.js b/module/chat/interactive-chat-card.js index 59d2c5ae..f064b26e 100644 --- a/module/chat/interactive-chat-card.js +++ b/module/chat/interactive-chat-card.js @@ -87,6 +87,7 @@ export class InteractiveChatCard { const htmlMessageElement = html[0] const htmlCardElement = htmlMessageElement.querySelector('.chat-card') if (!htmlCardElement) return + if (!htmlCardElement.dataset.cardClass) return if ( !Object.getOwnPropertyNames(game.CoC7.cards).includes( htmlCardElement.dataset.cardClass @@ -118,7 +119,7 @@ export class InteractiveChatCard { const button = event.currentTarget // button.style.display = 'none' //Avoid multiple push const action = button.dataset.action - if (this[action]) this[action]({ event: event, update: true }) + if (this[action]) this[action]({ event, update: true }) } /** @@ -159,7 +160,7 @@ export class InteractiveChatCard { get message () { if (this._message) return this._message - if (this._messageId) return game.message.get(this._messageId) + if (this._messageId) return game.messages.get(this._messageId) return undefined } @@ -273,7 +274,9 @@ export class InteractiveChatCard { this.toggleFlag(flag) } else { const buttons = toggle.querySelectorAll('.ic-radio-switch') - buttons.forEach(b => this.unsetFlag(b.dataset.flag)) + for (const b of buttons) { + this.unsetFlag(b.dataset.flag) + } this.setFlag(flag) } const card = target.closest('.interactive-card') diff --git a/module/chat/rangecombat.js b/module/chat/rangecombat.js index 0aba8d20..84b7bc78 100644 --- a/module/chat/rangecombat.js +++ b/module/chat/rangecombat.js @@ -3,7 +3,6 @@ import { CoC7Dice } from '../dice.js' import { CoC7Check } from '../check.js' import { chatHelper, CoC7Roll, CoC7Damage } from './helper.js' -// import { CoC7Chat } from '../chat.js'; export class CoC7RangeInitiator { constructor (actorKey = null, itemId = null, fastForward = false) { @@ -27,11 +26,11 @@ export class CoC7RangeInitiator { this.aimed = false this.totalBulletsFired = 0 this._targets = [] - ;[...game.user.targets].forEach(t => { + for (const t of [...game.user.targets]) { const target = new CoC7RangeTarget(`${t.scene.id}.${t.id}`) // target.token = t this._targets.push(target) - }) + } if (this._targets.length) this._targets[0].active = true else { const target = new CoC7RangeTarget() @@ -51,7 +50,7 @@ export class CoC7RangeInitiator { } } if (this.tokenKey) { - this._targets.forEach(t => { + for (const t of this._targets) { if (t.token && this.token) { t.distance = chatHelper.getDistance(t.token, this.token) t.roundedDistance = Math.round(t.distance.value * 100) / 100 @@ -111,7 +110,7 @@ export class CoC7RangeInitiator { } // } } else t.baseRange = true - }) + } } } @@ -201,9 +200,9 @@ export class CoC7RangeInitiator { get didAnyShotHit () { let anyHit = false - this.rolls.forEach(r => { + for (const r of this.rolls) { anyHit = anyHit || r.isSuccess - }) + } return anyHit } @@ -294,9 +293,9 @@ export class CoC7RangeInitiator { } calcTargetsDifficulty () { - this.targets.forEach(t => { + for (const t of this.targets) { t.shotDifficulty = this.shotDifficulty(t) - }) + } } shotDifficulty (t = null) { @@ -344,8 +343,8 @@ export class CoC7RangeInitiator { return { level: difficulty, name: difficultyName, - modifier: modifier, - damage: damage, + modifier, + damage, impossible: difficulty === CoC7Check.difficultyLevel.impossible } } @@ -662,18 +661,18 @@ export class CoC7RangeInitiator { chatHelper.getObjectFromElement(rangeInitiator, card) const cardTargets = card.querySelectorAll('.target') - cardTargets.forEach(t => { + for (const t of cardTargets) { const target = CoC7RangeTarget.getFromElement(t) rangeInitiator.targets.push(target) - }) + } const cardShots = card.querySelectorAll('.shot') if (cardShots) { - cardShots.forEach(s => { + for (const s of cardShots) { const shot = {} chatHelper.getObjectFromElement(shot, s) rangeInitiator.shots.push(shot) - }) + } } // else { // const shot = { @@ -685,17 +684,17 @@ export class CoC7RangeInitiator { rangeInitiator.rolls = [] const rolls = card.querySelectorAll('.roll-result') - rolls.forEach(r => { + for (const r of rolls) { const roll = CoC7Roll.getFromElement(r) rangeInitiator.rolls.push(roll) - }) + } rangeInitiator.damage = [] const damageRolls = card.querySelectorAll('.damage-results') - damageRolls.forEach(dr => { + for (const dr of damageRolls) { const damageRoll = CoC7Damage.getFromElement(dr) rangeInitiator.damage.push(damageRoll) - }) + } return rangeInitiator } @@ -715,85 +714,88 @@ export class CoC7RangeInitiator { const volleySize = parseInt(h.shot.bulletsShot) const damageRolls = [] - const damageFormula = h.shot.damage - const damageDie = CoC7Damage.getMainDie(damageFormula) - const maxDamage = new Roll(damageFormula).evaluate({ - maximize: true - }).total - const criticalDamageFormula = this.weapon.impale - ? `${damageFormula} + ${maxDamage}` - : `${maxDamage}` - const criticalDamageDie = CoC7Damage.getMainDie(criticalDamageFormula) - - let impalingShots = 0 - let successfulShots = 0 - let critical = false - if (this.fullAuto || this.burst) { - successfulShots = Math.floor(volleySize / 2) - } - if (successfulShots === 0) successfulShots = 1 - if (h.roll.successLevel >= CoC7Check.difficultyLevel.extreme) { - impalingShots = successfulShots - successfulShots = volleySize - impalingShots - critical = true - if ( - CoC7Check.difficultyLevel.critical !== h.roll.successLevel && - (CoC7Check.difficultyLevel.extreme <= h.roll.difficulty || - h.shot.extremeRange) - ) { - successfulShots = volleySize - impalingShots = 0 - critical = false + if (volleySize > 0) { + let damageFormula = String(h.shot.damage) + if (!damageFormula || damageFormula === '') damageFormula = '0' + const damageDie = CoC7Damage.getMainDie(damageFormula) + const maxDamage = new Roll(damageFormula).evaluate({ + maximize: true + }).total + const criticalDamageFormula = this.weapon.impale + ? `${damageFormula} + ${maxDamage}` + : `${maxDamage}` + const criticalDamageDie = CoC7Damage.getMainDie(criticalDamageFormula) + + let impalingShots = 0 + let successfulShots = 0 + let critical = false + if (this.fullAuto || this.burst) { + successfulShots = Math.floor(volleySize / 2) + } + if (successfulShots === 0) successfulShots = 1 + if (h.roll.successLevel >= CoC7Check.difficultyLevel.extreme) { + impalingShots = successfulShots + successfulShots = volleySize - impalingShots + critical = true + if ( + CoC7Check.difficultyLevel.critical !== h.roll.successLevel && + (CoC7Check.difficultyLevel.extreme <= h.roll.difficulty || + h.shot.extremeRange) + ) { + successfulShots = volleySize + impalingShots = 0 + critical = false + } } - } - let total = 0 - for (let index = 0; index < successfulShots; index++) { - const roll = new Roll(damageFormula) - /** MODIF 0.8.x **/ - await roll.evaluate({ async: true }) - await CoC7Dice.showRollDice3d(roll) - /*****************/ - damageRolls.push({ - formula: damageFormula, - total: roll.total, - die: damageDie, - critical: false - }) - total += roll.total - } - for (let index = 0; index < impalingShots; index++) { - const roll = new Roll(criticalDamageFormula) - /** MODIF 0.8.x **/ - await roll.evaluate({ async: true }) - await CoC7Dice.showRollDice3d(roll) - /*****************/ - damageRolls.push({ - formula: criticalDamageFormula, - total: roll.total, - die: criticalDamageDie, - critical: true - }) - total += roll.total - } + let total = 0 + for (let index = 0; index < successfulShots; index++) { + const roll = new Roll(damageFormula) + /** MODIF 0.8.x **/ + await roll.evaluate({ async: true }) + await CoC7Dice.showRollDice3d(roll) + /*****************/ + damageRolls.push({ + formula: damageFormula, + total: roll.total, + die: damageDie, + critical: false + }) + total += roll.total + } + for (let index = 0; index < impalingShots; index++) { + const roll = new Roll(criticalDamageFormula) + /** MODIF 0.8.x **/ + await roll.evaluate({ async: true }) + await CoC7Dice.showRollDice3d(roll) + /*****************/ + damageRolls.push({ + formula: criticalDamageFormula, + total: roll.total, + die: criticalDamageDie, + critical: true + }) + total += roll.total + } - let targetName = 'dummy' - let target = chatHelper.getTokenFromKey(h.roll.targetKey) - if (!target) target = chatHelper.getActorFromKey(h.roll.targetKey) // REFACTORING (2) - if (target) targetName = target.name - - this.damage.push({ - targetKey: h.roll.targetKey, - targetName: targetName, - rolls: damageRolls, - total: total, - critical: critical, - dealt: false, - resultString: game.i18n.format('CoC7.rangeCombatDamage', { - name: targetName, - total: total + let targetName = 'dummy' + let target = chatHelper.getTokenFromKey(h.roll.targetKey) + if (!target) target = chatHelper.getActorFromKey(h.roll.targetKey) // REFACTORING (2) + if (target) targetName = target.name + + this.damage.push({ + targetKey: h.roll.targetKey, + targetName, + rolls: damageRolls, + total, + critical, + dealt: false, + resultString: game.i18n.format('CoC7.rangeCombatDamage', { + name: targetName, + total + }) }) - }) + } } this.damageRolled = this.damage.length !== 0 @@ -915,7 +917,16 @@ export class CoC7RangeTarget { } get img () { - if (this.token) return this.token.data.img + if (this.token) { + // Foundry VTT v9 + if (this.token.data.img) { + return this.token.data.img + } + // Foundry VTT v10 + if (this.token.document?.texture.src) { + return this.token.document?.texture.src + } + } if (this.actor) return this.actor.data.img return '../icons/svg/mystery-man-black.svg' } diff --git a/module/chat/sancheck.js b/module/chat/sancheck.js index ed1f6b0d..08ed5af8 100644 --- a/module/chat/sancheck.js +++ b/module/chat/sancheck.js @@ -87,9 +87,7 @@ export class CoC7SanCheck { get isSanLossFormula () { if (this.sanLossFormula) { - if (this.sanLossFormula.match(Roll.diceRgx)) return true - // const rgx = RegExp( Die.rgx.dice); - // return rgx.test(this.sanLossFormula); + return Roll.validate(this.sanLossFormula) } return false } @@ -102,7 +100,7 @@ export class CoC7SanCheck { static checkTargets (sanMin, sanMax, fastForward = false, tokenKey = null) { const targets = [...game.user.targets] if (targets.length) { - targets.forEach(t => { + for (const t of targets) { let check if (t.actor.isToken) { check = new CoC7SanCheck(t.actor.tokenKey, sanMin, sanMax) @@ -110,19 +108,19 @@ export class CoC7SanCheck { check = new CoC7SanCheck(t.actor.id, sanMin, sanMax) } check.toMessage(fastForward) - }) + } } else { if (tokenKey) { const speaker = chatHelper.getSpeakerFromKey(tokenKey) const title = game.i18n.format('CoC7.SANCheckTitle', { name: speaker.alias, - sanMin: sanMin, - sanMax: sanMax + sanMin, + sanMax }) chatHelper.createMessage( null, `@coc7.sanloss[sanMax:${sanMax},sanMin:${sanMin}]{${title}}`, - { speaker: speaker } + { speaker } ) } else ui.notifications.error('No target selected') } @@ -178,7 +176,7 @@ export class CoC7SanCheck { const chatData = { user: user.id, - speaker: speaker, + speaker, flavor: this.flavor, content: htmlElement.outerHTML } diff --git a/module/check.js b/module/check.js index 337bd178..011f1655 100644 --- a/module/check.js +++ b/module/check.js @@ -63,6 +63,16 @@ export class CoC7Check { } } + static get type () { + return { + characteristic: 'characteristic', + attribute: 'attribute', + skill: 'item', + item: 'item', + value: 'value' + } + } + static difficultyString (difficultyLevel) { switch ( !isNaN(Number(difficultyLevel)) @@ -98,9 +108,8 @@ export class CoC7Check { // if (!this.actor || !this.actor.id) return undefined if (!this._rawValue) { if (this.characteristic) { - this.rawValue = this.actor.data.data.characteristics[ - this.characteristic - ].value + this.rawValue = + this.actor.data.data.characteristics[this.characteristic].value } if (this.skill) this.rawValue = this.skill.value if (this.attribute) { @@ -182,7 +191,16 @@ export class CoC7Check { } get fumbleThreshold () { - if (this.rawValue) return this.rawValue < 50 ? 96 : 100 + if (this.rawValue) { + if (this.difficulty) { + if (this.difficulty >= CoC7Check.difficultyLevel.extreme) { + return this.extremeThreshold < 50 ? 96 : 100 + } else if (this.difficulty >= CoC7Check.difficultyLevel.hard) { + return this.hardThreshold < 50 ? 96 : 100 + } + } + return this.rawValue < 50 ? 96 : 100 + } return null } @@ -307,7 +325,7 @@ export class CoC7Check { get name () { if (this.actor) { - if (this.skill) return this.skill.name + if (this.skill) return this.skill.shortName if (this.item) return this.item.name if (this.characteristic) { return CoC7Utilities.getCharacteristicNames(this.characteristic)?.label @@ -320,9 +338,9 @@ export class CoC7Check { return null } - get sName () { + get shortName () { if (this.actor) { - if (this.skill) return this.skill.sName + if (this.skill) return this.skill.shortName if (this.item) return this.item.name if (this.characteristic) { return CoC7Utilities.getCharacteristicNames(this.characteristic)?.short @@ -348,7 +366,7 @@ export class CoC7Check { `CoC7.LinkCheck${!difficulty ? '' : 'Diff'}${ !this._diceModifier ? '' : 'Modif' }`, - { difficulty: difficulty, modifier: modifier, name: this.name } + { difficulty, modifier, name: this.name } ) } @@ -466,7 +484,7 @@ export class CoC7Check { success: true, cssClass: this.isCritical ? 'critical' : 'success', hint: successHint, - icons: icons + icons } } else { const icons = [] @@ -481,7 +499,7 @@ export class CoC7Check { success: false, cssClass: this.isFumble ? 'fumble' : 'failure', hint: failureHint, - icons: icons + icons } } } @@ -635,7 +653,7 @@ export class CoC7Check { !this._diceModifier ? '' : 'Modif' }`, { - difficulty: difficulty, + difficulty, modifier: this._diceModifier, name: this.name } @@ -651,10 +669,58 @@ export class CoC7Check { return a } - async roll (diceMod = null, difficulty = null) { + async roll (diceMod = null, difficulty = null, options = {}) { if (diceMod) this.diceModifier = diceMod if (difficulty) this.difficulty = difficulty - if (!this.standby) await this._perform() + if (!this.standby) await this._perform(options) + } + + /** + * Create a check with the provided data + * Process roll data to a format that can be fed to create() + * @param {*} rollData A roll data structure as returned by actor.find + * @returns A check with the roll data provided + */ + static createFromActorRollData (rollData) { + const roll = {} + // check Modifier + if (rollData.difficulty) roll.difficulty = rollData.difficulty + if (rollData.diceModifier) roll.diceModifier = rollData.diceModifier + if (rollData.denyPush === true) roll.denyPush = true + if (rollData.flatDiceModifier) { + roll.flatDiceModifier = rollData.flatDiceModifier + } + if (rollData.flatThresholdModifier) { + roll.flatThresholdModifier = rollData.flatThresholdModifier + } + // Actor + if (rollData.actor?.actorKey) roll.actorKey = rollData.actor.actorKey + else if (rollData.actor?.name) roll.actorName = rollData.actor.name + // Check type + switch (rollData.type) { + case CoC7Check.type.characteristic: + roll.characteristic = rollData.value?.key + break + case CoC7Check.type.attribute: + roll.attribute = rollData.value?.key + break + case CoC7Check.type.item: + roll.actorKey = rollData.value.actor.actorKey + if (rollData.value?.type === 'skill') roll.skill = rollData.value.id + else roll.item = rollData.value.id + break + case CoC7Check.type.skill: + roll.actorKey = rollData.value.actor.actorKey + roll.skill = rollData.value.id + break + case CoC7Check.type.value: + roll.displayName = rollData.value.name + roll.rawValue = rollData.value.threshold + break + default: + break + } + return CoC7Check.create(roll) } static create ({ @@ -664,14 +730,17 @@ export class CoC7Check { characteristic = null, attribute = null, rawValue = 0, + item = null, skill = null, flatDiceModifier = 0, flatThresholdModifier = 0, displayName = null, - actorName = null + actorName = null, + denyPush = undefined } = {}) { const check = new CoC7Check() check.difficulty = difficulty + if (denyPush === true) check.denyPush = true if (diceModifier) check.diceModifier = diceModifier if (flatDiceModifier) check.flatDiceModifier = flatDiceModifier if (flatThresholdModifier) { @@ -687,6 +756,7 @@ export class CoC7Check { // TODO : try retrieve skill by name else if (characteristic) check.characteristic = characteristic else if (attribute) check.attribute = attribute + else if (item) check.item = item } return check } @@ -712,11 +782,21 @@ export class CoC7Check { if (!this.standby) await this._perform() } + get rolledSuccessLevel () { + return this.successLevel + } + async _perform (options = {}) { this.dice = options.roll || (await CoC7Dice.roll(this.diceModifier, this.rollMode, this.isBlind)) - if (!options.silent) AudioHelper.play({ src: CONFIG.sounds.dice }) + if (!options.silent) { + AudioHelper.play({ src: CONFIG.sounds.dice }, true) + } + + if (options.forceDSN) { + await CoC7Dice.showRollDice3d(this.dice.roll) + } this.dices = { tens: [], @@ -792,9 +872,8 @@ export class CoC7Check { } else { if (this.characteristic) { this.isCharactiristic = true - this.rawValue = this.actor.data.data.characteristics[ - this.characteristic - ].value + this.rawValue = + this.actor.data.data.characteristics[this.characteristic].value } if (this.skill) { @@ -887,10 +966,12 @@ export class CoC7Check { } } - this.canBePushed = this.skill ? this.skill.canBePushed() : false - if (this.characteristic != null) this.canBePushed = true - if (this.isFumble) this.canBePushed = false - if (this.denyPush) this.canBePushed = false + if (typeof this.canBePushed === 'undefined') { + this.canBePushed = this.skill ? this.skill.canBePushed() : false + if (this.characteristic != null) this.canBePushed = true + if (this.isFumble) this.canBePushed = false + if (this.denyPush) this.canBePushed = false + } if (!this.denyLuck && this.actor) { if ( @@ -1001,9 +1082,9 @@ export class CoC7Check { showDiceRoll () { if (game.modules.get('dice-so-nice')?.active) { const diceResults = [] - this.dices.tens.forEach(dieResult => { + for (const dieResult of this.dices.tens) { diceResults.push(dieResult.value === 100 ? 0 : dieResult.value / 10) - }) + } diceResults.push(this.dices.unit.value) const diceData = { @@ -1088,9 +1169,9 @@ export class CoC7Check { for (let index = 0; index < upgradeindex + 1; index++) { this.increaseSuccess.shift() } - this.increaseSuccess.forEach(s => { + for (const s of this.increaseSuccess) { s.luckToSpend = s.luckToSpend - luckAmount - }) + } this.luckSpent = true this.computeCheck() if (update) return await this.updateChatCard() @@ -1108,11 +1189,12 @@ export class CoC7Check { if (luckAmount) { this.actor.spendLuck(luckAmount) this.successLevel = this.difficulty - this.increaseSuccess.forEach(s => { + for (const s of this.increaseSuccess) { s.luckToSpend = s.luckToSpend - luckAmount - }) + } this.luckSpent = true this.isSuccess = true + this.isFailure = false this.totalLuckSpent = !parseInt(this.totalLuckSpent) ? 0 : parseInt(this.totalLuckSpent) @@ -1495,13 +1577,14 @@ export class CoC7Check { const speakerData = {} let speaker if (this.actor) { - if (this.actor.isToken) speakerData.token = this.token.document - else if (this.actor.isDummy) { + if (this.actor.isToken) { + speakerData.token = this.token.document + } else if (this.actor.isDummy) { if (this.actor.name) speaker = { alias: this.actor.name } } else { speakerData.actor = this.actor - speaker = ChatMessage.getSpeaker(speakerData) } + speaker = ChatMessage.getSpeaker(speakerData) } else { speaker = ChatMessage.getSpeaker() } @@ -1510,7 +1593,7 @@ export class CoC7Check { const chatData = { user: user.id, - speaker: speaker, + speaker, flavor: this.flavor, content: html, flags: { @@ -1529,10 +1612,12 @@ export class CoC7Check { chatData.flavor = `[${this.actor.name}] ${chatData.flavor}` chatData.flags = { CoC7: { - GMSelfRoll: true, - originalSpeaker: duplicate(chatData.speaker) + GMSelfRoll: true } } + if (typeof chatData.speaker !== 'undefined') { + chatData.flags.CoC7.originalSpeaker = duplicate(chatData.speaker) + } if (game.user.isGM) { switch (game.settings.get('CoC7', 'selfRollWhisperTarget')) { case 'owners': @@ -1578,6 +1663,23 @@ export class CoC7Check { */ async updateChatCard ({ makePublic = false, forceRoll = false } = {}) { if (makePublic) this.rollMode = false // reset roll mode + + const chatData = { flavor: this.flavor } + + if (makePublic) { + chatData.whisper = [] + chatData.blind = false + ChatMessage.applyRollMode(chatData) + } // else { + // chatData.whisper = [] + // chatData.blind = false + // ChatMessage.applyRollMode(chatData, game.settings.get('core', 'rollMode')) + // } + + if (chatData.blind) { + this.isBlind = true + } + const template = 'systems/CoC7/templates/chat/roll-result.html' const html = await renderTemplate(template, this) let newContent = html @@ -1596,21 +1698,15 @@ export class CoC7Check { newContent = htmlMessage.outerHTML } - const chatData = { flavor: this.flavor, content: newContent } + chatData.content = newContent + if (CONST.CHAT_MESSAGE_TYPES.ROLL === message.data.type) { if (message.data.whisper?.length) { chatData.type = CONST.CHAT_MESSAGE_TYPES.WHISPER } else chatData.type = CONST.CHAT_MESSAGE_TYPES.OTHER } - if (makePublic) { - chatData.whisper = [] - chatData.blind = false - } - - ChatMessage.applyRollMode(chatData) - - if (forceRoll && this.dice?.roll) { + if (forceRoll && this.dice?.roll && (game.user.isGM || !this.isBlind)) { await CoC7Dice.showRollDice3d(this.dice.roll) } @@ -1665,8 +1761,9 @@ export class CoC7Check { a.classList.add(...this.cssClassList) a.title = this.tooltipHeader a.dataset.roll = escape(this.JSONRollString) // TODO!IMPORTANT!!! - a.innerHTML = ` ${this - .modifiedResult || '??'}` + a.innerHTML = ` ${ + this.modifiedResult || '??' + }` return a } diff --git a/module/coc7.js b/module/coc7.js index f24c4bf8..24e36356 100644 --- a/module/coc7.js +++ b/module/coc7.js @@ -1,7 +1,7 @@ -/* global $, Combat, CONFIG, CONST, fromUuid, game, Hooks, tinyMCE, ui */ +/* global $, Combat, CONFIG, CONST, game, Hooks, isNewerVersion, ItemDirectory, tinyMCE */ import { CoC7NPCSheet } from './actors/sheets/npc-sheet.js' import { CoC7CreatureSheet } from './actors/sheets/creature-sheet.js' -import { CoC7CharacterSheetV2 } from './actors/sheets/character.js' +import { CoC7CharacterSheet } from './actors/sheets/character.js' import { CoC7Chat } from './chat.js' import { CoC7Combat, rollInitiative } from './combat.js' import { COC7 } from './config.js' @@ -10,27 +10,27 @@ import { CoC7Utilities } from './utilities.js' import { CoC7Parser } from './apps/parser.js' import { CoC7Check } from './check.js' import { CoC7Menu } from './menu.js' -import { OpposedCheckCard } from './chat/cards/opposed-roll.js' -import { CombinedCheckCard } from './chat/cards/combined-roll.js' import { DamageCard } from './chat/cards/damage.js' import { CoC7Canvas } from './apps/canvas.js' +import { CoC7SettingsDirectory } from './settings-directory.js' import { CoC7CompendiumDirectory } from './compendium-directory.js' +import { CoC7ActorDirectory } from './actor-directory.js' import { CoC7Hooks } from './hooks/index.js' import * as DiceBot from './dicebot.js' import '../styles/system/index.less' +import { CoC7ChaseSheet } from './items/chase/sheet.js' +import { CoC7Socket } from './hooks/socket.js' +import { CoC7SystemSocket } from './apps/coc7-system-socket.js' +import { DropActorSheetData } from './hooks/drop-actor-sheet-data.js' + +// Card init +import { initECC } from './common/chatcardlib/src/chatcardlib.js' +import { ChaseObstacleCard } from './chat/cards/chase-obstacle.js' Hooks.on('renderSettingsConfig', (app, html, options) => { const systemTab = $(app.form).find('.tab[data-tab=system]') systemTab - .find('input[name=CoC7\\.pulpRules]') - .closest('div.form-group') - .before( - '${game.i18n.format('CoC7.RemoveParticipantHint', { + name: p.name + })}
`, + yes: async () => { + const participantsData = foundry.utils.duplicate( + this.data.data.participants + ) + const newParticipantsData = participantsData.filter( + p => participantUuid !== p.uuid + ) + const locationsData = foundry.utils.duplicate( + this.data.data.locations.list + ) + locationsData.forEach(l => { + if (l.participants && l.participants.length) { + l.participants = l.participants.filter( + uuid => participantUuid !== uuid + ) + } + }) + await this.updateParticipants(newParticipantsData, { render: false }) + await this.updateLocationsList(locationsData, { render }) + } + }) + } + + async addParticipant ( + participant, + { + render = true, + locationUuid = null, + recalculateMovementActions = true, + update = false + } = {} + ) { + const participantsData = this.data.data.participants + ? foundry.utils.duplicate(this.data.data.participants) + : [] + + if (participant.data.chaseUuid) delete participant.data.chaseUuid + if (participant.data.locationUuid) delete participant.data.locationUuid + if (participant.data.update) delete participant.data.update + + if (!participant.uuid) { + let unique = false + while (!unique) { + participant.data.uuid = foundry.utils.randomID(16) + unique = + participantsData.filter(p => p.uuid === participant.uuid).length === 0 + } + } + + if (update) { + if (participant.currentMovementActions > participant.movementAction) { + participant.currentMovementActions = participant.movementAction + } + const index = participantsData.findIndex(p => p.uuid === participant.uuid) + participantsData[index] = participant.data + } else participantsData.push(participant.data) + + await this.updateParticipants(participantsData, { + render: render && !this.started && !this.recalculateMovementActions + }) + + if (recalculateMovementActions || update) { + const slowest = this.slowestParticipant?.adjustedMov + const participants = this.participants + participants.forEach(p => p.calculateMovementActions(slowest)) + await this.updateParticipants(participants, { + render: render && !this.started + }) + } + + if ( + this.started && + !(participant.data.escaped || participant.data.excluded) + ) { + const locationsData = this.data.data.locations.list + ? foundry.utils.duplicate(this.data.data.locations.list) + : [] + + if (locationsData.length === 0) { + ui.notifications.error( + game.i18n.localize('CoC7.ErrorEmptyLocationsList') + ) + } + + let locationIndex = locationsData.findIndex(l => locationUuid === l.uuid) + if (locationIndex === -1) locationIndex = 0 + if (!locationsData[locationIndex].participants) { + locationsData[locationIndex].participants = [] + } + if ( + locationsData[locationIndex].participants.findIndex( + p => p === participant.uuid + ) === -1 + ) { + locationsData[locationIndex].participants.push(participant.uuid) + } + await this.updateLocationsList(locationsData, { render }) + } + } + + async editParticipant ( + participantUuid, + { + useMovementActions = true, + scrollToLocation = true, + activateLocation = true, + activateParticipant = true, + render = true + } = {} + ) {} + + /** + * Move a participant for a number of locations. + * @param {string|null} participantUuid Uuid of participant + * @param {*} locationMoved Number of locations movred + * @returns {number} Total number of locations crossed + */ + async moveParticipant ( + participantUuid, + locationMoved, + { + useMovementActions = true, + scrollToLocation = true, + activateLocation = true, + activateParticipant = true, + render = true + } = {} + ) { + // const selector = `#item-${this.id} .chase-track` + // ui.notifications.info( `moveParticipant : Jquery root: ${$(':root').find(selector).scrollLeft()}`) + let modified = false + const locations = foundry.utils.duplicate(this.data.data.locations.list) + const originIndex = locations.findIndex(l => + l.participants?.includes(participantUuid) + ) + let destinationIndex = originIndex + locationMoved + if (destinationIndex > locations.length - 1) { + destinationIndex = locations.length - 1 + } + + if (destinationIndex < 0) { + destinationIndex = 0 + } + + const totalMove = destinationIndex - originIndex + const participant = this.getParticipant(participantUuid) + const participantsData = foundry.utils.duplicate( + this.data.data.participants + ) + const participantIndex = participantsData.findIndex( + p => participantUuid === p.uuid + ) + + if (useMovementActions) { + if (!participant) { + ui.notifications.error( + game.i18n.format('CoC7.ParticipantUuidNotFound', { + participantUuid: this.participantUuid + }) + ) + return undefined + } + if (participant.currentMovementActions < Math.abs(totalMove)) { + ui.notifications.error( + game.i18n.format('CoC7.ParticipantNotEnoughMovement', { + assistantUuid: participantUuid, + actions: participant.currentMovementActions + }) + ) + return undefined + } + participant.alterMovementActions(0 - Math.abs(totalMove)) + participantsData[participantIndex] = foundry.utils.duplicate( + participant.data + ) + await this.update( + { 'data.participants': participantsData }, + { render: false } + ) + modified = true + } + + if (totalMove !== 0) { + await this.moveParticipantToLocation( + participantUuid, + locations[destinationIndex].uuid, + { render: false } + ) + modified = true + } + + if (activateParticipant) { + await this.activateParticipant(participantUuid, { + scrollToLocation, + activateLocation, + render: false + }) + modified = true + } + + if (activateLocation && !activateParticipant) { + await this.activateLocation(locations[destinationIndex].uuid, { + scrollToLocation, + render: false + }) + modified = true + } + + if (modified && render) await this.sheet.render(true) + return totalMove + } + + async moveParticipantToLocation ( + participantUuid, + locationUuid, + { + scrollToLocation = true, + activateLocation = true, + animate = null, + moveToken = true, + render = true + } = {} + ) { + const locations = foundry.utils.duplicate(this.data.data.locations.list) + + // Find destination location. + const destination = locations.find(l => locationUuid === l.uuid) + if (!destination) { + console.error( + `Failed to move ${participantUuid}. Location ${locationUuid} unknown` + ) + return + } + + // Find origin location + const origin = locations.find(l => + l.participants?.includes(participantUuid) + ) + + if (!origin) { + console.error(`Failed to find ${participantUuid} in locations`) + return + } + + if (!destination.participants) destination.participants = [] + if (destination.participants.includes(participantUuid)) return // moving particpant to a location he already occupies + destination.participants.push(participantUuid) + // destination.participants.sort(sortByRoleAndDex) + + const oldParticipantsList = origin.participants.filter( + p => participantUuid !== p + ) + origin.participants = oldParticipantsList + + if (moveToken && destination.coordinates) { + const participant = this.getParticipant(participantUuid) + const particpantDocument = CoC7Utilities.getDocumentFromKey( + participant?.data?.docUuid + ) + if ( + particpantDocument && + !( + /* particpantDocument.isToken || */ ( + particpantDocument instanceof TokenDocument || + particpantDocument?.object instanceof Token + ) + ) + ) { + console.warn('No token associated with this actor') + } else { + if (destination.coordinates.scene !== game.scenes.viewed.uuid) { + console.warn('Caution the scene is not the active scene') + } + if (particpantDocument.parent?.uuid !== destination.coordinates.scene) { + ui.notifications.error( + game.i18n.localize('CoC7.ErrorTokenNotOnScene') + ) + } else { + const scene = CoC7Utilities.getDocumentFromKey( + destination.coordinates.scene + ) + let x = destination.coordinates.x + const y = destination.coordinates.y + let targetRect = new NormalizedRectangle( + x, + y, + particpantDocument.object.width, + particpantDocument.object.height + ) + const update = [] + let foundFreeSpace = false + while (!foundFreeSpace) { + const overlapingToken = scene.tokens.find(t => { + if (t.id === particpantDocument.id) return false // You can't overlap with yourself + return t.object.bounds.intersects(targetRect) + }) + if (overlapingToken) { + x = overlapingToken.object.bounds.right + 1 + targetRect = new NormalizedRectangle( + x, + y, + particpantDocument.object.width, + particpantDocument.object.height + ) + } else foundFreeSpace = true + } + + update.push({ + _id: particpantDocument.id, + x, + y + }) + + // destination.participants?.forEach( pUuid =>{ + // const p = this.getParticipant(pUuid) + // const pDoc = CoC7Utilities.getDocumentFromKey( p?.data?.docUuid) + // if( pDoc instanceof TokenDocument && pDoc.object instanceof Token){ + // updates = true + // update.push({ + // _id: pDoc.id, + // x:x, + // y:y + // }) + // if( pDoc.object.width) x += pDoc.object.width + // } + // }) + const showTokenMovement = + typeof animate === 'boolean' + ? animate + : this.data.data.showTokenMovement + await particpantDocument.parent.updateEmbeddedDocuments( + 'Token', + update, + { animate: showTokenMovement } + ) + } + } + } + + await this.updateLocationsList(locations, { render }) + } + + // Handle scrolling + async setchaseTrackScroll ({ + from = undefined, + to = -1, + render = true + } = {}) { + await this.update( + { + 'data.scroll.chaseTrack.from': + undefined === from ? this.chaseTrackCurrentScrollPosition : from, + 'data.scroll.chaseTrack.to': + undefined === to ? this.chaseTrackCurrentScrollPosition : to + }, + { render } + ) + } + + get chaseTrackCurrentScrollPosition () { + const html = this.sheet?._element + if (!html) return -1 + const chaseTrack = html[0].querySelector('.chase-track') + if (!chaseTrack) return -1 + // const selector = `#item-${this.id} .chase-track` + // ui.notifications.info( `DATA : Jquery root: ${$(':root').find(selector).scrollLeft()}`) + // return $(':root').find(selector).scrollLeft() + + // ui.notifications.info( `DATA : Jquery root: ${$(':root').find('#item-VNhtqxA2wJJnWStT .chase-track').scrollLeft()}.Chase track offset: ${chaseTrack.scrollLeft}, Document offset:${document.querySelector('#item-VNhtqxA2wJJnWStT').querySelector('.chase-track').scrollLeft}`) + return chaseTrack.scrollLeft + } + + /** + * Return the offset position of the active location + * the center of the active location will be centered + * in the parent. + */ + get chaseTrackActiveLocationScrollPosition () { + if (!this.activeLocation) return -1 + return this.getChaseTrackLocationScrollPosition(this.activeLocation.uuid) + } + + getChaseTrackLocationScrollPosition (locationUuid, { html = null }) { + const htmlElement = html || this.sheet?._element + if (!htmlElement || !htmlElement[0]) return -1 + const chaseTrack = htmlElement[0].querySelector('.chase-track') + if (!chaseTrack) return -1 + const activeLocationElement = chaseTrack.querySelector( + `.chase-location[data-uuid="${locationUuid}"]` + ) + if (!activeLocationElement) return -1 + const leftScroll = + activeLocationElement.offsetLeft + + activeLocationElement.clientWidth / 2 - + chaseTrack.clientWidth / 2 + return leftScroll < 0 ? 0 : Math.floor(leftScroll) + } + + // Should be removed + findMinMov (list) { + if (!list?.length) return -1 + return list.reduce((prev, current) => + prev.adjustedMov < current.adjustedMov ? prev : current + ).adjustedMov + } + + findMaxMov (list) { + if (!list?.length) return -1 + return list.reduce((prev, current) => + prev.adjustedMov > current.adjustedMov ? prev : current + ).adjustedMov + } + + // Utilities + findIndex (list, uuid) { + return list.findIndex(p => p.uuid === uuid) + } + + get started () { + return this.getFlag('CoC7', 'started') + } + + async start () { + const remString = $(':root').css('font-size') + const remSize = Number(remString.replace('px', '')) + const pCount = this.actualParticipants.length + const width = Math.max((pCount * 11.2 + 3) * remSize, 40 * remSize) + this.sheet._tabs[0].active = 'setup' + this.sheet.position.width = width + await this.setFlag('CoC7', 'started', true) + await this.activateNextParticipantTurn() + } + + async stop () { + return this.unsetFlag('CoC7', 'started') + } + + generateNewUuid () { + return foundry.utils.randomID(16) + // let unique = false + // let uuid + // while (!unique) { + // uuid = foundry.utils.randomID(16) + // unique = + // 0 === this.data.data.participants.filter(p => p.uuid == uuid).length && + // 0 === this.data.data.locations.list.filter(p => p.uuid == uuid).length + // } + + // return uuid + } + + getActorSkillsAndCharacteristics (participantUuid) { + const participant = this.getParticipant(participantUuid) + if (!participant.actor) return undefined + const list = [] + CoCActor.getCharacteristicDefinition().forEach(c => + list.push( + `${game.i18n.localize('CoC7.Characteristics')} (${c.shortName})` + ) + ) + list.push( + `${game.i18n.localize('CoC7.Attribute')} (${game.i18n.localize( + 'CoC7.Luck' + )})` + ) + list.push( + `${game.i18n.localize('CoC7.Attribute')} (${game.i18n.localize( + 'CoC7.SAN' + )})` + ) + participant.actor.skills.forEach(s => list.push(s.name)) + return list + } + + get activeActorSkillsAndCharacteristics () { + const particicpantData = this.activeParticipantData + if (!particicpantData) return undefined + return this.getActorSkillsAndCharacteristics(particicpantData.uuid) + } + + get allSkillsAndCharacteristics () { + const list = [] + CoCActor.getCharacteristicDefinition().forEach(c => + list.push( + `${game.i18n.localize('CoC7.Characteristics')} (${c.shortName})` + ) + ) + list.push( + `${game.i18n.localize('CoC7.Attribute')} (${game.i18n.localize( + 'CoC7.Luck' + )})` + ) + list.push( + `${game.i18n.localize('CoC7.Attribute')} (${game.i18n.localize( + 'CoC7.SAN' + )})` + ) + + game.CoC7.skillList?.forEach(s => { + if ( + !list.includes(s.name) && + !s.name + .toLowerCase() + .includes(`(${game.i18n.localize('CoC7.AnySpecName')})`.toLowerCase()) + ) { + list.push(s.name) + } + }) // TODO: Remove ?? + this.participants.forEach(p => { + if (p.actor) { + p.actor.skills.forEach(s => { + if (!list.includes(s.name)) list.push(s.name) + }) + } + }) + return list.sort(Intl.Collator().compare) + } + + get allSkillsAndCharacteristicsShort () { + const list = [] + CoCActor.getCharacteristicDefinition().forEach(c => list.push(`${c.label}`)) + list.push(`${game.i18n.localize('CoC7.Luck')}`) + list.push(`${game.i18n.localize('CoC7.SAN')}`) + + game.CoC7.skillList?.forEach(s => { + if ( + !list.includes(s.name) && + !s.name + .toLowerCase() + .includes(`(${game.i18n.localize('CoC7.AnySpecName')})`.toLowerCase()) + ) { + list.push(s.name) + } + }) // TODO: Remove ?? + this.participants.forEach(p => { + if (p.actor) { + p.actor.skills.forEach(s => { + if (!list.includes(s.name)) list.push(s.name) + }) + } + }) + return list.sort(Intl.Collator().compare) + } + + /** + * Clean the data of all parasite participants in locations. + * Should never happen + */ + // async cleanLocations () { + // const locations = duplicate(this.data.data.locations.list) + // locations.forEach(l => { + // const partipantsUuidArray = this.data.data.participants.map(p => p.uuid) + // if (l.participants) { + // l.participants = l.participants.filter(uuid => + // partipantsUuidArray.includes(uuid) + // ) + // } + // }) + // this.updateLocationsList(locations) + // } +} diff --git a/module/items/chase/participant.js b/module/items/chase/participant.js new file mode 100644 index 00000000..d14880dd --- /dev/null +++ b/module/items/chase/participant.js @@ -0,0 +1,565 @@ +/* global game, ui */ +import { chatHelper } from '../../chat/helper.js' +import { CoC7Check } from '../../check.js' +import { CoC7Utilities } from '../../utilities.js' + +export class _participant { + constructor (data = {}) { + this.data = data + } + + _fetch () { + if (!this._doc && this.data.docUuid) { + this._doc = CoC7Utilities.getDocumentFromKey(this.data.docUuid) + } + + if (!this._actor) { + if (this._doc) { + switch (this._doc.constructor?.name) { + case 'TokenDocument': + this._actor = this._doc.actor + break + + case 'CoCActor': + this._actor = this._doc + break + default: + break + } + } else this._actor = CoC7Utilities.getActorFromKey(this.data.docUuid) + } + } + + get actor () { + this._fetch() + return this._actor + } + + get isActor () { + return this.hasActor || this.hasVehicle + } + + get isActive () { + return this.data.active || false + } + + get key () { + if (this.hasVehicle) return this.vehicle.actorKey + if (this.hasActor) return this.actor.actorKey + return undefined + } + + get icon () { + if (!this.isActor) { + return 'systems/CoC7/assets/icons/question-circle-regular.svg' + } + if (this.hasVehicle) return this.vehicle.img + if (this.hasActor) return this.actor.img + return undefined + } + + get driver () { + if (!this._driver) { + this._driver = CoC7Utilities.getActorFromKey(this.data.docUuid) + } + return this._driver + } + + get vehicle () { + if (this.data.vehicleKey) { + this._vehicle = chatHelper.getActorFromKey(this.data.vehicleKey) + } + return this._vehicle + } + + get hasActor () { + return !!this.actor + } + + get hasVehicle () { + return !!this.vehicle + } + + get name () { + if (this.hasVehicle) return this.vehicle.name + if (this.hasActor) return this.actor.name + return this.data.name || undefined + } + + get mov () { + if (!this.data.mov) { + if (this.hasVehicle) this.data.mov = this.vehicle.mov + else if (this.hasActor) this.data.mov = this.actor.mov + } + + if (this.data.mov) { + if (!isNaN(Number(this.data.mov))) this.data.hasValidMov = true + else { + this.data.hasValidMov = false + this.data.mov = undefined + } + } + + return this.data.mov + } + + get uuid () { + return this.data.uuid + } + + get hasMaxBonusDice () { + return this.bonusDice >= 2 + } + + get bonusDice () { + if ( + isNaN(this.data.bonusDice) || + this.data.bonusDice < 0 || + this.data.bonusDice > 2 + ) { + return 0 + } + return this.data.bonusDice + } + + set bonusDice (x) { + if (isNaN(x)) { + ui.notifications.error('Bonus dice can Only be a number') + return + } + if (x > 2) { + ui.notifications.error('Max 2 bonus dice') + return + } + if (x < 0) { + ui.notifications.error('No negativ bonus dice') + return + } + this.data.bonusDice = x + } + + get hp () { + if (!this.data.hp) { + this.data.hp = 0 + } + if (this.actor) { + this.data.hp = this.actor.hp + } + + return this.data.hp + } + + set hp (x) { + this.data.hp = x + if (this.actor) { + this.actor.setHp(x) + } + } + + addBonusDice () { + if (this.data.bonusDice >= 2) { + ui.notifications.error('Already have max bonus dice') + return + } + this.data.bonusDice += 1 + } + + removeBonusDice () { + if (this.data.bonusDice <= 0) { + ui.notifications.error('Already have 0 bonus dice') + return + } + this.data.bonusDice -= 1 + } + + resetBonusDice () { + this.data.bonusDice = 0 + } + + get hasBonusDice () { + return this.hasOneBonusDice || this.hasTwoBonusDice + } + + get hasOneBonusDice () { + return this.bonusDice >= 1 + } + + get hasTwoBonusDice () { + return this.bonusDice >= 2 + } + + get canAssist () { + return this.assist?.length > 0 + } + + get canBeCautious () { + return !this.hasMaxBonusDice + } + + get assist () { + return this.data.assist || [] + } + + get dex () { + if (!this.data.dex) { + if (this.hasVehicle && this.hasDriver) { + this.data.dex = this.driver.characteristics.dex.value + } else if (this.hasActor) { + this.data.dex = this.actor.characteristics.dex.value + } + } + + if (this.data.dex) { + if (!isNaN(Number(this.data.dex))) this.data.hasValidDex = true + else { + this.data.hasValidDex = false + this.data.dex = 0 + } + } + + return this.data.dex + } + + get hasAGunReady () { + return this.data.hasAGunReady || false + } + + get initiative () { + let init = this.dex + if (this.hasAGunReady) { + init += 50 + } + // if( this.speedCheck){ + // if(this.speedCheck.score) init += this.speedCheck.score/100 + // } + + return init + } + + get isChaser () { + return !!this.data.chaser + } + + get isPrey () { + return !this.isChaser + } + + get isValid () { + return this.hasValidDex && this.hasValidMov + } + + get hasValidDex () { + return !isNaN(Number(this.data.dex)) + } + + get hasValidMov () { + return !isNaN(Number(this.data.mov)) + } + + get hasDriver () { + return this.hasVehicle && this.hasActor + } + + get movAdjustment () { + if (this.data.speedCheck?.rollDataString) { + const roll = CoC7Check.fromRollString(this.data.speedCheck.rollDataString) + if (roll) { + if (!roll.standby) { + if (roll.successLevel >= CoC7Check.successLevel.extreme) return 1 + else if (roll.failed) return -1 + } + } + } + return 0 + } + + get adjustedMov () { + if (typeof this.mov === 'undefined') return undefined + if (isNaN(Number(this.mov))) return undefined + return Number(this.mov) + this.movAdjustment + } + + get hasMovAdjustment () { + return this.hasBonusMov || this.hasMalusMov + } + + get hasBonusMov () { + if (this.data.movAdjustment > 0) return true + return false + } + + get hasMalusMov () { + if (this.data.movAdjustment < 0) return true + return false + } + + // get options(){ + // return { + // exclude: [], + // excludeStartWith: '_' + // }; + // } + + // get dataString(){ + // return JSON.stringify(this, (key,value)=>{ + // if( null === value) return undefined; + // if( this.options.exclude?.includes(key)) return undefined; + // if( key.startsWith(this.options.excludeStartWith)) return undefined; + // return value; + // }); + // } + + tooSlow () { + this.data.excluded = true + } + + includeInChase () { + this.data.excluded = false + this.data.escaped = false + } + + escaped () { + this.data.escaped = true + } + + set slowest (x) { + this.data.slowest = x + } + + get slowest () { + return this.data.slowest + } + + set fastest (x) { + this.data.fastest = x + } + + get fastest () { + return this.data.fastest + } + + calculateMovementActions (minMov) { + if ( + typeof this.movementAction === 'undefined' || + typeof this.adjustedMov === 'undefined' || + isNaN(minMov) + ) { + this.movementAction = 0 + } else { + this.movementAction = 1 + (this.adjustedMov - minMov) + } + // if( this.movementAction < 0) this.movementAction = 0 + } + + set movementAction (x) { + this.data.movementAction = x + } + + get movementAction () { + return this.data.movementAction + } + + set currentMovementActions (x) { + this.data.currentMovementActions = x + } + + get currentMovementActions () { + return this.data.currentMovementActions || 0 + } + + get hasMaxMvtActions () { + return this.currentMovementActions >= this.movementAction + } + + get hasNoMvtActions () { + return this.currentMovementActions <= 0 + } + + addMovementActions (x = 1) { + this.currentMovementActions += x + if (this.currentMovementActions > this.movementAction) { + this.currentMovementActions = this.movementAction + } + } + + alterMovementActions (x) { + this.currentMovementActions += x + if (this.currentMovementActions > this.movementAction) { + this.currentMovementActions = this.movementAction + } + } + + get movementActionArray () { + const baseArray = Array(this.movementAction).fill('base') + if (this.currentMovementActions >= 0) { + for (let i = 0; i < this.currentMovementActions; i++) { + baseArray[i] = 'base available' + } + return baseArray + } + + if (this.currentMovementActions < 0) { + const deficitArray = Array(Math.abs(this.currentMovementActions)).fill( + 'deficit' + ) + return deficitArray.concat(baseArray) + } + } + + get cssClass () { + const cssClasses = [] + if (this.isChaser) cssClasses.push('chaser') + else cssClasses.push('prey') + if (this.data.excluded) cssClasses.push('excluded', 'too_slow') + if (this.data.escaped) cssClasses.push('escaped') + if (this.data.fastest) cssClasses.push('fastest') + if (this.data.slowest) cssClasses.push('slowest') + if (this.data.active) cssClasses.push('active') + if (this.data.currentMovementActions <= 0) cssClasses.push('no-actions') + return cssClasses.join(' ') + } + + get speedCheck () { + const check = {} + if (this.data.speedCheck?.name) check.name = this.data.speedCheck.name + if (this.data.speedCheck?.score) check.score = this.data.speedCheck.score + check.cssClasses = '' + if (this.data.speedCheck?.rollDataString) { + check.roll = CoC7Check.fromRollString(this.data.speedCheck.rollDataString) + if (check.roll) { + if (!check.roll.standby || check.roll.hasCard) { + check.rolled = true + check.inlineRoll = check.roll.inlineCheck.outerHTML + check.cssClasses += 'rolled' + if (!check.roll.standby) { + if (check.roll.successLevel >= CoC7Check.successLevel.extreme) { + check.modifierCss = 'upgrade' + } else if (check.roll.failed) check.modifierCss = 'downgrade' + if ( + check.roll.successLevel >= CoC7Check.successLevel.extreme || + check.roll.failed + ) { + check.hasModifier = true + } + } + } + } + } + if (this.hasActor) { + check.options = [] + for (const c of ['con']) { + const characteristic = this.actor.getCharacteristic(c) + if (characteristic?.value) check.options.push(characteristic.label) + } + + for (const s of this.actor.driveSkills) { + check.options.push(s.name) + } + + for (const s of this.actor.pilotSkills) { + check.options.push(s.name) + } + check.hasOptions = !!check.options.length + + if (this.data.speedCheck?.id) { + let item = this.actor.find(this.data.speedCheck.id) + if (!item) { + const gameItem = game.items.get(this.data.speedCheck.id) + if (gameItem) item = this.actor.find(gameItem.name) + } + + if (item) { + if (item.type === 'item' && item.value.data?.type === 'skill') { + check.ref = item.value + check.name = item.value.name + check.type = 'skill' + check.isSkill = true + check.refSet = true + check.score = item.value.value + } + if (item.type === 'characteristic') { + check.ref = item.value + check.name = item.value.label + check.type = 'characteristic' + check.isCharacteristic = true + check.refSet = true + check.score = item.value.value + } + if (item.type === 'attribute') { + check.ref = item.value + check.name = item.value.label + check.type = 'attribute' + check.isAttribute = true + check.refSet = true + check.score = item.value.value + } + } + } else if (this.data.speedCheck?.name) { + const item = this.actor.find(this.data.speedCheck.name) + if (item) { + if (item.type === 'item' && item.value.data?.type === 'skill') { + check.ref = item.value + check.name = item.value.name + check.type = 'skill' + check.isSkill = true + check.refSet = true + check.score = item.value.value + } + if (item.type === 'characteristic') { + check.ref = item.value + check.name = item.value.label + check.type = 'characteristic' + check.isCharacteristic = true + check.refSet = true + check.score = item.value.value + } + if (item.type === 'attribute') { + check.ref = item.value + check.name = item.value.label + check.type = 'attribute' + check.isAttribute = true + check.refSet = true + check.score = item.value.value + } + } + } + } else if (this.data.speedCheck?.id) { + const item = game.items.get(this.data.speedCheck.id) + if (item) { + if (item.data?.type === 'skill') { + check.ref = item + check.name = item.name + check.type = 'skill' + check.isSkill = true + check.refSet = false + check.score = item.base + } + } + } else if (this.data.speedCheck?.name && this.data.speedCheck?.score) { + check.name = this.data.speedCheck.name + check.score = this.data.speedCheck.score + check.refSet = false + } + + check.canBeRolled = true + + if (!check.rolled && !check.score) { + check.cssClasses += ' invalid' + check.canBeRolled = false + } + check.isValid = check.rolled && !isNaN(check.score) + + return check + } +} + +export function sortByRoleAndDex (a, b) { + if (!a && b) return 1 + if (!b && a) return -1 + if (!a && !b) return 0 + // Put chasers first + if (b.chaser && !a.chaser) return 1 + if (a.chaser && !b.chaser) return -1 + // If sametype sort by dex + return a.dex - b.dex +} diff --git a/module/items/chase/sheet.js b/module/items/chase/sheet.js new file mode 100644 index 00000000..2fced861 --- /dev/null +++ b/module/items/chase/sheet.js @@ -0,0 +1,1207 @@ +/* global $, Dialog, DragDrop, duplicate, expandObject, flattenObject, FormDataExtended, foundry, game, getType, ItemSheet, mergeObject, ui */ + +import { CoC7ChaseParticipantImporter } from '../../apps/chase-participant-importer.js' +import { CoC7Chat } from '../../chat.js' +import { chatHelper } from '../../chat/helper.js' +import { CoC7Check } from '../../check.js' +import { _participant } from './participant.js' + +export class CoC7ChaseSheet extends ItemSheet { + /** + * Extend and override the default options used by the Simple Item Sheet + * @returns {Object} + */ + static get defaultOptions () { + const options = mergeObject(super.defaultOptions, { + classes: ['coc7', 'sheetV2', 'item', 'chase'], + width: 550, + height: 500, + resizable: true, + tabs: [ + { + navSelector: '.sheet-nav', + contentSelector: '.sheet-body', + initial: 'participants' + } + ] + }) + + return options + + // closeOnSubmit: false, + // submitOnClose: true, + } + + /* -------------------------------------------- */ + + /** @override */ + get template () { + return 'systems/CoC7/templates/items/chase.html' + } + + static get type () { + return 'coc7ChaseSheet' + } + + // /** @override */ + // async render(force, options) { + // return super.render(force, options); + // } + + /** @override */ + + getData (options = {}) { + // ui.notifications.warn( + // game.i18n.localize('CoC7.ExperimentalFeaturesWarning') + // ) + const data = super.getData(options) + // if (this.item.started) this._tabs[0].active = 'setup' + + /** MODIF: 0.8.x **/ + const itemData = data.data + data.data = itemData.data // MODIF: 0.8.x data.data + /*****************/ + + data.participants = this.item.participantsObject + data.participantsByInitiative = this.item.participantsByInitiative + data.preys = this.item.preys + data.chasers = this.item.chasers + + // data.byDex = duplicate(data.participants).sort((a, b) => a.dex - b.dex) + + data.preysMinMov = data.preys.length + ? data.preys.reduce((prev, current) => + prev.adjustedMov < current.adjustedMov ? prev : current + ).adjustedMov + : -1 + + data.preysMaxMov = data.preys.length + ? data.preys.reduce((prev, current) => + prev.adjustedMov > current.adjustedMov ? prev : current + ).adjustedMov + : -1 + + data.chasersMinMov = data.chasers.length + ? data.chasers.reduce((prev, current) => + prev.adjustedMov < current.adjustedMov ? prev : current + ).adjustedMov + : -1 + + data.chasersMaxMov = data.chasers.length + ? data.chasers.reduce((prev, current) => + prev.adjustedMov > current.adjustedMov ? prev : current + ).adjustedMov + : -1 + + data.chasers.forEach(p => { + if (p.adjustedMov < data.preysMinMov) p.tooSlow() + else p.includeInChase() + p.fastest = p.adjustedMov === data.chasersMaxMov + p.slowest = p.adjustedMov === data.chasersMinMov + }) + + data.preys.forEach(p => { + if (p.adjustedMov > data.chasersMaxMov) p.escaped() + else p.includeInChase() + p.fastest = p.adjustedMov === data.preysMaxMov + p.slowest = p.adjustedMov === data.preysMinMov + }) + + data.locations = this.item.locations + data.allHaveValidMov = this.allHaveValidMov + data.activeLocation = this.item.activeLocation + if (data.activeLocation) { + data.activeLocation.title = data.activeLocation.coordinates + ? game.i18n.format('CoC7.LocationCoordinate', { + x: data.activeLocation.coordinates.x, + y: data.activeLocation.coordinates.y + }) + : game.i18n.localize('CoC7.DragOnCanvas') + } + data.previousLocation = this.item.previousLocation + data.nextLocation = this.item.nextLocation + data.started = this.item.started + + data.isKeeper = game.user.isGM + return data + } + + // get activeParticipant () { + // if (!this.item.data.data.participants) return undefined + // const participant = this.item.data.data.participants.find(p => p.active) + // if (!participant) return undefined + // return new _participant(participant) + // } + + // get activeParticipantLocation () { + // if (!this.item.data.data.participants) return undefined + // const participant = this.item.data.data.participants.find(p => p.active) + // } + + /** @override */ + activateListeners (html) { + super.activateListeners(html) + + // html.find('.chase-track').ready(async html => await this._onSheetReady(html)) + + // Handle Droprown + html + .find('.dropdown-element') + .on('click', event => this._onDropDownElementSelected(event)) + + html.find('.dropbtn').click(event => { + event.preventDefault() + event.stopPropagation() + const target = event.currentTarget + const dropdown = target.closest('.dropdown') + const dropdownContent = dropdown.querySelector('.dropdown-content') + dropdownContent.classList.toggle('show') + }) + html + .find('.dropdown') + .mouseleave(event => + event.currentTarget + .querySelector('.dropdown-content') + .classList.remove('show') + ) + + html.on('dblclick', '.open-actor', CoC7Chat._onOpenActor.bind(this)) + + html + .find('.pin-location') + .contextmenu(this.clearActiveLocationCoordinates.bind(this)) + + html + .find('.participant') + .on('dragenter', event => this._onDragEnterParticipant(event)) + html + .find('.participant') + .on('dragover', event => this._onDragEnterParticipant(event)) + html + .find('.participant') + .on('dragleave', event => this._onDragLeaveParticipant(event)) + html + .find('.participant') + .on('drop', event => this._onDragLeaveParticipant(event)) + + html.find('.p-side').click(this._onChangeSide.bind(this)) + html.find('.delete-participant').click(this._onDeleteParticipant.bind(this)) + html.find('.reset-roll').click(this._onResetRoll.bind(this)) + html.find('.delete-driver').click(this._onDeleteDriver.bind(this)) + + html + .find('.new-participant') + .on('dragenter', event => this._onDragEnterParticipant(event)) + html + .find('.new-participant') + .on('dragover', event => this._onDragEnterParticipant(event)) + html + .find('.new-participant') + .on('dragleave', event => this._onDragLeaveParticipant(event)) + html + .find('.new-participant') + .on('drop', event => this._onDragLeaveParticipant(event)) + + html.find('.add-sign').click(this._onAddParticipant.bind(this)) + + html.find('.roll-participant').click(this._onRollParticipant.bind(this)) + + html.find('.button').click(this._onButtonClick.bind(this)) + + html.find('.name-container').click(this._onLocationClick.bind(this)) + + html.find('.obstacle-type').click(this._onObstacleTypeClick.bind(this)) + // html.find('.obstacle-toggle').click(this._onObstacleToggleClick.bind(this)) + html.find('.toggle').click(this._onToggle.bind(this)) + html + .find('.participant-control') + .click(this._onParticipantControlClicked.bind(this)) + + html.find('.chase-control').click(this._onChaseControlClicked.bind(this)) + + html + .find('.location-control') + .click(this._onLocationControlClick.bind(this)) + // html + // .find('.movement-action .decrease') + // .click(this._onChangeMovementActions.bind(this, -1)) + // html + // .find('.movement-action .increase') + // .click(this._onChangeMovementActions.bind(this, 1)) + + // html + // .find('.pin-location') + // .on('dragstart', event => this._onPinLocationDragStart(event)) + + const pinLocationSelectorDragDrop = new DragDrop({ + dragSelector: '.pin-location', + permissions: { + dragstart: this._canPinLocationDragStart.bind(this) + }, + callbacks: { + dragstart: this._onPinLocationDragStart.bind(this) + } + }) + pinLocationSelectorDragDrop.bind(html[0]) + + const participantDragDrop = new DragDrop({ + dropSelector: '.participant', + callbacks: { drop: this._onDropParticipant.bind(this) } + }) + participantDragDrop.bind(html[0]) + + const newParticipantDragDrop = new DragDrop({ + dropSelector: '.new-participant', + callbacks: { drop: this._onAddParticipant.bind(this) } + }) + newParticipantDragDrop.bind(html[0]) + + if (this.item.started) { + html + .find('.chase-location .chase-participant') + .click(this._onChaseParticipantClick.bind(this)) + + const chaseParticipantDragpDrop = new DragDrop({ + dragSelector: '.chase-participant', + dropSelector: '.chase-location', + permissions: { + dragstart: this._canChaseParticipantDragStart.bind(this), + drop: this._canChaseParticipantDragDrop.bind(this) + }, + callbacks: { + dragstart: this._onChaseParticipantDragStart.bind(this), + drop: this._onChaseParticipantDragDrop.bind(this), + dragover: this._onDragEnter.bind(this) + } + }) + chaseParticipantDragpDrop.bind(html[0]) + + html + .find('.chase-location') + .on('dragleave', event => this._onDragLeave(event)) + } + } + + /* -------------------------------------------- */ + /* Form Submission */ + /* -------------------------------------------- */ + + /** @override */ + _getSubmitData (updateData = {}) { + // Create the expanded update data object + const fd = new FormDataExtended(this.form, { editors: this.editors }) + let data = fd.toObject() + if (updateData) data = mergeObject(data, updateData) + else data = expandObject(data) + + // Check that starting position is not outside of chase range. + if ( + this.item.data.data.locations?.list?.length && + data.data.startingIndex > this.item.data.data.locations.list.length + ) { + data.data.startingIndex = this.item.data.data.locations.list.length + } + + if (data.data.participants) { + const participants = duplicate(this.item.data.data.participants) + // Handle participants array + for (const [k, v] of Object.entries(data.data.participants)) { + const index = participants.findIndex(p => p.uuid === k) + if (index === -1) ui.notifications.error('Participant table corrupted') + else { + const original = participants[index] + const cleaned = clean(v) + mergeObject(original, cleaned) + participants[index] = original + } + } + + data.data.participants = participants + } + + if (data.locations) { + const locations = duplicate(this.item.data.data.locations.list) + // Handle locations list + for (const [key, value] of Object.entries(data.locations)) { + const locationIndex = locations.findIndex(l => l.uuid === key) + if (locationIndex === -1) { + ui.notifications.error('Locations table corrupted') + } else { + const originalLocation = locations[locationIndex] + const cleaned = clean(value) + mergeObject(originalLocation, cleaned) + locations[locationIndex] = originalLocation + } + } + + delete data.locations + data.data.locations = { list: locations } + } + // const participants = data.data?.participants; + // if( participants) data.data.participants = Object.values( participants).map( p => clean(p)); + + // Return the flattened submission data + return flattenObject(data) + } + + /** @override */ + // async _onSubmit(...args) { + // await super._onSubmit(...args); + // } + + async _updateObject (event, formData) { + const target = event.currentTarget + const override = target?.dataset?.override === 'true' + if (target?.name?.includes('.hp')) { + const [, , uuid] = target.name.split('.') + const participant = this.item.getParticipant(uuid) + if (participant && participant.actor) { + if (!isNaN(Number(target.value))) { + await participant.actor.setHp(Number(target.value)) + } + } + } + if (override) { + const [, type, uuid, subType, data] = target.name.split('.') + const index = this.findParticipantIndex(uuid) + if ( + type === 'participants' && + !isNaN(index) && + subType === 'speed-check' + ) { + if (data === 'name') { + // Changing name will remove all other ref ! + const participants = this.item.data.data.participants + ? duplicate(this.item.data.data.participants) + : [] + if (participants[index].speedCheck) { + delete participants[index].speedCheck.id + delete participants[index].speedCheck.type + } else participants[index].speedCheck = {} + participants[index].speedCheck.name = target.value + await this.item.update({ 'data.participants': participants }) + return + } + } + } + super._updateObject(event, formData) + } + + static async setScroll (app, html, data) { + if (!data.editable) { + return + } + const initialOpening = html[0].classList.contains('window-app') + const chaseTrack = html[0].querySelector('.chase-track') + if (!chaseTrack) return + + let start = data.data.scroll?.chaseTrack.from + let end = data.data.scroll?.chaseTrack.to + if (typeof start === 'undefined') { + start = 0 + } + if (typeof end === 'undefined') { + end = -1 + } + + if (initialOpening) { + const remString = $(':root').css('font-size') + const remSize = Number(remString.replace('px', '')) + if (app.item.started) { + const pCount = app.item.actualParticipants?.length + const width = (pCount * 11.2 + 3) * remSize + app._tabs[0].active = 'setup' + app.position.width = Math.max(width, 40 * remSize) + // html.css('width', `${width}px`) + } else { + app.position.width = 45 * remSize + } + return await app.item.activateNextParticipantTurn({ html }) // html is not rendered, element have size = 0 + // if (end > 0) { + // start = 0 + // } else if (start > 0) { + // end = start + // start = 0 + // } + } + + if (start && start !== -1) { + chaseTrack.scrollTo({ + top: 0, + left: start, + behavior: 'instant' + }) + } + + if (end !== -1) { + chaseTrack.scrollTo({ + top: 0, + left: end, + behavior: 'smooth' + }) + } + + // await app.item.update({ 'data.trackScrollPosition': elementCenterRelativeLeft }) + } + + static onClose (app, html) { + app.item.update({ 'data.trackScrollPosition': -1 }) + } + + // async _onSheetReady (html) { + // const track = html.find('.chase-track') + // const element = $(track).find('.active') + + // const elementleft = element[0].offsetLeft + // const divWidth = track[0].clientWidth + // let elementCenterRelativeLeft = elementleft - divWidth / 2 + // if (elementCenterRelativeLeft < 0) elementCenterRelativeLeft = 0 + + // const scrollPosition = this.item.data.data.trackScrollPosition + // if (!track.length) return + // if (!scrollPosition) return + // const trackElement = track[0] + // trackElement.scrollTo({ + // top: 0, + // left: elementCenterRelativeLeft, + // behavior: 'instant' + // }) + + // //TODO : couldd use parent.offsetTop et child.offsetTop to center the active element + + // // const active = html.find('.name-container.active') + // // if( active){ + // // const element = active[0] + // // element.scrollIntoView({behavior: "smooth", block: "end", inline: "center"}) + // // element.scrollIntoView(false) + // // } + // // }) + // } + + findParticipantIndex (uuid) { + return this.item.data.data.participants.findIndex(p => p.uuid === uuid) + } + + findLocationIndex (uuid) { + return this.item.data.data.locations.list.findIndex(p => p.uuid === uuid) + } + + findLocation (uuid) { + return this.item.data.data.locations.list.find(p => p.uuid === uuid) + } + + findIndex (list, uuid) { + return list.findIndex(p => p.uuid === uuid) + } + + async _onDropDownElementSelected (event) { + event.preventDefault() + event.stopPropagation() + const target = event.currentTarget + target.closest('.dropdown-content')?.classList.toggle('show') + const assistantUuid = target.closest('.initiative-block')?.dataset?.uuid + const beneficiaryUuid = target.dataset.beneficiaryUuid + await this.item.assistParticipant(assistantUuid, beneficiaryUuid) + } + + async _onToggle (event) { + const target = event.currentTarget + // const locationElement = target.closest('.location.obstacle') + // const uuid = locationElement.dataset.uuid + // const locations = duplicate(this.item.data.data.locations.list) + // const locationIndex = this.findIndex(locations, uuid) + const toggle = target.getAttribute('toggle') + const data = expandObject({ + [toggle]: !target.classList.contains('switched-on') + }) + if (data.locations) { + const locations = duplicate(this.item.data.data.locations.list) + for (const [key, value] of Object.entries(data.locations)) { + const locationIndex = locations.findIndex(l => l.uuid === key) + if (locationIndex === -1) { + ui.notifications.error('Locations table corrupted') + } else { + const originalLocation = locations[locationIndex] + const cleaned = clean(value) + mergeObject(originalLocation, cleaned) + locations[locationIndex] = originalLocation + } + } + await this.item.updateLocationsList(locations) + } + } + + // async _onObstacleToggleClick (event) { + // const target = event.currentTarget + // const locationElement = target.closest('.obstacle') + // const uuid = locationElement.dataset.uuid + // const locations = duplicate(this.item.data.data.locations.list) + // const locationIndex = this.findIndex(locations, uuid) + // locations[locationIndex].obstacle = !locations[locationIndex].obstacle + // if (!locations[locationIndex].obstacleDetails) { + // locations[locationIndex].obstacleDetails = { + // barrier: true + // } + // } + // await this.item.updateLocationsList(locations) + // } + + async _onObstacleTypeClick (event) { + const target = event.currentTarget + const locationElement = target.closest('.obstacle') + const uuid = locationElement.dataset.uuid + const locations = duplicate(this.item.data.data.locations.list) + const locationIndex = this.findIndex(locations, uuid) + if (!locations[locationIndex].obstacleDetails) { + locations[locationIndex].obstacleDetails = {} + } + const obstacle = locations[locationIndex].obstacleDetails + const type = target.classList.contains('barrier') ? 'barrier' : 'hazard' + const active = obstacle[type] + obstacle.barrier = false + obstacle.hazard = false + obstacle[type] = !active + locations[locationIndex].obstacle = !active + // if (target.classList.contains('barrier')) { + // locations[locationIndex].obstacleDetails.barrier = !locations[ + // locationIndex + // ].obstacleDetails.barrier + // locations[locationIndex].obstacleDetails.hazard = !locations[ + // locationIndex + // ].obstacleDetails.barrier + // } else if (target.classList.contains('hazard')) { + // locations[locationIndex].obstacleDetails.hazard = !locations[ + // locationIndex + // ].obstacleDetails.hazard + // locations[locationIndex].obstacleDetails.barrier = !locations[ + // locationIndex + // ].obstacleDetails.hazard + // } + await this.item.updateLocationsList(locations) + } + + async _onLocationClick (event) { + const target = event.currentTarget + const locationElement = target.closest('.chase-location') + const lUuid = locationElement.dataset.uuid + await this.item.activateLocation(lUuid) + } + + async _onLocationControlClick (event) { + event.preventDefault() + const target = event.currentTarget + if (target.classList.contains('inactive')) return + const action = target.dataset.action + const locationElement = target.closest('.chase-location') + const lUuid = locationElement.dataset.uuid + switch (action) { + case 'remove': + await this.item.removeLocation(lUuid) + break + case 'add-after': + await this.item.insertLocation(lUuid, { shift: 1 }) + break + + case 'add-before': + await this.item.insertLocation(lUuid, { shift: 0 }) + break + + case 'add-participant': + CoC7ChaseParticipantImporter.create({ + chaseUuid: this.item.uuid, + locationUuid: lUuid, + dropData: {} + }) + break + + default: + break + } + // ui.notifications.info(`Location ${lUuid} Clicked. Action: ${action}`) + } + + async _onChaseParticipantClick (event) { + const pUuid = event.currentTarget.dataset?.uuid + await this.item.activateParticipant(pUuid) + } + + async _onParticipantControlClicked (event) { + event.preventDefault() + const target = event.currentTarget + if (target.classList.contains('inactive')) return + if (target.classList.contains('dropdown')) return + event.stopPropagation() + + const participantUuid = target.closest('.initiative-block')?.dataset?.uuid + if (!participantUuid) return + switch (target.dataset.action) { + case 'drawGun': + await this.toggleParticipantGun(participantUuid) + break + case 'decreaseActions': + await this._onChangeMovementActions(-1, event) + break + case 'increaseActions': + await this._onChangeMovementActions(1, event) + break + case 'moveBackward': + await this.item.moveParticipant(participantUuid, -1, { render: false }) + break + case 'moveForward': + await this.item.moveParticipant(participantUuid, 1, { render: false }) + break + case 'activateParticipant': + return await this.item.activateParticipant(participantUuid) + case 'bonusDice': + { + const diceNumber = target.dataset.count + await this.item.toggleBonusDice(participantUuid, diceNumber) + this.item.activateNextParticipantTurn() + } + break + case 'cautiousApproach': + await this.item.cautiousApproach(participantUuid) + break + case 'editParticipant': + { + const participant = this.item.getParticipant(participantUuid) + const location = this.item.getParticipantLocation(participantUuid) + participant.data.chaseUuid = this.item.uuid + participant.data.locationUuid = location.uuid + participant.data.update = true + CoC7ChaseParticipantImporter.create(participant.data) + } + break + case 'removeParticipant': + await this.item.removeParticipant(participantUuid) + break + } + this.item.activateNextParticipantTurn() + } + + async _onChaseControlClicked (event) { + event.preventDefault() + const target = event.currentTarget + event.stopPropagation() + + const locationUuid = target.closest('.obstacle')?.dataset?.uuid + if (!locationUuid) return + switch (target.dataset.action) { + case 'obstacle-skill-check': + return this.item.activeParticipantObstacleCheck(locationUuid) + } + } + + async _onChangeMovementActions (count, event) { + event.preventDefault() + event.stopPropagation() + const target = event.currentTarget + const participantUuid = target.closest('.initiative-block')?.dataset?.uuid + if (!participantUuid) return + const participants = this.item.participants + const participant = participants.find(p => participantUuid === p.uuid) + if (participant.hasMaxMvtActions && count > 0) return + participant.alterMovementActions(count) + + // const sheet = target.closest('.coc7.item.chase') + // const chaseTrack = sheet.querySelector('.chase-track') + // if (chaseTrack) + // await this.item.update({ + // 'data.trackScrollPosition': chaseTrack.scrollLeft + // }) + await this.item.setchaseTrackScroll({ render: false }) + await this.item.updateParticipants(participants) + } + + async _onButtonClick (event) { + const target = event.currentTarget + const action = target.dataset?.action + if (!action) return + switch (action) { + case 'init': + if ( + !isNaN(this.item.data.data.locations.total) && + this.item.data.data.locations.total > 0 + ) { + const locations = Array.apply( + null, + Array(this.item.data.data.locations.total) + ).map(function () { + return { uuid: foundry.utils.randomID(16) } + }) + locations[0].name = 'Start' + if (locations.length > 1) locations[locations.length - 1].name = 'End' + await this.item.updateLocationsList(locations) + } + + break + case 'reset': + Dialog.confirm({ + title: `${game.i18n.localize('CoC7.ConfirmResetChase')}`, + content: `${game.i18n.localize('CoC7.ConfirmResetChaseHint')}
`, + yes: async () => { + await this.item.updateLocationsList([]) + await this.item.stop() + } + }) + break + + case 'cut2chase': + if (this.item.allHaveSpeedRoll) { + Dialog.confirm({ + title: `${game.i18n.localize('CoC7.ConfirmCut2Chase')}`, + content: `${game.i18n.localize( + 'CoC7.ConfirmCut2ChaseHint' + )}
`, + yes: () => this.item.cutToTheChase() + }) + } else { + ui.notifications.warn(game.i18n.localize('CoC7.NotAllHaveSpeedRoll')) + } + break + + case 'restart': + Dialog.confirm({ + title: `${game.i18n.localize('CoC7.ConfirmRestartChase')}`, + content: `${game.i18n.localize( + 'CoC7.ConfirmRestartChaseHint' + )}
`, + yes: () => this.item.restart() + }) + break + + case 'nextRound': + if (this.item.nextActiveParticipant) { + Dialog.confirm({ + title: `${game.i18n.localize('CoC7.ConfirmNextChaseRound')}`, + content: `${game.i18n.localize( + 'CoC7.ConfirmNextChaseRoundHint' + )}
`, + yes: () => this.item.progressToNextRound() + }) + } else this.item.progressToNextRound() + break + + default: + break + } + } + + _canPinLocationDragStart (selector) { + if (game.user.isGM) return true + return false + } + + async _onPinLocationDragStart (event) { + const a = event.currentTarget + const i = a.querySelector('i.icon') + const dragIcon = a.querySelector('.pin-image') + + event.dataTransfer.setDragImage(dragIcon, 0, dragIcon.height) + + const locationElement = a.closest('.chase-location') + const data = {} + + data.type = 'locator' + data.CoC7Type = 'chase' + data.icon = i.dataset.linkIcon + data.locationUuid = locationElement.dataset.uuid + data.docUuid = this.item.uuid + data.callBack = 'locatorDropped' + event.dataTransfer.setData('text/plain', JSON.stringify(data)) + + // const dragData = { uuid: locationElement.dataset.uuid, chaseUuid: this.item.uuid } + // dragEvent.dataTransfer.setData('text/plain', JSON.stringify(dragData)) + } + + _canChaseParticipantDragStart (selector) { + if (game.user.isGM) return true + return false + } + + _canChaseParticipantDragDrop (selector) { + if (game.user.isGM) return true + return false + } + + async _onChaseParticipantDragStart (dragEvent) { + const target = dragEvent.currentTarget + const dragData = { uuid: target.dataset.uuid, type: 'participant' } + dragEvent.dataTransfer.setData('text/plain', JSON.stringify(dragData)) + } + + async _onChaseParticipantDragDrop (dragEvent) { + const dataString = dragEvent.dataTransfer.getData('text/plain') + const data = JSON.parse(dataString) + + // ui.notifications.info('Dropped') + this._onDragLeave(dragEvent) + + const target = dragEvent.currentTarget + const locationUuid = target.dataset.uuid + + if (data.type === 'participant') { + const oldLocation = this.findLocation(locationUuid) + if (oldLocation) { + if (oldLocation.participants?.includes(data.uuid)) return + } + await this.item.setchaseTrackScroll({ render: false }) + await this.item.moveParticipantToLocation(data.uuid, locationUuid) + } else { + CoC7ChaseParticipantImporter.create({ + chaseUuid: this.item.uuid, + locationUuid, + dropData: data + }) + } + } + + _onDragOver (dragEvent) { + this._onDragEnter(dragEvent) + } + + _onDragEnter (dragEvent) { + const target = dragEvent.currentTarget + target.classList.add('drag-over') + } + + _onDragLeave (dragEvent) { + const target = dragEvent.currentTarget + target.classList?.remove('drag-over') + } + + async _onDropParticipant (event) { + const target = event.currentTarget + const uuid = target.dataset?.uuid + const dataString = event.dataTransfer.getData('text/plain') + const data = JSON.parse(dataString) + await this.alterParticipant(data, uuid) + } + + async _onAddParticipant (event) { + event.preventDefault() + const data = { chaseUuid: this.item.uuid } + if (event.dataTransfer) { + const dataString = event.dataTransfer.getData('text/plain') + data.dropData = JSON.parse(dataString) + } + CoC7ChaseParticipantImporter.create(data) + } + + async _onRollParticipant (event) { + const target = event.currentTarget + const participantElement = target.closest('.participant') + const uuid = participantElement.dataset.uuid + const index = this.findParticipantIndex(uuid) + const participants = this.item.data.data.participants + ? duplicate(this.item.data.data.participants) + : [] + + const participant = new _participant(participants[index]) + if (participant.speedCheck.refSet) { + const roll = new CoC7Check() + roll.parent = this.item.uuid + participant.data.rolled = true + participant.data.rollUuid = roll.uuid + roll.actor = participant.actor.actorKey + if (!event.shiftKey && participant.actor.player) { + roll.standby = true + roll.standbyText = 'CoC7.Chase' + roll.standbyRightIcon = 'systems/CoC7/assets/icons/running-solid.svg' + } + + if (participant.speedCheck.isCharacteristic) { + await roll.rollCharacteristic(participant.speedCheck.ref.key) + await roll.toMessage() + participant.data.speedCheck.rollDataString = roll.JSONRollString + } else if (participant.speedCheck.isSkill) { + roll.skill = participant.speedCheck.ref + await roll.roll() + await roll.toMessage() + participant.data.speedCheck.rollDataString = roll.JSONRollString + } else if (participant.speedCheck.isAttribute) { + await roll.rollAttribute(participant.speedCheck.ref.key) + await roll.toMessage() + participant.data.speedCheck.rollDataString = roll.JSONRollString + } + } else if (participant.speedCheck.score) { + const rollData = { + rawValue: participant.speedCheck.score, + displayName: participant.speedCheck.name, + actorName: participant.name ? participant.name : undefined + } + if (participant.hasActor) rollData.actor = participant.actor.actorKey + const roll = CoC7Check.create(rollData) + roll.parent = this.item.uuid + await roll.roll() + await roll.toMessage() + participant.data.speedCheck.rollDataString = roll.JSONRollString + participant.data.rolled = true + participant.data.rollUuid = roll.uuid + } + + await this.item.update({ 'data.participants': participants }) + } + + _onDragEnterParticipant (event) { + const target = event.currentTarget + target.classList.add('drag-over') + } + + _onDragLeaveParticipant (event) { + const target = event.currentTarget + target.classList.remove('drag-over') + } + + async _onChangeSide (event) { + // const test = await fromUuid( 'Scene.wh7SLuvIOpcQyb8S.Token.nCdoCyoiudtjrNku'); + // const itemTest = await fromUuid( 'Item.plIEmNRP6O7PveNv.roll.q2sAzsHt4FsqsdfD'); + + const target = event.currentTarget + const participant = target.closest('.participant') + const uuid = participant.dataset.uuid + const index = this.findParticipantIndex(uuid) + const participants = this.item.data.data.participants + ? duplicate(this.item.data.data.participants) + : [] + participants[index].chaser = !participants[index].chaser + await this.item.update({ 'data.participants': participants }) + } + + async _onDeleteDriver (event) { + const target = event.currentTarget + const driver = target.closest('.driver') + const uuid = driver.dataset.uuid + const index = this.findParticipantIndex(uuid) + const participants = this.item.data.data.participants + ? duplicate(this.item.data.data.participants) + : [] + const participant = participants[index] + delete participant.docUuid + await this.item.update({ 'data.participants': participants }) + } + + async _onDeleteParticipant (event) { + const target = event.currentTarget + const participant = target.closest('.participant') + const uuid = participant.dataset.uuid + const index = this.findParticipantIndex(uuid) + const participants = this.item.data.data.participants + ? duplicate(this.item.data.data.participants) + : [] + participants.splice(index, 1) + await this.item.update({ 'data.participants': participants }) + } + + async _onResetRoll (event) { + const target = event.currentTarget + const participant = target.closest('.participant') + const uuid = participant.dataset.uuid + const index = this.findParticipantIndex(uuid) + const participants = this.item.data.data.participants + ? duplicate(this.item.data.data.participants) + : [] + delete participants[index].speedCheck.rollDataString + await this.item.update({ 'data.participants': participants }) + } + + async alterParticipant (data, uuid) { + let docUuid, actor + if (data.tokenUuid) docUuid = data.tokenUuid + else { + docUuid = + data.sceneId && data.tokenId + ? `Scene.${data.sceneId}.Token.${data.tokenId}` + : data.actorId || data.actorKey || data.id + } + + if (data.type === 'Token') { + docUuid = data.uuid + } else if (docUuid) { + actor = chatHelper.getActorFromKey(docUuid) + if (!actor && data.type === 'Item') docUuid = null + } + + if (actor && docUuid !== actor.uuid) { + docUuid = actor.uuid + } + + const participant = {} + if (docUuid) participant.docUuid = docUuid + + switch (data.type?.toLowerCase()) { + case 'actor': + break + case 'item': + participant.speedCheck = { + id: data.data?._id || data.id, + type: 'item' + } + break + case 'characteristic': + participant.speedCheck = { + id: data.name, + type: 'characteristic' + } + break + case 'attribute': + participant.speedCheck = { + id: data.name, + type: 'attribute' + } + break + + default: + break + } + + // TODO:Check for speed check, if none add speedcheck + // speedCheck = { + // id: 'str' + // type: 'characteristic' + // } + const participants = this.item.data.data.participants + ? duplicate(this.item.data.data.participants) + : [] + const index = this.findParticipantIndex(uuid) + const oldParticipant = participants[index] + if (oldParticipant.mov) delete oldParticipant.mov + mergeObject(oldParticipant, participant) + await this.item.update({ 'data.participants': participants }) + } + + async clearActiveLocationCoordinates () { + await this.item.clearActiveLocationCoordinates() + } + + async addParticipant (data) { + // let prout = chatHelper.getActorFromKey( + // 'Scene.wh7SLuvIOpcQyb8S.Token.QyFTiiEZiX9vTfiC' + // ) + // prout = chatHelper.getActorFromKey( + // 'Scene.wh7SLuvIOpcQyb8S.Token.ubLzhe57JOTHMIr9' + // ) + // prout = chatHelper.getActorFromKey('Actor.uiY3capSUeLLvSLi') + // prout = CoC7Utilities.getDocumentFromKey( 'Scene.wh7SLuvIOpcQyb8S.Token.QyFTiiEZiX9vTfiC.Item.GrOHeLXfeEphsRMZ') + // prout = CoC7Utilities.getDocumentFromKey( "Scene.wh7SLuvIOpcQyb8S.Token.YqsNQPDhFCPlSRqJ") + // prout = CoC7Utilities.getDocumentFromKey( "Scene.wh7SLuvIOpcQyb8S.Token.YqsNQPDhFCPlSRqJ.Item.8JEnTjJOGFXml4wk") + + // try to find a valid document + let docUuid, actor + if (data.tokenUuid) docUuid = data.tokenUuid + else { + docUuid = + data.sceneId && data.tokenId + ? `Scene.${data.sceneId}.Token.${data.tokenId}` + : data.actorId || data.actorKey || data.id + } + + if (data.type === 'Token') { + docUuid = data.uuid + } else if (docUuid) { + actor = chatHelper.getActorFromKey(docUuid) + if (!actor && data.type === 'Item') docUuid = null + } + + if (actor && docUuid !== actor.uuid) { + docUuid = actor.uuid + } + + const participant = {} + if (docUuid) participant.docUuid = docUuid + + switch (data.type?.toLowerCase()) { + case 'actor': + break + case 'item': + if (data.id) { + const item = game.items.get(data.id) + if (item?.data?.type !== 'skill') return + } + + participant.speedCheck = { + id: data.data?._id || data.id, + type: 'item' + } + break + case 'characteristic': + participant.speedCheck = { + id: data.name, + type: 'characteristic' + } + break + case 'attribute': + participant.speedCheck = { + id: data.name, + type: 'attribute' + } + break + + default: + break + } + + // TODO:Check for speed check, if none add speedcheck con non vehicle, drive auto for vehicle + // speedCheck = { + // id: 'con' + // type: 'characteristic' + // } + + if (!participant.speedCheck) { + if (!this.item.data.data.vehicle) { + participant.speedCheck = { + id: 'con', + type: 'characteristic', + name: game.i18n.localize('CHARAC.Constitution') + } + } else { + participant.speedCheck = { + type: 'item', + name: game.i18n.localize('CoC7.DriveAutoSkillName') + } + } + } + const participants = this.item.data.data.participants + ? duplicate(this.item.data.data.participants) + : [] + + let unique = false + while (!unique) { + participant.uuid = foundry.utils.randomID(16) + unique = + participants.filter(p => p.uuid === participant.uuid).length === 0 + } + + participants.push(participant) + await this.item.update({ 'data.participants': participants }) + } + + async toggleParticipantGun (participantUuid) { + const participants = this.item.data.data.participants + ? duplicate(this.item.data.data.participants) + : [] + const participant = participants.find(p => participantUuid === p.uuid) + if (!participant) return + participant.hasAGunReady = !participant.hasAGunReady + await this.item.setchaseTrackScroll({ render: false }) + await this.item.updateParticipants(participants) + } +} + +export function clean (obj) { + for (const propName in obj) { + const tp = getType(obj[propName]) + if (tp === 'Object') { + obj[propName] = clean(obj[propName]) + } + + if (tp === 'Object' && !Object.entries(obj[propName]).length) { + obj[propName] = null + } else if (tp === 'string' && !obj[propName].length) { + obj[propName] = null + } else if (tp === 'string' && !isNaN(Number(obj[propName]))) { + obj[propName] = Number(obj[propName]) + } + } + return obj +} diff --git a/module/items/item.js b/module/items/item.js index 01806933..ba77b3a1 100644 --- a/module/items/item.js +++ b/module/items/item.js @@ -1,7 +1,7 @@ /* global CONFIG, duplicate, game, getProperty, Item, Roll, TextEditor, Token, ui */ - import { CoC7Parser } from '../apps/parser.js' import { COC7 } from '../config.js' +import { CoC7Utilities } from '../utilities.js' /** * Override and extend the basic :class:`Item` implementation @@ -22,12 +22,8 @@ export class CoC7Item extends Item { }) } if (typeof data.img === 'undefined') { - if (data.type === 'chase') { - data.img = 'systems/CoC7/assets/icons/running-solid.svg' - } else if (data.type === 'skill') { + if (data.type === 'skill') { data.img = 'systems/CoC7/assets/icons/skills.svg' - } else if (data.type === 'spell') { - data.img = 'systems/CoC7/assets/icons/pentagram-rose.svg' } else if (data.type === 'status') { data.img = 'icons/svg/aura.svg' } else if (data.type === 'weapon') { @@ -38,6 +34,10 @@ export class CoC7Item extends Item { super(data, context) } + static get iconLanguage () { + return 'systems/CoC7/assets/icons/skills/language.svg' + } + static get flags () { return { malfunction: 'malfc' @@ -52,7 +52,11 @@ export class CoC7Item extends Item { let checkedProps = {} let fighting let firearms - if (this.type === 'weapon' && !override) { + if (typeof COC7.eras[propertyId] !== 'undefined') { + checkedProps = { + ['data.eras.' + propertyId]: !(this.data.data.eras[propertyId] ?? false) + } + } else if (this.type === 'weapon' && !override) { if (propertyId === 'ahdb') { if (!this.data.data.properties.ahdb) { checkedProps = { @@ -127,9 +131,7 @@ export class CoC7Item extends Item { } } } - } - - if (this.type === 'skill' && !override) { + } else if (this.type === 'skill' && !override) { let modif = false if (propertyId === 'combat') { if (!this.data.data.properties.combat) { @@ -143,7 +145,8 @@ export class CoC7Item extends Item { 'data.properties.special': false, 'data.properties.fighting': false, 'data.properties.firearm': false, - 'data.specialization': null + 'data.specialization': '', + name: this.data.data.skillName } } modif = true @@ -178,23 +181,52 @@ export class CoC7Item extends Item { 'data.properties.fighting': true, 'data.properties.firearm': false, 'data.properties.combat': true, - 'data.properties.special': true, - 'data.specialization': game.i18n.localize( - COC7.fightingSpecializationName - ) + 'data.properties.special': true } + const parts = CoC7Item.getNamePartsSpec( + this.data.data.skillName, + game.i18n.localize(COC7.fightingSpecializationName) + ) + checkedProps.name = parts.name + checkedProps.skillName = parts.skillName + checkedProps['data.specialization'] = parts.specialization } - if (firearms) { checkedProps = { 'data.properties.fighting': false, 'data.properties.firearm': true, 'data.properties.combat': true, - 'data.properties.special': true, - 'data.specialization': game.i18n.localize( - COC7.firearmSpecializationName - ) + 'data.properties.special': true } + const parts = CoC7Item.getNamePartsSpec( + this.data.data.skillName, + game.i18n.localize(COC7.firearmSpecializationName) + ) + checkedProps.name = parts.name + checkedProps.skillName = parts.skillName + checkedProps['data.specialization'] = parts.specialization + } + } + } + + if (propertyId === 'special') { + if (this.data.data.properties[propertyId]) { + checkedProps = { + 'data.properties.special': false, + 'data.properties.fighting': false, + 'data.properties.firearm': false, + 'data.properties.combat': false, + 'data.specialization': '', + name: this.data.data.skillName + } + } else { + checkedProps = { + 'data.properties.special': true, + name: + this.data.data.specialization + + ' (' + + this.data.data.skillName + + ')' } } } @@ -205,7 +237,7 @@ export class CoC7Item extends Item { } else { const propName = `data.properties.${propertyId}` const propValue = !this.data.data.properties[propertyId] - this.update({ [propName]: propValue }).then(item => { + await this.update({ [propName]: propValue }).then(item => { return item }) } @@ -215,50 +247,11 @@ export class CoC7Item extends Item { return this.isIncludedInSet('properties', propertyId) } - get name () { - if (this.type !== 'skill' || !this.data.data?.properties?.special) { - return super.name - } - if ( - this.data.name - .toLowerCase() - .includes(this.data.data.specialization?.toLowerCase()) - ) { - // Restore names that have already been processed - if (this.isOwned && super.name === this.data.name) { - const re = new RegExp( - '^' + - this.data.data.specialization.replace( - /[-[\]/{}()*+?.\\^$|]/g, - '\\$&' - ) + - ' \\((.+)\\)$' - ) - const match = re.exec(this.data.name) - if (match !== null && typeof match[1] !== 'undefined') { - return match[1] - } - } - return super.name + get shortName () { + if (this.data.data.properties.special) { + return this.data.data.skillName } - if (this.isOwned) { - return super.name - } - return `${this.data.data.specialization} (${this.data.name})` - } - - get sName () { - if (this.type !== 'skill' || !this.data.data?.properties?.special) { - return super.name - } - if ( - this.data.name - .toLowerCase() - .includes(this.data.data.specialization?.toLowerCase()) - ) { - return super.name - } - return `${this.data.name}` + return this.name } async updateRoll (roll) { @@ -267,24 +260,41 @@ export class CoC7Item extends Item { return undefined } + static getNamePartsSpec (skillName, specialization) { + if (!specialization) { + return { + name: skillName, + specialization: '', + skillName + } + } + const specNameRegex = new RegExp( + '^(' + CoC7Utilities.quoteRegExp(specialization) + ')\\s*\\((.+)\\)$', + 'i' + ) + const match = skillName.match(specNameRegex) + if (match) { + return { + name: match[0], + specialization: match[1], + skillName: match[2] + } + } + return { + name: specialization + ' (' + skillName + ')', + specialization, + skillName + } + } + static getNameWithoutSpec (item) { if (item instanceof CoC7Item) { if (item.data.data?.properties?.special) { - const specNameRegex = new RegExp(item.data.data.specialization, 'ig') - const filteredName = item.name - .replace(specNameRegex, '') - .trim() - .replace(/^\(+|\)+$/gm, '') - return filteredName.length ? filteredName : item.name + return item.data.data.skillName } } else { if (item.data.properties?.special) { - const specNameRegex = new RegExp(item.data.specialization, 'ig') - const filteredName = item.name - .replace(specNameRegex, '') - .trim() - .replace(/^\(+|\)+$/gm, '') - return filteredName.length ? filteredName : item.name + return item.data.skillName } } return item.name @@ -295,17 +305,17 @@ export class CoC7Item extends Item { if (item.type !== 'skill' || !item.data.data.properties?.special) { return false } - return ( - CoC7Item.getNameWithoutSpec(item).toLowerCase() === - game.i18n.localize('CoC7.AnySpecName').toLowerCase() - ) + return [ + game.i18n.localize('CoC7.AnySpecName').toLowerCase(), + 'any' + ].includes(CoC7Item.getNameWithoutSpec(item).toLowerCase()) } else { // Assume it's data only if (item.type !== 'skill' || !item.data.properties?.special) return false - return ( - CoC7Item.getNameWithoutSpec(item).toLowerCase() === - game.i18n.localize('CoC7.AnySpecName').toLowerCase() - ) + return [ + game.i18n.localize('CoC7.AnySpecName').toLowerCase(), + 'any' + ].includes(CoC7Item.getNameWithoutSpec(item).toLowerCase()) } } @@ -424,7 +434,7 @@ export class CoC7Item extends Item { if (game.settings.get('CoC7', 'xpEnabled') || game.user.isGM) { await this.update({ [name]: flagValue }) } else { - ui.notifications.info('XP Gain disabled.') + ui.notifications.info(game.i18n.localize('CoC7.SkillXpGainDisabled')) } } else await this.update({ [name]: flagValue }) } @@ -544,9 +554,36 @@ export class CoC7Item extends Item { return skillProperties } + static async calculateBase (actor, data) { + if (data.type !== 'skill') return null + if (String(data.data.base).includes('@')) { + const parsed = {} + for (const [key, value] of Object.entries(COC7.formula.actorsheet)) { + if (key.startsWith('@') && value.startsWith('this.actor.')) { + parsed[key.substring(1)] = getProperty(actor, value.substring(11)) + } + } + let value + try { + value = Math.floor( + new Roll(data.data.base, parsed).evaluate({ + maximize: true + }).total + ) + } catch (err) { + value = 0 + } + return value + } + return !isNaN(parseInt(data.data.base)) ? parseInt(data.data.base) : null + } + get _base () { - if (this.type !== 'skill') return null - if (typeof this.data.data.base !== 'string') return this.data.data.base + if (this.type !== 'skill') return [null, false] + if (typeof this.data.data.base !== 'string') { + return [this.data.data.base, false] + } + if (this.data.data.base.includes('@')) { const parsed = {} for (const [key, value] of Object.entries(COC7.formula.actorsheet)) { @@ -567,14 +604,20 @@ export class CoC7Item extends Item { return [value, true] } - return [!isNaN(parseInt(this.data.data.base)) - ? parseInt(this.data.data.base) - : null, false] + return [ + !isNaN(parseInt(this.data.data.base)) + ? parseInt(this.data.data.base) + : null, + false + ] } async asyncBase () { const e = this._base if (e[1]) { + console.info( + `[COC7] (${this.parent?.name}) Evaluating skill ${this.name}:${this.data.data.base} to ${e[0]}` + ) await this.update({ 'data.base': e[0] }) } return e[0] @@ -588,58 +631,6 @@ export class CoC7Item extends Item { return e[0] } - get value () { - if (this.type !== 'skill') return null - let value = 0 - if (this.actor.data.type === 'character') { - value = this.base - value += this.data.data.adjustments?.personal - ? parseInt(this.data.data.adjustments?.personal) - : 0 - value += this.data.data.adjustments?.occupation - ? parseInt(this.data.data.adjustments?.occupation) - : 0 - value += this.data.data.adjustments?.experience - ? parseInt(this.data.data.adjustments?.experience) - : 0 - if (game.settings.get('CoC7', 'pulpRules')) { - if (this.data.data.adjustments?.archetype) { - value += parseInt(this.data.data.adjustments?.archetype) - } - } - } else { - value = parseInt(this.data.data.value) - } - return !isNaN(value) ? value : null - } - - async updateValue (value) { - if (this.type !== 'skill') return null - if (this.actor.data.type === 'character') { - const delta = parseInt(value) - this.value - const exp = - (this.data.data.adjustments?.experience - ? parseInt(this.data.data.adjustments.experience) - : 0) + delta - await this.update({ - 'data.adjustments.experience': exp > 0 ? exp : 0 - }) - } else await this.update({ 'data.value': value }) - } - - async increaseExperience (x) { - if (this.type !== 'skill') return null - if (this.actor.data.type === 'character') { - const exp = - (this.data.data.adjustments?.experience - ? parseInt(this.data.data.adjustments.experience) - : 0) + parseInt(x) - await this.update({ - 'data.adjustments.experience': exp > 0 ? exp : 0 - }) - } - } - getBulletLeft () { if (this.type !== 'weapon') return null if (!this.data.data.ammo) { @@ -694,20 +685,9 @@ export class CoC7Item extends Item { return [...newArray, item] }, []) .sort((a, b) => { - let lca - let lcb - if (a.data.properties && b.data.properties) { - lca = a.data.properties.special - ? a.data.specialization.toLowerCase() + a.name.toLowerCase() - : a.name.toLowerCase() - lcb = b.data.properties.special - ? b.data.specialization.toLowerCase() + b.name.toLowerCase() - : b.name.toLowerCase() - } else { - lca = a.name.toLowerCase() - lcb = b.name.toLowerCase() - } - return lca.localeCompare(lcb) + return a.name + .toLocaleLowerCase() + .localeCompare(b.name.toLocaleLowerCase()) }) } diff --git a/module/items/sheets/archetype.js b/module/items/sheets/archetype.js index 5ef467ee..2aae2f95 100644 --- a/module/items/sheets/archetype.js +++ b/module/items/sheets/archetype.js @@ -36,19 +36,19 @@ export class CoC7ArchetypeSheet extends ItemSheet { const collection = this.item.data.data[collectionName] ? duplicate(this.item.data.data[collectionName]) : [] - dataList.forEach(async item => { - if (!item || !item.data) return + for (const item of dataList) { + if (!item || !item.data) continue if (![type].includes(item.data.type)) { - return + continue } if (!CoC7Item.isAnySpec(item)) { if (collection.find(el => el.name === item.data.name)) { - return + continue } } collection.push(duplicate(item.data)) - }) + } await this.item.update({ [`data.${collectionName}`]: collection }) } @@ -67,7 +67,7 @@ export class CoC7ArchetypeSheet extends ItemSheet { } else { const div = $(`Clicking the lock will allow modification of the sheet.
\nWhen sheet is unlock you can modify things directly from the sheet. You can also open the entities sheets and delete things.
\nIn that mode you can create skills/possessions by clicking the + icon. Holding shift will bypass the opening of the corresponding sheet.
\nYou can enter characteristics as numbers and as formulas. Click the right icon to toggle modes. Clicking the red dice will roll the formula when possible. So you can have your creature with defined values, or roll/reroll the value on demand.
\n"}},"items":{"0":{"name":["Slice PCs in small cubes","Pile of junk"],"value":75}}},"sort":100001,"flags":{},"img":"icons/svg/mystery-man.svg","token":{"flags":{},"name":"Creature example","displayName":0,"img":"icons/svg/sword.svg","tint":null,"width":1,"height":1,"scale":1,"lockRotation":false,"rotation":0,"vision":false,"dimSight":0,"brightSight":0,"dimLight":0,"brightLight":0,"sightAngle":360,"lightAngle":360,"lightAlpha":1,"lightAnimation":{"speed":5,"intensity":5},"actorId":"3z7VR4iGfJY8fQLG","actorLink":false,"disposition":-1,"displayBars":0,"bar1":{},"bar2":{},"randomImg":false},"items":[{"_id":"dLLdlRaQmkE9QYUJ","name":"Slice PCs in small cubes","type":"skill","data":{"specialization":"","description":{"value":"","opposingDifficulty":"","pushedFaillureConsequences":"","chat":""},"base":0,"value":"75","attributes":{},"properties":{"special":false,"rarity":false,"push":false,"combat":true,"shortlist":false},"eras":{},"flags":{}},"sort":100000,"flags":{},"img":"systems/CoC7/assets/icons/skills.svg","effects":[]},{"_id":"H30y50QJUdx9Xjii","name":"Deadly claws","type":"weapon","data":{"description":{"value":"
Description of the weapon
\nselecting 'Area of effect' will enable 3 different damage and range
\nselecting 'Full-auto' will allow 2 different skilss to be selected for the weapon
\nselecting 'Special' will activate the special input field
\nIn the combat tab, if the icons are with a red background, it means that no skill have been selected for that weapon
\nEdit the weapon and select the correct skill.
","chat":"","special":"You can add special description or slugs there :
\nSlug 1 : 2d17kh
"},"wpnType":"","skill":{"main":{"name":"To be selected once the weapon is owned","id":"dLLdlRaQmkE9QYUJ"},"alternativ":{"name":"","id":""}},"range":{"normal":{"value":"15ft","units":"","damage":"10d6"},"long":{"value":"25ft","units":"","damage":"2d6"},"extreme":{"value":"35ft","units":"","damage":"3d6"}},"usesPerRound":{"normal":"","max":""},"bullets":"","malfunction":"85","properties":{"rngd":false,"impl":false,"rare":false,"ahdb":false,"addb":false,"slnt":false,"xplv":false,"brst":true,"auto":false,"spcl":true,"mont":false,"dbrl":false,"blst":false,"stun":false},"eras":{"1920":true,"nvct":false,"drka":false,"ddts":false,"glit":false,"pulp":false,"mdrn":true},"price":{"1920":"5$","mdrn":"6$"}},"sort":100001,"flags":{},"img":"icons/svg/sword.svg","effects":[]},{"_id":"i6nvPoQNE6CTSz5C","name":"Pile of junk","type":"item","data":{"description":"","quantity":1,"weight":0,"attributes":{}},"sort":200001,"flags":{},"img":"icons/svg/item-bag.svg","effects":[]},{"_id":"blVIcQR6OUZ4LeqG","name":"Fighting","type":"skill","data":{"specialization":"Fighting","description":{"value":"","opposingDifficulty":"","pushedFaillureConsequences":"","chat":""},"base":0,"value":"50","attributes":{},"properties":{"combat":true,"fighting":true,"special":true},"eras":{},"flags":{}},"sort":300001,"flags":{},"img":"systems/CoC7/assets/icons/skills.svg","effects":[]},{"_id":"izZoClJXLwUpoiy7","name":"Innate attack","type":"weapon","data":{"description":{"value":"Creature's natural attack","chat":"Creature's natural attack","special":""},"wpnType":"innate","skill":{"main":{"name":"Fighting","id":"blVIcQR6OUZ4LeqG"},"alternativ":{"name":"","id":""}},"range":{"normal":{"value":0,"units":"","damage":"1d3"},"long":{"value":0,"units":"","damage":""},"extreme":{"value":0,"units":"","damage":""}},"usesPerRound":{"normal":"","max":""},"bullets":"","malfunction":"","properties":{"addb":true,"slnt":true},"eras":{},"price":{}},"sort":400001,"flags":{},"img":"icons/svg/mystery-man.svg","effects":[]}],"effects":[]} -{"_id":"6FdxkxUI1uwDtElA","name":"Goon","permission":{"default":0,"6Y6opwuMdxc52cY3":3},"type":"npc","data":{"characteristics":{"str":{"value":null,"short":"CHARAC.STR","label":"CHARAC.Strengh","formula":"5*2d6+6"},"con":{"value":null,"short":"CHARAC.CON","label":"CHARAC.Constitution","formula":"5*3d6"},"siz":{"value":null,"short":"CHARAC.SIZ","label":"CHARAC.Size","formula":"5*3d6"},"dex":{"value":null,"short":"CHARAC.DEX","label":"CHARAC.Dexterity","formula":"5*3d6"},"app":{"value":null,"short":"CHARAC.APP","label":"CHARAC.Appearance","formula":"5*1d6"},"int":{"value":null,"short":"CHARAC.INT","label":"CHARAC.Intelligence","formula":"5*1d6"},"pow":{"value":null,"short":"CHARAC.POW","label":"CHARAC.Power","formula":"0"},"edu":{"value":null,"short":"CHARAC.EDU","label":"CHARAC.Education","formula":"0"}},"attribs":{"hp":{"value":null,"max":null,"short":"HP","label":"Hit points","auto":true},"mp":{"value":null,"max":null,"short":"HP","label":"Magic points","auto":true},"lck":{"value":null,"short":"LCK","label":"Luck","max":0},"san":{"value":50,"max":99,"short":"SAN","label":"Sanity","auto":true},"mov":{"value":null,"short":"MOV","label":"Movement rate","auto":true},"db":{"value":"","short":"DB","label":"Damage bonus","auto":true},"build":{"value":null,"short":"BLD","label":"Build","auto":true},"armor":{"value":null,"auto":false}},"status":{"criticalWounds":{"type":"Boolean","value":false},"unconscious":{"type":"Boolean","value":false},"dying":{"type":"Boolean","value":false},"tempoInsane":{"type":"boolean","value":false},"indefInsane":{"type":"boolean","value":false}},"personalDescription":{"type":"string","value":""},"infos":{"occupation":"Obey to the vilain","age":"Average","sex":"","organization":""},"flags":{"locked":true,"displayFormula":false},"items":{"0":{"name":["Bark orders","Plan to enslave humanity"],"value":45},"1":{"name":["Be a pain","Very mean sidekick"],"value":50},"2":{"name":"Dodge","value":null},"3":{"name":"Brawl","value":25},"4":{"name":"Shotgun","value":25},"5":{"name":"Language (Own)","value":null},"6":{"name":"Takeover the world","value":80},"7":{"name":"Torment the PC","value":75}}},"sort":100001,"flags":{},"img":"icons/svg/mystery-man.svg","token":{"flags":{},"name":"Vilain example","displayName":0,"img":"icons/svg/mystery-man.svg","tint":null,"width":1,"height":1,"scale":1,"lockRotation":false,"rotation":0,"vision":false,"dimSight":0,"brightSight":0,"dimLight":0,"brightLight":0,"sightAngle":360,"lightAngle":360,"lightAlpha":1,"lightAnimation":{"speed":5,"intensity":5},"actorId":"6FdxkxUI1uwDtElA","actorLink":false,"disposition":-1,"displayBars":0,"bar1":{},"bar2":{},"randomImg":false},"items":[{"_id":"MLzJUjOk8pGvbark","name":"Be a pain","type":"skill","data":{"specialization":"","description":{"value":"","opposingDifficulty":"","pushedFaillureConsequences":"","chat":""},"base":0,"value":"50","attributes":{},"properties":{"special":false,"rarity":false,"push":true,"combat":false,"shortlist":false},"eras":{},"flags":{}},"sort":400000,"flags":{},"img":"systems/CoC7/assets/icons/skills.svg","effects":[]},{"_id":"vahGLRAWBleHGipn","name":"Try hard","type":"skill","data":{"specialization":"","description":{"value":"","opposingDifficulty":"","pushedFaillureConsequences":"","chat":""},"base":0,"value":"10","attributes":{},"properties":{"special":false,"rarity":false,"push":true,"combat":false,"shortlist":false},"eras":{},"flags":{}},"sort":600000,"flags":{},"img":"systems/CoC7/assets/icons/skills.svg","effects":[]},{"_id":"MzS8tNzfklkMETxe","name":"Orders","type":"item","data":{"description":"","quantity":1,"weight":0,"attributes":{}},"sort":700000,"flags":{},"img":"icons/svg/item-bag.svg","effects":[]},{"_id":"55AtqIMUTt5uER3Z","name":"Secret documents","type":"item","data":{"description":"","quantity":1,"weight":0,"attributes":{}},"sort":800000,"flags":{},"img":"icons/svg/item-bag.svg","effects":[]},{"_id":"bP89oaMSNTuMQdt5","name":"Punch","type":"weapon","data":{"description":{"value":"Description of the weapon
\nselecting 'Area of effect' will enable 3 different damage and range
\nselecting 'Full-auto' will allow 2 different skilss to be selected for the weapon
\nselecting 'Special' will activate the special input field
\nIn the combat tab, if the icons are with a red background, it means that no skill have been selected for that weapon
\nEdit the weapon and select the correct skill.
","chat":"","special":"You can add special description or slugs there :
\nSlug 1 : 2d17kh
"},"wpnType":"","skill":{"main":{"name":"Brawl","id":"EUUoTqgF104Htwp5"},"alternativ":{"name":"","id":"GpHiBjo9O4FrPzdl"}},"range":{"normal":{"value":"15ft","units":"","damage":"1d3"},"long":{"value":"25ft","units":"","damage":"2d6"},"extreme":{"value":"35ft","units":"","damage":"3d6"}},"usesPerRound":{"normal":"","max":""},"bullets":"","malfunction":"85","properties":{"rngd":false,"impl":false,"rare":false,"ahdb":false,"addb":true,"slnt":true,"xplv":false,"brst":false,"auto":false,"spcl":false,"mont":false,"dbrl":false,"blst":false,"stun":false},"eras":{"1920":true,"nvct":false,"drka":false,"ddts":false,"glit":false,"pulp":false,"mdrn":true},"price":{"1920":"5$","mdrn":"6$"}},"sort":100001,"flags":{},"img":"icons/svg/sword.svg","effects":[]},{"_id":"GpHiBjo9O4FrPzdl","name":"Shotgun","type":"skill","data":{"specialization":"Firearms","description":{"value":"See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty":"","pushedFaillureConsequences":"","chat":""},"base":"25","value":"25","attributes":{},"properties":{"special":true,"rarity":false,"push":false,"combat":true,"firearm":true,"fighting":false},"eras":{"1920":true,"nvct":false,"drka":false,"ddts":false,"glit":false,"pulp":false,"mdrn":true},"flags":{}},"sort":6400000,"flags":{},"img":"systems/CoC7/assets/icons/skills.svg","effects":[]},{"_id":"DqmtcxhedeGwNdPb","name":"Dodge","type":"skill","data":{"specialization":"","description":{"value":"See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty":"","pushedFaillureConsequences":"","chat":""},"base":"1/2*@DEX","value":25,"attributes":{},"properties":{"special":false,"rarity":false,"push":false,"combat":true},"eras":{"1920":true,"nvct":false,"drka":false,"ddts":false,"glit":false,"pulp":false,"mdrn":true},"flags":{}},"sort":2200000,"flags":{},"img":"systems/CoC7/assets/icons/skills.svg","effects":[]},{"_id":"EUUoTqgF104Htwp5","name":"Brawl","type":"skill","data":{"specialization":"Fighting","description":{"value":"See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty":"","pushedFaillureConsequences":"","chat":""},"base":"25","value":"65","attributes":{},"properties":{"special":true,"rarity":false,"push":false,"combat":true,"firearm":false,"fighting":true},"eras":{"1920":true,"nvct":false,"drka":false,"ddts":false,"glit":false,"pulp":false,"mdrn":true},"flags":{}},"sort":1100000,"flags":{},"img":"systems/CoC7/assets/icons/skills.svg","effects":[]},{"_id":"odgm7NgwjcrVBoRZ","name":"Language (Own)","type":"skill","data":{"specialization":"","description":{"value":"","opposingDifficulty":"","pushedFaillureConsequences":"","chat":""},"base":"@EDU","value":"@EDU","attributes":{},"properties":{"push":true,"special":false,"rarity":false,"combat":false},"eras":{"1920":true,"nvct":false,"drka":false,"ddts":false,"glit":false,"pulp":false,"mdrn":true},"flags":{}},"sort":4000000,"flags":{},"img":"systems/CoC7/assets/icons/skills.svg","effects":[]},{"_id":"Cgn0EMY6vNZ9iVHW","name":"Receive orders","type":"skill","data":{"specialization":"","description":{"value":"","opposingDifficulty":"","pushedFaillureConsequences":"","chat":""},"base":0,"value":"95","attributes":{},"properties":{"special":false,"rarity":false,"push":true,"combat":false,"shortlist":false},"eras":{},"flags":{}},"sort":6500000,"flags":{},"img":"systems/CoC7/assets/icons/skills.svg","effects":[]},{"_id":"SZhoTtcwS9wOPXBU","name":"Shotgun","type":"weapon","data":{"description":{"value":"Description of the weapon
\nselecting 'Area of effect' will enable 3 different damage and range
\nselecting 'Full-auto' will allow 2 different skilss to be selected for the weapon
\nselecting 'Special' will activate the special input field
\nIn the combat tab, if the icons are with a red background, it means that no skill have been selected for that weapon
\nEdit the weapon and select the correct skill.
","chat":"","special":"You can add special description or slugs there :
\nSlug 1 : 2d17kh
"},"wpnType":"","skill":{"main":{"name":"Shotgun","id":"GpHiBjo9O4FrPzdl"},"alternativ":{"name":"Shotgun","id":"GpHiBjo9O4FrPzdl"}},"range":{"normal":{"value":"15ft","units":"","damage":"1d6"},"long":{"value":"25ft","units":"","damage":"2d6"},"extreme":{"value":"35ft","units":"","damage":"3d6"}},"usesPerRound":{"normal":"","max":""},"bullets":"","malfunction":"85","properties":{"rngd":true,"impl":false,"rare":false,"ahdb":false,"addb":false,"slnt":false,"xplv":true,"brst":false,"auto":false,"spcl":false,"mont":false,"dbrl":false,"blst":false,"stun":false},"eras":{"1920":true,"nvct":false,"drka":false,"ddts":false,"glit":false,"pulp":false,"mdrn":true},"price":{"1920":"5$","mdrn":"6$"}},"sort":100001,"flags":{},"img":"icons/svg/sword.svg","effects":[]},{"_id":"yfEPFv1QVtPS8pJQ","name":"Club","type":"weapon","data":{"description":{"value":"","chat":"","special":""},"wpnType":"","skill":{"main":{"name":"","id":"EUUoTqgF104Htwp5"},"alternativ":{"name":"","id":""}},"range":{"normal":{"value":0,"units":"","damage":"1d4"},"long":{"value":0,"units":"","damage":""},"extreme":{"value":0,"units":"","damage":""}},"usesPerRound":{"normal":"","max":""},"bullets":"","malfunction":"","properties":{"rngd":false,"impl":false,"rare":false,"ahdb":true,"addb":false,"slnt":true,"xplv":false,"brst":false,"auto":false,"spcl":false,"mont":false,"dbrl":false,"blst":false,"stun":true},"eras":{"1920":false,"nvct":false,"drka":false,"ddts":false,"glit":false,"pulp":false,"mdrn":false},"price":{"1920":0,"nvct":0,"drka":0,"ddts":0,"glit":0,"pulp":0,"mdrn":0}},"sort":6600000,"flags":{},"img":"icons/svg/sword.svg","effects":[]}],"effects":[]} -{"_id":"F7NaTPsNa9YdF1JD","name":"Vilain example","permission":{"default":0,"6Y6opwuMdxc52cY3":3},"type":"npc","data":{"characteristics":{"str":{"value":50,"short":"CHARAC.STR","label":"CHARAC.Strengh","formula":null},"con":{"value":50,"short":"CHARAC.CON","label":"CHARAC.Constitution","formula":null},"siz":{"value":50,"short":"CHARAC.SIZ","label":"CHARAC.Size","formula":null},"dex":{"value":50,"short":"CHARAC.DEX","label":"CHARAC.Dexterity","formula":null},"app":{"value":50,"short":"CHARAC.APP","label":"CHARAC.Appearance","formula":null},"int":{"value":50,"short":"CHARAC.INT","label":"CHARAC.Intelligence","formula":null},"pow":{"value":50,"short":"CHARAC.POW","label":"CHARAC.Power","formula":null},"edu":{"value":50,"short":"CHARAC.EDU","label":"CHARAC.Education","formula":null}},"attribs":{"hp":{"value":10,"max":10,"short":"HP","label":"Hit points","auto":true},"mp":{"value":10,"max":10,"short":"HP","label":"Magic points","auto":true},"lck":{"value":null,"short":"LCK","label":"Luck","max":0},"san":{"value":50,"max":99,"short":"SAN","label":"Sanity","auto":true},"mov":{"value":null,"short":"MOV","label":"Movement rate","auto":true},"db":{"value":"","short":"DB","label":"Damage bonus","auto":true},"build":{"value":null,"short":"BLD","label":"Build","auto":true},"armor":{"value":null,"auto":false}},"status":{"criticalWounds":{"type":"Boolean","value":false},"unconscious":{"type":"Boolean","value":false},"dying":{"type":"Boolean","value":false},"tempoInsane":{"type":"boolean","value":false},"indefInsane":{"type":"boolean","value":false}},"personalDescription":{"type":"string","value":""},"infos":{"occupation":"Be a vilain","age":"Very old","sex":"","organization":""},"flags":{"locked":true,"displayFormula":false},"items":{"0":{"name":["Bark orders","Plan to enslave humanity"],"value":45},"1":{"name":["Be a pain","Very mean sidekick"],"value":50},"2":{"name":"Dodge","value":null},"3":{"name":"Brawl","value":25},"4":{"name":"Shotgun","value":25},"5":{"name":"Language (Own)","value":null},"6":{"name":"Takeover the world","value":80},"7":{"name":"Torment the PC","value":75}}},"sort":100001,"flags":{},"img":"icons/svg/mystery-man.svg","token":{"flags":{},"name":"Vilain example","displayName":0,"img":"icons/svg/mystery-man.svg","tint":null,"width":1,"height":1,"scale":1,"lockRotation":false,"rotation":0,"vision":false,"dimSight":0,"brightSight":0,"dimLight":0,"brightLight":0,"sightAngle":360,"lightAngle":360,"lightAlpha":1,"lightAnimation":{"speed":5,"intensity":5},"actorId":"F7NaTPsNa9YdF1JD","actorLink":false,"disposition":-1,"displayBars":0,"bar1":{},"bar2":{},"randomImg":false},"items":[{"_id":"MLzJUjOk8pGvbark","name":"Be a pain","type":"skill","data":{"specialization":"","description":{"value":"","opposingDifficulty":"","pushedFaillureConsequences":"","chat":""},"base":0,"value":"50","attributes":{},"properties":{"special":false,"rarity":false,"push":true,"combat":false,"shortlist":false},"eras":{},"flags":{}},"sort":400000,"flags":{},"img":"systems/CoC7/assets/icons/skills.svg","effects":[]},{"_id":"MUMDYUZ4xaEPfwin","name":"Takeover the world","type":"skill","data":{"specialization":"","description":{"value":"","opposingDifficulty":"","pushedFaillureConsequences":"","chat":""},"base":0,"value":"80","attributes":{},"properties":{"special":false,"rarity":false,"push":true,"combat":false,"shortlist":false},"eras":{},"flags":{}},"sort":500000,"flags":{},"img":"systems/CoC7/assets/icons/skills.svg","effects":[]},{"_id":"vahGLRAWBleHGipn","name":"Torment the PC","type":"skill","data":{"specialization":"","description":{"value":"","opposingDifficulty":"","pushedFaillureConsequences":"","chat":""},"base":0,"value":"75","attributes":{},"properties":{"special":false,"rarity":false,"push":true,"combat":false,"shortlist":false},"eras":{},"flags":{}},"sort":600000,"flags":{},"img":"systems/CoC7/assets/icons/skills.svg","effects":[]},{"_id":"MzS8tNzfklkMETxe","name":"Plan to enslave humanity","type":"item","data":{"description":"","quantity":1,"weight":0,"attributes":{}},"sort":700000,"flags":{},"img":"icons/svg/item-bag.svg","effects":[]},{"_id":"55AtqIMUTt5uER3Z","name":"Very mean sidekick","type":"item","data":{"description":"","quantity":1,"weight":0,"attributes":{}},"sort":800000,"flags":{},"img":"icons/svg/item-bag.svg","effects":[]},{"_id":"bP89oaMSNTuMQdt5","name":"Punch","type":"weapon","data":{"description":{"value":"Description of the weapon
\nselecting 'Area of effect' will enable 3 different damage and range
\nselecting 'Full-auto' will allow 2 different skilss to be selected for the weapon
\nselecting 'Special' will activate the special input field
\nIn the combat tab, if the icons are with a red background, it means that no skill have been selected for that weapon
\nEdit the weapon and select the correct skill.
","chat":"","special":"You can add special description or slugs there :
\nSlug 1 : 2d17kh
"},"wpnType":"","skill":{"main":{"name":"Brawl","id":"EUUoTqgF104Htwp5"},"alternativ":{"name":"","id":"GpHiBjo9O4FrPzdl"}},"range":{"normal":{"value":"15ft","units":"","damage":"1d6"},"long":{"value":"25ft","units":"","damage":"2d6"},"extreme":{"value":"35ft","units":"","damage":"3d6"}},"usesPerRound":{"normal":"","max":""},"bullets":"","malfunction":"85","properties":{"rngd":false,"impl":false,"rare":false,"ahdb":false,"addb":true,"slnt":false,"xplv":false,"brst":false,"auto":false,"spcl":false,"mont":false,"dbrl":false,"blst":false,"stun":false},"eras":{"1920":true,"nvct":false,"drka":false,"ddts":false,"glit":false,"pulp":false,"mdrn":true},"price":{"1920":"5$","mdrn":"6$"}},"sort":100001,"flags":{},"img":"icons/svg/sword.svg","effects":[]},{"_id":"GpHiBjo9O4FrPzdl","name":"Shotgun","type":"skill","data":{"specialization":"Firearms","description":{"value":"See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty":"","pushedFaillureConsequences":"","chat":""},"base":"25","value":"25","attributes":{},"properties":{"special":true,"rarity":false,"push":false,"combat":true,"firearm":true,"fighting":false},"eras":{"1920":true,"nvct":false,"drka":false,"ddts":false,"glit":false,"pulp":false,"mdrn":true},"flags":{}},"sort":6400000,"flags":{},"img":"systems/CoC7/assets/icons/skills.svg","effects":[]},{"_id":"DqmtcxhedeGwNdPb","name":"Dodge","type":"skill","data":{"specialization":"","description":{"value":"See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty":"","pushedFaillureConsequences":"","chat":""},"base":"1/2*@DEX","value":25,"attributes":{},"properties":{"special":false,"rarity":false,"push":false,"combat":true},"eras":{"1920":true,"nvct":false,"drka":false,"ddts":false,"glit":false,"pulp":false,"mdrn":true},"flags":{}},"sort":2200000,"flags":{},"img":"systems/CoC7/assets/icons/skills.svg","effects":[]},{"_id":"EUUoTqgF104Htwp5","name":"Brawl","type":"skill","data":{"specialization":"Fighting","description":{"value":"See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty":"","pushedFaillureConsequences":"","chat":""},"base":"25","value":"25","attributes":{},"properties":{"special":true,"rarity":false,"push":false,"combat":true,"firearm":false,"fighting":true},"eras":{"1920":true,"nvct":false,"drka":false,"ddts":false,"glit":false,"pulp":false,"mdrn":true},"flags":{}},"sort":1100000,"flags":{},"img":"systems/CoC7/assets/icons/skills.svg","effects":[]},{"_id":"odgm7NgwjcrVBoRZ","name":"Language (Own)","type":"skill","data":{"specialization":"","description":{"value":"","opposingDifficulty":"","pushedFaillureConsequences":"","chat":""},"base":"@EDU","value":50,"attributes":{},"properties":{"push":true,"special":false,"rarity":false,"combat":false},"eras":{"1920":true,"nvct":false,"drka":false,"ddts":false,"glit":false,"pulp":false,"mdrn":true},"flags":{}},"sort":4000000,"flags":{},"img":"systems/CoC7/assets/icons/skills.svg","effects":[]},{"_id":"Cgn0EMY6vNZ9iVHW","name":"Bark orders","type":"skill","data":{"specialization":"","description":{"value":"","opposingDifficulty":"","pushedFaillureConsequences":"","chat":""},"base":0,"value":"45","attributes":{},"properties":{"special":false,"rarity":false,"push":true,"combat":false,"shortlist":false},"eras":{},"flags":{}},"sort":6500000,"flags":{},"img":"systems/CoC7/assets/icons/skills.svg","effects":[]},{"_id":"SZhoTtcwS9wOPXBU","name":"My test weapon","type":"weapon","data":{"description":{"value":"Description of the weapon
\nselecting 'Area of effect' will enable 3 different damage and range
\nselecting 'Full-auto' will allow 2 different skilss to be selected for the weapon
\nselecting 'Special' will activate the special input field
\nIn the combat tab, if the icons are with a red background, it means that no skill have been selected for that weapon
\nEdit the weapon and select the correct skill.
","chat":"","special":"You can add special description or slugs there :
\nSlug 1 : 2d17kh
"},"wpnType":"","skill":{"main":{"name":"Shotgun","id":"GpHiBjo9O4FrPzdl"},"alternativ":{"name":"Shotgun","id":"GpHiBjo9O4FrPzdl"}},"range":{"normal":{"value":"15ft","units":"","damage":"1d6"},"long":{"value":"25ft","units":"","damage":"2d6"},"extreme":{"value":"35ft","units":"","damage":"3d6"}},"usesPerRound":{"normal":"","max":""},"bullets":"","malfunction":"85","properties":{"rngd":true,"impl":false,"rare":false,"ahdb":false,"addb":false,"slnt":false,"xplv":true,"brst":true,"auto":true,"spcl":false,"mont":false,"dbrl":false,"blst":false,"stun":false},"eras":{"1920":true,"nvct":false,"drka":false,"ddts":false,"glit":false,"pulp":false,"mdrn":true},"price":{"1920":"5$","mdrn":"6$"}},"sort":100001,"flags":{},"img":"icons/svg/sword.svg","effects":[]}],"effects":[]} -{"_id":"oRob2oqTWrybfLVU","name":"1920 Character","permission":{"default":0,"6Y6opwuMdxc52cY3":3},"type":"character","data":{"characteristics":{"str":{"value":null,"short":"CHARAC.STR","label":"CHARAC.Strengh","formula":null},"con":{"value":null,"short":"CHARAC.CON","label":"CHARAC.Constitution","formula":null},"siz":{"value":null,"short":"CHARAC.SIZ","label":"CHARAC.Size","formula":null},"dex":{"value":null,"short":"CHARAC.DEX","label":"CHARAC.Dexterity","formula":null},"app":{"value":null,"short":"CHARAC.APP","label":"CHARAC.Appearance","formula":null},"int":{"value":null,"short":"CHARAC.INT","label":"CHARAC.Intelligence","formula":null},"pow":{"value":null,"short":"CHARAC.POW","label":"CHARAC.Power","formula":null},"edu":{"value":null,"short":"CHARAC.EDU","label":"CHARAC.Education","formula":null}},"attribs":{"hp":{"value":null,"max":null,"short":"HP","label":"Hit points","auto":true},"mp":{"value":null,"max":null,"short":"HP","label":"Magic points","auto":true},"lck":{"value":null,"short":"LCK","label":"Luck","max":99},"san":{"value":null,"max":99,"short":"SAN","label":"Sanity","auto":true},"mov":{"value":"auto","short":"MOV","label":"Movement rate","auto":true},"db":{"value":"-2","short":"DB","label":"Damage bonus","auto":true},"build":{"value":"auto","short":"BLD","label":"Build","auto":true},"armor":{"value":null,"auto":false}},"status":{"criticalWounds":{"type":"Boolean","value":false},"unconscious":{"type":"Boolean","value":false},"dying":{"type":"Boolean","value":false},"dead":{"type":"Boolean","value":false},"prone":{"type":"Boolean","value":false},"tempoInsane":{"type":"boolean","value":false},"indefInsane":{"type":"boolean","value":false}},"infos":{"occupation":"","age":"","sex":"","residence":"","birthplace":"","archetype":"","organization":""},"flags":{"locked":true,"manualCredit":false},"credit":{"monetarySymbol":"","multiplier":null,"spent":"","assetsDetails":""},"development":{"personal":null,"occupation":null,"archetype":null},"biography":[{"title":"Personal Description","value":null},{"title":"Ideology/Beliefs","value":null},{"title":"Significant People","value":null},{"title":"Meaningful Locations","value":null},{"title":"Treasured Possessions","value":null},{"title":"Traits","value":null}],"encounteredCreatures":[],"personalDescription":{"type":"string","value":""},"indefiniteInsanityLevel":{"value":0,"max":0},"adjustments":{"personal":["","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","",""],"experience":["","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","",""]}},"sort":100001,"flags":{},"img":"icons/svg/mystery-man.svg","token":{"flags":{},"name":"1920 Character","displayName":0,"img":"icons/svg/mystery-man.svg","tint":null,"width":1,"height":1,"scale":1,"lockRotation":false,"rotation":0,"vision":false,"dimSight":0,"brightSight":0,"dimLight":0,"brightLight":0,"sightAngle":360,"lightAngle":360,"lightAlpha":1,"lightAnimation":{"speed":5,"intensity":5},"actorId":"oRob2oqTWrybfLVU","actorLink":false,"disposition":-1,"displayBars":0,"bar1":{},"bar2":{},"randomImg":false},"items":[{"_id":"E3y6HmUAZGyAv5zM","name":"Accounting","type":"skill","data":{"specialization":"","description":{"value":"See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty":"","pushedFaillureConsequences":"","chat":""},"base":"5","adjustments":{"personal":null,"occupation":null,"archetype":null,"experience":null},"value":null,"attributes":{},"properties":{"special":false,"rarity":false,"push":true,"combat":false},"eras":{"1920":true,"nvct":false,"drka":false,"ddts":false,"glit":false,"pulp":false,"mdrn":true},"flags":{}},"sort":100000,"flags":{},"img":"systems/CoC7/assets/icons/skills.svg","effects":[]},{"_id":"XhHYF5tSQj8n7nIt","name":"Anthropology","type":"skill","data":{"specialization":"","description":{"value":"See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty":"","pushedFaillureConsequences":"","chat":""},"base":"1","adjustments":{"personal":null,"occupation":null,"archetype":null,"experience":null},"value":null,"attributes":{},"properties":{"push":true,"special":false,"rarity":false,"combat":false},"eras":{"1920":true,"nvct":false,"drka":false,"ddts":false,"glit":false,"pulp":false,"mdrn":true},"flags":{}},"sort":200000,"flags":{},"img":"systems/CoC7/assets/icons/skills.svg","effects":[]},{"_id":"VDsiVSMGcoUXCxdw","name":"Appraise","type":"skill","data":{"specialization":"","description":{"value":"See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty":"","pushedFaillureConsequences":"","chat":""},"base":"5","adjustments":{"personal":null,"occupation":null,"archetype":null,"experience":null},"value":null,"attributes":{},"properties":{"push":true,"special":false,"rarity":false,"combat":false},"eras":{"1920":true,"nvct":false,"drka":false,"ddts":false,"glit":false,"pulp":false,"mdrn":true},"flags":{}},"sort":300000,"flags":{},"img":"systems/CoC7/assets/icons/skills.svg","effects":[]},{"_id":"lDsTVk3C1CALLJV9","name":"Charm","type":"skill","data":{"specialization":"","description":{"value":"See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty":"","pushedFaillureConsequences":"","chat":""},"base":"15","adjustments":{"personal":null,"occupation":null,"archetype":null,"experience":null},"value":null,"attributes":{},"properties":{"special":false,"rarity":false,"push":true,"combat":false},"eras":{"1920":true,"nvct":false,"drka":false,"ddts":false,"glit":false,"pulp":false,"mdrn":true},"flags":{}},"sort":400000,"flags":{},"img":"systems/CoC7/assets/icons/skills.svg","effects":[]},{"_id":"k4q7dNE6yyaWvg6t","name":"Credit Rating","type":"skill","data":{"specialization":"","description":{"value":"See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty":"","pushedFaillureConsequences":"","chat":""},"base":"0","adjustments":{"personal":null,"occupation":null,"archetype":null,"experience":null},"value":null,"attributes":{},"properties":{"special":false,"rarity":false,"push":true,"combat":false,"noxpgain":true},"eras":{"1920":true,"nvct":false,"drka":false,"ddts":false,"glit":false,"pulp":false,"mdrn":true},"flags":{}},"sort":500000,"flags":{},"img":"systems/CoC7/assets/icons/skills.svg","effects":[]},{"_id":"U82PaYvshoVvFLTt","name":"Cthulhu Mythos","type":"skill","data":{"specialization":"","description":{"value":"See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty":"","pushedFaillureConsequences":"","chat":""},"base":"0","adjustments":{"personal":null,"occupation":null,"archetype":null,"experience":null},"value":null,"attributes":{},"properties":{"special":false,"rarity":false,"push":false,"combat":false,"noxpgain":true},"eras":{"1920":true,"nvct":false,"drka":false,"ddts":false,"glit":false,"pulp":false,"mdrn":true},"flags":{}},"sort":600000,"flags":{},"img":"systems/CoC7/assets/icons/skills.svg","effects":[]},{"_id":"J0lo87g53txd5SLS","name":"Disguise","type":"skill","data":{"specialization":"","description":{"value":"See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty":"","pushedFaillureConsequences":"","chat":""},"base":"5","adjustments":{"personal":null,"occupation":null,"archetype":null,"experience":null},"value":null,"attributes":{},"properties":{"special":false,"rarity":false,"push":true,"combat":false},"eras":{"1920":true,"nvct":false,"drka":false,"ddts":false,"glit":false,"pulp":false,"mdrn":true},"flags":{}},"sort":700000,"flags":{},"img":"systems/CoC7/assets/icons/skills.svg","effects":[]},{"_id":"84CUVd7oXCBoDRh7","name":"Dodge","type":"skill","data":{"specialization":"","description":{"value":"See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty":"","pushedFaillureConsequences":"","chat":""},"base":"1/2 @DEX","adjustments":{"personal":null,"occupation":null,"archetype":null,"experience":null},"value":null,"attributes":{},"properties":{"special":false,"rarity":false,"push":false,"combat":true},"eras":{"1920":true,"nvct":false,"drka":false,"ddts":false,"glit":false,"pulp":false,"mdrn":true},"flags":{}},"sort":800000,"flags":{},"img":"systems/CoC7/assets/icons/skills.svg","effects":[]},{"_id":"bHgRyyed99nleqcG","name":"Drive Auto","type":"skill","data":{"specialization":"","description":{"value":"See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty":"","pushedFaillureConsequences":"","chat":""},"base":"20","adjustments":{"personal":null,"occupation":null,"archetype":null,"experience":null},"value":null,"attributes":{},"properties":{"special":false,"rarity":false,"push":true,"combat":false},"eras":{"1920":true,"nvct":false,"drka":false,"ddts":false,"glit":false,"pulp":false,"mdrn":true},"flags":{}},"sort":900000,"flags":{},"img":"systems/CoC7/assets/icons/skills.svg","effects":[]},{"_id":"lYpc5wP0ocjfX38X","name":"Electrical Repair","type":"skill","data":{"specialization":"","description":{"value":"See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty":"","pushedFaillureConsequences":"","chat":""},"base":"10","adjustments":{"personal":null,"occupation":null,"archetype":null,"experience":null},"value":null,"attributes":{},"properties":{"push":true,"special":false,"rarity":false,"combat":false},"eras":{"1920":true,"nvct":false,"drka":false,"ddts":false,"glit":false,"pulp":false,"mdrn":true},"flags":{}},"sort":1000000,"flags":{},"img":"systems/CoC7/assets/icons/skills.svg","effects":[]},{"_id":"rDU26YAzBpBMQP27","name":"Fast Talk","type":"skill","data":{"specialization":"","description":{"value":"See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty":"","pushedFaillureConsequences":"","chat":""},"base":"5","adjustments":{"personal":null,"occupation":null,"archetype":null,"experience":null},"value":null,"attributes":{},"properties":{"special":false,"rarity":false,"push":true,"combat":false},"eras":{"1920":true,"nvct":false,"drka":false,"ddts":false,"glit":false,"pulp":false,"mdrn":true},"flags":{}},"sort":1100000,"flags":{},"img":"systems/CoC7/assets/icons/skills.svg","effects":[]},{"_id":"kjaEOLz2p8ZrEowW","name":"Brawl","type":"skill","data":{"specialization":"Fighting","description":{"value":"See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty":"","pushedFaillureConsequences":"","chat":""},"base":"25","adjustments":{"personal":null,"occupation":null,"archetype":null,"experience":null},"value":null,"attributes":{},"properties":{"special":true,"rarity":false,"push":false,"combat":true,"firearm":false,"fighting":true},"eras":{"1920":true,"nvct":false,"drka":false,"ddts":false,"glit":false,"pulp":false,"mdrn":true},"flags":{}},"sort":1200000,"flags":{},"img":"systems/CoC7/assets/icons/skills.svg","effects":[]},{"_id":"O6xeAxF7aEY8zHdm","name":"Handgun","type":"skill","data":{"specialization":"Firearms","description":{"value":"See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty":"","pushedFaillureConsequences":"","chat":""},"base":"20","adjustments":{"personal":null,"occupation":null,"archetype":null,"experience":null},"value":null,"attributes":{},"properties":{"special":true,"rarity":false,"push":false,"combat":true,"firearm":true,"fighting":false},"eras":{"1920":true,"nvct":false,"drka":false,"ddts":false,"glit":false,"pulp":false,"mdrn":true},"flags":{}},"sort":1300000,"flags":{},"img":"systems/CoC7/assets/icons/skills.svg","effects":[]},{"_id":"MaFf4EBxPNbDiFoZ","name":"Shotgun","type":"skill","data":{"specialization":"Firearms","description":{"value":"See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty":"","pushedFaillureConsequences":"","chat":""},"base":"25","adjustments":{"personal":null,"occupation":null,"archetype":null,"experience":null},"value":null,"attributes":{},"properties":{"special":true,"rarity":false,"push":false,"combat":true,"firearm":true,"fighting":false},"eras":{"1920":true,"nvct":false,"drka":false,"ddts":false,"glit":false,"pulp":false,"mdrn":true},"flags":{}},"sort":1400000,"flags":{},"img":"systems/CoC7/assets/icons/skills.svg","effects":[]},{"_id":"ZI31AYDfuXNjE6W9","name":"First Aid","type":"skill","data":{"specialization":"","description":{"value":"See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty":"","pushedFaillureConsequences":"","chat":""},"base":"30","adjustments":{"personal":null,"occupation":null,"archetype":null,"experience":null},"value":null,"attributes":{},"properties":{"push":true,"special":false,"rarity":false,"combat":false},"eras":{"1920":true,"nvct":false,"drka":false,"ddts":false,"glit":false,"pulp":false,"mdrn":true},"flags":{}},"sort":1500000,"flags":{},"img":"systems/CoC7/assets/icons/skills.svg","effects":[]},{"_id":"2LmfyHywLRLjfYZK","name":"History","type":"skill","data":{"specialization":"","description":{"value":"See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty":"","pushedFaillureConsequences":"","chat":""},"base":"5","adjustments":{"personal":null,"occupation":null,"archetype":null,"experience":null},"value":null,"attributes":{},"properties":{"special":false,"rarity":false,"push":true,"combat":false},"eras":{"1920":true,"nvct":false,"drka":false,"ddts":false,"glit":false,"pulp":false,"mdrn":true},"flags":{}},"sort":1600000,"flags":{},"img":"systems/CoC7/assets/icons/skills.svg","effects":[]},{"_id":"pW0uDSp9w8CFCPLN","name":"Intimidate","type":"skill","data":{"specialization":"","description":{"value":"See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty":"","pushedFaillureConsequences":"","chat":""},"base":"15","adjustments":{"personal":null,"occupation":null,"archetype":null,"experience":null},"value":null,"attributes":{},"properties":{"special":false,"rarity":false,"push":true,"combat":false},"eras":{"1920":true,"nvct":false,"drka":false,"ddts":false,"glit":false,"pulp":false,"mdrn":true},"flags":{}},"sort":1700000,"flags":{},"img":"systems/CoC7/assets/icons/skills.svg","effects":[]},{"_id":"1WVyK6rnfd5LiwZF","name":"Jump","type":"skill","data":{"specialization":"","description":{"value":"See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty":"","pushedFaillureConsequences":"","chat":""},"base":"20","adjustments":{"personal":null,"occupation":null,"archetype":null,"experience":null},"value":null,"attributes":{},"properties":{"push":true,"special":false,"rarity":false,"combat":false},"eras":{"1920":true,"nvct":false,"drka":false,"ddts":false,"glit":false,"pulp":false,"mdrn":true},"flags":{}},"sort":1800000,"flags":{},"img":"systems/CoC7/assets/icons/skills.svg","effects":[]},{"_id":"eYqdGfBBKGBihakf","name":"Language (Own)","type":"skill","data":{"specialization":"","description":{"value":"See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty":"","pushedFaillureConsequences":"","chat":""},"base":"@EDU","adjustments":{"personal":null,"occupation":null,"archetype":null,"experience":null},"value":null,"attributes":{},"properties":{"push":true,"special":false,"rarity":false,"combat":false},"eras":{"1920":true,"nvct":false,"drka":false,"ddts":false,"glit":false,"pulp":false,"mdrn":true},"flags":{}},"sort":1900000,"flags":{},"img":"systems/CoC7/assets/icons/skills.svg","effects":[]},{"_id":"IwRD21t2beB16frp","name":"Law","type":"skill","data":{"specialization":"","description":{"value":"See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty":"","pushedFaillureConsequences":"","chat":""},"base":"5","adjustments":{"personal":null,"occupation":null,"archetype":null,"experience":null},"value":null,"attributes":{},"properties":{"special":false,"rarity":false,"push":true,"combat":false},"eras":{"1920":true,"nvct":false,"drka":false,"ddts":false,"glit":false,"pulp":false,"mdrn":true},"flags":{}},"sort":2000000,"flags":{},"img":"systems/CoC7/assets/icons/skills.svg","effects":[]},{"_id":"m6cYXpQe1bY13JD8","name":"Library Use","type":"skill","data":{"specialization":"","description":{"value":"See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty":"","pushedFaillureConsequences":"","chat":""},"base":"20","adjustments":{"personal":null,"occupation":null,"archetype":null,"experience":null},"value":null,"attributes":{},"properties":{"special":false,"rarity":false,"push":true,"combat":false},"eras":{"1920":true,"nvct":false,"drka":false,"ddts":false,"glit":false,"pulp":false,"mdrn":true},"flags":{}},"sort":2100000,"flags":{},"img":"systems/CoC7/assets/icons/skills.svg","effects":[]},{"_id":"RW3uFJY5WH9lg49Z","name":"Climb","type":"skill","data":{"specialization":"","description":{"value":"See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty":"","pushedFaillureConsequences":"","chat":""},"base":"20","adjustments":{"personal":null,"occupation":null,"archetype":null,"experience":null},"value":null,"attributes":{},"properties":{"push":true,"special":false,"rarity":false,"combat":false},"eras":{"1920":true,"nvct":false,"drka":false,"ddts":false,"glit":false,"pulp":false,"mdrn":true},"flags":{}},"sort":2200000,"flags":{},"img":"systems/CoC7/assets/icons/skills.svg","effects":[]},{"_id":"AHG7Inw3sZTY6qWV","name":"Listen","type":"skill","data":{"specialization":"","description":{"value":"See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty":"","pushedFaillureConsequences":"","chat":""},"base":"20","adjustments":{"personal":null,"occupation":null,"archetype":null,"experience":null},"value":null,"attributes":{},"properties":{"push":true,"special":false,"rarity":false,"combat":false},"eras":{"1920":true,"nvct":false,"drka":false,"ddts":false,"glit":false,"pulp":false,"mdrn":true},"flags":{}},"sort":2300000,"flags":{},"img":"systems/CoC7/assets/icons/skills.svg","effects":[]},{"_id":"3Jysn2i3cSgykZHp","name":"Locksmith","type":"skill","data":{"specialization":"","description":{"value":"See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty":"","pushedFaillureConsequences":"","chat":""},"base":"1","adjustments":{"personal":null,"occupation":null,"archetype":null,"experience":null},"value":null,"attributes":{},"properties":{"push":true,"special":false,"rarity":false,"combat":false},"eras":{"1920":true,"nvct":false,"drka":false,"ddts":false,"glit":false,"pulp":false,"mdrn":true},"flags":{}},"sort":2400000,"flags":{},"img":"systems/CoC7/assets/icons/skills.svg","effects":[]},{"_id":"IbwXpzOw7IyzPqmI","name":"Mechanical Repair","type":"skill","data":{"specialization":"","description":{"value":"See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty":"","pushedFaillureConsequences":"","chat":""},"base":"10","adjustments":{"personal":null,"occupation":null,"archetype":null,"experience":null},"value":null,"attributes":{},"properties":{"special":false,"rarity":false,"push":true,"combat":false},"eras":{"1920":true,"nvct":false,"drka":false,"ddts":false,"glit":false,"pulp":false,"mdrn":true},"flags":{}},"sort":2500000,"flags":{},"img":"systems/CoC7/assets/icons/skills.svg","effects":[]},{"_id":"Mmy1vrySUmlMq8Wu","name":"Medicine","type":"skill","data":{"specialization":"","description":{"value":"See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty":"","pushedFaillureConsequences":"","chat":""},"base":"1","adjustments":{"personal":null,"occupation":null,"archetype":null,"experience":null},"value":null,"attributes":{},"properties":{"special":false,"rarity":false,"push":true,"combat":false},"eras":{"1920":true,"nvct":false,"drka":false,"ddts":false,"glit":false,"pulp":false,"mdrn":true},"flags":{}},"sort":2600000,"flags":{},"img":"systems/CoC7/assets/icons/skills.svg","effects":[]},{"_id":"PhzNWFslePSOjMeE","name":"Natural World","type":"skill","data":{"specialization":"","description":{"value":"See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty":"","pushedFaillureConsequences":"","chat":""},"base":"10","adjustments":{"personal":null,"occupation":null,"archetype":null,"experience":null},"value":null,"attributes":{},"properties":{"special":false,"rarity":false,"push":true,"combat":false},"eras":{"1920":true,"nvct":false,"drka":false,"ddts":false,"glit":false,"pulp":false,"mdrn":true},"flags":{}},"sort":2700000,"flags":{},"img":"systems/CoC7/assets/icons/skills.svg","effects":[]},{"_id":"kzdAswgR5VFrc8wH","name":"Navigate","type":"skill","data":{"specialization":"","description":{"value":"See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty":"","pushedFaillureConsequences":"","chat":""},"base":"10","adjustments":{"personal":null,"occupation":null,"archetype":null,"experience":null},"value":null,"attributes":{},"properties":{"special":false,"rarity":false,"push":true,"combat":false},"eras":{"1920":true,"nvct":false,"drka":false,"ddts":false,"glit":false,"pulp":false,"mdrn":true},"flags":{}},"sort":2800000,"flags":{},"img":"systems/CoC7/assets/icons/skills.svg","effects":[]},{"_id":"8Vz3jYVrRH4z6kZR","name":"Occult","type":"skill","data":{"specialization":"","description":{"value":"See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty":"","pushedFaillureConsequences":"","chat":""},"base":"5","adjustments":{"personal":null,"occupation":null,"archetype":null,"experience":null},"value":null,"attributes":{},"properties":{"special":false,"rarity":false,"push":true,"combat":false},"eras":{"1920":true,"nvct":false,"drka":false,"ddts":false,"glit":false,"pulp":false,"mdrn":true},"flags":{}},"sort":2900000,"flags":{},"img":"systems/CoC7/assets/icons/skills.svg","effects":[]},{"_id":"WPppQWg72tJf8Ufs","name":"Operate Heavy Machinery","type":"skill","data":{"specialization":"","description":{"value":"See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty":"","pushedFaillureConsequences":"","chat":""},"base":"1","adjustments":{"personal":null,"occupation":null,"archetype":null,"experience":null},"value":null,"attributes":{},"properties":{"push":true,"special":false,"rarity":false,"combat":false},"eras":{"1920":true,"nvct":false,"drka":false,"ddts":false,"glit":false,"pulp":false,"mdrn":true},"flags":{}},"sort":3000000,"flags":{},"img":"systems/CoC7/assets/icons/skills.svg","effects":[]},{"_id":"v2mCLTJ5uV9xcZtU","name":"Persuade","type":"skill","data":{"specialization":"","description":{"value":"See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty":"","pushedFaillureConsequences":"","chat":""},"base":"10","adjustments":{"personal":null,"occupation":null,"archetype":null,"experience":null},"value":null,"attributes":{},"properties":{"special":false,"rarity":false,"push":true,"combat":false},"eras":{"1920":true,"nvct":false,"drka":false,"ddts":false,"glit":false,"pulp":false,"mdrn":true},"flags":{}},"sort":3100000,"flags":{},"img":"systems/CoC7/assets/icons/skills.svg","effects":[]},{"_id":"OFaRTxDfNzPqnWPE","name":"Any","type":"skill","data":{"specialization":"Pilot","description":{"value":"See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty":"","pushedFaillureConsequences":"","chat":""},"base":"1","adjustments":{"personal":null,"occupation":null,"archetype":null,"experience":null},"value":null,"attributes":{},"properties":{"push":true,"special":true,"rarity":false,"combat":false},"eras":{"1920":true,"nvct":false,"drka":false,"ddts":false,"glit":false,"pulp":false,"mdrn":true},"flags":{}},"sort":3200000,"flags":{},"img":"systems/CoC7/assets/icons/skills.svg","effects":[]},{"_id":"3RIMHZyf9dI5HIOF","name":"Psychoanalysis","type":"skill","data":{"specialization":"","description":{"value":"See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty":"","pushedFaillureConsequences":"","chat":""},"base":"1","adjustments":{"personal":null,"occupation":null,"archetype":null,"experience":null},"value":null,"attributes":{},"properties":{"push":true,"special":false,"rarity":false,"combat":false},"eras":{"1920":true,"nvct":false,"drka":false,"ddts":false,"glit":false,"pulp":false,"mdrn":true},"flags":{}},"sort":3300000,"flags":{},"img":"systems/CoC7/assets/icons/skills.svg","effects":[]},{"_id":"IChZCFGH2cJeQmmw","name":"Psychology","type":"skill","data":{"specialization":"","description":{"value":"See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty":"","pushedFaillureConsequences":"","chat":""},"base":"10","adjustments":{"personal":null,"occupation":null,"archetype":null,"experience":null},"value":null,"attributes":{},"properties":{"push":true,"special":false,"rarity":false,"combat":false},"eras":{"1920":true,"nvct":false,"drka":false,"ddts":false,"glit":false,"pulp":false,"mdrn":true},"flags":{}},"sort":3400000,"flags":{},"img":"systems/CoC7/assets/icons/skills.svg","effects":[]},{"_id":"EEEND8YZ91rtVW48","name":"Ride","type":"skill","data":{"specialization":"","description":{"value":"See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty":"","pushedFaillureConsequences":"","chat":""},"base":"5","adjustments":{"personal":null,"occupation":null,"archetype":null,"experience":null},"value":null,"attributes":{},"properties":{"special":false,"rarity":false,"push":true,"combat":false},"eras":{"1920":true,"nvct":false,"drka":false,"ddts":false,"glit":false,"pulp":false,"mdrn":true},"flags":{}},"sort":3500000,"flags":{},"img":"systems/CoC7/assets/icons/skills.svg","effects":[]},{"_id":"XE0HsG49O1CPI9r1","name":"Sleight of Hand","type":"skill","data":{"specialization":"","description":{"value":"See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty":"","pushedFaillureConsequences":"","chat":""},"base":"10","adjustments":{"personal":null,"occupation":null,"archetype":null,"experience":null},"value":null,"attributes":{},"properties":{"push":true,"special":false,"rarity":false,"combat":false},"eras":{"1920":true,"nvct":false,"drka":false,"ddts":false,"glit":false,"pulp":false,"mdrn":true},"flags":{}},"sort":3600000,"flags":{},"img":"systems/CoC7/assets/icons/skills.svg","effects":[]},{"_id":"jEaOE3HSP6EGGfUO","name":"Spot Hidden","type":"skill","data":{"specialization":"","description":{"value":"See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty":"","pushedFaillureConsequences":"","chat":""},"base":"25","adjustments":{"personal":null,"occupation":null,"archetype":null,"experience":null},"value":null,"attributes":{},"properties":{"special":false,"rarity":false,"push":true,"combat":false},"eras":{"1920":true,"nvct":false,"drka":false,"ddts":false,"glit":false,"pulp":false,"mdrn":true},"flags":{}},"sort":3700000,"flags":{},"img":"systems/CoC7/assets/icons/skills.svg","effects":[]},{"_id":"3mLypx5XOhaE0kDB","name":"Any","type":"skill","data":{"specialization":"Survival","description":{"value":"See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty":"","pushedFaillureConsequences":"","chat":""},"base":"10","adjustments":{"personal":null,"occupation":null,"archetype":null,"experience":null},"value":null,"attributes":{},"properties":{"special":true,"rarity":false,"push":true,"combat":false},"eras":{"1920":true,"nvct":false,"drka":false,"ddts":false,"glit":false,"pulp":false,"mdrn":true},"flags":{}},"sort":3800000,"flags":{},"img":"systems/CoC7/assets/icons/skills.svg","effects":[]},{"_id":"5jLflB6Ez9h2ILPA","name":"Stealth","type":"skill","data":{"specialization":"","description":{"value":"See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty":"","pushedFaillureConsequences":"","chat":""},"base":"20","adjustments":{"personal":null,"occupation":null,"archetype":null,"experience":null},"value":null,"attributes":{},"properties":{"special":false,"rarity":false,"push":true,"combat":false},"eras":{},"flags":{}},"sort":3900000,"flags":{},"img":"systems/CoC7/assets/icons/skills.svg","effects":[]},{"_id":"2Wrbf4c9TNiW5DYu","name":"Throw","type":"skill","data":{"specialization":"Fighting","description":{"value":"See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty":"","pushedFaillureConsequences":"","chat":""},"base":"20","adjustments":{"personal":null,"occupation":null,"archetype":null,"experience":null},"value":null,"attributes":{},"properties":{"special":true,"rarity":false,"push":true,"combat":true,"fighting":true,"firearm":false},"eras":{"1920":true,"nvct":false,"drka":false,"ddts":false,"glit":false,"pulp":false,"mdrn":true},"flags":{}},"sort":4000000,"flags":{},"img":"systems/CoC7/assets/icons/skills.svg","effects":[]},{"_id":"laKcJWNqaQQa8tHg","name":"Archaeology","type":"skill","data":{"specialization":"","description":{"value":"See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty":"","pushedFaillureConsequences":"","chat":""},"base":"1","adjustments":{"personal":null,"occupation":null,"archetype":null,"experience":null},"value":null,"attributes":{},"properties":{"special":false,"rarity":false,"push":true,"combat":false},"eras":{"1920":true,"nvct":false,"drka":false,"ddts":false,"glit":false,"pulp":false,"mdrn":true},"flags":{}},"sort":4100000,"flags":{},"img":"systems/CoC7/assets/icons/skills.svg","effects":[]},{"_id":"IeaxvTs5r5KQxSvQ","name":"Swim","type":"skill","data":{"specialization":"","description":{"value":"See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty":"","pushedFaillureConsequences":"","chat":""},"base":"20","adjustments":{"personal":null,"occupation":null,"archetype":null,"experience":null},"value":null,"attributes":{},"properties":{"push":true,"special":false,"rarity":false,"combat":false},"eras":{"1920":true,"nvct":false,"drka":false,"ddts":false,"glit":false,"pulp":false,"mdrn":true},"flags":{}},"sort":4200000,"flags":{},"img":"systems/CoC7/assets/icons/skills.svg","effects":[]},{"_id":"i1VYLHBcWrIUd57K","name":"Fists","type":"weapon","data":{"description":{"value":"","chat":"","special":""},"wpnType":"","skill":{"main":{"name":"","id":"kjaEOLz2p8ZrEowW"},"alternativ":{"name":"","id":""}},"range":{"normal":{"value":0,"units":"","damage":"1D3"},"long":{"value":0,"units":"","damage":""},"extreme":{"value":0,"units":"","damage":""}},"usesPerRound":{"normal":"","max":"","burst":null},"bullets":"","ammo":0,"malfunction":"","blastRadius":null,"properties":{"rngd":false,"impl":false,"rare":false,"ahdb":false,"addb":true,"slnt":false,"xplv":false,"brst":false,"auto":false,"spcl":false,"mont":false,"dbrl":false,"blst":false,"stun":true},"eras":{"1920":false,"nvct":false,"drka":false,"ddts":false,"glit":false,"pulp":false,"mdrn":false},"price":{"1920":0,"nvct":0,"drka":0,"ddts":0,"glit":0,"pulp":0,"mdrn":0}},"sort":4400000,"flags":{},"img":"icons/svg/sword.svg","effects":[]},{"_id":"jR4Qq2clAIB5kSIn","name":"Any","type":"skill","data":{"specialization":"Art/Craft","description":{"value":"See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty":"","pushedFaillureConsequences":"","chat":""},"base":"5","adjustments":{"personal":null,"occupation":null,"archetype":null,"experience":null},"value":null,"attributes":{},"properties":{"push":true,"special":true,"rarity":false,"combat":false},"eras":{"1920":true,"nvct":false,"drka":false,"ddts":false,"glit":false,"pulp":false,"mdrn":true},"flags":{}},"sort":4500000,"flags":{"core":{"sourceId":"Compendium.CoC7.skills.iV3SdrNKsGB5BSli"}},"img":"systems/CoC7/assets/icons/skills.svg","effects":[]},{"_id":"wj7Dm3wKkoU2ox16","name":"Any","type":"skill","data":{"specialization":"Language","description":{"value":"","opposingDifficulty":"","pushedFaillureConsequences":"","chat":""},"base":"1","adjustments":{"personal":null,"occupation":null,"archetype":null,"experience":null},"value":null,"attributes":{},"properties":{"special":true,"push":true},"eras":{},"flags":{}},"sort":4600000,"flags":{"core":{"sourceId":"Compendium.CoC7.skills.tZ75GTRGUNa7Ofj4"}},"img":"systems/CoC7/assets/icons/skills.svg","effects":[]},{"_id":"mVvcxcuAj4siP5Fl","name":"Any","type":"skill","data":{"specialization":"Science","description":{"value":"See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty":"","pushedFaillureConsequences":"","chat":""},"base":"1","adjustments":{"personal":null,"occupation":null,"archetype":null,"experience":null},"value":null,"attributes":{},"properties":{"special":true,"push":true},"eras":{},"flags":{}},"sort":4700000,"flags":{"core":{"sourceId":"Compendium.CoC7.skills.g9Q95Ei79qs3XZAz"}},"img":"systems/CoC7/assets/icons/skills.svg","effects":[]},{"_id":"1sx4ciqtI5dOWbrC","name":"Any","type":"skill","data":{"specialization":"Track","description":{"value":"","opposingDifficulty":"","pushedFaillureConsequences":"","chat":""},"base":"10","adjustments":{"personal":null,"occupation":null,"archetype":null,"experience":null},"value":null,"attributes":{},"properties":{"special":true,"push":true},"eras":{},"flags":{}},"sort":4800000,"flags":{"core":{"sourceId":"Compendium.CoC7.skills.4TTVJmCu9mP5kFrx"}},"img":"systems/CoC7/assets/icons/skills.svg","effects":[]}],"effects":[]} +{"_id":"4kSvDc4n13oFx8RG","name":"Villain example","type":"npc","img":"icons/svg/mystery-man.svg","data":{"characteristics":{"str":{"value":50,"tempValue":null,"short":"CHARAC.STR","label":"CHARAC.Strength","formula":null},"con":{"value":50,"tempValue":null,"short":"CHARAC.CON","label":"CHARAC.Constitution","formula":null},"siz":{"value":50,"tempValue":null,"short":"CHARAC.SIZ","label":"CHARAC.Size","formula":null},"dex":{"value":50,"tempValue":null,"short":"CHARAC.DEX","label":"CHARAC.Dexterity","formula":null},"app":{"value":50,"tempValue":null,"short":"CHARAC.APP","label":"CHARAC.Appearance","formula":null},"int":{"value":50,"tempValue":null,"short":"CHARAC.INT","label":"CHARAC.Intelligence","formula":null},"pow":{"value":50,"tempValue":null,"short":"CHARAC.POW","label":"CHARAC.Power","formula":null},"edu":{"value":50,"tempValue":null,"short":"CHARAC.EDU","label":"CHARAC.Education","formula":null}},"attribs":{"hp":{"value":10,"max":10,"short":"HP","label":"Hit points","auto":true},"mp":{"value":10,"max":10,"short":"HP","label":"Magic points","auto":true},"lck":{"value":50,"short":"LCK","label":"Luck","max":99},"san":{"value":50,"max":99,"short":"SAN","label":"Sanity","auto":true,"dailyLoss":0,"oneFifthSanity":" / 0"},"mov":{"value":8,"max":8,"short":"MOV","label":"Movement rate","auto":true},"db":{"value":0,"short":"DB","label":"Damage bonus","auto":true},"build":{"current":0,"value":0,"short":"BLD","label":"Build","auto":true},"armor":{"value":null,"localized":false,"locations":[],"auto":false}},"conditions":{"criticalWounds":{"value":false},"unconscious":{"value":false},"dying":{"value":false},"dead":{"value":false},"prone":{"value":false},"tempoInsane":{"value":false},"indefInsane":{"value":false}},"personalDescription":{"type":"string","value":""},"description":{"keeper":""},"special":{"sanLoss":{"checkPassed":"","checkFailled":""},"attacksPerRound":1},"infos":{"occupation":"Be a villain","age":"Very old","sex":""},"flags":{"locked":true,"displayFormula":false},"attacksPerRound":1},"token":{"name":"Villain example","displayName":0,"actorLink":false,"width":1,"height":1,"scale":1,"mirrorX":false,"mirrorY":false,"lockRotation":false,"rotation":0,"alpha":1,"vision":false,"dimSight":0,"brightSight":0,"dimLight":0,"brightLight":0,"sightAngle":0,"lightAngle":0,"lightAlpha":0.25,"lightAnimation":{"speed":5,"intensity":5},"disposition":-1,"displayBars":0,"bar1":{"attribute":"attribs.hp"},"bar2":{"attribute":"attribs.san"},"flags":{},"randomImg":false,"img":"icons/svg/mystery-man.svg","light":{"alpha":0.5,"angle":0,"bright":0,"coloration":1,"dim":0,"gradual":true,"luminosity":0.5,"saturation":0,"contrast":0,"shadows":0,"animation":{"speed":5,"intensity":5,"reverse":false},"darkness":{"min":0,"max":1}}},"items":[{"_id":"JKPFlce4fXskHrco","name":"Very mean sidekick","type":"item","img":"icons/svg/item-bag.svg","data":{"description":{"value":"","keeper":""},"quantity":1,"weight":0,"attributes":{}},"effects":[],"folder":"WdotG7nzDUJKNBCF","sort":0,"permission":{"default":0},"flags":{"core":{"sourceId":"Item.MpvookJWHQs0NX6M"}}},{"_id":"Uyw5Vo86WmxaCbLt","name":"Plan to enslave humanity","type":"item","img":"icons/svg/item-bag.svg","data":{"description":{"value":"","keeper":""},"quantity":1,"weight":0,"attributes":{}},"effects":[],"folder":"WdotG7nzDUJKNBCF","sort":0,"permission":{"default":0},"flags":{"core":{"sourceId":"Item.H7yLjkXpmrlhPFRt"}}},{"_id":"75xFKGouCIhczLRe","name":"Punch","type":"weapon","img":"icons/svg/sword.svg","data":{"description":{"value":"","chat":"","special":"","keeper":""},"wpnType":"","skill":{"main":{"name":"Brawl","id":"mjNPsr30tOVP1OUa"},"alternativ":{"name":"","id":""}},"range":{"normal":{"value":0,"units":"","damage":"1D6"},"long":{"value":0,"units":"","damage":""},"extreme":{"value":0,"units":"","damage":""}},"usesPerRound":{"normal":"1","max":"","burst":null},"bullets":"","ammo":0,"malfunction":"","blastRadius":null,"properties":{"addb":true,"ahdb":false,"melee":true,"rngd":false,"shotgun":false,"brst":false,"auto":false,"dbrl":false},"eras":{"1920":false,"nvct":false,"drka":false,"ddts":false,"glit":false,"pulp":false,"mdrn":false},"price":{}},"effects":[],"folder":null,"sort":100000,"permission":{"default":0},"flags":{"core":{"sourceId":"Item.Uldjvs5fvCMri6RN"}}},{"_id":"mjNPsr30tOVP1OUa","name":"Fighting (Brawl)","type":"skill","img":"systems/CoC7/assets/icons/skills/fighting_brawl.svg","data":{"skillName":"Brawl","specialization":"Fighting","description":{"value":"See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty":"","pushedFaillureConsequences":"","chat":"","keeper":""},"base":"25","adjustments":{"personal":null,"occupation":null,"archetype":null,"experience":null},"value":"25","attributes":{},"properties":{"fighting":true,"firearm":false,"combat":true,"special":true},"eras":{"1920":true,"nvct":false,"drka":false,"ddts":false,"glit":false,"pulp":false,"mdrn":true},"flags":{}},"effects":[],"folder":null,"sort":0,"permission":{"default":0},"flags":{"core":{"sourceId":"Compendium.world.skills.vS8bsPWFlwgOecoB"}}},{"_id":"Wc35ZVZlbGvnt4Dk","name":"Firearms (Rifle/Shotgun)","type":"skill","img":"systems/CoC7/assets/icons/skills/firearms_rifle_shotgun.svg","data":{"skillName":"Rifle/Shotgun","specialization":"Firearms","description":{"value":"See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty":"","pushedFaillureConsequences":"","chat":"","keeper":""},"base":"25","adjustments":{"personal":null,"occupation":null,"archetype":null,"experience":null},"value":"25","attributes":{},"properties":{"fighting":false,"firearm":true,"combat":true,"special":true},"eras":{"1920":true,"nvct":false,"drka":false,"ddts":false,"glit":false,"pulp":false,"mdrn":true},"flags":{}},"effects":[],"folder":null,"sort":0,"permission":{"default":0},"flags":{"core":{"sourceId":"Compendium.world.skills.m2pYjKk4Gk3FcEBL"}}},{"_id":"GEX2If3omq2h3kf0","name":"Dodge","type":"skill","img":"systems/CoC7/assets/icons/skills/dodge.svg","data":{"skillName":"Dodge","specialization":"","description":{"value":"See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty":"","pushedFaillureConsequences":"","chat":"","keeper":""},"base":"1/2*@DEX","adjustments":{"personal":null,"occupation":null,"archetype":null,"experience":null},"value":25,"attributes":{},"properties":{},"eras":{"1920":true,"nvct":false,"drka":false,"ddts":false,"glit":false,"pulp":false,"mdrn":true},"flags":{}},"effects":[],"folder":null,"sort":0,"permission":{"default":0},"flags":{"core":{"sourceId":"Compendium.world.skills.wK8XxNj9QwXlGFEb"}}},{"_id":"CpenApM1POTvS9uc","name":"Language (Own)","type":"skill","img":"systems/CoC7/assets/icons/skills/language.svg","data":{"skillName":"Own","specialization":"Language","description":{"value":"See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty":"","pushedFaillureConsequences":"","chat":"","keeper":""},"base":"@EDU","adjustments":{"personal":null,"occupation":null,"archetype":null,"experience":null},"value":50,"attributes":{},"properties":{"push":true,"special":false},"eras":{"1920":true,"nvct":false,"drka":false,"ddts":false,"glit":false,"pulp":false,"mdrn":true},"flags":{}},"effects":[],"folder":null,"sort":0,"permission":{"default":0},"flags":{"core":{"sourceId":"Compendium.world.skills.rhJ1Q9OB3uTUZmjD"}}},{"_id":"7VR4auTMAPfaEqyA","name":"My test weapon","type":"weapon","img":"icons/svg/sword.svg","data":{"description":{"value":"Description of the weapon
\nselecting 'Area of effect' will enable 3 different damage and range
\nselecting 'Full-auto' will allow 2 different skills to be selected for the weapon
\nselecting 'Special' will activate the special input field
\nIn the combat tab, if the icons are with a red background, it means that no skill have been selected for that weapon
\nEdit the weapon and select the correct skill.
","chat":"","special":"","keeper":""},"wpnType":"","skill":{"main":{"name":"Rifle/Shotgun","id":"Wc35ZVZlbGvnt4Dk"},"alternativ":{"name":"Rifle/Shotgun","id":"Wc35ZVZlbGvnt4Dk"}},"range":{"normal":{"value":"15ft","units":"","damage":"1d6"},"long":{"value":0,"units":"","damage":""},"extreme":{"value":0,"units":"","damage":""}},"usesPerRound":{"normal":"1","max":"","burst":""},"bullets":"","ammo":0,"malfunction":"85","blastRadius":null,"properties":{"melee":false,"rngd":true,"auto":true,"brst":true},"eras":{"1920":true,"nvct":false,"drka":false,"ddts":false,"glit":false,"pulp":false,"mdrn":true},"price":{"1920":"$5","mdrn":"$6"}},"effects":[],"folder":"WdotG7nzDUJKNBCF","sort":0,"permission":{"default":0},"flags":{"core":{"sourceId":"Item.ar306rfjUIZFenWF"}}},{"_id":"gCpN0Jqn85LVYRcD","name":"Torment the PC","type":"skill","img":"systems/CoC7/assets/icons/skills.svg","data":{"skillName":"Torment the PC","specialization":"","description":{"value":"","opposingDifficulty":"","pushedFaillureConsequences":"","chat":"","keeper":""},"base":"0","adjustments":{"personal":null,"occupation":null,"archetype":null,"experience":null},"value":"75","attributes":{},"properties":{"push":true},"eras":{},"flags":{}},"effects":[],"folder":"WdotG7nzDUJKNBCF","sort":0,"permission":{"default":0},"flags":{"core":{"sourceId":"Item.l4vz66H4IkqiXKzB"}}},{"_id":"0AHo1cSc7ueMEg1C","name":"Takeover the world","type":"skill","img":"systems/CoC7/assets/icons/skills.svg","data":{"skillName":"Takeover the world","specialization":"","description":{"value":"","opposingDifficulty":"","pushedFaillureConsequences":"","chat":"","keeper":""},"base":"0","adjustments":{"personal":null,"occupation":null,"archetype":null,"experience":null},"value":"80","attributes":{},"properties":{},"eras":{},"flags":{}},"effects":[],"folder":"WdotG7nzDUJKNBCF","sort":0,"permission":{"default":0},"flags":{"core":{"sourceId":"Item.DuQXiLwoHb7JnNGv"}}},{"_id":"gtLHe6r4xczLReMd","name":"Be a pain","type":"skill","img":"systems/CoC7/assets/icons/skills.svg","data":{"skillName":"Be a pain","specialization":"","description":{"value":"","opposingDifficulty":"","pushedFaillureConsequences":"","chat":"","keeper":""},"base":"0","adjustments":{"personal":null,"occupation":null,"archetype":null,"experience":null},"value":"0","attributes":{},"properties":{"push":true},"eras":{},"flags":{}},"effects":[],"folder":"WdotG7nzDUJKNBCF","sort":0,"permission":{"default":0},"flags":{"core":{"sourceId":"Item.DGD3CQQWsYIqhLWL"}}},{"_id":"tzxgO3tPQTvSHXKv","name":"Bark orders","type":"skill","img":"systems/CoC7/assets/icons/skills.svg","data":{"skillName":"Bark orders","specialization":"","description":{"value":"","opposingDifficulty":"","pushedFaillureConsequences":"","chat":"","keeper":""},"base":"0","adjustments":{"personal":null,"occupation":null,"archetype":null,"experience":null},"value":"45","attributes":{},"properties":{"push":true},"eras":{},"flags":{}},"effects":[],"folder":"WdotG7nzDUJKNBCF","sort":0,"permission":{"default":0},"flags":{"core":{"sourceId":"Item.M4Q1ps8ecPWKfnI0"}}}],"effects":[],"folder":null,"sort":0,"permission":{"default":0},"flags":{"core":{"sourceId":"Actor.KIFjLTP875sS5weT"}}} +{"_id":"JuI2aWDSEuQNKeUI","name": "1920 Character","type": "character","img": "icons/svg/mystery-man.svg","data": {"characteristics": {"str": {"value": 50,"tempValue": null,"short": "CHARAC.STR","label": "CHARAC.Strength","formula": "(3D6)*5"},"con": {"value": 50,"tempValue": null,"short": "CHARAC.CON","label": "CHARAC.Constitution","formula": "(3D6)*5"},"siz": {"value": 50,"tempValue": null,"short": "CHARAC.SIZ","label": "CHARAC.Size","formula": "(2D6+6)*5"},"dex": {"value": 50,"tempValue": null,"short": "CHARAC.DEX","label": "CHARAC.Dexterity","formula": "(3D6)*5"},"app": {"value": 50,"tempValue": null,"short": "CHARAC.APP","label": "CHARAC.Appearance","formula": "(3D6)*5"},"int": {"value": 50,"tempValue": null,"short": "CHARAC.INT","label": "CHARAC.Intelligence","formula": "(2D6+6)*5"},"pow": {"value": 50,"tempValue": null,"short": "CHARAC.POW","label": "CHARAC.Power","formula": "(3D6)*5"},"edu": {"value": 50,"tempValue": null,"short": "CHARAC.EDU","label": "CHARAC.Education","formula": "(2D6+6)*5"}},"attribs": {"hp": {"value": 10,"max": 10,"short": "HP","label": "Hit points","auto": true},"mp": {"value": 10,"max": 10,"short": "HP","label": "Magic points","auto": true},"lck": {"value": 50,"short": "LCK","label": "Luck","max": 99},"san": {"value": 50,"max": 99,"short": "SAN","label": "Sanity","auto": true,"dailyLoss": 0,"oneFifthSanity": " / 0","dailyLimit": 10},"mov": {"value": null,"max": null,"short": "MOV","label": "Movement rate","auto": true},"db": {"value": null,"short": "DB","label": "Damage bonus","auto": true},"build": {"current": null,"value": null,"short": "BLD","label": "Build","auto": true},"armor": {"value": "","localized": false,"locations": [],"auto": false}},"conditions": {"criticalWounds": {"value": false},"unconscious": {"value": false},"dying": {"value": false},"dead": {"value": false},"prone": {"value": false},"tempoInsane": {"value": false},"indefInsane": {"value": false}},"infos": {"occupation": "","age": "","sex": "","residence": "","birthplace": "","archetype": "","organization": "","playername": ""},"flags": {"locked": true,"manualCredit": false},"credit": {"monetarySymbol": "","multiplier": null,"spent": "","assetsDetails": ""},"development": {"personal": null,"occupation": null,"archetype": null},"biography": [{"title": "Personal Description","value": null},{"title": "Ideology/Beliefs","value": null},{"title": "Significant People","value": null},{"title": "Meaningful Locations","value": null},{"title": "Treasured Possessions","value": null},{"title": "Traits","value": null}],"sanityLossEvents": [],"backstory": "","indefiniteInsanityLevel": {"value": 0,"max": 0},"description": {"keeper": ""},"notes": ""},"token": {"vision": true,"dimSight": 30,"brightSight": 0,"actorLink": true,"disposition": 1,"name": "1920 Character","displayName": 0,"width": 1,"height": 1,"scale": 1,"mirrorX": false,"mirrorY": false,"lockRotation": false,"rotation": 0,"alpha": 1,"sightAngle": 0,"light": {"alpha": 0.5,"angle": 0,"bright": 0,"coloration": 1,"dim": 0,"gradual": true,"luminosity": 0.5,"saturation": 0,"contrast": 0,"shadows": 0,"animation": {"speed": 5,"intensity": 5,"reverse": false},"darkness": {"min": 0,"max": 1}},"displayBars": 0,"bar1": {"attribute": "attribs.hp"},"bar2": {"attribute": "attribs.san"},"flags": {},"randomImg": false,"img": "icons/svg/mystery-man.svg"},"items": [{"_id": "O1NxgQyl1TVEcFpv","name": "Accounting","type": "skill","img": "systems/CoC7/assets/icons/skills/accounting.svg","data": {"skillName": "Accounting","specialization": "","description": {"value": "See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty": "","pushedFaillureConsequences": "","chat": "","keeper": ""},"base": "5","adjustments": {"personal": null,"occupation": null,"archetype": null,"experience": null},"value": null,"attributes": {},"properties": {"push": true},"eras": {"1920": true,"nvct": true,"drka": true,"ddts": true,"glit": true,"pulp": true,"mdrn": true},"flags": {}},"effects": [],"folder": null,"sort": 0,"permission": {"default": 0,"f2tegjkWyWhBBgnj": 3},"flags": {"core": {"sourceId": "Compendium.CoC7.skills.UOuN0gESXPp2HXwH"}}},{"_id": "6ahs1BVypf0LG2ui","name": "Anthropology","type": "skill","img": "systems/CoC7/assets/icons/skills/anthropology.svg","data": {"skillName": "Anthropology","specialization": "","description": {"value": "See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty": "","pushedFaillureConsequences": "","chat": "","keeper": ""},"base": "1","adjustments": {"personal": null,"occupation": null,"archetype": null,"experience": null},"value": null,"attributes": {},"properties": {"push": true},"eras": {"1920": true,"nvct": false,"drka": false,"ddts": true,"glit": true,"pulp": false,"mdrn": true},"flags": {}},"effects": [],"folder": null,"sort": 0,"permission": {"default": 0,"f2tegjkWyWhBBgnj": 3},"flags": {"core": {"sourceId": "Compendium.CoC7.skills.ovIp66Luwfwbq28F"}}},{"_id": "nZp5VsP8lJjxK53F","name": "Appraise","type": "skill","img": "systems/CoC7/assets/icons/skills/appraise.svg","data": {"skillName": "Appraise","specialization": "","description": {"value": "See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty": "","pushedFaillureConsequences": "","chat": "","keeper": ""},"base": "5","adjustments": {"personal": null,"occupation": null,"archetype": null,"experience": null},"value": null,"attributes": {},"properties": {"push": true},"eras": {"1920": true,"nvct": true,"drka": true,"ddts": true,"glit": true,"pulp": true,"mdrn": true},"flags": {}},"effects": [],"folder": null,"sort": 0,"permission": {"default": 0,"f2tegjkWyWhBBgnj": 3},"flags": {"core": {"sourceId": "Compendium.CoC7.skills.wOs3gryeGRPkGoWD"}}},{"_id": "2qbA452TZDxEvBgo","name": "Archaeology","type": "skill","img": "systems/CoC7/assets/icons/skills/archaeology.svg","data": {"skillName": "Archaeology","specialization": "","description": {"value": "See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty": "","pushedFaillureConsequences": "","chat": "","keeper": ""},"base": "1","adjustments": {"personal": null,"occupation": null,"archetype": null,"experience": null},"value": null,"attributes": {},"properties": {"push": true},"eras": {"1920": true,"nvct": false,"drka": false,"ddts": true,"glit": true,"pulp": true,"mdrn": true},"flags": {}},"effects": [],"folder": null,"sort": 0,"permission": {"default": 0,"f2tegjkWyWhBBgnj": 3},"flags": {"core": {"sourceId": "Compendium.CoC7.skills.GHhkcJUqjcP4lToY"}}},{"_id": "HUSs3Z1WMKy2WU8Q","name": "Art/Craft (Acting)","type": "skill","img": "systems/CoC7/assets/icons/skills/art_craft_acting.svg","data": {"skillName": "Acting","specialization": "Art/Craft","description": {"value": "See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty": "","pushedFaillureConsequences": "","chat": "","keeper": ""},"base": "5","adjustments": {"personal": null,"occupation": null,"archetype": null,"experience": null},"value": null,"attributes": {},"properties": {"special": true,"push": true},"eras": {"1920": true,"nvct": false,"drka": false,"ddts": false,"glit": false,"pulp": false,"mdrn": true},"flags": {}},"effects": [],"folder": null,"sort": 0,"permission": {"default": 0,"f2tegjkWyWhBBgnj": 3},"flags": {"core": {"sourceId": "Compendium.CoC7.skills.m6V53lyfz7zh95FE"}}},{"_id": "2M1xXSNW68KZuhTR","name": "Charm","type": "skill","img": "systems/CoC7/assets/icons/skills/charm.svg","data": {"skillName": "Charm","specialization": "","description": {"value": "See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty": "","pushedFaillureConsequences": "","chat": "","keeper": ""},"base": "15","adjustments": {"personal": null,"occupation": null,"archetype": null,"experience": null},"value": null,"attributes": {},"properties": {"push": true},"eras": {"1920": true,"nvct": true,"drka": true,"ddts": true,"glit": true,"pulp": true,"mdrn": true},"flags": {}},"effects": [],"folder": null,"sort": 0,"permission": {"default": 0,"f2tegjkWyWhBBgnj": 3},"flags": {"core": {"sourceId": "Compendium.CoC7.skills.JgtxiN3KzooOWIQV"}}},{"_id": "M33sgqZolcplbGET","name": "Climb","type": "skill","img": "systems/CoC7/assets/icons/skills/climb.svg","data": {"skillName": "Climb","specialization": "","description": {"value": "See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty": "","pushedFaillureConsequences": "","chat": "","keeper": ""},"base": "20","adjustments": {"personal": null,"occupation": null,"archetype": null,"experience": null},"value": null,"attributes": {},"properties": {"push": true},"eras": {"1920": true,"nvct": true,"drka": true,"ddts": true,"glit": true,"pulp": true,"mdrn": true},"flags": {}},"effects": [],"folder": null,"sort": 0,"permission": {"default": 0,"f2tegjkWyWhBBgnj": 3},"flags": {"core": {"sourceId": "Compendium.CoC7.skills.oh5eFj00Wohnx1My"}}},{"_id": "wtw9jEO0gGzoQa0Q","name": "Credit Rating","type": "skill","img": "systems/CoC7/assets/icons/skills/credit_rating.svg","data": {"skillName": "Credit Rating","specialization": "","description": {"value": "See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty": "","pushedFaillureConsequences": "","chat": "","keeper": ""},"base": "0","adjustments": {"personal": null,"occupation": null,"archetype": null,"experience": null},"value": null,"attributes": {},"properties": {"noxpgain": true,"push": true},"eras": {"1920": true,"nvct": false,"drka": false,"ddts": true,"glit": true,"pulp": true,"mdrn": true},"flags": {}},"effects": [],"folder": null,"sort": 0,"permission": {"default": 0,"f2tegjkWyWhBBgnj": 3},"flags": {"core": {"sourceId": "Compendium.CoC7.skills.vYrJ5h9cIQBzvw8E"}}},{"_id": "HyZbjOCgYlryFfID","name": "Cthulhu Mythos","type": "skill","img": "systems/CoC7/assets/icons/skills/cthulhu_mythos.svg","data": {"skillName": "Cthulhu Mythos","specialization": "","description": {"value": "See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty": "","pushedFaillureConsequences": "","chat": "","keeper": ""},"base": "0","adjustments": {"personal": null,"occupation": null,"archetype": null,"experience": null},"value": null,"attributes": {},"properties": {"noadjustments": true,"noxpgain": true},"eras": {"1920": true,"nvct": true,"drka": true,"ddts": true,"glit": true,"pulp": true,"mdrn": true},"flags": {}},"effects": [],"folder": null,"sort": 0,"permission": {"default": 0,"f2tegjkWyWhBBgnj": 3},"flags": {"core": {"sourceId": "Compendium.CoC7.skills.WJky66ezt2ef5ksH"}}},{"_id": "7zb3datkgo38MgkY","name": "Disguise","type": "skill","img": "systems/CoC7/assets/icons/skills/disguise.svg","data": {"skillName": "Disguise","specialization": "","description": {"value": "See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty": "","pushedFaillureConsequences": "","chat": "","keeper": ""},"base": "5","adjustments": {"personal": null,"occupation": null,"archetype": null,"experience": null},"value": null,"attributes": {},"properties": {"push": true},"eras": {"1920": true,"nvct": false,"drka": true,"ddts": true,"glit": true,"pulp": true,"mdrn": true},"flags": {}},"effects": [],"folder": null,"sort": 0,"permission": {"default": 0,"f2tegjkWyWhBBgnj": 3},"flags": {"core": {"sourceId": "Compendium.CoC7.skills.gzNPM9gbx0EZffBV"}}},{"_id": "5phV0BmF8L9zc76p","name": "Dodge","type": "skill","img": "systems/CoC7/assets/icons/skills/dodge.svg","data": {"skillName": "Dodge","specialization": "","description": {"value": "See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty": "","pushedFaillureConsequences": "","chat": "","keeper": ""},"base": 25,"adjustments": {"personal": null,"occupation": null,"archetype": null,"experience": null},"value": null,"attributes": {},"properties": {},"eras": {"1920": true,"nvct": true,"drka": true,"ddts": true,"glit": true,"pulp": true,"mdrn": true},"flags": {}},"effects": [],"folder": null,"sort": 0,"permission": {"default": 0,"f2tegjkWyWhBBgnj": 3},"flags": {"core": {"sourceId": "Compendium.CoC7.skills.wK8XxNj9QwXlGFEb"}}},{"_id": "aV1HPa6T0ao5KxIC","name": "Drive Auto","type": "skill","img": "systems/CoC7/assets/icons/skills/drive_auto.svg","data": {"skillName": "Drive Auto","specialization": "","description": {"value": "See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty": "","pushedFaillureConsequences": "","chat": "","keeper": ""},"base": "20","adjustments": {"personal": null,"occupation": null,"archetype": null,"experience": null},"value": null,"attributes": {},"properties": {"push": true},"eras": {"1920": true,"nvct": false,"drka": false,"ddts": false,"glit": false,"pulp": true,"mdrn": true},"flags": {}},"effects": [],"folder": null,"sort": 0,"permission": {"default": 0,"f2tegjkWyWhBBgnj": 3},"flags": {"core": {"sourceId": "Compendium.CoC7.skills.Og2OWQH93aSDWAMZ"}}},{"_id": "e9TkwUb9I707qhri","name": "Electrical Repair","type": "skill","img": "systems/CoC7/assets/icons/skills/electrical_repair.svg","data": {"skillName": "Electrical Repair","specialization": "","description": {"value": "See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty": "","pushedFaillureConsequences": "","chat": "","keeper": ""},"base": "10","adjustments": {"personal": null,"occupation": null,"archetype": null,"experience": null},"value": null,"attributes": {},"properties": {"push": true},"eras": {"1920": true,"nvct": false,"drka": false,"ddts": true,"glit": false,"pulp": true,"mdrn": true},"flags": {}},"effects": [],"folder": null,"sort": 0,"permission": {"default": 0,"f2tegjkWyWhBBgnj": 3},"flags": {"core": {"sourceId": "Compendium.CoC7.skills.NBkq8oCGM1FjmsyF"}}},{"_id": "eFKUznsTG8LAMni9","name": "Fast Talk","type": "skill","img": "systems/CoC7/assets/icons/skills/fast_talk.svg","data": {"skillName": "Fast Talk","specialization": "","description": {"value": "See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty": "","pushedFaillureConsequences": "","chat": "","keeper": ""},"base": "5","adjustments": {"personal": null,"occupation": null,"archetype": null,"experience": null},"value": null,"attributes": {},"properties": {"push": true},"eras": {"1920": true,"nvct": true,"drka": true,"ddts": true,"glit": true,"pulp": true,"mdrn": true},"flags": {}},"effects": [],"folder": null,"sort": 0,"permission": {"default": 0,"f2tegjkWyWhBBgnj": 3},"flags": {"core": {"sourceId": "Compendium.CoC7.skills.ld78TITwKNFPpanQ"}}},{"_id": "28W5Wr09jltOPNY0","name": "Fighting (Brawl)","type": "skill","img": "systems/CoC7/assets/icons/skills/fighting_brawl.svg","data": {"skillName": "Brawl","specialization": "Fighting","description": {"value": "See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty": "","pushedFaillureConsequences": "","chat": "","keeper": ""},"base": "25","adjustments": {"personal": null,"occupation": null,"archetype": null,"experience": null},"value": null,"attributes": {},"properties": {"fighting": true,"firearm": false,"combat": true,"special": true},"eras": {"1920": true,"nvct": true,"drka": true,"ddts": true,"glit": true,"pulp": true,"mdrn": true},"flags": {}},"effects": [],"folder": null,"sort": 0,"permission": {"default": 0,"f2tegjkWyWhBBgnj": 3},"flags": {"core": {"sourceId": "Compendium.CoC7.skills.vS8bsPWFlwgOecoB"}}},{"_id": "s25rvwAwBR4fOsWr","name": "Fighting (Throw)","type": "skill","img": "systems/CoC7/assets/icons/skills/fighting_throw.svg","data": {"skillName": "Throw","specialization": "Fighting","description": {"value": "See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty": "","pushedFaillureConsequences": "","chat": "","keeper": ""},"base": "20","adjustments": {"personal": null,"occupation": null,"archetype": null,"experience": null},"value": null,"attributes": {},"properties": {"fighting": true,"firearm": false,"combat": true,"special": true,"push": false},"eras": {"1920": true,"nvct": true,"drka": true,"ddts": true,"glit": true,"pulp": true,"mdrn": true},"flags": {}},"effects": [],"folder": null,"sort": 0,"permission": {"default": 0,"f2tegjkWyWhBBgnj": 3},"flags": {"core": {"sourceId": "Compendium.CoC7.skills.sWt5Q3ZXd6NlwhXU"}}},{"_id": "BSyRMN21TZXSXs1D","name": "Firearms (Handgun)","type": "skill","img": "systems/CoC7/assets/icons/skills/firearms_handgun.svg","data": {"skillName": "Handgun","specialization": "Firearms","description": {"value": "See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty": "","pushedFaillureConsequences": "","chat": "","keeper": ""},"base": "20","adjustments": {"personal": null,"occupation": null,"archetype": null,"experience": null},"value": null,"attributes": {},"properties": {"fighting": false,"firearm": true,"combat": true,"special": true},"eras": {"1920": true,"nvct": false,"drka": false,"ddts": true,"glit": true,"pulp": true,"mdrn": true},"flags": {}},"effects": [],"folder": null,"sort": 0,"permission": {"default": 0,"f2tegjkWyWhBBgnj": 3},"flags": {"core": {"sourceId": "Compendium.CoC7.skills.KmDGtn7ukUFVb265"}}},{"_id": "DVWmLyQsxED935JM","name": "Firearms (Rifle/Shotgun)","type": "skill","img": "systems/CoC7/assets/icons/skills/firearms_rifle_shotgun.svg","data": {"skillName": "Rifle/Shotgun","specialization": "Firearms","description": {"value": "See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty": "","pushedFaillureConsequences": "","chat": "","keeper": ""},"base": "25","adjustments": {"personal": null,"occupation": null,"archetype": null,"experience": null},"value": null,"attributes": {},"properties": {"fighting": false,"firearm": true,"combat": true,"special": true},"eras": {"1920": true,"nvct": false,"drka": false,"ddts": true,"glit": true,"pulp": true,"mdrn": true},"flags": {}},"effects": [],"folder": null,"sort": 0,"permission": {"default": 0,"f2tegjkWyWhBBgnj": 3},"flags": {"core": {"sourceId": "Compendium.CoC7.skills.m2pYjKk4Gk3FcEBL"}}},{"_id": "iTHGs2zn58m6d0uu","name": "First Aid","type": "skill","img": "systems/CoC7/assets/icons/skills/first_aid.svg","data": {"skillName": "First Aid","specialization": "","description": {"value": "See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty": "","pushedFaillureConsequences": "","chat": "","keeper": ""},"base": "30","adjustments": {"personal": null,"occupation": null,"archetype": null,"experience": null},"value": null,"attributes": {},"properties": {"push": true},"eras": {"1920": true,"nvct": true,"drka": true,"ddts": true,"glit": true,"pulp": true,"mdrn": true},"flags": {}},"effects": [],"folder": null,"sort": 0,"permission": {"default": 0,"f2tegjkWyWhBBgnj": 3},"flags": {"core": {"sourceId": "Compendium.CoC7.skills.nZ8rdL4PLb7A7f5B"}}},{"_id": "ACERhi4RMPrdugNC","name": "History","type": "skill","img": "systems/CoC7/assets/icons/skills/history.svg","data": {"skillName": "History","specialization": "","description": {"value": "See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty": "","pushedFaillureConsequences": "","chat": "","keeper": ""},"base": "5","adjustments": {"personal": null,"occupation": null,"archetype": null,"experience": null},"value": null,"attributes": {},"properties": {"push": true},"eras": {"1920": true,"nvct": false,"drka": false,"ddts": true,"glit": true,"pulp": true,"mdrn": true},"flags": {}},"effects": [],"folder": null,"sort": 0,"permission": {"default": 0,"f2tegjkWyWhBBgnj": 3},"flags": {"core": {"sourceId": "Compendium.CoC7.skills.URo2NSSJSNdvOqXU"}}},{"_id": "C8893ykdL7FyvzEI","name": "Intimidate","type": "skill","img": "systems/CoC7/assets/icons/skills/intimidate.svg","data": {"skillName": "Intimidate","specialization": "","description": {"value": "See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty": "","pushedFaillureConsequences": "","chat": "","keeper": ""},"base": "15","adjustments": {"personal": null,"occupation": null,"archetype": null,"experience": null},"value": null,"attributes": {},"properties": {"push": true},"eras": {"1920": true,"nvct": true,"drka": true,"ddts": true,"glit": true,"pulp": true,"mdrn": true},"flags": {}},"effects": [],"folder": null,"sort": 0,"permission": {"default": 0,"f2tegjkWyWhBBgnj": 3},"flags": {"core": {"sourceId": "Compendium.CoC7.skills.hDr4eUbS398oniTa"}}},{"_id": "4DJfICiq17xUj7mL","name": "Jump","type": "skill","img": "systems/CoC7/assets/icons/skills/jump.svg","data": {"skillName": "Jump","specialization": "","description": {"value": "See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty": "","pushedFaillureConsequences": "","chat": "","keeper": ""},"base": "20","adjustments": {"personal": null,"occupation": null,"archetype": null,"experience": null},"value": null,"attributes": {},"properties": {"push": true},"eras": {"1920": true,"nvct": true,"drka": true,"ddts": true,"glit": true,"pulp": true,"mdrn": true},"flags": {}},"effects": [],"folder": null,"sort": 0,"permission": {"default": 0,"f2tegjkWyWhBBgnj": 3},"flags": {"core": {"sourceId": "Compendium.CoC7.skills.c5utlFbDM7J8TA8b"}}},{"_id": "zwh2alzxQ4nDML3E","name": "Language (Own)","type": "skill","img": "systems/CoC7/assets/icons/skills/language.svg","data": {"skillName": "Own","specialization": "Language","description": {"value": "See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty": "","pushedFaillureConsequences": "","chat": "","keeper": ""},"base": 50,"adjustments": {"personal": null,"occupation": null,"archetype": null,"experience": null},"value": null,"attributes": {},"properties": {"push": true,"special": true},"eras": {"1920": true,"nvct": true,"drka": true,"ddts": true,"glit": true,"pulp": true,"mdrn": true},"flags": {}},"effects": [],"folder": null,"sort": 0,"permission": {"default": 0,"f2tegjkWyWhBBgnj": 3},"flags": {"core": {"sourceId": "Compendium.CoC7.skills.rhJ1Q9OB3uTUZmjD"}}},{"_id": "HRl7kuG4fRwn7FvH","name": "Law","type": "skill","img": "systems/CoC7/assets/icons/skills/law.svg","data": {"skillName": "Law","specialization": "","description": {"value": "See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty": "","pushedFaillureConsequences": "","chat": "","keeper": ""},"base": "5","adjustments": {"personal": null,"occupation": null,"archetype": null,"experience": null},"value": null,"attributes": {},"properties": {"push": true},"eras": {"1920": true,"nvct": false,"drka": false,"ddts": true,"glit": true,"pulp": true,"mdrn": true},"flags": {}},"effects": [],"folder": null,"sort": 0,"permission": {"default": 0,"f2tegjkWyWhBBgnj": 3},"flags": {"core": {"sourceId": "Compendium.CoC7.skills.64hnBZNC8FM7oTkg"}}},{"_id": "rYpQ2fCwgMRluTXM","name": "Library Use","type": "skill","img": "systems/CoC7/assets/icons/skills/library_use.svg","data": {"skillName": "Library Use","specialization": "","description": {"value": "See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty": "","pushedFaillureConsequences": "","chat": "","keeper": ""},"base": "20","adjustments": {"personal": null,"occupation": null,"archetype": null,"experience": null},"value": null,"attributes": {},"properties": {"push": true},"eras": {"1920": true,"nvct": true,"drka": true,"ddts": true,"glit": true,"pulp": true,"mdrn": true},"flags": {}},"effects": [],"folder": null,"sort": 0,"permission": {"default": 0,"f2tegjkWyWhBBgnj": 3},"flags": {"core": {"sourceId": "Compendium.CoC7.skills.BcWHh8EhmyKj7bNk"}}},{"_id": "itXQ18v2e9EkTIbZ","name": "Listen","type": "skill","img": "systems/CoC7/assets/icons/skills/listen.svg","data": {"skillName": "Listen","specialization": "","description": {"value": "See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty": "","pushedFaillureConsequences": "","chat": "","keeper": ""},"base": "20","adjustments": {"personal": null,"occupation": null,"archetype": null,"experience": null},"value": null,"attributes": {},"properties": {"push": true},"eras": {"1920": true,"nvct": true,"drka": true,"ddts": true,"glit": true,"pulp": true,"mdrn": true},"flags": {}},"effects": [],"folder": null,"sort": 0,"permission": {"default": 0,"f2tegjkWyWhBBgnj": 3},"flags": {"core": {"sourceId": "Compendium.CoC7.skills.MoAB0NRNlpEc2qWr"}}},{"_id": "GusblC5ZOVXJEpcz","name": "Locksmith","type": "skill","img": "systems/CoC7/assets/icons/skills/locksmith.svg","data": {"skillName": "Locksmith","specialization": "","description": {"value": "See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty": "","pushedFaillureConsequences": "","chat": "","keeper": ""},"base": "1","adjustments": {"personal": null,"occupation": null,"archetype": null,"experience": null},"value": null,"attributes": {},"properties": {"push": true},"eras": {"1920": true,"nvct": false,"drka": false,"ddts": true,"glit": true,"pulp": true,"mdrn": true},"flags": {}},"effects": [],"folder": null,"sort": 0,"permission": {"default": 0,"f2tegjkWyWhBBgnj": 3},"flags": {"core": {"sourceId": "Compendium.CoC7.skills.MRbFH52Zh9TzhLBh"}}},{"_id": "osBrI5BZsEZn1r2S","name": "Mechanical Repair","type": "skill","img": "systems/CoC7/assets/icons/skills/mechanical_repair.svg","data": {"skillName": "Mechanical Repair","specialization": "","description": {"value": "See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty": "","pushedFaillureConsequences": "","chat": "","keeper": ""},"base": "10","adjustments": {"personal": null,"occupation": null,"archetype": null,"experience": null},"value": null,"attributes": {},"properties": {"push": true},"eras": {"1920": true,"nvct": false,"drka": false,"ddts": true,"glit": true,"pulp": true,"mdrn": true},"flags": {}},"effects": [],"folder": null,"sort": 0,"permission": {"default": 0,"f2tegjkWyWhBBgnj": 3},"flags": {"core": {"sourceId": "Compendium.CoC7.skills.0qCTuRFUCACSEsWj"}}},{"_id": "6nJe6CryCPhGEGU2","name": "Medicine","type": "skill","img": "systems/CoC7/assets/icons/skills/medicine.svg","data": {"skillName": "Medicine","specialization": "","description": {"value": "See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty": "","pushedFaillureConsequences": "","chat": "","keeper": ""},"base": "1","adjustments": {"personal": null,"occupation": null,"archetype": null,"experience": null},"value": null,"attributes": {},"properties": {"push": true},"eras": {"1920": true,"nvct": true,"drka": true,"ddts": true,"glit": true,"pulp": true,"mdrn": true},"flags": {}},"effects": [],"folder": null,"sort": 0,"permission": {"default": 0,"f2tegjkWyWhBBgnj": 3},"flags": {"core": {"sourceId": "Compendium.CoC7.skills.Xmg7oAy70DKpv4kq"}}},{"_id": "qPXnOlg3n92R7O85","name": "Natural World","type": "skill","img": "systems/CoC7/assets/icons/skills/natural_world.svg","data": {"skillName": "Natural World","specialization": "","description": {"value": "See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty": "","pushedFaillureConsequences": "","chat": "","keeper": ""},"base": "10","adjustments": {"personal": null,"occupation": null,"archetype": null,"experience": null},"value": null,"attributes": {},"properties": {"push": true},"eras": {"1920": true,"nvct": true,"drka": false,"ddts": true,"glit": true,"pulp": true,"mdrn": true},"flags": {}},"effects": [],"folder": null,"sort": 0,"permission": {"default": 0,"f2tegjkWyWhBBgnj": 3},"flags": {"core": {"sourceId": "Compendium.CoC7.skills.jTcu6Ni2ek7Yz5q3"}}},{"_id": "GtVW9kz8j6mD8m58","name": "Navigate","type": "skill","img": "systems/CoC7/assets/icons/skills/navigate.svg","data": {"skillName": "Navigate","specialization": "","description": {"value": "See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty": "","pushedFaillureConsequences": "","chat": "","keeper": ""},"base": "10","adjustments": {"personal": null,"occupation": null,"archetype": null,"experience": null},"value": null,"attributes": {},"properties": {"push": true},"eras": {"1920": true,"nvct": true,"drka": true,"ddts": true,"glit": true,"pulp": true,"mdrn": true},"flags": {}},"effects": [],"folder": null,"sort": 0,"permission": {"default": 0,"f2tegjkWyWhBBgnj": 3},"flags": {"core": {"sourceId": "Compendium.CoC7.skills.1c3fdvpQtvZf5YXK"}}},{"_id": "MeSZfeUgsHUE9F9m","name": "Occult","type": "skill","img": "systems/CoC7/assets/icons/skills/occult.svg","data": {"skillName": "Occult","specialization": "","description": {"value": "See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty": "","pushedFaillureConsequences": "","chat": "","keeper": ""},"base": "5","adjustments": {"personal": null,"occupation": null,"archetype": null,"experience": null},"value": null,"attributes": {},"properties": {"push": true},"eras": {"1920": true,"nvct": true,"drka": true,"ddts": true,"glit": true,"pulp": true,"mdrn": true},"flags": {}},"effects": [],"folder": null,"sort": 0,"permission": {"default": 0,"f2tegjkWyWhBBgnj": 3},"flags": {"core": {"sourceId": "Compendium.CoC7.skills.6pSfZVS68jSHxa5T"}}},{"_id": "01wRdHg6uK4TQD1m","name": "Operate Heavy Machinery","type": "skill","img": "systems/CoC7/assets/icons/skills/operate_heavy_machinery.svg","data": {"skillName": "Operate Heavy Machinery","specialization": "","description": {"value": "See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty": "","pushedFaillureConsequences": "","chat": "","keeper": ""},"base": "1","adjustments": {"personal": null,"occupation": null,"archetype": null,"experience": null},"value": null,"attributes": {},"properties": {"push": true},"eras": {"1920": true,"nvct": false,"drka": false,"ddts": true,"glit": true,"pulp": false,"mdrn": true},"flags": {}},"effects": [],"folder": null,"sort": 0,"permission": {"default": 0,"f2tegjkWyWhBBgnj": 3},"flags": {"core": {"sourceId": "Compendium.CoC7.skills.cuExWy1130KUwuWz"}}},{"_id": "RcLYCAd4zn4ucfrt","name": "Persuade","type": "skill","img": "systems/CoC7/assets/icons/skills/persuade.svg","data": {"skillName": "Persuade","specialization": "","description": {"value": "See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty": "","pushedFaillureConsequences": "","chat": "","keeper": ""},"base": "10","adjustments": {"personal": null,"occupation": null,"archetype": null,"experience": null},"value": null,"attributes": {},"properties": {"push": true},"eras": {"1920": true,"nvct": true,"drka": true,"ddts": true,"glit": true,"pulp": true,"mdrn": true},"flags": {}},"effects": [],"folder": null,"sort": 0,"permission": {"default": 0,"f2tegjkWyWhBBgnj": 3},"flags": {"core": {"sourceId": "Compendium.CoC7.skills.uMzSNURmZqjxr7mU"}}},{"_id": "VpsprviqIXRc3EAF","name": "Psychoanalysis","type": "skill","img": "systems/CoC7/assets/icons/skills/psychoanalysis.svg","data": {"skillName": "Psychoanalysis","specialization": "","description": {"value": "See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty": "","pushedFaillureConsequences": "","chat": "","keeper": ""},"base": "1","adjustments": {"personal": null,"occupation": null,"archetype": null,"experience": null},"value": null,"attributes": {},"properties": {"push": true},"eras": {"1920": true,"nvct": false,"drka": false,"ddts": false,"glit": false,"pulp": true,"mdrn": true},"flags": {}},"effects": [],"folder": null,"sort": 0,"permission": {"default": 0,"f2tegjkWyWhBBgnj": 3},"flags": {"core": {"sourceId": "Compendium.CoC7.skills.rXBU2GofiO2qOsGv"}}},{"_id": "JOw0IOr7IOwzKyJ5","name": "Psychology","type": "skill","img": "systems/CoC7/assets/icons/skills/psychology.svg","data": {"skillName": "Psychology","specialization": "","description": {"value": "See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty": "","pushedFaillureConsequences": "","chat": "","keeper": ""},"base": "10","adjustments": {"personal": null,"occupation": null,"archetype": null,"experience": null},"value": null,"attributes": {},"properties": {"push": true},"eras": {"1920": true,"nvct": false,"drka": false,"ddts": true,"glit": true,"pulp": true,"mdrn": true},"flags": {}},"effects": [],"folder": null,"sort": 0,"permission": {"default": 0,"f2tegjkWyWhBBgnj": 3},"flags": {"core": {"sourceId": "Compendium.CoC7.skills.MFR4eR79niGaLfph"}}},{"_id": "1diyhnSEoVUP7cUX","name": "Ride","type": "skill","img": "systems/CoC7/assets/icons/skills/ride.svg","data": {"skillName": "Ride","specialization": "","description": {"value": "See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty": "","pushedFaillureConsequences": "","chat": "","keeper": ""},"base": "5","adjustments": {"personal": null,"occupation": null,"archetype": null,"experience": null},"value": null,"attributes": {},"properties": {"push": true},"eras": {"1920": true,"nvct": true,"drka": true,"ddts": true,"glit": true,"pulp": true,"mdrn": true},"flags": {}},"effects": [],"folder": null,"sort": 0,"permission": {"default": 0,"f2tegjkWyWhBBgnj": 3},"flags": {"core": {"sourceId": "Compendium.CoC7.skills.o7TdzbuSP7ticONf"}}},{"_id": "jnwwvXj9PfpMeyfa","name": "Science (Chemistry)","type": "skill","img": "systems/CoC7/assets/icons/skills/science_chemistry.svg","data": {"skillName": "Chemistry","specialization": "Science","description": {"value": "See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty": "","pushedFaillureConsequences": "","chat": "","keeper": ""},"base": "1","adjustments": {"personal": null,"occupation": null,"archetype": null,"experience": null},"value": null,"attributes": {},"properties": {"special": true,"push": true},"eras": {"1920": true,"nvct": false,"drka": false,"ddts": false,"glit": false,"pulp": false,"mdrn": true},"flags": {}},"effects": [],"folder": null,"sort": 0,"permission": {"default": 0,"f2tegjkWyWhBBgnj": 3},"flags": {"core": {"sourceId": "Compendium.CoC7.skills.8twBT7nbyh5dEp3J"}}},{"_id": "MsuFtn5Mlzr9ZmH5","name": "Sleight of Hand","type": "skill","img": "systems/CoC7/assets/icons/skills/sleight_of_hand.svg","data": {"skillName": "Sleight of Hand","specialization": "","description": {"value": "See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty": "","pushedFaillureConsequences": "","chat": "","keeper": ""},"base": "10","adjustments": {"personal": null,"occupation": null,"archetype": null,"experience": null},"value": null,"attributes": {},"properties": {"push": true},"eras": {"1920": true,"nvct": true,"drka": true,"ddts": true,"glit": true,"pulp": true,"mdrn": true},"flags": {}},"effects": [],"folder": null,"sort": 0,"permission": {"default": 0,"f2tegjkWyWhBBgnj": 3},"flags": {"core": {"sourceId": "Compendium.CoC7.skills.KKFNX5M4LtEtiuxs"}}},{"_id": "Ma2wIagNCMHCZPtc","name": "Spot Hidden","type": "skill","img": "systems/CoC7/assets/icons/skills/spot_hidden.svg","data": {"skillName": "Spot Hidden","specialization": "","description": {"value": "See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty": "","pushedFaillureConsequences": "","chat": "","keeper": ""},"base": "25","adjustments": {"personal": null,"occupation": null,"archetype": null,"experience": null},"value": null,"attributes": {},"properties": {"push": true},"eras": {"1920": true,"nvct": true,"drka": true,"ddts": true,"glit": true,"pulp": true,"mdrn": true},"flags": {}},"effects": [],"folder": null,"sort": 0,"permission": {"default": 0,"f2tegjkWyWhBBgnj": 3},"flags": {"core": {"sourceId": "Compendium.CoC7.skills.nHaWNwtW3Lg0sqYJ"}}},{"_id": "6OiGCnzzSfZn4n73","name": "Stealth","type": "skill","img": "systems/CoC7/assets/icons/skills/stealth.svg","data": {"skillName": "Stealth","specialization": "","description": {"value": "See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty": "","pushedFaillureConsequences": "","chat": "","keeper": ""},"base": "20","adjustments": {"personal": null,"occupation": null,"archetype": null,"experience": null},"value": null,"attributes": {},"properties": {"push": true},"eras": {"1920": true,"nvct": true,"drka": true,"ddts": true,"glit": true,"pulp": true,"mdrn": true},"flags": {}},"effects": [],"folder": null,"sort": 0,"permission": {"default": 0,"f2tegjkWyWhBBgnj": 3},"flags": {"core": {"sourceId": "Compendium.CoC7.skills.DcV524K0jNfjDEZC"}}},{"_id": "0oGWHuK8BnQ5B6ho","name": "Swim","type": "skill","img": "systems/CoC7/assets/icons/skills/swim.svg","data": {"skillName": "Swim","specialization": "","description": {"value": "See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty": "","pushedFaillureConsequences": "","chat": "","keeper": ""},"base": "20","adjustments": {"personal": null,"occupation": null,"archetype": null,"experience": null},"value": null,"attributes": {},"properties": {"push": true},"eras": {"1920": true,"nvct": true,"drka": true,"ddts": true,"glit": true,"pulp": true,"mdrn": true},"flags": {}},"effects": [],"folder": null,"sort": 0,"permission": {"default": 0,"f2tegjkWyWhBBgnj": 3},"flags": {"core": {"sourceId": "Compendium.CoC7.skills.1zSIeY0eat2AxQok"}}},{"_id": "4uoHnRl7akCDPogc","name": "Fists","type": "weapon","img": "systems/CoC7/assets/icons/skills/fighting_brawl.svg","data": {"description": {"value": "","chat": "","special": "","keeper": ""},"wpnType": "","skill": {"main": {"name": "Brawl","id": "28W5Wr09jltOPNY0"},"alternativ": {"name": "","id": ""}},"range": {"normal": {"value": 0,"units": "","damage": "1D3"},"long": {"value": 0,"units": "","damage": ""},"extreme": {"value": 0,"units": "","damage": ""}},"usesPerRound": {"normal": "1","max": "","burst": null},"bullets": "","ammo": 0,"malfunction": "","blastRadius": null,"properties": {"addb": true,"ahdb": false,"melee": true,"rngd": false,"shotgun": false,"brst": false,"auto": false,"dbrl": false},"eras": {"1920": false,"nvct": false,"drka": false,"ddts": false,"glit": false,"pulp": false,"mdrn": false},"price": {}},"effects": [],"folder": null,"sort": 100000,"permission": {"default": 0,"f2tegjkWyWhBBgnj": 3},"flags": {"core": {"sourceId": "Item.Uldjvs5fvCMri6RN"}}}],"effects": [],"flags": {"CoC7": {"skillListMode": false,"skillShowUncommon": true},"exportSource": {"world": "dholes","system": "CoC7","coreVersion": "9.269","systemVersion": "0.7.11"}}} +{"_id":"KgyqcEJZZztYfpEr","name":"Goon","type":"npc","img":"icons/svg/mystery-man.svg","data":{"characteristics":{"str":{"value":null,"tempValue":null,"short":"CHARAC.STR","label":"CHARAC.Strength","formula":"5*2d6+6"},"con":{"value":null,"tempValue":null,"short":"CHARAC.CON","label":"CHARAC.Constitution","formula":"5*3d6"},"siz":{"value":null,"tempValue":null,"short":"CHARAC.SIZ","label":"CHARAC.Size","formula":"5*3d6"},"dex":{"value":null,"tempValue":null,"short":"CHARAC.DEX","label":"CHARAC.Dexterity","formula":"5*3d6"},"app":{"value":null,"tempValue":null,"short":"CHARAC.APP","label":"CHARAC.Appearance","formula":"5*1d6"},"int":{"value":null,"tempValue":null,"short":"CHARAC.INT","label":"CHARAC.Intelligence","formula":"5*1d6"},"pow":{"value":null,"tempValue":null,"short":"CHARAC.POW","label":"CHARAC.Power","formula":"0"},"edu":{"value":null,"tempValue":null,"short":"CHARAC.EDU","label":"CHARAC.Education","formula":"0"}},"attribs":{"hp":{"value":null,"max":null,"short":"HP","label":"Hit points","auto":true},"mp":{"value":null,"max":null,"short":"HP","label":"Magic points","auto":true},"lck":{"value":null,"short":"LCK","label":"Luck","max":99},"san":{"value":50,"max":99,"short":"SAN","label":"Sanity","auto":true,"dailyLoss":0,"oneFifthSanity":" / 0"},"mov":{"value":8,"max":8,"short":"MOV","label":"Movement rate","auto":true},"db":{"value":-2,"short":"DB","label":"Damage bonus","auto":true},"build":{"current":-2,"value":-2,"short":"BLD","label":"Build","auto":true},"armor":{"value":null,"localized":false,"locations":[],"auto":false}},"conditions":{"criticalWounds":{"value":false},"unconscious":{"value":false},"dying":{"value":false},"dead":{"value":false},"prone":{"value":false},"tempoInsane":{"value":false},"indefInsane":{"value":false}},"personalDescription":{"type":"string","value":""},"description":{"keeper":""},"special":{"sanLoss":{"checkPassed":"","checkFailled":""},"attacksPerRound":1},"infos":{"occupation":"Obey to the villain","age":"Average","sex":""},"flags":{"locked":true,"displayFormula":false},"attacksPerRound":1},"token":{"name":"Goon","displayName":0,"actorLink":false,"width":1,"height":1,"scale":1,"mirrorX":false,"mirrorY":false,"lockRotation":false,"rotation":0,"alpha":1,"vision":false,"dimSight":0,"brightSight":0,"dimLight":0,"brightLight":0,"sightAngle":0,"lightAngle":0,"lightAlpha":0.25,"lightAnimation":{"speed":5,"intensity":5},"disposition":-1,"displayBars":0,"bar1":{"attribute":"attribs.hp"},"bar2":{"attribute":"attribs.san"},"flags":{},"randomImg":false,"img":"icons/svg/mystery-man.svg","light":{"alpha":0.5,"angle":0,"bright":0,"coloration":1,"dim":0,"gradual":true,"luminosity":0.5,"saturation":0,"contrast":0,"shadows":0,"animation":{"speed":5,"intensity":5,"reverse":false},"darkness":{"min":0,"max":1}}},"items":[{"_id":"nhNyqjmMf2xgLEAh","name":"Secret documents","type":"item","img":"icons/svg/item-bag.svg","data":{"description":{"value":"","keeper":""},"quantity":1,"weight":0,"attributes":{}},"effects":[],"folder":"WdotG7nzDUJKNBCF","sort":0,"permission":{"default":0},"flags":{"core":{"sourceId":"Item.5lfgKDdff95ONHW5"}}},{"_id":"pjiFo3geRss79cUu","name":"Orders","type":"item","img":"icons/svg/item-bag.svg","data":{"description":{"value":"","keeper":""},"quantity":1,"weight":0,"attributes":{}},"effects":[],"folder":"WdotG7nzDUJKNBCF","sort":0,"permission":{"default":0},"flags":{"core":{"sourceId":"Item.PFxgMt9PmW9JcrS6"}}},{"_id":"dRfkuKnn9Vl7BAnR","name":"Firearms (Shotgun)","type":"skill","img":"systems/CoC7/assets/icons/skills/firearms_rifle_shotgun.svg","data":{"skillName":"Shotgun","specialization":"Firearms","description":{"value":"","opposingDifficulty":"","pushedFaillureConsequences":"","chat":"","keeper":""},"base":"25","adjustments":{"personal":null,"occupation":null,"archetype":null,"experience":null},"value":25,"attributes":{},"properties":{"special":true,"fighting":false,"firearm":true,"combat":true},"eras":{},"flags":{}},"effects":[],"folder":null,"sort":0,"permission":{"default":0},"flags":{}},{"_id":"x3n4xMyqXSGATZ9L","name":"Shotgun","type":"weapon","img":"icons/svg/sword.svg","data":{"description":{"value":"Description of the weapon
\nselecting 'Area of effect' will enable 3 different damage and range
\nselecting 'Full-auto' will allow 2 different skills to be selected for the weapon
\nselecting 'Special' will activate the special input field
\nIn the combat tab, if the icons are with a red background, it means that no skill have been selected for that weapon
\nEdit the weapon and select the correct skill.
","chat":"","special":"","keeper":""},"wpnType":"","skill":{"main":{"name":"Shotgun","id":"dRfkuKnn9Vl7BAnR"},"alternativ":{"name":"","id":""}},"range":{"normal":{"value":"15ft","units":"","damage":"1d6"},"long":{"value":0,"units":"","damage":""},"extreme":{"value":0,"units":"","damage":""}},"usesPerRound":{"normal":"1","max":"","burst":null},"bullets":"","ammo":0,"malfunction":"","blastRadius":null,"properties":{"melee":false,"rngd":true},"eras":{"1920":true,"nvct":false,"drka":false,"ddts":false,"glit":false,"pulp":false,"mdrn":true},"price":{"1920":"5$","mdrn":"6$"}},"effects":[],"folder":"WdotG7nzDUJKNBCF","sort":0,"permission":{"default":0},"flags":{"core":{"sourceId":"Item.fnyCgkQluYSM4yTl"}}},{"_id":"bn7QZKctB109130p","name":"Punch","type":"weapon","img":"icons/svg/sword.svg","data":{"description":{"value":"","chat":"","special":"","keeper":""},"wpnType":"","skill":{"main":{"name":"Brawl","id":"coPK7CiB6zbpnofh"},"alternativ":{"name":"","id":""}},"range":{"normal":{"value":0,"units":"","damage":"1D3"},"long":{"value":0,"units":"","damage":""},"extreme":{"value":0,"units":"","damage":""}},"usesPerRound":{"normal":"1","max":"","burst":null},"bullets":"","ammo":0,"malfunction":"","blastRadius":null,"properties":{"addb":true,"ahdb":false,"slnt":true,"melee":true,"rngd":false,"shotgun":false,"brst":false,"auto":false,"dbrl":false},"eras":{"1920":false,"nvct":false,"drka":false,"ddts":false,"glit":false,"pulp":false,"mdrn":false},"price":{}},"effects":[],"folder":null,"sort":100000,"permission":{"default":0},"flags":{"core":{"sourceId":"Item.Uldjvs5fvCMri6RN"}}},{"_id":"coPK7CiB6zbpnofh","name":"Fighting (Brawl)","type":"skill","img":"systems/CoC7/assets/icons/skills/fighting_brawl.svg","data":{"skillName":"Brawl","specialization":"Fighting","description":{"value":"See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty":"","pushedFaillureConsequences":"","chat":"","keeper":""},"base":"25","adjustments":{"personal":null,"occupation":null,"archetype":null,"experience":null},"value":"25","attributes":{},"properties":{"fighting":true,"firearm":false,"combat":true,"special":true},"eras":{"1920":true,"nvct":false,"drka":false,"ddts":false,"glit":false,"pulp":false,"mdrn":true},"flags":{}},"effects":[],"folder":null,"sort":0,"permission":{"default":0},"flags":{"core":{"sourceId":"Compendium.world.skills.vS8bsPWFlwgOecoB"}}},{"_id":"cYRUJwddg0yvccHL","name":"Club","type":"weapon","img":"icons/svg/sword.svg","data":{"description":{"value":"","chat":"","special":"","keeper":""},"wpnType":"","skill":{"main":{"name":"Brawl","id":"coPK7CiB6zbpnofh"},"alternativ":{"name":"","id":""}},"range":{"normal":{"value":0,"units":"","damage":"1d4"},"long":{"value":0,"units":"","damage":""},"extreme":{"value":0,"units":"","damage":""}},"usesPerRound":{"normal":"1","max":"","burst":null},"bullets":"","ammo":0,"malfunction":"","blastRadius":null,"properties":{"ahdb":true,"addb":false,"slnt":true,"stun":true,"melee":true,"rngd":false,"shotgun":false,"brst":false,"auto":false,"dbrl":false},"eras":{"1920":false,"nvct":false,"drka":false,"ddts":false,"glit":false,"pulp":false,"mdrn":false},"price":{}},"effects":[],"folder":"WdotG7nzDUJKNBCF","sort":300000,"permission":{"default":0},"flags":{"core":{"sourceId":"Item.BZRfjXQ4V43t4fNw"}}},{"_id":"Cy8zEO2hzmxHYe1g","name":"Receive orders","type":"skill","img":"systems/CoC7/assets/icons/skills.svg","data":{"skillName":"Receive orders","specialization":"","description":{"value":"","opposingDifficulty":"","pushedFaillureConsequences":"","chat":"","keeper":""},"base":"0","adjustments":{"personal":null,"occupation":null,"archetype":null,"experience":null},"value":"95","attributes":{},"properties":{"push":true},"eras":{},"flags":{}},"effects":[],"folder":"WdotG7nzDUJKNBCF","sort":0,"permission":{"default":0},"flags":{"core":{"sourceId":"Item.cOzs5LkYR1icbzo9"}}},{"_id":"bQq5zs3LeTyZ8O57","name":"Language (Own)","type":"skill","img":"systems/CoC7/assets/icons/skills/language.svg","data":{"skillName":"Own","specialization":"Language","description":{"value":"See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty":"","pushedFaillureConsequences":"","chat":"","keeper":""},"base":"@EDU","adjustments":{"personal":null,"occupation":null,"archetype":null,"experience":null},"value":"@EDU","attributes":{},"properties":{"push":true,"special":false},"eras":{"1920":true,"nvct":false,"drka":false,"ddts":false,"glit":false,"pulp":false,"mdrn":true},"flags":{}},"effects":[],"folder":null,"sort":0,"permission":{"default":0},"flags":{"core":{"sourceId":"Compendium.world.skills.rhJ1Q9OB3uTUZmjD"}}},{"_id":"AWcXwvVJG779q7fH","name":"Dodge","type":"skill","img":"systems/CoC7/assets/icons/skills/dodge.svg","data":{"skillName":"Dodge","specialization":"","description":{"value":"See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty":"","pushedFaillureConsequences":"","chat":"","keeper":""},"base":"1/2*@DEX","adjustments":{"personal":null,"occupation":null,"archetype":null,"experience":null},"value":"1/2*@DEX","attributes":{},"properties":{},"eras":{"1920":true,"nvct":false,"drka":false,"ddts":false,"glit":false,"pulp":false,"mdrn":true},"flags":{}},"effects":[],"folder":null,"sort":0,"permission":{"default":0},"flags":{"core":{"sourceId":"Compendium.world.skills.wK8XxNj9QwXlGFEb"}}},{"_id":"U7Nsi0qkuJjemOaf","name":"Try hard","type":"skill","img":"systems/CoC7/assets/icons/skills.svg","data":{"skillName":"Try hard","specialization":"","description":{"value":"","opposingDifficulty":"","pushedFaillureConsequences":"","chat":"","keeper":""},"base":"0","adjustments":{"personal":null,"occupation":null,"archetype":null,"experience":null},"value":"10","attributes":{},"properties":{"push":true},"eras":{},"flags":{}},"effects":[],"folder":"WdotG7nzDUJKNBCF","sort":0,"permission":{"default":0},"flags":{"core":{"sourceId":"Item.aEK9aFa8uoMJLiSg"}}},{"_id":"lm867qysqMBwLEK9","name":"Be a pain","type":"skill","img":"systems/CoC7/assets/icons/skills.svg","data":{"skillName":"Be a pain","specialization":"","description":{"value":"","opposingDifficulty":"","pushedFaillureConsequences":"","chat":"","keeper":""},"base":"0","adjustments":{"personal":null,"occupation":null,"archetype":null,"experience":null},"value":"50","attributes":{},"properties":{"push":true},"eras":{},"flags":{}},"effects":[],"folder":"WdotG7nzDUJKNBCF","sort":0,"permission":{"default":0},"flags":{"core":{"sourceId":"Item.DGD3CQQWsYIqhLWL"}}}],"effects":[],"folder":null,"sort":0,"permission":{"default":0},"flags":{"core":{"sourceId":"Actor.0skVq6Pae0GlrSMU"}}} +{"_id":"XE2vjLG03wGfnYLw","name":"Creature example","type":"creature","img":"icons/svg/mystery-man.svg","data":{"characteristics":{"str":{"value":0,"tempValue":null,"short":"CHARAC.STR","label":"CHARAC.Strength","formula":"1d6"},"con":{"value":10,"tempValue":null,"short":"CHARAC.CON","label":"CHARAC.Constitution","formula":"2d6"},"siz":{"value":50,"tempValue":null,"short":"CHARAC.SIZ","label":"CHARAC.Size","formula":"5*3d6"},"dex":{"value":10,"tempValue":null,"short":"CHARAC.DEX","label":"CHARAC.Dexterity","formula":"4d6"},"app":{"value":20,"tempValue":null,"short":"CHARAC.APP","label":"CHARAC.Appearance","formula":"5d6"},"int":{"value":20,"tempValue":null,"short":"CHARAC.INT","label":"CHARAC.Intelligence","formula":"6d6"},"pow":{"value":0,"tempValue":null,"short":"CHARAC.POW","label":"CHARAC.Power","formula":""},"edu":{"value":0,"tempValue":null,"short":"CHARAC.EDU","label":"CHARAC.Education","formula":"0"}},"attribs":{"hp":{"value":6,"max":6,"short":"HP","label":"Hit points","auto":true},"mp":{"value":0,"max":0,"short":"HP","label":"Magic points","auto":true},"lck":{"value":0,"short":"LCK","label":"Luck","max":99},"san":{"value":0,"max":99,"short":"SAN","label":"Sanity","auto":true,"dailyLoss":0,"oneFifthSanity":" / 0"},"mov":{"value":7,"max":7,"short":"MOV","label":"Movement rate","auto":true},"db":{"value":-2,"short":"DB","label":"Damage bonus","auto":true},"build":{"current":-2,"value":-2,"short":"BLD","label":"Build","auto":true},"armor":{"value":null,"localized":false,"locations":[],"auto":false}},"conditions":{"criticalWounds":{"value":false},"unconscious":{"value":false},"dying":{"value":false},"dead":{"value":false},"prone":{"value":false},"tempoInsane":{"value":false},"indefInsane":{"value":false}},"personalDescription":{"type":"string","value":""},"description":{"keeper":""},"special":{"attribs":{"move":{"primary":{"enabled":false,"value":null,"type":null},"secondary":{"enabled":false,"value":null,"type":null}}},"sanLoss":{"checkPassed":"","checkFailled":""},"attacksPerRound":1},"infos":{"type":""},"flags":{"locked":true,"displayFormula":false},"biography":{"personalDescription":{"value":"Clicking the lock will allow modification of the sheet.
\nWhen sheet is unlock you can modify things directly from the sheet. You can also open the entities sheets and delete things.
\nIn that mode you can create skills/possessions by clicking the + icon. Holding shift will bypass the opening of the corresponding sheet.
\nYou can enter characteristics as numbers and as formulas. Click the right icon to toggle modes. Clicking the red dice will roll the formula when possible. So you can have your creature with defined values, or roll/reroll the value on demand.
"}}},"token":{"name":"Creature example","displayName":0,"actorLink":false,"width":1,"height":1,"scale":1,"mirrorX":false,"mirrorY":false,"lockRotation":false,"rotation":0,"alpha":1,"vision":false,"dimSight":0,"brightSight":0,"dimLight":0,"brightLight":0,"sightAngle":0,"lightAngle":0,"lightAlpha":0.25,"lightAnimation":{"speed":5,"intensity":5},"disposition":-1,"displayBars":0,"bar1":{"attribute":"attribs.hp"},"bar2":{"attribute":"attribs.san"},"flags":{},"randomImg":false,"img":"icons/svg/mystery-man.svg","light":{"alpha":0.5,"angle":0,"bright":0,"coloration":1,"dim":0,"gradual":true,"luminosity":0.5,"saturation":0,"contrast":0,"shadows":0,"animation":{"speed":5,"intensity":5,"reverse":false},"darkness":{"min":0,"max":1}}},"items":[{"_id":"uThvps46yrs3LyNw","name":"Pile of junk","type":"item","img":"icons/svg/item-bag.svg","data":{"description":{"value":"","keeper":""},"quantity":1,"weight":0,"attributes":{}},"effects":[],"folder":"WdotG7nzDUJKNBCF","sort":0,"permission":{"default":0},"flags":{"core":{"sourceId":"Item.r8S7V9kUWpjtMxaX"}}},{"_id":"jc6aXhzjXLKREJIy","name":"Fighting (Fighting)","type":"skill","img":"systems/CoC7/assets/icons/skills.svg","data":{"skillName":"Fighting","specialization":"Fighting","description":{"value":"","opposingDifficulty":"","pushedFaillureConsequences":"","chat":"","keeper":""},"base":"50","adjustments":{"personal":null,"occupation":null,"archetype":null,"experience":null},"value":50,"attributes":{},"properties":{"special":true,"fighting":true,"firearm":false,"combat":true},"eras":{},"flags":{}},"effects":[],"folder":null,"sort":0,"permission":{"default":0},"flags":{}},{"_id":"ddI3EOxhNRDrbiWW","name":"Innate attack","type":"weapon","img":"icons/svg/sword.svg","data":{"description":{"value":"Creature's natural attack
","chat":"","special":"","keeper":""},"wpnType":"","skill":{"main":{"name":"Fighting","id":"jc6aXhzjXLKREJIy"},"alternativ":{"name":"","id":""}},"range":{"normal":{"value":0,"units":"","damage":"1d3"},"long":{"value":0,"units":"","damage":""},"extreme":{"value":0,"units":"","damage":""}},"usesPerRound":{"normal":"1","max":"","burst":null},"bullets":"","ammo":0,"malfunction":"","blastRadius":null,"properties":{"melee":true,"rngd":false,"shotgun":false,"brst":false,"auto":false,"dbrl":false,"addb":true,"ahdb":false,"slnt":true},"eras":{"1920":false,"nvct":false,"drka":false,"ddts":false,"glit":false,"pulp":false,"mdrn":false},"price":{}},"effects":[],"folder":"WdotG7nzDUJKNBCF","sort":0,"permission":{"default":0},"flags":{"core":{"sourceId":"Item.i9tOh6fwndVIGwHR"}}},{"_id":"qMUYPKo3mj4zOPjA","name":"Fighting (Slice PCs in small cubes)","type":"skill","img":"systems/CoC7/assets/icons/skills.svg","data":{"skillName":"Slice PCs in small cubes","specialization":"Fighting","description":{"value":"","opposingDifficulty":"","pushedFaillureConsequences":"","chat":"","keeper":""},"base":"75","adjustments":{"personal":null,"occupation":null,"archetype":null,"experience":null},"value":75,"attributes":{},"properties":{"special":true,"fighting":true,"firearm":false,"combat":true},"eras":{},"flags":{}},"effects":[],"folder":null,"sort":0,"permission":{"default":0},"flags":{}},{"_id":"wxRnkgFqjB1A0dOY","name":"Deadly claws","type":"weapon","img":"icons/svg/sword.svg","data":{"description":{"value":"","chat":"","special":"You can add special description or slugs there :
\nSlug 1 : 2d17kh
","keeper":""},"wpnType":"","skill":{"main":{"name":"Slice PCs in small cubes","id":"qMUYPKo3mj4zOPjA"},"alternativ":{"name":"Fighting","id":"jc6aXhzjXLKREJIy"}},"range":{"normal":{"value":0,"units":"","damage":"10d6"},"long":{"value":0,"units":"","damage":""},"extreme":{"value":0,"units":"","damage":""}},"usesPerRound":{"normal":"1","max":"","burst":""},"bullets":"","ammo":0,"malfunction":"","blastRadius":null,"properties":{"brst":true,"spcl":true,"melee":true,"rngd":false,"shotgun":false,"auto":false,"dbrl":false},"eras":{"1920":true,"nvct":false,"drka":false,"ddts":false,"glit":false,"pulp":false,"mdrn":true},"price":{"1920":"5$","mdrn":"6$"}},"effects":[],"folder":"WdotG7nzDUJKNBCF","sort":0,"permission":{"default":0},"flags":{"core":{"sourceId":"Item.NWkpD68urH6gwHkU"}}}],"effects":[],"folder":null,"sort":0,"permission":{"default":0},"flags":{"core":{"sourceId":"Actor.ExVcSKXT23bi0A4u"}}} +{"_id":"r7bDSY4OYKxQYEas","name":"Cupboard","type":"container","img":"icons/svg/chest.svg","data":{"description":{"value":"The lock on the door was removed years ago leaving a hole. You have to poke something in the hole to pull the door open.
","keeper":""},"flags":{"locked":false}},"token":{"actorLink":true,"name":"Floor safe","displayName":0,"width":1,"height":1,"scale":1,"mirrorX":false,"mirrorY":false,"lockRotation":false,"rotation":0,"alpha":1,"vision":false,"dimSight":0,"brightSight":0,"dimLight":0,"brightLight":0,"sightAngle":0,"lightAngle":0,"lightAlpha":0.25,"lightAnimation":{"speed":5,"intensity":5},"disposition":-1,"displayBars":0,"bar1":{"attribute":"attribs.hp"},"bar2":{"attribute":"attribs.san"},"flags":{},"randomImg":false,"img":"icons/svg/chest.svg","light":{"alpha":0.5,"angle":0,"bright":0,"coloration":1,"dim":0,"gradual":true,"luminosity":0.5,"saturation":0,"contrast":0,"shadows":0,"animation":{"speed":5,"intensity":5,"reverse":false},"darkness":{"min":0,"max":1}}},"items":[{"_id":"L7F6PDH2dK7ZNYxZ","name":"Fighting (Sword)","type":"skill","img":"systems/CoC7/assets/icons/skills.svg","data":{"skillName":"Sword","specialization":"Fighting","description":{"value":"","opposingDifficulty":"","pushedFaillureConsequences":"","chat":"","keeper":""},"base":"20","adjustments":{"personal":null,"occupation":null,"archetype":null,"experience":null},"value":20,"attributes":{},"properties":{"special":true,"fighting":true,"firearm":false,"combat":true},"eras":{},"flags":{}},"effects":[],"folder":null,"sort":0,"permission":{"default":0},"flags":{}},{"_id":"ZtIdjmVil351PsA2","name":"Rapier","type":"weapon","img":"icons/svg/sword.svg","data":{"description":{"value":"","chat":"","special":"","keeper":""},"wpnType":"","skill":{"main":{"name":"Sword","id":"L7F6PDH2dK7ZNYxZ"},"alternativ":{"name":"","id":""}},"range":{"normal":{"value":0,"units":"","damage":"1D6+1"},"long":{"value":0,"units":"","damage":""},"extreme":{"value":0,"units":"","damage":""}},"usesPerRound":{"normal":"1","max":"","burst":null},"bullets":"","ammo":0,"malfunction":"","blastRadius":null,"properties":{"addb":true,"ahdb":false,"melee":true,"rngd":false,"shotgun":false,"brst":false,"auto":false,"dbrl":false},"eras":{"1920":true,"nvct":false,"drka":false,"ddts":false,"glit":false,"pulp":false,"mdrn":true},"price":{"1920":"$15","mdrn":"$100"}},"effects":[],"folder":"WdotG7nzDUJKNBCF","sort":0,"permission":{"default":0},"flags":{"core":{"sourceId":"Item.h57LwHlUKVT0oQvU"}}}],"effects":[],"folder":null,"sort":0,"permission":{"default":0},"flags":{"core":{"sourceId":"Actor.M8hvUblNcgImyozT"}}} diff --git a/packs/items.db b/packs/items.db index de499494..28cc1fea 100644 --- a/packs/items.db +++ b/packs/items.db @@ -1,6 +1,12 @@ -{"name":"1920's Setup Example","permission":{"default":0,"6Y6opwuMdxc52cY3":3},"type":"setup","data":{"description":{"value":"Default setup for 1920's character.
\n"},"characteristics":{"points":{"enabled":false,"value":"460"},"rolls":{"enabled":true,"enableIndividualRolls":true,"str":"(3D6)*5","con":"(3D6)*5","siz":"(2D6+6)*5","dex":"(3D6)*5","app":"(3D6)*5","int":"(2D6+6)*5","pow":"(3D6)*5","edu":"(2D6+6)*5","luck":"(3D6)*5"},"values":{"str":null,"con":null,"siz":null,"dex":null,"app":null,"int":null,"pow":null,"edu":null,"luck":null}},"source":"Keeper's rule book","enableCharacterisitics":true,"items":[{"_id":"Z7C3nynZIXiFXmrF","name":"Accounting","permission":{"default":0,"kEjKgSLquYZFCui9":3},"type":"skill","data":{"specialization":"","description":{"value":"
See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty":"","pushedFaillureConsequences":"","chat":""},"base":"5","value":-1,"attributes":{},"properties":{"special":false,"rarity":false,"push":true,"combat":false},"eras":{"1920":true,"nvct":false,"drka":false,"ddts":false,"glit":false,"pulp":false,"mdrn":true},"markforxp":false},"flags":{},"img":"systems/CoC7/assets/icons/skills.svg"},{"_id":"WTi5Q8fFYGqFDDam","name":"Anthropology","permission":{"default":0,"kEjKgSLquYZFCui9":3},"type":"skill","data":{"specialization":"","description":{"value":"See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty":"","pushedFaillureConsequences":"","chat":""},"base":"1","value":-1,"attributes":{},"properties":{"push":true,"special":false,"rarity":false,"combat":false},"eras":{"1920":true,"nvct":false,"drka":false,"ddts":false,"glit":false,"pulp":false,"mdrn":true},"markforxp":false},"flags":{},"img":"systems/CoC7/assets/icons/skills.svg"},{"_id":"j4vj4HUviZd6TAKz","name":"Appraise","permission":{"default":0,"kEjKgSLquYZFCui9":3},"type":"skill","data":{"specialization":"","description":{"value":"See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty":"","pushedFaillureConsequences":"","chat":""},"base":"5","value":-1,"attributes":{},"properties":{"push":true,"special":false,"rarity":false,"combat":false},"eras":{"1920":true,"nvct":false,"drka":false,"ddts":false,"glit":false,"pulp":false,"mdrn":true},"markforxp":false},"flags":{},"img":"systems/CoC7/assets/icons/skills.svg"},{"_id":"ObgfYtNCMv4MlgbO","name":"Archaeology","permission":{"default":0,"kEjKgSLquYZFCui9":3},"type":"skill","data":{"specialization":"","description":{"value":"See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty":"","pushedFaillureConsequences":"","chat":""},"base":"1","value":-1,"attributes":{},"properties":{"special":false,"rarity":false,"push":true,"combat":false},"eras":{"1920":true,"nvct":false,"drka":false,"ddts":false,"glit":false,"pulp":false,"mdrn":true},"markforxp":false},"flags":{},"img":"systems/CoC7/assets/icons/skills.svg"},{"_id":"iV3SdrNKsGB5BSli","name":"Art/Craft (Any)","permission":{"default":0,"6Y6opwuMdxc52cY3":3},"type":"skill","data":{"specialization":"Art/Craft","description":{"value":"See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty":"","pushedFaillureConsequences":"","chat":""},"base":"5","adjustments":{"personal":null,"occupation":null,"archetype":null,"experience":null},"value":-1,"attributes":{},"properties":{"push":true,"special":true,"rarity":false,"combat":false},"eras":{"1920":true,"nvct":false,"drka":false,"ddts":false,"glit":false,"pulp":false,"mdrn":true},"flags":{}},"flags":{},"img":"systems/CoC7/assets/icons/skills.svg"},{"_id":"otgWxSXPtfSKtzd9","name":"Charm","permission":{"default":0,"kEjKgSLquYZFCui9":3},"type":"skill","data":{"specialization":"","description":{"value":"See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty":"","pushedFaillureConsequences":"","chat":""},"base":"15","value":-1,"attributes":{},"properties":{"special":false,"rarity":false,"push":true,"combat":false},"eras":{"1920":true,"nvct":false,"drka":false,"ddts":false,"glit":false,"pulp":false,"mdrn":true},"markforxp":false},"flags":{},"img":"systems/CoC7/assets/icons/skills.svg"},{"_id":"FwWQNfn382EwfDFt","name":"Climb","permission":{"default":0,"kEjKgSLquYZFCui9":3},"type":"skill","data":{"specialization":"","description":{"value":"See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty":"","pushedFaillureConsequences":"","chat":""},"base":"20","value":-1,"attributes":{},"properties":{"push":true,"special":false,"rarity":false,"combat":false},"eras":{"1920":true,"nvct":false,"drka":false,"ddts":false,"glit":false,"pulp":false,"mdrn":true},"markforxp":false},"flags":{},"img":"systems/CoC7/assets/icons/skills.svg"},{"_id":"8HHFjJXoRN2hgBxf","name":"Credit Rating","permission":{"default":0,"kEjKgSLquYZFCui9":3},"type":"skill","data":{"specialization":"","description":{"value":"See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty":"","pushedFaillureConsequences":"","chat":""},"base":"0","value":-1,"attributes":{},"properties":{"special":false,"rarity":false,"push":true,"combat":false,"noxpgain":true},"eras":{"1920":true,"nvct":false,"drka":false,"ddts":false,"glit":false,"pulp":false,"mdrn":true},"markforxp":false},"flags":{},"img":"systems/CoC7/assets/icons/skills.svg"},{"_id":"yo3S2tR0SkfEisbe","name":"Cthulhu Mythos","permission":{"default":0,"kEjKgSLquYZFCui9":3},"type":"skill","data":{"specialization":"","description":{"value":"See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty":"","pushedFaillureConsequences":"","chat":""},"base":"0","value":-1,"attributes":{},"properties":{"special":false,"rarity":false,"push":false,"combat":false,"noxpgain":true,"noadjustments":true},"eras":{"1920":true,"nvct":false,"drka":false,"ddts":false,"glit":false,"pulp":false,"mdrn":true},"markforxp":false},"flags":{},"img":"systems/CoC7/assets/icons/skills.svg"},{"_id":"kKafbgrncOGqYwjH","name":"Disguise","permission":{"default":0,"kEjKgSLquYZFCui9":3},"type":"skill","data":{"specialization":"","description":{"value":"See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty":"","pushedFaillureConsequences":"","chat":""},"base":"5","value":-1,"attributes":{},"properties":{"special":false,"rarity":false,"push":true,"combat":false},"eras":{"1920":true,"nvct":false,"drka":false,"ddts":false,"glit":false,"pulp":false,"mdrn":true},"markforxp":false},"flags":{},"img":"systems/CoC7/assets/icons/skills.svg"},{"_id":"MDBvDDlP5IzOOnOC","name":"Dodge","permission":{"default":0,"kEjKgSLquYZFCui9":3},"type":"skill","data":{"specialization":"","description":{"value":"See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty":"","pushedFaillureConsequences":"","chat":""},"base":"1/2*@DEX","value":-1,"attributes":{},"properties":{"special":false,"rarity":false,"push":false,"combat":true},"eras":{"1920":true,"nvct":false,"drka":false,"ddts":false,"glit":false,"pulp":false,"mdrn":true},"markforxp":false},"flags":{},"img":"systems/CoC7/assets/icons/skills.svg"},{"_id":"tA5sEnhUyrzdCEu4","name":"Drive Auto","permission":{"default":0,"kEjKgSLquYZFCui9":3},"type":"skill","data":{"specialization":"","description":{"value":"See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty":"","pushedFaillureConsequences":"","chat":""},"base":"20","value":-1,"attributes":{},"properties":{"special":false,"rarity":false,"push":true,"combat":false},"eras":{"1920":true,"nvct":false,"drka":false,"ddts":false,"glit":false,"pulp":false,"mdrn":true},"markforxp":false},"flags":{},"img":"systems/CoC7/assets/icons/skills.svg"},{"_id":"9Z7rRlJ4kLXaJC6k","name":"Electrical Repair","permission":{"default":0,"kEjKgSLquYZFCui9":3},"type":"skill","data":{"specialization":"","description":{"value":"See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty":"","pushedFaillureConsequences":"","chat":""},"base":"10","value":-1,"attributes":{},"properties":{"push":true,"special":false,"rarity":false,"combat":false},"eras":{"1920":true,"nvct":false,"drka":false,"ddts":false,"glit":false,"pulp":false,"mdrn":true},"markforxp":false},"flags":{},"img":"systems/CoC7/assets/icons/skills.svg"},{"_id":"0KVMEYlXmj96Hg8r","name":"Fast Talk","permission":{"default":0,"kEjKgSLquYZFCui9":3},"type":"skill","data":{"specialization":"","description":{"value":"See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty":"","pushedFaillureConsequences":"","chat":""},"base":"5","value":-1,"attributes":{},"properties":{"special":false,"rarity":false,"push":true,"combat":false},"eras":{"1920":true,"nvct":false,"drka":false,"ddts":false,"glit":false,"pulp":false,"mdrn":true},"markforxp":false},"flags":{},"img":"systems/CoC7/assets/icons/skills.svg"},{"_id":"keyAD0YXeAafdvmi","name":"Brawl","permission":{"default":0,"kEjKgSLquYZFCui9":3},"type":"skill","data":{"specialization":"Fighting","description":{"value":"See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty":"","pushedFaillureConsequences":"","chat":""},"base":"25","value":-1,"attributes":{},"properties":{"special":true,"rarity":false,"push":false,"combat":true,"fighting":true,"firearm":false},"eras":{"1920":true,"nvct":false,"drka":false,"ddts":false,"glit":false,"pulp":false,"mdrn":true},"markforxp":false},"flags":{},"img":"systems/CoC7/assets/icons/skills.svg"},{"_id":"CQY7mhxduGFebAmi","name":"Handgun","permission":{"default":0,"kEjKgSLquYZFCui9":3},"type":"skill","data":{"specialization":"Firearms","description":{"value":"See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty":"","pushedFaillureConsequences":"","chat":""},"base":"20","value":-1,"attributes":{},"properties":{"special":true,"rarity":false,"push":false,"combat":true,"fighting":false,"firearm":true},"eras":{"1920":true,"nvct":false,"drka":false,"ddts":false,"glit":false,"pulp":false,"mdrn":true},"markforxp":false},"flags":{},"img":"systems/CoC7/assets/icons/skills.svg"},{"_id":"UD69qjXe0ZqPdnDZ","name":"Shotgun","permission":{"default":0,"kEjKgSLquYZFCui9":3},"type":"skill","data":{"specialization":"Firearms","description":{"value":"See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty":"","pushedFaillureConsequences":"","chat":""},"base":"25","value":-1,"attributes":{},"properties":{"special":true,"rarity":false,"push":false,"combat":true,"fighting":false,"firearm":true},"eras":{"1920":true,"nvct":false,"drka":false,"ddts":false,"glit":false,"pulp":false,"mdrn":true},"markforxp":false},"flags":{},"img":"systems/CoC7/assets/icons/skills.svg"},{"_id":"0rUZhmuvWnGiAq03","name":"First Aid","permission":{"default":0,"kEjKgSLquYZFCui9":3},"type":"skill","data":{"specialization":"","description":{"value":"See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty":"","pushedFaillureConsequences":"","chat":""},"base":"30","value":-1,"attributes":{},"properties":{"push":true,"special":false,"rarity":false,"combat":false},"eras":{"1920":true,"nvct":false,"drka":false,"ddts":false,"glit":false,"pulp":false,"mdrn":true},"markforxp":false},"flags":{},"img":"systems/CoC7/assets/icons/skills.svg"},{"_id":"H4WNjYG7llDZtXwv","name":"History","permission":{"default":0,"kEjKgSLquYZFCui9":3},"type":"skill","data":{"specialization":"","description":{"value":"See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty":"","pushedFaillureConsequences":"","chat":""},"base":"5","value":-1,"attributes":{},"properties":{"special":false,"rarity":false,"push":true,"combat":false},"eras":{"1920":true,"nvct":false,"drka":false,"ddts":false,"glit":false,"pulp":false,"mdrn":true},"markforxp":false},"flags":{},"img":"systems/CoC7/assets/icons/skills.svg"},{"_id":"rfO2kgQTYP2X2lL3","name":"Intimidate","permission":{"default":0,"kEjKgSLquYZFCui9":3},"type":"skill","data":{"specialization":"","description":{"value":"See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty":"","pushedFaillureConsequences":"","chat":""},"base":"15","value":-1,"attributes":{},"properties":{"special":false,"rarity":false,"push":true,"combat":false},"eras":{"1920":true,"nvct":false,"drka":false,"ddts":false,"glit":false,"pulp":false,"mdrn":true},"markforxp":false},"flags":{},"img":"systems/CoC7/assets/icons/skills.svg"},{"_id":"OhbBGAkOrr1409Oq","name":"Jump","permission":{"default":0,"kEjKgSLquYZFCui9":3},"type":"skill","data":{"specialization":"","description":{"value":"See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty":"","pushedFaillureConsequences":"","chat":""},"base":"20","value":-1,"attributes":{},"properties":{"push":true,"special":false,"rarity":false,"combat":false},"eras":{"1920":true,"nvct":false,"drka":false,"ddts":false,"glit":false,"pulp":false,"mdrn":true},"markforxp":false},"flags":{},"img":"systems/CoC7/assets/icons/skills.svg"},{"_id":"NFT5i3X7647Fct8Y","name":"Language (Other)","permission":{"default":0,"6Y6opwuMdxc52cY3":3},"type":"skill","data":{"specialization":"Language","description":{"value":"See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty":"","pushedFaillureConsequences":"","chat":""},"base":"1","adjustments":{"personal":null,"occupation":null,"archetype":null,"experience":null},"value":-1,"attributes":{},"properties":{"push":true,"special":true,"rarity":false,"combat":false},"eras":{"1920":true,"nvct":false,"drka":false,"ddts":false,"glit":false,"pulp":false,"mdrn":true},"flags":{}},"flags":{},"img":"systems/CoC7/assets/icons/skills.svg"},{"_id":"ZtxEbrCNxPbTqACu","name":"Language (Own)","permission":{"default":0,"kEjKgSLquYZFCui9":3},"type":"skill","data":{"specialization":"","description":{"value":"See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty":"","pushedFaillureConsequences":"","chat":""},"base":"@EDU","value":-1,"attributes":{},"properties":{"push":true,"special":false,"rarity":false,"combat":false},"eras":{"1920":true,"nvct":false,"drka":false,"ddts":false,"glit":false,"pulp":false,"mdrn":true},"markforxp":false},"flags":{},"img":"systems/CoC7/assets/icons/skills.svg"},{"_id":"ZZXhgUnol1QMCUJB","name":"Law","permission":{"default":0,"kEjKgSLquYZFCui9":3},"type":"skill","data":{"specialization":"","description":{"value":"See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty":"","pushedFaillureConsequences":"","chat":""},"base":"5","value":-1,"attributes":{},"properties":{"special":false,"rarity":false,"push":true,"combat":false},"eras":{"1920":true,"nvct":false,"drka":false,"ddts":false,"glit":false,"pulp":false,"mdrn":true},"markforxp":false},"flags":{},"img":"systems/CoC7/assets/icons/skills.svg"},{"_id":"UPSL4EYXndGwNPhP","name":"Library Use","permission":{"default":0,"kEjKgSLquYZFCui9":3},"type":"skill","data":{"specialization":"","description":{"value":"See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty":"","pushedFaillureConsequences":"","chat":""},"base":"20","value":-1,"attributes":{},"properties":{"special":false,"rarity":false,"push":true,"combat":false},"eras":{"1920":true,"nvct":false,"drka":false,"ddts":false,"glit":false,"pulp":false,"mdrn":true},"markforxp":false},"flags":{},"img":"systems/CoC7/assets/icons/skills.svg"},{"_id":"HbucA5Kk0d0uFRxy","name":"Listen","permission":{"default":0,"kEjKgSLquYZFCui9":3},"type":"skill","data":{"specialization":"","description":{"value":"See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty":"","pushedFaillureConsequences":"","chat":""},"base":"20","value":-1,"attributes":{},"properties":{"push":true,"special":false,"rarity":false,"combat":false},"eras":{"1920":true,"nvct":false,"drka":false,"ddts":false,"glit":false,"pulp":false,"mdrn":true},"markforxp":false},"flags":{},"img":"systems/CoC7/assets/icons/skills.svg"},{"_id":"s7Yhk0flkG1B1lWY","name":"Locksmith","permission":{"default":0,"kEjKgSLquYZFCui9":3},"type":"skill","data":{"specialization":"","description":{"value":"See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty":"","pushedFaillureConsequences":"","chat":""},"base":"1","value":-1,"attributes":{},"properties":{"push":true,"special":false,"rarity":false,"combat":false},"eras":{"1920":true,"nvct":false,"drka":false,"ddts":false,"glit":false,"pulp":false,"mdrn":true},"markforxp":false},"flags":{},"img":"systems/CoC7/assets/icons/skills.svg"},{"_id":"CW0IWXL3plauUGy1","name":"Mechanical Repair","permission":{"default":0,"kEjKgSLquYZFCui9":3},"type":"skill","data":{"specialization":"","description":{"value":"See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty":"","pushedFaillureConsequences":"","chat":""},"base":"10","value":-1,"attributes":{},"properties":{"special":false,"rarity":false,"push":true,"combat":false},"eras":{"1920":true,"nvct":false,"drka":false,"ddts":false,"glit":false,"pulp":false,"mdrn":true},"markforxp":false},"flags":{},"img":"systems/CoC7/assets/icons/skills.svg"},{"_id":"ziCzgTCp2g2sQzfD","name":"Medicine","permission":{"default":0,"kEjKgSLquYZFCui9":3},"type":"skill","data":{"specialization":"","description":{"value":"See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty":"","pushedFaillureConsequences":"","chat":""},"base":"1","value":-1,"attributes":{},"properties":{"special":false,"rarity":false,"push":true,"combat":false},"eras":{"1920":true,"nvct":false,"drka":false,"ddts":false,"glit":false,"pulp":false,"mdrn":true},"markforxp":false},"flags":{},"img":"systems/CoC7/assets/icons/skills.svg"},{"_id":"YotlGwVZUtNvZJg1","name":"Natural World","permission":{"default":0,"kEjKgSLquYZFCui9":3},"type":"skill","data":{"specialization":"","description":{"value":"See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty":"","pushedFaillureConsequences":"","chat":""},"base":"10","value":-1,"attributes":{},"properties":{"special":false,"rarity":false,"push":true,"combat":false},"eras":{"1920":true,"nvct":false,"drka":false,"ddts":false,"glit":false,"pulp":false,"mdrn":true},"markforxp":false},"flags":{},"img":"systems/CoC7/assets/icons/skills.svg"},{"_id":"7Nhb8ENox4QjMb0t","name":"Navigate","permission":{"default":0,"kEjKgSLquYZFCui9":3},"type":"skill","data":{"specialization":"","description":{"value":"See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty":"","pushedFaillureConsequences":"","chat":""},"base":"10","value":-1,"attributes":{},"properties":{"special":false,"rarity":false,"push":true,"combat":false},"eras":{"1920":true,"nvct":false,"drka":false,"ddts":false,"glit":false,"pulp":false,"mdrn":true},"markforxp":false},"flags":{},"img":"systems/CoC7/assets/icons/skills.svg"},{"_id":"iMNZslICSfOBrhnv","name":"Occult","permission":{"default":0,"kEjKgSLquYZFCui9":3},"type":"skill","data":{"specialization":"","description":{"value":"See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty":"","pushedFaillureConsequences":"","chat":""},"base":"5","value":-1,"attributes":{},"properties":{"special":false,"rarity":false,"push":true,"combat":false},"eras":{"1920":true,"nvct":false,"drka":false,"ddts":false,"glit":false,"pulp":false,"mdrn":true},"markforxp":false},"flags":{},"img":"systems/CoC7/assets/icons/skills.svg"},{"_id":"f8ExwWlSUGhNmnVe","name":"Operate Heavy Machinery","permission":{"default":0,"kEjKgSLquYZFCui9":3},"type":"skill","data":{"specialization":"","description":{"value":"See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty":"","pushedFaillureConsequences":"","chat":""},"base":"1","value":-1,"attributes":{},"properties":{"push":true,"special":false,"rarity":false,"combat":false},"eras":{"1920":true,"nvct":false,"drka":false,"ddts":false,"glit":false,"pulp":false,"mdrn":true},"markforxp":false},"flags":{},"img":"systems/CoC7/assets/icons/skills.svg"},{"_id":"SPY7wJwnkG4anTwM","name":"Persuade","permission":{"default":0,"kEjKgSLquYZFCui9":3},"type":"skill","data":{"specialization":"","description":{"value":"See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty":"","pushedFaillureConsequences":"","chat":""},"base":"10","value":-1,"attributes":{},"properties":{"special":false,"rarity":false,"push":true,"combat":false},"eras":{"1920":true,"nvct":false,"drka":false,"ddts":false,"glit":false,"pulp":false,"mdrn":true},"markforxp":false},"flags":{},"img":"systems/CoC7/assets/icons/skills.svg"},{"_id":"UZoCHFgYoXCbdoY6","name":"Pilot (Any)","permission":{"default":0,"kEjKgSLquYZFCui9":3},"type":"skill","data":{"specialization":"Pilot","description":{"value":"See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty":"","pushedFaillureConsequences":"","chat":""},"base":"1","value":-1,"attributes":{},"properties":{"push":true,"special":true,"rarity":false,"combat":false},"eras":{"1920":true,"nvct":false,"drka":false,"ddts":false,"glit":false,"pulp":false,"mdrn":true},"markforxp":false},"flags":{},"img":"systems/CoC7/assets/icons/skills.svg"},{"_id":"E9rcTG3csEG4Huem","name":"Psychology","permission":{"default":0,"kEjKgSLquYZFCui9":3},"type":"skill","data":{"specialization":"","description":{"value":"See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty":"","pushedFaillureConsequences":"","chat":""},"base":"10","value":-1,"attributes":{},"properties":{"push":true,"special":false,"rarity":false,"combat":false},"eras":{"1920":true,"nvct":false,"drka":false,"ddts":false,"glit":false,"pulp":false,"mdrn":true},"markforxp":false},"flags":{},"img":"systems/CoC7/assets/icons/skills.svg"},{"_id":"sJjQGgjj6gohyaMd","name":"Psychoanalysis","permission":{"default":0,"kEjKgSLquYZFCui9":3},"type":"skill","data":{"specialization":"","description":{"value":"See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty":"","pushedFaillureConsequences":"","chat":""},"base":"1","value":-1,"attributes":{},"properties":{"push":true,"special":false,"rarity":false,"combat":false},"eras":{"1920":true,"nvct":false,"drka":false,"ddts":false,"glit":false,"pulp":false,"mdrn":true},"markforxp":false},"flags":{},"img":"systems/CoC7/assets/icons/skills.svg"},{"_id":"DkKL3tUlmx5Zp22E","name":"Ride","permission":{"default":0,"kEjKgSLquYZFCui9":3},"type":"skill","data":{"specialization":"","description":{"value":"See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty":"","pushedFaillureConsequences":"","chat":""},"base":"5","value":-1,"attributes":{},"properties":{"special":false,"rarity":false,"push":true,"combat":false},"eras":{"1920":true,"nvct":false,"drka":false,"ddts":false,"glit":false,"pulp":false,"mdrn":true},"markforxp":false},"flags":{},"img":"systems/CoC7/assets/icons/skills.svg"},{"_id":"g9Q95Ei79qs3XZAz","name":"Science (Any)","permission":{"default":0,"6Y6opwuMdxc52cY3":3},"type":"skill","data":{"specialization":"Science","description":{"value":"See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty":"","pushedFaillureConsequences":"","chat":""},"base":"1","adjustments":{"personal":null,"occupation":null,"archetype":null,"experience":null},"value":-1,"attributes":{},"properties":{"special":true,"push":true},"eras":{},"flags":{}},"flags":{},"img":"systems/CoC7/assets/icons/skills.svg"},{"_id":"RIQSmuWCMPYYjUtg","name":"Sleight of Hand","permission":{"default":0,"kEjKgSLquYZFCui9":3},"type":"skill","data":{"specialization":"","description":{"value":"See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty":"","pushedFaillureConsequences":"","chat":""},"base":"10","value":-1,"attributes":{},"properties":{"push":true,"special":false,"rarity":false,"combat":false},"eras":{"1920":true,"nvct":false,"drka":false,"ddts":false,"glit":false,"pulp":false,"mdrn":true},"markforxp":false},"flags":{},"img":"systems/CoC7/assets/icons/skills.svg"},{"_id":"vdTRwJvIbXasRUxC","name":"Spot Hidden","permission":{"default":0,"kEjKgSLquYZFCui9":3},"type":"skill","data":{"specialization":"","description":{"value":"See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty":"","pushedFaillureConsequences":"","chat":""},"base":"25","value":-1,"attributes":{},"properties":{"special":false,"rarity":false,"push":true,"combat":false},"eras":{"1920":true,"nvct":false,"drka":false,"ddts":false,"glit":false,"pulp":false,"mdrn":true},"markforxp":false},"flags":{},"img":"systems/CoC7/assets/icons/skills.svg"},{"_id":"E0EfSSzQYmwWrbeD","name":"Stealth","permission":{"default":0,"6Y6opwuMdxc52cY3":3},"type":"skill","data":{"specialization":"","description":{"value":"See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty":"","pushedFaillureConsequences":"","chat":""},"base":"20","value":-1,"attributes":{},"properties":{"special":false,"rarity":false,"push":true,"combat":false},"eras":{},"flags":{}},"flags":{},"img":"systems/CoC7/assets/icons/skills.svg"},{"_id":"m4C6RDUbfHZwVucS","name":"Survival (Any)","permission":{"default":0,"kEjKgSLquYZFCui9":3},"type":"skill","data":{"specialization":"Survival","description":{"value":"See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty":"","pushedFaillureConsequences":"","chat":""},"base":"10","value":-1,"attributes":{},"properties":{"special":true,"rarity":false,"push":true,"combat":false},"eras":{"1920":true,"nvct":false,"drka":false,"ddts":false,"glit":false,"pulp":false,"mdrn":true},"markforxp":false},"flags":{},"img":"systems/CoC7/assets/icons/skills.svg"},{"_id":"A0NyE5kmHe5FOnq9","name":"Swim","permission":{"default":0,"kEjKgSLquYZFCui9":3},"type":"skill","data":{"specialization":"","description":{"value":"See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty":"","pushedFaillureConsequences":"","chat":""},"base":"20","value":-1,"attributes":{},"properties":{"push":true,"special":false,"rarity":false,"combat":false},"eras":{"1920":true,"nvct":false,"drka":false,"ddts":false,"glit":false,"pulp":false,"mdrn":true},"markforxp":false},"flags":{},"img":"systems/CoC7/assets/icons/skills.svg"},{"_id":"MeleogcP07f9rJ1O","name":"Throw","permission":{"default":0,"kEjKgSLquYZFCui9":3},"type":"skill","data":{"specialization":"Fighting","description":{"value":"See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty":"","pushedFaillureConsequences":"","chat":""},"base":"20","value":-1,"attributes":{},"properties":{"special":true,"rarity":false,"push":true,"combat":true,"fighting":true,"firearm":false},"eras":{"1920":true,"nvct":false,"drka":false,"ddts":false,"glit":false,"pulp":false,"mdrn":true},"markforxp":false},"flags":{},"img":"systems/CoC7/assets/icons/skills.svg"},{"_id":"Xy7GNIbB3B0SqgtM","name":"Track","permission":{"default":0,"kEjKgSLquYZFCui9":3},"type":"skill","data":{"specialization":"","description":{"value":"See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty":"","pushedFaillureConsequences":"","chat":""},"base":"10","value":-1,"attributes":{},"properties":{"special":false,"rarity":false,"push":true,"combat":false},"eras":{"1920":true,"nvct":false,"drka":false,"ddts":false,"glit":false,"pulp":false,"mdrn":true},"markforxp":false},"flags":{},"img":"systems/CoC7/assets/icons/skills.svg"},{"name":"Unarmed","permission":{"default":0,"6Y6opwuMdxc52cY3":3},"type":"weapon","data":{"description":{"value":"","chat":"","special":""},"wpnType":"","skill":{"main":{"name":"Brawl","id":""},"alternativ":{"name":"","id":""}},"range":{"normal":{"value":0,"units":"","damage":"1D3"},"long":{"value":0,"units":"","damage":""},"extreme":{"value":0,"units":"","damage":""}},"usesPerRound":{"normal":"1","max":"","burst":null},"bullets":"","ammo":0,"malfunction":"","blastRadius":null,"properties":{"melee":true,"rngd":false,"addb":true},"eras":{"1920":false,"nvct":false,"drka":false,"ddts":false,"glit":false,"pulp":false,"mdrn":false},"price":{"1920":0,"nvct":0,"drka":0,"ddts":0,"glit":0,"pulp":0,"mdrn":0}},"folder":"","sort":200001,"flags":{},"effects":[],"_id":"MBlFrQLq64WAHfYP","img":"systems/CoC7/assets/icons/skills.svg"}],"bioSections":["Personal Description","Ideology/Beliefs","Significant People","Meaningful Locations","Treasured Possessions","Traits"],"attributes":{},"properties":{},"eras":{"1920":{"selected":true},"nvct":{"selected":false},"drka":{"selected":false},"ddts":{"selected":false},"glit":{"selected":false},"pulp":{"selected":false},"mdrn":{"selected":false}},"flags":{},"coreCharacteristics":{"str":false,"con":false,"siz":false,"dex":false,"app":false,"int":false,"pow":false,"edu":false}},"flags":{"exportSource":{"world":"bb","system":"CoC7","coreVersion":"0.6.6","systemVersion":"0.3.8"},"core":{"sourceId":"Item.klaZapSP1VRJnqCj"}},"img":"icons/svg/item-bag.svg","effects":[],"_id":"7XeBHRFmmUVblQQm"} -{"_id":"I863WvfdHlKSKCQk","name":"Punch","permission":{"default":0,"6Y6opwuMdxc52cY3":3},"type":"weapon","data":{"description":{"value":"","chat":"","special":""},"wpnType":"","skill":{"main":{"name":"","id":""},"alternativ":{"name":"","id":""}},"range":{"normal":{"value":0,"units":"","damage":"1D3"},"long":{"value":0,"units":"","damage":""},"extreme":{"value":0,"units":"","damage":""}},"usesPerRound":{"normal":"","max":""},"bullets":"","malfunction":"","properties":{"addb":true,"rngd":false,"impl":false,"rare":false,"ahdb":false,"slnt":false,"xplv":false,"brst":false,"auto":false,"spcl":false,"mont":false,"dbrl":false,"blst":false,"stun":false},"eras":{"1920":false,"nvct":false,"drka":false,"ddts":false,"glit":false,"pulp":false,"mdrn":false},"price":{"1920":0,"nvct":0,"drka":0,"ddts":0,"glit":0,"pulp":0,"mdrn":0}},"flags":{},"img":"icons/svg/sword.svg","effects":[]} -{"name":"Occupation Example","permission":{"default":0,"6Y6opwuMdxc52cY3":3},"type":"occupation","data":{"description":{"value":null},"source":"","type":{"classic":true,"lovecraftian":false,"modern":false,"pulp":false},"related":null,"occupationSkillPoints":{"str":{"multiplier":null,"selected":false,"optional":false,"active":false},"con":{"multiplier":null,"selected":false,"optional":false,"active":false},"siz":{"multiplier":null,"selected":false,"optional":false,"active":false},"dex":{"multiplier":null,"selected":false,"optional":false,"active":false},"app":{"multiplier":2,"selected":true,"optional":false,"active":false},"int":{"multiplier":null,"selected":false,"optional":false,"active":false},"pow":{"multiplier":null,"selected":false,"optional":false,"active":false},"edu":{"multiplier":2,"selected":true,"optional":false,"active":false}},"creditRating":{"min":"10","max":"80"},"suggestedContacts":"","skills":[{"_id":"tA5sEnhUyrzdCEu4","name":"Drive Auto","permission":{"default":0,"kEjKgSLquYZFCui9":3},"type":"skill","data":{"specialization":"","description":{"value":"See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty":"","pushedFaillureConsequences":"","chat":""},"base":"20","value":-1,"attributes":{},"properties":{"special":false,"rarity":false,"push":true,"combat":false},"eras":{"1920":true,"nvct":false,"drka":false,"ddts":false,"glit":false,"pulp":false,"mdrn":true},"markforxp":false},"flags":{},"img":"systems/CoC7/assets/icons/skills.svg"},{"_id":"HbucA5Kk0d0uFRxy","name":"Listen","permission":{"default":0,"kEjKgSLquYZFCui9":3},"type":"skill","data":{"specialization":"","description":{"value":"See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty":"","pushedFaillureConsequences":"","chat":""},"base":"20","value":-1,"attributes":{},"properties":{"push":true,"special":false,"rarity":false,"combat":false},"eras":{"1920":true,"nvct":false,"drka":false,"ddts":false,"glit":false,"pulp":false,"mdrn":true},"markforxp":false},"flags":{},"img":"systems/CoC7/assets/icons/skills.svg"},{"_id":"E0EfSSzQYmwWrbeD","name":"Stealth","permission":{"default":0,"6Y6opwuMdxc52cY3":3},"type":"skill","data":{"specialization":"","description":{"value":"See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty":"","pushedFaillureConsequences":"","chat":""},"base":"20","value":-1,"attributes":{},"properties":{"special":false,"rarity":false,"push":true,"combat":false},"eras":{},"flags":{}},"flags":{},"img":"systems/CoC7/assets/icons/skills.svg"},{"_id":"6hqUf8Kt7wcLL7Zk","name":"Any","permission":{"default":0,"6Y6opwuMdxc52cY3":3},"type":"skill","data":{"specialization":"Art/Craft","description":{"value":"See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty":"","pushedFaillureConsequences":"","chat":""},"base":"5","adjustments":{"personal":null,"occupation":null,"archetype":null,"experience":null},"value":-1,"attributes":{},"properties":{"push":true,"special":true,"rarity":false,"combat":false},"eras":{"1920":true,"nvct":false,"drka":false,"ddts":false,"glit":false,"pulp":false,"mdrn":true},"flags":{}},"folder":null,"sort":2200000,"flags":{},"img":"systems/CoC7/assets/icons/skills.svg"},{"_id":"6hqUf8Kt7wcLL7Zk","name":"Any","permission":{"default":0,"6Y6opwuMdxc52cY3":3},"type":"skill","data":{"specialization":"Art/Craft","description":{"value":"See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty":"","pushedFaillureConsequences":"","chat":""},"base":"5","adjustments":{"personal":null,"occupation":null,"archetype":null,"experience":null},"value":-1,"attributes":{},"properties":{"push":true,"special":true,"rarity":false,"combat":false},"eras":{"1920":true,"nvct":false,"drka":false,"ddts":false,"glit":false,"pulp":false,"mdrn":true},"flags":{}},"folder":null,"sort":2200000,"flags":{},"img":"systems/CoC7/assets/icons/skills.svg"}],"groups":[{"options":"2","skills":[{"_id":"otgWxSXPtfSKtzd9","name":"Charm","permission":{"default":0,"kEjKgSLquYZFCui9":3},"type":"skill","data":{"specialization":"","description":{"value":"See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty":"","pushedFaillureConsequences":"","chat":""},"base":"15","value":-1,"attributes":{},"properties":{"special":false,"rarity":false,"push":true,"combat":false},"eras":{"1920":true,"nvct":false,"drka":false,"ddts":false,"glit":false,"pulp":false,"mdrn":true},"markforxp":false},"flags":{},"img":"systems/CoC7/assets/icons/skills.svg"},{"_id":"0KVMEYlXmj96Hg8r","name":"Fast Talk","permission":{"default":0,"kEjKgSLquYZFCui9":3},"type":"skill","data":{"specialization":"","description":{"value":"See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty":"","pushedFaillureConsequences":"","chat":""},"base":"5","value":-1,"attributes":{},"properties":{"special":false,"rarity":false,"push":true,"combat":false},"eras":{"1920":true,"nvct":false,"drka":false,"ddts":false,"glit":false,"pulp":false,"mdrn":true},"markforxp":false},"flags":{},"img":"systems/CoC7/assets/icons/skills.svg"},{"_id":"rfO2kgQTYP2X2lL3","name":"Intimidate","permission":{"default":0,"kEjKgSLquYZFCui9":3},"type":"skill","data":{"specialization":"","description":{"value":"See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty":"","pushedFaillureConsequences":"","chat":""},"base":"15","value":-1,"attributes":{},"properties":{"special":false,"rarity":false,"push":true,"combat":false},"eras":{"1920":true,"nvct":false,"drka":false,"ddts":false,"glit":false,"pulp":false,"mdrn":true},"markforxp":false},"flags":{},"img":"systems/CoC7/assets/icons/skills.svg"},{"_id":"SPY7wJwnkG4anTwM","name":"Persuade","permission":{"default":0,"kEjKgSLquYZFCui9":3},"type":"skill","data":{"specialization":"","description":{"value":"See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty":"","pushedFaillureConsequences":"","chat":""},"base":"10","value":-1,"attributes":{},"properties":{"special":false,"rarity":false,"push":true,"combat":false},"eras":{"1920":true,"nvct":false,"drka":false,"ddts":false,"glit":false,"pulp":false,"mdrn":true},"markforxp":false},"flags":{},"img":"systems/CoC7/assets/icons/skills.svg"},{"_id":"6hqUf8Kt7wcLL7Zk","name":"Any","permission":{"default":0,"6Y6opwuMdxc52cY3":3},"type":"skill","data":{"specialization":"Art/Craft","description":{"value":"See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty":"","pushedFaillureConsequences":"","chat":""},"base":"5","adjustments":{"personal":null,"occupation":null,"archetype":null,"experience":null},"value":-1,"attributes":{},"properties":{"push":true,"special":true,"rarity":false,"combat":false},"eras":{"1920":true,"nvct":false,"drka":false,"ddts":false,"glit":false,"pulp":false,"mdrn":true},"flags":{}},"folder":null,"sort":2200000,"flags":{},"img":"systems/CoC7/assets/icons/skills.svg"},{"_id":"6hqUf8Kt7wcLL7Zk","name":"Any","permission":{"default":0,"6Y6opwuMdxc52cY3":3},"type":"skill","data":{"specialization":"Art/Craft","description":{"value":"See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty":"","pushedFaillureConsequences":"","chat":""},"base":"5","adjustments":{"personal":null,"occupation":null,"archetype":null,"experience":null},"value":-1,"attributes":{},"properties":{"push":true,"special":true,"rarity":false,"combat":false},"eras":{"1920":true,"nvct":false,"drka":false,"ddts":false,"glit":false,"pulp":false,"mdrn":true},"flags":{}},"folder":null,"sort":2200000,"flags":{},"img":"systems/CoC7/assets/icons/skills.svg"}]},{"options":"1","skills":[{"_id":"keyAD0YXeAafdvmi","name":"Brawl","permission":{"default":0,"kEjKgSLquYZFCui9":3},"type":"skill","data":{"specialization":"Fighting","description":{"value":"See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty":"","pushedFaillureConsequences":"","chat":""},"base":"25","value":-1,"attributes":{},"properties":{"special":true,"rarity":false,"push":false,"combat":true,"fighting":true,"firearm":false},"eras":{"1920":true,"nvct":false,"drka":false,"ddts":false,"glit":false,"pulp":false,"mdrn":true},"markforxp":false},"flags":{},"img":"systems/CoC7/assets/icons/skills.svg"},{"_id":"CQY7mhxduGFebAmi","name":"Handgun","permission":{"default":0,"kEjKgSLquYZFCui9":3},"type":"skill","data":{"specialization":"Firearms","description":{"value":"See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty":"","pushedFaillureConsequences":"","chat":""},"base":"20","value":-1,"attributes":{},"properties":{"special":true,"rarity":false,"push":false,"combat":true,"fighting":false,"firearm":true},"eras":{"1920":true,"nvct":false,"drka":false,"ddts":false,"glit":false,"pulp":false,"mdrn":true},"markforxp":false},"flags":{},"img":"systems/CoC7/assets/icons/skills.svg"}]}],"personal":1,"attributes":{},"properties":{},"eras":{},"flags":{}},"flags":{"core":{"sourceId":"Item.CUil67teWVm6X0Cd"}},"img":"icons/svg/item-bag.svg","effects":[],"_id":"LAms0Gr7OwvRmrnu"} -{"_id":"WZWlWgxqrf8kXTjX","name":"Experimental weapon","permission":{"default":0,"6Y6opwuMdxc52cY3":3},"type":"weapon","data":{"description":{"value":"Description of the weapon
\nselecting 'Area of effect' will enable 3 different damage and range
\nselecting 'Full-auto' will allow 2 different skilss to be selected for the weapon
\nselecting 'Special' will activate the special input field
\nIn the combat tab, if the icons are with a red background, it means that no skill have been selected for that weapon
\nEdit the weapon and select the correct skill.
","chat":"","special":"You can add special description or slugs there :
\nSlug 1 : 2d17kh
"},"wpnType":"","skill":{"main":{"name":"To be selected once the weapon is owned","id":""},"alternativ":{"name":"","id":""}},"range":{"normal":{"value":"15ft","units":"","damage":"3d6"},"long":{"value":"25ft","units":"","damage":"2d6"},"extreme":{"value":"35ft","units":"","damage":"1d6"}},"usesPerRound":{"normal":"","max":""},"bullets":"","malfunction":"85","properties":{"rngd":true,"impl":false,"rare":false,"ahdb":false,"addb":false,"slnt":false,"xplv":true,"brst":true,"auto":false,"spcl":true,"mont":false,"dbrl":false,"blst":false,"stun":false},"eras":{"1920":true,"nvct":false,"drka":false,"ddts":false,"glit":false,"pulp":false,"mdrn":true},"price":{"1920":"5$","nvct":0,"drka":0,"ddts":0,"glit":0,"pulp":0,"mdrn":"6$"}},"flags":{},"img":"icons/svg/sword.svg"} -{"_id":"iZIjoR0YWLPzvMxp","name":"Death ray (prototype)","permission":{"default":0,"6Y6opwuMdxc52cY3":3},"type":"weapon","data":{"description":{"value":"","chat":"","special":""},"wpnType":"","skill":{"main":{"name":"","id":""},"alternativ":{"name":"","id":""}},"range":{"normal":{"value":"50ft","units":"","damage":"5d6"},"long":{"value":"","units":"","damage":""},"extreme":{"value":"","units":"","damage":""}},"usesPerRound":{"normal":"","max":""},"bullets":"","malfunction":"","properties":{"rngd":true,"impl":false,"rare":false,"ahdb":false,"addb":false,"slnt":true,"xplv":false,"brst":false,"auto":false,"spcl":false,"mont":false,"dbrl":false,"blst":false,"stun":false},"eras":{"1920":false,"nvct":false,"drka":false,"ddts":false,"glit":false,"pulp":false,"mdrn":false},"price":{"1920":0,"nvct":0,"drka":0,"ddts":0,"glit":0,"pulp":0,"mdrn":0}},"flags":{},"img":"icons/svg/sword.svg"} -{"name":"Archetype Example","permission":{"default":0,"6Y6opwuMdxc52cY3":3},"type":"archetype","data":{"description":{"value":null},"source":"","type":{"classic":false,"lovecraftian":false,"modern":false},"bonusPoints":100,"coreCharacteristics":{"str":false,"con":false,"siz":false,"dex":false,"app":true,"int":true,"pow":false,"edu":false},"coreCharacteristicsFormula":{"enabled":true,"value":"(1D6+13)*5"},"suggestedOccupations":null,"suggestedTraits":null,"talents":2,"skills":[{"_id":"j4vj4HUviZd6TAKz","name":"Appraise","permission":{"default":0,"kEjKgSLquYZFCui9":3},"type":"skill","data":{"specialization":"","description":{"value":"See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty":"","pushedFaillureConsequences":"","chat":""},"base":"5","value":-1,"attributes":{},"properties":{"push":true,"special":false,"rarity":false,"combat":false},"eras":{"1920":true,"nvct":false,"drka":false,"ddts":false,"glit":false,"pulp":false,"mdrn":true},"markforxp":false},"flags":{},"img":"systems/CoC7/assets/icons/skills.svg"},{"_id":"otgWxSXPtfSKtzd9","name":"Charm","permission":{"default":0,"kEjKgSLquYZFCui9":3},"type":"skill","data":{"specialization":"","description":{"value":"See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty":"","pushedFaillureConsequences":"","chat":""},"base":"15","value":-1,"attributes":{},"properties":{"special":false,"rarity":false,"push":true,"combat":false},"eras":{"1920":true,"nvct":false,"drka":false,"ddts":false,"glit":false,"pulp":false,"mdrn":true},"markforxp":false},"flags":{},"img":"systems/CoC7/assets/icons/skills.svg"},{"_id":"kKafbgrncOGqYwjH","name":"Disguise","permission":{"default":0,"kEjKgSLquYZFCui9":3},"type":"skill","data":{"specialization":"","description":{"value":"See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty":"","pushedFaillureConsequences":"","chat":""},"base":"5","value":-1,"attributes":{},"properties":{"special":false,"rarity":false,"push":true,"combat":false},"eras":{"1920":true,"nvct":false,"drka":false,"ddts":false,"glit":false,"pulp":false,"mdrn":true},"markforxp":false},"flags":{},"img":"systems/CoC7/assets/icons/skills.svg"},{"_id":"tA5sEnhUyrzdCEu4","name":"Drive Auto","permission":{"default":0,"kEjKgSLquYZFCui9":3},"type":"skill","data":{"specialization":"","description":{"value":"See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty":"","pushedFaillureConsequences":"","chat":""},"base":"20","value":-1,"attributes":{},"properties":{"special":false,"rarity":false,"push":true,"combat":false},"eras":{"1920":true,"nvct":false,"drka":false,"ddts":false,"glit":false,"pulp":false,"mdrn":true},"markforxp":false},"flags":{},"img":"systems/CoC7/assets/icons/skills.svg"},{"_id":"0KVMEYlXmj96Hg8r","name":"Fast Talk","permission":{"default":0,"kEjKgSLquYZFCui9":3},"type":"skill","data":{"specialization":"","description":{"value":"See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty":"","pushedFaillureConsequences":"","chat":""},"base":"5","value":-1,"attributes":{},"properties":{"special":false,"rarity":false,"push":true,"combat":false},"eras":{"1920":true,"nvct":false,"drka":false,"ddts":false,"glit":false,"pulp":false,"mdrn":true},"markforxp":false},"flags":{},"img":"systems/CoC7/assets/icons/skills.svg"},{"_id":"keyAD0YXeAafdvmi","name":"Brawl","permission":{"default":0,"kEjKgSLquYZFCui9":3},"type":"skill","data":{"specialization":"Fighting","description":{"value":"See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty":"","pushedFaillureConsequences":"","chat":""},"base":"25","value":-1,"attributes":{},"properties":{"special":true,"rarity":false,"push":false,"combat":true,"fighting":true,"firearm":false},"eras":{"1920":true,"nvct":false,"drka":false,"ddts":false,"glit":false,"pulp":false,"mdrn":true},"markforxp":false},"flags":{},"img":"systems/CoC7/assets/icons/skills.svg"},{"_id":"CQY7mhxduGFebAmi","name":"Handgun","permission":{"default":0,"kEjKgSLquYZFCui9":3},"type":"skill","data":{"specialization":"Firearms","description":{"value":"See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty":"","pushedFaillureConsequences":"","chat":""},"base":"20","value":-1,"attributes":{},"properties":{"special":true,"rarity":false,"push":false,"combat":true,"fighting":false,"firearm":true},"eras":{"1920":true,"nvct":false,"drka":false,"ddts":false,"glit":false,"pulp":false,"mdrn":true},"markforxp":false},"flags":{},"img":"systems/CoC7/assets/icons/skills.svg"},{"_id":"HbucA5Kk0d0uFRxy","name":"Listen","permission":{"default":0,"kEjKgSLquYZFCui9":3},"type":"skill","data":{"specialization":"","description":{"value":"See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty":"","pushedFaillureConsequences":"","chat":""},"base":"20","value":-1,"attributes":{},"properties":{"push":true,"special":false,"rarity":false,"combat":false},"eras":{"1920":true,"nvct":false,"drka":false,"ddts":false,"glit":false,"pulp":false,"mdrn":true},"markforxp":false},"flags":{},"img":"systems/CoC7/assets/icons/skills.svg"},{"_id":"E9rcTG3csEG4Huem","name":"Psychology","permission":{"default":0,"kEjKgSLquYZFCui9":3},"type":"skill","data":{"specialization":"","description":{"value":"See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty":"","pushedFaillureConsequences":"","chat":""},"base":"10","value":-1,"attributes":{},"properties":{"push":true,"special":false,"rarity":false,"combat":false},"eras":{"1920":true,"nvct":false,"drka":false,"ddts":false,"glit":false,"pulp":false,"mdrn":true},"markforxp":false},"flags":{},"img":"systems/CoC7/assets/icons/skills.svg"},{"_id":"RIQSmuWCMPYYjUtg","name":"Sleight of Hand","permission":{"default":0,"kEjKgSLquYZFCui9":3},"type":"skill","data":{"specialization":"","description":{"value":"See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty":"","pushedFaillureConsequences":"","chat":""},"base":"10","value":-1,"attributes":{},"properties":{"push":true,"special":false,"rarity":false,"combat":false},"eras":{"1920":true,"nvct":false,"drka":false,"ddts":false,"glit":false,"pulp":false,"mdrn":true},"markforxp":false},"flags":{},"img":"systems/CoC7/assets/icons/skills.svg"},{"_id":"E0EfSSzQYmwWrbeD","name":"Stealth","permission":{"default":0,"6Y6opwuMdxc52cY3":3},"type":"skill","data":{"specialization":"","description":{"value":"See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty":"","pushedFaillureConsequences":"","chat":""},"base":"20","value":-1,"attributes":{},"properties":{"special":false,"rarity":false,"push":true,"combat":false},"eras":{},"flags":{}},"flags":{},"img":"systems/CoC7/assets/icons/skills.svg"},{"_id":"6hqUf8Kt7wcLL7Zk","name":"Any","permission":{"default":0,"6Y6opwuMdxc52cY3":3},"type":"skill","data":{"specialization":"Art/Craft","description":{"value":"See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty":"","pushedFaillureConsequences":"","chat":""},"base":"5","adjustments":{"personal":null,"occupation":null,"archetype":null,"experience":null},"value":-1,"attributes":{},"properties":{"push":true,"special":true,"rarity":false,"combat":false},"eras":{"1920":true,"nvct":false,"drka":false,"ddts":false,"glit":false,"pulp":false,"mdrn":true},"flags":{}},"folder":null,"sort":2200000,"flags":{},"img":"systems/CoC7/assets/icons/skills.svg"},{"name":"Acting","permission":{"default":0,"6Y6opwuMdxc52cY3":3},"type":"skill","data":{"specialization":"Art/Craft","description":{"value":"See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty":"","pushedFaillureConsequences":"","chat":""},"base":"5","adjustments":{"personal":null,"occupation":null,"archetype":null,"experience":null},"value":-1,"attributes":{},"properties":{"push":true,"special":true,"rarity":false,"combat":false},"eras":{"1920":true,"nvct":false,"drka":false,"ddts":false,"glit":false,"pulp":false,"mdrn":true},"flags":{}},"folder":null,"sort":2300000,"flags":{},"img":"systems/CoC7/assets/icons/skills.svg","effects":[],"_id":"dnvGW4Q62msCmid0"}],"attributes":{},"properties":{},"eras":{},"flags":{}},"flags":{"core":{"sourceId":"Item.5iwggJCIAtfGiWn6"}},"img":"icons/svg/item-bag.svg","effects":[],"_id":"oSyopDdPyz48yDo6"} +{"_id":"2dqgtyGfwr8M60he","name":"Phobia 2","type":"status","img":"icons/svg/aura.svg","data":{"active":false,"source":"","description":{"value":"","chat":"","notes":"","keeper":""},"duration":{"permanent":true,"hours":null,"minutes":null,"rounds":null},"type":{"mania":false,"phobia":true}},"effects":[],"folder":null,"sort":0,"permission":{"default":0},"flags":{"core":{"sourceId":"Item.b5DeLy1KETMeE8ZC"}}} +{"_id":"3elxAwnv7WCUNwng","name":"Punch","type":"weapon","img":"icons/svg/sword.svg","data":{"description":{"value":"","chat":"","special":"","keeper":""},"wpnType":"","skill":{"main":{"name":"Brawl","id":""},"alternativ":{"name":"","id":""}},"range":{"normal":{"value":0,"units":"","damage":"1D3"},"long":{"value":0,"units":"","damage":""},"extreme":{"value":0,"units":"","damage":""}},"usesPerRound":{"normal":"1","max":"","burst":null},"bullets":"","ammo":0,"malfunction":"","blastRadius":null,"properties":{"addb":true,"ahdb":false,"melee":true,"rngd":false,"shotgun":false,"brst":false,"auto":false,"dbrl":false},"eras":{"1920":false,"nvct":false,"drka":false,"ddts":false,"glit":false,"pulp":false,"mdrn":false},"price":{}},"effects":[],"folder":null,"sort":0,"permission":{"default":0},"flags":{"core":{"sourceId":"Item.Uldjvs5fvCMri6RN"}}} +{"_id":"CcH7CdXGtGTjMSCg","name":"1920's Setup Example","type":"setup","img":"icons/svg/item-bag.svg","data":{"description":{"value":"Default setup for 1920's character.
","keeper":""},"characteristics":{"points":{"enabled":false,"value":460},"rolls":{"enabled":true,"enableIndividualRolls":true,"str":"(3D6)*5","con":"(3D6)*5","siz":"(2D6+6)*5","dex":"(3D6)*5","app":"(3D6)*5","int":"(2D6+6)*5","pow":"(3D6)*5","edu":"(2D6+6)*5","luck":"(3D6)*5"},"values":{"str":null,"con":null,"siz":null,"dex":null,"app":null,"int":null,"pow":null,"edu":null,"luck":null}},"source":"Keeper's rule book","enableCharacterisitics":true,"items":[{"_id":"R8GJXPMc4LC3bn1D","name":"Unarmed","type":"weapon","img":"icons/svg/sword.svg","data":{"description":{"value":"","chat":"","special":"","keeper":""},"wpnType":"","skill":{"main":{"name":"Brawl","id":""},"alternativ":{"name":"","id":""}},"range":{"normal":{"value":0,"units":"","damage":"1D3"},"long":{"value":0,"units":"","damage":""},"extreme":{"value":0,"units":"","damage":""}},"usesPerRound":{"normal":"1","max":"","burst":null},"bullets":"","ammo":0,"malfunction":"","blastRadius":null,"properties":{"melee":true,"rngd":false,"shotgun":false,"brst":false,"auto":false,"dbrl":false,"addb":true,"ahdb":false},"eras":{"1920":false,"nvct":false,"drka":false,"ddts":false,"glit":false,"pulp":false,"mdrn":false},"price":{"1920":"0","nvct":"0","drka":"0","ddts":"0","glit":"0","pulp":"0","mdrn":"0"}},"effects":[],"folder":"WdotG7nzDUJKNBCF","sort":100000,"permission":{"default":0},"flags":{"core":{"sourceId":"Item.R8GJXPMc4LC3bn1D"}}},{"_id":"UOuN0gESXPp2HXwH","name":"Accounting","type":"skill","img":"systems/CoC7/assets/icons/skills/accounting.svg","data":{"specialization":"","description":{"value":"See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty":"","pushedFaillureConsequences":"","chat":"","keeper":""},"base":"5","adjustments":{"personal":null,"occupation":null,"archetype":null,"experience":null},"value":-1,"attributes":{},"properties":{"push":true},"eras":{"1920":true,"nvct":false,"drka":false,"ddts":false,"glit":false,"pulp":false,"mdrn":true},"flags":{},"skillName":"Accounting"},"effects":[],"folder":null,"sort":0,"permission":{"default":0},"flags":{}},{"_id":"ovIp66Luwfwbq28F","name":"Anthropology","type":"skill","img":"systems/CoC7/assets/icons/skills/anthropology.svg","data":{"specialization":"","description":{"value":"See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty":"","pushedFaillureConsequences":"","chat":"","keeper":""},"base":"1","adjustments":{"personal":null,"occupation":null,"archetype":null,"experience":null},"value":-1,"attributes":{},"properties":{"push":true},"eras":{"1920":true,"nvct":false,"drka":false,"ddts":false,"glit":false,"pulp":false,"mdrn":true},"flags":{},"skillName":"Anthropology"},"effects":[],"folder":null,"sort":0,"permission":{"default":0},"flags":{}},{"_id":"wOs3gryeGRPkGoWD","name":"Appraise","type":"skill","img":"systems/CoC7/assets/icons/skills/appraise.svg","data":{"specialization":"","description":{"value":"See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty":"","pushedFaillureConsequences":"","chat":"","keeper":""},"base":"5","adjustments":{"personal":null,"occupation":null,"archetype":null,"experience":null},"value":-1,"attributes":{},"properties":{"push":true},"eras":{"1920":true,"nvct":false,"drka":false,"ddts":false,"glit":false,"pulp":false,"mdrn":true},"flags":{},"skillName":"Appraise"},"effects":[],"folder":null,"sort":0,"permission":{"default":0},"flags":{}},{"_id":"GHhkcJUqjcP4lToY","name":"Archaeology","type":"skill","img":"systems/CoC7/assets/icons/skills/archaeology.svg","data":{"specialization":"","description":{"value":"See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty":"","pushedFaillureConsequences":"","chat":"","keeper":""},"base":"1","adjustments":{"personal":null,"occupation":null,"archetype":null,"experience":null},"value":-1,"attributes":{},"properties":{"push":true},"eras":{"1920":true,"nvct":false,"drka":false,"ddts":false,"glit":false,"pulp":false,"mdrn":true},"flags":{},"skillName":"Archaeology"},"effects":[],"folder":null,"sort":0,"permission":{"default":0},"flags":{}},{"_id":"HAuFBG4ZT2yO9yn7","name":"Art/Craft (Any)","type":"skill","img":"systems/CoC7/assets/icons/skills/art_craft_any.svg","data":{"specialization":"Art/Craft","description":{"value":"See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty":"","pushedFaillureConsequences":"","chat":"","keeper":""},"base":"5","adjustments":{"personal":null,"occupation":null,"archetype":null,"experience":null},"value":-1,"attributes":{},"properties":{"special":true,"push":true},"eras":{"1920":true,"nvct":false,"drka":false,"ddts":false,"glit":false,"pulp":false,"mdrn":true},"flags":{},"skillName":"Any"},"effects":[],"folder":null,"sort":0,"permission":{"default":0},"flags":{}},{"_id":"JgtxiN3KzooOWIQV","name":"Charm","type":"skill","img":"systems/CoC7/assets/icons/skills/charm.svg","data":{"specialization":"","description":{"value":"See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty":"","pushedFaillureConsequences":"","chat":"","keeper":""},"base":"15","adjustments":{"personal":null,"occupation":null,"archetype":null,"experience":null},"value":-1,"attributes":{},"properties":{"push":true},"eras":{"1920":true,"nvct":false,"drka":false,"ddts":false,"glit":false,"pulp":false,"mdrn":true},"flags":{},"skillName":"Charm"},"effects":[],"folder":null,"sort":0,"permission":{"default":0},"flags":{}},{"_id":"vYrJ5h9cIQBzvw8E","name":"Credit Rating","type":"skill","img":"systems/CoC7/assets/icons/skills/credit_rating.svg","data":{"specialization":"","description":{"value":"See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty":"","pushedFaillureConsequences":"","chat":"","keeper":""},"base":"0","adjustments":{"personal":null,"occupation":null,"archetype":null,"experience":null},"value":-1,"attributes":{},"properties":{"noxpgain":true,"push":true},"eras":{"1920":true,"nvct":false,"drka":false,"ddts":false,"glit":false,"pulp":false,"mdrn":true},"flags":{},"skillName":"Credit Rating"},"effects":[],"folder":null,"sort":0,"permission":{"default":0},"flags":{}},{"_id":"WJky66ezt2ef5ksH","name":"Cthulhu Mythos","type":"skill","img":"systems/CoC7/assets/icons/skills/cthulhu_mythos.svg","data":{"specialization":"","description":{"value":"See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty":"","pushedFaillureConsequences":"","chat":"","keeper":""},"base":"0","adjustments":{"personal":null,"occupation":null,"archetype":null,"experience":null},"value":-1,"attributes":{},"properties":{"noadjustments":true,"noxpgain":true},"eras":{"1920":true,"nvct":false,"drka":false,"ddts":false,"glit":false,"pulp":false,"mdrn":true},"flags":{},"skillName":"Cthulhu Mythos"},"effects":[],"folder":null,"sort":0,"permission":{"default":0},"flags":{}},{"_id":"gzNPM9gbx0EZffBV","name":"Disguise","type":"skill","img":"systems/CoC7/assets/icons/skills/disguise.svg","data":{"specialization":"","description":{"value":"See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty":"","pushedFaillureConsequences":"","chat":"","keeper":""},"base":"5","adjustments":{"personal":null,"occupation":null,"archetype":null,"experience":null},"value":-1,"attributes":{},"properties":{"push":true},"eras":{"1920":true,"nvct":false,"drka":false,"ddts":false,"glit":false,"pulp":false,"mdrn":true},"flags":{},"skillName":"Disguise"},"effects":[],"folder":null,"sort":0,"permission":{"default":0},"flags":{}},{"_id":"wK8XxNj9QwXlGFEb","name":"Dodge","type":"skill","img":"systems/CoC7/assets/icons/skills/dodge.svg","data":{"specialization":"","description":{"value":"See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty":"","pushedFaillureConsequences":"","chat":"","keeper":""},"base":"1/2*@DEX","adjustments":{"personal":null,"occupation":null,"archetype":null,"experience":null},"value":-1,"attributes":{},"properties":{},"eras":{"1920":true,"nvct":false,"drka":false,"ddts":false,"glit":false,"pulp":false,"mdrn":true},"flags":{},"skillName":"Dodge"},"effects":[],"folder":null,"sort":0,"permission":{"default":0},"flags":{}},{"_id":"Og2OWQH93aSDWAMZ","name":"Drive Auto","type":"skill","img":"systems/CoC7/assets/icons/skills/drive_auto.svg","data":{"specialization":"","description":{"value":"See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty":"","pushedFaillureConsequences":"","chat":"","keeper":""},"base":"20","adjustments":{"personal":null,"occupation":null,"archetype":null,"experience":null},"value":-1,"attributes":{},"properties":{"push":true},"eras":{"1920":true,"nvct":false,"drka":false,"ddts":false,"glit":false,"pulp":false,"mdrn":true},"flags":{},"skillName":"Drive Auto"},"effects":[],"folder":null,"sort":0,"permission":{"default":0},"flags":{}},{"_id":"NBkq8oCGM1FjmsyF","name":"Electrical Repair","type":"skill","img":"systems/CoC7/assets/icons/skills/electrical_repair.svg","data":{"specialization":"","description":{"value":"See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty":"","pushedFaillureConsequences":"","chat":"","keeper":""},"base":"10","adjustments":{"personal":null,"occupation":null,"archetype":null,"experience":null},"value":-1,"attributes":{},"properties":{"push":true},"eras":{"1920":true,"nvct":false,"drka":false,"ddts":false,"glit":false,"pulp":false,"mdrn":true},"flags":{},"skillName":"Electrical Repair"},"effects":[],"folder":null,"sort":0,"permission":{"default":0},"flags":{}},{"_id":"ld78TITwKNFPpanQ","name":"Fast Talk","type":"skill","img":"systems/CoC7/assets/icons/skills/fast_talk.svg","data":{"specialization":"","description":{"value":"See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty":"","pushedFaillureConsequences":"","chat":"","keeper":""},"base":"5","adjustments":{"personal":null,"occupation":null,"archetype":null,"experience":null},"value":-1,"attributes":{},"properties":{"push":true},"eras":{"1920":true,"nvct":false,"drka":false,"ddts":false,"glit":false,"pulp":false,"mdrn":true},"flags":{},"skillName":"Fast Talk"},"effects":[],"folder":null,"sort":0,"permission":{"default":0},"flags":{}},{"_id":"vS8bsPWFlwgOecoB","name":"Fighting (Brawl)","type":"skill","img":"systems/CoC7/assets/icons/skills/fighting_brawl.svg","data":{"specialization":"Fighting","description":{"value":"See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty":"","pushedFaillureConsequences":"","chat":"","keeper":""},"base":"25","adjustments":{"personal":null,"occupation":null,"archetype":null,"experience":null},"value":-1,"attributes":{},"properties":{"fighting":true,"firearm":false,"combat":true,"special":true},"eras":{"1920":true,"nvct":false,"drka":false,"ddts":false,"glit":false,"pulp":false,"mdrn":true},"flags":{},"skillName":"Brawl"},"effects":[],"folder":null,"sort":0,"permission":{"default":0},"flags":{}},{"_id":"sWt5Q3ZXd6NlwhXU","name":"Fighting (Throw)","type":"skill","img":"systems/CoC7/assets/icons/skills/fighting_throw.svg","data":{"specialization":"Fighting","description":{"value":"See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty":"","pushedFaillureConsequences":"","chat":"","keeper":""},"base":"20","adjustments":{"personal":null,"occupation":null,"archetype":null,"experience":null},"value":-1,"attributes":{},"properties":{"fighting":true,"firearm":false,"combat":true,"special":true,"push":false},"eras":{"1920":true,"nvct":false,"drka":false,"ddts":false,"glit":false,"pulp":false,"mdrn":true},"flags":{},"skillName":"Throw"},"effects":[],"folder":null,"sort":0,"permission":{"default":0},"flags":{}},{"_id":"KmDGtn7ukUFVb265","name":"Firearms (Handgun)","type":"skill","img":"systems/CoC7/assets/icons/skills/firearms_handgun.svg","data":{"specialization":"Firearms","description":{"value":"See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty":"","pushedFaillureConsequences":"","chat":"","keeper":""},"base":"20","adjustments":{"personal":null,"occupation":null,"archetype":null,"experience":null},"value":-1,"attributes":{},"properties":{"fighting":false,"firearm":true,"combat":true,"special":true},"eras":{"1920":true,"nvct":false,"drka":false,"ddts":false,"glit":false,"pulp":false,"mdrn":true},"flags":{},"skillName":"Handgun"},"effects":[],"folder":null,"sort":0,"permission":{"default":0},"flags":{}},{"_id":"m2pYjKk4Gk3FcEBL","name":"Firearms (Rifle/Shotgun)","type":"skill","img":"systems/CoC7/assets/icons/skills/firearms_rifle_shotgun.svg","data":{"specialization":"Firearms","description":{"value":"See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty":"","pushedFaillureConsequences":"","chat":"","keeper":""},"base":"25","adjustments":{"personal":null,"occupation":null,"archetype":null,"experience":null},"value":-1,"attributes":{},"properties":{"fighting":false,"firearm":true,"combat":true,"special":true},"eras":{"1920":true,"nvct":false,"drka":false,"ddts":false,"glit":false,"pulp":false,"mdrn":true},"flags":{},"skillName":"Rifle/Shotgun"},"effects":[],"folder":null,"sort":0,"permission":{"default":0},"flags":{}},{"_id":"nZ8rdL4PLb7A7f5B","name":"First Aid","type":"skill","img":"systems/CoC7/assets/icons/skills/first_aid.svg","data":{"specialization":"","description":{"value":"See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty":"","pushedFaillureConsequences":"","chat":"","keeper":""},"base":"30","adjustments":{"personal":null,"occupation":null,"archetype":null,"experience":null},"value":-1,"attributes":{},"properties":{"push":true},"eras":{"1920":true,"nvct":false,"drka":false,"ddts":false,"glit":false,"pulp":false,"mdrn":true},"flags":{},"skillName":"First Aid"},"effects":[],"folder":null,"sort":0,"permission":{"default":0},"flags":{}},{"_id":"URo2NSSJSNdvOqXU","name":"History","type":"skill","img":"systems/CoC7/assets/icons/skills/history.svg","data":{"specialization":"","description":{"value":"See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty":"","pushedFaillureConsequences":"","chat":"","keeper":""},"base":"5","adjustments":{"personal":null,"occupation":null,"archetype":null,"experience":null},"value":-1,"attributes":{},"properties":{"push":true},"eras":{"1920":true,"nvct":false,"drka":false,"ddts":false,"glit":false,"pulp":false,"mdrn":true},"flags":{},"skillName":"History"},"effects":[],"folder":null,"sort":0,"permission":{"default":0},"flags":{}},{"_id":"hDr4eUbS398oniTa","name":"Intimidate","type":"skill","img":"systems/CoC7/assets/icons/skills/intimidate.svg","data":{"specialization":"","description":{"value":"See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty":"","pushedFaillureConsequences":"","chat":"","keeper":""},"base":"15","adjustments":{"personal":null,"occupation":null,"archetype":null,"experience":null},"value":-1,"attributes":{},"properties":{"push":true},"eras":{"1920":true,"nvct":false,"drka":false,"ddts":false,"glit":false,"pulp":false,"mdrn":true},"flags":{},"skillName":"Intimidate"},"effects":[],"folder":null,"sort":0,"permission":{"default":0},"flags":{}},{"_id":"c5utlFbDM7J8TA8b","name":"Jump","type":"skill","img":"systems/CoC7/assets/icons/skills/jump.svg","data":{"specialization":"","description":{"value":"See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty":"","pushedFaillureConsequences":"","chat":"","keeper":""},"base":"20","adjustments":{"personal":null,"occupation":null,"archetype":null,"experience":null},"value":-1,"attributes":{},"properties":{"push":true},"eras":{"1920":true,"nvct":false,"drka":false,"ddts":false,"glit":false,"pulp":false,"mdrn":true},"flags":{},"skillName":"Jump"},"effects":[],"folder":null,"sort":0,"permission":{"default":0},"flags":{}},{"_id":"rhJ1Q9OB3uTUZmjD","name":"Language (Own)","type":"skill","img":"systems/CoC7/assets/icons/skills/language.svg","data":{"specialization":"Language","description":{"value":"See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty":"","pushedFaillureConsequences":"","chat":"","keeper":""},"base":"@EDU","adjustments":{"personal":null,"occupation":null,"archetype":null,"experience":null},"value":-1,"attributes":{},"properties":{"push":true,"special":true},"eras":{"1920":true,"nvct":false,"drka":false,"ddts":false,"glit":false,"pulp":false,"mdrn":true},"flags":{},"skillName":"Own"},"effects":[],"folder":null,"sort":0,"permission":{"default":0},"flags":{}},{"_id":"64hnBZNC8FM7oTkg","name":"Law","type":"skill","img":"systems/CoC7/assets/icons/skills/law.svg","data":{"specialization":"","description":{"value":"See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty":"","pushedFaillureConsequences":"","chat":"","keeper":""},"base":"5","adjustments":{"personal":null,"occupation":null,"archetype":null,"experience":null},"value":-1,"attributes":{},"properties":{"push":true},"eras":{"1920":true,"nvct":false,"drka":false,"ddts":false,"glit":false,"pulp":false,"mdrn":true},"flags":{},"skillName":"Law"},"effects":[],"folder":null,"sort":0,"permission":{"default":0},"flags":{}},{"_id":"BcWHh8EhmyKj7bNk","name":"Library Use","type":"skill","img":"systems/CoC7/assets/icons/skills/library_use.svg","data":{"specialization":"","description":{"value":"See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty":"","pushedFaillureConsequences":"","chat":"","keeper":""},"base":"20","adjustments":{"personal":null,"occupation":null,"archetype":null,"experience":null},"value":-1,"attributes":{},"properties":{"push":true},"eras":{"1920":true,"nvct":false,"drka":false,"ddts":false,"glit":false,"pulp":false,"mdrn":true},"flags":{},"skillName":"Library Use"},"effects":[],"folder":null,"sort":0,"permission":{"default":0},"flags":{}},{"_id":"MoAB0NRNlpEc2qWr","name":"Listen","type":"skill","img":"systems/CoC7/assets/icons/skills/listen.svg","data":{"specialization":"","description":{"value":"See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty":"","pushedFaillureConsequences":"","chat":"","keeper":""},"base":"20","adjustments":{"personal":null,"occupation":null,"archetype":null,"experience":null},"value":-1,"attributes":{},"properties":{"push":true},"eras":{"1920":true,"nvct":false,"drka":false,"ddts":false,"glit":false,"pulp":false,"mdrn":true},"flags":{},"skillName":"Listen"},"effects":[],"folder":null,"sort":0,"permission":{"default":0},"flags":{}},{"_id":"MRbFH52Zh9TzhLBh","name":"Locksmith","type":"skill","img":"systems/CoC7/assets/icons/skills/locksmith.svg","data":{"specialization":"","description":{"value":"See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty":"","pushedFaillureConsequences":"","chat":"","keeper":""},"base":"1","adjustments":{"personal":null,"occupation":null,"archetype":null,"experience":null},"value":-1,"attributes":{},"properties":{"push":true},"eras":{"1920":true,"nvct":false,"drka":false,"ddts":false,"glit":false,"pulp":false,"mdrn":true},"flags":{},"skillName":"Locksmith"},"effects":[],"folder":null,"sort":0,"permission":{"default":0},"flags":{}},{"_id":"0qCTuRFUCACSEsWj","name":"Mechanical Repair","type":"skill","img":"systems/CoC7/assets/icons/skills/mechanical_repair.svg","data":{"specialization":"","description":{"value":"See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty":"","pushedFaillureConsequences":"","chat":"","keeper":""},"base":"10","adjustments":{"personal":null,"occupation":null,"archetype":null,"experience":null},"value":-1,"attributes":{},"properties":{"push":true},"eras":{"1920":true,"nvct":false,"drka":false,"ddts":false,"glit":false,"pulp":false,"mdrn":true},"flags":{},"skillName":"Mechanical Repair"},"effects":[],"folder":null,"sort":0,"permission":{"default":0},"flags":{}},{"_id":"Xmg7oAy70DKpv4kq","name":"Medicine","type":"skill","img":"systems/CoC7/assets/icons/skills/medicine.svg","data":{"specialization":"","description":{"value":"See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty":"","pushedFaillureConsequences":"","chat":"","keeper":""},"base":"1","adjustments":{"personal":null,"occupation":null,"archetype":null,"experience":null},"value":-1,"attributes":{},"properties":{"push":true},"eras":{"1920":true,"nvct":false,"drka":false,"ddts":false,"glit":false,"pulp":false,"mdrn":true},"flags":{},"skillName":"Medicine"},"effects":[],"folder":null,"sort":0,"permission":{"default":0},"flags":{}},{"_id":"jTcu6Ni2ek7Yz5q3","name":"Natural World","type":"skill","img":"systems/CoC7/assets/icons/skills/natural_world.svg","data":{"specialization":"","description":{"value":"See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty":"","pushedFaillureConsequences":"","chat":"","keeper":""},"base":"10","adjustments":{"personal":null,"occupation":null,"archetype":null,"experience":null},"value":-1,"attributes":{},"properties":{"push":true},"eras":{"1920":true,"nvct":false,"drka":false,"ddts":false,"glit":false,"pulp":false,"mdrn":true},"flags":{},"skillName":"Natural World"},"effects":[],"folder":null,"sort":0,"permission":{"default":0},"flags":{}},{"_id":"1c3fdvpQtvZf5YXK","name":"Navigate","type":"skill","img":"systems/CoC7/assets/icons/skills/navigate.svg","data":{"specialization":"","description":{"value":"See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty":"","pushedFaillureConsequences":"","chat":"","keeper":""},"base":"10","adjustments":{"personal":null,"occupation":null,"archetype":null,"experience":null},"value":-1,"attributes":{},"properties":{"push":true},"eras":{"1920":true,"nvct":false,"drka":false,"ddts":false,"glit":false,"pulp":false,"mdrn":true},"flags":{},"skillName":"Navigate"},"effects":[],"folder":null,"sort":0,"permission":{"default":0},"flags":{}},{"_id":"6pSfZVS68jSHxa5T","name":"Occult","type":"skill","img":"systems/CoC7/assets/icons/skills/occult.svg","data":{"specialization":"","description":{"value":"See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty":"","pushedFaillureConsequences":"","chat":"","keeper":""},"base":"5","adjustments":{"personal":null,"occupation":null,"archetype":null,"experience":null},"value":-1,"attributes":{},"properties":{"push":true},"eras":{"1920":true,"nvct":false,"drka":false,"ddts":false,"glit":false,"pulp":false,"mdrn":true},"flags":{},"skillName":"Occult"},"effects":[],"folder":null,"sort":0,"permission":{"default":0},"flags":{}},{"_id":"cuExWy1130KUwuWz","name":"Operate Heavy Machinery","type":"skill","img":"systems/CoC7/assets/icons/skills/operate_heavy_machinery.svg","data":{"specialization":"","description":{"value":"See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty":"","pushedFaillureConsequences":"","chat":"","keeper":""},"base":"1","adjustments":{"personal":null,"occupation":null,"archetype":null,"experience":null},"value":-1,"attributes":{},"properties":{"push":true},"eras":{"1920":true,"nvct":false,"drka":false,"ddts":false,"glit":false,"pulp":false,"mdrn":true},"flags":{},"skillName":"Operate Heavy Machinery"},"effects":[],"folder":null,"sort":0,"permission":{"default":0},"flags":{}},{"_id":"uMzSNURmZqjxr7mU","name":"Persuade","type":"skill","img":"systems/CoC7/assets/icons/skills/persuade.svg","data":{"specialization":"","description":{"value":"See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty":"","pushedFaillureConsequences":"","chat":"","keeper":""},"base":"10","adjustments":{"personal":null,"occupation":null,"archetype":null,"experience":null},"value":-1,"attributes":{},"properties":{"push":true},"eras":{"1920":true,"nvct":false,"drka":false,"ddts":false,"glit":false,"pulp":false,"mdrn":true},"flags":{},"skillName":"Persuade"},"effects":[],"folder":null,"sort":0,"permission":{"default":0},"flags":{}},{"_id":"uQsVn8K6XRXQmtaI","name":"Pilot (Any)","type":"skill","img":"systems/CoC7/assets/icons/skills/pilot_any.svg","data":{"specialization":"Pilot","description":{"value":"See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty":"","pushedFaillureConsequences":"","chat":"","keeper":""},"base":"1","adjustments":{"personal":null,"occupation":null,"archetype":null,"experience":null},"value":-1,"attributes":{},"properties":{"special":true,"push":true},"eras":{"1920":true,"nvct":false,"drka":false,"ddts":false,"glit":false,"pulp":false,"mdrn":true},"flags":{},"skillName":"Any"},"effects":[],"folder":null,"sort":0,"permission":{"default":0},"flags":{}},{"_id":"rXBU2GofiO2qOsGv","name":"Psychoanalysis","type":"skill","img":"systems/CoC7/assets/icons/skills/psychoanalysis.svg","data":{"specialization":"","description":{"value":"See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty":"","pushedFaillureConsequences":"","chat":"","keeper":""},"base":"1","adjustments":{"personal":null,"occupation":null,"archetype":null,"experience":null},"value":-1,"attributes":{},"properties":{"push":true},"eras":{"1920":true,"nvct":false,"drka":false,"ddts":false,"glit":false,"pulp":false,"mdrn":true},"flags":{},"skillName":"Psychoanalysis"},"effects":[],"folder":null,"sort":0,"permission":{"default":0},"flags":{}},{"_id":"MFR4eR79niGaLfph","name":"Psychology","type":"skill","img":"systems/CoC7/assets/icons/skills/psychology.svg","data":{"specialization":"","description":{"value":"See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty":"","pushedFaillureConsequences":"","chat":"","keeper":""},"base":"10","adjustments":{"personal":null,"occupation":null,"archetype":null,"experience":null},"value":-1,"attributes":{},"properties":{"push":true},"eras":{"1920":true,"nvct":false,"drka":false,"ddts":false,"glit":false,"pulp":false,"mdrn":true},"flags":{},"skillName":"Psychology"},"effects":[],"folder":null,"sort":0,"permission":{"default":0},"flags":{}},{"_id":"o7TdzbuSP7ticONf","name":"Ride","type":"skill","img":"systems/CoC7/assets/icons/skills/ride.svg","data":{"specialization":"","description":{"value":"See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty":"","pushedFaillureConsequences":"","chat":"","keeper":""},"base":"5","adjustments":{"personal":null,"occupation":null,"archetype":null,"experience":null},"value":-1,"attributes":{},"properties":{"push":true},"eras":{"1920":true,"nvct":false,"drka":false,"ddts":false,"glit":false,"pulp":false,"mdrn":true},"flags":{},"skillName":"Ride"},"effects":[],"folder":null,"sort":0,"permission":{"default":0},"flags":{}},{"_id":"KvZuYcg3AmVrwKi2","name":"Science (Any)","type":"skill","img":"systems/CoC7/assets/icons/skills/science_any.svg","data":{"specialization":"Science","description":{"value":"See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty":"","pushedFaillureConsequences":"","chat":"","keeper":""},"base":"1","adjustments":{"personal":null,"occupation":null,"archetype":null,"experience":null},"value":-1,"attributes":{},"properties":{"special":true,"push":true},"eras":{"1920":true,"nvct":false,"drka":false,"ddts":false,"glit":false,"pulp":false,"mdrn":true},"flags":{},"skillName":"Any"},"effects":[],"folder":null,"sort":0,"permission":{"default":0},"flags":{}},{"_id":"KKFNX5M4LtEtiuxs","name":"Sleight of Hand","type":"skill","img":"systems/CoC7/assets/icons/skills/sleight_of_hand.svg","data":{"specialization":"","description":{"value":"See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty":"","pushedFaillureConsequences":"","chat":"","keeper":""},"base":"10","adjustments":{"personal":null,"occupation":null,"archetype":null,"experience":null},"value":-1,"attributes":{},"properties":{"push":true},"eras":{"1920":true,"nvct":false,"drka":false,"ddts":false,"glit":false,"pulp":false,"mdrn":true},"flags":{},"skillName":"Sleight of Hand"},"effects":[],"folder":null,"sort":0,"permission":{"default":0},"flags":{}},{"_id":"nHaWNwtW3Lg0sqYJ","name":"Spot Hidden","type":"skill","img":"systems/CoC7/assets/icons/skills/spot_hidden.svg","data":{"specialization":"","description":{"value":"See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty":"","pushedFaillureConsequences":"","chat":"","keeper":""},"base":"25","adjustments":{"personal":null,"occupation":null,"archetype":null,"experience":null},"value":-1,"attributes":{},"properties":{"push":true},"eras":{"1920":true,"nvct":false,"drka":false,"ddts":false,"glit":false,"pulp":false,"mdrn":true},"flags":{},"skillName":"Spot Hidden"},"effects":[],"folder":null,"sort":0,"permission":{"default":0},"flags":{}},{"_id":"DcV524K0jNfjDEZC","name":"Stealth","type":"skill","img":"systems/CoC7/assets/icons/skills/stealth.svg","data":{"specialization":"","description":{"value":"See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty":"","pushedFaillureConsequences":"","chat":"","keeper":""},"base":"20","adjustments":{"personal":null,"occupation":null,"archetype":null,"experience":null},"value":-1,"attributes":{},"properties":{"push":true},"eras":{"1920":true,"nvct":false,"drka":false,"ddts":false,"glit":false,"pulp":false,"mdrn":true},"flags":{},"skillName":"Stealth"},"effects":[],"folder":null,"sort":0,"permission":{"default":0},"flags":{}},{"_id":"X99v5MtRlfTNjL3B","name":"Survival (Any)","type":"skill","img":"systems/CoC7/assets/icons/skills/survival_any.svg","data":{"specialization":"Survival","description":{"value":"See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty":"","pushedFaillureConsequences":"","chat":"","keeper":""},"base":"10","adjustments":{"personal":null,"occupation":null,"archetype":null,"experience":null},"value":-1,"attributes":{},"properties":{"special":true,"push":true},"eras":{"1920":true,"nvct":false,"drka":false,"ddts":false,"glit":false,"pulp":false,"mdrn":true},"flags":{},"skillName":"Any"},"effects":[],"folder":null,"sort":0,"permission":{"default":0},"flags":{}},{"_id":"1zSIeY0eat2AxQok","name":"Swim","type":"skill","img":"systems/CoC7/assets/icons/skills/swim.svg","data":{"specialization":"","description":{"value":"See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty":"","pushedFaillureConsequences":"","chat":"","keeper":""},"base":"20","adjustments":{"personal":null,"occupation":null,"archetype":null,"experience":null},"value":-1,"attributes":{},"properties":{"push":true},"eras":{"1920":true,"nvct":false,"drka":false,"ddts":false,"glit":false,"pulp":false,"mdrn":true},"flags":{},"skillName":"Swim"},"effects":[],"folder":null,"sort":0,"permission":{"default":0},"flags":{}},{"_id":"AcUIbZFhfoXqQP2m","name":"Track","type":"skill","img":"systems/CoC7/assets/icons/skills/track.svg","data":{"specialization":"","description":{"value":"See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty":"","pushedFaillureConsequences":"","chat":"","keeper":""},"base":"10","adjustments":{"personal":null,"occupation":null,"archetype":null,"experience":null},"value":-1,"attributes":{},"properties":{"push":true},"eras":{"1920":true,"nvct":false,"drka":false,"ddts":false,"glit":false,"pulp":false,"mdrn":true},"flags":{},"skillName":"Track"},"effects":[],"folder":null,"sort":0,"permission":{"default":0},"flags":{}},{"_id":"oh5eFj00Wohnx1My","name":"Climb","type":"skill","img":"systems/CoC7/assets/icons/skills/climb.svg","data":{"specialization":"","description":{"value":"See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty":"","pushedFaillureConsequences":"","chat":"","keeper":""},"base":"20","adjustments":{"personal":null,"occupation":null,"archetype":null,"experience":null},"value":-1,"attributes":{},"properties":{"push":true},"eras":{"1920":true,"nvct":false,"drka":false,"ddts":false,"glit":false,"pulp":false,"mdrn":true},"flags":{},"skillName":"Climb"},"effects":[],"folder":null,"sort":0,"permission":{"default":0},"flags":{}}],"bioSections":["Personal Description","Ideology/Beliefs","Significant People","Meaningful Locations","Treasured Possessions","Traits"],"backstory":"","attributes":{},"properties":{},"eras":{"1920":true,"nvct":false,"drka":false,"ddts":false,"glit":false,"pulp":false,"mdrn":false},"flags":{}},"effects":[],"folder":null,"sort":0,"permission":{"default":0},"flags":{"core":{"sourceId":"Item.K8145914TxcC70wL"}}} +{"_id":"DVdvEDizPZPux1pK","name":"Mania 1","type":"status","img":"icons/svg/aura.svg","data":{"active":false,"source":"","description":{"value":"","chat":"","notes":"","keeper":""},"duration":{"permanent":true,"hours":null,"minutes":null,"rounds":null},"type":{"mania":true,"phobia":false}},"effects":[],"folder":null,"sort":0,"permission":{"default":0},"flags":{"core":{"sourceId":"Item.956QyPlpQ1ED4VQw"}}} +{"_id":"NOsh6EdNSjpjahDF","name":"Occupation Example","type":"occupation","img":"icons/svg/item-bag.svg","data":{"description":{"value":"","keeper":""},"source":"","type":{"classic":true,"lovecraftian":false,"modern":false,"pulp":false},"related":null,"occupationSkillPoints":{"str":{"multiplier":null,"selected":false,"optional":false,"active":false},"con":{"multiplier":null,"selected":false,"optional":false,"active":false},"siz":{"multiplier":null,"selected":false,"optional":false,"active":false},"dex":{"multiplier":null,"selected":false,"optional":false,"active":false},"app":{"multiplier":2,"selected":true,"optional":false,"active":false},"int":{"multiplier":null,"selected":false,"optional":false,"active":false},"pow":{"multiplier":null,"selected":false,"optional":false,"active":false},"edu":{"multiplier":2,"selected":true,"optional":false,"active":false}},"creditRating":{"min":"10","max":"80"},"suggestedContacts":"","skills":[{"_id":"HAuFBG4ZT2yO9yn7","name":"Art/Craft (Any)","type":"skill","img":"systems/CoC7/assets/icons/skills/art_craft_any.svg","data":{"specialization":"Art/Craft","description":{"value":"See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty":"","pushedFaillureConsequences":"","chat":"","keeper":""},"base":"5","adjustments":{"personal":null,"occupation":null,"archetype":null,"experience":null},"value":-1,"attributes":{},"properties":{"special":true,"push":true},"eras":{"1920":true,"nvct":false,"drka":false,"ddts":false,"glit":false,"pulp":false,"mdrn":true},"flags":{},"skillName":"Any"},"effects":[],"folder":null,"sort":0,"permission":{"default":0},"flags":{}},{"_id":"HAuFBG4ZT2yO9yn7","name":"Art/Craft (Any)","type":"skill","img":"systems/CoC7/assets/icons/skills/art_craft_any.svg","data":{"specialization":"Art/Craft","description":{"value":"See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty":"","pushedFaillureConsequences":"","chat":"","keeper":""},"base":"5","adjustments":{"personal":null,"occupation":null,"archetype":null,"experience":null},"value":-1,"attributes":{},"properties":{"special":true,"push":true},"eras":{"1920":true,"nvct":false,"drka":false,"ddts":false,"glit":false,"pulp":false,"mdrn":true},"flags":{},"skillName":"Any"},"effects":[],"folder":null,"sort":0,"permission":{"default":0},"flags":{}},{"_id":"Og2OWQH93aSDWAMZ","name":"Drive Auto","type":"skill","img":"systems/CoC7/assets/icons/skills/drive_auto.svg","data":{"specialization":"","description":{"value":"See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty":"","pushedFaillureConsequences":"","chat":"","keeper":""},"base":"20","adjustments":{"personal":null,"occupation":null,"archetype":null,"experience":null},"value":-1,"attributes":{},"properties":{"push":true},"eras":{"1920":true,"nvct":false,"drka":false,"ddts":false,"glit":false,"pulp":false,"mdrn":true},"flags":{},"skillName":"Drive Auto"},"effects":[],"folder":null,"sort":0,"permission":{"default":0},"flags":{}},{"_id":"MoAB0NRNlpEc2qWr","name":"Listen","type":"skill","img":"systems/CoC7/assets/icons/skills/listen.svg","data":{"specialization":"","description":{"value":"See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty":"","pushedFaillureConsequences":"","chat":"","keeper":""},"base":"20","adjustments":{"personal":null,"occupation":null,"archetype":null,"experience":null},"value":-1,"attributes":{},"properties":{"push":true},"eras":{"1920":true,"nvct":false,"drka":false,"ddts":false,"glit":false,"pulp":false,"mdrn":true},"flags":{},"skillName":"Listen"},"effects":[],"folder":null,"sort":0,"permission":{"default":0},"flags":{}},{"_id":"DcV524K0jNfjDEZC","name":"Stealth","type":"skill","img":"systems/CoC7/assets/icons/skills/stealth.svg","data":{"specialization":"","description":{"value":"See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty":"","pushedFaillureConsequences":"","chat":"","keeper":""},"base":"20","adjustments":{"personal":null,"occupation":null,"archetype":null,"experience":null},"value":-1,"attributes":{},"properties":{"push":true},"eras":{"1920":true,"nvct":false,"drka":false,"ddts":false,"glit":false,"pulp":false,"mdrn":true},"flags":{},"skillName":"Stealth"},"effects":[],"folder":null,"sort":0,"permission":{"default":0},"flags":{}}],"groups":[{"options":"2","skills":[{"_id":"JgtxiN3KzooOWIQV","name":"Charm","type":"skill","img":"systems/CoC7/assets/icons/skills/charm.svg","data":{"specialization":"","description":{"value":"See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty":"","pushedFaillureConsequences":"","chat":"","keeper":""},"base":"15","adjustments":{"personal":null,"occupation":null,"archetype":null,"experience":null},"value":-1,"attributes":{},"properties":{"push":true},"eras":{"1920":true,"nvct":false,"drka":false,"ddts":false,"glit":false,"pulp":false,"mdrn":true},"flags":{},"skillName":"Charm"},"effects":[],"folder":null,"sort":0,"permission":{"default":0},"flags":{}},{"_id":"ld78TITwKNFPpanQ","name":"Fast Talk","type":"skill","img":"systems/CoC7/assets/icons/skills/fast_talk.svg","data":{"specialization":"","description":{"value":"See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty":"","pushedFaillureConsequences":"","chat":"","keeper":""},"base":"5","adjustments":{"personal":null,"occupation":null,"archetype":null,"experience":null},"value":-1,"attributes":{},"properties":{"push":true},"eras":{"1920":true,"nvct":false,"drka":false,"ddts":false,"glit":false,"pulp":false,"mdrn":true},"flags":{},"skillName":"Fast Talk"},"effects":[],"folder":null,"sort":0,"permission":{"default":0},"flags":{}},{"_id":"hDr4eUbS398oniTa","name":"Intimidate","type":"skill","img":"systems/CoC7/assets/icons/skills/intimidate.svg","data":{"specialization":"","description":{"value":"See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty":"","pushedFaillureConsequences":"","chat":"","keeper":""},"base":"15","adjustments":{"personal":null,"occupation":null,"archetype":null,"experience":null},"value":-1,"attributes":{},"properties":{"push":true},"eras":{"1920":true,"nvct":false,"drka":false,"ddts":false,"glit":false,"pulp":false,"mdrn":true},"flags":{},"skillName":"Intimidate"},"effects":[],"folder":null,"sort":0,"permission":{"default":0},"flags":{}},{"_id":"uMzSNURmZqjxr7mU","name":"Persuade","type":"skill","img":"systems/CoC7/assets/icons/skills/persuade.svg","data":{"specialization":"","description":{"value":"See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty":"","pushedFaillureConsequences":"","chat":"","keeper":""},"base":"10","adjustments":{"personal":null,"occupation":null,"archetype":null,"experience":null},"value":-1,"attributes":{},"properties":{"push":true},"eras":{"1920":true,"nvct":false,"drka":false,"ddts":false,"glit":false,"pulp":false,"mdrn":true},"flags":{},"skillName":"Persuade"},"effects":[],"folder":null,"sort":0,"permission":{"default":0},"flags":{}}]},{"options":"1","skills":[{"_id":"vS8bsPWFlwgOecoB","name":"Fighting (Brawl)","type":"skill","img":"systems/CoC7/assets/icons/skills/fighting_brawl.svg","data":{"specialization":"Fighting","description":{"value":"See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty":"","pushedFaillureConsequences":"","chat":"","keeper":""},"base":"25","adjustments":{"personal":null,"occupation":null,"archetype":null,"experience":null},"value":-1,"attributes":{},"properties":{"fighting":true,"firearm":false,"combat":true,"special":true},"eras":{"1920":true,"nvct":false,"drka":false,"ddts":false,"glit":false,"pulp":false,"mdrn":true},"flags":{},"skillName":"Brawl"},"effects":[],"folder":null,"sort":0,"permission":{"default":0},"flags":{}},{"_id":"KmDGtn7ukUFVb265","name":"Firearms (Handgun)","type":"skill","img":"systems/CoC7/assets/icons/skills/firearms_handgun.svg","data":{"specialization":"Firearms","description":{"value":"See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty":"","pushedFaillureConsequences":"","chat":"","keeper":""},"base":"20","adjustments":{"personal":null,"occupation":null,"archetype":null,"experience":null},"value":-1,"attributes":{},"properties":{"fighting":false,"firearm":true,"combat":true,"special":true},"eras":{"1920":true,"nvct":false,"drka":false,"ddts":false,"glit":false,"pulp":false,"mdrn":true},"flags":{},"skillName":"Handgun"},"effects":[],"folder":null,"sort":0,"permission":{"default":0},"flags":{}}]}],"personal":1,"attributes":{},"properties":{},"eras":{},"flags":{}},"effects":[],"folder":null,"sort":0,"permission":{"default":0},"flags":{"core":{"sourceId":"Item.VV21NKX0pHuShVr0"}}} +{"_id":"NVz7eCFnoH8J12qH","name":"Talent 2","type":"talent","img":"icons/svg/item-bag.svg","data":{"source":"","description":{"value":"","chat":"","notes":"","keeper":""},"type":{"physical":false,"mental":true,"combat":false,"miscellaneous":false,"basic":false,"insane":false,"other":false}},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"9N2eSs3Ws41QyPkT":3},"flags":{"core":{"sourceId":"Item.gk9dv6JwXm04asge"}}} +{"_id":"PFpgtSKUcBDLVLY6","name":"Phobia 1","type":"status","img":"icons/svg/aura.svg","data":{"active":false,"source":"","description":{"value":"","chat":"","notes":"","keeper":""},"duration":{"permanent":true,"hours":null,"minutes":null,"rounds":null},"type":{"mania":false,"phobia":true}},"effects":[],"folder":null,"sort":0,"permission":{"default":0},"flags":{"core":{"sourceId":"Item.LIabvJunZPiq0brc"}}} +{"_id":"Vm9OzZnAVOpDdwfB","name":"Mania 2","type":"status","img":"icons/svg/aura.svg","data":{"active":false,"source":"","description":{"value":"","chat":"","notes":"","keeper":""},"duration":{"permanent":true,"hours":null,"minutes":null,"rounds":null},"type":{"mania":true,"phobia":false}},"effects":[],"folder":null,"sort":0,"permission":{"default":0},"flags":{"core":{"sourceId":"Item.4gH7MiriVDWx31YF"}}} +{"_id":"lu04TIRrg9P3vRqY","name":"Archetype Example","type":"archetype","img":"icons/svg/item-bag.svg","data":{"description":{"value":"","keeper":""},"source":"","type":{"classic":false,"lovecraftian":false,"modern":false},"bonusPoints":100,"coreCharacteristics":{"str":false,"con":false,"siz":false,"dex":false,"app":true,"int":true,"pow":false,"edu":false},"coreCharacteristicsFormula":{"enabled":true,"value":"(1D6+13)*5"},"suggestedOccupations":"","suggestedTraits":"","talents":2,"skills":[{"_id":"wOs3gryeGRPkGoWD","name":"Appraise","type":"skill","img":"systems/CoC7/assets/icons/skills/appraise.svg","data":{"specialization":"","description":{"value":"See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty":"","pushedFaillureConsequences":"","chat":"","keeper":""},"base":"5","adjustments":{"personal":null,"occupation":null,"archetype":null,"experience":null},"value":-1,"attributes":{},"properties":{"push":true},"eras":{"1920":true,"nvct":false,"drka":false,"ddts":false,"glit":false,"pulp":false,"mdrn":true},"flags":{},"skillName":"Appraise"},"effects":[],"folder":null,"sort":0,"permission":{"default":0},"flags":{}},{"_id":"m6V53lyfz7zh95FE","name":"Art/Craft (Acting)","type":"skill","img":"systems/CoC7/assets/icons/skills/art_craft_acting.svg","data":{"specialization":"Art/Craft","description":{"value":"See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty":"","pushedFaillureConsequences":"","chat":"","keeper":""},"base":"5","adjustments":{"personal":null,"occupation":null,"archetype":null,"experience":null},"value":-1,"attributes":{},"properties":{"special":true,"push":true},"eras":{"1920":true,"nvct":false,"drka":false,"ddts":false,"glit":false,"pulp":false,"mdrn":true},"flags":{},"skillName":"Acting"},"effects":[],"folder":null,"sort":0,"permission":{"default":0},"flags":{}},{"_id":"HAuFBG4ZT2yO9yn7","name":"Art/Craft (Any)","type":"skill","img":"systems/CoC7/assets/icons/skills/art_craft_any.svg","data":{"specialization":"Art/Craft","description":{"value":"See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty":"","pushedFaillureConsequences":"","chat":"","keeper":""},"base":"5","adjustments":{"personal":null,"occupation":null,"archetype":null,"experience":null},"value":-1,"attributes":{},"properties":{"special":true,"push":true},"eras":{"1920":true,"nvct":false,"drka":false,"ddts":false,"glit":false,"pulp":false,"mdrn":true},"flags":{},"skillName":"Any"},"effects":[],"folder":null,"sort":0,"permission":{"default":0},"flags":{}},{"_id":"JgtxiN3KzooOWIQV","name":"Charm","type":"skill","img":"systems/CoC7/assets/icons/skills/charm.svg","data":{"specialization":"","description":{"value":"See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty":"","pushedFaillureConsequences":"","chat":"","keeper":""},"base":"15","adjustments":{"personal":null,"occupation":null,"archetype":null,"experience":null},"value":-1,"attributes":{},"properties":{"push":true},"eras":{"1920":true,"nvct":false,"drka":false,"ddts":false,"glit":false,"pulp":false,"mdrn":true},"flags":{},"skillName":"Charm"},"effects":[],"folder":null,"sort":0,"permission":{"default":0},"flags":{}},{"_id":"gzNPM9gbx0EZffBV","name":"Disguise","type":"skill","img":"systems/CoC7/assets/icons/skills/disguise.svg","data":{"specialization":"","description":{"value":"See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty":"","pushedFaillureConsequences":"","chat":"","keeper":""},"base":"5","adjustments":{"personal":null,"occupation":null,"archetype":null,"experience":null},"value":-1,"attributes":{},"properties":{"push":true},"eras":{"1920":true,"nvct":false,"drka":false,"ddts":false,"glit":false,"pulp":false,"mdrn":true},"flags":{},"skillName":"Disguise"},"effects":[],"folder":null,"sort":0,"permission":{"default":0},"flags":{}},{"_id":"Og2OWQH93aSDWAMZ","name":"Drive Auto","type":"skill","img":"systems/CoC7/assets/icons/skills/drive_auto.svg","data":{"specialization":"","description":{"value":"See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty":"","pushedFaillureConsequences":"","chat":"","keeper":""},"base":"20","adjustments":{"personal":null,"occupation":null,"archetype":null,"experience":null},"value":-1,"attributes":{},"properties":{"push":true},"eras":{"1920":true,"nvct":false,"drka":false,"ddts":false,"glit":false,"pulp":false,"mdrn":true},"flags":{},"skillName":"Drive Auto"},"effects":[],"folder":null,"sort":0,"permission":{"default":0},"flags":{}},{"_id":"ld78TITwKNFPpanQ","name":"Fast Talk","type":"skill","img":"systems/CoC7/assets/icons/skills/fast_talk.svg","data":{"specialization":"","description":{"value":"See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty":"","pushedFaillureConsequences":"","chat":"","keeper":""},"base":"5","adjustments":{"personal":null,"occupation":null,"archetype":null,"experience":null},"value":-1,"attributes":{},"properties":{"push":true},"eras":{"1920":true,"nvct":false,"drka":false,"ddts":false,"glit":false,"pulp":false,"mdrn":true},"flags":{},"skillName":"Fast Talk"},"effects":[],"folder":null,"sort":0,"permission":{"default":0},"flags":{}},{"_id":"vS8bsPWFlwgOecoB","name":"Fighting (Brawl)","type":"skill","img":"systems/CoC7/assets/icons/skills/fighting_brawl.svg","data":{"specialization":"Fighting","description":{"value":"See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty":"","pushedFaillureConsequences":"","chat":"","keeper":""},"base":"25","adjustments":{"personal":null,"occupation":null,"archetype":null,"experience":null},"value":-1,"attributes":{},"properties":{"fighting":true,"firearm":false,"combat":true,"special":true},"eras":{"1920":true,"nvct":false,"drka":false,"ddts":false,"glit":false,"pulp":false,"mdrn":true},"flags":{},"skillName":"Brawl"},"effects":[],"folder":null,"sort":0,"permission":{"default":0},"flags":{}},{"_id":"KmDGtn7ukUFVb265","name":"Firearms (Handgun)","type":"skill","img":"systems/CoC7/assets/icons/skills/firearms_handgun.svg","data":{"specialization":"Firearms","description":{"value":"See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty":"","pushedFaillureConsequences":"","chat":"","keeper":""},"base":"20","adjustments":{"personal":null,"occupation":null,"archetype":null,"experience":null},"value":-1,"attributes":{},"properties":{"fighting":false,"firearm":true,"combat":true,"special":true},"eras":{"1920":true,"nvct":false,"drka":false,"ddts":false,"glit":false,"pulp":false,"mdrn":true},"flags":{},"skillName":"Handgun"},"effects":[],"folder":null,"sort":0,"permission":{"default":0},"flags":{}},{"_id":"MoAB0NRNlpEc2qWr","name":"Listen","type":"skill","img":"systems/CoC7/assets/icons/skills/listen.svg","data":{"specialization":"","description":{"value":"See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty":"","pushedFaillureConsequences":"","chat":"","keeper":""},"base":"20","adjustments":{"personal":null,"occupation":null,"archetype":null,"experience":null},"value":-1,"attributes":{},"properties":{"push":true},"eras":{"1920":true,"nvct":false,"drka":false,"ddts":false,"glit":false,"pulp":false,"mdrn":true},"flags":{},"skillName":"Listen"},"effects":[],"folder":null,"sort":0,"permission":{"default":0},"flags":{}},{"_id":"MFR4eR79niGaLfph","name":"Psychology","type":"skill","img":"systems/CoC7/assets/icons/skills/psychology.svg","data":{"specialization":"","description":{"value":"See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty":"","pushedFaillureConsequences":"","chat":"","keeper":""},"base":"10","adjustments":{"personal":null,"occupation":null,"archetype":null,"experience":null},"value":-1,"attributes":{},"properties":{"push":true},"eras":{"1920":true,"nvct":false,"drka":false,"ddts":false,"glit":false,"pulp":false,"mdrn":true},"flags":{},"skillName":"Psychology"},"effects":[],"folder":null,"sort":0,"permission":{"default":0},"flags":{}},{"_id":"KKFNX5M4LtEtiuxs","name":"Sleight of Hand","type":"skill","img":"systems/CoC7/assets/icons/skills/sleight_of_hand.svg","data":{"specialization":"","description":{"value":"See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty":"","pushedFaillureConsequences":"","chat":"","keeper":""},"base":"10","adjustments":{"personal":null,"occupation":null,"archetype":null,"experience":null},"value":-1,"attributes":{},"properties":{"push":true},"eras":{"1920":true,"nvct":false,"drka":false,"ddts":false,"glit":false,"pulp":false,"mdrn":true},"flags":{},"skillName":"Sleight of Hand"},"effects":[],"folder":null,"sort":0,"permission":{"default":0},"flags":{}},{"_id":"DcV524K0jNfjDEZC","name":"Stealth","type":"skill","img":"systems/CoC7/assets/icons/skills/stealth.svg","data":{"specialization":"","description":{"value":"See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty":"","pushedFaillureConsequences":"","chat":"","keeper":""},"base":"20","adjustments":{"personal":null,"occupation":null,"archetype":null,"experience":null},"value":-1,"attributes":{},"properties":{"push":true},"eras":{"1920":true,"nvct":false,"drka":false,"ddts":false,"glit":false,"pulp":false,"mdrn":true},"flags":{},"skillName":"Stealth"},"effects":[],"folder":null,"sort":0,"permission":{"default":0},"flags":{}}],"attributes":{},"properties":{},"eras":{},"flags":{}},"effects":[],"folder":null,"sort":0,"permission":{"default":0},"flags":{"core":{"sourceId":"Item.CrhRlgbg1O6F4vaY"}}} +{"_id":"uWQYNsMURpspTetM","name":"Experimental weapon","type":"weapon","img":"icons/svg/sword.svg","data":{"description":{"value":"Description of the weapon
\nselecting 'Area of effect' will enable 3 different damage and range
\nselecting 'Full-auto' will allow 2 different skills to be selected for the weapon
\nselecting 'Special' will activate the special input field
\nIn the combat tab, if the icons are with a red background, it means that no skill have been selected for that weapon
\nEdit the weapon and select the correct skill.
","chat":"","special":"You can add special description or slugs there :
\nSlug 1 : 2d17kh
","keeper":""},"wpnType":"","skill":{"main":{"name":"To be selected once the weapon is owned","id":""},"alternativ":{"name":"","id":""}},"range":{"normal":{"value":"15ft","units":"","damage":"3d6"},"long":{"value":0,"units":"","damage":""},"extreme":{"value":0,"units":"","damage":""}},"usesPerRound":{"normal":"1","max":"","burst":""},"bullets":"","ammo":0,"malfunction":"85","blastRadius":null,"properties":{"melee":false,"rngd":true,"spcl":true,"brst":true},"eras":{"1920":true,"nvct":false,"drka":false,"ddts":false,"glit":false,"pulp":false,"mdrn":true},"price":{"1920":"5$","mdrn":"6$"}},"effects":[],"folder":null,"sort":0,"permission":{"default":0},"flags":{"core":{"sourceId":"Item.NzTqCxAlJVfdUmxR"}}} +{"_id":"yqvwz769ZeJplOW7","name":"Talent 1","type":"talent","img":"icons/svg/item-bag.svg","data":{"source":"","description":{"value":"","chat":"","notes":"","keeper":""},"type":{"physical":true,"mental":false,"combat":false,"miscellaneous":false,"basic":false,"insane":false,"other":false}},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"9N2eSs3Ws41QyPkT":3},"flags":{"core":{"sourceId":"Item.iE7vj2dK7klaHSZT"}}} +{"_id":"zyCszwqyTg21l9E2","name":"Death ray (prototype)","type":"weapon","img":"icons/svg/sword.svg","data":{"description":{"value":"","chat":"","special":"","keeper":""},"wpnType":"","skill":{"main":{"name":"","id":""},"alternativ":{"name":"","id":""}},"range":{"normal":{"value":"50ft","units":"","damage":"5d6"},"long":{"value":0,"units":"","damage":""},"extreme":{"value":0,"units":"","damage":""}},"usesPerRound":{"normal":"1","max":"","burst":null},"bullets":"","ammo":0,"malfunction":"","blastRadius":null,"properties":{"melee":false,"rngd":true,"slnt":true},"eras":{"1920":false,"nvct":false,"drka":false,"ddts":false,"glit":false,"pulp":false,"mdrn":false},"price":{}},"effects":[],"folder":null,"sort":0,"permission":{"default":0},"flags":{"core":{"sourceId":"Item.fkfXxQQKhfMfUWGE"}}} diff --git a/packs/sanity-tables-examples.db b/packs/sanity-tables-examples.db index 552dbda4..7747e723 100644 --- a/packs/sanity-tables-examples.db +++ b/packs/sanity-tables-examples.db @@ -1,4 +1,4 @@ -{"name":"Table X: Sample Manias","permission":{"default":0,"6Y6opwuMdxc52cY3":3},"flags":{"core":{"sourceId":"RollTable.6EIZXhKnmAyhEsBn"}},"img":"icons/svg/d20-grey.svg","description":"See Keeper rulebook P161 for details","results":[{"_id":"p5lnrVyhzlOlTW1X","flags":{},"type":0,"text":"Sample mania (Text) See Keeper rulebook P161 for details","img":"icons/svg/d20-black.svg","resultId":"","weight":1,"range":[1,1],"drawn":false},{"_id":"baysUyR0Z4JlNImd","flags":{},"type":1,"text":"Mania 1","img":"icons/svg/mystery-man.svg","collection":"Item","resultId":"CMTjeaHyUMY4Imf1","weight":1,"range":[2,2],"drawn":false},{"_id":"U7snRGZkre4uzX1t","flags":{},"type":1,"text":"Mania 2","img":"icons/svg/mystery-man.svg","collection":"Item","resultId":"9iyfHPXXsWrTFtG3","weight":1,"range":[3,3],"drawn":false}],"formula":"1d3","replacement":true,"displayRoll":true,"_id":"5riZ59lJC7b2Ch0D"} -{"name":"Table VIII: Bouts of Madness - Summary","permission":{"default":0,"6Y6opwuMdxc52cY3":3},"flags":{"core":{"sourceId":"RollTable.l7cMZea9U61j7mAo"}},"img":"icons/svg/d20-grey.svg","description":"See - Keeper Rulebook V7 - P159 for details","results":[{"_id":"Esb0GbmbJW31Bt3y","flags":{},"type":0,"text":"See bout of madness table P159 [[1D10]] hours","img":"icons/svg/d20-black.svg","resultId":"","weight":8,"range":[1,8],"drawn":false},{"_id":"QtgBj3oqttScUu1O","flags":{},"type":1,"text":"Table IX: Sample Phobias","img":"icons/svg/d20-grey.svg","collection":"RollTable","resultId":"ue3FzoIrV2ImVFit","weight":1,"range":[9,9],"drawn":false},{"_id":"mRE43rMBB1bzqpwp","flags":{},"type":1,"text":"Table X: Sample Manias","img":"icons/svg/d20-grey.svg","collection":"RollTable","resultId":"6EIZXhKnmAyhEsBn","weight":1,"range":[10,10],"drawn":false}],"formula":"1d10","replacement":true,"displayRoll":true,"_id":"FfUXO8GfEEbejJqq"} -{"name":"Table VII: Bouts of Madness - Real Time","permission":{"default":0,"6Y6opwuMdxc52cY3":3},"flags":{"core":{"sourceId":"RollTable.0mHHERDsF3gfjb2J"}},"img":"icons/svg/d20-grey.svg","description":"See - Keeper Rulebook V7 - P157 for details","results":[{"_id":"wkAoS0CZin60yxqq","flags":{},"type":0,"text":"See bout of madness table P157 [[1D10]] rounds","img":"icons/svg/d20-black.svg","resultId":"","weight":8,"range":[1,8],"drawn":false},{"_id":"f7lQW70JZoV65k7t","flags":{},"type":1,"text":"Table IX: Sample Phobias","img":"icons/svg/d20-grey.svg","collection":"RollTable","resultId":"ue3FzoIrV2ImVFit","weight":1,"range":[9,9],"drawn":false},{"_id":"NVwiNwt5AJTDsbOF","flags":{},"type":1,"text":"Table X: Sample Manias","img":"icons/svg/d20-grey.svg","collection":"RollTable","resultId":"6EIZXhKnmAyhEsBn","weight":1,"range":[10,10],"drawn":false}],"formula":"1d10","replacement":true,"displayRoll":true,"_id":"QP9JVWHvEchOHaXH"} -{"name":"Table IX: Sample Phobias","permission":{"default":0,"6Y6opwuMdxc52cY3":3},"flags":{"core":{"sourceId":"RollTable.ue3FzoIrV2ImVFit"}},"img":"icons/svg/d20-grey.svg","description":"See Keeper rulebook P160 for details","results":[{"_id":"zPS16v4ejOf001Oa","flags":{},"type":0,"text":"Sample phobia (Text) See Keeper rulebook P160 for details","img":"icons/svg/d20-black.svg","resultId":"","weight":1,"range":[1,1],"drawn":false},{"_id":"0moeYAVLI9D4ieHc","flags":{},"type":1,"text":"Phobia 1","img":"icons/svg/mystery-man.svg","collection":"Item","resultId":"HRR0Dr6I4Xk9ngfy","weight":1,"range":[2,2],"drawn":false},{"_id":"QQGyA9Mj3KXXLE7L","flags":{},"type":1,"text":"Phobia 2","img":"icons/svg/mystery-man.svg","collection":"Item","resultId":"prcaM7hJKNIGEzG8","weight":1,"range":[3,3],"drawn":false}],"formula":"1d3","replacement":true,"displayRoll":true,"_id":"v08s0eKtKnkoHd6N"} +{"name":"Table IX: Sample Phobias","img":"icons/svg/d20-grey.svg","description":"See Keeper rulebook P160 for details","results":[{"_id":"zPS16v4ejOf001Oa","flags":{},"type":0,"text":"Sample phobia (Text) See Keeper rulebook P160 for details","img":"icons/svg/d20-black.svg","weight":1,"range":[1,1],"drawn":false,"rangeL":1,"rangeH":1},{"_id":"0moeYAVLI9D4ieHc","flags":{},"type":1,"text":"Phobia 1","img":"icons/svg/aura.svg","collection":"Item","resultId":"LIabvJunZPiq0brc","weight":1,"range":[2,2],"drawn":false,"rangeL":2,"rangeH":2},{"_id":"QQGyA9Mj3KXXLE7L","flags":{},"type":1,"text":"Phobia 2","img":"icons/svg/aura.svg","collection":"Item","resultId":"b5DeLy1KETMeE8ZC","weight":1,"range":[3,3],"drawn":false,"rangeL":3,"rangeH":3}],"formula":"1d3","replacement":true,"displayRoll":true,"folder":null,"sort":0,"permission":{"default":0,"6Y6opwuMdxc52cY3":3},"flags":{"core":{"sourceId":"RollTable.ue3FzoIrV2ImVFit"}},"_id":"6daRognwiyG5eoQd"} +{"name":"Table VII: Bouts of Madness - Real Time","img":"icons/svg/d20-grey.svg","description":"See - Keeper Rulebook V7 - P157 for details","results":[{"_id":"wkAoS0CZin60yxqq","flags":{},"type":0,"text":"See bout of madness table P157 [[1D10]] rounds","img":"icons/svg/d20-black.svg","weight":8,"range":[1,8],"drawn":false,"rangeL":1,"rangeH":8},{"_id":"f7lQW70JZoV65k7t","flags":{},"type":1,"text":"Table IX: Sample Phobias","img":"icons/svg/d20-grey.svg","collection":"RollTable","resultId":"LxRFNAbfFi9UPzNs","weight":1,"range":[9,9],"drawn":false,"rangeL":9,"rangeH":9},{"_id":"NVwiNwt5AJTDsbOF","flags":{},"type":1,"text":"Table X: Sample Manias","img":"icons/svg/d20-grey.svg","collection":"RollTable","resultId":"qlbDIJB7HHNpzbOW","weight":1,"range":[10,10],"drawn":false,"rangeL":10,"rangeH":10}],"formula":"1d10","replacement":true,"displayRoll":true,"folder":null,"sort":0,"permission":{"default":0,"6Y6opwuMdxc52cY3":3},"flags":{"core":{"sourceId":"RollTable.0mHHERDsF3gfjb2J"}},"_id":"NNX6jAG2DBkw9red"} +{"name":"Table VIII: Bouts of Madness - Summary","img":"icons/svg/d20-grey.svg","description":"See - Keeper Rulebook V7 - P159 for details","results":[{"_id":"Esb0GbmbJW31Bt3y","flags":{},"type":0,"text":"See bout of madness table P159 [[1D10]] hours","img":"icons/svg/d20-black.svg","weight":8,"range":[1,8],"drawn":false,"rangeL":1,"rangeH":8},{"_id":"QtgBj3oqttScUu1O","flags":{},"type":1,"text":"Table IX: Sample Phobias","img":"icons/svg/d20-grey.svg","collection":"RollTable","resultId":"LxRFNAbfFi9UPzNs","weight":1,"range":[9,9],"drawn":false,"rangeL":9,"rangeH":9},{"_id":"mRE43rMBB1bzqpwp","flags":{},"type":1,"text":"Table X: Sample Manias","img":"icons/svg/d20-grey.svg","collection":"RollTable","resultId":"qlbDIJB7HHNpzbOW","weight":1,"range":[10,10],"drawn":false,"rangeL":10,"rangeH":10}],"formula":"1d10","replacement":true,"displayRoll":true,"folder":null,"sort":0,"permission":{"default":0,"6Y6opwuMdxc52cY3":3},"flags":{"core":{"sourceId":"RollTable.l7cMZea9U61j7mAo"}},"_id":"ZyCIR3PbyYaIE8W2"} +{"name":"Table X: Sample Manias","img":"icons/svg/d20-grey.svg","description":"See Keeper rulebook P161 for details","results":[{"_id":"p5lnrVyhzlOlTW1X","flags":{},"type":0,"text":"Sample mania (Text) See Keeper rulebook P161 for details","img":"icons/svg/d20-black.svg","weight":1,"range":[1,1],"drawn":false,"rangeL":1,"rangeH":1},{"_id":"baysUyR0Z4JlNImd","flags":{},"type":1,"text":"Mania 1","img":"icons/svg/aura.svg","collection":"Item","resultId":"956QyPlpQ1ED4VQw","weight":1,"range":[2,2],"drawn":false,"rangeL":2,"rangeH":2},{"_id":"U7snRGZkre4uzX1t","flags":{},"type":1,"text":"Mania 2","img":"icons/svg/aura.svg","collection":"Item","resultId":"4gH7MiriVDWx31YF","weight":1,"range":[3,3],"drawn":false,"rangeL":3,"rangeH":3}],"formula":"1d3","replacement":true,"displayRoll":true,"folder":null,"sort":0,"permission":{"default":0,"6Y6opwuMdxc52cY3":3},"flags":{"core":{"sourceId":"RollTable.6EIZXhKnmAyhEsBn"}},"_id":"mWs2LZoSvSBqlqhW"} diff --git a/packs/skills.db b/packs/skills.db index 80112e71..2faf73ff 100644 --- a/packs/skills.db +++ b/packs/skills.db @@ -1,84 +1,93 @@ -{"_id":"0CW96pjN3moX6MiA","name":"Hypnosis","permission":{"default":0,"kEjKgSLquYZFCui9":3},"type":"skill","data":{"specialization":"","description":{"value":"See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty":"","pushedFaillureConsequences":"","chat":""},"base":"1","value":-1,"attributes":{},"properties":{"special":false,"rarity":true,"push":true,"combat":false},"eras":{"1920":true,"nvct":false,"drka":false,"ddts":false,"glit":false,"pulp":false,"mdrn":true},"markforxp":false},"flags":{},"img":"systems/CoC7/assets/icons/skills.svg"} -{"_id":"0KVMEYlXmj96Hg8r","name":"Fast Talk","permission":{"default":0,"kEjKgSLquYZFCui9":3},"type":"skill","data":{"specialization":"","description":{"value":"See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty":"","pushedFaillureConsequences":"","chat":""},"base":"5","value":-1,"attributes":{},"properties":{"special":false,"rarity":false,"push":true,"combat":false},"eras":{"1920":true,"nvct":false,"drka":false,"ddts":false,"glit":false,"pulp":false,"mdrn":true},"markforxp":false},"flags":{},"img":"systems/CoC7/assets/icons/skills.svg"} -{"_id":"0rUZhmuvWnGiAq03","name":"First Aid","permission":{"default":0,"kEjKgSLquYZFCui9":3},"type":"skill","data":{"specialization":"","description":{"value":"See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty":"","pushedFaillureConsequences":"","chat":""},"base":"30","value":-1,"attributes":{},"properties":{"push":true,"special":false,"rarity":false,"combat":false},"eras":{"1920":true,"nvct":false,"drka":false,"ddts":false,"glit":false,"pulp":false,"mdrn":true},"markforxp":false},"flags":{},"img":"systems/CoC7/assets/icons/skills.svg"} -{"_id":"2NJ3DogsxWVMqeUr","name":"Bow","permission":{"default":0,"kEjKgSLquYZFCui9":3},"type":"skill","data":{"specialization":"Firearms","description":{"value":"See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty":"","pushedFaillureConsequences":"","chat":""},"base":"15","value":-1,"attributes":{},"properties":{"combat":true,"special":true,"rarity":false,"push":false,"fighting":false,"firearm":true},"eras":{"1920":true,"nvct":false,"drka":false,"ddts":false,"glit":false,"pulp":false,"mdrn":true},"markforxp":false},"flags":{},"img":"systems/CoC7/assets/icons/skills.svg"} -{"name":"Track (Any)","permission":{"default":0,"6Y6opwuMdxc52cY3":3},"type":"skill","data":{"specialization":"Track","description":{"value":"","opposingDifficulty":"","pushedFaillureConsequences":"","chat":""},"base":"10","adjustments":{"personal":null,"occupation":null,"archetype":null,"experience":null},"value":-1,"attributes":{},"properties":{"special":true,"push":true},"eras":{},"flags":{}},"flags":{},"img":"systems/CoC7/assets/icons/skills.svg","_id":"4TTVJmCu9mP5kFrx"} -{"_id":"4qHYlBBt1EbF4DgR","name":"Flail","permission":{"default":0,"kEjKgSLquYZFCui9":3},"type":"skill","data":{"specialization":"Fighting","description":{"value":"See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty":"","pushedFaillureConsequences":"","chat":""},"base":"10","value":-1,"attributes":{},"properties":{"combat":true,"special":true,"rarity":false,"push":false,"fighting":true,"firearm":false},"eras":{"1920":true,"nvct":false,"drka":false,"ddts":false,"glit":false,"pulp":false,"mdrn":true},"markforxp":false},"flags":{},"img":"systems/CoC7/assets/icons/skills.svg"} -{"_id":"6FqhuAKXfO6lMptC","name":"Pharmacy","permission":{"default":0,"kEjKgSLquYZFCui9":3},"type":"skill","data":{"specialization":"Science","description":{"value":"See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty":"","pushedFaillureConsequences":"","chat":""},"base":"1","value":-1,"attributes":{},"properties":{"special":true,"rarity":false,"push":true,"combat":false},"eras":{"1920":true,"nvct":false,"drka":false,"ddts":false,"glit":false,"pulp":false,"mdrn":true},"markforxp":false},"flags":{},"img":"systems/CoC7/assets/icons/skills.svg"} -{"_id":"6HwjKQGcNn75EPHi","name":"Geology","permission":{"default":0,"kEjKgSLquYZFCui9":3},"type":"skill","data":{"specialization":"Science","description":{"value":"See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty":"","pushedFaillureConsequences":"","chat":""},"base":"1","value":-1,"attributes":{},"properties":{"special":true,"rarity":false,"push":true,"combat":false},"eras":{"1920":true,"nvct":false,"drka":false,"ddts":false,"glit":false,"pulp":false,"mdrn":true},"markforxp":false},"flags":{},"img":"systems/CoC7/assets/icons/skills.svg"} -{"_id":"6oM9fULWVvvHSO1U","name":"Electronics","permission":{"default":0,"kEjKgSLquYZFCui9":3},"type":"skill","data":{"specialization":"","description":{"value":"See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty":"","pushedFaillureConsequences":"","chat":""},"base":"1","value":-1,"attributes":{},"properties":{"special":false,"rarity":false,"push":true,"combat":false},"eras":{"1920":false,"nvct":false,"drka":false,"ddts":false,"glit":false,"pulp":false,"mdrn":true},"markforxp":false},"flags":{},"img":"systems/CoC7/assets/icons/skills.svg"} -{"_id":"7Nhb8ENox4QjMb0t","name":"Navigate","permission":{"default":0,"kEjKgSLquYZFCui9":3},"type":"skill","data":{"specialization":"","description":{"value":"See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty":"","pushedFaillureConsequences":"","chat":""},"base":"10","value":-1,"attributes":{},"properties":{"special":false,"rarity":false,"push":true,"combat":false},"eras":{"1920":true,"nvct":false,"drka":false,"ddts":false,"glit":false,"pulp":false,"mdrn":true},"markforxp":false},"flags":{},"img":"systems/CoC7/assets/icons/skills.svg"} -{"_id":"8HHFjJXoRN2hgBxf","name":"Credit Rating","permission":{"default":0,"kEjKgSLquYZFCui9":3},"type":"skill","data":{"specialization":"","description":{"value":"See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty":"","pushedFaillureConsequences":"","chat":""},"base":"0","value":-1,"attributes":{},"properties":{"special":false,"rarity":false,"push":true,"combat":false,"noxpgain":true},"eras":{"1920":true,"nvct":false,"drka":false,"ddts":false,"glit":false,"pulp":false,"mdrn":true},"markforxp":false},"flags":{},"img":"systems/CoC7/assets/icons/skills.svg"} -{"_id":"8p5j2JjSGPdWBCZk","name":"Computer Use","permission":{"default":0,"kEjKgSLquYZFCui9":3},"type":"skill","data":{"specialization":"","description":{"value":"See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty":"","pushedFaillureConsequences":"","chat":""},"base":"5","value":-1,"attributes":{},"properties":{"special":false,"rarity":false,"push":true,"combat":false},"eras":{"1920":false,"mdrn":true,"nvct":false,"drka":false,"ddts":false,"glit":false,"pulp":false},"markforxp":false},"flags":{},"img":"systems/CoC7/assets/icons/skills.svg"} -{"_id":"9Pum9Y2Atd5ug6zz","name":"Physics","permission":{"default":0,"kEjKgSLquYZFCui9":3},"type":"skill","data":{"specialization":"Science","description":{"value":"See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty":"","pushedFaillureConsequences":"","chat":""},"base":"1","value":-1,"attributes":{},"properties":{"special":true,"rarity":false,"push":true,"combat":false},"eras":{"1920":true,"nvct":false,"drka":false,"ddts":false,"glit":false,"pulp":false,"mdrn":true},"markforxp":false},"flags":{},"img":"systems/CoC7/assets/icons/skills.svg"} -{"_id":"9Z7rRlJ4kLXaJC6k","name":"Electrical Repair","permission":{"default":0,"kEjKgSLquYZFCui9":3},"type":"skill","data":{"specialization":"","description":{"value":"See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty":"","pushedFaillureConsequences":"","chat":""},"base":"10","value":-1,"attributes":{},"properties":{"push":true,"special":false,"rarity":false,"combat":false},"eras":{"1920":true,"nvct":false,"drka":false,"ddts":false,"glit":false,"pulp":false,"mdrn":true},"markforxp":false},"flags":{},"img":"systems/CoC7/assets/icons/skills.svg"} -{"_id":"A0NyE5kmHe5FOnq9","name":"Swim","permission":{"default":0,"kEjKgSLquYZFCui9":3},"type":"skill","data":{"specialization":"","description":{"value":"See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty":"","pushedFaillureConsequences":"","chat":""},"base":"20","value":-1,"attributes":{},"properties":{"push":true,"special":false,"rarity":false,"combat":false},"eras":{"1920":true,"nvct":false,"drka":false,"ddts":false,"glit":false,"pulp":false,"mdrn":true},"markforxp":false},"flags":{},"img":"systems/CoC7/assets/icons/skills.svg"} -{"_id":"AT5eymQCpQxdye9q","name":"Heavy Weapons","permission":{"default":0,"kEjKgSLquYZFCui9":3},"type":"skill","data":{"specialization":"Firearms","description":{"value":"See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty":"","pushedFaillureConsequences":"","chat":""},"base":"10","value":-1,"attributes":{},"properties":{"special":true,"rarity":false,"push":false,"combat":true,"fighting":false,"firearm":true},"eras":{"1920":true,"nvct":false,"drka":false,"ddts":false,"glit":false,"pulp":false,"mdrn":true},"markforxp":false},"flags":{},"img":"systems/CoC7/assets/icons/skills.svg"} -{"_id":"BRELpaLp238XzXH5","name":"Diving","permission":{"default":0,"kEjKgSLquYZFCui9":3},"type":"skill","data":{"specialization":"","description":{"value":"See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty":"","pushedFaillureConsequences":"","chat":""},"base":"1","value":-1,"attributes":{},"properties":{"special":false,"rarity":false,"push":true,"combat":false},"eras":{"1920":true,"nvct":false,"drka":false,"ddts":false,"glit":false,"pulp":false,"mdrn":true},"markforxp":false},"flags":{},"img":"systems/CoC7/assets/icons/skills.svg"} -{"_id":"CQY7mhxduGFebAmi","name":"Handgun","permission":{"default":0,"kEjKgSLquYZFCui9":3},"type":"skill","data":{"specialization":"Firearms","description":{"value":"See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty":"","pushedFaillureConsequences":"","chat":""},"base":"20","value":-1,"attributes":{},"properties":{"special":true,"rarity":false,"push":false,"combat":true,"fighting":false,"firearm":true},"eras":{"1920":true,"nvct":false,"drka":false,"ddts":false,"glit":false,"pulp":false,"mdrn":true},"markforxp":false},"flags":{},"img":"systems/CoC7/assets/icons/skills.svg"} -{"_id":"CW0IWXL3plauUGy1","name":"Mechanical Repair","permission":{"default":0,"kEjKgSLquYZFCui9":3},"type":"skill","data":{"specialization":"","description":{"value":"See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty":"","pushedFaillureConsequences":"","chat":""},"base":"10","value":-1,"attributes":{},"properties":{"special":false,"rarity":false,"push":true,"combat":false},"eras":{"1920":true,"nvct":false,"drka":false,"ddts":false,"glit":false,"pulp":false,"mdrn":true},"markforxp":false},"flags":{},"img":"systems/CoC7/assets/icons/skills.svg"} -{"_id":"DkKL3tUlmx5Zp22E","name":"Ride","permission":{"default":0,"kEjKgSLquYZFCui9":3},"type":"skill","data":{"specialization":"","description":{"value":"See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty":"","pushedFaillureConsequences":"","chat":""},"base":"5","value":-1,"attributes":{},"properties":{"special":false,"rarity":false,"push":true,"combat":false},"eras":{"1920":true,"nvct":false,"drka":false,"ddts":false,"glit":false,"pulp":false,"mdrn":true},"markforxp":false},"flags":{},"img":"systems/CoC7/assets/icons/skills.svg"} -{"_id":"E0EfSSzQYmwWrbeD","name":"Stealth","permission":{"default":0,"6Y6opwuMdxc52cY3":3},"type":"skill","data":{"specialization":"","description":{"value":"See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty":"","pushedFaillureConsequences":"","chat":""},"base":"20","value":-1,"attributes":{},"properties":{"special":false,"rarity":false,"push":true,"combat":false},"eras":{},"flags":{}},"flags":{},"img":"systems/CoC7/assets/icons/skills.svg"} -{"_id":"E9rcTG3csEG4Huem","name":"Psychology","permission":{"default":0,"kEjKgSLquYZFCui9":3},"type":"skill","data":{"specialization":"","description":{"value":"See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty":"","pushedFaillureConsequences":"","chat":""},"base":"10","value":-1,"attributes":{},"properties":{"push":true,"special":false,"rarity":false,"combat":false},"eras":{"1920":true,"nvct":false,"drka":false,"ddts":false,"glit":false,"pulp":false,"mdrn":true},"markforxp":false},"flags":{},"img":"systems/CoC7/assets/icons/skills.svg"} -{"_id":"FwWQNfn382EwfDFt","name":"Climb","permission":{"default":0,"kEjKgSLquYZFCui9":3},"type":"skill","data":{"specialization":"","description":{"value":"See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty":"","pushedFaillureConsequences":"","chat":""},"base":"20","value":-1,"attributes":{},"properties":{"push":true,"special":false,"rarity":false,"combat":false},"eras":{"1920":true,"nvct":false,"drka":false,"ddts":false,"glit":false,"pulp":false,"mdrn":true},"markforxp":false},"flags":{},"img":"systems/CoC7/assets/icons/skills.svg"} -{"_id":"H4WNjYG7llDZtXwv","name":"History","permission":{"default":0,"kEjKgSLquYZFCui9":3},"type":"skill","data":{"specialization":"","description":{"value":"See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty":"","pushedFaillureConsequences":"","chat":""},"base":"5","value":-1,"attributes":{},"properties":{"special":false,"rarity":false,"push":true,"combat":false},"eras":{"1920":true,"nvct":false,"drka":false,"ddts":false,"glit":false,"pulp":false,"mdrn":true},"markforxp":false},"flags":{},"img":"systems/CoC7/assets/icons/skills.svg"} -{"_id":"HDm4U3h0GzJOWuWd","name":"Machine Gun","permission":{"default":0,"kEjKgSLquYZFCui9":3},"type":"skill","data":{"specialization":"Firearms","description":{"value":"See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty":"","pushedFaillureConsequences":"","chat":""},"base":"10","value":-1,"attributes":{},"properties":{"special":true,"rarity":false,"push":false,"combat":true,"fighting":false,"firearm":true},"eras":{"1920":true,"nvct":false,"drka":false,"ddts":false,"glit":false,"pulp":false,"mdrn":true},"markforxp":false},"flags":{},"img":"systems/CoC7/assets/icons/skills.svg"} -{"_id":"HN6sbF97tFoe30mU","name":"Biology","permission":{"default":0,"kEjKgSLquYZFCui9":3},"type":"skill","data":{"specialization":"Science","description":{"value":"See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty":"","pushedFaillureConsequences":"","chat":""},"base":"1","value":-1,"attributes":{},"properties":{"special":true,"rarity":false,"push":true,"combat":false},"eras":{"1920":true,"nvct":false,"drka":false,"ddts":false,"glit":false,"pulp":false,"mdrn":true},"markforxp":false},"flags":{},"img":"systems/CoC7/assets/icons/skills.svg"} -{"_id":"HUMkjdW611GCpLt4","name":"Axe","permission":{"default":0,"kEjKgSLquYZFCui9":3},"type":"skill","data":{"specialization":"Fighting","description":{"value":"See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty":"","pushedFaillureConsequences":"","chat":""},"base":"15","value":-1,"attributes":{},"properties":{"special":true,"rarity":false,"push":false,"combat":true,"fighting":true,"firearm":false},"eras":{"1920":true,"nvct":false,"drka":false,"ddts":false,"glit":false,"pulp":false,"mdrn":true},"markforxp":false},"flags":{},"img":"systems/CoC7/assets/icons/skills.svg"} -{"_id":"HbucA5Kk0d0uFRxy","name":"Listen","permission":{"default":0,"kEjKgSLquYZFCui9":3},"type":"skill","data":{"specialization":"","description":{"value":"See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty":"","pushedFaillureConsequences":"","chat":""},"base":"20","value":-1,"attributes":{},"properties":{"push":true,"special":false,"rarity":false,"combat":false},"eras":{"1920":true,"nvct":false,"drka":false,"ddts":false,"glit":false,"pulp":false,"mdrn":true},"markforxp":false},"flags":{},"img":"systems/CoC7/assets/icons/skills.svg"} -{"_id":"I7CWN0BbRpoIvfq6","name":"Fine Art","permission":{"default":0,"kEjKgSLquYZFCui9":3},"type":"skill","data":{"specialization":"Art/Craft","description":{"value":"See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty":"","pushedFaillureConsequences":"","chat":""},"base":"5","value":-1,"attributes":{},"properties":{"push":true,"special":true,"rarity":false,"combat":false},"eras":{"1920":true,"nvct":false,"drka":false,"ddts":false,"glit":false,"pulp":false,"mdrn":true},"markforxp":false},"flags":{},"img":"systems/CoC7/assets/icons/skills.svg"} -{"_id":"IAdLwI8enGyWT6p8","name":"Zoology","permission":{"default":0,"kEjKgSLquYZFCui9":3},"type":"skill","data":{"specialization":"Science","description":{"value":"See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty":"","pushedFaillureConsequences":"","chat":""},"base":"1","value":-1,"attributes":{},"properties":{"special":true,"rarity":false,"push":true,"combat":false},"eras":{"1920":true,"nvct":false,"drka":false,"ddts":false,"glit":false,"pulp":false,"mdrn":true},"markforxp":false},"flags":{},"img":"systems/CoC7/assets/icons/skills.svg"} -{"_id":"J64juR0msBUXvhTr","name":"Animal Handling","permission":{"default":0,"kEjKgSLquYZFCui9":3},"type":"skill","data":{"specialization":"","description":{"value":"See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty":"","pushedFaillureConsequences":"","chat":""},"base":"5","value":-1,"attributes":{},"properties":{"rarity":true,"special":false,"push":true,"combat":false},"eras":{"1920":true,"nvct":false,"drka":false,"ddts":false,"glit":false,"pulp":false,"mdrn":true},"markforxp":false},"flags":{},"img":"systems/CoC7/assets/icons/skills.svg"} -{"_id":"JFeTpQwuaTYBmLal","name":"Submachine Gun","permission":{"default":0,"kEjKgSLquYZFCui9":3},"type":"skill","data":{"specialization":"Firearms","description":{"value":"See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty":"","pushedFaillureConsequences":"","chat":""},"base":"15","value":-1,"attributes":{},"properties":{"special":true,"rarity":false,"push":false,"combat":true,"fighting":false,"firearm":true},"eras":{"1920":true,"nvct":false,"drka":false,"ddts":false,"glit":false,"pulp":false,"mdrn":true},"markforxp":false},"flags":{},"img":"systems/CoC7/assets/icons/skills.svg"} -{"_id":"JZUHBDwlowUDf18G","name":"Sword","permission":{"default":0,"kEjKgSLquYZFCui9":3},"type":"skill","data":{"specialization":"Fighting","description":{"value":"See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty":"","pushedFaillureConsequences":"","chat":""},"base":"20","value":-1,"attributes":{},"properties":{"special":true,"rarity":false,"push":false,"combat":true,"fighting":true,"firearm":false},"eras":{"1920":true,"nvct":false,"drka":false,"ddts":false,"glit":false,"pulp":false,"mdrn":true},"markforxp":false},"flags":{},"img":"systems/CoC7/assets/icons/skills.svg"} -{"_id":"K758AJaZfwHl94c2","name":"Garrote","permission":{"default":0,"kEjKgSLquYZFCui9":3},"type":"skill","data":{"specialization":"Fighting","description":{"value":"See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty":"","pushedFaillureConsequences":"","chat":""},"base":"15","value":-1,"attributes":{},"properties":{"combat":true,"special":true,"rarity":false,"push":false,"fighting":true,"firearm":false},"eras":{"1920":true,"nvct":false,"drka":false,"ddts":false,"glit":false,"pulp":false,"mdrn":true},"markforxp":false},"flags":{},"img":"systems/CoC7/assets/icons/skills.svg"} -{"_id":"KenfdXHN02NKca6S","name":"Astronomy","permission":{"default":0,"kEjKgSLquYZFCui9":3},"type":"skill","data":{"specialization":"Science","description":{"value":"See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty":"","pushedFaillureConsequences":"","chat":""},"base":"1","value":-1,"attributes":{},"properties":{"special":true,"rarity":false,"push":true,"combat":false},"eras":{"1920":true,"nvct":false,"drka":false,"ddts":false,"glit":false,"pulp":false,"mdrn":true},"markforxp":false},"flags":{},"img":"systems/CoC7/assets/icons/skills.svg"} -{"_id":"MDBvDDlP5IzOOnOC","name":"Dodge","permission":{"default":0,"kEjKgSLquYZFCui9":3},"type":"skill","data":{"specialization":"","description":{"value":"See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty":"","pushedFaillureConsequences":"","chat":""},"base":"1/2*@DEX","value":-1,"attributes":{},"properties":{"special":false,"rarity":false,"push":false,"combat":true},"eras":{"1920":true,"nvct":false,"drka":false,"ddts":false,"glit":false,"pulp":false,"mdrn":true},"markforxp":false},"flags":{},"img":"systems/CoC7/assets/icons/skills.svg"} -{"_id":"MeleogcP07f9rJ1O","name":"Throw","permission":{"default":0,"kEjKgSLquYZFCui9":3},"type":"skill","data":{"specialization":"Fighting","description":{"value":"See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty":"","pushedFaillureConsequences":"","chat":""},"base":"20","value":-1,"attributes":{},"properties":{"special":true,"rarity":false,"push":true,"combat":true,"fighting":true,"firearm":false},"eras":{"1920":true,"nvct":false,"drka":false,"ddts":false,"glit":false,"pulp":false,"mdrn":true},"markforxp":false},"flags":{},"img":"systems/CoC7/assets/icons/skills.svg"} -{"name":"Language (Other)","permission":{"default":0,"6Y6opwuMdxc52cY3":3},"type":"skill","data":{"specialization":"Language","description":{"value":"See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty":"","pushedFaillureConsequences":"","chat":""},"base":"1","adjustments":{"personal":null,"occupation":null,"archetype":null,"experience":null},"value":-1,"attributes":{},"properties":{"push":true,"special":true,"rarity":false,"combat":false},"eras":{"1920":true,"nvct":false,"drka":false,"ddts":false,"glit":false,"pulp":false,"mdrn":true},"flags":{}},"flags":{},"img":"systems/CoC7/assets/icons/skills.svg","_id":"NFT5i3X7647Fct8Y"} -{"_id":"ObgfYtNCMv4MlgbO","name":"Archaeology","permission":{"default":0,"kEjKgSLquYZFCui9":3},"type":"skill","data":{"specialization":"","description":{"value":"See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty":"","pushedFaillureConsequences":"","chat":""},"base":"1","value":-1,"attributes":{},"properties":{"special":false,"rarity":false,"push":true,"combat":false},"eras":{"1920":true,"nvct":false,"drka":false,"ddts":false,"glit":false,"pulp":false,"mdrn":true},"markforxp":false},"flags":{},"img":"systems/CoC7/assets/icons/skills.svg"} -{"_id":"OhbBGAkOrr1409Oq","name":"Jump","permission":{"default":0,"kEjKgSLquYZFCui9":3},"type":"skill","data":{"specialization":"","description":{"value":"See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty":"","pushedFaillureConsequences":"","chat":""},"base":"20","value":-1,"attributes":{},"properties":{"push":true,"special":false,"rarity":false,"combat":false},"eras":{"1920":true,"nvct":false,"drka":false,"ddts":false,"glit":false,"pulp":false,"mdrn":true},"markforxp":false},"flags":{},"img":"systems/CoC7/assets/icons/skills.svg"} -{"_id":"PZOkZrOJJwK7uO2s","name":"Read Lips","permission":{"default":0,"kEjKgSLquYZFCui9":3},"type":"skill","data":{"specialization":"","description":{"value":"See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty":"","pushedFaillureConsequences":"","chat":""},"base":"1","value":-1,"attributes":{},"properties":{"push":true,"special":false,"rarity":true,"combat":false},"eras":{"1920":true,"nvct":false,"drka":false,"ddts":false,"glit":false,"pulp":false,"mdrn":true},"markforxp":false},"flags":{},"img":"systems/CoC7/assets/icons/skills.svg"} -{"_id":"Q8BDb3YnQ3i3xjd4","name":"Forensics","permission":{"default":0,"kEjKgSLquYZFCui9":3},"type":"skill","data":{"specialization":"Science","description":{"value":"See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty":"","pushedFaillureConsequences":"","chat":""},"base":"1","value":-1,"attributes":{},"properties":{"special":true,"rarity":false,"push":true,"combat":false},"eras":{"1920":true,"nvct":false,"drka":false,"ddts":false,"glit":false,"pulp":false,"mdrn":true},"markforxp":false},"flags":{},"img":"systems/CoC7/assets/icons/skills.svg"} -{"_id":"RIQSmuWCMPYYjUtg","name":"Sleight of Hand","permission":{"default":0,"kEjKgSLquYZFCui9":3},"type":"skill","data":{"specialization":"","description":{"value":"See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty":"","pushedFaillureConsequences":"","chat":""},"base":"10","value":-1,"attributes":{},"properties":{"push":true,"special":false,"rarity":false,"combat":false},"eras":{"1920":true,"nvct":false,"drka":false,"ddts":false,"glit":false,"pulp":false,"mdrn":true},"markforxp":false},"flags":{},"img":"systems/CoC7/assets/icons/skills.svg"} -{"_id":"Rcl3EJFkPbYouMbS","name":"Acting","permission":{"default":0,"kEjKgSLquYZFCui9":3},"type":"skill","data":{"specialization":"Art/Craft","description":{"value":"See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty":"","pushedFaillureConsequences":"","chat":""},"base":"5","value":-1,"attributes":{},"properties":{"special":true,"rarity":false,"push":true,"combat":false},"eras":{"1920":true,"nvct":false,"drka":false,"ddts":false,"glit":false,"pulp":false,"mdrn":true},"markforxp":false},"flags":{},"img":"systems/CoC7/assets/icons/skills.svg"} -{"_id":"SPY7wJwnkG4anTwM","name":"Persuade","permission":{"default":0,"kEjKgSLquYZFCui9":3},"type":"skill","data":{"specialization":"","description":{"value":"See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty":"","pushedFaillureConsequences":"","chat":""},"base":"10","value":-1,"attributes":{},"properties":{"special":false,"rarity":false,"push":true,"combat":false},"eras":{"1920":true,"nvct":false,"drka":false,"ddts":false,"glit":false,"pulp":false,"mdrn":true},"markforxp":false},"flags":{},"img":"systems/CoC7/assets/icons/skills.svg"} -{"_id":"UD69qjXe0ZqPdnDZ","name":"Rifle/Shotgun","permission":{"default":0,"kEjKgSLquYZFCui9":3},"type":"skill","data":{"specialization":"Firearms","description":{"value":"See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty":"","pushedFaillureConsequences":"","chat":""},"base":"25","value":-1,"attributes":{},"properties":{"special":true,"rarity":false,"push":false,"combat":true,"fighting":false,"firearm":true},"eras":{"1920":true,"nvct":false,"drka":false,"ddts":false,"glit":false,"pulp":false,"mdrn":true},"markforxp":false},"flags":{},"img":"systems/CoC7/assets/icons/skills.svg"} -{"_id":"UPSL4EYXndGwNPhP","name":"Library Use","permission":{"default":0,"kEjKgSLquYZFCui9":3},"type":"skill","data":{"specialization":"","description":{"value":"See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty":"","pushedFaillureConsequences":"","chat":""},"base":"20","value":-1,"attributes":{},"properties":{"special":false,"rarity":false,"push":true,"combat":false},"eras":{"1920":true,"nvct":false,"drka":false,"ddts":false,"glit":false,"pulp":false,"mdrn":true},"markforxp":false},"flags":{},"img":"systems/CoC7/assets/icons/skills.svg"} -{"_id":"UZoCHFgYoXCbdoY6","name":"Pilot (Any)","permission":{"default":0,"kEjKgSLquYZFCui9":3},"type":"skill","data":{"specialization":"Pilot","description":{"value":"See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty":"","pushedFaillureConsequences":"","chat":""},"base":"1","value":-1,"attributes":{},"properties":{"push":true,"special":true,"rarity":false,"combat":false},"eras":{"1920":true,"nvct":false,"drka":false,"ddts":false,"glit":false,"pulp":false,"mdrn":true},"markforxp":false},"flags":{},"img":"systems/CoC7/assets/icons/skills.svg"} -{"_id":"WTi5Q8fFYGqFDDam","name":"Anthropology","permission":{"default":0,"kEjKgSLquYZFCui9":3},"type":"skill","data":{"specialization":"","description":{"value":"See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty":"","pushedFaillureConsequences":"","chat":""},"base":"1","value":-1,"attributes":{},"properties":{"push":true,"special":false,"rarity":false,"combat":false},"eras":{"1920":true,"nvct":false,"drka":false,"ddts":false,"glit":false,"pulp":false,"mdrn":true},"markforxp":false},"flags":{},"img":"systems/CoC7/assets/icons/skills.svg"} -{"_id":"Xy7GNIbB3B0SqgtM","name":"Track","permission":{"default":0,"kEjKgSLquYZFCui9":3},"type":"skill","data":{"specialization":"","description":{"value":"See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty":"","pushedFaillureConsequences":"","chat":""},"base":"10","value":-1,"attributes":{},"properties":{"special":false,"rarity":false,"push":true,"combat":false},"eras":{"1920":true,"nvct":false,"drka":false,"ddts":false,"glit":false,"pulp":false,"mdrn":true},"markforxp":false},"flags":{},"img":"systems/CoC7/assets/icons/skills.svg"} -{"_id":"YotlGwVZUtNvZJg1","name":"Natural World","permission":{"default":0,"kEjKgSLquYZFCui9":3},"type":"skill","data":{"specialization":"","description":{"value":"See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty":"","pushedFaillureConsequences":"","chat":""},"base":"10","value":-1,"attributes":{},"properties":{"special":false,"rarity":false,"push":true,"combat":false},"eras":{"1920":true,"nvct":false,"drka":false,"ddts":false,"glit":false,"pulp":false,"mdrn":true},"markforxp":false},"flags":{},"img":"systems/CoC7/assets/icons/skills.svg"} -{"_id":"Yu2CFYCkaNw3VBsH","name":"Photography","permission":{"default":0,"kEjKgSLquYZFCui9":3},"type":"skill","data":{"specialization":"Art/Craft","description":{"value":"See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty":"","pushedFaillureConsequences":"","chat":""},"base":"5","value":-1,"attributes":{},"properties":{"special":true,"rarity":false,"push":true,"combat":false},"eras":{"1920":true,"nvct":false,"drka":false,"ddts":false,"glit":false,"pulp":false,"mdrn":true},"markforxp":false},"flags":{},"img":"systems/CoC7/assets/icons/skills.svg"} -{"_id":"Z7C3nynZIXiFXmrF","name":"Accounting","permission":{"default":0,"kEjKgSLquYZFCui9":3},"type":"skill","data":{"specialization":"","description":{"value":"See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty":"","pushedFaillureConsequences":"","chat":""},"base":"5","value":-1,"attributes":{},"properties":{"special":false,"rarity":false,"push":true,"combat":false},"eras":{"1920":true,"nvct":false,"drka":false,"ddts":false,"glit":false,"pulp":false,"mdrn":true},"markforxp":false},"flags":{},"img":"systems/CoC7/assets/icons/skills.svg"} -{"_id":"ZDZMcoLOxhvcqvMT","name":"Meteorology","permission":{"default":0,"kEjKgSLquYZFCui9":3},"type":"skill","data":{"specialization":"Science","description":{"value":"See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty":"","pushedFaillureConsequences":"","chat":""},"base":"1","value":-1,"attributes":{},"properties":{"push":true,"special":true,"rarity":false,"combat":false},"eras":{"1920":true,"nvct":false,"drka":false,"ddts":false,"glit":false,"pulp":false,"mdrn":true},"markforxp":false},"flags":{},"img":"systems/CoC7/assets/icons/skills.svg"} -{"_id":"ZZXhgUnol1QMCUJB","name":"Law","permission":{"default":0,"kEjKgSLquYZFCui9":3},"type":"skill","data":{"specialization":"","description":{"value":"See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty":"","pushedFaillureConsequences":"","chat":""},"base":"5","value":-1,"attributes":{},"properties":{"special":false,"rarity":false,"push":true,"combat":false},"eras":{"1920":true,"nvct":false,"drka":false,"ddts":false,"glit":false,"pulp":false,"mdrn":true},"markforxp":false},"flags":{},"img":"systems/CoC7/assets/icons/skills.svg"} -{"_id":"ZtxEbrCNxPbTqACu","name":"Language (Own)","permission":{"default":0,"kEjKgSLquYZFCui9":3},"type":"skill","data":{"specialization":"","description":{"value":"See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty":"","pushedFaillureConsequences":"","chat":""},"base":"@EDU","value":-1,"attributes":{},"properties":{"push":true,"special":false,"rarity":false,"combat":false},"eras":{"1920":true,"nvct":false,"drka":false,"ddts":false,"glit":false,"pulp":false,"mdrn":true},"markforxp":false},"flags":{},"img":"systems/CoC7/assets/icons/skills.svg"} -{"_id":"f8ExwWlSUGhNmnVe","name":"Operate Heavy Machinery","permission":{"default":0,"kEjKgSLquYZFCui9":3},"type":"skill","data":{"specialization":"","description":{"value":"See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty":"","pushedFaillureConsequences":"","chat":""},"base":"1","value":-1,"attributes":{},"properties":{"push":true,"special":false,"rarity":false,"combat":false},"eras":{"1920":true,"nvct":false,"drka":false,"ddts":false,"glit":false,"pulp":false,"mdrn":true},"markforxp":false},"flags":{},"img":"systems/CoC7/assets/icons/skills.svg"} -{"_id":"g9Q95Ei79qs3XZAz","name":"Science (Any)","permission":{"default":0,"6Y6opwuMdxc52cY3":3},"type":"skill","data":{"specialization":"Science","description":{"value":"See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty":"","pushedFaillureConsequences":"","chat":""},"base":"1","adjustments":{"personal":null,"occupation":null,"archetype":null,"experience":null},"value":-1,"attributes":{},"properties":{"special":true,"push":true},"eras":{},"flags":{}},"flags":{},"img":"systems/CoC7/assets/icons/skills.svg"} -{"_id":"gX0oxNXQBcZq24LG","name":"Botany","permission":{"default":0,"kEjKgSLquYZFCui9":3},"type":"skill","data":{"specialization":"Science","description":{"value":"See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty":"","pushedFaillureConsequences":"","chat":""},"base":"1","value":-1,"attributes":{},"properties":{"special":true,"rarity":false,"push":true,"combat":false},"eras":{"1920":true,"nvct":false,"drka":false,"ddts":false,"glit":false,"pulp":false,"mdrn":true},"markforxp":false},"flags":{},"img":"systems/CoC7/assets/icons/skills.svg"} -{"_id":"gihGN2AcqDpGPOe2","name":"Chemistry","permission":{"default":0,"kEjKgSLquYZFCui9":3},"type":"skill","data":{"specialization":"Science","description":{"value":"See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty":"","pushedFaillureConsequences":"","chat":""},"base":"1","value":-1,"attributes":{},"properties":{"special":true,"rarity":false,"push":true,"combat":false},"eras":{"1920":true,"nvct":false,"drka":false,"ddts":false,"glit":false,"pulp":false,"mdrn":true},"markforxp":false},"flags":{},"img":"systems/CoC7/assets/icons/skills.svg"} -{"_id":"hR4F1soQKk56BsE6","name":"Whip","permission":{"default":0,"kEjKgSLquYZFCui9":3},"type":"skill","data":{"specialization":"Fighting","description":{"value":"See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty":"","pushedFaillureConsequences":"","chat":""},"base":"5","value":-1,"attributes":{},"properties":{"special":true,"rarity":false,"push":false,"combat":true,"fighting":true,"firearm":false},"eras":{"1920":true,"nvct":false,"drka":false,"ddts":false,"glit":false,"pulp":false,"mdrn":true},"markforxp":false},"flags":{},"img":"systems/CoC7/assets/icons/skills.svg"} -{"_id":"iMNZslICSfOBrhnv","name":"Occult","permission":{"default":0,"kEjKgSLquYZFCui9":3},"type":"skill","data":{"specialization":"","description":{"value":"See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty":"","pushedFaillureConsequences":"","chat":""},"base":"5","value":-1,"attributes":{},"properties":{"special":false,"rarity":false,"push":true,"combat":false},"eras":{"1920":true,"nvct":false,"drka":false,"ddts":false,"glit":false,"pulp":false,"mdrn":true},"markforxp":false},"flags":{},"img":"systems/CoC7/assets/icons/skills.svg"} -{"_id":"iV3SdrNKsGB5BSli","name":"Art/Craft (Any)","permission":{"default":0,"6Y6opwuMdxc52cY3":3},"type":"skill","data":{"specialization":"Art/Craft","description":{"value":"See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty":"","pushedFaillureConsequences":"","chat":""},"base":"5","adjustments":{"personal":null,"occupation":null,"archetype":null,"experience":null},"value":-1,"attributes":{},"properties":{"push":true,"special":true,"rarity":false,"combat":false},"eras":{"1920":true,"nvct":false,"drka":false,"ddts":false,"glit":false,"pulp":false,"mdrn":true},"flags":{}},"flags":{},"img":"systems/CoC7/assets/icons/skills.svg"} -{"_id":"iWEzROSFc6QA2Qd7","name":"Mathematics","permission":{"default":0,"kEjKgSLquYZFCui9":3},"type":"skill","data":{"specialization":"Science","description":{"value":"See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty":"","pushedFaillureConsequences":"","chat":""},"base":"1","value":-1,"attributes":{},"properties":{"special":true,"rarity":false,"push":true,"combat":false},"eras":{"1920":true,"nvct":false,"drka":false,"ddts":false,"glit":false,"pulp":false,"mdrn":true},"markforxp":false},"flags":{},"img":"systems/CoC7/assets/icons/skills.svg"} -{"_id":"iorK6UqzpjU4WR38","name":"Demolitions","permission":{"default":0,"kEjKgSLquYZFCui9":3},"type":"skill","data":{"specialization":"","description":{"value":"See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty":"","pushedFaillureConsequences":"","chat":""},"base":"0","value":-1,"attributes":{},"properties":{"rarity":true,"special":false,"push":true,"combat":false},"eras":{"1920":true,"nvct":false,"drka":false,"ddts":false,"glit":false,"pulp":false,"mdrn":true},"markforxp":false},"flags":{},"img":"systems/CoC7/assets/icons/skills.svg"} -{"_id":"j4vj4HUviZd6TAKz","name":"Appraise","permission":{"default":0,"kEjKgSLquYZFCui9":3},"type":"skill","data":{"specialization":"","description":{"value":"See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty":"","pushedFaillureConsequences":"","chat":""},"base":"5","value":-1,"attributes":{},"properties":{"push":true,"special":false,"rarity":false,"combat":false},"eras":{"1920":true,"nvct":false,"drka":false,"ddts":false,"glit":false,"pulp":false,"mdrn":true},"markforxp":false},"flags":{},"img":"systems/CoC7/assets/icons/skills.svg"} -{"_id":"jbaeBCTsMiw0ut8O","name":"Forgery","permission":{"default":0,"kEjKgSLquYZFCui9":3},"type":"skill","data":{"specialization":"Art/Craft","description":{"value":"See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty":"","pushedFaillureConsequences":"","chat":""},"base":"5","value":-1,"attributes":{},"properties":{"special":true,"rarity":false,"push":true,"combat":false},"eras":{"1920":true,"nvct":false,"drka":false,"ddts":false,"glit":false,"pulp":false,"mdrn":true},"markforxp":false},"flags":{},"img":"systems/CoC7/assets/icons/skills.svg"} -{"_id":"jtcQKVVfZ3TGCdAD","name":"Flamethrower","permission":{"default":0,"kEjKgSLquYZFCui9":3},"type":"skill","data":{"specialization":"Firearms","description":{"value":"See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty":"","pushedFaillureConsequences":"","chat":""},"base":"10","value":-1,"attributes":{},"properties":{"combat":true,"special":true,"rarity":false,"push":false,"fighting":false,"firearm":true},"eras":{"1920":true,"nvct":false,"drka":false,"ddts":false,"glit":false,"pulp":false,"mdrn":true},"markforxp":false},"flags":{},"img":"systems/CoC7/assets/icons/skills.svg"} -{"_id":"kKafbgrncOGqYwjH","name":"Disguise","permission":{"default":0,"kEjKgSLquYZFCui9":3},"type":"skill","data":{"specialization":"","description":{"value":"See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty":"","pushedFaillureConsequences":"","chat":""},"base":"5","value":-1,"attributes":{},"properties":{"special":false,"rarity":false,"push":true,"combat":false},"eras":{"1920":true,"nvct":false,"drka":false,"ddts":false,"glit":false,"pulp":false,"mdrn":true},"markforxp":false},"flags":{},"img":"systems/CoC7/assets/icons/skills.svg"} -{"_id":"keyAD0YXeAafdvmi","name":"Brawl","permission":{"default":0,"kEjKgSLquYZFCui9":3},"type":"skill","data":{"specialization":"Fighting","description":{"value":"See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty":"","pushedFaillureConsequences":"","chat":""},"base":"25","value":-1,"attributes":{},"properties":{"special":true,"rarity":false,"push":false,"combat":true,"fighting":true,"firearm":false},"eras":{"1920":true,"nvct":false,"drka":false,"ddts":false,"glit":false,"pulp":false,"mdrn":true},"markforxp":false},"flags":{},"img":"systems/CoC7/assets/icons/skills.svg"} -{"_id":"m4C6RDUbfHZwVucS","name":"Survival (Any)","permission":{"default":0,"kEjKgSLquYZFCui9":3},"type":"skill","data":{"specialization":"Survival","description":{"value":"See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty":"","pushedFaillureConsequences":"","chat":""},"base":"10","value":-1,"attributes":{},"properties":{"special":true,"rarity":false,"push":true,"combat":false},"eras":{"1920":true,"nvct":false,"drka":false,"ddts":false,"glit":false,"pulp":false,"mdrn":true},"markforxp":false},"flags":{},"img":"systems/CoC7/assets/icons/skills.svg"} -{"_id":"otgWxSXPtfSKtzd9","name":"Charm","permission":{"default":0,"kEjKgSLquYZFCui9":3},"type":"skill","data":{"specialization":"","description":{"value":"See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty":"","pushedFaillureConsequences":"","chat":""},"base":"15","value":-1,"attributes":{},"properties":{"special":false,"rarity":false,"push":true,"combat":false},"eras":{"1920":true,"nvct":false,"drka":false,"ddts":false,"glit":false,"pulp":false,"mdrn":true},"markforxp":false},"flags":{},"img":"systems/CoC7/assets/icons/skills.svg"} -{"_id":"rfO2kgQTYP2X2lL3","name":"Intimidate","permission":{"default":0,"kEjKgSLquYZFCui9":3},"type":"skill","data":{"specialization":"","description":{"value":"See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty":"","pushedFaillureConsequences":"","chat":""},"base":"15","value":-1,"attributes":{},"properties":{"special":false,"rarity":false,"push":true,"combat":false},"eras":{"1920":true,"nvct":false,"drka":false,"ddts":false,"glit":false,"pulp":false,"mdrn":true},"markforxp":false},"flags":{},"img":"systems/CoC7/assets/icons/skills.svg"} -{"_id":"rzihAJYn5Mf9Bf6N","name":"Spear","permission":{"default":0,"kEjKgSLquYZFCui9":3},"type":"skill","data":{"specialization":"Fighting","description":{"value":"See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty":"","pushedFaillureConsequences":"","chat":""},"base":"20","value":-1,"attributes":{},"properties":{"special":true,"rarity":false,"push":false,"combat":true,"fighting":true,"firearm":false},"eras":{"1920":true,"nvct":false,"drka":false,"ddts":false,"glit":false,"pulp":false,"mdrn":true},"markforxp":false},"flags":{},"img":"systems/CoC7/assets/icons/skills.svg"} -{"_id":"s7Yhk0flkG1B1lWY","name":"Locksmith","permission":{"default":0,"kEjKgSLquYZFCui9":3},"type":"skill","data":{"specialization":"","description":{"value":"See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty":"","pushedFaillureConsequences":"","chat":""},"base":"1","value":-1,"attributes":{},"properties":{"push":true,"special":false,"rarity":false,"combat":false},"eras":{"1920":true,"nvct":false,"drka":false,"ddts":false,"glit":false,"pulp":false,"mdrn":true},"markforxp":false},"flags":{},"img":"systems/CoC7/assets/icons/skills.svg"} -{"_id":"sJjQGgjj6gohyaMd","name":"Psychoanalysis","permission":{"default":0,"kEjKgSLquYZFCui9":3},"type":"skill","data":{"specialization":"","description":{"value":"See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty":"","pushedFaillureConsequences":"","chat":""},"base":"1","value":-1,"attributes":{},"properties":{"push":true,"special":false,"rarity":false,"combat":false},"eras":{"1920":true,"nvct":false,"drka":false,"ddts":false,"glit":false,"pulp":false,"mdrn":true},"markforxp":false},"flags":{},"img":"systems/CoC7/assets/icons/skills.svg"} -{"_id":"tA5sEnhUyrzdCEu4","name":"Drive Auto","permission":{"default":0,"kEjKgSLquYZFCui9":3},"type":"skill","data":{"specialization":"","description":{"value":"See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty":"","pushedFaillureConsequences":"","chat":""},"base":"20","value":-1,"attributes":{},"properties":{"special":false,"rarity":false,"push":true,"combat":false},"eras":{"1920":true,"nvct":false,"drka":false,"ddts":false,"glit":false,"pulp":false,"mdrn":true},"markforxp":false},"flags":{},"img":"systems/CoC7/assets/icons/skills.svg"} -{"_id":"tRg3Zh07008k7xpb","name":"Artillery","permission":{"default":0,"kEjKgSLquYZFCui9":3},"type":"skill","data":{"specialization":"Firearms","description":{"value":"See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty":"","pushedFaillureConsequences":"","chat":""},"base":"1","value":-1,"attributes":{},"properties":{"rarity":true,"special":true,"push":false,"combat":true,"fighting":false,"firearm":true},"eras":{"1920":true,"nvct":false,"drka":false,"ddts":false,"glit":false,"pulp":false,"mdrn":true},"markforxp":false},"flags":{},"img":"systems/CoC7/assets/icons/skills.svg"} -{"name":"Language (Any)","permission":{"default":0,"6Y6opwuMdxc52cY3":3},"type":"skill","data":{"specialization":"Language","description":{"value":"","opposingDifficulty":"","pushedFaillureConsequences":"","chat":""},"base":"1","adjustments":{"personal":null,"occupation":null,"archetype":null,"experience":null},"value":-1,"attributes":{},"properties":{"special":true,"push":true},"eras":{},"flags":{}},"flags":{},"img":"systems/CoC7/assets/icons/skills.svg","_id":"tZ75GTRGUNa7Ofj4"} -{"_id":"vdTRwJvIbXasRUxC","name":"Spot Hidden","permission":{"default":0,"kEjKgSLquYZFCui9":3},"type":"skill","data":{"specialization":"","description":{"value":"See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty":"","pushedFaillureConsequences":"","chat":""},"base":"25","value":-1,"attributes":{},"properties":{"special":false,"rarity":false,"push":true,"combat":false},"eras":{"1920":true,"nvct":false,"drka":false,"ddts":false,"glit":false,"pulp":false,"mdrn":true},"markforxp":false},"flags":{},"img":"systems/CoC7/assets/icons/skills.svg"} -{"_id":"yo3S2tR0SkfEisbe","name":"Cthulhu Mythos","permission":{"default":0,"kEjKgSLquYZFCui9":3},"type":"skill","data":{"specialization":"","description":{"value":"See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty":"","pushedFaillureConsequences":"","chat":""},"base":"0","value":-1,"attributes":{},"properties":{"special":false,"rarity":false,"push":false,"combat":false,"noxpgain":true,"noadjustments":true},"eras":{"1920":true,"nvct":false,"drka":false,"ddts":false,"glit":false,"pulp":false,"mdrn":true},"markforxp":false},"flags":{},"img":"systems/CoC7/assets/icons/skills.svg"} -{"_id":"zM1rVfUxTAX7hRys","name":"Cryptography","permission":{"default":0,"kEjKgSLquYZFCui9":3},"type":"skill","data":{"specialization":"Science","description":{"value":"See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty":"","pushedFaillureConsequences":"","chat":""},"base":"1","value":-1,"attributes":{},"properties":{"special":true,"rarity":false,"push":true,"combat":false},"eras":{"1920":true,"nvct":false,"drka":false,"ddts":false,"glit":false,"pulp":false,"mdrn":true},"markforxp":false},"flags":{},"img":"systems/CoC7/assets/icons/skills.svg"} -{"_id":"ziCzgTCp2g2sQzfD","name":"Medicine","permission":{"default":0,"kEjKgSLquYZFCui9":3},"type":"skill","data":{"specialization":"","description":{"value":"See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty":"","pushedFaillureConsequences":"","chat":""},"base":"1","value":-1,"attributes":{},"properties":{"special":false,"rarity":false,"push":true,"combat":false},"eras":{"1920":true,"nvct":false,"drka":false,"ddts":false,"glit":false,"pulp":false,"mdrn":true},"markforxp":false},"flags":{},"img":"systems/CoC7/assets/icons/skills.svg"} -{"_id":"zzaYcf3NQmgmOwut","name":"Chainsaw","permission":{"default":0,"kEjKgSLquYZFCui9":3},"type":"skill","data":{"specialization":"Fighting","description":{"value":"See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty":"","pushedFaillureConsequences":"","chat":""},"base":"10","value":-1,"attributes":{},"properties":{"special":true,"rarity":false,"push":false,"combat":true,"fighting":true,"firearm":false},"eras":{"1920":true,"nvct":false,"drka":false,"ddts":false,"glit":false,"pulp":false,"mdrn":true},"markforxp":false},"flags":{},"img":"systems/CoC7/assets/icons/skills.svg"} +{"_id":"0qCTuRFUCACSEsWj","name":"Mechanical Repair","type":"skill","img":"systems/CoC7/assets/icons/skills/mechanical_repair.svg","data":{"skillName":"Mechanical Repair","specialization":"","description":{"value":"See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty":"","pushedFaillureConsequences":"","chat":"","keeper":""},"base":"10","adjustments":{"personal":null,"occupation":null,"archetype":null,"experience":null},"value":-1,"attributes":{},"properties":{"push":true},"eras":{"1920":true,"nvct":false,"drka":false,"ddts":true,"glit":true,"pulp":true,"mdrn":true},"flags":{}},"effects":[],"folder":null,"sort":0,"permission":{"default":0},"flags":{}} +{"_id":"0rlp7EuZDzQGjIYf","name":"Science (Zoology)","type":"skill","img":"systems/CoC7/assets/icons/skills/science_zoology.svg","data":{"skillName":"Zoology","specialization":"Science","description":{"value":"See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty":"","pushedFaillureConsequences":"","chat":"","keeper":""},"base":"1","adjustments":{"personal":null,"occupation":null,"archetype":null,"experience":null},"value":-1,"attributes":{},"properties":{"special":true,"push":true},"eras":{"1920":true,"nvct":false,"drka":false,"ddts":false,"glit":false,"pulp":false,"mdrn":true},"flags":{}},"effects":[],"folder":null,"sort":0,"permission":{"default":0},"flags":{}} +{"_id":"1c3fdvpQtvZf5YXK","name":"Navigate","type":"skill","img":"systems/CoC7/assets/icons/skills/navigate.svg","data":{"skillName":"Navigate","specialization":"","description":{"value":"See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty":"","pushedFaillureConsequences":"","chat":"","keeper":""},"base":"10","adjustments":{"personal":null,"occupation":null,"archetype":null,"experience":null},"value":-1,"attributes":{},"properties":{"push":true},"eras":{"1920":true,"nvct":true,"drka":true,"ddts":true,"glit":true,"pulp":true,"mdrn":true},"flags":{}},"effects":[],"folder":null,"sort":0,"permission":{"default":0},"flags":{}} +{"_id":"1zSIeY0eat2AxQok","name":"Swim","type":"skill","img":"systems/CoC7/assets/icons/skills/swim.svg","data":{"skillName":"Swim","specialization":"","description":{"value":"See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty":"","pushedFaillureConsequences":"","chat":"","keeper":""},"base":"20","adjustments":{"personal":null,"occupation":null,"archetype":null,"experience":null},"value":-1,"attributes":{},"properties":{"push":true},"eras":{"1920":true,"nvct":true,"drka":true,"ddts":true,"glit":true,"pulp":true,"mdrn":true},"flags":{}},"effects":[],"folder":null,"sort":0,"permission":{"default":0},"flags":{}} +{"_id":"23vdyJDDfjyneH3I","name":"Firearms (Heavy Weapons)","type":"skill","img":"systems/CoC7/assets/icons/skills/firearms_heavy_weapons.svg","data":{"skillName":"Heavy Weapons","specialization":"Firearms","description":{"value":"See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty":"","pushedFaillureConsequences":"","chat":"","keeper":""},"base":"10","adjustments":{"personal":null,"occupation":null,"archetype":null,"experience":null},"value":-1,"attributes":{},"properties":{"fighting":false,"firearm":true,"combat":true,"special":true},"eras":{"1920":true,"nvct":false,"drka":false,"ddts":false,"glit":false,"pulp":false,"mdrn":true},"flags":{}},"effects":[],"folder":null,"sort":0,"permission":{"default":0},"flags":{}} +{"_id":"35dvJDsrY8JipXRU","name":"Firearms (Flamethrower)","type":"skill","img":"systems/CoC7/assets/icons/skills/firearms_flamethrower.svg","data":{"skillName":"Flamethrower","specialization":"Firearms","description":{"value":"See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty":"","pushedFaillureConsequences":"","chat":"","keeper":""},"base":"10","adjustments":{"personal":null,"occupation":null,"archetype":null,"experience":null},"value":-1,"attributes":{},"properties":{"fighting":false,"firearm":true,"combat":true,"special":true},"eras":{"1920":true,"nvct":false,"drka":false,"ddts":false,"glit":false,"pulp":false,"mdrn":true},"flags":{}},"effects":[],"folder":null,"sort":0,"permission":{"default":0},"flags":{}} +{"_id":"4lN6yD6zwbjX6BFp","name":"Diving","type":"skill","img":"systems/CoC7/assets/icons/skills/diving_helmet.svg","data":{"skillName":"Diving","specialization":"","description":{"value":"See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty":"","pushedFaillureConsequences":"","chat":"","keeper":""},"base":"1","adjustments":{"personal":null,"occupation":null,"archetype":null,"experience":null},"value":-1,"attributes":{},"properties":{"push":true,"rarity":true},"eras":{"1920":true,"nvct":false,"drka":false,"ddts":false,"glit":false,"pulp":true,"mdrn":true},"flags":{}},"effects":[],"folder":null,"sort":0,"permission":{"default":0},"flags":{}} +{"_id":"64hnBZNC8FM7oTkg","name":"Law","type":"skill","img":"systems/CoC7/assets/icons/skills/law.svg","data":{"skillName":"Law","specialization":"","description":{"value":"See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty":"","pushedFaillureConsequences":"","chat":"","keeper":""},"base":"5","adjustments":{"personal":null,"occupation":null,"archetype":null,"experience":null},"value":-1,"attributes":{},"properties":{"push":true},"eras":{"1920":true,"nvct":false,"drka":false,"ddts":true,"glit":true,"pulp":true,"mdrn":true},"flags":{}},"effects":[],"folder":null,"sort":0,"permission":{"default":0},"flags":{}} +{"_id":"6pSfZVS68jSHxa5T","name":"Occult","type":"skill","img":"systems/CoC7/assets/icons/skills/occult.svg","data":{"skillName":"Occult","specialization":"","description":{"value":"See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty":"","pushedFaillureConsequences":"","chat":"","keeper":""},"base":"5","adjustments":{"personal":null,"occupation":null,"archetype":null,"experience":null},"value":-1,"attributes":{},"properties":{"push":true},"eras":{"1920":true,"nvct":true,"drka":true,"ddts":true,"glit":true,"pulp":true,"mdrn":true},"flags":{}},"effects":[],"folder":null,"sort":0,"permission":{"default":0},"flags":{}} +{"_id":"8twBT7nbyh5dEp3J","name":"Science (Chemistry)","type":"skill","img":"systems/CoC7/assets/icons/skills/science_chemistry.svg","data":{"skillName":"Chemistry","specialization":"Science","description":{"value":"See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty":"","pushedFaillureConsequences":"","chat":"","keeper":""},"base":"1","adjustments":{"personal":null,"occupation":null,"archetype":null,"experience":null},"value":-1,"attributes":{},"properties":{"special":true,"push":true},"eras":{"1920":true,"nvct":false,"drka":false,"ddts":false,"glit":false,"pulp":false,"mdrn":true},"flags":{}},"effects":[],"folder":null,"sort":0,"permission":{"default":0},"flags":{}} +{"_id":"9zy7PLmTLXknFce4","name":"Science (Engineering)","type":"skill","img":"systems/CoC7/assets/icons/skills/spanner.svg","data":{"skillName":"Engineering","specialization":"Science","description":{"value":"See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty":"","pushedFaillureConsequences":"","chat":"","keeper":""},"base":"1","adjustments":{"personal":null,"occupation":null,"archetype":null,"experience":null},"value":-1,"attributes":{},"properties":{"special":true,"push":true},"eras":{},"flags":{}},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"dlPHDbfKH31liGgB":3},"flags":{"core":{"sourceId":"Item.Ib9GlNN6XslsALb5"}}} +{"_id":"AcUIbZFhfoXqQP2m","name":"Track","type":"skill","img":"systems/CoC7/assets/icons/skills/track.svg","data":{"skillName":"Track","specialization":"","description":{"value":"See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty":"","pushedFaillureConsequences":"","chat":"","keeper":""},"base":"10","adjustments":{"personal":null,"occupation":null,"archetype":null,"experience":null},"value":-1,"attributes":{},"properties":{"push":true},"eras":{"1920":true,"nvct":true,"drka":true,"ddts":true,"glit":true,"pulp":true,"mdrn":true},"flags":{}},"effects":[],"folder":null,"sort":0,"permission":{"default":0},"flags":{}} +{"_id":"BcWHh8EhmyKj7bNk","name":"Library Use","type":"skill","img":"systems/CoC7/assets/icons/skills/library_use.svg","data":{"skillName":"Library Use","specialization":"","description":{"value":"See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty":"","pushedFaillureConsequences":"","chat":"","keeper":""},"base":"20","adjustments":{"personal":null,"occupation":null,"archetype":null,"experience":null},"value":-1,"attributes":{},"properties":{"push":true},"eras":{"1920":true,"nvct":true,"drka":true,"ddts":true,"glit":true,"pulp":true,"mdrn":true},"flags":{}},"effects":[],"folder":null,"sort":0,"permission":{"default":0},"flags":{}} +{"_id":"DcV524K0jNfjDEZC","name":"Stealth","type":"skill","img":"systems/CoC7/assets/icons/skills/stealth.svg","data":{"skillName":"Stealth","specialization":"","description":{"value":"See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty":"","pushedFaillureConsequences":"","chat":"","keeper":""},"base":"20","adjustments":{"personal":null,"occupation":null,"archetype":null,"experience":null},"value":-1,"attributes":{},"properties":{"push":true},"eras":{"1920":true,"nvct":true,"drka":true,"ddts":true,"glit":true,"pulp":true,"mdrn":true},"flags":{}},"effects":[],"folder":null,"sort":0,"permission":{"default":0},"flags":{}} +{"_id":"Dh6sHWep0qKQmi3I","name":"Science (Physics)","type":"skill","img":"systems/CoC7/assets/icons/skills/science_physics.svg","data":{"skillName":"Physics","specialization":"Science","description":{"value":"See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty":"","pushedFaillureConsequences":"","chat":"","keeper":""},"base":"1","adjustments":{"personal":null,"occupation":null,"archetype":null,"experience":null},"value":-1,"attributes":{},"properties":{"special":true,"push":true},"eras":{"1920":true,"nvct":false,"drka":false,"ddts":false,"glit":false,"pulp":false,"mdrn":true},"flags":{}},"effects":[],"folder":null,"sort":0,"permission":{"default":0},"flags":{}} +{"_id":"EMA6uEtQBgJtBcPl","name":"Rope Use","type":"skill","img":"systems/CoC7/assets/icons/skills/lasso.svg","data":{"skillName":"Rope Use","specialization":"","description":{"value":"See Down Darker Trails
","opposingDifficulty":"","pushedFaillureConsequences":"","chat":"","keeper":""},"base":"5","adjustments":{"personal":null,"occupation":null,"archetype":null,"experience":null},"value":-1,"attributes":{},"properties":{"push":true},"eras":{"ddts":true},"flags":{}},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"YajcPNfJMTNwSvTe":3},"flags":{"core":{"sourceId":"Item.5FI0WRz1GunnTulZ"}}} +{"_id":"Ed8OShyl7D834Ihk","name":"Fighting (Chainsaw)","type":"skill","img":"systems/CoC7/assets/icons/skills/fighting_chainsaw.svg","data":{"skillName":"Chainsaw","specialization":"Fighting","description":{"value":"See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty":"","pushedFaillureConsequences":"","chat":"","keeper":""},"base":"10","adjustments":{"personal":null,"occupation":null,"archetype":null,"experience":null},"value":-1,"attributes":{},"properties":{"fighting":true,"firearm":false,"combat":true,"special":true},"eras":{"1920":true,"nvct":false,"drka":false,"ddts":false,"glit":false,"pulp":false,"mdrn":true},"flags":{}},"effects":[],"folder":null,"sort":0,"permission":{"default":0},"flags":{}} +{"_id":"GHhkcJUqjcP4lToY","name":"Archaeology","type":"skill","img":"systems/CoC7/assets/icons/skills/archaeology.svg","data":{"skillName":"Archaeology","specialization":"","description":{"value":"See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty":"","pushedFaillureConsequences":"","chat":"","keeper":""},"base":"1","adjustments":{"personal":null,"occupation":null,"archetype":null,"experience":null},"value":-1,"attributes":{},"properties":{"push":true},"eras":{"1920":true,"nvct":false,"drka":false,"ddts":true,"glit":true,"pulp":true,"mdrn":true},"flags":{}},"effects":[],"folder":null,"sort":0,"permission":{"default":0},"flags":{}} +{"_id":"HAuFBG4ZT2yO9yn7","name":"Art/Craft (Any)","type":"skill","img":"systems/CoC7/assets/icons/skills/art_craft_any.svg","data":{"skillName":"Any","specialization":"Art/Craft","description":{"value":"See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty":"","pushedFaillureConsequences":"","chat":"","keeper":""},"base":"5","adjustments":{"personal":null,"occupation":null,"archetype":null,"experience":null},"value":-1,"attributes":{},"properties":{"special":true,"push":true},"eras":{"1920":true,"nvct":true,"drka":true,"ddts":true,"glit":true,"pulp":true,"mdrn":true},"flags":{}},"effects":[],"folder":null,"sort":0,"permission":{"default":0},"flags":{}} +{"_id":"HzOGu2yLcL9obry3","name":"Trap","type":"skill","img":"systems/CoC7/assets/icons/skills/wolf-trap.svg","data":{"skillName":"Trap","specialization":"","description":{"value":"See Down Darker Trails
","opposingDifficulty":"","pushedFaillureConsequences":"","chat":"","keeper":""},"base":"10","adjustments":{"personal":null,"occupation":null,"archetype":null,"experience":null},"value":-1,"attributes":{},"properties":{"push":true},"eras":{"ddts":true},"flags":{}},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"YajcPNfJMTNwSvTe":3},"flags":{"core":{"sourceId":"Item.FmcnC1p98W3HNBZi"}}} +{"_id":"I80gmmo830LuOBKl","name":"Civics","type":"skill","img":"systems/CoC7/assets/icons/skills/shaking-hands.svg","data":{"skillName":"Civics","specialization":"","description":{"value":"See the Cthulhu Invictus
","opposingDifficulty":"","pushedFaillureConsequences":"","chat":"","keeper":""},"base":"10","adjustments":{"personal":null,"occupation":null,"archetype":null,"experience":null},"value":-1,"attributes":{},"properties":{"push":true},"eras":{"nvct":true},"flags":{}},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"YajcPNfJMTNwSvTe":3},"flags":{"core":{"sourceId":"Item.46Io2IFPcZcbtH9f"}}} +{"_id":"IBSDR6U4dE1uejVp","name":"Science (Biology)","type":"skill","img":"systems/CoC7/assets/icons/skills/science_biology.svg","data":{"skillName":"Biology","specialization":"Science","description":{"value":"See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty":"","pushedFaillureConsequences":"","chat":"","keeper":""},"base":"1","adjustments":{"personal":null,"occupation":null,"archetype":null,"experience":null},"value":-1,"attributes":{},"properties":{"special":true,"push":true},"eras":{"1920":true,"nvct":false,"drka":false,"ddts":false,"glit":false,"pulp":false,"mdrn":true},"flags":{}},"effects":[],"folder":null,"sort":0,"permission":{"default":0},"flags":{}} +{"_id":"IttOdCAGTeE6VU3F","name":"Fighting (Spear)","type":"skill","img":"systems/CoC7/assets/icons/skills/fighting_spear.svg","data":{"skillName":"Spear","specialization":"Fighting","description":{"value":"See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty":"","pushedFaillureConsequences":"","chat":"","keeper":""},"base":"20","adjustments":{"personal":null,"occupation":null,"archetype":null,"experience":null},"value":-1,"attributes":{},"properties":{"fighting":true,"firearm":false,"combat":true,"special":true},"eras":{"1920":true,"nvct":false,"drka":false,"ddts":false,"glit":false,"pulp":false,"mdrn":true},"flags":{}},"effects":[],"folder":null,"sort":0,"permission":{"default":0},"flags":{}} +{"_id":"JgtxiN3KzooOWIQV","name":"Charm","type":"skill","img":"systems/CoC7/assets/icons/skills/charm.svg","data":{"skillName":"Charm","specialization":"","description":{"value":"See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty":"","pushedFaillureConsequences":"","chat":"","keeper":""},"base":"15","adjustments":{"personal":null,"occupation":null,"archetype":null,"experience":null},"value":-1,"attributes":{},"properties":{"push":true},"eras":{"1920":true,"nvct":true,"drka":true,"ddts":true,"glit":true,"pulp":true,"mdrn":true},"flags":{}},"effects":[],"folder":null,"sort":0,"permission":{"default":0},"flags":{}} +{"_id":"KKFNX5M4LtEtiuxs","name":"Sleight of Hand","type":"skill","img":"systems/CoC7/assets/icons/skills/sleight_of_hand.svg","data":{"skillName":"Sleight of Hand","specialization":"","description":{"value":"See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty":"","pushedFaillureConsequences":"","chat":"","keeper":""},"base":"10","adjustments":{"personal":null,"occupation":null,"archetype":null,"experience":null},"value":-1,"attributes":{},"properties":{"push":true},"eras":{"1920":true,"nvct":true,"drka":true,"ddts":true,"glit":true,"pulp":true,"mdrn":true},"flags":{}},"effects":[],"folder":null,"sort":0,"permission":{"default":0},"flags":{}} +{"_id":"KmDGtn7ukUFVb265","name":"Firearms (Handgun)","type":"skill","img":"systems/CoC7/assets/icons/skills/firearms_handgun.svg","data":{"skillName":"Handgun","specialization":"Firearms","description":{"value":"See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty":"","pushedFaillureConsequences":"","chat":"","keeper":""},"base":"20","adjustments":{"personal":null,"occupation":null,"archetype":null,"experience":null},"value":-1,"attributes":{},"properties":{"fighting":false,"firearm":true,"combat":true,"special":true},"eras":{"1920":true,"nvct":false,"drka":false,"ddts":true,"glit":true,"pulp":true,"mdrn":true},"flags":{}},"effects":[],"folder":null,"sort":0,"permission":{"default":0},"flags":{}} +{"_id":"KvZuYcg3AmVrwKi2","name":"Science (Any)","type":"skill","img":"systems/CoC7/assets/icons/skills/science_any.svg","data":{"skillName":"Any","specialization":"Science","description":{"value":"See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty":"","pushedFaillureConsequences":"","chat":"","keeper":""},"base":"1","adjustments":{"personal":null,"occupation":null,"archetype":null,"experience":null},"value":-1,"attributes":{},"properties":{"special":true,"push":true},"eras":{"1920":true,"nvct":true,"drka":true,"ddts":true,"glit":true,"pulp":true,"mdrn":true},"flags":{}},"effects":[],"folder":null,"sort":0,"permission":{"default":0},"flags":{}} +{"_id":"MFR4eR79niGaLfph","name":"Psychology","type":"skill","img":"systems/CoC7/assets/icons/skills/psychology.svg","data":{"skillName":"Psychology","specialization":"","description":{"value":"See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty":"","pushedFaillureConsequences":"","chat":"","keeper":""},"base":"10","adjustments":{"personal":null,"occupation":null,"archetype":null,"experience":null},"value":-1,"attributes":{},"properties":{"push":true},"eras":{"1920":true,"nvct":false,"drka":false,"ddts":true,"glit":true,"pulp":true,"mdrn":true},"flags":{}},"effects":[],"folder":null,"sort":0,"permission":{"default":0},"flags":{}} +{"_id":"MRbFH52Zh9TzhLBh","name":"Locksmith","type":"skill","img":"systems/CoC7/assets/icons/skills/locksmith.svg","data":{"skillName":"Locksmith","specialization":"","description":{"value":"See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty":"","pushedFaillureConsequences":"","chat":"","keeper":""},"base":"1","adjustments":{"personal":null,"occupation":null,"archetype":null,"experience":null},"value":-1,"attributes":{},"properties":{"push":true},"eras":{"1920":true,"nvct":false,"drka":false,"ddts":true,"glit":true,"pulp":true,"mdrn":true},"flags":{}},"effects":[],"folder":null,"sort":0,"permission":{"default":0},"flags":{}} +{"_id":"MoAB0NRNlpEc2qWr","name":"Listen","type":"skill","img":"systems/CoC7/assets/icons/skills/listen.svg","data":{"skillName":"Listen","specialization":"","description":{"value":"See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty":"","pushedFaillureConsequences":"","chat":"","keeper":""},"base":"20","adjustments":{"personal":null,"occupation":null,"archetype":null,"experience":null},"value":-1,"attributes":{},"properties":{"push":true},"eras":{"1920":true,"nvct":true,"drka":true,"ddts":true,"glit":true,"pulp":true,"mdrn":true},"flags":{}},"effects":[],"folder":null,"sort":0,"permission":{"default":0},"flags":{}} +{"_id":"NBkq8oCGM1FjmsyF","name":"Electrical Repair","type":"skill","img":"systems/CoC7/assets/icons/skills/electrical_repair.svg","data":{"skillName":"Electrical Repair","specialization":"","description":{"value":"See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty":"","pushedFaillureConsequences":"","chat":"","keeper":""},"base":"10","adjustments":{"personal":null,"occupation":null,"archetype":null,"experience":null},"value":-1,"attributes":{},"properties":{"push":true},"eras":{"1920":true,"nvct":false,"drka":false,"ddts":true,"glit":false,"pulp":true,"mdrn":true},"flags":{}},"effects":[],"folder":null,"sort":0,"permission":{"default":0},"flags":{}} +{"_id":"Nw5tSvi2Knxlqmg1","name":"Science (Forensics)","type":"skill","img":"systems/CoC7/assets/icons/skills/science_forensics.svg","data":{"skillName":"Forensics","specialization":"Science","description":{"value":"See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty":"","pushedFaillureConsequences":"","chat":"","keeper":""},"base":"1","adjustments":{"personal":null,"occupation":null,"archetype":null,"experience":null},"value":-1,"attributes":{},"properties":{"special":true,"push":true},"eras":{"1920":true,"nvct":false,"drka":false,"ddts":false,"glit":false,"pulp":false,"mdrn":true},"flags":{}},"effects":[],"folder":null,"sort":0,"permission":{"default":0},"flags":{}} +{"_id":"OcnZzOYWaP4VsjXS","name":"Fighting (Flail)","type":"skill","img":"systems/CoC7/assets/icons/skills/fighting_flail.svg","data":{"skillName":"Flail","specialization":"Fighting","description":{"value":"See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty":"","pushedFaillureConsequences":"","chat":"","keeper":""},"base":"10","adjustments":{"personal":null,"occupation":null,"archetype":null,"experience":null},"value":-1,"attributes":{},"properties":{"fighting":true,"firearm":false,"combat":true,"special":true},"eras":{"1920":true,"nvct":false,"drka":false,"ddts":false,"glit":false,"pulp":false,"mdrn":true},"flags":{}},"effects":[],"folder":null,"sort":0,"permission":{"default":0},"flags":{}} +{"_id":"Og2OWQH93aSDWAMZ","name":"Drive Auto","type":"skill","img":"systems/CoC7/assets/icons/skills/drive_auto.svg","data":{"skillName":"Drive Auto","specialization":"","description":{"value":"See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty":"","pushedFaillureConsequences":"","chat":"","keeper":""},"base":"20","adjustments":{"personal":null,"occupation":null,"archetype":null,"experience":null},"value":-1,"attributes":{},"properties":{"push":true},"eras":{"1920":true,"nvct":false,"drka":false,"ddts":false,"glit":false,"pulp":true,"mdrn":true},"flags":{}},"effects":[],"folder":null,"sort":0,"permission":{"default":0},"flags":{}} +{"_id":"Pb3QI7x9xJVeXi8a","name":"Fighting (Whip)","type":"skill","img":"systems/CoC7/assets/icons/skills/fighting_whip.svg","data":{"skillName":"Whip","specialization":"Fighting","description":{"value":"See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty":"","pushedFaillureConsequences":"","chat":"","keeper":""},"base":"5","adjustments":{"personal":null,"occupation":null,"archetype":null,"experience":null},"value":-1,"attributes":{},"properties":{"fighting":true,"firearm":false,"combat":true,"special":true},"eras":{"1920":true,"nvct":false,"drka":false,"ddts":false,"glit":false,"pulp":false,"mdrn":true},"flags":{}},"effects":[],"folder":null,"sort":0,"permission":{"default":0},"flags":{}} +{"_id":"QcomAOgmOS5g3dsh","name":"Firearms (Machine Gun)","type":"skill","img":"systems/CoC7/assets/icons/skills/firearms_machine_gun.svg","data":{"skillName":"Machine Gun","specialization":"Firearms","description":{"value":"See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty":"","pushedFaillureConsequences":"","chat":"","keeper":""},"base":"10","adjustments":{"personal":null,"occupation":null,"archetype":null,"experience":null},"value":-1,"attributes":{},"properties":{"fighting":false,"firearm":true,"combat":true,"special":true},"eras":{"1920":true,"nvct":false,"drka":false,"ddts":false,"glit":false,"pulp":false,"mdrn":true},"flags":{}},"effects":[],"folder":null,"sort":0,"permission":{"default":0},"flags":{}} +{"_id":"QwaL3UC3Gvjd3hmF","name":"Science (Geology)","type":"skill","img":"systems/CoC7/assets/icons/skills/science_geology.svg","data":{"skillName":"Geology","specialization":"Science","description":{"value":"See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty":"","pushedFaillureConsequences":"","chat":"","keeper":""},"base":"1","adjustments":{"personal":null,"occupation":null,"archetype":null,"experience":null},"value":-1,"attributes":{},"properties":{"special":true,"push":true},"eras":{"1920":true,"nvct":false,"drka":false,"ddts":false,"glit":false,"pulp":false,"mdrn":true},"flags":{}},"effects":[],"folder":null,"sort":0,"permission":{"default":0},"flags":{}} +{"_id":"SL2OorS0Xx6ty02A","name":"Read Lips","type":"skill","img":"systems/CoC7/assets/icons/skills/read_lips.svg","data":{"skillName":"Read Lips","specialization":"","description":{"value":"See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty":"","pushedFaillureConsequences":"","chat":"","keeper":""},"base":"1","adjustments":{"personal":null,"occupation":null,"archetype":null,"experience":null},"value":-1,"attributes":{},"properties":{"rarity":true,"push":true},"eras":{"1920":true,"nvct":false,"drka":false,"ddts":false,"glit":false,"pulp":true,"mdrn":true},"flags":{}},"effects":[],"folder":null,"sort":0,"permission":{"default":0},"flags":{}} +{"_id":"SflwB1bbjaQebiPQ","name":"Gambling","type":"skill","img":"systems/CoC7/assets/icons/skills/poker-hand.svg","data":{"skillName":"Gambling","specialization":"","description":{"value":"See Down Darker Trails
","opposingDifficulty":"","pushedFaillureConsequences":"","chat":"","keeper":""},"base":"10","adjustments":{"personal":null,"occupation":null,"archetype":null,"experience":null},"value":-1,"attributes":{},"properties":{"push":true},"eras":{"ddts":true},"flags":{}},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"YajcPNfJMTNwSvTe":3},"flags":{"core":{"sourceId":"Item.w5ueQbbIvTpmjHh9"}}} +{"_id":"ShPoibiLsd07AtZv","name":"Science (Botany)","type":"skill","img":"systems/CoC7/assets/icons/skills/science_botany.svg","data":{"skillName":"Botany","specialization":"Science","description":{"value":"See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty":"","pushedFaillureConsequences":"","chat":"","keeper":""},"base":"1","adjustments":{"personal":null,"occupation":null,"archetype":null,"experience":null},"value":-1,"attributes":{},"properties":{"special":true,"push":true},"eras":{"1920":true,"nvct":false,"drka":false,"ddts":false,"glit":false,"pulp":false,"mdrn":true},"flags":{}},"effects":[],"folder":null,"sort":0,"permission":{"default":0},"flags":{}} +{"_id":"Sxviv60td6kbS4kp","name":"Drive Carriage","type":"skill","img":"systems/CoC7/assets/icons/skills/cartwheel.svg","data":{"skillName":"Drive Carriage","specialization":"","description":{"value":"See the Cthulhu by Gaslight
","opposingDifficulty":"","pushedFaillureConsequences":"","chat":"","keeper":""},"base":"20","adjustments":{"personal":null,"occupation":null,"archetype":null,"experience":null},"value":-1,"attributes":{},"properties":{"push":true},"eras":{"glit":true},"flags":{}},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"YajcPNfJMTNwSvTe":3},"flags":{"core":{"sourceId":"Item.Yp9weSMp46Mgkfex"}}} +{"_id":"T8fSLCwSD8C0iK8t","name":"Fighting (Axe)","type":"skill","img":"systems/CoC7/assets/icons/skills/fighting_axe.svg","data":{"skillName":"Axe","specialization":"Fighting","description":{"value":"See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty":"","pushedFaillureConsequences":"","chat":"","keeper":""},"base":"15","adjustments":{"personal":null,"occupation":null,"archetype":null,"experience":null},"value":-1,"attributes":{},"properties":{"fighting":true,"firearm":false,"combat":true,"special":true},"eras":{"1920":true,"nvct":false,"drka":false,"ddts":false,"glit":false,"pulp":false,"mdrn":true},"flags":{}},"effects":[],"folder":null,"sort":0,"permission":{"default":0},"flags":{}} +{"_id":"TPOu48DT4QIrqE68","name":"Fighting (Garrote)","type":"skill","img":"systems/CoC7/assets/icons/skills/fighting_garrote.svg","data":{"skillName":"Garrote","specialization":"Fighting","description":{"value":"See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty":"","pushedFaillureConsequences":"","chat":"","keeper":""},"base":"15","adjustments":{"personal":null,"occupation":null,"archetype":null,"experience":null},"value":-1,"attributes":{},"properties":{"fighting":true,"firearm":false,"combat":true,"special":true},"eras":{"1920":true,"nvct":false,"drka":false,"ddts":false,"glit":false,"pulp":false,"mdrn":true},"flags":{}},"effects":[],"folder":null,"sort":0,"permission":{"default":0},"flags":{}} +{"_id":"TwYYqLHe1PXnOCDF","name":"Science (Mathematics)","type":"skill","img":"systems/CoC7/assets/icons/skills/science_mathematics.svg","data":{"skillName":"Mathematics","specialization":"Science","description":{"value":"See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty":"","pushedFaillureConsequences":"","chat":"","keeper":""},"base":"10","adjustments":{"personal":null,"occupation":null,"archetype":null,"experience":null},"value":-1,"attributes":{},"properties":{"special":true,"push":true},"eras":{"1920":true,"nvct":false,"drka":false,"ddts":false,"glit":false,"pulp":false,"mdrn":true},"flags":{}},"effects":[],"folder":null,"sort":0,"permission":{"default":0},"flags":{}} +{"_id":"UASTWOvgCYi8G1QQ","name":"Science (Cryptography)","type":"skill","img":"systems/CoC7/assets/icons/skills/science_cryptography.svg","data":{"skillName":"Cryptography","specialization":"Science","description":{"value":"See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty":"","pushedFaillureConsequences":"","chat":"","keeper":""},"base":"1","adjustments":{"personal":null,"occupation":null,"archetype":null,"experience":null},"value":-1,"attributes":{},"properties":{"special":true,"push":true},"eras":{"1920":true,"nvct":false,"drka":false,"ddts":false,"glit":false,"pulp":false,"mdrn":true},"flags":{}},"effects":[],"folder":null,"sort":0,"permission":{"default":0},"flags":{}} +{"_id":"UOuN0gESXPp2HXwH","name":"Accounting","type":"skill","img":"systems/CoC7/assets/icons/skills/accounting.svg","data":{"skillName":"Accounting","specialization":"","description":{"value":"See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty":"","pushedFaillureConsequences":"","chat":"","keeper":""},"base":"5","adjustments":{"personal":null,"occupation":null,"archetype":null,"experience":null},"value":-1,"attributes":{},"properties":{"push":true},"eras":{"1920":true,"nvct":true,"drka":true,"ddts":true,"glit":true,"pulp":true,"mdrn":true},"flags":{}},"effects":[],"folder":null,"sort":0,"permission":{"default":0},"flags":{}} +{"_id":"URo2NSSJSNdvOqXU","name":"History","type":"skill","img":"systems/CoC7/assets/icons/skills/history.svg","data":{"skillName":"History","specialization":"","description":{"value":"See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty":"","pushedFaillureConsequences":"","chat":"","keeper":""},"base":"5","adjustments":{"personal":null,"occupation":null,"archetype":null,"experience":null},"value":-1,"attributes":{},"properties":{"push":true},"eras":{"1920":true,"nvct":false,"drka":false,"ddts":true,"glit":true,"pulp":true,"mdrn":true},"flags":{}},"effects":[],"folder":null,"sort":0,"permission":{"default":0},"flags":{}} +{"_id":"V9ulAwDyLVqqQ0su","name":"Science (Pharmacy)","type":"skill","img":"systems/CoC7/assets/icons/skills/science_pharmacy.svg","data":{"skillName":"Pharmacy","specialization":"Science","description":{"value":"See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty":"","pushedFaillureConsequences":"","chat":"","keeper":""},"base":"1","adjustments":{"personal":null,"occupation":null,"archetype":null,"experience":null},"value":-1,"attributes":{},"properties":{"special":true,"push":true},"eras":{"1920":true,"nvct":false,"drka":false,"ddts":false,"glit":false,"pulp":false,"mdrn":true},"flags":{}},"effects":[],"folder":null,"sort":0,"permission":{"default":0},"flags":{}} +{"_id":"VZSv9eodMQ4ZPcrO","name":"Computer Use","type":"skill","img":"systems/CoC7/assets/icons/skills/computer_use.svg","data":{"skillName":"Computer Use","specialization":"","description":{"value":"See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty":"","pushedFaillureConsequences":"","chat":"","keeper":""},"base":"5","adjustments":{"personal":null,"occupation":null,"archetype":null,"experience":null},"value":-1,"attributes":{},"properties":{"push":true},"eras":{"1920":false,"nvct":false,"drka":false,"ddts":false,"glit":false,"pulp":true,"mdrn":true},"flags":{}},"effects":[],"folder":null,"sort":0,"permission":{"default":0},"flags":{}} +{"_id":"VwGWZ2LBOwtMaw08","name":"Firearms (Bow)","type":"skill","img":"systems/CoC7/assets/icons/skills/firearms_bow.svg","data":{"skillName":"Bow","specialization":"Firearms","description":{"value":"See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty":"","pushedFaillureConsequences":"","chat":"","keeper":""},"base":"15","adjustments":{"personal":null,"occupation":null,"archetype":null,"experience":null},"value":-1,"attributes":{},"properties":{"fighting":false,"firearm":true,"combat":true,"special":true},"eras":{"1920":true,"nvct":false,"drka":false,"ddts":false,"glit":false,"pulp":false,"mdrn":true},"flags":{}},"effects":[],"folder":null,"sort":0,"permission":{"default":0},"flags":{}} +{"_id":"WJky66ezt2ef5ksH","name":"Cthulhu Mythos","type":"skill","img":"systems/CoC7/assets/icons/skills/cthulhu_mythos.svg","data":{"skillName":"Cthulhu Mythos","specialization":"","description":{"value":"See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty":"","pushedFaillureConsequences":"","chat":"","keeper":""},"base":"0","adjustments":{"personal":null,"occupation":null,"archetype":null,"experience":null},"value":-1,"attributes":{},"properties":{"noadjustments":true,"noxpgain":true},"eras":{"1920":true,"nvct":true,"drka":true,"ddts":true,"glit":true,"pulp":true,"mdrn":true},"flags":{}},"effects":[],"folder":null,"sort":0,"permission":{"default":0},"flags":{}} +{"_id":"WLYZNASZ2YP8zN3g","name":"Art/Craft (Photography)","type":"skill","img":"systems/CoC7/assets/icons/skills/art_craft_photography.svg","data":{"skillName":"Photography","specialization":"Art/Craft","description":{"value":"See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty":"","pushedFaillureConsequences":"","chat":"","keeper":""},"base":"5","adjustments":{"personal":null,"occupation":null,"archetype":null,"experience":null},"value":-1,"attributes":{},"properties":{"special":true,"push":true},"eras":{"1920":true,"nvct":false,"drka":false,"ddts":false,"glit":false,"pulp":false,"mdrn":true},"flags":{}},"effects":[],"folder":null,"sort":0,"permission":{"default":0},"flags":{}} +{"_id":"X99v5MtRlfTNjL3B","name":"Survival (Any)","type":"skill","img":"systems/CoC7/assets/icons/skills/survival_any.svg","data":{"skillName":"Any","specialization":"Survival","description":{"value":"See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty":"","pushedFaillureConsequences":"","chat":"","keeper":""},"base":"10","adjustments":{"personal":null,"occupation":null,"archetype":null,"experience":null},"value":-1,"attributes":{},"properties":{"special":true,"push":true},"eras":{"1920":true,"nvct":false,"drka":false,"ddts":true,"glit":true,"pulp":true,"mdrn":true},"flags":{}},"effects":[],"folder":null,"sort":0,"permission":{"default":0},"flags":{}} +{"_id":"Xmg7oAy70DKpv4kq","name":"Medicine","type":"skill","img":"systems/CoC7/assets/icons/skills/medicine.svg","data":{"skillName":"Medicine","specialization":"","description":{"value":"See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty":"","pushedFaillureConsequences":"","chat":"","keeper":""},"base":"1","adjustments":{"personal":null,"occupation":null,"archetype":null,"experience":null},"value":-1,"attributes":{},"properties":{"push":true},"eras":{"1920":true,"nvct":true,"drka":true,"ddts":true,"glit":true,"pulp":true,"mdrn":true},"flags":{}},"effects":[],"folder":null,"sort":0,"permission":{"default":0},"flags":{}} +{"_id":"Yu3Xk8kZBlz0G82y","name":"Language (Any)","type":"skill","img":"systems/CoC7/assets/icons/skills/language.svg","data":{"skillName":"Any","specialization":"Language","description":{"value":"See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty":"","pushedFaillureConsequences":"","chat":"","keeper":""},"base":"1","adjustments":{"personal":null,"occupation":null,"archetype":null,"experience":null},"value":-1,"attributes":{},"properties":{"special":true,"push":true},"eras":{"1920":true,"nvct":true,"drka":true,"ddts":true,"glit":true,"pulp":true,"mdrn":true},"flags":{}},"effects":[],"folder":null,"sort":0,"permission":{"default":0},"flags":{}} +{"_id":"bJt90h73GqdP7ti6","name":"Demolitions","type":"skill","img":"systems/CoC7/assets/icons/skills/demolitions.svg","data":{"skillName":"Demolitions","specialization":"","description":{"value":"See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty":"","pushedFaillureConsequences":"","chat":"","keeper":""},"base":"1","adjustments":{"personal":null,"occupation":null,"archetype":null,"experience":null},"value":-1,"attributes":{},"properties":{"rarity":true,"push":true},"eras":{"1920":true,"nvct":false,"drka":false,"ddts":false,"glit":false,"pulp":true,"mdrn":true},"flags":{}},"effects":[],"folder":null,"sort":0,"permission":{"default":0},"flags":{}} +{"_id":"c5utlFbDM7J8TA8b","name":"Jump","type":"skill","img":"systems/CoC7/assets/icons/skills/jump.svg","data":{"skillName":"Jump","specialization":"","description":{"value":"See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty":"","pushedFaillureConsequences":"","chat":"","keeper":""},"base":"20","adjustments":{"personal":null,"occupation":null,"archetype":null,"experience":null},"value":-1,"attributes":{},"properties":{"push":true},"eras":{"1920":true,"nvct":true,"drka":true,"ddts":true,"glit":true,"pulp":true,"mdrn":true},"flags":{}},"effects":[],"folder":null,"sort":0,"permission":{"default":0},"flags":{}} +{"_id":"cuExWy1130KUwuWz","name":"Operate Heavy Machinery","type":"skill","img":"systems/CoC7/assets/icons/skills/operate_heavy_machinery.svg","data":{"skillName":"Operate Heavy Machinery","specialization":"","description":{"value":"See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty":"","pushedFaillureConsequences":"","chat":"","keeper":""},"base":"1","adjustments":{"personal":null,"occupation":null,"archetype":null,"experience":null},"value":-1,"attributes":{},"properties":{"push":true},"eras":{"1920":true,"nvct":false,"drka":false,"ddts":true,"glit":true,"pulp":false,"mdrn":true},"flags":{}},"effects":[],"folder":null,"sort":0,"permission":{"default":0},"flags":{}} +{"_id":"dQ4zUjSteT3sgwKx","name":"Animal Handling","type":"skill","img":"systems/CoC7/assets/icons/skills/animal_handling.svg","data":{"skillName":"Animal Handling","specialization":"","description":{"value":"See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty":"","pushedFaillureConsequences":"","chat":"","keeper":""},"base":"5","adjustments":{"personal":null,"occupation":null,"archetype":null,"experience":null},"value":-1,"attributes":{},"properties":{"push":true,"rarity":true},"eras":{"1920":true,"nvct":true,"drka":true,"ddts":true,"glit":true,"pulp":false,"mdrn":true},"flags":{}},"effects":[],"folder":null,"sort":0,"permission":{"default":0},"flags":{}} +{"_id":"gRUXG91zIJXOLye1","name":"Firearms (Submachine Gun)","type":"skill","img":"systems/CoC7/assets/icons/skills/firearms_submachine_gun.svg","data":{"skillName":"Submachine Gun","specialization":"Firearms","description":{"value":"See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty":"","pushedFaillureConsequences":"","chat":"","keeper":""},"base":"15","adjustments":{"personal":null,"occupation":null,"archetype":null,"experience":null},"value":-1,"attributes":{},"properties":{"fighting":false,"firearm":true,"combat":true,"special":true},"eras":{"1920":true,"nvct":false,"drka":false,"ddts":false,"glit":false,"pulp":false,"mdrn":true},"flags":{}},"effects":[],"folder":null,"sort":0,"permission":{"default":0},"flags":{}} +{"_id":"gzNPM9gbx0EZffBV","name":"Disguise","type":"skill","img":"systems/CoC7/assets/icons/skills/disguise.svg","data":{"skillName":"Disguise","specialization":"","description":{"value":"See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty":"","pushedFaillureConsequences":"","chat":"","keeper":""},"base":"5","adjustments":{"personal":null,"occupation":null,"archetype":null,"experience":null},"value":-1,"attributes":{},"properties":{"push":true},"eras":{"1920":true,"nvct":false,"drka":true,"ddts":true,"glit":true,"pulp":true,"mdrn":true},"flags":{}},"effects":[],"folder":null,"sort":0,"permission":{"default":0},"flags":{}} +{"_id":"hDr4eUbS398oniTa","name":"Intimidate","type":"skill","img":"systems/CoC7/assets/icons/skills/intimidate.svg","data":{"skillName":"Intimidate","specialization":"","description":{"value":"See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty":"","pushedFaillureConsequences":"","chat":"","keeper":""},"base":"15","adjustments":{"personal":null,"occupation":null,"archetype":null,"experience":null},"value":-1,"attributes":{},"properties":{"push":true},"eras":{"1920":true,"nvct":true,"drka":true,"ddts":true,"glit":true,"pulp":true,"mdrn":true},"flags":{}},"effects":[],"folder":null,"sort":0,"permission":{"default":0},"flags":{}} +{"_id":"hRPbMl2N0t6aBlyc","name":"Fighting (Sword)","type":"skill","img":"systems/CoC7/assets/icons/skills/fighting_sword.svg","data":{"skillName":"Sword","specialization":"Fighting","description":{"value":"See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty":"","pushedFaillureConsequences":"","chat":"","keeper":""},"base":"20","adjustments":{"personal":null,"occupation":null,"archetype":null,"experience":null},"value":-1,"attributes":{},"properties":{"fighting":true,"firearm":false,"combat":true,"special":true},"eras":{"1920":true,"nvct":false,"drka":false,"ddts":false,"glit":false,"pulp":false,"mdrn":true},"flags":{}},"effects":[],"folder":null,"sort":0,"permission":{"default":0},"flags":{}} +{"_id":"hhvqA2BOljk1FHVg","name":"Science (Astronomy)","type":"skill","img":"systems/CoC7/assets/icons/skills/science_astronomy.svg","data":{"skillName":"Astronomy","specialization":"Science","description":{"value":"See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty":"","pushedFaillureConsequences":"","chat":"","keeper":""},"base":"1","adjustments":{"personal":null,"occupation":null,"archetype":null,"experience":null},"value":-1,"attributes":{},"properties":{"push":true,"special":true},"eras":{"1920":true,"nvct":false,"drka":false,"ddts":false,"glit":false,"pulp":false,"mdrn":true},"flags":{}},"effects":[],"folder":null,"sort":0,"permission":{"default":0},"flags":{}} +{"_id":"jTcu6Ni2ek7Yz5q3","name":"Natural World","type":"skill","img":"systems/CoC7/assets/icons/skills/natural_world.svg","data":{"skillName":"Natural World","specialization":"","description":{"value":"See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty":"","pushedFaillureConsequences":"","chat":"","keeper":""},"base":"10","adjustments":{"personal":null,"occupation":null,"archetype":null,"experience":null},"value":-1,"attributes":{},"properties":{"push":true},"eras":{"1920":true,"nvct":true,"drka":false,"ddts":true,"glit":true,"pulp":true,"mdrn":true},"flags":{}},"effects":[],"folder":null,"sort":0,"permission":{"default":0},"flags":{}} +{"_id":"ld78TITwKNFPpanQ","name":"Fast Talk","type":"skill","img":"systems/CoC7/assets/icons/skills/fast_talk.svg","data":{"skillName":"Fast Talk","specialization":"","description":{"value":"See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty":"","pushedFaillureConsequences":"","chat":"","keeper":""},"base":"5","adjustments":{"personal":null,"occupation":null,"archetype":null,"experience":null},"value":-1,"attributes":{},"properties":{"push":true},"eras":{"1920":true,"nvct":true,"drka":true,"ddts":true,"glit":true,"pulp":true,"mdrn":true},"flags":{}},"effects":[],"folder":null,"sort":0,"permission":{"default":0},"flags":{}} +{"_id":"m2pYjKk4Gk3FcEBL","name":"Firearms (Rifle/Shotgun)","type":"skill","img":"systems/CoC7/assets/icons/skills/firearms_rifle_shotgun.svg","data":{"skillName":"Rifle/Shotgun","specialization":"Firearms","description":{"value":"See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty":"","pushedFaillureConsequences":"","chat":"","keeper":""},"base":"25","adjustments":{"personal":null,"occupation":null,"archetype":null,"experience":null},"value":-1,"attributes":{},"properties":{"fighting":false,"firearm":true,"combat":true,"special":true},"eras":{"1920":true,"nvct":false,"drka":false,"ddts":true,"glit":true,"pulp":true,"mdrn":true},"flags":{}},"effects":[],"folder":null,"sort":0,"permission":{"default":0},"flags":{}} +{"_id":"m6V53lyfz7zh95FE","name":"Art/Craft (Acting)","type":"skill","img":"systems/CoC7/assets/icons/skills/art_craft_acting.svg","data":{"skillName":"Acting","specialization":"Art/Craft","description":{"value":"See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty":"","pushedFaillureConsequences":"","chat":"","keeper":""},"base":"5","adjustments":{"personal":null,"occupation":null,"archetype":null,"experience":null},"value":-1,"attributes":{},"properties":{"special":true,"push":true},"eras":{"1920":true,"nvct":false,"drka":false,"ddts":false,"glit":false,"pulp":false,"mdrn":true},"flags":{}},"effects":[],"folder":null,"sort":0,"permission":{"default":0},"flags":{}} +{"_id":"m8sBJxvuUdtQ2mDU","name":"Art/Craft (Fine Art)","type":"skill","img":"systems/CoC7/assets/icons/skills/art_craft_fine_art.svg","data":{"skillName":"Fine Art","specialization":"Art/Craft","description":{"value":"See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty":"","pushedFaillureConsequences":"","chat":"","keeper":""},"base":"5","adjustments":{"personal":null,"occupation":null,"archetype":null,"experience":null},"value":-1,"attributes":{},"properties":{"special":true,"push":true},"eras":{"1920":true,"nvct":false,"drka":false,"ddts":false,"glit":false,"pulp":false,"mdrn":true},"flags":{}},"effects":[],"folder":null,"sort":0,"permission":{"default":0},"flags":{}} +{"_id":"mEblnQjptKvKCeIg","name":"Hypnosis","type":"skill","img":"systems/CoC7/assets/icons/skills/hypnosis.svg","data":{"skillName":"Hypnosis","specialization":"","description":{"value":"See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty":"","pushedFaillureConsequences":"","chat":"","keeper":""},"base":"1","adjustments":{"personal":null,"occupation":null,"archetype":null,"experience":null},"value":-1,"attributes":{},"properties":{"rarity":true,"push":true},"eras":{"1920":true,"nvct":false,"drka":false,"ddts":false,"glit":false,"pulp":true,"mdrn":true},"flags":{}},"effects":[],"folder":null,"sort":0,"permission":{"default":0},"flags":{}} +{"_id":"nHaWNwtW3Lg0sqYJ","name":"Spot Hidden","type":"skill","img":"systems/CoC7/assets/icons/skills/spot_hidden.svg","data":{"skillName":"Spot Hidden","specialization":"","description":{"value":"See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty":"","pushedFaillureConsequences":"","chat":"","keeper":""},"base":"25","adjustments":{"personal":null,"occupation":null,"archetype":null,"experience":null},"value":-1,"attributes":{},"properties":{"push":true},"eras":{"1920":true,"nvct":true,"drka":true,"ddts":true,"glit":true,"pulp":true,"mdrn":true},"flags":{}},"effects":[],"folder":null,"sort":0,"permission":{"default":0},"flags":{}} +{"_id":"nZ8rdL4PLb7A7f5B","name":"First Aid","type":"skill","img":"systems/CoC7/assets/icons/skills/first_aid.svg","data":{"skillName":"First Aid","specialization":"","description":{"value":"See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty":"","pushedFaillureConsequences":"","chat":"","keeper":""},"base":"30","adjustments":{"personal":null,"occupation":null,"archetype":null,"experience":null},"value":-1,"attributes":{},"properties":{"push":true},"eras":{"1920":true,"nvct":true,"drka":true,"ddts":true,"glit":true,"pulp":true,"mdrn":true},"flags":{}},"effects":[],"folder":null,"sort":0,"permission":{"default":0},"flags":{}} +{"_id":"o7TdzbuSP7ticONf","name":"Ride","type":"skill","img":"systems/CoC7/assets/icons/skills/ride.svg","data":{"skillName":"Ride","specialization":"","description":{"value":"See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty":"","pushedFaillureConsequences":"","chat":"","keeper":""},"base":"5","adjustments":{"personal":null,"occupation":null,"archetype":null,"experience":null},"value":-1,"attributes":{},"properties":{"push":true},"eras":{"1920":true,"nvct":true,"drka":true,"ddts":true,"glit":true,"pulp":true,"mdrn":true},"flags":{}},"effects":[],"folder":null,"sort":0,"permission":{"default":0},"flags":{}} +{"_id":"oEfvPMTx0cgyPlgV","name":"Electronics","type":"skill","img":"systems/CoC7/assets/icons/skills/electronics.svg","data":{"skillName":"Electronics","specialization":"","description":{"value":"See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty":"","pushedFaillureConsequences":"","chat":"","keeper":""},"base":"1","adjustments":{"personal":null,"occupation":null,"archetype":null,"experience":null},"value":-1,"attributes":{},"properties":{"push":true},"eras":{"1920":false,"nvct":false,"drka":false,"ddts":false,"glit":false,"pulp":false,"mdrn":true},"flags":{}},"effects":[],"folder":null,"sort":0,"permission":{"default":0},"flags":{}} +{"_id":"oh5eFj00Wohnx1My","name":"Climb","type":"skill","img":"systems/CoC7/assets/icons/skills/climb.svg","data":{"skillName":"Climb","specialization":"","description":{"value":"See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty":"","pushedFaillureConsequences":"","chat":"","keeper":""},"base":"20","adjustments":{"personal":null,"occupation":null,"archetype":null,"experience":null},"value":-1,"attributes":{},"properties":{"push":true},"eras":{"1920":true,"nvct":true,"drka":true,"ddts":true,"glit":true,"pulp":true,"mdrn":true},"flags":{}},"effects":[],"folder":null,"sort":0,"permission":{"default":0},"flags":{}} +{"_id":"ovIp66Luwfwbq28F","name":"Anthropology","type":"skill","img":"systems/CoC7/assets/icons/skills/anthropology.svg","data":{"skillName":"Anthropology","specialization":"","description":{"value":"See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty":"","pushedFaillureConsequences":"","chat":"","keeper":""},"base":"1","adjustments":{"personal":null,"occupation":null,"archetype":null,"experience":null},"value":-1,"attributes":{},"properties":{"push":true},"eras":{"1920":true,"nvct":false,"drka":false,"ddts":true,"glit":true,"pulp":false,"mdrn":true},"flags":{}},"effects":[],"folder":null,"sort":0,"permission":{"default":0},"flags":{}} +{"_id":"qET2wCGGdy3z18Gc","name":"Firearms (Artillery)","type":"skill","img":"systems/CoC7/assets/icons/skills/firearms_artillery.svg","data":{"skillName":"Artillery","specialization":"Firearms","description":{"value":"See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty":"","pushedFaillureConsequences":"","chat":"","keeper":""},"base":"1","adjustments":{"personal":null,"occupation":null,"archetype":null,"experience":null},"value":-1,"attributes":{},"properties":{"fighting":false,"firearm":true,"combat":true,"special":true,"rarity":true},"eras":{"1920":true,"nvct":false,"drka":false,"ddts":false,"glit":false,"pulp":false,"mdrn":true},"flags":{}},"effects":[],"folder":null,"sort":0,"permission":{"default":0},"flags":{}} +{"_id":"rAK5soSX1n3jXj2A","name":"Drive Horse / Oxen","type":"skill","img":"systems/CoC7/assets/icons/skills/cartwheel.svg","data":{"skillName":"Drive Horse / Oxen","specialization":"","description":{"value":"See the Cthulhu Invictus
","opposingDifficulty":"","pushedFaillureConsequences":"","chat":"","keeper":""},"base":"20","adjustments":{"personal":null,"occupation":null,"archetype":null,"experience":null},"value":-1,"attributes":{},"properties":{"push":true},"eras":{"nvct":true,"drka":true},"flags":{}},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"YajcPNfJMTNwSvTe":3},"flags":{"core":{"sourceId":"Item.LGuvwdjDRA8PwtsI"}}} +{"_id":"rCJKGay6D0ucqgeg","name":"Lore (Any)","type":"skill","img":"systems/CoC7/assets/icons/skills/classical_knowledge.svg","data":{"skillName":"Any","specialization":"Lore","description":{"value":"See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty":"","pushedFaillureConsequences":"","chat":"","keeper":""},"base":"1","adjustments":{"personal":null,"occupation":null,"archetype":null,"experience":null},"value":-1,"attributes":{},"properties":{"special":true,"rarity":true,"push":true},"eras":{},"flags":{}},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"dlPHDbfKH31liGgB":3},"flags":{"core":{"sourceId":"Item.5heqjvvagdYUF8LG"}}} +{"_id":"rXBU2GofiO2qOsGv","name":"Psychoanalysis","type":"skill","img":"systems/CoC7/assets/icons/skills/psychoanalysis.svg","data":{"skillName":"Psychoanalysis","specialization":"","description":{"value":"See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty":"","pushedFaillureConsequences":"","chat":"","keeper":""},"base":"1","adjustments":{"personal":null,"occupation":null,"archetype":null,"experience":null},"value":-1,"attributes":{},"properties":{"push":true},"eras":{"1920":true,"nvct":false,"drka":false,"ddts":false,"glit":false,"pulp":true,"mdrn":true},"flags":{}},"effects":[],"folder":null,"sort":0,"permission":{"default":0},"flags":{}} +{"_id":"rhJ1Q9OB3uTUZmjD","name":"Language (Own)","type":"skill","img":"systems/CoC7/assets/icons/skills/language.svg","data":{"skillName":"Own","specialization":"Language","description":{"value":"See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty":"","pushedFaillureConsequences":"","chat":"","keeper":""},"base":"@EDU","adjustments":{"personal":null,"occupation":null,"archetype":null,"experience":null},"value":-1,"attributes":{},"properties":{"push":true,"special":true},"eras":{"1920":true,"nvct":true,"drka":true,"ddts":true,"glit":true,"pulp":true,"mdrn":true},"flags":{}},"effects":[],"folder":null,"sort":0,"permission":{"default":0},"flags":{}} +{"_id":"sWt5Q3ZXd6NlwhXU","name":"Fighting (Throw)","type":"skill","img":"systems/CoC7/assets/icons/skills/fighting_throw.svg","data":{"skillName":"Throw","specialization":"Fighting","description":{"value":"See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty":"","pushedFaillureConsequences":"","chat":"","keeper":""},"base":"20","adjustments":{"personal":null,"occupation":null,"archetype":null,"experience":null},"value":-1,"attributes":{},"properties":{"fighting":true,"firearm":false,"combat":true,"special":true,"push":false},"eras":{"1920":true,"nvct":true,"drka":true,"ddts":true,"glit":true,"pulp":true,"mdrn":true},"flags":{}},"effects":[],"folder":null,"sort":0,"permission":{"default":0},"flags":{}} +{"_id":"sqenne0VZoF54W5k","name":"Drive Wagon / Coach","type":"skill","img":"systems/CoC7/assets/icons/skills/cartwheel.svg","data":{"skillName":"Drive Wagon / Coach","specialization":"","description":{"value":"See Down Darker Trails
","opposingDifficulty":"","pushedFaillureConsequences":"","chat":"","keeper":""},"base":"20","adjustments":{"personal":null,"occupation":null,"archetype":null,"experience":null},"value":-1,"attributes":{},"properties":{"push":true},"eras":{"ddts":true},"flags":{}},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"YajcPNfJMTNwSvTe":3},"flags":{"core":{"sourceId":"Item.w09bofuMbG6Yu3UB"}}} +{"_id":"t7uiYybrk8dHFdjp","name":"Empire","type":"skill","img":"systems/CoC7/assets/icons/skills/laurel_crown.svg","data":{"skillName":"Empire","specialization":"","description":{"value":"See the Cthulhu Invictus
","opposingDifficulty":"","pushedFaillureConsequences":"","chat":"","keeper":""},"base":"25","adjustments":{"personal":null,"occupation":null,"archetype":null,"experience":null},"value":-1,"attributes":{},"properties":{"push":true},"eras":{"nvct":true},"flags":{}},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"YajcPNfJMTNwSvTe":3},"flags":{"core":{"sourceId":"Item.LtUVhOkVCwqJsjrb"}}} +{"_id":"uMzSNURmZqjxr7mU","name":"Persuade","type":"skill","img":"systems/CoC7/assets/icons/skills/persuade.svg","data":{"skillName":"Persuade","specialization":"","description":{"value":"See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty":"","pushedFaillureConsequences":"","chat":"","keeper":""},"base":"10","adjustments":{"personal":null,"occupation":null,"archetype":null,"experience":null},"value":-1,"attributes":{},"properties":{"push":true},"eras":{"1920":true,"nvct":true,"drka":true,"ddts":true,"glit":true,"pulp":true,"mdrn":true},"flags":{}},"effects":[],"folder":null,"sort":0,"permission":{"default":0},"flags":{}} +{"_id":"uQsVn8K6XRXQmtaI","name":"Pilot (Any)","type":"skill","img":"systems/CoC7/assets/icons/skills/pilot_any.svg","data":{"skillName":"Any","specialization":"Pilot","description":{"value":"See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty":"","pushedFaillureConsequences":"","chat":"","keeper":""},"base":"1","adjustments":{"personal":null,"occupation":null,"archetype":null,"experience":null},"value":-1,"attributes":{},"properties":{"special":true,"push":true},"eras":{"1920":true,"nvct":false,"drka":false,"ddts":true,"glit":true,"pulp":true,"mdrn":true},"flags":{}},"effects":[],"folder":null,"sort":0,"permission":{"default":0},"flags":{}} +{"_id":"vS8bsPWFlwgOecoB","name":"Fighting (Brawl)","type":"skill","img":"systems/CoC7/assets/icons/skills/fighting_brawl.svg","data":{"skillName":"Brawl","specialization":"Fighting","description":{"value":"See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty":"","pushedFaillureConsequences":"","chat":"","keeper":""},"base":"25","adjustments":{"personal":null,"occupation":null,"archetype":null,"experience":null},"value":-1,"attributes":{},"properties":{"fighting":true,"firearm":false,"combat":true,"special":true},"eras":{"1920":true,"nvct":true,"drka":true,"ddts":true,"glit":true,"pulp":true,"mdrn":true},"flags":{}},"effects":[],"folder":null,"sort":0,"permission":{"default":0},"flags":{}} +{"_id":"vYrJ5h9cIQBzvw8E","name":"Credit Rating","type":"skill","img":"systems/CoC7/assets/icons/skills/credit_rating.svg","data":{"skillName":"Credit Rating","specialization":"","description":{"value":"See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty":"","pushedFaillureConsequences":"","chat":"","keeper":""},"base":"0","adjustments":{"personal":null,"occupation":null,"archetype":null,"experience":null},"value":-1,"attributes":{},"properties":{"noxpgain":true,"push":true},"eras":{"1920":true,"nvct":false,"drka":false,"ddts":true,"glit":true,"pulp":true,"mdrn":true},"flags":{}},"effects":[],"folder":null,"sort":0,"permission":{"default":0},"flags":{}} +{"_id":"w0eY2fJe6CEHY9pq","name":"Track (Any)","type":"skill","img":"systems/CoC7/assets/icons/skills/track.svg","data":{"skillName":"Any","specialization":"Track","description":{"value":"See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty":"","pushedFaillureConsequences":"","chat":"","keeper":""},"base":"10","adjustments":{"personal":null,"occupation":null,"archetype":null,"experience":null},"value":-1,"attributes":{},"properties":{"special":true,"push":true},"eras":{"1920":true,"nvct":false,"drka":false,"ddts":false,"glit":false,"pulp":false,"mdrn":true},"flags":{}},"effects":[],"folder":null,"sort":0,"permission":{"default":0},"flags":{}} +{"_id":"w7hWVU14syjweIH2","name":"Science (Meteorology)","type":"skill","img":"systems/CoC7/assets/icons/skills/science_meteorology.svg","data":{"skillName":"Meteorology","specialization":"Science","description":{"value":"See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty":"","pushedFaillureConsequences":"","chat":"","keeper":""},"base":"1","adjustments":{"personal":null,"occupation":null,"archetype":null,"experience":null},"value":-1,"attributes":{},"properties":{"special":true,"push":true},"eras":{"1920":true,"nvct":false,"drka":false,"ddts":false,"glit":false,"pulp":false,"mdrn":true},"flags":{}},"effects":[],"folder":null,"sort":0,"permission":{"default":0},"flags":{}} +{"_id":"wK8XxNj9QwXlGFEb","name":"Dodge","type":"skill","img":"systems/CoC7/assets/icons/skills/dodge.svg","data":{"skillName":"Dodge","specialization":"","description":{"value":"See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty":"","pushedFaillureConsequences":"","chat":"","keeper":""},"base":"1/2*@DEX","adjustments":{"personal":null,"occupation":null,"archetype":null,"experience":null},"value":-1,"attributes":{},"properties":{},"eras":{"1920":true,"nvct":true,"drka":true,"ddts":true,"glit":true,"pulp":true,"mdrn":true},"flags":{}},"effects":[],"folder":null,"sort":0,"permission":{"default":0},"flags":{}} +{"_id":"wOs3gryeGRPkGoWD","name":"Appraise","type":"skill","img":"systems/CoC7/assets/icons/skills/appraise.svg","data":{"skillName":"Appraise","specialization":"","description":{"value":"See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty":"","pushedFaillureConsequences":"","chat":"","keeper":""},"base":"5","adjustments":{"personal":null,"occupation":null,"archetype":null,"experience":null},"value":-1,"attributes":{},"properties":{"push":true},"eras":{"1920":true,"nvct":true,"drka":true,"ddts":true,"glit":true,"pulp":true,"mdrn":true},"flags":{}},"effects":[],"folder":null,"sort":0,"permission":{"default":0},"flags":{}} +{"_id":"zcvnv8qY4GrVwwTL","name":"Art/Craft (Forgery)","type":"skill","img":"systems/CoC7/assets/icons/skills/art_craft_forgery.svg","data":{"skillName":"Forgery","specialization":"Art/Craft","description":{"value":"See the Call of Cthulhu - 7th Ed Core Rulebook
","opposingDifficulty":"","pushedFaillureConsequences":"","chat":"","keeper":""},"base":"5","adjustments":{"personal":null,"occupation":null,"archetype":null,"experience":null},"value":-1,"attributes":{},"properties":{"special":true,"push":true},"eras":{"1920":true,"nvct":false,"drka":false,"ddts":false,"glit":false,"pulp":false,"mdrn":true},"flags":{}},"effects":[],"folder":null,"sort":0,"permission":{"default":0},"flags":{}} diff --git a/packs/system-doc.db b/packs/system-doc.db new file mode 100644 index 00000000..4a2c9612 --- /dev/null +++ b/packs/system-doc.db @@ -0,0 +1,17 @@ +{"_id":"rmtiwtbixojhyf5v","name":"Active effects [en]","content":"The system allows for the creation of Active Effects.\nAn active effect will modify an actor characteristic(s), attribute(s), skill(s).\nEffects can be created as a @Compendium[CoC7.system-doc.fk040vqb4per5ju1]{link} using the @Compendium[CoC7.system-doc.emuu3wo0uul91029]{Link creation tool} or directly in the character sheet by clicking the button.
\nEffects will be display in the effect tabs on the character sheet.
\n\nEffect are broken down in 4 categories for PC :
\nFor NPC/Creatures you will only see 2 sections: active and inactive effects.\nWhen an effect is not inactive, the corresponding changes will be applied to the actor.
\nYou can create effect by clicking the Add button.\nThis will bring the effect creation window.\nThis windows has 3 tabs
\nThis last tab will includes all changes made to the character sheet.
\nAn effect includes a list of changes. Each change needs to be addressed with the corresponding data path.\nThe available changes are :
\nYou can use the actor importer to import several NPC/Creatures blocks from adventures and using the JSON exporter from The Dholes House
\nTo open the actor importer either open the Actor Directory and click Actor Importer at the bottom of the side bar or on an active scene then click Actor Importer
\nIf this is your first time it is recommends you also read the following sections.
\nSelect NPC or Creature
Should the system convert the character block from an earlier edition to 7th
Select the languages of the character block
When adding skills, items, spells, and weapons the system can attempt to find items in your world with the same name, you can select the order the seconds are searched
\nItems: From your item directory
\nWorld: From your world compendiums
\nModules: From your module compendiums
\nSystem: From the system compendiums provided with this system
An example layout is given here you can copy this to your clipboard if you want to edit it or paste in the text from an adventure
Click import will create an actor under the Actor directory will be created in the Imported characters folder any text that was not understood will be stored in Keeper notes
\nThe Dhole's House Actor Importer JSON
When adding skills, items, spells, and weapons the system can attempt to find items in your world with the same name, you can select the order the seconds are searched
\nItems: From your item directory
\nWorld: From your world compendiums
\nModules: From your module compendiums
\nSystem: From the system compendiums provided with this system
Browse for your JSON file, once selected the name and image will be be shown, click import to create the actor under the Actor directory will be created in the Imported characters folder
\nBy default the image will be stored in a folder called dhole-image in your world, this can be changed by clicking on the Game Settings tab then under the Game Settings heading clicking on Configure Settings, click on System Settings.
\n\nThis document is a work in progress overview of the CoC7 system it is not a tutorial for how to use FoundryVTT.
\nYou will need one of the following to play the game
\nThe system automates most of the regular tasks and rules involved with running a game.
\nSeveral parts of the actor sheets have pop up tooltips that trigger after two seconds, this delay can be changed in the settings\n.
\nThis documentation can be reopened under Compendiums -> JournalEntry -> System manual -> Call of Cthulhu 7th Edition (Unofficial) [en]
\nFor a full list of changes checkout the changelog on GitHub
\nIf this is your first time it is recommends you also read the following sections on this page.
\nFoundry VTT is based in actors and items. This module includes a number of system specific actors and items, and some examples of them can be found in the included system compendiums.
\nClick on the Game Settings tab then under the Game Settings heading click on Configure Settings.
\nClick on System Settings
\nTo access this menu you will need to have an active scene which can be created in the Scenes Directory. These options are only available to the Keeper.
\nThere are many elements in the sheets that trigger a dice roll when clicked. Usually a dialog is shown to prompt the user for a difficulty and a possible bonus or penalty. This behavior is modified with the following controls:
\nThe system comes with some compendiums ready for you to customise. These are reset every time you update or install the system so it is recommended you copy them into your own compendium and edit them as required.
\nIn this section you will create or edit @Compendium[CoC7.system-doc.mz0ulbkecfvv8nw7]{skills}
\nGo to compendium packs
Click on Create Compendium
\nMy Skills
)Go to Items Directory
Cick on Create Item
\n@Compendium[CoC7.system-doc.JU1GCWwc8at7gzJ4]{Setups} are predefined sets of skills and a way to generate the characteristics (this can be by rolling dices or assigning certain amount of points for example). Once a setup has been created it can be used in the creation of multiple characters.
\nGo to Items Directory
Click on Create Item
\nDefine the setup to set the basic configuration for a type of characters.
\n+
to add extra Biography sections)An @Compendium[CoC7.system-doc.qa934whpkpauiyc9]{occupation} helps to define the character background, think about it as the definition of the set of occupational skills (the ones where the character can spend their occupation points) plus the definition of how to calculate the amount of available occupation points. Finally the occupation also allows to define the minimum and the maximum credit for a character with this occupation.
\nKeep in mind that the set of occupational skills doesn't need to be fixed, the system allows to configure the occupation so when it's dragged to a Character sheet will give the option of selecting one or more skills from a closed list, or even add a pre defined number of skills to select from all the available ones.
\nThe occupation creation process is the following one:
\nGo to Items Directory
Cick on Create Item
\nDefine the occupation to select the relevant characteristics and the occupation skills
\nSelect the Occupation Type
Define the characteristics used to calculate the occupation points, you can check the characteristics you want and define the multiplier, for the ones with Optional marked, the player will have to choose one at creation time.
\nFor instance if an occupation uses EDU * 2 + (STR or DEX) * 2 you have to select Education and put 2 on the Multiplier without marking Optional and then for Strength and Dexterity you have to check both, check Optional on both, and put 2 on the Multiplier on both.
Finally you will have to define the Minimum and Maximum value for the Credit Rating skill for this occupation.
+
sign a group is created and you can define the Number to chose from (number of skills to select) and create a pool of skills available for the selection by dragging them on the group.You can create a Player Character by creating the actor and filling the corresponding blank Character Sheet, but it's much easier if you have previously created a setup and an occupation (see above), if you have created both the process to create the Player Character is as follows:
\nGo to Actors Directory
Cick on Create Actor
\nDrag and drop a item of Type setup (for instance 1920s, 1890s, Pulp, Modern,...) on the sheet to do the basic setup using the configuration defined on the item, this usually includes rolling the characteristics or setting their values with the points system, and set a default set of skills corresponding to the given setup.
Drag and drop an occupation Type item on the sheet, this will probably involve selecting some skills from a given reduced set or from the remaining ones. This will calculate the available Personal points and Occupation points and assign the part of the Occupation points to reach the minimum value for Credit Rating of the selected occupation.
On the keeper's menu on the left click Keeper's tools, if this menu is not available need to have an active scene which can be created in the Scenes Directory
On the new submenu click Character creation mode. A new tab called Development should appear on the character sheets.
Click on the characters Development tab
The first dot column is for your occupational skills these can be toggled by clicking them
\nDistribute occupation/personal points in development tab taking on account that each skill has 5 columns:
\nTo create a chase create a new item of type chase.
\nOnly the keeper should have access to that item.
\nA chase is composed of a succession of locations. Each location can be separated by an obstacle (barrier or hazard).
\nA hazard will always be crossed but failing the check will slow you down.
\nA barrier will stop you until you successfully pass or destroy it.
\n\nThe chase sheet is divided in 3 parts.
\nTo add a participant click on the plus sign on the participant list or drag an actor or a token.
\nNote that it is not mandatory to have a actor associated with a participant. This will allows for fast setup or to add someone on the fly to the chase.
\nTo be able to add a token to the chase a few control have been added to character and NPC sheets:
\n\nThose icons will give additional information.
\nDragging a token to the participant list or to a location will activate the importer window.
\n\nHere you can setup your participant. All fields can be changed. Note that you can select a different initiative and speed check. This is non standard in the CoC, but allows to setup unusual chases (futuristic matrix chase, dreamlands chase...)
\nHere you can have the list of participant to the chase.
\nTo setup a chase enter the initial numbers of locations and click initialize.
\n\nThe chase is initialized, you can adjust some options. Locations in white are initial locations and can not be modified.
\nDuring setup or during chase you can select a location to modify it.
\nStarting (white) locations can not be modified during setup.
\nTo modify a location select it by clicking on it. This will display the location details on the header part of the sheet.
\n\nYou can add obstacle after and before a location. You can pre-fill an obstacle with a name, an associated check and some penalties.
\n\nWhen you are ready you can cut to the chase. If not all participant have a speed check this will trigger a warning and will not let you start.
\n\nHere is a shorten flow example:
\n\n\n\n
\nOnce the flow is complete all changes are send to the chase.
\n\nThis round is finished. All actor have spent their movement action. You can click Next round to proceed.
\nYou can modify or move a participant by using the controls button on his card.
\nOn the scene select the tokens involved on the combat right click on one of them and on the bottom right click on the Toggle combat state icon. This will add the actors corresponding to the selected tokens to the combat tab.\nThen on the combat tab you can start the combat.
\nThe combat tracker will help you to track both the initiatives of the different actors and the combat rounds.
\nOn foundry combat turns are ordered by initiative, in the system this is usually the DEX of the actor. So to set the initiatives click on the dice icon of each actor or just the icon with 3 persons on the top left of the combat tab to set all at once.
\nNext to each actor on the combat tab there are 3 icons:
\nDuring an actor's turn, to attack the first thing to do is to select the target or targets, this can be done by doing a right click on the target's token and then clicking on the target icon (bottom left). Or set the target mode on from the left tool bar and click on the targets.
\nThen open the actor's sheet and click on the name of the item that will be used for the attack. This can be from a single shot of a long range weapon, or some melee attack or a maneuver.\nThis click will start the attack workflow on the chat, the chat card will allow selecting further options of the attack depending on the type of attack.
\n\n\nTip: if you right click on the combat tracker sheet icon, this will pop put this as a little window and you then you can see both the combat tracker window and results of the combat on the chat.
\n
Not implemented yet.
\nMost sheet component can be clicked on the trigger a check/roll.\nAs a general rule you can modify those requests:
\nShift
will fast forward the request.Ctrl
[GM only] will create a link in the chat with that request a roll to the players.Command | Action |
---|---|
Ctrl+Shift + left click SAN | Request a Sanity Check for the character |
Ctr+Shift+Alt + left click SAN | Request a Sanity Check and define the sanity loss |
Command | Action |
---|---|
Right Click on an element | Start/ Include the roll on an opposed roll |
Alt + Right Click on an element | Start/ Include the roll on an combined roll |
Command | Action |
---|---|
c | Show my own character sheet |
The system comes with some compendiums ready for you to customise. These are reset every time you update or install the system so it is recommended you copy them into your own compendium and edit them as required.
\nThis page creates an investigator using the provided compendiums, if you are ready to full customise your character people read @Compendium[CoC7.system-doc.uug1mm5nokly4o2v]{Character creation} instead.
\nClick on the Compendium Packs tab then under the Item heading open up the Skills Item (CoC7). Here you will find the skills shown on the characters sheets available from Chaosium's website.
\nYou can create a new Item Compendium and copy the skills you require into it allowing you to edit them. You can also create new skills by creating new Skill Items (Click on the Items Directory tab then Create Item give this a name e.g. Gardening and set the Type to Skill).
\nOnce you have set up your skills next create up a Setup, here is an example from the Items Examples compendium @Compendium[CoC7.items.CcH7CdXGtGTjMSCg]{1920's Setup Example}
\nSetups allow to you standardise what skills, items, biography sections, and characteristics the investigators start with.
\nClick on the Items Directory tab then Create Item give this a name e.g. New Investigator Setup and set the Type to Setup
\nOn the Description tab to set the description click the button to get an editor.
\nOn the Details tab click the on the Biography Sections to add any sections you require from the Create a Backstory step of investigator creation. Click on the Compendium Packs tab then under the Item heading open up the Items Examples Item (CoC7) and drag the @Compendium[CoC7.items.3elxAwnv7WCUNwng]{Punch} onto the setup.
\nOn the Characteristics tab you can customise how investigator characteristics are rolled / bought
\nOn the Skills tab you can drag the skills the investigator will have.
\nAll actor and item sheets have a tab which can be used by the Keepers to store notes, only users that are set to GM can see this tab
\nOccupations allow you set how many the occupation points, credit rating range, and skills the investigator starts with. Here is an example from the Items Examples compendium @Compendium[CoC7.items.NOsh6EdNSjpjahDF]{Occupation Example}
\nClick on the Items Directory tab then Create Item give this a name e.g. Driver and set the Type to Occupation
\nOn the Description tab to set the description click the button to get an editor.
\nOn the Details tab you can set the Occupation Points calculation and Minimum/Maximum Credit Rating
\nOn the Skills tab you can drag skills from the Compendiums or Item Directory to Common skills, you can also set up multiple Optional skill groups deciding how many the investigator must select.
\nTo complete your character you need to have an active scene which can be created in the Scenes Directory.
\nClick on the Actors Directory tab then Create Item give this a name e.g. New Investigator and set the Type to Character.
\nYou can drag your setup created above on to the character for the initial setup or drag this example instead @Compendium[CoC7.items.CcH7CdXGtGTjMSCg]{1920's Setup Example}
\nNext drag your occupation created above on to the character or drag this example instead @Compendium[CoC7.items.NOsh6EdNSjpjahDF]{Occupation Example}
\nOn the left hand menu bar select Keeper's tools then select Character creation mode.
\nOn the character sheet select the Development tab. The first dot indicates this is an occupation skill, the first column of numbers is the base value, next if where you assign personal points, third is for occupation points, the fourth is for experience gained during the investigator improvement phase, the final column is the total skill percent.
\nYou can see how many personal and occupation points you have spent so far, once you have spent all your points you need to toggle off Character creation mode to allow characters to see their HP, MP, Sanity, and luck
\n\nThe system support many different types of items, from basic items or weapons to skills or the complete setup of a type of character. You can see examples on the compendium that comes with the system.
\nTo create any of the types of items you always start the same way
\nAnd have some common structure so on all of them:
\nArchetypes are used on Pulp games. They provide skill and characteristic bonuses.
\nOnce the Archetype item has been created, the Archetype Sheet is shown.\nThere you can define the details of the Archetype:
\nThe system has a special type of item for the books to be able to define the Sanity Loss, if it's a Mythos Tome or an Occult book, what Spells or Skills it provides and of curse a description and the book image.
\n\nAn occupation helps to define the character background, think about it as the definition of the set of occupational skills (the ones where the character can spend their occupation points) plus the definition of how to calculate the amount of available occupation points. Finally the occupation also allows to define the minimum and the maximum credit for a character with this occupation.
\nKeep in mind that the set of occupational skills doesn't need to be fixed, the system allows to configure the occupation so when it's dragged to a Character sheet will give the option of selecting one or more skills from a closed list, or even add a pre defined number of skills to select from all the available ones.
\nGo to the Items Directory tab
Click on Create Item
\nOn the Description tab you can change the name, icon, name of the source book, and description
On the Details tab you can control
\nSelect the Occupation Type
Define the characteristics used to calculate the occupation points, you can check the characteristics you want and define the multiplier, for the ones with Optional marked, the player will have to choose one at creation time.
\nNames of biography sections (click on the +
to add extra Biography sections), this can be replaced with a single block biography in settings
Under items you can drag and drop default items and weapons
On the Skills you can drag and drop skills in to multiple sections, A typical occupation has 8 skills plus the Credit Rating skill.
\n+
sign a group is created and you can define the Number to chose from (number of skills to select) and create a pool of skills available for the selection by dragging them on the group.Setups are predefined sets of skills and a way to generate the characteristics (this can be by rolling dices or assigning certain amount of points for example).
\nGo to the Items Directory tab
Click on Create Item
\nOn the Description tab you can change the name, icon, name of the source book, and description
On the Details tab you can control
\n+
to add extra Biography sections), this can be replaced with a single block biography in settingsOn the Characteristics tab you can set a points buy or roll characteristics and the formula
On the Skills tab under common skill you can drag and drop default skills
A skill will be rolled during tests.
\nGo to the Items Directory tab
Click on Create Item
\nOn the Description tab you can change the name, icon, Cthulhu Flavors (which editions this appears in), and description
\nLinks for chat messages and sheet editors (NPC, Journal entries...).\nFormat of link is @coc7.TYPE_OF_REQUEST[OPTIONS]{TEXT_TO_DISPLAY}
TYPE_OF_REQUEST
:\nsanloss
: trigger a san check, upon failure will propose to deduct the corresponding SAN.check
: trigger a check depending on the options.item
: trigger use of a weapon. Only items of type weapon can be triggered.OPTIONS: []
= optional, default\nsanloss
:\nsanMax
: max SAN losssanMin
: min SAN losscheck
:\ntype
: type of check ( characteristic
, skill
, attrib
).name
: name of the skill/characteristic/attrib.blind
]: will force a blind check, if not present the check will depend on your selected roll mode.difficulty
]: ?
(blind), 0
(regular), +
(hard), ++
(extreme), +++
(critical).modifier
]: -x
(x penalty dice), +x
(x bonus dice), 0
(no modifier).icon
]: icon tu use (font awesome, fas fa-dice
).TEXT_TO_DISPLAY
: Name to display, this is optional.Link | Result |
---|---|
@coc7.sanloss[sanMax:1D6,sanMin:1,difficulty:++,modifier:-1] | {Hard San Loss (-1) 1/1D6} |
@coc7.check[type:charac,name:STR,difficulty:+,modifier:-1] | {Hard STR check(-1)} |
@coc7.check[type:attrib,name:lck,difficulty:+,modifier:-1] | {Hard luck check(-1)} |
@coc7.check[type:skill,icon:fas fa-arrow-alt-circle-right,name:anthropology,difficulty:+,modifier:-1] | {Hard Anthropology check(-1)} (with icon) |
@coc7.sanloss[sanMax:1D6,sanMin:1] | {San Loss (-1) 1/1D6} (without name, difficulty nor modifier) |
@coc7.check[type:skill,icon:fas fa-arrow-alt-circle-right,name:anthropology,modifier:+1] | {Anthropology check (+1)} (with icon, without name nor difficulty) |
The system includes a tool to help you create links easily.\nIt's located on the left side bar. Click on the icon.\nThis tools is available to GM only.
\n\nusing this you can create @Compendium[CoC7.system-doc.fk040vqb4per5ju1]{link} for skill check, san check, effects ...\nalternatively you can open the tool by holding CTRL while clicking no an item or a skill.
\nClicking on the tool icon will open a window :
\n\nYou can there select options for you link.
\nIf you do not supply a label and/or an icon, a default label and icon will be added.
\n\nSelecting effects will open an advance window where you can create links for @Compendium[CoC7.system-doc.rmtiwtbixojhyf5v]{active effects}.\nSelect the options the same way you will be doing for a regular effect.
\nThe system has integrated the sanity check workflow and can handle sanity rolls, tracking Sanity loss and rolling for temporal insanity.
\nThe Keeper can click with Ctrl+Shift
on the Sanity of character to request a Sanity Check for the character
Alt
(so holding at the same time Ctrl+Shift+Alt
) while clicking on the Sanity of a character, a dialog will pop-up to introduce the sanity loss if the sanity check is passed and the value for when the sanity check is failed.