First adaptation pass

This commit is contained in:
2025-11-06 00:01:59 +01:00
parent 5b1fd847c2
commit 6b883f8126
112 changed files with 44142 additions and 953 deletions
+381 -196
View File
@@ -13,34 +13,49 @@
}, },
"FIELDS": { "FIELDS": {
"armorType": { "armorType": {
"label": "Category" "label": "Armor Type"
}, },
"cost": { "cost": {
"label": "Cost" "label": "Cost"
}, },
"damageReduction": { "damageReduction": {
"label": "Damage reduction" "label": "Damage Reduction"
}, },
"defense": { "defense": {
"label": "Defense" "label": "Armor Class (AC)"
},
"mrr": {
"label": "Maximum Reduction Rating (MRR)"
},
"passive": {
"label": "Armor Passive"
},
"passiveDescription": {
"label": "Passive Description"
},
"augment": {
"label": "Armor Augment"
},
"augmentDescription": {
"label": "Augment Description"
}, },
"encLoad": { "encLoad": {
"label": "Load" "label": "Encumbrance Load"
}, },
"equipped": { "equipped": {
"label": "Equipped?" "label": "Equipped?"
}, },
"hp": { "hp": {
"label": "HP" "label": "Armor HP"
}, },
"isHelmet": { "isHelmet": {
"label": "Is Helmet?" "label": "Is Helmet?"
}, },
"maximumMovement": { "maximumMovement": {
"label": "Maximum movement" "label": "Movement Penalty"
}, },
"money": { "money": {
"label": "Money unit" "label": "Currency"
} }
} }
}, },
@@ -421,27 +436,240 @@
"monster-damage": "Monster damage", "monster-damage": "Monster damage",
"monster-defense": "Monster defense", "monster-defense": "Monster defense",
"weapons": "Weapons", "weapons": "Weapons",
"wis": "WIS" "wis": "WIS",
"subAttributes": "Sub-Attributes",
"prowess": "Prowess",
"vigor": "Vigor",
"competence": "Competence",
"authority": "Authority",
"presence": "Presence",
"stamina": "Stamina",
"wit": "Wit",
"grace": "Grace",
"tenacity": "Tenacity",
"willpower": "Willpower",
"resilience": "Resilience",
"cunning": "Cunning",
"guile": "Guile",
"sovereignty": "Sovereignty",
"coreSkill": "Core Skill",
"isCoreSkill": "Is Core Skill?",
"coreSkillType": "Core Skill Type",
"attributeBonusChoice": "Attribute Bonus (+2)",
"selectAttribute": "Select Attribute",
"modifier": "Modifier",
"basicChecks": "Basic Checks",
"advancedChecks": "Advanced Checks",
"enabled": "Enabled",
"disabled": "Disabled",
"coreSkillClass": "Core Skill Class",
"yourCoreSkill": "Your Core Skill",
"availableCoreSkills": "Available Core Skills",
"attributeChoices": "Attribute Choices",
"customSkills": "Custom Skills",
"advancedChecksEnabled": "Advanced Checks Enabled",
"chooseSkill": "Choose a Core Skill",
"armorType": "Armor Type",
"armorClass": "Armor Class (AC)",
"mrr": "Maximum Reduction Rating (MRR)",
"movementPenalty": "Movement Penalty",
"armorHP": "Armor Hit Points",
"encumbranceLoad": "Encumbrance Load",
"isHelmet": "Is Helmet?",
"equipped": "Equipped?",
"armorPassive": "Armor Passive",
"passiveName": "Passive Name",
"passiveDescription": "Passive Description",
"armorAugment": "Armor Augment",
"augmentName": "Augment Name",
"augmentDescription": "Augment Description",
"cost": "Cost",
"currency": "Currency",
"weaponType": "Weapon Type",
"weaponGroup": "Weapon Group",
"apc": "Action Point Cost (APC)",
"damageType": "Damage Type",
"piercing": "Piercing (P)",
"bludgeoning": "Bludgeoning (B)",
"slashing": "Slashing (S)",
"isProjectile": "Is Projectile?",
"range": "Range",
"reloadAPC": "Reload APC",
"bonuses": "Bonuses",
"groupPassive": "Weapon Group Passive",
"groupPassiveName": "Group Passive Name",
"weaponPassive": "Weapon Passive",
"weaponManeuver": "Weapon Maneuver",
"maneuverName": "Maneuver Name",
"maneuverDescription": "Maneuver Description",
"weaponAugment": "Weapon Augment",
"shieldType": "Shield Type",
"blockAPC": "Block APC",
"shieldRating": "Shield Rating (SR)",
"defenseBonus": "Defense Bonus",
"blockAugment": "Block Augment",
"blockAugmentName": "Block Augment Name",
"blockAugmentDescription": "Block Augment Description",
"shieldAugment": "Shield Augment",
"manaCost": "Mana Cost",
"manaUpkeep": "Mana Upkeep",
"prismColor": "Prism Color",
"colorEffect": "Color Effect",
"spellAscension": "Spell Ascension",
"canAscend": "Can Ascend?",
"ascensionEffect": "Ascension Effect",
"components": "Components",
"verbal": "Verbal",
"somatic": "Somatic",
"material": "Material",
"catalyst": "Catalyst",
"religious": "Religious",
"materialComponent": "Material Component",
"catalystDetails": "Catalyst Details",
"memorized": "Memorized?",
"castingTime": "Casting Time",
"areaAffected": "Area Affected",
"savingThrow": "Saving Throw",
"keywords": "Keywords",
"miracleType": "Miracle Type",
"faithCost": "Faith Cost",
"divineFavor": "Divine Favor",
"miracleAugment": "Miracle Augment",
"prayerTime": "Prayer Time"
},
"CoreSkill": {
"acrobatics": "Acrobatics",
"animalHandling": "Animal Handling",
"arcana": "Arcana",
"athletics": "Athletics",
"deception": "Deception",
"history": "History",
"insight": "Insight",
"intimidation": "Intimidation",
"investigation": "Investigation",
"medicine": "Medicine",
"nature": "Nature",
"perception": "Perception",
"performance": "Performance",
"persuasion": "Persuasion",
"religion": "Religion",
"sleightOfHand": "Sleight of Hand",
"stealth": "Stealth",
"survival": "Survival"
},
"SubAttribute": {
"prowess": "Prowess",
"vigor": "Vigor",
"competence": "Competence",
"authority": "Authority",
"presence": "Presence",
"stamina": "Stamina",
"wit": "Wit",
"grace": "Grace",
"tenacity": "Tenacity",
"willpower": "Willpower",
"resilience": "Resilience",
"cunning": "Cunning",
"guile": "Guile",
"sovereignty": "Sovereignty",
"prowessDesc": "Physical power and combat capability (STR+DEX)",
"vigorDesc": "Endurance and physical resilience (STR+CON)",
"competenceDesc": "Practical application of knowledge (STR+INT)",
"authorityDesc": "Command and leadership presence (STR+WIS)",
"presenceDesc": "Physical charisma and intimidation (STR+CHA)",
"staminaDesc": "Athletic endurance (DEX+CON)",
"initiativeDesc": "Reaction speed and alertness (DEX+INT)",
"witDesc": "Mental agility and cleverness (DEX+WIS)",
"graceDesc": "Social finesse and charm (DEX+CHA)",
"tenacityDesc": "Mental and physical toughness (CON+INT)",
"willpowerDesc": "Inner strength and determination (CON+WIS)",
"resilienceDesc": "Ability to endure hardship (CON+CHA)",
"cunningDesc": "Strategic thinking (INT+WIS)",
"guileDesc": "Deceptive intellect (INT+CHA)",
"sovereigntyDesc": "Diplomatic wisdom and influence (WIS+CHA)"
},
"ArmorType": {
"light": "Light Armor",
"medium": "Medium Armor",
"heavy": "Heavy Armor"
},
"WeaponGroup": {
"longsword": "Longsword",
"warhammer": "Warhammer",
"battleaxe": "Battleaxe",
"dagger": "Dagger",
"crossbow": "Crossbow",
"longbow": "Longbow"
},
"WeaponGroupPassive": {
"longsword": "Turning Edge: +1 AC when wielding longsword",
"warhammer": "Puncturing Blows: Ignore 2 points of armor",
"battleaxe": "Shield Eater: Break shields on critical hits",
"dagger": "Balancing Stance: Can use DEX for attack/damage",
"crossbow": "Boltlock: Advantage on first shot if not moved",
"longbow": "Volley Fire: Can shoot twice with disadvantage"
},
"ShieldType": {
"buckler": "Buckler (1d4, 1 APC)",
"light": "Light Shield (1d8, 2 APC)",
"heavy": "Heavy Shield (1d12, 3 APC)",
"tower": "Tower Shield (3d6, 4 APC)"
},
"SpellColor": {
"indigo": "Indigo",
"blue": "Blue",
"green": "Green",
"yellow": "Yellow",
"orange": "Orange",
"red": "Red",
"violet": "Violet"
},
"Hint": {
"isCoreSkill": "Check this if this is your character's chosen Core Skill",
"attributeBonus": "Choose which attribute receives the +2 bonus",
"advancedChecks": "Only Core Skills allow advanced checks",
"spellAscension": "Spell Ascension increases mana cost and APC by +1 per level",
"groupPassive": "Passive ability from weapon group (auto-filled)"
},
"Tooltip": {
"coreSkill": "Your character's chosen Core Skill provides +5 to basic checks and access to advanced checks",
"coreSkills": "List of all 18 available Core Skills in Prism RPG",
"advancedChecks": "Advanced checks are only available for your Core Skill",
"addEquipment": "New equipment",
"addSpell": "New spells",
"skill": "Skills list"
},
"Message": {
"selectCoreSkill": "You must select a Core Skill for your character. Each character chooses one Core Skill at creation."
}, },
"Miracle": { "Miracle": {
"FIELDS": { "FIELDS": {
"miracleType": { "miracleType": {
"label": "Miracle Type" "label": "Miracle Type"
}, },
"attackRoll": { "apc": {
"label": "Attack roll" "label": "APC (Action Point Cost)"
}, },
"powerRoll": { "faithCost": {
"label": "Power roll" "label": "Faith Cost"
},
"divineFavor": {
"label": "Divine Favor"
},
"augment": {
"label": "Miracle Augment"
},
"augmentDescription": {
"label": "Augment Description"
}, },
"materialComponent": { "materialComponent": {
"label": "Material component" "label": "Material Component"
}, },
"catalyst": { "catalyst": {
"label": "Catalyst" "label": "Catalyst"
}, },
"areaAffected": { "areaAffected": {
"label": "Area affected" "label": "Area Affected"
}, },
"components": { "components": {
"catalyst": { "catalyst": {
@@ -473,10 +701,10 @@
"label": "Range" "label": "Range"
}, },
"prayerTime": { "prayerTime": {
"label": "Prayer time" "label": "Prayer Time"
}, },
"savingThrow": { "savingThrow": {
"label": "Saving throw" "label": "Saving Throw"
} }
} }
}, },
@@ -530,71 +758,48 @@
"fortuneHint": "Valeur de la roue de Fortune. Nombre de joueurs + 1 en début de partie." "fortuneHint": "Valeur de la roue de Fortune. Nombre de joueurs + 1 en début de partie."
}, },
"Shield": { "Shield": {
"Type": {
"buckler": "Buckler",
"light": "Light Shield",
"heavy": "Heavy Shield",
"tower": "Tower Shield"
},
"FIELDS": { "FIELDS": {
"autodestruction": { "shieldType": {
"bashing": { "label": "Shield Type"
"label": "Bashing"
}, },
"piercing": { "apc": {
"label": "Piercing" "label": "Block APC"
}, },
"slashing": { "sr": {
"label": "Slashing" "label": "Shield Rating (SR)"
} },
"blockAugment": {
"label": "Block Augment"
},
"blockAugmentDescription": {
"label": "Block Augment Description"
},
"augment": {
"label": "Shield Augment"
},
"augmentDescription": {
"label": "Augment Description"
}, },
"cost": { "cost": {
"label": "Cost" "label": "Cost"
}, },
"crouching": {
"max": {
"label": "Max"
},
"min": {
"label": "Min"
}
},
"damagereduction": {
"label": "Damage reduction"
},
"defense": { "defense": {
"label": "Defense" "label": "Defense Bonus"
},
"destruction": {
"bashing": {
"label": "Bashing"
},
"piercing": {
"label": "Piercing"
},
"slashing": {
"label": "Slashing"
}
}, },
"encLoad": { "encLoad": {
"label": "Load" "label": "Encumbrance Load"
}, },
"equipped": { "equipped": {
"label": "Equipped" "label": "Equipped"
}, },
"hascover": {
"label": "Provides cover"
},
"hp": {
"label": "HP"
},
"money": { "money": {
"label": "Money unit" "label": "Currency"
},
"movementreduction": {
"label": "Movement reduction"
},
"standing": {
"max": {
"label": "Max"
},
"min": {
"label": "Min"
}
} }
} }
}, },
@@ -607,70 +812,72 @@
"weapon": "Weapon" "weapon": "Weapon"
}, },
"FIELDS": { "FIELDS": {
"base": { "coreSkill": {
"label": "Base" "label": "Core Skill Type"
}, },
"bonus": { "isCoreSkill": {
"label": "Bonus" "label": "Is Character's Core Skill?"
}, },
"category": { "attributeBonus": {
"label": "Category" "label": "Attribute Bonus (+2)"
}, },
"cost": { "modifier": {
"label": "Cost" "label": "Skill Modifier"
}, },
"classesCost": { "canAdvancedCheck": {
"fighter": { "label": "Can Perform Advanced Checks"
"label": "Fighter Cost"
}, },
"rogue": { "coreSkillClass": {
"label": "Rogue Cost" "label": "Core Skill Class"
}, },
"ranger": { "notes": {
"label": "Ranger Cost" "label": "Notes"
},
"magicuser": {
"label": "Magic User Cost"
},
"cleric": {
"label": "Cleric Cost"
}
}, },
"description": { "description": {
"label": "Description" "label": "Description"
},
"weaponBonus": {
"attack": {
"label": "Attack Bonus"
},
"damage": {
"label": "Damage Bonus"
},
"defense": {
"label": "Defense Bonus"
}
},
"weaponClass": {
"label": "Class"
} }
} }
}, },
"Spell": { "Spell": {
"Color": {
"indigo": "Indigo",
"blue": "Blue",
"green": "Green",
"yellow": "Yellow",
"orange": "Orange",
"red": "Red",
"violet": "Violet"
},
"FIELDS": { "FIELDS": {
"criticalType": { "manaCost": {
"label": "Crit. Type" "label": "Mana Cost"
}, },
"attackRoll": { "manaUpkeep": {
"label": "Attack roll" "label": "Mana Upkeep"
}, },
"powerRoll": { "apc": {
"label": "Power roll" "label": "APC (Action Point Cost)"
},
"color": {
"label": "Prism Color"
},
"colorEffect": {
"label": "Color Effect"
},
"canAscend": {
"label": "Can Use Spell Ascension?"
},
"ascensionEffect": {
"label": "Ascension Effect"
},
"keywords": {
"label": "Keywords"
}, },
"areaAffected": { "areaAffected": {
"label": "Area affected" "label": "Area Affected"
}, },
"castingTime": { "castingTime": {
"label": "Casting time" "label": "Casting Time"
}, },
"components": { "components": {
"material": { "material": {
@@ -698,20 +905,17 @@
"duration": { "duration": {
"label": "Duration" "label": "Duration"
}, },
"extraAetherPoints": {
"label": "Extra aether points"
},
"level": { "level": {
"label": "Level" "label": "Level"
}, },
"savingThrow": { "savingThrow": {
"label": "Saving throw" "label": "Saving Throw"
}, },
"spellRange": { "spellRange": {
"label": "Range" "label": "Range"
}, },
"materialComponent": { "materialComponent": {
"label": "Material component" "label": "Material Component"
}, },
"catalyst": { "catalyst": {
"label": "Catalyst" "label": "Catalyst"
@@ -719,11 +923,6 @@
} }
}, },
"ToggleSheet": "Toggle mode", "ToggleSheet": "Toggle mode",
"Tooltip": {
"addEquipment": "New equipment",
"addSpell": "New spells",
"skill": "Skills list"
},
"Vulnerability": { "Vulnerability": {
"FIELDS": { "FIELDS": {
"cost": { "cost": {
@@ -739,27 +938,41 @@
}, },
"Warning": {}, "Warning": {},
"Weapon": { "Weapon": {
"Type": {
"light": "Light Weapon",
"oneHanded": "One-Handed Weapon",
"heavy": "Heavy Weapon",
"projectile": "Projectile Weapon"
},
"Group": {
"longsword": "Longsword",
"warhammer": "Warhammer",
"battleaxe": "Battleaxe",
"dagger": "Dagger",
"crossbow": "Crossbow",
"longbow": "Longbow"
},
"DamageType": {
"piercing": "Piercing",
"bludgeoning": "Bludgeoning",
"slashing": "Slashing"
},
"FIELDS": { "FIELDS": {
"isAgile": { "weaponType": {
"label": "Is Agile?" "label": "Weapon Type"
}, },
"combatProgressionDice": { "weaponGroup": {
"label": "Combat progression dice" "label": "Weapon Group"
}, },
"cost": { "apc": {
"label": "Cost" "label": "APC (Action Point Cost)"
}, },
"damage": { "damage": {
"damageM": { "label": "Damage"
"label": "Medium"
},
"damageS": {
"label": "Small"
}
}, },
"damageType": { "damageType": {
"typeB": { "typeB": {
"label": "Bashing" "label": "Bludgeoning"
}, },
"typeP": { "typeP": {
"label": "Piercing" "label": "Piercing"
@@ -768,40 +981,53 @@
"label": "Slashing" "label": "Slashing"
} }
}, },
"defense": { "groupPassive": {
"label": "Defense" "label": "Group Passive"
}, },
"defenseMax": { "passive": {
"label": "Defense max" "label": "Weapon Passive"
},
"passiveDescription": {
"label": "Passive Description"
},
"maneuver": {
"label": "Weapon Maneuver"
},
"maneuverDescription": {
"label": "Maneuver Description"
},
"augment": {
"label": "Weapon Augment"
},
"augmentDescription": {
"label": "Augment Description"
},
"isProjectile": {
"label": "Is Projectile?"
},
"range": {
"label": "Range"
},
"reloadAPC": {
"label": "Reload APC"
},
"cost": {
"label": "Cost"
}, },
"encLoad": { "encLoad": {
"label": "Load" "label": "Encumbrance Load"
}, },
"equipped": { "equipped": {
"label": "Equipped" "label": "Equipped"
}, },
"hands": { "hands": {
"label": "Hands" "label": "Hands Required"
}, },
"money": { "money": {
"label": "Money unit" "label": "Currency"
},
"secondsToAttack": {
"label": "Seconds to attack"
},
"speed": {
"carefulAim": {
"label": "Careful aim"
},
"focusedAim": {
"label": "Focused aim"
},
"simpleAim": {
"label": "Simple aim"
}
}, },
"applyStrengthDamageBonus": { "applyStrengthDamageBonus": {
"label": "Apply strength damage bonus" "label": "Apply Strength Damage Bonus"
}, },
"bonuses": { "bonuses": {
"attackBonus": { "attackBonus": {
@@ -813,48 +1039,7 @@
"defenseBonus": { "defenseBonus": {
"label": "Defense Bonus" "label": "Defense Bonus"
} }
},
"weaponRange": {
"extreme": {
"label": "Extreme"
},
"long": {
"label": "Long"
},
"medium": {
"label": "Medium"
},
"outOfSkill": {
"label": "Out of skill"
},
"pointBlank": {
"label": "Point blank"
},
"short": {
"label": "Short"
} }
},
"weaponType": {
"label": "Type"
}
},
"WeaponClass": {
"axe": "Axe",
"bow": "Bow",
"flail": "Flail",
"hammer": "Hammer",
"longblade": "Long blade",
"mace": "Mace",
"mediumblade": "Medium blade",
"polearm": "Polearm",
"shortblade": "Short blade",
"sling": "Sling",
"thrown": "Thrown",
"unarmed": "Unarmed"
},
"WeaponType": {
"melee": "Melee",
"ranged": "Ranged"
} }
} }
}, },
+41 -1
View File
@@ -1,5 +1,45 @@
export const TYPE = Object.freeze({ export const TYPE = Object.freeze({
light: { id: "light", label: "PRISMRPG.Armor.Category.light" }, light: { id: "light", label: "PRISMRPG.Armor.Category.light" },
medium: { id: "medium", label: "PRISMRPG.Armor.Category.medium" }, medium: { id: "medium", label: "PRISMRPG.Armor.Category.medium" },
heavy: { id: "medium", label: "PRISMRPG.Armor.Category.heavy" } heavy: { id: "heavy", label: "PRISMRPG.Armor.Category.heavy" }
})
// Base AC values for armor proficiency levels
export const BASE_AC = Object.freeze({
light: 12, // +Prowess, Competence, or Grace
medium: 14, // +Authority, Cunning, or Resilience
heavy: 16 // +Presence, Tenacity, or Willpower
})
// AC bonus sub-attributes for each armor type
export const AC_BONUS_ATTRIBUTES = Object.freeze({
light: ["prowess", "competence", "grace"],
medium: ["authority", "cunning", "resilience"],
heavy: ["presence", "tenacity", "willpower"]
})
// Withstand action APC cost for each armor type
export const WITHSTAND_APC = Object.freeze({
light: 1,
medium: 2,
heavy: 3
})
// Armor set composition requirements
export const SET_REQUIREMENTS = Object.freeze({
light: {
light: 2,
medium: 0,
heavy: 0
},
medium: {
light: 3,
medium: 1,
heavy: 0
},
heavy: {
light: 3,
medium: 2,
heavy: 1
}
}) })
+101 -15
View File
@@ -1,15 +1,7 @@
export const CHARACTERISTICS = Object.freeze({ export const CHARACTERISTICS = Object.freeze({
str: { str: {
id: "str", id: "str",
label: "PRISMRPG.Label.str" label: "PRISMRPG.Character.str.label"
},
int: {
id: "int",
label: "PRISMRPG.Character.int.label"
},
wis: {
id: "wis",
label: "PRISMRPG.Character.wis.label"
}, },
dex: { dex: {
id: "dex", id: "dex",
@@ -19,18 +11,112 @@ export const CHARACTERISTICS = Object.freeze({
id: "con", id: "con",
label: "PRISMRPG.Character.con.label" label: "PRISMRPG.Character.con.label"
}, },
int: {
id: "int",
label: "PRISMRPG.Character.int.label"
},
wis: {
id: "wis",
label: "PRISMRPG.Character.wis.label"
},
cha: { cha: {
id: "cha", id: "cha",
label: "PRISMRPG.Character.cha.label" label: "PRISMRPG.Character.cha.label"
}
})
// Sub-Attributes derived from combinations of two main attributes
export const SUB_ATTRIBUTES = Object.freeze({
prowess: {
id: "prowess",
label: "PRISMRPG.Character.prowess.label",
parents: ["str", "dex"],
description: "PRISMRPG.Character.prowess.description"
}, },
luc: { vigor: {
id: "luc", id: "vigor",
label: "PRISMRPG.Character.luc.label" label: "PRISMRPG.Character.vigor.label",
parents: ["str", "con"],
description: "PRISMRPG.Character.vigor.description"
}, },
app: { competence: {
id: "app", id: "competence",
label: "PRISMRPG.Character.app.label" label: "PRISMRPG.Character.competence.label",
parents: ["str", "int"],
description: "PRISMRPG.Character.competence.description"
}, },
authority: {
id: "authority",
label: "PRISMRPG.Character.authority.label",
parents: ["str", "wis"],
description: "PRISMRPG.Character.authority.description"
},
presence: {
id: "presence",
label: "PRISMRPG.Character.presence.label",
parents: ["str", "cha"],
description: "PRISMRPG.Character.presence.description"
},
stamina: {
id: "stamina",
label: "PRISMRPG.Character.stamina.label",
parents: ["dex", "con"],
description: "PRISMRPG.Character.stamina.description"
},
initiative: {
id: "initiative",
label: "PRISMRPG.Character.initiative.label",
parents: ["dex", "int"],
description: "PRISMRPG.Character.initiative.description"
},
wit: {
id: "wit",
label: "PRISMRPG.Character.wit.label",
parents: ["dex", "wis"],
description: "PRISMRPG.Character.wit.description"
},
grace: {
id: "grace",
label: "PRISMRPG.Character.grace.label",
parents: ["dex", "cha"],
description: "PRISMRPG.Character.grace.description"
},
tenacity: {
id: "tenacity",
label: "PRISMRPG.Character.tenacity.label",
parents: ["con", "int"],
description: "PRISMRPG.Character.tenacity.description"
},
willpower: {
id: "willpower",
label: "PRISMRPG.Character.willpower.label",
parents: ["con", "wis"],
description: "PRISMRPG.Character.willpower.description"
},
resilience: {
id: "resilience",
label: "PRISMRPG.Character.resilience.label",
parents: ["con", "cha"],
description: "PRISMRPG.Character.resilience.description"
},
cunning: {
id: "cunning",
label: "PRISMRPG.Character.cunning.label",
parents: ["int", "wis"],
description: "PRISMRPG.Character.cunning.description"
},
guile: {
id: "guile",
label: "PRISMRPG.Character.guile.label",
parents: ["int", "cha"],
description: "PRISMRPG.Character.guile.description"
},
sovereignty: {
id: "sovereignty",
label: "PRISMRPG.Character.sovereignty.label",
parents: ["wis", "cha"],
description: "PRISMRPG.Character.sovereignty.description"
}
}) })
export const CHALLENGES = Object.freeze({ export const CHALLENGES = Object.freeze({
+50
View File
@@ -0,0 +1,50 @@
/**
* Shield types based on Prism RPG rules
* Shields prevent damage equal to their Shield Rating (SR)
* Each shield has a Block APC and a Block Augment passive ability
*/
export const TYPE = Object.freeze({
buckler: {
id: "buckler",
label: "PRISMRPG.Shield.Type.buckler",
apc: 1,
sr: "1d4",
blockAugment: "PRISMRPG.Shield.BlockAugment.buckler",
blockAugmentDescription: "PRISMRPG.Shield.BlockAugmentDescription.buckler"
},
light: {
id: "light",
label: "PRISMRPG.Shield.Type.light",
apc: 2,
sr: "1d8",
blockAugment: "PRISMRPG.Shield.BlockAugment.light",
blockAugmentDescription: "PRISMRPG.Shield.BlockAugmentDescription.light"
},
heavy: {
id: "heavy",
label: "PRISMRPG.Shield.Type.heavy",
apc: 3,
sr: "1d12",
blockAugment: "PRISMRPG.Shield.BlockAugment.heavy",
blockAugmentDescription: "PRISMRPG.Shield.BlockAugmentDescription.heavy"
},
tower: {
id: "tower",
label: "PRISMRPG.Shield.Type.tower",
apc: 4,
sr: "3d6",
blockAugment: "PRISMRPG.Shield.BlockAugment.tower",
blockAugmentDescription: "PRISMRPG.Shield.BlockAugmentDescription.tower"
}
});
/**
* Block augment descriptions for reference
* These are activated when using the Block action with the shield
*/
export const BLOCK_AUGMENTS = Object.freeze({
buckler: "If the character should successfully block damage with this shield, the character reduces the cost of the next Parry action by an amount equal to their Prowess.",
light: "If the character would successfully block damage with this shield, the character may move an amount equal to their movement rating.",
heavy: "If the character would successfully block damage with this shield, they reduce the APC of the next attack they make by an amount equal to their Vigor or Prowess.",
tower: "If the character would successfully block damage with this shield, for 1 round they are considered cover for themselves and allies that are adjacent to them."
});
+112
View File
@@ -1,3 +1,115 @@
/**
* Core Skills in Prism RPG
* Characters choose 1 Core Skill which gives:
* - +5 bonus to basic skill checks
* - Access to advanced skill checks
* - Access to a Core Skill Class (based on archetype)
* - +2 to one of 3 associated attributes
*/
export const CORE_SKILLS = Object.freeze({
acrobatics: {
id: "acrobatics",
label: "PRISMRPG.Skill.CoreSkill.acrobatics",
attributeChoices: ["dex", "wis", "con"]
},
animalHandling: {
id: "animalHandling",
label: "PRISMRPG.Skill.CoreSkill.animalHandling",
attributeChoices: ["str", "con", "dex"]
},
arcana: {
id: "arcana",
label: "PRISMRPG.Skill.CoreSkill.arcana",
attributeChoices: ["str", "int", "wis"]
},
athletics: {
id: "athletics",
label: "PRISMRPG.Skill.CoreSkill.athletics",
attributeChoices: ["str", "dex", "con"]
},
deception: {
id: "deception",
label: "PRISMRPG.Skill.CoreSkill.deception",
attributeChoices: ["int", "wis", "cha"]
},
history: {
id: "history",
label: "PRISMRPG.Skill.CoreSkill.history",
attributeChoices: ["str", "wis", "con"]
},
insight: {
id: "insight",
label: "PRISMRPG.Skill.CoreSkill.insight",
attributeChoices: ["int", "cha", "wis"]
},
intimidate: {
id: "intimidate",
label: "PRISMRPG.Skill.CoreSkill.intimidate",
attributeChoices: ["str", "cha", "wis"]
},
investigation: {
id: "investigation",
label: "PRISMRPG.Skill.CoreSkill.investigation",
attributeChoices: ["int", "wis", "con"]
},
medicine: {
id: "medicine",
label: "PRISMRPG.Skill.CoreSkill.medicine",
attributeChoices: ["con", "wis", "int"]
},
nature: {
id: "nature",
label: "PRISMRPG.Skill.CoreSkill.nature",
attributeChoices: ["str", "wis", "int"]
},
perception: {
id: "perception",
label: "PRISMRPG.Skill.CoreSkill.perception",
attributeChoices: ["dex", "wis", "cha"]
},
performance: {
id: "performance",
label: "PRISMRPG.Skill.CoreSkill.performance",
attributeChoices: ["str", "cha", "wis"]
},
persuasion: {
id: "persuasion",
label: "PRISMRPG.Skill.CoreSkill.persuasion",
attributeChoices: ["cha", "dex", "int"]
},
religion: {
id: "religion",
label: "PRISMRPG.Skill.CoreSkill.religion",
attributeChoices: ["str", "wis", "cha"]
},
sleightOfHand: {
id: "sleightOfHand",
label: "PRISMRPG.Skill.CoreSkill.sleightOfHand",
attributeChoices: ["dex", "wis", "int"]
},
stealth: {
id: "stealth",
label: "PRISMRPG.Skill.CoreSkill.stealth",
attributeChoices: ["int", "dex", "cha"]
},
survival: {
id: "survival",
label: "PRISMRPG.Skill.CoreSkill.survival",
attributeChoices: ["int", "con", "cha"]
}
});
/**
* Core Skill bonus values
*/
export const CORE_SKILL_BONUS = Object.freeze({
basic: 5, // +5 to basic skill checks
attributeBonus: 2 // +2 to chosen attribute
});
/**
* Legacy skill categories (may be deprecated)
*/
export const CATEGORY = Object.freeze({ export const CATEGORY = Object.freeze({
layperson: { layperson: {
id: "layperson", id: "layperson",
+45
View File
@@ -1,3 +1,48 @@
/**
* Spell colors from the Prism
* Each color gives a different effect to spells
*/
export const COLORS = Object.freeze({
indigo: {
id: "indigo",
label: "PRISMRPG.Spell.Color.indigo",
description: "PRISMRPG.Spell.ColorEffect.indigo"
},
blue: {
id: "blue",
label: "PRISMRPG.Spell.Color.blue",
description: "PRISMRPG.Spell.ColorEffect.blue"
},
green: {
id: "green",
label: "PRISMRPG.Spell.Color.green",
description: "PRISMRPG.Spell.ColorEffect.green"
},
yellow: {
id: "yellow",
label: "PRISMRPG.Spell.Color.yellow",
description: "PRISMRPG.Spell.ColorEffect.yellow"
},
orange: {
id: "orange",
label: "PRISMRPG.Spell.Color.orange",
description: "PRISMRPG.Spell.ColorEffect.orange"
},
red: {
id: "red",
label: "PRISMRPG.Spell.Color.red",
description: "PRISMRPG.Spell.ColorEffect.red"
},
violet: {
id: "violet",
label: "PRISMRPG.Spell.Color.violet",
description: "PRISMRPG.Spell.ColorEffect.violet"
}
});
/**
* Spell ranges (legacy - to be replaced with Prism system)
*/
export const RANGE = Object.freeze({ export const RANGE = Object.freeze({
na: { na: {
id: "na", id: "na",
+14 -1
View File
@@ -1,6 +1,7 @@
import * as CHARACTER from "./character.mjs" import * as CHARACTER from "./character.mjs"
import * as WEAPON from "./weapon.mjs" import * as WEAPON from "./weapon.mjs"
import * as ARMOR from "./armor.mjs" import * as ARMOR from "./armor.mjs"
import * as SHIELD from "./shield.mjs"
import * as SPELL from "./spell.mjs" import * as SPELL from "./spell.mjs"
import * as SKILL from "./skill.mjs" import * as SKILL from "./skill.mjs"
import * as EQUIPMENT from "./equipment.mjs" import * as EQUIPMENT from "./equipment.mjs"
@@ -285,6 +286,7 @@ export const ASCII = `
export const SYSTEM = { export const SYSTEM = {
id: SYSTEM_ID, id: SYSTEM_ID,
CHARACTERISTICS: CHARACTER.CHARACTERISTICS, CHARACTERISTICS: CHARACTER.CHARACTERISTICS,
SUB_ATTRIBUTES: CHARACTER.SUB_ATTRIBUTES,
CHARACTERISTICS_TABLES: CHARACTERISTICS.TABLES, CHARACTERISTICS_TABLES: CHARACTERISTICS.TABLES,
CHARACTERISTICS_MAJOR: CHARACTERISTICS.MAJOR, CHARACTERISTICS_MAJOR: CHARACTERISTICS.MAJOR,
MONSTER_CHARACTERISTICS: MONSTER.MONSTER_CHARACTERISTICS, MONSTER_CHARACTERISTICS: MONSTER.MONSTER_CHARACTERISTICS,
@@ -293,10 +295,21 @@ export const SYSTEM = {
SAVES: CHARACTER.SAVES, SAVES: CHARACTER.SAVES,
CHALLENGES: CHARACTER.CHALLENGES, CHALLENGES: CHARACTER.CHALLENGES,
SKILL_CATEGORY: SKILL.CATEGORY, SKILL_CATEGORY: SKILL.CATEGORY,
CORE_SKILLS: SKILL.CORE_SKILLS,
CORE_SKILL_BONUS: SKILL.CORE_SKILL_BONUS,
ARMOR_TYPE: ARMOR.TYPE, ARMOR_TYPE: ARMOR.TYPE,
ARMOR_BASE_AC: ARMOR.BASE_AC,
ARMOR_AC_BONUS_ATTRIBUTES: ARMOR.AC_BONUS_ATTRIBUTES,
ARMOR_WITHSTAND_APC: ARMOR.WITHSTAND_APC,
ARMOR_SET_REQUIREMENTS: ARMOR.SET_REQUIREMENTS,
SHIELD_TYPE: SHIELD.TYPE,
SHIELD_BLOCK_AUGMENTS: SHIELD.BLOCK_AUGMENTS,
EQUIPMENT_CATEGORY: EQUIPMENT.CATEGORY, EQUIPMENT_CATEGORY: EQUIPMENT.CATEGORY,
SPELL_RANGE: SPELL.RANGE, SPELL_RANGE: SPELL.RANGE,
WEAPON_TYPE: WEAPON.WEAPON_TYPE, SPELL_COLORS: SPELL.COLORS,
WEAPON_TYPE: WEAPON.TYPE,
WEAPON_GROUP: WEAPON.WEAPON_GROUP,
WEAPON_DAMAGE_TYPE: WEAPON.DAMAGE_TYPE,
WEAPON_CLASS: WEAPON.WEAPON_CLASS, WEAPON_CLASS: WEAPON.WEAPON_CLASS,
COMBAT_PROGRESSION_DICE: DICE_VALUES, COMBAT_PROGRESSION_DICE: DICE_VALUES,
SHIELD_DEFENSE_DICE: DEFENSE_DICE_VALUES, SHIELD_DEFENSE_DICE: DEFENSE_DICE_VALUES,
+101 -1
View File
@@ -1,4 +1,105 @@
/**
* Weapon types based on Prism RPG rules
* APC determines weapon class: Light (1 APC), One-Handed (2 APC), Heavy (3 APC)
*/
export const TYPE = Object.freeze({
light: {
id: "light",
label: "PRISMRPG.Weapon.Type.light",
apc: 1,
hands: 1
},
oneHanded: {
id: "oneHanded",
label: "PRISMRPG.Weapon.Type.oneHanded",
apc: 2,
hands: 1
},
heavy: {
id: "heavy",
label: "PRISMRPG.Weapon.Type.heavy",
apc: 3,
hands: 2
},
projectile: {
id: "projectile",
label: "PRISMRPG.Weapon.Type.projectile",
apc: 0, // Variable based on specific weapon
hands: 2
}
});
/**
* Weapon groups and their associated passives
* Each weapon belongs to a group and possesses its passive while wielded
*/
export const WEAPON_GROUP = Object.freeze({
longsword: {
id: "longsword",
label: "PRISMRPG.Weapon.WeaponGroup.longsword",
passive: "turningEdge",
passiveLabel: "PRISMRPG.Weapon.Passive.turningEdge",
passiveDescription: "PRISMRPG.Weapon.PassiveDescription.turningEdge"
},
warhammer: {
id: "warhammer",
label: "PRISMRPG.Weapon.WeaponGroup.warhammer",
passive: "puncturingBlows",
passiveLabel: "PRISMRPG.Weapon.Passive.puncturingBlows",
passiveDescription: "PRISMRPG.Weapon.PassiveDescription.puncturingBlows"
},
battleaxe: {
id: "battleaxe",
label: "PRISMRPG.Weapon.WeaponGroup.battleaxe",
passive: "shieldEater",
passiveLabel: "PRISMRPG.Weapon.Passive.shieldEater",
passiveDescription: "PRISMRPG.Weapon.PassiveDescription.shieldEater"
},
dagger: {
id: "dagger",
label: "PRISMRPG.Weapon.WeaponGroup.dagger",
passive: "balancingStance",
passiveLabel: "PRISMRPG.Weapon.Passive.balancingStance",
passiveDescription: "PRISMRPG.Weapon.PassiveDescription.balancingStance"
},
crossbow: {
id: "crossbow",
label: "PRISMRPG.Weapon.WeaponGroup.crossbow",
passive: "boltlock",
passiveLabel: "PRISMRPG.Weapon.Passive.boltlock",
passiveDescription: "PRISMRPG.Weapon.PassiveDescription.boltlock"
},
longbow: {
id: "longbow",
label: "PRISMRPG.Weapon.WeaponGroup.longbow",
passive: "volleyFire",
passiveLabel: "PRISMRPG.Weapon.Passive.volleyFire",
passiveDescription: "PRISMRPG.Weapon.PassiveDescription.volleyFire"
}
});
/**
* Damage types for weapons
*/
export const DAMAGE_TYPE = Object.freeze({
piercing: {
id: "piercing",
label: "PRISMRPG.Weapon.DamageType.piercing",
abbreviation: "P"
},
bludgeoning: {
id: "bludgeoning",
label: "PRISMRPG.Weapon.DamageType.bludgeoning",
abbreviation: "B"
},
slashing: {
id: "slashing",
label: "PRISMRPG.Weapon.DamageType.slashing",
abbreviation: "S"
}
});
// Legacy exports for backward compatibility (to be removed later)
export const WEAPON_TYPE = { export const WEAPON_TYPE = {
"melee": "PRISMRPG.Weapon.WeaponType.melee", "melee": "PRISMRPG.Weapon.WeaponType.melee",
"ranged": "PRISMRPG.Weapon.WeaponType.ranged" "ranged": "PRISMRPG.Weapon.WeaponType.ranged"
@@ -32,4 +133,3 @@ export const WEAPON_CATEGORIES = {
"thrown": ["axe", "hammer", "mace", "flail", "bow", "sling", "polearm"], "thrown": ["axe", "hammer", "mace", "flail", "bow", "sling", "polearm"],
"polearm": ["axe", "hammer", "mace", "flail", "bow", "sling", "thrown"] "polearm": ["axe", "hammer", "mace", "flail", "bow", "sling", "thrown"]
} }
+14 -1
View File
@@ -7,8 +7,21 @@ export default class PrismRPGArmor extends foundry.abstract.TypeDataModel {
schema.description = new fields.HTMLField({ required: true, textSearch: true }) schema.description = new fields.HTMLField({ required: true, textSearch: true })
schema.armorType = new fields.StringField({ required: true, initial: "light", choices: SYSTEM.ARMOR_TYPE }) schema.armorType = new fields.StringField({ required: true, initial: "light", choices: SYSTEM.ARMOR_TYPE })
// MRR - Movement Rating Reduction (reduced by Vigor sub-attribute)
schema.mrr = new fields.NumberField({ ...requiredInteger, required: true, initial: 0, min: 0, label: "Movement Rating Reduction" })
// Armor Passive - the passive ability of this armor piece
schema.passive = new fields.StringField({ required: false, initial: "", label: "Armor Passive" })
schema.passiveDescription = new fields.HTMLField({ required: false, textSearch: true, label: "Passive Description" })
// Armor Augment - the Withstand action effect (requires augment from class feature)
schema.augment = new fields.StringField({ required: false, initial: "", label: "Armor Augment" })
schema.augmentDescription = new fields.HTMLField({ required: false, textSearch: true, label: "Augment Description" })
// Legacy fields for compatibility
schema.defense = new fields.NumberField({ ...requiredInteger, required: true, initial: 0, min: -50 }) schema.defense = new fields.NumberField({ ...requiredInteger, required: true, initial: 0, min: -50 })
schema.maximumMovement = new fields.StringField({ ...requiredInteger, required: true, initial: "" }) schema.maximumMovement = new fields.StringField({ required: false, initial: "" })
schema.hp = new fields.NumberField({ ...requiredInteger, required: true, initial: 0, min: 0 }) schema.hp = new fields.NumberField({ ...requiredInteger, required: true, initial: 0, min: 0 })
schema.damageReduction = new fields.NumberField({ ...requiredInteger, required: true, initial: 0, min: 0 }) schema.damageReduction = new fields.NumberField({ ...requiredInteger, required: true, initial: 0, min: 0 })
+15
View File
@@ -168,6 +168,21 @@ export default class PrismRPGCharacter extends foundry.abstract.TypeDataModel {
}, {}), }, {}),
) )
// Core Skill system (Prism RPG)
schema.coreSkill = new fields.SchemaField({
skill: new fields.StringField({
required: true,
initial: "",
choices: Object.keys(SYSTEM.CORE_SKILLS || {}),
label: "Selected Core Skill"
}),
attributeChoice: new fields.StringField({
required: true,
initial: "",
label: "Attribute Choice for +2 Bonus"
})
})
return schema return schema
} }
+108 -17
View File
@@ -1,4 +1,5 @@
import { SYSTEM } from "../config/system.mjs" import { SYSTEM } from "../config/system.mjs"
export default class PrismRPGMiracle extends foundry.abstract.TypeDataModel { export default class PrismRPGMiracle extends foundry.abstract.TypeDataModel {
static defineSchema() { static defineSchema() {
const fields = foundry.data.fields const fields = foundry.data.fields
@@ -11,30 +12,120 @@ export default class PrismRPGMiracle extends foundry.abstract.TypeDataModel {
initial: "", initial: "",
textSearch: true, textSearch: true,
}) })
// Miracle level (1-7+)
schema.level = new fields.NumberField({ schema.level = new fields.NumberField({
...requiredInteger, ...requiredInteger,
initial: 1, initial: 1,
min: 1, min: 1,
max: 25, max: 25,
}) })
schema.components = new fields.SchemaField({
verbal: new fields.BooleanField(),
somatic: new fields.BooleanField(),
material: new fields.BooleanField(),
catalyst: new fields.BooleanField(),
religious: new fields.BooleanField()
})
schema.prayerTime = new fields.StringField({ required: true, initial: "" })
schema.miracleRange = new fields.StringField({ required: true, initial: "" })
schema.areaAffected = new fields.StringField({ required: true, initial: "" })
schema.duration = new fields.StringField({ required: true, initial: "" })
schema.savingThrow = new fields.StringField({ required: true, initial: "" })
schema.materialComponent = new fields.StringField({ required: true, initial: "" })
schema.catalyst = new fields.StringField({ required: true, initial: "" })
schema.miracleType = new fields.StringField({ required: true, initial: "combat", choices: SYSTEM.MIRACLE_TYPES })
schema.attackRoll = new fields.StringField({ required: true, initial: "" }) // Miracle type
schema.powerRoll = new fields.StringField({ required: true, initial: "" }) schema.miracleType = new fields.StringField({
required: true,
initial: "combat",
choices: SYSTEM.MIRACLE_TYPES
})
// APC to pray
schema.apc = new fields.NumberField({
...requiredInteger,
required: true,
initial: 1,
min: 0,
label: "Action Point Cost"
})
// Faith cost (if applicable in Prism RPG)
schema.faithCost = new fields.NumberField({
...requiredInteger,
required: true,
initial: 0,
min: 0,
label: "Faith Cost"
})
// Divine favor required
schema.divineFavor = new fields.StringField({
required: true,
initial: "",
label: "Divine Favor"
})
// Components (Miracles have 'religious' component)
schema.components = new fields.SchemaField({
verbal: new fields.BooleanField({ initial: false }),
somatic: new fields.BooleanField({ initial: false }),
material: new fields.BooleanField({ initial: false }),
catalyst: new fields.BooleanField({ initial: false }),
religious: new fields.BooleanField({ initial: true })
})
schema.materialComponent = new fields.StringField({
required: true,
initial: ""
})
schema.catalyst = new fields.StringField({
required: true,
initial: ""
})
// Prayer parameters
schema.prayerTime = new fields.StringField({
required: true,
initial: "1 action"
})
schema.miracleRange = new fields.StringField({
required: true,
initial: "Touch"
})
schema.areaAffected = new fields.StringField({
required: true,
initial: "Single target"
})
schema.duration = new fields.StringField({
required: true,
initial: "Instantaneous"
})
schema.savingThrow = new fields.StringField({
required: true,
initial: ""
})
// Attack and power
schema.attackRoll = new fields.StringField({
required: true,
initial: ""
})
schema.powerRoll = new fields.StringField({
required: true,
initial: ""
})
// Keywords
schema.keywords = new fields.ArrayField(
new fields.StringField()
)
// Miracle augment (if applicable)
schema.augment = new fields.StringField({
required: true,
initial: "",
label: "Miracle Augment"
})
schema.augmentDescription = new fields.HTMLField({
required: true,
initial: "",
label: "Augment Description"
})
return schema return schema
} }
+72 -4
View File
@@ -1,4 +1,5 @@
import { SYSTEM } from "../config/system.mjs" import { SYSTEM } from "../config/system.mjs"
export default class PrismRPGShield extends foundry.abstract.TypeDataModel { export default class PrismRPGShield extends foundry.abstract.TypeDataModel {
static defineSchema() { static defineSchema() {
const fields = foundry.data.fields const fields = foundry.data.fields
@@ -6,14 +7,81 @@ export default class PrismRPGShield extends foundry.abstract.TypeDataModel {
const requiredInteger = { required: true, nullable: false, integer: true } const requiredInteger = { required: true, nullable: false, integer: true }
schema.description = new fields.HTMLField({ required: true, textSearch: true }) schema.description = new fields.HTMLField({ required: true, textSearch: true })
schema.defense = new fields.StringField({required: true, initial: "d4", choices: SYSTEM.SHIELD_DEFENSE_DICE})
schema.movementreduction = new fields.NumberField({ ...requiredInteger, required: true, initial: 0, min: 0 }) // Prism RPG shield properties
schema.hascover = new fields.BooleanField({ required: true, initial: false }) schema.shieldType = new fields.StringField({
required: true,
initial: "buckler",
choices: Object.keys(SYSTEM.SHIELD_TYPE || {})
})
// APC (Action Point Cost) for Block action
schema.apc = new fields.NumberField({
...requiredInteger,
required: true,
initial: 1,
min: 1,
max: 4,
label: "Block APC"
})
// Shield Rating (SR) - damage prevention dice (e.g., "1d4", "1d8", "1d12", "3d6")
schema.sr = new fields.StringField({
required: true,
initial: "1d4",
label: "Shield Rating (SR)"
})
// Block Augment - passive ability when using Block action
schema.blockAugment = new fields.StringField({
required: true,
initial: "",
label: "Block Augment"
})
schema.blockAugmentDescription = new fields.HTMLField({
required: true,
initial: "",
label: "Block Augment Description"
})
// Augment effects (for equipment progression)
schema.augment = new fields.StringField({
required: true,
initial: "",
label: "Shield Augment"
})
schema.augmentDescription = new fields.HTMLField({
required: true,
initial: "",
label: "Augment Description"
})
// Legacy properties (kept for backward compatibility)
schema.defense = new fields.StringField({
required: true,
initial: "d4",
choices: SYSTEM.SHIELD_DEFENSE_DICE
})
schema.movementreduction = new fields.NumberField({
...requiredInteger,
required: true,
initial: 0,
min: 0
})
schema.hascover = new fields.BooleanField({
required: true,
initial: false
})
schema.standing = new fields.SchemaField({ schema.standing = new fields.SchemaField({
min: new fields.NumberField({ ...requiredInteger, required: true, initial: 0, min: 0 }), min: new fields.NumberField({ ...requiredInteger, required: true, initial: 0, min: 0 }),
max: new fields.NumberField({ ...requiredInteger, required: true, initial: 0, min: 0 }) max: new fields.NumberField({ ...requiredInteger, required: true, initial: 0, min: 0 })
}) })
schema.crouching = new fields.SchemaField({ schema.crouching = new fields.SchemaField({
min: new fields.NumberField({ ...requiredInteger, required: true, initial: 0, min: 0 }), min: new fields.NumberField({ ...requiredInteger, required: true, initial: 0, min: 0 }),
max: new fields.NumberField({ ...requiredInteger, required: true, initial: 0, min: 0 }) max: new fields.NumberField({ ...requiredInteger, required: true, initial: 0, min: 0 })
@@ -24,6 +92,7 @@ export default class PrismRPGShield extends foundry.abstract.TypeDataModel {
slashing: new fields.NumberField({ ...requiredInteger, required: true, initial: 0, min: 0 }), slashing: new fields.NumberField({ ...requiredInteger, required: true, initial: 0, min: 0 }),
piercing: new fields.NumberField({ ...requiredInteger, required: true, initial: 0, min: 0 }) piercing: new fields.NumberField({ ...requiredInteger, required: true, initial: 0, min: 0 })
}) })
schema.autodestruction = new fields.SchemaField({ schema.autodestruction = new fields.SchemaField({
bashing: new fields.NumberField({ ...requiredInteger, required: true, initial: 0, min: 0 }), bashing: new fields.NumberField({ ...requiredInteger, required: true, initial: 0, min: 0 }),
slashing: new fields.NumberField({ ...requiredInteger, required: true, initial: 0, min: 0 }), slashing: new fields.NumberField({ ...requiredInteger, required: true, initial: 0, min: 0 }),
@@ -40,5 +109,4 @@ export default class PrismRPGShield extends foundry.abstract.TypeDataModel {
/** @override */ /** @override */
static LOCALIZATION_PREFIXES = ["PRISMRPG.Shield"] static LOCALIZATION_PREFIXES = ["PRISMRPG.Shield"]
} }
+104 -84
View File
@@ -1,29 +1,75 @@
import { SYSTEM } from "../config/system.mjs" import { SYSTEM } from "../config/system.mjs"
import { CATEGORY } from "../config/skill.mjs"
/**
* Core Skill data model for Prism RPG
*
* Core Skills are skills in which the character is particularly proficient.
* - Basic skill checks: +5 modifier
* - Advanced skill checks: Only accessible with Core Skill
* - Core Skill Class: Gives access to a class based on archetype
* - Attribute Bonus: +2 to one of 3 associated attributes
*/
export default class PrismRPGSkill extends foundry.abstract.TypeDataModel { export default class PrismRPGSkill extends foundry.abstract.TypeDataModel {
static defineSchema() { static defineSchema() {
const fields = foundry.data.fields const fields = foundry.data.fields
const schema = {} const schema = {}
const requiredInteger = { required: true, nullable: false, integer: true } const requiredInteger = { required: true, nullable: false, integer: true }
schema.description = new fields.HTMLField({ required: true, textSearch: true }) schema.description = new fields.HTMLField({
schema.category = new fields.StringField({ required: true, initial: "layperson", choices: SYSTEM.SKILL_CATEGORY }) required: true,
schema.base = new fields.StringField({ required: true, initial: "WIS" }) textSearch: true,
schema.bonus = new fields.NumberField({ ...requiredInteger, required: true, initial: 0, min: 0 }) initial: ""
})
schema.classesCost = new fields.SchemaField( // Core Skill type (from the 18 available Core Skills)
Object.values(SYSTEM.CHAR_CLASSES_DEFINES).reduce((obj, pcClass) => { schema.coreSkill = new fields.StringField({
obj[pcClass.id] = new fields.NumberField({ ...requiredInteger, required: true, initial: 0, min: 0 }) required: true,
return obj initial: "acrobatics",
}, {}), choices: Object.keys(SYSTEM.CORE_SKILLS || {}),
) label: "Core Skill"
schema.cost = new fields.NumberField({ ...requiredInteger, required: true, initial: 0, min: 0 }) })
schema.weaponClass = new fields.StringField({ required: true, initial: "shortblade", choices: SYSTEM.WEAPON_CLASS }) // Is this the character's chosen Core Skill?
schema.weaponBonus = new fields.SchemaField({ schema.isCoreSkill = new fields.BooleanField({
attack: new fields.NumberField({ ...requiredInteger, required: true, initial: 0, min: 0 }), required: true,
defense: new fields.NumberField({ ...requiredInteger, required: true, initial: 0, min: 0 }), initial: false,
damage: new fields.NumberField({ ...requiredInteger, required: true, initial: 0, min: 0 }) label: "Is Core Skill"
})
// If Core Skill, which attribute receives the +2 bonus?
schema.attributeBonus = new fields.StringField({
required: true,
initial: "",
label: "Attribute Bonus"
})
// Skill modifier (includes Core Skill bonus if applicable)
schema.modifier = new fields.NumberField({
...requiredInteger,
required: true,
initial: 0,
label: "Skill Modifier"
})
// Can perform advanced checks
schema.canAdvancedCheck = new fields.BooleanField({
required: true,
initial: false,
label: "Can Perform Advanced Checks"
})
// Associated Core Skill Class (if any)
schema.coreSkillClass = new fields.StringField({
required: true,
initial: "",
label: "Core Skill Class"
})
// Notes/Custom description
schema.notes = new fields.HTMLField({
required: true,
initial: "",
label: "Notes"
}) })
return schema return schema
@@ -32,83 +78,57 @@ export default class PrismRPGSkill extends foundry.abstract.TypeDataModel {
/** @override */ /** @override */
static LOCALIZATION_PREFIXES = ["PRISMRPG.Skill"] static LOCALIZATION_PREFIXES = ["PRISMRPG.Skill"]
get skillCategory() { /**
return game.i18n.localize(CATEGORY[this.category].label) * Get the Core Skill definition from SYSTEM
*/
get coreSkillDefinition() {
return SYSTEM.CORE_SKILLS?.[this.coreSkill] || null
} }
validate(options) { /**
let isError = super.validate(options) * Get the localized Core Skill name
let bonus = this._source.weaponBonus.attack + this._source.weaponBonus.defense + this._source.weaponBonus.damage */
if (bonus > Math.floor(this._source.skillTotal / 10)) { get coreSkillLabel() {
ui.notifications.error(game.i18n.localize("PRISMRPG.Skill.error.weaponBonus")) const definition = this.coreSkillDefinition
isError = true return definition ? game.i18n.localize(definition.label) : this.coreSkill
}
return isError
} }
/**
* Get the available attribute choices for this Core Skill
*/
get attributeChoices() {
const definition = this.coreSkillDefinition
return definition?.attributeChoices || []
}
/**
* Prepare derived data
*/
prepareDerivedData() { prepareDerivedData() {
super.prepareDerivedData(); super.prepareDerivedData()
this.skillTotal = this.computeBase();
if (this.category === "weapon") { // If this is the character's Core Skill, apply bonuses
this.totalBonus = this.weaponBonus.attack + this.weaponBonus.defense + this.weaponBonus.damage; if (this.isCoreSkill) {
if (Number(this.skillTotal)) { this.modifier = SYSTEM.CORE_SKILL_BONUS?.basic || 5
this.availableBonus = Math.max(Math.floor(this.skillTotal / 10) - 1, 0) this.canAdvancedCheck = true
} else { } else {
this.availableBonus = "N/A" this.modifier = 0
} this.canAdvancedCheck = false
} }
} }
computeBase() { /**
let actor = this.parent?.actor; * Calculate skill check bonus
if (!actor) { * @param {string} attributeKey The attribute to use (str, dex, con, int, wis, cha)
return `${this.base} + ${String(this.bonus)}`; * @returns {number} Total skill check bonus
} */
getSkillCheckBonus(attributeKey) {
let actor = this.parent?.actor
if (!actor) return this.modifier
if (this.base === "N/A" || this.base === "None") { const attribute = actor.system.characteristics?.[attributeKey]
return this.bonus const attributeMod = attribute?.mod || 0
}
// Split the base value per stat : WIS,DEX,STR,INT,CHA (example) return attributeMod + this.modifier
let base = this.base;
// Fix errors in the base value
base.replace("CHARISMA", "CHA");
if (base.match(/OR/)) {
let baseSplit = base.split("OR");
let baseSplitLength = baseSplit.length;
if (baseSplitLength > 0) {
// Select the max stat value from the parent actor
let maxStat = 0;
for (let i = 0; i < baseSplitLength; i++) {
const stat = baseSplit[i].trim();
const statValue = actor.system.characteristics[stat.toLowerCase()]?.value || 0;
if (statValue > maxStat) {
maxStat = statValue;
}
}
return maxStat + this.bonus
}
} else {
if (base.match(/\+/)) {
// Split with + calculate the total
let baseSplit = base.split("+");
let baseSplitLength = baseSplit.length;
if (baseSplitLength > 0) {
let total = 0;
for (let i = 0; i < baseSplitLength; i++) {
const stat = baseSplit[i].trim();
const statValue = actor.system.characteristics[stat.toLowerCase()]?.value || 0;
total += statValue;
}
return total + this.bonus
}
} else {
// Single stat
const statValue = actor.system.characteristics[base.trim().toLowerCase()]?.value || 0;
return statValue + this.bonus
}
}
return `${this.base} + ${String(this.bonus)}`;
} }
} }
+140 -19
View File
@@ -1,4 +1,5 @@
import { SYSTEM } from "../config/system.mjs" import { SYSTEM } from "../config/system.mjs"
export default class PrismRPGSpell extends foundry.abstract.TypeDataModel { export default class PrismRPGSpell extends foundry.abstract.TypeDataModel {
static defineSchema() { static defineSchema() {
const fields = foundry.data.fields const fields = foundry.data.fields
@@ -11,6 +12,8 @@ export default class PrismRPGSpell extends foundry.abstract.TypeDataModel {
initial: "", initial: "",
textSearch: true, textSearch: true,
}) })
// Spell level (1-7+)
schema.level = new fields.NumberField({ schema.level = new fields.NumberField({
...requiredInteger, ...requiredInteger,
initial: 1, initial: 1,
@@ -18,27 +21,145 @@ export default class PrismRPGSpell extends foundry.abstract.TypeDataModel {
max: 25, max: 25,
}) })
schema.cost = new fields.NumberField({ ...requiredInteger, required: true, initial: 0, min: 0 }) // Mana cost - base cost of the spell
schema.memorized = new fields.BooleanField({ required: true, initial: false }) schema.manaCost = new fields.NumberField({
...requiredInteger,
schema.components = new fields.SchemaField({ required: true,
verbal: new fields.BooleanField(), initial: 1,
somatic: new fields.BooleanField(), min: 0,
catalyst: new fields.BooleanField(), label: "Mana Cost"
material: new fields.BooleanField(),
}) })
schema.castingTime = new fields.StringField({ required: true, initial: "" })
schema.spellRange = new fields.StringField({ required: true, initial: "" })
schema.areaAffected = new fields.StringField({ required: true, initial: "" })
schema.duration = new fields.StringField({ required: true, initial: "" })
schema.savingThrow = new fields.StringField({ required: true, initial: "" })
schema.extraAetherPoints = new fields.StringField({ required: true, initial: "" })
schema.materialComponent = new fields.StringField({ required: true, initial: "" })
schema.catalyst = new fields.StringField({ required: true, initial: "" })
schema.criticalType = new fields.StringField({ required: true, initial: "electric", choices : SYSTEM.SPELL_CRITICAL })
schema.attackRoll = new fields.StringField({ required: true, initial: "" }) // Mana upkeep cost (for sustained spells)
schema.powerRoll = new fields.StringField({ required: true, initial: "" }) schema.manaUpkeep = new fields.NumberField({
...requiredInteger,
required: true,
initial: 0,
min: 0,
label: "Mana Upkeep"
})
// APC to cast
schema.apc = new fields.NumberField({
...requiredInteger,
required: true,
initial: 1,
min: 0,
label: "Action Point Cost"
})
// Color/Hue of the spell (from the Prism)
schema.color = new fields.StringField({
required: true,
initial: "violet",
choices: Object.keys(SYSTEM.SPELL_COLORS || {}),
label: "Spell Color"
})
// Color effect description
schema.colorEffect = new fields.HTMLField({
required: true,
initial: "",
label: "Color Effect"
})
// Spell Ascension - can be upcast
schema.canAscend = new fields.BooleanField({
required: true,
initial: true,
label: "Can Ascend"
})
schema.ascensionEffect = new fields.HTMLField({
required: true,
initial: "",
label: "Ascension Effect"
})
// Memorized (prepared)
schema.memorized = new fields.BooleanField({
required: true,
initial: false
})
// Components
schema.components = new fields.SchemaField({
verbal: new fields.BooleanField({ initial: false }),
somatic: new fields.BooleanField({ initial: false }),
catalyst: new fields.BooleanField({ initial: false }),
material: new fields.BooleanField({ initial: false }),
})
schema.materialComponent = new fields.StringField({
required: true,
initial: ""
})
schema.catalyst = new fields.StringField({
required: true,
initial: ""
})
// Casting parameters
schema.castingTime = new fields.StringField({
required: true,
initial: "1 action"
})
schema.spellRange = new fields.StringField({
required: true,
initial: "30ft"
})
schema.areaAffected = new fields.StringField({
required: true,
initial: "Single target"
})
schema.duration = new fields.StringField({
required: true,
initial: "Instantaneous"
})
schema.savingThrow = new fields.StringField({
required: true,
initial: ""
})
// Attack and damage
schema.attackRoll = new fields.StringField({
required: true,
initial: ""
})
schema.powerRoll = new fields.StringField({
required: true,
initial: ""
})
// Keywords
schema.keywords = new fields.ArrayField(
new fields.StringField()
)
// Legacy fields
schema.cost = new fields.NumberField({
...requiredInteger,
required: true,
initial: 0,
min: 0
})
schema.extraAetherPoints = new fields.StringField({
required: true,
initial: ""
})
schema.criticalType = new fields.StringField({
required: true,
initial: "electric",
choices: SYSTEM.SPELL_CRITICAL
})
return schema return schema
} }
+124 -37
View File
@@ -1,47 +1,139 @@
import { SYSTEM } from "../config/system.mjs" import { SYSTEM } from "../config/system.mjs"
export default class PrismRPGSkill extends foundry.abstract.TypeDataModel { export default class PrismRPGWeapon extends foundry.abstract.TypeDataModel {
static defineSchema() { static defineSchema() {
const fields = foundry.data.fields const fields = foundry.data.fields
const schema = {} const schema = {}
const requiredInteger = { required: true, nullable: false, integer: true } const requiredInteger = { required: true, nullable: false, integer: true }
schema.description = new fields.HTMLField({ required: true, textSearch: true }) schema.description = new fields.HTMLField({ required: true, textSearch: true })
schema.weaponType = new fields.StringField({ required: true, initial: "melee", choices: SYSTEM.WEAPON_TYPE })
schema.weaponClass = new fields.StringField({ required: true, initial: "shortblade", choices: SYSTEM.WEAPON_CLASS })
// Prism RPG weapon properties
schema.weaponType = new fields.StringField({
required: true,
initial: "light",
choices: Object.keys(SYSTEM.WEAPON_TYPE || {})
})
schema.weaponGroup = new fields.StringField({
required: true,
initial: "longsword",
choices: Object.keys(SYSTEM.WEAPON_GROUP || {})
})
// APC (Action Point Cost) - determined by weapon type
schema.apc = new fields.NumberField({
...requiredInteger,
required: true,
initial: 1,
min: 0,
max: 3
})
// Damage dice (e.g., "1d8", "2d6", "1d12")
schema.damage = new fields.StringField({
required: true,
initial: "1d8"
})
// Damage type(s)
schema.damageType = new fields.SchemaField({ schema.damageType = new fields.SchemaField({
typeP: new fields.BooleanField(), piercing: new fields.BooleanField({ initial: false }),
typeB: new fields.BooleanField(), bludgeoning: new fields.BooleanField({ initial: false }),
typeS: new fields.BooleanField() slashing: new fields.BooleanField({ initial: false })
})
schema.damage = new fields.SchemaField({
damageS: new fields.StringField({required: true, initial: ""}),
damageM: new fields.StringField({required: true, initial: ""})
})
schema.applyStrengthDamageBonus = new fields.BooleanField({ required: true, initial: true })
schema.hands = new fields.StringField({ required: true, initial: "1", choices: {"1": "1", "2": "2"} })
schema.isAgile = new fields.BooleanField({ required: true, initial: false })
schema.defenseMax = new fields.NumberField({ ...requiredInteger, required: true, initial: 0, min: 0 })
schema.secondsToAttack = new fields.StringField({required: true, initial: ""})
schema.combatProgressionDice = new fields.StringField({required: true, initial: "d4", choices: SYSTEM.COMBAT_PROGRESSION_DICE})
schema.speed = new fields.SchemaField({
simpleAim: new fields.StringField({required: true, initial: ""}),
carefulAim: new fields.StringField({required: true, initial: ""}),
focusedAim: new fields.StringField({required: true, initial: ""})
}) })
schema.defense = new fields.NumberField({ ...requiredInteger, required: true, initial: 0, min: 0 }) // Group passive (inherited from weapon group)
schema.weaponRange = new fields.SchemaField({ schema.groupPassive = new fields.StringField({
pointBlank: new fields.NumberField({ ...requiredInteger, required: true, initial: 0, min: 0 }), required: true,
short: new fields.NumberField({ ...requiredInteger, required: true, initial: 0, min: 0 }), initial: ""
medium: new fields.NumberField({ ...requiredInteger, required: true, initial: 0, min: 0 }), })
long: new fields.NumberField({ ...requiredInteger, required: true, initial: 0, min: 0 }),
extreme: new fields.NumberField({ ...requiredInteger, required: true, initial: 0, min: 0 }), schema.groupPassiveDescription = new fields.HTMLField({
outOfSkill: new fields.NumberField({ ...requiredInteger, required: true, initial: 0, min: 0 }) required: true,
initial: ""
})
// Weapon-specific passive ability
schema.passive = new fields.StringField({
required: true,
initial: ""
})
schema.passiveDescription = new fields.HTMLField({
required: true,
initial: ""
})
// Maneuver(s) available with this weapon
schema.maneuver = new fields.StringField({
required: true,
initial: ""
})
schema.maneuverDescription = new fields.HTMLField({
required: true,
initial: ""
})
// Augment effects (for equipment progression)
schema.augment = new fields.StringField({
required: true,
initial: ""
})
schema.augmentDescription = new fields.HTMLField({
required: true,
initial: ""
})
// Projectile-specific properties
schema.isProjectile = new fields.BooleanField({
required: true,
initial: false
})
schema.range = new fields.SchemaField({
short: new fields.NumberField({ ...requiredInteger, initial: 0, min: 0 }),
medium: new fields.NumberField({ ...requiredInteger, initial: 0, min: 0 }),
long: new fields.NumberField({ ...requiredInteger, initial: 0, min: 0 })
})
schema.reloadAPC = new fields.NumberField({
...requiredInteger,
initial: 0,
min: 0
})
// Legacy properties (kept for backward compatibility)
schema.hands = new fields.StringField({
required: true,
initial: "1",
choices: { "1": "1", "2": "2" }
})
schema.isAgile = new fields.BooleanField({
required: true,
initial: false
})
schema.applyStrengthDamageBonus = new fields.BooleanField({
required: true,
initial: true
})
schema.defenseMax = new fields.NumberField({
...requiredInteger,
required: true,
initial: 0,
min: 0
})
schema.defense = new fields.NumberField({
...requiredInteger,
required: true,
initial: 0,
min: 0
}) })
schema.bonuses = new fields.SchemaField({ schema.bonuses = new fields.SchemaField({
@@ -60,9 +152,4 @@ export default class PrismRPGSkill extends foundry.abstract.TypeDataModel {
/** @override */ /** @override */
static LOCALIZATION_PREFIXES = ["PRISMRPG.Weapon"] static LOCALIZATION_PREFIXES = ["PRISMRPG.Weapon"]
get weaponCategory() {
return game.i18n.localize(CATEGORY[this.weaponType].label)
}
} }
+855 -23
View File
File diff suppressed because it is too large Load Diff
+44 -21
View File
@@ -56,7 +56,7 @@ class EventListener {
if (l[1] === true) this.remove(ctx, name, l[0]) if (l[1] === true) this.remove(ctx, name, l[0])
l[0].call(ctx, ...args) Reflect.apply(l[0], ctx, args)
} }
return list.length > 0 return list.length > 0
@@ -64,18 +64,21 @@ class EventListener {
} }
function appendListener(ctx, name, fn, once) { function appendListener(ctx, name, fn, once) {
if (ctx._events === undefined) ctx._events = Object.create(null)
const e = ctx._events[name] || (ctx._events[name] = new EventListener()) const e = ctx._events[name] || (ctx._events[name] = new EventListener())
e.append(ctx, name, fn, once) e.append(ctx, name, fn, once)
return ctx return ctx
} }
function prependListener(ctx, name, fn, once) { function prependListener(ctx, name, fn, once) {
if (ctx._events === undefined) ctx._events = Object.create(null)
const e = ctx._events[name] || (ctx._events[name] = new EventListener()) const e = ctx._events[name] || (ctx._events[name] = new EventListener())
e.prepend(ctx, name, fn, once) e.prepend(ctx, name, fn, once)
return ctx return ctx
} }
function removeListener(ctx, name, fn) { function removeListener(ctx, name, fn) {
if (ctx._events === undefined) return ctx
const e = ctx._events[name] const e = ctx._events[name]
if (e !== undefined) e.remove(ctx, name, fn) if (e !== undefined) e.remove(ctx, name, fn)
return ctx return ctx
@@ -92,7 +95,9 @@ function throwUnhandledError (...args) {
Error.captureStackTrace(err, exports.prototype.emit) Error.captureStackTrace(err, exports.prototype.emit)
} }
queueMicrotask(() => { throw err }) queueMicrotask(() => {
throw err
})
} }
module.exports = exports = class EventEmitter { module.exports = exports = class EventEmitter {
@@ -133,17 +138,23 @@ module.exports = exports = class EventEmitter {
} }
emit(name, ...args) { emit(name, ...args) {
if (name === 'error' && this._events.error === undefined) throwUnhandledError(...args) if (name === 'error' && this._events !== undefined && this._events.error === undefined) {
throwUnhandledError(...args)
}
if (this._events === undefined) return false
const e = this._events[name] const e = this._events[name]
return e === undefined ? false : e.emit(this, name, ...args) return e === undefined ? false : e.emit(this, name, ...args)
} }
listeners(name) { listeners(name) {
if (this._events === undefined) return []
const e = this._events[name] const e = this._events[name]
return e === undefined ? [] : [...e.list] return e === undefined ? [] : [...e.list]
} }
listenerCount(name) { listenerCount(name) {
if (this._events === undefined) return 0
const e = this._events[name] const e = this._events[name]
return e === undefined ? 0 : e.list.length return e === undefined ? 0 : e.list.length
} }
@@ -176,9 +187,7 @@ exports.errors = errors
exports.defaultMaxListeners = 10 exports.defaultMaxListeners = 10
exports.on = function on(emitter, name, opts = {}) { exports.on = function on(emitter, name, opts = {}) {
const { const { signal } = opts
signal
} = opts
if (signal && signal.aborted) { if (signal && signal.aborted) {
throw errors.OPERATION_ABORTED(signal.reason) throw errors.OPERATION_ABORTED(signal.reason)
@@ -212,9 +221,7 @@ exports.on = function on (emitter, name, opts = {}) {
if (done) return onclose() if (done) return onclose()
return new Promise((resolve, reject) => return new Promise((resolve, reject) => promises.push({ resolve, reject }))
promises.push({ resolve, reject })
)
}, },
return() { return() {
@@ -268,9 +275,7 @@ exports.on = function on (emitter, name, opts = {}) {
} }
exports.once = function once(emitter, name, opts = {}) { exports.once = function once(emitter, name, opts = {}) {
const { const { signal } = opts
signal
} = opts
if (signal && signal.aborted) { if (signal && signal.aborted) {
throw errors.OPERATION_ABORTED(signal.reason) throw errors.OPERATION_ABORTED(signal.reason)
@@ -306,23 +311,22 @@ exports.once = function once (emitter, name, opts = {}) {
exports.forward = function forward(from, to, names, opts = {}) { exports.forward = function forward(from, to, names, opts = {}) {
if (typeof names === 'string') names = [names] if (typeof names === 'string') names = [names]
const { const { emit = to.emit.bind(to) } = opts
emit = to.emit.bind(to)
} = opts
const listeners = names.map((name) => function onevent (...args) { const listeners = names.map(
(name) =>
function onevent(...args) {
emit(name, ...args) emit(name, ...args)
}) }
)
to to.on('newListener', (name) => {
.on('newListener', (name) => {
const i = names.indexOf(name) const i = names.indexOf(name)
if (i !== -1 && to.listenerCount(name) === 0) { if (i !== -1 && to.listenerCount(name) === 0) {
from.on(name, listeners[i]) from.on(name, listeners[i])
} }
}) }).on('removeListener', (name) => {
.on('removeListener', (name) => {
const i = names.indexOf(name) const i = names.indexOf(name)
if (i !== -1 && to.listenerCount(name) === 0) { if (i !== -1 && to.listenerCount(name) === 0) {
@@ -334,3 +338,22 @@ exports.forward = function forward (from, to, names, opts = {}) {
exports.listenerCount = function listenerCount(emitter, name) { exports.listenerCount = function listenerCount(emitter, name) {
return emitter.listenerCount(name) return emitter.listenerCount(name)
} }
exports.getMaxListeners = function getMaxListeners(emitter) {
if (typeof emitter.getMaxListeners === 'function') {
return emitter.getMaxListeners()
}
return exports.defaultMaxListeners
}
exports.setMaxListeners = function setMaxListeners(n, ...emitters) {
if (emitters.length === 0) exports.defaultMaxListeners = n
else {
for (const emitter of emitters) {
if (typeof emitter.setMaxListeners === 'function') {
emitter.setMaxListeners(n)
}
}
}
}
+6 -2
View File
@@ -13,10 +13,14 @@ module.exports = class EventEmitterError extends Error {
} }
static OPERATION_ABORTED(cause, msg = 'Operation aborted') { static OPERATION_ABORTED(cause, msg = 'Operation aborted') {
return new EventEmitterError(msg, 'OPERATION_ABORTED', EventEmitterError.OPERATION_ABORTED, { cause }) return new EventEmitterError(msg, 'OPERATION_ABORTED', EventEmitterError.OPERATION_ABORTED, {
cause
})
} }
static UNHANDLED_ERROR(cause, msg = 'Unhandled error') { static UNHANDLED_ERROR(cause, msg = 'Unhandled error') {
return new EventEmitterError(msg, 'UNHANDLED_ERROR', EventEmitterError.UNHANDLED_ERROR, { cause }) return new EventEmitterError(msg, 'UNHANDLED_ERROR', EventEmitterError.UNHANDLED_ERROR, {
cause
})
} }
} }
+31 -4
View File
@@ -1,21 +1,37 @@
{ {
"name": "bare-events", "name": "bare-events",
"version": "2.5.0", "version": "2.8.1",
"description": "Event emitters for JavaScript", "description": "Event emitters for JavaScript",
"exports": { "exports": {
".": "./index.js",
"./package": "./package.json", "./package": "./package.json",
".": {
"types": "./index.d.ts",
"default": "./index.js"
},
"./global": {
"types": "./global.d.ts",
"default": "./global.js"
},
"./web": {
"types": "./web.d.ts",
"default": "./web.js"
},
"./errors": "./lib/errors.js" "./errors": "./lib/errors.js"
}, },
"files": [ "files": [
"index.js", "index.js",
"index.d.ts",
"global.js",
"global.d.ts",
"web.js",
"web.d.ts",
"lib" "lib"
], ],
"scripts": { "scripts": {
"test": "npm run lint && npm run test:bare && npm run test:node", "test": "npm run lint && npm run test:bare && npm run test:node",
"test:bare": "bare test.js", "test:bare": "bare test.js",
"test:node": "node test.js", "test:node": "node test.js",
"lint": "standard" "lint": "prettier . --check"
}, },
"repository": { "repository": {
"type": "git", "type": "git",
@@ -28,7 +44,18 @@
}, },
"homepage": "https://github.com/holepunchto/bare-events#readme", "homepage": "https://github.com/holepunchto/bare-events#readme",
"devDependencies": { "devDependencies": {
"bare-abort-controller": "^1.0.0",
"brittle": "^3.3.2", "brittle": "^3.3.2",
"standard": "^17.0.0" "prettier": "^3.4.2",
"prettier-config-holepunch": "^2.0.0",
"uncaughts": "^1.1.1"
},
"peerDependencies": {
"bare-abort-controller": "*"
},
"peerDependenciesMeta": {
"bare-abort-controller": {
"optional": true
}
} }
} }
+7 -3
View File
@@ -1,6 +1,6 @@
{ {
"name": "debug", "name": "debug",
"version": "4.3.7", "version": "4.4.3",
"repository": { "repository": {
"type": "git", "type": "git",
"url": "git://github.com/debug-js/debug.git" "url": "git://github.com/debug-js/debug.git"
@@ -26,7 +26,7 @@
"scripts": { "scripts": {
"lint": "xo", "lint": "xo",
"test": "npm run test:node && npm run test:browser && npm run lint", "test": "npm run test:node && npm run test:browser && npm run lint",
"test:node": "istanbul cover _mocha -- test.js test.node.js", "test:node": "mocha test.js test.node.js",
"test:browser": "karma start --single-run", "test:browser": "karma start --single-run",
"test:coverage": "cat ./coverage/lcov.info | coveralls" "test:coverage": "cat ./coverage/lcov.info | coveralls"
}, },
@@ -37,7 +37,6 @@
"brfs": "^2.0.1", "brfs": "^2.0.1",
"browserify": "^16.2.3", "browserify": "^16.2.3",
"coveralls": "^3.0.2", "coveralls": "^3.0.2",
"istanbul": "^0.4.5",
"karma": "^3.1.4", "karma": "^3.1.4",
"karma-browserify": "^6.0.0", "karma-browserify": "^6.0.0",
"karma-chrome-launcher": "^2.2.0", "karma-chrome-launcher": "^2.2.0",
@@ -56,5 +55,10 @@
"browser": "./src/browser.js", "browser": "./src/browser.js",
"engines": { "engines": {
"node": ">=6.0" "node": ">=6.0"
},
"xo": {
"rules": {
"import/extensions": "off"
}
} }
} }
+2 -1
View File
@@ -129,6 +129,7 @@ function useColors() {
// Is webkit? http://stackoverflow.com/a/16459606/376773 // Is webkit? http://stackoverflow.com/a/16459606/376773
// document is undefined in react-native: https://github.com/facebook/react-native/pull/1632 // document is undefined in react-native: https://github.com/facebook/react-native/pull/1632
// eslint-disable-next-line no-return-assign
return (typeof document !== 'undefined' && document.documentElement && document.documentElement.style && document.documentElement.style.WebkitAppearance) || return (typeof document !== 'undefined' && document.documentElement && document.documentElement.style && document.documentElement.style.WebkitAppearance) ||
// Is firebug? http://stackoverflow.com/a/398120/376773 // Is firebug? http://stackoverflow.com/a/398120/376773
(typeof window !== 'undefined' && window.console && (window.console.firebug || (window.console.exception && window.console.table))) || (typeof window !== 'undefined' && window.console && (window.console.firebug || (window.console.exception && window.console.table))) ||
@@ -218,7 +219,7 @@ function save(namespaces) {
function load() { function load() {
let r; let r;
try { try {
r = exports.storage.getItem('debug'); r = exports.storage.getItem('debug') || exports.storage.getItem('DEBUG') ;
} catch (error) { } catch (error) {
// Swallow // Swallow
// XXX (@Qix-) should we be logging these? // XXX (@Qix-) should we be logging these?
+58 -40
View File
@@ -166,26 +166,64 @@ function setup(env) {
createDebug.names = []; createDebug.names = [];
createDebug.skips = []; createDebug.skips = [];
let i; const split = (typeof namespaces === 'string' ? namespaces : '')
const split = (typeof namespaces === 'string' ? namespaces : '').split(/[\s,]+/); .trim()
const len = split.length; .replace(/\s+/g, ',')
.split(',')
.filter(Boolean);
for (i = 0; i < len; i++) { for (const ns of split) {
if (!split[i]) { if (ns[0] === '-') {
// ignore empty strings createDebug.skips.push(ns.slice(1));
continue;
}
namespaces = split[i].replace(/\*/g, '.*?');
if (namespaces[0] === '-') {
createDebug.skips.push(new RegExp('^' + namespaces.slice(1) + '$'));
} else { } else {
createDebug.names.push(new RegExp('^' + namespaces + '$')); createDebug.names.push(ns);
} }
} }
} }
/**
* Checks if the given string matches a namespace template, honoring
* asterisks as wildcards.
*
* @param {String} search
* @param {String} template
* @return {Boolean}
*/
function matchesTemplate(search, template) {
let searchIndex = 0;
let templateIndex = 0;
let starIndex = -1;
let matchIndex = 0;
while (searchIndex < search.length) {
if (templateIndex < template.length && (template[templateIndex] === search[searchIndex] || template[templateIndex] === '*')) {
// Match character or proceed with wildcard
if (template[templateIndex] === '*') {
starIndex = templateIndex;
matchIndex = searchIndex;
templateIndex++; // Skip the '*'
} else {
searchIndex++;
templateIndex++;
}
} else if (starIndex !== -1) { // eslint-disable-line no-negated-condition
// Backtrack to the last '*' and try to match more characters
templateIndex = starIndex + 1;
matchIndex++;
searchIndex = matchIndex;
} else {
return false; // No match
}
}
// Handle trailing '*' in template
while (templateIndex < template.length && template[templateIndex] === '*') {
templateIndex++;
}
return templateIndex === template.length;
}
/** /**
* Disable debug output. * Disable debug output.
* *
@@ -194,8 +232,8 @@ function setup(env) {
*/ */
function disable() { function disable() {
const namespaces = [ const namespaces = [
...createDebug.names.map(toNamespace), ...createDebug.names,
...createDebug.skips.map(toNamespace).map(namespace => '-' + namespace) ...createDebug.skips.map(namespace => '-' + namespace)
].join(','); ].join(',');
createDebug.enable(''); createDebug.enable('');
return namespaces; return namespaces;
@@ -209,21 +247,14 @@ function setup(env) {
* @api public * @api public
*/ */
function enabled(name) { function enabled(name) {
if (name[name.length - 1] === '*') { for (const skip of createDebug.skips) {
return true; if (matchesTemplate(name, skip)) {
}
let i;
let len;
for (i = 0, len = createDebug.skips.length; i < len; i++) {
if (createDebug.skips[i].test(name)) {
return false; return false;
} }
} }
for (i = 0, len = createDebug.names.length; i < len; i++) { for (const ns of createDebug.names) {
if (createDebug.names[i].test(name)) { if (matchesTemplate(name, ns)) {
return true; return true;
} }
} }
@@ -231,19 +262,6 @@ function setup(env) {
return false; return false;
} }
/**
* Convert regexp to namespace
*
* @param {RegExp} regxep
* @return {String} namespace
* @api private
*/
function toNamespace(regexp) {
return regexp.toString()
.substring(2, regexp.toString().length - 2)
.replace(/\.\*\?$/, '*');
}
/** /**
* Coerce `val`. * Coerce `val`.
* *
-24
View File
@@ -1,24 +0,0 @@
name: Build Status
on:
push:
branches:
- master
pull_request:
branches:
- master
jobs:
build:
strategy:
matrix:
node-version: [14.x]
os: [ubuntu-16.04, macos-latest, windows-latest]
runs-on: ${{ matrix.os }}
steps:
- uses: actions/checkout@v2
- name: Use Node.js ${{ matrix.node-version }}
uses: actions/setup-node@v1
with:
node-version: ${{ matrix.node-version }}
- run: npm install
- run: npm test
-21
View File
@@ -1,21 +0,0 @@
The MIT License (MIT)
Copyright (c) 2021 Mathias Buus
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.
-20
View File
@@ -1,20 +0,0 @@
# queue-tick
Next tick shim that prefers process.nextTick over queueMicrotask for compat
```
npm install queue-tick
```
## Usage
``` js
const queueTick = require('queue-tick')
// in Node it uses process.nextTick, in browsers it uses queueMicrotask
queueTick(() => console.log('laters'))
```
## License
MIT
-25
View File
@@ -1,25 +0,0 @@
{
"name": "queue-tick",
"version": "1.0.1",
"description": "Next tick shim that prefers process.nextTick over queueMicrotask for compat",
"main": "./process-next-tick.js",
"browser": "./queue-microtask.js",
"dependencies": {},
"devDependencies": {
"standard": "^16.0.3",
"tape": "^5.3.1"
},
"scripts": {
"test": "standard && tape test.js"
},
"repository": {
"type": "git",
"url": "https://github.com/mafintosh/queue-tick.git"
},
"author": "Mathias Buus (@mafintosh)",
"license": "MIT",
"bugs": {
"url": "https://github.com/mafintosh/queue-tick/issues"
},
"homepage": "https://github.com/mafintosh/queue-tick"
}
-3
View File
@@ -1,3 +0,0 @@
module.exports = (typeof process !== 'undefined' && typeof process.nextTick === 'function')
? process.nextTick.bind(process)
: require('./queue-microtask')
-1
View File
@@ -1 +0,0 @@
module.exports = typeof queueMicrotask === 'function' ? queueMicrotask : (fn) => Promise.resolve().then(fn)
-10
View File
@@ -1,10 +0,0 @@
const tape = require('tape')
const queueTick = require('./')
const js = require('./queue-microtask')
tape('basic', function (t) {
t.plan(2)
queueTick(() => t.pass('tick'))
js(() => t.pass('tock'))
})
+14 -4
View File
@@ -100,7 +100,7 @@ Options:
-i --increment [<level>] -i --increment [<level>]
Increment a version by the specified level. Level can Increment a version by the specified level. Level can
be one of: major, minor, patch, premajor, preminor, be one of: major, minor, patch, premajor, preminor,
prepatch, or prerelease. Default level is 'patch'. prepatch, prerelease, or release. Default level is 'patch'.
Only one version may be specified. Only one version may be specified.
--preid <identifier> --preid <identifier>
@@ -141,6 +141,8 @@ A "version" is described by the `v2.0.0` specification found at
<https://semver.org/>. <https://semver.org/>.
A leading `"="` or `"v"` character is stripped off and ignored. A leading `"="` or `"v"` character is stripped off and ignored.
Support for stripping a leading "v" is kept for compatibility with `v1.0.0` of the SemVer
specification but should not be used anymore.
## Ranges ## Ranges
@@ -237,6 +239,13 @@ $ semver 1.2.4-beta.0 -i prerelease
1.2.4-beta.1 1.2.4-beta.1
``` ```
To get out of the prerelease phase, use the `release` option:
```bash
$ semver 1.2.4-beta.1 -i release
1.2.4
```
#### Prerelease Identifier Base #### Prerelease Identifier Base
The method `.inc` takes an optional parameter 'identifierBase' string The method `.inc` takes an optional parameter 'identifierBase' string
@@ -415,10 +424,10 @@ Strict-mode Comparators and Ranges will be strict about the SemVer
strings that they parse. strings that they parse.
* `valid(v)`: Return the parsed version, or null if it's not valid. * `valid(v)`: Return the parsed version, or null if it's not valid.
* `inc(v, release, options, identifier, identifierBase)`: * `inc(v, releaseType, options, identifier, identifierBase)`:
Return the version incremented by the release Return the version incremented by the release
type (`major`, `premajor`, `minor`, `preminor`, `patch`, type (`major`, `premajor`, `minor`, `preminor`, `patch`,
`prepatch`, or `prerelease`), or null if it's not valid `prepatch`, `prerelease`, or `release`), or null if it's not valid
* `premajor` in one call will bump the version up to the next major * `premajor` in one call will bump the version up to the next major
version and down to a prerelease of that major version. version and down to a prerelease of that major version.
`preminor`, and `prepatch` work the same way. `preminor`, and `prepatch` work the same way.
@@ -426,6 +435,7 @@ strings that they parse.
same as `prepatch`. It increments the patch version and then makes a same as `prepatch`. It increments the patch version and then makes a
prerelease. If the input version is already a prerelease it simply prerelease. If the input version is already a prerelease it simply
increments it. increments it.
* `release` will remove any prerelease part of the version.
* `identifier` can be used to prefix `premajor`, `preminor`, * `identifier` can be used to prefix `premajor`, `preminor`,
`prepatch`, or `prerelease` version increments. `identifierBase` `prepatch`, or `prerelease` version increments. `identifierBase`
is the base to be used for the `prerelease` identifier. is the base to be used for the `prerelease` identifier.
@@ -477,7 +487,7 @@ strings that they parse.
### Ranges ### Ranges
* `validRange(range)`: Return the valid range or null if it's not valid * `validRange(range)`: Return the valid range or null if it's not valid.
* `satisfies(version, range)`: Return true if the version satisfies the * `satisfies(version, range)`: Return true if the version satisfies the
range. range.
* `maxSatisfying(versions, range)`: Return the highest version in the list * `maxSatisfying(versions, range)`: Return the highest version in the list
+4 -1
View File
@@ -3,6 +3,8 @@
// Exits successfully and prints matching version(s) if // Exits successfully and prints matching version(s) if
// any supplied version is valid and passes all tests. // any supplied version is valid and passes all tests.
'use strict'
const argv = process.argv.slice(2) const argv = process.argv.slice(2)
let versions = [] let versions = []
@@ -61,6 +63,7 @@ const main = () => {
switch (argv[0]) { switch (argv[0]) {
case 'major': case 'minor': case 'patch': case 'prerelease': case 'major': case 'minor': case 'patch': case 'prerelease':
case 'premajor': case 'preminor': case 'prepatch': case 'premajor': case 'preminor': case 'prepatch':
case 'release':
inc = argv.shift() inc = argv.shift()
break break
default: default:
@@ -149,7 +152,7 @@ Options:
-i --increment [<level>] -i --increment [<level>]
Increment a version by the specified level. Level can Increment a version by the specified level. Level can
be one of: major, minor, patch, premajor, preminor, be one of: major, minor, patch, premajor, preminor,
prepatch, or prerelease. Default level is 'patch'. prepatch, prerelease, or release. Default level is 'patch'.
Only one version may be specified. Only one version may be specified.
--preid <identifier> --preid <identifier>
+2
View File
@@ -1,3 +1,5 @@
'use strict'
const ANY = Symbol('SemVer ANY') const ANY = Symbol('SemVer ANY')
// hoisted class for cyclic dependency // hoisted class for cyclic dependency
class Comparator { class Comparator {
+2
View File
@@ -1,3 +1,5 @@
'use strict'
module.exports = { module.exports = {
SemVer: require('./semver.js'), SemVer: require('./semver.js'),
Range: require('./range.js'), Range: require('./range.js'),
+3
View File
@@ -1,3 +1,5 @@
'use strict'
const SPACE_CHARACTERS = /\s+/g const SPACE_CHARACTERS = /\s+/g
// hoisted class for cyclic dependency // hoisted class for cyclic dependency
@@ -253,6 +255,7 @@ const isSatisfiable = (comparators, options) => {
// already replaced the hyphen ranges // already replaced the hyphen ranges
// turn into a set of JUST comparators. // turn into a set of JUST comparators.
const parseComparator = (comp, options) => { const parseComparator = (comp, options) => {
comp = comp.replace(re[t.BUILD], '')
debug('comp', comp, options) debug('comp', comp, options)
comp = replaceCarets(comp, options) comp = replaceCarets(comp, options)
debug('caret', comp) debug('caret', comp)
+40 -9
View File
@@ -1,3 +1,5 @@
'use strict'
const debug = require('../internal/debug') const debug = require('../internal/debug')
const { MAX_LENGTH, MAX_SAFE_INTEGER } = require('../internal/constants') const { MAX_LENGTH, MAX_SAFE_INTEGER } = require('../internal/constants')
const { safeRe: re, t } = require('../internal/re') const { safeRe: re, t } = require('../internal/re')
@@ -109,11 +111,25 @@ class SemVer {
other = new SemVer(other, this.options) other = new SemVer(other, this.options)
} }
return ( if (this.major < other.major) {
compareIdentifiers(this.major, other.major) || return -1
compareIdentifiers(this.minor, other.minor) || }
compareIdentifiers(this.patch, other.patch) if (this.major > other.major) {
) return 1
}
if (this.minor < other.minor) {
return -1
}
if (this.minor > other.minor) {
return 1
}
if (this.patch < other.patch) {
return -1
}
if (this.patch > other.patch) {
return 1
}
return 0
} }
comparePre (other) { comparePre (other) {
@@ -176,6 +192,19 @@ class SemVer {
// preminor will bump the version up to the next minor release, and immediately // preminor will bump the version up to the next minor release, and immediately
// down to pre-release. premajor and prepatch work the same way. // down to pre-release. premajor and prepatch work the same way.
inc (release, identifier, identifierBase) { inc (release, identifier, identifierBase) {
if (release.startsWith('pre')) {
if (!identifier && identifierBase === false) {
throw new Error('invalid increment argument: identifier is empty')
}
// Avoid an invalid semver results
if (identifier) {
const match = `-${identifier}`.match(this.options.loose ? re[t.PRERELEASELOOSE] : re[t.PRERELEASE])
if (!match || match[1] !== identifier) {
throw new Error(`invalid identifier: ${identifier}`)
}
}
}
switch (release) { switch (release) {
case 'premajor': case 'premajor':
this.prerelease.length = 0 this.prerelease.length = 0
@@ -206,6 +235,12 @@ class SemVer {
} }
this.inc('pre', identifier, identifierBase) this.inc('pre', identifier, identifierBase)
break break
case 'release':
if (this.prerelease.length === 0) {
throw new Error(`version ${this.raw} is not a prerelease`)
}
this.prerelease.length = 0
break
case 'major': case 'major':
// If this is a pre-major version, bump up to the same major version. // If this is a pre-major version, bump up to the same major version.
@@ -249,10 +284,6 @@ class SemVer {
case 'pre': { case 'pre': {
const base = Number(identifierBase) ? 1 : 0 const base = Number(identifierBase) ? 1 : 0
if (!identifier && identifierBase === false) {
throw new Error('invalid increment argument: identifier is empty')
}
if (this.prerelease.length === 0) { if (this.prerelease.length === 0) {
this.prerelease = [base] this.prerelease = [base]
} else { } else {
+2
View File
@@ -1,3 +1,5 @@
'use strict'
const parse = require('./parse') const parse = require('./parse')
const clean = (version, options) => { const clean = (version, options) => {
const s = parse(version.trim().replace(/^[=v]+/, ''), options) const s = parse(version.trim().replace(/^[=v]+/, ''), options)
+2
View File
@@ -1,3 +1,5 @@
'use strict'
const eq = require('./eq') const eq = require('./eq')
const neq = require('./neq') const neq = require('./neq')
const gt = require('./gt') const gt = require('./gt')
+2
View File
@@ -1,3 +1,5 @@
'use strict'
const SemVer = require('../classes/semver') const SemVer = require('../classes/semver')
const parse = require('./parse') const parse = require('./parse')
const { safeRe: re, t } = require('../internal/re') const { safeRe: re, t } = require('../internal/re')
+2
View File
@@ -1,3 +1,5 @@
'use strict'
const SemVer = require('../classes/semver') const SemVer = require('../classes/semver')
const compareBuild = (a, b, loose) => { const compareBuild = (a, b, loose) => {
const versionA = new SemVer(a, loose) const versionA = new SemVer(a, loose)
+2
View File
@@ -1,3 +1,5 @@
'use strict'
const compare = require('./compare') const compare = require('./compare')
const compareLoose = (a, b) => compare(a, b, true) const compareLoose = (a, b) => compare(a, b, true)
module.exports = compareLoose module.exports = compareLoose
+2
View File
@@ -1,3 +1,5 @@
'use strict'
const SemVer = require('../classes/semver') const SemVer = require('../classes/semver')
const compare = (a, b, loose) => const compare = (a, b, loose) =>
new SemVer(a, loose).compare(new SemVer(b, loose)) new SemVer(a, loose).compare(new SemVer(b, loose))
+7 -12
View File
@@ -1,3 +1,5 @@
'use strict'
const parse = require('./parse.js') const parse = require('./parse.js')
const diff = (version1, version2) => { const diff = (version1, version2) => {
@@ -27,20 +29,13 @@ const diff = (version1, version2) => {
return 'major' return 'major'
} }
// Otherwise it can be determined by checking the high version // If the main part has no difference
if (lowVersion.compareMain(highVersion) === 0) {
if (highVersion.patch) { if (lowVersion.minor && !lowVersion.patch) {
// anything higher than a patch bump would result in the wrong version
return 'patch'
}
if (highVersion.minor) {
// anything higher than a minor bump would result in the wrong version
return 'minor' return 'minor'
} }
return 'patch'
// bumping major/minor/patch all have same result }
return 'major'
} }
// add the `pre` prefix if we are going to a prerelease version // add the `pre` prefix if we are going to a prerelease version
+2
View File
@@ -1,3 +1,5 @@
'use strict'
const compare = require('./compare') const compare = require('./compare')
const eq = (a, b, loose) => compare(a, b, loose) === 0 const eq = (a, b, loose) => compare(a, b, loose) === 0
module.exports = eq module.exports = eq
+2
View File
@@ -1,3 +1,5 @@
'use strict'
const compare = require('./compare') const compare = require('./compare')
const gt = (a, b, loose) => compare(a, b, loose) > 0 const gt = (a, b, loose) => compare(a, b, loose) > 0
module.exports = gt module.exports = gt
+2
View File
@@ -1,3 +1,5 @@
'use strict'
const compare = require('./compare') const compare = require('./compare')
const gte = (a, b, loose) => compare(a, b, loose) >= 0 const gte = (a, b, loose) => compare(a, b, loose) >= 0
module.exports = gte module.exports = gte
+2
View File
@@ -1,3 +1,5 @@
'use strict'
const SemVer = require('../classes/semver') const SemVer = require('../classes/semver')
const inc = (version, release, options, identifier, identifierBase) => { const inc = (version, release, options, identifier, identifierBase) => {
+2
View File
@@ -1,3 +1,5 @@
'use strict'
const compare = require('./compare') const compare = require('./compare')
const lt = (a, b, loose) => compare(a, b, loose) < 0 const lt = (a, b, loose) => compare(a, b, loose) < 0
module.exports = lt module.exports = lt
+2
View File
@@ -1,3 +1,5 @@
'use strict'
const compare = require('./compare') const compare = require('./compare')
const lte = (a, b, loose) => compare(a, b, loose) <= 0 const lte = (a, b, loose) => compare(a, b, loose) <= 0
module.exports = lte module.exports = lte
+2
View File
@@ -1,3 +1,5 @@
'use strict'
const SemVer = require('../classes/semver') const SemVer = require('../classes/semver')
const major = (a, loose) => new SemVer(a, loose).major const major = (a, loose) => new SemVer(a, loose).major
module.exports = major module.exports = major
+2
View File
@@ -1,3 +1,5 @@
'use strict'
const SemVer = require('../classes/semver') const SemVer = require('../classes/semver')
const minor = (a, loose) => new SemVer(a, loose).minor const minor = (a, loose) => new SemVer(a, loose).minor
module.exports = minor module.exports = minor
+2
View File
@@ -1,3 +1,5 @@
'use strict'
const compare = require('./compare') const compare = require('./compare')
const neq = (a, b, loose) => compare(a, b, loose) !== 0 const neq = (a, b, loose) => compare(a, b, loose) !== 0
module.exports = neq module.exports = neq
+2
View File
@@ -1,3 +1,5 @@
'use strict'
const SemVer = require('../classes/semver') const SemVer = require('../classes/semver')
const parse = (version, options, throwErrors = false) => { const parse = (version, options, throwErrors = false) => {
if (version instanceof SemVer) { if (version instanceof SemVer) {
+2
View File
@@ -1,3 +1,5 @@
'use strict'
const SemVer = require('../classes/semver') const SemVer = require('../classes/semver')
const patch = (a, loose) => new SemVer(a, loose).patch const patch = (a, loose) => new SemVer(a, loose).patch
module.exports = patch module.exports = patch
+2
View File
@@ -1,3 +1,5 @@
'use strict'
const parse = require('./parse') const parse = require('./parse')
const prerelease = (version, options) => { const prerelease = (version, options) => {
const parsed = parse(version, options) const parsed = parse(version, options)
+2
View File
@@ -1,3 +1,5 @@
'use strict'
const compare = require('./compare') const compare = require('./compare')
const rcompare = (a, b, loose) => compare(b, a, loose) const rcompare = (a, b, loose) => compare(b, a, loose)
module.exports = rcompare module.exports = rcompare
+2
View File
@@ -1,3 +1,5 @@
'use strict'
const compareBuild = require('./compare-build') const compareBuild = require('./compare-build')
const rsort = (list, loose) => list.sort((a, b) => compareBuild(b, a, loose)) const rsort = (list, loose) => list.sort((a, b) => compareBuild(b, a, loose))
module.exports = rsort module.exports = rsort
+2
View File
@@ -1,3 +1,5 @@
'use strict'
const Range = require('../classes/range') const Range = require('../classes/range')
const satisfies = (version, range, options) => { const satisfies = (version, range, options) => {
try { try {
+2
View File
@@ -1,3 +1,5 @@
'use strict'
const compareBuild = require('./compare-build') const compareBuild = require('./compare-build')
const sort = (list, loose) => list.sort((a, b) => compareBuild(a, b, loose)) const sort = (list, loose) => list.sort((a, b) => compareBuild(a, b, loose))
module.exports = sort module.exports = sort
+2
View File
@@ -1,3 +1,5 @@
'use strict'
const parse = require('./parse') const parse = require('./parse')
const valid = (version, options) => { const valid = (version, options) => {
const v = parse(version, options) const v = parse(version, options)
+2
View File
@@ -1,3 +1,5 @@
'use strict'
// just pre-load all the stuff that index.js lazily exports // just pre-load all the stuff that index.js lazily exports
const internalRe = require('./internal/re') const internalRe = require('./internal/re')
const constants = require('./internal/constants') const constants = require('./internal/constants')
+2
View File
@@ -1,3 +1,5 @@
'use strict'
// Note: this is the semver.org version of the spec that it implements // Note: this is the semver.org version of the spec that it implements
// Not necessarily the package version of this code. // Not necessarily the package version of this code.
const SEMVER_SPEC_VERSION = '2.0.0' const SEMVER_SPEC_VERSION = '2.0.0'
+2
View File
@@ -1,3 +1,5 @@
'use strict'
const debug = ( const debug = (
typeof process === 'object' && typeof process === 'object' &&
process.env && process.env &&
+6
View File
@@ -1,5 +1,11 @@
'use strict'
const numeric = /^[0-9]+$/ const numeric = /^[0-9]+$/
const compareIdentifiers = (a, b) => { const compareIdentifiers = (a, b) => {
if (typeof a === 'number' && typeof b === 'number') {
return a === b ? 0 : a < b ? -1 : 1
}
const anum = numeric.test(a) const anum = numeric.test(a)
const bnum = numeric.test(b) const bnum = numeric.test(b)
+2
View File
@@ -1,3 +1,5 @@
'use strict'
class LRUCache { class LRUCache {
constructor () { constructor () {
this.max = 1000 this.max = 1000
+2
View File
@@ -1,3 +1,5 @@
'use strict'
// parse out just the options we care about // parse out just the options we care about
const looseOption = Object.freeze({ loose: true }) const looseOption = Object.freeze({ loose: true })
const emptyOpts = Object.freeze({ }) const emptyOpts = Object.freeze({ })
+10 -4
View File
@@ -1,3 +1,5 @@
'use strict'
const { const {
MAX_SAFE_COMPONENT_LENGTH, MAX_SAFE_COMPONENT_LENGTH,
MAX_SAFE_BUILD_LENGTH, MAX_SAFE_BUILD_LENGTH,
@@ -10,6 +12,7 @@ exports = module.exports = {}
const re = exports.re = [] const re = exports.re = []
const safeRe = exports.safeRe = [] const safeRe = exports.safeRe = []
const src = exports.src = [] const src = exports.src = []
const safeSrc = exports.safeSrc = []
const t = exports.t = {} const t = exports.t = {}
let R = 0 let R = 0
@@ -42,6 +45,7 @@ const createToken = (name, value, isGlobal) => {
debug(name, index, value) debug(name, index, value)
t[name] = index t[name] = index
src[index] = value src[index] = value
safeSrc[index] = safe
re[index] = new RegExp(value, isGlobal ? 'g' : undefined) re[index] = new RegExp(value, isGlobal ? 'g' : undefined)
safeRe[index] = new RegExp(safe, isGlobal ? 'g' : undefined) safeRe[index] = new RegExp(safe, isGlobal ? 'g' : undefined)
} }
@@ -74,12 +78,14 @@ createToken('MAINVERSIONLOOSE', `(${src[t.NUMERICIDENTIFIERLOOSE]})\\.` +
// ## Pre-release Version Identifier // ## Pre-release Version Identifier
// A numeric identifier, or a non-numeric identifier. // A numeric identifier, or a non-numeric identifier.
// Non-numberic identifiers include numberic identifiers but can be longer.
// Therefore non-numberic identifiers must go first.
createToken('PRERELEASEIDENTIFIER', `(?:${src[t.NUMERICIDENTIFIER] createToken('PRERELEASEIDENTIFIER', `(?:${src[t.NONNUMERICIDENTIFIER]
}|${src[t.NONNUMERICIDENTIFIER]})`) }|${src[t.NUMERICIDENTIFIER]})`)
createToken('PRERELEASEIDENTIFIERLOOSE', `(?:${src[t.NUMERICIDENTIFIERLOOSE] createToken('PRERELEASEIDENTIFIERLOOSE', `(?:${src[t.NONNUMERICIDENTIFIER]
}|${src[t.NONNUMERICIDENTIFIER]})`) }|${src[t.NUMERICIDENTIFIERLOOSE]})`)
// ## Pre-release Version // ## Pre-release Version
// Hyphen, followed by one or more dot-separated pre-release version // Hyphen, followed by one or more dot-separated pre-release version
+8 -7
View File
@@ -1,20 +1,21 @@
{ {
"name": "semver", "name": "semver",
"version": "7.6.3", "version": "7.7.3",
"description": "The semantic version parser used by npm.", "description": "The semantic version parser used by npm.",
"main": "index.js", "main": "index.js",
"scripts": { "scripts": {
"test": "tap", "test": "tap",
"snap": "tap", "snap": "tap",
"lint": "eslint \"**/*.{js,cjs,ts,mjs,jsx,tsx}\"", "lint": "npm run eslint",
"postlint": "template-oss-check", "postlint": "template-oss-check",
"lintfix": "npm run lint -- --fix", "lintfix": "npm run eslint -- --fix",
"posttest": "npm run lint", "posttest": "npm run lint",
"template-oss-apply": "template-oss-apply --force" "template-oss-apply": "template-oss-apply --force",
"eslint": "eslint \"**/*.{js,cjs,ts,mjs,jsx,tsx}\""
}, },
"devDependencies": { "devDependencies": {
"@npmcli/eslint-config": "^4.0.0", "@npmcli/eslint-config": "^5.0.0",
"@npmcli/template-oss": "4.22.0", "@npmcli/template-oss": "4.25.1",
"benchmark": "^2.1.4", "benchmark": "^2.1.4",
"tap": "^16.0.0" "tap": "^16.0.0"
}, },
@@ -51,7 +52,7 @@
"author": "GitHub Inc.", "author": "GitHub Inc.",
"templateOSS": { "templateOSS": {
"//@npmcli/template-oss": "This file is partially managed by @npmcli/template-oss. Edits may be overwritten.", "//@npmcli/template-oss": "This file is partially managed by @npmcli/template-oss. Edits may be overwritten.",
"version": "4.22.0", "version": "4.25.1",
"engines": ">=10", "engines": ">=10",
"distPaths": [ "distPaths": [
"classes/", "classes/",
+2
View File
@@ -1,2 +1,4 @@
'use strict'
// XXX remove in v8 or beyond // XXX remove in v8 or beyond
module.exports = require('./index.js') module.exports = require('./index.js')
+2
View File
@@ -1,3 +1,5 @@
'use strict'
// Determine if version is greater than all the versions possible in the range. // Determine if version is greater than all the versions possible in the range.
const outside = require('./outside') const outside = require('./outside')
const gtr = (version, range, options) => outside(version, range, '>', options) const gtr = (version, range, options) => outside(version, range, '>', options)
+2
View File
@@ -1,3 +1,5 @@
'use strict'
const Range = require('../classes/range') const Range = require('../classes/range')
const intersects = (r1, r2, options) => { const intersects = (r1, r2, options) => {
r1 = new Range(r1, options) r1 = new Range(r1, options)
+2
View File
@@ -1,3 +1,5 @@
'use strict'
const outside = require('./outside') const outside = require('./outside')
// Determine if version is less than all the versions possible in the range // Determine if version is less than all the versions possible in the range
const ltr = (version, range, options) => outside(version, range, '<', options) const ltr = (version, range, options) => outside(version, range, '<', options)
+2
View File
@@ -1,3 +1,5 @@
'use strict'
const SemVer = require('../classes/semver') const SemVer = require('../classes/semver')
const Range = require('../classes/range') const Range = require('../classes/range')
+2
View File
@@ -1,3 +1,5 @@
'use strict'
const SemVer = require('../classes/semver') const SemVer = require('../classes/semver')
const Range = require('../classes/range') const Range = require('../classes/range')
const minSatisfying = (versions, range, options) => { const minSatisfying = (versions, range, options) => {
+2
View File
@@ -1,3 +1,5 @@
'use strict'
const SemVer = require('../classes/semver') const SemVer = require('../classes/semver')
const Range = require('../classes/range') const Range = require('../classes/range')
const gt = require('../functions/gt') const gt = require('../functions/gt')
+2
View File
@@ -1,3 +1,5 @@
'use strict'
const SemVer = require('../classes/semver') const SemVer = require('../classes/semver')
const Comparator = require('../classes/comparator') const Comparator = require('../classes/comparator')
const { ANY } = Comparator const { ANY } = Comparator
+2
View File
@@ -1,3 +1,5 @@
'use strict'
// given a set of versions and a range, create a "simplified" range // given a set of versions and a range, create a "simplified" range
// that includes the same versions that the original range does // that includes the same versions that the original range does
// If the original range is shorter than the simplified one, return that. // If the original range is shorter than the simplified one, return that.
+2
View File
@@ -1,3 +1,5 @@
'use strict'
const Range = require('../classes/range.js') const Range = require('../classes/range.js')
const Comparator = require('../classes/comparator.js') const Comparator = require('../classes/comparator.js')
const { ANY } = Comparator const { ANY } = Comparator
+2
View File
@@ -1,3 +1,5 @@
'use strict'
const Range = require('../classes/range') const Range = require('../classes/range')
// Mostly just for testing and legacy API reasons // Mostly just for testing and legacy API reasons
+2
View File
@@ -1,3 +1,5 @@
'use strict'
const Range = require('../classes/range') const Range = require('../classes/range')
const validRange = (range, options) => { const validRange = (range, options) => {
try { try {
+20 -6
View File
@@ -1,11 +1,13 @@
const { EventEmitter } = require('events') const { EventEmitter } = require('events-universal')
const STREAM_DESTROYED = new Error('Stream was destroyed') const STREAM_DESTROYED = new Error('Stream was destroyed')
const PREMATURE_CLOSE = new Error('Premature close') const PREMATURE_CLOSE = new Error('Premature close')
const queueTick = require('queue-tick')
const FIFO = require('fast-fifo') const FIFO = require('fast-fifo')
const TextDecoder = require('text-decoder') const TextDecoder = require('text-decoder')
// if we do a future major, expect queue microtask to be there always, for now a bit defensive
const qmt = typeof queueMicrotask === 'undefined' ? fn => global.process.nextTick(fn) : queueMicrotask
/* eslint-disable no-multi-spaces */ /* eslint-disable no-multi-spaces */
// 29 bits used total (4 from shared, 14 from read, and 11 from write) // 29 bits used total (4 from shared, 14 from read, and 11 from write)
@@ -98,6 +100,7 @@ const READ_READABLE_STATUS = OPEN_STATUS | READ_EMIT_READABLE | READ_QUEUED | RE
const SHOULD_NOT_READ = OPEN_STATUS | READ_ACTIVE | READ_ENDING | READ_DONE | READ_NEEDS_PUSH | READ_READ_AHEAD const SHOULD_NOT_READ = OPEN_STATUS | READ_ACTIVE | READ_ENDING | READ_DONE | READ_NEEDS_PUSH | READ_READ_AHEAD
const READ_BACKPRESSURE_STATUS = DESTROY_STATUS | READ_ENDING | READ_DONE const READ_BACKPRESSURE_STATUS = DESTROY_STATUS | READ_ENDING | READ_DONE
const READ_UPDATE_SYNC_STATUS = READ_UPDATING | OPEN_STATUS | READ_NEXT_TICK | READ_PRIMARY const READ_UPDATE_SYNC_STATUS = READ_UPDATING | OPEN_STATUS | READ_NEXT_TICK | READ_PRIMARY
const READ_NEXT_TICK_OR_OPENING = READ_NEXT_TICK | OPENING
// Combined write state // Combined write state
const WRITE_PRIMARY_STATUS = OPEN_STATUS | WRITE_FINISHING | WRITE_DONE const WRITE_PRIMARY_STATUS = OPEN_STATUS | WRITE_FINISHING | WRITE_DONE
@@ -232,7 +235,7 @@ class WritableState {
updateNextTick () { updateNextTick () {
if ((this.stream._duplexState & WRITE_NEXT_TICK) !== 0) return if ((this.stream._duplexState & WRITE_NEXT_TICK) !== 0) return
this.stream._duplexState |= WRITE_NEXT_TICK this.stream._duplexState |= WRITE_NEXT_TICK
if ((this.stream._duplexState & WRITE_UPDATING) === 0) queueTick(this.afterUpdateNextTick) if ((this.stream._duplexState & WRITE_UPDATING) === 0) qmt(this.afterUpdateNextTick)
} }
} }
@@ -417,10 +420,16 @@ class ReadableState {
else this.updateNextTick() else this.updateNextTick()
} }
updateNextTickIfOpen () {
if ((this.stream._duplexState & READ_NEXT_TICK_OR_OPENING) !== 0) return
this.stream._duplexState |= READ_NEXT_TICK
if ((this.stream._duplexState & READ_UPDATING) === 0) qmt(this.afterUpdateNextTick)
}
updateNextTick () { updateNextTick () {
if ((this.stream._duplexState & READ_NEXT_TICK) !== 0) return if ((this.stream._duplexState & READ_NEXT_TICK) !== 0) return
this.stream._duplexState |= READ_NEXT_TICK this.stream._duplexState |= READ_NEXT_TICK
if ((this.stream._duplexState & READ_UPDATING) === 0) queueTick(this.afterUpdateNextTick) if ((this.stream._duplexState & READ_UPDATING) === 0) qmt(this.afterUpdateNextTick)
} }
} }
@@ -728,12 +737,12 @@ class Readable extends Stream {
} }
push (data) { push (data) {
this._readableState.updateNextTick() this._readableState.updateNextTickIfOpen()
return this._readableState.push(data) return this._readableState.push(data)
} }
unshift (data) { unshift (data) {
this._readableState.updateNextTick() this._readableState.updateNextTickIfOpen()
return this._readableState.unshift(data) return this._readableState.unshift(data)
} }
@@ -1134,6 +1143,10 @@ function isReadStreamx (stream) {
return isStreamx(stream) && stream.readable return isStreamx(stream) && stream.readable
} }
function isDisturbed (stream) {
return (stream._duplexState & OPENING) !== OPENING || (stream._duplexState & ACTIVE_OR_TICKING) !== 0
}
function isTypedArray (data) { function isTypedArray (data) {
return typeof data === 'object' && data !== null && typeof data.byteLength === 'number' return typeof data === 'object' && data !== null && typeof data.byteLength === 'number'
} }
@@ -1159,6 +1172,7 @@ module.exports = {
isStreamx, isStreamx,
isEnded, isEnded,
isFinished, isFinished,
isDisturbed,
getStreamError, getStreamError,
Stream, Stream,
Writable, Writable,
+4 -12
View File
@@ -1,11 +1,11 @@
{ {
"name": "streamx", "name": "streamx",
"version": "2.20.2", "version": "2.23.0",
"description": "An iteration of the Node.js core streams with a series of improvements", "description": "An iteration of the Node.js core streams with a series of improvements",
"main": "index.js", "main": "index.js",
"dependencies": { "dependencies": {
"events-universal": "^1.0.0",
"fast-fifo": "^1.3.2", "fast-fifo": "^1.3.2",
"queue-tick": "^1.0.1",
"text-decoder": "^1.1.0" "text-decoder": "^1.1.0"
}, },
"devDependencies": { "devDependencies": {
@@ -14,20 +14,12 @@
"end-of-stream": "^1.4.4", "end-of-stream": "^1.4.4",
"standard": "^17.0.0" "standard": "^17.0.0"
}, },
"optionalDependencies": {
"bare-events": "^2.2.0"
},
"files": [ "files": [
"index.js" "index.js"
], ],
"imports": {
"events": {
"bare": "bare-events",
"default": "events"
}
},
"scripts": { "scripts": {
"test": "standard && brittle test/*.js" "test": "standard && node test/all.js",
"test:bare": "standard && bare test/all.js"
}, },
"repository": { "repository": {
"type": "git", "type": "git",
+1420 -43
View File
File diff suppressed because it is too large Load Diff
+3 -1
View File
@@ -12,7 +12,9 @@
"eslint-plugin-prettier": "^5.2.1", "eslint-plugin-prettier": "^5.2.1",
"globals": "^15.9.0", "globals": "^15.9.0",
"less": "^4.1.3", "less": "^4.1.3",
"prettier": "^3.3.3" "prettier": "^3.3.3",
"puppeteer": "^24.29.0",
"turndown": "^7.2.2"
}, },
"author": "LeRatierBretonnien", "author": "LeRatierBretonnien",
"license": "MITs", "license": "MITs",
+9
View File
@@ -0,0 +1,9 @@
<!doctype html><html lang="en"><head><meta charset="utf-8"/><meta name="viewport" content="width=device-width,initial-scale=1"/><style class="preload">html,body{margin:0;height:100%}body.theme-light{background-color:#fff;color:#222}body.theme-dark{background-color:#1e1e1e;color:#dadada}.preload{padding:20px;white-space:pre-wrap;overflow-wrap:break-word}@keyframes rotate{from{transform:rotate(0)}to{transform:rotate(360deg)}}</style><base href="https://publish.obsidian.md"><script defer="defer" src="/app.js?78c771386e6858fb0754"></script><link rel="preload" href="/app.css?78c771386e6858fb0754" as="style" onload="this.onload=null;this.rel='stylesheet'"><noscript><link rel="stylesheet" href="/app.css?78c771386e6858fb0754"></noscript><title>Prism - Living World of Verum</title><link rel="preload" href="https://publish-01.obsidian.md/access/e1f3ad20aef4c3bead5bc366246b3900/publish.css" as="style" onload="this.onload=null;this.rel='stylesheet'"><noscript><link rel="stylesheet" href="https://publish-01.obsidian.md/access/e1f3ad20aef4c3bead5bc366246b3900/publish.css"></noscript><link rel="icon" type="image/x-icon" sizes="32x32" href="https://publish-01.obsidian.md/access/e1f3ad20aef4c3bead5bc366246b3900/Images/Misc/Favicon/favicon-32x32.png"><link rel="icon" type="image/x-icon" sizes="128x128" href="https://publish-01.obsidian.md/access/e1f3ad20aef4c3bead5bc366246b3900/Images/Misc/Favicon/favicon-128x128.png"><link rel="icon" type="image/x-icon" sizes="152x152" href="https://publish-01.obsidian.md/access/e1f3ad20aef4c3bead5bc366246b3900/Images/Misc/Favicon/favicon-152x152.png"><link rel="icon" type="image/x-icon" sizes="167x167" href="https://publish-01.obsidian.md/access/e1f3ad20aef4c3bead5bc366246b3900/Images/Misc/Favicon/favicon-167x167.png"><link rel="icon" type="image/x-icon" sizes="180x180" href="https://publish-01.obsidian.md/access/e1f3ad20aef4c3bead5bc366246b3900/Images/Misc/Favicon/favicon-180x180.png"><link rel="icon" type="image/x-icon" sizes="192x192" href="https://publish-01.obsidian.md/access/e1f3ad20aef4c3bead5bc366246b3900/Images/Misc/Favicon/favicon-192x192.png"><link rel="icon" type="image/x-icon" sizes="196x196" href="https://publish-01.obsidian.md/access/e1f3ad20aef4c3bead5bc366246b3900/Images/Misc/Favicon/favicon-196x196.png"><script type="text/javascript">
window.siteInfo={"uid":"e1f3ad20aef4c3bead5bc366246b3900","host":"publish-01.obsidian.md","status":"active","slug":null,"redirect":1,"customurl":"corvanis.wiki"};
(function(){
let f = u=>u&&fetch(u,{credentials: "include"});
window.preloadOptions=f("https://publish-01.obsidian.md/options/e1f3ad20aef4c3bead5bc366246b3900");
window.preloadCache=f("https://publish-01.obsidian.md/cache/e1f3ad20aef4c3bead5bc366246b3900");
window.preloadPage=f("https://publish-01.obsidian.md/access/e1f3ad20aef4c3bead5bc366246b3900/Prism%20(Testing)/Prism.md");
})();
</script><meta name="description" content="Prism - Living World of Verum"><meta property="og:description" content="Prism - Living World of Verum"></head><body class="theme-dark"><div class="preload" style="text-align:center"><svg style="width:50px" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 100 100"><path style="transform-origin:50px 50px;animation:1s linear infinite rotate" fill="currentColor" d="M73,50c0-12.7-10.3-23-23-23S27,37.3,27,50 M30.9,50c0-10.5,8.5-19.1,19.1-19.1S69.1,39.5,69.1,50"/></svg></div><script type="text/javascript">(function(){let t=localStorage.getItem('site-theme'),cl=document.body.classList;if(t&&t!=='dark') {cl.remove('theme-dark');cl.add('theme-'+t)}})();</script></body></html>
@@ -0,0 +1,9 @@
<!doctype html><html lang="en"><head><meta charset="utf-8"/><meta name="viewport" content="width=device-width,initial-scale=1"/><style class="preload">html,body{margin:0;height:100%}body.theme-light{background-color:#fff;color:#222}body.theme-dark{background-color:#1e1e1e;color:#dadada}.preload{padding:20px;white-space:pre-wrap;overflow-wrap:break-word}@keyframes rotate{from{transform:rotate(0)}to{transform:rotate(360deg)}}</style><base href="https://publish.obsidian.md"><script defer="defer" src="/app.js?78c771386e6858fb0754"></script><link rel="preload" href="/app.css?78c771386e6858fb0754" as="style" onload="this.onload=null;this.rel='stylesheet'"><noscript><link rel="stylesheet" href="/app.css?78c771386e6858fb0754"></noscript><title>Armor - Living World of Verum</title><link rel="preload" href="https://publish-01.obsidian.md/access/e1f3ad20aef4c3bead5bc366246b3900/publish.css" as="style" onload="this.onload=null;this.rel='stylesheet'"><noscript><link rel="stylesheet" href="https://publish-01.obsidian.md/access/e1f3ad20aef4c3bead5bc366246b3900/publish.css"></noscript><link rel="icon" type="image/x-icon" sizes="32x32" href="https://publish-01.obsidian.md/access/e1f3ad20aef4c3bead5bc366246b3900/Images/Misc/Favicon/favicon-32x32.png"><link rel="icon" type="image/x-icon" sizes="128x128" href="https://publish-01.obsidian.md/access/e1f3ad20aef4c3bead5bc366246b3900/Images/Misc/Favicon/favicon-128x128.png"><link rel="icon" type="image/x-icon" sizes="152x152" href="https://publish-01.obsidian.md/access/e1f3ad20aef4c3bead5bc366246b3900/Images/Misc/Favicon/favicon-152x152.png"><link rel="icon" type="image/x-icon" sizes="167x167" href="https://publish-01.obsidian.md/access/e1f3ad20aef4c3bead5bc366246b3900/Images/Misc/Favicon/favicon-167x167.png"><link rel="icon" type="image/x-icon" sizes="180x180" href="https://publish-01.obsidian.md/access/e1f3ad20aef4c3bead5bc366246b3900/Images/Misc/Favicon/favicon-180x180.png"><link rel="icon" type="image/x-icon" sizes="192x192" href="https://publish-01.obsidian.md/access/e1f3ad20aef4c3bead5bc366246b3900/Images/Misc/Favicon/favicon-192x192.png"><link rel="icon" type="image/x-icon" sizes="196x196" href="https://publish-01.obsidian.md/access/e1f3ad20aef4c3bead5bc366246b3900/Images/Misc/Favicon/favicon-196x196.png"><script type="text/javascript">
window.siteInfo={"uid":"e1f3ad20aef4c3bead5bc366246b3900","host":"publish-01.obsidian.md","status":"active","slug":null,"redirect":1,"customurl":"corvanis.wiki"};
(function(){
let f = u=>u&&fetch(u,{credentials: "include"});
window.preloadOptions=f("https://publish-01.obsidian.md/options/e1f3ad20aef4c3bead5bc366246b3900");
window.preloadCache=f("https://publish-01.obsidian.md/cache/e1f3ad20aef4c3bead5bc366246b3900");
window.preloadPage=f("https://publish-01.obsidian.md/access/e1f3ad20aef4c3bead5bc366246b3900/Prism%20(Testing)/Prism/Armor.md");
})();
</script><meta name="description" content="Armor - Living World of Verum"><meta property="og:description" content="Armor - Living World of Verum"></head><body class="theme-dark"><div class="preload" style="text-align:center"><svg style="width:50px" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 100 100"><path style="transform-origin:50px 50px;animation:1s linear infinite rotate" fill="currentColor" d="M73,50c0-12.7-10.3-23-23-23S27,37.3,27,50 M30.9,50c0-10.5,8.5-19.1,19.1-19.1S69.1,39.5,69.1,50"/></svg></div><script type="text/javascript">(function(){let t=localStorage.getItem('site-theme'),cl=document.body.classList;if(t&&t!=='dark') {cl.remove('theme-dark');cl.add('theme-'+t)}})();</script></body></html>
@@ -0,0 +1,9 @@
<!doctype html><html lang="en"><head><meta charset="utf-8"/><meta name="viewport" content="width=device-width,initial-scale=1"/><style class="preload">html,body{margin:0;height:100%}body.theme-light{background-color:#fff;color:#222}body.theme-dark{background-color:#1e1e1e;color:#dadada}.preload{padding:20px;white-space:pre-wrap;overflow-wrap:break-word}@keyframes rotate{from{transform:rotate(0)}to{transform:rotate(360deg)}}</style><base href="https://publish.obsidian.md"><script defer="defer" src="/app.js?78c771386e6858fb0754"></script><link rel="preload" href="/app.css?78c771386e6858fb0754" as="style" onload="this.onload=null;this.rel='stylesheet'"><noscript><link rel="stylesheet" href="/app.css?78c771386e6858fb0754"></noscript><title>Bestiary - Living World of Verum</title><link rel="preload" href="https://publish-01.obsidian.md/access/e1f3ad20aef4c3bead5bc366246b3900/publish.css" as="style" onload="this.onload=null;this.rel='stylesheet'"><noscript><link rel="stylesheet" href="https://publish-01.obsidian.md/access/e1f3ad20aef4c3bead5bc366246b3900/publish.css"></noscript><link rel="icon" type="image/x-icon" sizes="32x32" href="https://publish-01.obsidian.md/access/e1f3ad20aef4c3bead5bc366246b3900/Images/Misc/Favicon/favicon-32x32.png"><link rel="icon" type="image/x-icon" sizes="128x128" href="https://publish-01.obsidian.md/access/e1f3ad20aef4c3bead5bc366246b3900/Images/Misc/Favicon/favicon-128x128.png"><link rel="icon" type="image/x-icon" sizes="152x152" href="https://publish-01.obsidian.md/access/e1f3ad20aef4c3bead5bc366246b3900/Images/Misc/Favicon/favicon-152x152.png"><link rel="icon" type="image/x-icon" sizes="167x167" href="https://publish-01.obsidian.md/access/e1f3ad20aef4c3bead5bc366246b3900/Images/Misc/Favicon/favicon-167x167.png"><link rel="icon" type="image/x-icon" sizes="180x180" href="https://publish-01.obsidian.md/access/e1f3ad20aef4c3bead5bc366246b3900/Images/Misc/Favicon/favicon-180x180.png"><link rel="icon" type="image/x-icon" sizes="192x192" href="https://publish-01.obsidian.md/access/e1f3ad20aef4c3bead5bc366246b3900/Images/Misc/Favicon/favicon-192x192.png"><link rel="icon" type="image/x-icon" sizes="196x196" href="https://publish-01.obsidian.md/access/e1f3ad20aef4c3bead5bc366246b3900/Images/Misc/Favicon/favicon-196x196.png"><script type="text/javascript">
window.siteInfo={"uid":"e1f3ad20aef4c3bead5bc366246b3900","host":"publish-01.obsidian.md","status":"active","slug":null,"redirect":1,"customurl":"corvanis.wiki"};
(function(){
let f = u=>u&&fetch(u,{credentials: "include"});
window.preloadOptions=f("https://publish-01.obsidian.md/options/e1f3ad20aef4c3bead5bc366246b3900");
window.preloadCache=f("https://publish-01.obsidian.md/cache/e1f3ad20aef4c3bead5bc366246b3900");
window.preloadPage=f("https://publish-01.obsidian.md/access/e1f3ad20aef4c3bead5bc366246b3900/Prism%20(Testing)/Prism/Bestiary.md");
})();
</script><meta name="description" content="Bestiary - Living World of Verum"><meta property="og:description" content="Bestiary - Living World of Verum"></head><body class="theme-dark"><div class="preload" style="text-align:center"><svg style="width:50px" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 100 100"><path style="transform-origin:50px 50px;animation:1s linear infinite rotate" fill="currentColor" d="M73,50c0-12.7-10.3-23-23-23S27,37.3,27,50 M30.9,50c0-10.5,8.5-19.1,19.1-19.1S69.1,39.5,69.1,50"/></svg></div><script type="text/javascript">(function(){let t=localStorage.getItem('site-theme'),cl=document.body.classList;if(t&&t!=='dark') {cl.remove('theme-dark');cl.add('theme-'+t)}})();</script></body></html>
@@ -0,0 +1,9 @@
<!doctype html><html lang="en"><head><meta charset="utf-8"/><meta name="viewport" content="width=device-width,initial-scale=1"/><style class="preload">html,body{margin:0;height:100%}body.theme-light{background-color:#fff;color:#222}body.theme-dark{background-color:#1e1e1e;color:#dadada}.preload{padding:20px;white-space:pre-wrap;overflow-wrap:break-word}@keyframes rotate{from{transform:rotate(0)}to{transform:rotate(360deg)}}</style><base href="https://publish.obsidian.md"><script defer="defer" src="/app.js?78c771386e6858fb0754"></script><link rel="preload" href="/app.css?78c771386e6858fb0754" as="style" onload="this.onload=null;this.rel='stylesheet'"><noscript><link rel="stylesheet" href="/app.css?78c771386e6858fb0754"></noscript><title>Character Creation - Living World of Verum</title><link rel="preload" href="https://publish-01.obsidian.md/access/e1f3ad20aef4c3bead5bc366246b3900/publish.css" as="style" onload="this.onload=null;this.rel='stylesheet'"><noscript><link rel="stylesheet" href="https://publish-01.obsidian.md/access/e1f3ad20aef4c3bead5bc366246b3900/publish.css"></noscript><link rel="icon" type="image/x-icon" sizes="32x32" href="https://publish-01.obsidian.md/access/e1f3ad20aef4c3bead5bc366246b3900/Images/Misc/Favicon/favicon-32x32.png"><link rel="icon" type="image/x-icon" sizes="128x128" href="https://publish-01.obsidian.md/access/e1f3ad20aef4c3bead5bc366246b3900/Images/Misc/Favicon/favicon-128x128.png"><link rel="icon" type="image/x-icon" sizes="152x152" href="https://publish-01.obsidian.md/access/e1f3ad20aef4c3bead5bc366246b3900/Images/Misc/Favicon/favicon-152x152.png"><link rel="icon" type="image/x-icon" sizes="167x167" href="https://publish-01.obsidian.md/access/e1f3ad20aef4c3bead5bc366246b3900/Images/Misc/Favicon/favicon-167x167.png"><link rel="icon" type="image/x-icon" sizes="180x180" href="https://publish-01.obsidian.md/access/e1f3ad20aef4c3bead5bc366246b3900/Images/Misc/Favicon/favicon-180x180.png"><link rel="icon" type="image/x-icon" sizes="192x192" href="https://publish-01.obsidian.md/access/e1f3ad20aef4c3bead5bc366246b3900/Images/Misc/Favicon/favicon-192x192.png"><link rel="icon" type="image/x-icon" sizes="196x196" href="https://publish-01.obsidian.md/access/e1f3ad20aef4c3bead5bc366246b3900/Images/Misc/Favicon/favicon-196x196.png"><script type="text/javascript">
window.siteInfo={"uid":"e1f3ad20aef4c3bead5bc366246b3900","host":"publish-01.obsidian.md","status":"active","slug":null,"redirect":1,"customurl":"corvanis.wiki"};
(function(){
let f = u=>u&&fetch(u,{credentials: "include"});
window.preloadOptions=f("https://publish-01.obsidian.md/options/e1f3ad20aef4c3bead5bc366246b3900");
window.preloadCache=f("https://publish-01.obsidian.md/cache/e1f3ad20aef4c3bead5bc366246b3900");
window.preloadPage=f("https://publish-01.obsidian.md/access/e1f3ad20aef4c3bead5bc366246b3900/Prism%20(Testing)/Prism/Character%20Creation.md");
})();
</script><meta name="description" content="Character Creation - Living World of Verum"><meta property="og:description" content="Character Creation - Living World of Verum"></head><body class="theme-dark"><div class="preload" style="text-align:center"><svg style="width:50px" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 100 100"><path style="transform-origin:50px 50px;animation:1s linear infinite rotate" fill="currentColor" d="M73,50c0-12.7-10.3-23-23-23S27,37.3,27,50 M30.9,50c0-10.5,8.5-19.1,19.1-19.1S69.1,39.5,69.1,50"/></svg></div><script type="text/javascript">(function(){let t=localStorage.getItem('site-theme'),cl=document.body.classList;if(t&&t!=='dark') {cl.remove('theme-dark');cl.add('theme-'+t)}})();</script></body></html>
@@ -0,0 +1,9 @@
<!doctype html><html lang="en"><head><meta charset="utf-8"/><meta name="viewport" content="width=device-width,initial-scale=1"/><style class="preload">html,body{margin:0;height:100%}body.theme-light{background-color:#fff;color:#222}body.theme-dark{background-color:#1e1e1e;color:#dadada}.preload{padding:20px;white-space:pre-wrap;overflow-wrap:break-word}@keyframes rotate{from{transform:rotate(0)}to{transform:rotate(360deg)}}</style><base href="https://publish.obsidian.md"><script defer="defer" src="/app.js?78c771386e6858fb0754"></script><link rel="preload" href="/app.css?78c771386e6858fb0754" as="style" onload="this.onload=null;this.rel='stylesheet'"><noscript><link rel="stylesheet" href="/app.css?78c771386e6858fb0754"></noscript><title>Combat - Living World of Verum</title><link rel="preload" href="https://publish-01.obsidian.md/access/e1f3ad20aef4c3bead5bc366246b3900/publish.css" as="style" onload="this.onload=null;this.rel='stylesheet'"><noscript><link rel="stylesheet" href="https://publish-01.obsidian.md/access/e1f3ad20aef4c3bead5bc366246b3900/publish.css"></noscript><link rel="icon" type="image/x-icon" sizes="32x32" href="https://publish-01.obsidian.md/access/e1f3ad20aef4c3bead5bc366246b3900/Images/Misc/Favicon/favicon-32x32.png"><link rel="icon" type="image/x-icon" sizes="128x128" href="https://publish-01.obsidian.md/access/e1f3ad20aef4c3bead5bc366246b3900/Images/Misc/Favicon/favicon-128x128.png"><link rel="icon" type="image/x-icon" sizes="152x152" href="https://publish-01.obsidian.md/access/e1f3ad20aef4c3bead5bc366246b3900/Images/Misc/Favicon/favicon-152x152.png"><link rel="icon" type="image/x-icon" sizes="167x167" href="https://publish-01.obsidian.md/access/e1f3ad20aef4c3bead5bc366246b3900/Images/Misc/Favicon/favicon-167x167.png"><link rel="icon" type="image/x-icon" sizes="180x180" href="https://publish-01.obsidian.md/access/e1f3ad20aef4c3bead5bc366246b3900/Images/Misc/Favicon/favicon-180x180.png"><link rel="icon" type="image/x-icon" sizes="192x192" href="https://publish-01.obsidian.md/access/e1f3ad20aef4c3bead5bc366246b3900/Images/Misc/Favicon/favicon-192x192.png"><link rel="icon" type="image/x-icon" sizes="196x196" href="https://publish-01.obsidian.md/access/e1f3ad20aef4c3bead5bc366246b3900/Images/Misc/Favicon/favicon-196x196.png"><script type="text/javascript">
window.siteInfo={"uid":"e1f3ad20aef4c3bead5bc366246b3900","host":"publish-01.obsidian.md","status":"active","slug":null,"redirect":1,"customurl":"corvanis.wiki"};
(function(){
let f = u=>u&&fetch(u,{credentials: "include"});
window.preloadOptions=f("https://publish-01.obsidian.md/options/e1f3ad20aef4c3bead5bc366246b3900");
window.preloadCache=f("https://publish-01.obsidian.md/cache/e1f3ad20aef4c3bead5bc366246b3900");
window.preloadPage=f("https://publish-01.obsidian.md/access/e1f3ad20aef4c3bead5bc366246b3900/Prism%20(Testing)/Prism/Combat.md");
})();
</script><meta name="description" content="Combat - Living World of Verum"><meta property="og:description" content="Combat - Living World of Verum"></head><body class="theme-dark"><div class="preload" style="text-align:center"><svg style="width:50px" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 100 100"><path style="transform-origin:50px 50px;animation:1s linear infinite rotate" fill="currentColor" d="M73,50c0-12.7-10.3-23-23-23S27,37.3,27,50 M30.9,50c0-10.5,8.5-19.1,19.1-19.1S69.1,39.5,69.1,50"/></svg></div><script type="text/javascript">(function(){let t=localStorage.getItem('site-theme'),cl=document.body.classList;if(t&&t!=='dark') {cl.remove('theme-dark');cl.add('theme-'+t)}})();</script></body></html>
@@ -0,0 +1,9 @@
<!doctype html><html lang="en"><head><meta charset="utf-8"/><meta name="viewport" content="width=device-width,initial-scale=1"/><style class="preload">html,body{margin:0;height:100%}body.theme-light{background-color:#fff;color:#222}body.theme-dark{background-color:#1e1e1e;color:#dadada}.preload{padding:20px;white-space:pre-wrap;overflow-wrap:break-word}@keyframes rotate{from{transform:rotate(0)}to{transform:rotate(360deg)}}</style><base href="https://publish.obsidian.md"><script defer="defer" src="/app.js?78c771386e6858fb0754"></script><link rel="preload" href="/app.css?78c771386e6858fb0754" as="style" onload="this.onload=null;this.rel='stylesheet'"><noscript><link rel="stylesheet" href="/app.css?78c771386e6858fb0754"></noscript><title>Equipment - Living World of Verum</title><link rel="preload" href="https://publish-01.obsidian.md/access/e1f3ad20aef4c3bead5bc366246b3900/publish.css" as="style" onload="this.onload=null;this.rel='stylesheet'"><noscript><link rel="stylesheet" href="https://publish-01.obsidian.md/access/e1f3ad20aef4c3bead5bc366246b3900/publish.css"></noscript><link rel="icon" type="image/x-icon" sizes="32x32" href="https://publish-01.obsidian.md/access/e1f3ad20aef4c3bead5bc366246b3900/Images/Misc/Favicon/favicon-32x32.png"><link rel="icon" type="image/x-icon" sizes="128x128" href="https://publish-01.obsidian.md/access/e1f3ad20aef4c3bead5bc366246b3900/Images/Misc/Favicon/favicon-128x128.png"><link rel="icon" type="image/x-icon" sizes="152x152" href="https://publish-01.obsidian.md/access/e1f3ad20aef4c3bead5bc366246b3900/Images/Misc/Favicon/favicon-152x152.png"><link rel="icon" type="image/x-icon" sizes="167x167" href="https://publish-01.obsidian.md/access/e1f3ad20aef4c3bead5bc366246b3900/Images/Misc/Favicon/favicon-167x167.png"><link rel="icon" type="image/x-icon" sizes="180x180" href="https://publish-01.obsidian.md/access/e1f3ad20aef4c3bead5bc366246b3900/Images/Misc/Favicon/favicon-180x180.png"><link rel="icon" type="image/x-icon" sizes="192x192" href="https://publish-01.obsidian.md/access/e1f3ad20aef4c3bead5bc366246b3900/Images/Misc/Favicon/favicon-192x192.png"><link rel="icon" type="image/x-icon" sizes="196x196" href="https://publish-01.obsidian.md/access/e1f3ad20aef4c3bead5bc366246b3900/Images/Misc/Favicon/favicon-196x196.png"><script type="text/javascript">
window.siteInfo={"uid":"e1f3ad20aef4c3bead5bc366246b3900","host":"publish-01.obsidian.md","status":"active","slug":null,"redirect":1,"customurl":"corvanis.wiki"};
(function(){
let f = u=>u&&fetch(u,{credentials: "include"});
window.preloadOptions=f("https://publish-01.obsidian.md/options/e1f3ad20aef4c3bead5bc366246b3900");
window.preloadCache=f("https://publish-01.obsidian.md/cache/e1f3ad20aef4c3bead5bc366246b3900");
window.preloadPage=f("https://publish-01.obsidian.md/access/e1f3ad20aef4c3bead5bc366246b3900/Prism%20(Testing)/Prism/Equipment.md");
})();
</script><meta name="description" content="Equipment - Living World of Verum"><meta property="og:description" content="Equipment - Living World of Verum"></head><body class="theme-dark"><div class="preload" style="text-align:center"><svg style="width:50px" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 100 100"><path style="transform-origin:50px 50px;animation:1s linear infinite rotate" fill="currentColor" d="M73,50c0-12.7-10.3-23-23-23S27,37.3,27,50 M30.9,50c0-10.5,8.5-19.1,19.1-19.1S69.1,39.5,69.1,50"/></svg></div><script type="text/javascript">(function(){let t=localStorage.getItem('site-theme'),cl=document.body.classList;if(t&&t!=='dark') {cl.remove('theme-dark');cl.add('theme-'+t)}})();</script></body></html>
@@ -0,0 +1,9 @@
<!doctype html><html lang="en"><head><meta charset="utf-8"/><meta name="viewport" content="width=device-width,initial-scale=1"/><style class="preload">html,body{margin:0;height:100%}body.theme-light{background-color:#fff;color:#222}body.theme-dark{background-color:#1e1e1e;color:#dadada}.preload{padding:20px;white-space:pre-wrap;overflow-wrap:break-word}@keyframes rotate{from{transform:rotate(0)}to{transform:rotate(360deg)}}</style><base href="https://publish.obsidian.md"><script defer="defer" src="/app.js?78c771386e6858fb0754"></script><link rel="preload" href="/app.css?78c771386e6858fb0754" as="style" onload="this.onload=null;this.rel='stylesheet'"><noscript><link rel="stylesheet" href="/app.css?78c771386e6858fb0754"></noscript><title>Magic - Living World of Verum</title><link rel="preload" href="https://publish-01.obsidian.md/access/e1f3ad20aef4c3bead5bc366246b3900/publish.css" as="style" onload="this.onload=null;this.rel='stylesheet'"><noscript><link rel="stylesheet" href="https://publish-01.obsidian.md/access/e1f3ad20aef4c3bead5bc366246b3900/publish.css"></noscript><link rel="icon" type="image/x-icon" sizes="32x32" href="https://publish-01.obsidian.md/access/e1f3ad20aef4c3bead5bc366246b3900/Images/Misc/Favicon/favicon-32x32.png"><link rel="icon" type="image/x-icon" sizes="128x128" href="https://publish-01.obsidian.md/access/e1f3ad20aef4c3bead5bc366246b3900/Images/Misc/Favicon/favicon-128x128.png"><link rel="icon" type="image/x-icon" sizes="152x152" href="https://publish-01.obsidian.md/access/e1f3ad20aef4c3bead5bc366246b3900/Images/Misc/Favicon/favicon-152x152.png"><link rel="icon" type="image/x-icon" sizes="167x167" href="https://publish-01.obsidian.md/access/e1f3ad20aef4c3bead5bc366246b3900/Images/Misc/Favicon/favicon-167x167.png"><link rel="icon" type="image/x-icon" sizes="180x180" href="https://publish-01.obsidian.md/access/e1f3ad20aef4c3bead5bc366246b3900/Images/Misc/Favicon/favicon-180x180.png"><link rel="icon" type="image/x-icon" sizes="192x192" href="https://publish-01.obsidian.md/access/e1f3ad20aef4c3bead5bc366246b3900/Images/Misc/Favicon/favicon-192x192.png"><link rel="icon" type="image/x-icon" sizes="196x196" href="https://publish-01.obsidian.md/access/e1f3ad20aef4c3bead5bc366246b3900/Images/Misc/Favicon/favicon-196x196.png"><script type="text/javascript">
window.siteInfo={"uid":"e1f3ad20aef4c3bead5bc366246b3900","host":"publish-01.obsidian.md","status":"active","slug":null,"redirect":1,"customurl":"corvanis.wiki"};
(function(){
let f = u=>u&&fetch(u,{credentials: "include"});
window.preloadOptions=f("https://publish-01.obsidian.md/options/e1f3ad20aef4c3bead5bc366246b3900");
window.preloadCache=f("https://publish-01.obsidian.md/cache/e1f3ad20aef4c3bead5bc366246b3900");
window.preloadPage=f("https://publish-01.obsidian.md/access/e1f3ad20aef4c3bead5bc366246b3900/Prism%20(Testing)/Prism/Magic.md");
})();
</script><meta name="description" content="Magic - Living World of Verum"><meta property="og:description" content="Magic - Living World of Verum"></head><body class="theme-dark"><div class="preload" style="text-align:center"><svg style="width:50px" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 100 100"><path style="transform-origin:50px 50px;animation:1s linear infinite rotate" fill="currentColor" d="M73,50c0-12.7-10.3-23-23-23S27,37.3,27,50 M30.9,50c0-10.5,8.5-19.1,19.1-19.1S69.1,39.5,69.1,50"/></svg></div><script type="text/javascript">(function(){let t=localStorage.getItem('site-theme'),cl=document.body.classList;if(t&&t!=='dark') {cl.remove('theme-dark');cl.add('theme-'+t)}})();</script></body></html>
@@ -0,0 +1,9 @@
<!doctype html><html lang="en"><head><meta charset="utf-8"/><meta name="viewport" content="width=device-width,initial-scale=1"/><style class="preload">html,body{margin:0;height:100%}body.theme-light{background-color:#fff;color:#222}body.theme-dark{background-color:#1e1e1e;color:#dadada}.preload{padding:20px;white-space:pre-wrap;overflow-wrap:break-word}@keyframes rotate{from{transform:rotate(0)}to{transform:rotate(360deg)}}</style><base href="https://publish.obsidian.md"><script defer="defer" src="/app.js?78c771386e6858fb0754"></script><link rel="preload" href="/app.css?78c771386e6858fb0754" as="style" onload="this.onload=null;this.rel='stylesheet'"><noscript><link rel="stylesheet" href="/app.css?78c771386e6858fb0754"></noscript><title>Miracles - Living World of Verum</title><link rel="preload" href="https://publish-01.obsidian.md/access/e1f3ad20aef4c3bead5bc366246b3900/publish.css" as="style" onload="this.onload=null;this.rel='stylesheet'"><noscript><link rel="stylesheet" href="https://publish-01.obsidian.md/access/e1f3ad20aef4c3bead5bc366246b3900/publish.css"></noscript><link rel="icon" type="image/x-icon" sizes="32x32" href="https://publish-01.obsidian.md/access/e1f3ad20aef4c3bead5bc366246b3900/Images/Misc/Favicon/favicon-32x32.png"><link rel="icon" type="image/x-icon" sizes="128x128" href="https://publish-01.obsidian.md/access/e1f3ad20aef4c3bead5bc366246b3900/Images/Misc/Favicon/favicon-128x128.png"><link rel="icon" type="image/x-icon" sizes="152x152" href="https://publish-01.obsidian.md/access/e1f3ad20aef4c3bead5bc366246b3900/Images/Misc/Favicon/favicon-152x152.png"><link rel="icon" type="image/x-icon" sizes="167x167" href="https://publish-01.obsidian.md/access/e1f3ad20aef4c3bead5bc366246b3900/Images/Misc/Favicon/favicon-167x167.png"><link rel="icon" type="image/x-icon" sizes="180x180" href="https://publish-01.obsidian.md/access/e1f3ad20aef4c3bead5bc366246b3900/Images/Misc/Favicon/favicon-180x180.png"><link rel="icon" type="image/x-icon" sizes="192x192" href="https://publish-01.obsidian.md/access/e1f3ad20aef4c3bead5bc366246b3900/Images/Misc/Favicon/favicon-192x192.png"><link rel="icon" type="image/x-icon" sizes="196x196" href="https://publish-01.obsidian.md/access/e1f3ad20aef4c3bead5bc366246b3900/Images/Misc/Favicon/favicon-196x196.png"><script type="text/javascript">
window.siteInfo={"uid":"e1f3ad20aef4c3bead5bc366246b3900","host":"publish-01.obsidian.md","status":"active","slug":null,"redirect":1,"customurl":"corvanis.wiki"};
(function(){
let f = u=>u&&fetch(u,{credentials: "include"});
window.preloadOptions=f("https://publish-01.obsidian.md/options/e1f3ad20aef4c3bead5bc366246b3900");
window.preloadCache=f("https://publish-01.obsidian.md/cache/e1f3ad20aef4c3bead5bc366246b3900");
window.preloadPage=f("https://publish-01.obsidian.md/access/e1f3ad20aef4c3bead5bc366246b3900/Prism%20(Testing)/Prism/Miracles.md");
})();
</script><meta name="description" content="Miracles - Living World of Verum"><meta property="og:description" content="Miracles - Living World of Verum"></head><body class="theme-dark"><div class="preload" style="text-align:center"><svg style="width:50px" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 100 100"><path style="transform-origin:50px 50px;animation:1s linear infinite rotate" fill="currentColor" d="M73,50c0-12.7-10.3-23-23-23S27,37.3,27,50 M30.9,50c0-10.5,8.5-19.1,19.1-19.1S69.1,39.5,69.1,50"/></svg></div><script type="text/javascript">(function(){let t=localStorage.getItem('site-theme'),cl=document.body.classList;if(t&&t!=='dark') {cl.remove('theme-dark');cl.add('theme-'+t)}})();</script></body></html>
@@ -0,0 +1,9 @@
<!doctype html><html lang="en"><head><meta charset="utf-8"/><meta name="viewport" content="width=device-width,initial-scale=1"/><style class="preload">html,body{margin:0;height:100%}body.theme-light{background-color:#fff;color:#222}body.theme-dark{background-color:#1e1e1e;color:#dadada}.preload{padding:20px;white-space:pre-wrap;overflow-wrap:break-word}@keyframes rotate{from{transform:rotate(0)}to{transform:rotate(360deg)}}</style><base href="https://publish.obsidian.md"><script defer="defer" src="/app.js?78c771386e6858fb0754"></script><link rel="preload" href="/app.css?78c771386e6858fb0754" as="style" onload="this.onload=null;this.rel='stylesheet'"><noscript><link rel="stylesheet" href="/app.css?78c771386e6858fb0754"></noscript><title>Monsters - Living World of Verum</title><link rel="preload" href="https://publish-01.obsidian.md/access/e1f3ad20aef4c3bead5bc366246b3900/publish.css" as="style" onload="this.onload=null;this.rel='stylesheet'"><noscript><link rel="stylesheet" href="https://publish-01.obsidian.md/access/e1f3ad20aef4c3bead5bc366246b3900/publish.css"></noscript><link rel="icon" type="image/x-icon" sizes="32x32" href="https://publish-01.obsidian.md/access/e1f3ad20aef4c3bead5bc366246b3900/Images/Misc/Favicon/favicon-32x32.png"><link rel="icon" type="image/x-icon" sizes="128x128" href="https://publish-01.obsidian.md/access/e1f3ad20aef4c3bead5bc366246b3900/Images/Misc/Favicon/favicon-128x128.png"><link rel="icon" type="image/x-icon" sizes="152x152" href="https://publish-01.obsidian.md/access/e1f3ad20aef4c3bead5bc366246b3900/Images/Misc/Favicon/favicon-152x152.png"><link rel="icon" type="image/x-icon" sizes="167x167" href="https://publish-01.obsidian.md/access/e1f3ad20aef4c3bead5bc366246b3900/Images/Misc/Favicon/favicon-167x167.png"><link rel="icon" type="image/x-icon" sizes="180x180" href="https://publish-01.obsidian.md/access/e1f3ad20aef4c3bead5bc366246b3900/Images/Misc/Favicon/favicon-180x180.png"><link rel="icon" type="image/x-icon" sizes="192x192" href="https://publish-01.obsidian.md/access/e1f3ad20aef4c3bead5bc366246b3900/Images/Misc/Favicon/favicon-192x192.png"><link rel="icon" type="image/x-icon" sizes="196x196" href="https://publish-01.obsidian.md/access/e1f3ad20aef4c3bead5bc366246b3900/Images/Misc/Favicon/favicon-196x196.png"><script type="text/javascript">
window.siteInfo={"uid":"e1f3ad20aef4c3bead5bc366246b3900","host":"publish-01.obsidian.md","status":"active","slug":null,"redirect":1,"customurl":"corvanis.wiki"};
(function(){
let f = u=>u&&fetch(u,{credentials: "include"});
window.preloadOptions=f("https://publish-01.obsidian.md/options/e1f3ad20aef4c3bead5bc366246b3900");
window.preloadCache=f("https://publish-01.obsidian.md/cache/e1f3ad20aef4c3bead5bc366246b3900");
window.preloadPage=f("https://publish-01.obsidian.md/access/e1f3ad20aef4c3bead5bc366246b3900/Prism%20(Testing)/Prism/Monsters.md");
})();
</script><meta name="description" content="Monsters - Living World of Verum"><meta property="og:description" content="Monsters - Living World of Verum"></head><body class="theme-dark"><div class="preload" style="text-align:center"><svg style="width:50px" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 100 100"><path style="transform-origin:50px 50px;animation:1s linear infinite rotate" fill="currentColor" d="M73,50c0-12.7-10.3-23-23-23S27,37.3,27,50 M30.9,50c0-10.5,8.5-19.1,19.1-19.1S69.1,39.5,69.1,50"/></svg></div><script type="text/javascript">(function(){let t=localStorage.getItem('site-theme'),cl=document.body.classList;if(t&&t!=='dark') {cl.remove('theme-dark');cl.add('theme-'+t)}})();</script></body></html>
@@ -0,0 +1,9 @@
<!doctype html><html lang="en"><head><meta charset="utf-8"/><meta name="viewport" content="width=device-width,initial-scale=1"/><style class="preload">html,body{margin:0;height:100%}body.theme-light{background-color:#fff;color:#222}body.theme-dark{background-color:#1e1e1e;color:#dadada}.preload{padding:20px;white-space:pre-wrap;overflow-wrap:break-word}@keyframes rotate{from{transform:rotate(0)}to{transform:rotate(360deg)}}</style><base href="https://publish.obsidian.md"><script defer="defer" src="/app.js?78c771386e6858fb0754"></script><link rel="preload" href="/app.css?78c771386e6858fb0754" as="style" onload="this.onload=null;this.rel='stylesheet'"><noscript><link rel="stylesheet" href="/app.css?78c771386e6858fb0754"></noscript><title>Rules - Living World of Verum</title><link rel="preload" href="https://publish-01.obsidian.md/access/e1f3ad20aef4c3bead5bc366246b3900/publish.css" as="style" onload="this.onload=null;this.rel='stylesheet'"><noscript><link rel="stylesheet" href="https://publish-01.obsidian.md/access/e1f3ad20aef4c3bead5bc366246b3900/publish.css"></noscript><link rel="icon" type="image/x-icon" sizes="32x32" href="https://publish-01.obsidian.md/access/e1f3ad20aef4c3bead5bc366246b3900/Images/Misc/Favicon/favicon-32x32.png"><link rel="icon" type="image/x-icon" sizes="128x128" href="https://publish-01.obsidian.md/access/e1f3ad20aef4c3bead5bc366246b3900/Images/Misc/Favicon/favicon-128x128.png"><link rel="icon" type="image/x-icon" sizes="152x152" href="https://publish-01.obsidian.md/access/e1f3ad20aef4c3bead5bc366246b3900/Images/Misc/Favicon/favicon-152x152.png"><link rel="icon" type="image/x-icon" sizes="167x167" href="https://publish-01.obsidian.md/access/e1f3ad20aef4c3bead5bc366246b3900/Images/Misc/Favicon/favicon-167x167.png"><link rel="icon" type="image/x-icon" sizes="180x180" href="https://publish-01.obsidian.md/access/e1f3ad20aef4c3bead5bc366246b3900/Images/Misc/Favicon/favicon-180x180.png"><link rel="icon" type="image/x-icon" sizes="192x192" href="https://publish-01.obsidian.md/access/e1f3ad20aef4c3bead5bc366246b3900/Images/Misc/Favicon/favicon-192x192.png"><link rel="icon" type="image/x-icon" sizes="196x196" href="https://publish-01.obsidian.md/access/e1f3ad20aef4c3bead5bc366246b3900/Images/Misc/Favicon/favicon-196x196.png"><script type="text/javascript">
window.siteInfo={"uid":"e1f3ad20aef4c3bead5bc366246b3900","host":"publish-01.obsidian.md","status":"active","slug":null,"redirect":1,"customurl":"corvanis.wiki"};
(function(){
let f = u=>u&&fetch(u,{credentials: "include"});
window.preloadOptions=f("https://publish-01.obsidian.md/options/e1f3ad20aef4c3bead5bc366246b3900");
window.preloadCache=f("https://publish-01.obsidian.md/cache/e1f3ad20aef4c3bead5bc366246b3900");
window.preloadPage=f("https://publish-01.obsidian.md/access/e1f3ad20aef4c3bead5bc366246b3900/Prism%20(Testing)/Prism/Rules.md");
})();
</script><meta name="description" content="Rules - Living World of Verum"><meta property="og:description" content="Rules - Living World of Verum"></head><body class="theme-dark"><div class="preload" style="text-align:center"><svg style="width:50px" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 100 100"><path style="transform-origin:50px 50px;animation:1s linear infinite rotate" fill="currentColor" d="M73,50c0-12.7-10.3-23-23-23S27,37.3,27,50 M30.9,50c0-10.5,8.5-19.1,19.1-19.1S69.1,39.5,69.1,50"/></svg></div><script type="text/javascript">(function(){let t=localStorage.getItem('site-theme'),cl=document.body.classList;if(t&&t!=='dark') {cl.remove('theme-dark');cl.add('theme-'+t)}})();</script></body></html>
@@ -0,0 +1,9 @@
<!doctype html><html lang="en"><head><meta charset="utf-8"/><meta name="viewport" content="width=device-width,initial-scale=1"/><style class="preload">html,body{margin:0;height:100%}body.theme-light{background-color:#fff;color:#222}body.theme-dark{background-color:#1e1e1e;color:#dadada}.preload{padding:20px;white-space:pre-wrap;overflow-wrap:break-word}@keyframes rotate{from{transform:rotate(0)}to{transform:rotate(360deg)}}</style><base href="https://publish.obsidian.md"><script defer="defer" src="/app.js?78c771386e6858fb0754"></script><link rel="preload" href="/app.css?78c771386e6858fb0754" as="style" onload="this.onload=null;this.rel='stylesheet'"><noscript><link rel="stylesheet" href="/app.css?78c771386e6858fb0754"></noscript><title>Spells - Living World of Verum</title><link rel="preload" href="https://publish-01.obsidian.md/access/e1f3ad20aef4c3bead5bc366246b3900/publish.css" as="style" onload="this.onload=null;this.rel='stylesheet'"><noscript><link rel="stylesheet" href="https://publish-01.obsidian.md/access/e1f3ad20aef4c3bead5bc366246b3900/publish.css"></noscript><link rel="icon" type="image/x-icon" sizes="32x32" href="https://publish-01.obsidian.md/access/e1f3ad20aef4c3bead5bc366246b3900/Images/Misc/Favicon/favicon-32x32.png"><link rel="icon" type="image/x-icon" sizes="128x128" href="https://publish-01.obsidian.md/access/e1f3ad20aef4c3bead5bc366246b3900/Images/Misc/Favicon/favicon-128x128.png"><link rel="icon" type="image/x-icon" sizes="152x152" href="https://publish-01.obsidian.md/access/e1f3ad20aef4c3bead5bc366246b3900/Images/Misc/Favicon/favicon-152x152.png"><link rel="icon" type="image/x-icon" sizes="167x167" href="https://publish-01.obsidian.md/access/e1f3ad20aef4c3bead5bc366246b3900/Images/Misc/Favicon/favicon-167x167.png"><link rel="icon" type="image/x-icon" sizes="180x180" href="https://publish-01.obsidian.md/access/e1f3ad20aef4c3bead5bc366246b3900/Images/Misc/Favicon/favicon-180x180.png"><link rel="icon" type="image/x-icon" sizes="192x192" href="https://publish-01.obsidian.md/access/e1f3ad20aef4c3bead5bc366246b3900/Images/Misc/Favicon/favicon-192x192.png"><link rel="icon" type="image/x-icon" sizes="196x196" href="https://publish-01.obsidian.md/access/e1f3ad20aef4c3bead5bc366246b3900/Images/Misc/Favicon/favicon-196x196.png"><script type="text/javascript">
window.siteInfo={"uid":"e1f3ad20aef4c3bead5bc366246b3900","host":"publish-01.obsidian.md","status":"active","slug":null,"redirect":1,"customurl":"corvanis.wiki"};
(function(){
let f = u=>u&&fetch(u,{credentials: "include"});
window.preloadOptions=f("https://publish-01.obsidian.md/options/e1f3ad20aef4c3bead5bc366246b3900");
window.preloadCache=f("https://publish-01.obsidian.md/cache/e1f3ad20aef4c3bead5bc366246b3900");
window.preloadPage=f("https://publish-01.obsidian.md/access/e1f3ad20aef4c3bead5bc366246b3900/Prism%20(Testing)/Prism/Spells.md");
})();
</script><meta name="description" content="Spells - Living World of Verum"><meta property="og:description" content="Spells - Living World of Verum"></head><body class="theme-dark"><div class="preload" style="text-align:center"><svg style="width:50px" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 100 100"><path style="transform-origin:50px 50px;animation:1s linear infinite rotate" fill="currentColor" d="M73,50c0-12.7-10.3-23-23-23S27,37.3,27,50 M30.9,50c0-10.5,8.5-19.1,19.1-19.1S69.1,39.5,69.1,50"/></svg></div><script type="text/javascript">(function(){let t=localStorage.getItem('site-theme'),cl=document.body.classList;if(t&&t!=='dark') {cl.remove('theme-dark');cl.add('theme-'+t)}})();</script></body></html>
@@ -0,0 +1,9 @@
<!doctype html><html lang="en"><head><meta charset="utf-8"/><meta name="viewport" content="width=device-width,initial-scale=1"/><style class="preload">html,body{margin:0;height:100%}body.theme-light{background-color:#fff;color:#222}body.theme-dark{background-color:#1e1e1e;color:#dadada}.preload{padding:20px;white-space:pre-wrap;overflow-wrap:break-word}@keyframes rotate{from{transform:rotate(0)}to{transform:rotate(360deg)}}</style><base href="https://publish.obsidian.md"><script defer="defer" src="/app.js?78c771386e6858fb0754"></script><link rel="preload" href="/app.css?78c771386e6858fb0754" as="style" onload="this.onload=null;this.rel='stylesheet'"><noscript><link rel="stylesheet" href="/app.css?78c771386e6858fb0754"></noscript><title>Weapons - Living World of Verum</title><link rel="preload" href="https://publish-01.obsidian.md/access/e1f3ad20aef4c3bead5bc366246b3900/publish.css" as="style" onload="this.onload=null;this.rel='stylesheet'"><noscript><link rel="stylesheet" href="https://publish-01.obsidian.md/access/e1f3ad20aef4c3bead5bc366246b3900/publish.css"></noscript><link rel="icon" type="image/x-icon" sizes="32x32" href="https://publish-01.obsidian.md/access/e1f3ad20aef4c3bead5bc366246b3900/Images/Misc/Favicon/favicon-32x32.png"><link rel="icon" type="image/x-icon" sizes="128x128" href="https://publish-01.obsidian.md/access/e1f3ad20aef4c3bead5bc366246b3900/Images/Misc/Favicon/favicon-128x128.png"><link rel="icon" type="image/x-icon" sizes="152x152" href="https://publish-01.obsidian.md/access/e1f3ad20aef4c3bead5bc366246b3900/Images/Misc/Favicon/favicon-152x152.png"><link rel="icon" type="image/x-icon" sizes="167x167" href="https://publish-01.obsidian.md/access/e1f3ad20aef4c3bead5bc366246b3900/Images/Misc/Favicon/favicon-167x167.png"><link rel="icon" type="image/x-icon" sizes="180x180" href="https://publish-01.obsidian.md/access/e1f3ad20aef4c3bead5bc366246b3900/Images/Misc/Favicon/favicon-180x180.png"><link rel="icon" type="image/x-icon" sizes="192x192" href="https://publish-01.obsidian.md/access/e1f3ad20aef4c3bead5bc366246b3900/Images/Misc/Favicon/favicon-192x192.png"><link rel="icon" type="image/x-icon" sizes="196x196" href="https://publish-01.obsidian.md/access/e1f3ad20aef4c3bead5bc366246b3900/Images/Misc/Favicon/favicon-196x196.png"><script type="text/javascript">
window.siteInfo={"uid":"e1f3ad20aef4c3bead5bc366246b3900","host":"publish-01.obsidian.md","status":"active","slug":null,"redirect":1,"customurl":"corvanis.wiki"};
(function(){
let f = u=>u&&fetch(u,{credentials: "include"});
window.preloadOptions=f("https://publish-01.obsidian.md/options/e1f3ad20aef4c3bead5bc366246b3900");
window.preloadCache=f("https://publish-01.obsidian.md/cache/e1f3ad20aef4c3bead5bc366246b3900");
window.preloadPage=f("https://publish-01.obsidian.md/access/e1f3ad20aef4c3bead5bc366246b3900/Prism%20(Testing)/Prism/Weapons.md");
})();
</script><meta name="description" content="Weapons - Living World of Verum"><meta property="og:description" content="Weapons - Living World of Verum"></head><body class="theme-dark"><div class="preload" style="text-align:center"><svg style="width:50px" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 100 100"><path style="transform-origin:50px 50px;animation:1s linear infinite rotate" fill="currentColor" d="M73,50c0-12.7-10.3-23-23-23S27,37.3,27,50 M30.9,50c0-10.5,8.5-19.1,19.1-19.1S69.1,39.5,69.1,50"/></svg></div><script type="text/javascript">(function(){let t=localStorage.getItem('site-theme'),cl=document.body.classList;if(t&&t!=='dark') {cl.remove('theme-dark');cl.add('theme-'+t)}})();</script></body></html>
+1
View File
@@ -0,0 +1 @@
/Prism+(Testing)/Prism
+500
View File
@@ -0,0 +1,500 @@
/Prism+(Testing)/Ability+Scores+and+Sub-Attributes/Prism+Attributes
/Prism+(Testing)/Ability+Scores+and+Sub-Attributes/Sub-Attributes/Authority
/Prism+(Testing)/Ability+Scores+and+Sub-Attributes/Sub-Attributes/Competence
/Prism+(Testing)/Ability+Scores+and+Sub-Attributes/Sub-Attributes/Cunning
/Prism+(Testing)/Ability+Scores+and+Sub-Attributes/Sub-Attributes/Grace
/Prism+(Testing)/Ability+Scores+and+Sub-Attributes/Sub-Attributes/Guile
/Prism+(Testing)/Ability+Scores+and+Sub-Attributes/Sub-Attributes/Initiative
/Prism+(Testing)/Ability+Scores+and+Sub-Attributes/Sub-Attributes/Presence
/Prism+(Testing)/Ability+Scores+and+Sub-Attributes/Sub-Attributes/Prowess
/Prism+(Testing)/Ability+Scores+and+Sub-Attributes/Sub-Attributes/Resilience
/Prism+(Testing)/Ability+Scores+and+Sub-Attributes/Sub-Attributes/Sovereignty
/Prism+(Testing)/Ability+Scores+and+Sub-Attributes/Sub-Attributes/Stamina
/Prism+(Testing)/Ability+Scores+and+Sub-Attributes/Sub-Attributes/Tenacity
/Prism+(Testing)/Ability+Scores+and+Sub-Attributes/Sub-Attributes/Vigor
/Prism+(Testing)/Ability+Scores+and+Sub-Attributes/Sub-Attributes/Willpower
/Prism+(Testing)/Ability+Scores+and+Sub-Attributes/Sub-Attributes/Wit
/Prism+(Testing)/Armory/Armor/Armor
/Prism+(Testing)/Armory/Armor/Heavy+Armor/Armor+Augments/Best+There+Is
/Prism+(Testing)/Armory/Armor/Heavy+Armor/Armor+Augments/Knock+Aside
/Prism+(Testing)/Armory/Armor/Heavy+Armor/Armor+Augments/Leverage
/Prism+(Testing)/Armory/Armor/Heavy+Armor/Armor+Augments/Pinnacle+of+Steel
/Prism+(Testing)/Armory/Armor/Heavy+Armor/Armor+Augments/Shatter+the+Line
/Prism+(Testing)/Armory/Armor/Heavy+Armor/Armor+Augments/Unstoppable
/Prism+(Testing)/Armory/Armor/Heavy+Armor/Banded
/Prism+(Testing)/Armory/Armor/Heavy+Armor/Heavy+Armor
/Prism+(Testing)/Armory/Armor/Heavy+Armor/Plate
/Prism+(Testing)/Armory/Armor/Heavy+Armor/Splint
/Prism+(Testing)/Armory/Armor/Light+Armor/Armor+Augments/Brutal+Momentum
/Prism+(Testing)/Armory/Armor/Light+Armor/Armor+Augments/Chained+Chest
/Prism+(Testing)/Armory/Armor/Light+Armor/Armor+Augments/Combat+Roll
/Prism+(Testing)/Armory/Armor/Light+Armor/Armor+Augments/Critical+Protection
/Prism+(Testing)/Armory/Armor/Light+Armor/Armor+Augments/Flexible+Defense
/Prism+(Testing)/Armory/Armor/Light+Armor/Armor+Augments/Flowing+Robes
/Prism+(Testing)/Armory/Armor/Light+Armor/Armor+Augments/Follow-Up
/Prism+(Testing)/Armory/Armor/Light+Armor/Armor+Augments/Hunker+Down
/Prism+(Testing)/Armory/Armor/Light+Armor/Armor+Augments/Piercing+Protection
/Prism+(Testing)/Armory/Armor/Light+Armor/Armor+Augments/Protect+Your+Neck
/Prism+(Testing)/Armory/Armor/Light+Armor/Armor+Augments/Punishing+Response
/Prism+(Testing)/Armory/Armor/Light+Armor/Armor+Augments/Slashing+Protection
/Prism+(Testing)/Armory/Armor/Light+Armor/Armor+Augments/Steel+Sleeve
/Prism+(Testing)/Armory/Armor/Light+Armor/Armor+Augments/Swirling+Sleeves
/Prism+(Testing)/Armory/Armor/Light+Armor/Armored+Robe
/Prism+(Testing)/Armory/Armor/Light+Armor/Chainshirt
/Prism+(Testing)/Armory/Armor/Light+Armor/Gambeson
/Prism+(Testing)/Armory/Armor/Light+Armor/Gorget
/Prism+(Testing)/Armory/Armor/Light+Armor/Light+Armor
/Prism+(Testing)/Armory/Armor/Light+Armor/Manica
/Prism+(Testing)/Armory/Armor/Light+Armor/Studded+Leather
/Prism+(Testing)/Armory/Armor/Light+Armor/Supple+Leather
/Prism+(Testing)/Armory/Armor/Medium+Armor/Armor+Augments/Angled+Metal
/Prism+(Testing)/Armory/Armor/Medium+Armor/Armor+Augments/Bandit+Shuffle
/Prism+(Testing)/Armory/Armor/Medium+Armor/Armor+Augments/Bestial+Fury
/Prism+(Testing)/Armory/Armor/Medium+Armor/Armor+Augments/Bludgeoning+Protection
/Prism+(Testing)/Armory/Armor/Medium+Armor/Armor+Augments/Camouflaged+Pattern
/Prism+(Testing)/Armory/Armor/Medium+Armor/Armor+Augments/Drake+Bane
/Prism+(Testing)/Armory/Armor/Medium+Armor/Armor+Augments/Dutiful+Momentum
/Prism+(Testing)/Armory/Armor/Medium+Armor/Armor+Augments/Focused+Defense
/Prism+(Testing)/Armory/Armor/Medium+Armor/Armor+Augments/Hero's+Valor
/Prism+(Testing)/Armory/Armor/Medium+Armor/Armor+Augments/Nooks+and+Crannies
/Prism+(Testing)/Armory/Armor/Medium+Armor/Armor+Augments/Soldier's+Fortune
/Prism+(Testing)/Armory/Armor/Medium+Armor/Armor+Augments/Superior+Piercing+Protection
/Prism+(Testing)/Armory/Armor/Medium+Armor/Armor+Augments/Superior+Slashing+Protection
/Prism+(Testing)/Armory/Armor/Medium+Armor/Armor+Augments/Versatile+Defense
/Prism+(Testing)/Armory/Armor/Medium+Armor/Breastplate
/Prism+(Testing)/Armory/Armor/Medium+Armor/Brigadine
/Prism+(Testing)/Armory/Armor/Medium+Armor/Chainmail
/Prism+(Testing)/Armory/Armor/Medium+Armor/Hide
/Prism+(Testing)/Armory/Armor/Medium+Armor/Lamellar
/Prism+(Testing)/Armory/Armor/Medium+Armor/Medium+Armor
/Prism+(Testing)/Armory/Armor/Medium+Armor/Ringmail
/Prism+(Testing)/Armory/Armor/Medium+Armor/Scalemail
/Prism+(Testing)/Armory/Armory
/Prism+(Testing)/Armory/Shields/Buckler
/Prism+(Testing)/Armory/Shields/Heavy+Shield
/Prism+(Testing)/Armory/Shields/Light+Shield
/Prism+(Testing)/Armory/Shields/Shields
/Prism+(Testing)/Armory/Shields/Tower+Shield
/Prism+(Testing)/Armory/Weapons/Battleaxe/Battleaxe
/Prism+(Testing)/Armory/Weapons/Battleaxe/Greataxe
/Prism+(Testing)/Armory/Weapons/Battleaxe/Hand+Axe
/Prism+(Testing)/Armory/Weapons/Battleaxe/Warpick
/Prism+(Testing)/Armory/Weapons/Battleaxe/Weapon+Augments/Cleaving+Strike
/Prism+(Testing)/Armory/Weapons/Battleaxe/Weapon+Augments/Deep+Bites
/Prism+(Testing)/Armory/Weapons/Battleaxe/Weapon+Augments/Helmpiercer
/Prism+(Testing)/Armory/Weapons/Battleaxe/Weapon+Augments/Shield+Eater
/Prism+(Testing)/Armory/Weapons/Battleaxe/Weapon+Augments/Tearing+Tooth
/Prism+(Testing)/Armory/Weapons/Crossbow/Crossbow
/Prism+(Testing)/Armory/Weapons/Crossbow/Weapon+Augments/Boltlock
/Prism+(Testing)/Armory/Weapons/Crossbow/Weapon+Augments/Piercing+Shot
/Prism+(Testing)/Armory/Weapons/Dagger/Dagger
/Prism+(Testing)/Armory/Weapons/Dagger/Dart
/Prism+(Testing)/Armory/Weapons/Dagger/Sickle
/Prism+(Testing)/Armory/Weapons/Dagger/Weapon+Augments/Backstab
/Prism+(Testing)/Armory/Weapons/Dagger/Weapon+Augments/Balancing+Stance
/Prism+(Testing)/Armory/Weapons/Dagger/Weapon+Augments/Harvester
/Prism+(Testing)/Armory/Weapons/Dagger/Weapon+Augments/Unseen+Strike
/Prism+(Testing)/Armory/Weapons/Longbow/Longbow
/Prism+(Testing)/Armory/Weapons/Longbow/Weapon+Augments/Desperate+Parry
/Prism+(Testing)/Armory/Weapons/Longbow/Weapon+Augments/Volley+Fire
/Prism+(Testing)/Armory/Weapons/Longsword/Bastard+Sword
/Prism+(Testing)/Armory/Weapons/Longsword/Greatsword
/Prism+(Testing)/Armory/Weapons/Longsword/Longsword
/Prism+(Testing)/Armory/Weapons/Longsword/Rapier
/Prism+(Testing)/Armory/Weapons/Longsword/Twin-Blade
/Prism+(Testing)/Armory/Weapons/Longsword/Weapon+Augments/Half-Hand
/Prism+(Testing)/Armory/Weapons/Longsword/Weapon+Augments/Impaling+Strike
/Prism+(Testing)/Armory/Weapons/Longsword/Weapon+Augments/Mordhau
/Prism+(Testing)/Armory/Weapons/Longsword/Weapon+Augments/Spin+to+Win
/Prism+(Testing)/Armory/Weapons/Longsword/Weapon+Augments/Tower+of+Steel
/Prism+(Testing)/Armory/Weapons/Longsword/Weapon+Augments/Turning+Edge
/Prism+(Testing)/Armory/Weapons/Warhammer/Flail
/Prism+(Testing)/Armory/Weapons/Warhammer/Light+Hammer
/Prism+(Testing)/Armory/Weapons/Warhammer/Maul
/Prism+(Testing)/Armory/Weapons/Warhammer/Morningstar
/Prism+(Testing)/Armory/Weapons/Warhammer/Warhammer
/Prism+(Testing)/Armory/Weapons/Warhammer/Weapon+Augments/Adaptive+Attack
/Prism+(Testing)/Armory/Weapons/Warhammer/Weapon+Augments/Apprehend
/Prism+(Testing)/Armory/Weapons/Warhammer/Weapon+Augments/Concussive+Blow
/Prism+(Testing)/Armory/Weapons/Warhammer/Weapon+Augments/Joint+Crash
/Prism+(Testing)/Armory/Weapons/Warhammer/Weapon+Augments/Overwhelming+Blow
/Prism+(Testing)/Armory/Weapons/Warhammer/Weapon+Augments/Puncturing+Blows
/Prism+(Testing)/Armory/Weapons/Weapons
/Prism+(Testing)/Character+Paths/Character+Paths
/Prism+(Testing)/Classes/Adventurer
/Prism+(Testing)/Classes/Archetype
/Prism+(Testing)/Classes/Continental+Classes/Corvanis/Agnostic
/Prism+(Testing)/Classes/Continental+Classes/Corvanis/Class+Features/Agnostic/Blaspheme
/Prism+(Testing)/Classes/Continental+Classes/Corvanis/Class+Features/Agnostic/Chains+of+Mortality
/Prism+(Testing)/Classes/Continental+Classes/Corvanis/Class+Features/Agnostic/Deny
/Prism+(Testing)/Classes/Continental+Classes/Corvanis/Class+Features/Agnostic/Rigorous+Debate
/Prism+(Testing)/Classes/Continental+Classes/Corvanis/Class+Features/Agnostic/Vowbreaker
/Prism+(Testing)/Classes/Continental+Classes/Corvanis/Class+Features/Guild+Merchant/Crushing+Debt
/Prism+(Testing)/Classes/Continental+Classes/Corvanis/Class+Features/Guild+Merchant/Dealmaker
/Prism+(Testing)/Classes/Continental+Classes/Corvanis/Class+Features/Guild+Merchant/Dividends
/Prism+(Testing)/Classes/Continental+Classes/Corvanis/Class+Features/Guild+Merchant/Golden+Rule
/Prism+(Testing)/Classes/Continental+Classes/Corvanis/Class+Features/Guild+Merchant/Market+Day
/Prism+(Testing)/Classes/Continental+Classes/Corvanis/Class+Features/Guild+Merchant/Social+Acumen
/Prism+(Testing)/Classes/Continental+Classes/Corvanis/Class+Features/Leymage/Mana+Burst
/Prism+(Testing)/Classes/Continental+Classes/Corvanis/Class+Features/Leymage/River+of+Mana
/Prism+(Testing)/Classes/Continental+Classes/Corvanis/Class+Features/Leymage/Soulfire
/Prism+(Testing)/Classes/Continental+Classes/Corvanis/Class+Features/Mercenary/Alchemical+Edge
/Prism+(Testing)/Classes/Continental+Classes/Corvanis/Class+Features/Mercenary/Combat+Alchemist
/Prism+(Testing)/Classes/Continental+Classes/Corvanis/Class+Features/Mercenary/Confident+Preparation
/Prism+(Testing)/Classes/Continental+Classes/Corvanis/Class+Features/Mercenary/Iron+Stomach
/Prism+(Testing)/Classes/Continental+Classes/Corvanis/Class+Features/Mercenary/Well+Supplied
/Prism+(Testing)/Classes/Continental+Classes/Corvanis/Guild+Merchant
/Prism+(Testing)/Classes/Continental+Classes/Corvanis/Leymage
/Prism+(Testing)/Classes/Continental+Classes/Corvanis/Mercenary
/Prism+(Testing)/Classes/Continental+Classes/Eldasharkai/Cathe+Voss
/Prism+(Testing)/Classes/Continental+Classes/Eldasharkai/Class+Features/Cathe+Voss/Dogmatic+Dominion
/Prism+(Testing)/Classes/Continental+Classes/Eldasharkai/Class+Features/Cathe+Voss/Vow+of+Death
/Prism+(Testing)/Classes/Continental+Classes/Eldasharkai/Class+Features/Solitaire/All-In
/Prism+(Testing)/Classes/Continental+Classes/Eldasharkai/Class+Features/Solitaire/Ashen+Vanguard
/Prism+(Testing)/Classes/Continental+Classes/Eldasharkai/Class+Features/Solitaire/Eldar's+Edge
/Prism+(Testing)/Classes/Continental+Classes/Eldasharkai/Class+Features/Solitaire/Macabre+Assault
/Prism+(Testing)/Classes/Continental+Classes/Eldasharkai/Class+Features/Solitaire/Taunt
/Prism+(Testing)/Classes/Continental+Classes/Eldasharkai/Class+Features/Spire+Ael/Ael+Parry
/Prism+(Testing)/Classes/Continental+Classes/Eldasharkai/Class+Features/Spire+Ael/Kaska+Blade
/Prism+(Testing)/Classes/Continental+Classes/Eldasharkai/Class+Features/Spire+Voss/Spire+Ascendant
/Prism+(Testing)/Classes/Continental+Classes/Eldasharkai/Solitaire
/Prism+(Testing)/Classes/Continental+Classes/Eldasharkai/Spire+Ael
/Prism+(Testing)/Classes/Continental+Classes/Eldasharkai/Spire+Voss
/Prism+(Testing)/Classes/Continental+Classes/Glies/Class+Features/Daoist/Mantras
/Prism+(Testing)/Classes/Continental+Classes/Glies/Class+Features/Daoist/Mantric+Seal
/Prism+(Testing)/Classes/Continental+Classes/Glies/Class+Features/Daoist/Spirit+Palm
/Prism+(Testing)/Classes/Continental+Classes/Glies/Class+Features/Samurai/Perfect+Strike
/Prism+(Testing)/Classes/Continental+Classes/Glies/Class+Features/Samurai/Toukon
/Prism+(Testing)/Classes/Continental+Classes/Glies/Class+Features/Shinobi/Infiltrate
/Prism+(Testing)/Classes/Continental+Classes/Glies/Class+Features/Shinobi/Miracle+Pill
/Prism+(Testing)/Classes/Continental+Classes/Glies/Class+Features/Shinobi/Shadow+Counter
/Prism+(Testing)/Classes/Continental+Classes/Glies/Class+Features/Shinobi/Shinobi+Tools
/Prism+(Testing)/Classes/Continental+Classes/Glies/Class+Features/Sohei/Aspect+of+Glies
/Prism+(Testing)/Classes/Continental+Classes/Glies/Class+Features/Sohei/Corrective+Word
/Prism+(Testing)/Classes/Continental+Classes/Glies/Class+Features/Sohei/Purification+Ceremony
/Prism+(Testing)/Classes/Continental+Classes/Glies/Class+Features/Sohei/Spirit's+Wrath
/Prism+(Testing)/Classes/Continental+Classes/Glies/Class+Features/Sohei/Vow+of+Spirits
/Prism+(Testing)/Classes/Continental+Classes/Glies/Daoist
/Prism+(Testing)/Classes/Continental+Classes/Glies/Samurai
/Prism+(Testing)/Classes/Continental+Classes/Glies/Shinobi
/Prism+(Testing)/Classes/Continental+Classes/Glies/Sohei
/Prism+(Testing)/Classes/Continental+Classes/Kalkatesh/Arcanist
/Prism+(Testing)/Classes/Continental+Classes/Kalkatesh/Nos+Fiend
/Prism+(Testing)/Classes/Continental+Classes/Kalkatesh/Scion
/Prism+(Testing)/Classes/Continental+Classes/Kalkatesh/Steam+Lord
/Prism+(Testing)/Classes/Continental+Classes/Ryne/Chord+Keeper
/Prism+(Testing)/Classes/Continental+Classes/Ryne/Class+Features/Chord+Keeper/Cutting+Chords
/Prism+(Testing)/Classes/Continental+Classes/Ryne/Class+Features/Chord+Keeper/Dramatic+Pause
/Prism+(Testing)/Classes/Continental+Classes/Ryne/Class+Features/Chord+Keeper/Tempo+Shift
/Prism+(Testing)/Classes/Continental+Classes/Ryne/Class+Features/Chord+Keeper/The+Best+Medicine
/Prism+(Testing)/Classes/Continental+Classes/Ryne/Class+Features/Composer/Social+Acumen
/Prism+(Testing)/Classes/Continental+Classes/Ryne/Class+Features/Composer/Sour+Note
/Prism+(Testing)/Classes/Continental+Classes/Ryne/Class+Features/Composer/Symphony+of+Spells
/Prism+(Testing)/Classes/Continental+Classes/Ryne/Class+Features/Composer/The+Zone
/Prism+(Testing)/Classes/Continental+Classes/Ryne/Class+Features/Herald/Chord+of+War
/Prism+(Testing)/Classes/Continental+Classes/Ryne/Class+Features/Herald/Clarion+Call
/Prism+(Testing)/Classes/Continental+Classes/Ryne/Class+Features/Herald/Glory
/Prism+(Testing)/Classes/Continental+Classes/Ryne/Class+Features/Herald/Herald+of+War
/Prism+(Testing)/Classes/Continental+Classes/Ryne/Class+Features/Herald/Inspire
/Prism+(Testing)/Classes/Continental+Classes/Ryne/Class+Features/Herald/Rouse+the+Troops
/Prism+(Testing)/Classes/Continental+Classes/Ryne/Class+Features/Herald/Shining+Banner
/Prism+(Testing)/Classes/Continental+Classes/Ryne/Class+Features/Soul+Singer/Creation's+Chorus
/Prism+(Testing)/Classes/Continental+Classes/Ryne/Class+Features/Soul+Singer/Gospel
/Prism+(Testing)/Classes/Continental+Classes/Ryne/Class+Features/Soul+Singer/Life+Crash
/Prism+(Testing)/Classes/Continental+Classes/Ryne/Composer
/Prism+(Testing)/Classes/Continental+Classes/Ryne/Herald
/Prism+(Testing)/Classes/Continental+Classes/Ryne/Soul+Singer
/Prism+(Testing)/Classes/Continental+Classes/Whyxxstar/Aesir
/Prism+(Testing)/Classes/Continental+Classes/Whyxxstar/Berserker
/Prism+(Testing)/Classes/Continental+Classes/Whyxxstar/Class+Features/Aesir/Asgardian+Steel
/Prism+(Testing)/Classes/Continental+Classes/Whyxxstar/Class+Features/Aesir/Biifrost+Surge
/Prism+(Testing)/Classes/Continental+Classes/Whyxxstar/Class+Features/Aesir/Runic+Blessing
/Prism+(Testing)/Classes/Continental+Classes/Whyxxstar/Class+Features/Aesir/Valhalla+Calling
/Prism+(Testing)/Classes/Continental+Classes/Whyxxstar/Class+Features/Aesir/Wrath+of+Yggdrasil
/Prism+(Testing)/Classes/Continental+Classes/Whyxxstar/Class+Features/Berserker/Jotun+Grip
/Prism+(Testing)/Classes/Continental+Classes/Whyxxstar/Class+Features/Berserker/Might+of+Thor
/Prism+(Testing)/Classes/Continental+Classes/Whyxxstar/Class+Features/Berserker/Taunt
/Prism+(Testing)/Classes/Continental+Classes/Whyxxstar/Class+Features/Berserker/Wrath+of+Sigrun
/Prism+(Testing)/Classes/Continental+Classes/Whyxxstar/Class+Features/Raider/Jarl+Ascendant
/Prism+(Testing)/Classes/Continental+Classes/Whyxxstar/Class+Features/Raider/Overwhelming+Flank
/Prism+(Testing)/Classes/Continental+Classes/Whyxxstar/Class+Features/Raider/Pillaging+Frenzy
/Prism+(Testing)/Classes/Continental+Classes/Whyxxstar/Class+Features/Vanir/Doom+Sight
/Prism+(Testing)/Classes/Continental+Classes/Whyxxstar/Class+Features/Vanir/Norn+Blood
/Prism+(Testing)/Classes/Continental+Classes/Whyxxstar/Class+Features/Vanir/Tenet+of+Sovereignty
/Prism+(Testing)/Classes/Continental+Classes/Whyxxstar/Raider
/Prism+(Testing)/Classes/Continental+Classes/Whyxxstar/Vanir
/Prism+(Testing)/Classes/Core+Classes/Faith/Cabalist
/Prism+(Testing)/Classes/Core+Classes/Faith/Class+Features/Cabalist/Death-Knell
/Prism+(Testing)/Classes/Core+Classes/Faith/Class+Features/Cleric/Holy+Wave
/Prism+(Testing)/Classes/Core+Classes/Faith/Class+Features/Cleric/Inscription
/Prism+(Testing)/Classes/Core+Classes/Faith/Class+Features/Cleric/Vow+of+Life
/Prism+(Testing)/Classes/Core+Classes/Faith/Class+Features/Druid/Totemic+Mastery
/Prism+(Testing)/Classes/Core+Classes/Faith/Class+Features/Druid/Totemic+Power
/Prism+(Testing)/Classes/Core+Classes/Faith/Class+Features/Inquisitor/Combat+Acumen
/Prism+(Testing)/Classes/Core+Classes/Faith/Class+Features/Inquisitor/Tenet+of+Punishment
/Prism+(Testing)/Classes/Core+Classes/Faith/Class+Features/Inquisitor/Thieves+Tools
/Prism+(Testing)/Classes/Core+Classes/Faith/Class+Features/Warden/Iron+Channel
/Prism+(Testing)/Classes/Core+Classes/Faith/Class+Features/Warden/Seal+of+the+Warden
/Prism+(Testing)/Classes/Core+Classes/Faith/Class+Features/Warden/Taunt
/Prism+(Testing)/Classes/Core+Classes/Faith/Class+Features/Warden/Unbreakable+Faith
/Prism+(Testing)/Classes/Core+Classes/Faith/Cleric
/Prism+(Testing)/Classes/Core+Classes/Faith/Druid
/Prism+(Testing)/Classes/Core+Classes/Faith/Inquisitor
/Prism+(Testing)/Classes/Core+Classes/Faith/Purifier
/Prism+(Testing)/Classes/Core+Classes/Faith/Warden
/Prism+(Testing)/Classes/Core+Classes/Mana/Archon
/Prism+(Testing)/Classes/Core+Classes/Mana/Class+Features/Archon/Mana+Regalia
/Prism+(Testing)/Classes/Core+Classes/Mana/Class+Features/Archon/Regalia's+Majesty
/Prism+(Testing)/Classes/Core+Classes/Mana/Class+Features/Archon/Spell+Reservoir
/Prism+(Testing)/Classes/Core+Classes/Mana/Class+Features/Enscriber/Dissertation
/Prism+(Testing)/Classes/Core+Classes/Mana/Class+Features/Enscriber/Ink+Veld
/Prism+(Testing)/Classes/Core+Classes/Mana/Class+Features/Enscriber/Iron+Parchment
/Prism+(Testing)/Classes/Core+Classes/Mana/Class+Features/Enscriber/Lore+Acumen+(Enscriber)
/Prism+(Testing)/Classes/Core+Classes/Mana/Class+Features/Enscriber/Rune+Mage
/Prism+(Testing)/Classes/Core+Classes/Mana/Class+Features/Invoker/Aetheric+Combination
/Prism+(Testing)/Classes/Core+Classes/Mana/Class+Features/Invoker/Augment+Mastery
/Prism+(Testing)/Classes/Core+Classes/Mana/Class+Features/Invoker/Shifting+Echoes
/Prism+(Testing)/Classes/Core+Classes/Mana/Class+Features/Sorcerer/Saturated+Channel
/Prism+(Testing)/Classes/Core+Classes/Mana/Class+Features/Sorcerer/Summon+Mana+Well
/Prism+(Testing)/Classes/Core+Classes/Mana/Class+Features/Warlock/Disrupt+Mana
/Prism+(Testing)/Classes/Core+Classes/Mana/Class+Features/Warlock/Spell+Feast
/Prism+(Testing)/Classes/Core+Classes/Mana/Class+Features/Warlock/Woe+Weaver
/Prism+(Testing)/Classes/Core+Classes/Mana/Class+Features/Wizard/Lore+Acumen+(Wizard)
/Prism+(Testing)/Classes/Core+Classes/Mana/Class+Features/Wizard/Spell+Mastery
/Prism+(Testing)/Classes/Core+Classes/Mana/Class+Features/Wizard/Spell+Matrix
/Prism+(Testing)/Classes/Core+Classes/Mana/Class+Features/Wizard/Spell+Specialist
/Prism+(Testing)/Classes/Core+Classes/Mana/Class+Features/Wizard/Spellbook
/Prism+(Testing)/Classes/Core+Classes/Mana/Enscriber
/Prism+(Testing)/Classes/Core+Classes/Mana/Invoker
/Prism+(Testing)/Classes/Core+Classes/Mana/Sorcerer
/Prism+(Testing)/Classes/Core+Classes/Mana/Warlock
/Prism+(Testing)/Classes/Core+Classes/Mana/Wizard
/Prism+(Testing)/Classes/Core+Classes/Wanderer/Assassin
/Prism+(Testing)/Classes/Core+Classes/Wanderer/Bard
/Prism+(Testing)/Classes/Core+Classes/Wanderer/Class+Features/Assassin/Combat+Acumen
/Prism+(Testing)/Classes/Core+Classes/Wanderer/Class+Features/Assassin/Ruthless+Momentum
/Prism+(Testing)/Classes/Core+Classes/Wanderer/Class+Features/Bard/Counter+Song
/Prism+(Testing)/Classes/Core+Classes/Wanderer/Class+Features/Bard/Lifting+Melody
/Prism+(Testing)/Classes/Core+Classes/Wanderer/Class+Features/Bard/Troubadour's+Gambit
/Prism+(Testing)/Classes/Core+Classes/Wanderer/Class+Features/Drifter/Common+Sense
/Prism+(Testing)/Classes/Core+Classes/Wanderer/Class+Features/Drifter/Drifter's+Luck
/Prism+(Testing)/Classes/Core+Classes/Wanderer/Class+Features/Drifter/Traveler's+Trick
/Prism+(Testing)/Classes/Core+Classes/Wanderer/Class+Features/Marksman/Farsight
/Prism+(Testing)/Classes/Core+Classes/Wanderer/Class+Features/Marksman/Mark+of+Death
/Prism+(Testing)/Classes/Core+Classes/Wanderer/Class+Features/Marksman/Mark+of+Effort
/Prism+(Testing)/Classes/Core+Classes/Wanderer/Class+Features/Marksman/Mark+of+Inevitability
/Prism+(Testing)/Classes/Core+Classes/Wanderer/Class+Features/Marksman/Mark+of+Precision
/Prism+(Testing)/Classes/Core+Classes/Wanderer/Class+Features/Saboteur/Alchemist
/Prism+(Testing)/Classes/Core+Classes/Wanderer/Class+Features/Saboteur/Prepare+to+Breach!
/Prism+(Testing)/Classes/Core+Classes/Wanderer/Class+Features/Stalker/Quietus+(Stalker)
/Prism+(Testing)/Classes/Core+Classes/Wanderer/Class+Features/Stalker/Shadows+Unbound
/Prism+(Testing)/Classes/Core+Classes/Wanderer/Class+Features/Stalker/Stalk+Prey
/Prism+(Testing)/Classes/Core+Classes/Wanderer/Drifter
/Prism+(Testing)/Classes/Core+Classes/Wanderer/Marksman
/Prism+(Testing)/Classes/Core+Classes/Wanderer/Saboteur
/Prism+(Testing)/Classes/Core+Classes/Wanderer/Stalker
/Prism+(Testing)/Classes/Core+Classes/Warrior/Class+Features/Gladiator/Are+You+Not+Entertained
/Prism+(Testing)/Classes/Core+Classes/Warrior/Class+Features/Gladiator/Battle+Boast
/Prism+(Testing)/Classes/Core+Classes/Warrior/Class+Features/Gladiator/Emperor's+Gambit
/Prism+(Testing)/Classes/Core+Classes/Warrior/Class+Features/Gladiator/Roar+of+the+Crowd
/Prism+(Testing)/Classes/Core+Classes/Warrior/Class+Features/Gladiator/Taunt
/Prism+(Testing)/Classes/Core+Classes/Warrior/Class+Features/Knight/Dragonsbane
/Prism+(Testing)/Classes/Core+Classes/Warrior/Class+Features/Knight/Guard
/Prism+(Testing)/Classes/Core+Classes/Warrior/Class+Features/Knight/Honor's+Demand
/Prism+(Testing)/Classes/Core+Classes/Warrior/Class+Features/Knight/Lord's+Grace
/Prism+(Testing)/Classes/Core+Classes/Warrior/Class+Features/Knight/Oath+of+Courage
/Prism+(Testing)/Classes/Core+Classes/Warrior/Class+Features/Knight/Shatter+Morale
/Prism+(Testing)/Classes/Core+Classes/Warrior/Class+Features/Knight/Valor's+Advance
/Prism+(Testing)/Classes/Core+Classes/Warrior/Class+Features/Paragon/Intimidating+Prowess
/Prism+(Testing)/Classes/Core+Classes/Warrior/Class+Features/Paragon/On+the+Edge
/Prism+(Testing)/Classes/Core+Classes/Warrior/Class+Features/Paragon/Riposte
/Prism+(Testing)/Classes/Core+Classes/Warrior/Class+Features/Paragon/Showdown
/Prism+(Testing)/Classes/Core+Classes/Warrior/Class+Features/Reaver/Reaver's+Cleave
/Prism+(Testing)/Classes/Core+Classes/Warrior/Class+Features/Reaver/Victory+Rush
/Prism+(Testing)/Classes/Core+Classes/Warrior/Class+Features/Soldier/Combat+Acumen+(Soldier)
/Prism+(Testing)/Classes/Core+Classes/Warrior/Class+Features/Soldier/Death+March
/Prism+(Testing)/Classes/Core+Classes/Warrior/Class+Features/Soldier/Formation
/Prism+(Testing)/Classes/Core+Classes/Warrior/Class+Features/Soldier/Hold+Fast!
/Prism+(Testing)/Classes/Core+Classes/Warrior/Class+Features/Warlord/Banner+Wave
/Prism+(Testing)/Classes/Core+Classes/Warrior/Class+Features/Warlord/By+Example
/Prism+(Testing)/Classes/Core+Classes/Warrior/Class+Features/Warlord/Commander
/Prism+(Testing)/Classes/Core+Classes/Warrior/Class+Features/Warlord/Give+Them+Nothing!
/Prism+(Testing)/Classes/Core+Classes/Warrior/Class+Features/Warlord/Glory
/Prism+(Testing)/Classes/Core+Classes/Warrior/Class+Features/Warlord/Inspire
/Prism+(Testing)/Classes/Core+Classes/Warrior/Class+Features/Warlord/Into+the+Breach!
/Prism+(Testing)/Classes/Core+Classes/Warrior/Class+Features/Warlord/Take+From+Them%2C+EVERYTHING!
/Prism+(Testing)/Classes/Core+Classes/Warrior/Class+Features/Warlord/Wrapped+in+Glory
/Prism+(Testing)/Classes/Core+Classes/Warrior/Gladiator
/Prism+(Testing)/Classes/Core+Classes/Warrior/Knight
/Prism+(Testing)/Classes/Core+Classes/Warrior/Paragon
/Prism+(Testing)/Classes/Core+Classes/Warrior/Reaver
/Prism+(Testing)/Classes/Core+Classes/Warrior/Soldier
/Prism+(Testing)/Classes/Core+Classes/Warrior/Warlord
/Prism+(Testing)/Classes/Core+Skill+Classes/Faith/Belltender+(Acrobatics)
/Prism+(Testing)/Classes/Core+Skill+Classes/Faith/Burdened+(Athletics)
/Prism+(Testing)/Classes/Core+Skill+Classes/Faith/Holy+Hand+(Medicine)
/Prism+(Testing)/Classes/Core+Skill+Classes/Faith/Hymnal+(Performance)
/Prism+(Testing)/Classes/Core+Skill+Classes/Faith/Monastic+(Nature)
/Prism+(Testing)/Classes/Core+Skill+Classes/Faith/Pavitara+(Animal+Handling)
/Prism+(Testing)/Classes/Core+Skill+Classes/Faith/Theurge+(Arcana)
/Prism+(Testing)/Classes/Core+Skill+Classes/Mana/Familiar+Master+(Animal+Handling)
/Prism+(Testing)/Classes/Core+Skill+Classes/Mana/Immolator+(Athletics)
/Prism+(Testing)/Classes/Core+Skill+Classes/Mana/Mystic+(Arcana)
/Prism+(Testing)/Classes/Core+Skill+Classes/Mana/Shadow+Mage+(Stealth)
/Prism+(Testing)/Classes/Core+Skill+Classes/Mana/Spell+Thief+(Sleight+of+Hand)
/Prism+(Testing)/Classes/Core+Skill+Classes/Mana/Spellwind+(Acrobatics)
/Prism+(Testing)/Classes/Core+Skill+Classes/Wanderer/Acrobat+(Acrobatics)
/Prism+(Testing)/Classes/Core+Skill+Classes/Wanderer/Collector+(Arcana)
/Prism+(Testing)/Classes/Core+Skill+Classes/Wanderer/Courier+(Athletics)
/Prism+(Testing)/Classes/Core+Skill+Classes/Wanderer/Delver+(History)
/Prism+(Testing)/Classes/Core+Skill+Classes/Wanderer/Infiltrator+(Stealth)
/Prism+(Testing)/Classes/Core+Skill+Classes/Wanderer/Pack+Hunter+(Animal+Handling)
/Prism+(Testing)/Classes/Core+Skill+Classes/Warrior/Ancestral+Warrior+(History)
/Prism+(Testing)/Classes/Core+Skill+Classes/Warrior/Athlete+(Athletics)
/Prism+(Testing)/Classes/Core+Skill+Classes/Warrior/Cavalier+(Animal+Handling)
/Prism+(Testing)/Classes/Core+Skill+Classes/Warrior/Dancer+(Acrobatics)
/Prism+(Testing)/Classes/Core+Skill+Classes/Warrior/Eldritch+Knight+(Arcana)
/Prism+(Testing)/Classes/Core+Skill+Classes/Warrior/Strategist+(Insight)
/Prism+(Testing)/Classes/Core+Skill+Classes/Warrior/Tactician+(Deception)
/Prism+(Testing)/Classes/Prism+Classes
/Prism+(Testing)/Classes/Vagabond
/Prism+(Testing)/Core+Features/Core+Actions/Assist
/Prism+(Testing)/Core+Features/Core+Actions/Attack
/Prism+(Testing)/Core+Features/Core+Actions/Avoid
/Prism+(Testing)/Core+Features/Core+Actions/Block
/Prism+(Testing)/Core+Features/Core+Actions/Channel
/Prism+(Testing)/Core+Features/Core+Actions/Move
/Prism+(Testing)/Core+Features/Core+Actions/Parry
/Prism+(Testing)/Core+Features/Core+Actions/Prism+Core+Actions
/Prism+(Testing)/Core+Features/Core+Actions/Withstand
/Prism+(Testing)/Core+Features/Prism+Core+Skill
/Prism+(Testing)/Keywords/Afflictions/Affliction
/Prism+(Testing)/Keywords/Afflictions/Mundane/Alkalized
/Prism+(Testing)/Keywords/Afflictions/Mundane/Bleed
/Prism+(Testing)/Keywords/Afflictions/Mundane/Blind
/Prism+(Testing)/Keywords/Afflictions/Mundane/Deaf
/Prism+(Testing)/Keywords/Afflictions/Mundane/Diseased
/Prism+(Testing)/Keywords/Afflictions/Mundane/Distracted
/Prism+(Testing)/Keywords/Afflictions/Mundane/Exhaustion
/Prism+(Testing)/Keywords/Afflictions/Mundane/Frightened
/Prism+(Testing)/Keywords/Afflictions/Mundane/Marked
/Prism+(Testing)/Keywords/Afflictions/Mundane/Mute
/Prism+(Testing)/Keywords/Afflictions/Mundane/Paralyzed
/Prism+(Testing)/Keywords/Afflictions/Mundane/Petrified
/Prism+(Testing)/Keywords/Afflictions/Mundane/Poison
/Prism+(Testing)/Keywords/Afflictions/Mundane/Prone
/Prism+(Testing)/Keywords/Afflictions/Mundane/Rage
/Prism+(Testing)/Keywords/Afflictions/Mundane/Sealed
/Prism+(Testing)/Keywords/Afflictions/Mundane/Staggered
/Prism+(Testing)/Keywords/Afflictions/Mundane/Stunned
/Prism+(Testing)/Keywords/Afflictions/Mundane/Taunt
/Prism+(Testing)/Keywords/Afflictions/Mundane/Unconscious
/Prism+(Testing)/Keywords/Afflictions/Mundane/Wounded
/Prism+(Testing)/Keywords/Augments/Armor+Augment
/Prism+(Testing)/Keywords/Augments/Shield+Augment
/Prism+(Testing)/Keywords/Augments/Spell+Augment
/Prism+(Testing)/Keywords/Auxiliary+Effects/Affect
/Prism+(Testing)/Keywords/Auxiliary+Effects/Afflict
/Prism+(Testing)/Keywords/Auxiliary+Effects/Compounding
/Prism+(Testing)/Keywords/Auxiliary+Effects/Consumed
/Prism+(Testing)/Keywords/Auxiliary+Effects/Courage
/Prism+(Testing)/Keywords/Auxiliary+Effects/Cowardice
/Prism+(Testing)/Keywords/Auxiliary+Effects/Dash
/Prism+(Testing)/Keywords/Auxiliary+Effects/Depower
/Prism+(Testing)/Keywords/Auxiliary+Effects/Drain
/Prism+(Testing)/Keywords/Auxiliary+Effects/Economy
/Prism+(Testing)/Keywords/Auxiliary+Effects/Empower
/Prism+(Testing)/Keywords/Auxiliary+Effects/Exposed
/Prism+(Testing)/Keywords/Auxiliary+Effects/Fading
/Prism+(Testing)/Keywords/Auxiliary+Effects/Imbue
/Prism+(Testing)/Keywords/Auxiliary+Effects/Immunity
/Prism+(Testing)/Keywords/Auxiliary+Effects/Immutable
/Prism+(Testing)/Keywords/Auxiliary+Effects/Resistance
/Prism+(Testing)/Keywords/Auxiliary+Effects/Slow
/Prism+(Testing)/Keywords/Auxiliary+Effects/Stackable
/Prism+(Testing)/Keywords/Auxiliary+Effects/Vulnerable
/Prism+(Testing)/Keywords/Imbuements/Magic/Mana+Drain
/Prism+(Testing)/Keywords/Keywords
/Prism+(Testing)/Keywords/Movement+Rating
/Prism+(Testing)/Keywords/Movement+Rating+Reduction
/Prism+(Testing)/Keywords/Shield+Rating
/Prism+(Testing)/Keywords/Targeted+Entity/Action+Point+Cost
/Prism+(Testing)/Keywords/Targeted+Entity/Bestow
/Prism+(Testing)/Keywords/Targeted+Entity/Life
/Prism+(Testing)/Keywords/Targeted+Entity/Mana
/Prism+(Testing)/Keywords/Targeted+Entity/Mana+Point+Cost
/Prism+(Testing)/Keywords/Targeted+Entity/Spirit
/Prism+(Testing)/Keywords/Targeted+Entity/Strategy
/Prism+(Testing)/Keywords/Targeted+Entity/Tactics
/Prism+(Testing)/Keywords/Typing+Effects/Attack+of+Opportunity
/Prism+(Testing)/Keywords/Typing+Effects/Magic
/Prism+(Testing)/Keywords/Typing+Effects/Mundane
/Prism+(Testing)/Keywords/Typing+Effects/Reaction
/Prism+(Testing)/Keywords/Typing+Effects/Stance
/Prism+(Testing)/Parties/Aelenclast+Prologue+Parties/Aelenclast+Prologue+Parties
/Prism+(Testing)/Parties/Aelenclast+Prologue+Parties/Prologue+Parties/Blood+And+Blossoms/Blood+And+Blossoms
/Prism+(Testing)/Parties/Aelenclast+Prologue+Parties/Prologue+Parties/Blood+And+Blossoms/Florida+Steve
/Prism+(Testing)/Parties/Aelenclast+Prologue+Parties/Prologue+Parties/Blood+And+Blossoms/Jiyu+Fuujin
/Prism+(Testing)/Parties/Aelenclast+Prologue+Parties/Prologue+Parties/Blood+And+Blossoms/Kenji+Akatsuki+no+Ken
/Prism+(Testing)/Parties/Aelenclast+Prologue+Parties/Prologue+Parties/Blood+And+Blossoms/Rikkar+Sharpshanks
/Prism+(Testing)/Parties/Aelenclast+Prologue+Parties/Prologue+Parties/Blood+And+Blossoms/Rina+Kuroshio
/Prism+(Testing)/Parties/Aelenclast+Prologue+Parties/Prologue+Parties/Claws+And+Chaos/Ace
/Prism+(Testing)/Parties/Aelenclast+Prologue+Parties/Prologue+Parties/Claws+And+Chaos/Claws+and+Chaos
/Prism+(Testing)/Parties/Aelenclast+Prologue+Parties/Prologue+Parties/Claws+And+Chaos/John+D.+Walker
/Prism+(Testing)/Parties/Aelenclast+Prologue+Parties/Prologue+Parties/Claws+And+Chaos/Marvin+the+Magnificent
/Prism+(Testing)/Parties/Aelenclast+Prologue+Parties/Prologue+Parties/Claws+And+Chaos/Yankash
/Prism+(Testing)/Parties/Aelenclast+Prologue+Parties/Prologue+Parties/Perdition+And+Permission/Perdition+and+Permission
/Prism+(Testing)/Parties/Aelenclast+Prologue+Parties/Prologue+Parties/Perdition+And+Permission/Petra
/Prism+(Testing)/Parties/Aelenclast+Prologue+Parties/Prologue+Parties/Perdition+And+Permission/Rovain+Tka
/Prism+(Testing)/Parties/Aelenclast+Prologue+Parties/Prologue+Parties/Perdition+And+Permission/Sharp
/Prism+(Testing)/Parties/Aelenclast+Prologue+Parties/Prologue+Parties/Serpents+And+Sincerity/Alex+Flowky
/Prism+(Testing)/Parties/Aelenclast+Prologue+Parties/Prologue+Parties/Serpents+And+Sincerity/D%C3%B3lgr
/Prism+(Testing)/Parties/Aelenclast+Prologue+Parties/Prologue+Parties/Serpents+And+Sincerity/Ronder+Vandrish
/Prism+(Testing)/Parties/Aelenclast+Prologue+Parties/Prologue+Parties/Serpents+And+Sincerity/Serpents+and+Sincerity
/Prism+(Testing)/Parties/Aelenclast+Prologue+Parties/Prologue+Parties/Sound+And+Silence/Fantastico
/Prism+(Testing)/Parties/Aelenclast+Prologue+Parties/Prologue+Parties/Sound+And+Silence/Renard+Kawasu
/Prism+(Testing)/Parties/Aelenclast+Prologue+Parties/Prologue+Parties/Sound+And+Silence/Seraph+Wistleblow
/Prism+(Testing)/Parties/Aelenclast+Prologue+Parties/Prologue+Parties/Sound+And+Silence/Sound+And+Silence
/Prism+(Testing)/Parties/Aelenclast+Prologue+Parties/Prologue+Parties/Sound+And+Silence/Sunny
/Prism+(Testing)/Prism
/Prism+(Testing)/Prism+Character+Creation
/Prism+(Testing)/Prism+Character+Creation+Contest
/Prism+(Testing)/Races/Abyssborn
/Prism+(Testing)/Races/Dragonborn
/Prism+(Testing)/Races/Dwarf
/Prism+(Testing)/Races/Elf
/Prism+(Testing)/Races/Gnome
/Prism+(Testing)/Races/Halfling
/Prism+(Testing)/Races/Human
/Prism+(Testing)/Races/Planetouched
/Prism+(Testing)/Races/Prism+Races
/Prism+(Testing)/Races/Racial+Features/Abyssborn/Blessing+of+the+Deep
/Prism+(Testing)/Races/Racial+Features/Abyssborn/Inking+Wounds
/Prism+(Testing)/Races/Racial+Features/Dragonborn/Dragonskin
/Prism+(Testing)/Races/Racial+Features/Dragonborn/Flamebreath
/Prism+(Testing)/Races/Racial+Features/Dwarf/Dark+Sun's+Blessing
/Prism+(Testing)/Races/Racial+Features/Dwarf/Heart+of+Stone
/Prism+(Testing)/Races/Racial+Features/Dwarf/Pragmatic+Clans
/Prism+(Testing)/Races/Racial+Features/Dwarf/Surefooted
/Prism+(Testing)/Races/Racial+Features/Elf/Eldar+Grace
/Prism+(Testing)/Races/Racial+Features/Elf/Eldar+Superiority
/Prism+(Testing)/Races/Racial+Features/Elf/Empire+Reborn
/Prism+(Testing)/Races/Racial+Features/Gnome/Been+There%2C+Done+That
/Prism+(Testing)/Races/Racial+Features/Gnome/Daydream
/Prism+(Testing)/Races/Racial+Features/Gnome/Dreamwalker
/Prism+(Testing)/Races/Racial+Features/Halfling/Restorative+Melody
/Prism+(Testing)/Races/Racial+Features/Halfling/Rugged+Humors
/Prism+(Testing)/Races/Racial+Features/Halfling/Second+Breakfast
/Prism+(Testing)/Races/Racial+Features/Halfling/Wispblood
/Prism+(Testing)/Races/Racial+Features/Human/Arcane+Aptitude
/Prism+(Testing)/Races/Racial+Features/Human/Calloused+Hands
/Prism+(Testing)/Races/Racial+Features/Human/Fearless
/Prism+(Testing)/Races/Racial+Features/Human/Horsemaster
/Prism+(Testing)/Races/Racial+Features/Human/Indomitable+Spirit
/Prism+(Testing)/Races/Racial+Features/Human/Jungle+and+Sky
/Prism+(Testing)/Races/Racial+Features/Human/Riverkissed
/Prism+(Testing)/Races/Racial+Features/Planetouched/Anchored+Spirit
/Prism+(Testing)/Races/Racial+Features/Planetouched/Spirit+Form
/Prism+(Testing)/Spells/Color+(Hue)
/Prism+(Testing)/Spells/Prism+Spellcasting
/Prism+(Testing)/Spells/Prism+Spells
File diff suppressed because it is too large Load Diff
+108 -11
View File
@@ -1,22 +1,119 @@
<section> <section>
<div class="header"> <div class="header">
<img class="item-img" src="{{item.img}}" data-edit="img" data-action="editImage" data-tooltip="{{item.name}}" /> <img
class="item-img"
src="{{item.img}}"
data-edit="img"
data-action="editImage"
data-tooltip="{{item.name}}"
/>
{{formInput fields.name value=source.name}} {{formInput fields.name value=source.name}}
</div> </div>
{{formField systemFields.armorType value=system.armorType localize=true}} {{! Armor Type (Light/Medium/Heavy) }}
{{formField systemFields.defense value=system.defense}} {{formField
{{formField systemFields.maximumMovement value=system.maximumMovement}} systemFields.armorType
{{formField systemFields.hp value=system.hp}} value=system.armorType
{{formField systemFields.damageReduction value=system.damageReduction}} localize=true
{{formField systemFields.encLoad value=system.encLoad}} label="PRISMRPG.Label.armorType"
}}
{{formField systemFields.isHelmet value=system.isHelmet}} {{! Armor Class (AC) }}
{{formField systemFields.equipped value=system.equipped}} {{formField
systemFields.defense
value=system.defense
label="PRISMRPG.Label.armorClass"
}}
{{formField systemFields.cost value=system.cost}} {{! Maximum Reduction Rating (MRR) }}
{{formField systemFields.money value=system.money localize=true}} {{formField systemFields.mrr value=system.mrr label="PRISMRPG.Label.mrr"}}
{{! Movement Penalty }}
{{formField
systemFields.maximumMovement
value=system.maximumMovement
label="PRISMRPG.Label.movementPenalty"
}}
{{! Armor Hit Points }}
{{formField systemFields.hp value=system.hp label="PRISMRPG.Label.armorHP"}}
{{! Damage Reduction }}
{{formField
systemFields.damageReduction
value=system.damageReduction
label="PRISMRPG.Label.damageReduction"
}}
{{! Encumbrance Load }}
{{formField
systemFields.encLoad
value=system.encLoad
label="PRISMRPG.Label.encumbranceLoad"
}}
{{! Equipment Status }}
{{formField
systemFields.isHelmet
value=system.isHelmet
label="PRISMRPG.Label.isHelmet"
}}
{{formField
systemFields.equipped
value=system.equipped
label="PRISMRPG.Label.equipped"
}}
{{! Prism RPG: Armor Passive }}
<fieldset class="armor-passive">
<legend>{{localize "PRISMRPG.Label.armorPassive"}}</legend>
{{formField
systemFields.passive
value=system.passive
label="PRISMRPG.Label.passiveName"
}}
<div class="form-group">
<label>{{localize "PRISMRPG.Label.passiveDescription"}}</label>
{{formInput
systemFields.passiveDescription
enriched=enrichedPassiveDescription
value=system.passiveDescription
name="system.passiveDescription"
toggled=true
}}
</div>
</fieldset>
{{! Prism RPG: Armor Augment }}
<fieldset class="armor-augment">
<legend>{{localize "PRISMRPG.Label.armorAugment"}}</legend>
{{formField
systemFields.augment
value=system.augment
label="PRISMRPG.Label.augmentName"
}}
<div class="form-group">
<label>{{localize "PRISMRPG.Label.augmentDescription"}}</label>
{{formInput
systemFields.augmentDescription
enriched=enrichedAugmentDescription
value=system.augmentDescription
name="system.augmentDescription"
toggled=true
}}
</div>
</fieldset>
{{! Cost }}
{{formField systemFields.cost value=system.cost label="PRISMRPG.Label.cost"}}
{{formField
systemFields.money
value=system.money
localize=true
label="PRISMRPG.Label.currency"
}}
{{! Description }}
<fieldset> <fieldset>
<legend>{{localize "PRISMRPG.Label.description"}}</legend> <legend>{{localize "PRISMRPG.Label.description"}}</legend>
{{formInput {{formInput
+18 -14
View File
@@ -436,21 +436,25 @@
type="number" type="number"
}} }}
</div> </div>
<div class="character-characteristic"> </fieldset>
<span>{{localize "PRISMRPG.Label.luc"}}</span>
{{formField
systemFields.characteristics.fields.luc.fields.value
value=system.characteristics.luc.value
disabled=isPlayMode
data-char-id="luc"
}}
{{formField {{!-- Sub-Attributes (Prism RPG) --}}
systemFields.characteristics.fields.luc.fields.percent <fieldset
value=system.characteristics.luc.percent class="character-subattributes character-subattributes-{{ifThen
disabled=isPlayMode isPlayMode
type="number" 'play'
}} 'edit'
}}"
>
<legend>{{localize "PRISMRPG.Label.subAttributes"}}</legend>
<div class="subattributes-grid">
{{#each config.SUB_ATTRIBUTES as |subAttr|}}
<div class="character-subattribute" data-tooltip="{{localize subAttr.description}}">
<span class="subattr-label">{{localize subAttr.label}}</span>
<span class="subattr-value">{{lookup (lookup ../system.subAttributes subAttr.id) 'value'}}</span>
<span class="subattr-parents">({{#each subAttr.parents}}{{localize (concat "PRISMRPG.Label." this)}}{{#unless @last}}/{{/unless}}{{/each}})</span>
</div>
{{/each}}
</div> </div>
</fieldset> </fieldset>

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