316 lines
9.0 KiB
JavaScript
316 lines
9.0 KiB
JavaScript
/**
|
|
* Default weapon types based on Prism RPG rules
|
|
* APC determines weapon class: Light (1 APC), One-Handed (2 APC), Heavy (3 APC)
|
|
*/
|
|
const DEFAULT_TYPES = {
|
|
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
|
|
}
|
|
};
|
|
|
|
/**
|
|
* Get weapon types (default + custom from settings)
|
|
*/
|
|
export function getWeaponTypes() {
|
|
if (!game?.settings) return DEFAULT_TYPES;
|
|
|
|
const customTypes = game.settings.get("fvtt-prism-rpg", "customWeaponTypes") || {};
|
|
return foundry.utils.mergeObject(DEFAULT_TYPES, customTypes, { inplace: false });
|
|
}
|
|
|
|
/**
|
|
* Weapon types (dynamically loaded)
|
|
*/
|
|
export const TYPE = new Proxy({}, {
|
|
get(target, prop) {
|
|
const types = getWeaponTypes();
|
|
return types[prop];
|
|
},
|
|
ownKeys(target) {
|
|
return Object.keys(getWeaponTypes());
|
|
},
|
|
getOwnPropertyDescriptor(target, prop) {
|
|
return {
|
|
enumerable: true,
|
|
configurable: true
|
|
};
|
|
}
|
|
});
|
|
|
|
/**
|
|
* Simplified Weapon Types object for form choices (label-only format)
|
|
*/
|
|
export function getWeaponTypeChoices() {
|
|
const types = getWeaponTypes();
|
|
return Object.fromEntries(
|
|
Object.entries(types).map(([key, value]) => [key, value.label])
|
|
);
|
|
}
|
|
|
|
export const TYPE_CHOICES = new Proxy({}, {
|
|
get(target, prop) {
|
|
const choices = getWeaponTypeChoices();
|
|
return choices[prop];
|
|
},
|
|
ownKeys(target) {
|
|
return Object.keys(getWeaponTypeChoices());
|
|
},
|
|
getOwnPropertyDescriptor(target, prop) {
|
|
return {
|
|
enumerable: true,
|
|
configurable: true
|
|
};
|
|
}
|
|
});
|
|
|
|
/**
|
|
* Default weapon groups and their associated passives
|
|
* Each weapon belongs to a group and possesses its passive while wielded
|
|
*/
|
|
const DEFAULT_WEAPON_GROUPS = {
|
|
shortsword: {
|
|
id: "shortsword",
|
|
label: "PRISMRPG.WeaponGroup.shortsword",
|
|
passive: "quickBlade",
|
|
passiveLabel: "PRISMRPG.Weapon.Passive.quickBlade",
|
|
passiveDescription: "PRISMRPG.Weapon.PassiveDescription.quickBlade"
|
|
},
|
|
longsword: {
|
|
id: "longsword",
|
|
label: "PRISMRPG.WeaponGroup.longsword",
|
|
passive: "turningEdge",
|
|
passiveLabel: "PRISMRPG.Weapon.Passive.turningEdge",
|
|
passiveDescription: "PRISMRPG.Weapon.PassiveDescription.turningEdge"
|
|
},
|
|
greatsword: {
|
|
id: "greatsword",
|
|
label: "PRISMRPG.WeaponGroup.greatsword",
|
|
passive: "cleave",
|
|
passiveLabel: "PRISMRPG.Weapon.Passive.cleave",
|
|
passiveDescription: "PRISMRPG.Weapon.PassiveDescription.cleave"
|
|
},
|
|
handaxe: {
|
|
id: "handaxe",
|
|
label: "PRISMRPG.WeaponGroup.handaxe",
|
|
passive: "throwingAxe",
|
|
passiveLabel: "PRISMRPG.Weapon.Passive.throwingAxe",
|
|
passiveDescription: "PRISMRPG.Weapon.PassiveDescription.throwingAxe"
|
|
},
|
|
battleaxe: {
|
|
id: "battleaxe",
|
|
label: "PRISMRPG.WeaponGroup.battleaxe",
|
|
passive: "shieldEater",
|
|
passiveLabel: "PRISMRPG.Weapon.Passive.shieldEater",
|
|
passiveDescription: "PRISMRPG.Weapon.PassiveDescription.shieldEater"
|
|
},
|
|
greataxe: {
|
|
id: "greataxe",
|
|
label: "PRISMRPG.WeaponGroup.greataxe",
|
|
passive: "devastatingBlow",
|
|
passiveLabel: "PRISMRPG.Weapon.Passive.devastatingBlow",
|
|
passiveDescription: "PRISMRPG.Weapon.PassiveDescription.devastatingBlow"
|
|
},
|
|
club: {
|
|
id: "club",
|
|
label: "PRISMRPG.WeaponGroup.club",
|
|
passive: "stun",
|
|
passiveLabel: "PRISMRPG.Weapon.Passive.stun",
|
|
passiveDescription: "PRISMRPG.Weapon.PassiveDescription.stun"
|
|
},
|
|
mace: {
|
|
id: "mace",
|
|
label: "PRISMRPG.WeaponGroup.mace",
|
|
passive: "armorBreaker",
|
|
passiveLabel: "PRISMRPG.Weapon.Passive.armorBreaker",
|
|
passiveDescription: "PRISMRPG.Weapon.PassiveDescription.armorBreaker"
|
|
},
|
|
greatMaul: {
|
|
id: "greatMaul",
|
|
label: "PRISMRPG.WeaponGroup.greatMaul",
|
|
passive: "earthshatter",
|
|
passiveLabel: "PRISMRPG.Weapon.Passive.earthshatter",
|
|
passiveDescription: "PRISMRPG.Weapon.PassiveDescription.earthshatter"
|
|
},
|
|
javelin: {
|
|
id: "javelin",
|
|
label: "PRISMRPG.WeaponGroup.javelin",
|
|
passive: "piercingThrow",
|
|
passiveLabel: "PRISMRPG.Weapon.Passive.piercingThrow",
|
|
passiveDescription: "PRISMRPG.Weapon.PassiveDescription.piercingThrow"
|
|
},
|
|
spear: {
|
|
id: "spear",
|
|
label: "PRISMRPG.WeaponGroup.spear",
|
|
passive: "reach",
|
|
passiveLabel: "PRISMRPG.Weapon.Passive.reach",
|
|
passiveDescription: "PRISMRPG.Weapon.PassiveDescription.reach"
|
|
},
|
|
longSpear: {
|
|
id: "longSpear",
|
|
label: "PRISMRPG.WeaponGroup.longSpear",
|
|
passive: "extendedReach",
|
|
passiveLabel: "PRISMRPG.Weapon.Passive.extendedReach",
|
|
passiveDescription: "PRISMRPG.Weapon.PassiveDescription.extendedReach"
|
|
},
|
|
warhammer: {
|
|
id: "warhammer",
|
|
label: "PRISMRPG.WeaponGroup.warhammer",
|
|
passive: "puncturingBlows",
|
|
passiveLabel: "PRISMRPG.Weapon.Passive.puncturingBlows",
|
|
passiveDescription: "PRISMRPG.Weapon.PassiveDescription.puncturingBlows"
|
|
},
|
|
dagger: {
|
|
id: "dagger",
|
|
label: "PRISMRPG.WeaponGroup.dagger",
|
|
passive: "balancingStance",
|
|
passiveLabel: "PRISMRPG.Weapon.Passive.balancingStance",
|
|
passiveDescription: "PRISMRPG.Weapon.PassiveDescription.balancingStance"
|
|
},
|
|
crossbow: {
|
|
id: "crossbow",
|
|
label: "PRISMRPG.WeaponGroup.crossbow",
|
|
passive: "boltlock",
|
|
passiveLabel: "PRISMRPG.Weapon.Passive.boltlock",
|
|
passiveDescription: "PRISMRPG.Weapon.PassiveDescription.boltlock"
|
|
},
|
|
longbow: {
|
|
id: "longbow",
|
|
label: "PRISMRPG.WeaponGroup.longbow",
|
|
passive: "volleyFire",
|
|
passiveLabel: "PRISMRPG.Weapon.Passive.volleyFire",
|
|
passiveDescription: "PRISMRPG.Weapon.PassiveDescription.volleyFire"
|
|
}
|
|
};
|
|
|
|
/**
|
|
* Get weapon groups (default + custom from settings)
|
|
*/
|
|
export function getWeaponGroups() {
|
|
if (!game?.settings) return DEFAULT_WEAPON_GROUPS;
|
|
|
|
const customGroups = game.settings.get("fvtt-prism-rpg", "customWeaponGroups") || {};
|
|
return foundry.utils.mergeObject(DEFAULT_WEAPON_GROUPS, customGroups, { inplace: false });
|
|
}
|
|
|
|
/**
|
|
* Weapon groups (dynamically loaded)
|
|
*/
|
|
export const WEAPON_GROUP = new Proxy({}, {
|
|
get(target, prop) {
|
|
const groups = getWeaponGroups();
|
|
return groups[prop];
|
|
},
|
|
ownKeys(target) {
|
|
return Object.keys(getWeaponGroups());
|
|
},
|
|
getOwnPropertyDescriptor(target, prop) {
|
|
return {
|
|
enumerable: true,
|
|
configurable: true
|
|
};
|
|
}
|
|
});
|
|
|
|
/**
|
|
* Simplified Weapon Groups object for form choices (label-only format)
|
|
*/
|
|
export function getWeaponGroupChoices() {
|
|
const groups = getWeaponGroups();
|
|
return Object.fromEntries(
|
|
Object.entries(groups).map(([key, value]) => [key, value.label])
|
|
);
|
|
}
|
|
|
|
export const WEAPON_GROUP_CHOICES = new Proxy({}, {
|
|
get(target, prop) {
|
|
const choices = getWeaponGroupChoices();
|
|
return choices[prop];
|
|
},
|
|
ownKeys(target) {
|
|
return Object.keys(getWeaponGroupChoices());
|
|
},
|
|
getOwnPropertyDescriptor(target, prop) {
|
|
return {
|
|
enumerable: true,
|
|
configurable: true
|
|
};
|
|
}
|
|
});
|
|
|
|
/**
|
|
* 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 = {
|
|
"melee": "PRISMRPG.Weapon.WeaponType.melee",
|
|
"ranged": "PRISMRPG.Weapon.WeaponType.ranged"
|
|
}
|
|
|
|
export const WEAPON_CLASS = {
|
|
"longblade": "PRISMRPG.Weapon.WeaponClass.longblade",
|
|
"shortblade": "PRISMRPG.Weapon.WeaponClass.shortblade",
|
|
"mediumblade": "PRISMRPG.Weapon.WeaponClass.mediumblade",
|
|
"axe": "PRISMRPG.Weapon.WeaponClass.axe",
|
|
"hammer": "PRISMRPG.Weapon.WeaponClass.hammer",
|
|
"mace": "PRISMRPG.Weapon.WeaponClass.mace",
|
|
"flail": "PRISMRPG.Weapon.WeaponClass.flail",
|
|
"bow": "PRISMRPG.Weapon.WeaponClass.bow",
|
|
"sling": "PRISMRPG.Weapon.WeaponClass.sling",
|
|
"thrown": "PRISMRPG.Weapon.WeaponClass.thrown",
|
|
"polearm": "PRISMRPG.Weapon.WeaponClass.polearm",
|
|
"unarmed": "PRISMRPG.Weapon.WeaponClass.unarmed"
|
|
}
|
|
|
|
export const WEAPON_CATEGORIES = {
|
|
"longblade": ["mediumblade", "shortblade"],
|
|
"shortblade": ["mediumblade", "longblade"],
|
|
"mediumblade": ["shortblade", "longblade"],
|
|
"axe": ["hammer", "mace", "flail", "bow", "sling", "thrown", "polearm"],
|
|
"hammer": ["axe", "mace", "flail", "bow", "sling", "thrown", "polearm"],
|
|
"mace": ["axe", "hammer", "flail", "bow", "sling", "thrown", "polearm"],
|
|
"flail": ["axe", "hammer", "mace", "bow", "sling", "thrown", "polearm"],
|
|
"bow": ["axe", "hammer", "mace", "flail", "sling", "thrown", "polearm"],
|
|
"sling": ["axe", "hammer", "mace", "flail", "bow", "thrown", "polearm"],
|
|
"thrown": ["axe", "hammer", "mace", "flail", "bow", "sling", "polearm"],
|
|
"polearm": ["axe", "hammer", "mace", "flail", "bow", "sling", "thrown"]
|
|
}
|