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": "
  1. Left click roll check with options
  2. Alt/Option + Left click roll sanity loss with options
  3. Shift + Left click Immediate regular difficulty roll
  4. Shift + Alt/Option + Left click roll sanity loss without dice pool options
  1. Right click Opposed check with options
  2. Shift + Right click Immediate opposed check
  1. Alt/Option + Right click Combined check with options
  2. Shift + Alt/Option + Right click Immediate combined check
", +"CoC7.ToolTipCombat": "
  1. Left click roll check with options
  2. Shift + Left click Immediate regular difficulty roll
  1. Right click Combat opposed maneuver with options
  2. Shift + Right click Immediate combat opposed maneuver
", +"SETTINGS.TitleChaseSettings": "Chase Settings", +"SETTINGS.TrustedCanModfyChatCard": "Allow trusted user to modify chat card", +"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": "Allow trusted user to see GM only sections", +"SETTINGS.TrustedCanSeeChatCardHint": "Enabling this setting will give permission to trusted users to see GM only section on chat card. Use this with caution!", +"SETTINGS.ChaseShowTokenMovement": "Show token movement.", +"SETTINGS.ChaseShowTokenMovementHint": "Show movement on the grid when a token is moved to the next location.", +"CoC7.EffectNew": "New effect", +"CoC7.EffectAppliedCantOverride": "An active effect is applies. You can't modify [{name}]. Deactivate the corresponding effect to modify this value." +``` +## cs.json +``` +"CoC7.Entities.Character": "Character", +"CoC7.Entities.Container": "Container", +"CoC7.Entities.Creature": "Creature", +"CoC7.Entities.Npc": "NPC", +"CoC7.Entities.Vehicle": "Vehicle", +"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.Entities.Archetype": "Archetype", +"CoC7.Entities.Book": "Book", +"CoC7.Entities.Chase": "Chase", +"CoC7.Entities.Item": "Item", +"CoC7.Entities.Occupation": "Occupation", +"CoC7.Entities.Setup": "Setup", +"CoC7.Entities.Skill": "Skill", +"CoC7.Entities.Spell": "Spell", +"CoC7.Entities.Status": "Status", +"CoC7.Entities.Talent": "Talent", +"CoC7.Entities.Weapon": "Weapon", +"CoC7.PlayerName": "Player", +"CoC7.MovementAction": "Movement action", +"CoC7.AdjustedMovement": "Adjusted movement", +"CoC7.DefinitelyInsane": "Good for the asylum", +"CoC7.FINISH": "--F-I-N-I-S-H--", +"CoC7.Weapons": "Weapons", +"CoC7.days": "days(s)", +"CoC7.weeks": "week(s)", +"CoC7.months": "months(s)", +"CoC7.AttacksPerRound": "Attacks per round", +"CoC7.Restart": "Restart", +"CoC7.Reset": "Reset", +"CoC7.Initiative": "Initiative", +"CoC7.Cast": "Cast", +"CoC7.SanityCost": "Sanity Cost", +"CoC7.PowerCost": "Power Cost", +"CoC7.HitPointsCost": "Hit Points Cost", +"CoC7.MagicPointsCost": "Magic Points Cost", +"CoC7.OtherCosts": "Other Costs", +"CoC7.CastingSpell": "Casting {spell}.", +"CoC7.NotEnoughMagicPoints": "{spell} costs {originalMagicPoints} Magic Points, but you only have {actorMagicPoints}. Would you like to take the remaining {convertedHitPoints} from your Hit Points? You will take {convertedHitPoints} damage if you proceed.", +"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.NoTargetToDamage": "There is no target to apply the damage to", +"CoC7.NoResponse": "No Response", +"CoC7.combatCard.automaticSuccess": "Automatic Success", +"CoC7.InitiatorMissed": "{name} missed.", +"CoC7.Damage": "Damage", +"CoC7.CheckFailed": "Check failed", +"CoC7.CheckPassed": "Check passed", +"CoC7.CheckMemoryRepressed": "Memory repressed", +"CoC7.ShotBullets": "Shot {bullets} bullets at target {actor}.", +"CoC7.ShotVoley": "Shooting a voley of {bullets} bullets at target {actor}.", +"CoC7.rangeCombatCard.SurprisedTargetTitle": "1 bonus die for surprised target", +"CoC7.meleeCombatDamageTakes": "takes", +"CoC7.meleeCombatDamageFrom": "from", +"CoC7.meleeCombatDamageDeals": "deals", +"CoC7.meleeCombatDamageWith": "with", +"CoC7.EraAvailability": "Availability", +"CoC7.SkillXpGainDisabled": "XP Gain disabled.", +"CoC7.ErrorInvalidCardType": "Card Type", +"CoC7.ErrorInvalidRollType": "Roll Type", +"CoC7.DriveAutoSkillName": "Drive Auto", +"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.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": "
  1. Left click roll check with options
  2. Shift + Left click Immediate regular difficulty roll
  1. Right click Opposed check with options
  2. Shift + Right click Immediate opposed check
  1. Alt/Option + Right click Combined check with options
  2. Shift + Alt/Option + Right click Immediate combined check
", +"CoC7.ToolTipKeeperSkill": "
  1. Ctrl + Left click Create roll link
  2. Shift + Ctrl + Left click Create roll link with modifiers
  3. {other}
", +"CoC7.ToolTipKeeperStandbySkill": "
  • Left click Request a roll from {name}
  • ", +"CoC7.ToolTipDB": "
    1. Left click Immediate roll
    ", +"CoC7.ToolTipSanity": "
    1. Left click roll check with options
    2. Alt/Option + Left click roll sanity loss with options
    3. Shift + Left click Immediate regular difficulty roll
    4. Shift + Alt/Option + Left click roll sanity loss without dice pool options
    1. Right click Opposed check with options
    2. Shift + Right click Immediate opposed check
    1. Alt/Option + Right click Combined check with options
    2. Shift + Alt/Option + Right click Immediate combined check
    ", +"CoC7.ToolTipCombat": "
    1. Left click roll check with options
    2. Shift + Left click Immediate regular difficulty roll
    1. Right click Combat opposed maneuver with options
    2. Shift + Right click Immediate combat opposed maneuver
    ", +"CoC7.ToolTipKeeperSanity": "
  • Ctrl + Alt/Option Create sanity check roll link
  • ", +"CoC7.ToolTipAutoToggle": "
    1. Left click Toggle automatic calculation / manual entry
    2. ", +"CoC7.ToolTipSkillFlagToggle": "
      1. Double Click Toggle flag status
      2. ", +"CoC7.ToolTipSkillFlagged": "Flagged for development", +"CoC7.ToolTipSkillUnflagged": "Not flagged for development", +"SETTINGS.TitleRules": "Rules", +"SETTINGS.TitleInitiative": "Initiative Settings", +"SETTINGS.TitleRoll": "Roll Settings", +"SETTINGS.TitleChatCards": "Chat Cards Settings", +"SETTINGS.TitleScene": "Scene Settings", +"SETTINGS.TitleSheet": "Sheet Settings", +"SETTINGS.TitleGameArtwork": "Game Artwork Settings", +"SETTINGS.TitleWeapon": "Weapon Settings", +"SETTINGS.TitleDiceSoNice": "Dice So Nice Settings", +"SETTINGS.TitleDeveloperDebug": "Developer And Debug Settings", +"SETTINGS.TitleRollTable": "Roll Table Settings", +"SETTINGS.TitleChaseSettings": "Chase Settings", +"SETTINGS.showIconsOnly": "On summarized sheet, show only icons on skills list.", +"SETTINGS.TrustedCanModfyChatCard": "Allow trusted user to modify chat card", +"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": "Allow trusted user to see GM only sections", +"SETTINGS.TrustedCanSeeChatCardHint": "Enabling this setting will give permission to trusted users to see GM only section on chat card. Use this with caution!", +"SETTINGS.displayPlayerNameOnSheet": "Display player's name on sheet", +"SETTINGS.OverrideGameArtwork": "Override game Artwork", +"SETTINGS.OverrideGameArtworkHint": "!!RESTART REQUIRED!! gives access to advance game config, leave blank for default", +"SETTINGS.ArtPauseImage": "Pause image", +"SETTINGS.ArtPauseImageHint": ". Type 'null' to remove image", +"SETTINGS.ArtPauseText": "Pause text", +"SETTINGS.ArtPauseTextHint": "Leave blank for default", +"SETTINGS.StanbyGMRolls": "Standby Keeper rolls", +"SETTINGS.StanbyGMRollsHint": "When the Keeper is making a roll from an assigned character sheet, display a roll button instead of rolling", +"SETTINGS.EnableStatusIcons": "Enable status icons", +"SETTINGS.EnableStatusIconsHint": "Set if combat and sanity effects icons are shown in tokens.", +"SETTINGS.ShowExperimentalFeatures": "Show Experimental Features", +"SETTINGS.ShowExperimentalFeaturesHint": "Your world may become unusable in a future release if you use these features. For testing only DO NOT use these in your game worlds", +"CoC7.ExperimentalFeaturesWarning": "This feature is a work in progress and is not recommended for use in your game world.", +"SETTINGS.CheckElevation": "Include elevation in distance", +"SETTINGS.CheckElevationHint": "Use elevation in range combat distance calculations", +"CoC7.toolTipDelay": "Millisecond delay before tooltip should show, 0 for never", +"SETTINGS.ChaseShowTokenMovement": "Show token movement.", +"SETTINGS.ChaseShowTokenMovementHint": "Show movement on the grid when a token is moved to the next location.", +"CoC7.getTheExample": "Copy Example", +"CoC7.Copied": "Copied the Example Text to Clipboard", +"CoC7.EffectNew": "New effect", +"CoC7.EffectAppliedCantOverride": "An active effect is applies. You can't modify [{name}]. Deactivate the corresponding effect to modify this value." +``` +## de.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.EraAvailability": "Availability", +"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.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": "
        1. Left click roll check with options
        2. Alt/Option + Left click roll sanity loss with options
        3. Shift + Left click Immediate regular difficulty roll
        4. Shift + Alt/Option + Left click roll sanity loss without dice pool options
        1. Right click Opposed check with options
        2. Shift + Right click Immediate opposed check
        1. Alt/Option + Right click Combined check with options
        2. Shift + Alt/Option + Right click Immediate combined check
        ", +"CoC7.ToolTipCombat": "
        1. Left click roll check with options
        2. Shift + Left click Immediate regular difficulty roll
        1. Right click Combat opposed maneuver with options
        2. Shift + Right click Immediate combat opposed maneuver
        ", +"SETTINGS.TitleChaseSettings": "Chase Settings", +"SETTINGS.TrustedCanModfyChatCard": "Allow trusted user to modify chat card", +"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": "Allow trusted user to see GM only sections", +"SETTINGS.TrustedCanSeeChatCardHint": "Enabling this setting will give permission to trusted users to see GM only section on chat card. Use this with caution!", +"SETTINGS.ChaseShowTokenMovement": "Show token movement.", +"SETTINGS.ChaseShowTokenMovementHint": "Show movement on the grid when a token is moved to the next location.", +"CoC7.getTheExample": "Copy Example", +"CoC7.Copied": "Copied the Example Text to Clipboard", +"CoC7.EffectNew": "New effect", +"CoC7.EffectAppliedCantOverride": "An active effect is applies. You can't modify [{name}]. Deactivate the corresponding effect to modify this value." +``` +## es.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.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": "
        1. Left click roll check with options
        2. Alt/Option + Left click roll sanity loss with options
        3. Shift + Left click Immediate regular difficulty roll
        4. Shift + Alt/Option + Left click roll sanity loss without dice pool options
        1. Right click Opposed check with options
        2. Shift + Right click Immediate opposed check
        1. Alt/Option + Right click Combined check with options
        2. Shift + Alt/Option + Right click Immediate combined check
        ", +"CoC7.ToolTipCombat": "
        1. Left click roll check with options
        2. Shift + Left click Immediate regular difficulty roll
        1. Right click Combat opposed maneuver with options
        2. Shift + Right click Immediate combat opposed maneuver
        ", +"SETTINGS.TitleChaseSettings": "Chase Settings", +"SETTINGS.TrustedCanModfyChatCard": "Allow trusted user to modify chat card", +"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": "Allow trusted user to see GM only sections", +"SETTINGS.TrustedCanSeeChatCardHint": "Enabling this setting will give permission to trusted users to see GM only section on chat card. Use this with caution!", +"SETTINGS.ChaseShowTokenMovement": "Show token movement.", +"SETTINGS.ChaseShowTokenMovementHint": "Show movement on the grid when a token is moved to the next location.", +"CoC7.EffectNew": "New effect", +"CoC7.EffectAppliedCantOverride": "An active effect is applies. You can't modify [{name}]. Deactivate the corresponding effect to modify this value." +``` diff --git a/.github/CHANGELOG.md b/.github/CHANGELOG.md index adc6e554..47d55bdf 100644 --- a/.github/CHANGELOG.md +++ b/.github/CHANGELOG.md @@ -1,3 +1,285 @@ +# :warning: Important note + +> The system is on a transition stage between FVTT V9 and V10. Most of it has been tested and should be working on V10. +> +> However foundry V10 is still in testing stage. +> +> Be aware that migrating to V10 now is not advisable. Your may break your worlds as they will be migrated and you won't be able to return to V9. +> +> Despite out best efforts, some part of this system may not work with V10. + +_If you decide to go on with V10:_ + +- :warning: __MAKE A COPY OF YOUR WORLD BEFORE UPGRADING__ +- please report any bug encountered on GitHub, specify if you used V10 version. + +Happy gaming ! + +## Version 0.8.0 + +When not specified, all changes were made by @castanhocorreia, @HavlockV, and @snap01. + +- Add active effects to manipulate actor sheet value totals +- Add actor.runRoll(...) function to allow third party modules/macros to perform rolls +- Add chase items that Keepers can use to track chases +- Add manual pages which will pop up on first load, this is a work in progress +- Add The Dhole's House JSON actor importer, thanks to @pconcepcion +- Add FoundryVTT v10 tour for finding the rules variant settings +- Add options to allow trusted players to interact with chat cards +- Fix dice sounds not being pushed to other clients +- Fix tooltip for character summary sheet +- Fix updater not always running automatically +- Further support for FoundryVTT v10 +- Update untranslated text in sanity debug information, thanks to @zeteticl +- Update to French localization, thanks to @vonv +- Update to Italian localization, thanks to @Stefano1975t +- Update to Japanese localization, thanks to Asami +- Update to Korean localization, thanks to @jbblily +- Update to Polish localization, thanks to @everyonecancode +- Update to Portuguese localization +- Update to Spanish localization, thanks to @lozanoje +- Update to Swedish localization, thanks to @Rangertheman +- Update to Taiwanese localization, thanks to @zeteticl + +## Version 0.7.11 + +When not specified, all changes were made by @castanhocorreia, @HavlockV, and @snap01. + +- Add roll configuration dialog box option to allow changing roll card type after starting, options are Regular, Combined, Opposed, and Sanity Loss Encounter +- Add sanity loss reason to sanity rolls triggered from character sheets +- Fix combined and opposed roll skill names tags not showing +- Fix combined roll success/failure message and roll values to show correctly +- Fix fumble threshold for hard and extreme rolls +- Fix viewing character sheet if default permission is limited but user permissions are different +- Prevent players from viewing minimised character sheets if permissions are set to limited +- Prevent players from clicking roll on Keeper combined cards +- Remove Trigger Data Migration button from non keepers +- Update tooltips for roll options +- Update to Italian localization, thanks to @Stefano1975t +- Update to Swedish localization, thanks to @Rangertheman + +## Version 0.7.10 + +When not specified, all changes were made by @castanhocorreia, @HavlockV, and @snap01. + +- Add limited view to character sheets +- Allow setting duration units for books +- When creating opposedCard/combinedCard messages use the roll mode of the user creating the message +- Fix sanity loss from books +- Fix opposedCard/combinedCard message selection rules +- Fix updater only outputting errors to the console +- Update to Japanese localization, thanks to Asami +- Update to Portuguese localization +- Update to Spanish localization, thanks to @lozanoje + +## Version 0.7.9 + +When not specified, all changes were made by @castanhocorreia, @HavlockV, and @snap01. + +- Fix bonus/penalty dice rolling without DsN or empty alternative colours +- Fix skill name editing on skills created/edited via an Actor sheet +- Update to Swedish localization, thanks to @Rangertheman + +## Version 0.7.8 + +When not specified, all changes were made by @castanhocorreia, @HavlockV, and @snap01. + +- Fix skill name migration issue with 0.7.7 +- Update to French localization, thanks to @vonv + +## Version 0.7.7: + +When not specified, all changes were made by @castanhocorreia, @HavlockV, and @snap01. + +- Change creature encounters based on tokens/actors to sanity loss events based on type/name +- Change skill names system and token image location to begin support for FoundryVTT v10 changes +- Default weapons added via character/NPC sheet to either melee or ranged +- Fix critical and impale buttons on combat card not formatting correctly +- Fix Dice So Nice appearing to roll d10s instead of d10 and decaders if using image faces +- Fix French documentation path, thanks to @vonv +- Remove character sheet v1 as it is no longer supported +- Update combined roll messages to be per user and allow separate difficulties and number of bonus/penalty dice +- Update link creation UI to make required fields and blur events clearer +- Update to Italian localization, thanks to @Stefano1975t +- Update to Japanese localization, thanks to Asami +- Update to Polish localization, thanks to @everyonecancode +- Update to Simplified Chinese Translation, thanks to kwh3884858 +- Update to Swedish localization, thanks to @Rangertheman +- Update to Taiwanese localization, thanks to @zeteticl + +## Version 0.7.6: + +When not specified, all changes were made by @castanhocorreia, @HavlockV, and @snap01. + +- Add skill specialization to NPC sheet +- Fix font size on NPC sheet for sanity loss +- Fix Invalid BaseTexture in FireFox for active effects +- Fix major wounds round up/down issue +- Fix player lacks permission to update Token when adding/removing active effects if there are more than two players +- Fix possibility to edit or delete spells from books for keepers +- Fix weapon navigation incorrect flex layout +- If clicking NPC sanity loss with no targets selected show warning message +- Update to French localization, thanks to @vonv +- Update to Italian localization, thanks to @Stefano1975t + +## Version 0.7.5: + +When not specified, all changes were made by @castanhocorreia, @HavlockV, and @snap01. + +- Fix unable to remove conditions (prone, unconscious, insanity, etc) when the setting "Scene Settings / Enable status icons" is disabled +- Now rest is available again +- Remove myterious button that produces mysterious messages + +## Version 0.7.4: + +When not specified, all changes were made by @castanhocorreia, @HavlockV, and @snap01. + +- Add ignore major wounds rule for Pulp rules +- Fix showing Actor / Item create dialog box dropdown translations +- Split Pulp rules into individual options +- Replace effect and status with conditions. Allow activating conditions from FoundryVTT combat tracker and effects menu as well as the character sheets +- Update rest function to prevent showing more than max hp or mp was added to the chat summary message +- Update to NPC sheet to use same icons for dead, indefInsane, prone, tempoInsane, and unconscious as PCs +- New Italian localization, thanks to @Stefano1975t +- New Korean localization, thanks to @Mero-Pe +- Now it is possible to learn spell directly from books, thanks to @brockhaus +- Update to French localization, thanks to @vonv +- Update to German localization, thanks to @brockhaus +- Update to Polish localization, thanks to @everyonecancode +- Update to Portuguese localization +- Update to Spanish localization, thanks to @lozalojo +- Update to Swedish localization, thanks to @Rangertheman + +## Version 0.7.3: + +When not specified, all changes were made by @castanhocorreia, @HavlockV and @snap01. + +- Compatible with Foundry VTT v9 +- Fix compendium render in v8/v9 +- Fix multiple chat messages for tokens to the correct users +- Now Actor Importer support Polish, thanks to @frondeus +- Prevent character sheets editing themselves if not editable +- Update layout for weapon sheet tab navigation +- Update to French localization, thanks to @vonv +- Update to Japanese localization, thanks to `@Asami#8627` +- Update to Polish localization, thanks to @frondeus +- Update to Portuguese localization +- Update to Spanish localization, thanks to @lozalojo +- Update to Swedish localization, thanks to @Rangertheman +- Update to Taiwanese localization, thanks to @zeteticl + +## Version 0.7.2: + +When not specified, all changes were made by @castanhocorreia, @HavlockV and @snap01. + +- Add filters to Item compendiums +- Fix Keeper notes incongruency and Spell inside Book rendering +- Fix luck recovery rules for 1920 and Pulp +- Fix negative MP bug +- Now Actor Importer support German, thanks to @brockhaus +- Now it is possible to convert remaining MP into HP (KR, pg. 176) +- Now it is possible to copy Actor Importer example, thanks to @zeteticl +- Now it is possible to select specific Actors for Rest feature, thanks to @zeteticl +- Update to German localization, thanks to @brockhaus +- Update to Portuguese localization +- Update to Swedish localization, thanks to @Rangertheman +- Update to Taiwanese localization, thanks to @zeteticl + +## Version 0.7.1: + +When not specified, all changes were made by @castanhocorreia, @HavlockV and @snap01. + +- Fix wrong attribute in Keeper Notes on Spell sheet. +- Merge any notes accidentally stored in data.notes on Spell sheet. +- Prevent error when updating related compendiums/modules. + +## Version 0.7.0: + +When not specified, all changes were made by @castanhocorreia, @HavlockV and @snap01. + +- Add options to change pause icon and text on settings. +- Add Pulp Luck recovery rules. +- Add several tooltips to the Character sheet (Skill, DB, Sanity, etc). +- Initial refactor of Spell system. + - Cast Spell prompts its description and costs results on chat; + - Now Spell costs are discounted when casting; + - Now you can open Spell sheet from Book Spell list and edit the Spell information within the Book without affecting the original one. + - Update sheet layout to V2. +- Fix "The key ? does not exist in the EmbeddedCollection Collection" dragging an English setup onto a translated Actor. +- Fix background integrity on Book sheet. +- Fix bug on Archetype Item properties. +- Fix bug on Ranged Combat damage not being rolled when value is number. +- Fix bug where GM is speaking instead of NPC on checks +- Fix Combined / Opposed Roll using the incorrect image path for wildcard tokens. +- Fix DsN 3D dices not rolling sometimes. +- Fix summarized sheet colors. +- Fix rounding for max Hit Points on Pulp. +- Now Actor die instantly when damage is equal or higher than its max hp. +- Now Actor Importer support Traditional Chinese, thanks to @zeteticl. +- Now double click on Item in inventory list open its sheet. +- Now the defender has an option to do nothing in combat flow. +- Now there is an option to show or not show uncommon skills on Character sheet. +- Several improvements on the Actor Importer app; +- Update menu system compatibility for 0.8 and V9 Foundry VTT. +- Update updater to check module compendiums for Actor and Item when modules version module numbers are new or changed. +- Update to French localization, thanks to @vonv. +- Update to Japanese localization, thanks to `@Asami#8627`. +- Update to Polish localization, thanks to @everyonecancode and @zakonfeniksa. +- Update to Portuguese localization. +- Update to Spanish localization, thanks to @lozalojo. +- Update to Swedish localization, thanks to @Rangertheman. +- Update to Taiwanese localization, thanks to @zeteticl. + +## Version 0.6.9: + +When not specified, all changes were made by @castanhocorreia, @HavlockV and @snap01. + +- Fix JavaScript Error "Call of Cthulhu 7th Edition (Unofficial): Error detected in system. (See JS Console)" if libWrapper module is active. +- Update updater to check module compendiums for Actors and Items. +- Fixes to compendium packs. + - Demolitions - set base skill to 1%. + - Diving - replace icon and mark as uncommon. + - Language (Other) - remove skill use Language (Any) instead. + - Lore (Any) - add skill. + - Science (Engineering) - add skill. + - Science (Mathematics) - set base skill to 10%. +- Update to french localization, thanks to @vonv. +- Update to japanese localization, thanks to `@Asami#8627`. + +## Version 0.6.8: + +When not specified, all changes were made by @castanhocorreia, @HavlockV and @snap01. + +- Add actor importer button on bottom of actor directory. +- Add button for summarize character sheet, keeping only the essential stuff on minimalistic way. +- Add keeper notes tab to all sheets. +- Add option to show only icons on the summarized sheet skills list. +- Add option to sort skills by value on default sheet. +- Add socketlib as a project library. +- Disable melee buttons after clicked to prevent multiple clicks while waiting for dice so nice. +- Fix character importer spells import. +- Fix character movement calculation. +- Fix error on actor importer when it receives an array, thanks to @pconception. +- Fix errors when override sheet artwork is enable, background type is not slice, and an inline style tag has been added. +- Fix sanity loss from creature not being rolled. +- Fix some Foundry warnings on console for deprecated stuff. +- Handle 00 special case for advantage/disadvantage rolls, thanks to @pconception. +- Now it is possible to create new spells and books directly on actors. +- Now it is possible to trade items between actors. +- Now skill sorting to support accented characters. +- Now the monetary symbol goes before numeral on cash fields. +- Now there is an setting to enable experimental features. + - This is for testing only. DO NOT enable this in your game worlds. +- Now there is default icons for skills on compendium. +- Prevent error on keeper self roll if no token selected. +- Prevent importing Actor if textarea is empty. +- Resolve issue with returning array in array. +- The system now supports elevation on distance calculation on ranged combat. +- Update character sheet to prevent reloading when editing backstory. +- Update message card triggered from chat card update to use current roll mode. +- Update to swedish localization, thanks to @Rangertheman. +- Update to taiwanese localization, thanks to @zeteticl. + ## Version 0.6.7: When not specified, all changes were made by @castanhocorreia, @HavlockV and @snap01. diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md index 444c2149..21499396 100644 --- a/.github/CONTRIBUTING.md +++ b/.github/CONTRIBUTING.md @@ -33,13 +33,13 @@ The more detail on reproducing, the better! Bugs are hard to fix if we can not r We are always looking for translators, there is a lot to translate, and we can not do it all. If you see any translations missing for you language, Feel free to look in the corresponding `*.json` file in the `lang` folder. Comparing against the `en.json` is a good idea, for a baseline. -For the list of missing translations, see: [TRANSLATIONS](https://github.com/HavlockV/CoC7-FoundryVTT/blob/develop/.github/TRANSLATIONS.md). +For the list of missing translations, see: [TRANSLATIONS](https://github.com/Miskatonic-Investigative-Society/CoC7-FoundryVTT/blob/develop/.github/TRANSLATIONS.md). -## Coding. +## Coding -### Requisites. +### Requisites -#### Git. +#### Git On Windows, grab an installer from here: https://git-scm.com/download/win and go with the default options (there will be a lot of option screens). @@ -55,7 +55,7 @@ If you are a new Git user, probably you will have to set it up with the followin `git config --global user.email "YOUR_EMAIL"` -#### Node.js (14+). +#### Node.js (14+) Grab an installer for any operating system from here: https://nodejs.org/en/download/ @@ -63,19 +63,19 @@ Follow the installation steps and then make sure everything went right with: `node -v` or `node --version` -## Setup. +## Setup -### Cloning the Repository. +### Cloning the Repository On the directory where you would like to pull your changes open the terminal or shell of your choice, run: -`git clone https://github.com/HavlockV/CoC7-FoundryVTT.git` +`git clone https://github.com/Miskatonic-Investigative-Society/CoC7-FoundryVTT.git` This will create a local clone of the project repository. When prompted, enter your Github credentials. -### Initial Setup. +### Initial Setup Preferably, open your brand new local repository in the Integrated Development Environment (IDE) of your choice. We recommend [Visual Studio Code](#Visual-Studio-Code). @@ -109,7 +109,7 @@ After rename `fvtt.config.example.js` to `fvtt.config.js` consider run: This way Git does not assume the original file has been deleted from the repository. -### Contributing. +### Contributing The project structure is made as follows: @@ -119,7 +119,7 @@ While testing your changes within Foundry VTT, prefer run: `npm run watch` This way, Webpack and other dependencies will know whenever you make any relevant code changes and will run the build process only when necessary. -### Your First Code Contribution. +### Your First Code Contribution Unsure where to begin contributing? You can start by looking through these `beginner` and `help-wanted` issues! diff --git a/.github/ISSUE_TEMPLATE/feature-request.md b/.github/ISSUE_TEMPLATE/feature-request.md index 69744240..1b58cc98 100644 --- a/.github/ISSUE_TEMPLATE/feature-request.md +++ b/.github/ISSUE_TEMPLATE/feature-request.md @@ -1,6 +1,6 @@ --- name: Feature Request -about: Suggest a new feature or a improvement for this project. +about: Suggest a new feature, a rule implementation, or an improvement for this project. title: '' labels: enhancement assignees: '' @@ -8,12 +8,16 @@ assignees: '' - + ## Description. +## Rule Source + + + ## Context. diff --git a/.github/TRANSLATIONS.md b/.github/TRANSLATIONS.md index 8487af20..d53eeec7 100644 --- a/.github/TRANSLATIONS.md +++ b/.github/TRANSLATIONS.md @@ -2,1578 +2,611 @@ 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`. Feel free to create a new `*.json` file for a language that is not shown here! -The following translations are currently up to date **es**, **fr**, **pl**, **pt-BR**, **sv** - -| Key | cn | cs | de | ja | zh-TW | -| :--------------------------------------------------------------------------------------- | :------: | :------: | :------: | :------: | :------: | -| **Remaining**: | **313** | **88** | **106** | **108** | **28** | -| [CoC7.ActorImporter](#coc7actorimporter) | ❌ | ✅ | ✅ | ✅ | ✅ | -| [CoC7.ActorImporterSummary](#coc7actorimportersummary) | ❌ | ✅ | ✅ | ✅ | ✅ | -| [CoC7.AdvantageAttacker](#coc7advantageattacker) | ❌ | ✅ | ✅ | ✅ | ✅ | -| [CoC7.AdvantageDefender](#coc7advantagedefender) | ❌ | ✅ | ✅ | ✅ | ✅ | -| [CoC7.All](#coc7all) | ❌ | ✅ | ✅ | ✅ | ✅ | -| [CoC7.AlreadyInABout](#coc7alreadyinabout) | ❌ | ✅ | ✅ | ✅ | ✅ | -| [CoC7.AlreadyLost](#coc7alreadylost) | ❌ | ✅ | ✅ | ✅ | ✅ | -| [CoC7.AlreadyUnderlyingInsanity](#coc7alreadyunderlyinginsanity) | ❌ | ✅ | ✅ | ✅ | ✅ | -| [CoC7.Any](#coc7any) | ❌ | ✅ | ✅ | ✅ | ✅ | -| [CoC7.ArmedVehicle](#coc7armedvehicle) | ❌ | ✅ | ✅ | ✅ | ✅ | -| [CoC7.ArmorAbsorbsDamage](#coc7armorabsorbsdamage) | ❌ | ✅ | ✅ | ✅ | ✅ | -| [CoC7.ArmourPlating](#coc7armourplating) | ❌ | ✅ | ✅ | ✅ | ✅ | -| [CoC7.AttackSuccess](#coc7attacksuccess) | ❌ | ✅ | ✅ | ✅ | ✅ | -| [CoC7.Attribute](#coc7attribute) | ❌ | ✅ | ✅ | ✅ | ✅ | -| [CoC7.Attributes](#coc7attributes) | ❌ | ✅ | ✅ | ✅ | ✅ | -| [CoC7.AutomaticFire](#coc7automaticfire) | ❌ | ✅ | ❌ | ✅ | ✅ | -| [CoC7.Blind](#coc7blind) | ❌ | ✅ | ✅ | ✅ | ✅ | -| [CoC7.BookHasNothingMoreToTeach](#coc7bookhasnothingmoretoteach) | ❌ | ❌ | ❌ | ❌ | ❌ | -| [CoC7.BoutActive](#coc7boutactive) | ❌ | ✅ | ✅ | ✅ | ✅ | -| [CoC7.BoutOfMadness](#coc7boutofmadness) | ❌ | ✅ | ✅ | ✅ | ✅ | -| [CoC7.BoutOfMadnessName](#coc7boutofmadnessname) | ❌ | ✅ | ✅ | ✅ | ✅ | -| [CoC7.BoutOfMadnesslasted](#coc7boutofmadnesslasted) | ❌ | ✅ | ✅ | ✅ | ✅ | -| [CoC7.BoutRealTime](#coc7boutrealtime) | ❌ | ✅ | ✅ | ✅ | ✅ | -| [CoC7.BoutSummary](#coc7boutsummary) | ❌ | ✅ | ✅ | ✅ | ✅ | -| [CoC7.BurstSizeHint](#coc7burstsizehint) | ❌ | ✅ | ✅ | ✅ | ✅ | -| [CoC7.Cancel](#coc7cancel) | ❌ | ❌ | ❌ | ❌ | ✅ | -| [CoC7.CardResolved](#coc7cardresolved) | ❌ | ✅ | ✅ | ✅ | ✅ | -| [CoC7.CharCreationMode](#coc7charcreationmode) | ❌ | ✅ | ✅ | ✅ | ✅ | -| [CoC7.Characteristic](#coc7characteristic) | ❌ | ✅ | ✅ | ✅ | ✅ | -| [CoC7.Check](#coc7check) | ❌ | ✅ | ✅ | ✅ | ✅ | -| [CoC7.CloseCard](#coc7closecard) | ❌ | ✅ | ✅ | ✅ | ✅ | -| [CoC7.Collapse](#coc7collapse) | ❌ | ✅ | ✅ | ✅ | ✅ | -| [CoC7.CombinedAllHint](#coc7combinedallhint) | ❌ | ✅ | ✅ | ✅ | ✅ | -| [CoC7.CombinedAnyHint](#coc7combinedanyhint) | ❌ | ✅ | ✅ | ✅ | ✅ | -| [CoC7.CombinedRollCard](#coc7combinedrollcard) | ❌ | ✅ | ✅ | ✅ | ✅ | -| [CoC7.Content](#coc7content) | ❌ | ❌ | ❌ | ❌ | ✅ | -| [CoC7.Convert](#coc7convert) | ❌ | ✅ | ✅ | ✅ | ✅ | -| [CoC7.ConvertFrom6Edition](#coc7convertfrom6edition) | ❌ | ✅ | ✅ | ✅ | ✅ | -| [CoC7.CopyToClipboard](#coc7copytoclipboard) | ❌ | ✅ | ✅ | ✅ | ✅ | -| [CoC7.CreateLink](#coc7createlink) | ❌ | ✅ | ✅ | ✅ | ✅ | -| [CoC7.CreatedImportedCharactersFolder](#coc7createdimportedcharactersfolder) | ❌ | ❌ | ❌ | ❌ | ✅ | -| [CoC7.Creature](#coc7creature) | ❌ | ✅ | ✅ | ✅ | ✅ | -| [CoC7.CreatureMaxLoss](#coc7creaturemaxloss) | ❌ | ✅ | ✅ | ✅ | ✅ | -| [CoC7.Crew](#coc7crew) | ❌ | ✅ | ✅ | ✅ | ✅ | -| [CoC7.Critical](#coc7critical) | ❌ | ✅ | ✅ | ✅ | ✅ | -| [CoC7.CriticalTitle](#coc7criticaltitle) | ❌ | ✅ | ✅ | ✅ | ✅ | -| [CoC7.CustomLabel](#coc7customlabel) | ❌ | ✅ | ✅ | ✅ | ✅ | -| [CoC7.DailyLoss](#coc7dailyloss) | ❌ | ✅ | ✅ | ✅ | ✅ | -| [CoC7.DamageInflicted](#coc7damageinflicted) | ❌ | ✅ | ✅ | ✅ | ✅ | -| [CoC7.DealDamage](#coc7dealdamage) | ❌ | ❌ | ❌ | ❌ | ✅ | -| [CoC7.DevPhase](#coc7devphase) | ❌ | ✅ | ✅ | ✅ | ✅ | -| [CoC7.DevelopAttribWarn](#coc7developattribwarn) | ❌ | ❌ | ❌ | ❌ | ❌ | -| [CoC7.Development](#coc7development) | ❌ | ❌ | ❌ | ❌ | ✅ | -| [CoC7.DifficultyLevel](#coc7difficultylevel) | ❌ | ❌ | ❌ | ❌ | ✅ | -| [CoC7.DisregardMythosGain](#coc7disregardmythosgain) | ❌ | ✅ | ✅ | ✅ | ✅ | -| [CoC7.DragSpell](#coc7dragspell) | ❌ | ❌ | ❌ | ❌ | ❌ | -| [CoC7.DriveSpecializationName](#coc7drivespecializationname) | ❌ | ✅ | ❌ | ❌ | ✅ | -| [CoC7.DyingCheck](#coc7dyingcheck) | ❌ | ✅ | ✅ | ✅ | ✅ | -| [CoC7.EmptyItemList](#coc7emptyitemlist) | ❌ | ✅ | ✅ | ✅ | ✅ | -| [CoC7.EndBoutOfMadness](#coc7endboutofmadness) | ❌ | ✅ | ✅ | ✅ | ✅ | -| [CoC7.English](#coc7english) | ❌ | ✅ | ✅ | ✅ | ✅ | -| [CoC7.EnteringBoutOfMadness](#coc7enteringboutofmadness) | ❌ | ✅ | ✅ | ✅ | ✅ | -| [CoC7.Entities.Archetype](#coc7entitiesarchetype) | ❌ | ❌ | ❌ | ❌ | ✅ | -| [CoC7.Entities.Book](#coc7entitiesbook) | ❌ | ❌ | ❌ | ❌ | ✅ | -| [CoC7.Entities.Character](#coc7entitiescharacter) | ❌ | ❌ | ❌ | ❌ | ✅ | -| [CoC7.Entities.Chase](#coc7entitieschase) | ❌ | ❌ | ❌ | ❌ | ✅ | -| [CoC7.Entities.Creature](#coc7entitiescreature) | ❌ | ❌ | ❌ | ❌ | ✅ | -| [CoC7.Entities.Item](#coc7entitiesitem) | ❌ | ❌ | ❌ | ❌ | ✅ | -| [CoC7.Entities.Npc](#coc7entitiesnpc) | ❌ | ❌ | ❌ | ❌ | ✅ | -| [CoC7.Entities.Occupation](#coc7entitiesoccupation) | ❌ | ❌ | ❌ | ❌ | ✅ | -| [CoC7.Entities.Setup](#coc7entitiessetup) | ❌ | ❌ | ❌ | ❌ | ✅ | -| [CoC7.Entities.Skill](#coc7entitiesskill) | ❌ | ❌ | ❌ | ❌ | ✅ | -| [CoC7.Entities.Spell](#coc7entitiesspell) | ❌ | ❌ | ❌ | ❌ | ✅ | -| [CoC7.Entities.Status](#coc7entitiesstatus) | ❌ | ❌ | ❌ | ❌ | ✅ | -| [CoC7.Entities.Talent](#coc7entitiestalent) | ❌ | ❌ | ❌ | ❌ | ✅ | -| [CoC7.Entities.Vehicle](#coc7entitiesvehicle) | ❌ | ❌ | ❌ | ❌ | ✅ | -| [CoC7.Entities.Weapon](#coc7entitiesweapon) | ❌ | ❌ | ❌ | ❌ | ✅ | -| [CoC7.Expand](#coc7expand) | ❌ | ✅ | ✅ | ✅ | ✅ | -| [CoC7.FakeRoll](#coc7fakeroll) | ❌ | ✅ | ✅ | ✅ | ✅ | -| [CoC7.FlatDiceModifier](#coc7flatdicemodifier) | ❌ | ✅ | ✅ | ✅ | ✅ | -| [CoC7.FlatModifier](#coc7flatmodifier) | ❌ | ✅ | ✅ | ✅ | ✅ | -| [CoC7.French](#coc7french) | ❌ | ✅ | ✅ | ✅ | ✅ | -| [CoC7.FullStudies](#coc7fullstudies) | ❌ | ❌ | ❌ | ❌ | ✅ | -| [CoC7.Gains](#coc7gains) | ❌ | ❌ | ❌ | ❌ | ✅ | -| [CoC7.GainsForReading](#coc7gainsforreading) | ❌ | ❌ | ❌ | ❌ | ❌ | -| [CoC7.GmNotes](#coc7gmnotes) | ❌ | ✅ | ✅ | ✅ | ✅ | -| [CoC7.GmTools](#coc7gmtools) | ❌ | ✅ | ✅ | ✅ | ✅ | -| [CoC7.GoodForAsylum](#coc7goodforasylum) | ❌ | ✅ | ✅ | ✅ | ✅ | -| [CoC7.GrowingAccustomedToAwfulness](#coc7growingaccustomedtoawfulness) | ❌ | ✅ | ✅ | ✅ | ✅ | -| [CoC7.Guess](#coc7guess) | ❌ | ✅ | ✅ | ✅ | ✅ | -| [CoC7.HowToTranslateEnableTranslation](#coc7howtotranslateenabletranslation) | ❌ | ❌ | ❌ | ❌ | ✅ | -| [CoC7.HowToTranslateInstallBabele](#coc7howtotranslateinstallbabele) | ❌ | ❌ | ❌ | ❌ | ✅ | -| [CoC7.HowToTranslateInstallTranslation](#coc7howtotranslateinstalltranslation) | ❌ | ❌ | ❌ | ❌ | ✅ | -| [CoC7.HowToTranslateNoTranslation](#coc7howtotranslatenotranslation) | ❌ | ❌ | ❌ | ❌ | ✅ | -| [CoC7.HowToTranslateTitle](#coc7howtotranslatetitle) | ❌ | ❌ | ❌ | ❌ | ✅ | -| [CoC7.HowToTranslateWarning](#coc7howtotranslatewarning) | ❌ | ❌ | ❌ | ❌ | ✅ | -| [CoC7.Icon](#coc7icon) | ❌ | ✅ | ✅ | ✅ | ✅ | -| [CoC7.ImmuneToAwfulness](#coc7immunetoawfulness) | ❌ | ✅ | ✅ | ✅ | ✅ | -| [CoC7.Impale](#coc7impale) | ❌ | ✅ | ✅ | ✅ | ✅ | -| [CoC7.ImpaleTitle](#coc7impaletitle) | ❌ | ✅ | ✅ | ✅ | ✅ | -| [CoC7.Import](#coc7import) | ❌ | ❌ | ❌ | ❌ | ✅ | -| [CoC7.ImportedUnnamedCharacter](#coc7importedunnamedcharacter) | ❌ | ❌ | ❌ | ❌ | ✅ | -| [CoC7.IndefinitelyInsane](#coc7indefinitelyinsane) | ❌ | ✅ | ✅ | ✅ | ✅ | -| [CoC7.InitialReading](#coc7initialreading) | ❌ | ❌ | ❌ | ❌ | ✅ | -| [CoC7.InitialReadingNeeded](#coc7initialreadingneeded) | ❌ | ❌ | ❌ | ❌ | ❌ | -| [CoC7.InsanityName](#coc7insanityname) | ❌ | ✅ | ✅ | ✅ | ✅ | -| [CoC7.InsanityType](#coc7insanitytype) | ❌ | ✅ | ✅ | ✅ | ✅ | -| [CoC7.IntCheck](#coc7intcheck) | ❌ | ✅ | ✅ | ✅ | ✅ | -| [CoC7.InvestigatorManiaGained](#coc7investigatormaniagained) | ❌ | ✅ | ✅ | ✅ | ✅ | -| [CoC7.InvestigatorPhobiaGained](#coc7investigatorphobiagained) | ❌ | ✅ | ✅ | ✅ | ✅ | -| [CoC7.InvoluntaryAction](#coc7involuntaryaction) | ❌ | ✅ | ✅ | ✅ | ✅ | -| [CoC7.InvoluntaryActionPerfomed](#coc7involuntaryactionperfomed) | ❌ | ✅ | ✅ | ✅ | ✅ | -| [CoC7.InvoluntaryActionPerformed](#coc7involuntaryactionperformed) | ❌ | ✅ | ✅ | ✅ | ✅ | -| [CoC7.ItemWeapon](#coc7itemweapon) | ❌ | ✅ | ✅ | ✅ | ✅ | -| [CoC7.KeepData](#coc7keepdata) | ❌ | ✅ | ✅ | ✅ | ✅ | -| [CoC7.KeeperSentDecoy](#coc7keepersentdecoy) | ❌ | ✅ | ✅ | ✅ | ✅ | -| [CoC7.Label](#coc7label) | ❌ | ✅ | ✅ | ✅ | ✅ | -| [CoC7.LearnSpellAttempt](#coc7learnspellattempt) | ❌ | ❌ | ❌ | ❌ | ❌ | -| [CoC7.LinkCheckDiff](#coc7linkcheckdiff) | ❌ | ✅ | ✅ | ✅ | ✅ | -| [CoC7.LinkCheckDiffModif](#coc7linkcheckdiffmodif) | ❌ | ✅ | ✅ | ✅ | ✅ | -| [CoC7.LinkCheckModif](#coc7linkcheckmodif) | ❌ | ✅ | ✅ | ✅ | ✅ | -| [CoC7.LinkItem](#coc7linkitem) | ❌ | ✅ | ✅ | ✅ | ✅ | -| [CoC7.LinkItemDiff](#coc7linkitemdiff) | ❌ | ✅ | ✅ | ✅ | ✅ | -| [CoC7.LinkItemDiffModif](#coc7linkitemdiffmodif) | ❌ | ✅ | ✅ | ✅ | ✅ | -| [CoC7.LinkItemModif](#coc7linkitemmodif) | ❌ | ✅ | ✅ | ✅ | ✅ | -| [CoC7.LinkSanLossDiff](#coc7linksanlossdiff) | ❌ | ✅ | ✅ | ✅ | ✅ | -| [CoC7.LinkSanLossDiffModif](#coc7linksanlossdiffmodif) | ❌ | ✅ | ✅ | ✅ | ✅ | -| [CoC7.LinkSanLossModif](#coc7linksanlossmodif) | ❌ | ✅ | ✅ | ✅ | ✅ | -| [CoC7.Location](#coc7location) | ❌ | ✅ | ✅ | ✅ | ✅ | -| [CoC7.LuckIncreased](#coc7luckincreased) | ❌ | ✅ | ❌ | ❌ | ✅ | -| [CoC7.LuckNotIncreased](#coc7lucknotincreased) | ❌ | ✅ | ❌ | ❌ | ✅ | -| [CoC7.Mania](#coc7mania) | ❌ | ✅ | ✅ | ✅ | ✅ | -| [CoC7.ManiaGained](#coc7maniagained) | ❌ | ✅ | ✅ | ✅ | ✅ | -| [CoC7.MarkedForDevelopment](#coc7markedfordevelopment) | ❌ | ❌ | ❌ | ❌ | ❌ | -| [CoC7.MaxLossToCreature](#coc7maxlosstocreature) | ❌ | ✅ | ✅ | ✅ | ✅ | -| [CoC7.MaxSanloss](#coc7maxsanloss) | ❌ | ✅ | ✅ | ✅ | ✅ | -| [CoC7.MemoryRepressed](#coc7memoryrepressed) | ❌ | ✅ | ✅ | ✅ | ✅ | -| [CoC7.MessageBoutOfMadnessItemNotFound](#coc7messageboutofmadnessitemnotfound) | ❌ | ❌ | ❌ | ❌ | ✅ | -| [CoC7.MessageBoutOfMadnessTableNotFound](#coc7messageboutofmadnesstablenotfound) | ❌ | ❌ | ❌ | ❌ | ✅ | -| [CoC7.MessageCheckRequestedWait](#coc7messagecheckrequestedwait) | ❌ | ✅ | ✅ | ❌ | ✅ | -| [CoC7.MessageSelectSingleUserForTarget](#coc7messageselectsingleuserfortarget) | ❌ | ❌ | ❌ | ❌ | ✅ | -| [CoC7.MessageSelectedTargetIsNotControlled](#coc7messageselectedtargetisnotcontrolled) | ❌ | ✅ | ❌ | ❌ | ✅ | -| [CoC7.MessageTargetCheckRequested](#coc7messagetargetcheckrequested) | ❌ | ✅ | ✅ | ❌ | ✅ | -| [CoC7.MessageTitleSelectSingleUserForTarget](#coc7messagetitleselectsingleuserfortarget) | ❌ | ❌ | ❌ | ❌ | ✅ | -| [CoC7.Migrate.ButtonOkay](#coc7migratebuttonokay) | ❌ | ❌ | ❌ | ❌ | ✅ | -| [CoC7.Migrate.ButtonSkip](#coc7migratebuttonskip) | ❌ | ❌ | ❌ | ❌ | ✅ | -| [CoC7.Migrate.ButtonUpdate](#coc7migratebuttonupdate) | ❌ | ❌ | ❌ | ❌ | ✅ | -| [CoC7.Migrate.GMRequired](#coc7migrategmrequired) | ❌ | ❌ | ❌ | ❌ | ✅ | -| [CoC7.Migrate.Message](#coc7migratemessage) | ❌ | ❌ | ❌ | ❌ | ✅ | -| [CoC7.Migrate.RestartRequired](#coc7migraterestartrequired) | ❌ | ❌ | ❌ | ❌ | ✅ | -| [CoC7.Migrate.Title](#coc7migratetitle) | ❌ | ❌ | ❌ | ❌ | ✅ | -| [CoC7.MinSanloss](#coc7minsanloss) | ❌ | ✅ | ✅ | ✅ | ✅ | -| [CoC7.Modifiers](#coc7modifiers) | ❌ | ✅ | ✅ | ✅ | ✅ | -| [CoC7.Mythos](#coc7mythos) | ❌ | ❌ | ❌ | ❌ | ❌ | -| [CoC7.MythosAlreadyEncountered](#coc7mythosalreadyencountered) | ❌ | ✅ | ✅ | ✅ | ✅ | -| [CoC7.MythosFirstEncounter](#coc7mythosfirstencounter) | ❌ | ✅ | ✅ | ✅ | ✅ | -| [CoC7.MythosGain](#coc7mythosgain) | ❌ | ✅ | ✅ | ✅ | ✅ | -| [CoC7.NoConvert](#coc7noconvert) | ❌ | ✅ | ✅ | ✅ | ✅ | -| [CoC7.NoTargetSelected](#coc7notargetselected) | ❌ | ❌ | ❌ | ❌ | ✅ | -| [CoC7.NoTargetToDamage](#coc7notargettodamage) | ❌ | ❌ | ❌ | ❌ | ❌ | -| [CoC7.NonPlayingCharacter](#coc7nonplayingcharacter) | ❌ | ✅ | ✅ | ✅ | ✅ | -| [CoC7.NotInsane](#coc7notinsane) | ❌ | ✅ | ✅ | ✅ | ✅ | -| [CoC7.NotOwned](#coc7notowned) | ❌ | ❌ | ❌ | ❌ | ❌ | -| [CoC7.OpposedRollCard](#coc7opposedrollcard) | ❌ | ✅ | ✅ | ✅ | ✅ | -| [CoC7.Origin](#coc7origin) | ❌ | ✅ | ✅ | ✅ | ✅ | -| [CoC7.OutOfAmmo](#coc7outofammo) | ❌ | ✅ | ✅ | ✅ | ✅ | -| [CoC7.OutOfShots](#coc7outofshots) | ❌ | ✅ | ✅ | ✅ | ✅ | -| [CoC7.PasteTheDataBelow](#coc7pastethedatabelow) | ❌ | ✅ | ✅ | ✅ | ✅ | -| [CoC7.Phobia](#coc7phobia) | ❌ | ✅ | ✅ | ✅ | ✅ | -| [CoC7.PhobiaGained](#coc7phobiagained) | ❌ | ✅ | ✅ | ✅ | ✅ | -| [CoC7.PilotSpecializationName](#coc7pilotspecializationname) | ❌ | ✅ | ❌ | ❌ | ✅ | -| [CoC7.PlayerName](#coc7playername) | ❌ | ❌ | ❌ | ❌ | ✅ | -| [CoC7.PlayerPermanentlyInsane](#coc7playerpermanentlyinsane) | ❌ | ✅ | ✅ | ✅ | ✅ | -| [CoC7.Points](#coc7points) | ❌ | ❌ | ❌ | ❌ | ❌ | -| [CoC7.Proceed](#coc7proceed) | ❌ | ❌ | ❌ | ❌ | ✅ | -| [CoC7.Progress](#coc7progress) | ❌ | ❌ | ❌ | ❌ | ✅ | -| [CoC7.Properties](#coc7properties) | ❌ | ✅ | ✅ | ✅ | ✅ | -| [CoC7.PushingSkill](#coc7pushingskill) | ❌ | ✅ | ✅ | ✅ | ✅ | -| [CoC7.ReadAttempt](#coc7readattempt) | ❌ | ❌ | ❌ | ❌ | ❌ | -| [CoC7.ReadingMythosTome](#coc7readingmythostome) | ❌ | ❌ | ❌ | ❌ | ❌ | -| [CoC7.RecoverLuckPoints](#coc7recoverluckpoints) | ❌ | ✅ | ❌ | ❌ | ✅ | -| [CoC7.RedoFullStudy](#coc7redofullstudy) | ❌ | ❌ | ❌ | ❌ | ❌ | -| [CoC7.Reload](#coc7reload) | ❌ | ✅ | ✅ | ✅ | ✅ | -| [CoC7.RememberEverything](#coc7remembereverything) | ❌ | ✅ | ✅ | ✅ | ✅ | -| [CoC7.ResetCreatureSan](#coc7resetcreaturesan) | ❌ | ✅ | ✅ | ✅ | ✅ | -| [CoC7.ResetSpecieSan](#coc7resetspeciesan) | ❌ | ✅ | ✅ | ✅ | ✅ | -| [CoC7.RevealSanLoss](#coc7revealsanloss) | ❌ | ✅ | ✅ | ✅ | ✅ | -| [CoC7.RollLuck4Dev](#coc7rollluck4dev) | ❌ | ✅ | ❌ | ❌ | ✅ | -| [CoC7.RollSecretDice](#coc7rollsecretdice) | ❌ | ✅ | ✅ | ✅ | ✅ | -| [CoC7.RollThreshold](#coc7rollthreshold) | ❌ | ✅ | ✅ | ✅ | ✅ | -| [CoC7.SanDataSelectionWindow](#coc7sandataselectionwindow) | ❌ | ✅ | ✅ | ✅ | ✅ | -| [CoC7.SanGained](#coc7sangained) | ❌ | ❌ | ❌ | ❌ | ✅ | -| [CoC7.SanityCheckPerformed](#coc7sanitycheckperformed) | ❌ | ✅ | ✅ | ✅ | ✅ | -| [CoC7.SanityLost](#coc7sanitylost) | ❌ | ✅ | ✅ | ✅ | ✅ | -| [CoC7.SelectActorType](#coc7selectactortype) | ❌ | ✅ | ✅ | ✅ | ✅ | -| [CoC7.SelectSourceLanguage](#coc7selectsourcelanguage) | ❌ | ✅ | ✅ | ✅ | ✅ | -| [CoC7.SendToChat](#coc7sendtochat) | ❌ | ✅ | ✅ | ✅ | ✅ | -| [CoC7.ShotBullets](#coc7shotbullets) | ❌ | ❌ | ❌ | ❌ | ✅ | -| [CoC7.ShotIsImpossible](#coc7shotisimpossible) | ❌ | ✅ | ✅ | ✅ | ✅ | -| [CoC7.ShotVoley](#coc7shotvoley) | ❌ | ❌ | ❌ | ❌ | ✅ | -| [CoC7.Spanish](#coc7spanish) | ❌ | ✅ | ✅ | ✅ | ✅ | -| [CoC7.Specific](#coc7specific) | ❌ | ❌ | ❌ | ❌ | ✅ | -| [CoC7.SpecificLocations](#coc7specificlocations) | ❌ | ✅ | ✅ | ✅ | ✅ | -| [CoC7.SpellsLearned](#coc7spellslearned) | ❌ | ❌ | ❌ | ❌ | ❌ | -| [CoC7.Status](#coc7status) | ❌ | ✅ | ✅ | ✅ | ✅ | -| [CoC7.Success](#coc7success) | ❌ | ✅ | ✅ | ✅ | ✅ | -| [CoC7.Target](#coc7target) | ❌ | ✅ | ✅ | ✅ | ✅ | -| [CoC7.TargetOutOfRange](#coc7targetoutofrange) | ❌ | ✅ | ✅ | ✅ | ✅ | -| [CoC7.TemporaryInsane](#coc7temporaryinsane) | ❌ | ✅ | ✅ | ✅ | ✅ | -| [CoC7.Tie](#coc7tie) | ❌ | ✅ | ✅ | ✅ | ✅ | -| [CoC7.TotalDamage](#coc7totaldamage) | ❌ | ✅ | ✅ | ✅ | ✅ | -| [CoC7.UnderlyingInsanity](#coc7underlyinginsanity) | ❌ | ✅ | ✅ | ✅ | ✅ | -| [CoC7.UnknownLanguage](#coc7unknownlanguage) | ❌ | ❌ | ❌ | ❌ | ❌ | -| [CoC7.Unreadable](#coc7unreadable) | ❌ | ❌ | ❌ | ❌ | ✅ | -| [CoC7.Vehicle](#coc7vehicle) | ❌ | ✅ | ✅ | ✅ | ✅ | -| [CoC7.WeaponUsesPerRoundHint](#coc7weaponusesperroundhint) | ❌ | ✅ | ✅ | ✅ | ✅ | -| [CoC7.WhisperTo](#coc7whisperto) | ❌ | ✅ | ✅ | ✅ | ✅ | -| [CoC7.WhisperToSelection](#coc7whispertoselection) | ❌ | ✅ | ✅ | ✅ | ✅ | -| [CoC7.XPGainDisabled](#coc7xpgaindisabled) | ❌ | ✅ | ✅ | ✅ | ✅ | -| [CoC7.XPGainEnabled](#coc7xpgainenabled) | ❌ | ✅ | ✅ | ✅ | ✅ | -| [CoC7.YouGainedCthulhuMythos](#coc7yougainedcthulhumythos) | ❌ | ✅ | ✅ | ✅ | ✅ | -| [CoC7.combatCard.surprised](#coc7combatcardsurprised) | ✅ | ✅ | ✅ | ❌ | ✅ | -| [CoC7.dailySanLossRestarted](#coc7dailysanlossrestarted) | ❌ | ✅ | ✅ | ✅ | ✅ | -| [CoC7.dreaming](#coc7dreaming) | ❌ | ✅ | ✅ | ✅ | ✅ | -| [CoC7.hasCriticalWounds](#coc7hascriticalwounds) | ❌ | ✅ | ✅ | ✅ | ✅ | -| [CoC7.healthRecovered](#coc7healthrecovered) | ❌ | ✅ | ✅ | ✅ | ✅ | -| [CoC7.hours](#coc7hours) | ❌ | ✅ | ✅ | ✅ | ✅ | -| [CoC7.magicPointsRecovered](#coc7magicpointsrecovered) | ❌ | ✅ | ❌ | ❌ | ✅ | -| [CoC7.meleeCombatDamageDeals](#coc7meleecombatdamagedeals) | ❌ | ❌ | ❌ | ❌ | ✅ | -| [CoC7.meleeCombatDamageFrom](#coc7meleecombatdamagefrom) | ❌ | ❌ | ❌ | ❌ | ✅ | -| [CoC7.meleeCombatDamageTakes](#coc7meleecombatdamagetakes) | ❌ | ❌ | ❌ | ❌ | ✅ | -| [CoC7.meleeCombatDamageWith](#coc7meleecombatdamagewith) | ❌ | ❌ | ❌ | ❌ | ✅ | -| [CoC7.pulpHealthRecovered](#coc7pulphealthrecovered) | ❌ | ✅ | ✅ | ✅ | ✅ | -| [CoC7.quickHealer](#coc7quickhealer) | ❌ | ✅ | ✅ | ✅ | ✅ | -| [CoC7.rangeCombatCard.AimingTitle](#coc7rangecombatcardaimingtitle) | ❌ | ✅ | ✅ | ✅ | ✅ | -| [CoC7.rangeCombatCard.BigTargetTitle](#coc7rangecombatcardbigtargettitle) | ❌ | ✅ | ✅ | ✅ | ✅ | -| [CoC7.rangeCombatCard.CoverTitle](#coc7rangecombatcardcovertitle) | ❌ | ✅ | ✅ | ✅ | ✅ | -| [CoC7.rangeCombatCard.FastMovingTargetTitle](#coc7rangecombatcardfastmovingtargettitle) | ❌ | ✅ | ✅ | ✅ | ✅ | -| [CoC7.rangeCombatCard.InMeleeTitle](#coc7rangecombatcardinmeleetitle) | ❌ | ✅ | ✅ | ✅ | ✅ | -| [CoC7.rangeCombatCard.NormalTarget](#coc7rangecombatcardnormaltarget) | ❌ | ✅ | ✅ | ✅ | ✅ | -| [CoC7.rangeCombatCard.NormalTargetTitle](#coc7rangecombatcardnormaltargettitle) | ❌ | ✅ | ✅ | ✅ | ✅ | -| [CoC7.rangeCombatCard.PointBlankRangeTitle](#coc7rangecombatcardpointblankrangetitle) | ❌ | ✅ | ✅ | ✅ | ✅ | -| [CoC7.rangeCombatCard.SmallTargetTitle](#coc7rangecombatcardsmalltargettitle) | ❌ | ✅ | ✅ | ✅ | ✅ | -| [CoC7.rangeCombatDamageArmor](#coc7rangecombatdamagearmor) | ❌ | ✅ | ✅ | ✅ | ✅ | -| [CoC7.remove](#coc7remove) | ❌ | ✅ | ✅ | ✅ | ✅ | -| [CoC7.rounds](#coc7rounds) | ❌ | ✅ | ✅ | ✅ | ✅ | -| [CoC7.startRest](#coc7startrest) | ❌ | ✅ | ✅ | ✅ | ✅ | -| [CoC7.toggleXP](#coc7togglexp) | ❌ | ✅ | ✅ | ✅ | ✅ | -| [CoC7.weeks](#coc7weeks) | ❌ | ❌ | ❌ | ❌ | ✅ | -| [SETTINGS.AdviseAllPlayer](#settingsadviseallplayer) | ❌ | ✅ | ✅ | ✅ | ✅ | -| [SETTINGS.AdviseOwnersOnly](#settingsadviseownersonly) | ❌ | ✅ | ✅ | ✅ | ✅ | -| [SETTINGS.AllowFlatDiceModifier](#settingsallowflatdicemodifier) | ❌ | ✅ | ✅ | ✅ | ✅ | -| [SETTINGS.AllowFlatDiceModifierHint](#settingsallowflatdicemodifierhint) | ❌ | ✅ | ✅ | ✅ | ✅ | -| [SETTINGS.AllowFlatThresholdModifier](#settingsallowflatthresholdmodifier) | ❌ | ✅ | ✅ | ✅ | ✅ | -| [SETTINGS.AllowFlatThresholdModifierHint](#settingsallowflatthresholdmodifierhint) | ❌ | ✅ | ✅ | ✅ | ✅ | -| [SETTINGS.AlwaysEditable](#settingsalwayseditable) | ❌ | ✅ | ✅ | ✅ | ✅ | -| [SETTINGS.ArtWorkOtherSheetBackground](#settingsartworkothersheetbackground) | ❌ | ✅ | ✅ | ✅ | ✅ | -| [SETTINGS.ArtWorkOtherSheetBackgroundHint](#settingsartworkothersheetbackgroundhint) | ❌ | ✅ | ✅ | ✅ | ✅ | -| [SETTINGS.ArtWorkSheetBackground](#settingsartworksheetbackground) | ❌ | ✅ | ✅ | ✅ | ✅ | -| [SETTINGS.ArtWorkSheetBackgroundHint](#settingsartworksheetbackgroundhint) | ❌ | ✅ | ✅ | ✅ | ✅ | -| [SETTINGS.ArtWorkSheetBackgroundType](#settingsartworksheetbackgroundtype) | ❌ | ✅ | ❌ | ❌ | ✅ | -| [SETTINGS.ArtworkBackgroundColor](#settingsartworkbackgroundcolor) | ❌ | ✅ | ✅ | ✅ | ✅ | -| [SETTINGS.ArtworkBackgroundColorHint](#settingsartworkbackgroundcolorhint) | ❌ | ✅ | ✅ | ✅ | ✅ | -| [SETTINGS.ArtworkFixedSkillLength](#settingsartworkfixedskilllength) | ❌ | ✅ | ✅ | ✅ | ✅ | -| [SETTINGS.ArtworkFixedSkillLengthHint](#settingsartworkfixedskilllengthhint) | ❌ | ✅ | ✅ | ✅ | ✅ | -| [SETTINGS.ArtworkFrontColor](#settingsartworkfrontcolor) | ❌ | ✅ | ✅ | ✅ | ✅ | -| [SETTINGS.ArtworkFrontColorHint](#settingsartworkfrontcolorhint) | ❌ | ✅ | ✅ | ✅ | ✅ | -| [SETTINGS.ArtworkInteractiveColor](#settingsartworkinteractivecolor) | ❌ | ✅ | ✅ | ✅ | ✅ | -| [SETTINGS.ArtworkInteractiveColorHint](#settingsartworkinteractivecolorhint) | ❌ | ✅ | ✅ | ✅ | ✅ | -| [SETTINGS.ArtworkMainFont](#settingsartworkmainfont) | ❌ | ✅ | ✅ | ✅ | ✅ | -| [SETTINGS.ArtworkMainFontBold](#settingsartworkmainfontbold) | ❌ | ✅ | ✅ | ✅ | ✅ | -| [SETTINGS.ArtworkMainFontSize](#settingsartworkmainfontsize) | ❌ | ✅ | ✅ | ✅ | ✅ | -| [SETTINGS.ArtworkSheetImage](#settingsartworksheetimage) | ❌ | ✅ | ✅ | ✅ | ✅ | -| [SETTINGS.ArtworkSheetImageHint](#settingsartworksheetimagehint) | ❌ | ✅ | ✅ | ✅ | ✅ | -| [SETTINGS.BackgroundAuto](#settingsbackgroundauto) | ❌ | ✅ | ❌ | ❌ | ✅ | -| [SETTINGS.BackgroundContain](#settingsbackgroundcontain) | ❌ | ✅ | ❌ | ❌ | ✅ | -| [SETTINGS.BackgroundCover](#settingsbackgroundcover) | ❌ | ✅ | ❌ | ❌ | ✅ | -| [SETTINGS.BackgroundSlice](#settingsbackgroundslice) | ❌ | ✅ | ❌ | ❌ | ✅ | -| [SETTINGS.BoutOfMadnessRealTimeTable](#settingsboutofmadnessrealtimetable) | ❌ | ✅ | ✅ | ✅ | ✅ | -| [SETTINGS.BoutOfMadnessSummaryTable](#settingsboutofmadnesssummarytable) | ❌ | ✅ | ✅ | ✅ | ✅ | -| [SETTINGS.CreationModeOnly](#settingscreationmodeonly) | ❌ | ✅ | ✅ | ✅ | ✅ | -| [SETTINGS.DebugMode](#settingsdebugmode) | ❌ | ✅ | ❌ | ❌ | ✅ | -| [SETTINGS.DebugModeHint](#settingsdebugmodehint) | ❌ | ✅ | ❌ | ❌ | ✅ | -| [SETTINGS.DisplayCheckSuccessLevel](#settingsdisplaychecksuccesslevel) | ❌ | ✅ | ✅ | ✅ | ✅ | -| [SETTINGS.DisplayResultType](#settingsdisplayresulttype) | ❌ | ✅ | ✅ | ✅ | ✅ | -| [SETTINGS.DoNotAdvise](#settingsdonotadvise) | ❌ | ✅ | ✅ | ✅ | ✅ | -| [SETTINGS.EnableStatusIcons](#settingsenablestatusicons) | ❌ | ❌ | ❌ | ❌ | ✅ | -| [SETTINGS.EnableStatusIconsHint](#settingsenablestatusiconshint) | ❌ | ❌ | ❌ | ❌ | ✅ | -| [SETTINGS.LetKeeperDecide](#settingsletkeeperdecide) | ❌ | ✅ | ✅ | ✅ | ✅ | -| [SETTINGS.NeverEditable](#settingsnevereditable) | ❌ | ✅ | ✅ | ✅ | ✅ | -| [SETTINGS.OneBlockBackStory](#settingsoneblockbackstory) | ❌ | ✅ | ✅ | ✅ | ✅ | -| [SETTINGS.OneBlockBackStoryHint](#settingsoneblockbackstoryhint) | ❌ | ✅ | ✅ | ✅ | ✅ | -| [SETTINGS.OpposedRollTieBreaker](#settingsopposedrolltiebreaker) | ❌ | ✅ | ✅ | ✅ | ✅ | -| [SETTINGS.OpposedRollTieBreakerHint](#settingsopposedrolltiebreakerhint) | ❌ | ✅ | ✅ | ✅ | ✅ | -| [SETTINGS.OverrideSheetArtwork](#settingsoverridesheetartwork) | ❌ | ✅ | ✅ | ✅ | ✅ | -| [SETTINGS.OverrideSheetArtworkHint](#settingsoverridesheetartworkhint) | ❌ | ✅ | ✅ | ✅ | ✅ | -| [SETTINGS.PlayerUnlockSheetMode](#settingsplayerunlocksheetmode) | ❌ | ✅ | ✅ | ✅ | ✅ | -| [SETTINGS.SelfRollWhisperTarget](#settingsselfrollwhispertarget) | ❌ | ✅ | ✅ | ✅ | ✅ | -| [SETTINGS.SelfRollWhisperTargetHint](#settingsselfrollwhispertargethint) | ❌ | ✅ | ✅ | ✅ | ✅ | -| [SETTINGS.StanbyGMRolls](#settingsstanbygmrolls) | ❌ | ❌ | ❌ | ❌ | ❌ | -| [SETTINGS.StanbyGMRollsHint](#settingsstanbygmrollshint) | ❌ | ❌ | ❌ | ❌ | ❌ | -| [SETTINGS.TitleChatCards](#settingstitlechatcards) | ❌ | ❌ | ❌ | ❌ | ❌ | -| [SETTINGS.TitleDeveloperDebug](#settingstitledeveloperdebug) | ❌ | ❌ | ❌ | ❌ | ❌ | -| [SETTINGS.TitleDiceSoNice](#settingstitledicesonice) | ❌ | ❌ | ❌ | ❌ | ❌ | -| [SETTINGS.TitleInitiative](#settingstitleinitiative) | ❌ | ❌ | ❌ | ❌ | ❌ | -| [SETTINGS.TitleRoll](#settingstitleroll) | ❌ | ❌ | ❌ | ❌ | ❌ | -| [SETTINGS.TitleRollTable](#settingstitlerolltable) | ❌ | ❌ | ❌ | ❌ | ❌ | -| [SETTINGS.TitleRules](#settingstitlerules) | ❌ | ❌ | ❌ | ❌ | ❌ | -| [SETTINGS.TitleScene](#settingstitlescene) | ❌ | ❌ | ❌ | ❌ | ❌ | -| [SETTINGS.TitleSheet](#settingstitlesheet) | ❌ | ❌ | ❌ | ❌ | ❌ | -| [SETTINGS.TitleWeapon](#settingstitleweapon) | ❌ | ❌ | ❌ | ❌ | ❌ | -| [SETTINGS.developmentRollForLuck](#settingsdevelopmentrollforluck) | ❌ | ✅ | ❌ | ❌ | ✅ | -| [SETTINGS.developmentRollForLuckHint](#settingsdevelopmentrollforluckhint) | ❌ | ✅ | ❌ | ❌ | ✅ | -| [SETTINGS.displayPlayerNameOnSheet](#settingsdisplayplayernameonsheet) | ❌ | ❌ | ❌ | ❌ | ✅ | - -##### CoC7.ActorImporter - -`"CoC7.ActorImporter": "Actor Importer",` - -##### CoC7.ActorImporterSummary - -`"CoC7.ActorImporterSummary": "Import an NPC or Creature from description and stats. Just paste the corresponding plain text",` - -##### CoC7.AdvantageAttacker - -`"CoC7.AdvantageAttacker": "Advantage: Attacker",` - -##### CoC7.AdvantageDefender - -`"CoC7.AdvantageDefender": "Advantage: Defender",` - -##### CoC7.All - -`"CoC7.All": "All",` - -##### CoC7.AlreadyInABout - -`"CoC7.AlreadyInABout": "You're already suffering a bout of madness and are immune to further loss of sanity.",` - -##### CoC7.AlreadyLost - -`"CoC7.AlreadyLost": "Already lost",` - -##### CoC7.AlreadyUnderlyingInsanity - -`"CoC7.AlreadyUnderlyingInsanity": "Investigator already in an underlying insanity state.",` - -##### CoC7.Any - -`"CoC7.Any": "Any",` - -##### CoC7.ArmedVehicle - -`"CoC7.ArmedVehicle": "Armed Vehicle",` - -##### CoC7.ArmorAbsorbsDamage - -`"CoC7.ArmorAbsorbsDamage": "Armor absorbs total damage",` - -##### CoC7.ArmourPlating - -`"CoC7.ArmourPlating": "Armour plating",` - -##### CoC7.AttackSuccess - -`"CoC7.AttackSuccess": "{name} landed a blow.",` - -##### CoC7.Attribute - -`"CoC7.Attribute": "Attribute",` - -##### CoC7.Attributes - -`"CoC7.Attributes": "Attributes",` - -##### CoC7.AutomaticFire - -`"CoC7.AutomaticFire": "Automatic Fire",` - -##### CoC7.Blind - -`"CoC7.Blind": "Blind",` - -##### CoC7.BookHasNothingMoreToTeach - -`"CoC7.BookHasNothingMoreToTeach": "{book} has nothing more to teach. Cthulhu Mythos skill of {actor} is greater than this Mythos Rating.",` - -##### CoC7.BoutActive - -`"CoC7.BoutActive": "(Bout) Immune to SAN loss",` - -##### CoC7.BoutOfMadness - -`"CoC7.BoutOfMadness": "Bout of madness",` - -##### CoC7.BoutOfMadnessName - -`"CoC7.BoutOfMadnessName": "Bout of Madness",` - -##### CoC7.BoutOfMadnesslasted - -`"CoC7.BoutOfMadnesslasted": "Your bout of madness lasted",` - -##### CoC7.BoutRealTime - -`"CoC7.BoutRealTime": "Bout of madness: Real time",` - -##### CoC7.BoutSummary - -`"CoC7.BoutSummary": "Bout of madness: Summary",` - -##### CoC7.BurstSizeHint - -`"CoC7.BurstSizeHint": "How many bullets per burst",` - -##### CoC7.Cancel - -`"CoC7.Cancel": "Cancel",` - -##### CoC7.CardResolved - -`"CoC7.CardResolved": "Card resolved",` - -##### CoC7.CharCreationMode - -`"CoC7.CharCreationMode": "Character creation mode",` - -##### CoC7.Characteristic - -`"CoC7.Characteristic": "Characteristic",` - -##### CoC7.Check - -`"CoC7.Check": "Check",` - -##### CoC7.CloseCard - -`"CoC7.CloseCard": "Close card",` - -##### CoC7.Collapse - -`"CoC7.Collapse": "Collapse",` - -##### CoC7.CombinedAllHint - -`"CoC7.CombinedAllHint": "All rolls must succeed",` - -##### CoC7.CombinedAnyHint - -`"CoC7.CombinedAnyHint": "Any roll must succeed",` - -##### CoC7.CombinedRollCard - -`"CoC7.CombinedRollCard": "Combined roll card",` - -##### CoC7.Content - -`"CoC7.Content": "Content",` - -##### CoC7.Convert - -`"CoC7.Convert": "Convert",` - -##### CoC7.ConvertFrom6Edition - -`"CoC7.ConvertFrom6Edition": "Convert from 6 edition",` - -##### CoC7.CopyToClipboard - -`"CoC7.CopyToClipboard": "Copy to clipboard",` - -##### CoC7.CreateLink - -`"CoC7.CreateLink": "Create link",` - -##### CoC7.CreatedImportedCharactersFolder - -`"CoC7.CreatedImportedCharactersFolder": "Created 'Imported Characters' folder'",` - -##### CoC7.Creature - -`"CoC7.Creature": "Creature",` - -##### CoC7.CreatureMaxLoss - -`"CoC7.CreatureMaxLoss": "Creature max loss",` - -##### CoC7.Crew - -`"CoC7.Crew": "Crew",` - -##### CoC7.Critical - -`"CoC7.Critical": "Critical",` - -##### CoC7.CriticalTitle - -`"CoC7.CriticalTitle": "The blow is critical",` - -##### CoC7.CustomLabel - -`"CoC7.CustomLabel": "Custom label",` - -##### CoC7.DailyLoss - -`"CoC7.DailyLoss": "Daily",` - -##### CoC7.DamageInflicted - -`"CoC7.DamageInflicted": "Damage inflicted",` - -##### CoC7.DealDamage - -`"CoC7.DealDamage": "Deal {damage} damage points to {target}?",` - -##### CoC7.DevPhase - -`"CoC7.DevPhase": "Development phase",` - -##### CoC7.DevelopAttribWarn - -`"CoC7.DevelopAttribWarn": "You can not access some attributes in development/creation.",` - -##### CoC7.Development - -`"CoC7.Development": "Development",` - -##### CoC7.DifficultyLevel - -`"CoC7.DifficultyLevel": "Difficulty Level",` - -##### CoC7.DisregardMythosGain - -`"CoC7.DisregardMythosGain": "No Mythos gain",` - -##### CoC7.DragSpell - -`"CoC7.DragSpell": "Drag spells here to insert them into the book...",` - -##### CoC7.DriveSpecializationName - -`"CoC7.DriveSpecializationName": "Drive",` - -##### CoC7.DyingCheck - -`"CoC7.DyingCheck": "Check if you'll die immediately",` - -##### CoC7.EmptyItemList - -`"CoC7.EmptyItemList": "Add an item by dropping it here.",` - -##### CoC7.EndBoutOfMadness - -`"CoC7.EndBoutOfMadness": "End bout of madness",` - -##### CoC7.English - -`"CoC7.English": "English",` - -##### CoC7.EnteringBoutOfMadness - -`"CoC7.EnteringBoutOfMadness": "You experience a bout of madness",` - -##### CoC7.Entities.Archetype - -`"CoC7.Entities.Archetype": "Archetype",` - -##### CoC7.Entities.Book - -`"CoC7.Entities.Book": "Book",` - -##### CoC7.Entities.Character - -`"CoC7.Entities.Character": "Character",` - -##### CoC7.Entities.Chase - -`"CoC7.Entities.Chase": "Chase",` - -##### CoC7.Entities.Creature - -`"CoC7.Entities.Creature": "Creature",` - -##### CoC7.Entities.Item - -`"CoC7.Entities.Item": "Item",` - -##### CoC7.Entities.Npc - -`"CoC7.Entities.Npc": "NPC",` - -##### CoC7.Entities.Occupation - -`"CoC7.Entities.Occupation": "Occupation",` - -##### CoC7.Entities.Setup - -`"CoC7.Entities.Setup": "Setup",` - -##### CoC7.Entities.Skill - -`"CoC7.Entities.Skill": "Skill",` - -##### CoC7.Entities.Spell - -`"CoC7.Entities.Spell": "Spell",` - -##### CoC7.Entities.Status - -`"CoC7.Entities.Status": "Status",` - -##### CoC7.Entities.Talent - -`"CoC7.Entities.Talent": "Talent",` - -##### CoC7.Entities.Vehicle - -`"CoC7.Entities.Vehicle": "Vehicle",` - -##### CoC7.Entities.Weapon - -`"CoC7.Entities.Weapon": "Weapon",` - -##### CoC7.Expand - -`"CoC7.Expand": "Expand",` - -##### CoC7.FakeRoll - -`"CoC7.FakeRoll": "Send a decoy roll to players",` - -##### CoC7.FlatDiceModifier - -`"CoC7.FlatDiceModifier": "Flat dice modifier",` - -##### CoC7.FlatModifier - -`"CoC7.FlatModifier": "Flat modifier",` - -##### CoC7.French - -`"CoC7.French": "French",` - -##### CoC7.FullStudies - -`"CoC7.FullStudies": "Full Studies",` - -##### CoC7.Gains - -`"CoC7.Gains": "Gains",` - -##### CoC7.GainsForReading - -`"CoC7.GainsForReading": "Skill gains for reading {book}.",` - -##### CoC7.GmNotes - -`"CoC7.GmNotes": "GM's notes",` - -##### CoC7.GmTools - -`"CoC7.GmTools": "Keeper's tools",` - -##### CoC7.GoodForAsylum - -`"CoC7.GoodForAsylum": "You're good to be sent to the asylum",` - -##### CoC7.GrowingAccustomedToAwfulness - -`"CoC7.GrowingAccustomedToAwfulness": "Your getting used to horror. (Your sanity loss is limited).",` - -##### CoC7.Guess - -`"CoC7.Guess": "Guess",` - -##### CoC7.HowToTranslateEnableTranslation - -`"CoC7.HowToTranslateEnableTranslation": "Inside the Game World, under Configuration/Manage Modules activate both Babele and the translations.",` - -##### CoC7.HowToTranslateInstallBabele - -`"CoC7.HowToTranslateInstallBabele": "Install/Update Babele module from Foundry's module manager.",` - -##### CoC7.HowToTranslateInstallTranslation - -`"CoC7.HowToTranslateInstallTranslation": "Install/Update Translation from Foundry's module manager.",` - -##### CoC7.HowToTranslateNoTranslation - -`"CoC7.HowToTranslateNoTranslation": "Instructions for creating new language translations are available on existing translation modules.",` - -##### CoC7.HowToTranslateTitle - -`"CoC7.HowToTranslateTitle": "How to translate?",` - -##### CoC7.HowToTranslateWarning - -`"CoC7.HowToTranslateWarning": "Do not install any modules you do not trust.",` - -##### CoC7.Icon - -`"CoC7.Icon": "Icon",` - -##### CoC7.ImmuneToAwfulness - -`"CoC7.ImmuneToAwfulness": "Your mind is immune to this awfulness. (No sanity loss).",` - -##### CoC7.Impale - -`"CoC7.Impale": "Impale",` - -##### CoC7.ImpaleTitle - -`"CoC7.ImpaleTitle": "The weapon can impale",` - -##### CoC7.Import - -`"CoC7.Import": "Import",` - -##### CoC7.ImportedUnnamedCharacter - -`"CoC7.ImportedUnnamedCharacter": "Imported unnamed character",` - -##### CoC7.IndefinitelyInsane - -`"CoC7.IndefinitelyInsane": "You become indefinitely insane.",` - -##### CoC7.InitialReading - -`"CoC7.InitialReading": "Initial Reading",` - -##### CoC7.InitialReadingNeeded - -`"CoC7.InitialReadingNeeded": "{actor} needs to perform an Initial Reading on {book} to be able to advance through Full Study progress.",` - -##### CoC7.InsanityName - -`"CoC7.InsanityName": "Insanity",` - -##### CoC7.InsanityType - -`"CoC7.InsanityType": "Type of insanity",` - -##### CoC7.IntCheck - -`"CoC7.IntCheck": "Intelligence check",` - -##### CoC7.InvestigatorManiaGained - -`"CoC7.InvestigatorManiaGained": "The investigator gain a mania",` - -##### CoC7.InvestigatorPhobiaGained - -`"CoC7.InvestigatorPhobiaGained": "The investigator gain a phobia",` - -##### CoC7.InvoluntaryAction - -`"CoC7.InvoluntaryAction": "Involuntary action",` - -##### CoC7.InvoluntaryActionPerfomed - -`"CoC7.InvoluntaryActionPerfomed": "Involuntary action performed",` - -##### CoC7.InvoluntaryActionPerformed - -`"CoC7.InvoluntaryActionPerformed": "You lost self-control for a moment.",` - -##### CoC7.ItemWeapon - -`"CoC7.ItemWeapon": "Item (Weapon)",` - -##### CoC7.KeepData - -`"CoC7.KeepData": "Keep creature's data",` - -##### CoC7.KeeperSentDecoy - -`"CoC7.KeeperSentDecoy": "Decoy roll sent to players",` - -##### CoC7.Label - -`"CoC7.Label": "Label",` - -##### CoC7.LearnSpellAttempt - -`"CoC7.LearnSpellAttempt": "Attempt to learn spell {spell}, from {book}.",` - -##### CoC7.LinkCheckDiff - -`"CoC7.LinkCheckDiff": "[{difficulty}] {name} check",` - -##### CoC7.LinkCheckDiffModif - -`"CoC7.LinkCheckDiffModif": "[{difficulty}] {name} check({modifier})",` - -##### CoC7.LinkCheckModif - -`"CoC7.LinkCheckModif": " {name} check({modifier})",` - -##### CoC7.LinkItem - -`"CoC7.LinkItem": " {name}",` - -##### CoC7.LinkItemDiff - -`"CoC7.LinkItemDiff": "[{difficulty}] {name}",` - -##### CoC7.LinkItemDiffModif - -`"CoC7.LinkItemDiffModif": "[{difficulty}] {name} ({modifier})",` - -##### CoC7.LinkItemModif - -`"CoC7.LinkItemModif": " {name} ({modifier})",` - -##### CoC7.LinkSanLossDiff - -`"CoC7.LinkSanLossDiff": "[{difficulty}] SAN loss ({sanMin}/{sanMax})",` - -##### CoC7.LinkSanLossDiffModif - -`"CoC7.LinkSanLossDiffModif": "[{difficulty}] SAN loss({modifier}) ({sanMin}/{sanMax})",` - -##### CoC7.LinkSanLossModif - -`"CoC7.LinkSanLossModif": " SAN loss({modifier}) ({sanMin}/{sanMax})",` - -##### CoC7.Location - -`"CoC7.Location": "Location",` - -##### CoC7.LuckIncreased - -`"CoC7.LuckIncreased": "Luck recovered ({die}/{score}) by {augment} points",` - -##### CoC7.LuckNotIncreased - -`"CoC7.LuckNotIncreased": "Luck NOT recovered ({die}/{score})",` - -##### CoC7.Mania - -`"CoC7.Mania": "Mania",` - -##### CoC7.ManiaGained - -`"CoC7.ManiaGained": "You gain a mania",` - -##### CoC7.MarkedForDevelopment - -`"CoC7.MarkedForDevelopment": "Marked for development",` - -##### CoC7.MaxLossToCreature - -`"CoC7.MaxLossToCreature": "Max loss to this creature",` - -##### CoC7.MaxSanloss - -`"CoC7.MaxSanloss": "Max loss",` - -##### CoC7.MemoryRepressed - -`"CoC7.MemoryRepressed": "Your mind repressed the memory and buried it in your subconscious.",` - -##### CoC7.MessageBoutOfMadnessItemNotFound - -`"CoC7.MessageBoutOfMadnessItemNotFound": "The result from the madness table was not found, please check all your statuses are created",` - -##### CoC7.MessageBoutOfMadnessTableNotFound - -`"CoC7.MessageBoutOfMadnessTableNotFound": "The result from the madness table was not found, please check all your roll tables are created",` - -##### CoC7.MessageCheckRequestedWait - -`"CoC7.MessageCheckRequestedWait": "Your keeper is requesting a {check}.
        Wait before clicking!
        ",` - -##### CoC7.MessageSelectSingleUserForTarget - -`"CoC7.MessageSelectSingleUserForTarget": "This token is controlled by multiple users, please select which user can respond to this attack.",` - -##### CoC7.MessageSelectedTargetIsNotControlled - -`"CoC7.MessageSelectedTargetIsNotControlled": "The token for {name} is owned by not controlled by a player so will not be able to react to combat actions.",` - -##### CoC7.MessageTargetCheckRequested - -`"CoC7.MessageTargetCheckRequested": "Your keeper is requesting a {check} for {name}.",` - -##### CoC7.MessageTitleSelectSingleUserForTarget - -`"CoC7.MessageTitleSelectSingleUserForTarget": "Which user can respond to this attack",` - -##### CoC7.Migrate.ButtonOkay - -`"CoC7.Migrate.ButtonOkay": "Okay",` - -##### CoC7.Migrate.ButtonSkip - -`"CoC7.Migrate.ButtonSkip": "Skip",` - -##### CoC7.Migrate.ButtonUpdate - -`"CoC7.Migrate.ButtonUpdate": "Update",` - -##### CoC7.Migrate.GMRequired - -`"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.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: '
        \n' + html + '\n
        ' + } + + dbFile.push(JSON.stringify(dbEntry)) + + let mdFile = input + .replace(/\n.\n/g, '\n') + .replace(/\[(fas fa-[^\]]+|game-icon game-icon-[^\]]+)\]/g, '') + .replace(/@@coc7./g, '@coc7.') + + const compendiumLinks = mdFile.matchAll( + /@Compendium\[(?[^\]]+)\.(?[^\\.]+)\]{(?[^}]+)}/g + ) + for (const link of compendiumLinks) { + if (link.groups.pack !== 'CoC7.system-doc') { + mdFile = mdFile.replace(link[0], '[_' + link.groups.name + '_]') + } else { + mdFile = mdFile.replace( + link[0], + '[' + + link.groups.name + + '](' + + sources[link.groups.id].file + + ')' + ) + } + } + + write('./docs/' + sources[id].lang + '/' + sources[id].file, mdFile) + } catch (e) { + console.log('EXCEPTION:', e) + } +} + +write('./packs/system-doc.db', dbFile.join('\n')) diff --git a/generate-translations.js b/generate-translations.js index 868f6401..007785f3 100644 --- a/generate-translations.js +++ b/generate-translations.js @@ -1,9 +1,11 @@ +import { deleteAsync } from 'del' import glob from './node_modules/glob/glob.js' import jsonfile from './node_modules/jsonfile/index.js' import write from './node_modules/write/index.js' const unordered = {} let missing = [] +const abandoned = {} const source = jsonfile.readFileSync('./lang/en.json') const keys = Object.keys(source) @@ -13,8 +15,13 @@ glob('./lang/*.json', {}, async function (er, files) { const lang = filename.replace(/^(.+\/)([a-zA-Z0-9-]+)(\.json)$/, '$2') if (lang !== 'en') { const json = jsonfile.readFileSync(filename) - unordered[lang] = keys.filter(x => !Object.keys(json).includes(x)) - missing = missing.concat(unordered[lang]) + const missingKeys = keys.filter(x => !Object.keys(json).includes(x)) + if (missingKeys.length < 200) { + unordered[lang] = missingKeys + missing = missing.concat(unordered[lang]) + } else { + abandoned[lang] = missingKeys + } } }) ) @@ -55,6 +62,13 @@ glob('./lang/*.json', {}, async function (er, files) { complete.join() + '** translation is currently up to date\n\n' } + if (Object.keys(abandoned).length > 0) { + output = + output + + 'The following translations have been abandoned **' + + Object.keys(abandoned).join('**, **') + + '**, [are you able to help?](./ABANDONED.md)\n\n' + } if (missing.length > 0) { output = output + '|Key|' Object.entries(langs).forEach(([key, value]) => { @@ -101,4 +115,40 @@ glob('./lang/*.json', {}, async function (er, files) { output = output + anchors } write('./.github/TRANSLATIONS.md', output) + if (Object.keys(abandoned).length > 0) { + output = '' + output = output + '# Abandoned Translations.\n\n' + output = + output + + 'Thank you for being interested in making Call of Cthulhu 7th Edition for Foundry VTT better!' + output = + output + + ' Below is a list of translations keys on existing files that still need translated, based on `en.json`.\n\n' + Object.entries(abandoned).forEach(([key, values]) => { + output = + output + + '[' + + key + + '.json](#' + + (key + '.json').toLowerCase().replace(/[^a-zA-Z0-9]+/g, '') + + ')\n\n' + }) + output = output + '\n' + Object.entries(abandoned).forEach(([key, values]) => { + output = output + '## ' + key + '.json\n```\n' + values.forEach(sourceKey => { + output = + output + + '"' + + sourceKey + + '": "' + + source[sourceKey].replace(/\n/g, '\\n') + + '",\n' + }) + output = output.substr(0, output.length - 2) + '\n```\n' + }) + write('./.github/ABANDONED.md', output) + } else { + deleteAsync('./.github/ABANDONED.md') + } }) diff --git a/lang/cn.json b/lang/cn.json index 92b96652..002fa7dc 100644 --- a/lang/cn.json +++ b/lang/cn.json @@ -1,8 +1,27 @@ { "CoC7.title": "克苏鲁的呼唤 第7版", + "CoC7.Entities.Character": "角色", + "CoC7.Entities.Container": "容器", + "CoC7.Entities.Creature": "生物", + "CoC7.Entities.Npc": "NPC", + "CoC7.Entities.Vehicle": "载具", + + "CoC7.Entities.Archetype": "原型", + "CoC7.Entities.Book": "书籍", + "CoC7.Entities.Chase": "追逐", + "CoC7.Entities.Item": "道具", + "CoC7.Entities.Occupation": "职业", + "CoC7.Entities.Setup": "设置", + "CoC7.Entities.Skill": "技能", + "CoC7.Entities.Spell": "法术", + "CoC7.Entities.Status": "状态", + "CoC7.Entities.Talent": "人才", + "CoC7.Entities.Weapon": "武器", + "CHARAC.STR": "力量", "CHARAC.Strengh": "力量", + "CHARAC.Strength": "力量", "CHARAC.CON": "体质", "CHARAC.Constitution": "体质", "CHARAC.SIZ": "体型", @@ -17,9 +36,9 @@ "CHARAC.Power": "意志", "CHARAC.EDU": "教育", "CHARAC.Education": "教育", - + "CoC7.PlayerName": "玩家", "CoC7.Name": "名字", - "CoC7.Archetype": "Archetype", + "CoC7.Archetype": "原型", "CoC7.Occupation": "职业", "CoC7.Age": "年龄", "CoC7.Sex": "性别", @@ -34,6 +53,7 @@ "CoC7.Sanity": "理智", "CoC7.SAN": "SAN", "CoC7.DailySanLoss": "当日损失San值 :", + "CoC7.DailyLoss": "每日", "CoC7.Luck": "幸运", "CoC7.Movement": "移动力", "CoC7.Mov": "Mov", @@ -41,6 +61,7 @@ "CoC7.DB": "DB", "CoC7.Build": "体格", "CoC7.Skills": "技能", + "CoC7.Skill": "技能", "CoC7.Combat": "战斗", "CoC7.Possessions": "装备 & 资产", "CoC7.Background": "背景故事", @@ -50,10 +71,13 @@ "CoC7.Unconsious": "昏迷", "CoC7.CriticalWounds": "重伤", "CoC7.Dying": "濒死", + "CoC7.DyingCheck": "检查是否你会立即死亡", "CoC7.Dead": "死亡", "CoC7.Resist": "抵抗", + "CoC7.UnderlyingInsanity": "潜在疯狂", "CoC7.TemporaryInsanity": "临时性疯狂", "CoC7.IndefiniteInsanity": "不定性疯狂", + "CoC7.NotInsane": "无", "CoC7.UnlockActor": "解锁角色", "CoC7.LockActor": "锁定角色", "CoC7.NpcRollCharacteristics": "Roll 品质/性能/特质", @@ -66,12 +90,49 @@ "CoC7.Spells": "咒文", "CoC7.Spell": "咒文", "CoC7.Spells&Notes": "咒文 & 笔记", + "CoC7.Weapons": "武器", "CoC7.Effects": "效果", - "CoC7.Cost": "Cost", + "CoC7.Cost": "消耗", "CoC7.Source": "来源", "CoC7.SpellDetails": "咒文详情", "CoC7.Details": "详情", "CoC7.Other": "其他", + "CoC7.rounds": "回合(s)", + "CoC7.hours": "小时(s)", + "CoC7.weeks": "周(s)", + "CoC7.remove": "删除", + "CoC7.Any": "任一", + "CoC7.All": "全部", + "CoC7.Success": "成功", + "CoC7.CustomLabel": "自定义标签", + "CoC7.SpecificLocations": "具体位置", + "CoC7.ArmourPlating": "护甲镀层", + "CoC7.Location": "位置", + "CoC7.Properties": "属性", + "CoC7.Attributes": "特性", + "CoC7.Attribute": "特性", + "CoC7.Collapse": "折叠", + "CoC7.Expand": "展开", + "CoC7.Blind": "不说明难度", + "CoC7.Label": "标签", + "CoC7.Icon": "图标", + "CoC7.Check": "检定", + "CoC7.ItemWeapon": "物品 (武器)", + "CoC7.AttacksPerRound": "每轮攻击次数", + + "CoC7.Cast": "施法", + "CoC7.SanityCost": "理智消耗", + "CoC7.PowerCost": "意志消耗", + "CoC7.HitPointsCost": "生命值消耗", + "CoC7.MagicPointsCost": "法力值消耗", + "CoC7.OtherCosts": "其他消耗", + "CoC7.CastingSpell": "施放 {spell}.", + "CoC7.NotEnoughMagicPoints": "{spell} 消耗 {originalMagicPoints} 法力值, 但你只有 {actorMagicPoints} 点. 你希望转换你 {convertedHitPoints} 点的HP吗? 这样的话, 你会受到 {convertedHitPoints} 伤害.", + + "CoC7.CopyToClipboard": "复制到剪贴板", + "CoC7.WhisperToSelection": "私信已选定的token", + "CoC7.WhisperTo": "私信到", + "CoC7.SendToChat": "发送到聊天记录", "CoC7.RegularSuccess": "普通 成功", "CoC7.HardSuccess": "困难 成功", @@ -84,6 +145,7 @@ "CoC7.Dice": "骰子", "CoC7.DiceModifierBonus": "奖励", "CoC7.DiceModifierPenalty": "惩罚", + "CoC7.Modifiers": "调整值", "CoC7.BonusDice": "奖励骰", "CoC7.UnitsDie": "个位骰", "CoC7.TensDie": "十位骰", @@ -91,23 +153,31 @@ "CoC7.SuccessRequired": "{successRequired} 成功需要.", "CoC7.Roll": "Roll", "CoC7.Pushing": "进行 孤注一掷", + "CoC7.PushingSkill": ": 对技能孤注一掷!", "CoC7.PushSkill": "孤注一掷", "CoC7.PushedRoll": "(孤注一掷)", "CoC7.SpendLuck": "燃烧 {luckNeededValue} 幸运 通过检定", - "CoC7.LuckSpent": "{luckAmount} 侥幸通过", + "CoC7.LuckSpent": "花费 {luckAmount} 幸运通过", + "CoC7.LuckSpentAlt": "花费幸运", "CoC7.LuckError": "{actorName} 幸运检定失败", "CoC7.check.AutoSuccess": "自动成功", "CoC7.check.AutoFailure": "自动失败", - "CoC7.check.RevealCheck": "显示检定", + "CoC7.RevealCheck": "显示检定", + "CoC7.RevealSanLoss": "显示 SAN 丢失", "CoC7.check.ForcePass": "强制成功", "CoC7.check.ForceFail": "强制失败", "CoC7.check.FlagForDevelopment": "技能成长标记", - "CoC7.check.IncreaseSuccessLevel": "增加成功", + "CoC7.IncreaseSuccessLevel": "提升成功", "CoC7.check.DecreaseSuccessLevel": "减少成功", + "CoC7.RollSecretDice": "Keeper 私下掷了一些骰子", + "CoC7.KeeperSentDecoy": "向玩家們假裝在KP暗骰", + "CoC7.FakeRoll": "向玩家們假裝在KP暗骰", "CoC7.ConstitutionCheck": "体质检定", + "CoC7.SanDataSelectionWindow": "选择 SAN 损失", "CoC7.BonusSelectionWindow": "选择难度窗口", + "CoC7.BonusSelectionWindowNamed": "选择 {name}检定的调整值", "CoC7.SkillDetailsWindow": "技能详情窗口", "CoC7.RegularDifficulty": "普通", "CoC7.HardDifficulty": "困难", @@ -115,25 +185,47 @@ "CoC7.CriticalDifficulty": "大", "CoC7.UnknownDifficulty": "未知", "CoC7.RollDifficulty": "检定 难度", + "CoC7.RollThreshold": "鉴定阈值", + "CoC7.FlatDiceModifier": "骰子调整值", + "CoC7.FlatModifier": "技能调整值", "CoC7.RollDifficultyUnknown": "未知 难度", "CoC7.RollDifficultyRegular": "常规 难度", "CoC7.RollDifficultyHard": "困难 难度", "CoC7.RollDifficultyExtreme": "极难 难度", "CoC7.RollDifficultyCritical": "大成功 难度", "CoC7.RollResult.LuckSpendText": "燃烧 {luckAmount} 幸运, {successLevel} 成功", - "CoC7.RollDice": "Roll !", - "CoC7.SuccesLevelHint": "{value} level(s) of 成功", - "CoC7.FailureLevelHint": "失败 by {value} level(s)", + "CoC7.RollDice": "掷骰 !", + "CoC7.CreateLink": "创建连接", + "CoC7.SuccesLevelHint": "以 {value} 成功", + "CoC7.FailureLevelHint": "以 {value} 失败", + "CoC7.CombinedRollCard": "合并检定卡", + "CoC7.OpposedRollCard": "对抗检定卡", + "CoC7.CombinedAnyHint": "任意投掷必定成功", + "CoC7.CombinedAllHint": "所有投掷必定成功", + "CoC7.CloseCard": "关闭卡片", "CoC7.CheckResult": "{name} 检定 ({value}%) - {difficulty} 难度", "CoC7.ItemCheckResult": "{item} - {skill} 检定 ({value}%) - {difficulty} 难度", "CoC7.CheckRawValue": "({rawvalue}%) - {difficulty} 难度", - "CoC7.BonusDamageRoll": "Rolling 伤害加成", + "CoC7.ArmorAbsorbsDamage": "护甲总共吸收的伤害", + "CoC7.Critical": "大成功", + "CoC7.Impale": "贯穿伤害", + "CoC7.CriticalTitle": "致命一击", + "CoC7.ImpaleTitle": "贯穿武器", + "CoC7.Target": "目标", + "CoC7.TargetOutOfRange": "目标在射程外", + "CoC7.NoTargetToDamage": "没有可以施加伤害的目标", + "CoC7.ShotIsImpossible": "不可能进行射击", + "CoC7.OutOfAmmo": "弹药耗尽", + "CoC7.OutOfShots": "连射达到上限", + + "CoC7.BonusDamageRoll": "投掷伤害加成", "CoC7.Type": "类型", "CoC7.FightBack": "反击", "CoC7.Dodge": "闪避", "CoC7.Maneuver": "战技", + "CoC7.NoResponse": "没有反应", "CoC7.OutNumbered": "寡不敌众", "CoC7.combatCard.surprised": "先发制人", "CoC7.combatCard.autoSuccess": "自动成功", @@ -145,15 +237,23 @@ "CoC7.TitleSurprised": "目标没有发现偷袭 获得 1个 奖励骰 ", "CoC7.TitleAutoSuccess": "攻击自动成功", "CoC7.WinnerRollDamage": "{name} 胜出. Roll 伤害.", + "CoC7.InitiatorMissed": "{name} missed.", "CoC7.NoWinner": "没有胜者.", "CoC7.DodgeSuccess": "{name} 闪避成功!", "CoC7.ManeuverSuccess": "{name} 战技成功!.", + "CoC7.AttackSuccess": "{name} 受到打击.", "CoC7.InflictPain": "造成疼痛", + "CoC7.AdvantageAttacker": "优势:攻击者", + "CoC7.AdvantageDefender": "优势:防御者", + "CoC7.Tie": "平手", + "CoC7.DamageInflicted": "造成伤害", + "CoC7.TotalDamage": "总伤害", "CoC7.combatCard.dive4cover": "寻找掩体", "CoC7.rangeCombatCard.SingleShot": "单发", "CoC7.rangeCombatCard.MultipleShots": "多发", + "CoC7.AutomaticFire": "全自动武器", "CoC7.rangeCombatCard.Burst": "三点射击", "CoC7.rangeCombatCard.FullAuto": "全自动", "CoC7.rangeCombatCard.BaseRange": "基础射程", @@ -162,29 +262,47 @@ "CoC7.rangeCombatCard.OutOfRange": "射程外", "CoC7.rangeCombatCard.Cover": "在掩体内的目标", "CoC7.rangeCombatCard.PointBlankRange": "零距离", + "CoC7.rangeCombatCard.NormalTarget": "普通目标", "CoC7.rangeCombatCard.BigTarget": "大型目标", "CoC7.combatCard.SmallTarget": "小型目标", "CoC7.rangeCombatCard.FastMovingTarget": "快速移动的目标", "CoC7.rangeCombatCard.InMelee": "近身战斗", "CoC7.rangeCombatCard.aiming": "瞄准目标", - "CoC7.rangeCombatDamage": "{name} takes {total} 点伤害", + "CoC7.rangeCombatDamage": "{name} 受到 {total} 点伤害", + "CoC7.rangeCombatDamageArmor": "{name} 受到 {total} 点伤害. ({armor} 点被护甲抵消)", "CoC7.RollDamage": "Roll 伤害", "CoC7.BulletsFired": "子弹射击", "CoC7.Shots": "射击", "CoC7.Shoot": "射击", + "CoC7.ShotBullets": "向目标 {actor} 发射 {bullets} 发子弹 .", + "CoC7.ShotVoley": "正在向目标 {actor} 发射 一排 {bullets} 发子弹.", + "CoC7.rangeCombatCard.AimingTitle": "瞄准一轮,增加一个奖励骰", + "CoC7.rangeCombatCard.CoverTitle": "1个惩罚骰。目标于掩体中或找到掩体。", + "CoC7.rangeCombatCard.PointBlankRangeTitle": "1个奖励骰。抵近射击。", + "CoC7.rangeCombatCard.BigTargetTitle": "1个奖励骰,大型目标。 (体格 > 4)", + "CoC7.rangeCombatCard.SmallTargetTitle": "1个惩罚骰,小型目标。", + "CoC7.rangeCombatCard.NormalTargetTitle": "目标体型是正常大小,没有奖励或惩罚骰。", + "CoC7.rangeCombatCard.InMeleeTitle": "1个惩罚骰,目标以近战进攻。", + "CoC7.rangeCombatCard.FastMovingTargetTitle": "1个惩罚骰,目标速度太快,并以全速移动中(Mov 8+)", + + "CoC7.meleeCombatDamageTakes": "受到", + "CoC7.meleeCombatDamageFrom": "由", + "CoC7.meleeCombatDamageDeals": "造成", + "CoC7.meleeCombatDamageWith": "与", + + "CoC7.DropZone": "拖拉区域", - "CoC7.DropZone": "DropZone", - + "CoC7.Value": "价格", "CoC7.SkillValue": "技能 值", "CoC7.SkillBase": "基础成功率", - "CoC7.BaseSkillValue": "基础 技能 值", + "CoC7.BaseSkillValue": "基础技能值", "CoC7.SkillExperience": "经历", - "CoC7.SkillArchetype": "Archetype", + "CoC7.SkillArchetype": "原型", "CoC7.SkillOccupation": "职业", "CoC7.SkillPersonal": "兴趣", "CoC7.SkillTotalExperience": "经历点", - "CoC7.SkillTotalArchetype": "Archetype points", + "CoC7.SkillTotalArchetype": "原型点数", "CoC7.SkillTotalOccupation": "职业点", "CoC7.SkillTotalPersonal": "兴趣点", "CoC7.CharacteristicsPoints": "角色属性点", @@ -194,14 +312,17 @@ "CoC7.ItemWeight": "重量", "CoC7.ItemDetails": "详细", "CoC7.Description": "说明", + "CoC7.Reload": "鼠标左右键:增加/减少子弹 \n Shift+鼠标左右键:重新上弹/清空弹夹", "CoC7.WeaponRange": "基本射程", "CoC7.WeaponDamage": "伤害", "CoC7.Weapon.BlastRadius": "爆炸半径", "CoC7.WeaponMalfunction": "故障值", "CoC7.WeaponUsesPerRound": "1回合/使用1次", + "CoC7.WeaponUsesPerRoundHint": "每轮攻击次数 (1/3 : 每3轮攻击1次)", "CoC7.WeaponSheet.RoundsPerUse.Info": "需要多少回合来让武器准备", "CoC7.WeaponMax": "最大使用次数/回合", - "CoC7.BurstSize": "Bullets/burst", + "CoC7.BurstSize": "子弹/发射", + "CoC7.BurstSizeHint": "连发子弹数量", "CoC7.WeaponBulletsInMag": "装弹量", "CoC7.WeaponSpecial": "特殊效果", "CoC7.ItemPrice": "价格", @@ -212,9 +333,10 @@ "CoC7.EraDdts": "神秘冰岛", "CoC7.EraGlit": "克苏鲁煤气灯", "CoC7.Era1920": "1920s", - "CoC7.EraPulp": "低俗克苏鲁", + "CoC7.EraPulp": "通俗克苏鲁", "CoC7.EraMdrn": "现代", - "CoC7.Eras": "Cthulhu Flavors", + "CoC7.Eras": "克苏鲁年代", + "CoC7.EraAvailability": "可用性", "CoC7.SkillNoAdjustments": "无调整", "CoC7.SkillNoXpGain": "无法成长", @@ -226,6 +348,7 @@ "CoC7.SkillFirearm": "射击", "CoC7.WeaponRngd": "基本射程", + "CoC7.WeaponProperyManeuver": "战技", "CoC7.WeaponTouch": "接触", "CoC7.WeaponImpl": "贯通", "CoC7.WeaponRare": "稀有", @@ -237,41 +360,53 @@ "CoC7.WeaponAuto": "全自动", "CoC7.WeaponSpcl": "特殊效果", "CoC7.WeaponMont": "搭载", - "CoC7.WeaponDbrl": "二连式", + "CoC7.WeaponDbrl": "双管", "CoC7.WeaponBlst": "冲击", "CoC7.WeaponStun": "眩晕", "CoC7.Weapon.Property.Melee": "近战武器", "CoC7.Weapon.Property.Thrown": "投掷武器", "CoC7.Weapon.Property.Burn": "燃烧", - "CoC7.Weapon.Property.Shotgun": "射击武器", + "CoC7.Weapon.Property.Shotgun": "霰弹枪", - "CoC7.ErrorItem": "无法找到 item", + "CoC7.ErrorItem": "无法找到 道具", "CoC7.ErrorActor": "无法找到 角色卡", - "CoC7.ErrorInvalidFormula": "{value} 不是一个有效的数式", + "CoC7.ErrorInvalidFormula": "{value} 不是一个有效的公式", "CoC7.ErrorInvalid": "无效", - "CoC7.Validate": "validate", + "CoC7.Validate": "应用", "CoC7.Apply": "应用", - "CoC7.NewBioSectionName": "New Section", + "CoC7.NewBioSectionName": "新增章节", "CoC7.DodgeSkillName": "闪避", + "CoC7.CthulhuMythosName": "克苏鲁神话", "CoC7.CreditRatingSkillName": "信用", + "CoC7.DriveAutoSkillName": "自动驾驶", "CoC7.FightingSpecializationName": "近身战斗", "CoC7.FirearmSpecializationName": "射击", + "CoC7.DriveSpecializationName": "驾驶", + "CoC7.PilotSpecializationName": "飞行", "CoC7.AnySpecName": "任何", + "CoC7.BoutOfMadnessName": "疯狂回合", + "CoC7.InsanityName": "疯狂", "CoC7.NewSkillName": "新 技能", "CoC7.AddSkill": "增加 技能", "CoC7.DevelopemmentPhase": "幕间成长", + "CoC7.RecoverLuckPoints": "恢复幸运值", "CoC7.SkillCantGainXp": "技能无法获得经验", "CoC7.SkillUnflagForDevelopement": "去除技能成长标记", "CoC7.SkillFlagForDevelopement": "添加技能成长标记", "CoC7.RollAll4Dev": "为所有技能roll幕间成长", - "CoC7.DevRollTitle": "Rolling {item} for 幕间成长: {die}/{score}%", + "CoC7.RollLuck4Dev": "投掷 幸运成长检定", + "CoC7.DevRollTitle": "为了 {item} 投掷成长检定: {die}/{score}%", "CoC7.DevSuccessDetails": "{item} 成长了 {augment}%", + "CoC7.SanGained": "获得 2d6 ({results} = {sanGained}) 理智,由于以 {skillValue}% 精通了 {skill} ", "CoC7.DevFailureDetails": "{item} 没有成长", - "CoC7.DevSuccess": "{item} 成长 ({die}/{score}%) by {augment}%", + "CoC7.DevSuccess": "{item} 成长了 {augment}% ({die}/{score}%)", "CoC7.DevFailure": "{item} 没有成长 ({die}/{score}%)", + "CoC7.LuckIncreased": "幸运回复 {augment} ({die}/{score}) 点", + "CoC7.LuckNotIncreased": "幸运无法回复 ({die}/{score})", + "CoC7.DevelopAttribWarn": "你不能在成长/创建角色模式中访问某些属性。", "CoC7.SkillDetail": "详情", "CoC7.EditSkill": "编辑技能", "CoC7.DeleteSkill": "删除技能", @@ -281,6 +416,17 @@ "CoC7.AddItem": "增加 道具", "CoC7.EditItem": "编辑 道具", "CoC7.DeleteItem": "删除 道具", + "CoC7.TradeItem": "交易 / 储存物品", + "CoC7.SortBySkillName": "按技能名称排序", + "CoC7.SortBySkillValue": "按技能大小排序", + "CoC7.UncommonSkillsShow": "显示不常见的技能", + "CoC7.UncommonSkillsHide": "隐藏不常见的技能", + + "CoC7.NewBookName": "新书书籍", + "CoC7.AddBook": "添加书籍", + "CoC7.NewSpellName": "新法术", + "CoC7.AddSpell": "添加法术", + "CoC7.AddWeapon": "增加 武器", "CoC7.NewWeaponName": "新的 武器", "CoC7.EditWeapon": "编辑 武器", @@ -291,16 +437,31 @@ "CoC7.WeaponSkill": "使用技能", "CoC7.WeaponSkillAlt": "其他技能", "CoC7.Inventory": "库存", + "CoC7.InventoryIsCurrentlyEmpty": "库存目前是空的.", "CoC7.CharacterDevelopment": "幕间成长", "CoC7.OccupationSkill": "职业技能", - "CoC7.ArchetypeSkill": "Archetype Skill", + "CoC7.ArchetypeSkill": "原型技能", "CoC7.UseFormula": "滚动骰子", "CoC7.EnterFormula": "输入公式", "CoC7.SanRollHint": "为目标进行SAN Check", - "CoC7.NoSkill": "No skill", - "CoC7.AddWeapontHint": "

        {actor} 没有一个 {weapon}.
        你想创建一个吗 ?

        ", - - "CoC7.ManualCreditValues": "收入与财产[手动输入模式]", + "CoC7.SANCheckTitle": "损失SAN值 : {name} ({sanMin}/{sanMax})", + "CoC7.NoSkill": "没有技能", + "CoC7.AddWeapontHint": "

        {actor} 没有 {weapon}.
        你想创建一个吗 ?

        ", + + "CoC7.LinkCheck": " {name} 检定", + "CoC7.LinkCheckDiff": "[{difficulty}] {name} 检定", + "CoC7.LinkCheckModif": " {name} 检定({modifier})", + "CoC7.LinkCheckDiffModif": "[{difficulty}] {name} 检定({modifier})", + "CoC7.LinkSanLoss": "损失SAN值 ({sanMin}/{sanMax})", + "CoC7.LinkSanLossDiff": "[{difficulty}] 损失SAN值 ({sanMin}/{sanMax})", + "CoC7.LinkSanLossModif": " 损失SAN值({modifier}) ({sanMin}/{sanMax})", + "CoC7.LinkSanLossDiffModif": "[{difficulty}] 损失SAN值({modifier}) ({sanMin}/{sanMax})", + "CoC7.LinkItem": " {name}", + "CoC7.LinkItemDiff": "[{difficulty}] {name}", + "CoC7.LinkItemModif": " {name} ({modifier})", + "CoC7.LinkItemDiffModif": "[{difficulty}] {name} ({modifier})", + + "CoC7.ManualCreditValues": "手动输入信誉值", "CoC7.MonetarySymbol": "更改货币单位 :", "CoC7.MonetaryFactor": "倍率 :", "CoC7.AutoCreditValues": "切换到自动计算", @@ -321,15 +482,54 @@ "CoC7.creatureFightingSkill": "近身战斗", + "CoC7.InvoluntaryAction": "非自愿行动", + "CoC7.InvoluntaryActionPerfomed": "已进行非自愿行为", "CoC7.SanityCheck": "理智检定", + "CoC7.IntCheck": "智力检定", + "CoC7.NoSanLoss": "无SAN值损失", "CoC7.SANLoss": "失去的San值", - "CoC7.CMI": "CMI", - "CoC7.CthulhuMythosInitial": "克苏鲁神话泛读值", - "CoC7.CMF": "CMF", - "CoC7.CthulhuMythosFinal": "克苏鲁神话精读值", - "CoC7.Occult": "神秘学", - "CoC7.MythosRating": "神话等级", - "CoC7.StudyTime": "精读时间", + "CoC7.SanityCheckPerformed": "你经历到极为恐怖的事情", + "CoC7.InvoluntaryActionPerformed": "你暂时失去理性", + "CoC7.SanityLost": "已损失SAN值", + "CoC7.MemoryRepressed": "你的思想压抑了这些记忆,并将其埋藏在你的潜意识中。", + "CoC7.RememberEverything": "你记起了所有事情!", + "CoC7.BoutOfMadnesslasted": "你维持临时性疯狂", + "CoC7.EnteringBoutOfMadness": "你进入临时性疯狂", + "CoC7.GrowingAccustomedToAwfulness": "你已习惯活在恐惧当中 (你不再损失SAN)", + "CoC7.ImmuneToAwfulness": "你的思想对这种可怕的事情免疫。 (没有损失SAN)", + "CoC7.InvestigatorPhobiaGained": "调查员患上恐惧症", + "CoC7.PhobiaGained": "你患上恐惧症", + "CoC7.InvestigatorManiaGained": "调查员患上躁狂症", + "CoC7.ManiaGained": "你患上躁狂症", + "CoC7.AlreadyUnderlyingInsanity": "调查员已经处于潜在的疯狂状态。", + "CoC7.IndefinitelyInsane": "你变成永久疯狂。", + "CoC7.TemporaryInsane": "你进入临时性疯狂。", + "CoC7.GoodForAsylum": "你可以被送到收容所。", + "CoC7.BoutOfMadness": "临时性疯狂", + "CoC7.BoutRealTime": "临时性疯狂: 即时", + "CoC7.BoutSummary": "临时性疯狂: 总结", + "CoC7.EndBoutOfMadness": "终结临时性疯狂", + "CoC7.InsanityType": "疯狂类型", + "CoC7.Phobia": "恐惧症", + "CoC7.Mania": "狂躁症", + "CoC7.MaxSanloss": "最大损失", + "CoC7.MinSanloss": "最小损失", + "CoC7.AlreadyLost": "已经失去控制", + "CoC7.CreatureMaxLoss": "生物最大损失值", + "CoC7.MaxLossToCreature": "生物扣去最大损失值", + "CoC7.ResetCreatureSan": "重设生物的经历", + "CoC7.ResetSpecieSan": "重设种族的经历", + "CoC7.KeepData": "保留生物资料", + "CoC7.BoutActive": "(疯狂发作)免疫San损失", + "CoC7.AlreadyInABout": "你正受临时性疯狂影响,暂时免疫更多的SAN损失。", + "CoC7.PlayerPermanentlyInsane": "玩家角色永久疯狂", + "CoC7.MythosFirstEncounter": "克苏鲁神话成长(+5% 首次)", + "CoC7.MythosAlreadyEncountered": "克苏鲁神话成长(+1%)", + "CoC7.DisregardMythosGain": "没有克苏鲁神话成长", + "CoC7.MythosGain": "获得克苏鲁神话", + "CoC7.YouGainedCthulhuMythos": "在超凡脱俗的存在面前,你感到胆怯 (+{value}% 克苏鲁神话成长)", + "CoC7.CardResolved": "检定卡已解决", + "CoC7.SpellCastingTime": "施法时间", "CoC7.SpellCastingCost": "施法成本", "CoC7.CallSpell": "呼唤", @@ -340,11 +540,43 @@ "CoC7.EnchantmentSpell": "附魔", "CoC7.GateSpell": "门", "CoC7.CombatSpell": "战斗", - "CoC7.SpellType": "咒文的种类", + "CoC7.SpellType": "法术种类", + "CoC7.SpellSuccessfullyLearned": "已经成功学习了法术 '{spell}' !", + "CoC7.SpellAlreadyLearned": "名为 ('{spell}') 的法术已经学过了.", + + "CoC7.BookHasNothingMoreToTeach": "{book} 没有什么可学习的了。 {actor} 的克苏鲁神话技能大于这本书的神话等级。", "CoC7.BookType": "书的种类", - "CoC7.MythosBook": "克苏鲁神话典籍", - "CoC7.OccultBook": "神秘学书籍", - "CoC7.Unidentified": "不可名状", + "CoC7.Content": "内容", + "CoC7.CthulhuMythosFinal": "克苏鲁神话精读值", + "CoC7.CthulhuMythosInitial": "克苏鲁神话泛读值", + "CoC7.Development": "成长", + "CoC7.DifficultyLevel": "难度等级", + "CoC7.DragSpell": "拖曳法术到这里,将它们加入书中……", + "CoC7.FullStudies": "精读", + "CoC7.Gains": "增加", + "CoC7.GainsForReading": "阅读{book}的技能提升。", + "CoC7.InitialReading": "泛读", + "CoC7.InitialReadingNeeded": "{actor}需要对{book}进行泛读,以便能够进行精读。", + "CoC7.LearnSpellAttempt": "尝试从{book}学习咒语{spell}。", + "CoC7.MarkedForDevelopment": "被标记为可成长", + "CoC7.Mythos": "神话", + "CoC7.MythosRating": "神话等级", + "CoC7.NotOwned": "这本物品需要被一个角色拥有才能执行这个动作。", + "CoC7.Occult": "神秘学", + "CoC7.Points": "点数(s)", + "CoC7.Progress": "进度", + "CoC7.RedoFullStudy": "重新精读", + "CoC7.ReadAttempt": "尝试阅读{book}({language}),{difficulty}难度。", + "CoC7.ReadingMythosTome": "阅读 {book}。", + "CoC7.Specific": "具体的", + "CoC7.SpellsLearned": "已习得法术", + "CoC7.StudyTime": "精读时间", + "CoC7.UnknownLanguage": "{actor}不知道这本书是用什么语言编写的。", + "CoC7.Unreadable": "不可阅读", + + "CoC7.Crew": "成员", + "CoC7.Origin": "出身", + "CoC7.ArmedVehicle": "武装车辆", "CoC7.PulpTalents": "英雄 天赋", "CoC7.TalentType": "天赋类型", @@ -357,7 +589,9 @@ "CoC7.OtherTalent": "其他", "CoC7.Items": "道具", + "CoC7.Vehicle": "车辆", "CoC7.Books": "书籍", + "CoC7.Status": "状态", "CoC7.Classic": "原作", "CoC7.Lovecraftian": "洛夫克拉夫特", @@ -378,6 +612,8 @@ "CoC7.Choose": "可供选择的数量", "CoC7.Chosen": "选择", "CoC7.EmptySkillList": "在这里添加一个技能.", + "CoC7.EmptyItemList": "拖拽物品到此,会加入到物品栏。", + "CoC7.EmptyCharacterSkillList": "通过拖放在这里进行设置、增加职业或技能。", "CoC7.PersonalSpeciality": "个人或时代专长的数量", "CoC7.AdditionalSkills": "额外的技能", "CoC7.SkillSelectionWindow": "选择 opional 技能", @@ -398,9 +634,10 @@ "CoC7.CreateNewSkill": "创造一项新技能", "CoC7.Characteristics": "属性", + "CoC7.Characteristic": "特质", "CoC7.EnableCharacteristics": "开启属性骰", - "CoC7.UsePoints": "使用 点数", - "CoC7.UseRolls": "使用 Roll", + "CoC7.UsePoints": "使用 固定点数", + "CoC7.UseRolls": "使用 掷骰点数", "CoC7.CoreCharacteristics": "核心特质", "CoC7.BonusPoints": "Bonus 点", "CoC7.SuggestedOccupations": "建议职业", @@ -409,19 +646,166 @@ "CoC7.PutGunAway": "收枪", "CoC7.DrawGun": "拔枪", + "CoC7.GmTools": "KP工具", + "CoC7.GmNotes": "KP笔记", + "CoC7.DevPhase": "幕间成长环节", "CoC7.DevPhaseEnabled": "启用开发模式", "CoC7.DevPhaseDisabled": "禁用开发模式", + "CoC7.CharCreationMode": "角色创建模式", "CoC7.CharCreationEnabled": "启用角色创建模式", "CoC7.CharCreationDisabled": "禁用角色创建模式", + "CoC7.toggleXP": "获得XP", + "CoC7.XPGainEnabled": "角色可以获得 XP", + "CoC7.XPGainDisabled": "角色不能获得 XP", "CoC7.WarnNoActorAvailable": "你没有控制或选择任何演员", "CoC7.WarnMacroIncorrectType": "你只能为武器和技能创建宏", "CoC7.WarnNoGlobalSpec": "不能为未指定的专门化创建宏", "CoC7.WarnMacroNoItemFound": "没有发现可用物品", + "CoC7.WarnNoControlledActor": "你没有控制任何角色", + "CoC7.WarnFastTargetWithWrongMOV": "快速选择一个移动力小于8的目标 (MOV: {mov})", + "CoC7.WarnTooManyTarget": "选择目标过多,将保留最后选定的目标", + "CoC7.WarnNoTargetsSanCheck": "您没有选择目标。选择目标或创建链接。", + + "CoC7.allActors": "所有角色", + "CoC7.restTargets": "休息对象: ", + "CoC7.startRest": "开始休息", + "CoC7.dreaming": "调查员在梦境中等待", + "CoC7.healthRecovered": "恢复 1 点生命值", + "CoC7.pulpHealthRecovered": "恢复 {number} 点生命值", + "CoC7.dailySanLossRestarted": "重设每日疯狂临界点", + "CoC7.magicPointsRecovered": "MP恢复", + "CoC7.hasCriticalWounds": "重伤下无法恢复生命值。", + "CoC7.quickHealer": "快速治疗者", + "CoC7.ErrorNoDodgeSkill": "角色没有闪避技能", + "CoC7.ErrorNotEnoughLuck": "{actor} 没有足够的幸运来通过检定", + "CoC7.ErrorManeuverNotPossible": "对方过大,你无法发动战技!", + "CoC7.ErrorNotFound": "没有找到{missing} !", + "CoC7.ErrorNotFoundForActor": "找不到角色{actor}的{missing} !", + + "CoC7.InfoLessSkillThanOptions": "只有 {skillCount} 与 {optionsCount} 项, 添加其全部", + "CoC7.InfoAllSkillsAlreadySelected": "已选定所有技能.", + + "CoC7.MessageCheckRequestedWait": "Kp请求一个检定
        {check}
        点击前请稍等!
        ", + "CoC7.MessageTargetCheckRequested": "对于{name},Kp请求一个检定
        {check}.", + "CoC7.MessageTitleSelectSingleUserForTarget": "哪个个用户可以回应此攻击", + "CoC7.MessageSelectSingleUserForTarget": "此token由多个玩家所控制,请选择哪个用户可以回应此攻击.", + "CoC7.MessageBoutOfMadnessTableNotFound": "没有找到疯狂发作表的结果,请检查所有你已经创建的掷骰表", + "CoC7.MessageBoutOfMadnessItemNotFound": "没有找到疯狂发作表的结果,请检查所有你已经创建的状态", + + "CoC7.DealDamage": "对{target} 进行 {damage} 点 的伤害 ?", + "CoC7.NoTargetSelected": "你还没有为你的 {weapon} 检定 选择一个目标。你想继续进行吗?", + + "CoC7.Import": "导入", + "CoC7.Proceed": "继续", + "CoC7.Cancel": "取消", + + "CoC7.ActorImporter": "角色导入器", + "CoC7.ActorImporterSummary": "导入一个NPC或生物,在背景及属性栏输入纯文字资料。", + "CoC7.PasteTheDataBelow": "于下方贴上纯文字资料", + "CoC7.TextFieldInvalidCharacters": "文本中存在无效文字,请修正,否则将被删除", + "CoC7.SelectActorType": "选择角色类型", + "CoC7.NonPlayingCharacter": "非玩家角色 (NPC)", + "CoC7.Creature": "生物", + "CoC7.ConvertFrom6Edition": "由6版COC转换", + "CoC7.Convert": "转换", + "CoC7.NoConvert": "不转换", + "CoC7.Guess": "猜测", + "CoC7.English": "英文", + "CoC7.Spanish": "西班牙语", + "CoC7.French": "法语", + "CoC7.German": "德语", + "CoC7.Polish": "波兰语", + "CoC7.TraditionalChinese": "繁体中文", + "CoC7.SelectSourceLanguage": "选择资源的来源语言", + "CoC7.ImportedUnnamedCharacter": "已导入无名的角色", + "CoC7.CreatedImportedCharactersFolder": "已新增文件夹「已导入角色」", + "CoC7.ImportedCharactersFolder": "导入角色", + "CoC7.ImportSkillItemLocations": "在其中寻找技能/法术/武器", + "CoC7.ImportActorItemsNone": "无", + "CoC7.ImportActorItemsItem": "道具", + "CoC7.ImportActorItemsItemWorldModuleSystem": "道具/世界/模组/系统", + "CoC7.ImportActorItemsWorldModuleItemSystem": "世界/模组/道具/系统", + + "CoC7.HowToTranslateTitle": "怎样进行翻译?", + "CoC7.HowToTranslateWarning": "不要安装任何你不能信任的Mod.", + "CoC7.HowToTranslateInstallBabele": "在FVTT 的MOD管理器 安装/更新 Babele.", + "CoC7.HowToTranslateInstallTranslation": "在FVTT 的MOD管理器 安装/更新翻译.", + "CoC7.HowToTranslateEnableTranslation": "在游戏世界中, 设定/Mod管理 中启动 Babele 和翻译.", + "CoC7.HowToTranslateNoTranslation": "现有的翻译Mod中提供了新增翻译语言的说明.", + + "CoC7.Migrate.Title": "要求更新", + "CoC7.Migrate.Message": "

        你的世界 需要更新才能运行版本 {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": "
        1. 点击左键 显示选项的掷骰
        2. Shift + 左键 立即投掷普通难度检定
        1. 点击右键 显示选项的对抗检定
        2. Shift + 右键 立即进行对抗检定
        1. Alt/Option + 右键 显示选项的联合检定
        ", + "CoC7.ToolTipKeeperSkill": "
        1. CTRL + 左键 对话栏新增检定连结
        2. {other}
        ", + "CoC7.ToolTipKeeperStandbySkill": "
      3. 点击左键 要求 {name} 掷骰
      4. ", + "CoC7.ToolTipDB": "
        1. 点击左键 立即投掷普通难度检定
        ", + "CoC7.ToolTipKeeperSanity": "
      5. CTRL + Alt/Option 对话栏新增San Check连结
      6. ", + "CoC7.ToolTipAutoToggle": "
        1. 点击左键 切换自动计算 / 手动输入
        2. ", + "CoC7.ToolTipSkillFlagToggle": "
          1. 双击切换标志状态
          2. ", + "CoC7.ToolTipSkillFlagged": "加上成长标记", + "CoC7.ToolTipSkillUnflagged": "移除成长标记", + + "SETTINGS.TitleRules": "规则", + "SETTINGS.TitleInitiative": "先攻表设定", + "SETTINGS.TitleRoll": "掷骰设定", + "SETTINGS.TitleChatCards": "聊天卡设定", + "SETTINGS.TitleScene": "场景设定", + "SETTINGS.TitleSheet": "角色卡设定", + "SETTINGS.TitleGameArtwork": "游戏美术设置", + "SETTINGS.TitleWeapon": "武器设定", + "SETTINGS.TitleDiceSoNice": "Dice So Nice 设定", + "SETTINGS.TitleDeveloperDebug": "开发人员和Debug设定。", + "SETTINGS.TitleRollTable": "随机表设定", + "SETTINGS.DebugMode": "系统调试模式", + "SETTINGS.DebugModeHint": "!!需要重新启动!!", "SETTINGS.DefaultDifficulty": "默认检定难度", "SETTINGS.DefaultDifficultyHint": "您可以选择检定的默认难度。未知将在玩家不知道检定难度的情况下进行检定.", "SETTINGS.CheckDifficultyRegular": "默认难度", "SETTINGS.CheckDifficultyUnknown": "未知难度", + "SETTINGS.showIconsOnly": "在总结表上,只显示技能列表上的图标。", "SETTINGS.UseToken": "使用token图像", "SETTINGS.UseTokenHint": "在角色卡中使用token图像而不是肖像", "SETTINGS.DisplayActorOnCard": "显示角色 on card", @@ -432,8 +816,13 @@ "SETTINGS.InitiativeRuleOptional": "可选", "SETTINGS.displayInitDices": "显示初始化骰子", "SETTINGS.displayInitDicesHint": "在启动时显示dices(仅限可选规则)", - "SETTINGS.PulpRules": "低俗克苏鲁 规则", - "SETTINGS.PulpRulesHint": "Alow the usage of Pulp Rules (Archetype, Talent, HP), !early implementation!", + "SETTINGS.displayInitAsText": "显示初始文本", + "SETTINGS.displayInitAsTextHint": "显示规则由序号替换为文本 (仅限可选规则)", + "SETTINGS.PulpRules": "通俗克苏鲁 规则", + "SETTINGS.PulpRulesHint": "允许使用通俗规则 (类型, 天赋, 两倍HP), ! 早期实现版!", + "SETTINGS.developmentRollForLuck": "可恢复幸运点数", + "SETTINGS.developmentRollForLuckHint": "每位玩家都可以进行角色的幸运成长检定。", + "SETTINGS.displayPlayerNameOnSheet": "在角色卡上显示玩家名称", "SETTINGS.DisregardAmmo": "无视弹药数。", "SETTINGS.DisregardAmmoHint": "启用这一功能将不考虑在枪中子弹的数量。", "SETTINGS.DisregardUsePerRound": "忽略每轮的使用。", @@ -444,38 +833,77 @@ "SETTINGS.StatusPlayerEditableHint": "让你的玩家修改他们的状态(倾向,无意识,死亡,死亡)和重置他们每天的SAN损失", "SETTINGS.SyncDice3D": "[DsN] 同步骰子", "SETTINGS.SyncDice3DHint": "当使用DsN,同步骰子之间的玩家", - "SETTINGS.UnitDieColorset": "[DsN] Unit die 颜色集", - "SETTINGS.UnitDieColorsetHint": "When using DsN, 颜色集 to use for unit die. (default to use player default)", - "SETTINGS.TenDieNoMod": "[DsN] Ten die 颜色集", - "SETTINGS.TenDieNoModHint": "When using DsN, 颜色集 to use for single ten die. (default to use player default)", - "SETTINGS.TenDieBonus": "[DsN] Ten bonus dice 颜色集", - "SETTINGS.TenDieBonusHint": "When using DsN, 颜色集 to use for ten bonus dice. (default to use player default)", - "SETTINGS.TenDiePenalty": "[DsN] Ten penalty dice 颜色集", - "SETTINGS.TenDiePenaltyHint": "When using DsN, 颜色集 to use for penalty bonus dice. (default to use player default)", - "CHARAC.Strength": "力量", - "CoC7.Skill": "技能", - "CoC7.LuckSpentAlt": "花费幸运", - "CoC7.RevealCheck": "显示检定", - "CoC7.IncreaseSuccessLevel": "提升成功", - "CoC7.BonusSelectionWindowNamed": "选择 {name}检定的调整值", - "CoC7.Value": "价格", - "CoC7.WeaponProperyManeuver": "战技", - "CoC7.CthulhuMythosName": "克苏鲁神话", - "CoC7.SANCheckTitle": "损失SAN值: {name} ({sanMin}/{sanMax})", - "CoC7.LinkCheck": "{type} 检定: {name} [{difficulty}/{modifier}]", - "CoC7.LinkSanLoss": "损失SAN值 : ({sanMin}/{sanMax}) [{difficulty}/{modifier}]", - "CoC7.NoSanLoss": "无SAN值损失", - "CoC7.WarnNoControlledActor": "你没有控制任何角色", - "CoC7.WarnFastTargetWithWrongMOV": "快速选择一个移动力小于8的目标 (MOV: {mov})", - "CoC7.WarnTooManyTarget": "选择目标过多,将保留最后选定的目标", - "CoC7.ErrorNoDodgeSkill": "角色没有闪避技能", - "CoC7.ErrorNotEnoughLuck": "{actor} 没有足够的幸运来通过检定", - "CoC7.ErrorManeuverNotPossible": "对方过大,你无法发动战技!", - "CoC7.ErrorNotFound": "没有找到{missing} !", - "CoC7.ErrorNotFoundForActor": "找不到角色{actor}的{missing} !", - "CoC7.InfoLessSkillThanOptions": "只有 {skillCount} 与 {optionsCount} 项, 添加其全部", - "CoC7.InfoAllSkillsAlreadySelected": "已选定所有技能.", - "CoC7.MessageWaitForKeeperToClick": "你的守密人正在要求一次检定。
            等他要求你时再点击!
            ", - "SETTINGS.displayInitAsText": "显示初始文本", - "SETTINGS.displayInitAsTextHint": "显示规则由序号替换为文本 (仅限可选规则)" + "SETTINGS.UnitDieColorset": "[DsN] 个位骰颜色设定", + "SETTINGS.UnitDieColorsetHint": "当使用 DsN 时,颜色设定用在个位骰(留空代表使用玩家预设值)", + "SETTINGS.TenDieNoMod": "[DsN] 十位骰颜色设定", + "SETTINGS.TenDieNoModHint": "当使用 DsN 时,颜色设定用在个位骰(留空代表使用玩家预设值)", + "SETTINGS.TenDieBonus": "[DsN] 奖励骰颜色设定", + "SETTINGS.TenDieBonusHint": "当使用 DsN 时,颜色设定用在奖励骰(留空代表使用玩家预设值)", + "SETTINGS.TenDiePenalty": "[DsN] 惩罚骰颜色设定", + "SETTINGS.TenDiePenaltyHint": "当使用 DsN 时,颜色设定用在惩罚骰(留空代表使用玩家预设值)", + "SETTINGS.OverrideGameArtwork": "覆盖游戏美术风格", + "SETTINGS.OverrideGameArtworkHint": "!!!需要重启!!!让人可以进入高级游戏设定,留空为默认", + "SETTINGS.ArtPauseImage": "暂停图片", + "SETTINGS.ArtPauseImageHint": "。输入'null'来删除图片", + "SETTINGS.ArtPauseText": "暂停文字", + "SETTINGS.ArtPauseTextHint": "留空为默认", + "SETTINGS.OverrideSheetArtwork": "覆盖角色卡的美工设定", + "SETTINGS.OverrideSheetArtworkHint": "!!需要重启!! 开放进阶角色卡设定,留空会被设成预设值", + "SETTINGS.ArtWorkSheetBackground": "角色卡背景", + "SETTINGS.ArtWorkSheetBackgroundHint": "输入 'null' 移除背景", + "SETTINGS.ArtWorkSheetBackgroundType": "背景类型", + "SETTINGS.BackgroundSlice": "背景图片会被分割 (css:border-image)", + "SETTINGS.BackgroundAuto": "缩放图片来维持比例框 (css:auto)", + "SETTINGS.BackgroundContain": "缩大图片到完全配合,避免变形或被裁剪 (css:contain)", + "SETTINGS.BackgroundCover": "变形或裁剪图片致完全配合 (css:cover)", + "SETTINGS.ArtWorkOtherSheetBackground": "其他角色卡的背景图片", + "SETTINGS.ArtWorkOtherSheetBackgroundHint": "输入 'null' 移除背景图片。暂时只限于物品及车辆。", + "SETTINGS.ArtworkSheetImage": "角色卡图片", + "SETTINGS.ArtworkSheetImageHint": "输入 'null' 移除图片", + "SETTINGS.ArtworkFrontColor": "主要颜色", + "SETTINGS.ArtworkFrontColorHint": "使用于所有元素", + "SETTINGS.ArtworkBackgroundColor": "第二颜色", + "SETTINGS.ArtworkBackgroundColorHint": "使用于背景及输入栏", + "SETTINGS.ArtworkInteractiveColor": "互动元素的颜色", + "SETTINGS.ArtworkInteractiveColorHint": "使用于互动/可检定的元素", + "SETTINGS.ArtworkFixedSkillLength": "技能名的长度受限制", + "SETTINGS.ArtworkFixedSkillLengthHint": "为了精简角色卡的效率,技能名的长度会被限制。", + "SETTINGS.ArtworkMainFont": "主要字型", + "SETTINGS.ArtworkMainFontBold": "主要字型(粗体)", + "SETTINGS.ArtworkMainFontSize": "主要字型大小 (px)", + "SETTINGS.BoutOfMadnessSummaryTable": "疯狂发作表 (总结) ", + "SETTINGS.BoutOfMadnessRealTimeTable": "疯狂发作表 (即时) ", + "SETTINGS.LetKeeperDecide": "让Kp决定", + "SETTINGS.DisplayResultType": "显示骰子成功程度结果(文字)", + "SETTINGS.DisplayCheckSuccessLevel": "显示骰子成功程度结果(星星)", + "SETTINGS.PlayerUnlockSheetMode": "玩家可以解锁角色卡", + "SETTINGS.AlwaysEditable": "总是", + "SETTINGS.CreationModeOnly": "仅限创建模式", + "SETTINGS.NeverEditable": "永不 (Kp only)", + "SETTINGS.StanbyGMRolls": "备用的KP掷骰", + "SETTINGS.StanbyGMRollsHint": "当KP从指定的角色卡中进行掷骰时,显示一个掷骰按钮而不是掷骰。", + "SETTINGS.AllowFlatDiceModifier": "骰子结果调整", + "SETTINGS.AllowFlatDiceModifierHint": "允许调整骰子结果值,例如掷出30,可添加调整值-20,使结果变成10。", + "SETTINGS.AllowFlatThresholdModifier": "技能调整值", + "SETTINGS.AllowFlatThresholdModifierHint": "允许调整成功等级 (-1大失败,0失败,1一般成功,2困难成功,3极限成功,4大成功)", + "SETTINGS.OpposedRollTieBreaker": "对抗骰使用Viriato139ac,阻止平手", + "SETTINGS.OpposedRollTieBreakerHint": "在对抗骰平手时,胜者为掷出更高数值,而非本身技能值更高。", + "SETTINGS.SelfRollWhisperTarget": "暗骰掷骰通知:", + "SETTINGS.SelfRollWhisperTargetHint": "作为Kp,当进行暗骰时,你会给谁发出通知。", + "SETTINGS.DoNotAdvise": "只有自己知道。", + "SETTINGS.AdviseOwnersOnly": "通知角色拥有者", + "SETTINGS.AdviseAllPlayer": "通知所有玩家", + "SETTINGS.OneBlockBackStory": "一段式背景故事", + "SETTINGS.OneBlockBackStoryHint": "把背景故事转换成一个编辑区,但你可以控制格式和增加连结。", + "SETTINGS.EnableStatusIcons": "启用状态图示", + "SETTINGS.EnableStatusIconsHint": "设定战斗和理智效果的图示是否会显示在Token里.", + "SETTINGS.ShowExperimentalFeatures": "显示实验性功能。", + "SETTINGS.ShowExperimentalFeaturesHint": "如果你使用这些功能,你的世界可能在未来的版本中变得无法使用。仅用于测试。不要在你游玩中的游戏世界使用这些功能。", + "CoC7.ExperimentalFeaturesWarning": "该功能正在开发中,不建议在你的游戏世界中使用。", + "SETTINGS.CheckElevation": "在距离中包括高度", + "SETTINGS.CheckElevationHint": "在范围战斗距离计算中使用高度", + "CoC7.toolTipDelay": "显示提示前的毫秒延迟,0表示从不显示", + + "CoC7.getTheExample": "复制示范文字", + "CoC7.Copied": "已复制示范文字到剪贴簿" } diff --git a/lang/de.json b/lang/de.json index 9f31954e..71e6aa28 100644 --- a/lang/de.json +++ b/lang/de.json @@ -1,6 +1,24 @@ { "CoC7.title": "Call of Cthulhu 7te Edition (Inoffiziell)", + "CoC7.Entities.Character": "Character", + "CoC7.Entities.Container": "Container", + "CoC7.Entities.Creature": "Kreatur", + "CoC7.Entities.Npc": "NSC", + "CoC7.Entities.Vehicle": "Fahrzeug", + + "CoC7.Entities.Archetype": "Archetyp", + "CoC7.Entities.Book": "Buch", + "CoC7.Entities.Chase": "Verfolgungsjagd", + "CoC7.Entities.Item": "Gegenstand", + "CoC7.Entities.Occupation": "Beruf", + "CoC7.Entities.Setup": "Setup", + "CoC7.Entities.Skill": "Fertigkeit", + "CoC7.Entities.Spell": "Zauberspruch", + "CoC7.Entities.Status": "Status", + "CoC7.Entities.Talent": "Talent", + "CoC7.Entities.Weapon": "Waffe", + "CHARAC.STR": "ST", "CHARAC.Strengh": "Stärke", "CHARAC.Strength": "Stärke", @@ -18,7 +36,7 @@ "CHARAC.Power": "Mana", "CHARAC.EDU": "BI", "CHARAC.Education": "Bildung", - + "CoC7.PlayerName": "Spieler", "CoC7.Name": "Name", "CoC7.Archetype": "Archetyp", "CoC7.Occupation": "Beruf", @@ -72,6 +90,7 @@ "CoC7.Spells": "Zaubersprüche", "CoC7.Spell": "Zauberspruch", "CoC7.Spells&Notes": "Zaubersprüche & Notizen", + "CoC7.Weapons": "Waffen", "CoC7.Effects": "Effekte", "CoC7.Cost": "Kosten", "CoC7.Source": "Quelle", @@ -80,6 +99,7 @@ "CoC7.Other": "Weitere", "CoC7.rounds": "Runde(n)", "CoC7.hours": "Stunde(n)", + "CoC7.weeks": "Woche(n)", "CoC7.remove": "Entfernen", "CoC7.Any": "Eine", "CoC7.All": "Alle", @@ -93,12 +113,21 @@ "CoC7.Attribute": "Merkmal", "CoC7.Collapse": "Einklappen", "CoC7.Expand": "Ausklappen", - "CoC7.Blind": "Blind", "CoC7.Label": "Label", "CoC7.Icon": "Icon", "CoC7.Check": "Probe", "CoC7.ItemWeapon": "Gegenstand (Waffe)", + "CoC7.AttacksPerRound": "Angriffe pro Runde", + + "CoC7.Cast": "Ausführen", + "CoC7.SanityCost": "Stabilitätskosten", + "CoC7.PowerCost": "Mana Kosten", + "CoC7.HitPointsCost": "Trefferpunkte Kosten", + "CoC7.MagicPointsCost": "Magiepunkte Kosten", + "CoC7.OtherCosts": "Andere Kosten", + "CoC7.CastingSpell": "Führt {spell} aus.", + "CoC7.NotEnoughMagicPoints": "{spell} kostet {originalMagicPoints} Magiepunte, Du hast aber nur {actorMagicPoints}. Möchtest Du die fehlenden {convertedHitPoints} Punkte von Deinen Trefferpunkten nehmen? Du wirst {convertedHitPoints} Schaden nehmen, wenn Du das tust.", "CoC7.CopyToClipboard": "In Zwischenablage kopieren", "CoC7.WhisperToSelection": "An ausgewählte Tokens flüstern", @@ -186,6 +215,7 @@ "CoC7.ImpaleTitle": "Die Waffe kann den Gegner aufpsießen", "CoC7.Target": "Ziel", "CoC7.TargetOutOfRange": "Ziel außerhalb der Reichweite", + "CoC7.NoTargetToDamage": "Es gibt kein Ziel, dem der Schaden zugefügt werden kann.", "CoC7.ShotIsImpossible": "Der Schuss ist unmöglich", "CoC7.OutOfAmmo": "Keine Munition mehr vorhanden", "CoC7.OutOfShots": "Das Magazin ist leer", @@ -195,6 +225,7 @@ "CoC7.FightBack": "Zurückschlagen", "CoC7.Dodge": "Ausweichen", "CoC7.Maneuver": "Kampfmanöver", + "CoC7.NoResponse": "Keine Reaktion", "CoC7.OutNumbered": "In der Unterzahl", "CoC7.combatCard.surprised": "Überrascht", "CoC7.combatCard.autoSuccess": "Automatischer Erfolg", @@ -206,6 +237,7 @@ "CoC7.TitleSurprised": "Einen Bonuswürfel hinzufügen wenn das Ziel überrascht ist", "CoC7.TitleAutoSuccess": "Angriff trifft automatisch", "CoC7.WinnerRollDamage": "{name} gewinnt das Kräftemessen. Würfle den Schaden.", + "CoC7.InitiatorMissed": "{name} verfehlt.", "CoC7.NoWinner": "Keine Seite gewinnt das Kräftemessen.", "CoC7.DodgeSuccess": "{name} ist ausgewichen!", "CoC7.ManeuverSuccess": "Das Kampfmanöver von {name} war erfolgreich.", @@ -221,6 +253,7 @@ "CoC7.rangeCombatCard.SingleShot": "Einzelschuss", "CoC7.rangeCombatCard.MultipleShots": "mehrere Schüsse", + "CoC7.AutomaticFire": "Automatisches Feuer", "CoC7.rangeCombatCard.Burst": "Feuerstoß", "CoC7.rangeCombatCard.FullAuto": "Vollautomatisch", "CoC7.rangeCombatCard.BaseRange": "Basisreichweite", @@ -241,7 +274,8 @@ "CoC7.BulletsFired": "verschossene Kugeln", "CoC7.Shots": "Schüsse", "CoC7.Shoot": "schießen", - + "CoC7.ShotBullets": "Schoß {bullets} Kugeln auf {actor}.", + "CoC7.ShotVoley": "Schoß einen Hagel von {bullets} Kugeln auf {actor}.", "CoC7.rangeCombatCard.AimingTitle": "Füge einen Bonuswürfel für den ersten Schuss hinzu.", "CoC7.rangeCombatCard.CoverTitle": "Füge einen Strafwürfel hinzu. Das Ziel ist in Deckung oder hat es erfolgreich geschafft sich in Deckung zu werfen.", "CoC7.rangeCombatCard.PointBlankRangeTitle": "Füge einen Bünuswürfel hinzu. Das Ziel befindet sich direkt vor dir.", @@ -251,6 +285,11 @@ "CoC7.rangeCombatCard.InMeleeTitle": "Füge einen Strafwürfel hinzu. Das Ziel befindet sich im Nahkampf.", "CoC7.rangeCombatCard.FastMovingTargetTitle": "Füge einen Strafwürfel hinzu. Das Ziel ist schnell (BW > 8) und bewegt sich mit voller Geschwindigkeit.", + "CoC7.meleeCombatDamageTakes": "nimmt", + "CoC7.meleeCombatDamageFrom": "von", + "CoC7.meleeCombatDamageDeals": "verarbeitet", + "CoC7.meleeCombatDamageWith": "mit", + "CoC7.DropZone": "Ablage Bereich", "CoC7.Value": "Wert", @@ -261,8 +300,8 @@ "CoC7.SkillArchetype": "Archetyp", "CoC7.SkillOccupation": "Beruf", "CoC7.SkillPersonal": "Hobby", - "CoC7.SkillTotalExperience": "Erfahrungspunkte", + "CoC7.SkillTotalArchetype": "Archetyp Punkte", "CoC7.SkillTotalOccupation": "Berufspunkte", "CoC7.SkillTotalPersonal": "Hobbypunkte", @@ -340,8 +379,11 @@ "CoC7.DodgeSkillName": "Ausweichen", "CoC7.CthulhuMythosName": "Cthulhu Mythos", "CoC7.CreditRatingSkillName": "Finanzkraft", + "CoC7.DriveAutoSkillName": "Drive Auto", "CoC7.FightingSpecializationName": "Nahkampf", "CoC7.FirearmSpecializationName": "Fernkampf", + "CoC7.DriveSpecializationName": "Fahren", + "CoC7.PilotSpecializationName": "Steuern", "CoC7.AnySpecName": "Eine", "CoC7.BoutOfMadnessName": "Am Rande des Wahnsinns", "CoC7.InsanityName": "Wahnsinnig", @@ -349,15 +391,21 @@ "CoC7.NewSkillName": "neue Fertigkeit", "CoC7.AddSkill": "Fertigkeit hinzufügen", "CoC7.DevelopemmentPhase": "Phase der Charakterentwicklung", + "CoC7.RecoverLuckPoints": "Glückspunkte wiederherstellen", "CoC7.SkillCantGainXp": "Fertigkeit kann nicht automatisch an Erfahrung gewinnen", "CoC7.SkillUnflagForDevelopement": "nicht mehr für die Charakterentwicklung markieren", "CoC7.SkillFlagForDevelopement": "für die Charakterentwicklung markieren", "CoC7.RollAll4Dev": "Auf alle Fertigkeiten für die Charakterentwicklung würfeln", + "CoC7.RollLuck4Dev": "Würfele Glück für die Charakterentwicklung", "CoC7.DevRollTitle": "Würfle {item} für die Charakterentwicklung: {die}/{score}%", "CoC7.DevSuccessDetails": "{item} wurde um {augment}% verbessert", + "CoC7.SanGained": "Erhielt 2d6 ({results} = {sanGained}) Stabilität, nach Meisterung von {skill} mit einer {skillValue}%", "CoC7.DevFailureDetails": "{item} wurde nicht verbessert", "CoC7.DevSuccess": "{item} hat sich verbessert ({die}/{score}%) um {augment}%", "CoC7.DevFailure": "{item} hat sicht nicht verbessert ({die}/{score}%)", + "CoC7.LuckIncreased": "Glück wiederhergestellt ({die}/{score}) mit {augment} Punkten", + "CoC7.LuckNotIncreased": "Glück NICHT wiederhergestellt ({die}/{score})", + "CoC7.DevelopAttribWarn": "Auf einige Attribute kannst Du während der Charaktererstellung/-entwicklung nicht zugreifen.", "CoC7.SkillDetail": "Details", "CoC7.EditSkill": "Fertigkeit bearbeiten", "CoC7.DeleteSkill": "Fertigkeit entfernen", @@ -367,6 +415,17 @@ "CoC7.AddItem": "Gegenstand hinzufügen", "CoC7.EditItem": "Gegenstand bearbeiten", "CoC7.DeleteItem": "Gegenstand löschen", + "CoC7.TradeItem": "Handle / Speichere Gegenstand", + "CoC7.SortBySkillName": "Nach Fertigkeitsnamen sortieren", + "CoC7.SortBySkillValue": "Nach Fertigkeitsprozentwert sortieren", + "CoC7.UncommonSkillsShow": "Ungewöhnliche Fertigkeiten zeigen", + "CoC7.UncommonSkillsHide": "Ungewöhnliche Fertigkeiten verstecken", + + "CoC7.NewBookName": "Neues Buch", + "CoC7.AddBook": "Buch hinzufügen", + "CoC7.NewSpellName": "Neuer Zauberspruch", + "CoC7.AddSpell": "Zauberspruch hinzufügen", + "CoC7.AddWeapon": "Waffen hinzufügen", "CoC7.NewWeaponName": "neue Waffe", "CoC7.EditWeapon": "Waffe bearbeiten", @@ -377,6 +436,7 @@ "CoC7.WeaponSkill": "Waffen Fertigkeit", "CoC7.WeaponSkillAlt": "Alternative Waffen Fertigkeit", "CoC7.Inventory": "Inventar", + "CoC7.InventoryIsCurrentlyEmpty": "Das Inventar ist derzeit leer.", "CoC7.CharacterDevelopment": "Charakterentwicklung", "CoC7.OccupationSkill": "Berufsfertigkeit", "CoC7.ArchetypeSkill": "Archetypenfertigkeit", @@ -469,13 +529,6 @@ "CoC7.YouGainedCthulhuMythos": "Dein Bewusstsein erzittert vor der unheimlichen Manifestation kosmischen Schreckens (+{value}% Cthulhu-Mythos)", "CoC7.CardResolved": "Karte aufgelöst", - "CoC7.CMI": "CMQ", - "CoC7.CthulhuMythosInitial": "Cthulhu-Mythos Wert durch Querlesen", - "CoC7.CMF": "CMS", - "CoC7.CthulhuMythosFinal": "Cthulhu-Mythos Wert durch eingehendes Studium", - "CoC7.Occult": "Okkult", - "CoC7.MythosRating": "Mythoswert", - "CoC7.StudyTime": "Studierzeit", "CoC7.SpellCastingTime": "Zauberdauer", "CoC7.SpellCastingCost": "Zauberkosten", "CoC7.CallSpell": "Rufe", @@ -487,14 +540,41 @@ "CoC7.GateSpell": "Reise- und Transportzauber", "CoC7.CombatSpell": "Kampfzauber", "CoC7.SpellType": "Zaubertyp", + "CoC7.SpellSuccessfullyLearned": "Zauber '{spell}' wurde erfolgreich gelernt!", + "CoC7.SpellAlreadyLearned": "Zauber mit dem Namen '{spell}' wurde bereits gelernt.", + + "CoC7.BookHasNothingMoreToTeach": "{book} kann nichts mehr lehren. Cthulhu Mythos Fertigkeit von {actor} ist größer als der Mythoswert.", "CoC7.BookType": "Buch Typ", - "CoC7.MythosBook": "Mythos Buch", - "CoC7.OccultBook": "Okkulter Foliant", - "CoC7.Unidentified": "Unidentifizierte Beschreibung", + "CoC7.Content": "Inhalt", + "CoC7.CthulhuMythosFinal": "Cthulhu-Mythos durch Studium", + "CoC7.CthulhuMythosInitial": "Cthulhu-Mythos durch Querlesen", + "CoC7.Development": "Entwicklung", + "CoC7.DifficultyLevel": "Schwierigkeitsgrad", + "CoC7.DragSpell": "Ziehe Zaubersprüche hier rein, um sie dem Buch hinzuzufügen...", + "CoC7.FullStudies": "Eingehendes Studium", + "CoC7.Gains": "Zugewinne", + "CoC7.GainsForReading": "Fertigkeitn Zugewinne durch lesen des {book}.", + "CoC7.InitialReading": "Querlesen", + "CoC7.InitialReadingNeeded": "{actor} muss {book} erst querlesen, um mit eingehenden Studien weiterzukommen.", + "CoC7.LearnSpellAttempt": "Versuch, den Zauberspruch {spell} aus {book} zu lernen.", + "CoC7.MarkedForDevelopment": "In Entwicklung markiert", + "CoC7.Mythos": "Mythos", + "CoC7.MythosRating": "Mythoswert", + "CoC7.NotOwned": "Der Gegenstand muss sich im Besitz eines Spielers befinden, damit diese Aktion ausgeführt werden kann.", + "CoC7.Occult": "Okkultismus", + "CoC7.Points": "Punkt(e)", + "CoC7.Progress": "Fortschritt", + "CoC7.RedoFullStudy": "Eingehendes Studium wiederholen", + "CoC7.ReadAttempt": "Versuch, {book} in ({language}) zu lesen, {difficulty} Schwierigkeit.", + "CoC7.ReadingMythosTome": "Lese {book}.", + "CoC7.Specific": "Spezifisch", + "CoC7.SpellsLearned": "Zaubersprüche gelernt", + "CoC7.StudyTime": "Studierzeit", + "CoC7.UnknownLanguage": "{actor} kennt die Sprache nicht, in der das Buch geschrieben ist.", + "CoC7.Unreadable": "Nicht lesbar", - "CoC7.Crew": "Crew", + "CoC7.Crew": "Besatzung", "CoC7.Origin": "Herkunftsort", - "CoC7.Model": "Modell", "CoC7.ArmedVehicle": "Bewaffnetes Fahrzeug", "CoC7.PulpTalents": "Pulp Fertigkeiten", @@ -532,6 +612,7 @@ "CoC7.Chosen": "ausgewählt", "CoC7.EmptySkillList": "Füge eine Fertigkeit hinzu indem du sie hier ablegst.", "CoC7.EmptyItemList": "Füge einen Gegenstand hinzu indem du ihn hier ablegst.", + "CoC7.EmptyCharacterSkillList": "Füge ein Setuo, einen Beruf oder eine Fertigkeit hinzu, indem Du sie hier ablegst.", "CoC7.PersonalSpeciality": "Anzahl der Hobby- oder Ära-Spezialisierungen", "CoC7.AdditionalSkills": "zusätzliche Fertigkeiten", "CoC7.SkillSelectionWindow": "wähle zusätzliche Fertigkeiten", @@ -551,8 +632,8 @@ "CoC7.SelectSkill": "wähle eine bestehende Fertigkeit", "CoC7.CreateNewSkill": "erstelle eine neue Fertigkeit", - "CoC7.Characteristic": "Charaktereigenschaft", "CoC7.Characteristics": "Charaktereigenschaften", + "CoC7.Characteristic": "Charaktereigenschaft", "CoC7.EnableCharacteristics": "Charaktereigenschaften aktivieren", "CoC7.UsePoints": "verwende die Punkteverteilung", "CoC7.UseRolls": "verwende Zufallswürfe", @@ -588,6 +669,7 @@ "CoC7.healthRecovered": "Ein Trefferpunkt wurde wiederhergestellt", "CoC7.pulpHealthRecovered": "{number} Trefferpunkte wurden wiederhergestellt", "CoC7.dailySanLossRestarted": "Der tägliche Stabilitätsverlust-Tracker wurde neugestartet", + "CoC7.magicPointsRecovered": "Magiepunkte wiederhergestellt", "CoC7.hasCriticalWounds": "Eine Wiederherstellung von Lebenspunkten ist durch die schweren Wunden unmöglich.", "CoC7.quickHealer": "schneller Heiler", @@ -596,16 +678,24 @@ "CoC7.ErrorManeuverNotPossible": "Dein Gegner ist zu stark um ein Kampfmanöver auszuführen", "CoC7.ErrorNotFound": "{missing} nicht gefunden!", "CoC7.ErrorNotFoundForActor": "{missing} wurde nicht für Investigator {actor} gefunden!", - "CoC7.InfoLessSkillThanOptions": "Es gibt nur {skillCount} und {optionsCount} Optionen, füge alle hinzu.", - "CoC7.InfoAllSkillsAlreadySelected": "Alle Fertigkeiten sind bereits ausgewählt.", + "CoC7.InfoAllSkillsAlreadySelected": "Alle Fertigkeiten sind bereits ausgewählt.", "CoC7.MessageCheckRequestedWait": "Dein Spielleiter verlangt eine Probe für {check}.
            Warte bevor du würfelst!
            ", "CoC7.MessageTargetCheckRequested": "Dein Spielleiter verlangt für {name} eine Probe für {check}.", - + "CoC7.MessageTitleSelectSingleUserForTarget": "Welcher Nutzer auf diesen Angriff reagieren soll", + "CoC7.MessageSelectSingleUserForTarget": "Dieses Token wird von mehreren Nutzern kontrolliert. Bitte wähle aus, welcher Nutzer auf den Angriff reagieren soll.", + "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.DealDamage": "{damage} Schadenspunkte {target} zufügen?", + "CoC7.NoTargetSelected": "Du hast kein Ziel für Deinen {weapon} Check ausgewählt. Möchtest Du trotzdem fortfahren?", + "CoC7.Import": "Importieren", + "CoC7.Proceed": "Forfahren", + "CoC7.Cancel": "Abbrechen", "CoC7.ActorImporter": "Investigatoren Import", "CoC7.ActorImporterSummary": "Importiere einen NSC oder Kreatur basierende auf ihrer Beschreibung und den Werten. Füge einfach den Text hier ein.", "CoC7.PasteTheDataBelow": "Den Text hier einfügen", + "CoC7.TextFieldInvalidCharacters": "Es gibt ungültige Buchstaben im Text, bitte verbessere sie, ansonsten werden sie einfach entfernt.", "CoC7.SelectActorType": "Typ der Figur auswählen", "CoC7.NonPlayingCharacter": "Nicht Spieler Charakter (NSC)", "CoC7.Creature": "Kreatur", @@ -616,12 +706,65 @@ "CoC7.English": "Englisch", "CoC7.Spanish": "Spanisch", "CoC7.French": "Französisch", + "CoC7.German": "Deutsch", + "CoC7.TraditionalChinese": "Traditionelles Chinesisch", "CoC7.SelectSourceLanguage": "Wähle die Originalsprache aus", - + "CoC7.ImportedUnnamedCharacter": "Importiere unbenannten Charakter", + "CoC7.CreatedImportedCharactersFolder": "Erzeuge 'Importierte Charaktere' Ordner", + "CoC7.ImportedCharactersFolder": "Importierte Charaktere", + "CoC7.ImportSkillItemLocations": "Nach Fertigkeiten/Zaubersprüchen/Waffen nachschauen in", + "CoC7.ImportActorItemsNone": "Keine", + "CoC7.ImportActorItemsItem": "Gegenstände", + "CoC7.ImportActorItemsItemWorldModuleSystem": "Gegenstände / Welt / Module / System", + "CoC7.ImportActorItemsWorldModuleItemSystem": "Welt / Module / Gegenstände / System", + "CoC7.HowToTranslateTitle": "Wie übersetzen?", + "CoC7.HowToTranslateWarning": "Bitte installiere keine Module, denen Du nicht vertraust.", + "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 erforderlich", + "CoC7.Migrate.Message": "

            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": "
            1. Left click roll check with options
            2. Shift + Left click Immediate regular difficulty roll
            1. Right click Opposed check with options
            2. Shift + Right click Immediate opposed check
            1. Alt/Option + Right click Combined check with options
            ", + "CoC7.ToolTipKeeperSkill": "
            1. CTRL + Left click Create roll link
            2. {other}
            ", + "CoC7.ToolTipKeeperStandbySkill": "
          3. Left click Request a roll from {name}
          4. ", + "CoC7.ToolTipDB": "
            1. Left click Immediate regular difficulty roll
            ", + "CoC7.ToolTipKeeperSanity": "
          5. CTRL + Alt/Option Create sanity check roll link
          6. ", + "CoC7.ToolTipAutoToggle": "
            1. Left click Toggle automatic calculation / manual entry
            2. ", + "CoC7.ToolTipSkillFlagToggle": "
              1. Double Click Toggle flag status
              2. ", + "CoC7.ToolTipSkillFlagged": "Flagged for development", + "CoC7.ToolTipSkillUnflagged": "Not flagged for development", + "SETTINGS.TitleRules": "Regeln", + "SETTINGS.TitleInitiative": "Initiative Einstellungen", + "SETTINGS.TitleRoll": "Würfel Einstellungen", + "SETTINGS.TitleChatCards": "Chat Karten Einstellungen", + "SETTINGS.TitleScene": "Szenen Einstellungen", + "SETTINGS.TitleSheet": "Charakterblatt Einstellungen", + "SETTINGS.TitleGameArtwork": "Game Artwork Einstellungen", + "SETTINGS.TitleWeapon": "Waffen Einstellungen", + "SETTINGS.TitleDiceSoNice": "Dice So Nice Einstellungen", + "SETTINGS.TitleDeveloperDebug": "Entwickler und Debug Einstellungen", + "SETTINGS.TitleRollTable": "Würfeltabellen Einstellungen", + "SETTINGS.DebugMode": "System Debug Mode", + "SETTINGS.DebugModeHint": "!!NEUSTART ERFORDERLICH!!", "SETTINGS.DefaultDifficulty": "Standard Proben Schwierigkeitsstufe", "SETTINGS.DefaultDifficultyHint": "Du kannst die Standardschwierigkeit für Proben wählen. Der Eintrag Unbekannte Schwierigkeit wird den Spielern die Schwierigkeit der Probe vorenthalten.", "SETTINGS.CheckDifficultyRegular": "Standard Schwierigkeit", "SETTINGS.CheckDifficultyUnknown": "Unbekannte Schwierigkeit", + "SETTINGS.showIconsOnly": "Zeige auf dem zusammengefassten Charakterblatt nur Icons in der Fertigkeitenliste.", "SETTINGS.UseToken": "Nutze Tokenbild", "SETTINGS.UseTokenHint": "Nutze Tokenbild anstatt des Portraits in Chat-Karten", "SETTINGS.DisplayActorOnCard": "Zeige Figur auf der Chat-Karte", @@ -636,6 +779,9 @@ "SETTINGS.displayInitAsTextHint": "Zeige Initiative als Text anstatt als Zahl an (Nur bei Verwendung der Optionalen Regel).", "SETTINGS.PulpRules": "Pulp-Cthulhu Regeln", "SETTINGS.PulpRulesHint": "BETA IMPLEMENTIERUNGSPHASE:
                Erlaube die Verwendung der Pulp-Cthulhu Regeln (Archetypen, Talente, Lebensenergie)", + "SETTINGS.developmentRollForLuck": "Glückspunkte wiederherstellem", + "SETTINGS.developmentRollForLuckHint": "Jeder Spieler darf in der Entwicklungsphase einen Verbesserungswurf auf seine Glückspunkte machen", + "SETTINGS.displayPlayerNameOnSheet": "Spielernamen auf Charakterblatt darstellen", "SETTINGS.DisregardAmmo": "Munitionsmenge ignorieren", "SETTINGS.DisregardAmmoHint": "Die Aktivierung wird die Menge der in der Waffe geladenen Kugeln ignorieren.", "SETTINGS.DisregardUsePerRound": "Maximale Verwendung pro Runde ignorieren.", @@ -654,10 +800,21 @@ "SETTINGS.TenDieBonusHint": "Farbschema das bei der Benutzung von DsN für die Zehner Stellen Bonuswürfel verwendet werden soll. (frei lassen für den Standard Wert der Spieler)", "SETTINGS.TenDiePenalty": "[DsN] Zehner Stellen Strafwürfel Farbschema", "SETTINGS.TenDiePenaltyHint": "Farbschema das bei der Benutzung von DsN für die Zehner Stellen Strafwürfel verwendet werden soll. (frei lassen für den Standard Wert der Spieler)", + "SETTINGS.OverrideGameArtwork": "Game Artwork überschreiben", + "SETTINGS.OverrideGameArtworkHint": "!!NEUSTART ERFORDERLICH!! Erlaubt den Zugriff auf erweiterte Spiel Features, leer lassen für Standard", + "SETTINGS.ArtPauseImage": "Pausen Bild", + "SETTINGS.ArtPauseImageHint": ". Tippe 'null' ein, um das Bild zu entfernen", + "SETTINGS.ArtPauseText": "Pausen Text", + "SETTINGS.ArtPauseTextHint": "Leer lassen für Standard", "SETTINGS.OverrideSheetArtwork": "Design des Bogens überschreiben", - "SETTINGS.OverrideSheetArtworkHint": "BENÖTIGT NEUSTART:
                Bietet Zugriff auf die erweiterte Konfiguration des Bogens. Frei lassen für die Standardkonfiguration.", + "SETTINGS.OverrideSheetArtworkHint": "BENÖTIGT NEUSTART: Bietet Zugriff auf die erweiterte Konfiguration des Bogens. Frei lassen für die Standardkonfiguration.", "SETTINGS.ArtWorkSheetBackground": "Investigatorenbogen Hintergrund", "SETTINGS.ArtWorkSheetBackgroundHint": "Tippe 'null' ein um den Hintergrund zu entfernen", + "SETTINGS.ArtWorkSheetBackgroundType": "Hintergrund Typ", + "SETTINGS.BackgroundSlice": "Background image will be sliced (css:border-image)", + "SETTINGS.BackgroundAuto": "Scales the image maintening proportions (css:auto)", + "SETTINGS.BackgroundContain": "Scales to fill without croping/stretching (css:contain)", + "SETTINGS.BackgroundCover": "Scales to fill with croping/stretching (css:cover)", "SETTINGS.ArtWorkOtherSheetBackground": "Weiterer Bogen Hintergrund", "SETTINGS.ArtWorkOtherSheetBackgroundHint": "Tippe 'null' um den Hintergrund zu entfernen. Aktuell nur für Gegenstände und Fahrzeuge.", "SETTINGS.ArtworkSheetImage": "Investigatorenbogen Bild", @@ -682,6 +839,8 @@ "SETTINGS.AlwaysEditable": "Immer", "SETTINGS.CreationModeOnly": "Nur wenn die Investigatorenerstellung aktiv ist", "SETTINGS.NeverEditable": "Nie (Nur der Spielleiter kann entsperren)", + "SETTINGS.StanbyGMRolls": "Standby Keeper rolls", + "SETTINGS.StanbyGMRollsHint": "When the Keeper is making a roll from an assigned character sheet, display a roll button instead of rolling", "SETTINGS.AllowFlatDiceModifier": "Numerischer Probenmodifikator", "SETTINGS.AllowFlatDiceModifierHint": "Erlaubt es Proben um einen beliebigen numerischen Wert zu modifizieren.", "SETTINGS.AllowFlatThresholdModifier": "Numerischer Grenzwert Modifikator", @@ -694,5 +853,19 @@ "SETTINGS.AdviseOwnersOnly": "Benachrichtige den Spieler des Investigators", "SETTINGS.AdviseAllPlayer": "Benachrichtige alle Spieler", "SETTINGS.OneBlockBackStory": "Hintergrundgeschichte in einem Textblock", - "SETTINGS.OneBlockBackStoryHint": "Wandle den Bereich für die Hintergrundgeschichte in einen Textblock. Dies erlaubt es zu formatieren und Links hinzuzufügen." + "SETTINGS.OneBlockBackStoryHint": "Wandle den Bereich für die Hintergrundgeschichte in einen Textblock. Dies erlaubt es zu formatieren und Links hinzuzufügen.", + "SETTINGS.EnableStatusIcons": "Status Icons anschalten", + "SETTINGS.EnableStatusIconsHint": "Bestimmt, ob Kampf- und Stabilitätsicons beim Token dargestellt werden.", + "SETTINGS.ShowExperimentalFeatures": "Experimentelle Features zeigen", + "SETTINGS.ShowExperimentalFeaturesHint": "Deine Welt könnte in zukünftigen Releases unbenutzbar werden, wenn Du diese Features benutzt. Diese sind nur für Tests, nutze sie NICHT in Deinen Spielwelten", + "CoC7.ExperimentalFeaturesWarning": "Dieses Feature ist 'work in progress' und es wird nicht empfohlen, es in Deinen Spielwelten zu nutzen.", + "SETTINGS.CheckElevation": "Höhe in die Entfernung mit einrechnen", + "SETTINGS.CheckElevationHint": "Höhe bei der Berechnung von Kampfentfernungen mit einrechnen", + "CoC7.toolTipDelay": "Verzögerung in Millisekunden, bis Tooltips angezeigt werden. 0 für 'niemals'", + "CoC7.CMI": "CMQ", + "CoC7.CMF": "CMS", + "CoC7.MythosBook": "Mythos Buch", + "CoC7.OccultBook": "Okkulter Foliant", + "CoC7.Unidentified": "Unidentifizierte Beschreibung", + "CoC7.Model": "Modell" } diff --git a/lang/en.json b/lang/en.json index d0826fb0..9b24f70c 100644 --- a/lang/en.json +++ b/lang/en.json @@ -2,9 +2,14 @@ "CoC7.title": "Call of Cthulhu 7h Edition (Unofficial)", "CoC7.Entities.Character": "Character", + "CoC7.Entities.Container": "Container", "CoC7.Entities.Creature": "Creature", "CoC7.Entities.Npc": "NPC", "CoC7.Entities.Vehicle": "Vehicle", + "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.Entities.Archetype": "Archetype", "CoC7.Entities.Book": "Book", @@ -55,6 +60,8 @@ "CoC7.DailyLoss": "Daily", "CoC7.Luck": "Luck", "CoC7.Movement": "Movement", + "CoC7.MovementAction": "Movement action", + "CoC7.AdjustedMovement": "Adjusted movement", "CoC7.Mov": "Mov", "CoC7.BonusDamage": "Bonus Damage", "CoC7.DB": "DB", @@ -76,6 +83,8 @@ "CoC7.UnderlyingInsanity": "Underlying insanity", "CoC7.TemporaryInsanity": "Temporary insanity", "CoC7.IndefiniteInsanity": "Indefinite insanity", + "CoC7.DefinitelyInsane": "Good for the asylum", + "CoC7.FINISH": "--F-I-N-I-S-H--", "CoC7.NotInsane": "None", "CoC7.UnlockActor": "Unlock Actor", "CoC7.LockActor": "Lock Actor", @@ -89,6 +98,7 @@ "CoC7.Spells": "Spells", "CoC7.Spell": "Spell", "CoC7.Spells&Notes": "Spells & Notes", + "CoC7.Weapons": "Weapons", "CoC7.Effects": "Effects", "CoC7.Cost": "Cost", "CoC7.Source": "Source", @@ -97,7 +107,9 @@ "CoC7.Other": "Other", "CoC7.rounds": "round(s)", "CoC7.hours": "hour(s)", + "CoC7.days": "days(s)", "CoC7.weeks": "week(s)", + "CoC7.months": "months(s)", "CoC7.remove": "Remove", "CoC7.Any": "Any", "CoC7.All": "All", @@ -116,6 +128,19 @@ "CoC7.Icon": "Icon", "CoC7.Check": "Check", "CoC7.ItemWeapon": "Item (Weapon)", + "CoC7.AttacksPerRound": "Attacks per round", + "CoC7.Restart": "Restart", + "CoC7.Reset": "Reset", + "CoC7.Initiative": "Initiative", + + "CoC7.Cast": "Cast", + "CoC7.SanityCost": "Sanity Cost", + "CoC7.PowerCost": "Power Cost", + "CoC7.HitPointsCost": "Hit Points Cost", + "CoC7.MagicPointsCost": "Magic Points Cost", + "CoC7.OtherCosts": "Other Costs", + "CoC7.CastingSpell": "Casting {spell}.", + "CoC7.NotEnoughMagicPoints": "{spell} costs {originalMagicPoints} Magic Points, but you only have {actorMagicPoints}. Would you like to take the remaining {convertedHitPoints} from your Hit Points? You will take {convertedHitPoints} damage if you proceed.", "CoC7.CopyToClipboard": "Copy to clipboard", "CoC7.WhisperToSelection": "Whisper to selected tokens", @@ -135,7 +160,8 @@ "CoC7.DiceModifierPenalty": "penalty", "CoC7.Modifiers": "Modifiers", "CoC7.BonusDice": "Bonus Dice", - "CoC7.UnitsDie": "1 units die", + "CoC7.PenaltyDice": "Penalty Dice", + "CoC7.UnitsDie": "1 unit die", "CoC7.TensDie": "tens die", "CoC7.TensDice": "tens dice", "CoC7.SuccessRequired": "{successRequired} success required.", @@ -148,6 +174,8 @@ "CoC7.LuckSpent": "{luckAmount} luck spent to pass", "CoC7.LuckSpentAlt": "Luck spent", "CoC7.LuckError": "{actorName} didn't have enough luck to pass the check", + "CoC7.LuckNotEnough": "{name} didn't have enough luck to pass the check", + "CoC7.UpgradeSuccessWithLuck": "Upgrade to {{difficultyName}} success for {{luckToSpend}} luck.", "CoC7.check.AutoSuccess": "Auto. Success", "CoC7.check.AutoFailure": "Auto. Fail", "CoC7.RevealCheck": "Reveal check", @@ -160,6 +188,9 @@ "CoC7.RollSecretDice": "Keeper privately rolled some dice", "CoC7.KeeperSentDecoy": "Decoy roll sent to players", "CoC7.FakeRoll": "Send a decoy roll to players", + "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.ConstitutionCheck": "Constitution check", @@ -178,25 +209,34 @@ "CoC7.FlatModifier": "Flat modifier", "CoC7.RollDifficultyUnknown": "Blind", "CoC7.RollDifficultyRegular": "Regular", + "CoC7.RollDifficultyRegularTitle": "Regular difficulty", "CoC7.RollDifficultyHard": "Hard", + "CoC7.RollDifficultyHardTitle": "Hard difficulty", "CoC7.RollDifficultyExtreme": "Extreme", + "CoC7.RollDifficultyExtremeTitle": "Extreme difficulty", "CoC7.RollDifficultyCritical": "Critical", + "CoC7.RollDifficultyCriticalTitle": "Critical difficulty", "CoC7.RollResult.LuckSpendText": "{luckAmount} luck spend, {successLevel} success", "CoC7.RollDice": "Roll !", "CoC7.CreateLink": "Create link", "CoC7.SuccesLevelHint": "{value} level(s) of success", "CoC7.FailureLevelHint": "Failed by {value} level(s)", + "CoC7.CardType": "Roll type", "CoC7.CombinedRollCard": "Combined roll card", "CoC7.OpposedRollCard": "Opposed roll card", + "CoC7.GroupRollCard": "Group roll card", + "CoC7.RegularRollCard": "Regular roll card", "CoC7.CombinedAnyHint": "Any roll must succeed", "CoC7.CombinedAllHint": "All rolls must succeed", "CoC7.CloseCard": "Close card", + "CoC7.AttackManeuver": "Attack Maneuver", "CoC7.CheckResult": "{name} check ({value}%) - {difficulty} difficulty", "CoC7.ItemCheckResult": "{item} - {skill} check ({value}%) - {difficulty} difficulty", "CoC7.CheckRawValue": "({rawvalue}%) - {difficulty} difficulty", "CoC7.ArmorAbsorbsDamage": "Armor absorbs total damage", + "CoC7.ArmorIgnored": "Armor Ignored", "CoC7.Critical": "Critical", "CoC7.Impale": "Impale", "CoC7.CriticalTitle": "The blow is critical", @@ -213,9 +253,11 @@ "CoC7.FightBack": "Fighting Back", "CoC7.Dodge": "Dodging", "CoC7.Maneuver": "Maneuvering", + "CoC7.NoResponse": "No Response", "CoC7.OutNumbered": "Outnumbered", "CoC7.combatCard.surprised": "Surprised", "CoC7.combatCard.autoSuccess": "Auto. Success", + "CoC7.combatCard.automaticSuccess": "Automatic Success", "CoC7.Advantage": "Advantage", "CoC7.Disadvantage": "Disadvantage", "CoC7.TitleAdvantage": "Add 1 bonus die (target is prone, restrained...)", @@ -224,6 +266,7 @@ "CoC7.TitleSurprised": "Add 1 bonus dice for surprised target", "CoC7.TitleAutoSuccess": "Attack automatically hit", "CoC7.WinnerRollDamage": "{name} won. Roll damage.", + "CoC7.InitiatorMissed": "{name} missed.", "CoC7.NoWinner": "Both side failed.", "CoC7.DodgeSuccess": "{name} dodged!", "CoC7.ManeuverSuccess": "{name} maneuver was successful.", @@ -233,7 +276,11 @@ "CoC7.AdvantageDefender": "Advantage: Defender", "CoC7.Tie": "Tie", "CoC7.DamageInflicted": "Damage inflicted", + "CoC7.Damage": "Damage", "CoC7.TotalDamage": "Total damage", + "CoC7.CheckFailed": "Check failed", + "CoC7.CheckPassed": "Check passed", + "CoC7.CheckMemoryRepressed": "Memory repressed", "CoC7.combatCard.dive4cover": "Dive for Cover", @@ -270,6 +317,7 @@ "CoC7.rangeCombatCard.NormalTargetTitle": "Target has a normal size, no bonus/penalty", "CoC7.rangeCombatCard.InMeleeTitle": "1 penalty die. Target is engaged in melee combat", "CoC7.rangeCombatCard.FastMovingTargetTitle": "1 penalty die. Target is fast (MOV 8+) and moving at full speed", + "CoC7.rangeCombatCard.SurprisedTargetTitle": "1 bonus die for surprised target", "CoC7.meleeCombatDamageTakes": "takes", "CoC7.meleeCombatDamageFrom": "from", @@ -322,9 +370,11 @@ "CoC7.EraPulp": "Pulp Cthulhu", "CoC7.EraMdrn": "Modern", "CoC7.Eras": "Cthulhu Flavors", + "CoC7.EraAvailability": "Availability", "CoC7.SkillNoAdjustments": "No adjustment", "CoC7.SkillNoXpGain": "No XP gain", + "CoC7.SkillXpGainDisabled": "XP Gain disabled.", "CoC7.SkillSpecial": "Specialization", "CoC7.SkillRarity": "Uncommon", "CoC7.SkillPush": "Pushed", @@ -357,6 +407,8 @@ "CoC7.ErrorActor": "Couldn't locate actor", "CoC7.ErrorInvalidFormula": "{value} is not a valid formula", "CoC7.ErrorInvalid": "invalid", + "CoC7.ErrorInvalidCardType": "Card Type", + "CoC7.ErrorInvalidRollType": "Roll Type", "CoC7.Validate": "Validate", "CoC7.Apply": "Apply", @@ -365,7 +417,9 @@ "CoC7.DodgeSkillName": "Dodge", "CoC7.CthulhuMythosName": "Cthulhu Mythos", "CoC7.CreditRatingSkillName": "Credit Rating", + "CoC7.DriveAutoSkillName": "Drive Auto", "CoC7.FightingSpecializationName": "Fighting", + "CoC7.UnarmedWeaponName": "Unarmed", "CoC7.FirearmSpecializationName": "Firearms", "CoC7.DriveSpecializationName": "Drive", "CoC7.PilotSpecializationName": "Pilot", @@ -375,6 +429,8 @@ "CoC7.NewSkillName": "new skill", "CoC7.AddSkill": "Add skill", + "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.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}.
                Wait before clicking!
                ", - "CoC7.MessageTargetCheckRequested": "Your keeper is requesting a {check} for {name}.", + "CoC7.MessageCheckRequestedWait": "{check} roll requested by your Keeper.
                Wait before clicking!
                ", + "CoC7.MessageTargetCheckRequested": "Your keeper has requested {name} make a {check} roll.", "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.MessageSelectedTargetIsNotControlled": "The token for {name} is owned by not controlled by a player so will not be able to react to combat actions.", "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.ActorImporter": "Actor Importer", "CoC7.ActorImporterSummary": "Import an NPC or Creature from description and stats. Just paste the corresponding plain text", "CoC7.PasteTheDataBelow": "Paste the raw text data below", + "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.SelectActorType": "Select actor type", "CoC7.NonPlayingCharacter": "Non Playing Character (NPC)", "CoC7.Creature": "Creature", @@ -680,9 +914,27 @@ "CoC7.English": "English", "CoC7.Spanish": "Spanish", "CoC7.French": "French", + "CoC7.German": "German", + "CoC7.Polish": "Polish", + "CoC7.TraditionalChinese": "Traditional Chinese", "CoC7.SelectSourceLanguage": "Select the source text language", "CoC7.ImportedUnnamedCharacter": "Imported unnamed character", - "CoC7.CreatedImportedCharactersFolder": "Created 'Imported Characters' folder'", + "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.", @@ -693,32 +945,100 @@ "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": "
                1. Left click roll check with options
                2. Shift + Left click Immediate regular difficulty roll
                1. Right click Opposed check with options
                2. Shift + Right click Immediate opposed check
                1. Alt/Option + Right click Combined check with options
                2. Shift + Alt/Option + Right click Immediate combined check
                ", + "CoC7.ToolTipKeeperSkill": "
                1. Ctrl + Left click Create roll link
                2. Shift + Ctrl + Left click Create roll link with modifiers
                3. {other}
                ", + "CoC7.ToolTipKeeperStandbySkill": "
              3. Left click Request a roll from {name}
              4. ", + "CoC7.ToolTipDB": "
                1. Left click Immediate roll
                ", + "CoC7.ToolTipSanity": "
                1. Left click roll check with options
                2. Alt/Option + Left click roll sanity loss with options
                3. Shift + Left click Immediate regular difficulty roll
                4. Shift + Alt/Option + Left click roll sanity loss without dice pool options
                1. Right click Opposed check with options
                2. Shift + Right click Immediate opposed check
                1. Alt/Option + Right click Combined check with options
                2. Shift + Alt/Option + Right click Immediate combined check
                ", + "CoC7.ToolTipCombat": "
                1. Left click roll check with options
                2. Shift + Left click Immediate regular difficulty roll
                1. Right click Combat opposed maneuver with options
                2. Shift + Right click Immediate combat opposed maneuver
                ", + "CoC7.ToolTipKeeperSanity": "
              5. Ctrl + Alt/Option Create sanity check roll link
              6. ", + "CoC7.ToolTipAutoToggle": "
                1. Left click Toggle automatic calculation / manual entry
                2. ", + "CoC7.ToolTipSkillFlagToggle": "
                  1. Double Click Toggle flag status
                  2. ", + "CoC7.ToolTipSkillFlagged": "Flagged for development", + "CoC7.ToolTipSkillUnflagged": "Not flagged for development", + "SETTINGS.TitleRules": "Rules", "SETTINGS.TitleInitiative": "Initiative Settings", "SETTINGS.TitleRoll": "Roll Settings", "SETTINGS.TitleChatCards": "Chat Cards Settings", "SETTINGS.TitleScene": "Scene Settings", "SETTINGS.TitleSheet": "Sheet Settings", + "SETTINGS.TitleGameArtwork": "Game Artwork Settings", "SETTINGS.TitleWeapon": "Weapon Settings", "SETTINGS.TitleDiceSoNice": "Dice So Nice Settings", "SETTINGS.TitleDeveloperDebug": "Developer And Debug Settings", "SETTINGS.TitleRollTable": "Roll Table Settings", + "SETTINGS.TitleChaseSettings": "Chase Settings", "SETTINGS.DebugMode": "System Debug Mode", "SETTINGS.DebugModeHint": "!!RESTART REQUIRED!!", "SETTINGS.DefaultDifficulty": "Default check difficulty", "SETTINGS.DefaultDifficultyHint": "You can choose the default difficulty for checks. Unknown will roll checks without the player knowing the check difficulty.", "SETTINGS.CheckDifficultyRegular": "Default difficulty", "SETTINGS.CheckDifficultyUnknown": "Unknown difficulty", + "SETTINGS.showIconsOnly": "On summarized sheet, show only icons on skills list.", "SETTINGS.UseToken": "Use token image", - "SETTINGS.UseTokenHint": "Use token image instead of portraits in chat-cards", + "SETTINGS.UseTokenHint": "Use token image instead of portraits in chat cards", + "SETTINGS.TrustedCanModfyChatCard": "Allow trusted user to modify chat card", + "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": "Allow trusted user to see GM only sections", + "SETTINGS.TrustedCanSeeChatCardHint": "Enabling this setting will give permission to trusted users to see GM only section on chat card. Use this with caution!", "SETTINGS.DisplayActorOnCard": "Display actor on card", - "SETTINGS.DisplayActorOnCardHint": "Display the actor's image/token on combat chat-cards", + "SETTINGS.DisplayActorOnCardHint": "Display the actor's image/token on combat chat cards", "SETTINGS.InitiativeRule": "Select initiative rule", "SETTINGS.InitiativeRuleHint": "You can select basic initiative rule (using DEX value) or optional rule (using a roll)", "SETTINGS.InitiativeRuleBasic": "Basic", @@ -750,10 +1070,16 @@ "SETTINGS.TenDieBonusHint": "When using DsN, colorset to use for ten bonus dice. (leave blank to use player default)", "SETTINGS.TenDiePenalty": "[DsN] Ten penalty dice colorset", "SETTINGS.TenDiePenaltyHint": "When using DsN, colorset to use for penalty bonus dice. (leave blank to use player default)", + "SETTINGS.OverrideGameArtwork": "Override game Artwork", + "SETTINGS.OverrideGameArtworkHint": "!!RESTART REQUIRED!! gives access to advance game config, leave blank for default", + "SETTINGS.ArtPauseImage": "Pause image", + "SETTINGS.ArtPauseImageHint": ". Type 'null' to remove image", + "SETTINGS.ArtPauseText": "Pause text", + "SETTINGS.ArtPauseTextHint": "Leave blank for default", "SETTINGS.OverrideSheetArtwork": "Override Sheet Artwork", "SETTINGS.OverrideSheetArtworkHint": "!!RESTART REQUIRED!! gives access to advance sheet config, leave blank for default", "SETTINGS.ArtWorkSheetBackground": "Character sheet background", - "SETTINGS.ArtWorkSheetBackgroundHint": "type 'null' to remove background", + "SETTINGS.ArtWorkSheetBackgroundHint": "type 'null' to remove background, blank for default", "SETTINGS.ArtWorkSheetBackgroundType": "Background type", "SETTINGS.BackgroundSlice": "Background image will be sliced (css:border-image)", "SETTINGS.BackgroundAuto": "Scales the image maintening proportions (css:auto)", @@ -799,5 +1125,19 @@ "SETTINGS.OneBlockBackStory": "One block backstory", "SETTINGS.OneBlockBackStoryHint": "Turn backstory to one editor block, but you can format/add links.", "SETTINGS.EnableStatusIcons": "Enable status icons", - "SETTINGS.EnableStatusIconsHint": "Set if combat and sanity effects icons are shown in tokens." + "SETTINGS.EnableStatusIconsHint": "Set if combat and sanity effects icons are shown in tokens.", + "SETTINGS.ShowExperimentalFeatures": "Show Experimental Features", + "SETTINGS.ShowExperimentalFeaturesHint": "Your world may become unusable in a future release if you use these features. For testing only DO NOT use these in your game worlds", + "CoC7.ExperimentalFeaturesWarning": "This feature is a work in progress and is not recommended for use in your game world.", + "SETTINGS.CheckElevation": "Include elevation in distance", + "SETTINGS.CheckElevationHint": "Use elevation in range combat distance calculations", + "CoC7.toolTipDelay": "Millisecond delay before tooltip should show, 0 for never", + "SETTINGS.ChaseShowTokenMovement": "Show token movement.", + "SETTINGS.ChaseShowTokenMovementHint": "Show movement on the grid when a token is moved to the next location.", + + "CoC7.getTheExample": "Copy Example", + "CoC7.Copied": "Copied the Example Text to Clipboard", + + "CoC7.EffectNew": "New effect", + "CoC7.EffectAppliedCantOverride": "An active effect is applies. You can't modify [{name}]. Deactivate the corresponding effect to modify this value." } diff --git a/lang/es.json b/lang/es.json index f53c3d82..a6d609fc 100644 --- a/lang/es.json +++ b/lang/es.json @@ -5,6 +5,7 @@ "CoC7.title": "La Llamada de Cthulhu 7a Edición (no oficial)", "CoC7.Entities.Character": "Personaje", + "CoC7.Entities.Container": "Contenedor", "CoC7.Entities.Creature": "Criatura", "CoC7.Entities.Npc": "PNJ", "CoC7.Entities.Vehicle": "Vehículo", @@ -92,6 +93,7 @@ "CoC7.Spells": "Hechizos", "CoC7.Spell": "Hechizo", "CoC7.Spells&Notes": "Hechizos y Notas", + "CoC7.Weapons": "Armas", "CoC7.Effects": "Efectos", "CoC7.Cost": "Coste", "CoC7.Source": "Fuente", @@ -119,6 +121,16 @@ "CoC7.Icon": "Icono", "CoC7.Check": "Prueba", "CoC7.ItemWeapon": "Objeto (arma)", + "CoC7.AttacksPerRound": "Ataques por asalto", + + "CoC7.Cast": "Lanzamiento", + "CoC7.SanityCost": "Coste COR", + "CoC7.PowerCost": "Coste POD", + "CoC7.HitPointsCost": "Coste PVs", + "CoC7.MagicPointsCost": "Coste PMs", + "CoC7.OtherCosts": "Otro coste", + "CoC7.CastingSpell": "Lanzando {spell}.", + "CoC7.NotEnoughMagicPoints": "El hechizo {spell} cuesta {originalMagicPoints} PMs, pero solo dispone de {actorMagicPoints}. ¿Desea tomar los restantes {convertedHitPoints} de sus PVs? Se le causará un daño de {convertedHitPoints} PVs si continúa", "CoC7.CopyToClipboard": "Copiar al portapapeles", "CoC7.WhisperToSelection": "Susurrar a iconos seleccionados", @@ -216,6 +228,7 @@ "CoC7.FightBack": "Contraatacar", "CoC7.Dodge": "Esquivar", "CoC7.Maneuver": "Maniobra", + "CoC7.NoResponse": "No reaccionar", "CoC7.OutNumbered": "Superado", "CoC7.combatCard.surprised": "Sorprendido", "CoC7.combatCard.autoSuccess": "Éxito Automático", @@ -227,6 +240,7 @@ "CoC7.TitleSurprised": "Añadir 1 dado de bonificación por objetivo sorprendido", "CoC7.TitleAutoSuccess": "El ataque impacta automáticamente", "CoC7.WinnerRollDamage": "{name} ha ganado. Tirar daño", + "CoC7.InitiatorMissed": "{name} falló.", "CoC7.NoWinner": "Ambas partes han fallado", "CoC7.DodgeSuccess": "{name} ha esquivado!", "CoC7.ManeuverSuccess": "La maniobra {name} ha tenido éxito", @@ -325,6 +339,7 @@ "CoC7.EraPulp": "Pulp Cthulhu", "CoC7.EraMdrn": "Época Actual", "CoC7.Eras": "Épocas Cthulhu", + "CoC7.EraAvailability": "Disponibilidad", "CoC7.SkillNoAdjustments": "Sin ajustes", "CoC7.SkillNoXpGain": "Sin ganancia de EXP", @@ -368,6 +383,7 @@ "CoC7.DodgeSkillName": "Esquivar", "CoC7.CthulhuMythosName": "Mitos de Cthulhu", "CoC7.CreditRatingSkillName": "Crédito", + "CoC7.DriveAutoSkillName": "Conducir automóvil", "CoC7.FightingSpecializationName": "Combatir", "CoC7.FirearmSpecializationName": "Armas de fuego", "CoC7.DriveSpecializationName": "Conducir", @@ -389,6 +405,7 @@ "CoC7.DevSuccessDetails": "{item} se ha aumentado un {augment}%", "CoC7.SanGained": "Ha recuperado 2d6 ({results} = {sanGained}) de cordura tras dominar la habilidad {skill} con un {skillValue}%", "CoC7.DevFailureDetails": "{item} NO se ha aumentado", + "CoC7.ReduceSanityLimits": "Reducidos en 1 todos los límites de COR", "CoC7.DevSuccess": "({die}/{score}%), {item} se ha aumentado un {augment}%", "CoC7.DevFailure": "({die}/{score}%), {item} NO se ha aumentado", "CoC7.LuckIncreased": "{augment} puntos de suerte recuperados ({die}/{score})", @@ -399,10 +416,21 @@ "CoC7.DeleteSkill": "Eliminar habilidad", "CoC7.RangeSkills": "Habilidades de combate a distancia", "CoC7.MeleeSkills": "Habilidades de combate cuerpo a cuerpo", - "CoC7.NewItemName": "nuevo ítem", - "CoC7.AddItem": "Añadir ítem", - "CoC7.EditItem": "Editar ítem", - "CoC7.DeleteItem": "Eliminar ítem", + "CoC7.NewItemName": "nuevo objeto", + "CoC7.AddItem": "Añadir objeto", + "CoC7.EditItem": "Editar objeto", + "CoC7.DeleteItem": "Eliminar objeto", + "CoC7.TradeItem": "Cambiar/almacenar objeto", + "CoC7.SortBySkillName": "Ordenar por nombre de habilidad", + "CoC7.SortBySkillValue": "Ordenar por porcentaje de habilidad", + "CoC7.UncommonSkillsShow": "Mostrar habilidades infrecuentes", + "CoC7.UncommonSkillsHide": "Ocultar habilidades infrecuentes", + + "CoC7.NewBookName": "nuevo tomo", + "CoC7.AddBook": "Añadir tomo", + "CoC7.NewSpellName": "nuevo hechizo", + "CoC7.AddSpell": "Añadir hechizo", + "CoC7.AddWeapon": "Añadir arma", "CoC7.NewWeaponName": "nueva arma", "CoC7.EditWeapon": "Editar arma", @@ -413,6 +441,7 @@ "CoC7.WeaponSkill": "Habilidad", "CoC7.WeaponSkillAlt": "Hab. alternativa", "CoC7.Inventory": "Inventario", + "CoC7.InventoryIsCurrentlyEmpty": "Inventario actualmente vacío", "CoC7.CharacterDevelopment": "Desarrollo", "CoC7.OccupationSkill": "Habilidad de ocupación", "CoC7.ArchetypeSkill": "Habilidad de arquetipo", @@ -454,6 +483,24 @@ "CoC7.BackgroundDeleteSection": "Eliminar sección", "CoC7.BackgroundSectionMoveUp": "Subir", "CoC7.BackgroundSectionMoveDown": "Bajar", + "CoC7.BackgroundEncounters": "Pérdida debido a Entidades Desconocidas", + "CoC7.BackgroundFlags": "Etiquetas", + "CoC7.BackgroundFlagsMythosExperienced": "recompenmsado con 5% de locura por Mitos", + "CoC7.BackgroundFlagsMythosHardened": "Curtido en los Mitos", + + "CoC7.SanityLossEncounters": "Encuentros de pérdida de COR", + "CoC7.SanityLossImmunities": "Inmunidades de pérdida de COR", + "CoC7.AddSanityLossEncounter": "Añadir encuentro de pérdida de COR", + "CoC7.AddSanityLossImmunity": "Añadir inmunidad de pérdida de COR", + "CoC7.DeleteSanityLossEncounter": "Borrar encuentro de pérdida de COR", + "CoC7.DeleteSanityLossImmunity": "Borrar inmunidad de pérdida de COR", + + "CoC7.SanityLossTypeDialogTitle": "Nueva pérdida de COR o inmunidad", + "CoC7.SanityLossTypeDialogBody": "Añade al personaje un nuevo encuentro con los Mitos, pérdida de COR o inmunidad de pérdida de COR", + "CoC7.SanityLossTypeReason": "Causa", + "CoC7.SanityLossTypeValue": "Pérdida de COR", + "CoC7.SanityLossEncounter": "Encuentro de pérdida de COR", + "CoC7.SanityLossImmunity": "Inmunidad de pérdida de COR", "CoC7.creatureFightingSkill": "Combatir", @@ -516,6 +563,8 @@ "CoC7.GateSpell": "Portal", "CoC7.CombatSpell": "Combate", "CoC7.SpellType": "Tipo de Hechizo", + "CoC7.SpellSuccessfullyLearned": "¡Hechizo '{spell}' aprendido con éxito!", + "CoC7.SpellAlreadyLearned": "Ya conoce el hechizo ('{spell}')", "CoC7.BookHasNothingMoreToTeach": "No tiene nada que aprender de {book}. La habilidad de Mitos de Cthulhu de {actor} es mayor que la puntuación de Mitos", "CoC7.BookType": "Tipo de Libro", @@ -586,6 +635,7 @@ "CoC7.Chosen": "Escogido", "CoC7.EmptySkillList": "Añada una habilidad soltándola aquí", "CoC7.EmptyItemList": "Añada un objeto soltándolo aquí", + "CoC7.EmptyCharacterSkillList": "Añada una configuración, ocupación o habilidad soltándolas aquí", "CoC7.PersonalSpeciality": "Número de especialidades personales o de la época", "CoC7.AdditionalSkills": "Habilidades Adicionales", "CoC7.SkillSelectionWindow": "Seleccione habilidades opcionales", @@ -636,7 +686,10 @@ "CoC7.WarnNoControlledActor": "En estos momentos no controla a ningún actor", "CoC7.WarnFastTargetWithWrongMOV": "Se ha seleccionado Rápido cuando el objetivo tiene un MOV inferior a 8. (MOV: {mov})", "CoC7.WarnTooManyTarget": "Seleccionados demasiados objetivos. Solo se guardará el último objetivo seleccionado", + "CoC7.WarnNoTargetsSanCheck": "No ha seleccionado ningún objetivo. Seleccione uno o bien cree un enlace", + "CoC7.allActors": "Todos los actores", + "CoC7.restTargets": "Descansar objetivos", "CoC7.startRest": "Comenzando descanso", "CoC7.dreaming": "Los investigadores esperan... soñando", "CoC7.healthRecovered": "Un PV recuperado", @@ -659,7 +712,6 @@ "CoC7.MessageTargetCheckRequested": "El guardián ha pedido a {name} una tirada de {check}", "CoC7.MessageTitleSelectSingleUserForTarget": "Qué usuario podrá responder al ataque", "CoC7.MessageSelectSingleUserForTarget": "Este icono está controlado por varios usuarios, por favor, seleccione que usuario podrá responder al ataque", - "CoC7.MessageSelectedTargetIsNotControlled": "El icono {name} no está siendo controlado por nadie, de modo que no podrá realizar ninguna reacción en combate cuando le ataquen", "CoC7.MessageBoutOfMadnessTableNotFound": "No se ha encontrado el resultado de la tabla de locura, por favor, compruebe que se han creado las tablas", "CoC7.MessageBoutOfMadnessItemNotFound": "No se ha encontrado el resultado de la tabla de locura, por favor, compruebe que se han creado los estatus", @@ -673,6 +725,7 @@ "CoC7.ActorImporter": "Importador de actores", "CoC7.ActorImporterSummary": "Importa un PNJ o criatura a partir de sus estadísticas y descripción. Solo deberá copiar sus estadísticas en formato texto plano", "CoC7.PasteTheDataBelow": "Pegue más abajo el texto sin formato", + "CoC7.TextFieldInvalidCharacters": "Caracteres inválidos en el texto, por favor, revíselo o será eliminado", "CoC7.SelectActorType": "Seleccione tipo de actor", "CoC7.NonPlayingCharacter": "Personaje no jugador (PNJ)", "CoC7.Creature": "Criatura", @@ -683,9 +736,18 @@ "CoC7.English": "Inglés", "CoC7.Spanish": "Español", "CoC7.French": "Francés", + "CoC7.German": "Alemán", + "CoC7.Polish": "Polaco", + "CoC7.TraditionalChinese": "Chino tradicional", "CoC7.SelectSourceLanguage": "Seleccione el idioma del texto original", "CoC7.ImportedUnnamedCharacter": "Se ha importado personaje 'unnamed'", - "CoC7.CreatedImportedCharactersFolder": "Creada carpeta 'Imported Characters'", + "CoC7.CreatedImportedCharactersFolder": "Creada carpeta 'Personajes importados'", + "CoC7.ImportedCharactersFolder": "Personajes importados", + "CoC7.ImportSkillItemLocations": "Buscar habilidades/hechizos/armas en", + "CoC7.ImportActorItemsNone": "Ninguno", + "CoC7.ImportActorItemsItem": "Objetos", + "CoC7.ImportActorItemsItemWorldModuleSystem": "Objetos / Mundo / Módulos / Sistema", + "CoC7.ImportActorItemsWorldModuleItemSystem": "Mundo / Módulos / Objetos / Sistema", "CoC7.HowToTranslateTitle": "¿Cómo traducir el sistema?", "CoC7.HowToTranslateWarning": "No instale ningún módulo que no sea de su confianza", @@ -696,18 +758,67 @@ "CoC7.Migrate.Title": "Se requiere actualizar", "CoC7.Migrate.Message": "

                    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": "
                    1. Clic izquierdo tirada con opciones
                    2. Mayús + clic izquierdo Tirada inmediata a dificultad normal
                    1. Clic derecho Tirada enfrentada con opciones
                    2. Mayús + clic derecho Tirada enfrentada inmediata
                    1. Alt/Opción + clic derecho Tirada combinada con opciones
                    ", + "CoC7.ToolTipKeeperSkill": "
                    1. CTRL + clic izquierdo Crear enlace a tirada
                    2. {other}
                    ", + "CoC7.ToolTipKeeperStandbySkill": "
                  3. Clic izquierdo Petición de tirada a {name}
                  4. ", + "CoC7.ToolTipDB": "
                    1. Clic izquierdo Tirada inmediata a dificultad normal
                    ", + "CoC7.ToolTipKeeperSanity": "
                  5. CTRL + Alt/Opción Crea enlace a tirada de COR
                  6. ", + "CoC7.ToolTipAutoToggle": "
                    1. Left click Conmuta entre cálculo automático/entrada manual
                    2. ", + "CoC7.ToolTipSkillFlagToggle": "
                      1. Doble clic Marcar/desmarcar
                      2. ", + "CoC7.ToolTipSkillFlagged": "Marcada para desarrollo", + "CoC7.ToolTipSkillUnflagged": "No marcada para desarrollo", + "SETTINGS.TitleRules": "Reglas", "SETTINGS.TitleInitiative": "Ajustes de iniciativa", "SETTINGS.TitleRoll": "Ajustes de tiradas", "SETTINGS.TitleChatCards": "Ajustes de tarjetas del chat", "SETTINGS.TitleScene": "Ajustes de escena", "SETTINGS.TitleSheet": "Ajustes de la hoja", + "SETTINGS.TitleGameArtwork": "Ajustes de arte del juego", "SETTINGS.TitleWeapon": "Ajustes de armas", "SETTINGS.TitleDiceSoNice": "Ajustes Dice So Nice", "SETTINGS.TitleDeveloperDebug": "Ajustes de desarrollo y depuración", @@ -718,6 +829,7 @@ "SETTINGS.DefaultDifficultyHint": "Puedes indicar la dificultad por defecto de las tiradas. Desconocida lanzará tiradas sin que el jugador conozca la dificultad", "SETTINGS.CheckDifficultyRegular": "Dificultad por defecto", "SETTINGS.CheckDifficultyUnknown": "Dificultad desconocida", + "SETTINGS.showIconsOnly": "En la hoja resumen, mostrar solo los iconos en la lista de habilidades", "SETTINGS.UseToken": "Usar imagen del icono", "SETTINGS.UseTokenHint": "Usar la imagen del icono en lugar de los retratos en las cartas del chat", "SETTINGS.DisplayActorOnCard": "Mostrar actor en carta", @@ -753,6 +865,12 @@ "SETTINGS.TenDieBonusHint": "Cuando se usa Dice so Nice (DsN), configuración de dado de bonificación (si no se especifica otra cosa, usa los valores por defecto del jugador)", "SETTINGS.TenDiePenalty": "[DsN] Configuración de dado de penalización", "SETTINGS.TenDiePenaltyHint": "Cuando se usa Dice so Nice (DsN), configuración de dado de penalización (si no se especifica otra cosa, usa los valores por defecto del jugador)", + "SETTINGS.OverrideGameArtwork": "Sobrescribir arte del juego", + "SETTINGS.OverrideGameArtworkHint": "!!REQUIERE REINICIAR!! da acceso al modo de configuración avanzada, deje en blanco para usar la configuración por defecto", + "SETTINGS.ArtPauseImage": "Imagen de pausa", + "SETTINGS.ArtPauseImageHint": ". Escriba 'null' para quitar la imagen", + "SETTINGS.ArtPauseText": "Texto de pausa", + "SETTINGS.ArtPauseTextHint": "Deje en blanco para usar el texto por defecto", "SETTINGS.OverrideSheetArtwork": "Sobrescribir arte de la hoja de PJ", "SETTINGS.OverrideSheetArtworkHint": "!!REQUIERE REINICIAR!! Da acceso a la configuración avanzada de la hoja de personaje, deje las opciones en blanco para usar los valores por defecto", "SETTINGS.ArtWorkSheetBackground": "Fondo de la hoja de PJ", @@ -802,5 +920,14 @@ "SETTINGS.OneBlockBackStory": "Trasfondo en un solo bloque", "SETTINGS.OneBlockBackStoryHint": "Convertir el transfondo en un solo bloque de edición, se pueden añadir formateo y pegar enlaces", "SETTINGS.EnableStatusIcons": "Activar iconos de estado", - "SETTINGS.EnableStatusIconsHint": "Determina si se deben mostrar de los efectos de combate y cordura en los iconos" + "SETTINGS.EnableStatusIconsHint": "Determina si se deben mostrar de los efectos de combate y cordura en los iconos", + "SETTINGS.ShowExperimentalFeatures": "Mostrar características experimentales", + "SETTINGS.ShowExperimentalFeaturesHint": "Su mundo puede corromperse en próximas versiones si usa estas características. Solo para pruebas, no las use en sus mundos de juego", + "CoC7.ExperimentalFeaturesWarning": "Esta característica está en desarrollo y no se recomienda su uso en sus mundos de juego", + "SETTINGS.CheckElevation": "Incluir elevación en la distancia", + "SETTINGS.CheckElevationHint": "Usa la elevación en el combate a distancia para medir alcances", + "CoC7.toolTipDelay": "Retraso en milisegundos que tarda en aparecer los mensajes emergentes, ajustar a 0 para no mostrarlos nunca", + + "CoC7.getTheExample": "Copiar ejemplo", + "CoC7.Copied": "Ejemplo copiado al portapapeles" } diff --git a/lang/fr.json b/lang/fr.json index be8053b2..e7847c12 100644 --- a/lang/fr.json +++ b/lang/fr.json @@ -2,6 +2,7 @@ "CoC7.title": "L'Appel de Cthulhu 7ème Édition (non officiel)", "CoC7.Entities.Character": "Personnage", + "CoC7.Entities.Container": "Coffre", "CoC7.Entities.Creature": "Créature", "CoC7.Entities.Npc": "PNJ", "CoC7.Entities.Vehicle": "Véhicule", @@ -11,10 +12,10 @@ "CoC7.Entities.Chase": "Poursuite", "CoC7.Entities.Item": "Objet", "CoC7.Entities.Occupation": "Occupation", - "CoC7.Entities.Setup": "Setup", + "CoC7.Entities.Setup": "Générateur", "CoC7.Entities.Skill": "Compétence", "CoC7.Entities.Spell": "Sort", - "CoC7.Entities.Status": "Status", + "CoC7.Entities.Status": "État", "CoC7.Entities.Talent": "Talent", "CoC7.Entities.Weapon": "Arme", @@ -89,6 +90,7 @@ "CoC7.Spells": "Sorts", "CoC7.Spell": "Sort ", "CoC7.Spells&Notes": "Sorts et notes ", + "CoC7.Weapons": "Armes", "CoC7.Effects": "Effets", "CoC7.Cost": "Coût", "CoC7.Source": "Source", @@ -97,7 +99,9 @@ "CoC7.Other": "Autres", "CoC7.rounds": "round(s)", "CoC7.hours": "heure(s)", + "CoC7.days": "jour(s)", "CoC7.weeks": "semaine(s)", + "CoC7.months": "mois", "CoC7.remove": "Retirer", "CoC7.Any": "N'importe", "CoC7.All": "Tous", @@ -116,6 +120,16 @@ "CoC7.Icon": "Icône", "CoC7.Check": "Test", "CoC7.ItemWeapon": "Objet (Arme)", + "CoC7.AttacksPerRound": "Attaques par round", + + "CoC7.Cast": "Jet", + "CoC7.SanityCost": "Coût en SAN", + "CoC7.PowerCost": "Coût en Pouvoir", + "CoC7.HitPointsCost": "Coût en Points de Vie", + "CoC7.MagicPointsCost": "Coût en Points de Magie", + "CoC7.OtherCosts": "Autres coûts", + "CoC7.CastingSpell": "Jette {spell}.", + "CoC7.NotEnoughMagicPoints": "{spell} coûte {originalMagicPoints} Points de Magie, vous n'en avez que {actorMagicPoints}. Voulez-vous utiliser vos {convertedHitPoints} Points de Vie restants? Vous subirez {convertedHitPoints} points de dommage en le faisant.", "CoC7.CopyToClipboard": "Copier vers le presse-papier", "CoC7.WhisperToSelection": "Murmurer aux tokens sélectionnés", @@ -160,6 +174,7 @@ "CoC7.RollSecretDice": "Le gardien fait un jet privé", "CoC7.KeeperSentDecoy": "Jet leurre envoyé aux joueurs", "CoC7.FakeRoll": "Envoyer un jet leurre aux joueurs", + "CoC7.ErrorMissingKeeperUser": "Votre gardien doit être connecté pour accomplir cette action", "CoC7.ConstitutionCheck": "Test de constitution", @@ -176,7 +191,7 @@ "CoC7.RollThreshold": "Seuil du jet", "CoC7.FlatDiceModifier": "Modificateur de jet", "CoC7.FlatModifier": "Modificateur de seuil", - "CoC7.RollDifficultyUnknown": "Aveugle", + "CoC7.RollDifficultyUnknown": "Difficulté inconnue", "CoC7.RollDifficultyRegular": "Ordinaire", "CoC7.RollDifficultyHard": "Majeur", "CoC7.RollDifficultyExtreme": "Extrême", @@ -186,11 +201,15 @@ "CoC7.CreateLink": "Créer un lien", "CoC7.SuccesLevelHint": "{value} Niveau(x) de réussite", "CoC7.FailureLevelHint": "Échec de {value} niveau(x)", + "CoC7.CardType": "Type jet", "CoC7.CombinedRollCard": "Carte de jet combiné", "CoC7.OpposedRollCard": "Carte de jet opposé", + "CoC7.GroupRollCard": "Carte de jet groupé", + "CoC7.RegularRollCard": "Carte de jet normale", "CoC7.CombinedAnyHint": "Une réussite minimum demandée", "CoC7.CombinedAllHint": "Tous les jets doivent réussir", "CoC7.CloseCard": "Fermer la carte", + "CoC7.AttackManeuver": "Manœuvre d'attaque", "CoC7.CheckResult": "jet de {name} ({value}%) - difficulté {difficulty}", "CoC7.ItemCheckResult": "{item} - jet de {skill} obtient ({value}%) - difficulté {difficulty}", @@ -213,6 +232,7 @@ "CoC7.FightBack": "Rendre les coups", "CoC7.Dodge": "Esquive", "CoC7.Maneuver": "Manœuvre", + "CoC7.NoResponse": "Pas de Réponse", "CoC7.OutNumbered": "En sous-nombre", "CoC7.combatCard.surprised": "Surpris", "CoC7.combatCard.autoSuccess": "Réussite Auto.", @@ -224,6 +244,7 @@ "CoC7.TitleSurprised": "Ajouter 1 dé bonus si la cible est surprise", "CoC7.TitleAutoSuccess": "L'attaque touche automatiquement", "CoC7.WinnerRollDamage": "{name} a gagné, jet de dommages.", + "CoC7.InitiatorMissed": "{name} a raté.", "CoC7.NoWinner": "Les deux camps ont échoué.", "CoC7.DodgeSuccess": "{name} esquive !", "CoC7.ManeuverSuccess": "La manœuvre de {name} a réussi.", @@ -287,7 +308,7 @@ "CoC7.SkillOccupation": "Occupation", "CoC7.SkillPersonal": "Personnel", - "CoC7.SkillTotalExperience": "Points d'expérience", + "CoC7.SkillTotalExperience": "Points(%) d'expérience", "CoC7.SkillTotalArchetype": "Points d'archétype", "CoC7.SkillTotalOccupation": "Points d'occupation", "CoC7.SkillTotalPersonal": "Points personnels", @@ -322,6 +343,7 @@ "CoC7.EraPulp": "Cthulhu Pulp", "CoC7.EraMdrn": "Moderne", "CoC7.Eras": "Époques Cthulhiennes", + "CoC7.EraAvailability": "Disponibilité", "CoC7.SkillNoAdjustments": "Pas d'ajustement", "CoC7.SkillNoXpGain": "Pas de gain d'XP", @@ -357,6 +379,8 @@ "CoC7.ErrorActor": "Personnage introuvable", "CoC7.ErrorInvalidFormula": "{value} n'est pas une formule valide", "CoC7.ErrorInvalid": "invalide", + "CoC7.ErrorInvalidCardType": "Type de Carte", + "CoC7.ErrorInvalidRollType": "Type de Jet", "CoC7.Validate": "Valider", "CoC7.Apply": "Appliquer", @@ -365,6 +389,7 @@ "CoC7.DodgeSkillName": "Esquive", "CoC7.CthulhuMythosName": "Mythe de Cthulhu", "CoC7.CreditRatingSkillName": "Crédit", + "CoC7.DriveAutoSkillName": "Conduite", "CoC7.FightingSpecializationName": "Combat rapproché", "CoC7.FirearmSpecializationName": "Combat à distance", "CoC7.DriveSpecializationName": "Conduite", @@ -377,7 +402,7 @@ "CoC7.AddSkill": "Ajouter une compétence", "CoC7.DevelopemmentPhase": "Phase de développement", "CoC7.RecoverLuckPoints": "Récupérer de la Chance", - "CoC7.SkillCantGainXp": "La compétence ne peut pas gagner d'XP", + "CoC7.SkillCantGainXp": "La compétence ne peut pas gagner d'expérience", "CoC7.SkillUnflagForDevelopement": "Retirer du développement ", "CoC7.SkillFlagForDevelopement": "Cocher pour développer", "CoC7.RollAll4Dev": "Lancer toutes les compétences à développer", @@ -386,6 +411,7 @@ "CoC7.DevSuccessDetails": "{item} augmenté de {augment}%", "CoC7.SanGained": "Gagne 2d6 ({results} = {sanGained}) Points de SAN grâce à sa maîtrise de {skill} avec un pourcentage de {skillValue}%", "CoC7.DevFailureDetails": "{item} NON augmenté ", + "CoC7.ReduceSanityLimits": "Limites de SAN réduites", "CoC7.DevSuccess": "{item} augmenté ({die}/{score}%) par {augment}%", "CoC7.DevFailure": "{item} NON augmenté ({die}/{score}%)", "CoC7.LuckIncreased": "Chance récupérée ({die}/{score}) de {augment} points", @@ -400,6 +426,17 @@ "CoC7.AddItem": "Ajouter un objet", "CoC7.EditItem": "Éditer objet", "CoC7.DeleteItem": "Supprimer objet", + "CoC7.TradeItem": "Vendre / ranger Objet", + "CoC7.SortBySkillName": "Trier par nom de compétence", + "CoC7.SortBySkillValue": "Trier par valeur de compétence", + "CoC7.UncommonSkillsShow": "Montrer les compétences spéciales", + "CoC7.UncommonSkillsHide": "Cacher les compétences spéciales", + + "CoC7.NewBookName": "nouvel ouvrage", + "CoC7.AddBook": "Ajouter un ouvrage", + "CoC7.NewSpellName": "nouveau sort", + "CoC7.AddSpell": "Ajouter un sort", + "CoC7.AddWeapon": "Ajouter une arme", "CoC7.NewWeaponName": "Nouvelle arme", "CoC7.EditWeapon": "Éditer l'arme", @@ -410,6 +447,7 @@ "CoC7.WeaponSkill": "Principale", "CoC7.WeaponSkillAlt": "Alternative", "CoC7.Inventory": "Inventaire", + "CoC7.InventoryIsCurrentlyEmpty": "Inventaire vide pour le moment.", "CoC7.CharacterDevelopment": "Développement", "CoC7.OccupationSkill": "Compétence professionnelle", "CoC7.ArchetypeSkill": "Compétence d'archétype", @@ -418,7 +456,7 @@ "CoC7.SanRollHint": "Déclencher un test de SAN pour les personnages ciblés", "CoC7.SANCheckTitle": "Perte de SAN : {name} ({sanMin}/{sanMax})", "CoC7.NoSkill": "Aucune compétence", - "CoC7.AddWeapontHint": "

                        {actor} n'a pas d'{weapon}.
                        Veux-tu en créer une ?

                        ", + "CoC7.AddWeapontHint": "

                        {actor} n'a pas de {weapon}.
                        Veux-tu en créer une ?

                        ", "CoC7.LinkCheck": " test de {name}", "CoC7.LinkCheckDiff": "[{difficulty}] test de {name}", @@ -451,6 +489,24 @@ "CoC7.BackgroundDeleteSection": "Supprimer la section", "CoC7.BackgroundSectionMoveUp": "Monter", "CoC7.BackgroundSectionMoveDown": "Descendre", + "CoC7.BackgroundEncounters": "Pertes liées à des entités étranges", + "CoC7.BackgroundFlags": "Marqueurs", + "CoC7.BackgroundFlagsMythosExperienced": "Perte de SAN de 5% liée à la connaissance du Mythe", + "CoC7.BackgroundFlagsMythosHardened": "Résistant au Mythe", + + "CoC7.SanityLossEncounters": "Pertes de SAN liées à des Rencontres", + "CoC7.SanityLossImmunities": "Immunités aux pertes de SAN", + "CoC7.AddSanityLossEncounter": "Ajouter une perte de SAN liée à une Rencontre", + "CoC7.AddSanityLossImmunity": "Ajouter une immunité aux pertes de SAN", + "CoC7.DeleteSanityLossEncounter": "Supprimer une perte de SAN liée à une Rencontre", + "CoC7.DeleteSanityLossImmunity": "Supprimer une immunité aux pertes de SAN", + + "CoC7.SanityLossTypeDialogTitle": "Nouvelle immunité ou perte de SAN liée à une Rencontre", + "CoC7.SanityLossTypeDialogBody": "Ajouter une Confrontation au Mythe, Perte de SAN, ou Immunité à ce personnage.", + "CoC7.SanityLossTypeReason": "Raison", + "CoC7.SanityLossTypeValue": "Perte de points de SAN", + "CoC7.SanityLossEncounter": "Perte de SAN liée à la Rencontre", + "CoC7.SanityLossImmunity": "Immunité à la perte de SAN", "CoC7.creatureFightingSkill": "Combat rapproché", @@ -487,8 +543,10 @@ "CoC7.MaxSanloss": "Perte max.", "CoC7.MinSanloss": "Perte min.", "CoC7.AlreadyLost": "Perte", + "CoC7.AlreadyEncountered": "Déjà rencontrée", "CoC7.CreatureMaxLoss": "Perte max. de cette créature", "CoC7.MaxLossToCreature": "Perte max. pour cette créature", + "CoC7.MaxPossibleSanLoss": "Perte max. possible", "CoC7.ResetCreatureSan": "Réinitialiser cette créature", "CoC7.ResetSpecieSan": "Réinitialiser cette espèce", "CoC7.KeepData": "Valider la perte accumulée", @@ -513,9 +571,11 @@ "CoC7.GateSpell": "Portail", "CoC7.CombatSpell": "Combat", "CoC7.SpellType": "Type de sort", + "CoC7.SpellSuccessfullyLearned": "Sort '{spell}' appris !", + "CoC7.SpellAlreadyLearned": "Le sort ('{spell}') est déjà connu.", "CoC7.BookHasNothingMoreToTeach": "{book} n'a plus rien à vous apprendre. La compétence en Mythe de Cthulhu de {actor} est supérieure au Mythe contenu dans celui-ci.", - "CoC7.BookType": "Type de livre", + "CoC7.BookType": "Type d'ouvrage", "CoC7.Content": "Contenu", "CoC7.CthulhuMythosFinal": "Mythe de Cthulhu Final", "CoC7.CthulhuMythosInitial": "Mythe de Cthulhu Initial", @@ -531,7 +591,7 @@ "CoC7.MarkedForDevelopment": "Marqué pour développement", "CoC7.Mythos": "Mythe", "CoC7.MythosRating": "Évaluation du mythe", - "CoC7.NotOwned": "Ce livre doit être possédé par un Personnage pour réaliser cette action.", + "CoC7.NotOwned": "Cet objet doit être possédé par un Personnage pour réaliser cette action.", "CoC7.Occult": "Occulte", "CoC7.Points": "point(s)", "CoC7.Progress": "En cours", @@ -541,7 +601,7 @@ "CoC7.Specific": "Spécifique", "CoC7.SpellsLearned": "Sorts appris", "CoC7.StudyTime": "Temps d'étude", - "CoC7.UnknownLanguage": "{actor} ne connaît pas le/l'language.", + "CoC7.UnknownLanguage": "{actor} ne connaît pas le langage de cet ouvrage.", "CoC7.Unreadable": "Illisible", "CoC7.Crew": "Équipage", @@ -560,8 +620,8 @@ "CoC7.Items": "Objets", "CoC7.Vehicle": "Véhicule", - "CoC7.Books": "Livres", - "CoC7.Status": "Conditions", + "CoC7.Books": "Ouvrages", + "CoC7.Status": "États", "CoC7.Classic": "Classique", "CoC7.Lovecraftian": "Lovecraftien", @@ -583,6 +643,7 @@ "CoC7.Chosen": "Choisi", "CoC7.EmptySkillList": "Ajouter une compétence en la déposant ici.", "CoC7.EmptyItemList": "Ajouter un objet en la déposant ici.", + "CoC7.EmptyCharacterSkillList": "Faîtes glisser un générateur, une occupation ou une compétence ici.", "CoC7.PersonalSpeciality": "Nombre de spécialités personnelles ou d'ère", "CoC7.AdditionalSkills": "Compétences supplémentaires", "CoC7.SkillSelectionWindow": "Sélectionner les compétences optionnelles", @@ -633,7 +694,10 @@ "CoC7.WarnNoControlledActor": "Vous ne contrôlez aucun personnage", "CoC7.WarnFastTargetWithWrongMOV": "'Rapide' sélectionné sur une cible avec un Mvt de moins de 8. (Mvt: {mov})", "CoC7.WarnTooManyTarget": "Trop de cibles sélectionnées. Seule la première est prise en compte", + "CoC7.WarnNoTargetsSanCheck": "Pas de cible sélectionnée. Choisissez une cible ou créez un lien.", + "CoC7.allActors": "Tous les Personnages", + "CoC7.restTargets": "Candidats au repos", "CoC7.startRest": "Se reposer", "CoC7.dreaming": "Les Investigateurs attendent en rêvant", "CoC7.healthRecovered": "Un Point de Vie récupéré", @@ -656,7 +720,6 @@ "CoC7.MessageTargetCheckRequested": "Votre gardien demande un jet de {check} pour {name}.", "CoC7.MessageTitleSelectSingleUserForTarget": "Quel joueur peut être la cible de cette attaque", "CoC7.MessageSelectSingleUserForTarget": "Ce token est contrôlé par plusieurs joueurs, choisissez lequel peut répondre à cette attaque.", - "CoC7.MessageSelectedTargetIsNotControlled": "Le token de {name} est possédé mais non contrôlé par un joueur, il ne réagira donc pas aux actions de combat.", "CoC7.MessageBoutOfMadnessTableNotFound": "Le résultat n'a pas été trouvé sur la table de folies, vérifiez les tables aléatoires créées.", "CoC7.MessageBoutOfMadnessItemNotFound": "Le résultat n'a pas été trouvé sur la table de folies, vérifiez les statuts créés.", @@ -670,6 +733,7 @@ "CoC7.ActorImporter": "Import de Personnage", "CoC7.ActorImporterSummary": "Importer un PNJ ou une Créature depuis sa description et ses statistiques. Copier simplement le texte", "CoC7.PasteTheDataBelow": "Coller le texte brut ci-dessous", + "CoC7.TextFieldInvalidCharacters": "Caractères non valides dans le texte, corrigez s'il vous plaît sinon ils seront supprimés", "CoC7.SelectActorType": "Sélectionnez le type de personnage", "CoC7.NonPlayingCharacter": "Personnage Non Joueur (PNJ)", "CoC7.Creature": "Créature", @@ -680,9 +744,18 @@ "CoC7.English": "Anglais", "CoC7.Spanish": "Espagnol", "CoC7.French": "Français", + "CoC7.German": "Allemand", + "CoC7.Polish": "Polonais", + "CoC7.TraditionalChinese": "Chinois Traditionnel", "CoC7.SelectSourceLanguage": "Sélectionnez la langue du texte copié", "CoC7.ImportedUnnamedCharacter": "Personnage importé sans nom", "CoC7.CreatedImportedCharactersFolder": "Dossier 'Imported Characters' créé'", + "CoC7.ImportedCharactersFolder": "Personnage importé", + "CoC7.ImportSkillItemLocations": "Recherche les compétences/sorts/armes dans", + "CoC7.ImportActorItemsNone": "Aucun", + "CoC7.ImportActorItemsItem": "Objets", + "CoC7.ImportActorItemsItemWorldModuleSystem": "Objets / Monde / Modules / Système", + "CoC7.ImportActorItemsWorldModuleItemSystem": "Monde / Modules / Objets / Système", "CoC7.HowToTranslateTitle": "Comment traduire?", "CoC7.HowToTranslateWarning": "N'installez que des modules dignes de confiance.", @@ -693,18 +766,70 @@ "CoC7.Migrate.Title": "Mise à jour requise", "CoC7.Migrate.Message": "

                        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": "
                        1. Clic gauche Jet avec options
                        2. Shift + Clic gauche Jet immédiat à difficulté normale
                        1. Clic droit Jet opposé avec options
                        2. Shift + Clic droit Jet opposé immédiat
                        1. Alt/Option + Clic droit Jet combiné avec options
                        ", + "CoC7.ToolTipKeeperSkill": "
                        1. CTRL + Clic gauche Crée un lien pour un jet
                        2. {other}
                        ", + "CoC7.ToolTipKeeperStandbySkill": "
                      3. Clic gauche Demande un jet à {name}
                      4. ", + "CoC7.ToolTipDB": "
                        1. Clic gauche Jet immédiat à difficulté normale
                        ", + "CoC7.ToolTipSanity": "
                        1. Clic gauche Jet avec options
                        2. Alt/Option + Clic gauche Jet de SAN avec options
                        3. Shift + Clic gauche Jet immédiat à difficulté normale
                        4. Shift + Alt/Option + Clic gauche Jet de SAN sans options
                        1. Clic droit Jet opposé avec options
                        2. Shift + Clic droit Jet opposé immédiat
                        1. Alt/Option + Clic droit Jet combiné avec options
                        2. Shift + Alt/Option + Clic droit Jet combiné immédiat
                        ", + "CoC7.ToolTipCombat": "
                        1. Clic gauche Jet avec options
                        2. Shift + Clic gauche Jet immédiat à difficulté normale
                        1. Clic droit Jet de manœuvre de combat opposée avec options
                        2. Shift + Clic droit Jet de manœuvre de combat opposée immédiat
                        ", + "CoC7.ToolTipKeeperSanity": "
                      5. CTRL + Alt/Option Crée un lien pour un jet de SAN
                      6. ", + "CoC7.ToolTipAutoToggle": "
                        1. Clic gauche Bascule du calcul automatique / manuel
                        2. ", + "CoC7.ToolTipSkillFlagToggle": "
                          1. Clic Double Bascule le statut de coche
                          2. ", + "CoC7.ToolTipSkillFlagged": "Coché pour développement", + "CoC7.ToolTipSkillUnflagged": "Pas coché pour développement", + "SETTINGS.TitleRules": "Règles", "SETTINGS.TitleInitiative": "Paramètres d'initiative", "SETTINGS.TitleRoll": "Paramètres de jets de dés", "SETTINGS.TitleChatCards": "Paramètres de cartes de Chat", "SETTINGS.TitleScene": "Paramètres de scène", "SETTINGS.TitleSheet": "Paramètres de fiche", + "SETTINGS.TitleGameArtwork": "Paramètre d'Illustration du Jeu", "SETTINGS.TitleWeapon": "Paramètres d'arme", "SETTINGS.TitleDiceSoNice": "Paramètres Dice So Nice", "SETTINGS.TitleDeveloperDebug": "Paramètres Développeur et Debug", @@ -715,9 +840,10 @@ "SETTINGS.DefaultDifficultyHint": "Vous pouvez choisir la difficulté par défaut pour les tests. Inconnu lancera des tests sans que le joueur ne connaisse la difficulté.", "SETTINGS.CheckDifficultyRegular": "Difficulté par défaut", "SETTINGS.CheckDifficultyUnknown": "Difficulté inconnue", + "SETTINGS.showIconsOnly": "Sur la fiche compacte, n'afficher que les icônes dans la liste des compétences.", "SETTINGS.UseToken": "Utiliser le portrait des tokens", "SETTINGS.UseTokenHint": "Utiliser le portrait du token au lieu du portrait du personnage dans les cartes de dialogue", - "SETTINGS.DisplayActorOnCard": "Afficher le portrait sur les carte de dialogue", + "SETTINGS.DisplayActorOnCard": "Afficher le portrait sur les cartes de dialogue", "SETTINGS.DisplayActorOnCardHint": "Afficher le portrait sur les cartes de combat", "SETTINGS.InitiativeRule": "Règle d'initiative", "SETTINGS.InitiativeRuleHint": "Vous pouvez sélectionner la règle d'initiative [Basique] (en utilisant la valeur DEX) ou [Optionnelle] (en utilisant les degrés de réussite)", @@ -738,8 +864,8 @@ "SETTINGS.DisregardUsePerRoundHint": "Activer cette option vous permettra de tirer autant que vous le souhaitez, ignorant ainsi les limites d'utilisations de l'arme par tours.", "SETTINGS.RestrictGridSpaces": "Mesurer en unité de grille", "SETTINGS.RestrictGridSpacesHint": "Pour les combats à distance, les distances seront mesurées en unité de grille, sinon la distance 'réelle' (euclidienne) sera utilisée", - "SETTINGS.StatusPlayerEditable": "Le joueur peut modifier son statut", - "SETTINGS.StatusPlayerEditableHint": "Permet au joueur de modifier son statut (vulnérable, inconscient, mourant, mort) et de réinitialiser sa perte quotidienne de SAN", + "SETTINGS.StatusPlayerEditable": "Le joueur peut modifier son état", + "SETTINGS.StatusPlayerEditableHint": "Permet au joueur de modifier son état (vulnérable, inconscient, mourant, mort) et de réinitialiser sa perte quotidienne de SAN", "SETTINGS.SyncDice3D": "[DsN] dés synchro", "SETTINGS.SyncDice3DHint": "Lorsque vous utilisez DsN, synchronisez les dés entre les clients", "SETTINGS.UnitDieColorset": "[DsN] Jeu de dés de couleur", @@ -749,9 +875,15 @@ "SETTINGS.TenDieBonus": "[DsN] dés dix de bonus en couleurs", "SETTINGS.TenDieBonusHint": "Lorsque vous utilisez DsN, active le set de couleurs pour les dés de bonus (par défaut, utilise celle du joueur).", "SETTINGS.TenDiePenalty": "[DsN] dés dix de pénalité en couleurs", - "SETTINGS.TenDiePenaltyHint": "Lorsque vous utilisez DsN, active le set de couleurs pour les dé de pénalité (par défaut, utilise celle du joueur).", + "SETTINGS.TenDiePenaltyHint": "Lorsque vous utilisez DsN, active le set de couleurs pour les dés de pénalité (par défaut, utilise celle du joueur).", + "SETTINGS.OverrideGameArtwork": "Remplacer l'illustration du jeu", + "SETTINGS.OverrideGameArtworkHint": "!!REDÉMARRAGE REQUIS!! donne accès aux paramétrages avancés du jeu, laissez vide pour la valeur par défaut", + "SETTINGS.ArtPauseImage": "Image de pause", + "SETTINGS.ArtPauseImageHint": ". Tapez 'null' pour supprimer l'image", + "SETTINGS.ArtPauseText": "Texte de pause", + "SETTINGS.ArtPauseTextHint": "Laissez vide pour la valeur par défaut", "SETTINGS.OverrideSheetArtwork": "Changer l'apparence de la fiche", - "SETTINGS.OverrideSheetArtworkHint": "!!REDÉMARRAGE REQUIS!! Vous permet de modifier l'apparence de la fiche Laisser les champs vide pour l'option par défaut.", + "SETTINGS.OverrideSheetArtworkHint": "!!REDÉMARRAGE REQUIS!! Vous permet de modifier l'apparence de la fiche Laisser les champs vide pour l'option par défaut.", "SETTINGS.ArtWorkSheetBackground": "Texture de fond de la fiche", "SETTINGS.ArtWorkSheetBackgroundHint": "'null' pour ne pas mettre de fond", "SETTINGS.ArtWorkSheetBackgroundType": "Type de fond", @@ -798,6 +930,15 @@ "SETTINGS.AdviseAllPlayer": "Révéler à tous les joueurs", "SETTINGS.OneBlockBackStory": "Historique en un bloc", "SETTINGS.OneBlockBackStoryHint": "Transformer l'historique en un bloc éditable unique, mais vous pouvez y formater/ajouter des liens", - "SETTINGS.EnableStatusIcons": "Active les icônes d'effet", - "SETTINGS.EnableStatusIconsHint": "Définit si les icônes d'effets de combat et de santé mentale sont affichés dans les tokens." -} \ No newline at end of file + "SETTINGS.EnableStatusIcons": "Active les icônes d'état", + "SETTINGS.EnableStatusIconsHint": "Définit si les icônes d'état de combat et de santé mentale sont affichées dans les tokens.", + "SETTINGS.ShowExperimentalFeatures": "Montrer les Fonctionnalités Expérimentales", + "SETTINGS.ShowExperimentalFeaturesHint": "Votre monde ne sera plus utilisable dans le futur si vous utilisez ces fonctionnalités. Seulement pour le test, N'utilisez PAS ceci pour vos parties", + "CoC7.ExperimentalFeaturesWarning": "Cette fonctionnalité est en développement, il n'est pas conseillé de l'utiliser pour vos parties.", + "SETTINGS.CheckElevation": "Inclut l'altitude", + "SETTINGS.CheckElevationHint": "Utiliser l'altitude dans le calcul des distances en combat", + "CoC7.toolTipDelay": "Délai en millisecondes avant qu'une info-bulle apparaisse, 0 pour jamais", + + "CoC7.getTheExample": "Copier l'Exemple", + "CoC7.Copied": "Texte de l'Exemple copié dans le presse-papier" +} diff --git a/lang/it.json b/lang/it.json new file mode 100644 index 00000000..827d4582 --- /dev/null +++ b/lang/it.json @@ -0,0 +1,1139 @@ +{ + "CoC7.title": "Il Richiamo di Cthulhu 7a Edizione (Non ufficiale)", + + "CoC7.Entities.Character": "Personaggio", + "CoC7.Entities.Container": "Contenitore", + "CoC7.Entities.Creature": "Creatura", + "CoC7.Entities.Npc": "PNG", + "CoC7.Entities.Vehicle": "Veicolo", + "CoC7.ActorIsTokenHint": "Il Personaggio è una pedina", + "CoC7.ActorDataLinked": "I dati del Personaggio sono associati", + "CoC7.ActorDataNotLinked": "I dati del Personaggio NON sono associati", + "CoC7.ActorIsSyntheticActor": "Il Personaggio è un personaggio artificiale (esempio di un personaggio)", + + "CoC7.Entities.Archetype": "Archetipo", + "CoC7.Entities.Book": "Libro", + "CoC7.Entities.Chase": "Inseguimento", + "CoC7.Entities.Item": "Oggetto", + "CoC7.Entities.Occupation": "Professione", + "CoC7.Entities.Setup": "Configurazione", + "CoC7.Entities.Skill": "Abilità", + "CoC7.Entities.Spell": "Incantesimo", + "CoC7.Entities.Status": "Condizione", + "CoC7.Entities.Talent": "Talento", + "CoC7.Entities.Weapon": "Arma", + + "CHARAC.STR": "FOR", + "CHARAC.Strengh": "Forza", + "CHARAC.Strength": "Forza", + "CHARAC.CON": "COS", + "CHARAC.Constitution": "Costituzione", + "CHARAC.SIZ": "TAG", + "CHARAC.Size": "Taglia", + "CHARAC.DEX": "DES", + "CHARAC.Dexterity": "Destrezza", + "CHARAC.APP": "FAS", + "CHARAC.Appearance": "Fascino", + "CHARAC.INT": "INT", + "CHARAC.Intelligence": "Intelligenza", + "CHARAC.POW": "POT", + "CHARAC.Power": "Potere", + "CHARAC.EDU": "IST", + "CHARAC.Education": "Istruzione", + "CoC7.PlayerName": "Giocatore", + "CoC7.Name": "Nome", + "CoC7.Archetype": "Archetipo", + "CoC7.Occupation": "Professione", + "CoC7.Age": "Età", + "CoC7.Sex": "Sesso", + "CoC7.Residence": "Residente a", + "CoC7.Birthplace": "Nato a", + "CoC7.Organization": "Organizzazione", + "CoC7.HitPoints": "Punti Ferita", + "CoC7.HP": "PF", + "CoC7.MagicPoints": "Punti Magia", + "CoC7.MP": "PM", + "CoC7.SanityPoints": "Punti Sanità", + "CoC7.Sanity": "Sanità", + "CoC7.SAN": "SAN", + "CoC7.DailySanLoss": "Perdita San al giorno", + "CoC7.DailyLoss": "Al giorno", + "CoC7.Luck": "Fortuna", + "CoC7.Movement": "Movimento", + "CoC7.MovementAction": "Azione di Movimento", + "CoC7.AdjustedMovement": "Movimento modificato", + "CoC7.Mov": "Mov", + "CoC7.BonusDamage": "Bonus al Danno", + "CoC7.DB": "BD", + "CoC7.Build": "Struttura", + "CoC7.Skills": "Abilità", + "CoC7.Skill": "Abilità", + "CoC7.Combat": "Combattimento", + "CoC7.Possessions": "Attrezzatura & Contanti", + "CoC7.Background": "Trascorsi", + "CoC7.Notes": "Note", + "CoC7.DailySanIconOver": "Azzera", + "CoC7.Prone": "A terra", + "CoC7.Unconsious": "Svenuto", + "CoC7.CriticalWounds": "Ferita grave", + "CoC7.Dying": "Morente", + "CoC7.DyingCheck": "Tira per vedere se muori immediatamente", + "CoC7.Dead": "Morto", + "CoC7.Resist": "Resisti", + "CoC7.UnderlyingInsanity": "Follia latente", + "CoC7.TemporaryInsanity": "Follia temporanea", + "CoC7.IndefiniteInsanity": "Follia permanente", + "CoC7.DefinitelyInsane": "Pronto per il manicomio", + "CoC7.FINISH": "--F-I-N-I-T-O--", + "CoC7.NotInsane": "Nulla", + "CoC7.UnlockActor": "Sblocca Personaggio", + "CoC7.LockActor": "Blocca Personaggio", + "CoC7.NpcRollCharacteristics": "Tira per le Caratteristiche", + "CoC7.NpcAvarageCharacteristics": "Caratteristiche medie", + "CoC7.NpcCharacteristicsFormula": "Formula", + "CoC7.NpcCharacteristicsValues": "Valori", + "CoC7.language": "Lingua", + "CoC7.Author": "Autore", + "CoC7.Date": "Data", + "CoC7.Spells": "Incantesimi", + "CoC7.Spell": "Incantesimo", + "CoC7.Spells&Notes": "Incantesimi & Note", + "CoC7.Weapons": "Armi", + "CoC7.Effects": "Effetti", + "CoC7.Cost": "Costo", + "CoC7.Source": "Origine", + "CoC7.SpellDetails": "Dettagli dell'Incantesimo", + "CoC7.Details": "Dettagli", + "CoC7.Other": "Altro", + "CoC7.rounds": "turno(i)", + "CoC7.hours": "ora(e)", + "CoC7.days": "giorno(i)", + "CoC7.weeks": "settimana(e)", + "CoC7.months": "mese(i)", + "CoC7.remove": "Rimuovi", + "CoC7.Any": "Uno", + "CoC7.All": "Tutto", + "CoC7.Success": "Successo", + "CoC7.CustomLabel": "Etichetta personalizzata", + "CoC7.SpecificLocations": "Luoghi specifici", + "CoC7.ArmourPlating": "Corazzatura", + "CoC7.Location": "Luogo", + "CoC7.Properties": "Proprietà", + "CoC7.Attributes": "Attributi", + "CoC7.Attribute": "Attributo", + "CoC7.Collapse": "Comprimi", + "CoC7.Expand": "Espandi", + "CoC7.Blind": "Al buio", + "CoC7.Label": "Etichetta", + "CoC7.Icon": "Icona", + "CoC7.Check": "Tiro", + "CoC7.ItemWeapon": "Oggetto (Arma)", + "CoC7.AttacksPerRound": "Attachi per turno", + "CoC7.Restart": "Ricomincia", + "CoC7.Reset": "Resetta", + "CoC7.Initiative": "Iniziativa", + + "CoC7.Cast": "Lanciare", + "CoC7.SanityCost": "Costo in Sanità", + "CoC7.PowerCost": "Costo in Potere", + "CoC7.HitPointsCost": "Costo in Punti Ferita", + "CoC7.MagicPointsCost": "Costo in Punti Magia", + "CoC7.OtherCosts": "Altri Costi", + "CoC7.CastingSpell": "Sta lanciando {spell}.", + "CoC7.NotEnoughMagicPoints": "{spell} costa {originalMagicPoints} Punti Magia, ma hai soltanto {actorMagicPoints}. Vorresti prendere i restanti {convertedHitPoints} dai tuoi Punti Ferita? Subirai {convertedHitPoints} danni se procedi.", + + "CoC7.CopyToClipboard": "Copia negli appunti", + "CoC7.WhisperToSelection": "Sussurra alle pedine selezionate", + "CoC7.WhisperTo": "Sussurra a", + "CoC7.SendToChat": "Invia nella chat", + + "CoC7.RegularSuccess": "Successo Normale", + "CoC7.HardSuccess": "Successo Arduo", + "CoC7.ExtremeSuccess": "Successo Estremo", + "CoC7.CriticalSuccess": "Successo Critico", + "CoC7.Fumble": "Fallimento Critico", + "CoC7.Failure": "Fallimento", + "CoC7.Malfunction": "{itemName} ha avuto un malfunzionamento", + + "CoC7.Dice": "Dadi", + "CoC7.DiceModifierBonus": "bonus", + "CoC7.DiceModifierPenalty": "penalità", + "CoC7.Modifiers": "Modificatori", + "CoC7.BonusDice": "Dadi Bonus", + "CoC7.PenaltyDice": "Dadi Penalità", + "CoC7.UnitsDie": "1 unità di dado", + "CoC7.TensDie": "dado da 10", + "CoC7.TensDice": "dadi da 10", + "CoC7.SuccessRequired": "{successRequired} successo richiesto.", + "CoC7.Roll": "Tirare", + "CoC7.Pushing": "Forzare", + "CoC7.PushingSkill": ": forzare l'Abilità!", + "CoC7.PushSkill": "Forzare", + "CoC7.PushedRoll": "(tiro forzato)", + "CoC7.SpendLuck": "Devi spendere {luckNeededValue} Fortuna per passare", + "CoC7.LuckSpent": "{luckAmount} Fortuna spesa per passare", + "CoC7.LuckSpentAlt": "Fortuna spesa", + "CoC7.LuckError": "{actorName} non ha abbastanza Fortuna per passare il tiro", + "CoC7.LuckNotEnough": "{name} non ha avuto abbstanza fortuna per passare il tiro", + "CoC7.UpgradeSuccessWithLuck": "Aggiorna a successo {{difficultyName}} per {{luckToSpend}} fortuna.", + "CoC7.check.AutoSuccess": "Successo automatico", + "CoC7.check.AutoFailure": "Fallimento automatico", + "CoC7.RevealCheck": "Rivela Tiro", + "CoC7.RevealSanLoss": "Rivela perdita SAN", + "CoC7.check.ForcePass": "Forza passare", + "CoC7.check.ForceFail": "Forza fallimento", + "CoC7.check.FlagForDevelopment": "Premia con Esperienza", + "CoC7.IncreaseSuccessLevel": "Aumenta successo", + "CoC7.check.DecreaseSuccessLevel": "Diminuisci successo", + "CoC7.RollSecretDice": "Il Custode ha tirato in privato alcuni dadi", + "CoC7.KeeperSentDecoy": "Tiro diversivo inviato ai giocatori", + "CoC7.FakeRoll": "Invia un tiro diversivo ai giocatori", + "CoC7.ErrorMissingKeeperUser": "Il Custode deve essere connesso per poter eseguire questa azione", + "CoC7.BonusDieAssailantReason": "Aggiungi 1 dado bonus (l'aggressore è a terra, trattenuto...)", + "CoC7.PenaltyDieSelfReason": "Aggiungi 1 dado penalità (perché si è a terra, trattenuti...)", + + "CoC7.ConstitutionCheck": "Tiro Costituzione", + + "CoC7.SanDataSelectionWindow": "Selezionare perdita di SAN", + "CoC7.BonusSelectionWindow": "Finestra di selezione Bonus", + "CoC7.BonusSelectionWindowNamed": "Selezionare il modificatore per il tiro {name}", + "CoC7.SkillDetailsWindow": "Finestra dei dettaglia dell'Abilità", + "CoC7.RegularDifficulty": "normale", + "CoC7.HardDifficulty": "arduo", + "CoC7.ExtremeDifficulty": "estremo", + "CoC7.CriticalDifficulty": "critico", + "CoC7.UnknownDifficulty": "sconosciuto", + "CoC7.RollDifficulty": "Difficoltà del Tiro", + "CoC7.RollThreshold": "Livello del Tiro", + "CoC7.FlatDiceModifier": "Modificatore fisso dei dadi", + "CoC7.FlatModifier": "Modificatore fisso", + "CoC7.RollDifficultyUnknown": "Al buio", + "CoC7.RollDifficultyRegular": "Normale", + "CoC7.RollDifficultyRegularTitle": "Difficoltà normale", + "CoC7.RollDifficultyHard": "Arduo", + "CoC7.RollDifficultyHardTitle": "Difficoltà ardua", + "CoC7.RollDifficultyExtreme": "Estremo", + "CoC7.RollDifficultyExtremeTitle": "Difficoltà estrema", + "CoC7.RollDifficultyCritical": "Critico", + "CoC7.RollDifficultyCriticalTitle": "Difficoltà critica", + "CoC7.RollResult.LuckSpendText": "{luckAmount} Fortuna spesa, {successLevel} successo", + "CoC7.RollDice": "Tira !", + "CoC7.CreateLink": "Crea collegamento", + "CoC7.SuccesLevelHint": "{value} livello(i) di successo", + "CoC7.FailureLevelHint": "Fallito per {value} livello(i)", + "CoC7.CardType": "Tipo di Tiro", + "CoC7.CombinedRollCard": "Scheda Tiri combinati", + "CoC7.OpposedRollCard": "Scheda Tiri contrapposti", + "CoC7.GroupRollCard": "Scheda Tiro di gruppo", + "CoC7.RegularRollCard": "Scheda Tiro Normale", + "CoC7.CombinedAnyHint": "Un Tiro deve avere successo", + "CoC7.CombinedAllHint": "Tutti i Tiri devono avere successo", + "CoC7.CloseCard": "Chiudi scheda", + "CoC7.AttackManeuver": "Manovra di attacco", + + "CoC7.CheckResult": "Tiro {name} ({value}%) - {difficulty} difficoltà", + "CoC7.ItemCheckResult": "{item} - tiro {skill} ({value}%) - {difficulty} difficoltà", + "CoC7.CheckRawValue": "({rawvalue}%) - {difficulty} difficoltà", + + "CoC7.ArmorAbsorbsDamage": "L'Armatura assorbe tutti i danni", + "CoC7.ArmorIgnored": "Armatura ignorata", + "CoC7.Critical": "Critico", + "CoC7.Impale": "Trafiggere", + "CoC7.CriticalTitle": "Il colpo è critico", + "CoC7.ImpaleTitle": "L'arma può trafiggere", + "CoC7.Target": "Bersaglio", + "CoC7.TargetOutOfRange": "Bersaglio fuori portata", + "CoC7.NoTargetToDamage": "Non c'è alcun bersaglio a cui applicare il danno", + "CoC7.ShotIsImpossible": "È impossibile sparare", + "CoC7.OutOfAmmo": "Munizioni esaurite", + "CoC7.OutOfShots": "Colpi finiti", + + "CoC7.BonusDamageRoll": "Sto tirando il Bonus al Danno", + "CoC7.Type": "Tipo", + "CoC7.FightBack": "Contrattaccare", + "CoC7.Dodge": "Schivare", + "CoC7.Maneuver": "Manovra", + "CoC7.NoResponse": "Nessuna risposta", + "CoC7.OutNumbered": "Inferiorità numerica", + "CoC7.combatCard.surprised": "Sorpresa", + "CoC7.combatCard.autoSuccess": "Successo automatico", + "CoC7.combatCard.automaticSuccess": "Successo automatico", + "CoC7.Advantage": "Vantaggio", + "CoC7.Disadvantage": "Svantaggio", + "CoC7.TitleAdvantage": "Aggiungi 1 dado bonus (il bersaglio è a terra, legato...)", + "CoC7.TitleDisadvantage": "Aggiungi 1 dado penalità (per essere a terra, legato...)", + "CoC7.TitleOutNumbered": "Aggiungi 1 dado bonus perché il bersaglio è in inferiorità numerica", + "CoC7.TitleSurprised": "Aggiungi 1 dado bonus perché il bersaglio è stato sorpreso", + "CoC7.TitleAutoSuccess": "L'attacco colpisce automaticamente", + "CoC7.WinnerRollDamage": "{name} ha vinto. Tira per i danni.", + "CoC7.InitiatorMissed": "{name} ha mancato.", + "CoC7.NoWinner": "Entrambi i contendenti hanno fallito.", + "CoC7.DodgeSuccess": "{name} ha schivato!", + "CoC7.ManeuverSuccess": "La manovra di {name} ha avuto successo.", + "CoC7.AttackSuccess": "{name} ha sferrato un colpo.", + "CoC7.InflictPain": "Infligge dolore", + "CoC7.AdvantageAttacker": "Vantaggio: Attaccante", + "CoC7.AdvantageDefender": "Vantaggio: Difensore", + "CoC7.Tie": "Pareggio", + "CoC7.DamageInflicted": "Danno inflitto", + "CoC7.Damage": "Danno", + "CoC7.TotalDamage": "Danno totale", + "CoC7.CheckFailed": "Tiro fallito", + "CoC7.CheckPassed": "Tiro di successo", + "CoC7.CheckMemoryRepressed": "Ricordo rimosso", + + "CoC7.combatCard.dive4cover": "Si butta in copertura", + + "CoC7.rangeCombatCard.SingleShot": "Sparo singolo", + "CoC7.rangeCombatCard.MultipleShots": "Spari multipli", + "CoC7.AutomaticFire": "Fuoco automatico", + "CoC7.rangeCombatCard.Burst": "Raffica di fuoco", + "CoC7.rangeCombatCard.FullAuto": "Fuoco automatico", + "CoC7.rangeCombatCard.BaseRange": "Gittata Base", + "CoC7.rangeCombatCard.LongRange": "Gittata Lontana", + "CoC7.rangeCombatCard.ExtremeRange": "Gittata Estrema", + "CoC7.rangeCombatCard.OutOfRange": "Fuori portata", + "CoC7.rangeCombatCard.Cover": "In copertura", + "CoC7.rangeCombatCard.PointBlankRange": "A bruciapelo", + "CoC7.rangeCombatCard.NormalTarget": "Bersaglio normale", + "CoC7.rangeCombatCard.BigTarget": "Bersaglio grande", + "CoC7.combatCard.SmallTarget": "Bersaglio piccolo", + "CoC7.rangeCombatCard.FastMovingTarget": "Veloce", + "CoC7.rangeCombatCard.InMelee": "In corpo a corpo", + "CoC7.rangeCombatCard.aiming": "Sta prendendo la mira", + "CoC7.rangeCombatDamage": "{name} subisce {total} punti di danno", + "CoC7.rangeCombatDamageArmor": "{name} subisce {total} danni. (attenuati da {armor})", + "CoC7.RollDamage": "Tira per il danno", + "CoC7.BulletsFired": "Proiettili sparati", + "CoC7.Shots": "Colpi", + "CoC7.Shoot": "Spara", + "CoC7.ShotBullets": "Spari {bullets} proiettili al bersaglio {actor}.", + "CoC7.ShotVoley": "Sta sparando una raffica di {bullets} proiettili al bersaglio {actor}.", + "CoC7.rangeCombatCard.AimingTitle": "Aggiungi 1 dado bonus per il primo colpo", + "CoC7.rangeCombatCard.CoverTitle": "1 dado penalità. Il bersaglio è in copertura o si è tuffato con successo in copertura", + "CoC7.rangeCombatCard.PointBlankRangeTitle": "1 dado bonus. Il bersaglio è a bruciapelo", + "CoC7.rangeCombatCard.BigTargetTitle": "1 dado bonus per un bersaglio grosso (Struttura > 4)", + "CoC7.rangeCombatCard.SmallTargetTitle": "1 dado penalità per un bersaglio piccolo", + "CoC7.rangeCombatCard.NormalTargetTitle": "Il bersaglio è di taglia media, nessun bonus/penalità", + "CoC7.rangeCombatCard.InMeleeTitle": "1 dado penalità. Il bersaglio è impegnato nel combattimento corpo a corpo", + "CoC7.rangeCombatCard.FastMovingTargetTitle": "1 dado penalità. Il bersaglio è veloce (MOV 8+) e si sta muovendo alla velocità massima", + "CoC7.rangeCombatCard.SurprisedTargetTitle": "1 dado bonus per bersaglio preso di sorpresa", + + "CoC7.meleeCombatDamageTakes": "subisce", + "CoC7.meleeCombatDamageFrom": "da", + "CoC7.meleeCombatDamageDeals": "infligge", + "CoC7.meleeCombatDamageWith": "con", + + "CoC7.DropZone": "DropZone", + + "CoC7.Value": "Valore", + "CoC7.SkillValue": "Valore dell'abilità", + "CoC7.SkillBase": "Base", + "CoC7.BaseSkillValue": "Valore base dell'abilità", + "CoC7.SkillExperience": "Esperienza", + "CoC7.SkillArchetype": "Archetipo", + "CoC7.SkillOccupation": "Professione", + "CoC7.SkillPersonal": "Personale", + + "CoC7.SkillTotalExperience": "Punti esperienza", + "CoC7.SkillTotalArchetype": "Punti Archetipo", + "CoC7.SkillTotalOccupation": "Punti professione", + "CoC7.SkillTotalPersonal": "Punti personali", + "CoC7.CharacteristicsPoints": "Punti caratteristiche", + "CoC7.TotalPoints": "Punti totali per la professione", + + "CoC7.ItemQuantity": "Quantità", + "CoC7.ItemWeight": "Peso", + "CoC7.ItemDetails": "Dettagli", + "CoC7.Description": "Descrizione", + "CoC7.Reload": "Cliccare con Sinistro/Destro : aggiungi/rimuovi 1 proiettile\nShift + cliccare con Sinistro/Destro : Ricarica/Svuota", + "CoC7.WeaponRange": "Gittata", + "CoC7.WeaponDamage": "Danno", + "CoC7.Weapon.BlastRadius": "Raggio dell'esplosione", + "CoC7.WeaponMalfunction": "Malfunzionamento", + "CoC7.WeaponUsesPerRound": "Utilizzi per Turno", + "CoC7.WeaponUsesPerRoundHint": "Attaccchi per turno (1/3 : 1 attaccco ogni 3 turni)", + "CoC7.WeaponSheet.RoundsPerUse.Info": "Numero di turni necessari affinché l'arma sia pronta a sparare", + "CoC7.WeaponMax": "Max usi/turno", + "CoC7.BurstSize": "Dimensione della raffica", + "CoC7.BurstSizeHint": "Numero di proiettili per raffica", + "CoC7.WeaponBulletsInMag": "Caricatore", + "CoC7.WeaponSpecial": "Speciale", + "CoC7.ItemPrice": "Prezzo", + "CoC7.Armor": "Armatura", + + "CoC7.EraNvct": "Invictus", + "CoC7.EraDrka": "Secoli Bui", + "CoC7.EraDdts": "Down Darker Trails", + "CoC7.EraGlit": "Cthulhu by Gaslight", + "CoC7.Era1920": "1920s", + "CoC7.EraPulp": "Pulp Cthulhu", + "CoC7.EraMdrn": "Moderno", + "CoC7.Eras": "Tipologie di Cthulhu", + "CoC7.EraAvailability": "Disponibilità", + + "CoC7.SkillNoAdjustments": "Nessuna correzione", + "CoC7.SkillNoXpGain": "Nessuna Esperienza", + "CoC7.SkillXpGainDisabled": "Guadagno di PE disabilitato.", + "CoC7.SkillSpecial": "Specializzazione", + "CoC7.SkillRarity": "Non comune", + "CoC7.SkillPush": "Forzato", + "CoC7.SkillCombat": "Combatttimento", + "CoC7.SkillFighting": "Combattere", + "CoC7.SkillFirearm": "Armi da fuoco", + + "CoC7.WeaponRngd": "A distanza", + "CoC7.WeaponProperyManeuver": "Manovra", + "CoC7.WeaponTouch": "Contatto", + "CoC7.WeaponImpl": "Trafiggere", + "CoC7.WeaponRare": "Raro", + "CoC7.WeaponAhdb": "+BD/2", + "CoC7.WeaponAddb": "+BD", + "CoC7.WeaponSlnt": "Silenzioso", + "CoC7.WeaponXplv": "Esplosivi", + "CoC7.WeaponBrst": "Raffica", + "CoC7.WeaponAuto": "Fuoco automatico", + "CoC7.WeaponSpcl": "Speciale", + "CoC7.WeaponMont": "Montato", + "CoC7.WeaponDbrl": "Doppia canna", + "CoC7.WeaponBlst": "Esplosione", + "CoC7.WeaponStun": "Stordire", + "CoC7.Weapon.Property.Melee": "Corpo a corpo", + "CoC7.Weapon.Property.Thrown": "Da lancio", + "CoC7.Weapon.Property.Burn": "Ustione", + "CoC7.Weapon.Property.Shotgun": "Shotgun", + + "CoC7.ErrorItem": "Impossibile individuare l'oggetto", + "CoC7.ErrorActor": "Impossibile individuare il personaggio", + "CoC7.ErrorInvalidFormula": "{value} non è una formula valida", + "CoC7.ErrorInvalid": "invalido", + "CoC7.ErrorInvalidCardType": "Tipo di Scheda", + "CoC7.ErrorInvalidRollType": "Tipo di Tiro", + "CoC7.Validate": "Convalida", + "CoC7.Apply": "Applica", + + "CoC7.NewBioSectionName": "Nuova Sezione", + + "CoC7.DodgeSkillName": "Schivare", + "CoC7.CthulhuMythosName": "Miti di Cthulhu", + "CoC7.CreditRatingSkillName": "Valore di Credito", + "CoC7.DriveAutoSkillName": "Guidare Auto", + "CoC7.FightingSpecializationName": "Combattere", + "CoC7.UnarmedWeaponName": "A mani nude", + "CoC7.FirearmSpecializationName": "Armi da Fuoco", + "CoC7.DriveSpecializationName": "Guidare", + "CoC7.PilotSpecializationName": "Pilotare", + "CoC7.AnySpecName": "Generico", + "CoC7.BoutOfMadnessName": "Attacco di follia", + "CoC7.InsanityName": "Follia", + + "CoC7.NewSkillName": "nuova abilità", + "CoC7.AddSkill": "Aggiungi abilità", + "CoC7.CleanSkillList": "Svuota la lista delle abilità", + "CoC7.CleanSkillListHint": "

                            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?

                            ", + + "CoC7.LinkCheck": " Tiro {name}", + "CoC7.LinkCheckDiff": "[Tiro {difficulty}] {name}", + "CoC7.LinkCheckModif": " Tiro {name} ({modifier})", + "CoC7.LinkCheckDiffModif": "[Tiro {difficulty}] {name} ({modifier})", + "CoC7.LinkSanLoss": " Perdita SAN ({sanMin}/{sanMax})", + "CoC7.LinkSanLossDiff": "[{difficulty}] perdita SAN ({sanMin}/{sanMax})", + "CoC7.LinkSanLossModif": " Perdita SAN ({modifier}) ({sanMin}/{sanMax})", + "CoC7.LinkSanLossDiffModif": "[{difficulty}] Perdita SAN ({modifier}) ({sanMin}/{sanMax})", + "CoC7.LinkItem": " {name}", + "CoC7.LinkItemDiff": "[{difficulty}] {name}", + "CoC7.LinkItemModif": " {name} ({modifier})", + "CoC7.LinkItemDiffModif": "[{difficulty}] {name} ({modifier})", + + "CoC7.ManualCreditValues": "Valori di Credito manuali", + "CoC7.MonetarySymbol": "Simbolo :", + "CoC7.MonetaryFactor": "Fattore :", + "CoC7.AutoCreditValues": "Attiva/Disattiva calcolo automatico", + "CoC7.MonetarySpendingLevel": "Livello di spesa :", + "CoC7.MonetaryCash": "Contanti :", + "CoC7.MonetarySpent": "Spesi :", + "CoC7.MonetaryAssets": "Proprietà :", + "CoC7.MonetaryAssetsDetails": "Dettagli delle proprietà", + + "CoC7.PossessionsNotes": "Note :", + "CoC7.PossessionsNotesHolder": "Note", + + "CoC7.BackgroundNewSection": "Aggiungi nuova sezione", + "CoC7.BackgroundSectionNameHolder": "Inserisci il titolo della sezione", + "CoC7.BackgroundDeleteSection": "Cancellare sezione", + "CoC7.BackgroundSectionMoveUp": "Muovi Su", + "CoC7.BackgroundSectionMoveDown": "Muovi Giù", + "CoC7.BackgroundEncounters": "Perdite per Strane Entità", + "CoC7.BackgroundFlags": "Contrassegni", + "CoC7.BackgroundFlagsMythosExperienced": "Assegnato il 5% di follia per i Miti", + "CoC7.BackgroundFlagsMythosHardened": "Temprato ai Miti", + + "CoC7.SanityLossEncounters": "Perdita di Sanità per gli incontri", + "CoC7.SanityLossImmunities": "Immunità per la perdita di Sanità", + "CoC7.AddSanityLossEncounter": "Aggiungi la perdita di Sanità per l'incontro", + "CoC7.AddSanityLossImmunity": "Aggiungi l'immunità alla perdita di Sanità", + "CoC7.DeleteSanityLossEncounter": "Elimina la perdita di Sanità per l'incontro", + "CoC7.DeleteSanityLossImmunity": "Elimina l'immunità alla perdita di Sanità", + + "CoC7.SanityLossTypeDialogTitle": "Nuova perdita o immunità di Sanità", + "CoC7.SanityLossTypeDialogBody": "Aggiungi al personaggio un nuovo incontro dei Miti, una perdita di Sanità, o un'immunità alla Sanità.", + "CoC7.SanityLossTypeReason": "Causa", + "CoC7.SanityLossTypeValue": "Punti Sanità perduti", + "CoC7.SanityLossEncounter": "Perdita di Sanità per l'incontro", + "CoC7.SanityLossImmunity": "Immunità per la perdita di Sanità", + + "CoC7.creatureFightingSkill": "Combattere", + + "CoC7.InvoluntaryAction": "Azione involontaria", + "CoC7.InvoluntaryActionPerfomed": "Azione involontaria eseguita", + "CoC7.SanityCheck": "Tiro Sanità", + "CoC7.IntCheck": "Tiro Intelligenza", + "CoC7.NoSanLoss": "Nessuna perdità di SAN", + "CoC7.SANLoss": "Perdita di Sanità", + "CoC7.SanityCheckPerformed": "Sei stato esposto a un evento traumatico.", + "CoC7.InvoluntaryActionPerformed": "Per un momento hai perso l'autocontrollo.", + "CoC7.SanityLost": "Punti Sanità persi", + "CoC7.MemoryRepressed": "La tua mente ha represso la memoria e l'ha seppellita nel tuo subconscio.", + "CoC7.RememberEverything": "Ricordi TUTTO.", + "CoC7.BoutOfMadnesslasted": "Il tuo attacco di follia è durato", + "CoC7.EnteringBoutOfMadness": "Stai vivendo un attacco di follia", + "CoC7.GrowingAccustomedToAwfulness": "Ti stai abituando all'orrore. (La tua perdita di sanità è limitata).", + "CoC7.ImmuneToAwfulness": "La tua mente è immune a questo orrore. (Nessuna perdita di sanità).", + "CoC7.InvestigatorPhobiaGained": "L'investigatore acquisisce una fobia", + "CoC7.PhobiaGained": "Acquisisci una fobia", + "CoC7.InvestigatorManiaGained": "L'investigatore acquisisce una mania", + "CoC7.ManiaGained": "Acquisisci una mania", + "CoC7.AlreadyUnderlyingInsanity": "L'investigatore è già in uno stato di follia latente.", + "CoC7.IndefinitelyInsane": "Diventi permanentemente pazzo.", + "CoC7.TemporaryInsane": "Diventi temporaneamente pazzo.", + "CoC7.GoodForAsylum": "Sei pronto per essere mandato in manicomio", + "CoC7.BoutOfMadness": "Attacco di follia", + "CoC7.BoutRealTime": "Attacco di follia: Tempo reale", + "CoC7.BoutSummary": "Attacco di follia: Riassunto", + "CoC7.EndBoutOfMadness": "Fine dell'attacco di follia ", + "CoC7.InsanityType": "Tipo di follia", + "CoC7.Phobia": "Fobia", + "CoC7.Mania": "Mania", + "CoC7.MaxSanloss": "Perdita Max", + "CoC7.MinSanloss": "Perdita Min", + "CoC7.AlreadyLost": "Già perso", + "CoC7.AlreadyEncountered": "Già incontrata", + "CoC7.AlreadyEncounteredInformation": "Già incontrata: {reason} perdita {lost}/{max}", + "CoC7.CreatureMaxLoss": "Perdita Max della creatura", + "CoC7.MaxLossToCreature": "Perdita Max per questa creatura", + "CoC7.MaxPossibleSanLoss": "Perdita Max possibile", + "CoC7.ResetCreatureSan": "Ripristina la cronologia della creatura", + "CoC7.ResetSpecieSan": "Ripristina la cronologia della specie", + "CoC7.KeepData": "Conserva i dati della creatura", + "CoC7.BoutActive": "(Attacco) Immune alla perdita di SAN", + "CoC7.AlreadyInABout": "Stai già soffrendo un attacco di follia e sei immune a un'ulteriore perdita di sanità.", + "CoC7.PlayerPermanentlyInsane": "Giocatore definitivamente folle", + "CoC7.MythosFirstEncounter": "Assegna Esperienza per i Miti (+5% prima volta)", + "CoC7.MythosAlreadyEncountered": "Assegna Esperienza per i Miti (+1%)", + "CoC7.DisregardMythosGain": "Nessun guadagno per i Miti", + "CoC7.MythosGain": "Guadagno per i Miti", + "CoC7.YouGainedCthulhuMythos": "La tua mente trema davanti alla manifestazione ultraterrena (+{value}% Miti di Cthulhu)", + "CoC7.CardResolved": "Scheda risolta", + + "CoC7.InsertLocation": "Inserisci luogo", + "CoC7.RemoveLocation": "Rimuovi luogo", + "CoC7.LocationNotEmpty": "Non puoi rimuovere un luogo con un personaggio", + "CoC7.LocationInit": "Non puoi rimuovere il luogo di partenza", + "CoC7.SomethingInTheWay": "C'è qualcosa che ti intralcia", + "CoC7.FacingObstacle": "Davanti a te hai {type}.", + "CoC7.ABarrier": "uno sbarramento", + "CoC7.Barrier": "Sbarramento", + "CoC7.AHazard": "un ostacolo", + "CoC7.Hazard": "Ostacolo", + "CoC7.Obstacle": "Qualcosa d'intralcio", + "CoC7.ConsumeBonusDice": "Utilizza i Dadi Bonus", + "CoC7.Breakable": "Frangibile", + "CoC7.NoValidCheck": "Nessun tiro valido", + "CoC7.NoValidSkill": "Abilità fasulla", + "CoC7.AskIntentions": "Quali sono le tue intenzioni?", + "CoC7.WaitForPlayerInput": "In attesa dell'immissione del giocatore", + "CoC7.AskRoll": "Tiro {name} ({value}%)", + "CoC7.ActionCost": "Costo dell'Azione", + "CoC7.Negotiate": "Affrontare", + "CoC7.BreakDown": "Distruggere", + "CoC7.BeingCautious": "Hai scelto di tenere un approccio prudente.", + "CoC7.BeingVeryCautious": "Ti stai comportando in modo estremamente prudente.", + "CoC7.ReflectObstacleChanges": "Tieni conto delle modifiche all'ostacolo", + "CoC7.PlayerMovesToLocation": "Il giocatore si sta spostando verso il prossimo luogo", + "CoC7.ObstaclePassed": "Hai trovato una via con successo.", + "CoC7.GotLucky": "Questa volta sei stato fortunato!", + "CoC7.ObstacleFail": "Hai fallito.", + "CoC7.ObstacleFumble": "Hai fallito clamorosamente!", + "CoC7.YouLostTime": "Hai perso del tempo a causa del tuo tentativo.", + "CoC7.MoveToLocation": "Ti stai spostando verso il prossimo luogo.", + "CoC7.DontMoveToLocation": "Rimani fermo dove sei.", + "CoC7.ObstacleDamage": "Danno all'ostacolo", + "CoC7.RemoveObstacle": "Distruggi l'ostacolo", + "CoC7.YouTakeNoDamage": "Non hai subito alcun danno.", + "CoC7.YouTakeSomeDamage": "Hai subito {amount} punti di danno.", + "CoC7.TryToNegotiateHazard": "Cerchi di superare quell'Ostacolo.", + "CoC7.TryToGetPastBarriers": "Cerchi di oltrepassare quello Sbarramento.", + "CoC7.TryToBreak": "Cerchi di distruggere quello Sbarramento.", + "CoC7.DragOnCanvas": "Trascina questo sulla mappa per stabilire la posizione di questo luogo.", + "CoC7.LocationCoordinate": "Luogo impostato a: {x}, {y}.\nCliccare col tasto destro per cacellare.\nTrascina questo sulla mappa per modificare la posizione.", + "CoC7.ConfirmRestartChase": "Vuoi far cominciare da capo l'inseguimento?", + "CoC7.ConfirmRestartChaseHint": "Questo farà cominciare da capo il tuo inseguimento.\nTutte le posizioni verranno resettate.\nI Personaggi che non hanno effettuato un Tiro Velocità dovranno tirare.", + "CoC7.ConfirmResetChase": "Vuoi resettare l'inseguimento?", + "CoC7.ConfirmResetChaseHint": "Questo resetterà l'inseguimento.\bTutte le posizioni e gli ostacoli verranno rimossi.", + "CoC7.IncludeEscapees": "Permetti ai Personaggi in fuga più veloci di partecipare.", + "CoC7.TooSlow": "Troppo lento", + "CoC7.TooFast": "Troppo veloce", + "CoC7.DoesNotMeetMinimumReqToBeAdded": "Non puoi aggiungere un partecipante, è richiesta almeno un'azione valida di movimento", + "CoC7.IncludeLatecomers": "Permetti agli inseguitori lenti di partecipare.", + "CoC7.VehicleChase": "L'inseguimento può includere i veicoli (NON IMPLEMENTATO)", + "CoC7.StartingRange": "Avanzamento dai luoghi di partenza", + "CoC7.StartingIndex": "Elenco iniziale dei Personaggi in fuga", + "CoC7.CutToTheChase": "Parti con l'inseguimento", + "CoC7.ChaseSetup": "Impostazione dell'inseguimento", + "CoC7.ParticipantsList": "Lista dei partecipanti", + "CoC7.NotAllHaveSpeedRoll": "Acuni partecipanti non hanno effettuato il Tiro Velocità!", + "CoC7.NeedMin2Participants": "Devono esserci un inseguitore e una preda affinché possa partire un'inseguimento!", + "CoC7.ConfirmCut2Chase": "Sei pronto a partire con l'inseguimento?", + "CoC7.ConfirmCut2ChaseHint": "Questo farà iniziare l'inseguimento e il primo turno dell'inseguimento.", + "CoC7.NextRound": "Prossimo turno", + "CoC7.ConfirmNextChaseRound": "Vuoi procedere al prossimo turno?", + "CoC7.ConfirmNextChaseRoundHint": "Ci sono ancora alcune azioni possibili per alcuni Personaggi. Sei sicuro di voler proseguire?", + "CoC7.CheckName": "Tira", + "CoC7.ObstacleHasHitPoint": "Attiva/disattiva i Punti Ferita del luogo.", + "CoC7.ActionCostOnFail": "Attiva/disattiva la penalità per l'azione in caso di fallimento.", + "CoC7.DamageOnFail": "Attiva/disattiva il danno in caso di fallimento.", + "CoC7.OpenObstacleResolutionCard": "Inizia la scheda di scorrimento per la soluzione dell'ostacolo.", + "CoC7.AddBonusDie": "Aggiungi dado bonus", + "CoC7.RemoveBonusDie": "Togli dado bonus", + "CoC7.DecreaseMovementAction": "Riduci l'azione di movimento", + "CoC7.IncreaseMovementAction": "Aumental'azione di movimento", + "CoC7.CautiousApproach": "Assumi un approccio prudente", + "CoC7.Cautious": "Prudente", + "CoC7.Assist": "Aiuta un alleato", + "CoC7.MoveForward": "Muoviti in avanti", + "CoC7.MoveBackward": "Torna indietro", + "CoC7.AddActorToChase": "Aggiungi un Personaggio all'inseguimento", + "CoC7.ParticipantDropHint": "Puoi rilasciare un Personaggio in questa finestra o direttamente su un luogo dell'inseguimento.", + "CoC7.OverrideCalc": "Ignora il conteggio", + "CoC7.NeedRecalculate": "E' necessario un ricalcolo", + "CoC7.NeedToRecalculate": "Verrà ricalcolata l'azione di movimento di tutti i partecipanti", + "CoC7.SpeedCheck": "Tiro Velocità", + "CoC7.Initialize": "Avvia", + "CoC7.Locations": "Luoghi dell'inseguimento", + "CoC7.NoDamageDealt": "Non è stato inflitto alcun danno", + "CoC7.DamageDealt": "Hai inflitto {value} danno/i.", + "CoC7.NothingToRoll": "Non c'è nulla da tirare!", + "CoC7.ParticipantDataMissing": "Mancano le informazioni del partecipante", + "CoC7.ParticipantNotFound": "Impossibile trovare il partecipante", + "CoC7.ParticipantUuidNotFound": "Impossibile trovare il partecipante {participantUuid}", + "CoC7.ParticipantNotEnoughMovement": "Il partecipante {assistantUuid} ha solo {actions} azione/i di movimento", + "CoC7.ParticipantAlreadyProcessed": "Il partecipante è già stato elaborato.", + "CoC7.ErrorEmptyLocationsList": "Lista dei luoghi vuoti", + "CoC7.ErrorBeneficiaryAtMaxBonus": "Il destinatario {name} ha già il massimo dei dadi bonus", + "CoC7.ErrorParticipantAtMaxBonus": "{participantUuid} ha già il massimo dei dadi bonus", + "CoC7.ErrorTokenNotOnScene": "La Pedina non appartiene alla scena di questo luogo", + "CoC7.AddParticipant": "Aggiungi Partecipante", + "CoC7.Remove": "Rimuovi", + "CoC7.Delete": "Cancella", + "CoC7.Edit": "Modifica", + "CoC7.Create": "Crea", + "CoC7.MakeActive": "Rendi Attivo", + "CoC7.SelectNewSkill": "Seleziona l'abilità", + "CoC7.AskDamageRoll": "Chiedi il tiro per il danno", + "CoC7.AttemptNegotiateObstacle": "Tenta di affrontare quell'ostacolo", + "CoC7.AttemptBreakDown": "Tenta di distruggere!!", + "CoC7.ObstacleName": "Nome dell'ostacolo:", + "CoC7.Actions": "azioni:", + "CoC7.Chase.InitiativeShort": "INI: {value}", + "CoC7.Chase.AdjustedMovementShort": "MOD. MOV: {value}", + "CoC7.Chase.CheckName": "Nome del tiro", + "CoC7.Chase.PreysMin": "Prede Min: {value}", + "CoC7.Chase.PreysMax": "Prede Max: {value}", + "CoC7.Chase.ChasersMin": "Inseguitori Min: {value}", + "CoC7.Chase.ChasersMax": "Inseguitori Max: {value}", + + "CoC7.SpellCastingTime": "Tempo di lancio", + "CoC7.SpellCastingCost": "Costo di lancio", + "CoC7.CallSpell": "Richiamare", + "CoC7.DismissSpell": "Congedare", + "CoC7.ContactSpell": "Contattare", + "CoC7.SummonSpell": "Evocare", + "CoC7.BindSpell": "Vincolare", + "CoC7.EnchantmentSpell": "Incantare", + "CoC7.GateSpell": "Portale", + "CoC7.CombatSpell": "Combattere", + "CoC7.SpellType": "Tipo di Incantesimo", + "CoC7.SpellSuccessfullyLearned": "L'incantesimo '{spell}' è stato imparato con successo!", + "CoC7.SpellAlreadyLearned": "L'incantesimo chiamato ('{spell}') era già stato imparato.", + + "CoC7.BookHasNothingMoreToTeach": "{book} non ha più niente da insegnare. L'abilità Miti di Cthulhu di {actor} è maggiore del Valore di questo Mito.", + "CoC7.BookType": "Tipo di libro", + "CoC7.Content": "Contenuto", + "CoC7.CthulhuMythosFinal": "Mito Finale", + "CoC7.CthulhuMythosInitial": "Mito Iniziale", + "CoC7.Development": "Sviluppo", + "CoC7.DifficultyLevel": "Livello di difficoltà", + "CoC7.DragSpell": "Trascina qui gli incantesimi per inserirli nel libro...", + "CoC7.FullStudies": "Studi completati", + "CoC7.Gains": "Guadagna", + "CoC7.GainsForReading": "Guadagno di abilità per la lettura di {book}.", + "CoC7.InitialReading": "Lettura Iniziale", + "CoC7.InitialReadingNeeded": "{actor} deve eseguire una Lettura Iniziale di {book} per essere in grado di avanzare attraverso il progresso dello Studio Completo.", + "CoC7.LearnSpellAttempt": "Tenta di imparare l'incantesimo {spell}, da {book}.", + "CoC7.MarkedForDevelopment": "Contrassegnato per lo sviluppo", + "CoC7.Mythos": "Miti", + "CoC7.MythosRating": "Valore dei Miti", + "CoC7.NotOwned": "Questo Oggetto deve essere posseduto da un personaggio per poter eseguire questa azione.", + "CoC7.Occult": "Occultismo", + "CoC7.Points": "punto(i)", + "CoC7.Progress": "Progresso", + "CoC7.RedoFullStudy": "Ripeti lo Studio Completo", + "CoC7.ReadAttempt": "Tenti di leggere {book} ({language}), difficoltà {difficulty}.", + "CoC7.ReadingMythosTome": "Sta leggendo {book}.", + "CoC7.Specific": "Specifico", + "CoC7.SpellsLearned": "Incantesimi appresi", + "CoC7.StudyTime": "Tempo di Studio", + "CoC7.UnknownLanguage": "{actor} non conosce la lingua in cui è scritto questo libro.", + "CoC7.Unreadable": "Illeggibile", + + "CoC7.Crew": "Equipaggio", + "CoC7.Origin": "Origine", + "CoC7.ArmedVehicle": "Veicolo armato", + + "CoC7.PulpTalents": "Talenti Pulp", + "CoC7.TalentType": "Tipologia del Talento", + "CoC7.PhysicalTalent": "Fisico", + "CoC7.MentalTalent": "Mentale", + "CoC7.CombatTalent": "Combattimento", + "CoC7.MiscellaneousTalent": "Vari", + "CoC7.BasicTalent": "Base", + "CoC7.InsaneTalent": "Folli", + "CoC7.Sane": "Sano", + "CoC7.OtherTalent": "Altri", + + "CoC7.Items": "Oggetti", + "CoC7.Vehicle": "Veicolo", + "CoC7.Books": "Libri", + "CoC7.Status": "Condizione", + + "CoC7.Classic": "Classico", + "CoC7.Lovecraftian": "Lovecraftiano", + "CoC7.Pulp": "Pulp", + "CoC7.Modern": "Moderno", + "CoC7.Related": "Collegato alla Professione", + "CoC7.OccupationType": "Tipologia di professione", + "CoC7.OccupationPoints": "Punti professione", + "CoC7.Selected": "Selezionato", + "CoC7.Multiplier": "Moltiplicatore", + "CoC7.Optional": "Optionale", + "CoC7.Or": "o", + "CoC7.Minimum": "Minimo", + "CoC7.Maximum": "Massimo", + "CoC7.CommonSkills": "Abilità comuni", + "CoC7.OptionSkills": "Gruppo di abilità opzionali", + "CoC7.ChoiceNumber": "Opzioni", + "CoC7.Choose": "Numero tra cui scegliere", + "CoC7.Chosen": "Scelto", + "CoC7.EmptySkillList": "Aggiungi un'abilità rilasciandola qui.", + "CoC7.EmptyItemList": "Aggiungi un oggetto rilasciandolo qui.", + "CoC7.EmptyCharacterSkillList": "Aggiungi una configurazione, una professione o un'abilità rilasciandola qui.", + "CoC7.PersonalSpeciality": "Numero di specialità personali o dell'epoca", + "CoC7.AdditionalSkills": "Abilità aggiuntive", + "CoC7.SkillSelectionWindow": "Seleziona abilità facoltative", + "CoC7.SelectPersonalSkills": "Seleziona {number} abilità come abilità di interesse personale", + "CoC7.ResetOccupation": "Azzera la Professione", + "CoC7.ResetOccupationHint": "Il personaggio {name} ha già una Professione. Vuoi azzerarla?", + "CoC7.ResetArchetype": "Azzera Archetipo", + "CoC7.ResetArchetypeHint": "Il personaggio {name} ha già un Archetipo. Vuoi azzerarlo?", + "CoC7.CreditOutOfRange": "Il Valore di Credito dovrebbe essere compreso tra {min} e {max}", + "CoC7.BioSections": "Sezioni della biografia", + "CoC7.BioSectionName": "Nome della Sezione della biografia", + "CoC7.SpendPoints": "Assegna punti caratteristiche", + "CoC7.RollCharac": "Tira per le caratteristiche", + "CoC7.SelectCoreCharac": "Seleziona la caratteristica principale", + "CoC7.SkillSpecSelectTitle": "Seleziona/crea l'abilità della specializzazione di {specialization}", + "CoC7.SkillSelectBase": "Seleziona il valore di base per l'abilità {name}", + "CoC7.SelectSkill": "Seleziona un'abilità esistente", + "CoC7.CreateNewSkill": "Crea una nuova abilità", + + "CoC7.Characteristics": "Caratteristiche", + "CoC7.Characteristic": "Caratteristica", + "CoC7.EnableCharacteristics": "Autorizza caratteristiche", + "CoC7.UsePoints": "Usa i punti", + "CoC7.UseRolls": "Usa i tiri", + "CoC7.CoreCharacteristics": "Caratteristiche principali", + "CoC7.BonusPoints": "Punti bonus", + "CoC7.SuggestedOccupations": "Professioni consigliate", + "CoC7.SuggestedTraits": "Tratti consigliati", + + "CoC7.PutGunAway": "Metti via la tua pistola", + "CoC7.DrawGun": "Estrai la tua pistola", + + "CoC7.GmTools": "Strumenti del Custode", + "CoC7.GmNotes": "Note del Custode", + "CoC7.DevPhase": "Fase di sviluppo", + "CoC7.DevPhaseEnabled": "Fase di sviluppo abilitata", + "CoC7.DevPhaseDisabled": "Fase di sviluppo disabilitata", + "CoC7.CharCreationMode": "Modalità di creazione del personaggio", + "CoC7.CharCreationEnabled": "Modalità di creazione del personaggio abilitata", + "CoC7.CharCreationDisabled": "Modalità di creazione del personaggio disabilitata", + "CoC7.toggleXP": "Guadagno Esp.", + "CoC7.XPGainEnabled": "Il personaggio può guadagnare Esp.", + "CoC7.XPGainDisabled": "Il personaggio non può guadagnare Esp.", + "CoC7.WarnNoActorAvailable": "Non hai nessun personaggio controllato né selezionato", + "CoC7.WarnMacroIncorrectType": "Puoi creare macro solo per armi e abilità", + "CoC7.WarnNoGlobalSpec": "Non puoi creare macro per specializzazioni non specificate", + "CoC7.WarnMacroNoItemFound": "Nessun oggetto utilizzabile trovato", + "CoC7.WarnNoControlledActor": "Non controlli nessun personaggio", + "CoC7.WarnFastTargetWithWrongMOV": "Selezionato Veloce per un bersaglio con meno di 8 MOV. (MOV: {mov})", + "CoC7.WarnTooManyTarget": "Selezionati troppi bersagli. Si mantiene solo l'ultimo bersaglio selezionato", + "CoC7.WarnNoTargetsSanCheck": "Non hai selezionato nessun bersaglio. Seleziona dei bersagli oppure crea un collegamento.", + + "CoC7.allActors": "Tutti i personaggi", + "CoC7.restTargets": "Fai riposare i bersagli", + "CoC7.startRest": "Inizi a riposare", + "CoC7.dreaming": "Gli investigatori aspettano sognando", + "CoC7.healthRecovered": "Hai recuperato un Punto Ferita", + "CoC7.pulpHealthRecovered": "Hai recuperato {number} Punti Ferita", + "CoC7.dailySanLossRestarted": "Il contatore della perdita giornaliera di Sanità è stato azzerato", + "CoC7.magicPointsRecovered": "Punti Magia recuperati", + "CoC7.hasCriticalWounds": "Impossibile recuperare Punti Ferita a causa di Ferite Critiche", + "CoC7.quickHealer": "Guaritore rapido", + + "CoC7.ErrorNoDodgeSkill": "Il personaggio non ha un'abilità per schivare", + "CoC7.ErrorNotEnoughLuck": "{actor} non ha avuto abbastanza Fortuna per poter passare il tiro", + "CoC7.ErrorManeuverNotPossible": "Il tuo avversario è troppo forte per te per poter eseguire una manovra", + "CoC7.ErrorNotFound": "{missing} non trovato!", + "CoC7.ErrorNotFoundForActor": "{missing} non trovato per il personaggio {actor}!", + "CoC7.ErrorUnableToParseFormula": "{value} non è una formula valida", + "CoC7.ErrorUnableToParseArmorFormula": "Impossibile elaborare il valore dell'armatura: {value}. Armatura ignorata.", + "CoC7.ErrorUnableToParseSkillFormula": "Impossibile interpretare la formula: {value} per l'abilità {name}", + "CoC7.ErrorActorHasNoWeaponNamed": "Il Personaggio {actorName} non ha un'arma chiamata {weaponName}", + "CoC7.ErrorActorHasTooManyWeaponsNamed": "`Il Personaggio {actorName} ha più di un'arma chiamata {weaponName}. Verrà utilizzata la prima trovata`", + "CoC7.ErrorUnexpectedWeaponText": "Testo delle armi anomalo, si prega di please creare un bug report con il testo che si sta tentando di importare", + "CoC7.ErrorUnexpectedSkillsText": "Testo delle abilità anomalo, si prega di please creare un bug report con il testo che si sta tentando di importare", + "CoC7.ErrorNoTokensSelected": "Nessuna Pedina selezionata", + "CoC7.ErrorEvaluatingDamage": "Errore nel valutare il danno", + + "CoC7.InfoLessSkillThanOptions": "Ci sono solo {skillCount} e {optionsCount} opzioni, le aggiungo tutte quante", + "CoC7.InfoAllSkillsAlreadySelected": "Tutte le abilità sono già selezionate.", + + "CoC7.MessageCheckRequestedWait": "Tiro {check} richiesto dal tuo Custode.
                            Attendi prima di premere!
                            ", + "CoC7.MessageTargetCheckRequested": "Il tuo Custode ha richiesto che {name} effettui un Tiro {check}.", + "CoC7.MessageTitleSelectSingleUserForTarget": "Quale utente può rispondere a questo attacco", + "CoC7.MessageSelectSingleUserForTarget": "Questa pedina è controllata da più utenti, seleziona quale utente può rispondere a questo attacco.", + "CoC7.MessageBoutOfMadnessTableNotFound": "Non è stato trovato il risultato dalla Tabella della Follia, controlla che tutte le tue tabelle dei tiri siano state create", + "CoC7.MessageBoutOfMadnessItemNotFound": "Il risultato dalla Tabella della Follia non è stato trovato, controlla che tutte le tue condizioni siano state create", + "CoC7.MessageRollingCharacteristic": "Tiro caratteristica {label}: {formula}", + + "CoC7.DealDamage": "Infliggi {damage} punti di danno a {target}?", + "CoC7.DamageDealTo": "Danno {name} {damage}PF", + "CoC7.NoTargetSelected": "Non hai selezionato un bersaglio per il tuo tiro {weapon}. Vuoi procedere comunque?", + + "CoC7.Import": "Importa", + "CoC7.Proceed": "Procedi", + "CoC7.Cancel": "Cancella", + "CoC7.Add": "Aggiungi", + "CoC7.Update": "Aggiorna", + "CoC7.Enable": "Attiva", + "CoC7.Disable": "Disattiva", + "CoC7.Duration": "Durata", + + "CoC7.ActorImporter": "Importa Personaggio", + "CoC7.ActorImporterSummary": "Importa un PNG o una Creatura dalla descrizione e dalle statistiche. Basta incollare il testo corrispondente", + "CoC7.PasteTheDataBelow": "Incolla qui sotto i dati di testo grezzo", + "CoC7.TextFieldInvalidCharacters": "Sono presenti caratteri non validi nel testo, correggili o verranno rimossi", + "CoC7.TextFieldInvalidJSON": "Impossibile interpretare il file JSON, per favore provare di nuovo", + "CoC7.ActorImporterUploadError": "Importazione fermata, impossibile scrivere l'immagine", + "CoC7.FileUploadError": "Impossibile scrivere l'immagine, errore di upload del file", + "CoC7.SelectActorType": "Seleziona la tipologia del personaggio", + "CoC7.NonPlayingCharacter": "Personaggio Non Giocante (PNG)", + "CoC7.Creature": "Creatura", + "CoC7.ConvertFrom6Edition": "Converti dalla 6a edizione", + "CoC7.Convert": "Converti", + "CoC7.NoConvert": "Non Convertire", + "CoC7.Guess": "Ipotesi", + "CoC7.English": "Inglese", + "CoC7.Spanish": "Spagnolo", + "CoC7.French": "Francese", + "CoC7.German": "Tedesco", + "CoC7.Polish": "Polacco", + "CoC7.TraditionalChinese": "Cinese tradizionale", + "CoC7.SelectSourceLanguage": "Seleziona la lingua del testo di origine", + "CoC7.ImportedUnnamedCharacter": "Personaggio senza nome importato", + "CoC7.CreatedImportedCharactersFolder": "Creata la cartella dei 'Personaggi importati'", + "CoC7.ImportedCharactersFolder": "Personaggi importati", + "CoC7.PickDirectory": "Scegli la cartella", + "CoC7.ImportSkillItemLocations": "Cerca abilità/incantesimi/armi in", + "CoC7.ImportActorItemsNone": "Nessuno", + "CoC7.ImportActorItemsItem": "Oggetti", + "CoC7.ImportActorItemsItemWorldModuleSystem": "Oggetti / Mondi / Moduli / Sistema", + "CoC7.ImportActorItemsWorldModuleItemSystem": "Mondi / Moduli / Oggetti / Sistema", + "CoC7.ActorImported": "Nuovo {actorType} importato: {actorName}", + + "CoC7.DholeHouseActorImporter": "Importatore JSON per personaggi della The Dhole's House", + "CoC7.DholeHouseActorImporterSummary": "Esporta il tuo personaggio della Dhole's House in formato JSON e importalo qui.", + "CoC7.DholeHouseImportingName": "Pronto a importare: ", + "CoC7.DholeHousePickYourJSONFile": "Scegli il file JSON esportato dalla The Dhole's House", + "CoC7.DholeHouseActorImporterSource": "Personaggio importato dalla The Dhole's House", + "CoC7.DholeHouseInvalidActor": "Il file JSON selezionato non sembra essere un personaggio esportato dalla The Dhole's House valido", + + "CoC7.HowToTranslateTitle": "Come tradurre?", + "CoC7.HowToTranslateWarning": "Non installare moduli di cui non ti fidi.", + "CoC7.HowToTranslateInstallBabele": "Installa/aggiorna il modulo Babele dal gestore dei moduli di Foundry.", + "CoC7.HowToTranslateInstallTranslation": "Installa/Aggiorna la traduzione dal gestore dei moduli di Foundry.", + "CoC7.HowToTranslateEnableTranslation": "All'interno del Mondo di Gioco, in Configuration/Manage Modules attiva sia Babele che le traduzioni.", + "CoC7.HowToTranslateNoTranslation": "Le istruzioni per la creazione di traduzioni in nuove lingue sono disponibili nei moduli di traduzione esistenti.", + + "CoC7.Migrate.Title": "Aggiornamento richiesto", + "CoC7.Migrate.Message": "

                            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": "
                            1. Cliccare col sinistro Tiro con opzioni
                            2. Shift + Cliccare col sinistro Tiro immediato con difficoltà Normale
                            1. Cliccare col destro Tiro contrapposto con opzioni
                            2. Shift + Cliccare col destro Tiro contrapposto immediato
                            1. Alt/Optione + Cliccare col destro Tiro combinato con opzioni
                            ", + "CoC7.ToolTipKeeperSkill": "
                            1. CTRL + Cliccare col sinistro Crea collegamento al tiro
                            2. {other}
                            ", + "CoC7.ToolTipKeeperStandbySkill": "
                          3. Cliccare col sinistro Richiedi un tiro a {name}
                          4. ", + "CoC7.ToolTipDB": "
                            1. Cliccare col sinistro Tiro immediato con difficoltà Normale
                            ", + "CoC7.ToolTipSanity": "
                            1. Cliccare col sinistro tiro con opzioni
                            2. Alt/Opzione + Cliccare col sinistro tiro di perdità di sanità con opzioni
                            3. Shift + Cliccare col sinistro Tiro immediato a difficoltà Normale
                            4. Shift + Alt/Opzione + Cliccare col sinistro tiro di perdità di sanità senza opzioni di riserva di dadi
                            1. Cliccare col destro Tiro contrapposto con opzioni
                            2. Shift + Cliccare col destro Tiro contrapposto immediato
                            1. Alt/Opzione + Cliccare col destro Tiro combinato con opzioni
                            2. Shift + Alt/Opzione + Cliccare col destro Tiro combinato immediato
                            ", + "CoC7.ToolTipCombat": "
                            1. Cliccare col sinistro tiro con opzioni
                            2. Shift + Cliccare col sinistro Tiro immediato a difficoltà Normale
                            1. Cliccare col destro Manovra di combattimento contrapposta con opzioni
                            2. Shift + Cliccare col destro Manovra di combattimento contrapposta immediata
                            ", + "CoC7.ToolTipKeeperSanity": "
                          5. CTRL + Alt/Optione Crea collegamento al Tiro Sanità
                          6. ", + "CoC7.ToolTipAutoToggle": "
                            1. Cliccare col sinistro Attiva/disattiva calcolo automatico o inserimento manuale
                            2. ", + "CoC7.ToolTipSkillFlagToggle": "
                              1. Cliccare due volte Attiva/disattiva il contrassegnare la condizione
                              2. ", + "CoC7.ToolTipSkillFlagged": "Segnalato per lo sviluppo", + "CoC7.ToolTipSkillUnflagged": "Non segnalato per lo sviluppo", + + "SETTINGS.TitleRules": "Regolamento", + "SETTINGS.TitleInitiative": "Impostazioni per l'iniziativa", + "SETTINGS.TitleRoll": "Impostazioni per il tiro", + "SETTINGS.TitleChatCards": "Impostazioni delle schede di chat", + "SETTINGS.TitleScene": "Impostazioni per la scena", + "SETTINGS.TitleSheet": "Impostazioni per la scheda", + "SETTINGS.TitleGameArtwork": "Impostazioni della grafica del gioco", + "SETTINGS.TitleWeapon": "Impostazioni per l'arma", + "SETTINGS.TitleDiceSoNice": "Impostazioni per Dice So Nice", + "SETTINGS.TitleDeveloperDebug": "Impostazioni per sviluppatori e debug", + "SETTINGS.TitleRollTable": "Impostazioni per Tabella Tiri", + "SETTINGS.TitleChaseSettings": "Impostazioni dell'inseguimento", + "SETTINGS.DebugMode": "Modalità di debug del sistema", + "SETTINGS.DebugModeHint": "!!NECESSARIO RIAVVIO!!", + "SETTINGS.DefaultDifficulty": "Difficoltà di tiro predefinita", + "SETTINGS.DefaultDifficultyHint": "Puoi scegliere la difficoltà predefinita per i tiri. 'Sconosciuta' lancerà i tiri senza che il giocatore conosca la difficoltà del tiro.", + "SETTINGS.CheckDifficultyRegular": "Difficoltà predefinita", + "SETTINGS.CheckDifficultyUnknown": "Difficoltà sconosciuta", + "SETTINGS.showIconsOnly": "Nella scheda riepilogativa, mostra solo le icone nell'elenco delle abilità.", + "SETTINGS.UseToken": "Usa l'immagine della pedina", + "SETTINGS.UseTokenHint": "Usa l'immagine della pedina invece dei ritratti nelle schede della chat", + "SETTINGS.DisplayActorOnCard": "Mostra il personaggio sulla scheda", + "SETTINGS.DisplayActorOnCardHint": "mostra l'immagine/la pedina del personaggio sulle schede della chat di combattimento", + "SETTINGS.InitiativeRule": "Seleziona regola per l'iniziativa", + "SETTINGS.InitiativeRuleHint": "Puoi selezionare la regola dell'iniziativa di base (usando il valore di DES) o la regola facoltativa (usando un tiro)", + "SETTINGS.InitiativeRuleBasic": "Base", + "SETTINGS.InitiativeRuleOptional": "Optionale", + "SETTINGS.displayInitDices": "Visualizza i dadi dell'iniziativa", + "SETTINGS.displayInitDicesHint": "Mostra i dadi quando tiri per l'iniziativa (solo regole facoltative)", + "SETTINGS.displayInitAsText": "Visualizza il testo dell'iniziativa", + "SETTINGS.displayInitAsTextHint": "Visualizza l'iniziativa come testo anziché come numero (solo regole facoltative)", + "SETTINGS.PulpRules": "Regole Pulp", + "SETTINGS.PulpRulesHint": "Consenti l'utilizzo delle Regole Pulp (Archetipo, Talento, PF), !implementazione anticipata!", + "SETTINGS.developmentRollForLuck": "Punti Fortuna recuperabili", + "SETTINGS.developmentRollForLuckHint": "Ogni giocatore può effettuare un tiro di miglioramento per la propria Fortuna durante la Fase di Sviluppo", + "SETTINGS.displayPlayerNameOnSheet": "Mostra il nome del giocatore sulla scheda", + "SETTINGS.DisregardAmmo": "Ignora il conteggio delle munizioni.", + "SETTINGS.DisregardAmmoHint": "Attivandola non verrà tenuto conto del numero di proiettili caricati nella pistola.", + "SETTINGS.DisregardUsePerRound": "Ignora gli utilizzi per turno.", + "SETTINGS.DisregardUsePerRoundHint": "Attivandola ti permetterà di sparare quanto vuoi, indipendentemente dagli utilizzi per turno dell'arma.", + "SETTINGS.RestrictGridSpaces": "Limita la misurazione agli spazi della griglia", + "SETTINGS.RestrictGridSpacesHint": "Per il combattimento a distanza, se selezionata le distanze verranno misurate in spazi della griglia, altrimenti verrà utilizzata la distanza 'reale' (euclidea).", + "SETTINGS.StatusPlayerEditable": "Il giocatore può modificare la condizione", + "SETTINGS.StatusPlayerEditableHint": "Consenti al tuo giocatore di modificare la propria condizione (a terra, privo di sensi, morente, morto) e di azzerare la perdita giornaliera di SAN", + "SETTINGS.SyncDice3D": "[DsN] Sincronizza i dadi", + "SETTINGS.SyncDice3DHint": "Quando usi DsN, sincronizzi i dadi tra i client", + "SETTINGS.UnitDieColorset": "[DsN] Set di colori per unità di dado", + "SETTINGS.UnitDieColorsetHint": "Quando utilizzi DsN, il set di colori da utilizzare per l'unità di dado. (lascia vuoto per usare l'impostazione predefinita del giocatore)", + "SETTINGS.TenDieNoMod": "[DsN] Set di colori per dado da dieci", + "SETTINGS.TenDieNoModHint": "Quando utilizzi DsN, il set di colori da utilizzare per un singolo dado da dieci. (lascia vuoto per usare l'impostazione predefinita del giocatore)", + "SETTINGS.TenDieBonus": "[DsN] Set di colori per dado da dieci bonus", + "SETTINGS.TenDieBonusHint": "Quando utilizzi DsN, il set di colori da utilizzare per il dado da dieci bonus. (lascia vuoto per usare l'impostazione predefinita del giocatore)", + "SETTINGS.TenDiePenalty": "[DsN] Set di colori per dado da dieci penalità", + "SETTINGS.TenDiePenaltyHint": "Quando utilizzi DsN, il set di colori da utilizzare per il dado da dieci penalità. (lascia vuoto per usare l'impostazione predefinita del giocatore)", + "SETTINGS.OverrideGameArtwork": "Sostituisci la grafica del gioco", + "SETTINGS.OverrideGameArtworkHint": "!!NECESSARIO RIAVVIO!! Dà accesso alla configurazione avanzata del gioco, lascia vuoto per l'impostazione predefinita", + "SETTINGS.ArtPauseImage": "Immagine per la pausa", + "SETTINGS.ArtPauseImageHint": ". Digita 'null' per rimuovere l'immagine", + "SETTINGS.ArtPauseText": "Testo per la pausa", + "SETTINGS.ArtPauseTextHint": "Lascia vuoto per l'impostazione predefinita", + "SETTINGS.OverrideSheetArtwork": "Sostituisci la grafica della scheda", + "SETTINGS.OverrideSheetArtworkHint": "!!NECESSARIO RIAVVIO!! Dà accesso alla configurazione avanzata della scheda, lascia vuoto per l'impostazione predefinita", + "SETTINGS.ArtWorkSheetBackground": "Sfondo della scheda del personaggio", + "SETTINGS.ArtWorkSheetBackgroundHint": "digita 'null' per rimuovere lo sfondo, vuoto per l'impostazione predefinita", + "SETTINGS.ArtWorkSheetBackgroundType": "Tipologia dello sfondo", + "SETTINGS.BackgroundSlice": "L'immagine di sfondo verrà tagliata (css:border-image)", + "SETTINGS.BackgroundAuto": "Ridimensiona l'immagine mantenendo le proporzioni (css:auto)", + "SETTINGS.BackgroundContain": "Ridimensiona per riempire senza ritagliare/allungare (css:contain)", + "SETTINGS.BackgroundCover": "Ridimensiona per riempire con ritaglio/allungamento (css:cover)", + "SETTINGS.ArtWorkOtherSheetBackground": "Altro sfondo della scheda", + "SETTINGS.ArtWorkOtherSheetBackgroundHint": "digita 'null' per rimuovere lo sfondo. Solo per oggetti e veicolo per ora", + "SETTINGS.ArtworkSheetImage": "Immagine della scheda del personaggio", + "SETTINGS.ArtworkSheetImageHint": "digita 'null' per rimuovere l'immagine", + "SETTINGS.ArtworkFrontColor": "Colore principale", + "SETTINGS.ArtworkFrontColorHint": "Utilizzato per tutti gli elementi", + "SETTINGS.ArtworkBackgroundColor": "Colore secondario", + "SETTINGS.ArtworkBackgroundColorHint": "Utilizzato per sfondo e immissioni", + "SETTINGS.ArtworkInteractiveColor": "Colore degli elementi interattivi", + "SETTINGS.ArtworkInteractiveColorHint": "Utilizzato per elementi interattivi/da tirare", + "SETTINGS.ArtworkFixedSkillLength": "Limita la lunghezza del nome dell'abilità", + "SETTINGS.ArtworkFixedSkillLengthHint": "La lunghezza dell'abilità nella sezione delle abilità sarà limitata per una scheda più compatta", + "SETTINGS.ArtworkMainFont": "Font principale", + "SETTINGS.ArtworkMainFontBold": "Font principale (grassetto)", + "SETTINGS.ArtworkMainFontSize": "Dimensione predefinita del carattere (punti)", + "SETTINGS.BoutOfMadnessSummaryTable": "Tabella dell'Attacco di Follia (Riepilogo)", + "SETTINGS.BoutOfMadnessRealTimeTable": "Tabella dell'Attacco di Follia (Tempo reale)", + "SETTINGS.LetKeeperDecide": "Lascia decidere al Custode", + "SETTINGS.DisplayResultType": "Visualizza il tipo di risultato dei dadi (testo)", + "SETTINGS.DisplayCheckSuccessLevel": "Visualizza il livello di successo del tiro (stelle)", + "SETTINGS.PlayerUnlockSheetMode": "Il giocatore può sbloccare la scheda", + "SETTINGS.AlwaysEditable": "sempre", + "SETTINGS.CreationModeOnly": "solo in modalità creazione", + "SETTINGS.NeverEditable": "mai (solo il Custode)", + "SETTINGS.StanbyGMRolls": "Attendi, il Custode sta tirando", + "SETTINGS.StanbyGMRollsHint": "Quando il Custode sta effettuando un tiro da una scheda personaggio assegnata, mostra un pulsante per tirare invece di tirare direttamente", + "SETTINGS.AllowFlatDiceModifier": "Modificatore fisso per i dadi", + "SETTINGS.AllowFlatDiceModifierHint": "Consente di modificare i risultati del lancio dei dadi di un valore fisso.", + "SETTINGS.AllowFlatThresholdModifier": "Modificatore fisso per i valori", + "SETTINGS.AllowFlatThresholdModifierHint": "Consente di modificare il valore del successo dei tiri di un valore fisso.", + "SETTINGS.OpposedRollTieBreaker": "Spareggio di Viriato139ac ai tiri contrapposti", + "SETTINGS.OpposedRollTieBreakerHint": "In caso di pareggio durante il tiro contrapposto, il vincitore è determinato dal valore più alto ottenuto, non dall'abilità più alta.", + "SETTINGS.SelfRollWhisperTarget": "Notifica di tiro a se stesso:", + "SETTINGS.SelfRollWhisperTargetHint": "In qualità di GM, quando esegui tu un tiro, a chi vuoi inviare una notifica.", + "SETTINGS.DoNotAdvise": "Tienilo per te.", + "SETTINGS.AdviseOwnersOnly": "Avvisa il proprietario del personaggio", + "SETTINGS.AdviseAllPlayer": "Avvisa tutti i giocatori", + "SETTINGS.OneBlockBackStory": "Un blocco di trascorsi", + "SETTINGS.OneBlockBackStoryHint": "Trasforma i trascorsi in un blocco editabile, ma puoi formattare/aggiungere collegamenti.", + "SETTINGS.EnableStatusIcons": "Abilita icone di condizione", + "SETTINGS.EnableStatusIconsHint": "Imposta se le icone degli effetti di combattimento e di sanità vengono mostrate nelle pedine.", + "SETTINGS.ShowExperimentalFeatures": "Mostra caratteristiche sperimentali", + "SETTINGS.ShowExperimentalFeaturesHint": "Il tuo mondo potrebbe diventare inutilizzabile in una versione futura se utilizzi queste funzionalità. Solo per i test, NON usarli nei tuoi mondi di gioco", + "CoC7.ExperimentalFeaturesWarning": "Questa funzione è in lavorazione e non è consigliata per l'uso nel tuo mondo di gioco.", + "SETTINGS.CheckElevation": "Includi l'elevazione in distanza", + "SETTINGS.CheckElevationHint": "Usa l'elevazione nei calcoli della distanza dei combattimento a distanza", + "CoC7.toolTipDelay": "Ritardo in millisecondi prima che la descrizione del comando venga visualizzata, 0 per mai", + "SETTINGS.ChaseShowTokenMovement": "Mostra movimento della pedina.", + "SETTINGS.ChaseShowTokenMovementHint": "Mostra movimento sulla griglia quando una pedina viene mossa nel luogo successivo.", + + "CoC7.getTheExample": "Copia Esempio", + "CoC7.Copied": "Copiato il testo di esempio negli Appunti", + + "CoC7.EffectNew": "Nuovo effetto", + "CoC7.EffectAppliedCantOverride": "Viene applicato un effetto attivo. Non puoi modificare [{name}]. Per modificare questo valore devi disattivare l'effetto corrispondente." +} diff --git a/lang/ja.json b/lang/ja.json index 5a3ae71d..9c97b001 100644 --- a/lang/ja.json +++ b/lang/ja.json @@ -1,24 +1,42 @@ { "CoC7.title": "新クトゥルフ神話TRPG (非公式)", + "CoC7.Entities.Character": "キャラクター", + "CoC7.Entities.Container": "荷物", + "CoC7.Entities.Creature": "クリーチャー", + "CoC7.Entities.Npc": "NPC", + "CoC7.Entities.Vehicle": "乗り物", + + "CoC7.Entities.Archetype": "アーキタイプ", + "CoC7.Entities.Book": "本", + "CoC7.Entities.Chase": "チェイス", + "CoC7.Entities.Item": "アイテム", + "CoC7.Entities.Occupation": "職業", + "CoC7.Entities.Setup": "初期設定", + "CoC7.Entities.Skill": "技能", + "CoC7.Entities.Spell": "呪文", + "CoC7.Entities.Status": "状態", + "CoC7.Entities.Talent": "特徴", + "CoC7.Entities.Weapon": "武器", + "CHARAC.STR": "STR", - "CHARAC.Strengh": "筋力", - "CHARAC.Strength": "筋力", + "CHARAC.Strengh": "STR [筋力]", + "CHARAC.Strength": "STR [筋力]", "CHARAC.CON": "CON", - "CHARAC.Constitution": "体力", + "CHARAC.Constitution": "CON [体力]", "CHARAC.SIZ": "SIZ", - "CHARAC.Size": "体格", + "CHARAC.Size": "SIZ [体格]", "CHARAC.DEX": "DEX", - "CHARAC.Dexterity": "敏捷性", + "CHARAC.Dexterity": "DEX [敏捷性]", "CHARAC.APP": "APP", - "CHARAC.Appearance": "外観", + "CHARAC.Appearance": "APP [外見]", "CHARAC.INT": "INT", - "CHARAC.Intelligence": "知性", + "CHARAC.Intelligence": "INT [知性]", "CHARAC.POW": "POW", - "CHARAC.Power": "精神力", + "CHARAC.Power": "POW [精神力]", "CHARAC.EDU": "EDU", - "CHARAC.Education": "教育", - + "CHARAC.Education": "EDU [教育]", + "CoC7.PlayerName": "プレイヤー", "CoC7.Name": "名前", "CoC7.Archetype": "アーキタイプ", "CoC7.Occupation": "職業", @@ -29,7 +47,7 @@ "CoC7.Organization": "組織", "CoC7.HitPoints": "耐久力", "CoC7.HP": "HP", - "CoC7.MagicPoints": "MP", + "CoC7.MagicPoints": "マジック・ポイント", "CoC7.MP": "MP", "CoC7.SanityPoints": "正気度ポイント", "CoC7.Sanity": "正気度", @@ -42,7 +60,7 @@ "CoC7.BonusDamage": "ダメージ・ボーナス", "CoC7.DB": "DB", "CoC7.Build": "ビルド", - "CoC7.Skills": "技能", + "CoC7.Skills": "技能 ", "CoC7.Skill": "技能", "CoC7.Combat": "戦闘", "CoC7.Possessions": "装備と収入", @@ -72,6 +90,7 @@ "CoC7.Spells": "呪文", "CoC7.Spell": "呪文", "CoC7.Spells&Notes": "呪文とメモ", + "CoC7.Weapons": "武器", "CoC7.Effects": "効果", "CoC7.Cost": "コスト", "CoC7.Source": "出典", @@ -80,6 +99,9 @@ "CoC7.Other": "その他", "CoC7.rounds": "ラウンド", "CoC7.hours": "時間", + "CoC7.days": "日", + "CoC7.weeks": "週間", + "CoC7.months": "ヶ月", "CoC7.remove": "除去", "CoC7.Any": "任意", "CoC7.All": "全て", @@ -92,17 +114,27 @@ "CoC7.Attributes": "性能", "CoC7.Attribute": "性能", "CoC7.Collapse": "粉砕", - "CoC7.Expand": "Expand", - "CoC7.Blind": "Blind", - "CoC7.Label": "Label", - "CoC7.Icon": "Icon", - "CoC7.Check": "Check", - "CoC7.ItemWeapon": "Item (Weapon)", - - "CoC7.CopyToClipboard": "Copy to clipboard", - "CoC7.WhisperToSelection": "Whisper to selected tokens", - "CoC7.WhisperTo": "Whisper to", - "CoC7.SendToChat": "Send to chat", + "CoC7.Expand": "拡張", + "CoC7.Blind": "盲目", + "CoC7.Label": "ラベル", + "CoC7.Icon": "アイコン", + "CoC7.Check": "判定", + "CoC7.ItemWeapon": "アイテム (武器)", + "CoC7.AttacksPerRound": "1ラウンドの攻撃回数", + + "CoC7.Cast": "詠唱", + "CoC7.SanityCost": "正気度コスト", + "CoC7.PowerCost": "POWコスト", + "CoC7.HitPointsCost": "耐久力コスト", + "CoC7.MagicPointsCost": "MPコスト", + "CoC7.OtherCosts": "その他のコスト", + "CoC7.CastingSpell": "{spell} 呪文を詠唱。", + "CoC7.NotEnoughMagicPoints": "{spell} 呪文のコストとして {originalMagicPoints} MPを消費する必要がある。君には {actorMagicPoints} MPしかないため、不足分である {convertedHitPoints} 点のコストを、君の耐久力から支払うことが可能だ。そうした場合、{convertedHitPoints} ダメージを受ける。", + + "CoC7.CopyToClipboard": "クリップボードにコピー", + "CoC7.WhisperToSelection": "選択したトークンにウィスパー", + "CoC7.WhisperTo": "ウィスパー:", + "CoC7.SendToChat": "チャットに送信", "CoC7.RegularSuccess": "レギュラー成功", "CoC7.HardSuccess": "ハード成功", @@ -138,10 +170,11 @@ "CoC7.check.ForceFail": "強制失敗", "CoC7.check.FlagForDevelopment": "経験チェックを与える", "CoC7.IncreaseSuccessLevel": "成功レベルを増加する", - "CoC7.check.DecreaseSuccessLevel": "成功レベルを減少する", - "CoC7.RollSecretDice": "ゲームマスターは個人的にいくつかのダイスを振った", + "CoC7.check.DecreaseSuccessLevel": "成功レベルが減少する", + "CoC7.RollSecretDice": "ゲームマスターは個人的にいくつかのダイスをロールした", "CoC7.KeeperSentDecoy": "プレイヤーに送られる見せかけロール", "CoC7.FakeRoll": "見せかけロールをプレイヤーに送る", + "CoC7.ErrorMissingKeeperUser": "このアクションは、キーパーが接続中の時にしか実行できない。", "CoC7.ConstitutionCheck": "CON判定", @@ -168,34 +201,40 @@ "CoC7.CreateLink": "リンク作成", "CoC7.SuccesLevelHint": "成功レベル {value}", "CoC7.FailureLevelHint": "失敗レベル {value}", + "CoC7.CardType": "ロールタイプ", "CoC7.CombinedRollCard": "複合ロールカード", "CoC7.OpposedRollCard": "対抗ロールカード", + "CoC7.GroupRollCard": "グループ・ロールカード", + "CoC7.RegularRollCard": "通常ロールカード", "CoC7.CombinedAnyHint": "任意のロールに成功する必要がある", "CoC7.CombinedAllHint": "すべてのロールに成功する必要がある", "CoC7.CloseCard": "カードを閉じる", + "CoC7.AttackManeuver": "攻撃マヌーバー", "CoC7.CheckResult": "{name}判定 ({value}%) - {difficulty}の難易度", "CoC7.ItemCheckResult": "{item} - {skill}判定 ({value}%) - {difficulty}の難易度", "CoC7.CheckRawValue": "({rawvalue}%) - {difficulty}の難易度", - "CoC7.ArmorAbsorbsDamage": "Armor absorbs total damage", - "CoC7.Critical": "Critical", - "CoC7.Impale": "Impale", - "CoC7.CriticalTitle": "The blow is critical", - "CoC7.ImpaleTitle": "The weapon can impale", - "CoC7.Target": "Target", - "CoC7.TargetOutOfRange": "Target out of range", - "CoC7.ShotIsImpossible": "Shot is impossible", - "CoC7.OutOfAmmo": "Out of Ammo", - "CoC7.OutOfShots": "Out of shots", + "CoC7.ArmorAbsorbsDamage": "装甲のダメージ吸収値", + "CoC7.Critical": "クリティカル", + "CoC7.Impale": "貫通", + "CoC7.CriticalTitle": "致命的な一撃", + "CoC7.ImpaleTitle": "貫通可能武器", + "CoC7.Target": "対象", + "CoC7.TargetOutOfRange": "射程外の対象", + "CoC7.NoTargetToDamage": "ダメージを与える対象がいない", + "CoC7.ShotIsImpossible": "射撃不可", + "CoC7.OutOfAmmo": "弾切れ", + "CoC7.OutOfShots": "射程外", "CoC7.BonusDamageRoll": "ダメージ・ボーナス・ロール", "CoC7.Type": "種類", "CoC7.FightBack": "応戦", "CoC7.Dodge": "回避", "CoC7.Maneuver": "マヌーバー", + "CoC7.NoResponse": "反応なし", "CoC7.OutNumbered": "数的不利", - "CoC7.combatCard.surpised": "奇襲", + "CoC7.combatCard.surprised": "奇襲", "CoC7.combatCard.autoSuccess": "自動成功", "CoC7.Advantage": "優勢", "CoC7.Disadvantage": "劣勢", @@ -204,11 +243,12 @@ "CoC7.TitleOutNumbered": "数的不利状態にある対象によりボーナス・ダイス1つを受ける", "CoC7.TitleSurprised": "対象が奇襲に気付かなかったことによりボーナス・ダイス1つを受ける", "CoC7.TitleAutoSuccess": "攻撃が自動的に成功する", - "CoC7.WinnerRollDamage": "{name} が勝利! ダメージをロールすること。", + "CoC7.WinnerRollDamage": "{name} が勝利! ダメージロール。", + "CoC7.InitiatorMissed": "{name} は攻撃を外した。", "CoC7.NoWinner": "両者失敗。", "CoC7.DodgeSuccess": "{name} は回避した!", - "CoC7.ManeuverSuccess": "{name} はマヌーバーを成功した。", - "CoC7.AttackSuccess": "{name} は打撃を与えた。", + "CoC7.ManeuverSuccess": "{name} のマヌーバーは成功した。", + "CoC7.AttackSuccess": "{name} はダメージを与えた。", "CoC7.InflictPain": "ダメージを適用する", "CoC7.AdvantageAttacker": "有利: 攻撃側", "CoC7.AdvantageDefender": "有利: 防御側", @@ -220,7 +260,7 @@ "CoC7.rangeCombatCard.SingleShot": "単発", "CoC7.rangeCombatCard.MultipleShots": "複数回射撃", - "CoC7.AutomaticFire": "Automatic Fire", + "CoC7.AutomaticFire": "自動火器の射撃", "CoC7.rangeCombatCard.Burst": "バースト射撃", "CoC7.rangeCombatCard.FullAuto": "フルオート射撃", "CoC7.rangeCombatCard.BaseRange": "基本射程", @@ -229,26 +269,33 @@ "CoC7.rangeCombatCard.OutOfRange": "射程範囲外", "CoC7.rangeCombatCard.Cover": "掩蔽内の対象", "CoC7.rangeCombatCard.PointBlankRange": "ゼロ距離", - "CoC7.rangeCombatCard.NormalTarget": "Normal Target", + "CoC7.rangeCombatCard.NormalTarget": "通常サイズの対象", "CoC7.rangeCombatCard.BigTarget": "大きな対象", "CoC7.combatCard.SmallTarget": "小さな対象", "CoC7.rangeCombatCard.FastMovingTarget": "疾走する対象", "CoC7.rangeCombatCard.InMelee": "近接戦中", "CoC7.rangeCombatCard.aiming": "狙いを定めている", - "CoC7.rangeCombatDamage": "{name} は {total} ポイントのダメージを受けた", - "CoC7.rangeCombatDamageArmor": "{name} は {total} ポイントのダメージを受けた。(内 {armor} ポイント軽減)", + "CoC7.rangeCombatDamage": "{name} は {total} ポイントのダメージを与えた", + "CoC7.rangeCombatDamageArmor": "{name} は {total} ポイントのダメージを与えた。(内 {armor} ポイント軽減)", "CoC7.RollDamage": "ダメージをロールする", "CoC7.BulletsFired": "発砲済み", "CoC7.Shots": "ラウンドの発砲回数", "CoC7.Shoot": "射撃", - "CoC7.rangeCombatCard.AimingTitle": "Add 1 bonus die for the first shot", - "CoC7.rangeCombatCard.CoverTitle": "1 penalty die. The target is under cover or successfully dived for cover", - "CoC7.rangeCombatCard.PointBlankRangeTitle": "1 bonus die. Target at point blank range", - "CoC7.rangeCombatCard.BigTargetTitle": "1 bonus die for big target (Build > 4)", - "CoC7.rangeCombatCard.SmallTargetTitle": "1 penalty die for a small target", - "CoC7.rangeCombatCard.NormalTargetTitle": "Target has a normal size, no bonus/penalty", - "CoC7.rangeCombatCard.InMeleeTitle": "1 penalty die. Target is engaged in melee combat", - "CoC7.rangeCombatCard.FastMovingTargetTitle": "1 penalty die. Target is fast (MOV 8+) and moving at full speed", + "CoC7.ShotBullets": "{actor} に {bullets}弾を撃った。", + "CoC7.ShotVoley": "{actor} に {bullets}弾を斉射した。", + "CoC7.rangeCombatCard.AimingTitle": "ボーナス・ダイス1個。狙いを定めた最初の射撃", + "CoC7.rangeCombatCard.CoverTitle": "ペナルティー・ダイス1個。目標が掩蔽にいるか、掩蔽への飛び込みに成功した。", + "CoC7.rangeCombatCard.PointBlankRangeTitle": "ボーナス・ダイス1個。ゼロ射程の対象", + "CoC7.rangeCombatCard.BigTargetTitle": "ボーナス・ダイス1個。大きな対象 (ビルド > 4)", + "CoC7.rangeCombatCard.SmallTargetTitle": "ペナルティー・ダイス1個。小さな対象", + "CoC7.rangeCombatCard.NormalTargetTitle": "対象は通常サイズ。ボーナス/ペナルティなし", + "CoC7.rangeCombatCard.InMeleeTitle": "ペナルティー・ダイス1個。対象が近接戦を行なっている", + "CoC7.rangeCombatCard.FastMovingTargetTitle": "ペナルティー・ダイス1個。対象がフルスピード (MOV 8+) で移動中", + + "CoC7.meleeCombatDamageTakes": "与えた", + "CoC7.meleeCombatDamageFrom": "〜", + "CoC7.meleeCombatDamageDeals": "与える", + "CoC7.meleeCombatDamageWith": "&", "CoC7.DropZone": "ドロップ箇所", @@ -295,7 +342,8 @@ "CoC7.Era1920": "1920年代", "CoC7.EraPulp": "パルプ・クトゥルフ", "CoC7.EraMdrn": "現代", - "CoC7.Eras": "クトゥルフ・フレーバー", + "CoC7.Eras": "対応サプリメント", + "CoC7.EraAvailability": "出典", "CoC7.SkillNoAdjustments": "修正不可", "CoC7.SkillNoXpGain": "成長しない技能", @@ -313,7 +361,7 @@ "CoC7.WeaponRare": "まれ", "CoC7.WeaponAhdb": "+1/2 DB", "CoC7.WeaponAddb": "+DB", - "CoC7.WeaponSlnt": "消音性能", + "CoC7.WeaponSlnt": "消音", "CoC7.WeaponXplv": "範囲攻撃", "CoC7.WeaponBrst": "バースト", "CoC7.WeaponAuto": "フルオート", @@ -331,7 +379,9 @@ "CoC7.ErrorActor": "アクターが見つからない", "CoC7.ErrorInvalidFormula": "{value} は有効な数式ではない", "CoC7.ErrorInvalid": "無効", - "CoC7.Validate": "検証する", + "CoC7.ErrorInvalidCardType": "カードタイプ", + "CoC7.ErrorInvalidRollType": "ロールタイプ", + "CoC7.Validate": "有効にする", "CoC7.Apply": "適用する", "CoC7.NewBioSectionName": "新規セクション", @@ -339,35 +389,56 @@ "CoC7.DodgeSkillName": "回避", "CoC7.CthulhuMythosName": "クトゥルフ神話", "CoC7.CreditRatingSkillName": "信用", + "CoC7.DriveAutoSkillName": "運転(自動車)", "CoC7.FightingSpecializationName": "近接格闘", "CoC7.FirearmSpecializationName": "射撃", + "CoC7.DriveSpecializationName": "運転", + "CoC7.PilotSpecializationName": "操縦", "CoC7.AnySpecName": "任意", "CoC7.BoutOfMadnessName": "狂気の発作", "CoC7.InsanityName": "狂気", - "CoC7.NewSkillName": "新技能", - "CoC7.AddSkill": "技能を追加する", + "CoC7.NewSkillName": "新しい技能", + "CoC7.AddSkill": "技能追加", "CoC7.DevelopemmentPhase": "探索者成長フェイズの自動技能成長", + "CoC7.RecoverLuckPoints": "幸運の回復", "CoC7.SkillCantGainXp": "経験で成長しない技能", "CoC7.SkillUnflagForDevelopement": "経験チェックを外す", "CoC7.SkillFlagForDevelopement": "経験チェックを付ける", - "CoC7.RollAll4Dev": "成長チェックのついた全ての技能をロール", - "CoC7.DevRollTitle": "{item} 技能の成長チェック: {die}/{score}%", + "CoC7.RollAll4Dev": "経験チェックのついた全ての技能をロール", + "CoC7.RollLuck4Dev": "幸運の上達チェック", + "CoC7.DevRollTitle": "{item} 技能の上達チェック: {die}/{score}%", "CoC7.DevSuccessDetails": "{item} は{augment}% 成長した", + "CoC7.SanGained": "2d6獲得 ({results} = {sanGained}) {skillValue}% により {skill} を習得した後の正気度。 ", "CoC7.DevFailureDetails": "{item} は成長しなかった", + "CoC7.ReduceSanityLimits": "最大正気度 1減少", "CoC7.DevSuccess": "{item} は{augment}% 成長した ({die}/{score}%)", "CoC7.DevFailure": "{item} は成長しなかった ({die}/{score}%)", + "CoC7.LuckIncreased": "幸運が {augment} ポイント回復した。({die}/{score})", + "CoC7.LuckNotIncreased": "幸運は回復しなかった。 ({die}/{score})", + "CoC7.DevelopAttribWarn": "成長/作成時において、一部の入力欄には記入できない。", "CoC7.SkillDetail": "技能の詳細", "CoC7.EditSkill": "編集", "CoC7.DeleteSkill": "削除", "CoC7.RangeSkills": "遠隔技能", "CoC7.MeleeSkills": "近接技能", - "CoC7.NewItemName": "新アイテム", - "CoC7.AddItem": "アイテムを追加する", + "CoC7.NewItemName": "新しいアイテム", + "CoC7.AddItem": "アイテム追加", "CoC7.EditItem": "編集", "CoC7.DeleteItem": "削除", - "CoC7.AddWeapon": "武器を追加する", - "CoC7.NewWeaponName": "新武器", + "CoC7.TradeItem": "アイテムの交換/保存", + "CoC7.SortBySkillName": "技能名で並び替え", + "CoC7.SortBySkillValue": "技能%で並び替え", + "CoC7.UncommonSkillsShow": "まれな技能を表示", + "CoC7.UncommonSkillsHide": "まれな技能を非表示", + + "CoC7.NewBookName": "新しい本", + "CoC7.AddBook": "本追加", + "CoC7.NewSpellName": "新しい呪文", + "CoC7.AddSpell": "呪文追加", + + "CoC7.AddWeapon": "武器追加", + "CoC7.NewWeaponName": "新しい武器", "CoC7.EditWeapon": "編集", "CoC7.DeleteWeapon": "削除", "CoC7.MeleeWeapons": "近接武器", @@ -376,6 +447,7 @@ "CoC7.WeaponSkill": "技能", "CoC7.WeaponSkillAlt": "別技能", "CoC7.Inventory": "インベントリ", + "CoC7.InventoryIsCurrentlyEmpty": "何も持っていない。", "CoC7.CharacterDevelopment": "成長", "CoC7.OccupationSkill": "職業技能", "CoC7.ArchetypeSkill": "アーキタイプ技能", @@ -417,6 +489,24 @@ "CoC7.BackgroundDeleteSection": "削除", "CoC7.BackgroundSectionMoveUp": "上へ移動", "CoC7.BackgroundSectionMoveDown": "下へ移動", + "CoC7.BackgroundEncounters": "奇妙な存在からの喪失", + "CoC7.BackgroundFlags": "フラグ", + "CoC7.BackgroundFlagsMythosExperienced": "狂気によりクトゥルフ神話+5%獲得", + "CoC7.BackgroundFlagsMythosHardened": "クトゥルフ神話不感症", + + "CoC7.SanityLossEncounters": "遭遇による正気度喪失", + "CoC7.SanityLossImmunities": "正気度喪失の耐性", + "CoC7.AddSanityLossEncounter": "遭遇による正気度喪失を追加", + "CoC7.AddSanityLossImmunity": "正気度喪失の耐性を追加", + "CoC7.DeleteSanityLossEncounter": "遭遇による正気度喪失を削除", + "CoC7.DeleteSanityLossImmunity": "正気度喪失の耐性を削除", + + "CoC7.SanityLossTypeDialogTitle": "新規正気度喪失/耐性", + "CoC7.SanityLossTypeDialogBody": "キャラクターに、新たなクトゥルフ神話的遭遇時の正気度喪失/正気度喪失の耐性を追加する。", + "CoC7.SanityLossTypeReason": "原因", + "CoC7.SanityLossTypeValue": "正気度の喪失", + "CoC7.SanityLossEncounter": "遭遇による正気度喪失", + "CoC7.SanityLossImmunity": "正気度喪失の耐性", "CoC7.creatureFightingSkill": "近接戦闘", @@ -452,9 +542,9 @@ "CoC7.Mania": "マニア", "CoC7.MaxSanloss": "最大喪失", "CoC7.MinSanloss": "最小喪失", - "CoC7.AlreadyLost": "このクリーチャーによる今までの喪失合計", - "CoC7.CreatureMaxLoss": "このクリーチャーによる合計最大喪失", - "CoC7.MaxLossToCreature": "今回このクリーチャーによる最大喪失", + "CoC7.AlreadyLost": "このクリーチャーによる累積喪失合計", + "CoC7.CreatureMaxLoss": "このクリーチャーによる最大喪失上限", + "CoC7.MaxLossToCreature": "今回このクリーチャーによる残喪失", "CoC7.ResetCreatureSan": "このクリーチャーの正気度喪失履歴をリセット", "CoC7.ResetSpecieSan": "この種の正気度喪失履歴をリセット", "CoC7.KeepData": "これまでの遭遇データを保持する", @@ -466,15 +556,8 @@ "CoC7.DisregardMythosGain": "クトゥルフ神話技能の増加は無い", "CoC7.MythosGain": "クトゥルフ神話技能を獲得", "CoC7.YouGainedCthulhuMythos": "君の精神は超常現象を目撃したことで怖じ気づいた (クトゥルフ神話技能に +{value}%) 。", - "CoC7.CardResolved": "カードの処理が解決", + "CoC7.CardResolved": "処理済", - "CoC7.CMI": "CMI", - "CoC7.CthulhuMythosInitial": "初期クトゥルフ神話", - "CoC7.CMF": "CMF", - "CoC7.CthulhuMythosFinal": "完全クトゥルフ神話", - "CoC7.Occult": "オカルト", - "CoC7.MythosRating": "神話レーティング", - "CoC7.StudyTime": "研究期間", "CoC7.SpellCastingTime": "必要時間", "CoC7.SpellCastingCost": "コスト", "CoC7.CallSpell": "招来", @@ -486,10 +569,38 @@ "CoC7.GateSpell": "門", "CoC7.CombatSpell": "戦闘", "CoC7.SpellType": "呪文の種類", + "CoC7.SpellSuccessfullyLearned": "呪文 '{spell}' の習得に成功しました!", + "CoC7.SpellAlreadyLearned": "呪文 ('{spell}') は、すでに習得済みです。", + + "CoC7.BookHasNothingMoreToTeach": "{book} から、これ以上学ぶことはできない。{actor}のクトゥルフ神話技能は、{book}の神話レーティングよりも高い。", "CoC7.BookType": "本の種類", - "CoC7.MythosBook": "クトゥルフ神話の魔導書", - "CoC7.OccultBook": "オカルトの本", - "CoC7.Unidentified": "独自の書き込み", + "CoC7.Content": "内容", + "CoC7.CthulhuMythosFinal": "完全クトゥルフ神話", + "CoC7.CthulhuMythosInitial": "初期クトゥルフ神話", + "CoC7.Development": "経験", + "CoC7.DifficultyLevel": "難易度", + "CoC7.DragSpell": "呪文をここにドラッグして、本に含める...", + "CoC7.FullStudies": "完全な研究", + "CoC7.Gains": "獲得", + "CoC7.GainsForReading": "{book} を読んだときの技能増加。", + "CoC7.InitialReading": "最初の読書", + "CoC7.InitialReadingNeeded": "{actor} は {book} の最初の読書を行なうことで、完全な研究に進むことができる。", + "CoC7.LearnSpellAttempt": "{book} から {spell} 呪文を学ぼうとした。", + "CoC7.MarkedForDevelopment": "経験チェック", + "CoC7.Mythos": "クトゥルフ神話", + "CoC7.MythosRating": "神話レーティング", + "CoC7.NotOwned": "このアクションを実行するには、このアイテムをアクターが所有している必要がある。", + "CoC7.Occult": "オカルト", + "CoC7.Points": "点", + "CoC7.Progress": "進捗", + "CoC7.RedoFullStudy": "完全な研究のやり直し", + "CoC7.ReadAttempt": "{book} ({language}) を読もうとする、難易度({difficulty})。", + "CoC7.ReadingMythosTome": "{book} を読んだ。", + "CoC7.Specific": "特定", + "CoC7.SpellsLearned": "学んだ呪文", + "CoC7.StudyTime": "研究期間", + "CoC7.UnknownLanguage": "{actor} は、この本に書かれている言語を知らない。", + "CoC7.Unreadable": "読むことができない", "CoC7.Crew": "乗員", "CoC7.Origin": "起源", @@ -508,7 +619,7 @@ "CoC7.Items": "アイテム", "CoC7.Vehicle": "乗物", "CoC7.Books": "魔導書", - "CoC7.Status": "ステータス", + "CoC7.Status": "状態", "CoC7.Classic": "クラシック", "CoC7.Lovecraftian": "ラヴクラフト", @@ -530,10 +641,11 @@ "CoC7.Chosen": "選択した数", "CoC7.EmptySkillList": "ここに技能をドロップして追加する", "CoC7.EmptyItemList": "ここにアイテムをドロップして追加する", - "CoC7.PersonalSpeciality": "個人的あるいはその時代の特色的な技能の数", + "CoC7.EmptyCharacterSkillList": "ここに初期設定、職業、技能などをドラッグ&ドロップして追加する。", + "CoC7.PersonalSpeciality": "個人的、あるいはその時代での特徴的な技能", "CoC7.AdditionalSkills": "追加の技能", "CoC7.SkillSelectionWindow": "オプションの技能を選択", - "CoC7.SelectPersonalSkills": "個人的あるいはその時代の特色的な技能として、{number} 個の技能を選択", + "CoC7.SelectPersonalSkills": "個人的、あるいはその時代での特徴的な技能として、{number} 個の技能を選択", "CoC7.ResetOccupation": "職業をリセット", "CoC7.ResetOccupationHint": "アクター {name} には既に職業がある。リセットするか?", "CoC7.ResetArchetype": "アーキタイプをリセット", @@ -547,7 +659,7 @@ "CoC7.SkillSpecSelectTitle": "{specialization} の専門分野の技能を選ぶ、または選択する", "CoC7.SkillSelectBase": "{name} 技能の基本成功率を決定する", "CoC7.SelectSkill": "既存の技能を選択する", - "CoC7.CreateNewSkill": "新規の技能を作成する", + "CoC7.CreateNewSkill": "新しい技能を作成", "CoC7.Characteristics": "能力値", "CoC7.Characteristic": "能力値", @@ -564,15 +676,15 @@ "CoC7.GmTools": "キーパーツール", "CoC7.GmNotes": "キーパーメモ", - "CoC7.DevPhase": "デベロップメントフェーズ", - "CoC7.DevPhaseEnabled": "成長フェイズ処理が可能になった", - "CoC7.DevPhaseDisabled": "成長フェイズ処理が不可能になった", + "CoC7.DevPhase": "成長フェイズ", + "CoC7.DevPhaseEnabled": "成長フェイズ処理 可能", + "CoC7.DevPhaseDisabled": "成長フェイズ処理 不可能", "CoC7.CharCreationMode": "探索者作成モード", - "CoC7.CharCreationEnabled": "キャラクター作成モードが有効になった", - "CoC7.CharCreationDisabled": "キャラクター作成モードが無効になった", - "CoC7.toggleXP": "獲得 XP", - "CoC7.XPGainEnabled": "探索者はXPを得ることができる", - "CoC7.XPGainDisabled": "探索者はXPを得ることができない", + "CoC7.CharCreationEnabled": "キャラクター作成モード 有効", + "CoC7.CharCreationDisabled": "キャラクター作成モード 無効", + "CoC7.toggleXP": "経験獲得の可否", + "CoC7.XPGainEnabled": "探索者は経験獲得 可能", + "CoC7.XPGainDisabled": "探索者は経験獲得 不可能", "CoC7.WarnNoActorAvailable": "コントロールまたは選択しているアクターがいない", "CoC7.WarnMacroIncorrectType": "武器と技能のみのマクロが作成可能だ", "CoC7.WarnNoGlobalSpec": "専門分野の指定がない技能のマクロは作成できない", @@ -580,14 +692,18 @@ "CoC7.WarnNoControlledActor": "コントロールしているアクターが存在しない", "CoC7.WarnFastTargetWithWrongMOV": "MOV 7以下の対象に「疾走する対象」の選択がされている (MOV: {mov})", "CoC7.WarnTooManyTarget": "対象の選択数が多すぎる。最後に選択した対象のみを有効にする", - - "CoC7.startRest": "Start Rest", - "CoC7.dreaming": "The Investigators wait dreaming", - "CoC7.healthRecovered": "Recovered one Hit Point", - "CoC7.pulpHealthRecovered": "Recovered {number} Hit Points", - "CoC7.dailySanLossRestarted": "Daily Sanity loss counter restarted", - "CoC7.hasCriticalWounds": "Unable to recover Hit Points due to Critical Wounds", - "CoC7.quickHealer": "Quick Healer", + "CoC7.WarnNoTargetsSanCheck": "対象が選択されていません。対象を選択するか、リンクを作成してください。", + + "CoC7.allActors": "全アクター", + "CoC7.restTargets": "休息の対象者", + "CoC7.startRest": "休息を取る", + "CoC7.dreaming": "探索者たちは、眠りに落ちて夢を見る", + "CoC7.healthRecovered": "HP 1点を回復", + "CoC7.pulpHealthRecovered": "HP {number}点を回復", + "CoC7.dailySanLossRestarted": "1日の正気度喪失カウンターをリセット", + "CoC7.magicPointsRecovered": "MPを回復", + "CoC7.hasCriticalWounds": "重傷のため、HPは回復できない", + "CoC7.quickHealer": "クイック・ヒーラー", "CoC7.ErrorNoDodgeSkill": "アクターは回避技能を持っていない", "CoC7.ErrorNotEnoughLuck": "{actor} には判定を成功させるために必要な幸運が無い", @@ -598,12 +714,24 @@ "CoC7.InfoLessSkillThanOptions": "現在の技能の選択数は {skillCount} で、任意の技能数は {optionsCount} だ。選択数が足りない。", "CoC7.InfoAllSkillsAlreadySelected": "すでに選択可能な技能数まで選択済みだ。", - "CoC7.MessageWaitForKeeperToClick": "キーパーの判定中
                                クリックされるまで待つこと!
                                ", - "CoC7.MessageCheckRequested": "君のキーパーは判定を要求している。", + "CoC7.MessageCheckRequestedWait": "キーパーが {check} 判定を指示。
                                クリックしよう!
                                ", + "CoC7.MessageTargetCheckRequested": "キーパーが {name} に {check} 判定を指示。", + "CoC7.MessageTitleSelectSingleUserForTarget": "この攻撃に対応できるユーザー", + "CoC7.MessageSelectSingleUserForTarget": "このトークンは複数のユーザーによって管理されている。どのユーザーがこの攻撃に対応するかを選択すること。", + "CoC7.MessageBoutOfMadnessTableNotFound": "狂気テーブルの結果が見つからない。すべてのロールテーブルが作成されているか確認すること", + "CoC7.MessageBoutOfMadnessItemNotFound": "狂気テーブルの結果が見つからない。すべてのステータスが作成されているか確認すること", + + "CoC7.DealDamage": "{target} に {damage}のダメージを与えるか?", + "CoC7.NoTargetSelected": "{weapon} 判定の対象となる目標が選択されていない。続行するか?", + + "CoC7.Import": "インポート", + "CoC7.Proceed": "続行", + "CoC7.Cancel": "キャンセル", "CoC7.ActorImporter": "アクター・インポーター", - "CoC7.ActorImporterSummary": "説明とステータスから、NPCまたはクリーチャーをインポートする。対応するテキストを貼り付けるだけだ", + "CoC7.ActorImporterSummary": "説明とステータスから、NPCまたはクリーチャーをインポートする。対応するテキストを貼り付けるだけだ", "CoC7.PasteTheDataBelow": "以下にテキストデータを貼り付ける", + "CoC7.TextFieldInvalidCharacters": "本文中に無効な文字が含まれており、修正されないものは削除されるため注意。", "CoC7.SelectActorType": "アクターの種類を選択", "CoC7.NonPlayingCharacter": "ノンプレイヤーキャラクター (NPC)", "CoC7.Creature": "クリーチャー", @@ -614,12 +742,103 @@ "CoC7.English": "英語", "CoC7.Spanish": "スペイン語", "CoC7.French": "フランス語", + "CoC7.German": "ドイツ語", + "CoC7.Polish": "ポーランド語", + "CoC7.TraditionalChinese": "繁体字中国語", "CoC7.SelectSourceLanguage": "言語を選択", - + "CoC7.ImportedUnnamedCharacter": "インポートされた無名のキャラクター", + "CoC7.CreatedImportedCharactersFolder": "'インポート・キャラクター'フォルダを作成", + "CoC7.ImportedCharactersFolder": "インポートされたキャラクター", + "CoC7.ImportSkillItemLocations": "技能/呪文/武器を探しています…", + "CoC7.ImportActorItemsNone": "なし", + "CoC7.ImportActorItemsItem": "アイテム", + "CoC7.ImportActorItemsItemWorldModuleSystem": "アイテム / ワールド / MOD / システム", + "CoC7.ImportActorItemsWorldModuleItemSystem": "ワールド / MOD / アイテム / システム", + + "CoC7.HowToTranslateTitle": "どうやって翻訳するの?", + "CoC7.HowToTranslateWarning": "信頼できないモジュールはインストールしないように。", + "CoC7.HowToTranslateInstallBabele": "Foundryのモジュール・マネージャーからBabeleモジュールをインストール/アップデートすること。", + "CoC7.HowToTranslateInstallTranslation": "Foundryのモジュール・マネージャーからTranslationをインストール/アップデートすること。", + "CoC7.HowToTranslateEnableTranslation": "ゲームワールド内のコンフィグ設定/モジュールの管理で、BabeleとTranslationの両方を有効にすること。", + "CoC7.HowToTranslateNoTranslation": "新しい言語の翻訳を作成する手順は、既存の翻訳モジュールにある。", + + "CoC7.Migrate.Title": "要更新", + "CoC7.Migrate.Message": "

                                このワールドでは、バージョン {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": "
                                1. 左クリック ロール判定 (選択)
                                2. Shift + 左クリック 即座にレギュラー難易度ロールを行なう
                                1. 右クリック 対抗ロール (選択)
                                2. Shift + 右クリック 即時の対抗ロール
                                1. Alt/Option + 右クリック 組み合わせロール (選択)
                                ", + "CoC7.ToolTipKeeperSkill": "
                                1. CTRL + 左クリック ロールリンク作成
                                2. {other}
                                ", + "CoC7.ToolTipKeeperStandbySkill": "
                              3. 左クリック Request a roll from {name} にロールを要望
                              4. ", + "CoC7.ToolTipDB": "
                                1. 左クリック 即座にレギュラー難易度ロールを行なう
                                ", + "CoC7.ToolTipSanity": "
                                1. 左クリック オプションでロール判定
                                2. Alt/Option + 左クリック オプションで正気度喪失をロール
                                3. Shift + 左クリック 即座にレギュラー難易度ロールを行なう
                                4. Shift + Alt/Option + 左クリック ダイスプールのオプションがない場合の正気度喪失ロール
                                1. 右クリック オプションで対抗ロール
                                2. Shift + 右クリック 即時、対抗ロール
                                1. Alt/Option + 右クリック オプションで組み合わせロール
                                2. Shift + Alt/Option + 右クリック 即時、組み合わせロール
                                ", + "CoC7.ToolTipCombat": "
                                1. 左クリック オプションでロール判定
                                2. Shift + 左クリック 即座にレギュラー難易度ロールを行なう
                                1. 右クリック オプションで対抗戦闘マヌーバ
                                2. Shift + 右クリック 即時、対抗戦闘マヌーバ
                                ", + "CoC7.ToolTipKeeperSanity": "
                              5. CTRL + Alt/Option 正気度判定のロールリンク作成
                              6. ", + "CoC7.ToolTipAutoToggle": "
                                1. 左クリック 自動計算 / 手動入力
                                2. ", + "CoC7.ToolTipSkillFlagToggle": "
                                  1. ダブルクリック フラグ状態の切替
                                  2. ", + "CoC7.ToolTipSkillFlagged": "開発者フラグ 有効", + "CoC7.ToolTipSkillUnflagged": "開発者フラグ 無効", + + "SETTINGS.TitleRules": "ルール", + "SETTINGS.TitleInitiative": "イニシアチブ設定", + "SETTINGS.TitleRoll": "ロール設定", + "SETTINGS.TitleChatCards": "チャット・カード設定", + "SETTINGS.TitleScene": "シーン設定", + "SETTINGS.TitleSheet": "シート設定", + "SETTINGS.TitleGameArtwork": "ゲーム・アートワーク設定", + "SETTINGS.TitleWeapon": "武器設定", + "SETTINGS.TitleDiceSoNice": "Dice So Nice設定", + "SETTINGS.TitleDeveloperDebug": "成長&デバッグ設定", + "SETTINGS.TitleRollTable": "ロール表設定", + "SETTINGS.DebugMode": "システム・デバッグ・モード", + "SETTINGS.DebugModeHint": "!!要再起動!!", "SETTINGS.DefaultDifficulty": "デフォルトの難易度", "SETTINGS.DefaultDifficultyHint": "判定におけるデフォルトの難易度が選択できる。不明を選ぶと、プレイヤーは難易度を知らずに判定をロールすることになる。", "SETTINGS.CheckDifficultyRegular": "レギュラーの難易度", "SETTINGS.CheckDifficultyUnknown": "不明の難易度", + "SETTINGS.showIconsOnly": "サマリー・シートでは、技能リストのアイコンのみを表示する。", "SETTINGS.UseToken": "トークンのイメージを使用する", "SETTINGS.UseTokenHint": "チャットカードの絵にトークンのイメージを使用する", "SETTINGS.DisplayActorOnCard": "アクター(またはトークン)を表示", @@ -634,6 +853,9 @@ "SETTINGS.displayInitAsTextHint": "イニシアチブを数字ではなくテキストで表示する (選択ルール使用時のみ)", "SETTINGS.PulpRules": "パルプ・クトゥルフのHPを使用", "SETTINGS.PulpRulesHint": "パルプ・クトゥルフのルールの使用を許可する (アーキタイプ、タレント、HP) !実験的実装!", + "SETTINGS.developmentRollForLuck": "幸運の回復", + "SETTINGS.developmentRollForLuckHint": "各プレイヤーは、成長フェイズに幸運の上達チェックを行なうことができる。", + "SETTINGS.displayPlayerNameOnSheet": "シートにプレイヤー名を表示", "SETTINGS.DisregardAmmo": "残弾数を無視", "SETTINGS.DisregardAmmoHint": "有効にすると、銃に装填されている弾丸の数を無視する", "SETTINGS.DisregardUsePerRound": "ラウンド毎の使用可能回数を無視", @@ -652,12 +874,23 @@ "SETTINGS.TenDieBonusHint": "Dice so Nice使用時に、ボーナスの10の位ダイスで使用する色を別にする (デフォルトはプレイヤーのデフォルトを使用)", "SETTINGS.TenDiePenalty": "[DsN] 10面 ペナルティ・ダイス カラーセット", "SETTINGS.TenDiePenaltyHint": "Dice so Nice使用時に、ペナルティの10の位ダイスで使用する色を別にする (デフォルトはプレイヤーのデフォルトを使用)", + "SETTINGS.OverrideGameArtwork": "ゲーム・アートワークの上書き", + "SETTINGS.OverrideGameArtworkHint": "!!手動でワールドの再読み込みが必要!! これによりシートの詳細設定が変更される。(デフォルトは空欄)", + "SETTINGS.ArtPauseImage": "一時停止画像", + "SETTINGS.ArtPauseImageHint": ". 画像を削除する場合は 'null' を指定。", + "SETTINGS.ArtPauseText": "一時停止テキスト", + "SETTINGS.ArtPauseTextHint": "空白にするとデフォルトになる。", "SETTINGS.OverrideSheetArtwork": "キャラクターシートの見た目の変更", - "SETTINGS.OverrideSheetArtworkHint": "!!手動でワールドの再読み込みが必要!! キャラクターシートの事前設定にアクセスできるようになる (デフォルトは空欄)", + "SETTINGS.OverrideSheetArtworkHint": "!!手動でワールドの再読み込みが必要!! これによりシートの詳細設定が変更される。(デフォルトは空欄)", "SETTINGS.ArtWorkSheetBackground": "キャラクターシートの背景", "SETTINGS.ArtWorkSheetBackgroundHint": "手帳の背景を削除するためには「null」を入力する", + "SETTINGS.ArtWorkSheetBackgroundType": "背景タイプ", + "SETTINGS.BackgroundSlice": "背景画像は切り取られる (css:border-image)", + "SETTINGS.BackgroundAuto": "画像の縮尺を維持したまま中央表示 (css:auto)", + "SETTINGS.BackgroundContain": "画像の縮尺を維持したまま、最大まで拡縮 (css:contain)", + "SETTINGS.BackgroundCover": "引き延ばして、最大まで拡縮 (css:cover)", "SETTINGS.ArtWorkOtherSheetBackground": "他のシートの背景", - "SETTINGS.ArtWorkOtherSheetBackgroundHint": "背景を削除するには、'null'と入力する。現在のところアイテムや車両のみ", + "SETTINGS.ArtWorkOtherSheetBackgroundHint": "背景を削除するには、'null'と入力する。現在のところアイテムや車両のみ", "SETTINGS.ArtworkSheetImage": "キャラクターシートの画像", "SETTINGS.ArtworkSheetImageHint": "触手の画像を削除するためには「null」を入力する", "SETTINGS.ArtworkFrontColor": "メインカラー", @@ -680,17 +913,30 @@ "SETTINGS.AlwaysEditable": "常時可能", "SETTINGS.CreationModeOnly": "作成モードのみ可能", "SETTINGS.NeverEditable": "禁止 (GMのみ)", + "SETTINGS.StanbyGMRolls": "キーパー・ロールボタン", + "SETTINGS.StanbyGMRollsHint": "キーパーがキャラクターシートからロールする場合、ロールの代わりにロールボタンを表示する。", "SETTINGS.AllowFlatDiceModifier": "ダイス修正値", "SETTINGS.AllowFlatDiceModifierHint": "ダイスロールの出目を対して修正値を適用できるようにする。", "SETTINGS.AllowFlatThresholdModifier": "技能修正値", "SETTINGS.AllowFlatThresholdModifierHint": "判定成功値に対して修正値を適用できるようにする。", "SETTINGS.OpposedRollTieBreaker": "対抗ロール時の同点処理", - "SETTINGS.OpposedRollTieBreakerHint": "対抗ロール中、同点の場合、勝者はより高い技能ではなく、最も高いロール値によって決定される。", + "SETTINGS.OpposedRollTieBreakerHint": "対抗ロール中、同点の場合、勝者はより高い技能ではなく、最も高いロール値によって決定される。", "SETTINGS.SelfRollWhisperTarget": "セルフロール通知:", - "SETTINGS.SelfRollWhisperTargetHint": "GMがセルフ判定ロールを行うとき、誰に通知を送信するか?", + "SETTINGS.SelfRollWhisperTargetHint": "GMがセルフ判定ロールを行うとき、誰に通知を送信するか?", "SETTINGS.DoNotAdvise": "自身のために保管", "SETTINGS.AdviseOwnersOnly": "アクターの所有者に通知", "SETTINGS.AdviseAllPlayer": "全プレイヤーに通知", "SETTINGS.OneBlockBackStory": "1ブロックのバックストーリー", - "SETTINGS.OneBlockBackStoryHint": "バックストーリーを1つの大きなエディタブロックとして使う。リンクを追加することもできる。" + "SETTINGS.OneBlockBackStoryHint": "バックストーリーを1つの大きなエディタブロックとして使う。リンクを追加することもできる。", + "SETTINGS.EnableStatusIcons": "状態アイコンを有効化", + "SETTINGS.EnableStatusIconsHint": "戦闘/狂気の効果アイコンをトークンに表示する。", + "SETTINGS.ShowExperimentalFeatures": "実験的機能の表示", + "SETTINGS.ShowExperimentalFeaturesHint": "これらの機能を使用すると、将来的なリリースによってあなたのワールドが使えなくなる可能性がある。テスト用のため、普段遊ぶワールドでは使用しないように。", + "CoC7.ExperimentalFeaturesWarning": "この機能は開発中のものであり、あなたのワールドでの使用は推奨されません。", + "SETTINGS.CheckElevation": "距離に高さを含める", + "SETTINGS.CheckElevationHint": "射撃戦闘の距離計算に高さも含める", + "CoC7.toolTipDelay": "ツールチップが表示されるまでの時間 (ミリ秒)。0は非表示。", + + "CoC7.getTheExample": "例をコピー", + "CoC7.Copied": "例をクリップボードにコピー" } diff --git a/lang/ko.json b/lang/ko.json new file mode 100644 index 00000000..33530fa9 --- /dev/null +++ b/lang/ko.json @@ -0,0 +1,944 @@ +{ + "CoC7.title": "크툴루의 부름 7th Edition (비공식)", + + "CoC7.Entities.Character": "캐릭터", + "CoC7.Entities.Container": "보관함", + "CoC7.Entities.Creature": "크리쳐", + "CoC7.Entities.Npc": "NPC", + "CoC7.Entities.Vehicle": "탈것", + + "CoC7.Entities.Archetype": "캐릭터 타입", + "CoC7.Entities.Book": "서적", + "CoC7.Entities.Chase": "추격", + "CoC7.Entities.Item": "아이템", + "CoC7.Entities.Occupation": "직업", + "CoC7.Entities.Setup": "초기설정", + "CoC7.Entities.Skill": "기능", + "CoC7.Entities.Spell": "주문", + "CoC7.Entities.Status": "상황", + "CoC7.Entities.Talent": "재능", + "CoC7.Entities.Weapon": "무기", + + "CHARAC.STR": "근력", + "CHARAC.Strengh": "근력", + "CHARAC.Strength": "근력", + "CHARAC.CON": "건강", + "CHARAC.Constitution": "건강", + "CHARAC.SIZ": "크기", + "CHARAC.Size": "크기", + "CHARAC.DEX": "민첩성", + "CHARAC.Dexterity": "민첩성", + "CHARAC.APP": "외모", + "CHARAC.Appearance": "외모", + "CHARAC.INT": "지능", + "CHARAC.Intelligence": "지능", + "CHARAC.POW": "정신력", + "CHARAC.Power": "정신력", + "CHARAC.EDU": "교육", + "CHARAC.Education": "교육", + "CoC7.PlayerName": "플레이어", + "CoC7.Name": "이름", + "CoC7.Archetype": "캐릭터 타입", + "CoC7.Occupation": "직업", + "CoC7.Age": "나이", + "CoC7.Sex": "성별", + "CoC7.Residence": "거주지", + "CoC7.Birthplace": "출생지", + "CoC7.Organization": "소속", + "CoC7.HitPoints": "체력", + "CoC7.HP": "HP", + "CoC7.MagicPoints": "마력", + "CoC7.MP": "MP", + "CoC7.SanityPoints": "이성", + "CoC7.Sanity": "이성", + "CoC7.SAN": "이성", + "CoC7.DailySanLoss": "일일 이성 손실", + "CoC7.DailyLoss": "일일 손실", + "CoC7.Luck": "운", + "CoC7.Movement": "이동력", + "CoC7.Mov": "이동력", + "CoC7.BonusDamage": "피해 보너스", + "CoC7.DB": "피해", + "CoC7.Build": "체격", + "CoC7.Skills": "기능", + "CoC7.Skill": "기능", + "CoC7.Combat": "전투", + "CoC7.Possessions": "소지품", + "CoC7.Background": "백스토리", + "CoC7.Notes": "메모", + "CoC7.DailySanIconOver": "초기화", + "CoC7.Prone": "쓰러짐", + "CoC7.Unconsious": "의식불명", + "CoC7.CriticalWounds": "중상", + "CoC7.Dying": "빈사", + "CoC7.DyingCheck": "건강에 의한 사망판정", + "CoC7.Dead": "사망", + "CoC7.Resist": "저항", + "CoC7.UnderlyingInsanity": "잠재적 광기", + "CoC7.TemporaryInsanity": "일시적 광기", + "CoC7.IndefiniteInsanity": "장기적 광기", + "CoC7.NotInsane": "정상", + "CoC7.UnlockActor": "액터 해금", + "CoC7.LockActor": "액터 잠금", + "CoC7.NpcRollCharacteristics": "특성치 굴림", + "CoC7.NpcAvarageCharacteristics": "특성치 평준화", + "CoC7.NpcCharacteristicsFormula": "수식", + "CoC7.NpcCharacteristicsValues": "값", + "CoC7.language": "언어", + "CoC7.Author": "저자", + "CoC7.Date": "날짜", + "CoC7.Spells": "주문", + "CoC7.Spell": "주문", + "CoC7.Spells&Notes": "주문과 서적", + "CoC7.Weapons": "장비", + "CoC7.Effects": "효과", + "CoC7.Cost": "비용", + "CoC7.Source": "출처", + "CoC7.SpellDetails": "주문 상세", + "CoC7.Details": "상세", + "CoC7.Other": "기타", + "CoC7.rounds": "라운드", + "CoC7.hours": "시간", + "CoC7.days": "일", + "CoC7.weeks": "주", + "CoC7.months": "개월", + "CoC7.remove": "제거", + "CoC7.Any": "또는", + "CoC7.All": "모두", + "CoC7.Success": "성공", + "CoC7.CustomLabel": "커스텀 라벨", + "CoC7.SpecificLocations": "특정 장소", + "CoC7.ArmourPlating": "무장 방어복", + "CoC7.Location": "위치", + "CoC7.Properties": "기능", + "CoC7.Attributes": "속성", + "CoC7.Attribute": "속성", + "CoC7.Collapse": "축소", + "CoC7.Expand": "확장", + "CoC7.Blind": "실명", + "CoC7.Label": "라벨", + "CoC7.Icon": "아이콘", + "CoC7.Check": "판정", + "CoC7.ItemWeapon": "아이템 (무기)", + "CoC7.AttacksPerRound": "라운드당 공격횟수", + + "CoC7.Cast": "조건", + "CoC7.SanityCost": "이성 조건", + "CoC7.PowerCost": "정신력 조건", + "CoC7.HitPointsCost": "체력 조건", + "CoC7.MagicPointsCost": "마력 조건", + "CoC7.OtherCosts": "기타 조건", + "CoC7.CastingSpell": "{spell} 주문 시전.", + "CoC7.NotEnoughMagicPoints": "{spell}의 소모마력은 {originalMagicPoints} 이지만, 현재 당신의 마력은 {actorMagicPoints} 가지고있습니다. 부족한마력대신 {convertedHitPoints} 만큼의 체력을 변환해서 사용하시겠습니까? 계속진행한다면 {convertedHitPoints} 만큼의 피해 대미지를 입습니다.", + + "CoC7.CopyToClipboard": "클립보드에 복사", + "CoC7.WhisperToSelection": "선택한 토큰에 귓속말", + "CoC7.WhisperTo": "귓속말: ", + "CoC7.SendToChat": "채팅송신", + + "CoC7.RegularSuccess": "보통 성공", + "CoC7.HardSuccess": "어려운 성공", + "CoC7.ExtremeSuccess": "극단적 성공", + "CoC7.CriticalSuccess": "대성공", + "CoC7.Fumble": "대실패", + "CoC7.Failure": "실패", + "CoC7.Malfunction": "{itemName} 이(가) 고장났습니다", + + "CoC7.Dice": "주사위", + "CoC7.DiceModifierBonus": "주사위", + "CoC7.DiceModifierPenalty": "패널티", + "CoC7.Modifiers": "수정", + "CoC7.BonusDice": "보너스 주사위", + "CoC7.UnitsDie": "1 단위 주사위", + "CoC7.TensDie": "10면주사위", + "CoC7.TensDice": "10면주사위", + "CoC7.SuccessRequired": "{successRequired} 성공이 필요합니다.", + "CoC7.Roll": "판정", + "CoC7.Pushing": "강행", + "CoC7.PushingSkill": ": 기능 강행판정!", + "CoC7.PushSkill": "강행", + "CoC7.PushedRoll": "(강행판정)", + "CoC7.SpendLuck": "성공하기 위해 {luckNeededValue} 의 행운 소모", + "CoC7.LuckSpent": "{luckAmount} 성공하기 위해 행운 소모", + "CoC7.LuckSpentAlt": "행운 소모", + "CoC7.LuckError": "{actorName} 은(는) 판정에 필요한 행운이 모자랍니다", + "CoC7.check.AutoSuccess": "자동. 성공", + "CoC7.check.AutoFailure": "자동. 실패", + "CoC7.RevealCheck": "판정 공개", + "CoC7.RevealSanLoss": "이성 손실 공개", + "CoC7.check.ForcePass": "강제 통과", + "CoC7.check.ForceFail": "강제 실패", + "CoC7.check.FlagForDevelopment": "경험치 보상", + "CoC7.IncreaseSuccessLevel": "성공율 증가", + "CoC7.check.DecreaseSuccessLevel": "성공율 감소", + "CoC7.RollSecretDice": "수호자가 몇개의 주사위를 굴렸습니다", + "CoC7.KeeperSentDecoy": "플레이어가 눈속임판정을 받았습니다", + "CoC7.FakeRoll": "플레이어에게 눈속임판정을 보냅니다", + "CoC7.ErrorMissingKeeperUser": "이 작업을 수행하려면 수호자가 연결되어 있어야 합니다.", + + "CoC7.ConstitutionCheck": "건강 판정", + + "CoC7.SanDataSelectionWindow": "이성치 손실 선택", + "CoC7.BonusSelectionWindow": "보너스 선택창", + "CoC7.BonusSelectionWindowNamed": "{name} 판정을 위해 난이도를 선택합니다", + "CoC7.SkillDetailsWindow": "상세기능창", + "CoC7.RegularDifficulty": "보통", + "CoC7.HardDifficulty": "어려움", + "CoC7.ExtremeDifficulty": "극단적", + "CoC7.CriticalDifficulty": "대성공", + "CoC7.UnknownDifficulty": "난이도 미공개", + "CoC7.RollDifficulty": "난이도 판정", + "CoC7.RollThreshold": "역치 판정", + "CoC7.FlatDiceModifier": "플랫 다이스 수식어", + "CoC7.FlatModifier": "플랫 수식어", + "CoC7.RollDifficultyUnknown": "난이도 미공개", + "CoC7.RollDifficultyRegular": "보통", + "CoC7.RollDifficultyHard": "어려움", + "CoC7.RollDifficultyExtreme": "극단적", + "CoC7.RollDifficultyCritical": "대성공", + "CoC7.RollResult.LuckSpendText": "{luckAmount} 의 행운을 소비해, {successLevel} 성공입니다", + "CoC7.RollDice": "판정 !", + "CoC7.CreateLink": "링크 생성", + "CoC7.SuccesLevelHint": "{value} 난이도의 성공", + "CoC7.FailureLevelHint": "{value} 난이도로 인해 실패", + "CoC7.CardType": "판정 유형", + "CoC7.CombinedRollCard": "복합 판정 카드", + "CoC7.OpposedRollCard": "대항 판정 카드", + "CoC7.GroupRollCard": "단체 판정 카드", + "CoC7.RegularRollCard": "일반 판정 카드", + "CoC7.CombinedAnyHint": "하나 이상 판정에 성공해야 함", + "CoC7.CombinedAllHint": "모든 판정에 성공해야 함", + "CoC7.CloseCard": "카드 닫기", + "CoC7.AttackManeuver": "공격 계획", + + "CoC7.CheckResult": "{name} 판정 ({value}%) - {difficulty} 난이도", + "CoC7.ItemCheckResult": "{item} - {skill} 판정 ({value}%) - {difficulty} 난이도", + "CoC7.CheckRawValue": "({rawvalue}%) - {difficulty} 난이도", + + "CoC7.ArmorAbsorbsDamage": "장갑이 모든 피해 흡수", + "CoC7.Critical": "치명타", + "CoC7.Impale": "관통상", + "CoC7.CriticalTitle": "치명타를 입었습니다", + "CoC7.ImpaleTitle": "이 무기로 관통상을 입힐 수 있습니다", + "CoC7.Target": "목표", + "CoC7.TargetOutOfRange": "사정거리 밖 목표", + "CoC7.NoTargetToDamage": "피해를 입힐 목표가 없습니다", + "CoC7.ShotIsImpossible": "사격 불가", + "CoC7.OutOfAmmo": "탄약 고갈", + "CoC7.OutOfShots": "사정거리 밖", + + "CoC7.BonusDamageRoll": "피해 보너스 판정", + "CoC7.Type": "유형", + "CoC7.FightBack": "반격", + "CoC7.Dodge": "회피", + "CoC7.Maneuver": "기동", + "CoC7.NoResponse": "응답없음", + "CoC7.OutNumbered": "수적열세", + "CoC7.combatCard.surprised": "기습", + "CoC7.combatCard.autoSuccess": "자동성공", + "CoC7.Advantage": "유리함", + "CoC7.Disadvantage": "불리함", + "CoC7.TitleAdvantage": "보너스 주사위 1 추가 (대상이 쓰러지거나 저지됨...)", + "CoC7.TitleDisadvantage": "패널티 주사위 1 추가 (쓰러지거나 저지당함...)", + "CoC7.TitleOutNumbered": "수적열세의 대상에 대해 보너스 주사위 1 추가", + "CoC7.TitleSurprised": "대상을 기습함에 따라 보너스 주사위 1 추가", + "CoC7.TitleAutoSuccess": "공격 자동 명중", + "CoC7.WinnerRollDamage": "{name} 승리. 피해 판정.", + "CoC7.InitiatorMissed": "{name} 놓침.", + "CoC7.NoWinner": "양쪽 모두 실패.", + "CoC7.DodgeSuccess": "{name} 회피함!", + "CoC7.ManeuverSuccess": "{name} 기동이 성공적이었음.", + "CoC7.AttackSuccess": "{name} 유효타를 입힘.", + "CoC7.InflictPain": "고통을 입힘", + "CoC7.AdvantageAttacker": "우위: 공격측", + "CoC7.AdvantageDefender": "우위: 방어측", + "CoC7.Tie": "묶임", + "CoC7.DamageInflicted": "피해 반영됨", + "CoC7.TotalDamage": "총 피해", + + "CoC7.combatCard.dive4cover": "엄페물에 뛰어들기", + + "CoC7.rangeCombatCard.SingleShot": "사격(단발)", + "CoC7.rangeCombatCard.MultipleShots": "사격(연발)", + "CoC7.AutomaticFire": "반자동 사격", + "CoC7.rangeCombatCard.Burst": "집중 사격", + "CoC7.rangeCombatCard.FullAuto": "전자동", + "CoC7.rangeCombatCard.BaseRange": "단거리", + "CoC7.rangeCombatCard.LongRange": "중거리", + "CoC7.rangeCombatCard.ExtremeRange": "장거리", + "CoC7.rangeCombatCard.OutOfRange": "사거리 밖", + "CoC7.rangeCombatCard.Cover": "은엄폐", + "CoC7.rangeCombatCard.PointBlankRange": "가까운 거리", + "CoC7.rangeCombatCard.NormalTarget": "보통 목표", + "CoC7.rangeCombatCard.BigTarget": "큰 목표", + "CoC7.combatCard.SmallTarget": "작은 목표", + "CoC7.rangeCombatCard.FastMovingTarget": "빠른 목표", + "CoC7.rangeCombatCard.InMelee": "근접전", + "CoC7.rangeCombatCard.aiming": "조준", + "CoC7.rangeCombatDamage": "{name} 이(가) {total} 의 피해를 입었습니다", + "CoC7.rangeCombatDamageArmor": "{name} 이(가) {total} 의 피해를 입었습니다. ({armor} 경감)", + "CoC7.RollDamage": "피해 판정", + "CoC7.BulletsFired": "발포", + "CoC7.Shots": "발포횟수", + "CoC7.Shoot": "사격", + "CoC7.ShotBullets": "{bullets} 탄약을 {actor}에게 쏩니다.", + "CoC7.ShotVoley": "{actor} 목표를 향해 {bullets}개의 총알을 발사합니다.", + "CoC7.rangeCombatCard.AimingTitle": "첫 사격에 보너스 주사위 1개 추가", + "CoC7.rangeCombatCard.CoverTitle": "패널티 주사위 1개. 대상이 엄폐했거나 성공적으로 지원을 받았습니다.", + "CoC7.rangeCombatCard.PointBlankRangeTitle": "보너스 주사위 1개. 지근거리 내 대상", + "CoC7.rangeCombatCard.BigTargetTitle": "큰 대상에 대해 보너스 주사위 1개 (체격 > 4)", + "CoC7.rangeCombatCard.SmallTargetTitle": "작은 대상에 대해 패널티 주사위 1개", + "CoC7.rangeCombatCard.NormalTargetTitle": "보통 크기의 대상. 어떤 패널티/보너스도 없습니다", + "CoC7.rangeCombatCard.InMeleeTitle": "패널티 주사위 1개. 대상이 근접 전투에 들어갔습니다", + "CoC7.rangeCombatCard.FastMovingTargetTitle": "패널티 주사위 1개. 대상이 빠르고 (MOV 8+) 최고 속도로 움직입니다", + + "CoC7.meleeCombatDamageTakes": "받는 피해", + "CoC7.meleeCombatDamageFrom": "공격자", + "CoC7.meleeCombatDamageDeals": "주는 피해", + "CoC7.meleeCombatDamageWith": "사용무기", + + "CoC7.DropZone": "낙하 지점", + + "CoC7.Value": "수치", + "CoC7.SkillValue": "기능 수치", + "CoC7.SkillBase": "기본", + "CoC7.BaseSkillValue": "기본 기능 수치", + "CoC7.SkillExperience": "경험치", + "CoC7.SkillArchetype": "캐릭터 타입", + "CoC7.SkillOccupation": "직업 기능", + "CoC7.SkillPersonal": "관심 기능", + + "CoC7.SkillTotalExperience": "경험치 점수", + "CoC7.SkillTotalArchetype": "캐릭터 타입 점수", + "CoC7.SkillTotalOccupation": "직업 점수", + "CoC7.SkillTotalPersonal": "관심 기능 점수", + "CoC7.CharacteristicsPoints": "특성치 점수", + "CoC7.TotalPoints": "총 직업 기능 점수", + + "CoC7.ItemQuantity": "양", + "CoC7.ItemWeight": "무게", + "CoC7.ItemDetails": "상세", + "CoC7.Description": "설명", + "CoC7.Reload": "좌/우 클릭 : 1의 탄종을 장탄/제거 \nShift + 좌/우 클릭 : 재장전/비우기", + "CoC7.WeaponRange": "사정거리", + "CoC7.WeaponDamage": "피해량", + "CoC7.Weapon.BlastRadius": "폭발 범위", + "CoC7.WeaponMalfunction": "고장", + "CoC7.WeaponUsesPerRound": "라운드 당 사용횟수", + "CoC7.WeaponUsesPerRoundHint": "라운드 당 공격횟수 (1/3 : 매 3번의 라운드당 1번의 공격)", + "CoC7.WeaponSheet.RoundsPerUse.Info": "발사준비가 될때까지 걸리는 라운드", + "CoC7.WeaponMax": "최대 라운드당 사용횟수", + "CoC7.BurstSize": "점사 규모", + "CoC7.BurstSizeHint": "점사 당 소모될 탄 수", + "CoC7.WeaponBulletsInMag": "탄창", + "CoC7.WeaponSpecial": "특수", + "CoC7.ItemPrice": "가격", + "CoC7.Armor": "장갑", + + "CoC7.EraNvct": "인빅터스", + "CoC7.EraDrka": "암흑기", + "CoC7.EraDdts": "더 어두운 오솔길로", + "CoC7.EraGlit": "크툴루 바이 가스라이트", + "CoC7.Era1920": "1920년대", + "CoC7.EraPulp": "펄프 크툴루", + "CoC7.EraMdrn": "현대", + "CoC7.Eras": "크툴루 배경", + "CoC7.EraAvailability": "시대 선택", + + "CoC7.SkillNoAdjustments": "수정 불가", + "CoC7.SkillNoXpGain": "경험치 습득 불가", + "CoC7.SkillSpecial": "전문화", + "CoC7.SkillRarity": "희귀", + "CoC7.SkillPush": "강행", + "CoC7.SkillCombat": "근접전(격투)", + "CoC7.SkillFighting": "근접전(무장)", + "CoC7.SkillFirearm": "사격", + + "CoC7.WeaponRngd": "원거리", + "CoC7.WeaponProperyManeuver": "기능", + "CoC7.WeaponTouch": "접촉", + "CoC7.WeaponImpl": "관통", + "CoC7.WeaponRare": "희귀", + "CoC7.WeaponAhdb": "+DB/2", + "CoC7.WeaponAddb": "+DB", + "CoC7.WeaponSlnt": "무소음", + "CoC7.WeaponXplv": "폭파", + "CoC7.WeaponBrst": "점사", + "CoC7.WeaponAuto": "전자동", + "CoC7.WeaponSpcl": "특수", + "CoC7.WeaponMont": "기마", + "CoC7.WeaponDbrl": "듀얼 배럴", + "CoC7.WeaponBlst": "폭발", + "CoC7.WeaponStun": "기절", + "CoC7.Weapon.Property.Melee": "근접", + "CoC7.Weapon.Property.Thrown": "투척", + "CoC7.Weapon.Property.Burn": "발화", + "CoC7.Weapon.Property.Shotgun": "산탄총", + + "CoC7.ErrorItem": "아이템을 찾을 수 없습니다", + "CoC7.ErrorActor": "캐릭터를 찾을 수 없습니다", + "CoC7.ErrorInvalidFormula": "{value}은(는) 유효한 수식이 아닙니다.", + "CoC7.ErrorInvalid": "무효", + "CoC7.ErrorInvalidCardType": "카드 유형", + "CoC7.ErrorInvalidRollType": "판정 유형", + "CoC7.Validate": "승인", + "CoC7.Apply": "적용", + + "CoC7.NewBioSectionName": "새 단락", + + "CoC7.DodgeSkillName": "회피", + "CoC7.CthulhuMythosName": "크툴루 신화", + "CoC7.CreditRatingSkillName": "신용 등급", + "CoC7.DriveAutoSkillName": "자동 운행", + "CoC7.FightingSpecializationName": "근접전", + "CoC7.FirearmSpecializationName": "사격", + "CoC7.DriveSpecializationName": "운전", + "CoC7.PilotSpecializationName": "조종", + "CoC7.AnySpecName": "다양", + "CoC7.BoutOfMadnessName": "일시적 광기", + "CoC7.InsanityName": "장기적 광기", + + "CoC7.NewSkillName": "새 기능", + "CoC7.AddSkill": "기능 추가", + "CoC7.DevelopemmentPhase": "성장 단계", + "CoC7.RecoverLuckPoints": "행운 점수 회복", + "CoC7.SkillCantGainXp": "기능이 자동으로 경험치를 얻지 못합니다.", + "CoC7.SkillUnflagForDevelopement": "성장 플래그 해제", + "CoC7.SkillFlagForDevelopement": "성장 플래그", + "CoC7.RollAll4Dev": "성장할 모든 기능 굴림", + "CoC7.RollLuck4Dev": "행운점수 성장 굴림", + "CoC7.DevRollTitle": "{item}성장 굴림: {die}/{score}%", + "CoC7.DevSuccessDetails": "{item} 이(가) {augment}% 만큼 향상", + "CoC7.SanGained": "{skill} 기능이 {skillValue}% 로 향상되어 이성을 2d6 ({results} = {sanGained}) 점 획득.", + "CoC7.DevFailureDetails": "{item}이(가) 향상되지 않음", + "CoC7.ReduceSanityLimits": "모든 이성 제한을 1로 감소", + "CoC7.DevSuccess": "{item}이(가) {die}/{score}% 향상되었습니다", + "CoC7.DevFailure": "item}이(가) 향상되지 않았습니다 ({die}/{score}%)", + "CoC7.LuckIncreased": "행운이 {augment} 점만큼({die}/{score}) 회복되었습니다", + "CoC7.LuckNotIncreased": "행운이 회복되지않았습니다 ({die}/{score})", + "CoC7.DevelopAttribWarn": "성장/생성중인 속성에 접근할 수 없습니다.", + "CoC7.SkillDetail": "상세", + "CoC7.EditSkill": "기능 편집", + "CoC7.DeleteSkill": "기능 제거", + "CoC7.RangeSkills": "원거리 기능", + "CoC7.MeleeSkills": "근접전 기능", + "CoC7.NewItemName": "새 아이템", + "CoC7.AddItem": "아이템 추가", + "CoC7.EditItem": "아이템 편집", + "CoC7.DeleteItem": "아이템 삭제", + "CoC7.TradeItem": "아이템 교환 / 소지 ", + "CoC7.SortBySkillName": "기능 이름으로 정렬", + "CoC7.SortBySkillValue": "기능 퍼센트로 정렬", + "CoC7.UncommonSkillsShow": "희귀 기능 표시", + "CoC7.UncommonSkillsHide": "희귀 기능 숨김", + + "CoC7.NewBookName": "새로운 서적", + "CoC7.AddBook": "서적 추가", + "CoC7.NewSpellName": "새로운 주문", + "CoC7.AddSpell": "주문 추가", + + "CoC7.AddWeapon": "무기 추가", + "CoC7.NewWeaponName": "새로운 무기", + "CoC7.EditWeapon": "무기 편집", + "CoC7.DeleteWeapon": "무기 삭제", + "CoC7.MeleeWeapons": "근접 무기", + "CoC7.RangeWeapons": "원거리 무기", + "CoC7.WeaponName": "이름", + "CoC7.WeaponSkill": "기능", + "CoC7.WeaponSkillAlt": "모든 기능", + "CoC7.Inventory": "소지품", + "CoC7.InventoryIsCurrentlyEmpty": "현재 소지품이 없습니다.", + "CoC7.CharacterDevelopment": "성장", + "CoC7.OccupationSkill": "직업 기능", + "CoC7.ArchetypeSkill": "캐릭터 타입 기능", + "CoC7.UseFormula": "주사위 판정 사용", + "CoC7.EnterFormula": "수식 입력", + "CoC7.SanRollHint": "대상에 대한 이성수치 판정", + "CoC7.SANCheckTitle": "이성 감소 : {name} ({sanMin}/{sanMax})", + "CoC7.NoSkill": "기능 없음", + "CoC7.AddWeapontHint": "

                                    {actor}에게 {weapon}.
                                    이(가)없습니다 입력하시겠습니까?

                                    ", + + "CoC7.LinkCheck": " {name} 판정", + "CoC7.LinkCheckDiff": "[{difficulty}] {name} 판정", + "CoC7.LinkCheckModif": " {name} 판정({modifier})", + "CoC7.LinkCheckDiffModif": "[{difficulty}] {name} 판정({modifier})", + "CoC7.LinkSanLoss": " 이성 감소 ({sanMin}/{sanMax})", + "CoC7.LinkSanLossDiff": "[{difficulty}] 이성 감소 ({sanMin}/{sanMax})", + "CoC7.LinkSanLossModif": " 이성 감소({modifier}) ({sanMin}/{sanMax})", + "CoC7.LinkSanLossDiffModif": "[{difficulty}] 이성 감소({modifier}) ({sanMin}/{sanMax})", + "CoC7.LinkItem": " {name}", + "CoC7.LinkItemDiff": "[{difficulty}] {name}", + "CoC7.LinkItemModif": " {name} ({modifier})", + "CoC7.LinkItemDiffModif": "[{difficulty}] {name} ({modifier})", + + "CoC7.ManualCreditValues": "수동조절한 신용치", + "CoC7.MonetarySymbol": "상징 :", + "CoC7.MonetaryFactor": "요인 :", + "CoC7.AutoCreditValues": "자동 계산 토글", + "CoC7.MonetarySpendingLevel": "소비 레벨 :", + "CoC7.MonetaryCash": "현금 :", + "CoC7.MonetarySpent": "지출 :", + "CoC7.MonetaryAssets": "자산 :", + "CoC7.MonetaryAssetsDetails": "자산 상세", + + "CoC7.PossessionsNotes": "메모 :", + "CoC7.PossessionsNotesHolder": "메모", + + "CoC7.BackgroundNewSection": "새로운 문단 추가", + "CoC7.BackgroundSectionNameHolder": "문단 제목 입력", + "CoC7.BackgroundDeleteSection": "문단 삭제", + "CoC7.BackgroundSectionMoveUp": "위로", + "CoC7.BackgroundSectionMoveDown": "아래로", + "CoC7.BackgroundEncounters": "신화생물과의 조우로 인한 상실", + "CoC7.BackgroundFlags": "플래그", + "CoC7.BackgroundFlagsMythosExperienced": "크툴루 신화로 이성 5% 추가", + "CoC7.BackgroundFlagsMythosHardened": "확립된 신화", + + "CoC7.SanityLossEncounters": "이성 상실 조우", + "CoC7.SanityLossImmunities": "이성 상실 면역", + "CoC7.AddSanityLossEncounter": "이성 상실 조우 추가", + "CoC7.AddSanityLossImmunity": "이성 상실 면역 추가", + "CoC7.DeleteSanityLossEncounter": "이성 상실 조우 삭제", + "CoC7.DeleteSanityLossImmunity": "이성 상실 면역 삭제", + + "CoC7.SanityLossTypeDialogTitle": "새로운 이성 상실 또는 면역", + "CoC7.SanityLossTypeDialogBody": "캐릭터에게 새로운 크툴루 신화 조우, 이성 상실 또는 이성 면역 추가.", + "CoC7.SanityLossTypeReason": "이유", + "CoC7.SanityLossTypeValue": "이성 포인트 상실", + "CoC7.SanityLossEncounter": "이성 상실 조우", + "CoC7.SanityLossImmunity": "이성 상실 면역", + + "CoC7.creatureFightingSkill": "근접전", + + "CoC7.InvoluntaryAction": "비자발적 행동", + "CoC7.InvoluntaryActionPerfomed": "비자발적 행동을 수행했습니다", + "CoC7.SanityCheck": "이성 판정", + "CoC7.IntCheck": "지능 판정", + "CoC7.NoSanLoss": "이성 손실 없음", + "CoC7.SANLoss": "이성 손실", + "CoC7.SanityCheckPerformed": "충격적인 경험을 겪었습니다.", + "CoC7.InvoluntaryActionPerformed": "잠시동안 스스로 제어할 수 없습니다.", + "CoC7.SanityLost": "이성치 손실", + "CoC7.MemoryRepressed": "당신은 그 기억을 억누르고 무의식에 묻습니다.", + "CoC7.RememberEverything": "당신은 모든 것을 기억합니다.", + "CoC7.BoutOfMadnesslasted": "당신의 장기적 광기가 지속됩니다.", + "CoC7.EnteringBoutOfMadness": "당신은 장기적 광기를 경험합니다.", + "CoC7.GrowingAccustomedToAwfulness": "당신은 공포에 익숙해집니다. (당신의 이성치 손실이 제한됩니다).", + "CoC7.ImmuneToAwfulness": "당신의 의식은 이런 두려움에 영향을 받지 않습니다. (이성치 손실 없음).", + "CoC7.InvestigatorPhobiaGained": "탐사자가 공포증을 가집니다", + "CoC7.PhobiaGained": "당신은 공포증을 얻습니다.", + "CoC7.InvestigatorManiaGained": "탐사자가 집착증을 얻습니다.", + "CoC7.ManiaGained": "당신은 집착증을 얻습니다", + "CoC7.AlreadyUnderlyingInsanity": "탐사자는 이미 잠재적 광기 상태입니다.", + "CoC7.IndefinitelyInsane": "당신은 장기적으로 미치게됩니다.", + "CoC7.TemporaryInsane": "당신은 일시적 광기상태가 됩니다", + "CoC7.GoodForAsylum": "당신은 정신병원에 가게됩니다", + "CoC7.BoutOfMadness": "광기 발작", + "CoC7.BoutRealTime": "광기 발작: 실시간", + "CoC7.BoutSummary": "광기 발작: 요약", + "CoC7.EndBoutOfMadness": "광기의 끝", + "CoC7.InsanityType": "광기의 종류", + "CoC7.Phobia": "공포증", + "CoC7.Mania": "집착증", + "CoC7.MaxSanloss": "최대 손실", + "CoC7.MinSanloss": "최소 손실", + "CoC7.AlreadyLost": "이미 손실됨", + "CoC7.AlreadyEncountered": "이미 조우함", + "CoC7.CreatureMaxLoss": "크리처 최대 손실", + "CoC7.MaxLossToCreature": "이 크리처의 최대 손실", + "CoC7.MaxPossibleSanLoss": "최대 손실 가능 이성", + "CoC7.ResetCreatureSan": "크리처 기록 재설정", + "CoC7.ResetSpecieSan": "종 기록 재설정", + "CoC7.KeepData": "크리처 데이터 유지", + "CoC7.BoutActive": "(발작) 이성치 손실 면역", + "CoC7.AlreadyInABout": "당신은 이미 광기 발작 중이며, 이 이상으로 이성치를 손실하지 않습니다.", + "CoC7.PlayerPermanentlyInsane": "플레이어 영구적 광기", + "CoC7.MythosFirstEncounter": "신화 경험 조우 (최초 +5%)", + "CoC7.MythosAlreadyEncountered": "신화 경험 조우 (+1%)", + "CoC7.DisregardMythosGain": "신화 상승 없음", + "CoC7.MythosGain": "신화 상승", + "CoC7.YouGainedCthulhuMythos": "당신의 마음은 이 소름끼치는 현실앞에서 움츠러듭니다 (+{value}% 크툴루 신화)", + "CoC7.CardResolved": "카드 해결", + + "CoC7.SpellCastingTime": "시전 시간", + "CoC7.SpellCastingCost": "시전 비용", + "CoC7.CallSpell": "강림", + "CoC7.DismissSpell": "취소", + "CoC7.ContactSpell": "접촉", + "CoC7.SummonSpell": "소환", + "CoC7.BindSpell": "구속", + "CoC7.EnchantmentSpell": "암시", + "CoC7.GateSpell": "관문", + "CoC7.CombatSpell": "전투", + "CoC7.SpellType": "주문 타입", + "CoC7.SpellSuccessfullyLearned": " '{spell}' 주문을 성공적으로 배웠습니다!", + "CoC7.SpellAlreadyLearned": "('{spell}') 는(은) 이미 알고있는 주문입니다.", + + "CoC7.BookHasNothingMoreToTeach": "{book}로 더이상 얻을 지식이 없습니다. {actor}의 크툴루 신화 기능이 이 신화 등급보다 높습니다.", + "CoC7.BookType": "서적 타입", + "CoC7.Content": "내용", + "CoC7.CthulhuMythosFinal": "크툴루 신화 최종치", + "CoC7.CthulhuMythosInitial": "크툴루 신화 초기치", + "CoC7.Development": "성장", + "CoC7.DifficultyLevel": "난이도", + "CoC7.DragSpell": "주문을 책에 삽입하려면 여기로 드롭하세요...", + "CoC7.FullStudies": "전체 연구", + "CoC7.Gains": "습득", + "CoC7.GainsForReading": " {book} 을(를) 읽기 위해선 기능이 필요합니다.", + "CoC7.InitialReading": "첫 독서", + "CoC7.InitialReadingNeeded": "{actor}이(가) 독서를 진행하려면 {book} 에 대한 초기 판독을 수행해야 합니다.", + "CoC7.LearnSpellAttempt": " {book} 에서 {spell} 를(을) 배우려 시도합니다.", + "CoC7.MarkedForDevelopment": "개발자용 표시", + "CoC7.Mythos": "신화", + "CoC7.MythosRating": "신화 등급", + "CoC7.NotOwned": "이 작업을 수행하려면 캐릭터가 이 아이템을 소유해야합니다.", + "CoC7.Occult": "오컬트", + "CoC7.Points": "수치", + "CoC7.Progress": "진행도", + "CoC7.RedoFullStudy": "다시 읽어보기", + "CoC7.ReadAttempt": " {book} ({language}), {difficulty} 로 읽기 시도.", + "CoC7.ReadingMythosTome": "{book} 읽기.", + "CoC7.Specific": "특정", + "CoC7.SpellsLearned": "주문 습득", + "CoC7.StudyTime": "연구 시간", + "CoC7.UnknownLanguage": "{actor} 이(가) 이 책이 쓰여진 언어를 이해 할수없습니다.", + "CoC7.Unreadable": "해독 불가", + + "CoC7.Crew": "그룹", + "CoC7.Origin": "기원", + "CoC7.ArmedVehicle": "군용 탈것", + + "CoC7.PulpTalents": "펄프 재능", + "CoC7.TalentType": "재능 타입", + "CoC7.PhysicalTalent": "신체적", + "CoC7.MentalTalent": "정신적", + "CoC7.CombatTalent": "전투", + "CoC7.MiscellaneousTalent": "잡다한", + "CoC7.BasicTalent": "기본", + "CoC7.InsaneTalent": "광기", + "CoC7.OtherTalent": "기타", + + "CoC7.Items": "아이템", + "CoC7.Vehicle": "탈것", + "CoC7.Books": "서적", + "CoC7.Status": "상태", + + "CoC7.Classic": "기본", + "CoC7.Lovecraftian": "러브 크래프트", + "CoC7.Pulp": "펄프", + "CoC7.Modern": "현대", + "CoC7.Related": "관련 직업", + "CoC7.OccupationType": "직업 타입", + "CoC7.OccupationPoints": "직업 점수", + "CoC7.Selected": "선택됨", + "CoC7.Multiplier": "배수", + "CoC7.Optional": "선택", + "CoC7.Or": "또는", + "CoC7.Minimum": "최소", + "CoC7.Maximum": "최대", + "CoC7.CommonSkills": "일반 기능", + "CoC7.OptionSkills": "선택적 기능 그룹", + "CoC7.ChoiceNumber": "선택지", + "CoC7.Choose": "선택할 수 있는 수", + "CoC7.Chosen": "선택됨", + "CoC7.EmptySkillList": "여기에 드롭하여 기능 추가.", + "CoC7.EmptyItemList": "여기에 드롭하여 아이템 추가.", + "CoC7.EmptyCharacterSkillList": "직업 또는 설정을 여기에 드롭하여 추가.", + "CoC7.PersonalSpeciality": "개인 또는 시대에 따른 전문 분야", + "CoC7.AdditionalSkills": "추가 기능", + "CoC7.SkillSelectionWindow": "선택적 기능 선택", + "CoC7.SelectPersonalSkills": "{number} 개의 기능을 개인 관심 기능으로 선택", + "CoC7.ResetOccupation": "직업 초기화", + "CoC7.ResetOccupationHint": "캐릭터 {name} 에는 이미 직업이 설정되어있습니다 초기화하시겠습니까?", + "CoC7.ResetArchetype": "캐릭터 타입 초기화", + "CoC7.ResetArchetypeHint": "캐릭터 {name} 에는 이미 캐릭터 타입이 있습니다. 초기화하시겠습니까?", + "CoC7.CreditOutOfRange": "신용 등급은 {min} 에서 {max} 사이여야 합니다", + "CoC7.BioSections": "백스토리 문단", + "CoC7.BioSectionName": "백스토리 문단 이름", + "CoC7.SpendPoints": "특성치 점수 할당", + "CoC7.RollCharac": "특성치 굴림", + "CoC7.SelectCoreCharac": "주 특성치 선택", + "CoC7.SkillSpecSelectTitle": "{specialization} 전문화할 기능 선택/생성", + "CoC7.SkillSelectBase": "기능 {name} 의 기본치 값 선택", + "CoC7.SelectSkill": "기존 기능 선택", + "CoC7.CreateNewSkill": "새 기능 생성", + + "CoC7.Characteristics": "특성치", + "CoC7.Characteristic": "특성치", + "CoC7.EnableCharacteristics": "특성치 입력", + "CoC7.UsePoints": "점수 사용", + "CoC7.UseRolls": "굴림 사용", + "CoC7.CoreCharacteristics": "주 특성치", + "CoC7.BonusPoints": "보너스 포인트", + "CoC7.SuggestedOccupations": "추천 직업", + "CoC7.SuggestedTraits": "추천 성격", + + "CoC7.PutGunAway": "총 집어넣기", + "CoC7.DrawGun": "총 꺼내기", + + "CoC7.GmTools": "수호자 도구", + "CoC7.GmNotes": "수호자 메모", + "CoC7.DevPhase": "성장 단계", + "CoC7.DevPhaseEnabled": "성장 단계 활성화", + "CoC7.DevPhaseDisabled": "성장 단계 비활성화", + "CoC7.CharCreationMode": "캐릭터 생성 모드", + "CoC7.CharCreationEnabled": "캐릭터 생성 모드 활성화", + "CoC7.CharCreationDisabled": "캐릭터 생성 모드 비활성화", + "CoC7.toggleXP": "경험치 습득", + "CoC7.XPGainEnabled": "캐릭터가 경험치를 얻을 수 있습니다", + "CoC7.XPGainDisabled": "캐릭터가 경험치를 얻을 수 없습니다", + "CoC7.WarnNoActorAvailable": "선택된 캐릭터가 없습니다", + "CoC7.WarnMacroIncorrectType": "무기와 기술에 대해서만 매크로를 생성할수있습니다", + "CoC7.WarnNoGlobalSpec": "지정되지 않은 전문기술에 대해 매크로를 생성할수없습니다", + "CoC7.WarnMacroNoItemFound": "이 아이템을 찾을 수 없습니다", + "CoC7.WarnNoControlledActor": "조작 중인 캐릭터가 없습니다", + "CoC7.WarnFastTargetWithWrongMOV": "이동력 8 미만인 적을 빠르게 목표로 선택합니다. (이동력: {mov})", + "CoC7.WarnTooManyTarget": "너무 많은 목표를 선택했습니다 마지막으로 선택한 목표만 유지합니다", + "CoC7.WarnNoTargetsSanCheck": "선택한 목표가 없습니다. 목표를 선택하거나 링크를 생성하십시오.", + + "CoC7.allActors": "모든 캐릭터", + "CoC7.restTargets": "남은 목표", + "CoC7.startRest": "휴식 시작", + "CoC7.dreaming": "드림랜드에서 꿈을 꾸며 기다립니다", + "CoC7.healthRecovered": "체력 1점 회복", + "CoC7.pulpHealthRecovered": "체력 {number} 을 회복합니다", + "CoC7.dailySanLossRestarted": "일일 이성 손실 카운터가 다시 시작되었습니다", + "CoC7.magicPointsRecovered": "마력이 회복되었습니다", + "CoC7.hasCriticalWounds": "치명타로 입은 상처때문에 체력을 회복할 수 없습니다.", + "CoC7.quickHealer": "빠른 회복", + + "CoC7.ErrorNoDodgeSkill": "이 캐릭터는 회피 기능을 가지고 있지 않습니다", + "CoC7.ErrorNotEnoughLuck": "{actor} 은(는) 기본치를 만들기위한 행운이 부족합니다", + "CoC7.ErrorManeuverNotPossible": "상대가 너무 강해서 대처할 수 없습니다.", + "CoC7.ErrorNotFound": "{missing} 을(를) 찾을수없습니다!", + "CoC7.ErrorNotFoundForActor": "{actor}에서 {missing} 을(를) 찾을 수 없습니다!", + + "CoC7.InfoLessSkillThanOptions": "{skillCount} 과 {optionsCount} 옵션만 있으므로, 모두 추가합니다.", + "CoC7.InfoAllSkillsAlreadySelected": "이미 모든 기능이 선택되었습니다.", + + "CoC7.MessageCheckRequestedWait": "수호자가 {check} 판정을 요청했습니다.
                                    클릭하기 전에 잠시 기다려주세요!
                                    ", + "CoC7.MessageTargetCheckRequested": "수호자가 {name} 에게 {check} 판정을 요청했습니다.", + "CoC7.MessageTitleSelectSingleUserForTarget": "이 공격에 대응할 수 있는 캐릭터", + "CoC7.MessageSelectSingleUserForTarget": "이 토큰은 여러 플레이어에 의해 제어되고있습니다 이 공격에 대응할 수 있는 플레이어를 선택해주세요.", + "CoC7.MessageBoutOfMadnessTableNotFound": "광기표의 결과를 찾을 수 없습니다. 모든 롤 테이블이 생성되었는지 확인해주세요.", + "CoC7.MessageBoutOfMadnessItemNotFound": "광기표의 결과를 찾을 수 없습니다. 모든 특성치가 생성되었는지 확인해 주세요.", + + "CoC7.DealDamage": "{damage}의 피해를 {target}에게 주겠습니까?", + "CoC7.NoTargetSelected": " {weapon} 무기 판정의 목표를 선택하지 않았습니다. 계속 진행하시겠습니까?", + + "CoC7.Import": "불러오기", + "CoC7.Proceed": "진행", + "CoC7.Cancel": "취소", + + "CoC7.ActorImporter": "캐릭터 불러오기", + "CoC7.ActorImporterSummary": "NPC 혹은 크리처의 설명과 특성치를 불러옵니다. 해당 형식의 플레인 텍스트를 붙여넣으십시오.", + "CoC7.PasteTheDataBelow": "로우 텍스트 데이터를 아래에 붙여넣으십시오.", + "CoC7.TextFieldInvalidCharacters": "텍스트에 유효하지 않은 문자가 있습니다. 수정하지 않으면 해당 문자는 삭제됩니다.", + "CoC7.SelectActorType": "캐릭터 타입 선택", + "CoC7.NonPlayingCharacter": "논 플레잉 캐릭터 (NPC)", + "CoC7.Creature": "크리처", + "CoC7.ConvertFrom6Edition": "6판에서 변환", + "CoC7.Convert": "변환", + "CoC7.NoConvert": "변환 없음", + "CoC7.Guess": "맞춤", + "CoC7.English": "영어", + "CoC7.Spanish": "스패인어", + "CoC7.French": "프랑스어", + "CoC7.German": "독일어", + "CoC7.Polish": "폴란드어", + "CoC7.TraditionalChinese": "중국어 번체", + "CoC7.SelectSourceLanguage": "원본 언어 선택", + "CoC7.ImportedUnnamedCharacter": "익명의 캐릭터 불러옴", + "CoC7.CreatedImportedCharactersFolder": "'불러온 캐릭터'폴더 생성 완료", + "CoC7.ImportedCharactersFolder": "불러온 캐릭터", + "CoC7.ImportSkillItemLocations": "다음에서 기능/주문/무기를 찾습니다. :", + "CoC7.ImportActorItemsNone": "없음", + "CoC7.ImportActorItemsItem": "아이템", + "CoC7.ImportActorItemsItemWorldModuleSystem": "아이템 / 월드 / 모듈 / 시스템", + "CoC7.ImportActorItemsWorldModuleItemSystem": "월드 / 모듈 / 아이템 / 시스템", + + "CoC7.HowToTranslateTitle": "번역 방법", + "CoC7.HowToTranslateWarning": "신뢰할 수 없는 모듈은 설치하지 마십시오.", + "CoC7.HowToTranslateInstallBabele": "Foundry의 모듈 관리자로부터 Babelle 모듈을 설치/업데이트 하십시오.", + "CoC7.HowToTranslateInstallTranslation": "Foundry의 모듈 관리자로부터 번역 모듈을 설치/업데이트 하십시오.", + "CoC7.HowToTranslateEnableTranslation": "게임 월드의 설정 / 모듈 관리에서 Babelle과 번역 모듈을 모두 활성화하십시오.", + "CoC7.HowToTranslateNoTranslation": "새로운 언어의 번역을 생성하는 절차는 번역 모듈에서 확인할 수 있습니다.", + + "CoC7.Migrate.Title": "업데이트 필요", + "CoC7.Migrate.Message": "

                                    현재 사용 중인 월드는 {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": "
                                    1. 좌클릭 선택지 있는 롤 체크
                                    2. Shift + 좌클릭 즉시 일반 난이도 굴림
                                    1. 우클릭 선택지 있는 대항 판정
                                    2. Shift + 우클릭 즉시 대항 판정
                                    1. Alt/Option + 우클릭선택지 있는 복합 판정
                                    ", + "CoC7.ToolTipKeeperSkill": "
                                    1. CTRL + 좌클릭 굴림 링크 작성
                                    2. {other}
                                    ", + "CoC7.ToolTipKeeperStandbySkill": "
                                  3. 좌클릭 {name}의 굴림 요청
                                  4. ", + "CoC7.ToolTipDB": "
                                    1. 좌클릭 즉시 굴림
                                    ", + "CoC7.ToolTipSanity": "
                                    1. 좌클릭 선택지 있는 판정 굴림
                                    2. Alt/Option + 좌클릭 roll sanity loss with options
                                    3. Shift + 좌클릭즉시 보통 난이도 굴림
                                    4. Shift + Alt/Option + 좌클릭 주사위 풀 선택지 없이 이성 손실 굴림
                                    1. 우클릭 선택지 있는 대항 판정
                                    2. Shift + 우클릭 즉시 대항 판정
                                    1. Alt/Option + 우클릭 선택지 있는 복합 판정
                                    2. Shift + Alt/Option + 우클릭 즉시 복합 판정
                                    ", + "CoC7.ToolTipCombat": "
                                    1. 좌클릭 선택지 있는 판정 굴림
                                    2. Shift + 좌클릭즉시 보통 난이도 굴림
                                    1. 우클릭 선택지 있는 대항 전투 조작
                                    2. Shift + 우클릭 즉시 대항 전투 조작
                                    ", + "CoC7.ToolTipKeeperSanity": "
                                  5. CTRL + Alt/Option 정신 상태 검사 굴림 링크 생성
                                  6. ", + "CoC7.ToolTipAutoToggle": "
                                    1. 좌클릭 자동 계산/수동 입력 전환
                                    2. ", + "CoC7.ToolTipSkillFlagToggle": "
                                      1. Double Click 플래그 상태 전환
                                      2. ", + "CoC7.ToolTipSkillFlagged": "개발자를 위한 플래그", + "CoC7.ToolTipSkillUnflagged": "개발 플래그가 붙어 있지 않음", + + "SETTINGS.TitleRules": "룰", + "SETTINGS.TitleInitiative": "행동 순서 세팅", + "SETTINGS.TitleRoll": "주사위 세팅", + "SETTINGS.TitleChatCards": "채팅 카드 세팅", + "SETTINGS.TitleScene": "장면 세팅", + "SETTINGS.TitleSheet": "시트 설정", + "SETTINGS.TitleGameArtwork": "게임 아크워크 설정", + "SETTINGS.TitleWeapon": "무기 설정", + "SETTINGS.TitleDiceSoNice": "Dice So Nice 설정", + "SETTINGS.TitleDeveloperDebug": "개발자 밎 디버깅 설정", + "SETTINGS.TitleRollTable": "", + "SETTINGS.DebugMode": "시스템 디버깅 모드", + "SETTINGS.DebugModeHint": "!!재시작 필요!!", + "SETTINGS.DefautDifficulty": "판정 난이도 기본값", + "SETTINGS.DefaultDifficultyHint": "판정 난이도 기본값을 선택할 수 있습니다. 난이도 불명은 플레이어에게 판정 난이도를 숨기고 굴립니다.", + "SETTINGS.CheckDifficultyRegular": "난이도 기본값", + "SETTINGS.CheckDifficultyUnknown": "난이도 불명", + "SETTINGS.showIconsOnly": "요약 시트에서 기능 목록에 아이콘만 표시.", + "SETTINGS.UseToken": "토큰 이미지 사용", + "SETTINGS.UseTokenHint": "채팅 카드에서 초상화 대신 토큰 이미지 사용", + "SETTINGS.DisplayActorOnCard": "카드에 캐릭터 표시", + "SETTINGS.DisplayActorOnCardHint": "전투 채팅 카드에 캐릭터의 이미지/토큰 표시", + "SETTINGS.InitiativeRule": "행동 순서 룰 설정", + "SETTINGS.InitiativeRuleHint": "기본 행동 순서 규칙(민첩성 사용) 또는 옵션 룰(굴림값 사용)을 선택할 수 있습니다.", + "SETTINGS.InitiativeRuleBasic": "기본", + "SETTINGS.InitiativeRuleOptional": "옵션", + "SETTINGS.displayInitDices": "행동 순서 주사위 표시", + "SETTINGS.displayInitDicesHint": "행동 순서 판정 주사위를 표시합니다(옵션 룰만).", + "SETTINGS.displayInitAsText": "행동 순서 텍스트 표시", + "SETTINGS.displayInitAsTextHint": "행동 순서를 숫자 대신 텍스트로 표시(옵션 룰)", + "SETTINGS.PulpRules": "펄프 룰", + "SETTINGS.PulpRulesHint": "펄프 규칙(Archetype, Talent, HP) 사용 허용. !초기 적용!", + "SETTINGS.developmentRollForLuck": "복구 가능항 행운점", + "SETTINGS.developmentRollForLuckHint": "각 플레이어는 성장 단계에서 행운 향상 판정을 할 수 있습니다.", + "SETTINGS.displayPlayerNameOnSheet": "플레이어의 이름을 시트에 표시", + "SETTINGS.DisregardAmmo": "탄약 갯수 무시.", + "SETTINGS.DisregardAmmoHint": "이 기능을 활성화하면 총에 장전된 총알의 수는 고려되지않습니다.", + "SETTINGS.DisregardUsePerRound": "라운드당 사용량 무시.", + "SETTINGS.DisregardUsePerRoundHint": "이 설정을 활성화하면 무기의 라운드 당 사용량에 관계 없이 원하는만큼 발사할 수 있습니다.", + "SETTINGS.RestrictGridSpaces": "격자 공간으로 측정 제한", + "SETTINGS.RestrictGridSpacesHint": "범위 전투의 경우 선택하면 거리가 격자 공간에서 측정되고, 그렇지 않으면 '실제'(유클리드) 거리가 사용됩니다.", + "SETTINGS.StatusPlayerEditable": "플레이어는 상태 이상을 수정할수 있습니다", + "SETTINGS.StatusPlayerEditableHint": "플레이어에게 상태(위험성, 무의식, 사망, 사망)를 수정하고 일일 SAN 손실을 설정할 수 있게 합니다.", + "SETTINGS.SyncDice3D": "[DsN] 주사위 동기화", + "SETTINGS.SyncDice3DHint": "DsN 사용 시 클라이언트 간 주사위 동기화", + "SETTINGS.UnitDieColorset": "[DsN] 유닛 다이스 컬러 세트", + "SETTINGS.UnitDieColorsetHint": "DsN을 사용할 경우 유닛 다이스에 사용할 색상 세트. (플레이어의 설정을 사용하려면 공백으로 둡니다).", + "SETTINGS.TenDieNoMod": "[DsN] 10 다이스 컬러 세트", + "SETTINGS.TenDieNoModHint": "DsN을 사용하는 경우 싱글 10 다이스용으로 사용하는 색상 세트. (플레이어의 설정을 사용하려면 공백으로 둡니다).", + "SETTINGS.TenDieBonus": "[DsN] 보너스 다이스 컬러 세트 10개", + "SETTINGS.TenDieBonusHint": "DsN을 사용할 경우 10개의 보너스 주사위에 사용할 색상 세트. (플레이어의 설정을 사용하려면 공백으로 둡니다).", + "SETTINGS.TenDiePenalty": "[DsN] 페널티 주사위 10가지 색상 세트", + "SETTINGS.TenDiePenaltyHint": "DsN을 사용할 경우 패널티 보너스 주사위에 사용할 색상 세트. (플레이어의 설정을 사용하려면 공백으로 둡니다).", + "SETTINGS.OverrideGameArtwork": "게임 아트워크 덮어쓰기", + "SETTINGS.OverrideGameArtworkHint": "!!재시작 필요!! 고급게임 구성에 대한 접속을 허용합니다,기본 값은 공백으로 둡니다", + "SETTINGS.ArtPauseImage": "일시중지 이미지", + "SETTINGS.ArtPauseImageHint": " 이미지를 제거하려면 'null'을 입력하십시오.", + "SETTINGS.ArtPauseText": "일시중지 텍스트", + "SETTINGS.ArtPauseTextHint": "기본값에서 변경하지 않으려면 공백으로 두십시오.", + "SETTINGS.OverrideSheetArtwork": "시트 아트워크 덮어쓰기", + "SETTINGS.OverrideSheetArtworkHint": "!!재시작 필요!! 고급 시트 구성에 대한 접속권한을 부여합니다. 기본값은 공백입니다.", + "SETTINGS.ArtWorkSheetBackground": "캐릭터 시트 배경", + "SETTINGS.ArtWorkSheetBackgroundHint": "배경을 제거하려면 'null'을 입력하고, 기본값은 공백으로 합니다.", + "SETTINGS.ArtWorkSheetBackgroundType": "배경 유형", + "SETTINGS.BackgroundSlice": "배경 이미지가 슬라이스 됩니다 (css:border-image)", + "SETTINGS.BackgroundAuto": "이미지 유지 비율을 조정합니다. (css:auto)", + "SETTINGS.BackgroundContain": "자르기/늘이기 없이 채울 배율 (css:contain)", + "SETTINGS.BackgroundCover": "자르기/늘리기로 채울 배율 (css:cover)", + "SETTINGS.ArtWorkOtherSheetBackground": "기타 시트 배경", + "SETTINGS.ArtWorkOtherSheetBackgroundHint": "배경을 제거하려면 'null'을 입력하십시오. 아이템 및 탈것만 해당됩니다", + "SETTINGS.ArtworkSheetImage": "캐릭터 시트 이미지", + "SETTINGS.ArtworkSheetImageHint": "이미지를 제거하려면 'null'을 입력하세요.", + "SETTINGS.ArtworkFrontColor": "메인 색상", + "SETTINGS.ArtworkFrontColorHint": "모든 요소에 사용", + "SETTINGS.ArtworkBackgroundColor": "보조 색상", + "SETTINGS.ArtworkBackgroundColorHint": "배경 및 입력에 사용", + "SETTINGS.ArtworkInteractiveColor": "상호작용 요소 색상", + "SETTINGS.ArtworkInteractiveColorHint": "상호작용/롤러블 요소에 사용", + "SETTINGS.ArtworkFixedSkillLength": "기능 이름 길이 제한", + "SETTINGS.ArtworkFixedSkillLengthHint": "기능 탭의 기능 이름 길이를 제한해 시트를 보다 컴팩트하게 보이게 합니다.", + "SETTINGS.ArtworkMainFont": "메인 폰트", + "SETTINGS.ArtworkMainFontBold": "메인 폰트 (볼드)", + "SETTINGS.ArtworkMainFontSize": "기본 폰트 크기 (px)", + "SETTINGS.BoutOfMadnessSummaryTable": "광기 발작표 (요약)", + "SETTINGS.BoutOfMadnessRealTimeTable": "광기 발작표 (실시간)", + "SETTINGS.LetKeeperDecide": "수호자가 결정", + "SETTINGS.DisplayResultType": "주사위 결과 유형 표시(텍스트)", + "SETTINGS.DisplayCheckSuccessLevel": "성공 수준 확인 표시(별)", + "SETTINGS.PlayerUnlockSheetMode": "플레이어가 시트의 잠금을 해제할 수 있습니다", + "SETTINGS.AlwaysEditable": "항상", + "SETTINGS.CreationModeOnly": "작성 모드에서만", + "SETTINGS.NeverEditable": "항상 (수호자만)", + "SETTINGS.StanbyGMRolls": "수호자 굴림 대기", + "SETTINGS.StanbyGMRollsHint": "수호자가 할당된 캐릭터 시트에서 롤을 만드는 경우 롤 대신 롤 버튼을 표시합니다.", + "SETTINGS.AllowFlatDiceModifier": "플랫 주사위 수정치", + "SETTINGS.AllowFlatDiceModifierHint": "주사위 굴림 결과를 플랫 값으로 수정할 수 있습니다.", + "SETTINGS.AllowFlatThresholdModifier": "플랫 값 수정치", + "SETTINGS.AllowFlatThresholdModifierHint": "체크 성공 값을 플랫 값으로 수정할 수 있습니다.", + "SETTINGS.OpposedRollTieBreaker": "대항 판정 무승부 비교", + "SETTINGS.OpposedRollTieBreakerHint": "대항 판정에서 동점인 경우 기능치가 높은 순이 아니라 판정치가 높은 순으로 승자가 결정됩니다.", + "SETTINGS.SelfRollWhisperTarget": "셀프 롤 알림:", + "SETTINGS.SelfRollWhisperTargetHint": "GM으로서 셀프 체크 롤을 실행할 때 누구에게 알림을 보내시겠습니까?", + "SETTINGS.DoNotAdvise": "자신에게만 알림.", + "SETTINGS.AdviseOwnersOnly": "캐릭터 소유자에게 알림", + "SETTINGS.AdviseAllPlayer": "모든 플레이어에게 알림", + "SETTINGS.OneBlockBackStory": "에디터 블록", + "SETTINGS.OneBlockBackStoryHint": "백스토리를 1개의 에디터 블록으로 변환하지만 링크 포맷/추가 가능.", + "SETTINGS.EnableStatusIcons": "상태 아이콘 활성화", + "SETTINGS.EnableStatusIconsHint": "전투 및 정신 효과 아이콘이 토큰에 표시되는지 여부 설정.", + "SETTINGS.ShowExperimentalFeatures": "실험 기능 표시", + "SETTINGS.ShowExperimentalFeaturesHint": "이러한 기능을 사용하면 향후 릴리스에서 월드를 사용할 수 없게 될 수 있습니다. 테스트만을 위해 게임 세계에서는 사용하지 마십시오.", + "CoC7.ExperimentalFeaturesWarning": "이 기능은 실험 중이므로 게임 환경에서 사용하지 않는 것이 좋습니다.", + "SETTINGS.CheckElevation": "거리에 고도 포함", + "SETTINGS.CheckElevationHint": "전투 거리 계산에 고도 사용", + "CoC7.toolTipDelay": "툴팁이 표시될 때까지의 지연 시간(밀리초), 표시하지 않을 경우 0", + + "CoC7.getTheExample": "예시 복사", + "CoC7.Copied": "클립보드에 예시 텍스트를 복사했습니다." +} diff --git a/lang/pl.json b/lang/pl.json index 8cec2ab0..54fe8aeb 100644 --- a/lang/pl.json +++ b/lang/pl.json @@ -1,7 +1,8 @@ { - "CoC7.title": "Call of Cthulhu 7h Edycja (Unofficial)", + "CoC7.title": "Call of Cthulhu 7-ma Edycja (Nieoficjalna)", "CoC7.Entities.Character": "Postać", + "CoC7.Entities.Container": "Pojemnik", "CoC7.Entities.Creature": "Potwór", "CoC7.Entities.Npc": "BN", "CoC7.Entities.Vehicle": "Pojazd", @@ -20,7 +21,7 @@ "CHARAC.STR": "S", "CHARAC.Strengh": "Siła", - "CHARAC.Strength": "Strength", + "CHARAC.Strength": "Siła", "CHARAC.CON": "KON", "CHARAC.Constitution": "Kondycja", "CHARAC.SIZ": "BC", @@ -89,6 +90,7 @@ "CoC7.Spells": "Czary", "CoC7.Spell": "Czar", "CoC7.Spells&Notes": "Czary i Notatki", + "CoC7.Weapons": "Bronie", "CoC7.Effects": "Efekt", "CoC7.Cost": "Cena", "CoC7.Source": "Źródło", @@ -97,7 +99,9 @@ "CoC7.Other": "Inne", "CoC7.rounds": "runda/rundy", "CoC7.hours": "godzina/godziny", + "CoC7.days": "dzień/dni", "CoC7.weeks": "tydzień/tygodnie", + "CoC7.months": "miesiąc/miesiące", "CoC7.remove": "Usuń", "CoC7.Any": "Dowolny", "CoC7.All": "Wszyscy", @@ -116,6 +120,16 @@ "CoC7.Icon": "Ikona", "CoC7.Check": "Test", "CoC7.ItemWeapon": "Przedmiot (Broń)", + "CoC7.AttacksPerRound": "Ataki na rundę", + + "CoC7.Cast": "Rzuć", + "CoC7.SanityCost": "Koszt Poczytalności", + "CoC7.PowerCost": "Koszt Mocy", + "CoC7.HitPointsCost": "Koszt PW", + "CoC7.MagicPointsCost": "Koszt Punktów Magii", + "CoC7.OtherCosts": "Inne koszty", + "CoC7.CastingSpell": "Rzucam {spell}.", + "CoC7.NotEnoughMagicPoints": "{spell} wymaga {originalMagicPoints} Punktów Magii, ale posiadasz jedynie {actorMagicPoints}. Czy chcesz poświęcić {convertedHitPoints} Punktów Wytrzymałości? Otrzymasz {convertedHitPoints} punktów obrażeń.", "CoC7.CopyToClipboard": "Kopiuj do schowka", "CoC7.WhisperToSelection": "Szepnij do wybranych tokenów", @@ -128,38 +142,39 @@ "CoC7.CriticalSuccess": "Krytyczny Sukces", "CoC7.Fumble": "Krytyczna Porażka", "CoC7.Failure": "Porażka", - "CoC7.Malfunction": "{itemName} Przsestał Działać", + "CoC7.Malfunction": "{itemName} przestał działać", "CoC7.Dice": "Kość", "CoC7.DiceModifierBonus": "bonus", "CoC7.DiceModifierPenalty": "rzut karny", "CoC7.BonusDice": "Bonusowa kość", "CoC7.Modifiers": "Modyfikatory", - "CoC7.UnitsDie": "1 units die", - "CoC7.TensDie": "tens die", - "CoC7.TensDice": "tens dice", + "CoC7.UnitsDie": "1 kość jedności", + "CoC7.TensDie": "kość dziesiątek", + "CoC7.TensDice": "kości dziesiątek", "CoC7.SuccessRequired": "Wymagany sukces: {successRequired}", "CoC7.Roll": "Rzut", "CoC7.Pushing": "Forsowanie", "CoC7.PushSkill": "Forsuj", "CoC7.PushingSkill": ": forsuje!", "CoC7.PushedRoll": "(forsowanie rzutu)", - "CoC7.SpendLuck": "Wydaj {luckNeededValue} Szczęście do zaliczenia", - "CoC7.LuckSpent": "{luckAmount} szczęście wydane do zaliczenia", + "CoC7.SpendLuck": "Wydaj {luckNeededValue} szczęścia do zaliczenia", + "CoC7.LuckSpent": "Wydano {luckAmount} szczęścia", "CoC7.LuckSpentAlt": "Szczęście wydane", - "CoC7.LuckError": "{actorName} nie ma wystarczająco szczęcia aby zdać test", + "CoC7.LuckError": "{actorName} nie ma wystarczająco szczęścia aby zdać test", "CoC7.check.AutoSuccess": "Auto. sukces", "CoC7.check.AutoFailure": "Auto. niepowodzenie", "CoC7.RevealCheck": "Pokaż wynik", "CoC7.RevealSanLoss": "Pokaż utratę PP", - "CoC7.check.ForcePass": "Forsuj zdanie", - "CoC7.check.ForceFail": "Forsoawnie nieudane", + "CoC7.check.ForcePass": "Forsuj zadanie", + "CoC7.check.ForceFail": "Forsowanie nieudane", "CoC7.check.FlagForDevelopment": "Nagroda za doświadczenie", "CoC7.IncreaseSuccessLevel": "Zwiększ sukces", "CoC7.check.DecreaseSuccessLevel": "Zmniejsz sukces", "CoC7.RollSecretDice": "Strażnik nieoficjalnie rzucił kilka kostek", "CoC7.KeeperSentDecoy": "Fałszywy rzut wysłany do graczy", "CoC7.FakeRoll": "Wyślij fałszywy rzut do graczy", + "CoC7.ErrorMissingKeeperUser": "Strażnik Tajemnic musi być obecny, żebyś mógł wykonać tę akcję", "CoC7.ConstitutionCheck": "Test Kondycji", @@ -181,22 +196,26 @@ "CoC7.RollDifficultyHard": "Trudny", "CoC7.RollDifficultyExtreme": "Ekstremalny", "CoC7.RollDifficultyCritical": "Krytyczny", - "CoC7.RollResult.LuckSpendText": "{luckAmount} Szczęscie wydane, {successLevel} sukces", + "CoC7.RollResult.LuckSpendText": "Wydano {luckAmount} szczęścia, {successLevel} sukces", "CoC7.RollDice": "Rzut !", "CoC7.CreateLink": "Stwórz odnośnik", "CoC7.SuccesLevelHint": "{value} poziom sukcesu", "CoC7.FailureLevelHint": "Poziom {value} niepowodzenia", + "CoC7.CardType": "Typ rzutu", "CoC7.CombinedRollCard": "Karta rzutu łączonego", "CoC7.OpposedRollCard": "Karta rzutu przeciwstawnego", + "CoC7.GroupRollCard": "Karta rzutu grupowego", + "CoC7.RegularRollCard": "Karta rzutu zwykłego", "CoC7.CombinedAnyHint": "Dowolny rzut musi się udać", "CoC7.CombinedAllHint": "Wszystkie rzuty muszą się udać", "CoC7.CloseCard": "Zamknij kartę", + "CoC7.AttackManeuver": "Manewr", - "CoC7.CheckResult": "Sprawdz {name}. ({value}%) - {difficulty}", - "CoC7.ItemCheckResult": "{item} - {skill} Sprawdz({value}%) - {difficulty} trudnosć", + "CoC7.CheckResult": "Sprawdź {name}. ({value}%) - {difficulty}", + "CoC7.ItemCheckResult": "{item} - {skill} Sprawdź ({value}%) - {difficulty} trudnosć", "CoC7.CheckRawValue": "({rawvalue}%) - {difficulty} trudnosć", - "CoC7.ArmorAbsorbsDamage": "Pancerz pochłania całę obrażenia", + "CoC7.ArmorAbsorbsDamage": "Pancerz pochłania wszystkie obrażenia", "CoC7.Critical": "Krytyczne", "CoC7.Impale": "Przebijające", "CoC7.CriticalTitle": "Obrażenia są krytyczne", @@ -208,24 +227,26 @@ "CoC7.OutOfAmmo": "Brak amunicji", "CoC7.OutOfShots": "Brak strzałów", - "CoC7.BonusDamageRoll": "Rzut bonusowych obrażen", + "CoC7.BonusDamageRoll": "Rzut bonusowych obrażeń", "CoC7.Type": "Typ", "CoC7.FightBack": "Kontratak", "CoC7.Dodge": "Unikanie", "CoC7.Maneuver": "Manewrowanie", + "CoC7.NoResponse": "Brak reakcji", "CoC7.OutNumbered": "Przewaga Liczebna", "CoC7.combatCard.surprised": "Zaskoczony", "CoC7.combatCard.autoSuccess": "Auto. Sukces", "CoC7.Advantage": "Przewaga", "CoC7.Disadvantage": "Niekorzyść", - "CoC7.TitleAdvantage": "Dodaj 1 dodatkową kość (target is prone, restrained...)", - "CoC7.TitleDisadvantage": "Dodaj 1 karną kość (for being prone, restrained...)", + "CoC7.TitleAdvantage": "Dodaj 1 dodatkową kość (cel jest podatny na atak, unieruchomiony...)", + "CoC7.TitleDisadvantage": "Dodaj 1 karną kość (za bycie podatnym na atak, unieruchomionym...)", "CoC7.TitleOutNumbered": "Dodaj 1 dodatkową kość za cel z przewagą liczebną", "CoC7.TitleSurprised": "Dodaj 1 dodatkową kość za zaskoczony cel", "CoC7.TitleAutoSuccess": "Atak automatycznie trafia", "CoC7.WinnerRollDamage": "{name} Wygrał. Rzuć na obrażenia.", + "CoC7.InitiatorMissed": "{name} nie trafił.", "CoC7.NoWinner": "Obie strony zawiodły.", - "CoC7.DodgeSuccess": "{name} unik!", + "CoC7.DodgeSuccess": "{name} unika!", "CoC7.ManeuverSuccess": "{name} manewr się udał.", "CoC7.AttackSuccess": "{name} zadał cios.", "CoC7.InflictPain": "Zadaj Obrażenia", @@ -235,7 +256,7 @@ "CoC7.DamageInflicted": "Zadano obrażenia", "CoC7.TotalDamage": "Całkowie obrażenia", - "CoC7.combatCard.dive4cover": "Skryj się za zasłoną", + "CoC7.combatCard.dive4cover": "Skryj się za osłoną", "CoC7.rangeCombatCard.SingleShot": "Pojedynczy Strzał", "CoC7.rangeCombatCard.MultipleShots": "Wielo. Strzał", @@ -245,7 +266,7 @@ "CoC7.rangeCombatCard.BaseRange": "Zasięg podstawowy", "CoC7.rangeCombatCard.LongRange": "Daleki zasięg", "CoC7.rangeCombatCard.ExtremeRange": "Ekstremalny zasięg", - "CoC7.rangeCombatCard.OutOfRange": "Po za zasięgiem", + "CoC7.rangeCombatCard.OutOfRange": "Poza zasięgiem", "CoC7.rangeCombatCard.Cover": "Za osłoną", "CoC7.rangeCombatCard.PointBlankRange": "Strzał z przyłożenia", "CoC7.rangeCombatCard.NormalTarget": "Normalny Cel", @@ -254,7 +275,7 @@ "CoC7.rangeCombatCard.FastMovingTarget": "Szybki cel", "CoC7.rangeCombatCard.InMelee": "Walka w wręcz", "CoC7.rangeCombatCard.aiming": "Celowanie", - "CoC7.rangeCombatDamage": "{name} Otrzymuje {total} punkty obrażenia", + "CoC7.rangeCombatDamage": "{name} Otrzymuje {total} punktów obrażenia", "CoC7.rangeCombatDamageArmor": "{name} dostał {total} obrażeń. ({armor} odparto)", "CoC7.RollDamage": "Rzuć na Obrażenia", "CoC7.BulletsFired": "Wystrzelono kule", @@ -289,7 +310,7 @@ "CoC7.SkillTotalExperience": "Punkty doświadczenia", "CoC7.SkillTotalArchetype": "Punkty archetypów", - "CoC7.SkillTotalOccupation": "Punkty Zawód", + "CoC7.SkillTotalOccupation": "Punkty zawodu", "CoC7.SkillTotalPersonal": "Punkty postaci", "CoC7.CharacteristicsPoints": "Punkty cech", "CoC7.TotalPoints": "Całkowite Punkty", @@ -303,7 +324,7 @@ "CoC7.WeaponDamage": "Obrażenia", "CoC7.Weapon.BlastRadius": "Promień wybuchu", "CoC7.WeaponMalfunction": "Awaria", - "CoC7.WeaponUsesPerRound": "Round(s)/use", + "CoC7.WeaponUsesPerRound": "Użycia na rundę", "CoC7.WeaponUsesPerRoundHint": "Ataki na rundę (1/3 : 1 atak na 3 rundy)", "CoC7.WeaponSheet.RoundsPerUse.Info": "Ile rund potrzeba, aby broń była gotowa do strzału", "CoC7.WeaponMax": "Maksymalna liczba użyć / runda", @@ -315,13 +336,14 @@ "CoC7.Armor": "Pancerz", "CoC7.EraNvct": "Invictus", - "CoC7.EraDrka": "Dark Ages", + "CoC7.EraDrka": "Mroczne czasy", "CoC7.EraDdts": "Down Darker Trails", "CoC7.EraGlit": "Cthulhu by Gaslight", - "CoC7.Era1920": "1920s", + "CoC7.Era1920": "1920", "CoC7.EraPulp": "Pulp Cthulhu", "CoC7.EraMdrn": "Współczesny", "CoC7.Eras": "Cthulhu Flavors", + "CoC7.EraAvailability": "Dostępność", "CoC7.SkillNoAdjustments": "Bez rozwoju", "CoC7.SkillNoXpGain": "Nie zdobywa się PD", @@ -329,8 +351,8 @@ "CoC7.SkillRarity": "Rzadki", "CoC7.SkillPush": "Forsowanie", "CoC7.SkillCombat": "Walka", - "CoC7.SkillFighting": "Walka Wrecz", - "CoC7.SkillFirearm": "Bron Palna", + "CoC7.SkillFighting": "Walka Wręcz", + "CoC7.SkillFirearm": "Broń Palna", "CoC7.WeaponRngd": "Zasięg", "CoC7.WeaponProperyManeuver": "Manewr", @@ -343,7 +365,7 @@ "CoC7.WeaponXplv": "Wybuchowy", "CoC7.WeaponBrst": "Seria", "CoC7.WeaponAuto": "Ogień Ciągły", - "CoC7.WeaponSpcl": "Specialny", + "CoC7.WeaponSpcl": "Specjalny", "CoC7.WeaponMont": "Zamontowany", "CoC7.WeaponDbrl": "Podwójna lufa", "CoC7.WeaponBlst": "Podmuch", @@ -353,20 +375,23 @@ "CoC7.Weapon.Property.Burn": "Podpala", "CoC7.Weapon.Property.Shotgun": "Strzelba", - "CoC7.ErrorItem": "Nie udało się znaleźć przedmiotu", - "CoC7.ErrorActor": "Couldn't locate actor", + "CoC7.ErrorItem": "Nie udało się odnaleźć przedmiotu", + "CoC7.ErrorActor": "Nie udało się odnaleźć postaci", "CoC7.ErrorInvalidFormula": "{value} nie jest prawidłową formułą", "CoC7.ErrorInvalid": "Nieprawidłowy", + "CoC7.ErrorInvalidCardType": "Typ karty", + "CoC7.ErrorInvalidRollType": "Typ rzutu", "CoC7.Validate": "Prawidłowy", "CoC7.Apply": "Zatwierdź", "CoC7.NewBioSectionName": "Nowa sekcja", - "CoC7.DodgeSkillName": "Uniki", + "CoC7.DodgeSkillName": "Unik", "CoC7.CthulhuMythosName": "Mity Cthulhu", "CoC7.CreditRatingSkillName": "Majętność", - "CoC7.FightingSpecializationName": "Walka Wrecz", - "CoC7.FirearmSpecializationName": "Bron Palna", + "CoC7.DriveAutoSkillName": "Prowadzenie Samochodu", + "CoC7.FightingSpecializationName": "Walka Wręcz", + "CoC7.FirearmSpecializationName": "Broń Palna", "CoC7.DriveSpecializationName": "Prowadzenie", "CoC7.PilotSpecializationName": "Pilotowanie", "CoC7.AnySpecName": "Każdy", @@ -377,29 +402,41 @@ "CoC7.AddSkill": "Dodaj umiejętność", "CoC7.DevelopemmentPhase": "Faza rozwoju", "CoC7.RecoverLuckPoints": "Odzyskaj Punkty Szczęścia", - "CoC7.SkillCantGainXp": "Umiejętności nie może automatycznie zdobyć doświadczenia", - "CoC7.SkillUnflagForDevelopement": "Odnzacz do rozwoju", + "CoC7.SkillCantGainXp": "Umiejętność nie może automatycznie zdobyć doświadczenia", + "CoC7.SkillUnflagForDevelopement": "Odznacz do rozwoju", "CoC7.SkillFlagForDevelopement": "Oznacz do rozwoju", "CoC7.RollAll4Dev": "Rzucanie wszystkich umiejętności na rozwój", "CoC7.RollLuck4Dev": "Rzut rozwoju szczęścia", - "CoC7.DevRollTitle": "Rzut {item} na rzozwój: {die}/{score}%", - "CoC7.DevSuccessDetails": "{item} upgraded by {augment}%", + "CoC7.DevRollTitle": "Rzut {item} na rozwój: {die}/{score}%", + "CoC7.DevSuccessDetails": "{item} został ulepszony o {augment}%", "CoC7.SanGained": "Odzyskałeś 2d6 ({results} = {sanGained}) Poczytalności po zwiększeniu {skill} do {skillValue}%", - "CoC7.DevFailureDetails": "{item} NOT upgraded", - "CoC7.DevSuccess": "{item} upgraded ({die}/{score}%) by {augment}%", - "CoC7.DevFailure": "{item} NOT upgraded ({die}/{score}%)", + "CoC7.DevFailureDetails": "NIE ulepszono {item}", + "CoC7.ReduceSanityLimits": "Zmniejsz wszystkie limity poczytalności o 1", + "CoC7.DevSuccess": "{item} ulepszony ({die}/{score}%) o {augment}%", + "CoC7.DevFailure": "{item} NIE ulepszony ({die}/{score}%)", "CoC7.LuckIncreased": "Zwiększono Szczęście ({die}/{score}) o {augment} punktów", "CoC7.LuckNotIncreased": "Nie udało się odzyskać szczęścia ({die}/{score})", - "CoC7.DevelopAttribWarn": "Możesz teraz zmieniać niektóry umiejętności w trybie rozwoju/kreacji.", + "CoC7.DevelopAttribWarn": "Nie możesz teraz zmieniać niektórych umiejętności w trybie rozwoju/kreacji.", "CoC7.SkillDetail": "Szczegóły", "CoC7.EditSkill": "Edytuj Umiejętność", - "CoC7.DeleteSkill": "Kasuj Umiejetność", + "CoC7.DeleteSkill": "Kasuj Umiejętność", "CoC7.RangeSkills": "Umiejętność zasięgowa", "CoC7.MeleeSkills": "Umiejętności walki wręcz", "CoC7.NewItemName": "Nowy przedmiot", "CoC7.AddItem": "Dodaj przedmiot", "CoC7.EditItem": "Edytuj przedmiot", "CoC7.DeleteItem": "Kasuj przedmiot", + "CoC7.TradeItem": "Przekaż / Przechowaj Przedmiot", + "CoC7.SortBySkillName": "Sortuj po nazwie", + "CoC7.SortBySkillValue": "Sortuj po wartości", + "CoC7.UncommonSkillsShow": "Pokaż rzadkie umiejętności", + "CoC7.UncommonSkillsHide": "Ukryj rzadkie umiejętności", + + "CoC7.NewBookName": "nowa księga", + "CoC7.AddBook": "Dodaj księgę", + "CoC7.NewSpellName": "nowe zaklęcie", + "CoC7.AddSpell": "Dodaj zaklęcie", + "CoC7.AddWeapon": "Dodaj broń", "CoC7.NewWeaponName": "Nowa broń", "CoC7.EditWeapon": "Edytuj broń", @@ -410,15 +447,16 @@ "CoC7.WeaponSkill": "Umiejętność", "CoC7.WeaponSkillAlt": "umiejętności alternatywne", "CoC7.Inventory": "Ekwipunek", + "CoC7.InventoryIsCurrentlyEmpty": "Ekwipunek jest pusty.", "CoC7.CharacterDevelopment": "Rozwój", "CoC7.OccupationSkill": "Umiejętności Zawodowe", "CoC7.ArchetypeSkill": "Umiejętności Archetypowe", "CoC7.UseFormula": "Użyj rzutu kostką", - "CoC7.EnterFormula": "Wprowadz formułę", + "CoC7.EnterFormula": "Wprowadź formułę", "CoC7.SanRollHint": "Rzuć test poczytalności dla celów", "CoC7.SANCheckTitle": "Utrata PP : {name} ({sanMin}/{sanMax})", - "CoC7.NoSkill": "Brak umięjętności", - "CoC7.AddWeapontHint": "

                                        {actor} nie mam {weapon}.
                                        Chcesz ją stworzyć ?

                                        ", + "CoC7.NoSkill": "Brak umiejętności", + "CoC7.AddWeapontHint": "

                                        {actor} nie ma {weapon}.
                                        Chcesz ją stworzyć ?

                                        ", "CoC7.LinkCheck": " {name} test", "CoC7.LinkCheckDiff": "[{difficulty}] {name} test", @@ -433,26 +471,44 @@ "CoC7.LinkItemModif": " {name} ({modifier})", "CoC7.LinkItemDiffModif": "[{difficulty}] {name} ({modifier})", - "CoC7.ManualCreditValues": "Manual Credit Values", + "CoC7.ManualCreditValues": "Ręczne Ustawienie Majątku", "CoC7.MonetarySymbol": "Symbol:", "CoC7.MonetaryFactor": "Czynnik:", - "CoC7.AutoCreditValues": "Toggle Automatic calculation", + "CoC7.AutoCreditValues": "Przełącz Automatyczne Obliczanie", "CoC7.MonetarySpendingLevel": "Poziom wydatków :", "CoC7.MonetaryCash": "Gotówka :", "CoC7.MonetarySpent": "Wydana :", "CoC7.MonetaryAssets": "Dobytek :", "CoC7.MonetaryAssetsDetails": "Szczegółowy Dobytek", - "CoC7.PossessionsNotes": "Notes :", - "CoC7.PossessionsNotesHolder": "Notes", + "CoC7.PossessionsNotes": "Notatki :", + "CoC7.PossessionsNotesHolder": "Notatki", "CoC7.BackgroundNewSection": "Dodaj nową Rubrykę", "CoC7.BackgroundSectionNameHolder": "Wprowadź nazwę rubryki", "CoC7.BackgroundDeleteSection": "Skasuj rubrykę", "CoC7.BackgroundSectionMoveUp": "Przenieś do góry", "CoC7.BackgroundSectionMoveDown": "Przenieś na dół", - - "CoC7.creatureFightingSkill": "Walka Wrecz", + "CoC7.BackgroundEncounters": "Spotaknia z dziwnymi istotami", + "CoC7.BackgroundFlags": "Flagi", + "CoC7.BackgroundFlagsMythosExperienced": "Przyznano 5% Grozy Mitów", + "CoC7.BackgroundFlagsMythosHardened": "Weteran Mitów", + + "CoC7.SanityLossEncounters": "Utrata Poczytalności ze Spotkań", + "CoC7.SanityLossImmunities": "Odporności na Utratę Poczytalności", + "CoC7.AddSanityLossEncounter": "Dodaj Utratę Poczytalności ze Spotkania", + "CoC7.AddSanityLossImmunity": "Dodaj Odporność na Utratę Poczytalności", + "CoC7.DeleteSanityLossEncounter": "Usuń Utratę Poczytalności ze Spotkania", + "CoC7.DeleteSanityLossImmunity": "Usuń Odporność na Utratę Poczytalności", + + "CoC7.SanityLossTypeDialogTitle": "Nowa Utrata Poczytalności lub Odporność", + "CoC7.SanityLossTypeDialogBody": "Dodaj nowe Spotkanie z Istotą z Mitów, Utratę Poczytalności, lub Odporność na Utratę Poczytalności do karty Badacza.", + "CoC7.SanityLossTypeReason": "Powód", + "CoC7.SanityLossTypeValue": "Stracone Punkty Poczytalności", + "CoC7.SanityLossEncounter": "Spotkania z dziwnymi istotami", + "CoC7.SanityLossImmunity": "Odporność na Utratę Poczytalności", + + "CoC7.creatureFightingSkill": "Walka Wręcz", "CoC7.InvoluntaryAction": "Mimowolne działanie", "CoC7.InvoluntaryActionPerfomed": "Wykonano mimowolne działanie", @@ -466,8 +522,8 @@ "CoC7.MemoryRepressed": "Twój umysł stłumił wspomnienia i skrył je w podświadomości.", "CoC7.RememberEverything": "Pamiętasz WSZYSTKO.", "CoC7.BoutOfMadnesslasted": "Twój atak szaleństwa trwał", - "CoC7.EnteringBoutOfMadness": "Doświadczas ataku szaleństwa", - "CoC7.GrowingAccustomedToAwfulness": "Przywyczajasz się do potworności. (Twoja utrata poczytalności została ograniczona).", + "CoC7.EnteringBoutOfMadness": "Doświadczasz ataku szaleństwa", + "CoC7.GrowingAccustomedToAwfulness": "Przyzwyczajasz się do potworności. (Twoja utrata poczytalności została ograniczona).", "CoC7.ImmuneToAwfulness": "Twój umysł jest odporny na potworności. (Brak utraty poczytalności).", "CoC7.InvestigatorPhobiaGained": "Badacz zdobył nową fobię", "CoC7.PhobiaGained": "Zdobyłeś nową fobię", @@ -487,10 +543,12 @@ "CoC7.MaxSanloss": "Max utrata", "CoC7.MinSanloss": "Min utrata", "CoC7.AlreadyLost": "Już stracono", + "CoC7.AlreadyEncountered": "Już spotkano", "CoC7.CreatureMaxLoss": "Max utrata potwora", "CoC7.MaxLossToCreature": "Max utrata przez potwora", - "CoC7.ResetCreatureSan": "Wyresetuj historię potwora", - "CoC7.ResetSpecieSan": "Wyresetuj historię gatunku", + "CoC7.MaxPossibleSanLoss": "Maksymalna możliwa utrata PP", + "CoC7.ResetCreatureSan": "Resetuj historię potwora", + "CoC7.ResetSpecieSan": "Resetuj historię gatunku", "CoC7.KeepData": "Zapisz dane potwora", "CoC7.BoutActive": "(Atak Sz.) Odporny na utratę PP", "CoC7.AlreadyInABout": "Już cierpisz na atak szaleństwa, dlatego jesteś odporny na kolejną utratę PP.", @@ -499,7 +557,7 @@ "CoC7.MythosAlreadyEncountered": "Nagródź Punktami Mitów (+1%)", "CoC7.DisregardMythosGain": "Nie zdobyto Punktów Mitów", "CoC7.MythosGain": "Zdobyto Punkty Mitów", - "CoC7.YouGainedCthulhuMythos": "Twój umysł drży przed nieziemską manifestacją (+{value}% Mitó Cthulhu)", + "CoC7.YouGainedCthulhuMythos": "Twój umysł drży przed nieziemską manifestacją (+{value}% Mitów Cthulhu)", "CoC7.CardResolved": "Karta rozwiązana", "CoC7.SpellCastingTime": "Czas rzucania", @@ -513,16 +571,18 @@ "CoC7.GateSpell": "Gate", "CoC7.CombatSpell": "Walka", "CoC7.SpellType": "Typ zaklęcia", + "CoC7.SpellSuccessfullyLearned": "Udało się nauczyć nowego zaklęcia: '{spell}'!", + "CoC7.SpellAlreadyLearned": "Zaklęcie ('{spell}') zostało już poznane wcześniej.", - "CoC7.BookHasNothingMoreToTeach": "{book} has nothing more to teach. Cthulhu Mythos skill of {actor} is greater than this Mythos Rating.", - "CoC7.BookType": "Typ Ksiązki", + "CoC7.BookHasNothingMoreToTeach": "{book} już niczego Cię nie nauczy. Poziom Mitów Cthulhu {actor} jest większy niż Wskaźnik Mitów księgi.", + "CoC7.BookType": "Typ Ksiąki", "CoC7.Content": "Zawartość", "CoC7.CthulhuMythosFinal": "Końcowe Mity Cthulhu", "CoC7.CthulhuMythosInitial": "Początkowe Mity Cthulhu", "CoC7.Development": "Rozwój", "CoC7.DifficultyLevel": "Poziom Trudności", "CoC7.DragSpell": "Przeciągnij tu zaklęcia, by wstawić je do książki", - "CoC7.FullStudies": "Pełne przestutiowanie", + "CoC7.FullStudies": "Pełne przestudiowanie", "CoC7.Gains": "Postęp", "CoC7.GainsForReading": "Postęp Umiejętności po przeczytaniu {book}.", "CoC7.InitialReading": "Czytanie wstępne", @@ -531,7 +591,7 @@ "CoC7.MarkedForDevelopment": "Oznaczono do rozwoju", "CoC7.Mythos": "Księga Mitów", "CoC7.MythosRating": "Wskaźnik Mitów", - "CoC7.NotOwned": "Tak książka musi być w posiadaniu postaci by wykonać tę akcję.", + "CoC7.NotOwned": "Tak przedmiot musi być w posiadaniu postaci by wykonać tę akcję.", "CoC7.Occult": "Okultystyczna", "CoC7.Points": "punkt/punkty", "CoC7.Progress": "Progres", @@ -548,12 +608,12 @@ "CoC7.Origin": "Pochodzenie", "CoC7.ArmedVehicle": "Pojazd Opancerzony", - "CoC7.PulpTalents": "Pulpowe Umiejetności", - "CoC7.TalentType": "Typ umiejętności", + "CoC7.PulpTalents": "Pulpowe Talenty", + "CoC7.TalentType": "Typ talentu", "CoC7.PhysicalTalent": "Fizyczny", "CoC7.MentalTalent": "Umysłowy", - "CoC7.CombatTalent": "Walka", - "CoC7.MiscellaneousTalent": "Różne", + "CoC7.CombatTalent": "Bojowy", + "CoC7.MiscellaneousTalent": "Użytkowy", "CoC7.BasicTalent": "Podstawowy", "CoC7.InsaneTalent": "Szalony", "CoC7.OtherTalent": "Inny", @@ -582,16 +642,17 @@ "CoC7.Choose": "Liczba możliwych do wyboru", "CoC7.Chosen": "Wybrany", "CoC7.EmptySkillList": "Dodaj umiejętność, upuszczając ją tutaj.", - "CoC7.EmptyItemList": "Dodaj przedmiot, upuszczająć go tutaj.", - "CoC7.PersonalSpeciality": "Number of personal or era specialty", + "CoC7.EmptyItemList": "Dodaj przedmiot, upuszczając go tutaj.", + "CoC7.EmptyCharacterSkillList": "Dodaj ustawienie, zawód lub umiejętność przeciągając je tutaj.", + "CoC7.PersonalSpeciality": "Ilość specjalizacji osobistych lub z epoki", "CoC7.AdditionalSkills": "Dowolna Umiejętność", "CoC7.SkillSelectionWindow": "Wybierz opcjonalne umiejętności", - "CoC7.SelectPersonalSkills": "Wybierz {number} umiejętnośc(s) jako umiejętności związane z zainteresowaniami osobistymi", + "CoC7.SelectPersonalSkills": "Wybierz {number} umiejętność(i) jako umiejętności związane z zainteresowaniami osobistymi", "CoC7.ResetOccupation": "Resetuj Zawód", - "CoC7.ResetOccupationHint": "Postać {name} obencnie posaida zawód. Zresetować go?", + "CoC7.ResetOccupationHint": "Postać {name} obecnie posiada zawód. Zresetować go?", "CoC7.ResetArchetype": "Zresetuj Archetyp", "CoC7.ResetArchetypeHint": "Gracz {name} ma już archetyp. Czy chcesz go zresetować?", - "CoC7.CreditOutOfRange": "Credit rating should be between {min} and {max}", + "CoC7.CreditOutOfRange": "Wartość Majętności musi być między {min} a {max}", "CoC7.BioSections": "Sekcja biograficzne", "CoC7.BioSectionName": "Nazwa sekcji biografii", "CoC7.SpendPoints": "Przydziel punkty cechą", @@ -633,9 +694,12 @@ "CoC7.WarnNoControlledActor": "Nie kontrolujesz żadnych postaci", "CoC7.WarnFastTargetWithWrongMOV": "Postać jest szybka, ale jej Ruch jest mniejszy niż 8. (MOV: {mov})", "CoC7.WarnTooManyTarget": "Zaznaczono za dużo celów. Zachowano zaznaczenie ostatniego celu", + "CoC7.WarnNoTargetsSanCheck": "Nie zaznaczyłeś żadnego celu. Albo zaznacz cel albo stwórz link.", + "CoC7.allActors": "Wszystkie postacie", + "CoC7.restTargets": "Cele odpoczynku", "CoC7.startRest": "Rozpocznij odpoczynek", - "CoC7.dreaming": "Badacze śnią...", + "CoC7.dreaming": "Badacze śpią...", "CoC7.healthRecovered": "Odzyskano 1 Punkt Wytrzymałości", "CoC7.pulpHealthRecovered": "Odzyskano {number} Punktów Wytrzymałości", "CoC7.dailySanLossRestarted": "Zrestartowano licznik dziennego spadku PP", @@ -652,24 +716,24 @@ "CoC7.InfoLessSkillThanOptions": "Jest tylko {skillCount} i {optionsCount} opcji, dodaję wszystkie", "CoC7.InfoAllSkillsAlreadySelected": "Wszystkie umiejętności już zaznaczone.", - "CoC7.MessageCheckRequestedWait": "Strażnik rząda testu {check}.
                                        Zaczekaj przed kliknięciem!
                                        ", - "CoC7.MessageTargetCheckRequested": "Strażnik rząda testu {check} od {name}.", + "CoC7.MessageCheckRequestedWait": "Strażnik żąda testu {check}.
                                        Zaczekaj przed kliknięciem!
                                        ", + "CoC7.MessageTargetCheckRequested": "Strażnik żąda testu {check} od {name}.", "CoC7.MessageTitleSelectSingleUserForTarget": "Która postać może zareagować na atak", "CoC7.MessageSelectSingleUserForTarget": "Ten token jest kontrolowany przez wielu Graczy. Wybierz Gracza, który zareaguje na ten atak.", - "CoC7.MessageSelectedTargetIsNotControlled": "Token {name} nie może zareagować na atak, ponieważ nie jest kontrolowany przez żadnego gracza.", "CoC7.MessageBoutOfMadnessTableNotFound": "Nie znaleziono wyniku z tablicy niepoczytalności. Upewnij się, że wszystkie tablice niepoczytalności zostały stworzone", "CoC7.MessageBoutOfMadnessItemNotFound": "Nie znaleziono wyniku z tablicy niepoczytalności. Upewnij się, że wszystkie statusy niepoczytalności zostały stworzone", "CoC7.DealDamage": "Zadać {damage} punktów obrażeń {target}?", - "CoC7.NoTargetSelected": "Nie zaznaczyłeś celu dla testsu {weapon}. Chcesz kontynuować?", + "CoC7.NoTargetSelected": "Nie zaznaczyłeś celu dla testu {weapon}. Chcesz kontynuować?", "CoC7.Import": "Import", "CoC7.Proceed": "Kontynuuj", "CoC7.Cancel": "Anuluj", "CoC7.ActorImporter": "Import postaci", - "CoC7.ActorImporterSummary": "Zaimportuj BN albo Potwora z opisu i statystyk. Po prostu wklej odpowiedni text", + "CoC7.ActorImporterSummary": "Zaimportuj BN albo Potwora z opisu i statystyk. Po prostu wklej odpowiedni tekst", "CoC7.PasteTheDataBelow": "Wklej tekst poniżej", + "CoC7.TextFieldInvalidCharacters": "W tekście występują nieprawidłowe znaki. Napraw to, albo zostaną automatycznie usunięte", "CoC7.SelectActorType": "Wybierz typ postaci", "CoC7.NonPlayingCharacter": "Bohater Neutralny (BN)", "CoC7.Creature": "Potwór", @@ -680,34 +744,95 @@ "CoC7.English": "Angielski", "CoC7.Spanish": "Hiszpański", "CoC7.French": "Francuski", + "Coc7.German": "Niemiecki", + "Coc7.Polish": "Polski", + "CoC7.TraditionalChinese": "Chiński Tradycyjny", "CoC7.SelectSourceLanguage": "Wybierz źródło języka tekstu", "CoC7.ImportedUnnamedCharacter": "Zaimportowano nienazwaną postać", - "CoC7.CreatedImportedCharactersFolder": "Stworzono 'Imported Characters' folder'", + "CoC7.CreatedImportedCharactersFolder": "Stworzono folder 'Imported Characters''", + "CoC7.ImportedCharactersFolder": "Zaimportowano postacie", + "CoC7.ImportSkillItemLocations": "Szukaj umiejętności/przedmiotów/broni w", + "CoC7.ImportActorItemsNone": "Brak", + "CoC7.ImportActorItemsItem": "Przedmioty", + "CoC7.ImportActorItemsItemWorldModuleSystem": "Przedmioty / Świat / Moduły / System", + "CoC7.ImportActorItemsWorldModuleItemSystem": "Świat / Moduły / Przedmioty / System", "CoC7.HowToTranslateTitle": "Jak przetłumaczyć?", "CoC7.HowToTranslateWarning": "Nie instaluj żadnych modułów, którym nie ufasz.", "CoC7.HowToTranslateInstallBabele": "Zainstaluj/Zaktualizuj moduł Babele z menedżera modułów Foundry.", "CoC7.HowToTranslateInstallTranslation": "Zainstaluj/Zaktualizuj Tłumaczenie z menedżera modułów Foundry.", "CoC7.HowToTranslateEnableTranslation": "W Świecie Gry, pod zakładką Configuration/Manage Modules włącz Babele i tłumaczenia.", - "CoC7.HowToTranslateNoTranslation": "Inkstrukcje do tworzenia nowych tłumaczeń są dostępne w istniejących już modułach tłumaczeń.", + "CoC7.HowToTranslateNoTranslation": "Instrukcje do tworzenia nowych tłumaczeń są dostępne w istniejących już modułach tłumaczeń.", "CoC7.Migrate.Title": "Wymagana aktualizacja", "CoC7.Migrate.Message": "

                                        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": "
                                        1. Lewy PM test z opcjami
                                        2. Shift + Lewy PM Natychmiastowy test z normalną trudnością
                                        1. Prawy PM Test przeciwstawny z opcjami
                                        2. Shift + Prawy PM Natychmiastowy test przeciwstawny
                                        1. Alt/Option + Prawy PM Test łączony z opcjami
                                        ", + "CoC7.ToolTipKeeperSkill": "
                                        1. CTRL + Lewy PM Stwórz odnośnik do testu
                                        2. {other}
                                        ", + "CoC7.ToolTipKeeperStandbySkill": "
                                      3. Lewy PM Zażądaj testu od {name}
                                      4. ", + "CoC7.ToolTipDB": "
                                        1. Lewy PM Natychmiastowy test z normalną trudnością
                                        ", + "CoC7.ToolTipSanity": "
                                        1. Lewy PM rzut z opcjami
                                        2. Alt/Option + Lewy PM rzut na poczytalność z opcjami
                                        3. Shift + Lewy PM Natychmiastowy rzut z normalną trudnością
                                        4. Shift + Alt/Option + Lewy PM rzut na poczytalność bez dodatkowych kości
                                        1. Prawy PM Rzut przeciwstawny z opcjami
                                        2. Shift + Prawy PM Natychmiastowy rzut przeciwstawny
                                        1. Alt/Option + Prawy PM Test łączony z opcjami
                                        2. Shift + Alt/Option + Prawy PM Natychmiastowy test łączony
                                        ", + "CoC7.ToolTipCombat": "
                                        1. Lewy PM rzut z opcjami
                                        2. Shift + Lewy PM Natychmiastowy rzut z normalną trudnością
                                        1. Prawy PM Przeciwstawny Manewr z opcjami
                                        2. Shift + Right click Natychmiastowy Przeciwstawny Manewr
                                        ", + "CoC7.ToolTipKeeperSanity": "
                                      5. CTRL + Alt/Option Stwórz odnośnik do testu poczytalności
                                      6. ", + "CoC7.ToolTipAutoToggle": "
                                        1. Lewy PM Przełącz automatyczne obliczenia / ręczne wpisy
                                        2. ", + "CoC7.ToolTipSkillFlagToggle": "
                                          1. Dwukrotne kliknięcie Przełącz flagę
                                          2. ", + "CoC7.ToolTipSkillFlagged": "Oznaczone do rozwoju", + "CoC7.ToolTipSkillUnflagged": "Nie oznaczone do rozwoju", + "SETTINGS.TitleRules": "Zasady", "SETTINGS.TitleInitiative": "Początkowe ustawienia", "SETTINGS.TitleRoll": "Ustawienia rzutów", "SETTINGS.TitleChatCards": "Ustawienia Kart Czatu", "SETTINGS.TitleScene": "Ustawienia Sceny", "SETTINGS.TitleSheet": "Ustawienia Kart", + "SETTINGS.TitleGameArtwork": "Ustawienia Grafik Gry", "SETTINGS.TitleWeapon": "Ustawienia Broni", "SETTINGS.TitleDiceSoNice": "Ustawienia Dice So Nice", - "SETTINGS.TitleDeveloperDebug": "Ustawienia developera i Debuggowania", + "SETTINGS.TitleDeveloperDebug": "Ustawienia developera i Debugowania", "SETTINGS.TitleRollTable": "Ustawienia Tabel Rzutów", "SETTINGS.DebugMode": "System Debug Mode", "SETTINGS.DebugModeHint": "!!WYMAGANE PONOWNE URUCHOMIENIE!!", @@ -715,6 +840,7 @@ "SETTINGS.DefaultDifficultyHint": "Możesz wybrać domyślną trudność testów. Nieznana będzie wykonywać rzuty bez informowania graczy o trudności.", "SETTINGS.CheckDifficultyRegular": "Domyślna trudność", "SETTINGS.CheckDifficultyUnknown": "Nieznana trudność", + "SETTINGS.showIconsOnly": "Na skróconej wersji karty, pokaż tylko ikony na liście umiejętności.", "SETTINGS.UseToken": "Użyj obrazka tokena", "SETTINGS.UseTokenHint": "Użyj obrazka tokena zamiast portretów w kartach czatu", "SETTINGS.DisplayActorOnCard": "Pokaż postać w karcie czatu", @@ -723,14 +849,14 @@ "SETTINGS.InitiativeRuleHint": "Możesz wybrać podstawową zasadę inicjatywy (używającej ZR) lub opcjonalnej zasady (rzut kością)", "SETTINGS.InitiativeRuleBasic": "Podstawowa", "SETTINGS.InitiativeRuleOptional": "Opcjonalna", - "SETTINGS.displayInitDices": "Pokaż kość inicjatywty", - "SETTINGS.displayInitDicesHint": "Pokaż kość inicjatywty przy rzucaniu na inicjatywę (Tylko Opcjonalne zasady)", + "SETTINGS.displayInitDices": "Pokaż kość inicjatywy", + "SETTINGS.displayInitDicesHint": "Pokaż kość inicjatywy przy rzucaniu na inicjatywę (Tylko Opcjonalne zasady)", "SETTINGS.displayInitAsText": "Pokaż tekst inicjatywy", "SETTINGS.displayInitAsTextHint": "Wyświetl wartość inicjatywy jako tekst zamiast liczby (Tylko Opcjonalne zasady)", "SETTINGS.PulpRules": "Zasady Pulpowe", - "SETTINGS.PulpRulesHint": "Pozwód na użycie zasad Pulpowych (Achetypy, Talenty, PW), !wczesna implementacja!", + "SETTINGS.PulpRulesHint": "Pozwól na użycie zasad Pulpowych (Archetypy, Talenty, PW), !wczesna implementacja!", "SETTINGS.developmentRollForLuck": "Odzyskiwanie punktów Szczęścia", - "SETTINGS.developmentRollForLuckHint": "Każdy gracz może rzucić na rozwój szczęścia podcza Fazy Rozwoju", + "SETTINGS.developmentRollForLuckHint": "Każdy gracz może rzucić na rozwój szczęścia podczas Fazy Rozwoju", "SETTINGS.displayPlayerNameOnSheet": "Pokaż imię Gracza na karcie postaci", "SETTINGS.DisregardAmmo": "Ignoruj amunicję.", "SETTINGS.DisregardAmmoHint": "Włączenie tej opcji spowoduje ignorowanie ilości amunicji w broni.", @@ -741,21 +867,27 @@ "SETTINGS.StatusPlayerEditable": "Gracze mogą modyfikować statusy", "SETTINGS.StatusPlayerEditableHint": "Pozwól graczom na modyfikację swoich statusów (powalony, nieprzytomny, umierający, martwy) i na reset ich dziennego spadku poczytalności", "SETTINGS.SyncDice3D": "[DsN] Synchronizacja kostek", - "SETTINGS.SyncDice3DHint": "Używająć modułu DsN, synchronizuj kości między klientami", + "SETTINGS.SyncDice3DHint": "Używając modułu DsN, synchronizuj kości między klientami", "SETTINGS.UnitDieColorset": "[DsN] Kolory kości jednostek", - "SETTINGS.UnitDieColorsetHint": "Używająć modułu DsN, kolory dla kości jednostek. (domyślnie używa ustawień gracza)", + "SETTINGS.UnitDieColorsetHint": "Używając modułu DsN, kolory dla kości jednostek. (domyślnie używa ustawień gracza)", "SETTINGS.TenDieNoMod": "[DsN] Kolory kości dziesiątek", - "SETTINGS.TenDieNoModHint": "Używająć modułu DsN, kolory dla kości dziesiątek. (domyślnie używa ustawień gracza)", - "SETTINGS.TenDieBonus": "[DsN] Kolroy kości premiowych", - "SETTINGS.TenDieBonusHint": "Używająć modułu DsN, kolory dla kości premiowych. (domyślnie używa ustawień gracza)", - "SETTINGS.TenDiePenalty": "[DsN] Kolroy kości karnych", - "SETTINGS.TenDiePenaltyHint": "Używająć modułu DsN, kolory dla kości karnych. (domyślnie używa ustawień gracza)", + "SETTINGS.TenDieNoModHint": "Używając modułu DsN, kolory dla kości dziesiątek. (domyślnie używa ustawień gracza)", + "SETTINGS.TenDieBonus": "[DsN] Kolory kości premiowych", + "SETTINGS.TenDieBonusHint": "Używając modułu DsN, kolory dla kości premiowych. (domyślnie używa ustawień gracza)", + "SETTINGS.TenDiePenalty": "[DsN] Kolory kości karnych", + "SETTINGS.TenDiePenaltyHint": "Używając modułu DsN, kolory dla kości karnych. (domyślnie używa ustawień gracza)", + "SETTINGS.OverrideGameArtwork": "Nadpisz grafiki gry", + "SETTINGS.OverrideGameArtworkHint": "!!WYMAGANY RESTART!! daje dostęp do zaawansowanych ustawień gry, zostaw puste dla domyślnych ustawień", + "SETTINGS.ArtPauseImage": "Obrazek pauzy", + "SETTINGS.ArtPauseImageHint": ". Wpisz 'null', żeby usunąć obrazek", + "SETTINGS.ArtPauseText": "Tekst pauzy", + "SETTINGS.ArtPauseTextHint": "Zostaw puste dla domyślnych ustawień", "SETTINGS.OverrideSheetArtwork": "Nadpisanie Grafiki Karty Postaci", "SETTINGS.OverrideSheetArtworkHint": "!!WYMAGANY RESTART!! daje możliwość konfiguracji karty, zostaw puste dla domyślnych ustawień", "SETTINGS.ArtWorkSheetBackground": "Tło karty postaci", "SETTINGS.ArtWorkSheetBackgroundHint": "wpisz 'null' żeby usunąć tło", "SETTINGS.ArtWorkSheetBackgroundType": "Typ tła", - "SETTINGS.BackgroundSlice": "Obraze tła będzie przycięty (css:border-image)", + "SETTINGS.BackgroundSlice": "Obrazek tła będzie przycięty (css:border-image)", "SETTINGS.BackgroundAuto": "Skaluj obraz, zachowując proporcje (css:auto)", "SETTINGS.BackgroundContain": "Skaluj obraz bez przycinania/rozciągania (css:contain)", "SETTINGS.BackgroundCover": "Skaluj obraz z przycinaniem/rozciąganiem (css:cover)", @@ -774,7 +906,7 @@ "SETTINGS.ArtworkMainFont": "Główna czcionka", "SETTINGS.ArtworkMainFontBold": "Główna czcionka (bold)", "SETTINGS.ArtworkMainFontSize": "Domyślny rozmiar czcionki (px)", - "SETTINGS.BoutOfMadnessSummaryTable": "Tabela Ataków Szaleństwa (Podsumwoanie)", + "SETTINGS.BoutOfMadnessSummaryTable": "Tabela Ataków Szaleństwa (Podsumowanie)", "SETTINGS.BoutOfMadnessRealTimeTable": "Tabela Ataków Szaleństwa (W Czasie Rzeczywistym)", "SETTINGS.LetKeeperDecide": "Pozwól Strażnikowi Decydować", "SETTINGS.DisplayResultType": "Wyświetl typ wyniku rzutu kostką (tekst)", @@ -797,7 +929,16 @@ "SETTINGS.AdviseOwnersOnly": "Powiadom właściciela postaci", "SETTINGS.AdviseAllPlayer": "Powiadom wszystkich graczy", "SETTINGS.OneBlockBackStory": "Historia postaci w jednym bloku", - "SETTINGS.OneBlockBackStoryHint": "Zmienia obiekt historii postaci w jeden blok, ale możesz go formwatować i dodawać odnośniki.", + "SETTINGS.OneBlockBackStoryHint": "Zmienia obiekt historii postaci w jeden blok, ale możesz go formatować i dodawać odnośniki.", "SETTINGS.EnableStatusIcons": "Włącz ikony statusów", - "SETTINGS.EnableStatusIconsHint": "Ustaw czy chcesz, żeby statusy walki i poczytalności były widoczne na tokenach." + "SETTINGS.EnableStatusIconsHint": "Ustaw czy chcesz, żeby statusy walki i poczytalności były widoczne na tokenach.", + "SETTINGS.ShowExperimentalFeatures": "Pokaż Funkcjonalności Eksperymentalne", + "SETTINGS.ShowExperimentalFeaturesHint": "Twój świat może przestać działać w kolejnej wersji systemu, jeśli będziesz używać tych funkcji. Tylko do testów, NIE UŻYWAJ tych funkcjonalności w normalnej rozgrywce", + "CoC7.ExperimentalFeaturesWarning": "Ta funkcjonalność jest nadal w fazie rozwoju, nie jest zalecane używanie jej w normalnej rozgrywce.", + "SETTINGS.CheckElevation": "Uwzględnij wysokość w obliczaniu odległości", + "SETTINGS.CheckElevationHint": "Uwzględnij wysokość w obliczaniu odległości w walce dystansowej", + "CoC7.toolTipDelay": "Opóźnienie w milisekundach między najechaniem myszką na umiejętność, a wyświetleniem okienka podpowiedzi. Ustaw '0' dla braku opóźnienia.", + + "CoC7.getTheExample": "Skopiuj przykład", + "CoC7.Copied": "Skopiowano przykładowy tekst do schowka" } diff --git a/lang/pt-BR.json b/lang/pt-BR.json index 229d0f31..06076d52 100644 --- a/lang/pt-BR.json +++ b/lang/pt-BR.json @@ -1,14 +1,12 @@ { "I18N.LANGUAGE": "Português (Brasil)", "I18N.MAINTAINERS": "@Castanho#3271 reviewed by zorieuq360#6074", - "CoC7.title": "Chamado de Cthulhu 7ª Edição (Não-oficial)", - + "CoC7.Entities.Container": "Contêiner", "CoC7.Entities.Character": "Personagem", "CoC7.Entities.Creature": "Criatura", "CoC7.Entities.Npc": "PNJ", "CoC7.Entities.Vehicle": "Veículo", - "CoC7.Entities.Archetype": "Arquétipo", "CoC7.Entities.Book": "Livro", "CoC7.Entities.Chase": "Perseguição", @@ -20,7 +18,6 @@ "CoC7.Entities.Status": "Condição", "CoC7.Entities.Talent": "Talento", "CoC7.Entities.Weapon": "Arma", - "CHARAC.STR": "FOR", "CHARAC.Strengh": "Força", "CHARAC.Strength": "Força", @@ -38,7 +35,6 @@ "CHARAC.Power": "Poder", "CHARAC.EDU": "EDU", "CHARAC.Education": "Educação", - "CoC7.PlayerName": "Jogador", "CoC7.Name": "Nome", "CoC7.Archetype": "Arquétipo", @@ -93,6 +89,7 @@ "CoC7.Spells": "Feitiços", "CoC7.Spell": "Feitiço", "CoC7.Spells&Notes": "Feitiços e Anotações", + "CoC7.Weapons": "Armas", "CoC7.Effects": "Efeitos", "CoC7.Cost": "Custo", "CoC7.Source": "Origem", @@ -120,12 +117,19 @@ "CoC7.Icon": "Ícone", "CoC7.Check": "Teste", "CoC7.ItemWeapon": "Item (Arma)", - + "CoC7.AttacksPerRound": "Ataques por Turno", + "CoC7.Cast": "Conjurar", + "CoC7.SanityCost": "Custo em Sanidade", + "CoC7.PowerCost": "Custo em Poder", + "CoC7.HitPointsCost": "Custo em Vida", + "CoC7.MagicPointsCost": "Custo em Magia", + "CoC7.OtherCosts": "Outros Custos", + "CoC7.CastingSpell": "Conjurando {spell}.", + "CoC7.NotEnoughMagicPoints": "{spell} custa {originalMagicPoints} Pontos de Magia, mas você tem apenas {actorMagicPoints}. Gostaria de retirar os restantes {convertedHitPoints} dos seus Pontos de Vida? Você irá levar {convertedHitPoints} de dano se proceder.", "CoC7.CopyToClipboard": "Copiar para Área de Transferência", "CoC7.WhisperToSelection": "Sussurrar aos Tokens Selecionados", "CoC7.WhisperTo": "Sussurrar para:", "CoC7.SendToChat": "Enviar no Chat", - "CoC7.RegularSuccess": "Sucesso Regular", "CoC7.HardSuccess": "Sucesso Sólido", "CoC7.ExtremeSuccess": "Sucesso Extremo", @@ -133,7 +137,6 @@ "CoC7.Fumble": "Falha Crítica", "CoC7.Failure": "Falha", "CoC7.Malfunction": "{itemName} sofreu um defeito", - "CoC7.Dice": "Dados", "CoC7.DiceModifierBonus": "Dado(s) de Bônus", "CoC7.DiceModifierPenalty": "Dado(s) de Penalidade", @@ -164,9 +167,7 @@ "CoC7.RollSecretDice": "O Guardião realizou um teste privado.", "CoC7.KeeperSentDecoy": "Rolagem falsa enviada aos jogadores.", "CoC7.FakeRoll": "Fingir Rolagem", - "CoC7.ConstitutionCheck": "Teste de Constituição", - "CoC7.SanDataSelectionWindow": "Selecione as perdas de Sanidade", "CoC7.BonusSelectionWindow": "Janela de seleção de bônus", "CoC7.BonusSelectionWindowNamed": "Selecionar modificador para teste de {name}", @@ -195,11 +196,9 @@ "CoC7.CombinedAnyHint": "Algum dos Testes deve ter Sucesso", "CoC7.CombinedAllHint": "Todos os Testes devem ter Sucesso", "CoC7.CloseCard": "Finalizar Cartão", - "CoC7.CheckResult": "Teste de {name} ({value}%) - Dificuldade {difficulty}", "CoC7.ItemCheckResult": "{item} - Teste de {skill} ({value}%) - Dificuldade {difficulty}", "CoC7.CheckRawValue": "({rawvalue}%) - Dificuldade {difficulty}", - "CoC7.ArmorAbsorbsDamage": "Armadura Absorve o Dano", "CoC7.Critical": "Crítico", "CoC7.Impale": "Empalamento", @@ -211,12 +210,12 @@ "CoC7.ShotIsImpossible": "O Disparo é Impossível", "CoC7.OutOfAmmo": "Sem Munição", "CoC7.OutOfShots": "Sem Disparos", - "CoC7.BonusDamageRoll": "Jogando Dano Extra", "CoC7.Type": "Tipo", "CoC7.FightBack": "Contra-Ataque", "CoC7.Dodge": "Esquivar", "CoC7.Maneuver": "Manobra", + "CoC7.NoResponse": "Não Agir", "CoC7.OutNumbered": "Desvantagem Numérica", "CoC7.combatCard.surprised": "Surpreso", "CoC7.combatCard.autoSuccess": "Sucesso Automático", @@ -228,6 +227,7 @@ "CoC7.TitleSurprised": "Adicionar 1 Dado de Bônus por alvo Surpreso", "CoC7.TitleAutoSuccess": "Ataque automaticamente acerta", "CoC7.WinnerRollDamage": "{name} ganhou. Jogue o dano.", + "CoC7.InitiatorMissed": "{name} não encontrado.", "CoC7.NoWinner": "Ambos falharam.", "CoC7.DodgeSuccess": "{name} esquivou!", "CoC7.ManeuverSuccess": "A manobra de {name} teve sucesso.", @@ -238,9 +238,7 @@ "CoC7.Tie": "Empate", "CoC7.DamageInflicted": "Dano Infringido", "CoC7.TotalDamage": "Dano Total", - "CoC7.combatCard.dive4cover": "Buscar cobertura", - "CoC7.rangeCombatCard.SingleShot": "Disparo Simples", "CoC7.rangeCombatCard.MultipleShots": "Disparo Múltiplo", "CoC7.AutomaticFire": "Fogo Automático", @@ -274,14 +272,11 @@ "CoC7.rangeCombatCard.NormalTargetTitle": "O alvo tem um tamanho padrão, sem bônus ou penalidades.", "CoC7.rangeCombatCard.InMeleeTitle": "1 Dado de Penalidade. O alvo está engajado em combate corpo-a-corpo.", "CoC7.rangeCombatCard.FastMovingTargetTitle": "1 Dado de Penalidade. O alvo é veloz (MOV maior que 8) e está movendo-se rapidamente.", - "CoC7.meleeCombatDamageTakes": "recebe", "CoC7.meleeCombatDamageFrom": "de", "CoC7.meleeCombatDamageDeals": "causa", "CoC7.meleeCombatDamageWith": "com", - "CoC7.DropZone": "DropZone", - "CoC7.Value": "Valor", "CoC7.SkillValue": "Valor da Perícia", "CoC7.SkillBase": "Valor Base", @@ -290,14 +285,12 @@ "CoC7.SkillArchetype": "Perícias de Arquétipo", "CoC7.SkillOccupation": "Perícias da Ocupação", "CoC7.SkillPersonal": "Perícias Pessoais", - "CoC7.SkillTotalExperience": "Pontos de Experiência", "CoC7.SkillTotalArchetype": "Pontos de Arquétipo", "CoC7.SkillTotalOccupation": "Pontos de Ocupação", "CoC7.SkillTotalPersonal": "Pontos Pessoais", "CoC7.CharacteristicsPoints": "Pontos de Características", "CoC7.TotalPoints": "Total de Pontos de Ocupação", - "CoC7.ItemQuantity": "Quantidade", "CoC7.ItemWeight": "Peso", "CoC7.ItemDetails": "Detalhes", @@ -317,7 +310,6 @@ "CoC7.WeaponSpecial": "Especial", "CoC7.ItemPrice": "Preço", "CoC7.Armor": "Armadura", - "CoC7.EraNvct": "Invictus", "CoC7.EraDrka": "Idade das Trevas", "CoC7.EraDdts": "Entre Trilhas Sombrias", @@ -326,7 +318,6 @@ "CoC7.EraPulp": "Cthulhu Pulp", "CoC7.EraMdrn": "Moderno", "CoC7.Eras": "Cthulhu Através das Eras", - "CoC7.SkillNoAdjustments": "Sem Ajustes", "CoC7.SkillNoXpGain": "Sem ganho de Experiência", "CoC7.SkillSpecial": "Especialização", @@ -335,7 +326,6 @@ "CoC7.SkillCombat": "Combate", "CoC7.SkillFighting": "Lutar", "CoC7.SkillFirearm": "Armas de Fogo", - "CoC7.WeaponRngd": "Alcance", "CoC7.WeaponProperyManeuver": "Manobra", "CoC7.WeaponTouch": "Toque", @@ -356,19 +346,17 @@ "CoC7.Weapon.Property.Thrown": "Arremessável", "CoC7.Weapon.Property.Burn": "Queimar", "CoC7.Weapon.Property.Shotgun": "Espingarda", - "CoC7.ErrorItem": "Item não Encontrado", "CoC7.ErrorActor": "Ator não Encontrado", "CoC7.ErrorInvalidFormula": "{value} não é uma fórmula válida", "CoC7.ErrorInvalid": "Inválido", "CoC7.Validate": "Validar", "CoC7.Apply": "Aplicar", - "CoC7.NewBioSectionName": "Nova Seção", - "CoC7.DodgeSkillName": "Esquivar", "CoC7.CthulhuMythosName": "Mythos de Cthulhu", "CoC7.CreditRatingSkillName": "Nível de Crédito", + "CoC7.DriveAutoSkillName": "Dirigir Automóveis", "CoC7.FightingSpecializationName": "Lutar", "CoC7.FirearmSpecializationName": "Armas de Fogo", "CoC7.DriveSpecializationName": "Dirigir", @@ -376,7 +364,6 @@ "CoC7.AnySpecName": "Genérica", "CoC7.BoutOfMadnessName": "Acesso de Loucura", "CoC7.InsanityName": "Insanidade", - "CoC7.NewSkillName": "Nova Perícia", "CoC7.AddSkill": "Adicionar perícia", "CoC7.DevelopemmentPhase": "Fase de Desenvolvimento", @@ -404,6 +391,15 @@ "CoC7.AddItem": "Adicionar Item", "CoC7.EditItem": "Editar Item", "CoC7.DeleteItem": "Deletar Item", + "CoC7.TradeItem": "Repassar Item", + "CoC7.SortBySkillName": "Ordenar perícias por nome", + "CoC7.SortBySkillValue": "Ordenar perícias por pontos", + "CoC7.UncommonSkillsShow": "Mostrar perícias incomuns", + "CoC7.UncommonSkillsHide": "Ocultar perícias incomuns", + "CoC7.NewBookName": "novo livro", + "CoC7.AddBook": "Adicionar Livro", + "CoC7.NewSpellName": "novo feitiço", + "CoC7.AddSpell": "Adicionar Feitiço", "CoC7.AddWeapon": "Adicionar Arma", "CoC7.NewWeaponName": "Nova Arma", "CoC7.EditWeapon": "Editar Arma", @@ -414,6 +410,7 @@ "CoC7.WeaponSkill": "Perícia", "CoC7.WeaponSkillAlt": "Perícia Alternativa", "CoC7.Inventory": "Inventário", + "CoC7.InventoryIsCurrentlyEmpty": "O inventário está vazio.", "CoC7.CharacterDevelopment": "Desenvolvimento", "CoC7.OccupationSkill": "Perícia de Ocupação", "CoC7.ArchetypeSkill": "Perícia de Arquétipo", @@ -423,7 +420,6 @@ "CoC7.SANCheckTitle": "Perda de Sanidade: {name} ({sanMin}/{sanMax})", "CoC7.NoSkill": "Sem Perícia", "CoC7.AddWeapontHint": "

                                            {actor} não possui {weapon}.
                                            Gostaria de criar ?

                                            ", - "CoC7.LinkCheck": "Teste de {name}", "CoC7.LinkCheckDiff": "Teste [{difficulty}] de {name}", "CoC7.LinkCheckModif": " Teste de {name}, com modificador ({modifier})", @@ -436,7 +432,6 @@ "CoC7.LinkItemDiff": "[{difficulty}] {name}", "CoC7.LinkItemModif": " de {name} ({modifier})", "CoC7.LinkItemDiffModif": "[{difficulty}] {name} ({modifier})", - "CoC7.ManualCreditValues": "Valores de Nível de Crédito Manual", "CoC7.MonetarySymbol": "Símbolo:", "CoC7.MonetaryFactor": "Fator:", @@ -446,16 +441,13 @@ "CoC7.MonetarySpent": "Gasto:", "CoC7.MonetaryAssets": "Patrimônio:", "CoC7.MonetaryAssetsDetails": "Detalhes do Patrimônio", - "CoC7.PossessionsNotes": "Anotações:", "CoC7.PossessionsNotesHolder": "Notas", - "CoC7.BackgroundNewSection": "Adicionar nova Seção", "CoC7.BackgroundSectionNameHolder": "Título da Seção", "CoC7.BackgroundDeleteSection": "Deletar Seção", "CoC7.BackgroundSectionMoveUp": "Para Cima", "CoC7.BackgroundSectionMoveDown": "Para Baixo", - "CoC7.creatureFightingSkill": "Lutar", "CoC7.InvoluntaryAction": "Ação Involuntária", "CoC7.InvoluntaryActionPerfomed": "Realizar Ação Involuntária", @@ -504,10 +496,25 @@ "CoC7.MythosGain": "Ganho de Mythos", "CoC7.YouGainedCthulhuMythos": "Sua mente vacila diante da manifestação sobrenatural, (+{value}% Mythos de Cthulhu).", "CoC7.CardResolved": "Cartão Resolvido", - - "CoC7.CMI": "MCI", + "CoC7.AddSanityLossEncounter": "Adicionar Encontro de Perda de Sanidade", + "CoC7.AddSanityLossImmunity": "Adicionar Imunidade à Perda de Sanidade", + "CoC7.BackgroundEncounters": "Perdas Por Entidades Estranhas", + "CoC7.BackgroundFlags": "Flags", + "CoC7.BackgroundFlagsMythosExperienced": "+5% Cthulhu Mythos Recebido", + "CoC7.BackgroundFlagsMythosHardened": "Cthulhu Mythos Dificultado", + "CoC7.DeleteSanityLossEncounter": "Excluir Encontro de Perda de Sanidade", + "CoC7.DeleteSanityLossImmunity": "Excluir Imunidade à Perda de Sanidade", + "CoC7.Migrate.Complete": "Seus dados foram migrados com sucesso!", + "CoC7.ReduceSanityLimits": "Reduz todos os limites de Sanidade por um", + "CoC7.SanityLossEncounter": "Encontro de perda de Sanidade", + "CoC7.SanityLossEncounters": "Encontros de Perda de Sanidade", + "CoC7.SanityLossImmunities": "Imunidades à Perda de Sanidade", + "CoC7.SanityLossImmunity": "Imunidade à perda de Sanidade", + "CoC7.SanityLossTypeDialogBody": "Adicionar novo Encontro de Mythos, Perda de Sanidade ou Imunidade ao personagem.", + "CoC7.SanityLossTypeDialogTitle": "Nova perda de Sanidade ou imunidade", + "CoC7.SanityLossTypeReason": "Motivo", + "CoC7.SanityLossTypeValue": "Pontos de Sanidade perdidos", "CoC7.CthulhuMythosInitial": "Leitura Inicial", - "CoC7.CMF": "MCC", "CoC7.CthulhuMythosFinal": "Estudo Completo", "CoC7.Occult": "Ocultismo", "CoC7.MythosRating": "Nível de Mythos", @@ -523,11 +530,8 @@ "CoC7.GateSpell": "Portal", "CoC7.CombatSpell": "Combate", "CoC7.SpellType": "Tipo de Feitiço", - "CoC7.BookHasNothingMoreToTeach": "{book} não tem mais nada a ensinar. Perícia de Mythos de Cthulhu de {actor} é maior que seu Nível de Mythos.", "CoC7.BookType": "Tipo de Livro", - "CoC7.MythosBook": "Mythos", - "CoC7.OccultBook": "Ocultismo", "CoC7.Content": "Conteúdo", "CoC7.DragSpell": "Arraste Feitiços aqui para inseri-los no Livro...", "CoC7.Progress": "Progresso", @@ -541,7 +545,7 @@ "CoC7.Development": "Desenvolvimento", "CoC7.Specific": "Específico", "CoC7.InitialReadingNeeded": "{actor} precisa realizar uma Leitura Inicial em {book} para poder avançar através do progresso de Estudo Completo.", - "CoC7.NotOwned": "Esse livro precisa ser possuído por um Ator para realizar essa ação.", + "CoC7.NotOwned": "Esse Item precisa ser possuído por um Ator para realizar essa ação.", "CoC7.ReadAttempt": "Tentativa de ler {book} ({language}), dificuldade {difficulty}.", "CoC7.ReadingMythosTome": "Lendo {book}...", "CoC7.UnknownLanguage": "{actor} não conhece o idioma qual este livro está escrito.", @@ -550,11 +554,9 @@ "CoC7.Mythos": "Mythos", "CoC7.RedoFullStudy": "Refazer Estudo Completo", "CoC7.SpellsLearned": "Feitiços Aprendidos", - "CoC7.Crew": "Passageiros", "CoC7.Origin": "Origem", "CoC7.ArmedVehicle": "Veículo Blindado", - "CoC7.PulpTalents": "Talentos Pulp", "CoC7.TalentType": "Tipos de Talento", "CoC7.PhysicalTalent": "Físico", @@ -564,12 +566,10 @@ "CoC7.BasicTalent": "Básico", "CoC7.InsaneTalent": "Insano", "CoC7.OtherTalent": "Outro", - "CoC7.Items": "Itens", "CoC7.Vehicle": "Veículos", "CoC7.Books": "Livros", "CoC7.Status": "Condições", - "CoC7.Classic": "Clássico", "CoC7.Lovecraftian": "Lovecraftiana", "CoC7.Pulp": "Pulp", @@ -590,6 +590,7 @@ "CoC7.Chosen": "Escolhidas", "CoC7.EmptySkillList": "Adicione uma perícia arrastando-a aqui.", "CoC7.EmptyItemList": "Adicione um item arrastando-o aqui.", + "CoC7.EmptyCharacterSkillList": "Adicione uma ocupação ou perícia arrastando-a aqui.", "CoC7.PersonalSpeciality": "Número de especialidades pessoais ou de era", "CoC7.AdditionalSkills": "Perícias Adicionais", "CoC7.SkillSelectionWindow": "Selecionar Perícias opcionais", @@ -608,7 +609,6 @@ "CoC7.SkillSelectBase": "Selecionar valor base para Perícia {name}", "CoC7.SelectSkill": "Selecionar uma Perícia existente", "CoC7.CreateNewSkill": "Criar nova Perícia", - "CoC7.Characteristics": "Atributos", "CoC7.Characteristic": "Atributo", "CoC7.EnableCharacteristics": "Habilitar Atributos", @@ -618,10 +618,8 @@ "CoC7.BonusPoints": "Pontos de Bônus", "CoC7.SuggestedOccupations": "Ocupações Sugeridas", "CoC7.SuggestedTraits": "Traços Sugeridos", - "CoC7.PutGunAway": "Guardar arma", "CoC7.DrawGun": "Sacar arma", - "CoC7.GmTools": "Recursos do Guardião", "CoC7.GmNotes": "Anotações do Guardião", "CoC7.DevPhase": "Fase de Desenvolvimento", @@ -640,7 +638,6 @@ "CoC7.WarnNoControlledActor": "Você não tem atores selecionados", "CoC7.WarnFastTargetWithWrongMOV": "Movimento Rápido selecionado em ator com menos de 8 MOV. (MOV: {mov})", "CoC7.WarnTooManyTarget": "Muitos alvos selecionados. Mantendo apenas último selecionado", - "CoC7.startRest": "Iniciar Descanso", "CoC7.dreaming": "Os Investigadores aguardam sonhando", "CoC7.healthRecovered": "Recuperou 1 Ponto de Vida", @@ -649,34 +646,30 @@ "CoC7.magicPointsRecovered": "Pontos de Magia recuperados", "CoC7.hasCriticalWounds": "Incapaz de recuperar Pontos de Vida por conta de Ferimentos Graves", "CoC7.quickHealer": "Cura Rápida", - + "CoC7.allActors": "Todos Atores", + "CoC7.restTargets": "Alvos do Descanso", "CoC7.ErrorNoDodgeSkill": "Ator não tem a Perícia Esquivar", "CoC7.ErrorNotEnoughLuck": "{actor} não teve sorte suficiente para obter sucesso no teste", "CoC7.ErrorManeuverNotPossible": "Seu oponente é muito grande para você realizar uma manobra", "CoC7.ErrorNotFound": "{missing} não foi encontrado!", "CoC7.ErrorNotFoundForActor": "{missing} não foi encontrado no ator {actor}!", - "CoC7.InfoLessSkillThanOptions": "{skillCount} e {optionsCount}, adicionando todas.", "CoC7.InfoAllSkillsAlreadySelected": "Todas as perícias já estão selecionadas.", - "CoC7.MessageCheckRequestedWait": "{check}
                                            ", "CoC7.MessageTargetCheckRequested": "O Guardião está solicitando um teste de {check} para {name}.", "CoC7.MessageTitleSelectSingleUserForTarget": "Qual usuário pode responder a este ataque", "CoC7.MessageSelectSingleUserForTarget": "Esse token é controlado por vários usuários, por favor selecione qual deles pode responder a este ataque", - "CoC7.MessageSelectedTargetIsNotControlled": "O token de {name} não é possuído por um jogador, ou seja, não será possível que ele reaja em ações de combate.", "CoC7.MessageBoutOfMadnessTableNotFound": "O resultado da tabela de loucura não foi encontrado, por favor verifique se todas as suas tabelas estão criadas", "CoC7.MessageBoutOfMadnessItemNotFound": "O resultado da tabela de loucura não foi encontrado, por favor verifique que todos os seus estados estão criados", - "CoC7.DealDamage": "Causar {damage} pontos de dano em {target}?", "CoC7.NoTargetSelected": "Você não selecionou um alvo para seu teste de {weapon}. Deseja proceder assim mesmo?", - "CoC7.Import": "Importar", "CoC7.Proceed": "Proceder", "CoC7.Cancel": "Cancelar", - "CoC7.ActorImporter": "Importar Ator", "CoC7.ActorImporterSummary": "Importe um PNJ ou Criatura a partir da descrição de informações. Apenas cole o texto correspondente.", "CoC7.PasteTheDataBelow": "Cole as informações abaixo.", + "CoC7.TextFieldInvalidCharacters": "Há caracteres inválidos no texto, por favor corrija-os ou serão removidos.", "CoC7.SelectActorType": "Selecione o Tipo de Ator", "CoC7.NonPlayingCharacter": "Personagens não-Jogadores (PNJ)", "CoC7.Creature": "Criatura", @@ -687,16 +680,32 @@ "CoC7.English": "Inglês", "CoC7.Spanish": "Espanhol", "CoC7.French": "Francês", + "CoC7.German": "Alemão", + "CoC7.Polish": "Polonês", + "CoC7.TraditionalChinese": "Chinês Tradicional", "CoC7.SelectSourceLanguage": "Selecione o idioma de fonte.", - + "CoC7.ImportedCharactersFolder": "Personagens importados", + "CoC7.ImportSkillItemLocations": "Buscando por perícias/feitiços/armas em", + "CoC7.ImportActorItemsNone": "Nenhum", + "CoC7.ImportActorItemsItem": "Itens", + "CoC7.ImportActorItemsItemWorldModuleSystem": "Itens / Mundo / Módulos / Sistema", + "CoC7.ImportActorItemsWorldModuleItemSystem": "Mundo / Módulos / Itens / Sistema", "CoC7.Migrate.Title": "Atualização Necessária!", "CoC7.Migrate.Message": "

                                            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": "
                                            1. Clique Esquerdo Teste com Opções
                                            2. Shift + Clique Esquerdo Teste Regular Imediato
                                            1. Clique Direito Teste Resistido com Opções
                                            2. Shift + Clique Direito Teste Resistido Imediato
                                            1. Alt/Option + Clique Direito Teste Combinado com Opções
                                            ", + "CoC7.ToolTipKeeperSkill": "
                                            1. CTRL + Clique Esquerdo Criar Link
                                            2. {other}
                                            ", + "CoC7.ToolTipKeeperStandbySkill": "
                                          3. Clique Esquerdo Requisitar um teste para {name}
                                          4. ", + "CoC7.ToolTipDB": "
                                            1. Clique Esquerdo Teste Regular Imediato
                                            ", + "CoC7.ToolTipKeeperSanity": "
                                          5. CTRL + Alt/Option Criar um Link de Teste de Sanidade
                                          6. ", + "CoC7.ToolTipAutoToggle": "
                                            1. Clique Esquerdo Alternar Cálculo Automático
                                            2. ", + "CoC7.ToolTipSkillFlagToggle": "
                                              1. Dois Cliques Alternar Status de Desenvolvimento
                                              2. ", + "CoC7.ToolTipSkillFlagged": "Marcada para Desenvolvimento", + "CoC7.ToolTipSkillUnflagged": "Desmarcada para Desenvolvimento", "SETTINGS.TitleRules": "Regras", "SETTINGS.TitleInitiative": "Iniciativa", "SETTINGS.TitleRoll": "Rolagens", "SETTINGS.TitleChatCards": "Cartões", "SETTINGS.TitleScene": "Cenas", + "SETTINGS.TitleGameArtwork": "Arte", "SETTINGS.TitleSheet": "Fichas", "SETTINGS.TitleWeapon": "Armas", "SETTINGS.TitleDiceSoNice": "Dice So Nice", @@ -725,7 +746,7 @@ "SETTINGS.UseToken": "Usar Imagem do Token", "SETTINGS.UseTokenHint": "Usar imagem do token ao invés de retratos na Área de Mensagens", "SETTINGS.DisplayActorOnCard": "Mostrar Ator na Área de Mensagens", - "SETTINGS.DisplayActorOnCardHint": "Motrar o retrato/miniatura na Área de Mensagens", + "SETTINGS.DisplayActorOnCardHint": "Mostrar o retrato/miniatura na Área de Mensagens", "SETTINGS.InitiativeRule": "Selecione Regra de Iniciativa", "SETTINGS.InitiativeRuleHint": "Você pode selecionar a regra básica de iniciativa (usar valor de DES) ou a regra opcional (jogar dados e desempatar por DES)", "SETTINGS.InitiativeRuleBasic": "Básica", @@ -746,7 +767,7 @@ "SETTINGS.RestrictGridSpaces": "Restringir Medidas para Espaços do Mapa", "SETTINGS.RestrictGridSpacesHint": "Para combate a distância, se habilitado, a distância será medida em espaços do mapa; se não, a distância 'real' (euclidiana) será usada.", "SETTINGS.StatusPlayerEditable": "Jogador Pode Modificar Estado", - "SETTINGS.StatusPlayerEditableHint": "Deixa o jogador modificar seu status (prostrado, inconsciente, morrendo, etc) e resetar sua perca diária de Sanidade", + "SETTINGS.StatusPlayerEditableHint": "Deixa o jogador modificar seu status (prostrado, inconsciente, morrendo, etc) e reiniciar sua perca diária de Sanidade", "SETTINGS.SyncDice3D": "[DsN] Sincronizar Dados", "SETTINGS.SyncDice3DHint": "Quando usar DsN (Dice so Nice), sincronize entre jogadores", "SETTINGS.UnitDieColorset": "[DsN] Cor do Dado de Unidade", @@ -757,6 +778,12 @@ "SETTINGS.TenDieBonusHint": "Quando usar DsN, escolha a cor do dado de bônus de dezenas. (deixe vazio para usar o padrão do jogador)", "SETTINGS.TenDiePenalty": "[DsN] Cor de Dado de Penalidade de Dezenas", "SETTINGS.TenDiePenaltyHint": "Quando usar DsN, escolha a cor do dado de penalidade de dezenas. (deixe vazio para usar o padrão do jogador)", + "SETTINGS.OverrideGameArtwork": "Substituir Arte do Jogo", + "SETTINGS.OverrideGameArtworkHint": "!!NECESSÁRIO REINICIAR!! Dá acesso às configurações avançadas do jogo. Deixe vazio para padrão", + "SETTINGS.ArtPauseImage": "Imagem do Ícone de Pause", + "SETTINGS.ArtPauseImageHint": ". digite 'null' para remover a imagem.", + "SETTINGS.ArtPauseText": "Texto do Ícone de Pause", + "SETTINGS.ArtPauseTextHint": "Deixe em branco para manter o padrão.", "SETTINGS.OverrideSheetArtwork": "Substituir Arte da Ficha", "SETTINGS.OverrideSheetArtworkHint": "!!NECESSÁRIO REINICIAR!! Dá acesso às configurações avançadas da ficha. Deixe vazio para padrão", "SETTINGS.ArtWorkSheetBackground": "Plano de Fundo da Ficha", @@ -806,5 +833,51 @@ "SETTINGS.EnableStatusIcons": "Habilitar ícones de status", "SETTINGS.EnableStatusIconsHint": "Define se ícones de status de combate e sanidade são mostrados em tokens.", "SETTINGS.StanbyGMRolls": "Aguardar rolagens do Guardião", - "SETTINGS.StanbyGMRollsHint": "Quando o Guardião está fazendo uma rolagem por uma ficha de personagem, mostra um botão de rolagem em vez de rolar." + "SETTINGS.StanbyGMRollsHint": "Quando o Guardião está fazendo uma rolagem por uma ficha de personagem, mostra um botão de rolagem em vez de rolar.", + "SETTINGS.ShowExperimentalFeatures": "Mostrar Recursos Experimentais", + "SETTINGS.ShowExperimentalFeaturesHint": "Seu mundo pode ficar instável em próximas atualizações. É apenas para testes, não utilize em seus mundos de jogo.", + "CoC7.ExperimentalFeaturesWarning": "Esse recurso está em desenvolvimento. Seu uso não é recomendado.", + "SETTINGS.CheckElevation": "Incluir elevação em distância.", + "SETTINGS.CheckElevationHint": "Usar cálculos de elevação em combates à distância.", + "SETTINGS.showIconsOnly": "Na versão resumida da ficha, mostra apenas os ícones das perícias.", + "CoC7.toolTipDelay": "Atraso em milissegundos antes das dicas aparecerem, 0 para nunca.", + "CoC7.Copied": "Texto de exemplo copiado para a área de transferência.", + "CoC7.getTheExample": "Copy Example", + "CoC7.EraAvailability": "Disponibilidade", + "CoC7.Settings.CoreRules.Title": "Regras Adicionais do Livro Básico", + "CoC7.Settings.HouseRules.Title": "Regras de Ouro Comuns", + "CoC7.Settings.PulpRules.Archetype.Hint": "...", + "CoC7.Settings.PulpRules.Archetype.Name": "Arquétipos Pulp", + "CoC7.Settings.PulpRules.DevelopmentRollLuck.Hint": "Aumenta Sorte para falhas e sucesso na rolagem de desenvolvimento de Sorte", + "CoC7.Settings.PulpRules.DevelopmentRollLuck.Name": "Maior Desenvolvimento de Sorte", + "CoC7.Settings.PulpRules.DoubleMaxHealth.Hint": "Vida máxima é (CON + TAM) / 5", + "CoC7.Settings.PulpRules.DoubleMaxHealth.Name": "Dobra vida máxima", + "CoC7.Settings.PulpRules.FasterRecovery.Hint": "Cura natural é aumentada para dois pontos por dia", + "CoC7.Settings.PulpRules.FasterRecovery.Name": "Recuperação Rápida", + "CoC7.Settings.PulpRules.IgnoreMajorWounds.Hint": "...", + "CoC7.Settings.PulpRules.IgnoreMajorWounds.Name": "Ignora Feridas Graves", + "CoC7.Settings.PulpRules.Organization.Hint": "...", + "CoC7.Settings.PulpRules.Organization.Name": "Organização", + "CoC7.Settings.PulpRules.Talents.Hint": "...", + "CoC7.Settings.PulpRules.Talents.Name": "Talentos Pulp", + "CoC7.Settings.Rules.Hint": "Configurar regras variantes/opcionais, como Pulp", + "CoC7.Settings.Rules.Label": "Configurar Regras Variantes/Opcionais", + "CoC7.Settings.Rules.Name": "Regras Variantes/Opcionais", + "CoC7.SpellAlreadyLearned": "Feitiço ('{spell}') já foi aprendido.", + "CoC7.SpellSuccessfullyLearned": "Feitiço '{spell}' foi aprendido com sucesso!", + "CoC7.WarnNoTargetsSanCheck": "Não há alvos selecionados. Selecione um alvo ou crie um link", + "CoC7.AlreadyEncountered": "Já encontrado", + "CoC7.AttackManeuver": "Manobra de Ataque", + "CoC7.CardType": "Tipo de cartão", + "CoC7.ErrorInvalidCardType": "Tipo de Cartão", + "CoC7.ErrorInvalidRollType": "Tipo de Rolagem", + "CoC7.ErrorMissingKeeperUser": "O Guardião precisa estar conectado para realizar essa ação", + "CoC7.GroupRollCard": "Cartão de rolagem de grupo", + "CoC7.MaxPossibleSanLoss": "Perda Máxima Possível", + "CoC7.Migrate.UpdateCurrentScene": "Atualizar cena atual", + "CoC7.RegularRollCard": "Cartão de rolagem regular", + "CoC7.ToolTipCombat": "
                                                1. Clique esquerdo rolar teste com opções
                                                2. Shift + Clique esquerdo Teste com dificuldade regular
                                                1. Clique direito Manobra oposta de combate com opções
                                                2. Shift + Clique direito Manobra oposta de combate com dificuldade regular
                                                ", + "CoC7.ToolTipSanity": "
                                                1. Clique esquerdo rolar teste com opções
                                                2. Alt/Option + Clique esquerdo rolar perda de Sanidade com opções
                                                3. Shift + Clique esquerdo Teste imediato na dificuldade regular
                                                4. Shift + Alt/Option + Clique esquerdo rolar perda de Sanidade sem opções adicionais
                                                1. Clique direito Teste oposto com opções
                                                2. Shift + Clique direito Teste oposto imediato
                                                1. Alt/Option + Clique direito Teste combinado com opções
                                                2. Shift + Alt/Option + Clique direito Teste combinado imediato
                                                ", + "CoC7.days": "dia(s)", + "CoC7.months": "mês(es)" } diff --git a/lang/sv.json b/lang/sv.json index e45fef91..ad1fdffc 100644 --- a/lang/sv.json +++ b/lang/sv.json @@ -4,6 +4,7 @@ "I18N.MAINTAINERS": "@Rangertheman#4927", "CoC7.Entities.Character": "Utredare", + "CoC7.Entities.Container": "Behållare", "CoC7.Entities.Creature": "Varelse", "CoC7.Entities.Npc": "Spelledarperson", "CoC7.Entities.Vehicle": "Fordon", @@ -91,15 +92,18 @@ "CoC7.Spells": "Besvärjelser", "CoC7.Spell": "Besvärjelse", "CoC7.Spells&Notes": "Besvärjelser & anteckningar", + "CoC7.Weapons": "Vapen", "CoC7.Effects": "Effekter", "CoC7.Cost": "Kostnad", "CoC7.Source": "Källa", "CoC7.SpellDetails": "Besvärjelsedetaljer", "CoC7.Details": "Detaljer", "CoC7.Other": "Annat", - "CoC7.rounds": "runda/rundor", - "CoC7.hours": "timme/timmar", - "CoC7.weeks": "vecka/veckor", + "CoC7.rounds": "rundor", + "CoC7.hours": "timmar", + "CoC7.days": "dagar", + "CoC7.weeks": "veckor", + "CoC7.months": "månader", "CoC7.remove": "Ta bort", "CoC7.Any": "Valfri", "CoC7.All": "Alla", @@ -118,7 +122,16 @@ "CoC7.Icon": "Ikon", "CoC7.Check": "Kontrollera", "CoC7.ItemWeapon": "Föremål (Weapon)", - + "CoC7.AttacksPerRound": "Anfall per runda", + + "CoC7.Cast": "Kasta", + "CoC7.SanityCost": "Kostnad Sinneshälsa", + "CoC7.PowerCost": "Kostnad Kraft", + "CoC7.HitPointsCost": "Kostnad Kroppspoäng", + "CoC7.MagicPointsCost": "Kostnad Magipoäng", + "CoC7.OtherCosts": "Annan kostnad", + "CoC7.CastingSpell": "Kastar {spell}.", + "CoC7.NotEnoughMagicPoints": "{spell} kostar {originalMagicPoints} Magipoäng, men du har bara {actorMagicPoints}. Vill du att resten {convertedHitPoints} ska dras från din kroppspoäng? Du kommer att ta {convertedHitPoints} i skada om du fortsätter.", "CoC7.CopyToClipboard": "Kopiera till urklipp", "CoC7.WhisperToSelection": "Viska till den valda markören", "CoC7.WhisperTo": "Viska till", @@ -162,6 +175,7 @@ "CoC7.RollSecretDice": "Väktaren slog några tärningar dolt", "CoC7.KeeperSentDecoy": "Bluffslag skickat till spelarna", "CoC7.FakeRoll": "Skicka bluffslag till spelarna", + "CoC7.ErrorMissingKeeperUser": "Väktaren måste vara ansluten för att du ska kunna göra detta", "CoC7.ConstitutionCheck": "Fysik-slag", @@ -188,11 +202,15 @@ "CoC7.CreateLink": "Skapa länk", "CoC7.SuccesLevelHint": "Lyckades med {value} grader", "CoC7.FailureLevelHint": "Misslyckades med {value} grader", + "CoC7.CardType": "Typ av slag", "CoC7.CombinedRollCard": "Kombinerade tärningsslag", "CoC7.OpposedRollCard": "Motståndsslag", + "CoC7.GroupRollCard": "Gruppslag", + "CoC7.RegularRollCard": "Standardkort för slag", "CoC7.CombinedAnyHint": "Något slag måste lyckas", "CoC7.CombinedAllHint": "Alla slag måste lyckas", "CoC7.CloseCard": "Stäng kortet", + "CoC7.AttackManeuver": "Attackmanöver", "CoC7.CheckResult": "{name}-slag ({value}%) - {difficulty} svårighet", "CoC7.ItemCheckResult": "{item} - {skill}-slag ({value}%) - {difficulty} svårighet", @@ -216,6 +234,7 @@ "CoC7.Dodge": "Duckar", "CoC7.Maneuver": "Manövrerar", "CoC7.OutNumbered": "I underläge", + "CoC7.NoResponse": "Inget gensvar", "CoC7.combatCard.surprised": "Överraskad", "CoC7.combatCard.autoSuccess": "Automatiskt lyckat", "CoC7.Advantage": "Fördel", @@ -226,6 +245,7 @@ "CoC7.TitleSurprised": " Lägg till en bonustärning för att målet är överraskad", "CoC7.TitleAutoSuccess": "Attacken träffar automatiskt", "CoC7.WinnerRollDamage": "{name} vann. Slå för skada.", + "CoC7.InitiatorMissed": "{name} missade.", "CoC7.NoWinner": "Båda sidor misslyckades.", "CoC7.DodgeSuccess": "{name} duckade!", "CoC7.ManeuverSuccess": "{name}s manöver lyckades.", @@ -323,6 +343,7 @@ "CoC7.EraPulp": "Pulp Cthulhu", "CoC7.EraMdrn": "Modern", "CoC7.Eras": "Cthulhu-varianter", + "CoC7.EraAvailability": "Tillgänglighet", "CoC7.SkillNoAdjustments": "Ingen modifiering", "CoC7.SkillNoXpGain": "Ingen erfarenhet", @@ -358,6 +379,8 @@ "CoC7.ErrorActor": "Kunde inte hitta karaktären", "CoC7.ErrorInvalidFormula": "{value} är ingen giltig formel", "CoC7.ErrorInvalid": "ogiltig", + "CoC7.ErrorInvalidCardType": "Korttyp", + "CoC7.ErrorInvalidRollType": "Typ av slag", "CoC7.Validate": "Kontrollera", "CoC7.Apply": "Applicera", @@ -366,6 +389,7 @@ "CoC7.DodgeSkillName": "Ducka", "CoC7.CthulhuMythosName": "Cthulhumyten", "CoC7.CreditRatingSkillName": "Levnadsstandard", + "CoC7.DriveAutoSkillName": "Köra bil", "CoC7.FightingSpecializationName": "Strid", "CoC7.FirearmSpecializationName": "Skjutvapen", "CoC7.DriveSpecializationName": "Chaufför", @@ -387,6 +411,7 @@ "CoC7.DevSuccessDetails": "{item} ökade med {augment}%", "CoC7.SanGained": "Återfick 2t6 ({results} = {sanGained}) Sinneshälsa efter att ha bemästrat {skill} med {skillValue}%", "CoC7.DevFailureDetails": "{item} ökade INTE", + "CoC7.DevSuccess": "{item} ökade med {augment}% ({die}/{score}%)", "CoC7.DevFailure": "{item} ökade INTE ({die}/{score}%)", "CoC7.LuckIncreased": "Du återfår Tur och ökar den med {augment} poäng ({die}/{score})", @@ -401,6 +426,17 @@ "CoC7.AddItem": "Lägg till föremål", "CoC7.EditItem": "Redigera föremål", "CoC7.DeleteItem": "Ta bort föremål", + "CoC7.TradeItem": "Överför/lagra föremål", + "CoC7.SortBySkillName": "Sortera efter fädrighetsnamn", + "CoC7.SortBySkillValue": "Sortera efter färdighetsvärde", + "CoC7.UncommonSkillsShow": "Visa ovanliga färdigheter", + "CoC7.UncommonSkillsHide": "Dölj ovanliga färdigheter", + "CoC7.ReduceSanityLimits": "Minska alla gränser för Sinneshälsa med ett", + "CoC7.NewBookName": "ny bok", + "CoC7.AddBook": "Lägg till bok", + "CoC7.NewSpellName": "ny besvärjelse", + "CoC7.AddSpell": "Lägg till besvärjelse", + "CoC7.AddWeapon": "Lägg till vapen", "CoC7.NewWeaponName": "nytt vapen", "CoC7.EditWeapon": "Redigera vapen", @@ -411,6 +447,7 @@ "CoC7.WeaponSkill": "Färdighet", "CoC7.WeaponSkillAlt": "Alt. färdighet", "CoC7.Inventory": "Utrustning", + "CoC7.InventoryIsCurrentlyEmpty": "Utrustningslistan är för närvarande tom.", "CoC7.CharacterDevelopment": "Utveckling", "CoC7.OccupationSkill": "Yrkesfärdighet", "CoC7.ArchetypeSkill": "Arketypfärdighet", @@ -452,6 +489,24 @@ "CoC7.BackgroundDeleteSection": "Ta bort avsnitt", "CoC7.BackgroundSectionMoveUp": "Flytta upp", "CoC7.BackgroundSectionMoveDown": "Flytta ner", + "CoC7.BackgroundEncounters": "Förluster från märkliga företeelser", + "CoC7.BackgroundFlags": "Flaggor", + "CoC7.BackgroundFlagsMythosExperienced": "Du har fått +5% Cthulhumyten via galenskap", + "CoC7.BackgroundFlagsMythosHardened": "Härdad inför mythosen", + + "CoC7.SanityLossEncounters": "Sinnesbelastning från möten", + "CoC7.SanityLossImmunities": "Immunitet mot sinnesbelastning", + "CoC7.AddSanityLossEncounter": "Lägg till sinnesbelastning från möten", + "CoC7.AddSanityLossImmunity": "Lägg till immunitet mot sinnesbelastning", + "CoC7.DeleteSanityLossEncounter": "Ta bort sinnesbelastning från möten", + "CoC7.DeleteSanityLossImmunity": "Ta bort immunitet mot sinnesbelastning", + + "CoC7.SanityLossTypeDialogTitle": "Ny sinnesbelastning eller immunitet", + "CoC7.SanityLossTypeDialogBody": "Lägg till ett mythosmöte, sinnesbelastning, eller en immunitet mot sinnebelastning, till utredaren.", + "CoC7.SanityLossTypeReason": "Anledning", + "CoC7.SanityLossTypeValue": "Förlorad sinneshälsa", + "CoC7.SanityLossEncounter": "Sinnesbelastning från ett möte", + "CoC7.SanityLossImmunity": "Immunitet mot sinnesbelastning", "CoC7.creatureFightingSkill": "Stridsförmåga", @@ -463,7 +518,7 @@ "CoC7.SANLoss": "Sinnesbelastning", "CoC7.SanityCheckPerformed": "Du utsattes för en traumatisk händelse.", "CoC7.InvoluntaryActionPerformed": "Du tappade självbehärskningen för en stund.", - "CoC7.SanityLost": "Sinneshälsa förlorades", + "CoC7.SanityLost": "Förlorad sinneshälsa", "CoC7.MemoryRepressed": "Ditt sinne undertryckte upplevelsen och begravde den djuppt i ditt undermedvetna", "CoC7.RememberEverything": "Du minns ALLT.", "CoC7.BoutOfMadnesslasted": "Din vansinnesepisod varade i", @@ -488,8 +543,10 @@ "CoC7.MaxSanloss": "Maximal förlust", "CoC7.MinSanloss": "Minsta förlust", "CoC7.AlreadyLost": "Redan förlorat", + "CoC7.AlreadyEncountered": "Redan stött på", "CoC7.CreatureMaxLoss": "Maximal förlust", "CoC7.MaxLossToCreature": "Maximal förlust vid möten med den här varelsen", + "CoC7.MaxPossibleSanLoss": "Högsta möjliga förlust", "CoC7.ResetCreatureSan": "Återställ varelsens historik", "CoC7.ResetSpecieSan": "Återställ släktets historik", "CoC7.KeepData": "Behåll varelsens data", @@ -510,7 +567,7 @@ "CoC7.Occult": "Ockultism", "CoC7.Points": "poäng", "CoC7.MythosRating": "Mythosnivå", - "CoC7.NotOwned": "Den här boken måste ägas av en karaktär för att du ska kunna utföra handlingen.", + "CoC7.NotOwned": "Den här föremål måste ägas av en karaktär för att du ska kunna utföra handlingen.", "CoC7.StudyTime": "Studium", "CoC7.SpellCastingTime": "Tid", "CoC7.SpellCastingCost": "Kostnad", @@ -524,6 +581,9 @@ "CoC7.CombatSpell": "Strid", "CoC7.SpellType": "Besvärjelsetyp", + "CoC7.SpellSuccessfullyLearned": "Besvärjelsen '{spell}' har lärts in!", + "CoC7.SpellAlreadyLearned": "Besvärjelsen med namnet ('{spell}') hade redan lärts in.", + "CoC7.BookHasNothingMoreToTeach": "Det går inte att lära sig mer av {book}. {actor} har ett högre färdighetsvärde i Cthulhumyten än bokens mythosvärde.", "CoC7.BookType": "Boktyp", "CoC7.MythosBook": "Mythosbok", @@ -592,6 +652,7 @@ "CoC7.Chosen": "Vald", "CoC7.EmptySkillList": "Lägg till en färdighet genom att släppa den här.", "CoC7.EmptyItemList": "Lägg till ett föremål genom att släppa det här.", + "CoC7.EmptyCharacterSkillList": "Lägg till en uppsättning, ett yrke eller en färdighet genom att släppa den här.", "CoC7.PersonalSpeciality": "Antal personliga- eller era-specialiteer", "CoC7.AdditionalSkills": "Ytterligare fördigheter", "CoC7.SkillSelectionWindow": "Välj valfria färdigheter", @@ -642,7 +703,10 @@ "CoC7.WarnNoControlledActor": "Du kontrollerar ingen karaktär", "CoC7.WarnFastTargetWithWrongMOV": "'Snabb' har valts för ett mål med lägre än 8 FÖR. (FÖR: {mov})", "CoC7.WarnTooManyTarget": "För många mål valda. Behåller bara det senast valda målet", + "CoC7.WarnNoTargetsSanCheck": "Du har inga mål valda. Välj mål eller skapa en länk.", + "CoC7.allActors": "Alla karaktärer", + "CoC7.restTargets": "Vila valda mål", "CoC7.startRest": "Påbörja vila", "CoC7.dreaming": "Utredaren väntar i drömmen", "CoC7.healthRecovered": "Återfick en kroppspoäng", @@ -678,6 +742,7 @@ "CoC7.ActorImporter": "Karaktärsimport", "CoC7.ActorImporterSummary": "Importera en SLP eller varelse från beskrivning och värden. Klistra bara in motsvarande text", "CoC7.PasteTheDataBelow": "Klistra in texten nedan", + "CoC7.TextFieldInvalidCharacters": "Det finns ogiltiga tecken i texten. Vänligen rätta till det, annars kommer de att tas bort", "CoC7.SelectActorType": "Välj karaktärstyp", "CoC7.NonPlayingCharacter": "Spelledarperson (SLP)", "CoC7.Creature": "Varelse", @@ -688,9 +753,19 @@ "CoC7.English": "Engelska", "CoC7.Spanish": "Spanska", "CoC7.French": "Franska", + "CoC7.German": "Tyska", + "CoC7.Polish": "Polska", + "CoC7.TraditionalChinese": "Traditionell kinesiska", "CoC7.SelectSourceLanguage": "Välj ursprungstextens språk", "CoC7.ImportedUnnamedCharacter": "Importerad icke namngiven karaktär", "CoC7.CreatedImportedCharactersFolder": "Skapade 'Imported Characters'-mapp'", + "CoC7.ImportedCharactersFolder": "Importerade karaktärer", + "CoC7.ImportSkillItemLocations": "Söker efter färdigheter/besvärjelser/vapen i", + "CoC7.ImportActorItemsNone": "Inga", + "CoC7.ImportActorItemsItem": "Föremål", + "CoC7.ImportActorItemsItemWorldModuleSystem": "Föremål / Spelvärldar / Moduler / System", + "CoC7.ImportActorItemsWorldModuleItemSystem": "Spelvärldar / Moduler / Föremål / System", + "CoC7.HowToTranslateTitle": "Så här översätter du?", "CoC7.HowToTranslateWarning": "Installera inga moduler du inte litar på.", "CoC7.HowToTranslateInstallBabele": "Installera/uppdatera Babele-modulen från Foundrys tilläggsmodulhanterare.", @@ -700,18 +775,70 @@ "CoC7.Migrate.Title": "Uppdatering krävs", "CoC7.Migrate.Message": "

                                                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": "
                                                1. Vänsterklicka slå slag med valmöjligheter
                                                2. Shift + vänsterklick Slå direkt med normal svårighetsgrad
                                                1. Högerklicka motståndsslag med valmöjligheter
                                                2. Shift + högerklick Slå motståndsslag direkt
                                                1. Alt/Option + högerklick Kombinerat färdighetsslag med valmöjligheter
                                                ", + "CoC7.ToolTipKeeperSkill": "
                                                1. CTRL + vänsterklick Skapa länk för att slå
                                                2. {other}
                                                ", + "CoC7.ToolTipKeeperStandbySkill": "
                                              3. Vänsterklick Be {name} om ett slag
                                              4. ", + "CoC7.ToolTipDB": "
                                                1. Vänsterklick Direkt slag med normal svårighetsgrad
                                                ", + "CoC7.ToolTipSanity": "
                                                1. Left click slå slag med valmöjligheter
                                                2. Alt/Option + vänsterklick slå sinnesprövning med valmöjligheter
                                                3. Shift + vänsterklick Slå slag direkt med normal svårighet
                                                4. Shift + Alt/Option + vänsterklick slå sinnesprövning med val av tärningspölar
                                                1. högerklick motståndsslag med valmöjligheter
                                                2. Shift + högerklick slå motståndsslag direkt
                                                1. Alt/Option + högerklick Kombinerat slag med valmöjligheter
                                                2. Shift + Alt/Option + högerklick slå kombinerat slag direkt
                                                ", + "CoC7.ToolTipCombat": "
                                                1. vänsterklick slå slag med valmöjligheter
                                                2. Shift + vänsterklick Slå ett slag med normal svårighetsgrad direkt
                                                1. högerklick Motståndsslag i strid med valmöjligheter
                                                2. Shift + högerklick Direkt motståndsmanöver i strid
                                                ", + "CoC7.ToolTipKeeperSanity": "
                                              5. CTRL + Alt/Option Skapa länk för att slå en sinnesprövning
                                              6. ", + "CoC7.ToolTipAutoToggle": "
                                                1. vänsterklick Växla mellan automatisk- och manuell beräkning
                                                2. ", + "CoC7.ToolTipSkillFlagToggle": "
                                                  1. Dubbelklick Växla statusflagga
                                                  2. ", + "CoC7.ToolTipSkillFlagged": "Flaggad för utveckling", + "CoC7.ToolTipSkillUnflagged": "Inte flaggad för utveckling", + "SETTINGS.TitleRules": "Regler", "SETTINGS.TitleInitiative": "Initiativinställningar", "SETTINGS.TitleRoll": "Tärningsslagsinställningar", "SETTINGS.TitleChatCards": "Chattkortsinställningar", "SETTINGS.TitleScene": "Sceninställningar", "SETTINGS.TitleSheet": "Formulärinställningar", + "SETTINGS.TitleGameArtwork": "Grafikinställningar", "SETTINGS.TitleWeapon": "Vapeninställningar", "SETTINGS.TitleDiceSoNice": "Inställningar för Dice So Nice", "SETTINGS.TitleDeveloperDebug": "Utvecklar- och felsökningsinställningar", @@ -722,6 +849,7 @@ "SETTINGS.DefaultDifficultyHint": "Du kan välja svårighetsgrad för slagen. Väljer du 'okänd' vet spelarna inte om vilken svårighetsgraden är innan de slår.", "SETTINGS.CheckDifficultyRegular": "Förvald svårighetsgrad", "SETTINGS.CheckDifficultyUnknown": "Okänd svårighetsgrad", + "SETTINGS.showIconsOnly": "Visa enbart ikoner i färdighetslistan, när det sammanfattade rollformuläret används.", "SETTINGS.UseToken": "Använd markörbilden", "SETTINGS.UseTokenHint": "Använd markörbild istället för porträtt på chattkortet", "SETTINGS.DisplayActorOnCard": "Visa karaktären på kortet", @@ -755,8 +883,14 @@ "SETTINGS.TenDieNoModHint": "Färgval för tiotalstärning när DsN används. (lämna rutan tom för att använda spelarens standardintsällning)", "SETTINGS.TenDieBonus": "[DsN] Färgval för bonustärning", "SETTINGS.TenDieBonusHint": "Färgval för bonustärning när DsN används. (lämna rutan tom för att använda spelarens standardintsällning)", - "SETTINGS.TenDiePenalty": "[DsN] TFärgval för strafftärning", + "SETTINGS.TenDiePenalty": "[DsN] Färgval för strafftärning", "SETTINGS.TenDiePenaltyHint": "Färgval för strafftärning när DsN används. (lämna rutan tom för att använda spelarens standardintsällning)", + "SETTINGS.OverrideGameArtwork": "Skriv över spelets grafik", + "SETTINGS.OverrideGameArtworkHint": "!!OMSTART KRÄVS!! ger åtkomst till avancerade spelinställningar, lämna tomt för standardinställningar", + "SETTINGS.ArtPauseImage": "Pausa bild", + "SETTINGS.ArtPauseImageHint": ". Skriv 'null' för att ta bort bild", + "SETTINGS.ArtPauseText": "Pausa text", + "SETTINGS.ArtPauseTextHint": "Låt fältet vara tomt för att få standardinställningarna", "SETTINGS.OverrideSheetArtwork": "Inställningar för rollformuläret", "SETTINGS.OverrideSheetArtworkHint": "!!OMSTART KRÄVS!! Ger tillgång till rollformulärets avancerade inställningar. Lämna tomt för att behålla standardinställningarna", "SETTINGS.ArtWorkSheetBackground": "Rollformulär, bakgrund", @@ -806,5 +940,14 @@ "SETTINGS.OneBlockBackStory": "Bakgrundshistoria i ett block", "SETTINGS.OneBlockBackStoryHint": "Ändrar så att bakgrundshistorian är ett block, men du kan fortfarande formatera/lägga till länkar.", "SETTINGS.EnableStatusIcons": "Aktivera statusikoner", - "SETTINGS.EnableStatusIconsHint": "Ange om statusikoner för strid och vansinne ska visas på markören." + "SETTINGS.EnableStatusIconsHint": "Ange om statusikoner för strid och vansinne ska visas på markören.", + "SETTINGS.ShowExperimentalFeatures": "Visa experimentella funktioner", + "SETTINGS.ShowExperimentalFeaturesHint": "Om du använder de här funktionerna kan din spelvärld komma att bli oanvändbar vid framtida versionsuppdateringar. De är endast för testning och ska INTE användas i dina spelvärldar", + "CoC7.ExperimentalFeaturesWarning": "Den här funktionen är under utveckling och rekommenderas inte för användning i dina spelvärldar.", + "SETTINGS.CheckElevation": "Räkna in höjdskillnad i avstånd", + "SETTINGS.CheckElevationHint": "Använder höjdskillnad vid beräkningar för avståndsstrid", + "CoC7.toolTipDelay": "Fördröjning i millisekunder innan tips visas, ange 0 om du aldrig vill att de ska visas", + + "CoC7.getTheExample": "Kopiera exempel", + "CoC7.Copied": "Kopierade exempeltexten till Urklipp" } diff --git a/lang/zh-TW.json b/lang/zh-TW.json index 49f1c236..934fce0e 100644 --- a/lang/zh-TW.json +++ b/lang/zh-TW.json @@ -44,7 +44,7 @@ "CoC7.Background": "背景故事", "CoC7.Notes": "筆記", "CoC7.DailySanIconOver": "重置", - "CoC7.Prone": "俯臥", + "CoC7.Prone": "倒地", "CoC7.Unconsious": "昏迷", "CoC7.CriticalWounds": "重傷", "CoC7.Dying": "瀕死", @@ -305,7 +305,7 @@ "CoC7.MythosRating": "神話等級", "CoC7.StudyTime": "精讀時間", "CoC7.SpellCastingTime": "施法時間", - "CoC7.SpellCastingCost": "施法成本", + "CoC7.SpellCastingCost": "施法消耗", "CoC7.CallSpell": "呼喚", "CoC7.DismissSpell": "退散", "CoC7.ContactSpell": "接觸", @@ -391,7 +391,7 @@ "SETTINGS.CheckDifficultyUnknown": "未知難度", "SETTINGS.UseToken": "使用token圖片", "SETTINGS.UseTokenHint": "在角色卡中使用token圖片而不是肖像", - "SETTINGS.DisplayActorOnCard": "顯示角色於檢定卡", + "SETTINGS.DisplayActorOnCard": "顯示角色於檢定上", "SETTINGS.DisplayActorOnCardHint": "在戰鬥對話上顯示角色的圖片/token", "SETTINGS.InitiativeRule": "使用先攻檢定規則", "SETTINGS.InitiativeRuleHint": "你可以選擇基本核心規則(使用DEX值)或可選規則(使用roll)", @@ -408,7 +408,7 @@ "SETTINGS.RestrictGridSpaces": "限制測量網格的空間", "SETTINGS.RestrictGridSpacesHint": "對于遠程戰鬥,如果選擇了該項,距離將以網格的空間來計算,而不是使用真實(歐幾裏得)的距離。", "SETTINGS.StatusPlayerEditable": "玩家可以修改狀態", - "SETTINGS.StatusPlayerEditableHint": "讓你的玩家修改他們的狀態(俯臥、昏迷、瀕死、死亡)和重置他們每天的San損失", + "SETTINGS.StatusPlayerEditableHint": "讓你的玩家修改他們的狀態(俯臥、昏迷、瀕死、死亡)和重置他們每天的SAN損失", "SETTINGS.SyncDice3D": "[DsN] 同步骰子", "SETTINGS.SyncDice3DHint": "當使用DsN,同步骰子之間的玩家", "SETTINGS.UnitDieColorset": "[DsN] 個位骰顏色設定", @@ -430,7 +430,7 @@ "CoC7.CthulhuMythosName": "克蘇魯神話", "CoC7.SANCheckTitle": "損失SAN: {name} ({sanMin}/{sanMax})", "CoC7.LinkCheck": "{type} 檢定: {name} [{difficulty}/{modifier}]", - "CoC7.LinkSanLoss": "損失SAN : ({sanMin}/{sanMax}) [{difficulty}/{modifier}]", + "CoC7.LinkSanLoss": "損失SAN : ({sanMin}/{sanMax})", "CoC7.NoSanLoss": "沒有損失SAN", "CoC7.WarnNoControlledActor": "你沒有任何控制中的角色", "CoC7.WarnFastTargetWithWrongMOV": "快速選擇一個移動力小于8的目標 (Mov: {mov})", @@ -450,8 +450,8 @@ "CoC7.SanityLost": "已損失", "CoC7.InvoluntaryActionPerfomed": "已進行 非自願行動", "CoC7.DamageInflicted": "已受到傷害", - "CoC7.MessageCheckRequestedWait": "Kp請求一個檢定
                                                    {check}
                                                    接受的話請按上面按鈕
                                                    ", - "CoC7.MessageTargetCheckRequested": "對於{name},Kp請求一個檢定
                                                    {check}
                                                    接受的話請按上面按鈕
                                                    ", + "CoC7.MessageCheckRequestedWait": "KP請求一個檢定
                                                    {check}
                                                    接受的話請按上面按鈕
                                                    ", + "CoC7.MessageTargetCheckRequested": "對於{name},KP請求一個檢定
                                                    {check}
                                                    接受的話請按上面按鈕
                                                    ", "CoC7.DailyLoss": "每日", "CoC7.DyingCheck": "檢查你是否會立即死亡", "CoC7.UnderlyingInsanity": "潛在瘋狂", @@ -480,19 +480,19 @@ "CoC7.WhisperToSelection": "私訊已選定的token", "CoC7.WhisperTo": "私訊到", "CoC7.SendToChat": "發送到聊天紀錄", - "CoC7.Modifiers": "修正", + "CoC7.Modifiers": "調整難度", "CoC7.PushingSkill": ": 正在孤注一擲技能!", "CoC7.RevealSanLoss": "顯示 San 損失", - "CoC7.RollSecretDice": "Kp私下擲了一些骰子", - "CoC7.KeeperSentDecoy": "向玩家們假裝在KP暗骰", - "CoC7.FakeRoll": "向玩家們假裝在KP暗骰", - "CoC7.SanDataSelectionWindow": "選擇San損失", + "CoC7.RollSecretDice": "KP私下擲了一些骰子", + "CoC7.KeeperSentDecoy": "向玩家們假裝KP在暗骰", + "CoC7.FakeRoll": "向玩家們假裝KP在暗骰", + "CoC7.SanDataSelectionWindow": "選擇SAN損失", "CoC7.RollThreshold": "檢定門檻", "CoC7.FlatDiceModifier": "骰子調整值", "CoC7.FlatModifier": "技能調整值", - "CoC7.CreateLink": "新增鏈接", - "CoC7.CombinedRollCard": "合拼檢定卡", - "CoC7.OpposedRollCard": "對抗檢定卡", + "CoC7.CreateLink": "要求擲骰", + "CoC7.CombinedRollCard": "聯合檢定", + "CoC7.OpposedRollCard": "對抗檢定", "CoC7.CombinedAnyHint": "任何檢定必須成功", "CoC7.CombinedAllHint": "所有檢定必須成功", "CoC7.CloseCard": "關閉", @@ -562,46 +562,50 @@ "CoC7.BoutOfMadness": "臨時性瘋狂", "CoC7.BoutRealTime": "臨時性瘋狂: 即時", "CoC7.BoutSummary": "臨時性瘋狂: 總結", - "CoC7.EndBoutOfMadness": "終結臨時性瘋狂", + "CoC7.EndBoutOfMadness": "臨時性瘋狂 結束", "CoC7.InsanityType": "瘋狂類型", "CoC7.Phobia": "恐懼症", "CoC7.Mania": "狂躁症", "CoC7.MaxSanloss": "最大損失", "CoC7.MinSanloss": "最小損失", - "CoC7.AlreadyLost": "已經失去控制(LOST)", - "CoC7.CreatureMaxLoss": "生物最大損失值", - "CoC7.MaxLossToCreature": "生物扣去最大損失值", - "CoC7.ResetCreatureSan": "重設生物的經歷", - "CoC7.ResetSpecieSan": "重設種族的經歷", - "CoC7.KeepData": "保留生物資料", - "CoC7.BoutActive": "(瘋狂發作)免疫San損失", - "CoC7.AlreadyInABout": "你正受臨時性瘋狂影響,暫時免疫San損失。", + "CoC7.MaxPossibleSanLoss": "還可能扣除", + "CoC7.AlreadyEncountered": "已經遭遇", + "CoC7.AlreadyLost": "已經失去", + "CoC7.CreatureMaxLoss": "該生物的最大損失值", + "CoC7.MaxLossToCreature": "因該生物的SAN損失", + "CoC7.ResetCreatureSan": "清除因此生物的損失經歷", + "CoC7.ResetSpecieSan": "清除因此種族的損失經歷", + "CoC7.KeepData": "保留此SAN損失經歷", + "CoC7.BoutActive": "(瘋狂發作中)免疫SAN損失", + "CoC7.AlreadyInABout": "你正受臨時性瘋狂影響,暫時免疫SAN損失。", "CoC7.PlayerPermanentlyInsane": "玩家角色永久瘋狂", "CoC7.MythosFirstEncounter": "克蘇魯神話成長(+5% 首次)", "CoC7.MythosAlreadyEncountered": "克蘇魯神話成長(+1%)", "CoC7.DisregardMythosGain": "沒有克蘇魯神話成長", "CoC7.MythosGain": "獲得克蘇魯神話", "CoC7.YouGainedCthulhuMythos": "在超凡脫俗的存在面前,你感到膽怯 (+{value}% 克蘇魯神話成長)", - "CoC7.CardResolved": "檢定卡已解決", + "CoC7.CardResolved": "檢定完成", "CoC7.Crew": "乘員", "CoC7.Origin": "出身", - "CoC7.ArmedVehicle": "武裝車輛", - "CoC7.Vehicle": "車輛", + "CoC7.ArmedVehicle": "武裝交通工具", + "CoC7.Vehicle": "交通工具", "CoC7.Status": "狀態", "CoC7.EmptyItemList": "拖拽物品到此,會加入到物品欄。", "CoC7.Characteristic": "屬性值", - "CoC7.GmTools": "Kp工具", - "CoC7.GmNotes": "Kp筆記", + "CoC7.GmTools": "KP工具", + "CoC7.GmNotes": "KP筆記", "CoC7.DevPhase": "幕間成長環節", "CoC7.CharCreationMode": "創角模式", - "CoC7.toggleXP": "獲得 成長標記", + "CoC7.toggleXP": "允許獲得 成長標記", "CoC7.XPGainEnabled": "角色現在可以獲得成長標記", "CoC7.XPGainDisabled": "角色現在無法獲得成長標記", + "CoC7.allActors": "所有角色", + "CoC7.restTargets": "休息對象: ", "CoC7.startRest": "開始休息", "CoC7.dreaming": "調查員在夢境中等待", "CoC7.healthRecovered": "恢復 1 點生命值", "CoC7.pulpHealthRecovered": "恢復 {number} 點生命值", - "CoC7.dailySanLossRestarted": "重設每日瘋狂臨界點", + "CoC7.dailySanLossRestarted": "重置每日瘋狂臨界點", "CoC7.magicPointsRecovered": "MP恢復", "CoC7.hasCriticalWounds": "重傷下無法恢復生命值。", "CoC7.quickHealer": "快速治療者", @@ -619,6 +623,7 @@ "CoC7.English": "英語", "CoC7.Spanish": "西班牙語", "CoC7.French": "法語", + "CoC7.TraditionalChinese": "正體中文", "CoC7.SelectSourceLanguage": "選擇資源的來源語言", "SETTINGS.DebugMode": "系統使用Debug模式", "SETTINGS.DebugModeHint": "!!需要重啟!!", @@ -650,21 +655,21 @@ "SETTINGS.ArtworkMainFontSize": "主要字型大小 (px)", "SETTINGS.BoutOfMadnessSummaryTable": "瘋狂發作表 (總結) ", "SETTINGS.BoutOfMadnessRealTimeTable": "瘋狂發作表 (即時) ", - "SETTINGS.LetKeeperDecide": "讓Kp決定", + "SETTINGS.LetKeeperDecide": "讓KP決定", "SETTINGS.DisplayResultType": "顯示骰子成功程度結果(文字)", "SETTINGS.DisplayCheckSuccessLevel": "顯示骰子成功程度結果(星星)", "SETTINGS.PlayerUnlockSheetMode": "玩家可以解鎖角色卡", "SETTINGS.AlwaysEditable": "永遠", "SETTINGS.CreationModeOnly": "只限創角模式", - "SETTINGS.NeverEditable": "永不 (Kp only)", - "SETTINGS.AllowFlatDiceModifier": "骰子結果調整", + "SETTINGS.NeverEditable": "永不 (只限KP)", + "SETTINGS.AllowFlatDiceModifier": "調整骰子結果", "SETTINGS.AllowFlatDiceModifierHint": "允許調整骰子結果值,例如擲出30,可添加調整值-20,使結果變成10。", "SETTINGS.AllowFlatThresholdModifier": "技能調整值", "SETTINGS.AllowFlatThresholdModifierHint": "允許調整成功等級 (-1大失敗,0失敗,1一般成功,2困難成功,3極限成功,4大成功)", "SETTINGS.OpposedRollTieBreaker": "對抗骰使用Viriato139ac,阻止平手", "SETTINGS.OpposedRollTieBreakerHint": "在對抗骰平手時,勝者為擲出更高數值,而非本身技能值更高。", "SETTINGS.SelfRollWhisperTarget": "暗骰擲骰通知:", - "SETTINGS.SelfRollWhisperTargetHint": "作為Kp,當進行暗骰時,你會給誰發出通知。", + "SETTINGS.SelfRollWhisperTargetHint": "作為KP,當進行暗骰時,你會給誰發出通知。", "SETTINGS.DoNotAdvise": "只有自己知道。", "SETTINGS.AdviseOwnersOnly": "通知角色擁有者", "SETTINGS.AdviseAllPlayer": "通知所有玩家", @@ -676,7 +681,7 @@ "CoC7.ImportedUnnamedCharacter": "已匯入無名的角色", "CoC7.CreatedImportedCharactersFolder": "已新增資料夾「已匯入角色」", "CoC7.HowToTranslateTitle": "怎樣進行翻譯?", - "CoC7.HowToTranslateWarning": "不要安裝任何你不能信任的Mod.", + "CoC7.HowToTranslateWarning": "不要安裝任何你不信任的Mod.", "CoC7.HowToTranslateInstallBabele": "在FVTT 的MOD管理器 安裝/更新 Babele.", "CoC7.HowToTranslateInstallTranslation": "在FVTT 的MOD管理器 安裝/更新翻譯.", "CoC7.HowToTranslateEnableTranslation": "在遊戲世界中, 設定/Mod管理 中啓動 Babele 和翻譯.", @@ -685,13 +690,13 @@ "CoC7.Entities.Character": "角色", "CoC7.Entities.Creature": "生物", "CoC7.Entities.Npc": "NPC", - "CoC7.Entities.Vehicle": "車輛", + "CoC7.Entities.Vehicle": "交通工具", "CoC7.Entities.Archetype": "類型", "CoC7.Entities.Book": "書籍", "CoC7.Entities.Chase": "追逐戰", "CoC7.Entities.Item": "物品", "CoC7.Entities.Occupation": "職業", - "CoC7.Entities.Setup": "設置", + "CoC7.Entities.Setup": "偏好設定", "CoC7.Entities.Skill": "技能", "CoC7.Entities.Spell": "法術", "CoC7.Entities.Status": "狀態", @@ -706,7 +711,7 @@ "CoC7.MessageTitleSelectSingleUserForTarget": "那個用戶可以回應此攻擊", "CoC7.MessageSelectSingleUserForTarget": "此token由多個玩家所控制,請選擇哪個用戶可以回應此攻擊.", "CoC7.weeks": "星期", - "CoC7.SanGained": "增加 2d6 ({results} = {sanGained}) 心智值,因你的技能{skill} 成長到 {skillValue}%", + "CoC7.SanGained": "增加 2d6 ({results} = {sanGained}) SAN值,因你的技能{skill} 成長到 {skillValue}%", "CoC7.Content": "內容", "CoC7.Progress": "進展", "CoC7.InitialReading": "泛讀", @@ -731,5 +736,158 @@ "CoC7.Migrate.ButtonSkip": "跳過", "CoC7.Migrate.ButtonOkay": "好的", "SETTINGS.EnableStatusIcons": "啟用狀態圖示", - "SETTINGS.EnableStatusIconsHint": "設定戰鬥和理智效果的圖示是否會顯示在Token裡." + "SETTINGS.EnableStatusIconsHint": "設定戰鬥和SAN效果的圖示是否會顯示在Token裡.", + "CoC7.Entities.Container": "容器", + "CoC7.Weapons": "武器", + "CoC7.NoTargetToDamage": "沒有目標可以施加傷害。", + "CoC7.DevelopAttribWarn": "你不能在成長/創角模式中訪問某些屬性。", + "CoC7.TradeItem": "交易 / 儲存物品。", + "CoC7.NewBookName": "新書。", + "CoC7.AddBook": "添加書籍。", + "CoC7.NewSpellName": "新法術", + "CoC7.AddSpell": "添加法術。", + "CoC7.BookHasNothingMoreToTeach": "{book} 沒有什麼可學習的了。{actor} 的克蘇魯神話技能大於這本書的神話等級。", + "CoC7.DragSpell": "拖曳法術到這裡,將它們加入書中……", + "CoC7.GainsForReading": "閱讀{book}的技能提升。", + "CoC7.InitialReadingNeeded": "{actor}需要對{book}進行泛讀,以便能夠進行精讀。", + "CoC7.LearnSpellAttempt": "嘗試從{book}學習咒語{spell}。", + "CoC7.MarkedForDevelopment": "被標記為可成長", + "CoC7.Mythos": "神話", + "CoC7.NotOwned": "這本物品需要被一個角色擁有才能執行這個動作。", + "CoC7.Points": "點數", + "CoC7.RedoFullStudy": "重新精讀。", + "CoC7.ReadAttempt": "嘗試閱讀{book}({language}),{difficulty}難度。", + "CoC7.ReadingMythosTome": "閱讀{book}。。", + "CoC7.SpellsLearned": "已習得法術", + "CoC7.UnknownLanguage": "{actor}不知道這本書是用什麼語言編寫的。", + "CoC7.Maximize": "最大化", + "CoC7.Summarize": "總結", + "CoC7.UnableToInteractWithChatCard": "你無法與這條信息互動,如果你需要進行此行動,請讓你的KP去幫你進行選擇。", + "CoC7.UnableToCopyToClipboard": "無法複製到剪貼板,這可能是由於你的瀏覽器安全設定造成的。", + "CoC7.MessageTitleSelectUserToGiveTo": "將物品交給另一個角色。", + "CoC7.MessageSelectUserToGiveTo": "你想把這個物品給哪個角色?。", + "SETTINGS.TitleRules": "規則", + "SETTINGS.TitleInitiative": "先攻表設定", + "SETTINGS.TitleRoll": "擲骰設定", + "SETTINGS.TitleChatCards": "聊天設定", + "SETTINGS.TitleScene": "場景設定", + "SETTINGS.TitleSheet": "角色卡設定", + "SETTINGS.TitleWeapon": "武器設定", + "SETTINGS.TitleDiceSoNice": "Dice So Nice 設定", + "SETTINGS.TitleDeveloperDebug": "開發人員和Debug設定。", + "SETTINGS.TitleRollTable": "隨機表設定", + "SETTINGS.StanbyGMRolls": "KP待機擲骰", + "SETTINGS.StanbyGMRollsHint": "當KP指定一個角色進行擲骰時,顯示擲骰按鈕而不是直接擲骰。", + "SETTINGS.ShowExperimentalFeatures": "顯示實驗性功能。", + "SETTINGS.ShowExperimentalFeaturesHint": "如果你使用這些功能,你的世界可能在未來的版本中變得無法使用。僅用於測試。不要在你遊玩中的遊戲世界使用這些功能。", + "CoC7.ExperimentalFeaturesWarning": "該功能正在開發中,不建議在你的遊戲世界中使用。", + "CoC7.AttacksPerRound": "每輪攻擊次數", + "CoC7.Cast": "施法", + "CoC7.Casting": "正在施放魔法", + "CoC7.SanityCost": "SAN消耗", + "CoC7.PowerCost": "意志消耗", + "CoC7.HitPointsCost": "HP消耗", + "CoC7.MagicPointsCost": "MP消耗", + "CoC7.OtherCosts": "其他消耗", + "CoC7.CastingSpell": "施放{spell}。", + "CoC7.NoResponse": "無反應", + "CoC7.InitiatorMissed": "{name}已錯過了。", + "CoC7.DriveAutoSkillName": "自動駕駛", + "CoC7.SortBySkillName": "按技能名稱排序", + "CoC7.SortBySkillValue": "按技能大小排序", + "CoC7.UncommonSkillsShow": "顯示不常見的技能", + "CoC7.UncommonSkillsHide": "隱藏不常見的技能", + "CoC7.InventoryIsCurrentlyEmpty": "清單目前是空的。", + "CoC7.EmptyCharacterSkillList": "通過拖放在這裡進行設置、增加職業或技能。", + "CoC7.TextFieldInvalidCharacters": "文本中存在無效文字,請修正,否則將被刪除", + "CoC7.ImportedCharactersFolder": "匯入角色", + "CoC7.ImportSkillItemLocations": "在其中尋找技能/法術/武器", + "CoC7.ImportActorItemsNone": "無", + "CoC7.ImportActorItemsItem": "道具", + "CoC7.ImportActorItemsItemWorldModuleSystem": "道具/世界/模組/系統", + "CoC7.ImportActorItemsWorldModuleItemSystem": "世界/模組/道具/系統", + "CoC7.Migrate.WithModulesMessage": "

                                                    你的世界或模組可能需要更新以運行版本{version}。

                                                    在開始升級之前,請備份你的世界和下面列出的模組文件夾。

                                                    如果你不更新你的世界,系統將無法正常工作。

                                                    下面的模組包含角色或物品,所以也將被檢查。

                                                    {modules}

                                                    世界完成後可能被重新啟動。

                                                    ", + "CoC7.MessageDistanceCalculationFailure": "無法計算Token之間的距離,請使用角色卡。", + "CoC7.ToolTipSkill": "
                                                    1. 點擊左鍵 顯示選項的擲骰
                                                    2. Shift + 左鍵 立即投擲普通難度檢定
                                                    1. 點擊右鍵 顯示選項的對抗檢定
                                                    2. Shift + 右鍵 立即進行對抗檢定
                                                    1. Alt/Option + 右鍵 顯示選項的聯合檢定
                                                    ", + "CoC7.ToolTipKeeperSkill": "
                                                    1. CTRL + 左鍵 對話欄新增檢定連結
                                                    2. {other}
                                                    ", + "CoC7.ToolTipKeeperStandbySkill": "
                                                  3. 點擊左鍵 要求 {name} 擲骰
                                                  4. ", + "CoC7.ToolTipDB": "
                                                    1. 點擊左鍵 立即投擲普通難度檢定
                                                    ", + "CoC7.ToolTipKeeperSanity": "
                                                  5. CTRL + Alt/Option 對話欄新增San Check連結
                                                  6. ", + "CoC7.ToolTipAutoToggle": "
                                                    1. 點擊左鍵 切換自動計算 / 手動輸入
                                                    2. ", + "CoC7.ToolTipSkillFlagToggle": "
                                                      1. 雙擊切換標誌狀態
                                                      2. ", + "CoC7.ToolTipSkillFlagged": "加上成長標記", + "CoC7.ToolTipSkillUnflagged": "移除成長標記", + "SETTINGS.TitleGameArtwork": "遊戲美術風格設定", + "SETTINGS.showIconsOnly": "在總結表上,只顯示技能列表上的圖標。", + "SETTINGS.OverrideGameArtwork": "覆蓋遊戲美術風格", + "SETTINGS.OverrideGameArtworkHint": "!!!需要重啓!!!讓人可以進入高級遊戲設定,留空為默認", + "SETTINGS.ArtPauseImage": "暫停圖片", + "SETTINGS.ArtPauseImageHint": "。輸入'null'來刪除圖片", + "SETTINGS.ArtPauseText": "暫停文字", + "SETTINGS.ArtPauseTextHint": "留空為默認", + "SETTINGS.CheckElevation": "在距離中包括高度", + "SETTINGS.CheckElevationHint": "在範圍戰鬥距離計算中使用高度", + "CoC7.toolTipDelay": "顯示提示前的毫秒延遲,0表示從不顯示", + "CoC7.getTheExample": "複製示範文字", + "CoC7.Copied": "已複製示範文字到剪貼簿", + "CoC7.NotEnoughMagicPoints": "{spell}需要消耗{originalMagicPoints}點MP,但你只有{actorMagicPoints}點。你希望轉換你{convertedHitPoints}點的HP嗎?這樣的話,你將會受到{convertedHitPoints}點的HP傷害。", + "CoC7.German": "德文", + "CoC7.EraAvailability": "可用", + "CoC7.SpellSuccessfullyLearned": "咒文 ‘{spell}’ 學習成功!", + "CoC7.SpellAlreadyLearned": "名為 ('{spell}') 的咒文已經學會。", + "CoC7.WarnNoTargetsSanCheck": "您沒有選擇目標。選擇目標或新增鏈接。", + "CoC7.Polish": "波蘭語", + "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": "通俗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": "
                                                        1. 左鍵 連著選項的擲骰檢定
                                                        2. Alt/Option + 左鍵 連著選項的SAN損失檢定
                                                        3. Shift + 左鍵 立即進行一般難度檢定
                                                        4. Shift + Alt/Option + 左鍵 不帶骰池的SAN損失檢定
                                                        1. 右鍵 連著選項的對抗檢定
                                                        2. Shift + 右鍵 直接進行對抗檢定
                                                        1. Alt/Option + 右鍵 連著選項的組合技能檢定
                                                        2. Shift + Alt/Option + 右鍵 直接進行組合技能檢定
                                                        ", + "CoC7.ToolTipCombat": "
                                                        1. 左鍵 連著選項的技能檢定
                                                        2. Shift + 左鍵 直接進行一般難度檢定
                                                        1. 右鍵 連著選項的戰技對抗檢定
                                                        2. Shift + 右鍵 直接進行戰技對抗檢定
                                                        " } diff --git a/lib/game-icons/game-icons.css b/lib/game-icons/game-icons.css new file mode 100644 index 00000000..16a70815 --- /dev/null +++ b/lib/game-icons/game-icons.css @@ -0,0 +1,11933 @@ +@font-face { + font-family: 'game-icons'; + src: url('./game-icons.woff') format('woff'); +} +.game-icon:before { + font-family: 'game-icons'; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + font-style: normal; + font-variant: normal; + font-weight: normal; + text-decoration: none; + text-transform: none; +} +.game-icon-police-badge:before { + content: '\E001'; +} +.game-icon-pistol-gun:before { + content: '\E002'; +} +.game-icon-arrest:before { + content: '\E003'; +} +.game-icon-banging-gavel:before { + content: '\E004'; +} +.game-icon-chalk-outline-murder:before { + content: '\E005'; +} +.game-icon-convict:before { + content: '\E006'; +} +.game-icon-crime-scene-tape:before { + content: '\E007'; +} +.game-icon-custodian-helmet:before { + content: '\E008'; +} +.game-icon-donut:before { + content: '\E009'; +} +.game-icon-evasion:before { + content: '\E00A'; +} +.game-icon-finger-print:before { + content: '\E00B'; +} +.game-icon-flashlight:before { + content: '\E00C'; +} +.game-icon-handcuffed:before { + content: '\E00D'; +} +.game-icon-id-card:before { + content: '\E00E'; +} +.game-icon-lock-picking:before { + content: '\E00F'; +} +.game-icon-megaphone:before { + content: '\E010'; +} +.game-icon-mp5:before { + content: '\E011'; +} +.game-icon-mug-shot:before { + content: '\E012'; +} +.game-icon-police-car:before { + content: '\E013'; +} +.game-icon-police-officer-head:before { + content: '\E014'; +} +.game-icon-police-target:before { + content: '\E015'; +} +.game-icon-prisoner:before { + content: '\E016'; +} +.game-icon-robber-mask:before { + content: '\E017'; +} +.game-icon-robber:before { + content: '\E018'; +} +.game-icon-sherlock-holmes:before { + content: '\E019'; +} +.game-icon-sniffing-dog:before { + content: '\E01A'; +} +.game-icon-spy:before { + content: '\E01B'; +} +.game-icon-stun-grenade:before { + content: '\E01C'; +} +.game-icon-tire-tracks:before { + content: '\E01D'; +} +.game-icon-traffic-lights-red:before { + content: '\E01E'; +} +.game-icon-walkie-talkie:before { + content: '\E01F'; +} +.game-icon-whistle:before { + content: '\E020'; +} +.game-icon-window-bars:before { + content: '\E021'; +} +.game-icon-arrow-scope:before { + content: '\E022'; +} +.game-icon-flash-grenade:before { + content: '\E023'; +} +.game-icon-handcuffs:before { + content: '\E024'; +} +.game-icon-law-star:before { + content: '\E025'; +} +.game-icon-magnifying-glass:before { + content: '\E026'; +} +.game-icon-manacles:before { + content: '\E027'; +} +.game-icon-riot-shield:before { + content: '\E028'; +} +.game-icon-kevlar:before { + content: '\E029'; +} +.game-icon-balaclava:before { + content: '\E02A'; +} +.game-icon-baton:before { + content: '\E02B'; +} +.game-icon-famas:before { + content: '\E02C'; +} +.game-icon-footsteps:before { + content: '\E02D'; +} +.game-icon-glock:before { + content: '\E02E'; +} +.game-icon-halt:before { + content: '\E02F'; +} +.game-icon-kevlar-vest:before { + content: '\E030'; +} +.game-icon-siren:before { + content: '\E031'; +} +.game-icon-steel-door:before { + content: '\E032'; +} +.game-icon-steyr-aug:before { + content: '\E033'; +} +.game-icon-switchblade:before { + content: '\E034'; +} +.game-icon-walther-ppk:before { + content: '\E035'; +} +.game-icon-swordman:before { + content: '\E036'; +} +.game-icon-swordwoman:before { + content: '\E037'; +} +.game-icon-american-shield:before { + content: '\E038'; +} +.game-icon-armor-downgrade:before { + content: '\E039'; +} +.game-icon-armor-upgrade:before { + content: '\E03A'; +} +.game-icon-attached-shield:before { + content: '\E03B'; +} +.game-icon-cross-shield:before { + content: '\E03C'; +} +.game-icon-dice-shield:before { + content: '\E03D'; +} +.game-icon-dragon-shield:before { + content: '\E03E'; +} +.game-icon-griffin-shield:before { + content: '\E03F'; +} +.game-icon-healing-shield:before { + content: '\E040'; +} +.game-icon-ribbon-shield:before { + content: '\E041'; +} +.game-icon-roman-shield:before { + content: '\E042'; +} +.game-icon-shield-bash:before { + content: '\E043'; +} +.game-icon-shield-impact:before { + content: '\E044'; +} +.game-icon-shield-opposition:before { + content: '\E045'; +} +.game-icon-templar-shield:before { + content: '\E046'; +} +.game-icon-temporary-shield:before { + content: '\E047'; +} +.game-icon-tribal-gear:before { + content: '\E048'; +} +.game-icon-trident-shield:before { + content: '\E049'; +} +.game-icon-vibrating-shield:before { + content: '\E04A'; +} +.game-icon-viking-shield:before { + content: '\E04B'; +} +.game-icon-arrows-shield:before { + content: '\E04C'; +} +.game-icon-battle-gear:before { + content: '\E04D'; +} +.game-icon-bell-shield:before { + content: '\E04E'; +} +.game-icon-black-hand-shield:before { + content: '\E04F'; +} +.game-icon-bolt-shield:before { + content: '\E050'; +} +.game-icon-bordered-shield:before { + content: '\E051'; +} +.game-icon-broken-shield:before { + content: '\E052'; +} +.game-icon-bubble-field:before { + content: '\E053'; +} +.game-icon-checked-shield:before { + content: '\E054'; +} +.game-icon-cracked-shield:before { + content: '\E055'; +} +.game-icon-crenulated-shield:before { + content: '\E056'; +} +.game-icon-edged-shield:before { + content: '\E057'; +} +.game-icon-energy-shield:before { + content: '\E058'; +} +.game-icon-eye-shield:before { + content: '\E059'; +} +.game-icon-fire-shield:before { + content: '\E05A'; +} +.game-icon-ice-shield:before { + content: '\E05B'; +} +.game-icon-layered-armor:before { + content: '\E05C'; +} +.game-icon-lightning-shield:before { + content: '\E05D'; +} +.game-icon-magic-shield:before { + content: '\E05E'; +} +.game-icon-rosa-shield:before { + content: '\E05F'; +} +.game-icon-shield-bounces:before { + content: '\E060'; +} +.game-icon-shield-echoes:before { + content: '\E061'; +} +.game-icon-shield-reflect:before { + content: '\E062'; +} +.game-icon-shieldcomb:before { + content: '\E063'; +} +.game-icon-skull-shield:before { + content: '\E064'; +} +.game-icon-slashed-shield:before { + content: '\E065'; +} +.game-icon-spartan:before { + content: '\E066'; +} +.game-icon-spiky-field:before { + content: '\E067'; +} +.game-icon-surrounded-shield:before { + content: '\E068'; +} +.game-icon-swords-emblem:before { + content: '\E069'; +} +.game-icon-winged-shield:before { + content: '\E06A'; +} +.game-icon-zebra-shield:before { + content: '\E06B'; +} +.game-icon-shield:before { + content: '\E06C'; +} +.game-icon-air-force:before { + content: '\E06D'; +} +.game-icon-shield-disabled:before { + content: '\E06E'; +} +.game-icon-round-shield:before { + content: '\E06F'; +} +.game-icon-chameleon-glyph:before { + content: '\E070'; +} +.game-icon-akhet:before { + content: '\E071'; +} +.game-icon-all-seeing-eye:before { + content: '\E072'; +} +.game-icon-anarchy:before { + content: '\E073'; +} +.game-icon-aquarius:before { + content: '\E074'; +} +.game-icon-aries:before { + content: '\E075'; +} +.game-icon-azul-flake:before { + content: '\E076'; +} +.game-icon-banknote:before { + content: '\E077'; +} +.game-icon-bowen-knot:before { + content: '\E078'; +} +.game-icon-caduceus:before { + content: '\E079'; +} +.game-icon-camargue-cross:before { + content: '\E07A'; +} +.game-icon-cancer:before { + content: '\E07B'; +} +.game-icon-capricorn:before { + content: '\E07C'; +} +.game-icon-check-mark:before { + content: '\E07D'; +} +.game-icon-cornucopia:before { + content: '\E07E'; +} +.game-icon-corporal:before { + content: '\E07F'; +} +.game-icon-credits-currency:before { + content: '\E080'; +} +.game-icon-dream-catcher:before { + content: '\E081'; +} +.game-icon-dwennimmen:before { + content: '\E082'; +} +.game-icon-easter-egg:before { + content: '\E083'; +} +.game-icon-ermine:before { + content: '\E084'; +} +.game-icon-eye-of-horus:before { + content: '\E085'; +} +.game-icon-f-clef:before { + content: '\E086'; +} +.game-icon-fallout-shelter:before { + content: '\E087'; +} +.game-icon-female:before { + content: '\E088'; +} +.game-icon-film-strip:before { + content: '\E089'; +} +.game-icon-fleur-de-lys:before { + content: '\E08A'; +} +.game-icon-flower-emblem:before { + content: '\E08B'; +} +.game-icon-freemasonry:before { + content: '\E08C'; +} +.game-icon-g-clef:before { + content: '\E08D'; +} +.game-icon-gear-stick-pattern:before { + content: '\E08E'; +} +.game-icon-gemini:before { + content: '\E08F'; +} +.game-icon-hell-crosses:before { + content: '\E090'; +} +.game-icon-heptagram:before { + content: '\E091'; +} +.game-icon-hieroglyph-y:before { + content: '\E092'; +} +.game-icon-horseshoe:before { + content: '\E093'; +} +.game-icon-info:before { + content: '\E094'; +} +.game-icon-jerusalem-cross:before { + content: '\E095'; +} +.game-icon-klingon:before { + content: '\E096'; +} +.game-icon-leo:before { + content: '\E097'; +} +.game-icon-liberty-wing:before { + content: '\E098'; +} +.game-icon-libra:before { + content: '\E099'; +} +.game-icon-logic-gate-and:before { + content: '\E09A'; +} +.game-icon-logic-gate-nand:before { + content: '\E09B'; +} +.game-icon-logic-gate-nor:before { + content: '\E09C'; +} +.game-icon-logic-gate-not:before { + content: '\E09D'; +} +.game-icon-logic-gate-nxor:before { + content: '\E09E'; +} +.game-icon-logic-gate-or:before { + content: '\E09F'; +} +.game-icon-logic-gate-xor:before { + content: '\E0A0'; +} +.game-icon-male:before { + content: '\E0A1'; +} +.game-icon-mona-lisa:before { + content: '\E0A2'; +} +.game-icon-nested-hexagons:before { + content: '\E0A3'; +} +.game-icon-ophiuchus:before { + content: '\E0A4'; +} +.game-icon-peace-dove:before { + content: '\E0A5'; +} +.game-icon-pisces:before { + content: '\E0A6'; +} +.game-icon-rod-of-asclepius:before { + content: '\E0A7'; +} +.game-icon-rss:before { + content: '\E0A8'; +} +.game-icon-rub-el-hizb:before { + content: '\E0A9'; +} +.game-icon-sagittarius:before { + content: '\E0AA'; +} +.game-icon-scorpio:before { + content: '\E0AB'; +} +.game-icon-slumbering-sanctuary:before { + content: '\E0AC'; +} +.game-icon-stop-sign:before { + content: '\E0AD'; +} +.game-icon-striped-sun:before { + content: '\E0AE'; +} +.game-icon-taurus:before { + content: '\E0AF'; +} +.game-icon-transform:before { + content: '\E0B0'; +} +.game-icon-triforce:before { + content: '\E0B1'; +} +.game-icon-trinacria:before { + content: '\E0B2'; +} +.game-icon-triquetra:before { + content: '\E0B3'; +} +.game-icon-venus-of-willendorf:before { + content: '\E0B4'; +} +.game-icon-virgo:before { + content: '\E0B5'; +} +.game-icon-virtual-marker:before { + content: '\E0B6'; +} +.game-icon-wanted-reward:before { + content: '\E0B7'; +} +.game-icon-warlock-eye:before { + content: '\E0B8'; +} +.game-icon-yin-yang:before { + content: '\E0B9'; +} +.game-icon-zigzag-hieroglyph:before { + content: '\E0BA'; +} +.game-icon-holosphere:before { + content: '\E0BB'; +} +.game-icon-power-button:before { + content: '\E0BC'; +} +.game-icon-ace:before { + content: '\E0BD'; +} +.game-icon-aerial-signal:before { + content: '\E0BE'; +} +.game-icon-ankh:before { + content: '\E0BF'; +} +.game-icon-artificial-hive:before { + content: '\E0C0'; +} +.game-icon-automatic-sas:before { + content: '\E0C1'; +} +.game-icon-barbed-sun:before { + content: '\E0C2'; +} +.game-icon-batwing-emblem:before { + content: '\E0C3'; +} +.game-icon-biohazard:before { + content: '\E0C4'; +} +.game-icon-black-flag:before { + content: '\E0C5'; +} +.game-icon-checkbox-tree:before { + content: '\E0C6'; +} +.game-icon-clover:before { + content: '\E0C7'; +} +.game-icon-coiling-curl:before { + content: '\E0C8'; +} +.game-icon-concentric-crescents:before { + content: '\E0C9'; +} +.game-icon-condor-emblem:before { + content: '\E0CA'; +} +.game-icon-conversation:before { + content: '\E0CB'; +} +.game-icon-cubeforce:before { + content: '\E0CC'; +} +.game-icon-cubes:before { + content: '\E0CD'; +} +.game-icon-cursed-star:before { + content: '\E0CE'; +} +.game-icon-cycle:before { + content: '\E0CF'; +} +.game-icon-divided-spiral:before { + content: '\E0D0'; +} +.game-icon-eagle-emblem:before { + content: '\E0D1'; +} +.game-icon-fluffy-trefoil:before { + content: '\E0D2'; +} +.game-icon-freedom-dove:before { + content: '\E0D3'; +} +.game-icon-gamepad-cross:before { + content: '\E0D4'; +} +.game-icon-gothic-cross:before { + content: '\E0D5'; +} +.game-icon-hawk-emblem:before { + content: '\E0D6'; +} +.game-icon-hazard-sign:before { + content: '\E0D7'; +} +.game-icon-holy-symbol:before { + content: '\E0D8'; +} +.game-icon-hospital-cross:before { + content: '\E0D9'; +} +.game-icon-interdiction:before { + content: '\E0DA'; +} +.game-icon-james-bond-aperture:before { + content: '\E0DB'; +} +.game-icon-justice-star:before { + content: '\E0DC'; +} +.game-icon-king:before { + content: '\E0DD'; +} +.game-icon-laser-warning:before { + content: '\E0DE'; +} +.game-icon-maze-cornea:before { + content: '\E0DF'; +} +.game-icon-maze-saw:before { + content: '\E0E0'; +} +.game-icon-moebius-star:before { + content: '\E0E1'; +} +.game-icon-moebius-trefoil:before { + content: '\E0E2'; +} +.game-icon-moebius-triangle:before { + content: '\E0E3'; +} +.game-icon-omega:before { + content: '\E0E4'; +} +.game-icon-orbital:before { + content: '\E0E5'; +} +.game-icon-over-infinity:before { + content: '\E0E6'; +} +.game-icon-pentagram-rose:before { + content: '\E0E7'; +} +.game-icon-perpendicular-rings:before { + content: '\E0E8'; +} +.game-icon-radial-balance:before { + content: '\E0E9'; +} +.game-icon-radioactive:before { + content: '\E0EA'; +} +.game-icon-recycle:before { + content: '\E0EB'; +} +.game-icon-ribbon:before { + content: '\E0EC'; +} +.game-icon-rss-2:before { + content: '\E0ED'; +} +.game-icon-rune-sword:before { + content: '\E0EE'; +} +.game-icon-scales:before { + content: '\E0EF'; +} +.game-icon-shiny-omega:before { + content: '\E0F0'; +} +.game-icon-shuriken-aperture:before { + content: '\E0F1'; +} +.game-icon-skull-crossed-bones:before { + content: '\E0F2'; +} +.game-icon-staryu:before { + content: '\E0F3'; +} +.game-icon-steelwing-emblem:before { + content: '\E0F4'; +} +.game-icon-totem-head:before { + content: '\E0F5'; +} +.game-icon-triorb:before { + content: '\E0F6'; +} +.game-icon-triple-beak:before { + content: '\E0F7'; +} +.game-icon-triple-corn:before { + content: '\E0F8'; +} +.game-icon-triple-plier:before { + content: '\E0F9'; +} +.game-icon-triple-yin:before { + content: '\E0FA'; +} +.game-icon-ubisoft-sun:before { + content: '\E0FB'; +} +.game-icon-zigzag-cage:before { + content: '\E0FC'; +} +.game-icon-cancel:before { + content: '\E0FD'; +} +.game-icon-clover-spiked:before { + content: '\E0FE'; +} +.game-icon-clover-2:before { + content: '\E0FF'; +} +.game-icon-doubled:before { + content: '\E100'; +} +.game-icon-expander:before { + content: '\E101'; +} +.game-icon-help:before { + content: '\E102'; +} +.game-icon-hive:before { + content: '\E103'; +} +.game-icon-mass-driver:before { + content: '\E104'; +} +.game-icon-nodular:before { + content: '\E105'; +} +.game-icon-nuclear:before { + content: '\E106'; +} +.game-icon-overmind:before { + content: '\E107'; +} +.game-icon-pulse:before { + content: '\E108'; +} +.game-icon-reactor:before { + content: '\E109'; +} +.game-icon-regeneration:before { + content: '\E10A'; +} +.game-icon-slow-blob:before { + content: '\E10B'; +} +.game-icon-spawn-node:before { + content: '\E10C'; +} +.game-icon-infinity:before { + content: '\E10D'; +} +.game-icon-allied-star:before { + content: '\E10E'; +} +.game-icon-balkenkreuz:before { + content: '\E10F'; +} +.game-icon-bat:before { + content: '\E110'; +} +.game-icon-clubs:before { + content: '\E111'; +} +.game-icon-diamonds:before { + content: '\E112'; +} +.game-icon-divided-square:before { + content: '\E113'; +} +.game-icon-hearts:before { + content: '\E114'; +} +.game-icon-iron-cross:before { + content: '\E115'; +} +.game-icon-pentacle:before { + content: '\E116'; +} +.game-icon-spades:before { + content: '\E117'; +} +.game-icon-card-10-clubs:before { + content: '\E118'; +} +.game-icon-card-10-diamonds:before { + content: '\E119'; +} +.game-icon-card-10-hearts:before { + content: '\E11A'; +} +.game-icon-card-10-spades:before { + content: '\E11B'; +} +.game-icon-card-2-clubs:before { + content: '\E11C'; +} +.game-icon-card-2-diamonds:before { + content: '\E11D'; +} +.game-icon-card-2-hearts:before { + content: '\E11E'; +} +.game-icon-card-2-spades:before { + content: '\E11F'; +} +.game-icon-card-3-clubs:before { + content: '\E120'; +} +.game-icon-card-3-diamonds:before { + content: '\E121'; +} +.game-icon-card-3-hearts:before { + content: '\E122'; +} +.game-icon-card-3-spades:before { + content: '\E123'; +} +.game-icon-card-4-clubs:before { + content: '\E124'; +} +.game-icon-card-4-diamonds:before { + content: '\E125'; +} +.game-icon-card-4-hearts:before { + content: '\E126'; +} +.game-icon-card-4-spades:before { + content: '\E127'; +} +.game-icon-card-5-clubs:before { + content: '\E128'; +} +.game-icon-card-5-diamonds:before { + content: '\E129'; +} +.game-icon-card-5-hearts:before { + content: '\E12A'; +} +.game-icon-card-5-spades:before { + content: '\E12B'; +} +.game-icon-card-6-clubs:before { + content: '\E12C'; +} +.game-icon-card-6-diamonds:before { + content: '\E12D'; +} +.game-icon-card-6-hearts:before { + content: '\E12E'; +} +.game-icon-card-6-spades:before { + content: '\E12F'; +} +.game-icon-card-7-clubs:before { + content: '\E130'; +} +.game-icon-card-7-diamonds:before { + content: '\E131'; +} +.game-icon-card-7-hearts:before { + content: '\E132'; +} +.game-icon-card-7-spades:before { + content: '\E133'; +} +.game-icon-card-8-clubs:before { + content: '\E134'; +} +.game-icon-card-8-diamonds:before { + content: '\E135'; +} +.game-icon-card-8-hearts:before { + content: '\E136'; +} +.game-icon-card-8-spades:before { + content: '\E137'; +} +.game-icon-card-9-clubs:before { + content: '\E138'; +} +.game-icon-card-9-diamonds:before { + content: '\E139'; +} +.game-icon-card-9-hearts:before { + content: '\E13A'; +} +.game-icon-card-9-spades:before { + content: '\E13B'; +} +.game-icon-card-ace-clubs:before { + content: '\E13C'; +} +.game-icon-card-ace-diamonds:before { + content: '\E13D'; +} +.game-icon-card-ace-hearts:before { + content: '\E13E'; +} +.game-icon-card-ace-spades:before { + content: '\E13F'; +} +.game-icon-card-jack-clubs:before { + content: '\E140'; +} +.game-icon-card-jack-diamonds:before { + content: '\E141'; +} +.game-icon-card-jack-hearts:before { + content: '\E142'; +} +.game-icon-card-jack-spades:before { + content: '\E143'; +} +.game-icon-card-king-clubs:before { + content: '\E144'; +} +.game-icon-card-king-diamonds:before { + content: '\E145'; +} +.game-icon-card-king-hearts:before { + content: '\E146'; +} +.game-icon-card-king-spades:before { + content: '\E147'; +} +.game-icon-card-queen-clubs:before { + content: '\E148'; +} +.game-icon-card-queen-diamonds:before { + content: '\E149'; +} +.game-icon-card-queen-hearts:before { + content: '\E14A'; +} +.game-icon-card-queen-spades:before { + content: '\E14B'; +} +.game-icon-card-discard:before { + content: '\E14C'; +} +.game-icon-card-draw:before { + content: '\E14D'; +} +.game-icon-card-pick:before { + content: '\E14E'; +} +.game-icon-card-random:before { + content: '\E14F'; +} +.game-icon-3d-meeple:before { + content: '\E150'; +} +.game-icon-abbot-meeple:before { + content: '\E151'; +} +.game-icon-ages:before { + content: '\E152'; +} +.game-icon-backgammon:before { + content: '\E153'; +} +.game-icon-buy-card:before { + content: '\E154'; +} +.game-icon-card-burn:before { + content: '\E155'; +} +.game-icon-card-exchange:before { + content: '\E156'; +} +.game-icon-card-joker:before { + content: '\E157'; +} +.game-icon-coins:before { + content: '\E158'; +} +.game-icon-conway-life-glider:before { + content: '\E159'; +} +.game-icon-dice-six-faces-three:before { + content: '\E15A'; +} +.game-icon-domino-tiles:before { + content: '\E15B'; +} +.game-icon-empty-chessboard:before { + content: '\E15C'; +} +.game-icon-meeple-army:before { + content: '\E15D'; +} +.game-icon-meeple-circle:before { + content: '\E15E'; +} +.game-icon-meeple-group:before { + content: '\E15F'; +} +.game-icon-meeple-king:before { + content: '\E160'; +} +.game-icon-meeple:before { + content: '\E161'; +} +.game-icon-opposite-hearts:before { + content: '\E162'; +} +.game-icon-pay-money:before { + content: '\E163'; +} +.game-icon-perspective-dice-six-faces-four:before { + content: '\E164'; +} +.game-icon-player-base:before { + content: '\E165'; +} +.game-icon-player-next:before { + content: '\E166'; +} +.game-icon-player-previous:before { + content: '\E167'; +} +.game-icon-player-time:before { + content: '\E168'; +} +.game-icon-receive-money:before { + content: '\E169'; +} +.game-icon-rolling-dice-cup:before { + content: '\E16A'; +} +.game-icon-rolling-dices:before { + content: '\E16B'; +} +.game-icon-round-table:before { + content: '\E16C'; +} +.game-icon-rule-book:before { + content: '\E16D'; +} +.game-icon-sell-card:before { + content: '\E16E'; +} +.game-icon-stack:before { + content: '\E16F'; +} +.game-icon-tabletop-players:before { + content: '\E170'; +} +.game-icon-team-downgrade:before { + content: '\E171'; +} +.game-icon-team-upgrade:before { + content: '\E172'; +} +.game-icon-tic-tac-toe:before { + content: '\E173'; +} +.game-icon-token:before { + content: '\E174'; +} +.game-icon-two-coins:before { + content: '\E175'; +} +.game-icon-up-card:before { + content: '\E176'; +} +.game-icon-honeycomb:before { + content: '\E177'; +} +.game-icon-hourglass:before { + content: '\E178'; +} +.game-icon-pawn:before { + content: '\E179'; +} +.game-icon-poker-hand:before { + content: '\E17A'; +} +.game-icon-sands-of-time:before { + content: '\E17B'; +} +.game-icon-stopwatch:before { + content: '\E17C'; +} +.game-icon-suits:before { + content: '\E17D'; +} +.game-icon-card-pickup:before { + content: '\E17E'; +} +.game-icon-card-play:before { + content: '\E17F'; +} +.game-icon-chess-bishop:before { + content: '\E180'; +} +.game-icon-chess-king:before { + content: '\E181'; +} +.game-icon-chess-knight:before { + content: '\E182'; +} +.game-icon-chess-pawn:before { + content: '\E183'; +} +.game-icon-chess-queen:before { + content: '\E184'; +} +.game-icon-chess-rook:before { + content: '\E185'; +} +.game-icon-hexes:before { + content: '\E186'; +} +.game-icon-brutal-helm:before { + content: '\E187'; +} +.game-icon-dwarf-helmet:before { + content: '\E188'; +} +.game-icon-dwarf-king:before { + content: '\E189'; +} +.game-icon-elf-helmet:before { + content: '\E18A'; +} +.game-icon-american-football-helmet:before { + content: '\E18B'; +} +.game-icon-astronaut-helmet:before { + content: '\E18C'; +} +.game-icon-bandana:before { + content: '\E18D'; +} +.game-icon-bandit:before { + content: '\E18E'; +} +.game-icon-billed-cap:before { + content: '\E18F'; +} +.game-icon-black-knight-helm:before { + content: '\E190'; +} +.game-icon-captain-hat-profile:before { + content: '\E191'; +} +.game-icon-chef-toque:before { + content: '\E192'; +} +.game-icon-closed-barbute:before { + content: '\E193'; +} +.game-icon-cork-hat:before { + content: '\E194'; +} +.game-icon-coronation:before { + content: '\E195'; +} +.game-icon-crenel-crown:before { + content: '\E196'; +} +.game-icon-deshret-red-crown:before { + content: '\E197'; +} +.game-icon-diving-helmet:before { + content: '\E198'; +} +.game-icon-dunce-cap:before { + content: '\E199'; +} +.game-icon-fez:before { + content: '\E19A'; +} +.game-icon-flower-hat:before { + content: '\E19B'; +} +.game-icon-frog-prince:before { + content: '\E19C'; +} +.game-icon-full-motorcycle-helmet:before { + content: '\E19D'; +} +.game-icon-galea:before { + content: '\E19E'; +} +.game-icon-gauls-helm:before { + content: '\E19F'; +} +.game-icon-graduate-cap:before { + content: '\E1A0'; +} +.game-icon-hazmat-suit:before { + content: '\E1A1'; +} +.game-icon-hedjet-white-crown:before { + content: '\E1A2'; +} +.game-icon-imperial-crown:before { + content: '\E1A3'; +} +.game-icon-jester-hat:before { + content: '\E1A4'; +} +.game-icon-jewel-crown:before { + content: '\E1A5'; +} +.game-icon-light-helm:before { + content: '\E1A6'; +} +.game-icon-magic-hat:before { + content: '\E1A7'; +} +.game-icon-magick-trick:before { + content: '\E1A8'; +} +.game-icon-mining-helmet:before { + content: '\E1A9'; +} +.game-icon-mustache:before { + content: '\E1AA'; +} +.game-icon-nefertiti:before { + content: '\E1AB'; +} +.game-icon-outback-hat:before { + content: '\E1AC'; +} +.game-icon-overlord-helm:before { + content: '\E1AD'; +} +.game-icon-party-hat:before { + content: '\E1AE'; +} +.game-icon-phrygian-cap:before { + content: '\E1AF'; +} +.game-icon-pilgrim-hat:before { + content: '\E1B0'; +} +.game-icon-pirate-hat:before { + content: '\E1B1'; +} +.game-icon-plague-doctor-profile:before { + content: '\E1B2'; +} +.game-icon-pope-crown:before { + content: '\E1B3'; +} +.game-icon-propeller-beanie:before { + content: '\E1B4'; +} +.game-icon-pschent-double-crown:before { + content: '\E1B5'; +} +.game-icon-robin-hood-hat:before { + content: '\E1B6'; +} +.game-icon-samurai-helmet:before { + content: '\E1B7'; +} +.game-icon-samus-helmet:before { + content: '\E1B8'; +} +.game-icon-sombrero:before { + content: '\E1B9'; +} +.game-icon-spartan-helmet:before { + content: '\E1BA'; +} +.game-icon-throne-king:before { + content: '\E1BB'; +} +.game-icon-tiara:before { + content: '\E1BC'; +} +.game-icon-turban:before { + content: '\E1BD'; +} +.game-icon-ushanka:before { + content: '\E1BE'; +} +.game-icon-viking-helmet:before { + content: '\E1BF'; +} +.game-icon-war-bonnet:before { + content: '\E1C0'; +} +.game-icon-warlock-hood:before { + content: '\E1C1'; +} +.game-icon-western-hat:before { + content: '\E1C2'; +} +.game-icon-winter-hat:before { + content: '\E1C3'; +} +.game-icon-barbute:before { + content: '\E1C4'; +} +.game-icon-cowled:before { + content: '\E1C5'; +} +.game-icon-cracked-helm:before { + content: '\E1C6'; +} +.game-icon-crested-helmet:before { + content: '\E1C7'; +} +.game-icon-crown-coin:before { + content: '\E1C8'; +} +.game-icon-crown-of-thorns:before { + content: '\E1C9'; +} +.game-icon-crown:before { + content: '\E1CA'; +} +.game-icon-crowned-heart:before { + content: '\E1CB'; +} +.game-icon-crowned-skull:before { + content: '\E1CC'; +} +.game-icon-fedora:before { + content: '\E1CD'; +} +.game-icon-heavy-helm:before { + content: '\E1CE'; +} +.game-icon-helmet-head-shot:before { + content: '\E1CF'; +} +.game-icon-hood:before { + content: '\E1D0'; +} +.game-icon-horned-helm:before { + content: '\E1D1'; +} +.game-icon-laurel-crown:before { + content: '\E1D2'; +} +.game-icon-laurels:before { + content: '\E1D3'; +} +.game-icon-pointy-hat:before { + content: '\E1D4'; +} +.game-icon-queen-crown:before { + content: '\E1D5'; +} +.game-icon-sharp-crown:before { + content: '\E1D6'; +} +.game-icon-top-hat:before { + content: '\E1D7'; +} +.game-icon-visored-helm:before { + content: '\E1D8'; +} +.game-icon-helmet:before { + content: '\E1D9'; +} +.game-icon-brodie-helmet:before { + content: '\E1DA'; +} +.game-icon-pickelhaube:before { + content: '\E1DB'; +} +.game-icon-stahlhelm:before { + content: '\E1DC'; +} +.game-icon-wooden-helmet:before { + content: '\E1DD'; +} +.game-icon-nun-face:before { + content: '\E1DE'; +} +.game-icon-witch-face:before { + content: '\E1DF'; +} +.game-icon-barbarian:before { + content: '\E1E0'; +} +.game-icon-dwarf-face:before { + content: '\E1E1'; +} +.game-icon-executioner-hood:before { + content: '\E1E2'; +} +.game-icon-female-vampire:before { + content: '\E1E3'; +} +.game-icon-fish-monster:before { + content: '\E1E4'; +} +.game-icon-goblin-head:before { + content: '\E1E5'; +} +.game-icon-golem-head:before { + content: '\E1E6'; +} +.game-icon-kenku-head:before { + content: '\E1E7'; +} +.game-icon-monk-face:before { + content: '\E1E8'; +} +.game-icon-ogre:before { + content: '\E1E9'; +} +.game-icon-orc-head:before { + content: '\E1EA'; +} +.game-icon-vampire-dracula:before { + content: '\E1EB'; +} +.game-icon-wizard-face:before { + content: '\E1EC'; +} +.game-icon-woman-elf-face:before { + content: '\E1ED'; +} +.game-icon-cultist:before { + content: '\E1EE'; +} +.game-icon-diablo-skull:before { + content: '\E1EF'; +} +.game-icon-dragon-head:before { + content: '\E1F0'; +} +.game-icon-troll:before { + content: '\E1F1'; +} +.game-icon-crossbow:before { + content: '\E1F2'; +} +.game-icon-annexation:before { + content: '\E1F3'; +} +.game-icon-broken-arrow:before { + content: '\E1F4'; +} +.game-icon-forward-sun:before { + content: '\E1F5'; +} +.game-icon-dodge:before { + content: '\E1F6'; +} +.game-icon-overhead:before { + content: '\E1F7'; +} +.game-icon-sideswipe:before { + content: '\E1F8'; +} +.game-icon-thrust:before { + content: '\E1F9'; +} +.game-icon-underhand:before { + content: '\E1FA'; +} +.game-icon-achilles-heel:before { + content: '\E1FB'; +} +.game-icon-anticlockwise-rotation:before { + content: '\E1FC'; +} +.game-icon-archer:before { + content: '\E1FD'; +} +.game-icon-arrow-cursor:before { + content: '\E1FE'; +} +.game-icon-arrow-wings:before { + content: '\E1FF'; +} +.game-icon-avoidance:before { + content: '\E200'; +} +.game-icon-backward-time:before { + content: '\E201'; +} +.game-icon-body-height:before { + content: '\E202'; +} +.game-icon-bow-arrow:before { + content: '\E203'; +} +.game-icon-box-unpacking:before { + content: '\E204'; +} +.game-icon-brain-dump:before { + content: '\E205'; +} +.game-icon-chart:before { + content: '\E206'; +} +.game-icon-clockwise-rotation:before { + content: '\E207'; +} +.game-icon-cloud-download:before { + content: '\E208'; +} +.game-icon-cloud-upload:before { + content: '\E209'; +} +.game-icon-contract:before { + content: '\E20A'; +} +.game-icon-dart:before { + content: '\E20B'; +} +.game-icon-detour:before { + content: '\E20C'; +} +.game-icon-direction-sign:before { + content: '\E20D'; +} +.game-icon-encirclement:before { + content: '\E20E'; +} +.game-icon-expand:before { + content: '\E20F'; +} +.game-icon-expense:before { + content: '\E210'; +} +.game-icon-flag-objective:before { + content: '\E211'; +} +.game-icon-growth:before { + content: '\E212'; +} +.game-icon-horizontal-flip:before { + content: '\E213'; +} +.game-icon-join:before { + content: '\E214'; +} +.game-icon-misdirection:before { + content: '\E215'; +} +.game-icon-move:before { + content: '\E216'; +} +.game-icon-plain-arrow:before { + content: '\E217'; +} +.game-icon-progression:before { + content: '\E218'; +} +.game-icon-quiver:before { + content: '\E219'; +} +.game-icon-save-arrow:before { + content: '\E21A'; +} +.game-icon-slalom:before { + content: '\E21B'; +} +.game-icon-spear-feather:before { + content: '\E21C'; +} +.game-icon-spearfishing:before { + content: '\E21D'; +} +.game-icon-split-arrows:before { + content: '\E21E'; +} +.game-icon-sun-spear:before { + content: '\E21F'; +} +.game-icon-target-prize:before { + content: '\E220'; +} +.game-icon-thrust-bend:before { + content: '\E221'; +} +.game-icon-tree-growth:before { + content: '\E222'; +} +.game-icon-upgrade:before { + content: '\E223'; +} +.game-icon-vertical-flip:before { + content: '\E224'; +} +.game-icon-water-recycling:before { + content: '\E225'; +} +.game-icon-aerodynamic-harpoon:before { + content: '\E226'; +} +.game-icon-arrow-cluster:before { + content: '\E227'; +} +.game-icon-arrow-dunk:before { + content: '\E228'; +} +.game-icon-arrow-flights:before { + content: '\E229'; +} +.game-icon-arrowed:before { + content: '\E22A'; +} +.game-icon-arrowhead:before { + content: '\E22B'; +} +.game-icon-back-forth:before { + content: '\E22C'; +} +.game-icon-barbed-arrow:before { + content: '\E22D'; +} +.game-icon-barbed-spear:before { + content: '\E22E'; +} +.game-icon-bottom-right-3d-arrow:before { + content: '\E22F'; +} +.game-icon-bowman:before { + content: '\E230'; +} +.game-icon-branch-arrow:before { + content: '\E231'; +} +.game-icon-broadhead-arrow:before { + content: '\E232'; +} +.game-icon-chained-arrow-heads:before { + content: '\E233'; +} +.game-icon-charged-arrow:before { + content: '\E234'; +} +.game-icon-cheerful:before { + content: '\E235'; +} +.game-icon-chemical-arrow:before { + content: '\E236'; +} +.game-icon-crosshair-arrow:before { + content: '\E237'; +} +.game-icon-cupidon-arrow:before { + content: '\E238'; +} +.game-icon-divergence:before { + content: '\E239'; +} +.game-icon-divert:before { + content: '\E23A'; +} +.game-icon-double-shot:before { + content: '\E23B'; +} +.game-icon-energy-arrow:before { + content: '\E23C'; +} +.game-icon-falling-boulder:before { + content: '\E23D'; +} +.game-icon-fast-arrow:before { + content: '\E23E'; +} +.game-icon-flaming-arrow:before { + content: '\E23F'; +} +.game-icon-frayed-arrow:before { + content: '\E240'; +} +.game-icon-frozen-arrow:before { + content: '\E241'; +} +.game-icon-headshot:before { + content: '\E242'; +} +.game-icon-heavy-arrow:before { + content: '\E243'; +} +.game-icon-high-shot:before { + content: '\E244'; +} +.game-icon-ice-spear:before { + content: '\E245'; +} +.game-icon-imbricated-arrows:before { + content: '\E246'; +} +.game-icon-impact-point:before { + content: '\E247'; +} +.game-icon-interleaved-arrows:before { + content: '\E248'; +} +.game-icon-lift:before { + content: '\E249'; +} +.game-icon-lob-arrow:before { + content: '\E24A'; +} +.game-icon-middle-arrow:before { + content: '\E24B'; +} +.game-icon-on-target:before { + content: '\E24C'; +} +.game-icon-orb-direction:before { + content: '\E24D'; +} +.game-icon-paper-arrow:before { + content: '\E24E'; +} +.game-icon-pentarrows-tornado:before { + content: '\E24F'; +} +.game-icon-pierced-body:before { + content: '\E250'; +} +.game-icon-pierced-heart:before { + content: '\E251'; +} +.game-icon-piercing-sword:before { + content: '\E252'; +} +.game-icon-pocket-bow:before { + content: '\E253'; +} +.game-icon-profit:before { + content: '\E254'; +} +.game-icon-rally-the-troops:before { + content: '\E255'; +} +.game-icon-rapidshare-arrow:before { + content: '\E256'; +} +.game-icon-return-arrow:before { + content: '\E257'; +} +.game-icon-self-love:before { + content: '\E258'; +} +.game-icon-slicing-arrow:before { + content: '\E259'; +} +.game-icon-smash-arrows:before { + content: '\E25A'; +} +.game-icon-spear-hook:before { + content: '\E25B'; +} +.game-icon-spears:before { + content: '\E25C'; +} +.game-icon-spine-arrow:before { + content: '\E25D'; +} +.game-icon-spiral-arrow:before { + content: '\E25E'; +} +.game-icon-spotted-arrowhead:before { + content: '\E25F'; +} +.game-icon-stone-spear:before { + content: '\E260'; +} +.game-icon-striking-arrows:before { + content: '\E261'; +} +.game-icon-striking-clamps:before { + content: '\E262'; +} +.game-icon-supersonic-arrow:before { + content: '\E263'; +} +.game-icon-target-arrows:before { + content: '\E264'; +} +.game-icon-target-shot:before { + content: '\E265'; +} +.game-icon-thorn-helix:before { + content: '\E266'; +} +.game-icon-thorned-arrow:before { + content: '\E267'; +} +.game-icon-thrown-spear:before { + content: '\E268'; +} +.game-icon-trade:before { + content: '\E269'; +} +.game-icon-tron-arrow:before { + content: '\E26A'; +} +.game-icon-uncertainty:before { + content: '\E26B'; +} +.game-icon-wavy-itinerary:before { + content: '\E26C'; +} +.game-icon-wide-arrow-dunk:before { + content: '\E26D'; +} +.game-icon-william-tell-skull:before { + content: '\E26E'; +} +.game-icon-william-tell:before { + content: '\E26F'; +} +.game-icon-winged-arrow:before { + content: '\E270'; +} +.game-icon-zig-arrow:before { + content: '\E271'; +} +.game-icon-bunker-assault:before { + content: '\E272'; +} +.game-icon-trench-assault:before { + content: '\E273'; +} +.game-icon-fall-down:before { + content: '\E274'; +} +.game-icon-pounce:before { + content: '\E275'; +} +.game-icon-bullseye:before { + content: '\E276'; +} +.game-icon-flying-shuriken:before { + content: '\E277'; +} +.game-icon-kusarigama:before { + content: '\E278'; +} +.game-icon-north-star-shuriken:before { + content: '\E279'; +} +.game-icon-sharp-shuriken:before { + content: '\E27A'; +} +.game-icon-shuriken:before { + content: '\E27B'; +} +.game-icon-star-shuriken:before { + content: '\E27C'; +} +.game-icon-three-pointed-shuriken:before { + content: '\E27D'; +} +.game-icon-whirlpool-shuriken:before { + content: '\E27E'; +} +.game-icon-ninja-star:before { + content: '\E27F'; +} +.game-icon-shepherds-crook:before { + content: '\E280'; +} +.game-icon-armored-boomerang:before { + content: '\E281'; +} +.game-icon-baseball-bat:before { + content: '\E282'; +} +.game-icon-bo:before { + content: '\E283'; +} +.game-icon-bone-mace:before { + content: '\E284'; +} +.game-icon-boomerang-cross:before { + content: '\E285'; +} +.game-icon-boomerang:before { + content: '\E286'; +} +.game-icon-bow-string:before { + content: '\E287'; +} +.game-icon-brass-knuckles:before { + content: '\E288'; +} +.game-icon-broken-axe:before { + content: '\E289'; +} +.game-icon-claymore-explosive:before { + content: '\E28A'; +} +.game-icon-crescent-staff:before { + content: '\E28B'; +} +.game-icon-crowbar:before { + content: '\E28C'; +} +.game-icon-dagger-rose:before { + content: '\E28D'; +} +.game-icon-detonator:before { + content: '\E28E'; +} +.game-icon-flail:before { + content: '\E28F'; +} +.game-icon-flamethrower-soldier:before { + content: '\E290'; +} +.game-icon-flamethrower:before { + content: '\E291'; +} +.game-icon-flanged-mace:before { + content: '\E292'; +} +.game-icon-gun-rose:before { + content: '\E293'; +} +.game-icon-heavy-bullets:before { + content: '\E294'; +} +.game-icon-human-cannonball:before { + content: '\E295'; +} +.game-icon-hunting-bolas:before { + content: '\E296'; +} +.game-icon-laser-turret:before { + content: '\E297'; +} +.game-icon-lasso:before { + content: '\E298'; +} +.game-icon-lead-pipe:before { + content: '\E299'; +} +.game-icon-lunar-wand:before { + content: '\E29A'; +} +.game-icon-magic-trident:before { + content: '\E29B'; +} +.game-icon-missile-launcher:before { + content: '\E29C'; +} +.game-icon-monkey-wrench:before { + content: '\E29D'; +} +.game-icon-mortar:before { + content: '\E29E'; +} +.game-icon-nunchaku:before { + content: '\E29F'; +} +.game-icon-panzerfaust:before { + content: '\E2A0'; +} +.game-icon-reload-gun-barrel:before { + content: '\E2A1'; +} +.game-icon-revolver:before { + content: '\E2A2'; +} +.game-icon-saber-and-pistol:before { + content: '\E2A3'; +} +.game-icon-sai:before { + content: '\E2A4'; +} +.game-icon-sawed-off-shotgun:before { + content: '\E2A5'; +} +.game-icon-sharp-axe:before { + content: '\E2A6'; +} +.game-icon-silver-bullet:before { + content: '\E2A7'; +} +.game-icon-skull-staff:before { + content: '\E2A8'; +} +.game-icon-sling:before { + content: '\E2A9'; +} +.game-icon-slingshot:before { + content: '\E2AA'; +} +.game-icon-stake-hammer:before { + content: '\E2AB'; +} +.game-icon-submarine-missile:before { + content: '\E2AC'; +} +.game-icon-switch-weapon:before { + content: '\E2AD'; +} +.game-icon-sword-brandish:before { + content: '\E2AE'; +} +.game-icon-thor-hammer:before { + content: '\E2AF'; +} +.game-icon-tomahawk:before { + content: '\E2B0'; +} +.game-icon-torpedo:before { + content: '\E2B1'; +} +.game-icon-umbrella-bayonet:before { + content: '\E2B2'; +} +.game-icon-uzi:before { + content: '\E2B3'; +} +.game-icon-walking-turret:before { + content: '\E2B4'; +} +.game-icon-war-axe:before { + content: '\E2B5'; +} +.game-icon-war-pick:before { + content: '\E2B6'; +} +.game-icon-warhammer:before { + content: '\E2B7'; +} +.game-icon-winged-scepter:before { + content: '\E2B8'; +} +.game-icon-wood-club:before { + content: '\E2B9'; +} +.game-icon-zat-gun:before { + content: '\E2BA'; +} +.game-icon-all-for-one:before { + content: '\E2BB'; +} +.game-icon-andromeda-chain:before { + content: '\E2BC'; +} +.game-icon-archery-target:before { + content: '\E2BD'; +} +.game-icon-autogun:before { + content: '\E2BE'; +} +.game-icon-axe-in-stump:before { + content: '\E2BF'; +} +.game-icon-backstab:before { + content: '\E2C0'; +} +.game-icon-battered-axe:before { + content: '\E2C1'; +} +.game-icon-battle-axe:before { + content: '\E2C2'; +} +.game-icon-beam-wake:before { + content: '\E2C3'; +} +.game-icon-blunderbuss:before { + content: '\E2C4'; +} +.game-icon-bolas:before { + content: '\E2C5'; +} +.game-icon-bolter-gun:before { + content: '\E2C6'; +} +.game-icon-broken-bottle:before { + content: '\E2C7'; +} +.game-icon-bullets:before { + content: '\E2C8'; +} +.game-icon-cannon-ball:before { + content: '\E2C9'; +} +.game-icon-cannon-shot:before { + content: '\E2CA'; +} +.game-icon-cannon:before { + content: '\E2CB'; +} +.game-icon-crossed-pistols:before { + content: '\E2CC'; +} +.game-icon-crossed-sabres:before { + content: '\E2CD'; +} +.game-icon-crossed-swords:before { + content: '\E2CE'; +} +.game-icon-crystal-wand:before { + content: '\E2CF'; +} +.game-icon-dripping-knife:before { + content: '\E2D0'; +} +.game-icon-fairy-wand:before { + content: '\E2D1'; +} +.game-icon-flaming-trident:before { + content: '\E2D2'; +} +.game-icon-grapple:before { + content: '\E2D3'; +} +.game-icon-grenade:before { + content: '\E2D4'; +} +.game-icon-gunshot:before { + content: '\E2D5'; +} +.game-icon-halberd-shuriken:before { + content: '\E2D6'; +} +.game-icon-harpoon-chain:before { + content: '\E2D7'; +} +.game-icon-harpoon-trident:before { + content: '\E2D8'; +} +.game-icon-laser-blast:before { + content: '\E2D9'; +} +.game-icon-lightning-bow:before { + content: '\E2DA'; +} +.game-icon-mace-head:before { + content: '\E2DB'; +} +.game-icon-machete:before { + content: '\E2DC'; +} +.game-icon-minigun:before { + content: '\E2DD'; +} +.game-icon-missile-pod:before { + content: '\E2DE'; +} +.game-icon-missile-swarm:before { + content: '\E2DF'; +} +.game-icon-pincers:before { + content: '\E2E0'; +} +.game-icon-ray-gun:before { + content: '\E2E1'; +} +.game-icon-reticule:before { + content: '\E2E2'; +} +.game-icon-saber-slash:before { + content: '\E2E3'; +} +.game-icon-sabers-choc:before { + content: '\E2E4'; +} +.game-icon-sacrificial-dagger:before { + content: '\E2E5'; +} +.game-icon-scalpel-strike:before { + content: '\E2E6'; +} +.game-icon-scythe:before { + content: '\E2E7'; +} +.game-icon-sentry-gun:before { + content: '\E2E8'; +} +.game-icon-shuriken-2:before { + content: '\E2E9'; +} +.game-icon-slavery-whip:before { + content: '\E2EA'; +} +.game-icon-sparkling-sabre:before { + content: '\E2EB'; +} +.game-icon-spiked-mace:before { + content: '\E2EC'; +} +.game-icon-spray:before { + content: '\E2ED'; +} +.game-icon-stiletto:before { + content: '\E2EE'; +} +.game-icon-supersonic-bullet:before { + content: '\E2EF'; +} +.game-icon-sword-clash:before { + content: '\E2F0'; +} +.game-icon-sword-in-stone:before { + content: '\E2F1'; +} +.game-icon-sword-spade:before { + content: '\E2F2'; +} +.game-icon-tesla-turret:before { + content: '\E2F3'; +} +.game-icon-trefoil-shuriken:before { + content: '\E2F4'; +} +.game-icon-trident:before { + content: '\E2F5'; +} +.game-icon-wave-strike:before { + content: '\E2F6'; +} +.game-icon-whip:before { + content: '\E2F7'; +} +.game-icon-winged-sword:before { + content: '\E2F8'; +} +.game-icon-wizard-staff:before { + content: '\E2F9'; +} +.game-icon-anti-aircraft-gun:before { + content: '\E2FA'; +} +.game-icon-field-gun:before { + content: '\E2FB'; +} +.game-icon-ammo-box:before { + content: '\E2FC'; +} +.game-icon-chaingun:before { + content: '\E2FD'; +} +.game-icon-duel:before { + content: '\E2FE'; +} +.game-icon-grenade-2:before { + content: '\E2FF'; +} +.game-icon-laser-gun:before { + content: '\E300'; +} +.game-icon-rifle:before { + content: '\E301'; +} +.game-icon-shotgun:before { + content: '\E302'; +} +.game-icon-turret:before { + content: '\E303'; +} +.game-icon-bayonet:before { + content: '\E304'; +} +.game-icon-drop-weapon:before { + content: '\E305'; +} +.game-icon-gladius:before { + content: '\E306'; +} +.game-icon-lee-enfield:before { + content: '\E307'; +} +.game-icon-luger:before { + content: '\E308'; +} +.game-icon-nuclear-bomb:before { + content: '\E309'; +} +.game-icon-spiked-ball:before { + content: '\E30A'; +} +.game-icon-spiked-bat:before { + content: '\E30B'; +} +.game-icon-stick-grenade:before { + content: '\E30C'; +} +.game-icon-tec-9:before { + content: '\E30D'; +} +.game-icon-telescopic-baton:before { + content: '\E30E'; +} +.game-icon-teller-mine:before { + content: '\E30F'; +} +.game-icon-orb-wand:before { + content: '\E310'; +} +.game-icon-flame:before { + content: '\E311'; +} +.game-icon-bellows:before { + content: '\E312'; +} +.game-icon-brasero:before { + content: '\E313'; +} +.game-icon-burning-forest:before { + content: '\E314'; +} +.game-icon-camp-cooking-pot:before { + content: '\E315'; +} +.game-icon-candles:before { + content: '\E316'; +} +.game-icon-dice-fire:before { + content: '\E317'; +} +.game-icon-fire-extinguisher:before { + content: '\E318'; +} +.game-icon-fire-flower:before { + content: '\E319'; +} +.game-icon-fire-gem:before { + content: '\E31A'; +} +.game-icon-fire-shrine:before { + content: '\E31B'; +} +.game-icon-fire-spell-cast:before { + content: '\E31C'; +} +.game-icon-fireplace:before { + content: '\E31D'; +} +.game-icon-firewall:before { + content: '\E31E'; +} +.game-icon-fish-smoking:before { + content: '\E31F'; +} +.game-icon-flint-spark:before { + content: '\E320'; +} +.game-icon-furnace:before { + content: '\E321'; +} +.game-icon-gas-stove:before { + content: '\E322'; +} +.game-icon-lighter:before { + content: '\E323'; +} +.game-icon-lightning-flame:before { + content: '\E324'; +} +.game-icon-marshmallows:before { + content: '\E325'; +} +.game-icon-matchbox:before { + content: '\E326'; +} +.game-icon-primitive-torch:before { + content: '\E327'; +} +.game-icon-pyre:before { + content: '\E328'; +} +.game-icon-torch:before { + content: '\E329'; +} +.game-icon-alien-fire:before { + content: '\E32A'; +} +.game-icon-arson:before { + content: '\E32B'; +} +.game-icon-burning-book:before { + content: '\E32C'; +} +.game-icon-burning-dot:before { + content: '\E32D'; +} +.game-icon-burning-embers:before { + content: '\E32E'; +} +.game-icon-burning-eye:before { + content: '\E32F'; +} +.game-icon-burning-meteor:before { + content: '\E330'; +} +.game-icon-burning-passion:before { + content: '\E331'; +} +.game-icon-burning-tree:before { + content: '\E332'; +} +.game-icon-caldera:before { + content: '\E333'; +} +.game-icon-campfire:before { + content: '\E334'; +} +.game-icon-candle-flame:before { + content: '\E335'; +} +.game-icon-candle-holder:before { + content: '\E336'; +} +.game-icon-candle-light:before { + content: '\E337'; +} +.game-icon-candlebright:before { + content: '\E338'; +} +.game-icon-celebration-fire:before { + content: '\E339'; +} +.game-icon-dragon-breath:before { + content: '\E33A'; +} +.game-icon-ember-shot:before { + content: '\E33B'; +} +.game-icon-eruption:before { + content: '\E33C'; +} +.game-icon-fire-ace:before { + content: '\E33D'; +} +.game-icon-fire-axe:before { + content: '\E33E'; +} +.game-icon-fire-bomb:before { + content: '\E33F'; +} +.game-icon-fire-bottle:before { + content: '\E340'; +} +.game-icon-fire-bowl:before { + content: '\E341'; +} +.game-icon-fire-breath:before { + content: '\E342'; +} +.game-icon-fire-dash:before { + content: '\E343'; +} +.game-icon-fire-punch:before { + content: '\E344'; +} +.game-icon-fire-ray:before { + content: '\E345'; +} +.game-icon-fire-ring:before { + content: '\E346'; +} +.game-icon-fire-silhouette:before { + content: '\E347'; +} +.game-icon-fire-tail:before { + content: '\E348'; +} +.game-icon-fire-wave:before { + content: '\E349'; +} +.game-icon-fire-zone:before { + content: '\E34A'; +} +.game-icon-fireball:before { + content: '\E34B'; +} +.game-icon-firework-rocket:before { + content: '\E34C'; +} +.game-icon-flame-claws:before { + content: '\E34D'; +} +.game-icon-flame-spin:before { + content: '\E34E'; +} +.game-icon-flame-tunnel:before { + content: '\E34F'; +} +.game-icon-flamed-leaf:before { + content: '\E350'; +} +.game-icon-flaming-claw:before { + content: '\E351'; +} +.game-icon-flaming-sheet:before { + content: '\E352'; +} +.game-icon-fluffy-flame:before { + content: '\E353'; +} +.game-icon-frostfire:before { + content: '\E354'; +} +.game-icon-heartburn:before { + content: '\E355'; +} +.game-icon-heat-haze:before { + content: '\E356'; +} +.game-icon-hot-spices:before { + content: '\E357'; +} +.game-icon-ifrit:before { + content: '\E358'; +} +.game-icon-kindle:before { + content: '\E359'; +} +.game-icon-lantern-flame:before { + content: '\E35A'; +} +.game-icon-lit-candelabra:before { + content: '\E35B'; +} +.game-icon-match-head:before { + content: '\E35C'; +} +.game-icon-match-tip:before { + content: '\E35D'; +} +.game-icon-molotov:before { + content: '\E35E'; +} +.game-icon-plasma-bolt:before { + content: '\E35F'; +} +.game-icon-pyromaniac:before { + content: '\E360'; +} +.game-icon-salamander:before { + content: '\E361'; +} +.game-icon-small-fire:before { + content: '\E362'; +} +.game-icon-spark-spirit:before { + content: '\E363'; +} +.game-icon-three-burning-balls:before { + content: '\E364'; +} +.game-icon-thrown-charcoal:before { + content: '\E365'; +} +.game-icon-unfriendly-fire:before { + content: '\E366'; +} +.game-icon-volcano:before { + content: '\E367'; +} +.game-icon-wildfires:before { + content: '\E368'; +} +.game-icon-blast:before { + content: '\E369'; +} +.game-icon-blaster:before { + content: '\E36A'; +} +.game-icon-burn:before { + content: '\E36B'; +} +.game-icon-fire:before { + content: '\E36C'; +} +.game-icon-fireflake:before { + content: '\E36D'; +} +.game-icon-flamer:before { + content: '\E36E'; +} +.game-icon-hot-surface:before { + content: '\E36F'; +} +.game-icon-lava:before { + content: '\E370'; +} +.game-icon-lucifer-cannon:before { + content: '\E371'; +} +.game-icon-burning-skull:before { + content: '\E372'; +} +.game-icon-mite-alt:before { + content: '\E373'; +} +.game-icon-spider-alt:before { + content: '\E374'; +} +.game-icon-spider-face:before { + content: '\E375'; +} +.game-icon-earth-worm:before { + content: '\E376'; +} +.game-icon-flying-trout:before { + content: '\E377'; +} +.game-icon-polar-bear:before { + content: '\E378'; +} +.game-icon-plants-and-animals:before { + content: '\E379'; +} +.game-icon-animal-hide:before { + content: '\E37A'; +} +.game-icon-bat-2:before { + content: '\E37B'; +} +.game-icon-bear-head:before { + content: '\E37C'; +} +.game-icon-camel-head:before { + content: '\E37D'; +} +.game-icon-cassowary-head:before { + content: '\E37E'; +} +.game-icon-charging-bull:before { + content: '\E37F'; +} +.game-icon-chicken:before { + content: '\E380'; +} +.game-icon-clownfish:before { + content: '\E381'; +} +.game-icon-cow:before { + content: '\E382'; +} +.game-icon-cricket:before { + content: '\E383'; +} +.game-icon-deer-track:before { + content: '\E384'; +} +.game-icon-dog-bowl:before { + content: '\E385'; +} +.game-icon-dog-house:before { + content: '\E386'; +} +.game-icon-dolphin:before { + content: '\E387'; +} +.game-icon-duck:before { + content: '\E388'; +} +.game-icon-eagle-head:before { + content: '\E389'; +} +.game-icon-elephant-head:before { + content: '\E38A'; +} +.game-icon-elephant:before { + content: '\E38B'; +} +.game-icon-falcon-moon:before { + content: '\E38C'; +} +.game-icon-feline:before { + content: '\E38D'; +} +.game-icon-finch:before { + content: '\E38E'; +} +.game-icon-flamingo:before { + content: '\E38F'; +} +.game-icon-fox-tail:before { + content: '\E390'; +} +.game-icon-giant-squid:before { + content: '\E391'; +} +.game-icon-gorilla:before { + content: '\E392'; +} +.game-icon-griffin-symbol:before { + content: '\E393'; +} +.game-icon-honey-jar:before { + content: '\E394'; +} +.game-icon-horse-head:before { + content: '\E395'; +} +.game-icon-ivory-tusks:before { + content: '\E396'; +} +.game-icon-kangaroo:before { + content: '\E397'; +} +.game-icon-koala:before { + content: '\E398'; +} +.game-icon-labrador-head:before { + content: '\E399'; +} +.game-icon-lynx-head:before { + content: '\E39A'; +} +.game-icon-manta-ray:before { + content: '\E39B'; +} +.game-icon-moon-bats:before { + content: '\E39C'; +} +.game-icon-panda:before { + content: '\E39D'; +} +.game-icon-penguin:before { + content: '\E39E'; +} +.game-icon-pinata:before { + content: '\E39F'; +} +.game-icon-praying-mantis:before { + content: '\E3A0'; +} +.game-icon-rabbit:before { + content: '\E3A1'; +} +.game-icon-rat:before { + content: '\E3A2'; +} +.game-icon-rhinoceros-horn:before { + content: '\E3A3'; +} +.game-icon-rooster:before { + content: '\E3A4'; +} +.game-icon-saddle:before { + content: '\E3A5'; +} +.game-icon-sea-star:before { + content: '\E3A6'; +} +.game-icon-seahorse:before { + content: '\E3A7'; +} +.game-icon-shark-bite:before { + content: '\E3A8'; +} +.game-icon-shark-fin:before { + content: '\E3A9'; +} +.game-icon-sheep:before { + content: '\E3AA'; +} +.game-icon-snail-eyes:before { + content: '\E3AB'; +} +.game-icon-sperm-whale:before { + content: '\E3AC'; +} +.game-icon-stable:before { + content: '\E3AD'; +} +.game-icon-tiger-head:before { + content: '\E3AE'; +} +.game-icon-tiger:before { + content: '\E3AF'; +} +.game-icon-tortoise:before { + content: '\E3B0'; +} +.game-icon-toucan:before { + content: '\E3B1'; +} +.game-icon-trojan-horse:before { + content: '\E3B2'; +} +.game-icon-udder:before { + content: '\E3B3'; +} +.game-icon-whale-tail:before { + content: '\E3B4'; +} +.game-icon-wool:before { + content: '\E3B5'; +} +.game-icon-worms:before { + content: '\E3B6'; +} +.game-icon-yarn:before { + content: '\E3B7'; +} +.game-icon-ammonite-fossil:before { + content: '\E3B8'; +} +.game-icon-ammonite:before { + content: '\E3B9'; +} +.game-icon-angler-fish:before { + content: '\E3BA'; +} +.game-icon-angular-spider:before { + content: '\E3BB'; +} +.game-icon-animal-skull:before { + content: '\E3BC'; +} +.game-icon-armadillo-tail:before { + content: '\E3BD'; +} +.game-icon-bat-wing:before { + content: '\E3BE'; +} +.game-icon-bee:before { + content: '\E3BF'; +} +.game-icon-bird-twitter:before { + content: '\E3C0'; +} +.game-icon-boar-tusks:before { + content: '\E3C1'; +} +.game-icon-bull-horns:before { + content: '\E3C2'; +} +.game-icon-bull:before { + content: '\E3C3'; +} +.game-icon-butterfly-warning:before { + content: '\E3C4'; +} +.game-icon-butterfly:before { + content: '\E3C5'; +} +.game-icon-cat:before { + content: '\E3C6'; +} +.game-icon-centipede:before { + content: '\E3C7'; +} +.game-icon-chicken-leg:before { + content: '\E3C8'; +} +.game-icon-cobweb:before { + content: '\E3C9'; +} +.game-icon-crab-claw:before { + content: '\E3CA'; +} +.game-icon-crab:before { + content: '\E3CB'; +} +.game-icon-croc-jaws:before { + content: '\E3CC'; +} +.game-icon-crossed-claws:before { + content: '\E3CD'; +} +.game-icon-crow-dive:before { + content: '\E3CE'; +} +.game-icon-desert-skull:before { + content: '\E3CF'; +} +.game-icon-dinosaur-rex:before { + content: '\E3D0'; +} +.game-icon-dragonfly:before { + content: '\E3D1'; +} +.game-icon-earwig:before { + content: '\E3D2'; +} +.game-icon-evil-bat:before { + content: '\E3D3'; +} +.game-icon-fish-corpse:before { + content: '\E3D4'; +} +.game-icon-fishbone:before { + content: '\E3D5'; +} +.game-icon-flat-paw-print:before { + content: '\E3D6'; +} +.game-icon-food-chain:before { + content: '\E3D7'; +} +.game-icon-fox-head:before { + content: '\E3D8'; +} +.game-icon-frog:before { + content: '\E3D9'; +} +.game-icon-gecko:before { + content: '\E3DA'; +} +.game-icon-gold-scarab:before { + content: '\E3DB'; +} +.game-icon-grasping-claws:before { + content: '\E3DC'; +} +.game-icon-hanging-spider:before { + content: '\E3DD'; +} +.game-icon-hollow-cat:before { + content: '\E3DE'; +} +.game-icon-hoof:before { + content: '\E3DF'; +} +.game-icon-horse-head-2:before { + content: '\E3E0'; +} +.game-icon-hound:before { + content: '\E3E1'; +} +.game-icon-insect-jaws:before { + content: '\E3E2'; +} +.game-icon-jellyfish:before { + content: '\E3E3'; +} +.game-icon-lamprey-mouth:before { + content: '\E3E4'; +} +.game-icon-leeching-worm:before { + content: '\E3E5'; +} +.game-icon-lion:before { + content: '\E3E6'; +} +.game-icon-maggot:before { + content: '\E3E7'; +} +.game-icon-masked-spider:before { + content: '\E3E8'; +} +.game-icon-minotaur:before { + content: '\E3E9'; +} +.game-icon-mite:before { + content: '\E3EA'; +} +.game-icon-monkey:before { + content: '\E3EB'; +} +.game-icon-mouse:before { + content: '\E3EC'; +} +.game-icon-octopus:before { + content: '\E3ED'; +} +.game-icon-ouroboros:before { + content: '\E3EE'; +} +.game-icon-owl:before { + content: '\E3EF'; +} +.game-icon-parmecia:before { + content: '\E3F0'; +} +.game-icon-parrot-head:before { + content: '\E3F1'; +} +.game-icon-paw-front:before { + content: '\E3F2'; +} +.game-icon-paw-heart:before { + content: '\E3F3'; +} +.game-icon-paw-print:before { + content: '\E3F4'; +} +.game-icon-paw:before { + content: '\E3F5'; +} +.game-icon-raven:before { + content: '\E3F6'; +} +.game-icon-roast-chicken:before { + content: '\E3F7'; +} +.game-icon-sad-crab:before { + content: '\E3F8'; +} +.game-icon-scarab-beetle:before { + content: '\E3F9'; +} +.game-icon-scorpion-tail:before { + content: '\E3FA'; +} +.game-icon-scorpion:before { + content: '\E3FB'; +} +.game-icon-sea-serpent:before { + content: '\E3FC'; +} +.game-icon-seated-mouse:before { + content: '\E3FD'; +} +.game-icon-shark-jaws:before { + content: '\E3FE'; +} +.game-icon-snail:before { + content: '\E3FF'; +} +.game-icon-snake-bite:before { + content: '\E400'; +} +.game-icon-snake-totem:before { + content: '\E401'; +} +.game-icon-snake:before { + content: '\E402'; +} +.game-icon-sonic-screech:before { + content: '\E403'; +} +.game-icon-spider-web:before { + content: '\E404'; +} +.game-icon-spiked-snail:before { + content: '\E405'; +} +.game-icon-squid-head:before { + content: '\E406'; +} +.game-icon-squid:before { + content: '\E407'; +} +.game-icon-stag-head:before { + content: '\E408'; +} +.game-icon-stomp:before { + content: '\E409'; +} +.game-icon-swan:before { + content: '\E40A'; +} +.game-icon-tick:before { + content: '\E40B'; +} +.game-icon-top-paw:before { + content: '\E40C'; +} +.game-icon-trilobite:before { + content: '\E40D'; +} +.game-icon-turd:before { + content: '\E40E'; +} +.game-icon-turtle-shell:before { + content: '\E40F'; +} +.game-icon-turtle:before { + content: '\E410'; +} +.game-icon-virus:before { + content: '\E411'; +} +.game-icon-vulture:before { + content: '\E412'; +} +.game-icon-wasp-sting:before { + content: '\E413'; +} +.game-icon-web-spit:before { + content: '\E414'; +} +.game-icon-werewolf:before { + content: '\E415'; +} +.game-icon-wolf-head:before { + content: '\E416'; +} +.game-icon-wolf-howl:before { + content: '\E417'; +} +.game-icon-wolverine-claws:before { + content: '\E418'; +} +.game-icon-worm-mouth:before { + content: '\E419'; +} +.game-icon-big-egg:before { + content: '\E41A'; +} +.game-icon-claw:before { + content: '\E41B'; +} +.game-icon-poison:before { + content: '\E41C'; +} +.game-icon-bear-face:before { + content: '\E41D'; +} +.game-icon-donkey:before { + content: '\E41E'; +} +.game-icon-goat:before { + content: '\E41F'; +} +.game-icon-long-legged-spider:before { + content: '\E420'; +} +.game-icon-mounted-knight:before { + content: '\E421'; +} +.game-icon-pegasus:before { + content: '\E422'; +} +.game-icon-pig:before { + content: '\E423'; +} +.game-icon-amber-mosquito:before { + content: '\E424'; +} +.game-icon-ant:before { + content: '\E425'; +} +.game-icon-ants:before { + content: '\E426'; +} +.game-icon-beehive:before { + content: '\E427'; +} +.game-icon-bug-net:before { + content: '\E428'; +} +.game-icon-butterfly-flower:before { + content: '\E429'; +} +.game-icon-caterpillar:before { + content: '\E42A'; +} +.game-icon-cigale:before { + content: '\E42B'; +} +.game-icon-claws:before { + content: '\E42C'; +} +.game-icon-fly:before { + content: '\E42D'; +} +.game-icon-flying-beetle:before { + content: '\E42E'; +} +.game-icon-ladybug:before { + content: '\E42F'; +} +.game-icon-shrimp:before { + content: '\E430'; +} +.game-icon-spider-eye:before { + content: '\E431'; +} +.game-icon-tree-beehive:before { + content: '\E432'; +} +.game-icon-apple-maggot:before { + content: '\E433'; +} +.game-icon-beetle-shell:before { + content: '\E434'; +} +.game-icon-dripping-honey:before { + content: '\E435'; +} +.game-icon-long-antennae-bug:before { + content: '\E436'; +} +.game-icon-opening-shell:before { + content: '\E437'; +} +.game-icon-spotted-bug:before { + content: '\E438'; +} +.game-icon-acrobatic:before { + content: '\E439'; +} +.game-icon-catch:before { + content: '\E43A'; +} +.game-icon-running-ninja:before { + content: '\E43B'; +} +.game-icon-button-finger:before { + content: '\E43C'; +} +.game-icon-chat-bubble:before { + content: '\E43D'; +} +.game-icon-choice:before { + content: '\E43E'; +} +.game-icon-convince:before { + content: '\E43F'; +} +.game-icon-crafting:before { + content: '\E440'; +} +.game-icon-discussion:before { + content: '\E441'; +} +.game-icon-drinking:before { + content: '\E442'; +} +.game-icon-eating:before { + content: '\E443'; +} +.game-icon-flying-fox:before { + content: '\E444'; +} +.game-icon-hiking:before { + content: '\E445'; +} +.game-icon-hive-mind:before { + content: '\E446'; +} +.game-icon-jump-across:before { + content: '\E447'; +} +.game-icon-kneeling:before { + content: '\E448'; +} +.game-icon-leapfrog:before { + content: '\E449'; +} +.game-icon-look-at:before { + content: '\E44A'; +} +.game-icon-miner:before { + content: '\E44B'; +} +.game-icon-night-sleep:before { + content: '\E44C'; +} +.game-icon-public-speaker:before { + content: '\E44D'; +} +.game-icon-pull:before { + content: '\E44E'; +} +.game-icon-push:before { + content: '\E44F'; +} +.game-icon-shaking-hands:before { + content: '\E450'; +} +.game-icon-shrug:before { + content: '\E451'; +} +.game-icon-skills:before { + content: '\E452'; +} +.game-icon-stairs-goal:before { + content: '\E453'; +} +.game-icon-teacher:before { + content: '\E454'; +} +.game-icon-team-idea:before { + content: '\E455'; +} +.game-icon-think:before { + content: '\E456'; +} +.game-icon-throwing-ball:before { + content: '\E457'; +} +.game-icon-uprising:before { + content: '\E458'; +} +.game-icon-vote:before { + content: '\E459'; +} +.game-icon-walk:before { + content: '\E45A'; +} +.game-icon-boot-kick:before { + content: '\E45B'; +} +.game-icon-boot-stomp:before { + content: '\E45C'; +} +.game-icon-disintegrate:before { + content: '\E45D'; +} +.game-icon-dodging:before { + content: '\E45E'; +} +.game-icon-drowning:before { + content: '\E45F'; +} +.game-icon-fruiting:before { + content: '\E460'; +} +.game-icon-grab:before { + content: '\E461'; +} +.game-icon-journey:before { + content: '\E462'; +} +.game-icon-juggler:before { + content: '\E463'; +} +.game-icon-meditation:before { + content: '\E464'; +} +.game-icon-mining:before { + content: '\E465'; +} +.game-icon-muscle-up:before { + content: '\E466'; +} +.game-icon-pointing:before { + content: '\E467'; +} +.game-icon-pouring-chalice:before { + content: '\E468'; +} +.game-icon-prayer:before { + content: '\E469'; +} +.game-icon-run:before { + content: '\E46A'; +} +.game-icon-screaming:before { + content: '\E46B'; +} +.game-icon-shouting:before { + content: '\E46C'; +} +.game-icon-sing:before { + content: '\E46D'; +} +.game-icon-slap:before { + content: '\E46E'; +} +.game-icon-snatch:before { + content: '\E46F'; +} +.game-icon-sprint:before { + content: '\E470'; +} +.game-icon-stick-splitting:before { + content: '\E471'; +} +.game-icon-stone-crafting:before { + content: '\E472'; +} +.game-icon-swallow:before { + content: '\E473'; +} +.game-icon-targeting:before { + content: '\E474'; +} +.game-icon-tearing:before { + content: '\E475'; +} +.game-icon-teleport:before { + content: '\E476'; +} +.game-icon-transfuse:before { + content: '\E477'; +} +.game-icon-vomiting:before { + content: '\E478'; +} +.game-icon-crush:before { + content: '\E479'; +} +.game-icon-amputation:before { + content: '\E47A'; +} +.game-icon-read:before { + content: '\E47B'; +} +.game-icon-talk:before { + content: '\E47C'; +} +.game-icon-africa:before { + content: '\E47D'; +} +.game-icon-algeria:before { + content: '\E47E'; +} +.game-icon-angola:before { + content: '\E47F'; +} +.game-icon-antarctica:before { + content: '\E480'; +} +.game-icon-atlas:before { + content: '\E481'; +} +.game-icon-australia:before { + content: '\E482'; +} +.game-icon-belgium:before { + content: '\E483'; +} +.game-icon-binoculars:before { + content: '\E484'; +} +.game-icon-black-sea:before { + content: '\E485'; +} +.game-icon-bolivia:before { + content: '\E486'; +} +.game-icon-brazil:before { + content: '\E487'; +} +.game-icon-bulgaria:before { + content: '\E488'; +} +.game-icon-cambodia:before { + content: '\E489'; +} +.game-icon-colombia:before { + content: '\E48A'; +} +.game-icon-corsica:before { + content: '\E48B'; +} +.game-icon-crossroad:before { + content: '\E48C'; +} +.game-icon-direction-signs:before { + content: '\E48D'; +} +.game-icon-earth-africa-europe:before { + content: '\E48E'; +} +.game-icon-earth-america:before { + content: '\E48F'; +} +.game-icon-earth-asia-oceania:before { + content: '\E490'; +} +.game-icon-ecology:before { + content: '\E491'; +} +.game-icon-egypt:before { + content: '\E492'; +} +.game-icon-france:before { + content: '\E493'; +} +.game-icon-guatemala:before { + content: '\E494'; +} +.game-icon-hungary:before { + content: '\E495'; +} +.game-icon-iceland:before { + content: '\E496'; +} +.game-icon-iraq:before { + content: '\E497'; +} +.game-icon-italia:before { + content: '\E498'; +} +.game-icon-japan:before { + content: '\E499'; +} +.game-icon-kenya:before { + content: '\E49A'; +} +.game-icon-latvia:before { + content: '\E49B'; +} +.game-icon-libya:before { + content: '\E49C'; +} +.game-icon-mesh-network:before { + content: '\E49D'; +} +.game-icon-mexico:before { + content: '\E49E'; +} +.game-icon-moldova:before { + content: '\E49F'; +} +.game-icon-mongolia:before { + content: '\E4A0'; +} +.game-icon-nigeria:before { + content: '\E4A1'; +} +.game-icon-paraguay:before { + content: '\E4A2'; +} +.game-icon-path-distance:before { + content: '\E4A3'; +} +.game-icon-peru:before { + content: '\E4A4'; +} +.game-icon-portugal:before { + content: '\E4A5'; +} +.game-icon-position-marker:before { + content: '\E4A6'; +} +.game-icon-radar-cross-section:before { + content: '\E4A7'; +} +.game-icon-road:before { + content: '\E4A8'; +} +.game-icon-sextant:before { + content: '\E4A9'; +} +.game-icon-south-africa:before { + content: '\E4AA'; +} +.game-icon-south-america:before { + content: '\E4AB'; +} +.game-icon-south-korea:before { + content: '\E4AC'; +} +.game-icon-spain:before { + content: '\E4AD'; +} +.game-icon-sri-lanka:before { + content: '\E4AE'; +} +.game-icon-switzerland:before { + content: '\E4AF'; +} +.game-icon-tanzania:before { + content: '\E4B0'; +} +.game-icon-texas:before { + content: '\E4B1'; +} +.game-icon-trail:before { + content: '\E4B2'; +} +.game-icon-tunisia:before { + content: '\E4B3'; +} +.game-icon-uruguay:before { + content: '\E4B4'; +} +.game-icon-venezuela:before { + content: '\E4B5'; +} +.game-icon-wireframe-globe:before { + content: '\E4B6'; +} +.game-icon-compass:before { + content: '\E4B7'; +} +.game-icon-globe:before { + content: '\E4B8'; +} +.game-icon-spyglass:before { + content: '\E4B9'; +} +.game-icon-treasure-map:before { + content: '\E4BA'; +} +.game-icon-wooden-sign:before { + content: '\E4BB'; +} +.game-icon-world:before { + content: '\E4BC'; +} +.game-icon-digital-trace:before { + content: '\E4BD'; +} +.game-icon-orbit:before { + content: '\E4BE'; +} +.game-icon-battleship:before { + content: '\E4BF'; +} +.game-icon-great-war-tank:before { + content: '\E4C0'; +} +.game-icon-occupy:before { + content: '\E4C1'; +} +.game-icon-barracks-tent:before { + content: '\E4C2'; +} +.game-icon-barracks:before { + content: '\E4C3'; +} +.game-icon-caltrops:before { + content: '\E4C4'; +} +.game-icon-hammer-sickle:before { + content: '\E4C5'; +} +.game-icon-military-fort:before { + content: '\E4C6'; +} +.game-icon-union-jack:before { + content: '\E4C7'; +} +.game-icon-usa-flag:before { + content: '\E4C8'; +} +.game-icon-battle-tank:before { + content: '\E4C9'; +} +.game-icon-bombing-run:before { + content: '\E4CA'; +} +.game-icon-gas-mask:before { + content: '\E4CB'; +} +.game-icon-mushroom-cloud:before { + content: '\E4CC'; +} +.game-icon-sunrise:before { + content: '\E4CD'; +} +.game-icon-tank:before { + content: '\E4CE'; +} +.game-icon-artillery-shell:before { + content: '\E4CF'; +} +.game-icon-biplane:before { + content: '\E4D0'; +} +.game-icon-bunker:before { + content: '\E4D1'; +} +.game-icon-damaged-house:before { + content: '\E4D2'; +} +.game-icon-lost-limb:before { + content: '\E4D3'; +} +.game-icon-military-ambulance:before { + content: '\E4D4'; +} +.game-icon-c96:before { + content: '\E4D5'; +} +.game-icon-carpet-bombing:before { + content: '\E4D6'; +} +.game-icon-flatbed-covered:before { + content: '\E4D7'; +} +.game-icon-flatbed:before { + content: '\E4D8'; +} +.game-icon-mp-40:before { + content: '\E4D9'; +} +.game-icon-tank-tread:before { + content: '\E4DA'; +} +.game-icon-thompson-m1:before { + content: '\E4DB'; +} +.game-icon-trench-body-armor:before { + content: '\E4DC'; +} +.game-icon-trench-knife:before { + content: '\E4DD'; +} +.game-icon-trench-spade:before { + content: '\E4DE'; +} +.game-icon-bad-gnome:before { + content: '\E4DF'; +} +.game-icon-boar-ensign:before { + content: '\E4E0'; +} +.game-icon-carnyx:before { + content: '\E4E1'; +} +.game-icon-fomorian:before { + content: '\E4E2'; +} +.game-icon-holy-oak:before { + content: '\E4E3'; +} +.game-icon-oppidum:before { + content: '\E4E4'; +} +.game-icon-torc:before { + content: '\E4E5'; +} +.game-icon-tree-face:before { + content: '\E4E6'; +} +.game-icon-bagpipes:before { + content: '\E4E7'; +} +.game-icon-harp:before { + content: '\E4E8'; +} +.game-icon-magic-potion:before { + content: '\E4E9'; +} +.game-icon-sickle:before { + content: '\E4EA'; +} +.game-icon-heavy-thorny-triskelion:before { + content: '\E4EB'; +} +.game-icon-robe:before { + content: '\E4EC'; +} +.game-icon-medusa-head:before { + content: '\E4ED'; +} +.game-icon-transparent-slime:before { + content: '\E4EE'; +} +.game-icon-dragon-head-2:before { + content: '\E4EF'; +} +.game-icon-alien-bug:before { + content: '\E4F0'; +} +.game-icon-alien-egg:before { + content: '\E4F1'; +} +.game-icon-anubis:before { + content: '\E4F2'; +} +.game-icon-bottled-shadow:before { + content: '\E4F3'; +} +.game-icon-brain-tentacle:before { + content: '\E4F4'; +} +.game-icon-brute:before { + content: '\E4F5'; +} +.game-icon-bullet-bill:before { + content: '\E4F6'; +} +.game-icon-bully-minion:before { + content: '\E4F7'; +} +.game-icon-carnivorous-plant:before { + content: '\E4F8'; +} +.game-icon-ceiling-barnacle:before { + content: '\E4F9'; +} +.game-icon-centaur:before { + content: '\E4FA'; +} +.game-icon-daemon-pull:before { + content: '\E4FB'; +} +.game-icon-devil-mask:before { + content: '\E4FC'; +} +.game-icon-djinn:before { + content: '\E4FD'; +} +.game-icon-drakkar-dragon:before { + content: '\E4FE'; +} +.game-icon-egyptian-sphinx:before { + content: '\E4FF'; +} +.game-icon-fairy:before { + content: '\E500'; +} +.game-icon-floating-ghost:before { + content: '\E501'; +} +.game-icon-floating-tentacles:before { + content: '\E502'; +} +.game-icon-gargoyle:before { + content: '\E503'; +} +.game-icon-giant:before { + content: '\E504'; +} +.game-icon-grasping-slug:before { + content: '\E505'; +} +.game-icon-greek-sphinx:before { + content: '\E506'; +} +.game-icon-half-body-crawling:before { + content: '\E507'; +} +.game-icon-horned-reptile:before { + content: '\E508'; +} +.game-icon-horus:before { + content: '\E509'; +} +.game-icon-ice-golem:before { + content: '\E50A'; +} +.game-icon-jawless-cyclop:before { + content: '\E50B'; +} +.game-icon-kraken-tentacle:before { + content: '\E50C'; +} +.game-icon-mermaid:before { + content: '\E50D'; +} +.game-icon-metroid:before { + content: '\E50E'; +} +.game-icon-mimic-chest:before { + content: '\E50F'; +} +.game-icon-mummy-head:before { + content: '\E510'; +} +.game-icon-oni:before { + content: '\E511'; +} +.game-icon-pick-of-destiny:before { + content: '\E512'; +} +.game-icon-purple-tentacle:before { + content: '\E513'; +} +.game-icon-resting-vampire:before { + content: '\E514'; +} +.game-icon-rock-golem:before { + content: '\E515'; +} +.game-icon-sasquatch:before { + content: '\E516'; +} +.game-icon-shambling-mound:before { + content: '\E517'; +} +.game-icon-shambling-zombie:before { + content: '\E518'; +} +.game-icon-slime:before { + content: '\E519'; +} +.game-icon-spiked-dragon-head:before { + content: '\E51A'; +} +.game-icon-swallower:before { + content: '\E51B'; +} +.game-icon-swamp-bat:before { + content: '\E51C'; +} +.game-icon-thwomp:before { + content: '\E51D'; +} +.game-icon-troglodyte:before { + content: '\E51E'; +} +.game-icon-unicorn:before { + content: '\E51F'; +} +.game-icon-beast-eye:before { + content: '\E520'; +} +.game-icon-behold:before { + content: '\E521'; +} +.game-icon-bestial-fangs:before { + content: '\E522'; +} +.game-icon-cracked-alien-skull:before { + content: '\E523'; +} +.game-icon-cyclops:before { + content: '\E524'; +} +.game-icon-daemon-skull:before { + content: '\E525'; +} +.game-icon-dinosaur-bones:before { + content: '\E526'; +} +.game-icon-dinosaur-egg:before { + content: '\E527'; +} +.game-icon-double-dragon:before { + content: '\E528'; +} +.game-icon-dragon-spiral:before { + content: '\E529'; +} +.game-icon-ent-mouth:before { + content: '\E52A'; +} +.game-icon-evil-book:before { + content: '\E52B'; +} +.game-icon-evil-comet:before { + content: '\E52C'; +} +.game-icon-evil-fork:before { + content: '\E52D'; +} +.game-icon-evil-minion:before { + content: '\E52E'; +} +.game-icon-evil-moon:before { + content: '\E52F'; +} +.game-icon-evil-tree:before { + content: '\E530'; +} +.game-icon-eyestalk:before { + content: '\E531'; +} +.game-icon-fairy-2:before { + content: '\E532'; +} +.game-icon-fleshy-mass:before { + content: '\E533'; +} +.game-icon-frankenstein-creature:before { + content: '\E534'; +} +.game-icon-ghost:before { + content: '\E535'; +} +.game-icon-gluttonous-smile:before { + content: '\E536'; +} +.game-icon-gooey-daemon:before { + content: '\E537'; +} +.game-icon-grim-reaper:before { + content: '\E538'; +} +.game-icon-harpy:before { + content: '\E539'; +} +.game-icon-haunting:before { + content: '\E53A'; +} +.game-icon-horned-skull:before { + content: '\E53B'; +} +.game-icon-hydra-shot:before { + content: '\E53C'; +} +.game-icon-hydra:before { + content: '\E53D'; +} +.game-icon-imp-laugh:before { + content: '\E53E'; +} +.game-icon-imp:before { + content: '\E53F'; +} +.game-icon-infested-mass:before { + content: '\E540'; +} +.game-icon-lizardman:before { + content: '\E541'; +} +.game-icon-pretty-fangs:before { + content: '\E542'; +} +.game-icon-sea-dragon:before { + content: '\E543'; +} +.game-icon-sharp-smile:before { + content: '\E544'; +} +.game-icon-spectre:before { + content: '\E545'; +} +.game-icon-toad-teeth:before { + content: '\E546'; +} +.game-icon-triton-head:before { + content: '\E547'; +} +.game-icon-vile-fluid:before { + content: '\E548'; +} +.game-icon-witch-flight:before { + content: '\E549'; +} +.game-icon-wyvern:before { + content: '\E54A'; +} +.game-icon-sea-creature:before { + content: '\E54B'; +} +.game-icon-carrier:before { + content: '\E54C'; +} +.game-icon-cruiser:before { + content: '\E54D'; +} +.game-icon-dreadnought:before { + content: '\E54E'; +} +.game-icon-iron-hulled-warship:before { + content: '\E54F'; +} +.game-icon-boat-engine:before { + content: '\E550'; +} +.game-icon-boat-fishing:before { + content: '\E551'; +} +.game-icon-boat-horizon:before { + content: '\E552'; +} +.game-icon-boat-propeller:before { + content: '\E553'; +} +.game-icon-canoe:before { + content: '\E554'; +} +.game-icon-caravel:before { + content: '\E555'; +} +.game-icon-cargo-ship:before { + content: '\E556'; +} +.game-icon-crow-nest:before { + content: '\E557'; +} +.game-icon-drakkar:before { + content: '\E558'; +} +.game-icon-figurehead:before { + content: '\E559'; +} +.game-icon-fishing-boat:before { + content: '\E55A'; +} +.game-icon-galley:before { + content: '\E55B'; +} +.game-icon-harbor-dock:before { + content: '\E55C'; +} +.game-icon-iceberg:before { + content: '\E55D'; +} +.game-icon-life-buoy:before { + content: '\E55E'; +} +.game-icon-mini-submarine:before { + content: '\E55F'; +} +.game-icon-mooring-bollard:before { + content: '\E560'; +} +.game-icon-paddle-steamer:before { + content: '\E561'; +} +.game-icon-paddles:before { + content: '\E562'; +} +.game-icon-paper-boat:before { + content: '\E563'; +} +.game-icon-periscope:before { + content: '\E564'; +} +.game-icon-raft:before { + content: '\E565'; +} +.game-icon-sail:before { + content: '\E566'; +} +.game-icon-sailboat:before { + content: '\E567'; +} +.game-icon-ship-bow:before { + content: '\E568'; +} +.game-icon-ship-wheel:before { + content: '\E569'; +} +.game-icon-ship-wreck:before { + content: '\E56A'; +} +.game-icon-sinagot:before { + content: '\E56B'; +} +.game-icon-sinking-ship:before { + content: '\E56C'; +} +.game-icon-speed-boat:before { + content: '\E56D'; +} +.game-icon-submarine:before { + content: '\E56E'; +} +.game-icon-trireme:before { + content: '\E56F'; +} +.game-icon-wood-canoe:before { + content: '\E570'; +} +.game-icon-anchor:before { + content: '\E571'; +} +.game-icon-galleon:before { + content: '\E572'; +} +.game-icon-shooner-sailboat:before { + content: '\E573'; +} +.game-icon-small-fishing-sailboat:before { + content: '\E574'; +} +.game-icon-nautilus-shell:before { + content: '\E575'; +} +.game-icon-algae:before { + content: '\E576'; +} +.game-icon-buoy:before { + content: '\E577'; +} +.game-icon-coral:before { + content: '\E578'; +} +.game-icon-fishing-pole:before { + content: '\E579'; +} +.game-icon-fishing-spoon:before { + content: '\E57A'; +} +.game-icon-fishing:before { + content: '\E57B'; +} +.game-icon-flood:before { + content: '\E57C'; +} +.game-icon-helicoprion:before { + content: '\E57D'; +} +.game-icon-high-tide:before { + content: '\E57E'; +} +.game-icon-island:before { + content: '\E57F'; +} +.game-icon-knot:before { + content: '\E580'; +} +.game-icon-life-jacket:before { + content: '\E581'; +} +.game-icon-lighthouse:before { + content: '\E582'; +} +.game-icon-low-tide:before { + content: '\E583'; +} +.game-icon-mussel:before { + content: '\E584'; +} +.game-icon-offshore-platform:before { + content: '\E585'; +} +.game-icon-oyster:before { + content: '\E586'; +} +.game-icon-plesiosaurus:before { + content: '\E587'; +} +.game-icon-pulley-hook:before { + content: '\E588'; +} +.game-icon-rope-coil:before { + content: '\E589'; +} +.game-icon-sand-castle:before { + content: '\E58A'; +} +.game-icon-scuba-mask:before { + content: '\E58B'; +} +.game-icon-scuba-tanks:before { + content: '\E58C'; +} +.game-icon-sea-cliff:before { + content: '\E58D'; +} +.game-icon-sea-turtle:before { + content: '\E58E'; +} +.game-icon-seagull:before { + content: '\E58F'; +} +.game-icon-surf-board:before { + content: '\E590'; +} +.game-icon-surfer-van:before { + content: '\E591'; +} +.game-icon-swimfins:before { + content: '\E592'; +} +.game-icon-tall-bridge:before { + content: '\E593'; +} +.game-icon-wave-surfer:before { + content: '\E594'; +} +.game-icon-wooden-pier:before { + content: '\E595'; +} +.game-icon-at-sea:before { + content: '\E596'; +} +.game-icon-big-wave:before { + content: '\E597'; +} +.game-icon-cargo-crane:before { + content: '\E598'; +} +.game-icon-fishing-hook:before { + content: '\E599'; +} +.game-icon-fishing-net:before { + content: '\E59A'; +} +.game-icon-water-splash:before { + content: '\E59B'; +} +.game-icon-wave-crest:before { + content: '\E59C'; +} +.game-icon-waves:before { + content: '\E59D'; +} +.game-icon-snorkel:before { + content: '\E59E'; +} +.game-icon-ram:before { + content: '\E59F'; +} +.game-icon-armadillo:before { + content: '\E5A0'; +} +.game-icon-basset-hound-head:before { + content: '\E5A1'; +} +.game-icon-bastet:before { + content: '\E5A2'; +} +.game-icon-beaver:before { + content: '\E5A3'; +} +.game-icon-bison:before { + content: '\E5A4'; +} +.game-icon-buffalo-head:before { + content: '\E5A5'; +} +.game-icon-camel:before { + content: '\E5A6'; +} +.game-icon-cavalry:before { + content: '\E5A7'; +} +.game-icon-juggling-seal:before { + content: '\E5A8'; +} +.game-icon-jumping-dog:before { + content: '\E5A9'; +} +.game-icon-mammoth:before { + content: '\E5AA'; +} +.game-icon-mandrill-head:before { + content: '\E5AB'; +} +.game-icon-rabbit-head:before { + content: '\E5AC'; +} +.game-icon-raccoon-head:before { + content: '\E5AD'; +} +.game-icon-ram-profile:before { + content: '\E5AE'; +} +.game-icon-saber-toothed-cat-head:before { + content: '\E5AF'; +} +.game-icon-sitting-dog:before { + content: '\E5B0'; +} +.game-icon-squirrel:before { + content: '\E5B1'; +} +.game-icon-walrus-head:before { + content: '\E5B2'; +} +.game-icon-direwolf:before { + content: '\E5B3'; +} +.game-icon-snout:before { + content: '\E5B4'; +} +.game-icon-acoustic-megaphone:before { + content: '\E5B5'; +} +.game-icon-alarm-clock:before { + content: '\E5B6'; +} +.game-icon-audio-cassette:before { + content: '\E5B7'; +} +.game-icon-boombox:before { + content: '\E5B8'; +} +.game-icon-compact-disc:before { + content: '\E5B9'; +} +.game-icon-djembe:before { + content: '\E5BA'; +} +.game-icon-drum:before { + content: '\E5BB'; +} +.game-icon-elf-ear:before { + content: '\E5BC'; +} +.game-icon-film-spool:before { + content: '\E5BD'; +} +.game-icon-flute:before { + content: '\E5BE'; +} +.game-icon-gong:before { + content: '\E5BF'; +} +.game-icon-guitar-bass-head:before { + content: '\E5C0'; +} +.game-icon-guitar-head:before { + content: '\E5C1'; +} +.game-icon-headphones:before { + content: '\E5C2'; +} +.game-icon-heart-beats:before { + content: '\E5C3'; +} +.game-icon-human-ear:before { + content: '\E5C4'; +} +.game-icon-jack-plug:before { + content: '\E5C5'; +} +.game-icon-maracas:before { + content: '\E5C6'; +} +.game-icon-metronome:before { + content: '\E5C7'; +} +.game-icon-microphone:before { + content: '\E5C8'; +} +.game-icon-musical-keyboard:before { + content: '\E5C9'; +} +.game-icon-musical-notes:before { + content: '\E5CA'; +} +.game-icon-musical-score:before { + content: '\E5CB'; +} +.game-icon-mute:before { + content: '\E5CC'; +} +.game-icon-ocarina:before { + content: '\E5CD'; +} +.game-icon-old-microphone:before { + content: '\E5CE'; +} +.game-icon-pan-flute:before { + content: '\E5CF'; +} +.game-icon-phone:before { + content: '\E5D0'; +} +.game-icon-piano-keys:before { + content: '\E5D1'; +} +.game-icon-pocket-radio:before { + content: '\E5D2'; +} +.game-icon-radio-tower:before { + content: '\E5D3'; +} +.game-icon-ringing-alarm:before { + content: '\E5D4'; +} +.game-icon-saxophone:before { + content: '\E5D5'; +} +.game-icon-silenced:before { + content: '\E5D6'; +} +.game-icon-sound-off:before { + content: '\E5D7'; +} +.game-icon-sound-on:before { + content: '\E5D8'; +} +.game-icon-speaker-off:before { + content: '\E5D9'; +} +.game-icon-speaker:before { + content: '\E5DA'; +} +.game-icon-tambourine:before { + content: '\E5DB'; +} +.game-icon-trumpet-flag:before { + content: '\E5DC'; +} +.game-icon-trumpet:before { + content: '\E5DD'; +} +.game-icon-vuvuzelas:before { + content: '\E5DE'; +} +.game-icon-xylophone:before { + content: '\E5DF'; +} +.game-icon-amplitude:before { + content: '\E5E0'; +} +.game-icon-anthem:before { + content: '\E5E1'; +} +.game-icon-bugle-call:before { + content: '\E5E2'; +} +.game-icon-carillon:before { + content: '\E5E3'; +} +.game-icon-double-quaver:before { + content: '\E5E4'; +} +.game-icon-echo-ripples:before { + content: '\E5E5'; +} +.game-icon-guitar:before { + content: '\E5E6'; +} +.game-icon-hunting-horn:before { + content: '\E5E7'; +} +.game-icon-love-howl:before { + content: '\E5E8'; +} +.game-icon-love-song:before { + content: '\E5E9'; +} +.game-icon-lyre:before { + content: '\E5EA'; +} +.game-icon-movement-sensor:before { + content: '\E5EB'; +} +.game-icon-music-spell:before { + content: '\E5EC'; +} +.game-icon-resonance:before { + content: '\E5ED'; +} +.game-icon-ringing-bell:before { + content: '\E5EE'; +} +.game-icon-silence:before { + content: '\E5EF'; +} +.game-icon-sonic-boom:before { + content: '\E5F0'; +} +.game-icon-sonic-shout:before { + content: '\E5F1'; +} +.game-icon-tune-pitch:before { + content: '\E5F2'; +} +.game-icon-ultrasound:before { + content: '\E5F3'; +} +.game-icon-vibrating-ball:before { + content: '\E5F4'; +} +.game-icon-zigzag-tune:before { + content: '\E5F5'; +} +.game-icon-hearing-disabled:before { + content: '\E5F6'; +} +.game-icon-sound-waves:before { + content: '\E5F7'; +} +.game-icon-violin:before { + content: '\E5F8'; +} +.game-icon-chariot:before { + content: '\E5F9'; +} +.game-icon-catapult:before { + content: '\E5FA'; +} +.game-icon-amphora:before { + content: '\E5FB'; +} +.game-icon-ancient-columns:before { + content: '\E5FC'; +} +.game-icon-ancient-ruins:before { + content: '\E5FD'; +} +.game-icon-aqueduct:before { + content: '\E5FE'; +} +.game-icon-broken-pottery:before { + content: '\E5FF'; +} +.game-icon-caesar:before { + content: '\E600'; +} +.game-icon-classical-knowledge:before { + content: '\E601'; +} +.game-icon-coliseum:before { + content: '\E602'; +} +.game-icon-column-vase:before { + content: '\E603'; +} +.game-icon-discobolus:before { + content: '\E604'; +} +.game-icon-greaves:before { + content: '\E605'; +} +.game-icon-greek-temple:before { + content: '\E606'; +} +.game-icon-icarus:before { + content: '\E607'; +} +.game-icon-ionic-column:before { + content: '\E608'; +} +.game-icon-jug:before { + content: '\E609'; +} +.game-icon-medieval-pavilion:before { + content: '\E60A'; +} +.game-icon-menhir:before { + content: '\E60B'; +} +.game-icon-olive:before { + content: '\E60C'; +} +.game-icon-palisade:before { + content: '\E60D'; +} +.game-icon-roman-toga:before { + content: '\E60E'; +} +.game-icon-sandal:before { + content: '\E60F'; +} +.game-icon-stone-bust:before { + content: '\E610'; +} +.game-icon-stone-path:before { + content: '\E611'; +} +.game-icon-water-fountain:before { + content: '\E612'; +} +.game-icon-wax-tablet:before { + content: '\E613'; +} +.game-icon-capitol:before { + content: '\E614'; +} +.game-icon-grapes:before { + content: '\E615'; +} +.game-icon-maze:before { + content: '\E616'; +} +.game-icon-wingfoot:before { + content: '\E617'; +} +.game-icon-ballista:before { + content: '\E618'; +} +.game-icon-pauldrons:before { + content: '\E619'; +} +.game-icon-pteruges:before { + content: '\E61A'; +} +.game-icon-siege-ram:before { + content: '\E61B'; +} +.game-icon-air-balloon:before { + content: '\E61C'; +} +.game-icon-airplane-arrival:before { + content: '\E61D'; +} +.game-icon-airplane-departure:before { + content: '\E61E'; +} +.game-icon-ambulance:before { + content: '\E61F'; +} +.game-icon-apollo-capsule:before { + content: '\E620'; +} +.game-icon-bulldozer:before { + content: '\E621'; +} +.game-icon-bus:before { + content: '\E622'; +} +.game-icon-car-door:before { + content: '\E623'; +} +.game-icon-car-key:before { + content: '\E624'; +} +.game-icon-car-seat:before { + content: '\E625'; +} +.game-icon-car-wheel:before { + content: '\E626'; +} +.game-icon-caravan:before { + content: '\E627'; +} +.game-icon-city-car:before { + content: '\E628'; +} +.game-icon-coal-wagon:before { + content: '\E629'; +} +.game-icon-commercial-airplane:before { + content: '\E62A'; +} +.game-icon-cycling:before { + content: '\E62B'; +} +.game-icon-delivery-drone:before { + content: '\E62C'; +} +.game-icon-dutch-bike:before { + content: '\E62D'; +} +.game-icon-farm-tractor:before { + content: '\E62E'; +} +.game-icon-flat-tire:before { + content: '\E62F'; +} +.game-icon-food-truck:before { + content: '\E630'; +} +.game-icon-forklift:before { + content: '\E631'; +} +.game-icon-gas-pump:before { + content: '\E632'; +} +.game-icon-gear-stick:before { + content: '\E633'; +} +.game-icon-hang-glider:before { + content: '\E634'; +} +.game-icon-helicopter-tail:before { + content: '\E635'; +} +.game-icon-helicopter:before { + content: '\E636'; +} +.game-icon-home-garage:before { + content: '\E637'; +} +.game-icon-interceptor-ship:before { + content: '\E638'; +} +.game-icon-jeep:before { + content: '\E639'; +} +.game-icon-jet-fighter:before { + content: '\E63A'; +} +.game-icon-kick-scooter:before { + content: '\E63B'; +} +.game-icon-level-crossing:before { + content: '\E63C'; +} +.game-icon-lunar-module:before { + content: '\E63D'; +} +.game-icon-mars-curiosity:before { + content: '\E63E'; +} +.game-icon-mars-pathfinder:before { + content: '\E63F'; +} +.game-icon-mechanic-garage:before { + content: '\E640'; +} +.game-icon-mine-truck:before { + content: '\E641'; +} +.game-icon-mine-wagon:before { + content: '\E642'; +} +.game-icon-old-wagon:before { + content: '\E643'; +} +.game-icon-plane-wing:before { + content: '\E644'; +} +.game-icon-rail-road:before { + content: '\E645'; +} +.game-icon-railway:before { + content: '\E646'; +} +.game-icon-rocket-thruster:before { + content: '\E647'; +} +.game-icon-ropeway:before { + content: '\E648'; +} +.game-icon-scooter:before { + content: '\E649'; +} +.game-icon-scout-ship:before { + content: '\E64A'; +} +.game-icon-siege-tower:before { + content: '\E64B'; +} +.game-icon-skateboard:before { + content: '\E64C'; +} +.game-icon-space-shuttle:before { + content: '\E64D'; +} +.game-icon-spaceship:before { + content: '\E64E'; +} +.game-icon-speedometer:before { + content: '\E64F'; +} +.game-icon-starfighter:before { + content: '\E650'; +} +.game-icon-stealth-bomber:before { + content: '\E651'; +} +.game-icon-steam-locomotive:before { + content: '\E652'; +} +.game-icon-steering-wheel:before { + content: '\E653'; +} +.game-icon-subway:before { + content: '\E654'; +} +.game-icon-tire-iron-cross:before { + content: '\E655'; +} +.game-icon-tire-iron:before { + content: '\E656'; +} +.game-icon-tracked-robot:before { + content: '\E657'; +} +.game-icon-traffic-lights-green:before { + content: '\E658'; +} +.game-icon-traffic-lights-orange:before { + content: '\E659'; +} +.game-icon-traffic-lights-ready-to-go:before { + content: '\E65A'; +} +.game-icon-trebuchet:before { + content: '\E65B'; +} +.game-icon-truck:before { + content: '\E65C'; +} +.game-icon-turbine:before { + content: '\E65D'; +} +.game-icon-ufo:before { + content: '\E65E'; +} +.game-icon-unicycle:before { + content: '\E65F'; +} +.game-icon-velocipede:before { + content: '\E660'; +} +.game-icon-walking-scout:before { + content: '\E661'; +} +.game-icon-bomber:before { + content: '\E662'; +} +.game-icon-heavy-fighter:before { + content: '\E663'; +} +.game-icon-light-fighter:before { + content: '\E664'; +} +.game-icon-afterburn:before { + content: '\E665'; +} +.game-icon-cartwheel:before { + content: '\E666'; +} +.game-icon-forward-field:before { + content: '\E667'; +} +.game-icon-jetpack:before { + content: '\E668'; +} +.game-icon-missile-mech:before { + content: '\E669'; +} +.game-icon-rocket-flight:before { + content: '\E66A'; +} +.game-icon-rocket:before { + content: '\E66B'; +} +.game-icon-strafe:before { + content: '\E66C'; +} +.game-icon-jet-pack:before { + content: '\E66D'; +} +.game-icon-airplane:before { + content: '\E66E'; +} +.game-icon-apc:before { + content: '\E66F'; +} +.game-icon-f1-car:before { + content: '\E670'; +} +.game-icon-glider:before { + content: '\E671'; +} +.game-icon-hang-glider-2:before { + content: '\E672'; +} +.game-icon-jeep-2:before { + content: '\E673'; +} +.game-icon-race-car:before { + content: '\E674'; +} +.game-icon-zeppelin:before { + content: '\E675'; +} +.game-icon-dread:before { + content: '\E676'; +} +.game-icon-distraction:before { + content: '\E677'; +} +.game-icon-angry-eyes:before { + content: '\E678'; +} +.game-icon-confrontation:before { + content: '\E679'; +} +.game-icon-dead-head:before { + content: '\E67A'; +} +.game-icon-enrage:before { + content: '\E67B'; +} +.game-icon-idea:before { + content: '\E67C'; +} +.game-icon-liar:before { + content: '\E67D'; +} +.game-icon-wisdom:before { + content: '\E67E'; +} +.game-icon-artificial-intelligence:before { + content: '\E67F'; +} +.game-icon-awareness:before { + content: '\E680'; +} +.game-icon-back-pain:before { + content: '\E681'; +} +.game-icon-brain-freeze:before { + content: '\E682'; +} +.game-icon-chained-heart:before { + content: '\E683'; +} +.game-icon-coma:before { + content: '\E684'; +} +.game-icon-delighted:before { + content: '\E685'; +} +.game-icon-despair:before { + content: '\E686'; +} +.game-icon-distraction-2:before { + content: '\E687'; +} +.game-icon-drama-masks:before { + content: '\E688'; +} +.game-icon-extra-lucid:before { + content: '\E689'; +} +.game-icon-gluttony:before { + content: '\E68A'; +} +.game-icon-hidden:before { + content: '\E68B'; +} +.game-icon-imprisoned:before { + content: '\E68C'; +} +.game-icon-mirror-mirror:before { + content: '\E68D'; +} +.game-icon-mouth-watering:before { + content: '\E68E'; +} +.game-icon-nothing-to-say:before { + content: '\E68F'; +} +.game-icon-oppression:before { + content: '\E690'; +} +.game-icon-paranoia:before { + content: '\E691'; +} +.game-icon-sensuousness:before { + content: '\E692'; +} +.game-icon-sleepy:before { + content: '\E693'; +} +.game-icon-sly:before { + content: '\E694'; +} +.game-icon-smitten:before { + content: '\E695'; +} +.game-icon-stoned-skull:before { + content: '\E696'; +} +.game-icon-strong:before { + content: '\E697'; +} +.game-icon-surprised-skull:before { + content: '\E698'; +} +.game-icon-surprised:before { + content: '\E699'; +} +.game-icon-suspicious:before { + content: '\E69A'; +} +.game-icon-temptation:before { + content: '\E69B'; +} +.game-icon-terror:before { + content: '\E69C'; +} +.game-icon-worried-eyes:before { + content: '\E69D'; +} +.game-icon-cement-shoes:before { + content: '\E69E'; +} +.game-icon-knockout:before { + content: '\E69F'; +} +.game-icon-smoke-bomb:before { + content: '\E6A0'; +} +.game-icon-barbecue:before { + content: '\E6A1'; +} +.game-icon-chimney:before { + content: '\E6A2'; +} +.game-icon-cigar:before { + content: '\E6A3'; +} +.game-icon-cigarette:before { + content: '\E6A4'; +} +.game-icon-nuclear-plant:before { + content: '\E6A5'; +} +.game-icon-smoking-pipe:before { + content: '\E6A6'; +} +.game-icon-smoking-volcano:before { + content: '\E6A7'; +} +.game-icon-steam-blast:before { + content: '\E6A8'; +} +.game-icon-steam:before { + content: '\E6A9'; +} +.game-icon-aerosol:before { + content: '\E6AA'; +} +.game-icon-bottle-vapors:before { + content: '\E6AB'; +} +.game-icon-bubbling-bowl:before { + content: '\E6AC'; +} +.game-icon-cloudy-fork:before { + content: '\E6AD'; +} +.game-icon-fizzing-flask:before { + content: '\E6AE'; +} +.game-icon-fluffy-swirl:before { + content: '\E6AF'; +} +.game-icon-fragrance:before { + content: '\E6B0'; +} +.game-icon-incense:before { + content: '\E6B1'; +} +.game-icon-poison-gas:before { + content: '\E6B2'; +} +.game-icon-smoking-finger:before { + content: '\E6B3'; +} +.game-icon-smoking-orb:before { + content: '\E6B4'; +} +.game-icon-poison-cloud:before { + content: '\E6B5'; +} +.game-icon-bird-cage:before { + content: '\E6B6'; +} +.game-icon-bird-house:before { + content: '\E6B7'; +} +.game-icon-chicken-oven:before { + content: '\E6B8'; +} +.game-icon-cuauhtli:before { + content: '\E6B9'; +} +.game-icon-duck-palm:before { + content: '\E6BA'; +} +.game-icon-eating-pelican:before { + content: '\E6BB'; +} +.game-icon-egyptian-bird:before { + content: '\E6BC'; +} +.game-icon-fried-eggs:before { + content: '\E6BD'; +} +.game-icon-goose:before { + content: '\E6BE'; +} +.game-icon-hummingbird:before { + content: '\E6BF'; +} +.game-icon-ibis:before { + content: '\E6C0'; +} +.game-icon-incubator:before { + content: '\E6C1'; +} +.game-icon-kiwi-bird:before { + content: '\E6C2'; +} +.game-icon-nest-birds:before { + content: '\E6C3'; +} +.game-icon-nest-eggs:before { + content: '\E6C4'; +} +.game-icon-new-born:before { + content: '\E6C5'; +} +.game-icon-ostrich:before { + content: '\E6C6'; +} +.game-icon-plastic-duck:before { + content: '\E6C7'; +} +.game-icon-shoebill-stork:before { + content: '\E6C8'; +} +.game-icon-stork-delivery:before { + content: '\E6C9'; +} +.game-icon-swallow-2:before { + content: '\E6CA'; +} +.game-icon-bird-claw:before { + content: '\E6CB'; +} +.game-icon-bird-limb:before { + content: '\E6CC'; +} +.game-icon-bird-mask:before { + content: '\E6CD'; +} +.game-icon-dove:before { + content: '\E6CE'; +} +.game-icon-egg-clutch:before { + content: '\E6CF'; +} +.game-icon-falling-ovoid:before { + content: '\E6D0'; +} +.game-icon-feather:before { + content: '\E6D1'; +} +.game-icon-feathered-wing:before { + content: '\E6D2'; +} +.game-icon-scarecrow:before { + content: '\E6D3'; +} +.game-icon-sparrow:before { + content: '\E6D4'; +} +.game-icon-two-feathers:before { + content: '\E6D5'; +} +.game-icon-winged-leg:before { + content: '\E6D6'; +} +.game-icon-fish-cooked:before { + content: '\E6D7'; +} +.game-icon-fried-fish:before { + content: '\E6D8'; +} +.game-icon-aquarium:before { + content: '\E6D9'; +} +.game-icon-canned-fish:before { + content: '\E6DA'; +} +.game-icon-circling-fish:before { + content: '\E6DB'; +} +.game-icon-double-fish:before { + content: '\E6DC'; +} +.game-icon-eel:before { + content: '\E6DD'; +} +.game-icon-fish-bucket:before { + content: '\E6DE'; +} +.game-icon-fish-eggs:before { + content: '\E6DF'; +} +.game-icon-fish-escape:before { + content: '\E6E0'; +} +.game-icon-fish-scales:before { + content: '\E6E1'; +} +.game-icon-fishing-jig:before { + content: '\E6E2'; +} +.game-icon-fishing-lure:before { + content: '\E6E3'; +} +.game-icon-flatfish:before { + content: '\E6E4'; +} +.game-icon-lucky-fisherman:before { + content: '\E6E5'; +} +.game-icon-piranha:before { + content: '\E6E6'; +} +.game-icon-school-of-fish:before { + content: '\E6E7'; +} +.game-icon-sushis:before { + content: '\E6E8'; +} +.game-icon-tadpole:before { + content: '\E6E9'; +} +.game-icon-tropical-fish:before { + content: '\E6EA'; +} +.game-icon-salmon:before { + content: '\E6EB'; +} +.game-icon-fairy-wings:before { + content: '\E6EC'; +} +.game-icon-flying-target:before { + content: '\E6ED'; +} +.game-icon-hand-wing:before { + content: '\E6EE'; +} +.game-icon-heart-wings:before { + content: '\E6EF'; +} +.game-icon-pterodactylus:before { + content: '\E6F0'; +} +.game-icon-spiky-wing:before { + content: '\E6F1'; +} +.game-icon-angel-outfit:before { + content: '\E6F2'; +} +.game-icon-angel-wings:before { + content: '\E6F3'; +} +.game-icon-bat-blade:before { + content: '\E6F4'; +} +.game-icon-curly-wing:before { + content: '\E6F5'; +} +.game-icon-fluffy-wing:before { + content: '\E6F6'; +} +.game-icon-holy-grail:before { + content: '\E6F7'; +} +.game-icon-quill:before { + content: '\E6F8'; +} +.game-icon-wing-cloak:before { + content: '\E6F9'; +} +.game-icon-winged-emblem:before { + content: '\E6FA'; +} +.game-icon-evil-wings:before { + content: '\E6FB'; +} +.game-icon-tumulus:before { + content: '\E6FC'; +} +.game-icon-death-juice:before { + content: '\E6FD'; +} +.game-icon-egyptian-urns:before { + content: '\E6FE'; +} +.game-icon-grave-flowers:before { + content: '\E6FF'; +} +.game-icon-graveyard:before { + content: '\E700'; +} +.game-icon-half-dead:before { + content: '\E701'; +} +.game-icon-morgue-feet:before { + content: '\E702'; +} +.game-icon-sarcophagus:before { + content: '\E703'; +} +.game-icon-skeletal-hand:before { + content: '\E704'; +} +.game-icon-slipknot:before { + content: '\E705'; +} +.game-icon-carrion:before { + content: '\E706'; +} +.game-icon-coffin:before { + content: '\E707'; +} +.game-icon-dead-eye:before { + content: '\E708'; +} +.game-icon-dead-wood:before { + content: '\E709'; +} +.game-icon-death-zone:before { + content: '\E70A'; +} +.game-icon-decapitation:before { + content: '\E70B'; +} +.game-icon-gibbet:before { + content: '\E70C'; +} +.game-icon-guillotine:before { + content: '\E70D'; +} +.game-icon-internal-injury:before { + content: '\E70E'; +} +.game-icon-life-in-the-balance:before { + content: '\E70F'; +} +.game-icon-pirate-grave:before { + content: '\E710'; +} +.game-icon-reaper-scythe:before { + content: '\E711'; +} +.game-icon-tombstone:before { + content: '\E712'; +} +.game-icon-suicide:before { + content: '\E713'; +} +.game-icon-telefrag:before { + content: '\E714'; +} +.game-icon-tombstone-2:before { + content: '\E715'; +} +.game-icon-hasty-grave:before { + content: '\E716'; +} +.game-icon-raise-zombie:before { + content: '\E717'; +} +.game-icon-bad-breath:before { + content: '\E718'; +} +.game-icon-chainsaw:before { + content: '\E719'; +} +.game-icon-jerrycan:before { + content: '\E71A'; +} +.game-icon-brain:before { + content: '\E71B'; +} +.game-icon-dark-squad:before { + content: '\E71C'; +} +.game-icon-evil-hand:before { + content: '\E71D'; +} +.game-icon-ragged-wound:before { + content: '\E71E'; +} +.game-icon-asian-lantern:before { + content: '\E71F'; +} +.game-icon-bed-lamp:before { + content: '\E720'; +} +.game-icon-ceiling-light:before { + content: '\E721'; +} +.game-icon-double-street-lights:before { + content: '\E722'; +} +.game-icon-dungeon-gate:before { + content: '\E723'; +} +.game-icon-dungeon-light:before { + content: '\E724'; +} +.game-icon-flexible-lamp:before { + content: '\E725'; +} +.game-icon-fog-light:before { + content: '\E726'; +} +.game-icon-inspiration:before { + content: '\E727'; +} +.game-icon-led:before { + content: '\E728'; +} +.game-icon-light-projector:before { + content: '\E729'; +} +.game-icon-old-lantern:before { + content: '\E72A'; +} +.game-icon-prism:before { + content: '\E72B'; +} +.game-icon-smart:before { + content: '\E72C'; +} +.game-icon-street-light:before { + content: '\E72D'; +} +.game-icon-wall-light:before { + content: '\E72E'; +} +.game-icon-candle-skull:before { + content: '\E72F'; +} +.game-icon-desk-lamp:before { + content: '\E730'; +} +.game-icon-double-face-mask:before { + content: '\E731'; +} +.game-icon-duality:before { + content: '\E732'; +} +.game-icon-eclipse:before { + content: '\E733'; +} +.game-icon-expanded-rays:before { + content: '\E734'; +} +.game-icon-explosion-rays:before { + content: '\E735'; +} +.game-icon-explosive-materials:before { + content: '\E736'; +} +.game-icon-gooey-eyed-sun:before { + content: '\E737'; +} +.game-icon-interstellar-path:before { + content: '\E738'; +} +.game-icon-lantern:before { + content: '\E739'; +} +.game-icon-laser-precision:before { + content: '\E73A'; +} +.game-icon-laser-sparks:before { + content: '\E73B'; +} +.game-icon-laserburn:before { + content: '\E73C'; +} +.game-icon-light-bulb:before { + content: '\E73D'; +} +.game-icon-magic-lamp:before { + content: '\E73E'; +} +.game-icon-paper-lantern:before { + content: '\E73F'; +} +.game-icon-radar-sweep:before { + content: '\E740'; +} +.game-icon-shiny-entrance:before { + content: '\E741'; +} +.game-icon-sun:before { + content: '\E742'; +} +.game-icon-sunbeams:before { + content: '\E743'; +} +.game-icon-sundial:before { + content: '\E744'; +} +.game-icon-two-shadows:before { + content: '\E745'; +} +.game-icon-unlit-candelabra:before { + content: '\E746'; +} +.game-icon-laser-burst:before { + content: '\E747'; +} +.game-icon-camping-tent:before { + content: '\E748'; +} +.game-icon-cave-entrance:before { + content: '\E749'; +} +.game-icon-circle-forest:before { + content: '\E74A'; +} +.game-icon-desert:before { + content: '\E74B'; +} +.game-icon-forest-camp:before { + content: '\E74C'; +} +.game-icon-forest:before { + content: '\E74D'; +} +.game-icon-fuji:before { + content: '\E74E'; +} +.game-icon-grass:before { + content: '\E74F'; +} +.game-icon-high-grass:before { + content: '\E750'; +} +.game-icon-hills:before { + content: '\E751'; +} +.game-icon-jungle:before { + content: '\E752'; +} +.game-icon-monument-valley:before { + content: '\E753'; +} +.game-icon-mountain-cave:before { + content: '\E754'; +} +.game-icon-mountain-road:before { + content: '\E755'; +} +.game-icon-oasis:before { + content: '\E756'; +} +.game-icon-park-bench:before { + content: '\E757'; +} +.game-icon-path-tile:before { + content: '\E758'; +} +.game-icon-river:before { + content: '\E759'; +} +.game-icon-stone-stack:before { + content: '\E75A'; +} +.game-icon-summits:before { + content: '\E75B'; +} +.game-icon-sunrise-2:before { + content: '\E75C'; +} +.game-icon-sunset:before { + content: '\E75D'; +} +.game-icon-swamp:before { + content: '\E75E'; +} +.game-icon-uluru:before { + content: '\E75F'; +} +.game-icon-underground-cave:before { + content: '\E760'; +} +.game-icon-waterfall:before { + content: '\E761'; +} +.game-icon-earth-crack:before { + content: '\E762'; +} +.game-icon-field:before { + content: '\E763'; +} +.game-icon-flowers:before { + content: '\E764'; +} +.game-icon-mountains:before { + content: '\E765'; +} +.game-icon-mountaintop:before { + content: '\E766'; +} +.game-icon-peaks:before { + content: '\E767'; +} +.game-icon-pine-tree:before { + content: '\E768'; +} +.game-icon-quicksand:before { + content: '\E769'; +} +.game-icon-stalagtite:before { + content: '\E76A'; +} +.game-icon-three-leaves:before { + content: '\E76B'; +} +.game-icon-valley:before { + content: '\E76C'; +} +.game-icon-wind-hole:before { + content: '\E76D'; +} +.game-icon-axe-in-log:before { + content: '\E76E'; +} +.game-icon-bamboo-fountain:before { + content: '\E76F'; +} +.game-icon-barrel:before { + content: '\E770'; +} +.game-icon-berry-bush:before { + content: '\E771'; +} +.game-icon-bonsai-tree:before { + content: '\E772'; +} +.game-icon-chestnut-leaf:before { + content: '\E773'; +} +.game-icon-chisel:before { + content: '\E774'; +} +.game-icon-crosscut-saw:before { + content: '\E775'; +} +.game-icon-crucifix:before { + content: '\E776'; +} +.game-icon-deku-tree:before { + content: '\E777'; +} +.game-icon-dough-roller:before { + content: '\E778'; +} +.game-icon-empty-wood-bucket-handle:before { + content: '\E779'; +} +.game-icon-empty-wood-bucket:before { + content: '\E77A'; +} +.game-icon-forest-entrance:before { + content: '\E77B'; +} +.game-icon-fruit-tree:before { + content: '\E77C'; +} +.game-icon-full-wood-bucket-handle:before { + content: '\E77D'; +} +.game-icon-full-wood-bucket:before { + content: '\E77E'; +} +.game-icon-greenhouse:before { + content: '\E77F'; +} +.game-icon-half-log:before { + content: '\E780'; +} +.game-icon-hand-saw:before { + content: '\E781'; +} +.game-icon-hanging-sign:before { + content: '\E782'; +} +.game-icon-log:before { + content: '\E783'; +} +.game-icon-oak-leaf:before { + content: '\E784'; +} +.game-icon-packed-planks:before { + content: '\E785'; +} +.game-icon-palm-tree:before { + content: '\E786'; +} +.game-icon-planks:before { + content: '\E787'; +} +.game-icon-solid-leaf:before { + content: '\E788'; +} +.game-icon-spiked-trunk:before { + content: '\E789'; +} +.game-icon-stakes-fence:before { + content: '\E78A'; +} +.game-icon-stick-frame:before { + content: '\E78B'; +} +.game-icon-stump-regrowth:before { + content: '\E78C'; +} +.game-icon-table:before { + content: '\E78D'; +} +.game-icon-totem:before { + content: '\E78E'; +} +.game-icon-tree-door:before { + content: '\E78F'; +} +.game-icon-tree-roots:before { + content: '\E790'; +} +.game-icon-tree-swing:before { + content: '\E791'; +} +.game-icon-trunk-mushroom:before { + content: '\E792'; +} +.game-icon-watchtower:before { + content: '\E793'; +} +.game-icon-water-diviner-stick:before { + content: '\E794'; +} +.game-icon-wood-beam:before { + content: '\E795'; +} +.game-icon-wood-cabin:before { + content: '\E796'; +} +.game-icon-wood-frame:before { + content: '\E797'; +} +.game-icon-wood-pile:before { + content: '\E798'; +} +.game-icon-wood-stick:before { + content: '\E799'; +} +.game-icon-wooden-clogs:before { + content: '\E79A'; +} +.game-icon-wooden-crate:before { + content: '\E79B'; +} +.game-icon-wooden-pegleg:before { + content: '\E79C'; +} +.game-icon-acorn:before { + content: '\E79D'; +} +.game-icon-beech:before { + content: '\E79E'; +} +.game-icon-circular-sawblade:before { + content: '\E79F'; +} +.game-icon-curled-leaf:before { + content: '\E7A0'; +} +.game-icon-falling-leaf:before { + content: '\E7A1'; +} +.game-icon-leaf-swirl:before { + content: '\E7A2'; +} +.game-icon-linden-leaf:before { + content: '\E7A3'; +} +.game-icon-maple-leaf:before { + content: '\E7A4'; +} +.game-icon-oak:before { + content: '\E7A5'; +} +.game-icon-root-tip:before { + content: '\E7A6'; +} +.game-icon-totem-mask:before { + content: '\E7A7'; +} +.game-icon-tree-branch:before { + content: '\E7A8'; +} +.game-icon-tribal-mask:before { + content: '\E7A9'; +} +.game-icon-vine-leaf:before { + content: '\E7AA'; +} +.game-icon-wood-axe:before { + content: '\E7AB'; +} +.game-icon-wooden-door:before { + content: '\E7AC'; +} +.game-icon-wooden-fence:before { + content: '\E7AD'; +} +.game-icon-zigzag-leaf:before { + content: '\E7AE'; +} +.game-icon-circular-saw:before { + content: '\E7AF'; +} +.game-icon-logging:before { + content: '\E7B0'; +} +.game-icon-candlestick-phone:before { + content: '\E7B1'; +} +.game-icon-coal-pile:before { + content: '\E7B2'; +} +.game-icon-corset:before { + content: '\E7B3'; +} +.game-icon-lorgnette:before { + content: '\E7B4'; +} +.game-icon-pipes:before { + content: '\E7B5'; +} +.game-icon-steampunk-goggles:before { + content: '\E7B6'; +} +.game-icon-tower-bridge:before { + content: '\E7B7'; +} +.game-icon-clockwork:before { + content: '\E7B8'; +} +.game-icon-cog:before { + content: '\E7B9'; +} +.game-icon-cogsplosion:before { + content: '\E7BA'; +} +.game-icon-gears:before { + content: '\E7BB'; +} +.game-icon-pokecog:before { + content: '\E7BC'; +} +.game-icon-spectacles:before { + content: '\E7BD'; +} +.game-icon-teapot:before { + content: '\E7BE'; +} +.game-icon-umbrella:before { + content: '\E7BF'; +} +.game-icon-pocket-watch:before { + content: '\E7C0'; +} +.game-icon-old-king:before { + content: '\E7C1'; +} +.game-icon-ninja-head:before { + content: '\E7C2'; +} +.game-icon-air-man:before { + content: '\E7C3'; +} +.game-icon-baby-face:before { + content: '\E7C4'; +} +.game-icon-blindfold:before { + content: '\E7C5'; +} +.game-icon-brain-leak:before { + content: '\E7C6'; +} +.game-icon-cleopatra:before { + content: '\E7C7'; +} +.game-icon-clown:before { + content: '\E7C8'; +} +.game-icon-egyptian-profile:before { + content: '\E7C9'; +} +.game-icon-eyepatch:before { + content: '\E7CA'; +} +.game-icon-headband-knot:before { + content: '\E7CB'; +} +.game-icon-invisible-face:before { + content: '\E7CC'; +} +.game-icon-mecha-head:before { + content: '\E7CD'; +} +.game-icon-mecha-mask:before { + content: '\E7CE'; +} +.game-icon-metal-golem-head:before { + content: '\E7CF'; +} +.game-icon-nose-front:before { + content: '\E7D0'; +} +.game-icon-nose-side:before { + content: '\E7D1'; +} +.game-icon-nurse-female:before { + content: '\E7D2'; +} +.game-icon-nurse-male:before { + content: '\E7D3'; +} +.game-icon-pirate-captain:before { + content: '\E7D4'; +} +.game-icon-plane-pilot:before { + content: '\E7D5'; +} +.game-icon-portrait:before { + content: '\E7D6'; +} +.game-icon-quick-man:before { + content: '\E7D7'; +} +.game-icon-robot-antennas:before { + content: '\E7D8'; +} +.game-icon-robot-helmet:before { + content: '\E7D9'; +} +.game-icon-star-struck:before { + content: '\E7DA'; +} +.game-icon-sunglasses:before { + content: '\E7DB'; +} +.game-icon-viking-head:before { + content: '\E7DC'; +} +.game-icon-alien-stare:before { + content: '\E7DD'; +} +.game-icon-beard:before { + content: '\E7DE'; +} +.game-icon-brain-stem:before { + content: '\E7DF'; +} +.game-icon-brainstorm:before { + content: '\E7E0'; +} +.game-icon-comb:before { + content: '\E7E1'; +} +.game-icon-diamonds-smile:before { + content: '\E7E2'; +} +.game-icon-doctor-face:before { + content: '\E7E3'; +} +.game-icon-frontal-lobe:before { + content: '\E7E4'; +} +.game-icon-gaze:before { + content: '\E7E5'; +} +.game-icon-iron-mask:before { + content: '\E7E6'; +} +.game-icon-mad-scientist:before { + content: '\E7E7'; +} +.game-icon-nailed-head:before { + content: '\E7E8'; +} +.game-icon-ninja-mask:before { + content: '\E7E9'; +} +.game-icon-one-eyed:before { + content: '\E7EA'; +} +.game-icon-pig-face:before { + content: '\E7EB'; +} +.game-icon-psychic-waves:before { + content: '\E7EC'; +} +.game-icon-pummeled:before { + content: '\E7ED'; +} +.game-icon-pumpkin-lantern:before { + content: '\E7EE'; +} +.game-icon-pumpkin-mask:before { + content: '\E7EF'; +} +.game-icon-razor-blade:before { + content: '\E7F0'; +} +.game-icon-spectacle-lenses:before { + content: '\E7F1'; +} +.game-icon-spiked-halo:before { + content: '\E7F2'; +} +.game-icon-tear-tracks:before { + content: '\E7F3'; +} +.game-icon-tooth:before { + content: '\E7F4'; +} +.game-icon-overkill:before { + content: '\E7F5'; +} +.game-icon-headshot-2:before { + content: '\E7F6'; +} +.game-icon-cobra:before { + content: '\E7F7'; +} +.game-icon-dimetrodon:before { + content: '\E7F8'; +} +.game-icon-diplodocus:before { + content: '\E7F9'; +} +.game-icon-frog-foot:before { + content: '\E7FA'; +} +.game-icon-ninja-velociraptor:before { + content: '\E7FB'; +} +.game-icon-parasaurolophus:before { + content: '\E7FC'; +} +.game-icon-rattlesnake:before { + content: '\E7FD'; +} +.game-icon-reptile-tail:before { + content: '\E7FE'; +} +.game-icon-sand-snake:before { + content: '\E7FF'; +} +.game-icon-sauropod-head:before { + content: '\E800'; +} +.game-icon-snake-egg:before { + content: '\E801'; +} +.game-icon-snake-jar:before { + content: '\E802'; +} +.game-icon-snake-spiral:before { + content: '\E803'; +} +.game-icon-snake-tongue:before { + content: '\E804'; +} +.game-icon-stegosaurus-scales:before { + content: '\E805'; +} +.game-icon-t-rex-skull:before { + content: '\E806'; +} +.game-icon-triceratops-head:before { + content: '\E807'; +} +.game-icon-velociraptor-tracks:before { + content: '\E808'; +} +.game-icon-velociraptor:before { + content: '\E809'; +} +.game-icon-lizard-tongue:before { + content: '\E80A'; +} +.game-icon-cobra-2:before { + content: '\E80B'; +} +.game-icon-defensive-wall:before { + content: '\E80C'; +} +.game-icon-3d-stairs:before { + content: '\E80D'; +} +.game-icon-airtight-hatch:before { + content: '\E80E'; +} +.game-icon-arabic-door:before { + content: '\E80F'; +} +.game-icon-arc-triomphe:before { + content: '\E810'; +} +.game-icon-ascending-block:before { + content: '\E811'; +} +.game-icon-bank:before { + content: '\E812'; +} +.game-icon-barn:before { + content: '\E813'; +} +.game-icon-barricade:before { + content: '\E814'; +} +.game-icon-barrier:before { + content: '\E815'; +} +.game-icon-base-dome:before { + content: '\E816'; +} +.game-icon-block-house:before { + content: '\E817'; +} +.game-icon-boxing-ring:before { + content: '\E818'; +} +.game-icon-brick-pile:before { + content: '\E819'; +} +.game-icon-brick-wall:before { + content: '\E81A'; +} +.game-icon-broken-wall:before { + content: '\E81B'; +} +.game-icon-byzantin-temple:before { + content: '\E81C'; +} +.game-icon-cage:before { + content: '\E81D'; +} +.game-icon-carousel:before { + content: '\E81E'; +} +.game-icon-castle-ruins:before { + content: '\E81F'; +} +.game-icon-castle:before { + content: '\E820'; +} +.game-icon-church:before { + content: '\E821'; +} +.game-icon-closed-doors:before { + content: '\E822'; +} +.game-icon-concrete-bag:before { + content: '\E823'; +} +.game-icon-congress:before { + content: '\E824'; +} +.game-icon-control-tower:before { + content: '\E825'; +} +.game-icon-crane:before { + content: '\E826'; +} +.game-icon-crypt-entrance:before { + content: '\E827'; +} +.game-icon-dam:before { + content: '\E828'; +} +.game-icon-djed-pillar:before { + content: '\E829'; +} +.game-icon-egyptian-pyramids:before { + content: '\E82A'; +} +.game-icon-egyptian-temple:before { + content: '\E82B'; +} +.game-icon-elevator:before { + content: '\E82C'; +} +.game-icon-entry-door:before { + content: '\E82D'; +} +.game-icon-escalator:before { + content: '\E82E'; +} +.game-icon-evil-tower:before { + content: '\E82F'; +} +.game-icon-exit-door:before { + content: '\E830'; +} +.game-icon-factory:before { + content: '\E831'; +} +.game-icon-family-house:before { + content: '\E832'; +} +.game-icon-floating-platforms:before { + content: '\E833'; +} +.game-icon-gate:before { + content: '\E834'; +} +.game-icon-goblin-camp:before { + content: '\E835'; +} +.game-icon-gold-mine:before { + content: '\E836'; +} +.game-icon-granary:before { + content: '\E837'; +} +.game-icon-great-pyramid:before { + content: '\E838'; +} +.game-icon-habitat-dome:before { + content: '\E839'; +} +.game-icon-hill-fort:before { + content: '\E83A'; +} +.game-icon-hobbit-dwelling:before { + content: '\E83B'; +} +.game-icon-hospital:before { + content: '\E83C'; +} +.game-icon-house:before { + content: '\E83D'; +} +.game-icon-hut:before { + content: '\E83E'; +} +.game-icon-huts-village:before { + content: '\E83F'; +} +.game-icon-i-beam:before { + content: '\E840'; +} +.game-icon-igloo:before { + content: '\E841'; +} +.game-icon-indian-palace:before { + content: '\E842'; +} +.game-icon-kid-slide:before { + content: '\E843'; +} +.game-icon-ladder:before { + content: '\E844'; +} +.game-icon-louvre-pyramid:before { + content: '\E845'; +} +.game-icon-mayan-pyramid:before { + content: '\E846'; +} +.game-icon-medieval-barracks:before { + content: '\E847'; +} +.game-icon-medieval-gate:before { + content: '\E848'; +} +.game-icon-moai:before { + content: '\E849'; +} +.game-icon-modern-city:before { + content: '\E84A'; +} +.game-icon-mushroom-house:before { + content: '\E84B'; +} +.game-icon-obelisk:before { + content: '\E84C'; +} +.game-icon-observatory:before { + content: '\E84D'; +} +.game-icon-oil-pump:before { + content: '\E84E'; +} +.game-icon-oil-rig:before { + content: '\E84F'; +} +.game-icon-pagoda:before { + content: '\E850'; +} +.game-icon-pisa-tower:before { + content: '\E851'; +} +.game-icon-post-office:before { + content: '\E852'; +} +.game-icon-pylon:before { + content: '\E853'; +} +.game-icon-refinery:before { + content: '\E854'; +} +.game-icon-rempart:before { + content: '\E855'; +} +.game-icon-round-silo:before { + content: '\E856'; +} +.game-icon-saint-basil-cathedral:before { + content: '\E857'; +} +.game-icon-saloon-doors:before { + content: '\E858'; +} +.game-icon-saloon:before { + content: '\E859'; +} +.game-icon-samara-mosque:before { + content: '\E85A'; +} +.game-icon-secret-door:before { + content: '\E85B'; +} +.game-icon-shinto-shrine:before { + content: '\E85C'; +} +.game-icon-shop:before { + content: '\E85D'; +} +.game-icon-space-needle:before { + content: '\E85E'; +} +.game-icon-spooky-house:before { + content: '\E85F'; +} +.game-icon-stairs:before { + content: '\E860'; +} +.game-icon-stockpiles:before { + content: '\E861'; +} +.game-icon-stone-wall:before { + content: '\E862'; +} +.game-icon-sverd-i-fjell:before { + content: '\E863'; +} +.game-icon-sydney-opera-house:before { + content: '\E864'; +} +.game-icon-tee-pipe:before { + content: '\E865'; +} +.game-icon-temple-gate:before { + content: '\E866'; +} +.game-icon-theater-curtains:before { + content: '\E867'; +} +.game-icon-tipi:before { + content: '\E868'; +} +.game-icon-tower-flag:before { + content: '\E869'; +} +.game-icon-traffic-cone:before { + content: '\E86A'; +} +.game-icon-triple-gate:before { + content: '\E86B'; +} +.game-icon-tv-tower:before { + content: '\E86C'; +} +.game-icon-viking-church:before { + content: '\E86D'; +} +.game-icon-viking-longhouse:before { + content: '\E86E'; +} +.game-icon-village:before { + content: '\E86F'; +} +.game-icon-warp-pipe:before { + content: '\E870'; +} +.game-icon-water-tank:before { + content: '\E871'; +} +.game-icon-water-tower:before { + content: '\E872'; +} +.game-icon-well:before { + content: '\E873'; +} +.game-icon-wheelbarrow:before { + content: '\E874'; +} +.game-icon-wind-turbine:before { + content: '\E875'; +} +.game-icon-windmill:before { + content: '\E876'; +} +.game-icon-window:before { + content: '\E877'; +} +.game-icon-windpump:before { + content: '\E878'; +} +.game-icon-castle-2:before { + content: '\E879'; +} +.game-icon-demolish:before { + content: '\E87A'; +} +.game-icon-fountain:before { + content: '\E87B'; +} +.game-icon-guarded-tower:before { + content: '\E87C'; +} +.game-icon-heart-tower:before { + content: '\E87D'; +} +.game-icon-locked-fortress:before { + content: '\E87E'; +} +.game-icon-magic-gate:before { + content: '\E87F'; +} +.game-icon-magic-portal:before { + content: '\E880'; +} +.game-icon-mucous-pillar:before { + content: '\E881'; +} +.game-icon-portculis:before { + content: '\E882'; +} +.game-icon-radar-dish:before { + content: '\E883'; +} +.game-icon-stone-tower:before { + content: '\E884'; +} +.game-icon-tower-fall:before { + content: '\E885'; +} +.game-icon-white-tower:before { + content: '\E886'; +} +.game-icon-wrecking-ball:before { + content: '\E887'; +} +.game-icon-elven-castle:before { + content: '\E888'; +} +.game-icon-arena:before { + content: '\E889'; +} +.game-icon-brazil-flag:before { + content: '\E88A'; +} +.game-icon-checkered-flag:before { + content: '\E88B'; +} +.game-icon-conqueror:before { + content: '\E88C'; +} +.game-icon-corner-flag:before { + content: '\E88D'; +} +.game-icon-european-flag:before { + content: '\E88E'; +} +.game-icon-golf-flag:before { + content: '\E88F'; +} +.game-icon-hill-conquest:before { + content: '\E890'; +} +.game-icon-knight-banner:before { + content: '\E891'; +} +.game-icon-level-end-flag:before { + content: '\E892'; +} +.game-icon-party-flags:before { + content: '\E893'; +} +.game-icon-pirate-flag:before { + content: '\E894'; +} +.game-icon-planet-conquest:before { + content: '\E895'; +} +.game-icon-south-africa-flag:before { + content: '\E896'; +} +.game-icon-star-flag:before { + content: '\E897'; +} +.game-icon-truce:before { + content: '\E898'; +} +.game-icon-tusks-flag:before { + content: '\E899'; +} +.game-icon-vertical-banner:before { + content: '\E89A'; +} +.game-icon-broken-ribbon:before { + content: '\E89B'; +} +.game-icon-flying-flag:before { + content: '\E89C'; +} +.game-icon-spinning-ribbons:before { + content: '\E89D'; +} +.game-icon-tattered-banner:before { + content: '\E89E'; +} +.game-icon-curling-stone:before { + content: '\E89F'; +} +.game-icon-frozen-body:before { + content: '\E8A0'; +} +.game-icon-frozen-ring:before { + content: '\E8A1'; +} +.game-icon-fur-boot:before { + content: '\E8A2'; +} +.game-icon-hockey:before { + content: '\E8A3'; +} +.game-icon-ice-cream-cone:before { + content: '\E8A4'; +} +.game-icon-ice-cubes:before { + content: '\E8A5'; +} +.game-icon-ice-iris:before { + content: '\E8A6'; +} +.game-icon-ice-pop:before { + content: '\E8A7'; +} +.game-icon-ice-skate:before { + content: '\E8A8'; +} +.game-icon-ice-spell-cast:before { + content: '\E8A9'; +} +.game-icon-melting-ice-cube:before { + content: '\E8AA'; +} +.game-icon-ski-boot:before { + content: '\E8AB'; +} +.game-icon-stalactites:before { + content: '\E8AC'; +} +.game-icon-thermometer-cold:before { + content: '\E8AD'; +} +.game-icon-winter-gloves:before { + content: '\E8AE'; +} +.game-icon-beveled-star:before { + content: '\E8AF'; +} +.game-icon-cold-heart:before { + content: '\E8B0'; +} +.game-icon-eskimo:before { + content: '\E8B1'; +} +.game-icon-frozen-block:before { + content: '\E8B2'; +} +.game-icon-frozen-orb:before { + content: '\E8B3'; +} +.game-icon-ice-bolt:before { + content: '\E8B4'; +} +.game-icon-ice-bomb:before { + content: '\E8B5'; +} +.game-icon-ice-cube:before { + content: '\E8B6'; +} +.game-icon-icebergs:before { + content: '\E8B7'; +} +.game-icon-icicles-aura:before { + content: '\E8B8'; +} +.game-icon-icicles-fence:before { + content: '\E8B9'; +} +.game-icon-snow-bottle:before { + content: '\E8BA'; +} +.game-icon-snowflake-1:before { + content: '\E8BB'; +} +.game-icon-snowflake-2:before { + content: '\E8BC'; +} +.game-icon-snowing:before { + content: '\E8BD'; +} +.game-icon-snowman:before { + content: '\E8BE'; +} +.game-icon-flake:before { + content: '\E8BF'; +} +.game-icon-hooded-assassin:before { + content: '\E8C0'; +} +.game-icon-hooded-figure:before { + content: '\E8C1'; +} +.game-icon-ninja-heroic-stance:before { + content: '\E8C2'; +} +.game-icon-arm-bandage:before { + content: '\E8C3'; +} +.game-icon-arm-sling:before { + content: '\E8C4'; +} +.game-icon-blacksmith:before { + content: '\E8C5'; +} +.game-icon-body-balance:before { + content: '\E8C6'; +} +.game-icon-caveman:before { + content: '\E8C7'; +} +.game-icon-character:before { + content: '\E8C8'; +} +.game-icon-contortionist:before { + content: '\E8C9'; +} +.game-icon-cook:before { + content: '\E8CA'; +} +.game-icon-cryo-chamber:before { + content: '\E8CB'; +} +.game-icon-egyptian-walk:before { + content: '\E8CC'; +} +.game-icon-face-to-face:before { + content: '\E8CD'; +} +.game-icon-farmer:before { + content: '\E8CE'; +} +.game-icon-guards:before { + content: '\E8CF'; +} +.game-icon-high-kick:before { + content: '\E8D0'; +} +.game-icon-high-punch:before { + content: '\E8D1'; +} +.game-icon-human-pyramid:before { + content: '\E8D2'; +} +.game-icon-invisible:before { + content: '\E8D3'; +} +.game-icon-jumping-rope:before { + content: '\E8D4'; +} +.game-icon-knee-bandage:before { + content: '\E8D5'; +} +.game-icon-lovers:before { + content: '\E8D6'; +} +.game-icon-medallist:before { + content: '\E8D7'; +} +.game-icon-mighty-force:before { + content: '\E8D8'; +} +.game-icon-person:before { + content: '\E8D9'; +} +.game-icon-pikeman:before { + content: '\E8DA'; +} +.game-icon-ringmaster:before { + content: '\E8DB'; +} +.game-icon-sleeping-bag:before { + content: '\E8DC'; +} +.game-icon-spiked-wall:before { + content: '\E8DD'; +} +.game-icon-strong-man:before { + content: '\E8DE'; +} +.game-icon-sun-priest:before { + content: '\E8DF'; +} +.game-icon-three-friends:before { + content: '\E8E0'; +} +.game-icon-tightrope:before { + content: '\E8E1'; +} +.game-icon-tribunal-jury:before { + content: '\E8E2'; +} +.game-icon-vampire-cape:before { + content: '\E8E3'; +} +.game-icon-van-damme-split:before { + content: '\E8E4'; +} +.game-icon-vitruvian-man:before { + content: '\E8E5'; +} +.game-icon-weight-lifting-down:before { + content: '\E8E6'; +} +.game-icon-weight-lifting-up:before { + content: '\E8E7'; +} +.game-icon-anatomy:before { + content: '\E8E8'; +} +.game-icon-aura:before { + content: '\E8E9'; +} +.game-icon-backup:before { + content: '\E8EA'; +} +.game-icon-beams-aura:before { + content: '\E8EB'; +} +.game-icon-body-swapping:before { + content: '\E8EC'; +} +.game-icon-deadly-strike:before { + content: '\E8ED'; +} +.game-icon-dna1:before { + content: '\E8EE'; +} +.game-icon-dna2:before { + content: '\E8EF'; +} +.game-icon-dozen:before { + content: '\E8F0'; +} +.game-icon-embrassed-energy:before { + content: '\E8F1'; +} +.game-icon-ghost-ally:before { + content: '\E8F2'; +} +.game-icon-heart-inside:before { + content: '\E8F3'; +} +.game-icon-heart-organ:before { + content: '\E8F4'; +} +.game-icon-inner-self:before { + content: '\E8F5'; +} +.game-icon-master-of-arms:before { + content: '\E8F6'; +} +.game-icon-minions:before { + content: '\E8F7'; +} +.game-icon-muscle-fat:before { + content: '\E8F8'; +} +.game-icon-octoman:before { + content: '\E8F9'; +} +.game-icon-puppet:before { + content: '\E8FA'; +} +.game-icon-rear-aura:before { + content: '\E8FB'; +} +.game-icon-relationship-bounds:before { + content: '\E8FC'; +} +.game-icon-rogue:before { + content: '\E8FD'; +} +.game-icon-shadow-follower:before { + content: '\E8FE'; +} +.game-icon-sinking-trap:before { + content: '\E8FF'; +} +.game-icon-skeleton-inside:before { + content: '\E900'; +} +.game-icon-split-body:before { + content: '\E901'; +} +.game-icon-static-guard:before { + content: '\E902'; +} +.game-icon-sword-tie:before { + content: '\E903'; +} +.game-icon-target-dummy:before { + content: '\E904'; +} +.game-icon-telepathy:before { + content: '\E905'; +} +.game-icon-transportation-rings:before { + content: '\E906'; +} +.game-icon-falling:before { + content: '\E907'; +} +.game-icon-fat:before { + content: '\E908'; +} +.game-icon-skeleton:before { + content: '\E909'; +} +.game-icon-crystal-earrings:before { + content: '\E90A'; +} +.game-icon-diamond-hilt:before { + content: '\E90B'; +} +.game-icon-diamond-ring:before { + content: '\E90C'; +} +.game-icon-double-necklace:before { + content: '\E90D'; +} +.game-icon-drop-earrings:before { + content: '\E90E'; +} +.game-icon-earrings:before { + content: '\E90F'; +} +.game-icon-emerald-necklace:before { + content: '\E910'; +} +.game-icon-feather-necklace:before { + content: '\E911'; +} +.game-icon-globe-ring:before { + content: '\E912'; +} +.game-icon-heart-earrings:before { + content: '\E913'; +} +.game-icon-heart-necklace:before { + content: '\E914'; +} +.game-icon-intricate-necklace:before { + content: '\E915'; +} +.game-icon-necklace-display:before { + content: '\E916'; +} +.game-icon-oyster-pearl:before { + content: '\E917'; +} +.game-icon-pearl-earring:before { + content: '\E918'; +} +.game-icon-pearl-necklace:before { + content: '\E919'; +} +.game-icon-pendant-key:before { + content: '\E91A'; +} +.game-icon-power-ring:before { + content: '\E91B'; +} +.game-icon-prayer-beads:before { + content: '\E91C'; +} +.game-icon-primitive-necklace:before { + content: '\E91D'; +} +.game-icon-ring-box:before { + content: '\E91E'; +} +.game-icon-ring:before { + content: '\E91F'; +} +.game-icon-rupee:before { + content: '\E920'; +} +.game-icon-tribal-pendant:before { + content: '\E921'; +} +.game-icon-necklace:before { + content: '\E922'; +} +.game-icon-crystal-growth:before { + content: '\E923'; +} +.game-icon-crystalize:before { + content: '\E924'; +} +.game-icon-cut-diamond:before { + content: '\E925'; +} +.game-icon-emerald:before { + content: '\E926'; +} +.game-icon-engagement-ring:before { + content: '\E927'; +} +.game-icon-gem-chain:before { + content: '\E928'; +} +.game-icon-gem-necklace:before { + content: '\E929'; +} +.game-icon-gem-pendant:before { + content: '\E92A'; +} +.game-icon-jeweled-chalice:before { + content: '\E92B'; +} +.game-icon-linked-rings:before { + content: '\E92C'; +} +.game-icon-medal-skull:before { + content: '\E92D'; +} +.game-icon-medal:before { + content: '\E92E'; +} +.game-icon-saphir:before { + content: '\E92F'; +} +.game-icon-skull-ring:before { + content: '\E930'; +} +.game-icon-skull-signet:before { + content: '\E931'; +} +.game-icon-spiked-collar:before { + content: '\E932'; +} +.game-icon-trophy:before { + content: '\E933'; +} +.game-icon-amethyst:before { + content: '\E934'; +} +.game-icon-big-diamond-ring:before { + content: '\E935'; +} +.game-icon-topaz:before { + content: '\E936'; +} +.game-icon-big-gear:before { + content: '\E937'; +} +.game-icon-belt-armor:before { + content: '\E938'; +} +.game-icon-bolt-cutter:before { + content: '\E939'; +} +.game-icon-bottle-cap:before { + content: '\E93A'; +} +.game-icon-empty-metal-bucket-handle:before { + content: '\E93B'; +} +.game-icon-empty-metal-bucket:before { + content: '\E93C'; +} +.game-icon-foundry-bucket:before { + content: '\E93D'; +} +.game-icon-full-metal-bucket-handle:before { + content: '\E93E'; +} +.game-icon-full-metal-bucket:before { + content: '\E93F'; +} +.game-icon-gold-stack:before { + content: '\E940'; +} +.game-icon-hexagonal-nut:before { + content: '\E941'; +} +.game-icon-ladle:before { + content: '\E942'; +} +.game-icon-melting-metal:before { + content: '\E943'; +} +.game-icon-metal-plate:before { + content: '\E944'; +} +.game-icon-ring-mould:before { + content: '\E945'; +} +.game-icon-screw:before { + content: '\E946'; +} +.game-icon-shoulder-armor:before { + content: '\E947'; +} +.game-icon-spring:before { + content: '\E948'; +} +.game-icon-straight-pipe:before { + content: '\E949'; +} +.game-icon-sword-mold:before { + content: '\E94A'; +} +.game-icon-wire-coil:before { + content: '\E94B'; +} +.game-icon-zipper:before { + content: '\E94C'; +} +.game-icon-anvil-impact:before { + content: '\E94D'; +} +.game-icon-anvil:before { + content: '\E94E'; +} +.game-icon-barbed-coil:before { + content: '\E94F'; +} +.game-icon-barbed-wire:before { + content: '\E950'; +} +.game-icon-black-bar:before { + content: '\E951'; +} +.game-icon-cash:before { + content: '\E952'; +} +.game-icon-crossed-chains:before { + content: '\E953'; +} +.game-icon-magnet-blast:before { + content: '\E954'; +} +.game-icon-magnet:before { + content: '\E955'; +} +.game-icon-metal-bar:before { + content: '\E956'; +} +.game-icon-metal-disc:before { + content: '\E957'; +} +.game-icon-metal-hand:before { + content: '\E958'; +} +.game-icon-metal-scales:before { + content: '\E959'; +} +.game-icon-nails:before { + content: '\E95A'; +} +.game-icon-needle-drill:before { + content: '\E95B'; +} +.game-icon-robot-golem:before { + content: '\E95C'; +} +.game-icon-screw-2:before { + content: '\E95D'; +} +.game-icon-spoon:before { + content: '\E95E'; +} +.game-icon-steel-claws:before { + content: '\E95F'; +} +.game-icon-steeltoe-boots:before { + content: '\E960'; +} +.game-icon-wavy-chains:before { + content: '\E961'; +} +.game-icon-weight-crush:before { + content: '\E962'; +} +.game-icon-breaking-chain:before { + content: '\E963'; +} +.game-icon-steel-claws-2:before { + content: '\E964'; +} +.game-icon-gold-bar:before { + content: '\E965'; +} +.game-icon-tabi-boot:before { + content: '\E966'; +} +.game-icon-bamboo:before { + content: '\E967'; +} +.game-icon-black-belt:before { + content: '\E968'; +} +.game-icon-handheld-fan:before { + content: '\E969'; +} +.game-icon-japanese-bridge:before { + content: '\E96A'; +} +.game-icon-katana:before { + content: '\E96B'; +} +.game-icon-kimono:before { + content: '\E96C'; +} +.game-icon-night-vision:before { + content: '\E96D'; +} +.game-icon-ninja-armor:before { + content: '\E96E'; +} +.game-icon-onigori:before { + content: '\E96F'; +} +.game-icon-rope-dart:before { + content: '\E970'; +} +.game-icon-shinto-shrine-mirror:before { + content: '\E971'; +} +.game-icon-teapot-leaves:before { + content: '\E972'; +} +.game-icon-yunluo:before { + content: '\E973'; +} +.game-icon-assassin-pocket:before { + content: '\E974'; +} +.game-icon-lotus:before { + content: '\E975'; +} +.game-icon-sword-slice:before { + content: '\E976'; +} +.game-icon-thrown-daggers:before { + content: '\E977'; +} +.game-icon-apothecary:before { + content: '\E978'; +} +.game-icon-cauldron:before { + content: '\E979'; +} +.game-icon-butter:before { + content: '\E97A'; +} +.game-icon-cloth-jar:before { + content: '\E97B'; +} +.game-icon-coffee-cup:before { + content: '\E97C'; +} +.game-icon-coffee-pot:before { + content: '\E97D'; +} +.game-icon-cooking-pot:before { + content: '\E97E'; +} +.game-icon-corkscrew:before { + content: '\E97F'; +} +.game-icon-covered-jar:before { + content: '\E980'; +} +.game-icon-fork-knife-spoon:before { + content: '\E981'; +} +.game-icon-glass-celebration:before { + content: '\E982'; +} +.game-icon-ice-cream-scoop:before { + content: '\E983'; +} +.game-icon-kitchen-scale:before { + content: '\E984'; +} +.game-icon-manual-juicer:before { + content: '\E985'; +} +.game-icon-manual-meat-grinder:before { + content: '\E986'; +} +.game-icon-meal:before { + content: '\E987'; +} +.game-icon-moka-pot:before { + content: '\E988'; +} +.game-icon-painted-pottery:before { + content: '\E989'; +} +.game-icon-porcelain-vase:before { + content: '\E98A'; +} +.game-icon-pouring-pot:before { + content: '\E98B'; +} +.game-icon-toaster:before { + content: '\E98C'; +} +.game-icon-whisk:before { + content: '\E98D'; +} +.game-icon-bandage-roll:before { + content: '\E98E'; +} +.game-icon-bowl-spiral:before { + content: '\E98F'; +} +.game-icon-cauldron-2:before { + content: '\E990'; +} +.game-icon-chalice-drops:before { + content: '\E991'; +} +.game-icon-coffee-mug:before { + content: '\E992'; +} +.game-icon-glass-shot:before { + content: '\E993'; +} +.game-icon-kitchen-knives:before { + content: '\E994'; +} +.game-icon-knife-fork:before { + content: '\E995'; +} +.game-icon-martini:before { + content: '\E996'; +} +.game-icon-meat-cleaver:before { + content: '\E997'; +} +.game-icon-pizza-cutter:before { + content: '\E998'; +} +.game-icon-shattered-glass:before { + content: '\E999'; +} +.game-icon-wine-glass:before { + content: '\E99A'; +} +.game-icon-egg-pod:before { + content: '\E99B'; +} +.game-icon-fruit-bowl:before { + content: '\E99C'; +} +.game-icon-pestle-mortar:before { + content: '\E99D'; +} +.game-icon-eternal-love:before { + content: '\E99E'; +} +.game-icon-first-aid-kit:before { + content: '\E99F'; +} +.game-icon-foot-plaster:before { + content: '\E9A0'; +} +.game-icon-hand-bandage:before { + content: '\E9A1'; +} +.game-icon-healing:before { + content: '\E9A2'; +} +.game-icon-health-capsule:before { + content: '\E9A3'; +} +.game-icon-health-potion:before { + content: '\E9A4'; +} +.game-icon-herbs-bundle:before { + content: '\E9A5'; +} +.game-icon-life-bar:before { + content: '\E9A6'; +} +.game-icon-medical-drip:before { + content: '\E9A7'; +} +.game-icon-medical-thermometer:before { + content: '\E9A8'; +} +.game-icon-medicine-pills:before { + content: '\E9A9'; +} +.game-icon-medicines:before { + content: '\E9AA'; +} +.game-icon-nested-hearts:before { + content: '\E9AB'; +} +.game-icon-remedy:before { + content: '\E9AC'; +} +.game-icon-stethoscope:before { + content: '\E9AD'; +} +.game-icon-broken-heart:before { + content: '\E9AE'; +} +.game-icon-defibrilate:before { + content: '\E9AF'; +} +.game-icon-embryo:before { + content: '\E9B0'; +} +.game-icon-heart-bottle:before { + content: '\E9B1'; +} +.game-icon-life-support:before { + content: '\E9B2'; +} +.game-icon-life-tap:before { + content: '\E9B3'; +} +.game-icon-love-injection:before { + content: '\E9B4'; +} +.game-icon-miracle-medecine:before { + content: '\E9B5'; +} +.game-icon-overdose:before { + content: '\E9B6'; +} +.game-icon-pill-drop:before { + content: '\E9B7'; +} +.game-icon-pill:before { + content: '\E9B8'; +} +.game-icon-scalpel:before { + content: '\E9B9'; +} +.game-icon-sticking-plaster:before { + content: '\E9BA'; +} +.game-icon-syringe:before { + content: '\E9BB'; +} +.game-icon-health-decrease:before { + content: '\E9BC'; +} +.game-icon-health-increase:before { + content: '\E9BD'; +} +.game-icon-health-normal:before { + content: '\E9BE'; +} +.game-icon-medical-pack-alt:before { + content: '\E9BF'; +} +.game-icon-medical-pack:before { + content: '\E9C0'; +} +.game-icon-fetus:before { + content: '\E9C1'; +} +.game-icon-heart-minus:before { + content: '\E9C2'; +} +.game-icon-heart-plus:before { + content: '\E9C3'; +} +.game-icon-ancient-screw:before { + content: '\E9C4'; +} +.game-icon-beam-satellite:before { + content: '\E9C5'; +} +.game-icon-bouncing-spring:before { + content: '\E9C6'; +} +.game-icon-computer-fan:before { + content: '\E9C7'; +} +.game-icon-death-star:before { + content: '\E9C8'; +} +.game-icon-drill:before { + content: '\E9C9'; +} +.game-icon-floor-polisher:before { + content: '\E9CA'; +} +.game-icon-gps:before { + content: '\E9CB'; +} +.game-icon-love-mystery:before { + content: '\E9CC'; +} +.game-icon-plug:before { + content: '\E9CD'; +} +.game-icon-power-generator:before { + content: '\E9CE'; +} +.game-icon-round-knob:before { + content: '\E9CF'; +} +.game-icon-satellite-communication:before { + content: '\E9D0'; +} +.game-icon-security-gate:before { + content: '\E9D1'; +} +.game-icon-settings-knobs:before { + content: '\E9D2'; +} +.game-icon-star-gate:before { + content: '\E9D3'; +} +.game-icon-tv:before { + content: '\E9D4'; +} +.game-icon-vacuum-cleaner:before { + content: '\E9D5'; +} +.game-icon-valve:before { + content: '\E9D6'; +} +.game-icon-vending-machine:before { + content: '\E9D7'; +} +.game-icon-video-conference:before { + content: '\E9D8'; +} +.game-icon-computing:before { + content: '\E9D9'; +} +.game-icon-diagram:before { + content: '\E9DA'; +} +.game-icon-microscope:before { + content: '\E9DB'; +} +.game-icon-auto-repair:before { + content: '\E9DC'; +} +.game-icon-circuitry:before { + content: '\E9DD'; +} +.game-icon-cog-lock:before { + content: '\E9DE'; +} +.game-icon-drill-2:before { + content: '\E9DF'; +} +.game-icon-lever:before { + content: '\E9E0'; +} +.game-icon-mechanical-arm:before { + content: '\E9E1'; +} +.game-icon-microchip:before { + content: '\E9E2'; +} +.game-icon-microscope-lens:before { + content: '\E9E3'; +} +.game-icon-overdrive:before { + content: '\E9E4'; +} +.game-icon-processor:before { + content: '\E9E5'; +} +.game-icon-sattelite:before { + content: '\E9E6'; +} +.game-icon-skid-mark:before { + content: '\E9E7'; +} +.game-icon-spoutnik:before { + content: '\E9E8'; +} +.game-icon-tyre:before { + content: '\E9E9'; +} +.game-icon-tesla:before { + content: '\E9EA'; +} +.game-icon-unplugged:before { + content: '\E9EB'; +} +.game-icon-revolt:before { + content: '\E9EC'; +} +.game-icon-robber-hand:before { + content: '\E9ED'; +} +.game-icon-severed-hand:before { + content: '\E9EE'; +} +.game-icon-fingers-crossed:before { + content: '\E9EF'; +} +.game-icon-paper:before { + content: '\E9F0'; +} +.game-icon-rock:before { + content: '\E9F1'; +} +.game-icon-scissors:before { + content: '\E9F2'; +} +.game-icon-armor-punch:before { + content: '\E9F3'; +} +.game-icon-baseball-glove:before { + content: '\E9F4'; +} +.game-icon-bolt-spell-cast:before { + content: '\E9F5'; +} +.game-icon-cherish:before { + content: '\E9F6'; +} +.game-icon-cooking-glove:before { + content: '\E9F7'; +} +.game-icon-fingernail:before { + content: '\E9F8'; +} +.game-icon-forearm:before { + content: '\E9F9'; +} +.game-icon-gauntlet:before { + content: '\E9FA'; +} +.game-icon-gloves:before { + content: '\E9FB'; +} +.game-icon-hand-grip:before { + content: '\E9FC'; +} +.game-icon-hand-of-god:before { + content: '\E9FD'; +} +.game-icon-hand-ok:before { + content: '\E9FE'; +} +.game-icon-marble-tap:before { + content: '\E9FF'; +} +.game-icon-pirate-hook:before { + content: '\EA00'; +} +.game-icon-spock-hand:before { + content: '\EA01'; +} +.game-icon-take-my-money:before { + content: '\EA02'; +} +.game-icon-thumb-down:before { + content: '\EA03'; +} +.game-icon-thumb-up:before { + content: '\EA04'; +} +.game-icon-wolverine-claws-2:before { + content: '\EA05'; +} +.game-icon-boxing-glove-surprise:before { + content: '\EA06'; +} +.game-icon-boxing-glove:before { + content: '\EA07'; +} +.game-icon-cut-palm:before { + content: '\EA08'; +} +.game-icon-fist:before { + content: '\EA09'; +} +.game-icon-fulguro-punch:before { + content: '\EA0A'; +} +.game-icon-gift-of-knowledge:before { + content: '\EA0B'; +} +.game-icon-glowing-hands:before { + content: '\EA0C'; +} +.game-icon-hand:before { + content: '\EA0D'; +} +.game-icon-high-five:before { + content: '\EA0E'; +} +.game-icon-magic-palm:before { + content: '\EA0F'; +} +.game-icon-magic-swirl:before { + content: '\EA10'; +} +.game-icon-mailed-fist:before { + content: '\EA11'; +} +.game-icon-monster-grasp:before { + content: '\EA12'; +} +.game-icon-moon-claws:before { + content: '\EA13'; +} +.game-icon-palm:before { + content: '\EA14'; +} +.game-icon-punch-blast:before { + content: '\EA15'; +} +.game-icon-punch:before { + content: '\EA16'; +} +.game-icon-shadow-grasp:before { + content: '\EA17'; +} +.game-icon-stigmata:before { + content: '\EA18'; +} +.game-icon-thor-fist:before { + content: '\EA19'; +} +.game-icon-hand-2:before { + content: '\EA1A'; +} +.game-icon-revolt-2:before { + content: '\EA1B'; +} +.game-icon-usable:before { + content: '\EA1C'; +} +.game-icon-click:before { + content: '\EA1D'; +} +.game-icon-fist-2:before { + content: '\EA1E'; +} +.game-icon-open-palm:before { + content: '\EA1F'; +} +.game-icon-raise-skeleton:before { + content: '\EA20'; +} +.game-icon-barrel-leak:before { + content: '\EA21'; +} +.game-icon-basket:before { + content: '\EA22'; +} +.game-icon-beach-bucket:before { + content: '\EA23'; +} +.game-icon-cardboard-box-closed:before { + content: '\EA24'; +} +.game-icon-cardboard-box:before { + content: '\EA25'; +} +.game-icon-cargo-crate:before { + content: '\EA26'; +} +.game-icon-cellar-barrels:before { + content: '\EA27'; +} +.game-icon-chest:before { + content: '\EA28'; +} +.game-icon-companion-cube:before { + content: '\EA29'; +} +.game-icon-database:before { + content: '\EA2A'; +} +.game-icon-energy-tank:before { + content: '\EA2B'; +} +.game-icon-fuel-tank:before { + content: '\EA2C'; +} +.game-icon-hand-truck:before { + content: '\EA2D'; +} +.game-icon-locked-box:before { + content: '\EA2E'; +} +.game-icon-matryoshka-dolls:before { + content: '\EA2F'; +} +.game-icon-nuclear-waste:before { + content: '\EA30'; +} +.game-icon-opened-food-can:before { + content: '\EA31'; +} +.game-icon-paper-tray:before { + content: '\EA32'; +} +.game-icon-present:before { + content: '\EA33'; +} +.game-icon-shoulder-bag:before { + content: '\EA34'; +} +.game-icon-strongbox:before { + content: '\EA35'; +} +.game-icon-toolbox:before { + content: '\EA36'; +} +.game-icon-watering-can:before { + content: '\EA37'; +} +.game-icon-cannister:before { + content: '\EA38'; +} +.game-icon-chemical-tank:before { + content: '\EA39'; +} +.game-icon-jigsaw-box:before { + content: '\EA3A'; +} +.game-icon-locked-chest:before { + content: '\EA3B'; +} +.game-icon-box-trap:before { + content: '\EA3C'; +} +.game-icon-oil-drum:before { + content: '\EA3D'; +} +.game-icon-open-chest:before { + content: '\EA3E'; +} +.game-icon-open-treasure-chest:before { + content: '\EA3F'; +} +.game-icon-beer-horn:before { + content: '\EA40'; +} +.game-icon-bolt-drop:before { + content: '\EA41'; +} +.game-icon-booze:before { + content: '\EA42'; +} +.game-icon-cactus-tap:before { + content: '\EA43'; +} +.game-icon-holy-water:before { + content: '\EA44'; +} +.game-icon-leak:before { + content: '\EA45'; +} +.game-icon-lily-pads:before { + content: '\EA46'; +} +.game-icon-liquid-soap:before { + content: '\EA47'; +} +.game-icon-plant-watering:before { + content: '\EA48'; +} +.game-icon-shower:before { + content: '\EA49'; +} +.game-icon-tap:before { + content: '\EA4A'; +} +.game-icon-water-bottle:before { + content: '\EA4B'; +} +.game-icon-water-gallon:before { + content: '\EA4C'; +} +.game-icon-water-gun:before { + content: '\EA4D'; +} +.game-icon-acid-blob:before { + content: '\EA4E'; +} +.game-icon-beer-stein:before { + content: '\EA4F'; +} +.game-icon-bleeding-eye:before { + content: '\EA50'; +} +.game-icon-boiling-bubbles:before { + content: '\EA51'; +} +.game-icon-bubbles:before { + content: '\EA52'; +} +.game-icon-burst-blob:before { + content: '\EA53'; +} +.game-icon-chemical-drop:before { + content: '\EA54'; +} +.game-icon-dew:before { + content: '\EA55'; +} +.game-icon-drink-me:before { + content: '\EA56'; +} +.game-icon-dripping-blade:before { + content: '\EA57'; +} +.game-icon-dripping-goo:before { + content: '\EA58'; +} +.game-icon-dripping-star:before { + content: '\EA59'; +} +.game-icon-dripping-stone:before { + content: '\EA5A'; +} +.game-icon-dripping-sword:before { + content: '\EA5B'; +} +.game-icon-drop:before { + content: '\EA5C'; +} +.game-icon-droplet-splash:before { + content: '\EA5D'; +} +.game-icon-droplets:before { + content: '\EA5E'; +} +.game-icon-eyedropper:before { + content: '\EA5F'; +} +.game-icon-foam:before { + content: '\EA60'; +} +.game-icon-gloop:before { + content: '\EA61'; +} +.game-icon-goo-explosion:before { + content: '\EA62'; +} +.game-icon-goo-skull:before { + content: '\EA63'; +} +.game-icon-goo-spurt:before { + content: '\EA64'; +} +.game-icon-gooey-impact:before { + content: '\EA65'; +} +.game-icon-gooey-molecule:before { + content: '\EA66'; +} +.game-icon-gooey-sword:before { + content: '\EA67'; +} +.game-icon-grease-trap:before { + content: '\EA68'; +} +.game-icon-grouped-drops:before { + content: '\EA69'; +} +.game-icon-heart-drop:before { + content: '\EA6A'; +} +.game-icon-heavy-rain:before { + content: '\EA6B'; +} +.game-icon-hypodermic-test:before { + content: '\EA6C'; +} +.game-icon-kaleidoscope-pearls:before { + content: '\EA6D'; +} +.game-icon-marrow-drain:before { + content: '\EA6E'; +} +.game-icon-oily-spiral:before { + content: '\EA6F'; +} +.game-icon-poison-bottle:before { + content: '\EA70'; +} +.game-icon-spatter:before { + content: '\EA71'; +} +.game-icon-spill:before { + content: '\EA72'; +} +.game-icon-splash:before { + content: '\EA73'; +} +.game-icon-splashy-stream:before { + content: '\EA74'; +} +.game-icon-splurt:before { + content: '\EA75'; +} +.game-icon-transparent-tubes:before { + content: '\EA76'; +} +.game-icon-water-bolt:before { + content: '\EA77'; +} +.game-icon-milk-carton:before { + content: '\EA78'; +} +.game-icon-acid:before { + content: '\EA79'; +} +.game-icon-water-drop:before { + content: '\EA7A'; +} +.game-icon-blood:before { + content: '\EA7B'; +} +.game-icon-skull-sabertooth:before { + content: '\EA7C'; +} +.game-icon-calavera:before { + content: '\EA7D'; +} +.game-icon-alien-skull:before { + content: '\EA7E'; +} +.game-icon-blade-bite:before { + content: '\EA7F'; +} +.game-icon-bone-gnawer:before { + content: '\EA80'; +} +.game-icon-broken-skull:before { + content: '\EA81'; +} +.game-icon-chewed-skull:before { + content: '\EA82'; +} +.game-icon-chopped-skull:before { + content: '\EA83'; +} +.game-icon-condylura-skull:before { + content: '\EA84'; +} +.game-icon-death-note:before { + content: '\EA85'; +} +.game-icon-deathcab:before { + content: '\EA86'; +} +.game-icon-dread-skull:before { + content: '\EA87'; +} +.game-icon-fanged-skull:before { + content: '\EA88'; +} +.game-icon-happy-skull:before { + content: '\EA89'; +} +.game-icon-harry-potter-skull:before { + content: '\EA8A'; +} +.game-icon-leaky-skull:before { + content: '\EA8B'; +} +.game-icon-morbid-humour:before { + content: '\EA8C'; +} +.game-icon-piece-skull:before { + content: '\EA8D'; +} +.game-icon-pirate-skull:before { + content: '\EA8E'; +} +.game-icon-sharped-teeth-skull:before { + content: '\EA8F'; +} +.game-icon-skeleton-key:before { + content: '\EA90'; +} +.game-icon-skull-bolt:before { + content: '\EA91'; +} +.game-icon-skull-crack:before { + content: '\EA92'; +} +.game-icon-skull-in-jar:before { + content: '\EA93'; +} +.game-icon-skull-mask:before { + content: '\EA94'; +} +.game-icon-skull-slices:before { + content: '\EA95'; +} +.game-icon-spade-skull:before { + content: '\EA96'; +} +.game-icon-star-skull:before { + content: '\EA97'; +} +.game-icon-tentacles-skull:before { + content: '\EA98'; +} +.game-icon-thunder-skull:before { + content: '\EA99'; +} +.game-icon-triple-skulls:before { + content: '\EA9A'; +} +.game-icon-death-skull:before { + content: '\EA9B'; +} +.game-icon-skull-with-syringe:before { + content: '\EA9C'; +} +.game-icon-bacon:before { + content: '\EA9D'; +} +.game-icon-kebab-spit:before { + content: '\EA9E'; +} +.game-icon-sausage:before { + content: '\EA9F'; +} +.game-icon-sausages-ribbon:before { + content: '\EAA0'; +} +.game-icon-sliced-sausage:before { + content: '\EAA1'; +} +.game-icon-steak:before { + content: '\EAA2'; +} +.game-icon-meat:before { + content: '\EAA3'; +} +.game-icon-ham-shank:before { + content: '\EAA4'; +} +.game-icon-berries-bowl:before { + content: '\EAA5'; +} +.game-icon-bindle:before { + content: '\EAA6'; +} +.game-icon-bone-knife:before { + content: '\EAA7'; +} +.game-icon-clay-brick:before { + content: '\EAA8'; +} +.game-icon-dolmen:before { + content: '\EAA9'; +} +.game-icon-fur-shirt:before { + content: '\EAAA'; +} +.game-icon-silex:before { + content: '\EAAB'; +} +.game-icon-stone-wheel:before { + content: '\EAAC'; +} +.game-icon-bone-knife-2:before { + content: '\EAAD'; +} +.game-icon-broken-bone:before { + content: '\EAAE'; +} +.game-icon-broken-tablet:before { + content: '\EAAF'; +} +.game-icon-rock-2:before { + content: '\EAB0'; +} +.game-icon-stone-axe:before { + content: '\EAB1'; +} +.game-icon-stone-tablet:before { + content: '\EAB2'; +} +.game-icon-cactus:before { + content: '\EAB3'; +} +.game-icon-cleaver:before { + content: '\EAB4'; +} +.game-icon-heart-stake:before { + content: '\EAB5'; +} +.game-icon-pitchfork:before { + content: '\EAB6'; +} +.game-icon-safety-pin:before { + content: '\EAB7'; +} +.game-icon-shattered-heart:before { + content: '\EAB8'; +} +.game-icon-spiked-shoulder-armor:before { + content: '\EAB9'; +} +.game-icon-spiky-pit:before { + content: '\EABA'; +} +.game-icon-air-zigzag:before { + content: '\EABB'; +} +.game-icon-alligator-clip:before { + content: '\EABC'; +} +.game-icon-armoured-shell:before { + content: '\EABD'; +} +.game-icon-atomic-slashes:before { + content: '\EABE'; +} +.game-icon-bleeding-heart:before { + content: '\EABF'; +} +.game-icon-burning-round-shot:before { + content: '\EAC0'; +} +.game-icon-circle-claws:before { + content: '\EAC1'; +} +.game-icon-claw-slashes:before { + content: '\EAC2'; +} +.game-icon-cracked-ball-dunk:before { + content: '\EAC3'; +} +.game-icon-cracked-disc:before { + content: '\EAC4'; +} +.game-icon-cracked-glass:before { + content: '\EAC5'; +} +.game-icon-cracked-mask:before { + content: '\EAC6'; +} +.game-icon-cracked-saber:before { + content: '\EAC7'; +} +.game-icon-crossed-air-flows:before { + content: '\EAC8'; +} +.game-icon-crossed-slashes:before { + content: '\EAC9'; +} +.game-icon-earth-spit:before { + content: '\EACA'; +} +.game-icon-eclipse-saw:before { + content: '\EACB'; +} +.game-icon-edge-crack:before { + content: '\EACC'; +} +.game-icon-fangs-circle:before { + content: '\EACD'; +} +.game-icon-groundbreaker:before { + content: '\EACE'; +} +.game-icon-large-wound:before { + content: '\EACF'; +} +.game-icon-light-thorny-triskelion:before { + content: '\EAD0'; +} +.game-icon-mantrap:before { + content: '\EAD1'; +} +.game-icon-mighty-spanner:before { + content: '\EAD2'; +} +.game-icon-needle-jaws:before { + content: '\EAD3'; +} +.game-icon-quick-slash:before { + content: '\EAD4'; +} +.game-icon-rough-wound:before { + content: '\EAD5'; +} +.game-icon-serrated-slash:before { + content: '\EAD6'; +} +.game-icon-shatter:before { + content: '\EAD7'; +} +.game-icon-shattered-sword:before { + content: '\EAD8'; +} +.game-icon-spiked-armor:before { + content: '\EAD9'; +} +.game-icon-spiked-fence:before { + content: '\EADA'; +} +.game-icon-spiked-shell:before { + content: '\EADB'; +} +.game-icon-spiked-tail:before { + content: '\EADC'; +} +.game-icon-spiked-tentacle:before { + content: '\EADD'; +} +.game-icon-spiky-eclipse:before { + content: '\EADE'; +} +.game-icon-spiky-explosion:before { + content: '\EADF'; +} +.game-icon-striking-diamonds:before { + content: '\EAE0'; +} +.game-icon-swan-breeze:before { + content: '\EAE1'; +} +.game-icon-swirl-ring:before { + content: '\EAE2'; +} +.game-icon-swirl-string:before { + content: '\EAE3'; +} +.game-icon-sword-break:before { + content: '\EAE4'; +} +.game-icon-tension-snowflake:before { + content: '\EAE5'; +} +.game-icon-tornado-discs:before { + content: '\EAE6'; +} +.game-icon-triple-claws:before { + content: '\EAE7'; +} +.game-icon-triple-needle:before { + content: '\EAE8'; +} +.game-icon-unstable-projectile:before { + content: '\EAE9'; +} +.game-icon-whiplash:before { + content: '\EAEA'; +} +.game-icon-wind-slap:before { + content: '\EAEB'; +} +.game-icon-wolf-trap:before { + content: '\EAEC'; +} +.game-icon-wrapped-heart:before { + content: '\EAED'; +} +.game-icon-spikeball:before { + content: '\EAEE'; +} +.game-icon-spikes-full:before { + content: '\EAEF'; +} +.game-icon-spikes-half:before { + content: '\EAF0'; +} +.game-icon-spikes-init:before { + content: '\EAF1'; +} +.game-icon-spikes:before { + content: '\EAF2'; +} +.game-icon-trigger-hurt:before { + content: '\EAF3'; +} +.game-icon-bat-mask:before { + content: '\EAF4'; +} +.game-icon-cadillac-helm:before { + content: '\EAF5'; +} +.game-icon-carnival-mask:before { + content: '\EAF6'; +} +.game-icon-ceremonial-mask:before { + content: '\EAF7'; +} +.game-icon-cyborg-face:before { + content: '\EAF8'; +} +.game-icon-jason-mask:before { + content: '\EAF9'; +} +.game-icon-king-ju-mask:before { + content: '\EAFA'; +} +.game-icon-luchador:before { + content: '\EAFB'; +} +.game-icon-mighty-boosh:before { + content: '\EAFC'; +} +.game-icon-pharoah:before { + content: '\EAFD'; +} +.game-icon-protection-glasses:before { + content: '\EAFE'; +} +.game-icon-soul-vessel:before { + content: '\EAFF'; +} +.game-icon-spider-mask:before { + content: '\EB00'; +} +.game-icon-vr-headset:before { + content: '\EB01'; +} +.game-icon-android-mask:before { + content: '\EB02'; +} +.game-icon-architect-mask:before { + content: '\EB03'; +} +.game-icon-curly-mask:before { + content: '\EB04'; +} +.game-icon-domino-mask:before { + content: '\EB05'; +} +.game-icon-duality-mask:before { + content: '\EB06'; +} +.game-icon-lightning-mask:before { + content: '\EB07'; +} +.game-icon-trap-mask:before { + content: '\EB08'; +} +.game-icon-cultist-2:before { + content: '\EB09'; +} +.game-icon-gas-mask-2:before { + content: '\EB0A'; +} +.game-icon-carambola:before { + content: '\EB0B'; +} +.game-icon-falling-star:before { + content: '\EB0C'; +} +.game-icon-flower-star:before { + content: '\EB0D'; +} +.game-icon-galaxy:before { + content: '\EB0E'; +} +.game-icon-knocked-out-stars:before { + content: '\EB0F'; +} +.game-icon-polar-star:before { + content: '\EB10'; +} +.game-icon-round-star:before { + content: '\EB11'; +} +.game-icon-seven-pointed-star:before { + content: '\EB12'; +} +.game-icon-solar-system:before { + content: '\EB13'; +} +.game-icon-solar-time:before { + content: '\EB14'; +} +.game-icon-sparkles:before { + content: '\EB15'; +} +.game-icon-star-altar:before { + content: '\EB16'; +} +.game-icon-star-formation:before { + content: '\EB17'; +} +.game-icon-star-key:before { + content: '\EB18'; +} +.game-icon-star-medal:before { + content: '\EB19'; +} +.game-icon-stars-stack:before { + content: '\EB1A'; +} +.game-icon-sun-cloud:before { + content: '\EB1B'; +} +.game-icon-sunflower:before { + content: '\EB1C'; +} +.game-icon-thermometer-hot:before { + content: '\EB1D'; +} +.game-icon-ursa-major:before { + content: '\EB1E'; +} +.game-icon-barbed-star:before { + content: '\EB1F'; +} +.game-icon-boomerang-sun:before { + content: '\EB20'; +} +.game-icon-circle-sparks:before { + content: '\EB21'; +} +.game-icon-cross-flare:before { + content: '\EB22'; +} +.game-icon-eclipse-flare:before { + content: '\EB23'; +} +.game-icon-flat-star:before { + content: '\EB24'; +} +.game-icon-flexible-star:before { + content: '\EB25'; +} +.game-icon-lotus-flower:before { + content: '\EB26'; +} +.game-icon-orbital-rays:before { + content: '\EB27'; +} +.game-icon-rainbow-star:before { + content: '\EB28'; +} +.game-icon-shiny-iris:before { + content: '\EB29'; +} +.game-icon-star-cycle:before { + content: '\EB2A'; +} +.game-icon-star-prominences:before { + content: '\EB2B'; +} +.game-icon-star-pupil:before { + content: '\EB2C'; +} +.game-icon-star-sattelites:before { + content: '\EB2D'; +} +.game-icon-star-swirl:before { + content: '\EB2E'; +} +.game-icon-sun-radiations:before { + content: '\EB2F'; +} +.game-icon-wrapping-star:before { + content: '\EB30'; +} +.game-icon-splash-2:before { + content: '\EB31'; +} +.game-icon-solar-power:before { + content: '\EB32'; +} +.game-icon-on-sight:before { + content: '\EB33'; +} +.game-icon-convergence-target:before { + content: '\EB34'; +} +.game-icon-crosshair:before { + content: '\EB35'; +} +.game-icon-dice-target:before { + content: '\EB36'; +} +.game-icon-eye-target:before { + content: '\EB37'; +} +.game-icon-human-target:before { + content: '\EB38'; +} +.game-icon-multiple-targets:before { + content: '\EB39'; +} +.game-icon-target-poster:before { + content: '\EB3A'; +} +.game-icon-triangle-target:before { + content: '\EB3B'; +} +.game-icon-head-shot:before { + content: '\EB3C'; +} +.game-icon-select:before { + content: '\EB3D'; +} +.game-icon-target-laser:before { + content: '\EB3E'; +} +.game-icon-targeted:before { + content: '\EB3F'; +} +.game-icon-agave:before { + content: '\EB40'; +} +.game-icon-cactus-pot:before { + content: '\EB41'; +} +.game-icon-cantua:before { + content: '\EB42'; +} +.game-icon-carrot:before { + content: '\EB43'; +} +.game-icon-coffee-beans:before { + content: '\EB44'; +} +.game-icon-corn:before { + content: '\EB45'; +} +.game-icon-cotton-flower:before { + content: '\EB46'; +} +.game-icon-dandelion-flower:before { + content: '\EB47'; +} +.game-icon-fern:before { + content: '\EB48'; +} +.game-icon-fertilizer-bag:before { + content: '\EB49'; +} +.game-icon-flax:before { + content: '\EB4A'; +} +.game-icon-garlic:before { + content: '\EB4B'; +} +.game-icon-ginkgo-leaf:before { + content: '\EB4C'; +} +.game-icon-grain-bundle:before { + content: '\EB4D'; +} +.game-icon-grain:before { + content: '\EB4E'; +} +.game-icon-green-power:before { + content: '\EB4F'; +} +.game-icon-hemp:before { + content: '\EB50'; +} +.game-icon-hops:before { + content: '\EB51'; +} +.game-icon-jasmine:before { + content: '\EB52'; +} +.game-icon-monstera-leaf:before { + content: '\EB53'; +} +.game-icon-papyrus:before { + content: '\EB54'; +} +.game-icon-plant-roots:before { + content: '\EB55'; +} +.game-icon-reed:before { + content: '\EB56'; +} +.game-icon-round-straw-bale:before { + content: '\EB57'; +} +.game-icon-seedling:before { + content: '\EB58'; +} +.game-icon-shamrock:before { + content: '\EB59'; +} +.game-icon-sugar-cane:before { + content: '\EB5A'; +} +.game-icon-tumbleweed:before { + content: '\EB5B'; +} +.game-icon-vines:before { + content: '\EB5C'; +} +.game-icon-aubergine:before { + content: '\EB5D'; +} +.game-icon-beanstalk:before { + content: '\EB5E'; +} +.game-icon-bud:before { + content: '\EB5F'; +} +.game-icon-bulb:before { + content: '\EB60'; +} +.game-icon-curling-vines:before { + content: '\EB61'; +} +.game-icon-daisy:before { + content: '\EB62'; +} +.game-icon-elderberry:before { + content: '\EB63'; +} +.game-icon-evil-bud:before { + content: '\EB64'; +} +.game-icon-flower-pot:before { + content: '\EB65'; +} +.game-icon-ground-sprout:before { + content: '\EB66'; +} +.game-icon-leaf-skeleton:before { + content: '\EB67'; +} +.game-icon-new-shoot:before { + content: '\EB68'; +} +.game-icon-oat:before { + content: '\EB69'; +} +.game-icon-pollen-dust:before { + content: '\EB6A'; +} +.game-icon-rose:before { + content: '\EB6B'; +} +.game-icon-shut-rose:before { + content: '\EB6C'; +} +.game-icon-spiral-bloom:before { + content: '\EB6D'; +} +.game-icon-spoted-flower:before { + content: '\EB6E'; +} +.game-icon-sprout-disc:before { + content: '\EB6F'; +} +.game-icon-sprout:before { + content: '\EB70'; +} +.game-icon-trefoil-lily:before { + content: '\EB71'; +} +.game-icon-twirly-flower:before { + content: '\EB72'; +} +.game-icon-vanilla-flower:before { + content: '\EB73'; +} +.game-icon-vine-flower:before { + content: '\EB74'; +} +.game-icon-vine-whip:before { + content: '\EB75'; +} +.game-icon-viola:before { + content: '\EB76'; +} +.game-icon-wheat:before { + content: '\EB77'; +} +.game-icon-poppy:before { + content: '\EB78'; +} +.game-icon-backpack:before { + content: '\EB79'; +} +.game-icon-beach-bag:before { + content: '\EB7A'; +} +.game-icon-briefcase:before { + content: '\EB7B'; +} +.game-icon-chips-bag:before { + content: '\EB7C'; +} +.game-icon-disc-golf-bag:before { + content: '\EB7D'; +} +.game-icon-duffel-bag:before { + content: '\EB7E'; +} +.game-icon-flour:before { + content: '\EB7F'; +} +.game-icon-gym-bag:before { + content: '\EB80'; +} +.game-icon-hand-bag:before { + content: '\EB81'; +} +.game-icon-light-backpack:before { + content: '\EB82'; +} +.game-icon-powder-bag:before { + content: '\EB83'; +} +.game-icon-school-bag:before { + content: '\EB84'; +} +.game-icon-shopping-bag:before { + content: '\EB85'; +} +.game-icon-suitcase:before { + content: '\EB86'; +} +.game-icon-knapsack:before { + content: '\EB87'; +} +.game-icon-shiny-purse:before { + content: '\EB88'; +} +.game-icon-swap-bag:before { + content: '\EB89'; +} +.game-icon-coins-pile:before { + content: '\EB8A'; +} +.game-icon-gold-nuggets:before { + content: '\EB8B'; +} +.game-icon-money-stack:before { + content: '\EB8C'; +} +.game-icon-piggy-bank:before { + content: '\EB8D'; +} +.game-icon-price-tag:before { + content: '\EB8E'; +} +.game-icon-swipe-card:before { + content: '\EB8F'; +} +.game-icon-ticket:before { + content: '\EB90'; +} +.game-icon-wallet:before { + content: '\EB91'; +} +.game-icon-knee-cap:before { + content: '\EB92'; +} +.game-icon-pelvis-bone:before { + content: '\EB93'; +} +.game-icon-backbone-shell:before { + content: '\EB94'; +} +.game-icon-crossed-bones:before { + content: '\EB95'; +} +.game-icon-horn-internal:before { + content: '\EB96'; +} +.game-icon-jawbone:before { + content: '\EB97'; +} +.game-icon-ribcage:before { + content: '\EB98'; +} +.game-icon-spinal-coil:before { + content: '\EB99'; +} +.game-icon-joint:before { + content: '\EB9A'; +} +.game-icon-swirled-shell:before { + content: '\EB9B'; +} +.game-icon-bolt-bomb:before { + content: '\EB9C'; +} +.game-icon-dynamite:before { + content: '\EB9D'; +} +.game-icon-falling-bomb:before { + content: '\EB9E'; +} +.game-icon-holy-hand-grenade:before { + content: '\EB9F'; +} +.game-icon-time-dynamite:before { + content: '\EBA0'; +} +.game-icon-cluster-bomb:before { + content: '\EBA1'; +} +.game-icon-fission:before { + content: '\EBA2'; +} +.game-icon-land-mine:before { + content: '\EBA3'; +} +.game-icon-letter-bomb:before { + content: '\EBA4'; +} +.game-icon-paper-bomb:before { + content: '\EBA5'; +} +.game-icon-rolling-bomb:before { + content: '\EBA6'; +} +.game-icon-sparky-bomb:before { + content: '\EBA7'; +} +.game-icon-squib:before { + content: '\EBA8'; +} +.game-icon-time-bomb:before { + content: '\EBA9'; +} +.game-icon-unlit-bomb:before { + content: '\EBAA'; +} +.game-icon-bundle-grenade:before { + content: '\EBAB'; +} +.game-icon-minefield:before { + content: '\EBAC'; +} +.game-icon-ballerina-shoes:before { + content: '\EBAD'; +} +.game-icon-banana-peel:before { + content: '\EBAE'; +} +.game-icon-chelsea-boot:before { + content: '\EBAF'; +} +.game-icon-converse-shoe:before { + content: '\EBB0'; +} +.game-icon-cowboy-boot:before { + content: '\EBB1'; +} +.game-icon-female-legs:before { + content: '\EBB2'; +} +.game-icon-flip-flops:before { + content: '\EBB3'; +} +.game-icon-hieroglyph-legs:before { + content: '\EBB4'; +} +.game-icon-high-heel:before { + content: '\EBB5'; +} +.game-icon-leg-armor:before { + content: '\EBB6'; +} +.game-icon-leg:before { + content: '\EBB7'; +} +.game-icon-roller-skate:before { + content: '\EBB8'; +} +.game-icon-rubber-boot:before { + content: '\EBB9'; +} +.game-icon-running-shoe:before { + content: '\EBBA'; +} +.game-icon-slippers:before { + content: '\EBBB'; +} +.game-icon-socks:before { + content: '\EBBC'; +} +.game-icon-sonic-shoes:before { + content: '\EBBD'; +} +.game-icon-sticky-boot:before { + content: '\EBBE'; +} +.game-icon-barefoot:before { + content: '\EBBF'; +} +.game-icon-boot-prints:before { + content: '\EBC0'; +} +.game-icon-boots:before { + content: '\EBC1'; +} +.game-icon-foot-trip:before { + content: '\EBC2'; +} +.game-icon-footprint:before { + content: '\EBC3'; +} +.game-icon-leather-boot:before { + content: '\EBC4'; +} +.game-icon-nailed-foot:before { + content: '\EBC5'; +} +.game-icon-quake-stomp:before { + content: '\EBC6'; +} +.game-icon-tread:before { + content: '\EBC7'; +} +.game-icon-tripwire:before { + content: '\EBC8'; +} +.game-icon-walking-boot:before { + content: '\EBC9'; +} +.game-icon-beet:before { + content: '\EBCA'; +} +.game-icon-super-mushroom:before { + content: '\EBCB'; +} +.game-icon-minerals:before { + content: '\EBCC'; +} +.game-icon-ore:before { + content: '\EBCD'; +} +.game-icon-crystal-shrine:before { + content: '\EBCE'; +} +.game-icon-diamond-trophy:before { + content: '\EBCF'; +} +.game-icon-mineral-pearls:before { + content: '\EBD0'; +} +.game-icon-checkered-diamond:before { + content: '\EBD1'; +} +.game-icon-crystal-bars:before { + content: '\EBD2'; +} +.game-icon-crystal-cluster:before { + content: '\EBD3'; +} +.game-icon-crystal-eye:before { + content: '\EBD4'; +} +.game-icon-crystal-shine:before { + content: '\EBD5'; +} +.game-icon-diamond-hard:before { + content: '\EBD6'; +} +.game-icon-floating-crystal:before { + content: '\EBD7'; +} +.game-icon-gems:before { + content: '\EBD8'; +} +.game-icon-mineral-heart:before { + content: '\EBD9'; +} +.game-icon-fossil:before { + content: '\EBDA'; +} +.game-icon-gold-shell:before { + content: '\EBDB'; +} +.game-icon-scallop:before { + content: '\EBDC'; +} +.game-icon-sewed-shell:before { + content: '\EBDD'; +} +.game-icon-spiral-shell:before { + content: '\EBDE'; +} +.game-icon-triple-shells:before { + content: '\EBDF'; +} +.game-icon-twin-shell:before { + content: '\EBE0'; +} +.game-icon-asteroid:before { + content: '\EBE1'; +} +.game-icon-colombian-statue:before { + content: '\EBE2'; +} +.game-icon-dig-hole:before { + content: '\EBE3'; +} +.game-icon-falling-rocks:before { + content: '\EBE4'; +} +.game-icon-stone-bridge:before { + content: '\EBE5'; +} +.game-icon-stone-pile:before { + content: '\EBE6'; +} +.game-icon-bridge:before { + content: '\EBE7'; +} +.game-icon-crags:before { + content: '\EBE8'; +} +.game-icon-meteor-impact:before { + content: '\EBE9'; +} +.game-icon-rune-stone:before { + content: '\EBEA'; +} +.game-icon-stone-block:before { + content: '\EBEB'; +} +.game-icon-stone-sphere:before { + content: '\EBEC'; +} +.game-icon-stone-throne:before { + content: '\EBED'; +} +.game-icon-bow-tie-ribbon:before { + content: '\EBEE'; +} +.game-icon-champagne-cork:before { + content: '\EBEF'; +} +.game-icon-champions:before { + content: '\EBF0'; +} +.game-icon-diploma:before { + content: '\EBF1'; +} +.game-icon-family-tree:before { + content: '\EBF2'; +} +.game-icon-finish-line:before { + content: '\EBF3'; +} +.game-icon-histogram:before { + content: '\EBF4'; +} +.game-icon-laurels-trophy:before { + content: '\EBF5'; +} +.game-icon-network-bars:before { + content: '\EBF6'; +} +.game-icon-organigram:before { + content: '\EBF7'; +} +.game-icon-podium-second:before { + content: '\EBF8'; +} +.game-icon-podium-third:before { + content: '\EBF9'; +} +.game-icon-podium-winner:before { + content: '\EBFA'; +} +.game-icon-podium:before { + content: '\EBFB'; +} +.game-icon-private-first-class:before { + content: '\EBFC'; +} +.game-icon-private:before { + content: '\EBFD'; +} +.game-icon-ribbon-medal:before { + content: '\EBFE'; +} +.game-icon-sergeant:before { + content: '\EBFF'; +} +.game-icon-sport-medal:before { + content: '\EC00'; +} +.game-icon-trophies-shelf:before { + content: '\EC01'; +} +.game-icon-trophy-cup:before { + content: '\EC02'; +} +.game-icon-level-four-advanced:before { + content: '\EC03'; +} +.game-icon-level-four:before { + content: '\EC04'; +} +.game-icon-level-three-advanced:before { + content: '\EC05'; +} +.game-icon-level-three:before { + content: '\EC06'; +} +.game-icon-level-two-advanced:before { + content: '\EC07'; +} +.game-icon-level-two:before { + content: '\EC08'; +} +.game-icon-achievement:before { + content: '\EC09'; +} +.game-icon-rank-1:before { + content: '\EC0A'; +} +.game-icon-rank-2:before { + content: '\EC0B'; +} +.game-icon-rank-3:before { + content: '\EC0C'; +} +.game-icon-3d-hammer:before { + content: '\EC0D'; +} +.game-icon-aspergillum:before { + content: '\EC0E'; +} +.game-icon-box-cutter:before { + content: '\EC0F'; +} +.game-icon-broom:before { + content: '\EC10'; +} +.game-icon-clamp:before { + content: '\EC11'; +} +.game-icon-crook-flail:before { + content: '\EC12'; +} +.game-icon-gardening-shears:before { + content: '\EC13'; +} +.game-icon-hair-strands:before { + content: '\EC14'; +} +.game-icon-hammer-break:before { + content: '\EC15'; +} +.game-icon-hole-ladder:before { + content: '\EC16'; +} +.game-icon-hook:before { + content: '\EC17'; +} +.game-icon-injustice:before { + content: '\EC18'; +} +.game-icon-ladders-platform:before { + content: '\EC19'; +} +.game-icon-large-paint-brush:before { + content: '\EC1A'; +} +.game-icon-lockpicks:before { + content: '\EC1B'; +} +.game-icon-paint-brush:before { + content: '\EC1C'; +} +.game-icon-paint-bucket:before { + content: '\EC1D'; +} +.game-icon-paint-roller:before { + content: '\EC1E'; +} +.game-icon-plow:before { + content: '\EC1F'; +} +.game-icon-plunger:before { + content: '\EC20'; +} +.game-icon-rake:before { + content: '\EC21'; +} +.game-icon-shears:before { + content: '\EC22'; +} +.game-icon-swiss-army-knife:before { + content: '\EC23'; +} +.game-icon-toy-mallet:before { + content: '\EC24'; +} +.game-icon-trowel:before { + content: '\EC25'; +} +.game-icon-weight:before { + content: '\EC26'; +} +.game-icon-claw-hammer:before { + content: '\EC27'; +} +.game-icon-dig-dug:before { + content: '\EC28'; +} +.game-icon-fishhook-fork:before { + content: '\EC29'; +} +.game-icon-flat-hammer:before { + content: '\EC2A'; +} +.game-icon-gavel:before { + content: '\EC2B'; +} +.game-icon-gear-hammer:before { + content: '\EC2C'; +} +.game-icon-hammer-drop:before { + content: '\EC2D'; +} +.game-icon-hammer-nails:before { + content: '\EC2E'; +} +.game-icon-lightning-spanner:before { + content: '\EC2F'; +} +.game-icon-scissors-2:before { + content: '\EC30'; +} +.game-icon-screwdriver:before { + content: '\EC31'; +} +.game-icon-sewing-needle:before { + content: '\EC32'; +} +.game-icon-spade:before { + content: '\EC33'; +} +.game-icon-spanner:before { + content: '\EC34'; +} +.game-icon-sword-smithing:before { + content: '\EC35'; +} +.game-icon-thermometer-scale:before { + content: '\EC36'; +} +.game-icon-tinker:before { + content: '\EC37'; +} +.game-icon-trample:before { + content: '\EC38'; +} +.game-icon-wrench:before { + content: '\EC39'; +} +.game-icon-pause-button:before { + content: '\EC3A'; +} +.game-icon-play-button:before { + content: '\EC3B'; +} +.game-icon-abacus:before { + content: '\EC3C'; +} +.game-icon-calendar:before { + content: '\EC3D'; +} +.game-icon-checklist:before { + content: '\EC3E'; +} +.game-icon-circle:before { + content: '\EC3F'; +} +.game-icon-clapperboard:before { + content: '\EC40'; +} +.game-icon-confirmed:before { + content: '\EC41'; +} +.game-icon-cube:before { + content: '\EC42'; +} +.game-icon-fast-backward-button:before { + content: '\EC43'; +} +.game-icon-fast-forward-button:before { + content: '\EC44'; +} +.game-icon-files:before { + content: '\EC45'; +} +.game-icon-film-projector:before { + content: '\EC46'; +} +.game-icon-full-folder:before { + content: '\EC47'; +} +.game-icon-funnel:before { + content: '\EC48'; +} +.game-icon-gamepad:before { + content: '\EC49'; +} +.game-icon-hamburger-menu:before { + content: '\EC4A'; +} +.game-icon-highlighter:before { + content: '\EC4B'; +} +.game-icon-joystick:before { + content: '\EC4C'; +} +.game-icon-keyboard:before { + content: '\EC4D'; +} +.game-icon-load:before { + content: '\EC4E'; +} +.game-icon-mailbox:before { + content: '\EC4F'; +} +.game-icon-mouse-2:before { + content: '\EC50'; +} +.game-icon-newspaper:before { + content: '\EC51'; +} +.game-icon-next-button:before { + content: '\EC52'; +} +.game-icon-open-folder:before { + content: '\EC53'; +} +.game-icon-palette:before { + content: '\EC54'; +} +.game-icon-pencil-brush:before { + content: '\EC55'; +} +.game-icon-pencil:before { + content: '\EC56'; +} +.game-icon-photo-camera:before { + content: '\EC57'; +} +.game-icon-pie-chart:before { + content: '\EC58'; +} +.game-icon-pin:before { + content: '\EC59'; +} +.game-icon-plain-circle:before { + content: '\EC5A'; +} +.game-icon-plain-square:before { + content: '\EC5B'; +} +.game-icon-previous-button:before { + content: '\EC5C'; +} +.game-icon-resize:before { + content: '\EC5D'; +} +.game-icon-save:before { + content: '\EC5E'; +} +.game-icon-share:before { + content: '\EC5F'; +} +.game-icon-shopping-cart:before { + content: '\EC60'; +} +.game-icon-square:before { + content: '\EC61'; +} +.game-icon-toggles:before { + content: '\EC62'; +} +.game-icon-trash-can:before { + content: '\EC63'; +} +.game-icon-unbalanced:before { + content: '\EC64'; +} +.game-icon-vibrating-smartphone:before { + content: '\EC65'; +} +.game-icon-video-camera:before { + content: '\EC66'; +} +.game-icon-bookmark:before { + content: '\EC67'; +} +.game-icon-envelope:before { + content: '\EC68'; +} +.game-icon-open-book:before { + content: '\EC69'; +} +.game-icon-retro-controller:before { + content: '\EC6A'; +} +.game-icon-smartphone:before { + content: '\EC6B'; +} +.game-icon-tablet:before { + content: '\EC6C'; +} +.game-icon-soda-can:before { + content: '\EC6D'; +} +.game-icon-baby-bottle:before { + content: '\EC6E'; +} +.game-icon-beer-bottle:before { + content: '\EC6F'; +} +.game-icon-delicate-perfume:before { + content: '\EC70'; +} +.game-icon-ketchup:before { + content: '\EC71'; +} +.game-icon-water-flask:before { + content: '\EC72'; +} +.game-icon-wine-bottle:before { + content: '\EC73'; +} +.game-icon-bottled-bolt:before { + content: '\EC74'; +} +.game-icon-brandy-bottle:before { + content: '\EC75'; +} +.game-icon-bubbling-flask:before { + content: '\EC76'; +} +.game-icon-perfume-bottle:before { + content: '\EC77'; +} +.game-icon-potion-ball:before { + content: '\EC78'; +} +.game-icon-round-bottom-flask:before { + content: '\EC79'; +} +.game-icon-spiral-bottle:before { + content: '\EC7A'; +} +.game-icon-square-bottle:before { + content: '\EC7B'; +} +.game-icon-standing-potion:before { + content: '\EC7C'; +} +.game-icon-potion-of-madness:before { + content: '\EC7D'; +} +.game-icon-almond:before { + content: '\EC7E'; +} +.game-icon-asparagus:before { + content: '\EC7F'; +} +.game-icon-avocado:before { + content: '\EC80'; +} +.game-icon-banana:before { + content: '\EC81'; +} +.game-icon-bread-slice:before { + content: '\EC82'; +} +.game-icon-bread:before { + content: '\EC83'; +} +.game-icon-candy-canes:before { + content: '\EC84'; +} +.game-icon-cherry:before { + content: '\EC85'; +} +.game-icon-chili-pepper:before { + content: '\EC86'; +} +.game-icon-cookie:before { + content: '\EC87'; +} +.game-icon-croissant:before { + content: '\EC88'; +} +.game-icon-cupcake:before { + content: '\EC89'; +} +.game-icon-dango:before { + content: '\EC8A'; +} +.game-icon-doner-kebab:before { + content: '\EC8B'; +} +.game-icon-fast-noodles:before { + content: '\EC8C'; +} +.game-icon-french-fries:before { + content: '\EC8D'; +} +.game-icon-full-pizza:before { + content: '\EC8E'; +} +.game-icon-gingerbread-man:before { + content: '\EC8F'; +} +.game-icon-hamburger:before { + content: '\EC90'; +} +.game-icon-hot-meal:before { + content: '\EC91'; +} +.game-icon-jelly-beans:before { + content: '\EC92'; +} +.game-icon-jelly:before { + content: '\EC93'; +} +.game-icon-kiwi-fruit:before { + content: '\EC94'; +} +.game-icon-mushrooms:before { + content: '\EC95'; +} +.game-icon-nachos:before { + content: '\EC96'; +} +.game-icon-noodles:before { + content: '\EC97'; +} +.game-icon-oden:before { + content: '\EC98'; +} +.game-icon-pear:before { + content: '\EC99'; +} +.game-icon-pimiento:before { + content: '\EC9A'; +} +.game-icon-pizza-slice:before { + content: '\EC9B'; +} +.game-icon-popcorn:before { + content: '\EC9C'; +} +.game-icon-potato:before { + content: '\EC9D'; +} +.game-icon-pretzel:before { + content: '\EC9E'; +} +.game-icon-raw-egg:before { + content: '\EC9F'; +} +.game-icon-sandwich:before { + content: '\ECA0'; +} +.game-icon-sesame:before { + content: '\ECA1'; +} +.game-icon-sliced-mushroom:before { + content: '\ECA2'; +} +.game-icon-spiral-lollipop:before { + content: '\ECA3'; +} +.game-icon-stairs-cake:before { + content: '\ECA4'; +} +.game-icon-stomach:before { + content: '\ECA5'; +} +.game-icon-tacos:before { + content: '\ECA6'; +} +.game-icon-tangerine:before { + content: '\ECA7'; +} +.game-icon-tomato:before { + content: '\ECA8'; +} +.game-icon-cake-slice:before { + content: '\ECA9'; +} +.game-icon-cheese-wedge:before { + content: '\ECAA'; +} +.game-icon-cool-spices:before { + content: '\ECAB'; +} +.game-icon-honeypot:before { + content: '\ECAC'; +} +.game-icon-meat-hook:before { + content: '\ECAD'; +} +.game-icon-mushroom-gills:before { + content: '\ECAE'; +} +.game-icon-mushroom:before { + content: '\ECAF'; +} +.game-icon-pie-slice:before { + content: '\ECB0'; +} +.game-icon-powder:before { + content: '\ECB1'; +} +.game-icon-salt-shaker:before { + content: '\ECB2'; +} +.game-icon-shiny-apple:before { + content: '\ECB3'; +} +.game-icon-sliced-bread:before { + content: '\ECB4'; +} +.game-icon-wrapped-sweet:before { + content: '\ECB5'; +} +.game-icon-chocolate-bar:before { + content: '\ECB6'; +} +.game-icon-peanut:before { + content: '\ECB7'; +} +.game-icon-armored-pants:before { + content: '\ECB8'; +} +.game-icon-american-football-player:before { + content: '\ECB9'; +} +.game-icon-bracer:before { + content: '\ECBA'; +} +.game-icon-cape-armor:before { + content: '\ECBB'; +} +.game-icon-chest-armor:before { + content: '\ECBC'; +} +.game-icon-elbow-pad:before { + content: '\ECBD'; +} +.game-icon-heart-armor:before { + content: '\ECBE'; +} +.game-icon-knee-pad:before { + content: '\ECBF'; +} +.game-icon-leather-armor:before { + content: '\ECC0'; +} +.game-icon-loincloth:before { + content: '\ECC1'; +} +.game-icon-metal-skirt:before { + content: '\ECC2'; +} +.game-icon-morph-ball:before { + content: '\ECC3'; +} +.game-icon-saiyan-suit:before { + content: '\ECC4'; +} +.game-icon-armor-vest:before { + content: '\ECC5'; +} +.game-icon-breastplate:before { + content: '\ECC6'; +} +.game-icon-dorsal-scales:before { + content: '\ECC7'; +} +.game-icon-lamellar:before { + content: '\ECC8'; +} +.game-icon-leather-vest:before { + content: '\ECC9'; +} +.game-icon-mail-shirt:before { + content: '\ECCA'; +} +.game-icon-plastron:before { + content: '\ECCB'; +} +.game-icon-scale-mail:before { + content: '\ECCC'; +} +.game-icon-shoulder-scales:before { + content: '\ECCD'; +} +.game-icon-space-suit:before { + content: '\ECCE'; +} +.game-icon-bracers:before { + content: '\ECCF'; +} +.game-icon-chain-mail:before { + content: '\ECD0'; +} +.game-icon-ample-dress:before { + content: '\ECD1'; +} +.game-icon-basketball-jersey:before { + content: '\ECD2'; +} +.game-icon-bow-tie:before { + content: '\ECD3'; +} +.game-icon-cape:before { + content: '\ECD4'; +} +.game-icon-clothes:before { + content: '\ECD5'; +} +.game-icon-clothespin:before { + content: '\ECD6'; +} +.game-icon-hanger:before { + content: '\ECD7'; +} +.game-icon-heavy-collar:before { + content: '\ECD8'; +} +.game-icon-hoodie:before { + content: '\ECD9'; +} +.game-icon-lab-coat:before { + content: '\ECDA'; +} +.game-icon-large-dress:before { + content: '\ECDB'; +} +.game-icon-moncler-jacket:before { + content: '\ECDC'; +} +.game-icon-pirate-coat:before { + content: '\ECDD'; +} +.game-icon-polo-shirt:before { + content: '\ECDE'; +} +.game-icon-poncho:before { + content: '\ECDF'; +} +.game-icon-rolled-cloth:before { + content: '\ECE0'; +} +.game-icon-sewing-string:before { + content: '\ECE1'; +} +.game-icon-shirt-button:before { + content: '\ECE2'; +} +.game-icon-shorts:before { + content: '\ECE3'; +} +.game-icon-skirt:before { + content: '\ECE4'; +} +.game-icon-sleeveless-jacket:before { + content: '\ECE5'; +} +.game-icon-sleeveless-top:before { + content: '\ECE6'; +} +.game-icon-t-shirt:before { + content: '\ECE7'; +} +.game-icon-tank-top:before { + content: '\ECE8'; +} +.game-icon-tie:before { + content: '\ECE9'; +} +.game-icon-travel-dress:before { + content: '\ECEA'; +} +.game-icon-underwear-shorts:before { + content: '\ECEB'; +} +.game-icon-underwear:before { + content: '\ECEC'; +} +.game-icon-washing-machine:before { + content: '\ECED'; +} +.game-icon-belt:before { + content: '\ECEE'; +} +.game-icon-cloak:before { + content: '\ECEF'; +} +.game-icon-shirt:before { + content: '\ECF0'; +} +.game-icon-trousers:before { + content: '\ECF1'; +} +.game-icon-belt-buckles:before { + content: '\ECF2'; +} +.game-icon-trousers-2:before { + content: '\ECF3'; +} +.game-icon-dress:before { + content: '\ECF4'; +} +.game-icon-bullet-impacts:before { + content: '\ECF5'; +} +.game-icon-cowboy-holster:before { + content: '\ECF6'; +} +.game-icon-gun-stock:before { + content: '\ECF7'; +} +.game-icon-machine-gun-magazine:before { + content: '\ECF8'; +} +.game-icon-pirate-cannon:before { + content: '\ECF9'; +} +.game-icon-shotgun-rounds:before { + content: '\ECFA'; +} +.game-icon-ak47:before { + content: '\ECFB'; +} +.game-icon-ak47u:before { + content: '\ECFC'; +} +.game-icon-colt-m1911:before { + content: '\ECFD'; +} +.game-icon-cz-skorpion:before { + content: '\ECFE'; +} +.game-icon-desert-eagle:before { + content: '\ECFF'; +} +.game-icon-fn-fal:before { + content: '\ED00'; +} +.game-icon-m3-grease-gun:before { + content: '\ED01'; +} +.game-icon-mac-10:before { + content: '\ED02'; +} +.game-icon-machine-gun:before { + content: '\ED03'; +} +.game-icon-mp5-2:before { + content: '\ED04'; +} +.game-icon-mp5k:before { + content: '\ED05'; +} +.game-icon-musket:before { + content: '\ED06'; +} +.game-icon-p90:before { + content: '\ED07'; +} +.game-icon-revolver-2:before { + content: '\ED08'; +} +.game-icon-spectre-m4:before { + content: '\ED09'; +} +.game-icon-thompson-m1928:before { + content: '\ED0A'; +} +.game-icon-winchester-rifle:before { + content: '\ED0B'; +} +.game-icon-3d-glasses:before { + content: '\ED0C'; +} +.game-icon-director-chair:before { + content: '\ED0D'; +} +.game-icon-inauguration:before { + content: '\ED0E'; +} +.game-icon-red-carpet:before { + content: '\ED0F'; +} +.game-icon-theater:before { + content: '\ED10'; +} +.game-icon-cyber-eye:before { + content: '\ED11'; +} +.game-icon-egg-eye:before { + content: '\ED12'; +} +.game-icon-eyelashes:before { + content: '\ED13'; +} +.game-icon-hunter-eyes:before { + content: '\ED14'; +} +.game-icon-lock-spy:before { + content: '\ED15'; +} +.game-icon-tired-eye:before { + content: '\ED16'; +} +.game-icon-bolt-eye:before { + content: '\ED17'; +} +.game-icon-brass-eye:before { + content: '\ED18'; +} +.game-icon-croissants-pupil:before { + content: '\ED19'; +} +.game-icon-eyeball:before { + content: '\ED1A'; +} +.game-icon-falling-eye:before { + content: '\ED1B'; +} +.game-icon-lightning-tear:before { + content: '\ED1C'; +} +.game-icon-octogonal-eye:before { + content: '\ED1D'; +} +.game-icon-semi-closed-eye:before { + content: '\ED1E'; +} +.game-icon-sheikah-eye:before { + content: '\ED1F'; +} +.game-icon-six-eyes:before { + content: '\ED20'; +} +.game-icon-sunken-eye:before { + content: '\ED21'; +} +.game-icon-surrounded-eye:before { + content: '\ED22'; +} +.game-icon-templar-eye:before { + content: '\ED23'; +} +.game-icon-third-eye:before { + content: '\ED24'; +} +.game-icon-evil-eyes:before { + content: '\ED25'; +} +.game-icon-sight-disabled:before { + content: '\ED26'; +} +.game-icon-glass-ball:before { + content: '\ED27'; +} +.game-icon-lightning-dome:before { + content: '\ED28'; +} +.game-icon-corked-tube:before { + content: '\ED29'; +} +.game-icon-crystal-ball:before { + content: '\ED2A'; +} +.game-icon-dragon-balls:before { + content: '\ED2B'; +} +.game-icon-empty-hourglass:before { + content: '\ED2C'; +} +.game-icon-glass-heart:before { + content: '\ED2D'; +} +.game-icon-test-tubes:before { + content: '\ED2E'; +} +.game-icon-babyfoot-players:before { + content: '\ED2F'; +} +.game-icon-balloon-dog:before { + content: '\ED30'; +} +.game-icon-beach-ball:before { + content: '\ED31'; +} +.game-icon-game-console:before { + content: '\ED32'; +} +.game-icon-kite:before { + content: '\ED33'; +} +.game-icon-marbles:before { + content: '\ED34'; +} +.game-icon-paper-plane:before { + content: '\ED35'; +} +.game-icon-paper-windmill:before { + content: '\ED36'; +} +.game-icon-pendulum-swing:before { + content: '\ED37'; +} +.game-icon-pinball-flipper:before { + content: '\ED38'; +} +.game-icon-ping-pong-bat:before { + content: '\ED39'; +} +.game-icon-puzzle:before { + content: '\ED3A'; +} +.game-icon-skipping-rope:before { + content: '\ED3B'; +} +.game-icon-soccer-ball:before { + content: '\ED3C'; +} +.game-icon-balloons:before { + content: '\ED3D'; +} +.game-icon-jigsaw-piece:before { + content: '\ED3E'; +} +.game-icon-voodoo-doll:before { + content: '\ED3F'; +} +.game-icon-console-controller:before { + content: '\ED40'; +} +.game-icon-spinning-top:before { + content: '\ED41'; +} +.game-icon-bar-stool:before { + content: '\ED42'; +} +.game-icon-bathtub:before { + content: '\ED43'; +} +.game-icon-bed:before { + content: '\ED44'; +} +.game-icon-bookshelf:before { + content: '\ED45'; +} +.game-icon-bunk-beds:before { + content: '\ED46'; +} +.game-icon-cuckoo-clock:before { + content: '\ED47'; +} +.game-icon-desk:before { + content: '\ED48'; +} +.game-icon-door-handle:before { + content: '\ED49'; +} +.game-icon-door:before { + content: '\ED4A'; +} +.game-icon-electrical-socket:before { + content: '\ED4B'; +} +.game-icon-laptop:before { + content: '\ED4C'; +} +.game-icon-lipstick:before { + content: '\ED4D'; +} +.game-icon-lockers:before { + content: '\ED4E'; +} +.game-icon-magic-broom:before { + content: '\ED4F'; +} +.game-icon-office-chair:before { + content: '\ED50'; +} +.game-icon-paper-clip:before { + content: '\ED51'; +} +.game-icon-party-popper:before { + content: '\ED52'; +} +.game-icon-person-in-bed:before { + content: '\ED53'; +} +.game-icon-pillow:before { + content: '\ED54'; +} +.game-icon-rocking-chair:before { + content: '\ED55'; +} +.game-icon-soap:before { + content: '\ED56'; +} +.game-icon-sofa:before { + content: '\ED57'; +} +.game-icon-towel:before { + content: '\ED58'; +} +.game-icon-weight-scale:before { + content: '\ED59'; +} +.game-icon-wifi-router:before { + content: '\ED5A'; +} +.game-icon-wooden-chair:before { + content: '\ED5B'; +} +.game-icon-fountain-pen:before { + content: '\ED5C'; +} +.game-icon-papers:before { + content: '\ED5D'; +} +.game-icon-quill-ink:before { + content: '\ED5E'; +} +.game-icon-tied-scroll:before { + content: '\ED5F'; +} +.game-icon-calculator:before { + content: '\ED60'; +} +.game-icon-cctv-camera:before { + content: '\ED61'; +} +.game-icon-charging:before { + content: '\ED62'; +} +.game-icon-cpu:before { + content: '\ED63'; +} +.game-icon-electrical-resistance:before { + content: '\ED64'; +} +.game-icon-server-rack:before { + content: '\ED65'; +} +.game-icon-smartphone-2:before { + content: '\ED66'; +} +.game-icon-tv-remote:before { + content: '\ED67'; +} +.game-icon-usb-key:before { + content: '\ED68'; +} +.game-icon-watch:before { + content: '\ED69'; +} +.game-icon-batteries:before { + content: '\ED6A'; +} +.game-icon-cpu-shot:before { + content: '\ED6B'; +} +.game-icon-disc:before { + content: '\ED6C'; +} +.game-icon-lightning-arc:before { + content: '\ED6D'; +} +.game-icon-ram-2:before { + content: '\ED6E'; +} +.game-icon-pc:before { + content: '\ED6F'; +} +.game-icon-fog:before { + content: '\ED70'; +} +.game-icon-windsock:before { + content: '\ED71'; +} +.game-icon-cloud-ring:before { + content: '\ED72'; +} +.game-icon-dust-cloud:before { + content: '\ED73'; +} +.game-icon-flower-twirl:before { + content: '\ED74'; +} +.game-icon-fluffy-cloud:before { + content: '\ED75'; +} +.game-icon-half-tornado:before { + content: '\ED76'; +} +.game-icon-lightning-storm:before { + content: '\ED77'; +} +.game-icon-lightning-tree:before { + content: '\ED78'; +} +.game-icon-moon:before { + content: '\ED79'; +} +.game-icon-night-sky:before { + content: '\ED7A'; +} +.game-icon-parachute:before { + content: '\ED7B'; +} +.game-icon-raining:before { + content: '\ED7C'; +} +.game-icon-static:before { + content: '\ED7D'; +} +.game-icon-stomp-tornado:before { + content: '\ED7E'; +} +.game-icon-tornado:before { + content: '\ED7F'; +} +.game-icon-twirl-center:before { + content: '\ED80'; +} +.game-icon-twister:before { + content: '\ED81'; +} +.game-icon-whirlwind:before { + content: '\ED82'; +} +.game-icon-battle-mech:before { + content: '\ED83'; +} +.game-icon-factory-arm:before { + content: '\ED84'; +} +.game-icon-mono-wheel-robot:before { + content: '\ED85'; +} +.game-icon-nano-bot:before { + content: '\ED86'; +} +.game-icon-robot-grab:before { + content: '\ED87'; +} +.game-icon-robot-leg:before { + content: '\ED88'; +} +.game-icon-spider-bot:before { + content: '\ED89'; +} +.game-icon-megabot:before { + content: '\ED8A'; +} +.game-icon-techno-heart:before { + content: '\ED8B'; +} +.game-icon-vintage-robot:before { + content: '\ED8C'; +} +.game-icon-bus-doors:before { + content: '\ED8D'; +} +.game-icon-door-ring-handle:before { + content: '\ED8E'; +} +.game-icon-door-watcher:before { + content: '\ED8F'; +} +.game-icon-heaven-gate:before { + content: '\ED90'; +} +.game-icon-hobbit-door:before { + content: '\ED91'; +} +.game-icon-india-gate:before { + content: '\ED92'; +} +.game-icon-locked-door:before { + content: '\ED93'; +} +.game-icon-open-gate:before { + content: '\ED94'; +} +.game-icon-ranch-gate:before { + content: '\ED95'; +} +.game-icon-temple-door:before { + content: '\ED96'; +} +.game-icon-turnstile:before { + content: '\ED97'; +} +.game-icon-doorway:before { + content: '\ED98'; +} +.game-icon-boss-key:before { + content: '\ED99'; +} +.game-icon-dial-padlock:before { + content: '\ED9A'; +} +.game-icon-heart-key:before { + content: '\ED9B'; +} +.game-icon-house-keys:before { + content: '\ED9C'; +} +.game-icon-key-card:before { + content: '\ED9D'; +} +.game-icon-key-lock:before { + content: '\ED9E'; +} +.game-icon-keyring:before { + content: '\ED9F'; +} +.game-icon-locked-heart:before { + content: '\EDA0'; +} +.game-icon-millenium-key:before { + content: '\EDA1'; +} +.game-icon-padlock-open:before { + content: '\EDA2'; +} +.game-icon-secret-book:before { + content: '\EDA3'; +} +.game-icon-key:before { + content: '\EDA4'; +} +.game-icon-padlock:before { + content: '\EDA5'; +} +.game-icon-three-keys:before { + content: '\EDA6'; +} +.game-icon-triple-lock:before { + content: '\EDA7'; +} +.game-icon-unlocking:before { + content: '\EDA8'; +} +.game-icon-wax-seal:before { + content: '\EDA9'; +} +.game-icon-key-2:before { + content: '\EDAA'; +} +.game-icon-combination-lock:before { + content: '\EDAB'; +} +.game-icon-defense-satellite:before { + content: '\EDAC'; +} +.game-icon-light-sabers:before { + content: '\EDAD'; +} +.game-icon-double-ringed-orb:before { + content: '\EDAE'; +} +.game-icon-energise:before { + content: '\EDAF'; +} +.game-icon-ringed-planet:before { + content: '\EDB0'; +} +.game-icon-sinusoidal-beam:before { + content: '\EDB1'; +} +.game-icon-bandaged:before { + content: '\EDB2'; +} +.game-icon-duration:before { + content: '\EDB3'; +} +.game-icon-extra-time:before { + content: '\EDB4'; +} +.game-icon-time-synchronization:before { + content: '\EDB5'; +} +.game-icon-heavy-timer:before { + content: '\EDB6'; +} +.game-icon-time-trap:before { + content: '\EDB7'; +} +.game-icon-stopwatch-2:before { + content: '\EDB8'; +} +.game-icon-dragon-orb:before { + content: '\EDB9'; +} +.game-icon-barbed-nails:before { + content: '\EDBA'; +} +.game-icon-claw-string:before { + content: '\EDBB'; +} +.game-icon-interleaved-claws:before { + content: '\EDBC'; +} +.game-icon-midnight-claw:before { + content: '\EDBD'; +} +.game-icon-plate-claw:before { + content: '\EDBE'; +} +.game-icon-saw-claw:before { + content: '\EDBF'; +} +.game-icon-shining-claw:before { + content: '\EDC0'; +} +.game-icon-triple-scratches:before { + content: '\EDC1'; +} +.game-icon-distress-signal:before { + content: '\EDC2'; +} +.game-icon-exploding-planet:before { + content: '\EDC3'; +} +.game-icon-jupiter:before { + content: '\EDC4'; +} +.game-icon-moon-orbit:before { + content: '\EDC5'; +} +.game-icon-planet-core:before { + content: '\EDC6'; +} +.game-icon-black-hole-bolas:before { + content: '\EDC7'; +} +.game-icon-hypersonic-bolt:before { + content: '\EDC8'; +} +.game-icon-nested-eclipses:before { + content: '\EDC9'; +} +.game-icon-vortex:before { + content: '\EDCA'; +} +.game-icon-koholint-egg:before { + content: '\EDCB'; +} +.game-icon-egg-defense:before { + content: '\EDCC'; +} +.game-icon-tentacles-barrier:before { + content: '\EDCD'; +} +.game-icon-curled-tentacle:before { + content: '\EDCE'; +} +.game-icon-interlaced-tentacles:before { + content: '\EDCF'; +} +.game-icon-noodle-ball:before { + content: '\EDD0'; +} +.game-icon-spiral-tentacle:before { + content: '\EDD1'; +} +.game-icon-suckered-tentacle:before { + content: '\EDD2'; +} +.game-icon-tentacle-heart:before { + content: '\EDD3'; +} +.game-icon-tentacle-strike:before { + content: '\EDD4'; +} +.game-icon-tentacurl:before { + content: '\EDD5'; +} +.game-icon-thorny-tentacle:before { + content: '\EDD6'; +} +.game-icon-thorny-vine:before { + content: '\EDD7'; +} +.game-icon-apple-core:before { + content: '\EDD8'; +} +.game-icon-banana-bunch:before { + content: '\EDD9'; +} +.game-icon-banana-peeled:before { + content: '\EDDA'; +} +.game-icon-broccoli:before { + content: '\EDDB'; +} +.game-icon-coconuts:before { + content: '\EDDC'; +} +.game-icon-cut-lemon:before { + content: '\EDDD'; +} +.game-icon-leek:before { + content: '\EDDE'; +} +.game-icon-lemon:before { + content: '\EDDF'; +} +.game-icon-orange-slice:before { + content: '\EDE0'; +} +.game-icon-orange:before { + content: '\EDE1'; +} +.game-icon-peach:before { + content: '\EDE2'; +} +.game-icon-peas:before { + content: '\EDE3'; +} +.game-icon-pineapple:before { + content: '\EDE4'; +} +.game-icon-pumpkin:before { + content: '\EDE5'; +} +.game-icon-raddish:before { + content: '\EDE6'; +} +.game-icon-raspberry:before { + content: '\EDE7'; +} +.game-icon-strawberry:before { + content: '\EDE8'; +} +.game-icon-watermelon:before { + content: '\EDE9'; +} +.game-icon-apple-seeds:before { + content: '\EDEA'; +} +.game-icon-blackcurrant:before { + content: '\EDEB'; +} +.game-icon-gift-trap:before { + content: '\EDEC'; +} +.game-icon-american-football-ball:before { + content: '\EDED'; +} +.game-icon-cricket-bat:before { + content: '\EDEE'; +} +.game-icon-footy-field:before { + content: '\EDEF'; +} +.game-icon-bowie-knife:before { + content: '\EDF0'; +} +.game-icon-ball-pyramid:before { + content: '\EDF1'; +} +.game-icon-basketball-ball:before { + content: '\EDF2'; +} +.game-icon-boulder-dash:before { + content: '\EDF3'; +} +.game-icon-bowling-strike:before { + content: '\EDF4'; +} +.game-icon-eight-ball:before { + content: '\EDF5'; +} +.game-icon-golf-tee:before { + content: '\EDF6'; +} +.game-icon-snitch-quidditch-ball:before { + content: '\EDF7'; +} +.game-icon-soccer-kick:before { + content: '\EDF8'; +} +.game-icon-tennis-ball:before { + content: '\EDF9'; +} +.game-icon-volleyball-ball:before { + content: '\EDFA'; +} +.game-icon-water-polo:before { + content: '\EDFB'; +} +.game-icon-ball-glow:before { + content: '\EDFC'; +} +.game-icon-ball-heart:before { + content: '\EDFD'; +} +.game-icon-blackball:before { + content: '\EDFE'; +} +.game-icon-bowling-propulsion:before { + content: '\EDFF'; +} +.game-icon-caged-ball:before { + content: '\EE00'; +} +.game-icon-circle-cage:before { + content: '\EE01'; +} +.game-icon-concentration-orb:before { + content: '\EE02'; +} +.game-icon-crumbling-ball:before { + content: '\EE03'; +} +.game-icon-double-diaphragm:before { + content: '\EE04'; +} +.game-icon-extraction-orb:before { + content: '\EE05'; +} +.game-icon-falling-blob:before { + content: '\EE06'; +} +.game-icon-mesh-ball:before { + content: '\EE07'; +} +.game-icon-striking-balls:before { + content: '\EE08'; +} +.game-icon-unstable-orb:before { + content: '\EE09'; +} +.game-icon-basketball-basket:before { + content: '\EE0A'; +} +.game-icon-biceps:before { + content: '\EE0B'; +} +.game-icon-bowling-alley:before { + content: '\EE0C'; +} +.game-icon-bowling-pin:before { + content: '\EE0D'; +} +.game-icon-disc-golf-basket:before { + content: '\EE0E'; +} +.game-icon-fencer:before { + content: '\EE0F'; +} +.game-icon-frisbee:before { + content: '\EE10'; +} +.game-icon-juggling-clubs:before { + content: '\EE11'; +} +.game-icon-muscular-torso:before { + content: '\EE12'; +} +.game-icon-pool-dive:before { + content: '\EE13'; +} +.game-icon-punching-bag:before { + content: '\EE14'; +} +.game-icon-rugby-conversion:before { + content: '\EE15'; +} +.game-icon-shuttlecock:before { + content: '\EE16'; +} +.game-icon-skier:before { + content: '\EE17'; +} +.game-icon-skis:before { + content: '\EE18'; +} +.game-icon-soccer-field:before { + content: '\EE19'; +} +.game-icon-tennis-court:before { + content: '\EE1A'; +} +.game-icon-tennis-racket:before { + content: '\EE1B'; +} +.game-icon-sword-altar:before { + content: '\EE1C'; +} +.game-icon-broadsword:before { + content: '\EE1D'; +} +.game-icon-half-heart:before { + content: '\EE1E'; +} +.game-icon-ancient-sword:before { + content: '\EE1F'; +} +.game-icon-axe-sword:before { + content: '\EE20'; +} +.game-icon-bat-leth:before { + content: '\EE21'; +} +.game-icon-butterfly-knife:before { + content: '\EE22'; +} +.game-icon-chakram:before { + content: '\EE23'; +} +.game-icon-coiled-nail:before { + content: '\EE24'; +} +.game-icon-glaive:before { + content: '\EE25'; +} +.game-icon-rusty-sword:before { + content: '\EE26'; +} +.game-icon-scabbard:before { + content: '\EE27'; +} +.game-icon-spiral-hilt:before { + content: '\EE28'; +} +.game-icon-stabbed-note:before { + content: '\EE29'; +} +.game-icon-swords-power:before { + content: '\EE2A'; +} +.game-icon-two-handed-sword:before { + content: '\EE2B'; +} +.game-icon-blade-drag:before { + content: '\EE2C'; +} +.game-icon-blade-fall:before { + content: '\EE2D'; +} +.game-icon-bloody-sword:before { + content: '\EE2E'; +} +.game-icon-bouncing-sword:before { + content: '\EE2F'; +} +.game-icon-broad-dagger:before { + content: '\EE30'; +} +.game-icon-cloak-dagger:before { + content: '\EE31'; +} +.game-icon-crescent-blade:before { + content: '\EE32'; +} +.game-icon-croc-sword:before { + content: '\EE33'; +} +.game-icon-curvy-knife:before { + content: '\EE34'; +} +.game-icon-daggers:before { + content: '\EE35'; +} +.game-icon-dervish-swords:before { + content: '\EE36'; +} +.game-icon-diving-dagger:before { + content: '\EE37'; +} +.game-icon-energy-sword:before { + content: '\EE38'; +} +.game-icon-flying-dagger:before { + content: '\EE39'; +} +.game-icon-fragmented-sword:before { + content: '\EE3A'; +} +.game-icon-knife-thrust:before { + content: '\EE3B'; +} +.game-icon-lightning-saber:before { + content: '\EE3C'; +} +.game-icon-plain-dagger:before { + content: '\EE3D'; +} +.game-icon-pointy-sword:before { + content: '\EE3E'; +} +.game-icon-relic-blade:before { + content: '\EE3F'; +} +.game-icon-shard-sword:before { + content: '\EE40'; +} +.game-icon-shining-sword:before { + content: '\EE41'; +} +.game-icon-spinning-blades:before { + content: '\EE42'; +} +.game-icon-spinning-sword:before { + content: '\EE43'; +} +.game-icon-spiral-thrust:before { + content: '\EE44'; +} +.game-icon-striped-sword:before { + content: '\EE45'; +} +.game-icon-sword-array:before { + content: '\EE46'; +} +.game-icon-sword-hilt:before { + content: '\EE47'; +} +.game-icon-sword-spin:before { + content: '\EE48'; +} +.game-icon-sword-wound:before { + content: '\EE49'; +} +.game-icon-thrown-knife:before { + content: '\EE4A'; +} +.game-icon-thunder-blade:before { + content: '\EE4B'; +} +.game-icon-zeus-sword:before { + content: '\EE4C'; +} +.game-icon-bowie-knife-2:before { + content: '\EE4D'; +} +.game-icon-butterfly-knife-2:before { + content: '\EE4E'; +} +.game-icon-crescent-blade-2:before { + content: '\EE4F'; +} +.game-icon-stiletto-2:before { + content: '\EE50'; +} +.game-icon-antibody:before { + content: '\EE51'; +} +.game-icon-atom-core:before { + content: '\EE52'; +} +.game-icon-h2o:before { + content: '\EE53'; +} +.game-icon-radiations:before { + content: '\EE54'; +} +.game-icon-chemical-bolt:before { + content: '\EE55'; +} +.game-icon-dripping-tube:before { + content: '\EE56'; +} +.game-icon-erlenmeyer:before { + content: '\EE57'; +} +.game-icon-foamy-disc:before { + content: '\EE58'; +} +.game-icon-materials-science:before { + content: '\EE59'; +} +.game-icon-molecule:before { + content: '\EE5A'; +} +.game-icon-soap-experiment:before { + content: '\EE5B'; +} +.game-icon-acid-tube:before { + content: '\EE5C'; +} +.game-icon-syringe-2:before { + content: '\EE5D'; +} +.game-icon-vial:before { + content: '\EE5E'; +} +.game-icon-atom:before { + content: '\EE5F'; +} +.game-icon-molecule-2:before { + content: '\EE60'; +} +.game-icon-arch-bridge:before { + content: '\EE61'; +} +.game-icon-black-bridge:before { + content: '\EE62'; +} +.game-icon-cable-stayed-bridge:before { + content: '\EE63'; +} +.game-icon-cliff-crossing:before { + content: '\EE64'; +} +.game-icon-drawbridge:before { + content: '\EE65'; +} +.game-icon-rialto-bridge:before { + content: '\EE66'; +} +.game-icon-rope-bridge:before { + content: '\EE67'; +} +.game-icon-suspension-bridge:before { + content: '\EE68'; +} +.game-icon-archive-register:before { + content: '\EE69'; +} +.game-icon-archive-research:before { + content: '\EE6A'; +} +.game-icon-book-cover:before { + content: '\EE6B'; +} +.game-icon-book-pile:before { + content: '\EE6C'; +} +.game-icon-calendar-half-year:before { + content: '\EE6D'; +} +.game-icon-love-letter:before { + content: '\EE6E'; +} +.game-icon-passport:before { + content: '\EE6F'; +} +.game-icon-pencil-ruler:before { + content: '\EE70'; +} +.game-icon-post-stamp:before { + content: '\EE71'; +} +.game-icon-scroll-quill:before { + content: '\EE72'; +} +.game-icon-spell-book:before { + content: '\EE73'; +} +.game-icon-stamper:before { + content: '\EE74'; +} +.game-icon-book-aura:before { + content: '\EE75'; +} +.game-icon-book-cover-2:before { + content: '\EE76'; +} +.game-icon-book-storm:before { + content: '\EE77'; +} +.game-icon-bookmarklet:before { + content: '\EE78'; +} +.game-icon-enlightenment:before { + content: '\EE79'; +} +.game-icon-folded-paper:before { + content: '\EE7A'; +} +.game-icon-ink-swirl:before { + content: '\EE7B'; +} +.game-icon-scroll-unfurled:before { + content: '\EE7C'; +} +.game-icon-black-book:before { + content: '\EE7D'; +} +.game-icon-white-book:before { + content: '\EE7E'; +} +.game-icon-neck-bite:before { + content: '\EE7F'; +} +.game-icon-bleeding-wound:before { + content: '\EE80'; +} +.game-icon-bloody-stash:before { + content: '\EE81'; +} +.game-icon-cross-mark:before { + content: '\EE82'; +} +.game-icon-feather-wound:before { + content: '\EE83'; +} +.game-icon-open-wound:before { + content: '\EE84'; +} +.game-icon-scar-wound:before { + content: '\EE85'; +} +.game-icon-spotted-wound:before { + content: '\EE86'; +} +.game-icon-stitched-wound:before { + content: '\EE87'; +} +.game-icon-arm:before { + content: '\EE88'; +} +.game-icon-bowels:before { + content: '\EE89'; +} +.game-icon-kidneys:before { + content: '\EE8A'; +} +.game-icon-liver:before { + content: '\EE8B'; +} +.game-icon-lungs:before { + content: '\EE8C'; +} +.game-icon-internal-organ:before { + content: '\EE8D'; +} +.game-icon-tumor:before { + content: '\EE8E'; +} +.game-icon-flat-platform:before { + content: '\EE8F'; +} +.game-icon-i-brick:before { + content: '\EE90'; +} +.game-icon-j-brick:before { + content: '\EE91'; +} +.game-icon-l-brick:before { + content: '\EE92'; +} +.game-icon-o-brick:before { + content: '\EE93'; +} +.game-icon-s-brick:before { + content: '\EE94'; +} +.game-icon-t-brick:before { + content: '\EE95'; +} +.game-icon-z-brick:before { + content: '\EE96'; +} +.game-icon-platform:before { + content: '\EE97'; +} +.game-icon-hatchet:before { + content: '\EE98'; +} +.game-icon-magic-axe:before { + content: '\EE99'; +} +.game-icon-sharp-halberd:before { + content: '\EE9A'; +} +.game-icon-axe-swing:before { + content: '\EE9B'; +} +.game-icon-crossed-axes:before { + content: '\EE9C'; +} +.game-icon-halberd:before { + content: '\EE9D'; +} +.game-icon-hatchets:before { + content: '\EE9E'; +} +.game-icon-royal-love:before { + content: '\EE9F'; +} +.game-icon-split-cross:before { + content: '\EEA0'; +} +.game-icon-templar-heart:before { + content: '\EEA1'; +} +.game-icon-tongue:before { + content: '\EEA2'; +} +.game-icon-carnivore-mouth:before { + content: '\EEA3'; +} +.game-icon-energy-breath:before { + content: '\EEA4'; +} +.game-icon-front-teeth:before { + content: '\EEA5'; +} +.game-icon-incisors:before { + content: '\EEA6'; +} +.game-icon-lightning-shout:before { + content: '\EEA7'; +} +.game-icon-lips:before { + content: '\EEA8'; +} +.game-icon-saber-tooth:before { + content: '\EEA9'; +} +.game-icon-sharp-lips:before { + content: '\EEAA'; +} +.game-icon-fangs:before { + content: '\EEAB'; +} +.game-icon-floor-hatch:before { + content: '\EEAC'; +} +.game-icon-hole:before { + content: '\EEAD'; +} +.game-icon-mine-explosion:before { + content: '\EEAE'; +} +.game-icon-car-battery:before { + content: '\EEAF'; +} +.game-icon-heart-battery:before { + content: '\EEB0'; +} +.game-icon-entangled-typhoon:before { + content: '\EEB1'; +} +.game-icon-lightning-electron:before { + content: '\EEB2'; +} +.game-icon-portal:before { + content: '\EEB3'; +} +.game-icon-rolling-energy:before { + content: '\EEB4'; +} +.game-icon-tesla-coil:before { + content: '\EEB5'; +} +.game-icon-battery-0:before { + content: '\EEB6'; +} +.game-icon-battery-100:before { + content: '\EEB7'; +} +.game-icon-battery-25:before { + content: '\EEB8'; +} +.game-icon-battery-50:before { + content: '\EEB9'; +} +.game-icon-battery-75:before { + content: '\EEBA'; +} +.game-icon-battery-minus:before { + content: '\EEBB'; +} +.game-icon-battery-plus:before { + content: '\EEBC'; +} +.game-icon-battery-pack-alt:before { + content: '\EEBD'; +} +.game-icon-battery-pack:before { + content: '\EEBE'; +} +.game-icon-bolt-saw:before { + content: '\EEBF'; +} +.game-icon-electric-whip:before { + content: '\EEC0'; +} +.game-icon-focused-lightning:before { + content: '\EEC1'; +} +.game-icon-heavy-lightning:before { + content: '\EEC2'; +} +.game-icon-lightning-branches:before { + content: '\EEC3'; +} +.game-icon-lightning-dissipation:before { + content: '\EEC4'; +} +.game-icon-lightning-frequency:before { + content: '\EEC5'; +} +.game-icon-lightning-helix:before { + content: '\EEC6'; +} +.game-icon-lightning-shadow:before { + content: '\EEC7'; +} +.game-icon-lightning-slashes:before { + content: '\EEC8'; +} +.game-icon-lightning-trio:before { + content: '\EEC9'; +} +.game-icon-power-lightning:before { + content: '\EECA'; +} +.game-icon-round-struck:before { + content: '\EECB'; +} +.game-icon-sonic-lightning:before { + content: '\EECC'; +} +.game-icon-static-waves:before { + content: '\EECD'; +} +.game-icon-thunder-struck:before { + content: '\EECE'; +} +.game-icon-thunderball:before { + content: '\EECF'; +} +.game-icon-windy-stripes:before { + content: '\EED0'; +} +.game-icon-electric:before { + content: '\EED1'; +} +.game-icon-chain-lightning:before { + content: '\EED2'; +} +.game-icon-arcing-bolt:before { + content: '\EED3'; +} +.game-icon-bright-explosion:before { + content: '\EED4'; +} +.game-icon-bubbling-beam:before { + content: '\EED5'; +} +.game-icon-burning-blobs:before { + content: '\EED6'; +} +.game-icon-clout:before { + content: '\EED7'; +} +.game-icon-comet-spark:before { + content: '\EED8'; +} +.game-icon-corner-explosion:before { + content: '\EED9'; +} +.game-icon-crowned-explosion:before { + content: '\EEDA'; +} +.game-icon-electrical-crescent:before { + content: '\EEDB'; +} +.game-icon-explosive-meeting:before { + content: '\EEDC'; +} +.game-icon-fragmented-meteor:before { + content: '\EEDD'; +} +.game-icon-heavy-fall:before { + content: '\EEDE'; +} +.game-icon-hypersonic-melon:before { + content: '\EEDF'; +} +.game-icon-implosion:before { + content: '\EEE0'; +} +.game-icon-incoming-rocket:before { + content: '\EEE1'; +} +.game-icon-ion-cannon-blast:before { + content: '\EEE2'; +} +.game-icon-ringed-beam:before { + content: '\EEE3'; +} +.game-icon-screen-impact:before { + content: '\EEE4'; +} +.game-icon-striking-splinter:before { + content: '\EEE5'; +} +.game-icon-evil-love:before { + content: '\EEE6'; +} +.game-icon-broken-heart-zone:before { + content: '\EEE7'; +} +.game-icon-charm:before { + content: '\EEE8'; +} +.game-icon-chewed-heart:before { + content: '\EEE9'; +} +.game-icon-shining-heart:before { + content: '\EEEA'; +} +.game-icon-chanterelles:before { + content: '\EEEB'; +} +.game-icon-mushrooms-cluster:before { + content: '\EEEC'; +} +.game-icon-spotted-mushroom:before { + content: '\EEED'; +} +.game-icon-dice-eight-faces-eight:before { + content: '\EEEE'; +} +.game-icon-dice-six-faces-five:before { + content: '\EEEF'; +} +.game-icon-dice-six-faces-four:before { + content: '\EEF0'; +} +.game-icon-dice-six-faces-one:before { + content: '\EEF1'; +} +.game-icon-dice-six-faces-six:before { + content: '\EEF2'; +} +.game-icon-dice-six-faces-two:before { + content: '\EEF3'; +} +.game-icon-dice-twenty-faces-one:before { + content: '\EEF4'; +} +.game-icon-dice-twenty-faces-twenty:before { + content: '\EEF5'; +} +.game-icon-perspective-dice-five:before { + content: '\EEF6'; +} +.game-icon-perspective-dice-four:before { + content: '\EEF7'; +} +.game-icon-perspective-dice-one:before { + content: '\EEF8'; +} +.game-icon-perspective-dice-six-faces-five:before { + content: '\EEF9'; +} +.game-icon-perspective-dice-six-faces-one:before { + content: '\EEFA'; +} +.game-icon-perspective-dice-six-faces-random:before { + content: '\EEFB'; +} +.game-icon-perspective-dice-six-faces-six:before { + content: '\EEFC'; +} +.game-icon-perspective-dice-six-faces-three:before { + content: '\EEFD'; +} +.game-icon-perspective-dice-six-faces-two:before { + content: '\EEFE'; +} +.game-icon-perspective-dice-six:before { + content: '\EEFF'; +} +.game-icon-perspective-dice-three:before { + content: '\EF00'; +} +.game-icon-perspective-dice-two:before { + content: '\EF01'; +} +.game-icon-d10:before { + content: '\EF02'; +} +.game-icon-d12:before { + content: '\EF03'; +} +.game-icon-d4:before { + content: '\EF04'; +} +.game-icon-inverted-dice-1:before { + content: '\EF05'; +} +.game-icon-inverted-dice-2:before { + content: '\EF06'; +} +.game-icon-inverted-dice-3:before { + content: '\EF07'; +} +.game-icon-inverted-dice-4:before { + content: '\EF08'; +} +.game-icon-inverted-dice-5:before { + content: '\EF09'; +} +.game-icon-inverted-dice-6:before { + content: '\EF0A'; +} +.game-icon-matter-states:before { + content: '\EF0B'; +} +.game-icon-sandstorm:before { + content: '\EF0C'; +} +.game-icon-abstract-001:before { + content: '\EF0D'; +} +.game-icon-abstract-002:before { + content: '\EF0E'; +} +.game-icon-abstract-003:before { + content: '\EF0F'; +} +.game-icon-abstract-004:before { + content: '\EF10'; +} +.game-icon-abstract-005:before { + content: '\EF11'; +} +.game-icon-abstract-006:before { + content: '\EF12'; +} +.game-icon-abstract-007:before { + content: '\EF13'; +} +.game-icon-abstract-008:before { + content: '\EF14'; +} +.game-icon-abstract-009:before { + content: '\EF15'; +} +.game-icon-abstract-010:before { + content: '\EF16'; +} +.game-icon-abstract-011:before { + content: '\EF17'; +} +.game-icon-abstract-012:before { + content: '\EF18'; +} +.game-icon-abstract-013:before { + content: '\EF19'; +} +.game-icon-abstract-014:before { + content: '\EF1A'; +} +.game-icon-abstract-015:before { + content: '\EF1B'; +} +.game-icon-abstract-016:before { + content: '\EF1C'; +} +.game-icon-abstract-017:before { + content: '\EF1D'; +} +.game-icon-abstract-018:before { + content: '\EF1E'; +} +.game-icon-abstract-019:before { + content: '\EF1F'; +} +.game-icon-abstract-020:before { + content: '\EF20'; +} +.game-icon-abstract-021:before { + content: '\EF21'; +} +.game-icon-abstract-022:before { + content: '\EF22'; +} +.game-icon-abstract-023:before { + content: '\EF23'; +} +.game-icon-abstract-024:before { + content: '\EF24'; +} +.game-icon-abstract-025:before { + content: '\EF25'; +} +.game-icon-abstract-026:before { + content: '\EF26'; +} +.game-icon-abstract-027:before { + content: '\EF27'; +} +.game-icon-abstract-028:before { + content: '\EF28'; +} +.game-icon-abstract-029:before { + content: '\EF29'; +} +.game-icon-abstract-030:before { + content: '\EF2A'; +} +.game-icon-abstract-031:before { + content: '\EF2B'; +} +.game-icon-abstract-032:before { + content: '\EF2C'; +} +.game-icon-abstract-033:before { + content: '\EF2D'; +} +.game-icon-abstract-034:before { + content: '\EF2E'; +} +.game-icon-abstract-035:before { + content: '\EF2F'; +} +.game-icon-abstract-036:before { + content: '\EF30'; +} +.game-icon-abstract-037:before { + content: '\EF31'; +} +.game-icon-abstract-038:before { + content: '\EF32'; +} +.game-icon-abstract-039:before { + content: '\EF33'; +} +.game-icon-abstract-040:before { + content: '\EF34'; +} +.game-icon-abstract-041:before { + content: '\EF35'; +} +.game-icon-abstract-042:before { + content: '\EF36'; +} +.game-icon-abstract-043:before { + content: '\EF37'; +} +.game-icon-abstract-044:before { + content: '\EF38'; +} +.game-icon-abstract-045:before { + content: '\EF39'; +} +.game-icon-abstract-046:before { + content: '\EF3A'; +} +.game-icon-abstract-047:before { + content: '\EF3B'; +} +.game-icon-abstract-048:before { + content: '\EF3C'; +} +.game-icon-abstract-049:before { + content: '\EF3D'; +} +.game-icon-abstract-050:before { + content: '\EF3E'; +} +.game-icon-abstract-051:before { + content: '\EF3F'; +} +.game-icon-abstract-052:before { + content: '\EF40'; +} +.game-icon-abstract-053:before { + content: '\EF41'; +} +.game-icon-abstract-054:before { + content: '\EF42'; +} +.game-icon-abstract-055:before { + content: '\EF43'; +} +.game-icon-abstract-056:before { + content: '\EF44'; +} +.game-icon-abstract-057:before { + content: '\EF45'; +} +.game-icon-abstract-058:before { + content: '\EF46'; +} +.game-icon-abstract-059:before { + content: '\EF47'; +} +.game-icon-abstract-060:before { + content: '\EF48'; +} +.game-icon-abstract-061:before { + content: '\EF49'; +} +.game-icon-abstract-062:before { + content: '\EF4A'; +} +.game-icon-abstract-063:before { + content: '\EF4B'; +} +.game-icon-abstract-064:before { + content: '\EF4C'; +} +.game-icon-abstract-065:before { + content: '\EF4D'; +} +.game-icon-abstract-066:before { + content: '\EF4E'; +} +.game-icon-abstract-067:before { + content: '\EF4F'; +} +.game-icon-abstract-068:before { + content: '\EF50'; +} +.game-icon-abstract-069:before { + content: '\EF51'; +} +.game-icon-abstract-070:before { + content: '\EF52'; +} +.game-icon-abstract-071:before { + content: '\EF53'; +} +.game-icon-abstract-072:before { + content: '\EF54'; +} +.game-icon-abstract-073:before { + content: '\EF55'; +} +.game-icon-abstract-074:before { + content: '\EF56'; +} +.game-icon-abstract-075:before { + content: '\EF57'; +} +.game-icon-abstract-076:before { + content: '\EF58'; +} +.game-icon-abstract-077:before { + content: '\EF59'; +} +.game-icon-abstract-078:before { + content: '\EF5A'; +} +.game-icon-abstract-079:before { + content: '\EF5B'; +} +.game-icon-abstract-080:before { + content: '\EF5C'; +} +.game-icon-abstract-081:before { + content: '\EF5D'; +} +.game-icon-abstract-082:before { + content: '\EF5E'; +} +.game-icon-abstract-083:before { + content: '\EF5F'; +} +.game-icon-abstract-084:before { + content: '\EF60'; +} +.game-icon-abstract-085:before { + content: '\EF61'; +} +.game-icon-abstract-086:before { + content: '\EF62'; +} +.game-icon-abstract-087:before { + content: '\EF63'; +} +.game-icon-abstract-088:before { + content: '\EF64'; +} +.game-icon-abstract-089:before { + content: '\EF65'; +} +.game-icon-abstract-090:before { + content: '\EF66'; +} +.game-icon-abstract-091:before { + content: '\EF67'; +} +.game-icon-abstract-092:before { + content: '\EF68'; +} +.game-icon-abstract-093:before { + content: '\EF69'; +} +.game-icon-abstract-094:before { + content: '\EF6A'; +} +.game-icon-abstract-095:before { + content: '\EF6B'; +} +.game-icon-abstract-096:before { + content: '\EF6C'; +} +.game-icon-abstract-097:before { + content: '\EF6D'; +} +.game-icon-abstract-098:before { + content: '\EF6E'; +} +.game-icon-abstract-099:before { + content: '\EF6F'; +} +.game-icon-abstract-100:before { + content: '\EF70'; +} +.game-icon-abstract-101:before { + content: '\EF71'; +} +.game-icon-abstract-102:before { + content: '\EF72'; +} +.game-icon-abstract-103:before { + content: '\EF73'; +} +.game-icon-abstract-104:before { + content: '\EF74'; +} +.game-icon-abstract-105:before { + content: '\EF75'; +} +.game-icon-abstract-106:before { + content: '\EF76'; +} +.game-icon-abstract-107:before { + content: '\EF77'; +} +.game-icon-abstract-108:before { + content: '\EF78'; +} +.game-icon-abstract-109:before { + content: '\EF79'; +} +.game-icon-abstract-110:before { + content: '\EF7A'; +} +.game-icon-abstract-111:before { + content: '\EF7B'; +} +.game-icon-abstract-112:before { + content: '\EF7C'; +} +.game-icon-abstract-113:before { + content: '\EF7D'; +} +.game-icon-abstract-114:before { + content: '\EF7E'; +} +.game-icon-abstract-115:before { + content: '\EF7F'; +} +.game-icon-abstract-116:before { + content: '\EF80'; +} +.game-icon-abstract-117:before { + content: '\EF81'; +} +.game-icon-abstract-118:before { + content: '\EF82'; +} +.game-icon-abstract-119:before { + content: '\EF83'; +} +.game-icon-abstract-120:before { + content: '\EF84'; +} +.game-icon-abstract-121:before { + content: '\EF85'; +} diff --git a/assets/fonts/game-icons.woff b/lib/game-icons/game-icons.woff similarity index 100% rename from assets/fonts/game-icons.woff rename to lib/game-icons/game-icons.woff diff --git a/lib/socketlib/LICENSE b/lib/socketlib/LICENSE new file mode 100644 index 00000000..4dd8d0e4 --- /dev/null +++ b/lib/socketlib/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2021 Manuel Vögele + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/lib/socketlib/src/errors.js b/lib/socketlib/src/errors.js new file mode 100644 index 00000000..ec16df68 --- /dev/null +++ b/lib/socketlib/src/errors.js @@ -0,0 +1,41 @@ +export class SocketlibError extends Error { + constructor(...args) { + super(...args); + this.name = "SocketlibError"; + } +} + +export class SocketlibInternalError extends SocketlibError { + constructor(...args) { + super(...args); + this.name = "SocketlibInternalError"; + } +} + +export class SocketlibInvalidUserError extends SocketlibError { + constructor(...args) { + super(...args); + this.name = "SocketlibInvalidUserError"; + } +} + +export class SocketlibNoGMConnectedError extends SocketlibError { + constructor(...args) { + super(...args); + this.name = "SocketlibNoGMConnectedError"; + } +} + +export class SocketlibRemoteException extends SocketlibError { + constructor(...args) { + super(...args); + this.name = "SocketlibRemoteException"; + } +} + +export class SocketlibUnregisteredHandlerError extends SocketlibError { + constructor(...args) { + super(...args); + this.name = "SocketlibUnregisteredHandlerError"; + } +} diff --git a/lib/socketlib/src/libwrapper_shim.js b/lib/socketlib/src/libwrapper_shim.js new file mode 100644 index 00000000..dc761331 --- /dev/null +++ b/lib/socketlib/src/libwrapper_shim.js @@ -0,0 +1,61 @@ +// SPDX-License-Identifier: MIT +// Copyright © 2021 fvtt-lib-wrapper Rui Pinheiro + +'use strict'; + +// A shim for the libWrapper library +export let libWrapper = undefined; + +Hooks.once('init', () => { + // Check if the real module is already loaded - if so, use it + if(globalThis.libWrapper && !(globalThis.libWrapper.is_fallback ?? true)) { + libWrapper = globalThis.libWrapper; + return; + } + + // Fallback implementation + libWrapper = class { + static get is_fallback() { return true }; + + static register(module, target, fn, type="MIXED", {chain=undefined}={}) { + const is_setter = target.endsWith('#set'); + target = !is_setter ? target : target.slice(0, -4); + const split = target.split('.'); + const fn_name = split.pop(); + const root_nm = split.splice(0,1)[0]; + const _eval = eval; // The browser doesn't expose all global variables (e.g. 'Game') inside globalThis, but it does to an eval. We copy it to a variable to have it run in global scope. + const obj = split.reduce((x,y)=>x[y], globalThis[root_nm] ?? _eval(root_nm)); + + let iObj = obj; + let descriptor = null; + while(iObj) { + descriptor = Object.getOwnPropertyDescriptor(iObj, fn_name); + if(descriptor) break; + iObj = Object.getPrototypeOf(iObj); + } + if(!descriptor || descriptor?.configurable === false) throw `libWrapper Shim: '${target}' does not exist, could not be found, or has a non-configurable descriptor.`; + + let original = null; + const wrapper = (chain ?? type != 'OVERRIDE') ? function() { return fn.call(this, original.bind(this), ...arguments); } : function() { return fn.apply(this, arguments); }; + + if(!is_setter) { + if(descriptor.value) { + original = descriptor.value; + descriptor.value = wrapper; + } + else { + original = descriptor.get; + descriptor.get = wrapper; + } + } + else { + if(!descriptor.set) throw `libWrapper Shim: '${target}' does not have a setter`; + original = descriptor.set; + descriptor.set = wrapper; + } + + descriptor.configurable = true; + Object.defineProperty(obj, fn_name, descriptor); + } + } +}); diff --git a/lib/socketlib/src/socketlib.js b/lib/socketlib/src/socketlib.js new file mode 100644 index 00000000..88f1d107 --- /dev/null +++ b/lib/socketlib/src/socketlib.js @@ -0,0 +1,355 @@ +import {libWrapper} from "./libwrapper_shim.js"; +import * as errors from "./errors.js"; + +const RECIPIENT_TYPES = { + ONE_GM: 0, + ALL_GMS: 1, + EVERYONE: 2, +} + +const MESSAGE_TYPES = { + COMMAND: 0, + REQUEST: 1, + RESPONSE: 2, + RESULT: 3, + EXCEPTION: 4, + UNREGISTERED: 5, +} + +Hooks.once("init", () => { + // Adding a check so will fallback to module if installed + if (typeof window.socketlib === 'undefined') { + window.socketlib = new Socketlib(); + Hooks.callAll("socketlib.ready"); + } +}, "WRAPPER"); + +class Socketlib { + constructor() { + this.modules = new Map(); + this.system = undefined; + this.errors = errors; + } + + registerModule(moduleName) { + const existingSocket = this.modules.get(moduleName); + if (existingSocket) + return existingSocket; + const module = game.modules.get(moduleName); + if (!module?.active) { + console.error(`socketlib | Someone tried to register module '${moduleName}', but no module with that name is active. As a result the registration request has been ignored.`); + return undefined; + } + if (!module.data.socket) { + console.error(`socketlib | Failed to register socket for module '${moduleName}'. Please set '"socket":true' in your manifset and restart foundry (you need to reload your world - simply reloading your browser won't do).`); + return undefined; + } + const newSocket = new SocketlibSocket(moduleName, "module"); + this.modules.set(moduleName, newSocket); + return newSocket; + } + + registerSystem(systemId) { + if (game.system.id !== systemId) { + console.error(`socketlib | Someone tried to register system '${systemId}', but that system isn't active. As a result the registration request has been ignored.`); + return undefined; + } + const existingSocket = this.system; + if (existingSocket) + return existingSocket; + if (!game.system.data.socket) { + console.error(`socketlib | Failed to register socket for system '${systemId}'. Please set '"socket":true' in your manifest and restart foundry (you need to reload your world - simply reloading your browser won't do).`); + } + const newSocket = new SocketlibSocket(systemId, "system"); + this.system = newSocket; + return newSocket; + } +} + +class SocketlibSocket { + constructor(moduleName, moduleType) { + this.functions = new Map(); + this.socketName = `${moduleType}.${moduleName}`; + this.pendingRequests = new Map(); + game.socket.on(this.socketName, this._onSocketReceived.bind(this)); + } + + register(name, func) { + if (!(func instanceof Function)) { + console.error(`socketlib | Cannot register non-function as socket handler for '${name}' for '${this.socketName}'.`); + return; + } + if (this.functions.has(name)) { + console.warn(`socketlib | Function '${name}' is already registered for '${this.socketName}'. Ignoring registration request.`); + return; + } + this.functions.set(name, func); + } + + async executeAsGM(handler, ...args) { + const [name, func] = this._resolveFunction(handler); + if (game.user.isGM) { + return this._executeLocal(func, ...args); + } + else { + if (!game.users.find(isActiveGM)) { + throw new errors.SocketlibNoGMConnectedError(`Could not execute handler '${name}' (${func.name}) as GM, because no GM is connected.`); + } + return this._sendRequest(name, args, RECIPIENT_TYPES.ONE_GM); + } + } + + async executeAsUser(handler, userId, ...args) { + const [name, func] = this._resolveFunction(handler); + if (userId === game.userId) + return this._executeLocal(func, ...args); + const user = game.users.get(userId); + if (!user) + throw new errors.SocketlibInvalidUserError(`No user with id '${userId}' exists.`); + if (!user.active) + throw new errors.SocketlibInvalidUserError(`User '${user.name}' (${userId}) is not connected.`); + return this._sendRequest(name, args, [userId]); + } + + async executeForAllGMs(handler, ...args) { + const [name, func] = this._resolveFunction(handler); + this._sendCommand(name, args, RECIPIENT_TYPES.ALL_GMS); + if (game.user.isGM) { + try { + this._executeLocal(func, ...args); + } + catch (e) { + console.error(e); + } + } + } + + async executeForOtherGMs(handler, ...args) { + const [name, func] = this._resolveFunction(handler); + this._sendCommand(name, args, RECIPIENT_TYPES.ALL_GMS); + } + + async executeForEveryone(handler, ...args) { + const [name, func] = this._resolveFunction(handler); + this._sendCommand(name, args, RECIPIENT_TYPES.EVERYONE); + try { + this._executeLocal(func, ...args); + } catch (e) { + console.error(e); + } + } + + async executeForOthers(handler, ...args) { + const [name, func] = this._resolveFunction(handler); + this._sendCommand(name, args, RECIPIENT_TYPES.EVERYONE); + } + + async executeForUsers(handler, recipients, ...args) { + if (!(recipients instanceof Array)) + throw new TypeError("Recipients parameter must be an array of user ids."); + const [name, func] = this._resolveFunction(handler); + const currentUserIndex = recipients.indexOf(game.userId); + if (currentUserIndex >= 0) + recipients.splice(currentUserIndex, 1); + this._sendCommand(name, args, recipients); + if (currentUserIndex >= 0) { + try { + this._executeLocal(func, ...args); + } + catch (e) { + console.error(e); + } + } + } + + _sendRequest(handlerName, args, recipient) { + const message = {handlerName, args, recipient}; + message.id = randomID(); + message.type = MESSAGE_TYPES.REQUEST; + const promise = new Promise((resolve, reject) => this.pendingRequests.set(message.id, {handlerName, resolve, reject, recipient})); + game.socket.emit(this.socketName, message); + return promise; + } + + _sendCommand(handlerName, args, recipient) { + const message = {handlerName, args, recipient}; + message.type = MESSAGE_TYPES.COMMAND; + game.socket.emit(this.socketName, message); + } + + _sendResult(id, result) { + const message = {id, result}; + message.type = MESSAGE_TYPES.RESULT; + game.socket.emit(this.socketName, message); + } + + _sendError(id, type) { + const message = {id, type}; + message.userId = game.userId; + game.socket.emit(this.socketName, message); + } + + _executeLocal(func, ...args) { + const socketdata = {userId: game.userId}; + return func.call({socketdata}, ...args); + } + + _resolveFunction(func) { + if (func instanceof Function) { + const entry = Array.from(this.functions.entries()).find(([key, val]) => val === func); + if (!entry) + throw new errors.SocketlibUnregisteredHandlerError(`Function '${func.name}' has not been registered as a socket handler.`); + return [entry[0], func]; + } + else { + const fn = this.functions.get(func); + if (!fn) + throw new errors.SocketlibUnregisteredHandlerError(`No socket handler with the name '${func}' has been registered.`) + return [func, fn]; + } + } + + _onSocketReceived(message, senderId) { + if (message.type === MESSAGE_TYPES.COMMAND || message.type === MESSAGE_TYPES.REQUEST) + this._handleRequest(message, senderId); + else + this._handleResponse(message, senderId); + } + + async _handleRequest(message, senderId) { + const {handlerName, args, recipient, id, type} = message; + // Check if we're the recipient of the received message. If not, return early. + if (recipient instanceof Array) { + if (!recipient.includes(game.userId)) + return; + } + else { + switch (recipient) { + case RECIPIENT_TYPES.ONE_GM: + if (!isResponsibleGM()) + return; + break; + case RECIPIENT_TYPES.ALL_GMS: + if (!game.user.isGM) + return; + break; + case RECIPIENT_TYPES.EVERYONE: + break; + default: + console.error(`Unkown recipient '${recipient}' when trying to execute '${handlerName}' for '${this.socketName}'. This should never happen. If you see this message, please open an issue in the bug tracker of the socketlib repository.`); + return; + } + } + let name, func; + try { + [name, func] = this._resolveFunction(handlerName); + } + catch (e) { + if (e instanceof errors.SocketlibUnregisteredHandlerError && type === MESSAGE_TYPES.REQUEST) { + this._sendError(id, MESSAGE_TYPES.UNREGISTERED); + } + throw e; + } + const socketdata = {userId: senderId}; + const _this = {socketdata}; + if (type === MESSAGE_TYPES.COMMAND) { + func.call(_this, ...args); + } + else { + let result; + try { + result = await func.call(_this, ...args); + } + catch (e) { + console.error(`An exception occured while executing handler '${name}'.`); + this._sendError(id, MESSAGE_TYPES.EXCEPTION); + throw e; + } + this._sendResult(id, result); + } + } + + _handleResponse(message, senderId) { + const {id, result, type} = message; + const request = this.pendingRequests.get(id); + if (!request) + return; + if (!this._isResponseSenderValid(senderId, request.recipient)) { + console.warn("socketlib | Dropped a response that was received from the wrong user. This means that either someone is inserting messages into the socket or this is a socketlib issue. If the latter is the case please file a bug report in the socketlib repository.") + console.info(senderId, request.recipient); + return; + } + switch (type) { + case MESSAGE_TYPES.RESULT: + request.resolve(result); + break; + case MESSAGE_TYPES.EXCEPTION: + request.reject(new errors.SocketlibRemoteException(`An exception occured during remote execution of handler '${request.handlerName}'. Please see ${game.users.get(message.userId).name}'s error console for details.`)); + break; + case MESSAGE_TYPES.UNREGISTERED: + request.reject(new errors.SocketlibUnregisteredHandlerError(`Executing the handler '${request.handlerName}' has been refused by ${game.users.get(message.userId).name}'s client, because this handler hasn't been registered on that client.`)); + break; + default: + request.reject(new errors.SocketlibInternalError(`Unknown result type '${type}' for handler '${request.handlerName}'. This should never happen. If you see this message, please open an issue in the bug tracker of the socketlib repository.`)); + break; + } + this.pendingRequests.delete(id); + } + + _isResponseSenderValid(senderId, recipients) { + if (recipients === RECIPIENT_TYPES.ONE_GM && game.users.get(senderId).isGM) + return true; + if (recipients instanceof Array && recipients.includes(senderId)) + return true; + return false; + } +} + +function isResponsibleGM() { + if (!game.user.isGM) + return false; + const connectedGMs = game.users.filter(isActiveGM); + return !connectedGMs.some(other => other.data._id < game.user.data._id); +} + +function isActiveGM(user) { + return user.active && user.isGM; +} + +function handleUserActivity(wrapper, userId, activityData={}) { + const user = game.users.get(userId); + const wasActive = user.active; + const result = wrapper(userId, activityData); + + // If user disconnected + if (!user.active && wasActive) { + const modules = Array.from(socketlib.modules.values()); + if (socketlib.system) + modules.concat(socketlib.system); + const GMConnected = Boolean(game.users.find(isActiveGM)); + // Reject all promises that are still waiting for a response from this player + for (const socket of modules) { + const failedRequests = Array.from(socket.pendingRequests.entries()).filter(([id, request]) => { + const recipient = request.recipient; + const handlerName = request.handlerName; + if (recipient === RECIPIENT_TYPES.ONE_GM) { + if (!GMConnected) { + request.reject(new errors.SocketlibNoGMConnectedError(`Could not execute handler '${handlerName}' as GM, because all GMs disconnected while the execution was being dispatched.`)); + return true; + } + } + else if (recipient instanceof Array) { + if (recipient.includes(userId)) { + request.reject(new errors.SocketlibInvalidUserError(`User '${game.users.get(userId).name}' (${userId}) disconnected while handler '${handlerName}' was being dispatched.`)); + return true; + } + } + return false; + }); + for (const [id, request] of failedRequests) { + socket.pendingRequests.delete(id); + } + } + } + return result; +} diff --git a/module/active-effect.js b/module/active-effect.js new file mode 100644 index 00000000..ad77e8b2 --- /dev/null +++ b/module/active-effect.js @@ -0,0 +1,291 @@ +/* global ActiveEffect, foundry, game, Roll */ + +export default class CoC7ActiveEffect extends ActiveEffect { + constructor (...args) { + super(...args) + // Used for V9 compat only. + if (game.version && !game.version.startsWith('10')) { + if (this.combats) { + const duration = this.duration + delete this.duration + Object.defineProperty(this, 'duration', { + get () { + const d = this.data.duration + if (Number.isNumeric(d.seconds)) { + let label = duration.label + if (d.seconds > 3600) { + label = new Date(d.seconds * 1000).toISOString().slice(11, 19) + } else if (d.seconds > 100) { + label = new Date(d.seconds * 1000).toISOString().slice(14, 19) + } + duration.label = label + } + return duration + } + }) + } + } + } + + /** @inheritdoc */ + apply (actor, change) { + if (!isNaN(Number(change.value))) change.value = Number(change.value) + const result = super.apply(actor, change) + const evaluated = isNaN(result) ? parse(result) : result + if (isNaN(evaluated)) return result + return evaluated + } + + /* -------------------------------------------- */ + + /** + * @override + * Apply an ActiveEffect that uses a MULTIPLY application mode. + * Changes which MULTIPLY must be numeric to allow for multiplication. + * @param {Actor} actor The Actor to whom this effect should be applied + * @param {data.EffectChangeData} change The change data being applied + * @return {*} The resulting applied value + * @private + */ + _applyMultiply (actor, change) { + const { key, value } = change + const current = foundry.utils.getProperty(actor.data, key) + const n = Number.fromString(value) + + let update + + const strUpdate = `${current}*${String(value)}` + if (!isNaN(parse(strUpdate))) update = String(parse(strUpdate)) + else if (Roll.validate(strUpdate)) update = strUpdate + else if (typeof current !== 'number' || isNaN(n)) return null + else update = current * n + foundry.utils.setProperty(actor.data, key, update) + return update + } + + /* -------------------------------------------- */ + + /** + * @override + * Apply an ActiveEffect that uses an ADD application mode. + * The way that effects are added depends on the data type of the current value. + * + * If the current value is null, the change value is assigned directly. + * If the current type is a string, the change value is concatenated. + * If the current type is a number, the change value is cast to numeric and added. + * If the current type is an array, the change value is appended to the existing array if it matches in type. + * + * @param {Actor} actor The Actor to whom this effect should be applied + * @param {data.EffectChangeData} change The change data being applied + * @return {*} The resulting applied value + * @private + */ + _applyAdd (actor, change) { + const { key, value } = change + const current = foundry.utils.getProperty(actor.data, key) ?? null + const ct = foundry.utils.getType(current) + let update = null + + // Handle different types of the current data + switch (ct) { + case 'null': + update = value + break + case 'string': + { + const strUpdate = `${current}+${String(value)}` + .replace('++', '+') + .replace('+-', '-') + if (!isNaN(parse(strUpdate))) update = String(parse(strUpdate)) + else if (Roll.validate(strUpdate)) update = strUpdate + else update = current + String(value) + } + break + case 'number':{ + const n = Number.fromString(value) + if (!isNaN(n)) update = current + n + } + break + case 'Array':{ + const at = foundry.utils.getType(current[0]) + if (!current.length || foundry.utils.getType(value) === at) { update = current.concat([value]) } + } + } + if (update !== null) foundry.utils.setProperty(actor.data, key, update) + return update + } + + /** + * Manage Active Effect instances through the Actor Sheet via effect control buttons. + * @param {MouseEvent} event The left-click event on the effect control + * @param {Actor|Item} owner The owning document which manages this effect + * @returns {Promise|null} Promise that resolves when the changes are complete. + */ + static onManageActiveEffect (event, owner) { + event.preventDefault() + const a = event.currentTarget + const li = a.closest('li') + const effect = li.dataset.effectId + ? owner.effects.get(li.dataset.effectId) + : null + switch (a.dataset.action) { + case 'create': + return owner.createEmbeddedDocuments('ActiveEffect', [ + { + label: game.i18n.localize('CoC7.EffectNew'), + icon: 'icons/svg/aura.svg', + origin: owner.uuid, + 'duration.rounds': + li.dataset.effectType === 'temporary' ? 1 : undefined, + disabled: li.dataset.effectType === 'inactive' + } + ]) + case 'edit': + return effect.sheet.render(true) + case 'delete': + return effect.delete() + case 'toggle': + return effect.update({ disabled: !effect.data.disabled }) + } + } + + // prepareData () { + // super.prepareData() + // } + + prepareEmbeddedDocuments () { + super.prepareEmbeddedDocuments() + } + + // Used in V10 only !! + _prepareDuration () { + super._prepareDuration() + + const duration = this.duration + if (Number.isNumeric(duration.seconds)) { + let label = duration.label + if (duration.seconds > 3600) { + label = new Date(duration.seconds * 1000).toISOString().slice(11, 19) + } else if (duration.seconds > 100) { + label = new Date(duration.seconds * 1000).toISOString().slice(14, 19) + } + duration.label = label + } + } + + /** + * @override + */ + // get duration () { + // const d = this.data.duration + // const duration = super.duration + // if (Number.isNumeric(d.seconds)) { + // let label = duration.label + // if (d.seconds > 3600) { + // label = new Date(d.seconds * 1000).toISOString().slice(11, 19) + // } else if (d.seconds > 100) { + // label = new Date(d.seconds * 1000).toISOString().slice(14, 19) + // } + // duration.label = label + // } + // return duration + // } + + // set duration (x) { + // super.duration = x + // } + + get isStatus () { + const statusId = this.getFlag('core', 'statusId') + return [ + 'tempoInsane', + 'indefInsane', + 'criticalWounds', + 'dying', + 'dead', + 'unconscious', + 'prone' + ].includes(statusId) + } + + static prepareActiveEffectCategories (effects) { + // Define effect header categories + const categories = { + status: { + type: 'status', + label: game.i18n.localize('Status'), + effects: [] + }, + temporary: { + type: 'temporary', + label: game.i18n.localize('Temporary'), + effects: [] + }, + passive: { + type: 'passive', + label: game.i18n.localize('Passive'), + effects: [] + }, + inactive: { + type: 'inactive', + label: game.i18n.localize('Inactive'), + effects: [] + }, + suppressed: { + type: 'suppressed', + label: game.i18n.localize('Suppressed'), + effects: [], + info: [game.i18n.localize('Unavailable')] + } + } + // Iterate over active effects, classifying them into categories + for (const e of effects) { + e._getSourceName() // Trigger a lookup for the source name + if (e.isSuppressed) categories.suppressed.effects.push(e) + else if (e.isStatus) categories.status.effects.push(e) + else if (e.data.disabled) categories.inactive.effects.push(e) + else if (e.isTemporary) categories.temporary.effects.push(e) + else categories.passive.effects.push(e) + } + + categories.suppressed.hidden = !categories.suppressed.effects.length + return categories + } + + static prepareNPCActiveEffectCategories (effects) { + let count = 0 + // Define effect header categories + const categories = { + active: { + type: 'active', + label: game.i18n.localize('Active'), + effects: [] + }, + inactive: { + type: 'inactive', + label: game.i18n.localize('Inactive'), + effects: [] + } + } + // Iterate over active effects, classifying them into categories + for (const e of effects) { + count += 1 + e._getSourceName() // Trigger a lookup for the source name + if (e.isSuppressed || e.data.disabled) categories.inactive.effects.push(e) + else categories.active.effects.push(e) + } + + if (count > 0) categories.expended = true + return categories + } +} + +function parse (str) { + const regEx = /^[+\-*/)(\d]+$/ + if (!regEx.exec(str)) return NaN + try { + return new Roll(str).evaluate({ async: false }).total + } catch (e) { + return NaN + } +} diff --git a/module/actor-directory.js b/module/actor-directory.js new file mode 100644 index 00000000..d0a823a0 --- /dev/null +++ b/module/actor-directory.js @@ -0,0 +1,18 @@ +/* global ActorDirectory, game */ +import { CoC7ActorImporterDialog } from './apps/actor-importer-dialog.js' + +export class CoC7ActorDirectory extends ActorDirectory { + activateListeners (html) { + super.activateListeners(html) + html + .find('footer.directory-footer') + .append( + '' + + game.i18n.localize('CoC7.ActorImporter') + + '' + ) + html.find('.actor-import').click(() => { + CoC7ActorImporterDialog.create() + }) + } +} diff --git a/module/actors/actor.js b/module/actors/actor.js index c980a3d8..525b4cf6 100644 --- a/module/actors/actor.js +++ b/module/actors/actor.js @@ -1,6 +1,7 @@ -/* global Actor, CONST, Dialog, Die, duplicate, game, getProperty, mergeObject, Roll, TextEditor, Token, ui */ +/* global Actor, CONFIG, CONST, Dialog, Die, duplicate, foundry, game, getProperty, Hooks, mergeObject, Roll, TextEditor, Token, ui */ import { COC7 } from '../config.js' +import { CoC7ChatMessage } from '../apps/coc7-chat-message.js' import { CoC7Check } from '../check.js' import { CoC7ConCheck } from '../chat/concheck.js' import { RollDialog } from '../apps/roll-dialog.js' @@ -21,6 +22,33 @@ import { CoC7Utilities } from '../utilities.js' * Extend the base Actor class to implement additional logic specialized for CoC 7th. */ export class CoCActor extends Actor { + /** Create derived document classes for specific Item types */ + constructor (data, context) { + /** @see CONFIG.Actor.documentClasses in module/scripts/configure-documents */ + if (data.type in CONFIG.Actor.documentClasses && !context?.extended) { + /** + * When the constructor for the new class will call it's super(), + * the extended flag will be true, thus bypassing this whole process + * and resume default behavior + */ + return new CONFIG.Actor.documentClasses[data.type](data, { + ...{ extended: true }, + ...context + }) + } + // if (typeof data.img === 'undefined') { + // if (data.type === 'skill') { + // data.img = 'systems/CoC7/assets/icons/skills.svg' + // } else if (data.type === 'status') { + // data.img = 'icons/svg/aura.svg' + // } else if (data.type === 'weapon') { + // data.img = 'icons/svg/sword.svg' + // } + // } + /** Default behavior, just call super() and do all the default Item inits */ + super(data, context) + } + async initialize () { super.initialize() await this.creatureInit() // TODO : move this in CoCActor.create(data, options) @@ -57,6 +85,148 @@ export class CoCActor extends Actor { // } // + /** + * @override + * Prepare data related to this Document itself, before any embedded Documents or derived data is computed. + * @memberof ClientDocumentMixin# + */ + prepareBaseData () { + if (['character', 'npc', 'creature'].includes(this.type)) { + this.data.data.skills = {} + for (const i of this.items) { + if (i.type === 'skill') { + this.data.data.skills[`${i.data.data.skillName}`] = { + value: i.rawValue + } + this.data.data.skills[`${i.id}`] = { value: i.rawValue } + } + } + + /** + * Removal of 1/5 sanity + * this is to remove the + * actor.data.attribs.san.oneFifthSanity to be removed from template + * and indefiniteInsanityLevel to be removed from template + */ + if (typeof this.data.data.attribs.san.dailyLimit === 'undefined') { + if (this.data.data.attribs.san.oneFifthSanity) { + const s = this.data.data.attribs.san.oneFifthSanity.split('/') + if (s[1] && !isNaN(Number(s[1]))) { + this.data.data.attribs.san.dailyLimit = Number(s[1]) + } else { + this.data.data.attribs.san.dailyLimit = 0 + } + } else { + this.data.data.attribs.san.dailyLimit = 0 + } + } + + // return computed values or fixed values if not auto. + this.data.data.attribs.mov.value = this.rawMov + this.data.data.attribs.db.value = this.rawDb + this.data.data.attribs.build.value = this.rawBuild + + // For vehicle only : + this.data.data.attribs.build.current = this.hp + + // 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 + // } + } + super.prepareBaseData() + } + + /** + * @override + * Prepare all embedded Document instances which exist within this primary Document. + * @memberof ClientDocumentMixin# + * active effects are applied + */ + prepareEmbeddedDocuments () { + super.prepareEmbeddedDocuments() + } + + /** + * @override + * Apply transformations or derivations to the values of the source data object. + * Compute data fields whose values are not stored to the database. + * @memberof ClientDocumentMixin# + */ + prepareDerivedData () { + if (['character', 'npc', 'creature'].includes(this.type)) { + super.prepareDerivedData() + // Set hpMax, mpMax, sanMax, mov, db, build. This is to allow calculation of derived value with modifed characteristics. + this.data.data.attribs.mov.value = this.rawMov + this.data.data.attribs.db.value = this.rawDb + this.data.data.attribs.build.value = this.rawBuild + + this.data.data.attribs.hp.max = this.rawHpMax + if (this.hp === null) this.data.data.attribs.hp.value = this.rawHpMax + + this.data.data.attribs.mp.max = this.rawMpMax + if (this.mp === null) this.data.data.attribs.mp.value = this.rawMpMax + + this.data.data.attribs.san.max = this.rawSanMax + if (this.san === null) this.data.data.attribs.san.value = this.rawSanMax + + // Apply effects to automaticaly calculated values. + const filterMatrix = [] + + if (this.data.data.attribs.hp.auto) filterMatrix.push('data.attribs.hp.max') + if (this.data.data.attribs.mp.auto) filterMatrix.push('data.attribs.mp.max') + if (this.data.data.attribs.san.auto) filterMatrix.push('data.attribs.san.max') + if (this.data.data.attribs.mov.auto) filterMatrix.push('data.attribs.mov.value') + if (this.data.data.attribs.db.auto) filterMatrix.push('data.attribs.db.value') + if (this.data.data.attribs.build.auto) filterMatrix.push('data.attribs.build.value') + + const changes = this.effects.reduce((changes, e) => { + if (e.data.disabled || e.isSuppressed) return changes + return changes.concat( + e.data.changes.map(c => { + c = foundry.utils.duplicate(c) + c.effect = e + c.priority = c.priority ?? c.mode * 10 + return c + }) + ) + }, []) + changes.sort((a, b) => a.priority - b.priority) + + const selectChanges = changes.filter(e => filterMatrix.includes(e.key)) + + // Apply all changes + for (const change of selectChanges) { + change.effect.apply(this, change) + } + + if (this.hpMax && this.hpMax < this.hp) { this.data.data.attribs.hp.value = this.hpMax } + if (this.mpMax && this.mpMax < this.mp) { this.data.data.attribs.mp.value = this.mpMax } + if (this.sanMax && this.sanMax < this.san) { this.data.data.attribs.san.value = this.sanMax } + } + } + /** @override */ static async create (data, options = {}) { data.token = data.token || {} @@ -72,8 +242,15 @@ export class CoCActor extends Actor { }, { overwrite: false } ) - } else if (data.type === 'vehicle') { - data.img = 'systems/CoC7/assets/icons/jeep.svg' // Change the icon for vehicle + } else if (data.type === 'npc') { + data.img = 'systems/CoC7/assets/icons/cultist.svg' + } else if (data.type === 'creature') { + data.img = 'systems/CoC7/assets/icons/floating-tentacles.svg' + } else if (data.type === 'container') { + data.img = 'icons/svg/chest.svg' + mergeObject(data.token, { + actorLink: true + }) } return super.create(data, options) } @@ -171,7 +348,7 @@ export class CoCActor extends Actor { this.data.data.characteristics )) { characteristics[key] = { - key: key, + key, shortName: game.i18n.localize(value.short), label: game.i18n.localize(value.label), value: value.value, @@ -195,85 +372,16 @@ export class CoCActor extends Actor { } } - get boutOfMadness () { - return this.effects.find( - e => e.data.label === game.i18n.localize('CoC7.BoutOfMadnessName') - ) + get hasTempoInsane () { + return this.hasConditionStatus(COC7.status.tempoInsane) } - get insanity () { - return this.effects.find( - e => e.data.label === game.i18n.localize('CoC7.InsanityName') - ) + get getTempoInsaneDurationText () { + return this.hasConditionValue(COC7.status.tempoInsane, 'durationText') } - get isInABoutOfMadness () { - if (!this.boutOfMadness) return false - return !this.boutOfMadness.data.disabled - } - - get isInsane () { - if (!this.insanity) return false - return !this.insanity.data.disabled - } - - get sanity () { - const boutRealTime = !!this.boutOfMadness?.data.flags?.CoC7?.realTime - let duration = boutRealTime - ? this.boutOfMadness?.data?.duration?.rounds - : this.boutOfMadness?.data?.duration.seconds - if (!boutRealTime && duration) duration = Math.round(duration / 3600) - let indefiniteInstanity = !!this.insanity?.data.flags?.CoC7?.indefinite - let insaneDuration = indefiniteInstanity - ? null - : this.insanity?.data?.duration.seconds - if (!indefiniteInstanity && insaneDuration) { - insaneDuration = insaneDuration / 3600 - } - let boutDurationText = this.isInABoutOfMadness - ? boutRealTime - ? `${duration} ${game.i18n.localize('CoC7.rounds')}` - : `${duration} ${game.i18n.localize('CoC7.hours')}` - : null - const insanityDurationText = insaneDuration - ? this.isInsane - ? indefiniteInstanity - ? null - : `${insaneDuration} ${game.i18n.localize('CoC7.hours')}` - : null - : null - if (this.isInsane && !insanityDurationText && !indefiniteInstanity) { - indefiniteInstanity = true - } - if (!duration) boutDurationText = '' - - return { - boutOfMadness: { - active: this.isInABoutOfMadness, - realTime: this.isInABoutOfMadness ? boutRealTime : undefined, - summary: this.isInABoutOfMadness ? !boutRealTime : undefined, - duration: this.isInABoutOfMadness ? duration : undefined, - durationText: boutDurationText || '', - hint: this.isInABoutOfMadness - ? `${game.i18n.localize('CoC7.BoutOfMadness')}${ - boutDurationText ? ': ' + boutDurationText : '' - }` - : game.i18n.localize('CoC7.BoutOfMadness') - }, - underlying: { - active: this.isInsane, - indefintie: this.isInsane ? indefiniteInstanity : undefined, - duration: insaneDuration, - durationText: insanityDurationText || '', - hint: this.isInsane - ? indefiniteInstanity - ? game.i18n.localize('CoC7.IndefiniteInsanity') - : `${game.i18n.localize( - 'CoC7.TemporaryInsanity' - )} ${insanityDurationText || ''}` - : game.i18n.localize('CoC7.NotInsane') - } - } + get hasIndefInsane () { + return this.hasConditionStatus(COC7.status.indefInsane) } get portrait () { @@ -308,7 +416,7 @@ export class CoCActor extends Actor { result.tableRoll = await boutOfMadnessTable.roll() if (typeof result.tableRoll.results[0] !== 'undefined') { if ( - CONST.TABLE_RESULT_TYPES.ENTITY === + CONST.TABLE_RESULT_TYPES.DOCUMENT === result.tableRoll.results[0].data.type ) { const item = game.items.get(result.tableRoll.results[0].data.resultId) @@ -320,10 +428,7 @@ export class CoCActor extends Actor { )}` result.name = item.name delete item.data._id - /** MODIF 0.8.x **/ - // await this.createOwnedItem( item.data); await this.createEmbeddedDocuments('Item', [item.data]) - /*****************/ } else { ui.notifications.error( game.i18n.localize('CoC7.MessageBoutOfMadnessItemNotFound') @@ -348,95 +453,17 @@ export class CoCActor extends Actor { // If it's not a real time no need to activate the bout if (!realTime) return result - if (this.boutOfMadness) { - await this.boutOfMadness.update({ - disabled: false, - duration: { - rounds: realTime && duration ? duration : undefined, - seconds: realTime ? undefined : duration * 3600, - turns: 1 - }, - flags: { - CoC7: { - realTime: realTime - } - } - }) - } else { - // const effectData = - await super.createEmbeddedDocuments('ActiveEffect', [ - { - label: game.i18n.localize('CoC7.BoutOfMadnessName'), - icon: 'systems/CoC7/assets/icons/hanging-spider.svg', - origin: this.uuid, - duration: { - rounds: realTime && duration ? duration : undefined, - seconds: realTime ? undefined : duration * 3600, - turns: 1 - }, - flags: { - CoC7: { - madness: true, - realTime: realTime - } - }, - // tint: '#ff0000', - disabled: false - } - ]) - // const effect = this.effects.get( effectData._id); - // effect.sheet.render(true); - } + this.setCondition(COC7.status.tempoInsane, { + realTime, + duration + }) + // const effect = this.effects.get( effectData._id); // effect.sheet.render(true); return result } - async enterInsanity (indefinite = true, duration = undefined) { - if (this.insanity) { - await this.insanity.update({ - disabled: false, - duration: { - seconds: !indefinite && duration ? duration * 3600 : undefined, - turns: 1 - }, - flags: { - CoC7: { - indefinite: indefinite - } - } - }) - } else { - await super.createEmbeddedDocuments('ActiveEffect', [ - { - label: game.i18n.localize('CoC7.InsanityName'), - icon: 'systems/CoC7/assets/icons/tentacles-skull.svg', - origin: this.uuid, - duration: { - seconds: !indefinite && duration ? duration * 3600 : undefined, - turns: 1 - }, - flags: { - CoC7: { - madness: true, - indefinite: indefinite - } - }, - disabled: false - } - ]) - } - } - - async exitBoutOfMadness () { - return await this.boutOfMadness?.delete() - } - - async exitInsanity () { - return await this.insanity?.delete() - } - /** * Called upon new actor creation. * @param {*} data @@ -450,24 +477,82 @@ export class CoCActor extends Actor { // return super.create(data, options); // } - /** @override */ - async createSkill (skillName, value, showSheet = false) { + static emptySkill ( + skillName, + value, + { + rarity = false, + push = true, + combat = false, + img = false, + specialization = false + } = {} + ) { const data = { name: skillName, type: 'skill', data: { - value: value, + value, + skillName, + specialization: '', properties: { special: false, - rarity: false, - push: true, - combat: false + rarity, + push, + combat } } } + if (img !== false) { + data.img = img + } + if (specialization !== false) { + const parts = CoC7Item.getNamePartsSpec(skillName, specialization) + data.data.specialization = parts.specialization + data.data.skillName = parts.skillName + data.name = parts.name + data.data.properties.special = true + } + return data + } + + /** + * Clean list of skills by removing specialization from name + */ + // async cleanSkills () { + // Dialog.confirm({ + // title: `${game.i18n.localize('CoC7.CleanSkillList')}`, + // content: `

                                                        ${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 += '

                                                        ' - const speaker = { actor: this.actor } - await chatHelper.createMessage(title, message, { speaker: speaker }) + const speaker = { actor: this } + await chatHelper.createMessage(skillsRolled ? title : '', message, { + speaker + }) + this.onlyRunOncePerSession = true } - return { failure: failure, success: success } + return { failure, success } } async developLuck (fastForward = false) { - const luck = this.data.data.attribs.lck - const upgradeRoll = new Roll('1D100') + const currentLuck = this.data.data.attribs.lck.value + if (!currentLuck) await this.update({ 'data.attribs.lck.value': 0 }) + const pulpRuleDevelopmentRollLuck = game.settings.get( + 'CoC7', + 'pulpRuleDevelopmentRollLuck' + ) + const upgradeRoll = (await new Roll('1D100').roll({ async: true })).total + const higherThanCurrentLuck = upgradeRoll > currentLuck + let augmentRoll + if (pulpRuleDevelopmentRollLuck) { + higherThanCurrentLuck + ? (augmentRoll = '2D10+10') + : (augmentRoll = '1D10+5') + } else if (higherThanCurrentLuck) { + augmentRoll = '1D10' + } const title = game.i18n.localize('CoC7.RollLuck4Dev') let 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 + '

                                                        ' + message.actorTo = await new Promise(resolve => { + const dlg = new Dialog({ + title: game.i18n.localize('CoC7.MessageTitleSelectUserToGiveTo'), + content, + buttons: { + confirm: { + label: game.i18n.localize('CoC7.Validate'), + callback: html => { + const formData = new FormData( + html[0].querySelector('#selectform') + ) + for (const [name, value] of formData) { + if (name === 'user') { + return resolve(value) + } + } + } + } + }, + default: 'confirm', + close: () => {} + }) + dlg.render(true) }) + await game.CoC7socket.executeAsGM('gmtradeitemto', message) + } + + _onDragStart (event) { + super._onDragStart(event) + if (this.token) { + const dragData = JSON.parse(event.dataTransfer.getData('text/plain')) + dragData.tokenUuid = this.token.uuid + dragData.tokenId = this.token.id + dragData.sceneId = this.token.parent.id + event.dataTransfer.setData('text/plain', JSON.stringify(dragData)) + } } _onDragCharacteristic (event) { @@ -931,7 +1193,11 @@ export class CoC7ActorSheet extends ActorSheet { hasPlayerOwner: this.actor.hasPlayerOwner, actorKey: this.actor.actorKey, name: box.dataset.characteristic, - icon: null + icon: null, + document: { + type: this.document.type, + uuid: this.document.uuid + } } event.originalEvent.dataTransfer.setData('text/plain', JSON.stringify(data)) @@ -947,7 +1213,11 @@ export class CoC7ActorSheet extends ActorSheet { hasPlayerOwner: this.actor.hasPlayerOwner, actorKey: this.actor.actorKey, name: box.dataset.attrib, - icon: null + icon: null, + document: { + type: this.document.type, + uuid: this.document.uuid + } } event.originalEvent.dataTransfer.setData('text/plain', JSON.stringify(data)) @@ -964,31 +1234,43 @@ export class CoC7ActorSheet extends ActorSheet { actorKey: this.actor.actorKey, sanMin: sanMin.innerText, sanMax: sanMax.innerText, - icon: null + icon: null, + document: { + type: this.document.type, + uuid: this.document.uuid + } } event.originalEvent.dataTransfer.setData('text/plain', JSON.stringify(data)) } async _onDrop (event) { + const dataString = event.dataTransfer.getData('text/plain') + const data = JSON.parse(dataString) + if (data.linkType === 'coc7-link') { + if (data.type === 'effect') { + const link = await CoC7Link.fromData(data) + if (link.data.effect) { + this.actor.createEmbeddedDocuments('ActiveEffect', [link.data.effect]) + } + } + } await super._onDrop(event) } - async _onStatusToggle (event) { + async _onConditionToggle (event) { event.preventDefault() - if (event.currentTarget.dataset.status) { - await this.actor.toggleStatus(event.currentTarget.dataset.status) - } else if (event.currentTarget.dataset.effect) { - await this.actor.toggleEffect(event.currentTarget.dataset.effect) + if (event.currentTarget.dataset.condition) { + await this.actor.toggleCondition(event.currentTarget.dataset.condition) } } async revive () { - if (game.user.isGM) this.actor.unsetStatus(COC7.status.dead) + if (game.user.isGM) this.actor.unsetCondition(COC7.status.dead) } async heal () { - if (game.user.isGM) this.actor.unsetStatus(COC7.status.dying) + if (game.user.isGM) this.actor.unsetCondition(COC7.status.dying) } async checkForDeath (event) { @@ -999,13 +1281,17 @@ export class CoC7ActorSheet extends ActorSheet { conCheck.toMessage(event.shiftKey) } + async _onDragTokenStart (event) { + const data = { + type: 'Token', + uuid: this.token.uuid + } + event.originalEvent.dataTransfer.setData('text/plain', JSON.stringify(data)) + } + async _onResetCounter (event) { event.preventDefault() - const counter = event.currentTarget.dataset.counter - const oneFifthSanity = - ' / ' + Math.floor(this.actor.data.data.attribs.san.value / 5) - this.actor.setOneFifthSanity(oneFifthSanity) - if (counter) this.actor.resetCounter(counter) + await this.actor.resetDailySanity() } async _onAutoToggle (event) { @@ -1043,6 +1329,7 @@ export class CoC7ActorSheet extends ActorSheet { event.preventDefault() const isLocked = this.actor.locked this.actor.locked = !isLocked + Hooks.call('actorLockClickedCoC7', [!isLocked]) } async _onFlagClicked (event) { @@ -1057,7 +1344,7 @@ export class CoC7ActorSheet extends ActorSheet { } async _onWheel (event) { - let value = parseInt(event.currentTarget.value) + let value = parseInt(event.currentTarget.value) || null if (event.deltaY > 0) { value = value === 0 ? 0 : value - 1 } @@ -1104,11 +1391,11 @@ export class CoC7ActorSheet extends ActorSheet { const div = $('
                                                        ') const labels = $('
                                                        ') - chatData.labels.forEach(p => + for (const p of chatData.labels) { labels.append( `
                                                        ${p.name} :${p.value}
                                                        ` ) - ) + } div.append(labels) div.append( @@ -1123,18 +1410,17 @@ export class CoC7ActorSheet extends ActorSheet { } const props = $('
                                                        ') - chatData.properties.forEach(p => + for (const p of chatData.properties) { props.append( `
                                                        ${game.i18n.localize(p)}
                                                        ` ) - ) + } div.append(props) li.append(div.hide()) CoC7Parser.bindEventsHandler(div) - div.slideDown(200) + div.slideDown(200, () => li.toggleClass('expanded')) } - li.toggleClass('expanded') // $(event.currentTarget).toggleClass('expanded'); } @@ -1149,18 +1435,25 @@ export class CoC7ActorSheet extends ActorSheet { const pannel = $(section).find(`.pannel.${pannelClass}`) // pannel.toggle(); if (pannel.hasClass('expanded')) { - pannel.slideUp(200) + // Could remove expanded class and use (pannel.is(':visible')) + pannel.slideUp(200, () => pannel.toggleClass('expanded')) } else { - pannel.slideDown(200) + pannel.slideDown(200, () => pannel.toggleClass('expanded')) } - pannel.toggleClass('expanded') } _onInventoryHeader (event) { event.preventDefault() - const li = $(event.currentTarget).parents('.inventory-section') - const details = li.find('ol') - details.toggle() + const li = $(event.currentTarget).siblings('li') + if (li.is(':visible')) li.slideUp(200) + else li.slideDown(200) + } + + _onItemHeader (event) { + event.preventDefault() + const ol = $(event.currentTarget).next('ol') + if (ol.is(':visible')) ol.slideUp(200) + else ol.slideDown(200) } async _onItemPopup (event) { @@ -1351,7 +1644,7 @@ export class CoC7ActorSheet extends ActorSheet { const range = event.currentTarget.closest('.weapon-damage').dataset.range const damageChatCard = new DamageCard({ fastForward: event.shiftKey, - range: range + range }) damageChatCard.actorKey = this.actor.tokenKey damageChatCard.itemId = itemId @@ -1362,82 +1655,25 @@ export class CoC7ActorSheet extends ActorSheet { async _onOpposedRoll (event) { event.preventDefault() - if (!event.altKey) { - // if( event.ctrlKey) ui.notifications.info('CTRL pressed!'); - const data = { - type: OpposedCheckCard.defaultConfig.type, - combat: event.currentTarget.classList?.contains('combat'), - action: 'new' - } - const roll = new CoC7Check() - roll.actor = - event.currentTarget.closest('form').dataset.tokenId || - event.currentTarget.closest('form').dataset.actorId - roll.characteristic = - event.currentTarget.parentElement.dataset.characteristic - roll.attribute = event.currentTarget.parentElement.dataset.attrib - roll.item = event.currentTarget.closest('.item')?.dataset.itemId - roll.weaponAltSkill = event.currentTarget.classList.contains( - 'alternativ-skill' - ) - roll.skillId = event.currentTarget.closest('.item')?.dataset.skillId - roll.rollMode = game.settings.get('core', 'rollMode') - roll.initiator = game.user.id - - if (roll.attrib === 'db') return - - if (!event.shiftKey) { - const usage = await RollDialog.create({ - disableFlatThresholdModifier: - event.metaKey || - event.ctrlKey || - event.keyCode === 91 || - event.keyCode === 224, // TODO: do we need this CTRL? - disableFlatDiceModifier: - event.metaKey || - event.ctrlKey || - event.keyCode === 91 || - event.keyCode === 224 - }) - if (usage) { - roll.diceModifier = Number(usage.get('bonusDice')) - roll.difficulty = Number(usage.get('difficulty')) - roll.flatDiceModifier = Number(usage.get('flatDiceModifier')) - roll.flatThresholdModifier = Number( - usage.get('flatThresholdModifier') - ) - } - } - - roll.denyPush = true // Opposed rolled can't be pushed. - - await roll._perform() + if (event.currentTarget.parentElement.dataset.attrib === 'db') return - data.roll = roll.JSONRollData + const data = { + rollType: CoC7ChatMessage.ROLL_TYPE_SKILL, + cardType: CoC7ChatMessage.CARD_TYPE_OPPOSED, + event, + actor: this.actor + } + if (event.currentTarget.classList.contains('characteristic-label')) { + data.rollType = CoC7ChatMessage.ROLL_TYPE_CHARACTERISTIC + } else if (event.currentTarget.classList.contains('attribute-label')) { + data.rollType = CoC7ChatMessage.ROLL_TYPE_ATTRIBUTE + } - OpposedCheckCard.dispatch(data) - } else { - const data = { - type: CombinedCheckCard.defaultConfig.type, - action: 'new' - } - const roll = new CoC7Check() - roll.actor = - event.currentTarget.closest('form').dataset.tokenId || - event.currentTarget.closest('form').dataset.actorId - roll.characteristic = - event.currentTarget.parentElement.dataset.characteristic - roll.attribute = event.currentTarget.parentElement.dataset.attrib - roll.skillId = event.currentTarget.closest('.item')?.dataset.skillId - roll.rollMode = game.settings.get('core', 'rollMode') - roll.initiator = game.user.id - - if (roll.attrib === 'db') return - - data.roll = roll.JSONRollData - - CombinedCheckCard.dispatch(data) + if (event.altKey) { + data.cardType = CoC7ChatMessage.CARD_TYPE_COMBINED } + + CoC7ChatMessage.trigger(data) } /** @@ -1446,99 +1682,20 @@ export class CoC7ActorSheet extends ActorSheet { * @private */ async _onRollCharacteriticTest (event) { - // FLATMODIF event.preventDefault() - - const actorId = event.currentTarget.closest('form').dataset.actorId - const tokenKey = event.currentTarget.closest('form').dataset.tokenId - const characteristic = - event.currentTarget.parentElement.dataset.characteristic - - if (isCtrlKey(event) && game.user.isGM) { - const linkData = { - check: 'check', - type: 'characteristic', - name: characteristic, - hasPlayerOwner: this.actor.hasPlayerOwner, - actorKey: this.actor.actorKey, - forceModifiers: event.shiftKey - } - if (game.settings.get('core', 'rollMode') === 'blindroll') { - linkData.blind = true - } - CoC7LinkCreationDialog.fromLinkData(linkData).then(dlg => - dlg.render(true) - ) - return - } - - let difficulty, modifier, flatDiceModifier, flatThresholdModifier - if (!event.shiftKey) { - const usage = await RollDialog.create({ - disableFlatThresholdModifier: - event.metaKey || - event.ctrlKey || - event.keyCode === 91 || - event.keyCode === 224, // TODO : This can be removed ? - disableFlatDiceModifier: - event.metaKey || - event.ctrlKey || - event.keyCode === 91 || - event.keyCode === 224 - }) - if (usage) { - modifier = Number(usage.get('bonusDice')) - difficulty = Number(usage.get('difficulty')) - flatDiceModifier = Number(usage.get('flatDiceModifier')) - flatThresholdModifier = Number(usage.get('flatThresholdModifier')) - } - } - - const check = new CoC7Check() - if (modifier !== 'undefined') check.diceModifier = modifier - if (typeof difficulty !== 'undefined') check.difficulty = difficulty - check.actor = !tokenKey ? actorId : tokenKey - check.flatDiceModifier = flatDiceModifier - check.flatThresholdModifier = flatThresholdModifier - check.standby = - game.settings.get('CoC7', 'stanbyGMRolls') && - game.user.isGM && - this.actor.hasPlayerOwner - await check.rollCharacteristic(characteristic) - check.toMessage() + if (event.currentTarget.classList.contains('flagged4dev')) return + CoC7ChatMessage.trigger({ + rollType: CoC7ChatMessage.ROLL_TYPE_CHARACTERISTIC, + cardType: CoC7ChatMessage.CARD_TYPE_NORMAL, + event, + actor: this.actor + }) } async _onRollAttribTest (event) { // FLATMODIFIER event.preventDefault() - const attrib = event.currentTarget.parentElement.dataset.attrib - - if (isCtrlKey(event) && game.user.isGM && ['lck', 'san'].includes(attrib)) { - const linkData = event.altKey - ? { - check: 'sanloss', - hasPlayerOwner: this.actor.hasPlayerOwner, - actorKey: this.actor.actorKey, - forceModifiers: event.shiftKey - } - : { - check: 'check', - type: 'attribute', - name: attrib, - hasPlayerOwner: this.actor.hasPlayerOwner, - actorKey: this.actor.actorKey, - forceModifiers: event.shiftKey - } - if (game.settings.get('core', 'rollMode') === 'blindroll') { - linkData.blind = true - } - CoC7LinkCreationDialog.fromLinkData(linkData).then(dlg => - dlg.render(true) - ) - return - } - if (attrib === 'db') { if ( !/^-{0,1}\d+$/.test( @@ -1559,68 +1716,15 @@ export class CoC7ActorSheet extends ActorSheet { return } - if (attrib === 'lck') { - if (!this.actor.data.data.attribs.lck.value) return // If luck is null, 0 or non defined stop there. - } - - const actorId = event.currentTarget.closest('form').dataset.actorId - const tokenKey = event.currentTarget.closest('form').dataset.tokenId - - let difficulty, modifier, flatDiceModifier, flatThresholdModifier - if (!event.shiftKey) { - const usage = await RollDialog.create({ - disableFlatThresholdModifier: false, // TODO: Remove, deprecated. - disableFlatDiceModifier: false - }) // TODO: Remove, deprecated. - if (usage) { - modifier = Number(usage.get('bonusDice')) - difficulty = Number(usage.get('difficulty')) - flatDiceModifier = Number(usage.get('flatDiceModifier')) - flatThresholdModifier = Number(usage.get('flatThresholdModifier')) - } - } - - let sanMin, sanMax - if (event.altKey && attrib === 'san') { - const sanData = await SanDataDialog.create({ - promptLabel: false // TODO: Remove, deprecated. - }) - if (sanData) { - sanMin = sanData.get('sanMin') || 0 - sanMax = sanData.get('sanMax') || 0 - - if (!isNaN(Number(sanMin))) sanMin = Number(sanMin) - if (!isNaN(Number(sanMax))) sanMax = Number(sanMax) - } - } - - const isSanCheck = - typeof sanMin !== 'undefined' && typeof sanMax !== 'undefined' - - if (isSanCheck) { - SanCheckCard.create( - this.actor.actorKey, - { sanMin: sanMin, sanMax: sanMax }, - { - sanModifier: modifier, - sanDifficulty: difficulty, - fastForward: event.shiftKey - } - ) - } else { - const check = new CoC7Check() - if (typeof modifier !== 'undefined') check.diceModifier = modifier - if (typeof difficulty !== 'undefined') check.difficulty = difficulty - check.flatDiceModifier = flatDiceModifier - check.flatThresholdModifier = flatThresholdModifier - check.actor = !tokenKey ? actorId : tokenKey - check.standby = - game.settings.get('CoC7', 'stanbyGMRolls') && - game.user.isGM && - this.actor.hasPlayerOwner - await check.rollAttribute(attrib) - check.toMessage() - } + CoC7ChatMessage.trigger({ + rollType: CoC7ChatMessage.ROLL_TYPE_ATTRIBUTE, + cardType: + event.altKey && attrib === 'san' + ? CoC7ChatMessage.CARD_TYPE_SAN_CHECK + : CoC7ChatMessage.CARD_TYPE_NORMAL, + event, + actor: this.actor + }) } /** @@ -1628,61 +1732,15 @@ export class CoC7ActorSheet extends ActorSheet { * @param {Event} event The originating click event * @private */ - async _onRollSkillTest (event) { - // FLATMODIF - if (event.currentTarget.classList.contains('flagged4dev')) return + _onRollSkillTest (event) { event.preventDefault() - const skillId = event.currentTarget.closest('.item').dataset.skillId - const actorId = event.currentTarget.closest('form').dataset.actorId - const tokenKey = event.currentTarget.closest('form').dataset.tokenId - - if (isCtrlKey(event) && game.user.isGM) { - const name = this.actor.items.get(skillId)?.name - if (!name) return - const linkData = { - check: 'check', - type: 'skill', - name: name, - hasPlayerOwner: this.actor.hasPlayerOwner, - actorKey: this.actor.actorKey, - forceModifiers: event.shiftKey - } - if (game.settings.get('core', 'rollMode') === 'blindroll') { - linkData.blind = true - } - CoC7LinkCreationDialog.fromLinkData(linkData).then(dlg => - dlg.render(true) - ) - return - } - - let difficulty, modifier, flatDiceModifier, flatThresholdModifier - if (!event.shiftKey) { - const usage = await RollDialog.create({ - disableFlatThresholdModifier: false, - disableFlatDiceModifier: false - }) - if (usage) { - modifier = Number(usage.get('bonusDice')) - difficulty = Number(usage.get('difficulty')) - flatDiceModifier = Number(usage.get('flatDiceModifier')) - flatThresholdModifier = Number(usage.get('flatThresholdModifier')) - } - } - - const check = new CoC7Check() - if (typeof modifier !== 'undefined') check.diceModifier = modifier - if (typeof difficulty !== 'undefined') check.difficulty = difficulty - check.actor = !tokenKey ? actorId : tokenKey - check.skill = skillId - check.flatDiceModifier = flatDiceModifier - check.flatThresholdModifier = flatThresholdModifier - check.standby = - game.settings.get('CoC7', 'stanbyGMRolls') && - game.user.isGM && - this.actor.hasPlayerOwner - await check.roll() - check.toMessage() + if (event.currentTarget.classList.contains('flagged4dev')) return + CoC7ChatMessage.trigger({ + rollType: CoC7ChatMessage.ROLL_TYPE_SKILL, + cardType: CoC7ChatMessage.CARD_TYPE_NORMAL, + event, + actor: this.actor + }) } /** @override */ @@ -1713,6 +1771,14 @@ export class CoC7ActorSheet extends ActorSheet { async _updateObject (event, formData) { // ui.notifications.info('_updateObject'); // TODO: Replace with _getSubmitData(updateData={}) Cf. sheet.js(243) + const overrides = foundry.utils.flattenObject(this.actor.overrides) + const name = event?.currentTarget?.name + if (name && overrides && overrides[name]) { + ui.notifications.warn( + game.i18n.format('CoC7.EffectAppliedCantOverride', { name }) + ) + } + if (event.currentTarget) { if (event.currentTarget.classList) { if (event.currentTarget.classList.contains('skill-adjustment')) { @@ -1736,7 +1802,9 @@ export class CoC7ActorSheet extends ActorSheet { } } if (game.i18n.localize(COC7.creditRatingSkillName) === item.name) { - const creditValue = value || 0 + const creditValue = + (item.value || 0) - + (item.data.data.adjustments?.experience || 0) if ( creditValue > Number(this.actor.occupation.data.data.creditRating.max) || @@ -1761,7 +1829,17 @@ export class CoC7ActorSheet extends ActorSheet { if (event.currentTarget.classList.contains('attribute-value')) { // TODO : check why SAN only ? if (event.currentTarget.name === 'data.attribs.san.value') { - this.actor.setSan(parseInt(event.currentTarget.value)) + await this.actor.setSan( + parseInt(event.currentTarget.value) + ) + this.render(true) + return + } + if (event.currentTarget.name === 'data.attribs.hp.value') { + await this.actor.setHp( + parseInt(event.currentTarget.value) + ) + this.render(true) return } } @@ -1802,7 +1880,20 @@ export class CoC7ActorSheet extends ActorSheet { event.currentTarget.closest('.item').dataset.skillId ) if (item) { - await item.update({ name: event.currentTarget.value }) + const data = {} + if (item.data.data.properties.special) { + const parts = CoC7Item.getNamePartsSpec( + event.currentTarget.value, + item.data.data.specialization + ) + data.name = parts.name + data['data.skillName'] = parts.skillName + data['data.specialization'] = parts.specialization + } else { + data['data.skillName'] = event.currentTarget.value + data.name = event.currentTarget.value + } + await item.update(data) } } @@ -1899,7 +1990,9 @@ export class CoC7ActorSheet extends ActorSheet { await r.roll({ async: true }) if (isNaN(r.total) || typeof r.total === 'undefined') { ui.notifications.error( - event.currentTarget.value + ' is not a valid formula' + game.i18n.format('CoC7.ErrorUnableToParseFormula', { + value: event.currentTarget.value + }) ) } else { switch (event.currentTarget.dataset.range) { diff --git a/module/actors/sheets/character.js b/module/actors/sheets/character.js index 28a6854a..fad80a69 100644 --- a/module/actors/sheets/character.js +++ b/module/actors/sheets/character.js @@ -1,31 +1,170 @@ /* global $, FontFace, game, mergeObject, ui */ +import { CoC7ActorSheet } from './base.js' +import { CoC7CreateMythosEncounter } from '../../apps/create-mythos-encounters.js' -import { CoC7CharacterSheet } from './actor-sheet.js' +export class CoC7CharacterSheet extends CoC7ActorSheet { + _getHeaderButtons () { + if (this.constructor.name === 'CoC7CharacterSheet') { + if (!this.summarized) this.summarized = false + let buttons = super._getHeaderButtons() + buttons = [ + { + label: this.summarized + ? game.i18n.localize('CoC7.Maximize') + : game.i18n.localize('CoC7.Summarize'), + class: 'test-extra-icon', + icon: this.summarized + ? 'fas fa-window-maximize' + : 'fas fa-window-minimize', + onclick: event => this.toggleSheetMode(event) + } + ].concat(buttons) + return buttons + } + return super._getHeaderButtons() + } -export class CoC7CharacterSheetV2 extends CoC7CharacterSheet { - // constructor(...args) { - // super(...args); - // } + async toggleSheetMode (event) { + this.summarized = !this.summarized + await this.close() + const options = this.summarized + ? { + classes: ['coc7', 'actor', 'character', 'summarized'], + height: 200, + resizable: false, + width: 700 + } + : CoC7CharacterSheet.defaultOptions + await this.render(true, options) + } async getData () { const data = await super.getData() + if ( + this.isEditable && + typeof this.actor.getFlag('CoC7', 'skillListMode') === 'undefined' + ) { + await this.actor.setFlag('CoC7', 'skillListMode', false) + } + if ( + this.isEditable && + typeof this.actor.getFlag('CoC7', 'skillShowUncommon') === 'undefined' + ) { + await this.actor.setFlag('CoC7', 'skillShowUncommon', true) + } + data.skillListModeValue = + this.actor.getFlag('CoC7', 'skillListMode') ?? false + data.skillShowUncommon = + this.actor.getFlag('CoC7', 'skillShowUncommon') ?? true + data.showIconsOnly = game.settings.get('CoC7', 'showIconsOnly') - data.skillList = [] + 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.hasDevelopmentPhase = this.actor.hasDevelopmentPhase + + 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 monetarySymbol + if (!data.data.credit) { + factor = 1 + monetarySymbol = '$' + } else { + factor = parseInt(data.data.credit.multiplier) + ? parseInt(data.data.credit.multiplier) + : 1 + monetarySymbol = data.data.credit.monetarySymbol + ? data.data.credit.monetarySymbol + : '$' + } + + data.credit.spendingLevel = `${monetarySymbol}${this.actor.spendingLevel * + factor}` + data.credit.assets = `${monetarySymbol}${this.actor.assets * factor}` + data.credit.cash = `${monetarySymbol}${this.actor.cash * factor}` + } + data.oneBlockBackStory = game.settings.get('CoC7', 'oneBlockBackstory') + + data.summarized = this.summarized && !data.permissionLimited + data.skillList = [] let previousSpec = '' for (const skill of data.skills) { - if (skill.data.properties.special) { - if (previousSpec !== skill.data.specialization) { - previousSpec = skill.data.specialization - data.skillList.push({ - isSpecialization: true, - name: skill.data.specialization - }) + if (data.skillShowUncommon || !skill.data.properties.rarity) { + if (skill.data.properties.special) { + if (previousSpec !== skill.data.specialization) { + previousSpec = skill.data.specialization + data.skillList.push({ + isSpecialization: true, + name: skill.data.specialization + }) + } } + data.skillList.push(skill) } - data.skillList.push(skill) } - + data.skillsByValue = [...data.skills].sort((a, b) => { + return b.data.value - a.data.value + }) + data.topSkills = [...data.skillsByValue].slice(0, 14) + data.skillsByValue = data.skillsByValue.filter( + skill => data.skillShowUncommon || !skill.data.properties.rarity + ) + data.topWeapons = [...data.meleeWpn, ...data.rangeWpn] + .sort((a, b) => { + return a.data.skill.main?.value - b.data.skill.main?.value + }) + .reverse() + .slice(0, 3) data.displayPlayerName = game.settings.get( 'CoC7', 'displayPlayerNameOnSheet' @@ -37,6 +176,32 @@ export class CoC7CharacterSheetV2 extends CoC7CharacterSheet { } } + data.skillListEmpty = data.skills.length === 0 + + data.showInventoryItems = + Object.prototype.hasOwnProperty.call(data.itemsByType, 'item') || + !data.data.flags.locked + data.showInventoryBooks = + Object.prototype.hasOwnProperty.call(data.itemsByType, 'book') || + !data.data.flags.locked + data.showInventorySpells = + Object.prototype.hasOwnProperty.call(data.itemsByType, 'spell') || + !data.data.flags.locked + data.showInventoryTalents = + Object.prototype.hasOwnProperty.call(data.itemsByType, 'talent') || + (!data.data.flags.locked && game.settings.get('CoC7', 'pulpRuleTalents')) + data.showInventoryStatuses = + Object.prototype.hasOwnProperty.call(data.itemsByType, 'status') || + !data.data.flags.locked + + data.hasInventory = + data.showInventoryItems || + data.showInventoryBooks || + data.showInventorySpells || + data.showInventoryTalents || + data.showInventoryStatuses || + data.showInventoryWeapons + return data } @@ -47,11 +212,12 @@ export class CoC7CharacterSheetV2 extends CoC7CharacterSheet { static get defaultOptions () { return mergeObject(super.defaultOptions, { classes: ['coc7', 'sheetV2', 'actor', 'character'], - template: 'systems/CoC7/templates/actors/character-sheet-v2.html', + template: 'systems/CoC7/templates/actors/character/index.html', width: 687, height: 623, resizable: true, dragDrop: [{ dragSelector: '.item', dropSelector: null }], + scrollY: ['.right-panel .tab'], tabs: [ { navSelector: '.sheet-nav', @@ -62,101 +228,219 @@ export class CoC7CharacterSheetV2 extends CoC7CharacterSheet { }) } - // _onDragStart(event) { - // super._onDragStart(event); - // } + 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(async event =>{ + // event.preventDefault() + // event.stopPropagation() + // let value = Number( event.currentTarget?.value) + // if( !isNaN(value)) await this.actor.setHp(event) + // else ui.notifications.warn('Error parsing HP value') + // }) + html.find('.toggle-list-mode').click(event => { + this.toggleSkillListMode(event) + }) + html.find('.toggle-uncommon-mode').click(event => { + this.toggleSkillUncommonMode(event) + }) + if (game.user.isGM) { + html + .find('.sanity-loss-type-add') + .click(this._onAddSanityLossReason.bind(this)) + html + .find('.sanity-loss-type-delete') + .click(this._onDeleteSanityLossReason.bind(this)) + html + .find('.toggle-keeper-flags') + .click(this._onToggleKeeperFlags.bind(this)) + } + } + } + + _onToggleKeeperFlags (event) { + event.preventDefault() + switch (event.currentTarget.dataset.flag) { + case 'mythosInsanityExperienced': + this.actor.setFlag( + 'CoC7', + 'mythosInsanityExperienced', + !this.actor.mythosInsanityExperienced + ) + break + case 'mythosHardened': + this.actor.setFlag('CoC7', 'mythosHardened', !this.actor.mythosHardened) + break + } + } + + async _onAddSanityLossReason (event) { + event.preventDefault() + new CoC7CreateMythosEncounter( + { + actor: this.actor, + type: event.currentTarget.dataset.type + }, + {} + ).render(true) + } + + _onDeleteSanityLossReason (event) { + event.preventDefault() + const offset = $(event.currentTarget) + .closest('.flexrow') + .data('offset') + const sanityLossEvents = this.actor.data.data.sanityLossEvents ?? [] + sanityLossEvents.splice(offset, 1) + sanityLossEvents.sort(function (left, right) { + return left.type.localeCompare(right.type) + }) + this.actor.update({ 'data.sanityLossEvents': sanityLossEvents }) + } + + async toggleSkillListMode (event) { + await this.actor.setFlag( + 'CoC7', + 'skillListMode', + !this.actor.getFlag('CoC7', 'skillListMode') + ) + return await this.render(true) + } + + async toggleSkillUncommonMode (event) { + await this.actor.setFlag( + 'CoC7', + 'skillShowUncommon', + !this.actor.getFlag('CoC7', 'skillShowUncommon') + ) + return await this.render(true) + } + + 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) + } static renderSheet (sheet) { if (game.settings.get('CoC7', 'overrideSheetArtwork')) { if (game.settings.get('CoC7', 'artWorkSheetBackground')) { - sheet.element.css( - '--main-sheet-bg', - game.settings.get('CoC7', 'artWorkSheetBackground') - ) - // const borderImage = sheet.element.find('form').css('border-image'); - // sheet.element.find('form').css('border-image', ''); if ( - game.settings.get('CoC7', 'artWorkSheetBackgroundType') !== 'slice' + game.settings.get('CoC7', 'artWorkSheetBackground').toLowerCase() === + 'null' ) { - let styleSheet, cssRuleIndex - for (let i = 0; i < document.styleSheets.length; i++) { - if (document.styleSheets[i].href?.endsWith('coc7g.css')) { - styleSheet = document.styleSheets[i] - break + sheet.element.css( + '--main-sheet-bg', + "url( './assets/images/void.webp')" + ) + } else { + sheet.element.css( + '--main-sheet-bg', + game.settings.get('CoC7', 'artWorkSheetBackground') + ) + // const borderImage = sheet.element.find('form').css('border-image'); + // sheet.element.find('form').css('border-image', ''); + if ( + game.settings.get('CoC7', 'artWorkSheetBackgroundType') !== 'slice' + ) { + let styleSheet, cssRuleIndex + for (let i = 0; i < document.styleSheets.length; i++) { + if (document.styleSheets[i].href?.endsWith('coc7g.css')) { + styleSheet = document.styleSheets[i] + break + } } - } - if (styleSheet) { - for (let i = 0; i < styleSheet.rules.length; i++) { - if ( - styleSheet.rules[i].selectorText === '.sheetV2.character form' - ) { - cssRuleIndex = i - break + if (styleSheet) { + for (let i = 0; i < styleSheet.rules.length; i++) { + if ( + styleSheet.rules[i].selectorText === '.sheetV2.character form' + ) { + cssRuleIndex = i + break + } } } - } - if (cssRuleIndex) { - const CSSStyle = styleSheet.rules[cssRuleIndex].style - CSSStyle.removeProperty('border-image') - CSSStyle.setProperty( - 'background', - game.settings.get('CoC7', 'artWorkSheetBackground') - ) - switch (game.settings.get('CoC7', 'artWorkSheetBackgroundType')) { - case 'auto': - CSSStyle.setProperty('background-size', 'auto') - break - case 'contain': - CSSStyle.setProperty('background-size', 'contain') - break - case 'cover': - CSSStyle.setProperty('background-size', 'cover') - break - default: - CSSStyle.setProperty('background-size', 'auto') - break + if (cssRuleIndex) { + const CSSStyle = styleSheet.rules[cssRuleIndex].style + CSSStyle.removeProperty('border-image') + CSSStyle.setProperty( + 'background', + game.settings.get('CoC7', 'artWorkSheetBackground') + ) + switch (game.settings.get('CoC7', 'artWorkSheetBackgroundType')) { + case 'auto': + CSSStyle.setProperty('background-size', 'auto') + break + case 'contain': + CSSStyle.setProperty('background-size', 'contain') + break + case 'cover': + CSSStyle.setProperty('background-size', 'cover') + break + default: + CSSStyle.setProperty('background-size', 'auto') + break + } } } } - } else if ( - game.settings.get('CoC7', 'artWorkSheetBackground').toLowerCase() === - 'null' - ) { - sheet.element.css( - '--main-sheet-bg', - "url( './assets/images/void.webp')" - ) } if (game.settings.get('CoC7', 'artWorkOtherSheetBackground')) { - sheet.element.css( - '--other-sheet-bg', - game.settings.get('CoC7', 'artWorkOtherSheetBackground') - ) - } else if ( - game.settings - .get('CoC7', 'artWorkOtherSheetBackground') - .toLowerCase() === 'null' - ) { - sheet.element.css( - '--other-sheet-bg', - "url( './assets/images/void.webp')" - ) + if ( + game.settings + .get('CoC7', 'artWorkOtherSheetBackground') + .toLowerCase() === 'null' + ) { + sheet.element.css( + '--other-sheet-bg', + "url( './assets/images/void.webp')" + ) + } else { + sheet.element.css( + '--other-sheet-bg', + game.settings.get('CoC7', 'artWorkOtherSheetBackground') + ) + } } if (game.settings.get('CoC7', 'artworkSheetImage')) { - sheet.element.css( - '--main-sheet-image', - game.settings.get('CoC7', 'artworkSheetImage') - ) - } else if ( - game.settings.get('CoC7', 'artworkSheetImage').toLowerCase() === 'null' - ) { - sheet.element.css( - '--main-sheet-image', - "url( './assets/images/void.webp')" - ) + if ( + game.settings.get('CoC7', 'artworkSheetImage').toLowerCase() === + 'null' + ) { + sheet.element.css( + '--main-sheet-image', + "url( './assets/images/void.webp')" + ) + } else { + sheet.element.css( + '--main-sheet-image', + game.settings.get('CoC7', 'artworkSheetImage') + ) + } } if (game.settings.get('CoC7', 'artworkFrontColor')) { @@ -173,7 +457,7 @@ export class CoC7CharacterSheetV2 extends CoC7CharacterSheet { } if (game.settings.get('CoC7', 'artworkInteractiveColor')) { sheet.element.css( - '--main-sheet-interactie-color', + '--main-sheet-interactive-color', game.settings.get('CoC7', 'artworkInteractiveColor') ) } diff --git a/module/actors/sheets/container.js b/module/actors/sheets/container.js new file mode 100644 index 00000000..be94d91f --- /dev/null +++ b/module/actors/sheets/container.js @@ -0,0 +1,254 @@ +/* global $, ActorSheet, CONST, Dialog, FormData, game, mergeObject */ +import { CoC7Parser } from '../../apps/parser.js' +export class CoC7ContainerSheet extends ActorSheet { + /** + * 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', 'storage'], + template: 'systems/CoC7/templates/actors/storage-sheet.html', + width: 672, + height: 765, + dragDrop: [{ dragSelector: '.item', dropSelector: null }], + tabs: [ + { + navSelector: '.sheet-nav', + contentSelector: '.sheet-body', + initial: 'items' + } + ] + }) + } + + async _onDropFolder (event, data) { + if (!this.actor.isOwner) return [] + if (data.documentName !== 'Item') return [] + const folder = game.folders.get(data.id) + if (!folder) return [] + const items = folder.contents + .filter(item => ['book', 'item', 'spell', 'weapon'].includes(item.type)) + .map(item => item.toJSON()) + if (items.length > 0) { + await this.actor.createEmbeddedDocuments('Item', items) + } + } + + onCloseSheet () {} + + async getData () { + const data = await super.getData() + const sheetData = data.data + sheetData.isKeeper = game.user.isGM + sheetData.editable = this.isEditable + + sheetData.itemsByType = {} + if (data.items) { + for (const item of data.items) { + if ( + !Object.prototype.hasOwnProperty.call( + sheetData.itemsByType, + item.type + ) + ) { + sheetData.itemsByType[item.type] = [] + } + sheetData.itemsByType[item.type].push(item) + } + for (const itemType in sheetData.itemsByType) { + sheetData.itemsByType[itemType].sort((a, b) => { + return a.name.localeCompare(b.name) + }) + } + } + + sheetData.allowUnlock = + game.settings.get('CoC7', 'playerUnlockSheetMode') === 'always' || + game.user.isGM + + sheetData.showInventoryItems = + Object.prototype.hasOwnProperty.call(sheetData.itemsByType, 'item') || + !sheetData.data.flags.locked + sheetData.showInventoryBooks = + Object.prototype.hasOwnProperty.call(sheetData.itemsByType, 'book') || + !sheetData.data.flags.locked + sheetData.showInventorySpells = + Object.prototype.hasOwnProperty.call(sheetData.itemsByType, 'spell') || + !sheetData.data.flags.locked + sheetData.showInventoryTalents = + Object.prototype.hasOwnProperty.call(sheetData.itemsByType, 'talent') || + (!sheetData.data.flags.locked && + game.settings.get('CoC7', 'pulpRuleTalents')) + sheetData.showInventoryWeapons = + Object.prototype.hasOwnProperty.call(sheetData.itemsByType, 'weapon') || + !sheetData.data.flags.locked + + sheetData.hasInventory = + sheetData.showInventoryItems || + sheetData.showInventoryBooks || + sheetData.showInventorySpells || + sheetData.showInventoryTalents || + sheetData.showInventoryWeapons + + return sheetData + } + + activateListeners (html) { + super.activateListeners(html) + + 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('.inventory-header').click(this._onInventoryHeader.bind(this)) + + html.find('.item-trade').click(this._onTradeItem.bind(this)) + html.find('.show-detail').click(this._onItemSummary.bind(this)) + + html.find('.item-delete').click(async ev => { + const li = $(ev.currentTarget).parents('.item') + const itemToDelete = this.actor.items.get(li.data('itemId'), { + strict: true + }) + await itemToDelete.delete() + li.slideUp(200, () => this.render(false)) + }) + + html.find('.add-item').click(ev => { + switch (ev.currentTarget.dataset.type) { + 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) + break + } + }) + + html.find('.lock').click(this._onLockClicked.bind(this)) + } + + async _onLockClicked (event) { + event.preventDefault() + const isLocked = this.actor.locked + this.actor.locked = !isLocked + } + + 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 + '

                                                        ' + 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( + `
                                                        ${p.name} :${p.value}
                                                        ` + ) + } + div.append(labels) + + div.append( + $(`
                                                        ${chatData.description.value}
                                                        `) + ) + + if (item.data.data.properties?.spcl) { + const specialDiv = $( + `
                                                        ${chatData.description.special}
                                                        ` + ) + div.append(specialDiv) + } + + const props = $('
                                                        ') + for (const p of chatData.properties) { + props.append( + `
                                                        ${game.i18n.localize(p)}
                                                        ` + ) + } + div.append(props) + + li.append(div.hide()) + CoC7Parser.bindEventsHandler(div) + div.slideDown(200) + } + li.toggleClass('expanded') + // $(event.currentTarget).toggleClass('expanded'); + } + + _onInventoryHeader (event) { + event.preventDefault() + $(event.currentTarget).siblings('li').slideToggle(200) + } +} diff --git a/module/actors/sheets/creature-sheet.js b/module/actors/sheets/creature-sheet.js index 5e280b35..422e8291 100644 --- a/module/actors/sheets/creature-sheet.js +++ b/module/actors/sheets/creature-sheet.js @@ -1,148 +1,27 @@ -/* global game, mergeObject */ - -import { CoC7ActorSheet } from './base.js' -import { RollDialog } from '../../apps/roll-dialog.js' -import { CoC7Parser } from '../../apps/parser.js' -import { chatHelper } from '../../chat/helper.js' -import { SanCheckCard } from '../../chat/cards/san-check.js' +/* global mergeObject */ +import { CoC7NPCSheet } from './npc-sheet.js' /** * Extend the basic ActorSheet with some very simple modifications */ -export class CoC7CreatureSheet extends CoC7ActorSheet { +export class CoC7CreatureSheet extends CoC7NPCSheet { /** * 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() - // console.log('*********************CoC7CreatureSheet getdata***************'); - - // TODO : do we need that ? - data.allowFormula = true - data.displayFormula = this.actor.getActorFlag('displayFormula') - if (data.displayFormula === undefined) data.displayFormula = false - // await this.actor.creatureInit(); - data.hasSan = data.data.attribs.san.value !== null - data.hasMp = data.data.attribs.mp.value !== null - data.hasLuck = data.data.attribs.lck.value !== null - + data.isCreature = true return data } - activateListeners (html) { - super.activateListeners(html) - html.find('.roll-san').click(this._onSanCheck.bind(this)) - if (this.actor.isOwner) { - html - .find('[name="data.attribs.hp.value"]') - .change(event => this.actor.setHealthStatusManually(event)) - } - } - - async _onSanCheck (event) { - event.preventDefault() - if ( - !this.actor.data.data.special.sanLoss.checkPassed && - !this.actor.data.data.special.sanLoss.checkFailled - ) { - // ui.notifications.info('No sanity loss value'); - return - } - if ( - (event.metaKey || - event.ctrlKey || - event.keyCode === 91 || - event.keyCode === 224) && - game.user.isGM - ) { - let difficulty, modifier - if (!event.shiftKey) { - const usage = await RollDialog.create({ - disableFlatDiceModifier: true - }) - if (usage) { - modifier = Number(usage.get('bonusDice')) - difficulty = Number(usage.get('difficulty')) - } - } - const linkData = { - check: 'sanloss', - sanMin: this.actor.data.data.special.sanLoss.checkPassed, - sanMax: this.actor.data.data.special.sanLoss.checkFailled - } - if (game.settings.get('core', 'rollMode') === 'blindroll') { - linkData.blind = true - } - if (typeof modifier !== 'undefined') linkData.modifier = modifier - if (typeof difficulty !== 'undefined') linkData.difficulty = difficulty - const link = CoC7Parser.createCoC7Link(linkData) - if (link) { - chatHelper.createMessage( - null, - game.i18n.format('CoC7.MessageCheckRequestedWait', { - check: link - }) - ) - } - } else { - SanCheckCard.checkTargets(this.actor.tokenKey, event.shiftKey) - // CoC7SanCheck.checkTargets( this.actor.data.data.special.sanLoss.checkPassed, this.actor.data.data.special.sanLoss.checkFailled, event.shiftKey, this.tokenKey); - } - } - - onCloseSheet () { - this.actor.unsetActorFlag('displayFormula') - super.onCloseSheet() - } - - /* -------------------------------------------- */ - /** * Extend and override the default options used by the Actor Sheet * @returns {Object} */ - static get defaultOptions () { - const options = mergeObject(super.defaultOptions, { - template: 'systems/CoC7/templates/actors/creature-sheet.html', - width: 580, - classes: ['coc7', 'sheet', 'actor', 'npc', 'creature'], - dragDrop: [{ dragSelector: '.item', dropSelector: null }] + return mergeObject(super.defaultOptions, { + classes: ['coc7', 'sheet', 'actor', 'npc', 'creature'] }) - return options - } - - /** - * Implement the _updateObject method as required by the parent class spec - * This defines how to update the subject of the form when the form is submitted - * @private - */ - - async _updateObject (event, formData) { - if (event.currentTarget) { - if (event.currentTarget.classList) { - if (event.currentTarget.classList.contains('characteristic-score')) { - this.actor.setCharacteristic( - event.currentTarget.name, - event.currentTarget.value - ) - return - } - } - } - return super._updateObject(event, formData) - } - - static forceAuto (app, html) { - const cell = html.find('.description.pannel.expanded') - if (cell.length) { - cell.height(Math.max(130, html.height() - cell.position().top - 8) + 'px') - } - } - - setPosition (a) { - super.setPosition(a) - CoC7CreatureSheet.forceAuto(a, this._element) } } diff --git a/module/actors/sheets/npc-sheet.js b/module/actors/sheets/npc-sheet.js index 68a82864..9dc88475 100644 --- a/module/actors/sheets/npc-sheet.js +++ b/module/actors/sheets/npc-sheet.js @@ -1,6 +1,10 @@ -/* global mergeObject */ +/* global game, mergeObject */ import { CoC7ActorSheet } from './base.js' +import { RollDialog } from '../../apps/roll-dialog.js' +import { CoC7Parser } from '../../apps/parser.js' +import { chatHelper } from '../../chat/helper.js' +import { SanCheckCard } from '../../chat/cards/san-check.js' /** * Extend the basic ActorSheet with some very simple modifications @@ -22,15 +26,104 @@ export class CoC7NPCSheet extends CoC7ActorSheet { data.hasMp = data.data.attribs.mp.value !== null data.hasLuck = data.data.attribs.lck.value !== null + data.isCreature = false + + data.showInventoryItems = + Object.prototype.hasOwnProperty.call(data.itemsByType, 'item') || + !data.data.flags.locked + data.showInventoryBooks = + Object.prototype.hasOwnProperty.call(data.itemsByType, 'book') || + !data.data.flags.locked + data.showInventorySpells = + Object.prototype.hasOwnProperty.call(data.itemsByType, 'spell') || + !data.data.flags.locked + data.showInventoryTalents = + Object.prototype.hasOwnProperty.call(data.itemsByType, 'talent') || + (!data.data.flags.locked && game.settings.get('CoC7', 'pulpRuleTalents')) + data.showInventoryStatuses = + Object.prototype.hasOwnProperty.call(data.itemsByType, 'status') || + !data.data.flags.locked + data.showInventoryWeapons = false + data.hasInventory = + data.showInventoryItems || + data.showInventoryBooks || + data.showInventorySpells || + data.showInventoryTalents || + data.showInventoryStatuses || + data.showInventoryWeapons + return data } activateListeners (html) { super.activateListeners(html) - if (this.actor.isOwner) { - html - .find('[name="data.attribs.hp.value"]') - .change(event => this.actor.setHealthStatusManually(event)) + html.find('.roll-san').click(this._onSanCheck.bind(this)) + // if (this.actor.isOwner) { + // html + // .find('[name="data.attribs.hp.value"]') + // .change(event => this.actor.setHealthStatusManually(event)) + // } + } + + async _onSanCheck (event) { + event.preventDefault() + if ( + !this.actor.data.data.special.sanLoss.checkPassed && + !this.actor.data.data.special.sanLoss.checkFailled + ) { + // ui.notifications.info('No sanity loss value'); + return + } + if ( + (event.metaKey || + event.ctrlKey || + event.keyCode === 91 || + event.keyCode === 224) && + game.user.isGM + ) { + let difficulty, modifier + if (!event.shiftKey) { + const usage = await RollDialog.create({ + disableFlatDiceModifier: true + }) + if (usage) { + modifier = Number(usage.get('bonusDice')) + difficulty = Number(usage.get('difficulty')) + } + } + const linkData = { + check: 'sanloss', + sanMin: this.actor.data.data.special.sanLoss.checkPassed, + sanMax: this.actor.data.data.special.sanLoss.checkFailled, + sanReason: this.actor.data.data.infos.type?.length + ? this.actor.data.data.infos.type + : this.actor.name, + tokenKey: this.actor.actorKey + } + if (game.settings.get('core', 'rollMode') === 'blindroll') { + linkData.blind = true + } + if (typeof modifier !== 'undefined') linkData.modifier = modifier + if (typeof difficulty !== 'undefined') linkData.difficulty = difficulty + const link = CoC7Parser.createCoC7Link(linkData) + if (link) { + chatHelper.createMessage( + null, + game.i18n.format('CoC7.MessageCheckRequestedWait', { + check: link + }) + ) + } + } else { + const sanData = { + sanMax: this.actor.sanLossCheckFailled, + sanMin: this.actor.sanLossCheckPassed, + sanReason: this.actor.data.data.infos.type?.length + ? this.actor.data.data.infos.type + : this.actor.name, + tokenKey: this.actor.actorKey + } + SanCheckCard.checkTargets(sanData, event.shiftKey) } } @@ -42,7 +135,7 @@ export class CoC7NPCSheet extends CoC7ActorSheet { /* -------------------------------------------- */ /** - * Extend and override the default options used by the 5e Actor Sheet + * Extend and override the default options used by the Actor Sheet * @returns {Object} */ @@ -52,15 +145,41 @@ export class CoC7NPCSheet extends CoC7ActorSheet { dragDrop: [{ dragSelector: '.item', dropSelector: null }], template: 'systems/CoC7/templates/actors/npc-sheet.html', width: 580, - resizable: true + resizable: false, + minimizable: true }) } - static forceAuto (app, html) { - const cell = html.find('.description.pannel.expanded') - if (cell.length) { - cell.height(Math.max(200, html.height() - cell.position().top - 8) + 'px') + /** + * Implement the _updateObject method as required by the parent class spec + * This defines how to update the subject of the form when the form is submitted + * @private + */ + + async _updateObject (event, formData) { + if (event.currentTarget) { + if (event.currentTarget.classList) { + if (event.currentTarget.classList.contains('characteristic-score')) { + this.actor.setCharacteristic( + event.currentTarget.name, + event.currentTarget.value + ) + return + } + } } + return super._updateObject(event, formData) + } + + static forceAuto (app, html) { + html.height('auto') + // const cell = html.find('.pannel.expanded.resizededitor') + // if (cell.length) { + // cell.height( + // Math.max(200, (html.height() - cell.position().top - 8) / cell.length) + + // 'px' + // ) + // } } setPosition (a) { diff --git a/module/actors/sheets/vehicle.js b/module/actors/sheets/vehicle.js index 6bb644c0..b2667ba6 100644 --- a/module/actors/sheets/vehicle.js +++ b/module/actors/sheets/vehicle.js @@ -22,6 +22,9 @@ export class CoC7VehicleSheet extends CoC7ActorSheet { } async getData () { + // ui.notifications.warn( + // game.i18n.localize('CoC7.ExperimentalFeaturesWarning') + // ) const data = await super.getData() data.properties = [] diff --git a/module/actors/vehicle/data.js b/module/actors/vehicle/data.js new file mode 100644 index 00000000..06cc695c --- /dev/null +++ b/module/actors/vehicle/data.js @@ -0,0 +1,83 @@ +import { CoCActor } from '../actor.js' + +export class CoC7Vehicle extends CoCActor { + constructor (data, context) { + if (typeof data.img === 'undefined') { + data.img = 'systems/CoC7/assets/icons/jeep.svg' + } + super(data, context) + } + + get rawBuild () { + return this.build + } + + get build () { + const build = parseInt(this.data.data.attribs.build.value) + return isNaN(build) ? null : build + } + + get hp () { + 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 + } + + get hpMax () { + return this.build + } + + get rawHpMax () { + return this.build + } + + async setHp (value) { + if (value > this.build) value = this.build + return await this.update({ 'data.attribs.build.current': value }) + } + + get rawDb () { + return this.db + } + + get db () { + const db = parseInt(this.data.data.attribs.db?.value) + return isNaN(db) ? null : db + } + + get rawMov () { + return this.mov + } + + get mov () { + const mov = parseInt(this.data.data.attribs.mov?.value) + return isNaN(mov) ? null : mov + } + + get mpMax () { + return parseInt(this.data.data.attribs?.mp?.max) || 0 + } + + get rawMpMax () { + return this.mpMax + } + + get sanMax () { + return null + } + + get rawSanMax () { + return null + } +} diff --git a/module/apps/actor-importer-dialog.js b/module/apps/actor-importer-dialog.js index 24107346..87181cb5 100644 --- a/module/apps/actor-importer-dialog.js +++ b/module/apps/actor-importer-dialog.js @@ -1,14 +1,75 @@ -/* global $, Dialog, game, renderTemplate, ui */ +/* global $, CONFIG, FormApplication, game, Hooks, mergeObject, ui, FileReader */ import { CoC7ActorImporter } from './actor-importer.js' +import { CoC7DholeHouseActorImporter } from './dholehouse_importer.js' +import { CoC7ActorImporterRegExp } from './actor-importer-regexp.js' +import { CoC7Utilities } from '../utilities.js' + +export class CoC7ActorImporterDialog extends FormApplication { + /** @override */ + static get defaultOptions () { + return mergeObject(super.defaultOptions, { + classes: ['coc7', 'dialog', 'actor-importer'], + title: game.i18n.localize('CoC7.ActorImporter'), + template: 'systems/CoC7/templates/apps/actor-importer.html', + closeOnSubmit: false, + width: 600, + height: 'auto' + }) + } + + /** @override */ + async getData () { + const data = await super.getData() + + data.importType = data.object.importType + data.convert6E = data.object.convert6E + data.source = data.object.source + data.characterData = data.object.characterData + data.canUpload = game.user?.can('FILES_UPLOAD') + if (['npc', 'creature'].includes(data.importType)) { + data.languages = CoC7ActorImporterRegExp.getTranslations() + data.language = CoC7ActorImporterRegExp.checkLanguage( + data.object.language + ) + data.placeholder = CoC7ActorImporterRegExp.getExampleText(data.language) + } + + return data + } -export class CoC7ActorImporterDialog extends Dialog { activateListeners (html) { super.activateListeners(html) - html.on('submit', 'form', this._onSubmit.bind(this)) + + html.find('#dholehouse-character-preview').hide() + html + .find('#coc-entity-type,#coc-entity-lang') + .change(this._onChangeSubmit.bind(this)) + html + .find('#dholehouse-json-file-picker') + .change(this._onJSONFileSelected.bind(this)) + html - .find('option[value=coc-' + game.i18n.lang + ']') - .attr('selected', 'selected') + .find('#coc-pasted-character-data') + .on('keyup', function (e) { + const charactersTooExtended = $(this) + .val() + .match(/[\udbc0-\udbfe][\udc00-\udfff]/) + const prompt = $('#coc-prompt') + if (prompt.data('extended') && charactersTooExtended) { + prompt + .html(game.i18n.localize('CoC7.TextFieldInvalidCharacters')) + .addClass('error') + } else { + prompt.html(prompt.data('text')).removeClass('error') + } + }) + .trigger('keyup') + + html.find('.submit-button').click(this._onClickSubmit.bind(this)) + html.find('form').submit(e => { + e.preventDefault() + }) } /** @@ -16,90 +77,179 @@ export class CoC7ActorImporterDialog extends Dialog { * @returns getInputs extracts the data from the input fields and * adds a `.` at the end if it's not already there. */ - static async getInputs () { + static getInputs (form) { const inputs = {} - inputs.entity = $('#coc-entity-type') - .val() - .trim() - inputs.convertFrom6E = $('#coc-convert-6E') - .val() - .trim() - console.debug('entity type:', inputs.entity) - inputs.lang = $('#coc-entity-lang') - .val() - .trim() - let text = $('#coc-pasted-character-data') - .val() - .trim() - console.debug('received text', '##' + text + '##') - if (text[text.length] !== '.') { - text += '.' // Add a dot a the end to help the regex find the end + inputs.entity = form.find('#coc-entity-type').val().trim() + if (CONFIG.debug.CoC7Importer) { + console.debug('entity type:', inputs.entity) + } + if (form.find('#coc-convert-6E').length > 0) { + inputs.convertFrom6E = form.find('#coc-convert-6E').val().trim() + } + if (form.find('#coc-entity-lang').length > 0) { + inputs.lang = CoC7ActorImporterRegExp.checkLanguage( + form.find('#coc-entity-lang').val().trim() + ) + } + if (form.find('#source').length > 0) { + inputs.source = form.find('#source').val().trim() + } + if (form.find('#coc-pasted-character-data').length > 0) { + inputs.text = form.find('#coc-pasted-character-data').val().trim() + } + + if (CONFIG.debug.CoC7Importer) { + console.debug('received text', '##' + inputs.text + '##') } - inputs.text = text return inputs } + _onJSONFileSelected (event) { + const jsonFileInput = document.getElementById('dholehouse-json-file-picker') + const portraitImage = document.getElementById( + 'dholehouse-character-portrait' + ) + const characterName = document.getElementById('dholehouse-character-name') + const preview = document.getElementById('dholehouse-character-preview') + const file = jsonFileInput.files[0] + const dialog = this + const fileReader = new FileReader() + fileReader.onload = function (e) { + try { + dialog.characterJSON = JSON.parse(fileReader.result) + } catch (e) { + $('#coc-prompt') + .html(game.i18n.localize('CoC7.TextFieldInvalidJSON')) + .addClass('error') + event.preventDefault() + return + } + const personalDetails = + dialog.characterJSON?.Investigator?.PersonalDetails + if (!personalDetails) { + ui.notifications.error( + game.i18n.localize('CoC7.DholeHouseInvalidActor') + ) + return + } + characterName.textContent = personalDetails.Name + portraitImage.src = 'data:image/png;base64,' + personalDetails.Portrait + preview.style.display = 'block' + $('.dialog.actor-importer').height('auto') + } + fileReader.readAsText(file) + } + + _onChangeSubmit (event) { + this._onSubmit(event) + } + + async _onClickSubmit (event) { + const id = event.currentTarget.dataset.button + if (id === 'no') { + this.close() + } else if (id === 'getExampleNow') { + const content = CoC7ActorImporterRegExp.getExampleText( + this.object.language + ) + CoC7Utilities.copyToClipboard(content).then(() => { + return ui.notifications.info(game.i18n.localize('CoC7.Copied')) + }) + } else if (id === 'import') { + const app = $(event.currentTarget).closest('div.dialog.actor-importer') + app.hide() + const form = $(event.currentTarget).closest('form') + const inputs = CoC7ActorImporterDialog.getInputs(form) + if (inputs.entity === 'dholehouse' && this.characterJSON) { + const character = + await CoC7DholeHouseActorImporter.createNPCFromDholeHouse( + this.characterJSON, + { source: inputs.source } + ) + if (character !== false) { + if (CONFIG.debug.CoC7Importer) { + console.debug('character:', character) + } + ui.notifications.info( + game.i18n.format('CoC7.ActorImported', { + actorType: game.i18n.localize('CoC7.Entities.Character'), + actorName: character.data?.name + }) + ) + await character.sheet.render(true) + this.close() + } else { + app.show() + } + } else if (inputs.text && inputs.text !== '') { + CoC7ActorImporterDialog.importActor(inputs) + this.close() + } else { + app.show() + } + } + } + + /** @override + * A subclass of the FormApplication must implement the _updateObject method. + */ + async _updateObject (event, formData) { + this.object.importType = formData['coc-entity-type'] + this.object.characterData = formData['coc-pasted-character-data']?.trim() + if (typeof formData['coc-convert-6E'] !== 'undefined') { + this.object.convert6E = formData['coc-convert-6E'] + } + if (typeof formData['coc-entity-lang'] !== 'undefined') { + this.object.language = formData['coc-entity-lang'] + } + if (typeof formData.source !== 'undefined') { + this.object.source = formData.source + } + this.render(true) + } + /** * importActor imports an Actor using the dialog data * @param {html} html */ - static async importActor (html) { - console.debug('html', html) - const inputs = await CoC7ActorImporterDialog.getInputs() + static async importActor (inputs) { + if (inputs.text[inputs.text.length] !== '.') { + inputs.text += '.' // Add a dot a the end to help the regex find the end + } const actor = new CoC7ActorImporter() const createdActor = await actor.createActor(inputs) // Actor created, Notify the user and show the sheet. - console.debug('createdActor:', createdActor) + if (CONFIG.debug.CoC7Importer) { + console.debug('createdActor:', createdActor) + } ui.notifications.info( - 'Created ' + - createdActor.data?.type?.toUpperCase() + - ': ' + - createdActor.data?.name + game.i18n.format('CoC7.ActorImported', { + actorType: createdActor.data?.type?.toUpperCase(), + actorName: createdActor.data?.name + }) ) await createdActor.sheet.render(true) // const updated = await Updater.updateActor(npc) // console.debug('updated:', updated) } - async _onSubmit (event) { - event.preventDefault() - } + // /** + // * create it's the default web to crate the CoC7ActorImporterDialog + // */ + static async create (options = {}) { + options.importType = options.importType ?? 'npc' + options.language = + options.language ?? CoC7ActorImporterRegExp.checkLanguage(null) + options.convert6E = options.language ?? 'coc-guess' + options.source = options.source ?? 'iwms' + options.characterData = options.characterData ?? '' - /** - * create it's the default web to crate the CoC7ActorImporterDialog - * @param {} data can include a `title` for the dialog. - */ - static async create (data) { - const html = await renderTemplate( - 'systems/CoC7/templates/apps/actor-importer.html', - data - ) - return new Promise(resolve => { - const dlg = new CoC7ActorImporterDialog( - { - title: data.title, - content: html, - data: data, - buttons: { - import: { - icon: '', - label: game.i18n.localize('CoC7.Import'), - callback: CoC7ActorImporterDialog.importActor - }, - no: { - icon: '', - label: game.i18n.localize('CoC7.Cancel') - } - }, - default: 'import', - close: console.log('Closing:') - }, - { - classes: ['coc7', 'dialog', 'actor-importer'], - width: 600 - } - ) - dlg.render(true) - }) + new CoC7ActorImporterDialog(options).render(true) } } + +Hooks.once('ready', () => { + if (game.modules.get('CoC7-Importer-Tests')?.active) { + window.CoC7ActorImporter = CoC7ActorImporter + } +}) diff --git a/module/apps/actor-importer-regexp.js b/module/apps/actor-importer-regexp.js index 3557c2d9..ea75d893 100644 --- a/module/apps/actor-importer-regexp.js +++ b/module/apps/actor-importer-regexp.js @@ -1,241 +1,785 @@ /* global game */ +import { CoC7Utilities } from '../utilities.js' +/** + * nameCharacters list of characters that can be part of a [] for character, skill, or weapon names used in bracket expression. + * + * "keys..description" lang key to show in the language selection dialog box. + * "keys..dbNone" Regular expression to indicate no Damage Bonus e.g. DB: "dbNone". + * "keys..armorNone" Regular expression to indicate no Armour Bonus e.g. Armor: "armorNone". + * "keys..attacksPerRoundNone" Regular expression to indicate no attacks e.g. Attacks Per Round: "attacksPerRoundNone". + * "keys..sanLossNone" Regular expression to indicate no sanity loss e.g. SAN loss: "sanLossNone". + * "keys..fulldb" Regular expression to indicate damage bonus in attributes and weapon damage e.g. DB: "fulldb" / Weapon 50% (25/10), damage 1D6 + "fulldb". + * "keys..halfdb" Regular expression to indicate half damage bonus in weapon damage e.g. Weapon 50% (25/10), damage 1D6 + "halfdb". + * "keys..sectionCombats" Regular expression to indicate the start of the combat / weapon section of text. + * "keys..newCombatHeader" If there is no combat / weapon section, add this section were it probably is, this needs to matched by "keys..sectionCombats". + * "keys..sectionSkills" Regular expression to indicate the start of the skills section of text. + * "keys..sectionLangauges" Regular expression to indicate the start of the languages section of text. + * "keys..sectionSpells" Regular expression to indicate the start of the spells section of text. + * "keys..handgun" Regular expression to match NPC combat section weapon name is a handgun type. + * "keys..rifle" Regular expression to match NPC combat section weapon name is a rifle type. + * "keys..smb" Regular expression to match NPC combat section weapon name is a submachine gun type. + * "keys..machineGun" Regular expression to match NPC combat section weapon name is a machine gun type. + * "keys..launched" Regular expression to match NPC combat section weapon name is a launched type. + * "keys..example" String that should show as a placeholder example. + * + * "translations..age" Regular expression to match NPC age, named capturing group . + * "translations..occupation" Regular expression to match NPC occupation, named capturing group . + * "translations..str" Regular expression to match NPC strength characteristic, named capturing group . + * "translations..con" Regular expression to match NPC constitution characteristic, named capturing group . + * "translations..siz" Regular expression to match NPC size characteristic, named capturing group . + * "translations..int" Regular expression to match NPC intelligence characteristic, named capturing group . + * "translations..pow" Regular expression to match NPC power characteristic, named capturing group . + * "translations..dex" Regular expression to match NPC dexterity characteristic, named capturing group . + * "translations..app" Regular expression to match NPC appearance characteristic, named capturing group . + * "translations..edu" Regular expression to match NPC education characteristic, named capturing group . + * "translations..san" Regular expression to match NPC sanity points attribute, named capturing group . + * "translations..hp" Regular expression to match NPC hit points attribute, named capturing group . + * "translations..mp" Regular expression to match NPC magic points attribute, named capturing group . + * "translations..db" Regular expression to match NPC damage bonus attribute, named capturing group if matching "keys..dbNone" then 0. + * "translations..build" Regular expression to match NPC build attribute, named capturing group . + * "translations..armor" Regular expression to match NPC damage bonus attribute, named capturing group if matching "keys..armorNone" then 0. + * "translations..mov" Regular expression to match NPC movement rate attribute, named capturing group . + * "translations..lck" Regular expression to match NPC luck attribute, named capturing group . + * "translations..attacksPerRound" Regular expression to match NPC attacks per round, named capturing group if matching "keys..attacksPerRoundNone" then 0. + * "translations..sanLoss" Regular expression to match NPC san loss min/max, named capturing group if matching "keys..sanLossNone" then none. + * "translations..weapon" Regular expression to match NPC combat section, named capturing group weapon , optional , and . Damage can contain "keys..fulldb" and "keys..halfdb". + * "translations..weaponDodge" Regular expression to match NPC combat section dodge skill, named capturing group and . + * "translations..skill" Regular expression to match NPC skill section skill name, named capturing group and . + * "translations..guessStartCombat" Regular expression if there is no combat section find these are likely to be the first weapon name, "keys..newCombatHeader" is then added before it to get the groups + * + * These should not be edited as they should work as is + * "translations..name" Regular expression to match NPC name, named capturing group . + * "translations..sections" Regular expression to split text into combat, skill, language, and spells section + * + * If there is new functionality check for this string in the translations / keys for your language "NEW KEY BELOW - TRANSLATION REQUIRED" + */ +const nameCharacters = + '\\u3000\\u3400-\\u4DBF\\u4E00-\\u9FFF\\w\\(\\)\\-\\/&"\'' + + CoC7Utilities.quoteRegExp( + 'áéíóàèìòùÀÈÌÒÙáéíóúýÁÉÍÓÚÝâêîôûÂÊÎÔÛãñõÃĀÑÕäëïöüÿÄËÏÖÜŸàèçÇßØøÅåÆ朓”«»ąćęłńóśźżĄĆĘŁŃÓŚŹŻ' + ) -const accentedCharacters = regexquote( - 'áéíóàèìòùÀÈÌÒÙáéíóúýÁÉÍÓÚÝâêîôûÂÊÎÔÛãñõÃÑÕäëïöüÿÄËÏÖÜŸçÇßØøÅåÆæœ' -) - -// https://bitbucket.org/cggaertner/js-hacks/raw/master/quote.js -function regexquote (string) { - const len = string.length - let qString = "'" - - for (let current, i = 0; i < len; ++i) { - current = string.charAt(i) - - if (current >= ' ' && current <= '~') { - if (current === '\\' || current === "'") { - qString += '\\' - } - - qString += current - } else { - switch (current) { - case '\b': - qString += '\\b' - break - - case '\f': - qString += '\\f' - break - - case '\n': - qString += '\\n' - break - - case '\r': - qString += '\\r' - break - - case '\t': - qString += '\\t' - break - - case '\v': - qString += '\\v' - break - - default: - qString += '\\u' - current = current.charCodeAt(0).toString(16) - for (let j = 4; --j >= current.length; qString += '0'); - qString += current - } - } +const keys = { + en: { + description: 'CoC7.English', + dbNone: 'none', + armorNone: 'none', + attacksPerRoundNone: 'none', + sanLossNone: 'none', + fulldb: '(' + 'Damage Bonus|DB' + ')', + halfdb: '(' + '½|half' + ')', + sectionCombats: '\n(?:' + 'combat|fighting attacks' + ')[:\n]', + newCombatHeader: '\n' + 'Combat' + '\n', + sectionSkills: '\n(?:' + 'skills' + '(?:\\s*\\([^\\)]+\\))?)[:\n]', + sectionLangauges: '\n(?:' + 'languages' + ')[:\n]', + sectionSpells: '\n(?:' + 'spells' + ')[:\n]', + handgun: + '(?' + + ' Gun|Revolver|Pistol|Handgun|Derringer|Beretta|Luger|Desert Eagle| \\.38' + + ')', + rifle: + '(?' + 'Rifle|Shotgun|Carbine|Gauge |Lee-Enfield|Elephant' + ')', + smb: '(?' + 'Submachine Gun|Thompson' + ')', + machineGun: '(?' + 'Browning|Vickers' + ')', + launched: '(?' + 'Molotov|Grenade|Dynamite' + ')', + example: + 'Example Character, age 27\nSTR 75 CON 60 SIZ 80 DEX 70 APP 60 INT 80\nPOW 50 EDU 85 SAN 55 HP 14 DB: 1D4\nBuild: 1 Move: 7 MP: 10 Luck: 40 Armor: 1\nAttacks per round: 3 SAN loss: 1d4/1d8\nCombat\nBite 50% (25/10), damage 1D6\nBrawl 30% (15/6), damage 1D3\nDerringer 40% (20/8), damage 1D8+1\nDodge 50% (25/10)\nSkills\nAnimal Handling 55%, Charm 30%, First Aid 25%, Disguise 20%,\nListen 50%, Medicine 45%, Persuade 25%, Psychology 75%,\nScience (Astronomy) 90%, Science (Botany) 35%, Science (Zoology) 10%,\nSpot Hidden 35%, Stealth 10%\nLanguages: English 80%, Eklo 5%.\nSpells: Summon NPC, Dispel NPC.' + }, + de: { + description: 'CoC7.German', + dbNone: 'none', + armorNone: 'none', + attacksPerRoundNone: 'none', + sanLossNone: 'none', + diceShort: 'w|d', + fulldb: '(' + 'Schadensbonus|Sb' + ')', + halfdb: '(' + '½|1/2 Schadensbonus|Sb/2' + ')', + sectionCombats: '\n(?:' + 'Kampf|Angriff:|ANGRIFFE' + ')[:\n]', + newCombatHeader: '\n' + 'Kampf' + '\n', + sectionSkills: '\n(?:' + 'Fertigkeiten' + '(?:\\s*\\([^\\)]+\\))?)[:\n]', + sectionLangauges: '\n(?:' + 'Sprachen' + ')[:\n]', + sectionSpells: '\n(?:' + 'Zauber' + ')[:\n]', + handgun: + '(?' + + ' Gun|Revolver|Pistole|Handgun|Derringer|Beretta|Luger|Desert Eagle| \\.38' + + ')', + rifle: + '(?' + + 'Gewehr|Schrotflinte|Carabiner|Karabiner|Gauge |Lee-Enfield|Elefanten' + + ')', + smb: '(?' + 'Submachine Gun|Thompson' + ')', + machineGun: '(?' + 'Browning|Vickers' + ')', + launched: '(?' + 'Molotov|Granate|Dynamit' + ')', + example: + 'Vorname Nachname\nAlter: 29\nBeruf: Ein Beruf\nST 50\nMA 60\nKO 60\nGE 60\nGR 55\nER 65\nIN 80\nBI 85\nTrefferpunkte: 11\nGeistige Stabilität: 60\nSchadensbonus: 0\nStatur: 0\nMagiepunkte: 12\nBewegungsweite: 8\n\nKampf\nAngriffe: 1\nHandgemenge 30% (15/6), Schaden 1D3\nMesser 30% (15/6), Schaden 1D4\nAusweichen 30% (15/6)\n\nFertigkeiten: Anthropologie 70% (35/14), Archäologie 30% (15/6), Bibliotheksnutzung 50% (25/10), Erste Hilfe 50% (25/10), Finanzkraft 40% (20/8), Geschichte 60% (30/12), Klettern 50% (25/10)\n\nSprachen: Englisch 85% (42/17); Deutsch 45% (22/9), Latein 45% (22/9)' + }, + pl: { + description: 'CoC7.Polish', + dbNone: 'brak', + armorNone: 'brak', + attacksPerRoundNone: 'brak', + sanLossNone: 'brak', + diceShort: 'k|d', + fulldb: '(' + 'Modyfikator Obrażeń|MO' + ')', + halfdb: '(' + '½|1/2 MO|MO/2' + ')', + sectionCombats: '\n(?:' + 'Walka|Ataki' + ')[:\n]', + newCombatHeader: '\n' + 'Walka' + '\n', + sectionSkills: '\n(?:' + 'Umiejętności' + '(?:\\s*\\([^\\)]+\\))?)[:\n]', + sectionLangauges: '\n(?:' + 'Języki' + ')[:\n]', + sectionSpells: '\n(?:' + 'Zaklęcia' + ')[:\n]', + handgun: + '(?' + + ' Pistolet|Rewolwer|Derringer|Beretta|Luger|Desert Eagle| \\.38' + + ')', + rifle: + '(?' + + 'Karabin|Strzelba|Wiatrówka|Garand|Gauge |Lee-Enfield|Strzelba na słonie' + + ')', + smb: '(?' + 'Pistolet maszynowy|Thompson' + ')', + machineGun: '(?' + 'Browning|Vickers' + ')', + launched: '(?' + 'Mołotowa|Granat|Laska dynamitu|Dynamit' + ')', + example: + 'Przykładowa postać, 27 lat\nBibliotekarz\nS 75 KON 60 BC 80 ZR 70 WYG 60 INT 80\nMOC 50 WYK 85 P 55 PW 14 MO: 1D4\nKrzepa: 1 Ruch: 7 PM: 10 Szczęście: 40 Pancerz: 1\nAtaki w rundzie: 3 Utrata Poczytalności: 1K4/1K8\nWalka\nUgryzienie 50% (25/10), obrażenia 1K6\nWalka 30% (15/6), obrażenia 1K3\nDerringer 40% (20/8), obrażenia 1K8+1\nUnik 50% (25/10)\nUmiejętności\nTresura Zwierząt 55%, Urok Osobisty 30%, Pierwsza Pomoc 25%, Ukrywanie 20%,\nNasłuchiwanie 50%, Medycyna 45%, Przekonywanie 25%, Psychologia 75%,\nNauka (Astronomia) 90%, Nauka (Botanika) 35%, Nauka (Zoologia) 10%,\nSpostrzegawczość 35%, Ukrywanie 10%\nJęzyki: Angielski 80%, Eklo 5%.\nZaklęcia: Przyzwanie NPC, Odesłanie NPC.' + }, + fr: { + description: 'CoC7.French', + dbNone: 'Acune', + armorNone: '(?:Acune|aucune)', + attacksPerRoundNone: 'Acune', + sanLossNone: 'Acune', + fulldb: '(' + 'BD|Bonus aux dommages|Impact|Imp' + ')', + halfdb: '(' + '½|1/2 Imp|Imp/2' + ')', + sectionCombats: '\n(?:' + 'Combat|Armes|Attaques' + ')[:\n]', + newCombatHeader: '\n' + 'Combat' + '\n', + sectionSkills: '\n(?:' + 'Compétences' + '(?:\\s*\\([^\\)]+\\))?)[:\n]', + sectionLangauges: '\n(?:' + 'Langues?' + ')\\s*[:\n]', + sectionSpells: '\n(?:' + 'Sortilèges\\s*|Sorts' + ')[:\n]', + handgun: + '(?' + + 'Revolver|Pistolet|Derringer|Beretta|Luger|Desert Eagle| \\.38' + + ')', + rifle: '(?' + 'Carabine|Lee-Enfield|Fusil' + ')', + smb: '(?' + 'SMG|Thompson' + ')', + machineGun: '(?' + 'Browning|Vickers|Mitrailleuse' + ')', + launched: + '(?' + + 'Boomerang de guerre|Javeline|Pierre|Shuriken|Bâton de dynamite|Cocktail Molotov|Grenade à main|Molotov|Grenade|Dynamite' + + ')', + example: + 'Example Character, 27 ans\nFOR 75 CON 60 TAI 80 DEX 70 APP 60 INT 80\nPOU 50 ÉDU 85 SAN 55 PV 14 BD: 1D4\nCarrure: 1 Mvt: 7 PM: 10 Chance: 40 Armure: 1\nAttaques par round 3 Perte de SAN: 1d4/1d8\nAttaques\nBite 50% (25/10), dommage 1D6\nBrawl 30% (15/6), dommage 1D3\nDerringer 40% (20/8), dommage 1D8+1\nEsquiver 50% (25/10)\nCompétences\nAnimal Handling 55%, Charm 30%, First Aid 25%, Disguise 20%,\nListen 50%, Medicine 45%, Persuade 25%, Psychology 75%,\nScience (Astronomy) 90%, Science (Botany) 35%, Science (Zoology) 10%,\nSpot Hidden 35%, Stealth 10%\nLangue: English 80%, Eklo 5%.\nSortilèges: Summon NPC, Dispel NPC.' + }, + es: { + description: 'CoC7.Spanish', + dbNone: 'ninguna', + armorNone: 'ninguna', + attacksPerRoundNone: 'ninguno', + sanLossNone: 'no', + fulldb: '(' + 'BD|bd|bonificación de daño' + ')', + halfdb: '(' + '½|medio daño|mitad|daño a la mitad' + ')', + sectionCombats: '\n(?:' + 'Combate|Armas' + ')[:\n]', + newCombatHeader: '\n' + 'Combate' + '\n', + sectionSkills: '\n(?:' + 'Habilidades' + '(?:\\s*\\([^\\)]+\\))?)[:\n]', + sectionLangauges: '\n(?:' + 'Idiomas|Lenguajes|Lenguas' + ')[:\n]', + sectionSpells: '\n(?:' + 'Conjuros|Hechizos' + ')[:\n]', + handgun: + '(?' + + 'Revolver|Pistola|Derringer|Beretta|Luger|Desert Eagle| \\.38' + + ')', + rifle: + '(?' + + 'Rifle|Carabina|Lee-Enfield|Caza Elefantes|Fusil|Escopeta|Galga|Recortada' + + ')', + smb: '(?' + 'Subfusil|Thompson' + ')', + machineGun: '(?' + 'Browning|Vickers|Ametralladora' + ')', + launched: '(?' + 'Molotov|Granada|Dinamita' + ')', + example: + 'Example Character, 27 años\nFUE 75 CON 60 TAM 80 DES 70 APA 60 INT 80\nPOD 50 EDU 85 COR 55 PV 14 BD: 1D4\nCorpulencia: 1 Movimiento: 7 PM: 10 Suerte: 40 Armadura: 1\nNúmero de Ataques 3 Pérdida de cordura: 1d4/1d8\nCombate\nBite 50% (25/10), daño 1D6\nBrawl 30% (15/6), daño 1D3\nDerringer 40% (20/8), daño 1D8+1\nEsquivar 50% (25/10)\nHabilidades\nAnimal Handling 55%, Charm 30%, First Aid 25%, Disguise 20%,\nListen 50%, Medicine 45%, Persuade 25%, Psychology 75%,\nScience (Astronomy) 90%, Science (Botany) 35%, Science (Zoology) 10%,\nSpot Hidden 35%, Stealth 10%\nIdiomas: English 80%, Eklo 5%.\nConjuros: Summon NPC, Dispel NPC.' + }, + 'zh-TW': { + description: 'CoC7.TraditionalChinese', + dbNone: 'none', + armorNone: 'none', + attacksPerRoundNone: 'none', + sanLossNone: 'none', + fulldb: '(' + 'Damage Bonus|DB|傷害加值' + ')', + /* NEW KEY BELOW - TRANSLATION REQUIRED */ + halfdb: '(' + '½|half' + ')', + sectionCombats: + '\n(?:' + 'combat|fighting attacks|戰鬥技能|戰鬥列表|武器' + ')[:\n]', + newCombatHeader: '\n' + 'Combat' + '\n', + sectionSkills: + '\n(?:' + '(?:Skills|技能列表)' + '(?:\\s*\\([^\\)]+\\))?)[:\n]', + sectionLangauges: '\n(?:' + 'Languages|語言' + ')[:\n]', + sectionSpells: '\n(?:' + 'spells|咒文列表|咒文' + ')[:\n]', + handgun: + '(?' + + ' 遂發槍|\\.22短口自動手槍|\\.25短口手槍(單管)|\\.32或7\\.65mm左輪手槍|\\.32或7\\.65mm自動手槍|\\.357 Magnum左輪手槍|\\.38或9mm左輪手槍|\\.38自動手槍|貝雷塔M9|格洛克17|9mm自動手槍|魯格P08|\\.41左輪手槍|\\.44馬格南左輪手槍|\\.45左輪手槍|\\.45自動手槍|沙漠之鷹|Gun|Revolver|Pistol|Handgun|Derringer|Beretta|Luger|Desert Eagle| \\.38' + + ')', + rifle: + '(?' + + '步槍|卡賓槍|半自動步槍|獵象槍|Rifle|Shotgun|Carbine|Gauge |Lee-Enfield|Elephant' + + ')', + smb: '(?' + 'Submachine Gun|Thompson|衝鋒槍' + ')', + machineGun: '(?' + 'Browning|Vickers|機槍' + ')', + launched: '(?' + 'Molotov|Grenade|Dynamite爆炸物|手榴彈|重武器' + ')', + example: + '示範角色, 年齡 27\n力量 75 體質 60 體型 80 敏捷 70 外貎 60 智力 80\n意志 50 教育 85 SAN 55 HP 14 DB: 1D4\n體格: 1 Move: 7 MP: 10 幸運: 40 護甲: 1\n攻擊次數: 3 理智喪失: 1d4/1d8\n戰鬥列表\n咬 50% (25/10), 傷害 1D6\n空手 30% (15/6), 傷害 1D3\n手槍 40% (20/8), 傷害 1D8+1\n閃避 50% (25/10)\n技能列表\n動物馴養 55%, 取悅 30%, 急救 25%, 潛行 20%,\n聆聽 50%, 藥學 45%, 精神分析 25%, 心理學 75%,\n科學 (司法科學) 90%, 科學 (密碼學) 35%, \n偵查 35%, 喬裝 10%\n語言: 粵語 80%, 讀唇 5%.\n咒文: 召喚 NPC, 指揮 NPC.' } - - qString += "'" - return qString } -// Regular expressions to parse actors from an english source -const englishRegExp = { - nameRegExp: new RegExp( - '^[\\s\\n\\r]*(?[\\w\\s\\.\\/\\(\\)\\-' + accentedCharacters + ']+),' - ), - ageRegExp: /[, ]?\s*age:?\s+(\d+)/i, - strRegExp: /(?:STR):?\s+(\d+)/, - conRegExp: /CON:?\s+(\d+)/, - sizRegExp: /(?:SIZ):?\s+(\d+)/, - intRegExp: /INT:?\s+(\d+)/, - powRegExp: /(?:POW):?\s+(\d+)/, - dexRegExp: /(?:DEX):?\s+(\d+)/, - appRegExp: /(?:APP):?\s+(\d+)/, - eduRegExp: /EDU:?\s+(\d+)/, - sanRegExp: /(?:SAN|Sanity):?\s+(\d+)/, - hpRegExp: /(?:HP|Hit points):?\s+(\d+)/, - mpRegExp: /(?:MP|Magic points):?\s+(\d+)/, - dbRegExp: /(?:Damage Bonus|DB):?\s+([+-]?\d+(?:d\d+|D\d+)?)/i, - // attacksRegExp : /(?:Attacks|Combat):?\s+(.*)Spells/sim, - attacksRegExp: /(?:Attacks|Fighting|Combat):?\s+(.*)\.[\n|\r]?$/ims, - buildRegExp: /(?:Build):?\s+([+-]?\d+)/i, - armorRegExp: /(?:Armor):?\s+(none|\d+)/i, - moveRegExp: /(?:Move):?\s+(\d+)/i, - luckRegExp: /(?:Luck):?\s+(\d+)/i, - // spellsRegExp : /Spells:?\s+(.*)Skills/sim, - spellsRegExp: /(?:Spells):?\s+(.*)\.[\n|\r]?$/ims, - // skillsRegExp : /Skills:?\s+(.*)Languages/sim, - skillsRegExp: /(?:Skills):?\s+(.*)\.[\n|\r]?$/ims, - dodgeRegExp: /(?Dodge):?\s+\(?(?\d+)\)?\s*%/i, - // languagesRegExp : /Languages:?\s+(.*)\./sim, - languagesRegExp: /(?:Languages):?\s+(.*)\.[\n|\r]?$/ims, - skillRegExp: new RegExp( - '(?[\\w\\s\\(\\).\\/' + - accentedCharacters + - ']+) (?\\d+)%' - ), - attacksPerRoundRegExp: /(?:Attacks per round|# Attacks):?\s+(none|\d+)/i, - sanLossRegExp: /(?:Sanity loss|SAN loss):?\s+(none|\d[dD]?[+\d]*\/\d[dD][+\d]+)/i, - weaponRegExp: new RegExp( - '^(?[\\w\\s\\n\\(\\).\\/' + - accentedCharacters + - ']+):?[\\n\\r\\s]+(?\\d+)%,?\\s*(?:\\(\\d+\\/\\d+\\))?\\s*,?\\s*(?:damage)\\s+(?[\\d+\\+dD\\- ]+\\s*(DB|db|damage bonus)?)', - 'img' - ), - stopWords: '(Spells|Skills|Sanity loss|Languages|Armor|Attacks|Combat|)', - // Weapons regular expressions, - handgunRegExp: /( Gun|Revolver|Pistol|Handgun|Derringer|Beretta|Luger|Desert Eagle| .38)/i, - rifleRegExp: /(Rifle|Shotgun|Carbine|Gauge |Lee-Enfield|Elephant)/i, - smbRegExp: /(Submachine Gun|Thompson)/i, - machineGunRegExp: /(Browning|Vickers)/i, - launchedWeapons: /(Molotov|Grenade|Dynamite)/i +const translations = { + en: { + age: '(?\\d+)[,\\s]*', + occupation: + '[,\\s]*' + 'Occupation' + '(\\s*:)?\\s+(?.+)[,\\s\n]*', + str: '(?\\d+|-)[,\\s\n]*', + con: '(?\\d+|-)[,\\s\n]*', + siz: '(?\\d+|-)[,\\s\n]*', + int: '(?\\d+|-)[,\\s\n]*', + pow: '(?\\d+|-)[,\\s\n]*', + dex: '(?\\d+|-)[,\\s\n]*', + app: '(?\\d+|-)[,\\s\n]*', + edu: '(?\\d+|-)[,\\s\n]*', + san: + '(?\\d+|-)[,\\s\n]*', + hp: + '(?\\d+|-)[,\\s\n]*', + mp: + '(?\\d+|-)[,\\s\n]*', + db: + '(?[+-]?\\d+(?:d\\d+|D\\d+)?|' + + keys.en.dbNone + + ')[,\\s\n]*', + build: '(?[+-]?\\d+)[,\\s\n]*', + armor: + '(?' + + keys.en.armorNone + + '|\\d+)[,\\s\n]*', + mov: '(?\\d+)[,\\s\n]*', + lck: '(?\\d+|-)[,\\s\n]*', + attacksPerRound: + '(?' + + keys.en.attacksPerRoundNone + + '|\\d+(?!d))[,\\s\n]*', + sanLoss: + '(?' + + keys.en.sanLossNone + + '|\\dD?[+\\d]*\\/\\dD?[+\\d]*)[,\\s\n]*', + weapon: + '(^|\\n)(?[.\\t ' + + nameCharacters + + ']+)(\\**,?\\s+|\\*)(?:\\(|(?\\d+)%,?(?:\\s*\\(\\d+\\/\\d+\\)\\s*,?)?)?(\\s*' + + 'damage' + + ')?\\s+(?(:?(:?\\d+d)?\\d+(\\s*/\\s*|\\s*[+-]\\s*(?:' + + keys.en.fulldb + + '|' + + keys.en.halfdb + + ')\\s*|\\s*[+-]\\s*(:?\\d+d)?\\d+)*)+)\\)?', + weaponDodge: + '(?' + + 'Dodge' + + ')(\\s*:)?\\s+\\(?(?\\d+)\\)?\\s*%(?:\\s*\\(\\d+\\/\\d+\\))?', + // Skill should not be named "The player has" / "but they regenerate" required for "A Cold Fire Within" + skill: + '^(?[:\\*.\\s' + + nameCharacters + + ']+(?\\d+)[^d]%?\\)?(\\s*\\(\\d+/\\d+\\))?[\\.,]?\\s*', + guessStartCombat: '(^|(?[\\.\\s' + nameCharacters + ']+)[,\\s\n]+', + sections: + '(' + + keys.en.sectionCombats + + '|' + + keys.en.sectionSkills + + '|' + + keys.en.sectionLangauges + + '|' + + keys.en.sectionSpells + + ')' + }, + de: { + age: '(?\\d+)[,\\s]*', + occupation: '[,\\s]*' + 'Beruf' + '(\\s*:)?\\s+(?.+)[,\\s\n]*', + str: '(?\\d+|-)[,\\s\n]*', + con: '(?\\d+|-)[,\\s\n]*', + siz: '(?\\d+|-)[,\\s\n]*', + int: '(?\\d+|-)[,\\s\n]*', + pow: '(?\\d+|-)[,\\s\n]*', + dex: '(?\\d+|-)[,\\s\n]*', + app: '(?\\d+|-)[,\\s\n]*', + edu: '(?\\d+|-)[,\\s\n]*', + san: + '(?\\d+|-)[,\\s\n]*', + hp: + '(?\\d+|-)[,\\s\n]*', + mp: + '(?\\d+|-)[,\\s\n]*', + db: + '(?[+-]?\\d+(?:d\\d+|D|W\\d+)?|' + + keys.de.dbNone + + ')[,\\s\n]*', + build: + '(?[+-]?\\d+)[,\\s\n]*', + armor: + '(?' + + keys.de.armorNone + + '|\\d+)[,\\s\n]*', + mov: + '(?\\d+)[,\\s\n]*', + lck: '(?\\d+|-)[,\\s\n]*', + attacksPerRound: + '(?' + + keys.de.attacksPerRoundNone + + '|\\d+(?!d))[,\\s\n]*', + sanLoss: + '(?' + + keys.de.sanLossNone + + '|\\d[DW]?[+\\d]*\\/\\d[DW]?[+\\d]*)[,\\s\n]*', + weapon: + '(^|\\n)(?[.\\t ' + + nameCharacters + + ']+)(\\**,?\\s+|\\*)(?:\\(|(?\\d+)%,?(?:\\s*\\(\\d+\\/\\d+\\)\\s*,?)?)?(\\s*' + + 'Schaden' + + ')?\\s+(?(:?(:?\\d+w|d)?\\d+(\\s*/\\s*|\\s*[+-]\\s*(?:' + + keys.de.fulldb + + '|' + + keys.de.halfdb + + ')\\s*|\\s*[+-]\\s*(:?\\d+d|w)?\\d+)*)+)\\)?', + weaponDodge: + '(?' + + 'Ausweichen' + + ')(\\s*:)?\\s+\\(?(?\\d+)\\)?\\s*%(?:\\s*\\(\\d+\\/\\d+\\))?', + // Skill should not be named "The player has" / "but they regenerate" required for "A Cold Fire Within" + skill: + '^(?[:\\*.\\s' + + nameCharacters + + ']+(?\\d+)[^d]%?\\)?(\\s*\\(\\d+/\\d+\\))?[\\.,;]?\\s*', + guessStartCombat: + '(^|(?[\\.\\s' + nameCharacters + ']+)[,\\s\n]+', + sections: + '(' + + keys.de.sectionCombats + + '|' + + keys.de.sectionSkills + + '|' + + keys.de.sectionLangauges + + '|' + + keys.de.sectionSpells + + ')' + }, + pl: { + age: '(?\\d+)' + '\\s+(?:' + 'lata|lat|rok' + ')[,\\s]*', + occupation: '[,\\s]*' + 'Zawód' + '(\\s*:)?\\s+(?.+)[,\\s\n]*', + str: '(?\\d+|-)[,\\s\n]*', + con: '(?\\d+|-)[,\\s\n]*', + siz: '(?\\d+|-)[,\\s\n]*', + int: '(?\\d+|-)[,\\s\n]*', + pow: '(?\\d+|-)[,\\s\n]*', + dex: '(?\\d+|-)[,\\s\n]*', + app: '(?\\d+|-)[,\\s\n]*', + edu: '(?\\d+|-)[,\\s\n]*', + san: + '(?\\d+|-)[,\\s\n]*', + hp: + '(?\\d+|-)[,\\s\n]*', + mp: + '(?\\d+|-)[,\\s\n]*', + db: + '(?[+-]?\\d+(?:d\\d+|D|K\\d+)?|' + + keys.pl.dbNone + + ')[,\\s\n]*', + build: '(?[+-]?\\d+)[,\\s\n]*', + armor: + '(?' + + keys.pl.armorNone + + '|\\d+)[,\\s\n]*', + mov: '(?\\d+)[,\\s\n]*', + lck: '(?\\d+|-)[,\\s\n]*', + attacksPerRound: + '(?' + + keys.pl.attacksPerRoundNone + + '|\\d+(?!d))[,\\s\n]*', + sanLoss: + '(?' + + keys.pl.sanLossNone + + '|\\d[DK]?[+\\d]*\\/\\d[DK]?[+\\d]*)[,\\s\n]*', + weapon: + '(^|\\n)(?[.\\t ' + + nameCharacters + + ']+)(\\**,?\\s+|\\*)(?:\\(|(?\\d+)%,?(?:\\s*\\(\\d+\\/\\d+\\)\\s*,?)?)?(\\s*' + + 'obrażenia' + + ')?\\s+(?(:?(:?\\d+k|d)?\\d+(\\s*/\\s*|\\s*[+-]\\s*(?:' + + keys.pl.fulldb + + '|' + + keys.pl.halfdb + + ')\\s*|\\s*[+-]\\s*(:?\\d+d)?\\d+)*)+)\\)?', + weaponDodge: + '(?' + + 'Unik' + + ')(\\s*:)?\\s+\\(?(?\\d+)\\)?\\s*%(?:\\s*\\(\\d+\\/\\d+\\))?', + // Skill should not be named "The player has" / "but they regenerate" required for "A Cold Fire Within" + skill: + '^(?[:\\*.\\s' + + nameCharacters + + ']+(?\\d+)[^d]%?\\)?(\\s*\\(\\d+/\\d+\\))?[\\.,]?\\s*', + guessStartCombat: + '(^|(?[\\.\\s' + nameCharacters + ']+)[,\\s\n]+', + sections: + '(' + + keys.pl.sectionCombats + + '|' + + keys.pl.sectionSkills + + '|' + + keys.pl.sectionLangauges + + '|' + + keys.pl.sectionSpells + + ')' + }, + fr: { + age: '(?\\d+)\\s*' + 'ans' + '(?![a-z])[,\\s]*', + occupation: + '[,\\s]*' + 'Occupation' + '(\\s*:)?\\s+(?.+)[,\\s\n]*', + str: '(?\\d+|-)[,\\s\n]*', + con: '(?\\d+|-)[,\\s\n]*', + siz: '(?\\d+|-)[,\\s\n]*', + int: '(?\\d+|-)[,\\s\n]*', + pow: '(?\\d+|-)[,\\s\n]*', + dex: '(?\\d+|-)[,\\s\n]*', + app: '(?\\d+|-)[,\\s\n]*', + edu: '(?\\d+|-)[,\\s\n]*', + san: + '(?\\d+|-)[,\\s\n]*', + hp: + '(?\\d+|-)[,\\s\n]*', + mp: + '(?\\d+|-)[,\\s\n]*', + db: + '(?[+-]?\\d+(?:d\\d+|D\\d+)?|' + + keys.fr.dbNone + + ')[,\\s\n]*', + build: + '(?[+-]?\\d+)[,\\s\n]*', + armor: + '(?' + + keys.fr.armorNone + + '|\\d+)[,\\s\n]*', + mov: + '(?\\d+)[,\\s\n]*', + lck: '(?\\d+|-)[,\\s\n]*', + attacksPerRound: + '(?' + + keys.fr.attacksPerRoundNone + + '|\\d+(?!d))[,\\s\n]*', + sanLoss: + '(?' + + keys.fr.sanLossNone + + '|\\dD?[+\\d]*\\/\\dD?[+\\d]*)[,\\s\n]*', + weapon: + '(^|\\n)(?[.\\t ' + + nameCharacters + + ']+)(\\**,?\\s+|\\*)(?:\\(|(?\\d+)%,?(?:\\s*\\(\\d+\\/\\d+\\)\\s*,?)?)?(\\s*(?:' + + 'dommage|dégâts' + + '))?\\s+(?(:?(:?\\d+d)?\\d+(\\s*/\\s*|\\s*[+-]\\s*(?:' + + keys.fr.fulldb + + '|' + + keys.fr.halfdb + + ')\\s*|\\s*[+-]\\s*(:?\\d+d)?\\d+)*)+)\\)?', + weaponDodge: + '(?' + + 'Esquiver?' + + ')(\\s*:)?\\s+\\(?(?\\d+)\\)?\\s*%(?:\\s*\\(\\d+\\/\\d+\\))?', + skill: + '^(?[:\\*.\\s' + + nameCharacters + + ']+(?\\d+)[^d]%?\\)?(\\s*\\(\\d+/\\d+\\))?[\\.,]?\\s*', + guessStartCombat: + '(^|(?[\\.\\s' + nameCharacters + ']+)[,\\s\n]+', + sections: + '(' + + keys.fr.sectionCombats + + '|' + + keys.fr.sectionSkills + + '|' + + keys.fr.sectionLangauges + + '|' + + keys.fr.sectionSpells + + ')' + }, + es: { + age: '(?\\d+)\\s*' + 'a[ñÑ]os' + '(?![a-z])[,\\s]*', + occupation: + '[,\\s]*' + 'Ocupación' + '(\\s*:)?\\s+(?.+)[,\\s\n]*', + str: '(?\\d+|-)[,\\s\n]*', + con: '(?\\d+|-)[,\\s\n]*', + siz: '(?\\d+|-)[,\\s\n]*', + int: '(?\\d+|-)[,\\s\n]*', + pow: '(?\\d+|-)[,\\s\n]*', + dex: '(?\\d+|-)[,\\s\n]*', + app: '(?\\d+|-)[,\\s\n]*', + edu: '(?\\d+|-)[,\\s\n]*', + san: + '(?\\d+|-)[,\\s\n]*', + hp: + '(?\\d+|-)[,\\s\n]*', + mp: + '(?\\d+|-)[,\\s\n]*', + db: + '(?[+-]?\\d+(?:d\\d+|D\\d+)?|' + + keys.es.dbNone + + ')[,\\s\n]*', + build: + '(?[+-]?\\d+)[,\\s\n]*', + armor: + '(?' + + keys.es.armorNone + + '|\\d+)[,\\s\n]*', + mov: '(?\\d+)[,\\s\n]*', + lck: '(?\\d+|-)[,\\s\n]*', + attacksPerRound: + '(?' + + keys.es.attacksPerRoundNone + + '|\\d+(?!d))[,\\s\n]*', + sanLoss: + '(?' + + keys.es.sanLossNone + + '|\\dD?[+\\d]*\\/\\dD?[+\\d]*)[,\\s\n]*', + weapon: + '(^|\\n)(?[.\\t ' + + nameCharacters + + ']+)(\\**,?\\s+|\\*)(?:\\(|(?\\d+)%,?(?:\\s*\\(\\d+\\/\\d+\\)\\s*,?)?)?(\\s*' + + 'daño' + + ')?\\s+(?(:?(:?\\d+d)?\\d+(\\s*/\\s*|\\s*[+-]\\s*(?:' + + keys.es.fulldb + + '|' + + keys.es.halfdb + + ')\\s*|\\s*[+-]\\s*(:?\\d+d)?\\d+)*)+)\\)?', + weaponDodge: + '(?' + + 'Esquivar' + + ')(\\s*:)?\\s+\\(?(?\\d+)\\)?\\s*%(?:\\s*\\(\\d+\\/\\d+\\))?', + skill: + '^(?[:\\*.\\s' + + nameCharacters + + ']+(?\\d+)[^d]%?\\)?(\\s*\\(\\d+/\\d+\\))?[\\.,]?\\s*', + guessStartCombat: + '(^|(?[\\.\\s' + nameCharacters + ']+)[,\\s\n]+', + sections: + '(' + + keys.es.sectionCombats + + '|' + + keys.es.sectionSkills + + '|' + + keys.es.sectionLangauges + + '|' + + keys.es.sectionSpells + + ')' + }, + 'zh-TW': { + age: '(?\\d+)[,\\s]*', + /* NEW KEY BELOW - TRANSLATION REQUIRED */ + occupation: + '[,\\s]*' + 'Occupation' + '(\\s*:)?\\s+(?.+)[,\\s\n]*', + str: '(?\\d+|-)[,\\s\n]*', + con: '(?\\d+|-)[,\\s\n]*', + siz: '(?\\d+|-)[,\\s\n]*', + int: '(?\\d+|-)[,\\s\n]*', + pow: '(?\\d+|-)[,\\s\n]*', + dex: '(?\\d+|-)[,\\s\n]*', + app: '(?\\d+|-)[,\\s\n]*', + edu: '(?\\d+|-)[,\\s\n]*', + san: + '(?\\d+|-)[,\\s\n]*', + hp: + '(?\\d+|-)[,\\s\n]*', + mp: + '(?\\d+|-)[,\\s\n]*', + db: + '(?[+-]?\\d+(?:d\\d+|D\\d+)?|' + + keys['zh-TW'].dbNone + + ')[,\\s\n]*', + build: + '(?[+-]?\\d+)[,\\s\n]*', + armor: + '(?' + + keys['zh-TW'].armorNone + + '|\\d+)[,\\s\n]*', + mov: '(?\\d+)[,\\s\n]*', + lck: '(?\\d+|-)[,\\s\n]*', + attacksPerRound: + '(?' + + keys['zh-TW'].attacksPerRoundNone + + '|\\d+(?!d))[,\\s\n]*', + sanLoss: + '(?' + + keys['zh-TW'].sanLossNone + + '|\\dD?[+\\d]*\\/\\dD?[+\\d]*)[,\\s\n]*', + weapon: + '(^|\\n)(?[.\\t ' + + nameCharacters + + ']+)(\\**,?\\s+|\\*)(?:\\(|(?\\d+)%,?(?:\\s*\\(\\d+\\/\\d+\\)\\s*,?)?)?(\\s*(?:' + + 'damage|傷害' + + '))?\\s+(?(:?(:?\\d+d)?\\d+(\\s*/\\s*|\\s*[+-]\\s*(?:' + + keys['zh-TW'].fulldb + + '|' + + keys['zh-TW'].halfdb + + ')\\s*|\\s*[+-]\\s*(:?\\d+d)?\\d+)*)+)\\)?', + weaponDodge: + '(?' + + 'Dodge|閃避|閃躲' + + ')(\\s*:)?\\s+\\(?(?\\d+)\\)?\\s*%?(?:\\s*\\(\\d+\\/\\d+\\))?', + skill: + '^(?[:\\*.\\s' + + nameCharacters + + ']+(?\\d+)[^d]%?\\)?(\\s*\\(\\d+/\\d+\\))?[\\.,]?\\s*', + guessStartCombat: '(^|(?[\\.\\s' + nameCharacters + ']+)[,\\s\n]+', + sections: + '(' + + keys['zh-TW'].sectionCombats + + '|' + + keys['zh-TW'].sectionSkills + + '|' + + keys['zh-TW'].sectionLangauges + + '|' + + keys['zh-TW'].sectionSpells + + ')' + } } -// Regular expressions to parse actors from a french source -const frenchRegExp = { - nameRegExp: new RegExp( - '^[\\s\\n\\r]*(?[\\w\\s\\.\\/\\(\\)\\-' + accentedCharacters + ']+),' - ), - ageRegExp: /(\d+) ans/i, - strRegExp: /(?:FOR):?\s+(\d+)/, - conRegExp: /CON:?\s+(\d+)/, - sizRegExp: /(?:TAI):?\s+(\d+)/, - intRegExp: /INT:?\s+(\d+)/, - powRegExp: /(?:POU):?\s+(\d+)/, - dexRegExp: /(?:DEX):?\s+(\d+)/, - appRegExp: /(?:APP):?\s+(\d+)/, - eduRegExp: /ÉDU:?\s+(\d+)/, - sanRegExp: /(?:SAN|Santé Mentale):?\s+(\d+)/, - hpRegExp: /(?:PV|Points de vie):?\s+(\d+)/, - mpRegExp: /(?:PM|Points de magie):?\s+(\d+)/, - dbRegExp: /(?:BD|Bonus aux dommages|Impact|Imp):?\s+([+-]?\d+(?:d\d+|D\d+)?)/i, - attacksRegExp: /(?:Attaques|Armes|Combat):?\s+(.*)\.[\n|\r]?$/ims, - buildRegExp: /(?:Carrure):?\s+([+-]?\d+)/i, - armorRegExp: /(?:Armure):?\s+(Acune|\d+)/i, - moveRegExp: /(?:Mvt|Mouvement|Déplacement):?\s+(\d+)/i, - luckRegExp: /(?:Chance):?\s+(\d+)/i, - spellsRegExp: /(?:Sortilèges|Sorts):?\s+(.*)\.[\n|\r]?$/ims, - skillsRegExp: /(?:Compétences):?\s+(.*)\.[\n|\r]?$/ims, - dodgeRegExp: /(?Esquiver):?\s+\(?(?\d+)\)?\s*%/i, - languagesRegExp: /(?:Langue):?\s+(.*)\.[\n|\r]?$/ims, - skillRegExp: new RegExp( - '(?[\\w\\s\\(\\).\\/' + - accentedCharacters + - ']+) (?\\d+)%' - ), - attacksPerRoundRegExp: /(?:Attaques par round):?\s+(Acune|\d+)/i, - sanLossRegExp: /(?:Perte de [Santé mentale|SAN]):?\s+(no|\d[dD]?[+\d]*\/\d[dD][+\d]+)/i, - weaponRegExp: new RegExp( - '^(?[\\w\\s\\n\\(\\).\\/' + - accentedCharacters + - ']+):?[\\n\\r\\s]+(?\\d+)%,?\\s*(?:\\(\\d+\\/\\d+\\))?\\s*,?\\s*(?:dommage|dégâts)\\s+(?[\\d+\\+dD\\- ]+\\s*(Impact|Imp)?)', - 'img' - ), - stopWords: - '(Langue|Armure|Carrure|Perte de Santé mentale|Compétences|Combat|Armes|Attaques)', - // Weapons regular expressions, - handgunRegExp: /(Revolver|Pistolet|Derringer|Beretta|Luger|Desert Eagle| .38)/i, - rifleRegExp: /(Carabine|Lee-Enfield|Fusil)/i, - smbRegExp: /(SMG|Thompson)/i, - machineGunRegExp: /(Browning|Vickers|Mitrailleuse)/i, - launchedWeapons: /(Molotov|Grenade|Dynamite)/i -} +export class CoC7ActorImporterRegExp { + static checkLanguage (lang = null) { + if (!lang) { + lang = game.i18n.lang + } + if (typeof translations[lang] === 'undefined') { + lang = 'en' + } + return lang + } -// Regular expressions to parse actors from a spanish source -const spanishRegExp = { - nameRegExp: new RegExp( - '^[\\s\\n\\r]*(?[\\w\\s\\.\\/\\(\\)\\-' + accentedCharacters + ']+),' - ), - ageRegExp: /(\d+) a[ñÑ]os/i, - strRegExp: /(?:FUE):?\s+(\d+)/, - conRegExp: /CON:?\s+(\d+)/, - sizRegExp: /(?:TAM):?\s+(\d+)/, - intRegExp: /INT:?\s+(\d+)/, - powRegExp: /(?:POD):?\s+(\d+)/, - dexRegExp: /(?:DES):?\s+(\d+)/, - appRegExp: /(?:APA):?\s+(\d+)/, - eduRegExp: /EDU:?\s+(\d+)/, - sanRegExp: /(?:COR|Cordura):?\s+(\d+)/, - hpRegExp: /(?:PV|Puntos de vida|P\. ?V\.):?\s+(\d+)/, - mpRegExp: /(?:PM|Puntos Mágicos|Puntos de Magia):?\s+(\d+)/, - dbRegExp: /(?:BD):?\s+([+-]?\d+(?:d\d+|D\d+)?)/i, - attacksRegExp: /(?:Combate|Armas):?\s+(.*)\.[\n|\r]?$/ims, - buildRegExp: /(?:Corpulencia):?\s+([+-]?\d+)/i, - armorRegExp: /(?:Armadura):?\s+(ninguna|\d+)/i, - moveRegExp: /(?:Movimiento):?\s+(\d+)/i, - luckRegExp: /(?:Suerte):?\s+(\d+)/i, - spellsRegExp: /(?:Conjuros|Hechizos):?\s+(.*)\.[\n|\r]?$/ims, - skillsRegExp: /(?:Habilidades):?\s+(.*)\.[\n|\r]?$/ims, - dodgeRegExp: /(?Esquivar):?\s+\(?(?\d+)\)?\s*%/i, - languagesRegExp: /(?:Idiomas|Lenguajes|Lenguas):?\s+(.*)\.[\n|\r]?$/ims, - skillRegExp: new RegExp( - '(?[\\w\\s\\(\\).\\/' + - accentedCharacters + - ']+) (?\\d+)%' - ), - attacksPerRoundRegExp: /(?:Número de Ataques):?\s+(ninguno|\d+)/i, - sanLossRegExp: /(?:Pérdida de cordura|Pérdida de COR):?\s+(no|\d[dD]?[+\d]*\/\d[dD][+\d]+)/i, - weaponRegExp: new RegExp( - '^(?[\\w\\s\\n\\(\\).\\/' + - accentedCharacters + - ']+):?[\\n\\r\\s]+(?\\d+)%,?\\s*(?:\\(\\d+\\/\\d+\\))?\\s*,?\\s*(?:daño)\\s+(?[\\d+\\+dD\\- ]+\\s*(BD|bd|bonificación de daño)?)', - 'img' - ), - stopWords: - '(Conjuros|Habilidades|Pérdida de cordura|Idiomas|Lenguajes|Lenguas|Armadura|Combate|Armas)', - // Weapons regular expressions, - handgunRegExp: /(Revolver|Pistola|Derringer|Beretta|Luger|Desert Eagle| .38)/i, - rifleRegExp: /(Rifle|Carabina|Lee-Enfield|Caza Elefantes|Fusil|Escopeta|Galga|Recortada)/i, - smbRegExp: /(Subfusil|Thompson)/i, - machineGunRegExp: /(Browning|Vickers|Ametralladora)/i, - launchedWeapons: /(Molotov||Granada|Dinamita)/i -} + static getExampleText (lang) { + let example = keys.en.example + if (typeof keys[lang] !== 'undefined') { + example = keys[lang].example + } + return example + } -/** - * CoC7ActorImporterRegExp is a class to get the set of regular expressions corresponding on a language - */ -export class CoC7ActorImporterRegExp { - static get optionLangRegExp () { - return /coc-(?\w\w)/ + static getTranslations () { + const output = {} + for (const key in keys) { + output[key] = keys[key].description + } + return output } - constructor () { - this.RE = CoC7ActorImporterRegExp.getRegularExpressions(game.i18n.lang) + static getKeys (lang) { + return keys[lang] || keys.en } - /** - * getRegularExpressions returns the object with the regular expressions corresponding to the given language - * @param {string} lang language code for the regular expressions ("en", "es", "fr",...) - * @returns an object with the set of regular expressions - */ static getRegularExpressions (lang) { - console.debug('Set RegExp Lang: ', lang) - switch (lang) { - case 'es': - return spanishRegExp - case 'fr': - return frenchRegExp - } - // By default use english regular expressions. - return englishRegExp + return translations[lang] || translations.en } } diff --git a/module/apps/actor-importer.js b/module/apps/actor-importer.js index 6749dd23..f1e1787f 100644 --- a/module/apps/actor-importer.js +++ b/module/apps/actor-importer.js @@ -1,488 +1,982 @@ -/* global Actor, Folder, game, ui */ - -import { COC7 } from '../config.js' +/* global Actor, CONFIG, duplicate, game, ui */ import { CoC7ActorImporterRegExp } from './actor-importer-regexp.js' +import { CoCActor } from '../actors/actor.js' +import { CoC7Item } from '../items/item.js' +import { CoC7Utilities } from '../utilities.js' -// Default values - -/** - * defaultWeaponSkillAdjustments is an object with default values to use when creating a weapon skill - */ -const defaultWeaponSkillAdjustments = { - personal: null, - occupation: null, - archetype: null, - experience: null -} /** * CoC7ActorImporter helper class to import an Actor from the raw text description. */ export class CoC7ActorImporter { - // CoC7ActorImporterRgExp contains localized regular expressions to extract data from raw text + constructor () { + this.parsed = {} + this.itemLocations = '' + } + + static get asNumber () { + return 'n' + } - static get RE () { - return new CoC7ActorImporterRegExp().RE + static get asString () { + return 's' } /** - * parseCharacter extracts information from the raw text description of an entity (NPC or Creature) - * @param {String} text the raw text of the entity - * @returns extractedData object with the entity data + * getRegEx, get RegExp object if not currently a RegExp object + * @param {Mixed} regex RegExp or string + * @param {String} modifiers if string was supplied in regex list of modifiers to add to the RegExp + * @returns {RegExp} */ - async parseCharacter (text) { - const extractedData = {} - extractedData.name = this.processName(text) - extractedData.age = this.extractValue(text, this.RE.ageRegExp) - console.debug('age', extractedData.age) - extractedData.str = Number(this.extractValue(text, this.RE.strRegExp)) - extractedData.con = Number(this.extractValue(text, this.RE.conRegExp)) - extractedData.siz = Number(this.extractValue(text, this.RE.sizRegExp)) - extractedData.int = Number(this.extractValue(text, this.RE.intRegExp)) - extractedData.pow = Number(this.extractValue(text, this.RE.powRegExp)) - extractedData.dex = Number(this.extractValue(text, this.RE.dexRegExp)) - extractedData.app = Number(this.extractValue(text, this.RE.appRegExp)) - extractedData.edu = Number(this.extractValue(text, this.RE.eduRegExp)) - extractedData.san = Number(this.extractValue(text, this.RE.sanRegExp)) - extractedData.hp = Number(this.extractValue(text, this.RE.hpRegExp)) - extractedData.mp = Number(this.extractValue(text, this.RE.mpRegExp)) - extractedData.db = this.extractValue(text, this.RE.dbRegExp) - extractedData.build = this.extractValue(text, this.RE.buildRegExp) - extractedData.armor = this.extractValue(text, this.RE.armorRegExp) - console.debug('armor', extractedData.armor) - extractedData.mov = Number(this.extractValue(text, this.RE.moveRegExp)) - extractedData.lck = Number(this.extractValue(text, this.RE.luckRegExp)) - extractedData.sanLoss = this.extractValue(text, this.RE.sanLossRegExp) - extractedData.attacksPerRound = this.extractValue( - text, - this.RE.attacksPerRoundRegExp - ) + getRegEx (regex, modifiers = 'iu') { + if (regex.constructor?.name === 'RegExp') { + return regex + } + return new RegExp(regex, modifiers) + } - const attacks = this.extractValue(text, this.RE.attacksRegExp) - console.debug(attacks) - extractedData.attacks = await this.processAttacks(attacks) - const spells = this.extractValue(text, this.RE.spellsRegExp) - console.debug(spells) - extractedData.spells = await this.processSpells(spells) - const skills = this.extractValue(text, this.RE.skillsRegExp) - console.debug(skills) - extractedData.skills = await this.processSkills(skills) - const dodge = this.RE.dodgeRegExp.exec(text) - if (dodge !== null) { - extractedData.skills.push({ - name: this.cleanString(dodge.groups.name), - value: Number(dodge.groups.percentage) - }) + /** + * cleanString, removes new line and carrier return character and lateral spaces from a string + * @param {String} s the string to clean + * @returns {String} the cleaned string + */ + cleanString (s) { + return s + .replace(/(\n|\r)/g, ' ') + .replace(/^\s*/, '') + .replace(/\s*\.?\s*\.?$/, '') + } + + /** + * translateRoll, translates language specific shortform of dice (D) in rolls + * Example for German rolls: 1W4 => 1D4. + * Dice shortform is configured using keys.diceShort + * @param {String} s the roll to be translated + * @returns {String} the translated roll + */ + translateRoll (s) { + if (typeof s === 'undefined') return s + if (typeof this.keys.diceShort !== 'undefined') { + const regEx = new RegExp( + '(?\\d+)' + this.keys.diceShort + '(?\\d+)', + 'iug' + ) + return s.replace(regEx, '$D$') + } else { + return s } - const languages = this.extractValue(text, this.RE.languagesRegExp) - console.debug(languages) - extractedData.languages = await this.processSkills(languages) + } - return extractedData + /** + * toHTML, converts a string to HTML striping out empty lines or lines that contain just , or . + * @param {String} s the string to convert + * @returns {String} the HTML or an empty string + */ + toHTML (s) { + if (s.trim().length === 0) { + return '' + } + s = s + .trim() + .split('\n') + .map(text => text.trim().replace(/^[,.\s]+$/, '')) + .filter(text => text) + .join('

                                                        ') + 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( + /^(?\d+),(?.+)$/ + ) + if (occupationAge) { + this.parsed.age = occupationAge.groups.age + this.parsed.occupation = occupationAge.groups.occupation.trim() + } + } + // Get damage bonus, if not found or none set to 0 + if ( + !this.check('db') || + this.check('dbNone', { + removeFromText: false, + saveKeys: false, + text: this.parsed.db }) + ) { + this.parsed.db = '0' } - console.debug('skills', results) - return results - } - - /** - * extractValue expects to receive a regular expression `re` that - * includes one parenthesis group, and returns the value matching the first - * parenthesis group or `null` - */ - extractValue (text, re) { - const results = re.exec(text) - if (results !== null) { - return results[1] + this.parsed.db = this.translateRoll(this.parsed.db) + // Get build + this.check('build') + // Get armor, if not found or none set to 0 + if ( + !this.check('armor') || + this.check('armorNone', { + removeFromText: false, + saveKeys: false, + text: this.parsed.armor + }) + ) { + this.parsed.armor = '0' } - return null - } - - /** - * cleanString, removes new line and carrier return character and lateral spaces from a string - * @param {String} s the sting to clean - * @returns {String} the cleaned string - */ - cleanString (s) { - return s - .replace(/(\n|\r)/g, ' ') - .replace(/^\s*/, '') - .replace(/\s*\.?\s*$/, '') + // Get movement + this.check('mov', { type: CoC7ActorImporter.asNumber }) + // Get luck + this.check('lck', { type: CoC7ActorImporter.asNumber }) + // Get sanity loss + this.check('sanLoss') + this.parsed.sanLoss = this.translateRoll(this.parsed.sanLoss) + // Get attacks per round, if not found or none set to 0 + if ( + this.check('attacksPerRound') && + this.check('attacksPerRoundNone', { + removeFromText: false, + saveKeys: false, + text: this.parsed.attacksPerRound + }) + ) { + this.parsed.attacksPerRound = '0' + } + // Check if there is a combat section + this.text = '\n' + this.text + let sections = this.getRegEx('(' + this.keys.sectionCombats + ')', 'i') + if (this.text.match(sections) === null) { + // If there is no combat section guess where it starts + sections = this.check('guessStartCombat', { + saveKeys: false, + removeFromText: false + }) + if (sections) { + // Add a header to the start of the combat section + this.text = [ + this.text.slice(0, sections['-index']), + this.keys.newCombatHeader, + this.text.slice(sections['-index']) + ].join('') + } + } + // Split the sections Combat, Skills, Languages, and Spells + const regExpSections = this.getRegEx(this.regEx.sections, 'i') + sections = this.text.split(regExpSections) + if (sections !== null) { + for (let i = 0, im = sections.length; i < im; i++) { + if ( + sections[i].match( + this.getRegEx('(' + this.keys.sectionCombats + ')', 'i') + ) !== null && + typeof sections[i + 1] !== 'undefined' + ) { + // If section is combat + this.text = ('\n' + this.text + '\n') + .replace(sections[i], '\n') + .trim() + this.processCombat(sections[i + 1]) + i++ + } else if ( + sections[i].match( + this.getRegEx('(' + this.keys.sectionSkills + ')', 'i') + ) !== null && + typeof sections[i + 1] !== 'undefined' + ) { + // If section is skills + this.text = ('\n' + this.text + '\n') + .replace(sections[i], '\n') + .trim() + this.processSkills(sections[i + 1]) + i++ + } else if ( + sections[i].match( + this.getRegEx('(' + this.keys.sectionLangauges + ')', 'i') + ) !== null && + typeof sections[i + 1] !== 'undefined' + ) { + // If section is languages + this.text = ('\n' + this.text + '\n') + .replace(sections[i], '\n') + .trim() + this.processSkills(sections[i + 1], 'languages') + i++ + } else if ( + sections[i].match( + this.getRegEx('(' + this.keys.sectionSpells + ')', 'i') + ) !== null && + typeof sections[i + 1] !== 'undefined' + ) { + // If section is spells + this.text = ('\n' + this.text + '\n') + .replace(sections[i], '\n') + .trim() + this.processSpells(sections[i + 1]) + i++ + } + } + } + // Any remaining text add to GM notes so you can easily see if there are any obvious issue or just general notes + this.parsed.gmnotes = this.toHTML(this.text) + return this.parsed } - /** - * Determines the entity type to use (`npc` or `creature`) depending on the user selection on the dialog - * helps to validate / clean the input, in case of an unknown entity type shows a warning and returns `npc` - * as a default value. - * @param {String} entityTypeString string with the entity type as selected by the users - * @returns {String} `npc` or `creature` - */ - entityType (entityTypeString) { - switch (entityTypeString) { - case 'coc-npc': - return 'npc' - case 'coc-creature': - return 'creature' - } - console.warn('entity type: ', entityTypeString) - return 'npc' + disableAttribAuto (key, attribValue, check, updateData) { + const value = Math.max(0, Number(attribValue)) + if (value !== Number(check)) { + updateData[`data.attribs.${key}.auto`] = false + updateData[`data.attribs.${key}.value`] = value + if (key === 'build') { + updateData[`data.attribs.${key}.current`] = value + } else { + updateData[`data.attribs.${key}.max`] = value + } + } + return updateData } /** - * Create an entity (`npc`or `creature`) from the object with the already parsed entity data - * @param {Object} pc object with the data extracted from the character as returned from `parseCharacter` - * @param {String} entityTypeString entity type obtained from the user input, will be sanitized by calling `entityType` + * Create an entity (`npc` or `creature`) from the object with the already parsed entity data + * @param {Object} characterData object with the data extracted from the character + * @param {String} entityTypeString entity type obtained from the user input * @returns {Actor} the created foundry `Actor` */ - async createEntity (pc, entityTypeString) { - const importedCharactersFolder = await this.createImportCharactersFolderIfNotExists() - - const npc = await Actor.create({ - name: pc.name, - type: this.entityType(entityTypeString), + async createEntity (characterData, entityType) { + const importedCharactersFolder = + await CoC7Utilities.createImportCharactersFolderIfNotExists() + if (entityType !== 'npc') { + entityType = 'creature' + } + const actorData = { + name: characterData.name, + type: entityType, folder: importedCharactersFolder.id, - data: {} + data: characterData.actor + } + const npc = await Actor.create(actorData) + await npc.createEmbeddedDocuments('Item', characterData.items, { + renderSheet: false }) - // debugger - // Add the skills - await this.addTheSkills(pc, npc) - // Add the languages - await this.addTheLanguages(pc, npc) - // Add the spells - await this.addTheSpells(pc, npc) - // Handle the attacks - await this.handleTheAttacks(pc, npc) - await this.updateActorData(pc, npc) - + const updateData = {} + let value = 0 + if (typeof characterData.actor.attribs.hp?.value !== 'undefined') { + this.disableAttribAuto( + 'hp', + characterData.actor.attribs.hp.value, + npc.hpMax, + updateData + ) + } + if (typeof characterData.actor.attribs.mp?.value !== 'undefined') { + this.disableAttribAuto( + 'mp', + characterData.actor.attribs.mp.value, + npc.mpMax, + updateData + ) + } + if (typeof characterData.actor.attribs.mov?.value !== 'undefined') { + this.disableAttribAuto( + 'mov', + characterData.actor.attribs.mov.value, + npc.mov, + updateData + ) + } + if (typeof characterData.actor.attribs.build?.value !== 'undefined') { + this.disableAttribAuto( + 'build', + characterData.actor.attribs.build.value, + npc.build, + updateData + ) + } + if (typeof characterData.actor.attribs.db?.value !== 'undefined') { + value = String(characterData.actor.attribs.db.value).replace(/^\+\s*/, '') + if (value !== String(npc.db)) { + updateData['data.attribs.db.auto'] = false + updateData['data.attribs.db.value'] = value + } + } + if (Object.keys(updateData).length > 0) { + if (CONFIG.debug.CoC7Importer) { + console.debug('updateData:', updateData) + } + await npc.update(updateData) + } + const updateItemData = [] + let lastWeaponSkill = null + for (const pair of this.weaponSkills) { + if (pair[0] !== false) { + lastWeaponSkill = npc.items.filter( + i => + i.name === pair[0].name && + i.type === 'skill' && + Number(i.data.data.value) === Number(pair[0].data.value) + ) + } + const weapon = npc.items.filter( + i => + i.name === pair[1].name && + i.type === 'weapon' && + i.data.data.range.normal.damage === pair[1].data.range.normal.damage + ) + if (lastWeaponSkill[0] && weapon[0]) { + updateItemData.push({ + _id: weapon[0].id, + 'data.skill.main.id': lastWeaponSkill[0].id, + 'data.skill.main.name': lastWeaponSkill[0].name + }) + } + } + if (updateItemData.length > 0) { + if (CONFIG.debug.CoC7Importer) { + console.debug('updateItemData:', updateItemData) + } + await npc.updateEmbeddedDocuments('Item', updateItemData) + } return npc } /** - * Creates a folder on the actors tab called "Imported Characters" if the folder doesn't exist. - * @returns {Folder} the importedCharactersFolder + * actorData, convert parseCharacter data into Actor data + * @param {Object} pc object with the data extracted from the character as returned from `parseCharacter` + * @returns {Object} formatted Actor data */ - async createImportCharactersFolderIfNotExists () { - let importedCharactersFolder = game.folders.find( - entry => - entry.data.name === 'Imported characters' && entry.data.type === 'Actor' - ) - if ( - importedCharactersFolder === null || - importedCharactersFolder === undefined - ) { - // Create the folder - importedCharactersFolder = await Folder.create({ - name: 'Imported characters', - type: 'Actor', - parent: null - }) - ui.notifications.info( - game.i18n.localize('COC7.CreatedImportedCharactersFolder') - ) + actorData (pc) { + const data = { + characteristics: {}, + attribs: {}, + infos: {}, + special: {}, + description: { + keeper: '' + }, + flags: { + locked: false, + displayFormula: false + } } - return importedCharactersFolder - } - - async updateActorData (pc, npc) { - let updateData = {} - ;['str', 'con', 'siz', 'dex', 'app', 'int', 'pow', 'edu'].forEach(key => { - updateData[`data.characteristics.${key}.value`] = Number(pc[key]) - }) - await npc.update(updateData) - await npc.setLuck(Number(pc.lck)) - await npc.setHp(Number(pc.hp)) - await npc.setMp(Number(pc.mp)) - - updateData = {} - ;['san', 'mov', 'db', 'build', 'armor'].forEach(key => { - updateData[`data.attribs.${key}.value`] = Number(pc[key]) - }) - if (pc.age !== null) { - updateData['data.infos.age'] = pc.age + for (const key of [ + 'str', + 'con', + 'siz', + 'dex', + 'app', + 'int', + 'pow', + 'edu' + ]) { + if (typeof pc[key] !== 'undefined') { + data.characteristics[key] = { + value: Number(pc[key]) + } + } } - if (pc.sanLoss !== null) { - const [passed, failed] = pc.sanLoss.split('/') - updateData['data.special.sanLoss.checkPassed'] = passed - updateData['data.special.sanLoss.checkFailled'] = failed + for (const key of ['san', 'mov', 'build', 'armor', 'lck', 'hp', 'mp']) { + if (typeof pc[key] !== 'undefined') { + data.attribs[key] = { + value: Number(pc[key]) + } + } } - if (pc.attacksPerRound !== null) { - updateData['data.special.attacksPerRound'] = Number(pc.attacksPerRound) + if (typeof pc.db !== 'undefined') { + data.attribs.db = { + value: pc.db + } } - console.debug('updateData:', updateData) - await npc.update(updateData) - } - - async handleTheAttacks (pc, npc) { - if (pc.attacks !== null) { - for (let i = 0; i < pc.attacks.length; i++) { - const attack = pc.attacks[i] - console.debug('attack', attack) - const mainAttackSkill = await this.mainAttackSkill(attack) - await npc - .createEmbeddedDocuments('Item', [mainAttackSkill]) - .then(async newSkills => { - // const newSkill = newSkills[0].clone() - // newSkill.data.data.value = attack.data.range.normal.value - await npc - .createEmbeddedDocuments('Item', [attack]) - .then(async createdAttacks => { - if ( - Array.isArray(createdAttacks) && - createdAttacks.length > 0 && - Array.isArray(newSkills) && - newSkills.length > 0 - ) { - const createdAttack = await this.setMainAttackSkill( - createdAttacks[0], - newSkills[0] - ) - console.debug('createdAttack', createdAttack) - } - }) - }) + for (const key of ['age', 'occupation']) { + if (typeof pc[key] !== 'undefined') { + data.infos[key] = pc[key] } } - } - - async mainAttackSkill (attack) { - const skill = await this.weaponSkill(attack.name) - if (skill !== null && typeof skill !== 'undefined') { - console.debug('skill', skill) - const skillClone = skill.clone({ - data: { - value: attack.data.range.normal.value - } - }) - console.debug('skillClone', skillClone) - return skillClone + if (typeof pc.sanLoss !== 'undefined') { + const [passed, failed] = pc.sanLoss.split('/') + data.special.sanLoss = { + checkPassed: passed, + checkFailled: failed + } } - console.debug( - `Weapon skill not found for ${attack.name}, creating a new one` - ) - const newSkill = { - name: attack.name, - type: 'skill', - data: this.basicWeaponSkillData(false) + if (typeof pc.attacksPerRound !== 'undefined') { + data.special.attacksPerRound = Number(pc.attacksPerRound) } - newSkill.data.base = attack.data?.range?.normal?.value - newSkill.data.value = attack.data?.range?.normal?.value - console.debug('newSkill', newSkill) - return newSkill + data.description.keeper = pc.gmnotes + if (CONFIG.debug.CoC7Importer) { + console.debug('actorData:', data) + } + return data } /** - * setMainWeaponSkill sets the main skill for a weapon - * @param {CoC7Item} weapon - * @param {CoC7Item} skill + * itemsData, convert parseCharacter data into Actor item data + * @param {Object} pc object with the data extracted from the character as returned from `parseCharacter` + * @returns {Object} formatted Actor data */ - async setMainAttackSkill (weapon, skill) { - return await weapon.update({ - 'data.skill.main.id': skill.id, - 'data.skill.main.name': skill.name, - 'data.properties': skill.data.properties, - 'data.adjustments': skill.data.adjustments, - 'data.specialization': skill.data.specialization - }) - } - - async addTheSpells (pc, npc) { - if (pc.spells !== null) { - pc.spells.forEach(async spell => { - const created = await npc.addItems([ - { - name: spell, - type: 'spell' + async itemsData (pc) { + const items = [] + this.weaponSkills = [] + // Weapon skills + if (typeof pc.attacks !== 'undefined') { + for (const attack of pc.attacks) { + let skill = false + if (attack.data?.skill?.id !== true) { + skill = await this.weaponSkill(attack) + items.push(skill) + } + attack.data.skill.id = null + items.push(attack) + this.weaponSkills.push([skill, attack]) + } + } + // Skills + if (typeof pc.skills !== 'undefined') { + for (const skill of pc.skills) { + const existing = await CoC7Utilities.guessItem('skill', skill.name, { + source: this.itemLocations + }) + if (typeof existing !== 'undefined') { + const cloned = existing.toObject() + cloned.data.base = skill.value + if (typeof skill.push !== 'undefined') { + cloned.data.properties.push = skill.push } - ]) - console.debug(created) - }) + items.push(duplicate(cloned)) + } else { + const options = {} + if (typeof skill.push !== 'undefined') { + options.push = skill.push + } + items.push(CoCActor.emptySkill(skill.name, skill.value, options)) + } + } } - } - - async addTheLanguages (pc, npc) { - if (pc.languages !== null) { - for (const lang of pc.languages) { - const created = await npc.createSkill(lang.name, lang.value) - console.debug(created) + // Languages + if (typeof pc.languages !== 'undefined') { + for (const skill of pc.languages) { + const existing = await CoC7Utilities.guessItem('skill', skill.name, { + source: this.itemLocations + }) + if (typeof existing !== 'undefined') { + const cloned = existing.toObject() + cloned.data.base = skill.value + items.push(duplicate(cloned)) + } else { + items.push( + CoCActor.emptySkill(skill.name, skill.value, { + img: CoC7Item.iconLanguage, + specialization: 'Language' + }) + ) + } } } - } - - async addTheSkills (pc, npc) { - if (pc.skills !== null) { - for (const skill of pc.skills) { - const existingSkill = await game.items.find( - i => i.data.type === 'skill' && i.data.name === skill.name - ) - if (existingSkill !== undefined) { - const clonedSkill = existingSkill.toObject() - clonedSkill.data.base = skill.value - await npc - .createEmbeddedDocuments('Item', [clonedSkill]) - .then(created => console.debug(created)) - // created.data.value = skill.value && console.debug(created)) + // Spells + if (typeof pc.spells !== 'undefined') { + for (const name of pc.spells) { + const existing = await CoC7Utilities.guessItem('spell', name, { + source: this.itemLocations + }) + if (typeof existing !== 'undefined') { + const cloned = existing.toObject() + items.push(duplicate(cloned)) } else { - await npc - .createSkill(skill.name, skill.value) - .then(created => console.debug(created)) + items.push(CoCActor.emptySpell(name)) } } } + return items } - /** weaponSkill tries ot guess what kind of weapon skill to use for weapon from it's name - * @param weaponName: String, the weapon name + /** weaponSkill tries to guess what kind of weapon skill to use for weapon from it's name + * @param weapon: JSON, weapon data */ - async weaponSkill (weaponName) { + async weaponSkill (weapon) { let skill = null - if (this.RE.handgunRegExp.exec(weaponName)) { - skill = await game.items.find( - i => i.data.type === 'skill' && i.data.name === 'Handgun' - ) - console.debug(`${weaponName} uses Handgun skill: ${skill}`) - } else if (this.RE.rifleRegExp.exec(weaponName)) { - skill = await game.items.find( - i => i.data.type === 'skill' && i.data.name === 'Rifle/Shotgun' - ) - console.debug(`${weaponName} uses Rifle skill: ${skill}`) - } else if (this.RE.smbRegExp.exec(weaponName)) { - skill = await game.items.find( - i => i.data.type === 'skill' && i.data.name === 'Submachine Gun' - ) - console.debug(`${weaponName} uses Submachine Gun skill: ${skill}`) - } else if (this.RE.machineGunRegExp.exec(weaponName)) { - skill = await game.items.find( - i => i.data.type === 'skill' && i.data.name === 'Machine Gun' + if (this.getRegEx('handgun').exec(weapon.name)) { + skill = await CoC7Utilities.guessItem('skill', 'Handgun', { + combat: true, + source: this.itemLocations + }) + if (CONFIG.debug.CoC7Importer) { + console.debug(`${weapon.name} uses Handgun skill: ${skill}`) + } + } else if (this.getRegEx('rifle').exec(weapon.name)) { + skill = await CoC7Utilities.guessItem('skill', 'Rifle/Shotgun', { + combat: true, + source: this.itemLocations + }) + if (!skill) { + skill = await CoC7Utilities.guessItem('skill', 'Rifle', { + combat: true, + source: this.itemLocations + }) + if (!skill) { + skill = await CoC7Utilities.guessItem('skill', 'Shotgun', { + combat: true, + source: this.itemLocations + }) + } + } + if (CONFIG.debug.CoC7Importer) { + console.debug(`${weapon.name} uses Rifle skill: ${skill}`) + } + } else if (this.getRegEx('smb').exec(weapon.name)) { + skill = await CoC7Utilities.guessItem('skill', 'Submachine Gun', { + combat: true, + source: this.itemLocations + }) + if (CONFIG.debug.CoC7Importer) { + console.debug(`${weapon.name} uses Submachine Gun skill: ${skill}`) + } + } else if (this.getRegEx('machineGun').exec(weapon.name)) { + skill = await CoC7Utilities.guessItem('skill', 'Machine Gun', { + combat: true, + source: this.itemLocations + }) + if (CONFIG.debug.CoC7Importer) { + console.debug(`${weapon.name} uses Machine Gun skill: ${skill}`) + } + } else if (this.getRegEx('launched').exec(weapon.name)) { + skill = await CoC7Utilities.guessItem('skill', 'Launch', { + combat: true, + source: this.itemLocations + }) + if (CONFIG.debug.CoC7Importer) { + console.debug(`${weapon.name} uses Launch skill: ${skill}`) + } + } + if (skill !== null && typeof skill !== 'undefined') { + const skillClone = skill.clone({ + data: { + value: weapon.data?.skill?.id + } + }) + return skillClone + } + const firearms = weapon.data?.properties?.rngd + const parts = CoC7Item.getNamePartsSpec( + weapon.name, + game.i18n.localize( + firearms + ? 'CoC7.FirearmSpecializationName' + : 'CoC7.FightingSpecializationName' ) - console.debug(`${weaponName} uses Machine Gun skill: ${skill}`) - } else if (this.RE.launchedWeapons.exec(weaponName)) { - skill = await game.items.find( - i => i.data.type === 'skill' && i.data.name === 'Launch' + ) + const newSkill = { + type: 'skill', + name: parts.name, + data: { + skillName: parts.skillName, + specialization: parts.specialization, + properties: { + special: true, + fighting: !firearms, + firearm: firearms, + combat: true + }, + base: weapon.data?.skill?.id, + value: weapon.data?.skill?.id + } + } + if (CONFIG.debug.CoC7Importer) { + console.debug( + `Weapon skill not found for ${weapon.name}, creating a new one`, + newSkill ) - console.debug(`${weaponName} uses Launch skill: ${skill}`) } - return skill + return newSkill } /** @@ -491,12 +985,23 @@ export class CoC7ActorImporter { */ needsConversion (npc) { let needsConversionResult = true - ;['str', 'con', 'siz', 'dex', 'app', 'int', 'pow', 'edu'].forEach(key => { - if (npc[key] > 30) { + for (const key of [ + 'str', + 'con', + 'siz', + 'dex', + 'app', + 'int', + 'pow', + 'edu' + ]) { + if (typeof npc[key] !== 'undefined' && npc[key] > 30) { needsConversionResult = false } - }) - console.debug('needsConversion:', needsConversionResult) + } + if (CONFIG.debug.CoC7Importer) { + console.debug('needsConversion:', needsConversionResult) + } return needsConversionResult } @@ -507,14 +1012,20 @@ export class CoC7ActorImporter { * @returns {Actor} the foundry `Actor` from the given `input` options */ async createActor (inputs) { - const lang = - this.extractValue( - inputs.lang, - CoC7ActorImporterRegExp.optionLangRegExp - ) || 'en' - this.RE = CoC7ActorImporterRegExp.getRegularExpressions(lang) + if (CONFIG.debug.CoC7Importer) { + console.debug('createActor:', inputs) + } + const lang = CoC7ActorImporterRegExp.checkLanguage(inputs.lang) + this.keys = CoC7ActorImporterRegExp.getKeys(lang) + this.regEx = CoC7ActorImporterRegExp.getRegularExpressions(lang) + this.itemLocations = inputs.source + if (CONFIG.debug.CoC7Importer) { + console.debug('Regular Expressions:', lang, this.keys, this.regEx) + } let character = await this.parseCharacter(inputs.text) - console.debug(character) + if (CONFIG.debug.CoC7Importer) { + console.debug('parseCharacter:', character) + } if ( (inputs.convertFrom6E === 'coc-guess' && this.needsConversion(character)) || @@ -522,7 +1033,16 @@ export class CoC7ActorImporter { ) { character = await this.convert7E(character) } - const npc = await this.createEntity(character, inputs.entity) + const characterData = { + name: character.name, + actor: this.actorData(character), + items: await this.itemsData(character) + } + + if (typeof inputs.testMode !== 'undefined' && inputs.testMode === true) { + return characterData + } + const npc = await this.createEntity(characterData, inputs.entity) return npc } @@ -532,24 +1052,34 @@ export class CoC7ActorImporter { * @return the same object but with updated characteristics for 7 edition */ async convert7E (creature) { - console.debug('Converting creature', creature) - ;['str', 'con', 'siz', 'dex', 'app', 'int', 'pow'].forEach(key => { - creature[key] *= 5 - }) - if (creature.edu <= 18) { - creature.edu *= 5 - } else if (creature.edu <= 26) { - creature.edu = creature.edu + 90 - 18 - } else { - // creature.edu >=28 - creature.edu = 99 + if (CONFIG.debug.CoC7Importer) { + console.debug('Converting npc', creature) + } + for (const key of ['str', 'con', 'siz', 'dex', 'app', 'int', 'pow']) { + if (typeof creature[key] !== 'undefined') { + creature[key] *= 5 + } + } + if (typeof creature.edu !== 'undefined') { + if (creature.edu <= 18) { + creature.edu *= 5 + } else if (creature.edu <= 26) { + creature.edu = creature.edu + 90 - 18 + } else { + // creature.edu >=28 + creature.edu = 99 + } + } + if (typeof creature.db !== 'undefined') { + if (creature.db === '-1d4') { + creature.db = -1 + } else if (creature.db === '-1d6') { + creature.db = -2 + } } - if (creature.db === '-1d4') { - creature.db = -1 - } else if (creature.db === '-1d6') { - creature.db = -2 + if (CONFIG.debug.CoC7Importer) { + console.debug('convert7E: ', creature) } - console.debug('Converted creature', creature) return creature } } diff --git a/module/apps/canvas.js b/module/apps/canvas.js index 6c95b218..bdc80538 100644 --- a/module/apps/canvas.js +++ b/module/apps/canvas.js @@ -1,21 +1,21 @@ /* global game, ui */ - import { chatHelper } from '../chat/helper.js' +import { CoC7Utilities } from '../utilities.js' import { CoC7Link } from './link.js' export class CoC7Canvas { static get COC7_TYPES_SUPPORTED () { - return ['link'] + return ['link', 'chase'] } - static async onDropSomething (canvas, item) { + static async onDropSomething (canvas, data) { if ( - item.CoC7Type && - CoC7Canvas.COC7_TYPES_SUPPORTED.includes(item.CoC7Type) + data.CoC7Type && + CoC7Canvas.COC7_TYPES_SUPPORTED.includes(data.CoC7Type) ) { const gridSize = canvas.scene.data.grid - const x = item.x - gridSize / 2 - const y = item.y - gridSize / 2 + const x = data.x - gridSize / 2 + const y = data.y - gridSize / 2 const height = gridSize const width = gridSize let dropTargetTokens = canvas.tokens.placeables.filter(obj => { @@ -26,10 +26,10 @@ export class CoC7Canvas { ) }) // Find drop target. if (!dropTargetTokens.length) dropTargetTokens = canvas.tokens.controlled // If no target whisper to selected token - switch (item.CoC7Type) { + switch (data.CoC7Type) { case 'link': { - const link = await CoC7Link.fromData(item) + const link = await CoC7Link.fromData(data) if (!link.link) { ui.notifications.error('Invalid link') } @@ -39,40 +39,66 @@ export class CoC7Canvas { alias: game.user.name } - if (!dropTargetTokens.length) { - const whisperTargets = game.users.players.filter( - u => !!u.character - ) // User with at least a character - whisperTargets.forEach(u => { - option.whisper = [u] - chatHelper.createMessage( - null, - game.i18n.format('CoC7.MessageTargetCheckRequested', { - name: u.character.name, - check: link.link - }), - option - ) - }) + if (link.is.effect) { + if (!dropTargetTokens.length) { + // Apply to everyone ? or only players ? or nobody + } else { + for (const t of dropTargetTokens) { + await t.actor.createEmbeddedDocuments('ActiveEffect', [ + link.data.effect + ]) + } + } } else { - dropTargetTokens.forEach(t => { - if (t.actor.hasPlayerOwner) { - option.whisper = t.actor.owners + if (!dropTargetTokens.length) { + const whisperTargets = game.users.players.filter( + u => !!u.character + ) // User with at least a character + for (const u of whisperTargets) { + option.whisper = [u] chatHelper.createMessage( null, game.i18n.format('CoC7.MessageTargetCheckRequested', { - name: t.actor.name, + name: u.character.name, check: link.link }), option ) } - }) + } else { + for (const t of dropTargetTokens) { + if (t.actor.hasPlayerOwner) { + option.whisper = t.actor.owners + chatHelper.createMessage( + null, + game.i18n.format('CoC7.MessageTargetCheckRequested', { + name: t.actor.name, + check: link.link + }), + option + ) + } + } + } } } break default: + if (data.docUuid && data.callBack) { + const doc = CoC7Utilities.SfromUuid(data.docUuid) + if ( + doc[data.callBack] && + typeof doc[data.callBack] === 'function' + ) { + try { + data.scene = canvas.scene.uuid + doc[data.callBack](data) + } catch (error) { + console.warn(error.message) + } + } + } break } } diff --git a/module/apps/char-roll-dialog.js b/module/apps/char-roll-dialog.js index facd2626..f0a43caf 100644 --- a/module/apps/char-roll-dialog.js +++ b/module/apps/char-roll-dialog.js @@ -1,4 +1,4 @@ -/* global Dialog, renderTemplate, Roll */ +/* global Dialog, game, renderTemplate, Roll */ export class CharacRollDialog extends Dialog { constructor (data, options) { @@ -97,7 +97,10 @@ export class CharacRollDialog extends Dialog { const roll = new Roll(formula) await roll.evaluate({ async: true }) roll.toMessage({ - flavor: `Rolling characterisitic ${this.data.data.characteristics.list[key].label}: ${formula}` + flavor: game.i18n.format('CoC7.MessageRollingCharacteristic', { + label: this.data.data.characteristics.list[key].label, + formula + }) }) input.value = roll.total } else input.value = Number(formula) @@ -185,9 +188,8 @@ export class CharacRollDialog extends Dialog { !Object.entries(this.rolled).find(el => !el) && Object.entries(this.rolled).length === 9 if (this.data.data.validate) { - const validateButton = this._element[0].querySelector( - 'button.validate' - ) + const validateButton = + this._element[0].querySelector('button.validate') validateButton.classList.remove('inactive') } } @@ -212,7 +214,8 @@ export class CharacRollDialog extends Dialog { if (data.characteristics.points.enabled) { if ( - Number(data.characteristics.points.total) !== Number(data.characteristics.points.value) + Number(data.characteristics.points.total) !== + Number(data.characteristics.points.value) ) { data.pointsWarning = true } @@ -227,8 +230,8 @@ export class CharacRollDialog extends Dialog { { title: data.title, content: html, - data: data, - rolled: rolled, + data, + rolled, buttons: {}, close: () => { if (data.validate) return resolve(true) diff --git a/module/apps/char-selection-dialog.js b/module/apps/char-selection-dialog.js index b9fcd78e..a7753cc5 100644 --- a/module/apps/char-selection-dialog.js +++ b/module/apps/char-selection-dialog.js @@ -25,7 +25,7 @@ export class CharacSelectDialog extends Dialog { { title: data.title, content: html, - data: data, + data, buttons: {}, close: () => { if (data.selected) return resolve(data.selected) diff --git a/module/apps/chase-participant-importer.js b/module/apps/chase-participant-importer.js new file mode 100644 index 00000000..24a9f932 --- /dev/null +++ b/module/apps/chase-participant-importer.js @@ -0,0 +1,310 @@ +/* global DragDrop, FormApplication, foundry, game, ui */ +import { CoCActor } from '../actors/actor.js' +import { CoC7Check } from '../check.js' +import { _participant } from '../items/chase/participant.js' +import { CoC7Utilities } from '../utilities.js' + +export class CoC7ChaseParticipantImporter extends FormApplication { + static get defaultOptions () { + return foundry.utils.mergeObject(super.defaultOptions, { + template: 'systems/CoC7/templates/apps/chase-participant-importer.html', + classes: ['coc7', 'dialog', 'chase-participant-importer'], + editable: true, + resizable: false, + submitOnChange: true, + closeOnSubmit: false, + width: 300, + height: 'auto' + }) + } + + activateListeners (html) { + super.activateListeners(html) + + const participantDragDrop = new DragDrop({ + dropSelector: '.form-container', + permissions: { drop: game.user.isGM }, + callbacks: { drop: this._onDropParticipant.bind(this) } + }) + participantDragDrop.bind(html[0]) + + html.find('.reset-participant').click(async () => { + this.object = {} + this._actor = null + await this.render(true) + }) + + html.find('.food-chain').click(async () => { + this.object.chaser = !this.object.chaser + await this.render(true) + }) + + html.find('[data-action]').click(this._onAction.bind(this)) + + // html.find('button').click(this._onButton.bind(this)) + } + + async getData () { + if (!this.object.initiative) { + const init = CoCActor.getCharacteristicDefinition().find( + c => c.key === 'dex' + ) + this.object.initiative = init.label + // this.object.initiative = `${game.i18n.localize( + // 'CoC7.Characteristics' + // )} (${init.shortName})` + } + if (!this.object.speedCheck) { + const speedCheck = CoCActor.getCharacteristicDefinition().find( + c => c.key === 'con' + ) + this.object.speedCheck = { + name: speedCheck.label + } + // this.object.speedCheck = { + // name: `${game.i18n.localize('CoC7.Characteristics')} (${ + // speedCheck.shortName + // })` + // } + } + + this.validateParticipant() + + // const speedCheck = this.actor?.find( this.object.speedCheck?.name) + // if( speedCheck){ + // this.object.speedCheck = speedCheck + // } + + const data = await super.getData() + + data.participant = new _participant(this.object) + if (data.object.speedCheck.name && this.actor) { + const speedCheck = this.actor.find(data.object.speedCheck.name) + if (speedCheck) { + data.object.speedCheck.score = speedCheck.value.value + data.speedCheckReadOnly = true + } else if ( + data.participant.speedCheck.score && + !this.object.speedCheck?.score + ) { + data.object.speedCheck.score = data.participant.speedCheck.score + } + } + + if (data.object.initiative && this.actor) { + const initiative = this.actor.find(data.object.initiative) + if (initiative) { + data.object.dex = initiative.value.value + data.initReadOnly = true + } else data.object.dex = data.participant.initiative + } + + data.actor = this.actor + data.chase = this.chase + data.data = this.data + + data.optionsList = {} + if (this.chase) { + data.skillsAndCharacteristicsList = + this.chase.allSkillsAndCharacteristicsShort + } + + if (this.actor) { + data.skillsAndCharacteristicsList = [] + CoCActor.getCharacteristicDefinition().forEach(c => + data.skillsAndCharacteristicsList.push(`${c.label}`) + ) + data.skillsAndCharacteristicsList.push( + `${game.i18n.localize('CoC7.Luck')}` + ) + data.skillsAndCharacteristicsList.push( + `${game.i18n.localize('CoC7.SAN')}` + ) + this.actor.skills.forEach(s => + data.skillsAndCharacteristicsList.push(s.name) + ) + } + + return data + } + + get chase () { + if (!this._chase) { + this._chase = CoC7Utilities.SfromUuid(this.object.chaseUuid) + } + return this._chase + } + + get actor () { + if (!this.object.docUuid) return null + if (!this._actor) { + this._actor = CoC7Utilities.getActorFromKey(this.object.docUuid) + } + return this._actor + } + + async _updateObject (event, formData) { + foundry.utils.mergeObject(this, formData) + await this.render(true) + } + + async _onDropParticipant (event) { + const dropString = event.dataTransfer.getData('text/plain') + const dropData = JSON.parse(dropString) + + const docUuid = CoC7Utilities.getActorDocumentFromDropData(dropData) + + this.object.docUuid = docUuid + + // If actor is controlled by GM only we assume he is a chaser + this.object.chaser = this.actor?.owners?.filter(u => !u.isGM).length === 0 + if (this.object.speedCheck.rollDataString) { + delete this.object.speedCheck.rollDataString + } + + await this.render(true) + } + + async _onAction (event) { + event.preventDefault() + + const action = event.currentTarget.dataset.action + switch (action) { + case 'cancel': + this.close() + break + case 'add': + { + const participant = new _participant(this.object) + + if (this.chase.started) { + if ( + !(participant.movementAction && participant.movementAction > 0) + ) { + ui.notifications.warn( + game.i18n.localize('CoC7.DoesNotMeetMinimumReqToBeAdded') + ) + return + } + if (this.data.overrideMovementAction) { + const slowest = this.chase.slowestParticipant + if (isNaN(participant.adjustedMov)) { + participant.mov = slowest.adjustedMov + } else { + participant.data.mov = + slowest.adjustedMov + participant.adjustedMov + } + } + } + + await this.chase.addParticipant(participant, { + locationUuid: this.object.locationUuid, + recalculateMovementActions: this.data.recalculationNeeded, + update: this.object.update + }) + this.close() + } + break + + case 'roll-speed-check': + { + const participant = new _participant(this.object) + if (participant.speedCheck.refSet) { + const roll = new CoC7Check() + participant.data.rolled = true + roll.actor = participant.actor.actorKey + if (participant.speedCheck.isCharacteristic) { + await roll.rollCharacteristic(participant.speedCheck.ref.key) + participant.data.speedCheck.rollDataString = roll.JSONRollString + } else if (participant.speedCheck.isSkill) { + roll.skill = participant.speedCheck.ref + await roll.roll() + participant.data.speedCheck.rollDataString = roll.JSONRollString + } else if (participant.speedCheck.isAttribute) { + await roll.rollAttribute(participant.speedCheck.ref.key) + 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) + await roll.roll() + participant.data.speedCheck.rollDataString = roll.JSONRollString + participant.data.rolled = true + } + + foundry.utils.mergeObject(this.object, participant.data) + this.render(true) + } + + break + + default: + break + } + } + + validateParticipant () { + const participant = new _participant(this.object) + if (!this.data) this.data = {} + this.object.excluded = false + this.object.escaped = false + this.data.recalculationNeeded = false + this.data.participantExcluded = false + this.data.movementActionDelta = 0 + + if (!this.data.overrideMovementAction) { + const slowestPrey = this.chase.slowestPrey + const fastestChaser = this.chase.fastestChaser + const slowest = this.chase.slowestParticipant + + if (participant.adjustedMov < slowest?.adjustedMov) { + this.data.recalculationNeeded = true + participant.movementAction = 1 + } else { + this.data.recalculationNeeded = false + participant.calculateMovementActions(slowest?.adjustedMov) + } + if (participant.isChaser) { + if ( + slowestPrey && + !this.chase.data.data.includeLastCommers && + participant.adjustedMov < slowestPrey.adjustedMov + ) { + this.object.excluded = true + this.data.participantExcluded = true + this.data.excludedBecause = game.i18n.localize('CoC7.TooSlow') + this.data.recalculationNeeded = false + } + } + + if (participant.isPrey) { + if ( + fastestChaser && + !this.chase.data.data.includeEscaped && + participant.adjustedMov > fastestChaser.adjustedMov + ) { + this.object.escaped = true + this.data.participantExcluded = true + this.data.excludedBecause = game.i18n.localize('CoC7.TooFast') + this.data.recalculationNeeded = false + } + } + } + } + + static async create (data) { + if (data.dropData) { + const docUuid = CoC7Utilities.getActorDocumentFromDropData(data.dropData) + if (docUuid) data.docUuid = docUuid + delete data.dropData + } + return new CoC7ChaseParticipantImporter(data).render(true) + } +} diff --git a/module/apps/coc7-chat-message.js b/module/apps/coc7-chat-message.js new file mode 100644 index 00000000..874d2b5f --- /dev/null +++ b/module/apps/coc7-chat-message.js @@ -0,0 +1,509 @@ +/* global game, ui */ +import { CoC7Check } from '../check.js' +import { CoC7LinkCreationDialog } from './link-creation-dialog.js' +import { isCtrlKey } from '../chat/helper.js' +import { RollDialog } from './roll-dialog.js' +import { CombinedCheckCard } from '../chat/cards/combined-roll.js' +import { OpposedCheckCard } from '../chat/cards/opposed-roll.js' +import { SanCheckCard } from '../chat/cards/san-check.js' +import { SanDataDialog } from './sandata-dialog.js' + +export class CoC7ChatMessage { + static get ROLL_TYPE_ATTRIBUTE () { + return 'R/AT' + } + + static get ROLL_TYPE_CHARACTERISTIC () { + return 'R/CH' + } + + static get ROLL_TYPE_COMBAT () { + return 'R/CO' + } + + static get ROLL_TYPE_SKILL () { + return 'R/SK' + } + + static get CARD_TYPE_COMBINED () { + return 'C/CO' + } + + static get CARD_TYPE_GROUP () { + return 'C/GR' + } + + static get CARD_TYPE_NORMAL () { + return 'C/NO' + } + + static get CARD_TYPE_OPPOSED () { + return 'C/OP' + } + + static get CARD_TYPE_SAN_CHECK () { + return 'C/SC' + } + + static cardTypes (config) { + if (config.rollType === CoC7ChatMessage.ROLL_TYPE_COMBAT) { + return null + } + const select = { + [CoC7ChatMessage.CARD_TYPE_NORMAL]: 'CoC7.RegularRollCard', + [CoC7ChatMessage.CARD_TYPE_COMBINED]: 'CoC7.CombinedRollCard', + [CoC7ChatMessage.CARD_TYPE_OPPOSED]: 'CoC7.OpposedRollCard' + // [CoC7ChatMessage.CARD_TYPE_GROUP]: 'CoC7.GroupRollCard' - NYI + } + if ( + config.rollType === CoC7ChatMessage.ROLL_TYPE_ATTRIBUTE && + config.attribute === 'san' + ) { + select[CoC7ChatMessage.CARD_TYPE_SAN_CHECK] = 'CoC7.SanityLossEncounter' + } + return select + } + + static normalizeRequest (options) { + if ( + typeof options.event === 'undefined' && + typeof options.cardType !== 'undefined' && + typeof options.actor !== 'undefined' && + (typeof options.skillId !== 'undefined' || + typeof options.skillName !== 'undefined' || + typeof options.attribute !== 'undefined' || + typeof options.characteristic !== 'undefined') + ) { + if (typeof options.skillId !== 'undefined') { + if (options.actor.items.get(options.skillId)) { + options.rollType = CoC7ChatMessage.ROLL_TYPE_SKILL + } + } else if (typeof options.skillName !== 'undefined') { + const skillIds = options.actor.getSkillsByName(options.skillName) + if (skillIds.length > 0) { + options.skillId = skillIds[0].id + options.rollType = CoC7ChatMessage.ROLL_TYPE_SKILL + } + } else if ( + typeof options.attribute !== 'undefined' && + ['lck', 'san'].includes(options.attribute) + ) { + options.rollType = CoC7ChatMessage.ROLL_TYPE_ATTRIBUTE + } else if ( + typeof options.characteristic !== 'undefined' && + typeof options.actor.data.data.characteristics[ + options.characteristic + ] !== 'undefined' + ) { + options.rollType = CoC7ChatMessage.ROLL_TYPE_CHARACTERISTIC + } + } else if ( + typeof options.event === 'undefined' || + typeof options.cardType === 'undefined' || + typeof options.rollType === 'undefined' + ) { + ui.notifications.error( + game.i18n.format('CoC7.ErrorNotFound', { + value: game.i18n.localize('CoC7.Roll') + }) + ) + return false + } + if ( + ![ + CoC7ChatMessage.CARD_TYPE_COMBINED, + CoC7ChatMessage.CARD_TYPE_GROUP, + CoC7ChatMessage.CARD_TYPE_NORMAL, + CoC7ChatMessage.CARD_TYPE_OPPOSED, + CoC7ChatMessage.CARD_TYPE_SAN_CHECK + ].includes(options.cardType) + ) { + ui.notifications.error( + game.i18n.format('CoC7.ErrorInvalidFormula', { + value: game.i18n.localize('CoC7.ErrorInvalidCardType') + }) + ) + return false + } + if ( + ![ + CoC7ChatMessage.ROLL_TYPE_SKILL, + CoC7ChatMessage.ROLL_TYPE_CHARACTERISTIC, + CoC7ChatMessage.ROLL_TYPE_ATTRIBUTE + ].includes(options.rollType) + ) { + ui.notifications.error( + game.i18n.format('CoC7.ErrorInvalidFormula', { + value: game.i18n.localize('CoC7.ErrorInvalidRollType') + }) + ) + return false + } + const config = { + options: { + cardType: options.cardType, + shiftKey: options.event?.shiftKey ?? options.fastForward ?? false, + altKey: options.event?.altKey ?? false, + isCtrlKey: isCtrlKey(options.event ?? false), + isCombat: + options.event?.currentTarget.classList?.contains('combat') ?? false, + preventStandby: options.preventStandby ?? false + }, + dialogOptions: { + rollType: options.rollType, + cardType: options.cardType, + attribute: '', + chatMessage: options.chatMessage ?? true, + forcedCardType: options.forcedCardType ?? false, + hideDifficulty: options.hideDifficulty ?? false + } + } + switch (config.dialogOptions.rollType) { + case CoC7ChatMessage.ROLL_TYPE_SKILL: + case CoC7ChatMessage.ROLL_TYPE_CHARACTERISTIC: + case CoC7ChatMessage.ROLL_TYPE_ATTRIBUTE: + config.options.skillId = + options.skillId ?? + options.event?.currentTarget.closest('.item')?.dataset.skillId + config.options.itemId = + options.event?.currentTarget.closest('.item')?.dataset.itemId + config.options.characteristic = + options.characteristic ?? + options.event?.currentTarget.parentElement.dataset.characteristic + config.options.attribute = + options.attribute ?? + options.event?.currentTarget.parentElement.dataset.attrib + config.dialogOptions.attribute = config.options.attribute + config.options.actorId = + options.event?.currentTarget.closest('form').dataset.actorId ?? + options.actor.id + config.options.tokenKey = + options.event?.currentTarget.closest('form').dataset.tokenId ?? + options.actor.tokenKey + config.options.weaponAltSkill = + options.event?.currentTarget.classList.contains('alternativ-skill') + config.options.actor = options.actor + if ( + config.dialogOptions.rollType === CoC7ChatMessage.ROLL_TYPE_SKILL && + config.options.isCombat + ) { + const item = config.options.actor.items.get(config.options.itemId) + if (!item) { + return false + } + if (item.type === 'weapon') { + config.options.weaponName = item.name + config.dialogOptions.rollType = CoC7ChatMessage.ROLL_TYPE_COMBAT + } + } + if ( + typeof config.options.actorId === 'undefined' || + (typeof config.options.tokenKey === 'undefined' && + typeof config.options.actor === 'undefined') + ) { + ui.notifications.error( + game.i18n.format('CoC7.ErrorInvalidFormula', { + value: game.i18n.localize('CoC7.ErrorActor') + }) + ) + return false + } + if ( + config.dialogOptions.rollType === CoC7ChatMessage.ROLL_TYPE_SKILL && + typeof config.options.skillId === 'undefined' + ) { + ui.notifications.error( + game.i18n.format('CoC7.ErrorInvalidFormula', { + value: game.i18n.localize('CoC7.Entities.Skill') + }) + ) + return false + } else if ( + config.dialogOptions.rollType === + CoC7ChatMessage.ROLL_TYPE_CHARACTERISTIC + ) { + if (typeof config.options.characteristic === 'undefined') { + ui.notifications.error( + game.i18n.format('CoC7.ErrorInvalidFormula', { + value: game.i18n.localize('CoC7.Characteristic') + }) + ) + return false + } else if ( + !game.user.isGM && + !config.options.actor.data.data.characteristics[ + config.options.characteristic + ]?.value + ) { + return false + } + } else if ( + config.dialogOptions.rollType === CoC7ChatMessage.ROLL_TYPE_ATTRIBUTE + ) { + if (typeof config.options.attribute === 'undefined') { + ui.notifications.error( + game.i18n.format('CoC7.ErrorInvalidFormula', { + value: game.i18n.localize('CoC7.Attribute') + }) + ) + return false + } else if ( + !game.user.isGM && + !config.options.actor.data.data.attribs[config.options.attribute] + ?.value + ) { + return false + } + } else if ( + config.dialogOptions.rollType === CoC7ChatMessage.ROLL_TYPE_COMBAT + ) { + if (typeof config.options.itemId === 'undefined') { + ui.notifications.error( + game.i18n.format('CoC7.ErrorInvalidFormula', { + value: game.i18n.localize('CoC7.Entities.Weapon') + }) + ) + return false + } else if (config.options.altKey) { + return false + } + } + config.options.hasPlayerOwner = + config.options.actor.hasPlayerOwner ?? false + if ( + config.dialogOptions.rollType === + CoC7ChatMessage.ROLL_TYPE_CHARACTERISTIC + ) { + config.dialogOptions.disableFlatThresholdModifier = + config.options.isCtrlKey + config.dialogOptions.disableFlatDiceModifier = + config.options.isCtrlKey + } else { + config.dialogOptions.disableFlatThresholdModifier = false + config.dialogOptions.disableFlatDiceModifier = false + } + config.dialogOptions.modifier = 0 + config.dialogOptions.difficulty = + options.difficulty ?? + CoC7Check.difficultyLevel[ + game.settings.get('CoC7', 'defaultCheckDifficulty') + ] + config.dialogOptions.flatDiceModifier = 0 + config.dialogOptions.flatThresholdModifier = 0 + break + } + return config + } + + static async trigger (options = {}) { + const config = CoC7ChatMessage.normalizeRequest(options) + if (config === false) { + return + } + if ( + config.options.isCtrlKey && + game.user.isGM && + [ + CoC7ChatMessage.CARD_TYPE_NORMAL, + CoC7ChatMessage.CARD_TYPE_SAN_CHECK + ].includes(config.dialogOptions.cardType) + ) { + CoC7ChatMessage.createLink(config) + } else { + if (!config.options.shiftKey) { + await CoC7ChatMessage.createRoll(config) + } + return CoC7ChatMessage.runRoll(config) + } + } + + static createLink (config) { + switch (config.dialogOptions.rollType) { + case CoC7ChatMessage.ROLL_TYPE_ATTRIBUTE: + case CoC7ChatMessage.ROLL_TYPE_CHARACTERISTIC: + case CoC7ChatMessage.ROLL_TYPE_COMBAT: + case CoC7ChatMessage.ROLL_TYPE_SKILL: + { + const linkData = { + check: 'check', + type: '', + name: '', + hasPlayerOwner: config.options.hasPlayerOwner, + actorKey: config.options.actor.actorKey, + forceModifiers: config.options.shiftKey + } + if ( + config.dialogOptions.rollType === CoC7ChatMessage.ROLL_TYPE_SKILL + ) { + linkData.type = 'skill' + linkData.name = config.options.actor.items.get( + config.options.skillId + )?.shortName + if (!linkData.name) return + } else if ( + config.dialogOptions.rollType === + CoC7ChatMessage.ROLL_TYPE_CHARACTERISTIC + ) { + linkData.type = 'characteristic' + linkData.name = config.options.characteristic + } else if ( + config.dialogOptions.rollType === + CoC7ChatMessage.ROLL_TYPE_ATTRIBUTE + ) { + if (config.options.altKey && config.options.attribute === 'san') { + linkData.check = 'sanloss' + } else { + linkData.type = 'attribute' + linkData.name = config.options.attribute + } + } else if ( + config.dialogOptions.rollType === CoC7ChatMessage.ROLL_TYPE_COMBAT + ) { + linkData.check = 'item' + linkData.type = 'weapon' + linkData.name = config.options.weaponName + } else { + return + } + if (game.settings.get('core', 'rollMode') === 'blindroll') { + linkData.blind = true + } + CoC7LinkCreationDialog.fromLinkData(linkData).then(dlg => + dlg.render(true) + ) + } + break + } + } + + static async createRoll (config) { + const usage = await RollDialog.create(config.dialogOptions) + if (usage) { + const cardType = usage.get('cardType') + if (cardType) { + config.dialogOptions.cardType = cardType + } + config.dialogOptions.modifier = Number(usage.get('bonusDice')) + config.dialogOptions.difficulty = Number(usage.get('difficulty')) + config.dialogOptions.flatDiceModifier = Number( + usage.get('flatDiceModifier') + ) + config.dialogOptions.flatThresholdModifier = Number( + usage.get('flatThresholdModifier') + ) + } + } + + static async runRoll (config) { + switch (config.dialogOptions.cardType) { + case CoC7ChatMessage.CARD_TYPE_SAN_CHECK: + { + const sanData = await SanDataDialog.create({ + promptLabel: true + }) + if (sanData) { + let sanMin = sanData.get('sanMin') || 0 + let sanMax = sanData.get('sanMax') || 0 + const sanReason = sanData.get('sanReason') + + if (!isNaN(Number(sanMin))) sanMin = Number(sanMin) + if (!isNaN(Number(sanMax))) sanMax = Number(sanMax) + + SanCheckCard.create( + config.options.actor.actorKey, + { sanMin, sanMax, sanReason }, + { + sanModifier: config.dialogOptions.modifier, + sanDifficulty: config.dialogOptions.difficulty, + fastForward: config.options.shiftKey + } + ) + } + } + break + case CoC7ChatMessage.CARD_TYPE_NORMAL: { + const check = new CoC7Check() + check.diceModifier = config.dialogOptions.modifier + check.difficulty = config.dialogOptions.difficulty + check.actor = !config.options.tokenKey + ? config.options.actorId + : config.options.tokenKey + check.flatDiceModifier = config.dialogOptions.flatDiceModifier + check.flatThresholdModifier = config.dialogOptions.flatThresholdModifier + check.standby = + !config.options.preventStandby && + game.settings.get('CoC7', 'stanbyGMRolls') && + game.user.isGM && + config.options.hasPlayerOwner + if (config.dialogOptions.rollType === CoC7ChatMessage.ROLL_TYPE_SKILL) { + check.skill = config.options.skillId + await check.roll() + } else if ( + config.dialogOptions.rollType === CoC7ChatMessage.ROLL_TYPE_ATTRIBUTE + ) { + await check.rollAttribute(config.options.attribute) + } else { + await check.rollCharacteristic(config.options.characteristic) + } + if (config.dialogOptions.chatMessage) { + check.toMessage() + } + return { + result: check.modifiedResult, + successLevel: check.rolledSuccessLevel, + isFumble: check.isFumble, + isCritical: check.isCritical, + successLevels: { + 1: check.regularThreshold, + 2: check.hardThreshold, + 3: check.extremeThreshold + }, + passed: check.passed + } + } + case CoC7ChatMessage.CARD_TYPE_OPPOSED: + case CoC7ChatMessage.CARD_TYPE_COMBINED: + { + const check = new CoC7Check() + check.actor = !config.options.tokenKey + ? config.options.actorId + : config.options.tokenKey + check.characteristic = config.options.characteristic + check.attribute = config.options.attribute + check.skillId = config.options.skillId + check.rollMode = game.settings.get('core', 'rollMode') + check.initiator = game.user.id + let data = {} + if ( + config.dialogOptions.cardType === CoC7ChatMessage.CARD_TYPE_OPPOSED + ) { + data = { + type: OpposedCheckCard.defaultConfig.type, + combat: config.options.isCombat, + action: 'new' + } + check.item = config.options.itemId + check.weaponAltSkill = config.options.weaponAltSkill + check.denyPush = true // Opposed rolled can't be pushed. + await check._perform() + } else { + data = { + type: CombinedCheckCard.defaultConfig.type, + action: 'new' + } + check.difficulty = config.dialogOptions.difficulty + } + data.roll = check.JSONRollData + data._rollMode = game.settings.get('core', 'rollMode') + if ( + config.dialogOptions.cardType === CoC7ChatMessage.CARD_TYPE_OPPOSED + ) { + OpposedCheckCard.dispatch(data) + } else { + CombinedCheckCard.dispatch(data) + } + } + break + } + } +} diff --git a/module/apps/coc7-system-socket.js b/module/apps/coc7-system-socket.js new file mode 100644 index 00000000..3bc7a325 --- /dev/null +++ b/module/apps/coc7-system-socket.js @@ -0,0 +1,98 @@ +/* global fromUuid, game, ui */ +import { CoC7Utilities } from '../utilities.js' +import { CombinedCheckCard } from '../chat/cards/combined-roll.js' +import { OpposedCheckCard } from '../chat/cards/opposed-roll.js' + +export class CoC7SystemSocket { + /** + * @param {object} data Data to send to socket. + * @param {string} [data.type] Action to run + * @param {string|undefined} [data.listener] only this specfic user should run the action + * @return {void} + */ + static async callSocket (data) { + if (typeof data.listener !== 'undefined') { + if (game.user.id === data.listener) { + switch (data.type) { + default: + } + } + } else { + if (game.user.isGM) { + switch (data.type) { + case OpposedCheckCard.defaultConfig.type: + OpposedCheckCard.dispatch(data) + break + case CombinedCheckCard.defaultConfig.type: + CombinedCheckCard.dispatch(data) + break + case 'invoke': + { + const item = await fromUuid(data.item) + item[data.method](data.data) + } + break + } + } + switch (data.type) { + case 'updateChar': + CoC7Utilities.updateCharSheets() + break + } + } + } + + /** + * Request Keeper action, if you are a keeper run yourself, if there is no active GM show error + * @param {object} data Data to send to socket. + */ + static requestKeeperAction (data) { + if (game.user.isGM) { + data.listener = game.user.id + CoC7SystemSocket.callSocket(data) + } else { + const keepers = game.users.filter(u => u.active && u.isGM) + if (keepers.length) { + data.listener = keepers[0].id + game.socket.emit('system.CoC7', data) + } else { + ui.notifications.error( + game.i18n.localize('CoC7.ErrorMissingKeeperUser') + ) + } + } + } + + /** + * Request user action + * @param {object} data Data to send to socket. + * @param {string|null} userId Only this user id should run the action. + * @param {boolean} errorIfMissing If requesting a specific user should run the action error if user not found / logged in. + * @param {boolean} includeSelf If running as all users should the current user also run the action. + * @return {void} + */ + static requestUserAction ( + data, + { userId = null, errorIfMissing = true, includeSelf = true } = {} + ) { + if (userId && typeof userId !== 'undefined') { + if (userId === game.user.id) { + data.listener = game.user.id + CoC7SystemSocket.callSocket(data) + } else { + const user = game.users.get(userId) + if (typeof user.id !== 'undefined' && user.active) { + data.listener = user.id + game.socket.emit('system.CoC7', data) + } else if (errorIfMissing) { + ui.notifications.error(game.i18n.localize('CoC7.ErrorMissingUser')) + } + } + } else { + if (includeSelf) { + CoC7SystemSocket.callSocket(data) + } + game.socket.emit('system.CoC7', data) + } + } +} diff --git a/module/apps/coc7-tour.js b/module/apps/coc7-tour.js new file mode 100644 index 00000000..57d6efa3 --- /dev/null +++ b/module/apps/coc7-tour.js @@ -0,0 +1,71 @@ +/* global MutationObserver, Tour, ui */ +let CoC7Tour = class internalCoC7Tour {} +if (typeof Tour !== 'undefined') { + CoC7Tour = class internalCoC7Tour extends Tour { + async waitForElement (selector) { + return new Promise((resolve, reject) => { + const element = document.querySelector(selector) + if (element) { + resolve() + return + } + + const observer = new MutationObserver((mutations, observer) => { + document.querySelectorAll(selector).forEach((el) => { + resolve(el) + observer.disconnect() + }) + }) + + observer.observe(document.body, { + childList: true, + subtree: true + }) + }) + } + + async _preStep () { + await super._preStep() + + // Close currently open applications + if (this.stepIndex === 0) { + for (const app of Object.values(ui.windows)) { + app.close() + } + } + + await this.waitForElement(this.currentStep.selector) + } + + async _postStep () { + await super._postStep() + if (this.stepIndex < 0 || !this.hasNext) { + return + } + + if (!this.currentStep.action) { + return + } + + if (this.isResetting) { + this.isResetting = false + return + } + + switch (this.currentStep.action) { + case 'click': + document.querySelector(this.currentStep.selector).click() + break + } + } + + async reset () { + if (this.status !== 'completed') { + this.isResetting = true + } + await super.reset() + } + } +} + +export { CoC7Tour } diff --git a/module/apps/create-mythos-encounters.js b/module/apps/create-mythos-encounters.js new file mode 100644 index 00000000..996311e8 --- /dev/null +++ b/module/apps/create-mythos-encounters.js @@ -0,0 +1,53 @@ +/* global $, FormApplication, game, mergeObject */ +export class CoC7CreateMythosEncounter extends FormApplication { + static get defaultOptions () { + return mergeObject(super.defaultOptions, { + classes: ['coc7'], + title: game.i18n.localize('CoC7.SanityLossTypeDialogTitle'), + template: 'systems/CoC7/templates/apps/sanity-loss-type.hbs', + height: 'auto' + }) + } + + async getData () { + const data = await super.getData() + data.isImmunity = data.object.type === 'immunity' + return data + } + + activateListeners (html) { + html.find('.field_type').change(this._onSelectChange.bind(this)) + html.find('.dialog-button').click(this._onButtonClick.bind(this)) + super.activateListeners(html) + } + + _onButtonClick (event) { + if (event.currentTarget.dataset.button === 'add') { + const html = $(event.currentTarget).closest('.window-content') + const type = html.find('.field_type').val() + const name = html.find('.field_name').val() + const value = parseInt(html.find('.field_value').val()) + const sanityLossEvents = + this.object.actor.data.data.sanityLossEvents ?? [] + sanityLossEvents.push({ + type: name, + totalLoss: value, + immunity: type === 'immunity' + }) + sanityLossEvents.sort(function (left, right) { + return left.type.localeCompare(right.type) + }) + this.object.actor.update({ 'data.sanityLossEvents': sanityLossEvents }) + } + this.close() + } + + _onSelectChange (event) { + const html = $(event.currentTarget).closest('.window-content') + this.object.name = html.find('.field_name').val() + this.object.type = html.find('.field_type').val() + this.render(true) + } + + async _updateObject (event, formData) {} +} diff --git a/module/apps/decader-die-other.js b/module/apps/decader-die-other.js new file mode 100644 index 00000000..4b4c8076 --- /dev/null +++ b/module/apps/decader-die-other.js @@ -0,0 +1,7 @@ +import { CoC7DecaderDie } from './decader-die.js' + +export class CoC7DecaderDieOther extends CoC7DecaderDie { + static get DENOMINATION () { + return 'o' + } +} diff --git a/module/apps/decader-dsn-faces.js b/module/apps/decader-dsn-faces.js new file mode 100644 index 00000000..b6246f8a --- /dev/null +++ b/module/apps/decader-dsn-faces.js @@ -0,0 +1,34 @@ +/* global game */ +export class CoC7DecaderDSNFaces { + construtor () { + this.selected = '' + } + + setFaces () { + let selected = game.user.getFlag('dice-so-nice', 'appearance')?.global + .system + if (selected !== this.selected) { + let data + let destination + let sourceDie = game.dice3d.DiceFactory.systems[selected]?.dice.find( + d => d.type === 'd100' + ) + if (typeof sourceDie === 'undefined') { + sourceDie = game.dice3d.DiceFactory.systems.standard.dice.find( + d => d.type === 'd100' + ) + selected = 'standard' + } + if (typeof sourceDie !== 'undefined') { + destination = game.dice3d.DiceFactory.systems.standard.dice.findIndex( + d => d.type === 'dt' + ) + data = Object.assign({}, sourceDie) + data.type = 'dt' + game.dice3d.DiceFactory.systems.standard.dice[destination] = + Object.assign(sourceDie.constructor.prototype, data) + } + this.selected = selected + } + } +} diff --git a/module/apps/dholehouse_importer.js b/module/apps/dholehouse_importer.js new file mode 100644 index 00000000..3787f8c3 --- /dev/null +++ b/module/apps/dholehouse_importer.js @@ -0,0 +1,379 @@ +/* global Actor, CONFIG, duplicate, game, ui, fetch */ +import { CoCActor } from '../actors/actor.js' +import { CoC7DirectoryPicker } from '../scripts/coc7-directory-picker.js' +import { CoC7Utilities } from '../utilities.js' + +/** + * CoC7ActorImporter helper class to import an Actor from the raw text description. + */ +export class CoC7DholeHouseActorImporter { + /** + * Compose the Backstory from the different blocks. + * @param {} backstoryJSON DholeHouse backstory JSON + * @returns HTML with the formatted backstory + */ + static getBackstory (backstoryJSON) { + const sections = [ + ['description', 'Description'], + ['traits', 'Traits'], + ['ideology', 'Ideology'], + ['injurues', 'Injuries', 'injuries'], + ['people', 'People'], + ['phobias', 'Phobias'], + ['locations', 'Locations'], + ['tomes', 'Tomes'], + ['possessions', 'Possessions'], + ['encounters', 'Encounters'] + ] + const backstory = { + block: [], + sections: [] + } + for (const section of sections) { + if (backstoryJSON[section[0]] !== null) { + if (typeof section[2] === 'undefined' || section[2] === '') { + section[2] = section[0] + } + backstory.block.push( + `

                                                        ${section[1]}

                                                        \n
                                                        \n${ + backstoryJSON[section[0]] + }\n
                                                        ` + ) + backstory.sections.push({ + title: section[1], + value: backstoryJSON[section[0]] + }) + } + } + backstory.block = + '

                                                        Backstory

                                                        \n' + backstory.block.join('\n', backstory.block) + return backstory + } + + /** + * + * @param {JSON} dholeHouseData DholeHouseJSON + * @returns + */ + static async convertDholeHouseCharacterData (dholeHouseData, options) { + if (CONFIG.debug.CoC7Importer) { + console.log('Source:', dholeHouseData) + } + dholeHouseData = dholeHouseData.Investigator + const backstories = CoC7DholeHouseActorImporter.getBackstory( + dholeHouseData.Backstory + ) + const cData = { + name: dholeHouseData.PersonalDetails.Name, + actor: { + characteristics: { + str: { value: parseInt(dholeHouseData.Characteristics.STR, 10) }, + con: { value: parseInt(dholeHouseData.Characteristics.CON, 10) }, + siz: { value: parseInt(dholeHouseData.Characteristics.SIZ, 10) }, + dex: { value: parseInt(dholeHouseData.Characteristics.DEX, 10) }, + app: { value: parseInt(dholeHouseData.Characteristics.APP, 10) }, + int: { value: parseInt(dholeHouseData.Characteristics.INT, 10) }, + pow: { value: parseInt(dholeHouseData.Characteristics.POW, 10) }, + edu: { value: parseInt(dholeHouseData.Characteristics.EDU, 10) } + }, + attribs: { + san: { + value: parseInt(dholeHouseData.Characteristics.Sanity, 10), + max: parseInt(dholeHouseData.Characteristics.SanityMax, 10), + dailyLimit: Math.floor(dholeHouseData.Characteristics.Sanity / 5) + }, + hp: { + value: parseInt(dholeHouseData.Characteristics.HitPts, 10), + max: parseInt(dholeHouseData.Characteristics.HitPtsMax, 10) + }, + mp: { + value: parseInt(dholeHouseData.Characteristics.MagicPts, 10), + max: parseInt(dholeHouseData.Characteristics.MagicPtsMax, 10) + }, + lck: { + value: parseInt(dholeHouseData.Characteristics.Luck, 10) + }, + mov: { + value: parseInt(dholeHouseData.Characteristics.Move, 10), + max: parseInt(dholeHouseData.Characteristics.Move, 10) + }, + db: { value: dholeHouseData.Characteristics.DamageBonus }, + build: { value: parseInt(dholeHouseData.Characteristics.Build, 10) } + }, + infos: { + occupation: dholeHouseData.PersonalDetails.Occupation, + age: dholeHouseData.PersonalDetails.Age, + sex: dholeHouseData.PersonalDetails.Gender, + residence: dholeHouseData.PersonalDetails.Residence, + birthplace: dholeHouseData.PersonalDetails.Birthplace + }, + backstory: backstories.block, + biography: backstories.sections, + description: { + keeper: game.i18n.localize('CoC7.DholeHouseActorImporterSource') + } + }, + skills: await CoC7DholeHouseActorImporter.extractSkills( + dholeHouseData.Skills.Skill ?? [], + options + ), + possesions: await CoC7DholeHouseActorImporter.extractPossessions( + dholeHouseData.Possessions?.item ?? [], + options + ) + } + return cData + } + + static makeSkillName (name, specialization) { + if (specialization === 'None') { + specialization = 'Any' + } + if (name === 'Language (Other)' || name === 'Language (Own)') { + name = 'Language' + } else if (name === 'Operate Heavy Machine') { + name = 'Operate Heavy Machinery' + } else if (name === 'Throw' && specialization === '') { + name = 'Fighting' + specialization = 'Throw' + } + return { + skillName: specialization === '' ? name : specialization, + specialization: specialization === '' ? '' : name, + name: name + (specialization === '' ? '' : ' (' + specialization + ')') + } + } + + static async extractSkills (dholeHouseskills, options) { + const skills = [] + for (const skill of dholeHouseskills) { + if ( + skill.subskill === 'None' && + skill.value === '1' && + skill.half === '0' && + skill.fifth === '0' + ) { + continue + } + const parts = CoC7DholeHouseActorImporter.makeSkillName( + skill.name, + skill.subskill ?? '' + ) + const existing = await CoC7Utilities.guessItem('skill', parts.name, { + source: options.source, + fallbackAny: true + }) + let cloned = null + if (typeof existing !== 'undefined') { + cloned = duplicate(existing.toObject()) + cloned.name = parts.name + cloned.data.skillName = parts.skillName + cloned.data.specialization = parts.specialization + } else { + cloned = CoCActor.emptySkill( + parts.skillName, + parseInt(skill.value ?? 0, 10), + { + specialization: + parts.specialization === '' ? false : parts.specialization + } + ) + cloned.data.properties = cloned.data.properties ?? {} + if (parts.specialization === 'Fighting') { + cloned.data.properties.fighting = true + cloned.data.properties.combat = true + cloned.data.properties.push = false + } else if (parts.specialization === 'Firearms') { + cloned.data.properties.firearm = true + cloned.data.properties.combat = true + cloned.data.properties.push = false + } else if (parts.skillName === 'Dodge') { + cloned.data.properties.push = false + } + } + if (cloned.data.skillName === 'Any') { + cloned.name = cloned.name.replace(' (Any)', ' (None)') + cloned.data.skillName = 'None' + } + cloned.data.base = parseInt(skill.value ?? 0, 10) + cloned.data.value = parseInt(skill.value ?? 0, 10) + cloned.data.flags = cloned.data.flags ?? {} + cloned.data.flags.occupation = + skill.occupation === true || skill.occupation === 'true' + skills.push(cloned) + } + return skills + } + + static findWeaponSkillId (skillName, character) { + const skills = character.getEmbeddedCollection('Item') + const checkName = skillName.replace(/^\((.+)\)$/, '$1') + const characterSkill = skills.find(i => { + return ( + i.data.data?.skillName === checkName || + i.data.data?.skillName?.indexOf(checkName) > -1 + ) + }) + return characterSkill + } + + static async extractPossessions (dholehousePossessions, options) { + const items = [] + for (const item of dholehousePossessions) { + const existing = await CoC7Utilities.guessItem('item', item.description, { + source: options.source + }) + let cloned = null + if (typeof existing !== 'undefined') { + cloned = duplicate(existing.toObject()) + } else { + cloned = { + name: item.description, + type: 'item' + } + } + items.push(cloned) + } + return items + } + + static async extractWeapons (dholehouseWeapons, character, options) { + const weapons = [] + if (!Array.isArray(dholehouseWeapons)) { + dholehouseWeapons = [dholehouseWeapons] + } + for (const weapon of dholehouseWeapons) { + const skill = CoC7DholeHouseActorImporter.findWeaponSkillId( + weapon.skillname, + character + ) + const damage = weapon.damage.replace(/\+DB/i, '') + const addb = damage !== weapon.damage + const existing = await CoC7Utilities.guessItem('weapon', weapon.name, { + source: options.source + }) + let cloned = null + if (typeof existing !== 'undefined') { + cloned = duplicate(existing.toObject()) + cloned.data.skill.main.name = skill?.name ?? '' + cloned.data.skill.main.id = skill?.id ?? '' + cloned.data.range = cloned.data.range ?? {} + cloned.data.range.normal = cloned.data.range.normal ?? {} + cloned.data.range.normal.damage = damage + cloned.data.ammo = weapon.ammo + cloned.data.malfunction = weapon.malf + cloned.data.properties = cloned.data.properties ?? {} + cloned.data.properties.melee = + skill?.data.data.properties?.fighting ?? false + cloned.data.properties.rngd = + skill?.data.data.properties?.firearm ?? false + cloned.data.properties.addb = addb + } else { + cloned = { + name: weapon.name, + type: 'weapon', + data: { + skill: { + main: { + name: skill?.name ?? '', + id: skill?.id ?? '' + } + }, + range: { + normal: { + damage + } + }, + ammo: weapon.ammo, + malfunction: weapon.malf, + properties: { + melee: skill?.data.data.properties?.fighting ?? false, + rngd: skill?.data.data.properties?.firearm ?? false, + addb + } + } + } + } + weapons.push(cloned) + } + return weapons + } + + static async savePortrait (base64Portrait, fileName) { + const base64Response = await fetch( + 'data:image/png;base64,' + base64Portrait + ) + const imageBlob = await base64Response.blob() + const filePath = CoC7DirectoryPicker.uploadToDefaultDirectory( + imageBlob, + fileName + ) + return filePath + } + + static async createNPCFromDholeHouse (dholeHouseCharacterData, options) { + if (!game.user?.can('FILES_UPLOAD')) { + ui.notifications.error( + game.i18n.localize('CoC7.ActorImporterUploadError') + ) + return false + } + const characterData = + await CoC7DholeHouseActorImporter.convertDholeHouseCharacterData( + dholeHouseCharacterData, + options + ) + if (CONFIG.debug.CoC7Importer) { + console.log('Character Data:', characterData) + } + const importedCharactersFolder = + await CoC7Utilities.createImportCharactersFolderIfNotExists() + if (!CoC7DirectoryPicker.createDefaultDirectory()) { + return false + } + const actorData = { + name: characterData.name, + type: 'character', + folder: importedCharactersFolder.id, + data: characterData.actor + } + const npc = await Actor.create(actorData) + // If possible upload the image portrait + if ( + dholeHouseCharacterData.Investigator.PersonalDetails.Portrait?.length > 10 + ) { + const fileName = 'avatar-' + npc.id + '.png' + const portrait = await CoC7DholeHouseActorImporter.savePortrait( + dholeHouseCharacterData.Investigator.PersonalDetails.Portrait, + fileName + ) + if (portrait !== false) { + npc.update({ + img: portrait + }) + } + } + if (CONFIG.debug.CoC7Importer) { + console.log('Items: ', characterData.items) + } + await npc.createEmbeddedDocuments('Item', characterData.skills, { + renderSheet: false + }) + await npc.createEmbeddedDocuments('Item', characterData.possesions, { + renderSheet: false + }) + const weapons = await CoC7DholeHouseActorImporter.extractWeapons( + dholeHouseCharacterData.Investigator.Weapons?.weapon ?? [], + npc, + options + ) + if (CONFIG.debug.CoC7Importer) { + console.log('Weapons: ', weapons) + } + await npc.createEmbeddedDocuments('Item', weapons, { + renderSheet: false + }) + + return npc + } +} diff --git a/module/apps/link-creation-dialog.js b/module/apps/link-creation-dialog.js index 5fb2d50a..2e725157 100644 --- a/module/apps/link-creation-dialog.js +++ b/module/apps/link-creation-dialog.js @@ -1,4 +1,4 @@ -/* global canvas, diffObject, expandObject, FormApplication, game, mergeObject, ui */ +/* global canvas, CONST,diffObject, expandObject, FormApplication, FormDataExtended, foundry, game, mergeObject, ui */ import { CoCActor } from '../actors/actor.js' import { chatHelper } from '../chat/helper.js' import { CoC7Check } from '../check.js' @@ -10,19 +10,26 @@ export class CoC7LinkCreationDialog extends FormApplication { static get defaultOptions () { return mergeObject(super.defaultOptions, { id: 'link-creation', - classes: ['coc7'], + classes: ['coc7', 'active-effect-sheet'], title: game.i18n.localize('CoC7.CreateLink'), dragDrop: [{ dragSelector: null, dropSelector: '.container' }], template: 'systems/CoC7/templates/apps/link-creation.html', closeOnSubmit: false, submitOnClose: true, submitOnChange: true, - width: 400, + width: 560, height: 'auto', choices: {}, allowCustom: true, minimum: 0, - maximum: null + maximum: null, + tabs: [ + { + navSelector: '.tabs', + contentSelector: '.effect-options', + initial: 'details' + } + ] }) } @@ -31,12 +38,34 @@ export class CoC7LinkCreationDialog extends FormApplication { return new CoC7LinkCreationDialog(link, options) } + static get attributes () { + return [ + { + key: 'lck', + label: game.i18n.localize('CoC7.Luck'), + selected: false + }, + { + key: 'san', + label: game.i18n.localize('CoC7.Sanity'), + selected: false + } + ] + } + /** @override */ async getData () { const data = await super.getData() data.link = this.link data.data = this.link.data + data.data.effect.modes = Object.entries(CONST.ACTIVE_EFFECT_MODES).reduce( + (obj, e) => { + obj[e[1]] = game.i18n.localize('EFFECT.MODE_' + e[0]) + return obj + }, + {} + ) data.fromGame = this.link.is.item || (this.link.is.check && this.link.check === CoC7Link.CHECK_TYPE.SKILL) @@ -79,6 +108,11 @@ export class CoC7LinkCreationDialog extends FormApplication { key: CoC7Link.LINK_TYPE.ITEM, label: game.i18n.localize('CoC7.ItemWeapon'), selected: this.link.is.item + }, + { + key: CoC7Link.LINK_TYPE.EFFECT, + label: game.i18n.localize('EFFECT.TabEffects'), + selected: this.link.is.effect } ] @@ -106,18 +140,10 @@ export class CoC7LinkCreationDialog extends FormApplication { } // Prepare characteristics - data.attributes = [ - { - key: 'lck', - label: game.i18n.localize('CoC7.Luck'), - selected: data.data.attributeKey === 'lck' - }, - { - key: 'san', - label: game.i18n.localize('CoC7.Sanity'), - selected: data.data.attributeKey === 'san' - } - ] + data.attributes = CoC7LinkCreationDialog.attributes.map(e => { + e.selected = data.data.attributeKey === e.key + return e + }) return data } @@ -137,6 +163,46 @@ export class CoC7LinkCreationDialog extends FormApplication { // const test = dragDrop.bind(html[0]); super.activateListeners(html) + + // Handling effects + html.find('.effect-control').click(this._onEffectControl.bind(this)) + } + + _onEffectControl (event) { + event.preventDefault() + const button = event.currentTarget + switch (button.dataset.action) { + case 'add': + return this._addEffectChange() + case 'delete': + button.closest('.effect-change').remove() + return this.submit({ preventClose: true }).then(() => this.render()) + } + } + + async _addEffectChange () { + const idx = this.link.data.effect.changes.length + return this.submit({ + preventClose: true, + updateData: { + [`effect.changes.${idx}`]: { + key: '', + mode: CONST.ACTIVE_EFFECT_MODES.ADD, + value: '' + } + } + }) + } + + /** @inheritdoc */ + _getSubmitData (updateData = {}) { + const fd = new FormDataExtended(this.form, { editors: this.editors }) + const data = foundry.utils.expandObject(fd.toObject()) + if (updateData) foundry.utils.mergeObject(data, updateData) + if (data.effect) { + data.effect.changes = Array.from(Object.values(data.effect.changes || {})) + } + return data } async _onDrop (event) { @@ -196,8 +262,30 @@ export class CoC7LinkCreationDialog extends FormApplication { } } - _onClickSubmit (event) { + async _onClickSubmit (event) { const action = event.currentTarget.dataset.action + // if( action === 'create-effect'){ + // let item = game.items.find(i => i.name === '__CoC7InternalItem__') + // if (!item) + // item = await Item.create({ + // name: '__CoC7InternalItem__', + // type: 'item' + // }) + // for( const e of item.effects){ + // await e.delete() + // } + // 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) + // } if (!this.link.link) { // ui.notifications.warn( 'Link is invalid !'); return @@ -210,16 +298,18 @@ export class CoC7LinkCreationDialog extends FormApplication { case 'chat': { const option = {} + let message option.speaker = { alias: game.user.name } - chatHelper.createMessage( - null, - game.i18n.format('CoC7.MessageCheckRequestedWait', { + if (this.link.is.effect) { + message = `
                                                        ${this.link.link}
                                                        ` + } else { + message = game.i18n.format('CoC7.MessageCheckRequestedWait', { check: this.link.link - }), - option - ) + }) + } + chatHelper.createMessage(null, message, option) } break @@ -244,14 +334,16 @@ export class CoC7LinkCreationDialog extends FormApplication { case 'whisper-selected': { if (!canvas.tokens.controlled.length) { - ui.notifications.warn('No tokens selected') + ui.notifications.warn( + game.i18n.localize('CoC7.ErrorNoTokensSelected') + ) return } const option = {} option.speaker = { alias: game.user.name } - canvas.tokens.controlled.forEach(t => { + for (const t of canvas.tokens.controlled) { if (t.actor.hasPlayerOwner) { option.whisper = t.actor.owners chatHelper.createMessage( @@ -263,7 +355,7 @@ export class CoC7LinkCreationDialog extends FormApplication { option ) } - }) + } } break diff --git a/module/apps/link.js b/module/apps/link.js index 9ab9860f..ed4372bd 100644 --- a/module/apps/link.js +++ b/module/apps/link.js @@ -1,16 +1,30 @@ -/* global duplicate, game, mergeObject */ +/* global duplicate, foundry, game, mergeObject */ import { chatHelper } from '../chat/helper.js' +import { CoCActor } from '../actors/actor.js' +import { CoC7LinkCreationDialog } from './link-creation-dialog.js' export class CoC7Link { constructor () { this._linkData = { type: CoC7Link.LINK_TYPE.CHECK, - check: CoC7Link.CHECK_TYPE.SKILL + check: CoC7Link.CHECK_TYPE.SKILL, + effect: { + label: game.i18n.localize('CoC7.EffectNew'), + icon: 'icons/svg/aura.svg', + changes: [] + } } } static async fromData (linkData) { + const label = CoC7LinkCreationDialog.attributes + .concat(CoCActor.getCharacteristicDefinition()) + .filter(e => e.key === linkData.name) + .map(e => e.label) + if (label.length > 0) { + linkData.label = label[0] + } const link = new CoC7Link() await link.setData(linkData) return link @@ -36,7 +50,8 @@ export class CoC7Link { return { CHECK: 1, SANLOSS: 2, - ITEM: 3 + ITEM: 3, + EFFECT: 4 } } @@ -60,6 +75,7 @@ export class CoC7Link { data.isCheck = this.is.check data.isSanloss = this.is.sanloss data.isItem = this.is.item + data.isEffect = this.is.effect return data } @@ -74,7 +90,7 @@ export class CoC7Link { const pack = game.packs.get(this._linkData.pack) if (!pack) return false if (pack.metadata.entity !== 'Item') return undefined - this._item = await pack.getEntity(this._linkData.id) + this._item = await pack.getDocument(this._linkData.id) } if (this._linkData.fromDirectory) { @@ -197,6 +213,17 @@ export class CoC7Link { // San Data this._linkData.sanMin = x.sanMin this._linkData.sanMax = x.sanMax + + // Effect + if (this.is.effect || x.object) { + if ( + x.object && + (typeof x.object === 'string' || x.object instanceof String) + ) { + this._linkData.effect = JSON.parse(x.object) + } else this._linkData.effect = foundry.utils.deepClone(x.object) + if (!this._linkData.effect.changes) this._linkData.effect.changes = [] + } } get type () { @@ -211,6 +238,8 @@ export class CoC7Link { return 'attribute' case CoC7Link.CHECK_TYPE.SKILL: return 'skill' + case CoC7Link.CHECK_TYPE.EFFECT: + return 'effect' default: return undefined } @@ -229,6 +258,9 @@ export class CoC7Link { case 'item': this._linkData.type = CoC7Link.LINK_TYPE.ITEM break + case 'effect': + this._linkData.type = CoC7Link.LINK_TYPE.EFFECT + break default: this._linkData.type = undefined break @@ -317,6 +349,12 @@ export class CoC7Link { }, set item (x) { if (x === true) link.type = CoC7Link.LINK_TYPE.ITEM + }, + get effect () { + return link.type === CoC7Link.LINK_TYPE.EFFECT + }, + set effect (x) { + if (x === true) link.type = CoC7Link.LINK_TYPE.EFFECT } } } @@ -380,6 +418,9 @@ export class CoC7Link { if (this._linkData.difficulty) { options += `,difficulty:${this._linkData.difficulty}` } + if (this._linkData.sanReason) { + options += `,sanReason:${this._linkData.sanReason}` + } if (this._linkData.modifier) { options += `,modifier:${this._linkData.modifier}` } @@ -409,8 +450,34 @@ export class CoC7Link { return link } + case CoC7Link.LINK_TYPE.EFFECT: { + const effectData = foundry.utils.deepClone(this._linkData.effect) + if (!this.effectIsTemp) delete effectData.duration + if (effectData.changes.length === 0) delete effectData.changes + if (!effectData.disabled) delete effectData.disabled + if (!effectData.tint) delete effectData.tint + let link = `@coc7.effect[${JSON.stringify(effectData)}]` + if ( + this._linkData.hasLabel && + typeof this._linkData.label !== 'undefined' + ) { + link += `{${this._linkData.label}}` + } + return link + } + default: return null } } + + get effectIsTemp () { + if (!this._linkData.effect.duration) return false + const duration = + this._linkData.effect.duration.seconds ?? + (this._linkData.effect.duration.rounds || + this._linkData.effect.duration.turns) ?? + 0 + return duration > 0 + } } diff --git a/module/apps/parser.js b/module/apps/parser.js index 20d460a4..ab5fe156 100644 --- a/module/apps/parser.js +++ b/module/apps/parser.js @@ -47,27 +47,30 @@ export class CoC7Parser { const data = JSON.parse(dataString) if (data.linkType === 'coc7-link') { event.stopPropagation() - if ( - !event.shiftKey && - (typeof data.difficulty === 'undefined' || - typeof data.modifier === 'undefined') - ) { - const usage = await RollDialog.create({ - disableFlatDiceModifier: true - }) - if (usage) { - data.modifier = usage.get('bonusDice') - data.difficulty = usage.get('difficulty') + if (data.type !== 'effect') { + if ( + !event.shiftKey && + (typeof data.difficulty === 'undefined' || + typeof data.modifier === 'undefined') + ) { + const usage = await RollDialog.create({ + disableFlatDiceModifier: true + }) + if (usage) { + data.modifier = usage.get('bonusDice') + data.difficulty = usage.get('difficulty') + } } - } - if (game.settings.get('core', 'rollMode') === 'blindroll') { - data.blind = true - } - - const link = CoC7Parser.createCoC7Link(data) - - if (link) { - editor.insertContent(link) + if (game.settings.get('core', 'rollMode') === 'blindroll') { + data.blind = true + } + const link = CoC7Parser.createCoC7Link(data) + if (link) { + editor.insertContent(link) + } + } else { + const link = await CoC7Link.fromData(data) + editor.insertContent(link.link) } } else if (isCtrlKey(event)) { event.stopPropagation() @@ -125,7 +128,7 @@ export class CoC7Parser { html, data /* chatMessage, data/*, option, user */ ) { - // @coc7.sanloss[sanMax:1D6,sanMin:1,difficulty:++,modifier:-1]{Hard San Loss (-1) 1/1D6} + // @coc7.sanloss[sanMax:1D6,sanMin:1,sanReason:Ghouls,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,name:anthropology,difficulty:+,modifier:-1]{Hard Anthropology check(-1)} @@ -242,10 +245,8 @@ export class CoC7Parser { text = TextEditor._getTextNodes(html) // Alternative regex : '@(coc7).([^\[]+)\[([^\]]+)\](?:{([^}]+)})?' - const rgx = new RegExp( - '@(coc7).(.*?)\\[([^\\]]+)\\]' + '(?:{([^}]+)})?', - 'gi' - ) + // Before active effect : '@(coc7).(.*?)\\[([^\\]]+)\\]' + '(?:{([^}]+)})?', + const rgx = new RegExp('@(coc7).(.*?)\\[(.*)\\]' + '(?:{([^}]+)})?', 'gi') TextEditor._replaceTextContent(text, rgx, CoC7Parser._createLink) return html.innerHTML } @@ -261,12 +262,20 @@ export class CoC7Parser { static _onDragCoC7Link (event) { const a = event.currentTarget - const i = a.querySelector('i.link-icon') + const i = a.querySelector('[data-link-icon]') const data = duplicate(a.dataset) data.linkType = 'coc7-link' data.CoC7Type = 'link' data.icon = null + if ( + data.object && + (typeof data.object === 'string' || data.object instanceof String) + ) { + data.object = JSON.parse(data.object) + data.type = 'effect' + } + if ( i.dataset && i.dataset.linkIcon && @@ -279,23 +288,37 @@ export class CoC7Parser { } static _createLink (match, tag, type, options, name) { + if (typeof match !== 'string') { + // Foundry VTT v10 + name = match[4] ?? undefined + options = match[3] ?? undefined + type = match[2] ?? undefined + tag = match[1] ?? undefined + match = match[0] ?? undefined + } + const data = { cls: ['coc7-link'], dataset: { check: type }, - icon: 'fas fa-dice', + icon: null, blind: false, - name: name + name } const matches = options.matchAll(/[^,]+/gi) - for (const match of Array.from(matches)) { - let [key, value] = match[0].split(':') - if (key === 'icon') data.icon = value - if (key === 'blind' && typeof value === 'undefined') { - value = true - data.blind = true && ['check'].includes(type.toLowerCase()) + if (type === 'effect') { + data.effect = JSON.parse(options) + data.dataset.object = options + } else { + for (const match of Array.from(matches)) { + let [key, value] = match[0].split(':') + if (key === 'icon') data.icon = value + if (key === 'blind' && typeof value === 'undefined') { + value = true + data.blind = true && ['check'].includes(type.toLowerCase()) + } + data.dataset[key] = value } - data.dataset[key] = value } let title @@ -321,15 +344,16 @@ export class CoC7Parser { data.dataset.type?.toLowerCase() ) ) { - humanName = CoC7Utilities.getCharacteristicNames(data.dataset.name) - ?.label + humanName = CoC7Utilities.getCharacteristicNames( + data.dataset.name + )?.label } title = game.i18n.format( `CoC7.LinkCheck${!data.dataset.difficulty ? '' : 'Diff'}${ !data.dataset.modifier ? '' : 'Modif' }`, { - difficulty: difficulty, + difficulty, modifier: data.dataset.modifier, name: humanName } @@ -342,7 +366,7 @@ export class CoC7Parser { !data.dataset.modifier ? '' : 'Modif' }`, { - difficulty: difficulty, + difficulty, modifier: data.dataset.modifier, sanMin: data.dataset.sanMin, sanMax: data.dataset.sanMax @@ -355,12 +379,15 @@ export class CoC7Parser { !data.dataset.modifier ? '' : 'Modif' }`, { - difficulty: difficulty, + difficulty, modifier: data.dataset.modifier, name: data.dataset.name } ) break + case 'effect': + title = data.effect.label + break default: break } @@ -376,11 +403,18 @@ export class CoC7Parser { a.dataset[k] = v } a.draggable = true - a.innerHTML = `${ - data.blind ? '' : '' - }${ - data.name - }` + data.icon = data.icon ?? data.effect?.icon ?? 'fas fa-dice' + // check if it's an image or an icon + if (data.icon.includes('\\') || data.icon.includes('.')) { + data.img = data.icon + } + if (data.blind) a.innerHTML += '' + if (data.img) { + a.innerHTML += `` + } else { + a.innerHTML += `` + } + a.innerHTML += `${data.name}` return a } @@ -410,7 +444,9 @@ export class CoC7Parser { return } if (canvas.tokens.controlled.length) { - canvas.tokens.controlled.forEach(token => { + const link = await CoC7Link.fromData(options) + + for (const token of canvas.tokens.controlled) { switch (options.check) { case 'check': if ( @@ -444,16 +480,9 @@ export class CoC7Parser { break case 'sanloss': { - SanCheckCard.create(token.actor.id, options, { + SanCheckCard.create(token.actor.actorKey, options, { fastForward: event.shiftKey }) - // const check = new CoC7SanCheck( - // token.actor.id, - // options.sanMin, - // options.sanMax, - // undefined != options.difficulty?CoC7Utilities.convertDifficulty(options.difficulty):CoC7Check.difficultyLevel.regular, - // undefined != options.modifier?Number(options.modifier):0); - // check.toMessage( event.shiftKey); break } @@ -461,9 +490,15 @@ export class CoC7Parser { return token.actor.weaponCheck(options, event.shiftKey) } + case 'effect': + await token.actor.createEmbeddedDocuments('ActiveEffect', [ + link.data.effect + ]) + break + default: } - }) + } } else { if (game.user.data.document.character?.data) { await Promise.all( diff --git a/module/apps/point-selection-dialog.js b/module/apps/point-selection-dialog.js index fec2cb1a..b647d17f 100644 --- a/module/apps/point-selection-dialog.js +++ b/module/apps/point-selection-dialog.js @@ -13,11 +13,11 @@ export class PointSelectDialog extends Dialog { async _onSelectCharacteristic (event) { const li = event.currentTarget.closest('.item') const itemList = li.closest('.item-list') - itemList.querySelectorAll('.selectable').forEach(item => { + for (const item of itemList.querySelectorAll('.selectable')) { item.classList.remove('selected') this.data.data.characteristics[item.dataset.key].selected = false this.data.data.characteristics[item.dataset.key].optional = false - }) + } $(li).toggleClass('selected') this.data.data.characteristics[li.dataset.key].selected = true const totalPoints = li @@ -60,7 +60,7 @@ export class PointSelectDialog extends Dialog { { title: data.title, content: html, - data: data, + data, buttons: {}, close: () => { if (data.resolved) return resolve(data) diff --git a/module/apps/roll-dialog.js b/module/apps/roll-dialog.js index 21b88167..650c20c7 100644 --- a/module/apps/roll-dialog.js +++ b/module/apps/roll-dialog.js @@ -1,5 +1,6 @@ /* global Dialog, FormData, game, renderTemplate */ +import { CoC7ChatMessage } from './coc7-chat-message.js' import { CoC7Check } from '../check.js' export class RollDialog { @@ -19,32 +20,39 @@ export class RollDialog { options.difficultyLevel.extreme = true } } - // if( undefined == options.askValue) options.askValue = true; if (options.name && !options.displayName) options.displayName = options.name const unknownDifficultyDefault = game.settings.get('CoC7', 'defaultCheckDifficulty') === 'unknown' + const data = { + allowFlatDiceModifier: + game.settings.get('CoC7', 'allowFlatDiceModifier') && + !options.disableFlatDiceModifier, + allowFlatThresholdModifier: + game.settings.get('CoC7', 'allowFlatThresholdModifier') && + !options.disableFlatThresholdModifier, + difficulty: CoC7Check.difficultyLevel, + unknownDifficultyDefault, + hideDifficulty: options.hideDifficulty ?? false, + options + } + if ( + typeof options.cardType !== 'undefined' && + (!options.forcedCardType ?? true) + ) { + data.cardTypes = CoC7ChatMessage.cardTypes(options) + } const html = await renderTemplate( 'systems/CoC7/templates/apps/bonus.html', - { - allowFlatDiceModifier: - game.settings.get('CoC7', 'allowFlatDiceModifier') && - !options.disableFlatDiceModifier, - allowFlatThresholdModifier: - game.settings.get('CoC7', 'allowFlatThresholdModifier') && - !options.disableFlatThresholdModifier, - difficulty: CoC7Check.difficultyLevel, - unknownDifficultyDefault: unknownDifficultyDefault, - options - } + data ) return new Promise(resolve => { let formData = null const dlg = new Dialog({ title: options.displayName ? game.i18n.format('CoC7.BonusSelectionWindowNamed', { - name: options.displayName - }) + name: options.displayName + }) : game.i18n.localize('CoC7.BonusSelectionWindow'), content: html, buttons: { diff --git a/module/apps/sandata-dialog.js b/module/apps/sandata-dialog.js index aa588d52..becb0893 100644 --- a/module/apps/sandata-dialog.js +++ b/module/apps/sandata-dialog.js @@ -21,8 +21,8 @@ export class SanDataDialog extends Dialog { const dlg = new SanDataDialog({ title: options.displayName ? game.i18n.format('CoC7.SanDataSelectionWindowNamed', { - name: options.displayName - }) + name: options.displayName + }) : game.i18n.localize('CoC7.SanDataSelectionWindow'), // TODO: Remove SanDataSelectionWindowNamed content: html, buttons: { diff --git a/module/apps/skill-selection-dialog.js b/module/apps/skill-selection-dialog.js index 4b4d12a3..aa9ca6c9 100644 --- a/module/apps/skill-selection-dialog.js +++ b/module/apps/skill-selection-dialog.js @@ -35,7 +35,7 @@ export class SkillSelectDialog extends Dialog { { title: data.title, content: html, - data: data, + data, buttons: {}, close: () => { if (!data.added >= data.optionsCount) return resolve(false) diff --git a/module/apps/skill-spec-select-dialog.js b/module/apps/skill-spec-select-dialog.js index c6821a90..4cd49ca6 100644 --- a/module/apps/skill-spec-select-dialog.js +++ b/module/apps/skill-spec-select-dialog.js @@ -11,19 +11,19 @@ export class SkillSpecSelectDialog { 'systems/CoC7/templates/apps/skill-spec-select.html', { hasSkills: skills.length > 0, - skills: skills, + skills, base: baseValue, - name: name + name } ) return new Promise(resolve => { let formData = null const dlg = new Dialog({ title: name - ? game.i18n.format('CoC7.SkillSelectBase', { name: name }) + ? game.i18n.format('CoC7.SkillSelectBase', { name }) : game.i18n.format('CoC7.SkillSpecSelectTitle', { - specialization: specializationName - }), + specialization: specializationName + }), content: html, buttons: { validate: { diff --git a/module/apps/skill-value-dialog.js b/module/apps/skill-value-dialog.js index b4bcdcd0..5211d33e 100644 --- a/module/apps/skill-value-dialog.js +++ b/module/apps/skill-value-dialog.js @@ -4,12 +4,12 @@ export class SkillValueDialog { static async create (name = null, baseValue = null) { const html = await renderTemplate( 'systems/CoC7/templates/apps/skill-value.html', - { base: baseValue, name: name } + { base: baseValue, name } ) return new Promise(resolve => { let formData = null const dlg = new Dialog({ - title: game.i18n.format('CoC7.SkillValue', { name: name }), + title: game.i18n.format('CoC7.SkillValue', { name }), content: html, buttons: { validate: { diff --git a/module/apps/tooltips.js b/module/apps/tooltips.js new file mode 100644 index 00000000..9e8c0044 --- /dev/null +++ b/module/apps/tooltips.js @@ -0,0 +1,42 @@ +/* global $, game */ +export class CoC7Tooltips { + constructor () { + this.ToolTipHover = null + this.toolTipTimer = null + } + + displayToolTip (toolTip) { + if (typeof this.ToolTipHover !== 'undefined') { + const bounds = this.ToolTipHover.getBoundingClientRect() + if (!isNaN(bounds.left || '') && !isNaN(bounds.top || '')) { + let left = bounds.left + let top = bounds.top + const heightText = $(this.ToolTipHover).outerHeight() + $('body').append('
                                                        ' + toolTip + '
                                                        ') + const tip = $('#help-tooltip') + const heightTip = tip.outerHeight() + const widthTip = tip.outerWidth() + if (window.innerHeight < heightText * 1.5 + heightTip + top) { + top = top - heightTip + } else { + top = top + heightText * 1.5 + } + if (window.innerWidth < widthTip + left) { + left = window.innerWidth - widthTip + } + tip.css({ + left: left + 'px', + top: top + 'px' + }) + } + } + } + + toolTipLeave (event) { + if (game.CoC7Tooltips.ToolTipHover === event.currentTarget) { + clearTimeout(game.CoC7Tooltips.toolTipTimer) + game.CoC7Tooltips.ToolTipHover = null + $('#help-tooltip').remove() + } + } +} diff --git a/module/apps/welcome-message.js b/module/apps/welcome-message.js new file mode 100644 index 00000000..03b49c22 --- /dev/null +++ b/module/apps/welcome-message.js @@ -0,0 +1,100 @@ +/* global $, Dialog, game, renderTemplate */ + +export class CoC7WelcomeMessage extends Dialog { + activateListeners (html) { + super.activateListeners(html) + html.find('#artwork-style').on('change', event => { + const style = $(event.currentTarget).val() + CoC7WelcomeMessage.changeArtworkStyle(style) + }) + } + + static async changeArtworkStyle (style) { + await game.settings.set('CoC7', 'overrideSheetArtwork', true) + const artworkOptions = CoC7WelcomeMessage.getStyles(style) + await game.settings.set( + 'CoC7', + 'artWorkSheetBackground', + artworkOptions.mainSheetBackground + ) + await game.settings.set( + 'CoC7', + 'artWorkOtherSheetBackground', + artworkOptions.additionalSheetBackground + ) + await game.settings.set( + 'CoC7', + 'artworkSheetImage', + artworkOptions.mainSheetImage + ) + await game.settings.set( + 'CoC7', + 'artworkFrontColor', + artworkOptions.mainColor + ) + await game.settings.set( + 'CoC7', + 'artworkBackgroundColor', + artworkOptions.secondaryColor + ) + await game.settings.set( + 'CoC7', + 'artworkInteractiveColor', + artworkOptions.interactiveColor + ) + await game.actors.getName('Harold Philips Lovecraft').sheet.render(true) + } + + static getStyles (style) { + switch (style) { + case '1920': + return { + mainColor: 'rgba(43,55,83,1)', + secondaryColor: 'rgba(103,11,11,1)', + interactiveColor: 'rgba(103,11,11,1)', + mainSheetBackground: + "url('./assets/images/background.webp') 4 repeat", + mainSheetImage: "url('./assets/images/tentacles.webp')", + additionalSheetBackground: "url('./assets/images/background.webp')" + } + case 'nyarlathotep': + return { + mainColor: 'rgba(229, 210, 128, 1)', + secondaryColor: 'rgba(255, 255, 255, 1)', + interactiveColor: 'rgba(229, 210, 128, 1)', + mainSheetBackground: + "url('./assets/images/nyarlathotep.png') 4 repeat", + mainSheetImage: '', + additionalSheetBackground: + "url('./assets/images/nyarlathotep.png') 4 repeat" + } + } + } + + static disableWelcomeMessage () { + game.settings.set('CoC7', 'showWelcomeMessage', false) + } + + static async create () { + const template = 'systems/CoC7/templates/apps/welcome-message.html' + const html = await renderTemplate(template) + console.log(html) + return new Promise(resolve => { + const dialog = new CoC7WelcomeMessage({ + title: 'Welcome Message', + classes: ['coc7', 'app', 'dialog'], + content: html, + buttons: { + disable: { + label: 'Disable Welcome Message', + callback: CoC7WelcomeMessage.disableWelcomeMessage + }, + continue: { + label: 'Continue without Disabling' + } + } + }) + dialog.render(true) + }) + } +} diff --git a/module/chat.js b/module/chat.js index 98f2282d..67632086 100644 --- a/module/chat.js +++ b/module/chat.js @@ -15,6 +15,7 @@ import { OpposedCheckCard } from './chat/cards/opposed-roll.js' import { CombinedCheckCard } from './chat/cards/combined-roll.js' import { InteractiveChatCard } from './chat/interactive-chat-card.js' import { DamageCard } from './chat/cards/damage.js' +import { CoC7Dice } from './dice.js' const CHAT_COC7_MESSAGE = { FAKEROLL: @@ -222,12 +223,14 @@ export class CoC7Chat { } // Handle showing dropdown selection - html.find('.dropbtn').click(event => - event.currentTarget - .closest('.dropdown') - .querySelector('.dropdown-content') - .classList.toggle('show') - ) + html + .find('.dropbtn') + .click(event => + event.currentTarget + .closest('.dropdown') + .querySelector('.dropdown-content') + .classList.toggle('show') + ) html .find('.dropdown') .mouseleave(event => @@ -295,7 +298,7 @@ export class CoC7Chat { const gmVisibleOnly = html.find('.gm-visible-only') for (const elem of gmVisibleOnly) { - if (!game.user.isGM) elem.style.display = 'none' + if (!(game.user.isGM || (game.user.isTrusted && game.settings.get('CoC7', 'trustedCanSeeChatCard')))) elem.style.display = 'none' } const ownerVisibleOnly = html.find('.owner-visible-only') @@ -329,7 +332,9 @@ export class CoC7Chat { const ownerOnly = html.find('.owner-only') for (const zone of ownerOnly) { // Try retrieving actor - let actor = CoC7Chat._getActorFromKey(zone.dataset?.actorKey) // Try with self. + let actor = CoC7Chat._getActorFromKey( + zone.dataset?.actorKey || zone.dataset?.actorId + ) // Try with self. if (!actor) { actor = CoC7Chat._getChatCardActor(zone.closest('.chat-card')) // Try with closest chat card. } @@ -355,9 +360,11 @@ export class CoC7Chat { } const gmSelectOnly = html.find('.gm-select-only') - for (const select of gmSelectOnly) { - select.classList.add('inactive') - select.classList.remove('simple-flag') + if (!(game.user.isTrusted && game.settings.get('CoC7', 'trustedCanModfyChatCard'))) { + for (const select of gmSelectOnly) { + select.classList.add('inactive') + select.classList.remove('simple-flag') + } } } } @@ -373,17 +380,17 @@ export class CoC7Chat { static _onTargetSelect (event) { const index = parseInt(event.currentTarget.dataset.key) const targetsSelector = event.currentTarget.closest('.targets-selector') - targetsSelector.querySelectorAll('img').forEach(i => { + for (const i of targetsSelector.querySelectorAll('img')) { i.style.border = 'none' - }) + } targetsSelector .querySelector(`[data-key="${index}"]`) .querySelector('img').style.border = '1px solid #000' const targets = event.currentTarget.closest('.targets') - targets.querySelectorAll('.target').forEach(t => { + for (const t of targets.querySelectorAll('.target')) { t.style.display = 'none' t.dataset.active = 'false' - }) + } const targetToDisplay = targets.querySelector( `[data-target-key="${index}"]` ) @@ -406,9 +413,9 @@ export class CoC7Chat { const dropDownBoxes = event.currentTarget .closest('.response-selection') .querySelectorAll('.toggle-switch') - ;[].forEach.call(dropDownBoxes, dpdnBox => + for (const dpdnBox of dropDownBoxes) { dpdnBox.classList.remove('switched-on') - ) + } event.currentTarget.closest('.toggle-switch').classList.add('switched-on') // close dropdown @@ -489,9 +496,9 @@ export class CoC7Chat { const dropDownBoxes = event.currentTarget .closest('.response-selection') .querySelectorAll('.toggle-switch') - ;[].forEach.call(dropDownBoxes, dpdnBox => + for (const dpdnBox of dropDownBoxes) { dpdnBox.classList.remove('switched-on') - ) + } event.currentTarget.classList.add('switched-on') // Need to test if it's really a dodge !!! // Save action for the roll @@ -518,9 +525,8 @@ export class CoC7Chat { static _onChatCardRadioSwitch (event) { // console.log('-->CoC7Chat._onChatCardRadioSwitch'); event.preventDefault() - const optionList = event.currentTarget.parentElement.getElementsByClassName( - 'radio-switch' - ) + const optionList = + event.currentTarget.parentElement.getElementsByClassName('radio-switch') let index for (index = 0; index < optionList.length; index++) { const element = optionList[index] @@ -696,6 +702,7 @@ export class CoC7Chat { const button = event.currentTarget const card = button.closest('.chat-card') + if (!card) return const originMessage = button.closest('.message') // const messageId = originMessage.dataset.messageId; const action = button.dataset.action @@ -744,9 +751,8 @@ export class CoC7Chat { } } else { const actor = CoC7Chat._getChatCardActor(card) - const detailedResultPlaceHolder = card.querySelector( - '.result-details' - ) + const detailedResultPlaceHolder = + card.querySelector('.result-details') if (actor.spendLuck(luckAmount)) { const result = card.querySelector('.dice-total') @@ -758,7 +764,7 @@ export class CoC7Chat { detailedResultPlaceHolder.innerText = game.i18n.format( 'CoC7.RollResult.LuckSpendText', { - luckAmount: luckAmount, + luckAmount, successLevel: game.i18n.localize('CoC7.RegularDifficulty') } ) @@ -769,7 +775,7 @@ export class CoC7Chat { detailedResultPlaceHolder.innerText = game.i18n.format( 'CoC7.RollResult.LuckSpendText', { - luckAmount: luckAmount, + luckAmount, successLevel: game.i18n.localize('CoC7.HardDifficulty') } ) @@ -780,7 +786,7 @@ export class CoC7Chat { detailedResultPlaceHolder.innerText = game.i18n.format( 'CoC7.RollResult.LuckSpendText', { - luckAmount: luckAmount, + luckAmount, successLevel: game.i18n.localize('CoC7.ExtremeDifficulty') } ) @@ -791,7 +797,7 @@ export class CoC7Chat { detailedResultPlaceHolder.innerText = game.i18n.format( 'CoC7.RollResult.LuckSpendText', { - luckAmount: luckAmount, + luckAmount, successLevel: game.i18n.localize('CoC7.CriticalDifficulty') } ) @@ -901,13 +907,28 @@ export class CoC7Chat { case 'melee-initiator-roll': { const initiator = CoC7MeleeInitiator.getFromCard(card) - await initiator.performSkillCheck(event.currentTarget.dataset.skill) + const check = await initiator.performSkillCheck( + event.currentTarget.dataset.skill + ) + $(button).prop('disabled', true) + await CoC7Dice.showRollDice3d(check.dice.roll) await initiator.publishCheckResult() break } + + case 'melee-target-no-response': { + const target = CoC7MeleeTarget.getFromCard(card) + await target.publishNoReponseResult() + break + } + case 'melee-target-roll': { const target = CoC7MeleeTarget.getFromCard(card) - await target.performSkillCheck(event.currentTarget.dataset.skill) + const check = await target.performSkillCheck( + event.currentTarget.dataset.skill + ) + $(button).prop('disabled', true) + await CoC7Dice.showRollDice3d(check.dice.roll) await target.publishCheckResult() break } @@ -935,7 +956,7 @@ export class CoC7Chat { // if( originMessage.dataset.messageId) damageCard.messageId = originMessage.dataset.messageId; // damageCard.rollDamage(); // if( originMessage.dataset.messageId) { - // card.querySelectorAll('.card-buttons').forEach( b => b.remove()); + // for (const b of card.querySelectorAll('.card-buttons')) { b.remove() } // await CoC7Chat.updateChatCard( card); // } break @@ -1018,7 +1039,7 @@ export class CoC7Chat { ) { check.updateChatCard({ makePublic: true }) } else { - check.updateChatCard() + check.updateChatCard({ makePublic: true }) } break } @@ -1041,14 +1062,7 @@ export class CoC7Chat { case 'reset-creature-san-data': { const sanCheck = SanCheckCard.getFromCard(card) - await sanCheck.resetCreatureSanData() - await sanCheck.updateChatCard() - break - } - - case 'reset-specie-san-data': { - const sanCheck = SanCheckCard.getFromCard(card) - await sanCheck.resetSpecieSanData() + await sanCheck.clearSanLossReason() await sanCheck.updateChatCard() break } diff --git a/module/chat/card-actor.js b/module/chat/card-actor.js index c0e770f5..ded8a0fb 100644 --- a/module/chat/card-actor.js +++ b/module/chat/card-actor.js @@ -134,8 +134,10 @@ export class ChatCardActor { const speakerData = {} let speaker if (this.actor) { - if (this.token) speakerData.token = this.token - else speakerData.actor = this.actor + speakerData.actor = this.actor + if (this.token) { + speakerData.token = this.token.document + } speaker = ChatMessage.getSpeaker(speakerData) } else { speaker = ChatMessage.getSpeaker() @@ -145,8 +147,8 @@ export class ChatCardActor { const chatData = { user: user.id, - speaker: speaker, - flavor: flavor, + speaker, + flavor, content: message } diff --git a/module/chat/cards/chase-obstacle.js b/module/chat/cards/chase-obstacle.js new file mode 100644 index 00000000..dd9e144e --- /dev/null +++ b/module/chat/cards/chase-obstacle.js @@ -0,0 +1,978 @@ +/* global duplicate, foundry, game, mergeObject, Roll, ui */ +import { CoC7Check } from '../../check.js' +import { EnhancedChatCard } from '../../common/chatcardlib/src/chatcardlib.js' +import { CoC7Dice } from '../../dice.js' +import { _participant } from '../../items/chase/participant.js' +import { CoC7Utilities } from '../../utilities.js' +import { createInlineRoll } from '../helper.js' + +export class ChaseObstacleCard extends EnhancedChatCard { + /** @override */ + static get defaultOptions () { + const options = mergeObject(super.defaultOptions, { + template: 'systems/CoC7/templates/chat/cards/chase-obstacle.html', + GMUpdate: true + }) + options.classes.push('obstacle-card') + return options + } + + /** @override */ + async getData () { + const data = await super.getData() + + data.status = [] + data.strings = {} + data.displayActorOnCard = game.settings.get('CoC7', 'displayActorOnCard') + // data.participant = new _participant(this.participantData) + + data.status.push({ + name: + game.i18n.localize('CoC7.ActionCost') + ` :${this.data.totalActionCost}` + }) + + data.card.breakableObstacle = + data.data.obstacle?.barrier && data.data.obstacle.hasHitPoints // TODO: Check if usefull + data.card.validCheck = false + + if ( + data.data.states?.obstacleDefined && + (data.data.obstacle.hazard || + (data.data.obstacle.barrier && !data.data.obstacle.hasHitPoints)) + ) { + data.data.states.tryToNegotiate = true + data.data.states.tryToBreak = false + data.data.states.breakOrNegotiateDefined = true + } + + if (this.participant?.actor) { + data.skill = this.participant.actor.find(data.data.obstacle.checkName) + data.checkOptions = this.chase.getActorSkillsAndCharacteristics( + this.data.participantUuid + ) + if (data.skill) { + data.validCheck = true + data.validSkill = true + } else if (data.data.obstacle.checkName && data.data.checkThreshold) { + data.validCheck = true + } + } else { + data.checkOptions = this.chase.allSkillsAndCharacteristics + data.dummyActor = true + if (data.data.obstacle.checkName && data.data.checkThreshold) { + data.validCheck = true + } + } + + if (!data.data.bonusDice) data.data.bonusDice = 0 + + if ( + data.data.bonusDice < 2 && + data.data.totalActionCost < data.data.movementAction + ) { + data.canTakeCautiousApproach = true + } + + data.customWeapon = false + if (this.data.weaponChoice === '0') { + data.customWeapon = true + } + + if (data.validCheck) { + let checkName, value + if (data.skill) { + checkName = data.skill.value.name + value = data.skill.value.value + } else { + checkName = data.data.obstacle.checkName + value = data.data.checkThreshold + } + data.strings.checkRollRequest = game.i18n.format('CoC7.AskRoll', { + name: checkName, + value + }) + if (data.data.bonusDice !== 0) { + if (data.data.bonusDice > 0) { + data.strings.checkRollRequest += ` (+${data.data.bonusDice})` + } else data.strings.checkRollRequest += ` (${data.data.bonusDice})` + } + } + + if (data.data.states?.obstacleDefined) { + data.strings.obstacleDefined = game.i18n.format('CoC7.FacingObstacle', { + type: data.data.obstacle.barrier + ? game.i18n.localize('CoC7.ABarrier') + : game.i18n.localize('CoC7.AHazard') + }) + if (data.data.obstacle.name) { + data.strings.obstacleDefined += ` (${data.data.obstacle.name})` + } + + data.data.states.canAskRoll = true + // data.data.states.obstacleCanBeBroken = false + if (data.data.obstacle.barrier) { + data.status.push({ name: game.i18n.localize('CoC7.Barrier') }) + if (data.data.obstacle.hasHitPoints) { + data.status.push({ name: game.i18n.localize('CoC7.Breakable') }) + // data.data.states.obstacleCanBeBroken = true + } + } + if (data.data.obstacle.hazard) { + data.status.push({ name: game.i18n.localize('CoC7.Hazard') }) + } + + if (this.data.states.tryToNegotiate) { + if (!data.validCheck) { + data.status.push({ + name: game.i18n.localize('CoC7.NoValidCheck'), + css: 'error' + }) + data.strings.EnterValueTitle = game.i18n.format( + 'CoC7.SkillSelectBase', + { name: data.data.obstacle.checkName } + ) + if (!data.data.checkThreshold) data.data.states.canAskRoll = false + } else if (!data.validSkill) { + data.status.push({ + name: game.i18n.localize('CoC7.NoValidSkill'), + css: 'warning' + }) + } + } + + if (this.data.states.tryToBreak) { + let damageStatus = game.i18n.localize('CoC7.BreakDown') + if (this.data.objects?.obstacleDamageRoll?.total) { + damageStatus += ` : ${this.data.objects.obstacleDamageRoll.total}` + } + data.status.push({ + name: damageStatus + }) + + if (this.data.states.obstacleDamageRolled) { + if (this.data.objects?.obstacleDamageRoll?.total <= 0) { + data.strings.obstacleDamage = + game.i18n.localize('CoC7.NoDamageDealt') + } else { + data.inlineDamageRoll = createInlineRoll( + this.data.objects.obstacleDamageRoll + )?.outerHTML + data.strings.obstacleDamage = game.i18n.format('CoC7.DamageDealt', { + value: data.inlineDamageRoll + }) + } + } + } + + if (this.data.states.tryToNegotiate) { + data.status.push({ name: game.i18n.localize('CoC7.Negotiate') }) + } + + if (this.data.totalCautiousApproach) { + const cautiousStatus = { + name: game.i18n.localize('CoC7.Cautious'), + css: '' + } + if (this.data.totalCautiousApproach > 1) { + cautiousStatus.css = 'strong' + data.strings.cautiousApproachType = game.i18n.localize( + 'CoC7.BeingVeryCautious' + ) + } else { + data.strings.cautiousApproachType = + game.i18n.localize('CoC7.BeingCautious') + } + + if (this.data.flags.consumeBonusDice) cautiousStatus.css += ' consume' + data.status.push(cautiousStatus) + } + + if (this.data.objects?.check) { + if (this.data.obstacle.hazard) this.data.movePlayer = true // On hazard, you pass even if you fail your roll + if (this.data.objects.check.passed) { + this.data.movePlayer = true + data.strings.obstaclePassed = game.i18n.localize( + 'CoC7.ObstaclePassed' + ) + if (this.data.objects.check.luckSpent) { + data.strings.obstaclePassed += ` (${game.i18n.localize( + 'CoC7.GotLucky' + )})` + } + data.status.push({ + name: game.i18n.localize('CoC7.Success'), + css: 'success' + }) + } else if (this.data.objects.check.isFumble) { + data.strings.checkFailed = game.i18n.localize('CoC7.ObstacleFumble') + data.status.push({ + name: game.i18n.localize('CoC7.Fumble'), + css: 'fumble' + }) + } else { + data.strings.checkFailed = game.i18n.localize('CoC7.ObstacleFail') + data.status.push({ + name: game.i18n.localize('CoC7.Failure'), + css: 'failure' + }) + } + } + } + + if (this.data.states.playerActionDefined) { + if (this.data.obstacle.hazard) { + data.strings.playerIntentions = game.i18n.localize( + 'CoC7.TryToNegotiateHazard' + ) + } else if (this.data.obstacle.barrier) { + if (this.data.states.tryToNegotiate) { + data.strings.playerIntentions = game.i18n.localize( + 'CoC7.TryToGetPastBarriers' + ) + } else if (this.data.states.tryToBreak) { + data.strings.playerIntentions = game.i18n.localize('CoC7.TryToBreak') + } + } + } + + if (this.data.states.checkRolled) { + if (this.data.states.cardResolved) { + // If the card is resolved the check is frozen + data.htmlCheck = await this.data.objects.check.inlineCheck?.outerHTML + } else data.htmlCheck = await this.data.objects.check.getHtmlRoll() + } + + // if (this.data.objects?.failedDamageRoll) { + // if (!data.data.armor) { + // if (this.participant.actor) + // data.data.armor = + // this.participant.actor.data.data.attribs.armor.value || 0 + // } + // if (data.data.armor) { + // if (isNaN(Number(data.data.armor))) data.data.armor = null + // } + // } + + if (this.data.states.cardResolved) { + data.playerDamageTaken = false + data.obstalceDefinitionChanged = false + + // Has the obstacle changed ? + const diff = this.listChanges() + if (diff.changes) { + data.obstalceDefinitionChanged = true + } + + // Is player taking damage + if (this.data.obstacle.hasDamage && this.data.objects?.check?.isFailure) { + data.playerDamageTaken = true + data.inlineDamageTakenRoll = createInlineRoll( + this.data.objects.failedDamageRoll + )?.outerHTML + // if (data.data.totalPlayerDamageTaken < 0) + // data.data.totalPlayerDamageTaken = 0 + + if (data.data.totalPlayerDamageTaken === 0) { + data.strings.damageTaken = game.i18n.localize('CoC7.YouTakeNoDamage') + } else { + data.strings.damageTaken = game.i18n.format( + 'CoC7.YouTakeSomeDamage', + { amount: data.data.totalPlayerDamageTaken } + ) + } + data.status.push({ + name: + game.i18n.localize('CoC7.TotalDamage') + + ` :${data.data.totalPlayerDamageTaken}` + }) + } + + if ( + this.data.obstacle.hasActionCost && + this.data.obstacle.hazard && + this.data.objects?.check?.isFailure + ) { + data.actionLost = true + data.strings.actionLost = game.i18n.localize('CoC7.YouLostTime') + data.inlineActionLostRoll = createInlineRoll( + this.data.objects.failedActionRoll + )?.outerHTML + } + + data.status.push({ + name: game.i18n.localize('CoC7.CardResolved') + }) + } + + if (this.data.states.closed) { + if (this.data.movePlayer) { + data.strings.finalOutcome = game.i18n.localize('CoC7.MoveToLocation') + } else { + data.strings.finalOutcome = game.i18n.localize( + 'CoC7.DontMoveToLocation' + ) + } + } + return data + } + + /** @override */ + async GMUpdate () { + if (!game.user.isGM) { + console.error('CoC7: GMUpdate called from non GM user') + return + } + if (this.data.states.cardResolved) { + // Card is resolved, compute all formulas and damage. + if (this.data.objects?.failedDamageRoll?.total) { + const totalDamage = this.data.objects.failedDamageRoll.total + const armorValue = this.data.flags.ignoreArmor ? 0 : this.data.armor + if (CoC7Utilities.isFormula(armorValue)) { + this.data.armor = ( + await new Roll(armorValue).roll({ async: true }) + ).total + } else if (!isNaN(Number(armorValue))) { + this.data.armor = Number(armorValue) + } + + if (typeof this.data.totalPlayerDamageTaken === 'undefined') { + this.data.totalPlayerDamageTaken = totalDamage - this.data.armor + if (this.data.totalPlayerDamageTaken < 0) { + this.data.totalPlayerDamageTaken = 0 + } + } + } + + if (undefined === this.data.reflectObstaleChanges) { + this.data.reflectObstaleChanges = true // By default reflect changes + } + + if (undefined === this.data.movePlayer) { + this.data.movePlayer = + (this.data.states.tryToNegotiate || this.data.obstacle.hazard) && + !this.data.states.failedConsequencesRolled + } + + if ( + this.data.obstacle.barrier && + this.data.obstacle.hasHitPoints && + this.data.objects?.obstacleDamageRoll?.total + ) { + if (undefined === this.data.totalObstacleDamage) { + this.data.totalObstacleDamage = + this.data.objects.obstacleDamageRoll.total + } + if (undefined === this.data.flags.obstacleDestoyed) { + this.data.flags.obstacleDestoyed = + this.data.obstacle.HitPoints - this.data.totalObstacleDamage <= 0 + } + } + } + + if (this.data.states.closed) { + this.data.movementActionArray = duplicate( + this.participant.movementActionArray + ) + this.data.EEC_ACTION = { detachData: true } + } + } + + /** @override */ + async localCompute () {} + + /** @override */ + async assignObjects () { + if ( + this.data.objects?.check && + this.data.objects.check?.constructor?.name === 'Object' + ) { + this.data.objects.check = CoC7Check.fromData(this.data.objects.check) + } + + if ( + this.data.objects?.obstacleDamageRoll && + this.data.objects.obstacleDamageRoll?.constructor?.name === 'Object' + ) { + this.data.objects.obstacleDamageRoll = Roll.fromData( + this.data.objects.obstacleDamageRoll + ) + } + if ( + this.data.objects?.failedDamageRoll && + this.data.objects.failedDamageRoll?.constructor?.name === 'Object' + ) { + this.data.objects.failedDamageRoll = Roll.fromData( + this.data.objects.failedDamageRoll + ) + } + if ( + this.data.objects?.failedActionRoll && + this.data.objects.failedActionRoll?.constructor?.name === 'Object' + ) { + this.data.objects.failedActionRoll = Roll.fromData( + this.data.objects.failedActionRoll + ) + } + } + + /** @override */ + async initialize () { + // const chase = await fromUuid(this.data.chaseUuid) + if (!this.chase) return + if (typeof this.chase.activeParticipantData?.uuid === 'undefined') { + return + } + + if (typeof this.data === 'undefined') this.data = {} + if (typeof this.data.states === 'undefined') this.data.states = {} + + // const location = chase.getLocationData(this.data.locationUuid) + this.data.obstacle = this.location?.obstacleDetails // Feed the obstacle definition + // this.data.participantData = chase.activeParticipantData + this.data.participantUuid = this.chase.activeParticipantData.uuid + + if (this.participantData?.bonusDice > 0) { + this.data.bonusDice = this.participantData.bonusDice + this.data.flags.consumeBonusDice = true + this.data.flags.hasBonusDice = this.participantData.hasBonusDice + } + + this.data.movementActionArray = duplicate( + this.participant.movementActionArray + ) + this.data.movementAction = this.participant.currentMovementActions + this.data.totalActionCost = 0 + } + + get participant () { + if (!this.participantData) return undefined + // if (!this._participant) + // this._participant = new _participant(this.participantData) + // return this._participant + return new _participant(this.participantData) // TO RESET + } + + get participantData () { + if (!this.chase) return undefined + if (!this.data.participantUuid) return undefined + return this.chase.getParticipantData(this.data.participantUuid) + } + + get location () { + if (!this.chase) return undefined + return this.chase.getLocationData(this.data.locationUuid) + } + + get obstacle () { + if (!this.location) return undefined + return this.location.obstacleDetails + } + + get chase () { + if (!this.data.chaseUuid) return undefined + if (!this._chase) this._chase = CoC7Utilities.SfromUuid(this.data.chaseUuid) + return this._chase + } + + get roll () { + let rollData + if (this.participant.actor && this.data.obstacle.checkName) { + const actorSkill = this.participant.actor.find( + this.data.obstacle.checkName + ) + if (typeof actorSkill !== 'undefined') { + rollData = actorSkill + } else { + rollData = { + type: 'value', + value: { + name: this.data.obstacle.checkName, + threshold: this.data.checkThreshold + } + } + } + rollData.actor = { actorKey: this.participant.actor.id } + } else { + if (this.data.obstacle.checkName && this.data.checkThreshold) { + rollData = { + type: 'value', + value: { + name: this.data.obstacle.checkName, + threshold: this.data.checkThreshold + }, + actor: { + name: this.participant.name + } + } + } + } + if (rollData) { + rollData.diceModifier = this.data?.bonusDice || 0 + rollData.difficulty = CoC7Check.difficultyLevel.regular + rollData.denyPush = true + } + return rollData || undefined + } + + get validFailedRolls () { + if (!this.data.objects?.check?.isFailure) return false + if (this.data.obstacle.hasDamage) { + const damage = + typeof this.data.obstacle.failedCheckDamage === 'number' + ? `${this.data.obstacle.failedCheckDamage}` + : this.data.obstacle.failedCheckDamage + if (!this.data.obstacle.failedCheckDamage) return false + if ( + this.data.obstacle.failedCheckDamage && + !Roll.validate(damage) // Validate only take a string, if damage is a number convert to a string + ) { + return false + } + } + if (this.data.obstacle.hazard && this.data.obstacle.hasActionCost) { + const actionCost = + typeof this.data.obstacle.failedActionCost === 'number' + ? `${this.data.obstacle.failedActionCost}` + : this.data.obstacle.failedActionCost + if (!this.data.obstacle.failedActionCost) return false + if (this.data.obstacle.failedActionCost && !Roll.validate(actionCost)) { + return false + } + } + return true + } + + get weaponsOptions () { + const weapons = [] + this.participant.actor?.itemTypes?.weapon?.forEach(w => { + let formula = w.data.data.range.normal.damage + let db = this.participant.actor.db + if (db === null || Number(db) === 0) { + db = '' + } else { + db = `${db}` + } + + if (db && !db.startsWith('-')) db = '+' + db + if (w.data.data.properties.addb) formula = formula + db + if (w.data.data.properties.ahbd) formula = formula + db + '/2' + weapons.push({ + name: `${w.data.name} (${formula})`, + damage: formula, + uuid: w.uuid + }) + }) + weapons.sort((a, b) => { + const nameA = a.name.toUpperCase() + const nameB = b.name.toUpperCase() + if (nameA < nameB) return -1 + if (nameA > nameB) return 1 + return 0 + }) + + if ( + !weapons.find(w => + w.name + .toUpperCase() + .startsWith( + game.i18n.localize('CoC7.UnarmedWeaponName')?.toUpperCase() + ) + ) + ) { + let db = '' + if (this.participant.actor) { + db = this.participant.actor.db + if (db && !db.startsWith('-')) db = '+' + db + if (db === null || Number(db) === 0) db = '' + } + + weapons.unshift({ + name: `${game.i18n.localize('CoC7.UnarmedWeaponName')} (1D3${db})`, + damage: `1D3${db}`, + uuid: 'unarmed' + }) + } + + weapons.push({ + name: game.i18n.localize('CoC7.Other'), + damage: this.data?.customWeaponDamage || null, + uuid: 0 + }) + return weapons + } + + get usedWeapon () { + if (!this.data?.weaponChoice) { + if (!this.weaponsOptions) return undefined + if (!this.data) this.data = {} // useless !!! + this.data.weaponChoice = this.weaponsOptions[0].uuid + } + + if (this.data.weaponChoice) { + const weapon = this.weaponsOptions.find( + e => e.uuid === this.data.weaponChoice + ) + if (weapon) return weapon + } + } + + get inflictedDamageFormula () { + if (this.usedWeapon) { + const weapon = this.usedWeapon + if (weapon && weapon.damage && Roll.validate(weapon.damage)) { + return weapon.damage + } + return undefined + } + return undefined + } + + get validObstacleDamage () { + if ( + this.data.obstacle.hasHitPoints && + !isNaN(Number(this.data.obstacle.HitPoints)) && + Number(this.data.obstacle.HitPoints) > 0 && + this.inflictedDamageFormula + ) { + return true + } + return false + } + + get strings () { + const strings = {} + strings.damageRollRequest = this.usedWeapon.name + + return strings + } + + // Actions : + async validateCard (options) { + let loactionChanged + let participantChaged = false + const obstacleUpdate = {} + obstacleUpdate.obstacleDetails = {} + const participantUpdate = {} + if (this.data.flags.obstacleDestoyed) { + loactionChanged = true + obstacleUpdate.obstacle = false + obstacleUpdate.obstacleDetails.hazard = false + obstacleUpdate.obstacleDetails.barrier = false + } + + const diff = this.listChanges() + if (diff.changes) { + if (this.data.reflectObstaleChanges) { + for (const [key, value] of Object.entries(diff.obstacle)) { + if (key !== 'type') { + obstacleUpdate.obstacleDetails[value.key] = value.new + loactionChanged = true + } + } + } + } + + if (this.data.totalObstacleDamage > 0 && this.data.obstacle.hasHitPoints) { + let remainingHp = this.data.obstacle.HitPoints + remainingHp -= this.data.totalObstacleDamage + if (remainingHp < 0) remainingHp = 0 + if (this.obstacle.HitPoints !== remainingHp) { + obstacleUpdate.obstacleDetails.HitPoints = remainingHp + this.data.obstacle.HitPoints = remainingHp + loactionChanged = true + } + } + + if (this.data.totalPlayerDamageTaken > 0) { + participantChaged = true + if (this.participant.actor) { + await this.participant.actor.dealDamage( + this.data.totalPlayerDamageTaken, + { ignoreArmor: true } + ) + } else { + participantUpdate.hp = this.participantData.hp + participantUpdate.hp -= this.data.totalPlayerDamageTaken + if (participantUpdate.hp < 0) participantUpdate.hp = 0 + } + } + + if (this.data.totalActionCost > 0) { + participantChaged = true + participantUpdate.currentMovementActions = + this.participantData.currentMovementActions + participantUpdate.currentMovementActions -= this.data.totalActionCost + } + + if (this.data.flags.consumeBonusDice) { + participantChaged = true + participantUpdate.bonusDice = 0 + } else { + if ( + !isNaN(this.data.bonusDice) && + this.data.bonusDice !== this.participant.bonusDice + ) { + participantUpdate.bonusDice = this.data.bonusDice + } + } + + if (this.data.movePlayer) { + let targetLocation + if (this.data.forward) { + targetLocation = this.location + } else { + targetLocation = this.chase.getLocationShift(this.location.uuid, { + skip: -1 + }) + } + + if (targetLocation.uuid) { + await this.chase.moveParticipantToLocation( + this.participantData.uuid, + targetLocation.uuid, + { + scrollToLocation: true, + activateLocation: false, + render: false + } + ) + } + } + + if (loactionChanged) { + await this.chase.updateLocation(this.location.uuid, obstacleUpdate, { + render: false + }) + } + if (participantChaged) { + await this.chase.updateParticipant( + this.participantData.uuid, + participantUpdate, + { render: false } + ) + } + this.data.states.closed = true + await this.chase.activateNextParticipantTurn() // Render will be done there ! + return true + } + + async defineObstacle (options) { + if (!this.data.states) this.data.states = {} + this.data.states.obstacleDefined = true + return true + } + + async tryToNegotiateObstacle (options) { + this.data.states.breakOrNegotiateDefined = true + this.data.states.tryToNegotiate = true + this.data.states.tryToBreak = false + return true + } + + async tryToBreakDownObstacle (options) { + this.data.states.breakOrNegotiateDefined = true + this.data.states.tryToNegotiate = false + this.data.states.tryToBreak = true + return true + } + + async cancelObstacleDefinition (options) { + this.data.states.obstacleDefined = false + this.data.states.breakOrNegotiateDefined = false + this.data.states.tryToNegotiate = false + this.data.states.tryToBreak = false + return true + } + + async cancelBreakOrPassChoice (options) { + if (!this.data.obstacle.hasHitPoints) return this.cancelObstacleDefinition() + this.data.states.breakOrNegotiateDefined = false + this.data.states.tryToNegotiate = false + this.data.states.tryToBreak = false + return true + } + + async requestRoll (options) { + this.data.states.playerActionDefined = true + return true + } + + async takeCautiousApproach (options) { + if (!this.data.totalCautiousApproach) this.data.totalCautiousApproach = 0 + this.data.totalCautiousApproach += 1 + this.data.bonusDice += 1 + this.data.totalActionCost += 1 + if (!this.data.flags.consumeBonusDice) { + this.data.flags.consumeBonusDice = true + } + if (!this.data.flags.hasBonusDice) { + this.data.flags.hasBonusDice = true + } + if (this.data.movementAction <= this.data.totalActionCost) { + this.data.flags.consumeBonusDice = false + this.data.states.cardResolved = true + this.data.movePlayer = false + } + return true + } + + async rollSkillCheck (options) { + const target = options.event.currentTarget + if (target.classList.contains('disabled')) return + target.classList.toggle('disabled') + if (!this.roll) { + ui.notifications.error(game.i18n.localize('CoC7.NothingToRoll')) + return + } + if (!this.data.objects) this.data.objects = {} + this.data.objects.check = CoC7Check.createFromActorRollData(this.roll) + if (!this.data.objects.check) return false + this.data.objects.check.denyPush = true // Obstacle check can't be pushed + await this.data.objects.check._perform({ forceDSN: true }) + this.data.states.checkRolled = true + target.classList.toggle('disabled') + if (this.data.objects.check.passed) { + this.data.states.cardResolved = true + this.data.totalActionCost += 1 + } else { + if (typeof this.data.armor === 'undefined' && this.participant.actor) { + this.data.armor = + this.participant.actor.data.data.attribs.armor.value || 0 + } + } + + return true + } + + async useLuck (options) { + await CoC7Check.alter(this.data.objects.check, 'useLuck', { + target: options.event.currentTarget, + update: false + }) + if (this.data.objects.check.passed) { + this.data.states.cardResolved = true + this.data.totalActionCost += 1 + } + return true + } + + async rollFailConsequences (options) { + if (!this.data.objects) this.data.objects = {} + if (this.data.obstacle.hasDamage && this.data.objects.check?.isFailure) { + const damage = + typeof this.data.obstacle.failedCheckDamage === 'number' + ? `${this.data.obstacle.failedCheckDamage}` + : this.data.obstacle.failedCheckDamage + this.data.objects.failedDamageRoll = new Roll(damage) + await this.data.objects.failedDamageRoll.evaluate({ async: true }) + } + if (this.data.obstacle.hazard) { + if ( + this.data.obstacle.hasActionCost && + this.data.objects.check?.isFailure + ) { + const actionCost = + typeof this.data.obstacle.failedActionCost === 'number' + ? `${this.data.obstacle.failedActionCost}` + : this.data.obstacle.failedActionCost + this.data.objects.failedActionRoll = new Roll(actionCost) + await this.data.objects.failedActionRoll.evaluate({ async: true }) + this.data.totalActionCost += this.data.objects.failedActionRoll.total + } + } + + this.data.states.failedConsequencesRolled = true + this.data.states.cardResolved = true + return true + } + + async askRollObstacleDamage (options) { + this.data.states.playerActionDefined = true + return true + } + + async rollObstacleDamage (options) { + if (!this.data.objects) this.data.objects = {} + this.data.objects.obstacleDamageRoll = new Roll(this.usedWeapon?.damage) + await this.data.objects.obstacleDamageRoll.evaluate({ async: true }) + await CoC7Dice.showRollDice3d(this.data.objects.obstacleDamageRoll) + this.data.states.obstacleDamageRolled = true + this.data.totalActionCost += 1 + this.data.states.cardResolved = true + return true + } + + // List all changes + listChanges (validate = false) { + const diff = { + obstacle: {}, + player: {}, + changes: false + } + const names = { + barrier: game.i18n.localize('CoC7.Type'), + hazard: game.i18n.localize('CoC7.Type'), + hasHitPoints: game.i18n.localize('CoC7.Breakable'), + HitPoints: game.i18n.localize('CoC7.HitPoints'), + hasActionCost: game.i18n.localize('CoC7.ActionCost'), + failedActionCost: game.i18n.localize('CoC7.ActionCost'), + hasDamage: game.i18n.localize('CoC7.FightBack'), + failedCheckDamage: game.i18n.localize('CoC7.WeaponDamage'), + checkName: game.i18n.localize('CoC7.Check'), + name: game.i18n.localize('CoC7.Name') + } + + if (validate && !this.data.validation) { + this.data.validation = {} + } + + const newObstacle = foundry.utils.diffObject( + this.obstacle, + this.data.obstacle + ) + // const oldObstacle = foundry.utils.diffObject(this.data.obstacle, this.obstacle) + + for (const [key] of Object.entries(newObstacle)) { + // if ('barrier' == key || 'hazard' == key) + // { + // diff.changes = true + // diff.obstacle.type = { + // old: game.i18n.localize( + // this.obstacle.barrier ? 'CoC7.Barrier' : 'CoC7.Hazard' + // ), + // new: game.i18n.localize( + // this.data.obstacle.barrier ? 'CoC7.Barrier' : 'CoC7.Hazard' + // ), + // key: 'type', + // name: game.i18n.localize('CoC7.Type') + // } + // if (validate) { + // this.data.validation[key] = true + // this.data.validation.type = true + // } + // } + // else + // { + if ( + !( + (newObstacle[key] === '' && this.obstacle[key] === null) || + (!isNaN(Number(newObstacle[key])) && + Number(newObstacle[key]) === this.obstacle[key]) + ) + ) { + diff.changes = true + + diff.obstacle[key] = { + old: this.obstacle[key], + new: newObstacle[key], + name: names[key], + key + } + if (validate) this.data.validation[key] = true + } + // } + } + + return diff + } +} diff --git a/module/chat/cards/combined-roll.js b/module/chat/cards/combined-roll.js index d897a922..9d1ca112 100644 --- a/module/chat/cards/combined-roll.js +++ b/module/chat/cards/combined-roll.js @@ -1,6 +1,5 @@ /* global AudioHelper, CONFIG, game, mergeObject */ -import { RollDialog } from '../../apps/roll-dialog.js' import { CoC7Check } from '../../check.js' import { CoC7Dice } from '../../dice.js' import { RollCard } from './roll-card.js' @@ -40,9 +39,9 @@ export class CombinedCheckCard extends RollCard { get successCount () { if (this.rolled) { let count = 0 - this.rolls.forEach(r => { + for (const r of this.rolls) { if (r.passed) count += 1 - }) + } return count } return undefined @@ -70,10 +69,17 @@ export class CombinedCheckCard extends RollCard { return !this.success } + get checkGMInitiator () { + return game.users.get(this.initiator)?.isGM + } + async getHtmlRoll () { if (!this.rolled) return undefined const check = new CoC7Check() - await check._perform({ roll: this._roll, silent: true }) + await check._perform({ + roll: this._roll[check.diceModifier || 0], + silent: true + }) return await check.getHtmlRoll({ hideSuccess: true }) } @@ -107,7 +113,6 @@ export class CombinedCheckCard extends RollCard { if (!this.rolled) { this.rolled = true this._roll = data.roll - this.options = data.options } } } @@ -138,39 +143,24 @@ export class CombinedCheckCard extends RollCard { } case 'roll-card': { - const roll = {} - - if (!event.shiftKey) { - const usage = await RollDialog.create({ - disableFlatThresholdModifier: - event.metaKey || - event.ctrlKey || - event.keyCode === 91 || - event.keyCode === 224, - disableFlatDiceModifier: - event.metaKey || - event.ctrlKey || - event.keyCode === 91 || - event.keyCode === 224 - }) - if (usage) { - roll.diceModifier = Number(usage.get('bonusDice')) - roll.difficulty = Number(usage.get('difficulty')) - roll.flatDiceModifier = Number(usage.get('flatDiceModifier')) - roll.flatThresholdModifier = Number( - usage.get('flatThresholdModifier') - ) + const pool = {} + for (const dice of card.rolls) { + const diceModifier = parseInt(dice.diceModifier, 10) + if (!isNaN(diceModifier)) { + pool[diceModifier] = false } } + const roll = await CoC7Dice.combinedRoll({ pool }) + roll.initiator = game.user.id + const data = { type: this.defaultConfig.type, action: 'assignRoll', fromGM: game.user.isGM, - options: roll + roll } - data.roll = await CoC7Dice.roll(roll.modifier || 0) - AudioHelper.play({ src: CONFIG.sounds.dice }) + AudioHelper.play({ src: CONFIG.sounds.dice }, true) card.process(data) break } @@ -186,8 +176,11 @@ export class CombinedCheckCard extends RollCard { const data = { type: this.defaultConfig.type, action: 'updateRoll', - rank: rank, - fromGM: game.user.isGM + rank, + fromGM: game.user.isGM, + roll: { + initiator: game.user.id + } } if (!game.user.isGM) data.roll = card.rolls[rank].JSONRollData card.process(data) @@ -198,17 +191,20 @@ export class CombinedCheckCard extends RollCard { async compute () { if (!this._roll) return - this.rolls.forEach(async r => { - if (!r.rolled) { - r.modifier = this.options.modifier || 0 - r.difficulty = - this.options.difficulty || CoC7Check.difficultyLevel.regular - r.flatDiceModifier = this.options.flatDiceModifier || 0 - r.flatThresholdModifier = this.options.flatThresholdModifier || 0 - await r._perform({ roll: this._roll, silent: true }) - } + + this.rolls = this.rolls.filter(roll => { + return typeof roll.actor.data !== 'undefined' // remove any actors that no longer exist }) + for (const r of this.rolls) { + if (!r.rolled) { + r.modifier = r.diceModifier || 0 + r.difficulty = r.difficulty || CoC7Check.difficultyLevel.regular + r.flatDiceModifier = r.flatDiceModifier || 0 + r.flatThresholdModifier = r.flatThresholdModifier || 0 + await r._perform({ roll: this._roll[r.modifier], silent: true }) + } + } for (let i = 0; i < this.rolls.length; i++) { if (this.rolls[i].rolled) { this.rolls[i]._htmlRoll = await this.rolls[i].getHtmlRoll({ @@ -217,10 +213,6 @@ export class CombinedCheckCard extends RollCard { } } - this.rolls = this.rolls.filter(roll => { - return (typeof roll.actor.data !== 'undefined') // Check if there's an actor set and if there's one and it doesnt exist remove him. - }) - this._htmlRoll = await this.getHtmlRoll() } diff --git a/module/chat/cards/damage.js b/module/chat/cards/damage.js index 9f20627b..9a5a60e8 100644 --- a/module/chat/cards/damage.js +++ b/module/chat/cards/damage.js @@ -21,9 +21,9 @@ export class DamageCard extends InteractiveChatCard { }) } - activateListeners (html) { - super.activateListeners(html) - } + // activateListeners (html) { + // super.activateListeners(html) + // } async assignObject () { if (this.damageRoll && this.damageRoll.constructor.name === 'Object') { @@ -44,7 +44,7 @@ export class DamageCard extends InteractiveChatCard { } get impale () { - if (this._impale === 'undefined') return this.weapon.impale + if (typeof this._impale === 'undefined') return this.weapon.impale return this._impale } @@ -149,7 +149,7 @@ export class DamageCard extends InteractiveChatCard { async dealDamageToSelectedTarget (options = { update: true }) { if (this.isArmorForula) await this.rollArmor() if (isNaN(Number(this.totalDamageString))) { - ui.notifications.error('Error evaluating damage') + ui.notifications.error(game.i18n.localize('CoC7.ErrorEvaluatingDamage')) return } const targets = [] @@ -197,7 +197,10 @@ export class DamageCard extends InteractiveChatCard { ignoreArmor: false }) ChatMessage.create({ - content: `Damage ${targets[index].name} ${this.totalDamageString}HP` + content: game.i18n.format('CoC7.DamageDealTo', { + name: targets[index].name, + damage: this.totalDamageString + }) }) } } @@ -238,7 +241,7 @@ export class DamageCard extends InteractiveChatCard { const range = this.range let formula = this.weapon?.data?.data?.range[range]?.damage let db = this.actor.db - if (db === null) { + if (db === null || Number(db) === 0) { db = '' } else { db = `${db}` diff --git a/module/chat/cards/opposed-roll.js b/module/chat/cards/opposed-roll.js index 9ba0f540..628ec6e3 100644 --- a/module/chat/cards/opposed-roll.js +++ b/module/chat/cards/opposed-roll.js @@ -126,9 +126,9 @@ export class OpposedCheckCard extends RollCard { get winnerCount () { let count = 0 - this.rolls.forEach(r => { + for (const r of this.rolls) { if (r.winner) count += 1 - }) + } return count } @@ -209,7 +209,7 @@ export class OpposedCheckCard extends RollCard { const data = { type: this.config.type, action: 'updateRoll', - rank: rank, + rank, fromGM: game.user.isGM } if (!game.user.isGM) data.roll = this.rolls[rank].JSONRollData @@ -285,7 +285,7 @@ export class OpposedCheckCard extends RollCard { const data = { type: this.defaultConfig.type, action: 'updateRoll', - rank: rank, + rank, fromGM: game.user.isGM } if (!game.user.isGM) data.roll = card.rolls[rank].JSONRollData @@ -296,6 +296,10 @@ export class OpposedCheckCard extends RollCard { } async compute (rank = undefined) { + this.rolls = this.rolls.filter(roll => { + return typeof roll.actor.data !== 'undefined' // remove any actors that no longer exist + }) + if (!rank) { for (let i = 0; i < this.rolls.length; i++) { delete this.rolls[i].maneuver @@ -325,10 +329,6 @@ export class OpposedCheckCard extends RollCard { } } - this.rolls = this.rolls.filter(roll => { - return (typeof roll.actor.data !== 'undefined') // Check if there's an actor set and if there's one and it doesnt exist remove him. - }) - if (this.combat) { // Sort combat rolls by index. this.rolls.sort((a, b) => { @@ -340,10 +340,10 @@ export class OpposedCheckCard extends RollCard { // Combat roll includes only 2 persons, remove the rest. if (this.rolls.length > 1) { this.rolls = [this.rolls[0], this.rolls[1]] - this.rolls.forEach(r => { + for (const r of this.rolls) { delete r.winner delete r.tie - }) + } } // First person added is the attacker. diff --git a/module/chat/cards/roll-card.js b/module/chat/cards/roll-card.js index f3be015a..99814cf8 100644 --- a/module/chat/cards/roll-card.js +++ b/module/chat/cards/roll-card.js @@ -6,6 +6,7 @@ import { CoC7Check } from '../../check.js' export class RollCard { constructor () { this.rolls = [] + this.initiator = null } static async fromMessageId (messageId) { @@ -59,7 +60,9 @@ export class RollCard { card.toggleFlag(flag) } else { const buttons = toggle.querySelectorAll('.toggle-switch') - buttons.forEach(b => card.unsetFlag(b.dataset.flag)) + for (const b of buttons) { + card.unsetFlag(b.dataset.flag) + } card.setFlag(flag) } card.updateChatCard() @@ -72,6 +75,9 @@ export class RollCard { this.defaultConfig.type === message.getFlag('CoC7', 'type') && message.getFlag('CoC7', 'state') !== 'resolved' ) { + if (['combinedCard'].includes(this.defaultConfig.type)) { + return message.getFlag('CoC7', 'initiator') === data.roll.initiator + } return true } return false @@ -91,6 +97,9 @@ export class RollCard { let card if (!messages.length) card = new this() else card = await this.fromMessage(messages[0]) + if (typeof data._rollMode !== 'undefined') { + card._rollMode = data._rollMode + } await card.process(data) } else game.socket.emit('system.CoC7', data) } @@ -107,7 +116,8 @@ export class RollCard { flags: { CoC7: { type: this.config.type, - state: 'initiated' + state: 'initiated', + initiator: this.initiator } } } @@ -153,6 +163,9 @@ export class RollCard { addRollData (data) { const check = Object.assign(new CoC7Check(), data.roll) this.rolls.push(check) + if (this.config.type === 'combinedCard') { + this.initiator = data.roll.initiator + } } addRoll (data) { @@ -179,7 +192,7 @@ export class RollCard { 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 } diff --git a/module/chat/cards/san-check.js b/module/chat/cards/san-check.js index f26baa1a..d8b9a6e7 100644 --- a/module/chat/cards/san-check.js +++ b/module/chat/cards/san-check.js @@ -1,8 +1,7 @@ /* global $, game, renderTemplate, Roll, ui */ - +import { COC7 } from '../../config.js' import { CoC7Check } from '../../check.js' import { CoC7Dice } from '../../dice.js' -import { CoC7Utilities } from '../../utilities.js' import { ChatCardActor } from '../card-actor.js' import { createInlineRoll, chatHelper } from '../helper.js' @@ -11,7 +10,7 @@ function replacer (key, value) { return undefined // remove from result } - const exclude = ['_actor', '_creature'] + const exclude = ['_actor'] if (exclude.includes(key)) { return undefined } @@ -23,6 +22,7 @@ function replacer (key, value) { return value // return as is } + export class SanCheckCard extends ChatCardActor { constructor (actorKey = null, sanData = {}, options = {}) { super( @@ -31,6 +31,7 @@ export class SanCheckCard extends ChatCardActor { ? Boolean(options.fastForward) : false ) + sanData.sanReason = sanData.sanReason ?? '' this.sanData = sanData this.options = options if (sanData.modifier && !isNaN(Number(sanData.modifier))) { @@ -39,7 +40,6 @@ export class SanCheckCard extends ChatCardActor { if (sanData.difficulty && !isNaN(Number(sanData.difficulty))) { this.options.sanDifficulty = Number(sanData.difficulty) } - // this.options.obj={test:1,test2:2}; this.state = {} } @@ -61,15 +61,9 @@ export class SanCheckCard extends ChatCardActor { : 0 } - get creature () { - // TODO : check constructor - if ( - this.sanData.creatureKey && - (!this.__creature || this.__creature.constructor.name === 'Object') - ) { - this.__creature = chatHelper.getActorFromKey(this.sanData.creatureKey) // REFACTORING (2) - } - return this.__creature + get sanLossSource () { + if (!this.sanData.tokenKey) return null + return chatHelper.getActorFromKey(this.sanData.tokenKey) } get involuntaryAction () { @@ -94,88 +88,54 @@ export class SanCheckCard extends ChatCardActor { ? Number(this.sanData.sanMin) : this.sanData.sanMin } - - const formula = this.creature?.sanLoss ? this.sanCheck.passed : 0 - if (formula) { - if (!isNaN(Number(formula))) return Number(formula) - return formula - } return 0 } return null } - get sanLostToThisCreature () { - if (this.creature) return this.actor.sanLostToCreature(this.creature) - return undefined + get sanLostToReason () { + return this.actor.sanLostToReason(this.sanData.sanReason) } - get maxSanLossToThisCreature () { - if (this.creature) { - return this.actor.maxPossibleSanLossToCreature(this.creature) - } - return undefined + get maxPossibleSanLoss () { + return this.actor.maxLossToSanReason( + this.sanData.sanReason, + this.sanData.sanMax + ) } get maxSanLoss () { - if (this.creature) return this.maxSanLossToThisCreature - if (this.sanData.sanMax) { - if (!isNaN(Number(this.sanData.sanMax))) { - return Number(this.sanData.sanMax) - } - return new Roll(this.sanData.sanMax).evaluate({ maximize: true }).total - } - return null + return new Roll(this.sanData.sanMax.toString()).evaluate({ + maximize: true + }).total } - get creatureEncountered () { - if (this.creature) return this.actor.creatureEncountered(this.creature) - return undefined - } - - get creatureSpecieEncountered () { - if (this.creature) { - return this.actor.creatureSpecieEncountered(this.creature) - } - return undefined + get sanLossReasonEncountered () { + return this.actor.sanLossReasonEncountered(this.sanData.sanReason) } get firstEncounter () { return !this.actor.mythosInsanityExperienced } - get creatureHasSpecie () { - const creatureSanData = CoC7Utilities.getCreatureSanData(this.creature) - if (creatureSanData.specie) return true - return false - } - get isActorLoosingSan () { // No san loss during bout of mad. - if (this.actor.isInABoutOfMadness) { + if (this.actor.hasTempoInsane) { return false } // The san loss is a 0 if (this.sanLossFormula === 0) return false - if (this.creature) { - // Creature has no san loss (what are we doing here ???) - if (!this.creature.sanLossMax) return false - - // Actor already encountered that creature and lost already more or equal than max creature SAN loss. - if ( - this.actor.sanLostToCreature(this.creature) >= this.creature.sanLossMax - ) { - this.state.immuneToCreature = true - return false - } - - // Max possible actor loos to this creature is 0 - if (this.actor.maxPossibleSanLossToCreature(this.creature) === 0) { - this.state.immuneToCreature = true - return false - } + if ( + this.sanData.sanReason && + this.actor.maxLossToSanReason( + this.sanData.sanReason, + this.sanData.sanMax + ) === 0 + ) { + this.state.immuneToCreature = true + return false } return true @@ -183,23 +143,16 @@ export class SanCheckCard extends ChatCardActor { get boutDurationText () { if (this.boutDuration) { - if (this.boutRealTime) return `${this.boutDuration} rounds` - if (this.boutSummary) return `${this.boutDuration} hours` + if (this.boutRealTime) { + return `${this.boutDuration} ${game.i18n.localize('CoC7.rounds')}` + } + if (this.boutSummary) { + return `${this.boutDuration} ${game.i18n.localize('CoC7.hours')}` + } } return null } - get alreadyInsaneText () { - if (this.actor.sanity.underlying.indefintie) { - return game.i18n.localize('CoC7.AlreadyUnderlyingInsanity') - } else { - return ( - game.i18n.localize('CoC7.AlreadyUnderlyingInsanity') + - ` (${this.actor.sanity.underlying.durationText})` - ) - } - } - get youGainCthulhuMythosString () { if (this.mythosGain) { return game.i18n.format('CoC7.YouGainedCthulhuMythos', { @@ -246,21 +199,18 @@ export class SanCheckCard extends ChatCardActor { ) this.state.boutOfMadnessResolved = true await this.triggerInsanity() - // if( this.state.indefinitelyInsane) this.actor. break } case 'boutOfMadnessOver': { - await this.actor.exitBoutOfMadness() + await this.actor.unsetCondition(COC7.status.tempoInsane) await this.triggerInsanity() break } - case 'noMythosGained': { this.state.cthulhuMythosAwarded = true this.mythosGain = 0 break } - case 'cthulhuMythosAwarded': { let amountGained = 1 if (!this.actor.mythosInsanityExperienced) { @@ -290,7 +240,7 @@ export class SanCheckCard extends ChatCardActor { this.sanCheck.difficulty = this.options.sanDifficulty || CoC7Check.difficultyLevel.regular this.sanCheck.diceModifier = this.options.sanModifier || 0 - await this.sanCheck._perform() + await this.sanCheck._perform({ forceDSN: true }) this.state.sanRolled = true this.state.involuntaryActionPerformed = this.sanCheck.passed this.state.sanLossRolled = true @@ -305,12 +255,12 @@ export class SanCheckCard extends ChatCardActor { this.sanCheck.difficulty = this.options.sanDifficulty || CoC7Check.difficultyLevel.regular this.sanCheck.diceModifier = this.options.sanModifier || 0 - await this.sanCheck._perform() + await this.sanCheck._perform({ forceDSN: true }) this.state.sanRolled = true this.state.involuntaryActionPerformed = this.sanCheck.passed if (!this.isActorLoosingSan) { this.state.finish = true - if (this.actor.isInABoutOfMadness) { + if (this.actor.hasTempoInsane) { this.state.immuneAlreadyInBout = true if (!this.sanCheck.passed) this.state.finish = false } @@ -321,61 +271,61 @@ export class SanCheckCard extends ChatCardActor { this.sanLoss = 0 } else if (typeof this.sanLossFormula === 'number') { this.state.sanLossRolled = true - if (this.creature) { - this.sanLoss = Math.min( - this.sanLossFormula, - this.maxSanLossToThisCreature + if (this.sanData.sanReason) { + this.sanLoss = this.actor.maxLossToSanReason( + this.sanData.sanReason, + this.sanLossFormula ) - if (this.sanLossFormula > this.maxSanLossToThisCreature) { + if (this.sanLoss < this.sanLossFormula) { this.state.limitedLossToCreature = true } - } else this.sanLoss = this.sanLossFormula + } else { + this.sanLoss = this.sanLossFormula + } } else if (this.sanCheck.isFumble) { this.state.sanLossRolled = true - this.sanLoss = this.maxSanLoss - } else if (this.creature) { + this.sanLoss = this.actor.maxLossToSanReason( + this.sanData.sanReason, + this.sanData.sanMax + ) + } else if (this.sanData.sanReason) { const min = new Roll(this.sanLossFormula).evaluate({ minimize: true }).total - if (min >= this.maxSanLossToThisCreature) { + const max = this.actor.maxLossToSanReason( + this.sanData.sanReason, + this.sanData.sanMax + ) + if (min >= max) { this.state.sanLossRolled = true - this.sanLoss = this.maxSanLossToThisCreature + this.sanLoss = max this.state.limitedLossToCreature = true } } } async rollSanLoss () { - if (this.creature) { - // this.sanLossRoll = new Roll(`{${this.sanLossFormula},${this.maxSanLossToThisCreature}}kl`); - this.sanLossRoll = new Roll(`${this.sanLossFormula}`) - } else { - this.sanLossRoll = new Roll(`${this.sanLossFormula}`) - } + this.sanLossRoll = new Roll(`${this.sanLossFormula}`) await this.sanLossRoll.roll({ async: true }) await CoC7Dice.showRollDice3d(this.sanLossRoll) - if (this.creature) { - // Will never happen - if (this.sanLossRoll.total > this.maxSanLossToThisCreature) { - this.state.limitedLossToCreature = true - } + const max = this.actor.maxLossToSanReason( + this.sanData.sanReason, + this.sanData.sanMax + ) + + if (this.sanLossRoll.total > max) { + this.state.limitedLossToCreature = true } - this.sanLoss = this.creature - ? Math.min(this.sanLossRoll.total, this.maxSanLossToThisCreature) - : this.sanLossRoll.total + this.sanLoss = Math.min(this.sanLossRoll.total, max) this.state.sanLossRolled = true } async applySanLoss () { - if (this.creature) { - await this.actor.looseSanToCreature(this.sanLoss, this.creature) - } else { - await this.actor.looseSan(this.sanLoss) - } + await this.actor.looseSan(this.sanData.sanReason, this.sanLoss) if (this.sanLoss > 0) this.state.actorLostSan = true this.state.sanLossApplied = true @@ -392,7 +342,7 @@ export class SanCheckCard extends ChatCardActor { if (this.sanLoss < 5) { this.state.intRolled = true - if (this.actor.isInsane) { + if (this.actor.hasIndefInsane) { this.state.insanity = true this.state.shaken = true this.state.insanityTableRolled = false @@ -408,9 +358,7 @@ export class SanCheckCard extends ChatCardActor { this.state.intRolled = false } - let oneFifthSanity = this.actor.data.data.attribs.san.oneFifthSanity - oneFifthSanity = parseInt(oneFifthSanity.replace(/\D/g, '')) - if (this.actor.dailySanLoss >= oneFifthSanity) { + if (this.actor.dailySanLoss >= this.data.data.attribs.san.dailyLimit) { // this.actor.san/5 this.state.insanity = true this.state.intRolled = true @@ -429,7 +377,7 @@ export class SanCheckCard extends ChatCardActor { this.intCheck.difficulty = this.options.intDifficulty || CoC7Check.difficultyLevel.regular this.intCheck.diceModifier = this.options.intModifier || 0 - await this.intCheck._perform() + await this.intCheck._perform({ forceDSN: true }) this.state.intRolled = true if (this.intCheck.passed || this.state.alreadyInsane) { this.state.insanity = true @@ -447,36 +395,15 @@ export class SanCheckCard extends ChatCardActor { async triggerInsanity () { this.state.boutOfMadnessOver = true - if (this.state.indefinitelyInsane) await this.actor.enterInsanity(true) - if (this.state.temporaryInsane) { - if ( - this.actor.sanity.underlying.active && - this.actor.sanity.underlying.indefintie - ) { - // Already indefinite insanity - this.state.finish = true - return - } - this.insanityDurationRoll = await new Roll('1D10').roll({ async: true }) - this.insanityDuration = this.insanityDurationRoll.total - if (this.actor.sanity.underlying.duration) { - this.insanityDuration += this.actor.sanity.underlying.duration - } - await this.actor.enterInsanity(false, this.insanityDuration) + if (this.state.indefinitelyInsane) { + await this.actor.setCondition(COC7.status.indefInsane) } this.state.finish = true } - async resetCreatureSanData () { - await this.actor.resetCreature(this.creature) - if (!this.creatureEncountered && !this.creatureSpecieEncountered) { - this.state.keepCreatureSanData = true - } - } - - async resetSpecieSanData () { - await this.actor.resetSpecie(this.creature) - if (!this.creatureEncountered && !this.creatureSpecieEncountered) { + async clearSanLossReason () { + await this.actor.setReasonSanLoss(this.sanData.sanReason, 0) + if (!this.sanLossReasonEncountered) { this.state.keepCreatureSanData = true } } @@ -516,32 +443,26 @@ export class SanCheckCard extends ChatCardActor { return 'systems/CoC7/templates/chat/cards/san-check.html' } - static checkTargets (creatureKey, fastForward = false) { + static checkTargets (sanData, fastForward = false) { const targets = [...game.user.targets] if (targets.length) { - targets.forEach(t => { - // TODO : ? Make async call to create ? + for (const t of targets) { if (t.actor.isToken) { - SanCheckCard.create( - t.actor.tokenKey, - { creatureKey: creatureKey }, - { fastForward: fastForward } - ) + SanCheckCard.create(t.actor.tokenKey, sanData, { + fastForward + }) } else { - SanCheckCard.create( - t.actor.id, - { creatureKey: creatureKey }, - { fastForward: fastForward } - ) + SanCheckCard.create(t.actor.id, sanData, { fastForward }) } - }) + } + } else { + ui.notifications.warn(game.i18n.localize('CoC7.WarnNoTargetsSanCheck')) } } static async create (...args) { const chatCard = new SanCheckCard(...args) - - if (chatCard.actor.isInsane) { + if (chatCard.actor.hasIndefInsane) { chatCard.state.alreadyInsane = true } @@ -555,10 +476,6 @@ export class SanCheckCard extends ChatCardActor { chatCard.state.finish = true } - if (!chatCard.creatureEncountered && !chatCard.creatureSpecieEncountered) { - chatCard.state.keepCreatureSanData = true - } - const html = await renderTemplate(SanCheckCard.template, chatCard) const htmlCardElement = $.parseHTML(html)[0] @@ -602,8 +519,6 @@ export class SanCheckCard extends ChatCardActor { sanCheckCard.sanLossRoll = Roll.fromData(sanCheckCard.sanLossRoll) } - // sanCheckCard.sanCheck?.toMessage(); - return sanCheckCard } } diff --git a/module/chat/cards/test.js b/module/chat/cards/test.js new file mode 100644 index 00000000..db71fd8f --- /dev/null +++ b/module/chat/cards/test.js @@ -0,0 +1,28 @@ +/* global mergeObject */ +// TO BE REMOVED FOR PROD +import { EnhancedChatCard } from '../../common/chatcardlib/src/chatcardlib.js' +export class TestCard extends EnhancedChatCard { + /** + * Extend and override the default options + * @returns {Object} + */ + static get defaultOptions () { + return mergeObject(super.defaultOptions, { + template: 'systems/CoC7/templates/chat/cards/test.html' + }) + } + + async getData () { + const data = await super.getData() + data.mySelectOptions = { + 0: 'option 1', + 1: 'option 2' + } + + return data + } + + // activateListeners (html) { + // super.activateListeners(html) + // } +} diff --git a/module/chat/combat/melee-initiator.js b/module/chat/combat/melee-initiator.js index a771c3af..ec3add28 100644 --- a/module/chat/combat/melee-initiator.js +++ b/module/chat/combat/melee-initiator.js @@ -3,7 +3,6 @@ import { CoC7Check } from '../../check.js' import { chatHelper, CoC7Roll } from '../helper.js' import { CoC7Chat } from '../../chat.js' -import { CoC7MeleeTarget } from './melee-target.js' import { CoC7MeleeResoltion } from './melee-resolution.js' import { ChatCardActor } from '../card-actor.js' @@ -113,14 +112,13 @@ export class CoC7MeleeInitiator extends ChatCardActor { check.successLevel === CoC7Check.successLevel.extreme || check.successLevel === CoC7Check.successLevel.critical if (this.hasTarget && !this.autoSuccess) { - const meleeTarget = new CoC7MeleeTarget( - this.targetKey, - this.messageId, - this.fastForward - ) - meleeTarget.initiatorKey = this.actorKey - const message = await meleeTarget.createChatCard() - this.targetCard = message.id + const message = await game.CoC7socket.executeAsGM('gmcreatemessageas', { + targetKey: this.targetKey, + messageId: this.messageId, + fastForward: this.fastForward, + actorKey: this.actorKey + }) + this.targetCard = message.id || message._id } if (this.autoSuccess && !this.check.isFumble) { @@ -224,7 +222,9 @@ export class CoC7MeleeInitiator extends ChatCardActor { // TODO : Check if this needs to be async if (!this.actor.spendLuck(luckAmount)) { ui.notifications.error( - `${this.actor.name} didn't have enough luck to pass the check` + game.i18n.format('CoC7.LuckNotEnough', { + name: this.actor.name + }) ) } this.roll.value = null @@ -250,7 +250,7 @@ export class CoC7MeleeInitiator extends ChatCardActor { resulDetails.innerText = game.i18n.format( 'CoC7.RollResult.LuckSpendText', { - luckAmount: luckAmount, + luckAmount, successLevel: game.i18n.localize('CoC7.RegularDifficulty') } ) @@ -261,7 +261,7 @@ export class CoC7MeleeInitiator extends ChatCardActor { resulDetails.innerText = game.i18n.format( 'CoC7.RollResult.LuckSpendText', { - luckAmount: luckAmount, + luckAmount, successLevel: game.i18n.localize('CoC7.HardDifficulty') } ) @@ -273,7 +273,7 @@ export class CoC7MeleeInitiator extends ChatCardActor { resulDetails.innerText = game.i18n.format( 'CoC7.RollResult.LuckSpendText', { - luckAmount: luckAmount, + luckAmount, successLevel: game.i18n.localize('CoC7.ExtremeDifficulty') } ) @@ -285,7 +285,7 @@ export class CoC7MeleeInitiator extends ChatCardActor { resulDetails.innerText = game.i18n.format( 'CoC7.RollResult.LuckSpendText', { - luckAmount: luckAmount, + luckAmount, successLevel: game.i18n.localize('CoC7.CriticalDifficulty') } ) diff --git a/module/chat/combat/melee-resolution.js b/module/chat/combat/melee-resolution.js index 6e7b8466..57440fe5 100644 --- a/module/chat/combat/melee-resolution.js +++ b/module/chat/combat/melee-resolution.js @@ -78,6 +78,26 @@ export class CoC7MeleeResoltion { async resolve () { if (this.target) { switch (this.target.action) { + case 'noResponse': + if (this.initiator.roll.successLevel > 0) { + this.resultString = game.i18n.format('CoC7.WinnerRollDamage', { + name: this.initiator.name + }) + this.action = 'roll-melee-damage' + this.rollDamage = true + } else { + this.resultString = game.i18n.format('CoC7.InitiatorMissed', { + name: this.initiator.name + }) + this.winner = this.initiator + this.rollDamage = false + } + this.winner = this.initiator + this.winnerImg = this.initiator.weapon.img + this.winnerTitle = this.initiator.weapon.name + this.looser = this.target + break + case 'dodge': if ( this.initiator.roll.successLevel <= 0 && @@ -186,16 +206,18 @@ export class CoC7MeleeResoltion { default: break } + } else if (this.initiator.roll.successLevel > 0) { + this.resultString = game.i18n.format('CoC7.WinnerRollDamage', { + name: this.initiator.name + }) + this.winner = this.initiator + this.rollDamage = true } else { - if (this.initiator.roll.successLevel > 0) { - this.resultString = `${this.initiator.name} won. Roll damage` - this.winner = this.initiator - this.rollDamage = true - } else { - this.resultString = `${this.initiator.name} missed.` - this.winner = this.initiator - this.rollDamage = false - } + this.resultString = game.i18n.format('CoC7.InitiatorMissed', { + name: this.initiator.name + }) + this.winner = this.initiator + this.rollDamage = false } if (this.winner) { diff --git a/module/chat/combat/melee-target.js b/module/chat/combat/melee-target.js index d4dbb6ea..d5215f78 100644 --- a/module/chat/combat/melee-target.js +++ b/module/chat/combat/melee-target.js @@ -26,16 +26,23 @@ export class CoC7MeleeTarget extends ChatCardActor { this.skillId = null this.itemId = null this.dodging = false + this.notResponding = false this.fightingBack = false this.maneuvering = false } get actionSelected () { - return this.dodging || this.fightingBack || this.maneuvering + return ( + this.dodging || + this.notResponding || + this.fightingBack || + this.maneuvering + ) } get action () { if (this.dodging) return 'dodge' + if (this.notResponding) return 'noResponse' if (this.fightingBack) return 'fightBack' if (this.maneuvering) return 'maneuver' return null @@ -149,7 +156,10 @@ export class CoC7MeleeTarget extends ChatCardActor { let owners = [] const gms = game.users.filter(a => a.isGM).map(a => a.id) for (const [k, v] of Object.entries(this.actor.data.permission)) { - if (v === CONST.ENTITY_PERMISSIONS.OWNER) { + if ( + v === + (CONST.DOCUMENT_OWNERSHIP_LEVELS || CONST.ENTITY_PERMISSIONS).OWNER + ) { if (k === 'default') { owners = game.users.map(a => a.id) break @@ -172,7 +182,7 @@ export class CoC7MeleeTarget extends ChatCardActor { content = '

                                                        ' + 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.localize('SETTINGS.TitleRules') + - '

                                                        ' - ) - systemTab - .find('select[name=CoC7\\.initiativeRule]') + .find('input[name=CoC7\\.displayInitDices]') .closest('div.form-group') .before( '

                                                        ' + @@ -46,7 +46,7 @@ Hooks.on('renderSettingsConfig', (app, html, options) => { '

                                                        ' ) systemTab - .find('input[name=CoC7\\.displayActorOnCard]') + .find('input[name=CoC7\\.trustedCanModfyChatCard]') .closest('div.form-group') .before( '

                                                        ' + @@ -61,6 +61,14 @@ Hooks.on('renderSettingsConfig', (app, html, options) => { game.i18n.localize('SETTINGS.TitleScene') + '

                                                        ' ) + systemTab + .find('input[name=CoC7\\.overrideGameArtwork]') + .closest('div.form-group') + .before( + '

                                                        ' + + game.i18n.localize('SETTINGS.TitleGameArtwork') + + '

                                                        ' + ) systemTab .find('input[name=CoC7\\.displayPlayerNameOnSheet]') .closest('div.form-group') @@ -101,21 +109,26 @@ Hooks.on('renderSettingsConfig', (app, html, options) => { game.i18n.localize('SETTINGS.TitleRollTable') + '' ) -}) - -Hooks.once('diceSoNiceReady', dice3d => { - dice3d.addDicePreset( - { - type: 'dt', - labels: ['10', '20', '30', '40', '50', '60', '70', '80', '90', '00'], - fontScale: 0.75, - system: 'standard' - }, - 'dt' - ) + // MOVED TO CHASSE INDIVIDUAL SETTING + // systemTab + // .find('input[name=CoC7\\.chaseShowTokenMovement]') + // .closest('div.form-group') + // .before( + // '

                                                        ' + + // game.i18n.localize('SETTINGS.TitleChaseSettings') + + // '

                                                        ' + // ) }) Hooks.once('init', async function () { + if ( + typeof CONST.COMPATIBILITY_MODES !== 'undefined' && + !isNewerVersion(game.version, '10.300') + ) { + // hide compatibility warnings while we still support v9 and v10 with the same version + CONFIG.compatibility.mode = CONST.COMPATIBILITY_MODES.SILENT + } + game.CoC7 = { macros: { skillCheck: CoC7Utilities.skillCheckMacro, @@ -123,12 +136,20 @@ Hooks.once('init', async function () { check: CoC7Utilities.checkMacro }, cards: { - DamageCard: DamageCard + DamageCard + }, + dev: { + dice: { + alwaysCrit: false, + alwaysFumble: false + } } } Combat.prototype.rollInitiative = rollInitiative }) +initECC(ChaseObstacleCard) + Hooks.on('renderCombatTracker', (app, html, data) => CoC7Combat.renderCombatTracker(app, html, data) ) @@ -136,6 +157,8 @@ Hooks.on('renderCombatTracker', (app, html, data) => DiceBot.listen() CoC7Hooks.listen() +Hooks.once('socketlib.ready', CoC7Socket) + Hooks.once('setup', function () { // Localize CONFIG objects once up-front const toLocalize = [ @@ -156,40 +179,118 @@ Hooks.once('setup', function () { }, {}) } - let effectIndex = CONFIG.statusEffects.findIndex(t => t.id === 'dead') + let effectIndex = CONFIG.statusEffects.findIndex( + t => t.id === COC7.status.dead + ) if (effectIndex !== -1) { CONFIG.statusEffects[effectIndex].icon = 'systems/CoC7/assets/icons/tombstone.svg' } - effectIndex = CONFIG.statusEffects.findIndex(t => t.id === 'unconscious') + effectIndex = CONFIG.statusEffects.findIndex( + t => t.id === COC7.status.unconscious + ) if (effectIndex !== -1) { CONFIG.statusEffects[effectIndex].icon = 'systems/CoC7/assets/icons/knocked-out-stars.svg' } CONFIG.statusEffects.unshift( { - id: 'boutOfMadness', + id: COC7.status.tempoInsane, label: 'CoC7.BoutOfMadnessName', icon: 'systems/CoC7/assets/icons/hanging-spider.svg' }, { - id: 'insanity', + id: COC7.status.indefInsane, label: 'CoC7.InsanityName', icon: 'systems/CoC7/assets/icons/tentacles-skull.svg' }, { - id: 'criticalWounds', - label: 'criticalWounds', + id: COC7.status.criticalWounds, + label: 'CoC7.CriticalWounds', icon: 'systems/CoC7/assets/icons/arm-sling.svg' }, { - id: 'dying', - label: 'dying', + id: COC7.status.dying, + label: 'CoC7.Dying', icon: 'systems/CoC7/assets/icons/heart-beats.svg' } ) }) +Hooks.on('createActiveEffect', (data, options, userId) => { + if ( + game.userId === userId && + typeof data.data.flags.core !== 'undefined' && + typeof data.data.flags.core.statusId !== 'undefined' + ) { + switch (data.data.flags.core.statusId) { + case COC7.status.indefInsane: + case COC7.status.unconscious: + case COC7.status.criticalWounds: + case COC7.status.dying: + case COC7.status.prone: + case COC7.status.dead: + data.parent.setCondition(data.data.flags.core.statusId, { + forceValue: true + }) + break + case COC7.status.tempoInsane: + { + const realTime = data.data.flags.CoC7?.realTime + let duration = null + if (realTime === true) { + duration = data.data.duration?.rounds + } else if (realTime === false) { + duration = data.data.duration?.seconds + if (!isNaN(duration)) { + duration = Math.floor(duration / 3600) + } + } + data.parent.setCondition(COC7.status.tempoInsane, { + forceValue: true, + realTime, + duration + }) + } + break + } + } +}) + +Hooks.on('deleteActiveEffect', (data, options, userId) => { + if ( + game.userId === userId && + typeof data.data.flags.core !== 'undefined' && + typeof data.data.flags.core.statusId !== 'undefined' + ) { + switch (data.data.flags.core.statusId) { + 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: + data.parent.unsetCondition(data.data.flags.core.statusId, { + forceValue: true + }) + } + } +}) + +// This will hide the item called '__CoC7InternalItem__' +// This item is used for internal purposes and should not be seen by anyone +Hooks.on('changeSidebarTab', directory => { + if (directory instanceof ItemDirectory) { + const item = game.items.find(i => i.name === '__CoC7InternalItem__') + if (item) { + const html = directory._element + const itemElement = html.find(`[data-document-id='${item.id}']`) + if (itemElement) itemElement[0].style.display = 'none' + } + } +}) + Hooks.on('hotbarDrop', async (bar, data, slot) => CoC7Utilities.createMacro(bar, data, slot) ) @@ -211,23 +312,14 @@ Hooks.on('ready', async () => { activateGlobalListener() - game.socket.on('system.CoC7', async data => { - if (data.type === 'updateChar') CoC7Utilities.updateCharSheets() + // setGlobalCssVar() - if (game.user.isGM) { - if (OpposedCheckCard.defaultConfig.type === data.type) { - OpposedCheckCard.dispatch(data) - } + configureTinyMCE() - if (CombinedCheckCard.defaultConfig.type === data.type) { - CombinedCheckCard.dispatch(data) - } + game.CoC7.skillList = await game.packs.get('CoC7.skills')?.getDocuments() - if (data.type === 'invoke') { - const item = await fromUuid(data.item) - item[data.method](data.data) - } - } + game.socket.on('system.CoC7', async data => { + CoC7SystemSocket.callSocket(data) }) // "SETTINGS.BoutOfMadnessPhobiasIndex": "Phobias index", @@ -247,9 +339,9 @@ Hooks.on('ready', async () => { // } const tableChoice = { none: 'SETTINGS.LetKeeperDecide' } - game.tables.forEach(t => { + for (const t of game.tables) { tableChoice[t.data._id] = t.data.name - }) + } game.settings.register('CoC7', 'boutOfMadnessSummaryTable', { name: 'SETTINGS.BoutOfMadnessSummaryTable', @@ -316,14 +408,14 @@ Hooks.on('ready', async () => { game.settings.get('CoC7', 'boutOfMadnessSummaryTable') === 'none' ? null : game.tables.get( - game.settings.get('CoC7', 'boutOfMadnessSummaryTable') - ), + game.settings.get('CoC7', 'boutOfMadnessSummaryTable') + ), boutOfMadness_RealTime: game.settings.get('CoC7', 'boutOfMadnessRealTimeTable') === 'none' ? null : game.tables.get( - game.settings.get('CoC7', 'boutOfMadnessRealTimeTable') - ) + game.settings.get('CoC7', 'boutOfMadnessRealTimeTable') + ) // maniasIndex: ge.settings.get('CoC7', 'boutOfMadnessPhobiasIndex'), // phobiasIndex: game.settings.get('CoC7', 'boutOfMadnessManiasIndex'), // phobias: ('none' == game.settings.get('CoC7', 'samplePhobiasTable'))?null:game.tables.get(game.settings.get('CoC7', 'samplePhobiasTable')), @@ -333,6 +425,16 @@ Hooks.on('ready', async () => { // Hooks.on('preCreateActor', (createData) => CoCActor.initToken( createData)); +Hooks.on( + 'renderCoC7ChaseSheet', + /** async */ (app, html, data) => + /** await */ CoC7ChaseSheet.setScroll(app, html, data) +) + +Hooks.on('closeCoC7ChaseSheet', (app, html) => + CoC7ChaseSheet.onClose(app, html) +) + // Called on closing a character sheet to lock it on getting it to display values Hooks.on('closeActorSheet', characterSheet => characterSheet.onCloseSheet()) Hooks.on('renderCoC7CreatureSheet', (app, html, data) => @@ -374,7 +476,10 @@ Hooks.on('getSceneControlButtons', (/* controls */) => { // Hooks.on('renderSceneControls', () => CoC7Utilities.updateCharSheets()); // Hooks.on('renderSceneNavigation', () => CoC7Utilities.updateCharSheets()); Hooks.on('renderItemSheet', CoC7Parser.ParseSheetContent) +// Foundry VTT v9 Hooks.on('renderJournalSheet', CoC7Parser.ParseSheetContent) +// Foundry VTT v10 +Hooks.on('renderJournalPageSheet', CoC7Parser.ParseSheetContent) Hooks.on('renderActorSheet', CoC7Parser.ParseSheetContent) // Chat command processing // Hooks.on('preCreateChatMessage', CoC7Parser.ParseMessage); @@ -383,21 +488,18 @@ Hooks.on('renderChatMessage', (app, html, data) => { CoC7Chat.renderChatMessageHook(app, html, data) CoC7Parser.ParseMessage(app, html, data) }) -// Sheet V2 css options -// Hooks.on('renderCoC7CharacterSheetV2', CoC7CharacterSheetV2.renderSheet); -Hooks.on('renderActorSheet', CoC7CharacterSheetV2.renderSheet) // TODO : change from CoC7CharacterSheetV2 -Hooks.on('renderItemSheet', CoC7CharacterSheetV2.renderSheet) // TODO : change from CoC7CharacterSheetV2 +// Sheet css options +// Hooks.on('renderCoC7CharacterSheet', CoC7CharacterSheet.renderSheet); +Hooks.on('renderActorSheet', CoC7CharacterSheet.renderSheet) +Hooks.on('renderItemSheet', CoC7CharacterSheet.renderSheet) // Hooks.on('dropCanvasData', CoC7Parser.onDropSomething); -Hooks.on('renderSceneControls', CoC7Menu.renderMenu) +Hooks.on('getSceneControlButtons', CoC7Menu.getButtons) +Hooks.on('renderSceneControls', CoC7Menu.renderControls) Hooks.on('dropCanvasData', CoC7Canvas.onDropSomething) -tinyMCE.PluginManager.add('CoC7_Editor_OnDrop', function (editor) { - editor.on('drop', event => CoC7Parser.onEditorDrop(event, editor)) -}) - -CONFIG.TinyMCE.plugins = `CoC7_Editor_OnDrop ${CONFIG.TinyMCE.plugins}` +Hooks.on('dropActorSheetData', DropActorSheetData) function activateGlobalListener () { const body = $('body') @@ -405,43 +507,46 @@ function activateGlobalListener () { document.addEventListener('mousedown', _onLeftClick) } +/** + * Configuration of TinyMCE editor + */ +function configureTinyMCE () { + // Add on drop event to tinyMCE to hendle the links drop + tinyMCE.PluginManager.add('CoC7_Editor_OnDrop', function (editor) { + editor.on('drop', event => CoC7Parser.onEditorDrop(event, editor)) + }) + + // Add custom plugins to list of plugins. + // CONFIG.TinyMCE.plugins = `CoC7_Editor_OnInit CoC7_Editor_OnDrop ${CONFIG.TinyMCE.plugins}` + CONFIG.TinyMCE.plugins = `CoC7_Editor_OnDrop ${CONFIG.TinyMCE.plugins}` + // + // if (game.user.isGM) { + // // Define css and menu for keeper only blocks + // CONFIG.TinyMCE.content_css.push('/systems/CoC7/assets/mce.css') + // CONFIG.TinyMCE.style_formats.push({ + // title: 'CoC7', + // items: [ + // { + // title: 'Keeper Only', + // block: 'section', + // classes: 'keeper-only', + // wrapper: true + // } + // ] + // }) + // } else { + // // Prevent player to edit and view source code if settings is disabled + // if (!game.settings.get('CoC7', 'enablePlayerSourceCode')) + // CONFIG.TinyMCE.toolbar = CONFIG.TinyMCE.toolbar.replace(' code', '') + // // Hide keeper only blocks to players + // CONFIG.TinyMCE.content_style = '.keeper-only {display: none}' + // } +} + function _onLeftClick (event) { return event.shiftKey } -Hooks.on('targetToken', function (user, token, targeted) { - if (targeted) { - // Check if the targeted token is a player controlled token but no user controls it - let gmonly = true - if ( - token.actor.data.permission.default === CONST.ENTITY_PERMISSIONS.OWNER - ) { - gmonly = false - } else { - const gms = game.users.filter(a => a.isGM).map(a => a.id) - for (const [k, v] of Object.entries(token.actor.data.permission)) { - if ( - k !== 'default' && - v === CONST.ENTITY_PERMISSIONS.OWNER && - !gms.includes(k) - ) { - gmonly = false - } - } - } - if (!gmonly) { - const controlled = game.users.filter( - a => !a.isGM && a.data.character === token.actor.id - ) - if (controlled.length === 0) { - ui.notifications.error( - game.i18n.format('CoC7.MessageSelectedTargetIsNotControlled', { - name: token.name - }) - ) - } - } - } -}) - +CONFIG.ui.settings = CoC7SettingsDirectory CONFIG.ui.compendium = CoC7CompendiumDirectory +CONFIG.ui.actors = CoC7ActorDirectory diff --git a/module/common/chatcardlib/LICENSE.md b/module/common/chatcardlib/LICENSE.md new file mode 100644 index 00000000..fdcdb502 --- /dev/null +++ b/module/common/chatcardlib/LICENSE.md @@ -0,0 +1,21 @@ +# MIT License + +Copyright (c) 2021 + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/styles/chat/constants.less b/module/common/chatcardlib/css/ecc.css similarity index 100% rename from styles/chat/constants.less rename to module/common/chatcardlib/css/ecc.css diff --git a/module/common/chatcardlib/init.js b/module/common/chatcardlib/init.js new file mode 100644 index 00000000..b98cc82e --- /dev/null +++ b/module/common/chatcardlib/init.js @@ -0,0 +1,3 @@ +import { initHooks } from './src/chatcardlib.js' + +initHooks() diff --git a/module/common/chatcardlib/src/chatcardlib.js b/module/common/chatcardlib/src/chatcardlib.js new file mode 100644 index 00000000..3ac5a18f --- /dev/null +++ b/module/common/chatcardlib/src/chatcardlib.js @@ -0,0 +1,733 @@ +/* global $, ChatMessage, deepClone, FormDataExtended, foundry, fromUuid, game, Hooks, mergeObject, renderTemplate, socketlib, ui */ +import { CoC7Utilities } from '../../../utilities.js' + +const ECC_CLASS = 'enhanced-chat-card' + +const PERMISSION_TYPE = { + GM: 'gm', // user is GM + NOT_GM: '!gm', // user is NOT gm (hide to GM in case of visibility) + SPEAKER: 'speaker', // the speaker is an actor controled/owned by the user + USER: 'user', // the user is the message's author + EVERYONE: 'all', // equivalent to empty string + BLACKLIST: 'blacklist' // invert the logic +} + +const STATE = { + ON: 'switched-on', + OFF: 'switched-off' +} + +export function initECC (...cardclass) { + // Hooks.once('init', function () { + // }) + + Hooks.on('renderChatLog', (app, html, data) => + EnhancedChatCardLib.injectCSS(app, html, data) + ) + + Hooks.once('socketlib.ready', function () { + EnhancedChatCardLib.register(cardclass) + EnhancedChatCardLib.socket = socketlib.registerSystem(game.system.id) // Socket is attached to current system + EnhancedChatCardLib.socket.register('updateMessage', updateMessage) + EnhancedChatCardLib.socket.register('GMUpdate', GMUpdate) + EnhancedChatCardLib.socket.register('advise', advise) + // EnhancedChatCardLib.socket.register('gmtradeitemto', gmtradeitemto) + }) + + Hooks.on('renderChatMessage', (app, html, data) => + EnhancedChatCard.bindListeners(html) + ) +} + +async function updateMessage (messageId, newContent) { + const chatMessage = game.messages.get(messageId) + + await chatMessage.update({ + content: newContent + }) +} + +async function GMUpdate (data, options, cardClassName, messageId = undefined) { + const card = await EnhancedChatCard.fromData( + data, + options, + cardClassName, + messageId + ) + await card.GMUpdate() + // const diff = foundry.utils.diffObject( data, card.toObject()) + return card.toObject() +} + +async function advise () {} + +class EnhancedChatCardLib { + constructor () { + this.types = new Map() + this.socket = null + // this.enhancedChatCardClass = EnhancedChatCard + } + + static injectCSS () { + let style = $('head').find('style') + if (!style?.length) { + $('head').append($('')) + style = $('head').find('style') + } + style.append( + `.ecc-restricted {color: red} + .ecc-restricted:hover {cursor: not-allowed}` + ) + } + + static set socket (x) { + if (!game.enhancedChatCardsLib) { + game.enhancedChatCardsLib = new EnhancedChatCardLib() + } + game.enhancedChatCardsLib.socket = x + } + + static get socket () { + if (!game.enhancedChatCardsLib) { + ui.notifications.error('ECC not Initialized') + return undefined + } + if (!game.enhancedChatCardsLib.socket) { + ui.notifications.error('ECC no socket') + return undefined + } + return game.enhancedChatCardsLib.socket + } + + static get types () { + if (!game.enhancedChatCardsLib) { + game.enhancedChatCardsLib = new EnhancedChatCardLib() + } + return game.enhancedChatCardsLib.types + } + + static register (cardConstructors) { + cardConstructors.forEach(cardConstructor => { + if (!EnhancedChatCardLib.types.get(cardConstructor.name)) { + EnhancedChatCardLib.types.set(cardConstructor.name, cardConstructor) + } + }) + } + + // static gm_onToggle (data){ + // ui.notifications.info( 'gm_onToggle') + // } +} + +export class EnhancedChatCard { + // static register (cardConstructor) { + // EnhancedChatCardLib.register(cardConstructor) + // } + + constructor (data = {}, options = {}) { + this.data = data + if (!this.data.flags) this.data.flags = {} + this._options = options + } + + /** + * Called only once before sending message to chat. + * @override + */ + async initialize () {} + + get options () { + return mergeObject(this.constructor.defaultOptions, this._options) + } + + set options (x) { + this._options = x + } + + get template () { + return this.options.template + } + + get cssClasses () { + return this.options.classes?.join(' ') + } + + get speaker () { + if (this.options.ooc) return game.user + if ( + this.options.speaker && + ChatMessage.getSpeakerActor(this.options.speaker) + ) { + return ChatMessage.getSpeakerActor(this.options.speaker) + } + return game.user + } + + async getData () { + // await this.assignObjects() + return { + card: this, + flags: this.flags, + data: this.toObject(), + options: this.options, + css: this.cssClasses, + user: game.user, + speaker: this.speaker + } + } + + toObject () { + if (!this.data) return + const data = {} + for (const k of Object.keys(this.data)) { + const v = this.data[k] + if (v instanceof Object) { + data[k] = v.toObject ? v.toObject() : deepClone(v) + } else data[k] = v + } + return data + } + + async toMessage (optionnalChatData = {}) { + // Map ecc card type if not registered already + // this.registerECCClass() + + await this.initialize() + + // Publish by current user by default unless options.GMchatCard + const data = await this.getData() + const html = await renderTemplate(this.template, data) + const htmlCardElement = $(html)[0] + if (this.options.attachObject) { + htmlCardElement.dataset.object = escape(this.objectDataString) + } + htmlCardElement.dataset.eccClass = this.constructor.name + htmlCardElement.classList.add(...this.options.classes) + + const speaker = + this.options.speaker && !this.options.ooc + ? ChatMessage.getSpeaker(this.options.speaker) + : {} + + // const userId = this.options.userId ? this.options.userId : game.user.id + + const chatData = foundry.utils.mergeObject( + { + // user: userId, + user: game.user.id, + speaker, + flavor: game.i18n.localize(this.options.title), + content: htmlCardElement.outerHTML + }, + optionnalChatData + ) + + if (['gmroll', 'blindroll'].includes(this.rollMode)) { + chatData.whisper = ChatMessage.getWhisperRecipients('GM') + } + if (this.rollMode === 'selfroll') chatData.whisper = [game.user.id] + if (this.rollMode === 'blindroll') chatData.blind = true + + ChatMessage.create(chatData).then(msg => { + return msg + }) + } + + async updateChatCard ({ attachObject = true } = {}) { + // TODO the whole function has to be executed by GM if options.GMchatCard + if (this.options.compute) await this.localCompute() + if (this.options.GMUpdate) await this.ExecuteGMUpdate() + if (!this.messageId) { + this.toMessage() + } else { + const data = await this.getData() + const html = await renderTemplate(this.template, data) + const htmlCardElement = $.parseHTML(html)[0] + + // Attach the object to the message. + if (attachObject && !this.data.EEC_ACTION?.detachData) { + htmlCardElement.dataset.object = escape(this.objectDataString) + } + htmlCardElement.dataset.eccClass = this.constructor.name + htmlCardElement.classList.add(...this.options.classes) + + // Update the message. + game.enhancedChatCardsLib.socket.executeAsGM( + 'updateMessage', + this.messageId, + htmlCardElement.outerHTML + ) + // const chatMessage = game.messages.get(this.messageId) + + // const msg = await chatMessage.update({ //Dispatch request by socket + // content: htmlCardElement.outerHTML //Dispatch request by socket + // }) //Dispatch request by socket + // await ui.chat.updateMessage(msg, false) //Dispatch request by socket + // return msg //Dispatch request by socket + } + } + + async activateListeners (html) { + // html.on( + // 'click', + // `.${ECC_CLASS} .ecc-radio-switch`, + // this._onToggle.bind(this) + // ) + html.on('change', 'input,select,textarea', this._onChange.bind(this)) + html.on('click', `.${ECC_CLASS} .ecc-switch`, this._onToggle.bind(this)) + html.on('click', `.${ECC_CLASS} .submit`, this._onSubmit.bind(this)) + html.on('focusout', `.${ECC_CLASS} input`, this._onChange.bind(this)) + html.on('click', `.${ECC_CLASS} button`, this._onButton.bind(this)) + html.on('keydown', `.${ECC_CLASS} form`, this._onKey.bind(this)) + + // const visi = html.find('[data-ecc-visibility]') + // for (let i = 0; i < visi.length; i++) { + // const el = visi[i]; + // await this.setVisibility(el) + + // } + + html + .find('[data-ecc-visibility]') + .each(async (i, el) => await this.setVisibility(el)) + html + .find('[data-ecc-permissions]') + .each(async (i, el) => await this.setPermission(el)) + html.find(`.${ECC_CLASS} .ecc-switch`).each((i, el) => this.setState(el)) + html + .find(`.${ECC_CLASS} input[type="radio"]`) + .each((i, el) => this.setRadioState(el)) + // html.find(`.${ECC_CLASS} .ecc-radio-switch`).each( (i, el) => this.setState(el)) + } + + setState (element) { + if (!element) return + if (element.dataset.flag) { + element.classList.add( + this.flags[element.dataset.flag] ? STATE.ON : STATE.OFF + ) + } + if (element.dataset.name) { + const value = CoC7Utilities.getByPath(this, element.dataset.name) + element.classList.add(value ? STATE.ON : STATE.OFF) + } + } + + setRadioState (element) { + if (!element || !element.name) return + const splited = element.name.split('.') + if (splited[0].toLowerCase() !== 'data') return + if (this.data && typeof this.data[splited[1]] !== 'undefined') { + if (this.data[splited[1]] === element.value) { + element.checked = true + } + } + } + + async setVisibility (element) { + if (!element.dataset.eccVisibility) return + const canYouSee = await this.hasPerm(element.dataset.eccVisibility, true) + if (!canYouSee) element.style.display = 'none' + } + + async setPermission (element) { + if (!element.dataset.eccPermissions) return + const canYouMod = await this.hasPerm(element.dataset.eccPermissions) + if (!canYouMod) { + element.classList.add('ecc-restricted') + if ($(element).is('input')) { + if (element.type === 'range') $(element).attr('disabled', true) + else $(element).attr('readonly', true) + } + if ($(element).is('select')) $(element).attr('disabled', true) + } + } + + /** + * Check if the current user as permission against a string of allowed persons. + * If the string is empty permission are all granted + * @param {string} restrictedTo A string containing the set of player allowed. Value can be owner, gm, players, uuid separated by space + * @param {boolean} vision if true gm will be considered for permissions. false = gm has always right. true GM permission will be checked + * @returns + */ + async hasPerm (restrictedTo, vision = false) { + if (!restrictedTo.length) return true + let permissionsArray = restrictedTo.split(' ') + const whiteList = !permissionsArray.includes(PERMISSION_TYPE.BLACKLIST) + if (!whiteList) { + permissionsArray = permissionsArray.filter( + e => e !== PERMISSION_TYPE.BLACKLIST + ) + } + if (game.user.isGM) { + if (!vision) return true // GM can always modify everything ! Nah + if (permissionsArray.includes(PERMISSION_TYPE.GM)) { + return true && whiteList + } + if (permissionsArray.includes(PERMISSION_TYPE.NOT_GM)) { + return false || !whiteList + } + } + + permissionsArray = permissionsArray.filter(e => e !== PERMISSION_TYPE.GM) + permissionsArray = permissionsArray.filter( + e => e !== PERMISSION_TYPE.NOT_GM + ) + + // return false || !whiteList //If pass the filter return false unless it's a blacklist + // } else { + // permissionsArray = permissionsArray.filter(e => e != PERMISSION_TYPE.GM) + // } + + if (permissionsArray.includes(PERMISSION_TYPE.USER)) { + if (this.message.isAuthor) return true && whiteList // isAuthor vs user.isOwner ? + permissionsArray = permissionsArray.filter( + e => e !== PERMISSION_TYPE.USER + ) + } + + if (permissionsArray.includes(PERMISSION_TYPE.SPEAKER)) { + const speaker = this.message.data.speaker + if (speaker.token && speaker.scene) { + const actor = await fromUuid( + `Scene.${speaker.scene}.Token.${speaker.token}` + ) + if (actor) { + if (actor.isOwner) return true && whiteList + } + } else if (speaker.actor) { + const actor = game.actors.get(speaker.actor) + if (actor) { + if (actor.isOwner) return true && whiteList + } + } + // else if (speaker.user) { + // if (game.user.id == speaker.user) return true && whiteList + // } + permissionsArray = permissionsArray.filter( + e => e !== PERMISSION_TYPE.SPEAKER + ) + } + // All filter passed, array should contains only uuids or actor/token ids + if (permissionsArray.length) { + for (let i = 0; i < permissionsArray.length; i++) { + const uuid = permissionsArray[i] + let actor = await fromUuid(uuid) + if (!actor) actor = game.actors.get(uuid) + if (actor) { + return actor.isOwner + } else { + ui.notifications.error(`Unable to find actor ${uuid}`) + } + } + } + return false || !whiteList // If pass the filter return false unless it's a blacklist + } + + static async bindListeners (html) { + const htmlMessageElement = html[0] + const htmlCardElement = htmlMessageElement.querySelector(`.${ECC_CLASS}`) + if (!htmlCardElement) return + + const card = await EnhancedChatCard.fromHTMLCardElement(htmlCardElement) + if (!card) return + card.activateListeners(html) + } + + get flags () { + return this.data.flags + } + + /** + * Override to reassign object from the data structure. + * @returns + */ + async assignObjects () {} + + /** + * Override to update object after data change. + * This is called by the local client + * @returns + */ + async localCompute () {} + + /** + * Override to update object after data change. + * This is called by one of the GM clients. + * @returns + */ + async GMUpdate () {} + + async ExecuteGMUpdate () { + const newData = await game.enhancedChatCardsLib.socket.executeAsGM( + 'GMUpdate', + this.toObject(), + this._options, + this.constructor.name, + this.messageId + ) + + this.data = newData + await this.assignObjects() + } + + /** + * + * @param {*} event will check for an action (data-action) + * if a method with that name exist it will be triggered. + */ + async _onButton (event) { + event.preventDefault() + + const target = event.currentTarget + + target.style.display = 'none' // Avoid multiple push + const action = target.dataset.action + + let formUpdate + let actionUpdate = false + + // if ('submit' == target.type) { + // console.warn('Button is also a submit') + // } + + // Perform card update first + const card = target.closest(`.${ECC_CLASS}`) + if (card) formUpdate = this._update(card) + else { + console.error( + `Could not find a EEC class for this card: ${this.constructor.name}` + ) + } + + const originalDisplayStyle = target.style.display + + if (!action) { + console.warn('no action associated with this button') + if (!formUpdate) return // If the form was updated we still update the card + } + if (!this[action]) { + console.warn(`no ${action} action found for this card`) + if (!formUpdate) return // If the form was updated we still update the card + } + if (this[action]) { + actionUpdate = await this[action]({ event, updateCard: false }) + } + + if (formUpdate || actionUpdate) await this.updateChatCard() + else target.style.display = originalDisplayStyle + } + + /** + * + * @param {*} event + * @returns false if key is enter to avoid global submission + */ + _onKey (event) { + if (event.key === 'Enter') this._onSubmit(event) + return event.key !== 'Enter' + } + + _onChange (event) { + if (this.options.submitOnChange) { + return this._onSubmit(event) + } + } + + _onSubmit (event) { + const target = event.currentTarget + const tagName = target.tagName + if (tagName === 'BUTTON' && 'action' in target.dataset) return // + event.preventDefault() + + const card = target.closest(`.${ECC_CLASS}`) + if (!card) return + const updates = this._update(card) + if (updates) this.updateChatCard() + } + + /** + * Retrieve the form from the card and update the data structure + * @param {HTMLElement} card + * @returns + */ + _update (card) { + const forms = card.querySelectorAll('form') + let updates = false + for (let i = 0; i < forms.length; i++) { + const form = forms[i] + const fd = new FormDataExtended(form) + const data = fd.toObject() + // data = foundry.utils.diffObject( + // this.data, + // foundry.utils.expandObject(data) + // ) + for (const [key, value] of Object.entries(data)) { + const oldValue = CoC7Utilities.getByPath(this, key) + if (!(oldValue === value)) { + CoC7Utilities.setByPath(this, key, value) + updates = true + } + } + } + return updates + } + + get message () { + if (this._message) return this._message + if (this._messageId) return game.messages.get(this._messageId) + return undefined + } + + set message (x) { + this._message = x + } + + get messageId () { + if (this._messageId) return this._messageId + if (this._message) return this._message.id + return undefined + } + + set messageId (x) { + this._messageId = x + } + + static get defaultOptions () { + return { + attachObject: true, + classes: [ECC_CLASS], + exclude: [], + excludeStartWith: '_', + submitOnChange: true, + speaker: ChatMessage.getSpeaker(), + ooc: false, // * @param {boolean} [options.ooc=false] Use the speaker/getspeaker. if true use the user instead + compute: true, // * @param {boolean} [options.compute.local=true] invoque the compute method as local user => need to override localCompute + GMUpdate: false // * @param {boolean} [options.compute.GM=false] invoque the GMUpdate method as GM => need to override GMUpdate + } + } + + get objectDataString () { + const saveData = { + data: this.data, + options: this._options + } + return JSON.stringify(saveData, (key, value) => { + if (value === null) return undefined + if (this.options.exclude?.includes(key)) return undefined + if (key.startsWith(this.options.excludeStartWith)) return undefined + return value + }) + } + + get rollMode () { + if (!this._rollMode) this._rollMode = game.settings.get('core', 'rollMode') + return this._rollMode + } + + set rollMode (x) { + if (x === false) this._rollMode = game.settings.get('core', 'rollMode') + this._rollMode = x + } + + static async fromMessageId (messageId) { + const message = game.messages.get(messageId) + if (!message) return undefined + const card = await this.fromMessage(message) + card.messageId = messageId + return card + } + + static async fromMessage (message) { + const cardElement = $(message.data.content)[0] + if (!cardElement) return undefined + const card = await this.fromHTMLCardElement(cardElement) + card.message = message + return card + } + + static async fromHTMLCardElement (htmmlCard) { + if (!htmmlCard) return + if (!htmmlCard.dataset.eccClass) return + if (!htmmlCard.dataset.object) return + const cardData = JSON.parse(unescape(htmmlCard.dataset.object)) + const message = htmmlCard.closest('.message') + const messageId = message?.dataset?.messageId + + return await this.fromData( + cardData.data, + cardData.options, + htmmlCard.dataset.eccClass, + messageId + ) + } + + static async fromData (data, options, cardClassName, messageId = undefined) { + const CardClass = game.enhancedChatCardsLib.types.get(cardClassName) + + if (!CardClass) { + console.error(`Unknown chat card type: ${cardClassName}`) + return + } + const card = new CardClass(data, options) + if (messageId) card.messageId = messageId + await card.assignObjects() + return card + } + + setData (name) { + if (!name && !($.type(name) === 'string')) return + CoC7Utilities.setByPath(this, name, true) + } + + unsetData (name) { + if (!name && !($.type(name) === 'string')) return + CoC7Utilities.setByPath(this, name, false) + } + + toggleData (name) { + if (!name && !($.type(name) === 'string')) return + const value = CoC7Utilities.getByPath(this, name) + CoC7Utilities.setByPath(this, name, !value) + } + + async _onToggle (event) { + // const answer = await EnhancedChatCardLib.socket.executeAsGM('gm_onToggle', { + // event: event, + // card: this + // }) + event.preventDefault() + + const target = event.currentTarget + if ('action' in target.dataset) return this._onButton(event) + if ( + target && + target.classList.contains('gm-select-only') && + !game.user.isGM + ) { + return + } + const name = target.dataset.flag + ? `data.flags.${target.dataset.flag}` + : target.dataset.name + if (!name) return + const toggle = target.closest('.ecc-radio') + if (!toggle) { + this.toggleData(name) + } else { + const buttons = toggle.querySelectorAll('.ecc-switch') + for (const b of buttons) { + const bName = b.dataset.flag + ? `data.flags.${b.dataset.flag}` + : b.dataset.name + this.unsetData(bName) + } + this.setData(name) + } + const card = target.closest(`.${ECC_CLASS}`) + if (this.options.submitOnChange) { + if (card) this._update(card) + } + await this.updateChatCard() // Submit on change ? + } +} diff --git a/module/config.js b/module/config.js index d6d4beed..5d95db3c 100644 --- a/module/config.js +++ b/module/config.js @@ -138,7 +138,9 @@ COC7.status = { dead: 'dead' } +COC7.newBookName = 'CoC7.NewBookName' COC7.newSkillName = 'CoC7.NewSkillName' +COC7.newSpellName = 'CoC7.NewSpellName' COC7.newItemName = 'CoC7.NewItemName' COC7.newWeaponName = 'CoC7.NewWeaponName' @@ -153,28 +155,6 @@ COC7.firearmSpecializationName = 'CoC7.FirearmSpecializationName' COC7.combatCards = { fightBack: 'CoC7.FightBack', dodge: 'CoC7.Dodge', - maneuver: 'CoC7.Maneuver' + maneuver: 'CoC7.Maneuver', + noResponse: 'CoC7.NoResponse' } - -// COC7.dodge = { -// 'name': COC7.dodgeSkillName, -// 'type': 'skill', -// 'base': '1/2*@DEX', -// 'value': -1, -// 'data': { -// 'specialization': COC7.fightingSpecializationName }, -// 'properties': { -// 'special': true, -// 'rarity': false, -// 'push': false, -// 'combat': true, -// 'fighting': true, -// 'firearm': false -// }, -// 'flags': { 'wpnexcl': true} -// }; - -// COC7.PcSkills = { -// 'dodge' : COC7.dodge, -// 'throw' : {} -// }; diff --git a/module/dice.js b/module/dice.js index a12a435b..39b83f04 100644 --- a/module/dice.js +++ b/module/dice.js @@ -1,4 +1,4 @@ -/* global CONFIG, game, Roll */ +/* global ChatMessage, CONFIG, game, Roll */ export class CoC7Dice { static async roll (modif = 0, rollMode = null, hideDice = false) { @@ -10,13 +10,28 @@ export class CoC7Dice { alternativeDice = game.settings.get('CoC7', 'tenDieBonus') } } - const roll = await new Roll( - '1dt' + - ( - '+1dt' + (alternativeDice !== '' ? '[' + alternativeDice + ']' : '') - ).repeat(Math.abs(modif)) + - '+1d10' - ).roll({ async: true }) + let roll + if ( + game.CoC7.dev.dice.alwaysCrit && + game.settings.get('CoC7', 'hiddendevmenu') + ) { + roll = Roll.fromData(CoC7Dice.crit01) + } else if ( + game.CoC7.dev.dice.alwaysFumble && + game.settings.get('CoC7', 'hiddendevmenu') + ) { + roll = Roll.fromData(CoC7Dice.fumble99) + } else { + roll = await new Roll( + '1dt' + + (alternativeDice !== '' + ? '+1do[' + alternativeDice + ']' + : '+1dt' + ).repeat(Math.abs(modif)) + + '+1d10' + ).roll({ async: true }) + } + const result = { unit: { total: 0, @@ -27,27 +42,31 @@ export class CoC7Dice { results: [] }, total: 0, - roll: roll + roll } + if (rollMode) result.rollMode = rollMode if (hideDice) result.hideDice = hideDice - roll.dice.forEach(d => { + for (const d of roll.dice) { if (d instanceof CONFIG.Dice.terms.t) { result.tens.results.push(d.total) } else { result.unit.total = d.total === 10 ? 0 : d.total result.unit.results.push(result.unit.total) } - }) + } if (modif < 0) { - result.tens.total = Math.max(...result.tens.results) + result.tens.total = + result.unit.total === 0 && result.tens.results.includes(0) + ? 100 + : Math.max(...result.tens.results) + } else if (result.unit.total === 0) { + const dice = result.tens.results.filter(t => t > 0) + result.tens.total = dice.length === 0 ? 100 : Math.min(...dice) } else { result.tens.total = Math.min(...result.tens.results) } result.total = result.unit.total + result.tens.total - if (result.total === 0) { - result.total = 100 - } return result } @@ -55,7 +74,209 @@ export class CoC7Dice { if (game.modules.get('dice-so-nice')?.active) { const syncDice = game.settings.get('CoC7', 'syncDice3d') - await game.dice3d.showForRoll(roll, game.user, syncDice) + const chatData = { + whisper: null, + blind: false + } + ChatMessage.applyRollMode(chatData, game.settings.get('core', 'rollMode')) + + await game.dice3d.showForRoll( + roll, + game.user, + syncDice, + chatData.whisper, + chatData.blind + ) + } + } + + static async combinedRoll (options) { + options.pool = options.pool ?? {} + options.pool['0'] = false + const keys = Object.keys(options.pool).map(v => parseInt(v, 10)) + let penaltyDice = Math.abs(Math.min(0, Math.min(...keys))) + let bonusDice = Math.max(0, Math.max(...keys)) + const hasDSN = game.modules.get('dice-so-nice')?.active + + const pool = [] + pool.push('1dt+1d10') + + if (penaltyDice > 0) { + pool.push( + (hasDSN + ? '+1do[' + game.settings.get('CoC7', 'tenDiePenalty') + ']' + : '1dt' + ).repeat(Math.abs(penaltyDice)) + ) + } + if (bonusDice > 0) { + pool.push( + (hasDSN + ? '+1do[' + game.settings.get('CoC7', 'tenDieBonus') + ']' + : '1dt' + ).repeat(Math.abs(bonusDice)) + ) + } + const roll = await new Roll(pool.join('')).roll({ async: true }) + const result = { + groups: { + baseDie: 0, + penaltyDice: [], + bonusDice: [] + }, + unit: 0, + roll + } + let baseSet = false + for (const d of roll.dice) { + if (d instanceof CONFIG.Dice.terms.t) { + if (!baseSet) { + result.groups.baseDie = d.total + baseSet = true + } else if (penaltyDice > 0) { + result.groups.penaltyDice.push(d.total) + penaltyDice-- + } else { + result.groups.bonusDice.push(d.total) + bonusDice-- + } + } else { + result.unit = d.total === 10 ? 0 : d.total + } } + + const output = {} + + for (const key in options.pool) { + output[key] = { + unit: { + total: result.unit, + results: [result.unit] + }, + tens: { + total: 0, + results: [] + }, + total: 0, + roll + } + const modif = parseInt(key, 10) + let modifier = modif + output[key].tens.results.push(result.groups.baseDie) + for (const offset = Math.abs(modifier); modifier < 0; modifier++) { + output[key].tens.results.push( + result.groups.penaltyDice[modifier + offset] + ) + } + for (const offset = modifier; modifier > 0; modifier--) { + output[key].tens.results.push( + result.groups.bonusDice[Math.abs(modifier - offset)] + ) + } + if (modif < 0) { + output[key].tens.total = + output[key].unit.total === 0 && output[key].tens.results.includes(0) + ? 100 + : Math.max(...output[key].tens.results) + } else if (output[key].unit.total === 0) { + const dice = output[key].tens.results.filter(t => t > 0) + output[key].tens.total = dice.length === 0 ? 100 : Math.min(...dice) + } else { + output[key].tens.total = Math.min(...output[key].tens.results) + } + output[key].total = output[key].unit.total + output[key].tens.total + } + return output + } + + // Predetermined value of dice, used only for DEV and test purposes + static fumble99 = { + class: 'Roll', + options: {}, + dice: [], + formula: '1dt + 1d10', + terms: [ + { + class: 'CoC7DecaderDie', + options: {}, + evaluated: true, + number: 1, + faces: 10, + modifiers: [], + results: [ + { + result: 9, + active: true + } + ] + }, + { + class: 'OperatorTerm', + options: {}, + evaluated: true, + operator: '+' + }, + { + class: 'Die', + options: {}, + evaluated: true, + number: 1, + faces: 10, + modifiers: [], + results: [ + { + result: 9, + active: true + } + ] + } + ], + total: 99, + evaluated: true + } + + static crit01 = { + class: 'Roll', + options: {}, + dice: [], + formula: '1dt + 1d10', + terms: [ + { + class: 'CoC7DecaderDie', + options: {}, + evaluated: true, + number: 1, + faces: 10, + modifiers: [], + results: [ + { + result: 10, + active: true + } + ] + }, + { + class: 'OperatorTerm', + options: {}, + evaluated: true, + operator: '+' + }, + { + class: 'Die', + options: {}, + evaluated: true, + number: 1, + faces: 10, + modifiers: [], + results: [ + { + result: 1, + active: true + } + ] + } + ], + total: 1, + evaluated: true } } diff --git a/module/hooks/dice-so-nice-ready.js b/module/hooks/dice-so-nice-ready.js new file mode 100644 index 00000000..682c9d1f --- /dev/null +++ b/module/hooks/dice-so-nice-ready.js @@ -0,0 +1,20 @@ +/* global game, Hooks */ +import { CoC7DecaderDSNFaces } from '../apps/decader-dsn-faces.js' + +export function listen () { + Hooks.once('diceSoNiceReady', dice3d => { + dice3d.addDicePreset({ + type: 'dt', + labels: ['10', '20', '30', '40', '50', '60', '70', '80', '90', '00'], + fontScale: 0.75, + system: 'standard' + }) + dice3d.addDicePreset({ + type: 'do', + labels: ['10', '20', '30', '40', '50', '60', '70', '80', '90', '00'], + fontScale: 0.75, + system: 'standard' + }) + game.CoC7DecaderDSNFaces = new CoC7DecaderDSNFaces() + }) +} diff --git a/module/hooks/dice-so-nice-roll-start.js b/module/hooks/dice-so-nice-roll-start.js new file mode 100644 index 00000000..4e32e74f --- /dev/null +++ b/module/hooks/dice-so-nice-roll-start.js @@ -0,0 +1,6 @@ +/* global game, Hooks */ +export function listen () { + Hooks.on('diceSoNiceRollStart', dice3d => { + game.CoC7DecaderDSNFaces.setFaces() + }) +} diff --git a/module/hooks/drop-actor-sheet-data.js b/module/hooks/drop-actor-sheet-data.js new file mode 100644 index 00000000..0508fd50 --- /dev/null +++ b/module/hooks/drop-actor-sheet-data.js @@ -0,0 +1,32 @@ +/* global game */ +export function DropActorSheetData (actor, sheet, data) { + if (data.type === 'Item' && data.actorId) { + if (actor.data._id === data.actorId) { + return + } + let actorFrom = null + if (data.sceneId && data.tokenId) { + actorFrom = game.scenes.get(data.sceneId).tokens.get(data.tokenId).actor + } else { + actorFrom = game.actors.get(data.actorId) + } + switch (actor.data.type) { + case 'character': + case 'npc': + case 'creature': + if (!['chase'].includes(data.data.type)) { + return + } + break + case 'vehicle': + return + case 'container': + if (!['book', 'item', 'spell', 'weapon'].includes(data.data.type)) { + return + } + } + if (actorFrom) { + actorFrom.deleteEmbeddedDocuments('Item', [data.data._id]) + } + } +} diff --git a/module/hooks/index.js b/module/hooks/index.js index ede2faff..c73160d8 100644 --- a/module/hooks/index.js +++ b/module/hooks/index.js @@ -1,9 +1,13 @@ import * as Init from './init.js' +import * as DiceSoNiceReady from './dice-so-nice-ready.js' +import * as DiceSoNiceRollStart from './dice-so-nice-roll-start.js' import * as Ready from './ready.js' import * as RenderActorSheet from './render-actor-sheet.js' import * as RenderChatMessage from './render-chat-message.js' import * as RenderDialog from './render-dialog.js' import * as RenderItemSheet from './render-item-sheet.js' +import * as RenderPause from './render-pause.js' +import * as RenderSettingsConfig from './render-settings-config.js' export const CoC7Hooks = { listen () { @@ -13,5 +17,9 @@ export const CoC7Hooks = { RenderChatMessage.listen() RenderDialog.listen() RenderItemSheet.listen() + RenderPause.listen() + DiceSoNiceReady.listen() + DiceSoNiceRollStart.listen() + RenderSettingsConfig.listen() } } diff --git a/module/hooks/init.js b/module/hooks/init.js index c96a71bd..461e726b 100644 --- a/module/hooks/init.js +++ b/module/hooks/init.js @@ -1,9 +1,10 @@ /* global Hooks */ - import { configureDocuments } from '../scripts/configure-documents.js' import { preloadHandlebarsTemplates } from '../scripts/load-templates.js' import { registerSettings } from '../scripts/register-settings.js' import { registerSheets } from '../scripts/register-sheets.js' +import { handlebarsHelper } from '../scripts/handlebars-helper.js' +import { compendiumFilter } from '../scripts/compendium-filter.js' export function listen () { Hooks.once('init', async () => { @@ -11,5 +12,7 @@ export function listen () { preloadHandlebarsTemplates() registerSettings() registerSheets() + handlebarsHelper() + compendiumFilter() }) } diff --git a/module/hooks/ready.js b/module/hooks/ready.js index afb231bb..1292a561 100644 --- a/module/hooks/ready.js +++ b/module/hooks/ready.js @@ -1,7 +1,31 @@ -/* global Hooks */ +/* global game, Hooks, isNewerVersion */ +import { CoC7Tooltips } from '../apps/tooltips.js' +// import { CoC7WelcomeMessage } from '../apps/welcome-message.js' +import { registerTours } from '../scripts/register-tours.js' export function listen () { Hooks.once('ready', async () => { console.log('Call of Cthulhu 7th Edition | Ready') + if (game.settings.get('CoC7', 'showWelcomeMessage') && game.user.isGM) { + /** This will prompt the welcome message when it is finished */ + // await CoC7WelcomeMessage.create() + } + game.CoC7Tooltips = new CoC7Tooltips() + + const instructionsVersion = game.settings.get('CoC7', 'showInstructions') + if (isNewerVersion(game.system.data.version, instructionsVersion ?? '0')) { + let lang = game.i18n.lang + const readMe = { + en: 'wZtTHpGV3atKV2oD' + } + if (typeof readMe[lang] === 'undefined') { + lang = 'en' + } + (await game.packs.get('CoC7.system-doc').getDocument(readMe[lang])).sheet.render(true) + game.settings.set('CoC7', 'showInstructions', game.system.data.version) + } + if (typeof game.tours !== 'undefined') { + registerTours() + } }) } diff --git a/module/hooks/render-actor-sheet.js b/module/hooks/render-actor-sheet.js index d81eefd1..b5976546 100644 --- a/module/hooks/render-actor-sheet.js +++ b/module/hooks/render-actor-sheet.js @@ -1,12 +1,5 @@ -/* global Hooks, ui */ +/* global Hooks */ export function listen () { - Hooks.on('renderActorSheet', async (data, html, options) => { - console.log(data) - if (data.document.type === 'vehicle') { - ui.notifications.warn('This feature is a work in progress and its use is still not recommended.') - await data.close() - await data.close() - } - }) + Hooks.on('renderActorSheet', async (data, html, options) => {}) } diff --git a/module/hooks/render-dialog.js b/module/hooks/render-dialog.js index d3340fcb..5d86eda1 100644 --- a/module/hooks/render-dialog.js +++ b/module/hooks/render-dialog.js @@ -1,17 +1,22 @@ /* global game, Hooks */ - export function listen () { Hooks.on('renderDialog', (dialog, html) => { const form = html.find('form') - if (form.is('#entity-create') && form.find('select').length !== 0) { + if (form.is('#document-create') && form.find('select').length !== 0) { const entityCreateSelectTag = form.find("[name='type']") const entitySortedList = [] + const showExperimental = !!game.settings.get( + 'CoC7', + 'experimentalFeatures' + ) entityCreateSelectTag.children().each((o, entityOption) => { const key = entityOption.textContent?.capitalize() if (game.i18n.has(`CoC7.Entities.${key}`)) { entityOption.textContent = game.i18n.localize(`CoC7.Entities.${key}`) } - entitySortedList.push(entityOption) + if (showExperimental || !['vehicle'].includes(entityOption.value)) { + entitySortedList.push(entityOption) + } }) entityCreateSelectTag.empty() entityCreateSelectTag.append( diff --git a/module/hooks/render-item-sheet.js b/module/hooks/render-item-sheet.js index 0f7223a4..6e3470da 100644 --- a/module/hooks/render-item-sheet.js +++ b/module/hooks/render-item-sheet.js @@ -1,12 +1,5 @@ -/* global Hooks, ui */ +/* global Hooks */ export function listen () { - Hooks.on('renderItemSheet', async (data, html, options) => { - console.log(data) - if (data.document.type === 'chase') { - ui.notifications.warn('This feature is a work in progress and its use is still not recommended.') - await data.close() - await data.close() - } - }) + Hooks.on('renderItemSheet', async (data, html, options) => {}) } diff --git a/module/hooks/render-pause.js b/module/hooks/render-pause.js new file mode 100644 index 00000000..a65333c9 --- /dev/null +++ b/module/hooks/render-pause.js @@ -0,0 +1,18 @@ +/* global game, Hooks */ + +export function listen () { + Hooks.on('renderPause', async (data, html, options) => { + if (game.settings.get('CoC7', 'overrideGameArtwork')) { + if (game.settings.get('CoC7', 'artPauseImage').toLowerCase() === 'null') { + html.find('img').remove() + } + if (game.settings.get('CoC7', 'artPauseImage') !== '') { + html.find('img').attr('src', game.settings.get('CoC7', 'artPauseImage')) + } + + if (game.settings.get('CoC7', 'artPauseText') !== '') { + html.find('h3').html(game.settings.get('CoC7', 'artPauseText')) + } + } + }) +} diff --git a/module/hooks/render-settings-config.js b/module/hooks/render-settings-config.js new file mode 100644 index 00000000..843b39ae --- /dev/null +++ b/module/hooks/render-settings-config.js @@ -0,0 +1,8 @@ +/* global Hooks */ +import { CoC7DirectoryPicker } from '../scripts/coc7-directory-picker.js' + +export function listen () { + Hooks.on('renderSettingsConfig', (app, html, user) => { + CoC7DirectoryPicker.processHtml(html) + }) +} diff --git a/module/hooks/socket.js b/module/hooks/socket.js new file mode 100644 index 00000000..b8a6e033 --- /dev/null +++ b/module/hooks/socket.js @@ -0,0 +1,41 @@ +/* global game, socketlib, ui */ +import { CoC7MeleeTarget } from '../chat/combat/melee-target.js' + +export function CoC7Socket () { + game.CoC7socket = socketlib.registerSystem('CoC7') + game.CoC7socket.register('gmcreatemessageas', gmcreatemessageas) + game.CoC7socket.register('gmtradeitemto', gmtradeitemto) +} + +async function gmcreatemessageas (data) { + const meleeTarget = new CoC7MeleeTarget( + data.targetKey, + data.messageId, + data.fastForward + ) + meleeTarget.initiatorKey = data.actorKey + const message = await meleeTarget.createChatCard() + return message +} + +async function gmtradeitemto (data) { + try { + let actor + if (data.scene) { + actor = game.scenes.get(data.scene).tokens.get(data.actorFrom).actor + } else { + actor = game.actors.get(data.actorFrom) + } + const item = actor.items.get(data.item) + const created = await game.actors + .get(data.actorTo) + .createEmbeddedDocuments('Item', [item.toJSON()]) + if (created) { + actor.deleteEmbeddedDocuments('Item', [item.id]) + } + } catch (e) { + ui.notifications.error(e) + return false + } + return true +} diff --git a/module/items/book/data.js b/module/items/book/data.js index 8d2e55b2..e49581a7 100644 --- a/module/items/book/data.js +++ b/module/items/book/data.js @@ -3,6 +3,7 @@ import { SanCheckCard } from '../../chat/cards/san-check.js' import { CoC7Check } from '../../check.js' import { CoC7Item } from '../item.js' +import { CoC7Spell } from '../spell/data.js' export class CoC7Book extends CoC7Item { constructor (data, context) { @@ -37,12 +38,22 @@ export class CoC7Book extends CoC7Item { const collection = this.data.data.spells ? duplicate(this.data.data.spells) : [] - spells.forEach(async spell => { + for (const spell of spells) { collection.push(spell) - }) + } return await this.update({ 'data.spells': collection }) } + async spellDetail (index) { + const isKeeper = game.user.isGM + const data = this.data.data.spells[index] + const parent = this.actor ? this.actor : null + const spell = new CoC7Spell(data, { parent, bookId: this.id }) + if (isKeeper || spell.data.data.learned) { + return await spell.sheet.render(true) + } + } + /** * Handles all the logic involving the attempt of initial reading * @returns {Promise} @see listen @see grantInitialReading @@ -230,7 +241,7 @@ export class CoC7Book extends CoC7Item { }) } if (other.type) { - other.gains.forEach(async skill => { + for (const skill of other.gains) { const pattern = skill.name.match(/^(.+) \((.+)\)$/) /** Sanitization to deal with specializations */ if (pattern) { @@ -249,7 +260,7 @@ export class CoC7Book extends CoC7Item { specialization: skill.specialization }) } - }) + } } await this.grantSkillDevelopment(developments) if ((mythos.type || occult.type) && this.data.data.sanityLoss) { @@ -259,10 +270,47 @@ export class CoC7Book extends CoC7Item { return await this.update({ 'data.initialReading': true }) } - async grantSpellLearning () { - return ui.notifications.warn( - 'Automation of learning spells from books is not currently supported and will be added in future updates.' - ) + /** + * + * @param {Item} spelllearned The spell that was learned successfully from book + * @returns + */ + async grantSpellLearning (spelllearned) { + for (const spell of this.data.data.spells) { + if (spell._id === spelllearned._id) { + spell.data.learned = true + // Does the actor already has a spell of that name? Then do not add the spell + const existingSpell = await this.actor.items.find( + item => + item.data.type === 'spell' && item.data.name === spelllearned.name + ) + if (!existingSpell) { + spelllearned.data.learned = true + } else { + ui.notifications.warn( + game.i18n.format('CoC7.SpellAlreadyLearned', { + spell: spelllearned.name, + book: this.name + }) + ) + } + break + } + } + // Save spell list of book + await this.update({ 'data.spells': this.data.data.spells }) + // Add learned spell to actor + if (spelllearned.data.learned) { + ui.notifications.info( + game.i18n.format('CoC7.SpellSuccessfullyLearned', { + spell: spelllearned.name, + book: this.name + }) + ) + await this.actor.createEmbeddedDocuments('Item', [ + duplicate(spelllearned) + ]) + } } /** @@ -389,7 +437,7 @@ export class CoC7Book extends CoC7Item { )}` } } - const template = 'systems/CoC7/templates/items/book/development.hbs' + const template = 'systems/CoC7/templates/items/book/development.html' const html = await renderTemplate(template, { developments }) return await ChatMessage.create({ user: game.user.id, @@ -426,6 +474,7 @@ export class CoC7Book extends CoC7Item { spell: spell.name }) check.context = 'SPELL_LEARNING' + check.spell = spell await check.rollCharacteristic('int') await check.toMessage() } @@ -434,12 +483,13 @@ export class CoC7Book extends CoC7Item { /** Listen to changes on the check card */ async updateRoll (roll) { const check = CoC7Check.fromRollString(roll) + /** Will know if user push the roll or spend Luck */ if (check.passed) { if (check.context === 'INITIAL_READING') { return await this.grantInitialReading() } else if (check.context === 'SPELL_LEARNING') { - return await this.grantSpellLearning() + return await this.grantSpellLearning(check.spell) } } } diff --git a/module/items/book/sheet.js b/module/items/book/sheet.js index acfcc645..3cba9551 100644 --- a/module/items/book/sheet.js +++ b/module/items/book/sheet.js @@ -4,7 +4,7 @@ import { CoC7Utilities } from '../../utilities.js' export class CoC7BookSheet extends ItemSheet { static get defaultOptions () { return mergeObject(super.defaultOptions, { - template: 'systems/CoC7/templates/items/book/main.hbs', + template: 'systems/CoC7/templates/items/book/main.html', classes: ['coc7', 'item', 'book'], width: 500, height: 'auto', @@ -27,11 +27,14 @@ export class CoC7BookSheet extends ItemSheet { data.data = itemData.data data.initialReading = this.item.data.data.initialReading data.isKeeper = game.user.isGM - data.isOwned = this.item.isOwned + data.isOwner = this.item.isOwner data.spellsLearned = this.spellsLearned - data.exhausted = await this.item.checkExhaustion() !== false + data.exhausted = (await this.item.checkExhaustion()) !== false data.studyCompleted = this.item.data.data.study.progress === this.item.data.data.study.necessary + + data.spellListEmpty = data.data.spells.length === 0 + return data } @@ -51,10 +54,10 @@ export class CoC7BookSheet extends ItemSheet { this.item.attemptInitialReading() }) html.find('.delete-spell').click(event => this._onDelete(event)) + html.find('.edit-spell').click(event => this._onSpellDetail(event)) + html.find('.spell-name').click(event => this._onSpellDetail(event)) html.find('.teach-spell').click(event => { - const id = $(event.currentTarget) - .parents('li') - .data('id') + const id = $(event.currentTarget).parents('li').data('id') this.item.attemptSpellLearning(id) }) html.find('[name="data.study.necessary"]').change(event => { @@ -82,6 +85,14 @@ export class CoC7BookSheet extends ItemSheet { html.find('.option').click(event => this.modifyType(event)) } + async _onSpellDetail (event) { + event.preventDefault() + const element = $(event.currentTarget) + /** @see data-index property on template */ + const index = element.parents('li').data('index') + return await this.item.spellDetail(index) + } + /** * It is called every time the user delete a spell on the sheet * @param {jQuery} event @see activateListeners @@ -115,10 +126,14 @@ export class CoC7BookSheet extends ItemSheet { const dataList = await CoC7Utilities.getDataFromDropEvent(event, 'Item') const spells = [] - dataList.forEach(async item => { - if (!item || !(item.data.type === 'spell')) return - spells.push(item.data) - }) + for (const item of dataList) { + if (!item || !['skill', 'spell'].includes(item.data.type)) continue + if (item.data.type === 'spell') { + spells.push(item.data) + } else if (item.data.type === 'skill' && this.item.data.data.type.other) { + this.modifyOthersGains(null, 'add', { name: item.name }) + } + } await this.item.addSpells(spells) } @@ -143,13 +158,17 @@ export class CoC7BookSheet extends ItemSheet { * @param {string} mode 'add' || 'change' || 'remove' * @returns {Promise} update to Item document */ - async modifyOthersGains (event, mode) { + async modifyOthersGains (event, mode, options = {}) { /** No need to check if user is GM because only they can see details tab */ - event.preventDefault() - const element = $(event.currentTarget) - /** @see data-index property on template */ - const index = element.parents('tr').data('index') - /** Always has to be @type {Array} */ + let index = null + let element = null + if (event) { + event.preventDefault() + element = $(event.currentTarget) + /** @see data-index property on template */ + index = element.parents('tr').data('index') + /** Always has to be @type {Array} */ + } const skills = this.item.data.data.gains.others ? duplicate(this.item.data.data.gains.others) : [] @@ -158,7 +177,7 @@ export class CoC7BookSheet extends ItemSheet { /** User clicked on plus icon to add a new skill on other gains table */ skills.push({ /** new skill */ - name: game.i18n.localize('CoC7.NewSkillName'), + name: options.name || game.i18n.localize('CoC7.NewSkillName'), /** development by default, value can also be 1d6 or 1d10 */ value: 'development' }) diff --git a/module/items/chase/data.js b/module/items/chase/data.js new file mode 100644 index 00000000..8777c9ca --- /dev/null +++ b/module/items/chase/data.js @@ -0,0 +1,1638 @@ +/* global $, Dialog, foundry, game, mergeObject, NormalizedRectangle, Token, TokenDocument, ui */ +import { CoCActor } from '../../actors/actor.js' +import { ChaseObstacleCard } from '../../chat/cards/chase-obstacle.js' +import { CoC7Check } from '../../check.js' +import { CoC7Utilities } from '../../utilities.js' +import { CoC7Item } from '../item.js' +import { _participant, sortByRoleAndDex } from './participant.js' + +export class CoC7Chase extends CoC7Item { + constructor (data, context) { + if (typeof data.img === 'undefined') { + data.img = 'systems/CoC7/assets/icons/running-solid.svg' + } + super(data, context) + this.context = context + } + + // Handle participants + get participants () { + const pList = [] + const preys = this.data.data.participants + .filter(p => !p.chaser) + .map(p => { + return new _participant(p) + }) + const chasers = this.data.data.participants + .filter(p => p.chaser) + .map(p => { + return new _participant(p) + }) + this.data.data.participants.forEach(p => { + // p.index = pList.length - 1 + p.assist = [] + if (p.chaser) { + p.assist = chasers + .filter(c => c.uuid !== p.uuid && !c.hasMaxBonusDice) + .map(c => { + return { uuid: c.uuid, name: c.name } + }) + } else { + p.assist = preys + .filter(c => c.uuid !== p.uuid && !c.hasMaxBonusDice) + .map(c => { + return { uuid: c.uuid, name: c.name } + }) + } + const particpant = new _participant(p) + // particpant.location = this.getParticipantLocation( particpant.uuid) // Recursivity + pList.push(particpant) + }) + return pList + } + + get participantsObject () { + const participants = this.participants + participants.forEach(p => { + p.location = this.getParticipantLocation(p.uuid) + }) + return participants + } + + get activeParticipantData () { + return this.data.data.participants.find(p => p.active) + } + + get activeActor () { + const p = this.activeParticipantData + if (!p) return undefined + if (p.docUuid) { + return CoC7Utilities.getActorFromKey(p.docUuid) + } + return undefined + } + + get participantsByAdjustedMov () { + const pList = this.actualParticipants.sort( + (a, b) => a.adjustedMov - b.adjustedMov + ) + pList.forEach(p => { + p.location = this.getParticipantLocation(p.uuid) + }) + return pList + } + + get participantsByInitiative () { + const pList = this.actualParticipants.sort( + (a, b) => b.initiative - a.initiative + ) + pList.forEach(p => { + p.location = this.getParticipantLocation(p.uuid) + }) + return pList + } + + get preys () { + return this.participants.filter(p => !p.isChaser && p.isValid) || [] + } + + get chasers () { + return this.participants.filter(p => p.isChaser && p.isValid) || [] + } + + get allHaveValidMov () { + return this.participants.every(e => e.hasValidMov) + } + + get allHaveSpeedRoll () { + return this.participants.every(p => p.speedCheck?.rolled) + } + + getParticipantLocation (participantUuid) { + if (!this.data.data.locations?.list?.length) { + return undefined + } + if (!this.started) return undefined + const locations = this.locations + + const location = locations.find(l => { + const lp = l.participants?.find(p => participantUuid === p.uuid) + return !!lp + }) + if (location) { + return location + } + return undefined + } + + getParticipantData (participantUuid) { + const participant = this.data.data.participants.find( + p => participantUuid === p.uuid + ) + if (participant) return foundry.utils.duplicate(participant) // TODO : check if we need to duplicate + return undefined + } + + getParticipant (participantUuid) { + const participantData = this.getParticipantData(participantUuid) + if (participantData) return new _participant(participantData) + return undefined + } + + get nextActiveParticipant () { + if (!this.started) return undefined + return this.participantsByInitiative.find( + p => p.data.currentMovementActions > 0 + ) + } + + get slowestPrey () { + const preys = this.participants + .sort((a, b) => a.adjustedMov - b.adjustedMov) + ?.filter(p => p.isPrey) + if (preys.length > 0) return preys[0] + return undefined + } + + get fastestChaser () { + const chasers = this.participants + .sort((a, b) => a.adjustedMov - b.adjustedMov) + ?.filter(p => p.isChaser) + if (chasers.length > 0) return chasers.slice(-1).pop() + return undefined + } + + get actualParticipants () { + const slowestPrey = this.slowestPrey + const fastestChaser = this.fastestChaser + let pList = this.participants + if (!this.data.data.includeLatecomers && slowestPrey) { + pList = pList.filter(p => { + return ( + p.isPrey || (p.isChaser && p.adjustedMov >= slowestPrey.adjustedMov) + ) + }) + } + + if (!this.data.data.includeEscaped && fastestChaser) { + pList = pList.filter(p => { + return ( + p.isChaser || (p.isPrey && p.adjustedMov <= fastestChaser.adjustedMov) + ) + }) + } + + return pList + } + + get slowestParticipant () { + const pList = this.participantsByAdjustedMov + if (pList.length > 0) return pList[0] + return undefined + } + + async updateParticipants (list, { render = true } = {}) { + const participantsData = this.cleanParticipantList(list) + return await this.update( + { 'data.participants': participantsData }, + { render } + ) + } + + async updateParticipant (particiantUuid, updateData, { render = true } = {}) { + const participants = foundry.utils.duplicate(this.data.data.participants) + const update = foundry.utils.duplicate(updateData) + const participantIndex = participants.findIndex( + p => particiantUuid === p.uuid + ) + if (participantIndex === -1) return undefined + if (update.uuid) delete update.uuid + foundry.utils.mergeObject(participants[participantIndex], update, { + overwrite: true + }) + await this.updateParticipants(participants, { render }) + } + + cleanParticipantList (list) { + const participantsData = + list || foundry.utils.duplicate(this.data.data.participants) + list.forEach(p => { + let data + if (p.constructor.name === '_participant') { + data = p.data + } else data = p + const index = this.findIndex(participantsData, data.uuid) + if (index === -1) { + participantsData.push(data) + ui.notifications.warn(game.i18n.localize('CoC7.ParticipantDataMissing')) + } else { + participantsData[index] = data + } + }) + return participantsData + } + + async assistParticipant ( + assistantUuid, + beneficiaryUuid, + { useMovementActions = true, render = true } = {} + ) { + const assistant = this.getParticipant(assistantUuid) + const beneficiary = this.getParticipant(beneficiaryUuid) + const participantsData = foundry.utils.duplicate( + this.data.data.participants + ) + const assistantIndex = participantsData.findIndex( + p => assistantUuid === p.uuid + ) + const beneficiaryIndex = participantsData.findIndex( + p => beneficiaryUuid === p.uuid + ) + + if (!assistant || !beneficiary) { + ui.notifications.error(game.i18n.localize('CoC7.ParticipantNotFound')) + return undefined + } + + if (beneficiary.hasMaxBonusDice) { + ui.notifications.error( + game.i18n.format('CoC7.ErrorBeneficiaryAtMaxBonus', { + name: beneficiary.name + }) + ) + return undefined + } + + if (useMovementActions) { + if (assistant.currentMovementActions < 1) { + ui.notifications.error( + game.i18n.format('CoC7.ParticipantNotEnoughMovement', { + assistantUuid, + actions: assistant.currentMovementActions + }) + ) + return undefined + } + assistant.alterMovementActions(-1) + participantsData[assistantIndex] = foundry.utils.duplicate(assistant.data) + } + + beneficiary.addBonusDice() + participantsData[beneficiaryIndex] = foundry.utils.duplicate( + beneficiary.data + ) + await this.update( + { 'data.participants': participantsData }, + { render } + ) + } + + async toggleBonusDice (participantUuid, diceNumber, { render = true } = {}) { + const participant = this.getParticipant(participantUuid) + + if (!participant) { + ui.notifications.error( + game.i18n.format('CoC7.ParticipantUuidNotFound', { + participantUuid + }) + ) + return undefined + } + + const participantsData = foundry.utils.duplicate( + this.data.data.participants + ) + const participantIndex = participantsData.findIndex( + p => participantUuid === p.uuid + ) + if (participant.bonusDice >= diceNumber) participant.removeBonusDice() + else participant.addBonusDice() + participantsData[participantIndex] = foundry.utils.duplicate( + participant.data + ) + await this.update( + { 'data.participants': participantsData }, + { render } + ) + } + + async cautiousApproach ( + participantUuid, + { useMovementActions = true, render = true } = {} + ) { + const participant = this.getParticipant(participantUuid) + + if (!participant) { + ui.notifications.error( + game.i18n.format('CoC7.ParticipantUuidNotFound', { + participantUuid + }) + ) + return undefined + } + + const participantsData = foundry.utils.duplicate( + this.data.data.participants + ) + const participantIndex = participantsData.findIndex( + p => participantUuid === p.uuid + ) + if (participant.hasMaxBonusDice) { + ui.notifications.error( + game.i18n.format('CoC7.ErrorParticipantAtMaxBonus', { + participantUuid + }) + ) + return + } + if (useMovementActions) { + if (participant.currentMovementActions < 1) { + ui.notifications.error( + game.i18n.format('CoC7.ParticipantNotEnoughMovement', { + assistantUuid: participantUuid, + actions: participant.currentMovementActions + }) + ) + return undefined + } + participant.alterMovementActions(-1) + } + participant.addBonusDice() + participantsData[participantIndex] = foundry.utils.duplicate( + participant.data + ) + await this.update( + { 'data.participants': participantsData }, + { render } + ) + } + + async alterParticipantMovementAction ( + participantUuid, + count, + { render = true } = {} + ) { + const participant = this.getParticipant(participantUuid) + + if (!participant) { + ui.notifications.error( + game.i18n.format('CoC7.ParticipantUuidNotFound', { + participantUuid + }) + ) + return undefined + } + + const participantsData = foundry.utils.duplicate( + this.data.data.participants + ) + const participantIndex = participantsData.findIndex( + p => participantUuid === p.uuid + ) + + participant.alterMovementActions(count) + + participantsData[participantIndex] = foundry.utils.duplicate( + participant.data + ) + await this.update( + { 'data.participants': participantsData }, + { render } + ) + } + + async activateNextParticipantTurn ({ + scrollToLocation = true, + activateLocation = true, + render = true, + html = null + } = {}) { + const activeParticipant = this.nextActiveParticipant + const options = { + scrollToLocation, + activateLocation, + render, + html + } + if (!activeParticipant) return this.activateParticipant(undefined, options) + return this.activateParticipant(activeParticipant.uuid, options) + } + + async activateParticipant ( + participantUuid, + { + scrollToLocation = true, + activateLocation = true, + render = true, + html = null + } = {} + ) { + const dataUpdate = this.getActivateParticipantUpdateData(participantUuid, { + scrollToLocation, + activeLocation: activateLocation, + html + }) + await this.update(dataUpdate, { render }) + } + + getActivateParticipantUpdateData ( + participantUuid, + { scrollToLocation = true, activateLocation = true, html = null } = {} + ) { + const pUuid = participantUuid + // ? participantUuid + // : this.participantsByInitiative[0]?.uuid + const participantsDataUpdate = {} + const participants = this.data.data.participants + ? foundry.utils.duplicate(this.data.data.participants) + : [] + participants.forEach(p => { + delete p.active + if (pUuid && pUuid === p.uuid) p.active = true + }) + participantsDataUpdate['data.participants'] = participants + + const participantLocation = this.getParticipantLocation(pUuid) + let locationsDataUpdate = null + if (participantLocation) { + if (activateLocation) { + locationsDataUpdate = this.getActivateLocationUpdateData( + participantLocation.uuid, + { scrollToLocation, html } + ) + } else if (scrollToLocation) { + locationsDataUpdate = {} + locationsDataUpdate['data.scroll.chaseTrack.from'] = + this.chaseTrackCurrentScrollPosition + locationsDataUpdate['data.scroll.chaseTrack.to'] = + this.getChaseTrackLocationScrollPosition(participantLocation.uuid, { + html + }) + } + } else { + locationsDataUpdate = this.getActivateLocationUpdateData(undefined, { + scrollToLocation + }) + } + + if (locationsDataUpdate) { + return foundry.utils.mergeObject( + participantsDataUpdate, + locationsDataUpdate + ) + } else return participantsDataUpdate + } + + activeParticipantObstacleCheck ( + locationUuid, + { moveParticipant = true } = {} + ) { + const card = new ChaseObstacleCard({ + chaseUuid: this.uuid, + locationUuid, + moveParticipant, + forward: locationUuid !== this.activeLocation.uuid + }) + card.toMessage() + + // const test = new testCard() + // test.initialize({}) + // test.toMessage() + } + + // Handle rounds + + async progressToNextRound ({ render = true } = {}) { + const participants = this.data.data.participants + ? foundry.utils.duplicate(this.data.data.participants) + : [] + participants.forEach(p => { + if (p.currentMovementActions < p.movementAction) { + p.currentMovementActions += p.movementAction + if (p.currentMovementActions > p.movementAction) { + p.currentMovementActions = p.movementAction + } + } + }) + await this.updateParticipants(participants, { render: false }) + this.activateNextParticipantTurn({ render }) + } + + /** @override */ + async updateRoll (rollString) { + if (game.user.isGM) { + const roll = CoC7Check.fromRollString(rollString) + const participants = this.data.data.participants + ? foundry.utils.duplicate(this.data.data.participants) + : [] + const index = participants.findIndex(p => p.rollUuid === roll.uuid) + if (index >= 0) { + participants[index].speedCheck.rollDataString = roll.JSONRollString + await this.update({ 'data.participants': participants }) + } + } else { + const data = { + data: rollString, + type: 'invoke', + method: 'updateRoll', + item: this.uuid + } + game.socket.emit('system.CoC7', data) + } + } + + // handle locations + get locations () { + const locations = this.started + ? this.data.data.locations.list + ? foundry.utils.duplicate(this.data.data.locations.list) + : [] + : this.initTrack + this.processLocations(locations) + return locations + } + + getLocationData (locationUuid, { duplicateData = true } = {}) { + const locations = duplicateData + ? foundry.utils.duplicate(this.locations) + : this.locations + return locations.find(l => locationUuid === l.uuid) + } + + processLocations (locations) { + if (!locations?.length) return + locations[0].first = true + + for (let index = 0; index < locations.length; index++) { + const classes = [] + const location = locations[index] + if (!location.name) classes.push('empty') + if (location.active) classes.push('active') + if (location.init && !this.started) classes.push('init') + location.cssClasses = classes.join(' ') + } + + if (locations.length > 1) locations[locations.length - 1].last = true + + locations.forEach(l => { + if (l.participants && l.participants.length) { + l.participants = l.participants.filter(p => !(p === null)) + for (let i = 0; i < l.participants.length; i++) { + const elem = l.participants[i] // Init track = only uuid, update location list change for uuid + + // ui.notifications.error(`Type : ${typeof elem}`) + let p + if (typeof elem === 'string' || elem instanceof String) { + p = this.data.data.participants.find(p => elem === p.uuid) // Retrieve participant data from list. + } else if (elem?.constructor?.name === '_participant') { + p = undefined // participant is already processed. + ui.notifications.warn( + game.i18n.localize('CoC7.ParticipantAlreadyProcessed') + ) + } else p = undefined + + if (typeof p !== 'undefined') { + l.participants[i] = new _participant(p) // replace uuid with _participant + } else { + // participants.push( null) + console.error( + 'Undefined paticipant while processing participants array' + ) + } + } + l.participants.sort(sortByRoleAndDex) // TODO : test if sorting works + } + }) + } + + get initTrack () { + if ( + !this.data.data.locations.list || + this.data.data.locations.list.length === 0 + ) { + return undefined + } + + const locations = [] // !!!!!!! locations vs init locations !!! + + const init = this.startingLine + let locationsIndexStart, initIndexStart, locationsLength + if (init.length <= 0) locationsIndexStart = 0 + else if (this.data.data.startingIndex >= init.length) { + locationsIndexStart = 0 + } else locationsIndexStart = init.length - this.data.data.startingIndex + + if (this.data.data.startingIndex <= 0) initIndexStart = 0 + else if (this.data.data.startingIndex <= init.length) initIndexStart = 0 + else initIndexStart = this.data.data.startingIndex - init.length + + if (locationsIndexStart === 0) { + locationsLength = this.data.data.locations.list.length + } else { + locationsLength = + this.data.data.locations.list.length + locationsIndexStart + } + + if (init.length !== 0) { + if (this.data.data.startingIndex < 0) { + for ( + let index = 0; + index < Math.abs(this.data.data.startingIndex); + index++ + ) { + init.push({ + uuid: this.generateNewUuid(), + init: true, + participants: [] + }) + } + } + } + + const chaseLocations = foundry.utils.duplicate(this.data.data.locations) + for (let index = 0; index < locationsLength; index++) { + let location = {} + const participants = [] + if ( + index >= locationsIndexStart && + index - locationsIndexStart < chaseLocations.list.length + ) { + location = foundry.utils.duplicate( + chaseLocations.list[index - locationsIndexStart] + ) + location.init = false + location.participants?.forEach(p => { + if (p != null) participants.push(p) + }) + } + if (index >= initIndexStart && index - initIndexStart < init.length) { + mergeObject(location, init[index - initIndexStart], { + overwrite: false + }) + + init[index - initIndexStart].participants?.forEach(p => { + if (p != null) participants.push(p) + }) + + location.participants = participants + } + location.first = false + location.end = false + locations.push(location) + } + + return locations + } + + get startingLine () { + // Get preys and check for escaped + const preys = this.data.data.includeEscaped + ? this.preys + : this.preys?.filter(p => !p.data.escaped) + // Get chasers + const chasers = this.data.data.includeLatecomers + ? this.chasers + : this.chasers?.filter(c => !c.data.excluded) + + // Recursivity !! with getParticipantLocation and get participants + + // If no prey or no chasser + // if (0 == chasers.length) { + // ui.notifications.warn('No chasers') + // return undefined + // } + // if (0 == preys.length) { + // ui.notifications.warn('No preys') + // return undefined + // } + + // Build starting track + const chaseTrack = [] + + const chasersMinMov = this.findMinMov(chasers) + const chasersMaxMov = this.findMaxMov(chasers) + const preysMinMov = this.findMinMov(preys) + const preysMaxMov = this.findMaxMov(preys) + + if (chasersMinMov !== -1 && chasersMaxMov !== -1) { + // Add chasers to the track. + for (let mov = chasersMinMov; mov <= chasersMaxMov; mov++) { + // Find all with that mov + const location = { + uuid: this.generateNewUuid(), + init: true, + participants: [] + } + const locationParticipantsList = chasers + .filter(p => mov === p.adjustedMov) + .sort((a, b) => a.dex - b.dex) + locationParticipantsList.forEach(p => + location.participants.push(p.uuid) + ) + chaseTrack.push(location) + } + + // Add space between chasers and preys. + for (let index = 0; index < this.data.data.startingRange; index++) { + chaseTrack.push({ + uuid: this.generateNewUuid(), + init: true, + participants: [] + }) + } + } + + if (preysMinMov !== -1 && preysMaxMov !== -1) { + // Add preys to the track. + for (let mov = preysMinMov; mov <= preysMaxMov; mov++) { + // Find all with that mov + const location = { + uuid: this.generateNewUuid(), + init: true, + participants: [] + } + const locationParticipantsList = preys + .filter(p => mov === p.adjustedMov) + .sort((a, b) => a.dex - b.dex) + locationParticipantsList.forEach(p => + location.participants.push(p.uuid) + ) + chaseTrack.push(location) + } + } + + return chaseTrack + } + + async updateLocationsList (list, { render = true } = {}) { + // Remove all unnecessary items (cssClass, ) + const updatedList = this.cleanLocationsList(list) + await this.update( + { 'data.locations.list': updatedList }, + { render } + ) + } + + async updateLocation (locationUuid, updateData, { render = true } = {}) { + const locations = foundry.utils.duplicate(this.data.data.locations.list) + const update = foundry.utils.duplicate(updateData) + const locationIndex = locations.findIndex(l => locationUuid === l.uuid) + if (locationIndex === -1) return undefined + if (update.uuid) delete update.uuid + foundry.utils.mergeObject(locations[locationIndex], update, { + overwrite: true + }) + await this.updateLocationsList(locations, { render }) + } + + cleanLocationsList (list) { + const updatedList = foundry.utils.duplicate(list) + const partipantsUuidArray = this.data.data.participants.map(p => p.uuid) + + updatedList.forEach(l => { + // delete l.active + delete l.cssClasses + delete l.first + delete l.last + delete l.end + if (l.participants && l.participants.length) { + for (let i = 0; i < l.participants.length; i++) { + l.participants = l.participants.filter(p => !(p === null)) // Remove null elements + // Replace _Participants by uuid + if (l.participants[i].data?.uuid) { + l.participants[i] = l.participants[i].data.uuid + } + } + + // Remove unkown particicpants + l.participants = l.participants.filter(uuid => + partipantsUuidArray.includes(uuid) + ) + } + }) + + return updatedList + } + + async insertLocation ( + insertAtUuid, + { shift = 0, locData = {}, render = true } = {} + ) { + const locations = foundry.utils.duplicate(this.data.data.locations.list) + locations.forEach(l => { + delete l.active + }) + const locationIndex = locations.findIndex(l => insertAtUuid === l.uuid) + if (locationIndex === -1) { + return false + } + const newLocationIndex = locationIndex + shift + if (newLocationIndex > locations.length) return false + const newLocation = foundry.utils.duplicate(locData) + newLocation.uuid = this.generateNewUuid() + newLocation.init = locations[locationIndex].init + newLocation.active = true + locations.splice(newLocationIndex, 0, newLocation) + return await this.updateLocationsList(locations, { render }) + } + + async removeLocation (uuid, { render = true } = {}) { + const locations = foundry.utils.duplicate(this.data.data.locations.list) + const locationIndex = locations.findIndex(l => uuid === l.uuid) + locations.splice(locationIndex, 1) + locations.forEach(l => { + delete l.active + }) + if (locations.length > 0) { + let index = locationIndex - 1 + if (index < 0) index = 0 + locations[index].active = true + } + return await this.updateLocationsList(locations, { render }) + } + + async activateLocation ( + locationUuid, + { scrollToLocation = true, render = true } = {} + ) { + const updateData = this.getActivateLocationUpdateData(locationUuid, { + scrollToLocation + }) + await this.update(updateData, { render }) + } + + getClearActiveLocationUpdateData ({ + scrollToLocation = true, + html = null + } = {}) { + const updateData = {} + const locations = this.data.data.locations.list + ? foundry.utils.duplicate(this.data.data.locations.list) + : [] + locations.forEach(l => { + delete l.active + }) + updateData['data.locations.list'] = this.cleanLocationsList(locations) + + if (scrollToLocation) { + updateData['data.scroll.chaseTrack.from'] = 0 + updateData['data.scroll.chaseTrack.to'] = -1 + } + return updateData + } + + getActivateLocationUpdateData ( + locationUuid, + { scrollToLocation = true, html = null } = {} + ) { + if (!locationUuid) { + return this.getClearActiveLocationUpdateData({ + scrollToLocation + }) + } + const updateData = {} + const locations = this.data.data.locations.list + ? foundry.utils.duplicate(this.data.data.locations.list) + : [] + locations.forEach(l => { + delete l.active + if (locationUuid === l.uuid) l.active = true + }) + updateData['data.locations.list'] = this.cleanLocationsList(locations) + // await this.updateLocationsList(locations, { render: false }) + if (scrollToLocation) { + updateData['data.scroll.chaseTrack.from'] = + this.chaseTrackCurrentScrollPosition + updateData['data.scroll.chaseTrack.to'] = + this.getChaseTrackLocationScrollPosition(locationUuid, { html }) + // await this.setchaseTrackScroll({ + // from: this.chaseTrackCurrentScrollPosition, + // to: this.chaseTrackActiveLocationScrollPosition + // }) + } + return updateData + } + + // Locations navigation + get activeLocation () { + if (!this.locations) return undefined + const location = this.locations.find(l => l.active) + if (!location) return undefined + if (location.participants?.length) location.hasParticipant = true + const actor = this.activeActor + if (actor) { + const test = actor.find(location.obstacleDetails?.checkName) + if (test) { + location.activeActorHasSkill = true + location.activeActorTest = test + } + } + return location + } + + get previousLocation () { + if (!this.locations) return undefined + const activeIndex = this.locations.findIndex(l => l.active) + if (activeIndex === -1) return undefined + if (activeIndex === 0) return undefined + const location = this.locations[activeIndex - 1] + const actor = this.activeActor + if (actor) { + const test = actor.find(location.obstacleDetails?.checkName) + if (test) { + location.activeActorHasSkill = true + location.activeActorTest = test + } + } + return location + } + + get nextLocation () { + if (!this.locations) return undefined + const activeIndex = this.locations.findIndex(l => l.active) + if (activeIndex === -1) return undefined + if (activeIndex === this.locations.length - 1) return undefined + const location = this.locations[activeIndex + 1] + const actor = this.activeActor + if (actor) { + const test = actor.find(location.obstacleDetails?.checkName) + if (test) { + location.activeActorHasSkill = true + location.activeActorTest = test + } + } + return location + } + + async locatorDropped (data) { + await this.setLocationCoordinates( + data.locationUuid, + data.x, + data.y, + data.scene + ) + } + + async setLocationCoordinates ( + locationUuid, + x, + y, + sceneId, + { render = true } = {} + ) { + const locations = foundry.utils.duplicate(this.data.data.locations.list) + const locationIndex = locations.findIndex(l => locationUuid === l.uuid) + locations[locationIndex].coordinates = { x, y, scene: sceneId } + + return await this.updateLocationsList(locations, { render }) + } + + async clearActiveLocationCoordinates ({ render = true } = {}) { + if (this.activeLocation) { + return await this.clearLocationCoordinates(this.activeLocation.uuid, { + render + }) + } + } + + async clearLocationCoordinates (locationUuid, { render = true } = {}) { + const locations = foundry.utils.duplicate(this.data.data.locations.list) + const locationIndex = locations.findIndex(l => locationUuid === l.uuid) + delete locations[locationIndex].coordinates + + return await this.updateLocationsList(locations, { render }) + } + + // get activeParticipantHaveActiveLocationSkill (){ + // if( !this.activeActor) return false + // if( this.activeActor.find( this.activeLocation.obstacleDetails?.checkName)) return true + // return false + // } + + // Handle mechanics + async cutToTheChase () { + if (!this.allHaveSpeedRoll) { + ui.notifications.warn(game.i18n.localize('CoC7.NotAllHaveSpeedRoll')) + return + } + if (this.actualParticipants?.length < 2) { + ui.notifications.warn(game.i18n.localize('CoC7.NeedMin2Participants')) + return + } + if (this.allHaveValidMov) { + // TODO : Check for speed roll ?? + + // Calculate movement actions + const participants = this.participants + const minMov = this.findMinMov(this.actualParticipants) + participants.forEach(p => { + // p.data.movementAction = 1 + (p.adjustedMov - minMov) + p.calculateMovementActions(minMov) + p.currentMovementActions = p.movementAction + p.bonusDice = 0 + }) + await this.updateParticipants(participants, { render: false }) + await this.updateLocationsList(this.locations, { render: false }) + await this.start() + } + } + + async restart () { + // await this.cleanLocations() //Transferred in updateLocationList + const locations = this.locations.filter(l => !l.init) + for (let i = 0; i < locations.length; i++) { + if (locations[i].participants) locations[i].participants = [] + if (locations[i].active) delete locations[i].active + } + const participantsData = this.data.data.participants + ? foundry.utils.duplicate(this.data.data.participants) + : [] + for (let i = 0; i < participantsData.length; i++) { + if (participantsData[i].active) delete participantsData[i].active + } + await this.setchaseTrackScroll(0, 0, { render: false }) + await this.updateLocationsList(locations, { render: false }) + await this.updateParticipants(participantsData, { render: false }) + await this.stop() + } + + getLocationShift (locationUuid, { skip = 1 } = {}) { + const locations = foundry.utils.duplicate(this.data.data.locations.list) + const originIndex = locations.findIndex(l => locationUuid === l.uuid) + const destinationIndex = originIndex + skip + if (locations.length === 0) return null + if (destinationIndex >= locations.length) { + return locations[locations.length - 1] + } + if (destinationIndex < 0) return locations[0] + return locations[destinationIndex] // ERROR MOVE 2 FOR SKIP +1 + } + + async removeParticipant (participantUuid, { render = true } = {}) { + const p = this.getParticipant(participantUuid) + await Dialog.confirm({ + title: game.i18n.localize('CoC7.RemoveParticipant'), + content: `

                                                        ${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 = $(`
                                                        ${chatData.value}
                                                        `) const props = $('
                                                        ') - // chatData.properties.forEach(p => props.append(`${p}`)); + // for (const p of chatData.properties) { props.append(`${p}`) } div.append(props) li.append(div.hide()) div.slideDown(200) @@ -76,9 +76,7 @@ export class CoC7ArchetypeSheet extends ItemSheet { } async _onItemDelete (event, collectionName = 'items') { - const itemIndex = $(event.currentTarget) - .parents('.item') - .data('item-id') + const itemIndex = $(event.currentTarget).parents('.item').data('item-id') if (itemIndex) await this.removeItem(itemIndex, collectionName) } @@ -147,18 +145,11 @@ export class CoC7ArchetypeSheet extends ItemSheet { } data.skillListEmpty = data.data.skills.length === 0 - data.data.skills.forEach(skill => { - // For each skill if it's a spec and spac name not included in the name add it - if ( - skill.data.specialization && - !skill.name.includes(skill.data.specialization) - ) { - skill.displayName = `${skill.data.specialization} (${skill.name})` - } else skill.displayName = skill.name - }) data.data.skills.sort((a, b) => { - return a.displayName.localeCompare(b.displayName) + return a.name + .toLocaleLowerCase() + .localeCompare(b.name.toLocaleLowerCase()) }) data.coreCharacteristicsString = '' @@ -170,15 +161,17 @@ export class CoC7ArchetypeSheet extends ItemSheet { data.itemProperties = [] data.itemProperties.push( - `${game.i18n.localize('CoC7.PulpTalents')}: ${data.data.bonusPoints}` + `${game.i18n.localize('CoC7.PulpTalents')}: ${data.data.talents}` ) data.itemProperties.push( - `${game.i18n.localize('CoC7.BonusPoints')}: ${data.data.talents}` + `${game.i18n.localize('CoC7.BonusPoints')}: ${data.data.bonusPoints}` ) // for (let [key, value] of Object.entries(data.data.type)) { // if( value) data.itemProperties.push( COC7.occupationProperties[key]?COC7.occupationProperties[key]:null); // } + + data.isKeeper = game.user.isGM return data } diff --git a/module/items/sheets/chase.js b/module/items/sheets/chase.js deleted file mode 100644 index db792a32..00000000 --- a/module/items/sheets/chase.js +++ /dev/null @@ -1,747 +0,0 @@ -/* global DragDrop, duplicate, expandObject, flattenObject, FormDataExtended, game, getType, ItemSheet, mergeObject */ - -import { CoC7Chat } from '../../chat.js' -import { chatHelper } from '../../chat/helper.js' -import { CoC7Check } from '../../check.js' - -export class CoC7ChaseSheet extends ItemSheet { - // constructor( ...args) { - // super( ...args); - // } - - /** - * 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 */ - getData (options = {}) { - const data = super.getData(options) - - /** MODIF: 0.8.x **/ - const itemData = data.data - data.data = itemData.data // MODIF: 0.8.x data.data - /*****************/ - - data.participants = [] - this.participants.forEach(p => { - data.participants.push(new _participant(p)) - }) - data.preys = data.participants - .filter(p => p.chaser) - .sort((a, b) => a.mov - b.mov) - data.chasers = data.participants - .filter(p => !p.chaser) - .sort((a, b) => a.mov - b.mov) - - return data - } - - get participants () { - return this.item.data.data.participants - } - - /** @override */ - activateListeners (html) { - super.activateListeners(html) - - html.on('dblclick', '.open-actor', CoC7Chat._onOpenActor.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)) - - 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]) - } - - /* -------------------------------------------- */ - /* 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) - - if (data.data.participants) { - const participants = duplicate(this.participants) - // Handle participants array - for (const [k, v] of Object.entries(data.data.participants)) { - const index = Number(k) - const original = participants[Number(index)] - const cleaned = clean(v) - mergeObject(original, cleaned) - participants[index] = original - } - - data.data.participants = participants - } - // 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 (override) { - const [, type, sIndex, subType, data] = target.name.split('.') - const index = Number(sIndex) - 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) - } - - async _onDropParticipant (event) { - const target = event.currentTarget - const index = target.dataset?.index - if (!index) return - const dataString = event.dataTransfer.getData('text/plain') - const data = JSON.parse(dataString) - await this.alterParticipant(data, Number(index)) - } - - async _onAddParticipant (event) { - let data = {} - if (event.dataTransfer) { - const dataString = event.dataTransfer.getData('text/plain') - data = JSON.parse(dataString) - } - await this.addParticipant(data) - } - - async _onRollParticipant (event) { - const target = event.currentTarget - const participantElement = target.closest('.participant') - const index = participantElement.dataset.index - 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) - roll.toMessage() - participant.data.speedCheck.rollDataString = roll.JSONRollString - } else if (participant.speedCheck.isSkill) { - roll.skill = participant.speedCheck.ref - await roll.roll() - roll.toMessage() - participant.data.speedCheck.rollDataString = roll.JSONRollString - } else if (participant.speedCheck.isAttribute) { - await roll.rollAttribute(participant.speedCheck.ref.key) - 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() - roll.toMessage() - participant.data.speedCheck.rollDataString = roll.JSONRollString - participant.data.rolled = true - participant.data.rollUuid = roll.uuid - } - - await this.item.update({ 'data.participants': participants }) - } - - async _onDragEnterParticipant (event) { - const target = event.currentTarget - target.classList.add('drag-over') - } - - async _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 index = participant.dataset.index - 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 index = driver.dataset.index - const participants = this.item.data.data.participants - ? duplicate(this.item.data.data.participants) - : [] - const participant = participants[index] - delete participant.actorKey - await this.item.update({ 'data.participants': participants }) - } - - async _onDeleteParticipant (event) { - const target = event.currentTarget - const participant = target.closest('.participant') - const index = participant.dataset.index - 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 index = participant.dataset.index - 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, index) { - const actorKey = - data.sceneId && data.tokenId - ? `${data.sceneId}.${data.tokenId}` - : data.type === 'Actor' - ? data.id - : data.actorId || data.actorKey - const participant = {} - const actor = chatHelper.getActorFromKey(actorKey) - if (actor) { - if (actor.data.type === 'vehicle') participant.vehicleKey = actorKey - else participant.actorKey = actorKey - } - - 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 - } - - const participants = this.item.data.data.participants - ? duplicate(this.item.data.data.participants) - : [] - const oldParticipant = participants[index] - if (oldParticipant.mov) delete oldParticipant.mov - mergeObject(oldParticipant, participant) - await this.item.update({ 'data.participants': participants }) - } - - async addParticipant (data) { - const actorKey = - data.sceneId && data.tokenId - ? `${data.sceneId}.${data.tokenId}` - : data.actorId || data.actorKey || data.id - const participant = {} - const actor = chatHelper.getActorFromKey(actorKey) - if (actor) { - if (actor.data.type === 'vehicle') participant.vehicleKey = actorKey - else participant.actorKey = actorKey - } - - // const participant = { - // actorKey : (data.sceneId && data.tokenId)?`${data.sceneId}.${data.tokenId}`:data.actorId||data.actorKey||data.id - // }; - // const actor = chatHelper.getActorFromKey( participant.actorKey); - // if( !actor) delete participant.actorKey; - - 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 - } - - const participants = this.item.data.data.participants - ? duplicate(this.item.data.data.participants) - : [] - participants.push(participant) - await this.item.update({ 'data.participants': participants }) - } - - async updateRoll (rollString) { - if (game.user.isGM) { - const roll = CoC7Check.fromRollString(rollString) - const participants = this.item.data.data.participants - ? duplicate(this.item.data.data.participants) - : [] - const index = participants.findIndex(p => p.rollUuid === roll.uuid) - if (index >= 0) { - participants[index].speedCheck.rollDataString = roll.JSONRollString - await this.item.update({ 'data.participants': participants }) - } - } else { - const data = { - data: rollString, - type: 'invoke', - method: 'updateRoll', - item: this.item.uuid - } - game.socket.emit('system.CoC7', data) - } - } -} - -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 -} - -export class _participant { - constructor (data = {}) { - this.data = data - } - - get actor () { - if (!this._actor) { - this._actor = chatHelper.getActorFromKey(this.data.actorKey) - } - return this._actor - } - - get isActor () { - return this.hasActor || this.hasVehicle - } - - 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 = chatHelper.getActorFromKey(this.data.actorKey) - } - 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 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 = undefined - } - } - - return this.data.dex - } - - get isChaser () { - return !!this.data.chaser - } - - 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; - // }); - // } - - 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 = [] - ;['con'].forEach(c => { - const characterisitc = this.actor.getCharacteristic(c) - if (characterisitc?.value) check.options.push(characterisitc.label) - }) - - this.actor.driveSkills.forEach(s => { - check.options.push(s.name) - }) - - this.actor.pilotSkills.forEach(s => { - 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 - } - } - } - - if (!check.rolled && !check.score) check.cssClasses += ' invalid' - - return check - } -} diff --git a/module/items/sheets/item-sheet.js b/module/items/sheets/item-sheet.js index 35dcb047..b818fbe0 100644 --- a/module/items/sheets/item-sheet.js +++ b/module/items/sheets/item-sheet.js @@ -13,7 +13,7 @@ export class CoC7ItemSheet extends CoC7ItemSheetV2 { static get defaultOptions () { return mergeObject(super.defaultOptions, { width: 520, - height: 480 + height: 506 }) } } diff --git a/module/items/sheets/item-sheetV2.js b/module/items/sheets/item-sheetV2.js index 212f6854..f846e7a2 100644 --- a/module/items/sheets/item-sheetV2.js +++ b/module/items/sheets/item-sheetV2.js @@ -1,4 +1,4 @@ -/* global ItemSheet, mergeObject */ +/* global game, ItemSheet, mergeObject */ import { COC7 } from '../../config.js' @@ -19,12 +19,13 @@ export class CoC7ItemSheetV2 extends ItemSheet { return mergeObject(super.defaultOptions, { classes: ['coc7', 'sheetV2', 'item'], width: 290, - height: 300, + height: 326, + scrollY: ['.tab.description'], tabs: [ { - navSelector: '.sheet-tabs', + navSelector: '.sheet-navigation', contentSelector: '.sheet-body', - initial: 'skills' + initial: 'description' } ] }) @@ -80,6 +81,8 @@ export class CoC7ItemSheetV2 extends ItemSheet { !this.item.data.data.properties.firearm && !this.item.data.data.properties.fighting } + + data.isKeeper = game.user.isGM return data } @@ -101,8 +104,8 @@ export class CoC7ItemSheetV2 extends ItemSheet { async _onClickToggle (event) { event.preventDefault() - const propertyId = event.currentTarget.closest('.toggle-switch').dataset - .property + const propertyId = + event.currentTarget.closest('.toggle-switch').dataset.property await this.item.toggleProperty( propertyId, event.metaKey || diff --git a/module/items/sheets/occupation.js b/module/items/sheets/occupation.js index b1aa6d13..219ab1e6 100644 --- a/module/items/sheets/occupation.js +++ b/module/items/sheets/occupation.js @@ -39,9 +39,8 @@ export class CoC7OccupationSheet extends ItemSheet { event.preventDefault() event.stopPropagation() - const optionalSkill = event?.currentTarget?.classList?.contains( - 'optional-skills' - ) + const optionalSkill = + event?.currentTarget?.classList?.contains('optional-skills') const ol = event?.currentTarget?.closest('ol') const index = ol?.dataset?.group @@ -54,20 +53,20 @@ export class CoC7OccupationSheet extends ItemSheet { ? duplicate(this.item.data.data.groups) : [] - 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 (optionalSkill) { if (!CoC7Item.isAnySpec(item)) { // Generic specialization can be included many times if (collection.find(el => el.name === item.data.name)) { - return // If skill is already in main don't add it + continue // If skill is already in main don't add it } if (groups[index].skills.find(el => el.name === item.name)) { - return // If skill is already in group don't add it + continue // If skill is already in group don't add it } } @@ -76,7 +75,7 @@ export class CoC7OccupationSheet extends ItemSheet { if (!CoC7Item.isAnySpec(item)) { // Generic specialization can be included many times if (collection.find(el => el.name === item.data.name)) { - return + continue } for (let i = 0; i < groups.length; i++) { @@ -91,7 +90,7 @@ export class CoC7OccupationSheet extends ItemSheet { } collection.push(duplicate(item.data)) } - }) + } await this.item.update({ 'data.groups': groups }) await this.item.update({ [`data.${collectionName}`]: collection }) } @@ -133,7 +132,7 @@ export class CoC7OccupationSheet extends ItemSheet { } else { const div = $(`
                                                        ${chatData.value}
                                                        `) const props = $('
                                                        ') - // chatData.properties.forEach(p => props.append(`${p}`)); + // for (const p of chatData.properties) { props.append(`${p}`) } div.append(props) li.append(div.hide()) div.slideDown(200) @@ -142,9 +141,7 @@ export class CoC7OccupationSheet extends ItemSheet { } async _onItemDelete (event, collectionName = 'items') { - const itemIndex = $(event.currentTarget) - .parents('.item') - .data('item-id') + const itemIndex = $(event.currentTarget).parents('.item').data('item-id') if (itemIndex) await this.removeItem(itemIndex, collectionName) } @@ -231,35 +228,21 @@ export class CoC7OccupationSheet extends ItemSheet { } data.skillListEmpty = data.data.skills.length === 0 - data.data.skills.forEach(skill => { - // For each skill if it's a spec and spac name not included in the name add it - if ( - skill.data.specialization && - !skill.name.includes(skill.data.specialization) - ) { - skill.displayName = `${skill.data.specialization} (${skill.name})` - } else skill.displayName = skill.name - }) data.data.skills.sort((a, b) => { - return a.displayName.localeCompare(b.displayName) + return a.name + .toLocaleLowerCase() + .localeCompare(b.name.toLocaleLowerCase()) }) for (let index = 0; index < data.data.groups.length; index++) { data.data.groups[index].isEmpty = data.data.groups[index].skills.length === 0 - data.data.groups[index].skills.forEach(skill => { - // For each skill of each sub group if it's a spec and spac name not included in the name add it - if ( - skill.data.specialization && - !skill.name.includes(skill.data.specialization) - ) { - skill.displayName = `${skill.data.specialization} (${skill.name})` - } else skill.displayName = skill.name - }) data.data.groups[index].skills.sort((a, b) => { - return a.displayName.localeCompare(b.displayName) + return a.name + .toLocaleLowerCase() + .localeCompare(b.name.toLocaleLowerCase()) }) } @@ -282,6 +265,8 @@ export class CoC7OccupationSheet extends ItemSheet { ) } } + + data.isKeeper = game.user.isGM return data } diff --git a/module/items/sheets/setup.js b/module/items/sheets/setup.js index 3518232f..f2961a68 100644 --- a/module/items/sheets/setup.js +++ b/module/items/sheets/setup.js @@ -25,6 +25,7 @@ export class CoC7SetupSheet extends ItemSheet { html.find('.item-delete').click(event => this._onItemDelete(event, 'items')) html.find('.add-bio').click(async () => await this._onAddBio()) html.find('.remove-section').click(this._onRemoveSection.bind(this)) + html.find('.toggle-switch').click(this._onClickToggle.bind(this)) // html.find('.item-edit').click(async ev => { // const li = $(ev.currentTarget).parents('.item'); @@ -36,6 +37,19 @@ export class CoC7SetupSheet extends ItemSheet { // }); } + async _onClickToggle (event) { + event.preventDefault() + const propertyId = + event.currentTarget.closest('.toggle-switch').dataset.property + await this.item.toggleProperty( + propertyId, + event.metaKey || + event.ctrlKey || + event.keyCode === 91 || + event.keyCode === 224 + ) + } + async _onDrop (event, collectionName = 'items') { event.preventDefault() event.stopPropagation() @@ -45,22 +59,22 @@ export class CoC7SetupSheet 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 ( !['item', 'weapon', 'skill', 'book', 'spell'].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 }) } @@ -95,7 +109,7 @@ export class CoC7SetupSheet extends ItemSheet { } else { const div = $(`
                                                        ${chatData.value}
                                                        `) const props = $('
                                                        ') - // chatData.properties.forEach(p => props.append(`${p}`)); + // for (const p of chatData.properties) { props.append(`${p}`) } div.append(props) li.append(div.hide()) div.slideDown(200) @@ -104,9 +118,7 @@ export class CoC7SetupSheet extends ItemSheet { } async _onItemDelete (event, collectionName = 'items') { - const itemIndex = $(event.currentTarget) - .parents('.item') - .data('item-id') + const itemIndex = $(event.currentTarget).parents('.item').data('item-id') if (itemIndex) await this.removeItem(itemIndex, collectionName) } @@ -177,37 +189,29 @@ export class CoC7SetupSheet extends ItemSheet { data.otherItems = data.data.items.filter(it => it.type !== 'skill') data.skillListEmpty = data.skills.length === 0 - data.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 - }) + data.itemsListEmpty = data.otherItems.length === 0 data.skills.sort((a, b) => { - return a.displayName.localeCompare(b.displayName) + return a.name + .toLocaleLowerCase() + .localeCompare(b.name.toLocaleLowerCase()) }) data.eras = {} data.itemProperties = [] + data._eras = [] for (const [key, value] of Object.entries(COC7.eras)) { - if (!data.data.eras[key]) { - data.data.eras[key] = {} - data.data.eras[key].selected = false - } - data.data.eras[key].name = game.i18n.localize(value) - data.data.eras[key].internalName = value - } - - for (const entry of Object.entries(data.data.eras)) { - if (entry[1].selected) data.itemProperties.push(entry[1].name) + const era = {} + era.id = key + era.name = value + era.isEnabled = this.item.data.data.eras[key] === true + data._eras.push(era) } data.oneBlockBackStory = game.settings.get('CoC7', 'oneBlockBackstory') + data.isKeeper = game.user.isGM return data } @@ -229,8 +233,8 @@ export class CoC7SetupSheet extends ItemSheet { } if (event.currentTarget?.name === 'data.characteristics.rolls.enabled') { - formData.data.characteristics.points.enabled = !event.currentTarget - .checked + formData.data.characteristics.points.enabled = + !event.currentTarget.checked } super._updateObject(event, formData) diff --git a/module/items/sheets/skill.js b/module/items/sheets/skill.js index 319b89ab..8b54c2b7 100644 --- a/module/items/sheets/skill.js +++ b/module/items/sheets/skill.js @@ -1,5 +1,6 @@ -/* global ItemSheet, mergeObject */ +/* global game, ItemSheet, mergeObject */ +import CoC7ActiveEffect from '../../active-effect.js' import { COC7 } from '../../config.js' /** @@ -20,11 +21,12 @@ export class CoC7SkillSheet extends ItemSheet { classes: ['coc7', 'sheet', 'item'], width: 520, height: 480, + scrollY: ['.tab.description'], tabs: [ { - navSelector: '.sheet-tabs', + navSelector: '.sheet-navigation', contentSelector: '.sheet-body', - initial: 'skills' + initial: 'description' } ] }) @@ -56,6 +58,10 @@ export class CoC7SkillSheet extends ItemSheet { data.hasOwner = this.item.actor !== null + data.effects = CoC7ActiveEffect.prepareActiveEffectCategories( + this.item.effects + ) + if (this.item.data.type === 'skill') { data._properties = [] for (const [key, value] of Object.entries(COC7.skillProperties)) { @@ -80,6 +86,8 @@ export class CoC7SkillSheet extends ItemSheet { !this.item.data.data.properties.firearm && !this.item.data.data.properties.fighting } + + data.isKeeper = game.user.isGM return data } @@ -101,8 +109,8 @@ export class CoC7SkillSheet extends ItemSheet { async _onClickToggle (event) { event.preventDefault() - const propertyId = event.currentTarget.closest('.toggle-switch').dataset - .property + const propertyId = + event.currentTarget.closest('.toggle-switch').dataset.property await this.item.toggleProperty( propertyId, event.metaKey || @@ -170,4 +178,17 @@ export class CoC7SkillSheet extends ItemSheet { // // Update the Item // return this.object.update(formData); // } + + async _updateObject (event, formData) { + const skillName = + formData['data.skillName'] || this.item.data.data.skillName + if (this.item.data.data.properties?.special) { + const specialization = + formData['data.specialization'] || this.item.data.data.specialization + formData.name = specialization + ' (' + skillName + ')' + } else { + formData.name = skillName + } + return super._updateObject(event, formData) + } } diff --git a/module/items/sheets/spell.js b/module/items/sheets/spell.js index d1e2c7cb..52d04142 100644 --- a/module/items/sheets/spell.js +++ b/module/items/sheets/spell.js @@ -83,6 +83,8 @@ export class CoC7SpellSheet extends ItemSheet { ) } } + + data.isKeeper = game.user.isGM return data } } diff --git a/module/items/sheets/status.js b/module/items/sheets/status.js index 60fcb9c4..d9bec42a 100644 --- a/module/items/sheets/status.js +++ b/module/items/sheets/status.js @@ -1,4 +1,4 @@ -/* global ItemSheet, mergeObject */ +/* global game, ItemSheet, mergeObject */ import { COC7 } from '../../config.js' // import { CoCActor } from '../../actors/actor.js'; @@ -54,6 +54,8 @@ export class CoC7StatusSheet extends ItemSheet { ) } } + + data.isKeeper = game.user.isGM return data } } diff --git a/module/items/sheets/talent.js b/module/items/sheets/talent.js index 51fb3287..e4fef894 100644 --- a/module/items/sheets/talent.js +++ b/module/items/sheets/talent.js @@ -1,4 +1,4 @@ -/* global ItemSheet, mergeObject */ +/* global game, ItemSheet, mergeObject */ import { COC7 } from '../../config.js' // import { CoCActor } from '../../actors/actor.js'; @@ -54,6 +54,8 @@ export class CoC7TalentSheet extends ItemSheet { ) } } + + data.isKeeper = game.user.isGM return data } } diff --git a/module/items/sheets/weapon-sheet.js b/module/items/sheets/weapon-sheet.js index b6eddb28..a60c3c75 100644 --- a/module/items/sheets/weapon-sheet.js +++ b/module/items/sheets/weapon-sheet.js @@ -62,20 +62,9 @@ export class CoC7WeaponSheet extends ItemSheet { }) data.combatSkill.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()) }) } @@ -105,6 +94,7 @@ export class CoC7WeaponSheet extends ItemSheet { this.item.data.data.properties.brst === true || this.item.data.data.properties.thrown === true + data.isKeeper = game.user.isGM return data } @@ -129,23 +119,21 @@ export class CoC7WeaponSheet extends ItemSheet { */ async _onClickToggle (event) { event.preventDefault() - const propertyId = event.currentTarget.closest('.toggle-switch').dataset - .property - const set = event.currentTarget.parentElement.dataset.set - const elementName = set + '-' + propertyId - const checkboxControl = this.form.elements.namedItem(elementName) - - if (checkboxControl.checked) checkboxControl.checked = false - else checkboxControl.checked = true - - event.target.classList.toggle('switched-on') - await this._onSubmit(event) + const propertyId = + event.currentTarget.closest('.toggle-switch').dataset.property + await this.item.toggleProperty( + propertyId, + event.metaKey || + event.ctrlKey || + event.keyCode === 91 || + event.keyCode === 224 + ) } async _onPropertyClick (event) { event.preventDefault() - const property = event.currentTarget.closest('.weapon-property').dataset - .property + const property = + event.currentTarget.closest('.weapon-property').dataset.property const weaponId = event.currentTarget.closest('.weapon').dataset.itemId const actorKey = event.currentTarget.closest('.weapon').dataset.actorKey let weapon = null diff --git a/module/items/skill/data.js b/module/items/skill/data.js new file mode 100644 index 00000000..25485651 --- /dev/null +++ b/module/items/skill/data.js @@ -0,0 +1,205 @@ +/* global foundry, game */ +import { CoC7Item } from '../item.js' + +export class CoC7Skill extends CoC7Item { + constructor (data, context) { + if (typeof data.data?.skillName === 'undefined') { + if (typeof data.data === 'undefined') { + data.data = {} + } + const construct = CoC7Skill.guessNameParts(data.name) + if (!construct.isSpecialization) { + data.data.skillName = data.name + } else { + data.data.skillName = construct.skillName + data.data.specialization = construct.specialization + if (typeof data.data.properties === 'undefined') { + data.data.properties = {} + } + data.data.properties.special = true + if (construct.isFighting || construct.isFirearms) { + data.data.properties.combat = true + if (construct.isFighting) { + data.data.properties.fighting = true + } else { + data.data.properties.firearm = true + } + } + } + } + super(data, context) + } + // async applyModifier (change) { + // return + + // const changes = this.data.data.changes + // ? foundry.utils.duplicate(this.data.data.changes) + // : [] + + // const index = changes.findIndex(c => c.effect._id == change.effect.id) + + // if (-1 === index) { + // changes.push(change) + // await this.update({ 'data.changes': changes }) + // } else { + // //Compare if there's a change in the efect data + // if (!JSON.stringify(change) === JSON.stringify(changes[index])) { + // changes[index] = change + // await this.update({ 'data.changes': changes }) + // } + // } + // } + + static guessNameParts (skillName) { + const output = { + skillName, + specialization: '', + isSpecialization: false, + isFighting: false, + isFirearms: false + } + const match = skillName.match(/^(.+)\s*\(([^)]+)\)$/) + if (match) { + output.skillName = match[2].trim() + output.specialization = match[1].trim() + output.isSpecialization = true + if (output.specialization === game.i18n.localize('CoC7.FightingSpecializationName')) { + output.isFighting = true + } else if (output.specialization === game.i18n.localize('CoC7.FirearmSpecializationName')) { + output.isFirearms = true + } + } + return output + } + + get hasActiveEffects () { + return this.activeEffects.length > 0 + } + + get activeEffects () { + if (this.parent && this.parent.effects) { + const effectKeyFull = `skill.${this.name}`.toLowerCase() + const effectKeyShort = `skill.${this.data.data.skillName}`.toLowerCase() + let changes = this.parent.effects.reduce((changes, e) => { + if (e.data.disabled || e.isSuppressed) return changes + return changes.concat( + e.data.changes.map(c => { + c = foundry.utils.duplicate(c) + c.effect = e + c.priority = c.priority ?? c.mode * 10 + return c + }) + ) + }, []) + changes.sort((a, b) => a.priority - b.priority) + changes = changes.filter( + e => + e.key.toLowerCase() === effectKeyShort || + e.key.toLowerCase() === effectKeyFull + ) + return changes + } + return [] + } + + /** + * This is the value of the skill score unaffected by active effects + */ + get rawValue () { + let value = 0 + if (this.actor.data.type === 'character') { + // For an actor with experience we need to calculate skill value + 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', 'pulpRuleArchetype') && + this.data.data.adjustments?.archetype + ) { + value += parseInt(this.data.data.adjustments?.archetype) + } + } else { + // For all others actor we store the value directly + value = parseInt(this.data.data.value) + } + return !isNaN(value) ? value : null + } + + /** + * This is the skill's value after active effects have been applied + */ + get value () { + const value = this.parent?.data.data.skills?.[`${this.data.data.skillName}`] + ?.value + return value || this.rawValue + } + + async updateValue (value) { + if (this.actor.data.type === 'character') { + const delta = parseInt(value) - this.rawValue + 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 + }) + } + } + + // get value () { + // let pValue + // if( this.parent){ + + // } + // const value = super.value + // let updated = value + // for (const change of this.activeEffects) { + // const modifier = Number.fromString(change.value) + // if (!isNaN(modifier)) { + // const modes = CONST.ACTIVE_EFFECT_MODES + // switch (change.mode) { + // case modes.ADD: + // updated += modifier + // break + // case modes.MULTIPLY: + // updated = Math.round(updated * modifier) + // break + // case modes.OVERRIDE: + // updated = modifier + // break + // case modes.UPGRADE: + // if (modifer > updated) updated = modifier + // break + // case modes.DOWNGRADE: + // if (modifer < updated) updated = modifier + // break + // } + // } + // } + // if (!isNaN(updated) && updated != value) { + // if (updated < 0) updated = 0 + // return updated + // } return value + // } +} diff --git a/module/items/spell/data.js b/module/items/spell/data.js new file mode 100644 index 00000000..606c0395 --- /dev/null +++ b/module/items/spell/data.js @@ -0,0 +1,189 @@ +/* global ChatMessage, Dialog, game, mergeObject, Roll, renderTemplate, ui */ + +import { CoC7Utilities } from '../../utilities.js' +import { CoC7Item } from '../item.js' +import { SanCheckCard } from '../../chat/cards/san-check.js' + +export class CoC7Spell extends CoC7Item { + constructor (data, context) { + if (typeof data.img === 'undefined') { + data.img = 'systems/CoC7/assets/icons/pentagram-rose.svg' + } + super(data, context) + this.context = context + } + + async cast () { + if (!this.isOwned) { + /** This is not owned by any Actor */ + return ui.notifications.error(game.i18n.localize('CoC7.NotOwned')) + } + const costs = this.data.data.costs + const losses = [] + let convertSurplusIntoHitPoints + costs.magicPoints = CoC7Utilities.isFormula(costs.magicPoints) + ? (await new Roll(costs.magicPoints).roll({ async: true })).total + : parseInt(costs.magicPoints) + if ( + costs.magicPoints && + costs.magicPoints > this.actor.data.data.attribs.mp.value + ) { + convertSurplusIntoHitPoints = await new Promise(resolve => { + const convertedHitPoints = + costs.magicPoints - this.actor.data.data.attribs.mp.value + const convertedMagicPoints = costs.magicPoints - convertedHitPoints + const data = { + title: ' ', + content: game.i18n.format('CoC7.NotEnoughMagicPoints', { + actorMagicPoints: this.actor.data.data.attribs.mp.value, + convertedHitPoints, + convertedMagicPoints, + originalMagicPoints: costs.magicPoints, + spell: this.name + }), + buttons: { + cancel: { + icon: '', + label: game.i18n.localize('CoC7.Cancel'), + callback: () => { + return resolve(false) + } + }, + proceed: { + icon: '', + label: game.i18n.localize('CoC7.Proceed'), + callback: () => { + costs.hitPoints = convertedHitPoints + costs.magicPoints = convertedMagicPoints + return resolve(true) + } + } + }, + default: 'cancel', + classes: ['coc7', 'dialog'] + } + new Dialog(data).render(true) + }) + if (!convertSurplusIntoHitPoints) return + } + for (const [key, value] of Object.entries(costs)) { + if (!value || Number(value) === 0) continue + losses.push(await this.resolveLosses(key, value)) + } + const template = 'systems/CoC7/templates/items/spell/chat.html' + const description = this.data.data.description.value + const html = await renderTemplate(template, { description, losses }) + return await ChatMessage.create({ + user: game.user.id, + speaker: ChatMessage.getSpeaker({ actor: this.actor }), + flavor: this.name, + content: html + }) + } + + async resolveLosses (characteristic, value) { + let characteristicName + let loss + if (CoC7Utilities.isFormula(value)) { + loss = (await new Roll(value).roll({ async: true })).total + } else { + loss = parseInt(value) + } + const actorData = this.actor.data.data + switch (characteristic) { + case 'hitPoints': + characteristicName = game.i18n.localize('CoC7.HitPoints') + this.actor.dealDamage(loss, { ignoreArmor: true }) + break + case 'sanity': + characteristicName = game.i18n.localize('CoC7.SanityPoints') + this.grantSanityLoss(loss) + break + case 'magicPoints': + characteristicName = game.i18n.localize('CoC7.MagicPoints') + this.actor.setMp(actorData.attribs.mp.value - loss) + break + case 'power': + characteristicName = game.i18n.localize('CHARAC.Power') + this.actor.update({ + 'data.characteristics.pow.value': + actorData.characteristics.pow.value - loss + }) + } + return { characteristicName, loss } + } + + /** Bypass the Sanity check and just roll the damage */ + async grantSanityLoss (value) { + const template = SanCheckCard.template + let html = await renderTemplate(template, {}) + const message = await ChatMessage.create({ + user: game.user.id, + speaker: ChatMessage.getSpeaker({ actor: this.actor }), + flavor: game.i18n.format('CoC7.CastingSpell', { + spell: this.name + }), + content: html + }) + const card = await message.getHTML() + if (typeof card.length !== 'undefined' && card.length === 1) { + const sanityLoss = value + html = card.find('.chat-card')[0] + html.dataset.object = escape( + JSON.stringify({ + actorKey: this.actor.id, + fastForward: false, + sanData: { + sanMin: sanityLoss, + sanMax: sanityLoss + } + }) + ) + const sanityCheck = SanCheckCard.getFromCard(html) + await sanityCheck.bypassRollSan() + await sanityCheck.rollSanLoss() + sanityCheck.updateChatCard() + } + } + + async update (data, context) { + if ( + typeof this.context.parent !== 'undefined' && + typeof this.context.bookId !== 'undefined' + ) { + let item + let book + // let spellData + if (this.context.parent === null) { + item = game.items.get(this.context.bookId) + book = item.toObject() + } else { + book = this.context.parent.items.get(this.context.bookId).toObject() + } + for (let i = 0, im = book.data.spells.length; i < im; i++) { + if (book.data.spells[i]._id === this.id) { + book.data.spells[i] = mergeObject(book.data.spells[i], data) + // spellData = book.data.spells[i] + } + } + if (this.context.parent === null) { + await item.update({ + 'data.spells': book.data.spells + }) + this.sheet.object = new CoC7Spell( + book.data.spells.find(spell => spell._id === this.id), + this.context + ) + } else { + await this.context.parent.updateEmbeddedDocuments('Item', [book]) + this.sheet.object = new CoC7Spell( + book.data.spells.find(spell => spell._id === this.id), + this.context + ) + } + this.sheet.render(true) + } else { + super.update(data, context) + } + } +} diff --git a/module/items/spell/sheet.js b/module/items/spell/sheet.js new file mode 100644 index 00000000..82a09898 --- /dev/null +++ b/module/items/spell/sheet.js @@ -0,0 +1,53 @@ +/* global $, game, ItemSheet, mergeObject */ + +export class CoC7SpellSheet extends ItemSheet { + static get defaultOptions () { + return mergeObject(super.defaultOptions, { + template: 'systems/CoC7/templates/items/spell/main.html', + classes: ['coc7', 'item', 'spell'], + width: 500, + height: 'auto', + resizable: false, + scrollY: ['.body'], + tabs: [ + { + navSelector: '.navigation', + contentSelector: '.body', + initial: 'description' + } + ] + }) + } + + async getData () { + const data = super.getData() + const itemData = data.data + data.data = itemData.data + data.isKeeper = game.user.isGM + data.isOwner = this.item.isOwner + return data + } + + activateListeners (html) { + super.activateListeners(html) + html.find('.option').click(event => this.modifyType(event)) + html.find('#cast-spell').click(event => { + event.preventDefault() + this.item.cast() + }) + } + + /** + * Toggle the checkboxes for type when user clicks on the corresponding + * label, not sure if this works on engines other than V8 + * @param {jQuery} event @see activateListeners + * @returns {jQuery.Event} click + */ + modifyType (event) { + event.preventDefault() + /** Prevents propagation of the same event from being called */ + event.stopPropagation() + const toggleSwitch = $(event.currentTarget) + return toggleSwitch.prev().trigger('click') + } +} diff --git a/module/manual/en/README.md b/module/manual/en/README.md new file mode 100644 index 00000000..0c00c0ab --- /dev/null +++ b/module/manual/en/README.md @@ -0,0 +1,132 @@ +# System documentation for version 0.8.0 + +This document is a work in progress overview of the CoC7 system it is not a tutorial for how to use FoundryVTT. + +You will need one of the following to play the game + +- 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 [fas fa-atlas] 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 + +- @Compendium[CoC7.system-doc.VdOeGcxsu3jsVm3F]{Chases} +- @Compendium[CoC7.system-doc.xV4Hxxmu6zjIMw9h]{Actor importer} - added The Dhole's House JSON support +- @Compendium[CoC7.system-doc.rmtiwtbixojhyf5v]{Active effects} - implementation of active effects +- Active effects added to @Compendium[CoC7.system-doc.fk040vqb4per5ju1]{links} and @Compendium[CoC7.system-doc.emuu3wo0uul91029]{Link creation tool} + +# 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 +- @Compendium[CoC7.system-doc.nVYLlqVzmUV5dXAW]{Creating your first investigator} +- @Compendium[CoC7.system-doc.uug1mm5nokly4o2v]{Character creation} + +# How to use the system + +- @Compendium[CoC7.system-doc.rmtiwtbixojhyf5v]{Active effects} - An active effect will modify an actor characteristic(s), attribute(s), skill(s). +- @Compendium[CoC7.system-doc.xV4Hxxmu6zjIMw9h]{Actor importer} +- Actor Type: Character (TODO) +- Actor Type: Container (TODO) +- Actor Type: Creature (TODO) +- Actor Type: NPC (TODO) +- Chat link creator (TODO) +- Character creation mode (TODO) +- @Compendium[CoC7.system-doc.nk68b2ew15iw0bb8]{Combat} (TODO) +- Development phase (TODO) +- @Compendium[CoC7.system-doc.di6mcnaxfyi0y2l4]{Item Types} (TODO) +- @Compendium[CoC7.system-doc.kv2tbz6x29cq6ewq]{Item Type: Archetype} (TODO) +- @Compendium[CoC7.system-doc.oruecvy7jne4u4gt]{Item Type: Book} (TODO) +- @Compendium[CoC7.system-doc.VdOeGcxsu3jsVm3F]{Item Type: Chases} +- Item Type: Item (TODO) +- @Compendium[CoC7.system-doc.qa934whpkpauiyc9]{Item Type: Occupation} +- @Compendium[CoC7.system-doc.JU1GCWwc8at7gzJ4]{Item Type: Setup} +- @Compendium[CoC7.system-doc.mz0ulbkecfvv8nw7]{Item Type: Skill} (TODO) +- Item Type: Spell (TODO) +- Item Type: Status (TODO) +- Item Type: Talent (TODO) +- Item Type: Weapon (TODO) +- @Compendium[CoC7.system-doc.emuu3wo0uul91029]{Link Creation Tool} +- @Compendium[CoC7.system-doc.fk040vqb4per5ju1]{Links} (TODO) +- Macros (TODO) +- Rolls (TODO) +- @Compendium[CoC7.system-doc.ce7s8psgyctzx5r1]{Sanity} (TODO) +- Start Rest (TODO) +- XP Gain (TODO) + +# Actor overview + +- _Character_ - A complete character, usually an investigator. @Compendium[CoC7.examples.JuI2aWDSEuQNKeUI]{Example Character} +- _Container_ - An inventory container. @Compendium[CoC7.examples.r7bDSY4OYKxQYEas]{Example Container} +- _Creature_ - A more simple character, suitable for creatures. @Compendium[CoC7.examples.XE2vjLG03wGfnYLw]{Example Creature} +- _NPC_ - A more simple character, suitable for NPCs. @Compendium[CoC7.examples.4kSvDc4n13oFx8RG]{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. @Compendium[CoC7.items.lu04TIRrg9P3vRqY]{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. @Compendium[CoC7.items.NOsh6EdNSjpjahDF]{Example Occupation} +- _Setup_ - A set of default configurations for character, creature, or NPC creation. @Compendium[CoC7.items.CcH7CdXGtGTjMSCg]{Example Setup} +- _Skill_ - A skill with a base percentage and some tags. @Compendium[CoC7.skills.UOuN0gESXPp2HXwH]{Example Skill} +- _Spell_ - A magic spell. +- _Status_ - An phobia or mania condition. @Compendium[CoC7.items.DVdvEDizPZPux1pK]{Example Mania} +- _Talent_ -A special power for Pulp Cthulhu. These do not trigger automation in the system. @Compendium[CoC7.items.yqvwz769ZeJplOW7]{Example Talent} +- _Weapon_ - An item with weapon statistics (this includes unarmed attacks). @Compendium[CoC7.items.3elxAwnv7WCUNwng]{Example Weapon} + +# Settings overview + +Click on the [fas fa-cogs]Game Settings tab then under the Game Settings heading click on [fas fa-cogs]Configure Settings. + +Click on [fas fa-cogs]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 [fas fa-map]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/module/manual/en/actor_importer.md b/module/manual/en/actor_importer.md new file mode 100644 index 00000000..7713fe65 --- /dev/null +++ b/module/manual/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 [fas fa-users]Actor Directory and click Actor Importer at the bottom of the side bar or on an active scene [game-icon game-icon-tentacle-strike] then click [fas fa-user-plus]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 [fas fa-users]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 [fas fa-users]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 [fas fa-cogs]Game Settings tab then under the Game Settings heading clicking on [fas fa-cogs]Configure Settings, click on [fas fa-cogs]System Settings. diff --git a/module/manual/en/character_creation.md b/module/manual/en/character_creation.md new file mode 100644 index 00000000..a2a07b67 --- /dev/null +++ b/module/manual/en/character_creation.md @@ -0,0 +1,109 @@ +# Character Creation + +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. + +# Skills + +In this section you will create or edit @Compendium[CoC7.system-doc.mz0ulbkecfvv8nw7]{skills} + +1. Go to [fas fa-atlas]compendium packs +2. Click on [fas fa-atlas]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 [fas fa-suitcase]Items Directory +2. Cick on [fas fa-suitcase]Create Item + + - Give the skill a name + - Set _Type_ to _Skill_ + +# Setup + +@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. + +1. Go to [fas fa-suitcase]Items Directory +2. Click on [fas fa-suitcase]Create Item + + - Give the skill a name + - Set _Type_ to _Setup_ + +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 like @Compendium[CoC7.items.3elxAwnv7WCUNwng]{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. + +# Occupations + +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_. + +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 _occupation_ creation process is the following one: + +1. Go to [fas fa-suitcase]Items Directory +2. Cick on [fas fa-suitcase]Create Item + + - Give the skill a name + - Set _Type_ to _Occupation_ + +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. + +# _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_ is as follows: + +1. Go to [fas fa-users]Actors Directory +2. Cick on [fas fa-user]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. On the keeper's menu on the left click [game-icon game-icon-tentacle-strike]Keeper's tools, if this menu is not available need to have an active scene which can be created in the [fas fa-map]Scenes Directory + +6. On the new submenu click [fas fa-user-edit]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/module/manual/en/chases.md b/module/manual/en/chases.md new file mode 100644 index 00000000..b350f9cc --- /dev/null +++ b/module/manual/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/module/manual/en/combat.md b/module/manual/en/combat.md new file mode 100644 index 00000000..720b2b89 --- /dev/null +++ b/module/manual/en/combat.md @@ -0,0 +1,41 @@ +# Combat + +## Starting the combat + +On 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. +Then on the combat tab you can _start the combat_. + +The combat tracker will help you to track both the initiatives of the different actors and the combat rounds. + +## Initiative + +On 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. + +Next to each actor on the combat tab there are 3 icons: + +- _A target_: to _draw the gun_ (this will add 50 to that character initiative) +- _A crossed eye_: to show/hide the corresponding actor on the list. +- _A skull_: to mark a character as defeated and skip it for the following turns. + +## Select target / targets + +During 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. + +Then 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. +This 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. + +> Tip: 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. + +## Melee + +## Maneuvers + +Not implemented yet. + +## Single Shot + +## Automate fire + +### Multiple Targets + +## Reload diff --git a/module/manual/en/commands_cheat_sheet.md b/module/manual/en/commands_cheat_sheet.md new file mode 100644 index 00000000..e0aa02e5 --- /dev/null +++ b/module/manual/en/commands_cheat_sheet.md @@ -0,0 +1,29 @@ +# 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. +- `Ctrl` [GM only] will create a link in the chat with that request a roll to the players. + +## Sanity + +| 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 | + +## Combined / Opposed rolls + +| 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 | + +## Other + +| Command | Action | +| ------- | ----------------------------- | +| `c` | Show _my own_ character sheet | diff --git a/module/manual/en/effects.md b/module/manual/en/effects.md new file mode 100644 index 00000000..dac5f078 --- /dev/null +++ b/module/manual/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 @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 [game-icon game-icon-aura] 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/module/manual/en/first_investigator.md b/module/manual/en/first_investigator.md new file mode 100644 index 00000000..ec4c8968 --- /dev/null +++ b/module/manual/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 @Compendium[CoC7.system-doc.uug1mm5nokly4o2v]{Character creation} instead. + +# Skill + +Click on the [fas fa-atlas]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 [fas fa-suitcase]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 @Compendium[CoC7.items.CcH7CdXGtGTjMSCg]{1920's Setup Example} + +Setups allow to you standardise what skills, items, biography sections, and characteristics the investigators start with. + +Click on the [fas fa-suitcase]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 [fas fa-edit]button to get an editor. + +On the Details tab click the [fas fa-plus] on the Biography Sections to add any sections you require from the Create a Backstory step of investigator creation. Click on the [fas fa-atlas]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. + +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 [game-icon game-icon-tentacles-skull]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 @Compendium[CoC7.items.NOsh6EdNSjpjahDF]{Occupation Example} + +Click on the [fas fa-suitcase]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 [fas fa-edit]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 [fas fa-map]Scenes Directory. + +Click on the [fas fa-users]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 @Compendium[CoC7.items.CcH7CdXGtGTjMSCg]{1920's Setup Example} + +Next drag your occupation created above on to the character or drag this example instead @Compendium[CoC7.items.NOsh6EdNSjpjahDF]{Occupation Example} + +On the left hand menu bar select [game-icon game-icon-tentacle-strike]Keeper's tools then select [fas fa-user-edit]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 [fas fa-user-edit]Character creation mode to allow characters to see their HP, MP, Sanity, and luck diff --git a/module/manual/en/item_archetype.md b/module/manual/en/item_archetype.md new file mode 100644 index 00000000..ee9da5d4 --- /dev/null +++ b/module/manual/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/module/manual/en/item_book.md b/module/manual/en/item_book.md new file mode 100644 index 00000000..6723c748 --- /dev/null +++ b/module/manual/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/module/manual/en/item_occupation.md b/module/manual/en/item_occupation.md new file mode 100644 index 00000000..ced77b0b --- /dev/null +++ b/module/manual/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 [fas fa-suitcase]Items Directory tab +2. Click on [fas fa-suitcase]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/module/manual/en/item_setup.md b/module/manual/en/item_setup.md new file mode 100644 index 00000000..23113136 --- /dev/null +++ b/module/manual/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 [fas fa-suitcase]Items Directory tab +2. Click on [fas fa-suitcase]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/module/manual/en/item_skill.md b/module/manual/en/item_skill.md new file mode 100644 index 00000000..a2b50831 --- /dev/null +++ b/module/manual/en/item_skill.md @@ -0,0 +1,19 @@ +# Item Type: Skill + +A _skill_ will be rolled during tests. + +1. Go to the [fas fa-suitcase]Items Directory tab +2. Click on [fas fa-suitcase]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/module/manual/en/items.md b/module/manual/en/items.md new file mode 100644 index 00000000..55c226c4 --- /dev/null +++ b/module/manual/en/items.md @@ -0,0 +1,29 @@ +# Items + +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_ + - 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 + +# Available types +- @Compendium[CoC7.system-doc.kv2tbz6x29cq6ewq]{Item Type: Archetype} +- @Compendium[CoC7.system-doc.oruecvy7jne4u4gt]{Item Type: Book} +- @Compendium[CoC7.system-doc.VdOeGcxsu3jsVm3F]{Item Type: Chases} +- Item Type: Item +- @Compendium[CoC7.system-doc.qa934whpkpauiyc9]{Item Type: Occupation} +- @Compendium[CoC7.system-doc.JU1GCWwc8at7gzJ4]{Item Type: Setup} +- @Compendium[CoC7.system-doc.mz0ulbkecfvv8nw7]{Item Type: Skill} +- Item Type: Spell +- Item Type: Status +- Item Type: Talent +- Item Type: Weapon diff --git a/module/manual/en/link_creation_window.md b/module/manual/en/link_creation_window.md new file mode 100644 index 00000000..be978810 --- /dev/null +++ b/module/manual/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 [fas fa-link] icon. +This tools is available to GM only. + +![Creation tool](../../assets/manual/links/links-creation-tool.webp) + +using this you can create @Compendium[CoC7.system-doc.fk040vqb4per5ju1]{link} 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 @Compendium[CoC7.system-doc.rmtiwtbixojhyf5v]{active effects}. +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/module/manual/en/links.md b/module/manual/en/links.md new file mode 100644 index 00000000..2a3d8aac --- /dev/null +++ b/module/manual/en/links.md @@ -0,0 +1,62 @@ +# 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 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. +- When a link is created, the roll mode will be check. If the roll mode is set to 'blind GM roll' the link will be created as blind. +- When a link is created with a difficulty and a penalty, the difficulty/penalty windows will not pop. +- When a link is created without a difficulty or a penalty, the difficulty/penalty windows will pop. Holding SHIFT will fastforward the roll (regular/no penalty). + +## Writing links + +- Links should be written using the @Compendium[CoC7.system-doc.emuu3wo0uul91029]{Link creation tool}. 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}` + +- `TYPE_OF_REQUEST` : + - `sanloss`: 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 + - `sanloss`: + - `sanMax`: max SAN loss + - `sanMin`: min SAN loss + - `check`: + - `type`: 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. + - all: + - [`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](https://fontawesome.com/icons), `fas fa-dice`). +- `TEXT_TO_DISPLAY`: Name to display, this is optional. + +### Examples + +| 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) | + +### 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. + - Holding Shift on top will not open the penalty/difficulty dialogue. Clicking on the generated link will open the penalty/difficulty dialogue then trigger the check. diff --git a/module/manual/en/sanity.md b/module/manual/en/sanity.md new file mode 100644 index 00000000..9fcc10df --- /dev/null +++ b/module/manual/en/sanity.md @@ -0,0 +1,11 @@ +## Sanity Checks + +The system has integrated the sanity check workflow and can handle sanity rolls, tracking _Sanity_ loss and rolling for temporal insanity. + +## Requesting Sanity rolls + +- The Keeper can click with `Ctrl+Shift` on the _Sanity_ of character to request a Sanity Check for the character + + - 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/module/menu.js b/module/menu.js index b10f038c..88210692 100644 --- a/module/menu.js +++ b/module/menu.js @@ -1,161 +1,41 @@ -/* global $, canvas, duplicate, game, renderTemplate, ui */ - +/* global canvas, foundry, game, PlaceablesLayer */ import { CoC7Chat } from './chat.js' import { CoC7Utilities } from './utilities.js' import { CoC7ActorImporterDialog } from './apps/actor-importer-dialog.js' import { CoC7LinkCreationDialog } from './apps/link-creation-dialog.js' -export class CoC7Menu { - constructor (options) { - this.options = options - this.controls = this._getControls() - } - - static async renderMenu (controls, html) { - // This could be made non static by moving the game.CoC7.menus initialization to getSceneControlButtons hook - if (!game.CoC7.menus) { - game.CoC7.menus = new CoC7Menu() - // ui.notifications.info( 'Menu init'); - } - - const menu = await renderTemplate( - 'systems/CoC7/templates/coc7-menu.html', - game.CoC7.menus.getData() - ) - const coc7Button = $(menu) - - coc7Button - .find('.scene-control') - .click(game.CoC7.menus._onClickMenu.bind(game.CoC7.menus)) - coc7Button - .find('.control-tool') - .click(game.CoC7.menus._onClickTool.bind(game.CoC7.menus)) - - if (game.CoC7.menus.activeControl) { - html.find('.scene-control').removeClass('active') - } - - html - .find('.scene-control') - .click(game.CoC7.menus._clearActive.bind(game.CoC7.menus)) - - html.append(coc7Button) - game.CoC7.menus.html = html +class CoC7MenuLayer extends PlaceablesLayer { + constructor () { + super() + this.objects = {} } - get control () { - if (!this.controls) return null - return this.controls.find(c => c.name === this.activeControl) || null - } - - _clearActive (event) { - event.preventDefault() - const customMenuActive = !!this.activeControl - this.activeControl = '' - const li = event.currentTarget - const controlName = li.dataset?.control - if (ui.controls.activeControl === controlName && customMenuActive) { - ui.controls.render() - } - } - - _onClickTool (event) { - event.preventDefault() - if (!canvas?.ready) return - const li = event.currentTarget - const toolName = li.dataset.tool - const tool = this.control.tools.find(t => t.name === toolName) - - // ui.notifications.info( `found tool: ${tool.name}`); - - if (tool.toggle) { - // Handle Toggles - tool.active = !tool.active - if (tool.onClick instanceof Function) tool.onClick(tool.active) - } else if (tool.button) { - // Handle Buttons - if (tool.onClick instanceof Function) tool.onClick(event) - } else { - // Handle Tools - tool.activeTool = toolName - if (tool.onClick instanceof Function) tool.onClick() - } + static get layerOptions () { + return foundry.utils.mergeObject(super.layerOptions, { + name: 'coc7menu', + zIndex: 60 + }) } - _onClickMenu (event) { - event.preventDefault() - if (!canvas?.ready) return - const li = event.currentTarget - const controlName = li.dataset.control - const control = this.controls.find(t => t.name === controlName) - - if (control.button) { - if (control.onClick instanceof Function) control.onClick(event) // If control is a button, don't make it active. - // ui.controls.render(); - } else { - // If control is a menu and is not active. - // html.find('.scene-control').removeClass('active'); // Deactivate other menu. - // event.currentTarget.classList.add('active'); //Activate this menu. - this.activeControl = controlName // Set curstom active control to that control. - ui.controls.render() - } + static get documentName () { + return 'Token' } - getData () { - const isActive = !!canvas?.scene - - // Filter to control tool sets which can be displayed - const controls = this.controls - .filter(s => s.visible !== false) - .map(s => { - s = duplicate(s) - - // Add styling rules - s.css = [ - 'custom-control', - s.button ? 'button' : null, - isActive && this.activeControl === s.name ? 'active' : '' - ] - .filter(t => !!t) - .join(' ') - - // if( this.activeControl === s.name) ui.notifications.warn( `Active control: ${this.activeControl}`); - - if (s.button) return s - - // Prepare contained tools - s.tools = s.tools - .filter(t => t.visible !== false) - .map(t => { - const active = - isActive && (s.activeTool === t.name || (t.toggle && t.active)) - t.css = [ - t.toggle ? 'toggle' : null, - active ? 'active' : null, - t.class ? t.class : null - ] - .filter(t => !!t) - .join(' ') - return t - }) - return s - }) - - // Return data for rendering - return { - active: isActive, - cssClass: isActive ? '' : 'disabled', - controls: controls // .filter(s => s.tools.length) - } + get placeables () { + return [] } +} - _getControls () { +export class CoC7Menu { + static getButtons (controls) { + canvas.coc7gmtools = new CoC7MenuLayer() const isGM = game.user.isGM - const controls = [] + const showHiddenDevMenu = game.settings.get('CoC7', 'hiddendevmenu') controls.push({ - icon: 'game-icon game-icon-tentacle-strike', - name: 'main-menu', + name: 'coc7menu', title: 'CoC7.GmTools', + layer: 'coc7gmtools', + icon: 'game-icon game-icon-tentacle-strike', visible: isGM, tools: [ { @@ -164,7 +44,7 @@ export class CoC7Menu { name: 'devphase', active: game.settings.get('CoC7', 'developmentEnabled'), title: 'CoC7.DevPhase', - onClick: async () => await CoC7Utilities.toggleDevPhase() + onClick: async toggle => await CoC7Utilities.toggleDevPhase(toggle) }, { toggle: true, @@ -172,17 +52,15 @@ export class CoC7Menu { name: 'charcreate', active: game.settings.get('CoC7', 'charCreationEnabled'), title: 'CoC7.CharCreationMode', - onClick: async () => await CoC7Utilities.toggleCharCreation() + onClick: async toggle => + await CoC7Utilities.toggleCharCreation(toggle) }, { button: true, icon: 'fas fa-user-plus', name: 'actor-import', title: 'CoC7.ActorImporter', - onClick: async () => - await CoC7ActorImporterDialog.create({ - title: game.i18n.localize('CoC7.ActorImporter') - }) + onClick: async () => await CoC7ActorImporterDialog.create() }, { toggle: true, @@ -191,7 +69,7 @@ export class CoC7Menu { name: 'xptoggle', active: game.settings.get('CoC7', 'xpEnabled'), title: 'CoC7.toggleXP', - onClick: async () => await CoC7Utilities.toggleXPGain() + onClick: async toggle => await CoC7Utilities.toggleXPGain(toggle) }, { button: true, @@ -205,27 +83,68 @@ export class CoC7Menu { icon: 'fas fa-moon', name: 'startrest', title: 'CoC7.startRest', - onClick: async () => await CoC7Utilities.startRest() + onClick: async () => await CoC7Utilities.getTarget() } ] }) + if (showHiddenDevMenu) { + canvas.coc7DevTools = new CoC7MenuLayer() + controls.push({ + name: 'coc7DevMenu', + title: + "Dev tools. If you don't know what it is, you don't need it and you shouldn't use it !!", + layer: 'coc7DevTools', + icon: 'game-icon game-icon-police-badge', + visible: isGM, + tools: [ + { + toggle: true, + icon: 'game-icon game-icon-dice-fire', + name: 'alwaysCrit', + active: game.CoC7.dev.dice.alwaysCrit, + title: 'All rolls will crit', + onClick: toggle => { + game.CoC7.dev.dice.alwaysFumble = false + game.CoC7.dev.dice.alwaysCrit = toggle + } + }, + { + toggle: true, + icon: 'game-icon game-icon-fire-extinguisher', + name: 'alwaysFumble', + active: game.CoC7.dev.dice.alwaysFumble, + title: 'All rolls will fumble', + onClick: toggle => { + game.CoC7.dev.dice.alwaysFumble = toggle + game.CoC7.dev.dice.alwaysCrit = false + } + } + ] + }) + } + } - controls.push({ - icon: 'game-icon game-icon-d10', - name: 'dice-roll', - title: 'CoC7.RollDice', - button: true, - onClick: event => CoC7Utilities.rollDice(event) - }) - - controls.push({ - icon: 'fas fa-link', - name: 'create-link', - title: 'CoC7.CreateLink', - visible: isGM, - button: true, - onClick: CoC7LinkCreationDialog.create - }) - return controls + static renderControls (app, html, data) { + const isGM = game.user.isGM + const keeperMenu = html.find('.game-icon-tentacle-strike').parent() + keeperMenu.addClass('coc7-menu') + if (isGM) { + keeperMenu.after( + '' + ) + } + keeperMenu.after( + '
                                                      3. ' + ) + html + .find('.coc7-menu.coc7-dice-roll') + .click(event => CoC7Utilities.rollDice(event)) + html + .find('.coc7-menu.coc7-create-link') + .click(event => CoC7LinkCreationDialog.create(event)) } } diff --git a/module/scripts/coc7-directory-picker.js b/module/scripts/coc7-directory-picker.js new file mode 100644 index 00000000..e967319e --- /dev/null +++ b/module/scripts/coc7-directory-picker.js @@ -0,0 +1,119 @@ +/* global $, File, FilePicker, game, ui */ +export class CoC7DirectoryPicker extends FilePicker { + get title () { + return game.i18n.localize('CoC7.PickDirectory') + } + + _onSubmit (event) { + event.preventDefault() + const path = event.target.target.value + const activeSource = this.activeSource + const bucket = event.target.bucket ? event.target.bucket.value : null + this.field.value = CoC7DirectoryPicker.format({ + activeSource, + bucket, + path + }) + this.close() + } + + static DefaultDirectory (val) { + return val === null ? '' : String(val) + } + + static format (value) { + return value.bucket !== null + ? `[${value.activeSource}:${value.bucket}] ${value.path}` + : `[${value.activeSource}] ${value.path}` + } + + static parse (raw) { + const str = raw ?? '' + const matches = str.match(/^\[([^:]+)(:(.+))?\]\s*(.+)?$/u) + + if (matches) { + return { + activeSource: matches[1], + bucket: matches[3] ?? '', + current: matches[4] + } + } + return { + activeSource: 'data', + bucket: null, + current: str + } + } + + static processHtml (html) { + $(html) + .find('input[data-dtype="DefaultDirectory"]') + .each((i, el) => { + const input = $(el) + input.prop('readonly', true) + if (!input.next().length) { + const picker = new CoC7DirectoryPicker({ + field: input[0], + ...CoC7DirectoryPicker.parse(input.val()) + }) + const pickerButton = $( + '' + ) + pickerButton.on('click', () => { + picker.render(true) + }) + input.parent().append(pickerButton) + } + }) + } + + activateListeners (html) { + super.activateListeners(html) + + $(html).find('ol.files-list').remove() + $(html).find('footer div').remove() + $(html).find('footer button').text(game.i18n.localize('CoC7.PickDirectory')) + } + + static async createDefaultDirectory () { + const parsed = CoC7DirectoryPicker.parse( + game.settings.get('CoC7', 'dholeUploadDirectory') + ) + try { + await CoC7DirectoryPicker.createDirectory( + parsed.activeSource, + parsed.current, + { bucket: parsed.bucket } + ) + return true + } catch (e) { + if (!e.startsWith('EEXIST')) { + ui.notifications.error( + game.i18n.localize('CoC7.ActorImporterUploadError') + ) + return false + } + } + } + + static async uploadToDefaultDirectory (file, filename) { + const parsed = CoC7DirectoryPicker.parse( + game.settings.get('CoC7', 'dholeUploadDirectory') + ) + const response = await FilePicker.upload( + parsed.activeSource, + parsed.current, + new File([file], filename, { + type: 'image/png' + }), + { bucket: parsed.bucket } + ) + if (!response.path) { + ui.notifications.error(game.i18n.localize('CoC7.FileUploadError')) + return false + } + return parsed.current + '/' + filename + } +} diff --git a/module/scripts/compendium-filter.js b/module/scripts/compendium-filter.js new file mode 100644 index 00000000..324ce006 --- /dev/null +++ b/module/scripts/compendium-filter.js @@ -0,0 +1,170 @@ +/* global $, game, Hooks */ +import { COC7 } from '../config.js' + +async function performFilter (e) { + const appId = e.currentTarget.name.replace(/^coc7[^0-9]+(\d+)$/, '$1') + const app = $('#app-' + appId) + const type = app.find('select[name=coc7type' + appId + ']').val() + const name = app.find('input[name=coc7name' + appId + ']').val() + const eraElement = app.find('select[name=coc7era' + appId + ']') + let era = '' + switch (type) { + case 'setup': + case 'skill': + case 'weapon': + eraElement.closest('div.era_select').show() + era = eraElement.val() + break + default: + eraElement.closest('div.era_select').hide() + } + const items = await game.packs.get(app.data('packId'))?.getDocuments() + if (typeof items === 'undefined') { + return + } + const show = [] + const nameFilter = new RegExp(RegExp.escape(name), 'i') + for (const [, item] of Object.entries(items)) { + let filter = true + if (filter && name !== '') { + filter = item.name.match(nameFilter) + } + if (filter && type !== '') { + filter = item.type === type + } + if (filter && era !== '') { + if ( + item.data.data.eras[era] === false || + item.data.data.eras[era] === true + ) { + filter = item.data.data.eras[era] + } else { + filter = item.data.data.eras[era]?.selected ?? false + } + } + if (filter) { + show.push(item.id) + } + } + app.find('ol.directory-list li').each(function () { + this.style.display = show.includes(this.dataset.documentId) + ? 'flex' + : 'none' + }) +} + +export function compendiumFilter () { + Hooks.on('renderCompendium', async (app, html, data) => { + if (app.collection.documentName === 'Item') { + const types = [...new Set(data.index.map(item => item.type))] + const select = [] + select.push( + '' + ) + if (types.includes('archetype')) { + select.push( + '' + ) + } + if (types.includes('book')) { + select.push( + '' + ) + } + if (types.includes('item')) { + select.push( + '' + ) + } + if (types.includes('occupation')) { + select.push( + '' + ) + } + if (types.includes('setup')) { + select.push( + '' + ) + } + if (types.includes('skill')) { + select.push( + '' + ) + } + if (types.includes('spell')) { + select.push( + '' + ) + } + if (types.includes('status')) { + select.push( + '' + ) + } + if (types.includes('talent')) { + select.push( + '' + ) + } + if (types.includes('weapon')) { + select.push( + '' + ) + } + const eras = [] + eras.push( + '' + ) + for (const [key, value] of Object.entries(COC7.eras)) { + eras.push( + '' + ) + } + html.data('packId', app.metadata.package + '.' + app.metadata.name) + html.find('header.directory-header').remove() + html + .find('div.compendium.directory') + .before( + '
                                                        ' + ) + html.find('select').change(performFilter.bind(this)) + html.find('input').keyup(performFilter.bind(this)) + } + }) +} diff --git a/module/scripts/configure-documents.js b/module/scripts/configure-documents.js index b3694637..053a263f 100644 --- a/module/scripts/configure-documents.js +++ b/module/scripts/configure-documents.js @@ -3,12 +3,23 @@ import { CoCActor } from '../actors/actor.js' import { CoC7Book } from '../items/book/data.js' import { CoC7Item } from '../items/item.js' +import { CoC7Spell } from '../items/spell/data.js' +import { CoC7Chase } from '../items/chase/data.js' +import CoC7ActiveEffect from '../active-effect.js' +import { CoC7Skill } from '../items/skill/data.js' +import { CoC7Vehicle } from '../actors/vehicle/data.js' export function configureDocuments () { + CONFIG.ActiveEffect.documentClass = CoC7ActiveEffect CONFIG.Actor.documentClass = CoCActor - CONFIG.Actor.documentClasses = {} + CONFIG.Actor.documentClasses = { + vehicle: CoC7Vehicle + } CONFIG.Item.documentClass = CoC7Item CONFIG.Item.documentClasses = { - book: CoC7Book + book: CoC7Book, + spell: CoC7Spell, + chase: CoC7Chase, + skill: CoC7Skill } } diff --git a/module/scripts/game-rules.js b/module/scripts/game-rules.js new file mode 100644 index 00000000..7cec3672 --- /dev/null +++ b/module/scripts/game-rules.js @@ -0,0 +1,226 @@ +/* global $, CONFIG, FormApplication, game, mergeObject */ +const SETTINGS = { + pulpRules: { + name: '', + hint: '', + scope: 'world', + config: false, + default: false, + type: Boolean + }, + initiativeRule: { + name: 'SETTINGS.InitiativeRule', + hint: 'SETTINGS.InitiativeRuleHint', + scope: 'world', + config: false, + default: 'basic', + type: String, + choices: { + basic: 'SETTINGS.InitiativeRuleBasic', + optional: 'SETTINGS.InitiativeRuleOptional' + }, + onChange: rule => _setInitiativeOptions(rule) + }, + developmentRollForLuck: { + name: 'SETTINGS.developmentRollForLuck', + hint: 'SETTINGS.developmentRollForLuckHint', + scope: 'world', + config: false, + default: false, + type: Boolean + }, + pulpRuleDoubleMaxHealth: { + name: 'CoC7.Settings.PulpRules.DoubleMaxHealth.Name', + hint: 'CoC7.Settings.PulpRules.DoubleMaxHealth.Hint', + scope: 'world', + config: false, + default: false, + type: Boolean + }, + pulpRuleDevelopmentRollLuck: { + name: 'CoC7.Settings.PulpRules.DevelopmentRollLuck.Name', + hint: 'CoC7.Settings.PulpRules.DevelopmentRollLuck.Hint', + scope: 'world', + config: false, + default: false, + type: Boolean + }, + pulpRuleArchetype: { + name: 'CoC7.Settings.PulpRules.Archetype.Name', + hint: 'CoC7.Settings.PulpRules.Archetype.Hint', + scope: 'world', + config: false, + default: false, + type: Boolean + }, + pulpRuleOrganization: { + name: 'CoC7.Settings.PulpRules.Organization.Name', + hint: 'CoC7.Settings.PulpRules.Organization.Hint', + scope: 'world', + config: false, + default: false, + type: Boolean + }, + pulpRuleTalents: { + name: 'CoC7.Settings.PulpRules.Talents.Name', + hint: 'CoC7.Settings.PulpRules.Talents.Hint', + scope: 'world', + config: false, + default: false, + type: Boolean + }, + pulpRuleFasterRecovery: { + name: 'CoC7.Settings.PulpRules.FasterRecovery.Name', + hint: 'CoC7.Settings.PulpRules.FasterRecovery.Hint', + scope: 'world', + config: false, + default: false, + type: Boolean + }, + pulpRuleIgnoreMajorWounds: { + name: 'CoC7.Settings.PulpRules.IgnoreMajorWounds.Name', + hint: 'CoC7.Settings.PulpRules.IgnoreMajorWounds.Hint', + scope: 'world', + config: false, + default: false, + type: Boolean + }, + opposedRollTieBreaker: { + name: 'SETTINGS.OpposedRollTieBreaker', + hint: 'SETTINGS.OpposedRollTieBreakerHint', + scope: 'world', + config: false, + default: false, + type: Boolean + } +} + +function _setInitiativeOptions (rule) { + let decimals = 0 + switch (rule) { + case 'optional': + decimals = 2 + break + case 'basic': + decimals = 0 + break + } + CONFIG.Combat.initiative = { + formula: null, + decimals + } +} + +export class CoC7GameRuleSettings extends FormApplication { + static get defaultOptions () { + return mergeObject(super.defaultOptions, { + title: 'SETTINGS.TitleRules', + id: 'rules-settings', + template: 'systems/CoC7/templates/system/rule-settings.html', + width: 550, + height: 'auto', + closeOnSubmit: true + }) + } + + getData () { + const options = {} + const pulpRules = { + true: false, + false: false + } + for (const [k, v] of Object.entries(SETTINGS)) { + options[k] = { + value: game.settings.get('CoC7', k), + setting: v + } + if (k.match(/^pulpRule.{2,}$/)) { + pulpRules[options[k].value] = true + } + } + options.pulpSelection = pulpRules.true + ? pulpRules.false + ? 'some' + : 'all' + : 'none' + return options + } + + static registerSettings () { + for (const [k, v] of Object.entries(SETTINGS)) { + game.settings.register('CoC7', k, v) + } + _setInitiativeOptions(game.settings.get('CoC7', 'initiativeRule')) + } + + activateListeners (html) { + super.activateListeners(html) + html + .find('#pulpRulesSelect') + .on('change', event => this.onChangePulpSelect(event)) + html + .find('input.pulpRulesSelect[type=checkbox]') + .on('click', event => this.onClickPulp(event)) + html + .find('button[name=reset]') + .on('click', event => this.onResetDefaults(event)) + } + + onChangePulpSelect (event) { + const val = $(event.currentTarget).val() + if (val === 'none' || val === 'all') { + $('#rules-settings') + .find('input.pulpRulesSelect[type=checkbox]') + .each(function () { + const checkbox = $(this) + if (val === 'none') { + checkbox.prop('checked', false) + } else { + checkbox.prop('checked', true) + } + }) + } + } + + onClickPulp (event) { + const pulpRules = { + true: false, + false: false + } + $('#rules-settings') + .find('input.pulpRulesSelect[type=checkbox]') + .each(function () { + const checkbox = $(this) + if (checkbox.prop('checked')) { + pulpRules.true = true + } else { + pulpRules.false = true + } + }) + $('#pulpRulesSelect').val( + pulpRules.true ? (pulpRules.false ? 'some' : 'all') : 'none' + ) + } + + async onResetDefaults (event) { + event.preventDefault() + for await (const [k, v] of Object.entries(SETTINGS)) { + await game.settings.set('CoC7', k, v?.default) + } + return this.render() + } + + async _updateObject (event, data) { + const pulpRules = { + true: false, + false: false + } + for await (const key of Object.keys(SETTINGS)) { + game.settings.set('CoC7', key, data[key]) + if (key.match(/^pulpRule.{2,}$/)) { + pulpRules[data[key]] = true + } + } + game.settings.set('CoC7', 'pulpRules', pulpRules.true && !pulpRules.false) + } +} diff --git a/module/scripts/handlebars-helper.js b/module/scripts/handlebars-helper.js new file mode 100644 index 00000000..8e73d8e8 --- /dev/null +++ b/module/scripts/handlebars-helper.js @@ -0,0 +1,10 @@ +/* global Handlebars */ +import { chatHelper } from '../chat/helper.js' + +export const handlebarsHelper = function () { + Handlebars.registerHelper('rollActorImg', function (actorKey) { + const img = chatHelper.getActorImgFromKey(actorKey) + if (img) return img + return '../icons/svg/mystery-man-black.svg' + }) +} diff --git a/module/scripts/load-templates.js b/module/scripts/load-templates.js index f76ee969..38c58251 100644 --- a/module/scripts/load-templates.js +++ b/module/scripts/load-templates.js @@ -8,22 +8,26 @@ export const preloadHandlebarsTemplates = async function () { /** Define template paths to load */ const templatePaths = [ - 'systems/CoC7/templates/actors/parts/actor-skills.html', 'systems/CoC7/templates/actors/parts/npc-skills.html', - 'systems/CoC7/templates/actors/parts/actor-weapons.html', 'systems/CoC7/templates/actors/parts/npc-combat.html', - 'systems/CoC7/templates/actors/parts/character-development.html', 'systems/CoC7/templates/actors/parts/actor-inventory.html', + 'systems/CoC7/templates/actors/parts/actor-inventory-items.html', 'systems/CoC7/templates/actors/parts/actor-background.html', + 'systems/CoC7/templates/common/active-effects.hbs', + 'systems/CoC7/templates/actors/parts/actor-mythos-enounters.hbs', + 'systems/CoC7/templates/actors/parts/actor-keeper-mythos-enounters.hbs', 'systems/CoC7/templates/actors/parts/actor-skills-v2.html', 'systems/CoC7/templates/actors/parts/actor-weapons-v2.html', 'systems/CoC7/templates/actors/parts/character-development-v2.html', 'systems/CoC7/templates/actors/parts/development-controls.html', 'systems/CoC7/templates/actors/parts/vitals.html', 'systems/CoC7/templates/actors/parts/combat.html', + 'systems/CoC7/templates/actors/character-sheet-v2.html', + 'systems/CoC7/templates/actors/character/summary.html', - 'systems/CoC7/templates/items/book/details.hbs' + 'systems/CoC7/templates/items/book/details.html', + 'systems/CoC7/templates/items/spell/details.html' ] /** Load the template parts */ diff --git a/module/scripts/register-settings.js b/module/scripts/register-settings.js index 392e11c8..3f786bf2 100644 --- a/module/scripts/register-settings.js +++ b/module/scripts/register-settings.js @@ -1,52 +1,35 @@ -/* global CONFIG, game */ +/* global $, CONFIG, game, ui */ import { CoC7DecaderDie } from '../apps/decader-die.js' +import { CoC7DecaderDieOther } from '../apps/decader-die-other.js' +import { CoC7GameRuleSettings } from './game-rules.js' +import { CoC7DirectoryPicker } from './coc7-directory-picker.js' export function registerSettings () { /** * Rules */ - game.settings.register('CoC7', 'pulpRules', { - name: 'SETTINGS.PulpRules', - hint: 'SETTINGS.PulpRulesHint', - scope: 'world', - config: true, - default: false, - type: Boolean + game.settings.registerMenu('CoC7', 'gameRules', { + name: 'CoC7.Settings.Rules.Name', + label: 'CoC7.Settings.Rules.Label', + hint: 'CoC7.Settings.Rules.Hint', + icon: 'fas fa-book', + type: CoC7GameRuleSettings, + restricted: true }) - game.settings.register('CoC7', 'developmentRollForLuck', { - name: 'SETTINGS.developmentRollForLuck', - hint: 'SETTINGS.developmentRollForLuckHint', + CoC7GameRuleSettings.registerSettings() + + game.settings.register('CoC7', 'dholeUploadDirectory', { + name: 'CoC7.Settings.DholeUpload.Directory.Name', + hint: 'CoC7.Settings.DholeUpload.Directory.Hint', scope: 'world', config: true, - default: false, - type: Boolean - }) - game.settings.register('CoC7', 'opposedRollTieBreaker', { - name: 'SETTINGS.OpposedRollTieBreaker', - hint: 'SETTINGS.OpposedRollTieBreakerHint', - scope: 'wolrd', - config: true, - default: false, - type: Boolean + type: CoC7DirectoryPicker.DefaultDirectory, + default: '[data] worlds/' + game.world.id + '/dhole-images' }) /** * Initiative */ - /** Set the initiative rule */ - game.settings.register('CoC7', 'initiativeRule', { - name: 'SETTINGS.InitiativeRule', - hint: 'SETTINGS.InitiativeRuleHint', - scope: 'world', - config: true, - default: 'basic', - type: String, - choices: { - basic: 'SETTINGS.InitiativeRuleBasic', - optional: 'SETTINGS.InitiativeRuleOptional' - }, - onChange: rule => _setInitiativeOptions(rule) - }) /** Set displaying dices for init roll */ game.settings.register('CoC7', 'displayInitDices', { name: 'SETTINGS.displayInitDices', @@ -125,6 +108,24 @@ export function registerSettings () { /** * Chat Cards */ + /** Trusted players will be allowed to modify chat cards */ + game.settings.register('CoC7', 'trustedCanModfyChatCard', { + name: 'SETTINGS.TrustedCanModfyChatCard', + hint: 'SETTINGS.TrustedCanModfyChatCardHint', + scope: 'world', + config: true, + default: false, + type: Boolean + }) + /** Trusted players will be allowed to see chat cards private sections */ + game.settings.register('CoC7', 'trustedCanSeeChatCard', { + name: 'SETTINGS.TrustedCanSeeChatCard', + hint: 'SETTINGS.TrustedCanSeeChatCardHint', + scope: 'world', + config: true, + default: false, + type: Boolean + }) /** Set the need to display actor image on chat cards */ game.settings.register('CoC7', 'displayActorOnCard', { name: 'SETTINGS.DisplayActorOnCard', @@ -177,6 +178,44 @@ export function registerSettings () { default: false, type: Boolean }) + game.settings.register('CoC7', 'distanceElevation', { + name: 'SETTINGS.CheckElevation', + hint: 'SETTINGS.CheckElevationHint', + scope: 'world', + config: true, + default: true, + type: Boolean + }) + + /** + * Game Artwork Settings + */ + game.settings.register('CoC7', 'overrideGameArtwork', { + name: 'SETTINGS.OverrideGameArtwork', + hint: 'SETTINGS.OverrideGameArtworkHint', + scope: 'world', + config: true, + default: false, + type: Boolean + }) + if (game.settings.get('CoC7', 'overrideGameArtwork')) { + game.settings.register('CoC7', 'artPauseImage', { + name: 'SETTINGS.ArtPauseImage', + hint: 'SETTINGS.ArtPauseImageHint', + scope: 'world', + config: true, + default: 'systems/CoC7/assets/icons/time-trap.svg', + type: String + }) + game.settings.register('CoC7', 'artPauseText', { + name: 'SETTINGS.ArtPauseText', + hint: 'SETTINGS.ArtPauseTextHint', + scope: 'world', + config: true, + default: 'The Blind Idiot God is dreaming...', + type: String + }) + } /** * Sheet settings @@ -188,6 +227,20 @@ export function registerSettings () { default: false, type: Boolean }) + game.settings.register('CoC7', 'toolTipDelay', { + name: 'CoC7.toolTipDelay', + scope: 'world', + config: true, + default: 2000, + type: Number + }) + game.settings.register('CoC7', 'showIconsOnly', { + name: 'SETTINGS.showIconsOnly', + scope: 'world', + config: true, + default: false, + type: Boolean + }) /** Allow player to unlock the sheet outside of creation mode */ game.settings.register('CoC7', 'playerUnlockSheetMode', { name: 'SETTINGS.PlayerUnlockSheetMode', @@ -315,8 +368,17 @@ export function registerSettings () { scope: 'world', config: true, default: 16, - type: Number + type: Number, + onChange: size => _setRootFontSize(size) }) + + function _setRootFontSize (size) { + $(':root').css('font-size', size) + ui.sidebar.render(true) + for (const [, w] of Object.entries(ui.windows)) { + w.render(true) + } + } } /** @@ -339,6 +401,19 @@ export function registerSettings () { type: Boolean }) + /** + * Chases + */ + // MOVED TO CHASSE INDIVIDUAL SETTING + // game.settings.register('CoC7', 'chaseShowTokenMovement', { + // name: 'SETTINGS.ChaseShowTokenMovement', + // hint: 'SETTINGS.ChaseShowTokenMovementHint', + // scope: 'world', + // config: true, + // default: true, + // type: Boolean + // }) + /** * Dice So Nice */ @@ -378,15 +453,30 @@ export function registerSettings () { game.settings.register('CoC7', 'debugmode', { name: 'SETTINGS.DebugMode', hint: 'SETTINGS.DebugModeHint', + scope: 'client', + config: true, + type: Boolean, + default: false + }) + game.settings.register('CoC7', 'experimentalFeatures', { + name: 'SETTINGS.ShowExperimentalFeatures', + hint: 'SETTINGS.ShowExperimentalFeaturesHint', scope: 'world', config: true, type: Boolean, default: false }) - /** * Other settings */ + game.settings.register('CoC7', 'hiddendevmenu', { + name: 'Hidden dev menu', + hint: 'Use at your own risk', + scope: 'world', + config: false, + type: Boolean, + default: false + }) game.settings.register('CoC7', 'developmentEnabled', { name: 'Dev phased allowed', scope: 'world', @@ -394,6 +484,15 @@ export function registerSettings () { type: Boolean, default: false }) + /** Feat: welcome message */ + game.settings.register('CoC7', 'showWelcomeMessage', { + name: 'SETTINGS.showWelcomeMessage', + hint: 'SETTINGS.showWelcomeMessage', + scope: 'world', + config: false, + default: true, + type: Boolean + }) game.settings.register('CoC7', 'charCreationEnabled', { name: 'Char creation allowed', scope: 'world', @@ -405,8 +504,13 @@ export function registerSettings () { name: 'System update version', scope: 'world', config: false, - type: Number, - default: '0.2' + type: String, + default: '0' + }) + game.settings.register('CoC7', 'systemUpdatedModuleVersion', { + scope: 'world', + config: false, + default: {} }) game.settings.register('CoC7', 'xpEnabled', { name: 'Enable XP gain', @@ -415,28 +519,19 @@ export function registerSettings () { type: Boolean, default: true }) + game.settings.register('CoC7', 'showInstructions', { + name: 'Show changelog/instructions', + scope: 'world', + config: false, + type: String, + default: '0' + }) /** Set an initiative formula for the system */ CONFIG.Combat.initiative = { formula: '@characteristics.dex.value', decimals: 4 } CONFIG.debug.hooks = !!game.settings.get('CoC7', 'debugmode') - function _setInitiativeOptions (rule) { - let decimals = 0 - switch (rule) { - case 'optional': - decimals = 2 - break - case 'basic': - decimals = 0 - break - } - CONFIG.Combat.initiative = { - formula: null, - decimals: decimals - } - } - _setInitiativeOptions(game.settings.get('CoC7', 'initiativeRule')) - CONFIG.Dice.terms.t = CoC7DecaderDie + CONFIG.Dice.terms.o = CoC7DecaderDieOther } diff --git a/module/scripts/register-sheets.js b/module/scripts/register-sheets.js index 4304a49e..06cd8aba 100644 --- a/module/scripts/register-sheets.js +++ b/module/scripts/register-sheets.js @@ -1,11 +1,10 @@ -/* global Actors, Items, ItemSheet */ +/* global Actors, ActorSheet, Items, ItemSheet */ -import { CoC7ActorSheet } from '../actors/sheets/base.js' import { CoC7ArchetypeSheet } from '../items/sheets/archetype.js' import { CoC7BookSheet } from '../items/book/sheet.js' -import { CoC7CharacterSheet } from '../actors/sheets/actor-sheet.js' -import { CoC7CharacterSheetV2 } from '../actors/sheets/character.js' -import { CoC7ChaseSheet } from '../items/sheets/chase.js' +import { CoC7CharacterSheet } from '../actors/sheets/character.js' +import { CoC7ContainerSheet } from '../actors/sheets/container.js' +import { CoC7ChaseSheet } from '../items/chase/sheet.js' import { CoC7CreatureSheet } from '../actors/sheets/creature-sheet.js' import { CoC7ItemSheet } from '../items/sheets/item-sheet.js' import { CoC7ItemSheetV2 } from '../items/sheets/item-sheetV2.js' @@ -13,14 +12,14 @@ import { CoC7NPCSheet } from '../actors/sheets/npc-sheet.js' import { CoC7OccupationSheet } from '../items/sheets/occupation.js' import { CoC7SetupSheet } from '../items/sheets/setup.js' import { CoC7SkillSheet } from '../items/sheets/skill.js' -import { CoC7SpellSheet } from '../items/sheets/spell.js' +import { CoC7SpellSheet } from '../items/spell/sheet.js' import { CoC7StatusSheet } from '../items/sheets/status.js' import { CoC7TalentSheet } from '../items/sheets/talent.js' import { CoC7VehicleSheet } from '../actors/sheets/vehicle.js' import { CoC7WeaponSheet } from '../items/sheets/weapon-sheet.js' export function registerSheets () { - Actors.unregisterSheet('core', CoC7ActorSheet) + Actors.unregisterSheet('core', ActorSheet) Actors.registerSheet('CoC7', CoC7NPCSheet, { types: ['npc'], makeDefault: true @@ -33,8 +32,11 @@ export function registerSheets () { types: ['creature'], makeDefault: true }) - Actors.registerSheet('CoC7', CoC7CharacterSheet, { types: ['character'] }) - Actors.registerSheet('CoC7', CoC7CharacterSheetV2, { + Actors.registerSheet('CoC7', CoC7ContainerSheet, { + types: ['container'], + makeDefault: true + }) + Actors.registerSheet('CoC7', CoC7CharacterSheet, { types: ['character'], makeDefault: true }) diff --git a/module/scripts/register-tours.js b/module/scripts/register-tours.js new file mode 100644 index 00000000..8535c43d --- /dev/null +++ b/module/scripts/register-tours.js @@ -0,0 +1,25 @@ +/* global game */ +import { EnableVariantRulesEn } from '../tours/enable-variant-rules-en.js' +import { EnableVariantRulesFr } from '../tours/enable-variant-rules-fr.js' + +export async function registerTours () { + try { + let lang = game.i18n.lang + const tours = { + en: { + 'enable-variant-rules': EnableVariantRulesEn + }, + fr: { + 'enable-variant-rules': EnableVariantRulesFr + } + } + if (typeof tours[lang] === 'undefined') { + lang = 'en' + } + for (const tourName in tours[lang]) { + game.tours.register('CoC7', tourName, new tours[lang][tourName]()) + } + } catch (err) { + console.error('TOUR ERROR', err) + } +} diff --git a/module/settings-directory.js b/module/settings-directory.js new file mode 100644 index 00000000..0d65eb37 --- /dev/null +++ b/module/settings-directory.js @@ -0,0 +1,41 @@ +/* global Dialog, game, Settings */ + +export class CoC7SettingsDirectory extends Settings { + activateListeners (html) { + super.activateListeners(html) + if (game.user.isGM) { + html + .find('#settings-game') + .append( + '' + ) + html.find('.trigger-data-migration').click(() => { + new Dialog( + { + title: game.i18n.localize('CoC7.Migrate.TriggerTitle'), + content: game.i18n.localize('CoC7.Migrate.TriggerContents'), + buttons: { + migrate: { + icon: '', + label: game.i18n.localize('CoC7.Migrate.TriggerRestart'), + callback: async () => { + await game.settings.set('CoC7', 'systemUpdateVersion', 0) + window.location.reload() + } + }, + close: { + icon: '', + label: game.i18n.localize('Cancel'), + callback: () => {} + } + }, + default: 'close' + }, + {} + ).render(true) + }) + } + } +} diff --git a/module/tours/enable-variant-rules-en.js b/module/tours/enable-variant-rules-en.js new file mode 100644 index 00000000..c557d1ef --- /dev/null +++ b/module/tours/enable-variant-rules-en.js @@ -0,0 +1,69 @@ +/* global mergeObject */ +import { CoC7Tour } from '../apps/coc7-tour.js' + +export class EnableVariantRulesEn extends CoC7Tour { + constructor (config) { + super(mergeObject({ + title: 'Enable optional/variant rules.', + description: 'Learn how to enable Pulp Cthulhu rules, or other variant rules', + canBeResumed: false, + display: true, + steps: [ + { + id: 'goto-settings', + selector: '[data-tab="settings"]', + title: 'COC7.Tour.GotoSettingsTitle', + content: 'COC7.Tour.GotoSettingsContent', + action: 'click' + }, + { + id: 'goto-configure', + selector: '[data-action="configure"]', + title: 'COC7.Tour.GotoConfigureTitle', + content: 'COC7.Tour.GotoConfigureContent', + action: 'click' + }, + { + id: 'goto-system-settings', + selector: '[data-tab="system"]', + title: 'COC7.Tour.GotoSystemSettingsTitle', + content: 'COC7.Tour.GotoSystemSettingsContent', + action: 'click' + }, + { + id: 'goto-game-rules', + selector: '[data-key="CoC7.gameRules"]', + title: 'COC7.Tour.GotoGameRulesTitle', + content: 'COC7.Tour.GotoGameRulesContent', + action: 'click' + }, + { + id: 'save-game-rules', + selector: '#rules-settings [name=submit]', + title: 'COC7.Tour.SaveGameRulesTitle', + content: 'COC7.Tour.SaveGameRulesContent' + }, + { + id: 'save-system-settings-rules', + selector: '#client-settings [name=submit]', + title: 'COC7.Tour.SaveSystemSettingsTitle', + content: 'COC7.Tour.SaveSystemSettingsContent' + } + ], + localization: { + 'COC7.Tour.GotoSettingsTitle': 'Game Settings', + 'COC7.Tour.GotoSettingsContent': 'Go to the Game Settings tab', + 'COC7.Tour.GotoConfigureTitle': 'Configure Settings', + 'COC7.Tour.GotoConfigureContent': 'Click on the Configure Settings button', + 'COC7.Tour.GotoSystemSettingsTitle': 'System Settings', + 'COC7.Tour.GotoSystemSettingsContent': 'Go to the System Settings tab', + 'COC7.Tour.GotoGameRulesTitle': 'Configure Variant/Optional Rules', + 'COC7.Tour.GotoGameRulesContent': 'Click on the Configure Variant/Optional Rules button', + 'COC7.Tour.SaveGameRulesTitle': 'Save rule changes', + 'COC7.Tour.SaveGameRulesContent': 'Once you have made your changes click on the Save Changes button', + 'COC7.Tour.SaveSystemSettingsTitle': 'Save system settings', + 'COC7.Tour.SaveSystemSettingsContent': 'Finally click on the Save Changes button' + } + }, config)) + } +} diff --git a/module/tours/enable-variant-rules-fr.js b/module/tours/enable-variant-rules-fr.js new file mode 100644 index 00000000..9b46b0e9 --- /dev/null +++ b/module/tours/enable-variant-rules-fr.js @@ -0,0 +1,24 @@ +import { EnableVariantRulesEn } from './enable-variant-rules-en.js' + +export class EnableVariantRulesFr extends EnableVariantRulesEn { + constructor (config) { + super({ + title: 'Activez les règles optionnelles.', + description: 'Activez les règles optionelles et Pulp Cthulhu', + localization: { + 'COC7.Tour.GotoSettingsTitle': 'Paramètres', + 'COC7.Tour.GotoSettingsContent': 'Ouvrir l\'onglet "Paramètres"', + 'COC7.Tour.GotoConfigureTitle': 'Configuration des options', + 'COC7.Tour.GotoConfigureContent': 'Cliquez sur "Configuration des options"', + 'COC7.Tour.GotoSystemSettingsTitle': 'Système de jeu', + 'COC7.Tour.GotoSystemSettingsContent': 'Ouvrez l\'onglet "Système de jeu"', + 'COC7.Tour.GotoGameRulesTitle': 'Configurer les variantes/règles optionnelles', + 'COC7.Tour.GotoGameRulesContent': 'Clickez sur le boutton "Configurer les variantes/règles optionnelles"', + 'COC7.Tour.SaveGameRulesTitle': 'Sauvegarder les modifications', + 'COC7.Tour.SaveGameRulesContent': 'Apres avoir choisis les options cliquez sur le bouton "Sauvegarder les modifications"', + 'COC7.Tour.SaveSystemSettingsTitle': 'Saugarder', + 'COC7.Tour.SaveSystemSettingsContent': 'Cliquez sur "Sauvegarer" !' + } + }) + } +} diff --git a/module/updater.js b/module/updater.js index d162f380..b0e4f83c 100644 --- a/module/updater.js +++ b/module/updater.js @@ -1,16 +1,75 @@ -/* global CONFIG, Dialog, expandObject, foundry, game, isNewerVersion */ +/* global CONFIG, Dialog, expandObject, foundry, game, isNewerVersion, mergeObject, ui */ +import { CoC7Item } from './items/item.js' + export class Updater { static async checkForUpdate () { - this.systemUpdateVersion = String( - game.settings.get('CoC7', 'systemUpdateVersion') + const systemUpdateVersion = game.settings.get('CoC7', 'systemUpdateVersion') + + const runMigrate = isNewerVersion( + game.system.data.version, + systemUpdateVersion ?? '0' ) - if (isNewerVersion('0.3', this.systemUpdateVersion)) { + this.updatedModules = + game.settings.get('CoC7', 'systemUpdatedModuleVersion') || {} + this.currentModules = {} + for (const pack of game.packs) { + if ( + !['CoC7', 'system', 'world'].includes( + pack.metadata.package || pack.metadata.packageType + ) && + ['Actor', 'Item', 'Scene'].includes(pack.metadata.type) + ) { + if ( + !Object.prototype.hasOwnProperty.call( + this.currentModules, + pack.metadata.package || pack.metadata.packageType + ) + ) { + // Only check each package once + if ( + !Object.prototype.hasOwnProperty.call( + this.updatedModules, + pack.metadata.package || pack.metadata.packageType + ) || + String( + this.updatedModules[ + pack.metadata.package || pack.metadata.packageType + ] + ) !== + String( + game.modules.get( + pack.metadata.package || pack.metadata.packageType + ).data.version + ) + ) { + // Package has not been updated before or the version number has changed + this.currentModules[ + pack.metadata.package || pack.metadata.packageType + ] = game.modules.get( + pack.metadata.package || pack.metadata.packageType + ).data.version + } + } + } + } + if (runMigrate || Object.keys(this.currentModules).length > 0) { if (game.user.isGM) { new Dialog({ title: game.i18n.localize('CoC7.Migrate.Title'), - content: game.i18n.format('CoC7.Migrate.Message', { - version: game.system.data.version - }), + content: game.i18n.format( + Object.keys(this.currentModules).length === 0 + ? 'CoC7.Migrate.Message' + : 'CoC7.Migrate.WithModulesMessage', + { + version: game.system.data.version, + modules: + '
                                                        • ' + + Object.keys(this.currentModules) + .map(mod => game.modules.get(mod).data.name) + .join('
                                                        • ') + + '
                                                        ' + } + ), buttons: { update: { label: game.i18n.localize('CoC7.Migrate.ButtonUpdate'), @@ -38,16 +97,53 @@ export class Updater { } static async update () { + await this.updateDocuments() + + // // If we put up a temporary scene return the user and remove it + // if ( + // typeof this.temporaryScene !== 'undefined' && + // typeof this.originalScene !== 'undefined' + // ) { + // await this.originalScene.view() + // await new Promise(resolve => setTimeout(resolve, 1000)) + // await this.temporaryScene.delete() + // } + + // Migrate Settings if Pulp Rules is enabled turn on all rules + if (game.settings.get('CoC7', 'pulpRules')) { + game.settings.set('CoC7', 'pulpRuleDoubleMaxHealth', true) + game.settings.set('CoC7', 'pulpRuleDevelopmentRollLuck', true) + game.settings.set('CoC7', 'pulpRuleArchetype', true) + game.settings.set('CoC7', 'pulpRuleOrganization', true) + game.settings.set('CoC7', 'pulpRuleTalents', true) + game.settings.set('CoC7', 'pulpRuleFasterRecovery', true) + game.settings.set('CoC7', 'pulpRuleIgnoreMajorWounds', true) + } + + const settings = mergeObject(this.updatedModules || {}, this.currentModules) + game.settings.set('CoC7', 'systemUpdatedModuleVersion', settings) + game.settings.set('CoC7', 'systemUpdateVersion', game.system.data.version) + + ui.notifications.info(game.i18n.format('CoC7.Migrate.Complete'), { + permanent: true + }) + } + + static async updateDocuments () { // Migrate World Actors for (const actor of game.actors.contents) { try { const updateData = this.migrateActorData(actor.toObject()) if (!foundry.utils.isObjectEmpty(updateData)) { - console.log(`Migrating Actor entity ${actor.name}`) + console.log(`Migrating Actor document ${actor.name}`) await actor.update(updateData, { enforceTypes: false }) } } catch (err) { - err.message = `Failed CoC7 system migration for Actor ${actor.name}: ${err.message}` + err.message = game.i18n.format('CoC7.Migrate.ErrorActor', { + name: actor.name, + message: err.message + }) + ui.notifications.error(err.message, { permanent: true }) console.error(err) } } @@ -57,11 +153,15 @@ export class Updater { try { const updateData = Updater.migrateItemData(item.toObject()) if (!foundry.utils.isObjectEmpty(updateData)) { - console.log(`Migrating Item entity ${item.name}`) + console.log(`Migrating Item document ${item.name}`) await item.update(updateData, { enforceTypes: false }) } } catch (err) { - err.message = `Failed CoC7 system migration for Item ${item.name}: ${err.message}` + err.message = game.i18n.format('CoC7.Migrate.ErrorItem', { + name: item.name, + message: err.message + }) + ui.notifications.error(err.message, { permanent: true }) console.error(err) } } @@ -71,11 +171,15 @@ export class Updater { try { const updateData = Updater.migrateTableData(table.toObject()) if (!foundry.utils.isObjectEmpty(updateData)) { - console.log(`Migrating Table entity ${table.name}`) + console.log(`Migrating Table document ${table.name}`) await table.update(updateData, { enforceTypes: false }) } } catch (err) { - err.message = `Failed CoC7 system migration for Table ${table.name}: ${err.message}` + err.message = game.i18n.format('CoC7.Migrate.ErrorTable', { + name: table.name, + message: err.message + }) + ui.notifications.error(err.message, { permanent: true }) console.error(err) } } @@ -85,11 +189,71 @@ export class Updater { try { const updateData = Updater.migrateMacroData(macro.toObject()) if (!foundry.utils.isObjectEmpty(updateData)) { - console.log(`Migrating Macro entity ${macro.name}`) + console.log(`Migrating Macro document ${macro.name}`) await macro.update(updateData, { enforceTypes: false }) } } catch (err) { - err.message = `Failed CoC7 system migration for Table ${macro.name}: ${err.message}` + err.message = game.i18n.format('CoC7.Migrate.ErrorMacro', { + name: macro.name, + message: err.message + }) + ui.notifications.error(err.message, { permanent: true }) + console.error(err) + } + } + + // Migrate Scenes [Token] Actors + for (const scene of game.scenes) { + try { + const updateData = Updater.migrateSceneData(scene.data) + if (!foundry.utils.isObjectEmpty(updateData)) { + console.log(`Migrating Scene document ${scene.name}`) + // if ( + // scene.id === game.scenes.current.id && + // typeof this.temporaryScene === 'undefined' && + // typeof this.originalScene === 'undefined' + // ) { + // this.temporaryScene = await Scene.create({ + // name: game.i18n.format('CoC7.Migrate.UpdateCurrentScene'), + // backgroundColor: '#000000' + // }) + // this.originalScene = scene + // await DrawingDocument.create( + // { + // author: game.user.id, + // shape: { + // type: 'r', + // width: 1600, + // height: 200 + // }, + // x: 2200, + // y: 2200, + // z: 0, + // strokeWidth: 0, + // text: game.i18n.format('CoC7.Migrate.UpdateCurrentScene'), + // fontFamily: 'Signika', + // fontSize: 128, + // textColor: '#FFFFFF', + // textAlpha: 1, + // hidden: false, + // locked: true + // }, + // { + // parent: this.temporaryScene + // } + // ) + // await this.temporaryScene.view() + // await new Promise(resolve => setTimeout(resolve, 1000)) + // } + await scene.update(updateData, { enforceTypes: false }) + } + scene.tokens.forEach(t => (t._actor = null)) + } catch (err) { + err.message = game.i18n.format('CoC7.Migrate.ErrorScene', { + name: scene.name, + message: err.message + }) + ui.notifications.error(err.message, { permanent: true }) console.error(err) } } @@ -97,14 +261,14 @@ export class Updater { // Migrate World Compendium Packs for (const pack of game.packs) { if ( - pack.metadata.package === 'world' && - ['Actor', 'Item', 'Macro', 'RollTable'].includes(pack.metadata.entity) + (pack.metadata.package || pack.metadata.packageType) !== 'CoC7' && + ['Actor', 'Item', 'Macro', 'RollTable', 'Scene'].includes( + pack.metadata.type + ) ) { await Updater.migrateCompendiumData(pack) } } - - game.settings.set('CoC7', 'systemUpdateVersion', '0.3') } static migrateActorData (actor) { @@ -113,6 +277,10 @@ export class Updater { // Update World Actor Updater._migrateActorCharacterSanity(actor, updateData) Updater._migrateActorArtwork(actor, updateData) + Updater._migrateActorKeeperNotes(actor, updateData) + Updater._migrateActorNpcCreature(actor, updateData) + Updater._migrateActorStatusEffectActive(actor, updateData) + Updater._migrateActorSanLossReasons(actor, updateData) // Migrate World Actor Items if (actor.items) { @@ -135,21 +303,29 @@ export class Updater { } static async migrateCompendiumData (pack) { - const entity = pack.metadata.entity - if (!['Actor', 'Item', 'Macro', 'RollTable'].includes(entity)) return + const documentType = pack.metadata.type + if ( + !['Actor', 'Item', 'Macro', 'RollTable', 'Scene'].includes(documentType) + ) { + return + } // Unlock the pack for editing const wasLocked = pack.locked await pack.configure({ locked: false }) - await pack.migrate() + try { + await pack.migrate() + } catch (err) { + // This errors on v10 + } const documents = await pack.getDocuments() // Iterate over compendium entries - applying fine-tuned migration functions for (const doc of documents) { let updateData = {} try { - switch (entity) { + switch (documentType) { case 'Actor': updateData = Updater.migrateActorData(doc.toObject()) break @@ -162,16 +338,24 @@ export class Updater { case 'RollTable': updateData = Updater.migrateTableData(doc.toObject()) break + case 'Scene': + updateData = Updater.migrateSceneData(doc.data) + break } // Save the entry, if data was changed if (!foundry.utils.isObjectEmpty(updateData)) { console.log( - `Migrated ${entity} entity ${doc.name} in Compendium ${pack.collection}` + `Migrated ${documentType} document ${doc.name} in Compendium ${pack.collection}` ) await doc.update(updateData) } } catch (err) { - err.message = `Failed CoC7 system migration for entity ${doc.name} in pack ${pack.collection}: ${err.message}` + err.message = game.i18n.format('CoC7.Migrate.ErrorDocumentPack', { + name: doc.name, + collection: pack.collection, + message: err.message + }) + ui.notifications.error(err.message, { permanent: true }) console.error(err) } } @@ -187,6 +371,12 @@ export class Updater { Updater._migrateItemExperience(item, updateData) Updater._migrateItemArtwork(item, updateData) Updater._migrateItemBookAutomated(item, updateData) + Updater._migrateItemKeeperNotes(item, updateData) + Updater._migrateItemSpellAutomated(item, updateData) + Updater._migrateItemKeeperNotesMerge(item, updateData) + Updater._migrateItemSetupEras(item, updateData) + Updater._migrateItemv10(item, updateData) + Updater._migrateItemBookUnits(item, updateData) return updateData } @@ -209,6 +399,76 @@ export class Updater { return updateData } + static migrateSceneData (scene) { + const tokens = scene.tokens.map(token => { + const t = token.toObject() + const updateData = {} + Updater._migrateTokenArtwork(t, updateData) + if (Object.keys(updateData).length) { + foundry.utils.mergeObject(t, updateData) + } + if (!t.actorId || t.actorLink) { + t.actorData = {} + } else if (!game.actors.has(t.actorId)) { + t.actorId = null + t.actorData = {} + } else if (!t.actorLink) { + const actorData = foundry.utils.duplicate(t.actorData) + actorData.type = token.actor?.type + const update = Updater.migrateActorData(actorData) + ;['items', 'effects'].forEach(embeddedName => { + if (!update[embeddedName]?.length) { + return + } + const updates = new Map(update[embeddedName].map(u => [u._id, u])) + t.actorData[embeddedName].forEach(original => { + const update = updates.get(original._id) + if (update) mergeObject(original, update) + }) + delete update[embeddedName] + }) + mergeObject(t.actorData, update) + } + return t + }) + return { tokens } + } + + static _migrateItemKeeperNotes (item, updateData) { + if ( + [ + 'archetype', + 'chase', + 'item', + 'occupation', + 'setup', + 'skill', + 'spell', + 'status', + 'talent', + 'weapon' + ].includes(item.type) + ) { + if (typeof item.data.description === 'string') { + updateData['data.description'] = { + value: item.data.description, + keeper: '' + } + } else if ( + typeof item.data.description === 'undefined' || + item.data.description === null + ) { + updateData['data.description'] = { + value: '', + keeper: '' + } + } else if (typeof item.data.description.keeper === 'undefined') { + updateData['data.description.keeper'] = '' + } + } + return updateData + } + static _migrateItemExperience (item, updateData) { if (item.type === 'skill') { if (typeof item.data.adjustments?.experience === 'undefined') { @@ -219,14 +479,13 @@ export class Updater { } static _migrateItemArtwork (item, updateData) { - const regEx = new RegExp(/systems\/CoC7\/artwork\/icons\/(.+)/) - let image = String(item.img).match(regEx) + let image = String(item.img).match(/systems\/CoC7\/artwork\/icons\/(.+)/) if (image !== null) { updateData.img = 'systems/CoC7/assets/icons/' + image[1] } if (item.type === 'setup') { for (const [k, v] of Object.entries(item.data.items)) { - image = String(v.img).match(regEx) + image = String(v.img).match(/systems\/CoC7\/artwork\/icons\/(.+)/) if (image !== null) { if (typeof updateData['data.items'] === 'undefined') { updateData['data.items'] = item.data.items @@ -237,7 +496,7 @@ export class Updater { } } else if (item.type === 'occupation') { for (const [k, v] of Object.entries(item.data.skills)) { - image = String(v.img).match(regEx) + image = String(v.img).match(/systems\/CoC7\/artwork\/icons\/(.+)/) if (image !== null) { if (typeof updateData['data.skills'] === 'undefined') { updateData['data.skills'] = item.data.skills @@ -248,7 +507,7 @@ export class Updater { } for (const [o, g] of Object.entries(item.data.groups)) { for (const [k, v] of Object.entries(g.skills)) { - image = String(v.img).match(regEx) + image = String(v.img).match(/systems\/CoC7\/artwork\/icons\/(.+)/) if (image !== null) { if (typeof updateData['data.groups'] === 'undefined') { updateData['data.groups'] = item.data.groups @@ -260,7 +519,7 @@ export class Updater { } } else if (item.type === 'book') { for (const [k, v] of Object.entries(item.data.spells)) { - image = String(v.img).match(regEx) + image = String(v.img).match(/systems\/CoC7\/artwork\/icons\/(.+)/) if (image !== null) { if (typeof updateData['data.spells'] === 'undefined') { updateData['data.spells'] = item.data.spells @@ -271,7 +530,7 @@ export class Updater { } } else if (item.type === 'archetype') { for (const [k, v] of Object.entries(item.data.skills)) { - image = String(v.img).match(regEx) + image = String(v.img).match(/systems\/CoC7\/artwork\/icons\/(.+)/) if (image !== null) { if (typeof updateData['data.skills'] === 'undefined') { updateData['data.skills'] = item.data.skills @@ -284,6 +543,21 @@ export class Updater { return updateData } + static _migrateItemSpellAutomated (item, updateData) { + if (item.type === 'spell' && typeof item.data.cost !== 'undefined') { + updateData['data.castingTime'] = item.data.castingTime || '' + updateData['data.costs.hitPoints'] = item.data.cost.hp || 0 + updateData['data.costs.magicPoints'] = item.data.cost.mp || 0 + updateData['data.costs.sanity'] = item.data.cost.san || 0 + updateData['data.costs.power'] = item.data.cost.pow || 0 + updateData['data.costs.others'] = '' + + updateData['data.-=cost'] = null + updateData['data.description.-=unidentified'] = null + updateData['data.description.-=notes'] = null + } + } + /** * Book automation was increased in 0.6.5 * @@ -304,7 +578,7 @@ export class Updater { updateData['data.mythosRating'] = Number(item.data.mythosRating) || 0 /** Renamed/moved fields */ updateData['data.content'] = item.data.description.unidentified - updateData['data.keeperNotes'] = item.data.description.notes + updateData['data.description.keeper'] = item.data.description.notes /** New fields set default values */ updateData['data.difficultyLevel'] = 'regular' updateData['data.fullStudies'] = 0 @@ -320,7 +594,8 @@ export class Updater { /** New study field default necessary to integer of weeksStudyTime or 0 if not set */ updateData['data.study'] = { necessary: Number(item.data.weeksStudyTime) || 0, - progress: 0 + progress: 0, + units: 'CoC7.weeks' } /** Remove old keys */ updateData['data.-=sanLoss'] = null @@ -336,30 +611,383 @@ export class Updater { return updateData } + static _migrateItemBookUnits (item, updateData) { + if (item.type === 'book') { + if ( + typeof item.data.study.necessary !== 'undefined' && + typeof item.data.study.units === 'undefined' + ) { + updateData['data.study.units'] = 'CoC7.weeks' + } + } + } + + static _migrateItemKeeperNotesMerge (item, updateData) { + if (item.type === 'spell' || item.type === 'book') { + if (typeof item.data.notes !== 'undefined') { + if (typeof item.data.description.keeper !== 'undefined') { + updateData['data.description.keeper'] = + item.data.description.keeper + item.data.notes + } else { + updateData['data.description.keeper'] = item.data.notes + } + updateData['data.-=notes'] = null + } + if (typeof item.data.keeperNotes !== 'undefined') { + if (typeof updateData['data.description.keeper'] !== 'undefined') { + updateData['data.description.keeper'] = + item.data.keeperNotes + updateData['data.description.keeper'] + } else { + updateData['data.description.keeper'] = item.data.keeperNotes + } + updateData['data.-=keeperNotes'] = null + } + } + } + + static _migrateItemv10 (item, updateData) { + if ( + item.type === 'skill' && + (typeof item.data.skillName === 'undefined' || item.data.skillName === '') + ) { + updateData.name = item.name + // Update Polish dodge translation from Uniki to Unik to match update to lang/pl.json + if (updateData.name === 'Uniki') { + updateData.name = 'Unik' + } + const parts = CoC7Item.getNamePartsSpec( + updateData.name, + typeof item.data.specialization?.group === 'string' + ? item.data.specialization.group + : item.data.specialization + ) + updateData.name = parts.name + updateData['data.skillName'] = parts.skillName + updateData['data.specialization'] = parts.specialization + } else if (item.type === 'setup') { + for (const [k, v] of Object.entries(item.data.items)) { + if ( + v.type === 'skill' && + (typeof v.data.skillName === 'undefined' || v.data.skillName === '') + ) { + if (typeof updateData['data.items'] === 'undefined') { + updateData['data.items'] = item.data.items + } + updateData['data.items'][k].name = v.name + if (updateData['data.items'][k].name === 'Uniki') { + updateData['data.items'][k].name = 'Unik' + } + const parts = CoC7Item.getNamePartsSpec( + updateData['data.items'][k].name, + typeof v.data.specialization?.group === 'string' + ? v.data.specialization.group + : v.data.specialization + ) + updateData['data.items'][k].name = parts.name + updateData['data.items'][k].data.skillName = parts.skillName + updateData['data.items'][k].data.specialization = parts.specialization + } + } + } else if (item.type === 'occupation') { + for (const [k, v] of Object.entries(item.data.skills)) { + if ( + v.type === 'skill' && + (typeof v.data.skillName === 'undefined' || v.data.skillName === '') + ) { + if (typeof updateData['data.skills'] === 'undefined') { + updateData['data.skills'] = item.data.skills + } + updateData['data.skills'][k].name = v.name + if (updateData['data.skills'][k].name === 'Uniki') { + updateData['data.skills'][k].name = 'Unik' + } + const parts = CoC7Item.getNamePartsSpec( + updateData['data.skills'][k].name, + typeof v.data.specialization?.group === 'string' + ? v.data.specialization.group + : v.data.specialization + ) + updateData['data.skills'][k].name = parts.name + updateData['data.skills'][k].data.skillName = parts.skillName + updateData['data.skills'][k].data.specialization = + parts.specialization + } + } + for (const [o, g] of Object.entries(item.data.groups)) { + for (const [k, v] of Object.entries(g.skills)) { + if ( + v.type === 'skill' && + (typeof v.data.skillName === 'undefined' || v.data.skillName === '') + ) { + if (typeof updateData['data.groups'] === 'undefined') { + updateData['data.groups'] = item.data.groups + } + updateData['data.groups'][o].skills[k].name = v.name + if (updateData['data.groups'][o].skills[k].name === 'Uniki') { + updateData['data.groups'][o].skills[k].name = 'Unik' + } + const parts = CoC7Item.getNamePartsSpec( + updateData['data.groups'][o].skills[k].name, + typeof v.data.specialization?.group === 'string' + ? v.data.specialization.group + : v.data.specialization + ) + updateData['data.groups'][o].skills[k].name = parts.name + updateData['data.groups'][o].skills[k].data.skillName = + parts.skillName + updateData['data.groups'][o].skills[k].data.specialization = + parts.specialization + } + } + } + } else if (item.type === 'archetype') { + for (const [k, v] of Object.entries(item.data.skills)) { + if ( + v.type === 'skill' && + (typeof v.data.skillName === 'undefined' || v.data.skillName === '') + ) { + if (typeof updateData['data.skills'] === 'undefined') { + updateData['data.skills'] = item.data.skills + } + updateData['data.skills'][k].name = v.name + if (updateData['data.skills'][k].name === 'Uniki') { + updateData['data.skills'][k].name = 'Unik' + } + const parts = CoC7Item.getNamePartsSpec( + updateData['data.skills'][k].name, + typeof v.data.specialization?.group === 'string' + ? v.data.specialization.group + : v.data.specialization + ) + updateData['data.skills'][k].name = parts.name + updateData['data.skills'][k].data.skillName = parts.skillName + updateData['data.skills'][k].data.specialization = + parts.specialization + } + } + } + } + + static _migrateItemSetupEras (item, updateData) { + if (item.type === 'setup') { + for (const [key, value] of Object.entries(item.data.eras)) { + if (typeof value.selected !== 'undefined') { + updateData['data.eras.' + key] = value.selected + } + } + } + } + static _migrateActorArtwork (actor, updateData) { - const regEx = new RegExp(/systems\/CoC7\/artwork\/icons\/(.+)/) - let image = String(actor.img).match(regEx) + let image = String(actor.img).match(/systems\/CoC7\/artwork\/icons\/(.+)/) if (image !== null) { updateData.img = 'systems/CoC7/assets/icons/' + image[1] } - image = String(actor.token.img).match(regEx) - if (image !== null) { - updateData['token.img'] = 'systems/CoC7/assets/icons/' + image[1] - } - for (const [k, v] of Object.entries(actor.effects)) { - image = String(v.icon).match(regEx) + if ( + typeof actor.token !== 'undefined' && + typeof actor.token.img !== 'undefined' + ) { + image = String(actor.token.img).match( + /systems\/CoC7\/artwork\/icons\/(.+)/ + ) if (image !== null) { - if (typeof updateData.effects === 'undefined') { - updateData.effects = actor.effects + updateData['token.img'] = 'systems/CoC7/assets/icons/' + image[1] + } + } + if (typeof actor.effects !== 'undefined') { + for (const [k, v] of Object.entries(actor.effects)) { + image = String(v.icon).match(/systems\/CoC7\/artwork\/icons\/(.+)/) + if (image !== null) { + if (typeof updateData.effects === 'undefined') { + updateData.effects = actor.effects + } + updateData.effects[k].icon = 'systems/CoC7/assets/icons/' + image[1] } - updateData.effects[k].icon = 'systems/CoC7/assets/icons/' + image[1] + } + } + return updateData + } + + static _migrateActorKeeperNotes (actor, updateData) { + if (['character', 'npc', 'creature'].includes(actor.type)) { + if ( + typeof actor.data !== 'undefined' && + typeof actor.data.description === 'undefined' + ) { + updateData['data.description'] = { + keeper: '' + } + } + } + return updateData + } + + static _migrateActorSanLossReasons (actor, updateData) { + if ( + actor.type === 'character' && + typeof actor.data?.encounteredCreatures !== 'undefined' + ) { + const groups = {} + for (const sanityLossEvent of actor.data.encounteredCreatures) { + if (sanityLossEvent.totalLoss > 0) { + groups[sanityLossEvent.name] = Math.max( + groups[sanityLossEvent.name] ?? 0, + sanityLossEvent.totalLoss + ) + } + } + const sanityLossEvents = [] + for (const name in groups) { + sanityLossEvents.push({ + type: name, + totalLoss: groups[name], + immunity: false + }) + } + updateData['data.sanityLossEvents'] = sanityLossEvents + updateData['data.-=encounteredCreatures'] = null + } + } + + static _migrateActorStatusEffectActive (actor, updateData) { + if (['character', 'npc', 'creature'].includes(actor.type)) { + if ( + typeof actor.data !== 'undefined' && + (typeof actor.data.status !== 'undefined' || + typeof actor.data.conditions === 'undefined') + ) { + updateData['data.conditions.criticalWounds.value'] = false + updateData['data.conditions.unconscious.value'] = false + updateData['data.conditions.dying.value'] = false + updateData['data.conditions.dead.value'] = false + updateData['data.conditions.prone.value'] = false + updateData['data.conditions.tempoInsane.value'] = false + updateData['data.conditions.indefInsane.value'] = false + if ( + typeof actor.data.status?.criticalWounds?.value !== 'undefined' && + actor.data.status?.criticalWounds.value + ) { + updateData['data.conditions.criticalWounds.value'] = true + } + if ( + typeof actor.data.status?.unconscious?.value !== 'undefined' && + actor.data.status?.unconscious.value + ) { + updateData['data.conditions.unconscious.value'] = true + } + if ( + typeof actor.data.status?.dying?.value !== 'undefined' && + actor.data.status?.dying.value + ) { + updateData['data.conditions.dying.value'] = true + } + if ( + typeof actor.data.status?.dead?.value !== 'undefined' && + actor.data.status?.dead.value + ) { + updateData['data.conditions.dead.value'] = true + } + if ( + typeof actor.data.status?.prone?.value !== 'undefined' && + actor.data.status?.prone.value + ) { + updateData['data.conditions.prone.value'] = true + } + if ( + typeof actor.data.status?.tempoInsane?.value !== 'undefined' && + actor.data.status?.tempoInsane.value + ) { + updateData['data.conditions.tempoInsane.value'] = true + } + if ( + typeof actor.data.status?.indefInsane?.value !== 'undefined' && + actor.data.status?.indefInsane.value + ) { + updateData['data.conditions.indefInsane.value'] = true + } + if (typeof actor.effects !== 'undefined') { + const effects = actor.effects + let changed = false + for (let i = 0, im = effects.length; i < im; i++) { + const effect = effects[i] + const match = effect.icon.match( + /\/(hanging-spider|tentacles-skull|arm-sling|heart-beats|tombstone|knocked-out-stars|falling|skull|unconscious)\./ + ) + if (match !== null) { + let statusId = '' + switch (match[1]) { + case 'hanging-spider': + statusId = 'tempoInsane' + break + case 'tentacles-skull': + statusId = 'indefInsane' + break + case 'arm-sling': + statusId = 'criticalWounds' + break + case 'heart-beats': + statusId = 'dying' + break + case 'tombstone': + case 'skull': + statusId = 'dead' + break + case 'knocked-out-stars': + case 'unconscious': + statusId = 'unconscious' + break + case 'falling': + statusId = 'prone' + break + } + if (statusId !== '') { + if (!updateData[`data.conditions.${statusId}.value`]) { + updateData[`data.conditions.${statusId}.value`] = true + changed = true + } + if (effect.flags.core?.statusId !== statusId) { + effects[i] = mergeObject(effect, { + flags: { + core: { + statusId + } + } + }) + changed = true + } + } + } + } + if (changed) { + updateData.effects = effects + } + } + updateData['data.-=status'] = null + } + } + return updateData + } + + static _migrateActorNpcCreature (actor, updateData) { + if (['npc'].includes(actor.type) && typeof actor.data !== 'undefined') { + if (typeof actor.data.special === 'undefined') { + updateData['data.special'] = { + checkPassed: null, + checkFailled: null + } + } + if (typeof actor.data.attacksPerRound === 'undefined') { + updateData['data.attacksPerRound'] = 1 } } return updateData } static _migrateActorCharacterSanity (actor, updateData) { - if (actor.type === 'character') { + if ( + actor.type === 'character' && + typeof actor.data?.attribs?.san !== 'undefined' + ) { const oneFifthSanity = Math.ceil(actor.data.attribs.san.value / 5) if ( typeof actor.data.attribs.san.dailyLoss === 'undefined' || @@ -395,17 +1023,19 @@ export class Updater { ) { updateData['data.indefiniteInsanityLevel.max'] = oneFifthSanity } - if ( - typeof actor.data.attribs.mp.value === 'undefined' || - actor.data.attribs.mp.value === null - ) { - updateData['data.attribs.mp.value'] = oneFifthSanity - } - if ( - typeof actor.data.attribs.mp.max === 'undefined' || - actor.data.attribs.mp.max === null - ) { - updateData['data.attribs.mp.max'] = oneFifthSanity + if (typeof actor.data.attribs.mp !== 'undefined') { + if ( + typeof actor.data.attribs.mp.value === 'undefined' || + actor.data.attribs.mp.value === null + ) { + updateData['data.attribs.mp.value'] = oneFifthSanity + } + if ( + typeof actor.data.attribs.mp.max === 'undefined' || + actor.data.attribs.mp.max === null + ) { + updateData['data.attribs.mp.max'] = oneFifthSanity + } } if ( typeof actor.data.notes === 'undefined' || @@ -418,8 +1048,7 @@ export class Updater { } static _migrateMacroArtwork (table, updateData) { - const regEx = new RegExp(/systems\/CoC7\/artwork\/icons\/(.+)/) - const image = String(table.img).match(regEx) + const image = String(table.img).match(/systems\/CoC7\/artwork\/icons\/(.+)/) if (image !== null) { updateData.img = 'systems/CoC7/assets/icons/' + image[1] } @@ -427,13 +1056,12 @@ export class Updater { } static _migrateTableArtwork (table, updateData) { - const regEx = new RegExp(/systems\/CoC7\/artwork\/icons\/(.+)/) - let image = String(table.img).match(regEx) + let image = String(table.img).match(/systems\/CoC7\/artwork\/icons\/(.+)/) if (image !== null) { updateData.img = 'systems/CoC7/assets/icons/' + image[1] } for (const [k, v] of Object.entries(table.results)) { - image = String(v.img).match(regEx) + image = String(v.img).match(/systems\/CoC7\/artwork\/icons\/(.+)/) if (image !== null) { if (typeof updateData.results === 'undefined') { updateData.results = table.results @@ -443,4 +1071,12 @@ export class Updater { } return updateData } + + static _migrateTokenArtwork (token, updateData) { + const image = String(token.img).match(/systems\/CoC7\/artwork\/icons\/(.+)/) + if (image !== null) { + updateData.img = 'systems/CoC7/assets/icons/' + image[1] + } + return updateData + } } diff --git a/module/utilities.js b/module/utilities.js index 00ced3e6..88317eeb 100644 --- a/module/utilities.js +++ b/module/utilities.js @@ -1,5 +1,6 @@ -/* global canvas, ChatMessage, CONST, game, getDocumentClass, Macro, Roll, ui */ +/* global canvas, ChatMessage, CONFIG, CONST, Dialog, duplicate, Folder, fromUuid, game, getDocumentClass, Hooks, Macro, Roll, Token, ui */ +import { COC7 } from './config.js' import { CoC7Check } from './check.js' import { CoC7Item } from './items/item.js' import { RollDialog } from './apps/roll-dialog.js' @@ -14,7 +15,7 @@ export class CoC7Utilities { // if (speaker.token) actor = game.actors.tokens[speaker.token]; // if (!actor) actor = game.actors.get(speaker.actor); - // actor.inflictMajorWound(); + // actor.setCondition(COC7.status.criticalWounds); // } static isFormula (x) { @@ -56,16 +57,16 @@ export class CoC7Utilities { const thresholdStr = escaped.match(/[^(]+(?=\))/) if (thresholdStr && thresholdStr.length) { threshold = Number(thresholdStr[0]) - thresholdStr.forEach(match => { + for (const match of thresholdStr) { escaped = escaped.replace(`(${match})`, '') - }) + } } const difficultyStr = escaped.match(/[^[]+(?=\])/) if (difficultyStr && difficultyStr.length) { difficulty = CoC7Utilities.convertDifficulty(difficultyStr[0]) - difficultyStr.forEach(match => { + for (const match of difficultyStr) { escaped = escaped.replace(`[${match}]`, '') - }) + } } if (escaped.includes('?')) { ask = true @@ -75,9 +76,9 @@ export class CoC7Utilities { if (ask) { const dialogOptions = { - threshold: threshold, + threshold, modifier: diceModifier, - difficulty: difficulty, + difficulty, askValue: true } const usage = await RollDialog.create(dialogOptions) @@ -115,56 +116,6 @@ export class CoC7Utilities { ui.notifications.infos('Do some stuff') } - static getCreatureSanData (creature) { - let creatureData - let actor - if (creature.constructor.name === 'CoCActor') { - actor = creature - } - - if (typeof creature === 'string') { - actor = CoC7Utilities.getActorFromString(creature) - } - - if (actor) { - if (actor.isToken) { - const specie = game.actors.get(actor.id) - // The token has a different maximum san loss. - // We assume it's a special represantant of his specie. - // The san loss for encoutered creature will counted for that token in particular - // and for the all specie - if (specie && specie.sanLossMax !== actor.sanLossMax) { - creatureData = { - id: actor.token.id, - name: actor.name, - sanLossMax: actor.sanLossMax, - specie: { - id: specie.id, - name: specie.name, - sanLossMax: specie.sanLossMax - } - } - } else { - // If they induce the same SAN loos credit everything to the specie. - // If the actor doen't exist in actor directory use the token data instead. - creatureData = { - id: specie ? specie.id : actor.id, - name: specie ? specie.name : actor.name, - sanLossMax: specie ? specie.sanLossMax : actor.sanLossMax - } - } - } else { - creatureData = { - id: actor.id, - name: actor.name, - sanLossMax: actor.sanLossMax - } - } - return creatureData - } else if (typeof creature === 'object') return creature - return null - } - static getActorFromString (actorString) { let actor @@ -324,7 +275,7 @@ export class CoC7Utilities { } static async checkMacro (threshold = undefined, event = null) { - await CoC7Utilities.rollDice(event, { threshold: threshold }) + await CoC7Utilities.rollDice(event, { threshold }) } static async createMacro (bar, data, slot) { @@ -383,134 +334,175 @@ export class CoC7Utilities { name: item.name, type: 'script', img: item.img, - command: command + command }) } game.user.assignHotbarMacro(macro, slot) return false } - static async toggleDevPhase () { - const isDevEnabled = game.settings.get('CoC7', 'developmentEnabled') - await game.settings.set('CoC7', 'developmentEnabled', !isDevEnabled) - const group = game.CoC7.menus.controls.find(b => b.name === 'main-menu') - const tool = group.tools.find(t => t.name === 'devphase') - tool.title = game.settings.get('CoC7', 'developmentEnabled') - ? game.i18n.localize('CoC7.DevPhaseEnabled') - : game.i18n.localize('CoC7.DevPhaseDisabled') + static async toggleDevPhase (toggle) { + await game.settings.set('CoC7', 'developmentEnabled', toggle) ui.notifications.info( - game.settings.get('CoC7', 'developmentEnabled') + toggle ? game.i18n.localize('CoC7.DevPhaseEnabled') : game.i18n.localize('CoC7.DevPhaseDisabled') ) - ui.controls.render() game.socket.emit('system.CoC7', { type: 'updateChar' }) CoC7Utilities.updateCharSheets() } - static async toggleCharCreation () { - const isCharCreation = game.settings.get('CoC7', 'charCreationEnabled') - await game.settings.set('CoC7', 'charCreationEnabled', !isCharCreation) - const group = game.CoC7.menus.controls.find(b => b.name === 'main-menu') - const tool = group.tools.find(t => t.name === 'charcreate') - tool.title = game.settings.get('CoC7', 'charCreationEnabled') - ? game.i18n.localize('CoC7.CharCreationEnabled') - : game.i18n.localize('CoC7.CharCreationDisabled') + static async toggleCharCreation (toggle) { + await game.settings.set('CoC7', 'charCreationEnabled', toggle) ui.notifications.info( - game.settings.get('CoC7', 'charCreationEnabled') + toggle ? game.i18n.localize('CoC7.CharCreationEnabled') : game.i18n.localize('CoC7.CharCreationDisabled') ) - ui.controls.render() game.socket.emit('system.CoC7', { type: 'updateChar' }) CoC7Utilities.updateCharSheets() + Hooks.call('toggleCharCreation', toggle) } - static async startRest () { - const actors = game.actors.filter(actor => actor.hasPlayerOwner) - let chatContent = `${game.i18n.localize('CoC7.dreaming')}...
                                                        ` + static async getTarget () { + const users = game.users.filter(user => user.active) + const actors = game.actors + let checkOptions = `\n + ` + const playerTokenIds = users + .map(u => u.character?.id) + .filter(id => id !== undefined) + const selectedPlayerIds = canvas.tokens.controlled.map(token => { + return token.actor.id + }) + + // Build checkbox list for all active players actors.forEach(actor => { - let quickHealer = false - actor.data.items.forEach(item => { - if (item.type === 'talent') { - if (item.name === `${game.i18n.localize('CoC7.quickHealer')}`) { - quickHealer = true + const checked = + (selectedPlayerIds.includes(actor.id) || + playerTokenIds.includes(actor.id)) && + 'checked' + checkOptions += ` +
                                                        + \n + + ` + }) + + new Dialog({ + title: `${game.i18n.localize('CoC7.dreaming')}`, + content: `${game.i18n.localize( + 'CoC7.restTargets' + )}: ${checkOptions}
                                                        `, + buttons: { + whisper: { + label: `${game.i18n.localize('CoC7.startRest')}`, + callback: async html => { + const targets = [] + let all = false + const users = html.find('[type="checkbox"]') + for (const user of users) { + if (user.name === 'COCCheckAllPC' && user.checked) all = true + if (user.checked || all) targets.push(user.id) + } + await CoC7Utilities.startRest(targets) } } - }) - const isCriticalWounds = actor.data.data.status.criticalWounds.value - const dailySanityLoss = actor.data.data.attribs.san.dailyLoss - const hpValue = actor.data.data.attribs.hp.value - const hpMax = actor.data.data.attribs.hp.max - const oneFifthSanity = - ' / ' + Math.floor(actor.data.data.attribs.san.value / 5) - const mpValue = actor.data.data.attribs.mp.value - const mpMax = actor.data.data.attribs.mp.max - chatContent = chatContent + `
                                                        ${actor.name}. ` - if (isCriticalWounds === false && hpValue < hpMax) { - if (game.settings.get('CoC7', 'pulpRules') && quickHealer === true) { + } + }).render(true) + } + + static async startRest (targets) { + if (!targets.length) return + const actors = game.actors.filter(actor => targets.includes(actor.id)) + let chatContent = `${game.i18n.localize('CoC7.dreaming')}...
                                                        ` + for (const actor of actors) { + if (['character', 'npc', 'creature'].includes(actor.type)) { + let quickHealer = false + for (const item of actor.data.items) { + if (item.type === 'talent') { + if (item.name === `${game.i18n.localize('CoC7.quickHealer')}`) { + quickHealer = true + } + } + } + const isCriticalWounds = + !game.settings.get('CoC7', 'pulpRuleIgnoreMajorWounds') && + actor.hasConditionStatus(COC7.status.criticalWounds) + const dailySanityLoss = actor.data.data.attribs.san.dailyLoss + const hpValue = actor.data.data.attribs.hp.value + const hpMax = actor.data.data.attribs.hp.max + const mpValue = actor.data.data.attribs.mp.value + const mpMax = actor.data.data.attribs.mp.max + const pow = actor.data.data.characteristics.pow.value + chatContent = chatContent + `
                                                        ${actor.name}. ` + if (hpValue < hpMax) { + if (isCriticalWounds === true) { + chatContent = + chatContent + + `${game.i18n.localize( + 'CoC7.hasCriticalWounds' + )}. ` + } else { + let healAmount = 1 + if (game.settings.get('CoC7', 'pulpRuleFasterRecovery')) { + healAmount = 2 + } + if (quickHealer === true) { + healAmount++ + } + healAmount = Math.min(healAmount, hpMax - hpValue) + if (healAmount === 1) { + chatContent = + chatContent + + `${game.i18n.localize( + 'CoC7.healthRecovered' + )}. ` + } else { + chatContent = + chatContent + + `${game.i18n.format( + 'CoC7.pulpHealthRecovered', + { number: healAmount } + )}. ` + } + actor.update({ + 'data.attribs.hp.value': + actor.data.data.attribs.hp.value + healAmount + }) + } + } + if (dailySanityLoss > 0) { chatContent = chatContent + - `${game.i18n.format( - 'CoC7.pulpHealthRecovered', - { number: 3 } - )}. ` + `${game.i18n.localize( + 'CoC7.dailySanLossRestarted' + )}.` actor.update({ - 'data.attribs.hp.value': actor.data.data.attribs.hp.value + 3 + 'data.attribs.san.dailyLoss': 0, + 'data.attribs.san.dailyLimit': Math.floor(actor.data.data.attribs.san.value / 5) }) - } else if (game.settings.get('CoC7', 'pulpRules')) { + } + const hours = 7 + if (hours > 0 && mpValue < mpMax) { + let magicAmount = hours * Math.ceil(pow / 100) + magicAmount = Math.min(magicAmount, mpMax - mpValue) chatContent = chatContent + `${game.i18n.format( - 'CoC7.pulpHealthRecovered', - { number: 2 } - )}. ` + 'CoC7.magicPointsRecovered' + )}: ${magicAmount}.` actor.update({ - 'data.attribs.hp.value': actor.data.data.attribs.hp.value + 2 - }) - } else { - chatContent = - chatContent + - `${game.i18n.localize( - 'CoC7.healthRecovered' - )}. ` - actor.update({ - 'data.attribs.hp.value': actor.data.data.attribs.hp.value + 1 + 'data.attribs.mp.value': + actor.data.data.attribs.mp.value + magicAmount }) } - } else if (isCriticalWounds === true && hpValue < hpMax) { - chatContent = - chatContent + - `${game.i18n.localize( - 'CoC7.hasCriticalWounds' - )}. ` - } - if (dailySanityLoss > 0) { - chatContent = - chatContent + - `${game.i18n.localize( - 'CoC7.dailySanLossRestarted' - )}.` - actor.update({ - 'data.attribs.san.dailyLoss': 0, - 'data.attribs.san.oneFifthSanity': oneFifthSanity - }) } - if (mpValue < mpMax) { - chatContent = - chatContent + - `${game.i18n.format( - 'CoC7.magicPointsRecovered' - )}: 7.` - actor.update({ - 'data.attribs.mp.value': actor.data.data.attribs.mp.value + 7 - }) - } - }) + } const chatData = { user: game.user.id, speaker: ChatMessage.getSpeaker(), @@ -520,20 +512,13 @@ export class CoC7Utilities { ChatMessage.create(chatData) } - static async toggleXPGain () { - const isXPEnabled = game.settings.get('CoC7', 'xpEnabled') - await game.settings.set('CoC7', 'xpEnabled', !isXPEnabled) - const group = game.CoC7.menus.controls.find(b => b.name === 'main-menu') - const tool = group.tools.find(t => t.name === 'xptoggle') - tool.title = game.settings.get('CoC7', 'xpEnabled') - ? game.i18n.localize('CoC7.XPGainEnabled') - : game.i18n.localize('CoC7.XPGainDisabled') + static async toggleXPGain (toggle) { + await game.settings.set('CoC7', 'xpEnabled', toggle) ui.notifications.info( - game.settings.get('CoC7', 'xpEnabled') + toggle ? game.i18n.localize('CoC7.XPGainEnabled') : game.i18n.localize('CoC7.XPGainDisabled') ) - ui.controls.render() } static async rollDice (event, options = {}) { @@ -560,14 +545,14 @@ export class CoC7Utilities { const actors = [] if (game.user.isGM && canvas.tokens.controlled.length) { - canvas.tokens.controlled.forEach(token => { + for (const token of canvas.tokens.controlled) { actors.push(token.actor.tokenKey) - }) + } } else if (game.user.character) { actors.push(game.user.character.tokenKey) } - await actors.forEach(async tk => { + for (const tk of actors) { const check = new CoC7Check() check.diceModifier = diceModifier || 0 check.difficulty = difficulty || CoC7Check.difficultyLevel.regular @@ -577,7 +562,7 @@ export class CoC7Utilities { check.actor = tk await check.roll() check.toMessage() - }) + } if (!actors.length) { const check = new CoC7Check() @@ -593,19 +578,19 @@ export class CoC7Utilities { static updateCharSheets () { if (game.user.isGM) { - game.actors.contents.forEach(a => { + for (const a of game.actors.contents) { if (a?.data?.type === 'character' && a?.sheet && a?.sheet?.rendered) { a.update({ 'data.flags.locked': true }) a.render(false) } - }) + } } else { - game.actors.contents.forEach(a => { + for (const a of game.actors.contents) { if (a.isOwner) { a.update({ 'data.flags.locked': true }) a.render(false) } - }) + } } } @@ -654,12 +639,298 @@ export class CoC7Utilities { textArea.focus() textArea.select() return new Promise((resolve, reject) => { - document.execCommand('copy') ? resolve() : reject(new Error('Unable to copy to clipboard, this is likely due to your browser security settings.')) + document.execCommand('copy') + ? resolve() + : reject( + new Error(game.i18n.localize('CoC7.UnableToCopyToClipboard')) + ) textArea.remove() }).catch(err => ui.notifications.error(err)) } } catch (err) { - ui.notifications.error('Unable to copy to clipboard, this is likely due to your browser security settings.') + ui.notifications.error(game.i18n.localize('CoC7.UnableToCopyToClipboard')) + } + } + + static quoteRegExp (string) { + // https://bitbucket.org/cggaertner/js-hacks/raw/master/quote.js + const len = string.length + let qString = '' + + for (let current, i = 0; i < len; ++i) { + current = string.charAt(i) + + if (current >= ' ' && current <= '~') { + if (current === '\\' || current === "'") { + qString += '\\' + } + + qString += current.replace(/[-[\]/{}()*+?.\\^$|]/g, '\\$&') + } else { + switch (current) { + case '\b': + qString += '\\b' + break + + case '\f': + qString += '\\f' + break + + case '\n': + qString += '\\n' + break + + case '\r': + qString += '\\r' + break + + case '\t': + qString += '\\t' + break + + case '\v': + qString += '\\v' + break + + default: + qString += '\\u' + current = current.charCodeAt(0).toString(16) + for (let j = 4; --j >= current.length; qString += '0'); + qString += current + } + } + } + + return qString + } + + static setByPath (obj, path, value) { + const parts = path.split('.') + let o = obj + if (parts.length > 1) { + for (let i = 0; i < parts.length - 1; i++) { + if (!o[parts[i]]) o[parts[i]] = {} + o = o[parts[i]] + } + } + + o[parts[parts.length - 1]] = value + } + + static getByPath (obj, path) { + const parts = path.split('.') + let o = obj + if (parts.length > 1) { + for (let i = 0; i < parts.length - 1; i++) { + if (!o[parts[i]]) return undefined + o = o[parts[i]] + } + } + + return o[parts[parts.length - 1]] + } + + /** + * Retrieve a Document by its Universally Unique Identifier (uuid). + * @param {string} uuid The uuid of the Document to retrieve + * @return {Promise} + */ + static SfromUuid (uuid) { + let parts = uuid.split('.') + let doc + + // Compendium Documents + if (parts[0] === 'Compendium') { + return null + // return fromUuid(uuid) // Return Promise + // parts.shift(); + // const [scope, packName, id] = parts.slice(0, 3); + // parts = parts.slice(3); + // const pack = game.packs.get(`${scope}.${packName}`); + // return await pack?.getDocument(id); + } else { + // World Documents + const [docName, docId] = parts.slice(0, 2) + parts = parts.slice(2) + const collection = CONFIG[docName].collection.instance + doc = collection.get(docId) + } + + // Embedded Documents + while (doc && parts.length > 1) { + const [embeddedName, embeddedId] = parts.slice(0, 2) + doc = doc.getEmbeddedDocument(embeddedName, embeddedId) + parts = parts.slice(2) + } + return doc || null + } + + static isDocumentUuidPack (uuid) { + if (uuid.includes('Compendium')) return true + else return false + } + + static isDocumentUuid (uuid) { + const identifiers = ['Actor', 'Scene', 'Token', 'Item', 'Compendium'] + for (let i = 0; i < identifiers.length; i++) { + if (uuid.includes(identifiers[i])) return true + } + return false + } + + static getActorDocumentFromDropData (dropData) { + let docUuid, actor + if (dropData.tokenUuid) { + docUuid = dropData.tokenUuid + } else if (typeof dropData.uuid !== 'undefined') { + docUuid = dropData.uuid + } else { + docUuid = + dropData.sceneId && dropData.tokenId + ? `Scene.${dropData.sceneId}.Token.${dropData.tokenId}` + : dropData.actorId || dropData.actorKey || dropData.id + } + if (dropData.type === 'Token') { + docUuid = dropData.uuid + } else if (docUuid) { + actor = CoC7Utilities.getActorFromKey(docUuid) + if (!actor && dropData.type === 'Item') docUuid = null + } + + if (actor && docUuid !== actor.uuid) { + docUuid = actor.uuid + } + return docUuid + } + + static getDocumentFromKey (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) + const [sceneId, tokenId] = key.split('.') + if (sceneId === 'TOKEN') { + return game.actors.tokens[tokenId] // REFACTORING (2) + } + const scene = game.scenes.get(sceneId) + if (!scene) return null + const tokenData = scene.getEmbeddedDocument('Token', tokenId) + if (!tokenData) return null + const token = new Token(tokenData) + if (!token.scene) token.scene = duplicate(scene.data) + return token + } + // Case 2 - use Actor ID directory + return game.actors.get(key) || null + } + + static getActorFromKey (key) { + const doc = CoC7Utilities.getDocumentFromKey(key) + if (!doc) return null + if (doc.actor) return doc.actor + if (doc.constructor?.name === 'CoCActor') return doc + return null + } + + /** + * Creates a folder on the actors tab called "Imported Characters" if the folder doesn't exist. + * @returns {Folder} the importedCharactersFolder + */ + static async createImportCharactersFolderIfNotExists () { + let folderName = game.i18n.localize('CoC7.ImportedCharactersFolder') + if (folderName === 'CoC7.ImportedCharactersFolder') { + folderName = 'Imported characters' + } + let importedCharactersFolder = game.folders.find( + entry => entry.data.name === folderName && entry.data.type === 'Actor' + ) + if ( + importedCharactersFolder === null || + typeof importedCharactersFolder === 'undefined' + ) { + // Create the folder + importedCharactersFolder = await Folder.create({ + name: folderName, + type: 'Actor', + parent: null + }) + ui.notifications.info( + game.i18n.localize('CoC7.CreatedImportedCharactersFolder') + ) + } + return importedCharactersFolder + } + + /** + * guessItem, try and find the item in the locations defined in ${source} i = Item Directory, w = World Compendiums, m = Module Compendiums, s = System Compendiums + * @param {String} type Item type to find + * @param {String} name Name of item to find + * @param {Object} combat null (default). If boolean combat property of skill must match + * @param {Object} source '' (default). Check order + * @param {Object} fallbackAny false (default). Should any specialization that isn't found try using (Any) items + * @returns {Object} formatted Actor data Item or null + */ + static async guessItem ( + type, + name, + { combat = null, source = '', fallbackAny = false } = {} + ) { + let existing = null + name = name.toLowerCase() + for (let o = 0, oM = source.length; o < oM; o++) { + switch (source.substring(o, o + 1)) { + case 'i': + existing = game.items.find( + item => + item.data.type === type && + item.data.name.toLowerCase() === name && + (combat === null || item.data.properties.combat === combat) + ) + if (existing) { + return existing + } + break + case 'w': + case 'm': + case 's': + for (const pack of game.packs) { + if ( + pack.metadata.type === 'Item' && + ((source[o] === 'w' && pack.metadata.package === 'world') || + (source[o] === 'S' && pack.metadata.package === 'CoC7') || + (source[o] === 's' && + !['world', 'CoC7'].includes(pack.metadata.package))) + ) { + const documents = await pack.getDocuments() + existing = documents.find( + item => + item.data.type === type && + item.data.name.toLowerCase() === name && + (combat === null || item.data.properties.combat === combat) + ) + if (existing) { + return existing + } + } + } + break + } + } + if (fallbackAny && type === 'skill') { + const match = name.match(/^(.+ \()(?!any).+(\))$/) + if (match) { + return await CoC7Utilities.guessItem( + type, + match[1] + 'any' + match[2], + { combat, source } + ) + } } } } diff --git a/package.json b/package.json index bd078a71..e9f56568 100644 --- a/package.json +++ b/package.json @@ -1,12 +1,10 @@ { "name": "fvtt-coc7", - "version": "0.6.6", + "version": "0.7.11", "description": "An unofficial implementation of Call of Cthulhu 7th Edition system for Foundry VTT.", - "main": "gulpfile.js", "scripts": { "build": "webpack --mode production", - "format": "prettier-standard --format --changed", - "lint": "prettier-standard --lint --changed", + "format": "standard --fix", "watch": "webpack --mode development" }, "repository": { @@ -14,30 +12,32 @@ "url": "git+https://github.com/Miskatonic-Investigative-Society/CoC7-FoundryVTT.git" }, "keywords": [], - "author": "", + "author": "Miskatonic Investigative Society", "license": "GPL-3.0", "bugs": { "url": "https://github.com/Miskatonic-Investigative-Society/CoC7-FoundryVTT/issues" }, "homepage": "https://github.com/Miskatonic-Investigative-Society/CoC7-FoundryVTT#readme", + "type": "module", "devDependencies": { - "copy-webpack-plugin": "^9.0.1", - "css-loader": "^6.2.0", - "css-minimizer-webpack-plugin": "^3.0.2", - "glob": "^7.1.7", + "copy-webpack-plugin": "^11.0.0", + "css-loader": "^6.7.1", + "css-minimizer-webpack-plugin": "^4.0.0", + "del": "^7.0.0", "jsonfile": "^6.1.0", - "less": "^4.1.1", - "less-loader": "^10.0.1", - "mini-css-extract-plugin": "^2.2.0", - "prettier-standard": "^16.4.1", - "standard": "^16.0.3", - "terser-webpack-plugin": "^5.1.4", + "less-loader": "^11.0.0", + "mini-css-extract-plugin": "^2.6.1", + "remarkable": "^2.0.1", + "standard": "^17.0.0", "thread-loader": "^3.0.4", - "webpack": "^5.50.0", - "webpack-cli": "^4.8.0", - "webpackbar": "^5.0.0-3", + "webpack": "^5.74.0", + "webpack-cli": "^4.10.0", + "webpackbar": "^5.0.2", "write": "^2.0.0" }, - "type": "module", - "dependencies": {} + "standard": { + "ignore": [ + "/lib/socketlib/" + ] + } } diff --git a/packs/examples.db b/packs/examples.db index a17b0e49..58c18fe7 100644 --- a/packs/examples.db +++ b/packs/examples.db @@ -1,4 +1,5 @@ -{"_id":"3z7VR4iGfJY8fQLG","name":"Creature example","permission":{"default":0,"6Y6opwuMdxc52cY3":3},"type":"creature","data":{"characteristics":{"str":{"value":0,"short":"CHARAC.STR","label":"CHARAC.Strengh","formula":"1d6"},"con":{"value":0,"short":"CHARAC.CON","label":"CHARAC.Constitution","formula":"2d6"},"siz":{"value":0,"short":"CHARAC.SIZ","label":"CHARAC.Size","formula":"5*3d6"},"dex":{"value":0,"short":"CHARAC.DEX","label":"CHARAC.Dexterity","formula":"4d6"},"app":{"value":0,"short":"CHARAC.APP","label":"CHARAC.Appearance","formula":"5d6"},"int":{"value":0,"short":"CHARAC.INT","label":"CHARAC.Intelligence","formula":"6d6"},"pow":{"value":0,"short":"CHARAC.POW","label":"CHARAC.Power","formula":""},"edu":{"value":0,"short":"CHARAC.EDU","label":"CHARAC.Education","formula":"0"}},"attribs":{"hp":{"value":0,"max":0,"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":0},"san":{"value":0,"max":99,"short":"SAN","label":"Sanity","auto":true},"mov":{"value":"auto","short":"MOV","label":"Movement rate","auto":true},"db":{"value":"auto","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},"tempoInsane":{"type":"boolean","value":false},"indefInsane":{"type":"boolean","value":false}},"personalDescription":{"type":"string","value":""},"special":{"attribs":{"move":{"primary":{"enabled":false,"value":null,"type":null},"secondary":{"enabled":false,"value":null,"type":null}}},"sanLoss":{"checkPassed":null,"checkFailled":null},"attacksPerRound":1},"infos":{"type":"","age":"","occupation":"To be removed"},"flags":{"locked":true,"displayFormula":false},"biography":{"personalDescription":{"value":"

                                                        Clicking the lock will allow modification of the sheet.

                                                        \n

                                                        When sheet is unlock you can modify things directly from the sheet. You can also open the entities sheets and delete things.

                                                        \n

                                                        In that mode you can create skills/possessions by clicking the + icon. Holding shift will bypass the opening of the corresponding sheet.

                                                        \n

                                                        You 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

                                                        \n

                                                        selecting 'Area of effect' will enable 3 different damage and range

                                                        \n

                                                        selecting 'Full-auto' will allow 2 different skilss to be selected for the weapon

                                                        \n

                                                        selecting 'Special' will activate the special input field

                                                        \n

                                                        In the combat tab, if the icons are with a red background, it means that no skill have been selected for that weapon

                                                        \n

                                                        Edit the weapon and select the correct skill.

                                                        ","chat":"","special":"

                                                        You can add special description or slugs there :

                                                        \n

                                                        Slug 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

                                                        \n

                                                        selecting 'Area of effect' will enable 3 different damage and range

                                                        \n

                                                        selecting 'Full-auto' will allow 2 different skilss to be selected for the weapon

                                                        \n

                                                        selecting 'Special' will activate the special input field

                                                        \n

                                                        In the combat tab, if the icons are with a red background, it means that no skill have been selected for that weapon

                                                        \n

                                                        Edit the weapon and select the correct skill.

                                                        ","chat":"","special":"

                                                        You can add special description or slugs there :

                                                        \n

                                                        Slug 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

                                                        \n

                                                        selecting 'Area of effect' will enable 3 different damage and range

                                                        \n

                                                        selecting 'Full-auto' will allow 2 different skilss to be selected for the weapon

                                                        \n

                                                        selecting 'Special' will activate the special input field

                                                        \n

                                                        In the combat tab, if the icons are with a red background, it means that no skill have been selected for that weapon

                                                        \n

                                                        Edit the weapon and select the correct skill.

                                                        ","chat":"","special":"

                                                        You can add special description or slugs there :

                                                        \n

                                                        Slug 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

                                                        \n

                                                        selecting 'Area of effect' will enable 3 different damage and range

                                                        \n

                                                        selecting 'Full-auto' will allow 2 different skilss to be selected for the weapon

                                                        \n

                                                        selecting 'Special' will activate the special input field

                                                        \n

                                                        In the combat tab, if the icons are with a red background, it means that no skill have been selected for that weapon

                                                        \n

                                                        Edit the weapon and select the correct skill.

                                                        ","chat":"","special":"

                                                        You can add special description or slugs there :

                                                        \n

                                                        Slug 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

                                                        \n

                                                        selecting 'Area of effect' will enable 3 different damage and range

                                                        \n

                                                        selecting 'Full-auto' will allow 2 different skilss to be selected for the weapon

                                                        \n

                                                        selecting 'Special' will activate the special input field

                                                        \n

                                                        In the combat tab, if the icons are with a red background, it means that no skill have been selected for that weapon

                                                        \n

                                                        Edit the weapon and select the correct skill.

                                                        ","chat":"","special":"

                                                        You can add special description or slugs there :

                                                        \n

                                                        Slug 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

                                                        \n

                                                        selecting 'Area of effect' will enable 3 different damage and range

                                                        \n

                                                        selecting 'Full-auto' will allow 2 different skills to be selected for the weapon

                                                        \n

                                                        selecting 'Special' will activate the special input field

                                                        \n

                                                        In the combat tab, if the icons are with a red background, it means that no skill have been selected for that weapon

                                                        \n

                                                        Edit 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

                                                        \n

                                                        selecting 'Area of effect' will enable 3 different damage and range

                                                        \n

                                                        selecting 'Full-auto' will allow 2 different skills to be selected for the weapon

                                                        \n

                                                        selecting 'Special' will activate the special input field

                                                        \n

                                                        In the combat tab, if the icons are with a red background, it means that no skill have been selected for that weapon

                                                        \n

                                                        Edit 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.

                                                        \n

                                                        When sheet is unlock you can modify things directly from the sheet. You can also open the entities sheets and delete things.

                                                        \n

                                                        In that mode you can create skills/possessions by clicking the + icon. Holding shift will bypass the opening of the corresponding sheet.

                                                        \n

                                                        You 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 :

                                                        \n

                                                        Slug 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

                                                        \n

                                                        selecting 'Area of effect' will enable 3 different damage and range

                                                        \n

                                                        selecting 'Full-auto' will allow 2 different skilss to be selected for the weapon

                                                        \n

                                                        selecting 'Special' will activate the special input field

                                                        \n

                                                        In the combat tab, if the icons are with a red background, it means that no skill have been selected for that weapon

                                                        \n

                                                        Edit the weapon and select the correct skill.

                                                        ","chat":"","special":"

                                                        You can add special description or slugs there :

                                                        \n

                                                        Slug 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

                                                        \n

                                                        selecting 'Area of effect' will enable 3 different damage and range

                                                        \n

                                                        selecting 'Full-auto' will allow 2 different skills to be selected for the weapon

                                                        \n

                                                        selecting 'Special' will activate the special input field

                                                        \n

                                                        In the combat tab, if the icons are with a red background, it means that no skill have been selected for that weapon

                                                        \n

                                                        Edit the weapon and select the correct skill.

                                                        ","chat":"","special":"

                                                        You can add special description or slugs there :

                                                        \n

                                                        Slug 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":"
                                                        \n

                                                        Effects

                                                        \n

                                                        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.

                                                        \n

                                                        Effects tab

                                                        \n

                                                        Effects will be display in the effect tabs on the character sheet.

                                                        \n

                                                        \"effects

                                                        \n

                                                        Effect are broken down in 4 categories for PC :

                                                        \n
                                                          \n
                                                        • Status: those are effects used and created by the system (Wounds status, prone, insane ...). Those effects do not include any changes.
                                                        • \n
                                                        • Temporary: those are effects with duration.
                                                        • \n
                                                        • Passive: those are permanent effects.
                                                        • \n
                                                        • Inactive: those are disabled effects.
                                                        • \n
                                                        \n

                                                        For 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.

                                                        \n

                                                        Creating effects

                                                        \n

                                                        You can create effect by clicking the Add button.\nThis will bring the effect creation window.\nThis windows has 3 tabs

                                                        \n

                                                        Details tab

                                                        \n

                                                        \"Details

                                                        \n

                                                        Duration tab

                                                        \n

                                                        \"Duration

                                                        \n

                                                        Changes tab

                                                        \n

                                                        \"Changes

                                                        \n

                                                        This last tab will includes all changes made to the character sheet.

                                                        \n

                                                        Changes

                                                        \n

                                                        An effect includes a list of changes. Each change needs to be addressed with the corresponding data path.\nThe available changes are :

                                                        \n
                                                          \n
                                                        • Characteristics: data.characteristics.[characteristic].value\n
                                                            \n
                                                          • available [characteristic] are: str, con, siz, dex, app, int, pow, edu
                                                          • \n
                                                        • \n
                                                        • attributes:\n
                                                            \n
                                                          • mov: data.attribs.mov.value
                                                          • \n
                                                          • build: data.attribs.build.value
                                                          • \n
                                                          • bonus damage: data.attribs.db.value
                                                          • \n
                                                          • armor: data.attribs.armor.value
                                                          • \n
                                                        • \n
                                                        • 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.\n
                                                            \n
                                                          • max hit points: data.attribs.hp.max
                                                          • \n
                                                          • max sanity: data.attribs.san.max
                                                          • \n
                                                        • \n
                                                        • skills. Skills are identified by their name without specialization. Skill names are case sensitive !\n
                                                            \n
                                                          • data.skills.Handgun.value
                                                          • \n
                                                        • \n
                                                        \n\n
                                                        "} +{"_id":"xV4Hxxmu6zjIMw9h","name":"Actor Importer [en]","content":"
                                                        \n

                                                        Actor Importer

                                                        \n

                                                        You can use the actor importer to import several NPC/Creatures blocks from adventures and using the JSON exporter from The Dholes House

                                                        \n

                                                        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

                                                        \n

                                                        Overview

                                                        \n

                                                        If this is your first time it is recommends you also read the following sections.

                                                        \n
                                                          \n
                                                        • Non Playing Character (NPC) / Creature
                                                        • \n
                                                        • The Dhole's House Actor Importer JSON
                                                        • \n
                                                        \n

                                                        Non Playing Character (NPC) / Creature

                                                        \n

                                                        \"\"

                                                        \n
                                                          \n
                                                        1. Select NPC or Creature

                                                        2. \n
                                                        3. Should the system convert the character block from an earlier edition to 7th

                                                        4. \n
                                                        5. Select the languages of the character block

                                                        6. \n
                                                        7. 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

                                                          \n

                                                          Items: From your item directory

                                                          \n

                                                          World: From your world compendiums

                                                          \n

                                                          Modules: From your module compendiums

                                                          \n

                                                          System: From the system compendiums provided with this system

                                                        8. \n
                                                        9. 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

                                                        10. \n
                                                        \n

                                                        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

                                                        \n

                                                        The Dhole's House Actor Importer JSON

                                                        \n

                                                        \"\"

                                                        \n
                                                          \n
                                                        1. The Dhole's House Actor Importer JSON

                                                        2. \n
                                                        3. 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

                                                          \n

                                                          Items: From your item directory

                                                          \n

                                                          World: From your world compendiums

                                                          \n

                                                          Modules: From your module compendiums

                                                          \n

                                                          System: From the system compendiums provided with this system

                                                        4. \n
                                                        \n

                                                        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

                                                        \n

                                                        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.

                                                        \n\n
                                                        "} +{"_id":"wZtTHpGV3atKV2oD","name":"Call of Cthulhu 7th Edition (Unofficial) [en]","content":"
                                                        \n

                                                        System documentation for version 0.8.0

                                                        \n

                                                        This document is a work in progress overview of the CoC7 system it is not a tutorial for how to use FoundryVTT.

                                                        \n

                                                        You will need one of the following to play the game

                                                        \n
                                                          \n
                                                        • Chaosium's Call of Cthulhu 7th Edition - Keeper's Rulebook
                                                        • \n
                                                        • Chaosium's Call of Cthulhu 7th Edition - Call of Cthulhu Starter Set
                                                        • \n
                                                        • Chaosium's Call of Cthulhu 7th Edition - Quick-Start Rules
                                                        • \n
                                                        \n

                                                        The system automates most of the regular tasks and rules involved with running a game.

                                                        \n

                                                        Several parts of the actor sheets have pop up tooltips that trigger after two seconds, this delay can be changed in the settings\n.

                                                        \n

                                                        This documentation can be reopened under   Compendiums -> JournalEntry -> System manual -> Call of Cthulhu 7th Edition (Unofficial) [en]

                                                        \n

                                                        Recent changes

                                                        \n

                                                        For a full list of changes checkout the changelog on GitHub

                                                        \n
                                                          \n
                                                        • @Compendium[CoC7.system-doc.VdOeGcxsu3jsVm3F]{Chases}
                                                        • \n
                                                        • @Compendium[CoC7.system-doc.xV4Hxxmu6zjIMw9h]{Actor importer} - added The Dhole's House JSON support
                                                        • \n
                                                        • @Compendium[CoC7.system-doc.rmtiwtbixojhyf5v]{Active effects} - implementation of active effects
                                                        • \n
                                                        • Active effects added to @Compendium[CoC7.system-doc.fk040vqb4per5ju1]{links} and @Compendium[CoC7.system-doc.emuu3wo0uul91029]{Link creation tool}
                                                        • \n
                                                        \n

                                                        Overview sections below

                                                        \n

                                                        If this is your first time it is recommends you also read the following sections on this page.

                                                        \n

                                                        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.

                                                        \n
                                                          \n
                                                        • Actor overview
                                                        • \n
                                                        • Items overview
                                                        • \n
                                                        • Settings overview
                                                        • \n
                                                        • Scene menu overview
                                                        • \n
                                                        • Keyboard and mouse shortcuts
                                                        • \n
                                                        • @Compendium[CoC7.system-doc.nVYLlqVzmUV5dXAW]{Creating your first investigator}
                                                        • \n
                                                        • @Compendium[CoC7.system-doc.uug1mm5nokly4o2v]{Character creation}
                                                        • \n
                                                        \n

                                                        How to use the system

                                                        \n
                                                          \n
                                                        • @Compendium[CoC7.system-doc.rmtiwtbixojhyf5v]{Active effects} - An active effect will modify an actor characteristic(s), attribute(s), skill(s).
                                                        • \n
                                                        • @Compendium[CoC7.system-doc.xV4Hxxmu6zjIMw9h]{Actor importer}
                                                        • \n
                                                        • Actor Type: Character (TODO)
                                                        • \n
                                                        • Actor Type: Container (TODO)
                                                        • \n
                                                        • Actor Type: Creature (TODO)
                                                        • \n
                                                        • Actor Type: NPC (TODO)
                                                        • \n
                                                        • Chat link creator (TODO)
                                                        • \n
                                                        • Character creation mode (TODO)
                                                        • \n
                                                        • @Compendium[CoC7.system-doc.nk68b2ew15iw0bb8]{Combat} (TODO)
                                                        • \n
                                                        • Development phase (TODO)
                                                        • \n
                                                        • @Compendium[CoC7.system-doc.di6mcnaxfyi0y2l4]{Item Types} (TODO)
                                                        • \n
                                                        • @Compendium[CoC7.system-doc.kv2tbz6x29cq6ewq]{Item Type: Archetype} (TODO)
                                                        • \n
                                                        • @Compendium[CoC7.system-doc.oruecvy7jne4u4gt]{Item Type: Book} (TODO)
                                                        • \n
                                                        • @Compendium[CoC7.system-doc.VdOeGcxsu3jsVm3F]{Item Type: Chases}
                                                        • \n
                                                        • Item Type: Item (TODO)
                                                        • \n
                                                        • @Compendium[CoC7.system-doc.qa934whpkpauiyc9]{Item Type: Occupation}
                                                        • \n
                                                        • @Compendium[CoC7.system-doc.JU1GCWwc8at7gzJ4]{Item Type: Setup}
                                                        • \n
                                                        • @Compendium[CoC7.system-doc.mz0ulbkecfvv8nw7]{Item Type: Skill} (TODO)
                                                        • \n
                                                        • Item Type: Spell (TODO)
                                                        • \n
                                                        • Item Type: Status (TODO)
                                                        • \n
                                                        • Item Type: Talent (TODO)
                                                        • \n
                                                        • Item Type: Weapon (TODO)
                                                        • \n
                                                        • @Compendium[CoC7.system-doc.emuu3wo0uul91029]{Link Creation Tool}
                                                        • \n
                                                        • @Compendium[CoC7.system-doc.fk040vqb4per5ju1]{Links} (TODO)
                                                        • \n
                                                        • Macros (TODO)
                                                        • \n
                                                        • Rolls (TODO)
                                                        • \n
                                                        • @Compendium[CoC7.system-doc.ce7s8psgyctzx5r1]{Sanity} (TODO)
                                                        • \n
                                                        • Start Rest (TODO)
                                                        • \n
                                                        • XP Gain (TODO)
                                                        • \n
                                                        \n

                                                        Actor overview

                                                        \n
                                                          \n
                                                        • Character - A complete character, usually an investigator. @Compendium[CoC7.examples.JuI2aWDSEuQNKeUI]{Example Character}
                                                        • \n
                                                        • Container - An inventory container. @Compendium[CoC7.examples.r7bDSY4OYKxQYEas]{Example Container}
                                                        • \n
                                                        • Creature - A more simple character, suitable for creatures. @Compendium[CoC7.examples.XE2vjLG03wGfnYLw]{Example Creature}
                                                        • \n
                                                        • NPC - A more simple character, suitable for NPCs. @Compendium[CoC7.examples.4kSvDc4n13oFx8RG]{Example NPC}
                                                        • \n
                                                        \n

                                                        Items overview

                                                        \n
                                                          \n
                                                        • Archetype - A set of skills and other stats that implement a Pulp Cthulhu archetype. These do not trigger automation in the system. @Compendium[CoC7.items.lu04TIRrg9P3vRqY]{Example Archetype}
                                                        • \n
                                                        • Book - An arcane tome that can hold spells and character improvements.
                                                        • \n
                                                        • Item - A piece of equipment.
                                                        • \n
                                                        • Occupation - A set of skills and other stats that implement a CoC occupation. @Compendium[CoC7.items.NOsh6EdNSjpjahDF]{Example Occupation}
                                                        • \n
                                                        • Setup - A set of default configurations for character, creature, or NPC creation. @Compendium[CoC7.items.CcH7CdXGtGTjMSCg]{Example Setup}
                                                        • \n
                                                        • Skill - A skill with a base percentage and some tags. @Compendium[CoC7.skills.UOuN0gESXPp2HXwH]{Example Skill}
                                                        • \n
                                                        • Spell - A magic spell.
                                                        • \n
                                                        • Status - An phobia or mania condition. @Compendium[CoC7.items.DVdvEDizPZPux1pK]{Example Mania}
                                                        • \n
                                                        • Talent -A special power for Pulp Cthulhu. These do not trigger automation in the system. @Compendium[CoC7.items.yqvwz769ZeJplOW7]{Example Talent}
                                                        • \n
                                                        • Weapon - An item with weapon statistics (this includes unarmed attacks). @Compendium[CoC7.items.3elxAwnv7WCUNwng]{Example Weapon}
                                                        • \n
                                                        \n

                                                        Settings overview

                                                        \n

                                                        Click on the  Game Settings tab then under the Game Settings heading click on  Configure Settings.

                                                        \n

                                                        Click on  System Settings

                                                        \n
                                                          \n
                                                        • Variant/Optional Rules - Here you can turn on individual Pulp Cthulhu rules and other optional rules
                                                        • \n
                                                        • Initiative Settings - Additional settings for optional initiative rule
                                                        • \n
                                                        • Roll Settings - Default options for rolls
                                                        • \n
                                                        • Chat Cards Settings - Configure chat messages
                                                        • \n
                                                        • Scene Settings - Scene Settings
                                                        • \n
                                                        • Game Artwork Settings - This allows you to set a custom pause icon and message
                                                        • \n
                                                        • Sheet Settings - This allows you to change character sheet settings and optional CSS
                                                        • \n
                                                        • Weapon Settings - Weapon Settings
                                                        • \n
                                                        • Developer And Debug Settings - These settings can break your world when new updates are released so only use them on test worlds
                                                        • \n
                                                        • 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
                                                        • \n
                                                        \n

                                                        Call of Cthulhu Scene Menu

                                                        \n

                                                        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.

                                                        \n
                                                          \n
                                                        • Keeper's tools\n
                                                            \n
                                                          • Development phase: When enabled, players can make improvement rolls for their marked skills.
                                                          • \n
                                                          • Character creation mode: When enabled, players can distribute points among their skills.
                                                          • \n
                                                          • XP gain: When enabled, a skill will be marked for improvement after a successful check.
                                                          • \n
                                                          • Send a decoy roll to players: When clicked, players will see a fake GM private roll.
                                                          • \n
                                                          • Start Rest: When click, pick characters to perform a rest and roll for XP gains.
                                                          • \n
                                                        • \n
                                                        • Roll !: Used to roll 1d100 with a threshold, difficulty and bonus or penalty dice.
                                                        • \n
                                                        • Create link: Create a roll link for players to click
                                                        • \n
                                                        \n

                                                        Keyboard and mouse shortcuts

                                                        \n

                                                        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:

                                                        \n
                                                          \n
                                                        • Right click on any rollable element to include it in an opposed roll. As long as the card is open, all rolls made\nwith a right click will be added to the opposed roll.
                                                        • \n
                                                        • Alt + Right click on any rollable element to include it in a combined roll.
                                                        • \n
                                                        • Shift + Left click on a rollable element will make a roll without asking for difficulty or bonus/penalty.
                                                        • \n
                                                        • Ctrl + Left click on a rollable element will create a roll request. Only available for the GM.
                                                        • \n
                                                        • Alt + Left click on sanity will prompt the player for minimum and maximum sanity loss.
                                                        • \n
                                                        \n\n
                                                        "} +{"_id":"uug1mm5nokly4o2v","name":"Character Creation [en]","content":"
                                                        \n

                                                        Character Creation

                                                        \n

                                                        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.

                                                        \n

                                                        Skills

                                                        \n

                                                        In this section you will create or edit @Compendium[CoC7.system-doc.mz0ulbkecfvv8nw7]{skills}

                                                        \n
                                                          \n
                                                        1. Go to  compendium packs

                                                        2. \n
                                                        3. Click on  Create Compendium

                                                          \n
                                                            \n
                                                          • Give your compendium a name (e.g. My Skills)
                                                          • \n
                                                          • Select Item as Document Type
                                                          • \n
                                                        4. \n
                                                        \n

                                                        Use existing skills

                                                        \n
                                                          \n
                                                        1. Open up the compendium Skills
                                                        2. \n
                                                        3. Drag any skills you want to customise into your new compendium
                                                        4. \n
                                                        \n

                                                        Create new skills

                                                        \n
                                                          \n
                                                        1. Go to  Items Directory

                                                        2. \n
                                                        3. Cick on  Create Item

                                                          \n
                                                            \n
                                                          • Give the skill a name
                                                          • \n
                                                          • Set Type to Skill
                                                          • \n
                                                        4. \n
                                                        \n

                                                        Setup

                                                        \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.

                                                        \n
                                                          \n
                                                        1. Go to  Items Directory

                                                        2. \n
                                                        3. Click on  Create Item

                                                          \n
                                                            \n
                                                          • Give the skill a name
                                                          • \n
                                                          • Set Type to Setup
                                                          • \n
                                                        4. \n
                                                        5. Define the setup to set the basic configuration for a type of characters.

                                                          \n
                                                            \n
                                                          • You can add a textual description on the Description tab
                                                          • \n
                                                          • If you click on the icon you can select a new one
                                                          • \n
                                                          • On the Details tab you can:\n
                                                              \n
                                                            • Select the Cthulhu Flavors where this setup is valid
                                                            • \n
                                                            • Define the biography sections and their names (click on the + to add extra Biography sections)
                                                            • \n
                                                            • Drag default items like @Compendium[CoC7.items.3elxAwnv7WCUNwng]{Punch}
                                                            • \n
                                                            • Show / Hide the Characteristics tab with the Enable characteristics checkbox
                                                            • \n
                                                          • \n
                                                          • The Characteristics tab allows you to define the formula to roll the dices for each characteristic
                                                          • \n
                                                          • The Skills tab allows you to define the default set of skills by dragging items of type skill to the common skills area.
                                                          • \n
                                                        6. \n
                                                        \n

                                                        Occupations

                                                        \n

                                                        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.

                                                        \n

                                                        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.

                                                        \n

                                                        The occupation creation process is the following one:

                                                        \n
                                                          \n
                                                        1. Go to  Items Directory

                                                        2. \n
                                                        3. Cick on  Create Item

                                                          \n
                                                            \n
                                                          • Give the skill a name
                                                          • \n
                                                          • Set Type to Occupation
                                                          • \n
                                                        4. \n
                                                        5. Define the occupation to select the relevant characteristics and the occupation skills

                                                          \n
                                                            \n
                                                          • You can add a textual description on the Description tab and define the Source
                                                          • \n
                                                          • If you click on the icon you can select a new one
                                                          • \n
                                                          • On the Details tab you can:\n
                                                              \n
                                                            • Select the Occupation Type

                                                            • \n
                                                            • 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.

                                                              \n

                                                              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.

                                                            • \n
                                                            • Finally you will have to define the Minimum and Maximum value for the Credit Rating skill for this occupation.

                                                            • \n
                                                          • \n
                                                          • 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.\n
                                                              \n
                                                            • The Common Skills includes the default occupation skills that can't be changed
                                                            • \n
                                                            • 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.
                                                            • \n
                                                            • Finally the Additional Skills allows you to enter a number of skills the player can choose from the rest of the available skills.
                                                            • \n
                                                          • \n
                                                        6. \n
                                                        \n

                                                        Player Character creation

                                                        \n

                                                        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:

                                                        \n
                                                          \n
                                                        1. Go to  Actors Directory

                                                        2. \n
                                                        3. Cick on  Create Actor

                                                          \n
                                                            \n
                                                          • Give the actor a name
                                                          • \n
                                                          • Set Type to Character
                                                          • \n
                                                        4. \n
                                                        5. 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.

                                                        6. \n
                                                        7. 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.

                                                        8. \n
                                                        9. 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

                                                        10. \n
                                                        11. On the new submenu click  Character creation mode. A new tab called Development should appear on the character sheets.

                                                        12. \n
                                                        13. Click on the characters Development tab

                                                        14. \n
                                                        15. The first dot column is for your occupational skills these can be toggled by clicking them

                                                          \n
                                                            \n
                                                          • If you have enabled the Pulp rule Archetypes you will have a second dot to toggle that
                                                          • \n
                                                        16. \n
                                                        17. Distribute occupation/personal points in development tab taking on account that each skill has 5 columns:

                                                          \n
                                                            \n
                                                          1. First one is the basic percentage of the skill
                                                          2. \n
                                                          3. The second one is the one to put the Personal interest points during the creation of the character
                                                          4. \n
                                                          5. 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.\n
                                                              \n
                                                            • If you have enabled the Pulp rule Archetypes you will have a forth column you enter your archetype points here
                                                            • \n
                                                          6. \n
                                                          7. 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)
                                                          8. \n
                                                          9. The final column is a read only one with the final calculated value for the skill (the sum of the other 4)
                                                          10. \n
                                                        18. \n
                                                        \n\n\n
                                                        "} +{"_id":"VdOeGcxsu3jsVm3F","name":"Chases [en]","content":"
                                                        \n

                                                        Creating a new chase

                                                        \n

                                                        To create a chase create a new item of type chase.

                                                        \n

                                                        Only the keeper should have access to that item.

                                                        \n

                                                        A chase is composed of a succession of locations. Each location can be separated by an obstacle (barrier or hazard).

                                                        \n

                                                        A hazard will always be crossed but failing the check will slow you down.

                                                        \n

                                                        A barrier will stop you until you successfully pass or destroy it.

                                                        \n

                                                        \"\"

                                                        \n

                                                        The chase sheet is divided in 3 parts.

                                                        \n
                                                          \n
                                                        • A header where you will see information about current location once a chase is started.
                                                        • \n
                                                        • A chase setup tab. This will allows you to create and follow the chase.
                                                        • \n
                                                        • A participant list where you can setup your participant. This tab will not work after the chase started.
                                                        • \n
                                                        \n

                                                        Adding a participant.

                                                        \n

                                                        To add a participant click on the plus sign on the participant list or drag an actor or a token.

                                                        \n

                                                        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.

                                                        \n

                                                        To be able to add a token to the chase a few control have been added to character and NPC sheets:

                                                        \n

                                                        \"\"

                                                        \n

                                                        Those icons will give additional information.

                                                        \n
                                                          \n
                                                        1. Indicate that this actor is a synthetic actor (instance of an actor)
                                                        2. \n
                                                        3. Indicate that actor's data are not linked. Each instance of that actor has his own properties.
                                                        4. \n
                                                        5. Indicate that this actor has an associated token. You can drag and drop this onto a chase location or on the participant list.
                                                        6. \n
                                                        7. Indicate that actor's data are linked to an actor in the actors directory.
                                                        8. \n
                                                        \n

                                                        Dragging a token to the participant list or to a location will activate the importer window.

                                                        \n

                                                        \"\"

                                                        \n

                                                        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...)

                                                        \n
                                                          \n
                                                        1. Clicking this will change the participant side from prey to chaser.
                                                        2. \n
                                                        3. Clicking this will trigger a speed check. Note that there will be no player entries necessary nor any roll card displayed.
                                                        4. \n
                                                        \n

                                                        Participant list

                                                        \n

                                                        \"\"

                                                        \n

                                                        Here you can have the list of participant to the chase.

                                                        \n
                                                          \n
                                                        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. \n
                                                        3. This will clear the speed roll if any, or delete the participant.
                                                        4. \n
                                                        \n

                                                        \"\"

                                                        \n
                                                          \n
                                                        1. Roll card waiting to get resolved in the chat.
                                                        2. \n
                                                        3. Speed check rolled. You can click this to get the details.
                                                        4. \n
                                                        5. To reset the speed check.
                                                        6. \n
                                                        \n

                                                        \"\"

                                                        \n

                                                        Chase setup

                                                        \n

                                                        \"\"

                                                        \n

                                                        To setup a chase enter the initial numbers of locations and click initialize.

                                                        \n

                                                        \"\"

                                                        \n

                                                        The chase is initialized, you can adjust some options. Locations in white are initial locations and can not be modified.

                                                        \n
                                                          \n
                                                        1. This is the chase track, the location in white are initials locations. The location in grey are actual chase locations.
                                                        2. \n
                                                        3. Selecting this will include in the chase participants who would have otherwise been able to escape.
                                                        4. \n
                                                        5. Selecting this will include in the chase participants who would have been excluded for being too slow.
                                                        6. \n
                                                        7. This is the number of locations between the slowest prey and the fastest chaser.
                                                        8. \n
                                                        9. 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.
                                                        10. \n
                                                        11. This will animate token when they move to a new location.
                                                        12. \n
                                                        \n

                                                        Setting up locations

                                                        \n

                                                        During setup or during chase you can select a location to modify it.

                                                        \n

                                                        Starting (white) locations can not be modified during setup.

                                                        \n

                                                        To modify a location select it by clicking on it. This will display the location details on the header part of the sheet.

                                                        \n

                                                        \"\"

                                                        \n
                                                          \n
                                                        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. \n
                                                        3. This will remove the location. A location has to be empty to be removed.
                                                        4. \n
                                                        5. 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.
                                                        6. \n
                                                        7. Add a new location.
                                                        8. \n
                                                        9. Active location.
                                                        10. \n
                                                        \n

                                                        Setting up obstacles.

                                                        \n

                                                        You can add obstacle after and before a location. You can pre-fill an obstacle with a name, an associated check and some penalties.

                                                        \n

                                                        \"\"

                                                        \n
                                                          \n
                                                        1. Toggle this to add damage to a barrier.
                                                        2. \n
                                                        3. Barrier's hit points.
                                                        4. \n
                                                        5. Movement action cost in case of failure.
                                                        6. \n
                                                        7. Check used to pass the location. When it's red the active actor does not have the associated check.
                                                        8. \n
                                                        \n

                                                        Cut to the chase.

                                                        \n

                                                        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.

                                                        \n

                                                        \"\"

                                                        \n
                                                          \n
                                                        1. Initiative track. The active participant is circled in orange.
                                                        2. \n
                                                        3. 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.
                                                        4. \n
                                                        5. A barrier.
                                                        6. \n
                                                        7. A hazard.
                                                        8. \n
                                                        \n

                                                        Obstacle resolution flow

                                                        \n

                                                        \"\"

                                                        \n
                                                          \n
                                                        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.
                                                        2. \n
                                                        \n

                                                        Here is a shorten flow example:

                                                        \n

                                                        \"\"\n\"\"\n\"\"\n\"\"

                                                        \n

                                                        Once the flow is complete all changes are send to the chase.

                                                        \n

                                                        \"\"

                                                        \n

                                                        This round is finished. All actor have spent their movement action. You can click Next round to proceed.

                                                        \n

                                                        Participant controls.

                                                        \n

                                                        \"\"

                                                        \n

                                                        You can modify or move a participant by using the controls button on his card.

                                                        \n
                                                          \n
                                                        1. Those 3 icons will allow to delete, modify and activate a participant.
                                                        2. \n
                                                        3. Movement action. A yellow is available, grey is consumed, red is a deficit.
                                                        4. \n
                                                        5. This will control your participant bonus. He can draw a gun or be awarded bonus dices.
                                                        6. \n
                                                        7. Movement action controls. Here you can increase or decrease movement actions.
                                                        8. \n
                                                        9. 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.
                                                        10. \n
                                                        \n\n
                                                        "} +{"_id":"nk68b2ew15iw0bb8","name":"Combat [en]","content":"
                                                        \n

                                                        Combat

                                                        \n

                                                        Starting the combat

                                                        \n

                                                        On 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.

                                                        \n

                                                        The combat tracker will help you to track both the initiatives of the different actors and the combat rounds.

                                                        \n

                                                        Initiative

                                                        \n

                                                        On 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.

                                                        \n

                                                        Next to each actor on the combat tab there are 3 icons:

                                                        \n
                                                          \n
                                                        • A target: to draw the gun (this will add 50 to that character initiative)
                                                        • \n
                                                        • A crossed eye: to show/hide the corresponding actor on the list.
                                                        • \n
                                                        • A skull: to mark a character as defeated and skip it for the following turns.
                                                        • \n
                                                        \n

                                                        Select target / targets

                                                        \n

                                                        During 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.

                                                        \n

                                                        Then 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

                                                        Tip: 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
                                                        \n

                                                        Melee

                                                        \n

                                                        Maneuvers

                                                        \n

                                                        Not implemented yet.

                                                        \n

                                                        Single Shot

                                                        \n

                                                        Automate fire

                                                        \n

                                                        Multiple Targets

                                                        \n

                                                        Reload

                                                        \n\n
                                                        "} +{"_id":"wilj4rvkreemh70n","name":"Commands Cheat Sheet [en]","content":"
                                                        \n

                                                        Commands Cheat Sheet

                                                        \n

                                                        General rules

                                                        \n

                                                        Most sheet component can be clicked on the trigger a check/roll.\nAs a general rule you can modify those requests:

                                                        \n
                                                          \n
                                                        • Shift will fast forward the request.
                                                        • \n
                                                        • Ctrl [GM only] will create a link in the chat with that request a roll to the players.
                                                        • \n
                                                        \n

                                                        Sanity

                                                        \n\n\n\n\n\n\n\n\n
                                                        CommandAction
                                                        Ctrl+Shift + left click SANRequest a Sanity Check for the character
                                                        Ctr+Shift+Alt + left click SANRequest a Sanity Check and define the sanity loss
                                                        \n

                                                        Combined / Opposed rolls

                                                        \n\n\n\n\n\n\n\n\n
                                                        CommandAction
                                                        Right Click on an elementStart/ Include the roll on an opposed roll
                                                        Alt + Right Click on an elementStart/ Include the roll on an combined roll
                                                        \n

                                                        Other

                                                        \n\n\n\n\n\n\n\n
                                                        CommandAction
                                                        cShow my own character sheet
                                                        \n\n
                                                        "} +{"_id":"nVYLlqVzmUV5dXAW","name":"Creating your first investigator [en]","content":"
                                                        \n

                                                        Initial item setup

                                                        \n

                                                        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.

                                                        \n

                                                        This 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.

                                                        \n

                                                        Skill

                                                        \n

                                                        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.

                                                        \n
                                                          \n
                                                        • No adjustment - Can not be assigned personal skill points.
                                                        • \n
                                                        • No XP gain - You do not mark this skill for improvement on a success.
                                                        • \n
                                                        • Specialization - This skill is part of a group like Pilot or Flighting.
                                                        • \n
                                                        • Uncommon - This skill is uncommon and can be automatically hidden on the character sheet.
                                                        • \n
                                                        • Pushed - This skill can be pushed.
                                                        • \n
                                                        • Fighting - Automatically set Specialization, Combat, and the specialization name to Fighting.
                                                        • \n
                                                        • Firearms - Automatically set Specialization, Combat, and the specialization name to Firearms.
                                                        • \n
                                                        \n

                                                        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).

                                                        \n

                                                        Setup

                                                        \n

                                                        Once 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}

                                                        \n

                                                        Setups allow to you standardise what skills, items, biography sections, and characteristics the investigators start with.

                                                        \n

                                                        Click on the  Items Directory tab then Create Item give this a name e.g. New Investigator Setup and set the Type to Setup

                                                        \n

                                                        On the Description tab to set the description click the  button to get an editor.

                                                        \n

                                                        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 @Compendium[CoC7.items.3elxAwnv7WCUNwng]{Punch} onto the setup.

                                                        \n

                                                        On the Characteristics tab you can customise how investigator characteristics are rolled / bought

                                                        \n

                                                        On the Skills tab you can drag the skills the investigator will have.

                                                        \n

                                                        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

                                                        \n

                                                        Occupation

                                                        \n

                                                        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 @Compendium[CoC7.items.NOsh6EdNSjpjahDF]{Occupation Example}

                                                        \n

                                                        Click on the  Items Directory tab then Create Item give this a name e.g. Driver and set the Type to Occupation

                                                        \n

                                                        On the Description tab to set the description click the  button to get an editor.

                                                        \n

                                                        On the Details tab you can set the Occupation Points calculation and Minimum/Maximum Credit Rating

                                                        \n

                                                        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.

                                                        \n

                                                        Creating your first investigator

                                                        \n

                                                        Character

                                                        \n

                                                        To complete your character you need to have an active scene which can be created in the  Scenes Directory.

                                                        \n

                                                        Click on the  Actors Directory tab then Create Item give this a name e.g. New Investigator and set the Type to Character.

                                                        \n

                                                        You 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}

                                                        \n

                                                        Next drag your occupation created above on to the character or drag this example instead @Compendium[CoC7.items.NOsh6EdNSjpjahDF]{Occupation Example}

                                                        \n

                                                        On the left hand menu bar select  Keeper's tools then select  Character creation mode.

                                                        \n

                                                        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.

                                                        \n

                                                        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

                                                        \n\n
                                                        "} +{"_id":"di6mcnaxfyi0y2l4","name":"Items [en]","content":"
                                                        \n

                                                        Items

                                                        \n

                                                        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.

                                                        \n

                                                        To create any of the types of items you always start the same way

                                                        \n
                                                          \n
                                                        1. Go to the items directory
                                                        2. \n
                                                        3. Click on Create Item\n
                                                            \n
                                                          • Give it a name
                                                          • \n
                                                          • Select the item Type (see below for details on each one)
                                                          • \n
                                                          • Select the destination folder.
                                                          • \n
                                                        4. \n
                                                        \n

                                                        And have some common structure so on all of them:

                                                        \n
                                                          \n
                                                        • You can add a textual description on the Description tab or just on the main window if it doesn't have tabs.
                                                        • \n
                                                        • If you click on the icon you can pick or upload a new one
                                                        • \n
                                                        \n

                                                        Available types

                                                        \n
                                                          \n
                                                        • @Compendium[CoC7.system-doc.kv2tbz6x29cq6ewq]{Item Type: Archetype}
                                                        • \n
                                                        • @Compendium[CoC7.system-doc.oruecvy7jne4u4gt]{Item Type: Book}
                                                        • \n
                                                        • @Compendium[CoC7.system-doc.VdOeGcxsu3jsVm3F]{Item Type: Chases}
                                                        • \n
                                                        • Item Type: Item
                                                        • \n
                                                        • @Compendium[CoC7.system-doc.qa934whpkpauiyc9]{Item Type: Occupation}
                                                        • \n
                                                        • @Compendium[CoC7.system-doc.JU1GCWwc8at7gzJ4]{Item Type: Setup}
                                                        • \n
                                                        • @Compendium[CoC7.system-doc.mz0ulbkecfvv8nw7]{Item Type: Skill}
                                                        • \n
                                                        • Item Type: Spell
                                                        • \n
                                                        • Item Type: Status
                                                        • \n
                                                        • Item Type: Talent
                                                        • \n
                                                        • Item Type: Weapon
                                                        • \n
                                                        \n\n
                                                        "} +{"_id":"kv2tbz6x29cq6ewq","name":"Item Type: Archetype [en]","content":"
                                                        \n

                                                        Item Type: Pulp Archetype

                                                        \n

                                                        Archetypes are used on Pulp games. They provide skill and characteristic bonuses.

                                                        \n

                                                        Once the Archetype item has been created, the Archetype Sheet is shown.\nThere you can define the details of the Archetype:

                                                        \n
                                                          \n
                                                        • On the Details tab you can:\n
                                                            \n
                                                          • Assign the number of Additional points
                                                          • \n
                                                          • Assign the number of Pulp Talents
                                                          • \n
                                                          • Define the Basic Characteristics and if you want to Use a dice roll to generate them.
                                                          • \n
                                                          • Define the Suggested Occupations
                                                          • \n
                                                          • Define the Suggested Traits
                                                          • \n
                                                        • \n
                                                        • On the Skills tab you can:\n
                                                            \n
                                                          • Drag the skills corresponding to this Archetype
                                                          • \n
                                                        • \n
                                                        \n\n
                                                        "} +{"_id":"oruecvy7jne4u4gt","name":"Item Type: Book [en]","content":"
                                                        \n

                                                        Item Type: Book

                                                        \n

                                                        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.

                                                        \n\n
                                                        "} +{"_id":"qa934whpkpauiyc9","name":"Item Type: Occupation [en]","content":"
                                                        \n

                                                        Item Type: Occupation

                                                        \n

                                                        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.

                                                        \n

                                                        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.

                                                        \n
                                                          \n
                                                        1. Go to the  Items Directory tab

                                                        2. \n
                                                        3. Click on  Create Item

                                                          \n
                                                            \n
                                                          1. Give the set up a name e.g. Librarian
                                                          2. \n
                                                          3. Set Type to Occupation
                                                          4. \n
                                                        4. \n
                                                        5. On the Description tab you can change the name, icon, name of the source book, and description

                                                        6. \n
                                                        7. On the Details tab you can control

                                                          \n
                                                            \n
                                                          1. Select the Occupation Type

                                                          2. \n
                                                          3. 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.

                                                            \n
                                                              \n
                                                            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. \n
                                                            3. Finally you will have to define the Minimum and Maximum value for the Credit Rating skill for this occupation.
                                                            4. \n
                                                          4. \n
                                                          5. Names of biography sections (click on the + to add extra Biography sections), this can be replaced with a single block biography in settings

                                                          6. \n
                                                          7. Under items you can drag and drop default items and weapons

                                                          8. \n
                                                        8. \n
                                                        9. 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
                                                            \n
                                                          1. The Common Skills includes the default occupation skills that can't be changed
                                                          2. \n
                                                          3. 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.
                                                          4. \n
                                                          5. Finally the Additional Skills allows you to enter a number of skills the player can choose from the rest of the available skills.
                                                          6. \n
                                                        10. \n
                                                        \n\n
                                                        "} +{"_id":"JU1GCWwc8at7gzJ4","name":"Item Type: Setup [en]","content":"
                                                        \n

                                                        Item Type: Setup

                                                        \n

                                                        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).

                                                        \n
                                                          \n
                                                        1. Go to the  Items Directory tab

                                                        2. \n
                                                        3. Click on  Create Item

                                                          \n
                                                            \n
                                                          1. Give the set up a name e.g. 1920's Setup
                                                          2. \n
                                                          3. Set Type to Setup
                                                          4. \n
                                                        4. \n
                                                        5. On the Description tab you can change the name, icon, name of the source book, and description

                                                        6. \n
                                                        7. On the Details tab you can control

                                                          \n
                                                            \n
                                                          1. Show / Hide the Characteristics tab with the Enable characteristics checkbox
                                                          2. \n
                                                          3. Which version of Call of Cthulhu this is for, this can be filtered in compendiums
                                                          4. \n
                                                          5. Names of biography sections (click on the + to add extra Biography sections), this can be replaced with a single block biography in settings
                                                          6. \n
                                                          7. Under items you can drag and drop default items and weapons
                                                          8. \n
                                                        8. \n
                                                        9. On the Characteristics tab you can set a points buy or roll characteristics and the formula

                                                        10. \n
                                                        11. On the Skills tab under common skill you can drag and drop default skills

                                                        12. \n
                                                        \n\n
                                                        "} +{"_id":"mz0ulbkecfvv8nw7","name":"Item Type: Skill [en]","content":"
                                                        \n

                                                        Item Type: Skill

                                                        \n

                                                        A skill will be rolled during tests.

                                                        \n
                                                          \n
                                                        1. Go to the  Items Directory tab

                                                        2. \n
                                                        3. Click on  Create Item

                                                          \n
                                                            \n
                                                          1. Give the skill a name e.g. Art/Craft (Dancing)
                                                          2. \n
                                                          3. Set Type to Skill
                                                          4. \n
                                                        4. \n
                                                        5. On the Description tab you can change the name, icon, Cthulhu Flavors (which editions this appears in), and description

                                                          \n
                                                            \n
                                                          1. No adjustment - Can not be assigned personal skill points.
                                                          2. \n
                                                          3. No XP gain - You do not mark this skill for improvement on a success.
                                                          4. \n
                                                          5. Specialization - This skill is part of a group like Pilot or Flighting.
                                                          6. \n
                                                          7. Uncommon - This skill is uncommon and can be automatically hidden on the character sheet.
                                                          8. \n
                                                          9. Pushed - This skill can be pushed.
                                                          10. \n
                                                          11. Fighting - Automatically set Specialization, Combat, and the specialization name to Fighting.
                                                          12. \n
                                                          13. Firearms - Automatically set Specialization, Combat, and the specialization name to Firearms.
                                                          14. \n
                                                        6. \n
                                                        \n\n
                                                        "} +{"_id":"fk040vqb4per5ju1","name":"Links [en]","content":"
                                                        \n

                                                        Links

                                                        \n
                                                          \n
                                                        • Links are a way for a GM to request for a roll (Characteristic, Attribute, Skill, SAN loss, Weapon).
                                                        • \n
                                                        • Links can contain an active effect.
                                                        • \n
                                                        • Links are created in the chat log. When you click a link it will trigger a check for your(s) controlled/impersonated character(s).
                                                        • \n
                                                        • Links can be included in any editor, mainly journal entries.
                                                        • \n
                                                        • Link can be created in 5 ways:\n
                                                            \n
                                                          • By manually typing it (read details below).
                                                          • \n
                                                          • By CTRL+click on any sheet element (Characteristic, Attribute, skill, SAN loss).
                                                          • \n
                                                          • By dragging a sheet element (Characteristic, Attribute, skill (+CTRL)) on an editor (Journal entry)
                                                          • \n
                                                          • 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.
                                                          • \n
                                                          • By using the included compendium written by Lozalojo.
                                                          • \n
                                                        • \n
                                                        • Links can be dragged from chat log on an editor.
                                                        • \n
                                                        • When a link is created the difficulty/penalty selection windows will open. Hold SHIFT to bypass that comportment.
                                                        • \n
                                                        • When a link is created, the roll mode will be check. If the roll mode is set to 'blind GM roll' the link will be created as blind.
                                                        • \n
                                                        • When a link is created with a difficulty and a penalty, the difficulty/penalty windows will not pop.
                                                        • \n
                                                        • When a link is created without a difficulty or a penalty, the difficulty/penalty windows will pop. Holding SHIFT will fastforward the roll (regular/no penalty).
                                                        • \n
                                                        \n

                                                        Writing links

                                                        \n
                                                          \n
                                                        • Links should be written using the @Compendium[CoC7.system-doc.emuu3wo0uul91029]{Link creation tool}. The link creation window is a tool for GM. It's located in the left side bar.
                                                        • \n
                                                        \n

                                                        Links for chat messages and sheet editors (NPC, Journal entries...).\nFormat of link is @coc7.TYPE_OF_REQUEST[OPTIONS]{TEXT_TO_DISPLAY}

                                                        \n
                                                          \n
                                                        • TYPE_OF_REQUEST :\n
                                                            \n
                                                          • sanloss: trigger a san check, upon failure will propose to deduct the corresponding SAN.
                                                          • \n
                                                          • check: trigger a check depending on the options.
                                                          • \n
                                                          • item: trigger use of a weapon. Only items of type weapon can be triggered.
                                                          • \n
                                                        • \n
                                                        • OPTIONS: [] = optional, default\n
                                                            \n
                                                          • sanloss:\n
                                                              \n
                                                            • sanMax: max SAN loss
                                                            • \n
                                                            • sanMin: min SAN loss
                                                            • \n
                                                          • \n
                                                          • check:\n
                                                              \n
                                                            • type: type of check ( characteristic, skill, attrib).
                                                            • \n
                                                            • name: name of the skill/characteristic/attrib.
                                                            • \n
                                                            • [blind]: will force a blind check, if not present the check will depend on your selected roll mode.
                                                            • \n
                                                          • \n
                                                          • all:\n
                                                              \n
                                                            • [difficulty]: ? (blind), 0 (regular), + (hard), ++ (extreme), +++ (critical).
                                                            • \n
                                                            • [modifier]: -x (x penalty dice), +x (x bonus dice), 0 (no modifier).
                                                            • \n
                                                            • [icon]: icon tu use (font awesome, fas fa-dice).
                                                            • \n
                                                          • \n
                                                        • \n
                                                        • TEXT_TO_DISPLAY: Name to display, this is optional.
                                                        • \n
                                                        \n

                                                        Examples

                                                        \n\n\n\n\n\n\n\n\n\n\n\n\n
                                                        LinkResult
                                                        @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)
                                                        \n

                                                        Using links

                                                        \n
                                                          \n
                                                        • You can drag/drop links from chat to sheets and between sheets.
                                                        • \n
                                                        • You can drag/drop a link directly on a token.
                                                        • \n
                                                        • 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.
                                                        • \n
                                                        • 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.\n
                                                            \n
                                                          • This will open the select penalty/difficulty dialogue. Clicking on the generated link will then trigger the check with all parameters.
                                                          • \n
                                                          • Holding Shift on top will not open the penalty/difficulty dialogue. Clicking on the generated link will open the penalty/difficulty dialogue then trigger the check.
                                                          • \n
                                                        • \n
                                                        \n\n
                                                        "} +{"_id":"emuu3wo0uul91029","name":"Link creation tool [en]","content":"
                                                        \n

                                                        Link creation tool

                                                        \n

                                                        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

                                                        \"Creation

                                                        \n

                                                        using 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.

                                                        \n

                                                        Main window

                                                        \n

                                                        Clicking on the tool icon will open a window :

                                                        \n

                                                        \"Main

                                                        \n

                                                        You can there select options for you link.

                                                        \n
                                                          \n
                                                        • "Compendium packs" and "Items directory" allows you to reference an object from corresponding folder.
                                                        • \n
                                                        • "Modifiers" will allows you to add modifiers to your check.
                                                        • \n
                                                        • "blind" will force the roll mode to be blind.
                                                        • \n
                                                        • "Label" will allows you to change the display label.
                                                        • \n
                                                        • "Icon" will allows you to choose an icon for your link. Icons can be :\n
                                                            \n
                                                          • A font awesome or a game-icons reference : "fas fa-ankh" or "game-icon game-icon-tentacle-strike".
                                                          • \n
                                                          • A link to an image in the system data or system core: "icons/magic/symbols/arrowhead-green.webp".
                                                          • \n
                                                        • \n
                                                        \n

                                                        If you do not supply a label and/or an icon, a default label and icon will be added.

                                                        \n

                                                        \"default

                                                        \n

                                                        Effects window

                                                        \n

                                                        Selecting 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.

                                                        \n

                                                        Using links

                                                        \n
                                                          \n
                                                        • Once your link is created and valid it will appear in a white box in the middle of the window.
                                                        • \n
                                                        \n

                                                        \"link

                                                        \n
                                                          \n
                                                        • 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.
                                                        • \n
                                                        \n

                                                        \"link

                                                        \n
                                                          \n
                                                        • When a player clicks a link the corresponding action will be performed by his character.
                                                        • \n
                                                        • When a GM clicks a link the corresponding action will be performed by his selected tokens.
                                                        • \n
                                                        • A link drag/dropped in journal entries, on a token etc...
                                                        • \n
                                                        \n

                                                        \"link

                                                        \n\n
                                                        "} +{"_id":"ce7s8psgyctzx5r1","name":"Sanity [en]","content":"
                                                        \n

                                                        Sanity Checks

                                                        \n

                                                        The system has integrated the sanity check workflow and can handle sanity rolls, tracking Sanity loss and rolling for temporal insanity.

                                                        \n

                                                        Requesting Sanity rolls

                                                        \n
                                                          \n
                                                        • The Keeper can click with Ctrl+Shift on the Sanity of character to request a Sanity Check for the character

                                                          \n
                                                            \n
                                                          • 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.
                                                          • \n
                                                        • \n
                                                        • Video showing the Sanity check workflow

                                                        • \n
                                                        \n\n
                                                        "} \ No newline at end of file diff --git a/styles/chat/all.less b/styles/chat/all.less index 5e8bd370..0c1beb40 100644 --- a/styles/chat/all.less +++ b/styles/chat/all.less @@ -3,60 +3,49 @@ display: grid; grid-template-columns: 36px auto 36px; grid-template-areas: 'left-portrait card-title right-portrait'; - .left-portrait { height: 36px; grid-area: left-portrait; } - .card-title { height: 36px; grid-area: card-title; } - .right-portrait { height: 36px; grid-area: right-portrait; } } - .card-title { line-height: 36px; font-size: 20px; text-align: center; font-weight: bolder; } - .portrait { object-fit: contain; border: 0; } - .status-list { padding: 3px 0; border-bottom: 2px groove #fff; } - .player-actions { &:empty { display: none; } - margin: 0 !important; padding: 3px 0; border-bottom: 2px groove #fff; } - .gm-actions { &:empty { display: none; } - margin: 0 !important; padding: 3px 0; background-color: gainsboro; } - .info { &.important { color: darkred; @@ -65,7 +54,6 @@ font-weight: bold; } } - .status { display: inline; height: auto; @@ -79,12 +67,10 @@ border: 1px solid #999; border-radius: 3px; background: rgba(0, 0, 0, 0.05); - &.important { background-color: rgba(0, 0, 0, 0.05); color: darkred; } - &.pending { box-shadow: 0 0 4px darkred; } diff --git a/styles/chat/chat-card.less b/styles/chat/chat-card.less index f678bd53..bf6dafd7 100644 --- a/styles/chat/chat-card.less +++ b/styles/chat/chat-card.less @@ -2,11 +2,9 @@ .upgrade-success { color: darkolivegreen; } - .upgrade-failed { color: darkred; } - h4.san-result { flex: 0 0 100%; line-height: 24px; @@ -17,16 +15,13 @@ box-shadow: 0 0 2px #fff inset; font-size: 20px; font-weight: bold; - &.loss { color: darkred; } - &.resist { color: green; } } - h4.con-result { flex: 0 0 100%; line-height: 24px; @@ -37,11 +32,9 @@ box-shadow: 0 0 2px #fff inset; font-size: 20px; font-weight: bold; - &.loss { color: darkred; } - &.resist { color: green; } diff --git a/styles/chat/damage.less b/styles/chat/damage.less index 9544aed2..0654e3f1 100644 --- a/styles/chat/damage.less +++ b/styles/chat/damage.less @@ -3,7 +3,6 @@ display: flex; justify-content: flex-end; } - .options { display: flex; flex-direction: row; @@ -14,18 +13,15 @@ justify-content: flex-end; align-items: center; } - .ic-switch { height: 16px; line-height: 16px; - flex: 0; + flex: none; } - label { height: 16px; line-height: 16px; } - form { flex: 0 0 40px; input { @@ -34,7 +30,6 @@ line-height: 16px; } } - .owner-info { flex: 0 0 content; line-height: 22px; @@ -49,18 +44,15 @@ top: 0; bottom: 0; padding: 0 2px; - display: flex; visibility: visible !important; justify-content: space-between; align-items: center; z-index: 1; } - .die-result-overlay-br span { display: flex; } - .die-result-overlay-br button { width: 20px; height: 20px; @@ -71,7 +63,6 @@ padding: 0; visibility: visible !important; } - .die-result-overlay-br button.icon { background-size: 14px; background-repeat: no-repeat; diff --git a/styles/chat/interactive-card.less b/styles/chat/interactive-card.less index e1415dea..f900f9ba 100644 --- a/styles/chat/interactive-card.less +++ b/styles/chat/interactive-card.less @@ -11,11 +11,9 @@ background: transparent; font-style: italic; color: grey; - &:hover { background-color: lightgray; } - &.switched-on { border: 1px solid red; border-radius: 3px; @@ -25,7 +23,6 @@ font-style: normal; } } - a.ic-radio-switch, a.ic-switch { display: inline-block; @@ -37,11 +34,9 @@ background: transparent; font-weight: normal; color: grey; - &:hover { background-color: lightgray; } - &.switched-on { color: black; border: none; @@ -49,7 +44,6 @@ font-weight: bold; } } - .card-result { position: relative; margin: 0; diff --git a/styles/chat/obstacle-card.less b/styles/chat/obstacle-card.less new file mode 100644 index 00000000..a5068bbd --- /dev/null +++ b/styles/chat/obstacle-card.less @@ -0,0 +1,194 @@ +.coc7.chat-card.obstacle-card { + .gm-actions { + .status-list { + display: block; + padding: 3px 0; + border-bottom: none; + border-top: 2px groove #fff; + + .movement-action { + display: inline-block; + } + + .warning { + background-color: rgba(255, 166, 0, 0.5); + } + + .error { + background-color: rgba(255, 0, 0, 0.5); + } + + .success { + .success-color(); + } + + .failure { + .failure-color(); + } + + .fumble { + .fumble-color(); + } + + .strong { + font-weight: bold; + } + + .consume { + text-decoration: line-through; + color: darkred; + // background-image: linear-gradient(yellow, red); + } + } + } + .card-header { + .card-title { + display: flex; + align-items: center; + justify-content: center; + } + } + + button { + &.disabled { + background: rgba(255, 255, 255, 0.5) !important; + &:hover { + box-shadow: none !important; + } + } + } + + .card-buttons { + span { + line-height: 1.5rem; + border: none; + } + button { + font-size: 12px; + height: 24px; + line-height: 20px; + margin: 2px 0; + background: rgba(255, 255, 240, 0.8); + border: 1px solid #b5b3a4; + border-radius: 3px; + width: 100%; + font-family: 'Signika', sans-serif; + } + } + + .form-group { + &.small { + .toggle-icon, + .icon { + font-size: 1rem; + line-height: 1.25rem; + padding: 1px 6px; + display: inline; + flex: 0; + vertical-align: middle; + + &.bigger { + padding: 1px 4px; + font-size: 1.4rem; + } + + &.switched-off { + display: inline; + } + &.switched-on { + color: red; + text-shadow: 0 0 8px red; + border: none; + background: none; + box-shadow: none; + } + } + + input { + margin: 0; + line-height: 1.25rem; + height: calc(100% - 2px); + } + + button { + &.button-icon { + line-height: 1.25rem; + padding: 1px 6px; + display: inline; + flex: 0; + background: none; + border: none; + font-size: 1rem; + &:hover { + box-shadow: none; + text-shadow: 0 0 8px red; + } + } + } + } + + &.armor { + height: 16px; + line-height: 16px; + .ecc-switch { + color: grey; + border: none; + box-shadow: none; + font-weight: bold; + + font-size: 20px; + flex: 0; + + &.switched-off { + color: black; + } + } + + label { + height: 16px; + line-height: 16px; + color: black; + font-weight: bold; + flex: 0 0 content; + } + + input { + height: 16px; + flex: 0 0 40px; + text-align: end; + } + } + } + + .switched-off { + display: block; + } + + .movement-action { + display: flex; + justify-content: center; + align-items: center; + .deficit { + color: red; + text-shadow: 0 0 8px red; + } + .base { + color: gray; + &.deficit { + text-shadow: 0 0 8px red; + } + &.available { + color: goldenrod; + } + } + } + + .player-actions { + .info { + .roll-line { + line-height: 1.25rem; + min-height: 1.25rem; + } + } + } +} diff --git a/styles/chat/roll-card.less b/styles/chat/roll-card.less index a738709f..25badaeb 100644 --- a/styles/chat/roll-card.less +++ b/styles/chat/roll-card.less @@ -2,7 +2,6 @@ .dice-roll { padding: 0; } - .card-result { position: relative; margin: 0; @@ -15,7 +14,6 @@ word-break: break-all; margin-top: 5px; } - &.opposed { &.combat { .attacker { @@ -25,7 +23,6 @@ } } } - .opposed-card-flag { flex: none; color: white; @@ -33,7 +30,6 @@ color: red; } } - h4.card-result { flex: 0; display: block; @@ -49,23 +45,19 @@ border-radius: 3px; box-shadow: 0 0 2px #fff inset; word-break: break-all; - &.success { color: darkgreen; } - &.failure { color: darkred; } } - ol { padding: 0; list-style: none; background: none; box-shadow: none; border: none; - li.actor-roll { list-style: none; display: flex; @@ -75,29 +67,24 @@ width: 100%; align-items: center; margin-bottom: 4px; - .roll-details { width: 100%; display: flex; flex-direction: column; - .header { height: 16px; width: 100%; display: flex; flex-direction: row; - .name { flex: 1; } - a { height: 16px; line-height: 16px; } } } - span.pending { width: 100%; background: rgba(0, 0, 0, 0.05); @@ -110,20 +97,17 @@ display: inline-block; text-align: center; } - &.won { border: 2px groove goldenrod; &.tie { border-color: red; } } - a { line-height: 36px; height: 36px; flex: none; } - img { width: 36px; height: 36px; @@ -133,7 +117,6 @@ border: none; margin-right: 2px; } - .actor-card-buttons { flex: 1; display: flex; @@ -142,7 +125,6 @@ margin: 0; align-self: center; } - .roll-result { width: 100%; } diff --git a/styles/chat/rolls.less b/styles/chat/rolls.less index 91004aab..6b59039a 100644 --- a/styles/chat/rolls.less +++ b/styles/chat/rolls.less @@ -2,35 +2,28 @@ background-color: #ffcc99; color: #cc6600; } - .hard-success-color { background-color: #ffff99; color: #cc9900; } - .extreme-success-color { background-color: #ccff99; color: #009933; } - .critical-color { background-color: whitesmoke; color: goldenrod; } - .fumble-color { background-color: black; color: crimson; } - .success-color { color: green; } - .failure-color { color: red; } - .coc7-check-tooltip { width: 280px; position: fixed; @@ -41,7 +34,6 @@ box-shadow: 0 0 10px #000; text-shadow: none; color: #191813; - .roll-icons.success { color: goldenrod; } @@ -50,20 +42,16 @@ font-size: 20px; font-weight: bold; } - .roll-icons.failure { color: crimson; } - .roll-icons.fumble { color: crimson; font-size: 20px; font-weight: bold; } - .dice-rolls { display: flex; - .check-result { font-size: 16px; padding: 0 5px; @@ -73,31 +61,21 @@ justify-content: flex-end; } } - - // .part-total.fumble{ - // background-color: darkred; - // } - .part-total.regular-success { .regular-success-color(); } - .part-total.hard-success { .hard-success-color(); } - .part-total.extreme-success { .extreme-success-color(); } - .part-total.critical { .critical-color(); } - .part-total.fumble { .fumble-color(); } - .part-total.success { .success-color(); } @@ -105,28 +83,22 @@ .failure-color(); } } - .coc7-check-result { &.regular-success { .regular-success-color(); } - &.hard-success { .hard-success-color(); } - &.extreme-success { .extreme-success-color(); } - &.critical { .critical-color(); } - &.fumble { .fumble-color(); } - &.success { .success-color(); } diff --git a/styles/chat/san-chat-card.less b/styles/chat/san-chat-card.less index 1a5dfa1d..b4318e2c 100644 --- a/styles/chat/san-chat-card.less +++ b/styles/chat/san-chat-card.less @@ -3,27 +3,17 @@ padding: 0 0 3px 0; border-bottom: 2px groove #fff; } - .dice-formula { margin: 0 !important; } - .dice-roll { padding-top: 3px; } - - // .san-check, .int-check{ - // .check-result{ - // display: none; - // } - // } - .san-loss-roll { .dice-formula { display: none; } } - .status-list { display: none; } diff --git a/styles/dev.less b/styles/dev.less new file mode 100644 index 00000000..075cc5e6 --- /dev/null +++ b/styles/dev.less @@ -0,0 +1,6 @@ +.floating-debug { + position: absolute; + left: -40px; + color: darkred; + font-size: 2rem; +} diff --git a/styles/interface/app.less b/styles/interface/app.less index af4756ae..4d4baa24 100644 --- a/styles/interface/app.less +++ b/styles/interface/app.less @@ -1,21 +1,125 @@ +.coc7 { + input.right-text { + text-align: right; + } +} .coc7.dialog { - .selectable:hover { - text-shadow: 0 0 8px var(--main-sheet-interactie-color); + &.chase-participant-importer { + .tag { + height: 0.75rem; + line-height: 0.75rem; + border-color: orange; + } + + input:read-only, + input:read-only:hover, + input:read-only:focus { + border: 1px solid transparent; + box-shadow: none; + cursor: default; + } + + .separator { + border-bottom: 3px groove; + } + + .actor-header { + a.food-chain { + font-size: 1.5rem; + &.chaser { + color: red; + } + &.prey { + color: green; + } + } + display: flex; + line-height: 2rem; + img { + border: none; + width: 2rem; + height: 2rem; + } + .actor-name { + flex: 1; + text-align: center; + font-weight: bolder; + } + } + .form-group { + .group-label { + flex: 9; + border: 1px solid transparent; + padding: 0 3px; + display: flex; + align-items: center; + + &.inline-roll { + flex: 0; + display: block; + border: none; + a, + i { + font-size: 0.75rem; + } + div { + flex: none; + display: block; + } + } + label { + flex: 1; + padding: 0; + border: 0; + } + } + + .group-result { + flex: 1; + text-align: right; + padding: 1px 3px; + margin: 0 0 1px 0; + line-height: 1.25rem; + border: 1px solid transparent; + } + + a, + i { + line-height: 20px; + font-size: 1rem; + } + + &.triple { + label { + flex: 3; + } + .name { + flex: 6; + } + .value { + flex: 1; + } + } + } } + .selectable:hover { + text-shadow: 0 0 8px var(--main-sheet-interactive-color); + } .selected { - text-shadow: 0 0 4px var(--main-sheet-interactie-color); + text-shadow: 0 0 4px var(--main-sheet-interactive-color); h4 { font-weight: bold; } } - + .error { + color: red; + } button { &.inactive:hover { box-shadow: 0 0 5px grey; } } - &.char-select { .item-list { .item { @@ -23,38 +127,31 @@ } } } - &.char-select, &.skill-select { a.roll-characteristic { flex: 0; padding-left: 5px; } - a.increase-characteristic { flex: 0; padding-left: 9px; } - a.decrease-characteristic, a.reset-characteristic { flex: 0; padding-right: 9px; } - .item-controls { flex: 0; padding-right: 20px; } - .points, .counter { justify-content: center; - &.warning { color: red; } - span { height: 22px; line-height: 22px; @@ -66,3 +163,9 @@ } } } +#bonus-roll-form { + div.flexrow { + margin: 2px 0; + align-items: center; + } +} diff --git a/styles/interface/combat-tracker.less b/styles/interface/combat-tracker.less index 5f2145be..a3c58e77 100644 --- a/styles/interface/combat-tracker.less +++ b/styles/interface/combat-tracker.less @@ -1,35 +1,22 @@ #combat-tracker { .token-initiative { - // overflow: hidden; - // white-space:nowrap; - // text-overflow:ellipsis; - &.fumble { background-color: black; color: crimson; } - &.failure { color: red; } - &.regular-success { - // background-color: #ffcc99; color: #cc6600; } - &.hard-success { - // background-color: #ffff99; color: #cc9900; } - &.extreme-success { - // background-color: #ccff99; color: #009933; } - &.critical { - // background-color: whitesmoke; color: goldenrod; } } diff --git a/styles/interface/compendium.less b/styles/interface/compendium.less index ad7f15e0..d1b9afd2 100644 --- a/styles/interface/compendium.less +++ b/styles/interface/compendium.less @@ -1,4 +1,5 @@ -a.compendium-translation { +#sidebar a.compendium-translation, +#sidebar a.actor-import { border-top: 2px groove #444; padding-top: 4px; font-size: 20px; @@ -6,3 +7,17 @@ a.compendium-translation { line-height: 32px; display: block; } + +.coc7overview h1:not(:first-child) { + margin-top: 2rem; +} + +div.coc7overview li { + margin: 0.3rem; +} + +div.coc7overview code { + background: @greyBackground; + padding: 0.1rem; + line-height: 1.2rem; +} diff --git a/styles/interface/controls.less b/styles/interface/controls.less index cc3089c7..2e98b9ce 100644 --- a/styles/interface/controls.less +++ b/styles/interface/controls.less @@ -1,20 +1,16 @@ #controls { - .scene-control.custom-control { + .coc7-menu { background: rgba(30, 80, 80, 0.5) !important; - &.active, &:hover { border: 1px solid green !important; border-bottom: 1px solid #008060 !important; box-shadow: 0 0 10px #008060 !important; } - - .control-tool { - &.xp_toggle { - &.active { - color: goldenrod; - } - } + } + li.control-tool.active { + i.fa-certificate { + color: goldenrod; } } } diff --git a/styles/interface/dropdown.less b/styles/interface/dropdown.less new file mode 100644 index 00000000..899cf04f --- /dev/null +++ b/styles/interface/dropdown.less @@ -0,0 +1,39 @@ +.dropbtn { + font-size: 10px; + border: none; + cursor: pointer; + display: inline-block; + width: 100%; + height: 100%; +} +.dropdown { + &:hover { + background-color: lightgray; + } + position: relative; + display: inline-block; + a { + &:hover { + background-color: #ddd; + text-shadow: 0 0 8px red; + } + } +} +.dropdown-content { + display: block; + visibility: hidden; + position: absolute; + background-color: #f1f1f1; + min-width: 126px; + overflow: auto; + box-shadow: 0px 8px 16px 0px rgba(0, 0, 0, 0.2); + z-index: 1; + a { + color: black; + text-decoration: none; + display: block; + } +} +.show { + visibility: visible; +} diff --git a/styles/sheets/actor.less b/styles/sheets/actor.less index 3b92faef..37ba9e10 100644 --- a/styles/sheets/actor.less +++ b/styles/sheets/actor.less @@ -4,12 +4,10 @@ color: darkred; font-weight: bolder; } - &.header { flex: initial; border-bottom: 1px groove; line-height: 1.25rem; - .header-section { border-right: 1px groove; display: flex; @@ -19,69 +17,57 @@ border-right: none; } } - input { width: 1.875rem; padding: 0; margin: 0; } } - .button { flex: 0 0 auto; margin: 1px; color: black; } - .flagged4dev { color: goldenrod; } - .item { flex: 0 0 0.625rem; - .skill-name { flex: 1; font-size: 0.75rem; height: 1rem; padding: 0; text-align: left; - &.flagged4dev { &.rollable:hover { cursor: pointer; } } } - .item-controls { flex: 0 0 1.875rem; line-height: 1rem; font-size: 0.625rem; padding: 0 2px; - .item-control { &:hover { cursor: default; } - &.clickable:hover { cursor: pointer; } } } } - .adjustment-value { &.not-available { background: white; } - border-right: groove 1px; flex: 0; height: 1rem; line-height: 1rem; - input { font-size: 0.6875rem; flex: 0 0 0.9375rem; @@ -92,7 +78,6 @@ } } } - .sheet-section { h3 { margin: 0 -5px 0 0; @@ -101,7 +86,6 @@ font-weight: bold; font-size: 13px; } - .editor { width: 100%; height: 12.5rem; @@ -110,17 +94,14 @@ line-height: normal; font-size: 0.75rem; } - .resizededitor { .editor { height: 100%; } } - .editor-content { overflow-x: hidden; } - .section-header { margin: 2px 0 0 0; padding: 0; @@ -130,20 +111,26 @@ line-height: 0.9375rem; height: 100%; } + .pannel:not(.expanded) { + display: none; + } + .npc-specialization { + color: #a42; + font-size: 70%; + flex: none; + padding-left: 2px; + } } - input:read-only:hover, input:read-only:focus { border: 1px solid transparent; box-shadow: none; cursor: default; } - .read-only:hover, .read-only:focus { border: 1px solid black; } - .info-fields { .form-group { label { @@ -157,4 +144,14 @@ } } } + .unlock-control { + flex: 0 0 30px; + margin-top: 2px; + } + .unlock-control-disabled { + flex: 0 0 30px; + margin-top: 2px; + color: darkred; + cursor: not-allowed; + } } diff --git a/styles/sheets/book.less b/styles/sheets/book.less index 82058118..64bf3479 100644 --- a/styles/sheets/book.less +++ b/styles/sheets/book.less @@ -11,6 +11,10 @@ background: var(--main-sheet-front-color); border: none; } + .window-content { + background: var(--other-sheet-bg); + background-repeat: repeat; + } .container { display: grid; grid-template-columns: 0.7fr 1.5fr 0.8fr; @@ -195,6 +199,15 @@ text-shadow: none; } } + a.keeper-only-tab { + flex: 0 0 30px; + } + a.keeper-only-tab span { + vertical-align: bottom; + } + a.keeper-only-tab span i { + color: @colorGreen; + } } .body { input { @@ -208,19 +221,12 @@ border: 0.065rem solid var(--main-sheet-front-color); border-radius: 0.25rem; height: 100%; + overflow: scroll; padding: 0.15rem 0; } .details { display: grid; grid-template-columns: 1fr 1fr; - grid-template-rows: 1fr 1fr; - gap: 0px 0px; - grid-auto-flow: row; - grid-template-areas: - 'traits gains' - 'other other'; - display: grid; - grid-template-columns: 1fr 1fr; grid-template-rows: 0.2fr 1.8fr; gap: 0 0.1rem; grid-auto-flow: row; diff --git a/styles/sheets/character.less b/styles/sheets/character.less index c5ef0214..371124f9 100644 --- a/styles/sheets/character.less +++ b/styles/sheets/character.less @@ -2,8 +2,21 @@ &.character { .floating-left { position: absolute; - left: 140px; + left: 135px; color: var(--main-sheet-front-color); + // div { + // display: flex; + // flex-direction: row; + // position: relative; + // right: 1.3rem; + // } + a { + display: block; + // &.clean-skill-list { + // font-size: 1rem; + // margin-right: 0.3rem; + // } + } } .manual-override { @@ -24,6 +37,21 @@ border-image: var(--main-sheet-bg); border-image-slice: 450 200 50 200 fill; border-image-width: 450 200 50 200; + &.permission-limited { + background: var(--other-sheet-bg); + background-repeat: repeat; + border-image: none; + padding: 0 5px; + img.photo { + border: 0; + } + .sheet-portrait { + flex: 0 0 auto; + padding-bottom: 10px; + border-bottom: 2px groove; + justify-content: center; + } + } .container { background-image: var(--main-sheet-image); background-repeat: no-repeat; @@ -106,6 +134,9 @@ grid-template-columns: auto 2rem; align-items: center; justify-content: center; + &.flex { + display: flex; + } } .attribute-label { @@ -241,7 +272,7 @@ display: flex; flex-direction: row; flex-wrap: wrap; - justify-content: flex-start; + justify-content: space-around; align-items: center; a { @@ -252,11 +283,22 @@ } &.active { + &.keeper-only-tab span { + background-color: @colorGreen; + color: white; + } span { color: white; background-color: var(--main-sheet-front-color); } } + &.keeper-only-tab span { + color: @colorGreen; + + &:hover { + border: 1px solid @colorGreen; + } + } } .tab-name { @@ -284,7 +326,7 @@ margin-top: 2px; } - .unlock-control-disabbled { + .unlock-control-disabled { flex: 0 0 1.5rem; margin-top: 2px; color: darkred; @@ -316,6 +358,12 @@ list-style-type: decimal; } + .character-background { + .editor { + height: calc(100% - 40px); + } + } + .tab { height: 100%; } @@ -334,7 +382,7 @@ text-align: center; a:hover { - text-shadow: 0 0 10px var(--main-sheet-interactie-color); + text-shadow: 0 0 10px var(--main-sheet-interactive-color); } } @@ -353,6 +401,7 @@ height: 100%; flex-direction: column; flex-wrap: wrap; + margin: 0 0 10px; } .specialization-header { diff --git a/styles/sheets/chase.less b/styles/sheets/chase.less index 20aa492f..3e79faf5 100644 --- a/styles/sheets/chase.less +++ b/styles/sheets/chase.less @@ -1,7 +1,409 @@ .sheetV2.item.chase { - .sheet-body { - .tab.active { + .pin-image { + width: 2rem; + height: 2rem; + border: none; + background: none; + position: fixed; + left: -3rem; + top: -3rem; + } + + .pin-location.locationSet { + i { + color: red; + } + } + + .flex-content { + flex: 0; + } + + .form-group { + flex-wrap: nowrap; + height: 19.5px; + + .icon { + //duplicate of chase-card + font-size: 1rem; + line-height: 1.25rem; + padding: 1px 6px; + display: inline; + flex: 0; + + &.bigger { + padding: 1px 4px; + font-size: 1.4rem; + } + + &.switched-off { + display: inline; + } + &.switched-on { + color: red; + text-shadow: 0 0 8px red; + border: none; + background: none; + box-shadow: none; + } + } + } + + .flex-auto { + flex: 0 0 auto; + } + + .flex0 { + flex: 0; + } + + form { + .container { + &.expanded { + // display: flex; + // flex-direction: column; + // flex-wrap: nowrap; + grid-template-rows: 10.5rem 1.875rem auto; + } + + .location-control { + &.inactive { + color: grey; + cursor: not-allowed; + &:hover { + text-shadow: none; + } + } + } + + .sheet-header { + flex: 0 0 14rem; + height: 100%; + .sheet-portrait { + height: auto; + } + + .chase-location { + justify-content: center; + align-items: center; + flex-wrap: nowrap; + } + + .location-controls { + padding: 0.25rem; + justify-content: center; + flex: 0 0 1rem; + .icon { + font-size: 1.25rem; + } + } + + .active-location { + height: 100%; + padding: 0.25rem; + flex: 0 0 30rem; + display: flex; + .form-group { + flex: 0 0 1.4rem; + margin: 0; + padding: 0.25rem; + input { + height: auto; + font-size: 0.8rem; + } + .icon { + font-size: 1.25rem; + } + } + .location-name { + flex: 1; + text-align: center; + } + + .chase-control { + flex: 0; + margin: 0 0.25rem; + } + } + + .no-skill { + color: red; + } + } + + .sheet-body { + flex: auto; + + // .tab.active { + // display: block; + // } + + .tab { + .tab-pannel { + display: flex; + flex-direction: column; + height: 100%; + } + } + + .tab.setup { + flex-direction: column; + .init { + .form-group { + justify-content: center; + label { + flex: 0 0 auto; + } + + .button { + flex: 0 0 auto; + } + + input[type='text'] { + flex: 0 0 3rem; + text-align: center; + } + } + } + } + } + } + } +} + +.initiative-track { + display: flex; + flex-direction: row; + flex-wrap: nowrap; + // overflow-x: scroll; + // overflow-y: hidden; + .initiative-block { + border: 2px solid transparent; + margin: 0 1rem 0 0.2rem; + border-radius: 0.5rem; + flex: 0 0 10rem; + &.prey { + background-color: rgba(60, 128, 60, 0.1); + &.no-actions { + background-color: rgba(60, 60, 60, 0.1); + } + } + &.chaser { + background-color: rgba(128, 60, 60, 0.1); + &.no-actions { + background-color: rgba(60, 60, 60, 0.1); + } + } + &.active { + border-color: #ff6400; + } + + .participant-controls { + flex: 0 0 1rem; + flex-wrap: nowrap; + white-space: nowrap; + display: flex; + flex-direction: row; + } + + .separator { + flex: 0 0 0.2rem; + border-right: 2px groove; + margin-right: 0.2rem; + } + + .participant-control { + color: rgb(0, 0, 0); + flex: 0 0 auto; + margin-right: 0.2rem; + &.toggle { + color: goldenrod; + } + &.active { + color: rgb(0, 0, 0); + } + &.disabled { + color: white; + } + &.assisted { + color: goldenrod; + } + &.inactive { + color: #eee; + &:hover { + text-shadow: none; + cursor: default; + } + } + } + + .participant { + display: flex; + flex-direction: row; + flex-wrap: nowrap; + overflow: hidden; + .portrait { + flex: 0 0 4rem; + img { + border: none; + } + } + + .infos { + flex: 0 0 6rem; + div { + display: flex; + justify-content: center; + align-items: center; + } + input { + flex: 0 0 3rem; + height: 1.1rem; + } + } + } + + .movement-action { display: flex; + justify-content: center; + .deficit { + color: red; + text-shadow: 0 0 8px red; + } + .base { + color: gray; + &.deficit { + text-shadow: 0 0 8px red; + } + &.available { + color: goldenrod; + } + } + } + } +} + +.chase-track { + display: flex; + flex-direction: row; + flex-wrap: nowrap; + overflow-x: scroll; + padding: 0.25rem; + // background-attachment: local; + // background-image: linear-gradient(to right, red , blue); + + .flexrow { + flex-wrap: nowrap; + flex: 0 0 auto; + } + + .chase-location { + display: flex; + flex-direction: column; + flex-wrap: nowrap; + flex: 0 0 auto; + + &.drag-over { + background: rgba(0, 0, 0, 0.1); + } + + .people { + flex: 1; + min-height: 2rem; + .spacer { + flex: 0 0 1.5rem; + } + .list { + flex: 1; + display: flex; + justify-content: center; + .chase-participant { + width: 2rem; + + &.active { + img { + border: 1px solid #ff6400; + } + } + } + } + } + + // &:first-child{ + // min-width: fit-content; + // } + + .name { + min-width: 2rem; + } + + .line { + display: block; + height: 0.125rem; + background: black; + position: relative; + top: 1rem; + min-width: 1rem; + } + + .spacer { + min-width: 1rem; + } + + .fixed-line { + display: block; + height: 0.125rem; + background: black; + position: relative; + top: 1rem; + width: 1rem; + } + + .warning { + flex: 0; + height: 2rem; + font-size: 1.5rem; + display: flex; + align-items: center; + color: red; + } + + .name-container { + font-size: 1rem; + line-height: 1.75rem; + white-space: nowrap; + &:hover { + cursor: pointer; + } + border: 0.125rem solid black; + border-radius: 1rem; + color: black; + flex: 0 0 auto; + padding: 0 0.3rem; + height: 2rem; + &.empty { + padding: 0; + width: 2rem; + background-color: slategray; + &.init { + border: 0.125rem solid slategrey; + background-color: white; + &:hover { + cursor: auto; + } + } + } + &.active { + // scroll-snap-stop: always; + border: 0.125rem solid #ff6400; + } + &.init { + border: 0.125rem solid slategrey; + color: rgba(0, 0, 0, 0); + &:hover { + cursor: auto; + } + } } } } @@ -21,10 +423,29 @@ .participant { flex: 1; display: grid; - grid-template-columns: 2rem 2rem 0.5rem 5fr 2.5rem 2.5rem 4fr 2rem 3rem 1.25rem 2rem 1rem; + grid-template-columns: 2rem 2rem 0.5rem 5fr 2.5rem 2.5rem 4fr 2rem 3rem 1.25rem 2rem 1.5rem; grid-template-rows: 2rem; grid-template-areas: 'p-side p-icon p-expand p-name p-init p-movement p-speed-check p-score p-roll p-adjust p-modified-mov p-control'; align-items: center; + margin-bottom: 2px; + + &.excluded { + background: rgba(255, 0, 0, 0.05); + } + + &.escaped { + background: rgba(0, 0, 255, 0.05); + } + + &.chaser.fastest { + border-top: green 1px solid; + border-bottom: green 1px solid; + } + + &.prey.slowest { + border-top: red 1px solid; + border-bottom: red 1px solid; + } &.drag-over { border: 1px solid red; @@ -122,6 +543,10 @@ transform: rotate(180deg); } } + + .p-control { + text-align: center; + } } .driver { @@ -168,13 +593,13 @@ border-top: 2px groove; &.drag-over { - // box-shadow: 0 0 0.5rem var(--main-sheet-interactie-color); + // box-shadow: 0 0 0.5rem var(--main-sheet-interactive-color); background: rgba(0, 0, 0, 0.1); .add-sign { border: none; - box-shadow: 0 0 0.5rem var(--main-sheet-interactie-color); - // color: var(--main-sheet-interactie-color); + box-shadow: 0 0 0.5rem var(--main-sheet-interactive-color); + // color: var(--main-sheet-interactive-color); background: rgba(0, 0, 0, 0.1); } } @@ -191,8 +616,8 @@ &:hover { border: none; - box-shadow: 0 0 0.5rem var(--main-sheet-interactie-color); - // color: var(--main-sheet-interactie-color); + box-shadow: 0 0 0.5rem var(--main-sheet-interactive-color); + // color: var(--main-sheet-interactive-color); background: rgba(0, 0, 0, 0.1); } } diff --git a/styles/sheets/combat.less b/styles/sheets/combat.less index ba86d2cb..51166b5f 100644 --- a/styles/sheets/combat.less +++ b/styles/sheets/combat.less @@ -3,7 +3,6 @@ padding: 0 4px; height: 100%; overflow-y: auto; - .section-header { display: flex; flex-direction: row; @@ -18,39 +17,32 @@ line-height: 1.375rem; padding: 0 8px; margin: 4px; - &.skill { background-color: grey; } - span { flex: 1; display: inline-block; padding: 0; color: white; } - .add-item { flex: 0 0 1.25rem; color: white; - &:hover { color: var(--main-sheet-back-color); } } } - .item-list { .itemV2 { margin-right: 3px !important; width: 10rem !important; } - display: flex !important; flex-direction: row !important; flex-wrap: wrap !important; } - .weapon-list { .weapon-row { width: 100%; @@ -62,7 +54,6 @@ grid-template-areas: 'expand image name range weaponControl itemControl' 'details details details details details details'; - .expand-arrow { grid-area: expand; width: 0; @@ -75,13 +66,11 @@ transform: translate(6px, 4px); transition: transform 0.2s ease-out; } - &.expanded .expand-arrow { transform: rotate(90deg) translate(0.375rem, -0.25rem); border-bottom-right-radius: 0; border-bottom-left-radius: 0; } - .item-summary { background-color: rgba(255, 255, 255, 0.3); font-size: 0.75rem; @@ -89,23 +78,19 @@ margin: 4px 0; border-radius: 4px; } - .weapon-image { grid-area: image; background-size: 1.375rem; } - .weapon-name { grid-area: name; height: 1.375rem; line-height: 1.375rem; padding: 0 4px; } - .alternativ-skill { flex: 0 0 24px; } - .weapon-range { grid-area: range; height: 1.375rem; @@ -113,18 +98,15 @@ display: grid; grid-template-columns: 3.5rem 3.5rem 3.5rem; grid-template-rows: 1.375rem; - .weapon-damage { text-align: center; } } - .weapon-control { text-align: center; line-height: 1.375rem; grid-area: weaponControl; } - .weapon-controls { line-height: 1.375rem; text-align: center; @@ -133,26 +115,22 @@ grid-template-rows: 1.375rem; grid-area: weaponControl; } - .item-controls { line-height: 1.375rem; display: block; text-align: end; grid-area: itemControl; } - .item-summary { grid-area: details; display: flex; flex-direction: column; flex-wrap: nowrap; - .item-labels { display: flex; flex-direction: row; flex-wrap: wrap; margin: 4px 0; - .item-label { display: flex; flex-direction: row; @@ -162,7 +140,6 @@ border: 1px groove; border-radius: 3px; margin: 0 2px 2px 0; - span { height: 1rem; line-height: 1rem; @@ -170,12 +147,10 @@ } } } - .item-properties { display: flex; flex-direction: row; flex-wrap: wrap; - .item-property { margin: 0 2px 2px 0; } diff --git a/styles/sheets/development.less b/styles/sheets/development.less index 3269fedd..1fdd8b10 100644 --- a/styles/sheets/development.less +++ b/styles/sheets/development.less @@ -4,7 +4,6 @@ flex-direction: column; flex-wrap: nowrap; margin: 40px 0; - .warning { border: 1px solid red; color: var(--main-sheet-back-color); @@ -13,21 +12,17 @@ color: var(--main-sheet-back-color); } } - .monitor { span { padding: 0 3px !important; } - input { text-align: center; } } - .validation { margin-top: 8px; } - .missing-attrib-warning { white-space: normal; line-height: 1; @@ -35,7 +30,6 @@ margin-top: 5px; } } - .development { .skills-list { height: 100%; @@ -44,7 +38,6 @@ flex-direction: column; flex-wrap: wrap; padding-top: 8px !important; - .item { .item-controls { font-family: system-ui; @@ -54,19 +47,15 @@ display: grid; grid-template-columns: 1rem auto 1.3rem 1.3rem 1.3rem 1.3rem 1.3rem; align-items: center; - &.pulpCharacter { grid-template-columns: 1.875rem auto 1.3rem 1.3rem 1.3rem 1.3rem 1.3rem 1.3rem; } - grid-template-rows: 1rem; border-bottom: 1px solid var(--main-sheet-front-color); margin-right: 0.5rem; - .flagged4dev { color: goldenrod; } - span { height: 1rem; line-height: 1rem; @@ -76,7 +65,6 @@ text-align: left; color: var(--main-sheet-front-color); } - input { height: 1rem; line-height: 1rem; @@ -88,12 +76,10 @@ text-align: right; min-width: 0; } - .adjustment-value { &.locked { background-color: white; } - border-right: 1px solid var(--main-sheet-front-color); text-align: right; } diff --git a/styles/sheets/form-applications.less b/styles/sheets/form-applications.less new file mode 100644 index 00000000..48f43b99 --- /dev/null +++ b/styles/sheets/form-applications.less @@ -0,0 +1,14 @@ +#link-creation { + .effect-options { + .tab[data-tab] { + min-height: 10.5rem; + } + } + + .form-fields { + flex: 2; + .file-picker { + flex: 0; + } + } +} diff --git a/styles/sheets/items.less b/styles/sheets/items.less index 5e4d962f..a21cca51 100644 --- a/styles/sheets/items.less +++ b/styles/sheets/items.less @@ -302,7 +302,7 @@ margin-top: 2px; } - .unlock-control-disabbled { + .unlock-control-disabled { flex: 0 0 1.5rem; margin-top: 2px; color: darkred; @@ -341,8 +341,6 @@ input { border: 1px solid var(--main-sheet-front-color); - .name { - } } label { diff --git a/styles/sheets/occupation.less b/styles/sheets/occupation.less index daefaca9..be849d89 100644 --- a/styles/sheets/occupation.less +++ b/styles/sheets/occupation.less @@ -5,53 +5,42 @@ padding: 0 5px; overflow-y: auto; scrollbar-width: thin; - - // Inventory Item .item { line-height: 16px; - padding: 0 2px; // to align with the header border + padding: 0 2px; border-bottom: 1px solid @colorFaint; &:last-child { border-bottom: none; } - - // Item Header Name .item-name { cursor: pointer; max-height: 24px; overflow: hidden; - .item-image { flex: 0 0 16px; background-size: 16px; margin-right: 5px; } - h4 { margin: 0; white-space: nowrap; overflow-x: hidden; } - &.rollable:hover .item-image { background-image: url('/icons/svg/d20-grey.svg') !important; } &.rollable .item-image:hover { background-image: url('/icons/svg/d20-black.svg') !important; } - i.attuned { color: @colorTan; } } } - - // Item Control Buttons .item-controls { flex: 0 0 32px; .flexrow(); justify-content: flex-end; - a { flex: 0 0 16px; font-size: 10px; @@ -59,8 +48,6 @@ color: @colorTan; } } - - // Item Dropdown Summary .item-summary { flex: 0 0 100%; font-size: 12px; @@ -69,13 +56,11 @@ border-top: @borderGroove; } } - .optional-skills.form-group { label { height: 16px; } } - .group-control { width: 18px; flex: 0 0 18px; @@ -84,7 +69,6 @@ text-align: right; color: #7a7971; } - .optional-skills { .form-group { border-bottom: 1px groove; @@ -93,7 +77,6 @@ font-size: 12px; } } - h3.warning { text-align: center; } diff --git a/styles/sheets/sheet.less b/styles/sheets/sheet.less index b5096171..16d7012b 100644 --- a/styles/sheets/sheet.less +++ b/styles/sheets/sheet.less @@ -1,9 +1,14 @@ .coc7.sheetV2 { + .token-extras { + font-size: 1.5rem; + line-height: 1.5rem; + top: 2.2rem; + right: 1rem; + } .editor { width: 100%; height: 100%; } - .editor-content { height: 100%; overflow-y: auto; @@ -14,68 +19,58 @@ .inventory { height: 100%; } - - .inventory-list { + .inventory-list, + .effects-list { list-style: none; margin: 0; padding: 0 5px; - // overflow-y: auto; scrollbar-width: thin; - - // Inventory Item .item { line-height: 16px; - padding: 0 2px; // to align with the header border + padding: 0 2px; border-bottom: 1px solid @colorFaint; &:last-child { border-bottom: none; } - - // Item Header Name .item-name { - cursor: pointer; + // cursor: pointer; max-height: 16px; width: 0; text-overflow: ellipsis; overflow: hidden; } - .item-image { flex: 0 0 16px; background-size: 16px; - margin-right: 5px; + margin: 0 5px 0 0; height: 16px; + border: none; + &:hover { + background-image: none !important; + cursor: default; + } } - h4 { margin: 0; white-space: nowrap; - overflow-x: hidden; + overflow: hidden; } - &.rollable:hover .item-image { background-image: url('/icons/svg/d20-grey.svg') !important; } &.rollable .item-image:hover { background-image: url('/icons/svg/d20-black.svg') !important; } - i.attuned { color: @colorTan; } - - // Item uses .item-uses input { width: 24px; text-align: center; } - - // Item Dropdown Properties .item-properties { margin-top: 3px; } - - // Charged .item-recharge { flex: 0 0 80px; text-align: right; @@ -84,29 +79,23 @@ white-space: nowrap; } } - - // Inventory Header - .inventory-header { + .inventory-header, + .items-header { margin: 2px 0; padding: 0; background: rgba(0, 0, 0, 0.05); border: @borderGroove; font-weight: bold; - line-height: 15px; - + line-height: 25px; h3 { margin: 0 -5px 0 0; padding-left: 5px; - // .modesto(); font-size: 1.125em; } - .item-controls a.item-create { flex: 0 0 100%; } } - - // Item Detail Sections .item-detail { flex: 0 0 70px; font-size: 12px; @@ -116,7 +105,6 @@ word-break: break-word; white-space: nowrap; overflow: hidden; - &:last-child { border-right: none; } @@ -124,35 +112,31 @@ flex: 0 0 100px; } } - .item-weight { flex: 0 0 60px; border-left: 1px solid @colorFaint; border-right: 1px solid @colorFaint; } - .item-list { list-style: none; - margin: 0; + margin: 0 0 10px; padding: 0; } - - // Item Control Buttons .item-controls { - flex: 0 0 32px; + flex: 0 0 48px; .flexrow(); justify-content: flex-end; height: 16px; - a { flex: 0 0 16px; font-size: 10px; text-align: center; color: @colorTan; + &.effect-control { + flex: 1; + } } } - - // Item Dropdown Summary .item-summary { flex: 0 0 100%; font-size: 12px; @@ -161,4 +145,9 @@ border-top: @borderGroove; } } + nav.sheet-tabs a.item { + line-height: 27px; + font-size: 18px; + font-weight: 700; + } } diff --git a/styles/sheets/sheets.less b/styles/sheets/sheets.less index c3c5455e..7ab4bd80 100644 --- a/styles/sheets/sheets.less +++ b/styles/sheets/sheets.less @@ -2,6 +2,80 @@ html { font-size: 16px; } +.token-extras { + // width: 2rem; + // height: 2rem; + top: 2rem; + right: 0.5rem; + position: absolute; + font-size: 1rem; + line-height: 1rem; + display: flex; + flex-direction: row-reverse; +} + +// .token-drag-handle{ +// width: 2rem; +// height: 2rem; +// position: absolute; +// top: 2rem; +// right: 0.5rem; +// // background: #444; +// // padding: 2px; +// // border: 1px solid var(--color-border-dark-1); +// // border-radius: 4px 0 0 0; +// font-size: 2rem; +// line-height: 2rem; +// } + +.tabs { + display: flex; + flex-direction: row; + flex-wrap: wrap; + justify-content: flex-start; +} +.tabs > * { + flex: 1; +} +.tabs > .flex0 { + display: block; + flex: 0; +} +.tabs > .flex1 { + flex: 1; +} +.tabs > .flex2 { + flex: 2; +} +.tabs > .flex3 { + flex: 3; +} +.tabs .item { + text-align: center; +} +.tabs .item.active { + text-shadow: 0 0 10px red; +} +.tab[data-tab] { + display: none; +} +.tab[data-tab].active { + display: block; +} +.tab[data-tab].active.flexrow, +.tab[data-tab].active.flexcol { + display: flex; +} + +a.keeper-only-tab { + flex: 0 0 30px; + color: @colorGreen; +} + +h3.keeper-only-tab i { + color: @colorGreen; +} + .permission-limited img { height: auto !important; width: 580px !important; @@ -24,6 +98,30 @@ html { overflow: auto; .bio-section { padding: 0 2px; + .bio-section-value { + height: max-content; + resize: none; + font-family: customSheetFont, 'Palatino Linotype', serif; + font-size: 0.75rem; + } + div.bio-section-type, + div.item-controls { + padding: 2px 0; + } + div.bio-section-value { + padding: 5px; + background: rgba(0, 0, 0, 0.05); + border: 1px solid var(--color-border-dark); + border-radius: 3px; + color: #000; + div.bio-section-values { + flex: 0 0 40px; + text-align: center; + input { + width: 28px; + } + } + } } } @@ -47,7 +145,7 @@ html { .rollable:hover { color: #000; - text-shadow: 0 0 10px var(--main-sheet-interactie-color); + text-shadow: 0 0 10px var(--main-sheet-interactive-color); cursor: pointer; } @@ -116,7 +214,7 @@ html { &:hover, &:focus { - box-shadow: 0 0 0.5rem var(--main-sheet-interactie-color); + box-shadow: 0 0 0.5rem var(--main-sheet-interactive-color); background: @greyBackground; } } diff --git a/styles/sheets/spell.less b/styles/sheets/spell.less new file mode 100644 index 00000000..8b1fd909 --- /dev/null +++ b/styles/sheets/spell.less @@ -0,0 +1,242 @@ +.coc7.item.spell { + form { + background: var(--other-sheet-bg); + background-repeat: repeat; + } + font-family: customSheetFont, 'Palatino Linotype', serif; + .window-resizable-handle { + background: var(--main-sheet-front-color); + } + ::-webkit-scrollbar-thumb { + background: var(--main-sheet-front-color); + border: none; + } + .window-content { + background: var(--other-sheet-bg); + background-repeat: repeat; + } + .container { + display: grid; + grid-template-columns: 0.7fr 1.5fr 0.8fr; + grid-template-rows: 1fr 0.2fr 2.8fr; + gap: 0.3rem; + grid-auto-flow: row; + grid-template-areas: + 'portrait information aside' + 'navigation navigation navigation' + 'body body body'; + padding: 0.15rem; + .flexrow { + padding: 0.15rem 0; + } + .editor-content { + height: 100%; + overflow-y: auto; + padding: 0 0.5rem; + word-break: break-word; + } + select { + border: 0.375rem transparent; + flex: 0; + font-family: customSheetFont, 'Palatino Linotype', serif; + &:focus { + box-shadow: none; + } + } + label { + color: var(--main-sheet-front-color); + } + input { + min-width: 2.5rem; + border: 0.375rem transparent; + text-overflow: ellipsis; + &:focus, + &:hover { + box-shadow: none; + } + &.name { + font-size: 1rem; + font-weight: bold; + height: 1.875rem; + } + } + i { + color: var(--main-sheet-front-color); + flex: 1; + max-width: fit-content; + padding: 0 0.03rem; + &:hover { + color: var(--main-sheet-back-color); + } + } + .portrait { + border: 0.065rem solid var(--main-sheet-front-color); + border-radius: 0.25rem; + grid-area: portrait; + img { + border: none; + height: 100%; + object-fit: cover; + width: 100%; + } + } + .information { + border-right: 0.065rem solid var(--main-sheet-front-color); + grid-area: information; + } + .aside { + grid-area: aside; + text-align: center; + .flexrow { + justify-content: center; + margin: 0.065rem 0; + span { + max-width: fit-content; + } + #cast-spell { + align-items: center; + background: rgba(0, 0, 0, 0.05); + border: 0.065rem solid var(--main-sheet-front-color); + border-radius: 0.25rem; + padding: 0.3rem; + &:focus, + &:hover { + background: var(--main-sheet-front-color); + label { + color: whitesmoke; + } + } + } + } + } + nav { + align-items: center; + color: var(--main-sheet-front-color); + display: flex; + flex-direction: row; + flex-wrap: wrap; + font-weight: bold; + font-size: 1rem; + grid-area: navigation; + justify-content: flex-start; + a { + flex: 1; + text-align: center; + span { + border: 0.065rem solid transparent; + border-radius: 0.25rem; + height: auto; + line-height: 1rem; + padding: 0 0.5rem; + } + &.active { + span { + background-color: var(--main-sheet-front-color); + color: whitesmoke; + } + } + &:hover { + cursor: pointer; + text-shadow: none; + } + } + a.keeper-only-tab { + flex: 0 0 30px; + } + a.keeper-only-tab span { + vertical-align: bottom; + } + a.keeper-only-tab span i { + color: @colorGreen; + } + } + .body { + input { + flex: 0; + min-width: 2.5rem; + } + grid-area: body; + height: 20rem; + padding: 0.15rem 0; + .tab { + border: 0.065rem solid var(--main-sheet-front-color); + border-radius: 0.25rem; + height: 100%; + padding: 0.15rem 0; + } + .details { + display: grid; + grid-template-columns: 1fr; + grid-template-rows: 1fr 1fr 1fr; + gap: 0 0.1rem; + grid-auto-flow: row; + grid-template-areas: + 'type' + 'cost' + 'other'; + .type { + justify-content: center; + grid-area: type; + text-align: center; + .flexrow { + justify-content: center; + margin-top: -0.188rem; + input { + display: none; + } + label { + background: transparent; + border: 0.03rem solid var(--main-sheet-front-color); + border-radius: 0.25rem; + color: black; + font-style: normal; + font-weight: bold; + margin: 0.1rem; + opacity: 50%; + &:hover { + cursor: pointer; + background-color: var(--main-sheet-front-color); + color: lightgray; + opacity: 100%; + text-align: center; + } + } + } + #call:checked ~ label[for='data.type.call'], + #dismiss:checked ~ label[for='data.type.dismiss'], + #contact:checked ~ label[for='data.type.contact'], + #summon:checked ~ label[for='data.type.summon'], + #bind:checked ~ label[for='data.type.bind'], + #enchantment:checked ~ label[for='data.type.enchantment'], + #gate:checked ~ label[for='data.type.gate'], + #combat:checked ~ label[for='data.type.combat'] { + background-color: var(--main-sheet-front-color); + color: lightgray; + opacity: 100%; + } + } + .cost { + grid-area: cost; + text-align: center; + input { + text-align: left; + } + display: grid; + grid-template-columns: 1fr 1fr; + grid-template-rows: 1fr; + gap: 0 0.1rem; + grid-auto-flow: row; + grid-template-areas: + 'left' + 'right'; + } + .other { + grid-area: other; + input { + flex: 1; + } + } + } + } + } +} diff --git a/styles/sheets/summary.less b/styles/sheets/summary.less new file mode 100644 index 00000000..6455125f --- /dev/null +++ b/styles/sheets/summary.less @@ -0,0 +1,397 @@ +.coc7.actor.character.summarized { + .window-content { + background: var(--other-sheet-bg); + background-repeat: repeat; + } + form { + background: var(--other-sheet-bg); + background-repeat: repeat; + } + font-family: customSheetFont, 'Palatino Linotype', serif; + .container { + color: var(--main-sheet-front-color); + display: grid; + grid-template-columns: 1fr 1.35fr 1fr; + grid-template-rows: 0.05fr 1fr; + gap: 1px; + grid-template-areas: + 'header header header' + 'characteristics skills other'; + .rollable { + &:hover { + color: #000; + text-shadow: 0 0 10px red; + cursor: pointer; + } + } + .header { + grid-area: header; + min-height: 25px; + justify-content: center; + label { + line-height: 1; + } + .condition-monitor { + color: darkgrey; + text-align: center; + } + .condition-monitor.invert { + transform: rotateZ(180deg); + } + .condition-monitor.status-on { + color: darkred; + } + .status { + color: grey; + text-align: center; + a { + &.inative-status { + &:hover { + text-shadow: none !important; + cursor: default; + } + } + } + } + .fas { + font-size: 12px; + } + .control { + line-height: 0.9; + max-width: fit-content; + margin-left: 5px; + } + .flexrow { + margin: 0 5px; + max-width: fit-content; + } + .current-value { + text-align: right; + padding-right: 0.25rem; + max-width: 25px; + input { + text-align: center; + } + } + .separator { + max-width: fit-content; + } + .max-value { + text-align: left; + padding-left: 0.25rem; + max-width: fit-content; + input { + background-color: rgba(0, 0, 0, 0.1); + max-width: fit-content; + } + } + span { + height: 1rem; + line-height: 1rem; + } + input { + background-color: transparent; + border: 0; + height: auto; + padding: 0; + font-weight: bold; + &:read-only { + border: 0px; + background-color: transparent; + box-shadow: none; + cursor: default; + } + } + } + .characteristics { + grid-area: characteristics; + flex: 1; + font-weight: bold; + display: flex; + flex-direction: column; + height: 100%; + .header { + flex: 1; + } + .footer { + flex: 1; + display: flex; + flex-direction: row; + .attribute { + flex: 0 0 25%; + display: grid; + grid-template-columns: auto 2rem; + align-items: center; + justify-content: center; + } + .attribute-label { + min-width: 0; + h2 { + border: 0; + padding: 0; + margin: 0; + line-height: 1.375rem; + font-size: 0.75rem; + color: var(--main-sheet-front-color); + font-weight: normal; + text-align: right; + text-overflow: ellipsis; + white-space: nowrap; + overflow: hidden; + } + } + .attribute-value { + text-align: center; + font-size: 0.75rem; + color: var(--main-sheet-front-color); + font-weight: normal; + input { + border: 0; + padding: 0; + font-size: 0.75rem; + color: var(--main-sheet-front-color); + background-color: @greyBackground; + font-weight: normal; + } + } + } + .char-boxes { + flex: 0 0 6rem; + justify-content: center; + display: grid; + grid-template-columns: repeat(4, 3.75rem); + grid-template-rows: repeat(2, 3rem); + } + .char-box { + display: grid; + grid-template-columns: 1rem 2.75rem; + grid-template-rows: 1rem 2rem; + grid-template-areas: + 'rollIcon characName' + 'characScore characScore'; + align-items: baseline; + .roll-icon { + color: var(--main-sheet-front-color); + grid-area: rollIcon; + line-height: 1.4rem; + } + .charac-name { + color: var(--main-sheet-front-color); + grid-area: characName; + line-height: 1.4rem; + } + .charac-score { + grid-area: characScore; + margin-top: 0.25rem; + margin-right: 0.5rem; + border-radius: 0.25rem; + color: var(--main-sheet-back-color); + background: @whiteBackground; + display: grid; + grid-template-columns: 2.375rem 0.875rem; + grid-template-rows: 0.875rem 0.875rem; + grid-template-areas: + 'mainScore halfScore' + 'mainScore fithScore'; + .main-score { + grid-area: mainScore; + justify-self: center; + align-self: center; + } + .half-score { + grid-area: halfScore; + font-size: 0.6rem; + justify-self: center; + align-self: center; + } + .fith-score { + grid-area: fithScore; + font-size: 0.6rem; + justify-self: center; + align-self: center; + } + input { + background: transparent; + border: 0; + font-weight: bold; + } + } + } + input { + text-align: center; + color: var(--main-sheet-back-color); + font-size: 1.3rem; + &:hover, + &:focus { + background: transparent; + } + &:read-only { + border: 1px solid transparent; + box-shadow: none; + cursor: default; + } + } + } + .skills { + grid-area: skills; + flex: 1; + flex-wrap: wrap; + width: auto; + flex-direction: column; + max-height: 125px; + .item-list { + margin: 0; + padding: 0; + display: flex; + width: auto; + height: 100%; + flex-direction: column; + flex-wrap: wrap; + &.icons { + list-style: none; + } + .itemV2 { + max-height: 1.25rem; + width: 125px; + margin-right: 0.5rem; + display: grid; + font-size: 0.75rem; + grid-template-columns: 1rem auto 1.5rem 0.7rem; + border-bottom: 1px solid; + &.specialization { + margin-left: 0.5rem; + width: var(--skill-specialization-length); + border-left: 1px solid; + } + .item-image { + height: 0.875rem; + background-size: contain; + margin: 1px 0 0 0; + } + .item-name { + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + padding-left: 3px; + line-height: 1rem; + input { + height: 1rem; + padding: 0; + overflow: visible; + background-color: @greyBackground; + color: var(--main-sheet-front-color); + } + } + .item-score { + color: var(--main-sheet-back-color); + text-align: end; + margin-right: 2px; + line-height: 1rem; + input { + height: 1rem; + padding: 0; + margin-right: 2px; + background-color: @greyBackground; + color: var(--main-sheet-back-color); + text-align: end; + } + } + .item-controls { + font-size: 0.625rem; + line-height: 1rem; + flex: 0 0 1.25rem; + display: block; + text-align: end; + width: max-content; + a:hover { + text-shadow: none; + color: var(--main-sheet-back-color); + } + .item-control { + &.active { + color: goldenrod; + } + } + } + } + } + } + .other { + grid-area: other; + padding: 0 0 0 10px; + height: 100%; + overflow-y: auto; + ol { + margin: 0; + margin-bottom: 25px; + padding: 0; + } + .cash-row { + input { + border: 0; + } + span { + line-height: 1.4rem; + } + } + .item-list { + .itemV2 { + margin-right: 3px !important; + width: 10rem !important; + } + display: flex !important; + flex-direction: row !important; + flex-wrap: wrap !important; + } + .weapon-row { + max-height: 1.25rem; + font-size: 0.75rem; + display: grid; + border-bottom: 1px solid; + grid-template-columns: 1rem 5.5rem 2.5rem 2rem; + grid-template-rows: 1rem; + grid-template-areas: 'image name damage weaponControl'; + .weapon-damage { + grid-area: damage; + color: var(--main-sheet-back-color); + text-align: end; + margin-right: 2px; + line-height: 1rem; + text-align: center; + } + .weapon-image { + height: 0.875rem; + grid-area: image; + background-size: contain; + margin: 1px 0 0 0; + } + .weapon-name { + grid-area: name; + height: 1rem; + line-height: 1rem; + padding-left: 3px; + font-size: 0.75rem; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + } + .alternativ-skill { + flex: 0 0 24px; + } + .weapon-control { + text-align: center; + line-height: 1rem; + grid-area: weaponControl; + } + .weapon-controls { + line-height: 1rem; + text-align: center; + display: grid; + grid-template-columns: 1rem 1rem; + grid-template-rows: 1rem; + grid-area: weaponControl; + } + } + } + } +} diff --git a/styles/sheets/vehicle.less b/styles/sheets/vehicle.less index b36dccea..e97f56d7 100644 --- a/styles/sheets/vehicle.less +++ b/styles/sheets/vehicle.less @@ -1,16 +1,38 @@ .sheetV2.vehicle { + .token-extras { + font-size: 1rem; + line-height: 1rem; + top: 2.4rem; + left: 0.7rem; + flex-direction: row; + } + .expand-button { position: absolute; left: 1rem; top: 7.5rem; color: var(--main-sheet-front-color); } - + .sheet-nav { + a { + &.active { + &.keeper-only-tab span { + background-color: @colorGreen; + color: white; + } + } + &.keeper-only-tab span { + color: @colorGreen; + &:hover { + border: 1px solid @colorGreen; + } + } + } + } .armor-infos { display: flex; flex-direction: row; flex-wrap: nowrap; - .armor-location { flex: 1; display: block; diff --git a/styles/system/coc7.less b/styles/system/coc7.less index afe2af3c..a7cbb021 100644 --- a/styles/system/coc7.less +++ b/styles/system/coc7.less @@ -1,13 +1,10 @@ @headerHeight: 100px; @borderGroove: 2px groove #eeede0; @detailsHeight: 16px; - .coc7 { nav { font-family: customSheetFont, 'Palatino Linotype', serif !important; } - - // Item Sheet form fields input[type='text'], select { height: calc(100% - 2px); @@ -15,8 +12,6 @@ background: rgba(0, 0, 0, 0.05); color: @colorDark; } - - // Hovered Fields input[type='text'] { &:hover, &:focus { @@ -24,8 +19,6 @@ box-shadow: 0 0 8px red; } } - - // Disabled Fields input:disabled, select:disabled, textarea:disabled { @@ -36,7 +29,6 @@ outline: none !important; } } - label.checkbox { flex: auto; padding: 0; @@ -56,11 +48,9 @@ margin: 0 0 0 2px; } } - .sheet-header { flex: 0 0 @headerHeight; border-bottom: @borderGroove; - .summary { flex: 0 0 100%; height: @detailsHeight; @@ -69,11 +59,9 @@ list-style: none; border-top: 1px groove; border-bottom: 1px; - input { height: 16px; } - li { height: @detailsHeight; float: left; @@ -84,14 +72,12 @@ white-space: nowrap; overflow: hidden; text-overflow: ellipsis; - &:last-child { border-right: none; } } } } - .form-group { label { flex: 1; @@ -111,8 +97,6 @@ flex: 0; } } - - // Stacked Groups .form-group.stacked { label { flex: 0 0 100%; @@ -123,21 +107,17 @@ text-align: left; } } - .form-group.subgroup { label { flex: 1; } - select { flex: 1; } - .penalty-selector { flex: 1; } } - .form-header { margin: 0 0 0.25em 0; padding: 2px 0; @@ -148,7 +128,6 @@ float: right; } } - .editor { height: 100%; .tox-toolbar-overlord, diff --git a/styles/system/compendiums.less b/styles/system/compendiums.less new file mode 100644 index 00000000..381af849 --- /dev/null +++ b/styles/system/compendiums.less @@ -0,0 +1,14 @@ +.window-app .window-content .compendiumfilter { + line-height: 32px; + flex: none; + border-bottom: 1px dotted #000; + padding-bottom: 3px; + margin-bottom: 6px; + .flexrow { + align-items: center; + margin: 0 0 3px; + i.fas { + flex: 0 0 24px; + } + } +} diff --git a/styles/system/constants.less b/styles/system/constants.less index 5cb7ec33..bca9c70c 100644 --- a/styles/system/constants.less +++ b/styles/system/constants.less @@ -14,7 +14,7 @@ --chat-background: url('../../ui/parchment.jpg') repeat; --main-sheet-back-color: @colorRed; --main-sheet-front-color: @colorBlue; - --main-sheet-interactie-color: @colorRed; + --main-sheet-interactive-color: @colorRed; --main-sheet-font: ''; --main-sheet-cursive-font: ''; --skill-length: 160px; diff --git a/styles/system/game-icons.less b/styles/system/game-icons.less deleted file mode 100644 index 32768339..00000000 --- a/styles/system/game-icons.less +++ /dev/null @@ -1,19881 +0,0 @@ -@font-face { - font-family: 'game-icons'; - src: url('./assets/fonts/game-icons.woff') format('woff'); -} -.game-icon { - &:before { - font-family: 'game-icons'; - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; - font-style: normal; - font-variant: normal; - font-weight: normal; - text-decoration: none; - text-transform: none; - } -} -.game-icon-police-badge { - &:before { - content: '\E001'; - } -} -.game-icon-pistol-gun { - &:before { - content: '\E002'; - } -} -.game-icon-arrest { - &:before { - content: '\E003'; - } -} -.game-icon-banging-gavel { - &:before { - content: '\E004'; - } -} -.game-icon-chalk-outline-murder { - &:before { - content: '\E005'; - } -} -.game-icon-convict { - &:before { - content: '\E006'; - } -} -.game-icon-crime-scene-tape { - &:before { - content: '\E007'; - } -} -.game-icon-custodian-helmet { - &:before { - content: '\E008'; - } -} -.game-icon-donut { - &:before { - content: '\E009'; - } -} -.game-icon-evasion { - &:before { - content: '\E00A'; - } -} -.game-icon-finger-print { - &:before { - content: '\E00B'; - } -} -.game-icon-flashlight { - &:before { - content: '\E00C'; - } -} -.game-icon-handcuffed { - &:before { - content: '\E00D'; - } -} -.game-icon-id-card { - &:before { - content: '\E00E'; - } -} -.game-icon-lock-picking { - &:before { - content: '\E00F'; - } -} -.game-icon-megaphone { - &:before { - content: '\E010'; - } -} -.game-icon-mp5 { - &:before { - content: '\E011'; - } -} -.game-icon-mug-shot { - &:before { - content: '\E012'; - } -} -.game-icon-police-car { - &:before { - content: '\E013'; - } -} -.game-icon-police-officer-head { - &:before { - content: '\E014'; - } -} -.game-icon-police-target { - &:before { - content: '\E015'; - } -} -.game-icon-prisoner { - &:before { - content: '\E016'; - } -} -.game-icon-robber-mask { - &:before { - content: '\E017'; - } -} -.game-icon-robber { - &:before { - content: '\E018'; - } -} -.game-icon-sherlock-holmes { - &:before { - content: '\E019'; - } -} -.game-icon-sniffing-dog { - &:before { - content: '\E01A'; - } -} -.game-icon-spy { - &:before { - content: '\E01B'; - } -} -.game-icon-stun-grenade { - &:before { - content: '\E01C'; - } -} -.game-icon-tire-tracks { - &:before { - content: '\E01D'; - } -} -.game-icon-traffic-lights-red { - &:before { - content: '\E01E'; - } -} -.game-icon-walkie-talkie { - &:before { - content: '\E01F'; - } -} -.game-icon-whistle { - &:before { - content: '\E020'; - } -} -.game-icon-window-bars { - &:before { - content: '\E021'; - } -} -.game-icon-arrow-scope { - &:before { - content: '\E022'; - } -} -.game-icon-flash-grenade { - &:before { - content: '\E023'; - } -} -.game-icon-handcuffs { - &:before { - content: '\E024'; - } -} -.game-icon-law-star { - &:before { - content: '\E025'; - } -} -.game-icon-magnifying-glass { - &:before { - content: '\E026'; - } -} -.game-icon-manacles { - &:before { - content: '\E027'; - } -} -.game-icon-riot-shield { - &:before { - content: '\E028'; - } -} -.game-icon-kevlar { - &:before { - content: '\E029'; - } -} -.game-icon-balaclava { - &:before { - content: '\E02A'; - } -} -.game-icon-baton { - &:before { - content: '\E02B'; - } -} -.game-icon-famas { - &:before { - content: '\E02C'; - } -} -.game-icon-footsteps { - &:before { - content: '\E02D'; - } -} -.game-icon-glock { - &:before { - content: '\E02E'; - } -} -.game-icon-halt { - &:before { - content: '\E02F'; - } -} -.game-icon-kevlar-vest { - &:before { - content: '\E030'; - } -} -.game-icon-siren { - &:before { - content: '\E031'; - } -} -.game-icon-steel-door { - &:before { - content: '\E032'; - } -} -.game-icon-steyr-aug { - &:before { - content: '\E033'; - } -} -.game-icon-switchblade { - &:before { - content: '\E034'; - } -} -.game-icon-walther-ppk { - &:before { - content: '\E035'; - } -} -.game-icon-swordman { - &:before { - content: '\E036'; - } -} -.game-icon-swordwoman { - &:before { - content: '\E037'; - } -} -.game-icon-american-shield { - &:before { - content: '\E038'; - } -} -.game-icon-armor-downgrade { - &:before { - content: '\E039'; - } -} -.game-icon-armor-upgrade { - &:before { - content: '\E03A'; - } -} -.game-icon-attached-shield { - &:before { - content: '\E03B'; - } -} -.game-icon-cross-shield { - &:before { - content: '\E03C'; - } -} -.game-icon-dice-shield { - &:before { - content: '\E03D'; - } -} -.game-icon-dragon-shield { - &:before { - content: '\E03E'; - } -} -.game-icon-griffin-shield { - &:before { - content: '\E03F'; - } -} -.game-icon-healing-shield { - &:before { - content: '\E040'; - } -} -.game-icon-ribbon-shield { - &:before { - content: '\E041'; - } -} -.game-icon-roman-shield { - &:before { - content: '\E042'; - } -} -.game-icon-shield-bash { - &:before { - content: '\E043'; - } -} -.game-icon-shield-impact { - &:before { - content: '\E044'; - } -} -.game-icon-shield-opposition { - &:before { - content: '\E045'; - } -} -.game-icon-templar-shield { - &:before { - content: '\E046'; - } -} -.game-icon-temporary-shield { - &:before { - content: '\E047'; - } -} -.game-icon-tribal-gear { - &:before { - content: '\E048'; - } -} -.game-icon-trident-shield { - &:before { - content: '\E049'; - } -} -.game-icon-vibrating-shield { - &:before { - content: '\E04A'; - } -} -.game-icon-viking-shield { - &:before { - content: '\E04B'; - } -} -.game-icon-arrows-shield { - &:before { - content: '\E04C'; - } -} -.game-icon-battle-gear { - &:before { - content: '\E04D'; - } -} -.game-icon-bell-shield { - &:before { - content: '\E04E'; - } -} -.game-icon-black-hand-shield { - &:before { - content: '\E04F'; - } -} -.game-icon-bolt-shield { - &:before { - content: '\E050'; - } -} -.game-icon-bordered-shield { - &:before { - content: '\E051'; - } -} -.game-icon-broken-shield { - &:before { - content: '\E052'; - } -} -.game-icon-bubble-field { - &:before { - content: '\E053'; - } -} -.game-icon-checked-shield { - &:before { - content: '\E054'; - } -} -.game-icon-cracked-shield { - &:before { - content: '\E055'; - } -} -.game-icon-crenulated-shield { - &:before { - content: '\E056'; - } -} -.game-icon-edged-shield { - &:before { - content: '\E057'; - } -} -.game-icon-energy-shield { - &:before { - content: '\E058'; - } -} -.game-icon-eye-shield { - &:before { - content: '\E059'; - } -} -.game-icon-fire-shield { - &:before { - content: '\E05A'; - } -} -.game-icon-ice-shield { - &:before { - content: '\E05B'; - } -} -.game-icon-layered-armor { - &:before { - content: '\E05C'; - } -} -.game-icon-lightning-shield { - &:before { - content: '\E05D'; - } -} -.game-icon-magic-shield { - &:before { - content: '\E05E'; - } -} -.game-icon-rosa-shield { - &:before { - content: '\E05F'; - } -} -.game-icon-shield-bounces { - &:before { - content: '\E060'; - } -} -.game-icon-shield-echoes { - &:before { - content: '\E061'; - } -} -.game-icon-shield-reflect { - &:before { - content: '\E062'; - } -} -.game-icon-shieldcomb { - &:before { - content: '\E063'; - } -} -.game-icon-skull-shield { - &:before { - content: '\E064'; - } -} -.game-icon-slashed-shield { - &:before { - content: '\E065'; - } -} -.game-icon-spartan { - &:before { - content: '\E066'; - } -} -.game-icon-spiky-field { - &:before { - content: '\E067'; - } -} -.game-icon-surrounded-shield { - &:before { - content: '\E068'; - } -} -.game-icon-swords-emblem { - &:before { - content: '\E069'; - } -} -.game-icon-winged-shield { - &:before { - content: '\E06A'; - } -} -.game-icon-zebra-shield { - &:before { - content: '\E06B'; - } -} -.game-icon-shield { - &:before { - content: '\E06C'; - } -} -.game-icon-air-force { - &:before { - content: '\E06D'; - } -} -.game-icon-shield-disabled { - &:before { - content: '\E06E'; - } -} -.game-icon-round-shield { - &:before { - content: '\E06F'; - } -} -.game-icon-chameleon-glyph { - &:before { - content: '\E070'; - } -} -.game-icon-akhet { - &:before { - content: '\E071'; - } -} -.game-icon-all-seeing-eye { - &:before { - content: '\E072'; - } -} -.game-icon-anarchy { - &:before { - content: '\E073'; - } -} -.game-icon-aquarius { - &:before { - content: '\E074'; - } -} -.game-icon-aries { - &:before { - content: '\E075'; - } -} -.game-icon-azul-flake { - &:before { - content: '\E076'; - } -} -.game-icon-banknote { - &:before { - content: '\E077'; - } -} -.game-icon-bowen-knot { - &:before { - content: '\E078'; - } -} -.game-icon-caduceus { - &:before { - content: '\E079'; - } -} -.game-icon-camargue-cross { - &:before { - content: '\E07A'; - } -} -.game-icon-cancer { - &:before { - content: '\E07B'; - } -} -.game-icon-capricorn { - &:before { - content: '\E07C'; - } -} -.game-icon-check-mark { - &:before { - content: '\E07D'; - } -} -.game-icon-cornucopia { - &:before { - content: '\E07E'; - } -} -.game-icon-corporal { - &:before { - content: '\E07F'; - } -} -.game-icon-credits-currency { - &:before { - content: '\E080'; - } -} -.game-icon-dream-catcher { - &:before { - content: '\E081'; - } -} -.game-icon-dwennimmen { - &:before { - content: '\E082'; - } -} -.game-icon-easter-egg { - &:before { - content: '\E083'; - } -} -.game-icon-ermine { - &:before { - content: '\E084'; - } -} -.game-icon-eye-of-horus { - &:before { - content: '\E085'; - } -} -.game-icon-f-clef { - &:before { - content: '\E086'; - } -} -.game-icon-fallout-shelter { - &:before { - content: '\E087'; - } -} -.game-icon-female { - &:before { - content: '\E088'; - } -} -.game-icon-film-strip { - &:before { - content: '\E089'; - } -} -.game-icon-fleur-de-lys { - &:before { - content: '\E08A'; - } -} -.game-icon-flower-emblem { - &:before { - content: '\E08B'; - } -} -.game-icon-freemasonry { - &:before { - content: '\E08C'; - } -} -.game-icon-g-clef { - &:before { - content: '\E08D'; - } -} -.game-icon-gear-stick-pattern { - &:before { - content: '\E08E'; - } -} -.game-icon-gemini { - &:before { - content: '\E08F'; - } -} -.game-icon-hell-crosses { - &:before { - content: '\E090'; - } -} -.game-icon-heptagram { - &:before { - content: '\E091'; - } -} -.game-icon-hieroglyph-y { - &:before { - content: '\E092'; - } -} -.game-icon-horseshoe { - &:before { - content: '\E093'; - } -} -.game-icon-info { - &:before { - content: '\E094'; - } -} -.game-icon-jerusalem-cross { - &:before { - content: '\E095'; - } -} -.game-icon-klingon { - &:before { - content: '\E096'; - } -} -.game-icon-leo { - &:before { - content: '\E097'; - } -} -.game-icon-liberty-wing { - &:before { - content: '\E098'; - } -} -.game-icon-libra { - &:before { - content: '\E099'; - } -} -.game-icon-logic-gate-and { - &:before { - content: '\E09A'; - } -} -.game-icon-logic-gate-nand { - &:before { - content: '\E09B'; - } -} -.game-icon-logic-gate-nor { - &:before { - content: '\E09C'; - } -} -.game-icon-logic-gate-not { - &:before { - content: '\E09D'; - } -} -.game-icon-logic-gate-nxor { - &:before { - content: '\E09E'; - } -} -.game-icon-logic-gate-or { - &:before { - content: '\E09F'; - } -} -.game-icon-logic-gate-xor { - &:before { - content: '\E0A0'; - } -} -.game-icon-male { - &:before { - content: '\E0A1'; - } -} -.game-icon-mona-lisa { - &:before { - content: '\E0A2'; - } -} -.game-icon-nested-hexagons { - &:before { - content: '\E0A3'; - } -} -.game-icon-ophiuchus { - &:before { - content: '\E0A4'; - } -} -.game-icon-peace-dove { - &:before { - content: '\E0A5'; - } -} -.game-icon-pisces { - &:before { - content: '\E0A6'; - } -} -.game-icon-rod-of-asclepius { - &:before { - content: '\E0A7'; - } -} -.game-icon-rss { - &:before { - content: '\E0A8'; - } -} -.game-icon-rub-el-hizb { - &:before { - content: '\E0A9'; - } -} -.game-icon-sagittarius { - &:before { - content: '\E0AA'; - } -} -.game-icon-scorpio { - &:before { - content: '\E0AB'; - } -} -.game-icon-slumbering-sanctuary { - &:before { - content: '\E0AC'; - } -} -.game-icon-stop-sign { - &:before { - content: '\E0AD'; - } -} -.game-icon-striped-sun { - &:before { - content: '\E0AE'; - } -} -.game-icon-taurus { - &:before { - content: '\E0AF'; - } -} -.game-icon-transform { - &:before { - content: '\E0B0'; - } -} -.game-icon-triforce { - &:before { - content: '\E0B1'; - } -} -.game-icon-trinacria { - &:before { - content: '\E0B2'; - } -} -.game-icon-triquetra { - &:before { - content: '\E0B3'; - } -} -.game-icon-venus-of-willendorf { - &:before { - content: '\E0B4'; - } -} -.game-icon-virgo { - &:before { - content: '\E0B5'; - } -} -.game-icon-virtual-marker { - &:before { - content: '\E0B6'; - } -} -.game-icon-wanted-reward { - &:before { - content: '\E0B7'; - } -} -.game-icon-warlock-eye { - &:before { - content: '\E0B8'; - } -} -.game-icon-yin-yang { - &:before { - content: '\E0B9'; - } -} -.game-icon-zigzag-hieroglyph { - &:before { - content: '\E0BA'; - } -} -.game-icon-holosphere { - &:before { - content: '\E0BB'; - } -} -.game-icon-power-button { - &:before { - content: '\E0BC'; - } -} -.game-icon-ace { - &:before { - content: '\E0BD'; - } -} -.game-icon-aerial-signal { - &:before { - content: '\E0BE'; - } -} -.game-icon-ankh { - &:before { - content: '\E0BF'; - } -} -.game-icon-artificial-hive { - &:before { - content: '\E0C0'; - } -} -.game-icon-automatic-sas { - &:before { - content: '\E0C1'; - } -} -.game-icon-barbed-sun { - &:before { - content: '\E0C2'; - } -} -.game-icon-batwing-emblem { - &:before { - content: '\E0C3'; - } -} -.game-icon-biohazard { - &:before { - content: '\E0C4'; - } -} -.game-icon-black-flag { - &:before { - content: '\E0C5'; - } -} -.game-icon-checkbox-tree { - &:before { - content: '\E0C6'; - } -} -.game-icon-clover { - &:before { - content: '\E0C7'; - } -} -.game-icon-coiling-curl { - &:before { - content: '\E0C8'; - } -} -.game-icon-concentric-crescents { - &:before { - content: '\E0C9'; - } -} -.game-icon-condor-emblem { - &:before { - content: '\E0CA'; - } -} -.game-icon-conversation { - &:before { - content: '\E0CB'; - } -} -.game-icon-cubeforce { - &:before { - content: '\E0CC'; - } -} -.game-icon-cubes { - &:before { - content: '\E0CD'; - } -} -.game-icon-cursed-star { - &:before { - content: '\E0CE'; - } -} -.game-icon-cycle { - &:before { - content: '\E0CF'; - } -} -.game-icon-divided-spiral { - &:before { - content: '\E0D0'; - } -} -.game-icon-eagle-emblem { - &:before { - content: '\E0D1'; - } -} -.game-icon-fluffy-trefoil { - &:before { - content: '\E0D2'; - } -} -.game-icon-freedom-dove { - &:before { - content: '\E0D3'; - } -} -.game-icon-gamepad-cross { - &:before { - content: '\E0D4'; - } -} -.game-icon-gothic-cross { - &:before { - content: '\E0D5'; - } -} -.game-icon-hawk-emblem { - &:before { - content: '\E0D6'; - } -} -.game-icon-hazard-sign { - &:before { - content: '\E0D7'; - } -} -.game-icon-holy-symbol { - &:before { - content: '\E0D8'; - } -} -.game-icon-hospital-cross { - &:before { - content: '\E0D9'; - } -} -.game-icon-interdiction { - &:before { - content: '\E0DA'; - } -} -.game-icon-james-bond-aperture { - &:before { - content: '\E0DB'; - } -} -.game-icon-justice-star { - &:before { - content: '\E0DC'; - } -} -.game-icon-king { - &:before { - content: '\E0DD'; - } -} -.game-icon-laser-warning { - &:before { - content: '\E0DE'; - } -} -.game-icon-maze-cornea { - &:before { - content: '\E0DF'; - } -} -.game-icon-maze-saw { - &:before { - content: '\E0E0'; - } -} -.game-icon-moebius-star { - &:before { - content: '\E0E1'; - } -} -.game-icon-moebius-trefoil { - &:before { - content: '\E0E2'; - } -} -.game-icon-moebius-triangle { - &:before { - content: '\E0E3'; - } -} -.game-icon-omega { - &:before { - content: '\E0E4'; - } -} -.game-icon-orbital { - &:before { - content: '\E0E5'; - } -} -.game-icon-over-infinity { - &:before { - content: '\E0E6'; - } -} -.game-icon-pentagram-rose { - &:before { - content: '\E0E7'; - } -} -.game-icon-perpendicular-rings { - &:before { - content: '\E0E8'; - } -} -.game-icon-radial-balance { - &:before { - content: '\E0E9'; - } -} -.game-icon-radioactive { - &:before { - content: '\E0EA'; - } -} -.game-icon-recycle { - &:before { - content: '\E0EB'; - } -} -.game-icon-ribbon { - &:before { - content: '\E0EC'; - } -} -.game-icon-rss-2 { - &:before { - content: '\E0ED'; - } -} -.game-icon-rune-sword { - &:before { - content: '\E0EE'; - } -} -.game-icon-scales { - &:before { - content: '\E0EF'; - } -} -.game-icon-shiny-omega { - &:before { - content: '\E0F0'; - } -} -.game-icon-shuriken-aperture { - &:before { - content: '\E0F1'; - } -} -.game-icon-skull-crossed-bones { - &:before { - content: '\E0F2'; - } -} -.game-icon-staryu { - &:before { - content: '\E0F3'; - } -} -.game-icon-steelwing-emblem { - &:before { - content: '\E0F4'; - } -} -.game-icon-totem-head { - &:before { - content: '\E0F5'; - } -} -.game-icon-triorb { - &:before { - content: '\E0F6'; - } -} -.game-icon-triple-beak { - &:before { - content: '\E0F7'; - } -} -.game-icon-triple-corn { - &:before { - content: '\E0F8'; - } -} -.game-icon-triple-plier { - &:before { - content: '\E0F9'; - } -} -.game-icon-triple-yin { - &:before { - content: '\E0FA'; - } -} -.game-icon-ubisoft-sun { - &:before { - content: '\E0FB'; - } -} -.game-icon-zigzag-cage { - &:before { - content: '\E0FC'; - } -} -.game-icon-cancel { - &:before { - content: '\E0FD'; - } -} -.game-icon-clover-spiked { - &:before { - content: '\E0FE'; - } -} -.game-icon-clover-2 { - &:before { - content: '\E0FF'; - } -} -.game-icon-doubled { - &:before { - content: '\E100'; - } -} -.game-icon-expander { - &:before { - content: '\E101'; - } -} -.game-icon-help { - &:before { - content: '\E102'; - } -} -.game-icon-hive { - &:before { - content: '\E103'; - } -} -.game-icon-mass-driver { - &:before { - content: '\E104'; - } -} -.game-icon-nodular { - &:before { - content: '\E105'; - } -} -.game-icon-nuclear { - &:before { - content: '\E106'; - } -} -.game-icon-overmind { - &:before { - content: '\E107'; - } -} -.game-icon-pulse { - &:before { - content: '\E108'; - } -} -.game-icon-reactor { - &:before { - content: '\E109'; - } -} -.game-icon-regeneration { - &:before { - content: '\E10A'; - } -} -.game-icon-slow-blob { - &:before { - content: '\E10B'; - } -} -.game-icon-spawn-node { - &:before { - content: '\E10C'; - } -} -.game-icon-infinity { - &:before { - content: '\E10D'; - } -} -.game-icon-allied-star { - &:before { - content: '\E10E'; - } -} -.game-icon-balkenkreuz { - &:before { - content: '\E10F'; - } -} -.game-icon-bat { - &:before { - content: '\E110'; - } -} -.game-icon-clubs { - &:before { - content: '\E111'; - } -} -.game-icon-diamonds { - &:before { - content: '\E112'; - } -} -.game-icon-divided-square { - &:before { - content: '\E113'; - } -} -.game-icon-hearts { - &:before { - content: '\E114'; - } -} -.game-icon-iron-cross { - &:before { - content: '\E115'; - } -} -.game-icon-pentacle { - &:before { - content: '\E116'; - } -} -.game-icon-spades { - &:before { - content: '\E117'; - } -} -.game-icon-card-10-clubs { - &:before { - content: '\E118'; - } -} -.game-icon-card-10-diamonds { - &:before { - content: '\E119'; - } -} -.game-icon-card-10-hearts { - &:before { - content: '\E11A'; - } -} -.game-icon-card-10-spades { - &:before { - content: '\E11B'; - } -} -.game-icon-card-2-clubs { - &:before { - content: '\E11C'; - } -} -.game-icon-card-2-diamonds { - &:before { - content: '\E11D'; - } -} -.game-icon-card-2-hearts { - &:before { - content: '\E11E'; - } -} -.game-icon-card-2-spades { - &:before { - content: '\E11F'; - } -} -.game-icon-card-3-clubs { - &:before { - content: '\E120'; - } -} -.game-icon-card-3-diamonds { - &:before { - content: '\E121'; - } -} -.game-icon-card-3-hearts { - &:before { - content: '\E122'; - } -} -.game-icon-card-3-spades { - &:before { - content: '\E123'; - } -} -.game-icon-card-4-clubs { - &:before { - content: '\E124'; - } -} -.game-icon-card-4-diamonds { - &:before { - content: '\E125'; - } -} -.game-icon-card-4-hearts { - &:before { - content: '\E126'; - } -} -.game-icon-card-4-spades { - &:before { - content: '\E127'; - } -} -.game-icon-card-5-clubs { - &:before { - content: '\E128'; - } -} -.game-icon-card-5-diamonds { - &:before { - content: '\E129'; - } -} -.game-icon-card-5-hearts { - &:before { - content: '\E12A'; - } -} -.game-icon-card-5-spades { - &:before { - content: '\E12B'; - } -} -.game-icon-card-6-clubs { - &:before { - content: '\E12C'; - } -} -.game-icon-card-6-diamonds { - &:before { - content: '\E12D'; - } -} -.game-icon-card-6-hearts { - &:before { - content: '\E12E'; - } -} -.game-icon-card-6-spades { - &:before { - content: '\E12F'; - } -} -.game-icon-card-7-clubs { - &:before { - content: '\E130'; - } -} -.game-icon-card-7-diamonds { - &:before { - content: '\E131'; - } -} -.game-icon-card-7-hearts { - &:before { - content: '\E132'; - } -} -.game-icon-card-7-spades { - &:before { - content: '\E133'; - } -} -.game-icon-card-8-clubs { - &:before { - content: '\E134'; - } -} -.game-icon-card-8-diamonds { - &:before { - content: '\E135'; - } -} -.game-icon-card-8-hearts { - &:before { - content: '\E136'; - } -} -.game-icon-card-8-spades { - &:before { - content: '\E137'; - } -} -.game-icon-card-9-clubs { - &:before { - content: '\E138'; - } -} -.game-icon-card-9-diamonds { - &:before { - content: '\E139'; - } -} -.game-icon-card-9-hearts { - &:before { - content: '\E13A'; - } -} -.game-icon-card-9-spades { - &:before { - content: '\E13B'; - } -} -.game-icon-card-ace-clubs { - &:before { - content: '\E13C'; - } -} -.game-icon-card-ace-diamonds { - &:before { - content: '\E13D'; - } -} -.game-icon-card-ace-hearts { - &:before { - content: '\E13E'; - } -} -.game-icon-card-ace-spades { - &:before { - content: '\E13F'; - } -} -.game-icon-card-jack-clubs { - &:before { - content: '\E140'; - } -} -.game-icon-card-jack-diamonds { - &:before { - content: '\E141'; - } -} -.game-icon-card-jack-hearts { - &:before { - content: '\E142'; - } -} -.game-icon-card-jack-spades { - &:before { - content: '\E143'; - } -} -.game-icon-card-king-clubs { - &:before { - content: '\E144'; - } -} -.game-icon-card-king-diamonds { - &:before { - content: '\E145'; - } -} -.game-icon-card-king-hearts { - &:before { - content: '\E146'; - } -} -.game-icon-card-king-spades { - &:before { - content: '\E147'; - } -} -.game-icon-card-queen-clubs { - &:before { - content: '\E148'; - } -} -.game-icon-card-queen-diamonds { - &:before { - content: '\E149'; - } -} -.game-icon-card-queen-hearts { - &:before { - content: '\E14A'; - } -} -.game-icon-card-queen-spades { - &:before { - content: '\E14B'; - } -} -.game-icon-card-discard { - &:before { - content: '\E14C'; - } -} -.game-icon-card-draw { - &:before { - content: '\E14D'; - } -} -.game-icon-card-pick { - &:before { - content: '\E14E'; - } -} -.game-icon-card-random { - &:before { - content: '\E14F'; - } -} -.game-icon-3d-meeple { - &:before { - content: '\E150'; - } -} -.game-icon-abbot-meeple { - &:before { - content: '\E151'; - } -} -.game-icon-ages { - &:before { - content: '\E152'; - } -} -.game-icon-backgammon { - &:before { - content: '\E153'; - } -} -.game-icon-buy-card { - &:before { - content: '\E154'; - } -} -.game-icon-card-burn { - &:before { - content: '\E155'; - } -} -.game-icon-card-exchange { - &:before { - content: '\E156'; - } -} -.game-icon-card-joker { - &:before { - content: '\E157'; - } -} -.game-icon-coins { - &:before { - content: '\E158'; - } -} -.game-icon-conway-life-glider { - &:before { - content: '\E159'; - } -} -.game-icon-dice-six-faces-three { - &:before { - content: '\E15A'; - } -} -.game-icon-domino-tiles { - &:before { - content: '\E15B'; - } -} -.game-icon-empty-chessboard { - &:before { - content: '\E15C'; - } -} -.game-icon-meeple-army { - &:before { - content: '\E15D'; - } -} -.game-icon-meeple-circle { - &:before { - content: '\E15E'; - } -} -.game-icon-meeple-group { - &:before { - content: '\E15F'; - } -} -.game-icon-meeple-king { - &:before { - content: '\E160'; - } -} -.game-icon-meeple { - &:before { - content: '\E161'; - } -} -.game-icon-opposite-hearts { - &:before { - content: '\E162'; - } -} -.game-icon-pay-money { - &:before { - content: '\E163'; - } -} -.game-icon-perspective-dice-six-faces-four { - &:before { - content: '\E164'; - } -} -.game-icon-player-base { - &:before { - content: '\E165'; - } -} -.game-icon-player-next { - &:before { - content: '\E166'; - } -} -.game-icon-player-previous { - &:before { - content: '\E167'; - } -} -.game-icon-player-time { - &:before { - content: '\E168'; - } -} -.game-icon-receive-money { - &:before { - content: '\E169'; - } -} -.game-icon-rolling-dice-cup { - &:before { - content: '\E16A'; - } -} -.game-icon-rolling-dices { - &:before { - content: '\E16B'; - } -} -.game-icon-round-table { - &:before { - content: '\E16C'; - } -} -.game-icon-rule-book { - &:before { - content: '\E16D'; - } -} -.game-icon-sell-card { - &:before { - content: '\E16E'; - } -} -.game-icon-stack { - &:before { - content: '\E16F'; - } -} -.game-icon-tabletop-players { - &:before { - content: '\E170'; - } -} -.game-icon-team-downgrade { - &:before { - content: '\E171'; - } -} -.game-icon-team-upgrade { - &:before { - content: '\E172'; - } -} -.game-icon-tic-tac-toe { - &:before { - content: '\E173'; - } -} -.game-icon-token { - &:before { - content: '\E174'; - } -} -.game-icon-two-coins { - &:before { - content: '\E175'; - } -} -.game-icon-up-card { - &:before { - content: '\E176'; - } -} -.game-icon-honeycomb { - &:before { - content: '\E177'; - } -} -.game-icon-hourglass { - &:before { - content: '\E178'; - } -} -.game-icon-pawn { - &:before { - content: '\E179'; - } -} -.game-icon-poker-hand { - &:before { - content: '\E17A'; - } -} -.game-icon-sands-of-time { - &:before { - content: '\E17B'; - } -} -.game-icon-stopwatch { - &:before { - content: '\E17C'; - } -} -.game-icon-suits { - &:before { - content: '\E17D'; - } -} -.game-icon-card-pickup { - &:before { - content: '\E17E'; - } -} -.game-icon-card-play { - &:before { - content: '\E17F'; - } -} -.game-icon-chess-bishop { - &:before { - content: '\E180'; - } -} -.game-icon-chess-king { - &:before { - content: '\E181'; - } -} -.game-icon-chess-knight { - &:before { - content: '\E182'; - } -} -.game-icon-chess-pawn { - &:before { - content: '\E183'; - } -} -.game-icon-chess-queen { - &:before { - content: '\E184'; - } -} -.game-icon-chess-rook { - &:before { - content: '\E185'; - } -} -.game-icon-hexes { - &:before { - content: '\E186'; - } -} -.game-icon-brutal-helm { - &:before { - content: '\E187'; - } -} -.game-icon-dwarf-helmet { - &:before { - content: '\E188'; - } -} -.game-icon-dwarf-king { - &:before { - content: '\E189'; - } -} -.game-icon-elf-helmet { - &:before { - content: '\E18A'; - } -} -.game-icon-american-football-helmet { - &:before { - content: '\E18B'; - } -} -.game-icon-astronaut-helmet { - &:before { - content: '\E18C'; - } -} -.game-icon-bandana { - &:before { - content: '\E18D'; - } -} -.game-icon-bandit { - &:before { - content: '\E18E'; - } -} -.game-icon-billed-cap { - &:before { - content: '\E18F'; - } -} -.game-icon-black-knight-helm { - &:before { - content: '\E190'; - } -} -.game-icon-captain-hat-profile { - &:before { - content: '\E191'; - } -} -.game-icon-chef-toque { - &:before { - content: '\E192'; - } -} -.game-icon-closed-barbute { - &:before { - content: '\E193'; - } -} -.game-icon-cork-hat { - &:before { - content: '\E194'; - } -} -.game-icon-coronation { - &:before { - content: '\E195'; - } -} -.game-icon-crenel-crown { - &:before { - content: '\E196'; - } -} -.game-icon-deshret-red-crown { - &:before { - content: '\E197'; - } -} -.game-icon-diving-helmet { - &:before { - content: '\E198'; - } -} -.game-icon-dunce-cap { - &:before { - content: '\E199'; - } -} -.game-icon-fez { - &:before { - content: '\E19A'; - } -} -.game-icon-flower-hat { - &:before { - content: '\E19B'; - } -} -.game-icon-frog-prince { - &:before { - content: '\E19C'; - } -} -.game-icon-full-motorcycle-helmet { - &:before { - content: '\E19D'; - } -} -.game-icon-galea { - &:before { - content: '\E19E'; - } -} -.game-icon-gauls-helm { - &:before { - content: '\E19F'; - } -} -.game-icon-graduate-cap { - &:before { - content: '\E1A0'; - } -} -.game-icon-hazmat-suit { - &:before { - content: '\E1A1'; - } -} -.game-icon-hedjet-white-crown { - &:before { - content: '\E1A2'; - } -} -.game-icon-imperial-crown { - &:before { - content: '\E1A3'; - } -} -.game-icon-jester-hat { - &:before { - content: '\E1A4'; - } -} -.game-icon-jewel-crown { - &:before { - content: '\E1A5'; - } -} -.game-icon-light-helm { - &:before { - content: '\E1A6'; - } -} -.game-icon-magic-hat { - &:before { - content: '\E1A7'; - } -} -.game-icon-magick-trick { - &:before { - content: '\E1A8'; - } -} -.game-icon-mining-helmet { - &:before { - content: '\E1A9'; - } -} -.game-icon-mustache { - &:before { - content: '\E1AA'; - } -} -.game-icon-nefertiti { - &:before { - content: '\E1AB'; - } -} -.game-icon-outback-hat { - &:before { - content: '\E1AC'; - } -} -.game-icon-overlord-helm { - &:before { - content: '\E1AD'; - } -} -.game-icon-party-hat { - &:before { - content: '\E1AE'; - } -} -.game-icon-phrygian-cap { - &:before { - content: '\E1AF'; - } -} -.game-icon-pilgrim-hat { - &:before { - content: '\E1B0'; - } -} -.game-icon-pirate-hat { - &:before { - content: '\E1B1'; - } -} -.game-icon-plague-doctor-profile { - &:before { - content: '\E1B2'; - } -} -.game-icon-pope-crown { - &:before { - content: '\E1B3'; - } -} -.game-icon-propeller-beanie { - &:before { - content: '\E1B4'; - } -} -.game-icon-pschent-double-crown { - &:before { - content: '\E1B5'; - } -} -.game-icon-robin-hood-hat { - &:before { - content: '\E1B6'; - } -} -.game-icon-samurai-helmet { - &:before { - content: '\E1B7'; - } -} -.game-icon-samus-helmet { - &:before { - content: '\E1B8'; - } -} -.game-icon-sombrero { - &:before { - content: '\E1B9'; - } -} -.game-icon-spartan-helmet { - &:before { - content: '\E1BA'; - } -} -.game-icon-throne-king { - &:before { - content: '\E1BB'; - } -} -.game-icon-tiara { - &:before { - content: '\E1BC'; - } -} -.game-icon-turban { - &:before { - content: '\E1BD'; - } -} -.game-icon-ushanka { - &:before { - content: '\E1BE'; - } -} -.game-icon-viking-helmet { - &:before { - content: '\E1BF'; - } -} -.game-icon-war-bonnet { - &:before { - content: '\E1C0'; - } -} -.game-icon-warlock-hood { - &:before { - content: '\E1C1'; - } -} -.game-icon-western-hat { - &:before { - content: '\E1C2'; - } -} -.game-icon-winter-hat { - &:before { - content: '\E1C3'; - } -} -.game-icon-barbute { - &:before { - content: '\E1C4'; - } -} -.game-icon-cowled { - &:before { - content: '\E1C5'; - } -} -.game-icon-cracked-helm { - &:before { - content: '\E1C6'; - } -} -.game-icon-crested-helmet { - &:before { - content: '\E1C7'; - } -} -.game-icon-crown-coin { - &:before { - content: '\E1C8'; - } -} -.game-icon-crown-of-thorns { - &:before { - content: '\E1C9'; - } -} -.game-icon-crown { - &:before { - content: '\E1CA'; - } -} -.game-icon-crowned-heart { - &:before { - content: '\E1CB'; - } -} -.game-icon-crowned-skull { - &:before { - content: '\E1CC'; - } -} -.game-icon-fedora { - &:before { - content: '\E1CD'; - } -} -.game-icon-heavy-helm { - &:before { - content: '\E1CE'; - } -} -.game-icon-helmet-head-shot { - &:before { - content: '\E1CF'; - } -} -.game-icon-hood { - &:before { - content: '\E1D0'; - } -} -.game-icon-horned-helm { - &:before { - content: '\E1D1'; - } -} -.game-icon-laurel-crown { - &:before { - content: '\E1D2'; - } -} -.game-icon-laurels { - &:before { - content: '\E1D3'; - } -} -.game-icon-pointy-hat { - &:before { - content: '\E1D4'; - } -} -.game-icon-queen-crown { - &:before { - content: '\E1D5'; - } -} -.game-icon-sharp-crown { - &:before { - content: '\E1D6'; - } -} -.game-icon-top-hat { - &:before { - content: '\E1D7'; - } -} -.game-icon-visored-helm { - &:before { - content: '\E1D8'; - } -} -.game-icon-helmet { - &:before { - content: '\E1D9'; - } -} -.game-icon-brodie-helmet { - &:before { - content: '\E1DA'; - } -} -.game-icon-pickelhaube { - &:before { - content: '\E1DB'; - } -} -.game-icon-stahlhelm { - &:before { - content: '\E1DC'; - } -} -.game-icon-wooden-helmet { - &:before { - content: '\E1DD'; - } -} -.game-icon-nun-face { - &:before { - content: '\E1DE'; - } -} -.game-icon-witch-face { - &:before { - content: '\E1DF'; - } -} -.game-icon-barbarian { - &:before { - content: '\E1E0'; - } -} -.game-icon-dwarf-face { - &:before { - content: '\E1E1'; - } -} -.game-icon-executioner-hood { - &:before { - content: '\E1E2'; - } -} -.game-icon-female-vampire { - &:before { - content: '\E1E3'; - } -} -.game-icon-fish-monster { - &:before { - content: '\E1E4'; - } -} -.game-icon-goblin-head { - &:before { - content: '\E1E5'; - } -} -.game-icon-golem-head { - &:before { - content: '\E1E6'; - } -} -.game-icon-kenku-head { - &:before { - content: '\E1E7'; - } -} -.game-icon-monk-face { - &:before { - content: '\E1E8'; - } -} -.game-icon-ogre { - &:before { - content: '\E1E9'; - } -} -.game-icon-orc-head { - &:before { - content: '\E1EA'; - } -} -.game-icon-vampire-dracula { - &:before { - content: '\E1EB'; - } -} -.game-icon-wizard-face { - &:before { - content: '\E1EC'; - } -} -.game-icon-woman-elf-face { - &:before { - content: '\E1ED'; - } -} -.game-icon-cultist { - &:before { - content: '\E1EE'; - } -} -.game-icon-diablo-skull { - &:before { - content: '\E1EF'; - } -} -.game-icon-dragon-head { - &:before { - content: '\E1F0'; - } -} -.game-icon-troll { - &:before { - content: '\E1F1'; - } -} -.game-icon-crossbow { - &:before { - content: '\E1F2'; - } -} -.game-icon-annexation { - &:before { - content: '\E1F3'; - } -} -.game-icon-broken-arrow { - &:before { - content: '\E1F4'; - } -} -.game-icon-forward-sun { - &:before { - content: '\E1F5'; - } -} -.game-icon-dodge { - &:before { - content: '\E1F6'; - } -} -.game-icon-overhead { - &:before { - content: '\E1F7'; - } -} -.game-icon-sideswipe { - &:before { - content: '\E1F8'; - } -} -.game-icon-thrust { - &:before { - content: '\E1F9'; - } -} -.game-icon-underhand { - &:before { - content: '\E1FA'; - } -} -.game-icon-achilles-heel { - &:before { - content: '\E1FB'; - } -} -.game-icon-anticlockwise-rotation { - &:before { - content: '\E1FC'; - } -} -.game-icon-archer { - &:before { - content: '\E1FD'; - } -} -.game-icon-arrow-cursor { - &:before { - content: '\E1FE'; - } -} -.game-icon-arrow-wings { - &:before { - content: '\E1FF'; - } -} -.game-icon-avoidance { - &:before { - content: '\E200'; - } -} -.game-icon-backward-time { - &:before { - content: '\E201'; - } -} -.game-icon-body-height { - &:before { - content: '\E202'; - } -} -.game-icon-bow-arrow { - &:before { - content: '\E203'; - } -} -.game-icon-box-unpacking { - &:before { - content: '\E204'; - } -} -.game-icon-brain-dump { - &:before { - content: '\E205'; - } -} -.game-icon-chart { - &:before { - content: '\E206'; - } -} -.game-icon-clockwise-rotation { - &:before { - content: '\E207'; - } -} -.game-icon-cloud-download { - &:before { - content: '\E208'; - } -} -.game-icon-cloud-upload { - &:before { - content: '\E209'; - } -} -.game-icon-contract { - &:before { - content: '\E20A'; - } -} -.game-icon-dart { - &:before { - content: '\E20B'; - } -} -.game-icon-detour { - &:before { - content: '\E20C'; - } -} -.game-icon-direction-sign { - &:before { - content: '\E20D'; - } -} -.game-icon-encirclement { - &:before { - content: '\E20E'; - } -} -.game-icon-expand { - &:before { - content: '\E20F'; - } -} -.game-icon-expense { - &:before { - content: '\E210'; - } -} -.game-icon-flag-objective { - &:before { - content: '\E211'; - } -} -.game-icon-growth { - &:before { - content: '\E212'; - } -} -.game-icon-horizontal-flip { - &:before { - content: '\E213'; - } -} -.game-icon-join { - &:before { - content: '\E214'; - } -} -.game-icon-misdirection { - &:before { - content: '\E215'; - } -} -.game-icon-move { - &:before { - content: '\E216'; - } -} -.game-icon-plain-arrow { - &:before { - content: '\E217'; - } -} -.game-icon-progression { - &:before { - content: '\E218'; - } -} -.game-icon-quiver { - &:before { - content: '\E219'; - } -} -.game-icon-save-arrow { - &:before { - content: '\E21A'; - } -} -.game-icon-slalom { - &:before { - content: '\E21B'; - } -} -.game-icon-spear-feather { - &:before { - content: '\E21C'; - } -} -.game-icon-spearfishing { - &:before { - content: '\E21D'; - } -} -.game-icon-split-arrows { - &:before { - content: '\E21E'; - } -} -.game-icon-sun-spear { - &:before { - content: '\E21F'; - } -} -.game-icon-target-prize { - &:before { - content: '\E220'; - } -} -.game-icon-thrust-bend { - &:before { - content: '\E221'; - } -} -.game-icon-tree-growth { - &:before { - content: '\E222'; - } -} -.game-icon-upgrade { - &:before { - content: '\E223'; - } -} -.game-icon-vertical-flip { - &:before { - content: '\E224'; - } -} -.game-icon-water-recycling { - &:before { - content: '\E225'; - } -} -.game-icon-aerodynamic-harpoon { - &:before { - content: '\E226'; - } -} -.game-icon-arrow-cluster { - &:before { - content: '\E227'; - } -} -.game-icon-arrow-dunk { - &:before { - content: '\E228'; - } -} -.game-icon-arrow-flights { - &:before { - content: '\E229'; - } -} -.game-icon-arrowed { - &:before { - content: '\E22A'; - } -} -.game-icon-arrowhead { - &:before { - content: '\E22B'; - } -} -.game-icon-back-forth { - &:before { - content: '\E22C'; - } -} -.game-icon-barbed-arrow { - &:before { - content: '\E22D'; - } -} -.game-icon-barbed-spear { - &:before { - content: '\E22E'; - } -} -.game-icon-bottom-right-3d-arrow { - &:before { - content: '\E22F'; - } -} -.game-icon-bowman { - &:before { - content: '\E230'; - } -} -.game-icon-branch-arrow { - &:before { - content: '\E231'; - } -} -.game-icon-broadhead-arrow { - &:before { - content: '\E232'; - } -} -.game-icon-chained-arrow-heads { - &:before { - content: '\E233'; - } -} -.game-icon-charged-arrow { - &:before { - content: '\E234'; - } -} -.game-icon-cheerful { - &:before { - content: '\E235'; - } -} -.game-icon-chemical-arrow { - &:before { - content: '\E236'; - } -} -.game-icon-crosshair-arrow { - &:before { - content: '\E237'; - } -} -.game-icon-cupidon-arrow { - &:before { - content: '\E238'; - } -} -.game-icon-divergence { - &:before { - content: '\E239'; - } -} -.game-icon-divert { - &:before { - content: '\E23A'; - } -} -.game-icon-double-shot { - &:before { - content: '\E23B'; - } -} -.game-icon-energy-arrow { - &:before { - content: '\E23C'; - } -} -.game-icon-falling-boulder { - &:before { - content: '\E23D'; - } -} -.game-icon-fast-arrow { - &:before { - content: '\E23E'; - } -} -.game-icon-flaming-arrow { - &:before { - content: '\E23F'; - } -} -.game-icon-frayed-arrow { - &:before { - content: '\E240'; - } -} -.game-icon-frozen-arrow { - &:before { - content: '\E241'; - } -} -.game-icon-headshot { - &:before { - content: '\E242'; - } -} -.game-icon-heavy-arrow { - &:before { - content: '\E243'; - } -} -.game-icon-high-shot { - &:before { - content: '\E244'; - } -} -.game-icon-ice-spear { - &:before { - content: '\E245'; - } -} -.game-icon-imbricated-arrows { - &:before { - content: '\E246'; - } -} -.game-icon-impact-point { - &:before { - content: '\E247'; - } -} -.game-icon-interleaved-arrows { - &:before { - content: '\E248'; - } -} -.game-icon-lift { - &:before { - content: '\E249'; - } -} -.game-icon-lob-arrow { - &:before { - content: '\E24A'; - } -} -.game-icon-middle-arrow { - &:before { - content: '\E24B'; - } -} -.game-icon-on-target { - &:before { - content: '\E24C'; - } -} -.game-icon-orb-direction { - &:before { - content: '\E24D'; - } -} -.game-icon-paper-arrow { - &:before { - content: '\E24E'; - } -} -.game-icon-pentarrows-tornado { - &:before { - content: '\E24F'; - } -} -.game-icon-pierced-body { - &:before { - content: '\E250'; - } -} -.game-icon-pierced-heart { - &:before { - content: '\E251'; - } -} -.game-icon-piercing-sword { - &:before { - content: '\E252'; - } -} -.game-icon-pocket-bow { - &:before { - content: '\E253'; - } -} -.game-icon-profit { - &:before { - content: '\E254'; - } -} -.game-icon-rally-the-troops { - &:before { - content: '\E255'; - } -} -.game-icon-rapidshare-arrow { - &:before { - content: '\E256'; - } -} -.game-icon-return-arrow { - &:before { - content: '\E257'; - } -} -.game-icon-self-love { - &:before { - content: '\E258'; - } -} -.game-icon-slicing-arrow { - &:before { - content: '\E259'; - } -} -.game-icon-smash-arrows { - &:before { - content: '\E25A'; - } -} -.game-icon-spear-hook { - &:before { - content: '\E25B'; - } -} -.game-icon-spears { - &:before { - content: '\E25C'; - } -} -.game-icon-spine-arrow { - &:before { - content: '\E25D'; - } -} -.game-icon-spiral-arrow { - &:before { - content: '\E25E'; - } -} -.game-icon-spotted-arrowhead { - &:before { - content: '\E25F'; - } -} -.game-icon-stone-spear { - &:before { - content: '\E260'; - } -} -.game-icon-striking-arrows { - &:before { - content: '\E261'; - } -} -.game-icon-striking-clamps { - &:before { - content: '\E262'; - } -} -.game-icon-supersonic-arrow { - &:before { - content: '\E263'; - } -} -.game-icon-target-arrows { - &:before { - content: '\E264'; - } -} -.game-icon-target-shot { - &:before { - content: '\E265'; - } -} -.game-icon-thorn-helix { - &:before { - content: '\E266'; - } -} -.game-icon-thorned-arrow { - &:before { - content: '\E267'; - } -} -.game-icon-thrown-spear { - &:before { - content: '\E268'; - } -} -.game-icon-trade { - &:before { - content: '\E269'; - } -} -.game-icon-tron-arrow { - &:before { - content: '\E26A'; - } -} -.game-icon-uncertainty { - &:before { - content: '\E26B'; - } -} -.game-icon-wavy-itinerary { - &:before { - content: '\E26C'; - } -} -.game-icon-wide-arrow-dunk { - &:before { - content: '\E26D'; - } -} -.game-icon-william-tell-skull { - &:before { - content: '\E26E'; - } -} -.game-icon-william-tell { - &:before { - content: '\E26F'; - } -} -.game-icon-winged-arrow { - &:before { - content: '\E270'; - } -} -.game-icon-zig-arrow { - &:before { - content: '\E271'; - } -} -.game-icon-bunker-assault { - &:before { - content: '\E272'; - } -} -.game-icon-trench-assault { - &:before { - content: '\E273'; - } -} -.game-icon-fall-down { - &:before { - content: '\E274'; - } -} -.game-icon-pounce { - &:before { - content: '\E275'; - } -} -.game-icon-bullseye { - &:before { - content: '\E276'; - } -} -.game-icon-flying-shuriken { - &:before { - content: '\E277'; - } -} -.game-icon-kusarigama { - &:before { - content: '\E278'; - } -} -.game-icon-north-star-shuriken { - &:before { - content: '\E279'; - } -} -.game-icon-sharp-shuriken { - &:before { - content: '\E27A'; - } -} -.game-icon-shuriken { - &:before { - content: '\E27B'; - } -} -.game-icon-star-shuriken { - &:before { - content: '\E27C'; - } -} -.game-icon-three-pointed-shuriken { - &:before { - content: '\E27D'; - } -} -.game-icon-whirlpool-shuriken { - &:before { - content: '\E27E'; - } -} -.game-icon-ninja-star { - &:before { - content: '\E27F'; - } -} -.game-icon-shepherds-crook { - &:before { - content: '\E280'; - } -} -.game-icon-armored-boomerang { - &:before { - content: '\E281'; - } -} -.game-icon-baseball-bat { - &:before { - content: '\E282'; - } -} -.game-icon-bo { - &:before { - content: '\E283'; - } -} -.game-icon-bone-mace { - &:before { - content: '\E284'; - } -} -.game-icon-boomerang-cross { - &:before { - content: '\E285'; - } -} -.game-icon-boomerang { - &:before { - content: '\E286'; - } -} -.game-icon-bow-string { - &:before { - content: '\E287'; - } -} -.game-icon-brass-knuckles { - &:before { - content: '\E288'; - } -} -.game-icon-broken-axe { - &:before { - content: '\E289'; - } -} -.game-icon-claymore-explosive { - &:before { - content: '\E28A'; - } -} -.game-icon-crescent-staff { - &:before { - content: '\E28B'; - } -} -.game-icon-crowbar { - &:before { - content: '\E28C'; - } -} -.game-icon-dagger-rose { - &:before { - content: '\E28D'; - } -} -.game-icon-detonator { - &:before { - content: '\E28E'; - } -} -.game-icon-flail { - &:before { - content: '\E28F'; - } -} -.game-icon-flamethrower-soldier { - &:before { - content: '\E290'; - } -} -.game-icon-flamethrower { - &:before { - content: '\E291'; - } -} -.game-icon-flanged-mace { - &:before { - content: '\E292'; - } -} -.game-icon-gun-rose { - &:before { - content: '\E293'; - } -} -.game-icon-heavy-bullets { - &:before { - content: '\E294'; - } -} -.game-icon-human-cannonball { - &:before { - content: '\E295'; - } -} -.game-icon-hunting-bolas { - &:before { - content: '\E296'; - } -} -.game-icon-laser-turret { - &:before { - content: '\E297'; - } -} -.game-icon-lasso { - &:before { - content: '\E298'; - } -} -.game-icon-lead-pipe { - &:before { - content: '\E299'; - } -} -.game-icon-lunar-wand { - &:before { - content: '\E29A'; - } -} -.game-icon-magic-trident { - &:before { - content: '\E29B'; - } -} -.game-icon-missile-launcher { - &:before { - content: '\E29C'; - } -} -.game-icon-monkey-wrench { - &:before { - content: '\E29D'; - } -} -.game-icon-mortar { - &:before { - content: '\E29E'; - } -} -.game-icon-nunchaku { - &:before { - content: '\E29F'; - } -} -.game-icon-panzerfaust { - &:before { - content: '\E2A0'; - } -} -.game-icon-reload-gun-barrel { - &:before { - content: '\E2A1'; - } -} -.game-icon-revolver { - &:before { - content: '\E2A2'; - } -} -.game-icon-saber-and-pistol { - &:before { - content: '\E2A3'; - } -} -.game-icon-sai { - &:before { - content: '\E2A4'; - } -} -.game-icon-sawed-off-shotgun { - &:before { - content: '\E2A5'; - } -} -.game-icon-sharp-axe { - &:before { - content: '\E2A6'; - } -} -.game-icon-silver-bullet { - &:before { - content: '\E2A7'; - } -} -.game-icon-skull-staff { - &:before { - content: '\E2A8'; - } -} -.game-icon-sling { - &:before { - content: '\E2A9'; - } -} -.game-icon-slingshot { - &:before { - content: '\E2AA'; - } -} -.game-icon-stake-hammer { - &:before { - content: '\E2AB'; - } -} -.game-icon-submarine-missile { - &:before { - content: '\E2AC'; - } -} -.game-icon-switch-weapon { - &:before { - content: '\E2AD'; - } -} -.game-icon-sword-brandish { - &:before { - content: '\E2AE'; - } -} -.game-icon-thor-hammer { - &:before { - content: '\E2AF'; - } -} -.game-icon-tomahawk { - &:before { - content: '\E2B0'; - } -} -.game-icon-torpedo { - &:before { - content: '\E2B1'; - } -} -.game-icon-umbrella-bayonet { - &:before { - content: '\E2B2'; - } -} -.game-icon-uzi { - &:before { - content: '\E2B3'; - } -} -.game-icon-walking-turret { - &:before { - content: '\E2B4'; - } -} -.game-icon-war-axe { - &:before { - content: '\E2B5'; - } -} -.game-icon-war-pick { - &:before { - content: '\E2B6'; - } -} -.game-icon-warhammer { - &:before { - content: '\E2B7'; - } -} -.game-icon-winged-scepter { - &:before { - content: '\E2B8'; - } -} -.game-icon-wood-club { - &:before { - content: '\E2B9'; - } -} -.game-icon-zat-gun { - &:before { - content: '\E2BA'; - } -} -.game-icon-all-for-one { - &:before { - content: '\E2BB'; - } -} -.game-icon-andromeda-chain { - &:before { - content: '\E2BC'; - } -} -.game-icon-archery-target { - &:before { - content: '\E2BD'; - } -} -.game-icon-autogun { - &:before { - content: '\E2BE'; - } -} -.game-icon-axe-in-stump { - &:before { - content: '\E2BF'; - } -} -.game-icon-backstab { - &:before { - content: '\E2C0'; - } -} -.game-icon-battered-axe { - &:before { - content: '\E2C1'; - } -} -.game-icon-battle-axe { - &:before { - content: '\E2C2'; - } -} -.game-icon-beam-wake { - &:before { - content: '\E2C3'; - } -} -.game-icon-blunderbuss { - &:before { - content: '\E2C4'; - } -} -.game-icon-bolas { - &:before { - content: '\E2C5'; - } -} -.game-icon-bolter-gun { - &:before { - content: '\E2C6'; - } -} -.game-icon-broken-bottle { - &:before { - content: '\E2C7'; - } -} -.game-icon-bullets { - &:before { - content: '\E2C8'; - } -} -.game-icon-cannon-ball { - &:before { - content: '\E2C9'; - } -} -.game-icon-cannon-shot { - &:before { - content: '\E2CA'; - } -} -.game-icon-cannon { - &:before { - content: '\E2CB'; - } -} -.game-icon-crossed-pistols { - &:before { - content: '\E2CC'; - } -} -.game-icon-crossed-sabres { - &:before { - content: '\E2CD'; - } -} -.game-icon-crossed-swords { - &:before { - content: '\E2CE'; - } -} -.game-icon-crystal-wand { - &:before { - content: '\E2CF'; - } -} -.game-icon-dripping-knife { - &:before { - content: '\E2D0'; - } -} -.game-icon-fairy-wand { - &:before { - content: '\E2D1'; - } -} -.game-icon-flaming-trident { - &:before { - content: '\E2D2'; - } -} -.game-icon-grapple { - &:before { - content: '\E2D3'; - } -} -.game-icon-grenade { - &:before { - content: '\E2D4'; - } -} -.game-icon-gunshot { - &:before { - content: '\E2D5'; - } -} -.game-icon-halberd-shuriken { - &:before { - content: '\E2D6'; - } -} -.game-icon-harpoon-chain { - &:before { - content: '\E2D7'; - } -} -.game-icon-harpoon-trident { - &:before { - content: '\E2D8'; - } -} -.game-icon-laser-blast { - &:before { - content: '\E2D9'; - } -} -.game-icon-lightning-bow { - &:before { - content: '\E2DA'; - } -} -.game-icon-mace-head { - &:before { - content: '\E2DB'; - } -} -.game-icon-machete { - &:before { - content: '\E2DC'; - } -} -.game-icon-minigun { - &:before { - content: '\E2DD'; - } -} -.game-icon-missile-pod { - &:before { - content: '\E2DE'; - } -} -.game-icon-missile-swarm { - &:before { - content: '\E2DF'; - } -} -.game-icon-pincers { - &:before { - content: '\E2E0'; - } -} -.game-icon-ray-gun { - &:before { - content: '\E2E1'; - } -} -.game-icon-reticule { - &:before { - content: '\E2E2'; - } -} -.game-icon-saber-slash { - &:before { - content: '\E2E3'; - } -} -.game-icon-sabers-choc { - &:before { - content: '\E2E4'; - } -} -.game-icon-sacrificial-dagger { - &:before { - content: '\E2E5'; - } -} -.game-icon-scalpel-strike { - &:before { - content: '\E2E6'; - } -} -.game-icon-scythe { - &:before { - content: '\E2E7'; - } -} -.game-icon-sentry-gun { - &:before { - content: '\E2E8'; - } -} -.game-icon-shuriken-2 { - &:before { - content: '\E2E9'; - } -} -.game-icon-slavery-whip { - &:before { - content: '\E2EA'; - } -} -.game-icon-sparkling-sabre { - &:before { - content: '\E2EB'; - } -} -.game-icon-spiked-mace { - &:before { - content: '\E2EC'; - } -} -.game-icon-spray { - &:before { - content: '\E2ED'; - } -} -.game-icon-stiletto { - &:before { - content: '\E2EE'; - } -} -.game-icon-supersonic-bullet { - &:before { - content: '\E2EF'; - } -} -.game-icon-sword-clash { - &:before { - content: '\E2F0'; - } -} -.game-icon-sword-in-stone { - &:before { - content: '\E2F1'; - } -} -.game-icon-sword-spade { - &:before { - content: '\E2F2'; - } -} -.game-icon-tesla-turret { - &:before { - content: '\E2F3'; - } -} -.game-icon-trefoil-shuriken { - &:before { - content: '\E2F4'; - } -} -.game-icon-trident { - &:before { - content: '\E2F5'; - } -} -.game-icon-wave-strike { - &:before { - content: '\E2F6'; - } -} -.game-icon-whip { - &:before { - content: '\E2F7'; - } -} -.game-icon-winged-sword { - &:before { - content: '\E2F8'; - } -} -.game-icon-wizard-staff { - &:before { - content: '\E2F9'; - } -} -.game-icon-anti-aircraft-gun { - &:before { - content: '\E2FA'; - } -} -.game-icon-field-gun { - &:before { - content: '\E2FB'; - } -} -.game-icon-ammo-box { - &:before { - content: '\E2FC'; - } -} -.game-icon-chaingun { - &:before { - content: '\E2FD'; - } -} -.game-icon-duel { - &:before { - content: '\E2FE'; - } -} -.game-icon-grenade-2 { - &:before { - content: '\E2FF'; - } -} -.game-icon-laser-gun { - &:before { - content: '\E300'; - } -} -.game-icon-rifle { - &:before { - content: '\E301'; - } -} -.game-icon-shotgun { - &:before { - content: '\E302'; - } -} -.game-icon-turret { - &:before { - content: '\E303'; - } -} -.game-icon-bayonet { - &:before { - content: '\E304'; - } -} -.game-icon-drop-weapon { - &:before { - content: '\E305'; - } -} -.game-icon-gladius { - &:before { - content: '\E306'; - } -} -.game-icon-lee-enfield { - &:before { - content: '\E307'; - } -} -.game-icon-luger { - &:before { - content: '\E308'; - } -} -.game-icon-nuclear-bomb { - &:before { - content: '\E309'; - } -} -.game-icon-spiked-ball { - &:before { - content: '\E30A'; - } -} -.game-icon-spiked-bat { - &:before { - content: '\E30B'; - } -} -.game-icon-stick-grenade { - &:before { - content: '\E30C'; - } -} -.game-icon-tec-9 { - &:before { - content: '\E30D'; - } -} -.game-icon-telescopic-baton { - &:before { - content: '\E30E'; - } -} -.game-icon-teller-mine { - &:before { - content: '\E30F'; - } -} -.game-icon-orb-wand { - &:before { - content: '\E310'; - } -} -.game-icon-flame { - &:before { - content: '\E311'; - } -} -.game-icon-bellows { - &:before { - content: '\E312'; - } -} -.game-icon-brasero { - &:before { - content: '\E313'; - } -} -.game-icon-burning-forest { - &:before { - content: '\E314'; - } -} -.game-icon-camp-cooking-pot { - &:before { - content: '\E315'; - } -} -.game-icon-candles { - &:before { - content: '\E316'; - } -} -.game-icon-dice-fire { - &:before { - content: '\E317'; - } -} -.game-icon-fire-extinguisher { - &:before { - content: '\E318'; - } -} -.game-icon-fire-flower { - &:before { - content: '\E319'; - } -} -.game-icon-fire-gem { - &:before { - content: '\E31A'; - } -} -.game-icon-fire-shrine { - &:before { - content: '\E31B'; - } -} -.game-icon-fire-spell-cast { - &:before { - content: '\E31C'; - } -} -.game-icon-fireplace { - &:before { - content: '\E31D'; - } -} -.game-icon-firewall { - &:before { - content: '\E31E'; - } -} -.game-icon-fish-smoking { - &:before { - content: '\E31F'; - } -} -.game-icon-flint-spark { - &:before { - content: '\E320'; - } -} -.game-icon-furnace { - &:before { - content: '\E321'; - } -} -.game-icon-gas-stove { - &:before { - content: '\E322'; - } -} -.game-icon-lighter { - &:before { - content: '\E323'; - } -} -.game-icon-lightning-flame { - &:before { - content: '\E324'; - } -} -.game-icon-marshmallows { - &:before { - content: '\E325'; - } -} -.game-icon-matchbox { - &:before { - content: '\E326'; - } -} -.game-icon-primitive-torch { - &:before { - content: '\E327'; - } -} -.game-icon-pyre { - &:before { - content: '\E328'; - } -} -.game-icon-torch { - &:before { - content: '\E329'; - } -} -.game-icon-alien-fire { - &:before { - content: '\E32A'; - } -} -.game-icon-arson { - &:before { - content: '\E32B'; - } -} -.game-icon-burning-book { - &:before { - content: '\E32C'; - } -} -.game-icon-burning-dot { - &:before { - content: '\E32D'; - } -} -.game-icon-burning-embers { - &:before { - content: '\E32E'; - } -} -.game-icon-burning-eye { - &:before { - content: '\E32F'; - } -} -.game-icon-burning-meteor { - &:before { - content: '\E330'; - } -} -.game-icon-burning-passion { - &:before { - content: '\E331'; - } -} -.game-icon-burning-tree { - &:before { - content: '\E332'; - } -} -.game-icon-caldera { - &:before { - content: '\E333'; - } -} -.game-icon-campfire { - &:before { - content: '\E334'; - } -} -.game-icon-candle-flame { - &:before { - content: '\E335'; - } -} -.game-icon-candle-holder { - &:before { - content: '\E336'; - } -} -.game-icon-candle-light { - &:before { - content: '\E337'; - } -} -.game-icon-candlebright { - &:before { - content: '\E338'; - } -} -.game-icon-celebration-fire { - &:before { - content: '\E339'; - } -} -.game-icon-dragon-breath { - &:before { - content: '\E33A'; - } -} -.game-icon-ember-shot { - &:before { - content: '\E33B'; - } -} -.game-icon-eruption { - &:before { - content: '\E33C'; - } -} -.game-icon-fire-ace { - &:before { - content: '\E33D'; - } -} -.game-icon-fire-axe { - &:before { - content: '\E33E'; - } -} -.game-icon-fire-bomb { - &:before { - content: '\E33F'; - } -} -.game-icon-fire-bottle { - &:before { - content: '\E340'; - } -} -.game-icon-fire-bowl { - &:before { - content: '\E341'; - } -} -.game-icon-fire-breath { - &:before { - content: '\E342'; - } -} -.game-icon-fire-dash { - &:before { - content: '\E343'; - } -} -.game-icon-fire-punch { - &:before { - content: '\E344'; - } -} -.game-icon-fire-ray { - &:before { - content: '\E345'; - } -} -.game-icon-fire-ring { - &:before { - content: '\E346'; - } -} -.game-icon-fire-silhouette { - &:before { - content: '\E347'; - } -} -.game-icon-fire-tail { - &:before { - content: '\E348'; - } -} -.game-icon-fire-wave { - &:before { - content: '\E349'; - } -} -.game-icon-fire-zone { - &:before { - content: '\E34A'; - } -} -.game-icon-fireball { - &:before { - content: '\E34B'; - } -} -.game-icon-firework-rocket { - &:before { - content: '\E34C'; - } -} -.game-icon-flame-claws { - &:before { - content: '\E34D'; - } -} -.game-icon-flame-spin { - &:before { - content: '\E34E'; - } -} -.game-icon-flame-tunnel { - &:before { - content: '\E34F'; - } -} -.game-icon-flamed-leaf { - &:before { - content: '\E350'; - } -} -.game-icon-flaming-claw { - &:before { - content: '\E351'; - } -} -.game-icon-flaming-sheet { - &:before { - content: '\E352'; - } -} -.game-icon-fluffy-flame { - &:before { - content: '\E353'; - } -} -.game-icon-frostfire { - &:before { - content: '\E354'; - } -} -.game-icon-heartburn { - &:before { - content: '\E355'; - } -} -.game-icon-heat-haze { - &:before { - content: '\E356'; - } -} -.game-icon-hot-spices { - &:before { - content: '\E357'; - } -} -.game-icon-ifrit { - &:before { - content: '\E358'; - } -} -.game-icon-kindle { - &:before { - content: '\E359'; - } -} -.game-icon-lantern-flame { - &:before { - content: '\E35A'; - } -} -.game-icon-lit-candelabra { - &:before { - content: '\E35B'; - } -} -.game-icon-match-head { - &:before { - content: '\E35C'; - } -} -.game-icon-match-tip { - &:before { - content: '\E35D'; - } -} -.game-icon-molotov { - &:before { - content: '\E35E'; - } -} -.game-icon-plasma-bolt { - &:before { - content: '\E35F'; - } -} -.game-icon-pyromaniac { - &:before { - content: '\E360'; - } -} -.game-icon-salamander { - &:before { - content: '\E361'; - } -} -.game-icon-small-fire { - &:before { - content: '\E362'; - } -} -.game-icon-spark-spirit { - &:before { - content: '\E363'; - } -} -.game-icon-three-burning-balls { - &:before { - content: '\E364'; - } -} -.game-icon-thrown-charcoal { - &:before { - content: '\E365'; - } -} -.game-icon-unfriendly-fire { - &:before { - content: '\E366'; - } -} -.game-icon-volcano { - &:before { - content: '\E367'; - } -} -.game-icon-wildfires { - &:before { - content: '\E368'; - } -} -.game-icon-blast { - &:before { - content: '\E369'; - } -} -.game-icon-blaster { - &:before { - content: '\E36A'; - } -} -.game-icon-burn { - &:before { - content: '\E36B'; - } -} -.game-icon-fire { - &:before { - content: '\E36C'; - } -} -.game-icon-fireflake { - &:before { - content: '\E36D'; - } -} -.game-icon-flamer { - &:before { - content: '\E36E'; - } -} -.game-icon-hot-surface { - &:before { - content: '\E36F'; - } -} -.game-icon-lava { - &:before { - content: '\E370'; - } -} -.game-icon-lucifer-cannon { - &:before { - content: '\E371'; - } -} -.game-icon-burning-skull { - &:before { - content: '\E372'; - } -} -.game-icon-mite-alt { - &:before { - content: '\E373'; - } -} -.game-icon-spider-alt { - &:before { - content: '\E374'; - } -} -.game-icon-spider-face { - &:before { - content: '\E375'; - } -} -.game-icon-earth-worm { - &:before { - content: '\E376'; - } -} -.game-icon-flying-trout { - &:before { - content: '\E377'; - } -} -.game-icon-polar-bear { - &:before { - content: '\E378'; - } -} -.game-icon-plants-and-animals { - &:before { - content: '\E379'; - } -} -.game-icon-animal-hide { - &:before { - content: '\E37A'; - } -} -.game-icon-bat-2 { - &:before { - content: '\E37B'; - } -} -.game-icon-bear-head { - &:before { - content: '\E37C'; - } -} -.game-icon-camel-head { - &:before { - content: '\E37D'; - } -} -.game-icon-cassowary-head { - &:before { - content: '\E37E'; - } -} -.game-icon-charging-bull { - &:before { - content: '\E37F'; - } -} -.game-icon-chicken { - &:before { - content: '\E380'; - } -} -.game-icon-clownfish { - &:before { - content: '\E381'; - } -} -.game-icon-cow { - &:before { - content: '\E382'; - } -} -.game-icon-cricket { - &:before { - content: '\E383'; - } -} -.game-icon-deer-track { - &:before { - content: '\E384'; - } -} -.game-icon-dog-bowl { - &:before { - content: '\E385'; - } -} -.game-icon-dog-house { - &:before { - content: '\E386'; - } -} -.game-icon-dolphin { - &:before { - content: '\E387'; - } -} -.game-icon-duck { - &:before { - content: '\E388'; - } -} -.game-icon-eagle-head { - &:before { - content: '\E389'; - } -} -.game-icon-elephant-head { - &:before { - content: '\E38A'; - } -} -.game-icon-elephant { - &:before { - content: '\E38B'; - } -} -.game-icon-falcon-moon { - &:before { - content: '\E38C'; - } -} -.game-icon-feline { - &:before { - content: '\E38D'; - } -} -.game-icon-finch { - &:before { - content: '\E38E'; - } -} -.game-icon-flamingo { - &:before { - content: '\E38F'; - } -} -.game-icon-fox-tail { - &:before { - content: '\E390'; - } -} -.game-icon-giant-squid { - &:before { - content: '\E391'; - } -} -.game-icon-gorilla { - &:before { - content: '\E392'; - } -} -.game-icon-griffin-symbol { - &:before { - content: '\E393'; - } -} -.game-icon-honey-jar { - &:before { - content: '\E394'; - } -} -.game-icon-horse-head { - &:before { - content: '\E395'; - } -} -.game-icon-ivory-tusks { - &:before { - content: '\E396'; - } -} -.game-icon-kangaroo { - &:before { - content: '\E397'; - } -} -.game-icon-koala { - &:before { - content: '\E398'; - } -} -.game-icon-labrador-head { - &:before { - content: '\E399'; - } -} -.game-icon-lynx-head { - &:before { - content: '\E39A'; - } -} -.game-icon-manta-ray { - &:before { - content: '\E39B'; - } -} -.game-icon-moon-bats { - &:before { - content: '\E39C'; - } -} -.game-icon-panda { - &:before { - content: '\E39D'; - } -} -.game-icon-penguin { - &:before { - content: '\E39E'; - } -} -.game-icon-pinata { - &:before { - content: '\E39F'; - } -} -.game-icon-praying-mantis { - &:before { - content: '\E3A0'; - } -} -.game-icon-rabbit { - &:before { - content: '\E3A1'; - } -} -.game-icon-rat { - &:before { - content: '\E3A2'; - } -} -.game-icon-rhinoceros-horn { - &:before { - content: '\E3A3'; - } -} -.game-icon-rooster { - &:before { - content: '\E3A4'; - } -} -.game-icon-saddle { - &:before { - content: '\E3A5'; - } -} -.game-icon-sea-star { - &:before { - content: '\E3A6'; - } -} -.game-icon-seahorse { - &:before { - content: '\E3A7'; - } -} -.game-icon-shark-bite { - &:before { - content: '\E3A8'; - } -} -.game-icon-shark-fin { - &:before { - content: '\E3A9'; - } -} -.game-icon-sheep { - &:before { - content: '\E3AA'; - } -} -.game-icon-snail-eyes { - &:before { - content: '\E3AB'; - } -} -.game-icon-sperm-whale { - &:before { - content: '\E3AC'; - } -} -.game-icon-stable { - &:before { - content: '\E3AD'; - } -} -.game-icon-tiger-head { - &:before { - content: '\E3AE'; - } -} -.game-icon-tiger { - &:before { - content: '\E3AF'; - } -} -.game-icon-tortoise { - &:before { - content: '\E3B0'; - } -} -.game-icon-toucan { - &:before { - content: '\E3B1'; - } -} -.game-icon-trojan-horse { - &:before { - content: '\E3B2'; - } -} -.game-icon-udder { - &:before { - content: '\E3B3'; - } -} -.game-icon-whale-tail { - &:before { - content: '\E3B4'; - } -} -.game-icon-wool { - &:before { - content: '\E3B5'; - } -} -.game-icon-worms { - &:before { - content: '\E3B6'; - } -} -.game-icon-yarn { - &:before { - content: '\E3B7'; - } -} -.game-icon-ammonite-fossil { - &:before { - content: '\E3B8'; - } -} -.game-icon-ammonite { - &:before { - content: '\E3B9'; - } -} -.game-icon-angler-fish { - &:before { - content: '\E3BA'; - } -} -.game-icon-angular-spider { - &:before { - content: '\E3BB'; - } -} -.game-icon-animal-skull { - &:before { - content: '\E3BC'; - } -} -.game-icon-armadillo-tail { - &:before { - content: '\E3BD'; - } -} -.game-icon-bat-wing { - &:before { - content: '\E3BE'; - } -} -.game-icon-bee { - &:before { - content: '\E3BF'; - } -} -.game-icon-bird-twitter { - &:before { - content: '\E3C0'; - } -} -.game-icon-boar-tusks { - &:before { - content: '\E3C1'; - } -} -.game-icon-bull-horns { - &:before { - content: '\E3C2'; - } -} -.game-icon-bull { - &:before { - content: '\E3C3'; - } -} -.game-icon-butterfly-warning { - &:before { - content: '\E3C4'; - } -} -.game-icon-butterfly { - &:before { - content: '\E3C5'; - } -} -.game-icon-cat { - &:before { - content: '\E3C6'; - } -} -.game-icon-centipede { - &:before { - content: '\E3C7'; - } -} -.game-icon-chicken-leg { - &:before { - content: '\E3C8'; - } -} -.game-icon-cobweb { - &:before { - content: '\E3C9'; - } -} -.game-icon-crab-claw { - &:before { - content: '\E3CA'; - } -} -.game-icon-crab { - &:before { - content: '\E3CB'; - } -} -.game-icon-croc-jaws { - &:before { - content: '\E3CC'; - } -} -.game-icon-crossed-claws { - &:before { - content: '\E3CD'; - } -} -.game-icon-crow-dive { - &:before { - content: '\E3CE'; - } -} -.game-icon-desert-skull { - &:before { - content: '\E3CF'; - } -} -.game-icon-dinosaur-rex { - &:before { - content: '\E3D0'; - } -} -.game-icon-dragonfly { - &:before { - content: '\E3D1'; - } -} -.game-icon-earwig { - &:before { - content: '\E3D2'; - } -} -.game-icon-evil-bat { - &:before { - content: '\E3D3'; - } -} -.game-icon-fish-corpse { - &:before { - content: '\E3D4'; - } -} -.game-icon-fishbone { - &:before { - content: '\E3D5'; - } -} -.game-icon-flat-paw-print { - &:before { - content: '\E3D6'; - } -} -.game-icon-food-chain { - &:before { - content: '\E3D7'; - } -} -.game-icon-fox-head { - &:before { - content: '\E3D8'; - } -} -.game-icon-frog { - &:before { - content: '\E3D9'; - } -} -.game-icon-gecko { - &:before { - content: '\E3DA'; - } -} -.game-icon-gold-scarab { - &:before { - content: '\E3DB'; - } -} -.game-icon-grasping-claws { - &:before { - content: '\E3DC'; - } -} -.game-icon-hanging-spider { - &:before { - content: '\E3DD'; - } -} -.game-icon-hollow-cat { - &:before { - content: '\E3DE'; - } -} -.game-icon-hoof { - &:before { - content: '\E3DF'; - } -} -.game-icon-horse-head-2 { - &:before { - content: '\E3E0'; - } -} -.game-icon-hound { - &:before { - content: '\E3E1'; - } -} -.game-icon-insect-jaws { - &:before { - content: '\E3E2'; - } -} -.game-icon-jellyfish { - &:before { - content: '\E3E3'; - } -} -.game-icon-lamprey-mouth { - &:before { - content: '\E3E4'; - } -} -.game-icon-leeching-worm { - &:before { - content: '\E3E5'; - } -} -.game-icon-lion { - &:before { - content: '\E3E6'; - } -} -.game-icon-maggot { - &:before { - content: '\E3E7'; - } -} -.game-icon-masked-spider { - &:before { - content: '\E3E8'; - } -} -.game-icon-minotaur { - &:before { - content: '\E3E9'; - } -} -.game-icon-mite { - &:before { - content: '\E3EA'; - } -} -.game-icon-monkey { - &:before { - content: '\E3EB'; - } -} -.game-icon-mouse { - &:before { - content: '\E3EC'; - } -} -.game-icon-octopus { - &:before { - content: '\E3ED'; - } -} -.game-icon-ouroboros { - &:before { - content: '\E3EE'; - } -} -.game-icon-owl { - &:before { - content: '\E3EF'; - } -} -.game-icon-parmecia { - &:before { - content: '\E3F0'; - } -} -.game-icon-parrot-head { - &:before { - content: '\E3F1'; - } -} -.game-icon-paw-front { - &:before { - content: '\E3F2'; - } -} -.game-icon-paw-heart { - &:before { - content: '\E3F3'; - } -} -.game-icon-paw-print { - &:before { - content: '\E3F4'; - } -} -.game-icon-paw { - &:before { - content: '\E3F5'; - } -} -.game-icon-raven { - &:before { - content: '\E3F6'; - } -} -.game-icon-roast-chicken { - &:before { - content: '\E3F7'; - } -} -.game-icon-sad-crab { - &:before { - content: '\E3F8'; - } -} -.game-icon-scarab-beetle { - &:before { - content: '\E3F9'; - } -} -.game-icon-scorpion-tail { - &:before { - content: '\E3FA'; - } -} -.game-icon-scorpion { - &:before { - content: '\E3FB'; - } -} -.game-icon-sea-serpent { - &:before { - content: '\E3FC'; - } -} -.game-icon-seated-mouse { - &:before { - content: '\E3FD'; - } -} -.game-icon-shark-jaws { - &:before { - content: '\E3FE'; - } -} -.game-icon-snail { - &:before { - content: '\E3FF'; - } -} -.game-icon-snake-bite { - &:before { - content: '\E400'; - } -} -.game-icon-snake-totem { - &:before { - content: '\E401'; - } -} -.game-icon-snake { - &:before { - content: '\E402'; - } -} -.game-icon-sonic-screech { - &:before { - content: '\E403'; - } -} -.game-icon-spider-web { - &:before { - content: '\E404'; - } -} -.game-icon-spiked-snail { - &:before { - content: '\E405'; - } -} -.game-icon-squid-head { - &:before { - content: '\E406'; - } -} -.game-icon-squid { - &:before { - content: '\E407'; - } -} -.game-icon-stag-head { - &:before { - content: '\E408'; - } -} -.game-icon-stomp { - &:before { - content: '\E409'; - } -} -.game-icon-swan { - &:before { - content: '\E40A'; - } -} -.game-icon-tick { - &:before { - content: '\E40B'; - } -} -.game-icon-top-paw { - &:before { - content: '\E40C'; - } -} -.game-icon-trilobite { - &:before { - content: '\E40D'; - } -} -.game-icon-turd { - &:before { - content: '\E40E'; - } -} -.game-icon-turtle-shell { - &:before { - content: '\E40F'; - } -} -.game-icon-turtle { - &:before { - content: '\E410'; - } -} -.game-icon-virus { - &:before { - content: '\E411'; - } -} -.game-icon-vulture { - &:before { - content: '\E412'; - } -} -.game-icon-wasp-sting { - &:before { - content: '\E413'; - } -} -.game-icon-web-spit { - &:before { - content: '\E414'; - } -} -.game-icon-werewolf { - &:before { - content: '\E415'; - } -} -.game-icon-wolf-head { - &:before { - content: '\E416'; - } -} -.game-icon-wolf-howl { - &:before { - content: '\E417'; - } -} -.game-icon-wolverine-claws { - &:before { - content: '\E418'; - } -} -.game-icon-worm-mouth { - &:before { - content: '\E419'; - } -} -.game-icon-big-egg { - &:before { - content: '\E41A'; - } -} -.game-icon-claw { - &:before { - content: '\E41B'; - } -} -.game-icon-poison { - &:before { - content: '\E41C'; - } -} -.game-icon-bear-face { - &:before { - content: '\E41D'; - } -} -.game-icon-donkey { - &:before { - content: '\E41E'; - } -} -.game-icon-goat { - &:before { - content: '\E41F'; - } -} -.game-icon-long-legged-spider { - &:before { - content: '\E420'; - } -} -.game-icon-mounted-knight { - &:before { - content: '\E421'; - } -} -.game-icon-pegasus { - &:before { - content: '\E422'; - } -} -.game-icon-pig { - &:before { - content: '\E423'; - } -} -.game-icon-amber-mosquito { - &:before { - content: '\E424'; - } -} -.game-icon-ant { - &:before { - content: '\E425'; - } -} -.game-icon-ants { - &:before { - content: '\E426'; - } -} -.game-icon-beehive { - &:before { - content: '\E427'; - } -} -.game-icon-bug-net { - &:before { - content: '\E428'; - } -} -.game-icon-butterfly-flower { - &:before { - content: '\E429'; - } -} -.game-icon-caterpillar { - &:before { - content: '\E42A'; - } -} -.game-icon-cigale { - &:before { - content: '\E42B'; - } -} -.game-icon-claws { - &:before { - content: '\E42C'; - } -} -.game-icon-fly { - &:before { - content: '\E42D'; - } -} -.game-icon-flying-beetle { - &:before { - content: '\E42E'; - } -} -.game-icon-ladybug { - &:before { - content: '\E42F'; - } -} -.game-icon-shrimp { - &:before { - content: '\E430'; - } -} -.game-icon-spider-eye { - &:before { - content: '\E431'; - } -} -.game-icon-tree-beehive { - &:before { - content: '\E432'; - } -} -.game-icon-apple-maggot { - &:before { - content: '\E433'; - } -} -.game-icon-beetle-shell { - &:before { - content: '\E434'; - } -} -.game-icon-dripping-honey { - &:before { - content: '\E435'; - } -} -.game-icon-long-antennae-bug { - &:before { - content: '\E436'; - } -} -.game-icon-opening-shell { - &:before { - content: '\E437'; - } -} -.game-icon-spotted-bug { - &:before { - content: '\E438'; - } -} -.game-icon-acrobatic { - &:before { - content: '\E439'; - } -} -.game-icon-catch { - &:before { - content: '\E43A'; - } -} -.game-icon-running-ninja { - &:before { - content: '\E43B'; - } -} -.game-icon-button-finger { - &:before { - content: '\E43C'; - } -} -.game-icon-chat-bubble { - &:before { - content: '\E43D'; - } -} -.game-icon-choice { - &:before { - content: '\E43E'; - } -} -.game-icon-convince { - &:before { - content: '\E43F'; - } -} -.game-icon-crafting { - &:before { - content: '\E440'; - } -} -.game-icon-discussion { - &:before { - content: '\E441'; - } -} -.game-icon-drinking { - &:before { - content: '\E442'; - } -} -.game-icon-eating { - &:before { - content: '\E443'; - } -} -.game-icon-flying-fox { - &:before { - content: '\E444'; - } -} -.game-icon-hiking { - &:before { - content: '\E445'; - } -} -.game-icon-hive-mind { - &:before { - content: '\E446'; - } -} -.game-icon-jump-across { - &:before { - content: '\E447'; - } -} -.game-icon-kneeling { - &:before { - content: '\E448'; - } -} -.game-icon-leapfrog { - &:before { - content: '\E449'; - } -} -.game-icon-look-at { - &:before { - content: '\E44A'; - } -} -.game-icon-miner { - &:before { - content: '\E44B'; - } -} -.game-icon-night-sleep { - &:before { - content: '\E44C'; - } -} -.game-icon-public-speaker { - &:before { - content: '\E44D'; - } -} -.game-icon-pull { - &:before { - content: '\E44E'; - } -} -.game-icon-push { - &:before { - content: '\E44F'; - } -} -.game-icon-shaking-hands { - &:before { - content: '\E450'; - } -} -.game-icon-shrug { - &:before { - content: '\E451'; - } -} -.game-icon-skills { - &:before { - content: '\E452'; - } -} -.game-icon-stairs-goal { - &:before { - content: '\E453'; - } -} -.game-icon-teacher { - &:before { - content: '\E454'; - } -} -.game-icon-team-idea { - &:before { - content: '\E455'; - } -} -.game-icon-think { - &:before { - content: '\E456'; - } -} -.game-icon-throwing-ball { - &:before { - content: '\E457'; - } -} -.game-icon-uprising { - &:before { - content: '\E458'; - } -} -.game-icon-vote { - &:before { - content: '\E459'; - } -} -.game-icon-walk { - &:before { - content: '\E45A'; - } -} -.game-icon-boot-kick { - &:before { - content: '\E45B'; - } -} -.game-icon-boot-stomp { - &:before { - content: '\E45C'; - } -} -.game-icon-disintegrate { - &:before { - content: '\E45D'; - } -} -.game-icon-dodging { - &:before { - content: '\E45E'; - } -} -.game-icon-drowning { - &:before { - content: '\E45F'; - } -} -.game-icon-fruiting { - &:before { - content: '\E460'; - } -} -.game-icon-grab { - &:before { - content: '\E461'; - } -} -.game-icon-journey { - &:before { - content: '\E462'; - } -} -.game-icon-juggler { - &:before { - content: '\E463'; - } -} -.game-icon-meditation { - &:before { - content: '\E464'; - } -} -.game-icon-mining { - &:before { - content: '\E465'; - } -} -.game-icon-muscle-up { - &:before { - content: '\E466'; - } -} -.game-icon-pointing { - &:before { - content: '\E467'; - } -} -.game-icon-pouring-chalice { - &:before { - content: '\E468'; - } -} -.game-icon-prayer { - &:before { - content: '\E469'; - } -} -.game-icon-run { - &:before { - content: '\E46A'; - } -} -.game-icon-screaming { - &:before { - content: '\E46B'; - } -} -.game-icon-shouting { - &:before { - content: '\E46C'; - } -} -.game-icon-sing { - &:before { - content: '\E46D'; - } -} -.game-icon-slap { - &:before { - content: '\E46E'; - } -} -.game-icon-snatch { - &:before { - content: '\E46F'; - } -} -.game-icon-sprint { - &:before { - content: '\E470'; - } -} -.game-icon-stick-splitting { - &:before { - content: '\E471'; - } -} -.game-icon-stone-crafting { - &:before { - content: '\E472'; - } -} -.game-icon-swallow { - &:before { - content: '\E473'; - } -} -.game-icon-targeting { - &:before { - content: '\E474'; - } -} -.game-icon-tearing { - &:before { - content: '\E475'; - } -} -.game-icon-teleport { - &:before { - content: '\E476'; - } -} -.game-icon-transfuse { - &:before { - content: '\E477'; - } -} -.game-icon-vomiting { - &:before { - content: '\E478'; - } -} -.game-icon-crush { - &:before { - content: '\E479'; - } -} -.game-icon-amputation { - &:before { - content: '\E47A'; - } -} -.game-icon-read { - &:before { - content: '\E47B'; - } -} -.game-icon-talk { - &:before { - content: '\E47C'; - } -} -.game-icon-africa { - &:before { - content: '\E47D'; - } -} -.game-icon-algeria { - &:before { - content: '\E47E'; - } -} -.game-icon-angola { - &:before { - content: '\E47F'; - } -} -.game-icon-antarctica { - &:before { - content: '\E480'; - } -} -.game-icon-atlas { - &:before { - content: '\E481'; - } -} -.game-icon-australia { - &:before { - content: '\E482'; - } -} -.game-icon-belgium { - &:before { - content: '\E483'; - } -} -.game-icon-binoculars { - &:before { - content: '\E484'; - } -} -.game-icon-black-sea { - &:before { - content: '\E485'; - } -} -.game-icon-bolivia { - &:before { - content: '\E486'; - } -} -.game-icon-brazil { - &:before { - content: '\E487'; - } -} -.game-icon-bulgaria { - &:before { - content: '\E488'; - } -} -.game-icon-cambodia { - &:before { - content: '\E489'; - } -} -.game-icon-colombia { - &:before { - content: '\E48A'; - } -} -.game-icon-corsica { - &:before { - content: '\E48B'; - } -} -.game-icon-crossroad { - &:before { - content: '\E48C'; - } -} -.game-icon-direction-signs { - &:before { - content: '\E48D'; - } -} -.game-icon-earth-africa-europe { - &:before { - content: '\E48E'; - } -} -.game-icon-earth-america { - &:before { - content: '\E48F'; - } -} -.game-icon-earth-asia-oceania { - &:before { - content: '\E490'; - } -} -.game-icon-ecology { - &:before { - content: '\E491'; - } -} -.game-icon-egypt { - &:before { - content: '\E492'; - } -} -.game-icon-france { - &:before { - content: '\E493'; - } -} -.game-icon-guatemala { - &:before { - content: '\E494'; - } -} -.game-icon-hungary { - &:before { - content: '\E495'; - } -} -.game-icon-iceland { - &:before { - content: '\E496'; - } -} -.game-icon-iraq { - &:before { - content: '\E497'; - } -} -.game-icon-italia { - &:before { - content: '\E498'; - } -} -.game-icon-japan { - &:before { - content: '\E499'; - } -} -.game-icon-kenya { - &:before { - content: '\E49A'; - } -} -.game-icon-latvia { - &:before { - content: '\E49B'; - } -} -.game-icon-libya { - &:before { - content: '\E49C'; - } -} -.game-icon-mesh-network { - &:before { - content: '\E49D'; - } -} -.game-icon-mexico { - &:before { - content: '\E49E'; - } -} -.game-icon-moldova { - &:before { - content: '\E49F'; - } -} -.game-icon-mongolia { - &:before { - content: '\E4A0'; - } -} -.game-icon-nigeria { - &:before { - content: '\E4A1'; - } -} -.game-icon-paraguay { - &:before { - content: '\E4A2'; - } -} -.game-icon-path-distance { - &:before { - content: '\E4A3'; - } -} -.game-icon-peru { - &:before { - content: '\E4A4'; - } -} -.game-icon-portugal { - &:before { - content: '\E4A5'; - } -} -.game-icon-position-marker { - &:before { - content: '\E4A6'; - } -} -.game-icon-radar-cross-section { - &:before { - content: '\E4A7'; - } -} -.game-icon-road { - &:before { - content: '\E4A8'; - } -} -.game-icon-sextant { - &:before { - content: '\E4A9'; - } -} -.game-icon-south-africa { - &:before { - content: '\E4AA'; - } -} -.game-icon-south-america { - &:before { - content: '\E4AB'; - } -} -.game-icon-south-korea { - &:before { - content: '\E4AC'; - } -} -.game-icon-spain { - &:before { - content: '\E4AD'; - } -} -.game-icon-sri-lanka { - &:before { - content: '\E4AE'; - } -} -.game-icon-switzerland { - &:before { - content: '\E4AF'; - } -} -.game-icon-tanzania { - &:before { - content: '\E4B0'; - } -} -.game-icon-texas { - &:before { - content: '\E4B1'; - } -} -.game-icon-trail { - &:before { - content: '\E4B2'; - } -} -.game-icon-tunisia { - &:before { - content: '\E4B3'; - } -} -.game-icon-uruguay { - &:before { - content: '\E4B4'; - } -} -.game-icon-venezuela { - &:before { - content: '\E4B5'; - } -} -.game-icon-wireframe-globe { - &:before { - content: '\E4B6'; - } -} -.game-icon-compass { - &:before { - content: '\E4B7'; - } -} -.game-icon-globe { - &:before { - content: '\E4B8'; - } -} -.game-icon-spyglass { - &:before { - content: '\E4B9'; - } -} -.game-icon-treasure-map { - &:before { - content: '\E4BA'; - } -} -.game-icon-wooden-sign { - &:before { - content: '\E4BB'; - } -} -.game-icon-world { - &:before { - content: '\E4BC'; - } -} -.game-icon-digital-trace { - &:before { - content: '\E4BD'; - } -} -.game-icon-orbit { - &:before { - content: '\E4BE'; - } -} -.game-icon-battleship { - &:before { - content: '\E4BF'; - } -} -.game-icon-great-war-tank { - &:before { - content: '\E4C0'; - } -} -.game-icon-occupy { - &:before { - content: '\E4C1'; - } -} -.game-icon-barracks-tent { - &:before { - content: '\E4C2'; - } -} -.game-icon-barracks { - &:before { - content: '\E4C3'; - } -} -.game-icon-caltrops { - &:before { - content: '\E4C4'; - } -} -.game-icon-hammer-sickle { - &:before { - content: '\E4C5'; - } -} -.game-icon-military-fort { - &:before { - content: '\E4C6'; - } -} -.game-icon-union-jack { - &:before { - content: '\E4C7'; - } -} -.game-icon-usa-flag { - &:before { - content: '\E4C8'; - } -} -.game-icon-battle-tank { - &:before { - content: '\E4C9'; - } -} -.game-icon-bombing-run { - &:before { - content: '\E4CA'; - } -} -.game-icon-gas-mask { - &:before { - content: '\E4CB'; - } -} -.game-icon-mushroom-cloud { - &:before { - content: '\E4CC'; - } -} -.game-icon-sunrise { - &:before { - content: '\E4CD'; - } -} -.game-icon-tank { - &:before { - content: '\E4CE'; - } -} -.game-icon-artillery-shell { - &:before { - content: '\E4CF'; - } -} -.game-icon-biplane { - &:before { - content: '\E4D0'; - } -} -.game-icon-bunker { - &:before { - content: '\E4D1'; - } -} -.game-icon-damaged-house { - &:before { - content: '\E4D2'; - } -} -.game-icon-lost-limb { - &:before { - content: '\E4D3'; - } -} -.game-icon-military-ambulance { - &:before { - content: '\E4D4'; - } -} -.game-icon-c96 { - &:before { - content: '\E4D5'; - } -} -.game-icon-carpet-bombing { - &:before { - content: '\E4D6'; - } -} -.game-icon-flatbed-covered { - &:before { - content: '\E4D7'; - } -} -.game-icon-flatbed { - &:before { - content: '\E4D8'; - } -} -.game-icon-mp-40 { - &:before { - content: '\E4D9'; - } -} -.game-icon-tank-tread { - &:before { - content: '\E4DA'; - } -} -.game-icon-thompson-m1 { - &:before { - content: '\E4DB'; - } -} -.game-icon-trench-body-armor { - &:before { - content: '\E4DC'; - } -} -.game-icon-trench-knife { - &:before { - content: '\E4DD'; - } -} -.game-icon-trench-spade { - &:before { - content: '\E4DE'; - } -} -.game-icon-bad-gnome { - &:before { - content: '\E4DF'; - } -} -.game-icon-boar-ensign { - &:before { - content: '\E4E0'; - } -} -.game-icon-carnyx { - &:before { - content: '\E4E1'; - } -} -.game-icon-fomorian { - &:before { - content: '\E4E2'; - } -} -.game-icon-holy-oak { - &:before { - content: '\E4E3'; - } -} -.game-icon-oppidum { - &:before { - content: '\E4E4'; - } -} -.game-icon-torc { - &:before { - content: '\E4E5'; - } -} -.game-icon-tree-face { - &:before { - content: '\E4E6'; - } -} -.game-icon-bagpipes { - &:before { - content: '\E4E7'; - } -} -.game-icon-harp { - &:before { - content: '\E4E8'; - } -} -.game-icon-magic-potion { - &:before { - content: '\E4E9'; - } -} -.game-icon-sickle { - &:before { - content: '\E4EA'; - } -} -.game-icon-heavy-thorny-triskelion { - &:before { - content: '\E4EB'; - } -} -.game-icon-robe { - &:before { - content: '\E4EC'; - } -} -.game-icon-medusa-head { - &:before { - content: '\E4ED'; - } -} -.game-icon-transparent-slime { - &:before { - content: '\E4EE'; - } -} -.game-icon-dragon-head-2 { - &:before { - content: '\E4EF'; - } -} -.game-icon-alien-bug { - &:before { - content: '\E4F0'; - } -} -.game-icon-alien-egg { - &:before { - content: '\E4F1'; - } -} -.game-icon-anubis { - &:before { - content: '\E4F2'; - } -} -.game-icon-bottled-shadow { - &:before { - content: '\E4F3'; - } -} -.game-icon-brain-tentacle { - &:before { - content: '\E4F4'; - } -} -.game-icon-brute { - &:before { - content: '\E4F5'; - } -} -.game-icon-bullet-bill { - &:before { - content: '\E4F6'; - } -} -.game-icon-bully-minion { - &:before { - content: '\E4F7'; - } -} -.game-icon-carnivorous-plant { - &:before { - content: '\E4F8'; - } -} -.game-icon-ceiling-barnacle { - &:before { - content: '\E4F9'; - } -} -.game-icon-centaur { - &:before { - content: '\E4FA'; - } -} -.game-icon-daemon-pull { - &:before { - content: '\E4FB'; - } -} -.game-icon-devil-mask { - &:before { - content: '\E4FC'; - } -} -.game-icon-djinn { - &:before { - content: '\E4FD'; - } -} -.game-icon-drakkar-dragon { - &:before { - content: '\E4FE'; - } -} -.game-icon-egyptian-sphinx { - &:before { - content: '\E4FF'; - } -} -.game-icon-fairy { - &:before { - content: '\E500'; - } -} -.game-icon-floating-ghost { - &:before { - content: '\E501'; - } -} -.game-icon-floating-tentacles { - &:before { - content: '\E502'; - } -} -.game-icon-gargoyle { - &:before { - content: '\E503'; - } -} -.game-icon-giant { - &:before { - content: '\E504'; - } -} -.game-icon-grasping-slug { - &:before { - content: '\E505'; - } -} -.game-icon-greek-sphinx { - &:before { - content: '\E506'; - } -} -.game-icon-half-body-crawling { - &:before { - content: '\E507'; - } -} -.game-icon-horned-reptile { - &:before { - content: '\E508'; - } -} -.game-icon-horus { - &:before { - content: '\E509'; - } -} -.game-icon-ice-golem { - &:before { - content: '\E50A'; - } -} -.game-icon-jawless-cyclop { - &:before { - content: '\E50B'; - } -} -.game-icon-kraken-tentacle { - &:before { - content: '\E50C'; - } -} -.game-icon-mermaid { - &:before { - content: '\E50D'; - } -} -.game-icon-metroid { - &:before { - content: '\E50E'; - } -} -.game-icon-mimic-chest { - &:before { - content: '\E50F'; - } -} -.game-icon-mummy-head { - &:before { - content: '\E510'; - } -} -.game-icon-oni { - &:before { - content: '\E511'; - } -} -.game-icon-pick-of-destiny { - &:before { - content: '\E512'; - } -} -.game-icon-purple-tentacle { - &:before { - content: '\E513'; - } -} -.game-icon-resting-vampire { - &:before { - content: '\E514'; - } -} -.game-icon-rock-golem { - &:before { - content: '\E515'; - } -} -.game-icon-sasquatch { - &:before { - content: '\E516'; - } -} -.game-icon-shambling-mound { - &:before { - content: '\E517'; - } -} -.game-icon-shambling-zombie { - &:before { - content: '\E518'; - } -} -.game-icon-slime { - &:before { - content: '\E519'; - } -} -.game-icon-spiked-dragon-head { - &:before { - content: '\E51A'; - } -} -.game-icon-swallower { - &:before { - content: '\E51B'; - } -} -.game-icon-swamp-bat { - &:before { - content: '\E51C'; - } -} -.game-icon-thwomp { - &:before { - content: '\E51D'; - } -} -.game-icon-troglodyte { - &:before { - content: '\E51E'; - } -} -.game-icon-unicorn { - &:before { - content: '\E51F'; - } -} -.game-icon-beast-eye { - &:before { - content: '\E520'; - } -} -.game-icon-behold { - &:before { - content: '\E521'; - } -} -.game-icon-bestial-fangs { - &:before { - content: '\E522'; - } -} -.game-icon-cracked-alien-skull { - &:before { - content: '\E523'; - } -} -.game-icon-cyclops { - &:before { - content: '\E524'; - } -} -.game-icon-daemon-skull { - &:before { - content: '\E525'; - } -} -.game-icon-dinosaur-bones { - &:before { - content: '\E526'; - } -} -.game-icon-dinosaur-egg { - &:before { - content: '\E527'; - } -} -.game-icon-double-dragon { - &:before { - content: '\E528'; - } -} -.game-icon-dragon-spiral { - &:before { - content: '\E529'; - } -} -.game-icon-ent-mouth { - &:before { - content: '\E52A'; - } -} -.game-icon-evil-book { - &:before { - content: '\E52B'; - } -} -.game-icon-evil-comet { - &:before { - content: '\E52C'; - } -} -.game-icon-evil-fork { - &:before { - content: '\E52D'; - } -} -.game-icon-evil-minion { - &:before { - content: '\E52E'; - } -} -.game-icon-evil-moon { - &:before { - content: '\E52F'; - } -} -.game-icon-evil-tree { - &:before { - content: '\E530'; - } -} -.game-icon-eyestalk { - &:before { - content: '\E531'; - } -} -.game-icon-fairy-2 { - &:before { - content: '\E532'; - } -} -.game-icon-fleshy-mass { - &:before { - content: '\E533'; - } -} -.game-icon-frankenstein-creature { - &:before { - content: '\E534'; - } -} -.game-icon-ghost { - &:before { - content: '\E535'; - } -} -.game-icon-gluttonous-smile { - &:before { - content: '\E536'; - } -} -.game-icon-gooey-daemon { - &:before { - content: '\E537'; - } -} -.game-icon-grim-reaper { - &:before { - content: '\E538'; - } -} -.game-icon-harpy { - &:before { - content: '\E539'; - } -} -.game-icon-haunting { - &:before { - content: '\E53A'; - } -} -.game-icon-horned-skull { - &:before { - content: '\E53B'; - } -} -.game-icon-hydra-shot { - &:before { - content: '\E53C'; - } -} -.game-icon-hydra { - &:before { - content: '\E53D'; - } -} -.game-icon-imp-laugh { - &:before { - content: '\E53E'; - } -} -.game-icon-imp { - &:before { - content: '\E53F'; - } -} -.game-icon-infested-mass { - &:before { - content: '\E540'; - } -} -.game-icon-lizardman { - &:before { - content: '\E541'; - } -} -.game-icon-pretty-fangs { - &:before { - content: '\E542'; - } -} -.game-icon-sea-dragon { - &:before { - content: '\E543'; - } -} -.game-icon-sharp-smile { - &:before { - content: '\E544'; - } -} -.game-icon-spectre { - &:before { - content: '\E545'; - } -} -.game-icon-toad-teeth { - &:before { - content: '\E546'; - } -} -.game-icon-triton-head { - &:before { - content: '\E547'; - } -} -.game-icon-vile-fluid { - &:before { - content: '\E548'; - } -} -.game-icon-witch-flight { - &:before { - content: '\E549'; - } -} -.game-icon-wyvern { - &:before { - content: '\E54A'; - } -} -.game-icon-sea-creature { - &:before { - content: '\E54B'; - } -} -.game-icon-carrier { - &:before { - content: '\E54C'; - } -} -.game-icon-cruiser { - &:before { - content: '\E54D'; - } -} -.game-icon-dreadnought { - &:before { - content: '\E54E'; - } -} -.game-icon-iron-hulled-warship { - &:before { - content: '\E54F'; - } -} -.game-icon-boat-engine { - &:before { - content: '\E550'; - } -} -.game-icon-boat-fishing { - &:before { - content: '\E551'; - } -} -.game-icon-boat-horizon { - &:before { - content: '\E552'; - } -} -.game-icon-boat-propeller { - &:before { - content: '\E553'; - } -} -.game-icon-canoe { - &:before { - content: '\E554'; - } -} -.game-icon-caravel { - &:before { - content: '\E555'; - } -} -.game-icon-cargo-ship { - &:before { - content: '\E556'; - } -} -.game-icon-crow-nest { - &:before { - content: '\E557'; - } -} -.game-icon-drakkar { - &:before { - content: '\E558'; - } -} -.game-icon-figurehead { - &:before { - content: '\E559'; - } -} -.game-icon-fishing-boat { - &:before { - content: '\E55A'; - } -} -.game-icon-galley { - &:before { - content: '\E55B'; - } -} -.game-icon-harbor-dock { - &:before { - content: '\E55C'; - } -} -.game-icon-iceberg { - &:before { - content: '\E55D'; - } -} -.game-icon-life-buoy { - &:before { - content: '\E55E'; - } -} -.game-icon-mini-submarine { - &:before { - content: '\E55F'; - } -} -.game-icon-mooring-bollard { - &:before { - content: '\E560'; - } -} -.game-icon-paddle-steamer { - &:before { - content: '\E561'; - } -} -.game-icon-paddles { - &:before { - content: '\E562'; - } -} -.game-icon-paper-boat { - &:before { - content: '\E563'; - } -} -.game-icon-periscope { - &:before { - content: '\E564'; - } -} -.game-icon-raft { - &:before { - content: '\E565'; - } -} -.game-icon-sail { - &:before { - content: '\E566'; - } -} -.game-icon-sailboat { - &:before { - content: '\E567'; - } -} -.game-icon-ship-bow { - &:before { - content: '\E568'; - } -} -.game-icon-ship-wheel { - &:before { - content: '\E569'; - } -} -.game-icon-ship-wreck { - &:before { - content: '\E56A'; - } -} -.game-icon-sinagot { - &:before { - content: '\E56B'; - } -} -.game-icon-sinking-ship { - &:before { - content: '\E56C'; - } -} -.game-icon-speed-boat { - &:before { - content: '\E56D'; - } -} -.game-icon-submarine { - &:before { - content: '\E56E'; - } -} -.game-icon-trireme { - &:before { - content: '\E56F'; - } -} -.game-icon-wood-canoe { - &:before { - content: '\E570'; - } -} -.game-icon-anchor { - &:before { - content: '\E571'; - } -} -.game-icon-galleon { - &:before { - content: '\E572'; - } -} -.game-icon-shooner-sailboat { - &:before { - content: '\E573'; - } -} -.game-icon-small-fishing-sailboat { - &:before { - content: '\E574'; - } -} -.game-icon-nautilus-shell { - &:before { - content: '\E575'; - } -} -.game-icon-algae { - &:before { - content: '\E576'; - } -} -.game-icon-buoy { - &:before { - content: '\E577'; - } -} -.game-icon-coral { - &:before { - content: '\E578'; - } -} -.game-icon-fishing-pole { - &:before { - content: '\E579'; - } -} -.game-icon-fishing-spoon { - &:before { - content: '\E57A'; - } -} -.game-icon-fishing { - &:before { - content: '\E57B'; - } -} -.game-icon-flood { - &:before { - content: '\E57C'; - } -} -.game-icon-helicoprion { - &:before { - content: '\E57D'; - } -} -.game-icon-high-tide { - &:before { - content: '\E57E'; - } -} -.game-icon-island { - &:before { - content: '\E57F'; - } -} -.game-icon-knot { - &:before { - content: '\E580'; - } -} -.game-icon-life-jacket { - &:before { - content: '\E581'; - } -} -.game-icon-lighthouse { - &:before { - content: '\E582'; - } -} -.game-icon-low-tide { - &:before { - content: '\E583'; - } -} -.game-icon-mussel { - &:before { - content: '\E584'; - } -} -.game-icon-offshore-platform { - &:before { - content: '\E585'; - } -} -.game-icon-oyster { - &:before { - content: '\E586'; - } -} -.game-icon-plesiosaurus { - &:before { - content: '\E587'; - } -} -.game-icon-pulley-hook { - &:before { - content: '\E588'; - } -} -.game-icon-rope-coil { - &:before { - content: '\E589'; - } -} -.game-icon-sand-castle { - &:before { - content: '\E58A'; - } -} -.game-icon-scuba-mask { - &:before { - content: '\E58B'; - } -} -.game-icon-scuba-tanks { - &:before { - content: '\E58C'; - } -} -.game-icon-sea-cliff { - &:before { - content: '\E58D'; - } -} -.game-icon-sea-turtle { - &:before { - content: '\E58E'; - } -} -.game-icon-seagull { - &:before { - content: '\E58F'; - } -} -.game-icon-surf-board { - &:before { - content: '\E590'; - } -} -.game-icon-surfer-van { - &:before { - content: '\E591'; - } -} -.game-icon-swimfins { - &:before { - content: '\E592'; - } -} -.game-icon-tall-bridge { - &:before { - content: '\E593'; - } -} -.game-icon-wave-surfer { - &:before { - content: '\E594'; - } -} -.game-icon-wooden-pier { - &:before { - content: '\E595'; - } -} -.game-icon-at-sea { - &:before { - content: '\E596'; - } -} -.game-icon-big-wave { - &:before { - content: '\E597'; - } -} -.game-icon-cargo-crane { - &:before { - content: '\E598'; - } -} -.game-icon-fishing-hook { - &:before { - content: '\E599'; - } -} -.game-icon-fishing-net { - &:before { - content: '\E59A'; - } -} -.game-icon-water-splash { - &:before { - content: '\E59B'; - } -} -.game-icon-wave-crest { - &:before { - content: '\E59C'; - } -} -.game-icon-waves { - &:before { - content: '\E59D'; - } -} -.game-icon-snorkel { - &:before { - content: '\E59E'; - } -} -.game-icon-ram { - &:before { - content: '\E59F'; - } -} -.game-icon-armadillo { - &:before { - content: '\E5A0'; - } -} -.game-icon-basset-hound-head { - &:before { - content: '\E5A1'; - } -} -.game-icon-bastet { - &:before { - content: '\E5A2'; - } -} -.game-icon-beaver { - &:before { - content: '\E5A3'; - } -} -.game-icon-bison { - &:before { - content: '\E5A4'; - } -} -.game-icon-buffalo-head { - &:before { - content: '\E5A5'; - } -} -.game-icon-camel { - &:before { - content: '\E5A6'; - } -} -.game-icon-cavalry { - &:before { - content: '\E5A7'; - } -} -.game-icon-juggling-seal { - &:before { - content: '\E5A8'; - } -} -.game-icon-jumping-dog { - &:before { - content: '\E5A9'; - } -} -.game-icon-mammoth { - &:before { - content: '\E5AA'; - } -} -.game-icon-mandrill-head { - &:before { - content: '\E5AB'; - } -} -.game-icon-rabbit-head { - &:before { - content: '\E5AC'; - } -} -.game-icon-raccoon-head { - &:before { - content: '\E5AD'; - } -} -.game-icon-ram-profile { - &:before { - content: '\E5AE'; - } -} -.game-icon-saber-toothed-cat-head { - &:before { - content: '\E5AF'; - } -} -.game-icon-sitting-dog { - &:before { - content: '\E5B0'; - } -} -.game-icon-squirrel { - &:before { - content: '\E5B1'; - } -} -.game-icon-walrus-head { - &:before { - content: '\E5B2'; - } -} -.game-icon-direwolf { - &:before { - content: '\E5B3'; - } -} -.game-icon-snout { - &:before { - content: '\E5B4'; - } -} -.game-icon-acoustic-megaphone { - &:before { - content: '\E5B5'; - } -} -.game-icon-alarm-clock { - &:before { - content: '\E5B6'; - } -} -.game-icon-audio-cassette { - &:before { - content: '\E5B7'; - } -} -.game-icon-boombox { - &:before { - content: '\E5B8'; - } -} -.game-icon-compact-disc { - &:before { - content: '\E5B9'; - } -} -.game-icon-djembe { - &:before { - content: '\E5BA'; - } -} -.game-icon-drum { - &:before { - content: '\E5BB'; - } -} -.game-icon-elf-ear { - &:before { - content: '\E5BC'; - } -} -.game-icon-film-spool { - &:before { - content: '\E5BD'; - } -} -.game-icon-flute { - &:before { - content: '\E5BE'; - } -} -.game-icon-gong { - &:before { - content: '\E5BF'; - } -} -.game-icon-guitar-bass-head { - &:before { - content: '\E5C0'; - } -} -.game-icon-guitar-head { - &:before { - content: '\E5C1'; - } -} -.game-icon-headphones { - &:before { - content: '\E5C2'; - } -} -.game-icon-heart-beats { - &:before { - content: '\E5C3'; - } -} -.game-icon-human-ear { - &:before { - content: '\E5C4'; - } -} -.game-icon-jack-plug { - &:before { - content: '\E5C5'; - } -} -.game-icon-maracas { - &:before { - content: '\E5C6'; - } -} -.game-icon-metronome { - &:before { - content: '\E5C7'; - } -} -.game-icon-microphone { - &:before { - content: '\E5C8'; - } -} -.game-icon-musical-keyboard { - &:before { - content: '\E5C9'; - } -} -.game-icon-musical-notes { - &:before { - content: '\E5CA'; - } -} -.game-icon-musical-score { - &:before { - content: '\E5CB'; - } -} -.game-icon-mute { - &:before { - content: '\E5CC'; - } -} -.game-icon-ocarina { - &:before { - content: '\E5CD'; - } -} -.game-icon-old-microphone { - &:before { - content: '\E5CE'; - } -} -.game-icon-pan-flute { - &:before { - content: '\E5CF'; - } -} -.game-icon-phone { - &:before { - content: '\E5D0'; - } -} -.game-icon-piano-keys { - &:before { - content: '\E5D1'; - } -} -.game-icon-pocket-radio { - &:before { - content: '\E5D2'; - } -} -.game-icon-radio-tower { - &:before { - content: '\E5D3'; - } -} -.game-icon-ringing-alarm { - &:before { - content: '\E5D4'; - } -} -.game-icon-saxophone { - &:before { - content: '\E5D5'; - } -} -.game-icon-silenced { - &:before { - content: '\E5D6'; - } -} -.game-icon-sound-off { - &:before { - content: '\E5D7'; - } -} -.game-icon-sound-on { - &:before { - content: '\E5D8'; - } -} -.game-icon-speaker-off { - &:before { - content: '\E5D9'; - } -} -.game-icon-speaker { - &:before { - content: '\E5DA'; - } -} -.game-icon-tambourine { - &:before { - content: '\E5DB'; - } -} -.game-icon-trumpet-flag { - &:before { - content: '\E5DC'; - } -} -.game-icon-trumpet { - &:before { - content: '\E5DD'; - } -} -.game-icon-vuvuzelas { - &:before { - content: '\E5DE'; - } -} -.game-icon-xylophone { - &:before { - content: '\E5DF'; - } -} -.game-icon-amplitude { - &:before { - content: '\E5E0'; - } -} -.game-icon-anthem { - &:before { - content: '\E5E1'; - } -} -.game-icon-bugle-call { - &:before { - content: '\E5E2'; - } -} -.game-icon-carillon { - &:before { - content: '\E5E3'; - } -} -.game-icon-double-quaver { - &:before { - content: '\E5E4'; - } -} -.game-icon-echo-ripples { - &:before { - content: '\E5E5'; - } -} -.game-icon-guitar { - &:before { - content: '\E5E6'; - } -} -.game-icon-hunting-horn { - &:before { - content: '\E5E7'; - } -} -.game-icon-love-howl { - &:before { - content: '\E5E8'; - } -} -.game-icon-love-song { - &:before { - content: '\E5E9'; - } -} -.game-icon-lyre { - &:before { - content: '\E5EA'; - } -} -.game-icon-movement-sensor { - &:before { - content: '\E5EB'; - } -} -.game-icon-music-spell { - &:before { - content: '\E5EC'; - } -} -.game-icon-resonance { - &:before { - content: '\E5ED'; - } -} -.game-icon-ringing-bell { - &:before { - content: '\E5EE'; - } -} -.game-icon-silence { - &:before { - content: '\E5EF'; - } -} -.game-icon-sonic-boom { - &:before { - content: '\E5F0'; - } -} -.game-icon-sonic-shout { - &:before { - content: '\E5F1'; - } -} -.game-icon-tune-pitch { - &:before { - content: '\E5F2'; - } -} -.game-icon-ultrasound { - &:before { - content: '\E5F3'; - } -} -.game-icon-vibrating-ball { - &:before { - content: '\E5F4'; - } -} -.game-icon-zigzag-tune { - &:before { - content: '\E5F5'; - } -} -.game-icon-hearing-disabled { - &:before { - content: '\E5F6'; - } -} -.game-icon-sound-waves { - &:before { - content: '\E5F7'; - } -} -.game-icon-violin { - &:before { - content: '\E5F8'; - } -} -.game-icon-chariot { - &:before { - content: '\E5F9'; - } -} -.game-icon-catapult { - &:before { - content: '\E5FA'; - } -} -.game-icon-amphora { - &:before { - content: '\E5FB'; - } -} -.game-icon-ancient-columns { - &:before { - content: '\E5FC'; - } -} -.game-icon-ancient-ruins { - &:before { - content: '\E5FD'; - } -} -.game-icon-aqueduct { - &:before { - content: '\E5FE'; - } -} -.game-icon-broken-pottery { - &:before { - content: '\E5FF'; - } -} -.game-icon-caesar { - &:before { - content: '\E600'; - } -} -.game-icon-classical-knowledge { - &:before { - content: '\E601'; - } -} -.game-icon-coliseum { - &:before { - content: '\E602'; - } -} -.game-icon-column-vase { - &:before { - content: '\E603'; - } -} -.game-icon-discobolus { - &:before { - content: '\E604'; - } -} -.game-icon-greaves { - &:before { - content: '\E605'; - } -} -.game-icon-greek-temple { - &:before { - content: '\E606'; - } -} -.game-icon-icarus { - &:before { - content: '\E607'; - } -} -.game-icon-ionic-column { - &:before { - content: '\E608'; - } -} -.game-icon-jug { - &:before { - content: '\E609'; - } -} -.game-icon-medieval-pavilion { - &:before { - content: '\E60A'; - } -} -.game-icon-menhir { - &:before { - content: '\E60B'; - } -} -.game-icon-olive { - &:before { - content: '\E60C'; - } -} -.game-icon-palisade { - &:before { - content: '\E60D'; - } -} -.game-icon-roman-toga { - &:before { - content: '\E60E'; - } -} -.game-icon-sandal { - &:before { - content: '\E60F'; - } -} -.game-icon-stone-bust { - &:before { - content: '\E610'; - } -} -.game-icon-stone-path { - &:before { - content: '\E611'; - } -} -.game-icon-water-fountain { - &:before { - content: '\E612'; - } -} -.game-icon-wax-tablet { - &:before { - content: '\E613'; - } -} -.game-icon-capitol { - &:before { - content: '\E614'; - } -} -.game-icon-grapes { - &:before { - content: '\E615'; - } -} -.game-icon-maze { - &:before { - content: '\E616'; - } -} -.game-icon-wingfoot { - &:before { - content: '\E617'; - } -} -.game-icon-ballista { - &:before { - content: '\E618'; - } -} -.game-icon-pauldrons { - &:before { - content: '\E619'; - } -} -.game-icon-pteruges { - &:before { - content: '\E61A'; - } -} -.game-icon-siege-ram { - &:before { - content: '\E61B'; - } -} -.game-icon-air-balloon { - &:before { - content: '\E61C'; - } -} -.game-icon-airplane-arrival { - &:before { - content: '\E61D'; - } -} -.game-icon-airplane-departure { - &:before { - content: '\E61E'; - } -} -.game-icon-ambulance { - &:before { - content: '\E61F'; - } -} -.game-icon-apollo-capsule { - &:before { - content: '\E620'; - } -} -.game-icon-bulldozer { - &:before { - content: '\E621'; - } -} -.game-icon-bus { - &:before { - content: '\E622'; - } -} -.game-icon-car-door { - &:before { - content: '\E623'; - } -} -.game-icon-car-key { - &:before { - content: '\E624'; - } -} -.game-icon-car-seat { - &:before { - content: '\E625'; - } -} -.game-icon-car-wheel { - &:before { - content: '\E626'; - } -} -.game-icon-caravan { - &:before { - content: '\E627'; - } -} -.game-icon-city-car { - &:before { - content: '\E628'; - } -} -.game-icon-coal-wagon { - &:before { - content: '\E629'; - } -} -.game-icon-commercial-airplane { - &:before { - content: '\E62A'; - } -} -.game-icon-cycling { - &:before { - content: '\E62B'; - } -} -.game-icon-delivery-drone { - &:before { - content: '\E62C'; - } -} -.game-icon-dutch-bike { - &:before { - content: '\E62D'; - } -} -.game-icon-farm-tractor { - &:before { - content: '\E62E'; - } -} -.game-icon-flat-tire { - &:before { - content: '\E62F'; - } -} -.game-icon-food-truck { - &:before { - content: '\E630'; - } -} -.game-icon-forklift { - &:before { - content: '\E631'; - } -} -.game-icon-gas-pump { - &:before { - content: '\E632'; - } -} -.game-icon-gear-stick { - &:before { - content: '\E633'; - } -} -.game-icon-hang-glider { - &:before { - content: '\E634'; - } -} -.game-icon-helicopter-tail { - &:before { - content: '\E635'; - } -} -.game-icon-helicopter { - &:before { - content: '\E636'; - } -} -.game-icon-home-garage { - &:before { - content: '\E637'; - } -} -.game-icon-interceptor-ship { - &:before { - content: '\E638'; - } -} -.game-icon-jeep { - &:before { - content: '\E639'; - } -} -.game-icon-jet-fighter { - &:before { - content: '\E63A'; - } -} -.game-icon-kick-scooter { - &:before { - content: '\E63B'; - } -} -.game-icon-level-crossing { - &:before { - content: '\E63C'; - } -} -.game-icon-lunar-module { - &:before { - content: '\E63D'; - } -} -.game-icon-mars-curiosity { - &:before { - content: '\E63E'; - } -} -.game-icon-mars-pathfinder { - &:before { - content: '\E63F'; - } -} -.game-icon-mechanic-garage { - &:before { - content: '\E640'; - } -} -.game-icon-mine-truck { - &:before { - content: '\E641'; - } -} -.game-icon-mine-wagon { - &:before { - content: '\E642'; - } -} -.game-icon-old-wagon { - &:before { - content: '\E643'; - } -} -.game-icon-plane-wing { - &:before { - content: '\E644'; - } -} -.game-icon-rail-road { - &:before { - content: '\E645'; - } -} -.game-icon-railway { - &:before { - content: '\E646'; - } -} -.game-icon-rocket-thruster { - &:before { - content: '\E647'; - } -} -.game-icon-ropeway { - &:before { - content: '\E648'; - } -} -.game-icon-scooter { - &:before { - content: '\E649'; - } -} -.game-icon-scout-ship { - &:before { - content: '\E64A'; - } -} -.game-icon-siege-tower { - &:before { - content: '\E64B'; - } -} -.game-icon-skateboard { - &:before { - content: '\E64C'; - } -} -.game-icon-space-shuttle { - &:before { - content: '\E64D'; - } -} -.game-icon-spaceship { - &:before { - content: '\E64E'; - } -} -.game-icon-speedometer { - &:before { - content: '\E64F'; - } -} -.game-icon-starfighter { - &:before { - content: '\E650'; - } -} -.game-icon-stealth-bomber { - &:before { - content: '\E651'; - } -} -.game-icon-steam-locomotive { - &:before { - content: '\E652'; - } -} -.game-icon-steering-wheel { - &:before { - content: '\E653'; - } -} -.game-icon-subway { - &:before { - content: '\E654'; - } -} -.game-icon-tire-iron-cross { - &:before { - content: '\E655'; - } -} -.game-icon-tire-iron { - &:before { - content: '\E656'; - } -} -.game-icon-tracked-robot { - &:before { - content: '\E657'; - } -} -.game-icon-traffic-lights-green { - &:before { - content: '\E658'; - } -} -.game-icon-traffic-lights-orange { - &:before { - content: '\E659'; - } -} -.game-icon-traffic-lights-ready-to-go { - &:before { - content: '\E65A'; - } -} -.game-icon-trebuchet { - &:before { - content: '\E65B'; - } -} -.game-icon-truck { - &:before { - content: '\E65C'; - } -} -.game-icon-turbine { - &:before { - content: '\E65D'; - } -} -.game-icon-ufo { - &:before { - content: '\E65E'; - } -} -.game-icon-unicycle { - &:before { - content: '\E65F'; - } -} -.game-icon-velocipede { - &:before { - content: '\E660'; - } -} -.game-icon-walking-scout { - &:before { - content: '\E661'; - } -} -.game-icon-bomber { - &:before { - content: '\E662'; - } -} -.game-icon-heavy-fighter { - &:before { - content: '\E663'; - } -} -.game-icon-light-fighter { - &:before { - content: '\E664'; - } -} -.game-icon-afterburn { - &:before { - content: '\E665'; - } -} -.game-icon-cartwheel { - &:before { - content: '\E666'; - } -} -.game-icon-forward-field { - &:before { - content: '\E667'; - } -} -.game-icon-jetpack { - &:before { - content: '\E668'; - } -} -.game-icon-missile-mech { - &:before { - content: '\E669'; - } -} -.game-icon-rocket-flight { - &:before { - content: '\E66A'; - } -} -.game-icon-rocket { - &:before { - content: '\E66B'; - } -} -.game-icon-strafe { - &:before { - content: '\E66C'; - } -} -.game-icon-jet-pack { - &:before { - content: '\E66D'; - } -} -.game-icon-airplane { - &:before { - content: '\E66E'; - } -} -.game-icon-apc { - &:before { - content: '\E66F'; - } -} -.game-icon-f1-car { - &:before { - content: '\E670'; - } -} -.game-icon-glider { - &:before { - content: '\E671'; - } -} -.game-icon-hang-glider-2 { - &:before { - content: '\E672'; - } -} -.game-icon-jeep-2 { - &:before { - content: '\E673'; - } -} -.game-icon-race-car { - &:before { - content: '\E674'; - } -} -.game-icon-zeppelin { - &:before { - content: '\E675'; - } -} -.game-icon-dread { - &:before { - content: '\E676'; - } -} -.game-icon-distraction { - &:before { - content: '\E677'; - } -} -.game-icon-angry-eyes { - &:before { - content: '\E678'; - } -} -.game-icon-confrontation { - &:before { - content: '\E679'; - } -} -.game-icon-dead-head { - &:before { - content: '\E67A'; - } -} -.game-icon-enrage { - &:before { - content: '\E67B'; - } -} -.game-icon-idea { - &:before { - content: '\E67C'; - } -} -.game-icon-liar { - &:before { - content: '\E67D'; - } -} -.game-icon-wisdom { - &:before { - content: '\E67E'; - } -} -.game-icon-artificial-intelligence { - &:before { - content: '\E67F'; - } -} -.game-icon-awareness { - &:before { - content: '\E680'; - } -} -.game-icon-back-pain { - &:before { - content: '\E681'; - } -} -.game-icon-brain-freeze { - &:before { - content: '\E682'; - } -} -.game-icon-chained-heart { - &:before { - content: '\E683'; - } -} -.game-icon-coma { - &:before { - content: '\E684'; - } -} -.game-icon-delighted { - &:before { - content: '\E685'; - } -} -.game-icon-despair { - &:before { - content: '\E686'; - } -} -.game-icon-distraction-2 { - &:before { - content: '\E687'; - } -} -.game-icon-drama-masks { - &:before { - content: '\E688'; - } -} -.game-icon-extra-lucid { - &:before { - content: '\E689'; - } -} -.game-icon-gluttony { - &:before { - content: '\E68A'; - } -} -.game-icon-hidden { - &:before { - content: '\E68B'; - } -} -.game-icon-imprisoned { - &:before { - content: '\E68C'; - } -} -.game-icon-mirror-mirror { - &:before { - content: '\E68D'; - } -} -.game-icon-mouth-watering { - &:before { - content: '\E68E'; - } -} -.game-icon-nothing-to-say { - &:before { - content: '\E68F'; - } -} -.game-icon-oppression { - &:before { - content: '\E690'; - } -} -.game-icon-paranoia { - &:before { - content: '\E691'; - } -} -.game-icon-sensuousness { - &:before { - content: '\E692'; - } -} -.game-icon-sleepy { - &:before { - content: '\E693'; - } -} -.game-icon-sly { - &:before { - content: '\E694'; - } -} -.game-icon-smitten { - &:before { - content: '\E695'; - } -} -.game-icon-stoned-skull { - &:before { - content: '\E696'; - } -} -.game-icon-strong { - &:before { - content: '\E697'; - } -} -.game-icon-surprised-skull { - &:before { - content: '\E698'; - } -} -.game-icon-surprised { - &:before { - content: '\E699'; - } -} -.game-icon-suspicious { - &:before { - content: '\E69A'; - } -} -.game-icon-temptation { - &:before { - content: '\E69B'; - } -} -.game-icon-terror { - &:before { - content: '\E69C'; - } -} -.game-icon-worried-eyes { - &:before { - content: '\E69D'; - } -} -.game-icon-cement-shoes { - &:before { - content: '\E69E'; - } -} -.game-icon-knockout { - &:before { - content: '\E69F'; - } -} -.game-icon-smoke-bomb { - &:before { - content: '\E6A0'; - } -} -.game-icon-barbecue { - &:before { - content: '\E6A1'; - } -} -.game-icon-chimney { - &:before { - content: '\E6A2'; - } -} -.game-icon-cigar { - &:before { - content: '\E6A3'; - } -} -.game-icon-cigarette { - &:before { - content: '\E6A4'; - } -} -.game-icon-nuclear-plant { - &:before { - content: '\E6A5'; - } -} -.game-icon-smoking-pipe { - &:before { - content: '\E6A6'; - } -} -.game-icon-smoking-volcano { - &:before { - content: '\E6A7'; - } -} -.game-icon-steam-blast { - &:before { - content: '\E6A8'; - } -} -.game-icon-steam { - &:before { - content: '\E6A9'; - } -} -.game-icon-aerosol { - &:before { - content: '\E6AA'; - } -} -.game-icon-bottle-vapors { - &:before { - content: '\E6AB'; - } -} -.game-icon-bubbling-bowl { - &:before { - content: '\E6AC'; - } -} -.game-icon-cloudy-fork { - &:before { - content: '\E6AD'; - } -} -.game-icon-fizzing-flask { - &:before { - content: '\E6AE'; - } -} -.game-icon-fluffy-swirl { - &:before { - content: '\E6AF'; - } -} -.game-icon-fragrance { - &:before { - content: '\E6B0'; - } -} -.game-icon-incense { - &:before { - content: '\E6B1'; - } -} -.game-icon-poison-gas { - &:before { - content: '\E6B2'; - } -} -.game-icon-smoking-finger { - &:before { - content: '\E6B3'; - } -} -.game-icon-smoking-orb { - &:before { - content: '\E6B4'; - } -} -.game-icon-poison-cloud { - &:before { - content: '\E6B5'; - } -} -.game-icon-bird-cage { - &:before { - content: '\E6B6'; - } -} -.game-icon-bird-house { - &:before { - content: '\E6B7'; - } -} -.game-icon-chicken-oven { - &:before { - content: '\E6B8'; - } -} -.game-icon-cuauhtli { - &:before { - content: '\E6B9'; - } -} -.game-icon-duck-palm { - &:before { - content: '\E6BA'; - } -} -.game-icon-eating-pelican { - &:before { - content: '\E6BB'; - } -} -.game-icon-egyptian-bird { - &:before { - content: '\E6BC'; - } -} -.game-icon-fried-eggs { - &:before { - content: '\E6BD'; - } -} -.game-icon-goose { - &:before { - content: '\E6BE'; - } -} -.game-icon-hummingbird { - &:before { - content: '\E6BF'; - } -} -.game-icon-ibis { - &:before { - content: '\E6C0'; - } -} -.game-icon-incubator { - &:before { - content: '\E6C1'; - } -} -.game-icon-kiwi-bird { - &:before { - content: '\E6C2'; - } -} -.game-icon-nest-birds { - &:before { - content: '\E6C3'; - } -} -.game-icon-nest-eggs { - &:before { - content: '\E6C4'; - } -} -.game-icon-new-born { - &:before { - content: '\E6C5'; - } -} -.game-icon-ostrich { - &:before { - content: '\E6C6'; - } -} -.game-icon-plastic-duck { - &:before { - content: '\E6C7'; - } -} -.game-icon-shoebill-stork { - &:before { - content: '\E6C8'; - } -} -.game-icon-stork-delivery { - &:before { - content: '\E6C9'; - } -} -.game-icon-swallow-2 { - &:before { - content: '\E6CA'; - } -} -.game-icon-bird-claw { - &:before { - content: '\E6CB'; - } -} -.game-icon-bird-limb { - &:before { - content: '\E6CC'; - } -} -.game-icon-bird-mask { - &:before { - content: '\E6CD'; - } -} -.game-icon-dove { - &:before { - content: '\E6CE'; - } -} -.game-icon-egg-clutch { - &:before { - content: '\E6CF'; - } -} -.game-icon-falling-ovoid { - &:before { - content: '\E6D0'; - } -} -.game-icon-feather { - &:before { - content: '\E6D1'; - } -} -.game-icon-feathered-wing { - &:before { - content: '\E6D2'; - } -} -.game-icon-scarecrow { - &:before { - content: '\E6D3'; - } -} -.game-icon-sparrow { - &:before { - content: '\E6D4'; - } -} -.game-icon-two-feathers { - &:before { - content: '\E6D5'; - } -} -.game-icon-winged-leg { - &:before { - content: '\E6D6'; - } -} -.game-icon-fish-cooked { - &:before { - content: '\E6D7'; - } -} -.game-icon-fried-fish { - &:before { - content: '\E6D8'; - } -} -.game-icon-aquarium { - &:before { - content: '\E6D9'; - } -} -.game-icon-canned-fish { - &:before { - content: '\E6DA'; - } -} -.game-icon-circling-fish { - &:before { - content: '\E6DB'; - } -} -.game-icon-double-fish { - &:before { - content: '\E6DC'; - } -} -.game-icon-eel { - &:before { - content: '\E6DD'; - } -} -.game-icon-fish-bucket { - &:before { - content: '\E6DE'; - } -} -.game-icon-fish-eggs { - &:before { - content: '\E6DF'; - } -} -.game-icon-fish-escape { - &:before { - content: '\E6E0'; - } -} -.game-icon-fish-scales { - &:before { - content: '\E6E1'; - } -} -.game-icon-fishing-jig { - &:before { - content: '\E6E2'; - } -} -.game-icon-fishing-lure { - &:before { - content: '\E6E3'; - } -} -.game-icon-flatfish { - &:before { - content: '\E6E4'; - } -} -.game-icon-lucky-fisherman { - &:before { - content: '\E6E5'; - } -} -.game-icon-piranha { - &:before { - content: '\E6E6'; - } -} -.game-icon-school-of-fish { - &:before { - content: '\E6E7'; - } -} -.game-icon-sushis { - &:before { - content: '\E6E8'; - } -} -.game-icon-tadpole { - &:before { - content: '\E6E9'; - } -} -.game-icon-tropical-fish { - &:before { - content: '\E6EA'; - } -} -.game-icon-salmon { - &:before { - content: '\E6EB'; - } -} -.game-icon-fairy-wings { - &:before { - content: '\E6EC'; - } -} -.game-icon-flying-target { - &:before { - content: '\E6ED'; - } -} -.game-icon-hand-wing { - &:before { - content: '\E6EE'; - } -} -.game-icon-heart-wings { - &:before { - content: '\E6EF'; - } -} -.game-icon-pterodactylus { - &:before { - content: '\E6F0'; - } -} -.game-icon-spiky-wing { - &:before { - content: '\E6F1'; - } -} -.game-icon-angel-outfit { - &:before { - content: '\E6F2'; - } -} -.game-icon-angel-wings { - &:before { - content: '\E6F3'; - } -} -.game-icon-bat-blade { - &:before { - content: '\E6F4'; - } -} -.game-icon-curly-wing { - &:before { - content: '\E6F5'; - } -} -.game-icon-fluffy-wing { - &:before { - content: '\E6F6'; - } -} -.game-icon-holy-grail { - &:before { - content: '\E6F7'; - } -} -.game-icon-quill { - &:before { - content: '\E6F8'; - } -} -.game-icon-wing-cloak { - &:before { - content: '\E6F9'; - } -} -.game-icon-winged-emblem { - &:before { - content: '\E6FA'; - } -} -.game-icon-evil-wings { - &:before { - content: '\E6FB'; - } -} -.game-icon-tumulus { - &:before { - content: '\E6FC'; - } -} -.game-icon-death-juice { - &:before { - content: '\E6FD'; - } -} -.game-icon-egyptian-urns { - &:before { - content: '\E6FE'; - } -} -.game-icon-grave-flowers { - &:before { - content: '\E6FF'; - } -} -.game-icon-graveyard { - &:before { - content: '\E700'; - } -} -.game-icon-half-dead { - &:before { - content: '\E701'; - } -} -.game-icon-morgue-feet { - &:before { - content: '\E702'; - } -} -.game-icon-sarcophagus { - &:before { - content: '\E703'; - } -} -.game-icon-skeletal-hand { - &:before { - content: '\E704'; - } -} -.game-icon-slipknot { - &:before { - content: '\E705'; - } -} -.game-icon-carrion { - &:before { - content: '\E706'; - } -} -.game-icon-coffin { - &:before { - content: '\E707'; - } -} -.game-icon-dead-eye { - &:before { - content: '\E708'; - } -} -.game-icon-dead-wood { - &:before { - content: '\E709'; - } -} -.game-icon-death-zone { - &:before { - content: '\E70A'; - } -} -.game-icon-decapitation { - &:before { - content: '\E70B'; - } -} -.game-icon-gibbet { - &:before { - content: '\E70C'; - } -} -.game-icon-guillotine { - &:before { - content: '\E70D'; - } -} -.game-icon-internal-injury { - &:before { - content: '\E70E'; - } -} -.game-icon-life-in-the-balance { - &:before { - content: '\E70F'; - } -} -.game-icon-pirate-grave { - &:before { - content: '\E710'; - } -} -.game-icon-reaper-scythe { - &:before { - content: '\E711'; - } -} -.game-icon-tombstone { - &:before { - content: '\E712'; - } -} -.game-icon-suicide { - &:before { - content: '\E713'; - } -} -.game-icon-telefrag { - &:before { - content: '\E714'; - } -} -.game-icon-tombstone-2 { - &:before { - content: '\E715'; - } -} -.game-icon-hasty-grave { - &:before { - content: '\E716'; - } -} -.game-icon-raise-zombie { - &:before { - content: '\E717'; - } -} -.game-icon-bad-breath { - &:before { - content: '\E718'; - } -} -.game-icon-chainsaw { - &:before { - content: '\E719'; - } -} -.game-icon-jerrycan { - &:before { - content: '\E71A'; - } -} -.game-icon-brain { - &:before { - content: '\E71B'; - } -} -.game-icon-dark-squad { - &:before { - content: '\E71C'; - } -} -.game-icon-evil-hand { - &:before { - content: '\E71D'; - } -} -.game-icon-ragged-wound { - &:before { - content: '\E71E'; - } -} -.game-icon-asian-lantern { - &:before { - content: '\E71F'; - } -} -.game-icon-bed-lamp { - &:before { - content: '\E720'; - } -} -.game-icon-ceiling-light { - &:before { - content: '\E721'; - } -} -.game-icon-double-street-lights { - &:before { - content: '\E722'; - } -} -.game-icon-dungeon-gate { - &:before { - content: '\E723'; - } -} -.game-icon-dungeon-light { - &:before { - content: '\E724'; - } -} -.game-icon-flexible-lamp { - &:before { - content: '\E725'; - } -} -.game-icon-fog-light { - &:before { - content: '\E726'; - } -} -.game-icon-inspiration { - &:before { - content: '\E727'; - } -} -.game-icon-led { - &:before { - content: '\E728'; - } -} -.game-icon-light-projector { - &:before { - content: '\E729'; - } -} -.game-icon-old-lantern { - &:before { - content: '\E72A'; - } -} -.game-icon-prism { - &:before { - content: '\E72B'; - } -} -.game-icon-smart { - &:before { - content: '\E72C'; - } -} -.game-icon-street-light { - &:before { - content: '\E72D'; - } -} -.game-icon-wall-light { - &:before { - content: '\E72E'; - } -} -.game-icon-candle-skull { - &:before { - content: '\E72F'; - } -} -.game-icon-desk-lamp { - &:before { - content: '\E730'; - } -} -.game-icon-double-face-mask { - &:before { - content: '\E731'; - } -} -.game-icon-duality { - &:before { - content: '\E732'; - } -} -.game-icon-eclipse { - &:before { - content: '\E733'; - } -} -.game-icon-expanded-rays { - &:before { - content: '\E734'; - } -} -.game-icon-explosion-rays { - &:before { - content: '\E735'; - } -} -.game-icon-explosive-materials { - &:before { - content: '\E736'; - } -} -.game-icon-gooey-eyed-sun { - &:before { - content: '\E737'; - } -} -.game-icon-interstellar-path { - &:before { - content: '\E738'; - } -} -.game-icon-lantern { - &:before { - content: '\E739'; - } -} -.game-icon-laser-precision { - &:before { - content: '\E73A'; - } -} -.game-icon-laser-sparks { - &:before { - content: '\E73B'; - } -} -.game-icon-laserburn { - &:before { - content: '\E73C'; - } -} -.game-icon-light-bulb { - &:before { - content: '\E73D'; - } -} -.game-icon-magic-lamp { - &:before { - content: '\E73E'; - } -} -.game-icon-paper-lantern { - &:before { - content: '\E73F'; - } -} -.game-icon-radar-sweep { - &:before { - content: '\E740'; - } -} -.game-icon-shiny-entrance { - &:before { - content: '\E741'; - } -} -.game-icon-sun { - &:before { - content: '\E742'; - } -} -.game-icon-sunbeams { - &:before { - content: '\E743'; - } -} -.game-icon-sundial { - &:before { - content: '\E744'; - } -} -.game-icon-two-shadows { - &:before { - content: '\E745'; - } -} -.game-icon-unlit-candelabra { - &:before { - content: '\E746'; - } -} -.game-icon-laser-burst { - &:before { - content: '\E747'; - } -} -.game-icon-camping-tent { - &:before { - content: '\E748'; - } -} -.game-icon-cave-entrance { - &:before { - content: '\E749'; - } -} -.game-icon-circle-forest { - &:before { - content: '\E74A'; - } -} -.game-icon-desert { - &:before { - content: '\E74B'; - } -} -.game-icon-forest-camp { - &:before { - content: '\E74C'; - } -} -.game-icon-forest { - &:before { - content: '\E74D'; - } -} -.game-icon-fuji { - &:before { - content: '\E74E'; - } -} -.game-icon-grass { - &:before { - content: '\E74F'; - } -} -.game-icon-high-grass { - &:before { - content: '\E750'; - } -} -.game-icon-hills { - &:before { - content: '\E751'; - } -} -.game-icon-jungle { - &:before { - content: '\E752'; - } -} -.game-icon-monument-valley { - &:before { - content: '\E753'; - } -} -.game-icon-mountain-cave { - &:before { - content: '\E754'; - } -} -.game-icon-mountain-road { - &:before { - content: '\E755'; - } -} -.game-icon-oasis { - &:before { - content: '\E756'; - } -} -.game-icon-park-bench { - &:before { - content: '\E757'; - } -} -.game-icon-path-tile { - &:before { - content: '\E758'; - } -} -.game-icon-river { - &:before { - content: '\E759'; - } -} -.game-icon-stone-stack { - &:before { - content: '\E75A'; - } -} -.game-icon-summits { - &:before { - content: '\E75B'; - } -} -.game-icon-sunrise-2 { - &:before { - content: '\E75C'; - } -} -.game-icon-sunset { - &:before { - content: '\E75D'; - } -} -.game-icon-swamp { - &:before { - content: '\E75E'; - } -} -.game-icon-uluru { - &:before { - content: '\E75F'; - } -} -.game-icon-underground-cave { - &:before { - content: '\E760'; - } -} -.game-icon-waterfall { - &:before { - content: '\E761'; - } -} -.game-icon-earth-crack { - &:before { - content: '\E762'; - } -} -.game-icon-field { - &:before { - content: '\E763'; - } -} -.game-icon-flowers { - &:before { - content: '\E764'; - } -} -.game-icon-mountains { - &:before { - content: '\E765'; - } -} -.game-icon-mountaintop { - &:before { - content: '\E766'; - } -} -.game-icon-peaks { - &:before { - content: '\E767'; - } -} -.game-icon-pine-tree { - &:before { - content: '\E768'; - } -} -.game-icon-quicksand { - &:before { - content: '\E769'; - } -} -.game-icon-stalagtite { - &:before { - content: '\E76A'; - } -} -.game-icon-three-leaves { - &:before { - content: '\E76B'; - } -} -.game-icon-valley { - &:before { - content: '\E76C'; - } -} -.game-icon-wind-hole { - &:before { - content: '\E76D'; - } -} -.game-icon-axe-in-log { - &:before { - content: '\E76E'; - } -} -.game-icon-bamboo-fountain { - &:before { - content: '\E76F'; - } -} -.game-icon-barrel { - &:before { - content: '\E770'; - } -} -.game-icon-berry-bush { - &:before { - content: '\E771'; - } -} -.game-icon-bonsai-tree { - &:before { - content: '\E772'; - } -} -.game-icon-chestnut-leaf { - &:before { - content: '\E773'; - } -} -.game-icon-chisel { - &:before { - content: '\E774'; - } -} -.game-icon-crosscut-saw { - &:before { - content: '\E775'; - } -} -.game-icon-crucifix { - &:before { - content: '\E776'; - } -} -.game-icon-deku-tree { - &:before { - content: '\E777'; - } -} -.game-icon-dough-roller { - &:before { - content: '\E778'; - } -} -.game-icon-empty-wood-bucket-handle { - &:before { - content: '\E779'; - } -} -.game-icon-empty-wood-bucket { - &:before { - content: '\E77A'; - } -} -.game-icon-forest-entrance { - &:before { - content: '\E77B'; - } -} -.game-icon-fruit-tree { - &:before { - content: '\E77C'; - } -} -.game-icon-full-wood-bucket-handle { - &:before { - content: '\E77D'; - } -} -.game-icon-full-wood-bucket { - &:before { - content: '\E77E'; - } -} -.game-icon-greenhouse { - &:before { - content: '\E77F'; - } -} -.game-icon-half-log { - &:before { - content: '\E780'; - } -} -.game-icon-hand-saw { - &:before { - content: '\E781'; - } -} -.game-icon-hanging-sign { - &:before { - content: '\E782'; - } -} -.game-icon-log { - &:before { - content: '\E783'; - } -} -.game-icon-oak-leaf { - &:before { - content: '\E784'; - } -} -.game-icon-packed-planks { - &:before { - content: '\E785'; - } -} -.game-icon-palm-tree { - &:before { - content: '\E786'; - } -} -.game-icon-planks { - &:before { - content: '\E787'; - } -} -.game-icon-solid-leaf { - &:before { - content: '\E788'; - } -} -.game-icon-spiked-trunk { - &:before { - content: '\E789'; - } -} -.game-icon-stakes-fence { - &:before { - content: '\E78A'; - } -} -.game-icon-stick-frame { - &:before { - content: '\E78B'; - } -} -.game-icon-stump-regrowth { - &:before { - content: '\E78C'; - } -} -.game-icon-table { - &:before { - content: '\E78D'; - } -} -.game-icon-totem { - &:before { - content: '\E78E'; - } -} -.game-icon-tree-door { - &:before { - content: '\E78F'; - } -} -.game-icon-tree-roots { - &:before { - content: '\E790'; - } -} -.game-icon-tree-swing { - &:before { - content: '\E791'; - } -} -.game-icon-trunk-mushroom { - &:before { - content: '\E792'; - } -} -.game-icon-watchtower { - &:before { - content: '\E793'; - } -} -.game-icon-water-diviner-stick { - &:before { - content: '\E794'; - } -} -.game-icon-wood-beam { - &:before { - content: '\E795'; - } -} -.game-icon-wood-cabin { - &:before { - content: '\E796'; - } -} -.game-icon-wood-frame { - &:before { - content: '\E797'; - } -} -.game-icon-wood-pile { - &:before { - content: '\E798'; - } -} -.game-icon-wood-stick { - &:before { - content: '\E799'; - } -} -.game-icon-wooden-clogs { - &:before { - content: '\E79A'; - } -} -.game-icon-wooden-crate { - &:before { - content: '\E79B'; - } -} -.game-icon-wooden-pegleg { - &:before { - content: '\E79C'; - } -} -.game-icon-acorn { - &:before { - content: '\E79D'; - } -} -.game-icon-beech { - &:before { - content: '\E79E'; - } -} -.game-icon-circular-sawblade { - &:before { - content: '\E79F'; - } -} -.game-icon-curled-leaf { - &:before { - content: '\E7A0'; - } -} -.game-icon-falling-leaf { - &:before { - content: '\E7A1'; - } -} -.game-icon-leaf-swirl { - &:before { - content: '\E7A2'; - } -} -.game-icon-linden-leaf { - &:before { - content: '\E7A3'; - } -} -.game-icon-maple-leaf { - &:before { - content: '\E7A4'; - } -} -.game-icon-oak { - &:before { - content: '\E7A5'; - } -} -.game-icon-root-tip { - &:before { - content: '\E7A6'; - } -} -.game-icon-totem-mask { - &:before { - content: '\E7A7'; - } -} -.game-icon-tree-branch { - &:before { - content: '\E7A8'; - } -} -.game-icon-tribal-mask { - &:before { - content: '\E7A9'; - } -} -.game-icon-vine-leaf { - &:before { - content: '\E7AA'; - } -} -.game-icon-wood-axe { - &:before { - content: '\E7AB'; - } -} -.game-icon-wooden-door { - &:before { - content: '\E7AC'; - } -} -.game-icon-wooden-fence { - &:before { - content: '\E7AD'; - } -} -.game-icon-zigzag-leaf { - &:before { - content: '\E7AE'; - } -} -.game-icon-circular-saw { - &:before { - content: '\E7AF'; - } -} -.game-icon-logging { - &:before { - content: '\E7B0'; - } -} -.game-icon-candlestick-phone { - &:before { - content: '\E7B1'; - } -} -.game-icon-coal-pile { - &:before { - content: '\E7B2'; - } -} -.game-icon-corset { - &:before { - content: '\E7B3'; - } -} -.game-icon-lorgnette { - &:before { - content: '\E7B4'; - } -} -.game-icon-pipes { - &:before { - content: '\E7B5'; - } -} -.game-icon-steampunk-goggles { - &:before { - content: '\E7B6'; - } -} -.game-icon-tower-bridge { - &:before { - content: '\E7B7'; - } -} -.game-icon-clockwork { - &:before { - content: '\E7B8'; - } -} -.game-icon-cog { - &:before { - content: '\E7B9'; - } -} -.game-icon-cogsplosion { - &:before { - content: '\E7BA'; - } -} -.game-icon-gears { - &:before { - content: '\E7BB'; - } -} -.game-icon-pokecog { - &:before { - content: '\E7BC'; - } -} -.game-icon-spectacles { - &:before { - content: '\E7BD'; - } -} -.game-icon-teapot { - &:before { - content: '\E7BE'; - } -} -.game-icon-umbrella { - &:before { - content: '\E7BF'; - } -} -.game-icon-pocket-watch { - &:before { - content: '\E7C0'; - } -} -.game-icon-old-king { - &:before { - content: '\E7C1'; - } -} -.game-icon-ninja-head { - &:before { - content: '\E7C2'; - } -} -.game-icon-air-man { - &:before { - content: '\E7C3'; - } -} -.game-icon-baby-face { - &:before { - content: '\E7C4'; - } -} -.game-icon-blindfold { - &:before { - content: '\E7C5'; - } -} -.game-icon-brain-leak { - &:before { - content: '\E7C6'; - } -} -.game-icon-cleopatra { - &:before { - content: '\E7C7'; - } -} -.game-icon-clown { - &:before { - content: '\E7C8'; - } -} -.game-icon-egyptian-profile { - &:before { - content: '\E7C9'; - } -} -.game-icon-eyepatch { - &:before { - content: '\E7CA'; - } -} -.game-icon-headband-knot { - &:before { - content: '\E7CB'; - } -} -.game-icon-invisible-face { - &:before { - content: '\E7CC'; - } -} -.game-icon-mecha-head { - &:before { - content: '\E7CD'; - } -} -.game-icon-mecha-mask { - &:before { - content: '\E7CE'; - } -} -.game-icon-metal-golem-head { - &:before { - content: '\E7CF'; - } -} -.game-icon-nose-front { - &:before { - content: '\E7D0'; - } -} -.game-icon-nose-side { - &:before { - content: '\E7D1'; - } -} -.game-icon-nurse-female { - &:before { - content: '\E7D2'; - } -} -.game-icon-nurse-male { - &:before { - content: '\E7D3'; - } -} -.game-icon-pirate-captain { - &:before { - content: '\E7D4'; - } -} -.game-icon-plane-pilot { - &:before { - content: '\E7D5'; - } -} -.game-icon-portrait { - &:before { - content: '\E7D6'; - } -} -.game-icon-quick-man { - &:before { - content: '\E7D7'; - } -} -.game-icon-robot-antennas { - &:before { - content: '\E7D8'; - } -} -.game-icon-robot-helmet { - &:before { - content: '\E7D9'; - } -} -.game-icon-star-struck { - &:before { - content: '\E7DA'; - } -} -.game-icon-sunglasses { - &:before { - content: '\E7DB'; - } -} -.game-icon-viking-head { - &:before { - content: '\E7DC'; - } -} -.game-icon-alien-stare { - &:before { - content: '\E7DD'; - } -} -.game-icon-beard { - &:before { - content: '\E7DE'; - } -} -.game-icon-brain-stem { - &:before { - content: '\E7DF'; - } -} -.game-icon-brainstorm { - &:before { - content: '\E7E0'; - } -} -.game-icon-comb { - &:before { - content: '\E7E1'; - } -} -.game-icon-diamonds-smile { - &:before { - content: '\E7E2'; - } -} -.game-icon-doctor-face { - &:before { - content: '\E7E3'; - } -} -.game-icon-frontal-lobe { - &:before { - content: '\E7E4'; - } -} -.game-icon-gaze { - &:before { - content: '\E7E5'; - } -} -.game-icon-iron-mask { - &:before { - content: '\E7E6'; - } -} -.game-icon-mad-scientist { - &:before { - content: '\E7E7'; - } -} -.game-icon-nailed-head { - &:before { - content: '\E7E8'; - } -} -.game-icon-ninja-mask { - &:before { - content: '\E7E9'; - } -} -.game-icon-one-eyed { - &:before { - content: '\E7EA'; - } -} -.game-icon-pig-face { - &:before { - content: '\E7EB'; - } -} -.game-icon-psychic-waves { - &:before { - content: '\E7EC'; - } -} -.game-icon-pummeled { - &:before { - content: '\E7ED'; - } -} -.game-icon-pumpkin-lantern { - &:before { - content: '\E7EE'; - } -} -.game-icon-pumpkin-mask { - &:before { - content: '\E7EF'; - } -} -.game-icon-razor-blade { - &:before { - content: '\E7F0'; - } -} -.game-icon-spectacle-lenses { - &:before { - content: '\E7F1'; - } -} -.game-icon-spiked-halo { - &:before { - content: '\E7F2'; - } -} -.game-icon-tear-tracks { - &:before { - content: '\E7F3'; - } -} -.game-icon-tooth { - &:before { - content: '\E7F4'; - } -} -.game-icon-overkill { - &:before { - content: '\E7F5'; - } -} -.game-icon-headshot-2 { - &:before { - content: '\E7F6'; - } -} -.game-icon-cobra { - &:before { - content: '\E7F7'; - } -} -.game-icon-dimetrodon { - &:before { - content: '\E7F8'; - } -} -.game-icon-diplodocus { - &:before { - content: '\E7F9'; - } -} -.game-icon-frog-foot { - &:before { - content: '\E7FA'; - } -} -.game-icon-ninja-velociraptor { - &:before { - content: '\E7FB'; - } -} -.game-icon-parasaurolophus { - &:before { - content: '\E7FC'; - } -} -.game-icon-rattlesnake { - &:before { - content: '\E7FD'; - } -} -.game-icon-reptile-tail { - &:before { - content: '\E7FE'; - } -} -.game-icon-sand-snake { - &:before { - content: '\E7FF'; - } -} -.game-icon-sauropod-head { - &:before { - content: '\E800'; - } -} -.game-icon-snake-egg { - &:before { - content: '\E801'; - } -} -.game-icon-snake-jar { - &:before { - content: '\E802'; - } -} -.game-icon-snake-spiral { - &:before { - content: '\E803'; - } -} -.game-icon-snake-tongue { - &:before { - content: '\E804'; - } -} -.game-icon-stegosaurus-scales { - &:before { - content: '\E805'; - } -} -.game-icon-t-rex-skull { - &:before { - content: '\E806'; - } -} -.game-icon-triceratops-head { - &:before { - content: '\E807'; - } -} -.game-icon-velociraptor-tracks { - &:before { - content: '\E808'; - } -} -.game-icon-velociraptor { - &:before { - content: '\E809'; - } -} -.game-icon-lizard-tongue { - &:before { - content: '\E80A'; - } -} -.game-icon-cobra-2 { - &:before { - content: '\E80B'; - } -} -.game-icon-defensive-wall { - &:before { - content: '\E80C'; - } -} -.game-icon-3d-stairs { - &:before { - content: '\E80D'; - } -} -.game-icon-airtight-hatch { - &:before { - content: '\E80E'; - } -} -.game-icon-arabic-door { - &:before { - content: '\E80F'; - } -} -.game-icon-arc-triomphe { - &:before { - content: '\E810'; - } -} -.game-icon-ascending-block { - &:before { - content: '\E811'; - } -} -.game-icon-bank { - &:before { - content: '\E812'; - } -} -.game-icon-barn { - &:before { - content: '\E813'; - } -} -.game-icon-barricade { - &:before { - content: '\E814'; - } -} -.game-icon-barrier { - &:before { - content: '\E815'; - } -} -.game-icon-base-dome { - &:before { - content: '\E816'; - } -} -.game-icon-block-house { - &:before { - content: '\E817'; - } -} -.game-icon-boxing-ring { - &:before { - content: '\E818'; - } -} -.game-icon-brick-pile { - &:before { - content: '\E819'; - } -} -.game-icon-brick-wall { - &:before { - content: '\E81A'; - } -} -.game-icon-broken-wall { - &:before { - content: '\E81B'; - } -} -.game-icon-byzantin-temple { - &:before { - content: '\E81C'; - } -} -.game-icon-cage { - &:before { - content: '\E81D'; - } -} -.game-icon-carousel { - &:before { - content: '\E81E'; - } -} -.game-icon-castle-ruins { - &:before { - content: '\E81F'; - } -} -.game-icon-castle { - &:before { - content: '\E820'; - } -} -.game-icon-church { - &:before { - content: '\E821'; - } -} -.game-icon-closed-doors { - &:before { - content: '\E822'; - } -} -.game-icon-concrete-bag { - &:before { - content: '\E823'; - } -} -.game-icon-congress { - &:before { - content: '\E824'; - } -} -.game-icon-control-tower { - &:before { - content: '\E825'; - } -} -.game-icon-crane { - &:before { - content: '\E826'; - } -} -.game-icon-crypt-entrance { - &:before { - content: '\E827'; - } -} -.game-icon-dam { - &:before { - content: '\E828'; - } -} -.game-icon-djed-pillar { - &:before { - content: '\E829'; - } -} -.game-icon-egyptian-pyramids { - &:before { - content: '\E82A'; - } -} -.game-icon-egyptian-temple { - &:before { - content: '\E82B'; - } -} -.game-icon-elevator { - &:before { - content: '\E82C'; - } -} -.game-icon-entry-door { - &:before { - content: '\E82D'; - } -} -.game-icon-escalator { - &:before { - content: '\E82E'; - } -} -.game-icon-evil-tower { - &:before { - content: '\E82F'; - } -} -.game-icon-exit-door { - &:before { - content: '\E830'; - } -} -.game-icon-factory { - &:before { - content: '\E831'; - } -} -.game-icon-family-house { - &:before { - content: '\E832'; - } -} -.game-icon-floating-platforms { - &:before { - content: '\E833'; - } -} -.game-icon-gate { - &:before { - content: '\E834'; - } -} -.game-icon-goblin-camp { - &:before { - content: '\E835'; - } -} -.game-icon-gold-mine { - &:before { - content: '\E836'; - } -} -.game-icon-granary { - &:before { - content: '\E837'; - } -} -.game-icon-great-pyramid { - &:before { - content: '\E838'; - } -} -.game-icon-habitat-dome { - &:before { - content: '\E839'; - } -} -.game-icon-hill-fort { - &:before { - content: '\E83A'; - } -} -.game-icon-hobbit-dwelling { - &:before { - content: '\E83B'; - } -} -.game-icon-hospital { - &:before { - content: '\E83C'; - } -} -.game-icon-house { - &:before { - content: '\E83D'; - } -} -.game-icon-hut { - &:before { - content: '\E83E'; - } -} -.game-icon-huts-village { - &:before { - content: '\E83F'; - } -} -.game-icon-i-beam { - &:before { - content: '\E840'; - } -} -.game-icon-igloo { - &:before { - content: '\E841'; - } -} -.game-icon-indian-palace { - &:before { - content: '\E842'; - } -} -.game-icon-kid-slide { - &:before { - content: '\E843'; - } -} -.game-icon-ladder { - &:before { - content: '\E844'; - } -} -.game-icon-louvre-pyramid { - &:before { - content: '\E845'; - } -} -.game-icon-mayan-pyramid { - &:before { - content: '\E846'; - } -} -.game-icon-medieval-barracks { - &:before { - content: '\E847'; - } -} -.game-icon-medieval-gate { - &:before { - content: '\E848'; - } -} -.game-icon-moai { - &:before { - content: '\E849'; - } -} -.game-icon-modern-city { - &:before { - content: '\E84A'; - } -} -.game-icon-mushroom-house { - &:before { - content: '\E84B'; - } -} -.game-icon-obelisk { - &:before { - content: '\E84C'; - } -} -.game-icon-observatory { - &:before { - content: '\E84D'; - } -} -.game-icon-oil-pump { - &:before { - content: '\E84E'; - } -} -.game-icon-oil-rig { - &:before { - content: '\E84F'; - } -} -.game-icon-pagoda { - &:before { - content: '\E850'; - } -} -.game-icon-pisa-tower { - &:before { - content: '\E851'; - } -} -.game-icon-post-office { - &:before { - content: '\E852'; - } -} -.game-icon-pylon { - &:before { - content: '\E853'; - } -} -.game-icon-refinery { - &:before { - content: '\E854'; - } -} -.game-icon-rempart { - &:before { - content: '\E855'; - } -} -.game-icon-round-silo { - &:before { - content: '\E856'; - } -} -.game-icon-saint-basil-cathedral { - &:before { - content: '\E857'; - } -} -.game-icon-saloon-doors { - &:before { - content: '\E858'; - } -} -.game-icon-saloon { - &:before { - content: '\E859'; - } -} -.game-icon-samara-mosque { - &:before { - content: '\E85A'; - } -} -.game-icon-secret-door { - &:before { - content: '\E85B'; - } -} -.game-icon-shinto-shrine { - &:before { - content: '\E85C'; - } -} -.game-icon-shop { - &:before { - content: '\E85D'; - } -} -.game-icon-space-needle { - &:before { - content: '\E85E'; - } -} -.game-icon-spooky-house { - &:before { - content: '\E85F'; - } -} -.game-icon-stairs { - &:before { - content: '\E860'; - } -} -.game-icon-stockpiles { - &:before { - content: '\E861'; - } -} -.game-icon-stone-wall { - &:before { - content: '\E862'; - } -} -.game-icon-sverd-i-fjell { - &:before { - content: '\E863'; - } -} -.game-icon-sydney-opera-house { - &:before { - content: '\E864'; - } -} -.game-icon-tee-pipe { - &:before { - content: '\E865'; - } -} -.game-icon-temple-gate { - &:before { - content: '\E866'; - } -} -.game-icon-theater-curtains { - &:before { - content: '\E867'; - } -} -.game-icon-tipi { - &:before { - content: '\E868'; - } -} -.game-icon-tower-flag { - &:before { - content: '\E869'; - } -} -.game-icon-traffic-cone { - &:before { - content: '\E86A'; - } -} -.game-icon-triple-gate { - &:before { - content: '\E86B'; - } -} -.game-icon-tv-tower { - &:before { - content: '\E86C'; - } -} -.game-icon-viking-church { - &:before { - content: '\E86D'; - } -} -.game-icon-viking-longhouse { - &:before { - content: '\E86E'; - } -} -.game-icon-village { - &:before { - content: '\E86F'; - } -} -.game-icon-warp-pipe { - &:before { - content: '\E870'; - } -} -.game-icon-water-tank { - &:before { - content: '\E871'; - } -} -.game-icon-water-tower { - &:before { - content: '\E872'; - } -} -.game-icon-well { - &:before { - content: '\E873'; - } -} -.game-icon-wheelbarrow { - &:before { - content: '\E874'; - } -} -.game-icon-wind-turbine { - &:before { - content: '\E875'; - } -} -.game-icon-windmill { - &:before { - content: '\E876'; - } -} -.game-icon-window { - &:before { - content: '\E877'; - } -} -.game-icon-windpump { - &:before { - content: '\E878'; - } -} -.game-icon-castle-2 { - &:before { - content: '\E879'; - } -} -.game-icon-demolish { - &:before { - content: '\E87A'; - } -} -.game-icon-fountain { - &:before { - content: '\E87B'; - } -} -.game-icon-guarded-tower { - &:before { - content: '\E87C'; - } -} -.game-icon-heart-tower { - &:before { - content: '\E87D'; - } -} -.game-icon-locked-fortress { - &:before { - content: '\E87E'; - } -} -.game-icon-magic-gate { - &:before { - content: '\E87F'; - } -} -.game-icon-magic-portal { - &:before { - content: '\E880'; - } -} -.game-icon-mucous-pillar { - &:before { - content: '\E881'; - } -} -.game-icon-portculis { - &:before { - content: '\E882'; - } -} -.game-icon-radar-dish { - &:before { - content: '\E883'; - } -} -.game-icon-stone-tower { - &:before { - content: '\E884'; - } -} -.game-icon-tower-fall { - &:before { - content: '\E885'; - } -} -.game-icon-white-tower { - &:before { - content: '\E886'; - } -} -.game-icon-wrecking-ball { - &:before { - content: '\E887'; - } -} -.game-icon-elven-castle { - &:before { - content: '\E888'; - } -} -.game-icon-arena { - &:before { - content: '\E889'; - } -} -.game-icon-brazil-flag { - &:before { - content: '\E88A'; - } -} -.game-icon-checkered-flag { - &:before { - content: '\E88B'; - } -} -.game-icon-conqueror { - &:before { - content: '\E88C'; - } -} -.game-icon-corner-flag { - &:before { - content: '\E88D'; - } -} -.game-icon-european-flag { - &:before { - content: '\E88E'; - } -} -.game-icon-golf-flag { - &:before { - content: '\E88F'; - } -} -.game-icon-hill-conquest { - &:before { - content: '\E890'; - } -} -.game-icon-knight-banner { - &:before { - content: '\E891'; - } -} -.game-icon-level-end-flag { - &:before { - content: '\E892'; - } -} -.game-icon-party-flags { - &:before { - content: '\E893'; - } -} -.game-icon-pirate-flag { - &:before { - content: '\E894'; - } -} -.game-icon-planet-conquest { - &:before { - content: '\E895'; - } -} -.game-icon-south-africa-flag { - &:before { - content: '\E896'; - } -} -.game-icon-star-flag { - &:before { - content: '\E897'; - } -} -.game-icon-truce { - &:before { - content: '\E898'; - } -} -.game-icon-tusks-flag { - &:before { - content: '\E899'; - } -} -.game-icon-vertical-banner { - &:before { - content: '\E89A'; - } -} -.game-icon-broken-ribbon { - &:before { - content: '\E89B'; - } -} -.game-icon-flying-flag { - &:before { - content: '\E89C'; - } -} -.game-icon-spinning-ribbons { - &:before { - content: '\E89D'; - } -} -.game-icon-tattered-banner { - &:before { - content: '\E89E'; - } -} -.game-icon-curling-stone { - &:before { - content: '\E89F'; - } -} -.game-icon-frozen-body { - &:before { - content: '\E8A0'; - } -} -.game-icon-frozen-ring { - &:before { - content: '\E8A1'; - } -} -.game-icon-fur-boot { - &:before { - content: '\E8A2'; - } -} -.game-icon-hockey { - &:before { - content: '\E8A3'; - } -} -.game-icon-ice-cream-cone { - &:before { - content: '\E8A4'; - } -} -.game-icon-ice-cubes { - &:before { - content: '\E8A5'; - } -} -.game-icon-ice-iris { - &:before { - content: '\E8A6'; - } -} -.game-icon-ice-pop { - &:before { - content: '\E8A7'; - } -} -.game-icon-ice-skate { - &:before { - content: '\E8A8'; - } -} -.game-icon-ice-spell-cast { - &:before { - content: '\E8A9'; - } -} -.game-icon-melting-ice-cube { - &:before { - content: '\E8AA'; - } -} -.game-icon-ski-boot { - &:before { - content: '\E8AB'; - } -} -.game-icon-stalactites { - &:before { - content: '\E8AC'; - } -} -.game-icon-thermometer-cold { - &:before { - content: '\E8AD'; - } -} -.game-icon-winter-gloves { - &:before { - content: '\E8AE'; - } -} -.game-icon-beveled-star { - &:before { - content: '\E8AF'; - } -} -.game-icon-cold-heart { - &:before { - content: '\E8B0'; - } -} -.game-icon-eskimo { - &:before { - content: '\E8B1'; - } -} -.game-icon-frozen-block { - &:before { - content: '\E8B2'; - } -} -.game-icon-frozen-orb { - &:before { - content: '\E8B3'; - } -} -.game-icon-ice-bolt { - &:before { - content: '\E8B4'; - } -} -.game-icon-ice-bomb { - &:before { - content: '\E8B5'; - } -} -.game-icon-ice-cube { - &:before { - content: '\E8B6'; - } -} -.game-icon-icebergs { - &:before { - content: '\E8B7'; - } -} -.game-icon-icicles-aura { - &:before { - content: '\E8B8'; - } -} -.game-icon-icicles-fence { - &:before { - content: '\E8B9'; - } -} -.game-icon-snow-bottle { - &:before { - content: '\E8BA'; - } -} -.game-icon-snowflake-1 { - &:before { - content: '\E8BB'; - } -} -.game-icon-snowflake-2 { - &:before { - content: '\E8BC'; - } -} -.game-icon-snowing { - &:before { - content: '\E8BD'; - } -} -.game-icon-snowman { - &:before { - content: '\E8BE'; - } -} -.game-icon-flake { - &:before { - content: '\E8BF'; - } -} -.game-icon-hooded-assassin { - &:before { - content: '\E8C0'; - } -} -.game-icon-hooded-figure { - &:before { - content: '\E8C1'; - } -} -.game-icon-ninja-heroic-stance { - &:before { - content: '\E8C2'; - } -} -.game-icon-arm-bandage { - &:before { - content: '\E8C3'; - } -} -.game-icon-arm-sling { - &:before { - content: '\E8C4'; - } -} -.game-icon-blacksmith { - &:before { - content: '\E8C5'; - } -} -.game-icon-body-balance { - &:before { - content: '\E8C6'; - } -} -.game-icon-caveman { - &:before { - content: '\E8C7'; - } -} -.game-icon-character { - &:before { - content: '\E8C8'; - } -} -.game-icon-contortionist { - &:before { - content: '\E8C9'; - } -} -.game-icon-cook { - &:before { - content: '\E8CA'; - } -} -.game-icon-cryo-chamber { - &:before { - content: '\E8CB'; - } -} -.game-icon-egyptian-walk { - &:before { - content: '\E8CC'; - } -} -.game-icon-face-to-face { - &:before { - content: '\E8CD'; - } -} -.game-icon-farmer { - &:before { - content: '\E8CE'; - } -} -.game-icon-guards { - &:before { - content: '\E8CF'; - } -} -.game-icon-high-kick { - &:before { - content: '\E8D0'; - } -} -.game-icon-high-punch { - &:before { - content: '\E8D1'; - } -} -.game-icon-human-pyramid { - &:before { - content: '\E8D2'; - } -} -.game-icon-invisible { - &:before { - content: '\E8D3'; - } -} -.game-icon-jumping-rope { - &:before { - content: '\E8D4'; - } -} -.game-icon-knee-bandage { - &:before { - content: '\E8D5'; - } -} -.game-icon-lovers { - &:before { - content: '\E8D6'; - } -} -.game-icon-medallist { - &:before { - content: '\E8D7'; - } -} -.game-icon-mighty-force { - &:before { - content: '\E8D8'; - } -} -.game-icon-person { - &:before { - content: '\E8D9'; - } -} -.game-icon-pikeman { - &:before { - content: '\E8DA'; - } -} -.game-icon-ringmaster { - &:before { - content: '\E8DB'; - } -} -.game-icon-sleeping-bag { - &:before { - content: '\E8DC'; - } -} -.game-icon-spiked-wall { - &:before { - content: '\E8DD'; - } -} -.game-icon-strong-man { - &:before { - content: '\E8DE'; - } -} -.game-icon-sun-priest { - &:before { - content: '\E8DF'; - } -} -.game-icon-three-friends { - &:before { - content: '\E8E0'; - } -} -.game-icon-tightrope { - &:before { - content: '\E8E1'; - } -} -.game-icon-tribunal-jury { - &:before { - content: '\E8E2'; - } -} -.game-icon-vampire-cape { - &:before { - content: '\E8E3'; - } -} -.game-icon-van-damme-split { - &:before { - content: '\E8E4'; - } -} -.game-icon-vitruvian-man { - &:before { - content: '\E8E5'; - } -} -.game-icon-weight-lifting-down { - &:before { - content: '\E8E6'; - } -} -.game-icon-weight-lifting-up { - &:before { - content: '\E8E7'; - } -} -.game-icon-anatomy { - &:before { - content: '\E8E8'; - } -} -.game-icon-aura { - &:before { - content: '\E8E9'; - } -} -.game-icon-backup { - &:before { - content: '\E8EA'; - } -} -.game-icon-beams-aura { - &:before { - content: '\E8EB'; - } -} -.game-icon-body-swapping { - &:before { - content: '\E8EC'; - } -} -.game-icon-deadly-strike { - &:before { - content: '\E8ED'; - } -} -.game-icon-dna1 { - &:before { - content: '\E8EE'; - } -} -.game-icon-dna2 { - &:before { - content: '\E8EF'; - } -} -.game-icon-dozen { - &:before { - content: '\E8F0'; - } -} -.game-icon-embrassed-energy { - &:before { - content: '\E8F1'; - } -} -.game-icon-ghost-ally { - &:before { - content: '\E8F2'; - } -} -.game-icon-heart-inside { - &:before { - content: '\E8F3'; - } -} -.game-icon-heart-organ { - &:before { - content: '\E8F4'; - } -} -.game-icon-inner-self { - &:before { - content: '\E8F5'; - } -} -.game-icon-master-of-arms { - &:before { - content: '\E8F6'; - } -} -.game-icon-minions { - &:before { - content: '\E8F7'; - } -} -.game-icon-muscle-fat { - &:before { - content: '\E8F8'; - } -} -.game-icon-octoman { - &:before { - content: '\E8F9'; - } -} -.game-icon-puppet { - &:before { - content: '\E8FA'; - } -} -.game-icon-rear-aura { - &:before { - content: '\E8FB'; - } -} -.game-icon-relationship-bounds { - &:before { - content: '\E8FC'; - } -} -.game-icon-rogue { - &:before { - content: '\E8FD'; - } -} -.game-icon-shadow-follower { - &:before { - content: '\E8FE'; - } -} -.game-icon-sinking-trap { - &:before { - content: '\E8FF'; - } -} -.game-icon-skeleton-inside { - &:before { - content: '\E900'; - } -} -.game-icon-split-body { - &:before { - content: '\E901'; - } -} -.game-icon-static-guard { - &:before { - content: '\E902'; - } -} -.game-icon-sword-tie { - &:before { - content: '\E903'; - } -} -.game-icon-target-dummy { - &:before { - content: '\E904'; - } -} -.game-icon-telepathy { - &:before { - content: '\E905'; - } -} -.game-icon-transportation-rings { - &:before { - content: '\E906'; - } -} -.game-icon-falling { - &:before { - content: '\E907'; - } -} -.game-icon-fat { - &:before { - content: '\E908'; - } -} -.game-icon-skeleton { - &:before { - content: '\E909'; - } -} -.game-icon-crystal-earrings { - &:before { - content: '\E90A'; - } -} -.game-icon-diamond-hilt { - &:before { - content: '\E90B'; - } -} -.game-icon-diamond-ring { - &:before { - content: '\E90C'; - } -} -.game-icon-double-necklace { - &:before { - content: '\E90D'; - } -} -.game-icon-drop-earrings { - &:before { - content: '\E90E'; - } -} -.game-icon-earrings { - &:before { - content: '\E90F'; - } -} -.game-icon-emerald-necklace { - &:before { - content: '\E910'; - } -} -.game-icon-feather-necklace { - &:before { - content: '\E911'; - } -} -.game-icon-globe-ring { - &:before { - content: '\E912'; - } -} -.game-icon-heart-earrings { - &:before { - content: '\E913'; - } -} -.game-icon-heart-necklace { - &:before { - content: '\E914'; - } -} -.game-icon-intricate-necklace { - &:before { - content: '\E915'; - } -} -.game-icon-necklace-display { - &:before { - content: '\E916'; - } -} -.game-icon-oyster-pearl { - &:before { - content: '\E917'; - } -} -.game-icon-pearl-earring { - &:before { - content: '\E918'; - } -} -.game-icon-pearl-necklace { - &:before { - content: '\E919'; - } -} -.game-icon-pendant-key { - &:before { - content: '\E91A'; - } -} -.game-icon-power-ring { - &:before { - content: '\E91B'; - } -} -.game-icon-prayer-beads { - &:before { - content: '\E91C'; - } -} -.game-icon-primitive-necklace { - &:before { - content: '\E91D'; - } -} -.game-icon-ring-box { - &:before { - content: '\E91E'; - } -} -.game-icon-ring { - &:before { - content: '\E91F'; - } -} -.game-icon-rupee { - &:before { - content: '\E920'; - } -} -.game-icon-tribal-pendant { - &:before { - content: '\E921'; - } -} -.game-icon-necklace { - &:before { - content: '\E922'; - } -} -.game-icon-crystal-growth { - &:before { - content: '\E923'; - } -} -.game-icon-crystalize { - &:before { - content: '\E924'; - } -} -.game-icon-cut-diamond { - &:before { - content: '\E925'; - } -} -.game-icon-emerald { - &:before { - content: '\E926'; - } -} -.game-icon-engagement-ring { - &:before { - content: '\E927'; - } -} -.game-icon-gem-chain { - &:before { - content: '\E928'; - } -} -.game-icon-gem-necklace { - &:before { - content: '\E929'; - } -} -.game-icon-gem-pendant { - &:before { - content: '\E92A'; - } -} -.game-icon-jeweled-chalice { - &:before { - content: '\E92B'; - } -} -.game-icon-linked-rings { - &:before { - content: '\E92C'; - } -} -.game-icon-medal-skull { - &:before { - content: '\E92D'; - } -} -.game-icon-medal { - &:before { - content: '\E92E'; - } -} -.game-icon-saphir { - &:before { - content: '\E92F'; - } -} -.game-icon-skull-ring { - &:before { - content: '\E930'; - } -} -.game-icon-skull-signet { - &:before { - content: '\E931'; - } -} -.game-icon-spiked-collar { - &:before { - content: '\E932'; - } -} -.game-icon-trophy { - &:before { - content: '\E933'; - } -} -.game-icon-amethyst { - &:before { - content: '\E934'; - } -} -.game-icon-big-diamond-ring { - &:before { - content: '\E935'; - } -} -.game-icon-topaz { - &:before { - content: '\E936'; - } -} -.game-icon-big-gear { - &:before { - content: '\E937'; - } -} -.game-icon-belt-armor { - &:before { - content: '\E938'; - } -} -.game-icon-bolt-cutter { - &:before { - content: '\E939'; - } -} -.game-icon-bottle-cap { - &:before { - content: '\E93A'; - } -} -.game-icon-empty-metal-bucket-handle { - &:before { - content: '\E93B'; - } -} -.game-icon-empty-metal-bucket { - &:before { - content: '\E93C'; - } -} -.game-icon-foundry-bucket { - &:before { - content: '\E93D'; - } -} -.game-icon-full-metal-bucket-handle { - &:before { - content: '\E93E'; - } -} -.game-icon-full-metal-bucket { - &:before { - content: '\E93F'; - } -} -.game-icon-gold-stack { - &:before { - content: '\E940'; - } -} -.game-icon-hexagonal-nut { - &:before { - content: '\E941'; - } -} -.game-icon-ladle { - &:before { - content: '\E942'; - } -} -.game-icon-melting-metal { - &:before { - content: '\E943'; - } -} -.game-icon-metal-plate { - &:before { - content: '\E944'; - } -} -.game-icon-ring-mould { - &:before { - content: '\E945'; - } -} -.game-icon-screw { - &:before { - content: '\E946'; - } -} -.game-icon-shoulder-armor { - &:before { - content: '\E947'; - } -} -.game-icon-spring { - &:before { - content: '\E948'; - } -} -.game-icon-straight-pipe { - &:before { - content: '\E949'; - } -} -.game-icon-sword-mold { - &:before { - content: '\E94A'; - } -} -.game-icon-wire-coil { - &:before { - content: '\E94B'; - } -} -.game-icon-zipper { - &:before { - content: '\E94C'; - } -} -.game-icon-anvil-impact { - &:before { - content: '\E94D'; - } -} -.game-icon-anvil { - &:before { - content: '\E94E'; - } -} -.game-icon-barbed-coil { - &:before { - content: '\E94F'; - } -} -.game-icon-barbed-wire { - &:before { - content: '\E950'; - } -} -.game-icon-black-bar { - &:before { - content: '\E951'; - } -} -.game-icon-cash { - &:before { - content: '\E952'; - } -} -.game-icon-crossed-chains { - &:before { - content: '\E953'; - } -} -.game-icon-magnet-blast { - &:before { - content: '\E954'; - } -} -.game-icon-magnet { - &:before { - content: '\E955'; - } -} -.game-icon-metal-bar { - &:before { - content: '\E956'; - } -} -.game-icon-metal-disc { - &:before { - content: '\E957'; - } -} -.game-icon-metal-hand { - &:before { - content: '\E958'; - } -} -.game-icon-metal-scales { - &:before { - content: '\E959'; - } -} -.game-icon-nails { - &:before { - content: '\E95A'; - } -} -.game-icon-needle-drill { - &:before { - content: '\E95B'; - } -} -.game-icon-robot-golem { - &:before { - content: '\E95C'; - } -} -.game-icon-screw-2 { - &:before { - content: '\E95D'; - } -} -.game-icon-spoon { - &:before { - content: '\E95E'; - } -} -.game-icon-steel-claws { - &:before { - content: '\E95F'; - } -} -.game-icon-steeltoe-boots { - &:before { - content: '\E960'; - } -} -.game-icon-wavy-chains { - &:before { - content: '\E961'; - } -} -.game-icon-weight-crush { - &:before { - content: '\E962'; - } -} -.game-icon-breaking-chain { - &:before { - content: '\E963'; - } -} -.game-icon-steel-claws-2 { - &:before { - content: '\E964'; - } -} -.game-icon-gold-bar { - &:before { - content: '\E965'; - } -} -.game-icon-tabi-boot { - &:before { - content: '\E966'; - } -} -.game-icon-bamboo { - &:before { - content: '\E967'; - } -} -.game-icon-black-belt { - &:before { - content: '\E968'; - } -} -.game-icon-handheld-fan { - &:before { - content: '\E969'; - } -} -.game-icon-japanese-bridge { - &:before { - content: '\E96A'; - } -} -.game-icon-katana { - &:before { - content: '\E96B'; - } -} -.game-icon-kimono { - &:before { - content: '\E96C'; - } -} -.game-icon-night-vision { - &:before { - content: '\E96D'; - } -} -.game-icon-ninja-armor { - &:before { - content: '\E96E'; - } -} -.game-icon-onigori { - &:before { - content: '\E96F'; - } -} -.game-icon-rope-dart { - &:before { - content: '\E970'; - } -} -.game-icon-shinto-shrine-mirror { - &:before { - content: '\E971'; - } -} -.game-icon-teapot-leaves { - &:before { - content: '\E972'; - } -} -.game-icon-yunluo { - &:before { - content: '\E973'; - } -} -.game-icon-assassin-pocket { - &:before { - content: '\E974'; - } -} -.game-icon-lotus { - &:before { - content: '\E975'; - } -} -.game-icon-sword-slice { - &:before { - content: '\E976'; - } -} -.game-icon-thrown-daggers { - &:before { - content: '\E977'; - } -} -.game-icon-apothecary { - &:before { - content: '\E978'; - } -} -.game-icon-cauldron { - &:before { - content: '\E979'; - } -} -.game-icon-butter { - &:before { - content: '\E97A'; - } -} -.game-icon-cloth-jar { - &:before { - content: '\E97B'; - } -} -.game-icon-coffee-cup { - &:before { - content: '\E97C'; - } -} -.game-icon-coffee-pot { - &:before { - content: '\E97D'; - } -} -.game-icon-cooking-pot { - &:before { - content: '\E97E'; - } -} -.game-icon-corkscrew { - &:before { - content: '\E97F'; - } -} -.game-icon-covered-jar { - &:before { - content: '\E980'; - } -} -.game-icon-fork-knife-spoon { - &:before { - content: '\E981'; - } -} -.game-icon-glass-celebration { - &:before { - content: '\E982'; - } -} -.game-icon-ice-cream-scoop { - &:before { - content: '\E983'; - } -} -.game-icon-kitchen-scale { - &:before { - content: '\E984'; - } -} -.game-icon-manual-juicer { - &:before { - content: '\E985'; - } -} -.game-icon-manual-meat-grinder { - &:before { - content: '\E986'; - } -} -.game-icon-meal { - &:before { - content: '\E987'; - } -} -.game-icon-moka-pot { - &:before { - content: '\E988'; - } -} -.game-icon-painted-pottery { - &:before { - content: '\E989'; - } -} -.game-icon-porcelain-vase { - &:before { - content: '\E98A'; - } -} -.game-icon-pouring-pot { - &:before { - content: '\E98B'; - } -} -.game-icon-toaster { - &:before { - content: '\E98C'; - } -} -.game-icon-whisk { - &:before { - content: '\E98D'; - } -} -.game-icon-bandage-roll { - &:before { - content: '\E98E'; - } -} -.game-icon-bowl-spiral { - &:before { - content: '\E98F'; - } -} -.game-icon-cauldron-2 { - &:before { - content: '\E990'; - } -} -.game-icon-chalice-drops { - &:before { - content: '\E991'; - } -} -.game-icon-coffee-mug { - &:before { - content: '\E992'; - } -} -.game-icon-glass-shot { - &:before { - content: '\E993'; - } -} -.game-icon-kitchen-knives { - &:before { - content: '\E994'; - } -} -.game-icon-knife-fork { - &:before { - content: '\E995'; - } -} -.game-icon-martini { - &:before { - content: '\E996'; - } -} -.game-icon-meat-cleaver { - &:before { - content: '\E997'; - } -} -.game-icon-pizza-cutter { - &:before { - content: '\E998'; - } -} -.game-icon-shattered-glass { - &:before { - content: '\E999'; - } -} -.game-icon-wine-glass { - &:before { - content: '\E99A'; - } -} -.game-icon-egg-pod { - &:before { - content: '\E99B'; - } -} -.game-icon-fruit-bowl { - &:before { - content: '\E99C'; - } -} -.game-icon-pestle-mortar { - &:before { - content: '\E99D'; - } -} -.game-icon-eternal-love { - &:before { - content: '\E99E'; - } -} -.game-icon-first-aid-kit { - &:before { - content: '\E99F'; - } -} -.game-icon-foot-plaster { - &:before { - content: '\E9A0'; - } -} -.game-icon-hand-bandage { - &:before { - content: '\E9A1'; - } -} -.game-icon-healing { - &:before { - content: '\E9A2'; - } -} -.game-icon-health-capsule { - &:before { - content: '\E9A3'; - } -} -.game-icon-health-potion { - &:before { - content: '\E9A4'; - } -} -.game-icon-herbs-bundle { - &:before { - content: '\E9A5'; - } -} -.game-icon-life-bar { - &:before { - content: '\E9A6'; - } -} -.game-icon-medical-drip { - &:before { - content: '\E9A7'; - } -} -.game-icon-medical-thermometer { - &:before { - content: '\E9A8'; - } -} -.game-icon-medicine-pills { - &:before { - content: '\E9A9'; - } -} -.game-icon-medicines { - &:before { - content: '\E9AA'; - } -} -.game-icon-nested-hearts { - &:before { - content: '\E9AB'; - } -} -.game-icon-remedy { - &:before { - content: '\E9AC'; - } -} -.game-icon-stethoscope { - &:before { - content: '\E9AD'; - } -} -.game-icon-broken-heart { - &:before { - content: '\E9AE'; - } -} -.game-icon-defibrilate { - &:before { - content: '\E9AF'; - } -} -.game-icon-embryo { - &:before { - content: '\E9B0'; - } -} -.game-icon-heart-bottle { - &:before { - content: '\E9B1'; - } -} -.game-icon-life-support { - &:before { - content: '\E9B2'; - } -} -.game-icon-life-tap { - &:before { - content: '\E9B3'; - } -} -.game-icon-love-injection { - &:before { - content: '\E9B4'; - } -} -.game-icon-miracle-medecine { - &:before { - content: '\E9B5'; - } -} -.game-icon-overdose { - &:before { - content: '\E9B6'; - } -} -.game-icon-pill-drop { - &:before { - content: '\E9B7'; - } -} -.game-icon-pill { - &:before { - content: '\E9B8'; - } -} -.game-icon-scalpel { - &:before { - content: '\E9B9'; - } -} -.game-icon-sticking-plaster { - &:before { - content: '\E9BA'; - } -} -.game-icon-syringe { - &:before { - content: '\E9BB'; - } -} -.game-icon-health-decrease { - &:before { - content: '\E9BC'; - } -} -.game-icon-health-increase { - &:before { - content: '\E9BD'; - } -} -.game-icon-health-normal { - &:before { - content: '\E9BE'; - } -} -.game-icon-medical-pack-alt { - &:before { - content: '\E9BF'; - } -} -.game-icon-medical-pack { - &:before { - content: '\E9C0'; - } -} -.game-icon-fetus { - &:before { - content: '\E9C1'; - } -} -.game-icon-heart-minus { - &:before { - content: '\E9C2'; - } -} -.game-icon-heart-plus { - &:before { - content: '\E9C3'; - } -} -.game-icon-ancient-screw { - &:before { - content: '\E9C4'; - } -} -.game-icon-beam-satellite { - &:before { - content: '\E9C5'; - } -} -.game-icon-bouncing-spring { - &:before { - content: '\E9C6'; - } -} -.game-icon-computer-fan { - &:before { - content: '\E9C7'; - } -} -.game-icon-death-star { - &:before { - content: '\E9C8'; - } -} -.game-icon-drill { - &:before { - content: '\E9C9'; - } -} -.game-icon-floor-polisher { - &:before { - content: '\E9CA'; - } -} -.game-icon-gps { - &:before { - content: '\E9CB'; - } -} -.game-icon-love-mystery { - &:before { - content: '\E9CC'; - } -} -.game-icon-plug { - &:before { - content: '\E9CD'; - } -} -.game-icon-power-generator { - &:before { - content: '\E9CE'; - } -} -.game-icon-round-knob { - &:before { - content: '\E9CF'; - } -} -.game-icon-satellite-communication { - &:before { - content: '\E9D0'; - } -} -.game-icon-security-gate { - &:before { - content: '\E9D1'; - } -} -.game-icon-settings-knobs { - &:before { - content: '\E9D2'; - } -} -.game-icon-star-gate { - &:before { - content: '\E9D3'; - } -} -.game-icon-tv { - &:before { - content: '\E9D4'; - } -} -.game-icon-vacuum-cleaner { - &:before { - content: '\E9D5'; - } -} -.game-icon-valve { - &:before { - content: '\E9D6'; - } -} -.game-icon-vending-machine { - &:before { - content: '\E9D7'; - } -} -.game-icon-video-conference { - &:before { - content: '\E9D8'; - } -} -.game-icon-computing { - &:before { - content: '\E9D9'; - } -} -.game-icon-diagram { - &:before { - content: '\E9DA'; - } -} -.game-icon-microscope { - &:before { - content: '\E9DB'; - } -} -.game-icon-auto-repair { - &:before { - content: '\E9DC'; - } -} -.game-icon-circuitry { - &:before { - content: '\E9DD'; - } -} -.game-icon-cog-lock { - &:before { - content: '\E9DE'; - } -} -.game-icon-drill-2 { - &:before { - content: '\E9DF'; - } -} -.game-icon-lever { - &:before { - content: '\E9E0'; - } -} -.game-icon-mechanical-arm { - &:before { - content: '\E9E1'; - } -} -.game-icon-microchip { - &:before { - content: '\E9E2'; - } -} -.game-icon-microscope-lens { - &:before { - content: '\E9E3'; - } -} -.game-icon-overdrive { - &:before { - content: '\E9E4'; - } -} -.game-icon-processor { - &:before { - content: '\E9E5'; - } -} -.game-icon-sattelite { - &:before { - content: '\E9E6'; - } -} -.game-icon-skid-mark { - &:before { - content: '\E9E7'; - } -} -.game-icon-spoutnik { - &:before { - content: '\E9E8'; - } -} -.game-icon-tyre { - &:before { - content: '\E9E9'; - } -} -.game-icon-tesla { - &:before { - content: '\E9EA'; - } -} -.game-icon-unplugged { - &:before { - content: '\E9EB'; - } -} -.game-icon-revolt { - &:before { - content: '\E9EC'; - } -} -.game-icon-robber-hand { - &:before { - content: '\E9ED'; - } -} -.game-icon-severed-hand { - &:before { - content: '\E9EE'; - } -} -.game-icon-fingers-crossed { - &:before { - content: '\E9EF'; - } -} -.game-icon-paper { - &:before { - content: '\E9F0'; - } -} -.game-icon-rock { - &:before { - content: '\E9F1'; - } -} -.game-icon-scissors { - &:before { - content: '\E9F2'; - } -} -.game-icon-armor-punch { - &:before { - content: '\E9F3'; - } -} -.game-icon-baseball-glove { - &:before { - content: '\E9F4'; - } -} -.game-icon-bolt-spell-cast { - &:before { - content: '\E9F5'; - } -} -.game-icon-cherish { - &:before { - content: '\E9F6'; - } -} -.game-icon-cooking-glove { - &:before { - content: '\E9F7'; - } -} -.game-icon-fingernail { - &:before { - content: '\E9F8'; - } -} -.game-icon-forearm { - &:before { - content: '\E9F9'; - } -} -.game-icon-gauntlet { - &:before { - content: '\E9FA'; - } -} -.game-icon-gloves { - &:before { - content: '\E9FB'; - } -} -.game-icon-hand-grip { - &:before { - content: '\E9FC'; - } -} -.game-icon-hand-of-god { - &:before { - content: '\E9FD'; - } -} -.game-icon-hand-ok { - &:before { - content: '\E9FE'; - } -} -.game-icon-marble-tap { - &:before { - content: '\E9FF'; - } -} -.game-icon-pirate-hook { - &:before { - content: '\EA00'; - } -} -.game-icon-spock-hand { - &:before { - content: '\EA01'; - } -} -.game-icon-take-my-money { - &:before { - content: '\EA02'; - } -} -.game-icon-thumb-down { - &:before { - content: '\EA03'; - } -} -.game-icon-thumb-up { - &:before { - content: '\EA04'; - } -} -.game-icon-wolverine-claws-2 { - &:before { - content: '\EA05'; - } -} -.game-icon-boxing-glove-surprise { - &:before { - content: '\EA06'; - } -} -.game-icon-boxing-glove { - &:before { - content: '\EA07'; - } -} -.game-icon-cut-palm { - &:before { - content: '\EA08'; - } -} -.game-icon-fist { - &:before { - content: '\EA09'; - } -} -.game-icon-fulguro-punch { - &:before { - content: '\EA0A'; - } -} -.game-icon-gift-of-knowledge { - &:before { - content: '\EA0B'; - } -} -.game-icon-glowing-hands { - &:before { - content: '\EA0C'; - } -} -.game-icon-hand { - &:before { - content: '\EA0D'; - } -} -.game-icon-high-five { - &:before { - content: '\EA0E'; - } -} -.game-icon-magic-palm { - &:before { - content: '\EA0F'; - } -} -.game-icon-magic-swirl { - &:before { - content: '\EA10'; - } -} -.game-icon-mailed-fist { - &:before { - content: '\EA11'; - } -} -.game-icon-monster-grasp { - &:before { - content: '\EA12'; - } -} -.game-icon-moon-claws { - &:before { - content: '\EA13'; - } -} -.game-icon-palm { - &:before { - content: '\EA14'; - } -} -.game-icon-punch-blast { - &:before { - content: '\EA15'; - } -} -.game-icon-punch { - &:before { - content: '\EA16'; - } -} -.game-icon-shadow-grasp { - &:before { - content: '\EA17'; - } -} -.game-icon-stigmata { - &:before { - content: '\EA18'; - } -} -.game-icon-thor-fist { - &:before { - content: '\EA19'; - } -} -.game-icon-hand-2 { - &:before { - content: '\EA1A'; - } -} -.game-icon-revolt-2 { - &:before { - content: '\EA1B'; - } -} -.game-icon-usable { - &:before { - content: '\EA1C'; - } -} -.game-icon-click { - &:before { - content: '\EA1D'; - } -} -.game-icon-fist-2 { - &:before { - content: '\EA1E'; - } -} -.game-icon-open-palm { - &:before { - content: '\EA1F'; - } -} -.game-icon-raise-skeleton { - &:before { - content: '\EA20'; - } -} -.game-icon-barrel-leak { - &:before { - content: '\EA21'; - } -} -.game-icon-basket { - &:before { - content: '\EA22'; - } -} -.game-icon-beach-bucket { - &:before { - content: '\EA23'; - } -} -.game-icon-cardboard-box-closed { - &:before { - content: '\EA24'; - } -} -.game-icon-cardboard-box { - &:before { - content: '\EA25'; - } -} -.game-icon-cargo-crate { - &:before { - content: '\EA26'; - } -} -.game-icon-cellar-barrels { - &:before { - content: '\EA27'; - } -} -.game-icon-chest { - &:before { - content: '\EA28'; - } -} -.game-icon-companion-cube { - &:before { - content: '\EA29'; - } -} -.game-icon-database { - &:before { - content: '\EA2A'; - } -} -.game-icon-energy-tank { - &:before { - content: '\EA2B'; - } -} -.game-icon-fuel-tank { - &:before { - content: '\EA2C'; - } -} -.game-icon-hand-truck { - &:before { - content: '\EA2D'; - } -} -.game-icon-locked-box { - &:before { - content: '\EA2E'; - } -} -.game-icon-matryoshka-dolls { - &:before { - content: '\EA2F'; - } -} -.game-icon-nuclear-waste { - &:before { - content: '\EA30'; - } -} -.game-icon-opened-food-can { - &:before { - content: '\EA31'; - } -} -.game-icon-paper-tray { - &:before { - content: '\EA32'; - } -} -.game-icon-present { - &:before { - content: '\EA33'; - } -} -.game-icon-shoulder-bag { - &:before { - content: '\EA34'; - } -} -.game-icon-strongbox { - &:before { - content: '\EA35'; - } -} -.game-icon-toolbox { - &:before { - content: '\EA36'; - } -} -.game-icon-watering-can { - &:before { - content: '\EA37'; - } -} -.game-icon-cannister { - &:before { - content: '\EA38'; - } -} -.game-icon-chemical-tank { - &:before { - content: '\EA39'; - } -} -.game-icon-jigsaw-box { - &:before { - content: '\EA3A'; - } -} -.game-icon-locked-chest { - &:before { - content: '\EA3B'; - } -} -.game-icon-box-trap { - &:before { - content: '\EA3C'; - } -} -.game-icon-oil-drum { - &:before { - content: '\EA3D'; - } -} -.game-icon-open-chest { - &:before { - content: '\EA3E'; - } -} -.game-icon-open-treasure-chest { - &:before { - content: '\EA3F'; - } -} -.game-icon-beer-horn { - &:before { - content: '\EA40'; - } -} -.game-icon-bolt-drop { - &:before { - content: '\EA41'; - } -} -.game-icon-booze { - &:before { - content: '\EA42'; - } -} -.game-icon-cactus-tap { - &:before { - content: '\EA43'; - } -} -.game-icon-holy-water { - &:before { - content: '\EA44'; - } -} -.game-icon-leak { - &:before { - content: '\EA45'; - } -} -.game-icon-lily-pads { - &:before { - content: '\EA46'; - } -} -.game-icon-liquid-soap { - &:before { - content: '\EA47'; - } -} -.game-icon-plant-watering { - &:before { - content: '\EA48'; - } -} -.game-icon-shower { - &:before { - content: '\EA49'; - } -} -.game-icon-tap { - &:before { - content: '\EA4A'; - } -} -.game-icon-water-bottle { - &:before { - content: '\EA4B'; - } -} -.game-icon-water-gallon { - &:before { - content: '\EA4C'; - } -} -.game-icon-water-gun { - &:before { - content: '\EA4D'; - } -} -.game-icon-acid-blob { - &:before { - content: '\EA4E'; - } -} -.game-icon-beer-stein { - &:before { - content: '\EA4F'; - } -} -.game-icon-bleeding-eye { - &:before { - content: '\EA50'; - } -} -.game-icon-boiling-bubbles { - &:before { - content: '\EA51'; - } -} -.game-icon-bubbles { - &:before { - content: '\EA52'; - } -} -.game-icon-burst-blob { - &:before { - content: '\EA53'; - } -} -.game-icon-chemical-drop { - &:before { - content: '\EA54'; - } -} -.game-icon-dew { - &:before { - content: '\EA55'; - } -} -.game-icon-drink-me { - &:before { - content: '\EA56'; - } -} -.game-icon-dripping-blade { - &:before { - content: '\EA57'; - } -} -.game-icon-dripping-goo { - &:before { - content: '\EA58'; - } -} -.game-icon-dripping-star { - &:before { - content: '\EA59'; - } -} -.game-icon-dripping-stone { - &:before { - content: '\EA5A'; - } -} -.game-icon-dripping-sword { - &:before { - content: '\EA5B'; - } -} -.game-icon-drop { - &:before { - content: '\EA5C'; - } -} -.game-icon-droplet-splash { - &:before { - content: '\EA5D'; - } -} -.game-icon-droplets { - &:before { - content: '\EA5E'; - } -} -.game-icon-eyedropper { - &:before { - content: '\EA5F'; - } -} -.game-icon-foam { - &:before { - content: '\EA60'; - } -} -.game-icon-gloop { - &:before { - content: '\EA61'; - } -} -.game-icon-goo-explosion { - &:before { - content: '\EA62'; - } -} -.game-icon-goo-skull { - &:before { - content: '\EA63'; - } -} -.game-icon-goo-spurt { - &:before { - content: '\EA64'; - } -} -.game-icon-gooey-impact { - &:before { - content: '\EA65'; - } -} -.game-icon-gooey-molecule { - &:before { - content: '\EA66'; - } -} -.game-icon-gooey-sword { - &:before { - content: '\EA67'; - } -} -.game-icon-grease-trap { - &:before { - content: '\EA68'; - } -} -.game-icon-grouped-drops { - &:before { - content: '\EA69'; - } -} -.game-icon-heart-drop { - &:before { - content: '\EA6A'; - } -} -.game-icon-heavy-rain { - &:before { - content: '\EA6B'; - } -} -.game-icon-hypodermic-test { - &:before { - content: '\EA6C'; - } -} -.game-icon-kaleidoscope-pearls { - &:before { - content: '\EA6D'; - } -} -.game-icon-marrow-drain { - &:before { - content: '\EA6E'; - } -} -.game-icon-oily-spiral { - &:before { - content: '\EA6F'; - } -} -.game-icon-poison-bottle { - &:before { - content: '\EA70'; - } -} -.game-icon-spatter { - &:before { - content: '\EA71'; - } -} -.game-icon-spill { - &:before { - content: '\EA72'; - } -} -.game-icon-splash { - &:before { - content: '\EA73'; - } -} -.game-icon-splashy-stream { - &:before { - content: '\EA74'; - } -} -.game-icon-splurt { - &:before { - content: '\EA75'; - } -} -.game-icon-transparent-tubes { - &:before { - content: '\EA76'; - } -} -.game-icon-water-bolt { - &:before { - content: '\EA77'; - } -} -.game-icon-milk-carton { - &:before { - content: '\EA78'; - } -} -.game-icon-acid { - &:before { - content: '\EA79'; - } -} -.game-icon-water-drop { - &:before { - content: '\EA7A'; - } -} -.game-icon-blood { - &:before { - content: '\EA7B'; - } -} -.game-icon-skull-sabertooth { - &:before { - content: '\EA7C'; - } -} -.game-icon-calavera { - &:before { - content: '\EA7D'; - } -} -.game-icon-alien-skull { - &:before { - content: '\EA7E'; - } -} -.game-icon-blade-bite { - &:before { - content: '\EA7F'; - } -} -.game-icon-bone-gnawer { - &:before { - content: '\EA80'; - } -} -.game-icon-broken-skull { - &:before { - content: '\EA81'; - } -} -.game-icon-chewed-skull { - &:before { - content: '\EA82'; - } -} -.game-icon-chopped-skull { - &:before { - content: '\EA83'; - } -} -.game-icon-condylura-skull { - &:before { - content: '\EA84'; - } -} -.game-icon-death-note { - &:before { - content: '\EA85'; - } -} -.game-icon-deathcab { - &:before { - content: '\EA86'; - } -} -.game-icon-dread-skull { - &:before { - content: '\EA87'; - } -} -.game-icon-fanged-skull { - &:before { - content: '\EA88'; - } -} -.game-icon-happy-skull { - &:before { - content: '\EA89'; - } -} -.game-icon-harry-potter-skull { - &:before { - content: '\EA8A'; - } -} -.game-icon-leaky-skull { - &:before { - content: '\EA8B'; - } -} -.game-icon-morbid-humour { - &:before { - content: '\EA8C'; - } -} -.game-icon-piece-skull { - &:before { - content: '\EA8D'; - } -} -.game-icon-pirate-skull { - &:before { - content: '\EA8E'; - } -} -.game-icon-sharped-teeth-skull { - &:before { - content: '\EA8F'; - } -} -.game-icon-skeleton-key { - &:before { - content: '\EA90'; - } -} -.game-icon-skull-bolt { - &:before { - content: '\EA91'; - } -} -.game-icon-skull-crack { - &:before { - content: '\EA92'; - } -} -.game-icon-skull-in-jar { - &:before { - content: '\EA93'; - } -} -.game-icon-skull-mask { - &:before { - content: '\EA94'; - } -} -.game-icon-skull-slices { - &:before { - content: '\EA95'; - } -} -.game-icon-spade-skull { - &:before { - content: '\EA96'; - } -} -.game-icon-star-skull { - &:before { - content: '\EA97'; - } -} -.game-icon-tentacles-skull { - &:before { - content: '\EA98'; - } -} -.game-icon-thunder-skull { - &:before { - content: '\EA99'; - } -} -.game-icon-triple-skulls { - &:before { - content: '\EA9A'; - } -} -.game-icon-death-skull { - &:before { - content: '\EA9B'; - } -} -.game-icon-skull-with-syringe { - &:before { - content: '\EA9C'; - } -} -.game-icon-bacon { - &:before { - content: '\EA9D'; - } -} -.game-icon-kebab-spit { - &:before { - content: '\EA9E'; - } -} -.game-icon-sausage { - &:before { - content: '\EA9F'; - } -} -.game-icon-sausages-ribbon { - &:before { - content: '\EAA0'; - } -} -.game-icon-sliced-sausage { - &:before { - content: '\EAA1'; - } -} -.game-icon-steak { - &:before { - content: '\EAA2'; - } -} -.game-icon-meat { - &:before { - content: '\EAA3'; - } -} -.game-icon-ham-shank { - &:before { - content: '\EAA4'; - } -} -.game-icon-berries-bowl { - &:before { - content: '\EAA5'; - } -} -.game-icon-bindle { - &:before { - content: '\EAA6'; - } -} -.game-icon-bone-knife { - &:before { - content: '\EAA7'; - } -} -.game-icon-clay-brick { - &:before { - content: '\EAA8'; - } -} -.game-icon-dolmen { - &:before { - content: '\EAA9'; - } -} -.game-icon-fur-shirt { - &:before { - content: '\EAAA'; - } -} -.game-icon-silex { - &:before { - content: '\EAAB'; - } -} -.game-icon-stone-wheel { - &:before { - content: '\EAAC'; - } -} -.game-icon-bone-knife-2 { - &:before { - content: '\EAAD'; - } -} -.game-icon-broken-bone { - &:before { - content: '\EAAE'; - } -} -.game-icon-broken-tablet { - &:before { - content: '\EAAF'; - } -} -.game-icon-rock-2 { - &:before { - content: '\EAB0'; - } -} -.game-icon-stone-axe { - &:before { - content: '\EAB1'; - } -} -.game-icon-stone-tablet { - &:before { - content: '\EAB2'; - } -} -.game-icon-cactus { - &:before { - content: '\EAB3'; - } -} -.game-icon-cleaver { - &:before { - content: '\EAB4'; - } -} -.game-icon-heart-stake { - &:before { - content: '\EAB5'; - } -} -.game-icon-pitchfork { - &:before { - content: '\EAB6'; - } -} -.game-icon-safety-pin { - &:before { - content: '\EAB7'; - } -} -.game-icon-shattered-heart { - &:before { - content: '\EAB8'; - } -} -.game-icon-spiked-shoulder-armor { - &:before { - content: '\EAB9'; - } -} -.game-icon-spiky-pit { - &:before { - content: '\EABA'; - } -} -.game-icon-air-zigzag { - &:before { - content: '\EABB'; - } -} -.game-icon-alligator-clip { - &:before { - content: '\EABC'; - } -} -.game-icon-armoured-shell { - &:before { - content: '\EABD'; - } -} -.game-icon-atomic-slashes { - &:before { - content: '\EABE'; - } -} -.game-icon-bleeding-heart { - &:before { - content: '\EABF'; - } -} -.game-icon-burning-round-shot { - &:before { - content: '\EAC0'; - } -} -.game-icon-circle-claws { - &:before { - content: '\EAC1'; - } -} -.game-icon-claw-slashes { - &:before { - content: '\EAC2'; - } -} -.game-icon-cracked-ball-dunk { - &:before { - content: '\EAC3'; - } -} -.game-icon-cracked-disc { - &:before { - content: '\EAC4'; - } -} -.game-icon-cracked-glass { - &:before { - content: '\EAC5'; - } -} -.game-icon-cracked-mask { - &:before { - content: '\EAC6'; - } -} -.game-icon-cracked-saber { - &:before { - content: '\EAC7'; - } -} -.game-icon-crossed-air-flows { - &:before { - content: '\EAC8'; - } -} -.game-icon-crossed-slashes { - &:before { - content: '\EAC9'; - } -} -.game-icon-earth-spit { - &:before { - content: '\EACA'; - } -} -.game-icon-eclipse-saw { - &:before { - content: '\EACB'; - } -} -.game-icon-edge-crack { - &:before { - content: '\EACC'; - } -} -.game-icon-fangs-circle { - &:before { - content: '\EACD'; - } -} -.game-icon-groundbreaker { - &:before { - content: '\EACE'; - } -} -.game-icon-large-wound { - &:before { - content: '\EACF'; - } -} -.game-icon-light-thorny-triskelion { - &:before { - content: '\EAD0'; - } -} -.game-icon-mantrap { - &:before { - content: '\EAD1'; - } -} -.game-icon-mighty-spanner { - &:before { - content: '\EAD2'; - } -} -.game-icon-needle-jaws { - &:before { - content: '\EAD3'; - } -} -.game-icon-quick-slash { - &:before { - content: '\EAD4'; - } -} -.game-icon-rough-wound { - &:before { - content: '\EAD5'; - } -} -.game-icon-serrated-slash { - &:before { - content: '\EAD6'; - } -} -.game-icon-shatter { - &:before { - content: '\EAD7'; - } -} -.game-icon-shattered-sword { - &:before { - content: '\EAD8'; - } -} -.game-icon-spiked-armor { - &:before { - content: '\EAD9'; - } -} -.game-icon-spiked-fence { - &:before { - content: '\EADA'; - } -} -.game-icon-spiked-shell { - &:before { - content: '\EADB'; - } -} -.game-icon-spiked-tail { - &:before { - content: '\EADC'; - } -} -.game-icon-spiked-tentacle { - &:before { - content: '\EADD'; - } -} -.game-icon-spiky-eclipse { - &:before { - content: '\EADE'; - } -} -.game-icon-spiky-explosion { - &:before { - content: '\EADF'; - } -} -.game-icon-striking-diamonds { - &:before { - content: '\EAE0'; - } -} -.game-icon-swan-breeze { - &:before { - content: '\EAE1'; - } -} -.game-icon-swirl-ring { - &:before { - content: '\EAE2'; - } -} -.game-icon-swirl-string { - &:before { - content: '\EAE3'; - } -} -.game-icon-sword-break { - &:before { - content: '\EAE4'; - } -} -.game-icon-tension-snowflake { - &:before { - content: '\EAE5'; - } -} -.game-icon-tornado-discs { - &:before { - content: '\EAE6'; - } -} -.game-icon-triple-claws { - &:before { - content: '\EAE7'; - } -} -.game-icon-triple-needle { - &:before { - content: '\EAE8'; - } -} -.game-icon-unstable-projectile { - &:before { - content: '\EAE9'; - } -} -.game-icon-whiplash { - &:before { - content: '\EAEA'; - } -} -.game-icon-wind-slap { - &:before { - content: '\EAEB'; - } -} -.game-icon-wolf-trap { - &:before { - content: '\EAEC'; - } -} -.game-icon-wrapped-heart { - &:before { - content: '\EAED'; - } -} -.game-icon-spikeball { - &:before { - content: '\EAEE'; - } -} -.game-icon-spikes-full { - &:before { - content: '\EAEF'; - } -} -.game-icon-spikes-half { - &:before { - content: '\EAF0'; - } -} -.game-icon-spikes-init { - &:before { - content: '\EAF1'; - } -} -.game-icon-spikes { - &:before { - content: '\EAF2'; - } -} -.game-icon-trigger-hurt { - &:before { - content: '\EAF3'; - } -} -.game-icon-bat-mask { - &:before { - content: '\EAF4'; - } -} -.game-icon-cadillac-helm { - &:before { - content: '\EAF5'; - } -} -.game-icon-carnival-mask { - &:before { - content: '\EAF6'; - } -} -.game-icon-ceremonial-mask { - &:before { - content: '\EAF7'; - } -} -.game-icon-cyborg-face { - &:before { - content: '\EAF8'; - } -} -.game-icon-jason-mask { - &:before { - content: '\EAF9'; - } -} -.game-icon-king-ju-mask { - &:before { - content: '\EAFA'; - } -} -.game-icon-luchador { - &:before { - content: '\EAFB'; - } -} -.game-icon-mighty-boosh { - &:before { - content: '\EAFC'; - } -} -.game-icon-pharoah { - &:before { - content: '\EAFD'; - } -} -.game-icon-protection-glasses { - &:before { - content: '\EAFE'; - } -} -.game-icon-soul-vessel { - &:before { - content: '\EAFF'; - } -} -.game-icon-spider-mask { - &:before { - content: '\EB00'; - } -} -.game-icon-vr-headset { - &:before { - content: '\EB01'; - } -} -.game-icon-android-mask { - &:before { - content: '\EB02'; - } -} -.game-icon-architect-mask { - &:before { - content: '\EB03'; - } -} -.game-icon-curly-mask { - &:before { - content: '\EB04'; - } -} -.game-icon-domino-mask { - &:before { - content: '\EB05'; - } -} -.game-icon-duality-mask { - &:before { - content: '\EB06'; - } -} -.game-icon-lightning-mask { - &:before { - content: '\EB07'; - } -} -.game-icon-trap-mask { - &:before { - content: '\EB08'; - } -} -.game-icon-cultist-2 { - &:before { - content: '\EB09'; - } -} -.game-icon-gas-mask-2 { - &:before { - content: '\EB0A'; - } -} -.game-icon-carambola { - &:before { - content: '\EB0B'; - } -} -.game-icon-falling-star { - &:before { - content: '\EB0C'; - } -} -.game-icon-flower-star { - &:before { - content: '\EB0D'; - } -} -.game-icon-galaxy { - &:before { - content: '\EB0E'; - } -} -.game-icon-knocked-out-stars { - &:before { - content: '\EB0F'; - } -} -.game-icon-polar-star { - &:before { - content: '\EB10'; - } -} -.game-icon-round-star { - &:before { - content: '\EB11'; - } -} -.game-icon-seven-pointed-star { - &:before { - content: '\EB12'; - } -} -.game-icon-solar-system { - &:before { - content: '\EB13'; - } -} -.game-icon-solar-time { - &:before { - content: '\EB14'; - } -} -.game-icon-sparkles { - &:before { - content: '\EB15'; - } -} -.game-icon-star-altar { - &:before { - content: '\EB16'; - } -} -.game-icon-star-formation { - &:before { - content: '\EB17'; - } -} -.game-icon-star-key { - &:before { - content: '\EB18'; - } -} -.game-icon-star-medal { - &:before { - content: '\EB19'; - } -} -.game-icon-stars-stack { - &:before { - content: '\EB1A'; - } -} -.game-icon-sun-cloud { - &:before { - content: '\EB1B'; - } -} -.game-icon-sunflower { - &:before { - content: '\EB1C'; - } -} -.game-icon-thermometer-hot { - &:before { - content: '\EB1D'; - } -} -.game-icon-ursa-major { - &:before { - content: '\EB1E'; - } -} -.game-icon-barbed-star { - &:before { - content: '\EB1F'; - } -} -.game-icon-boomerang-sun { - &:before { - content: '\EB20'; - } -} -.game-icon-circle-sparks { - &:before { - content: '\EB21'; - } -} -.game-icon-cross-flare { - &:before { - content: '\EB22'; - } -} -.game-icon-eclipse-flare { - &:before { - content: '\EB23'; - } -} -.game-icon-flat-star { - &:before { - content: '\EB24'; - } -} -.game-icon-flexible-star { - &:before { - content: '\EB25'; - } -} -.game-icon-lotus-flower { - &:before { - content: '\EB26'; - } -} -.game-icon-orbital-rays { - &:before { - content: '\EB27'; - } -} -.game-icon-rainbow-star { - &:before { - content: '\EB28'; - } -} -.game-icon-shiny-iris { - &:before { - content: '\EB29'; - } -} -.game-icon-star-cycle { - &:before { - content: '\EB2A'; - } -} -.game-icon-star-prominences { - &:before { - content: '\EB2B'; - } -} -.game-icon-star-pupil { - &:before { - content: '\EB2C'; - } -} -.game-icon-star-sattelites { - &:before { - content: '\EB2D'; - } -} -.game-icon-star-swirl { - &:before { - content: '\EB2E'; - } -} -.game-icon-sun-radiations { - &:before { - content: '\EB2F'; - } -} -.game-icon-wrapping-star { - &:before { - content: '\EB30'; - } -} -.game-icon-splash-2 { - &:before { - content: '\EB31'; - } -} -.game-icon-solar-power { - &:before { - content: '\EB32'; - } -} -.game-icon-on-sight { - &:before { - content: '\EB33'; - } -} -.game-icon-convergence-target { - &:before { - content: '\EB34'; - } -} -.game-icon-crosshair { - &:before { - content: '\EB35'; - } -} -.game-icon-dice-target { - &:before { - content: '\EB36'; - } -} -.game-icon-eye-target { - &:before { - content: '\EB37'; - } -} -.game-icon-human-target { - &:before { - content: '\EB38'; - } -} -.game-icon-multiple-targets { - &:before { - content: '\EB39'; - } -} -.game-icon-target-poster { - &:before { - content: '\EB3A'; - } -} -.game-icon-triangle-target { - &:before { - content: '\EB3B'; - } -} -.game-icon-head-shot { - &:before { - content: '\EB3C'; - } -} -.game-icon-select { - &:before { - content: '\EB3D'; - } -} -.game-icon-target-laser { - &:before { - content: '\EB3E'; - } -} -.game-icon-targeted { - &:before { - content: '\EB3F'; - } -} -.game-icon-agave { - &:before { - content: '\EB40'; - } -} -.game-icon-cactus-pot { - &:before { - content: '\EB41'; - } -} -.game-icon-cantua { - &:before { - content: '\EB42'; - } -} -.game-icon-carrot { - &:before { - content: '\EB43'; - } -} -.game-icon-coffee-beans { - &:before { - content: '\EB44'; - } -} -.game-icon-corn { - &:before { - content: '\EB45'; - } -} -.game-icon-cotton-flower { - &:before { - content: '\EB46'; - } -} -.game-icon-dandelion-flower { - &:before { - content: '\EB47'; - } -} -.game-icon-fern { - &:before { - content: '\EB48'; - } -} -.game-icon-fertilizer-bag { - &:before { - content: '\EB49'; - } -} -.game-icon-flax { - &:before { - content: '\EB4A'; - } -} -.game-icon-garlic { - &:before { - content: '\EB4B'; - } -} -.game-icon-ginkgo-leaf { - &:before { - content: '\EB4C'; - } -} -.game-icon-grain-bundle { - &:before { - content: '\EB4D'; - } -} -.game-icon-grain { - &:before { - content: '\EB4E'; - } -} -.game-icon-green-power { - &:before { - content: '\EB4F'; - } -} -.game-icon-hemp { - &:before { - content: '\EB50'; - } -} -.game-icon-hops { - &:before { - content: '\EB51'; - } -} -.game-icon-jasmine { - &:before { - content: '\EB52'; - } -} -.game-icon-monstera-leaf { - &:before { - content: '\EB53'; - } -} -.game-icon-papyrus { - &:before { - content: '\EB54'; - } -} -.game-icon-plant-roots { - &:before { - content: '\EB55'; - } -} -.game-icon-reed { - &:before { - content: '\EB56'; - } -} -.game-icon-round-straw-bale { - &:before { - content: '\EB57'; - } -} -.game-icon-seedling { - &:before { - content: '\EB58'; - } -} -.game-icon-shamrock { - &:before { - content: '\EB59'; - } -} -.game-icon-sugar-cane { - &:before { - content: '\EB5A'; - } -} -.game-icon-tumbleweed { - &:before { - content: '\EB5B'; - } -} -.game-icon-vines { - &:before { - content: '\EB5C'; - } -} -.game-icon-aubergine { - &:before { - content: '\EB5D'; - } -} -.game-icon-beanstalk { - &:before { - content: '\EB5E'; - } -} -.game-icon-bud { - &:before { - content: '\EB5F'; - } -} -.game-icon-bulb { - &:before { - content: '\EB60'; - } -} -.game-icon-curling-vines { - &:before { - content: '\EB61'; - } -} -.game-icon-daisy { - &:before { - content: '\EB62'; - } -} -.game-icon-elderberry { - &:before { - content: '\EB63'; - } -} -.game-icon-evil-bud { - &:before { - content: '\EB64'; - } -} -.game-icon-flower-pot { - &:before { - content: '\EB65'; - } -} -.game-icon-ground-sprout { - &:before { - content: '\EB66'; - } -} -.game-icon-leaf-skeleton { - &:before { - content: '\EB67'; - } -} -.game-icon-new-shoot { - &:before { - content: '\EB68'; - } -} -.game-icon-oat { - &:before { - content: '\EB69'; - } -} -.game-icon-pollen-dust { - &:before { - content: '\EB6A'; - } -} -.game-icon-rose { - &:before { - content: '\EB6B'; - } -} -.game-icon-shut-rose { - &:before { - content: '\EB6C'; - } -} -.game-icon-spiral-bloom { - &:before { - content: '\EB6D'; - } -} -.game-icon-spoted-flower { - &:before { - content: '\EB6E'; - } -} -.game-icon-sprout-disc { - &:before { - content: '\EB6F'; - } -} -.game-icon-sprout { - &:before { - content: '\EB70'; - } -} -.game-icon-trefoil-lily { - &:before { - content: '\EB71'; - } -} -.game-icon-twirly-flower { - &:before { - content: '\EB72'; - } -} -.game-icon-vanilla-flower { - &:before { - content: '\EB73'; - } -} -.game-icon-vine-flower { - &:before { - content: '\EB74'; - } -} -.game-icon-vine-whip { - &:before { - content: '\EB75'; - } -} -.game-icon-viola { - &:before { - content: '\EB76'; - } -} -.game-icon-wheat { - &:before { - content: '\EB77'; - } -} -.game-icon-poppy { - &:before { - content: '\EB78'; - } -} -.game-icon-backpack { - &:before { - content: '\EB79'; - } -} -.game-icon-beach-bag { - &:before { - content: '\EB7A'; - } -} -.game-icon-briefcase { - &:before { - content: '\EB7B'; - } -} -.game-icon-chips-bag { - &:before { - content: '\EB7C'; - } -} -.game-icon-disc-golf-bag { - &:before { - content: '\EB7D'; - } -} -.game-icon-duffel-bag { - &:before { - content: '\EB7E'; - } -} -.game-icon-flour { - &:before { - content: '\EB7F'; - } -} -.game-icon-gym-bag { - &:before { - content: '\EB80'; - } -} -.game-icon-hand-bag { - &:before { - content: '\EB81'; - } -} -.game-icon-light-backpack { - &:before { - content: '\EB82'; - } -} -.game-icon-powder-bag { - &:before { - content: '\EB83'; - } -} -.game-icon-school-bag { - &:before { - content: '\EB84'; - } -} -.game-icon-shopping-bag { - &:before { - content: '\EB85'; - } -} -.game-icon-suitcase { - &:before { - content: '\EB86'; - } -} -.game-icon-knapsack { - &:before { - content: '\EB87'; - } -} -.game-icon-shiny-purse { - &:before { - content: '\EB88'; - } -} -.game-icon-swap-bag { - &:before { - content: '\EB89'; - } -} -.game-icon-coins-pile { - &:before { - content: '\EB8A'; - } -} -.game-icon-gold-nuggets { - &:before { - content: '\EB8B'; - } -} -.game-icon-money-stack { - &:before { - content: '\EB8C'; - } -} -.game-icon-piggy-bank { - &:before { - content: '\EB8D'; - } -} -.game-icon-price-tag { - &:before { - content: '\EB8E'; - } -} -.game-icon-swipe-card { - &:before { - content: '\EB8F'; - } -} -.game-icon-ticket { - &:before { - content: '\EB90'; - } -} -.game-icon-wallet { - &:before { - content: '\EB91'; - } -} -.game-icon-knee-cap { - &:before { - content: '\EB92'; - } -} -.game-icon-pelvis-bone { - &:before { - content: '\EB93'; - } -} -.game-icon-backbone-shell { - &:before { - content: '\EB94'; - } -} -.game-icon-crossed-bones { - &:before { - content: '\EB95'; - } -} -.game-icon-horn-internal { - &:before { - content: '\EB96'; - } -} -.game-icon-jawbone { - &:before { - content: '\EB97'; - } -} -.game-icon-ribcage { - &:before { - content: '\EB98'; - } -} -.game-icon-spinal-coil { - &:before { - content: '\EB99'; - } -} -.game-icon-joint { - &:before { - content: '\EB9A'; - } -} -.game-icon-swirled-shell { - &:before { - content: '\EB9B'; - } -} -.game-icon-bolt-bomb { - &:before { - content: '\EB9C'; - } -} -.game-icon-dynamite { - &:before { - content: '\EB9D'; - } -} -.game-icon-falling-bomb { - &:before { - content: '\EB9E'; - } -} -.game-icon-holy-hand-grenade { - &:before { - content: '\EB9F'; - } -} -.game-icon-time-dynamite { - &:before { - content: '\EBA0'; - } -} -.game-icon-cluster-bomb { - &:before { - content: '\EBA1'; - } -} -.game-icon-fission { - &:before { - content: '\EBA2'; - } -} -.game-icon-land-mine { - &:before { - content: '\EBA3'; - } -} -.game-icon-letter-bomb { - &:before { - content: '\EBA4'; - } -} -.game-icon-paper-bomb { - &:before { - content: '\EBA5'; - } -} -.game-icon-rolling-bomb { - &:before { - content: '\EBA6'; - } -} -.game-icon-sparky-bomb { - &:before { - content: '\EBA7'; - } -} -.game-icon-squib { - &:before { - content: '\EBA8'; - } -} -.game-icon-time-bomb { - &:before { - content: '\EBA9'; - } -} -.game-icon-unlit-bomb { - &:before { - content: '\EBAA'; - } -} -.game-icon-bundle-grenade { - &:before { - content: '\EBAB'; - } -} -.game-icon-minefield { - &:before { - content: '\EBAC'; - } -} -.game-icon-ballerina-shoes { - &:before { - content: '\EBAD'; - } -} -.game-icon-banana-peel { - &:before { - content: '\EBAE'; - } -} -.game-icon-chelsea-boot { - &:before { - content: '\EBAF'; - } -} -.game-icon-converse-shoe { - &:before { - content: '\EBB0'; - } -} -.game-icon-cowboy-boot { - &:before { - content: '\EBB1'; - } -} -.game-icon-female-legs { - &:before { - content: '\EBB2'; - } -} -.game-icon-flip-flops { - &:before { - content: '\EBB3'; - } -} -.game-icon-hieroglyph-legs { - &:before { - content: '\EBB4'; - } -} -.game-icon-high-heel { - &:before { - content: '\EBB5'; - } -} -.game-icon-leg-armor { - &:before { - content: '\EBB6'; - } -} -.game-icon-leg { - &:before { - content: '\EBB7'; - } -} -.game-icon-roller-skate { - &:before { - content: '\EBB8'; - } -} -.game-icon-rubber-boot { - &:before { - content: '\EBB9'; - } -} -.game-icon-running-shoe { - &:before { - content: '\EBBA'; - } -} -.game-icon-slippers { - &:before { - content: '\EBBB'; - } -} -.game-icon-socks { - &:before { - content: '\EBBC'; - } -} -.game-icon-sonic-shoes { - &:before { - content: '\EBBD'; - } -} -.game-icon-sticky-boot { - &:before { - content: '\EBBE'; - } -} -.game-icon-barefoot { - &:before { - content: '\EBBF'; - } -} -.game-icon-boot-prints { - &:before { - content: '\EBC0'; - } -} -.game-icon-boots { - &:before { - content: '\EBC1'; - } -} -.game-icon-foot-trip { - &:before { - content: '\EBC2'; - } -} -.game-icon-footprint { - &:before { - content: '\EBC3'; - } -} -.game-icon-leather-boot { - &:before { - content: '\EBC4'; - } -} -.game-icon-nailed-foot { - &:before { - content: '\EBC5'; - } -} -.game-icon-quake-stomp { - &:before { - content: '\EBC6'; - } -} -.game-icon-tread { - &:before { - content: '\EBC7'; - } -} -.game-icon-tripwire { - &:before { - content: '\EBC8'; - } -} -.game-icon-walking-boot { - &:before { - content: '\EBC9'; - } -} -.game-icon-beet { - &:before { - content: '\EBCA'; - } -} -.game-icon-super-mushroom { - &:before { - content: '\EBCB'; - } -} -.game-icon-minerals { - &:before { - content: '\EBCC'; - } -} -.game-icon-ore { - &:before { - content: '\EBCD'; - } -} -.game-icon-crystal-shrine { - &:before { - content: '\EBCE'; - } -} -.game-icon-diamond-trophy { - &:before { - content: '\EBCF'; - } -} -.game-icon-mineral-pearls { - &:before { - content: '\EBD0'; - } -} -.game-icon-checkered-diamond { - &:before { - content: '\EBD1'; - } -} -.game-icon-crystal-bars { - &:before { - content: '\EBD2'; - } -} -.game-icon-crystal-cluster { - &:before { - content: '\EBD3'; - } -} -.game-icon-crystal-eye { - &:before { - content: '\EBD4'; - } -} -.game-icon-crystal-shine { - &:before { - content: '\EBD5'; - } -} -.game-icon-diamond-hard { - &:before { - content: '\EBD6'; - } -} -.game-icon-floating-crystal { - &:before { - content: '\EBD7'; - } -} -.game-icon-gems { - &:before { - content: '\EBD8'; - } -} -.game-icon-mineral-heart { - &:before { - content: '\EBD9'; - } -} -.game-icon-fossil { - &:before { - content: '\EBDA'; - } -} -.game-icon-gold-shell { - &:before { - content: '\EBDB'; - } -} -.game-icon-scallop { - &:before { - content: '\EBDC'; - } -} -.game-icon-sewed-shell { - &:before { - content: '\EBDD'; - } -} -.game-icon-spiral-shell { - &:before { - content: '\EBDE'; - } -} -.game-icon-triple-shells { - &:before { - content: '\EBDF'; - } -} -.game-icon-twin-shell { - &:before { - content: '\EBE0'; - } -} -.game-icon-asteroid { - &:before { - content: '\EBE1'; - } -} -.game-icon-colombian-statue { - &:before { - content: '\EBE2'; - } -} -.game-icon-dig-hole { - &:before { - content: '\EBE3'; - } -} -.game-icon-falling-rocks { - &:before { - content: '\EBE4'; - } -} -.game-icon-stone-bridge { - &:before { - content: '\EBE5'; - } -} -.game-icon-stone-pile { - &:before { - content: '\EBE6'; - } -} -.game-icon-bridge { - &:before { - content: '\EBE7'; - } -} -.game-icon-crags { - &:before { - content: '\EBE8'; - } -} -.game-icon-meteor-impact { - &:before { - content: '\EBE9'; - } -} -.game-icon-rune-stone { - &:before { - content: '\EBEA'; - } -} -.game-icon-stone-block { - &:before { - content: '\EBEB'; - } -} -.game-icon-stone-sphere { - &:before { - content: '\EBEC'; - } -} -.game-icon-stone-throne { - &:before { - content: '\EBED'; - } -} -.game-icon-bow-tie-ribbon { - &:before { - content: '\EBEE'; - } -} -.game-icon-champagne-cork { - &:before { - content: '\EBEF'; - } -} -.game-icon-champions { - &:before { - content: '\EBF0'; - } -} -.game-icon-diploma { - &:before { - content: '\EBF1'; - } -} -.game-icon-family-tree { - &:before { - content: '\EBF2'; - } -} -.game-icon-finish-line { - &:before { - content: '\EBF3'; - } -} -.game-icon-histogram { - &:before { - content: '\EBF4'; - } -} -.game-icon-laurels-trophy { - &:before { - content: '\EBF5'; - } -} -.game-icon-network-bars { - &:before { - content: '\EBF6'; - } -} -.game-icon-organigram { - &:before { - content: '\EBF7'; - } -} -.game-icon-podium-second { - &:before { - content: '\EBF8'; - } -} -.game-icon-podium-third { - &:before { - content: '\EBF9'; - } -} -.game-icon-podium-winner { - &:before { - content: '\EBFA'; - } -} -.game-icon-podium { - &:before { - content: '\EBFB'; - } -} -.game-icon-private-first-class { - &:before { - content: '\EBFC'; - } -} -.game-icon-private { - &:before { - content: '\EBFD'; - } -} -.game-icon-ribbon-medal { - &:before { - content: '\EBFE'; - } -} -.game-icon-sergeant { - &:before { - content: '\EBFF'; - } -} -.game-icon-sport-medal { - &:before { - content: '\EC00'; - } -} -.game-icon-trophies-shelf { - &:before { - content: '\EC01'; - } -} -.game-icon-trophy-cup { - &:before { - content: '\EC02'; - } -} -.game-icon-level-four-advanced { - &:before { - content: '\EC03'; - } -} -.game-icon-level-four { - &:before { - content: '\EC04'; - } -} -.game-icon-level-three-advanced { - &:before { - content: '\EC05'; - } -} -.game-icon-level-three { - &:before { - content: '\EC06'; - } -} -.game-icon-level-two-advanced { - &:before { - content: '\EC07'; - } -} -.game-icon-level-two { - &:before { - content: '\EC08'; - } -} -.game-icon-achievement { - &:before { - content: '\EC09'; - } -} -.game-icon-rank-1 { - &:before { - content: '\EC0A'; - } -} -.game-icon-rank-2 { - &:before { - content: '\EC0B'; - } -} -.game-icon-rank-3 { - &:before { - content: '\EC0C'; - } -} -.game-icon-3d-hammer { - &:before { - content: '\EC0D'; - } -} -.game-icon-aspergillum { - &:before { - content: '\EC0E'; - } -} -.game-icon-box-cutter { - &:before { - content: '\EC0F'; - } -} -.game-icon-broom { - &:before { - content: '\EC10'; - } -} -.game-icon-clamp { - &:before { - content: '\EC11'; - } -} -.game-icon-crook-flail { - &:before { - content: '\EC12'; - } -} -.game-icon-gardening-shears { - &:before { - content: '\EC13'; - } -} -.game-icon-hair-strands { - &:before { - content: '\EC14'; - } -} -.game-icon-hammer-break { - &:before { - content: '\EC15'; - } -} -.game-icon-hole-ladder { - &:before { - content: '\EC16'; - } -} -.game-icon-hook { - &:before { - content: '\EC17'; - } -} -.game-icon-injustice { - &:before { - content: '\EC18'; - } -} -.game-icon-ladders-platform { - &:before { - content: '\EC19'; - } -} -.game-icon-large-paint-brush { - &:before { - content: '\EC1A'; - } -} -.game-icon-lockpicks { - &:before { - content: '\EC1B'; - } -} -.game-icon-paint-brush { - &:before { - content: '\EC1C'; - } -} -.game-icon-paint-bucket { - &:before { - content: '\EC1D'; - } -} -.game-icon-paint-roller { - &:before { - content: '\EC1E'; - } -} -.game-icon-plow { - &:before { - content: '\EC1F'; - } -} -.game-icon-plunger { - &:before { - content: '\EC20'; - } -} -.game-icon-rake { - &:before { - content: '\EC21'; - } -} -.game-icon-shears { - &:before { - content: '\EC22'; - } -} -.game-icon-swiss-army-knife { - &:before { - content: '\EC23'; - } -} -.game-icon-toy-mallet { - &:before { - content: '\EC24'; - } -} -.game-icon-trowel { - &:before { - content: '\EC25'; - } -} -.game-icon-weight { - &:before { - content: '\EC26'; - } -} -.game-icon-claw-hammer { - &:before { - content: '\EC27'; - } -} -.game-icon-dig-dug { - &:before { - content: '\EC28'; - } -} -.game-icon-fishhook-fork { - &:before { - content: '\EC29'; - } -} -.game-icon-flat-hammer { - &:before { - content: '\EC2A'; - } -} -.game-icon-gavel { - &:before { - content: '\EC2B'; - } -} -.game-icon-gear-hammer { - &:before { - content: '\EC2C'; - } -} -.game-icon-hammer-drop { - &:before { - content: '\EC2D'; - } -} -.game-icon-hammer-nails { - &:before { - content: '\EC2E'; - } -} -.game-icon-lightning-spanner { - &:before { - content: '\EC2F'; - } -} -.game-icon-scissors-2 { - &:before { - content: '\EC30'; - } -} -.game-icon-screwdriver { - &:before { - content: '\EC31'; - } -} -.game-icon-sewing-needle { - &:before { - content: '\EC32'; - } -} -.game-icon-spade { - &:before { - content: '\EC33'; - } -} -.game-icon-spanner { - &:before { - content: '\EC34'; - } -} -.game-icon-sword-smithing { - &:before { - content: '\EC35'; - } -} -.game-icon-thermometer-scale { - &:before { - content: '\EC36'; - } -} -.game-icon-tinker { - &:before { - content: '\EC37'; - } -} -.game-icon-trample { - &:before { - content: '\EC38'; - } -} -.game-icon-wrench { - &:before { - content: '\EC39'; - } -} -.game-icon-pause-button { - &:before { - content: '\EC3A'; - } -} -.game-icon-play-button { - &:before { - content: '\EC3B'; - } -} -.game-icon-abacus { - &:before { - content: '\EC3C'; - } -} -.game-icon-calendar { - &:before { - content: '\EC3D'; - } -} -.game-icon-checklist { - &:before { - content: '\EC3E'; - } -} -.game-icon-circle { - &:before { - content: '\EC3F'; - } -} -.game-icon-clapperboard { - &:before { - content: '\EC40'; - } -} -.game-icon-confirmed { - &:before { - content: '\EC41'; - } -} -.game-icon-cube { - &:before { - content: '\EC42'; - } -} -.game-icon-fast-backward-button { - &:before { - content: '\EC43'; - } -} -.game-icon-fast-forward-button { - &:before { - content: '\EC44'; - } -} -.game-icon-files { - &:before { - content: '\EC45'; - } -} -.game-icon-film-projector { - &:before { - content: '\EC46'; - } -} -.game-icon-full-folder { - &:before { - content: '\EC47'; - } -} -.game-icon-funnel { - &:before { - content: '\EC48'; - } -} -.game-icon-gamepad { - &:before { - content: '\EC49'; - } -} -.game-icon-hamburger-menu { - &:before { - content: '\EC4A'; - } -} -.game-icon-highlighter { - &:before { - content: '\EC4B'; - } -} -.game-icon-joystick { - &:before { - content: '\EC4C'; - } -} -.game-icon-keyboard { - &:before { - content: '\EC4D'; - } -} -.game-icon-load { - &:before { - content: '\EC4E'; - } -} -.game-icon-mailbox { - &:before { - content: '\EC4F'; - } -} -.game-icon-mouse-2 { - &:before { - content: '\EC50'; - } -} -.game-icon-newspaper { - &:before { - content: '\EC51'; - } -} -.game-icon-next-button { - &:before { - content: '\EC52'; - } -} -.game-icon-open-folder { - &:before { - content: '\EC53'; - } -} -.game-icon-palette { - &:before { - content: '\EC54'; - } -} -.game-icon-pencil-brush { - &:before { - content: '\EC55'; - } -} -.game-icon-pencil { - &:before { - content: '\EC56'; - } -} -.game-icon-photo-camera { - &:before { - content: '\EC57'; - } -} -.game-icon-pie-chart { - &:before { - content: '\EC58'; - } -} -.game-icon-pin { - &:before { - content: '\EC59'; - } -} -.game-icon-plain-circle { - &:before { - content: '\EC5A'; - } -} -.game-icon-plain-square { - &:before { - content: '\EC5B'; - } -} -.game-icon-previous-button { - &:before { - content: '\EC5C'; - } -} -.game-icon-resize { - &:before { - content: '\EC5D'; - } -} -.game-icon-save { - &:before { - content: '\EC5E'; - } -} -.game-icon-share { - &:before { - content: '\EC5F'; - } -} -.game-icon-shopping-cart { - &:before { - content: '\EC60'; - } -} -.game-icon-square { - &:before { - content: '\EC61'; - } -} -.game-icon-toggles { - &:before { - content: '\EC62'; - } -} -.game-icon-trash-can { - &:before { - content: '\EC63'; - } -} -.game-icon-unbalanced { - &:before { - content: '\EC64'; - } -} -.game-icon-vibrating-smartphone { - &:before { - content: '\EC65'; - } -} -.game-icon-video-camera { - &:before { - content: '\EC66'; - } -} -.game-icon-bookmark { - &:before { - content: '\EC67'; - } -} -.game-icon-envelope { - &:before { - content: '\EC68'; - } -} -.game-icon-open-book { - &:before { - content: '\EC69'; - } -} -.game-icon-retro-controller { - &:before { - content: '\EC6A'; - } -} -.game-icon-smartphone { - &:before { - content: '\EC6B'; - } -} -.game-icon-tablet { - &:before { - content: '\EC6C'; - } -} -.game-icon-soda-can { - &:before { - content: '\EC6D'; - } -} -.game-icon-baby-bottle { - &:before { - content: '\EC6E'; - } -} -.game-icon-beer-bottle { - &:before { - content: '\EC6F'; - } -} -.game-icon-delicate-perfume { - &:before { - content: '\EC70'; - } -} -.game-icon-ketchup { - &:before { - content: '\EC71'; - } -} -.game-icon-water-flask { - &:before { - content: '\EC72'; - } -} -.game-icon-wine-bottle { - &:before { - content: '\EC73'; - } -} -.game-icon-bottled-bolt { - &:before { - content: '\EC74'; - } -} -.game-icon-brandy-bottle { - &:before { - content: '\EC75'; - } -} -.game-icon-bubbling-flask { - &:before { - content: '\EC76'; - } -} -.game-icon-perfume-bottle { - &:before { - content: '\EC77'; - } -} -.game-icon-potion-ball { - &:before { - content: '\EC78'; - } -} -.game-icon-round-bottom-flask { - &:before { - content: '\EC79'; - } -} -.game-icon-spiral-bottle { - &:before { - content: '\EC7A'; - } -} -.game-icon-square-bottle { - &:before { - content: '\EC7B'; - } -} -.game-icon-standing-potion { - &:before { - content: '\EC7C'; - } -} -.game-icon-potion-of-madness { - &:before { - content: '\EC7D'; - } -} -.game-icon-almond { - &:before { - content: '\EC7E'; - } -} -.game-icon-asparagus { - &:before { - content: '\EC7F'; - } -} -.game-icon-avocado { - &:before { - content: '\EC80'; - } -} -.game-icon-banana { - &:before { - content: '\EC81'; - } -} -.game-icon-bread-slice { - &:before { - content: '\EC82'; - } -} -.game-icon-bread { - &:before { - content: '\EC83'; - } -} -.game-icon-candy-canes { - &:before { - content: '\EC84'; - } -} -.game-icon-cherry { - &:before { - content: '\EC85'; - } -} -.game-icon-chili-pepper { - &:before { - content: '\EC86'; - } -} -.game-icon-cookie { - &:before { - content: '\EC87'; - } -} -.game-icon-croissant { - &:before { - content: '\EC88'; - } -} -.game-icon-cupcake { - &:before { - content: '\EC89'; - } -} -.game-icon-dango { - &:before { - content: '\EC8A'; - } -} -.game-icon-doner-kebab { - &:before { - content: '\EC8B'; - } -} -.game-icon-fast-noodles { - &:before { - content: '\EC8C'; - } -} -.game-icon-french-fries { - &:before { - content: '\EC8D'; - } -} -.game-icon-full-pizza { - &:before { - content: '\EC8E'; - } -} -.game-icon-gingerbread-man { - &:before { - content: '\EC8F'; - } -} -.game-icon-hamburger { - &:before { - content: '\EC90'; - } -} -.game-icon-hot-meal { - &:before { - content: '\EC91'; - } -} -.game-icon-jelly-beans { - &:before { - content: '\EC92'; - } -} -.game-icon-jelly { - &:before { - content: '\EC93'; - } -} -.game-icon-kiwi-fruit { - &:before { - content: '\EC94'; - } -} -.game-icon-mushrooms { - &:before { - content: '\EC95'; - } -} -.game-icon-nachos { - &:before { - content: '\EC96'; - } -} -.game-icon-noodles { - &:before { - content: '\EC97'; - } -} -.game-icon-oden { - &:before { - content: '\EC98'; - } -} -.game-icon-pear { - &:before { - content: '\EC99'; - } -} -.game-icon-pimiento { - &:before { - content: '\EC9A'; - } -} -.game-icon-pizza-slice { - &:before { - content: '\EC9B'; - } -} -.game-icon-popcorn { - &:before { - content: '\EC9C'; - } -} -.game-icon-potato { - &:before { - content: '\EC9D'; - } -} -.game-icon-pretzel { - &:before { - content: '\EC9E'; - } -} -.game-icon-raw-egg { - &:before { - content: '\EC9F'; - } -} -.game-icon-sandwich { - &:before { - content: '\ECA0'; - } -} -.game-icon-sesame { - &:before { - content: '\ECA1'; - } -} -.game-icon-sliced-mushroom { - &:before { - content: '\ECA2'; - } -} -.game-icon-spiral-lollipop { - &:before { - content: '\ECA3'; - } -} -.game-icon-stairs-cake { - &:before { - content: '\ECA4'; - } -} -.game-icon-stomach { - &:before { - content: '\ECA5'; - } -} -.game-icon-tacos { - &:before { - content: '\ECA6'; - } -} -.game-icon-tangerine { - &:before { - content: '\ECA7'; - } -} -.game-icon-tomato { - &:before { - content: '\ECA8'; - } -} -.game-icon-cake-slice { - &:before { - content: '\ECA9'; - } -} -.game-icon-cheese-wedge { - &:before { - content: '\ECAA'; - } -} -.game-icon-cool-spices { - &:before { - content: '\ECAB'; - } -} -.game-icon-honeypot { - &:before { - content: '\ECAC'; - } -} -.game-icon-meat-hook { - &:before { - content: '\ECAD'; - } -} -.game-icon-mushroom-gills { - &:before { - content: '\ECAE'; - } -} -.game-icon-mushroom { - &:before { - content: '\ECAF'; - } -} -.game-icon-pie-slice { - &:before { - content: '\ECB0'; - } -} -.game-icon-powder { - &:before { - content: '\ECB1'; - } -} -.game-icon-salt-shaker { - &:before { - content: '\ECB2'; - } -} -.game-icon-shiny-apple { - &:before { - content: '\ECB3'; - } -} -.game-icon-sliced-bread { - &:before { - content: '\ECB4'; - } -} -.game-icon-wrapped-sweet { - &:before { - content: '\ECB5'; - } -} -.game-icon-chocolate-bar { - &:before { - content: '\ECB6'; - } -} -.game-icon-peanut { - &:before { - content: '\ECB7'; - } -} -.game-icon-armored-pants { - &:before { - content: '\ECB8'; - } -} -.game-icon-american-football-player { - &:before { - content: '\ECB9'; - } -} -.game-icon-bracer { - &:before { - content: '\ECBA'; - } -} -.game-icon-cape-armor { - &:before { - content: '\ECBB'; - } -} -.game-icon-chest-armor { - &:before { - content: '\ECBC'; - } -} -.game-icon-elbow-pad { - &:before { - content: '\ECBD'; - } -} -.game-icon-heart-armor { - &:before { - content: '\ECBE'; - } -} -.game-icon-knee-pad { - &:before { - content: '\ECBF'; - } -} -.game-icon-leather-armor { - &:before { - content: '\ECC0'; - } -} -.game-icon-loincloth { - &:before { - content: '\ECC1'; - } -} -.game-icon-metal-skirt { - &:before { - content: '\ECC2'; - } -} -.game-icon-morph-ball { - &:before { - content: '\ECC3'; - } -} -.game-icon-saiyan-suit { - &:before { - content: '\ECC4'; - } -} -.game-icon-armor-vest { - &:before { - content: '\ECC5'; - } -} -.game-icon-breastplate { - &:before { - content: '\ECC6'; - } -} -.game-icon-dorsal-scales { - &:before { - content: '\ECC7'; - } -} -.game-icon-lamellar { - &:before { - content: '\ECC8'; - } -} -.game-icon-leather-vest { - &:before { - content: '\ECC9'; - } -} -.game-icon-mail-shirt { - &:before { - content: '\ECCA'; - } -} -.game-icon-plastron { - &:before { - content: '\ECCB'; - } -} -.game-icon-scale-mail { - &:before { - content: '\ECCC'; - } -} -.game-icon-shoulder-scales { - &:before { - content: '\ECCD'; - } -} -.game-icon-space-suit { - &:before { - content: '\ECCE'; - } -} -.game-icon-bracers { - &:before { - content: '\ECCF'; - } -} -.game-icon-chain-mail { - &:before { - content: '\ECD0'; - } -} -.game-icon-ample-dress { - &:before { - content: '\ECD1'; - } -} -.game-icon-basketball-jersey { - &:before { - content: '\ECD2'; - } -} -.game-icon-bow-tie { - &:before { - content: '\ECD3'; - } -} -.game-icon-cape { - &:before { - content: '\ECD4'; - } -} -.game-icon-clothes { - &:before { - content: '\ECD5'; - } -} -.game-icon-clothespin { - &:before { - content: '\ECD6'; - } -} -.game-icon-hanger { - &:before { - content: '\ECD7'; - } -} -.game-icon-heavy-collar { - &:before { - content: '\ECD8'; - } -} -.game-icon-hoodie { - &:before { - content: '\ECD9'; - } -} -.game-icon-lab-coat { - &:before { - content: '\ECDA'; - } -} -.game-icon-large-dress { - &:before { - content: '\ECDB'; - } -} -.game-icon-moncler-jacket { - &:before { - content: '\ECDC'; - } -} -.game-icon-pirate-coat { - &:before { - content: '\ECDD'; - } -} -.game-icon-polo-shirt { - &:before { - content: '\ECDE'; - } -} -.game-icon-poncho { - &:before { - content: '\ECDF'; - } -} -.game-icon-rolled-cloth { - &:before { - content: '\ECE0'; - } -} -.game-icon-sewing-string { - &:before { - content: '\ECE1'; - } -} -.game-icon-shirt-button { - &:before { - content: '\ECE2'; - } -} -.game-icon-shorts { - &:before { - content: '\ECE3'; - } -} -.game-icon-skirt { - &:before { - content: '\ECE4'; - } -} -.game-icon-sleeveless-jacket { - &:before { - content: '\ECE5'; - } -} -.game-icon-sleeveless-top { - &:before { - content: '\ECE6'; - } -} -.game-icon-t-shirt { - &:before { - content: '\ECE7'; - } -} -.game-icon-tank-top { - &:before { - content: '\ECE8'; - } -} -.game-icon-tie { - &:before { - content: '\ECE9'; - } -} -.game-icon-travel-dress { - &:before { - content: '\ECEA'; - } -} -.game-icon-underwear-shorts { - &:before { - content: '\ECEB'; - } -} -.game-icon-underwear { - &:before { - content: '\ECEC'; - } -} -.game-icon-washing-machine { - &:before { - content: '\ECED'; - } -} -.game-icon-belt { - &:before { - content: '\ECEE'; - } -} -.game-icon-cloak { - &:before { - content: '\ECEF'; - } -} -.game-icon-shirt { - &:before { - content: '\ECF0'; - } -} -.game-icon-trousers { - &:before { - content: '\ECF1'; - } -} -.game-icon-belt-buckles { - &:before { - content: '\ECF2'; - } -} -.game-icon-trousers-2 { - &:before { - content: '\ECF3'; - } -} -.game-icon-dress { - &:before { - content: '\ECF4'; - } -} -.game-icon-bullet-impacts { - &:before { - content: '\ECF5'; - } -} -.game-icon-cowboy-holster { - &:before { - content: '\ECF6'; - } -} -.game-icon-gun-stock { - &:before { - content: '\ECF7'; - } -} -.game-icon-machine-gun-magazine { - &:before { - content: '\ECF8'; - } -} -.game-icon-pirate-cannon { - &:before { - content: '\ECF9'; - } -} -.game-icon-shotgun-rounds { - &:before { - content: '\ECFA'; - } -} -.game-icon-ak47 { - &:before { - content: '\ECFB'; - } -} -.game-icon-ak47u { - &:before { - content: '\ECFC'; - } -} -.game-icon-colt-m1911 { - &:before { - content: '\ECFD'; - } -} -.game-icon-cz-skorpion { - &:before { - content: '\ECFE'; - } -} -.game-icon-desert-eagle { - &:before { - content: '\ECFF'; - } -} -.game-icon-fn-fal { - &:before { - content: '\ED00'; - } -} -.game-icon-m3-grease-gun { - &:before { - content: '\ED01'; - } -} -.game-icon-mac-10 { - &:before { - content: '\ED02'; - } -} -.game-icon-machine-gun { - &:before { - content: '\ED03'; - } -} -.game-icon-mp5-2 { - &:before { - content: '\ED04'; - } -} -.game-icon-mp5k { - &:before { - content: '\ED05'; - } -} -.game-icon-musket { - &:before { - content: '\ED06'; - } -} -.game-icon-p90 { - &:before { - content: '\ED07'; - } -} -.game-icon-revolver-2 { - &:before { - content: '\ED08'; - } -} -.game-icon-spectre-m4 { - &:before { - content: '\ED09'; - } -} -.game-icon-thompson-m1928 { - &:before { - content: '\ED0A'; - } -} -.game-icon-winchester-rifle { - &:before { - content: '\ED0B'; - } -} -.game-icon-3d-glasses { - &:before { - content: '\ED0C'; - } -} -.game-icon-director-chair { - &:before { - content: '\ED0D'; - } -} -.game-icon-inauguration { - &:before { - content: '\ED0E'; - } -} -.game-icon-red-carpet { - &:before { - content: '\ED0F'; - } -} -.game-icon-theater { - &:before { - content: '\ED10'; - } -} -.game-icon-cyber-eye { - &:before { - content: '\ED11'; - } -} -.game-icon-egg-eye { - &:before { - content: '\ED12'; - } -} -.game-icon-eyelashes { - &:before { - content: '\ED13'; - } -} -.game-icon-hunter-eyes { - &:before { - content: '\ED14'; - } -} -.game-icon-lock-spy { - &:before { - content: '\ED15'; - } -} -.game-icon-tired-eye { - &:before { - content: '\ED16'; - } -} -.game-icon-bolt-eye { - &:before { - content: '\ED17'; - } -} -.game-icon-brass-eye { - &:before { - content: '\ED18'; - } -} -.game-icon-croissants-pupil { - &:before { - content: '\ED19'; - } -} -.game-icon-eyeball { - &:before { - content: '\ED1A'; - } -} -.game-icon-falling-eye { - &:before { - content: '\ED1B'; - } -} -.game-icon-lightning-tear { - &:before { - content: '\ED1C'; - } -} -.game-icon-octogonal-eye { - &:before { - content: '\ED1D'; - } -} -.game-icon-semi-closed-eye { - &:before { - content: '\ED1E'; - } -} -.game-icon-sheikah-eye { - &:before { - content: '\ED1F'; - } -} -.game-icon-six-eyes { - &:before { - content: '\ED20'; - } -} -.game-icon-sunken-eye { - &:before { - content: '\ED21'; - } -} -.game-icon-surrounded-eye { - &:before { - content: '\ED22'; - } -} -.game-icon-templar-eye { - &:before { - content: '\ED23'; - } -} -.game-icon-third-eye { - &:before { - content: '\ED24'; - } -} -.game-icon-evil-eyes { - &:before { - content: '\ED25'; - } -} -.game-icon-sight-disabled { - &:before { - content: '\ED26'; - } -} -.game-icon-glass-ball { - &:before { - content: '\ED27'; - } -} -.game-icon-lightning-dome { - &:before { - content: '\ED28'; - } -} -.game-icon-corked-tube { - &:before { - content: '\ED29'; - } -} -.game-icon-crystal-ball { - &:before { - content: '\ED2A'; - } -} -.game-icon-dragon-balls { - &:before { - content: '\ED2B'; - } -} -.game-icon-empty-hourglass { - &:before { - content: '\ED2C'; - } -} -.game-icon-glass-heart { - &:before { - content: '\ED2D'; - } -} -.game-icon-test-tubes { - &:before { - content: '\ED2E'; - } -} -.game-icon-babyfoot-players { - &:before { - content: '\ED2F'; - } -} -.game-icon-balloon-dog { - &:before { - content: '\ED30'; - } -} -.game-icon-beach-ball { - &:before { - content: '\ED31'; - } -} -.game-icon-game-console { - &:before { - content: '\ED32'; - } -} -.game-icon-kite { - &:before { - content: '\ED33'; - } -} -.game-icon-marbles { - &:before { - content: '\ED34'; - } -} -.game-icon-paper-plane { - &:before { - content: '\ED35'; - } -} -.game-icon-paper-windmill { - &:before { - content: '\ED36'; - } -} -.game-icon-pendulum-swing { - &:before { - content: '\ED37'; - } -} -.game-icon-pinball-flipper { - &:before { - content: '\ED38'; - } -} -.game-icon-ping-pong-bat { - &:before { - content: '\ED39'; - } -} -.game-icon-puzzle { - &:before { - content: '\ED3A'; - } -} -.game-icon-skipping-rope { - &:before { - content: '\ED3B'; - } -} -.game-icon-soccer-ball { - &:before { - content: '\ED3C'; - } -} -.game-icon-balloons { - &:before { - content: '\ED3D'; - } -} -.game-icon-jigsaw-piece { - &:before { - content: '\ED3E'; - } -} -.game-icon-voodoo-doll { - &:before { - content: '\ED3F'; - } -} -.game-icon-console-controller { - &:before { - content: '\ED40'; - } -} -.game-icon-spinning-top { - &:before { - content: '\ED41'; - } -} -.game-icon-bar-stool { - &:before { - content: '\ED42'; - } -} -.game-icon-bathtub { - &:before { - content: '\ED43'; - } -} -.game-icon-bed { - &:before { - content: '\ED44'; - } -} -.game-icon-bookshelf { - &:before { - content: '\ED45'; - } -} -.game-icon-bunk-beds { - &:before { - content: '\ED46'; - } -} -.game-icon-cuckoo-clock { - &:before { - content: '\ED47'; - } -} -.game-icon-desk { - &:before { - content: '\ED48'; - } -} -.game-icon-door-handle { - &:before { - content: '\ED49'; - } -} -.game-icon-door { - &:before { - content: '\ED4A'; - } -} -.game-icon-electrical-socket { - &:before { - content: '\ED4B'; - } -} -.game-icon-laptop { - &:before { - content: '\ED4C'; - } -} -.game-icon-lipstick { - &:before { - content: '\ED4D'; - } -} -.game-icon-lockers { - &:before { - content: '\ED4E'; - } -} -.game-icon-magic-broom { - &:before { - content: '\ED4F'; - } -} -.game-icon-office-chair { - &:before { - content: '\ED50'; - } -} -.game-icon-paper-clip { - &:before { - content: '\ED51'; - } -} -.game-icon-party-popper { - &:before { - content: '\ED52'; - } -} -.game-icon-person-in-bed { - &:before { - content: '\ED53'; - } -} -.game-icon-pillow { - &:before { - content: '\ED54'; - } -} -.game-icon-rocking-chair { - &:before { - content: '\ED55'; - } -} -.game-icon-soap { - &:before { - content: '\ED56'; - } -} -.game-icon-sofa { - &:before { - content: '\ED57'; - } -} -.game-icon-towel { - &:before { - content: '\ED58'; - } -} -.game-icon-weight-scale { - &:before { - content: '\ED59'; - } -} -.game-icon-wifi-router { - &:before { - content: '\ED5A'; - } -} -.game-icon-wooden-chair { - &:before { - content: '\ED5B'; - } -} -.game-icon-fountain-pen { - &:before { - content: '\ED5C'; - } -} -.game-icon-papers { - &:before { - content: '\ED5D'; - } -} -.game-icon-quill-ink { - &:before { - content: '\ED5E'; - } -} -.game-icon-tied-scroll { - &:before { - content: '\ED5F'; - } -} -.game-icon-calculator { - &:before { - content: '\ED60'; - } -} -.game-icon-cctv-camera { - &:before { - content: '\ED61'; - } -} -.game-icon-charging { - &:before { - content: '\ED62'; - } -} -.game-icon-cpu { - &:before { - content: '\ED63'; - } -} -.game-icon-electrical-resistance { - &:before { - content: '\ED64'; - } -} -.game-icon-server-rack { - &:before { - content: '\ED65'; - } -} -.game-icon-smartphone-2 { - &:before { - content: '\ED66'; - } -} -.game-icon-tv-remote { - &:before { - content: '\ED67'; - } -} -.game-icon-usb-key { - &:before { - content: '\ED68'; - } -} -.game-icon-watch { - &:before { - content: '\ED69'; - } -} -.game-icon-batteries { - &:before { - content: '\ED6A'; - } -} -.game-icon-cpu-shot { - &:before { - content: '\ED6B'; - } -} -.game-icon-disc { - &:before { - content: '\ED6C'; - } -} -.game-icon-lightning-arc { - &:before { - content: '\ED6D'; - } -} -.game-icon-ram-2 { - &:before { - content: '\ED6E'; - } -} -.game-icon-pc { - &:before { - content: '\ED6F'; - } -} -.game-icon-fog { - &:before { - content: '\ED70'; - } -} -.game-icon-windsock { - &:before { - content: '\ED71'; - } -} -.game-icon-cloud-ring { - &:before { - content: '\ED72'; - } -} -.game-icon-dust-cloud { - &:before { - content: '\ED73'; - } -} -.game-icon-flower-twirl { - &:before { - content: '\ED74'; - } -} -.game-icon-fluffy-cloud { - &:before { - content: '\ED75'; - } -} -.game-icon-half-tornado { - &:before { - content: '\ED76'; - } -} -.game-icon-lightning-storm { - &:before { - content: '\ED77'; - } -} -.game-icon-lightning-tree { - &:before { - content: '\ED78'; - } -} -.game-icon-moon { - &:before { - content: '\ED79'; - } -} -.game-icon-night-sky { - &:before { - content: '\ED7A'; - } -} -.game-icon-parachute { - &:before { - content: '\ED7B'; - } -} -.game-icon-raining { - &:before { - content: '\ED7C'; - } -} -.game-icon-static { - &:before { - content: '\ED7D'; - } -} -.game-icon-stomp-tornado { - &:before { - content: '\ED7E'; - } -} -.game-icon-tornado { - &:before { - content: '\ED7F'; - } -} -.game-icon-twirl-center { - &:before { - content: '\ED80'; - } -} -.game-icon-twister { - &:before { - content: '\ED81'; - } -} -.game-icon-whirlwind { - &:before { - content: '\ED82'; - } -} -.game-icon-battle-mech { - &:before { - content: '\ED83'; - } -} -.game-icon-factory-arm { - &:before { - content: '\ED84'; - } -} -.game-icon-mono-wheel-robot { - &:before { - content: '\ED85'; - } -} -.game-icon-nano-bot { - &:before { - content: '\ED86'; - } -} -.game-icon-robot-grab { - &:before { - content: '\ED87'; - } -} -.game-icon-robot-leg { - &:before { - content: '\ED88'; - } -} -.game-icon-spider-bot { - &:before { - content: '\ED89'; - } -} -.game-icon-megabot { - &:before { - content: '\ED8A'; - } -} -.game-icon-techno-heart { - &:before { - content: '\ED8B'; - } -} -.game-icon-vintage-robot { - &:before { - content: '\ED8C'; - } -} -.game-icon-bus-doors { - &:before { - content: '\ED8D'; - } -} -.game-icon-door-ring-handle { - &:before { - content: '\ED8E'; - } -} -.game-icon-door-watcher { - &:before { - content: '\ED8F'; - } -} -.game-icon-heaven-gate { - &:before { - content: '\ED90'; - } -} -.game-icon-hobbit-door { - &:before { - content: '\ED91'; - } -} -.game-icon-india-gate { - &:before { - content: '\ED92'; - } -} -.game-icon-locked-door { - &:before { - content: '\ED93'; - } -} -.game-icon-open-gate { - &:before { - content: '\ED94'; - } -} -.game-icon-ranch-gate { - &:before { - content: '\ED95'; - } -} -.game-icon-temple-door { - &:before { - content: '\ED96'; - } -} -.game-icon-turnstile { - &:before { - content: '\ED97'; - } -} -.game-icon-doorway { - &:before { - content: '\ED98'; - } -} -.game-icon-boss-key { - &:before { - content: '\ED99'; - } -} -.game-icon-dial-padlock { - &:before { - content: '\ED9A'; - } -} -.game-icon-heart-key { - &:before { - content: '\ED9B'; - } -} -.game-icon-house-keys { - &:before { - content: '\ED9C'; - } -} -.game-icon-key-card { - &:before { - content: '\ED9D'; - } -} -.game-icon-key-lock { - &:before { - content: '\ED9E'; - } -} -.game-icon-keyring { - &:before { - content: '\ED9F'; - } -} -.game-icon-locked-heart { - &:before { - content: '\EDA0'; - } -} -.game-icon-millenium-key { - &:before { - content: '\EDA1'; - } -} -.game-icon-padlock-open { - &:before { - content: '\EDA2'; - } -} -.game-icon-secret-book { - &:before { - content: '\EDA3'; - } -} -.game-icon-key { - &:before { - content: '\EDA4'; - } -} -.game-icon-padlock { - &:before { - content: '\EDA5'; - } -} -.game-icon-three-keys { - &:before { - content: '\EDA6'; - } -} -.game-icon-triple-lock { - &:before { - content: '\EDA7'; - } -} -.game-icon-unlocking { - &:before { - content: '\EDA8'; - } -} -.game-icon-wax-seal { - &:before { - content: '\EDA9'; - } -} -.game-icon-key-2 { - &:before { - content: '\EDAA'; - } -} -.game-icon-combination-lock { - &:before { - content: '\EDAB'; - } -} -.game-icon-defense-satellite { - &:before { - content: '\EDAC'; - } -} -.game-icon-light-sabers { - &:before { - content: '\EDAD'; - } -} -.game-icon-double-ringed-orb { - &:before { - content: '\EDAE'; - } -} -.game-icon-energise { - &:before { - content: '\EDAF'; - } -} -.game-icon-ringed-planet { - &:before { - content: '\EDB0'; - } -} -.game-icon-sinusoidal-beam { - &:before { - content: '\EDB1'; - } -} -.game-icon-bandaged { - &:before { - content: '\EDB2'; - } -} -.game-icon-duration { - &:before { - content: '\EDB3'; - } -} -.game-icon-extra-time { - &:before { - content: '\EDB4'; - } -} -.game-icon-time-synchronization { - &:before { - content: '\EDB5'; - } -} -.game-icon-heavy-timer { - &:before { - content: '\EDB6'; - } -} -.game-icon-time-trap { - &:before { - content: '\EDB7'; - } -} -.game-icon-stopwatch-2 { - &:before { - content: '\EDB8'; - } -} -.game-icon-dragon-orb { - &:before { - content: '\EDB9'; - } -} -.game-icon-barbed-nails { - &:before { - content: '\EDBA'; - } -} -.game-icon-claw-string { - &:before { - content: '\EDBB'; - } -} -.game-icon-interleaved-claws { - &:before { - content: '\EDBC'; - } -} -.game-icon-midnight-claw { - &:before { - content: '\EDBD'; - } -} -.game-icon-plate-claw { - &:before { - content: '\EDBE'; - } -} -.game-icon-saw-claw { - &:before { - content: '\EDBF'; - } -} -.game-icon-shining-claw { - &:before { - content: '\EDC0'; - } -} -.game-icon-triple-scratches { - &:before { - content: '\EDC1'; - } -} -.game-icon-distress-signal { - &:before { - content: '\EDC2'; - } -} -.game-icon-exploding-planet { - &:before { - content: '\EDC3'; - } -} -.game-icon-jupiter { - &:before { - content: '\EDC4'; - } -} -.game-icon-moon-orbit { - &:before { - content: '\EDC5'; - } -} -.game-icon-planet-core { - &:before { - content: '\EDC6'; - } -} -.game-icon-black-hole-bolas { - &:before { - content: '\EDC7'; - } -} -.game-icon-hypersonic-bolt { - &:before { - content: '\EDC8'; - } -} -.game-icon-nested-eclipses { - &:before { - content: '\EDC9'; - } -} -.game-icon-vortex { - &:before { - content: '\EDCA'; - } -} -.game-icon-koholint-egg { - &:before { - content: '\EDCB'; - } -} -.game-icon-egg-defense { - &:before { - content: '\EDCC'; - } -} -.game-icon-tentacles-barrier { - &:before { - content: '\EDCD'; - } -} -.game-icon-curled-tentacle { - &:before { - content: '\EDCE'; - } -} -.game-icon-interlaced-tentacles { - &:before { - content: '\EDCF'; - } -} -.game-icon-noodle-ball { - &:before { - content: '\EDD0'; - } -} -.game-icon-spiral-tentacle { - &:before { - content: '\EDD1'; - } -} -.game-icon-suckered-tentacle { - &:before { - content: '\EDD2'; - } -} -.game-icon-tentacle-heart { - &:before { - content: '\EDD3'; - } -} -.game-icon-tentacle-strike { - &:before { - content: '\EDD4'; - } -} -.game-icon-tentacurl { - &:before { - content: '\EDD5'; - } -} -.game-icon-thorny-tentacle { - &:before { - content: '\EDD6'; - } -} -.game-icon-thorny-vine { - &:before { - content: '\EDD7'; - } -} -.game-icon-apple-core { - &:before { - content: '\EDD8'; - } -} -.game-icon-banana-bunch { - &:before { - content: '\EDD9'; - } -} -.game-icon-banana-peeled { - &:before { - content: '\EDDA'; - } -} -.game-icon-broccoli { - &:before { - content: '\EDDB'; - } -} -.game-icon-coconuts { - &:before { - content: '\EDDC'; - } -} -.game-icon-cut-lemon { - &:before { - content: '\EDDD'; - } -} -.game-icon-leek { - &:before { - content: '\EDDE'; - } -} -.game-icon-lemon { - &:before { - content: '\EDDF'; - } -} -.game-icon-orange-slice { - &:before { - content: '\EDE0'; - } -} -.game-icon-orange { - &:before { - content: '\EDE1'; - } -} -.game-icon-peach { - &:before { - content: '\EDE2'; - } -} -.game-icon-peas { - &:before { - content: '\EDE3'; - } -} -.game-icon-pineapple { - &:before { - content: '\EDE4'; - } -} -.game-icon-pumpkin { - &:before { - content: '\EDE5'; - } -} -.game-icon-raddish { - &:before { - content: '\EDE6'; - } -} -.game-icon-raspberry { - &:before { - content: '\EDE7'; - } -} -.game-icon-strawberry { - &:before { - content: '\EDE8'; - } -} -.game-icon-watermelon { - &:before { - content: '\EDE9'; - } -} -.game-icon-apple-seeds { - &:before { - content: '\EDEA'; - } -} -.game-icon-blackcurrant { - &:before { - content: '\EDEB'; - } -} -.game-icon-gift-trap { - &:before { - content: '\EDEC'; - } -} -.game-icon-american-football-ball { - &:before { - content: '\EDED'; - } -} -.game-icon-cricket-bat { - &:before { - content: '\EDEE'; - } -} -.game-icon-footy-field { - &:before { - content: '\EDEF'; - } -} -.game-icon-bowie-knife { - &:before { - content: '\EDF0'; - } -} -.game-icon-ball-pyramid { - &:before { - content: '\EDF1'; - } -} -.game-icon-basketball-ball { - &:before { - content: '\EDF2'; - } -} -.game-icon-boulder-dash { - &:before { - content: '\EDF3'; - } -} -.game-icon-bowling-strike { - &:before { - content: '\EDF4'; - } -} -.game-icon-eight-ball { - &:before { - content: '\EDF5'; - } -} -.game-icon-golf-tee { - &:before { - content: '\EDF6'; - } -} -.game-icon-snitch-quidditch-ball { - &:before { - content: '\EDF7'; - } -} -.game-icon-soccer-kick { - &:before { - content: '\EDF8'; - } -} -.game-icon-tennis-ball { - &:before { - content: '\EDF9'; - } -} -.game-icon-volleyball-ball { - &:before { - content: '\EDFA'; - } -} -.game-icon-water-polo { - &:before { - content: '\EDFB'; - } -} -.game-icon-ball-glow { - &:before { - content: '\EDFC'; - } -} -.game-icon-ball-heart { - &:before { - content: '\EDFD'; - } -} -.game-icon-blackball { - &:before { - content: '\EDFE'; - } -} -.game-icon-bowling-propulsion { - &:before { - content: '\EDFF'; - } -} -.game-icon-caged-ball { - &:before { - content: '\EE00'; - } -} -.game-icon-circle-cage { - &:before { - content: '\EE01'; - } -} -.game-icon-concentration-orb { - &:before { - content: '\EE02'; - } -} -.game-icon-crumbling-ball { - &:before { - content: '\EE03'; - } -} -.game-icon-double-diaphragm { - &:before { - content: '\EE04'; - } -} -.game-icon-extraction-orb { - &:before { - content: '\EE05'; - } -} -.game-icon-falling-blob { - &:before { - content: '\EE06'; - } -} -.game-icon-mesh-ball { - &:before { - content: '\EE07'; - } -} -.game-icon-striking-balls { - &:before { - content: '\EE08'; - } -} -.game-icon-unstable-orb { - &:before { - content: '\EE09'; - } -} -.game-icon-basketball-basket { - &:before { - content: '\EE0A'; - } -} -.game-icon-biceps { - &:before { - content: '\EE0B'; - } -} -.game-icon-bowling-alley { - &:before { - content: '\EE0C'; - } -} -.game-icon-bowling-pin { - &:before { - content: '\EE0D'; - } -} -.game-icon-disc-golf-basket { - &:before { - content: '\EE0E'; - } -} -.game-icon-fencer { - &:before { - content: '\EE0F'; - } -} -.game-icon-frisbee { - &:before { - content: '\EE10'; - } -} -.game-icon-juggling-clubs { - &:before { - content: '\EE11'; - } -} -.game-icon-muscular-torso { - &:before { - content: '\EE12'; - } -} -.game-icon-pool-dive { - &:before { - content: '\EE13'; - } -} -.game-icon-punching-bag { - &:before { - content: '\EE14'; - } -} -.game-icon-rugby-conversion { - &:before { - content: '\EE15'; - } -} -.game-icon-shuttlecock { - &:before { - content: '\EE16'; - } -} -.game-icon-skier { - &:before { - content: '\EE17'; - } -} -.game-icon-skis { - &:before { - content: '\EE18'; - } -} -.game-icon-soccer-field { - &:before { - content: '\EE19'; - } -} -.game-icon-tennis-court { - &:before { - content: '\EE1A'; - } -} -.game-icon-tennis-racket { - &:before { - content: '\EE1B'; - } -} -.game-icon-sword-altar { - &:before { - content: '\EE1C'; - } -} -.game-icon-broadsword { - &:before { - content: '\EE1D'; - } -} -.game-icon-half-heart { - &:before { - content: '\EE1E'; - } -} -.game-icon-ancient-sword { - &:before { - content: '\EE1F'; - } -} -.game-icon-axe-sword { - &:before { - content: '\EE20'; - } -} -.game-icon-bat-leth { - &:before { - content: '\EE21'; - } -} -.game-icon-butterfly-knife { - &:before { - content: '\EE22'; - } -} -.game-icon-chakram { - &:before { - content: '\EE23'; - } -} -.game-icon-coiled-nail { - &:before { - content: '\EE24'; - } -} -.game-icon-glaive { - &:before { - content: '\EE25'; - } -} -.game-icon-rusty-sword { - &:before { - content: '\EE26'; - } -} -.game-icon-scabbard { - &:before { - content: '\EE27'; - } -} -.game-icon-spiral-hilt { - &:before { - content: '\EE28'; - } -} -.game-icon-stabbed-note { - &:before { - content: '\EE29'; - } -} -.game-icon-swords-power { - &:before { - content: '\EE2A'; - } -} -.game-icon-two-handed-sword { - &:before { - content: '\EE2B'; - } -} -.game-icon-blade-drag { - &:before { - content: '\EE2C'; - } -} -.game-icon-blade-fall { - &:before { - content: '\EE2D'; - } -} -.game-icon-bloody-sword { - &:before { - content: '\EE2E'; - } -} -.game-icon-bouncing-sword { - &:before { - content: '\EE2F'; - } -} -.game-icon-broad-dagger { - &:before { - content: '\EE30'; - } -} -.game-icon-cloak-dagger { - &:before { - content: '\EE31'; - } -} -.game-icon-crescent-blade { - &:before { - content: '\EE32'; - } -} -.game-icon-croc-sword { - &:before { - content: '\EE33'; - } -} -.game-icon-curvy-knife { - &:before { - content: '\EE34'; - } -} -.game-icon-daggers { - &:before { - content: '\EE35'; - } -} -.game-icon-dervish-swords { - &:before { - content: '\EE36'; - } -} -.game-icon-diving-dagger { - &:before { - content: '\EE37'; - } -} -.game-icon-energy-sword { - &:before { - content: '\EE38'; - } -} -.game-icon-flying-dagger { - &:before { - content: '\EE39'; - } -} -.game-icon-fragmented-sword { - &:before { - content: '\EE3A'; - } -} -.game-icon-knife-thrust { - &:before { - content: '\EE3B'; - } -} -.game-icon-lightning-saber { - &:before { - content: '\EE3C'; - } -} -.game-icon-plain-dagger { - &:before { - content: '\EE3D'; - } -} -.game-icon-pointy-sword { - &:before { - content: '\EE3E'; - } -} -.game-icon-relic-blade { - &:before { - content: '\EE3F'; - } -} -.game-icon-shard-sword { - &:before { - content: '\EE40'; - } -} -.game-icon-shining-sword { - &:before { - content: '\EE41'; - } -} -.game-icon-spinning-blades { - &:before { - content: '\EE42'; - } -} -.game-icon-spinning-sword { - &:before { - content: '\EE43'; - } -} -.game-icon-spiral-thrust { - &:before { - content: '\EE44'; - } -} -.game-icon-striped-sword { - &:before { - content: '\EE45'; - } -} -.game-icon-sword-array { - &:before { - content: '\EE46'; - } -} -.game-icon-sword-hilt { - &:before { - content: '\EE47'; - } -} -.game-icon-sword-spin { - &:before { - content: '\EE48'; - } -} -.game-icon-sword-wound { - &:before { - content: '\EE49'; - } -} -.game-icon-thrown-knife { - &:before { - content: '\EE4A'; - } -} -.game-icon-thunder-blade { - &:before { - content: '\EE4B'; - } -} -.game-icon-zeus-sword { - &:before { - content: '\EE4C'; - } -} -.game-icon-bowie-knife-2 { - &:before { - content: '\EE4D'; - } -} -.game-icon-butterfly-knife-2 { - &:before { - content: '\EE4E'; - } -} -.game-icon-crescent-blade-2 { - &:before { - content: '\EE4F'; - } -} -.game-icon-stiletto-2 { - &:before { - content: '\EE50'; - } -} -.game-icon-antibody { - &:before { - content: '\EE51'; - } -} -.game-icon-atom-core { - &:before { - content: '\EE52'; - } -} -.game-icon-h2o { - &:before { - content: '\EE53'; - } -} -.game-icon-radiations { - &:before { - content: '\EE54'; - } -} -.game-icon-chemical-bolt { - &:before { - content: '\EE55'; - } -} -.game-icon-dripping-tube { - &:before { - content: '\EE56'; - } -} -.game-icon-erlenmeyer { - &:before { - content: '\EE57'; - } -} -.game-icon-foamy-disc { - &:before { - content: '\EE58'; - } -} -.game-icon-materials-science { - &:before { - content: '\EE59'; - } -} -.game-icon-molecule { - &:before { - content: '\EE5A'; - } -} -.game-icon-soap-experiment { - &:before { - content: '\EE5B'; - } -} -.game-icon-acid-tube { - &:before { - content: '\EE5C'; - } -} -.game-icon-syringe-2 { - &:before { - content: '\EE5D'; - } -} -.game-icon-vial { - &:before { - content: '\EE5E'; - } -} -.game-icon-atom { - &:before { - content: '\EE5F'; - } -} -.game-icon-molecule-2 { - &:before { - content: '\EE60'; - } -} -.game-icon-arch-bridge { - &:before { - content: '\EE61'; - } -} -.game-icon-black-bridge { - &:before { - content: '\EE62'; - } -} -.game-icon-cable-stayed-bridge { - &:before { - content: '\EE63'; - } -} -.game-icon-cliff-crossing { - &:before { - content: '\EE64'; - } -} -.game-icon-drawbridge { - &:before { - content: '\EE65'; - } -} -.game-icon-rialto-bridge { - &:before { - content: '\EE66'; - } -} -.game-icon-rope-bridge { - &:before { - content: '\EE67'; - } -} -.game-icon-suspension-bridge { - &:before { - content: '\EE68'; - } -} -.game-icon-archive-register { - &:before { - content: '\EE69'; - } -} -.game-icon-archive-research { - &:before { - content: '\EE6A'; - } -} -.game-icon-book-cover { - &:before { - content: '\EE6B'; - } -} -.game-icon-book-pile { - &:before { - content: '\EE6C'; - } -} -.game-icon-calendar-half-year { - &:before { - content: '\EE6D'; - } -} -.game-icon-love-letter { - &:before { - content: '\EE6E'; - } -} -.game-icon-passport { - &:before { - content: '\EE6F'; - } -} -.game-icon-pencil-ruler { - &:before { - content: '\EE70'; - } -} -.game-icon-post-stamp { - &:before { - content: '\EE71'; - } -} -.game-icon-scroll-quill { - &:before { - content: '\EE72'; - } -} -.game-icon-spell-book { - &:before { - content: '\EE73'; - } -} -.game-icon-stamper { - &:before { - content: '\EE74'; - } -} -.game-icon-book-aura { - &:before { - content: '\EE75'; - } -} -.game-icon-book-cover-2 { - &:before { - content: '\EE76'; - } -} -.game-icon-book-storm { - &:before { - content: '\EE77'; - } -} -.game-icon-bookmarklet { - &:before { - content: '\EE78'; - } -} -.game-icon-enlightenment { - &:before { - content: '\EE79'; - } -} -.game-icon-folded-paper { - &:before { - content: '\EE7A'; - } -} -.game-icon-ink-swirl { - &:before { - content: '\EE7B'; - } -} -.game-icon-scroll-unfurled { - &:before { - content: '\EE7C'; - } -} -.game-icon-black-book { - &:before { - content: '\EE7D'; - } -} -.game-icon-white-book { - &:before { - content: '\EE7E'; - } -} -.game-icon-neck-bite { - &:before { - content: '\EE7F'; - } -} -.game-icon-bleeding-wound { - &:before { - content: '\EE80'; - } -} -.game-icon-bloody-stash { - &:before { - content: '\EE81'; - } -} -.game-icon-cross-mark { - &:before { - content: '\EE82'; - } -} -.game-icon-feather-wound { - &:before { - content: '\EE83'; - } -} -.game-icon-open-wound { - &:before { - content: '\EE84'; - } -} -.game-icon-scar-wound { - &:before { - content: '\EE85'; - } -} -.game-icon-spotted-wound { - &:before { - content: '\EE86'; - } -} -.game-icon-stitched-wound { - &:before { - content: '\EE87'; - } -} -.game-icon-arm { - &:before { - content: '\EE88'; - } -} -.game-icon-bowels { - &:before { - content: '\EE89'; - } -} -.game-icon-kidneys { - &:before { - content: '\EE8A'; - } -} -.game-icon-liver { - &:before { - content: '\EE8B'; - } -} -.game-icon-lungs { - &:before { - content: '\EE8C'; - } -} -.game-icon-internal-organ { - &:before { - content: '\EE8D'; - } -} -.game-icon-tumor { - &:before { - content: '\EE8E'; - } -} -.game-icon-flat-platform { - &:before { - content: '\EE8F'; - } -} -.game-icon-i-brick { - &:before { - content: '\EE90'; - } -} -.game-icon-j-brick { - &:before { - content: '\EE91'; - } -} -.game-icon-l-brick { - &:before { - content: '\EE92'; - } -} -.game-icon-o-brick { - &:before { - content: '\EE93'; - } -} -.game-icon-s-brick { - &:before { - content: '\EE94'; - } -} -.game-icon-t-brick { - &:before { - content: '\EE95'; - } -} -.game-icon-z-brick { - &:before { - content: '\EE96'; - } -} -.game-icon-platform { - &:before { - content: '\EE97'; - } -} -.game-icon-hatchet { - &:before { - content: '\EE98'; - } -} -.game-icon-magic-axe { - &:before { - content: '\EE99'; - } -} -.game-icon-sharp-halberd { - &:before { - content: '\EE9A'; - } -} -.game-icon-axe-swing { - &:before { - content: '\EE9B'; - } -} -.game-icon-crossed-axes { - &:before { - content: '\EE9C'; - } -} -.game-icon-halberd { - &:before { - content: '\EE9D'; - } -} -.game-icon-hatchets { - &:before { - content: '\EE9E'; - } -} -.game-icon-royal-love { - &:before { - content: '\EE9F'; - } -} -.game-icon-split-cross { - &:before { - content: '\EEA0'; - } -} -.game-icon-templar-heart { - &:before { - content: '\EEA1'; - } -} -.game-icon-tongue { - &:before { - content: '\EEA2'; - } -} -.game-icon-carnivore-mouth { - &:before { - content: '\EEA3'; - } -} -.game-icon-energy-breath { - &:before { - content: '\EEA4'; - } -} -.game-icon-front-teeth { - &:before { - content: '\EEA5'; - } -} -.game-icon-incisors { - &:before { - content: '\EEA6'; - } -} -.game-icon-lightning-shout { - &:before { - content: '\EEA7'; - } -} -.game-icon-lips { - &:before { - content: '\EEA8'; - } -} -.game-icon-saber-tooth { - &:before { - content: '\EEA9'; - } -} -.game-icon-sharp-lips { - &:before { - content: '\EEAA'; - } -} -.game-icon-fangs { - &:before { - content: '\EEAB'; - } -} -.game-icon-floor-hatch { - &:before { - content: '\EEAC'; - } -} -.game-icon-hole { - &:before { - content: '\EEAD'; - } -} -.game-icon-mine-explosion { - &:before { - content: '\EEAE'; - } -} -.game-icon-car-battery { - &:before { - content: '\EEAF'; - } -} -.game-icon-heart-battery { - &:before { - content: '\EEB0'; - } -} -.game-icon-entangled-typhoon { - &:before { - content: '\EEB1'; - } -} -.game-icon-lightning-electron { - &:before { - content: '\EEB2'; - } -} -.game-icon-portal { - &:before { - content: '\EEB3'; - } -} -.game-icon-rolling-energy { - &:before { - content: '\EEB4'; - } -} -.game-icon-tesla-coil { - &:before { - content: '\EEB5'; - } -} -.game-icon-battery-0 { - &:before { - content: '\EEB6'; - } -} -.game-icon-battery-100 { - &:before { - content: '\EEB7'; - } -} -.game-icon-battery-25 { - &:before { - content: '\EEB8'; - } -} -.game-icon-battery-50 { - &:before { - content: '\EEB9'; - } -} -.game-icon-battery-75 { - &:before { - content: '\EEBA'; - } -} -.game-icon-battery-minus { - &:before { - content: '\EEBB'; - } -} -.game-icon-battery-plus { - &:before { - content: '\EEBC'; - } -} -.game-icon-battery-pack-alt { - &:before { - content: '\EEBD'; - } -} -.game-icon-battery-pack { - &:before { - content: '\EEBE'; - } -} -.game-icon-bolt-saw { - &:before { - content: '\EEBF'; - } -} -.game-icon-electric-whip { - &:before { - content: '\EEC0'; - } -} -.game-icon-focused-lightning { - &:before { - content: '\EEC1'; - } -} -.game-icon-heavy-lightning { - &:before { - content: '\EEC2'; - } -} -.game-icon-lightning-branches { - &:before { - content: '\EEC3'; - } -} -.game-icon-lightning-dissipation { - &:before { - content: '\EEC4'; - } -} -.game-icon-lightning-frequency { - &:before { - content: '\EEC5'; - } -} -.game-icon-lightning-helix { - &:before { - content: '\EEC6'; - } -} -.game-icon-lightning-shadow { - &:before { - content: '\EEC7'; - } -} -.game-icon-lightning-slashes { - &:before { - content: '\EEC8'; - } -} -.game-icon-lightning-trio { - &:before { - content: '\EEC9'; - } -} -.game-icon-power-lightning { - &:before { - content: '\EECA'; - } -} -.game-icon-round-struck { - &:before { - content: '\EECB'; - } -} -.game-icon-sonic-lightning { - &:before { - content: '\EECC'; - } -} -.game-icon-static-waves { - &:before { - content: '\EECD'; - } -} -.game-icon-thunder-struck { - &:before { - content: '\EECE'; - } -} -.game-icon-thunderball { - &:before { - content: '\EECF'; - } -} -.game-icon-windy-stripes { - &:before { - content: '\EED0'; - } -} -.game-icon-electric { - &:before { - content: '\EED1'; - } -} -.game-icon-chain-lightning { - &:before { - content: '\EED2'; - } -} -.game-icon-arcing-bolt { - &:before { - content: '\EED3'; - } -} -.game-icon-bright-explosion { - &:before { - content: '\EED4'; - } -} -.game-icon-bubbling-beam { - &:before { - content: '\EED5'; - } -} -.game-icon-burning-blobs { - &:before { - content: '\EED6'; - } -} -.game-icon-clout { - &:before { - content: '\EED7'; - } -} -.game-icon-comet-spark { - &:before { - content: '\EED8'; - } -} -.game-icon-corner-explosion { - &:before { - content: '\EED9'; - } -} -.game-icon-crowned-explosion { - &:before { - content: '\EEDA'; - } -} -.game-icon-electrical-crescent { - &:before { - content: '\EEDB'; - } -} -.game-icon-explosive-meeting { - &:before { - content: '\EEDC'; - } -} -.game-icon-fragmented-meteor { - &:before { - content: '\EEDD'; - } -} -.game-icon-heavy-fall { - &:before { - content: '\EEDE'; - } -} -.game-icon-hypersonic-melon { - &:before { - content: '\EEDF'; - } -} -.game-icon-implosion { - &:before { - content: '\EEE0'; - } -} -.game-icon-incoming-rocket { - &:before { - content: '\EEE1'; - } -} -.game-icon-ion-cannon-blast { - &:before { - content: '\EEE2'; - } -} -.game-icon-ringed-beam { - &:before { - content: '\EEE3'; - } -} -.game-icon-screen-impact { - &:before { - content: '\EEE4'; - } -} -.game-icon-striking-splinter { - &:before { - content: '\EEE5'; - } -} -.game-icon-evil-love { - &:before { - content: '\EEE6'; - } -} -.game-icon-broken-heart-zone { - &:before { - content: '\EEE7'; - } -} -.game-icon-charm { - &:before { - content: '\EEE8'; - } -} -.game-icon-chewed-heart { - &:before { - content: '\EEE9'; - } -} -.game-icon-shining-heart { - &:before { - content: '\EEEA'; - } -} -.game-icon-chanterelles { - &:before { - content: '\EEEB'; - } -} -.game-icon-mushrooms-cluster { - &:before { - content: '\EEEC'; - } -} -.game-icon-spotted-mushroom { - &:before { - content: '\EEED'; - } -} -.game-icon-dice-eight-faces-eight { - &:before { - content: '\EEEE'; - } -} -.game-icon-dice-six-faces-five { - &:before { - content: '\EEEF'; - } -} -.game-icon-dice-six-faces-four { - &:before { - content: '\EEF0'; - } -} -.game-icon-dice-six-faces-one { - &:before { - content: '\EEF1'; - } -} -.game-icon-dice-six-faces-six { - &:before { - content: '\EEF2'; - } -} -.game-icon-dice-six-faces-two { - &:before { - content: '\EEF3'; - } -} -.game-icon-dice-twenty-faces-one { - &:before { - content: '\EEF4'; - } -} -.game-icon-dice-twenty-faces-twenty { - &:before { - content: '\EEF5'; - } -} -.game-icon-perspective-dice-five { - &:before { - content: '\EEF6'; - } -} -.game-icon-perspective-dice-four { - &:before { - content: '\EEF7'; - } -} -.game-icon-perspective-dice-one { - &:before { - content: '\EEF8'; - } -} -.game-icon-perspective-dice-six-faces-five { - &:before { - content: '\EEF9'; - } -} -.game-icon-perspective-dice-six-faces-one { - &:before { - content: '\EEFA'; - } -} -.game-icon-perspective-dice-six-faces-random { - &:before { - content: '\EEFB'; - } -} -.game-icon-perspective-dice-six-faces-six { - &:before { - content: '\EEFC'; - } -} -.game-icon-perspective-dice-six-faces-three { - &:before { - content: '\EEFD'; - } -} -.game-icon-perspective-dice-six-faces-two { - &:before { - content: '\EEFE'; - } -} -.game-icon-perspective-dice-six { - &:before { - content: '\EEFF'; - } -} -.game-icon-perspective-dice-three { - &:before { - content: '\EF00'; - } -} -.game-icon-perspective-dice-two { - &:before { - content: '\EF01'; - } -} -.game-icon-d10 { - &:before { - content: '\EF02'; - } -} -.game-icon-d12 { - &:before { - content: '\EF03'; - } -} -.game-icon-d4 { - &:before { - content: '\EF04'; - } -} -.game-icon-inverted-dice-1 { - &:before { - content: '\EF05'; - } -} -.game-icon-inverted-dice-2 { - &:before { - content: '\EF06'; - } -} -.game-icon-inverted-dice-3 { - &:before { - content: '\EF07'; - } -} -.game-icon-inverted-dice-4 { - &:before { - content: '\EF08'; - } -} -.game-icon-inverted-dice-5 { - &:before { - content: '\EF09'; - } -} -.game-icon-inverted-dice-6 { - &:before { - content: '\EF0A'; - } -} -.game-icon-matter-states { - &:before { - content: '\EF0B'; - } -} -.game-icon-sandstorm { - &:before { - content: '\EF0C'; - } -} -.game-icon-abstract-001 { - &:before { - content: '\EF0D'; - } -} -.game-icon-abstract-002 { - &:before { - content: '\EF0E'; - } -} -.game-icon-abstract-003 { - &:before { - content: '\EF0F'; - } -} -.game-icon-abstract-004 { - &:before { - content: '\EF10'; - } -} -.game-icon-abstract-005 { - &:before { - content: '\EF11'; - } -} -.game-icon-abstract-006 { - &:before { - content: '\EF12'; - } -} -.game-icon-abstract-007 { - &:before { - content: '\EF13'; - } -} -.game-icon-abstract-008 { - &:before { - content: '\EF14'; - } -} -.game-icon-abstract-009 { - &:before { - content: '\EF15'; - } -} -.game-icon-abstract-010 { - &:before { - content: '\EF16'; - } -} -.game-icon-abstract-011 { - &:before { - content: '\EF17'; - } -} -.game-icon-abstract-012 { - &:before { - content: '\EF18'; - } -} -.game-icon-abstract-013 { - &:before { - content: '\EF19'; - } -} -.game-icon-abstract-014 { - &:before { - content: '\EF1A'; - } -} -.game-icon-abstract-015 { - &:before { - content: '\EF1B'; - } -} -.game-icon-abstract-016 { - &:before { - content: '\EF1C'; - } -} -.game-icon-abstract-017 { - &:before { - content: '\EF1D'; - } -} -.game-icon-abstract-018 { - &:before { - content: '\EF1E'; - } -} -.game-icon-abstract-019 { - &:before { - content: '\EF1F'; - } -} -.game-icon-abstract-020 { - &:before { - content: '\EF20'; - } -} -.game-icon-abstract-021 { - &:before { - content: '\EF21'; - } -} -.game-icon-abstract-022 { - &:before { - content: '\EF22'; - } -} -.game-icon-abstract-023 { - &:before { - content: '\EF23'; - } -} -.game-icon-abstract-024 { - &:before { - content: '\EF24'; - } -} -.game-icon-abstract-025 { - &:before { - content: '\EF25'; - } -} -.game-icon-abstract-026 { - &:before { - content: '\EF26'; - } -} -.game-icon-abstract-027 { - &:before { - content: '\EF27'; - } -} -.game-icon-abstract-028 { - &:before { - content: '\EF28'; - } -} -.game-icon-abstract-029 { - &:before { - content: '\EF29'; - } -} -.game-icon-abstract-030 { - &:before { - content: '\EF2A'; - } -} -.game-icon-abstract-031 { - &:before { - content: '\EF2B'; - } -} -.game-icon-abstract-032 { - &:before { - content: '\EF2C'; - } -} -.game-icon-abstract-033 { - &:before { - content: '\EF2D'; - } -} -.game-icon-abstract-034 { - &:before { - content: '\EF2E'; - } -} -.game-icon-abstract-035 { - &:before { - content: '\EF2F'; - } -} -.game-icon-abstract-036 { - &:before { - content: '\EF30'; - } -} -.game-icon-abstract-037 { - &:before { - content: '\EF31'; - } -} -.game-icon-abstract-038 { - &:before { - content: '\EF32'; - } -} -.game-icon-abstract-039 { - &:before { - content: '\EF33'; - } -} -.game-icon-abstract-040 { - &:before { - content: '\EF34'; - } -} -.game-icon-abstract-041 { - &:before { - content: '\EF35'; - } -} -.game-icon-abstract-042 { - &:before { - content: '\EF36'; - } -} -.game-icon-abstract-043 { - &:before { - content: '\EF37'; - } -} -.game-icon-abstract-044 { - &:before { - content: '\EF38'; - } -} -.game-icon-abstract-045 { - &:before { - content: '\EF39'; - } -} -.game-icon-abstract-046 { - &:before { - content: '\EF3A'; - } -} -.game-icon-abstract-047 { - &:before { - content: '\EF3B'; - } -} -.game-icon-abstract-048 { - &:before { - content: '\EF3C'; - } -} -.game-icon-abstract-049 { - &:before { - content: '\EF3D'; - } -} -.game-icon-abstract-050 { - &:before { - content: '\EF3E'; - } -} -.game-icon-abstract-051 { - &:before { - content: '\EF3F'; - } -} -.game-icon-abstract-052 { - &:before { - content: '\EF40'; - } -} -.game-icon-abstract-053 { - &:before { - content: '\EF41'; - } -} -.game-icon-abstract-054 { - &:before { - content: '\EF42'; - } -} -.game-icon-abstract-055 { - &:before { - content: '\EF43'; - } -} -.game-icon-abstract-056 { - &:before { - content: '\EF44'; - } -} -.game-icon-abstract-057 { - &:before { - content: '\EF45'; - } -} -.game-icon-abstract-058 { - &:before { - content: '\EF46'; - } -} -.game-icon-abstract-059 { - &:before { - content: '\EF47'; - } -} -.game-icon-abstract-060 { - &:before { - content: '\EF48'; - } -} -.game-icon-abstract-061 { - &:before { - content: '\EF49'; - } -} -.game-icon-abstract-062 { - &:before { - content: '\EF4A'; - } -} -.game-icon-abstract-063 { - &:before { - content: '\EF4B'; - } -} -.game-icon-abstract-064 { - &:before { - content: '\EF4C'; - } -} -.game-icon-abstract-065 { - &:before { - content: '\EF4D'; - } -} -.game-icon-abstract-066 { - &:before { - content: '\EF4E'; - } -} -.game-icon-abstract-067 { - &:before { - content: '\EF4F'; - } -} -.game-icon-abstract-068 { - &:before { - content: '\EF50'; - } -} -.game-icon-abstract-069 { - &:before { - content: '\EF51'; - } -} -.game-icon-abstract-070 { - &:before { - content: '\EF52'; - } -} -.game-icon-abstract-071 { - &:before { - content: '\EF53'; - } -} -.game-icon-abstract-072 { - &:before { - content: '\EF54'; - } -} -.game-icon-abstract-073 { - &:before { - content: '\EF55'; - } -} -.game-icon-abstract-074 { - &:before { - content: '\EF56'; - } -} -.game-icon-abstract-075 { - &:before { - content: '\EF57'; - } -} -.game-icon-abstract-076 { - &:before { - content: '\EF58'; - } -} -.game-icon-abstract-077 { - &:before { - content: '\EF59'; - } -} -.game-icon-abstract-078 { - &:before { - content: '\EF5A'; - } -} -.game-icon-abstract-079 { - &:before { - content: '\EF5B'; - } -} -.game-icon-abstract-080 { - &:before { - content: '\EF5C'; - } -} -.game-icon-abstract-081 { - &:before { - content: '\EF5D'; - } -} -.game-icon-abstract-082 { - &:before { - content: '\EF5E'; - } -} -.game-icon-abstract-083 { - &:before { - content: '\EF5F'; - } -} -.game-icon-abstract-084 { - &:before { - content: '\EF60'; - } -} -.game-icon-abstract-085 { - &:before { - content: '\EF61'; - } -} -.game-icon-abstract-086 { - &:before { - content: '\EF62'; - } -} -.game-icon-abstract-087 { - &:before { - content: '\EF63'; - } -} -.game-icon-abstract-088 { - &:before { - content: '\EF64'; - } -} -.game-icon-abstract-089 { - &:before { - content: '\EF65'; - } -} -.game-icon-abstract-090 { - &:before { - content: '\EF66'; - } -} -.game-icon-abstract-091 { - &:before { - content: '\EF67'; - } -} -.game-icon-abstract-092 { - &:before { - content: '\EF68'; - } -} -.game-icon-abstract-093 { - &:before { - content: '\EF69'; - } -} -.game-icon-abstract-094 { - &:before { - content: '\EF6A'; - } -} -.game-icon-abstract-095 { - &:before { - content: '\EF6B'; - } -} -.game-icon-abstract-096 { - &:before { - content: '\EF6C'; - } -} -.game-icon-abstract-097 { - &:before { - content: '\EF6D'; - } -} -.game-icon-abstract-098 { - &:before { - content: '\EF6E'; - } -} -.game-icon-abstract-099 { - &:before { - content: '\EF6F'; - } -} -.game-icon-abstract-100 { - &:before { - content: '\EF70'; - } -} -.game-icon-abstract-101 { - &:before { - content: '\EF71'; - } -} -.game-icon-abstract-102 { - &:before { - content: '\EF72'; - } -} -.game-icon-abstract-103 { - &:before { - content: '\EF73'; - } -} -.game-icon-abstract-104 { - &:before { - content: '\EF74'; - } -} -.game-icon-abstract-105 { - &:before { - content: '\EF75'; - } -} -.game-icon-abstract-106 { - &:before { - content: '\EF76'; - } -} -.game-icon-abstract-107 { - &:before { - content: '\EF77'; - } -} -.game-icon-abstract-108 { - &:before { - content: '\EF78'; - } -} -.game-icon-abstract-109 { - &:before { - content: '\EF79'; - } -} -.game-icon-abstract-110 { - &:before { - content: '\EF7A'; - } -} -.game-icon-abstract-111 { - &:before { - content: '\EF7B'; - } -} -.game-icon-abstract-112 { - &:before { - content: '\EF7C'; - } -} -.game-icon-abstract-113 { - &:before { - content: '\EF7D'; - } -} -.game-icon-abstract-114 { - &:before { - content: '\EF7E'; - } -} -.game-icon-abstract-115 { - &:before { - content: '\EF7F'; - } -} -.game-icon-abstract-116 { - &:before { - content: '\EF80'; - } -} -.game-icon-abstract-117 { - &:before { - content: '\EF81'; - } -} -.game-icon-abstract-118 { - &:before { - content: '\EF82'; - } -} -.game-icon-abstract-119 { - &:before { - content: '\EF83'; - } -} -.game-icon-abstract-120 { - &:before { - content: '\EF84'; - } -} -.game-icon-abstract-121 { - &:before { - content: '\EF85'; - } -} diff --git a/styles/system/index.less b/styles/system/index.less index 61d4c965..dfa912d4 100644 --- a/styles/system/index.less +++ b/styles/system/index.less @@ -1,30 +1,36 @@ @import '../chat/all.less'; @import '../chat/chat-card.less'; -@import '../chat/constants.less'; @import '../chat/damage.less'; @import '../chat/interactive-card.less'; +@import '../chat/obstacle-card.less'; @import '../chat/roll-card.less'; @import '../chat/rolls.less'; @import '../chat/san-chat-card.less'; @import 'coc7.less'; @import 'constants.less'; -@import 'game-icons.less'; @import 'inline.less'; @import '../interface/app.less'; @import '../interface/combat-tracker.less'; @import '../interface/compendium.less'; @import '../interface/controls.less'; +@import '../interface/dropdown.less'; @import 'main.less'; @import '../sheets/actor.less'; @import '../sheets/book.less'; +@import '../sheets/spell.less'; @import '../sheets/character.less'; @import '../sheets/chase.less'; @import '../sheets/combat.less'; @import '../sheets/development.less'; @import '../sheets/items.less'; @import '../sheets/occupation.less'; +@import '../sheets/form-applications.less'; @import '../sheets/sheet.less'; @import '../sheets/sheets.less'; @import '../sheets/vehicle.less'; @import 'variables.less'; @import 'default-override.less'; +@import '../sheets/summary.less'; +@import 'tooltips.less'; +@import 'compendiums.less'; +@import '../dev.less'; diff --git a/styles/system/inline.less b/styles/system/inline.less index f3c64cbd..378ea3e5 100644 --- a/styles/system/inline.less +++ b/styles/system/inline.less @@ -6,14 +6,27 @@ border-radius: 2px; white-space: nowrap; word-break: break-all; - i { vertical-align: middle; } } - .coc7-inline-check { .chatFont(); font-size: 0.75rem; text-align: left; } + +a.coc7-link { + display: inline-flex; + align-items: center; + img { + border: none; + width: 1rem; + margin-right: 0.2rem; + } +} + +.chat-message .message-content .effect-message { + border: 0.2rem groove; + padding: 0.5rem; +} diff --git a/styles/system/main.less b/styles/system/main.less index 4433fac5..21dc1328 100644 --- a/styles/system/main.less +++ b/styles/system/main.less @@ -97,6 +97,7 @@ } .tag { display: inline-block; + white-space: nowrap; margin: 0 2px 0 0; padding: 0 3px; font-size: 9px; @@ -334,16 +335,19 @@ flex: 0 0 auto; height: 16px; } - .status-monitor { + .condition-monitors { + font-size: 1rem; + } + .condition-monitor { flex: 0 0 25px; color: darkgrey; padding: 1px 6px; text-align: center; } - .status-monitor.invert { + .condition-monitor.invert { transform: rotateZ(180deg); } - .status-monitor.status-on { + .condition-monitor.status-on { color: darkred; } .sheet-body { @@ -480,18 +484,29 @@ cursor: default; } } - .sheet-tabs { + .sheet-nav { flex: 0 0 20px; - margin-bottom: 5px; + margin: 4px 0 5px; + line-height: 20px; font-family: customSheetFont, 'Palatino Linotype', serif; font-size: 20px; border: 0; - .item { + .tab-name { line-height: 15px; margin: 0 10px; border-bottom: 3px solid #b5b3a4; + text-align: center; + &.keeper-only-tab { + flex: 0 0 30px; + span { + vertical-align: bottom; + i { + color: @colorGreen; + } + } + } } - .item.active { + .tab-name.active { border-bottom: 3px solid #44191a; } } @@ -543,50 +558,12 @@ } } .coc7.chat-card { - .dropbtn { - font-size: 10px; - border: none; - cursor: pointer; - display: inline-block; - width: 100%; - height: 100%; - } - .dropdown { - &:hover { - background-color: lightgray; - } - position: relative; - display: inline-block; - a { - &:hover { - background-color: #ddd; - text-shadow: 0 0 8px red; - } - } - } .toggle-switch { + text-align: center; &:hover { background-color: lightgray; } } - .dropdown-content { - display: block; - visibility: hidden; - position: absolute; - background-color: #f1f1f1; - min-width: 100px; - overflow: auto; - box-shadow: 0px 8px 16px 0px rgba(0, 0, 0, 0.2); - z-index: 1; - a { - color: black; - text-decoration: none; - display: block; - } - } - .show { - visibility: visible; - } label { text-align: left; margin-bottom: 0; @@ -700,9 +677,6 @@ height: 16px; } } -.coc7.dialoge.actor-importer { - min-width: 580px; -} .coc7.sheet.creature { min-width: 580px; } diff --git a/styles/system/tooltips.less b/styles/system/tooltips.less new file mode 100644 index 00000000..85e1fbd6 --- /dev/null +++ b/styles/system/tooltips.less @@ -0,0 +1,23 @@ +#help-tooltip { + z-index: 509; + position: absolute; + left: -999px; + top: -999px; + background-color: #fff; + padding: 0.5rem 0 0 0; + border: 2px solid #670b0b; + background: url(/ui/parchment.jpg) repeat; + label { + font-weight: bold; + font-size: 0.8rem; + margin: 0.5rem; + } + ol { + padding: 0; + margin: 0 0.5rem 0.5rem; + list-style: none; + li { + font-size: 0.75rem; + } + } +} diff --git a/styles/system/variables.less b/styles/system/variables.less index 64c5a756..c071022b 100644 --- a/styles/system/variables.less +++ b/styles/system/variables.less @@ -1,37 +1,5 @@ -/* Deprecated vars */ @borderLight: #ccc; @borderDark: #666; - -/* ----------------------------------------- */ -/* Fonts */ -/* ----------------------------------------- */ - -// @font-face { -// font-family: 'Modesto Condensed'; -// font-style: normal; -// font-weight: 400; -// src: url('../../assets/fonts/modesto-condensed/modesto-condensed.woff2') -// format('woff2'); -// } - -// @font-face { -// font-family: 'Modesto Condensed'; -// font-style: normal; -// font-weight: 700; -// src: url('../../assets/fonts/modesto-condensed/modesto-condensed-bold.woff2') -// format('woff2'); -// } - -// .modesto { -// font-family: customSheetFont, 'Modesto Condensed', 'Palatino Linotype', serif; -// font-size: 20px; -// font-weight: 700; -// } - -/* ----------------------------------------- */ -/* Sheet Styles */ -/* ----------------------------------------- */ - @colorDark: #191813; @colorFaint: #c9c7b8; @colorBeige: #b5b3a4; @@ -40,22 +8,15 @@ @colorCrimson: #44191a; @borderGroove: 2px groove #eeede0; @sheetBackground: url('../assets/images/background.webp') repeat; - -/* ----------------------------------------- */ -/* Flexbox */ -/* ----------------------------------------- */ - .flexrow { display: flex; flex-direction: row; flex-wrap: wrap; justify-content: flex-start; width: 100%; - > * { flex: 1; } - .flex1 { flex: 1; } @@ -68,17 +29,17 @@ .flex4 { flex: 4; } + .flex-end { + justify-content: flex-end; + } } - .flexcol { display: flex; flex-direction: column; flex-wrap: nowrap; - > * { flex: 1; } - .flex1 { flex: 1; } @@ -91,12 +52,7 @@ .flex4 { flex: 4; } + .flex-end { + justify-content: flex-end; + } } - -// .chat-message{ -// background: url(./assets/background.webp) repeat;; -// } - -// .window-app .window-content{ -// background: url(./assets/background.webp) repeat;; -// } diff --git a/system.json b/system.json index 11fcef48..71b36328 100644 --- a/system.json +++ b/system.json @@ -2,48 +2,63 @@ "name": "CoC7", "title": "Call of Cthulhu 7th Edition (Unofficial)", "description": "An unofficial implementation of the Call of Cthulhu 7th Edition game system for Foundry Virtual Tabletop.", - "version": "0.6.7", - "author": "Miskatonic Investigative Society", - "minimumCoreVersion": "0.8.6", - "compatibleCoreVersion": "0.8.9", - "esmodules": ["bundle.js"], + "version": "0.8.0", + "authors": [ + { + "name": "Miskatonic Investigative Society" + } + ], + "minimumCoreVersion": "9", + "compatibleCoreVersion": "10", + "esmodules": [ + "lib/socketlib/src/libwrapper_shim.js", + "lib/socketlib/src/socketlib.js", + "bundle.js" + ], "templateVersion": 1, - "styles": ["style.css"], + "styles": ["lib/game-icons/game-icons.css", "coc7g.css"], "packs": [ { "label": "Skills", - "entity": "Item", + "type": "Item", "name": "skills", "path": "./packs/skills.db", "system": "CoC7" }, { "label": "Items Examples", - "entity": "Item", + "type": "Item", "name": "items", "path": "./packs/items.db", "system": "CoC7" }, { "label": "Examples", - "entity": "Actor", + "type": "Actor", "name": "examples", "path": "./packs/examples.db", "system": "CoC7" }, { "label": "Roll Requests", - "entity": "JournalEntry", + "type": "JournalEntry", "name": "roll-requests", "path": "./packs/roll-requests.db", "system": "CoC7" }, { "label": "Sanity Roll Table", - "entity": "RollTable", + "type": "RollTable", "name": "sanity-tables-examples", "path": "./packs/sanity-tables-examples.db", "system": "CoC7" + }, + { + "label": "System manual", + "type": "JournalEntry", + "name": "system-doc", + "path": "./packs/system-doc.db", + "system": "CoC7" } ], "languages": [ @@ -90,7 +105,7 @@ { "lang": "zh-tw", "name": "正體中文", - "path": "lang/zh-tw.json" + "path": "lang/zh-TW.json" }, { "lang": "sv", @@ -101,6 +116,16 @@ "lang": "cs", "name": "Čeština", "path": "lang/cs.json" + }, + { + "lang": "ko", + "name": "한국어", + "path": "lang/ko.json" + }, + { + "lang": "it", + "name": "Italiano", + "path": "lang/it.json" } ], "socket": true, diff --git a/template.json b/template.json index fb5e3ba1..f08d4081 100644 --- a/template.json +++ b/template.json @@ -1,6 +1,6 @@ { "Actor": { - "types": ["character", "npc", "creature", "vehicle"], + "types": ["character", "npc", "creature", "vehicle", "container"], "templates": { "characteristics": { "characteristics": { @@ -122,33 +122,26 @@ } }, "status": { - "status": { + "conditions": { "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 } } @@ -188,16 +181,29 @@ "archetype": null }, "biography": [], - "encounteredCreatures": [], + "sanityLossEvents": [], "backstory": "", "indefiniteInsanityLevel": { "value": 0, "max": 0 }, + "description": { + "keeper": "" + }, "notes": "" }, "npc": { "templates": ["characteristics", "attribs", "status", "biography"], + "description": { + "keeper": "" + }, + "special": { + "sanLoss": { + "checkPassed": null, + "checkFailled": null + }, + "attacksPerRound": 1 + }, "infos": { "occupation": "", "age": "", @@ -209,6 +215,9 @@ }, "creature": { "templates": ["characteristics", "attribs", "status", "biography"], + "description": { + "keeper": "" + }, "special": { "attribs": { "move": { @@ -264,6 +273,15 @@ "properties": { "armed": false } + }, + "container": { + "description": { + "value": "", + "keeper": "" + }, + "flags": { + "locked": false + } } }, "Item": { @@ -281,7 +299,10 @@ "chase" ], "item": { - "description": "", + "description": { + "value": "", + "keeper": "" + }, "quantity": 1, "weight": 0, "attributes": {} @@ -290,7 +311,8 @@ "description": { "value": "", "chat": "", - "special": "" + "special": "", + "keeper": "" }, "wpnType": "", "skill": { @@ -334,12 +356,14 @@ "price": {} }, "skill": { + "skillName": "", "specialization": "", "description": { "value": "", "opposingDifficulty": "", "pushedFaillureConsequences": "", - "chat": "" + "chat": "", + "keeper": "" }, "base": 0, "adjustments": { @@ -356,7 +380,8 @@ }, "occupation": { "description": { - "value": "" + "value": "", + "keeper": "" }, "source": null, "type": { @@ -431,7 +456,8 @@ }, "archetype": { "description": { - "value": "" + "value": "", + "keeper": "" }, "source": null, "type": { @@ -465,7 +491,8 @@ }, "setup": { "description": { - "value": "" + "value": "", + "keeper": "" }, "characteristics": { "points": { @@ -508,43 +535,43 @@ "flags": {} }, "spell": { - "source": null, - "castingTime": null, - "cost": { - "mp": null, - "san": null, - "pow": null, - "hp": null, - "other": [] + "alternativeNames": [], + "castingTime": "", + "costs": { + "hitPoints": 0, + "magicPoints": 0, + "others": "", + "sanity": 0, + "power": 0 }, "description": { - "value": "", "chat": "", - "unidentified": "", - "notes": "" + "value": "", + "keeper": "" }, + "effects": [], + "source": "", + "learned": false, "type": { + "bind": false, "call": false, - "dismiss": false, + "combat": false, "contact": false, - "summon": false, - "bind": false, + "dismiss": false, "enchantment": false, "gate": false, - "combat": false - }, - "alternativeNames": [], - "effects": [], - "properties": {}, - "flags": {} + "summon": false + } }, "book": { + "alternativeNames": [], "author": "", "content": "", "date": "", "description": { "chat": "", - "value": "" + "value": "", + "keeper": "" }, "difficultyLevel": "", "fullStudies": 0, @@ -557,14 +584,14 @@ "others": [] }, "initialReading": false, - "keeperNotes": "", "language": "", "mythosRating": 0, "sanityLoss": 0, "spells": [], "study": { "necessary": 0, - "progress": 0 + "progress": 0, + "units": "CoC7.weeks" }, "type": { "mythos": false, @@ -577,7 +604,8 @@ "description": { "value": "", "chat": "", - "notes": "" + "notes": "", + "keeper": "" }, "type": { "physical": false, @@ -595,7 +623,8 @@ "description": { "value": "", "chat": "", - "notes": "" + "notes": "", + "keeper": "" }, "duration": { "permanent": true, @@ -609,11 +638,21 @@ } }, "chase": { + "description": { + "keeper": "" + }, "locations": { "total": 0, "startingRange": 1, "list": [] }, + "includeEscaped": false, + "includeLatecomers": false, + "showTokenMovement": true, + "startingRange": 2, + "startingIndex": 0, + "started": false, + "vehicle": false, "participants": [] } } diff --git a/templates/actors/character-sheet-v2.html b/templates/actors/character-sheet-v2.html index 411367fd..2d9d21a2 100644 --- a/templates/actors/character-sheet-v2.html +++ b/templates/actors/character-sheet-v2.html @@ -1,204 +1,309 @@ -
                                                        + + {{#if showHiddenDevMenu}} +
                                                        + + +
                                                        + {{/if}} + {{#unless permissionLimited}} +
                                                        + {{#if canDragToken}} +
                                                        + {{/if}} + {{#if linkedActor}} +
                                                        + {{else}} +
                                                        + {{/if}} + {{#if isToken}} +
                                                        + {{/if}} +
                                                        -
                                                        - -
                                                        - -
                                                        -
                                                        - - -
                                                        - {{#if displayPlayerName}} -
                                                        - - -
                                                        - {{/if}} - {{#if pulpCharacter}} -
                                                        - - {{#if data.infos.archetypeSet}} - {{data.infos.archetype}} - {{#unless data.flags.locked}} - - {{/unless}} - {{else}} - - {{/if}} -
                                                        -
                                                        - - -
                                                        - {{/if}} -
                                                        - - {{#if data.infos.occupationSet}} - {{data.infos.occupation}} - {{#unless data.flags.locked}} - - {{/unless}} - {{else}} - - {{/if}} -
                                                        -
                                                        - - - - -
                                                        -
                                                        - - -
                                                        -
                                                        - - -
                                                        -
                                                        +
                                                        + +
                                                        -
                                                        -
                                                        -
                                                        - {{#each actor.characteristics as |characteristic key|}} -
                                                        -
                                                        -
                                                        {{characteristic.shortName}}
                                                        -
                                                        -
                                                        - -
                                                        -
                                                        {{characteristic.hard}}
                                                        -
                                                        {{characteristic.extreme}}
                                                        -
                                                        -
                                                        - {{/each}} -
                                                        - -
                                                        -
                                                        +
                                                        +
                                                        + + +
                                                        + {{#if displayPlayerName}} +
                                                        + + +
                                                        + {{/if}} + {{#if pulpRuleArchetype}} +
                                                        + + {{#if data.infos.archetypeSet}} + {{data.infos.archetype}} + {{#unless data.flags.locked}} + + {{/unless}} + {{else}} + + {{/if}} +
                                                        + {{/if}} + {{#if pulpRuleOrganization}} +
                                                        + + +
                                                        + {{/if}} +
                                                        + + {{#if data.infos.occupationSet}} + {{data.infos.occupation}} + {{#unless data.flags.locked}} + + {{/unless}} + {{else}} + + {{/if}} +
                                                        +
                                                        + + + + +
                                                        +
                                                        + + +
                                                        +
                                                        + + +
                                                        +
                                                        - +
                                                        +
                                                        +
                                                        + {{#each actor.characteristics as |characteristic key|}} +
                                                        +
                                                        +
                                                        {{characteristic.shortName}}
                                                        +
                                                        +
                                                        + +
                                                        +
                                                        {{characteristic.hard}}
                                                        +
                                                        {{characteristic.extreme}}
                                                        +
                                                        +
                                                        + {{/each}} +
                                                        + +
                                                        + -
                                                        -
                                                        -
                                                        - {{!----}} - {{#if showDevPannel}} - {{> "systems/CoC7/templates/actors/parts/development-controls.html"}} - {{else}} - {{> "systems/CoC7/templates/actors/parts/vitals.html"}} - {{/if}} -
                                                        + -
                                                        - {{#if showDevPannel}} -
                                                        - {{> "systems/CoC7/templates/actors/parts/character-development-v2.html"}} -
                                                        - {{/if}} +
                                                        +
                                                        +
                                                        + {{#if showDevPannel}} + {{> "systems/CoC7/templates/actors/parts/development-controls.html"}} + {{else}} + {{> "systems/CoC7/templates/actors/parts/vitals.html"}} + {{/if}} +
                                                        -
                                                        - {{> "systems/CoC7/templates/actors/parts/actor-skills-v2.html"}} -
                                                        +
                                                        + {{#if showDevPannel}} +
                                                        + {{> "systems/CoC7/templates/actors/parts/character-development-v2.html"}} +
                                                        + {{/if}} -
                                                        - {{> "systems/CoC7/templates/actors/parts/combat.html"}} -
                                                        +
                                                        + {{> "systems/CoC7/templates/actors/parts/actor-skills-v2.html"}} +
                                                        -
                                                        - {{> "systems/CoC7/templates/actors/parts/actor-inventory.html"}} -
                                                        +
                                                        + {{> "systems/CoC7/templates/actors/parts/combat.html"}} +
                                                        -
                                                        - {{#if oneBlockBackStory}} - {{editor content=data.backstory target="data.backstory" button=true owner=owner editable=editable}} - {{else}} - {{> "systems/CoC7/templates/actors/parts/actor-background.html"}} - {{/if}} -
                                                        -
                                                        -
                                                        +
                                                        + {{> "systems/CoC7/templates/actors/parts/actor-inventory.html"}} +
                                                        -
                                                        +
                                                        + {{#if oneBlockBackStory}} + {{editor content=data.backstory target="data.backstory" button=true owner=owner editable=editable}} + {{> "systems/CoC7/templates/actors/parts/actor-mythos-enounters.hbs"}} + {{else}} + {{> "systems/CoC7/templates/actors/parts/actor-background.html"}} + {{/if}} +
                                                        +
                                                        + {{> "systems/CoC7/templates/common/active-effects.hbs"}} +
                                                        -
                                                        - + {{#if isGM}} +
                                                        + {{editor content=data.description.keeper target="data.description.keeper" button=true owner=owner editable=editable}} + {{#if hasConditions}} + + {{/if}} +
                                                        + {{> "systems/CoC7/templates/actors/parts/actor-keeper-mythos-enounters.hbs"}} +
                                                        +
                                                        + +
                                                        +
                                                        +
                                                        +
                                                        {{localize 'CoC7.BackgroundFlagsMythosExperienced'}}
                                                        + +
                                                        +
                                                        +
                                                        {{localize 'CoC7.BackgroundFlagsMythosHardened'}}
                                                        + +
                                                        +
                                                        +
                                                        +
                                                        +
                                                        + {{/if}} +
                                                        +
                                                        + + + {{else}} +
                                                        + +
                                                        +{{/unless}} + \ No newline at end of file diff --git a/templates/actors/character-sheet.html b/templates/actors/character-sheet.html deleted file mode 100644 index ac9a16c2..00000000 --- a/templates/actors/character-sheet.html +++ /dev/null @@ -1,395 +0,0 @@ -
                                                        - - {{!-- Sheet Header --}} -
                                                        -
                                                        -
                                                        -
                                                        - - -
                                                        - {{#if pulpCharacter}} -
                                                        - - {{#if data.infos.archetypeSet}} - {{data.infos.archetype}} - {{#unless data.flags.locked}} - - {{/unless}} - {{else}} - - {{/if}} -
                                                        -
                                                        - - -
                                                        - {{/if}} -
                                                        - - {{#if data.infos.occupationSet}} - {{data.infos.occupation}} - {{#unless data.flags.locked}} - - {{/unless}} - {{else}} - - {{/if}} -
                                                        -
                                                        - - - - -
                                                        -
                                                        - - -
                                                        -
                                                        - - -
                                                        -
                                                        - -
                                                        - {{#each data.characteristics as |characteristic key|}} -
                                                        -
                                                        {{localize characteristic.short}}
                                                        - {{#if characteristic.editable}} - - {{else}} - - {{/if}} -
                                                        - {{characteristic.hard}}
                                                        {{characteristic.extreme}} -
                                                        -
                                                        - {{/each}} -
                                                        - {{#if isDead}} -
                                                        - -
                                                        - {{else}} - {{#if isDying}} -
                                                        - -
                                                        - {{else}} - - {{/if}} - {{/if}} -
                                                        - -
                                                        -
                                                        - - - / - {{#if data.attribs.hp.auto}} - - {{else}} - - {{/if}} - {{#unless data.flags.locked}} -
                                                        - {{/unless}} -
                                                        -
                                                        - - - / - {{#if data.attribs.mp.auto}} - - {{else}} - - {{/if}} - {{#unless data.flags.locked}} -
                                                        - {{/unless}} -
                                                        -
                                                        - - - / - {{#if data.attribs.san.auto}} - - {{else}} - - {{/if}} - {{#unless data.flags.locked}} -
                                                        - {{/unless}} -
                                                        -
                                                        - - - -
                                                        -
                                                        -
                                                        -
                                                        - - {{data.attribs.mov.value}} -
                                                        -
                                                        - - {{#if data.attribs.db.auto}} - - - {{else}} - - {{/if}} -
                                                        -
                                                        - {{data.attribs.build.value}} -
                                                        -
                                                        - - -
                                                        -
                                                        -
                                                        -
                                                        - - -
                                                        - - {{data.attribs.san.dailyLoss}} - -
                                                        - - - - - - -
                                                        - {{#if isDying}} - - {{else}} -
                                                        - {{/if}} -
                                                        - - - -
                                                        - {{#if data.flags.locked}} - - {{else}} - - {{/if}} -
                                                        -
                                                        - - {{!-- Sheet Tab Navigation --}} - - - {{!-- Sheet Body --}} -
                                                        - {{#if showDevPannel}} -
                                                        - {{> "systems/CoC7/templates/actors/parts/character-development.html"}} -
                                                        - {{/if}} - - {{!-- Skills Tab --}} -
                                                        - {{#unless data.flags.locked}} -
                                                        -
                                                        {{localize 'CoC7.AddSkill'}}
                                                        -
                                                        - {{/unless}} - {{> "systems/CoC7/templates/actors/parts/actor-skills.html"}} -
                                                        - -
                                                        - {{> "systems/CoC7/templates/actors/parts/actor-weapons.html"}} -
                                                        - -
                                                        -
                                                        -
                                                        - {{#unless data.flags.locked}} -
                                                        -
                                                        {{localize 'CoC7.AddItem'}}
                                                        -
                                                        - {{/unless}} -
                                                          -
                                                          -
                                                        1. -
                                                          -

                                                          {{localize 'CoC7.Items'}}

                                                          -
                                                          -
                                                        2. -
                                                            - {{#each itemsByType.item as |item id|}} -
                                                          1. -
                                                            -

                                                            {{item.name}}

                                                            -
                                                            - - -
                                                            -
                                                          2. - {{/each}} -
                                                          -
                                                          -
                                                          -
                                                        3. -
                                                          -

                                                          {{localize 'CoC7.Books'}}

                                                          -
                                                          -
                                                        4. -
                                                            - {{#each itemsByType.book as |item id|}} -
                                                          1. -
                                                            -

                                                            {{item.name}}

                                                            -
                                                            - - -
                                                            -
                                                          2. - {{/each}} -
                                                          -
                                                          -
                                                          -
                                                        5. -
                                                          -

                                                          {{localize 'CoC7.Spells'}}

                                                          -
                                                          -
                                                        6. -
                                                            - {{#each itemsByType.spell as |item id|}} -
                                                          1. -
                                                            -

                                                            {{item.name}}

                                                            -
                                                            - - -
                                                            -
                                                          2. - {{/each}} -
                                                          -
                                                          - {{#if pulpCharacter}} - {{#if itemsByType.talent}} -
                                                          -
                                                        7. -
                                                          -

                                                          {{localize 'CoC7.PulpTalents'}}

                                                          -
                                                          -
                                                        8. -
                                                            - {{#each itemsByType.talent as |item id|}} -
                                                          1. -
                                                            -

                                                            {{item.name}}

                                                            -
                                                            - - -
                                                            -
                                                          2. - {{/each}} -
                                                          -
                                                          - {{/if}} - {{/if}} -
                                                        -
                                                        -
                                                        - {{#unless data.flags.locked}} -
                                                        - {{#if data.flags.manualCredit}} - -
                                                        - {{else}} - - - - - {{/if}} -
                                                        - -
                                                        -
                                                        - {{/unless}} -
                                                        - - {{#if data.flags.manualCredit}} - - {{else}} - {{credit.spendingLevel}} - {{/if}} -
                                                        -
                                                        - - {{#if data.flags.manualCredit}} - - {{else}} - {{credit.cash}} - {{/if}} - -
                                                        -
                                                        - - {{#if data.flags.manualCredit}} - - {{else}} - {{credit.assets}} - {{/if}} -
                                                        -
                                                        - -
                                                        - -
                                                        - -
                                                        -
                                                        -
                                                        -
                                                        - -
                                                        - {{#unless data.flags.locked}} -
                                                        -
                                                        {{localize 'CoC7.BackgroundNewSection'}}
                                                        -
                                                        - {{/unless}} -
                                                        - {{#each data.biography as |section index|}} -
                                                        - {{#if ../data.flags.locked}} -
                                                        - -
                                                        - {{else}} -
                                                        - -
                                                        -
                                                        - - {{#unless section.isFirst}}{{/unless}} - {{#unless section.isLast}}{{/unless}} -
                                                        -
                                                        - {{/if}} - - -
                                                        - {{/each}} -
                                                        -
                                                        -
                                                        -
                                                        \ No newline at end of file diff --git a/templates/actors/character/index.html b/templates/actors/character/index.html new file mode 100644 index 00000000..a80e25e1 --- /dev/null +++ b/templates/actors/character/index.html @@ -0,0 +1,5 @@ +{{#if summarized}} + {{> "systems/CoC7/templates/actors/character/summary.html"}} +{{else}} + {{> "systems/CoC7/templates/actors/character-sheet-v2.html"}} +{{/if}} diff --git a/templates/actors/character/summary.html b/templates/actors/character/summary.html new file mode 100644 index 00000000..b89a25db --- /dev/null +++ b/templates/actors/character/summary.html @@ -0,0 +1,210 @@ +
                                                        +
                                                        +
                                                        +
                                                        + +
                                                        + +
                                                        +
                                                        /
                                                        +
                                                        + {{#if data.attribs.lck.auto}} + + {{else}} + + {{/if}} +
                                                        +
                                                        +
                                                        + +
                                                        + +
                                                        +
                                                        /
                                                        +
                                                        + {{#if data.attribs.hp.auto}} + + {{else}} + + {{/if}} +
                                                        +
                                                        + + + + + {{#if data.status.dead.value}} + + {{else}} + + {{/if}} +
                                                        +
                                                        +
                                                        + +
                                                        + +
                                                        +
                                                        /
                                                        +
                                                        + {{#if data.attribs.san.auto}} + + {{else}} + + {{/if}} +
                                                        +
                                                        + + + +
                                                        +
                                                        +
                                                        + +
                                                        + +
                                                        +
                                                        /
                                                        +
                                                        + {{#if data.attribs.mp.auto}} + + {{else}} + + {{/if}} +
                                                        +
                                                        +
                                                        +
                                                        +
                                                        + {{#each actor.characteristics as |characteristic key|}} +
                                                        +
                                                        +
                                                        {{characteristic.shortName}}
                                                        +
                                                        +
                                                        + +
                                                        +
                                                        {{characteristic.hard}}
                                                        +
                                                        {{characteristic.extreme}}
                                                        +
                                                        +
                                                        + {{/each}} +
                                                        + +
                                                        +
                                                        + {{#if showIconsOnly}} +
                                                          + {{#each skillsByValue as |skill|}} +
                                                        1. +
                                                          +
                                                        2. + {{/each}} +
                                                        + {{else}} +
                                                          + {{#each topSkills as |skill|}} +
                                                        1. +
                                                          +
                                                          {{skill.name}}
                                                          +
                                                          {{skill.data.value}}
                                                          +
                                                          + {{#unless skill.data.properties.noxpgain}} + {{#if skill.data.flags.developement}} + + {{else}} + + {{/if}} + {{/unless}} +
                                                          +
                                                        2. + {{/each}} +
                                                        + {{/if}} +
                                                        +
                                                        +
                                                          + {{#each topWeapons as |weapon|}} + {{#if weapon.data.properties.melee}} +
                                                        1. +
                                                          +
                                                          +
                                                          {{weapon.name}}
                                                          + {{#if weapon.data.properties.thrown}} + + {{/if}} +
                                                          +
                                                          + {{weapon.data.range.normal.damage}} +
                                                          +
                                                          + {{#if weapon.data.properties.addb}}{{localize 'CoC7.WeaponAddb'}}{{/if}} + {{#if weapon.data.properties.ahdb}}{{localize 'CoC7.WeaponAhdb'}}{{/if}} +
                                                          +
                                                        2. + {{else}} +
                                                        3. +
                                                          +
                                                          +
                                                          {{weapon.name}}
                                                          + {{#if weapon.usesAlternateSkill}} + + {{/if}} +
                                                          +
                                                          + {{weapon.data.range.normal.damage}} +
                                                          +
                                                          +
                                                          + {{weapon.data.ammo}} +
                                                          +
                                                          + +
                                                          +
                                                          +
                                                        4. + {{/if}} + {{/each}} +
                                                        +
                                                        + + {{#if data.flags.manualCredit}} + + {{else}} + {{credit.spendingLevel}} + {{/if}} +
                                                        +
                                                        + + {{#if data.flags.manualCredit}} + + {{else}} + {{credit.cash}} + {{/if}} + +
                                                        +
                                                        +
                                                        +
                                                        \ No newline at end of file diff --git a/templates/actors/creature-sheet.html b/templates/actors/creature-sheet.html deleted file mode 100644 index 8be7f093..00000000 --- a/templates/actors/creature-sheet.html +++ /dev/null @@ -1,398 +0,0 @@ -
                                                        - - {{!-- Sheet Header --}} -
                                                        -
                                                        -
                                                        -
                                                        - - -
                                                        -
                                                        - - -
                                                        -
                                                        - -
                                                        - {{#each data.characteristics as |characteristic key|}} - {{#if ../data.flags.locked}} - {{#if characteristic.display}} -
                                                        -
                                                        - -
                                                        -
                                                        - {{#if characteristic.editable}} - - {{else}} - - {{/if}} -
                                                        -
                                                        - {{/if}} - {{else}} -
                                                        -
                                                        - -
                                                        - {{#if ../displayFormula}} -
                                                        - -
                                                        - {{else}} -
                                                        - {{#if characteristic.editable}} - - {{else}} - - {{/if}} -
                                                        - {{/if}} -
                                                        - {{/if}} - {{/each}} -
                                                        - -
                                                        -
                                                        - - - / - {{#if data.attribs.hp.auto}} - - - {{else}} - - {{/if}} - - {{#unless data.flags.locked}} -
                                                        - {{/unless}} - -
                                                        - {{#if data.flags.locked}} -
                                                        - {{#if hasMp}} - - - / - {{#if data.attribs.mp.auto}} - - - {{else}} - - {{/if}} - - {{/if}} -
                                                        - -
                                                        - {{#if hasSan}} - - - / - - - {{/if}} -
                                                        - -
                                                        - {{#if hasLuck}} - - - - {{/if}} -
                                                        - {{else}} -
                                                        - - - / - {{#if data.attribs.mp.auto}} - - - {{else}} - - {{/if}} -
                                                        - -
                                                        - -
                                                        - - - / - {{#if data.attribs.san.auto}} - - {{else}} - - {{/if}} -
                                                        - -
                                                        - -
                                                        - - - -
                                                        - {{/if}} -
                                                        - -
                                                        -
                                                        - - - {{#if data.attribs.mov.auto}} - {{data.attribs.mov.value}} - {{else}} - - {{/if}} - - {{#unless data.flags.locked}} -
                                                        - {{/unless}} - -
                                                        -
                                                        - - - {{#if data.attribs.db.auto}} - {{data.attribs.db.value}} - {{else}} - - {{/if}} - - - {{#unless data.flags.locked}} -
                                                        - {{/unless}} -
                                                        -
                                                        - - {{#if data.attribs.build.auto}} - {{data.attribs.build.value}} - {{else}} - - {{/if}} - - {{#unless data.flags.locked}} -
                                                        - {{/unless}} -
                                                        -
                                                        - - - - -
                                                        -
                                                        - -
                                                        - {{#if isDying}} - - {{else}} - - - - - - - -
                                                        -
                                                        - - - {{#if data.flags.locked}} - {{data.special.sanLoss.checkPassed}} - / - {{data.special.sanLoss.checkFailled}} - {{else}} - - / - - {{/if}} -
                                                        -
                                                        -
                                                        - {{#if allowFormula}} - {{#if data.flags.locked}} -
                                                        - {{else}} - {{#if displayFormula}} -
                                                        - {{else}} - - - {{/if}} - {{/if}} - {{else}} -
                                                        - {{/if}} - {{#if data.flags.locked}} - - {{else}} - - {{#if allowFormula}} - {{#if displayFormula}} - - {{else}} - - {{/if}} - {{/if}} - {{/if}} -
                                                        - {{/if}} -
                                                        -
                                                        - {{#if isDead}} -
                                                        - -
                                                        - {{else}} - {{#if isDying}} -
                                                        - -
                                                        - {{else}} - - {{/if}} - {{/if}} -
                                                        - - - {{!-- Sheet Body --}} -
                                                        -
                                                        - -
                                                        -
                                                        -

                                                        {{localize 'CoC7.Skills'}}

                                                        - {{#unless data.flags.locked}} -
                                                        - -
                                                        - {{/unless}} -
                                                        -
                                                        - {{> "systems/CoC7/templates/actors/parts/npc-skills.html"}} -
                                                        -
                                                        - -
                                                        -
                                                        -

                                                        {{localize 'CoC7.Combat'}}

                                                        - {{#unless data.flags.locked}} -
                                                        - -
                                                        - {{/unless}} -
                                                        -
                                                        - {{> "systems/CoC7/templates/actors/parts/npc-combat.html"}} -
                                                        -
                                                        - - {{#if hasInventory}} -
                                                        -
                                                        -

                                                        {{localize 'CoC7.Inventory'}}

                                                        - {{#unless data.flags.locked}} -
                                                        - -
                                                        - {{/unless}} -
                                                        -
                                                        -
                                                          - {{#if itemsByType.item}} -
                                                          -
                                                        1. -
                                                          -

                                                          {{localize 'CoC7.Items'}}

                                                          -
                                                          -
                                                        2. -
                                                            - {{#each itemsByType.item as |item id|}} -
                                                          1. -
                                                            -

                                                            {{item.name}}

                                                            -
                                                            - - -
                                                            -
                                                          2. - {{/each}} -
                                                          -
                                                          - {{/if}} - {{#if itemsByType.book}} -
                                                          -
                                                        3. -
                                                          -

                                                          {{localize 'CoC7.Books'}}

                                                          -
                                                          -
                                                        4. -
                                                            - {{#each itemsByType.book as |item id|}} -
                                                          1. -
                                                            -

                                                            {{item.name}}

                                                            -
                                                            - - -
                                                            -
                                                          2. - {{/each}} -
                                                          -
                                                          - {{/if}} - {{#if itemsByType.spell}} -
                                                          -
                                                        5. -
                                                          -

                                                          {{localize 'CoC7.Spells'}}

                                                          -
                                                          -
                                                        6. -
                                                            - {{#each itemsByType.spell as |item id|}} -
                                                          1. -
                                                            -

                                                            {{item.name}}

                                                            -
                                                            - - -
                                                            -
                                                          2. - {{/each}} -
                                                          -
                                                          - {{/if}} -
                                                        -
                                                        -
                                                        - {{/if}} - - -
                                                        -
                                                        -

                                                        {{localize 'CoC7.Notes'}}

                                                        -
                                                        -
                                                        - {{editor content=data.biography.personalDescription.value target="data.biography.personalDescription.value" button=true owner=owner editable=editable}} -
                                                        -
                                                        -
                                                        -
                                                        -
                                                        diff --git a/templates/actors/npc-sheet.html b/templates/actors/npc-sheet.html index 412c91a3..cb0501d5 100644 --- a/templates/actors/npc-sheet.html +++ b/templates/actors/npc-sheet.html @@ -1,28 +1,51 @@
                                                        - +
                                                        + {{#if canDragToken}} +
                                                        + {{/if}} + {{#if linkedActor}} +
                                                        + {{else}} +
                                                        + {{/if}} + {{#if isToken}} +
                                                        + {{/if}} +
                                                        {{!-- Sheet Header --}}
                                                        {{#unless permissionLimited}}
                                                        -
                                                        - - -
                                                        -
                                                        - - -
                                                        - {{#if pulpCharacter}} -
                                                        - - -
                                                        + {{#if isCreature}} +
                                                        + + +
                                                        +
                                                        + + +
                                                        + {{else}} +
                                                        + + +
                                                        +
                                                        + + +
                                                        + {{#if pulpRuleOrganization}} +
                                                        + + +
                                                        + {{/if}} +
                                                        + + +
                                                        {{/if}} -
                                                        - - -
                                                        @@ -114,7 +137,7 @@
                                                        {{#if hasLuck}} - + {{/if}} @@ -161,7 +184,7 @@ {{#if data.attribs.mov.auto}} {{data.attribs.mov.value}} {{else}} - + {{/if}} {{#unless data.flags.locked}} @@ -213,17 +236,34 @@
                                                        -
                                                        - - - - +
                                                        + {{#if isDying}} + + {{else}} + + + + + + + +
                                                        - - +
                                                        + + {{#if data.flags.locked}} + {{data.special.sanLoss.checkPassed}} + / + {{data.special.sanLoss.checkFailled}} + {{else}} + + / + + {{/if}} +
                                                        -
                                                        +
                                                        {{#if allowFormula}} {{#if data.flags.locked}}
                                                        @@ -239,28 +279,30 @@
                                                        {{/if}} {{#if data.flags.locked}} - + {{else}} - + {{!-- --}} + {{#if allowFormula}} {{#if displayFormula}} - + {{else}} - + {{/if}} {{/if}} {{/if}}
                                                        + {{/if}}
                                                        {{/unless}} {{#if isDead}} -
                                                        - +
                                                        +
                                                        {{else}} {{#if isDying}} -
                                                        +
                                                        {{else}} @@ -269,14 +311,13 @@ {{/if}}
                                                        - {{!-- Sheet Body --}} {{#unless permissionLimited}}
                                                        -
                                                        +

                                                        {{localize 'CoC7.Skills'}}

                                                        {{#unless data.flags.locked}}
                                                        @@ -284,7 +325,7 @@

                                                        {{localize 'CoC7.Skills'}}

                                                        {{/unless}}
                                                        -
                                                        +
                                                        {{> "systems/CoC7/templates/actors/parts/npc-skills.html"}}
                                                        @@ -294,11 +335,22 @@

                                                        {{localize 'CoC7.Skills'}}

                                                        {{localize 'CoC7.Combat'}}

                                                        {{#unless data.flags.locked}}
                                                        - +
                                                        {{/unless}}
                                                        -
                                                        +
                                                        +
                                                        +
                                                         
                                                        +
                                                        +

                                                        {{localize 'CoC7.AttacksPerRound'}} :

                                                        + {{#if data.flags.locked}} +
                                                        {{data.special.attacksPerRound}}
                                                        + {{else}} + + {{/if}} +
                                                        +
                                                        {{> "systems/CoC7/templates/actors/parts/npc-combat.html"}}
                                                        @@ -307,106 +359,13 @@

                                                        {{localize 'CoC7.Combat'}}

                                                        {{localize 'CoC7.Inventory'}}

                                                        - {{#unless data.flags.locked}} -
                                                        - -
                                                        - {{/unless}}
                                                        -
                                                          - {{#if itemsByType.item}} -
                                                          -
                                                        1. -
                                                          -

                                                          {{localize 'CoC7.Items'}}

                                                          -
                                                          -
                                                        2. -
                                                            - {{#each itemsByType.item as |item id|}} -
                                                          1. -
                                                            -

                                                            {{item.name}}

                                                            -
                                                            - - -
                                                            -
                                                          2. - {{/each}} -
                                                          -
                                                          - {{/if}} - {{#if itemsByType.book}} -
                                                          -
                                                        3. -
                                                          -

                                                          {{localize 'CoC7.Books'}}

                                                          -
                                                          -
                                                        4. -
                                                            - {{#each itemsByType.book as |item id|}} -
                                                          1. -
                                                            -

                                                            {{item.name}}

                                                            -
                                                            - - -
                                                            -
                                                          2. - {{/each}} -
                                                          -
                                                          - {{/if}} - {{#if itemsByType.spell}} -
                                                          -
                                                        5. -
                                                          -

                                                          {{localize 'CoC7.Spells'}}

                                                          -
                                                          -
                                                        6. -
                                                            - {{#each itemsByType.spell as |item id|}} -
                                                          1. -
                                                            -

                                                            {{item.name}}

                                                            -
                                                            - - -
                                                            -
                                                          2. - {{/each}} -
                                                          -
                                                          - {{/if}} - {{#if pulpCharacter}} - {{#if itemsByType.talent}} -
                                                          -
                                                        7. -
                                                          -

                                                          {{localize 'CoC7.PulpTalents'}}

                                                          -
                                                          -
                                                        8. -
                                                            - {{#each itemsByType.talent as |item id|}} -
                                                          1. -
                                                            -

                                                            {{item.name}}

                                                            -
                                                            - - -
                                                            -
                                                          2. - {{/each}} -
                                                          -
                                                          - {{/if}} - {{/if}} -
                                                        + {{> "systems/CoC7/templates/actors/parts/actor-inventory-items.html"}}
                                                        {{/if}} -

                                                        {{localize 'CoC7.Notes'}}

                                                        @@ -415,7 +374,32 @@

                                                        {{localize 'CoC7.Notes'}}

                                                        {{editor content=data.biography.personalDescription.value target="data.biography.personalDescription.value" button=true owner=owner editable=editable}}
                                                        + +
                                                        +
                                                        +

                                                        {{localize 'CoC7.Effects'}}

                                                        +
                                                        +
                                                        + {{> "systems/CoC7/templates/common/active-effects.hbs"}} +
                                                        +
                                                        + + + + {{#if isGM}} +
                                                        +
                                                        +

                                                        {{localize 'CoC7.GmNotes'}}

                                                        +
                                                        +
                                                        + {{editor content=data.description.keeper target="data.description.keeper" button=true owner=owner editable=editable}} + {{#if hasConditions}} + + {{/if}} +
                                                        +
                                                        + {{/if}} {{/unless}} -
                                                        + \ No newline at end of file diff --git a/templates/actors/parts/actor-background.html b/templates/actors/parts/actor-background.html index b9ab24f6..94876ea4 100644 --- a/templates/actors/parts/actor-background.html +++ b/templates/actors/parts/actor-background.html @@ -3,26 +3,26 @@
                                                        {{localize 'CoC7.BackgroundNewSection'}}
                                                        {{/unless}} -
                                                        -{{#each data.biography as |section index|}} -
                                                        - {{#if ../data.flags.locked}} -
                                                        - -
                                                        - {{else}} -
                                                        - -
                                                        -
                                                        +
                                                        + {{#each data.biography as |section index|}} +
                                                        + {{#if ../data.flags.locked}} +
                                                        + +
                                                        + {{else}} +
                                                        + +
                                                        +
                                                        {{#unless section.isFirst}}{{/unless}} {{#unless section.isLast}}{{/unless}} +
                                                        + {{/if}} +
                                                        - {{/if}} - - -
                                                        -{{/each}} + {{/each}} + {{> "systems/CoC7/templates/actors/parts/actor-mythos-enounters.hbs"}}
                                                        \ No newline at end of file diff --git a/templates/actors/parts/actor-inventory-items.html b/templates/actors/parts/actor-inventory-items.html new file mode 100644 index 00000000..5f223614 --- /dev/null +++ b/templates/actors/parts/actor-inventory-items.html @@ -0,0 +1,159 @@ +{{#unless hasInventory}} +

                                                        {{localize 'CoC7.InventoryIsCurrentlyEmpty'}}

                                                        +{{/unless}} +
                                                          +
                                                        1. + {{#if showInventoryItems}} +
                                                          +
                                                            +
                                                          1. +
                                                            +

                                                            {{localize 'CoC7.Items'}}

                                                            + {{#unless data.flags.locked}} +
                                                            +
                                                            {{localize 'CoC7.AddItem'}}
                                                            +
                                                            + {{/unless}} +
                                                            +
                                                          2. + {{#each itemsByType.item as |item id|}} +
                                                          3. +
                                                            +

                                                            {{item.name}}

                                                            +
                                                            + + + +
                                                            +
                                                          4. + {{/each}} +
                                                          +
                                                          + {{/if}} + {{#if showInventoryBooks}} +
                                                          +
                                                            +
                                                          1. +
                                                            +

                                                            {{localize 'CoC7.Books'}}

                                                            + {{#unless data.flags.locked}} +
                                                            +
                                                            {{localize 'CoC7.AddBook'}}
                                                            +
                                                            + {{/unless}} +
                                                            +
                                                          2. + {{#each itemsByType.book as |item id|}} +
                                                          3. +
                                                            +

                                                            {{item.name}}

                                                            +
                                                            + + + +
                                                            +
                                                          4. + {{/each}} +
                                                          +
                                                          + {{/if}} + {{#if showInventorySpells}} +
                                                          +
                                                            +
                                                          1. +
                                                            +

                                                            {{localize 'CoC7.Spells'}}

                                                            + {{#unless data.flags.locked}} +
                                                            +
                                                            {{localize 'CoC7.AddSpell'}}
                                                            +
                                                            + {{/unless}} +
                                                            +
                                                          2. + {{#each itemsByType.spell as |item id|}} +
                                                          3. +
                                                            +

                                                            {{item.name}}

                                                            +
                                                            + + + +
                                                            +
                                                          4. + {{/each}} +
                                                          +
                                                          + {{/if}} + {{#if showInventoryTalents}} +
                                                          +
                                                            +
                                                          1. +
                                                            +

                                                            {{localize 'CoC7.PulpTalents'}}

                                                            +
                                                            +
                                                          2. + {{#each itemsByType.talent as |item id|}} +
                                                          3. +
                                                            +

                                                            {{item.name}}

                                                            +
                                                            + + +
                                                            +
                                                          4. + {{/each}} +
                                                          +
                                                          + {{/if}} + {{#if showInventoryWeapons}} +
                                                          +
                                                            +
                                                          1. +
                                                            +

                                                            {{localize 'CoC7.Weapons'}}

                                                            + {{#unless data.flags.locked}} +
                                                            +
                                                            {{localize 'CoC7.AddWeapon'}}
                                                            +
                                                            + {{/unless}} +
                                                            +
                                                          2. + {{#each itemsByType.weapon as |item id|}} +
                                                          3. +
                                                            +

                                                            {{item.name}}

                                                            +
                                                            + + + +
                                                            +
                                                          4. + {{/each}} +
                                                          +
                                                          + {{/if}} + {{#if showInventoryStatuses}} +
                                                          +
                                                            +
                                                          1. +
                                                            +

                                                            {{localize 'CoC7.Status'}}

                                                            +
                                                            +
                                                          2. + {{#each itemsByType.status as |item id|}} +
                                                          3. +
                                                            +

                                                            {{item.name}}

                                                            +
                                                            + {{#if ../isGM}} + + + {{/if}} +
                                                            +
                                                          4. + {{/each}} +
                                                          +
                                                          + {{/if}} +
                                                        2. +
                                                        \ No newline at end of file diff --git a/templates/actors/parts/actor-inventory.html b/templates/actors/parts/actor-inventory.html index 9c61862e..0ebdd7f4 100644 --- a/templates/actors/parts/actor-inventory.html +++ b/templates/actors/parts/actor-inventory.html @@ -1,114 +1,7 @@ -
                                                        -
                                                        - {{#unless data.flags.locked}} -
                                                        -
                                                        {{localize 'CoC7.AddItem'}}
                                                        -
                                                        - {{/unless}} -
                                                          -
                                                          -
                                                        1. -
                                                          -

                                                          {{localize 'CoC7.Items'}}

                                                          -
                                                          -
                                                        2. -
                                                            - {{#each itemsByType.item as |item id|}} -
                                                          1. -
                                                            -

                                                            {{item.name}}

                                                            -
                                                            - - -
                                                            -
                                                          2. - {{/each}} -
                                                          -
                                                          -
                                                          -
                                                        3. -
                                                          -

                                                          {{localize 'CoC7.Books'}}

                                                          -
                                                          -
                                                        4. -
                                                            - {{#each itemsByType.book as |item id|}} -
                                                          1. -
                                                            -

                                                            {{item.name}}

                                                            -
                                                            - - -
                                                            -
                                                          2. - {{/each}} -
                                                          -
                                                          -
                                                          -
                                                        5. -
                                                          -

                                                          {{localize 'CoC7.Spells'}}

                                                          -
                                                          -
                                                        6. -
                                                            - {{#each itemsByType.spell as |item id|}} -
                                                          1. -
                                                            -

                                                            {{item.name}}

                                                            -
                                                            - - -
                                                            -
                                                          2. - {{/each}} -
                                                          -
                                                          - {{#if pulpCharacter}} - {{#if itemsByType.talent}} -
                                                          -
                                                        7. -
                                                          -

                                                          {{localize 'CoC7.PulpTalents'}}

                                                          -
                                                          -
                                                        8. -
                                                            - {{#each itemsByType.talent as |item id|}} -
                                                          1. -
                                                            -

                                                            {{item.name}}

                                                            -
                                                            - - -
                                                            -
                                                          2. - {{/each}} -
                                                          -
                                                          - {{/if}} - {{/if}} -
                                                          -
                                                        9. -
                                                          -

                                                          {{localize 'CoC7.Status'}}

                                                          -
                                                          -
                                                        10. -
                                                            - {{#each itemsByType.status as |item id|}} -
                                                          1. -
                                                            -

                                                            {{item.name}}

                                                            -
                                                            - {{#if ../isGM}} - - - {{/if}} -
                                                            -
                                                          2. - {{/each}} -
                                                          -
                                                          -
                                                        -
                                                        +
                                                        +
                                                        + {{> "systems/CoC7/templates/actors/parts/actor-inventory-items.html"}} +
                                                        {{#unless data.flags.locked}}
                                                        diff --git a/templates/actors/parts/actor-keeper-mythos-enounters.hbs b/templates/actors/parts/actor-keeper-mythos-enounters.hbs new file mode 100644 index 00000000..d7c823b5 --- /dev/null +++ b/templates/actors/parts/actor-keeper-mythos-enounters.hbs @@ -0,0 +1,43 @@ +
                                                        +
                                                        + +
                                                        + +
                                                        +
                                                        +
                                                        + {{#each data.sanityLossEvents as |sanityLossEvent mythosOffset|}} + {{#unless sanityLossEvent.immunity}} +
                                                        +
                                                        {{sanityLossEvent.type}}
                                                        +
                                                        + +
                                                        +
                                                        + +
                                                        +
                                                        + {{/unless}} + {{/each}} +
                                                        +
                                                        +
                                                        +
                                                        + +
                                                        + +
                                                        +
                                                        +
                                                        + {{#each data.sanityLossEvents as |sanityLossEvent mythosOffset|}} + {{#if sanityLossEvent.immunity}} +
                                                        +
                                                        {{sanityLossEvent.type}}
                                                        +
                                                        + +
                                                        +
                                                        + {{/if}} + {{/each}} +
                                                        +
                                                        \ No newline at end of file diff --git a/templates/actors/parts/actor-mythos-enounters.hbs b/templates/actors/parts/actor-mythos-enounters.hbs new file mode 100644 index 00000000..da542a0b --- /dev/null +++ b/templates/actors/parts/actor-mythos-enounters.hbs @@ -0,0 +1,25 @@ +{{#if data.sanityLossEvents}} +
                                                        +
                                                        + +
                                                        +
                                                        + {{#each data.sanityLossEvents as |sanityLossEvent mythosOffset|}} +
                                                        +
                                                        {{sanityLossEvent.type}}
                                                        +
                                                        + {{#if sanityLossEvent.immunity}} + + {{else}} + {{sanityLossEvent.totalLoss}} + {{/if}} +
                                                        +
                                                        + {{else}} +
                                                        + - +
                                                        + {{/each}} +
                                                        +
                                                        +{{/if}} \ No newline at end of file diff --git a/templates/actors/parts/actor-skills-v2.html b/templates/actors/parts/actor-skills-v2.html index 49c6205b..46461de0 100644 --- a/templates/actors/parts/actor-skills-v2.html +++ b/templates/actors/parts/actor-skills-v2.html @@ -1,42 +1,84 @@ -{{#unless data.flags.locked}} -
                                                        - +
                                                        + {{#unless data.flags.locked}} + {{!-- --}} + + {{/unless}} + +
                                                        -{{/unless}} +{{#if skillListEmpty}} +

                                                        {{localize 'CoC7.EmptyCharacterSkillList'}}

                                                        +{{/if}}
                                                          - {{#each skillList as |skill|}} - {{#if skill.isSpecialization}} -
                                                        1. {{skill.name}}
                                                        2. - {{else}} -
                                                        3. -
                                                          - {{#if ../data.flags.locked}} -
                                                          {{skill.name}}
                                                          -
                                                          {{skill.data.value}}
                                                          -
                                                          - {{#unless skill.data.properties.noxpgain}} - - {{#if skill.data.flags.developement}} - - {{else}} - - {{/if}} - {{/unless}} - -
                                                          - {{else}} -
                                                          - -
                                                          -
                                                          - -
                                                          -
                                                          - - -
                                                          - {{/if}} -
                                                        4. - {{/if}} - {{/each}} -
                                                        + {{#if skillListModeValue}} + {{#each skillsByValue as |skill|}} +
                                                      4. +
                                                        + {{#if ../data.flags.locked}} +
                                                        {{skill.name}}
                                                        +
                                                        {{skill.data.value}}
                                                        +
                                                        + {{#unless skill.data.properties.noxpgain}} + {{#if skill.data.flags.developement}} + + {{else}} + + {{/if}} + {{/unless}} + +
                                                        + {{else}} +
                                                        + +
                                                        +
                                                        + +
                                                        +
                                                        + + +
                                                        + {{/if}} +
                                                      5. + {{/each}} + {{else}} + {{#each skillList as |skill|}} + {{#if skill.isSpecialization}} +
                                                      6. {{skill.name}}
                                                      7. + {{else}} +
                                                      8. +
                                                        + {{#if ../data.flags.locked}} +
                                                        {{skill.data.skillName}}
                                                        +
                                                        {{skill.data.value}}
                                                        +
                                                        + {{#unless skill.data.properties.noxpgain}} + + {{#if skill.data.flags.developement}} + + {{else}} + + {{/if}} + {{/unless}} + +
                                                        + {{else}} +
                                                        + +
                                                        +
                                                        + +
                                                        +
                                                        + + +
                                                        + {{/if}} +
                                                      9. + {{/if}} + {{/each}} + {{/if}} +
                                                      \ No newline at end of file diff --git a/templates/actors/parts/actor-skills.html b/templates/actors/parts/actor-skills.html deleted file mode 100644 index d00024f0..00000000 --- a/templates/actors/parts/actor-skills.html +++ /dev/null @@ -1,39 +0,0 @@ -
                                                        - {{#each skills as |skill id|}} -
                                                      1. -
                                                        -
                                                        - {{#if ../data.flags.locked}} - {{#if skill.data.flags.developement}} -

                                                        {{#if skill.data.properties.special}}{{skill.data.specialization}} ({{skill.name}}){{else}}{{skill.name}}{{/if}}:

                                                        - {{else}} -

                                                        {{#if skill.data.properties.special}}{{skill.data.specialization}} ({{skill.name}}){{else}}{{skill.name}}{{/if}}:

                                                        - {{/if}} - ({{skill.data.value}}%) - {{else}} - {{#if skill.data.properties.special}}{{skill.data.specialization}} :{{/if}} - - - {{/if}} - -
                                                        - {{#if ../data.flags.locked}} - {{#if skill.data.properties.noxpgain}} - - {{else}} - {{#if skill.data.flags.developement}} - - {{else}} - - {{/if}} - {{/if}} - - {{else}} - - - {{/if}} -
                                                        -
                                                        -
                                                      2. - {{/each}} -
                                                      diff --git a/templates/actors/parts/actor-weapons.html b/templates/actors/parts/actor-weapons.html deleted file mode 100644 index 70228d33..00000000 --- a/templates/actors/parts/actor-weapons.html +++ /dev/null @@ -1,305 +0,0 @@ - -{{#unless data.flags.locked}} -
                                                      -
                                                      {{localize 'CoC7.AddWeapon'}}
                                                      -
                                                      -{{/unless}} -
                                                      {{localize 'CoC7.MeleeWeapons'}}
                                                      -{{#if data.flags.locked}} -
                                                      -
                                                      {{localize 'CoC7.WeaponName'}}
                                                      -
                                                      -
                                                      {{localize 'CoC7.WeaponSkill'}}
                                                      -
                                                      {{localize 'CoC7.WeaponSkillAlt'}}
                                                      -
                                                      -
                                                      {{localize 'CoC7.WeaponDamage'}}
                                                      -
                                                      -{{/if}} -
                                                        - {{#each meleeWpn as |weapon id|}} - {{#if ../data.flags.locked}} -
                                                      1. -
                                                        -
                                                        {{weapon.name}}
                                                        -
                                                        - {{#if weapon.skillSet}} -
                                                        {{weapon.data.skill.main.name}} ({{weapon.data.skill.main.value}}%)
                                                        - {{#if weapon.usesAlternateSkill}} -
                                                        {{weapon.data.skill.alternativ.name}} ({{weapon.data.skill.alternativ.value}}%)
                                                        - {{/if}} - {{else}} -
                                                        {{ localize 'CoC7.NoSkill' }}
                                                        - {{#if weapon.usesAlternateSkill}} -
                                                        {{ localize 'CoC7.NoSkill' }}
                                                        - {{/if}} - {{/if}} -
                                                        -
                                                        - {{#if weapon.data.properties.rngd}} - {{#if weapon.data.properties.shotgun}} - {{#each weapon.data.range as |range key|}} - - {{/each}} - {{else}} - - {{/if}} - {{else}} - - {{/if}} -
                                                        - {{#if weapon.data.properties.addb}}{{localize 'CoC7.WeaponAddb'}}{{/if}} - {{#if weapon.data.properties.ahdb}}{{localize 'CoC7.WeaponAhdb'}}{{/if}} -
                                                        -
                                                        -
                                                        -
                                                      2. - {{else}} -
                                                      3. -
                                                        -
                                                        - -
                                                        -
                                                        - -
                                                        - -
                                                        -
                                                        - {{#if weapon.usesAlternateSkill}} - - {{/if}} -
                                                        - -
                                                        -
                                                        - {{#if weapon.data.properties.shotgun}} - {{#each weapon.data.range as |range key|}} -
                                                        - -
                                                        - {{/each}} - {{else}} -
                                                        - -
                                                        - {{/if}} -
                                                        -
                                                        - - -
                                                        -
                                                        -
                                                        - {{#each weapon.data._properties as | property key|}} - {{localize property.name}} - {{/each}} -
                                                        -
                                                      4. - {{/if}} - {{/each}} -
                                                      - - -
                                                      {{localize 'CoC7.RangeWeapons'}}
                                                      -{{#if data.flags.locked}} -
                                                      -
                                                      {{localize 'CoC7.WeaponName'}}
                                                      -
                                                      -
                                                      {{localize 'CoC7.WeaponSkill'}}
                                                      -
                                                      {{localize 'CoC7.WeaponSkillAlt'}}
                                                      -
                                                      -
                                                      {{localize 'CoC7.WeaponDamage'}}
                                                      -
                                                      -{{/if}} -
                                                        - {{#each rangeWpn as |weapon id|}} - {{#if ../data.flags.locked}} -
                                                      1. -
                                                        -
                                                        {{weapon.name}}
                                                        -
                                                        - {{#if weapon.skillSet}} -
                                                        {{weapon.data.skill.main.name}} ({{weapon.data.skill.main.value}}%)
                                                        - {{#if weapon.usesAlternateSkill}} -
                                                        {{weapon.data.skill.alternativ.name}} ({{weapon.data.skill.alternativ.value}}%)
                                                        - {{/if}} - {{else}} -
                                                        {{ localize 'CoC7.NoSkill' }}
                                                        - {{#if weapon.usesAlternateSkill}} -
                                                        {{ localize 'CoC7.NoSkill' }}
                                                        - {{/if}} - {{/if}} -
                                                        -
                                                        - {{#if weapon.data.properties.rngd}} - {{#if weapon.data.properties.shotgun}} - {{#each weapon.data.range as |range key|}} - - {{/each}} - {{else}} - - {{/if}} - {{else}} - - {{/if}} -
                                                        - {{weapon.data.ammo}} -
                                                        - - -
                                                        -
                                                        -
                                                        -
                                                        -
                                                      2. - {{else}} -
                                                      3. -
                                                        -
                                                        - -
                                                        -
                                                        - -
                                                        - -
                                                        -
                                                        - {{#if weapon.usesAlternateSkill}} - - {{/if}} -
                                                        - -
                                                        -
                                                        - {{#if weapon.data.properties.shotgun}} - {{#each weapon.data.range as |range key|}} -
                                                        - -
                                                        - {{/each}} - {{else}} -
                                                        - -
                                                        - {{/if}} -
                                                        -
                                                        - - -
                                                        -
                                                        -
                                                        - {{#each weapon.data._properties as | property key|}} - {{localize property.name}} - {{/each}} -
                                                        -
                                                      4. - {{/if}} - {{/each}} -
                                                      - -{{#unless data.flags.locked}} -
                                                      -
                                                      {{localize 'CoC7.AddSkill'}}
                                                      -
                                                      -{{/unless}} - -
                                                      -

                                                      {{localize 'CoC7.MeleeSkills'}}

                                                      -
                                                      - {{#each meleeSkills as |skill|}} -
                                                      - {{#if ../data.flags.locked}} -
                                                      {{skill.name}} ({{skill.data.value}}%)
                                                      - {{else}} -
                                                      - - -
                                                      - - -
                                                      -
                                                      - {{/if}} -
                                                      - {{/each}} -
                                                      -
                                                      - -
                                                      -

                                                      {{localize 'CoC7.RangeSkills'}}

                                                      -
                                                      - {{#each rangeSkills as |skill|}} -
                                                      - {{#if ../data.flags.locked}} -
                                                      {{skill.name}} ({{skill.data.value}}%)
                                                      - {{else}} -
                                                      - - -
                                                      - - -
                                                      -
                                                      - {{/if}} -
                                                      - {{/each}} -
                                                      -
                                                      \ No newline at end of file diff --git a/templates/actors/parts/character-development-v2.html b/templates/actors/parts/character-development-v2.html index 4d7092fe..c1d6b735 100644 --- a/templates/actors/parts/character-development-v2.html +++ b/templates/actors/parts/character-development-v2.html @@ -1,74 +1,74 @@
                                                        - {{#each skills as |skill id|}} -
                                                      1. -
                                                        - {{#unless skill.data.properties.noadjustments}} -
                                                        - {{#if skill.data.flags.occupation}} - - {{else}} - - {{/if}} -
                                                        - {{#if ../pulpCharacter}} -
                                                        - {{#if skill.data.flags.archetype}} - - {{else}} - - {{/if}} -
                                                        - {{/if}} - {{/unless}} -
                                                        - - {{#if skill.data.properties.special}}{{skill.data.specialization}} :{{/if}}{{skill.name}} -
                                                        - {{skill.data.base}} -
                                                        -
                                                        - {{#if ../allowCharCreation}} - {{#unless skill.data.properties.noadjustments}} - - {{/unless}} - {{else}} - {{skill.data.adjustments.personal}} - {{/if}} -
                                                        -
                                                        - {{#if ../allowCharCreation}} - {{#if skill.data.flags.occupation}} - - {{else}} - {{skill.data.adjustments.occupation}} - {{/if}} - {{else}} - {{skill.data.adjustments.occupation}} - {{/if}} -
                                                        - {{#if ../pulpCharacter}} -
                                                        - {{#if ../allowCharCreation}} - {{#if skill.data.flags.archetype}} - - {{else}} - {{skill.data.adjustments.archetype}} - {{/if}} - {{else}} - {{skill.data.adjustments.archetype}} - {{/if}} -
                                                        - {{/if}} -
                                                        - {{#if ../allowCharCreation}} - - {{else}} - {{skill.data.adjustments.experience}} - {{/if}} -
                                                        -
                                                        - {{skill.data.value}} -
                                                        -
                                                      2. - {{/each}} -
                                                      + {{#each skills as |skill id|}} +
                                                    3. +
                                                      + {{#unless skill.data.properties.noadjustments}} +
                                                      + {{#if skill.data.flags.occupation}} + + {{else}} + + {{/if}} +
                                                      + {{#if ../pulpRuleArchetype}} +
                                                      + {{#if skill.data.flags.archetype}} + + {{else}} + + {{/if}} +
                                                      + {{/if}} + {{/unless}} +
                                                      + + {{#if skill.data.properties.special}}{{skill.data.specialization}} :{{/if}}{{skill.name}} +
                                                      + {{skill.data.base}} +
                                                      +
                                                      + {{#if ../allowCharCreation}} + {{#unless skill.data.properties.noadjustments}} + + {{/unless}} + {{else}} + {{skill.data.adjustments.personal}} + {{/if}} +
                                                      +
                                                      + {{#if ../allowCharCreation}} + {{#if skill.data.flags.occupation}} + + {{else}} + {{skill.data.adjustments.occupation}} + {{/if}} + {{else}} + {{skill.data.adjustments.occupation}} + {{/if}} +
                                                      + {{#if ../pulpRuleArchetype}} +
                                                      + {{#if ../allowCharCreation}} + {{#if skill.data.flags.archetype}} + + {{else}} + {{skill.data.adjustments.archetype}} + {{/if}} + {{else}} + {{skill.data.adjustments.archetype}} + {{/if}} +
                                                      + {{/if}} +
                                                      + {{#if ../allowCharCreation}} + + {{else}} + {{skill.data.adjustments.experience}} + {{/if}} +
                                                      +
                                                      + {{skill.data.value}} +
                                                      +
                                                    4. + {{/each}} +
                                                    \ No newline at end of file diff --git a/templates/actors/parts/character-development.html b/templates/actors/parts/character-development.html deleted file mode 100644 index 83de18cd..00000000 --- a/templates/actors/parts/character-development.html +++ /dev/null @@ -1,117 +0,0 @@ -
                                                    - {{#if allowCharCreation}} -
                                                    - - {{totalPersonal}}/ - -
                                                    -
                                                    - - {{totalOccupation}}/ - -
                                                    - {{#if pulpCharacter}} -
                                                    - - {{totalArchetype}}/ - -
                                                    - {{/if}} - {{/if}} -
                                                    -
                                                    - {{#if allowCharCreation}} - {{#if data.infos.occupationSet}} -
                                                    - -
                                                    - {{else}} -
                                                    - {{/if}} - {{#if data.infos.archetypeSet}} -
                                                    - -
                                                    - {{else}} -
                                                    - {{/if}} - {{#unless allowDevelopment}} -
                                                    - - {{totalExperience}} -
                                                    - {{/unless}} - {{/if}} - {{#if allowDevelopment}} -
                                                    - {{#if hasSkillFlaggedForExp}} -
                                                    {{localize 'CoC7.DevelopemmentPhase'}}
                                                    - {{else}} - - {{totalExperience}} - {{/if}} -
                                                    - {{/if}} - -
                                                    - -
                                                      - {{#each skills as |skill id|}} -
                                                    1. -
                                                      - {{#unless skill.data.properties.noadjustments}} -
                                                      - {{#if skill.data.flags.occupation}} - - {{else}} - - {{/if}} -
                                                      - {{#if ../pulpCharacter}} -
                                                      - {{#if skill.data.flags.archetype}} - - {{else}} - - {{/if}} -
                                                      - {{/if}} - {{/unless}} -
                                                      - - {{#if skill.data.properties.special}}{{skill.data.specialization}} :{{/if}}{{skill.name}} -
                                                      - -
                                                      -
                                                      - {{#if skill.data.properties.noadjustments}} - - {{else}} - - {{/if}} -
                                                      -
                                                      - {{#if skill.data.flags.occupation}} - - {{else}} - - {{/if}} -
                                                      - {{#if ../pulpCharacter}} -
                                                      - {{#if skill.data.flags.archetype}} - - {{else}} - - {{/if}} -
                                                      - {{/if}} -
                                                      - -
                                                      -
                                                      - -
                                                      -
                                                    2. - {{/each}} -
                                                    diff --git a/templates/actors/parts/combat.html b/templates/actors/parts/combat.html index eb2c0d46..916e697c 100644 --- a/templates/actors/parts/combat.html +++ b/templates/actors/parts/combat.html @@ -4,7 +4,7 @@
                                                    {{localize 'CoC7.MeleeWeapons'}} {{#unless data.flags.locked}} -
                                                    +
                                                    {{/unless}} @@ -49,7 +49,7 @@
                                                    {{localize 'CoC7.RangeWeapons'}} {{#unless data.flags.locked}} -
                                                    +
                                                    {{/unless}} @@ -112,11 +112,10 @@
                                                  7. {{#if ../data.flags.locked}} -
                                                    {{skill.name}}
                                                    +
                                                    {{skill.name}}
                                                    {{skill.data.value}}
                                                    {{#unless skill.data.properties.noxpgain}} - {{#if skill.data.flags.developement}} {{else}} @@ -156,11 +155,10 @@
                                                  8. {{#if ../data.flags.locked}} -
                                                    {{skill.name}}
                                                    +
                                                    {{skill.name}}
                                                    {{skill.data.value}}
                                                    {{#unless skill.data.properties.noxpgain}} - {{#if skill.data.flags.developement}} {{else}} diff --git a/templates/actors/parts/development-controls.html b/templates/actors/parts/development-controls.html index f863298c..2780db39 100644 --- a/templates/actors/parts/development-controls.html +++ b/templates/actors/parts/development-controls.html @@ -1,91 +1,91 @@
                                                    -
                                                    - {{#if allowCharCreation}} -
                                                    - -
                                                    -
                                                    {{totalPersonal}}
                                                    -
                                                    /
                                                    -
                                                    - {{#if allowCharCreation}} - - {{else}} - {{data.development.personal}} - {{/if}} -
                                                    -
                                                    +
                                                    + {{#if allowCharCreation}} +
                                                    + +
                                                    +
                                                    {{totalPersonal}}
                                                    +
                                                    /
                                                    +
                                                    + {{#if allowCharCreation}} + + {{else}} + {{data.development.personal}} + {{/if}} +
                                                    +
                                                    +
                                                    +
                                                    + +
                                                    +
                                                    {{totalOccupation}}
                                                    +
                                                    /
                                                    +
                                                    + {{#if allowCharCreation}} + + {{else}} + {{data.development.occupation}} + {{/if}} +
                                                    -
                                                    - -
                                                    -
                                                    {{totalOccupation}}
                                                    -
                                                    /
                                                    -
                                                    - {{#if allowCharCreation}} - - {{else}} - {{data.development.occupation}} - {{/if}} -
                                                    +
                                                    + {{#if pulpRuleArchetype}} +
                                                    + +
                                                    +
                                                    {{totalArchetype}}
                                                    +
                                                    /
                                                    +
                                                    + {{#if allowCharCreation}} + + {{else}} + {{data.development.archetype}} + {{/if}}
                                                    +
                                                    - {{#if pulpCharacter}} -
                                                    - -
                                                    -
                                                    {{totalArchetype}}
                                                    -
                                                    /
                                                    -
                                                    - {{#if allowCharCreation}} - - {{else}} - {{data.development.archetype}} - {{/if}} -
                                                    -
                                                    -
                                                    - {{/if}} - {{/if}} -
                                                    + {{/if}} + {{/if}} +
                                                    -
                                                    - {{#if allowCharCreation}} - {{#if data.infos.occupationSet}} -
                                                    - -
                                                    - {{/if}} - {{#if data.infos.archetypeSet}} -
                                                    - -
                                                    - {{/if}} +
                                                    + {{#if allowCharCreation}} + {{#if data.infos.occupationSet}} +
                                                    + +
                                                    + {{/if}} + {{#if data.infos.archetypeSet}} +
                                                    + +
                                                    + {{/if}} - {{#unless allowDevelopment}} -
                                                    - - {{totalExperience}} -
                                                    - {{/unless}} - {{/if}} + {{#unless allowDevelopment}} +
                                                    + + {{totalExperience}} +
                                                    + {{/unless}} + {{/if}} -
                                                    +
                                                    -
                                                    - {{#if allowDevelopment}} -
                                                    - {{#if hasSkillFlaggedForExp}} -
                                                    {{localize 'CoC7.DevelopemmentPhase'}}
                                                    - {{/if}} - {{#if developmentRollForLuck}} -
                                                    {{localize 'CoC7.RecoverLuckPoints'}}
                                                    - {{/if}} -

                                                    - - {{totalExperience}} -
                                                    +
                                                    + {{#if allowDevelopment}} +
                                                    + {{#if hasDevelopmentPhase}} +
                                                    {{localize 'CoC7.DevelopemmentPhase'}}
                                                    + {{/if}} + {{#if developmentRollForLuck}} +
                                                    {{localize 'CoC7.RecoverLuckPoints'}}
                                                    {{/if}} -
                                                    +

                                                    + + {{totalExperience}} +
                                                    + {{/if}} +
                                                    - -
                                                    + +
                                                    \ No newline at end of file diff --git a/templates/actors/parts/npc-skills.html b/templates/actors/parts/npc-skills.html index 795dae98..4787b02d 100644 --- a/templates/actors/parts/npc-skills.html +++ b/templates/actors/parts/npc-skills.html @@ -1,16 +1,21 @@ -{{#each skills as |skill id|}} -
                                                    - {{#if ../data.flags.locked}} -

                                                    {{skill.name}}

                                                    - - % - {{else}} - - -
                                                    - - -
                                                    - {{/if}} -
                                                    -{{/each}} +
                                                    + {{#each skills as |skill id|}} +
                                                    + {{#if skill.data.properties.special}} +
                                                    {{skill.data.specialization}}
                                                    + {{/if}} + {{#if ../data.flags.locked}} +

                                                    {{skill.data.skillName}}

                                                    + + % + {{else}} + + +
                                                    + + +
                                                    + {{/if}} +
                                                    + {{/each}} +
                                                    \ No newline at end of file diff --git a/templates/actors/parts/vitals.html b/templates/actors/parts/vitals.html index 973864f7..d1618774 100644 --- a/templates/actors/parts/vitals.html +++ b/templates/actors/parts/vitals.html @@ -21,17 +21,17 @@
                                                    - - - - + + + +
                                                    - +
                                                    - {{#if data.status.dead.value}} - + {{#if data.conditions.dead.value}} + {{else}} - + {{/if}}
                                                    @@ -54,15 +54,15 @@
                                                  9. - +
                                                    - - + +
                                                    diff --git a/templates/actors/storage-sheet.html b/templates/actors/storage-sheet.html new file mode 100644 index 00000000..67795b94 --- /dev/null +++ b/templates/actors/storage-sheet.html @@ -0,0 +1,43 @@ +
                                                    +
                                                    +
                                                    +

                                                    + +

                                                    +
                                                    + +
                                                    + +
                                                    +
                                                    + {{> "systems/CoC7/templates/actors/parts/actor-inventory-items.html"}} +
                                                    +
                                                    + {{editor content=data.description.value target="data.description.value" button=true owner=owner editable=editable}} +
                                                    + {{#if isKeeper}} +
                                                    + {{editor content=data.description.keeper target="data.description.keeper" button=true owner=owner editable=editable}} +
                                                    + {{/if}} +
                                                    +
                                                    diff --git a/templates/actors/vehicle.html b/templates/actors/vehicle.html index 5571c7c5..406bca93 100644 --- a/templates/actors/vehicle.html +++ b/templates/actors/vehicle.html @@ -1,4 +1,17 @@
                                                    +
                                                    + {{#if canDragToken}} +
                                                    + {{/if}} + {{#if linkedActor}} +
                                                    + {{else}} +
                                                    + {{/if}} + {{#if isToken}} +
                                                    + {{/if}} +
                                                    @@ -72,7 +85,7 @@
                                                    {{ localize "CoC7.Description" }}
                                                    {{#if isGM}}
                                                    {{ localize "CoC7.Details" }}
                                                    -
                                                    {{ localize "CoC7.GmNotes" }}
                                                    +
                                                    {{/if}} diff --git a/templates/apps/actor-importer.html b/templates/apps/actor-importer.html index 75c86d30..b0cfc9a9 100644 --- a/templates/apps/actor-importer.html +++ b/templates/apps/actor-importer.html @@ -1,32 +1,86 @@ - -

                                                    {{localize 'CoC7.ActorImporter'}}

                                                    -

                                                    {{localize 'CoC7.ActorImporterSummary'}}

                                                    + +

                                                    {{localize 'CoC7.ActorImporter'}}

                                                    + {{#if (eq importType "dholehouse")}} +
                                                    {{localize 'CoC7.DholeHouseActorImporterSummary'}}
                                                    + {{#unless canUpload}} +
                                                    {{localize 'CoC7.UnableToUploadDholeImage'}}
                                                    + {{/unless}} +
                                                    + {{else}} +

                                                    {{localize 'CoC7.ActorImporterSummary'}}

                                                    + {{/if}} +
                                                    + + +
                                                    + {{#if (or (eq importType "npc") (eq importType "creature"))}}
                                                    - - + +
                                                    - - + +
                                                    -
                                                    - - + {{/if}} +
                                                    + + +
                                                    + {{#if (eq importType "dholehouse")}} +
                                                    +
                                                    -
                                                    {{localize 'CoC7.PasteTheDataBelow'}}
                                                    +
                                                    +

                                                    {{localize 'CoC7.DholeHouseImportingName'}} + +

                                                    + {{!-- By defaults the image is a transparent pixel to be replaced when the JSON is loaded --}} + +
                                                    + {{else}} +
                                                    {{localize 'CoC7.PasteTheDataBelow'}}
                                                    - +
                                                    - \ No newline at end of file + {{/if}} +
                                                    + + {{#if (or (eq importType "npc") (eq importType "creature"))}} + + {{/if}} + +
                                                    + diff --git a/templates/apps/bonus.html b/templates/apps/bonus.html index 2e541ffb..109285a3 100644 --- a/templates/apps/bonus.html +++ b/templates/apps/bonus.html @@ -1,61 +1,72 @@ -
                                                    -
                                                    - {{#if options.askValue}} -
                                                    - - -
                                                    - {{/if}} +
                                                    -
                                                    - - -
                                                    + {{#if cardTypes}} +
                                                    + + +
                                                    + {{/if}} - {{#if allowFlatDiceModifier}} -
                                                    - - -
                                                    - {{/if}} + {{#if options.askValue}} +
                                                    + + +
                                                    + {{/if}} - {{#if allowFlatThresholdModifier}} -
                                                    - - -
                                                    - {{/if}} + {{#unless hideDifficulty}} +
                                                    + + +
                                                    + {{/unless}} -
                                                    -
                                                    -
                                                    -
                                                    - -2 - - -1 - - 0 - - +1 - - +2 -
                                                    - -
                                                    + {{#if allowFlatDiceModifier}} +
                                                    + + +
                                                    + {{/if}} + + {{#if allowFlatThresholdModifier}} +
                                                    + + +
                                                    + {{/if}} + +
                                                    +
                                                    +
                                                    +
                                                    + -2 + + -1 + + 0 + + +1 + + +2
                                                    + +
                                                    - +
                                                    + \ No newline at end of file diff --git a/templates/apps/chase-participant-importer.html b/templates/apps/chase-participant-importer.html new file mode 100644 index 00000000..340f77a8 --- /dev/null +++ b/templates/apps/chase-participant-importer.html @@ -0,0 +1,97 @@ +
                                                    +
                                                    + +

                                                    {{localize 'CoC7.AddActorToChase'}}

                                                    +

                                                    {{localize 'CoC7.ParticipantDropHint'}}

                                                    + + + {{#each skillsAndCharacteristicsList as |o|}} + + {{/each}} + + +
                                                    + + {{#if participant.isChaser}} + + {{else}} + + {{/if}} + {{#if actor}} +
                                                    {{participant.name}}
                                                    + {{else}} +
                                                    + {{/if}} + +
                                                    + +
                                                    + + + +
                                                    +
                                                    + + + +
                                                    + +
                                                    +
                                                    + +
                                                    + +
                                                    +
                                                    +
                                                    + + {{#if participant.speedCheck.rolled}} +
                                                    {{{participant.speedCheck.inlineRoll}}}
                                                    + {{/if}} + {{#if participant.speedCheck.canBeRolled}} + + {{/if}} +
                                                    +
                                                    {{ participant.adjustedMov }}
                                                    +
                                                    + + {{#if chase.started}} +
                                                    + +
                                                    +
                                                    +
                                                    + + {{#if data.recalculationNeeded}}
                                                    {{ localize 'CoC7.NeedRecalculate' }}
                                                    {{/if}} + {{#if data.participantExcluded}}
                                                    {{ data.excludedBecause }}
                                                    {{/if}} +
                                                    + {{#if data.overrideMovementAction}} + + {{else}} +
                                                    {{ participant.movementAction }}
                                                    + {{/if}} +
                                                    + + {{/if}} +
                                                    +
                                                    + {{#if object.update}} + + {{else}} + + {{/if}} + +
                                                    +
                                                    \ No newline at end of file diff --git a/templates/apps/link-creation.html b/templates/apps/link-creation.html index 766e3f32..4ccd288e 100644 --- a/templates/apps/link-creation.html +++ b/templates/apps/link-creation.html @@ -1,170 +1,334 @@ + + {{#if data.hasIcon}} +
                                                    + + +
                                                    + {{/if}} + {{/unless}} +
                                                    + + {{#if link.link}} +
                                                    {{link.link}}
                                                    + {{/if}} + + + + {{#if link.hasPlayerOwner}} + + {{/if}} + + \ No newline at end of file diff --git a/templates/apps/sandata.html b/templates/apps/sandata.html index b0da6bac..3eb39129 100644 --- a/templates/apps/sandata.html +++ b/templates/apps/sandata.html @@ -11,11 +11,9 @@
                                                    - {{#if promptLabel}} -
                                                    - - +
                                                    + +
                                                    - {{/if}}
                                                    diff --git a/templates/apps/sanity-loss-type.hbs b/templates/apps/sanity-loss-type.hbs new file mode 100644 index 00000000..5b66933e --- /dev/null +++ b/templates/apps/sanity-loss-type.hbs @@ -0,0 +1,34 @@ +
                                                    +
                                                    + {{ localize 'CoC7.SanityLossTypeDialogBody' }} +
                                                    +
                                                    + + +
                                                    +
                                                    + + +
                                                    + {{#unless isImmunity}} +
                                                    + + +
                                                    + {{/unless}} +
                                                    + + +
                                                    +
                                                    \ No newline at end of file diff --git a/templates/apps/skill-details.html b/templates/apps/skill-details.html index a6f7f753..a8002bd7 100644 --- a/templates/apps/skill-details.html +++ b/templates/apps/skill-details.html @@ -1,36 +1,36 @@
                                                    -
                                                    -
                                                    -

                                                    - -

                                                    +
                                                    +
                                                    +

                                                    + +

                                                    -
                                                      -
                                                    • - -
                                                    • -
                                                    • - -
                                                    • -
                                                    +
                                                      +
                                                    • + +
                                                    • +
                                                    • + +
                                                    • +
                                                    -
                                                    - +
                                                    + -
                                                    -
                                                    -
                                                    -
                                                    -
                                                      - {{#each content.skillProperties}} -
                                                    1. {{this}}
                                                    2. - {{/each}} -
                                                    -
                                                    - -
                                                    - {{{content.data.data.description.enrichedValue}}} -
                                                    -
                                                    -
                                                    + +
                                                    +
                                                    +
                                                    +
                                                      + {{#each content.skillProperties}} +
                                                    1. {{this}}
                                                    2. + {{/each}} +
                                                    +
                                                    + +
                                                    + {{{content.data.data.description.enrichedValue}}} +
                                                    +
                                                    +
                                                    \ No newline at end of file diff --git a/templates/apps/skill-select.html b/templates/apps/skill-select.html index 4c8d03c1..8f992833 100644 --- a/templates/apps/skill-select.html +++ b/templates/apps/skill-select.html @@ -11,10 +11,10 @@ {{#each skills as |skill i|}}
                                                  10. -

                                                    {{skill.displayName}} ({{skill.data.base}}%)

                                                    +

                                                    {{skill.name}} ({{skill.data.base}}%)

                                                    - +
                                                  11. {{/each}} diff --git a/templates/apps/welcome-message.html b/templates/apps/welcome-message.html new file mode 100644 index 00000000..433ba9a4 --- /dev/null +++ b/templates/apps/welcome-message.html @@ -0,0 +1,9 @@ +
                                                    +

                                                    Welcome!

                                                    +

                                                    Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.

                                                    + + +
                                                    diff --git a/templates/chat/cards/chase-obstacle.html b/templates/chat/cards/chase-obstacle.html new file mode 100644 index 00000000..f164b2b9 --- /dev/null +++ b/templates/chat/cards/chase-obstacle.html @@ -0,0 +1,304 @@ +
                                                    +
                                                    +
                                                    +
                                                    + {{#if displayActorOnCard}} + + {{/if}} +
                                                    + {{#if data.states.obstacleDefined}} +
                                                    {{#if data.obstacle.name}}{{data.obstacle.name}}{{else}}{{ localize 'CoC7.Obstacle'}}{{/if}}
                                                    +
                                                    + {{#if data.obstacle.barrier}} + + {{else}} + + {{/if}} +
                                                    + {{/if}} +
                                                    + + + + {{#each checkOptions as |o|}} + + {{/each}} + + +
                                                    +
                                                    + {{#if data.states.obstacleDefined}} +
                                                    {{strings.obstacleDefined}}
                                                    + {{#if data.states.playerActionDefined}} +
                                                    {{ strings.playerIntentions }}
                                                    + {{#if data.totalCautiousApproach}} +
                                                    {{{strings.cautiousApproachType}}}
                                                    + {{/if}} + {{#if data.states.checkRolled}} +
                                                    {{data.objects.check.name}} : {{{ htmlCheck }}}
                                                    + {{#if data.objects.check.passed}} +
                                                    {{ strings.obstaclePassed }}
                                                    + {{else}} +
                                                    {{ strings.checkFailed }}
                                                    + {{#if data.states.closed}} + {{#if playerDamageTaken}} +
                                                    {{ strings.damageTaken}}
                                                    + {{/if}} + {{#if actionLost}} +
                                                    {{ strings.actionLost }} : {{{inlineActionLostRoll}}}
                                                    + {{/if}} + {{/if}} + {{/if}} + {{else}} + {{#if data.states.tryToBreak}} + {{#if data.states.obstacleDamageRolled}} +
                                                    {{{ strings.obstacleDamage }}}
                                                    + {{else}} +
                                                    + +
                                                    + {{/if}} + {{else}} +
                                                    + +
                                                    + {{/if}} + {{/if}} + {{else}} +
                                                    {{ localize 'CoC7.AskIntentions' }}
                                                    + {{/if}} + {{else}} +
                                                    {{ localize 'CoC7.SomethingInTheWay' }}
                                                    + {{/if}} + + {{#if data.states.closed}} +
                                                    {{{ strings.finalOutcome }}}
                                                    + {{/if}} +
                                                    +
                                                    + +
                                                    + {{#if data.states.cardResolved}} + {{#unless data.states.closed}} +
                                                    + {{#if obstalceDefinitionChanged}} +
                                                    +
                                                    {{ localize 'CoC7.ReflectObstacleChanges' }}
                                                    +
                                                    + {{/if}} + {{#if data.states.tryToBreak}} +
                                                    +
                                                    + {{localize 'CoC7.ObstacleDamage'}} : {{{inlineDamageRoll}}} ({{data.obstacle.HitPoints}}) +
                                                    +
                                                    + + +
                                                    +
                                                    + {{/if}} + {{#if playerDamageTaken}} +
                                                    +
                                                    + {{localize 'CoC7.DamageInflicted'}} : {{{inlineDamageTakenRoll}}} {{#unless data.flags.ignoreArmor}}- {{data.armor}}{{/unless}} +
                                                    +
                                                    + +
                                                    +
                                                    + {{/if}} +
                                                    +
                                                    + {{localize 'CoC7.ActionCost'}} {{#if actionLost}}: {{{inlineActionLostRoll}}}{{/if}} +
                                                    +
                                                    + +
                                                    +
                                                    +
                                                    +
                                                    {{ localize 'CoC7.PlayerMovesToLocation' }}
                                                    +
                                                    +
                                                    + +
                                                    +
                                                    + {{/unless}} + {{else}} + {{#if data.states.obstacleDefined}} + {{#if data.states.breakOrNegotiateDefined}} + {{#if data.states.tryToNegotiate}} + {{#if data.states.playerActionDefined}} + {{#if data.states.checkRolled}} + {{#unless data.objects.check.passed}} + {{#unless data.states.failedConsequencesRolled}} +
                                                    + {{#if data.obstacle.hasDamage }} +
                                                    +
                                                    + + {{#if data.flags.ignoreArmor}} + + {{else}} + + {{/if}} + + {{#unless data.flags.ignoreArmor}} + + + {{/unless}} +
                                                    +
                                                    + {{/if}} +
                                                    +
                                                    + {{#if data.obstacle.hazard}} + + + + {{#if data.obstacle.hasActionCost }} + + {{/if}} + {{/if}} +
                                                    +
                                                    + + + + {{#if data.obstacle.hasDamage }} + + {{/if}} +
                                                    +
                                                    +
                                                    + {{#if card.validFailedRolls}} + + {{/if}} +
                                                    +
                                                    + {{/unless}} + {{/unless}} + {{else}} +
                                                    + {{ localize 'CoC7.WaitForPlayerInput' }} +
                                                    + {{/if}} + {{else}} +
                                                    +
                                                    + {{#if data.flags.hasBonusDice}} + + {{/if}} + + {{#if data.obstacle.barrier}} + + {{else}} + + {{/if}} +
                                                    +
                                                    + + {{#if validSkill}} + : {{skill.value.value}}% + {{else}} + : + {{/if}} +
                                                    +
                                                    + {{#if canTakeCautiousApproach}} + + {{/if}} + {{#if validCheck}} + + {{/if}} +
                                                    +
                                                    + {{/if}} + {{/if}} + {{#if data.states.tryToBreak}} + {{#if data.states.playerActionDefined}} + {{#if data.states.obstacleDamageRolled}} + {{else}} +
                                                    + {{ localize 'CoC7.WaitForPlayerInput' }} +
                                                    + {{/if}} + {{else}} +
                                                    +
                                                    + + + +
                                                    +
                                                    + + +
                                                    + {{#if customWeapon}} +
                                                    +
                                                    +
                                                    + + +
                                                    +
                                                    + {{/if}} + {{#if card.validObstacleDamage}} +
                                                    + +
                                                    + {{/if}} +
                                                    + {{/if}} + {{/if}} + {{else}} +
                                                    +
                                                    +
                                                    {{ localize 'CoC7.WaitForPlayerInput' }}
                                                    + +
                                                    +
                                                    + + +
                                                    +
                                                    + {{/if}} + {{else}} +
                                                    +
                                                    +
                                                    {{ localize 'CoC7.Barrier' }}
                                                    +
                                                    {{ localize 'CoC7.Hazard' }}
                                                    +
                                                    + {{#if data.obstacle.barrier}} +
                                                    +
                                                    {{ localize 'CoC7.Breakable' }}
                                                    +
                                                    + {{/if}} +
                                                    + + +
                                                    +
                                                    + +
                                                    +
                                                    + {{/if}} + {{/if}} + +
                                                    +
                                                    + {{localize 'CoC7.Actions'}} + {{#each data.movementActionArray as |actionClass|}} + + {{/each}} +
                                                    + {{#each status as |s|}} +
                                                    {{s.name}}
                                                    + {{/each}} +
                                                    +
                                                    +
                                                    +
                                                    \ No newline at end of file diff --git a/templates/chat/cards/combined-roll.html b/templates/chat/cards/combined-roll.html index 2b9c290d..f52a2951 100644 --- a/templates/chat/cards/combined-roll.html +++ b/templates/chat/cards/combined-roll.html @@ -2,26 +2,26 @@ {{#unless closed}}
                                                    {{localize 'CoC7.Any'}} {{localize 'CoC7.All'}}
                                                    {{/unless}}
                                                      {{#each rolls as |r id| }}
                                                    1. - +
                                                      {{#if r.item}} {{r.item.name}} {{/if}} - {{r.sName}} + {{r.shortName}}
                                                      @@ -38,7 +38,7 @@ {{#if rolled}} {{{_htmlRoll}}} {{else}} -
                                                      +
                                                      {{/if}} @@ -46,7 +46,7 @@ {{#if success}}

                                                      {{localize 'CoC7.Success'}}

                                                      {{/if}} - + {{#if failure}}

                                                      {{localize 'CoC7.Failure'}}

                                                      {{/if}} @@ -56,4 +56,4 @@

                                                      {{localize 'CoC7.Failure'}}

                                                      {{/unless}} -
                                                      \ No newline at end of file +
                                                    diff --git a/templates/chat/cards/damage.html b/templates/chat/cards/damage.html index b6ea7102..bb6fb528 100644 --- a/templates/chat/cards/damage.html +++ b/templates/chat/cards/damage.html @@ -1,119 +1,119 @@
                                                    -
                                                    -
                                                    - {{#if displayActorOnCard}} - - {{/if}} - -

                                                    {{item.name}}

                                                    - -
                                                    +
                                                    +
                                                    + {{#if displayActorOnCard}} + + {{/if}} + +

                                                    {{item.name}}

                                                    + +
                                                    -
                                                    - {{{weapon.data.data.description.value}}} -
                                                    +
                                                    + {{{weapon.data.data.description.value}}} +
                                                    -
                                                    - {{#if hardrolled}} - {{#if critical}} - {{localize 'CoC7.Critical'}} - {{#if impale}} - {{localize 'CoC7.Impale'}} - {{/if}} - {{/if}} - {{else}} - {{localize 'CoC7.Critical'}} - {{#if critical}} - {{localize 'CoC7.Impale'}} - {{/if}} - {{/if}} - {{#if damageInflicted}} - {{#if ignoreArmor}} - Armor Ignored - {{else}} - {{CoC7.Armor}}: {{armor}} - {{CoC7.Armor}}: {{armor}} - {{/if}} - {{else}} -
                                                    -
                                                    - - {{#if ignoreArmor}} - - {{else}} - - {{/if}} - - {{#unless ignoreArmor}} - -
                                                    - -
                                                    - {{#if isArmorForula}} - - - - {{/if}} - {{/unless}} -
                                                    -
                                                    - {{#unless ignoreArmor}} - - {{armor}} - {{/unless}} -
                                                    -
                                                    - {{/if}} +
                                                    + {{#if hardrolled}} + {{#if critical}} + {{localize 'CoC7.Critical'}} + {{#if impale}} + {{localize 'CoC7.Impale'}} + {{/if}} + {{/if}} + {{else}} + {{localize 'CoC7.Critical'}} + {{#if critical}} + {{localize 'CoC7.Impale'}} + {{/if}} + {{/if}} + {{#if damageInflicted}} + {{#if ignoreArmor}} + {{localize 'CoC7.ArmorIgnored'}} + {{else if (and (ne armor '') (ne armor null))}} + {{localize 'CoC7.Armor'}}: {{armor}} + {{localize 'CoC7.Armor'}}: {{armor}} + {{/if}} + {{else}} +
                                                    +
                                                    + + {{#if ignoreArmor}} + + {{else}} + + {{/if}} + + {{#unless ignoreArmor}} + +
                                                    + +
                                                    + {{#if isArmorForula}} + + + + {{/if}} + {{/unless}} +
                                                    +
                                                    + {{#unless ignoreArmor}} + + {{armor}} + {{/unless}} +
                                                    + {{/if}} +
                                                    -
                                                    +
                                                    - {{#if rolled}} - {{!--
                                                    Damage roll: {{{_htmlInlineRoll}}}
                                                    --}} - {{{_htmlRoll}}} - {{#if targetKey}} - {{#if damageInflicted}} -
                                                    {{ localize 'CoC7.DamageInflicted'}} : {{totalDamageString}}
                                                    - {{else}} -
                                                    - -
                                                    - {{/if}} - {{else}} -
                                                    {{ localize 'CoC7.TotalDamage' }} : {{totalDamageString}} -
                                                    - - - -
                                                    + {{#if rolled}} + {{!--
                                                    Damage roll: {{{_htmlInlineRoll}}}
                                                    --}} + {{{_htmlRoll}}} + {{#if targetKey}} + {{#if damageInflicted}} +
                                                    {{ localize 'CoC7.DamageInflicted'}} : {{totalDamageString}}
                                                    + {{else}} +
                                                    +
                                                    - {{/if}} + {{/if}} {{else}} +
                                                    {{ localize 'CoC7.TotalDamage' }} : {{totalDamageString}} +
                                                    + + + +
                                                    +
                                                    + {{/if}} + {{else}}
                                                    - +
                                                    - {{/if}} + {{/if}} - - - + {{localize 'CoC7.AdvantageAttacker'}} +
                                                    + --}}
                                                    diff --git a/templates/chat/cards/opposed-roll.html b/templates/chat/cards/opposed-roll.html index 25f64656..818a519d 100644 --- a/templates/chat/cards/opposed-roll.html +++ b/templates/chat/cards/opposed-roll.html @@ -20,12 +20,12 @@ {{#if needsTieBreaker}}
                                                    {{localize 'CoC7.AdvantageAttacker'}} {{localize 'CoC7.AdvantageDefender'}}
                                                    @@ -48,14 +48,14 @@ {{#each rolls as |r id| }}
                                                  12. - +
                                                    {{#if r.item}} {{r.item.name}} {{else}} - {{r.sName}} + {{r.shortName}} {{/if}} {{#if r.maneuver}} {{localize 'CoC7.WeaponProperyManeuver'}} ({{localize 'CoC7.Build'}}: {{r.actor.build}}) @@ -111,4 +111,4 @@
                                                    {{/if}} {{/unless}} -
                                                    \ No newline at end of file +
                                                    diff --git a/templates/chat/cards/san-check.html b/templates/chat/cards/san-check.html index 8f3d833c..fc1c0197 100644 --- a/templates/chat/cards/san-check.html +++ b/templates/chat/cards/san-check.html @@ -3,262 +3,255 @@
                                                    {{#if displayActorOnCard}} - + {{/if}}
                                                    {{ localize 'CoC7.SanityCheck' }}
                                                    - + {{#if sanLossSource}} + + {{/if}}
                                                    {{/unless}} -
                                                    -
                                                    -
                                                    -
                                                    -
                                                    +
                                                    +
                                                    +
                                                    +
                                                    +
                                                    -
                                                    -
                                                    {{localize 'CoC7.DailyLoss'}}: {{actor.dailySanLoss}}
                                                    -
                                                    {{localize 'CoC7.Sanity'}}: {{actor.san}}/{{actor.sanMax}}
                                                    - {{#if creature}} - {{#if creatureEncountered}}
                                                    Creature encountered
                                                    {{/if}} - {{#if creatureSpecieEncountered}}
                                                    Specie encountered
                                                    {{/if}} -
                                                    Already lost: {{sanLostToThisCreature}}
                                                    -
                                                    Creature max loss: {{creature.sanLossMax}}
                                                    -
                                                    Max loss to this creature: {{maxSanLossToThisCreature}}
                                                    - {{else}} -
                                                    Max loss: {{maxSanLoss}}
                                                    - {{/if}} - {{#if state.sanRolled}} - {{#if sanCheck.failed}} -
                                                    Check failed
                                                    -
                                                    {{localize 'CoC7.InvoluntaryAction'}} {{#if state.involuntaryActionPerformed}}{{/if}}
                                                    - {{else}} -
                                                    Check passed
                                                    - {{/if}} - {{#if state.sanLossRolled}} -
                                                    {{ localize 'CoC7.SANLoss' }}: {{sanLoss}} {{#if state.sanLossApplied}}{{/if}}
                                                    - {{/if}} - {{/if}} - {{#if state.insanity}} -
                                                    Insanity
                                                    - {{/if}} - {{#if state.sane}} -
                                                    Sane
                                                    - {{/if}} - {{#if state.memoryRepressed}} -
                                                    Memory repressed
                                                    - {{/if}} - {{#if state.inSanity}} -
                                                    Insanity
                                                    - {{/if}} - {{#if state.temporaryInsane}} -
                                                    Temporary insannity
                                                    - {{/if}} - {{#if state.indefinitelyInsane}} -
                                                    Indefinitely insane
                                                    - {{/if}} - {{#if state.definitelyInsane}} -
                                                    Good for the asylum
                                                    - {{/if}} +
                                                    +
                                                    {{localize 'CoC7.DailyLoss'}}: {{actor.dailySanLoss}}
                                                    +
                                                    {{localize 'CoC7.Sanity'}}: {{actor.san}}/{{actor.sanMax}}
                                                    + {{#if sanLossReasonEncountered}}
                                                    {{localize 'CoC7.AlreadyEncounteredInformation' reason=sanData.sanReason lost=sanLostToReason max=maxSanLoss}}
                                                    {{/if}} +
                                                    {{localize 'CoC7.MaxPossibleSanLoss'}}: {{maxPossibleSanLoss}}
                                                    + {{#if state.sanRolled}} + {{#if sanCheck.failed}} +
                                                    {{localize 'CoC7.CheckFailed'}}
                                                    +
                                                    {{localize 'CoC7.InvoluntaryAction'}} {{#if state.involuntaryActionPerformed}}{{/if}}
                                                    + {{else}} +
                                                    {{localize 'CoC7.CheckPassed'}}
                                                    + {{/if}} + {{#if state.sanLossRolled}} +
                                                    {{ localize 'CoC7.SANLoss' }}: {{sanLoss}} {{#if state.sanLossApplied}}{{/if}}
                                                    + {{/if}} + {{/if}} + {{#if state.insanity}} +
                                                    {{localize 'CoC7.InsanityName'}}
                                                    + {{/if}} + {{#if state.sane}} +
                                                    {{localize 'CoC7.Sane'}}
                                                    + {{/if}} + {{#if state.memoryRepressed}} +
                                                    {{localize 'CoC7.CheckMemoryRepressed'}}
                                                    + {{/if}} + {{#if state.inSanity}} +
                                                    {{localize 'CoC7.InsanityName'}}
                                                    + {{/if}} + {{#if state.temporaryInsane}} +
                                                    {{localize 'CoC7.TemporaryInsanity'}}
                                                    + {{/if}} + {{#if state.indefinitelyInsane}} +
                                                    {{localize 'CoC7.IndefiniteInsanity'}}
                                                    + {{/if}} + {{#if state.definitelyInsane}} +
                                                    {{localize 'CoC7.DefinitelyInsane'}}
                                                    + {{/if}} - {{#if state.finish}} -
                                                    --F-I-N-I-S-H--
                                                    - {{/if}} + {{#if state.finish}} +
                                                    {{localize 'CoC7.FINISH'}}
                                                    + {{/if}} -
                                                    +
                                                    -
                                                    - {{#if state.sanRolled}} -
                                                    {{ localize 'CoC7.SanityCheckPerformed' }} {{#unless isBypassed}} {{{__inlineSanCheck}}} {{/unless}}
                                                    - {{#if state.involuntaryActionPerformed}} - {{#unless sanCheck.passed}} -
                                                    {{ localize 'CoC7.InvoluntaryActionPerformed' }}
                                                    - {{/unless}} - {{#if state.sanLossRolled}} - {{#if state.sanLossApplied}} - {{#if state.actorLostSan}} -
                                                    {{ localize 'CoC7.SanityLost' }}: {{#if __inlineSanLossRoll}}{{{__inlineSanLossRoll}}}{{else}}{{sanLoss}}{{/if}}
                                                    - {{#if state.limitedLossToCreature}} -
                                                    {{ localize 'CoC7.GrowingAccustomedToAwfulness' }}: {{sanLoss}}
                                                    - {{/if}} - {{else}} - {{#if state.immuneAlreadyInBout}} -
                                                    {{ localize 'CoC7.AlreadyInABout' }}
                                                    - {{/if}} - {{#if state.immuneToCreature}} -
                                                    {{ localize 'CoC7.ImmuneToAwfulness' }}
                                                    - {{/if}} - {{/if}} - {{#if state.intRolled}} - {{#if state.memoryRepressed}} -
                                                    {{{__inlineIntCheck}}} {{ localize 'CoC7.MemoryRepressed' }}
                                                    - {{/if}} - {{#if state.temporaryInsane}} -
                                                    {{{__inlineIntCheck}}} {{ localize 'CoC7.RememberEverything' }}
                                                    - {{/if}} - {{#if state.insanity}} - {{#unless state.boutOfMadnessOver}} -
                                                    {{ localize 'CoC7.EnteringBoutOfMadness' }} {{#if state.boutOfMadnessResolved}}({{actor.sanity.boutOfMadness.durationText}}){{/if}}
                                                    - {{/unless}} - {{#if state.permanentlyInsane}} -
                                                    {{ localize 'CoC7.GoodForAsylum' }}
                                                    - {{/if}} - {{#if state.boutOfMadnessResolved}} - {{#if boutResult.phobia}} -
                                                    {{ localize 'CoC7.PhobiaGained' }}: {{boutResult.name}}
                                                    - {{/if}} +
                                                    + {{#if state.sanRolled}} +
                                                    {{ localize 'CoC7.SanityCheckPerformed' }} {{#unless isBypassed}} {{{__inlineSanCheck}}} {{/unless}}
                                                    + {{#if state.involuntaryActionPerformed}} + {{#unless sanCheck.passed}} +
                                                    {{ localize 'CoC7.InvoluntaryActionPerformed' }}
                                                    + {{/unless}} + {{#if state.sanLossRolled}} + {{#if state.sanLossApplied}} + {{#if state.actorLostSan}} +
                                                    {{ localize 'CoC7.SanityLost' }}: {{#if __inlineSanLossRoll}}{{{__inlineSanLossRoll}}}{{else}}{{sanLoss}}{{/if}}
                                                    + {{#if state.limitedLossToCreature}} +
                                                    {{ localize 'CoC7.GrowingAccustomedToAwfulness' }}: {{sanLoss}}
                                                    + {{/if}} + {{else}} + {{#if state.immuneAlreadyInBout}} +
                                                    {{ localize 'CoC7.AlreadyInABout' }}
                                                    + {{/if}} + {{#if state.immuneToCreature}} +
                                                    {{ localize 'CoC7.ImmuneToAwfulness' }}
                                                    + {{/if}} + {{/if}} + {{#if state.intRolled}} + {{#if state.memoryRepressed}} +
                                                    {{{__inlineIntCheck}}} {{ localize 'CoC7.MemoryRepressed' }}
                                                    + {{/if}} + {{#if state.temporaryInsane}} +
                                                    {{{__inlineIntCheck}}} {{ localize 'CoC7.RememberEverything' }}
                                                    + {{/if}} + {{#if state.insanity}} + {{#unless state.boutOfMadnessOver}} +
                                                    {{ localize 'CoC7.EnteringBoutOfMadness' }}{{#if (and state.boutOfMadnessResolved actor.getTempoInsaneDurationText)}} ({{actor.getTempoInsaneDurationText}}){{/if}}
                                                    + {{/unless}} + {{#if state.permanentlyInsane}} +
                                                    {{ localize 'CoC7.GoodForAsylum' }}
                                                    + {{/if}} + {{#if state.boutOfMadnessResolved}} + {{#if boutResult.phobia}} +
                                                    {{ localize 'CoC7.PhobiaGained' }}: {{boutResult.name}}
                                                    + {{/if}} - {{#if boutResult.mania}} -
                                                    {{ localize 'CoC7.ManiaGained' }}: {{boutResult.name}}
                                                    - {{/if}} + {{#if boutResult.mania}} +
                                                    {{ localize 'CoC7.ManiaGained' }}: {{boutResult.name}}
                                                    + {{/if}} - {{#if state.boutOfMadnessOver}} -
                                                    {{ localize 'CoC7.BoutOfMadnesslasted' }} {{boutDuration}} {{#if boutRealTime}}{{ localize 'CoC7.rounds'}}{{/if}}{{#if boutSummary}}{{ localize 'CoC7.hours'}}{{/if}}
                                                    + {{#if state.boutOfMadnessOver}} +
                                                    {{ localize 'CoC7.BoutOfMadnesslasted' }} {{boutDuration}} {{#if boutRealTime}}{{ localize 'CoC7.rounds'}}{{/if}}{{#if boutSummary}}{{ localize 'CoC7.hours'}}{{/if}}
                                                    - {{#if state.indefinitelyInsane}} -
                                                    {{ localize 'CoC7.IndefinitelyInsane' }}
                                                    - {{/if}} - {{#if state.temporaryInsane}} -
                                                    {{ localize 'CoC7.TemporaryInsane' }} ({{actor.sanity.underlying.durationText}})
                                                    - {{/if}} - {{/if}} - {{/if}} - {{else}} -
                                                    - {{/if}} - {{else}} -
                                                    - -
                                                    - {{/if}} - {{/if}} - {{else}} -
                                                    - -
                                                    - {{/if}} - {{/if}} - {{else}} - {{#if state.permanentlyInsane}} -
                                                    {{ localize 'CoC7.PlayerPermanentlyInsane' }}
                                                    - {{else}} -
                                                    - -
                                                    - {{/if}} - {{/if}} + {{#if state.indefinitelyInsane}} +
                                                    {{ localize 'CoC7.IndefinitelyInsane' }}
                                                    + {{/if}} + {{#if state.temporaryInsane}} +
                                                    {{ localize 'CoC7.TemporaryInsane' }}
                                                    + {{/if}} + {{/if}} + {{/if}} + {{else}} +
                                                    + {{/if}} + {{else}} +
                                                    + +
                                                    + {{/if}} + {{/if}} + {{else}} +
                                                    + +
                                                    + {{/if}} + {{/if}} + {{else}} + {{#if state.permanentlyInsane}} +
                                                    {{ localize 'CoC7.PlayerPermanentlyInsane' }}
                                                    + {{else}} +
                                                    + +
                                                    + {{/if}} + {{/if}} - {{#if state.cthulhuMythosAwarded}} -
                                                    {{youGainCthulhuMythosString}}
                                                    - {{/if}} -
                                                    + {{#if state.cthulhuMythosAwarded}} +
                                                    {{youGainCthulhuMythosString}}
                                                    + {{/if}} +
                                                    -
                                                    - {{#if state.alreadyInsane}} -
                                                    {{alreadyInsaneText}}
                                                    - {{/if}} - {{#if state.boutOfMadnessResolved}} - {{#if boutResult.phobia}} -
                                                    {{ localize 'CoC7.InvestigatorPhobiaGained'}}
                                                    - {{/if}} - {{#if boutResult.mania}} -
                                                    -
                                                    {{ localize 'CoC7.InvestigatorManiaGained'}}
                                                    -
                                                    - {{/if}} -
                                                    {{{boutResult.description}}}
                                                    - {{#unless state.boutOfMadnessOver}} -
                                                    - -
                                                    - {{/unless}} - {{/if}} - {{#if state.insanity}} - {{#if state.permanentlyInsane}} -
                                                    - {{ localize 'CoC7.PlayerPermanentlyInsane'}} -
                                                    - {{else}} - {{#unless state.boutOfMadnessResolved}} -
                                                    - - -
                                                    - {{/unless}} - {{/if}} - {{/if}} - {{#if sanCheck.failed}} - {{#unless state.involuntaryActionPerformed}} -
                                                    - -
                                                    - {{/unless}} - {{/if}} +
                                                    + {{#if state.alreadyInsane}} +
                                                    {{ localize 'CoC7.AlreadyUnderlyingInsanity'}}
                                                    + {{/if}} + {{#if state.boutOfMadnessResolved}} + {{#if boutResult.phobia}} +
                                                    {{ localize 'CoC7.InvestigatorPhobiaGained'}}
                                                    + {{/if}} + {{#if boutResult.mania}} +
                                                    +
                                                    {{ localize 'CoC7.InvestigatorManiaGained'}}
                                                    +
                                                    + {{/if}} +
                                                    {{{boutResult.description}}}
                                                    + {{#unless state.boutOfMadnessOver}} +
                                                    + +
                                                    + {{/unless}} + {{/if}} + {{#if state.insanity}} + {{#if state.permanentlyInsane}} +
                                                    + {{ localize 'CoC7.PlayerPermanentlyInsane'}} +
                                                    + {{else}} + {{#unless state.boutOfMadnessResolved}} +
                                                    + + +
                                                    + {{/unless}} + {{/if}} + {{/if}} + {{#if sanCheck.failed}} + {{#unless state.involuntaryActionPerformed}} +
                                                    + +
                                                    + {{/unless}} + {{/if}} - {{#if state.sanLossRolled}} - {{#unless state.sanLossApplied}} -
                                                    - -
                                                    - {{/unless}} - {{/if}} + {{#if state.sanLossRolled}} + {{#unless state.sanLossApplied}} +
                                                    + +
                                                    + {{/unless}} + {{/if}} - {{#if actor.isInABoutOfMadness}} -
                                                    {{ localize 'CoC7.BoutActive'}}
                                                    - {{/if}} + {{#if actor.hasTempoInsane}} +
                                                    {{ localize 'CoC7.BoutActive'}}
                                                    + {{/if}} - {{#if creature}} - {{#if state.insanity}} - {{#if sanLoss}} - {{#unless state.cthulhuMythosAwarded}} -
                                                    - {{#if firstEncounter}} - - {{else}} - - {{/if}} - -
                                                    - {{/unless}} - {{/if}} - {{/if}} + {{#if sanData.sanReason}} + {{#if state.insanity}} + {{#if sanLoss}} + {{#unless state.cthulhuMythosAwarded}} +
                                                    + {{#if firstEncounter}} + + {{else}} + + {{/if}} + +
                                                    + {{/unless}} + {{/if}} + {{/if}} - {{#if creatureEncountered}}
                                                    Creature encountered
                                                    {{/if}} - {{#if creatureHasSpecie}}{{#if creatureSpecieEncountered}}
                                                    Specie encountered
                                                    {{/if}}{{/if}} -
                                                    {{ localize 'CoC7.AlreadyLost'}}: {{sanLostToThisCreature}}
                                                    -
                                                    {{ localize 'CoC7.CreatureMaxLoss'}}: {{creature.sanLossMax}}
                                                    -
                                                    {{ localize 'CoC7.MaxLossToCreature'}}: {{maxSanLossToThisCreature}}
                                                    + {{#if sanData.sanReason}} + {{#if sanLossReasonEncountered}} +
                                                    {{localize 'CoC7.AlreadyEncountered'}} "{{sanData.sanReason}}"
                                                    +
                                                    {{ localize 'CoC7.AlreadyLost'}}: {{sanLostToReason}}
                                                    +
                                                    {{ localize 'CoC7.CreatureMaxLoss'}}: {{maxSanLoss}}
                                                    + {{/if}} + {{/if}} +
                                                    {{localize 'CoC7.MaxSanloss'}}: {{maxPossibleSanLoss}}
                                                    - {{#unless state.keepCreatureSanData}} -
                                                    + {{#unless state.keepCreatureSanData}} +
                                                    - {{#if creatureEncountered}} - - {{/if}} - {{#if creatureHasSpecie}} - {{#if creatureSpecieEncountered}} - - {{/if}} - {{/if}} - -
                                                    - {{/unless}} + {{#if sanLossReasonEncountered}} + + + {{/if}} +
                                                    + {{/unless}} - {{else}} -
                                                    {{localize 'CoC7.MaxSanloss'}}: {{maxSanLoss}}
                                                    - {{/if}} + {{else}} +
                                                    {{localize 'CoC7.MaxSanloss'}}: {{maxSanLoss}}
                                                    + {{/if}} - {{#if mythosGain}} -
                                                    {{localize 'CoC7.MythosGain'}}: {{mythosGain}}%
                                                    - {{/if}} + {{#if mythosGain}} +
                                                    {{localize 'CoC7.MythosGain'}}: {{mythosGain}}%
                                                    + {{/if}} - {{#if state.finish}} -
                                                    {{localize 'CoC7.CardResolved'}}
                                                    - {{/if}} -
                                                    -
                                                    + {{#if state.finish}} +
                                                    {{localize 'CoC7.CardResolved'}}
                                                    + {{/if}} +
                                                  13. +
                                                    \ No newline at end of file diff --git a/templates/chat/cards/test.html b/templates/chat/cards/test.html new file mode 100644 index 00000000..360b49a2 --- /dev/null +++ b/templates/chat/cards/test.html @@ -0,0 +1,47 @@ +{{!-- TO BE REMOVED FOR PROD --}} +
                                                    +
                                                    + + + + + +
                                                    + + + + + + +
                                                    + + +
                                                    + {{localize 'CoC7.AdvantageAttacker'}} + {{localize 'CoC7.AdvantageDefender'}} +
                                                    + + Pouet pouet + {{localize "CoC7.Critical"}} + {{#if flags.critical}} + CRITICAL IS ON + {{/if}} +
                                                    + +
                                                    +
                                                    +
                                                    +{{!-- {{selectOptions sizes selected=swarm blank="" localize=true}} --}} diff --git a/templates/chat/combat/melee-initiator.html b/templates/chat/combat/melee-initiator.html index d80c74b0..71506602 100644 --- a/templates/chat/combat/melee-initiator.html +++ b/templates/chat/combat/melee-initiator.html @@ -13,7 +13,7 @@ data-resolution-card="{{resolutionCard}}" data-check-revealed="{{checkRevealed}}" data-is-blind="false"> - +
                                                    @@ -30,33 +30,33 @@

                                                    {{{item.data.data.description.value}}} {{#if rolled}}
                                                    - {{#if advantage}}{{localize 'CoC7.Advantage'}}{{/if}} - {{#if disadvantage}}{{localize 'CoC7.Disadvantage'}}{{/if}} + {{#if advantage}}{{localize 'CoC7.Advantage'}}{{/if}} + {{#if disadvantage}}{{localize 'CoC7.Disadvantage'}}{{/if}}
                                                    {{#if target}} {{targetName}} : - {{#if outnumbered}}{{localize 'CoC7.OutNumbered'}}{{/if}} - {{#if surprised}}{{localize 'CoC7.combatCard.surprised'}}{{/if}} - {{#if autoSuccess}}{{localize 'CoC7.combatCard.autoSuccess'}}{{/if}} + {{#if outnumbered}}{{localize 'CoC7.OutNumbered'}}{{/if}} + {{#if surprised}}{{localize 'CoC7.combatCard.surprised'}}{{/if}} + {{#if autoSuccess}}{{localize 'CoC7.combatCard.autoSuccess'}}{{/if}} {{/if}}
                                                    {{/if}}

                                                    - + {{#unless rolled}}
                                                    {{localize 'CoC7.Advantage'}} {{localize 'CoC7.Disadvantage'}}
                                                    {{/unless}} @@ -73,9 +73,9 @@

                                                    {{localize 'CoC7.OutNumbered'}} {{check.resultType}}

                                                    {{/unless}} {{/if}} {{/unless}} - + {{#unless check.pushing}} {{#if check.canIncreaseSuccess}} {{#each check.increaseSuccess as |level|}} - + {{/each}} {{/if}} {{/unless}}
                                                    - +
                                                    {{check.dices.total}} {{check.resultType}} @@ -190,7 +190,7 @@

                                                    {{check.resultType}}

                                                    {{#if autoSuccess}} {{#unless check.isFumble}}
                                                    - + {{/if}} +
                                                    +
                                                    + +
                                                    + {{else}} +
                                                    +

                                                    {{resultString}}

                                                    +
                                                    + {{/if}}
                                                    -{{else}} -
                                                    -

                                                    {{resultString}}

                                                    -
                                                    -{{/if}} - -
                                                    \ No newline at end of file diff --git a/templates/chat/combat/melee-target.html b/templates/chat/combat/melee-target.html index f702c7be..8d6ca451 100644 --- a/templates/chat/combat/melee-target.html +++ b/templates/chat/combat/melee-target.html @@ -1,218 +1,162 @@ -
                                                    +
                                                    -
                                                    -
                                                    - {{#if displayActorOnCard}} - - {{/if}} - {{#if dodging}} - -

                                                    {{actor.dodgeSkill.name}}

                                                    - {{else}} - {{#if fightingBack}} - -

                                                    {{weapon.name}}

                                                    - {{else}} - {{#if maneuvering}} - -

                                                    {{skill.data.name}}

                                                    - {{else}} -

                                                    ...

                                                    - {{/if}} - {{/if}} - {{/if}} - -
                                                    +
                                                    +
                                                    + {{#if displayActorOnCard}} + + {{/if}} + {{#if dodging}} + +

                                                    {{actor.dodgeSkill.name}}

                                                    + {{else if notResponding}} +

                                                    {{localize 'CoC7.NoResponse'}}

                                                    + {{else if fightingBack}} + +

                                                    {{weapon.name}}

                                                    + {{else if maneuvering}} + +

                                                    {{skill.data.name}}

                                                    + {{else}} +

                                                    ...

                                                    + {{/if}} + +
                                                    -
                                                    - {{#if dodging}} - {{{actor.dodgeSkill.data.data.description.value}}} - {{/if}} - {{#if fightingBack}} - {{{weapon.data.data.description.value}}} - {{/if}} - {{#if maneuvering}} - {{{skill.data.data.description.value}}} - {{/if}} - {{#if rolled}} -
                                                    - {{#if dodging}}{{localize 'CoC7.Dodge'}}{{/if}} - {{#if fightingBack}}{{localize 'CoC7.FightBack'}}{{/if}} - {{#if maneuvering}}{{localize 'CoC7.Maneuver'}}{{/if}} - {{#if advantage}}{{localize 'CoC7.Advantage'}}{{/if}} - {{#if disadvantage}}{{localize 'CoC7.Disadvantage'}}{{/if}} -
                                                    - {{/if}} -
                                                    + {{#unless notResponding}} +
                                                    + {{#if dodging}} + {{{actor.dodgeSkill.data.data.description.value}}} + {{else if fightingBack}} + {{{weapon.data.data.description.value}}} + {{else if maneuvering}} + {{{skill.data.data.description.value}}} + {{/if}} + {{#if rolled}} +
                                                    + {{#if dodging}}{{localize 'CoC7.Dodge'}}{{/if}} + {{#if fightingBack}}{{localize 'CoC7.FightBack'}}{{/if}} + {{#if maneuvering}}{{localize 'CoC7.Maneuver'}}{{/if}} + {{#if advantage}}{{localize 'CoC7.Advantage'}}{{/if}} + {{#if disadvantage}}{{localize 'CoC7.Disadvantage'}}{{/if}} +
                                                    + {{/if}} +
                                                    + {{/unless}} - {{#unless rolled}} -
                                                    - {{localize 'CoC7.Advantage'}} - {{localize 'CoC7.Disadvantage'}} -
                                                    - {{/unless}} + {{#unless (or rolled notResponding)}} +
                                                    + {{localize 'CoC7.Advantage'}} + {{localize 'CoC7.Disadvantage'}} +
                                                    + {{/unless}} -
                                                    +
                                                    - {{#unless rolled}} + {{#unless rolled}}
                                                    - {{localize 'CoC7.Dodge'}} -
                                                    - {{localize 'CoC7.FightBack'}} - + {{localize 'CoC7.Dodge'}} + {{localize 'CoC7.NoResponse'}} +
                                                    +
                                                    +
                                                    + {{localize 'CoC7.FightBack'}} + -
                                                    - {{localize 'CoC7.Maneuver'}} - +
                                                    +
                                                    + {{localize 'CoC7.Maneuver'}} + +
                                                    - {{/unless}} + {{/unless}} - {{#if rolled}} -
                                                    -
                                                    - - +
                                                    + {{else if actionSelected}} +
                                                    + {{#if fightingBack}} + + {{else if notResponding}} + + {{else}} + + {{/if}} +
                                                    + {{/if}}
                                                    \ No newline at end of file diff --git a/templates/chat/combat/range-initiator.html b/templates/chat/combat/range-initiator.html index 6dd837fb..fb37a42b 100644 --- a/templates/chat/combat/range-initiator.html +++ b/templates/chat/combat/range-initiator.html @@ -22,7 +22,7 @@ data-roll-mode="{{rollMode}}" data-is-blind="false" data-volley-size="{{volleySize}}"> - +
                                                    {{#if displayActorOnCard}} @@ -62,49 +62,49 @@

                                                    {{#if item.singleShot}} {{localize 'CoC7.rangeCombatCard.SingleShot'}} {{/if}} {{#if item.multipleShots}} {{localize 'CoC7.rangeCombatCard.MultipleShots'}} {{/if}} {{#if item.data.data.properties.brst}} {{localize 'CoC7.rangeCombatCard.Burst'}} {{/if}} {{#if item.data.data.properties.auto}} {{localize 'CoC7.rangeCombatCard.FullAuto'}} {{/if}}
                                                    {{localize 'CoC7.Advantage'}} {{localize 'CoC7.Disadvantage'}} {{localize 'CoC7.rangeCombatCard.aiming'}}
                                                    {{/if}} @@ -123,7 +123,7 @@

                                                    {{/each}}
                                                    - + {{#each targets as |trgt key|}}
                                                    {{#if ../rolled}} {{localize 'CoC7.rangeCombatCard.BaseRange'}} title="{{localize 'CoC7.rangeCombatCard.OutOfRange'}}" >{{localize 'CoC7.rangeCombatCard.OutOfRange'}} {{localize 'CoC7.rangeCombatCard.Cover'}} title="{{localize 'CoC7.rangeCombatCard.PointBlankRangeTitle'}}" >{{localize 'CoC7.rangeCombatCard.PointBlankRange'}} {{localize 'CoC7.rangeCombatCard.BigTarget'}} {{else}}
                                                    {{localize 'CoC7.rangeCombatCard.BaseRange'}}
                                                    {{localize 'CoC7.rangeCombatCard.Cover'}} {{#if trgt.big}}switched-on{{/if}} {{#if trgt.small}}switched-on{{/if}} gm-select-only" - title="{{trgt.sizeText}}" - style="text-align:center" + title="{{trgt.sizeText}}" + style="text-align:center" data-flag="size"> {{trgt.sizeLabel}} @@ -250,7 +250,7 @@

                                                    {{localize 'CoC7.rangeCombatCard.BaseRange'}} title="{{localize 'CoC7.rangeCombatCard.OutOfRange'}}" >{{localize 'CoC7.rangeCombatCard.OutOfRange'}} {{localize 'CoC7.rangeCombatCard.Cover'}} {{localize 'CoC7.combatCard.surprised'}} {{localize 'CoC7.rangeCombatCard.PointBlankRange'}} {{localize 'CoC7.rangeCombatCard.BigTarget'}} {{localize 'CoC7.combatCard.SmallTarget'}} {{localize 'CoC7.rangeCombatCard.InMelee'}} data-ref-message-id="{{roll.referenceMessageId}}" data-success-level="{{roll.successLevel}}" data-difficulty="{{roll.difficulty}}" - data-actor-id="{{roll.actor.id}}" - data-skill-id="{{roll.skill.data._id}}" - data-item-id="{{roll.item.data._id}}" + data-actor-id="{{roll.actor.id}}" + data-skill-id="{{roll.skill.data._id}}" + data-item-id="{{roll.item.data._id}}" data-dice-mod="{{roll.diceModifier}}" data-dice-modifier="{{roll.diceModifier}}" data-flat-modifier="{{roll.flatDiceModifier}}" data-ten-only-one-die="{{roll.tenOnlyOneDie}}" - data-value="{{roll.value}}" + data-value="{{roll.value}}" data-result="{{roll.dice.total}}" data-is-success="{{roll.isSuccess}}" data-is-fumble="{{roll.isFumble}}" @@ -421,7 +421,7 @@

                                                    class="dice-result" data-total="{{roll.dices.total}}" data-ten-result="{{roll.dices.tenResult}}"> -
                                                    {{#if roll.luckSpent}} @@ -466,12 +466,12 @@

                                                  - +

                                                  {{roll.resultType}}, {{roll.successRequired}}

                                                  {{#if roll.details}}

                                                  {{roll.details}}

                                                  {{/if}} - + {{#unless ../damageRolled}}
                                                  {{#unless roll.isSuccess}} @@ -486,7 +486,7 @@

                                                  {{roll.details}}

                                                  {{/unless}} {{/if}} {{/unless}} - + {{#unless roll.pushing}} {{#if roll.canIncreaseSuccess}}
                                                  @@ -514,7 +514,7 @@

                                                  {{roll.details}}

                                                  {{#if didAnyShotHit}} {{#unless damageRolled}}
                                                  - +
                                                  {{/unless}} {{/if}} @@ -558,7 +558,7 @@

                                                  {{roll.details}}

                                                - +

                                                {{localize 'CoC7.Target'}}: {{d.targetName}}

                                                @@ -568,10 +568,10 @@

                                                {{localize 'CoC7.Target'}}: {{d.targetName}}

                                                {{#unless damageDealt}} {{#if didAnyShotHit}}
                                                - +
                                                {{/if}} {{/unless}} {{/if}} - \ No newline at end of file + \ No newline at end of file diff --git a/templates/chat/roll-result.html b/templates/chat/roll-result.html index 87bf2552..dcd18d3d 100644 --- a/templates/chat/roll-result.html +++ b/templates/chat/roll-result.html @@ -80,22 +80,22 @@ {{#if isUnknown}}
                                                {{localize 'CoC7.RollDifficultyRegular'}} {{regularThreshold}}% {{localize 'CoC7.RollDifficultyHard'}} {{hardThreshold}}% {{localize 'CoC7.RollDifficultyExtreme'}} {{extremeThreshold}}% {{localize 'CoC7.RollDifficultyCritical'}} diff --git a/templates/chat/rolls/in-card-roll.html b/templates/chat/rolls/in-card-roll.html index 007a2c68..449ec9c8 100644 --- a/templates/chat/rolls/in-card-roll.html +++ b/templates/chat/rolls/in-card-roll.html @@ -2,22 +2,22 @@ {{#if isUnknown}}
                                                {{localize 'CoC7.RollDifficultyRegular'}} {{regularThreshold}}% {{localize 'CoC7.RollDifficultyHard'}} {{hardThreshold}}% {{localize 'CoC7.RollDifficultyExtreme'}} {{extremeThreshold}}% {{localize 'CoC7.RollDifficultyCritical'}} diff --git a/templates/coc7-menu.html b/templates/coc7-menu.html deleted file mode 100644 index dc180406..00000000 --- a/templates/coc7-menu.html +++ /dev/null @@ -1,23 +0,0 @@ -
                                                {{#each controls as |c|}} -
                                              7. - -
                                                  - {{#each c.tools as |t|}} -
                                                1. - -
                                                2. - {{/each}} -
                                                -
                                              8. -{{/each}} -
                                                - \ No newline at end of file diff --git a/templates/common/active-effects.hbs b/templates/common/active-effects.hbs new file mode 100644 index 00000000..54058fca --- /dev/null +++ b/templates/common/active-effects.hbs @@ -0,0 +1,54 @@ +
                                                  + {{#each effects as |section sid|}} + {{#unless section.hidden}} +
                                                1. +

                                                  {{localize section.label}}

                                                  +
                                                  {{localize "CoC7.Source"}}
                                                  +
                                                  {{localize "CoC7.Duration"}}
                                                  +
                                                  + {{#if @root.editable}} + + {{localize "CoC7.Add"}} + + {{/if}} +
                                                  +
                                                2. + + {{#if section.info}} +
                                                    + {{#each section.info}} +
                                                  1. {{this}}
                                                  2. + {{/each}} +
                                                  + {{/if}} + +
                                                    + {{#each section.effects as |effect|}} +
                                                  1. +
                                                    + +

                                                    {{effect.data.label}}

                                                    +
                                                    +
                                                    {{effect.sourceName}}
                                                    +
                                                    {{effect.duration.label}}
                                                    +
                                                    + {{#if @root.editable}} + + + + + + + + + + {{/if}} +
                                                    +
                                                  2. + {{/each}} +
                                                  + {{/unless}} + {{/each}} +
                                                + \ No newline at end of file diff --git a/templates/items/archetype.html b/templates/items/archetype.html index f4fa802d..0ef26d7f 100644 --- a/templates/items/archetype.html +++ b/templates/items/archetype.html @@ -25,6 +25,9 @@

                                                {{ localize "CoC7.Description" }} {{ localize "CoC7.Details" }} {{ localize "CoC7.Skills" }} + {{#if isKeeper}} + + {{/if}} @@ -125,12 +128,12 @@

                                                {{ localize "CoC7.EmptySkillList" }}

                                                {{#each data.skills as |skill|}}
                                              9. -

                                                {{skill.displayName}} ({{skill.data.base}}%)

                                                +

                                                {{skill.name}} ({{skill.data.base}}%)

                                                {{#unless ../isOwned}} - + {{/unless}}
                                              10. @@ -138,5 +141,10 @@

                                                {{skill.displayName}} ({{skill.data.base}}%)

                                              + {{#if isKeeper}} +
                                              + {{editor content=data.description.keeper target="data.description.keeper" button=true owner=owner editable=editable}} +
                                              + {{/if}} diff --git a/templates/items/book/details.hbs b/templates/items/book/details.html similarity index 89% rename from templates/items/book/details.hbs rename to templates/items/book/details.html index f060220f..7dc2d753 100644 --- a/templates/items/book/details.hbs +++ b/templates/items/book/details.html @@ -29,7 +29,14 @@
                                              - +
                                              {{/if}} {{#if (or data.type.mythos data.type.occult)}} diff --git a/templates/items/book/development.hbs b/templates/items/book/development.html similarity index 100% rename from templates/items/book/development.hbs rename to templates/items/book/development.html diff --git a/templates/items/book/main.hbs b/templates/items/book/main.html similarity index 86% rename from templates/items/book/main.hbs rename to templates/items/book/main.html index 994f9623..051eddf1 100644 --- a/templates/items/book/main.hbs +++ b/templates/items/book/main.html @@ -51,7 +51,7 @@ {{else}}
                                              - {{#if (or isKeeper isOwned)}} + {{#if (or isKeeper isOwner)}}
                                              - {{> "systems/CoC7/templates/items/book/details.hbs"}} + {{> "systems/CoC7/templates/items/book/details.html"}}
                                              - + {{#if spellListEmpty}} + + {{/if}}
                                                {{#each data.spells as |spell key|}}
                                              • @@ -170,11 +170,18 @@
                                              + {{#if (or ../isKeeper spell.data.learned)}} + + {{/if}} + {{#if ../isKeeper}} + {{/if}}
                                              + {{#if (not spell.data.learned)}}
                                              + {{/if}} {{/each}} @@ -182,10 +189,9 @@
                                              {{editor - content=data.notes - target="data.notes" - button=true - owner=owner + content=data.description.keeper + target="data.description.keeper" + button=true owner=owner editable=editable }}
                                              diff --git a/templates/items/chase.html b/templates/items/chase.html index 37405361..14328dd6 100644 --- a/templates/items/chase.html +++ b/templates/items/chase.html @@ -1,125 +1,521 @@
                                              -
                                              -
                                              -
                                              - -
                                              -
                                              -
                                              - -
                                              -
                                              - - -
                                              -
                                              -
                                              - -
                                              - - - -
                                              -
                                              -
                                              - {{#each participants as |p i|}} -
                                              -
                                              - {{#if p.isChaser}} - - {{else}} - - {{/if}} -
                                              -
                                              - -
                                              -
                                              -
                                              - {{#if p.isActor}} - {{p.name}} - {{else}} - - {{/if}} -
                                              -
                                              - -
                                              -
                                              - -
                                              -
                                              - - {{#each p.speedCheck.options as |o|}} - - {{/each}} - - +
                                              +
                                              + {{#unless started}} +
                                              + + +
                                              + {{/unless}} + {{#if activeLocation.uuid}} +
                                              + {{#unless activeLocation.init}} +
                                              + {{/unless}} +
                                              + {{#if activeLocation}} + + {{#each item.allSkillsAndCharacteristics as |o|}} + + {{/each}} + + + {{#each item.activeActorSkillsAndCharacteristics as |o|}} + + {{/each}} + +
                                              + + + {{#if activeLocation.hasParticipant}} + + {{else}} + {{#if activeLocation.init}} + + {{else}} + + {{/if}} + {{/if}} + + + + +
                                              +
                                              +
                                              + {{#unless activeLocation.first}} +
                                              +
                                              barrier
                                              +
                                              hazard
                                              +
                                              + {{#if activeLocation.obstacle}} +
                                              + +
                                              +
                                              + + {{#if started}} + + + + {{/if}} +
                                              +
                                              +
                                              + + + + {{#if activeLocation.obstacleDetails.hasDamage}} + + {{/if}}
                                              -
                                              - {{#if p.speedCheck.refSet}} - {{p.speedCheck.score}} - {{else}} - + {{#if activeLocation.obstacleDetails.barrier}} +
                                              + + + + {{#if activeLocation.obstacleDetails.hasHitPoints}} + {{/if}} -
                                              -
                                              - {{#if p.speedCheck.rolled}} - {{{p.speedCheck.inlineRoll}}} - {{else}} - +
                                              + {{else}} +
                                              + + + + {{#if activeLocation.obstacleDetails.hasActionCost}} + {{/if}} +
                                              + {{/if}} +
                                              + {{/if}} + {{/unless}} +
                                              +
                                              + {{#unless activeLocation.last}} +
                                              +
                                              barrier
                                              +
                                              hazard
                                              +
                                              + {{#if nextLocation.obstacle}} +
                                              + +
                                              +
                                              + + {{#if started}} + + + + {{/if}} +
                                              +
                                              +
                                              + + + + {{#if nextLocation.obstacleDetails.hasDamage}} + + {{/if}}
                                              -
                                              - {{#if p.speedCheck.rolled}} - {{#if p.speedCheck.hasModifier}} - - {{else}} - - {{/if}} + {{#if nextLocation.obstacleDetails.barrier}} +
                                              + + + + {{#if nextLocation.obstacleDetails.hasHitPoints}} + {{/if}} -
                                              -
                                              - {{p.adjustedMov}} -
                                              -
                                              - {{#if p.speedCheck.rolled}} - - {{else}} - +
                                              + {{else}} +
                                              + + + + {{#if nextLocation.obstacleDetails.hasActionCost}} + {{/if}} -
                                              +
                                              + {{/if}} +
                                              + {{/if}} + {{/unless}} +
                                              + +
                                              + {{/if}} +
                                              + {{#unless nextLocation.init}} +
                                              + {{/unless}} +
                                              + {{/if}} + +
                                              + + + +
                                              +
                                              + {{#if locations}} + + {{#if started}} +
                                              + {{#each item.participantsByInitiative as |p i|}} +
                                              +
                                              +
                                              {{p.name}}
                                              + +
                                              +
                                              +
                                              + +
                                              +
                                              +
                                              {{localize 'CoC7.Chase.InitiativeShort' value=p.initiative}}
                                              +
                                              {{localize 'CoC7.Chase.AdjustedMovementShort' value=p.adjustedMov}}
                                              +
                                              {{localize 'CoC7.HP'}}: +
                                              +
                                              +
                                              +
                                              + {{#each movementActionArray as |actionClass|}} + + {{/each}} +
                                              +
                                              + + + + + + +
                                              + + + + + {{#unless p.hasNoMvtActions}} +
                                              + {{!-- --}} + + + + + {{#if p.canAssist}} + + {{/if}} + {{#if p.canBeCautious}} + + + {{/if}} + {{/unless}} +
                                              +
                                              + {{/each}} +
                                              + {{/if}} + +
                                              + {{#each locations as |location i|}} +
                                              +
                                              + {{#unless location.first}} + {{#if location.obstacle}} +
                                              {{/if}} + {{/unless}} +
                                              + {{#each location.participants as |p|}} + {{#if p}} +
                                              + +
                                              + {{/if}} {{/each}} +
                                              -
                                              -
                                              - -
                                              +
                                              + {{#unless location.first}} + {{#if location.obstacle}} +
                                              +
                                              + {{#if location.obstacleDetails.barrier}} + + {{else}} + + {{/if}} +
                                              +
                                              + {{/if}} + {{/unless}} + +
                                              + {{#if location.first}} +
                                              + {{else}} +
                                              + {{/if}} + +
                                              {{location.name}}
                                              + + + {{#if location.last}} +
                                              + {{else}} +
                                              + {{/if}} +
                                              + +
                                              +
                                              + {{/each}} +
                                              + {{else}} +
                                              +
                                              + + +
                                              {{localize 'CoC7.Initialize'}}
                                              +
                                              +
                                              + {{/if}} + + +
                                              + {{#unless started}} + + + +
                                              + + +
                                              +
                                              + +
                                              -
                                              - -
                                              - azertyuiopqsdfghjklmwxcvbnazertyuiopqsdfghjklmwxcvbnazertyuiopqsdfghjklmwxcvbnazertyuiopqsdfghjklmwxcvbnazertyuiopqsdfghjklmwxcvbnazertyuiopqsdfghjklmwxcvbnazertyuiopqsdfghjklmwxcvbnazertyuiopqsdfghjklmwxcvbnazertyuiopqsdfghjklmwxcvbnazertyuiopqsdfghjklmwxcvbnazertyuiopqsdfghjklmwxcvbn + {{/unless}} + + {{#if locations}} + {{#if started}} +
                                              {{localize 'CoC7.NextRound'}}
                                              +
                                              {{localize 'CoC7.Restart'}}
                                              + {{else}} +
                                              {{localize 'CoC7.Reset'}}
                                              +
                                              {{localize 'CoC7.CutToTheChase'}}
                                              + {{/if}} + {{/if}} + +
                                              +
                                              +
                                              +
                                              +
                                              + {{#each participants as |p i|}} +
                                              +
                                              + {{#if p.isChaser}} + + {{else}} + + {{/if}} +
                                              +
                                              + +
                                              +
                                              +
                                              + {{#if p.isActor}} + {{p.name}} + {{else}} + + {{/if}} +
                                              +
                                              + +
                                              +
                                              + +
                                              +
                                              + + {{#each p.speedCheck.options as |o|}} + + {{/each}} + + +
                                              +
                                              + {{#if p.speedCheck.refSet}} + {{p.speedCheck.score}} + {{else}} + + {{/if}} +
                                              +
                                              + {{#if p.speedCheck.rolled}} + {{{p.speedCheck.inlineRoll}}} + {{else}} + + {{/if}} +
                                              +
                                              + {{#if p.speedCheck.rolled}} + {{#if p.speedCheck.hasModifier}} + + {{else}} + + {{/if}} + {{/if}} +
                                              +
                                              + {{p.adjustedMov}} +
                                              +
                                              + {{#if p.speedCheck.rolled}} + + {{else}} + + {{/if}} +
                                              + {{!-- --}} +
                                              + {{#if p.hasDriver}} +
                                              +
                                              +
                                              + +
                                              +
                                              {{p.driver.name}}
                                              +
                                              + +
                                              +
                                              + {{/if}} + {{/each}} +
                                              +
                                              +
                                              +
                                              -
                                              -
                                              +
                                              +
                                              +
                                              + +
                                              +
                                              {{localize 'CoC7.Chase.PreysMin' value=preysMinMov}}
                                              +
                                              {{localize 'CoC7.Chase.PreysMax' value=preysMaxMov}}
                                              +
                                              {{localize 'CoC7.Chase.ChasersMin' value=chasersMinMov}}
                                              +
                                              {{localize 'CoC7.Chase.ChasersMax' value=chasersMaxMov}}
                                              +
                                              + {{#if isKeeper}} +
                                              + {{editor content=data.description.keeper target="data.description.keeper" button=true owner=owner editable=editable}} +
                                              + {{/if}} +
                                              +
                                              \ No newline at end of file diff --git a/templates/items/item-sheet.html b/templates/items/item-sheet.html deleted file mode 100644 index 011be88c..00000000 --- a/templates/items/item-sheet.html +++ /dev/null @@ -1,25 +0,0 @@ -
                                              - -
                                              - -
                                              -

                                              -
                                              - - -
                                              -
                                              - - -
                                              -
                                              -
                                              - - - - {{!-- Description Tab --}} -
                                              - {{editor content=data.description target="data.description" button=true owner=owner editable=editable}} -
                                              - -
                                              diff --git a/templates/items/item-sheetV2.html b/templates/items/item-sheetV2.html index c7888426..28cb2c0b 100644 --- a/templates/items/item-sheetV2.html +++ b/templates/items/item-sheetV2.html @@ -1,5 +1,5 @@
                                              -
                                              +
                                              @@ -20,11 +20,23 @@
                                              -
                                              + -
                                              - {{editor content=data.description target="data.description" button=true owner=owner editable=editable}} +
                                              +
                                              + {{editor content=data.description.value target="data.description.value" button=true owner=owner editable=editable}}
                                              + {{#if isKeeper}} +
                                              + {{editor content=data.description.keeper target="data.description.keeper" button=true owner=owner editable=editable}} +
                                              + {{/if}}
                                              diff --git a/templates/items/occupation.html b/templates/items/occupation.html index ef4115cd..fee61649 100644 --- a/templates/items/occupation.html +++ b/templates/items/occupation.html @@ -28,6 +28,9 @@

                                              {{ localize "CoC7.Description" }} {{#unless isOwned}}{{ localize "CoC7.Details" }}{{/unless}} {{ localize "CoC7.Skills" }} + {{#if isKeeper}} + + {{/if}} @@ -198,12 +201,12 @@

                                              {{ localize "CoC7.EmptySkillList" }}

                                              {{#each data.skills as |skill|}}
                                            3. -

                                              {{skill.displayName}} ({{skill.data.base}}%)

                                              +

                                              {{skill.name}} ({{skill.data.base}}%)

                                              {{#unless ../isOwned}} - + {{/unless}}
                                            4. @@ -231,10 +234,10 @@

                                              {{ localize "CoC7.EmptySkillList" }}

                                              {{#each group.skills as |skill index|}}
                                            5. -

                                              {{skill.displayName}} ({{skill.data.base}}%)

                                              +

                                              {{skill.name}} ({{skill.data.base}}%)

                                              - +
                                            6. {{/each}} @@ -250,5 +253,10 @@

                                              {{/unless}}
                                              + {{#if isKeeper}} +
                                              + {{editor content=data.description.keeper target="data.description.keeper" button=true owner=owner editable=editable}} +
                                              + {{/if}} diff --git a/templates/items/setup.html b/templates/items/setup.html index d7681f9a..1275b581 100644 --- a/templates/items/setup.html +++ b/templates/items/setup.html @@ -23,6 +23,9 @@

                                              {{ localize "CoC7.Details" }} {{#if data.enableCharacterisitics}}{{ localize "CoC7.Characteristics" }}{{/if}} {{ localize "CoC7.Skills" }} + {{#if isKeeper}} + + {{/if}} @@ -54,13 +57,11 @@

                                              {{ localize "CoC7.Eras" }}

                                              -
                                              - {{#each data.eras as |era key|}} - - {{/each}} -
                                              +
                                              + {{#each _eras as |era key|}} + {{localize era.name}} + {{/each}} +
                                              {{#if oneBlockBackStory}}

                                              @@ -85,7 +86,7 @@

                                              {{ localize "CoC7.Items" }}

                                              - {{#if skillListEmpty}} + {{#if itemsListEmpty}}

                                              {{ localize "CoC7.EmptyItemList" }}

                                              {{/if}} @@ -97,7 +98,7 @@

                                              {{item.name}} ({{item.type}})

                                              - + {{!-- --}}
                                              @@ -118,11 +119,11 @@

                                              {{ localize "CoC7.EmptySkillList" }}

                                              {{#each skills as |skill|}}
                                            7. -

                                              {{skill.displayName}} ({{skill.data.base}}%)

                                              +

                                              {{skill.name}} ({{skill.data.base}}%)

                                              - + {{!-- --}}
                                            8. @@ -186,12 +187,11 @@

                                              {{ localize "CoC7.Characteristics" }}

                                              {{/if}} - - - - - - + {{#if isKeeper}} +
                                              + {{editor content=data.description.keeper target="data.description.keeper" button=true owner=owner editable=editable}} +
                                              + {{/if}} diff --git a/templates/items/skill-sheet.html b/templates/items/skill-sheet.html index 5c8d35b0..a4bfd360 100644 --- a/templates/items/skill-sheet.html +++ b/templates/items/skill-sheet.html @@ -1,54 +1,69 @@
                                              +
                                              +
                                              +
                                              + + {{#if isSpecialized}} + + / + {{#if canModifySpec}} + + {{else}} +
                                              {{data.specialization}}
                                              + {{/if}} + {{else}} + + {{/if}} + {{#if hasOwner}} + + + {{else}} + -
                                              -
                                              -
                                              - - {{#if isSpecialized}} - / - {{#if canModifySpec}} - - {{else}} -
                                              {{data.specialization}}
                                              - {{/if}} - {{/if}} - {{#if hasOwner}} - - - {{else}} - - - - {{/if}} -
                                              -
                                              + + {{/if}} +
                                              +
                                              + {{#each _properties as |property key|}} + {{localize property.name}} + {{/each}} +
                                              -
                                              - -
                                              - {{#each _properties as |property key|}} - {{localize property.name}} - - {{/each}} -
                                              + {{#unless hasOwner}} +
                                              + +
                                              + {{#each _eras as |era key|}} + {{localize era.name}} + {{/each}} +
                                              - + {{/unless}}
                                              + +
                                              - - + - -
                                              - {{editor content=data.description.value target="data.description.value" button=true owner=owner editable=editable}} +
                                              +
                                              + {{editor content=data.description.value target="data.description.value" button=true owner=owner editable=editable}} +
                                              +
                                              + {{> "systems/CoC7/templates/common/active-effects.hbs"}}
                                              - + {{#if isKeeper}} +
                                              + {{editor content=data.description.keeper target="data.description.keeper" button=true owner=owner editable=editable}} +
                                              + {{/if}} +
                                              + \ No newline at end of file diff --git a/templates/items/spell.html b/templates/items/spell.html deleted file mode 100644 index 52a3a21a..00000000 --- a/templates/items/spell.html +++ /dev/null @@ -1,111 +0,0 @@ -
                                              -
                                              -
                                              -

                                              - -

                                              - -
                                                -
                                              • - -
                                              • -
                                              • - -
                                              • -
                                              • - {{ castingCost }} -
                                              • -
                                              - -
                                              - - -
                                              - {{!-- Item Sheet Navigation --}} - - - - {{!-- Item Sheet Body --}} -
                                              - - {{!-- Description Tab --}} -
                                              - -
                                              -
                                                - {{#each itemProperties}} -
                                              1. {{this}}
                                              2. - {{/each}} -
                                              -
                                              - - {{editor content=data.description.value target="data.description.value" button=true owner=owner editable=editable}} -
                                              - - {{!-- Details Tab --}} -
                                              - -

                                              {{ localize "CoC7.Details" }}

                                              - {{!-- Spell Type --}} -
                                              - -
                                              - - - - - - - - -
                                              -
                                              - -

                                              {{ localize "CoC7.SpellCastingCost" }}

                                              - -
                                              - - -
                                              - -
                                              - - -
                                              - -
                                              - - -
                                              - -
                                              - - -
                                              - -

                                              {{ localize "CoC7.Notes"}}

                                              - {{editor content=data.description.notes target="data.description.notes" button=true owner=owner editable=editable}} -
                                              -
                                              - -
                                              diff --git a/templates/items/spell/chat.html b/templates/items/spell/chat.html new file mode 100644 index 00000000..a910546a --- /dev/null +++ b/templates/items/spell/chat.html @@ -0,0 +1,9 @@ + +
                                                + {{#each losses as |loss key|}} +
                                              • {{loss.characteristicName}}: -{{loss.loss}} {{localize "CoC7.Points"}}
                                              • + {{/each}} +
                                              +
                                              + {{{description}}} + diff --git a/templates/items/spell/details.html b/templates/items/spell/details.html new file mode 100644 index 00000000..36563ec4 --- /dev/null +++ b/templates/items/spell/details.html @@ -0,0 +1,56 @@ +
                                              +
                                              + +
                                              + + + + + + + + + + + + + + + + +
                                              +
                                              +
                                              +
                                              +
                                              + + +
                                              +
                                              + + +
                                              +
                                              +
                                              +
                                              + + +
                                              +
                                              + + +
                                              +
                                              +
                                              +
                                              +
                                              + + +
                                              +
                                              +
                                              + {{#if data.type.combat}} + + {{/if}} +
                                              +
                                              diff --git a/templates/items/spell/main.html b/templates/items/spell/main.html new file mode 100644 index 00000000..f1a91fcb --- /dev/null +++ b/templates/items/spell/main.html @@ -0,0 +1,78 @@ +
                                              +
                                              +
                                              + +
                                              +
                                              +
                                              + +
                                              + {{#if isKeeper}} +
                                              + + +
                                              +
                                              + + +
                                              + {{/if}} +
                                              +
                                              + {{#if (or isKeeper isOwner)}} +
                                              + + + +
                                              + {{/if}} +
                                              + +
                                              +
                                              + {{editor + content=data.description.value + target="data.description.value" + button=true + owner=owner + editable=editable + }} +
                                              +
                                              + {{> "systems/CoC7/templates/items/spell/details.html"}} +
                                              +
                                              + {{editor + content=data.description.keeper + target="data.description.keeper" + button=true owner=owner + editable=editable + }} +
                                              +
                                              +
                                              +
                                              diff --git a/templates/items/status.html b/templates/items/status.html index 2ce4457b..1e20c694 100644 --- a/templates/items/status.html +++ b/templates/items/status.html @@ -21,6 +21,9 @@

                                              {{ localize "CoC7.Description" }} {{ localize "CoC7.Details" }} {{ localize "CoC7.Effects" }} + {{#if isKeeper}} + + {{/if}} @@ -64,6 +67,11 @@

                                              {{ localize "CoC7.Notes"}}

                                              To be implemented

                                              + {{#if isKeeper}} +
                                              + {{editor content=data.description.keeper target="data.description.keeper" button=true owner=owner editable=editable}} +
                                              + {{/if}} diff --git a/templates/items/talent.html b/templates/items/talent.html index f98ebfd3..e4fe2f91 100644 --- a/templates/items/talent.html +++ b/templates/items/talent.html @@ -20,6 +20,9 @@

                                              class="sheet-navigation tabs" data-group="primary"> {{ localize "CoC7.Description" }} {{ localize "CoC7.Details" }} + {{#if isKeeper}} + + {{/if}} @@ -75,6 +78,11 @@

                                              {{ localize "CoC7.Details" }}

                                              {{ localize "CoC7.Notes"}}

                                              {{editor content=data.description.notes target="data.description.notes" button=true owner=owner editable=editable}}
                                              + {{#if isKeeper}} +
                                              + {{editor content=data.description.keeper target="data.description.keeper" button=true owner=owner editable=editable}} +
                                              + {{/if}} diff --git a/templates/items/weapon-sheet.html b/templates/items/weapon-sheet.html index c834a6de..b03aa8e1 100644 --- a/templates/items/weapon-sheet.html +++ b/templates/items/weapon-sheet.html @@ -20,7 +20,7 @@ {{/each}} {{/if}} - {{/select}} + {{/select}} {{#if usesAlternateSkill}} @@ -39,9 +39,9 @@ {{/if}} {{else}} - + {{#if usesAlternateSkill}} - + {{/if}} {{/if}}
                                              @@ -84,25 +84,25 @@
                                              {{!-- Sheet Tab Navigation --}} -